[
  {
    "path": ".gitignore",
    "content": "# Object files\n*.o\n*.ko\n*.obj\n*.elf\n\n# Libraries\n*.lib\n*.a\n\n# Shared objects (inc. Windows DLLs)\n*.dll\n*.so\n*.so.*\n*.dylib\n\n# Executables\n*.exe\n*.out\n*.app\n*.i*86\n*.x86_64\n*.hex\n.directory\n*.bak\n"
  },
  {
    "path": "LICENSE",
    "content": "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.\n\nThis 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.\n\nYou 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.\n\nMediaTek Inc.\nAddress : 5F., No.5, Tai-Yuan 1st St., Jhubei City,\nHsinchu County 302,Taiwan, R.O.C.\n(c) Copyright 2002-2013, MediaTek Inc.\n"
  },
  {
    "path": "Makefile",
    "content": "all:\n\tmake -C src/ osutil\n\tmake -C src/ build_tools\n\tmake -C src/ osdrv\n\tmake -C src/ osnet\n\nclean:\n\tmake -C src/ clean\n\ninstall:\n\tmake -C src/ install\n\nuninstall:\n\tmake -C src/ uninstall\n"
  },
  {
    "path": "Makefile.clean",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\nPHONY := clean install uninstall\n\nclean:\n\trm -f ../../common/*.o\n\trm -f ../../common/.*.cmd .*.flags .*.d\n\trm -f ../../os/linux/*.o *.ko *.mod.o *.mod.c\n\trm -f ../../os/linux/.*.cmd .*.flags .*.d\n\trm -fr ../../os/linux/.tmp_versions\n#Must clean Module.symvers; or you will suffer symbol version not match\n#when OS_ABL = YES.\n\trm -f ../../os/linux/Module.symvers\n\trm -f ../../os/linux/Modules.symvers\n\trm -f ../../os/linux/Module.markers\n\trm -f ../../os/linux/modules.order\n\trm -f ../../chips/*.o\n\trm -f ../../chips/.*.cmd .*.flags .*.d\n\trm -f ../../rate_ctrl/*.o\n\trm -f ../../rate_ctrl/.*.cmd .*.flags .*.d\n\trm -f ../../ate/common/*.o\n\trm -f ../../ate/common/.*.cmd .*.flags .*.d\n\trm -f ../../ate/chips/*.o\n\trm -f ../../ate/chips/.*.cmd .*.flags .*.d\n\trm -f ../../phy/*.o\n\trm -f ../../phy/.*.cmd .*.flags .*.d\n\trm -f ../../mac/*.o\n\trm -f ../../mac/.*.cmd .*.flags .*.d\n\trm -f ../../mcu/*.o\n\trm -f ../../mcu/.*.cmd .*.flags .*.d\n\trm -f ../../mgmt/*.o\n\trm -f ../../mgmt/.*.cmd .*.flags .*.d\n\trm -f ../../naf/*.o\n\trm -f ../../naf/.*.cmd .*.flags .*.d\nifeq ($(RT28xx_MODE),AP)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.cmd .*.flags .*.d\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f ../../sta/*.o\n\trm -f ../../sta/.*.cmd .*.flags .*.d\nifeq ($(HAS_P2P_SUPPORT),y)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.cmd .*.flags .*.d\nendif\nelse\nifeq ($(RT28xx_MODE),APSTA)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.cmd .*.flags .*.d\n\trm -f ../../sta/*.o\n\trm -f ../../sta/.*.cmd .*.flags .*.d\nendif\nendif\nendif\n\n# Declare the contents of the .PHONY variable as phony.  We keep that\n# information in a variable so we can use it in if_changed and friends.\n.PHONY: $(PHONY)\n"
  },
  {
    "path": "Makefile.inc",
    "content": "WIFI_MODE = AP\n\nifeq ($(WIFI_MODE),)\nRT28xx_MODE = STA\nelse\nRT28xx_MODE = $(WIFI_MODE)\nendif\n\nifeq ($(TARGET),)\nTARGET = LINUX\nendif\n\nifeq ($(CHIPSET),)\nCHIPSET = 7601U\nendif\n\nMODULE = $(word 1, $(CHIPSET))\n\n#OS ABL - YES or NO\nOSABL = YES\n\nifneq ($(TARGET),THREADX)\n#RT28xx_DIR = home directory of RT28xx source code\nRT28xx_DIR = $(shell pwd)\nendif\n\ninclude $(RT28xx_DIR)/os/linux/config.mk\n\nRTMP_SRC_DIR = $(RT28xx_DIR)/RT$(MODULE)\n\n#PLATFORM: Target platform\nPLATFORM = PC\n#PLATFORM = 5VT\n#PLATFORM = IKANOS_V160\n#PLATFORM = IKANOS_V180\n#PLATFORM = SIGMA\n#PLATFORM = SIGMA_8622\n#PLATFORM = INIC\n#PLATFORM = STAR\n#PLATFORM = IXP\n#PLATFORM = INF_TWINPASS\n#PLATFORM = INF_DANUBE\n#PLATFORM = INF_AR9\n#PLATFORM = INF_VR9\n#PLATFORM = BRCM_6358\n#PLATFORM = INF_AMAZON_SE\n#PLATFORM = CAVM_OCTEON\n#PLATFORM = CMPC\n#PLATFORM = RALINK_2880\n#PLATFORM = RALINK_3052\n#PLATFORM = SMDK\n#PLATFORM = RMI\n#PLATFORM = RMI_64\n#PLATFORM = KODAK_DC\n#PLATFORM = DM6446\n#PLATFORM = FREESCALE8377\n#PLATFORM = BL2348\n#PLATFORM = BL23570\n#PLATFORM = BLUBB\n#PLATFORM = BLPMP\n#PLATFORM = MT85XX\n#PLATFORM = NXP_TV550\n#PLATFORM = MVL5\n#PLATFORM = RALINK_3352\n#PLATFORM = UBICOM_IPX8\n#PLATFORM = INTELP6\n\n#APSOC\nifeq ($(MODULE),3050)\nPLATFORM = RALINK_3050\nendif\nifeq ($(MODULE),3052)\nPLATFORM = RALINK_3052\nendif\nifeq ($(MODULE),3350)\nPLATFORM = RALINK_3050\nendif\nifeq ($(MODULE),3352)\nPLATFORM = RALINK_3352\nendif\n\n\n#RELEASE Package\nRELEASE = DPA\n\n\nifeq ($(TARGET),LINUX)\nMAKE = make\nendif\n\nifeq ($(TARGET), UCOS)\nMAKE = make\nendif\nifeq ($(TARGET),THREADX)\nMAKE = gmake\nendif\n\nifeq ($(TARGET), ECOS)\nMAKE = make\nMODULE = $(shell pwd | sed \"s/.*\\///\" ).o\nexport MODULE\nendif\n\nifeq ($(PLATFORM),5VT)\nLINUX_SRC = /home/ralink-2860-sdk-5vt-distribution/linux-2.6.17\nCROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux-\nendif\n\nifeq ($(PLATFORM),UBICOM_IPX8)\nLINUX_SRC = /home/sample/Customers/UBICOM/ubicom-linux-dist-2.1.1/linux-2.6.x\nCROSS_COMPILE = ubicom32-elf-\nendif\n\nifeq ($(PLATFORM),IKANOS_V160)\nLINUX_SRC = /home/sample/projects/LX_2618_RG_5_3_00r4_SRC/linux-2.6.18\nCROSS_COMPILE = mips-linux-\nendif\n\nifeq ($(PLATFORM),IKANOS_V180)\nLINUX_SRC = /home/sample/projects/LX_BSP_VX180_5_4_0r1_ALPHA_26DEC07/linux-2.6.18\nCROSS_COMPILE = mips-linux-\nendif\n\nifeq ($(PLATFORM),SIGMA)\nLINUX_SRC = /root/sigma/smp86xx_kernel_source_2.7.172.0/linux-2.6.15\nCROSS_COMPILE = /root/sigma/smp86xx_toolchain_2.7.172.0/build_mipsel_nofpu/staging_dir/bin/mipsel-linux-\nendif\n\nifeq ($(PLATFORM),SIGMA_8622)\nLINUX_SRC = /home/snowpin/armutils_2.5.120.1/build_arm/linux-2.4.22-em86xx\nCROSS_COMPILE = /home/snowpin/armutils_2.5.120.1/toolchain/bin/arm-elf-\nCROSS_COMPILE_INCLUDE = /home/snowpin/armutils_2.5.120.1/toolchain/lib/gcc-lib/arm-elf/2.95.3\nendif\n\nifeq ($(PLATFORM),INIC)\nUCOS_SRC = /opt/uCOS/iNIC_rt2880\nCROSS_COMPILE = /usr/bin/mipsel-linux-\nendif\n\nifeq ($(PLATFORM),STAR)\nLINUX_SRC = /opt/star/kernel/linux-2.4.27-star\nCROSS_COMPILE = /opt/star/tools/arm-linux/bin/arm-linux-\nendif\n\nifeq ($(PLATFORM),RMI)\nLINUX_SRC = /opt/rmi/1.7.0/linux/src/\nCROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu-\nendif\n\nifeq ($(PLATFORM),RMI_64)\nLINUX_SRC = /opt/rmi/1.7.0/linux_64/src/\nCROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu-\nendif\n\nifeq ($(PLATFORM), RALINK_2880)\nLINUX_SRC = /project/stable/RT288x/RT288x_SDK/source/linux-2.4.x\nCROSS_COMPILE = /opt/buildroot-gdb/bin/mipsel-linux-\nendif\n\nifeq ($(PLATFORM),RALINK_3052)\nLINUX_SRC = /home/peter/ap_soc/SDK_3_3_0_0/RT288x_SDK/source/linux-2.6.21.x\nCROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-uclibc-\nendif\n\nifeq ($(PLATFORM),FREESCALE8377)\nLINUX_SRC = /opt/ltib-mpc8377_rds-20090309/rpm/BUILD/linux-2.6.25 \nCROSS_COMPILE = /opt/freescale/usr/local/gcc-4.2.187-eglibc-2.5.187/powerpc-linux-gnu/bin/powerpc-linux-gnu-\nendif\n\nifeq ($(PLATFORM),BL2348)\nLINUX_SRC = /home/sample/Customers/BroadLight/bl234x-linux-2.6.21-small-v29\nCROSS_COMPILE = mips-wrs-linux-gnu-\nendif\n\nifeq ($(PLATFORM),BL23570)\nLINUX_SRC = /home/FIBERHOME/linux-2.6.34.8\nCROSS_COMPILE = mips-wrs-linux-gnu-mips_74k_softfp-glibc_small-\nARCH:=mips\nexport $ARCH\nendif\n\n\nifeq ($(PLATFORM),BLUBB)\nLINUX_SRC = /home/sample/Customers/BroadLight/UBB/gmp20/linux-2.6.21-small\nCROSS_COMPILE = mips-wrs-linux-gnu-\nendif\n\nifeq ($(PLATFORM),BLPMP)\nLINUX_SRC = /home/sample/Customers/BroadLight/UBB/pmp16/bl234x-linux-2.6.21-small-v30.2\nCROSS_COMPILE = mips-wrs-linux-gnu-\nendif\n\nifeq ($(PLATFORM),PC)\n# Linux 2.6\nLINUX_SRC = /lib/modules/$(shell uname -r)/build\n# Linux 2.4 Change to your local setting\n#LINUX_SRC = /usr/src/linux-2.4\nLINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/\nCROSS_COMPILE = \nendif\n\nifeq ($(PLATFORM),INTELP6)\nLINUX_SRC = /tftpboot/IntelCE-20.0.11052.243193/project_build_i686/IntelCE/kernel-20.0.11024.238456/linux-2.6.35\nCROSS_COMPILE = /tftpboot/IntelCE-20.0.11052.243193/build_i686/i686-linux-elf/bin/i686-cm-linux-\nendif\n\nifeq ($(PLATFORM),IXP)\nLINUX_SRC = /project/stable/Gmtek/snapgear-uclibc/linux-2.6.x\nCROSS_COMPILE = arm-linux-\nendif\n\nifeq ($(PLATFORM),INF_TWINPASS)\n# Linux 2.6\n#LINUX_SRC = /lib/modules/$(shell uname -r)/build\n# Linux 2.4 Change to your local setting\nLINUX_SRC = /project/stable/twinpass/release/2.0.1/source/kernel/opensource/linux-2.4.31/\nCROSS_COMPILE = mips-linux-\nendif\n\nifeq ($(PLATFORM),INF_DANUBE)\nLINUX_SRC = /opt/danube/sdk/linux-2.6.16.x\nCROSS_COMPILE = mips-linux-\nROOTDIR = /opt/danube/sdk\nexport ROOTDIR\nendif\n\nifeq ($(PLATFORM),INF_AR9)\nLINUX_SRC = /root/ar9/xR9_BSP1.2.2.0/source/kernel/opensource/linux-2.6.20/\nCROSS_COMPILE = /root/ar9/ifx-lxdb26-1.0.2/gcc-3.4.4/toolchain-mips/bin/\nendif\n\nifeq ($(PLATFORM),INF_VR9)\nLINUX_SRC = /home/public/lantiq/VR9/UGW-4.2/build_dir/linux-ifxcpe_platform_vr9/linux-2.6.20.19\nCROSS_COMPILE = /home/public/lantiq/VR9/UGW-4.2/staging_dir/toolchain-mips_gcc-3.4.6_uClibc-0.9.29/bin/mips-linux-\nendif\n\nifeq ($(PLATFORM),BRCM_6358)\nLINUX_SRC = \nCROSS_COMPILE = \nendif\n\nifeq ($(PLATFORM),INF_AMAZON_SE)\n# Linux 2.6\n#LINUX_SRC = /lib/modules/$(shell uname -r)/build\n# Linux 2.4 Change to your local setting\nLINUX_SRC = /backup/ifx/3.6.2.2/source/kernel/opensource/linux-2.4.31\n#CROSS_COMPILE = mips-linux-\n#LINUX_SRC = /project/Infineon/3.6.2.2/source/kernel/opensource/linux-2.4.31\nCROSS_COMPILE = /opt/uclibc-toolchain/ifx-lxdb-1-2-3-external/gcc-3.3.6/toolchain-mips/R0208V35/mips-linux-uclibc/bin/\nendif\n\nifeq ($(PLATFORM),ST)\nLINUX_SRC = /opt/STM/STLinux-2.2/devkit/sources/kernel/linux0039\nCROSS_COMPILE = /opt/STM/STLinux-2.2/devkit/sh4/bin/sh4-linux-\nARCH := sh\nexport ARCH\nendif\n\nifeq ($(PLATFORM),CAVM_OCTEON)\nOCTEON_ROOT = /usr/local/Cavium_Networks/OCTEON-SDK\nLINUX_SRC = $(OCTEON_ROOT)/linux/kernel_2.6/linux\nCROSS_COMPILE = mips64-octeon-linux-gnu-\nendif\n\nifeq ($(PLATFORM),CMPC)\nLINUX_SRC = /opt/fvt_11N_SDK_0807/fvt131x_SDK_11n/linux-2.6.17\nCROSS_COMPILE =\nendif\n\nifeq ($(PLATFORM),SMDK)\nLINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung\nCROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-\nendif\n\nifeq ($(PLATFORM),RALINK_3352)\nLINUX_SRC = /home/sample/3352/RT288x_SDK/source/linux-2.6.21.x\nCROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-\nendif\n\nifeq ($(PLATFORM),KODAK_DC)\nSKD_SRC = C:/SigmaTel/DC1250_SDK_v1-9/sdk\nCROSS_COMPILE = $(cc)\nendif\n\nifeq ($(PLATFORM),DM6446)\nLINUX_SRC = /home/fonchi/work/soc/ti-davinci\nendif\n\nifeq ($(PLATFORM),MT85XX)\nLINUX_SRC = /home/john/MTK/BDP_Linux/linux-2.6.27\nCROSS_COMPILE = armv6z-mediatek-linux-gnueabi-\nendif\n\nifeq ($(PLATFORM),NXP_TV550) \nLINUX_SRC = /data/tv550/kernel/linux-2.6.28.9\nLINUX_SRC_MODULE = /data/tv550/kernel/linux-2.6.28.9/drivers/net/wireless\nCROSS_COMPILE = /opt/embeddedalley/nxp_tv550/bin/mipsel-linux-\nendif\n\nifeq ($(PLATFORM),MVL5)\nLINUX_SRC = /home2/charlestu/AP-VT3426/linux-2.6.18\nCROSS_COMPILE = /opt/montavista/pro/devkit/arm/v5t_le_mvl5/bin/arm_v5t_le-\nendif\n\nexport OSABL RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET MODULE RTMP_SRC_DIR LINUX_SRC_MODULE TARGET HAS_WOW_SUPPORT\n\n# The targets that may be used.\nPHONY += all build_tools test UCOS THREADX LINUX release prerelease clean uninstall install libwapi osabl\n\nifeq ($(TARGET),LINUX)\nall: build_tools $(TARGET)\nelse\nall: $(TARGET)\nendif \n\n\n\nbuild_tools:\n\t$(MAKE) -C tools\n\t$(RT28xx_DIR)/tools/bin2h\n\ntest:\n\t$(MAKE) -C tools test\n\nUCOS:\n\t$(MAKE) -C os/ucos/ MODE=$(RT28xx_MODE)\n\techo $(RT28xx_MODE)\n\nECOS:\n\t$(MAKE) -C os/ecos/ MODE=$(RT28xx_MODE)\n\tcp -f os/ecos/$(MODULE) $(MODULE)\n\nTHREADX:\n\t$(MAKE) -C $(RT28xx_DIR)/os/Threadx -f $(RT28xx_DIR)/os/ThreadX/Makefile\n\nLINUX:\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\nifeq ($(OSABL),YES)\n\tcp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\nendif\n\n\tcp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\n\nifeq ($(OSABL),YES)\n\tcp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\nendif\n\nifeq ($(RT28xx_MODE),AP)\n\tcp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)ap.o /tftpboot\nifeq ($(OSABL),YES)\n\tcp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)ap.o /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)ap.o /tftpboot\nendif\nifeq ($(PLATFORM),INF_AMAZON_SE)\n\tcp -f /tftpboot/rt2870ap.o /backup/ifx/build/root_filesystem/lib/modules/2.4.31-Amazon_SE-3.6.2.2-R0416_Ralink/kernel/drivers/net\nendif\nelse\t\nifeq ($(RT28xx_MODE),APSTA)\n\tcp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)apsta.o /tftpboot\nifeq ($(OSABL),YES)\n\tcp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)apsta.o /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)apsta.o /tftpboot\nendif\nelse\n\tcp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)sta.o /tftpboot\nifeq ($(OSABL),YES)\n\tcp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)sta.o /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)sta.o /tftpboot\nendif\nendif\t\nendif\t\nelse\n\nifeq ($(OSABL),YES)\n\tcp -f os/linux/Makefile.6.util $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nendif\n\n\tcp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile\nifeq ($(PLATFORM),DM6446)\n\t$(MAKE)  ARCH=arm CROSS_COMPILE=arm_v5t_le- -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nelse\nifeq ($(PLATFORM),FREESCALE8377)\n\t$(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nelse\n\t$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nendif\nendif\n\nifeq ($(OSABL),YES)\n\tcp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nendif\n\nifeq ($(RT28xx_MODE),AP)\nifneq ($(findstring 7601,$(CHIPSET)),)\n\tcp -f $(RT28xx_DIR)/os/linux/mt$(MODULE)ap.ko /tftpboot\nelse\n\tcp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)ap.ko /tftpboot\nendif\nifeq ($(OSABL),YES)\n\tcp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)ap.ko /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)ap.ko /tftpboot\nendif\n\trm -f os/linux/rt$(MODULE)ap.ko.lzma\n\t/root/bin/lzma e os/linux/rt$(MODULE)ap.ko os/linux/rt$(MODULE)ap.ko.lzma\nelse\t\nifeq ($(RT28xx_MODE),APSTA)\n\tcp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)apsta.ko /tftpboot\nifeq ($(OSABL),YES)\n\tcp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)apsta.ko /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)apsta.ko /tftpboot\nendif\nelse\nifneq ($(findstring 7601,$(CHIPSET)),)\n\tcp -f $(RT28xx_DIR)/os/linux/mt$(MODULE)sta.ko /tftpboot\nelse\n\tcp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)sta.ko /tftpboot\nendif\nifeq ($(OSABL),YES)\nifneq ($(findstring 7601,$(CHIPSET)),)\n\tcp -f $(RT28xx_DIR)/os/linux/mtutil$(MODULE)sta.ko /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/mtnet$(MODULE)sta.ko /tftpboot\nelse\n\tcp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)sta.ko /tftpboot\n\tcp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)sta.ko /tftpboot\nendif\nendif\nendif\nendif\nendif\n\n\nrelease: build_tools\n\t$(MAKE) -C $(RT28xx_DIR)/striptool -f Makefile.release clean\n\t$(MAKE) -C $(RT28xx_DIR)/striptool -f Makefile.release\n\tstriptool/striptool.out\nifeq ($(RELEASE), DPO)\n\tgcc -o striptool/banner striptool/banner.c\n\t./striptool/banner -b striptool/copyright.gpl -s DPO/ -d DPO_GPL -R\n\t./striptool/banner -b striptool/copyright.frm -s DPO_GPL/include/firmware.h\nendif\n\nprerelease:\nifeq ($(MODULE), 2880)\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.release.2880 prerelease\nelse\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.release prerelease\nendif\n\tcp $(RT28xx_DIR)/os/linux/Makefile.DPB $(RTMP_SRC_DIR)/os/linux/.\n\tcp $(RT28xx_DIR)/os/linux/Makefile.DPA $(RTMP_SRC_DIR)/os/linux/.\n\tcp $(RT28xx_DIR)/os/linux/Makefile.DPC $(RTMP_SRC_DIR)/os/linux/.\nifeq ($(RT28xx_MODE),STA)\n\tcp $(RT28xx_DIR)/os/linux/Makefile.DPD $(RTMP_SRC_DIR)/os/linux/.\n\tcp $(RT28xx_DIR)/os/linux/Makefile.DPO $(RTMP_SRC_DIR)/os/linux/.\nendif\t\n\nclean:\nifeq ($(TARGET), LINUX)\n\tcp -f os/linux/Makefile.clean os/linux/Makefile\n\t$(MAKE) -C os/linux clean\n\trm -rf os/linux/Makefile\nendif\t\nifeq ($(TARGET), UCOS)\n\t$(MAKE) -C os/ucos clean MODE=$(RT28xx_MODE)\nendif\nifeq ($(TARGET), ECOS)\n\t$(MAKE) -C os/ecos clean MODE=$(RT28xx_MODE)\nendif\n\nuninstall:\nifeq ($(TARGET), LINUX)\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 uninstall\nelse\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 uninstall\nendif\nendif\n\ninstall:\nifeq ($(TARGET), LINUX)\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 install\nelse\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 install\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6.util install\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6.netif install\nendif\nendif\n\nlibwapi:\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\tcp -f os/linux/Makefile.libwapi.4 $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\nelse\n\tcp -f os/linux/Makefile.libwapi.6 $(RT28xx_DIR)/os/linux/Makefile\t\n\t$(MAKE) -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\t\nendif\t\n\nosutil:\nifeq ($(OSABL),YES)\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\tcp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\nelse\n\tcp -f os/linux/Makefile.6.util $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nendif\nendif\n\nosnet:\nifeq ($(OSABL),YES)\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\tcp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\nelse\n\tcp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nendif\nendif\n\nosdrv:\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\tcp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(RT28xx_DIR)/os/linux/\nelse\n\tcp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile\n\t$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules\nendif\n\n# Declare the contents of the .PHONY variable as phony.  We keep that information in a variable\n.PHONY: $(PHONY)\n"
  },
  {
    "path": "README.md",
    "content": "mt7601u\n=======\n\nRalink Wireless Adapter Driver\n"
  },
  {
    "path": "build.sh",
    "content": "#!/bin/sh\ncp -v /lib/modules/$(uname -r)/build/Module.symvers src/os/linux\nmake clean && make all \nrm -rvf src/os/linux/Module.symvers\nmodprobe --dump-modversions src/os/linux/mtnet7601Usta.ko\nmodprobe --dump-modversions src/os/linux/mtutil7601Usta.ko\nmodprobe --dump-modversions src/os/linux/mt7601Usta.ko\n"
  },
  {
    "path": "config.mk",
    "content": "# Support ATE function\nHAS_ATE=y\n\n# Support QA ATE function\nHAS_QA_SUPPORT=y\n\nHAS_RSSI_FEEDBACK=n\n\n# Support XLINK mode\nHAS_XLINK=n\n\n# Support WSC function\nHAS_WSC=y\nHAS_WSC_V2=y\nHAS_WSC_LED=n\nHAS_IWSC_SUPPORT=y\n\n\n# Support LLTD function\nHAS_LLTD=n\n\n\n# Support AP-Client function\nHAS_APCLI=n\n\n# Support Wpa_Supplicant\n# i.e. wpa_supplicant -Dralink\nHAS_WPA_SUPPLICANT=y\n\n\n# Support Native WpaSupplicant for Network Maganger\n# i.e. wpa_supplicant -Dwext\nHAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y\n\n#Support Net interface block while Tx-Sw queue full\nHAS_BLOCK_NET_IF=n\n\n#Support IGMP-Snooping function.\nHAS_IGMP_SNOOP_SUPPORT=n\n\n#Support DFS function\nHAS_DFS_SUPPORT=n\n\n#Support Carrier-Sense function\nHAS_CS_SUPPORT=n\n\n#Support HE_BD_SUPPORT\nHAS_HE_BD_SUPPORT=n\n\n\n# Support user specific transmit rate of Multicast packet.\nHAS_MCAST_RATE_SPECIFIC_SUPPORT=n\n\n# Support for Multiple Cards\nHAS_MC_SUPPORT=n\n\n#Support for PCI-MSI\nHAS_MSI_SUPPORT=n\n\n\n#Support for IEEE802.11e DLS\nHAS_QOS_DLS_SUPPORT=n\n\n#Support for EXT_CHANNEL\nHAS_EXT_BUILD_CHANNEL_LIST=n\n\n#Support for IDS \nHAS_IDS_SUPPORT=n\n\n\n#Support for Net-SNMP\nHAS_SNMP_SUPPORT=n\n\n#Support features of 802.11n Draft3\nHAS_DOT11N_DRAFT3_SUPPORT=y\n\n#Support features of Single SKU. \nHAS_SINGLE_SKU_SUPPORT=n\n\n#Support features of Single SKU. \nHAS_SINGLE_SKU_V2_SUPPORT=n\n\n#Support features of 802.11n\nHAS_DOT11_N_SUPPORT=y\n\n#Support for 802.11ac VHT\nHAS_DOT11_VHT_SUPPORT=n\n\n#Support for WAPI\nHAS_WAPI_SUPPORT=n\n\n\n#Support for 2860/2880 co-exist \nHAS_RT2880_RT2860_COEXIST=n\n\nHAS_KTHREAD_SUPPORT=n\n\n\n\n#Support for dot11z TDLS\nHAS_DOT11Z_TDLS_SUPPORT=n\n\n#Support for WiFi-Driect(Peer to Peer)\nHAS_P2P_SUPPORT=n\nHAS_P2P_ODD_MAC_ADJUST=n\nHAS_P2P_SPECIFIC_WIRELESS_EVENT=n\n\n#Support for WiFi Display\nHAS_WFD_SUPPORT=n\n\n#Support for Auto channel select enhance\nHAS_AUTO_CH_SELECT_ENHANCE=n\n\n#Support statistics count\nHAS_STATS_COUNT=y\n\n#Support TSSI Antenna Variation\nHAS_TSSI_ANTENNA_VARIATION=n\n\n#Support USB_BULK_BUF_ALIGMENT\nHAS_USB_BULK_BUF_ALIGMENT=n\n\n#Support for USB_SUPPORT_SELECTIVE_SUSPEND\nHAS_USB_SUPPORT_SELECTIVE_SUSPEND=n\n\n#Support USB load firmware by multibyte\nHAS_USB_FIRMWARE_MULTIBYTE_WRITE=n\n\n\n#Support ANDROID_SUPPORT\nHAS_ANDROID_SUPPORT=n\n\n#HAS_IFUP_IN_PROBE_SUPPORT\nHAS_IFUP_IN_PROBE_SUPPORT=n\n\n\n\n\n#Support TXRX SW Antenna Diversity\nHAS_TXRX_SW_ANTDIV_SUPPORT=n\n\n#Client support WDS function\nHAS_CLIENT_WDS_SUPPORT=n\n\n#Support for Bridge Fast Path & Bridge Fast Path function open to other module\nHAS_BGFP_SUPPORT=n\nHAS_BGFP_OPEN_SUPPORT=n\n\n# Support HOSTAPD function\nHAS_HOSTAPD_SUPPORT=y\n\n#Support GreenAP function\nHAS_GREENAP_SUPPORT=n\n\n#Support MAC80211 LINUX-only function\n#Please make sure the version for CFG80211.ko and MAC80211.ko is same as the one\n#our driver references to.\nHAS_CFG80211_SUPPORT=n\n\n#Support RFKILL hardware block/unblock LINUX-only function\nHAS_RFKILL_HW_SUPPORT=n\n\n\n\nHAS_APCLI_WPA_SUPPLICANT=n\n\nHAS_RTMP_FLASH_SUPPORT=n\n\nifeq ($(OSABL),YES)\nHAS_OSABL_FUNC_SUPPORT=y\nHAS_OSABL_OS_PCI_SUPPORT=y\nHAS_OSABL_OS_USB_SUPPORT=y\nHAS_OSABL_OS_RBUS_SUPPORT=n\nHAS_OSABL_OS_AP_SUPPORT=y\nHAS_OSABL_OS_STA_SUPPORT=y\nendif\n\nHAS_LED_CONTROL_SUPPORT=n\n\n\n#Support WIDI feature\n#Must enable HAS_WSC at the same time.\n\nHAS_TXBF_SUPPORT=n\n\nHAS_STREAM_MODE_SUPPORT=n\n\nHAS_NEW_RATE_ADAPT_SUPPORT=n\n\nHAS_RATE_ADAPT_AGS_SUPPORT=n\n\n\n\n\n#MT7601\nHAS_RX_CSO_SUPPORT=y\n\n\nHAS_WOW_SUPPORT=n\nHAS_WOW_IFDOWN_SUPPORT=n\nHAS_NEW_WOW_SUPPORT=n\n\nHAS_ANDES_FIRMWARE_SUPPORT=n\n\nHAS_HDR_TRANS_SUPPORT=n\n\nHAS_MULTI_CHANNEL=n\n\nHAS_MICROWAVE_OVEN_SUPPORT=n\n\nHAS_WIFI_P2P_CONCURRENT_FAST_SCAN=n\n\n#################################################\n\nCC := $(CROSS_COMPILE)gcc\nLD := $(CROSS_COMPILE)ld\n\nWFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT  -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs\nWFLAGS += -DSYSTEM_LOG_SUPPORT -DRT28xx_MODE=$(RT28xx_MODE) -DCHIPSET=$(MODULE) -DRESOURCE_PRE_ALLOC\n#WFLAGS += -DFPGA_MODE\nWFLAGS += -I$(RT28xx_DIR)/include\n\n\n\n\n\nifeq ($(HAS_WIFI_P2P_CONCURRENT_FAST_SCAN),y)\nWFLAGS += -DWIFI_P2P_CONCURRENT_FAST_SCAN\nendif\n\nifeq ($(HAS_HE_BD_SUPPORT),y)\nWFLAGS += -DHE_BD_SUPPORT\nendif\n\nifeq ($(HAS_KTHREAD_SUPPORT),y)\nWFLAGS += -DKTHREAD_SUPPORT\nendif\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\nWFLAGS += -DRTMP_FLASH_SUPPORT\nendif\n\nifeq ($(HAS_STREAM_MODE_SUPPORT),y)\nWFLAGS += -DSTREAM_MODE_SUPPORT\nendif\n\nifeq ($(HAS_SINGLE_SKU_SUPPORT),y)\nWFLAGS += -DSINGLE_SKU\nendif\n\nifeq ($(HAS_SINGLE_SKU_V2_SUPPORT),y)\nWFLAGS += -DSINGLE_SKU_V2\nendif\n\nifeq ($(HAS_DOT11_VHT_SUPPORT),y)\nWFLAGS += -DDOT11_VHT_AC\nendif\n\nifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y)\nWFLAGS += -DANDES_FIRMWARE_SUPPORT\nendif\n\nifeq ($(HAS_HDR_TRANS_SUPPORT),y)\nWFLAGS += -DHDR_TRANS_SUPPORT\nendif\n\n# config for AP mode\n\nifeq ($(RT28xx_MODE),AP)\nWFLAGS += -DCONFIG_AP_SUPPORT  -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDBG -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT\n\nifeq ($(HAS_APCLI_WPA_SUPPLICANT),y)\nWFLAGS += -DApCli_WPA_SUPPLICANT_SUPPORT\nendif\n\nifeq ($(HAS_HOSTAPD_SUPPORT),y)\nWFLAGS += -DHOSTAPD_SUPPORT\nendif\n\nifeq ($(HAS_ATE),y)\nWFLAGS += -DRALINK_ATE\nWFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW\nWFLAGS += -I$(RT28xx_DIR)/ate/include\nifeq ($(HAS_QA_SUPPORT),y)\nWFLAGS += -DRALINK_QA\nendif\nendif\n\nifeq ($(HAS_RSSI_FEEDBACK),y)\nWFLAGS += -DRSSI_FEEDBACK\nendif\n\n\n\n\nifeq ($(HAS_WSC),y)\nWFLAGS += -DWSC_AP_SUPPORT\n\nifeq ($(HAS_WSC_V2),y)\nWFLAGS += -DWSC_V2_SUPPORT\nendif\nifeq ($(HAS_WSC_LED),y)\nWFLAGS += -DWSC_LED_SUPPORT\nendif\nendif\n\n\n\nifeq ($(HAS_APCLI),y)\nWFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT\n#ifeq ($(HAS_ETH_CONVERT_SUPPORT), y)\n#WFLAGS += -DETH_CONVERT_SUPPORT\nendif\n\nifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)\nWFLAGS += -DIGMP_SNOOP_SUPPORT\nendif\n\nifeq ($(HAS_CS_SUPPORT),y)\nWFLAGS += -DCARRIER_DETECTION_SUPPORT\nendif\n\nifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y)\nWFLAGS += -DMCAST_RATE_SPECIFIC\nendif\n\nifneq ($(findstring 2860,$(CHIPSET)),)\nifeq ($(HAS_MSI_SUPPORT),y)\nWFLAGS += -DPCI_MSI_SUPPORT\nendif\nendif\n\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nWFLAGS += -DQOS_DLS_SUPPORT\nendif\n\nifeq ($(HAS_SNMP_SUPPORT),y)\nWFLAGS += -DSNMP_SUPPORT\nendif\n\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nWFLAGS += -DDOT11_N_SUPPORT\n\nifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y)\nWFLAGS += -DDOT11N_DRAFT3\nendif\n\nifeq ($(HAS_TXBF_SUPPORT),y)\nWFLAGS += -DTXBF_SUPPORT\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nWFLAGS += -DNEW_RATE_ADAPT_SUPPORT\nendif\n\nifeq ($(HAS_RATE_ADAPT_AGS_SUPPORT),y)\nWFLAGS += -DAGS_SUPPORT\nendif\n\nifeq ($(HAS_GREENAP_SUPPORT),y)\nWFLAGS += -DGREENAP_SUPPORT\nendif\n\nendif\n\nifeq ($(HAS_AUTO_CH_SELECT_ENHANCE),y)\nWFLAGS += -DAUTO_CH_SELECT_ENHANCE\nendif\n\nifeq ($(HAS_STATS_COUNT),y)\nWFLAGS += -DSTATS_COUNT_SUPPORT\nendif\n\nifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)\nWFLAGS += -DTSSI_ANTENNA_VARIATION\nendif\n\nifeq ($(HAS_USB_BULK_BUF_ALIGMENT),y)\nWFLAGS += -DUSB_BULK_BUF_ALIGMENT\nendif\n\n\nifeq ($(HAS_CFG80211_SUPPORT),y)\nWFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST\nifeq ($(HAS_RFKILL_HW_SUPPORT),y)\nWFLAGS += -DRFKILL_HW_SUPPORT\nendif\nendif\n\nifeq ($(OSABL),YES)\nWFLAGS += -DOS_ABL_SUPPORT\nifeq ($(HAS_OSABL_FUNC_SUPPORT),y)\nWFLAGS += -DOS_ABL_FUNC_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_PCI_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_USB_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_RBUS_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_AP_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_STA_SUPPORT\nendif\nendif\n\n\nifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y)\nWFLAGS += -DTXRX_SW_ANTDIV_SUPPORT\nendif\n\n\nendif #// endif of RT2860_MODE == AP //\n\n#################################################\n\n# config for STA mode\n\nifeq ($(RT28xx_MODE),STA)\nWFLAGS += -DCONFIG_STA_SUPPORT -DSCAN_SUPPORT -DDBG\n\nifeq ($(HAS_XLINK),y)\nWFLAGS += -DXLINK_SUPPORT\nendif\n\nWFLAGS += -DADHOC_WPA2PSK_SUPPORT\n\nifeq ($(HAS_WPA_SUPPLICANT),y)\nWFLAGS += -DWPA_SUPPLICANT_SUPPORT\nifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)\nWFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT\nendif\nendif\n\nifeq ($(HAS_WSC),y)\nWFLAGS += -DWSC_STA_SUPPORT\nifeq ($(HAS_WSC_V2),y)\nWFLAGS += -DWSC_V2_SUPPORT\nendif\nifeq ($(HAS_WSC_LED),y)\nWFLAGS += -DWSC_LED_SUPPORT\nendif\nifeq ($(HAS_IWSC_SUPPORT),y)\nWFLAGS += -DIWSC_SUPPORT\nendif\nendif\n\n\n\nifeq ($(HAS_ATE),y)\nWFLAGS += -DRALINK_ATE\nWFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW\nWFLAGS += -I$(RT28xx_DIR)/ate/include\nifeq ($(HAS_QA_SUPPORT),y)\nWFLAGS += -DRALINK_QA\nendif\nendif\n\n\nifeq ($(HAS_SNMP_SUPPORT),y)\nWFLAGS += -DSNMP_SUPPORT\nendif\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nWFLAGS += -DQOS_DLS_SUPPORT\nendif\n\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nWFLAGS += -DDOT11_N_SUPPORT\n\nifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y)\nWFLAGS += -DDOT11N_DRAFT3\nendif\n\nifeq ($(HAS_TXBF_SUPPORT),y)\nWFLAGS += -DTXBF_SUPPORT\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nWFLAGS += -DNEW_RATE_ADAPT_SUPPORT\nendif\n\nendif\n\nifeq ($(HAS_DOT11Z_TDLS_SUPPORT),y)\nWFLAGS += -DDOT11Z_TDLS_SUPPORT -DUAPSD_SUPPORT\nendif\n\nifeq ($(HAS_MULTI_CHANNEL),y)\nHAS_P2P_SUPPORT=y\nHAS_P2P_SPECIFIC_WIRELESS_EVENT=y\nWFLAGS += -DCONFIG_MULTI_CHANNEL\nendif\n\n\n\nifeq ($(HAS_WFD_SUPPORT),y)\nHAS_P2P_SUPPORT=y\nHAS_P2P_SPECIFIC_WIRELESS_EVENT=y\nWFLAGS += -DWFD_SUPPORT\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\nWFLAGS += -DP2P_SUPPORT -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT -DCONFIG_AP_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT\nendif\n\nifeq ($(HAS_P2P_ODD_MAC_ADJUST),y)\nWFLAGS += -DP2P_ODD_MAC_ADJUST\nendif\n\nifeq ($(HAS_P2P_SPECIFIC_WIRELESS_EVENT),y)\nWFLAGS += -DRT_P2P_SPECIFIC_WIRELESS_EVENT\nendif\n\nifeq ($(HAS_CS_SUPPORT),y)\nWFLAGS += -DCARRIER_DETECTION_SUPPORT\nendif\n\nifeq ($(HAS_STATS_COUNT),y)\nWFLAGS += -DSTATS_COUNT_SUPPORT\nendif\n\nifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)\nWFLAGS += -DTSSI_ANTENNA_VARIATION\nendif\n\nifeq ($(HAS_ANDROID_SUPPORT),y)\nWFLAGS += -DANDROID_SUPPORT\nendif\n\n\nifeq ($(HAS_IFUP_IN_PROBE_SUPPORT),y)\nWFLAGS += -DIFUP_IN_PROBE\nendif\n\nifeq ($(HAS_USB_SUPPORT_SELECTIVE_SUSPEND),y)\nWFLAGS += -DUSB_SUPPORT_SELECTIVE_SUSPEND\nendif\n\nifeq ($(HAS_USB_FIRMWARE_MULTIBYTE_WRITE),y)\nWFLAGS += -DUSB_FIRMWARE_MULTIBYTE_WRITE -DMULTIWRITE_BYTES=4\nendif\n\nifeq ($(HAS_CFG80211_SUPPORT),y)\nWFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST\nifeq ($(HAS_RFKILL_HW_SUPPORT),y)\nWFLAGS += -DRFKILL_HW_SUPPORT\nendif\nendif\n\nifeq ($(OSABL),YES)\nWFLAGS += -DOS_ABL_SUPPORT\nifeq ($(HAS_OSABL_FUNC_SUPPORT),y)\nWFLAGS += -DOS_ABL_FUNC_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_PCI_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_USB_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_RBUS_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_AP_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_STA_SUPPORT\nendif\nendif\n\n\nifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y)\nWFLAGS += -DTXRX_SW_ANTDIV_SUPPORT\nendif\n\n\nifeq ($(HAS_WIDI_SUPPORT),y)\nWFLAGS += -DWIDI_SUPPORT\n\nifeq ($(HAS_P2P_SUPPORT),y)\nifeq ($(HAS_INTEL_WFD_SUPPORT),y)\nWFLAGS += -DINTEL_WFD_SUPPORT\nendif\n\nifeq ($(HAS_WFA_WFD_SUPPORT),y)\nWFLAGS += -DWFA_WFD_SUPPORT\nendif\nendif\n\nendif\n\nifeq ($(HAS_WOW_SUPPORT),y)\nWFLAGS += -DWOW_SUPPORT\nendif\n\nifeq ($(HAS_WOW_IFDOWN_SUPPORT),y)\nWFLAGS += -DWOW_IFDOWN_SUPPORT\nendif\n\nifeq ($(HAS_NEW_WOW_SUPPORT),y)\nWFLAGS += -DNEW_WOW_SUPPORT\nendif\n\nendif\n# endif of ifeq ($(RT28xx_MODE),STA)\n\n#################################################\n\n# config for APSTA\n\nifeq ($(RT28xx_MODE),APSTA)\nWFLAGS += -DCONFIG_AP_SUPPORT -DCONFIG_STA_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DDBG\n\n\nifeq ($(HAS_WSC),y)\nWFLAGS += -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT\nendif\n\n\nifeq ($(HAS_APCLI),y)\nWFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT\nendif\n\nifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)\nWFLAGS += -DIGMP_SNOOP_SUPPORT\nendif\n\nifeq ($(HAS_CS_SUPPORT),y)\nWFLAGS += -DCARRIER_DETECTION_SUPPORT\nendif\n\nifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y)\nWFLAGS += -DMCAST_RATE_SPECIFIC\nendif\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nWFLAGS += -DQOS_DLS_SUPPORT\nendif\n\nifeq ($(HAS_WPA_SUPPLICANT),y)\nWFLAGS += -DWPA_SUPPLICANT_SUPPORT\nifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)\nWFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT\nendif\nendif\n\n\nifeq ($(HAS_ATE),y)\nWFLAGS += -DRALINK_ATE\nWFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW\nWFLAGS += -I$(RT28xx_DIR)/ate/include\nifeq ($(HAS_QA_SUPPORT),y)\nWFLAGS += -DRALINK_QA\nendif\nendif\n\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nWFLAGS += -DDOT11_N_SUPPORT\nendif\n\nifeq ($(HAS_TXBF_SUPPORT),y)\nWFLAGS += -DTXBF_SUPPORT\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nWFLAGS += -DNEW_RATE_ADAPT_SUPPORT\nendif\n\n\nifeq ($(HAS_CS_SUPPORT),y)\nWFLAGS += -DCARRIER_DETECTION_SUPPORT\nendif\n\nifeq ($(HAS_STATS_COUNT),y)\nWFLAGS += -DSTATS_COUNT_SUPPORT\nendif\n\nifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)\nWFLAGS += -DTSSI_ANTENNA_VARIATION\nendif\n\nifeq ($(HAS_CFG80211_SUPPORT),y)\nWFLAGS += -DRT_CFG80211_SUPPORT\nifeq ($(HAS_RFKILL_HW_SUPPORT),y)\nWFLAGS += -DRFKILL_HW_SUPPORT\nendif\nendif\n\nifeq ($(OSABL),YES)\nWFLAGS += -DOS_ABL_SUPPORT\nifeq ($(HAS_OSABL_FUNC_SUPPORT),y)\nWFLAGS += -DOS_ABL_FUNC_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_PCI_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_USB_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_RBUS_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_AP_SUPPORT\nendif\nifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)\nWFLAGS += -DOS_ABL_OS_STA_SUPPORT\nendif\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\nWFLAGS += -DP2P_SUPPORT\nWFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT\nendif\n\nendif\n# endif of ifeq ($(RT28xx_MODE),APSTA)\n#################################################\n\n#\n# Common compiler flag\n#\n\n\n\n\n\n\nifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y)\nWFLAGS += -DEXT_BUILD_CHANNEL_LIST\nendif\n\nifeq ($(HAS_IDS_SUPPORT),y)\nWFLAGS += -DIDS_SUPPORT\nendif\n\nifeq ($(HAS_WAPI_SUPPORT),y)\nWFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB\nendif\n\nifeq ($(OSABL),YES)\nWFLAGS += -DEXPORT_SYMTAB\nendif\n\nifeq ($(HAS_CLIENT_WDS_SUPPORT),y)\nWFLAGS += -DCLIENT_WDS\nendif\n\nifeq ($(HAS_BGFP_SUPPORT),y)\nWFLAGS += -DBG_FT_SUPPORT\nendif\n\nifeq ($(HAS_BGFP_OPEN_SUPPORT),y)\nWFLAGS += -DBG_FT_OPEN_SUPPORT\nendif\n\n\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\nWFLAGS += -DLED_CONTROL_SUPPORT\nendif\n\n\nifeq ($(HAS_MICROWAVE_OVEN_SUPPORT),y)\nWFLAGS += -DMICROWAVE_OVEN_SUPPORT\nendif\n\n#################################################\n# ChipSet specific definitions.\n#\nifneq ($(findstring 2860,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT2860 -DRT28xx -DA_BAND_SUPPORT\nCHIPSET_DAT = 2860\nendif\n\nifneq ($(findstring 3090,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT3090  -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2860\nendif\n\nifneq ($(findstring 2870,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT\nCHIPSET_DAT = 2870\nendif\n\nifneq ($(findstring 2070,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRT2070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\nCHIPSET_DAT = 2870\nendif\n\nifneq ($(findstring 3070,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2870\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nifeq ($(HAS_CS_SUPPORT), y)\nWFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT \nendif\nendif\n\nendif\n\nifneq ($(findstring 2880,$(CHIPSET)),)\nWFLAGS += -DRT2880 -DRT28xx -DRTMP_MAC_PCI -DCONFIG_RALINK_RT2880_MP -DRTMP_RBUS_SUPPORT -DMERGE_ARCH_TEAM -DA_BAND_SUPPORT -DCONFIG_SWMCU_SUPPORT\nifeq ($(HAS_WIFI_LED_SHARE), y)\nWFLAGS += -DCONFIG_WIFI_LED_SHARE\nendif\nendif\n\nifneq ($(findstring 3572,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2870\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nifeq ($(HAS_CS_SUPPORT), y)\nWFLAGS +=  -DCARRIER_DETECTION_FIRMWARE_SUPPORT\nendif\nendif\n\nendif\n\nifneq ($(findstring 3573,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT35xx -DRT3593 -DRT3573\\\n          -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\\\n          -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT \\\n\t\t  -DVCORECAL_SUPPORT -DNEW_MBSSID_MODE\n#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT\nCHIPSET_DAT = 2870\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nifeq ($(HAS_CS_SUPPORT), y)\nWFLAGS +=  -DCARRIER_DETECTION_FIRMWARE_SUPPORT\nendif\nendif\n\nendif\n\nifneq ($(findstring 3062,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3062 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2860\nendif\n\nifneq ($(findstring 3562,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3562 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT\n\nCHIPSET_DAT = 2860\nendif\n\nifneq ($(findstring 3593,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DDOT11N_SS3_SUPPORT -DRT3593 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DNEW_MBSSID_MODE -DVCORECAL_SUPPORT\n\n#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT\nCHIPSET_DAT = 2860\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nendif\n\nifneq ($(findstring 3390,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2860\nendif\n\nifneq ($(findstring 8592,$(CHIPSET)),)\nWFLAGS += -DRT8592 -DRT65xx -DRLT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER\nWFLAGS += -DRTMP_RF_RW_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT\n#WFLAGS += -DRTMP_EFUSE_SUPPORT \nifneq ($(findstring $(RT28xx_MODE),AP),)\n# TODO: shiang-6590, need to ask hardware about the memory base setting first!!\n#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nCHIPSET_DAT = 2860\nendif\n\nifneq ($(findstring 6590,$(CHIPSET)),)\nWFLAGS += -DRT6590 -DRT65xx -DRLT_MAC -DRLT_RF -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER  \n#-DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT\nifneq ($(findstring $(RT28xx_MODE),AP),)\n#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nCHIPSET_DAT = 2860\nendif\n\n\nifneq ($(findstring 6570,$(CHIPSET)),)\nWFLAGS += -DRT6570 -DRT65xx -DRLT_MAC -DRLT_RF -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE\nifneq ($(findstring $(RT28xx_MODE),AP),)\n#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n\nifeq ($(HAS_CSO_SUPPORT), y)\nWFLAGS += -DCONFIG_CSO_SUPPORT \nendif\n\nifeq ($(HAS_TSO_SUPPORT), y)\nWFLAGS += -DCONFIG_CSO_SUPPORT -DCONFIG_TSO_SUPPORT -DTX_PKT_SG\nendif\n\nCHIPSET_DAT = 2870\nendif\n\nifneq ($(findstring 7601E,$(CHIPSET)),)\nWFLAGS += -DMT7601E -DMT7601 -DRLT_MAC -DRLT_RF -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT -DVCORECAL_SUPPORT -DRTMP_EFUSE_SUPPORT -DhNEW_MBSSID_MODE -DRTMP_INTERNAL_TX_ALC -DCONFIG_ANDES_SUPPORT\n#-DRTMP_FREQ_CALIBRATION_SUPPORT\nifneq ($(findstring $(RT28xx_MODE),AP),)\n#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT\nendif\n\nCHIPSET_DAT = 2860\nendif\n\n\nifneq ($(findstring 7601U,$(CHIPSET)),)\nWFLAGS += -DMT7601U -DMT7601 -DRLT_MAC -DRLT_RF -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE -DRTMP_INTERNAL_TX_ALC -DCONFIG_ANDES_SUPPORT -DDPD_CALIBRATION_SUPPORT\nifneq ($(findstring $(RT28xx_MODE),AP),)\n#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n\nifeq ($(HAS_RX_CSO_SUPPORT), y)\nWFLAGS += -DCONFIG_RX_CSO_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nelse\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT\nendif\n\nCHIPSET_DAT = 2870\nendif\n\nifneq ($(findstring 3370,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2870\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nifeq ($(HAS_CS_SUPPORT), y)\nWFLAGS +=  -DCARRIER_DETECTION_FIRMWARE_SUPPORT\nendif\nendif\n\nendif\n\nifneq ($(findstring 5390,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRT5390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DRTMP_MAC\nCHIPSET_DAT = 2860\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nendif\n\nifneq ($(findstring 5370,$(CHIPSET)),)\nWFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRT5370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DRTMP_MAC\nCHIPSET_DAT = 2870\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nifeq ($(HAS_CS_SUPPORT), y)\nWFLAGS +=  -DCARRIER_DETECTION_FIRMWARE_SUPPORT\nendif\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nendif\n\nifneq ($(findstring 3052,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -DCONFIG_SWMCU_SUPPORT -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2870\nifeq ($(HAS_WIFI_LED_SHARE), y)\nWFLAGS += -DCONFIG_WIFI_LED_SHARE\nendif\nendif\n\nifneq ($(findstring 3352,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DNEW_MBSSID_MODE\nCHIPSET_DAT = 2860\nifeq ($(HAS_WIFI_LED_SHARE), y)\nWFLAGS += -DCONFIG_WIFI_LED_SHARE\nendif\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nendif\n\nifneq ($(findstring 5350,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT5350 -DRT305x -DRT3050 -DRT3350 -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE\nCHIPSET_DAT = 2860\nifeq ($(HAS_WIFI_LED_SHARE), y)\nWFLAGS += -DCONFIG_WIFI_LED_SHARE\nendif\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nendif\n\nifneq ($(findstring 5592,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT30xx -DRT5592\\\n\t\t  -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\\\n\t\t  -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT\\\n          -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION\nCHIPSET_DAT = 2860\nifeq ($(HAS_CSO_SUPPORT), y)\nWFLAGS += -DCONFIG_CSO_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n\nendif\n\nifneq ($(findstring 5572,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT5572 -DRT5592\\\n\t\t  -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE\\\n\t\t  -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT\\\n\t\t  -DRTMP_TEMPERATURE_COMPENSATION\nCHIPSET_DAT = 2870\nifeq ($(HAS_CSO_SUPPORT), y)\nWFLAGS += -DCONFIG_CSO_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nifeq ($(HAS_CS_SUPPORT), y)\nWFLAGS +=  -DCARRIER_DETECTION_FIRMWARE_SUPPORT \nendif\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\n#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n\nendif\n\nifneq ($(findstring 3290,$(CHIPSET)),)\nWFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRT30xx -DRT3290 -DVCORECAL_SUPPORT\nCHIPSET_DAT = 2860\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nWFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -DPCIE_PS_SUPPORT\nendif\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\nendif\n\n\nifeq ($(CHIPSET),USB)\n#3572\nWFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT\n#3370\nWFLAGS += -DRT33xx -DRT3070 -DRT3370 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_INTERNAL_TX_ALC\nCHIPSET_DAT = 2870\nendif\n\n\nifeq ($(CHIPSET),PCI)\n#3562\t\t\nWFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT\n#3390\nWFLAGS +=-DRT33xx -DRT3090 -DRT3390 -DRTMP_INTERNAL_TX_ALC\nendif\n\n\nifeq ($(CHIPSET),RBUS)\nWFLAGS += -DMERGE_ARCH_TEAM -DCONFIG_SWMCU_SUPPORT -DCONFIG_RA_NAT_NONE -DRTMP_RBUS_SUPPORT\n#5350, 3050, 3350, 3883\nWFLAGS +=-DRTMP_MAC_PCI -DRT305x -DRT5350 -DRT3050 -DRT3350 -DRT3883 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT\n\nifneq ($(findstring $(RT28xx_MODE),AP),)\nWFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT\nendif\n#WFLAGS += -DDBG_CTRL_SUPPORT \n#WFLAGS += -DINCLUDE_DEBUG_QUEUE\n#WFLAGS += -DRANGE_EXTEND -DCFO_TRACK -DPRE_ANT_SWITCH\nendif\n\n\n#################################################\n\n\nifeq ($(PLATFORM),5VT)\n#WFLAGS += -DCONFIG_5VT_ENHANCE\nendif\n\nifeq ($(HAS_BLOCK_NET_IF),y)\nWFLAGS += -DBLOCK_NET_IF\nendif\n\nifeq ($(HAS_DFS_SUPPORT),y)\nWFLAGS += -DDFS_SUPPORT\nendif\n\nifeq ($(HAS_MC_SUPPORT),y)\nWFLAGS += -DMULTIPLE_CARD_SUPPORT\nendif\n\nifeq ($(HAS_LLTD),y)\nWFLAGS += -DLLTD_SUPPORT\nendif\n\nifeq ($(PLATFORM),RMI)\nWFLAGS += -DRT_BIG_ENDIAN \nendif\n\nifeq ($(PLATFORM),UBICOM_IPX8)\nWFLAGS += -DRT_BIG_ENDIAN -DUNALIGNMENT_SUPPORT -DPLATFORM_UBM_IPX8 -DNO_CONSISTENT_MEM_SUPPORT -DCACHE_LINE_32B\nendif\n\nifeq ($(PLATFORM),BL2348)\nWFLAGS += -DRT_BIG_ENDIAN\nendif\n\nifeq ($(PLATFORM),BL23570)\nWFLAGS += -DRT_BIG_ENDIAN\nendif\n\nifeq ($(PLATFORM),BLUBB)\nWFLAGS += -DRT_BIG_ENDIAN\nendif\n\nifeq ($(PLATFORM),BLPMP)\nWFLAGS += -DRT_BIG_ENDIAN\nendif\n\nifeq ($(PLATFORM),RMI_64)\nWFLAGS += -DRT_BIG_ENDIAN \nendif\nifeq ($(PLATFORM),IXP)\nWFLAGS += -DRT_BIG_ENDIAN\nendif\n\nifeq ($(PLATFORM),IKANOS_V160)\nWFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0\nendif\n\nifeq ($(PLATFORM),IKANOS_V180)\nWFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0\nendif\n\nifeq ($(PLATFORM),INF_TWINPASS)\nWFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS\nendif\n\nifeq ($(PLATFORM),INF_DANUBE)\nifneq (,$(findstring 2.4,$(LINUX_SRC)))\n# Linux 2.4\nWFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN\nelse\n# Linux 2.6\nWFLAGS += -DRT_BIG_ENDIAN\nendif\nendif\n\nifeq ($(PLATFORM),INF_AR9)\nWFLAGS += -DRT_BIG_ENDIAN -DINF_AR9\n# support MAPI function for AR9.\n#WFLAGS += -DAR9_MAPI_SUPPORT\nendif\n\nifeq ($(PLATFORM),INF_VR9)\nWFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -DINF_VR9\nendif\n\nifeq ($(PLATFORM),CAVM_OCTEON)\nWFLAGS += -DRT_BIG_ENDIAN\nendif\n\nifeq ($(PLATFORM),BRCM_6358)\nWFLAGS += -DRT_BIG_ENDIAN -DBRCM_6358\nendif\n\nifeq ($(PLATFORM),INF_AMAZON_SE)\nWFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE\nendif\n\nifeq ($(PLATFORM),RALINK_3052)\nWFLAGS += -DPLATFORM_RALINK_3052\nendif\n\nifeq ($(PLATFORM),FREESCALE8377)\n#EXTRA_CFLAGS := -v -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include $(WFLAGS)-O2 -Wall -Wstrict-prototypes -Wno-trigraphs \n#export EXTRA_CFLAGS\nWFLAGS += -DRT_BIG_ENDIAN\nEXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include\nendif\n\nifeq ($(PLATFORM),ST)\n#WFLAGS += -DST\nWFLAGS += -DST\nendif\n\n#kernel build options for 2.4\n# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star\n\nifeq ($(PLATFORM),RALINK_3052)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM), RALINK_2880)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),STAR)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4  -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)\n\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),UBICOM_IPX8)\nEXTRA_CFLAGS += $(WFLAGS) \nexport EXTRA_CFLAGS\nendif\n\nifeq ($(PLATFORM),SIGMA)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2     -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM\n\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),SIGMA_8622)\nCFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),5VT)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000  -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) \n\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),IKANOS_V160)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),IKANOS_V180)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),INF_TWINPASS)\nCFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),INF_DANUBE)\n\tifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\tCFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float  -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic\n\telse\n\tCFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float  -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic\n\tendif\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),INF_AR9)\nCFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float  -mabi=32 -mlong-calls -march=mips32r2 -mtune=34kc -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),INF_VR9)\nCFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float  -mabi=32 -mlong-calls -march=mips32r2 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),BRCM_6358)\nCFLAGS := $(WFLAGS) -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe  -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic  -Os -fomit-frame-pointer -Wdeclaration-after-statement  -DMODULE -mlong-calls\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),INF_AMAZON_SE)\nCFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -nostdinc -iwithprefix include $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),ST)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -O2 -Wundef -Wstrict-prototypes -Wno-trigraphs -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing -fno-common -fomit-frame-pointer -ffreestanding -m4-nofpu -o $(WFLAGS) \nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),PC)\n    ifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\t# Linux 2.4\n\tCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)\n\texport CFLAGS\n    else\n\t# Linux 2.6\n\tEXTRA_CFLAGS := $(WFLAGS) \n    endif\nendif\n\nifeq ($(PLATFORM),INTELP6)\n\tEXTRA_CFLAGS := $(WFLAGS) \nendif\n\n#If the kernel version of RMI is newer than 2.6.27, please change \"CFLAGS\" to \"EXTRA_FLAGS\"\nifeq ($(PLATFORM),RMI)\nEXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding  -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS)\nexport EXTRA_CFLAGS\nendif\n\nifeq ($(PLATFORM),RMI_64)\nEXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=64 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding  -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS)\nexport EXTRA_CFLAGS\nendif\n\nifeq ($(PLATFORM),IXP)\n\tCFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -mbig-endian -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)\n        EXTRA_CFLAGS := -v $(WFLAGS) -mbig-endian\n\texport CFLAGS        \nendif\n\nifeq ($(PLATFORM),SMDK)\n        EXTRA_CFLAGS := $(WFLAGS) \nendif\n\nifeq ($(PLATFORM),CAVM_OCTEON)\n\tEXTRA_CFLAGS := $(WFLAGS) -mabi=64 $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),DM6446)\n\tCFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(LINUX_SRC)/include  -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mabi=apcs-gnu -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS)\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),BL2348)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2     -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),BL23570)\nEXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2     -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -mabi=32 -march=74kc -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL23570\nexport EXTRA_CFLAGS\nendif\n\nifeq ($(PLATFORM),BLUBB)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2     -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),BLPMP)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2     -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB\nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),MT85XX)\n    ifneq (,$(findstring 2.4,$(LINUX_SRC)))\n\t# Linux 2.4\n\tCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)\n\texport CFLAGS\n    else\n\t# Linux 2.6\n\tEXTRA_CFLAGS += $(WFLAGS) -DMT85XX\n\tEXTRA_CFLAGS += -D _NO_TYPEDEF_BOOL_ \\\n\t                -D _NO_TYPEDEF_UCHAR_ \\\n\t                -D _NO_TYPEDEF_UINT8_ \\\n\t                -D _NO_TYPEDEF_UINT16_ \\\n\t                -D _NO_TYPEDEF_UINT32_ \\\n\t                -D _NO_TYPEDEF_UINT64_ \\\n\t                -D _NO_TYPEDEF_CHAR_ \\\n\t                -D _NO_TYPEDEF_INT16_ \\\n\t                -D _NO_TYPEDEF_INT32_ \\\n\t                -D _NO_TYPEDEF_INT64_ \\\n\t                \n    endif\nendif\n\nifeq ($(PLATFORM),NXP_TV550)\n    ifneq (,$(findstring 2.4,$(LINUX_SRC)))\n        # Linux 2.4\n        CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=mips -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)\n        export CFLAGS\n    else\n        # Linux 2.6\n        EXTRA_CFLAGS := $(WFLAGS)\n    endif\nendif\n\nifeq ($(PLATFORM),MVL5)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000  -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) \nexport CFLAGS\nendif\n\nifeq ($(PLATFORM),RALINK_3352)\nCFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe  -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)\nexport CFLAGS\nendif\n"
  },
  {
    "path": "doc/History.txt",
    "content": "[V2.x.x.x]\n\tP4V. Test\n[V2.5.0.0]\n\t1.\tAdd mac80211 iw utility other commands support.\n\t\tRename crda.c to cfg80211.c, CRDA_SUPPORT to RT_CFG80211_SUPPORT.\n\t2.\tFix issue: No McuCmdLock initialization for RT3592/RT3390.\n\t3.\tFix issue: The start address of HeaderBuf must be aligned by 4 when\n\t\tVENDOR_FEATURE1_SUPPORT is enabled.\n\t4.\tWMM ACM: see history of acm_comm.c.\n\t5.\tFix issue: sometimes rt2860_interrupt() will be called before rt28xx_init()\n\t\tin fedora core 7.\n\t6.\tAdd RT3592 PCIe chip ID.\n\t7.\tFix issue in 64bit CPU:\n\t\t(1) WMM ACM: see history of acm_comm.c.\n\t\t(2) Fix function RTMP_MapChannelID2KHZ().\n\t8.\tCFG80211: Patch for Linux 2.6.32.\n\t9.  Add an ATE command for AUTOALC.\n\t10. Add an ATE command for interpacket GAP.\n\t11. Add an ATE command for ATE payload pattern.\n\t12. Fix issue: UAPSD SP can not be closed correctly for mix-mode power save.\n\t\tUAPSD + legacy PS.\n\t13. [Bug fixed] The extended rate of probe-req is disappeared in AP-Client mode\t\n\t14. Add RT3593 PCI/PCIe AP/STA.\n\t15. Fix issue: kernel panic when we forward VLAN bc/mc packet to wireless LAN.\n\t16. Fix issue: some reports from Prevent software analysis tool.\n\t17. Fix issue: get wrong VLAN priority from VLAN tag in RTMPCheckEtherType().\n\t18. Fix issue: no 11b basic rate in beacon when we change WirelessMode to 2.4G,\n\t\tthen 5G, then 2.4G\n\t19. Fix issue: no 11b-only mode can be set in AP mode.\n\t20. MBSS: add function to set different phy mode for different BSS.\n\t21. Phy Mode: add check if the chip supports 5G band when WirelessMode is 5G band\n\t\tfor command WirelessMode and MBSSWirelessMode.\n\t22. QLOAD: Fix issue for big endian.\n\t\tOr value of QLOAD element in beacon will be wrong.\n\t23. USB: Fix timer trigger fail after APStop and then APStartup.\n\t\tSide effect1: Power save can not work in AP mode when you do channel\n\t\tswitch because channel switch will do APStop() and APStart().\n\t\tSide effect2: After radion on/off, TIM will not be updated due to beacon\n\t\ttimer is not started.\n\t24. Station: Add new rate switch algorithm (AGS) for 1*1, 2*2, 3*3.\n\t25. AP: Fix power save problem when station is in power-save mode and send\n\t\t(re)associate frame again we will think the station is still in PS mode,\n\t\tbut the station is in ACTIVE mode.\n\t26. TX Block: Fix no packet can be sent when TX Fail count > a threshold for\n\t\tnon-WDS interface in RTMPDeQueuePacket().\n\t27. Fix WPS issue: WPS process failed with some WPS Client that sends dis-assoc close to WSC_DONE. \n\t28. Refine the stack size of all functions to be smaller than 300B.\n\t29. Fix bugs when protocol field of packet & 0x8080 does not equal to 0.\n\t\tSuch as PPPOE.\n\t30. Fix issue: Wrong MACRO use for RTMP_SET_PACKET_DHCP ~ RTMP_SET_PACKET_IPV4.\n\t31.\tFix ACM issue: Need also to unlock after calling ACMP_MsduClassify() in USB.\n\t32.\tFix IGMP bc/mc User Priority issue: Need also to get UP for bc/mc packets.\n\n[V2.4.0.0]\n\t1.\tAMSDU supports NO-ACK.\n\t2.\tAdded new channel list of A-Band Region 16\n\t3.\tBasic Ethtool support. (i.e. GSO)\n\t4.\tFix issue: PCI command thread initialization in pci_main_dev.c\n\t\tinit_waitqueue_head(&pAd->cmdQTask.kthread_q); for KTHREAD_SUPPORT\n\t5.\tWMM ACM: see history of acm_comm.c.\n\t6.\tFix issue: When PS-Poll is received in AP and STA is not WMM device and\n\t\tno any queued packet, we will reply DATA NULL frame. We will double-lock.\n\t7.\tAP QLOAD: Add compile option.\n\t8.\tAdd CRDA function in Linux 2.6.28 above.\n\t9.\tIncrease channel property. Property is only set in CRDA function currently.\n\t10. RSSI feedback supported(only with Ralink client).\n\t11. Fix issue: Wmm capable will be enabled from ABG mode to N mode but Wmm capable is\n\t\tnot recovered when from N mode to ABG mode.\n\t12.\tTwo iwpriv commands \"ACLDelEntry\" and \"ACLShowAll\" are added.\n\t13. Support 802.11v draft 5.0 WNM - BSS transition Management and DMS.\n\t14. Add OS abstract layer partition, util.ko, driver.ko, and netif.ko\n\t15. Support ApClient WPS PBC.\n\n[V2.3.0.0]\n\t1.\tWMM ACM AP/STA support. (Pass WiFi Test Plan v0.30)\n\t2.\tAdd HAS_STATS_COUNT compile option.\n\t3.\tProvide some 802.1x parameter support(Quiet-period, idle-timeout, NAD-ID).\n\t4.\tFix issue : The Tx date rate can't be fixed in B/G PHY mode.\n\t5.\tQLOAD: Add status information display function. \"qload show\" & QloadClr.\n\t6.\tQLOAD: Add channel busy alarm and a command thread in PCI/USB driver.\n\t7.\tIt supports the MAC assignment from configuration file(.dat).\n\t8.\tFix issue : No packet is delivered from AP when PsMode from PS to ACTIVE.\n\t9.\tFast Power Save : Use Null frame with PM=0 to get buffered packet, not PS-Poll in station mode.\n\t10.\tminiupnpd supported.\n\t11. AP-Client and WDS support fixed rate.\n\t12.\tSupport GreenAP.\n\t13. Support Single SKU.\n\t14.\tFix issue : RT3062/RT3562 can't enable/disable Radio.\n\t15.\tDiscard IgmpSn enable setting per BSSID and change it to as global setting.\n\n[V2.2.0.0]\n\t1. \tNew generation schema for multiple OS porting\n\t2. \tNew chip support for RT3572\n\t3.\tNew chip support for RT3062/RT3562\n\t4.\tRestrict the encryption type in HT mode.\n\t5.\tSupport 802.1x reauthentication mechanism.\n\t6.\tLimit the STA connection count per BSS.\n\t7.\tSome variables support MBSS setting.\n\t8.\tSupport WDS entry life check function.\n\t9.\tSupport Mesh Air link time.\n\t10.\tSupport Mesh Link Metric report action.\n\t11.\tSupport Dot11K RRM for all testing cases of voice-enterprise testing event.\n\t12.\tPerformance Tune.\n\n[V2.1.1.0]\n\t1.  fix eFuse bug on big-endian platform\n\t2.  fix WMM problem for RT3071/72 \n\t3.  fix one bug for ATE TX power handling and ATE frequency offset bug.\n\t4.  fix mesh crash issue\n\t5.  fix RT307x AMPDU throughput bug after interface down/up\n\t6.  update RT307x new firmware.\n\n[V2.1.0.0]\n\t1.  Support new chips RT3070/71/72, RT3090/91/92.\n\t2.  Fix bugs: fix WMM, Mesh, WDS, AP Client and DLS problems for Amazon SE platform\n\t3.  Fix bug: memory leakage problem when interface up/down.\n\t4.  Support eFuse.    \n\n[V2.0.0.0]\n\t1.\tAdded Global Country Domain supported.\n\t2.\tFix bug: suspend/resume error when ra0 down, rax up\n\t3.\tAdd new UAPSD SP counting mechanism.\n\t4.\tFix bug: Ikanos WDS, AP Client, Mesh interface get problem.\n\t5.\tAdd new WSC hardware push button function for PCI & USB.\n\t6.\tAdded a function allow user to specific Tx rate for Mcast packets.\n\t7.\tMigrate Mesh supporting to Draft-2.0.\n\t8.\tSupport WAPI functionality\n\t9.\tModify the priority of BAR transmission to solve the connection issue with Intel 4965 11n STA.\n\t10.\tFix RT2870 USB suspend/resume.\n\n[V1.9.0.0]\n\t1.\tReplace iwpriv cmd \"AccessControlList\" by \"ACLAddEntry\" and \"ACLClearAll\"\n\t2.\tFixed the wrong usage of AtoH().\n\t3.\tSupport new Windows ATE GUI.\n\t4.\tAdd a command \"iwpriv ra0 set ATERE2P=1\" to display all EEPROM content. \n\t5.  Correct the limitation of the length of fragment.\n\t6.\tFix bug: Fail to transmit packets through AMPDU way except the case that AP to STA.\n\t7.\tWrong Hareware packet length calculation of Mesh packet if it been Fragmented.\n\t8.\tSupport SIGMA 8622/8624 platform. \n\t9.\tAdd WPS PBC Session Overlap Detecting.\n\t10.\tAdd WPS 4-PinCode Support.\n\t11.\tFixed WPS enable PSP can not associate AP when AP security set to WPA-PSK.  \n\t12.\tFix \"Suspend to Disk\" problem for USB\n\n[V1.8.0.0]\n\t1.\tShow Tx/Rx statistics per MBSS.\n\t2.\t802.1x supports failover mechanism.\n\t3.\tAdd watchdog to prevent MAC/BBP into the deadlock condition.\n\t4.\tSupport pure 11n with 5G band.\n\t5.\tUpdate Timer Functions\n\t6.\tIn multiple cards application, the interface name is changed to raxx_k, where xx means card ID (0 ~ 31) and\n\t\tk means the BSS number (0 ~ 7)\n\t7.\tSupport individual MCS per BSS.\n\t8.\tAdd IKANOS Vx160 and Vx180.\n\t9.\tAdd station keep alive detection function in AP mode.\n\t10.\tThe SIFS of CCK is changed to 16 micro seconds to fix the connection problem with INTEL 2200bg cards.\n\t11.\tQBSS Load Element is added to provide channel utilization information to all STAs.\n\t12.\tFix bug : After AP re-key, the ping connection from client to AP would be time-out within several seconds. \n\t13.\tSupport Mesh function.\n\t14.\tBig-endian ATE supported.\n\t\n\n[V1.7.0.0]\n\t1.\tSupport IDS notification mechanism\n\t2.\tChange IRQ LOCK to SEM LOCK\n\t3.\tFix bug : When QoS(non-BE) and fragment packets are received, AP would calculate wrong MIC in TKIP mode.  \n\t4.\tSupport Non-GPL MD5\n\t5.\tUpdate Group rekey mechanism\t\n\t6.\tFix BA time-out issue for Intel wireless card 4965AGN with version 11.5.0.32. \n\t7.\tAdd command \"iwpriv ra0 set ATELDE2P=1\" to overwrite all EEPROM contents from \"/etc/Wireless/RT2860(/70)AP(/STA)/e2p.bin\".\n\t8.\tFix RTS threshold issue in 5G-band \n\t9.\tAdd DLS Function.\n\t10.\tIPV6 MLDv2 support\n\t11.\tFix VLAN ID >= 256 can not be used.\n\t12\tAdded PCIE MSI supporting for RT2890.\n\t13\tAdded new channel list builder that create channel list according to country-code and channel Geography(in/out door).\n\n[V1.6.0.0]\n\t1.\tFix bug : Before AP shutdown, AP doesn't noify those associated STA through dis-association.\n\t2.\tFix bug : The Atheros wireless STA card built in MacBook can't work normally when HT mode and the encryption is WEP or TKIP.\n\t3.\tThe support region in A band synchronizes with EEPROM.\n\t4.\tIt supports to initialize current wireless MAC address from E2PROM or module parameter.\n\t5.\tSupport maximum 8 MBSS and each beacon maximum length is 512 bytes.\n\t6.     Support 5-GHz band ATE.\n\t7.\tSend DisAssoc frame to timeout STA.    \n\t8.\tWorkaround for Atheros STA on AES mode.\n\t9.\tTx RTS/CTS when AP setup BA.\n\t10.\tDriver sends IAPP L2 frame instread of Daemon.\n\t11.\tCorrect some timeout values of WPS. \n\t12.\tFix bug : The 802.1x daemon(rt2860apd) has some problem for parsing multiple parameters in MBSS.\n\t13.\tFix bug : The AP site survey signal isn't correct.\n\t14.\tProvide some 11n statistics variables.\n\t15.    Fix bug : RT2561 module can not be removed after RT2860 module is inserted.\n\t16.    Added DEO (100 ~ 140) channel list for Ganmany.\n\t17.    Support wds phy mode and security setting for each wds link.\n\t18.\tFix bug : The Atheros legacy USB STA card can't connect to our AP in WPA-TKIP.\n\t19.\tModify rate adaptation for fast ramp-up tuning.\n\t20.    Fix WPS IOT issue with Atheros externnal registrar. Need Sync the user space daemon \"wscd\" to version 0.1.0\n\t21.\tFix bug : The BlackBerry/HTC can't connect to our AP.\n\t22.\tCorrect the default values of those WMM EDCA parameters.\n\t23.\tFix low throughput issue in Intel certification test. \n\n[V1.5.0.0]\n\t1. Added McastPhyMode and McastMcs iwpriv commands let user to specifice the rate for Multicast packets transmition.\n\t2. Added two configrations of McastPhyMode and McastMcs.\n\t3. Re-organize the WPA state machine in order to the consistency between AP and AP-Client. \n\t4. Added DFS support.\n\t5. Added Carrier-Sense suppport.\n\t6. Fixed a bug about dissection issue in profile.\n    7. Fixed CountryRegion and channel map, when profile's channel have not on channel list.\n\t8. Fixed 802.1x Authentication problem with 1x-WEP/WPA(2)-Enterprise when WPS is enabled.\n\t9. Fix bug : Once the radio is off and on, the beacon frames disappear. \n\n[V1.4.0.0]\n\t1. Wireless IGMP snooping support for multimedia steaming.\n\t2. Access control list support\n\t3. Re-organize the Rx data path.\n\t4. AP client WPS support.\n\t5. Fix the Auto-selecting channel issue.\n\t6. Add CountryString ioctl command function.\n\t7. Buf fix for Atheros WPS STA can not config WPS AP when Athros JumpStart STA is external Registrar.\n\t8. Merge for WCN test modify to WPS functions.\n\t9. Patch for 11n requirement, if HT mode is set and BW is 40MHz in A-band, the supported Channel number must be the multiple of 2.\n\t10. Fix bug: If STA card operated with zero-config, the group rekey negotiation of WPA2(PSK)-AES always fails.\n\t11. Add Tx & Rx Stream functionality.\n        12. Support QA user interface for ATE function.\n\n[V1.3.0.0]\n\t1. add vlan tag support for each BSS\n\t2. add support for 32bit/64bit Linux\n\t3. merge in plugfest code\n\t4. Support Ap-Client function\n\t5. Add new parameter \"bWiFiTest\" for WPA & WMM WiFi-Test.\n    6. Add the setting of Japan filter coefficients for ATE.\n    7. Fix bug for channel have not update when auto channel select was true. \n\n[V1.2.1.0]\n\t1. add protect for RTMP_IRQ_LOCK to avoid in spin_lock_irqsave call spin_lock_bh cause kernel waring messages.\n\t2. tag one branch named V_1_2_1_0 (v1.2.1.0) in the CVS\n\n[V1.2.0.0]\n\t1. set BBP R66 to 0x38 in 20 MHz band\n\t2. Disable one mechanism - change 40 to 20 MHz automatically when detecting other legacy APs with beacon.\n\t3. Fix bug for counterMeasures in WiFi test\n\t4. Write TXWI in ATE's way and disable any protection mechanism when ATE is running.\t\t\t\n\t5. Asic only takes care of the sequence number of beacon frame.\n\t6. disable ATE RSSI statistics when ATE is not running.\t   \n\t7. Set CW_MAX from 10 to 6 in AP mode.\n\t8. Select DAC according to HT or Legacy mode. \n\t9. Support WPA2 Pre-authemtication.\n\t10. Fix WDS panic bug\n\t11. Shift skb control block used by driver to offset 10 to avoid dirty cb[] from protocol stack\n\t12. modify mac register \"PBF_MAX_PCNT\" from  0x1F3f7f9f to 0x1f3fbf9f\n\t13.\tFix issue - 802.1X daemon may cause throughput reduction.\n\t14. Support Wireless event log mechanism.\t\n\t15. Add a 200ms-timer to enqueue EAPoL-Start for WPAPSK, not RTMPusecDelay.\n\t16. modify mac register \"EXP_ACK_TIME\" from 0x002400ca to 0x005400ca.\n\t17. Auto-selecting channel check.\n     \n[V1.1.0.0]\n\t1. Add fast rate switch from Windows code\n\t2. tune BBP R66, R62, R63, R64, R86 by bandwidth and G/A band different value\n\t3. Modify release to DPA and DPB\n\t4. Modify fast rate switch timer form periodic to trigger by condition, same with Windows\n\t5. Fix UAPSD bugs for null frame was drop\n\t6. Fix management queue pass qos null frame ...\n\t7. Code freeze for Wifi\n\t8. fix 5vt packet set to 0 to clear cb[22]\n\t9. merge code from Plugfest #6\n\t10. add \"iwpriv ra0 show driverinfo\" to show the driver version\n\t11. fix rt_config.h tag of Support station with tab\n\t12. merge ATE code request by Gemtek\n\t13. remove 5VT enhancement in RX path\n\n[V1.0.0.0]\n1.RT2860c emulation ping ok\n"
  },
  {
    "path": "doc/README_STA_usb",
    "content": "* README\n*\n* Ralink Tech Inc.\n* \n* http://www.ralinktech.com\n*\n\n=======================================================================\nModelName:\n===========\nRT2870 Wireless Lan Linux Driver\n\n\n=======================================================================\nDriver lName:\n===========\nrt2870.o/rt2870.ko\n\n\n=======================================================================\nSupporting Kernel:\n===================\nlinux kernel 2.4 and 2.6 series. \nTested in Redhat 7.3 or later.\n\n\n=======================================================================\nRalink Hardware:\n===================\nRalink 802.11n Wireless LAN Card.\n\n\n=======================================================================\nDescription:\n=============\nThis is a linux device driver for Ralink RT2870 USB ABGN WLAN Card.\n\n\n=======================================================================\nContents:\n=============\nMakefile\t        : Makefile\n*.c\t\t\t\t\t: c files\n*.h\t\t\t\t\t: header files\n\n\n=======================================================================\nFeatures:\n==========\n   This driver implements basic IEEE802.11. Infrastructure and adhoc mode with \n   open or shared or WPA-PSK or WPA2-PSK authentication method. \n   NONE, WEP, TKIP and AES encryption. \n\n\n=======================================================================\nBuild Instructions:  \n====================\n\n1> $tar -xvzf DPB_RT2870_Linux_STA_x.x.x.x.tgz\n    go to \"./DPB_RT2870_Linux_STA_x.x.x.x\" directory.\n    \n2> In Makefile\n\t set the \"MODE = STA\" in Makefile and chose the TARGET to Linux by set \"TARGET = LINUX\"\n\t define the linux kernel source include file path LINUX_SRC\n\t modify to meet your need.\n\n3> In os/linux/config.mk \n\tdefine the GCC and LD of the target machine\n\tdefine the compiler flags CFLAGS\n\tmodify to meet your need.\n\t** Build for being controlled by NetworkManager or wpa_supplicant wext functions\n\t   Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.\n\t   => #>cd wpa_supplicant-x.x\n\t   => #>./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d\n\t** Build for being controlled by WpaSupplicant with Ralink Driver\n\t   Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n'.\n\t   => #>cd wpa_supplicant-0.5.7\n\t   => #>./wpa_supplicant -Dralink -ira0 -c wpa_supplicant.conf -d\n\n4> $make\n\t# compile driver source code\n\t# To fix \"error: too few arguments to function iwe_stream_add_event\"\n\t  => $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c\n\n5> $cp RT2870STA.dat  /etc/Wireless/RT2870STA/RT2870STA.dat\n    \n6> load driver, go to \"os/linux/\" directory.\n    #[kernel 2.4]\n    #    $/sbin/insmod rt2870sta.o\n    #    $/sbin/ifconfig ra0 inet YOUR_IP up\n        \n    #[kernel 2.6]\n    #    $/sbin/insmod rt2870sta.ko\n    #    $/sbin/ifconfig ra0 inet YOUR_IP up\n\n7> unload driver    \n    $/sbin/ifconfig ra0 down\n\t$/sbin/rmmod rt2870sta\n\t\n=======================================================================\nCONFIGURATION:  \n====================\nRT2870 driver can be configured via following interfaces, \ni.e. (i)\"iwconfig\" command, (ii)\"iwpriv\" command, (iii) configuration file\n\ni)  iwconfig comes with kernel.  \nii) iwpriv usage, please refer to file \"iwpriv_usage.txt\" for details.\niii)modify configuration file \"RT2870STA.dat\" in /etc/Wireless/RT2870STA/RT2870STA.dat.\n           \nConfiguration File : RT2870STA.dat\n---------------------------------------\n# Copy this file to /etc/Wireless/RT2870STA/RT2870STA.dat\n# This file is a binary file and will be read on loading rt.o module.\n#\n# Use \"vi RT2870STA.dat\" to modify settings according to your need.\n# \n# 1.) set NetworkType to \"Adhoc\" for using Adhoc-mode, otherwise using Infrastructure\n# 2.) set Channel to \"0\" for auto-select on Infrastructure mode\n# 3.) set SSID for connecting to your Accss-point.\n# 4.) AuthMode can be \"WEPAUTO\", \"OPEN\", \"SHARED\", \"WPAPSK\", \"WPA2PSK\", \"WPANONE\"\n# 5.) EncrypType can be \"NONE\", \"WEP\", \"TKIP\", \"AES\"\n# for more information refer to the Readme file.\n# \n#The word of \"Default\" must not be removed\nDefault\nCountryRegion=5\nCountryRegionABand=7\nCountryCode=\nSSID=Dennis2860AP\nNetworkType=Infra\nWirelessMode=9\nChannel=0\nBeaconPeriod=100\nTxPower=100\nBGProtection=0\nTxPreamble=0\nRTSThreshold=2347\nFragThreshold=2346\nTxBurst=1\nWmmCapable=0\nAckPolicy=0;0;0;0\nAuthMode=OPEN\nEncrypType=NONE\nWPAPSK=\nDefaultKeyID=1\nKey1Type=0\nKey1Str=\nKey2Type=0\nKey2Str=\nKey3Type=0\nKey3Str=\nKey4Type=0\nKey4Str=\nPSMode=CAM\nFastRoaming=0\nRoamThreshold=70\nHT_RDG=1\nHT_EXTCHA=0\nHT_OpMode=1\nHT_MpduDensity=4\nHT_BW=1\nHT_AutoBA=1\nHT_BADecline=0\nHT_AMSDU=0\nHT_BAWinSize=64\nHT_GI=1\nHT_MCS=33\nHT_MIMOPSMode=3\nEthConvertMode=\nEthCloneMac=\nIEEE80211H=0\nTGnWifiTest=0\nWirelessEvent=0\nMeshId=MESH\nMeshAutoLink=1\nMeshAuthMode=OPEN\nMeshEncrypType=NONE\nMeshWPAKEY=\nMeshDefaultkey=1\nMeshWEPKEY=\nCarrierDetect=0\n\n-----------------------------------------------\n*NOTE:\n\tWMM parameters\n\t\t\tWmmCapable\t\t\tSet it as 1 to turn on WMM Qos support\t\t\t\t\n\t\t\tAckPolicy1~4\t\tAck policy which support normal Ack or no Ack\n\t\t\t\t\t\t\t\t(AC_BK, AC_BE, AC_VI, AC_VO)\t\t\n\t\n\tAll WMM parameters do not support iwpriv command but WmmCapable, \n\tplease store all parameter to RT2870STA.dat, and restart driver. \t\n\n-----------------------------------------------\nsyntax is 'Param'='Value' and describes below. \n\n@> CountryRegion=value                                 \n\tvalue\n\t\t0: use 1 ~ 11 Channel\n\t\t1: use 1 ~ 13 Channel\n\t\t2: use 10 ~ 11 Channel\n\t\t3: use 10 ~ 13 Channel\n\t\t4: use 14 Channel\n\t\t5: use 1 ~ 14 Channel\n\t\t6: use 3 ~ 9 Channel\n\t\t7: use 5 ~ 13 Channel\n\t   31: use 1 ~ 14 Channel (ch1-11:active scan, ch12-14 passive scan)\n   \t \t                                      \n@> CountryRegionABand=value      \t\t\t\t\t\t\t\n\tvalue\t\n\t\t0: use 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 Channel\n\t\t1: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 Channel\n\t\t2: use 36, 40, 44, 48, 52, 56, 60, 64 Channel\n\t\t3: use 52, 56, 60, 64, 149, 153, 157, 161 Channel\n\t\t4: use 149, 153, 157, 161, 165 Channel\n\t\t5: use 149, 153, 157, 161 Channel\n\t\t6: use 36, 40, 44, 48 Channel\n\t\t7: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 Channel\n\t\t8: use 52, 56, 60, 64 Channel\n\t\t9: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 Channel\n\t   10: use 36, 40, 44, 48, 149, 153, 157, 161, 165 Channel\n\t   11: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 Channel\n\n@> CountryCode=value\n\tvalue\n\t\tAG, AR, AW, AU, AT, BS, BB, BM, BR, BE, BG, CA, KY, CL, CN, CO, CR, CY, CZ, DK, DO, EC, SV, FI, FR, DE, \n\t\tGR, GU, GT, HT, HN, HK, HU, IS, IN, ID, IE, IL, IT, JP, JO, LV, LI, LT, LU, MY, MT, MA, MX, NL, NZ, NO,\n\t\tPE, PT, PL, RO, RU, SA, CS, SG, SK, SI, ZA, KR, ES, SE, CH, TW, TR, GB, UA, AE, US, VE\n\t\t\"\" => using default setting: 2.4 G - ch 1~11; 5G - ch 52~64, 100~140, 149~165\n                                                           \n@> SSID=value                \t\n\tvalue\n\t\t0~z, 1~32 ascii characters.\n                    \t\n@> WirelessMode=value\n\tvalue\t\n\t\t0: legacy 11b/g mixed \n\t\t1: legacy 11B only \n\t\t2: legacy 11A only         //Not support in RfIcType=1(id=RFIC_5225) and RfIcType=2(id=RFIC_5325)\n\t\t3: legacy 11a/b/g mixed     //Not support in RfIcType=1(id=RFIC_5225) and RfIcType=2(id=RFIC_5325)\n\t\t4: legacy 11G only\n\t\t5: 11ABGN mixed\n\t\t6: 11N only\n\t\t7: 11GN mixed\n\t\t8: 11AN mixed\n\t\t9: 11BGN mixed\n\t   10: 11AGN mixed\t\n                     \n@> Channel=value\n\tvalue\n\t\tdepends on CountryRegion or CountryRegionABand\n                    \t\n@> BGProtection=value\n\tvalue\n\t\t0: Auto \n\t\t1: Always on \n\t\t2: Always off\n                    \t\n@> TxPreamble=value\n  \tvalue\n\t\t0:Preamble Long\n\t\t1:Preamble Short \n\t\t2:Auto\n                    \t\n@> RTSThreshold=value\n\tvalue\n\t\t1~2347                                                       \n                    \t                                       \n@> FragThreshold=value\n\tvalue       \t\n\t\t256~2346\n                    \t\n@> TxBurst=value\n\tvalue\n\t\t0: Disable\n\t\t1: Enable\n\n@> NetworkType=value\t    \t\t\n\tvalue \n\t\tInfra: infrastructure mode\n       \tAdhoc: adhoc mode\n                                                                                                                                                        \t                                                          \n@> AuthMode=value\n\tvalue\n\t\tOPEN\t \tFor open system\t\n\t\tSHARED\t  \tFor shared key system\t\n\t\tWEPAUTO     Auto switch between OPEN and SHARED\n\t\tWPAPSK      For WPA pre-shared key  (Infra)\n\t\tWPA2PSK     For WPA2 pre-shared key (Infra)\n\t\tWPANONE\t\tFor WPA pre-shared key  (Adhoc)\n\t\tWPA         Use WPA-Supplicant\n\t\tWPA2        Use WPA-Supplicant\n\n@> EncrypType=value\n\tvalue\n\t\tNONE\t\tFor AuthMode=OPEN                    \n\t\tWEP\t\t\tFor AuthMode=OPEN or AuthMode=SHARED \n\t\tTKIP\t\tFor AuthMode=WPAPSK or WPA2PSK                    \n\t\tAES\t\t\tFor AuthMode=WPAPSK or WPA2PSK                     \n\t\t\n@> DefaultKeyID=value\n\tvalue\n\t\t1~4\n\n@> Key1=value\n    Key2=value\n    Key3=value\n    Key4=value\n\tvalue\n\t\t10 or 26 hexadecimal characters eg: 012345678\n        5 or 13 ascii characters eg: passd\n    (usage : \"iwpriv\" only)     \n\n@> Key1Type=vaule\n    Key2Type=value\n    Key3Type=vaule\n    Key4Type=vaule\n    value\n\t\t0   hexadecimal type\n\t\t1   assic type\n    (usage : reading profile only)\n\n@> Key1Str=value\n    Key2Str=value\n    Key3Str=vaule\n    Key4Str=vaule\n    value\n\t\t10 or 26 characters (key type=0)\n\t\t5 or 13 characters  (key type=1)\n    (usage : reading profile only)\t\n\n@> WPAPSK=value              \t\n\tvalue\n\t\t8~63 ASCII  \t\tor \n\t\t64 HEX characters\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                    \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n@> WmmCapable=value\n\tvalue\n\t\t0: Disable WMM\n\t\t1: Enable WMM\n        \n@> PSMode=value\n    value\n    \tCAM\t\t\t    Constantly Awake Mode\n\t\tMax_PSP\t\t    Max Power Savings\n\t\tFast_PSP\t\tPower Save Mode\n\n@> FastRoaming=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> RoamThreshold=value\n\tvalue\n\t\tPositive Interger(dBm)\n\n@> HT_RDG=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> HT_EXTCHA=value (Extended Channel Switch Announcement)\n\tvalue\n\t\t0\t\t\t\tBelow\n\t\t1 \t\t\t\tAbove\n\n@> HT_OpMode=value\n\tvalue\n\t\t0\t\t\t\tHT mixed format\n\t\t1\t\t\t\tHT greenfield format\n\n@> HT_MpduDensity=value\n\tvalue (based on 802.11n D2.0)\n\t\t0: no restriction\n\t\t1: 1/4 gs\n\t\t2: 1/2 gs\n\t\t3: 1 gs\n\t\t4: 2 gs\n\t\t5: 4 gs\n\t\t6: 8 gs\n\t\t7: 16 gs\n\n@> HT_BW=value\n\tvalue\n\t\t0\t\t\t\t20MHz\n\t\t1\t\t\t\t40MHz\n\n@> HT_AutoBA=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> HT_BADecline\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t    Enabled <Reject BA request from AP>\n\n@> HT_AMSDU=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> HT_BAWinSize=value\n\tvalue\n\t\t1 ~ 64\n\n@> HT_GI=value\n\tvalue\n\t\t0\t\t\t\tlong GI\n\t\t1\t\t\t\tshort GI\n\n@> HT_MCS=value\n\tvalue\n\t\t0 ~ 15\n\t\t33: auto\n\n@> HT_MIMOPSMode=value\n\tvalue (based on 802.11n D2.0)\n\t\t0\t\t\t\tStatic SM Power Save Mode\n\t\t1\t\t\t\tDynamic SM Power Save Mode\n\t\t2\t\t\t\tReserved\n\t\t3\t\t\t\tSM enabled\n\t(not fully support yet)\n\n@> EthConvertMode=value\n\tvalue\n\t\tdongle\n\t\tclone\n\t\thybrid\n\n@> EthCloneMac=value\n\tvalue\n\t\txx:xx:xx:xx:xx:xx\n\n@> IEEE80211H=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> TGnWifiTest=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> WirelessEvent=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled <send custom wireless event>\n\t    \n@> MeshId=value\n\tvalue\n\t\tLength 1~32 ascii characters\n\n@> MeshAutoLink=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\n@> MeshAuthMode=value\n\tvalue\n\t\tOPEN\t \tFor open system\t\n\t\tWPANONE\t\tFor WPA pre-shared key  (Adhoc)\n\n@> MeshEncrypType=value\n\tvalue\n\t\tNONE\t\tFor MeshAuthMode=OPEN                    \n\t\tWEP\t\t\tFor MeshAuthMode=OPEN\n\t\tTKIP\t\tFor MeshAuthMode=WPANONE\n\t\tAES\t\t\tFor MeshAuthMode=WPANONE\n\n@> MeshWPAKEY=value\n\tvalue\n\t\t8~63 ASCII  \t\tor \n\t\t64 HEX characters\n\n@> MeshDefaultkey=value\n\tvalue\n\t\t1~4\n\n@> MeshWEPKEY=value\n\tvalue\n\t\t10 or 26 characters\n\t\t5 or 13 characters\n\n@> CarrierDetect=value\n\tvalue\n\t\t0\t\t\t\tDisabled\n\t\t1\t\t\t\tEnabled\n\nMORE INFORMATION\n=================================================================================\nIf you want for rt2870 driver to auto-load at boot time:\nA) choose ra0 for first RT2870 WLAN card, ra1 for second RT2870 WLAN card, etc.\n   \nB) create(edit) 'ifcfg-ra0' file in /etc/sysconfig/network-scripts/,      \n   edit( or add the line) in /etc/modules.conf:\n       alias ra0 rt2870sta\n   \nC) edit(create) the file /etc/sysconfig/network-scripts/ifcfg-ra0  \n   DEVICE='ra0'\n   ONBOOT='yes'     \n\n\nNOTE:\n   if you use dhcp, add this line too .\n    BOOTPROTO='dhcp'\n\n*D) To ease the Default Gateway setting, \n    add the line\n    GATEWAY=x.x.x.x   \n    in /etc/sysconfig/network\n   \n=======================================================================\nDongle/Clone Features:\n======================\nA) Dongle mode: \n   \tProvides a 1-to-N MAC address mapping mechanism such that more than one PC behind the STA \n   \tcan transparently connect to the AP.\n\nB) Clone mode:\n\tProvides a 1-to-1 MAC address mapping mechanism. \n\tSTA can use own MAC as SA MAC or \n\t\t\tuse user desired MAC as SA MAC or\n\t\t    use source MAC of first packet coming from wired device as SA MAC.\n\tNOTE: In this mode, only the PC who own the specified MAC can connect to the AP.\n\n \nC) Hybrid mode(Dongle+Clone):\n\tProvides a 1-to-N MAC address mapping mechanism such that more than one PC behind the STA \n   \tcan transparently connect to the AP.\n\tSTA can use own MAC as SA MAC or \n\t\t\tuse user desired MAC as SA MAC or\n\t\t    use source MAC of first packet coming from wired device as SA MAC.\n\nD) Please refer to \"Config STA to link as dongle mode...\" in iwpriv_usage.txt for releated commands."
  },
  {
    "path": "doc/ReadMe.txt",
    "content": "[2013-03-13]\nVersion 3.0.0.3\n1. Fix Single-Sku and TSSI bug.\n2. Support Multi-Channel feature.\n3. Change ATELDE2PFROMBUF command to bufferWriteBack.\n4. Support bufferLoadFromEfuse command to force enter buffer mode.\n5. Support ATECALFREEINFO command to get calibration free info.\n6. Support fast scan when ra0 or p2p0 is connected\n7. Move IdleTimeout and StationKeepAlive profiles out to be supported in STA mode.\n8. Fix P2P EAPOL packet using 1Mbps rate problem\n9. Support wpa_cli p2p persistent group cmds\n10. Fix ATE bug.\n11. Fix bug when read channel power and BW delta power.\n12. Fix crash issue in some platform when interface down.\n13. Support HW PBC.\n14. Fix bug in RTMP_TimerListRelease().\n15. Support Xtal freuency offset compersation.\n16. Update firmware to V1.5\n\n[2013-01-23]\nVersion 3.0.0.2\n1. Update firmware to V1.3\n2. Add software protect for PLL lock.\n3. Support new WOWLAN.\n4. Fix p2p sigma 4.2.2(Version 5.0) fail.\n5. Fix frequency tracking bug.\n6. Fix ATELDE2P cannot work.\n7. Fix scan in 802.11 power saving cause dead lock.\n8. Update SINGLE_SKU_V2.\n9. Support ATETEMP.\n10. Support ch14 CCK OBW.\n11. Fix p2p sigma test fail issue.\n12. Support Calibration free and ATELDE2PFROMBUF.\n13. Update VCO calibration procedure.\n14. Fix temperature calibration bug at low temp.\n15. Check DMA done bit while load FW.\n16. Fix WirelessMode=5 cannot connect to 11n only AP.\n17. Support iwpriv ra0 set ATETSSIDC=1 command\n\n[2012-11-30]\nVersion 3.0.0.1\n1. Change text type to UNIX.\n2. Fixed OS_ABL support crash at Kernel 2.6.32.\n3. Fixed ATELDE2P=1 crash.\n4. Update frequency tracking thresholds.\n5. Update firmware to beta 0.4\n6. Update RF CR to 10121122.\n7. Fixed BulkInCmdRspEvent may submit multiple bulk-in urb.\n8. Support ATE feature.\n9. Fixed wps fail with external registrar.\n10. Support Miracast.\n\n[2012-11-15]\nVersion 3.0.0.0\n1. Support suspend/resume.\n2. Support 802.11 power saving.\n3. Support P2P.\n4. Support antenna diversity.\n5. Support microwave oven detection.\n\n[2012-10-19]\nVersion 3.0.0.0-Beta7\n1. MT7601STA initial version.\n2. Support RX_CSO.\n3. Support header translation.\n\n"
  },
  {
    "path": "doc/iwpriv_usage.txt",
    "content": "iwpriv\n=================\nThis is detailed explanation of each parameters for iwpriv.\nBefore reading this document, make sure you already read README.\n\n-------------------------------------------------------------------------------------------------------\nUSAGE:\n\tiwpriv ra0 commands val\n\nNOTE:\n\tWireless Extension Private Handlers\n\nwhere\n[commands]              [val] \n\t\t\t\t\t\t{range}\n-----------------   \t-------------------------------------------------\nwsc_conf_mode\t\t\t{0, 1, 2}\n\t\t\t\t\t\t::Set WPS conf mode\n\t\t\t\t\t\t0: WPS Disabled\n\t\t\t\t\t\t1: Enrollee\n\t\t\t\t\t\t2: Registrar\n\nwsc_mode\t\t\t\t{1, 2}\n\t\t\t\t\t\t::PIN or PBC\n\t\t\t\t\t\t1: PIN\n\t\t\t\t\t\t2: PBC\n\nwsc_pin\t\t\t\t\t{00000000 ~ 99999999}\n\t\t\t\t\t\t::Set Enrollee's PIN Code\n\nwsc_ssid\t\t\t\t{0~z, 1~32 ascii characters}\n\t\t\t\t\t\t::Set WPS AP SSID\n\nwsc_start\t\t\t\tNULL\n\t\t\t\t\t\t::Trigger RT2860 STA driver to do WPS process\n\nwsc_stop\t\t\t\tNULL\n\t\t\t\t\t\t::Stop WPS process\n\nwsc_gen_pincode\t\t\tNULL\n\t\t\t\t\t\t::Generate new PIN code\n\nwsc_cred_count\t\t\t{1 ~ 8}\n\t\t\t\t\t\t::Set count of WPS credential\n\nwsc_cred_ssid\t\t\t{\"idx ssid_str\"}\n\t\t\t\t\t\t::Set SSID into credtentail[idx]\n\t\t\t\t\t\tidx: 0 ~ 7\n\t\t\t\t\t\tssid_str: 0~z, 1~32 ascii characters\n\nwsc_cred_auth\t\t\t{\"idx auth_str\"}\n\t\t\t\t\t\t::Set AuthMode into credtentail[idx]\n\t\t\t\t\t\tidx: 0 ~ 7\n\t\t\t\t\t\tauth_str: OPEN, WPAPSK, WPA2PSK, SHARED, WPA, WPA2\n\nwsc_cred_encr\t\t\t{\"idx encr_str\"}\n\t\t\t\t\t\t::Set EncrypType into credtentail[idx]\n\t\t\t\t\t\tidx: 0 ~ 7\n\t\t\t\t \t\tencr_str: NONE, WEP, TKIP, AES\n\nwsc_cred_keyIdx\t\t\t{\"idx key_index\"}\n\t\t\t\t\t\t::Set Key Index into credtentail[idx]\n\t\t\t\t\t\tidx: 0 ~ 7\n\t\t\t\t\t\tkey_index: 1 ~ 4\n\nwsc_cred_key\t\t\t{\"idx key\"}\n\t\t\t\t\t\t::Set Key into credtentail[idx]\n\t\t\t\t\t\tidx: 0 ~ 7\n\t\t\t\t\t\tkey: ASCII string (wep_key_len(=5,13), passphrase_len(=8~63)) \n\t\t\t\t\t  \t\t OR \n\t\t\t\t\t  \t\t Hex string (wep_key_len(=10,26), passphrase_len(=64))\n\nwsc_cred_mac\t\t\t{\"idx mac_str\"}\n\t\t\t\t\t\t::Set AP's MAC into credtentail[idx]\n\t\t\t\t\t\tidx: 0 ~ 7\n\t\t\t\t\t\tmac_str: xx:xx:xx:xx:xx:xx\n\nwsc_conn_by_idx\t\t\t{0 ~ 7}\n\t\t\t\t\t\t::Connect AP by credential index\n\nwsc_auto_conn\t\t\t{0, 1}\n\t\t\t\t\t\t::Set driver to re-connecting to AP or not after registration.\n\t\t\t\t\t\t0: Disabled, driver won't re-connect to AP with new configurations.\n\t\t\t\t\t\t1: Enabled, driver will re-connect to AP with new configurations.\n\nwsc_ap_band \t\t\t{0, 1, 2}\n\t\t\t\t\t\t::Set prefer band to do WPS with dual band WPS AP\n\t\t\t\t\t\t0 : prefer 2.4G\n\t\t\t\t\t\t1 : prefer 5G\n\t\t\t\t\t\t2 : auto\n\t\t\t\t\t\tDefault value is auto (2)\n\n-------------------------------------------------------------------------------------------------------\nUSAGE:\n\tiwpriv ra0 set [parameters]=[val]\n\t\nNOTE:\n\tExecute one iwpriv/set command simultaneously.\n\t\nwhere\t\t\n[parameters]        \t[val] \n\t\t\t\t\t\t{range}\n-----------------   \t-------------------------------------------------\nCountryRegion       \t{0~7}\n\t\t\t\t\t\t::Set country region                                   \t\n\t\t\t\t\t\t0: 1 ~ 11 ch\n\t\t\t\t\t\t1: 1 ~ 13 ch\n\t\t\t\t\t\t2: 10, 11 ch\n\t\t\t\t\t\t3: 10 ~ 13 ch\n\t\t\t\t\t\t4: 14 ch\n\t\t\t\t\t\t5: 1 ~ 14 ch\n\t\t\t\t\t\t6: 3 ~ 9 ch\n\t\t\t\t\t\t7: 5 ~ 13 ch\n\t\t\t\t\t   31: 1 ~ 14 ch (ch1-11:active scan, ch12-14 passive scan)\n\t\t\t\t\t\t\t\t\t\t\t\nCountryRegionABand\t\t{0~11}\n\t\t\t\t\t\t::Set country region for A band  \t\t\t\t\t\t\t\t\t\t                                       \n       \t\t\t\t\t0: 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 ch\n\t\t\t\t\t\t1: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 ch\n\t\t\t\t\t\t2: 36, 40, 44, 48, 52, 56, 60, 64 ch\n\t\t\t\t\t\t3: 52, 56, 60, 64, 149, 153, 157, 161 ch\n\t\t\t\t\t\t4: 149, 153, 157, 161, 165 ch\n\t\t\t\t\t\t5: 149, 153, 157, 161 ch\n\t\t\t\t\t\t6: 36, 40, 44, 48 ch\n\t\t\t\t\t\t7: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 ch\n\t\t\t\t\t\t8: 52, 56, 60, 64 ch\n\t\t\t\t\t\t9: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 ch\n\t\t\t\t\t   10: 36, 40, 44, 48, 149, 153, 157, 161, 165 ch\n\t\t\t\t\t   11: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 ch\n                                                           \nSSID                \t{0~z, 1~32 ascii characters} \t\t\t\n                    \t::Set AP SSID\n                    \t\nWirelessMode        \t{0~10}\n\t\t\t\t\t\t::Set Wireless Mode\t\t\t\t\t\t\t\t \n                    \t0: legacy 11b/g mixed \n\t\t\t\t\t\t1: legacy 11B only \n\t\t\t\t\t\t2: legacy 11A only\n\t\t\t\t\t\t3: legacy 11a/b/g mixed\n\t\t\t\t\t\t4: legacy 11G only\n\t\t\t\t\t\t5: 11ABGN mixed\n\t\t\t\t\t\t6: 11N only\n\t\t\t\t\t\t7: 11GN mixed\n\t\t\t\t\t\t8: 11AN mixed\n\t\t\t\t\t\t9: 11BGN mixed\n\t   \t\t\t\t   10: 11AGN mixed\t\n                    \t\nChannel             \tdepends on CountryRegion or CountryRegionForABand\n                        ::Set Channel\n                    \t\nBGProtection        \t{0~2}\n\t\t\t\t\t\t::Set 11B/11G Protection                                   \t\n                   \t\t0:Auto, \n                   \t\t1:Always on, \n                   \t\t2:Always off\n                    \t\nTxPreamble          \t{0~2}\n\t\t\t\t\t\t::Set TxPreamble\n                    \t0:Preamble Long, \n                    \t1:Preamble Short, \n                    \t2:Auto\n                    \t\nRTSThreshold        \t{1~2347}                               \t                                                           \n                    \t::Set RTS Threshold\n                    \t                                       \nFragThreshold       \t{256~2346}\n\t\t\t\t\t\t::Set Fragment Threshold                             \t\n                    \t\nTxBurst             \t{0,1}\n\t\t\t\t\t\t::Set TxBurst Enable or Disable                                  \t\n                  \t\t0:Disable, \n                  \t\t1:Enable\n\nNetworkType\t    \t\t{Infra,Adhoc}\n    \t\t\t\t\t::Set Network type\n    \t\t\t\t\t \t\t\t\t\t\t\t\t\t                                                                                                                                                        \t                                                          \nAuthMode            \t{OPEN,SHARED,WEPAUTO,WPAPSK,WPA2PSK,WPANONE}\n                        ::Set Authentication Mode \t\n\nEncrypType          \t{NONE,WEP,TKIP,AES}          \t\t\t\n\t\t\t\t\t\t::Set Encryption Type\n\t\t\t\t\t\t \nDefaultKeyID        \t{1~4}                              \t\t\n\t\t\t\t\t\t::Set Default Key ID\n\t\t\t\t\t\t\n\t\t\t\t\t\t\nKey1                 \t{5 ascii characters or 10 hex number or \n                     \t13 ascii characters or 26 hex numbers}\n                     \t::Set Key1 String                                                                                                                        \n\nKey2                 \t{5 ascii characters or 10 hex number or \n                     \t13 ascii characters or 26 hex numbers}                                                                                                                        \n                      \t::Set Key2 String\n                      \t           \t\nKey3                 \t{5 ascii characters or 10 hex number or \n                     \t13 ascii characters or 26 hex numbers}                                                                                                                        \n\t\t\t\t\t\t::Set Key3 String\n\t\t\t\t\t\t \nKey4                 \t{5 ascii characters or 10 hex number or \n                     \t13 ascii characters or 26 hex numbers}                                                                                                                        \n                        ::Set Key4 String\n                                                        \nWPAPSK              \t{8~63 ascii or 64 hex characters} \t\t \n\t\t\t\t\t\t::WPA Pre-Shared Key\n                    \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\nWmmCapable\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set WMM Capable\n\t\t\t\t\t\t0:Disable WMM, \n\t\t\t\t\t\t1:Enable WMM\n\nPSMode\t\t\t\t\t{CAM, MAX_PSP, FAST_PSP}\n\t\t\t\t\t\t::Set Power Saving Mode\n\nHtBw\t\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set BandWidth\n\t\t\t\t\t\t0: 20Hz\n\t\t\t\t\t\t1: 40Hz\n\nHtMcs\t\t\t\t\t{0 ~ 15, 33}\n\t\t\t\t\t\t::Set MCS\n\t\t\t\t\t\t33: Auto Rate\n\nHtGi\t\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set Guard Interval(GI)\n\t\t\t\t\t\t0: long GI\n\t\t\t\t\t\t1: short GI\n\nHtOpMode\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set HT Operation Mode\n\t\t\t\t\t\t0: HT mixed format\n\t\t\t\t\t\t1: HT greenfield format\n\nHtExtcha\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set Extended Channel Switch Announcement\n\t\t\t\t\t\t0: Below\n\t\t\t\t\t\t1: Above\n\nHtMpduDensity\t\t\t{0 ~ 7}\n\t\t\t\t\t\t::Set The Minimum Time Between MPDUs within an AMPDU\n\nHtBaWinSize\t\t\t\t{1 ~ 64}\n\t\t\t\t\t\t::Set BA WinSize\n\nHtRdg\t\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set RDG Capable\n\t\t\t\t\t\t0: Disabled\n\t\t\t\t\t\t1: Enabled\n\nHtAmsdu\t\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set AMSDU Capable\n\t\t\t\t\t\t0: Disabled\n\t\t\t\t\t\t1: Enabled\n\nHtAutoBa\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set Auto BA Capable\n\t\t\t\t\t\t0: Disabled\n\t\t\t\t\t\t1: Enabled\n\nHtBaDecline\t\t\t\t{0,1}\n\t\t\t\t\t\t::Reject BA request from AP\n\t\t\t\t\t\t0: Disabled\n\t\t\t\t\t\t1: Enabled\n\nHtProtect\t\t\t\t{0,1}\n\t\t\t\t\t\t::Set HT Protect Capable\n\t\t\t\t\t\t0: Disabled\n\t\t\t\t\t\t1: Enabled\n\nFixedTxMode\t\t\t\t{CCK, OFDM}\n\t\t\t\t\t\t:: Set Fixed Tx Mode for fixed rate setting\n\t\t\t\t\t\tMode = CCK\n\t\t\t\t\t\tMCS = 0\t\t=> 1Mbps\n\t\t\t\t\t\t\t= 1\t\t=> 2Mbps\n\t\t\t\t\t\t\t= 2\t\t=> 5.5 Mbps\n\t\t\t\t\t\t\t= 3\t\t=> 11 Mbps\n\t\t\t\t\t\tMode = OFDM\n\t\t\t\t\t\tMCS = 0\t\t=> 6Mbps\n\t\t\t\t\t\t \t= 1\t\t=> 9Mbps\n\t\t\t\t\t\t\t= 2\t\t=> 12Mbps\n\t\t\t\t\t\t\t= 3\t\t=> 18Mbps\n\t\t\t\t\t\t\t= 4\t\t=> 24Mbps\n\t\t\t\t\t\t\t= 5\t\t=> 36Mbps\n\t\t\t\t\t\t\t= 6\t\t=> 48Mbps\n\t\t\t\t\t\t\t= 7\t\t=> 54Mbps\n\n==> Build Ethernet Convert function. Please set 'HAS_ETH_CONVERT_SUPPORT=y' in os/linux/config.mk\nEthConvertMode\t\t\t{dongle, clone, hybrid}\n\t\t\t\t\t\t::Set Ethernet Convert Mode\n\nEthCloneMac\t\t\t\t{xx:xx:xx:xx:xx:xx}\n\t\t\t\t\t\t:: Set Clone MAC\n\nLongRetry\t\t\t\t{0,255}\n\t\t\t\t\t\t:: Set Tx Long Retry Limit\n\nShortRetry\t\t\t\t{0,255}\n\t\t\t\t\t\t:: Set Tx Short Retry Limit\n\nMeshId\t\t\t\t\t{Length 1~32 ascii characters}\n\t\t\t\t\t\t:: Set Mesh ID\n\nMeshHostName\t\t\t{Length 1~32 ascii characters}\n\t\t\t\t\t\t:: Set Mesh Host Name\n\nMeshAutoLink\t\t\t{1,0}\n\t\t\t\t\t\t:: Set Mesh Auto Link Capable\n\t\t\t\t\t\t0: Disabled\n\t\t\t\t\t\t1: Enabled\n\nMeshAddLink\t\t\t\t{xx:xx:xx:xx:xx:xx}\n\t\t\t\t\t\t:: Add Mesh Link\n\nMeshDelLink\t\t\t\t{xx:xx:xx:xx:xx:xx}\n\t\t\t\t\t\t:: Delete Mesh Link\n\nMeshMultiCastAgeOut\t\t{20 ~ 65535 seconds}\n\t\t\t\t\t\t:: Set AgeOut time for Mesh MultiCast\n\nMeshAuthMode\t\t\t{OPEN, WPANONE}\n\t\t\t\t\t\t:: Set Mesh Authentication Mode\n\nMeshEncrypType\t\t\t{NONE, WEP, TKIP, AES}\n\t\t\t\t\t\t:: Set Mesh Encryption Type\n\nMeshDefaultkey\t\t\t{1 ~ 4}\n\t\t\t\t\t\t:: Set Mesh Default Key ID\n\nMeshWEPKEY\t\t\t\t{5 ascii characters or 10 hex number or \n                     \t13 ascii characters or 26 hex numbers}\n                     \t:: Set Mesh WEP Key String\n\nMeshWPAKEY\t\t\t\t{8~63 ascii or 64 hex characters}\n\t\t\t\t\t\t:: Set Mesh WPA Pre-Shared Key\n\nExamples\n===================================================================\n-------------------------------------------------------------------------------------------------------\na> Config STA to link with AP which is OPEN/NONE(Authentication/Encryption)\n\t1. iwpriv ra0 set NetworkType=Infra\n\t2. iwpriv ra0 set AuthMode=OPEN\n\t3. iwpriv ra0 set EncrypType=NONE\n\t4. iwpriv ra0 set SSID=\"AP's SSID\"\n\t\nb> Config STA to link with AP which is SHARED/WEP(Authentication/Encryption)\n\t1. iwpriv ra0 set NetworkType=Infra\n\t2. iwpriv ra0 set AuthMode=SHARED\n\t3. iwpriv ra0 set EncrypType=WEP\n\t4. iwpriv ra0 set DefaultKeyID=1\n\t5. iwpriv ra0 set Key1=\"AP's wep key\"\n\t6. iwpriv ra0 set SSID=\"AP's SSID\"\n\t\nc> Config STA to link with AP which is WPAPSK/TKIP(Authentication/Encryption)\n\t1. iwpriv ra0 set NetworkType=Infra\n\t2. iwpriv ra0 set AuthMode=WPAPSK\n\t3. iwpriv ra0 set EncrypType=TKIP\n\t4. iwpriv ra0 set SSID=\"AP's SSID\"\n\t5. iwpriv ra0 set WPAPSK=\"AP's wpa-preshared key\"\n\t6. iwpriv ra0 set SSID=\"AP's SSID\"\n\t\nd> Config STA to link with AP which is WPAPSK/AES(Authentication/Encryption)\n\t1. iwpriv ra0 set NetworkType=Infra\n\t2. iwpriv ra0 set AuthMode=WPAPSK\n\t3. iwpriv ra0 set EncrypType=AES\n\t4. iwpriv ra0 set SSID=\"AP's SSID\"\n\t5. iwpriv ra0 set WPAPSK=\"AP's wpa-preshared key\"\n\t6. iwpriv ra0 set SSID=\"AP's SSID\"\n\ne> Config STA to link with AP which is WPA2PSK/TKIP(Authentication/Encryption)\n\t1. iwpriv ra0 set NetworkType=Infra\n\t2. iwpriv ra0 set AuthMode=WPA2PSK\n\t3. iwpriv ra0 set EncrypType=TKIP\n\t4. iwpriv ra0 set SSID=\"AP's SSID\"\n\t5. iwpriv ra0 set WPAPSK=12345678\n\t6. iwpriv ra0 set SSID=\"AP's SSID\"\n\t\nf> Config STA to create/link as adhoc mode, which is OPEN/NONE(Authentication/Encryption)\n\t1. iwpriv ra0 set NetworkType=Adhoc\n\t2. iwpriv ra0 set AuthMode=OPEN\n\t3. iwpriv ra0 set EncrypType=NONE\n\t4. iwpriv ra0 set SSID=\"Adhoc's SSID\"\n\ng>  Config STA to create/link as adhoc mode, which is WPANONE/TKIP(Authentication/Encryption)\n    1. iwpriv ra0 set NetworkType=Adhoc\n\t2. iwpriv ra0 set AuthMode=WPANONE\n\t3. iwpriv ra0 set EncrypType=TKIP\n\t4. iwpriv ra0 set SSID=\"AP's SSID\"\n\t5. iwpriv ra0 set WPAPSK=12345678\n\t6. iwpriv ra0 set SSID=\"AP's SSID\"\n  \nh> Get site survey \n\tusage: iwpriv ra0 get_site_survey\n\t\t\ni> Get Statistics \n\tusage: iwpriv ra0 stat\t\t\t\t\t\t; read statistic counter\n\t\t   iwpriv ra0 set ResetCounter=0\t\t; reset statistic counter\n\nj> Link with an AP which is the largest strength   ; set ANY SSID (ssidLen=0)\n   usage: iwconfig ra0 essid \"\"                 \n   or\n   usage: iwpriv ra0 set SSID=\"\"\n\nk> Config STA to link as dongle mode with STA own MAC\n\tusage: iwpriv ra0 set EthConvertMode=dongle\n\nl> Config STA to link as clone mode\n\tusage: iwpriv ra0 set EthConvertMode=clone\n\t\t   iwpriv ra0 set EthCloneMac=\"Desired MAC\"\t\t;; 00:00:00:00:00:00 means using STA own MAC\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t;; FF:FF:FF:FF:FF:FF means using source MAC of first packet coming from wired device\n\nm> Config STA to link as hybrid(dongle+clone) mode\n\tusage: iwpriv ra0 set EthConvertMode=hybrid\n\t\t   iwpriv ra0 set EthCloneMac=\"Desired MAC\"\t\t;; 00:00:00:00:00:00 means using STA own MAC\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t;; FF:FF:FF:FF:FF:FF means using source MAC of first packet coming from wired device\n\n===================================================================\n\niwlist\n=================\nThis is detailed explanation of each parameters for iwlist.\n\n-------------------------------------------------------------------------------------------------------\niwlist ra0 scanning\t\t; list the results after scanning(manual rescan)\n\n\n\n=======================================================================================================\n\niwconfig\n=================\nThe following are our support in standard configuration - iwconfig\n\n-------------------------------------------------------------------------------------------------------\niwconfig ra0 essid {NN|on|off}\t\t\t; set essid\niwconfig ra0 mode {managed|ad-hoc|...}  ; set wireless mode\n>> rt2860sta driver support monitor mode with linux kernel > 2.4.20.\n>> Note: For using monitor mode => if mesh interface is ON, please down the mesh interface first.\niwconfig ra0 freq N.NNNN[k|M|G]]\t\t; set frequency\niwconfig ra0 channel N\t\t\t\t\t; set channel\niwconfig ra0 ap {N|off|auto}\t\t\t; set AP address\niwconfig ra0 nick N\t\t\t\t\t\t; set nickname\niwconfig ra0 rate {N|auto|fixed}     \t; set rate (only support legacy rate setting)\niwconfig ra0 rts {N|auto|fixed|off}\t\t; set RTS threshold\niwconfig ra0 frag {N|auto|fixed|off}\t; set Fragment threshold\niwconfig ra0 enc {NNNN-NNNN|off}\t\t; set encryption type\niwconfig ra0 power {period N|timeout N}\t; set power management modes\n\n*** Wireless extension usage please refer to man page of 'iwconfig', 'iwlist' and 'iwpriv'. ***\n"
  },
  {
    "path": "doc/sta_ate_iwpriv_usage.txt",
    "content": "===================================================================================================\nATE Test Command Format for station driver\n\n****** IMPORTANT ******\nIf you are not familiar with hardware, it is recommanded not to modify hardware default value.\nIt may damage hardware.\n\n===================================================================================================\nUsage:\n\tiwpriv ra0 [act] [parameters]=[val]\n\n\nwhere\n\n[act]\t[parameters] \t[val] constraints\t\texplaination\n-----\t------------- \t-----------------    \t--------------------------------\n\n=====================================\n1. Set ATE actions.\n\tValue:\n\t\tATESTART\t- Start ATE function and stop station function.\n\t\tATESTOP\t\t- Stop ATE function and start station function.\n\t\tTXCONT\t\t- Start continuous TX, for power mask.\n\t\tTXCARR\t\t- Start carrier test, for frequency calibration.\n\t\tTXFRAME\t\t- Transmit frame, for EVM.\n\t\tRXFRAME\t\t- Continuous RX, for PER/FER.\n\t\t\n1.1 ATEDA\n\t\tSet ATE frame header destination address.\n\tValue:\n\t\txx:xx:xx:xx:xx:xx\t; hex\n\n1.2 ATESA\t\t    \n\t\tSet ATE frame header source addr.\n\tValue:\n\t\txx:xx:xx:xx:xx:xx\t; hex\n\n1.3 ATEBSSID\t    \n\t\tSet ATE frame header BSSID.\n\tValue:\n\t\txx:xx:xx:xx:xx:xx\t; hex\n\n1.4 ATECHANNEL\t    \n\t\tSet ATE Channel, deimal.\n\tValue:\n\t\t802.11b/g: 1 ~ 14 depends on CountryRegion setting\n\n1.5 ATETXPOW0\n\t\tSet ATE Tx power for Antenna 1.\n\tValue:\n\t\t0 ~ 31\t\t\t; 2.4GHz, deimal\n\t\t-7 ~15\t\t\t; 5.5GHz, deimal\n\n1.6 ATETXPOW1\n\t\tSet ATE Tx power for Antenna 2.\n\tValue:\n\t\t0 ~ 31\t\t\t; 2.4GHz, decimal\n\t\t-7 ~15\t\t\t; 5.5GHz, deimal\n\n1.7 ATETXFREQOFFSET\t    \n\t\tSet ATE RF frequency offset.\n\tValue:\n\t\t0 ~ 63\t\t\t; unit: 2KHz, decimal\n\n1.8 ATETXLEN\t    \n\t\tSet ATE frame length.\n\tValue:\n\t\t24 ~ 2312\t\t\t; decimal\n\n1.9 ATETXCNT\t    \n\t\tSet ATE frame Tx count.\n\tValue:\n\t\t1 ~\t\t\t\t; 32-bit, decimal\n\n1.10 ATETXMODE (Refer to TxMode)\n\t\tSet ATE Tx Mode.\n\tValue:\n\t\t0: \tCCK\t\t\t802.11b\n\t\t1: \tOFDM\t\t        802.11g\n\t\t2: \tHT_MIX \t\t        802.11b/g/n\n\t\t3: \tGreen Field\t\t802.11n\n\n1.11 ATETXBW (Refer to TxMode)\n\t\tSet ATE Tx and Rx Bandwidth.\n\tValue:\n\t\t0: \t20MHz\n\t\t1: \t40MHz\n\n1.12 ATETXGI (Refer to TxMode) \n\t\tSet ATE Tx Guard Interval.\n\tValue:\n\t\t0: \tLong \n\t\t1: \tShort\n\n1.13 ATETXMCS (Refer to TxMode)\n\t\tSet ATE Tx MCS type.\n\tValue:\n\t\t0 ~ 15\n\n1.14 ATETXANT\t    \n\t\tSet ATE TX antenna.\n\tValue:\n\t\t0: \tAll\n\t\t1: \tAntenna one\n\t\t2: \tAntenna two\n\n1.15 ATERXANT\n\t\tSet ATE RX antenna.\n\tValue:\n\t\t0: \tAll\n\t\t1: \tAntenna one\n\t\t2: \tAntenna two \n\t\t3: \tAntenna three\n\n1.16 ATERXFER\t    \n\t\tSet ATE to periodically reset and show up RxCount (per-second) and RxTotalCount.\n\tValue:\n\t\t0: \tDisable counter visability\n\t\t1: \tEnable counter visability\n\n1.17 ATESHOW\t    \n\t\tShow all parameters of ATE.\n\tValue:\n\t\t1\n\n1.18 ATEHELP\n\t\tList all commands of ATE.\n\tValue:\n\t\t1\n\n1.19 ResetCounter\n\t\tReset statistic counter.\n\tValue:\n\t\t1\n\n1.20 ATERRF\n\t\tRead all of the RF registers.\n\tValue:\n\t\t1\n\n1.21 ATEWRF1\n\t\tWrite the RF register 1.\n\tValue:\n\t\txxxxxxxx          ;32-bit, hex\n\n1.22 ATEWRF2\n\t\tWrite the RF register 2.\n\tValue:\n\t\txxxxxxxx          ;32-bit, hex\n\n1.23 ATEWRF3\n\t\tWrite the RF register 3.\n\tValue:\n\t\txxxxxxxx          ;32-bit, hex\n\n1.24 ATEWRF4\n\t\tWrite the RF register 4.\n\tValue:\n\t\txxxxxxxx          ;32-bit, hex\n\n1.25 ATELDE2P\n\t\tOverwrite all EEPROM contents\n\tValue:\n\t\t1\n\tE.g.\n\t\tiwpriv ra0 set ATELDE2P=1\n\n1.26 ATERE2P\n\t\tDisplay all EEPROM content.\n\tValue:\n\t\t1\n\tE.g.\n\t\tiwpriv ra0 set ATERE2P=1\n\n===================================================================================================\n2. Examples:\n=========\n\n2.1 Check EVM & Power\n\t\tiwpriv ra0 set ATE=ATESTART\n\t\tiwpriv ra0 set ATEDA=00:11:22:33:44:55\n\t\tiwpriv ra0 set ATESA=00:aa:bb:cc:dd:ee\n\t\tiwpriv ra0 set ATEBSSID=00:11:22:33:44:55\n\t\tiwpriv ra0 set ATECHANNEL=1\t\t\t; set Channel\n\t\tiwpriv ra0 set ATETXMODE=1\t\t\t; set TX-Mode.\n\t\tiwpriv ra0 set ATETXMCS=7\t\t\t; set MCS type.\n\t\tiwpriv ra0 set ATETXBW=0\t\t\t; set Bandwidth\n\t\tiwpriv ra0 set ATETXGI=0\t\t\t; set Long GI.\n\t\tiwpriv ra0 set ATETXLEN=1024\t\t        ; set packet length.\n\t\tiwpriv ra0 set ATETXPOW0=18\n\t\tiwpriv ra0 set ATETXPOW1=18\n\t\tiwpriv ra0 set ATETXCNT=100000\n\t\tiwpriv ra0 set ATE=TXFRAME\n\t\tK\n\t\tiwpriv ra0 set ATETXPOW0=19\n\t\tK\n\t\tiwpriv ra0 set ATETXPOW0=20\n\t\tK\n\t\tiwpriv ra0 set ATE=ATESTART\n\n2.2 Check Carrier\n\t\tiwpriv ra0 set ATE=ATESTART\n\t\tiwpriv ra0 set ATECHANNEL=1\t\t\t; set Channel\n\t\tiwpriv ra0 set ATETXMODE=1\t\t\t; set TX-Mode.\n\t\tiwpriv ra0 set ATETXMCS=7\t\t\t; set MCS type.\n\t\tiwpriv ra0 set ATETXBW=0\t\t\t; set Bandwidth\n\t\tiwpriv ra0 set ATETXCNT=200\t\t\t; Tx frame count(decmial)\n\t\tiwpriv ra0 set ATE=TXFRAME\t\t\t; Start Tx Frame(inform BBP to change, modulation mode)\n\t\tiwpriv ra0 set ATE=TXCARR\t\t\t; Start Tx carrier, Measure carrier with instrument\n\t\tiwpriv ra0 set ATETXPOW0=05\n\t\tiwpriv ra0 set ATETXPOW1=05\n\t\tiwpriv ra0 set ATETXFREQOFFSET=19\n\t\tiwpriv ra0 set ATE=ATESTART\n\n2.3 Check specturm mask\n\t\tiwpriv ra0 set ATE=ATESTART\n\t\tiwpriv ra0 set ATECHANNEL=1\t\t\t; set Channel\n\t\tiwpriv ra0 set ATETXMODE=1\t\t\t; set TX-Mode.\n\t\tiwpriv ra0 set ATETXMCS=7\t\t\t; set MCS type.\n\t\tiwpriv ra0 set ATETXBW=0\t\t\t; set Bandwidth\n\t\tiwpriv ra0 set ATETXCNT=200\t\t\t; Tx frame count(decmial)\n\t\tiwpriv ra0 set ATE=TXFRAME\t\t\t; Start Tx Frame(inform BBP to change, modulation mode)\n\t\tiwpriv ra0 set ATE=TXCONT\t\t\t; Start continuous TX, Measure specturm mask with instrument\n\t\tiwpriv ra0 set ATETXPOW0=5\n\t\tiwpriv ra0 set ATETXPOW1=5\n\t\tiwpriv ra0 set ATE=ATESTART\n\n2.4 Frequency offset tuning\n\t\tiwpriv ra0 set ATE=ATESTART\n\t\tiwpriv ra0 set ATECHANNEL=1\t\t\t; set Channel\n\t\tiwpriv ra0 set ATETXMODE=1\t\t\t; set TX-Mode.\n\t\tiwpriv ra0 set ATETXMCS=7\t\t\t; set MCS type.\n\t\tiwpriv ra0 set ATETXCNT=200\t\t\t; Tx frame count(decmial)\n\t\tiwpriv ra0 set ATETXFREQOFFSET=0\t        ; Set frequency offset 0(decimal)\n\t\tiwpriv ra0 set ATE=TXFRAME\t\t\t; Start Tx Frame\n\t\tiwpriv ra0 set ATE=TXCARR\t\t\t; Start Tx carrier, Measure carrier frequency with instrument\n\t\tiwpriv ra0 set ATETXFREQOFFSET=10\t        ; Dynamic turning frequency offset, 10(decimal)\n\t\tiwpriv ra0 set ATETXFREQOFFSET=20\t        ; Dynamic turning frequency offset, 20(decimal)\n\t\tiwpriv ra0 set ATE=ATESTART\t\t\t; Stop, Store the tuning result to EEPROM\n\n2.5 Rx\n\t\tiwpriv ra0 set ATE=ATESTART\n\t\tiwpriv ra0 set ATECHANNEL=1\t\t\t; set Channel\n\t\tiwpriv ra0 set ResetCounter=1\t\t        ; Reset statistic counter\n\t\tiwpriv ra0 set ATETXFREQOFFSET=value            ;To use the value(decimal) you got in tx calibration\n\t\tiwpriv ra0 set ATETXMODE=1\t\t\t; set TX-Mode.\n\t\tiwpriv ra0 set ATETXMCS=7\t\t\t; set MCS type.\n\t\tiwpriv ra0 set ATETXBW=0\t\t\t; set Bandwidth\n\t\tiwpriv ra0 set ATE=RXFRAME\t\t\t; Start Rx,\n\t\tiwpriv ra0 set ATERXFER=1\t\t\t; show RxCnt and RSSI/per-antenna, Transmit test packets\n\t\tiwpriv ra0 set ATE=ATESTART\t\t\t; Stop\n\t\tiwpriv ra0 stat \t\t\t\t\t; get statistics counter\n\t\tiwpriv ra0 set ATERXFER=1\n\t\tiwpriv ra0 set ATERXANT=1\n\t\t\n\t\tiwpriv ra0 set ATE=ATESTART\n\t\tiwpriv ra0 set ATERXANT=0\n\t\tiwpriv ra0 set ATE=RXFRAME\n\n2.6 Show all ate parameters\n\t\tiwpriv ra0 set ATESHOW=1\n\n\t\t\tMode=4\n\t\t\tTxPower0=0\n\t\t\tTxPower1=0\n\t\t\tTxAntennaSel=0\n\t\t\tRxAntennaSel=0\n\t\t\tBBPCurrentBW=0\n\t\t\tGI=0\n\t\t\tMCS=7\n\t\t\tTxMode=1\n\t\t\tAddr1=00:11:22:aa:bb:cc\n\t\t\tAddr2=00:11:22:aa:bb:cc\n\t\t\tAddr3=00:11:22:aa:bb:cc\n\t\t\tChannel=1\n\t\t\tTxLength=1024\n\t\t\tTxCount=40000\n\t\t\tTxRate=11\n\t\t\tRFFreqOffset=0\n\n2.7 Online help\n\t\tiwpriv ra0 set ATEHELP=1\n\t\t\n\t\t\tATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXFRAME, RXFRAME\n\t\t\tATEDA\n\t\t\tATESA\n\t\t\tATEBSSID\n\t\t\tATECHANNEL, range:0~14(unless A band !). \n\t\t\tATETXPOW0, set power level of antenna 1.\n\t\t\tATETXPOW1, set power level of antenna 2.\n\t\t\tATETXANT, set TX antenna. 0: all, 1: antenna one, 2: antenna two.\n\t\t\tATERXANT, set RX antenna.0: all, 1: antenna one, 2: antenna two, 3: antenna three.\n\t\t\tATETXFREQOFFSET, set frequency offset, range 0~63.\n\t\t\tATETXBW, set BandWidth, 0:20MHz, 1:40MHz.\n\t\t\tATETXLEN, set Frame length, range 24~2312.\n\t\t\tATETXCNT, set how many frame going to transmit.\n\t\t\tATETXMCS, set MCS, reference to rate table.\n\t\t\tATETXMODE, set Mode 0: CCK, 1: OFDM, 2: HT-Mix, 3: GreenField, reference to rate table.\n\t\t\tATETXGI, set GI interval, 0: Long, 1: Short.\n\t\t\tATERXFER, 0: disable Rx Frame error rate. 1: enable Rx Frame error rate.\n\t\t  \tATERRF, show all RF registers.\n\t\t\tATEWRF1, set RF1 register.\n\t\t\tATEWRF2, set RF2 register.\n\t\t\tATEWRF3, set RF3 register.\n\t\t\tATEWRF4, set RF4 register.\n\t\t\tATELDE2P, load EEPROM from .bin file.\n\t\t\tATERE2P, display all EEPROM content.\n\t\t\tATESHOW, display all parameters of ATE.\n\t\t\tATEHELP, online help.\n\n2.8 Display Rx Packet Count and RSSI\n\t\tiwpriv ra0 set ATERXANT=0\t\t==> Enable All Three Rx Antennas\n\t\tiwpriv ra0 set ATERXFER=1\t\t==> Enable Rx Frame Error Rate: RxCnt/RxTotal\n\t\tiwpriv ra0 set ATE=RXFRAME\t        ==> Start Rx\n\t\t\tMlmePeriodicExec: Rx packet cnt = 2/4\n\t\t\tMlmePeriodicExec: Rx AvgRssi0=-88, AvgRssi1=-80, AvgRssi2=-91\n\t\t\tMlmePeriodicExec: Rx packet cnt = 2/6\n\t\t\tMlmePeriodicExec: Rx AvgRssi0=-86, AvgRssi1=-77, AvgRssi2=-89K\n\t\t\tK\n\n\t\tiwpriv ra0 set ATERXANT=1\t\t==> Enable Three Rx Antenna-1\n\t\tiwpriv ra0 set ATERXFER=1\t\t==> Enable Rx Frame Error Rate: RxCnt/RxTotal\n\t\tiwpriv ra0 set ATE=RXFRAME\t        ==> Start Rx\n\t\t\tMlmePeriodicExec: Rx packet cnt = 0/7\n\t\t\tMlmePeriodicExec: Rx AvgRssi=-87\n\t\t\tMlmePeriodicExec: Rx packet cnt = 7/14\n\t\t\tMlmePeriodicExec: Rx AvgRssi=-90\n\t\t\tK\n\t\t\tK\n\n\n===================================================================================================\n3. Hardware Access\n==================\n\n=====================================\n3.1 iwpriv ra0 bbp [parameters]=[Value]\n\t\tRead/Write BBP registers by ID number.\n\tBBPID\n\n3.1.1 Read BBP register, BBPID only, no = symbol.\n\tBBPID:\n\t\t0 ~ xx\t\t\t; decimal, 8-bit\n\tBBPID=Value\n\n3.1.2 Write BBP register.\n\tBBPID:\n\t\t0 ~ xx\t\t\t; decimal, 8-bit\n\tValue:\n\t\t00 ~FF\t\t\t; hexdecimal, 8-bit\n\n=====================================\n3.2 iwpriv ra0 mac [parameters]=[val]\n\t\tRead/Write MAC registers by offset.\n\tMAC_OFFSET\n\n3.2.1 Read MAC register, MAC_OFFSET only, no = symbol.\n\tMAC_OFFSET:\n\t\t0000 ~ FFFF\t\t; hexdecimal, 16-bit\n\tMAC_OFFSET=Value\n\n3.2.2 Write MAC register.\n\tMAC_OFFSET:\n\t\t0000 ~ FFFF\t\t; hexdecimal, 16-bit\n\tValue:\n\t\t0000 ~FFFF\t\t; hexdecimal, 32-bit\n\n=====================================\n3.3 iwpriv ra0 e2p [parameters]=[val]\n\t\tRead/Write EEPROM content by address.\n\tEEP_ADDR\n\n3.3.1 Read EEPROM content, EEP_ADDR only, no = symbol.\n\tEEP_ADDR:\n\t\t00 ~ FF\t\t\t; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, K)\n\tEEP_ADDR=Value\n\n3.3.2 Write EEPROM content.\n\tEEP_ADDR:\n\t\t00 ~ FF\t\t\t; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, K)\n\tValue:\n\t\t0000 ~FFFF\t\t; hexdecimal, 16-bit\n\n=====================================\n3.4 Example\n\n3.4.1 Hardware access\n\t\tiwpriv ra0 bbp 0\t\t\t\t# read BBP register 0\n\t\tiwpriv ra0 bbp 0=12\t\t\t\t# write BBP register 0 as 0x12\n\t\tiwpriv ra0 mac 0\t\t\t\t# read MAC register 0\n\t\tiwpriv ra0 mac 0=1234abcd\t\t        # write MAC register 0 as 0x1234abcd\n\t\tiwpriv ra0 e2p 0\t\t\t\t# read E2PROM 0\n\t\tiwpriv ra0 e2p c=12ab\t\t\t        # write E2PROM 0xc as 0x12ab\n\n3.4.2 Statistic counter operation\n\t\tiwpriv ra0 stat\t\t\t\t\t# read statistic counter\n\t\tiwpriv ra0 set ResetCounter=0\t                # reset statistic counter\n\n\tSuggestion:\n\t\t1. To turn on ATE functionality, you have to add compile flag \"RALINK_ATE\" to Makefile\n\t\t2. Before doing ATE testing, please stop AP function\n\t\t3. If you want to test another ATE action, prefer to stop AP & ATE function\n\t\t4. All ATE function settings will lose efficacy after reboot.\n\t\t5. Before hardware register access, please reference hardware spec.\n\tNote. \n\t\tIn ATE mode, the channel must set via \"ATECHANNEL\"\n\n===================================================================================================\n4. ated\n=======\n4.1  Introduction\nThe ated is an optional user space component for RT28xx Linux driver. \nWhen Windows GUI starts, AP enters ATE mode (i.e.,ATESTART) immediately.\nIt behaves as a proxy between Windows GUI and RT28xx Linux driver when ATE process proceeds.\nThe ated will be killed automatically when Windows GUI is closed.\nYou can kill it manually, too(for example, type '$killall ated').\nRT28xx linux driver will leave ATE mode either ated is killed or Windows GUI is closed.\n\n4.2  Environment setup\n1. Connect the platform you want to test directly with a Windows host by ether network line.\n2. In the Windows host, run WinPcap_4_0.exe for the QA GUI or ./RT2880_ATE/RaUI.exe(please unrar \"RT2880_ATE.rar\" to get it).\n\n4.3  How to use ated for ATE purpose\n0. First you should set both \"HAS_ATE=y\" and \"HAS_QA_SUPPORT=y\" in the file ~/Module/os/linux/config.mk and compile the driver.\n1. Modify the Makefile according to our target \"PLATFORM\".\n2. Change the path of \"CROSS_COMPILE\" if needed.\n3. Then type 'make' command to compile the source code of the daemon.\n4. After the driver interface has started up, attach both of the wireless interface and the ethernet       interface to the bridge interface.\n5. If you have no bridge interface, please give an IP address to the ethernet interface.\n   (for example : '$ated -beth0')\n6. After the interfaces have entered forwarding states, manually start ated, type '$ated -bbrX -iraX'.\n7. If your WLAN interface and Bridge interface is \"ra0\" and \"br0\" respectively, just type $ated.\n   (For further usage of options, type $ated -h)\n8. In the Windows host, run RT28xxQA_ATE.exe or ./RT2880_ATE/RaUI.exe.\n9. Select the wired network adapter, then press OK and wait for a moment.\n10.If the Windows host cannot tolerate such a broadcast storm from ated,\n   please run ated with option -u.(for example : '$ated -ira1 -u')\n11.If your target platform concerns its network security, please run RT28xxQA_unicast.exe instead of RT28xxQA_ATE.exe.\n\nNote : \na. The names of WLAN interface(default is \"ra0\") and Bridge interface(default is \"br0\") must be specified manually(for example : '$ated -bbr1 -ira2') if your WLAN interface or Bridge interface is not \"ra0\" or \"br0\" respectively !\nb. Please make sure no other RaUI is running before you excute ./RT2880_ATE/RaUI.exe.\n\n\n\n"
  },
  {
    "path": "doc/wps_iwpriv_usage.txt",
    "content": "/*\r\n *\tREADME: WPS STA as an Enrollee or Registrar\r\n*/\r\n\r\n0. Build WPS function. Please set 'HAS_WSC=y'.\r\n\t\r\n1. Enrollee Mode\r\n\r\n1.1) PIN mode:\r\n\r\nRunning Scenarios (case 'a' and 'b')\r\n\t--------------------------------------------------------\r\n\ta. Adding an Enrollee to AP+Registrar (EAP)\r\n\t[AP+Registrar]<----EAP--->[Enrollee Client]\r\n\t--------------------------------------------------------\r\n\tb. Adding an Enrollee with external Registrar (UPnP/EAP)\r\n\t[External Registrar]<----UPnP--->[AP_Proxy]<---EAP--->[Enrollee Client]\r\n\t--------------------------------------------------------\r\n\tNote: 'EAP' indicates to use wireless medium and 'UPnP' indicates to use \r\n\twired or wireless medium.\r\n\r\n(i) [Registrar] or [AP+Registrar]\r\n\tEnter the Enrollee PinCode on the Registrar and start WPS on the Registrar.\r\n\tNote: How to get the Enrollee PinCode? Use 'iwpriv ra0 stat' on the Enrollee. \r\n\r\n(ii)[RT2860 Linux WPS STA]\r\n\tiwpriv ra0 wsc_conf_mode 1\t\t;; Enrollee\r\n\tiwpriv ra0 wsc_mode 1\t\t\t;; PIN\r\n\tiwpriv ra0 wsc_ap_band 0 (or 1)\t;; 0: prefer 2.4G, 1: prefer 5G\r\n\tiwpriv ra0 wsc_ssid \"AP's SSID\"\r\n\tiwpriv ra0 wsc_start\r\n\r\n{iii) If the registration is successful, the Enrollee will be re-configured \r\n\twith the new parameters, and will connect to the AP with these new parameters.\r\n \r\n1.2) PBC mode:\r\n\r\n Running Scenarios (case 'a' only)\r\n \t--------------------------------------------------------\r\n\ta. Adding an Enrollee to AP+Registrar (EAP)\r\n\t[AP+Registrar]<----EAP--->[Client]\r\n\t--------------------------------------------------------\r\n\r\n(i) [AP+Registrar]\r\n\tStart PBC on the Registrar.\r\n\t\t\r\n{ii)[RT2860 Linux WPS STA]\r\n\tiwpriv ra0 wsc_conf_mode 1\t\t;; Enrollee\r\n\tiwpriv ra0 wsc_mode 2\t\t\t;; PBC\r\n\tiwpriv ra0 wsc_ap_band 0 (or 1)\t;; 0: prefer 2.4G, 1: prefer 5G\r\n\tiwpriv ra0 wsc_start\r\n\r\n{iii) If the registration is successful, the Enrollee will be re-configured \r\n\twith the new parameters, and will connect to the AP with these new parameters.\r\n\r\n\r\n2. Registrar Mode\r\n\r\n2.1) PIN mode:\r\n\r\nRunning Scenarios (case 'a' and 'b')\r\n \t--------------------------------------------------------\r\n\ta. Configure the un-configured AP\r\n\t[Unconfigured AP]<----EAP--->[Registrar]\r\n\t--------------------------------------------------------\r\n\tb. Configure the configured AP\r\n\t[Configured AP]<----EAP--->[Registrar]\r\n\t--------------------------------------------------------\r\n\r\n(i) [AP]\r\n\tStart PIN on the Enrollee WPS AP.\r\n\r\n(ii)[RT2860 Linux WPS STA]\r\n\tiwpriv ra0 wsc_conf_mode 2\t\t;; Registrar\r\n\tiwpriv ra0 wsc_mode 1\t\t\t;; PIN\r\n\tiwpriv ra0 wsc_pin xxxxxxxx\t\t;; AP's PIN Code\r\n\tiwpriv ra0 wsc_ap_band 0 (or 1)\t;; 0: prefer 2.4G, 1: prefer 5G\r\n\tiwpriv ra0 wsc_ssid \"AP's SSID\"\r\n\tiwpriv ra0 wsc_start\r\n\r\n{iii) If the registration is successful;\r\n\tin case 'a': \r\n\t\tThe Registrar will be re-configured with the new parameters, \r\n\t\tand will connect to the AP with these new parameters;\r\n\tin case 'b': \r\n\t\tThe Registrar will be re-configured with AP's configurations, \r\n\t\tand will connect to the AP with these new parameters.\r\n\r\n2.2) PBC mode: \r\n\t \tsame scenarios as PIN mod\r\n\r\n(i) [AP]\r\n\tStart PBC on the Enrollee WPS AP.\r\n\r\n(ii)[RT2860 Linux WPS STA]\r\n\tiwpriv ra0 wsc_conf_mode 2\t\t;; Registrar\r\n\tiwpriv ra0 wsc_mode 2\t\t\t;; PBC\r\n\tiwpriv ra0 wsc_ap_band 0 (or 1)\t;; 0: prefer 2.4, 1: prefer 5G\r\n\tiwpriv ra0 wsc_start\r\n\r\n{iii) If the registration is successful;\r\n\tin case 'a': \r\n\t\tThe Registrar will be re-configured with the new parameters, \r\n\t\tand will connect to the AP with these new parameters;\r\n\tin case 'b': \r\n\t\tThe Registrar will be re-configured with AP's configurations, \r\n\t\tand will connect to the AP with these new parameters.\r\n\r\n\r\n3. Others\r\n\tiwpriv ra0 wsc_cred_count 1\t\t\t\t\t;; Set count of credentials, Only support one credential for M8 in Registrar mode.\r\n\t\tinteger: 1 ~ 8\r\n\r\n\tiwpriv ra0 wsc_cred_ssid \"idx ssid_str\"\t\t;; Set SSID into credtentail[idx]\r\n\t\tstring:\r\n\t\t\t\t idx: 0 ~ 7\r\n\t\t\t\t ssid_str: SSID for AP\r\n\t\texample:\r\n\t\t\t\t iwpriv ra0 wsc_cred_ssid \"0 wps_ap1\"\r\n\r\n\tiwpriv ra0 wsc_cred_auth \"idx auth_str\"\t\t;; Set AuthMode into credtentail[idx]\r\n\t\tstring:\r\n\t\t\t\t idx: 0 ~ 7\r\n\t\t\t\t auth_str: OPEN, WPAPSK, WPA2PSK, SHARED, WPA, WPA2\r\n\t\texample:\r\n\t\t\t\t iwpriv ra0 wsc_cred_auth \"0 WPAPSK\"\r\n\r\n\tiwpriv ra0 wsc_cred_encr \"idx encr_str\"\t\t;; Set EncrypType into credtentail[idx]\r\n\t\tstring:\r\n\t\t\t\t idx: 0 ~ 7\r\n\t\t\t\t encr_str: NONE, WEP, TKIP, AES\r\n\t\texample:\r\n\t\t\t\t iwpriv ra0 wsc_cred_encr \"0 TKIP\"\r\n\r\n\tiwpriv ra0 wsc_cred_keyIdx \"idx key_index\"\t;; Set Key Index into credtentail[idx]\r\n\t\tstring:\r\n\t\t\t\t idx: 0 ~ 7\r\n\t\t\t\t key_index: 1 ~ 4\r\n\t\texample:\r\n\t\t\t\t iwpriv ra0 wsc_cred_keyIdx \"0 1\"\r\n\r\n\tiwpriv ra0 wsc_cred_key \"idx key\"\t\t\t;; Set Key into credtentail[idx]\r\n\t\tstring:\r\n\t\t\t\t idx: 0 ~ 7\r\n\t\t\t\t key: ASCII string (wep_key_len(=5,13), passphrase_len(=8~63)) \r\n\t\t\t\t\t  OR \r\n\t\t\t\t\t  Hex string (wep_key_len(=10,26), passphrase_len(=64))\r\n\t\texample:\r\n\t\t\t\t iwpriv ra0 wsc_cred_key \"0 12345678\"\t;; Passphrase\r\n\t\t\t\t iwpriv ra0 wsc_cred_key \"0 abcd\"\t\t;; WEP Key\r\n\r\n\tiwpriv ra0 wsc_cred_mac \"idx mac_str\"\t\t;; Set AP's MAC into credtentail[idx]\r\n\t\tstring:\r\n\t\t\t\t idx: 0 ~ 7\r\n\t\t\t\t mac_str: xx:xx:xx:xx:xx:xx\r\n\t\texample:\r\n\t\t\t\t iwpriv ra0 wsc_cred_mac \"0 00:11:22:33:44:55\"\r\n\r\n\tiwpriv ra0 wsc_conn_by_idx\t0\t\t\t\t;; Connect AP by credential index.\r\n\t\tinteger: 0 ~ 7\r\n\r\n\tiwpriv ra0 wsc_auto_conn 0\t\t\t\t\t;; If the registration is successful, driver will re-connect to AP or not.\r\n\t\tinteger: 0\t\t;; Disabled, driver won't re-connect to AP with new configurations.\r\n\t\t\t\t 1\t\t;; Enabled, driver will re-connect to AP with new configurations.\r\n\t\tNote. Default value is 1.\r\n\r\n\tiwpriv ra0 wsc_stop\t\t\t;; Stop WSC work and don't wait upon two-minute timeout\t\r\n\tiwpriv ra0 wsc_ap_band val\r\n\t\tval: 0\t;; prefer 2.4G AP\r\n\t\t\t 1\t;; prefer 5G AP\r\n\t\t\t 2\t;; Auto\r\n\tiwpriv ra0 stat\t\t\t\t;; Read statistics counter and WPS status.\t\t\r\n   "
  },
  {
    "path": "info.sh",
    "content": "#!/bin/sh\necho mtnet7601Usta.ko\nmodprobe --dump-modversions src/os/linux/mtnet7601Usta.ko|grep le_layout\necho mtutil7601Usta.ko\nmodprobe --dump-modversions src/os/linux/mtutil7601Usta.ko|grep le_layout\necho mt7601Usta.ko\nmodprobe --dump-modversions src/os/linux/mt7601Usta.ko|grep le_layout\n\n"
  },
  {
    "path": "load.sh",
    "content": "#!/bin/sh\ndmesg -c\ninsmod src/os/linux/mtutil7601Usta.ko\ninsmod src/os/linux/mt7601Usta.ko\ninsmod src/os/linux/mtnet7601Usta.ko\nifconfig ra0 10.0.0.100\n"
  },
  {
    "path": "miwifi_build.sh",
    "content": "#!/bin/sh\ncp -v /lib/modules/$(uname -r)/build/Module.symvers src/os/linux\nmake clean && make all && make install\nrm -rvf src/os/linux/Module.symvers\n"
  },
  {
    "path": "miwifi_work.sh",
    "content": "#!/bin/sh\n#remove the driver before\nifconfig ra0 down\nrmmod mt7601Usta\n#add new ap driver\nmodprobe rtutil7601Uap\nmodprobe mt7601Uap\nmodprobe rtnet7601Uap\n#set ip\nifconfig ra0 up\nifconfig ra0 192.168.199.1\n#dhcp the network\ndhcpd ra0\n#make if forward work from eth0\necho 1 | sudo tee /proc/sys/net/ipv4/ip_forward\niptables -t filter -F\niptables -t nat -F\niptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\n\n"
  },
  {
    "path": "src/Module.symvers",
    "content": "0x8f8c21c9\ttm6000_set_reg_mask\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0x831a59a3\tiscsi_host_add\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x81bf44d1\tipv6_chk_custom_prefix\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x18e453a1\tieee80211_wake_queues\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xef3c159f\tsnd_soc_platform_read\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb92d4de2\t__hci_cmd_sync\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x86f7dace\to2hb_setup_callback\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x48604814\tieee80211_queue_stopped\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x6dd6aab1\tcfg80211_wext_giwscan\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x02ba41f6\tcfg80211_wext_siwscan\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x693b9529\tvideobuf_queue_cancel\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x87f47e34\tiscsi_tcp_r2tpool_free\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0xe55b1253\tl2tp_session_find_by_ifname\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x28dd1e84\tsnd_soc_of_parse_audio_routing\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x64754d93\tdvb_usbv2_resume\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0x623a258b\tv4l2_ctrl_grab\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xeb5d6ffb\tusb_serial_generic_write_bulk_callback\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xb92aba6d\tsnd_soc_dapm_put_pin_switch\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x2f37a29a\tsnd_soc_dapm_get_pin_switch\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x0772ea31\tem28xx_write_reg\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xd8fa57a6\tdlm_unregister_eviction_cb\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0xb0a4eed9\tax25_find_cb\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xe4ae06d8\tnfc_target_lost\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xca3f100a\tcma3000_suspend\tdrivers/input/misc/cma3000_d0x\tEXPORT_SYMBOL\n0xf8fbec24\tmd_finish_reshape\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x89d42bed\thostap_handle_sta_tx_exc\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x61593848\tnf_ct_delete\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x18f9df50\tdm_get_device\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x887a84be\tdm_put_device\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x8a3fcd9e\tdib8000_ctrl_timf\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x8b034a20\tiscsi_conn_setup\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x7d053fc5\tdm_rh_start_recovery\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x5631dbb7\tp9_client_statfs\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x2941ce2f\tnf_nat_sdp_port_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x6752538d\thostap_info_process\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x16a4b6a2\tsnd_soc_dapm_get_enum_virt\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x0214cfe8\tsnd_soc_dapm_put_enum_virt\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc86d2ae1\tdib8096p_get_i2c_tuner\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xa6cdec9c\trc_keyup\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x5720605a\tir_raw_event_handle\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xae9ccdee\trt2800_rfkill_poll\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x94b6d141\tnfc_tm_activated\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x2c686ad8\tmwifiex_add_virtual_intf\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x5ca6a397\tw1_unregister_family\tdrivers/w1/wire\tEXPORT_SYMBOL\n0x4e460006\tsnd_power_wait\tsound/core/snd\tEXPORT_SYMBOL\n0x5260213d\ti2400m_error_recovery\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0xae9610b5\tircomm_disconnect_request\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0xbad92a98\tstv0288_attach\tdrivers/media/dvb-frontends/stv0288\tEXPORT_SYMBOL\n0x601c9eb1\tdibusb_i2c_algo\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0xf395de03\tieee80211_aes_cmac_calculate_k1_k2\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xaf95fda7\tusbnet_cdc_unbind\tdrivers/net/usb/cdc_ether\tEXPORT_SYMBOL_GPL\n0x242852b9\tax25_uid_policy\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x93eb9070\tsnd_soc_jack_add_pins\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb47559e0\trc_map_dibusb_table\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0xc18477b2\tphy_device_register\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x0ad69602\thostap_set_multicast_list_queue\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x0ffb3928\tnf_conntrack_l4proto_tcp4\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xa09963ae\tasync_tx_submit\tcrypto/async_tx/async_tx\tEXPORT_SYMBOL_GPL\n0x73edf408\tarpt_do_table\tnet/ipv4/netfilter/arp_tables\tEXPORT_SYMBOL\n0x1771ad10\thostap_check_sta_fw_version\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x4d399e59\tsynth_remove\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xe131a6a3\txt_proto_fini\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x2b0b30ac\tath9k_hw_disable_interrupts\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xa3d4f6fb\tlc_is_used\tlib/lru_cache\tEXPORT_SYMBOL\n0xb6fe7462\tsnd_card_free\tsound/core/snd\tEXPORT_SYMBOL\n0xd735b87c\tinput_unregister_polled_device\tdrivers/input/input-polldev\tEXPORT_SYMBOL\n0x9accfd8b\tdm_exception_store_destroy\tdrivers/md/dm-snapshot\tEXPORT_SYMBOL\n0x4e5f1a39\tath6kl_core_create\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x40995e8d\trt2x00lib_txdone_noinfo\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x97999817\trfkill_set_hw_state\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x98bb5a22\teeprom_93cx6_read\tdrivers/misc/eeprom/eeprom_93cx6\tEXPORT_SYMBOL_GPL\n0x56af1ddf\tregister_pppox_proto\tdrivers/net/ppp/pppox\tEXPORT_SYMBOL\n0xf05f14d6\tusb_wwan_open\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x567076bb\tsnd_compress_deregister\tsound/core/snd-compress\tEXPORT_SYMBOL_GPL\n0x13fc40df\tmd_check_no_bitmap\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x28450570\tmd_raid1_congested\tdrivers/md/raid1\tEXPORT_SYMBOL_GPL\n0xe7df96e6\tmd_raid5_congested\tdrivers/md/raid456\tEXPORT_SYMBOL_GPL\n0x869caf18\tcx24123_attach\tdrivers/media/dvb-frontends/cx24123\tEXPORT_SYMBOL\n0xc98103ca\tcx231xx_dev_uninit\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xfd4c9a44\tv4l2_i2c_new_subdev\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x18fe2787\tsnd_pcm_new_internal\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xff5a8cfe\tcn_del_callback\tdrivers/connector/cn\tEXPORT_SYMBOL_GPL\n0x5b88e510\tvideobuf_mmap_free\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0xde64f142\tv4l2_ctrl_notify\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xbefd6e48\tar9003_mci_send_wlan_channels\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x45d8a9f8\tdvb_register_device\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xf383959a\tusb_serial_deregister_drivers\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xca781b6f\tp9_client_lock_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xd3d45171\tnf_ct_l3proto_put\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x30ff161d\tnf_ct_l4proto_put\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x27a3280d\tdapm_mark_dirty\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x9cb3094a\trt2x00usb_vendor_request\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x19b42f40\tssb_commit_settings\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x113973e4\tphy_stop_interrupts\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x7f2d4dad\tnfc_get_local_general_bytes\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x2695165d\trt2x00lib_dmastart\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x12689c4a\tsynth_add\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x22f4fd8c\tqtree_release_dquot\tfs/quota/quota_tree\tEXPORT_SYMBOL\n0xe2f2d60e\trt2x00usb_disable_radio\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xd8a351a7\tp9_client_fsync\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xfda3ec7a\tip_set_put_byindex\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x81fff2d1\tip_set_netmask_map\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x489d7134\tar9003_mci_cleanup\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x96854e13\tsnd_pcm_lib_default_mmap\tsound/core/snd-pcm\tEXPORT_SYMBOL_GPL\n0x4d21b1ef\troccat_connect\tdrivers/hid/hid-roccat\tEXPORT_SYMBOL_GPL\n0x95e3a769\tv4l2_clk_put\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x19fa2613\tath9k_hw_setmcastfilter\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xed6e3edf\tusb_ftdi_elan_edset_setup\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x61ca8e65\tip6_tnl_dst_store\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL_GPL\n0xd1aebe93\tipv6_getsockopt\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xde632c55\twiphy_to_ieee80211_hw\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xf1b1b8b8\tv4l2_i2c_new_subdev_board\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0xd733cb5f\tcfg80211_ch_switch_notify\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xe377ed55\tsnd_ctl_sync_vmaster\tsound/core/snd\tEXPORT_SYMBOL_GPL\n0xd2285060\tdib7000p_ctrl_timf\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x1dbff8c9\to2nm_node_get\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0xa37ceb11\tcfg80211_notify_new_peer_candidate\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x95cd2106\tdibusb_rc_query\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x85b5e625\trfkill_set_states\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x2ffc8399\tcx2341x_handler_setup\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x2869d169\t__hci_cmd_sync_ev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xd481192b\tssb_admatch_size\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xc0512e0f\tssb_admatch_base\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x6119ae67\tw1_ds2780_io\tdrivers/w1/slaves/w1_ds2780\tEXPORT_SYMBOL\n0xe71af41b\tw1_ds2781_io\tdrivers/w1/slaves/w1_ds2781\tEXPORT_SYMBOL\n0xa6c8f083\tsnd_usbmidi_create\tsound/usb/snd-usbmidi-lib\tEXPORT_SYMBOL\n0x66535a18\tadxl34x_suspend\tdrivers/input/misc/adxl34x\tEXPORT_SYMBOL_GPL\n0x364de34b\tfuse_do_open\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0xa2661187\tnfnetlink_parse_nat_setup_hook\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x19e03378\tcfg80211_get_p2p_attr\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x3a57f235\tsnd_seq_autoload_unlock\tsound/core/seq/snd-seq-device\tEXPORT_SYMBOL\n0x3c43271e\tdib7000p_update_pll\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x8c187250\tsnd_soc_dapm_force_enable_pin\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x7b8a2d37\tsnd_soc_test_bits\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xdaba14f1\tv4l2_subdev_queryctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x91682441\tarpt_alloc_initial_table\tnet/ipv4/netfilter/arp_tables\tEXPORT_SYMBOL_GPL\n0xa53b6534\tau8522_led_ctrl\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x301e0074\tip6_datagram_recv_ctl\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x9e13f6f6\tgf128mul_lle\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x1cf094e5\tvb2_ioctl_dqbuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xc06d1f26\tax25_listen_register\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x6bff0da5\t__async_tx_find_channel\tcrypto/async_tx/async_tx\tEXPORT_SYMBOL_GPL\n0x31177cde\tadxl34x_probe\tdrivers/input/misc/adxl34x\tEXPORT_SYMBOL_GPL\n0x8914beba\tflexcop_pass_dmx_packets\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x4852a0a3\tdib0070_wbd_offset\tdrivers/media/dvb-frontends/dib0070\tEXPORT_SYMBOL\n0x3337527d\tsnd_soc_bytes_get\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xa6564b0d\tlro_flush_all\tnet/ipv4/inet_lro\tEXPORT_SYMBOL\n0x0aef3eed\tieee80211_stop_tx_ba_cb_irqsafe\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xc622fb29\tsnd_seq_device_unregister_driver\tsound/core/seq/snd-seq-device\tEXPORT_SYMBOL\n0x5d410a12\tsnd_dmaengine_pcm_open_request_chan\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x7b460a50\trt2x00lib_remove_dev\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xd6a44d94\tbacklight_force_update\tdrivers/video/backlight/backlight\tEXPORT_SYMBOL\n0x8556c238\tath9k_hw_addrxbuf_edma\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x530501f1\tp54_free_common\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x4c5a84ad\tieee80211_sched_scan_stopped\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xf5c3dd12\tath9k_hw_deinit\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x00b48a46\txfrm6_tunnel_alloc_spi\tnet/ipv6/xfrm6_tunnel\tEXPORT_SYMBOL\n0x6abbe439\tllc_add_pack\tnet/llc/llc\tEXPORT_SYMBOL\n0xbe9a8c6d\tlnbp22_attach\tdrivers/media/dvb-frontends/lnbp22\tEXPORT_SYMBOL\n0x2378bcfc\tstv6110_attach\tdrivers/media/dvb-frontends/stv6110\tEXPORT_SYMBOL\n0x13e247e0\trc_map_af9005_table\tdrivers/media/usb/dvb-usb/dvb-usb-af9005-remote\tEXPORT_SYMBOL\n0xd64d6a9a\tmwifiex_add_card\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x7c640527\tbt_info\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xe1af0bf0\ts921_attach\tdrivers/media/dvb-frontends/s921\tEXPORT_SYMBOL\n0x32d9e08b\tath9k_hw_abortpcurecv\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x0fb619c7\trt2800_read_eeprom_efuse\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x398c9cef\tinet_diag_bc_sk\tnet/ipv4/inet_diag\tEXPORT_SYMBOL_GPL\n0xfdd4e35b\tl2tp_tunnel_delete\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x2f622ea1\troccat_disconnect\tdrivers/hid/hid-roccat\tEXPORT_SYMBOL_GPL\n0x7e606130\tsnd_soc_calc_bclk\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x0185f555\tregmap_init_i2c\tdrivers/base/regmap/regmap-i2c\tEXPORT_SYMBOL_GPL\n0x43dd3302\tregmap_init_spi\tdrivers/base/regmap/regmap-spi\tEXPORT_SYMBOL_GPL\n0x6c02fd16\tw1_add_master_device\tdrivers/w1/wire\tEXPORT_SYMBOL\n0x9e9a5a09\tnf_nat_pptp_hook_expectfn\tnet/netfilter/nf_conntrack_pptp\tEXPORT_SYMBOL_GPL\n0x42c8e001\tv4l2_ctrl_next\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL\n0xaf64ad0d\tzlib_deflate\tlib/zlib_deflate/zlib_deflate\tEXPORT_SYMBOL\n0x792c5a9a\thci_register_dev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x91815586\tirda_param_pack\tnet/irda/irda\tEXPORT_SYMBOL\n0x15bc2bee\tfuse_request_send_background\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x1e363669\tsnd_rawmidi_drain_output\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0xdd731e61\tsnd_ac97_pcm_open\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x7e730c4e\tlirc_dev_fop_poll\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0xd290f7cb\tmdiobus_scan\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xe2bd47db\tocfs2_dlm_lock\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xeb62c2ce\t__nf_conntrack_confirm\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xa223a66d\tcfg80211_wext_giwrts\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x521121f3\tcfg80211_wext_siwrts\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x883d6572\tip_set_name_byindex\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x346663f3\tlbtf_send_tx_feedback\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x7da7d8a0\tmwifiex_deauthenticate\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xf5ed0c9a\t__serio_register_port\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x1741e130\tmd_integrity_register\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x78a5288c\tv4l2_async_notifier_register\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x347ac3ee\tssb_bus_resume\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x553ee215\tl2cap_register_user\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x5fecb782\tsnd_ctl_unregister_ioctl\tsound/core/snd\tEXPORT_SYMBOL\n0xef1e01f2\tdlm_posix_unlock\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0x1d747ce3\to2hb_check_node_heartbeating\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x867e842e\tssb_device_is_enabled\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xbe40ace9\tirlmp_discovery_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x65ad823e\tsnd_soc_codec_set_pll\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc962f98f\tusb_wwan_suspend\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0xf19df171\tdlm_unregister_domain\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0xae3107ba\tdlm_register_domain\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0x5d99e154\tip_vs_conn_in_get\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x73ec157a\ti2400m_tx_msg_sent\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0xeb4c39da\tusb_ftdi_elan_edset_empty\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x5488a553\tsnd_timer_global_new\tsound/core/snd-timer\tEXPORT_SYMBOL\n0xbb0f282b\tdvb_ca_en50221_release\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x44354e75\ttm6000_set_audio_bitrate\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0x9458d24a\tieee80211_queue_delayed_work\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x89b59f18\tsctp_do_peeloff\tnet/sctp/sctp\tEXPORT_SYMBOL\n0x740cf9f7\tsnd_ctl_add\tsound/core/snd\tEXPORT_SYMBOL\n0xaeaab42c\tath9k_hw_check_alive\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x154c6338\tdm_kcopyd_client_destroy\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x6fbd34df\tv4l2_device_set_name\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x0c0e6bee\tdevm_backlight_device_unregister\tdrivers/video/backlight/backlight\tEXPORT_SYMBOL\n0x706eabe5\tbt_procfs_init\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xce33ddeb\tbitmap_start_sync\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xea6442b8\tirda_unregister_dongle\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0x7ae58169\tath9k_hw_setopmode\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x5782ad4f\tlirc_get_pdata\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0xf1bd47a7\tcdc_ncm_fill_tx_frame\tdrivers/net/usb/cdc_ncm\tEXPORT_SYMBOL_GPL\n0xc3aff6a4\tw1_ds2760_recall_eeprom\tdrivers/w1/slaves/w1_ds2760\tEXPORT_SYMBOL\n0x4a5b87e4\tdib8000_update_pll\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xbd5c4434\trt2800_config_shared_key\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x86508acf\tnf_ct_invert_tuple\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xa61aa028\tsnd_pcm_format_unsigned\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x47982cd6\trt2800_link_tuner\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xae6af98f\tsnd_soc_default_writable_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb6d85109\trc_map_get\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xd46a6a00\tusb_ftdi_elan_write_pcimem\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0xe42f45a7\tip6_route_me_harder\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x73be493f\tdib7090_tuner_sleep\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xf3acec9c\tlro_receive_skb\tnet/ipv4/inet_lro\tEXPORT_SYMBOL\n0x673b024f\tsnd_device_new\tsound/core/snd\tEXPORT_SYMBOL\n0xd573e901\tsmscore_putbuffer\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x52094955\tsmscore_getbuffer\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x9133bd7c\tvb2_ops_wait_prepare\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xbb466fc6\tcdc_ncm_rx_verify_nth16\tdrivers/net/usb/cdc_ncm\tEXPORT_SYMBOL_GPL\n0x96f6a73b\tiscsi_boot_create_ethernet\tdrivers/scsi/iscsi_boot_sysfs\tEXPORT_SYMBOL_GPL\n0x1081d435\tp9_client_disconnect\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x5d50fdee\tsnd_pcm_hw_constraint_list\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xded01eb0\tusb_serial_generic_get_icount\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x523b52cf\tieee80211_data_from_8023\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x7be7edd3\tdvb_frontend_reinitialise\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x6698419f\ts5h1411_attach\tdrivers/media/dvb-frontends/s5h1411\tEXPORT_SYMBOL\n0x993ad14b\tirda_param_extract_all\tnet/irda/irda\tEXPORT_SYMBOL\n0x80449a0a\tsnd_soc_info_volsw\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xf56bc298\tdm_exception_store_create\tdrivers/md/dm-snapshot\tEXPORT_SYMBOL\n0x8690eb1e\tp9_is_proto_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x921a10b2\tsnd_ac97_pcm_assign\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0xa7b98bee\tdvb_frontend_detach\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x128039bb\tmedia_entity_pipeline_stop\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xadeb2a16\tath9k_hw_stop_dma_queue\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x3ce38421\tp9_client_renameat\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x65075f7a\tcdrom_get_last_written\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0x0bd6f46c\tip6_frag_match\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x5ae9c56d\tip_vs_conn_out_get_proto\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL_GPL\n0x9e6d79f8\tsnd_info_get_str\tsound/core/snd\tEXPORT_SYMBOL\n0xf37a3cfe\tdm_rh_get_region_key\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xe04f7caa\tdm_read_arg_group\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xee17f65c\tdib3000mc_pid_parse\tdrivers/media/dvb-frontends/dib3000mc\tEXPORT_SYMBOL\n0x2fd2433c\trt2x00queue_unmap_skb\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xd2499a37\tsnd_soc_limit_volume\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x62fd7028\tvideo_device_release\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xef401fed\tregister_ip_vs_app_inc\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x3613e6af\tcfg80211_sched_scan_results\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x53da8dc3\tv4l2_subdev_querymenu\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x4ecc8084\tath9k_hw_btcoex_init_2wire\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xc88bd5a6\trt2x00mac_sw_scan_start\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x48aa0e70\tfuse_conn_put\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x90f36b24\tlc_try_lock\tlib/lru_cache\tEXPORT_SYMBOL\n0xc2e2a1f1\tsnd_pcm_hw_rule_noresample\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x3f686c47\tsnd_soc_resume\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x578b82c5\tem28xx_set_mode\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xe3403f80\tvideobuf_querybuf\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x4cc7bae2\tv4l2_clk_enable\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xe32d8ba5\trt2x00mac_bss_info_changed\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x2027b0a4\tieee80211_get_hdrlen_from_skb\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x45155fab\tgameport_stop_polling\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0x6989032e\tar9003_is_paprd_enabled\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xcc5d0e4b\tar9003_mci_set_bt_version\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb602c57e\tnf_ct_l3proto_module_put\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x75cf15fa\tv4l2_device_register_subdev_nodes\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x10025ea3\tath9k_hw_btcoex_set_concur_txprio\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x41d218fe\tsnd_pcm_hw_constraint_msbits\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x35e33c1e\tnfs4_acl_write_who\tfs/nfsd/nfsd\tEXPORT_SYMBOL\n0xee5a7bf3\tsnd_card_create\tsound/core/snd\tEXPORT_SYMBOL\n0xf68f921b\tled_classdev_unregister\tdrivers/leds/led-class\tEXPORT_SYMBOL_GPL\n0x85c27c7a\tsnd_midi_event_reset_encode\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x80da7829\tirias_add_string_attrib\tnet/irda/irda\tEXPORT_SYMBOL\n0x7f18982a\tv4l2_event_subdev_unsubscribe\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x9aa4a096\tmd_unregister_thread\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xca413e20\trc_map_unregister\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xe0ff7a18\tunregister_pppox_proto\tdrivers/net/ppp/pppox\tEXPORT_SYMBOL\n0x8cd3d972\tusb_serial_generic_unthrottle\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xcbfacb26\tp9stat_read\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x63549753\tset_h225_addr_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0xdb86ebb6\txt_register_table\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x61b78eb9\tsnd_soc_poweroff\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x221d2fbc\tv4l2_enum_dv_timings_cap\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0x082f864e\trt2x00mac_sw_scan_complete\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x306fcb9e\tusb_serial_generic_submit_read_urbs\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xd3fb4d0f\tsnd_ctl_activate_id\tsound/core/snd\tEXPORT_SYMBOL_GPL\n0x0001ed4b\tinput_free_polled_device\tdrivers/input/input-polldev\tEXPORT_SYMBOL\n0xe7caf2fc\tdm_exception_store_type_unregister\tdrivers/md/dm-snapshot\tEXPORT_SYMBOL\n0xf35de7c9\tusb_serial_generic_close\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xbecf5d14\tnfnl_acct_put\tnet/netfilter/nfnetlink_acct\tEXPORT_SYMBOL_GPL\n0x6d4a09c0\tv4l2_ctrl_activate\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xc6e0e511\tunregister_ip_vs_scheduler\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x4d9b6d35\tsnd_pcm_format_size\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x61098016\trt2800_config_erp\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x69f770ae\tirlmp_data_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x55fd293f\tirttp_data_request\tnet/irda/irda\tEXPORT_SYMBOL\n0xb2c9d811\tflexcop_pid_feed_control\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x1020f1b4\tdib8000_set_gpio\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x41585be1\tvb2_wait_for_all_buffers\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x1c522382\tphy_register_fixup\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x2d430c94\tath9k_hw_rxprocdesc\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xe7e810f8\tspk_serial_in\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x05646b68\tsnd_soc_card_get_kcontrol\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x9c9f0601\txc4000_attach\tdrivers/media/tuners/xc4000\tEXPORT_SYMBOL\n0x80dc25e2\txc5000_attach\tdrivers/media/tuners/xc5000\tEXPORT_SYMBOL\n0x568dceed\tcdc_ncm_select_altsetting\tdrivers/net/usb/cdc_ncm\tEXPORT_SYMBOL_GPL\n0x26ea4581\tinet6_csk_search_req\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x85425754\tsnd_soc_bytes_info\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3fb4d161\tsnd_seq_kernel_client_dispatch\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0xf67cb48e\tasync_tx_quiesce\tcrypto/async_tx/async_tx\tEXPORT_SYMBOL_GPL\n0xd9e4ad9f\tsnd_soc_dapm_get_volsw\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x8412c1a2\tsnd_soc_dapm_put_volsw\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x495426ee\tv4l2_ctrl_get_name\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x16756dc0\tsnd_usbmidi_input_start\tsound/usb/snd-usbmidi-lib\tEXPORT_SYMBOL\n0x9fe1a2f8\trt2x00lib_dmadone\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x9223cd23\thci_free_dev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x1bb4d9e6\tmwifiex_handle_rx_packet\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xf3842d62\tssb_device_disable\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xd9e650e5\tsnd_pcm_open_substream\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x266eb657\tsnd_soc_set_runtime_hwparams\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3180544f\tnf_ct_l3protos\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x5206509b\tsnd_device_free\tsound/core/snd\tEXPORT_SYMBOL\n0x099b51e8\tsnd_ac97_update\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0xc4506705\tau8522_release_state\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x354dae65\tem28xx_stop_urbs\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xf5887f62\tsnd_soc_debugfs_root\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x325ed1eb\tmddev_congested\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xa238aacf\tv4l2_i2c_subdev_init\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x831f29f5\tv4l2_i2c_subdev_addr\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x55f7778b\tnf_ct_seq_adjust\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xb19a4acb\ti2400m_dev_bootstrap\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x67730346\tsnd_pcm_period_elapsed\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x9a5326f8\tsnd_soc_read\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x57548e0c\tiscsi_tcp_segment_unmap\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x49a4fcbd\tadxl34x_remove\tdrivers/input/misc/adxl34x\tEXPORT_SYMBOL_GPL\n0xc5fe173b\tv4l2_ctrl_cluster\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x682f1a08\tcdrom_media_changed\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0x44afd0be\tv4l2_event_pending\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0xab08db64\tiscsi_tcp_dgst_header\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x87681719\tip_tunnel_setup\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x2541a979\tsnd_soc_calc_frame_size\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x69f96c52\tdib0090_update_rframp_7090\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0xbb6f057f\tw1_ds2760_read\tdrivers/w1/slaves/w1_ds2760\tEXPORT_SYMBOL\n0x1583ee05\tcxd2820r_attach\tdrivers/media/dvb-frontends/cxd2820r\tEXPORT_SYMBOL\n0x0cafd473\tusb_wwan_write_room\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x35b4e438\tw1_ds2760_write\tdrivers/w1/slaves/w1_ds2760\tEXPORT_SYMBOL\n0xd9e91f83\traid6_vgfmul\tlib/raid6/raid6_pq\tEXPORT_SYMBOL\n0x14fe20b2\tsnd_soc_dapm_free\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xac1bb980\tunregister_cdrom\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xedd5c260\tvb2_fop_write\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xb5c93e6b\tirias_add_integer_attrib\tnet/irda/irda\tEXPORT_SYMBOL\n0xa918aa1c\trt2x00usb_register_read_async\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xd859ac8c\to2net_fill_node_map\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x34fea69e\tath9k_hw_reset_tsf\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x8e6c7453\t__lbtf_cmd\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0xb9340bd0\tip_tunnel_dellink\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x345e8f7c\tdvb_usb_device_init\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0x4f722cb2\tath9k_hw_setrxfilter\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x00fd9b0d\tath9k_hw_getrxfilter\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x78bcf500\tip_tunnel_init_net\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x636b12c8\tnf_nat_need_gre\tnet/ipv4/netfilter/nf_nat_proto_gre\tEXPORT_SYMBOL_GPL\n0x510a7830\ti2400m_tx\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x0c6c7487\ti2400m_rx\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x16defcb5\tlc_reset\tlib/lru_cache\tEXPORT_SYMBOL\n0xeb0a9a69\tsnd_soc_dapm_del_routes\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xbd070765\tinput_register_polled_device\tdrivers/input/input-polldev\tEXPORT_SYMBOL\n0x3367afe4\tflexcop_device_initialize\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x75041bb4\tssb_pmu_set_ldo_paref\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x43ca2913\tcfg80211_chandef_usable\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x46f07ae0\tv4l2_ctrl_new_std\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x5ef1b8fc\tmdiobus_register\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xd360d6e7\tar9003_get_pll_sqsum_dvc\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x90339c28\tar9003_paprd_is_done\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x5ab78455\tusb_serial_generic_write\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x35ae9ca0\tdlmlock\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0x83544dee\tppp_register_net_channel\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x50afd128\tsnd_timer_interrupt\tsound/core/snd-timer\tEXPORT_SYMBOL\n0xf13281e3\tmd_register_thread\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xadb320dc\tmwifiex_process_hs_config\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x475e158a\tsynth_request_region\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x0614dd5a\tv4l2_video_std_frame_period\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xcccafe99\tieee80211_stop_tx_ba_session\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x14b740e3\tbitmap_endwrite\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x87db9f66\tgeneric_rndis_bind\tdrivers/net/usb/rndis_host\tEXPORT_SYMBOL_GPL\n0x7d9fd3ce\tp9_client_wstat\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x00885156\tbt_accept_dequeue\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x41b4bd43\tzl10039_attach\tdrivers/media/dvb-frontends/zl10039\tEXPORT_SYMBOL\n0x7d164441\tvideobuf_mmap_mapper\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0xde8539f3\thdlcdrv_unregister\tdrivers/net/hamradio/hdlcdrv\tEXPORT_SYMBOL\n0x301fa107\tath9k_hw_getnf\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x501e0ec6\tusb_wwan_close\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0xcf9f3328\tdlm_release_lockspace\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0xb3b29a0f\tp9_client_xattrcreate\tnet/9p/9pnet\tEXPORT_SYMBOL_GPL\n0x8b32b781\t__ieee80211_get_radio_led_name\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x8a6e9eba\trt2x00mac_tx_frames_pending\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xd1cfca9b\tcdrom_check_events\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xb9834c11\ti2400m_setup\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0xe16ebc35\trt2x00mac_get_stats\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x8380c87a\tsnd_soc_dapm_ignore_suspend\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x664e40f9\tsnd_ac97_resume\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x2ac83ef9\tvchan_find_desc\tdrivers/dma/virt-dma\tEXPORT_SYMBOL_GPL\n0x7beaab53\tv4l2_s_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x57c3bbad\tp9_client_readdir\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x8d44f107\tp9dirent_read\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x477da2bc\tl2cap_unregister_user\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x2d549a04\tieee80211_queue_work\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xaf943e03\tsnd_soc_dapm_weak_routes\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x5b88faf6\tcx2341x_ext_ctrls\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0xbd805968\tv4l2_ctrl_subdev_subscribe_event\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xb5a04ce8\tp54_free_skb\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0xed590cbf\tl2tp_tunnel_find\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x3e0e8b1b\tsnd_pcm_hw_param_first\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x614fcdd6\tsnd_soc_jack_add_zones\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc3618f86\tdvb_usbv2_generic_rw\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0xd52f27e3\tqtree_write_dquot\tfs/quota/quota_tree\tEXPORT_SYMBOL\n0x99037cf0\tip6t_unregister_table\tnet/ipv6/netfilter/ip6_tables\tEXPORT_SYMBOL\n0xd94ed671\tsnd_pcm_new\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xefe18a30\tath9k_hw_computetxtime\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xd862a7e9\tif_usb_prog_firmware\tdrivers/net/wireless/libertas_tf/libertas_tf_usb\tEXPORT_SYMBOL_GPL\n0x4e1946b1\tircomm_control_request\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0x38b47ea7\t_snd_pcm_lib_alloc_vmalloc_buffer\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x4fafb8d7\tsnd_soc_get_dai_substream\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xf9195aeb\tv4l2_s_ext_ctrls\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xba56af05\tath9k_hw_init_btcoex_hw\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x90ff6c9f\tnf_ct_invert_tuplepr\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x7281c750\tsnd_soc_dapm_sync\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x57329e93\tar9003_paprd_create_curve\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x8a490c90\trfkill_set_sw_state\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x0b442e87\tsnd_dmaengine_pcm_open\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x2a1bd5e7\tsnd_soc_bulk_write_raw\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x46296ed7\tath9k_hw_gpio_get\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xc57e4d74\tsnd_soc_free_ac97_codec\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xf3251e7b\tv4l2_norm_to_name\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xdd609675\tieee80211_csa_finish\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x0b47e864\tieee80211_stop_queue\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x7ef39823\tieee80211_hdrlen\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x632848b7\tsmscore_register_device\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x06a3ee58\tirias_new_integer_value\tnet/irda/irda\tEXPORT_SYMBOL\n0x0c915bb8\tdm_io\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xce952ec8\tp9_client_clunk\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xdee32223\tdm_suspended\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x2a607f20\trt2x00lib_get_bssidx\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x8f24a392\tdib7000m_attach\tdrivers/media/dvb-frontends/dib7000m\tEXPORT_SYMBOL\n0x1ed8c6d9\tdib7000p_attach\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xe875fb1b\tip_vs_conn_put\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x1d9b4c92\tvb2_read\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x93454db7\trndis_status\tdrivers/net/usb/rndis_host\tEXPORT_SYMBOL_GPL\n0xa340422e\tirlmp_disconnect_request\tnet/irda/irda\tEXPORT_SYMBOL\n0xdd2b44b4\tirttp_disconnect_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x71fee72e\tdvb_dmx_swfilter_packets\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xf53ccc92\tocfs2_plock\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xc0edbc0e\tlc_del\tlib/lru_cache\tEXPORT_SYMBOL\n0x5f04388b\tget_phy_device\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xab3d1f95\tnf_ct_untracked_status_or\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x7a26ec30\tsnd_jack_set_key\tsound/core/snd\tEXPORT_SYMBOL\n0xc96e70ac\tdlm_posix_lock\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0xe466c54f\tdib0090_set_vga\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x4905e0bd\tiriap_getvaluebyclass_request\tnet/irda/irda\tEXPORT_SYMBOL\n0xe6ffd448\tprint_tuple\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x606b2ee0\tsnd_soc_dai_set_clkdiv\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xf88e7f78\tem28xx_audio_analog_set\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x8e1fcef2\tvb2_ioctl_create_bufs\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x3e292b64\trt2800_wait_wpdma_ready\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xf741c793\tzlib_deflateEnd\tlib/zlib_deflate/zlib_deflate\tEXPORT_SYMBOL\n0xa32b2ffe\tsnd_rawmidi_transmit_empty\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x3c271227\tsnd_timer_open\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x133313cb\tserio_unregister_driver\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x462ce8fa\tdvb_dmx_init\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xe6a4196b\tv9fs_get_trans_by_name\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xaed07e88\tax25_listen_release\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xee7ea4fc\tsnd_jack_set_parent\tsound/core/snd\tEXPORT_SYMBOL\n0x58046561\trc_repeat\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x88fe1d74\tebt_unregister_table\tnet/bridge/netfilter/ebtables\tEXPORT_SYMBOL\n0x883c2740\t__cookie_v6_init_sequence\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x858107ac\tip_set_type_register\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x08df3d1d\tnat_rtp_rtcp_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0xc9e81a28\tip6t_do_table\tnet/ipv6/netfilter/ip6_tables\tEXPORT_SYMBOL\n0x10d252b8\tgameport_start_polling\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0x7f7a3607\tnf_ct_expect_init\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x04e1b99f\tsnd_pcm_std_chmaps\tsound/core/snd-pcm\tEXPORT_SYMBOL_GPL\n0xec3c1d6c\tsnd_unregister_oss_device\tsound/core/snd\tEXPORT_SYMBOL\n0x390a3c09\tdm_get_mapinfo\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xbc8e934a\tmddev_suspend\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x876f669b\tdibx000_get_i2c_adapter\tdrivers/media/dvb-frontends/dibx000_common\tEXPORT_SYMBOL\n0x347ecd67\tspk_var_show\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x0d46a0e2\tip_tunnel_changelink\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x5a157ae4\tnfs4_acl_get_whotype\tfs/nfsd/nfsd\tEXPORT_SYMBOL\n0x4b914aef\tmt312_attach\tdrivers/media/dvb-frontends/mt312\tEXPORT_SYMBOL\n0xe41ed553\tmt352_attach\tdrivers/media/dvb-frontends/mt352\tEXPORT_SYMBOL\n0x7f584e1f\tfuse_sync_release\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x7f324076\tcx231xx_send_gpio_cmd\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x85445d1e\tif_usb_reset_device\tdrivers/net/wireless/libertas_tf/libertas_tf_usb\tEXPORT_SYMBOL_GPL\n0xe3e75e8b\tnf_conntrack_alter_reply\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xde22a02d\tsnd_soc_update_bits\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x4981ea1f\tv4l2_ctrl_subdev_log_status\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x532bb48d\tiscsi_queuecommand\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xc6dc8c2f\tdlm_new_lockspace\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0xf1bebb99\tcfg80211_unlink_bss\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x60895038\tp9_client_xattrwalk\tnet/9p/9pnet\tEXPORT_SYMBOL_GPL\n0x623cdb08\tip_tunnel_xmit\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0xe5389ebe\tvideobuf_read_stream\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0xd1bacdd6\tath9k_hw_setpower\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x093fe480\thostap_set_roaming\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x9321df95\tdlm_lock\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0x132d792e\tnf_ct_helper_expectfn_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xa2ac3388\tssb_clockspeed\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x40a7984a\txfrm4_tunnel_register\tnet/ipv4/tunnel4\tEXPORT_SYMBOL\n0x6b578815\txfrm6_tunnel_register\tnet/ipv6/tunnel6\tEXPORT_SYMBOL\n0x1866674a\tnf_ct_get_tuple\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x9051fa44\tir_raw_event_store_edge\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xdef8162e\tbrcmu_pktq_peek_tail\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0xf3e21480\tbrcmu_pktq_penq_head\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x99fde2af\tbrcmu_pktq_pdeq_tail\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x7718b4a2\trt2x00queue_stop_queue\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xfbec5568\tw1_read_8\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x41e1f7c0\tp9_client_readlink\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x93a29d45\tnf_nat_icmpv6_reply_translation\tnet/ipv6/netfilter/nf_nat_ipv6\tEXPORT_SYMBOL_GPL\n0xe3cafbd7\tircomm_open\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0xc9e661a4\tsnd_pcm_lib_ioctl\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xc8269f94\tsnd_soc_params_to_frame_size\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xd7bbb676\tlc_seq_printf_stats\tlib/lru_cache\tEXPORT_SYMBOL\n0x1d25917a\tircomm_close\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0x266a91a1\tv4l2_device_register\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0xae4bd21c\tip6_append_data\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x9d3a1b79\tcast5_setkey\tcrypto/cast5_generic\tEXPORT_SYMBOL_GPL\n0xc3e4c127\tttpci_eeprom_decode_mac\tdrivers/media/pci/ttpci/ttpci-eeprom\tEXPORT_SYMBOL\n0xbbd15a51\tspeakup_start_ttys\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xa1425906\tieee80211_channel_to_frequency\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x733b4455\tdvb_register_frontend\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xc766ae09\tsynth_printf\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x15fe0cd3\traid6_gfexp\tlib/raid6/raid6_pq\tEXPORT_SYMBOL\n0x49e26379\tdib3000mb_attach\tdrivers/media/dvb-frontends/dib3000mb\tEXPORT_SYMBOL\n0xfb61fd5b\tdib3000mc_attach\tdrivers/media/dvb-frontends/dib3000mc\tEXPORT_SYMBOL\n0xdaf7509f\txt_check_match\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x9313b4a3\tipcomp_init_state\tnet/xfrm/xfrm_ipcomp\tEXPORT_SYMBOL_GPL\n0x611fedbb\tts2020_attach\tdrivers/media/dvb-frontends/ts2020\tEXPORT_SYMBOL\n0x4449e1dd\tsynth_buffer_clear\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x78f9b710\tnf_ct_l3proto_try_module_get\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xe76d3ee5\tsnd_soc_unregister_component\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x550e0453\tmxl5005s_attach\tdrivers/media/tuners/mxl5005s\tEXPORT_SYMBOL\n0xd7ba575e\tdlm_errmsg\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0x1c2898e9\tdib8000_remove_slave_frontend\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xa82a8645\to2nm_this_node\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x9a888082\tsynth_buffer_getc\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x85478a0b\tinet6_hash_frag\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xd9371dfe\tsnd_component_add\tsound/core/snd\tEXPORT_SYMBOL\n0xc2821775\ttuner_count\tdrivers/media/tuners/tuner-types\tEXPORT_SYMBOL\n0x8a81bf0e\thostap_set_encryption\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x74f82159\tip6t_alloc_initial_table\tnet/ipv6/netfilter/ip6_tables\tEXPORT_SYMBOL_GPL\n0x76edb12b\tsmscore_unregister_hotplug\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x1722e9ed\tsi21xx_attach\tdrivers/media/dvb-frontends/si21xx\tEXPORT_SYMBOL\n0x1a34bf5a\tvb2_get_contig_userptr\tdrivers/media/v4l2-core/videobuf2-memops\tEXPORT_SYMBOL_GPL\n0x397f6231\tip_set_free\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x29519ecb\tnf_nat_mangle_udp_packet\tnet/netfilter/nf_nat\tEXPORT_SYMBOL\n0xa4b4e4e5\twimax_reset\tnet/wimax/wimax\tEXPORT_SYMBOL\n0xabdec76f\tsnd_soc_dapm_get_pin_status\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb1425b32\tdm_table_add_target_callbacks\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x7c576277\tsmsendian_handle_message_header\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xe8a74db3\thostap_80211_rx\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x5d6d971b\tiscsi_itt_to_ctask\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xd5d87b6c\tiscsi_tcp_recv_segment_is_hdr\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0xece11f59\tieee80211_restart_hw\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xa92a2d85\tnfc_class\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x06949c5f\tinput_ff_create_memless\tdrivers/input/ff-memless\tEXPORT_SYMBOL_GPL\n0xb8c01521\tnxt6000_attach\tdrivers/media/dvb-frontends/nxt6000\tEXPORT_SYMBOL\n0xa8e8c668\tnf_ct_l4proto_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xb7164b78\tnf_ct_l3proto_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x4b015768\tsnd_iprintf\tsound/core/snd\tEXPORT_SYMBOL\n0x18bf05c0\ti2c_bit_add_numbered_bus\tdrivers/i2c/algos/i2c-algo-bit\tEXPORT_SYMBOL\n0xaeb979ea\tip6_redirect\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x872f9878\tieee80211_sched_scan_results\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x695eb509\tsnd_soc_lookup_platform\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x401a4aee\tath9k_hw_setup_statusring\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x829b8df1\tnf_nat_setup_info\tnet/netfilter/nf_nat\tEXPORT_SYMBOL\n0xb9f7029a\tnf_ct_unlink_expect_report\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x22f20428\twimax_msg\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0xb3b30f47\twimax_dev_add\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x44a7ee6a\txt_unregister_matches\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xb2638fa4\tbtmrvl_register_hdev\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x6efeb75d\tmedia_entity_init\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x9d507ad6\tm88rs2000_attach\tdrivers/media/dvb-frontends/m88rs2000\tEXPORT_SYMBOL\n0xc5917002\tiscsi_update_cmdsn\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xc34d45a0\tusb_cdc_wdm_register\tdrivers/usb/class/cdc-wdm\tEXPORT_SYMBOL\n0x07d3647c\tirlmp_register_service\tnet/irda/irda\tEXPORT_SYMBOL\n0xefbd6e6d\tsnd_soc_jack_new\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x080b81d8\t__gameport_register_driver\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0xbe745aef\tsync_page_io\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x6d95abd0\tbrcmu_pkt_buf_get_skb\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x92d59f53\tl2tp_xmit_skb\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0xf6080363\t__ieee80211_get_tx_led_name\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x4145886c\tsnd_pcm_new_stream\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x77a45039\tsnd_ac97_pcm_close\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x6327bcce\tau8522_analog_i2c_gate_ctrl\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x2d903538\tmc44s803_attach\tdrivers/media/tuners/mc44s803\tEXPORT_SYMBOL\n0x7a3cd015\tv4l2_ctrl_get_menu\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xd040f690\tst_register\tdrivers/misc/ti-st/st_drv\tEXPORT_SYMBOL_GPL\n0xa2975744\tiscsi_itt_to_task\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x5b814880\tinet6_csk_update_pmtu\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xe071ceff\tsnd_soc_jack_free_gpios\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x59a8d418\tvideobuf_queue_vmalloc_init\tdrivers/media/v4l2-core/videobuf-vmalloc\tEXPORT_SYMBOL_GPL\n0x36cb7af6\tusb_serial_suspend\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL\n0xf5a50227\tphy_init_eee\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xf4a111d8\tp9_idpool_create\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x315960aa\tir_raw_event_set_idle\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x1fc64781\tgspca_frame_add\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0x83b35c79\tath6kl_cfg80211_suspend\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0xbc700e20\tsnd_rawmidi_info_select\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0xda91da8d\tsnd_timer_global_register\tsound/core/snd-timer\tEXPORT_SYMBOL\n0xe4c6aedf\tppp_output_wakeup\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x80f1b3a6\txfrm6_rcv\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x352e2783\tirlmp_connect_response\tnet/irda/irda\tEXPORT_SYMBOL\n0x837a94b4\tirttp_connect_response\tnet/irda/irda\tEXPORT_SYMBOL\n0x3db16f5a\tl2tp_session_find\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0xe0d7efaa\tsnd_ac97_update_bits\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0xad2e0e55\tsnd_soc_unregister_platform\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3558d8d2\tasync_raid6_2data_recov\tcrypto/async_tx/async_raid6_recov\tEXPORT_SYMBOL_GPL\n0x3e1f9c7a\tath9k_hw_wow_enable\tdrivers/net/wireless/ath/ath9k/ath9k\tEXPORT_SYMBOL\n0x2e165030\tlbs_host_sleep_cfg\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0xb61a0c3b\tbt_err\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xf4c6397f\tsnd_soc_dpcm_can_be_params\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc31b8497\tbtmrvl_check_evtpkt\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x74ee9098\tsms_board_load_modules\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xd43fd58e\tphy_connect\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x43367e65\tcfg80211_put_bss\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xd1fdc80a\tstv6110x_attach\tdrivers/media/dvb-frontends/stv6110x\tEXPORT_SYMBOL\n0xbc5671dc\tv4l_printk_ioctl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x7929963f\tv4l2_ctrl_find\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xbac4a225\tv4l2_ctrl_fill\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x90d40ef1\tath9k_cmn_init_crypto\tdrivers/net/wireless/ath/ath9k/ath9k_common\tEXPORT_SYMBOL\n0xb3c528be\tvchan_tx_submit\tdrivers/dma/virt-dma\tEXPORT_SYMBOL_GPL\n0x8d8ca98e\tbitmap_resize\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x85c8e6db\ttda18212_attach\tdrivers/media/tuners/tda18212\tEXPORT_SYMBOL\n0x85669de0\ttda18218_attach\tdrivers/media/tuners/tda18218\tEXPORT_SYMBOL\n0xc4243818\tem28xx_init_usb_xfer\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x1ad073cc\tvb2_put_vma\tdrivers/media/v4l2-core/videobuf2-memops\tEXPORT_SYMBOL_GPL\n0x8905e8b3\tspeakup_info\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x06c8e1c8\tircomm_data_request\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0x774f54a5\trt2x00queue_stop_queues\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x3c6a6169\twimax_report_rfkill_sw\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x651292e1\tsnd_soc_info_xr_sx\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x08aa6fb7\tcast_s1\tcrypto/cast_common\tEXPORT_SYMBOL_GPL\n0xfb25f454\tdvb_ringbuffer_write\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xf36dcb9e\tcx231xx_unregister_extension\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL\n0x02fbe80d\tdibusb_dib3000mc_frontend_attach\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x0392f8cb\tlbs_start_card\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x5c0534e8\tiscsi_tcp_recv_skb\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x9bb4825b\txt_table_unlock\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x0fc0fb9b\tv4l2_clk_disable\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x97a4e8bb\tphy_find_first\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xda45bc09\tnfs4_acl_new\tfs/nfsd/nfsd\tEXPORT_SYMBOL\n0x51c60420\tsnd_soc_add_platform_controls\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x39c38b7c\tcma3000_init\tdrivers/input/misc/cma3000_d0x\tEXPORT_SYMBOL\n0x89d9444e\tcma3000_exit\tdrivers/input/misc/cma3000_d0x\tEXPORT_SYMBOL\n0x84f1732b\tcx231xx_dev_init\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xd6e1ec0b\tqtree_read_dquot\tfs/quota/quota_tree\tEXPORT_SYMBOL\n0x2850cdb9\tp9_client_begin_disconnect\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x0ca9ba7d\txfrm6_tunnel_spi_lookup\tnet/ipv6/xfrm6_tunnel\tEXPORT_SYMBOL\n0x9e4faeef\tdm_io_client_destroy\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x4e8ea5bd\tcx231xx_uninit_bulk\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x6cf7d171\tv4l2_subdev_init\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xb42289d2\tulist_alloc\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0x2d0f99e5\tprint_ssid\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0x1c9aba60\tsnd_seq_kernel_client_write_poll\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x3075470a\tmacvlan_common_setup\tdrivers/net/macvlan\tEXPORT_SYMBOL_GPL\n0x0f5bf033\tbtmrvl_enable_hs\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x117a9e4e\tbtmrvl_enable_ps\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x7709d71a\tdib0090_set_dc_servo\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x6e407b51\tssb_bus_suspend\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x45ae099f\tieee80211_report_wowlan_wakeup\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x578ab17a\tip_set_get_ip6_port\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0xfa545abf\tip_set_get_ip4_port\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x22b79bdf\tsnd_soc_jack_notifier_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x0ec48416\tfc2580_attach\tdrivers/media/tuners/fc2580\tEXPORT_SYMBOL\n0xce1f4cf3\trt2x00usb_flush_queue\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xa1b173aa\tasync_wrap_skb\tnet/irda/irda\tEXPORT_SYMBOL\n0x5c6569a8\tcfg80211_wext_giwretry\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x1cb231d0\tmlog_not_bits\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x4f4eb077\tlg2160_attach\tdrivers/media/dvb-frontends/lg2160\tEXPORT_SYMBOL\n0xf84f2022\tp9_idpool_put\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x3dcd5baa\tnf_conntrack_l4proto_tcp6\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xbe52f22d\tsnd_seq_device_new\tsound/core/seq/snd-seq-device\tEXPORT_SYMBOL\n0xcd3e45b8\tdvb_dmx_swfilter\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xdc583c08\tdlm_unlock\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0xe39c6495\tcfg80211_remain_on_channel_expired\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x57700bb8\tsnd_seq_create_kernel_client\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x90172466\tl2tp_session_find_nth\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x4dc208d0\tsnd_soc_codec_volatile_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x601f665f\tdm_io_client_create\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xfe489c51\tvb2_ioctl_prepare_buf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xa7587646\tcrc7\tlib/crc7\tEXPORT_SYMBOL\n0x6e39ff59\tlib80211_register_crypto_ops\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0x1bbd9200\ttea5761_attach\tdrivers/media/tuners/tea5761\tEXPORT_SYMBOL_GPL\n0x3b5e665b\tinet_diag_dump_one_icsk\tnet/ipv4/inet_diag\tEXPORT_SYMBOL_GPL\n0x2c330835\tnf_nat_packet\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0xbb893158\tnf_nat_used_tuple\tnet/netfilter/nf_nat\tEXPORT_SYMBOL\n0xb01932bf\tcdrom_get_media_event\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0x1e7e8bd2\tdm_set_target_max_io_len\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x02b2ceb5\tv4l2_ctrl_g_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xe848ac22\tiscsi_tcp_hdr_recv_prep\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x8d054c09\tusb_ftdi_elan_edset_input\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x7ab3ab98\tsnd_midi_event_decode\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x860295b9\tsnd_soc_dapm_get_value_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc805fc53\tsnd_soc_dapm_put_value_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xbc46f176\tdib0090_get_current_gain\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x4c5caa81\tlc_committed\tlib/lru_cache\tEXPORT_SYMBOL\n0x0d26c394\txfrm4_mode_tunnel_input_deregister\tnet/ipv4/xfrm4_mode_tunnel\tEXPORT_SYMBOL_GPL\n0x75a74f2d\t__l2tp_session_unhash\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x12992205\txt_proto_init\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x63222b29\tsmsclient_sendrequest\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xf14e4160\tphy_device_free\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xa30c2326\trtl2832_attach\tdrivers/media/dvb-frontends/rtl2832\tEXPORT_SYMBOL\n0xe851e9be\tradio_tea5777_exit\tdrivers/media/radio/shark2\tEXPORT_SYMBOL_GPL\n0x0199ec46\tath6kl_info\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0xff7cd681\tath9k_hw_puttxbuf\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x68d7c2a6\tath9k_hw_putrxbuf\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xc0f81b99\thostap_set_hostapd\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x6155d530\tcx2341x_handler_set_busy\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x72e927db\tiriap_open\tnet/irda/irda\tEXPORT_SYMBOL\n0x9f11bdaa\tirlap_open\tnet/irda/irda\tEXPORT_SYMBOL\n0x58991d6e\tsnd_ctl_notify\tsound/core/snd\tEXPORT_SYMBOL\n0x77eb50e5\tmedia_device_unregister_entity\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x64551e75\thostap_init_proc\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x69d53683\tiriap_close\tnet/irda/irda\tEXPORT_SYMBOL\n0x4404a2ae\tirlap_close\tnet/irda/irda\tEXPORT_SYMBOL\n0xca01eea7\tsnd_pcm_hw_constraint_step\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xf7915b0e\tdibx000_i2c_set_speed\tdrivers/media/dvb-frontends/dibx000_common\tEXPORT_SYMBOL\n0x650359df\tw1_register_family\tdrivers/w1/wire\tEXPORT_SYMBOL\n0x7fe1a403\tcfg80211_find_ie\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x55236710\tnf_nat_pptp_hook_inbound\tnet/netfilter/nf_conntrack_pptp\tEXPORT_SYMBOL_GPL\n0xa2eec2e8\tulist_fini\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0x7e2ee765\tulist_free\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0xf4ca620b\tnfulnl_log_packet\tnet/netfilter/nfnetlink_log\tEXPORT_SYMBOL_GPL\n0x850867d3\tvb2_fop_mmap\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x1f1a0661\tusb_wwan_port_probe\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL_GPL\n0xefdd6d4b\tieee80211_remain_on_channel_expired\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0xb2cb4fae\tset_sig_addr_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0x725704bc\tflexcop_wan_set_speed\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x3bcaf074\tsmscore_start_device\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x53105839\tv4l2_detect_cvt\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0x7eaf8e7a\tv4l2_detect_gtf\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0xd54aa77d\tv4l2_clk_set_rate\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x6da0b487\tv4l2_clk_get_rate\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x5c4ffd98\trt2800_disable_radio\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x7347f17e\tdvb_frontend_resume\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x70e85295\tserio_unregister_port\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x3824a2de\tdm_underlying_device_busy\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0xf0a28f7d\tv4l2_ctrl_s_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xca861162\tath9k_hw_setantenna\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x28a86688\txt_hook_unlink\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x687066ad\tdvb_ringbuffer_read\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x68a24153\tsnd_pcm_format_physical_width\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x01d2f9ac\tdm_rh_recovery_start\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x372faa9a\tdvb_pll_attach\tdrivers/media/dvb-frontends/dvb-pll\tEXPORT_SYMBOL\n0xd9267224\tv4l2_querymenu\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x330a69bb\tiscsi_eh_target_reset\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xe4520ea2\tsnd_soc_suspend\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xe4183d73\tcx2341x_handler_init\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x91c9a325\tbt_to_errno\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xd950e320\tebt_register_table\tnet/bridge/netfilter/ebtables\tEXPORT_SYMBOL\n0x391ca4a3\tv4l2_ctrl_sub_ev_ops\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x285fa819\tath9k_hw_releasetxqueue\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x0ec355a0\trt2800_reset_tuner\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x9fa64b1f\tnf_nat_seq_adjust_hook\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x7a8ae24c\tad714x_disable\tdrivers/input/misc/ad714x\tEXPORT_SYMBOL\n0x021957e1\traid6_datap_recov\tlib/raid6/raid6_pq\tEXPORT_SYMBOL_GPL\n0x0789e264\tnf_ip6_checksum\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x24932c30\trt2x00usb_initialize\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x548e4266\tasync_unwrap_char\tnet/irda/irda\tEXPORT_SYMBOL\n0x1de6b9b9\tcfg80211_rx_mlme_mgmt\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x0087c3ef\tcfg80211_tx_mlme_mgmt\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x25ebb8f6\tsnd_soc_dai_set_pll\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x56fffbad\tp9_tag_lookup\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xaeb7451e\tax25_defaddr\tnet/ax25/ax25\tEXPORT_SYMBOL_GPL\n0x85ade087\tsnd_soc_add_platform\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x090a7fff\tmfd_cell_enable\tdrivers/mfd/mfd-core\tEXPORT_SYMBOL\n0x8358cb9e\tlbs_add_card\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x5a6502c7\tlc_seq_dump_details\tlib/lru_cache\tEXPORT_SYMBOL\n0xd96687ee\tcx231xx_init_bulk\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xfb57a611\tip_vs_nfct_expect_related\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x7b1540da\tsnd_pcm_lib_preallocate_pages_for_all\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x0c4ce83f\tqtree_entry_unused\tfs/quota/quota_tree\tEXPORT_SYMBOL\n0xce45a6f1\traid6_gfexi\tlib/raid6/raid6_pq\tEXPORT_SYMBOL\n0xa95f6bd3\tdm_snap_origin\tdrivers/md/dm-snapshot\tEXPORT_SYMBOL\n0xa1b1c15a\ttun_get_socket\tdrivers/net/tun\tEXPORT_SYMBOL_GPL\n0xcc1fb551\tbaswap\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x48a98028\tcfg80211_cqm_txe_notify\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x6e47bcbc\tdm_noflush_suspending\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0xb12300aa\trt2800_ampdu_action\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x883eac75\tsnd_card_unref\tsound/core/snd\tEXPORT_SYMBOL\n0xa63d85ab\tslhc_remember\tdrivers/net/slip/slhc\tEXPORT_SYMBOL\n0x0a83266c\tp9_client_remove\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x729d23c1\tp9_client_rename\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xfaf6969f\tsnd_rawmidi_kernel_open\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x51b8e4fc\trt2800_wait_csr_ready\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x40929abd\tiscsi_complete_pdu\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x4e0aaf99\tsnd_ctl_boolean_mono_info\tsound/core/snd\tEXPORT_SYMBOL\n0x8edcb8fb\tlib80211_crypt_info_free\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0x3926693b\tsnd_soc_of_parse_card_name\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x0a7d8d69\tdibusb_power_ctrl\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x09c64fbd\tieee80211_frequency_to_channel\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xf18c9b6e\tsnd_soc_add_card_controls\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x4e2481d5\tath_is_world_regd\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0xe0c75a98\tnf_ct_remove_expectations\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xb022adb5\trt2x00lib_pretbtt\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x1ce67f1d\tnfnetlink_unicast\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0x2c3da1dc\tsnd_mixer_oss_ioctl_card\tsound/core/oss/snd-mixer-oss\tEXPORT_SYMBOL\n0x57b6007e\tcdrom_mode_select\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xfd878403\tdibusb2_0_streaming_ctrl\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0xda0578ff\tar9003_paprd_enable\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x07c5d00d\tiscsi_tcp_task_xmit\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x7c3cf667\tusb_serial_generic_throttle\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xd688716b\tdm_kcopyd_client_create\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xb02df414\trc_map_register\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xf4c07ce1\tv4l2_fh_add\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0xefdbb811\tiscsi_tcp_conn_setup\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0xecd70345\tnf_conntrack_in\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xd5a3723d\tsnd_pcm_lib_preallocate_free_for_all\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x285dee4a\tserio_interrupt\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0xc18f5014\trc_unregister_device\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x831abb7e\tath9k_hw_set_gpio\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xed0f50b3\tp54_rx\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x36ab34ff\taarp_send_ddp\tnet/appletalk/appletalk\tEXPORT_SYMBOL\n0x028de13f\tmd_set_array_sectors\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xb8e408d0\tflexcop_dump_reg\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x6becd1aa\tem28xx_alloc_urbs\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xa12ad27f\thostap_dump_tx_header\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xb2a945e0\thostap_dump_rx_header\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xdadb0034\tw1_ds2780_eeprom_cmd\tdrivers/w1/slaves/w1_ds2780\tEXPORT_SYMBOL\n0x1db94660\tw1_ds2781_eeprom_cmd\tdrivers/w1/slaves/w1_ds2781\tEXPORT_SYMBOL\n0xca6e8efd\tcfg80211_ref_bss\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xe2e7840d\tregmap_init_mmio_clk\tdrivers/base/regmap/regmap-mmio\tEXPORT_SYMBOL_GPL\n0x998dc041\tsnd_unregister_device\tsound/core/snd\tEXPORT_SYMBOL\n0xdff5b524\tmicrotune_attach\tdrivers/media/tuners/mt20xx\tEXPORT_SYMBOL_GPL\n0xc4b44ebc\tiscsi_put_task\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xde4aada5\txt_request_find_match\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x3c92c5af\tcx231xx_demod_reset\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x36d3d94c\tdibusb2_0_power_ctrl\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x7c2f2afb\tw1_calc_crc8\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0xee83a4f3\tcast_s4\tcrypto/cast_common\tEXPORT_SYMBOL_GPL\n0xa3fac8c4\tvb2_qbuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x26ba5026\tvideo_usercopy\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x7ebf8dd7\trt2x00mac_sta_remove\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x01f84db5\tnf_conntrack_set_hashsize\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x0c9153a2\tmd_done_sync\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xb26b6e6e\tflexcop_i2c_request\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0xc3ea7b51\tmdio_bus_type\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x79a085f8\tusb_ftdi_elan_edset_output\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0xd7842f5b\tl2cap_conn_get\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x08e21fbc\tip6_dst_lookup_flow\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xb8f17f19\tipv6_chk_prefix\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x4479ef51\thashbin_insert\tnet/irda/irda\tEXPORT_SYMBOL\n0x44f64960\tlib80211_crypt_info_init\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0x4830e17e\tip_tunnel_init\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0xbcabd0a8\tip6_xmit\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xa8979049\tw1_remove_master_device\tdrivers/w1/wire\tEXPORT_SYMBOL\n0x448218e8\to2nm_get_node_by_ip\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x98d3819b\tdlm_posix_get\tfs/dlm/dlm\tEXPORT_SYMBOL_GPL\n0x2f2889a0\tgf128mul_init_64k_lle\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x3755f990\tgf128mul_init_64k_bbe\tcrypto/gf128mul\tEXPORT_SYMBOL\n0xf51aee73\t__media_entity_remove_links\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xf9f65c92\tdvb_usb_device_exit\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0xc565d76c\txt_find_match\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xef870589\tsnd_soc_platform_write\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x711c83b5\tserio_reconnect\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0xae016617\tnf_ct_helper_expectfn_find_by_name\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x917f4c4b\tsnd_card_set_id\tsound/core/snd\tEXPORT_SYMBOL\n0xb3dc3465\tar9003_hw_disable_phy_restart\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x6ba33b3c\tlbs_get_firmware_async\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x3771b461\tcrc_ccitt\tlib/crc-ccitt\tEXPORT_SYMBOL\n0x604e41ad\txfrm4_tunnel_deregister\tnet/ipv4/tunnel4\tEXPORT_SYMBOL\n0x061f9bca\txfrm6_tunnel_deregister\tnet/ipv6/tunnel6\tEXPORT_SYMBOL\n0xd4c7872f\tv4l2_ctrl_radio_filter\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x3f7d5257\tp9_client_attach\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x09159227\tieee80211_disable_rssi_reports\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x6d5d4f92\tnf_ct_unexpect_related\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x2b251721\tdib7000p_get_agc_values\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xdb5ace1d\tdibx000_exit_i2c_master\tdrivers/media/dvb-frontends/dibx000_common\tEXPORT_SYMBOL\n0x00c1cdd5\tdibx000_init_i2c_master\tdrivers/media/dvb-frontends/dibx000_common\tEXPORT_SYMBOL\n0x0d9bae4b\tnf_nat_l4proto_nlattr_to_range\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0xab9d363d\tem28xx_write_regs\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x0761ec83\tiscsi_tcp_conn_teardown\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x3c9a504f\tsnd_pcm_hw_constraint_ratdens\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xd1157735\trelease_and_free_resource\tsound/core/snd\tEXPORT_SYMBOL\n0x861b5262\ta8293_attach\tdrivers/media/dvb-frontends/a8293\tEXPORT_SYMBOL\n0xa942b7eb\tssb_pmu_spuravoid_pllupdate\tdrivers/ssb/ssb\tEXPORT_SYMBOL_GPL\n0xf0a147d6\tieee80211_get_tx_rates\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x814adc61\tp9_client_cb\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xf8392f6a\tmedia_entity_graph_walk_next\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x083eb21c\trfkill_unregister\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x45de5af3\tcypress_load_firmware\tdrivers/media/common/cypress_firmware\tEXPORT_SYMBOL\n0x2ba829ad\tath6kl_cfg80211_resume\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0xe2f03ae8\tl2tp_session_queue_purge\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x0eef28c3\tcfg80211_wext_giwfrag\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x19a8a407\tcfg80211_wext_siwfrag\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x52aeba73\talloc_mdio_bitbang\tdrivers/net/phy/mdio-bitbang\tEXPORT_SYMBOL\n0x31694756\tuio_event_notify\tdrivers/uio/uio\tEXPORT_SYMBOL_GPL\n0x1b82fefa\tmd_unplug\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x0de82508\tmt2060_attach\tdrivers/media/tuners/mt2060\tEXPORT_SYMBOL\n0xa0c08ea6\thostap_free_data\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x3d501582\tlbtf_remove_card\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x21768074\tw1_reset_select_slave\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x13e2ccfe\txfrm4_mode_tunnel_input_register\tnet/ipv4/xfrm4_mode_tunnel\tEXPORT_SYMBOL_GPL\n0x45509180\tbitmap_load\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x129b5fcc\tdvb_usb_get_hexline\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0x912195f9\tcfg80211_conn_failed\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x0a04335d\tocfs2_stack_glue_unregister\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xfff78cd7\tcfg80211_rx_spurious_frame\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x3228c312\tvideobuf_read_one\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x61c2dabf\to2hb_unregister_callback\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x117fa8a4\tv4l2_event_subscribe\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0xf0fbdaf4\tsnd_pcm_lib_readv\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x956d2ce1\tphy_driver_unregister\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x7e75c67a\tmxl111sf_demod_attach\tdrivers/media/usb/dvb-usb-v2/mxl111sf-demod\tEXPORT_SYMBOL_GPL\n0xec5ff09c\tath_regd_init\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x055da7e3\tath9k_hw_wait\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x41e6a9d2\tulist_init\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0xdb14822b\tip_tunnel_newlink\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0xd3af3431\tct_sip_parse_numerical_param\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x28fcf54e\tsnd_ac97_set_rate\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x7a4aa78e\tcryptd_free_aead\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xf13491ac\tmdiobus_read\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xd415c7c0\trt2x00mac_add_interface\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xe58a3360\tp9_error_init\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x9fffd09e\tw1_reset_resume_command\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x2aed3724\tir_raw_event_store\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x713c3bd4\tphy_scan_fixups\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x471745d4\tiscsi_boot_create_host_kset\tdrivers/scsi/iscsi_boot_sysfs\tEXPORT_SYMBOL_GPL\n0xf77059b3\tath9k_hw_setuptxqueue\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x8fea24bd\tbt_sock_unregister\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xf6f1bd15\tsnd_timer_resolution\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x2980c524\tdm_rh_dirty_log\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x3738f0e9\tvb2_ops_wait_finish\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xc779be8e\tath9k_hw_set_sta_beacon_timers\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xff5f0182\tinet_diag_register\tnet/ipv4/inet_diag\tEXPORT_SYMBOL_GPL\n0x549ae50f\tieee80211_mandatory_rates\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x57d50818\tsnd_pcm_hw_rule_add\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x54374bff\tau8522_sleep\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x49cf2f50\t__iscsi_complete_pdu\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x96a0ed9b\to2nm_get_node_by_num\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x3b91f3af\tsnd_free_pages\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0x2ba4ae3d\tsnd_card_file_remove\tsound/core/snd\tEXPORT_SYMBOL\n0x453ff2f6\tsnd_dmaengine_pcm_get_chan\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0xf3797152\tsnd_interval_ratnum\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xf6e94aa2\tsnd_ac97_read\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x7f6a7738\ttea5761_autodetection\tdrivers/media/tuners/tea5761\tEXPORT_SYMBOL_GPL\n0xb0891da2\tv4l2_dv_timings_presets\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0xa449ea84\tipv6_dev_get_saddr\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x47e57eea\twimax_msg_send\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x17f8aa00\tsnd_soc_cache_sync\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xe9047be5\tdib0090_gain_control\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x82947fd8\tinet_diag_unregister\tnet/ipv4/inet_diag\tEXPORT_SYMBOL_GPL\n0x049fe6c2\tieee80211_rate_control_register\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xade88e76\tsnd_malloc_pages\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0xfe73ce8e\trt2x00usb_vendor_request_buff\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x7032a274\tl2tp_recv_common\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL\n0xfed4d591\tcfg80211_find_vendor_ie\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x3c7a193a\tsnd_hwdep_new\tsound/core/snd-hwdep\tEXPORT_SYMBOL\n0xc111575a\tsnd_ctl_boolean_stereo_info\tsound/core/snd\tEXPORT_SYMBOL\n0x271aaf31\tath9k_hw_btcoex_set_weight\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x9ec25cca\tfuse_request_send\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x4997ec05\tieee80211_ctstoself_duration\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x3d5581f6\t__ieee80211_get_assoc_led_name\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x0fd2b01d\tsnd_soc_default_readable_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x2131abf8\ttda829x_attach\tdrivers/media/tuners/tda8290\tEXPORT_SYMBOL_GPL\n0x73ca5ed3\tv4l2_ctrl_new_custom\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x1e214d69\tnf_ct_expect_put\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xea71d5f0\tunregister_md_personality\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x7080de87\tiscsi_suspend_tx\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x45de39bb\tfuse_conn_get\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0xa9f5379a\to2net_send_message_vec\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x76760ff2\twimax_dev_init\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x1b8e6792\txfrm6_prepare_output\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xc4ba8a78\tip_vs_tcp_conn_listen\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0xf6d7e5d6\tsnd_pcm_link_rwlock\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xcf166026\tsnd_rawmidi_set_ops\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0xb15bfb0d\tvb2_reqbufs\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xe2694c08\tpingv6_prot\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x7256274b\tsnd_soc_unregister_codec\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x641b8cbc\tspk_var_store\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x673b1089\tezusb_fx1_set_reset\tdrivers/usb/misc/ezusb\tEXPORT_SYMBOL_GPL\n0xf0392180\tlc_try_get\tlib/lru_cache\tEXPORT_SYMBOL\n0xe963817c\tieee80211_ready_on_channel\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0xb3e7c956\tnf_nat_amanda_hook\tnet/netfilter/nf_conntrack_amanda\tEXPORT_SYMBOL_GPL\n0x97413203\tcfg80211_crit_proto_stopped\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xd04e9ebf\tvb2_create_bufs\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x6697f176\tlc_get_cumulative\tlib/lru_cache\tEXPORT_SYMBOL\n0x24e612df\tv9fs_register_trans\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x8d923cb4\tdvb_generic_open\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xf7089e33\tax25_send_frame\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x22cf53d9\te4000_attach\tdrivers/media/tuners/e4000\tEXPORT_SYMBOL\n0xcd175563\tath9k_hw_stopdmarecv\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xed07d085\tsnd_timer_stop\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x5f404cc2\trt2x00queue_for_each_entry\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x0d33652c\tcfg80211_ready_on_channel\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xb938764f\tdib8000_set_wbd_ref\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x923cf60e\ttda18271_attach\tdrivers/media/tuners/tda18271\tEXPORT_SYMBOL_GPL\n0x97eb49e1\tip_tunnel_uninit\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x1573a2a7\txt_replace_table\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x1f3a046e\tlib80211_unregister_crypto_ops\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0xef0d2f59\tdm_dispatch_request\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x754f9518\tiscsi_host_set_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x11a0b73a\tnf_nat_sip_seq_adjust_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0xd4945484\tsnd_midi_event_encode_byte\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x3ae68070\tvb2_plane_cookie\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xc2bb1b06\trt2x00usb_kick_queue\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x1913e51c\tix2505v_attach\tdrivers/media/dvb-frontends/ix2505v\tEXPORT_SYMBOL\n0x237c2971\tstv090x_attach\tdrivers/media/dvb-frontends/stv090x\tEXPORT_SYMBOL\n0x66fece81\tvb2_fop_poll\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x0db5dda4\tphy_start_interrupts\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xc12cf8f8\tv4l2_ctrl_replace\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x18356036\tlbs_stop_card\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0xfce2fc13\tmedia_entity_pipeline_start\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xe50454e7\tirda_register_dongle\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0xc290ae88\tcfg80211_classify8021d\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xdf0bcd29\tcfg80211_cac_event\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xc12d1013\tsnd_soc_register_platform\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x5f5b99f7\tv4l2_clk_get\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xbdc7c270\tar9003_mci_send_message\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xc6bee864\tiscsi_conn_stop\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x18cc8ab9\tvideo_device_release_empty\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xa0ec3792\tled_classdev_resume\tdrivers/leds/led-class\tEXPORT_SYMBOL_GPL\n0x1b712979\tit913x_fe_attach\tdrivers/media/dvb-frontends/it913x-fe\tEXPORT_SYMBOL\n0x3af7522e\tnf_conntrack_lock\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x0a6a4074\tphy_stop\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xec009a44\tp9_client_walk\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x4924bbb9\tiscsi_conn_start\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x62b1639a\tusb_wwan_set_termios\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0xbaeb4700\to2hb_check_node_heartbeating_from_callback\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x2dc25bf8\tieee80211_generic_frame_duration\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x045072cd\tnf_ct_port_nla_policy\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x7599839c\trt2800_check_firmware\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xc8d7691a\tspk_synth_is_alive_restart\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x7f8c99b1\tcn_add_callback\tdrivers/connector/cn\tEXPORT_SYMBOL_GPL\n0xbb7256de\tath9k_hw_disable_mib_counters\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x74c6eb16\thashbin_delete\tnet/irda/irda\tEXPORT_SYMBOL\n0x30e4ebf2\tsnd_cards\tsound/core/snd\tEXPORT_SYMBOL\n0xbc76b128\tmdiobus_free\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x6890f808\tmwifiex_main_process\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xa6a15b8a\tmwifiex_del_virtual_intf\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x0ceec2f1\tnat_q931_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0x6d629c59\tsnd_mpu401_uart_interrupt_tx\tsound/drivers/mpu401/snd-mpu401-uart\tEXPORT_SYMBOL\n0x463fa78e\ttea5767_attach\tdrivers/media/tuners/tea5767\tEXPORT_SYMBOL_GPL\n0x8599af02\tppp_dev_name\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x9aa0e397\tlbs_send_tx_feedback\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0xb3ddba8b\txt_find_table_lock\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0xdc6d21d9\tsnd_dmaengine_pcm_trigger\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0xb9394173\tirias_delete_value\tnet/irda/irda\tEXPORT_SYMBOL\n0x9d4357b2\tir_raw_handler_unregister\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL\n0x38c1c9d8\tip6_frag_init\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x6881336c\twimax_msg_len\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0xf9ae34b8\tsmscore_unregister_device\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x48dfa751\tmedia_entity_put\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xb5cba32b\tmedia_entity_get\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xb2967c52\tl2tp_session_delete\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x54ae7a5e\tcryptd_shash_desc\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xaea22dea\tmwifiex_cancel_hs\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xe6d57936\t__udp6_lib_lookup\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x29a7f926\txt_rateest_put\tnet/netfilter/xt_RATEEST\tEXPORT_SYMBOL_GPL\n0x6976cfe0\tv4l2_valid_dv_timings\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0xbdb9db7c\tiscsi_requeue_task\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x7d14fa0e\tlc_find\tlib/lru_cache\tEXPORT_SYMBOL\n0xa842c7b4\tgre_build_header\tnet/ipv4/gre\tEXPORT_SYMBOL_GPL\n0xeecaa1c2\txt_unregister_table\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x183adb7b\thostap_info_init\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xa4b8fd57\thostap_80211_ops\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x1d027e4b\tsnd_pcm_format_signed\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x9732e23b\tflexcop_sram_ctrl\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x6f344bb9\tv4l2_calc_aspect_ratio\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0x75811312\tcrc_ccitt_table\tlib/crc-ccitt\tEXPORT_SYMBOL\n0xe68510b4\tnf_nat_icmp_reply_translation\tnet/ipv4/netfilter/nf_nat_ipv4\tEXPORT_SYMBOL_GPL\n0x59f5ccaf\tct_sip_get_sdp_header\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x83581089\tgf128mul_init_4k_lle\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x9b2560b9\tgf128mul_init_4k_bbe\tcrypto/gf128mul\tEXPORT_SYMBOL\n0xe38218c4\tphy_ethtool_get_wol\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x1cb0c89f\tphy_ethtool_set_wol\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xe2e4161d\trt2800_link_stats\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x12b2ad06\tiscsi_switch_str_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x6f407173\traid5_set_cache_size\tdrivers/md/raid456\tEXPORT_SYMBOL\n0x168896d4\tmacvlan_dellink\tdrivers/net/macvlan\tEXPORT_SYMBOL_GPL\n0xa8b0f01c\tusbnet_cdc_status\tdrivers/net/usb/cdc_ether\tEXPORT_SYMBOL_GPL\n0x80f2ab25\tdevm_lcd_device_register\tdrivers/video/backlight/lcd\tEXPORT_SYMBOL\n0xf1a5af66\tflexcop_sram_set_dest\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0xfd2af3ef\tath9k_hw_phy_disable\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x526f4fbc\tdevm_lcd_device_unregister\tdrivers/video/backlight/lcd\tEXPORT_SYMBOL\n0x8fb214bd\tct_sip_parse_request\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0xb9397c39\tmxl111sf_tuner_attach\tdrivers/media/usb/dvb-usb-v2/mxl111sf-tuner\tEXPORT_SYMBOL_GPL\n0xae2ff520\tppp_unregister_compressor\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x1a37c7e9\tp9_parse_header\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xda719c93\ti2c_bit_add_bus\tdrivers/i2c/algos/i2c-algo-bit\tEXPORT_SYMBOL\n0x0760be49\tmd_rdev_init\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xe5d1775a\tusb_ftdi_elan_edset_single\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x482335f9\tusb_serial_generic_read_bulk_callback\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x3534c81b\tatrtr_get_dev\tnet/appletalk/appletalk\tEXPORT_SYMBOL\n0xfc95c432\tsnd_timer_start\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x7a0fa300\tsnd_soc_get_volsw_range\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb34112e5\tsnd_soc_put_volsw_range\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x8a43dc2c\ts5h1409_attach\tdrivers/media/dvb-frontends/s5h1409\tEXPORT_SYMBOL\n0xf3cc0440\thdlcdrv_receiver\tdrivers/net/hamradio/hdlcdrv\tEXPORT_SYMBOL\n0x5c4d1baa\tath9k_hw_process_rxdesc_edma\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x6d0f1f89\tdm_table_get_mode\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xb5183f73\tmax2165_attach\tdrivers/media/tuners/max2165\tEXPORT_SYMBOL\n0xcad8404b\trt2x00mac_remove_interface\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x7eff8877\tnf_ct_get_tuplepr\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x83f1e971\tsnd_pcm_notify\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xd301bd71\tsnd_pcm_add_chmap_ctls\tsound/core/snd-pcm\tEXPORT_SYMBOL_GPL\n0xd80d2b33\tgarp_request_join\tnet/802/garp\tEXPORT_SYMBOL_GPL\n0xde4c6b3c\tirlmp_service_to_hint\tnet/irda/irda\tEXPORT_SYMBOL\n0xfd09b483\tieee80211_start_tx_ba_cb_irqsafe\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x1a174bf8\tserio_unregister_child_port\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x80541ffc\tmd_write_start\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x850d81d4\tdib8000_i2c_enumeration\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xa87bc9e7\to2nm_configured_node_map\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x4e17c1ee\tieee80211_sta_block_awake\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x5ec7279c\tnf_conntrack_find_get\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x41f16464\tsnd_rawmidi_transmit_ack\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0xae4ff730\tsnd_soc_codec_set_sysclk\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xbd607511\t__lbs_cmd\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x66a0c80e\tfuse_file_poll\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x3a7abcca\tnf_nat_sip_expect_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x4935acfa\tsnd_dmaengine_pcm_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3cf1528f\tdm_snap_cow\tdrivers/md/dm-snapshot\tEXPORT_SYMBOL\n0x68772d8f\thci_register_cb\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x1529af75\tath9k_hw_gettsf32\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x93fb70e4\twimax_state_get\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0xce5785c8\tath_key_delete\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x204710fe\trt2800_config_pairwise_key\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xe622dddd\tvideobuf_to_vmalloc\tdrivers/media/v4l2-core/videobuf-vmalloc\tEXPORT_SYMBOL_GPL\n0xb0dfe500\tmfd_cell_disable\tdrivers/mfd/mfd-core\tEXPORT_SYMBOL\n0x319c6026\tath_is_49ghz_allowed\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x816fa87c\tusb_wwan_chars_in_buffer\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x0773d1ea\twiphy_register\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xcb359f62\tv4l2_event_unsubscribe\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x3a1f894f\tiscsi_conn_queue_work\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xcd777808\tiscsi_tcp_set_max_r2t\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x978b64a7\tnf_nat_sdp_addr_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x8320aecd\tdvb_generic_ioctl\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xb94a8a7c\tdib7090_get_i2c_tuner\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x435a8b25\tdib7090_get_adc_power\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xa31605e7\tvideobuf_dvb_unregister_bus\tdrivers/media/v4l2-core/videobuf-dvb\tEXPORT_SYMBOL\n0x2c030574\tphy_register_fixup_for_id\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x3db25e8c\tipv6_dup_options\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x02db6a50\tieee80211_beacon_get_tim\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x6a34c260\twimax_rfkill\tnet/wimax/wimax\tEXPORT_SYMBOL\n0xf2239649\tvchan_dma_desc_free_list\tdrivers/dma/virt-dma\tEXPORT_SYMBOL_GPL\n0x7edaa29d\tad714x_enable\tdrivers/input/misc/ad714x\tEXPORT_SYMBOL\n0x7c87e469\tath_hw_setbssidmask\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x4fe472f6\tvb2_dqbuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xa7a6d4d0\tsnd_soc_new_ac97_codec\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xfc70f975\tath9k_hw_settsf64\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb79d54d3\tath9k_hw_gettsf64\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x8746a6fa\tau8522_i2c_gate_ctrl\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x65eaa84a\tgspca_dev_probe2\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0xf6325dd3\tlcd_device_unregister\tdrivers/video/backlight/lcd\tEXPORT_SYMBOL\n0x5f31f65f\tgameport_open\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0x5496d792\tvb2_ioctl_expbuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x358cb8ab\tl2tp_tunnel_sock_put\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0xfb54f2b7\tip_set_get_extensions\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x993f2423\tsmscore_register_hotplug\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x63cf5167\tvideobuf_read_start\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x0e81c76d\tspk_serial_out\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xf1a5611d\to2net_unregister_handler_list\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x7f8a1dab\tcfg80211_cqm_rssi_notify\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xea86dd90\tath9k_hw_init_global_settings\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x7ca241d6\tsnd_dma_reserve_buf\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0x042e9b2f\twiphy_rfkill_set_hw_state\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x7b21ee59\trc_allocate_device\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xbb248052\tdvb_usbv2_generic_write_locked\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0x4e1380ee\tath6kl_printk\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x3a18389a\tdm_rh_update_states\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x6b043eba\tirda_init_max_qos_capabilies\tnet/irda/irda\tEXPORT_SYMBOL\n0x374c4805\tsnd_add_device_sysfs_file\tsound/core/snd\tEXPORT_SYMBOL\n0x29fc4958\trc_keydown\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x7de04a81\tirias_find_object\tnet/irda/irda\tEXPORT_SYMBOL\n0x4a9fbe94\tvb2_buffer_done\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x9f4e5861\tath9k_hw_getchan_noise\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xf327afb7\trt2x00mac_conf_tx\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x14f06fe7\tspk_serial_in_nowait\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x90561452\tusb_wwan_write\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x5d61bd08\tipt_unregister_table\tnet/ipv4/netfilter/ip_tables\tEXPORT_SYMBOL\n0x5a2e34e9\tflexcop_device_kfree\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x84bbb6da\thostap_add_interface\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xbc139e51\tp9_client_getlock_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x06c26488\txt_unregister_target\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xc3587369\tv4l2_fh_is_singular\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0xb13f68ab\tath9k_hw_wow_apply_pattern\tdrivers/net/wireless/ath/ath9k/ath9k\tEXPORT_SYMBOL\n0x13e0d5e8\tax25_findbyuid\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xa1fc36c4\tieee80211_start_tx_ba_session\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x7602e248\tcx231xx_capture_start\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x810874ec\trndis_rx_fixup\tdrivers/net/usb/rndis_host\tEXPORT_SYMBOL_GPL\n0xbce2778c\tnf_conntrack_unregister_notifier\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6602ffa6\tct_sip_parse_address_param\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x45284ae9\tsmsendian_handle_rx_message\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x37d91069\tsmsendian_handle_tx_message\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xb42727cd\tcfg80211_connect_result\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x0f13c247\tiscsi_conn_get_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xe7ab811b\tgre_cisco_register\tnet/ipv4/gre\tEXPORT_SYMBOL_GPL\n0xad84bef8\tdm_table_event\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x0cf244e0\tath9k_hw_abort_tx_dma\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xba3d31f6\tusb_serial_handle_sysrq_char\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xb652be1c\tsnd_dmaengine_pcm_close\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x719f1803\tdm_region_hash_create\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x6084aa44\tmwifiex_process_sleep_confirm_resp\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x75446da7\tip_vs_conn_new\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x7ac2f329\tsnd_seq_expand_var_event\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x46ff0600\tcdrom_number_of_slots\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0x6b3869e4\tnfc_fw_download_done\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xa293f8a6\tip_set_get_ipaddr4\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x9e98722b\tip_set_get_ipaddr6\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0xb241ac49\tsnd_soc_add_codec_controls\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x258ffcac\tsms_board_setup\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xf095794f\t__video_register_device\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x67c5f3e2\tp54_parse_eeprom\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x642cd76b\tmd_stop_writes\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x225d1a2d\tvb2_write\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x1c23ba5d\trt2x00usb_clear_entry\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xd1bf04cf\tgre_cisco_unregister\tnet/ipv4/gre\tEXPORT_SYMBOL_GPL\n0xbe38a431\tdm_rh_recovery_prepare\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x89dbd1fb\tcx231xx_register_extension\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL\n0xa4832cf0\tiscsi_pool_free\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x68180484\tssb_bus_may_powerdown\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xd3d0842c\tircomm_flow_request\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0x538d5d22\tirias_add_octseq_attrib\tnet/irda/irda\tEXPORT_SYMBOL\n0xd7dc2dee\tcfg80211_roamed\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x2c521b62\tsnd_mpu401_uart_new\tsound/drivers/mpu401/snd-mpu401-uart\tEXPORT_SYMBOL\n0x5088ef36\tmd_new_event\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x4c6e3369\tvideobuf_queue_to_vaddr\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x187810cc\tcx231xx_init_vbi_isoc\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x3892959b\tcfg80211_check_station_change\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xcca45d4f\tv4l2_subdev_s_ext_ctrls\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xf74ab2a2\tv4l2_subdev_g_ext_ctrls\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x64e81834\tath_hw_get_listen_time\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x3378bb57\tiscsi_session_teardown\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x769baa94\tieee80211_cqm_rssi_notify\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x03243c4c\tcfg80211_assoc_timeout\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xe9156503\tirttp_udata_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x272ae6b1\tsnd_card_register\tsound/core/snd\tEXPORT_SYMBOL\n0x4acd3b65\tmddev_resume\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xcfdc97d4\tar9003_mci_get_interrupt\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x58451f4c\tp54_register_common\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x969ddd0a\trt2x00usb_probe\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xa07ed110\txz_dec_init\tlib/xz/xz_dec\tEXPORT_SYMBOL\n0xae736157\tnf_nat_ftp_hook\tnet/netfilter/nf_conntrack_ftp\tEXPORT_SYMBOL_GPL\n0x958e1150\tnf_nat_irc_hook\tnet/netfilter/nf_conntrack_irc\tEXPORT_SYMBOL_GPL\n0x9d8d8036\tnf_nat_sip_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x8d7471d2\tsnd_soc_dapm_new_controls\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x5fb7c9e5\ti2400m_is_boot_barker\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x6aa1d100\tlbs_get_firmware\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x628eba69\tmfd_remove_devices\tdrivers/mfd/mfd-core\tEXPORT_SYMBOL\n0x0a5daf15\trt2x00queue_map_txskb\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xd626d623\tregister_cdrom\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xf401908f\tip6_tnl_dst_reset\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL_GPL\n0x34d8e7e0\tnf_ct_l3proto_pernet_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x5baed4aa\tnf_ct_l4proto_pernet_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xeba84ba4\trt2800_enable_radio\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x0ece8591\tnf_ct_deliver_cached_events\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x83a2ef94\tdvb_ringbuffer_empty\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xe8c1da7d\tdib8000_pid_filter\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x0663729c\tip_tunnel_change_mtu\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x6ec0b170\txfrm6_rcv_spi\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xcbf63f73\tsnd_pcm_release_substream\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xdb5ae41c\tdm_dirty_log_destroy\tdrivers/md/dm-log\tEXPORT_SYMBOL\n0x3473d291\tsnd_soc_bytes_put\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x7774620f\tdm_rh_stop_recovery\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x822ed614\tdvb_ca_en50221_init\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xeee59cb4\tdib8000_pwm_agc_reset\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x4e0e28a4\trt2800_process_rxwi\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x3e8acebd\twiphy_free\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x9dfe6f59\tsnd_ctl_new1\tsound/core/snd\tEXPORT_SYMBOL\n0x625c9f80\tath9k_cmn_update_ichannel\tdrivers/net/wireless/ath/ath9k/ath9k_common\tEXPORT_SYMBOL\n0xf101902a\tiscsi_eh_device_reset\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xf0cf81b8\tusb_wwan_tiocmget\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x90110ba7\tusb_wwan_tiocmset\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x6c9b76e9\tmd_reap_sync_thread\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x4159c3f8\tsnd_soc_dpcm_get_substream\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x59245aba\tbtmrvl_add_card\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0xf633b4b6\tdib3000mc_pid_control\tdrivers/media/dvb-frontends/dib3000mc\tEXPORT_SYMBOL\n0x7dff5cc7\tgenphy_read_status\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x37d3f639\tcfg80211_rx_mgmt\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x1c198e39\tsnd_soc_jack_notifier_unregister\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3bdd0f94\tv4l2_prio_change\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x5c28cca5\tieee80211_get_tkip_p1k_iv\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xcdf593e8\tath_gen_timer_free\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xcab3bf1b\troccat_common2_send\tdrivers/hid/hid-roccat-common\tEXPORT_SYMBOL_GPL\n0xacdd2a7b\tsmscore_get_board_id\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x40d870ae\tsmscore_set_board_id\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x6d771bb4\thci_suspend_dev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x69f21639\tnf_ct_expect_find_get\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xf310a3d0\tsnd_pcm_lib_free_pages\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x31c0c2d1\tdm_put\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x955e5912\tzl10353_attach\tdrivers/media/dvb-frontends/zl10353\tEXPORT_SYMBOL\n0xc9a116e4\ttda9887_attach\tdrivers/media/tuners/tda9887\tEXPORT_SYMBOL_GPL\n0x3adbd595\tv4l2_field_names\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x2d1e8b4b\ti2400m_unknown_barker\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL\n0x86cec883\tip6_update_pmtu\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xb89dd2e2\tsnd_card_disconnect\tsound/core/snd\tEXPORT_SYMBOL\n0x77619ff0\tsnd_soc_dapm_nc_pin\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x048a8f07\tdm_dirty_log_create\tdrivers/md/dm-log\tEXPORT_SYMBOL\n0x0544c778\tath9k_hw_set_interrupts\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x40728a63\txt_find_revision\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x45d3e8a1\tfc0011_attach\tdrivers/media/tuners/fc0011\tEXPORT_SYMBOL\n0xac431a47\tnf_conntrack_l3proto_generic\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x800aea83\tsnd_soc_dai_set_channel_map\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xa26045a8\tv4l2_device_unregister_subdev\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x112ae445\tsnd_rawmidi_drop_output\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x4e75e83b\tdib0070_set_rf_output\tdrivers/media/dvb-frontends/dib0070\tEXPORT_SYMBOL\n0x972a5ebc\tdib0070_get_rf_output\tdrivers/media/dvb-frontends/dib0070\tEXPORT_SYMBOL\n0x6c87888b\tl2tp_session_free\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x031dba90\tcrypto_sha1_update\tcrypto/sha1_generic\tEXPORT_SYMBOL\n0x330c1849\tdm_dirty_log_type_unregister\tdrivers/md/dm-log\tEXPORT_SYMBOL\n0x83b9e2f9\tcx231xx_enable656\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x0aa7f841\tv4l2_async_notifier_unregister\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x8e9658fb\tphy_mac_interrupt\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xacaa08c0\tiscsi_eh_abort\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xfb86b96f\tdlm_errname\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0xc781bd9f\trfkill_resume_polling\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x982e6b6d\tieee80211_radiotap_iterator_init\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x76d1b70b\tdvb_usbv2_reset_resume\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0xabe27502\tv4l2_ctrl_query_fill\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL\n0xa6da454f\tip_vs_proto_get\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x46feb099\tdm_read_arg\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x09972790\tieee80211_tx_status_irqsafe\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x35f400a4\tieee80211_find_sta\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x11ec0d71\tsnd_dma_free_pages\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0x6aa0472b\tath6kl_core_destroy\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x7580ccdd\tbt_sock_unlink\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x97364c08\tsnd_soc_dapm_add_routes\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x8106095a\tv4l2_prio_max\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x9a032c49\tar9003_paprd_init_table\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xa7199dce\trt2x00usb_uninitialize\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x89502fe7\tocfs2_cluster_connect\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xa74ce603\ttea5767_autodetection\tdrivers/media/tuners/tea5767\tEXPORT_SYMBOL_GPL\n0x26acb799\tvideobuf_mmap_setup\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x68075b01\thostap_set_string\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x8a78a51c\tlbs_remove_card\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x85630c08\tcfg80211_ibss_joined\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xe48a0d2f\tsnd_ctl_remove_id\tsound/core/snd\tEXPORT_SYMBOL\n0x82ace764\thci_conn_security\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x1848736a\tbt_debugfs\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL_GPL\n0x0c6c698e\tppp_register_channel\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x91369516\tasync_syndrome_val\tcrypto/async_tx/async_pq\tEXPORT_SYMBOL_GPL\n0x613e301f\t__gameport_register_port\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0x4c0e483c\tdvb_unregister_frontend\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xe862b309\tcryptd_ablkcipher_child\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xd60736ec\tgf128mul_free_64k\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x69a8dde1\tieee80211_stop_queues\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xe3cd237b\tnf_ct_expect_unregister_notifier\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x852d6ee7\tstv090x_set_gpio\tdrivers/media/dvb-frontends/stv090x\tEXPORT_SYMBOL\n0xad42d15b\tsimple_tuner_attach\tdrivers/media/tuners/tuner-simple\tEXPORT_SYMBOL_GPL\n0x3855e46a\tcdc_ncm_rx_verify_ndp16\tdrivers/net/usb/cdc_ncm\tEXPORT_SYMBOL_GPL\n0x21f6bba6\tnfnl_acct_find_get\tnet/netfilter/nfnetlink_acct\tEXPORT_SYMBOL_GPL\n0x74e5ff1a\tudpv6_encap_enable\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x4a27472e\tsnd_pcm_set_sync\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x2bd3aad8\tdib0070_attach\tdrivers/media/dvb-frontends/dib0070\tEXPORT_SYMBOL\n0x62f7cea3\tspeakup_event\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xb0d904b7\traid6_empty_zero_page\tlib/raid6/raid6_pq\tEXPORT_SYMBOL\n0xf4dfc2a3\tsnd_info_create_card_entry\tsound/core/snd\tEXPORT_SYMBOL\n0x1b64b296\twimax_msg_alloc\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x006c43c6\tbrcmu_pktq_mlen\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0xfc80e2ed\tbrcmu_pktq_mdeq\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x342fb0e6\txfrm6_find_1stfragopt\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x4a3ea5c0\tsnd_request_card\tsound/core/snd\tEXPORT_SYMBOL\n0x198788b4\tsnd_lookup_oss_minor_data\tsound/core/snd\tEXPORT_SYMBOL\n0x6f4166bb\tsnd_ac97_suspend\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x9bdd1bf3\tgameport_unregister_driver\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0xa79d393f\tdm_register_target\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xb438bdda\tl2tp_nl_register_ops\tnet/l2tp/l2tp_netlink\tEXPORT_SYMBOL_GPL\n0x39879a2e\tcfg80211_tdls_oper_request\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xc15c8611\tcfg80211_chandef_create\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x1a724fcc\tsnd_seq_kernel_client_ctl\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0xcda04a5b\tv4l2_prio_close\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x026c1368\tax25_display_timer\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xce280963\tieee80211_nullfunc_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xb3160ce9\tnf_ct_seqadj_init\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x9fe7fd27\tip_set_test\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x92483c9a\tcfg80211_inform_bss_width\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xc0890413\tgf128mul_64k_lle\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x384ef9ce\tgf128mul_64k_bbe\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x8e146195\tsynth_release_region\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xfd827145\tip6_flush_pending_frames\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x749a26e9\tieee80211_stop_rx_ba_session\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xcf8e7a78\tip_vs_scheduler_err\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x696b717b\tsnd_soc_dai_set_bclk_ratio\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x35d1e27e\tp9_idpool_get\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x04cabed9\trfkill_register\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x5e7f4920\tsnd_pcm_format_set_silence\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x52284501\tath9k_hw_beaconinit\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x92f7937e\tcfg80211_roamed_bss\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x5450d5c0\tlnbh24_attach\tdrivers/media/dvb-frontends/lnbp21\tEXPORT_SYMBOL\n0x3c090ce5\trt2800_txdone_entry\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x350a9cd6\twiphy_rfkill_stop_polling\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x01c483a9\tv4l2_get_timestamp\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x4ffae165\tregister_snap_client\tnet/802/psnap\tEXPORT_SYMBOL\n0xf8143d4a\tcrypto_sha512_update\tcrypto/sha512_generic\tEXPORT_SYMBOL\n0xe18455e8\tieee80211_radar_detected\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x62de542f\tsnd_soc_info_volsw_range\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x31a2b77b\tdpcm_be_dai_trigger\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xbecbe926\ttm6000_init_digital_mode\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL\n0xb049455c\tbt_accept_unlink\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x8d399f0f\tnf_ct_gre_keymap_add\tnet/netfilter/nf_conntrack_proto_gre\tEXPORT_SYMBOL_GPL\n0x16b7b094\trt2x00queue_pause_queue\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x550e08cc\txt_check_target\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x53358ce3\tath_regd_get_band_ctl\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0xf3288c58\tudp6_lib_lookup\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x46f2cba9\t__nf_ct_try_assign_helper\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x556cdf5e\tsnd_jack_report\tsound/core/snd\tEXPORT_SYMBOL\n0x017ea7c7\tcx231xx_tuner_callback\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xdd0d11ca\tstp_proto_register\tnet/802/stp\tEXPORT_SYMBOL_GPL\n0x2ecb5ac6\tseq_print_acct\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x4c3da1f8\tset_h245_addr_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0x0238abb7\tgarp_register_application\tnet/802/garp\tEXPORT_SYMBOL_GPL\n0xa88b189c\tinet6_csk_bind_conflict\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x90b3c91f\tdvb_ringbuffer_init\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xa08215b2\ts5h1420_get_tuner_i2c_adapter\tdrivers/media/dvb-frontends/s5h1420\tEXPORT_SYMBOL\n0xae808bac\to2net_register_handler\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0xa791e2ae\tip6_route_output\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xf5a61d45\tieee80211_ave_rssi\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x3321159a\tieee80211_rts_duration\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x79e76682\tcfg80211_del_sta\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xad5aaf81\ttua9001_attach\tdrivers/media/tuners/tua9001\tEXPORT_SYMBOL\n0xdbce7ef6\tirttp_flow_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x7288b39d\tieee80211_gtk_rekey_notify\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x3796bdcc\tsnd_pcm_format_little_endian\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xebee23d7\tv4l2_try_ext_ctrls\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x69ea4c3c\tiscsi_tcp_task_init\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0xf7af31e1\tbitmap_end_sync\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x23d23e65\tdvb_net_release\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x08982d59\tv4l2_match_dv_timings\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0x682a6076\tstp_proto_unregister\tnet/802/stp\tEXPORT_SYMBOL_GPL\n0xaa157485\tieee80211_get_tkip_rx_p1k\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x2ea0ca63\tsnd_soc_pm_ops\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x63343b1d\tsnd_usbmidi_input_stop\tsound/usb/snd-usbmidi-lib\tEXPORT_SYMBOL\n0x6f234e44\tvideobuf_poll_stream\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x3c4f5da1\ttda10023_attach\tdrivers/media/dvb-frontends/tda10023\tEXPORT_SYMBOL\n0xe850988e\tbt_sock_reclassify_lock\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xa4336ab1\tipt_register_table\tnet/ipv4/netfilter/ip_tables\tEXPORT_SYMBOL\n0x05684cdb\tipv6_push_nfrag_opts\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xe56a9336\tsnd_pcm_format_width\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x99a725bd\troccat_common2_receive\tdrivers/hid/hid-roccat-common\tEXPORT_SYMBOL_GPL\n0x7e92407e\tsnd_mixer_oss_notify_callback\tsound/core/snd\tEXPORT_SYMBOL\n0x1df14367\tath9k_cmn_get_curchannel\tdrivers/net/wireless/ath/ath9k/ath9k_common\tEXPORT_SYMBOL\n0x42abb525\trt2x00mac_flush\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xc6deb42e\tipcomp_destroy\tnet/xfrm/xfrm_ipcomp\tEXPORT_SYMBOL_GPL\n0x0c2f123f\tgf128mul_4k_bbe\tcrypto/gf128mul\tEXPORT_SYMBOL\n0xbd17a0df\tgf128mul_4k_lle\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x198fe7af\tieee80211_unregister_hw\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x26c46b2e\tnf_connlabel_set\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x602c597e\tcryptd_free_ablkcipher\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xaa3eb4ec\tdibusb_read_eeprom_byte\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x7719ce73\tsnd_soc_codec_writable_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x4a2a3ca6\t__cast5_decrypt\tcrypto/cast5_generic\tEXPORT_SYMBOL_GPL\n0x27278ca9\t__cast5_encrypt\tcrypto/cast5_generic\tEXPORT_SYMBOL_GPL\n0x702003ac\tdib0090_set_switch\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x2e883ad3\tppp_channel_index\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x09873910\tusb_serial_generic_resume\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xdb508fac\tieee80211_get_buffered_bc\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x765fa966\tmd_check_recovery\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xad33057d\tsirdev_set_dongle\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0x48f9238c\tmacvlan_link_register\tdrivers/net/macvlan\tEXPORT_SYMBOL_GPL\n0xbf285a4c\thashbin_get_next\tnet/irda/irda\tEXPORT_SYMBOL\n0x6386400a\tiscsi_boot_create_kset\tdrivers/scsi/iscsi_boot_sysfs\tEXPORT_SYMBOL_GPL\n0x5389d238\t__iscsi_put_task\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xa688d8a5\t__iscsi_get_task\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xe263397e\tfuse_do_ioctl\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x4a52dfe1\tlc_create\tlib/lru_cache\tEXPORT_SYMBOL\n0xac4ca1b0\tintlog2\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xcfd76f67\tath9k_hw_setrxabort\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x4c4d0faf\tec100_attach\tdrivers/media/dvb-frontends/ec100\tEXPORT_SYMBOL\n0x26637555\trt2x00mac_config\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xa1ae0d6a\tnf_nat_pptp_hook_exp_gre\tnet/netfilter/nf_conntrack_pptp\tEXPORT_SYMBOL_GPL\n0xec3927d1\tbt_sock_poll\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x0d0a522a\tsnd_seq_kernel_client_enqueue_blocking\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0xea3e8cd9\tsnd_soc_dapm_enable_pin\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x1fbaebd7\ti2400m_dev_reset_handle\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x8168fd2b\tsnd_dmaengine_pcm_request_channel\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x89d16b80\tsnd_soc_put_xr_sx\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc4d5d2cb\tsnd_soc_write\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x4888d904\tsnd_soc_get_xr_sx\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xeb665027\trt2800_clear_beacon\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x46346366\tflexcop_eeprom_check_mac_addr\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x518a8f11\tspk_do_catch_up\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x01c6e37e\tlro_receive_frags\tnet/ipv4/inet_lro\tEXPORT_SYMBOL\n0x19a9a091\tnfc_unregister_device\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x09856286\tiscsi_segment_init_linear\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x9973add9\t__cookie_v6_check\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x021c2ccf\tgameport_close\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0x9fb5ec9b\tdib8000_get_adc_power\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xafae6447\tv4l2_async_register_subdev\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x4e70505a\tlbtf_bcn_sent\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x77b0e1c5\tv9fs_unregister_trans\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x6225816a\tdvb_ringbuffer_flush\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x22b96883\tnf_ct_port_tuple_to_nlattr\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x42cde5fd\tcx2341x_handler_set_50hz\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x3040330c\tsnd_tea575x_exit\tdrivers/media/radio/tea575x\tEXPORT_SYMBOL\n0x5913e38e\tsnd_tea575x_init\tdrivers/media/radio/tea575x\tEXPORT_SYMBOL\n0x73f5c472\tnf_conntrack_helper_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6a335e07\tsnd_seq_root\tsound/core/snd\tEXPORT_SYMBOL\n0xf59013ef\tir_raw_handler_register\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL\n0x0ff2b602\tslhc_compress\tdrivers/net/slip/slhc\tEXPORT_SYMBOL\n0x88d1898e\tssb_bus_unregister\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x7f1db6c5\tl2tp_session_create\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x4c3b5878\tieee80211_get_response_rate\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x4f816e9b\tsnd_pcm_format_big_endian\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xd68a099e\ttimeval_usec_diff\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xedef8523\tau8522_get_state\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x34113e0e\tmedia_entity_graph_walk_start\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x4e533717\tip6_tnl_xmit_ctl\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL_GPL\n0x29100f3b\tip6_sk_update_pmtu\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x83e370b7\tcfg80211_cqm_pktloss_notify\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x139dc323\tdib7000p_i2c_enumeration\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x40bc1150\tvb2_expbuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xb0a5e156\tath9k_hw_startpcureceive\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x5ae8a0bd\tlc_element_by_index\tlib/lru_cache\tEXPORT_SYMBOL\n0xe9a92e10\trdev_set_badblocks\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xe07bca17\tbtmrvl_send_module_cfg_cmd\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x196b08ef\ttda18271c2dd_attach\tdrivers/media/dvb-frontends/tda18271c2dd\tEXPORT_SYMBOL_GPL\n0x0bd662f6\traid6_gfmul\tlib/raid6/raid6_pq\tEXPORT_SYMBOL\n0x26885c56\tsnd_midi_event_no_status\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x3971b4df\tsnd_ecards_limit\tsound/core/snd\tEXPORT_SYMBOL\n0xc4d74c35\tsnd_ac97_write_cache\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x273cf7ee\tdib8000_get_slave_frontend\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x2570140c\tdib8000_set_slave_frontend\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xeb318f4c\tlc_destroy\tlib/lru_cache\tEXPORT_SYMBOL\n0xa5e7cb73\ti2c_bit_algo\tdrivers/i2c/algos/i2c-algo-bit\tEXPORT_SYMBOL\n0xa3093e8a\tdib0070_ctrl_agc_filter\tdrivers/media/dvb-frontends/dib0070\tEXPORT_SYMBOL\n0x74dc38fc\tdib7000p_set_agc1_min\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x3c45f0ed\tds3000_attach\tdrivers/media/dvb-frontends/ds3000\tEXPORT_SYMBOL\n0x4502c65a\tasc2ax\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x3b60222b\tnfc_targets_found\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x0525e3f5\tcryptd_alloc_aead\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xbb554827\tvideo_device_alloc\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x2f28d098\tasync_gen_syndrome\tcrypto/async_tx/async_pq\tEXPORT_SYMBOL_GPL\n0x8b3ff2b0\tdm_rh_inc_pending\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x2fd0414b\tath9k_hw_btcoex_init_scheme\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x040ea5a0\tnfs4_acl_nfsv4_to_posix\tfs/nfsd/nfsd\tEXPORT_SYMBOL\n0xc3679d7b\to2hb_get_all_regions\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x4e060ed8\tp9stat_free\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x5b7b09c8\tnf_conntrack_l4proto_udp4\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xe0ed24d4\tath9k_hw_gen_timer_stop\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xd5ef4c21\tip_set_get_byname\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0xeb61d8b0\tiscsi_session_recovery_timedout\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xd8aa4284\tdm_rh_region_context\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xaae9b53a\tath9k_hw_updatetxtriglevel\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb96cbd0c\tsnd_rawmidi_new\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x4b5fd49e\tdm_kcopyd_do_callback\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xc6b93abd\tis_fw_load\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xfdf58d91\tmacvlan_common_newlink\tdrivers/net/macvlan\tEXPORT_SYMBOL_GPL\n0x600b1990\tmdiobus_alloc_size\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xba13dc12\tnf_conntrack_free\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x64d55724\tatalk_find_dev_addr\tnet/appletalk/appletalk\tEXPORT_SYMBOL\n0x5f55c3a2\thashbin_remove\tnet/irda/irda\tEXPORT_SYMBOL\n0x40160373\tcfg80211_sched_scan_stopped\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x5cb67aef\tmd_run\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x75d21cfd\tcfg80211_get_bss\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xf3170352\thci_conn_switch_role\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x74a5a698\tdvb_filter_pes2ts_init\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x2b830abc\tusb_serial_generic_wait_until_sent\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x6bf501b5\tbr_should_route_hook\tnet/bridge/bridge\tEXPORT_SYMBOL\n0x9cab34a6\trfkill_set_led_trigger_name\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0xaa6f23ad\trfkill_get_led_trigger_name\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x75a0ef89\tp54_read_eeprom\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x81b34539\tcfg80211_gtk_rekey_notify\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x83c30536\tem28xx_gpio_set\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x4ac7c7cd\tv4l2_event_dequeue\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x42706b1f\tv4l2_ctrl_auto_cluster\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xc3d30f52\tv4l2_subdev_link_validate_default\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x304972c3\tcfg80211_probe_status\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x24a94b26\tsnd_info_get_line\tsound/core/snd\tEXPORT_SYMBOL\n0x93824557\tsnd_register_oss_device\tsound/core/snd\tEXPORT_SYMBOL\n0x8f988b86\tsnd_soc_dai_digital_mute\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x5d8ae4cb\tdib0090_get_tune_state\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x74a75a03\tdib0090_set_tune_state\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x30469d0b\trt2800_efuse_detect\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x91351bd5\tfl6_merge_options\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x71a56c22\ti2400m_tx_msg_get\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x3805d55f\t__nf_nat_l4proto_find\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0x46504ae4\tvideobuf_streamon\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x6344eaf6\tip_set_alloc\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x394d42b7\tdvb_frontend_suspend\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x2eb88f8b\tiscsi_pool_init\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x9b9ea9d2\tnfc_driver_failure\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xfe8e9462\tstv0297_attach\tdrivers/media/dvb-frontends/stv0297\tEXPORT_SYMBOL\n0x6dae6e39\tst_unregister\tdrivers/misc/ti-st/st_drv\tEXPORT_SYMBOL_GPL\n0x7a48b8b4\tfuse_conn_kill\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x358b44a7\tnf_ct_l4proto_find_get\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xa9e0a029\tnf_ct_l3proto_find_get\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x49497289\tdm_rh_mark_nosync\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x90bae2cf\tdib3000mc_i2c_enumeration\tdrivers/media/dvb-frontends/dib3000mc\tEXPORT_SYMBOL\n0x1763df4d\tdib8000_pid_filter_ctrl\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xf2a353ac\tv4l2_i2c_tuner_addrs\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x53ef75dd\tl2tp_tunnel_find_nth\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0xa9dd118a\tregister_ip_vs_app\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x883c17c6\tdvb_ringbuffer_read_user\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xe865a470\tdm_kcopyd_zero\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x0f23787c\tusb_serial_port_softint\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xfa1becc7\tipv6_setsockopt\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x9c9226cd\tphy_drivers_unregister\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x3166780c\tbt_sock_wait_state\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x7170801c\tsnd_soc_get_pcm_runtime\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc1df3107\trt2x00mac_set_key\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x823179a5\tiscsi_eh_session_reset\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x1b3e1f08\txt_recseq\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0xc719e204\tdm_kill_unmapped_request\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x6043ce27\trc_close\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x290d5da7\tvb2_querybuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL\n0xc8b667f6\thdlcdrv_register\tdrivers/net/hamradio/hdlcdrv\tEXPORT_SYMBOL\n0x009376f2\tieee80211_sta_set_buffered\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x185a2633\txt_request_find_target\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x843e46a8\tdm_rh_delay\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xc8278e69\tregister_md_personality\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x2e67fad6\tdib3000mc_get_tuner_i2c_master\tdrivers/media/dvb-frontends/dib3000mc\tEXPORT_SYMBOL\n0xee42db3c\tcfg80211_chandef_compatible\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xe336c753\tath9k_hw_btcoex_enable\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xff6104d0\tsnd_pcm_rate_bit_to_rate\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x40202e74\tdib0090_pwm_gain_reset\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x44a95b5f\tinet6_csk_reqsk_queue_hash_add\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xf791b00d\twimax_msg_data\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x37def73c\tau8522_init\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0xeebf068f\tdib0090_dcc_freq\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x381ca34b\tath9k_hw_gettxbuf\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x095f0644\tmwifiex_enable_hs\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x0707e222\tp9_client_mknod_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xe142c73c\tp9_client_mkdir_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xee762dc1\tbt_sock_stream_recvmsg\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x337f2432\tl2tp_nl_unregister_ops\tnet/l2tp/l2tp_netlink\tEXPORT_SYMBOL_GPL\n0x6251de6d\tcfg80211_inform_bss_width_frame\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xcf618a57\tcfg80211_calculate_bitrate\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x5bf63142\tcryptd_alloc_ablkcipher\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0x6b29f058\tmt2266_attach\tdrivers/media/tuners/mt2266\tEXPORT_SYMBOL\n0x7978264f\tnf_ct_gre_keymap_destroy\tnet/netfilter/nf_conntrack_proto_gre\tEXPORT_SYMBOL_GPL\n0x5170e8a0\tath9k_hw_gen_timer_start\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x281dea2e\tnfnetlink_subsys_register\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0x0de9d6d3\tsnd_pcm_lib_free_vmalloc_buffer\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x89c8efc0\tdib8000_get_i2c_master\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x0bca1f68\tgspca_dev_probe\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0x0562c415\tocfs2_cluster_this_node\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xbc2abca4\tiscsi_target_alloc\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x36071255\tp9_client_destroy\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x06ecaef3\tlbs_resume\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x56af0dbd\tgf128mul_x_ble\tcrypto/gf128mul\tEXPORT_SYMBOL\n0xe729bec1\tisl6421_attach\tdrivers/media/dvb-frontends/isl6421\tEXPORT_SYMBOL\n0xedb7c47f\tath6kl_core_cleanup\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0xc8e4081c\trt2x00mac_rfkill_poll\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x16487bc2\tusb_serial_generic_process_read_urb\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x16c39713\tphy_ethtool_sset\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x930e3a72\tphy_ethtool_gset\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x68581630\tssb_device_enable\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x7b8699eb\tsnd_seq_event_port_detach\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x060fb664\tsnd_soc_register_card\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x6a90cbd8\trt2800_probe_hw\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x98761d70\tgarp_unregister_application\tnet/802/garp\tEXPORT_SYMBOL_GPL\n0x40ae8d17\tl2tp_udp_encap_recv\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x9be74efd\tbtmrvl_interrupt\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x926c34e7\tmxl5007t_attach\tdrivers/media/tuners/mxl5007t\tEXPORT_SYMBOL_GPL\n0x553efb91\trc_core_debug\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x198d30a2\tsnd_ctl_remove\tsound/core/snd\tEXPORT_SYMBOL\n0x2f25eee2\tcx2341x_update\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0xcf1922a2\tvb2_plane_vaddr\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x94b8f9b2\trt2800_write_beacon\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x0b0d888b\ticmpv6_err_convert\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xf6ba0aa9\tad714x_remove\tdrivers/input/misc/ad714x\tEXPORT_SYMBOL\n0xcf76ce95\tcx2341x_fill_defaults\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x6ac503b3\tr820t_attach\tdrivers/media/tuners/r820t\tEXPORT_SYMBOL_GPL\n0x3ac1e592\tvideobuf_streamoff\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0xe69eb347\thostap_init_data\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x544b376e\tv4l2_ctrl_subscribe_event\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x9c57b30d\tppp_input\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x1298952b\tau8522_writereg\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x12634444\tlirc_dev_fop_ioctl\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0x27cb133b\teeprom_93cx6_multiread\tdrivers/misc/eeprom/eeprom_93cx6\tEXPORT_SYMBOL_GPL\n0xf3c0287b\tnfc_register_device\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xb263517a\tcx231xx_uninit_isoc\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x027be9fb\tar9003_mci_get_next_gpm_offset\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x858469da\tgarp_uninit_applicant\tnet/802/garp\tEXPORT_SYMBOL_GPL\n0x7957f728\tirlmp_update_client\tnet/irda/irda\tEXPORT_SYMBOL\n0xe8794ce1\tslhc_toss\tdrivers/net/slip/slhc\tEXPORT_SYMBOL\n0x1e237c3e\tfuse_conn_init\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x01eab577\ttda829x_probe\tdrivers/media/tuners/tda8290\tEXPORT_SYMBOL_GPL\n0x7a1211f8\tdlm_setup_eviction_cb\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0x1a74e7c8\tieee80211_scan_completed\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x3663a36d\tieee80211_remove_key\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x5391bf00\tasync_raid6_datap_recov\tcrypto/async_tx/async_raid6_recov\tEXPORT_SYMBOL_GPL\n0xb10d55bc\tcn_netlink_send\tdrivers/connector/cn\tEXPORT_SYMBOL_GPL\n0x1c967c60\tprism2_update_comms_qual\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x53c2255c\tl2tp_tunnel_closeall\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0xb28f5ef1\txt_free_table_info\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0x90785498\tdrxd_attach\tdrivers/media/dvb-frontends/drxd\tEXPORT_SYMBOL\n0xa2201012\tdrxk_attach\tdrivers/media/dvb-frontends/drxk\tEXPORT_SYMBOL\n0x3b6d5612\tdvb_usbv2_probe\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0x750f1ded\tp54_unregister_common\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0xd43ecbf1\tnull_ax25_address\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xf71bd256\tsnd_dma_alloc_pages_fallback\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0x8b9c95a8\tiscsi_segment_seek_sg\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x9ad2a845\trate_control_set_rates\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xabfbd7a4\tax25_hard_header\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xc78455ed\tnat_h245_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0x23119763\tipcomp_input\tnet/xfrm/xfrm_ipcomp\tEXPORT_SYMBOL_GPL\n0xaaea1d82\tsnd_ctl_register_ioctl\tsound/core/snd\tEXPORT_SYMBOL\n0x49cd5724\tdib3000mc_set_config\tdrivers/media/dvb-frontends/dib3000mc\tEXPORT_SYMBOL\n0xfe015cc2\trc_keydown_notimeout\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x35bb2d8d\tv4l2_event_queue\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x3e1d48f2\tinet6_sk_rebuild_header\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x123959a1\tv4l2_type_names\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x1da6a251\tv4l2_clk_register\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x2f4b5f97\tfree_mdio_bitbang\tdrivers/net/phy/mdio-bitbang\tEXPORT_SYMBOL\n0xd873b56f\tnf_ct_extend_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xfd93482e\tdm_rh_recovery_in_flight\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xfb70ac82\tbrcmu_pktq_pdeq\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x95fe9f1d\tbrcmu_pktq_penq\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x446ace67\trt2x00mac_sta_add\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x7fe11a42\tip6_sk_dst_lookup_flow\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x3d87ecbe\tsnd_dma_get_reserved_buf\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0xddac314b\tsnd_timer_new\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x67781a51\tlirc_dev_fop_write\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0x210b9376\tath9k_hw_numtxpending\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x05513b71\traid6_call\tlib/raid6/raid6_pq\tEXPORT_SYMBOL_GPL\n0x91b25cba\tbitmap_startwrite\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x33cbe2c6\tproc_irda\tnet/irda/irda\tEXPORT_SYMBOL\n0x545951cd\tieee80211_report_low_ack\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x04dca738\tlirc_unregister_driver\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0xdfc5169b\tslhc_init\tdrivers/net/slip/slhc\tEXPORT_SYMBOL\n0xd507daba\t__nf_ct_kill_acct\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x56549514\tdm_get_rq_mapinfo\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x41870540\tath9k_hw_btcoex_init_3wire\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x1aa18a00\tiscsi_verify_itt\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x0c5fbf8a\tcast_s3\tcrypto/cast_common\tEXPORT_SYMBOL_GPL\n0x6f7ee30d\trt2800_get_txwi_rxwi_size\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xe9f7149c\tzlib_deflate_workspacesize\tlib/zlib_deflate/zlib_deflate\tEXPORT_SYMBOL\n0xc0fec227\tsnd_mpu401_uart_interrupt\tsound/drivers/mpu401/snd-mpu401-uart\tEXPORT_SYMBOL\n0xe6fa6fda\tbitmap_unplug\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x7340789d\tath_key_config\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0xfadf32e2\tbt_sock_recvmsg\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x2a5aa587\tsnd_timer_notify\tsound/core/snd-timer\tEXPORT_SYMBOL\n0xd10176cb\tsnd_soc_default_volatile_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb395c21f\tdvb_usb_nec_rc_key_to_event\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0x5dc857c3\ti2400m_netdev_setup\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x2f210252\tvideo_devdata\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xa672ce7c\tsnd_rawmidi_transmit_peek\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0xd85672d2\tvideobuf_queue_core_init\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x9435d123\tath9k_hw_set_txpowerlimit\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x4140ff5c\tmd_do_sync\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x73b40802\tsnd_tea575x_set_freq\tdrivers/media/radio/tea575x\tEXPORT_SYMBOL\n0x7ddf2a2e\tsnd_midi_event_reset_decode\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x31406f58\tsnd_card_proc_new\tsound/core/snd\tEXPORT_SYMBOL\n0x746b02ad\tdvb_ringbuffer_flush_spinlock_wakeup\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xecb4f205\tppp_unregister_channel\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0xa5a1c0a7\tlbtf_cmd_response_rx\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x59b03c64\t__ieee80211_create_tpt_led_trigger\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x7ffacefc\tieee80211_amsdu_to_8023s\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x749e05f2\tledtrig_flash_ctrl\tdrivers/leds/trigger/ledtrig-camera\tEXPORT_SYMBOL_GPL\n0x8b050e5f\tcx231xx_uninit_vbi_isoc\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x215cbd33\tiscsi_session_setup\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x655a08f0\tgenphy_update_link\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xcebd5e83\tip_set_get_ip_port\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0xfb8738f8\tcfg80211_new_sta\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x50eec86a\tvb2_queue_init\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xbf3ef26e\tath_rxbuf_alloc\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0xedb1ac52\ts5h1420_attach\tdrivers/media/dvb-frontends/s5h1420\tEXPORT_SYMBOL\n0xba9a1a5b\tcx231xx_enable_i2c_port_3\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x7b72000e\tlbtf_rx\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x08c473b7\txt_alloc_table_info\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0x26b9c11a\tieee80211_register_hw\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x7b6dd766\tdvb_ca_en50221_frda_irq\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x28ca119a\tem28xx_uninit_usb_xfer\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x583bbc7a\tnf_nat_l3proto_unregister\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0x120bfaee\tnf_nat_l4proto_unregister\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0x22889bde\tmb86a20s_attach\tdrivers/media/dvb-frontends/mb86a20s\tEXPORT_SYMBOL\n0xf47188ce\tp9_is_proto_dotu\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x0122777c\ttda10086_attach\tdrivers/media/dvb-frontends/tda10086\tEXPORT_SYMBOL\n0x6fb4a13b\tdvb_usb_generic_write\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0x0cd589ff\tbacklight_device_register\tdrivers/video/backlight/backlight\tEXPORT_SYMBOL\n0x9bf64370\tip_tunnel_lookup\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x01ec540a\tnf_ct_helper_log\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x98fa1e20\tdm_get_reserved_rq_based_ios\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x025e2d69\tocfs2_cluster_connect_agnostic\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0x0f8a2742\traid6_2data_recov\tlib/raid6/raid6_pq\tEXPORT_SYMBOL_GPL\n0x21a2ae71\tieee80211_sta_ps_transition\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xf5ac51b0\tmd_rdev_clear\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x1d9621e8\tieee80211_find_sta_by_ifaddr\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x2b2b26dd\tsnd_soc_dapm_info_pin_switch\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x1ce3b731\tv4l2_fh_del\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x3f91c310\tcfg80211_report_wowlan_wakeup\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x04567e64\tcryptd_aead_child\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xa3913aa6\trt2x00lib_txdone\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xd362e4e5\trt2x00queue_unpause_queue\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xf13e794d\tax25_rebuild_header\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x3590e3d8\tsnd_ctl_rename_id\tsound/core/snd\tEXPORT_SYMBOL\n0x3e257e20\tgre_del_protocol\tnet/ipv4/gre\tEXPORT_SYMBOL_GPL\n0x8e4e2657\tath9k_hw_btcoex_disable\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x3db8be82\tcx2341x_ctrl_query\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x41307e7b\tdibusb_dib3000mc_tuner_attach\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0xc0e8d53d\tw1_touch_block\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x4e5bf539\tllc_mac_hdr_init\tnet/llc/llc\tEXPORT_SYMBOL\n0xf38bcdf3\tnf_conntrack_max\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xc1c59b27\tsnd_pcm_suspend\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x8451e979\tdib7000m_get_i2c_master\tdrivers/media/dvb-frontends/dib7000m\tEXPORT_SYMBOL\n0x4268495b\tdib7000p_get_i2c_master\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x5f96a661\tv4l2_ctrl_check\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL\n0xa7976d9c\tvideo_unregister_device\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x426fcc31\tath9k_hw_write_associd\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x080ee62a\tath9k_hw_enable_interrupts\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb35963fe\trt2x00mac_get_antenna\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xfe93375b\trt2x00queue_get_entry\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xb622990d\thci_conn_check_secure\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x7577873a\tsnd_soc_codec_readable_register\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xbc3ad9ab\tnf_ct_seqadj_set\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x88386b22\tnfc_add_se\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x127a5901\tdrbd_set_st_err_str\tdrivers/block/drbd/drbd\tEXPORT_SYMBOL\n0xf0c243df\tsnd_timer_continue\tsound/core/snd-timer\tEXPORT_SYMBOL\n0xd9d2bb03\tsnd_usbmidi_disconnect\tsound/usb/snd-usbmidi-lib\tEXPORT_SYMBOL\n0xcaed8cae\tdvb_dmx_swfilter_204\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x8a8870be\tdvb_dmx_swfilter_raw\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x8442d672\tath9k_hw_beaconq_setup\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xfeaffc03\tnf_xfrm_me_harder\tnet/netfilter/nf_nat\tEXPORT_SYMBOL\n0xccca3747\tsnd_soc_platform_trigger\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xc184ec1e\tcx2341x_ctrl_get_menu\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x0ae12076\tttpci_eeprom_parse_mac\tdrivers/media/pci/ttpci/ttpci-eeprom\tEXPORT_SYMBOL\n0x033578ca\tsnd_card_file_add\tsound/core/snd\tEXPORT_SYMBOL\n0x46c1c4a2\tirlmp_unregister_service\tnet/irda/irda\tEXPORT_SYMBOL\n0x85e4ac82\tsnd_midi_event_new\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x652a9199\tdvb_usbv2_generic_rw_locked\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0x03ab5cda\tv4l2_ctrl_handler_free\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xa9c89561\tget_h225_addr\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0x4152ef0a\tnf_nat_snmp_hook\tnet/netfilter/nf_conntrack_snmp\tEXPORT_SYMBOL_GPL\n0xc74b3ca3\tnf_nat_tftp_hook\tnet/netfilter/nf_conntrack_tftp\tEXPORT_SYMBOL_GPL\n0xa92d201e\tip6_tnl_parse_tlv_enc_lim\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL\n0xdd8416a5\tsnd_info_create_module_entry\tsound/core/snd\tEXPORT_SYMBOL\n0x8b502e56\tsnd_soc_dapm_new_widgets\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x86ab22d5\tirlmp_open_lsap\tnet/irda/irda\tEXPORT_SYMBOL\n0x24b9a00d\tirttp_open_tsap\tnet/irda/irda\tEXPORT_SYMBOL\n0xc8a8b4ec\tl2cap_is_socket\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xdb1894a7\tip6_route_lookup\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xbbdb5c42\tsmscore_unregister_client\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x2c57d7ac\tinput_allocate_polled_device\tdrivers/input/input-polldev\tEXPORT_SYMBOL\n0x0e9b64e6\trt2x00lib_suspend\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x338f17b3\tsnd_pcm_lib_get_vmalloc_page\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x17523ce7\tdvb_frontend_sleep_until\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xa9f1e011\tfuse_direct_io\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x580215ef\tp9_client_open\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x751d8fac\tasync_memcpy\tcrypto/async_tx/async_memcpy\tEXPORT_SYMBOL_GPL\n0xb22fc0c0\tv4l2_fh_release\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x41a160e5\tsynth_buffer_empty\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xad3ad91c\tsystime\tdrivers/media/dvb-frontends/dibx000_common\tEXPORT_SYMBOL\n0x59005518\trt2x00lib_beacondone\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x8d915bd7\tllc_sap_open\tnet/llc/llc\tEXPORT_SYMBOL\n0x703ef58f\tnfc_dep_link_is_up\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x084d3798\tv4l2_g_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x683e65f5\trt2x00mac_set_antenna\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x88df8e74\tled_classdev_suspend\tdrivers/leds/led-class\tEXPORT_SYMBOL_GPL\n0xee6e1363\tsirdev_raw_read\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0x0466fb8b\tiscsi_boot_create_initiator\tdrivers/scsi/iscsi_boot_sysfs\tEXPORT_SYMBOL_GPL\n0xe6264393\tiscsi_boot_destroy_kset\tdrivers/scsi/iscsi_boot_sysfs\tEXPORT_SYMBOL_GPL\n0x796afe17\tsnd_pcm_hw_constraint_integer\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x6c4f1855\tath_hw_cycle_counters_update\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x048c9eff\tsnd_soc_dpcm_can_be_free_stop\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x08eb1821\thostap_remove_proc\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x4baaee86\t__nf_nat_mangle_tcp_packet\tnet/netfilter/nf_nat\tEXPORT_SYMBOL\n0x88eb37e0\tsnd_dma_alloc_pages\tsound/core/snd-page-alloc\tEXPORT_SYMBOL\n0x6cfd788f\tcdrom_release\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xe503775d\tv4l2_g_ext_ctrls\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x5084ae41\trt2x00usb_vendor_req_buff_lock\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x1a876649\tnfc_proto_register\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xf0631176\tsnd_seq_event_port_attach\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x200d7df8\tspk_synth_is_alive_nop\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x5f9f3d11\tip6_datagram_connect\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x1ce20554\tnf_conntrack_helper_try_module_get\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6d4b5154\tdib8096p_tuner_sleep\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x12f9c5a3\tv4l2_ctrl_poll\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xf0e40caf\tirttp_dup\tnet/irda/irda\tEXPORT_SYMBOL\n0x39e3dd23\tmod_firmware_load\tsound/sound_firmware\tEXPORT_SYMBOL\n0x111eb086\tfc0012_attach\tdrivers/media/tuners/fc0012\tEXPORT_SYMBOL\n0x481bd10a\tgspca_disconnect\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0xd73a8d5b\tftdi_elan_gone_away\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x9b1def92\twimax_dev_rm\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0xae687127\tsnd_rawmidi_kernel_write\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x0cb4b189\ttuners\tdrivers/media/tuners/tuner-types\tEXPORT_SYMBOL\n0x2dc227f8\tbrcmu_d11_attach\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0xb9990116\tsnd_ac97_pcm_double_rate_rules\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x737be22a\tusb_serial_generic_tiocmiwait\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x03c41373\tllc_sap_find\tnet/llc/llc\tEXPORT_SYMBOL\n0x9c0f3d09\tnfc_proto_unregister\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x3b72b266\tasync_trigger_callback\tcrypto/async_tx/async_tx\tEXPORT_SYMBOL_GPL\n0x7deff673\tdm_consume_args\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xda23a771\tpppox_unbind_sock\tdrivers/net/ppp/pppox\tEXPORT_SYMBOL\n0x6561f082\trt2800_sta_remove\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xc82622b0\talloc_ltalkdev\tnet/appletalk/appletalk\tEXPORT_SYMBOL\n0xe417d940\tocfs2_dlm_lvb\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0x0a469d23\tmfd_clone_cell\tdrivers/mfd/mfd-core\tEXPORT_SYMBOL\n0x68be1dfa\tdib8000_get_tune_state\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x0ff006f6\tdib8000_set_tune_state\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0xd2981357\tath9k_cmn_count_streams\tdrivers/net/wireless/ath/ath9k/ath9k_common\tEXPORT_SYMBOL\n0xb48956f8\tsynth_buffer_peek\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xa6ed7671\thci_recv_frame\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xdb68bbad\trfkill_destroy\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x10dcb517\tdibusb_streaming_ctrl\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x12375f50\tvb2_common_vm_ops\tdrivers/media/v4l2-core/videobuf2-memops\tEXPORT_SYMBOL_GPL\n0x03c00a76\tsnd_ac97_mixer\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x822677a5\trt2x00lib_resume\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x6bb71038\tsnd_seq_delete_kernel_client\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x5ee6877a\tsnd_pcm_kernel_ioctl\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x32885444\tl2cap_conn_put\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x1879fcbd\tbridge_tunnel_header\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x1f10f622\tsnd_card_free_when_closed\tsound/core/snd\tEXPORT_SYMBOL\n0xd2cbe0aa\trc_register_device\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x16b8eccc\trt2x00usb_disconnect\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xe9c9e274\tspk_synth_flush\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xfe510bb3\tieee80211_chswitch_done\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x1137ff72\tfl6_sock_lookup\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x844539ae\tsms_get_board\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x39861d6b\tv4l2_ctrl_handler_init_class\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xc1b6cf78\tath9k_hw_reset_calvalid\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x8035cc22\tsnd_info_free_entry\tsound/core/snd\tEXPORT_SYMBOL\n0xc2f83f3f\tieee80211_get_tkip_p2k\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x1a83556f\tieee80211_connection_loss\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xaf4e212e\tregister_ip_vs_scheduler\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x3f5b1415\tnf_ct_port_nlattr_to_tuple\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xd1779362\tsnd_pcm_set_ops\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xff40e7c7\tmedia_entity_remove_links\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xee1ada8e\trt2800_config\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x2f847f4b\tax25_linkfail_release\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x5fdf38b8\tlbs_disablemesh\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x2c51939d\tfuse_dev_operations\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0xce963897\tdibusb_pid_filter_ctrl\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x48034724\tzlib_deflateReset\tlib/zlib_deflate/zlib_deflate\tEXPORT_SYMBOL\n0x4fbe7958\tnf_conntrack_flush_report\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x41398ceb\tsnd_pcm_lib_malloc_pages\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x763e54a4\tirlmp_unregister_client\tnet/irda/irda\tEXPORT_SYMBOL\n0x673eddac\tdvb_generic_release\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x31f4077c\tdib7090_slave_reset\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xe4aaa3a6\tath9k_hw_setuprxdesc\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x977a0030\tp9_nr_pages\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x0a245e88\thostap_set_word\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xeed7e6db\tlbtf_cmd_copyback\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x010efa7d\tunregister_8022_client\tnet/802/p8022\tEXPORT_SYMBOL\n0x65a67884\tirlmp_close_lsap\tnet/irda/irda\tEXPORT_SYMBOL\n0x22caf86e\thashbin_remove_this\tnet/irda/irda\tEXPORT_SYMBOL\n0x6fc0dc5b\tirttp_close_tsap\tnet/irda/irda\tEXPORT_SYMBOL\n0x803bbc5d\tllc_set_station_handler\tnet/llc/llc\tEXPORT_SYMBOL\n0x4e50c23e\tsnd_ctl_add_vmaster_hook\tsound/core/snd\tEXPORT_SYMBOL_GPL\n0x260df96c\tdvb_ca_en50221_camchange_irq\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xe6fce6f2\tv4l2_ctrl_merge\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x1b76f016\twiphy_unregister\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x293dbb12\tsnd_soc_register_component\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xcf8b77a4\tcx2341x_mpeg_ctrls\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0xe0ff49b1\tfc0013_rc_cal_add\tdrivers/media/tuners/fc0013\tEXPORT_SYMBOL\n0x90e5502e\tiscsi_complete_scsi_task\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x693c3961\tnf_ct_helper_hash\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x1a7e7c99\tsnd_soc_dai_set_sysclk\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x16000a3c\tdm_device_name\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x5fe6d4a9\trt2800_disable_wpdma\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x7083dbd5\tocfs2_dlm_dump_lksb\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xe21bb70d\tsmscore_onresponse\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xe5fd1d90\tdm_kcopyd_copy\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xb1edebcd\tdib7000m_pid_filter_ctrl\tdrivers/media/dvb-frontends/dib7000m\tEXPORT_SYMBOL\n0x1805e6aa\tdib7000p_pid_filter_ctrl\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x79f78fce\tiscsi_suspend_queue\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xc7fdd3d2\tusb_serial_handle_dcd_change\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xce3ca308\tcopy_from_user_toio\tsound/core/snd\tEXPORT_SYMBOL\n0x15af5c93\tv4l2_ctrl_add_handler\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x92706504\tar9003_hw_bb_watchdog_dbg_info\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x27d4671a\trt2800_write_tx_data\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x81db6ebb\txz_dec_reset\tlib/xz/xz_dec\tEXPORT_SYMBOL\n0x0b84f5e0\txfrm6_input_addr\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x139b8200\trc_g_keycode_from_table\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0xb6470891\thci_get_route\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xb77b0159\tv4l2_prio_init\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x4355e8de\trt2x00usb_regbusy_read\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xbe526558\tac97_bus_type\tsound/ac97_bus\tEXPORT_SYMBOL\n0x43fac1b9\tsnd_timer_close\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x2ce0c6e7\tdib0090_get_wbd_target\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x2c7c264c\ti2400m_init\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x343ab1c6\tnf_conntrack_broadcast_help\tnet/netfilter/nf_conntrack_broadcast\tEXPORT_SYMBOL_GPL\n0x19cdd955\tar9003_mci_state\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb96d5149\tlgs8gxx_attach\tdrivers/media/dvb-frontends/lgs8gxx\tEXPORT_SYMBOL\n0x73bb5aed\tmdiobus_write\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x30e1a55d\trt2800_config_filter\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xb710786e\thashbin_get_first\tnet/irda/irda\tEXPORT_SYMBOL\n0xe8293cd7\tsnd_soc_add_dai_controls\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x53c9394f\tv4l2_ctrl_query_menu\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL\n0x27661b15\tndisc_mc_map\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xb1aa9777\tnf_ct_helper_expectfn_find_by_symbol\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x86dc078f\tmedia_device_register_entity\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xbac41bdb\twimax_state_change\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x580b480a\tsnd_soc_get_strobe\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb21f5681\tsnd_soc_put_strobe\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x8b983db8\tip_tunnel_ioctl\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x8104798e\thdlcdrv_transmitter\tdrivers/net/hamradio/hdlcdrv\tEXPORT_SYMBOL\n0x5ba93f9d\traid6_gfinv\tlib/raid6/raid6_pq\tEXPORT_SYMBOL\n0x5ed37c92\tnf_ct_extend_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6def5020\tnxt200x_attach\tdrivers/media/dvb-frontends/nxt200x\tEXPORT_SYMBOL\n0xb84f601a\tath9k_hw_ani_monitor\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xc421f053\tvideobuf_reqbufs\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x3d658bac\tv4l2_queryctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xdd26a9b7\trt2800_load_firmware\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x06b6a472\tv4l2_ctrl_handler_log_status\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x22aa3b1f\tw1_ds2760_store_eeprom\tdrivers/w1/slaves/w1_ds2760\tEXPORT_SYMBOL\n0x11964d36\tieee80211_wake_queue\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xfa1178ca\tgspca_suspend\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0x291a55dc\tath_gen_timer_alloc\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x1b58b696\tinet6_csk_addr2sockaddr\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xba8e1e12\txt_unregister_targets\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xc2075131\ttda826x_attach\tdrivers/media/dvb-frontends/tda826x\tEXPORT_SYMBOL\n0xd60f2c6c\to2hb_check_local_node_heartbeating\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x5dd2f2f7\tvideobuf_qbuf\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0xc5005c45\tsnd_soc_dai_set_tdm_slot\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x8421d469\tsnd_soc_set_ac97_ops\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xd0e79fb7\tem28xx_write_reg_bits\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x91c62060\tiscsi_set_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xc168c26e\tmd_ack_all_badblocks\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x8b7e4c1c\t__ieee80211_get_rx_led_name\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xe077886d\tv4l2_ctrl_new_int_menu\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xf31cf78e\tinet6_release\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xc18ac88d\tnf_ct_expect_hsize\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x8b55b714\tdib7000pc_detection\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x315c65fd\tzlib_deflateInit2\tlib/zlib_deflate/zlib_deflate\tEXPORT_SYMBOL\n0xb7813013\tnfc_set_remote_general_bytes\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x7903e46e\tledtrig_torch_ctrl\tdrivers/leds/trigger/ledtrig-camera\tEXPORT_SYMBOL_GPL\n0xe40cffce\tocfs2_stack_glue_set_max_proto_version\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xd8525ea7\tfl6_update_dst\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x7242bf44\tlirc_dev_fop_open\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0x813f3de4\tv4l2_find_nearest_format\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0xcb24850f\tl2tp_tunnel_create\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0xbec5dc14\tsnd_soc_dapm_put_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x9d8aa6b3\tsnd_soc_dapm_get_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xe78b225e\tsnd_soc_jack_report\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x9b4b588e\tgameport_unregister_port\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0xffcb397c\tcx231xx_disable656\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x6d100e9f\tath9k_hw_set_tsfadjust\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x83f48a54\tiscsi_conn_teardown\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xb4bd060c\tocfs2_dlm_lock_status\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0x2939ebc5\tspk_serial_synth_probe\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x289c3714\tnf_ct_alloc_hashtable\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xb5ca1c46\tslhc_free\tdrivers/net/slip/slhc\tEXPORT_SYMBOL\n0xe6b6334a\trt6_lookup\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x550322ae\thci_recv_fragment\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x2ab3a31a\tip_tunnel_delete_net\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x6f9df6ed\tieee80211_beacon_loss\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x78397c6f\tmedia_entity_cleanup\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x52411d0c\tvb2_prepare_buf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x12b5366c\tsnd_rawmidi_kernel_release\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0xfe032669\tcrypto_sha256_update\tcrypto/sha256_generic\tEXPORT_SYMBOL\n0x6bc35468\thostap_init_ap_proc\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x86c6d3ce\tqt1010_attach\tdrivers/media/tuners/qt1010\tEXPORT_SYMBOL\n0x28830460\tnf_ct_seq_offset\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x999e2fae\tflexcop_pass_dmx_data\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x4e5851ea\tcx231xx_unmute_audio\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xf5ef842e\tv4l_bound_align_image\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x91f2df83\tv4l2_ctrl_new_std_menu\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x1c2d2f52\tath9k_hw_bstuck_nfcal\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x89df7997\tcfg80211_auth_timeout\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x24a4d52f\tmddev_init\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x25f243b2\tnfnetlink_set_err\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0xae32666c\tsnd_ac97_bus\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0xf862832d\tmwifiex_disable_auto_ds\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xd217b4db\tusb_serial_handle_break\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x522b9daf\tbt_sock_register\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xedf805a9\tirias_delete_object\tnet/irda/irda\tEXPORT_SYMBOL\n0xf6c86996\tau8522_readreg\tdrivers/media/dvb-frontends/au8522_common\tEXPORT_SYMBOL\n0x5a89d87f\trt2x00queue_flush_queue\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xbcd3ef13\tirias_object_change_attribute\tnet/irda/irda\tEXPORT_SYMBOL\n0x418daef0\tsnd_pcm_hw_constraint_minmax\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x75bc05dd\tmedia_device_register\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xb00b793c\ti2400m_bm_cmd_prepare\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0xc85e6899\tlbtf_debug\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0xfcf964a7\tsnd_midi_event_free\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x8de47930\tad714x_probe\tdrivers/input/misc/ad714x\tEXPORT_SYMBOL\n0xf381b9d4\tmdiobus_unregister\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x80ee65e9\tgarp_request_leave\tnet/802/garp\tEXPORT_SYMBOL_GPL\n0x12e959df\tllc_sap_close\tnet/llc/llc\tEXPORT_SYMBOL\n0x5c7bdef5\tieee80211_free_txskb\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xc23ed9bf\tphy_detach\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xf53cddd4\tp9_payload_gup\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x21e36bf2\tsmscore_registry_getmode\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x2d3156f7\tbt_procfs_cleanup\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x694d6b4a\tnf_conntrack_l4proto_udp6\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x26c42c8b\twimax_msg_data_len\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0x9a0d31b4\trt2x00mac_tx\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x7730f22d\tdrbd_conn_str\tdrivers/block/drbd/drbd\tEXPORT_SYMBOL\n0x526afda4\tp9_client_unlinkat\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x8d163a74\tsnd_pcm_hw_constraint_ratnums\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x7ac00668\tsnd_ctl_replace\tsound/core/snd\tEXPORT_SYMBOL\n0x097c3998\tmd_allow_write\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xebd57e13\tsirdev_write_complete\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0x2186b910\tusb_serial_resume\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL\n0x7e3dd821\tsirdev_receive\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0x0eca7a3b\tieee80211_rx\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x73fee374\tieee80211_rx_irqsafe\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xf734bcda\tnf_nat_sdp_media_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0xdd142ff4\tath9k_hw_kill_interrupts\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x836c4aab\tlbs_suspend\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0xb3c694b0\tnf_ct_iterate_cleanup\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xb189e246\tdvb_unregister_adapter\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xdcf171e3\tphy_start_aneg\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x52d7b2fd\tllc_sap_list\tnet/llc/llc\tEXPORT_SYMBOL\n0xe116295b\tlc_index_of\tlib/lru_cache\tEXPORT_SYMBOL\n0x6b6c3d10\tnf_defrag_ipv4_enable\tnet/ipv4/netfilter/nf_defrag_ipv4\tEXPORT_SYMBOL_GPL\n0x6eb85693\tnf_defrag_ipv6_enable\tnet/ipv6/netfilter/nf_defrag_ipv6\tEXPORT_SYMBOL_GPL\n0x49457788\trtl2830_get_tuner_i2c_adapter\tdrivers/media/dvb-frontends/rtl2830\tEXPORT_SYMBOL\n0xad1bb027\tnf_ct_free_hashtable\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6c5697b2\tnf_ct_tcp_seqadj_set\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x2a6d4f6d\tasync_xor_val\tcrypto/async_tx/async_xor\tEXPORT_SYMBOL_GPL\n0x6d1f48b2\tath9k_hw_init\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x5b5d9628\tip6_datagram_send_ctl\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xb105a536\tieee80211_iterate_active_interfaces_atomic\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x7fcff90e\tv4l2_spi_new_subdev\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x72fab85a\tv4l2_ctrl_handler_setup\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xc5851fcf\tmd_integrity_add_rdev\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x42d58711\tiscsi_tcp_r2tpool_alloc\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0xccdedb73\tcdc_ncm_unbind\tdrivers/net/usb/cdc_ncm\tEXPORT_SYMBOL_GPL\n0xae87f18f\trt2800_get_tkip_seq\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xeb711ae7\tsnd_soc_params_to_bclk\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x26062f02\tdvb_net_init\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xb0c3e231\trc_free_device\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x018b5769\tipt_alloc_initial_table\tnet/ipv4/netfilter/ip_tables\tEXPORT_SYMBOL_GPL\n0x2d3765bc\thashbin_find\tnet/irda/irda\tEXPORT_SYMBOL\n0xc95af87a\tct_sip_get_header\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x683b8eb6\tserio_rescan\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x86945a64\tmd_error\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x9cad01d2\tv4l2_clk_unregister\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x7affc16e\tezusb_fx1_ihex_firmware_download\tdrivers/usb/misc/ezusb\tEXPORT_SYMBOL_GPL\n0xc2c745db\tulist_next\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0x3d73a797\tp9_errstr2errno\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x9f2c4345\tieee80211_csa_is_complete\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xa8e12de9\tsnd_rawmidi_input_params\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x38efaf5a\tdm_region_hash_destroy\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x9018dea8\tvb2_fop_read\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xcab63c3d\tdm_rh_get_state\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x542da061\tphy_get_eee_err\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xf4e22813\tath9k_cmn_get_hw_crypto_keytype\tdrivers/net/wireless/ath/ath9k/ath9k_common\tEXPORT_SYMBOL\n0x68c451e8\tath9k_hw_txstart\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x5a166bfa\tath9k_hw_btcoex_bt_stomp\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x5eb24829\tdm_shift_arg\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x684c535b\tv4l2_async_unregister_subdev\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x822222db\teeprom_93cx6_write\tdrivers/misc/eeprom/eeprom_93cx6\tEXPORT_SYMBOL_GPL\n0x04892d99\tath_reg_notifier_apply\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x3a816da6\tdibx000_reset_i2c_master\tdrivers/media/dvb-frontends/dibx000_common\tEXPORT_SYMBOL\n0x98614854\tusb_wwan_resume\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x1b34a49d\tieee80211_enable_rssi_reports\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x34b704d7\tunregister_ip_vs_pe\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL_GPL\n0xbeec0678\tsnd_soc_put_volsw\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x7fb5b4fc\tsnd_soc_get_volsw\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x80634d25\tip6_tnl_rcv_ctl\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL_GPL\n0xc28a1c30\t__ieee80211_get_channel\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xdb59533d\tppp_unit_number\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x5b40da43\tppp_input_error\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x9ac7feb9\tlbs_notify_command_response\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0xbbc4ef97\tocfs2_stack_supports_plocks\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xc56d283e\t__nf_conntrack_helper_find\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x80e3832d\tdvb_filter_get_ac3info\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xd7985c16\tv4l2_device_disconnect\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x86c8e1fd\tusb_serial_generic_open\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x8852d639\tp9_client_link\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x0f282dbd\tmd_wait_for_blocked_rdev\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xd56e5893\thci_unregister_cb\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x9ca1f95c\tebt_do_table\tnet/bridge/netfilter/ebtables\tEXPORT_SYMBOL\n0x67aec938\tip_set_type_unregister\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x106c573b\tnf_nat_l3proto_register\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0xbb495e0b\tnf_nat_l4proto_register\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0xf55a9a07\tsnd_virmidi_new\tsound/core/seq/snd-seq-virmidi\tEXPORT_SYMBOL\n0x9e419141\tsnd_soc_dai_set_fmt\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x94345bb7\tsnd_soc_cache_write\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x279932e4\tiscsi_tcp_segment_done\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0xdc823ea4\tocfs2_cluster_disconnect\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0x16531daa\tp9_client_setattr\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xd2f58c8b\tvideobuf_queue_is_busy\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x38b92846\tllc_remove_pack\tnet/llc/llc\tEXPORT_SYMBOL\n0x2ff58880\tieee80211_alloc_hw\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x0ee09547\tdvb_register_adapter\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x29ccf4f7\tgspca_expo_autogain\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0xcb136ca0\tvb2_ioctl_querybuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xf0f6a947\trt2x00queue_flush_queues\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x4f3a9122\tcfg80211_disconnected\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x1ff84ee8\trt2800_config_ant\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x907264c4\tirda_notify_init\tnet/irda/irda\tEXPORT_SYMBOL\n0x9e1322ca\tmedia_entity_remote_pad\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x14c3f645\tp9_client_read\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xd778288d\tsnd_dmaengine_pcm_prepare_slave_config\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xe33ee2ba\tphy_start\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x0d20e174\tp9_client_write\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x62813e5c\tnf_ct_port_nlattr_tuple_size\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x03c83ce7\tnfnetlink_alloc_skb\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0x617088a6\txt_hook_link\tnet/netfilter/x_tables\tEXPORT_SYMBOL_GPL\n0x121dcd8d\tath9k_hw_reset\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb4b77c8b\thostap_80211_get_hdrlen\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x1615b15c\tw1_reset_bus\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0xd332b73e\tircomm_connect_request\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0x491efea1\tsnd_compress_new\tsound/core/snd-compress\tEXPORT_SYMBOL_GPL\n0x66c0289a\tb2c2_flexcop_debug\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL_GPL\n0x454e2836\thostap_set_auth_algs\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x3c4a44e9\tuio_unregister_device\tdrivers/uio/uio\tEXPORT_SYMBOL_GPL\n0x40a2d1dd\tdm_table_get_size\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0xfa66f59a\tcx231xx_init_isoc\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x604ea4fb\tvb2_streamon\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xb1aeb1e4\tgenphy_restart_aneg\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x86009214\tlbs_cmd_copyback\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x142fff5e\tssb_dma_translation\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xe5a10503\tsnd_ac97_get_short_name\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0xcf144b72\tlbs_host_to_card_done\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x4d3af7fa\tocfs2_cluster_hangup\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0x1b142ebb\tsnd_dmaengine_pcm_close_release_chan\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x814611ae\tsnd_pcm_lib_read\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x5156644e\tmd_stop\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xebed9b73\tv4l2_device_unregister\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x191c52eb\tphy_connect_direct\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x531ec7e2\tiscsi_eh_recover_target\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x650f8603\tsnd_pcm_format_silence_64\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x9033f718\tbt_sock_ioctl\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xe86a617c\tsnd_soc_register_codec\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x1d75aae0\tssb_bus_powerup\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xb1320bc8\tulist_add\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0x4fb53920\tarpt_register_table\tnet/ipv4/netfilter/arp_tables\tEXPORT_SYMBOL\n0x1b7a6c29\tipv6_opt_accepted\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x39bf9301\t_snd_pcm_hw_param_setempty\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x1f1b6e90\trt2800_sta_add\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x8ede9e26\tax25_protocol_release\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x32d17ecd\tnfc_tm_data_received\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xfdf58504\tdapm_mark_io_dirty\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xd7fae3c3\tmd_wakeup_thread\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x09e78ab0\txt_rateest_lookup\tnet/netfilter/xt_RATEEST\tEXPORT_SYMBOL_GPL\n0xb16fe7b3\tdm_ratelimit_state\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x9c2225ed\tsmscore_translate_msg\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xca3eaf56\tv4l2_subdev_try_ext_ctrls\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x795e26b4\trndis_tx_fixup\tdrivers/net/usb/rndis_host\tEXPORT_SYMBOL_GPL\n0x11ac6062\tirda_device_set_media_busy\tnet/irda/irda\tEXPORT_SYMBOL\n0xde69770f\tcfg80211_ft_event\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x021d4fbb\tath6kl_stop_txrx\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x4cfdc0c6\tip_vs_conn_out_get\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0xcab57807\t__nf_ct_l4proto_find\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xb249bfe3\tdvb_ca_en50221_camready_irq\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x80d659a1\tv4l2_ctrl_new_std_menu_items\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x3779e095\tp9_release_pages\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xf6ea2def\txc2028_attach\tdrivers/media/tuners/tuner-xc2028\tEXPORT_SYMBOL\n0x0d6a4502\tem28xx_unregister_extension\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL\n0xc6046577\tcfg80211_unregister_wdev\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x4b5eeff2\tv4l2_ctrl_modify_range\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xe46c0bbc\tv4l2_ctrl_get_int_menu\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x284f51af\trt2x00lib_rxdone\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xc3b062db\tip_set_nfnl_get_byindex\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0xcb152562\tnfs4_acl_posix_to_nfsv4\tfs/nfsd/nfsd\tEXPORT_SYMBOL\n0x798ff7fb\tieee80211_iter_chan_contexts_atomic\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x1d0d3b71\tath9k_hw_cfg_gpio_input\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb90668b2\tsnd_seq_autoload_lock\tsound/core/seq/snd-seq-device\tEXPORT_SYMBOL\n0x77adc684\tsnd_pcm_hw_param_last\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x23f28556\ti2400m_cmd_enter_powersave\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0xaa31e809\tcfg80211_report_obss_beacon\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xb7bde15f\tsnd_soc_get_value_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3926c80b\tsnd_soc_put_value_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x81b69e41\tsnd_ctl_enum_info\tsound/core/snd\tEXPORT_SYMBOL\n0xa0166177\tsnd_soc_dpcm_be_get_state\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x6c100000\tsnd_soc_dpcm_be_set_state\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x1b2bbe16\tdm_set_device_limits\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0xe6b9bf47\tsnd_pcm_hw_refine\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xb157c47d\tdib0090_fw_register\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0xa60188ac\trt2x00lib_probe_dev\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x9cd5f374\tunregister_ip_vs_app\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x817fa788\tcryptd_ahash_child\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xc400a7e9\tusb_serial_register_drivers\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0x240a34ac\troccat_common2_send_with_status\tdrivers/hid/hid-roccat-common\tEXPORT_SYMBOL_GPL\n0x9b554b89\tdvb_dmxdev_release\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x2501554a\tar9003_paprd_populate_single_table\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x7d00a665\tbrcmu_pktq_pflush\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x1654db78\tsnd_ac97_write\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x7924b6de\tip_set_hostmask_map\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x49a8414b\tvideobuf_alloc_vb\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x4d6c5103\tsirdev_set_dtr_rts\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0xdb04e6af\tinet6_csk_xmit\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x88fc9ddc\tregister_ip_vs_pe\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL_GPL\n0xf6f4721f\tcfg80211_scan_done\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xee9b53ac\tcfg80211_radar_event\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x56c098cd\tv4l2_subdev_s_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x652903f3\tv4l2_subdev_g_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x50aa5a25\tipv6_recv_error\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x7f06fd7b\tieee80211_proberesp_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xef845b5c\tsnd_soc_put_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x26caeab9\tsnd_soc_get_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x4103badb\tv4l2_print_dv_timings\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0x1953844c\tphy_driver_register\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xcec9a771\tunregister_snap_client\tnet/802/psnap\tEXPORT_SYMBOL\n0x1f3d9b0c\tdm_exception_store_type_register\tdrivers/md/dm-snapshot\tEXPORT_SYMBOL\n0x45b3df8d\tphy_print_status\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x91cfb84a\tath6kl_hif_rw_comp_handler\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x7fa7bb5f\tath6kl_hif_intr_bh_handler\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x4d4eaa2e\trt2800_config_intf\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x0a3d33f0\tnf_conntrack_register_notifier\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x2506f1bc\tcfg80211_rx_unprot_mlme_mgmt\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x8393a75b\titd1000_attach\tdrivers/media/dvb-frontends/itd1000\tEXPORT_SYMBOL\n0x8cb70849\tiscsi_boot_create_target\tdrivers/scsi/iscsi_boot_sysfs\tEXPORT_SYMBOL_GPL\n0x2df40149\tw1_write_block\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x42df1142\tflexcop_device_kmalloc\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x0c887e85\ttm6000_unregister_extension\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL\n0x21096a55\to2nm_node_put\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x6e224a7a\tneed_conntrack\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xf826deb0\tdvb_filter_pes2ts\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x406a8302\tcfg80211_chandef_valid\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x2036ad06\tirda_param_insert\tnet/irda/irda\tEXPORT_SYMBOL\n0x602c96f0\tcopy_to_user_fromio\tsound/core/snd\tEXPORT_SYMBOL\n0x2bf40d77\tcdrom_open\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xde82b13d\tdvb_usbv2_generic_write\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0x58413099\tipv6_fixup_options\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x14f875ce\tdevm_regmap_init_mmio_clk\tdrivers/base/regmap/regmap-mmio\tEXPORT_SYMBOL_GPL\n0xc53df70d\tcryptd_alloc_ahash\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xb04efde3\tvb2_streamoff\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x9de8638e\tp9_client_stat\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x29579eb1\tdapm_regulator_event\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb1e0ca28\txts_crypt\tcrypto/xts\tEXPORT_SYMBOL_GPL\n0x6e2873d9\tiscsi_change_queue_depth\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x42e95460\tvideobuf_dvb_find_frontend\tdrivers/media/v4l2-core/videobuf-dvb\tEXPORT_SYMBOL\n0xba7e1bf3\tath9k_hw_name\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x6374f5be\tinet_diag_dump_icsk\tnet/ipv4/inet_diag\tEXPORT_SYMBOL_GPL\n0x0f8c286c\tusb_ftdi_elan_read_pcimem\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x000e2ebb\tw1_next_pullup\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x37386cac\tnf_conntrack_hash_rnd\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xdb065657\tnfnl_unlock\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0x8046d189\tau8522_attach\tdrivers/media/dvb-frontends/au8522_dig\tEXPORT_SYMBOL\n0x54ff35e0\tvb2_poll\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xdfc7e8fd\tbrcmu_pktq_flush\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0xe7464623\tnf_connlabel_match\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x37bc0daa\tbio_alloc_mddev\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xe2f7bde4\ti2400m_pre_reset\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x4c6ddcb4\tath6kl_err\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x6339b6d0\tsnd_seq_device_load_drivers\tsound/core/seq/snd-seq-device\tEXPORT_SYMBOL\n0x6ab320c3\tdib0090_register\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x42950e4a\tssb_set_devtypedata\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x01f20b74\tdlm_register_eviction_cb\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0xd83962c0\tnf_ct_gre_keymap_flush\tnet/netfilter/nf_conntrack_proto_gre\tEXPORT_SYMBOL\n0x564a803d\tsnd_pcm_hw_constraint_pow2\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x9d906b0c\tdapm_reg_event\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x31519d9e\tlbtf_add_card\tdrivers/net/wireless/libertas_tf/libertas_tf\tEXPORT_SYMBOL_GPL\n0x3f111679\trt2800_get_survey\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x5cb8e4a1\t__videobuf_mmap_setup\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x0906b45b\tath_hw_keyreset\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0x3373a34c\trt2800_vco_calibration\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xaf27bebf\tdrbd_disk_str\tdrivers/block/drbd/drbd\tEXPORT_SYMBOL\n0xb21cfaa9\tusb_wwan_dtr_rts\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x6d6cb9ad\tieee80211_operating_class_to_band\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x9f3a098a\tnfnetlink_send\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0xeeea1cfa\tsnd_soc_info_volsw_s8\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x187769e7\tserio_open\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0xa53387c7\tdm_rh_flush\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x345e3008\tcx24113_attach\tdrivers/media/dvb-frontends/cx24113\tEXPORT_SYMBOL\n0x8794fecb\tvchan_init\tdrivers/dma/virt-dma\tEXPORT_SYMBOL_GPL\n0x4f6f3604\tserio_close\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x7830473c\tvb2_ioctl_qbuf\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x0886d768\tmd_is_badblock\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x83a4e096\tphy_register_fixup_for_uid\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x6e800560\trt2x00usb_suspend\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0x741ff612\tinet6_register_protosw\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x5ce3b588\tnfnl_lock\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0xdbabbae6\tath9k_hw_wow_wakeup\tdrivers/net/wireless/ath/ath9k/ath9k\tEXPORT_SYMBOL\n0x69b18f43\trfc1042_header\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x0df2e317\tsnd_midi_event_encode\tsound/core/seq/snd-seq-midi-event\tEXPORT_SYMBOL\n0x926a7bee\taf9005_rc_decode\tdrivers/media/usb/dvb-usb/dvb-usb-af9005-remote\tEXPORT_SYMBOL\n0x5726f0c9\tvideobuf_next_field\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x6ef6067d\tiscsi_tcp_conn_get_stats\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x17eb1017\tdvb_usbv2_disconnect\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0x27cf1694\tath6kl_warn\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x9511b2db\thostap_set_hostapd_sta\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x687f6251\tmlog_and_bits\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0xce6ce3f0\tp9_client_fcreate\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x33d39d16\tlirc_register_driver\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0x5cf48f38\tset_ras_addr_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0xf2de8195\tdm_dirty_log_type_register\tdrivers/md/dm-log\tEXPORT_SYMBOL\n0xf30e823c\tusb_cypress_load_firmware\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0x36418553\to2net_send_message\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x7baecdab\twimax_report_rfkill_hw\tnet/wimax/wimax\tEXPORT_SYMBOL_GPL\n0xa1a1cc80\tsnd_pcm_limit_hw_rates\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xf487376d\tdvb_ringbuffer_avail\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xb216c975\tv9fs_get_default_trans\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xcfe987dc\tsnd_soc_dapm_kcontrol_codec\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xee8dabcf\tvb2_fop_release\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x9a078e6f\txt_register_match\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xf816f62e\tvb2_mmap\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x2c946133\tsnd_soc_codec_set_cache_io\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xba6e8ad8\tgenphy_suspend\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x1d9956ef\tiscsi_host_alloc\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x24a22b27\tlc_get\tlib/lru_cache\tEXPORT_SYMBOL\n0x61b76a31\tlc_put\tlib/lru_cache\tEXPORT_SYMBOL\n0x01a4523b\tlc_set\tlib/lru_cache\tEXPORT_SYMBOL\n0x1fc614cc\tnf_conntrack_hash_check_insert\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x0e4fe40c\tv4l2_spi_subdev_init\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL_GPL\n0x5668d8fd\tvideobuf_dvb_register_bus\tdrivers/media/v4l2-core/videobuf-dvb\tEXPORT_SYMBOL\n0x859047c5\tath9k_hw_cfg_output\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x4732271c\tvideobuf_iolock\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x1b84c278\t__nf_ct_ext_add_length\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL\n0xcfa1f518\tsnd_rawmidi_drain_input\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x3eccb006\tsnd_register_device_for_dev\tsound/core/snd\tEXPORT_SYMBOL\n0xc6e60740\tfc0013_rc_cal_reset\tdrivers/media/tuners/fc0013\tEXPORT_SYMBOL\n0xd563e552\tath6kl_core_init\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0xf64277de\tlbs_debug\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x8464574e\tip6_dst_lookup\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0x783dc003\tcfg80211_wext_giwrange\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0xb9feab14\tmd_raid10_congested\tdrivers/md/raid10\tEXPORT_SYMBOL_GPL\n0xd5909ad0\tmedia_device_unregister\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x0d3dfcf0\tmwifiex_remove_card\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xfb4567b9\thci_resume_dev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x052bdb7d\tieee80211_free_hw\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x20ef23a2\tpppox_ioctl\tdrivers/net/ppp/pppox\tEXPORT_SYMBOL\n0x8c67f15e\tdlmunlock\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0x0337fbd1\tsnd_pcm_stop\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xdab6dcd6\tem28xx_write_ac97\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xc1f703ac\tiscsi_session_get_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xe5ae8707\tintlog10\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xb9e2de7c\tbrcmu_pktq_pdeq_match\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0x5c7f7129\tiscsi_host_get_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x14d309f6\tcfg80211_pmksa_candidate_notify\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x8b9a4fd5\trt2x00usb_resume\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xbf9d8b1a\t__nf_ct_ext_destroy\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL\n0xa197b1ff\tieee80211_get_mesh_hdrlen\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xde26d7fe\tlnbp21_attach\tdrivers/media/dvb-frontends/lnbp21\tEXPORT_SYMBOL\n0x1c7cc0b3\tstb6000_attach\tdrivers/media/dvb-frontends/stb6000\tEXPORT_SYMBOL\n0x401fbc23\tstb6100_attach\tdrivers/media/dvb-frontends/stb6100\tEXPORT_SYMBOL\n0xe239eadb\tstv0900_attach\tdrivers/media/dvb-frontends/stv0900\tEXPORT_SYMBOL\n0xbfd7d7a2\to2hb_global_heartbeat_active\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL\n0xffe1fc3a\tieee80211_pspoll_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xae838201\tlib80211_get_crypto_ops\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0x812ced2c\tsmscore_get_device_mode\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x6109cade\tdib0090_update_tuning_table_7090\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0x4bcc0896\tvideo_ioctl2\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x1f4d7fe8\tw1_read_block\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x97f93f49\tip6_expire_frag_queue\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xb30eac74\tieee80211_rts_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x1b6167d8\tcx231xx_set_mode\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0x4adaf0f3\tv4l2_ctrl_query_menu_valid_items\tdrivers/media/v4l2-core/v4l2-common\tEXPORT_SYMBOL\n0xac93ae05\tax25_bcast\tnet/ax25/ax25\tEXPORT_SYMBOL_GPL\n0xf7b7bddc\tssb_pmu_set_ldo_voltage\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0xc3df4402\tirlmp_connect_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x504bb2f8\tirttp_connect_request\tnet/irda/irda\tEXPORT_SYMBOL\n0x0be6704b\tsnd_rawmidi_receive\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x4f476e96\tinit_cdrom_command\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0x892d76b2\tcma3000_resume\tdrivers/input/misc/cma3000_d0x\tEXPORT_SYMBOL\n0x311edbae\tflexcop_device_exit\tdrivers/media/common/b2c2/b2c2-flexcop\tEXPORT_SYMBOL\n0x53dea1ff\tax2asc\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x34edea7f\t__nf_ct_refresh_acct\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xcac0a3be\tsnd_seq_kernel_client_enqueue\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x8d1eca42\tdm_rh_bio_to_region\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xb400bce4\tem28xx_audio_setup\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xd80c3603\tcrc7_syndrome_table\tlib/crc7\tEXPORT_SYMBOL\n0x1761ae5e\tnf_ct_expect_register_notifier\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xefda0ab9\tnf_conntrack_untracked\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL\n0x796c2d48\tdm_get_md\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0xe43b540f\tfc0013_attach\tdrivers/media/tuners/fc0013\tEXPORT_SYMBOL\n0xd8cf91ba\tieee80211_request_smps\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x15b4e9e8\tsnd_soc_cache_read\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x75dd008c\tcdrom_ioctl\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0x8b4fc3ba\tlirc_dev_fop_close\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0x82b75ac6\trt2800_set_rts_threshold\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0xc40f284c\tnf_ct_helper_hsize\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xc79bcd36\tdm_vcalloc\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x4321b449\tvideobuf_read_stop\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x6aff3b61\tnfnl_acct_update\tnet/netfilter/nfnetlink_acct\tEXPORT_SYMBOL_GPL\n0x6ee22b7c\tcfg80211_mgmt_tx_status\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x8f595b11\tsnd_major\tsound/core/snd\tEXPORT_SYMBOL\n0xf6f0bf5d\tvideobuf_waiton\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0xb015b057\tppp_register_compressor\tdrivers/net/ppp/ppp_generic\tEXPORT_SYMBOL\n0x09e913c1\tsnd_pcm_alt_chmaps\tsound/core/snd-pcm\tEXPORT_SYMBOL_GPL\n0xdf197a16\tatbm8830_attach\tdrivers/media/dvb-frontends/atbm8830\tEXPORT_SYMBOL\n0x3939f8f0\trfkill_pause_polling\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x51da1867\tsnd_dmaengine_pcm_pointer\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x9f0664bf\tdm_get_queue_limits\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0x8b71730e\ttda10048_attach\tdrivers/media/dvb-frontends/tda10048\tEXPORT_SYMBOL\n0x40453b00\ttda10046_attach\tdrivers/media/dvb-frontends/tda1004x\tEXPORT_SYMBOL\n0x9029a814\ttda10045_attach\tdrivers/media/dvb-frontends/tda1004x\tEXPORT_SYMBOL\n0x39b9107a\to2hb_register_callback\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x0b8c3236\tfreq_reg_info\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x986ec3d0\tsnd_soc_get_volsw_sx\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xcedec9e7\tsnd_soc_put_volsw_s8\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xeca65f10\tsnd_soc_get_volsw_s8\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xba165527\tsnd_soc_put_volsw_sx\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xfeb9363b\tp9_client_getattr_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x88de1c5c\taf9013_attach\tdrivers/media/dvb-frontends/af9013\tEXPORT_SYMBOL\n0x75a99b07\taf9033_attach\tdrivers/media/dvb-frontends/af9033\tEXPORT_SYMBOL\n0xcc98aed0\tv4l2_ctrl_add_ctrl\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xb0ab658b\tphy_attach\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xb3d0e1b5\tsnd_soc_remove_platform\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x017d22f4\tp9_client_create_dotl\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xdc207c81\txt_unregister_match\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xbad12eaa\tdevm_regmap_init_i2c\tdrivers/base/regmap/regmap-i2c\tEXPORT_SYMBOL_GPL\n0x4845ad8d\tdevm_regmap_init_spi\tdrivers/base/regmap/regmap-spi\tEXPORT_SYMBOL_GPL\n0x7fc8652c\tem28xx_tuner_callback\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xabb7637f\tgspca_coarse_grained_expo_autogain\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0x5b90ae85\tiscsi_prep_data_out_pdu\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x850fa2f0\tip_vs_conn_in_get_proto\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL_GPL\n0x35131b36\tdrbd_role_str\tdrivers/block/drbd/drbd\tEXPORT_SYMBOL\n0x5d191e2c\tlirc_dev_fop_read\tdrivers/media/rc/lirc_dev\tEXPORT_SYMBOL\n0x248d20b0\tsnd_soc_jack_add_gpios\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3ba8b814\trtl2830_attach\tdrivers/media/dvb-frontends/rtl2830\tEXPORT_SYMBOL\n0x80e27024\tusbnet_cdc_bind\tdrivers/net/usb/cdc_ether\tEXPORT_SYMBOL_GPL\n0x9728d6d2\t__nf_conntrack_find\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x94d5719d\trfkill_alloc\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0x1068004b\tgf128mul_bbe\tcrypto/gf128mul\tEXPORT_SYMBOL\n0x45e89ad3\tbitmap_close_sync\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x22750114\tphy_ethtool_set_eee\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x951cdc2f\tphy_ethtool_get_eee\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xd6c96dc9\tvideobuf_dvb_dealloc_frontends\tdrivers/media/v4l2-core/videobuf-dvb\tEXPORT_SYMBOL\n0xbc37edd0\thostap_master_start_xmit\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xbc01d0ec\tp54_parse_firmware\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x04cda566\tsnd_interval_refine\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xea2f4978\tir_raw_event_store_with_filter\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x702121e7\tnfnetlink_subsys_unregister\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0xd4a3a6a6\tnfc_allocate_device\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x63d2ff63\teeprom_93cx6_wren\tdrivers/misc/eeprom/eeprom_93cx6\tEXPORT_SYMBOL_GPL\n0x7e33b1c2\tp9_client_create\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xa6dbde37\tvb2_get_vma\tdrivers/media/v4l2-core/videobuf2-memops\tEXPORT_SYMBOL_GPL\n0x104f0cb6\tdevm_backlight_device_register\tdrivers/video/backlight/backlight\tEXPORT_SYMBOL\n0x567ecff3\tnat_callforwarding_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0x455e4bfd\tsnd_ctl_find_numid\tsound/core/snd\tEXPORT_SYMBOL\n0xd9bd96d8\tphy_disconnect\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x4900035b\to2hb_stop_all_regions\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x566c9a0d\tnf_ct_helper_ext_add\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x4f5e7556\tbio_clone_mddev\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0xebfdea3f\trate_control_send_low\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xc63f1b81\tieee80211_radiotap_iterator_next\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x36e8756a\tv4l2_find_dv_timings_cap\tdrivers/media/v4l2-core/v4l2-dv-timings\tEXPORT_SYMBOL_GPL\n0xe4b736df\tiscsi_host_remove\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xfffa747b\tusb_serial_generic_chars_in_buffer\tdrivers/usb/serial/usbserial\tEXPORT_SYMBOL_GPL\n0xb79227de\thci_recv_stream_fragment\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xc1e1d36d\tsnd_rawmidi_kernel_read\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x0e081375\tsnd_soc_dai_set_tristate\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x6de97f1a\tv4l2_subdev_link_validate\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x23c8f257\tslhc_uncompress\tdrivers/net/slip/slhc\tEXPORT_SYMBOL\n0x45014a2b\thci_unregister_dev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xaad6d92f\trfkill_init_sw_state\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0xdedff949\trt2x00mac_configure_filter\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xdb923743\tcx231xx_set_alt_setting\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xb57077ef\tip6_sk_redirect\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xe4586827\tadxl34x_resume\tdrivers/input/misc/adxl34x\tEXPORT_SYMBOL_GPL\n0x74ec1a5f\tcx24116_attach\tdrivers/media/dvb-frontends/cx24116\tEXPORT_SYMBOL\n0xf3e8490c\tlcd_device_register\tdrivers/video/backlight/lcd\tEXPORT_SYMBOL\n0x89b6974a\tradio_tea5777_init\tdrivers/media/radio/shark2\tEXPORT_SYMBOL_GPL\n0x8bd296b1\tsnd_info_register\tsound/core/snd\tEXPORT_SYMBOL\n0x0283dfe3\t_snd_pcm_hw_params_any\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xa8813ad6\tdm_rh_region_to_sector\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xb81adf38\tvideobuf_dqbuf\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x03368fb0\tgenphy_resume\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x8ac9b6c7\trt2x00mac_stop\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x03170c8d\tip_tunnel_rcv\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0xdff8e89d\ttm6000_tuner_callback\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0x4299afee\tar9003_mci_setup\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x572583cf\tirias_new_object\tnet/irda/irda\tEXPORT_SYMBOL\n0xb7af8e32\tnf_conntrack_helper_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x543357ed\tcryptd_free_ahash\tcrypto/cryptd\tEXPORT_SYMBOL_GPL\n0xd0c61683\tieee80211_gtk_rekey_add\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x5f282e37\tiscsi_conn_failure\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xef543284\tdm_requeue_unmapped_request\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0xf24ff2c7\twiphy_new\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x2ed4990e\tsnd_pcm_mmap_data\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xe4c93d51\tath9k_hw_btcoex_init_mci\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xd56eb248\trt2x00queue_start_queue\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xd694212f\tw1_write_8\tdrivers/w1/wire\tEXPORT_SYMBOL_GPL\n0x5822cdc8\tsnd_ac97_tune_hardware\tsound/pci/ac97/snd-ac97-codec\tEXPORT_SYMBOL\n0x7762965e\tip_set_nfnl_put\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x80ee118c\tip_set_nfnl_get\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x6fb1f639\tsnd_soc_unregister_card\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x90a17fd7\tath9k_hw_get_txq_props\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x9b12c978\tath9k_hw_set_txq_props\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x634cebaf\trt2x00mac_set_tim\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x5765aca0\tl2tp_tunnel_sock_lookup\tnet/l2tp/l2tp_core\tEXPORT_SYMBOL_GPL\n0x4c40b2fb\tieee80211_bss_get_ie\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x524eaf90\tdvb_usb_generic_rw\tdrivers/media/usb/dvb-usb/dvb-usb\tEXPORT_SYMBOL\n0xbefdc52d\tdibusb_pid_filter\tdrivers/media/usb/dvb-usb/dvb-usb-dibusb-common\tEXPORT_SYMBOL\n0x639786f9\tmfd_add_devices\tdrivers/mfd/mfd-core\tEXPORT_SYMBOL\n0xcb936d9e\tinet6_getname\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x305bec0a\tnf_conntrack_tuple_taken\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x5559e3c4\tsnd_device_register\tsound/core/snd\tEXPORT_SYMBOL\n0x06dceffb\tsnd_soc_of_parse_daifmt\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x86d8ab33\tusb_wwan_ioctl\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0xa2d623f3\tip_set_range_to_cidr\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0xbda99175\t__uio_register_device\tdrivers/uio/uio\tEXPORT_SYMBOL_GPL\n0xf9348cbc\txz_dec_run\tlib/xz/xz_dec\tEXPORT_SYMBOL\n0x65dccf13\txz_dec_end\tlib/xz/xz_dec\tEXPORT_SYMBOL\n0xf781f3b8\tsnd_ctl_find_id\tsound/core/snd\tEXPORT_SYMBOL\n0xc5db54a9\tp9_idpool_destroy\tnet/9p/9pnet\tEXPORT_SYMBOL\n0x525ce903\tv4l2_fh_exit\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x723fca5f\tv4l2_fh_init\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x4db3883a\thostap_remove_interface\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x724fe4fe\tllc_build_and_send_ui_pkt\tnet/llc/llc\tEXPORT_SYMBOL\n0x6e54c53e\trt2800_get_tsf\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x8c4181ec\troccat_report_event\tdrivers/hid/hid-roccat\tEXPORT_SYMBOL_GPL\n0x017c6301\tcx24123_get_tuner_i2c_adapter\tdrivers/media/dvb-frontends/cx24123\tEXPORT_SYMBOL\n0x626e7c57\txt_register_matches\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0x6ed52b3a\tasync_xor\tcrypto/async_tx/async_xor\tEXPORT_SYMBOL_GPL\n0x9670af2c\tgspca_debug\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0xb38ffc20\tar9003_paprd_setup_gain_table\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x8d469c9d\tssb_driver_unregister\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x09472122\tdm_rh_dec\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0xdec305a8\ti2400m_release\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x0592df77\tdm_unregister_target\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x663294ea\tnf_ct_expect_related_report\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0xc12a8f60\tipcomp_output\tnet/xfrm/xfrm_ipcomp\tEXPORT_SYMBOL_GPL\n0xe1775ee7\tdm_get_reserved_bio_based_ios\tdrivers/md/dm-mod\tEXPORT_SYMBOL_GPL\n0xbf6a0a4b\tdvb_dmx_release\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0x74ab7717\tsnd_seq_device_register_driver\tsound/core/seq/snd-seq-device\tEXPORT_SYMBOL\n0xe39dd4b4\tcast_s2\tcrypto/cast_common\tEXPORT_SYMBOL_GPL\n0x0b043723\tsms_board_power\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x0381d46f\tbrcmu_pkt_buf_free_skb\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0xa7161ae6\tcdrom_mode_sense\tdrivers/cdrom/cdrom\tEXPORT_SYMBOL\n0xff356a41\tphy_device_create\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x03c401f8\tiscsi_tcp_cleanup_task\tdrivers/scsi/libiscsi_tcp\tEXPORT_SYMBOL_GPL\n0x152eb9fc\tqtree_delete_dquot\tfs/quota/quota_tree\tEXPORT_SYMBOL\n0x96dcb72b\tinet6_destroy_sock\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xc3a512dd\thashbin_lock_find\tnet/irda/irda\tEXPORT_SYMBOL\n0x0786ed8a\tsnd_rawmidi_transmit\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x3f4ae2bc\tv4l2_ctrl_log_status\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xe6cb786b\tiscsi_conn_send_pdu\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x7880c781\tdm_kcopyd_prepare_callback\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x922bd776\tgre_add_protocol\tnet/ipv4/gre\tEXPORT_SYMBOL_GPL\n0xe4ef62d4\tinet6_unregister_protosw\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x9c5e6334\tieee80211_sta_eosp\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xd831a1a2\tip_vs_proto_name\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x2345e8a1\tnf_nat_l4proto_unique_tuple\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0xe2b92059\tv4l2_video_std_construct\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xf37167fd\tieee80211_tx_status\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xb8e448a0\tsnd_seq_set_queue_tempo\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x44d84d04\thostap_get_porttype\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xb98d64c7\tsnd_soc_dapm_disable_pin\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x5d621e75\tdib7000p_set_wbd_ref\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xf901c6db\tmedia_entity_setup_link\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x93d35c77\ttda827x_attach\tdrivers/media/tuners/tda827x\tEXPORT_SYMBOL_GPL\n0xd5d206eb\tiscsi_host_free\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x6ceaaf5e\t__ssb_driver_register\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x5edf8108\tnf_conntrack_alloc\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x8f3bb5bd\tdrxd_config_i2c\tdrivers/media/dvb-frontends/drxd\tEXPORT_SYMBOL\n0xbc52d227\tstb0899_attach\tdrivers/media/dvb-frontends/stb0899\tEXPORT_SYMBOL\n0xdf34d6ff\tstv0299_attach\tdrivers/media/dvb-frontends/stv0299\tEXPORT_SYMBOL\n0x5b1eae2d\tfuse_put_request\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x94098ff8\tsnd_interval_list\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xf29c8a0d\tmwifiex_write_data_complete\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0xb30096bc\tsnd_compress_register\tsound/core/snd-compress\tEXPORT_SYMBOL_GPL\n0x80f4673a\tsnd_ctl_make_virtual_master\tsound/core/snd\tEXPORT_SYMBOL\n0xbb2228a4\thdlcdrv_arbitrate\tdrivers/net/hamradio/hdlcdrv\tEXPORT_SYMBOL\n0x0700624e\tusb_wwan_port_remove\tdrivers/usb/serial/usb_wwan\tEXPORT_SYMBOL\n0x8705ccbd\thci_alloc_dev\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x5fb6eaa5\tieee80211_send_bar\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x609c56e6\tieee80211_probereq_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x11c169f9\tbitmap_cond_end_sync\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x2bb642df\tvb2_ioctl_streamon\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0x88915d0b\tip6_tnl_get_cap\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL\n0x21a21fce\tdapm_clock_event\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xb9a54d4e\tsnd_soc_cnew\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x41a98395\thostap_setup_dev\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0xd68b66d0\trt2x00usb_watchdog\tdrivers/net/wireless/rt2x00/rt2x00usb\tEXPORT_SYMBOL_GPL\n0xfec7baac\tfuse_get_req\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x66d70040\tinet6_ioctl\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x9046defd\tieee80211_rate_control_unregister\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x6ef8fcd8\tsnd_pcm_format_linear\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x85d9a01a\tsnd_soc_update_bits_locked\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x1a8223f0\trt2x00mac_start\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xad4567ef\ttveeprom_hauppauge_analog\tdrivers/media/common/tveeprom\tEXPORT_SYMBOL\n0x1267a8dc\tsnd_tea575x_hw_init\tdrivers/media/radio/tea575x\tEXPORT_SYMBOL\n0xb1170532\tip6t_register_table\tnet/ipv6/netfilter/ip6_tables\tEXPORT_SYMBOL\n0x432043c2\tieee80211_iter_keys\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x72487b03\tcx22702_attach\tdrivers/media/dvb-frontends/cx22702\tEXPORT_SYMBOL\n0x8c44e315\ttda10071_attach\tdrivers/media/dvb-frontends/tda10071\tEXPORT_SYMBOL\n0xdd6991fb\tlbs_process_rxed_packet\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0xea96c8dd\tbacklight_device_unregister\tdrivers/video/backlight/backlight\tEXPORT_SYMBOL\n0x9731e300\tip6_push_pending_frames\tnet/ipv6/ipv6\tEXPORT_SYMBOL_GPL\n0xc0763484\trfkill_blocked\tnet/rfkill/rfkill\tEXPORT_SYMBOL\n0xe17b39f5\tmd_write_end\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0xf1f01d9d\tmedia_entity_create_link\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0x7b954f65\thostap_set_antsel\tdrivers/net/wireless/hostap/hostap\tEXPORT_SYMBOL\n0x68d71c54\tlbs_queue_event\tdrivers/net/wireless/libertas/libertas\tEXPORT_SYMBOL_GPL\n0x7f21d43c\tmwifiex_init_shutdown_fw\tdrivers/net/wireless/mwifiex/mwifiex\tEXPORT_SYMBOL_GPL\n0x373229c5\trt2x00queue_start_queues\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0xa286a234\tsnd_pcm_format_name\tsound/core/snd-pcm\tEXPORT_SYMBOL_GPL\n0x9656f8a0\tllc_sap_list_lock\tnet/llc/llc\tEXPORT_SYMBOL\n0x353e134a\tsms_board_lna_control\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x475b40e0\tath9k_hw_set_rx_bufsize\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xc01e1886\tnfnetlink_has_listeners\tnet/netfilter/nfnetlink\tEXPORT_SYMBOL_GPL\n0x53c6d2c9\tmt2063_attach\tdrivers/media/tuners/mt2063\tEXPORT_SYMBOL_GPL\n0xcbc5c2cb\tax25_header_ops\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xfd53294f\tsnd_pcm_suspend_all\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x5d6ce757\tinet6_bind\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0xa4827d41\tit913x_attach\tdrivers/media/tuners/tuner_it913x\tEXPORT_SYMBOL\n0x779b19f8\tieee80211_ap_probereq_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x711e510e\tnf_ct_l4proto_pernet_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x75037a62\tnf_ct_l3proto_pernet_unregister\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x93eec583\tsnd_pcm_lib_write\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x43382381\tsms_board_led_feedback\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x149c9f51\tlgdt3305_attach\tdrivers/media/dvb-frontends/lgdt3305\tEXPORT_SYMBOL\n0x67520c38\tlgdt330x_attach\tdrivers/media/dvb-frontends/lgdt330x\tEXPORT_SYMBOL\n0x24eed666\tv4l2_device_register_subdev\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x311c84f5\tbt_accept_enqueue\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0xbe76141b\tieee80211_resume_disconnect\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x98061beb\tnf_nat_sdp_session_hook\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0xf657145b\tieee80211_data_to_8023\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x72e0e24c\tsms_board_event\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0x4d9384b3\tbcm3510_attach\tdrivers/media/dvb-frontends/bcm3510\tEXPORT_SYMBOL\n0x75768f32\tem28xx_read_reg\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0x47ed0ce1\tcdc_ncm_bind_common\tdrivers/net/usb/cdc_ncm\tEXPORT_SYMBOL_GPL\n0x74abcb4e\tregister_8022_client\tnet/802/p8022\tEXPORT_SYMBOL\n0x14fde994\tsnd_soc_info_enum_double\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x8096c328\tbtmrvl_remove_card\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x790c4091\tvideobuf_dvb_alloc_frontend\tdrivers/media/v4l2-core/videobuf-dvb\tEXPORT_SYMBOL\n0x1ca0c084\tcx2341x_log_status\tdrivers/media/common/cx2341x\tEXPORT_SYMBOL\n0x1e69df51\ttveeprom_read\tdrivers/media/common/tveeprom\tEXPORT_SYMBOL\n0x321d10e7\tisl6423_attach\tdrivers/media/dvb-frontends/isl6423\tEXPORT_SYMBOL\n0x31b07a6d\trt2x00mac_get_ringparam\tdrivers/net/wireless/rt2x00/rt2x00lib\tEXPORT_SYMBOL_GPL\n0x3e58ca7e\tiscsi_conn_get_addr_param\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x4374e09e\tfuse_get_req_for_background\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x733aa67c\tbtmrvl_send_hscfg_cmd\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0xe27b860c\tath9k_cmn_update_txpow\tdrivers/net/wireless/ath/ath9k/ath9k_common\tEXPORT_SYMBOL\n0x5a0991e8\tdib0090_get_wbd_offset\tdrivers/media/dvb-frontends/dib0090\tEXPORT_SYMBOL\n0xa31dd791\tath_printk\tdrivers/net/wireless/ath/ath\tEXPORT_SYMBOL\n0xf0a9f3a2\tath9k_hw_disable\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0xb9a3d64f\trt2800_gain_calibration\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x08808193\tv4l2_event_unsubscribe_all\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x00db6957\tath9k_hw_resettxqueue\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x84e35907\tiscsi_session_failure\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0x28d90fcc\tv4l2_event_queue_fh\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x2342f1ae\tv4l2_prio_open\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xf9a3748f\tfuse_request_alloc\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0xfce0d4e1\tircomm_connect_response\tnet/irda/ircomm/ircomm\tEXPORT_SYMBOL\n0x8df3789f\tsnd_oss_info_register\tsound/core/snd\tEXPORT_SYMBOL\n0x8cdf2ac3\tlro_flush_pkt\tnet/ipv4/inet_lro\tEXPORT_SYMBOL\n0x4f4764db\tip_set_del\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x3d364ce8\tip_set_add\tnet/netfilter/ipset/ip_set\tEXPORT_SYMBOL_GPL\n0x33c00a1a\tnf_ct_l4proto_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x81d1c6b4\tnf_ct_l3proto_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x59ed2e04\tem28xx_read_ac97\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL_GPL\n0xcfe11ca7\tgspca_resume\tdrivers/media/usb/gspca/gspca_main\tEXPORT_SYMBOL\n0x13bed441\tvideobuf_dvb_get_frontend\tdrivers/media/v4l2-core/videobuf-dvb\tEXPORT_SYMBOL\n0x3997de58\tssb_chipco_gpio_control\tdrivers/ssb/ssb\tEXPORT_SYMBOL\n0x5ec50a1b\tsnd_rawmidi_output_params\tsound/core/snd-rawmidi\tEXPORT_SYMBOL\n0x120538dc\tem28xx_register_extension\tdrivers/media/usb/em28xx/em28xx\tEXPORT_SYMBOL\n0x2309a6d6\ttm6000_xc5000_callback\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0xccf5fcdb\tieee80211_ctstoself_get\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0x8ffe7e89\tnf_conntrack_htable_size\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6d40a921\tneed_ipv4_conntrack\tnet/ipv4/netfilter/nf_conntrack_ipv4\tEXPORT_SYMBOL_GPL\n0x89b611dd\ttm6000_debug\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0xf7265201\trt2800_conf_tx\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x7847e460\tax25_register_pid\tnet/ax25/ax25\tEXPORT_SYMBOL_GPL\n0x7aa1ddbc\tirias_insert_object\tnet/irda/irda\tEXPORT_SYMBOL\n0xd1f0bf32\tsnd_pcm_lib_preallocate_pages\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0xa05f4217\tax25_linkfail_register\tnet/ax25/ax25\tEXPORT_SYMBOL\n0x131f636c\tnf_nat_l4proto_in_range\tnet/netfilter/nf_nat\tEXPORT_SYMBOL_GPL\n0x72f022e1\tsnd_dmaengine_pcm_pointer_no_residue\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x07b26b9d\tsnd_soc_dpcm_fe_can_update\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xe19e33c2\tsnd_soc_dpcm_be_can_update\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x66d49398\ttm6000_get_reg\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0x5da646c6\ttm6000_set_reg\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL_GPL\n0x5469ce31\tocfs2_dlm_lvb_valid\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0x0a41779c\tnfc_tm_deactivated\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x3e4bf4eb\tvb2_ioctl_streamoff\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xefbcd074\tfuse_abort_conn\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0xddb47d52\tieee80211_get_key_rx_seq\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xc7e9782e\tieee80211_get_key_tx_seq\tnet/mac80211/mac80211\tEXPORT_SYMBOL\n0xb2e5ae4a\tsnd_lookup_minor_data\tsound/core/snd\tEXPORT_SYMBOL\n0xc49bddb0\ti2400m_reset\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x27476846\tulist_reinit\tfs/btrfs/btrfs\tEXPORT_SYMBOL\n0x4b1df5ec\tspk_synth_immediate\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0x7686b56d\tcfg80211_wext_siwmode\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0x16094fb4\tcfg80211_wext_giwname\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0xa84b3628\tcfg80211_wext_giwmode\tnet/wireless/cfg80211\tEXPORT_SYMBOL_GPL\n0xbe37e187\tvideobuf_vmalloc_free\tdrivers/media/v4l2-core/videobuf-vmalloc\tEXPORT_SYMBOL_GPL\n0xa4c96b5f\twiphy_rfkill_start_polling\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x88ec47b1\tregulatory_hint\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xdfd2456d\tsnd_dmaengine_pcm_set_config_from_dai_data\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x2b1d3808\tsnd_soc_dapm_mixer_update_power\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x3309c079\tphy_drivers_register\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x95301c3b\tbt_sock_link\tnet/bluetooth/bluetooth\tEXPORT_SYMBOL\n0x958c6ffd\txt_register_target\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0xaf104e90\tdvb_unregister_device\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xd57d9d5a\trndis_command\tdrivers/net/usb/rndis_host\tEXPORT_SYMBOL_GPL\n0xbb7dff83\tip_vs_proto_data_get\tnet/netfilter/ipvs/ip_vs\tEXPORT_SYMBOL\n0x6160b57f\tnfc_remove_se\tnet/nfc/nfc\tEXPORT_SYMBOL\n0x82b14c2a\tbtmrvl_process_event\tdrivers/bluetooth/btmrvl\tEXPORT_SYMBOL_GPL\n0x28e925ab\ti2400m_post_reset\tdrivers/net/wimax/i2400m/i2400m\tEXPORT_SYMBOL_GPL\n0x7793f334\tgre_handle_offloads\tnet/ipv4/gre\tEXPORT_SYMBOL_GPL\n0x43f23311\tdm_table_get_md\tdrivers/md/dm-mod\tEXPORT_SYMBOL\n0x05e67c74\tcx24113_agc_callback\tdrivers/media/dvb-frontends/cx24113\tEXPORT_SYMBOL\n0x92a23008\tbrcmu_pktq_init\tdrivers/net/wireless/brcm80211/brcmutil/brcmutil\tEXPORT_SYMBOL\n0xdcb25f4d\twiphy_apply_custom_regulatory\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xedf7686a\tgameport_set_phys\tdrivers/input/gameport/gameport\tEXPORT_SYMBOL\n0x26ce3140\tct_sip_parse_header_uri\tnet/netfilter/nf_conntrack_sip\tEXPORT_SYMBOL_GPL\n0x16244fe5\tv4l2_prio_check\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0xe7599ad7\tath9k_hw_intrpend\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x7042bc54\tirlmp_register_client\tnet/irda/irda\tEXPORT_SYMBOL\n0x6cb03966\tnf_ct_expect_alloc\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x91fc76f5\tath9k_hw_wow_event_to_string\tdrivers/net/wireless/ath/ath9k/ath9k\tEXPORT_SYMBOL\n0x8d8e2027\tp54_init_common\tdrivers/net/wireless/p54/p54common\tEXPORT_SYMBOL_GPL\n0x1b89c6ee\to2hb_fill_node_map\tfs/ocfs2/cluster/ocfs2_nodemanager\tEXPORT_SYMBOL_GPL\n0x16b2e575\tocfs2_dlm_unlock\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xd4256e52\tsmscore_register_client\tdrivers/media/common/siano/smsmdtv\tEXPORT_SYMBOL_GPL\n0xe3f731fa\tusb_ftdi_elan_edset_flush\tdrivers/usb/misc/ftdi-elan\tEXPORT_SYMBOL_GPL\n0x5dc35bff\tsnd_timer_global_free\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x9350a192\tsnd_pcm_lib_writev\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x2b751183\tusbnet_generic_cdc_bind\tdrivers/net/usb/cdc_ether\tEXPORT_SYMBOL_GPL\n0x0e3448a3\tgarp_init_applicant\tnet/802/garp\tEXPORT_SYMBOL_GPL\n0xedd521c2\tirlmp_get_discoveries\tnet/irda/irda\tEXPORT_SYMBOL\n0x8d2f6eba\t__nf_ct_expect_find\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x39efd117\tmedia_entity_find_link\tdrivers/media/media\tEXPORT_SYMBOL_GPL\n0xe6e5e225\ttm6000_register_extension\tdrivers/media/usb/tm6000/tm6000\tEXPORT_SYMBOL\n0x5d38f601\tieee80211_set_key_tx_seq\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x4bf42798\tieee80211_set_key_rx_seq\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0xfb2b4dc8\tmd_flush_request\tdrivers/md/md-mod\tEXPORT_SYMBOL\n0x27847b66\tdvb_dmxdev_init\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xed9e5ee7\tdvb_ringbuffer_free\tdrivers/media/dvb-core/dvb-core\tEXPORT_SYMBOL\n0xef16660b\thashbin_new\tnet/irda/irda\tEXPORT_SYMBOL\n0x448b8aaa\tirda_qos_bits_to_value\tnet/irda/irda\tEXPORT_SYMBOL\n0x668308a0\trt2800_mcu_request\tdrivers/net/wireless/rt2x00/rt2800lib\tEXPORT_SYMBOL_GPL\n0x5aec8133\tiscsi_conn_bind\tdrivers/scsi/libiscsi\tEXPORT_SYMBOL_GPL\n0xc1444946\tax25cmp\tnet/ax25/ax25\tEXPORT_SYMBOL\n0xbc5b4545\tsnd_soc_dapm_mux_update_power\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xf6d992b4\tsnd_ctl_free_one\tsound/core/snd\tEXPORT_SYMBOL\n0xc63c9e31\tv4l2_fh_open\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0xd1b551a2\tspk_get_var\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xb506cf45\tdlm_print_one_lock\tfs/ocfs2/dlm/ocfs2_dlm\tEXPORT_SYMBOL_GPL\n0xdc3f00dd\tvideobuf_stop\tdrivers/media/v4l2-core/videobuf-core\tEXPORT_SYMBOL_GPL\n0x4d70cb33\tnf_ct_helper_expectfn_register\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x6ea8e847\tsoc_ac97_ops\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xa83588eb\tdm_rh_recovery_end\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x22db79b5\tcx231xx_send_usb_command\tdrivers/media/usb/cx231xx/cx231xx\tEXPORT_SYMBOL_GPL\n0xc96d5ae7\tv4l2_device_put\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL_GPL\n0x0d005867\tsirdev_raw_write\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0xe50e111c\t__serio_register_driver\tdrivers/input/serio/serio\tEXPORT_SYMBOL\n0x726ea72b\tath_gen_timer_isr\tdrivers/net/wireless/ath/ath9k/ath9k_hw\tEXPORT_SYMBOL\n0x583284d8\tcfg80211_rx_assoc_resp\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xb9638db4\tsnd_pcm_rate_to_rate_bit\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x5ae9c0cd\trndis_unbind\tdrivers/net/usb/rndis_host\tEXPORT_SYMBOL_GPL\n0xa4ff2cb2\tip_tunnel_get_stats64\tnet/ipv4/ip_tunnel\tEXPORT_SYMBOL_GPL\n0x16d87e49\tdib7000p_set_gpio\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0xc8f9a88b\tvb2_queue_release\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xed3c7380\tvb2_vmalloc_memops\tdrivers/media/v4l2-core/videobuf2-vmalloc\tEXPORT_SYMBOL_GPL\n0x328ac213\tv4l2_ctrl_g_ctrl_int64\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x81c30061\tipv6_chk_addr\tnet/ipv6/ipv6\tEXPORT_SYMBOL\n0x49e29ab3\tcfg80211_rx_unexpected_4addr_frame\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xc66ce277\tdm_rh_get_region_size\tdrivers/md/dm-region-hash\tEXPORT_SYMBOL_GPL\n0x72a33039\tdib7000m_pid_filter\tdrivers/media/dvb-frontends/dib7000m\tEXPORT_SYMBOL\n0x5aa0c452\tdib7000p_pid_filter\tdrivers/media/dvb-frontends/dib7000p\tEXPORT_SYMBOL\n0x9ee84f52\trc_open\tdrivers/media/rc/rc-core\tEXPORT_SYMBOL_GPL\n0x4f14dd14\tdvb_usbv2_suspend\tdrivers/media/usb/dvb-usb-v2/dvb_usb_v2\tEXPORT_SYMBOL\n0xba8963cd\tsnd_soc_jack_get_type\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x59fdfa5f\tled_classdev_register\tdrivers/leds/led-class\tEXPORT_SYMBOL_GPL\n0x8cb563ad\tvb2_ioctl_reqbufs\tdrivers/media/v4l2-core/videobuf2-core\tEXPORT_SYMBOL_GPL\n0xd8862596\tipt_do_table\tnet/ipv4/netfilter/ip_tables\tEXPORT_SYMBOL\n0xcba07fbf\tcfg80211_michael_mic_failure\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0xe934da1d\tsnd_seq_dump_var_event\tsound/core/seq/snd-seq\tEXPORT_SYMBOL\n0x1dc5c5e9\t_snd_ctl_add_slave\tsound/core/snd\tEXPORT_SYMBOL\n0xebe07112\tath6kl_core_tx_complete\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x29992a8b\tath6kl_core_rx_complete\tdrivers/net/wireless/ath/ath6kl/ath6kl_core\tEXPORT_SYMBOL\n0x3f8ee40f\txt_find_target\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0x2877a28e\tsnd_hwparams_to_dma_slave_config\tsound/core/snd-pcm-dmaengine\tEXPORT_SYMBOL_GPL\n0x48233682\tsnd_soc_set_ac97_ops_of_reset\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0x0d6c43cd\tphy_mii_ioctl\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0x21e8caf9\tnf_connlabels_replace\tnet/netfilter/nf_conntrack\tEXPORT_SYMBOL_GPL\n0x8f643baf\tnfc_alloc_recv_skb\tnet/nfc/nfc\tEXPORT_SYMBOL\n0xcd005dc5\tcfg80211_reg_can_beacon\tnet/wireless/cfg80211\tEXPORT_SYMBOL\n0x52e3e4a5\tsnd_pcm_hw_param_value\tsound/core/snd-pcm\tEXPORT_SYMBOL\n0x59695725\tfuse_dev_release\tfs/fuse/fuse\tEXPORT_SYMBOL_GPL\n0x5b7744f3\tocfs2_stack_glue_register\tfs/ocfs2/ocfs2_stackglue\tEXPORT_SYMBOL_GPL\n0xa0d47b03\tnf_nat_follow_master\tnet/netfilter/nf_nat\tEXPORT_SYMBOL\n0x735b9a19\tdib8090p_get_dc_power\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x65912137\tp9_client_symlink\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xfd40c79d\tp9_idpool_check\tnet/9p/9pnet\tEXPORT_SYMBOL\n0xaa40e62e\tsnd_jack_new\tsound/core/snd\tEXPORT_SYMBOL\n0x90ae89da\tmd_trim_bio\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x335b1c79\trdev_clear_badblocks\tdrivers/md/md-mod\tEXPORT_SYMBOL_GPL\n0x167d0be8\tsirdev_get_instance\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0xb49b5e3e\tsirdev_put_instance\tdrivers/net/irda/sir-dev\tEXPORT_SYMBOL\n0x53e2b6e5\tlib80211_crypt_delayed_deinit\tnet/wireless/lib80211\tEXPORT_SYMBOL\n0x6f00c37a\tsnd_dmaengine_pcm_unregister\tsound/soc/snd-soc-core\tEXPORT_SYMBOL_GPL\n0xe2c09b91\txt_register_targets\tnet/netfilter/x_tables\tEXPORT_SYMBOL\n0x5b6c00e6\txor_blocks\tcrypto/xor\tEXPORT_SYMBOL\n0x45435278\tdib8000_attach\tdrivers/media/dvb-frontends/dib8000\tEXPORT_SYMBOL\n0x63939ef1\tsnd_timer_pause\tsound/core/snd-timer\tEXPORT_SYMBOL\n0x1c3ee336\tmacvlan_start_xmit\tdrivers/net/macvlan\tEXPORT_SYMBOL_GPL\n0xdaca6c7d\tieee80211_iterate_active_interfaces\tnet/mac80211/mac80211\tEXPORT_SYMBOL_GPL\n0x78dc98ba\tnf_nat_pptp_hook_outbound\tnet/netfilter/nf_conntrack_pptp\tEXPORT_SYMBOL_GPL\n0xf4852aab\tip6_tnl_dst_check\tnet/ipv6/ip6_tunnel\tEXPORT_SYMBOL_GPL\n0xa9a7d9b0\tgenphy_config_aneg\tdrivers/net/phy/libphy\tEXPORT_SYMBOL\n0xe7cd4558\tspk_serial_release\tdrivers/staging/speakup/speakup\tEXPORT_SYMBOL_GPL\n0xff3b5693\tnat_t120_hook\tnet/netfilter/nf_conntrack_h323\tEXPORT_SYMBOL_GPL\n0xd4e288db\trc_map_af9005_table_size\tdrivers/media/usb/dvb-usb/dvb-usb-af9005-remote\tEXPORT_SYMBOL\n0x0e576a80\tv4l2_ctrl_s_ctrl_int64\tdrivers/media/v4l2-core/videodev\tEXPORT_SYMBOL\n0x489c42ba\tinet_sk_diag_fill\tnet/ipv4/inet_diag\tEXPORT_SYMBOL_GPL\n0x8359caf1\tarpt_unregister_table\tnet/ipv4/netfilter/arp_tables\tEXPORT_SYMBOL\n0x6586694b\talloc_irdadev\tnet/irda/irda\tEXPORT_SYMBOL\n"
  },
  {
    "path": "src/ap/ap.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n \n    Module Name:\n    soft_ap.c\n \n    Abstract:\n    Access Point specific routines and MAC table maintenance routines\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    John Chang  08-04-2003    created for 11g soft-AP\n\n */\n\n#include \"rt_config.h\"\n\nBOOLEAN ApCheckLongPreambleSTA(\n    IN PRTMP_ADAPTER pAd);\n\nchar const *pEventText[EVENT_MAX_EVENT_TYPE] = {\n\t\"restart access point\",\n\t\"successfully associated\",\n\t\"has disassociated\",\n\t\"has been aged-out and disassociated\" ,    \n\t\"active countermeasures\",\n\t\"has disassociated with invalid PSK password\"};\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInitialize AP specific data especially the NDIS packet pool that's\n\t\tused for wireless client bridging.\n\t==========================================================================\n */\nNDIS_STATUS APInitialize(\n\tIN  PRTMP_ADAPTER   pAd)\n{\n\tNDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\n\tINT\t\t\t\ti;\t\t\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"---> APInitialize\\n\"));\n\n\t/* Init Group key update timer, and countermeasures timer */\n\tfor (i = 0; i < MAX_MBSSID_NUM(pAd); i++)\n\t\tRTMPInitTimer(pAd, &pAd->ApCfg.MBSSID[i].REKEYTimer, GET_TIMER_FUNCTION(GREKEYPeriodicExec), pAd,  TRUE); \n\t\n\tRTMPInitTimer(pAd, &pAd->ApCfg.CounterMeasureTimer, GET_TIMER_FUNCTION(CMTimerExec), pAd, FALSE);\n#ifdef RTMP_MAC_USB\n\tRTMPInitTimer(pAd, &pAd->CommonCfg.BeaconUpdateTimer, GET_TIMER_FUNCTION(BeaconUpdateExec), pAd, TRUE);\n\t/*RTUSBBssBeaconInit(pAd); */\n#endif /* RTMP_MAC_USB */\n\n#ifdef IDS_SUPPORT\n\t/* Init intrusion detection timer */\n\tRTMPInitTimer(pAd, &pAd->ApCfg.IDSTimer, GET_TIMER_FUNCTION(RTMPIdsPeriodicExec), pAd, FALSE);\n\tpAd->ApCfg.IDSTimerRunning = FALSE;\n#endif /* IDS_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t/* Init WAPI rekey timer */\n\tRTMPInitWapiRekeyTimerAction(pAd, NULL);\n#endif /* WAPI_SUPPORT */\n\n\n#ifdef IGMP_SNOOP_SUPPORT\n\tMulticastFilterTableInit(pAd, &pAd->pMulticastFilterTable);\n#endif /* IGMP_SNOOP_SUPPORT */\n\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--- APInitialize\\n\"));\n\treturn Status;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tShutdown AP and free AP specific resources\n\t==========================================================================\n */\nVOID APShutdown(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"---> APShutdown\\n\"));\n/*\tif (pAd->OpMode == OPMODE_AP) */\n\n\tMlmeRadioOff(pAd);\n\n#ifdef IGMP_SNOOP_SUPPORT\n\tMultiCastFilterTableReset(&pAd->pMulticastFilterTable);\n#endif /* IGMP_SNOOP_SUPPORT */\n\n\n\tNdisFreeSpinLock(&pAd->MacTabLock);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--- APShutdown\\n\"));\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tStart AP service. If any vital AP parameter is changed, a STOP-START\n\t\tsequence is required to disassociate all STAs.\n\n\tIRQL = DISPATCH_LEVEL.(from SetInformationHandler)\n\tIRQL = PASSIVE_LEVEL. (from InitializeHandler)  \n\n\tNote:\n\t\tCan't call NdisMIndicateStatus on this routine.\n\n\t\tRT61 is a serialized driver on Win2KXP and is a deserialized on Win9X\n\t\tSerialized callers of NdisMIndicateStatus must run at IRQL = DISPATCH_LEVEL.\n\n\t==========================================================================\n */\nVOID APStartUp(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tUINT32\t\toffset, i;\n\tUINT32\t\tValue = 0;\n\tBOOLEAN\t\tbWmmCapable = FALSE;\n\tUCHAR\t\tapidx;\n\tBOOLEAN\t\tTxPreamble, SpectrumMgmt = FALSE;\n\tUCHAR\t\tphy_mode = pAd->CommonCfg.cfg_wmode;\n#ifdef DOT1X_SUPPORT\n\t/* BOOLEAN\t\tbDot1xReload = FALSE; */\n#endif /* DOT1X_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> APStartUp\\n\"));\n\n#ifdef INF_AMAZON_SE\n\tfor (i=0;i<NUM_OF_TX_RING;i++)\n\t{\n\t\tpAd->BulkOutDataSizeLimit[i]=24576;\n\t}\n#endif /* INF_AMAZON_SE */\n\t\t\n\tAsicDisableSync(pAd);\n\n\tTxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1);\n\n#ifdef A_BAND_SUPPORT\n\t/* Decide the Capability information field */\n\t/* In IEEE Std 802.1h-2003, the spectrum management bit is enabled in the 5 GHz band */\n\tif ((pAd->CommonCfg.Channel > 14) && pAd->CommonCfg.bIEEE80211H == TRUE)\n\t\tSpectrumMgmt = TRUE;\n#endif /* A_BAND_SUPPORT */\t\n\t\t\t\n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tMULTISSID_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx];\n\n\t\tif ((pMbss->SsidLen <= 0) || (pMbss->SsidLen > MAX_LEN_OF_SSID))\n\t\t{\n\t\t\tNdisMoveMemory(pMbss->Ssid, \"HT_AP\", 5);\n\t\t\tpMbss->Ssid[5] = '0'+apidx;\n\t\t\tpMbss->SsidLen = 6;\t\t\t\n\t\t}\n\n\t\t/* re-copy the MAC to virtual interface to avoid these MAC = all zero,\n\t\t   when re-open the ra0,\n\t\t   i.e. ifconfig ra0 down, ifconfig ra0 up, ifconfig ra0 down, ifconfig up ... */\n\t\tCOPY_MAC_ADDR(pMbss->Bssid, pAd->CurrentAddress);\n\t\t\n\t\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\t\t{\n\t\t\tif (apidx > 0) \n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tRefer to HW definition - \n\t\t\t\t\t\tBit1 of MAC address Byte0 is local administration bit \n\t\t\t\t\t\tand should be set to 1 in extended multiple BSSIDs'\n\t\t\t\t\t\tBit3~ of MAC address Byte0 is extended multiple BSSID index.\n\t\t\t\t */\n\t\t\t\tpMbss->Bssid[0] += 2; \t\n\t\t\t\tpMbss->Bssid[0] += ((apidx - 1) << 2);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpMbss->Bssid[5] += apidx;\n\n\t\tif (pMbss->MSSIDDev != NULL)\n\t\t{\n\t\t\tNdisMoveMemory(RTMP_OS_NETDEV_GET_PHYADDR(pMbss->MSSIDDev), \n\t\t\t\t\t\t\t\tpMbss->Bssid, MAC_ADDR_LEN);\n\t\t}\n\n\t\tif (pMbss->bWmmCapable)\n\t        \tbWmmCapable = TRUE;\n\t\t\n\t\tpMbss->CapabilityInfo = CAP_GENERATE(1, 0, (pMbss->WepStatus != Ndis802_11EncryptionDisabled),\n\t\t\t\t\t\t\t\t\t\t\tTxPreamble, pAd->CommonCfg.bUseShortSlotTime,\n\t\t\t\t\t\t\t\t\t\t\tSpectrumMgmt);\n\n\t\t\n\t\tif (bWmmCapable == TRUE)\n\t\t{\n\t\t\t/*\n\t\t\t\tIn WMM spec v1.1, A WMM-only AP or STA does not set the \"QoS\"\n\t\t\t\tbit in the capability field of association, beacon and probe\n\t\t\t\tmanagement frames.\n\t\t\t*/\n/*\t\t\tpMbss->CapabilityInfo |= 0x0200; */\n\t\t}\n\n#ifdef UAPSD_SUPPORT\n\t\tif (pMbss->UapsdInfo.bAPSDCapable == TRUE)\n\t\t{\n\t\t\t/*\n\t\t\t\tQAPs set the APSD subfield to 1 within the Capability\n\t\t\t\tInformation field when the MIB attribute\n\t\t\t\tdot11APSDOptionImplemented is true and set it to 0 otherwise.\n\t\t\t\tSTAs always set this subfield to 0.\n\t\t\t*/\n\t\t\tpMbss->CapabilityInfo |= 0x0800;\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\n\t\t\n\t\t/* decide the mixed WPA cipher combination */\n\t\tif (pMbss->WepStatus == Ndis802_11Encryption4Enabled)\n\t\t{\n\t\t\tswitch ((UCHAR)pMbss->AuthMode)\n\t\t\t{\n\t\t\t\t/* WPA mode */\n\t\t\t\tcase Ndis802_11AuthModeWPA:\n\t\t\t\tcase Ndis802_11AuthModeWPAPSK:\n\t\t\t\t\tpMbss->WpaMixPairCipher = WPA_TKIPAES_WPA2_NONE;\n\t\t\t\t\tbreak;\t\n\n\t\t\t\t/* WPA2 mode */\n\t\t\t\tcase Ndis802_11AuthModeWPA2:\n\t\t\t\tcase Ndis802_11AuthModeWPA2PSK:\n\t\t\t\t\tpMbss->WpaMixPairCipher = WPA_NONE_WPA2_TKIPAES;\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* WPA and WPA2 both mode */\n\t\t\t\tcase Ndis802_11AuthModeWPA1WPA2:\n\t\t\t\tcase Ndis802_11AuthModeWPA1PSKWPA2PSK:\t\n\n\t\t\t\t\t/* In WPA-WPA2 and TKIP-AES mixed mode, it shall use the maximum */\n\t\t\t\t\t/* cipher capability unless users assign the desired setting. */\n\t\t\t\t\tif (pMbss->WpaMixPairCipher == MIX_CIPHER_NOTUSE || \n\t\t\t\t\t\tpMbss->WpaMixPairCipher == WPA_TKIPAES_WPA2_NONE || \n\t\t\t\t\t\tpMbss->WpaMixPairCipher == WPA_NONE_WPA2_TKIPAES)\n\t\t\t\t\t\tpMbss->WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tbreak;\t\t\t\t\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t}\n\t\telse\n\t\t\tpMbss->WpaMixPairCipher = MIX_CIPHER_NOTUSE;\n\n\t\t/* Generate the corresponding RSNIE */\n\t\tRTMPMakeRSNIE(pAd, pMbss->AuthMode, pMbss->WepStatus, apidx);\n\n#ifdef WSC_V2_SUPPORT\n\t\tif (pMbss->WscControl.WscV2Info.bEnableWpsV2)\n\t\t{\n\t\t\t/* WPS V2 doesn't support WEP and WPA/WPAPSK-TKIP. */\n\t\t\tif ((pMbss->WepStatus == Ndis802_11WEPEnabled) || \n\t\t\t\t(pMbss->WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t\t(pMbss->bHideSsid))\n\t\t\t\tWscOnOff(pAd, apidx, TRUE);\n\t\t\telse\n\t\t\t\tWscOnOff(pAd, apidx, FALSE);\n\t\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tif (phy_mode != pAd->CommonCfg.PhyMode)\n\t\tRTMPSetPhyMode(pAd, phy_mode);\n\n\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\n\tCOPY_MAC_ADDR(pAd->CommonCfg.Bssid, pAd->CurrentAddress);\n\n\t/* Select DAC according to HT or Legacy, write to BBP R1(bit4:3) */\n\t/* In HT mode and two stream mode, both DACs are selected. */\n\t/* In legacy mode or one stream mode, DAC-0 is selected. */\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && (pAd->Antenna.field.TxPath == 2))\n\t\t\trtmp_bbp_set_txdac(pAd, 2);\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\trtmp_bbp_set_txdac(pAd, 0);\n\t}\n\n\t/* Receiver Antenna selection */\n\trtmp_bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);\n\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) || bWmmCapable)\n\t{\n\t\t/* EDCA parameters used for AP's own transmission */\n\t\tif (pAd->CommonCfg.APEdcaParm.bValid == FALSE)\n\t\t{\t\n\t\t\tpAd->CommonCfg.APEdcaParm.bValid = TRUE;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;\n\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;\n\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;\n\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[0]  = 0;\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[1]  = 0;\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[2]  = 94;\t/*96; */\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[3]  = 47;\t/*48; */\n\t\t}\n\t\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n\n\t\t/* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */\n\t\tif (pAd->ApCfg.BssEdcaParm.bValid == FALSE)\n\t\t{\n\t\t\tpAd->ApCfg.BssEdcaParm.bValid = TRUE;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[0] = 3;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[1] = 7;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[2] = 2;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[3] = 2;\n\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[0] = 4;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[1] = 4;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[2] = 3;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[3] = 2;\n\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[0] = 10;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[1] = 10;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[2] = 4;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[3] = 3;\n\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[0]  = 0;\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[1]  = 0;\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[2]  = 94;\t/*96; */\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[3]  = 47;\t/*48; */\n\t\t}\n\t}\n\telse\n\t\tAsicSetEdcaParm(pAd, NULL);\n\n#ifdef DOT11_N_SUPPORT\n\tif (!WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\t/* Patch UI */\n\t\tpAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = BW_20;\n\t}\n\n\t/* init */\n\tif (pAd->CommonCfg.bRdg)\n\t{\t\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\tAsicEnableRDG(pAd);\n\t}\n\telse\t\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\tAsicDisableRDG(pAd);\n\t}\n\n\tif (pAd->CommonCfg.bRalinkBurstMode)\n\t{\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\tAsicEnableRalinkBurstMode(pAd);\n\t}\n\telse\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\tAsicDisableRalinkBurstMode(pAd);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tCOPY_MAC_ADDR(pAd->ApCfg.MBSSID[BSS0].Bssid, pAd->CurrentAddress);\n\tAsicSetBssid(pAd, pAd->CurrentAddress); \n\tAsicSetMcastWC(pAd);\n\n\n\t/*@!RELEASE\n\t\tReset WCID table\n\t\t\n\t\tIn AP mode,  First WCID Table in ASIC will never be used.\n\t\tTo prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here.\n\n\t\tp.s ASIC use all 0xff as termination of WCID table search.\n\t*/\n#ifdef MT7601U\n\t{\n\t\tUINT32 MACValue[128 * 2];\n\t\tUINT32 Index;\n\n\t\tfor (Index = 0; Index < 128 * 2; Index+=2)\n\t\t{\n\t\t\tMACValue[Index] = 0;\n\t\t\tMACValue[Index + 1] = 0;\n\t\t}\n\n\t\tAndesBurstWrite(pAd, MAC_WCID_BASE, MACValue, 128 * 2);\n\n\n\t}\n#else\n\tfor (i=0; i<255; i++)\n\t\tAsicDelWcidTab(pAd, i);\n#endif /* MT7601U */\n\n#ifdef FIFO_EXT_SUPPORT\n\tAsicFifoExtSet(pAd);\n#endif /* FIFO_EXT_SUPPORT */\n\n\tpAd->MacTab.MsduLifeTime = 5; /* default 5 seconds */\n\t\n\tpAd->MacTab.Content[0].Addr[0] = 0x01;\n\tpAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM;\n\tpAd->MacTab.Content[0].HTPhyMode.field.MCS = 3;\n\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\n\tAsicBBPAdjust(pAd);\n\n\t/* Clear BG-Protection flag */\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n#ifdef DOT11_VHT_AC\n\tif (pAd->CommonCfg.BBPCurrentBW == BW_80)\n\t\tpAd->hw_cfg.cent_ch = pAd->CommonCfg.vht_cent_ch;\n\telse\n#endif /* DOT11_VHT_AC */\n\t\tpAd->hw_cfg.cent_ch = pAd->CommonCfg.CentralChannel;\n\tAsicSwitchChannel(pAd, pAd->hw_cfg.cent_ch, FALSE);\n\tAsicLockChannel(pAd, pAd->hw_cfg.cent_ch);\n\n#ifdef DOT11_VHT_AC\n//+++Add by shiang for debug\nDBGPRINT(RT_DEBUG_OFF, (\"%s(): AP Set CentralFreq at %d(Prim=%d, HT-CentCh=%d, VHT-CentCh=%d, BBP_BW=%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, pAd->hw_cfg.cent_ch, pAd->CommonCfg.Channel, \n\t\t\t\t\t\tpAd->CommonCfg.CentralChannel, pAd->CommonCfg.vht_cent_ch,\n\t\t\t\t\t\tpAd->CommonCfg.BBPCurrentBW));\n//---Add by shiang for debug\n#endif /* DOT11_VHT_AC */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\n\tif (pAd->ApCfg.bGreenAPEnable == TRUE)\n\t{\n\t\tRTMP_CHIP_ENABLE_AP_MIMOPS(pAd,TRUE);\n\t\tpAd->ApCfg.GreenAPLevel=GREENAP_WITHOUT_ANY_STAS_CONNECT;\n\t}\n#endif /* GREENAP_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\tMlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble);\t\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tMlmeUpdateTxRates(pAd, FALSE, apidx);\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\tMlmeUpdateHtTxRates(pAd, apidx);\n#endif /* DOT11_N_SUPPORT */\n\t}\n\t\n\t/* Set the RadarDetect Mode as Normal, bc the APUpdateAllBeaconFram() will refer this parameter. */\n\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\n\t/* Disable Protection first. */\n\tAsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);\n\t\n\tAPUpdateCapabilityAndErpIe(pAd);\n#ifdef DOT11_N_SUPPORT\n\tAPUpdateOperationMode(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Set LED */\n\tRTMPSetLED(pAd, LED_LINK_UP);\n#endif /* LED_CONTROL_SUPPORT */\n\n\n\t/* Initialize security variable per entry, \n\t\t1. \tpairwise key table, re-set all WCID entry as NO-security mode.\n\t\t2.\taccess control port status\n\t*/\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\tAsicRemovePairwiseKeyEntry(pAd, (UCHAR)i);\n\t}\n\t\t\n\t/* Init Security variables */\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tUSHORT\t\tWcid = 0;\t\n\t\tPMULTISSID_STRUCT\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n\t\tpMbss->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t\tif (IS_WPA_CAPABILITY(pMbss->AuthMode))\n\t\t{   \n\t\t\tpMbss->DefaultKeyId = 1;\n\t\t}\n\n\t\t/* Get a specific WCID to record this MBSS key attribute */\n\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\n\t\t/* When WEP, TKIP or AES is enabled, set group key info to Asic */\n\t\tif (pMbss->WepStatus == Ndis802_11WEPEnabled)\n\t\t{\n\t\t\tUCHAR CipherAlg, idx;\n\n\t\t\tfor (idx=0; idx < SHARE_KEY_NUM; idx++)\n\t\t\t{\n\t\t\t\tCipherAlg = pAd->SharedKey[apidx][idx].CipherAlg;\n\n\t\t\t\tif (pAd->SharedKey[apidx][idx].KeyLen > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Set key material to Asic */\n    \t\t\t\tAsicAddSharedKeyEntry(pAd, apidx, idx, &pAd->SharedKey[apidx][idx]);\t\n\t\t\n\t\t\t\t\tif (idx == pMbss->DefaultKeyId)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Generate 3-bytes IV randomly for software encryption using */\t\t\t\t\t\t\n\t\t\t\t    \tfor(i = 0; i < LEN_WEP_TSC; i++)\n\t\t\t\t\t\t\tpAd->SharedKey[apidx][idx].TxTsc[i] = RandomByte(pAd);   \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t/* Update WCID attribute table and IVEIV table */\n\t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\t\t\t\t\t\tidx, \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tCipherAlg,\n\t\t\t\t\t\t\t\t\t\t\t\tWcid, \n\t\t\t\t\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n    \t\t}\n\t\telse if ((pMbss->WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t\t (pMbss->WepStatus == Ndis802_11Encryption3Enabled) ||\n\t\t\t\t (pMbss->WepStatus == Ndis802_11Encryption4Enabled))\n\t\t{\n\t\t\t/* Generate GMK and GNonce randomly per MBSS */\n\t\t\tGenRandom(pAd, pMbss->Bssid, pMbss->GMK);\n\t\t\tGenRandom(pAd, pMbss->Bssid, pMbss->GNonce);\t\t\n\n\t\t\t/* Derive GTK per BSSID */\n\t\t\tWpaDeriveGTK(pMbss->GMK, \n\t\t\t\t\t\t(UCHAR*)pMbss->GNonce, \n\t\t\t\t\t\tpMbss->Bssid, \n\t\t\t\t\t\tpMbss->GTK, \n\t\t\t\t\t\tLEN_TKIP_GTK);\n\n\t\t\t/* Install Shared key */\n\t\t\tWPAInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\tpMbss->GroupKeyWepStatus, \n\t\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\t\tpMbss->DefaultKeyId, \n\t\t\t\t\t\t\t\tWcid,\n\t\t\t\t\t\t\t\tTRUE,\n\t\t\t\t\t\t\t\tpMbss->GTK,\n\t\t\t\t\t\t\t\tLEN_TKIP_GTK);\n\t\t\n\t\t}\n#ifdef WAPI_SUPPORT\n\t\telse if (pMbss->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\t{\t\n\t\t\tINT\tcnt;\n\t\t\n\t\t\t/* Initial the related variables */\n\t\t\tpMbss->DefaultKeyId = 0;\n\t\t\tNdisMoveMemory(pMbss->key_announce_flag, AE_BCAST_PN, LEN_WAPI_TSC);\n\t\t\tif (IS_HW_WAPI_SUPPORT(pAd))\n\t\t\t\tpMbss->sw_wpi_encrypt = FALSE;\t\t\t\t\t\n\t\t\telse\n\t\t\t\tpMbss->sw_wpi_encrypt = TRUE;\n\n\t\t\t/* Generate NMK randomly */\n\t\t\tfor (cnt = 0; cnt < LEN_WAPI_NMK; cnt++)\n\t\t\t\tpMbss->NMK[cnt] = RandomByte(pAd);\n\t\t\t\n\t\t\t/* Count GTK for this BSSID */\n\t\t\tRTMPDeriveWapiGTK(pMbss->NMK, pMbss->GTK);\n\n\t\t\t/* Install Shared key */\n\t\t\tWAPIInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\t pMbss->GroupKeyWepStatus, \n\t\t\t\t\t\t\t\t apidx, \n\t\t\t\t\t\t\t\t pMbss->DefaultKeyId, \n\t\t\t\t\t\t\t\t Wcid,\n\t\t\t\t\t\t\t\t pMbss->GTK);\n\t\t\t\n\t\t}\n#endif /* WAPI_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\n\t\t/* Send singal to daemon to indicate driver had restarted */\n\t\tif ((pMbss->AuthMode == Ndis802_11AuthModeWPA) || (pMbss->AuthMode == Ndis802_11AuthModeWPA2)\n        \t\t|| (pMbss->AuthMode == Ndis802_11AuthModeWPA1WPA2) || (pMbss->IEEE8021X == TRUE))\n\t\t{\n\t\t\t;/*bDot1xReload = TRUE; */\n    \t}\n#endif /* DOT1X_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"### BSS(%d) AuthMode(%d)=%s, WepStatus(%d)=%s , AccessControlList.Policy=%ld\\n\", apidx, pMbss->AuthMode, GetAuthMode(pMbss->AuthMode), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  pMbss->WepStatus, GetEncryptType(pMbss->WepStatus), pMbss->AccessControlList.Policy));\n\t}\n\n\n\t/* Disable Protection first. */\n\t/*AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE); */\n#ifdef PIGGYBACK_SUPPORT\n\tRTMPSetPiggyBack(pAd, pAd->CommonCfg.bPiggyBackCapable);\n#endif /* PIGGYBACK_SUPPORT */\n\n\tApLogEvent(pAd, pAd->CurrentAddress, EVENT_RESET_ACCESS_POINT);\n\tpAd->Mlme.PeriodicRound = 0;\n\tpAd->Mlme.OneSecPeriodicRound = 0;\n\n\tOPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\n\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\n\n\t/*\n\t\tNOTE!!!:\n\t\t\tAll timer setting shall be set after following flag be cleared\n\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS\n\t*/\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\n#ifdef RTMP_MAC_USB\n\tRTUSBBssBeaconInit(pAd);\n#endif /* RTMP_MAC_USB */\n\t/* start sending BEACON out */\n\tAPMakeAllBssBeacon(pAd);\n\tAPUpdateAllBeaconFrame(pAd);\n\n#ifdef A_BAND_SUPPORT\n\tif ( (pAd->CommonCfg.Channel > 14)\n\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t&& RadarChannelCheck(pAd, pAd->CommonCfg.Channel))\n\t{\n\t\tpAd->Dot11_H.RDMode = RD_SILENCE_MODE;\n\t\tpAd->Dot11_H.RDCount = 0;\n\t\tpAd->Dot11_H.InServiceMonitorCount = 0;\n#ifdef DFS_SUPPORT\t\t\n\t\t\tNewRadarDetectionStart(pAd);\n#endif /* DFS_SUPPORT */\t\t\n\t}\n\telse\n#endif /* A_BAND_SUPPORT */\t\t\n\t{\n\t\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\t\tAsicEnableBssSync(pAd);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT\n#ifdef A_BAND_SUPPORT\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t{\n\t\t\tif ((pAd->CommonCfg.CarrierDetect.Enable == FALSE)\n\t\t\t\t&& ((pAd->CommonCfg.RDDurRegion == JAP)\n\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W53)\n\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W56)))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = 1;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* A_BAND_SUPPORT */\t\t\t\n\t\t{\n\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\t\t{\n\t\t\t\tif ((pAd->CommonCfg.CarrierDetect.Enable == FALSE)\n\t\t\t\t\t\t&& ((pAd->CommonCfg.RDDurRegion == JAP)\n\t\t\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W53)\n\t\t\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W56)))\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\t{\n\t\t\tCarrierDetectionStart(pAd);\n\t\t}\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n\t/* Pre-tbtt interrupt setting. */\n\tAsicSetPreTbttInt(pAd, TRUE);\n\n#ifdef WAPI_SUPPORT\n\tRTMPStartWapiRekeyTimerAction(pAd, NULL);\n#endif /* WAPI_SUPPORT */\n\n\t/*\n\t\tSet group re-key timer if necessary. \n\t\tIt must be processed after clear flag \"fRTMP_ADAPTER_HALT_IN_PROGRESS\"\n\t*/\n\tWPA_APSetGroupRekeyAction(pAd);\n\n\n#ifdef IDS_SUPPORT\n\t/* Start IDS timer */\n\tif (pAd->ApCfg.IdsEnable)\n\t{\n#ifdef SYSTEM_LOG_SUPPORT\t\n\t\tif (pAd->CommonCfg.bWirelessEvent == FALSE)\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"!!! WARNING !!! The WirelessEvent parameter doesn't be enabled \\n\"));\n#endif /* SYSTEM_LOG_SUPPORT */\n\t\t\n\t\tRTMPIdsStart(pAd);\n\t}\n#endif /* IDS_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\t/* */\n\t/* Support multiple BulkIn IRP, */\n\t/* the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. */\n\t/* */\n\tfor(i=0; i<pAd->CommonCfg.NumOfBulkInIRP; i++)\n\t{\n\t\tRTUSBBulkReceive(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBulkReceive!\\n\" ));\n\t}\n#endif /* RTMP_MAC_USB */\n\n\n\n\n#if MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n#ifdef DPD_CALIBRATION_SUPPORT\n\t\t/* DPD-Calibration */\n\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_DPD, pAd->chipCap.CurrentTemperature);\n#endif /* DPD_CALIBRATION_SUPPORT */\n\n\t\t// MT7601_RXDC_CAL\n\t\tMT7601_RXDC_CAL(pAd);\n\t}\n#endif /* MT7601 */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== APStartUp\\n\"));\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tdisassociate all STAs and stop AP service.\n\tNote:\n\t==========================================================================\n */\nVOID APStop(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBOOLEAN     Cancelled;\n\tUINT32\t\tValue;\n\tINT\t\t\tapidx;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! APStop !!!\\n\"));\n\n#ifdef DFS_SUPPORT\n\t\tNewRadarDetectionStop(pAd);\n#endif /* DFS_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\t{\n\t\t\t/* make sure CarrierDetect wont send CTS */\n\t\t\tCarrierDetectionStop(pAd);\n\t\t}\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\n#ifdef APCLI_SUPPORT\n\tApCliIfDown(pAd);\n#endif /* APCLI_SUPPORT */\n\n\tMacTableReset(pAd);\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\n\t/* Disable pre-tbtt interrupt */\n\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\tValue &=0xe;\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\t/* Disable piggyback */\n\tRTMPSetPiggyBack(pAd, FALSE);\n\n   \tAsicUpdateProtect(pAd, 0,  (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\t/*RTMP_ASIC_INTERRUPT_DISABLE(pAd); */\n\t\tAsicDisableSync(pAd);\n\n#ifdef LED_CONTROL_SUPPORT\n\t\t/* Set LED */\n\t\tRTMPSetLED(pAd, LED_LINK_DOWN);\n#endif /* LED_CONTROL_SUPPORT */\n\t}\n\n#ifdef RTMP_MAC_USB\n\t/* For RT2870, we need to clear the beacon sync buffer. */\n\tRTUSBBssBeaconExit(pAd);\n#endif /* RTMP_MAC_USB */\n\n\n\tfor (apidx = 0; apidx < MAX_MBSSID_NUM(pAd); apidx++)\n\t{\n\t\tif (pAd->ApCfg.MBSSID[apidx].REKEYTimerRunning == TRUE)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx].REKEYTimer, &Cancelled);\n\t\t\tpAd->ApCfg.MBSSID[apidx].REKEYTimerRunning = FALSE;\n\t\t}\n\t}\n\n\tif (pAd->ApCfg.CMTimerRunning == TRUE)\n\t{\n\t\tRTMPCancelTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled);\n\t\tpAd->ApCfg.CMTimerRunning = FALSE;\n\t}\n\t\n#ifdef WAPI_SUPPORT\n\tRTMPCancelWapiRekeyTimerAction(pAd, NULL);\n#endif /* WAPI_SUPPORT */\n\t\n\t/* */\n\t/* Cancel the Timer, to make sure the timer was not queued. */\n\t/* */\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\n#ifdef IDS_SUPPORT\n\t/* if necessary, cancel IDS timer */\n\tRTMPIdsStop(pAd);\n#endif /* IDS_SUPPORT */\n\n\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is used to clean up a specified power-saving queue. It's\n\t\tused whenever a wireless client is deleted.\n\t==========================================================================\n */\nVOID APCleanupPsQueue(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PQUEUE_HEADER   pQueue)\n{\n\tPQUEUE_ENTRY pEntry;\n\tPNDIS_PACKET pPacket;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): (0x%08lx)...\\n\", __FUNCTION__, (ULONG)pQueue));\n\n\twhile (pQueue->Head)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():%ld...\\n\", __FUNCTION__, pQueue->Number));\n\n\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t/*pPacket = CONTAINING_RECORD(pEntry, NDIS_PACKET, MiniportReservedEx); */\n\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is called by APMlmePeriodicExec() every second to check if\n\t\t1. any associated client in PSM. If yes, then TX MCAST/BCAST should be\n\t\t   out in DTIM only\n\t\t2. any client being idle for too long and should be aged-out from MAC table\n\t\t3. garbage collect PSQ\n\t==========================================================================\n*/\nVOID MacTableMaintenance(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint i;\n#ifdef DOT11_N_SUPPORT\n\tULONG MinimumAMPDUSize = pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor; /*Default set minimum AMPDU Size to 2, i.e. 32K */\n\tBOOLEAN\tbRdgActive;\n\tBOOLEAN bRalinkBurstMode;\n#endif /* DOT11_N_SUPPORT */\n\tUINT\tfAnyStationPortSecured[HW_BEACON_MAX_NUM];\n \tUINT \tbss_index;\n\tMAC_TABLE *pMacTable;\n#if defined(PRE_ANT_SWITCH) || defined(CFO_TRACK)\n\tint lastClient=0;\n#endif /* defined(PRE_ANT_SWITCH) || defined(CFO_TRACK) */\n\n\tfor (bss_index = BSS0; bss_index < MAX_MBSSID_NUM(pAd); bss_index++)\n\t\tfAnyStationPortSecured[bss_index] = 0;\n\n\tpMacTable = &pAd->MacTab;\n\tpMacTable->fAnyStationInPsm = FALSE;\n\tpMacTable->fAnyStationBadAtheros = FALSE;\n\tpMacTable->fAnyTxOPForceDisable = FALSE;\n\tpMacTable->fAllStationAsRalink = TRUE;\n#ifdef DOT11_N_SUPPORT\n\tpMacTable->fAnyStationNonGF = FALSE;\n\tpMacTable->fAnyStation20Only = FALSE;\n\tpMacTable->fAnyStationIsLegacy = FALSE;\n\tpMacTable->fAnyStationMIMOPSDynamic = FALSE;\n#ifdef GREENAP_SUPPORT\n\t/*Support Green AP */\n\tpMacTable->fAnyStationIsHT=FALSE;\n#endif /* GREENAP_SUPPORT */\n\n#ifdef DOT11N_DRAFT3\n\tpMacTable->fAnyStaFortyIntolerant = FALSE;\n#endif /* DOT11N_DRAFT3 */\n\tpMacTable->fAllStationGainGoodMCS = TRUE;\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\tpMacTable->fAnyWapiStation = FALSE;\n#endif /* WAPI_SUPPORT */\n\n\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t{\n\t\tMAC_TABLE_ENTRY *pEntry = &pMacTable->Content[i];\n\t\tBOOLEAN bDisconnectSta = FALSE;\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\tif(IS_ENTRY_APCLI(pEntry) && pEntry->PortSecured == WPA_802_1X_PORT_SECURED)\n\t\t{\n\t\t\tif ((pAd->Mlme.OneSecPeriodicRound % 10) == 8)\n\t\t\t{\n\t\t\t\t/* use Null or QoS Null to detect the ACTIVE station*/\n\t\t\t\tBOOLEAN ApclibQosNull = FALSE;\n\t\t\n\t\t\t\tif (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\tApclibQosNull = TRUE;\n\t\t\t\t\n\t\t\t       ApCliRTMPSendNullFrame(pAd,pEntry->CurrTxRate, ApclibQosNull, pEntry);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n#endif /*APCLI_WPA_SUPPLICANT_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n\t\tif (!IS_ENTRY_CLIENT(pEntry))\n\t\t\tcontinue;\n\n\t\tif (pEntry->NoDataIdleCount == 0)\n\t\t\tpEntry->StationKeepAliveCount = 0;\n\n\t\tpEntry->NoDataIdleCount ++;  \n\t\tpEntry->StaConnectTime ++;\n\n\t\t/* 0. STA failed to complete association should be removed to save MAC table space. */\n\t\tif ((pEntry->Sst != SST_ASSOC) && (pEntry->NoDataIdleCount >= pEntry->AssocDeadLine))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x:%02x:%02x:%02x:%02x:%02x fail to complete ASSOC in %d sec\\n\",\n\t\t\t\t\tpEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2],pEntry->Addr[3],\n\t\t\t\t\tpEntry->Addr[4],pEntry->Addr[5],MAC_TABLE_ASSOC_TIMEOUT));\n#ifdef WSC_AP_SUPPORT\n\t\t\tif (NdisEqualMemory(pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, MAC_ADDR_LEN))\n\t\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, MAC_ADDR_LEN);\n#endif /* WSC_AP_SUPPORT */\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* 1. check if there's any associated STA in power-save mode. this affects outgoing */\n\t\t/*    MCAST/BCAST frames should be stored in PSQ till DtimCount=0 */\n\t\tif (pEntry->PsMode == PWR_SAVE)\n\t\t\tpMacTable->fAnyStationInPsm = TRUE;\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (pEntry->MmpsMode == MMPS_DYNAMIC)\n\t\t{\n\t\t\tpMacTable->fAnyStationMIMOPSDynamic = TRUE;\n\t\t}\n\n\t\tif (pEntry->MaxHTPhyMode.field.BW == BW_20)\n\t\t\tpMacTable->fAnyStation20Only = TRUE;\n\n\t\tif (pEntry->MaxHTPhyMode.field.MODE != MODE_HTGREENFIELD)\n\t\t\tpMacTable->fAnyStationNonGF = TRUE;\n\n\t\tif ((pEntry->MaxHTPhyMode.field.MODE == MODE_OFDM) || (pEntry->MaxHTPhyMode.field.MODE == MODE_CCK))\n\t\t\tpMacTable->fAnyStationIsLegacy = TRUE;\n#ifdef GREENAP_SUPPORT\n\t\telse\n\t\t\tpMacTable->fAnyStationIsHT=TRUE;\n#endif /* GREENAP_SUPPORT */\n\n#ifdef DOT11N_DRAFT3\n\t\tif (pEntry->bForty_Mhz_Intolerant)\n\t\t\tpMacTable->fAnyStaFortyIntolerant = TRUE;\n#endif /* DOT11N_DRAFT3 */\n\n\t\t/* Get minimum AMPDU size from STA */\n\t\tif (MinimumAMPDUSize > pEntry->MaxRAmpduFactor) \n\t\t\tMinimumAMPDUSize = pEntry->MaxRAmpduFactor;\t\t\t\t\t\t\n#endif /* DOT11_N_SUPPORT */\n\t\t\n\t\tif (pEntry->bIAmBadAtheros)\n\t\t{\n\t\t\tpMacTable->fAnyStationBadAtheros = TRUE;\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)\n\t\t\t\tAsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, pMacTable->fAnyStationNonGF);\n#endif /* DOT11_N_SUPPORT */\n\t\t}\n\n\t\t/* detect the station alive status */\n\t\t/* detect the station alive status */\n\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].StationKeepAliveTime > 0) &&\n\t\t\t(pEntry->NoDataIdleCount >= pAd->ApCfg.MBSSID[pEntry->apidx].StationKeepAliveTime))\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\n\t\t\t/*\n\t\t\t\tIf no any data success between ap and the station for\n\t\t\t\tStationKeepAliveTime, try to detect whether the station is\n\t\t\t\tstill alive.\n\n\t\t\t\tNote: Just only keepalive station function, no disassociation\n\t\t\t\tfunction if too many no response.\n\t\t\t*/\n\n\t\t\t/*\n\t\t\t\tFor example as below:\n\n\t\t\t\t1. Station in ACTIVE mode,\n\n\t\t        ......\n\t\t        sam> tx ok!\n\t\t        sam> count = 1!\t ==> 1 second after the Null Frame is acked\n\t\t        sam> count = 2!\t ==> 2 second after the Null Frame is acked\n\t\t        sam> count = 3!\n\t\t        sam> count = 4!\n\t\t        sam> count = 5!\n\t\t        sam> count = 6!\n\t\t        sam> count = 7!\n\t\t        sam> count = 8!\n\t\t        sam> count = 9!\n\t\t        sam> count = 10!\n\t\t        sam> count = 11!\n\t\t        sam> count = 12!\n\t\t        sam> count = 13!\n\t\t        sam> count = 14!\n\t\t        sam> count = 15! ==> 15 second after the Null Frame is acked\n\t\t        sam> tx ok!      ==> (KeepAlive Mechanism) send a Null Frame to\n\t\t\t\t\t\t\t\t\t\tdetect the STA life status\n\t\t        sam> count = 1!  ==> 1 second after the Null Frame is acked\n\t\t        sam> count = 2!\n\t\t        sam> count = 3!\n\t\t        sam> count = 4!\n\t\t        ......\n\n\t\t\t\tIf the station acknowledges the QoS Null Frame,\n\t\t\t\tthe NoDataIdleCount will be reset to 0.\n\n\n\t\t\t\t2. Station in legacy PS mode,\n\n\t\t\t\tWe will set TIM bit after 15 seconds, the station will send a\n\t\t\t\tPS-Poll frame and we will send a QoS Null frame to it.\n\t\t\t\tIf the station acknowledges the QoS Null Frame, the\n\t\t\t\tNoDataIdleCount will be reset to 0.\n\n\n\t\t\t\t3. Station in legacy UAPSD mode,\n\n\t\t\t\tCurrently we do not support the keep alive mechanism.\n\t\t\t\tSo if your station is in UAPSD mode, the station will be\n\t\t\t\tkicked out after 300 seconds.\n\n\t\t\t\tNote: the rate of QoS Null frame can not be 1M of 2.4GHz or\n\t\t\t\t6M of 5GHz, or no any statistics count will occur.\n\t\t\t*/\n\n\t\t\tif (pEntry->StationKeepAliveCount++ == 0)\n\t\t\t{\n\t\t\t\tif (pEntry->PsMode == PWR_SAVE)\n\t\t\t\t{\n\t\t\t\t\t/* use TIM bit to detect the PS station */\n\t\t\t\t\tWLAN_MR_TIM_BIT_SET(pAd, pEntry->apidx, pEntry->Aid);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* use Null or QoS Null to detect the ACTIVE station */\n\t\t\t\t\tBOOLEAN bQosNull = FALSE;\n\t\n\t\t\t\t\tif (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\t\tbQosNull = TRUE;\n\n\t\t            ApEnqueueNullFrame(pAd, pEntry->Addr, pEntry->CurrTxRate,\n\t    \t                           pEntry->Aid, pEntry->apidx, bQosNull, TRUE, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pEntry->StationKeepAliveCount >= pMbss->StationKeepAliveTime)\n\t\t\t\t\tpEntry->StationKeepAliveCount = 0;\n\t\t\t}\n\t\t}\n\n\t\t/* 2. delete those MAC entry that has been idle for a long time */\n\t\tif (pEntry->NoDataIdleCount >= pEntry->StaIdleTimeout)\n\t\t{\n\t\t\tbDisconnectSta = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"ageout %02x:%02x:%02x:%02x:%02x:%02x after %d-sec silence\\n\",\n\t\t\t\t\tPRINT_MAC(pEntry->Addr), pEntry->StaIdleTimeout));\n\t\t\tApLogEvent(pAd, pEntry->Addr, EVENT_AGED_OUT);\n\t\t}\n\t\telse if (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck)\n\t\t{\n\t\t\t/*\n\t\t\t\tAP have no way to know that the PwrSaving STA is leaving or not.\n\t\t\t\tSo do not disconnect for PwrSaving STA.\n\t\t\t*/\n\t\t\tif (pEntry->PsMode != PWR_SAVE)\n\t\t\t{\n\t\t\t\tbDisconnectSta = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"STA-%02x:%02x:%02x:%02x:%02x:%02x had left (%d %lu)\\n\",\n\t\t\t\t\tPRINT_MAC(pEntry->Addr),\n\t\t\t\t\tpEntry->ContinueTxFailCnt, pAd->ApCfg.EntryLifeCheck));\n\t\t\t}\n\t\t}\n\n\t\tif (bDisconnectSta)\n\t\t{\n\t\t\t/* send wireless event - for ageout */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, pEntry->Addr, 0, 0); \n\n\t\t\tif (pEntry->Sst == SST_ASSOC)\n\t\t\t{\n\t\t\t\tPUCHAR      pOutBuffer = NULL;\n\t\t\t\tNDIS_STATUS NStatus;\n\t\t\t\tULONG       FrameLen = 0;\n\t\t\t\tHEADER_802_11 DeAuthHdr;\n\t\t\t\tUSHORT      Reason;\n\n\t\t\t\t/*  send out a DISASSOC request frame */\n\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tReason = REASON_DEAUTH_STA_LEAVING;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"Send DEAUTH - Reason = %d frame  TO %x %x %x %x %x %x \\n\",\n\t\t\t\t\t\t\t\t\t\tReason, PRINT_MAC(pEntry->Addr)));\n\t\t\t\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].Bssid);\t\t\t\t\n\t\t    \tMakeOutgoingFrame(pOutBuffer,            &FrameLen, \n\t\t    \t                  sizeof(HEADER_802_11), &DeAuthHdr, \n\t\t    \t                  2,                     &Reason, \n\t\t    \t                  END_OF_ARGS);\t\t\t\t\n\t\t    \tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t    \tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t}\n\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* 3. garbage collect the PsQueue if the STA has being idle for a while */\n\t\tif (pEntry->PsQueue.Head)\n\t\t{\n\t\t\tpEntry->PsQIdleCount ++;  \n\t\t\tif (pEntry->PsQIdleCount > 2) \n\t\t\t{\n\t\t\t\tNdisAcquireSpinLock(&pAd->irq_lock);\n\t\t\t\tAPCleanupPsQueue(pAd, &pEntry->PsQueue);\n\t\t\t\tNdisReleaseSpinLock(&pAd->irq_lock);\n\t\t\t\tpEntry->PsQIdleCount = 0;\n\t\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pEntry->apidx, pEntry->Aid);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpEntry->PsQIdleCount = 0;\n\t\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_QueueMaintenance(pAd, pEntry);\n#endif /* UAPSD_SUPPORT */\n\n\t\t/* check if this STA is Ralink-chipset */\n\t\tif (!CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET))\n\t\t\tpMacTable->fAllStationAsRalink = FALSE;\n\n\t\t/* Check if the port is secured */\n\t\tif (pEntry->PortSecured == WPA_802_1X_PORT_SECURED)\n\t\t\tfAnyStationPortSecured[pEntry->apidx]++;\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\tif ((pEntry->BSS2040CoexistenceMgmtSupport) \n\t\t\t&& (pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_NOTIFY)\n\t\t\t&& (pAd->CommonCfg.bBssCoexEnable == TRUE)\n\t\t)\n\t\t{\n\t\t\tSendNotifyBWActionFrame(pAd, pEntry->Aid, pEntry->apidx);\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n#ifdef WAPI_SUPPORT\n\t\tif (pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\t\tpMacTable->fAnyWapiStation = TRUE;\n#endif /* WAPI_SUPPORT */\n\n#if defined(PRE_ANT_SWITCH) || defined(CFO_TRACK)\n\t\tlastClient = i;\n#endif /* defined(PRE_ANT_SWITCH) || defined(CFO_TRACK) */\n\n\t\t/* only apply burst when run in MCS0,1,8,9,16,17, not care about phymode */\n\t\tif ((pEntry->HTPhyMode.field.MCS != 32) && \n\t\t\t((pEntry->HTPhyMode.field.MCS % 8 == 0) || (pEntry->HTPhyMode.field.MCS % 8 == 1)))\n\t\t{\n\t\t\tpMacTable->fAllStationGainGoodMCS = FALSE;\n\t\t}\n\t}\n\n#ifdef RT8592\n\t// TODO: shiang-6590, fix me after chip fix this issue !!\n\tif (0)//IS_RT8592(pAd))\n\t{\n\t\tif (pMacTable->Size == 1)\n\t\t{\n\t\t\tUINT32 bbp_reg, bbp_val;\n\t\t\t\n\t\t\tRTMP_BBP_IO_READ32(pAd, AGC1_R20, &bbp_reg);\n\t\t\tif ((bbp_reg & 0xff) > 0xE5)\n\t\t\t\tbbp_val = 0x132C38C0;\n\t\t\telse\n\t\t\t\tbbp_val = 0x132C40C0;\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, AGC1_R8, bbp_val);\n\n\t\t\tif (((bbp_reg & 0xff00) >> 8) > 0xE5)\n\t\t\t\tbbp_val = 0x132C38C0;\n\t\t\telse\n\t\t\t\tbbp_val = 0x132C40C0;\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, AGC1_R9, bbp_val);\n\t\t}\n\t}\n#endif /* RT8592 */\n\n#ifdef PRE_ANT_SWITCH\n#endif /* PRE_ANT_SWITCH */\n\n#ifdef CFO_TRACK\n#endif /* CFO_TRACK */\n\n\t/* Update the state of port per MBSS */\n\tfor (bss_index = BSS0; bss_index < MAX_MBSSID_NUM(pAd); bss_index++)\n\t{\n\t\tif (fAnyStationPortSecured[bss_index] > 0)\n\t\t\tpAd->ApCfg.MBSSID[bss_index].PortSecured = WPA_802_1X_PORT_SECURED;\n\t\telse\n\t\t\tpAd->ApCfg.MBSSID[bss_index].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t}\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif (pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_NOTIFY)\n\t\tpAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_INFO_NOTIFY);\n#endif /* DOT11N_DRAFT3 */\n\n\t/* If all associated STAs are Ralink-chipset, AP shall enable RDG. */\n\tif (pAd->CommonCfg.bRdg && pMacTable->fAllStationAsRalink)\n\t{\n\t\tbRdgActive = TRUE;\n\t}\n\telse\n\t{\n\t\tbRdgActive = FALSE;\n\t}\n\n\tif (pAd->CommonCfg.bRalinkBurstMode && pMacTable->fAllStationGainGoodMCS)\n\t{\n\t\tbRalinkBurstMode = TRUE;\n\t}\n\telse\n\t{\n\t\tbRalinkBurstMode = FALSE;\n\t}\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tif(pAd->MacTab.fAnyStationIsHT == FALSE\n\t\t\t&& pAd->ApCfg.bGreenAPEnable == TRUE)\n\t\t{\n\t\t\tif (pAd->ApCfg.GreenAPLevel!=GREENAP_ONLY_11BG_STAS)\n\t\t\t{\n\t\t\t\tRTMP_CHIP_ENABLE_AP_MIMOPS(pAd,FALSE);\n\t\t\t\tpAd->ApCfg.GreenAPLevel=GREENAP_ONLY_11BG_STAS;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->ApCfg.GreenAPLevel!=GREENAP_11BGN_STAS)\n\t\t\t{\n\t\t\t\tRTMP_CHIP_DISABLE_AP_MIMOPS(pAd);\n\t\t\t\tpAd->ApCfg.GreenAPLevel=GREENAP_11BGN_STAS;\n\t\t\t}\n\t\t}\n\t}\n#endif /* GREENAP_SUPPORT */\n\n\tif (bRdgActive != RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE))\n\t{\n\t\tif (bRdgActive)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\tAsicEnableRDG(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\tAsicDisableRDG(pAd);\n\t\t}\n\t}\n\n\tif (bRalinkBurstMode != RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE))\n\t{\n\t\tif (bRalinkBurstMode)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\t\tAsicEnableRalinkBurstMode(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\t\tAsicDisableRalinkBurstMode(pAd);\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n\tif ((pMacTable->fAnyStationBadAtheros == FALSE) && (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == TRUE))\n\t{\n\t\tAsicUpdateProtect(pAd, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, pMacTable->fAnyStationNonGF);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t/* 4. garbage collect pAd->MacTab.McastPsQueue if backlogged MCAST/BCAST frames */\n\t/*    stale in queue. Since MCAST/BCAST frames always been sent out whenever */\n\t/*    DtimCount==0, the only case to let them stale is surprise removal of the NIC, */\n\t/*    so that ASIC-based Tbcn interrupt stops and DtimCount dead. */\n\tif (pMacTable->McastPsQueue.Head)\n\t{\n\t\tUINT bss_index;\n\n\t\tpMacTable->PsQIdleCount ++;\n\t\tif (pMacTable->PsQIdleCount > 1)\n\t\t{\n\n\t\t\t/*NdisAcquireSpinLock(&pAd->MacTabLock); */\n\t\t\tAPCleanupPsQueue(pAd, &pMacTable->McastPsQueue);\n\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\tpMacTable->PsQIdleCount = 0;\n\n\t\t        /* sanity check */\n\t\t\tif (pAd->ApCfg.BssidNum > MAX_MBSSID_NUM(pAd))\n\t\t\t\tpAd->ApCfg.BssidNum = MAX_MBSSID_NUM(pAd);\n\t\t        /* End of if */\n\t        \n\t\t        /* clear MCAST/BCAST backlog bit for all BSS */\n\t\t\tfor(bss_index=BSS0; bss_index<pAd->ApCfg.BssidNum; bss_index++)\n\t\t\t\tWLAN_MR_TIM_BCMC_CLEAR(bss_index);\n\t\t        /* End of for */\n\t\t}\n\t}\n\telse\n\t\tpMacTable->PsQIdleCount = 0;\n}\n\n\nUINT32 MacTableAssocStaNumGet(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32 num = 0;\n\tUINT32 i;\n\n\n\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t{\n\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (!IS_ENTRY_CLIENT(pEntry))\n\t\t\tcontinue;\n\n\t\tif (pEntry->Sst == SST_ASSOC)\n\t\t\tnum ++;\n\t}\n\n\treturn num;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tLook up a STA MAC table. Return its Sst to decide if an incoming\n\t\tframe from this STA or an outgoing frame to this STA is permitted.\n\tReturn:\n\t==========================================================================\n*/\nMAC_TABLE_ENTRY *APSsPsInquiry(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR pAddr, \n\tOUT SST   *Sst, \n\tOUT USHORT *Aid,\n\tOUT UCHAR *PsMode,\n\tOUT UCHAR *Rate) \n{\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\n\tif (MAC_ADDR_IS_GROUP(pAddr)) /* mcast & broadcast address */\n\t{\n\t\t*Sst        = SST_ASSOC;\n\t\t*Aid        = MCAST_WCID;\t/* Softap supports 1 BSSID and use WCID=0 as multicast Wcid index */\n\t\t*PsMode     = PWR_ACTIVE;\n\t\t*Rate       = pAd->CommonCfg.MlmeRate; \n\t} \n\telse /* unicast address */\n\t{\n\t\tpEntry = MacTableLookup(pAd, pAddr);\n\t\tif (pEntry) \n\t\t{\n\t\t\t*Sst        = pEntry->Sst;\n\t\t\t*Aid        = pEntry->Aid;\n\t\t\t*PsMode     = pEntry->PsMode;\n\t\t\tif ((pEntry->AuthMode >= Ndis802_11AuthModeWPA) && (pEntry->GTKState != REKEY_ESTABLISHED))\n\t\t\t\t*Rate   = pAd->CommonCfg.MlmeRate;\n\t\t\telse\n\t\t\t*Rate       = pEntry->CurrTxRate;\n\t\t} \n\t\telse \n\t\t{\n\t\t\t*Sst        = SST_NOT_AUTH;\n\t\t\t*Aid        = MCAST_WCID;\n\t\t\t*PsMode     = PWR_ACTIVE;\n\t\t\t*Rate       = pAd->CommonCfg.MlmeRate; \n\t\t}\n\t}\n\treturn pEntry;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tUpdate the station current power save mode. Calling this routine also\n\t\tprove the specified client is still alive. Otherwise AP will age-out\n\t\tthis client once IdleCount exceeds a threshold.\n\t==========================================================================\n */\nBOOLEAN APPsIndicate(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pAddr, \n\tIN ULONG Wcid, \n\tIN UCHAR Psm) \n{\n\tMAC_TABLE_ENTRY *pEntry;\n    UCHAR old_psmode;\n\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\treturn PWR_ACTIVE;\t\n\t}\n\n\tpEntry = &pAd->MacTab.Content[Wcid];\n\told_psmode = pEntry->PsMode;\n/*\tif (pEntry) */\n\t{\n\t\t/*\n\t\t\tChange power save mode first because we will call\n\t\t\tRTMPDeQueuePacket() in APHandleRxPsPoll().\n\n\t\t\tOr when Psm = PWR_ACTIVE, we will not do Aggregation in\n\t\t\tRTMPDeQueuePacket().\n\t\t*/\n\t\tpEntry->NoDataIdleCount = 0;\n\t\tpEntry->PsMode = Psm;\n\n\t\tif ((old_psmode == PWR_SAVE) && (Psm == PWR_ACTIVE))\n\t\t{\n\t\t\t/* TODO: For RT2870, how to handle about the BA when STA in PS mode???? */\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"APPsIndicate - %02x:%02x:%02x:%02x:%02x:%02x wakes up, act like rx PS-POLL\\n\", pAddr[0],pAddr[1],pAddr[2],pAddr[3],pAddr[4],pAddr[5]));\n\t\t\t/* sleep station awakes, move all pending frames from PSQ to TXQ if any */\n\t\t\tAPHandleRxPsPoll(pAd, pAddr, pEntry->Aid, TRUE);\n\t\t}\n\n\t\t/* move to above section */\n/*\t\tpEntry->NoDataIdleCount = 0; */\n/*\t\tpEntry->PsMode = Psm; */\n\t} \n/*\telse */\n/*\t{ */\n\t\t/* not in table, try to learn it ???? why bother? */\n/*\t} */\n\treturn old_psmode;\n}\n\n#ifdef SYSTEM_LOG_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is called to log a specific event into the event table.\n\t\tThe table is a QUERY-n-CLEAR array that stop at full.\n\t==========================================================================\n */\nVOID ApLogEvent(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR   pAddr,\n\tIN USHORT   Event)\n{\n\tif (pAd->EventTab.Num < MAX_NUM_OF_EVENT)\n\t{\n\t\tRT_802_11_EVENT_LOG *pLog = &pAd->EventTab.Log[pAd->EventTab.Num];\n\t\tRTMP_GetCurrentSystemTime(&pLog->SystemTime);\n\t\tCOPY_MAC_ADDR(pLog->Addr, pAddr);\n\t\tpLog->Event = Event;\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,(\"LOG#%ld %02x:%02x:%02x:%02x:%02x:%02x %s\\n\",\n\t\t\tpAd->EventTab.Num, pAddr[0], pAddr[1], pAddr[2], \n\t\t\tpAddr[3], pAddr[4], pAddr[5], pEventText[Event]));\n\t\tpAd->EventTab.Num += 1;\n\t}\n}\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tOperationg mode is as defined at 802.11n for how proteciton in this BSS operates. \n\t\tAp broadcast the operation mode at Additional HT Infroamtion Element Operating Mode fields.\n\t\t802.11n D1.0 might has bugs so this operating mode use  EWC MAC 1.24 definition first.\n\n\t\tCalled when receiving my bssid beacon or beaconAtJoin to update protection mode.\n\t\t40MHz or 20MHz protection mode in HT 40/20 capabale BSS.\n\t\tAs STA, this obeys the operation mode in ADDHT IE.\n\t\tAs AP, update protection when setting ADDHT IE and after new STA joined.\n\t==========================================================================\n*/\nVOID APUpdateOperationMode(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;\n\n\tif ((pAd->ApCfg.LastNoneHTOLBCDetectTime + (5 * OS_HZ)) > pAd->Mlme.Now32) /* non HT BSS exist within 5 sec */\n\t{\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 1;\n    \tAsicUpdateProtect(pAd, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE);\n\t}\n\n   \t/* If I am 40MHz BSS, and there exist HT-20MHz station. */\n\t/* Update to 2 when it's zero.  Because OperaionMode = 1 or 3 has more protection. */\n\tif ((pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode == 0) && (pAd->MacTab.fAnyStation20Only) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth == 1))\n\t{\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 2;\n\t\tAsicUpdateProtect(pAd, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, (ALLN_SETPROTECT), TRUE, pAd->MacTab.fAnyStationNonGF);\n\t}\n\t\t\n\tif (pAd->MacTab.fAnyStationIsLegacy)\n\t{\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 3;\n\t\tAsicUpdateProtect(pAd, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, (ALLN_SETPROTECT), TRUE, pAd->MacTab.fAnyStationNonGF);\n\t}\n\t\n\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = pAd->MacTab.fAnyStationNonGF;\n}\n#endif /* DOT11_N_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tUpdate ERP IE and CapabilityInfo based on STA association status.\n\t\tThe result will be auto updated into the next outgoing BEACON in next\n\t\tTBTT interrupt service routine\n\t==========================================================================\n */\nVOID APUpdateCapabilityAndErpIe(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR  i, ErpIeContent = 0;\n\tBOOLEAN ShortSlotCapable = pAd->CommonCfg.bUseShortSlotTime;\n\tUCHAR\tapidx;\n\tBOOLEAN\tbUseBGProtection;\n\tBOOLEAN\tLegacyBssExist;\n\n\n\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\treturn;\n\n\tfor (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (!IS_ENTRY_CLIENT(pEntry) || (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n\n\t\t/* at least one 11b client associated, turn on ERP.NonERPPresent bit */\n\t\t/* almost all 11b client won't support \"Short Slot\" time, turn off for maximum compatibility */\n\t\tif (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE)\n\t\t{\n\t\t\tShortSlotCapable = FALSE;\n\t\t\tErpIeContent |= 0x01;\n\t\t}\n\n\t\t/* at least one client can't support short slot */\n\t\tif ((pEntry->CapabilityInfo & 0x0400) == 0)\n\t\t\tShortSlotCapable = FALSE;\n\t}\n\n\t/* legacy BSS exist within 5 sec */\n\tif ((pAd->ApCfg.LastOLBCDetectTime + (5 * OS_HZ)) > pAd->Mlme.Now32) \n\t{\n\t\tLegacyBssExist = TRUE;\n\t}\n\telse\n\t{\n\t\tLegacyBssExist = FALSE;\n\t}\n\t\n\t/* decide ErpIR.UseProtection bit, depending on pAd->CommonCfg.UseBGProtection\n\t\tAUTO (0): UseProtection = 1 if any 11b STA associated\n\t\tON (1): always USE protection\n\t\tOFF (2): always NOT USE protection\n\t*/\n\tif (pAd->CommonCfg.UseBGProtection == 0)\n\t{\n\t\tErpIeContent = (ErpIeContent)? 0x03 : 0x00;\n\t\t/*if ((pAd->ApCfg.LastOLBCDetectTime + (5 * OS_HZ)) > pAd->Mlme.Now32) // legacy BSS exist within 5 sec */\n\t\tif (LegacyBssExist)\n\t\t{\n\t\t\tErpIeContent |= 0x02;                                     /* set Use_Protection bit */\n\t\t}\n\t}\n\telse if (pAd->CommonCfg.UseBGProtection == 1)   \n\t\tErpIeContent |= 0x02;\n\telse\n\t\t;\n\n\tbUseBGProtection = (pAd->CommonCfg.UseBGProtection == 1) ||    /* always use */\n\t\t\t\t\t\t((pAd->CommonCfg.UseBGProtection == 0) && ERP_IS_USE_PROTECTION(ErpIeContent));\n\n#ifdef A_BAND_SUPPORT\n\t/* always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP */\n\tif (pAd->CommonCfg.Channel > 14) \n\t\tbUseBGProtection = FALSE;\n#endif /* A_BAND_SUPPORT */\n\n\tif (bUseBGProtection != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t{\n\t\tUSHORT OperationMode = 0;\n\t\tBOOLEAN\tbNonGFExist = 0;\n\n#ifdef DOT11_N_SUPPORT\n\t\tOperationMode = pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode;\n\t\tbNonGFExist = pAd->MacTab.fAnyStationNonGF;\n#endif /* DOT11_N_SUPPORT */\n\t\tif (bUseBGProtection)\n\t\t{\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n\t\t\tAsicUpdateProtect(pAd, OperationMode, (OFDMSETPROTECT), FALSE, bNonGFExist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n\t\t\tAsicUpdateProtect(pAd, OperationMode, (OFDMSETPROTECT), TRUE, bNonGFExist);\n\t\t}\n\t}\n\n\t/* Decide Barker Preamble bit of ERP IE */\n\tif ((pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong) || (ApCheckLongPreambleSTA(pAd) == TRUE))\n\t\tpAd->ApCfg.ErpIeContent = (ErpIeContent | 0x04);\n\telse\n\t\tpAd->ApCfg.ErpIeContent = ErpIeContent;\n\n#ifdef A_BAND_SUPPORT\n\t/* Force to use ShortSlotTime at A-band */\n\tif (pAd->CommonCfg.Channel > 14)\n\t\tShortSlotCapable = TRUE;\n#endif /* A_BAND_SUPPORT */\n\t\n\t/* deicide CapabilityInfo.ShortSlotTime bit */\n    for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n    {\n\t\tUSHORT *pCapInfo = &(pAd->ApCfg.MBSSID[apidx].CapabilityInfo);\n\n\t\t/* In A-band, the ShortSlotTime bit should be ignored. */\n\t\tif (ShortSlotCapable \n#ifdef A_BAND_SUPPORT\n\t\t\t&& (pAd->CommonCfg.Channel <= 14)\n#endif /* A_BAND_SUPPORT */\n\t\t\t)\n    \t\t(*pCapInfo) |= 0x0400;\n\t\telse\n    \t\t(*pCapInfo) &= 0xfbff;\n\n\n   \t\tif (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong)\n\t\t\t(*pCapInfo) &= (~0x020);\n\t\telse\n\t\t\t(*pCapInfo) |= 0x020;\n\n\t}\n\n\tAsicSetSlotTime(pAd, ShortSlotCapable);\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n        Check to see the exist of long preamble STA in associated list\n    ==========================================================================\n */\nBOOLEAN ApCheckLongPreambleSTA(\n    IN PRTMP_ADAPTER pAd)\n{\n    UCHAR   i;\n    \n    for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n    {\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (!IS_ENTRY_CLIENT(pEntry) || (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n\t            \n        if (!CAP_IS_SHORT_PREAMBLE_ON(pEntry->CapabilityInfo))\n        {\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}    \n\n/*\n\t==========================================================================\n\tDescription:\n\t\tCheck if the specified STA pass the Access Control List checking.\n\t\tIf fails to pass the checking, then no authentication nor association \n\t\tis allowed\n\tReturn:\n\t\tMLME_SUCCESS - this STA passes ACL checking\n\n\t==========================================================================\n*/\nBOOLEAN ApCheckAccessControlList(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR        pAddr,\n\tIN UCHAR         Apidx)\n{\n\tBOOLEAN Result = TRUE;\n\n    if (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == 0)       /* ACL is disabled */\n        Result = TRUE;\n    else\n    {\n        ULONG i;\n        if (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == 1)   /* ACL is a positive list */\n            Result = FALSE;\n        else                                              /* ACL is a negative list */\n            Result = TRUE;\n        for (i=0; i<pAd->ApCfg.MBSSID[Apidx].AccessControlList.Num; i++)\n        {\n            if (MAC_ADDR_EQUAL(pAddr, pAd->ApCfg.MBSSID[Apidx].AccessControlList.Entry[i].Addr))\n            {\n                Result = !Result;\n                break;\n            }\n        }\n    }\n\n    if (Result == FALSE)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"%02x:%02x:%02x:%02x:%02x:%02x failed in ACL checking\\n\",\n        pAddr[0],pAddr[1],pAddr[2],pAddr[3],pAddr[4],pAddr[5]));\n    }\n\n    return Result;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine update the current MAC table based on the current ACL.\n\t\tIf ACL change causing an associated STA become un-authorized. This STA\n\t\twill be kicked out immediately.\n\t==========================================================================\n*/\nVOID ApUpdateAccessControlList(\n    IN PRTMP_ADAPTER pAd,\n    IN UCHAR         Apidx)\n{\n\tUSHORT   AclIdx, MacIdx;\n\tBOOLEAN  Matched;\n\n\tPUCHAR      pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG       FrameLen = 0;\n\tHEADER_802_11 DisassocHdr;\n\tUSHORT      Reason;\n\n\t\n\t/*Apidx = pObj->ioctl_if; */\n\tASSERT(Apidx < MAX_MBSSID_NUM(pAd));\n\tif (Apidx >= MAX_MBSSID_NUM(pAd))\n\t\treturn;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ApUpdateAccessControlList : Apidx = %d\\n\", Apidx));\n\t\n    /* ACL is disabled. Do nothing about the MAC table. */\n    if (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == 0)\n\t\treturn;\n\n\tfor (MacIdx=0; MacIdx < MAX_LEN_OF_MAC_TABLE; MacIdx++)\n\t{\n\t\tif (!IS_ENTRY_CLIENT(&pAd->MacTab.Content[MacIdx])) \n\t\t\tcontinue;\n\n\t\t/* We only need to update associations related to ACL of MBSSID[Apidx]. */\n\t\tif (pAd->MacTab.Content[MacIdx].apidx != Apidx) \n\t\t\tcontinue;\n    \n\t\tMatched = FALSE;\n\t\t for (AclIdx = 0; AclIdx < pAd->ApCfg.MBSSID[Apidx].AccessControlList.Num; AclIdx++)\n\t\t{\n\t\t\tif (MAC_ADDR_EQUAL(&pAd->MacTab.Content[MacIdx].Addr, pAd->ApCfg.MBSSID[Apidx].AccessControlList.Entry[AclIdx].Addr))\n\t\t\t{\n\t\t\t\tMatched = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ((Matched == FALSE) && (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == 1))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Apidx = %d\\n\", Apidx));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->ApCfg.MBSSID[%d].AccessControlList.Policy = %ld\\n\", Apidx,\n\t\t\t\tpAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"STA not on positive ACL. remove it...\\n\"));\n\t\t\t\n\t\t\t/* Before delete the entry from MacTable, send disassociation packet to client. */\n\t\t\tif (pAd->MacTab.Content[MacIdx].Sst == SST_ASSOC)\n\t\t\t{\n\t\t\t\t/*  send out a DISASSOC frame */\n\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tReason = REASON_DECLINED;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ASSOC - Send DISASSOC  Reason = %d frame  TO %x %x %x %x %x %x \\n\",Reason,pAd->MacTab.Content[MacIdx].Addr[0],\n\t\t\t\t\tpAd->MacTab.Content[MacIdx].Addr[1],pAd->MacTab.Content[MacIdx].Addr[2],pAd->MacTab.Content[MacIdx].Addr[3],pAd->MacTab.Content[MacIdx].Addr[4],pAd->MacTab.Content[MacIdx].Addr[5]));\n\t\t\t\tMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAd->MacTab.Content[MacIdx].Addr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pAd->MacTab.Content[MacIdx].apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pAd->MacTab.Content[MacIdx].apidx].Bssid);\n\t\t\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &DisassocHdr, 2, &Reason, END_OF_ARGS);\n\t\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\t\t\tRTMPusecDelay(5000);\n\t\t\t}\n\t\t\tMacTableDeleteEntry(pAd, pAd->MacTab.Content[MacIdx].Aid, pAd->MacTab.Content[MacIdx].Addr);\n\t\t}\n\t       else if ((Matched == TRUE) && (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == 2))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Apidx = %d\\n\", Apidx));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->ApCfg.MBSSID[%d].AccessControlList.Policy = %ld\\n\", Apidx,\n\t\t\t\tpAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"STA on negative ACL. remove it...\\n\"));\n\t\t\t\n\t\t\t/* Before delete the entry from MacTable, send disassociation packet to client. */\n\t\t\tif (pAd->MacTab.Content[MacIdx].Sst == SST_ASSOC)\n\t\t\t{\n\t\t\t\t/* send out a DISASSOC frame */\n\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tReason = REASON_DECLINED;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ASSOC - Send DISASSOC  Reason = %d frame  TO %x %x %x %x %x %x \\n\",Reason,pAd->MacTab.Content[MacIdx].Addr[0],\n\t\t\t\t\tpAd->MacTab.Content[MacIdx].Addr[1],pAd->MacTab.Content[MacIdx].Addr[2],pAd->MacTab.Content[MacIdx].Addr[3],pAd->MacTab.Content[MacIdx].Addr[4],pAd->MacTab.Content[MacIdx].Addr[5]));\n\t\t\t\tMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAd->MacTab.Content[MacIdx].Addr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pAd->MacTab.Content[MacIdx].apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pAd->MacTab.Content[MacIdx].apidx].Bssid);\n\t\t\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &DisassocHdr, 2, &Reason, END_OF_ARGS);\n\t\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\t\t\tRTMPusecDelay(5000);\n\t\t\t}\n\t\t\tMacTableDeleteEntry(pAd, pAd->MacTab.Content[MacIdx].Aid, pAd->MacTab.Content[MacIdx].Addr);\n\t\t}\n\t}\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tSend out a NULL frame to a specified STA at a higher TX rate. The \n\t\tpurpose is to ensure the designated client is okay to received at this\n\t\trate.\n\t==========================================================================\n */\nVOID ApEnqueueNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR        pAddr,\n\tIN UCHAR         TxRate,\n\tIN UCHAR         PID,\n\tIN UCHAR         apidx,\n    IN BOOLEAN       bQosNull,\n    IN BOOLEAN       bEOSP,\n    IN UCHAR         OldUP)\n{\n\tNDIS_STATUS    NState;\n\tPHEADER_802_11 pNullFr;\n\tPUCHAR pFrame;\n    ULONG\t\t   Length;\n\n\n\t/* since TxRate may change, we have to change Duration each time */\n\tNState = MlmeAllocateMemory(pAd, (PUCHAR *)&pFrame);\n\tpNullFr = (PHEADER_802_11) pFrame;\n    Length = sizeof(HEADER_802_11);\n\n\tif (NState == NDIS_STATUS_SUCCESS) \n\t{\n/*\t\tif ((PID & 0x3f) < WDS_PAIRWISE_KEY_OFFSET) // send to client */\n\t\t{\n\t\t\tMgtMacHeaderInit(pAd, pNullFr, SUBTYPE_NULL_FUNC, 0, pAddr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\tpNullFr->FC.Type = BTYPE_DATA;\n\t\t\tpNullFr->FC.FrDs = 1;\n\t\t\tpNullFr->Duration = RTMPCalcDuration(pAd, TxRate, 14);\n\n#ifdef UAPSD_SUPPORT\n            if (bQosNull)\n\t\t\t{\n                UCHAR *qos_p = ((UCHAR *)pNullFr) + Length;\n\n\t\t\t\tpNullFr->FC.SubType = SUBTYPE_QOS_NULL;\n\n\t\t\t\t/* copy QOS control bytes */\n\t\t\t\tqos_p[0] = ((bEOSP) ? (1 << 4) : 0) | OldUP;\n\t\t\t\tqos_p[1] = 0;\n\t\t\t\tLength += 2;\n\t\t\t} /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"send NULL Frame @%d Mbps to AID#%d...\\n\", RateIdToMbps[TxRate], PID & 0x3f));\n            MiniportMMRequest(pAd, MapUserPriorityToAccessCategory[7], (PUCHAR)pNullFr, Length);\n\t\t}\n\n\tMlmeFreeMemory(pAd, pFrame);\n\t}\n}\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n/*\n\tDepends on the 802.11n Draft 4.0, Before the HT AP start a BSS, it should scan some specific channels to\ncollect information of existing BSSs, then depens on the collected channel information, adjust the primary channel \nand secondary channel setting.\n\n\tFor 5GHz,\n\t\tRule 1: If the AP chooses to start a 20/40 MHz BSS in 5GHz and that occupies the same two channels\n\t\t\t\tas any existing 20/40 MHz BSSs, then the AP shall ensure that the primary channel of the \n\t\t\t\tnew BSS is identical to the primary channel of the existing 20/40 MHz BSSs and that the \n\t\t\t\tsecondary channel of the new 20/40 MHz BSS is identical to the secondary channel of the \n\t\t\t\texisting 20/40 MHz BSSs, unless the AP discoverr that on those two channels are existing\n\t\t\t\t20/40 MHz BSSs with different primary and secondary channels.\n\t\tRule 2: If the AP chooses to start a 20/40MHz BSS in 5GHz, the selected secondary channel should\n\t\t\t\tcorrespond to a channel on which no beacons are detected during the overlapping BSS\n\t\t\t\tscan time performed by the AP, unless there are beacons detected on both the selected\n\t\t\t\tprimary and secondary channels.\n\t\tRule 3: An HT AP should not start a 20 MHz BSS in 5GHz on a channel that is the secondary channel \n\t\t\t\tof a 20/40 MHz BSS.\n\tFor 2.4GHz,\n\t\tRule 1: The AP shall not start a 20/40 MHz BSS in 2.4GHz if the value of the local variable \"20/40\n\t\t\t\tOperation Permitted\" is FALSE.\n\n\t\t20/40OperationPermitted =  (P == OPi for all values of i) AND\n\t\t\t\t\t\t\t\t(P == OTi for all values of i) AND\n\t\t\t\t\t\t\t\t(S == OSi for all values if i)\n\t\twhere\n\t\t\tP \tis the operating or intended primary channel of the 20/40 MHz BSS\n\t\t\tS\tis the operating or intended secondary channel of the 20/40 MHz BSS\n\t\t\tOPi  is member i of the set of channels that are members of the channel set C and that are the\n\t\t\t\tprimary operating channel of at least one 20/40 MHz BSS that is detected within the AP's \n\t\t\t\tBSA during the previous X seconds\n\t\t\tOSi  is member i of the set of channels that are members of the channel set C and that are the\n\t\t\t\tsecondary operating channel of at least one 20/40 MHz BSS that is detected within AP's\n\t\t\t\tBSA during the previous X seconds\n\t\t\tOTi  is member i of the set of channels that comparises all channels that are members of the \n\t\t\t\tchannel set C that were listed once in the Channel List fields of 20/40 BSS Intolerant Channel\n\t\t\t\tReport elements receved during the previous X seconds and all channels that are members\n\t\t\t\tof the channel set C and that are the primary operating channel of at least one 20/40 MHz\n\t\t\t\tBSS that were detected within the AP's BSA during the previous X seconds.\n\t\t\tC\tis the set of all channels that are allowed operating channels within the current operational\n\t\t\t\tregulatory domain and whose center frequency falls within the 40 MHz affected channel \n\t\t\t\trange given by following equation:\n\t\t\t\t\t                                                 Fp + Fs                  Fp + Fs\n\t\t\t\t\t40MHz affected channel range = [ ------  - 25MHz,  ------- + 25MHz ]\n\t\t\t\t\t                                                      2                          2\n\t\t\t\t\tWhere \n\t\t\t\t\t\tFp = the center frequency of channel P\n\t\t\t\t\t\tFs = the center frequency of channel S\n\n\t\t\t\"==\" means that the values on either side of the \"==\" are to be tested for equaliy with a resulting \n\t\t\t\t Boolean value.\n\t\t\t        =>When the value of OPi is the empty set, then the expression (P == OPi for all values of i) \n\t\t\t        \tis defined to be TRUE\n\t\t\t        =>When the value of OTi is the empty set, then the expression (P == OTi for all values of i) \n\t\t\t        \tis defined to be TRUE\n\t\t\t        =>When the value of OSi is the empty set, then the expression (S == OSi for all values of i) \n\t\t\t        \tis defined to be TRUE\n*/\n\n\nINT GetBssCoexEffectedChRange(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BSS_COEX_CH_RANGE *pCoexChRange)\n{\n\tINT index, cntrCh = 0;\n\n\tmemset(pCoexChRange, 0, sizeof(BSS_COEX_CH_RANGE));\n\t\n\t/* Build the effected channel list, if something wrong, return directly. */\n#ifdef A_BAND_SUPPORT\n\tif (pAd->CommonCfg.Channel > 14)\n\t{\t/* For 5GHz band */\n\t\tfor (index = 0; index < pAd->ChannelListNum; index++)\n\t\t{\n\t\t\tif(pAd->ChannelList[index].Channel == pAd->CommonCfg.Channel)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (index < pAd->ChannelListNum)\n\t\t{\n\t\t\t/* First get the primary channel */\n\t\t\tpCoexChRange->primaryCh = pAd->ChannelList[index].Channel;\n\t\t\t\n\t\t\t/* Now check about the secondary and central channel */\n\t\t\tif(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t\t{\n\t\t\t\tpCoexChRange->effectChStart = pCoexChRange->primaryCh;\n\t\t\t\tpCoexChRange->effectChEnd = pCoexChRange->primaryCh + 4;\n\t\t\t\tpCoexChRange->secondaryCh = pCoexChRange->effectChEnd;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexChRange->effectChStart = pCoexChRange->primaryCh -4;\n\t\t\t\tpCoexChRange->effectChEnd = pCoexChRange->primaryCh;\n\t\t\t\tpCoexChRange->secondaryCh = pCoexChRange->effectChStart;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"5.0GHz: Found CtrlCh idx(%d) from the ChList, ExtCh=%s, PriCh=[Idx:%d, CH:%d], SecCh=[Idx:%d, CH:%d], effected Ch=[CH:%d~CH:%d]!\\n\", \n\t\t\t\t\t\t\t\t\t\tindex, \n\t\t\t\t\t\t\t\t\t\t((pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) ? \"ABOVE\" : \"BELOW\"), \n\t\t\t\t\t\t\t\t\t\tpCoexChRange->primaryCh, pAd->ChannelList[pCoexChRange->primaryCh].Channel, \n\t\t\t\t\t\t\t\t\t\tpCoexChRange->secondaryCh, pAd->ChannelList[pCoexChRange->secondaryCh].Channel,\n\t\t\t\t\t\t\t\t\t\tpAd->ChannelList[pCoexChRange->effectChStart].Channel,\n\t\t\t\t\t\t\t\t\t\tpAd->ChannelList[pCoexChRange->effectChEnd].Channel));\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* It should not happened! */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"5GHz: Cannot found the CtrlCh(%d) in ChList, something wrong?\\n\", \n\t\t\t\t\t\tpAd->CommonCfg.Channel));\n\t\t}\n\t}\n\telse\n#endif /* A_BAND_SUPPORT */\t\t\n\t{\t/* For 2.4GHz band */\n\t\tfor (index = 0; index < pAd->ChannelListNum; index++)\n\t\t{\n\t\t\tif(pAd->ChannelList[index].Channel == pAd->CommonCfg.Channel)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (index < pAd->ChannelListNum)\n\t\t{\n\t\t\t/* First get the primary channel */\n\t\t\tpCoexChRange->primaryCh = index;\n\t\t\t\n\t\t\t/* Now check about the secondary and central channel */\n\t\t\tif(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t\t{\n\t\t\t\tif ((index + 4) < pAd->ChannelListNum)\n\t\t\t\t{\n\t\t\t\t\tcntrCh = index + 2;\n\t\t\t\t\tpCoexChRange->secondaryCh = index + 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((index - 4) >=0)\n\t\t\t\t{\n\t\t\t\t\tcntrCh = index - 2;\n\t\t\t\t\tpCoexChRange->secondaryCh = index - 4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cntrCh)\n\t\t\t{\n\t\t\t\tpCoexChRange->effectChStart = (cntrCh - 5) > 0 ? (cntrCh - 5) : 0;\n\t\t\t\tpCoexChRange->effectChEnd= (cntrCh + 5) > 0 ? (cntrCh + 5) : 0;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"2.4GHz: Found CtrlCh idx(%d) from the ChList, ExtCh=%s, PrimaryCh=[Idx:%d, CH:%d], SecondaryCh=[Idx:%d, CH:%d], effected Ch=[CH:%d~CH:%d]!\\n\", \n\t\t\t\t\t\t\t\t\t\tindex, \n\t\t\t\t\t\t\t\t\t\t((pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) ? \"ABOVE\" : \"BELOW\"), \n\t\t\t\t\t\t\t\t\t\tpCoexChRange->primaryCh, pAd->ChannelList[pCoexChRange->primaryCh].Channel, \n\t\t\t\t\t\t\t\t\t\tpCoexChRange->secondaryCh, pAd->ChannelList[pCoexChRange->secondaryCh].Channel,\n\t\t\t\t\t\t\t\t\t\tpAd->ChannelList[pCoexChRange->effectChStart].Channel,\n\t\t\t\t\t\t\t\t\t\tpAd->ChannelList[pCoexChRange->effectChEnd].Channel));\n\t\t\t}\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t/* It should not happened! */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2.4GHz: Didn't found valid channel range, Ch index=%d, ChListNum=%d, CtrlCh=%d\\n\", \n\t\t\t\t\t\t\t\t\tindex, pAd->ChannelListNum, pAd->CommonCfg.Channel));\n\t}\n\n\treturn FALSE;\n}\n\n\nVOID APOverlappingBSSScan(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tBOOLEAN needFallBack = FALSE;\n\tUCHAR Channel = pAd->CommonCfg.Channel;\n\tINT chStartIdx, chEndIdx, index,curPriChIdx, curSecChIdx;\n\n\n\t/* We just care BSS who operating in 40MHz N Mode. */\n\tif ((!WMODE_CAP_N(pAd->CommonCfg.PhyMode)) || \n\t\t(pAd->CommonCfg.RegTransmitSetting.field.BW  == BW_20)\n\t\t|| (pAd->CommonCfg.Channel > 14)\n\t\t)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The pAd->PhyMode=%d, BW=%d, didn't need channel adjustment!\\n\", \n\t\t\t\tpAd->CommonCfg.PhyMode, pAd->CommonCfg.RegTransmitSetting.field.BW));\n\t\treturn;\n\t}\n\n\t/* Build the effected channel list, if something wrong, return directly. */\n#ifdef A_BAND_SUPPORT\n\tif (pAd->CommonCfg.Channel > 14)\n\t{\t/* For 5GHz band */\n\t\tfor (index = 0; index < pAd->ChannelListNum; index++)\n\t\t{\n\t\t\tif(pAd->ChannelList[index].Channel == pAd->CommonCfg.Channel)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (index < pAd->ChannelListNum)\n\t\t{\n\t\t\tcurPriChIdx = index;\n\t\t\tif(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t\t{\n\t\t\t\tchStartIdx = index;\n\t\t\t\tchEndIdx = chStartIdx + 1;\n\t\t\t\tcurSecChIdx = chEndIdx;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tchStartIdx = index - 1;\n\t\t\t\tchEndIdx = index;\n\t\t\t\tcurSecChIdx = chStartIdx;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* It should not happened! */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"5GHz: Cannot found the ControlChannel(%d) in ChannelList, something wrong?\\n\", \n\t\t\t\t\t\tpAd->CommonCfg.Channel));\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n#endif /* A_BAND_SUPPORT */\t\t\n\t{\t/* For 2.4GHz band */\n\t\tfor (index = 0; index < pAd->ChannelListNum; index++)\n\t\t{\n\t\t\tif(pAd->ChannelList[index].Channel == pAd->CommonCfg.Channel)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (index < pAd->ChannelListNum)\n\t\t{\n\n\t\t\tif(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t\t{\n\t\t\t\tcurPriChIdx = index;\n\t\t\t\tcurSecChIdx = ((index + 4) < pAd->ChannelListNum) ? (index + 4) : (pAd->ChannelListNum - 1);\n\t\t\t\t\n\t\t\t\tchStartIdx = (curPriChIdx >= 3) ? (curPriChIdx - 3) : 0;\n\t\t\t\tchEndIdx = ((curSecChIdx + 3) < pAd->ChannelListNum) ? (curSecChIdx + 3) : (pAd->ChannelListNum - 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurPriChIdx = index;\n\t\t\t\tcurSecChIdx = ((index - 4) >=0 ) ? (index - 4) : 0;\n\t\t\t\tchStartIdx =(curSecChIdx >= 3) ? (curSecChIdx - 3) : 0;\n\t\t\t\tchEndIdx =  ((curPriChIdx + 3) < pAd->ChannelListNum) ? (curPriChIdx + 3) : (pAd->ChannelListNum - 1);;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* It should not happened! */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2.4GHz: Cannot found the Control Channel(%d) in ChannelList, something wrong?\\n\", \n\t\t\t\t\t\tpAd->CommonCfg.Channel));\n\t\t\treturn;\n\t\t}\n\t}\n\n{\n\tBSS_COEX_CH_RANGE  coexChRange;\n\tGetBssCoexEffectedChRange(pAd, &coexChRange);\n}\n\n\t/* Before we do the scanning, clear the bEffectedChannel as zero for latter use. */\n\tfor (index = 0; index < pAd->ChannelListNum; index++)\n\t\tpAd->ChannelList[index].bEffectedChannel = 0;\n\t\n\tpAd->CommonCfg.BssCoexApCnt = 0;\t\n\t\t\n\t/* If we are not ready for Tx/Rx Pakcet, enable it now for receiving Beacons. */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP) == 0)\n\t{\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Card still not enable Tx/Rx, enable it now!\\n\"));\n\n#ifdef RTMP_MAC_USB\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);\n\n\t\t/*\n\t\t\tSupport multiple BulkIn IRP,\n\t\t\tthe value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.\n\t\t*/\n\t\tfor(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++)\n\t{\n\t\t\tRTUSBBulkReceive(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBulkReceive!\\n\" ));\n\t}\n#endif /* RTMP_MAC_USB */\n\n\t\t/* Now Enable RxTx */\n\t\tRTMPEnableRxTx(pAd);\n\n\t\t/* APRxDoneInterruptHandle API will check this flag to decide accept incoming packet or not. */\n\t\t/* Set the flag be ready to receive Beacon frame for autochannel select. */\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP);\n\t}\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ready to do passive scanning for Channel[%d] to Channel[%d]!\\n\", \n\t\t\tpAd->ChannelList[chStartIdx].Channel, pAd->ChannelList[chEndIdx].Channel));\n\t\n\t/* Now start to do the passive scanning. */\n\tpAd->CommonCfg.bOverlapScanning = TRUE;\n\tfor (index = chStartIdx; index<=chEndIdx; index++)\n\t{\n\t\tChannel = pAd->ChannelList[index].Channel;\n\n\t\tAsicSetChannel(pAd, Channel, BW_20,  EXTCHA_NONE, TRUE);\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"Passive scanning for Channel %d.....\\n\", Channel)); */\n\t\tOS_WAIT(300); /* wait for 200 ms at each channel. */\n\t}\n\tpAd->CommonCfg.bOverlapScanning = FALSE;\t\n\t\n\n\t/* After scan all relate channels, now check the scan result to find out if we need fallback to 20MHz. */\n\tfor (index = chStartIdx; index <= chEndIdx; index++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel[Idx=%d, Ch=%d].bEffectedChannel=0x%x!\\n\", \n\t\t\t\t\tindex, pAd->ChannelList[index].Channel, pAd->ChannelList[index].bEffectedChannel));\n\t\tif ((pAd->ChannelList[index].bEffectedChannel & (EFFECTED_CH_PRIMARY | EFFECTED_CH_LEGACY))  && (index != curPriChIdx) )\n\t\t{\n\t\t\tneedFallBack = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"needFallBack=TRUE due to OP/OT!\\n\"));\n\t\t}\n\t\tif ((pAd->ChannelList[index].bEffectedChannel & EFFECTED_CH_SECONDARY)  && (index != curSecChIdx))\n\t\t{\n\t\t\tneedFallBack = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"needFallBack=TRUE due to OS!\\n\"));\n\t\t}\n\t}\n\t\n\t/* If need fallback, now do it. */\n\tif ((needFallBack == TRUE)\n\t\t&& (pAd->CommonCfg.BssCoexApCnt > pAd->CommonCfg.BssCoexApCntThr)\n\t)\n\t{\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\n\t\tpAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq = 1;\n\t\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;\n\t}\n\n\treturn;\t\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\n/*\n ========================================================================\n Routine Description:\n    Send Leyer 2 Frame to notify 802.1x daemon. This is a internal command\n\n Arguments:\n\n Return Value:\n    TRUE - send successfully\n    FAIL - send fail\n\n Note:\n ========================================================================\n*/\nBOOLEAN DOT1X_InternalCmdAction(\n    IN  PRTMP_ADAPTER\tpAd,\n    IN  MAC_TABLE_ENTRY *pEntry,\n    IN\tUINT8\t\t\tcmd)\n{\n\tINT\t\t\t\tapidx = MAIN_MBSSID;\t\n\tUCHAR \t\t\tRalinkIe[9] = {221, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00};\n\tUCHAR\t\t\ts_addr[MAC_ADDR_LEN];\n\tUCHAR\t\t\tEAPOL_IE[] = {0x88, 0x8e};\n\tUINT8\t\t\tframe_len = LENGTH_802_3 + sizeof(RalinkIe);\n\tUCHAR\t\t\tFrameBuf[frame_len];\n\tUINT8\t\t\toffset = 0;\n\t\n\t/* Init the frame buffer */\n\tNdisZeroMemory(FrameBuf, frame_len);\n\t\n\tif (pEntry)\n\t{\n\t\tapidx = pEntry->apidx;\n\t\tNdisMoveMemory(s_addr, pEntry->Addr, MAC_ADDR_LEN);\n\t}\n\telse\n\t{\n\t\t/* Fake a Source Address for transmission */\n\t\tNdisMoveMemory(s_addr, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LENGTH);\n\t\ts_addr[0] |= 0x80;\n\t}\n\n\t/* Assign internal command for Ralink dot1x daemon */\n\tRalinkIe[5] = cmd;\n\n\t/* Prepare the 802.3 header */\n\tMAKE_802_3_HEADER(FrameBuf, \n\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].Bssid, \n\t\t\t\t\t  s_addr, \n\t\t\t\t\t  EAPOL_IE);\n\toffset += LENGTH_802_3;\n\t\t\n\t/* Prepare the specific header of internal command */\n\tNdisMoveMemory(&FrameBuf[offset], RalinkIe, sizeof(RalinkIe));\n\n\t/* Report to upper layer */\n\tif (RTMP_L2_FRAME_TX_ACTION(pAd, apidx, FrameBuf, frame_len) == FALSE)\n\t\treturn FALSE;\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s done. (cmd=%d)\\n\", __FUNCTION__, cmd));\n\n\treturn TRUE;\n}\n\n/*\n ========================================================================\n Routine Description:\n    Send Leyer 2 Frame to trigger 802.1x EAP state machine.\n\n Arguments:\n\n Return Value:\n    TRUE - send successfully\n    FAIL - send fail\n\n Note:\n ========================================================================\n*/\nBOOLEAN DOT1X_EapTriggerAction(\n    IN  PRTMP_ADAPTER\tpAd,\n    IN  MAC_TABLE_ENTRY *pEntry)\n{\n\tINT\t\t\t\tapidx = MAIN_MBSSID;\n\tUCHAR \t\t\teapol_start_1x_hdr[4] = {0x01, 0x01, 0x00, 0x00};\n\tUINT8\t\t\tframe_len = LENGTH_802_3 + sizeof(eapol_start_1x_hdr);\n\tUCHAR\t\t\tFrameBuf[frame_len];\n\tUINT8\t\t\toffset = 0;\n\n    if((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pAd->ApCfg.MBSSID[apidx].IEEE8021X == TRUE))\n\t{\n\t\t/* Init the frame buffer */\n\t\tNdisZeroMemory(FrameBuf, frame_len);\n\n\t\t/* Assign apidx */\n\t\tapidx = pEntry->apidx;\n\n\t\t/* Prepare the 802.3 header */\n\t\tMAKE_802_3_HEADER(FrameBuf, pAd->ApCfg.MBSSID[apidx].Bssid, pEntry->Addr, EAPOL);\n\t\toffset += LENGTH_802_3;\n\n\t\t/* Prepare a fake eapol-start body */\n\t\tNdisMoveMemory(&FrameBuf[offset], eapol_start_1x_hdr, sizeof(eapol_start_1x_hdr));\n\n\t\t/* Report to upper layer */\n\t\tif (RTMP_L2_FRAME_TX_ACTION(pAd, apidx, FrameBuf, frame_len) == FALSE)\n\t\t\treturn FALSE;\t\t\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Notify 8021.x daemon to trigger EAP-SM for this sta(%02x:%02x:%02x:%02x:%02x:%02x)\\n\", PRINT_MAC(pEntry->Addr)));\n\n\t}\n\n\treturn TRUE;\n}\n\n#endif /* DOT1X_SUPPORT */\n\n"
  },
  {
    "path": "src/ap/ap_apcli_inf.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    ap_apcli.c\n\n    Abstract:\n    Support AP-Client function.\n\n    Note:\n    1. Call RT28xx_ApCli_Init() in init function and\n       call RT28xx_ApCli_Remove() in close function\n\n    2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init()\n\n    3. ApCli index (0) of different rx packet is got in\n       APHandleRxDoneInterrupt() by using FromWhichBSSID = pEntry->apidx;\n       Or FromWhichBSSID = BSS0;\n\n    4. ApCli index (0) of different tx packet is assigned in\n       MBSS_VirtualIF_PacketSend() by using RTMP_SET_PACKET_NET_DEVICE_MBSSID()\n    5. ApCli index (0) of different interface is got in APHardTransmit() by using\n       RTMP_GET_PACKET_IF()\n\n    6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if\n\n    8. The number of ApCli only can be 1\n\n\t9. apcli convert engine subroutines, we should just take care data packet.\n    Revision History:\n    Who             When            What\n    --------------  ----------      ----------------------------------------------\n    Shiang, Fonchi  02-13-2007      created\n*/\n#define RTMP_MODULE_OS\n\n#ifdef APCLI_SUPPORT\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n\n/*\n========================================================================\nRoutine Description:\n    Init AP-Client function.\n\nArguments:\n    pAd            points to our adapter\n    main_dev_p      points to the main BSS network interface\n\nReturn Value:\n    None\n\nNote:\n\t1. Only create and initialize virtual network interfaces.\n\t2. No main network interface here.\n========================================================================\n*/\nVOID RT28xx_ApCli_Init(\n\tIN VOID \t\t\t\t*pAd,\n\tIN PNET_DEV\t\t\t\tmain_dev_p)\n{\n\n\tRTMP_OS_NETDEV_OP_HOOK\tnetDevOpHook;\n\n\t/* init operation functions */\n\tNdisZeroMemory(&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));\n\tnetDevOpHook.open = ApCli_VirtualIF_Open;\n\tnetDevOpHook.stop = ApCli_VirtualIF_Close;\n\tnetDevOpHook.xmit = ApCli_VirtualIF_PacketSend;\n\tnetDevOpHook.ioctl = ApCli_VirtualIF_Ioctl;\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_INIT,\n\t\t\t\t\t\t0, &netDevOpHook, 0);\n}\n\n/*\n========================================================================\nRoutine Description:\n    Open a virtual network interface.\n\nArguments:\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: open successfully\n    otherwise: open fail\n\nNote:\n========================================================================\n*/\nINT ApCli_VirtualIF_Open(\n\tIN PNET_DEV\t\tdev_p)\n{\n/*\tUCHAR ifIndex; */\n\tVOID *pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===> %s\\n\", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));\n\n\tif (VIRTUAL_IF_UP(pAd) != 0)\n\t\treturn -1;\n\n\t/* increase MODULE use count */\n\tRT_MOD_INC_USE_COUNT();\n\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_OPEN, 0, dev_p, 0);\n\n\treturn 0;\n} /* End of ApCli_VirtualIF_Open */\n\n\n/*\n========================================================================\nRoutine Description:\n    Close a virtual network interface.\n\nArguments:\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: close successfully\n    otherwise: close fail\n\nNote:\n========================================================================\n*/\nINT ApCli_VirtualIF_Close(\n\tIN\tPNET_DEV\tdev_p)\n{\n/*\tUCHAR ifIndex; */\n\tVOID *pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===> %s\\n\", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));\n\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_CLOSE, 0, dev_p, 0);\n\n\tVIRTUAL_IF_DOWN(pAd);\n\n\tRT_MOD_DEC_USE_COUNT();\n\n\treturn 0;\n} /* End of ApCli_VirtualIF_Close */\n\n\n/*\n========================================================================\nRoutine Description:\n    Send a packet to WLAN.\n\nArguments:\n    skb_p           points to our adapter\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: transmit successfully\n    otherwise: transmit fail\n\nNote:\n========================================================================\n*/\nINT ApCli_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET \tpPktSrc, \n\tIN PNET_DEV\t\t\tpDev)\n{\n\n\tMEM_DBG_PKT_ALLOC_INC(pPktSrc);\n\n\tif(!(RTMP_OS_NETDEV_STATE_RUNNING(pDev)))\n\t{\n\t\t/* the interface is down */\n\t\tRELEASE_NDIS_PACKET(NULL, pPktSrc, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t} /* End of if */\n\n\treturn APC_PacketSend(pPktSrc, pDev, rt28xx_packet_xmit);\n} /* End of ApCli_VirtualIF_PacketSend */\n\n\n/*\n========================================================================\nRoutine Description:\n    IOCTL to WLAN.\n\nArguments:\n    dev_p           which WLAN network interface\n    rq_p            command information\n    cmd             command ID\n\nReturn Value:\n    0: IOCTL successfully\n    otherwise: IOCTL fail\n\nNote:\n    SIOCETHTOOL     8946    New drivers use this ETHTOOL interface to\n                            report link failure activity.\n========================================================================\n*/\nINT ApCli_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tdev_p, \n\tIN OUT VOID \t\t\t*rq_p, \n\tIN INT \t\t\t\t\tcmd)\n{\n\tVOID *pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n/*\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t\treturn -ENETDOWN;\n\n\t/* do real IOCTL */\n\treturn (rt28xx_ioctl(dev_p, rq_p, cmd));\n} /* End of ApCli_VirtualIF_Ioctl */\n\n\n/*\n========================================================================\nRoutine Description:\n    Remove ApCli-BSS network interface.\n\nArguments:\n    pAd            points to our adapter\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID RT28xx_ApCli_Remove(\n\tIN VOID *pAd)\n{\n/*\tUINT index; */\n\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_REMOVE, 0, NULL, 0);\n\n\n}\n\n#endif /* APCLI_SUPPORT */\n"
  },
  {
    "path": "src/ap/ap_assoc.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    assoc.c\n \n    Abstract:\n    Handle association related requests either from WSTA or from local MLME\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    John Chang  08-04-2003    created for 11g soft-AP\n */\n\n#include \"rt_config.h\"\n\n\nstatic void ap_assoc_info_debugshow(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BOOLEAN isReassoc,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN IE_LISTS *ie_list)\n{\n#ifdef DBG\n\tPUCHAR\tsAssoc = isReassoc ? (PUCHAR)\"ReASSOC\" : (PUCHAR)\"ASSOC\";\n#endif /* DBG */\n\tMULTISSID_STRUCT *wdev;\n\n\n\twdev = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - \\n\\tAssign AID=%d to STA %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tsAssoc, pEntry->Aid, PRINT_MAC(pEntry->Addr)));\n\n#ifdef DOT11_N_SUPPORT\n\tif (ie_list->ht_cap_len && WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tassoc_ht_info_debugshow(pAd, pEntry, ie_list->ht_cap_len, &ie_list->HTCapability);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n%s - Update AP OperaionMode=%d , fAnyStationIsLegacy=%d, fAnyStation20Only=%d, fAnyStationNonGF=%d\\n\\n\",\n\t\t\t\t\tsAssoc, \n\t\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, \n\t\t\t\t\tpAd->MacTab.fAnyStationIsLegacy,\n\t\t\t\t\tpAd->MacTab.fAnyStation20Only, \n\t\t\t\t\tpAd->MacTab.fAnyStationNonGF));\n\n#ifdef DOT11N_DRAFT3\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tExt Cap Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tBss2040CoexistMgmt=%d\\n\", pEntry->BSS2040CoexistenceMgmtSupport));\n#endif /* DOT11N_DRAFT3 */\n#ifdef DOT11_VHT_AC\n\t\tif ((ie_list->vht_cap_len) &&\n\t\t\tWMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\t\t(pAd->CommonCfg.Channel > 14))\n\t\t{\n\t\t\tassoc_vht_info_debugshow(pAd, pEntry, &ie_list->vht_cap, NULL);\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - legacy STA\\n\", sAssoc));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n%s - MODE=%d, MCS=%d\\n\", sAssoc,\n\t\t\t\t\t\t\t\tpEntry->HTPhyMode.field.MODE, pEntry->HTPhyMode.field.MCS));\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tAuthMode=%d, WepStatus=%d, WpaState=%d, GroupKeyWepStatus=%d\\n\",\n\t\tpEntry->AuthMode, pEntry->WepStatus, pEntry->WpaState, wdev->GroupKeyWepStatus));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tWMMCap=%d, RalinkAgg=%d, PiggyBack=%d, RDG=%d, TxAMSDU=%d, IdleTimeout=%d\\n\",\n\t\tCLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE),\n\t\tCLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE),\n\t\tCLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE),\n\t\tCLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE),\n\t\tCLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED),\n\t\tpEntry->StaIdleTimeout));\n\n}\n\n\nstatic USHORT update_associated_mac_entry(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN IE_LISTS *ie_list,\n\tIN UCHAR MaxSupportedRate)\n{\n\tMULTISSID_STRUCT *wdev;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN\t supportsETxBF = FALSE;\n#endif // TXBF_SUPPORT //\n\n\n\twdev = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\n\t/* Update auth, wep, legacy transmit rate setting . */\n\tpEntry->Sst = SST_ASSOC;\n\n\tpEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate);\n\t\n\tset_entry_phy_cfg(pAd, pEntry);\n\n\tpEntry->CapabilityInfo = ie_list->CapabilityInfo;\n\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t{\n\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\tpEntry->WpaState = AS_INITPSK;\n\t}\n#ifdef DOT1X_SUPPORT\n\telse if ((pEntry->AuthMode == Ndis802_11AuthModeWPA) ||\n\t\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t\t(wdev->IEEE8021X == TRUE))\n\t{\n\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\tpEntry->WpaState = AS_AUTHENTICATION;\n\t}\n#endif /* DOT1X_SUPPORT */\n#ifdef WAPI_SUPPORT\n\telse if ((pEntry->AuthMode == Ndis802_11AuthModeWAICERT) || \n\t\t\t (pEntry->AuthMode == Ndis802_11AuthModeWAIPSK))\n\t{\n\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\tpEntry->WpaState = AS_AUTHENTICATION2;\n\t}\n#endif /* WAPI_SUPPORT */\n    \n\t/*if (ClientRalinkIe & 0x00000004) */\n\tif (ie_list->RalinkIe != 0x0)\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET);\n\telse\n\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET);\n\t\n\n\t/* Ralink proprietary Piggyback and Aggregation support for legacy RT61 chip */\n\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE);\n#ifdef AGGREGATION_SUPPORT\n\tif ((pAd->CommonCfg.bAggregationCapable) && (ie_list->RalinkIe & 0x00000001))\n\t{\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC -RaAggregate= 1\\n\"));\n\t}\n#endif /* AGGREGATION_SUPPORT */\n#ifdef PIGGYBACK_SUPPORT\n\tif ((pAd->CommonCfg.bPiggyBackCapable) && (ie_list->RalinkIe & 0x00000002))\n\t{\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC -PiggyBack= 1\\n\"));\n\t}\n#endif /* PIGGYBACK_SUPPORT */\n\n\t/* In WPA or 802.1x mode, the port is not secured, otherwise is secued. */\n\tif ((pEntry->AuthMode >= Ndis802_11AuthModeWPA) \n#ifdef DOT1X_SUPPORT\n\t\t|| (wdev->IEEE8021X == TRUE)\n#endif /* DOT1X_SUPPORT */\n\t)\n\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\telse\n\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\n#ifdef SOFT_ENCRYPT\n\t/* There are some situation to need to encryption by software \t\t\t   \t\n\t   1. The Client support PMF. It shall ony support AES cipher.\n\t   2. The Client support WAPI.\n\t   If use RT3883 or later, HW can handle the above.\t\n\t   */\n#ifdef WAPI_SUPPORT\n\tif (!(IS_HW_WAPI_SUPPORT(pAd)) \n\t\t&& (pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled))\n\t{\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT);\n\t}\n#endif /* WAPI_SUPPORT */\n\n#endif /* SOFT_ENCRYPT */\n\n#ifdef DOT11_N_SUPPORT\n\t/* \t\n\t\tWFA recommend to restrict the encryption type in 11n-HT mode.\n\t \tSo, the WEP and TKIP are not allowed in HT rate.\n\t*/\n\tif (pAd->CommonCfg.HT_DisallowTKIP &&\n\t\tIS_INVALID_HT_SECURITY(pEntry->WepStatus))\n\t{\n\t\t/* Force to None-HT mode due to WiFi 11n policy */\n\t\tie_list->ht_cap_len = 0;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : Force the STA as Non-HT mode\\n\", __FUNCTION__));\n\t}\n\n\t/* If this Entry supports 802.11n, upgrade to HT rate. */\n\tif ((ie_list->ht_cap_len != 0) && \n\t\t(wdev->DesiredHtPhyInfo.bHtEnable) &&\n\t\tWMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tht_mode_adjust(pAd, pEntry, &ie_list->HTCapability, &pAd->CommonCfg.DesiredHtPhy);\n\n#ifdef DOT11N_DRAFT3\n\t\tif (ie_list->ExtCapInfo.BssCoexistMgmtSupport)\n\t\t\tpEntry->BSS2040CoexistenceMgmtSupport = 1;\n#endif /* DOT11N_DRAFT3 */\n\n\n\t\t/* 40Mhz BSS Width Trigger events */\n\t\tif (ie_list->HTCapability.HtCapInfo.Forty_Mhz_Intolerant)\n\t\t{\n#ifdef DOT11N_DRAFT3\n\t\t\tpEntry->bForty_Mhz_Intolerant = TRUE;\n\t\t\tpAd->MacTab.fAnyStaFortyIntolerant = TRUE;\n\t\t\tif(((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && \n\t\t\t\t(pAd->CommonCfg.Channel <=14)) &&\n\t\t\t    ((pAd->CommonCfg.bBssCoexEnable == TRUE) &&\n\t\t\t\t(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0) && \n\t\t\t\t(pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0))\n\t\t\t)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq = 1;\n\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\n\t\t\t\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pEntry set 40MHz Intolerant as 1\\n\"));\n#endif /* DOT11N_DRAFT3 */\n\t\t\tHandle_BSS_Width_Trigger_Events(pAd);\n\t\t}\n\t\t\n#ifdef TXBF_SUPPORT\n\t\tsupportsETxBF = clientSupportsETxBF(pAd, &ie_list->HtCapability.TxBFCap);\n#endif /* TXBF_SUPPORT */\n\n\t\t/* find max fixed rate */\n\t\tpEntry->MaxHTPhyMode.field.MCS = get_ht_max_mcs(pAd, &wdev->DesiredHtPhyInfo.MCSSet[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->HTCapability.MCSSet[0]);\n\t\t \n\t\tif (wdev->DesiredTransmitSetting.field.MCS != MCS_AUTO)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"@@@ IF-ra%d DesiredTransmitSetting.field.MCS = %d\\n\",\n\t\t\t\t\t\t\t\tpEntry->apidx,\n\t\t\t\t\t\t\t\twdev->DesiredTransmitSetting.field.MCS));\n\n\t\t\tset_ht_fixed_mcs(pAd, pEntry, wdev->DesiredTransmitSetting.field.MCS, wdev->HTPhyMode.field.MCS);\n\t\t}\n\n\t\tpEntry->MaxHTPhyMode.field.STBC = (ie_list->HTCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\t// TODO: shiang-6590, check if this is necessary here, perforce didn't have this\n\t\tif (ie_list->HTCapability.HtCapParm.MpduDensity < 5)\n\t\t\tie_list->HTCapability.HtCapParm.MpduDensity = 5;\n\n\t\tpEntry->MpduDensity = ie_list->HTCapability.HtCapParm.MpduDensity;\n\t\tpEntry->MaxRAmpduFactor = ie_list->HTCapability.HtCapParm.MaxRAmpduFactor;\n\t\tpEntry->MmpsMode = (UCHAR)ie_list->HTCapability.HtCapInfo.MimoPs;\n\t\tpEntry->AMsduSize = (UCHAR)ie_list->HTCapability.HtCapInfo.AMsduSize;\n\n\t\tif (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE))\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED);\n\t\tif (ie_list->HTCapability.HtCapInfo.ShortGIfor20)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\tif (ie_list->HTCapability.HtCapInfo.ShortGIfor40)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\tif (ie_list->HTCapability.HtCapInfo.TxSTBC)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\tif (ie_list->HTCapability.HtCapInfo.RxSTBC)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\tif (ie_list->HTCapability.ExtHtCapInfo.PlusHTC)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\tif (pAd->CommonCfg.bRdg && ie_list->HTCapability.ExtHtCapInfo.RDGSupport)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\t\tif (ie_list->HTCapability.ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\n\n\t\t/* Record the received capability from association request */\n\t\tNdisMoveMemory(&pEntry->HTCapability, &ie_list->HTCapability, sizeof(HT_CAPABILITY_IE));\n\n#ifdef DOT11_VHT_AC\n\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t(pAd->CommonCfg.Channel > 14) &&\n\t\t\tie_list->vht_cap_len)\n\t\t{\n\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_VHT;\n\t\t\tif ((pEntry->MaxHTPhyMode.field.BW== BW_40) && (wdev->DesiredHtPhyInfo.vht_bw))\n\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_80;\n\n\t\t\tNdisMoveMemory(&pEntry->vht_cap_ie, &ie_list->vht_cap, sizeof(VHT_CAP_IE));\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t}\n\telse\n\t{\n\t\tpAd->MacTab.fAnyStationIsLegacy = TRUE;\n\t\tNdisZeroMemory(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE));\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\n#ifdef MFB_SUPPORT\n\tpEntry->lastLegalMfb = 0;\n\tpEntry->isMfbChanged = FALSE;\n\tpEntry->fLastChangeAccordingMfb = FALSE;\n\n\tpEntry->toTxMrq = TRUE;\n\tpEntry->msiToTx = 0;/*has to increment whenever a mrq is sent */\n\tpEntry->mrqCnt = 0;\n\n\tpEntry->pendingMfsi = 0;\n\n\tpEntry->toTxMfb = FALSE;\n\tpEntry->mfbToTx = 0;\n\tpEntry->mfb0 = 0;\n\tpEntry->mfb1 = 0;\n#endif\t/* MFB_SUPPORT */\n\n\tpEntry->freqOffsetValid = FALSE;\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\tTxBFInit(pAd, pEntry, supportsETxBF);\n#endif // TXBF_SUPPORT //\n\n\t// Initialize Rate Adaptation\n\tMlmeRAInit(pAd, pEntry);\n\n\t/* Set asic auto fall back */\n\tif (wdev->bAutoTxRateSwitch == TRUE)\n\t{\n\t\tUCHAR TableSize = 0;\n\t\t\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pEntry->pTable, &TableSize, &pEntry->CurrTxRateIndex);\n\t\tMlmeNewTxRate(pAd, pEntry);\n\n\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\tif (! ADAPT_RATE_TABLE(pEntry->pTable))\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\tpEntry->HTPhyMode.field.ShortGI = GI_800;\n\t}\n\telse\n\t{\n\t\tpEntry->HTPhyMode.field.MCS = wdev->HTPhyMode.field.MCS;\n\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\t\t\n\t\t/* If the legacy mode is set, overwrite the transmit setting of this entry. */\n\t\tRTMPUpdateLegacyTxSetting((UCHAR)wdev->DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t}\n\n\n\tif (pEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\tApLogEvent(pAd, pEntry->Addr, EVENT_ASSOCIATED);\n\n\tAPUpdateCapabilityAndErpIe(pAd);\n#ifdef DOT11_N_SUPPORT\n\tAPUpdateOperationMode(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\tpEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;\n\n#ifdef HOSTAPD_SUPPORT\n\tif((wdev->Hostapd == TRUE) &&\n\t    ((wdev->AuthMode >= Ndis802_11AuthModeWPA) || wdev->IEEE8021X))\n\t{\n\t\tRtmpOSWrielessEventSendExt(pAd->net_dev, RT_WLAN_EVENT_EXPIRED,\n\t\t\t\t\t-1, pEntry->Addr, NULL, 0,\n\t\t\t\t\t((pEntry->CapabilityInfo & 0x0010) == 0 ? 0xFFFD : 0xFFFC));\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\treturn MLME_SUCCESS;\n}\n\n\n/*\n    ==========================================================================\n    Description:\n       assign a new AID to the newly associated/re-associated STA and\n       decide its MaxSupportedRate and CurrTxRate. Both rates should not\n       exceed AP's capapbility\n    Return:\n       MLME_SUCCESS - association successfully built\n       others - association failed due to resource issue\n    ==========================================================================\n */\nstatic USHORT APBuildAssociation(\n    IN RTMP_ADAPTER *pAd,\n    IN MAC_TABLE_ENTRY *pEntry,\n    IN IE_LISTS *ie_list,\n    IN UCHAR MaxSupportedRateIn500Kbps,\n    OUT USHORT *pAid)\n{\n\tUSHORT StatusCode = MLME_SUCCESS;\n\tUCHAR MaxSupportedRate = RATE_11;\n\tMULTISSID_STRUCT *wdev;\n\n\n\tMaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps);\n\n    if ((WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_G) \n#ifdef DOT11_N_SUPPORT\n\t\t|| WMODE_EQUAL(pAd->CommonCfg.PhyMode, (WMODE_G | WMODE_GN))\n#endif /* DOT11_N_SUPPORT */\n\t\t) \n\t\t&& (MaxSupportedRate < RATE_FIRST_OFDM_RATE)\n\t)\n\t\treturn MLME_ASSOC_REJ_DATA_RATE;\n\n#ifdef DOT11_N_SUPPORT\n\t/* 11n only */\n\tif (WMODE_HT_ONLY(pAd->CommonCfg.PhyMode)&& (ie_list->ht_cap_len == 0))\n\t\treturn MLME_ASSOC_REJ_DATA_RATE;\n#endif /* DOT11_N_SUPPORT */\n\n\tif (!pEntry)\n\t\treturn MLME_UNSPECIFY_FAIL;\n\n\tif (pEntry && ((pEntry->Sst == SST_AUTH) || (pEntry->Sst == SST_ASSOC)))\n\t{\n\t\t/* TODO: */\n\t\t/* should qualify other parameters, for example - capablity, supported rates, listen interval, ... etc */\n\t\t/* to decide the Status Code */\n\t\t/**pAid = APAssignAid(pAd, pEntry); */\n\t\t/*pEntry->Aid = *pAid; */\n\t\t*pAid = pEntry->Aid;\n\t\tpEntry->NoDataIdleCount = 0;\n\t\tpEntry->StaConnectTime = 0;\n        \n#ifdef WSC_AP_SUPPORT\n\t\tif (pEntry->bWscCapable == FALSE)\n#endif /* WSC_AP_SUPPORT */\n\t\t{\n\t\t\t/* check the validity of the received RSNIE */\n\t\t\tif ((StatusCode = APValidateRSNIE(pAd, pEntry, &ie_list->RSN_IE[0], ie_list->RSNIE_Len)) != MLME_SUCCESS)\n\t\t\t\treturn StatusCode;\n\t\t}\n\n\t\tNdisMoveMemory(pEntry->RSN_IE, &ie_list->RSN_IE[0], ie_list->RSNIE_Len);\n\t\tpEntry->RSNIE_Len = ie_list->RSNIE_Len;\n\n\n\t\twdev = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\t\tif (*pAid == 0)\n\t\t\tStatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA;\n\t\telse if ((pEntry->RSNIE_Len == 0) &&\n\t\t\t\t(wdev->AuthMode >= Ndis802_11AuthModeWPA) \n#ifdef HOSTAPD_SUPPORT\n\t\t\t\t&& (wdev->Hostapd == TRUE)\n#endif\n\t\t)\n\t\t{\n#ifdef WSC_AP_SUPPORT\n\t            if (((wdev->WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t\tpEntry->bWscCapable\n#ifdef WSC_V2_SUPPORT\n\t                && (wdev->WscControl.WscV2Info.bWpsEnable || \n\t                \t(wdev->WscControl.WscV2Info.bEnableWpsV2 == FALSE))\n#endif /* WSC_V2_SUPPORT */\n\t                )\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\t\t|| wdev->Hostapd == TRUE\n#endif /*HOSTAPD_SUPPORT*/\n\t                )\n\t            {\n\t                pEntry->Sst = SST_ASSOC;\n\t                StatusCode = MLME_SUCCESS;\n\t                /* In WPA or 802.1x mode, the port is not secured. */\n\t    \t\t\tif ((pEntry->AuthMode >= Ndis802_11AuthModeWPA) \n#ifdef DOT1X_SUPPORT\n\t\t\t\t\t|| (wdev->IEEE8021X == TRUE)\n#endif /* DOT1X_SUPPORT */\t\t\t\t\t\n\t\t\t\t)\n\t    \t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t    \t\t\telse\n\t    \t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\n\t\t\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t    \t\t\t{\n\t    \t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t    \t\t\t\tpEntry->WpaState = AS_INITPSK;\n\t    \t\t\t}\n#ifdef DOT1X_SUPPORT\t\t\t\t\n\t    \t\t\telse if ((pEntry->AuthMode == Ndis802_11AuthModeWPA) ||\n\t\t\t\t\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t\t\t\t\t(wdev->IEEE8021X == TRUE))\n\t    \t\t\t{\n\t    \t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t    \t\t\t\tpEntry->WpaState = AS_AUTHENTICATION;\n\t    \t\t\t}\n#endif /* DOT1X_SUPPORT */\t\t\t\t\t\n\t            }\n\t            else\n\t            {\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - WSC_STATE_MACHINE is OFF.<WscConfMode = %d, apidx =%d>\\n\",\n\t                                         wdev->WscControl.WscConfMode,\n\t                                         pEntry->apidx));\n\t                StatusCode = MLME_ASSOC_DENY_OUT_SCOPE;\n\t            }\n#else  /* WSC_AP_SUPPORT */\n\t\t\tStatusCode = MLME_ASSOC_DENY_OUT_SCOPE;\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n\t\t\tif(wdev->Hostapd == TRUE\n\t\t\t\t&& (wdev->AuthMode >= Ndis802_11AuthModeWPA \n\t\t\t\t|| wdev->IEEE8021X))\n\t\t\t{\n\n\t\t\t\tRtmpOSWrielessEventSendExt(pAd->net_dev, RT_WLAN_EVENT_EXPIRED,\n\t\t\t\t\t\t-1, pEntry->Addr, NULL, 0,\n\t\t\t\t\t\t((pEntry->CapabilityInfo & 0x0010) == 0 ? 0xFFFD : 0xFFFC));\n\t\t\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatusCode = update_associated_mac_entry(pAd, pEntry, ie_list, MaxSupportedRate);\n\t\t}\n\t}\n\telse /* CLASS 3 error should have been handled beforehand; here should be MAC table full */\n\t\tStatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA;\n\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\tif (ie_list->bWmmCapable)\n\t\t{\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t}\n\t}\n\n    return StatusCode;\n}\n\n\n#ifdef IAPP_SUPPORT\n/*\n ========================================================================\n Routine Description:\n    Send Leyer 2 Update Frame to update forwarding table in Layer 2 devices.\n\n Arguments:\n    *mac_p - the STATION MAC address pointer\n\n Return Value:\n    TRUE - send successfully\n    FAIL - send fail\n\n Note:\n ========================================================================\n*/\nstatic BOOLEAN IAPP_L2_Update_Frame_Send(\n\tIN PRTMP_ADAPTER\tpAd,\n    IN UINT8 *mac_p,\n    IN INT  bssid)\n{\n\n\tNDIS_PACKET\t*pNetBuf;\n\n\tpNetBuf = RtmpOsPktIappMakeUp(get_netdev_from_bssid(pAd, bssid), mac_p);\n\tif (pNetBuf == NULL)\n\t\treturn FALSE;\n\n    /* UCOS: update the built-in bridge, too (don't use gmac.xmit()) */\n    announce_802_3_packet(pAd, pNetBuf, OPMODE_AP);\n\n\tIAPP_L2_UpdatePostCtrl(pAd, mac_p, bssid);\n\n    return TRUE;\n} /* End of IAPP_L2_Update_Frame_Send */\n#endif /* IAPP_SUPPORT */\n\n\nVOID ap_cmm_peer_assoc_req_action(\n    IN PRTMP_ADAPTER pAd,\n    IN MLME_QUEUE_ELEM *Elem,\n\tIN BOOLEAN isReassoc)\n{\n\tIE_LISTS *ie_list = NULL;\n\tHEADER_802_11 AssocRspHdr;\n\tUSHORT CapabilityInfoForAssocResp;\n\tUSHORT StatusCode = MLME_SUCCESS;\n\tUSHORT Aid;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tUCHAR MaxSupportedRate = 0;\n\tUCHAR SupRateLen, PhyMode, FlgIs11bSta;\n\tUCHAR i;\n\tMAC_TABLE_ENTRY *pEntry;\n#ifdef DBG\n\tUCHAR *sAssoc = isReassoc ? (PUCHAR)\"ReASSOC\" : (PUCHAR)\"ASSOC\";\n#endif /* DBG */\n\tUCHAR SubType;\n\tBOOLEAN bACLReject = FALSE;\n#ifdef DOT1X_SUPPORT\n\tPUINT8 pPmkid = NULL;\n\tUINT8 pmkid_count = 0;\n#endif /* DOT1X_SUPPORT */\t\n\tMULTISSID_STRUCT *wdev;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(IE_LISTS));\n\tif (ie_list == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): mem alloc failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisZeroMemory(ie_list, sizeof(IE_LISTS));\n\n\tif (!PeerAssocReqCmmSanity(pAd, isReassoc, Elem->Msg, Elem->MsgLen, ie_list))\n\t\tgoto LabelOK;\n\n\t/* check if AP address is same as us */\n\t/* TODO */\n\t/* goto label_err; */\n\n\tpEntry = MacTableLookup(pAd, ie_list->Addr2);\n\tif (!pEntry) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NoAuth MAC - %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tPRINT_MAC(ie_list->Addr2)));\n\t\tgoto LabelOK;\n\t}\n\t\n\tif (!VALID_MBSS(pAd, pEntry->apidx)) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():pEntry bounding invalid wdev(apidx=%d)\\n\",\n\t\t\t\t\t__FUNCTION__, pEntry->apidx));\n\t\tgoto LabelOK;\n\t}\n\t\n\twdev = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\tPhyMode = wdev->PhyMode;\n\n\tFlgIs11bSta = 1;\n\tfor(i=0; i<ie_list->SupportedRatesLen; i++)\n\t{\n\t\tif (((ie_list->SupportedRates[i] & 0x7F) != 2) &&\n\t\t\t((ie_list->SupportedRates[i] & 0x7F) != 4) &&\n\t\t\t((ie_list->SupportedRates[i] & 0x7F) != 11) &&\n\t\t\t((ie_list->SupportedRates[i] & 0x7F) != 22))\n\t\t{\n\t\t\tFlgIs11bSta = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n    \n    \n\t/* clear the previous Pairwise key table */\n    if(pEntry->Aid != 0 &&\n\t(pEntry->WepStatus >= Ndis802_11Encryption2Enabled \n#ifdef DOT1X_SUPPORT\n\t|| wdev->IEEE8021X\n#endif /* DOT1X_SUPPORT */\n\t))\n    {\n\t\t/* clear GTK state */\n\t\tpEntry->GTKState = REKEY_NEGOTIATING;\n    \t\n\t\tNdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));\n\n\t\t/* clear this entry as no-security mode */\n\t\tAsicRemovePairwiseKeyEntry(pAd, pEntry->Aid);\n\n#ifdef DOT1X_SUPPORT\n\t\t/* Notify 802.1x daemon to clear this sta info */\n\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA || \n\t\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2 ||\n\t\t\twdev->IEEE8021X)\n\t\tDOT1X_InternalCmdAction(pAd, pEntry, DOT1X_DISCONNECT_ENTRY);\n#endif /* DOT1X_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t\t\t\t   pEntry->AuthMode, \n\t\t\t\t\t\t\t   pEntry->apidx, \n\t\t\t\t\t\t\t   pEntry->Addr, \n\t\t\t\t\t\t\t   WAI_MLME_DISCONNECT);\n\n\t\tRTMPCancelWapiRekeyTimerAction(pAd, pEntry);\n#endif /* WAPI_SUPPORT */\n    }\n\n#ifdef WSC_AP_SUPPORT\n    /* since sta has been left, ap should receive EapolStart and EapRspId again. */\n\tpEntry->Receive_EapolStart_EapRspId = 0;\n\tpEntry->bWscCapable = ie_list->bWscCapable;\n#ifdef WSC_V2_SUPPORT\n\tif ((wdev->WscControl.WscV2Info.bEnableWpsV2) &&\n\t\t(wdev->WscControl.WscV2Info.bWpsEnable == FALSE))\n\t\t;\n\telse\n#endif /* WSC_V2_SUPPORT */\n\t{\n\t    if (pEntry->apidx < pAd->ApCfg.BssidNum)\n\t    {\n\t        if (MAC_ADDR_EQUAL(pEntry->Addr, wdev->WscControl.EntryAddr))\n\t        {\n\t            BOOLEAN Cancelled;\n\t            RTMPZeroMemory(wdev->WscControl.EntryAddr, MAC_ADDR_LEN);\n\t            RTMPCancelTimer(&wdev->WscControl.EapolTimer, &Cancelled);\n\t            wdev->WscControl.EapolTimerRunning = FALSE;\n\t        }\n\t    }\n\t\t\t\n\t    if ((ie_list->RSNIE_Len == 0) &&\n\t\t (wdev->AuthMode >= Ndis802_11AuthModeWPA) &&\n\t\t (wdev->WscControl.WscConfMode != WSC_DISABLE))\n\t        pEntry->bWscCapable = TRUE;\n\t}\n#endif /* WSC_AP_SUPPORT */\n\n    /* for hidden SSID sake, SSID in AssociateRequest should be fully verified */\n\tif ((ie_list->SsidLen != wdev->SsidLen) ||\n\t\t(NdisEqualMemory(ie_list->Ssid, wdev->Ssid, ie_list->SsidLen)==0))\n        goto LabelOK;\n        \n#ifdef WSC_V2_SUPPORT\n\t/* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */\n\tif ((pEntry->bWscCapable) &&\n\t\t(wdev->WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t(wdev->WscControl.WscV2Info.bEnableWpsV2) &&\n\t\t(wdev->WscControl.WscV2Info.bWpsEnable) &&\n\t\t(MAC_ADDR_EQUAL(wdev->WscControl.EntryAddr, ZERO_MAC_ADDR)))\n\t\t;\n\telse\n#endif /* WSC_V2_SUPPORT */        \n\t/* set a flag for sending Assoc-Fail response to unwanted STA later. */\n\tif (! ApCheckAccessControlList(pAd, ie_list->Addr2, pEntry->apidx))\n\t\tbACLReject = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - MBSS(%d), receive %s request from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t  sAssoc, pEntry->apidx, sAssoc, PRINT_MAC(ie_list->Addr2)));\n    \n\t/* supported rates array may not be sorted. sort it and find the maximum rate */\n\tfor (i=0; i<ie_list->SupportedRatesLen; i++)\n\t{\n\t\tif (MaxSupportedRate < (ie_list->SupportedRates[i] & 0x7f))\n\t\t\tMaxSupportedRate = ie_list->SupportedRates[i] & 0x7f;\n\t}\n\n\t/*\n\t\tAssign RateLen here or we will select wrong rate table in\n\t\tAPBuildAssociation() when 11N compile option is disabled.\n\t*/\n\tpEntry->RateLen = ie_list->SupportedRatesLen;\n\n\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\tOPMODE_AP,\n\t\t\t\t\tpEntry,\n\t\t\t\t\tie_list->SupportedRates,\n\t\t\t\t\tie_list->SupportedRatesLen,\n\t\t\t\t\tNULL,\n\t\t\t\t\t0,\n#ifdef DOT11_VHT_AC\n\t\t\t\t\tie_list->vht_cap_len,\n\t\t\t\t\t&ie_list->vht_cap,\n#endif /* DOT11_VHT_AC */\n\t\t\t\t\t&ie_list->HTCapability,\n\t\t\t\t\tie_list->ht_cap_len);\n\n\t/* 2. qualify this STA's auth_asoc status in the MAC table, decide StatusCode */\n\tStatusCode = APBuildAssociation(pAd, pEntry, ie_list, MaxSupportedRate, &Aid);\n\n\n\n#ifdef DOT11_VHT_AC\n\tif (ie_list->vht_cap_len)\n\t{\n\t\tVHT_CAP_INFO *vht_cap = &ie_list->vht_cap.vht_cap;\n\n//+++Add by shiang for debug\n\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode)) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():Peer is VHT capable device!\\n\", __FUNCTION__));\n\t\t\t//dump_vht_cap(pAd, &ie_list->vht_cap);\n\t\t}\n//---Add by shiang for debug\n\t}\n#endif /* DOT11_VHT_AC */\n\n\tif (StatusCode == MLME_ASSOC_REJ_DATA_RATE)\n\t\t\tRTMPSendWirelessEvent(pAd, IW_STA_MODE_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);\n\n    /* 3. send Association Response */\n    NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n    if (NStatus != NDIS_STATUS_SUCCESS)\n        goto LabelOK;\n        \n    DBGPRINT(RT_DEBUG_TRACE, (\"%s - Send %s response (Status=%d)...\\n\", sAssoc, sAssoc, StatusCode));\n    Aid |= 0xc000; /* 2 most significant bits should be ON */\n\n\tSubType = isReassoc ? SUBTYPE_REASSOC_RSP : SUBTYPE_ASSOC_RSP;\n\n\tCapabilityInfoForAssocResp = wdev->CapabilityInfo; /*use AP's cability */\n#ifdef WSC_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\tif ((wdev->WscControl.WscV2Info.bEnableWpsV2) &&\n\t\t(wdev->WscControl.WscV2Info.bWpsEnable == FALSE))\n\t\t;\n\telse\n#endif /* WSC_V2_SUPPORT */\n\t{\n\t\tif ((wdev->WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t(ie_list->CapabilityInfo & 0x0010))\n\t\t{\n\t\t\tCapabilityInfoForAssocResp |= 0x0010;\n\t\t}\n\t}\n#endif /* WSC_AP_SUPPORT */\n\t\n\t/* fail in ACL checking => send an Assoc-Fail resp. */\n\tSupRateLen = pAd->CommonCfg.SupRateLen;\n\n\t/* TODO: need to check rate in support rate element, not number */\n\tif (FlgIs11bSta == 1)\n\t\tSupRateLen = 4;\n\n\tif (bACLReject == TRUE)\n\t{\n\t    MgtMacHeaderInit(pAd, &AssocRspHdr, SubType, 0, ie_list->Addr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\twdev->Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\twdev->Bssid);\n\t\tStatusCode = MLME_UNSPECIFY_FAIL;\n\t    MakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t                      sizeof(HEADER_802_11),    &AssocRspHdr,\n\t                      2,                        &CapabilityInfoForAssocResp,\n\t                      2,                        &StatusCode,\n\t                      2,                        &Aid,\n\t                      1,                        &SupRateIe,\n\t                      1,                        &SupRateLen,\n\t                      SupRateLen,               pAd->CommonCfg.SupRate,\n\t                      END_OF_ARGS);\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, (PVOID) pOutBuffer);\n\n\t\tRTMPSendWirelessEvent(pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, ie_list->Addr2, pEntry->apidx, 0);\n\n#ifdef WSC_V2_SUPPORT\n\t\t/* If this STA exists, delete it. */\n\t\tif (pEntry)\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n#endif /* WSC_V2_SUPPORT */\n\n\t\tgoto LabelOK;\n\t}\n\n\tMgtMacHeaderInit(pAd, &AssocRspHdr, SubType, 0, ie_list->Addr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\twdev->Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\twdev->Bssid);\n\n    MakeOutgoingFrame(pOutBuffer,               &FrameLen,\n                      sizeof(HEADER_802_11),    &AssocRspHdr,\n                      2,                        &CapabilityInfoForAssocResp,\n                      2,                        &StatusCode,\n                      2,                        &Aid,\n                      1,                        &SupRateIe,\n                      1,                        &SupRateLen,\n                      SupRateLen,               pAd->CommonCfg.SupRate,\n                      END_OF_ARGS);\n\n    if ((pAd->CommonCfg.ExtRateLen) && (PhyMode != WMODE_B) && (FlgIs11bSta == 0))\n    {\n        ULONG TmpLen;\n        MakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n                          1,                        &ExtRateIe,\n                          1,                        &pAd->CommonCfg.ExtRateLen,\n                          pAd->CommonCfg.ExtRateLen,    pAd->CommonCfg.ExtRate,\n                          END_OF_ARGS);\n        FrameLen += TmpLen;\n    }\n\n\n\n    /* add WMM IE here */\n\tif (wdev->bWmmCapable && CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t{\n\t\tULONG TmpLen;\n\t\tUCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0};\n\n\t\tWmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f;\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_MR_IE_FILL(WmeParmIe[8], &wdev->UapsdInfo);\n#endif /* UAPSD_SUPPORT */\n\t\tfor (i=QID_AC_BE; i<=QID_AC_VO; i++)\n\t\t{\n\t\t\tWmeParmIe[10+ (i*4)] = (i << 5) +     /* b5-6 is ACI */\n\t\t\t\t\t\t\t\t((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4) + /* b4 is ACM */\n\t\t\t\t\t\t\t\t(pAd->ApCfg.BssEdcaParm.Aifsn[i] & 0x0f);              /* b0-3 is AIFSN */\n\t\t\tWmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4) + /* b5-8 is CWMAX */\n\t\t\t\t\t\t\t\t(pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f);              /* b0-3 is CWMIN */\n\t\t\tWmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff);        /* low byte of TXOP */\n\t\t\tWmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8);          /* high byte of TXOP */\n\t\t}\n\n\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n\t\t\t\t\t\t\t26,                       WmeParmIe,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\n\n#ifdef DOT11_N_SUPPORT\n\t/* HT capability in AssocRsp frame. */\n\tif ((ie_list->ht_cap_len > 0) && WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tULONG TmpLen;\n\t\tUCHAR HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo);\n\t\tHT_CAPABILITY_IE HtCapabilityRsp;\n#ifdef RT_BIG_ENDIAN\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\tADD_HT_INFO_IE\taddHTInfoTmp;\n#endif\n\n\t\tNdisMoveMemory(&HtCapabilityRsp, &pAd->CommonCfg.HtCapability, ie_list->ht_cap_len);\n\n\t\t/* add HT Capability IE */\n#ifndef RT_BIG_ENDIAN\n\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,\t\t\t&TmpLen,\n\t\t\t\t\t\t\t\t\t\t\t1,\t\t\t&HtCapIe,\n\t\t\t\t\t\t\t\t\t\t\t1,\t\t\t&ie_list->ht_cap_len,\n\t\t\t\t\t\t\tie_list->ht_cap_len,\t\t&HtCapabilityRsp,\n\t\t\t\t\t\t\t\t\t\t\t1,\t\t\t&AddHtInfoIe,\n\t\t\t\t\t\t\t\t\t\t\t1,\t\t\t&HtLen1,\n\t\t\t\t\t\t\t\t\t\tHtLen1,\t\t\t&pAd->CommonCfg.AddHTInfo,\n\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\tNdisMoveMemory(&HtCapabilityTmp, &HtCapabilityRsp, ie_list->ht_cap_len);\n\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t{\n\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t}\n#else\n\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\tNdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, HtLen1);\n\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));\n\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));\n\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t1,                           &HtCapIe,\n\t\t\t\t\t\t\t1,                           &ie_list->ht_cap_len,\n\t\t\t\t\t\t\tie_list->ht_cap_len,            &HtCapabilityTmp,\n\t\t\t\t\t\t\t1,                           &AddHtInfoIe,\n\t\t\t\t\t\t\t1,                           &HtLen1,\n\t\t\t\t\t\t\tHtLen1,                      &addHTInfoTmp,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n#endif\n\t\tFrameLen += TmpLen;\n\n\t\tif ((ie_list->RalinkIe) == 0 || (pAd->bBroadComHT == TRUE))\n\t\t{\n\t\t\tUCHAR epigram_ie_len;\n\t\t\tUCHAR BROADCOM_HTC[4] = {0x0, 0x90, 0x4c, 0x33};\n\t\t\tUCHAR BROADCOM_AHTINFO[4] = {0x0, 0x90, 0x4c, 0x34};\n\n\n\t\t\tepigram_ie_len = ie_list->ht_cap_len + 4;\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t  4,                                &BROADCOM_HTC[0],\n\t\t\t\t\t\t  ie_list->ht_cap_len,            \t\t&HtCapabilityRsp,\n\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t  4,                                &BROADCOM_HTC[0],\n\t\t\t\t\t\t  ie_list->ht_cap_len,            \t\t&HtCapabilityTmp,\n\t\t\t\t\t\t  END_OF_ARGS);\n#endif\n\n\t\t\tFrameLen += TmpLen;\n\t\t\tepigram_ie_len = HtLen1 + 4;\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t  4,                                &BROADCOM_AHTINFO[0],\n\t\t\t\t\t\t  HtLen1, \t\t\t\t\t\t\t&pAd->CommonCfg.AddHTInfo,\n\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t  4,                                &BROADCOM_AHTINFO[0],\n\t\t\t\t\t\t  HtLen1, \t\t\t\t\t\t\t&addHTInfoTmp,\n\t\t\t\t\t\t  END_OF_ARGS);\n#endif\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\n#ifdef DOT11N_DRAFT3\n\t \t/* P802.11n_D3.03, 7.3.2.60 Overlapping BSS Scan Parameters IE */\n\t \tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\t\t(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1))\n\t \t{\n\t\t\tOVERLAP_BSS_SCAN_IE OverlapScanParam;\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR OverlapScanIE, ScanIELen;\n\n\t\t\tOverlapScanIE = IE_OVERLAPBSS_SCAN_PARM;\n\t\t\tScanIELen = 14;\n\t\t\tOverlapScanParam.ScanPassiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveDwell);\n\t\t\tOverlapScanParam.ScanActiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveDwell);\n\t\t\tOverlapScanParam.TriggerScanInt = cpu2le16(pAd->CommonCfg.Dot11BssWidthTriggerScanInt);\n\t\t\tOverlapScanParam.PassiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel);\n\t\t\tOverlapScanParam.ActiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel);\n\t\t\tOverlapScanParam.DelayFactor = cpu2le16(pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\t\t\tOverlapScanParam.ScanActThre = cpu2le16(pAd->CommonCfg.Dot11OBssScanActivityThre);\n\t\t\t\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t&OverlapScanIE,\n\t\t\t\t\t\t\t\t1,\t\t\t&ScanIELen,\n\t\t\t\t\t\t\t\tScanIELen,\t&OverlapScanParam,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t\n\t\t\tFrameLen += TmpLen;\n\t \t}\n#endif /* DOT11N_DRAFT3 */\n\n#ifdef DOT11_VHT_AC\n\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t(pAd->CommonCfg.Channel > 14) &&\n\t\t\t(ie_list->vht_cap_len))\n\t\t{\n\t\t\tFrameLen += build_vht_ies(pAd, pOutBuffer + FrameLen, SUBTYPE_ASSOC_RSP);\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n\t\t/* 7.3.2.27 Extended Capabilities IE */\n\t\t{\n\t\tULONG TmpLen, infoPos;\n\t\tPUCHAR pInfo;\n\t\tUCHAR extInfoLen;\n\t\tBOOLEAN bNeedAppendExtIE = FALSE;\n\t\tEXT_CAP_INFO_ELEMENT extCapInfo;\n\n\t\t\n\t\textInfoLen = sizeof(EXT_CAP_INFO_ELEMENT);\n\t\tNdisZeroMemory(&extCapInfo, extInfoLen);\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t/* P802.11n_D1.10, HT Information Exchange Support */\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n\t\t\t&& (pAd->CommonCfg.Channel <= 14) \n\t\t\t&& (pAd->CommonCfg.bBssCoexEnable == TRUE)\n\t\t)\n\t\t{\n\t\t\textCapInfo.BssCoexistMgmtSupport = 1;\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\n\t\tpInfo = (PUCHAR)(&extCapInfo);\n\t\tfor (infoPos = 0; infoPos < extInfoLen; infoPos++)\n\t\t{\n\t\t\tif (pInfo[infoPos] != 0)\n\t\t\t{\n\t\t\t\tbNeedAppendExtIE = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (bNeedAppendExtIE == TRUE)\n\t\t{\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen,\n\t\t\t\t\t\t\t1,\t\t\t&ExtCapIe,\n\t\t\t\t\t\t\t1,\t\t\t&extInfoLen,\n\t\t\t\t\t\t\textInfoLen,\t&extCapInfo,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\t}\n\t\n\t/* add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back */\n{\n\tULONG TmpLen;\n\tUCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00};\n\n\tif (pAd->CommonCfg.bAggregationCapable)\n\t\tRalinkSpecificIe[5] |= 0x1;\n\tif (pAd->CommonCfg.bPiggyBackCapable)\n\t\tRalinkSpecificIe[5] |= 0x2;\n#ifdef DOT11_N_SUPPORT\n\tif (pAd->CommonCfg.bRdg)\n\t\tRalinkSpecificIe[5] |= 0x4;\n#endif /* DOT11_N_SUPPORT */\n\tMakeOutgoingFrame(pOutBuffer+FrameLen,\t\t &TmpLen,\n\t\t\t\t\t\t9,\t\t\t\t\t\t RalinkSpecificIe,\n\t\t\t\t\t\tEND_OF_ARGS);\n\tFrameLen += TmpLen;\n\n}\n  \n#ifdef WSC_AP_SUPPORT\n\tif (pEntry->bWscCapable)\n\t{\n\t\tUCHAR *pWscBuf = NULL, WscIeLen = 0;\n\t\tULONG WscTmpLen = 0;\n\n\t\tos_alloc_mem(NULL, (UCHAR **)&pWscBuf, 512);\n\t\tif(pWscBuf)\n\t\t{\n\t\t\tNdisZeroMemory(pWscBuf, 512);\n\t\t\tWscBuildAssocRespIE(pAd, pEntry->apidx, 0, pWscBuf, &WscIeLen);\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen,\n\t\t\t\t\t\t\t\t  WscIeLen, pWscBuf,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\tFrameLen += WscTmpLen;\n\t\t\tos_free_mem(NULL, pWscBuf);\n\t\t}\n\t}\n#endif /* WSC_AP_SUPPORT */\n  \n#ifdef P2P_SUPPORT\n\tif (ie_list->P2PSubelementLen > 0)\n\t{\n\t\tULONG \tTmpLen;\n\t\tUCHAR \tP2pIdx = P2P_NOT_FOUND;\n\t\tUCHAR\tGroupCap = 0xff, DeviceCap = 0xff, DevAddr[6] = {0}, DeviceType[8], DeviceName[32], DeviceNameLen = 0;\n\t\tPUCHAR \tpData;\n\t\tUSHORT\tDpid, ConfigMethod;\n\n\t\tpEntry->bP2pClient = TRUE;\n\t\tpEntry->P2pInfo.P2pClientState = P2PSTATE_CLIENT_ASSOC;\n\t\tP2pParseSubElmt(pAd, (PVOID)ie_list->P2pSubelement, ie_list->P2PSubelementLen, FALSE, &Dpid, &GroupCap, \n\t\t\t&DeviceCap, DeviceName, &DeviceNameLen, DevAddr, NULL, NULL, NULL, NULL, &ConfigMethod, \n\t\t\t&ConfigMethod, DeviceType, NULL, NULL, NULL, NULL, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\t\tNULL);\n\n\t\tP2pIdx = P2pGroupTabSearch(pAd, DevAddr);\n\t\tif (P2pIdx == P2P_NOT_FOUND)\n\t\t\tP2pIdx = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_DISCOVERY_CLIENT, NULL, 0, 0, 0);\n\n\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t{\n\t\t\tpEntry->P2pInfo.p2pIndex = P2pIdx;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC RSP - Insert P2P IE to %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pEntry->Addr)));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" %d. DevAddr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", P2pIdx, PRINT_MAC(DevAddr)));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DeviceNameLen = %d, DeviceName = %c %c %c %c %c %c %c %c\\n\", DeviceNameLen , \n\t\t\tDeviceName[0], DeviceName[1], DeviceName[2], DeviceName[3],\n\t\t\tDeviceName[4], DeviceName[5], DeviceName[6], DeviceName[7]));\n\n\t\t/* update P2P Interface Address */\n\t\tRTMPMoveMemory(pAd->P2pTable.Client[P2pIdx].InterfaceAddr, pEntry->Addr, MAC_ADDR_LEN);\n\n\t\tpData = pOutBuffer + FrameLen;\n\t\tP2pMakeP2pIE(pAd, SUBTYPE_ASSOC_RSP, pData, &TmpLen);\n\t\tFrameLen += TmpLen;\n\t}\n\t}\n\telse\n\t\tpEntry->bP2pClient = FALSE;\n\t\n#ifdef WFD_SUPPORT\n\t{\n\t\tPUCHAR\tpData;\n\t\tULONG\tWfdIeLen = 0, WfdIeBitmap;\n\n\t\tpData = pOutBuffer + FrameLen;\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pData, &WfdIeLen);\n\t\tFrameLen += WfdIeLen;\n\t}\n#endif /* WFD_SUPPORT */\n\t\n#endif /* P2P_SUPPORT */\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, (PVOID) pOutBuffer);\n\n\n\t/* set up BA session */\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\tpEntry->PsMode = PWR_ACTIVE;\n\n#ifdef IAPP_SUPPORT\n\t\t/*PFRAME_802_11 Fr = (PFRAME_802_11)Elem->Msg; */\n/*\t\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; */\n\n\t\t/* send association ok message to IAPPD */\n\n\t\tIAPP_L2_Update_Frame_Send(pAd, pEntry->Addr, pEntry->apidx);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"####### Send L2 Frame Mac=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\t  PRINT_MAC(pEntry->Addr)));\n\n/*\t\tSendSingalToDaemon(SIGUSR2, pObj->IappPid); */\n\n\t\t\n#endif /* IAPP_SUPPORT */\n\n\t\tap_assoc_info_debugshow(pAd, isReassoc, pEntry, ie_list);\n\n\t\t/* send wireless event - for association */\n\t\tRTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pEntry->Addr, 0, 0);\n    \t\n\t\t/* This is a reassociation procedure */\n\t\tpEntry->IsReassocSta = isReassoc;\n\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t/* clear txBA bitmap */\n\t\tpEntry->TXBAbitmap = 0;\n\t\tif (pEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX)\n\t\t{\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\tif ((pAd->CommonCfg.Channel <=14) &&\n\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset &&\n\t\t\t\t(ie_list->HTCapability.HtCapInfo.ChannelWidth==BW_40))\n\t\t\t{\n\t\t\t\tSendBeaconRequest(pAd, pEntry->Aid);\n\t\t\t}\n\t\t\t/*BAOriSessionSetUp(pAd, pEntry, 0, 0, 3000, FALSE); */\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n\t\t/* enqueue a EAPOL_START message to trigger EAP state machine doing the authentication */\n\t    if ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || \n\t\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n    \t{\n#ifdef WSC_AP_SUPPORT\n            /*\n                In WPA-PSK mode,\n                If Association Request of station has RSN/SSN, WPS AP Must Not send EAP-Request/Identity to station\n                no matter WPS AP does receive EAPoL-Start from STA or not.\n                Marvell WPS test bed(v2.1.1.5) will send AssocReq with WPS IE and RSN/SSN IE.\n            */\n            if (pEntry->bWscCapable || (ie_list->RSNIE_Len == 0))\n            {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - IF(ra%d) This is a WPS Client.\\n\\n\", pEntry->apidx));\n\t\t\tgoto LabelOK;\n            }\n            else\n            {\n                pEntry->bWscCapable = FALSE;\n                pEntry->Receive_EapolStart_EapRspId = (WSC_ENTRY_GET_EAPOL_START | WSC_ENTRY_GET_EAP_RSP_ID);\n                /* This STA is not a WPS STA */\n                NdisZeroMemory(wdev->WscControl.EntryAddr, 6);\n            }\n#endif /* WSC_AP_SUPPORT */\n\n\t\t\t/* Enqueue a EAPOL-start message with the pEntry for WPAPSK State Machine */\n\t\t\tif ((pEntry->EnqueueEapolStartTimerRunning == EAPOL_START_DISABLE\n#ifdef HOSTAPD_SUPPORT\t\t\t\n\t\t\t\t&& wdev->Hostapd == FALSE\n#endif/*HOSTAPD_SUPPORT*/\n\t\t\t\t)\n#ifdef WSC_AP_SUPPORT\n\t\t\t\t&& !pEntry->bWscCapable\n#endif /* WSC_AP_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n        \t\t/* Enqueue a EAPOL-start message with the pEntry */\n        \t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_PSK;\n        \t\tRTMPSetTimer(&pEntry->EnqueueStartForPSKTimer, ENQUEUE_EAPOL_START_TIMER);\n\t\t\t}\n    \t}\n#ifdef DOT1X_SUPPORT\n\t\t/*else if (isReassoc && */\n\t\telse if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) && \n\t\t\t\t((pPmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE, ie_list->RSNIE_Len, PMKID_LIST, &pmkid_count)) != NULL))\n\t\t{\t/* Key cache */\n\t\t\tINT\tCacheIdx;\n\n\t\t\tif (((CacheIdx = RTMPSearchPMKIDCache(pAd, pEntry->apidx, pEntry->Addr)) != -1)\n\t\t\t\t&& (RTMPEqualMemory(pPmkid, &wdev->PMKIDCache.BSSIDInfo[CacheIdx].PMKID, LEN_PMKID)))\n\t\t\t{\n\t\t\t\t/* Enqueue a EAPOL-start message with the pEntry for WPAPSK State Machine */\n\t\t\t\tif ((pEntry->EnqueueEapolStartTimerRunning == EAPOL_START_DISABLE\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\t\t&& wdev->Hostapd == FALSE\n#endif /*HOSTAPD_SUPPORT*/\n\t\t\t\t)\n#ifdef WSC_AP_SUPPORT\n\t\t\t\t\t&& !pEntry->bWscCapable\n#endif /* WSC_AP_SUPPORT */\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t/* Enqueue a EAPOL-start message with the pEntry */\n\t\t\t\t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_PSK;\n\t\t\t\t\tRTMPSetTimer(&pEntry->EnqueueStartForPSKTimer, ENQUEUE_EAPOL_START_TIMER);\n\t\t\t\t}\n\n\t\t\t\tpEntry->PMKID_CacheIdx = CacheIdx;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ASSOC - 2.PMKID matched and start key cache algorithm\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ASSOC - 2.PMKID not found \\n\"));\n\t\t\t}\n\t\t}\n\t\telse if ((pEntry->AuthMode == Ndis802_11AuthModeWPA) ||\n\t\t\t\t (pEntry->AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t\t\t ((wdev->IEEE8021X)\n#ifdef WSC_AP_SUPPORT\n\t\t\t\t\t&& (!pEntry->bWscCapable)\n#endif /* WSC_AP_SUPPORT */\n\t\t\t\t)\n\t\t)\n\t\t{\n\t\t\t/* Enqueue a EAPOL-start message to trigger EAP SM */\n\t\t\tif (pEntry->EnqueueEapolStartTimerRunning == EAPOL_START_DISABLE\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\t&& wdev->Hostapd == FALSE\n#endif/*HOSTAPD_SUPPORT*/\n\t\t\t)\n\t\t\t{\n      \t  \t\t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_1X;\n       \t \t\tRTMPSetTimer(&pEntry->EnqueueStartForPSKTimer, ENQUEUE_EAPOL_START_TIMER);\n\t\t\t}\n\t\t}\n#endif /* DOT1X_SUPPORT */\n#ifdef WAPI_SUPPORT\n\t\telse if (pEntry->AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t{\n\t\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t\t\t\t\t   pEntry->AuthMode, \n\t\t\t\t\t\t\t\t   pEntry->apidx, \n\t\t\t\t\t\t\t\t   pEntry->Addr, \n\t\t\t\t\t\t\t\t   WAI_MLME_CERT_AUTH_START);\t\n\n\t\t\tRTMPInitWapiRekeyTimerAction(pAd, pEntry);\n\t\t}\n\t\telse if (pEntry->AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\t{\n\t\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t\t\t\t\t   pEntry->AuthMode, \n\t\t\t\t\t\t\t\t   pEntry->apidx, \n\t\t\t\t\t\t\t\t   pEntry->Addr, \n\t\t\t\t\t\t\t\t   WAI_MLME_KEY_HS_START);\n\t\t\tRTMPInitWapiRekeyTimerAction(pAd, pEntry);\n\t\t}\n#endif /* WAPI_SUPPORT */\n        else\n        {\n\t\t\tif (pEntry->WepStatus == Ndis802_11WEPEnabled)\n\t\t\t{\n\t\t\t\t/* Set WEP key to ASIC */\n\t\t\t\tUCHAR KeyIdx = 0;\n\t\t\t\tUCHAR CipherAlg = 0;\n\n\t\t\t\tKeyIdx = wdev->DefaultKeyId;\t\t\t\t\t\n\t\t\t\tCipherAlg = pAd->SharedKey[pEntry->apidx][KeyIdx].CipherAlg;\n\n\t\t\t\t/*\n\t\t\t\t\tIf WEP is used, set pair-wise cipherAlg into WCID\n\t\t\t\t\tattribute table for this entry.\n\t\t\t\t*/\n\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd, \n\t\t\t\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\t\t\t\tCipherAlg, \n\t\t\t\t\t\t\t\t\t\tpEntry->Aid, \n\t\t\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\n\t\t\t}\t\n        }\n\n\t}\n\nLabelOK:\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\n\treturn;\t\n}\n\n\n\n/*\n    ==========================================================================\n    Description:\n        peer assoc req handling procedure\n    Parameters:\n        Adapter - Adapter pointer\n        Elem - MLME Queue Element\n    Pre:\n        the station has been authenticated and the following information is stored\n    Post  :\n        -# An association response frame is generated and sent to the air\n    ==========================================================================\n */\nVOID APPeerAssocReqAction(\n    IN PRTMP_ADAPTER pAd,\n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tap_cmm_peer_assoc_req_action(pAd, Elem, 0);\n}\n\n/*\n    ==========================================================================\n    Description:\n        mlme reassoc req handling procedure\n    Parameters:\n        Elem -\n    Pre:\n        -# SSID  (Adapter->ApCfg.ssid[])\n        -# BSSID (AP address, Adapter->ApCfg.bssid)\n        -# Supported rates (Adapter->ApCfg.supported_rates[])\n        -# Supported rates length (Adapter->ApCfg.supported_rates_len)\n        -# Tx power (Adapter->ApCfg.tx_power)\n    ==========================================================================\n */\nVOID APPeerReassocReqAction(\n    IN PRTMP_ADAPTER pAd,\n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tap_cmm_peer_assoc_req_action(pAd, Elem, 1);\n}\n\n/*\n    ==========================================================================\n    Description:\n        left part of IEEE 802.11/1999 p.374\n    Parameters:\n        Elem - MLME message containing the received frame\n    ==========================================================================\n */\nVOID APPeerDisassocReqAction(\n    IN PRTMP_ADAPTER pAd,\n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUSHORT Reason;\n\tUINT16 SeqNum;\t\t\n\tMAC_TABLE_ENTRY *pEntry;\n\tMULTISSID_STRUCT *wdev;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - 1 receive DIS-ASSOC request \\n\"));\n    if (! PeerDisassocReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &SeqNum, &Reason))\n        return;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - receive DIS-ASSOC(seq-%d) request from %02x:%02x:%02x:%02x:%02x:%02x, reason=%d\\n\", \n\t\t\t\t\t\t\t\tSeqNum, Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5],Reason));\n    \n\tpEntry = MacTableLookup(pAd, Addr2);\n\n\tif (pEntry == NULL)\n\t\treturn;\n\t\t\n\tif (Elem->Wcid < MAX_LEN_OF_MAC_TABLE)\n    {\n\n#ifdef DOT1X_SUPPORT\n\t\twdev = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\t\t/* Notify 802.1x daemon to clear this sta info */\n\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA || \n\t\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2 ||\n\t\t\twdev->IEEE8021X)\n\t\t\tDOT1X_InternalCmdAction(pAd, pEntry, DOT1X_DISCONNECT_ENTRY);\n#endif /* DOT1X_SUPPORT */\n\t\n#ifdef WAPI_SUPPORT\n\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t\t\t\t   pEntry->AuthMode, \n\t\t\t\t\t\t\t   pEntry->apidx, \n\t\t\t\t\t\t\t   pEntry->Addr, \n\t\t\t\t\t\t\t   WAI_MLME_DISCONNECT);\t\t\n#endif /* WAPI_SUPPORT */\n\t\n\t\t/* send wireless event - for disassociation */\n\t\tRTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, Addr2, 0, 0);\n        ApLogEvent(pAd, Addr2, EVENT_DISASSOCIATED);\n\n\t\tMacTableDeleteEntry(pAd, Elem->Wcid, Addr2);\n    }\n}\n\n/*\n    ==========================================================================\n    Description:\n        delete it from STA and disassoc s STA\n    Parameters:\n        Elem -\n    ==========================================================================\n */\nVOID MbssKickOutStas(\n    IN PRTMP_ADAPTER pAd,\n    IN INT apidx,\n    IN USHORT Reason)\n{\n\tINT i;\n\tPMAC_TABLE_ENTRY pEntry;\n\n\tfor (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry) && pEntry->apidx == apidx)\n\t\t\tAPMlmeKickOutSta(pAd, pEntry->Addr, pEntry->Aid, Reason);\n\t}\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        delete it from STA and disassoc s STA\n    Parameters:\n        Elem -\n    ==========================================================================\n */\nVOID APMlmeKickOutSta(\n    IN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pStaAddr,\n\tIN UCHAR Wcid,\n\tIN USHORT Reason)\n{\n\tHEADER_802_11 DisassocHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0;\n\tNDIS_STATUS NStatus;\n\tMAC_TABLE_ENTRY *pEntry;\n\tUCHAR Aid;\n\tUCHAR ApIdx;\n\n\tpEntry = MacTableLookup(pAd, pStaAddr);\n\n\tif (pEntry == NULL)\n\t{\n\t\treturn;\n\t}\n\tAid = pEntry->Aid;\n\tApIdx = pEntry->apidx;\n\n\tASSERT(Aid == Wcid);\n\n\tif (ApIdx >= pAd->ApCfg.BssidNum)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Invalid Apidx=%d\\n\",\n\t\t\t__FUNCTION__, ApIdx));\n\t\treturn;\n\t}\n\n\tif (Aid < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\t/* send wireless event - for disassocation */\n\t\tRTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pStaAddr, 0, 0);\n        ApLogEvent(pAd, pStaAddr, EVENT_DISASSOCIATED);\n\n\t    /* 2. send out a DISASSOC request frame */\n\t    NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t    if (NStatus != NDIS_STATUS_SUCCESS)\n\t        return;\n\t    \n\t    DBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - MLME disassociates %02x:%02x:%02x:%02x:%02x:%02x; Send DISASSOC request\\n\",\n\t        pStaAddr[0],pStaAddr[1],pStaAddr[2], pStaAddr[3],pStaAddr[4],pStaAddr[5]));\n\t    MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pStaAddr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[ApIdx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[ApIdx].Bssid);\n\t    MakeOutgoingFrame(pOutBuffer,            &FrameLen,\n\t                      sizeof(HEADER_802_11), &DisassocHdr,\n\t                      2,                     &Reason,\n\t                      END_OF_ARGS);\n\t    MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t    MlmeFreeMemory(pAd, pOutBuffer);\n\t\tMacTableDeleteEntry(pAd, Aid, pStaAddr);\n    }\n}\n\n\n\n\n/*\n    ==========================================================================\n    Description:\n        Upper layer orders to disassoc s STA\n    Parameters:\n        Elem -\n    ==========================================================================\n */\nVOID APMlmeDisassocReqAction(\n    IN PRTMP_ADAPTER pAd,\n    IN MLME_QUEUE_ELEM *Elem)\n{\n    MLME_DISASSOC_REQ_STRUCT *DisassocReq = (MLME_DISASSOC_REQ_STRUCT *)(Elem->Msg);\n\n\tAPMlmeKickOutSta(pAd, DisassocReq->Addr, Elem->Wcid, DisassocReq->Reason);\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        right part of IEEE 802.11/1999 page 374\n    Note:\n        This event should never cause ASSOC state machine perform state\n        transition, and has no relationship with CNTL machine. So we separate\n        this routine as a service outside of ASSOC state transition table.\n    ==========================================================================\n */\nVOID APCls3errAction(\n    IN PRTMP_ADAPTER pAd,\n\tIN \tULONG Wcid,\n    IN\tPHEADER_802_11\tpHeader)\n{\n    HEADER_802_11         DisassocHdr;\n    PUCHAR                pOutBuffer = NULL;\n    ULONG                 FrameLen = 0;\n    NDIS_STATUS           NStatus;\n    USHORT                Reason = REASON_CLS3ERR;\n    MAC_TABLE_ENTRY       *pEntry = NULL;\n\n\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t{\n      pEntry = &(pAd->MacTab.Content[Wcid]);\n\t}\n\n    if (pEntry)\n    {\n        /*ApLogEvent(pAd, pAddr, EVENT_DISASSOCIATED); */\n\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pHeader->Addr2);\n    }\n    \n    /* 2. send out a DISASSOC request frame */\n    NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n    if (NStatus != NDIS_STATUS_SUCCESS)\n        return;\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - Class 3 Error, Send DISASSOC frame to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n    \t\tPRINT_MAC(pHeader->Addr2)));\n    MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pHeader->Addr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpHeader->Addr1,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpHeader->Addr1);\n    MakeOutgoingFrame(pOutBuffer,            &FrameLen,\n                      sizeof(HEADER_802_11), &DisassocHdr,\n                      2,                     &Reason,\n                      END_OF_ARGS);\n    MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n    MlmeFreeMemory(pAd, pOutBuffer);\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        association state machine init, including state transition and timer init\n    Parameters:\n        S - pointer to the association state machine\n    Note:\n        The state machine looks like the following\n        \n                                    AP_ASSOC_IDLE\n        APMT2_MLME_DISASSOC_REQ    mlme_disassoc_req_action\n        APMT2_PEER_DISASSOC_REQ    peer_disassoc_action\n        APMT2_PEER_ASSOC_REQ       drop\n        APMT2_PEER_REASSOC_REQ     drop\n        APMT2_CLS3ERR              cls3err_action\n    ==========================================================================\n */\nVOID APAssocStateMachineInit(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  STATE_MACHINE *S,\n    OUT STATE_MACHINE_FUNC Trans[])\n{\n    StateMachineInit(S, (STATE_MACHINE_FUNC*)Trans, AP_MAX_ASSOC_STATE, AP_MAX_ASSOC_MSG, (STATE_MACHINE_FUNC)Drop, AP_ASSOC_IDLE, AP_ASSOC_MACHINE_BASE);\n\n    StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)APMlmeDisassocReqAction);\n    StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)APPeerDisassocReqAction);\n    StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_PEER_ASSOC_REQ,    (STATE_MACHINE_FUNC)APPeerAssocReqAction);\n    StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_PEER_REASSOC_REQ,  (STATE_MACHINE_FUNC)APPeerReassocReqAction);\n/*  StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_CLS3ERR,           APCls3errAction); */\n}\n\n"
  },
  {
    "path": "src/ap/ap_auth.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    auth.c\n \n    Abstract:\n    Handle de-auth request from local MLME\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    John Chang  08-04-2003    created for 11g soft-AP\n */\n\n#include \"rt_config.h\"\n\nstatic VOID APMlmeDeauthReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID APPeerDeauthReqAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID APPeerAuthReqAtIdleAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID APPeerAuthConfirmAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID APPeerAuthSimpleRspGenAndSend(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PHEADER_802_11 pHdr80211, \n    IN  USHORT Alg, \n    IN  USHORT Seq, \n    IN  USHORT StatusCode);\n\n/*\n    ==========================================================================\n    Description:\n        authenticate state machine init, including state transition and timer init\n    Parameters:\n        Sm - pointer to the auth state machine\n    Note:\n        The state machine looks like this\n        \n                                    AP_AUTH_REQ_IDLE           \n        APMT2_MLME_DEAUTH_REQ     mlme_deauth_req_action  \n    ==========================================================================\n */\nvoid APAuthStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]) \n{\n    StateMachineInit(Sm, (STATE_MACHINE_FUNC *)Trans, AP_MAX_AUTH_STATE,\n\t\t\t\t\tAP_MAX_AUTH_MSG, (STATE_MACHINE_FUNC)Drop,\n\t\t\t\t\tAP_AUTH_REQ_IDLE, AP_AUTH_MACHINE_BASE);\n     \n    /* the first column */\n    StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_MLME_DEAUTH_REQ,\n\t\t\t\t\t\t(STATE_MACHINE_FUNC)APMlmeDeauthReqAction);\n\tStateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_PEER_DEAUTH,\n\t\t\t\t\t\t(STATE_MACHINE_FUNC)APPeerDeauthReqAction);\n    StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_PEER_AUTH_REQ,\n\t\t\t\t\t\t(STATE_MACHINE_FUNC)APPeerAuthReqAtIdleAction);\n    StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_PEER_AUTH_CONFIRM,\n\t\t\t\t\t\t(STATE_MACHINE_FUNC)APPeerAuthConfirmAction);\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Upper Layer request to kick out a STA\n    ==========================================================================\n */\nstatic VOID APMlmeDeauthReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{\n    MLME_DEAUTH_REQ_STRUCT\t*pInfo;\n    HEADER_802_11\t\t\tHdr;\n    PUCHAR\t\t\t\t\tpOutBuffer = NULL;\n    NDIS_STATUS\t\t\t\tNStatus;\n    ULONG\t\t\t\t\tFrameLen = 0;\n    MAC_TABLE_ENTRY\t\t\t*pEntry;\n\tUCHAR\t\t\t\t\tapidx;\n\n\n    pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg;\n\n    if (Elem->Wcid < MAX_LEN_OF_MAC_TABLE)\n    {\n\t\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\t\tif (!pEntry)\n\t\t\treturn;\n\t\t\n#ifdef WAPI_SUPPORT\n\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t\t\t\t   pEntry->AuthMode, \n\t\t\t\t\t\t\t   pEntry->apidx, \n\t\t\t\t\t\t\t   pEntry->Addr, \n\t\t\t\t\t\t\t   WAI_MLME_DISCONNECT);\t\t\n#endif /* WAPI_SUPPORT */\n\t\t\n\t\t/* send wireless event - for deauthentication */\n\t\tRTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pInfo->Addr, 0, 0);  \n\t\tApLogEvent(pAd, pInfo->Addr, EVENT_DISASSOCIATED);\n\n\t\tapidx = pEntry->apidx;\n\n        /* 1. remove this STA from MAC table */\n        MacTableDeleteEntry(pAd, Elem->Wcid, pInfo->Addr);\n\n        /* 2. send out DE-AUTH request frame */\n        NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n        if (NStatus != NDIS_STATUS_SUCCESS) \n            return;\n\n        DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"AUTH - Send DE-AUTH req to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\tpInfo->Addr[0], pInfo->Addr[1], pInfo->Addr[2],\n\t\t\t\tpInfo->Addr[3], pInfo->Addr[4], pInfo->Addr[5]));\n           \t\t\n        MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pInfo->Addr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid);\n        MakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen, \n                          sizeof(HEADER_802_11),\t&Hdr, \n                          2,\t\t\t\t\t\t&pInfo->Reason, \n                          END_OF_ARGS);\n        MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\n        MlmeFreeMemory(pAd, pOutBuffer);\n    }\n}\n\n\nstatic VOID APPeerDeauthReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN PMLME_QUEUE_ELEM Elem) \n{\n    UCHAR\t\t\tAddr2[MAC_ADDR_LEN];\n    USHORT\t\t\tReason;\n\tUINT16\t\t\tSeqNum;\n    MAC_TABLE_ENTRY\t*pEntry;\n\n\n\n    if (! PeerDeauthReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &SeqNum, &Reason)) \n        return;\n\n\tpEntry = NULL;\n\n\t/*pEntry = MacTableLookup(pAd, Addr2); */\n\tif (Elem->Wcid < MAX_LEN_OF_MAC_TABLE)\n    {\n\t\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\n#ifdef DOT1X_SUPPORT    \n\t\t/* Notify 802.1x daemon to clear this sta info */\n\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA || \n\t\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2 ||\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].IEEE8021X)\n\t\t\tDOT1X_InternalCmdAction(pAd, pEntry, DOT1X_DISCONNECT_ENTRY);\n#endif /* DOT1X_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t\t\t\t   pEntry->AuthMode, \n\t\t\t\t\t\t\t   pEntry->apidx, \n\t\t\t\t\t\t\t   pEntry->Addr, \n\t\t\t\t\t\t\t   WAI_MLME_DISCONNECT);\t\t\n#endif /* WAPI_SUPPORT */\n\n\t\t/* send wireless event - for deauthentication */\n\t\tRTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, Addr2, 0, 0);  \n\t\tApLogEvent(pAd, Addr2, EVENT_DISASSOCIATED);\n\t\t\n        if (pEntry->CMTimerRunning == TRUE)\n        {\n            /*\n\t\t\t\tIf one who initilized Counter Measure deauth itself,\n\t\t\t\tAP doesn't log the MICFailTime\n\t\t\t*/\n            pAd->ApCfg.aMICFailTime = pAd->ApCfg.PrevaMICFailTime;\n        }\n\n\t\tMacTableDeleteEntry(pAd, Elem->Wcid, Addr2);\n\n        DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"AUTH - receive DE-AUTH(seq-%d) from \"\n\t\t\t\t \"%02x:%02x:%02x:%02x:%02x:%02x, reason=%d\\n\", SeqNum,\n\t\t\t\tAddr2[0], Addr2[1], Addr2[2], Addr2[3], Addr2[4], Addr2[5], Reason));\n    }\n}\n\n\nstatic VOID APPeerAuthReqAtIdleAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tINT i;\n\tUSHORT Seq, Alg, RspReason, Status;\n\tUCHAR Addr1[MAC_ADDR_LEN];\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tCHAR Chtxt[CIPHER_TEXT_LEN];\n\tUINT32 apidx;\n\n\tPHEADER_802_11 pRcvHdr;\n\tHEADER_802_11 AuthHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tMAC_TABLE_ENTRY *pEntry;\n\tUCHAR ChTxtIe = 16, ChTxtLen = CIPHER_TEXT_LEN;\n\n\n\n\tif (! APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1,\n\t\t\t\t\t\t\tAddr2, &Alg, &Seq, &Status, Chtxt\n\t\t))\n\t\treturn;\n    \n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd) && (pAd->P2pCfg.bStopAuthRsp == TRUE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: GO update not complete, stop Auth Rsp.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n#endif /* P2P_SUPPORT */\n\n    /* Find which MBSSID to be authenticate */\n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\t\n\t\tif (RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN))\n\t\t\tbreak;\n\t}\n\n\tif (apidx >= pAd->ApCfg.BssidNum)\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Bssid not found\\n\"));\n\t\treturn;\n\t}\n\n\tif ((pAd->ApCfg.MBSSID[apidx].MSSIDDev != NULL) &&\n\t\t!(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev)))\n\t{\n    \tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Bssid IF didn't up yet.\\n\"));\n\t   \treturn;\n\t} /* End of if */\n\n\n\tpEntry = MacTableLookup(pAd, Addr2);\n\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t{\n\t\n\t\tif (!RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, MAC_ADDR_LEN))\n\t\t{\t\t\t\t\t\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tpEntry = NULL;\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"AUTH - Bssid does not match\\n\"));\t\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pEntry->bIAmBadAtheros == TRUE)\n\t\t\t{\n\t\t\t\tAsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, FALSE);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Atheros Problem. Turn on RTS/CTS!!!\\n\"));\n\t\t\t\tpEntry->bIAmBadAtheros = FALSE;\n\t\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\tBASessionTearDownALL(pAd, pEntry->Aid);\n#endif /* DOT11_N_SUPPORT */\n\t\t\tASSERT(pEntry->Aid == Elem->Wcid);\n\t\t}\n\t}\n\n\n    pRcvHdr = (PHEADER_802_11)(Elem->Msg);\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%d, Status=%d from \"\n\t\t\t\"[wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tapidx, Seq, Alg, Status, Elem->Wcid, PRINT_MAC(Addr2)));\n\n\n#ifdef WSC_V2_SUPPORT\n\t/* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */\n\tif ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t(pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2) &&\n\t\t(pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bWpsEnable) &&\n\t\t(pAd->ApCfg.MBSSID[apidx].AccessControlList.Policy == 1))\n\t\t; \n\telse\n#endif /* WSC_V2_SUPPORT */\n\t/* fail in ACL checking => send an AUTH-Fail seq#2. */\n    if (! ApCheckAccessControlList(pAd, Addr2, apidx))\n    {\n\t\tASSERT(Seq == 1);\n\t\tASSERT(pEntry == NULL);\n\t\tAPPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_UNSPECIFY_FAIL);\n\n\t\t/* If this STA exists, delete it. */\n\t\tif (pEntry)\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\n\t\tRTMPSendWirelessEvent(pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, Addr2, apidx, 0);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"Failed in ACL checking => send an AUTH seq#2 with \"\n\t\t\t\t\"Status code = %d\\n\", MLME_UNSPECIFY_FAIL));\n\t\treturn;\n    }\n\n\tif ((Alg == AUTH_MODE_OPEN) && \n\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode != Ndis802_11AuthModeShared)) \n\t{\n\t\tif (!pEntry)\n\t\t\tpEntry = MacTableInsertEntry(pAd, Addr2, apidx, OPMODE_AP, TRUE);\n\n\t\tif (pEntry)\n\t\t{\n                        {\n\t\t\tpEntry->AuthState = AS_AUTH_OPEN;\n\t\t\tpEntry->Sst = SST_AUTH; /* what if it already in SST_ASSOC ??????? */\n                        }\n\t\t\tAPPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_SUCCESS);\n\n\t\t}\n\t\telse\n\t\t\t; /* MAC table full, what should we respond ????? */\n\t}\n\telse if ((Alg == AUTH_MODE_KEY) && \n\t\t\t\t((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeShared)\n\t\t\t\t|| (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeAutoSwitch)))\n\t{\n\t\tif (!pEntry)\n\t\t\tpEntry = MacTableInsertEntry(pAd, Addr2, apidx, OPMODE_AP, TRUE);\n\n\t\tif (pEntry)\n\t\t{\n\t\t\tpEntry->AuthState = AS_AUTHENTICATING;\n\t\t\tpEntry->Sst = SST_NOT_AUTH; /* what if it already in SST_ASSOC ??????? */\n\n\t\t\t/* log this STA in AuthRspAux machine, only one STA is stored. If two STAs using */\n\t\t\t/* SHARED_KEY authentication mingled together, then the late comer will win. */\n\t\t\tCOPY_MAC_ADDR(&pAd->ApMlmeAux.Addr, Addr2);\n\t\t\tfor(i=0; i<CIPHER_TEXT_LEN; i++) \n\t\t\t\tpAd->ApMlmeAux.Challenge[i] = RandomByte(pAd);\n\n\t\t\tRspReason = 0;\n\t\t\tSeq++;\n  \n\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t\treturn;  /* if no memory, can't do anything */\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Send AUTH seq#2 (Challenge)\\n\"));\n\n\t\t\tMgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, \tAddr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\tMakeOutgoingFrame(pOutBuffer,            &FrameLen,\n\t\t\t\t\t\t\t\tsizeof(HEADER_802_11), &AuthHdr,\n\t\t\t\t\t\t\t\t2,                     &Alg,\n\t\t\t\t\t\t\t\t2,                     &Seq,\n\t\t\t\t\t\t\t\t2,                     &RspReason,\n\t\t\t\t\t\t\t\t1,                     &ChTxtIe,\n\t\t\t\t\t\t\t\t1,                     &ChTxtLen,\n\t\t\t\t\t\t\t\tCIPHER_TEXT_LEN,       pAd->ApMlmeAux.Challenge,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t}\n\t\telse\n\t\t\t; /* MAC table full, what should we respond ???? */\n\t} \n\telse\n\t{\n\t\t/* wrong algorithm */\n\t\tAPPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_ALG_NOT_SUPPORT);\n\n\t\t/* If this STA exists, delete it. */\n\t\tif (pEntry)\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Alg=%d, Seq=%d, AuthMode=%d\\n\",\n\t\t\t\tAlg, Seq, pAd->ApCfg.MBSSID[apidx].AuthMode));\n\t}\n}\n\n\nstatic VOID APPeerAuthConfirmAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT          Seq, Alg, Status;\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tPHEADER_802_11  pRcvHdr;\n\tCHAR            Chtxt[CIPHER_TEXT_LEN];\n\tMAC_TABLE_ENTRY *pEntry;\n\tUCHAR\t\t\tAddr1[MAC_ADDR_LEN];\n\tUINT32\t\t\tapidx;\n\n\n\n\n\tif (! APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1,\n\t\t\t\t\t\t\tAddr2, &Alg, &Seq, &Status, Chtxt\n\t\t)) \n\t\treturn;\n\n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\t\n\t\tif (RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN))\n\t\t\tbreak;\n\t}\n\n\tif (apidx >= pAd->ApCfg.BssidNum)\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Bssid not found\\n\"));\n\t\treturn;\n\t}\n\n\tif ((pAd->ApCfg.MBSSID[apidx].MSSIDDev != NULL) &&\n\t\t!(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev)))\n\t{\n    \tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Bssid IF didn't up yet.\\n\"));\n\t   \treturn;\n\t} /* End of if */\n\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AUTH - Invalid wcid (%d).\\n\", Elem->Wcid));\t\t\n\t\treturn; \n\t}\n\n\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t{\n\t\tif (!RTMPEqualMemory(Addr1, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, MAC_ADDR_LEN))\n\t\t{\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tpEntry = NULL;\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"AUTH - Bssid does not match\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pEntry->bIAmBadAtheros == TRUE)\n\t\t\t{\n\t\t\t\tAsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, FALSE);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Atheros Problem. Turn on RTS/CTS!!!\\n\"));\n\t\t\t\tpEntry->bIAmBadAtheros = FALSE;\n\t\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\t\tBASessionTearDownALL(pAd, pEntry->Aid);\n#endif /* DOT11_N_SUPPORT */\n\t\t\tASSERT(pEntry->Aid == Elem->Wcid);\n\t\t}\n\t}\n\n    pRcvHdr = (PHEADER_802_11)(Elem->Msg);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%d, Status=%d from \"\n\t\t\t\"[wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tapidx, Seq, Alg, Status, Elem->Wcid, PRINT_MAC(Addr2)));\n\n\tif (pEntry && MAC_ADDR_EQUAL(Addr2, pAd->ApMlmeAux.Addr)) \n\t{\n\t\tif ((pRcvHdr->FC.Wep == 1) &&\n\t\t\tNdisEqualMemory(Chtxt, pAd->ApMlmeAux.Challenge, CIPHER_TEXT_LEN)) \n\t\t{\n\t\t\t/* Successful */\n\t\t\tAPPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_SUCCESS);\n\t\t\tpEntry->AuthState = AS_AUTH_KEY;\n\t\t\tpEntry->Sst = SST_AUTH;\n\t\t}\n\t\telse \n\t\t{\n\t\n\t\t\t/* send wireless event - Authentication rejected because of challenge failure */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_AUTH_REJECT_CHALLENGE_FAILURE, pEntry->Addr, 0, 0);  \n\n\t\t\t/* fail - wep bit is not set or challenge text is not equal */\n\t\t\tAPPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_REJ_CHALLENGE_FAILURE);\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\n\t\t\t/*Chtxt[127]='\\0'; */\n\t\t\t/*pAd->ApMlmeAux.Challenge[127]='\\0'; */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"%s\\n\", ((pRcvHdr->FC.Wep == 1) ? \"challenge text is not equal\" : \"wep bit is not set\")));\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"Sent Challenge = %s\\n\",&pAd->ApMlmeAux.Challenge[100])); */\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"Rcv Challenge = %s\\n\",&Chtxt[100])); */\n\t\t}\n\t} \n\telse \n\t{\n\t\t/* fail for unknown reason. most likely is AuthRspAux machine be overwritten by another */\n\t\t/* STA also using SHARED_KEY authentication */\n\t\tAPPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, Alg, Seq + 1, MLME_UNSPECIFY_FAIL);\n\n\t\t/* If this STA exists, delete it. */\n\t\tif (pEntry)\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t}\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Some STA/AP\n    Note:\n        This action should never trigger AUTH state transition, therefore we\n        separate it from AUTH state machine, and make it as a standalone service\n    ==========================================================================\n */\nVOID APCls2errAction(\n    IN PRTMP_ADAPTER pAd, \n\tIN \tULONG Wcid, \n    IN\tPHEADER_802_11\tpHeader) \n{\n    HEADER_802_11 Hdr;\n    PUCHAR        pOutBuffer = NULL;\n    NDIS_STATUS   NStatus;\n    ULONG         FrameLen = 0;\n    USHORT        Reason = REASON_CLS2ERR;\n    MAC_TABLE_ENTRY *pEntry = NULL;\n\n\n\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tpEntry = &(pAd->MacTab.Content[Wcid]);\n\t}\n\n    if (pEntry && IS_ENTRY_CLIENT(pEntry))\n    {\n        /*ApLogEvent(pAd, pAddr, EVENT_DISASSOCIATED); */\n        MacTableDeleteEntry(pAd, pEntry->Aid, pHeader->Addr2);\n\t}\n\telse\n\t{\n\t\tUCHAR bssid[MAC_ADDR_LEN];\n\n\t\tNdisMoveMemory(bssid, pHeader->Addr1, MAC_ADDR_LEN);\n\t\tbssid[5] &= pAd->ApCfg.MacMask;\n\n\t\tif (NdisEqualMemory(pAd->CurrentAddress, bssid, MAC_ADDR_LEN) == 0)\n\t\t\treturn;\n\t}\n\n\t/* send out DEAUTH request frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"AUTH - Class 2 error, Send DEAUTH frame to \"\n\t\t\t\"%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tPRINT_MAC(pHeader->Addr2)));\n\n\tMgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pHeader->Addr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpHeader->Addr1,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpHeader->Addr1);\n\tMakeOutgoingFrame(pOutBuffer,            &FrameLen, \n\t\t\t\t\t  sizeof(HEADER_802_11), &Hdr, \n\t\t\t\t\t  2,                     &Reason, \n\t\t\t\t\t  END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Send out a Authentication (response) frame\n    ==========================================================================\n*/\nVOID APPeerAuthSimpleRspGenAndSend(\n    IN PRTMP_ADAPTER pAd, \n    IN PHEADER_802_11 pHdr, \n    IN USHORT Alg, \n    IN USHORT Seq, \n    IN USHORT StatusCode) \n{\n    HEADER_802_11     AuthHdr;\n    ULONG             FrameLen = 0;\n    PUCHAR            pOutBuffer = NULL;\n    NDIS_STATUS       NStatus;\n\n\n    NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n    if (NStatus != NDIS_STATUS_SUCCESS) \n        return;\n\n    if (StatusCode == MLME_SUCCESS)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"AUTH_RSP - Send AUTH response (SUCCESS)...\\n\"));\n\t}\n    else\n    {\n        /* For MAC wireless client(Macintosh), need to send AUTH_RSP with Status Code (fail reason code) to reject it. */\n        DBGPRINT(RT_DEBUG_TRACE, (\"AUTH_RSP - Peer AUTH fail (Status = %d)...\\n\", StatusCode));\n    }\n\n\tMgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr->Addr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpHdr->Addr1,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpHdr->Addr1);\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t\t  sizeof(HEADER_802_11),\t&AuthHdr,\n\t\t\t\t\t  2,\t\t\t\t\t\t&Alg,\n\t\t\t\t\t  2,\t\t\t\t\t\t&Seq,\n\t\t\t\t\t  2,\t\t\t\t\t\t&StatusCode,\n\t\t\t\t\t  END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n/* End of ap_auth.c */\n"
  },
  {
    "path": "src/ap/ap_autoChSel.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n \n    Module Name:\n \n    Abstract:\n*/\n\n\n#include \"rt_config.h\"\n#include \"ap_autoChSel.h\"\n\n\nextern UCHAR ZeroSsid[32];\n\nstatic inline INT GetABandChOffset(\n\tIN INT Channel)\n{\n#ifdef A_BAND_SUPPORT\n\tif ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel == 60) || (Channel == 100) || (Channel == 108) ||\n\t    (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157))\n\t{\n\t\treturn 1;\n\t}\n\telse if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) ||\n\t\t\t(Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel == 153) || (Channel == 161))\n\t{\n\t\treturn -1;\n\t}\n#endif /* A_BAND_SUPPORT */\n\treturn 0;\n}\n\nULONG AutoChBssSearchWithSSID(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR Bssid,\n\tIN PUCHAR pSsid,\n\tIN UCHAR SsidLen,\n\tIN UCHAR Channel)\n{\n\tUCHAR i;\n\tPBSSINFO pBssInfoTab = pAd->pBssInfoTab;\n\n\tif(pBssInfoTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pBssInfoTab equal NULL.\\n\"));\n\t\treturn (ULONG)BSS_NOT_FOUND;\n\t}\n\n\tfor (i = 0; i < pBssInfoTab->BssNr; i++) \n\t{\n\t\tif ((((pBssInfoTab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||\n\t\t\t((pBssInfoTab->BssEntry[i].Channel > 14) && (Channel > 14))) &&\n\t\t\tMAC_ADDR_EQUAL(&(pBssInfoTab->BssEntry[i].Bssid), Bssid) &&\n\t\t\t(SSID_EQUAL(pSsid, SsidLen, pBssInfoTab->BssEntry[i].Ssid, pBssInfoTab->BssEntry[i].SsidLen) ||\n\t\t\t(NdisEqualMemory(pSsid, ZeroSsid, SsidLen)) || \n\t\t\t(NdisEqualMemory(pBssInfoTab->BssEntry[i].Ssid, ZeroSsid, pBssInfoTab->BssEntry[i].SsidLen))))\n\t\t{ \n\t\t\treturn i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n\nstatic inline VOID AutoChBssEntrySet(\n\tOUT BSSENTRY *pBss, \n\tIN PUCHAR pBssid, \n\tIN CHAR Ssid[], \n\tIN UCHAR SsidLen, \n\tIN UCHAR Channel,\n\tIN UCHAR ExtChOffset,\n\tIN CHAR Rssi)\n{\n\tCOPY_MAC_ADDR(pBss->Bssid, pBssid);\n\tif (SsidLen > 0)\n\t{\n\t\t/* \n\t\t\tFor hidden SSID AP, it might send beacon with SSID len equal to 0,\n\t\t\tOr send beacon /probe response with SSID len matching real SSID length,\n\t\t\tbut SSID is all zero. such as \"00-00-00-00\" with length 4.\n\t\t\tWe have to prevent this case overwrite correct table\n\t\t*/\n\t\tif (NdisEqualMemory(Ssid, ZeroSsid, SsidLen) == 0)\n\t\t{\n\t\t\tNdisMoveMemory(pBss->Ssid, Ssid, SsidLen);\n\t\t\tpBss->SsidLen = SsidLen;\n\t\t}\n\t}\n\n\tpBss->Channel = Channel;\n\tpBss->ExtChOffset = ExtChOffset;\n\tpBss->Rssi = Rssi;\n\n\treturn;\n}\n\nstatic inline VOID AutoChBssTableReset(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->pBssInfoTab)\n\t\tNdisZeroMemory(pAd->pBssInfoTab, sizeof(BSSINFO));\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pBssInfoTab equal NULL.\\n\"));\n\n\treturn;\n}\n\nstatic VOID ChannelInfoReset(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->pChannelInfo)\n\t\tNdisZeroMemory(pAd->pChannelInfo, sizeof(CHANNELINFO));\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pChannelInfo equal NULL.\\n\"));\n\n\treturn;\n}\n\nVOID UpdateChannelInfo(\n\tIN PRTMP_ADAPTER pAd,\n\tIN int ch_index,\n\tIN ChannelSel_Alg Alg)\n{\n\tif(pAd->pChannelInfo != NULL)\n\t{\n\t\tUINT32\tBusyTime;\n\n\t\tif ( Alg == ChannelAlgCCA )\n\t\t{\n\t\t\tRX_STA_CNT1_STRUC RxStaCnt1;\n\t\t\tRTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);\n\t\t\tpAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;\n\t\t\tpAd->pChannelInfo->FalseCCA[ch_index] = RxStaCnt1.field.FalseCca;\n\t\t}\n\n\n\t\t/*\n\t\t\tdo busy time statistics for primary channel\n\t\t\tscan time 400ms, beacon interval 100 ms\n\t\t*/\n\n\t\tRTMP_IO_READ32(pAd, CH_BUSY_STA, &BusyTime);\n#ifdef AP_QLOAD_SUPPORT\n\t\tpAd->pChannelInfo->chanbusytime[ch_index] = (BusyTime * 100) / AUTO_CHANNEL_SEL_TIMEOUT;\n#endif /* AP_QLOAD_SUPPORT */\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pChannelInfo equal NULL.\\n\"));\n\n\treturn;\n}\n\nstatic inline INT GetChIdx(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Channel)\n{\n\tINT Idx;\n\n\tIdx = -1;\n\tfor (Idx = 0; Idx < pAd->ChannelListNum; Idx++)\n\t{\n\t\tif (Channel == pAd->ChannelList[Idx].Channel)\n\t\t\tbreak;\n\t}\n\n\treturn Idx;\n}\n\nstatic inline VOID AutoChannelSkipListSetDirty(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUCHAR i;\n\tfor (i=0; i < pAd->ApCfg.AutoChannelSkipListNum ; i++)\n\t{\n\t\t\tUCHAR channel_idx = GetChIdx(pAd, pAd->ApCfg.AutoChannelSkipList[i]);\n\t\t\tif ( channel_idx != pAd->ChannelListNum )\n\t\t\t{\n\t\t\t\tpAd->pChannelInfo->SkipList[channel_idx] = TRUE;\n\t\t\t}\n\t}\n}\n\nstatic inline BOOLEAN AutoChannelSkipListCheck(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tCh)\n{\n\tUCHAR i;\n\tBOOLEAN result = FALSE;\n\n\tfor (i=0; i < pAd->ApCfg.AutoChannelSkipListNum ; i++)\n\t{\n\t\tif (Ch == pAd->ApCfg.AutoChannelSkipList[i])\n\t\t{\n\t\t\tresult = TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn result;\n}\n\nstatic inline BOOLEAN BW40_ChannelCheck(\n\tIN UCHAR ch)\n{\n\tINT i;\n\tBOOLEAN result = TRUE;\n\tUCHAR NorBW40_CH[] = {140, 165};\n\tUCHAR NorBW40ChNum = sizeof(NorBW40_CH) / sizeof(UCHAR);\n\n\tfor (i=0; i<NorBW40ChNum; i++)\n\t{\n\t\tif (ch == NorBW40_CH[i])\n\t\t{\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nstatic inline UCHAR SelectClearChannelRandom(\n\tIN PRTMP_ADAPTER pAd\n\t)\n{\n\tUCHAR cnt, ch = 0, i, RadomIdx;\n\t/*BOOLEAN bFindIt = FALSE;*/\n\tUINT8 TempChList[MAX_NUM_OF_CHANNELS] = {0};\n\t\n\tif (pAd->CommonCfg.bIEEE80211H)\n\t{\n\t\tcnt = 0;\n\t\t\n\t\t/* Filter out an available channel list */\n\t\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t\t{\n\t\t\t/* Check DFS channel RemainingTimeForUse */\n\t\t\tif (pAd->ChannelList[i].RemainingTimeForUse)\n\t\t\t\tcontinue;\n\n\t\t\t/* Check skip channel list */\n\t\t\tif (AutoChannelSkipListCheck(pAd, pAd->ChannelList[i].Channel) == TRUE)\n\t\t\t\tcontinue;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* Check N-group of BW40 */\n\t\t\tif (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 &&\n\t\t\t\t!(pAd->ChannelList[i].Flags & CHANNEL_40M_CAP))\n\t\t\t\tcontinue;\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t/* Store available channel to temp list */\n\t\t\tTempChList[cnt++] = pAd->ChannelList[i].Channel;\n\t\t}\n\n\t\t/* Randomly select a channel from temp list */\n\t\tif (cnt)\n\t\t{\n\t\t\tRadomIdx = RandomByte2(pAd)%cnt;\n\t\t\tch = TempChList[RadomIdx];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tch = FirstChannel(pAd);\n\t\t}\n\t\t\n\t}\n\telse\n\t{\n\t\tch = pAd->ChannelList[RandomByte2(pAd)%pAd->ChannelListNum].Channel;\n\t\tif (ch == 0)\n\t\t\tch = FirstChannel(pAd);\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s(): Select Channel %d\\n\", __FUNCTION__, ch));\n\treturn ch;\n\n}\n\n/* \n\t==========================================================================\n\tDescription:\n        This routine calaulates the dirtyness of all channels by the \n        CCA value  and Rssi. Store dirtyness to pChannelInfo strcut.\n\t\tThis routine is called at iwpriv cmmand or initialization. It chooses and returns \n\t\ta good channel whith less interference.\n\tReturn:\n\t\tch -  channel number that\n\tNOTE:\n\t==========================================================================\n */\nstatic inline UCHAR SelectClearChannelCCA(\n\tIN PRTMP_ADAPTER pAd\n\t)\n{\n\t#define CCA_THRESHOLD (100)\n\n\tPBSSINFO pBssInfoTab = pAd->pBssInfoTab;\n\tPCHANNELINFO pChannelInfo = pAd->pChannelInfo;\n\tINT ch = 1, channel_idx, BssTab_idx;\n\tBSSENTRY *pBss;\n\tUINT32 min_dirty, min_falsecca;\n\tint candidate_ch;\n\tUCHAR  ExChannel[2] = {0}, candidate_ExChannel[2] = {0};\t\n\tUCHAR base;\n\n\tif(pBssInfoTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pBssInfoTab equal NULL.\\n\"));\n\t\treturn (FirstChannel(pAd));\n\t}\n\n\tif(pChannelInfo == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pChannelInfo equal NULL.\\n\"));\n\t\treturn (FirstChannel(pAd));\n\t}\n\n\tfor (BssTab_idx = 0; BssTab_idx < pBssInfoTab->BssNr; BssTab_idx++)\n\t{\n\t\tpBss = &(pBssInfoTab->BssEntry[BssTab_idx]);\n\t\tchannel_idx = GetChIdx(pAd, pBss->Channel);\n\t\tif (channel_idx < 0 )\n\t\t\tcontinue;\n\n\n\t\tif (pBss->Rssi >= RSSI_TO_DBM_OFFSET-50)\n\t\t{\n\t\t\t/* high signal >= -50 dbm */\n\t\t\tpChannelInfo->dirtyness[channel_idx] += 50;\n\t\t}\n\t\telse if (pBss->Rssi <= RSSI_TO_DBM_OFFSET-80)\n\t\t{\n\t\t\t/* low signal <= -80 dbm */\n\t\t\tpChannelInfo->dirtyness[channel_idx] += 30;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* mid signal -50 ~ -80 dbm */\n\t\t\tpChannelInfo->dirtyness[channel_idx] += 40;\n\t\t}\n\n\t\tpChannelInfo->dirtyness[channel_idx] += 40;\n\n\t\t{\n\t\t\tINT BelowBound;\n\t\t\tINT AboveBound;\n\t\t\tINT loop;\n\n\t\t\tswitch(pBss->ExtChOffset)\n\t\t\t{\n\t\t\t\tcase EXTCHA_ABOVE:\n\t\t\t\t\tBelowBound = pChannelInfo->IsABand ? 1 : 4;\n\t\t\t\t\tAboveBound = pChannelInfo->IsABand ? 2 : 8;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EXTCHA_BELOW:\n\t\t\t\t\tBelowBound = pChannelInfo->IsABand ? 2 : 8;\n\t\t\t\t\tAboveBound = pChannelInfo->IsABand ? 1 : 4;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tBelowBound = pChannelInfo->IsABand ? 1 : 4;\n\t\t\t\t\tAboveBound = pChannelInfo->IsABand ? 1 : 4;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* check neighbor channel */\n\t\t\tfor (loop = (channel_idx+1); loop <= (channel_idx+AboveBound); loop++)\n\t\t\t{\n\t\t\t\tif (loop >= MAX_NUM_OF_CHANNELS)\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (pAd->ChannelList[loop].Channel - pAd->ChannelList[loop-1].Channel > 4)\n\t\t\t\t\tbreak;\n\n\t\t\t\tpChannelInfo->dirtyness[loop] += ((9 - (loop - channel_idx)) * 4);\n\t\t\t}\n            /* check neighbor channel */\n\t\t\tfor (loop=(channel_idx-1); loop >= (channel_idx-BelowBound); loop--)\n\t\t\t{\n\t\t\t\tif (loop < 0)\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (pAd->ChannelList[loop+1].Channel - pAd->ChannelList[loop].Channel > 4)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tpChannelInfo->dirtyness[loop] +=\n\t\t\t\t\t((9 - (channel_idx - loop)) * 4);\n\t\t\t}\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\" ch%d bssid=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpBss->Channel, pBss->Bssid[0], pBss->Bssid[1], pBss->Bssid[2], pBss->Bssid[3], pBss->Bssid[4], pBss->Bssid[5]));\n\t}\n\t\t\t\n\tAutoChannelSkipListSetDirty(pAd);\t\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"=====================================================\\n\"));\n\tfor (channel_idx = 0; channel_idx < pAd->ChannelListNum; channel_idx++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel %d : Dirty = %ld, False CCA = %u, Busy Time = %u, Skip Channel = %s\\n\",\n\t\t\t\t\tpAd->ChannelList[channel_idx].Channel,\n\t\t\t\t\tpChannelInfo->dirtyness[channel_idx],\n\t\t\t\t\tpChannelInfo->FalseCCA[channel_idx],\n#ifdef AP_QLOAD_SUPPORT\n\t\t\t\t\tpChannelInfo->chanbusytime[channel_idx],\n#else\n\t\t\t\t\t0,\n#endif /* AP_QLOAD_SUPPORT */\n\t\t\t\t\t(pChannelInfo->SkipList[channel_idx] == TRUE) ? \"TRUE\" : \"FALSE\"));\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"=====================================================\\n\"));\n\n\tmin_dirty = min_falsecca = 0xFFFFFFFF;\n\n\t/* \n\t * Rule 1. Pick up a good channel that False_CCA =< CCA_THRESHOLD \n\t *\t\t   by dirtyness\n\t */\n\tcandidate_ch = -1;\n\t\n\tfor (channel_idx = 0; channel_idx < pAd->ChannelListNum; channel_idx++)\n\t{\n\t\tif (pChannelInfo->SkipList[channel_idx] == TRUE)\n\t\t\tcontinue;\n\n\t\tif (pChannelInfo->FalseCCA[channel_idx] <= CCA_THRESHOLD)\n\t\t{\n\t\t\tUINT32 dirtyness = pChannelInfo->dirtyness[channel_idx];\n\t\t\tch = pAd->ChannelList[channel_idx].Channel;\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t\t/* QLOAD ALARM */\n\t\t\t/* when busy time of a channel > threshold, skip it */\n\t\t\t/* TODO: Use weight for different references to do channel selection */\n\t\t\tif (QBSS_LoadIsBusyTimeAccepted(pAd,\n\t\t\t\tpChannelInfo->chanbusytime[channel_idx]) == FALSE)\n\t\t\t{\n\t\t\t\t/* check next one */\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* AP_QLOAD_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/*\n\t\t\t\tUser require 40MHz Bandwidth.\n\t\t\t\tIn the case, ignor all channel\n\t\t\t\tdoesn't support 40MHz Bandwidth.\n\t\t\t*/\n\t\t\tif ((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t\t&& (pChannelInfo->IsABand && (GetABandChOffset(ch) == 0)))\n\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\tNeed to Consider the dirtyness of extending channel\n\t\t\t\tin 40 MHz bandwidth channel.\n\t\t\t*/\n\t\t\tif (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t{\n\t\t\t\tif (pAd->pChannelInfo->IsABand)\n\t\t\t\t{\n\t\t\t\t\tif (((channel_idx + GetABandChOffset(ch)) >=0)\n\t\t\t\t\t\t&& ((channel_idx + GetABandChOffset(ch)) < pAd->ChannelListNum))\n\t\t\t\t\t{\n\t\t\t\t\t\tINT ChOffsetIdx = channel_idx + GetABandChOffset(ch);\n\t\t\t\t\t\tdirtyness += pChannelInfo->dirtyness[ChOffsetIdx];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUCHAR ExChannel_idx = 0;\n\t\t\t\t\tif (pAd->ChannelList[channel_idx].Channel == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\tdirtyness = 0xFFFFFFFF;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(ExChannel, sizeof(ExChannel));\n\t\t\t\t\t\tif (((channel_idx - 4) >=0) && ((channel_idx - 4) < pAd->ChannelListNum))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdirtyness += pChannelInfo->dirtyness[channel_idx - 4];\n\t\t\t\t\t\t\tExChannel[ExChannel_idx++] = pAd->ChannelList[channel_idx - 4].Channel;\n\t\t\t\t\t    }\n\n\t\t\t\t\t\tif (((channel_idx + 4) >=0) && ((channel_idx + 4) < pAd->ChannelListNum))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t    dirtyness += pChannelInfo->dirtyness[channel_idx + 4];\n\t\t\t\t\t\t    ExChannel[ExChannel_idx++] = pAd->ChannelList[channel_idx + 4].Channel;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tif ((min_dirty > dirtyness))\n\t\t\t{\n\t\t\t\tmin_dirty = dirtyness;\n\t\t\t\tcandidate_ch = channel_idx;\n\t\t\t\tNdisMoveMemory(candidate_ExChannel, ExChannel, 2);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (candidate_ch >= 0)\n\t{\n\t\tch = pAd->ChannelList[candidate_ch].Channel;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rule 1 CCA value : Min Dirtiness (Include extension channel) ==> Select Channel %d \\n\", ch));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Min Dirty = %u\\n\", min_dirty));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ExChannel = %d , %d\\n\", candidate_ExChannel[0], candidate_ExChannel[1]));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BW        = %s\\n\", (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)? \"40\" : \"20\"));\n\t\treturn ch;\n\t}\n\n\t/*\n\t * Rule 2. Pick up a good channel that False_CCA > CCA_THRESHOLD \n\t *\t\t   by FalseCCA (FalseCCA + Dirtyness)\n\t */\n\tcandidate_ch = -1;\n\tfor (channel_idx = 0; channel_idx < pAd->ChannelListNum; channel_idx++)\n\t{\n\t\tif (pChannelInfo->SkipList[channel_idx] == TRUE)\n\t\t\tcontinue;\n\t\t\n\t\tif (pChannelInfo->FalseCCA[channel_idx] > CCA_THRESHOLD)\n\t\t{\n\t\t\tUINT32 falsecca = pChannelInfo->FalseCCA[channel_idx] + pChannelInfo->dirtyness[channel_idx];\n\t\t\tch = pAd->ChannelList[channel_idx].Channel;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\tif ((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t\t&& (pChannelInfo->IsABand && (GetABandChOffset(ch) == 0)))\n\t\t\t\tcontinue;\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tif ((GetABandChOffset(ch) != 0)\n\t\t\t\t\t&& ((channel_idx + GetABandChOffset(ch)) >=0)\n\t\t\t\t\t&& ((channel_idx + GetABandChOffset(ch)) < pAd->ChannelListNum))\n\t\t\t{\n\t\t\t\tINT ChOffsetIdx = channel_idx + GetABandChOffset(ch);\n\t\t\t\tfalsecca += (pChannelInfo->FalseCCA[ChOffsetIdx] +\n\t\t\t\t\t\t\tpChannelInfo->dirtyness[ChOffsetIdx]);\n\t\t\t}\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t\t/* QLOAD ALARM */\n\t\t\t/* when busy time of a channel > threshold, skip it */\n\t\t\t/* TODO: Use weight for different references to do channel selection */\n\t\t\tif (QBSS_LoadIsBusyTimeAccepted(pAd,\n\t\t\t\tpChannelInfo->chanbusytime[channel_idx]) == FALSE)\n\t\t\t{\n\t\t\t\t/* check next one */\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* AP_QLOAD_SUPPORT */\n\n\t\t\tif ((min_falsecca > falsecca))\n\t\t\t{\n\t\t\t\tmin_falsecca = falsecca;\n\t\t\t\tcandidate_ch = channel_idx;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (candidate_ch >= 0)\n\t{\n\t\tch = pAd->ChannelList[candidate_ch].Channel;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rule 2 CCA value : Min False CCA value ==> Select Channel %d, min falsecca = %d \\n\", ch, min_falsecca));\n\t\treturn\tch;\n\t}\n\n\tbase = RandomByte2(pAd);\n\tfor (channel_idx=0 ; channel_idx < pAd->ChannelListNum ; channel_idx++)\n\t{\n\t\tch = pAd->ChannelList[(base + channel_idx) % pAd->ChannelListNum].Channel;\n\t\n\t\tif (AutoChannelSkipListCheck(pAd, ch))\n\t\t\tcontinue;\n\t\t\n\t\tif ((pAd->ApCfg.bAvoidDfsChannel == TRUE)\n\t\t\t&& (pChannelInfo->IsABand == TRUE)\n\t\t\t&& RadarChannelCheck(pAd, ch))\n\t\t\tcontinue;\n\n\t\tbreak;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Rule 3 CCA value : Randomly Select ==> Select Channel %d\\n\", ch));\n\treturn ch;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n        This routine calaulates the dirtyness of all channels by the dirtiness value and \n        number of AP in each channel and stores in pChannelInfo strcut.\n\t\tThis routine is called at iwpriv cmmand or initialization. It chooses and returns \n\t\ta good channel whith less interference.\n\tReturn:\n\t\tch -  channel number that\n\tNOTE:\n\t==========================================================================\n */\n\nstatic inline UCHAR SelectClearChannelApCnt(\n\tIN PRTMP_ADAPTER pAd\n\t)\n{\n    /*PBSSINFO pBssInfoTab = pAd->pBssInfoTab; */\n\tPCHANNELINFO pChannelInfo = pAd->pChannelInfo;\n\t/*BSSENTRY *pBss; */\n\tUCHAR channel_index = 0,dirty,base = 0;\n\tUCHAR final_channel = 0;\n\n \n\tif(pChannelInfo == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pChannelInfo equal NULL.\\n\"));\n\t\treturn (FirstChannel(pAd));\n\t}\n\t\n\t/* Calculate Dirtiness */\n\t\n\tfor (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++)\n\t{\n\t\tif (pChannelInfo->ApCnt[channel_index] > 0)\n\t    {\n\t\t    INT ll;\n\t\t    pChannelInfo->dirtyness[channel_index] += 30;\n\n            /*5G */\n\t\t    if (pChannelInfo->IsABand)\n\t\t    {\n\t\t\t    int Channel = pAd->ChannelList[channel_index].Channel;\n\t\t\t\t\n\t\t\t    /*Make secondary channel dirty */\n\t\t\t    if(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t    {\n\t\t\t\t\tif (Channel > 14)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel== 60) \n\t\t\t\t\t\t\t|| (Channel == 100) || (Channel == 108) || (Channel == 116) \n\t\t\t\t\t\t\t|| (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (channel_index + 1 < MAX_NUM_OF_CHANNELS)\n\t\t\t\t\t\t\t\tif(pAd->ChannelList[channel_index+1].Channel - pAd->ChannelList[channel_index].Channel == 4)\n\t\t\t\t\t\t\t\t\tpChannelInfo->dirtyness[channel_index+1] += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((Channel == 40) || (Channel == 48) || (Channel == 56) || \n\t\t\t\t\t\t\t(Channel == 64) || (Channel == 104) || (Channel == 112) ||\n\t\t\t\t\t\t\t\t(Channel == 120) || (Channel == 128) || (Channel == 136) || \n\t\t\t\t\t\t\t\t(Channel== 153) || (Channel == 161))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(channel_index - 1 >= 0)\n\t\t\t\t\t\t\t\tif(pAd->ChannelList[channel_index].Channel - pAd->ChannelList[channel_index-1].Channel == 4)\n\t\t\t\t\t\t\t\t\tpChannelInfo->dirtyness[channel_index-1] += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*2.4G */\n\t\t\tif (!pChannelInfo->IsABand)\n\t\t\t{\n\t\t\t\tint ChanOffset = 0;\n\n\t\t\t\tif((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)&&\n\t\t\t\t(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW)) \n\t\t\t\t{\n\t\t\t\t/*\t\n\t\t\t\t\tBW is 40Mhz\n\t\t\t\t\tthe distance between two channel to prevent interference\n\t\t\t\t\tis 4 channel width plus 4 channel width (secondary channel)\n\t\t\t\t*/\n\t\t\t\t\tChanOffset = 8;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tBW is 20Mhz\n\t\t\t\t\tThe channel width of 2.4G band is 5Mhz.\n\t\t\t\t\tThe distance between two channel to prevent interference is 4 channel width\n\t\t\t\t*/\n\t\t\t\t\tChanOffset = 4;\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\tfor (ll = channel_index + 1; ll < (channel_index + ChanOffset + 1); ll++)\n\t\t\t\t{\n\t\t\t\t\tif (ll < MAX_NUM_OF_CHANNELS)\n\t\t\t\t\t\tpChannelInfo->dirtyness[ll]++;\n\t\t\t\t}\n\n\t\t\t\tif((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)&&\n\t\t\t\t\t(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)) \n\t\t\t\t{\n\t\t\t\t\t/* BW is 40Mhz */\n\t\t\t\t\tChanOffset = 8;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* BW is 20Mhz */\n\t\t\t\t\tChanOffset = 4;\n\t\t\t\t}\n\n\t\t\t\tfor (ll = channel_index - 1; ll > (channel_index - ChanOffset - 1); ll--)\n\t\t\t\t{\n\t\t\t\t\tif (ll >= 0)\n\t\t\t\t\t\tpChannelInfo->dirtyness[ll]++;\n\t\t\t\t}\n\t\t\t}\n    \t}       \n   }/* Calculate Dirtiness */\n\n\tAutoChannelSkipListSetDirty(pAd);\n\t\n   DBGPRINT(RT_DEBUG_TRACE, (\"=====================================================\\n\"));\n   for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++)\n   /* debug messages */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel %d : Dirty = %ld, ApCnt=%ld, Busy Time = %d, Skip Channel = %s\\n\", \n\t\t\t\tpAd->ChannelList[channel_index].Channel,\n\t\t\t\tpChannelInfo->dirtyness[channel_index], \n\t\t\t\tpChannelInfo->ApCnt[channel_index],\n#ifdef AP_QLOAD_SUPPORT\n\t\t\t\tpChannelInfo->chanbusytime[channel_index],\n#else\n\t\t\t\t0,\n#endif /* AP_QLOAD_SUPPORT */\n\t\t\t\t(pChannelInfo->SkipList[channel_index] == TRUE) ? \"TRUE\" : \"FALSE\"));\n   DBGPRINT(RT_DEBUG_TRACE, (\"=====================================================\\n\"));\n   \n   pAd->ApCfg.AutoChannel_Channel = 0;\n\t\n\t/* RULE 1. pick up a good channel that no one used */\n\t\n\tfor (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++)\n\t{\n\t\tif (pChannelInfo->SkipList[channel_index] == TRUE)\n\t\t\tcontinue;\n\t\t\n\t     if ((pAd->ApCfg.bAvoidDfsChannel == TRUE)\n\t\t\t\t&&(pChannelInfo->IsABand == TRUE)\n\t\t\t\t&& RadarChannelCheck(pAd, pAd->ChannelList[channel_index].Channel))\n\t\t\tcontinue;\t\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t/* QLOAD ALARM */\n\t\tif (QBSS_LoadIsBusyTimeAccepted(pAd,\n\t\t\tpChannelInfo->chanbusytime[channel_index]) == FALSE)\n\t\t\tcontinue;\n#endif /* AP_QLOAD_SUPPORT */\n\t\t \n\t\tif (pChannelInfo->dirtyness[channel_index] == 0) break;\n\t}\n\tif (channel_index < pAd->ChannelListNum)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Rule 1 APCnt : dirtiness == 0 (no one used and no interference) ==> Select Channel %d\\n\", pAd->ChannelList[channel_index].Channel));\n\n\t\treturn pAd->ChannelList[channel_index].Channel;\n\t}\n\n\t/* RULE 2. if not available, then co-use a channel that's no interference (dirtyness=30) */\n\t/* RULE 3. if not available, then co-use a channel that has minimum interference (dirtyness=31,32) */\n\tfor (dirty = 30; dirty <= 32; dirty++)\n\t{\n\t\tBOOLEAN candidate[MAX_NUM_OF_CHANNELS+1], candidate_num=0;\n\t\tUCHAR min_ApCnt = 255;\n\t\tfinal_channel = 0;\t\n\t\t\n\t\tNdisZeroMemory(candidate, MAX_NUM_OF_CHANNELS+1);\n\t\tfor (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++)\n\t\t{\n\t\t\tif (pChannelInfo->SkipList[channel_index] == TRUE)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tif (pChannelInfo->dirtyness[channel_index] == dirty) \n\t\t\t{ \n\t\t\t\tcandidate[channel_index]=TRUE; \n\t\t\t\tcandidate_num++; \n\t\t\t}\n\t\t}\n\t\t/* if there's more than 1 candidate, pick up the channel with minimum RSSI */\n\t\tif (candidate_num)\n\t\t{\n\t\t\tfor (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++)\n\t\t\t{\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t\t\t/* QLOAD ALARM */\n\t\t\t\t/* when busy time of a channel > threshold, skip it */\n\t\t\t\t/* TODO: Use weight for different references to do channel selection */\n\t\t\t\tif (QBSS_LoadIsBusyTimeAccepted(pAd,\n\t\t\t\t\tpChannelInfo->chanbusytime[channel_index]) == FALSE)\n\t\t\t\t{\n\t\t\t\t\t/* check next one */\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n#endif /* AP_QLOAD_SUPPORT */\n\n\t\t\t\tif (candidate[channel_index] && (pChannelInfo->ApCnt[channel_index] < min_ApCnt))\n\t\t\t\t{\n\n\t\t\t\t\tif((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t\t\t\t&& (BW40_ChannelCheck(pAd->ChannelList[channel_index].Channel) == FALSE))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif ((pAd->ApCfg.bAvoidDfsChannel == TRUE)\n\t\t\t\t\t\t\t&&(pChannelInfo->IsABand == TRUE)\n\t\t\t\t\t\t\t&& RadarChannelCheck(pAd, pAd->ChannelList[channel_index].Channel))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tfinal_channel = pAd->ChannelList[channel_index].Channel;\n\t\t\t\t\tmin_ApCnt = pChannelInfo->ApCnt[channel_index];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (final_channel != 0)\n\t\t\t{\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Rule 2 APCnt : minimum APCnt with  minimum interference(dirtiness: 30~32) ==> Select Channel %d\\n\", final_channel));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\" Dirtiness = %d ,  Min ApCnt = %d\\n\", dirty, min_ApCnt));\n\t\t\t\treturn final_channel;\n\t\t\t}\n\t\t}\n\t}\n\t/* RULE 3. still not available, pick up the random channel */\n\tbase = RandomByte2(pAd);\n\n\tfor (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++)\n\t{\t\t\n\t\tfinal_channel = pAd->ChannelList[(base + channel_index) % pAd->ChannelListNum].Channel;\n\t\t\n\t\tif (AutoChannelSkipListCheck(pAd, final_channel))\n\t\t\tcontinue;\n\t\t\n\t\tif ((pAd->ApCfg.bAvoidDfsChannel == TRUE)\n\t\t\t&&(pChannelInfo->IsABand == TRUE)\n\t\t\t&& RadarChannelCheck(pAd, final_channel))\n\t\t\t\tcontinue;\t\t\t\n\n\t\tbreak;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Rule 3 APCnt : Randomly Select  ==> Select Channel %d\\n\",final_channel));\n\treturn final_channel;\n\t\n}\n\nULONG AutoChBssInsertEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pBssid,\n\tIN CHAR Ssid[],\n\tIN UCHAR SsidLen, \n\tIN UCHAR ChannelNo,\n\tIN UCHAR ExtChOffset,\n\tIN CHAR Rssi)\n{\n\tULONG\tIdx;\n\tPBSSINFO pBssInfoTab = pAd->pBssInfoTab;\n\n\tif(pBssInfoTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->pBssInfoTab equal NULL.\\n\"));\n\t\treturn BSS_NOT_FOUND;\n\t}\n\n\tIdx = AutoChBssSearchWithSSID(pAd, pBssid, (PUCHAR)Ssid, SsidLen, ChannelNo);\n\tif (Idx == BSS_NOT_FOUND) \n\t{\n\t\tif (pBssInfoTab->BssNr >= MAX_LEN_OF_BSS_TABLE)\n\t\t\treturn BSS_NOT_FOUND;\n\t\tIdx = pBssInfoTab->BssNr;\n\t\tAutoChBssEntrySet(&pBssInfoTab->BssEntry[Idx], pBssid, Ssid, SsidLen,\n\t\t\t\t\t\t\tChannelNo, ExtChOffset, Rssi);\n\t\tpBssInfoTab->BssNr++;\n\t} \n\telse\n\t{\n\t\tAutoChBssEntrySet(&pBssInfoTab->BssEntry[Idx], pBssid, Ssid, SsidLen,\n\t\t\t\t\t\t\tChannelNo, ExtChOffset, Rssi);\n\t}\n\n\treturn Idx;\n}\n\n\nvoid AutoChBssTableInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n/*\tpAd->pBssInfoTab = (PBSSINFO)kmalloc(sizeof(BSSINFO), GFP_ATOMIC); */\n\tos_alloc_mem(pAd, (UCHAR **)&pAd->pBssInfoTab, sizeof(BSSINFO));\n\tif (pAd->pBssInfoTab)\n\t\tNdisZeroMemory(pAd->pBssInfoTab, sizeof(BSSINFO));\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Fail to alloc memory for pAd->pBssInfoTab\", __FUNCTION__));\n\n\treturn;\n}\n\nvoid ChannelInfoInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n/*\tpAd->pChannelInfo = (PCHANNELINFO)kmalloc(sizeof(CHANNELINFO), GFP_ATOMIC); */\n\tos_alloc_mem(pAd, (UCHAR **)&pAd->pChannelInfo, sizeof(CHANNELINFO));\n\tif (pAd->pChannelInfo)\n\t\tNdisZeroMemory(pAd->pChannelInfo, sizeof(CHANNELINFO));\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Fail to alloc memory for pAd->pChannelInfo\", __FUNCTION__));\n\n\n\treturn;\n}\n\nvoid AutoChBssTableDestroy(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->pBssInfoTab)\n\t{\n/*\t\tkfree(pAd->pBssInfoTab); */\n\t\tos_free_mem(NULL, pAd->pBssInfoTab);\n\t\tpAd->pBssInfoTab = NULL;\n\t}\n\n\treturn;\n}\n\nvoid ChannelInfoDestroy(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->pChannelInfo)\n\t{\n/*\t\tkfree(pAd->pChannelInfo); */\n\t\tos_free_mem(NULL, pAd->pChannelInfo);\n\t\tpAd->pChannelInfo = NULL;\n\t}\n\n\treturn;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tThis routine sets the current PhyMode for calculating \n\t\tthe dirtyness.\n\tReturn:\n\t\tnone\n\tNOTE:\n\t==========================================================================\n */\nvoid CheckPhyModeIsABand(\n\tIN PRTMP_ADAPTER pAd)\n{\n\n\tpAd->pChannelInfo->IsABand = (WMODE_CAP_5G(pAd->CommonCfg.PhyMode)) ? TRUE : FALSE;\n\n\treturn;\n}\n\n\nUCHAR SelectBestChannel(\n\tIN PRTMP_ADAPTER pAd,\t\n\tIN ChannelSel_Alg Alg)\n{\n\tUCHAR ch = 0;\n\n\t/* init pAd->pChannelInfo->IsABand */\n\tCheckPhyModeIsABand(pAd);\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tif (Alg == ChannelAlgCCA)\n\t\tpAd->CommonCfg.MO_Cfg.bEnable = TRUE;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\tswitch ( Alg )\n\t{\n\t\tcase ChannelAlgRandom:\n\t\tcase ChannelAlgApCnt:\n\t\t\tch = SelectClearChannelApCnt(pAd);\n\t\t\tbreak;\n\t\tcase ChannelAlgCCA:\n\t\t\tch = SelectClearChannelCCA(pAd);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tch = SelectClearChannelCCA(pAd);\n\t\t\tbreak;\n\t}\n\n\tRTMPSendWirelessEvent(pAd, IW_CHANNEL_CHANGE_EVENT_FLAG, 0, 0, ch);\n\n\treturn ch;\n\n}\n\nVOID APAutoChannelInit(IN PRTMP_ADAPTER pAd)\n{\n\tUINT32 BusyTime;\n\n\t/* reset bss table */\n\tAutoChBssTableReset(pAd);\n\n\t/* clear Channel Info */\n\tChannelInfoReset(pAd);\n\n\t/* init pAd->pChannelInfo->IsABand */\n\tCheckPhyModeIsABand(pAd);\n\n\tpAd->ApCfg.current_channel_index = 0;\n\n\t/* read clear for primary channel */\n\tRTMP_IO_READ32(pAd, CH_BUSY_STA, &BusyTime);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tThis routine is called at initialization. It returns a channel number\n\t\tthat complies to regulation domain and less interference with current\n\t\tenviornment.\n\tReturn:\n\t\tch -  channel number that\n\tNOTE:\n\t\tThe retruned channel number is guaranteed to comply to current regulation\n\t\tdomain that recorded in pAd->CommonCfg.CountryRegion\n        Usage: \n               1.) iwpriv ra0 set AutoChannelSel=1\n                   Ues the number of AP and inference status to choose\n               2.) iwpriv ra0 set AutoChannelSel=2\n                   Ues the False CCA count and Rssi to choose\n\t==========================================================================\n */\nUCHAR APAutoSelectChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ChannelSel_Alg Alg)\n{\n\tUCHAR ch = 0, i;\n\n\t/* passive scan channel 1-14. collect statistics */\n\t\n\t/*\n\t\tIn the autochannel select case. AP didn't get channel yet.\n\t\tSo have no way to determine which Band AP used by channel number.\n\t*/\n\n\t/* Init some structures before doing AutoChannelSelect() */\n\tAPAutoChannelInit(pAd);\n\n\tif (( Alg == ChannelAlgRandom ) && (pAd->pChannelInfo->IsABand == TRUE))\n\t{   /*for Dfs */\n\t\tch = SelectClearChannelRandom(pAd);\n\t}\n\telse\n\t{\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t\tpAd->CommonCfg.MO_Cfg.bEnable = FALSE;\n\t\tASIC_MEASURE_FALSE_CCA(pAd);\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t\t/*find RSSI in each channel */\n\t\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t\t{\n\t\t\tAsicSwitchChannel(pAd, pAd->ChannelList[i].Channel, TRUE);\n\t\t\tAsicLockChannel(pAd, pAd->ChannelList[i].Channel);/*do nothing */\n\t\t\tpAd->ApCfg.current_channel_index = i;\n\n\t\t\tpAd->ApCfg.AutoChannel_Channel = pAd->ChannelList[i].Channel;\n\t\t\t\n#ifdef AP_QLOAD_SUPPORT\n\t\t\tif (QLOAD_DOES_ALARM_OCCUR(pAd))\n\t\t\t{   /* QLOAD ALARM, ever alarm from QLOAD module */\n\t\t\t\tOS_WAIT(400); /* wait for 400 ms at each channel. */\n\t\t\t}\n\t\t\telse\n#endif /* AP_QLOAD_SUPPORT */\n\t\t\t{\n\t\t\t\tOS_WAIT(200); /* wait for 200 ms at each channel. */\n\t\t\t}\n\n\t\t\tUpdateChannelInfo(pAd, i,Alg);\n\t\t}\n\n\t\tch = SelectBestChannel(pAd, Alg);\n\t}\n\t\t\n\treturn ch;\n}\n\n"
  },
  {
    "path": "src/ap/ap_cfg.c",
    "content": "/*\n *************************************************************************\n * Ralink Tech Inc.\n * 5F., No.36, Taiyuan St., Jhubei City,\n * Hsinchu County 302,\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * This program is free software; you can redistribute it and/or modify  *\n * it under the terms of the GNU General Public License as published by  *\n * the Free Software Foundation; either version 2 of the License, or     *\n * (at your option) any later version.                                   *\n *                                                                       *\n * This program is distributed in the hope that it will be useful,       *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of        *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\n * GNU General Public License for more details.                          *\n *                                                                       *\n * You should have received a copy of the GNU General Public License     *\n * along with this program; if not, write to the                         *\n * Free Software Foundation, Inc.,                                       *\n * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\n *                                                                       *\n *************************************************************************/\n\n\n#include \"rt_config.h\"\n\n\n#define A_BAND_REGION_0\t\t\t\t0\n#define A_BAND_REGION_1\t\t\t\t1\n#define A_BAND_REGION_2\t\t\t\t2\n#define A_BAND_REGION_3\t\t\t\t3\n#define A_BAND_REGION_4\t\t\t\t4\n#define A_BAND_REGION_5\t\t\t\t5\n#define A_BAND_REGION_6\t\t\t\t6\n#define A_BAND_REGION_7\t\t\t\t7\n#define A_BAND_REGION_8\t\t\t\t8\n#define A_BAND_REGION_9\t\t\t\t9\n#define A_BAND_REGION_10\t\t\t10\n\n#define G_BAND_REGION_0\t\t\t\t0\n#define G_BAND_REGION_1\t\t\t\t1\n#define G_BAND_REGION_2\t\t\t\t2\n#define G_BAND_REGION_3\t\t\t\t3\n#define G_BAND_REGION_4\t\t\t\t4\n#define G_BAND_REGION_5\t\t\t\t5\n#define G_BAND_REGION_6\t\t\t\t6\n\nCOUNTRY_CODE_TO_COUNTRY_REGION allCountry[] = {\n\t/* {Country Number, ISO Name, Country Name, Support 11A, 11A Country Region, Support 11G, 11G Country Region} */\n\t{0,\t\t\"DB\",\t\"Debug\",\t\t\t\tTRUE,\tA_BAND_REGION_7,\tTRUE,\tG_BAND_REGION_5},\n\t{8,\t\t\"AL\",\t\"ALBANIA\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{12,\t\"DZ\",\t\"ALGERIA\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{32,\t\"AR\",\t\"ARGENTINA\",\t\t\tTRUE,\tA_BAND_REGION_3,\tTRUE,\tG_BAND_REGION_1},\n\t{51,\t\"AM\",\t\"ARMENIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{36,\t\"AU\",\t\"AUSTRALIA\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{40,\t\"AT\",\t\"AUSTRIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{31,\t\"AZ\",\t\"AZERBAIJAN\",\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{48,\t\"BH\",\t\"BAHRAIN\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{112,\t\"BY\",\t\"BELARUS\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{56,\t\"BE\",\t\"BELGIUM\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{84,\t\"BZ\",\t\"BELIZE\",\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{68,\t\"BO\",\t\"BOLIVIA\",\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{76,\t\"BR\",\t\"BRAZIL\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{96,\t\"BN\",\t\"BRUNEI DARUSSALAM\",\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{100,\t\"BG\",\t\"BULGARIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{124,\t\"CA\",\t\"CANADA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{152,\t\"CL\",\t\"CHILE\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{156,\t\"CN\",\t\"CHINA\",\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{170,\t\"CO\",\t\"COLOMBIA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{188,\t\"CR\",\t\"COSTA RICA\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{191,\t\"HR\",\t\"CROATIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{196,\t\"CY\",\t\"CYPRUS\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{203,\t\"CZ\",\t\"CZECH REPUBLIC\",\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{208,\t\"DK\",\t\"DENMARK\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{214,\t\"DO\",\t\"DOMINICAN REPUBLIC\",\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{218,\t\"EC\",\t\"ECUADOR\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{818,\t\"EG\",\t\"EGYPT\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{222,\t\"SV\",\t\"EL SALVADOR\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{233,\t\"EE\",\t\"ESTONIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{246,\t\"FI\",\t\"FINLAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{250,\t\"FR\",\t\"FRANCE\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{268,\t\"GE\",\t\"GEORGIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{276,\t\"DE\",\t\"GERMANY\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{300,\t\"GR\",\t\"GREECE\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{320,\t\"GT\",\t\"GUATEMALA\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{340,\t\"HN\",\t\"HONDURAS\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{344,\t\"HK\",\t\"HONG KONG\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{348,\t\"HU\",\t\"HUNGARY\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{352,\t\"IS\",\t\"ICELAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{356,\t\"IN\",\t\"INDIA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{360,\t\"ID\",\t\"INDONESIA\",\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{364,\t\"IR\",\t\"IRAN\",\t\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{372,\t\"IE\",\t\"IRELAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{376,\t\"IL\",\t\"ISRAEL\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{380,\t\"IT\",\t\"ITALY\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{392,\t\"JP\",\t\"JAPAN\",\t\t\t\tTRUE,\tA_BAND_REGION_9,\tTRUE,\tG_BAND_REGION_1},\n\t{400,\t\"JO\",\t\"JORDAN\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{398,\t\"KZ\",\t\"KAZAKHSTAN\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{408,\t\"KP\",\t\"KOREA DEMOCRATIC PEOPLE'S REPUBLIC OF\",TRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{410,\t\"KR\",\t\"KOREA REPUBLIC OF\",\tTRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{414,\t\"KW\",\t\"KUWAIT\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{428,\t\"LV\",\t\"LATVIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{422,\t\"LB\",\t\"LEBANON\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{438,\t\"LI\",\t\"LIECHTENSTEIN\",\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{440,\t\"LT\",\t\"LITHUANIA\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{442,\t\"LU\",\t\"LUXEMBOURG\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{446,\t\"MO\",\t\"MACAU\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{807,\t\"MK\",\t\"MACEDONIA\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{458,\t\"MY\",\t\"MALAYSIA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{484,\t\"MX\",\t\"MEXICO\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{492,\t\"MC\",\t\"MONACO\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{504,\t\"MA\",\t\"MOROCCO\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{528,\t\"NL\",\t\"NETHERLANDS\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{554,\t\"NZ\",\t\"NEW ZEALAND\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{578,\t\"NO\",\t\"NORWAY\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{512,\t\"OM\",\t\"OMAN\",\t\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{586,\t\"PK\",\t\"PAKISTAN\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{591,\t\"PA\",\t\"PANAMA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{604,\t\"PE\",\t\"PERU\",\t\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{608,\t\"PH\",\t\"PHILIPPINES\",\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{616,\t\"PL\",\t\"POLAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{620,\t\"PT\",\t\"PORTUGAL\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{630,\t\"PR\",\t\"PUERTO RICO\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{634,\t\"QA\",\t\"QATAR\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{642,\t\"RO\",\t\"ROMANIA\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{643,\t\"RU\",\t\"RUSSIA FEDERATION\",\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{682,\t\"SA\",\t\"SAUDI ARABIA\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{702,\t\"SG\",\t\"SINGAPORE\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{703,\t\"SK\",\t\"SLOVAKIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{705,\t\"SI\",\t\"SLOVENIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{710,\t\"ZA\",\t\"SOUTH AFRICA\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{724,\t\"ES\",\t\"SPAIN\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{752,\t\"SE\",\t\"SWEDEN\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{756,\t\"CH\",\t\"SWITZERLAND\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{760,\t\"SY\",\t\"SYRIAN ARAB REPUBLIC\",\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{158,\t\"TW\",\t\"TAIWAN\",\t\t\t\tTRUE,\tA_BAND_REGION_3,\tTRUE,\tG_BAND_REGION_0},\n\t{764,\t\"TH\",\t\"THAILAND\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{780,\t\"TT\",\t\"TRINIDAD AND TOBAGO\",\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{788,\t\"TN\",\t\"TUNISIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{792,\t\"TR\",\t\"TURKEY\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{804,\t\"UA\",\t\"UKRAINE\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{784,\t\"AE\",\t\"UNITED ARAB EMIRATES\",\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{826,\t\"GB\",\t\"UNITED KINGDOM\",\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{840,\t\"US\",\t\"UNITED STATES\",\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{858,\t\"UY\",\t\"URUGUAY\",\t\t\t\tTRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{860,\t\"UZ\",\t\"UZBEKISTAN\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_0},\n\t{862,\t\"VE\",\t\"VENEZUELA\",\t\t\tTRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{704,\t\"VN\",\t\"VIET NAM\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{887,\t\"YE\",\t\"YEMEN\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{716,\t\"ZW\",\t\"ZIMBABWE\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{999,\t\"\",\t\"\",\t0,\t0,\t0,\t0}\n};\n\n#define NUM_OF_COUNTRIES\t(sizeof(allCountry)/sizeof(COUNTRY_CODE_TO_COUNTRY_REGION))\n\n\nINT Set_CountryString_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_CountryCode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_ChGeography_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\nINT Set_AP_SSID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_TxRate_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n\nINT\tSet_OLBCDetection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_MaxStaNum_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_IdleTimeout_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef IAPP_SUPPORT\nINT\tSet_IappPID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* IAPP_SUPPORT */\n\nINT Set_AP_AuthMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_EncrypType_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_WpaMixPairCipher_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_RekeyInterval_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_RekeyMethod_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_PMKCachePeriod_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_DefaultKeyID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key1_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key2_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key3_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key4_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_WPAPSK_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_BasicRate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BeaconPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DtimPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_NoForwarding_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_NoForwardingBTNSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HideSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_VLANID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_VLANPriority_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_VLAN_TAG_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AccessPolicy_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tSet_ACLAddEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ACLDelEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ACLShowAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ACLClearAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadioOn_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_SiteSurvey_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_AutoChannelSel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef AP_SCAN_SUPPORT\nINT Set_AutoChannelSelCheckTime_Proc(\n   IN  PRTMP_ADAPTER   pAd,\n   IN  PSTRING         arg);\n#endif /* AP_SCAN_SUPPORT */\n\nINT\tSet_BADecline_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_MacTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\t\n\nINT\tShow_StaCount_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_StaSecurityInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\t\nINT\tShow_DriverInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT11_N_SUPPORT\nINT\tShow_BaTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DOT11_N_SUPPORT */\n\nINT\tShow_Sat_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_RAInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tShow_Sat_Reset_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_MATTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT1X_SUPPORT\nVOID RTMPIoctlQueryRadiusConf(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nINT\tSet_IEEE8021X_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_PreAuth_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RADIUS_Server_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RADIUS_Port_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RADIUS_Key_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DOT1X_SUPPORT */\n\nINT\tSet_DisConnectSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DisConnectAllSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n#ifdef APCLI_SUPPORT\nINT Set_ApCli_Enable_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Ssid_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Bssid_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_DefaultKeyID_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_WPAPSK_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key1_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key2_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key3_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key4_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_TxMode_Proc(IN PRTMP_ADAPTER pAd, IN  PSTRING arg);\nINT Set_ApCli_TxMcs_Proc(IN PRTMP_ADAPTER pAd, IN  PSTRING arg);\n\n\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\nINT Set_ApCli_Wpa_Support(IN PRTMP_ADAPTER pAd, IN\tPSTRING\targ);\nINT\tSet_ApCli_IEEE8021X_Proc(IN PRTMP_ADAPTER\tpAd, IN PSTRING arg);\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n\n\n#endif /* APCLI_SUPPORT */\n#ifdef UAPSD_SUPPORT\nINT Set_UAPSD_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* UAPSD_SUPPORT */\n\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MCAST_RATE_SPECIFIC\nINT Set_McastPhyMode(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_McastMcs(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Show_McastRate(IN PRTMP_ADAPTER\tpAd, IN PSTRING arg);\n#endif /* MCAST_RATE_SPECIFIC */\n\n#ifdef DOT11N_DRAFT3\nINT Set_OBSSScanParam_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_AP2040ReScan_Proc(\n\tIN PRTMP_ADAPTER   pAd,\n\tIN PSTRING arg);\n#endif /* DOT11N_DRAFT3 */\n\nINT Set_EntryLifeCheck_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING\t\t\targ);\n\n\n#ifdef AP_QLOAD_SUPPORT\nINT\tSet_QloadClr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n/* QLOAD ALARM */\nINT\tSet_QloadAlarmTimeThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg);\n\nINT\tSet_QloadAlarmNumThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg);\n#endif /* AP_QLOAD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\nINT\tSet_MemDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef CONFIG_AP_SUPPORT\nINT\tSet_PowerSaveLifeTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* CONFIG_AP_SUPPORT */\n\nstatic struct {\n\tPSTRING name;\n\tINT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);\n} *PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = {\n\t{\"RateAlg\",\t\t\t\t\t\tSet_RateAlg_Proc},\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t{\"PerThrdAdj\",\t\t\t\t\tSet_PerThrdAdj_Proc},\n\t{\"LowTrafficThrd\",\t\t\t\tSet_LowTrafficThrd_Proc},\n\t{\"TrainUpRule\",\t\t\t\t\tSet_TrainUpRule_Proc},\n\t{\"TrainUpRuleRSSI\",\t\t\t\tSet_TrainUpRuleRSSI_Proc},\n\t{\"TrainUpLowThrd\",\t\t\t\tSet_TrainUpLowThrd_Proc},\n\t{\"TrainUpHighThrd\",\t\t\t\tSet_TrainUpHighThrd_Proc},\n\t{\"RateTable\",\t\t\t\t\tSet_RateTable_Proc},\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t{\"DriverVersion\",\t\t\t\tSet_DriverVersion_Proc},\n\t{\"CountryRegion\",\t\t\t\tSet_CountryRegion_Proc},\n\t{\"CountryRegionABand\",\t\t\tSet_CountryRegionABand_Proc},\n\t{\"CountryString\",\t\t\t\tSet_CountryString_Proc},\n\t{\"CountryCode\",\t\t\t\tSet_CountryCode_Proc},\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t{\"ChGeography\",\t\t\t\tSet_ChGeography_Proc},\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\t{\"SSID\",\t\t\t\t\t\tSet_AP_SSID_Proc},\n\t{\"WirelessMode\",\t\t\t\tSet_WirelessMode_Proc},\n\t{\"BasicRate\",\t\t\t\t\tSet_BasicRate_Proc},\n\t{\"ShortSlot\",\t\t\t\t\tSet_ShortSlot_Proc},\n\t{\"Channel\",\t\t\t\t\tSet_Channel_Proc},\n#if defined(RT5370) || defined(RT5372) || defined(RT5390) || defined(RT5392)\t\n\t{\"BbpResetFlagCountVale\",\t\tSet_BbpResetFlagCountVale},\n#endif /* defined(RT5370) || defined(RT5372) || defined(RT5390) || defined(RT5392) */\n\t{\"BeaconPeriod\",\t\t\t\tSet_BeaconPeriod_Proc},\n\t{\"DtimPeriod\",\t\t\t\t\tSet_DtimPeriod_Proc},\n\t{\"TxPower\",\t\t\t\t\tSet_TxPower_Proc},\n\t{\"BGProtection\",\t\t\t\tSet_BGProtection_Proc},\n\t{\"DisableOLBC\", \t\t\t\tSet_OLBCDetection_Proc},\n\t{\"TxPreamble\",\t\t\t\tSet_TxPreamble_Proc},\n\t{\"RTSThreshold\",\t\t\t\tSet_RTSThreshold_Proc},\n\t{\"FragThreshold\",\t\t\t\tSet_FragThreshold_Proc},\n\t{\"TxBurst\",\t\t\t\t\tSet_TxBurst_Proc},\n\t{\"MaxStaNum\",\t\t\t\t\tSet_AP_MaxStaNum_Proc},\n\t{\"IdleTimeout\",\t\t\t\t\tSet_AP_IdleTimeout_Proc},\t\n#ifdef DOT11_N_SUPPORT\n\t{\"BASetup\",\t\t\t\t\tSet_BASetup_Proc},\n\t{\"BADecline\",\t\t\t\t\tSet_BADecline_Proc},\n\t{\"SendMIMOPS\",\t\t\t\tSet_SendPSMPAction_Proc},\n\t{\"BAOriTearDown\",\t\t\t\tSet_BAOriTearDown_Proc},\n\t{\"BARecTearDown\",\t\t\t\tSet_BARecTearDown_Proc},\n\t{\"HtBw\",\t\t\t\t\t\tSet_HtBw_Proc},\n\t{\"HtMcs\",\t\t\t\t\t\tSet_HtMcs_Proc},\n\t{\"HtGi\",\t\t\t\t\t\tSet_HtGi_Proc},\n\t{\"HtOpMode\",\t\t\t\t\tSet_HtOpMode_Proc},\n\t{\"HtStbc\",\t\t\t\t\tSet_HtStbc_Proc},\n\t{\"HtHtc\",\t\t\t\t\t\tSet_HtHtc_Proc},\n\t{\"HtExtcha\",\t\t\t\t\tSet_HtExtcha_Proc},\n\t{\"HtMpduDensity\",\t\t\t\tSet_HtMpduDensity_Proc},\n\t{\"HtBaWinSize\",\t\t\t\tSet_HtBaWinSize_Proc},\n\t{\"HtMIMOPS\",\t\t\t\t\tSet_HtMIMOPSmode_Proc},\n\t{\"HtRdg\",\t\t\t\t\t\tSet_HtRdg_Proc},\n\t{\"HtLinkAdapt\",\t\t\t\tSet_HtLinkAdapt_Proc},\n\t{\"HtAmsdu\",\t\t\t\t\tSet_HtAmsdu_Proc},\n\t{\"HtAutoBa\",\t\t\t\t\tSet_HtAutoBa_Proc},\n\t{\"HtProtect\",\t\t\t\t\tSet_HtProtect_Proc},\n\t{\"HtMimoPs\",\t\t\t\t\tSet_HtMimoPs_Proc},\n\t{\"HtTxStream\",\t\t\t\tSet_HtTxStream_Proc},\n\t{\"HtRxStream\",\t\t\t\tSet_HtRxStream_Proc},\n\t{\"ForceShortGI\",\t\t\t\tSet_ForceShortGI_Proc},\n\t{\"ForceGF\",\t\t        \t\tSet_ForceGF_Proc},\n\t{\"HtTxBASize\",\t\t\t\t\tSet_HtTxBASize_Proc},\n\t{\"BurstMode\",\t\t\t\t\tSet_BurstMode_Proc},\n#ifdef GREENAP_SUPPORT\n\t{\"GreenAP\",\t\t\t\t\tSet_GreenAP_Proc},\n#endif /* GREENAP_SUPPORT */\n\t{\"HtDisallowTKIP\",\t\t\t\tSet_HtDisallowTKIP_Proc},\t\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef IAPP_SUPPORT\n\t{\"IappPID\",\t\t\t\t\tSet_IappPID_Proc},\n#endif /* IAPP_SUPPORT */\n\n#ifdef AGGREGATION_SUPPORT\n\t{\"PktAggregate\",\t\t\t\tSet_PktAggregate_Proc},\n#endif /* AGGREGATION_SUPPORT */\n\n#ifdef INF_PPA_SUPPORT\n\t{\"INF_AMAZON_SE_PPA\",\t\t\tSet_INF_AMAZON_SE_PPA_Proc},\n#endif /* INF_PPA_SUPPORT */\n\n#ifdef WMM_SUPPORT\n\t{\"WmmCapable\",\t\t\t\tSet_AP_WmmCapable_Proc},\n#endif /* WMM_SUPPORT */\n\t{\"NoForwarding\",\t\t\t\tSet_NoForwarding_Proc},\n\t{\"NoForwardingBTNBSSID\",\t\tSet_NoForwardingBTNSSID_Proc},\n\t{\"HideSSID\",\t\t\t\t\tSet_HideSSID_Proc},\n\t{\"IEEE80211H\",\t\t\t\tSet_IEEE80211H_Proc},\n\t{\"VLANID\",\t\t\t\t\tSet_VLANID_Proc},\n\t{\"VLANPriority\",\t\t\t\tSet_VLANPriority_Proc},\n\t{\"VLANTag\",\t\t\t\t\tSet_VLAN_TAG_Proc},\n\t{\"AuthMode\",\t\t\t\t\tSet_AP_AuthMode_Proc},\n\t{\"EncrypType\",\t\t\t\tSet_AP_EncrypType_Proc},\n\t{\"WpaMixPairCipher\", \t\t\tSet_AP_WpaMixPairCipher_Proc},\n\t{\"RekeyInterval\",\t\t\t\tSet_AP_RekeyInterval_Proc},\n\t{\"RekeyMethod\", \t\t\t\tSet_AP_RekeyMethod_Proc}, \n\t{\"DefaultKeyID\",\t\t\t\tSet_AP_DefaultKeyID_Proc},\n\t{\"Key1\",\t\t\t\t\t\tSet_AP_Key1_Proc},\n\t{\"Key2\",\t\t\t\t\t\tSet_AP_Key2_Proc},\n\t{\"Key3\",\t\t\t\t\t\tSet_AP_Key3_Proc},\n\t{\"Key4\",\t\t\t\t\t\tSet_AP_Key4_Proc},\n\t{\"AccessPolicy\",\t\t\t\tSet_AccessPolicy_Proc},\n\t{\"ACLAddEntry\",\t\t\t\t\tSet_ACLAddEntry_Proc},\n\t{\"ACLDelEntry\",\t\t\t\t\tSet_ACLDelEntry_Proc},\n\t{\"ACLShowAll\",\t\t\t\t\tSet_ACLShowAll_Proc},\n\t{\"ACLClearAll\",\t\t\t\t\tSet_ACLClearAll_Proc},\n\t{\"WPAPSK\",\t\t\t\t\tSet_AP_WPAPSK_Proc},\n\t{\"RadioOn\",\t\t\t\t\tSet_RadioOn_Proc},\n#ifdef AP_SCAN_SUPPORT\n\t{\"SiteSurvey\",\t\t\t\t\tSet_SiteSurvey_Proc},\n\t{\"AutoChannelSel\",\t\t\t\tSet_AutoChannelSel_Proc},\n\t{\"ACSCheckTime\",\t\t\t\tSet_AutoChannelSelCheckTime_Proc},\n#endif /* AP_SCAN_SUPPORT */\n\t{\"ResetCounter\",\t\t\t\tSet_ResetStatCounter_Proc},\n\t{\"DisConnectSta\",\t\t\t\tSet_DisConnectSta_Proc},\n\t{\"DisConnectAllSta\",\t\t\tSet_DisConnectAllSta_Proc},\n#ifdef DOT1X_SUPPORT\n\t{\"IEEE8021X\",\t\t\t\t\tSet_IEEE8021X_Proc},\n\t{\"PreAuth\",\t\t\t\t\t\tSet_PreAuth_Proc},\n\t{\"PMKCachePeriod\", \t\t\t\tSet_AP_PMKCachePeriod_Proc},\t\n\t{\"own_ip_addr\",\t\t\t\t\tSet_OwnIPAddr_Proc},\n\t{\"EAPifname\",\t\t\t\t\tSet_EAPIfName_Proc},\n\t{\"PreAuthifname\",\t\t\t\tSet_PreAuthIfName_Proc},\n\t{\"RADIUS_Server\",\t\t\t\tSet_RADIUS_Server_Proc},\n\t{\"RADIUS_Port\",\t\t\t\t\tSet_RADIUS_Port_Proc},\n\t{\"RADIUS_Key\",\t\t\t\t\tSet_RADIUS_Key_Proc},\n#endif /* DOT1X_SUPPORT */\t\n#ifdef DBG\t\n\t{\"Debug\",\t\t\t\t\tSet_Debug_Proc},\n#endif /* DBG */\n\n#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)\n\t{\"RadarShow\",\t\t\t\t\tSet_RadarShow_Proc},\n#ifdef CARRIER_DETECTION_SUPPORT\n\t{\"CarrierDetect\",\t\t\t\tSet_CarrierDetect_Proc},\n\t{\"CarrierCriteria\",\t\t\t\tSet_CarrierCriteria_Proc},\n\t{\"CarrierReCheck\",\t\t\t\tSet_CarrierReCheck_Proc},\n\t{\"CarrierGoneThreshold\",\t\t\tSet_CarrierGoneThreshold_Proc},\n\t{\"CarrierDebug\",\t\t\t\tSet_CarrierDebug_Proc},\n\t{\"Delta\",\t\t\t\t\t\tSet_CarrierDelta_Proc},\n\t{\"DivFlag\",\t\t\t\t\t\tSet_CarrierDivFlag_Proc},\n\t{\"CarrThrd\",\t\t\t\t\tSet_CarrierThrd_Proc},\n\t/* v2 functions */\n\t{\"SymRund\",\t\t\t\t\tSet_CarrierSymRund_Proc},\n\t{\"CarrMask\",\t\t\t\t\tSet_CarrierMask_Proc},\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */\n\n\n\n#ifdef APCLI_SUPPORT\n\t{\"ApCliEnable\",\t\t\t\tSet_ApCli_Enable_Proc},\n\t{\"ApCliSsid\",\t\t\t\t\tSet_ApCli_Ssid_Proc},\n\t{\"ApCliBssid\",\t\t\t\t\tSet_ApCli_Bssid_Proc},\n\t{\"ApCliAuthMode\",\t\t\t\tSet_ApCli_AuthMode_Proc},\n\t{\"ApCliEncrypType\",\t\t\t\tSet_ApCli_EncrypType_Proc},\n\t{\"ApCliDefaultKeyID\",\t\t\tSet_ApCli_DefaultKeyID_Proc},\t\n\t{\"ApCliWPAPSK\",\t\t\t\tSet_ApCli_WPAPSK_Proc},\n\t{\"ApCliKey1\",\t\t\t\t\tSet_ApCli_Key1_Proc},\n\t{\"ApCliKey2\",\t\t\t\t\tSet_ApCli_Key2_Proc},\n\t{\"ApCliKey3\",\t\t\t\t\tSet_ApCli_Key3_Proc},\n\t{\"ApCliKey4\",\t\t\t\t\tSet_ApCli_Key4_Proc},\n\t{\"ApCliTxMode\",\t\t\t\t\tSet_ApCli_TxMode_Proc},\n\t{\"ApCliTxMcs\",\t\t\t\t\tSet_ApCli_TxMcs_Proc},\t\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t{\"ApCliWpaSupport\",\t\t\t\t\tSet_ApCli_Wpa_Support},\t\n\t{\"ApCliIEEE1X\",\t\t\t\t\tSet_ApCli_IEEE8021X_Proc},\t\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n\n#endif /* APCLI_SUPPORT */\n#ifdef UAPSD_SUPPORT\n\t{\"UAPSDCapable\",\t\t\t\tSet_UAPSD_Proc},\n#endif /* UAPSD_SUPPORT */\n#ifdef IGMP_SNOOP_SUPPORT\n\t{\"IgmpSnEnable\",\t\t\t\tSet_IgmpSn_Enable_Proc},\n\t{\"IgmpAdd\",\t\t\t\t\tSet_IgmpSn_AddEntry_Proc},\n\t{\"IgmpDel\",\t\t\t\t\tSet_IgmpSn_DelEntry_Proc},\n#endif /* IGMP_SNOOP_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MCAST_RATE_SPECIFIC\n\t{\"McastPhyMode\",\t\t\t\tSet_McastPhyMode},\n\t{\"McastMcs\",\t\t\t\t\tSet_McastMcs},\n#endif /* MCAST_RATE_SPECIFIC */\n#endif /* CONFIG_AP_SUPPORT */\n\t{\"FixedTxMode\",                 Set_FixedTxMode_Proc},\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\t{\"OpMode\",\t\t\t\t\tSet_OpMode_Proc},\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\n\n#ifdef PRE_ANT_SWITCH\n\t{\"PreAntSwitch\",\t\t        Set_PreAntSwitch_Proc},\n\t{\"PreAntSwitchRSSI\",\t\t    Set_PreAntSwitchRSSI_Proc},\n\t{\"PreAntSwitchTimeout\",\t\t    Set_PreAntSwitchTimeout_Proc},\n#endif /* PRE_ANT_SWITCH */\n\n#ifdef CFO_TRACK\n\t{\"CFOTrack\",\t\t\t\tSet_CFOTrack_Proc},\n#endif /* CFO_TRACK */\n\n#ifdef STREAM_MODE_SUPPORT\n\t{\"StreamMode\",\t\t\t\tSet_StreamMode_Proc},\n\t{\"StreamModeMac\",\t\t\tSet_StreamModeMac_Proc},\n\t{\"StreamModeMCS\",\t\t\tSet_StreamModeMCS_Proc},\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n\t{\"DebugFlags\",\t\t\t\t\tSet_DebugFlags_Proc},\n#ifdef INCLUDE_DEBUG_QUEUE\n\t{\"DebugQueue\",\t\t\t\tSet_DebugQueue_Proc},\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t{\"LongRetry\",\t        \t\tSet_LongRetryLimit_Proc},\n\t{\"ShortRetry\",\t        \t\tSet_ShortRetryLimit_Proc},\n\t{\"AutoFallBack\",\t        \tSet_AutoFallBack_Proc},\n\n\t{\"MeasureReq\",\t\t\t\t\tSet_MeasureReq_Proc},\n\t{\"TpcReq\",\t\t\t\t\t\tSet_TpcReq_Proc},\n\t{\"PwrConstraint\",\t\t\t\tSet_PwrConstraint},\n#ifdef DOT11N_DRAFT3\n\t{\"OBSSScanParam\",\t\t\t\tSet_OBSSScanParam_Proc},\n\t{\"AP2040Rescan\",\t\t\tSet_AP2040ReScan_Proc},\n\t{\"HtBssCoex\",\t\t\t\t\t\tSet_HT_BssCoex_Proc},\n\t{\"HtBssCoexApCntThr\",\t\t\t\tSet_HT_BssCoexApCntThr_Proc},\n#endif /* DOT11N_DRAFT3 */\n\t{\"EntryLifeCheck\",\t\t\t\tSet_EntryLifeCheck_Proc},\n#ifdef RT30xx\n#ifdef RTMP_EFUSE_SUPPORT\n/*2008/09/11:KH add to support efuse<-- */\n\t{\"efuseFreeNumber\",\t\t\t\tset_eFuseGetFreeBlockCount_Proc},\n\t{\"efuseDump\",\t\t\t\t\tset_eFusedump_Proc},\n\t{\"efuseLoadFromBin\",\t\t\t\tset_eFuseLoadFromBin_Proc},\n/*2008/09/11:KH add to support efuse--> */\n#endif /* RTMP_EFUSE_SUPPORT */\n\t{\"ant\",\t\t\t\t\tSet_Antenna_Proc},\n#endif /* RT30xx */\n\n\n\n#ifdef AP_QLOAD_SUPPORT\n\t{\"qloadclr\",\t\t\t\t\tSet_QloadClr_Proc},\n\t{\"qloadalarmtimethres\",\t\t\tSet_QloadAlarmTimeThreshold_Proc}, /* QLOAD ALARM */\n\t{\"qloadalarmnumthres\",\t\t\tSet_QloadAlarmNumThreshold_Proc}, /* QLOAD ALARM */\n#endif /* AP_QLOAD_SUPPORT */\n\n\t{\"ra_interval\",\t\t\t\t\tSet_RateAdaptInterval},\n\n\n\t{\"memdebug\",\t\t\t\t\tSet_MemDebug_Proc},\n\n#ifdef CONFIG_AP_SUPPORT\n\t{\"pslifetime\",\t\t\t\t\tSet_PowerSaveLifeTime_Proc},\n\n#ifdef MBSS_SUPPORT\n\t{\"MBSSWirelessMode\",\t\t\tSet_MBSS_WirelessMode_Proc},\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\t{\"VcoPeriod\",\t\t\t\t\tSet_VcoPeriod_Proc},\n\n#ifdef SINGLE_SKU\n\t{\"ModuleTxpower\",\t\t\t\tSet_ModuleTxpower_Proc},\n#endif /* SINGLE_SKU */\n\n\n\t{NULL,}\n};\n\n\nstatic struct {\n\tPSTRING name;\n\tINT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);\n} *PRTMP_PRIVATE_SHOW_PROC, RTMP_PRIVATE_SHOW_SUPPORT_PROC[] = {\n\t{\"stainfo\",\t\t\tShow_MacTable_Proc},\n\t{\"stacountinfo\",\t\t\tShow_StaCount_Proc},\n\t{\"stasecinfo\", \t\t\tShow_StaSecurityInfo_Proc},\t\n\t{\"descinfo\",\t\t\tShow_DescInfo_Proc},\n\t{\"driverinfo\", \t\t\tShow_DriverInfo_Proc},\n#ifdef WDS_SUPPORT\n\t{\"wdsinfo\",\t\t\t\tShow_WdsTable_Proc},\n#endif /* WDS_SUPPORT */\n#ifdef DOT11_N_SUPPORT\n\t{\"bainfo\",\t\t\t\tShow_BaTable_Proc},\n#endif /* DOT11_N_SUPPORT */\n\t{\"stat\",\t\t\t\tShow_Sat_Proc}, \n#ifdef DBG_DIAGNOSE\n\t{\"diag\",\t\t\t\tShow_Diag_Proc},\n#endif /* DBG_DIAGNOSE */\n\t{\"stat_reset\",\t\t\tShow_Sat_Reset_Proc},\n#ifdef IGMP_SNOOP_SUPPORT\n\t{\"igmpinfo\",\t\t\tSet_IgmpSn_TabDisplay_Proc},\n#endif /* IGMP_SNOOP_SUPPORT */\n#ifdef MCAST_RATE_SPECIFIC\n\t{\"mcastrate\",\t\t\tShow_McastRate},\n#endif /* MCAST_RATE_SPECIFIC */\n#ifdef AP_QLOAD_SUPPORT\n\t{\"qload\",\t\t\t\tShow_QoSLoad_Proc},\n#endif /* AP_QLOAD_SUPPORT */\n#ifdef APCLI_SUPPORT\n\t{\"connStatus\",\t\t\tRTMPIoctlConnStatus},\n#endif\n\n\t{\"rainfo\",\t\t\t\tShow_RAInfo_Proc},\n\n#ifdef MBSS_SUPPORT\n\t{\"mbss\",\t\t\tShow_MbssInfo_Display_Proc},\n#endif /* MBSS_SUPPORT */\n\t{NULL,}\n};\n\n\nINT RTMPAPPrivIoctlSet(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)\n{\n\tPSTRING this_char;\n\tPSTRING value;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n\twhile ((this_char = strsep((char **)&pIoctlCmdStr->u.data.pointer, \",\")) != NULL) \n\t{\n\t\tif (!*this_char)\n\t\t\t continue;\n\n\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t*value++ = 0;\n\n\t\tif (!value \n            )\n\t\t\tcontinue;  \t\t\t\t\t\t\t\n\n\t\tfor (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)\n\t\t{\n\t\t\tif (!strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name)) \n\t\t\t{\n\t\t\t\tif(!PRTMP_PRIVATE_SET_PROC->set_proc(pAd, value))\n\t\t\t\t{   /*FALSE:Set private failed then return Invalid argument */\n\t\t\t\t\tStatus = -EINVAL;\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;  /*Exit for loop. */\n\t\t\t}\n\t\t}\n\n\t\tif(PRTMP_PRIVATE_SET_PROC->name == NULL)\n\t\t{  /*Not found argument */\n\t\t\tStatus = -EINVAL;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::(iwpriv) Command not Support [%s=%s]\\n\", this_char, value));\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\treturn Status;\n}\n\n\nINT RTMPAPPrivIoctlShow(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)\n{\n\tPSTRING this_char;\n\tPSTRING value = NULL;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\t\n\twhile ((this_char = strsep((char **)&pIoctlCmdStr->u.data.pointer, \",\")) != NULL) \n\t{\n\t\tif (!*this_char)\n\t\t\tcontinue;\n\n\t\tfor (PRTMP_PRIVATE_SHOW_PROC = RTMP_PRIVATE_SHOW_SUPPORT_PROC; PRTMP_PRIVATE_SHOW_PROC->name; PRTMP_PRIVATE_SHOW_PROC++)\n\t\t{\n\t\t\tif (!strcmp(this_char, PRTMP_PRIVATE_SHOW_PROC->name)) \n\t\t\t{\t\t\t\t\t\t\n\t\t\t\tif(!PRTMP_PRIVATE_SHOW_PROC->set_proc(pAd, value))\n\t\t\t\t{   /*FALSE:Set private failed then return Invalid argument */\n\t\t\t\t\tStatus = -EINVAL;\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;  /*Exit for loop. */\n\t\t\t}\n\t\t}\n\n\t\tif(PRTMP_PRIVATE_SHOW_PROC->name == NULL)\n\t\t{  /*Not found argument */\n\t\t\tStatus = -EINVAL;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::(iwpriv) Command not Support [%s=%s]\\n\", this_char, value));\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\treturn Status;\n\t\n}\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\nINT RTMPAPPrivIoctlAR9Show(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)\n{\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n\t\tif(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_mac_table\"))\n\t\t{\n\t\t\tRTMPAR9IoctlGetMacTable(pAd,pIoctlCmdStr);\n\t\t}\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_stat2\"))\n\t\t{\n\t\t\tRTMPIoctlGetSTAT2(pAd,pIoctlCmdStr);\n\t\t}\t\t\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_radio_dyn_info\"))\n\t\t{\n\t\t\tRTMPIoctlGetRadioDynInfo(pAd,pIoctlCmdStr);\n\t\t}\n\treturn Status;\n}\n#endif /*AR9_MAPI_SUPPORT*/\n#endif/*AR9_INF*/\n\nINT RTMPAPSetInformation(\n\tIN\tPRTMP_ADAPTER pAd,\n\tIN\tOUT\tRTMP_IOCTL_INPUT_STRUCT\t*rq,\n\tIN\tINT\t\t\t\tcmd)\n{\n\tRTMP_IOCTL_INPUT_STRUCT\t\t\t\t*wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;\n\tUCHAR\t\t\t\t\t\t        Addr[MAC_ADDR_LEN];\n\tINT\t\t\t\t\t\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\n#ifdef SNMP_SUPPORT\t\n\t/*snmp */\n    UINT\t\t\t\t\t\tKeyIdx = 0;\n    PNDIS_AP_802_11_KEY\t\t\tpKey = NULL;\n\tTX_RTY_CFG_STRUC\t\t\ttx_rty_cfg;\n\tULONG\t\t\t\t\t\tShortRetryLimit, LongRetryLimit;\n#endif /* SNMP_SUPPORT */\n\tUCHAR\t\t\t\t\t\tctmp;\n\n\t\n \tNDIS_802_11_WEP_STATUS              WepStatus;\n \tNDIS_802_11_AUTHENTICATION_MODE     AuthMode = Ndis802_11AuthModeMax;\n\tNDIS_802_11_SSID                    Ssid;\n\n#ifdef HOSTAPD_SUPPORT\n\tMAC_TABLE_ENTRY\t\t\t\t\t\t*pEntry;\n\tstruct ieee80211req_mlme\t\t\tmlme;\n\n\tstruct ieee80211req_key\t\t\t\tKey;\n\tstruct ieee80211req_del_key\t\t\tdelkey;\n\tUINT8\t\tWcid;\n\tPMULTISSID_STRUCT\tpMbss ;\n\tWSC_LV_INFO            WscIEBeacon;\n   \tWSC_LV_INFO            WscIEProbeResp;\n\tint i;\n#endif /*HOSTAPD_SUPPORT*/\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn=FALSE;\n\tPNDIS_APCLI_802_11_PMKID                  pPmkId = NULL;\n    \tBOOLEAN\t\t\t\t                IEEE8021xState = FALSE;\n    \tBOOLEAN\t\t\t\t                IEEE8021x_required_keys = FALSE;\n    \tUCHAR                               wpa_supplicant_enable = 0;\n\tPNDIS_802_11_REMOVE_KEY             pRemoveKey = NULL;\n\tINT \tBssIdx, i;\n\tPNDIS_802_11_WEP\t\t\t        pWepKey =NULL;\n\tPAPCLI_STRUCT pApCliEntry=NULL;\n\tMAC_TABLE_ENTRY\t\t\t\t*pMacEntry=(MAC_TABLE_ENTRY *)NULL;\n\t PNDIS_APCLI_802_11_KEY                    pApCliKey = NULL;\n\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\tMLME_DEAUTH_REQ_STRUCT\tDeAuthFrame;\n\tPULONG pCurrState;\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tswitch(cmd & 0x7FFF)\n\t{\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t        case OID_802_11_SET_IEEE8021X:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t            if (wrq->u.data.length != sizeof(BOOLEAN))\n\t                Status  = -EINVAL;\n\t            else\n\t            {\n\n\t\t\t\tif(apcliEn == TRUE )\n\t\t\t\t{\t\t\n\t\t\t\t\tStatus = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length);                \t\t\t\t\n\t\t\t        \tpAd->ApCfg.ApCliTab[ifIndex].IEEE8021X = IEEE8021xState;\n\t                \t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set Apcli(%d)::OID_802_11_SET_IEEE8021X (=%d)\\n\",ifIndex, IEEE8021xState));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t            break;\n\n\t        case OID_802_11_SET_IEEE8021X_REQUIRE_KEY:\t\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n\t\t\t\t\tStatus  = -EINVAL;\n\t            else\n\t            {\n\t            \t\tif(apcliEn == TRUE )\n\t\t\t\t{\n\t                \t\tStatus = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length);                \t\t\t\t\n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].IEEE8021x_required_keys = IEEE8021x_required_keys;\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set Apcli(%d)::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\\n\",ifIndex, IEEE8021x_required_keys));\n\t            \t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\t\n\t\t\t\tbreak;\n\n        case OID_802_11_PMKID:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\t\t\t\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pPmkId, wrq->u.data.length);\n\n\t        if(pPmkId == NULL) {\n                Status = -ENOMEM;\n                break;\n            }\n            Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length);\n\t  \t  \n\t        /* check the PMKID information */\n\t        if (pPmkId->BSSIDInfoCount == 0)\n                NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].SavedPMK, sizeof(BSSID_INFO)*PMKID_NO);\n\t        else\n\t        {\n\t\t        PBSSID_INFO\tpBssIdInfo;\n\t\t        UINT\t\tBssIdx;\n\t\t        UINT\t\tCachedIdx;\n\n\t\t        for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++)\n\t\t        {\n\t\t\t        /* point to the indexed BSSID_INFO structure */\n\t\t\t        pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO));\n\t\t\t        /* Find the entry in the saved data base. */\n\t\t\t        for (CachedIdx = 0; CachedIdx < pAd->ApCfg.ApCliTab[ifIndex].SavedPMKNum; CachedIdx++)\n\t\t\t        {\n\t\t\t\t        /* compare the BSSID */\n\t\t\t\t        if (NdisEqualMemory(pBssIdInfo->BSSID, pAd->ApCfg.ApCliTab[ifIndex].SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS)))\n\t\t\t\t\t        break;\t\t\t\n\t\t\t        }\n\n\t\t\t        /* Found, replace it */\n\t\t\t        if (CachedIdx < PMKID_NO)\n\t\t\t        {\n\t\t\t\t        DBGPRINT(RT_DEBUG_OFF, (\"Update OID_802_11_PMKID, idx = %d\\n\", CachedIdx));\n\t\t\t\t        NdisMoveMemory(&pAd->ApCfg.ApCliTab[ifIndex].SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));\n\t\t\t\t        pAd->ApCfg.ApCliTab[ifIndex].SavedPMKNum++;\n\t\t\t        }\n\t\t\t        /* Not found, replace the last one */\n\t\t\t        else\n\t\t\t        {\n\t\t\t\t        /* Randomly replace one */\n\t\t\t\t        CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO);\n\t\t\t\t        DBGPRINT(RT_DEBUG_OFF, (\"Update OID_802_11_PMKID, idx = %d\\n\", CachedIdx));\n\t\t\t\t        NdisMoveMemory(&pAd->ApCfg.ApCliTab[ifIndex].SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));\n\t\t\t        }\t\t\t\t\n\t\t        }\n\t\t\t}\n\t\t\tif(pPmkId) \n\t\t\t\tos_free_mem(NULL, pPmkId);\n\t        break;\n\n\t        case RT_OID_WPA_SUPPLICANT_SUPPORT:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t                Status  = -EINVAL;\n\t            else\n\t            {\n\t\t\t\t\tStatus = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tif (wpa_supplicant_enable & WPA_SUPPLICANT_ENABLE_WPS)\n\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP |= WPA_SUPPLICANT_ENABLE_WPS;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP = wpa_supplicant_enable;\n\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP &= 0x7F;\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=0x%02X)\\n\", pAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP));\n\t\t\t\t}\n\t            break;\n\n\t        case OID_802_11_REMOVE_KEY:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\t\t\t\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pRemoveKey, wrq->u.data.length);\n\t            if(pRemoveKey == NULL)\n\t            {\n\t                Status = -ENOMEM;\n\t                break;\n\t            }\n\t            \n\t            Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length);\n\t            if (pRemoveKey->Length != wrq->u.data.length)\n\t            {\n\t                Status  = -EINVAL;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Failed!!\\n\"));\n\t            }\n\t            else\n\t            {\n\t                if (pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA)\n\t                {\n\t                    RTMPWPARemoveKeyProc(pAd, pRemoveKey);\n\t                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\\n\"));\n\t                }\n\t                else\n\t                {\n\t                \tUINT KeyIdx;\n\t                \tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;\n\t                    KeyIdx = pRemoveKey->KeyIndex;\n\n\t                    if (KeyIdx & 0x80000000)\n\t                    {\n\t                        /* Should never set default bit when remove key */\n\t                        Status  = -EINVAL;\n\t                        DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\\n\"));\n\t                    }\n\t                    else\n\t                    {\n\t                        KeyIdx = KeyIdx & 0x0fffffff;\n\t                        if (KeyIdx > 3)\n\t                        {\n\t                            Status  = -EINVAL;\n\t                            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\\n\", KeyIdx));\n\t                        }\n\t                        else\n\t                        {\n\t                            pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].KeyLen = 0;\n\t                            pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].CipherAlg = CIPHER_NONE;\n\t                            AsicRemoveSharedKeyEntry(pAd, BssIdx, (UCHAR)KeyIdx); \n\t                            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\\n\", pRemoveKey->KeyIndex, pRemoveKey->Length));\n\t                        }\n\t                    }\n\t                }\n\t            }\n\t\t\t\tif (pRemoveKey)\n\t\t\t\t\tos_free_mem(NULL, pRemoveKey);\n\t            break;     \n   \tcase OID_802_11_ADD_WEP:\n\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pWepKey, wrq->u.data.length);\n\t\t\tif(pWepKey == NULL)\n            {\n                Status = -ENOMEM;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set Apcli::OID_802_11_ADD_WEP, Failed!!\\n\"));\n                break;\n            }\n\t\t\tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tpMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\n\t            Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length);\n\t            if (Status)\n\t            {\n\t                Status  = -EINVAL;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\\n\"));\n\t            }\n\t            else\n\t            {\n\t\t\t\tUINT KeyIdx;\n\t\t\t        KeyIdx = pWepKey->KeyIndex & 0x0fffffff;\n\t                /* KeyIdx must be 0 ~ 3 */\n\t                if (KeyIdx > 4)\n\t    \t\t\t{\n\t                    Status  = -EINVAL;\n\t                    DBGPRINT(RT_DEBUG_TRACE, (\"Set ApCli::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\\n\"));\n\t                }\n\t                else\n\t                {\n\t                    UCHAR CipherAlg = 0;\n\t                    PUCHAR Key;\n\n\t\t\t\t\t\t/* Zero the specific shared key */\n\t\t\t\t\t\tNdisZeroMemory(&pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx], sizeof(CIPHER_KEY));\n\n\t                    /* set key material and key length */\n\t                    pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;\n\t                    NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);\n\n\t                    switch(pWepKey->KeyLength)\n\t                    {\n\t                        case 5:\n\t                            CipherAlg = CIPHER_WEP64;\n\t                            break;\n\t                        case 13:\n\t                            CipherAlg = CIPHER_WEP128;\n\t                            break;\n\t                        default:\n\t                            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\\n\"));\n\t                            Status = -EINVAL;\n\t                            break;\n\t                    }\n\t                    pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].CipherAlg = CipherAlg;\n\n\t                    /* Default key for tx (shared key) */\n\t                    if (pWepKey->KeyIndex & 0x80000000)\n\t                    {\n\n\t                        NdisZeroMemory(&pAd->ApCfg.ApCliTab[ifIndex].DesireSharedKey[KeyIdx], sizeof(CIPHER_KEY));\n\t\t\t\t\t\t\t\t\t\n\t                        /* set key material and key length */\n\t                        pAd->ApCfg.ApCliTab[ifIndex].DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;\n\t                        NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);\n\t                        pAd->ApCfg.ApCliTab[ifIndex].DesireSharedKeyId = KeyIdx;\n\t                        pAd->ApCfg.ApCliTab[ifIndex].DesireSharedKey[KeyIdx].CipherAlg = CipherAlg;\n                   \n\t                        pAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = (UCHAR) KeyIdx;\n\t                    }\n\t                    \n\n\t\t\t\t\t\tif ((pAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&\n\t\t\t\t\t\t\t(pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tKey = pWepKey->KeyMaterial;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t/* Set Group key material to Asic */\n\t    \t\t\t\t\tAsicAddSharedKeyEntry(pAd, BssIdx, KeyIdx, &pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx]);\n\n\t\t\t\t\t\tif (pWepKey->KeyIndex & 0x80000000)\n\t                        \t\t{\n\t\t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd,  BssIdx,  KeyIdx,  CipherAlg,  pApCliEntry->MacTabWCID, SHAREDKEYTABLE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t\t\t\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\t\t\t\t\t\t}\n\t                    else if ((pAd->ApCfg.ApCliTab[ifIndex].Valid == TRUE)\n\t\t\t\t\t\t&& (pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n\t                    {\n\t                        Key = pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].Key;\n\n\t                        /* Set key material and cipherAlg to Asic */\n\t        \t\t\t\tAsicAddSharedKeyEntry(pAd, BssIdx, KeyIdx, &pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx]);\t\n\t                        \n\t                        if (pWepKey->KeyIndex & 0x80000000)\n\t                        {\n\t    \t\t\t\t\t\t/* Assign pairwise key info */\n\t    \t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t\t BssIdx, \n\t\t\t\t\t\t\t\t\t\t\t\t\t KeyIdx, \n\t\t\t\t\t\t\t\t\t\t\t\t\t CipherAlg, \t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t\t pApCliEntry->MacTabWCID, \n\t\t\t\t\t\t\t\t\t\t\t\t\t SHAREDKEYTABLE);\n\t                        }\n\t                    }\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set ApCli::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\\n\", pWepKey->KeyIndex, pWepKey->KeyLength, pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED ? \"Port Secured\":\"Port NOT Secured\"));\n\t\t\t\t\t}\n\t            }\n\t\t\t\tif (pWepKey)\n\t\t\t\t\tos_free_mem(NULL, pWepKey);\n\t            break;\n\n        case OID_802_11_ADD_KEY:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\n\t\t\tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tpMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\t\t\t\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pApCliKey, wrq->u.data.length);\n\t            if(pApCliKey == NULL)\n\t            {\n\t                Status = -ENOMEM;\n\t                break;\n\t            }\n\t            Status = copy_from_user(pApCliKey, wrq->u.data.pointer, wrq->u.data.length);\n\t            if (pApCliKey->Length != wrq->u.data.length)\n\t            {\n\t                Status  = -EINVAL;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_KEY, Failed!!\\n\"));\n\t            }\n\t            else\n\t            {\n\t                RTMPApCliAddKey(pAd, ifIndex, pApCliKey);\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\\n\", pApCliKey->KeyIndex, pApCliKey->KeyLength));\n\t            }\n\t\t\t\tif (pApCliKey)\n\t\t\t\t\tos_free_mem(NULL, pApCliKey);\n\t            break;\n\n\t\tcase OID_802_11_DISASSOCIATE:\n\t\t\t\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tpCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\t\t\tif (!apcliEn || ifIndex >= MAX_APCLI_NUM)\n\t\t\t\treturn FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DISASSOCIATE\t\\n\"));\n\t\t\t\n\t\t\tDisassocParmFill(pAd, &DisassocReq, pAd->MlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING);\n\n\t\t\tMlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_DISASSOC_REQ,\n\t\t\t\t\tsizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, ifIndex);\n\t\n\t\t\tif (pApCliEntry->Valid)\n\t\t\t\tApCliLinkDown(pAd, ifIndex);\n\n\t\t\t/* set the apcli interface be invalid. */\n\t\t\tpApCliEntry->Valid = FALSE;\n\n\t\t\t/* clear MlmeAux.Ssid and Bssid. */\n\t\t\tNdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);\n\t\t\tpAd->MlmeAux.SsidLen = 0;\n\t\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\t\tpAd->MlmeAux.Rssi = 0;\n\n\t\t\t*pCurrState = APCLI_CTRL_DEASSOC;\n\t\t\tbreak;\n\n\t        case OID_802_11_DROP_UNENCRYPTED:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tpMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\t\t\t\n\t            if (wrq->u.data.length != sizeof(int))\n\t                Status  = -EINVAL;\n\t            else\n\t            {\n\t                int enabled = 0;\n\t                Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);\n\t                if (enabled == 1)\n\t                {\n\t                \tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t                    pMacEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\t                }\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t                    pMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\t\t\t}\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Set ApCLi::OID_802_11_DROP_UNENCRYPTED (=%d)\\n\", enabled));\n\t            }\n\t            break;\n\n\t    case OID_SET_COUNTERMEASURES:\n\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tpMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\t\t\t\n\t            if (wrq->u.data.length != sizeof(int))\n\t                Status  = -EINVAL;\n\t            else\n\t            {\n\t                int enabled = 0;\n\t                Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);\n\t                if (enabled == 1)\n\t                    pApCliEntry->bBlockAssoc = TRUE;\n\t                else\n\t                    /* WPA MIC error should block association attempt for 60 seconds */\n\t                    pApCliEntry->bBlockAssoc = FALSE;\n\t                \tDBGPRINT(RT_DEBUG_TRACE, (\"Set ApCli::OID_SET_COUNTERMEASURES bBlockAssoc=%s\\n\", pApCliEntry->bBlockAssoc ? \"TRUE\":\"FALSE\"));\n\t            }\n\t\t        break;\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n    \n    \tcase OID_802_11_DEAUTHENTICATION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DEAUTHENTICATION\\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{                \t\t\t\t\t\t\t\t\n\t\t\t\tMAC_TABLE_ENTRY \t\t*pEntry = NULL;\n\t\t\t\tMLME_DEAUTH_REQ_STRUCT  *pInfo = NULL;\n\t\t\t\tMLME_QUEUE_ELEM \t\t*Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\t\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t\t\t{\n\t\t\t\t\tifIndex = pObj->ioctl_if;\n\t\t\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\t\t\tpCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\t\t\t\t\tif (ifIndex >= MAX_APCLI_NUM)\n\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\n\t\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pInfo, sizeof(MLME_DEAUTH_REQ_STRUCT));\n\t\t\t\t\tStatus = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\t/* Fill in the related information */\n\t\t\t\t\tDeAuthFrame.Reason = (USHORT)pInfo->Reason;\n\t\t\t\t\tCOPY_MAC_ADDR(DeAuthFrame.Addr, pInfo->Addr);\n\t\t\t\t\t\n\t\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\t\t\t  APCLI_AUTH_STATE_MACHINE, \n\t\t\t\t\t\t\t\t  APCLI_MT2_MLME_DEAUTH_REQ, \n\t\t\t\t\t\t\t\t  sizeof(MLME_DEAUTH_REQ_STRUCT),\n\t\t\t\t\t\t\t\t  &DeAuthFrame, \n\t\t\t\t\t\t\t\t  ifIndex);\n\n\t\t\t\t\tif (pApCliEntry->Valid)\n\t\t\t\t\t\tApCliLinkDown(pAd, ifIndex);\n\n\t\t\t\t\t/* set the apcli interface be invalid.*/\n\t\t\t\t\tpApCliEntry->Valid = FALSE;\n\n\t\t\t\t\t/* clear MlmeAux.Ssid and Bssid.*/\n\t\t\t\t\tNdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);\n\t\t\t\t\tpAd->MlmeAux.SsidLen = 0;\n\t\t\t\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\t\t\t\tpAd->MlmeAux.Rssi = 0;\n\n\t\t\t\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t\t\t\t\tif(pInfo)\n\t\t\t\t\t\tos_free_mem(NULL, pInfo);\n\n\t\t\t\t}\n\t\t\t\telse \n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n#endif/*APCLI_SUPPORT*/\n\t\t\t\t{\n\t\t\t\t\tif (Elem)\n\t\t\t\t\t{\n\t\t\t\t\t\tpInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;\n\t\t\t\t\t\tStatus = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\t\t\tif ((pEntry = MacTableLookup(pAd, pInfo->Addr)) != NULL)\n\t\t\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\t\t\tElem->Wcid = pEntry->Aid;\n\t\t\t\t\t\t\tMlmeEnqueue(pAd, AP_AUTH_STATE_MACHINE, APMT2_MLME_DEAUTH_REQ,\n\t\t\t\t\t\t\t\t\t\t\tsizeof(MLME_DEAUTH_REQ_STRUCT), Elem, 0);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\\n\", pInfo->Reason));\n\t\t\t\t\t\t}\n\t/*\t\t\t\t\tkfree(Elem); */\n\t\t\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tbreak;\n#ifdef IAPP_SUPPORT\n    \tcase RT_SET_IAPP_PID:\n\t\t\t{\n\t\t\t\tunsigned long IappPid;\n\t\t\t\tif (copy_from_user(&IappPid, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n    \t\t\telse\n    \t\t\t{\n\t\t\t\t\tRTMP_GET_OS_PID(pObj->IappPid, IappPid);\n\t\t\t\t\tpObj->IappPid_nr = IappPid;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_SET_APD_PID::(IappPid=%lu(0x%x))\\n\", IappPid, pObj->IappPid));\n\t\t\t\t}\n    \t\t}\n\t\t\tbreak;\n#endif /* IAPP_SUPPORT */\n\n    \tcase RT_SET_APD_PID:\n\t\t\t{\n\t\t\t\tunsigned long apd_pid;\n\t\t\t\tif (copy_from_user(&apd_pid, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n    \t\t\telse\n    \t\t\t{\n\t\t\t\t\tRTMP_GET_OS_PID(pObj->apd_pid, apd_pid);\n\t\t\t\t\tpObj->apd_pid_nr = apd_pid;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_SET_APD_PID::(ApdPid=%lu(0x%x))\\n\", apd_pid, pObj->apd_pid));\n\t\t\t\t}\n    \t\t}\n\t\t\tbreak;\n\t\tcase RT_SET_DEL_MAC_ENTRY:\n    \t\tif (copy_from_user(Addr, wrq->u.data.pointer, wrq->u.data.length))\n\t\t{\n\t\t\t\tStatus = -EFAULT; \t\n\t\t}\n    \t\telse\n    \t\t{\n\t\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_SET_DEL_MAC_ENTRY::(%02x:%02x:%02x:%02x:%02x:%02x)\\n\", Addr[0],Addr[1],Addr[2],Addr[3],Addr[4],Addr[5]));\n\n\t\t\tpEntry = MacTableLookup(pAd, Addr);\n\t\t\tif (pEntry)\n\t\t\t{\n\t\t\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);\n/*\t\t\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, Addr); */\n\t\t\t}\n    \t\t}\n\t\t\tbreak;\n\n\n#ifdef SNMP_SUPPORT\n\t\tcase OID_802_11_SHORTRETRYLIMIT:\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\t\ttx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SHORTRETRYLIMIT (tx_rty_cfg.field.ShortRetryLimit=%d, ShortRetryLimit=%ld)\\n\", tx_rty_cfg.field.ShortRtyLimit, ShortRetryLimit));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_LONGRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_LONGRETRYLIMIT \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\t\ttx_rty_cfg.field.LongRtyLimit = LongRetryLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_LONGRETRYLIMIT (tx_rty_cfg.field.LongRetryLimit= %d,LongRetryLimit=%ld)\\n\", tx_rty_cfg.field.LongRtyLimit, LongRetryLimit));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYVALUE:\n\t\t{\n\t\t\tUINT KeyIdx;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE\\n\"));\n/*\t\t\tpKey = kmalloc(wrq->u.data.length, GFP_KERNEL); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length);\n\t\t\tif (pKey == NULL)\n\t\t\t{\n\t\t\t\tStatus= -EINVAL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tStatus = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t/*pKey = &WepKey; */\n\t\t\t\n\t\t\tif ( pKey->Length != wrq->u.data.length)\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\\n\"));\n\t\t\t}\n\t\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"pKey->KeyIndex =%d, pKey->KeyLength=%d\\n\", pKey->KeyIndex, pKey->KeyLength));\n\n\t\t\t/* it is a shared key */\n\t\t\tif (KeyIdx > 4)\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t\t{\n\t\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t}\n\t\t\t\t/*RestartAPIsRequired = TRUE; */\n\t\t\t}\n\t\t\tos_free_mem(NULL, pKey);\n\t\t\tbreak;\n\n\t\t}\n\t\tcase OID_802_11_WEPDEFAULTKEYID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYID \\n\"));\n\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t\tStatus = copy_from_user(&pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\tbreak;\n\n#endif /* SNMP_SUPPORT */\n\n\t\tcase OID_802_11_CURRENTCHANNEL:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_CURRENTCHANNEL \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tSTRING\tChStr[5] = {0};\n\t\t\t\tStatus = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tsnprintf(ChStr, sizeof(ChStr), \"%d\", ctmp);\n\t\t\t\tSet_Channel_Proc(pAd, ChStr);\n\t\t\t}\n\t\t\tbreak;\n\n\n\n#ifdef DOT1X_SUPPORT\n\t\tcase OID_802_DOT1X_PMKID_CACHE:\n\t\t\tRTMPIoctlAddPMKIDCache(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_RADIUS_DATA:\n\t\t\tRTMPIoctlRadiusData(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_WPA_KEY:\n\t\t\tRTMPIoctlAddWPAKey(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_STATIC_WEP_COPY:\n\t\t\tRTMPIoctlStaticWepCopy(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_IDLE_TIMEOUT:\n\t\t\tRTMPIoctlSetIdleTimeout(pAd, wrq);\n\t\t\tbreak;\n#endif /* DOT1X_SUPPORT */\n\n        case OID_802_11_AUTHENTICATION_MODE:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE)) \n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);\n                if (AuthMode > Ndis802_11AuthModeMax)\n                {\n                    Status  = -EINVAL;\n                    break;\n                }\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t{\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\tif(apcliEn)\n\t\t\t{\n                   \t\t if (pAd->ApCfg.ApCliTab[ifIndex].AuthMode != AuthMode)\n                   \t\t {\n\t\t                        /* Config has changed */\n\t\t                        pAd->ApCfg.ApCliTab[ifIndex].bConfigChanged = TRUE;\n\t\t               }\n                    \t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = AuthMode;\n\n\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tRTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].AuthMode, pAd->ApCfg.ApCliTab[ifIndex].WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId  = 0;\n\t\t\t\t\n\t\t\t\tif(pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = 1;\n\t\t\t}\n\t\t}\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n                else\n                {\n                    if (pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode != AuthMode)\n                    {\n                        /* Config has changed */\n                        pAd->bConfigChanged = TRUE;\n                    }\n                    pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode = AuthMode;\n                }\n                pAd->ApCfg.MBSSID[pObj->ioctl_if].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_AUTHENTICATION_MODE (=%d) \\n\",pAd->ApCfg.MBSSID[0].AuthMode));\n            }\n\t\tAPStop(pAd);\n\t\tAPStartUp(pAd);\n            break;\n\n        case OID_802_11_WEP_STATUS:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS)) \n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\t\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t\t\t{\n\t\t\t\t\tifIndex = pObj->ioctl_if;\n\t\t\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\t\t\tpCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\t\t\t\t\tif (ifIndex >= MAX_APCLI_NUM)\n\t\t\t\t\t\treturn FALSE;\n\n\t\t\t\t\tif(apcliEn)\n\t\t\t\t\t{\n\t\t\t\t\t\t if (WepStatus <= Ndis802_11GroupWEP104Enabled)\n\t\t                \t\t{\n\t\t\t                   \t\t if (pAd->ApCfg.ApCliTab[ifIndex].WepStatus != WepStatus)\n\t\t\t                   \t\t {\n\t\t\t\t\t                        /* Config has changed */\n\t\t\t\t\t                        pAd->ApCfg.ApCliTab[ifIndex].bConfigChanged = TRUE;\n\t\t\t\t\t               }\n\t\t\t                    \t\tpAd->ApCfg.ApCliTab[ifIndex].WepStatus = WepStatus;\n\n\t\t\t\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpApCliEntry->PairCipher     = pApCliEntry->WepStatus;\n\t\t\t\t\t\t\tpApCliEntry->GroupCipher    = pApCliEntry->WepStatus;\n\t\t\t\t\t\t\tpApCliEntry->bMixCipher\t\t= FALSE;\n\n\t\t\t\t\t\t\tif (pApCliEntry->WepStatus >= Ndis802_11Encryption2Enabled)\n\t\t\t\t\t\t\t\tpApCliEntry->DefaultKeyId = 1;\n\n\t\t\t\t\t\t\tRTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].AuthMode, pAd->ApCfg.ApCliTab[ifIndex].WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\n\t\t\t\t\t\t }\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\telse \n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\t\t{\n\t\t/* Since TKIP, AES, WEP are all supported. It should not have any invalid setting */\n                if (WepStatus <= Ndis802_11GroupWEP104Enabled)\n                {\n                    if (pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus != WepStatus)\n                    {\n                        /* Config has changed */\n                        pAd->bConfigChanged = TRUE;\n                    }\n                    pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus     = WepStatus;\n\n                    if (pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus == Ndis802_11Encryption4Enabled){\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t}\n\t\t\t\t\telse{\n                    \tpAd->ApCfg.MBSSID[pObj->ioctl_if].GroupKeyWepStatus = WepStatus;\n                    }\n                }\n                else\n                {\n                    Status  = -EINVAL;\n                    break;\n                }\n\t\t\tAPStop(pAd);\n\t\t\tAPStartUp(pAd);\n                \tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEP_STATUS (=%d)\\n\",WepStatus));\n\t\t}\n\t}\n\n            break;\n\t\t\t\n        case OID_802_11_SSID:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))\n                Status = -EINVAL;\n            else\n            {\n            \t\tPSTRING pSsidString = NULL;\n                \tStatus = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);\n\n                \tif (Ssid.SsidLength > MAX_LEN_OF_SSID)\n                    \t\tStatus = -EINVAL;\n                \telse\n                \t{\n                \t\tif (Ssid.SsidLength == 0)\n\t\t    \t\t\t{\n                \t\t\t\tStatus = -EINVAL;\n\t\t    \t\t\t}\n\t\t\t\telse\n                    \t\t{\n\t\t\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\t\t\tif (pSsidString)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\t\t\t\tNdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength);\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tifIndex = pObj->ioctl_if;\n\t\t\t\t\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\t\t\t\t\t\t\tif(apcliEn)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSet_ApCli_Ssid_Proc(pAd,pSsidString);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNdisZeroMemory((PCHAR)pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid,MAX_LEN_OF_SSID);\n\t\t\t\t\t\t\tstrcpy((PCHAR)pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid,pSsidString);\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen=strlen(pSsidString);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tos_free_mem(NULL, pSsidString);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tStatus = -ENOMEM;\n                    }\n                }\n            }\n            break;\n\n#ifdef HOSTAPD_SUPPORT\n\tcase HOSTAPD_OID_SET_802_1X:/*pure 1x is enabled. */\n\t\t\tSet_IEEE8021X_Proc(pAd,\"1\");\n\t\t\tbreak;\n\n\tcase HOSTAPD_OID_SET_KEY:\n\t{\t\t\t\n\t\t\tUINT KeyIdx;\n\t\t\tStatus  = -EINVAL;\n\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\t\tUINT apidx = pObj->ioctl_if;\n\t\t\tif(wrq->u.data.length != sizeof(struct ieee80211req_key) || !wrq->u.data.pointer)\n\t\t\t\tbreak;\n\t\t\tStatus = copy_from_user(&Key, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tpEntry = MacTableLookup(pAd, Key.ik_macaddr);\n\n\n\t\t\tif((Key.ik_type == CIPHER_WEP64) ||(Key.ik_type == CIPHER_WEP128))/*dynamic wep with 1x */\n\t\t\t{\n\t\t\t\tif (pEntry)/*pairwise key */\n\t\t\t\t{\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = Key.ik_keylen;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, Key.ik_keydata, Key.ik_keylen);\n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = Key.ik_type;\n\t\t\t\t\tKeyIdx=pAd->ApCfg.MBSSID[pEntry->apidx].DefaultKeyId;\n                                  AsicAddPairwiseKeyEntry(\n                                      pAd, \n                                      (UCHAR)pEntry->Aid, \n                                      &pEntry->PairwiseKey);\n\n\t\t\t\t\tRTMPAddWcidAttributeEntry(\n\t\t\t\t\t\tpAd, \n\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\tKeyIdx, /* The value may be not zero */\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\tpEntry);\n\t\t\t\t}\n\t\t\t\telse/*group key */\n\t\t\t\t{\n\t\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tprintk(\"Key.ik_keyix=%x\\n\",Key.ik_keyix);\n\t\t\t\t\tKeyIdx = Key.ik_keyix& 0x0fff;\n\t\t\t\t\tprintk(\"ra%d KeyIdx=%d\\n\",apidx,KeyIdx);\n\t\t\t\t\tprintk(\"Key.ik_keyix=%x\\n\",Key.ik_keyix);\n\t\t\t\t\t/* it is a shared key */\n\t\t\t\t\tif (KeyIdx < 4)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].KeyLen = (UCHAR) Key.ik_keylen;\n\t\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][KeyIdx].Key, &Key.ik_keydata, Key.ik_keylen);\n\t\t\t\t\t\tif (Key.ik_keyix & 0x8000)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\t\t\t\tprintk(\"ra%d DefaultKeyId=%d\\n\",apidx,KeyIdx);\n\t\t\t\t\t\t\tpMbss->DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/*pMbss->DefaultKeyId=1; */\n\t\t\t\t\t\t\n\t\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].CipherAlg = Key.ik_type;\n\t\t\t\t\t\tAsicAddSharedKeyEntry(\n\t\t\t\t\t\t\tpAd,\n\t\t\t\t\t\t\tapidx,\n\t\t\t\t\t\t\tKeyIdx,\n\t\t\t\t\t\t  \t&pAd->SharedKey[apidx][KeyIdx]\n\t\t\t\t\t\t  \t);\n\n\t\t\t\t\t\tRTMPAddWcidAttributeEntry(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg,\n\t\t\t\t\t\t\tNULL);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry)\n\t\t\t{\n\t\t\t\tKeyIdx = Key.ik_keyix& 0x0fff;\n\t\t\t\tif (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t{\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = LEN_TK;\n\t\t\t\t\tNdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keydata, Key.ik_keylen);\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keylen);\n\t\t\t\t}\n\n\t\t\t\tif(pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t{\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = LEN_TK;\n\t\t\t\t\tNdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keydata, OFFSET_OF_PTK_TK);\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keylen);\n\t\t\t\t}\n\n\n    \t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_NONE;\n    \t\t\t\tif (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n        \t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;\n    \t\t\t\telse if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n        \t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_AES;\n\t\t\t\t\n\t\t\t\tpEntry->PairwiseKey.CipherAlg = Key.ik_type;\n\t\t\t\t \n                            AsicAddPairwiseKeyEntry(\n                                pAd, \n                                (UCHAR)pEntry->Aid, \n                                &pEntry->PairwiseKey);\t\n\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t(UINT8)KeyIdx, \t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\tpEntry->Aid,\n\t\t\t\t\tPAIRWISEKEYTABLE);\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\tKeyIdx = Key.ik_keyix& 0x0fff;\n\t\t\t\t\n\t\t\t\t/*if (Key.ik_keyix & 0x8000) */\n\t\t\t\t{\n\t\t\t\t\tpMbss->DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t}\n\n\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t{\n\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen= LEN_TK;\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key, Key.ik_keydata, 16);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].RxMic, (Key.ik_keydata+16+8), 8);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxMic, (Key.ik_keydata+16), 8);\n\t\t\t\t}\n\n\t\t\t\tif(pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t{\n\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen= LEN_TK;\t\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key, Key.ik_keydata, 16);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].RxMic, (Key.ik_keydata+16+8), 8);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxMic, (Key.ik_keydata+16), 8);\n\t\t\t\t}\n\n    \t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg  = CIPHER_NONE;\n    \t\t\t\tif (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption2Enabled)\n        \t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_TKIP;\n    \t\t\t\telse if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n        \t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_AES;\n\n\t\t\t\thex_dump(\"Key.ik_keydata,\", (unsigned char*) Key.ik_keydata, 32);\n\n\t\t\t\tAsicAddSharedKeyEntry(\n\t\t\t\t\tpAd,\n\t\t\t\t\tapidx,\n\t\t\t\t\tpMbss->DefaultKeyId,\n\t\t\t\t\t&pAd->SharedKey[apidx][pMbss->DefaultKeyId]\n\t\t\t\t\t);\n\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, apidx,(UINT8)KeyIdx, \n\t\t\t\t\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg, Wcid, SHAREDKEYTABLE);\n\t\t\t\t\n\t\t\t\t/*RTMPAddWcidAttributeEntry(\n\t\t\t\tpAd, \n\t\t\t\tapidx,\n\t\t\t\tpMbss->DefaultKeyId, \n\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg,\n\t\t\t\tNULL);*/\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase HOSTAPD_OID_DEL_KEY:\n\n\t\t\tStatus  = -EINVAL;\n\t\t\tif(wrq->u.data.length != sizeof(struct ieee80211req_del_key) || !wrq->u.data.pointer)\n\t\t\t\tbreak;\n\t\t\tStatus = copy_from_user(&delkey, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tpEntry = MacTableLookup(pAd, delkey.idk_macaddr);\n\t\t\tif (pEntry){\n\t\t\t\t/* clear the previous Pairwise key table */\n\t\t\t\tif(pEntry->Aid != 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));\n\t\t\t\t\tAsicRemovePairwiseKeyEntry(pAd,(UCHAR)pEntry->Aid);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if((delkey.idk_macaddr == NULL) && (delkey.idk_keyix < 4))\n\t\t\t\t/* remove group key */\n\t\t\t\tAsicRemoveSharedKeyEntry(pAd, pEntry->apidx, delkey.idk_keyix);\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_SET_STA_AUTHORIZED:/*for portsecured flag. */\n\n\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t{\n\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tpEntry = MacTableLookup(pAd, mlme.im_macaddr);\n\t\t\t\tif (!pEntry){\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tswitch (mlme.im_op)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase IEEE80211_MLME_AUTHORIZE:\n\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t\t\t\tpEntry->WpaState = AS_PTKINITDONE;/*wpa state machine is not in use. */\n\t\t\t\t\t\t\t/*pAd->StaCfg.PortSecured= WPA_802_1X_PORT_SECURED; */\n\t\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase IEEE80211_MLME_UNAUTHORIZE:\n\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_STATIC_WEP_COPY:\n\t\t{\t\t\t\n\t\t\tUINT KeyIdx;\n\t\t\tINT\t apidx;\n\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t{\n\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tpEntry = MacTableLookup(pAd, mlme.im_macaddr);\n\t\t\t\tif (!pEntry){\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\t/*Status  = -EINVAL; */\n\t\t\t\t\tprintk(\"Woody HOSTAPD_OID_STATIC_WEP_COPY IEEE8021X=%d WepStatus=%d\\n\",pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X, pEntry->WepStatus);\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X != TRUE) break;\n\t\t\t\t\tif (pEntry->WepStatus != Ndis802_11Encryption1Enabled) break;\n\n\t\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\t\n\t\t\t\t\tKeyIdx=pMbss->DefaultKeyId;\n\t\t\t\t\tprintk(\"Woody HOSTAPD_OID_STATIC_WEP_COPY=%d\\n\",KeyIdx);\n\t\t\t\t\tpEntry->AuthMode=pAd->ApCfg.MBSSID[apidx].AuthMode;\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = pAd->SharedKey[apidx][KeyIdx].KeyLen;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[apidx][KeyIdx].Key, pAd->SharedKey[apidx][KeyIdx].KeyLen);\n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n\t\t\t\t\t\n                  \tAsicAddPairwiseKeyEntry(\n\t                      pAd, \n\t                      (UCHAR)pEntry->Aid, \n\t                      &pEntry->PairwiseKey);\n\n\t\t\t\t\tRTMPAddWcidAttributeEntry(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\tKeyIdx, /* The value may be not zero */\n\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\tpEntry);\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase HOSTAPD_OID_SET_STA_DEAUTH:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::HOSTAPD_OID_SET_STA_DEAUTH\\n\"));\n\t\t\tMLME_DEAUTH_REQ_STRUCT  *pInfo;\n\t\t\tMLME_QUEUE_ELEM \t\t*Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif(Elem)\n\t\t\t{\n\t\t\t\tpInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;\n\n\t\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t\t{\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tNdisMoveMemory(pInfo->Addr, mlme.im_macaddr, MAC_ADDR_LEN);\n\t\t\t\t\tif ((pEntry = MacTableLookup(pAd, pInfo->Addr)) != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tpInfo->Reason = mlme.im_reason;\n\t\t\t\t\t\tElem->Wcid = pEntry->Aid;\n\t\t\t\t\t\tMlmeEnqueue(pAd, AP_AUTH_STATE_MACHINE, APMT2_MLME_DEAUTH_REQ, sizeof(MLME_DEAUTH_REQ_STRUCT), Elem,0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_SET_STA_DISASSOC:/*hostapd request to disassoc the station. */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::HOSTAPD_OID_SET_STA_DISASSOC\\n\"));\n\t\t\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t{\n\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tNdisMoveMemory(DisassocReq.Addr, mlme.im_macaddr, MAC_ADDR_LEN);\n\t\t\t\tDisassocReq.Reason = mlme.im_reason;\n\t\t\t\tMlmeEnqueue(pAd, AP_ASSOC_STATE_MACHINE, APMT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq,0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_HOSTAPD_SUPPORT:/*notify the driver to support hostapd. */\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN hostapd_enable;\n\t\t\t\tint v, apidx;\n\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\tStatus = copy_from_user(&hostapd_enable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tprintk(\"OID_HOSTAPD_SUPPORT apidx=%d\\n\",apidx);\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].Hostapd = hostapd_enable;\n\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\n\t\t\t\tfor(v=0;v<MAX_MBSSID_NUM(pAd);v++)\n\t\t\t\t{\n\t\t\t\t       if(pAd->ApCfg.MBSSID[v].Hostapd == TRUE)\n\t\t\t\t\t   \tprintk(\"ApCfg->MBSSID[%d].Hostapd == TURE\\n\",v);\n\t\t\t\t\t   else\n\t\t\t\t\t   \tprintk(\"ApCfg->MBSSID[%d].Hostapd == FALSE\\n\",v);\n\t\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[v];\n\t\t\t\t\tpMBSSStruct->WPAREKEY.ReKeyInterval = 0;\n\t\t\t\t\tpMBSSStruct->WPAREKEY.ReKeyMethod = DISABLE_REKEY;\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase HOSTAPD_OID_COUNTERMEASURES:/*report txtsc to hostapd. */\n\t\t\t\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN countermeasures_enable;\n\t\t\t\tStatus = copy_from_user(&countermeasures_enable, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif(countermeasures_enable)\n\t\t\t\t{\n\n    \t\t\t\t\t\t{\n        \t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Receive CM Attack Twice within 60 seconds ====>>> \\n\"));\n        \n\t\t\t\t\t\t\t/* send wireless event - for counter measures */\n\t\t\t\t\t\t\tpAd->ApCfg.CMTimerRunning = FALSE;\n\n\t\t\t\t\t\t        for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t\t        {\n\t\t\t\t\t\t        \tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\t\t            /* happened twice within 60 sec,  AP SENDS disaccociate all associated STAs.  All STA's transition to State 2 */\n\t\t\t\t\t\t            if (IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\t            {\n\t\t\t\t\t\t                MlmeDeAuthAction(pAd, &pAd->MacTab.Content[i], REASON_MIC_FAILURE,FALSE);\n\t\t\t\t\t\t            }\n\t\t\t\t\t\t        }\n\t        \n\t\t\t\t\t\t        /* Further,  ban all Class 3 DATA transportation for  a period 0f 60 sec */\n\t\t\t\t\t\t        /* disallow new association , too */\n\t\t\t\t\t\t        pAd->ApCfg.BANClass3Data = TRUE;        \n\n\t\t\t\t\t\t    }\n\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{        \n    \t\t\t\t\t    pAd->ApCfg.BANClass3Data = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\tcase HOSTAPD_OID_SET_WPS_BEACON_IE:/*pure 1x is enabled. */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"HOSTAPD_OID_SET_WPS_BEACON_IE\\n\"));\n\t\t\t\tif (wrq->u.data.length != sizeof(WSC_LV_INFO))\n\t\t\t\t{\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\n\t\t\t\t\tINT apidx;\n\t\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE;\n\t\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\t\t\t\t\tNdisZeroMemory(&WscIEBeacon,sizeof(WSC_LV_INFO));\n\t\t\t\t\tStatus = copy_from_user(&WscIEBeacon, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tNdisMoveMemory(pMBSSStruct->WscIEBeacon.Value,WscIEBeacon.Value, WscIEBeacon.ValueLen);\n\t\t\t\t\tpMBSSStruct->WscIEBeacon.ValueLen=WscIEBeacon.ValueLen;\n\t\t\t\t\tAPUpdateBeaconFrame(pAd, apidx);\n\t\t\t\t}\n\n\t\t\tbreak;\n\n\tcase HOSTAPD_OID_SET_WPS_PROBE_RESP_IE:/*pure 1x is enabled. */\n\t\t\t{\n\t\t\t\tINT apidx;\n\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"HOSTAPD_OID_SET_WPS_PROBE_RESP_IE\\n\"));\n\t\t\t\tif (wrq->u.data.length != sizeof(WSC_LV_INFO))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"HOSTAPD_OID_SET_WPS_PROBE_RESP_IE failed\\n\"));\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\n\t\t\t\t\tINT apidx;\n\t\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE;\n\t\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\t\t\t\t\tNdisZeroMemory(&WscIEProbeResp,sizeof(WSC_LV_INFO));\n\t\t\t\t\tStatus = copy_from_user(&WscIEProbeResp, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tNdisMoveMemory(pMBSSStruct->WscIEProbeResp.Value,WscIEProbeResp.Value, WscIEProbeResp.ValueLen);\n\t\t\t\t\tpMBSSStruct->WscIEProbeResp.ValueLen=WscIEProbeResp.ValueLen;\n\t\t\t\t\tAPUpdateBeaconFrame(pAd, apidx);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\n\t\t\tbreak;\n\t\t\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\n   \t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::unknown IOCTL's subcmd = 0x%08x\\n\", cmd));\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n    }\n\t\n\n\treturn Status;\n}\n\n\nINT RTMPAPQueryInformation(\n\tIN\tPRTMP_ADAPTER       pAd,\n\tIN\tOUT\tRTMP_IOCTL_INPUT_STRUCT    *rq,\n\tIN\tINT                 cmd)\n{\n\tRTMP_IOCTL_INPUT_STRUCT\t*wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;\n    INT\tStatus = NDIS_STATUS_SUCCESS;\n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n    STRING\tdriverVersion[8];\n\n#if defined(DBG) || defined(WSC_AP_SUPPORT)\n\tUCHAR\tapidx = pObj->ioctl_if;\n#endif\n\n#ifdef SNMP_SUPPORT\t\n\t/*for snmp, kathy */\n\tULONG ulInfo;\n\tDefaultKeyIdxValue\t\t\t*pKeyIdxValue;\n\tINT\t\t\t\t\t\t\tvalueLen;\n\tTX_RTY_CFG_STRUC\t\t\ttx_rty_cfg;\n\tULONG\t\t\t\t\t\tShortRetryLimit, LongRetryLimit;\n\tUCHAR\t\t\t\t\t\tsnmp_tmp[64];\n#endif /* SNMP_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n\tstruct default_group_key\t\t\tgroup_key;\n\tstruct ieee80211req_key\t\t\tik;\n\tunsigned char\t\t\t\t\t\t*p;\n\tMAC_TABLE_ENTRY\t\t\t\t*pEntry=(MAC_TABLE_ENTRY *)NULL;\n\tstruct ieee80211req_wpaie\t\t\twpaie;\n\tPMULTISSID_STRUCT\tpMbss ;\n#endif /*HOSTAPD_SUPPORT*/\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn=FALSE;\n\tINT \t\t\t\t\t\t\t\ti,Padding = 0;;\n\tULONG \t\t\t\t\t\tBssBufSize;\n\tPUCHAR                              pBuf = NULL, pPtr=NULL;\n\tNDIS_802_11_BSSID_LIST_EX           *pBssidList = NULL;\n\t USHORT                              BssLen = 0;\n\t  PNDIS_WLAN_BSSID_EX                 pBss;\n\t  MAC_TABLE_ENTRY\t\t\t\t*pMacEntry=(MAC_TABLE_ENTRY *)NULL;\n\t  PAPCLI_STRUCT pApCliEntry=NULL;\n\t  \tNDIS_802_11_SSID                    Ssid;\n\tUINT                                we_version_compiled;\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n\n\tNDIS_802_11_STATISTICS\t*pStatistics;\n\n\n\n\n   INT IEEE8021X = 0;\n    NDIS_802_11_AUTHENTICATION_MODE     AuthMode = Ndis802_11AuthModeMax;\n    switch(cmd)\n    {\n#ifdef DOT1X_SUPPORT\n\tcase OID_802_11_SET_IEEE8021X:\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_SET_IEEE8021X \\n\"));\n                wrq->u.data.length = sizeof(INT);\n                if(pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X == TRUE)\n                        IEEE8021X=1;\n                else\n                        IEEE8021X=0;\n\n                Status = copy_to_user(wrq->u.data.pointer, &IEEE8021X, wrq->u.data.length);\n                break;\n#endif /* DOT1X_SUPPORT */\n\tcase OID_802_11_AUTHENTICATION_MODE:\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_AUTHENTICATION_MODE \\n\"));\n\t        wrq->u.data.length = sizeof(NDIS_802_11_AUTHENTICATION_MODE);\n\t        AuthMode=pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode;\n\t        Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length);\n                break;\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t        case RT_OID_NEW_DRIVER:\n\t            {\n\t                UCHAR enabled = 1;\n\t    \t        wrq->u.data.length = sizeof(UCHAR);\n\t    \t        Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length);\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Query apcli::RT_OID_NEW_DRIVER (=%d)\\n\", enabled));\n\t\t\t   break;\n\t            }\n\t\t     \n\t    \tcase RT_OID_WE_VERSION_COMPILED:\n\t\t        \twrq->u.data.length = sizeof(UINT);\n\t\t\t        we_version_compiled = RtmpOsWirelessExtVerGet();\n\t\t        \tStatus = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);\n\t\t        \tbreak;\n\n        case OID_802_11_BSSID_LIST:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\n\t\t\tpMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ifIndex].MacTabWCID]; \n\t\t\t\n            if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n            {\n            \t/*\n            \t * Still scanning, indicate the caller should try again.\n            \t */\n            \tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_BSSID_LIST (Still scanning)\\n\"));\n\t\t\t\treturn -EAGAIN;\n            }\n\t\t\tif ((pAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].WpaSupplicantScanCount = 0;\n\t\t\t}\n\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_BSSID_LIST (%d BSS returned)\\n\",pAd->ScanTab.BssNr));\n            BssBufSize = sizeof(ULONG);\n            \n            for (i = 0; i < pAd->ScanTab.BssNr; i++) \n            {\n                BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);\n            }\n\n            BssBufSize += 256;\n\t\tos_alloc_mem(pAd, (UCHAR **)&pBuf, BssBufSize);\n            if(pBuf == NULL)\n            {\n                Status = -ENOMEM;\n                break;\n            }\n            NdisZeroMemory(pBuf, BssBufSize);\n            pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;\n            pBssidList->NumberOfItems = pAd->ScanTab.BssNr;\n            \n            BssLen = 4; /* Consist of NumberOfItems */\n            pPtr = (PUCHAR) &pBssidList->Bssid[0];\n            for (i = 0; i < pAd->ScanTab.BssNr; i++) \n            {\n                pBss = (PNDIS_WLAN_BSSID_EX) pPtr;\n                NdisMoveMemory(&pBss->MacAddress, &pAd->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);\n                if ((pAd->ScanTab.BssEntry[i].Hidden == 1))\n                {\n                    /*\n\t\t\t\t\t We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation\n\t\t\t\t\t and then failed to send EAPOl farame.\n\t\t\t*/\n\t\t\t\t\tif ((pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA) && (pMacEntry->PortSecured != WPA_802_1X_PORT_SECURED))\n\t\t\t\t\t{\n\t\t\t\t\t\tpBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;\n\t\t\t\t\t\tNdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);\n\t\t\t\t\t}\n\t\t\t\t\telse\n                    \tpBss->Ssid.SsidLength = 0;\n                }\n                else\n                {\n                    pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;\n                    NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);\n                }\n                pBss->Privacy = pAd->ScanTab.BssEntry[i].Privacy;\n                pBss->Rssi = pAd->ScanTab.BssEntry[i].Rssi - pAd->BbpRssiToDbmDelta;\n                pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAd->ScanTab.BssEntry[i]);\n                pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);\n                pBss->Configuration.BeaconPeriod = pAd->ScanTab.BssEntry[i].BeaconPeriod;  \n                pBss->Configuration.ATIMWindow = pAd->ScanTab.BssEntry[i].AtimWin;\n\n                MAP_CHANNEL_ID_TO_KHZ(pAd->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);\n\n                if (pAd->ScanTab.BssEntry[i].BssType == BSS_INFRA) \n                    pBss->InfrastructureMode = Ndis802_11Infrastructure;\n                else\n                    pBss->InfrastructureMode = Ndis802_11IBSS;\n\n                NdisMoveMemory(pBss->SupportedRates, pAd->ScanTab.BssEntry[i].SupRate, pAd->ScanTab.BssEntry[i].SupRateLen);\n                NdisMoveMemory(pBss->SupportedRates + pAd->ScanTab.BssEntry[i].SupRateLen,\n                               pAd->ScanTab.BssEntry[i].ExtRate,\n                               pAd->ScanTab.BssEntry[i].ExtRateLen);\n\n                if (pAd->ScanTab.BssEntry[i].VarIELen == 0)\n                {\n                    pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);\n                    NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));\n                    pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);\n                }\n                else\n                {\n                    pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen);\n                    pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);\n                    NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));\n                    NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAd->ScanTab.BssEntry[i].VarIEs, pAd->ScanTab.BssEntry[i].VarIELen);\n                    pPtr += pAd->ScanTab.BssEntry[i].VarIELen;\n                }\n                pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);\n\n#if WIRELESS_EXT < 17                \n                if ((BssLen + pBss->Length) < wrq->u.data.length)\n                BssLen += pBss->Length;\n                else\n                {\n                    pBssidList->NumberOfItems = i;\n                    break;\n                }\n#else\n                BssLen += pBss->Length;\n#endif\n            }\n\n#if WIRELESS_EXT < 17            \n            wrq->u.data.length = BssLen;\n#else\n            if (BssLen > wrq->u.data.length)\n            {\n\t\t   os_free_mem(NULL, pBssidList);\n                return -E2BIG;\n            }\n            else\n                wrq->u.data.length = BssLen;\n#endif\n            Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen);\n\t\t   os_free_mem(NULL, pBssidList);\n            break;\n        case OID_802_3_CURRENT_ADDRESS:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tpApCliEntry=&pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\n\t\t\tpMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ifIndex].MacTabWCID]; \n\t\t\t\n            \t\twrq->u.data.length = MAC_ADDR_LEN;\n            \t\tStatus = copy_to_user(wrq->u.data.pointer, pApCliEntry->CurrentAddress, wrq->u.data.length);\n            break;\n  \n        case OID_802_11_BSSID:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tpApCliEntry=&pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\t\t\t\n            if (INFRA_ON(pAd) || ADHOC_ON(pAd))\n            {\n                Status = copy_to_user(wrq->u.data.pointer, pApCliEntry->CfgApCliBssid, sizeof(NDIS_802_11_MAC_ADDRESS));\n\n\n                DBGPRINT(RT_DEBUG_INFO, (\"IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n                       pApCliEntry->CfgApCliBssid[0],pApCliEntry->CfgApCliBssid[1],pApCliEntry->CfgApCliBssid[2],\n                        pApCliEntry->CfgApCliBssid[3],pApCliEntry->CfgApCliBssid[4],pApCliEntry->CfgApCliBssid[5]));\n\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_BSSID(=EMPTY)\\n\"));\n                Status = -ENOTCONN;\n            }\n            break;\n        case OID_802_11_SSID:\n\n\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\treturn FALSE;\n\n\t\t\tifIndex = pObj->ioctl_if;\n\t\t\tpApCliEntry=&pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t\tif (!apcliEn)\n\t\t\t\treturn FALSE;\n\t\t\t\n\t\t\tNdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n\t\t\tNdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);\n            \t\tSsid.SsidLength = pApCliEntry->CfgSsidLen;\n\t\t\tNdisMoveMemory(Ssid.Ssid, pApCliEntry->CfgSsid,Ssid.SsidLength);\n            \t\twrq->u.data.length = sizeof(NDIS_802_11_SSID);\n            \t\tStatus = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);\n           \t\t DBGPRINT(RT_DEBUG_TRACE, (\"Query Apcli::OID_802_11_SSID (Len=%d, ssid=%s)\\n\", Ssid.SsidLength,Ssid.Ssid));\n            break;\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n\n\t\tcase RT_OID_VERSION_INFO:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_VERSION_INFO \\n\"));\n\t\t\twrq->u.data.length = 8*sizeof(CHAR);\n\t\t\tsnprintf(&driverVersion[0], sizeof(driverVersion), \"%s\", AP_DRIVER_VERSION);\n\t\t\tdriverVersion[7] = '\\0';\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &driverVersion, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_NETWORK_TYPES_SUPPORTED:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_NETWORK_TYPES_SUPPORTED \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->RfIcType, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT; \t\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef IAPP_SUPPORT\n\t\tcase RT_QUERY_SIGNAL_CONTEXT:\n\t\t{\n\t\t\tBOOLEAN FlgIs11rSup = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_QUERY_SIGNAL_CONTEXT \\n\"));\n\n\n\t\t\tif (FlgIs11rSup == FALSE)\n\t\t\t{\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t}\n\t\t}\n\t\t\tbreak;\n\n\n#endif /* IAPP_SUPPORT */\n\n\n#ifdef LLTD_SUPPORT\n\n        case RT_OID_GET_LLTD_ASSO_TABLE:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::Get LLTD association table\\n\"));\n            if ((wrq->u.data.pointer == NULL) || (apidx != MAIN_MBSSID))\n            {\n                Status = -EFAULT;\n            }\n            else\n            {\n                INT\t\t\t\t\t\t    i;\n                RT_LLTD_ASSOICATION_TABLE\tAssocTab;\n\n            \tAssocTab.Num = 0;\n            \tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n            \t{\n            \t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC))\n            \t\t{\n            \t\t\tCOPY_MAC_ADDR(AssocTab.Entry[AssocTab.Num].Addr, &pAd->MacTab.Content[i].Addr);\n                        AssocTab.Entry[AssocTab.Num].phyMode = pAd->CommonCfg.PhyMode;\n                        AssocTab.Entry[AssocTab.Num].MOR = RateIdToMbps[pAd->ApCfg.MBSSID[apidx].MaxTxRate] * 2;\n            \t\t\tAssocTab.Num += 1;\n            \t\t}\n            \t}            \n                wrq->u.data.length = sizeof(RT_LLTD_ASSOICATION_TABLE);\n            \tif (copy_to_user(wrq->u.data.pointer, &AssocTab, wrq->u.data.length))\n            \t{\n            \t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n                    Status = -EFAULT;\n            \t}\n                DBGPRINT(RT_DEBUG_TRACE, (\"AssocTab.Num = %d \\n\", AssocTab.Num));\n            }\n            break;\n#ifdef APCLI_SUPPORT\n\t\tcase RT_OID_GET_REPEATER_AP_LINEAGE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Not Support : Get repeater AP lineage.\\n\"));\n\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n#endif /* LLTD_SUPPORT */\n#ifdef DOT1X_SUPPORT\n\t\tcase OID_802_DOT1X_CONFIGURATION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::Get Radius setting(%d)\\n\", sizeof(DOT1X_CMM_CONF)));\n\t\t\t\tRTMPIoctlQueryRadiusConf(pAd, wrq);\t\n\t\t\tbreak;\n#endif /* DOT1X_SUPPORT */\t\t\t\n\n\t\tcase RT_OID_802_11_MAC_ADDRESS:\n                        wrq->u.data.length = MAC_ADDR_LEN;\n                        Status = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].Bssid, wrq->u.data.length);\n\t\t\tbreak;\n\n#ifdef SNMP_SUPPORT\n\t\tcase RT_OID_802_11_MANUFACTUREROUI:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTUREROUI \\n\"));\n\t\t\twrq->u.data.length = ManufacturerOUI_LEN;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTURERNAME:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTURERNAME \\n\"));\n\t\t\twrq->u.data.length = strlen(ManufacturerNAME);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_RESOURCETYPEIDNAME:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_RESOURCETYPEIDNAME \\n\"));\n\t\t\twrq->u.data.length = strlen(ResourceTypeIdName);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:\n\t\t{\t\t\t\n\t\t\tULONG ulInfo;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \\n\"));\n\t\t\tulInfo = 1; /* 1 is support wep else 2 is not support. */\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n\t\t}\n\t\tcase RT_OID_802_11_POWERMANAGEMENTMODE:\n\t\t{\n\t\t\tULONG ulInfo;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_POWERMANAGEMENTMODE \\n\"));\n\t\t\tulInfo = 1; /* 1 is power active else 2 is power save. */\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n\t\t}\n\t\tcase OID_802_11_WEPDEFAULTKEYVALUE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WEPDEFAULTKEYVALUE \\n\"));\n\t\t\tpKeyIdxValue = wrq->u.data.pointer;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"KeyIdxValue.KeyIdx = %d, \\n\",pKeyIdxValue->KeyIdx));\n\n\t\t\tvalueLen = pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen;\n\t\t\tNdisMoveMemory(pKeyIdxValue->Value,\n\t\t\t\t\t\t   &pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].Key,\n\t\t\t\t\t\t   valueLen);\n\t\t\tpKeyIdxValue->Value[valueLen]='\\0';\n\n\t\t\twrq->u.data.length = sizeof(DefaultKeyIdxValue);\n\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \\n\", pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.length, pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen,\n\t\t\tpAd->SharedKey[pObj->ioctl_if][0].Key[0],\n\t\t\tpAd->SharedKey[pObj->ioctl_if][1].Key[0],\n\t\t\tpAd->SharedKey[pObj->ioctl_if][2].Key[0],\n\t\t\tpAd->SharedKey[pObj->ioctl_if][3].Key[0]));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WEPDEFAULTKEYID \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DefaultKeyId =%d \\n\", pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId));\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_WEPKEYMAPPINGLENGTH:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer,\n\t\t\t\t\t\t\t\t\t&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen,\n\t\t\t\t\t\t\t\t\twrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_SHORTRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_SHORTRETRYLIMIT \\n\"));\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\tShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ShortRetryLimit =%ld,  tx_rty_cfg.field.ShortRetryLimit=%d\\n\", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_LONGRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_LONGRETRYLIMIT \\n\"));\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\tLongRetryLimit = tx_rty_cfg.field.LongRtyLimit;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"LongRetryLimit =%ld,  tx_rty_cfg.field.LongRtyLimit=%d\\n\", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);\n\t\t\tbreak;\n\t\t\t\n\t\tcase RT_OID_802_11_PRODUCTID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PRODUCTID \\n\"));\n\t\t\n#ifdef RTMP_MAC_USB\n\t\t\tsnprintf((PSTRING)snmp_tmp, sizeof(snmp_tmp), \"%04x %04x\\n\", \n\t\t\t\t\t\tRtmpOsGetUsbDevVendorID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev),\n\t\t\t\t\t\tRtmpOsGetUsbDevProductID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev));\n#endif /* RTMP_MAC_USB */\n\t\t\twrq->u.data.length = strlen((PSTRING) snmp_tmp);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, snmp_tmp, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTUREID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTUREID \\n\"));\n\t\t\twrq->u.data.length = strlen(ManufacturerNAME);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);\n\t\t\tbreak;\n\n#endif /* SNMP_SUPPORT */\n\n\t\tcase OID_802_11_CURRENTCHANNEL:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_CURRENTCHANNEL \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"sizeof UCHAR=%d, channel=%d \\n\", sizeof(UCHAR), pAd->CommonCfg.Channel));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\t\t\tbreak;\n\n        case OID_802_11_STATISTICS:\n/*            pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pStatistics, sizeof(NDIS_802_11_STATISTICS));\n            if (pStatistics)\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_STATISTICS \\n\"));\n                /* add the most up-to-date h/w raw counters into software counters */\n\t\t\t/*NICUpdateRawCounters(pAd);*/\n                \n\t\t\tpStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;\n                pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;\n                pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart;\n                pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;\n                pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart;\n                pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart;\n                pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart;\n                pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart;\n                pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart;\n                pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;\n                pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;\n#ifdef DBG\t\n                pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount;\n#else\n                pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart;\n                pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100;\n#endif\n\t\t\tpStatistics->TransmittedFrameCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;\n\t\t\tpStatistics->WEPUndecryptableCount.QuadPart = pAd->WlanCounters.WEPUndecryptableCount.QuadPart;\n                wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);\n                Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);\n/*                kfree(pStatistics); */\n\t\t\t\tos_free_mem(NULL, pStatistics);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_STATISTICS(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n\n\tcase RT_OID_802_11_PER_BSS_STATISTICS:\n\t\t{\n\t\t\tPMBSS_STATISTICS pMbssStat;\n\t\t\tINT apidx = pObj->ioctl_if;\n\t\t\tPMULTISSID_STRUCT\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n\t\t\tos_alloc_mem(pAd, (UCHAR * *) &pMbssStat, sizeof(MBSS_STATISTICS));\n\t\t\tNdisZeroMemory(pMbssStat, sizeof(MBSS_STATISTICS));\n\n\t\t\tpMbssStat->TransmittedByteCount = pMbss->TransmittedByteCount;\n\t\t\tpMbssStat->ReceivedByteCount =  pMbss->ReceivedByteCount;\n\t\t\tpMbssStat->TxCount =  pMbss->TxCount;\n\t\t\tpMbssStat->RxCount =  pMbss->RxCount;\n\t\t\tpMbssStat->RxErrorCount =  pMbss->RxErrorCount;\n\t\t\tpMbssStat->RxDropCount =  pMbss->RxDropCount;\n\t\t\tpMbssStat->TxErrorCount =  pMbss->TxErrorCount;\n\t\t\tpMbssStat->TxDropCount =  pMbss->TxDropCount;\n\t\t\tpMbssStat->ucPktsTx =  pMbss->ucPktsTx;\n\t\t\tpMbssStat->ucPktsRx =  pMbss->ucPktsRx;\n\t\t\tpMbssStat->mcPktsTx =  pMbss->mcPktsTx;\n\t\t\tpMbssStat->mcPktsRx =  pMbss->mcPktsRx;\n\t\t\tpMbssStat->bcPktsTx=  pMbss->bcPktsTx;\n\t\t\tpMbssStat->bcPktsRx=  pMbss->bcPktsRx;\n\t\t\twrq->u.data.length = sizeof(MBSS_STATISTICS);\n\t\t\tcopy_to_user(wrq->u.data.pointer, pMbssStat, wrq->u.data.length);\n\t\t\tos_free_mem(pAd, pMbssStat);\t\t\t\n\t\t}\n\t\tbreak;\n\n#ifdef DOT11_N_SUPPORT\n#endif /* DOT11_N_SUPPORT */\n\n\n\n#ifdef HOSTAPD_SUPPORT\n\n\t\tcase HOSTAPD_OID_GETWPAIE:/*report wpa ie of the new station to hostapd. */\n\t\t\t\n\t\t\tif (wrq->u.data.length != sizeof(wpaie))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse if (copy_from_user(&wpaie, wrq->u.data.pointer, IEEE80211_ADDR_LEN))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpEntry = MacTableLookup(pAd, wpaie.wpa_macaddr);\n\t\t\t\tif (!pEntry){\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisZeroMemory(wpaie.rsn_ie,sizeof(wpaie.rsn_ie));\n\t\t\t\t/* For WPA1, RSN_IE=221 */\n\t\t\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) \n\t\t\t\t\t||(pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t\t\t|| (pEntry->AuthMode == Ndis802_11AuthModeWPA1WPA2) ||(pEntry->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tint ielen = pEntry->RSNIE_Len;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pEntry->RSNIE_Len=%d\\n\",pEntry->RSNIE_Len));\n\t\t\t\t\tif (ielen > sizeof(wpaie.rsn_ie))\n\t\t\t\t\t\tielen = sizeof(wpaie.rsn_ie)-1;\n\t\t\t\t\tp = wpaie.rsn_ie;\n\t\t\t\t\thex_dump(\"HOSTAPD_OID_GETWPAIE woody==>pEntry->RSN_IE\", (unsigned char*)pEntry->RSN_IE,ielen);\n\t\t\t\t\tNdisMoveMemory(p, pEntry->RSN_IE, ielen);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(copy_to_user(wrq->u.data.pointer, &wpaie, sizeof(wpaie)))\n\t\t\t\tStatus = -EFAULT;\n\t\t\tbreak;\n\n\t\t\t\n\t\tcase HOSTAPD_OID_GET_SEQ:/*report txtsc to hostapd. */\n\n\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\tif (wrq->u.data.length != sizeof(ik))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse if (copy_from_user(&ik, wrq->u.data.pointer, IEEE80211_ADDR_LEN))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&ik.ik_keytsc, sizeof(ik.ik_keytsc));\n\t\t\t\tp = (unsigned char *)&ik.ik_keytsc;\n\t\t\t\tNdisMoveMemory(p+2, pAd->SharedKey[apidx][ pMbss->DefaultKeyId].TxTsc, 6);\n\t\t\t\tif(copy_to_user(wrq->u.data.pointer, &ik, sizeof(ik)))\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\t\n\t\tcase HOSTAPD_OID_GET_1X_GROUP_KEY:/*report default group key to hostapd. */\n\n\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\tif (wrq->u.data.length != sizeof(group_key))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen!=0 && pAd->SharedKey[apidx][ pMbss->DefaultKeyId].Key!=NULL)\n\t\t\t\t{\n\t\t\t\t\tgroup_key.ik_keyix = pMbss->DefaultKeyId;\n\t\t\t\t\tgroup_key.ik_keylen = pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen;\n\t\t\t\t\tNdisMoveMemory(group_key.ik_keydata, pAd->SharedKey[apidx][ pMbss->DefaultKeyId].Key,pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen);\n\t\t\t\t\tif(copy_to_user(wrq->u.data.pointer, &group_key, sizeof(group_key)))\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n#endif/*HOSTAPD_SUPPORT*/\n\n#ifdef APCLI_SUPPORT\n\t\tcase OID_GEN_MEDIA_CONNECT_STATUS:\n\t\t\t{\n\t\t\t\tULONG ApCliIdx = pObj->ioctl_if;\n\n\t\t\t\tNDIS_MEDIA_STATE MediaState;\n\t\t\t\tPMAC_TABLE_ENTRY pEntry;\n\t\t\t\tPAPCLI_STRUCT pApCliEntry;\n\n\t\t\t\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\t\t\t{\n\t\t\t\t\tStatus = -EOPNOTSUPP;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tAPCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);\n\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ApCliIdx];\n\t\t\t\t\tpEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\n\t\t\t\t\tif (!IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t{\n\t\t\t\t\t\tStatus = -EOPNOTSUPP;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((pAd->ApCfg.ApCliTab[ApCliIdx].Valid == TRUE)\n\t\t\t\t\t\t&& (pEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n\t\t\t\t\t\tMediaState = NdisMediaStateConnected;\n\t\t\t\t\telse\n\t\t\t\t\t\tMediaState = NdisMediaStateDisconnected;\n\n\t\t\t\t\twrq->u.data.length = sizeof(NDIS_MEDIA_STATE);\n\t\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n\n\n\n\t\tcase OID_802_11_ACL_LIST:\n\t\t\tif (wrq->u.data.length < sizeof(RT_802_11_ACL))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\t\t}\n\t\t\tbreak;\n\n   \t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::unknown IOCTL's subcmd = 0x%08x, apidx=%d\\n\", cmd, apidx));\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n    }\n\n\treturn Status;\n}\n\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Country Code.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_CountryCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t/* reset temp table status */\n\tpAd->CommonCfg.pChDesp = NULL;\n\tpAd->CommonCfg.DfsType = MAX_RD_REGION;\t\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\tif(strlen(arg) == 2)\n\t{\n\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, arg, 2);\n\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\t}\n\telse\n\t{\n\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\tpAd->CommonCfg.bCountryFlag = FALSE;\n\t}\t\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryCode_Proc::(bCountryFlag=%d, CountryCode=%s)\\n\", pAd->CommonCfg.bCountryFlag, pAd->CommonCfg.CountryCode));\n\n\treturn TRUE;\n}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_ChGeography_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Geography;\n\t\t\n\tGeography = simple_strtol(arg, 0, 10);\n\tif (Geography <= BOTH)\n\t\tpAd->CommonCfg.Geography = Geography;\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ChannelGeography_Proc::(wrong setting. 0: Out-door, 1: in-door, 2: both)\\n\"));\n\n\tpAd->CommonCfg.CountryCode[2] =\n\t\t(pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ChannelGeography_Proc:: Geography = %s\\n\", pAd->CommonCfg.Geography == ODOR ? \"out-door\" : (pAd->CommonCfg.Geography == IDOR ? \"in-door\" : \"both\")));\n\t\n\t/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */\n\t/* it's no longer necessary since APStartUp will rebuild channel again. */\n\t/*BuildChannelListEx(pAd); */\n\n\treturn TRUE;\t\t\t\n}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\n/*\n    ==========================================================================\n    Description:\n        Set Country String.\n        This command will not work, if the field of CountryRegion in eeprom is programmed.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_CountryString_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT   index = 0;\n\tINT   success = TRUE;\n\tSTRING  name_buffer[40] = {0};\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\treturn -EOPNOTSUPP;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\tif(strlen(arg) <= 38)\n\t{\n\t\tif (strlen(arg) < 4)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::Parameter of CountryString are too short !\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\tfor (index = 0; index < strlen(arg); index++)\n\t\t{\n\t\t\tif ((arg[index] >= 'a') && (arg[index] <= 'z'))\n\t\t\t\targ[index] = toupper(arg[index]);\n\t\t}\n\n\t\tfor (index = 0; index < NUM_OF_COUNTRIES; index++)\n\t\t{\n\t\t\tNdisZeroMemory(name_buffer, 40);\n\t\t\tsnprintf(name_buffer, sizeof(name_buffer), \"\\\"%s\\\"\", (PSTRING) allCountry[index].pCountryName);\n\n\t\t\tif (strncmp((PSTRING) allCountry[index].pCountryName, arg, strlen(arg)) == 0)\n\t\t\t\tbreak;\n\t\t\telse if (strncmp(name_buffer, arg, strlen(arg)) == 0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (index == NUM_OF_COUNTRIES)\n\t\t\tsuccess = FALSE;\n\t}\n\telse\n\t{\n\t\tsuccess = FALSE;\n\t}\t\t\t\n\n\tif (success == TRUE)\n\t{\n\t\tswitch(pAd->CommonCfg.PhyMode)\n\t\t{\n\t\t\tcase PHY_11BG_MIXED:\t/* 0 */\n\t\t\tcase PHY_11B:\t\t\t/* 1 */\n\t\t\tcase PHY_11G:\t\t\t/* 4 */\n#ifdef DOT11_N_SUPPORT\n\t\t\tcase PHY_11N_2_4G:\t\t/* 6 */\n\t\t\tcase PHY_11GN_MIXED:\t/* 7 */\n\t\t\tcase PHY_11BGN_MIXED:\t/* 9 */\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tif (pAd->CommonCfg.CountryRegionForABand & 0x80)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::parameter of CountryRegion in eeprom is programmed \\n\"));\n\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (allCountry[index].SupportGBand == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\t\t\t\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, allCountry[index].IsoName, 2);\n\t\t\t\t\t\tpAd->CommonCfg.CountryCode[2] = ' ';\n\n\t\t\t\t\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\n\t\t\t\t\t\tpAd->CommonCfg.CountryRegion = (UCHAR) allCountry[index].RegDomainNum11G;\n\n\t\t\t\t\t\t/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */\n\t\t\t\t\t\t/* it's no longer necessary since APStartUp will rebuild channel again. */\n\t\t\t\t\t\t/*BuildChannelList(pAd); */\n\n\t\t\t\t\t\tsuccess = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The Country are not Support G Band Channel\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase PHY_11A:\t\t\t/* 2 */\n#ifdef DOT11_N_SUPPORT\n\t\t\tcase PHY_11AN_MIXED:\t/* 8 */\n\t\t\tcase PHY_11N_5G:\t\t/* 11 */\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tif (pAd->CommonCfg.CountryRegion & 0x80)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::parameter of CountryRegion in eeprom is programmed \\n\"));\n\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (allCountry[index].SupportABand == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\t\t\t\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, allCountry[index].IsoName, 2);\n\t\t\t\t\t\tpAd->CommonCfg.CountryCode[2] = ' ';\n\n\t\t\t\t\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\n\t\t\t\t\t\tpAd->CommonCfg.CountryRegionForABand = (UCHAR) allCountry[index].RegDomainNum11A;\n\n\t\t\t\t\t\t/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */\n\t\t\t\t\t\t/* it's no longer necessary since APStartUp will rebuild channel again. */\n\t\t\t\t\t\t/*BuildChannelList(pAd); */\n\n\t\t\t\t\t\tsuccess = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The Country are not Support A Band Channel\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault :\n\t\t\t\tsuccess = FALSE;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (success == TRUE)\n\t{\n\t\t/* if set country string, driver needs to be reset */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryString_Proc::(CountryString=%s CountryRegin=%d CountryCode=%s)\\n\", \n\t\t\t\t\t\t\tallCountry[index].pCountryName, pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryCode));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::Parameters out of range\\n\"));\n\t}\n\n\treturn success;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set SSID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_SSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT   success = FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAdapter->OS_Cookie;\n\n\tif(strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tNdisZeroMemory(pAdapter->ApCfg.MBSSID[pObj->ioctl_if].Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAdapter->ApCfg.MBSSID[pObj->ioctl_if].Ssid, arg, strlen(arg));\n\t\tpAdapter->ApCfg.MBSSID[pObj->ioctl_if].SsidLen = (UCHAR)strlen(arg);\n\t\tsuccess = TRUE;\n\n\n\t\t{\n\t\t\t/* If in detection mode, need to stop detect first. */\n\t\t\tif (pAdapter->CommonCfg.bIEEE80211H == FALSE)\n\t\t\t{\n\t\t\t\tAPStop(pAdapter);\n\t\t\t\tAPStartUp(pAdapter);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* each mode has different restart method */\n\t\t\t\tif (pAdapter->Dot11_H.RDMode == RD_SILENCE_MODE)\n\t\t\t\t{\n\t\t\t\t\tAPStop(pAdapter);\n\t\t\t\t\tAPStartUp(pAdapter);\n\t\t\t\t}\n\t\t\t\telse if (pAdapter->Dot11_H.RDMode == RD_SWITCHING_MODE)\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\telse if (pAdapter->Dot11_H.RDMode == RD_NORMAL_MODE)\n\t\t\t\t{\n\t\t\t\t\tAPStop(pAdapter);\n\t\t\t\t\tAPStartUp(pAdapter);\n\t\t\t\t\tAsicEnableBssSync(pAdapter);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_SSID_Proc::(Len=%d,Ssid=%s)\\n\", pObj->ioctl_if,\n\t\t\t\tpAdapter->ApCfg.MBSSID[pObj->ioctl_if].SsidLen, pAdapter->ApCfg.MBSSID[pObj->ioctl_if].Ssid));\n\t\t}\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\treturn success;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set TxRate\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_TxRate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tNdisZeroMemory(pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRates, MAX_LEN_OF_SUPPORTED_RATES);\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex = simple_strtol(arg, 0, 10);\n\t/* todo RTMPBuildDesireRate(pAd, pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex); */\n\t\n\t/*todo MlmeUpdateTxRates(pAd); */\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set BasicRate\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_BasicRate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tULONG BasicRateBitmap;\n\n    BasicRateBitmap = (ULONG) simple_strtol(arg, 0, 10);\n\n    if (BasicRateBitmap > 4095) /* (2 ^ MAX_LEN_OF_SUPPORTED_RATES) -1 */\n        return FALSE;\n\n    pAd->CommonCfg.BasicRateBitmap = BasicRateBitmap;\n    pAd->CommonCfg.BasicRateBitmapOld = BasicRateBitmap;\n\n    MlmeUpdateTxRates(pAd, FALSE, (UCHAR)pObj->ioctl_if);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_BasicRate_Proc::(BasicRateBitmap=0x%08lx)\\n\", pAd->CommonCfg.BasicRateBitmap));\n    \n    return TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Beacon Period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_BeaconPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT BeaconPeriod;\n\tINT   success = FALSE;\n\n\tBeaconPeriod = (USHORT) simple_strtol(arg, 0, 10);\n\tif((BeaconPeriod >= 20) && (BeaconPeriod < 1024))\n\t{\n\t\tpAd->CommonCfg.BeaconPeriod = BeaconPeriod;\n\t\tsuccess = TRUE;\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t/* re-calculate QloadBusyTimeThreshold */\n\t\tQBSS_LoadAlarmReset(pAd);\n#endif /* AP_QLOAD_SUPPORT */\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_BeaconPeriod_Proc::(BeaconPeriod=%d)\\n\", pAd->CommonCfg.BeaconPeriod));\n\n\treturn success;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Dtim Period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_DtimPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT DtimPeriod;\n\tINT   success = FALSE;\n\n\tDtimPeriod = (USHORT) simple_strtol(arg, 0, 10);\n\tif((DtimPeriod >= 1) && (DtimPeriod <= 255))\n\t{\n\t\tpAd->ApCfg.DtimPeriod = DtimPeriod;\n\t\tsuccess = TRUE;\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_DtimPeriod_Proc::(DtimPeriod=%d)\\n\", pAd->ApCfg.DtimPeriod));\n\n\treturn success;\n}\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Disable/enable OLBC detection manually\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_OLBCDetection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tswitch (simple_strtol(arg, 0, 10))\n\t{\n\t\tcase 0: /*enable OLBC detect */\n\t\t\tpAd->CommonCfg.DisableOLBCDetect = 0;\n\t\t\tbreak;\n\t\tcase 1: /*disable OLBC detect */\n\t\t\tpAd->CommonCfg.DisableOLBCDetect = 1;\n\t\t\tbreak;\n\t\tdefault:  /*Invalid argument */\n\t\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\n#ifdef WMM_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set WmmCapable Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\tbWmmCapable;\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tbWmmCapable = simple_strtol(arg, 0, 10);\n\n\tif (bWmmCapable == 1)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable = TRUE;\n\telse if (bWmmCapable == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapableOrg = \\\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable;\n\t\n#ifdef RTL865X_FAST_PATH\t\n\tif (!isFastPathCapable(pAd)) {\n\t\trtlairgo_fast_tx_unregister();\n\t\trtl865x_extDev_unregisterUcastTxDev(pAd->net_dev);\t\t\n\t}\n#endif\n\n#ifdef DOT11_N_SUPPORT\n\t/*Sync with the HT relate info. In N mode, we should re-enable it */\n\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WmmCapable_Proc::(bWmmCapable=%d)\\n\", \n\t\tpObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable));\n\n\treturn TRUE;\n}\n#endif /* WMM_SUPPORT */\n\n\nINT\tSet_AP_MaxStaNum_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tINT\t\t\tapidx = pObj->ioctl_if;\n\n\treturn ApCfg_Set_MaxStaNum_Proc(pAd, apidx, arg);\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set session idle timeout\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_IdleTimeout_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\treturn ApCfg_Set_IdleTimeout_Proc(pAd, arg);\n}\n/* \n    ==========================================================================\n    Description:\n        Set No Forwarding Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_NoForwarding_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG NoForwarding;\n\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tNoForwarding = simple_strtol(arg, 0, 10);\n\n\tif (NoForwarding == 1)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = TRUE;\n\telse if (NoForwarding == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_NoForwarding_Proc::(NoForwarding=%ld)\\n\", \n\t\tpObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set No Forwarding between each SSID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_NoForwardingBTNSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG NoForwarding;\n\n\tNoForwarding = simple_strtol(arg, 0, 10);\n\n\tif (NoForwarding == 1)\n\t\tpAd->ApCfg.IsolateInterStaTrafficBTNBSSID = TRUE;\n\telse if (NoForwarding == 0)\n\t\tpAd->ApCfg.IsolateInterStaTrafficBTNBSSID = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_NoForwardingBTNSSID_Proc::(NoForwarding=%ld)\\n\", pAd->ApCfg.IsolateInterStaTrafficBTNBSSID));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Hide SSID Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_HideSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN bHideSsid;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tbHideSsid = simple_strtol(arg, 0, 10);\n\n\tif (bHideSsid == 1)\n\t\tbHideSsid = TRUE;\n\telse if (bHideSsid == 0)\n\t\tbHideSsid = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid != bHideSsid)\n\t{\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid = bHideSsid;\n\t}\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_HideSSID_Proc::(HideSSID=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set VLAN's ID field\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_VLANID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_VID = simple_strtol(arg, 0, 10);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_VLANID_Proc::(VLAN_VID=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_VID));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set VLAN's priority field\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_VLANPriority_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_Priority = simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_VLANPriority_Proc::(VLAN_Priority=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_Priority));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set enable or disable carry VLAN in the air\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_VLAN_TAG_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\tbVLAN_Tag;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tbVLAN_Tag = simple_strtol(arg, 0, 10);\n\n\tif (bVLAN_Tag == 1)\n\t\tbVLAN_Tag = TRUE;\n\telse if (bVLAN_Tag == 0)\n\t\tbVLAN_Tag = FALSE;\n\telse\n\t\treturn FALSE;  //Invalid argument \n\t\n\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].bVLAN_Tag != bVLAN_Tag)\n\t{\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bVLAN_Tag = bVLAN_Tag;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_VLAN_TAG_Proc::(VLAN_Tag=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bVLAN_Tag));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG       i;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\n\tif (apidx >= pAd->ApCfg.BssidNum)\n\t\treturn FALSE;  \n\n\t/* Set Authentication mode */\n\tApCfg_Set_AuthMode_Proc(pAd, apidx, arg);\n\n\t/* reset the portSecure for all entries */\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))\n\t\t{\n\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t}\n\t}\n\n\t/* reset the PortSecure this BSS */\n\tpAd->ApCfg.MBSSID[apidx].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t/* Default key index is always 2 in WPA mode */\t\n\tif(pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 1;\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Encryption Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_EncrypType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\t\n\tif ((strcmp(arg, \"NONE\") == 0) || (strcmp(arg, \"none\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPDisabled;\n\telse if ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPEnabled;\n\telse if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption2Enabled;\n\telse if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption3Enabled;\n\telse if ((strcmp(arg, \"TKIPAES\") == 0) || (strcmp(arg, \"tkipaes\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption4Enabled;\n\telse\n\t\treturn FALSE;\n\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus >= Ndis802_11Encryption2Enabled)\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 1;\n\n\t/* decide the group key encryption type */\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\t\n\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\t\t\n\telse\n\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = pAd->ApCfg.MBSSID[apidx].WepStatus;\n\n\t/* move to ap.c::APStartUp to process */\n    /*RTMPMakeRSNIE(pAd, pAd->ApCfg.MBSSID[apidx].AuthMode, pAd->ApCfg.MBSSID[apidx].WepStatus, apidx); */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_EncrypType_Proc::(EncrypType=%d)\\n\", apidx, pAd->ApCfg.MBSSID[apidx].WepStatus));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA pairwise mix-cipher combination\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_WpaMixPairCipher_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\n\t/*\n\t\tIn WPA-WPA2 mix mode, it provides a more flexible cipher combination. \n\t\t-\tWPA-AES and WPA2-TKIP\n\t\t-\tWPA-AES and WPA2-TKIPAES\n\t\t-\tWPA-TKIP and WPA2-AES\n\t\t-\tWPA-TKIP and WPA2-TKIPAES\n\t\t-\tWPA-TKIPAES and WPA2-AES\n\t\t-\tWPA-TKIPAES and WPA2-TKIP\n\t\t-\tWPA-TKIPAES and WPA2-TKIPAES (default)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t */\t\t\t\t\t\t\t\t\t\n\tif ((strncmp(arg, \"WPA_AES_WPA2_TKIPAES\", 20) == 0) || (strncmp(arg, \"wpa_aes_wpa2_tkipaes\", 20) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_AES_WPA2_TKIPAES;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\telse if ((strncmp(arg, \"WPA_AES_WPA2_TKIP\", 17) == 0) || (strncmp(arg, \"wpa_aes_wpa2_tkip\", 17) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_AES_WPA2_TKIP;\t\t\t\t\t\t\t\t \t\t\t\t\t\t\n\telse if ((strncmp(arg, \"WPA_TKIP_WPA2_AES\", 17) == 0) || (strncmp(arg, \"wpa_tkip_wpa2_aes\", 17) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIP_WPA2_AES;\t\t\t\t\t\t\t\t\n\telse if ((strncmp(arg, \"WPA_TKIP_WPA2_TKIPAES\", 21) == 0) || (strncmp(arg, \"wpa_tkip_wpa2_tkipaes\", 21) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIP_WPA2_TKIPAES;\n\telse if ((strncmp(arg, \"WPA_TKIPAES_WPA2_AES\", 20) == 0) || (strncmp(arg, \"wpa_tkipaes_wpa2_aes\", 20) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIPAES_WPA2_AES;\n\telse if ((strncmp(arg, \"WPA_TKIPAES_WPA2_TKIPAES\", 24) == 0) || (strncmp(arg, \"wpa_tkipaes_wpa2_tkipaes\", 24) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;\n\telse if ((strncmp(arg, \"WPA_TKIPAES_WPA2_TKIP\", 21) == 0) || (strncmp(arg, \"wpa_tkipaes_wpa2_tkip\", 21) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIP;\n\telse\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_WpaMixPairCipher_Proc=0x%02x\\n\", apidx, pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher));\n\t\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA rekey interval value\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_RekeyInterval_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\tINT32\tval;\n\n\tval = simple_strtol(arg, 0, 10);\n\n\tif((val >= 10) && (val < MAX_REKEY_INTER))\n\t\tpAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval = val;\n\telse /* Default */\n\t\tpAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval = 3600;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_RekeyInterval_Proc=%ld\\n\", \n\t\t\t\t\t\t\t\tapidx, pAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA rekey method\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_RekeyMethod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\tPRT_WPA_REKEY\tpInfo = &pAd->ApCfg.MBSSID[apidx].WPAREKEY;\n\t\n\tif ((strcmp(arg, \"TIME\") == 0) || (strcmp(arg, \"time\") == 0))\n\t\tpInfo->ReKeyMethod = TIME_REKEY;\n\telse if ((strcmp(arg, \"PKT\") == 0) || (strcmp(arg, \"pkt\") == 0))\n\t\tpInfo->ReKeyMethod = PKT_REKEY;\n\telse if ((strcmp(arg, \"DISABLE\") == 0) || (strcmp(arg, \"disable\") == 0))\n\t\tpInfo->ReKeyMethod = DISABLE_REKEY;\n\telse\n\t\tpInfo->ReKeyMethod = DISABLE_REKEY;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_RekeyMethod_Proc=%ld\\n\", \n\t\t\t\t\t\t\t\tapidx, pInfo->ReKeyMethod));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set PMK-cache period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_PMKCachePeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\tUINT32 val = simple_strtol(arg, 0, 10);\n\n\tpAd->ApCfg.MBSSID[apidx].PMKCachePeriod = val * 60 * OS_HZ;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_PMKCachePeriod_Proc=%ld\\n\", \n\t\t\t\t\t\t\t\t\tapidx, pAd->ApCfg.MBSSID[apidx].PMKCachePeriod));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Default Key ID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_DefaultKeyID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG KeyIdx;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tapidx = pObj->ioctl_if;\n\n\n\tKeyIdx = simple_strtol(arg, 0, 10);\n\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n\telse\n\t\treturn FALSE;  /* Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\\n\", apidx, pAd->ApCfg.MBSSID[apidx].DefaultKeyId));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY1\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][0];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 0);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 0, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key1_Proc::(Key1=%s) success!\\n\", apidx, arg));\n\t}\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY2\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][1];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 1);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 1, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key2_Proc::(Key2=%s) success!\\n\", apidx, arg));\n\t}\n\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY3\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][2];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 2);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 2, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key3_Proc::(Key3=%s) success!\\n\", apidx, arg));\n\t}\n\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY4\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][3];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 3);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 3, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key4_Proc::(Key4=%s) success!\\n\", apidx, arg));\n\t}\n\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Access ctrol policy\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AccessPolicy_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tswitch (simple_strtol(arg, 0, 10))\n\t{\n\t\tcase 0: /*Disable */\n\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 0;\n\t\t\tbreak;\n\t\tcase 1: /* Allow All, and ACL is positive. */\n\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 1;\n\t\t\tbreak;\n\t\tcase 2: /* Reject All, and ACL is negative. */\n\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 2;\n\t\t\tbreak;\n\t\tdefault: /*Invalid argument */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_AccessPolicy_Proc::Invalid argument (=%s)\\n\", arg));\t\t\n\t\t\treturn FALSE;\n\t}\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_AccessPolicy_Proc::(AccessPolicy=%ld)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy));\n\n\treturn TRUE;\t\n}\n\n\n/* Replaced by Set_ACLAddEntry_Proc() and Set_ACLClearAll_Proc() */\n\n/* \n    ==========================================================================\n    Description:\n        Add one entry or several entries(if allowed to)\n        \tinto Access control mac table list\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLAddEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tmacAddr[MAC_ADDR_LEN];\n/*\tRT_802_11_ACL\t\t\tacl; */\n\tRT_802_11_ACL\t\t\t*pacl = NULL;\n\tPSTRING\t\t\t\t\tthis_char;\n\tPSTRING\t\t\t\t\tvalue;\n\tINT\t\t\t\t\t\ti, j;\n\tBOOLEAN\t\t\t\t\tisDuplicate=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num >= (MAX_NUM_OF_ACL_LIST - 1))\n    {\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The AccessControlList is full, and no more entry can join the list!\\n\"));\t\t\n\t\treturn FALSE;\n\t}\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL));\n\tif (pacl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tNdisZeroMemory(pacl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(pacl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\n\twhile ((this_char = strsep((char **)&arg, \";\")) != NULL)\n\t{\n\t\tif (*this_char == '\\0')\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"An unnecessary delimiter entered!\\n\"));\n\t\t\tcontinue;\n\t\t}\n\t\tif (strlen(this_char) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address length!\\n\"));\n\t\t\tcontinue;\n\t\t}\n        for (i=0, value = rstrtok(this_char,\":\"); value; value = rstrtok(NULL,\":\")) \n\t\t{\n\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address format or octet!\\n\"));\n\t\t\t\t/* Do not use \"continue\" to replace \"break\" */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tAtoH(value, &macAddr[i++], 1);\n\t\t}\n\n\t\tif (i != MAC_ADDR_LEN)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Check if this entry is duplicate. */\n\t\tisDuplicate = FALSE;\n\t\tfor (j=0; j<pacl->Num; j++)\n\t\t{\n\t\t\tif (memcmp(pacl->Entry[j].Addr, &macAddr, 6) == 0)\n\t\t\t{\n\t\t\t\tisDuplicate = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"You have added an entry before :\\n\"));\n\t        \tDBGPRINT(RT_DEBUG_WARN, (\"The duplicate entry is %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t\t}\n\t\t}\n\n\t\tif (!isDuplicate)\n\t\t{\n\t\t\tNdisMoveMemory(pacl->Entry[pacl->Num++].Addr, &macAddr, MAC_ADDR_LEN);\n\t\t}\n\n\t\tif (pacl->Num == MAX_NUM_OF_ACL_LIST)\n\t    {\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"The AccessControlList is full, and no more entry can join the list!\\n\"));\n        \tDBGPRINT(RT_DEBUG_WARN, (\"The last entry of ACL is %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tASSERT(pacl->Num < MAX_NUM_OF_ACL_LIST);\n\n\tNdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, pacl, sizeof(RT_802_11_ACL));\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::%s(Policy=%ld, Entry#=%ld)\\n\",\n\t\t__FUNCTION__ , pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));\n\n#ifdef DBG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"=============== Entry ===============\\n\"));\n\tfor (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)\n\t{\n\t\tprintk(\"Entry #%02d: \", i+1);\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t   printk(\"%02X \", pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]);\n\t\tprintk(\"\\n\");\n\t}\n#endif\n\n\tif (pacl != NULL)\n\t\tos_free_mem(NULL, pacl);\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Delete one entry or several entries(if allowed to)\n        \tfrom Access control mac table list\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLDelEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tmacAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\tnullAddr[MAC_ADDR_LEN];\n\tRT_802_11_ACL\t\t\tacl;\n\tPSTRING\t\t\t\t\tthis_char;\n\tPSTRING\t\t\t\t\tvalue;\n\tINT\t\t\t\t\t\ti, j;\n\tBOOLEAN\t\t\t\t\tisFound=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tNdisZeroMemory(&acl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&acl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\tNdisZeroMemory(nullAddr, MAC_ADDR_LEN);\n\t\n\twhile ((this_char = strsep((char **)&arg, \";\")) != NULL)\n\t{\n\t\tif (*this_char == '\\0')\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"An unnecessary delimiter entered!\\n\"));\n\t\t\tcontinue;\n\t\t}\n\t\tif (strlen(this_char) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address length!\\n\"));\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (i=0, value = rstrtok(this_char,\":\"); value; value = rstrtok(NULL,\":\")) \n\t\t{\n\t\t\tif ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address format or octet!\\n\"));\n\t\t\t\t/* Do not use \"continue\" to replace \"break\" */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tAtoH(value, &macAddr[i++], 1);\n\t\t}\n\n\t\tif (i != MAC_ADDR_LEN)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Check if this entry existed. */\n\t\tisFound = FALSE;\n\t\tfor (j=0; j<acl.Num; j++)\n\t\t{\n\t\t\tif (memcmp(acl.Entry[j].Addr, &macAddr, MAC_ADDR_LEN) == 0)\n\t\t\t{\n\t\t\t\tisFound = TRUE;\n\t\t\t\tNdisZeroMemory(acl.Entry[j].Addr, MAC_ADDR_LEN);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The entry %02x:%02x:%02x:%02x:%02x:%02x founded will be deleted!\\n\",\n\t        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t\t}\n\t\t}\n\n\t\tif (!isFound)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The entry %02x:%02x:%02x:%02x:%02x:%02x is not in the list!\\n\",\n        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t}\n\t}\n\t\n\tNdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = acl.Policy;\n\tASSERT(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num == 0);\n\ti = 0;\n\n\tfor (j=0; j<acl.Num; j++)\n\t{\n\t\tif (memcmp(acl.Entry[j].Addr, &nullAddr, MAC_ADDR_LEN) == 0)\n\t\t{\n\t\t\tcontinue;\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i++]), acl.Entry[j].Addr, MAC_ADDR_LEN);\n\t\t}\n\t}\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num = i;\n\tASSERT(acl.Num >= pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num);\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::%s(Policy=%ld, Entry#=%ld)\\n\",\n\t\t__FUNCTION__ , pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));\n\n#ifdef DBG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"=============== Entry ===============\\n\"));\n\tfor (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)\n\t{\n\t\tprintk(\"Entry #%02d: \", i+1);\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t   printk(\"%02X \", pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]);\n\t\tprintk(\"\\n\");\n\t}\n#endif\n\treturn TRUE;\n}\n\n\n/* for ACL policy message */\n#define ACL_POLICY_TYPE_NUM\t3\nchar const *pACL_PolicyMessage[ACL_POLICY_TYPE_NUM] = {   \t\n\t\"the Access Control feature is disabled\",\t\t\t\t\t\t/* 0 : Disable */\n\t\"only the following entries are allowed to join this BSS\",\t\t\t/* 1 : Allow */\n\t\"all the following entries are rejected to join this BSS\",\t\t\t/* 2 : Reject */\n};\n\n\n/* \n    ==========================================================================\n    Description:\n        Dump all the entries in the Access control \n        \tmac table list of a specified BSS\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLShowAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tRT_802_11_ACL\t\t\tacl;\n\tBOOLEAN\t\t\t\t\tbDumpAll=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tINT\t\t\t\t\t\ti, j;\n\t\n\tbDumpAll = simple_strtol(arg, 0, 10);\n\n\tif (bDumpAll == 1)\n\t{\n\t\tbDumpAll = TRUE;\n\t}\n\telse if (bDumpAll == 0)\n\t{\n\t\tbDumpAll = FALSE;\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Your input is 0!\\n\"));\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List will not be dumped!\\n\"));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;  /* Invalid argument */\n\t}\n\n\tNdisZeroMemory(&acl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&acl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\n\t/* Check if the list is already empty. */\n\tif (acl.Num == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List is empty!\\n\"));\n\t\treturn TRUE;\n\t}\n\n\tASSERT(((bDumpAll == 1) && (acl.Num > 0)));\n\n\t/* Show the corresponding policy first. */\n\tprintk(\"=============== Access Control Policy ===============\\n\");\n\tprintk(\"Policy is %ld : \", acl.Policy);\n\tprintk(\"%s\\n\", pACL_PolicyMessage[acl.Policy]);\n\n\t/* Dump the entry in the list one by one */\n\tprintk(\"===============  Access Control List  ===============\\n\");\n\tfor (i=0; i<acl.Num; i++)\n\t{\n\t\tprintk(\"Entry #%02d: \", i+1);\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t   printk(\"%02X \", acl.Entry[i].Addr[j]);\n\t\tprintk(\"\\n\");\n\t}\n\t\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Clear all the entries in the Access control \n        \tmac table list of a specified BSS\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLClearAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n/*\tRT_802_11_ACL\t\t\tacl; */\n\tRT_802_11_ACL\t\t\t*pacl = NULL;\n\tBOOLEAN\t\t\t\t\tbClearAll=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tbClearAll = simple_strtol(arg, 0, 10);\n\n\tif (bClearAll == 1)\n\t{\n\t\tbClearAll = TRUE;\n\t}\n\telse if (bClearAll == 0)\n\t{\n\t\tbClearAll = FALSE;\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Your input is 0!\\n\"));\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List will be kept unchanged!\\n\"));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;  /* Invalid argument */\n\t}\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL));\n\tif (pacl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tNdisZeroMemory(pacl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(pacl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\n\t/* Check if the list is already empty. */\n\tif (pacl->Num == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List is empty!\\n\"));\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"No need to clear the Access Control List!\\n\"));\n\t\treturn TRUE;\n\t}\n\n\tASSERT(((bClearAll == 1) && (pacl->Num > 0)));\n\n\t/* Clear the entry in the list one by one */\n\t/* Keep the corresponding policy unchanged. */\n\tdo\n\t{\n\t\tNdisZeroMemory(pacl->Entry[pacl->Num - 1].Addr, MAC_ADDR_LEN);\n\t\tpacl->Num -= 1;\n\t}while (pacl->Num > 0);\n\t\n\tASSERT(pacl->Num == 0);\n\n\tNdisZeroMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), pacl, sizeof(RT_802_11_ACL));\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\n\n\tif (pacl != NULL)\n\t\tos_free_mem(NULL, pacl);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::%s(Policy=%ld, Entry#=%ld)\\n\",\n\t\t__FUNCTION__, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));\n\n\treturn TRUE;\n}\n\n#ifdef DBG\nstatic void _rtmp_hexdump(int level, const char *title, const UINT8 *buf,\n\t\t\t size_t len, int show)\n{\n\tsize_t i;\n\tif (level < RTDebugLevel)\n\t\treturn;\n\tprintk(\"%s - hexdump(len=%lu):\", title, (unsigned long) len);\n\tif (show) {\n\t\tfor (i = 0; i < len; i++)\n\t\t\tprintk(\" %02x\", buf[i]);\n\t} else {\n\t\tprintk(\" [REMOVED]\");\n\t}\n\tprintk(\"\\n\");\n}\n\nvoid rtmp_hexdump(int level, const char *title, const UINT8 *buf, size_t len)\n{\n\t_rtmp_hexdump(level, title, buf, len, 1);\n}\n#endif\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 WPA pre-shared key string\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_WPAPSK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tapidx = pObj->ioctl_if;\n\tINT\tretval;\n\tMULTISSID_STRUCT *pMBSSStruct;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WPAPSK_Proc::(WPAPSK=%s)\\n\", arg));\n\n\tpMBSSStruct = &pAd->ApCfg.MBSSID[apidx];\n\tretval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pMBSSStruct->Ssid, pMBSSStruct->SsidLen, pMBSSStruct->PMK);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Reset statistics counter\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 \n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\n\nINT\tSet_RadioOn_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR radio;\n\n\tradio = simple_strtol(arg, 0, 10);\n\n\tif (radio)\n\t{\n\t\tMlmeRadioOn(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>Set_RadioOn_Proc (ON)\\n\"));\n\t}\n\telse\n\t{\n\t\tMlmeRadioOff(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>Set_RadioOn_Proc (OFF)\\n\"));\n\t}\n\t\n\treturn TRUE;\n}\n\n#ifdef AP_SCAN_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Issue a site survey command to driver\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set site_survey\n    ==========================================================================\n*/\n\n/* \n    ==========================================================================\n    Description:\n        Issue a Auto-Channel Selection command to driver\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n    \n    Note:\n        Usage: \n               1.) iwpriv ra0 set AutoChannelSel=1\n                   Ues the number of AP to choose\n               2.) iwpriv ra0 set AutoChannelSel=2\n                   Ues the False CCA count to choose\n    ==========================================================================\n*/\nINT Set_AutoChannelSel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\targ)\n{\n\tNDIS_802_11_SSID Ssid;\n\n\n\tNdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n\tif (strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tif (strlen(arg) != 0)\n\t\t{\n\t\t\tNdisMoveMemory(Ssid.Ssid, arg, strlen(arg));\n\t\t\tSsid.SsidLength = strlen(arg);\n\t\t}\n\t\telse   /*ANY ssid */\n\t\t{\n\t\t\tSsid.SsidLength = 0; \n\t\t\tmemcpy(Ssid.Ssid, \"\", 0);\n\t\t}\n\t}\n\tif (strcmp(arg,\"1\") == 0)\n\t\tpAd->ApCfg.AutoChannelAlg = ChannelAlgApCnt;\n\telse if (strcmp(arg,\"2\") == 0)\n\t\tpAd->ApCfg.AutoChannelAlg = ChannelAlgCCA;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_AutoChannelSel_Proc Alg isn't defined\\n\"));\n\t\treturn FALSE;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_AutoChannelSel_Proc Alg=%d \\n\", pAd->ApCfg.AutoChannelAlg));\n\tif (Ssid.SsidLength == 0)\n\t\tApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, TRUE);\n\telse\n\t\tApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, TRUE);\n    \n    return TRUE;\n\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Set a periodic check time for auto channel selection (unit: hour)\n   Arguments:\n       pAdapter                    Pointer to our adapter\n\n    Return Value:\n        TRUE if success, FALSE otherwise\n\n    Note:\n        Usage:\n               iwpriv ra0 set ACSCheckTime=3  (unit: hour)\n\n    ==========================================================================\n*/\nINT Set_AutoChannelSelCheckTime_Proc(\n   IN  PRTMP_ADAPTER   pAd,\n   IN  PSTRING     arg)\n{\n   UINT8 Hour = simple_strtol(arg, 0, 10);\n\n   pAd->ApCfg.ACSCheckTime = Hour*3600; /* Hour to second */\n   pAd->ApCfg.ACSCheckCount = 0; /* Reset counter */\n   DBGPRINT(RT_DEBUG_TRACE, (\"%s(): ACSCheckTime=%u seconds(%u hours)\\n\",\n                               __FUNCTION__, pAd->ApCfg.ACSCheckTime, Hour));\n   return TRUE;\n}\n#endif /* AP_SCAN_SUPPORT */\n\nINT Show_DriverInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    printk(\"Driver version: %s\\n\", AP_DRIVER_VERSION);\n    \n    return TRUE;\n}\n\nINT\tShow_MacTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i;/*, QueIdx=0; */\n    \tUINT32 RegValue;\n\tULONG DataRate=0;\n\t/*PRXD_STRUC pRxD; */\n\t/*PTXD_STRUC pTxD; */\n\t/*PRTMP_TX_RING\tpTxRing = &pAd->TxRing[QueIdx]; */\n\t/*PRTMP_MGMT_RING\tpMgmtRing = &pAd->MgmtRing; */\n\t/*PRTMP_RX_RING\tpRxRing = &pAd->RxRing; */\n\t\n\tprintk(\"\\n\");\n\tRTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue);\n\tprintk(\"BackOff Slot      : %s slot time, BKOFF_SLOT_CFG(0x1104) = 0x%08x\\n\", \n\t\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED) ? \"short\" : \"long\",\n \t\t\tRegValue);\n\n#ifdef DOT11_N_SUPPORT\n\tprintk(\"HT Operating Mode : %d\\n\", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode);\n\tprintk(\"\\n\");\n#endif /* DOT11_N_SUPPORT */\n\t\n\n\tprintk(\"\\n%-19s%-4s%-4s%-4s%-4s%-8s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s%-7s%-7s\\n\",\n\t\t   \"MAC\", \"AID\", \"BSS\", \"PSM\", \"WMM\", \"MIMOPS\", \"RSSI0\", \"RSSI1\", \n\t\t   \"RSSI2\", \"PhMd\", \"BW\", \"MCS\", \"SGI\", \"STBC\", \"Idle\", \"Rate\");\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))\n\t\t\t&& (pEntry->Sst == SST_ASSOC))\n\n\t\t{\n\t\t\tDataRate=0;\n\t\t\tgetRate(pEntry->HTPhyMode, &DataRate);\n\t\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\", (int)pEntry->Aid);\n\t\t\tprintk(\"%-4d\", (int)pEntry->apidx);\n\t\t\tprintk(\"%-4d\", (int)pEntry->PsMode);\n\t\t\tprintk(\"%-4d\", (int)CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE));\n#ifdef DOT11_N_SUPPORT\n\t\t\tprintk(\"%-8d\", (int)pEntry->MmpsMode);\n#endif /* DOT11_N_SUPPORT */\n\t\t\tprintk(\"%-7d\", pEntry->RssiSample.AvgRssi0);\n\t\t\tprintk(\"%-7d\", pEntry->RssiSample.AvgRssi1);\n\t\t\tprintk(\"%-7d\", pEntry->RssiSample.AvgRssi2);\n\t\t\t//printk(\"%-10s\", GetPhyMode(pEntry->HTPhyMode.field.MODE));\n\t\t\t//printk(\"%-6s\", GetBW(pEntry->HTPhyMode.field.BW));\n\t\t\tprintk(\"%-6d\", pEntry->HTPhyMode.field.MCS);\n\t\t\tprintk(\"%-6d\", pEntry->HTPhyMode.field.ShortGI);\n\t\t\tprintk(\"%-6d\", pEntry->HTPhyMode.field.STBC);\n\t\t\tprintk(\"%-7d\", (int)(pEntry->StaIdleTimeout - pEntry->NoDataIdleCount));\n\t\t\tprintk(\"%-7d\", (int)DataRate);\n\t\t\tprintk(\"%-10d, %d, %d%%\\n\", pEntry->DebugFIFOCount, pEntry->DebugTxCount, \n\t\t\t\t\t\t(pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0);\n\t\t\tprintk(\"\\n\");\n\t\t}\n\t} \n\n\treturn TRUE;\n}\n\nINT\tShow_StaCount_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i;/*, QueIdx=0; */\n    \tUINT32 RegValue;\n\t\n\tprintk(\"\\n\");\n\tRTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue);\n\tprintk(\"BackOff Slot      : %s slot time, BKOFF_SLOT_CFG(0x1104) = 0x%08x\\n\", \n\t\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED) ? \"short\" : \"long\",\n \t\t\tRegValue);\n\n#ifdef DOT11_N_SUPPORT\n\tprintk(\"HT Operating Mode : %d\\n\", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode);\n\tprintk(\"\\n\");\n#endif /* DOT11_N_SUPPORT */\n\t\n\tprintk(\"\\n%-19s%-4s%-12s%-12s%-12s%-12s\\n\",\n\t\t   \"MAC\", \"AID\",\"TxPackets\",\"RxPackets\",\"TxBytes\",\"RxBytes\");\n\t\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))\n\t\t\t&& (pEntry->Sst == SST_ASSOC))\n\t\t{\n\t\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\", (int)pEntry->Aid);\n\t\t\tprintk(\"%-12ld\",(ULONG)pEntry->TxPackets.QuadPart);\n\t\t\tprintk(\"%-12ld\", (ULONG)pEntry->RxPackets.QuadPart);\n\t\t\tprintk(\"%-12ld\", (ULONG)pEntry->TxBytes);\n\t\t\tprintk(\"%-12ld\", (ULONG)pEntry->RxBytes);\n\t\t\tprintk(\"\\n\");\n\t\t}\n\t} \n\n\treturn TRUE;\n}\n\nINT\tShow_StaSecurityInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i;\n\tUCHAR\tapidx;\n    \t\n\tprintk(\"\\n\");\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tprintk(\" BSS(%d) AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s, WPAMixPairCipher(0x%02X)\\n\", \n\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode, \n\t\t\t\t\t\t\tGetAuthMode(pAd->ApCfg.MBSSID[apidx].AuthMode), \n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus, \n\t\t\t\t\t\t\tGetEncryptType(pAd->ApCfg.MBSSID[apidx].WepStatus), \n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus, \n\t\t\t\t\t\t\tGetEncryptType(pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus),\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher);\t\t\n\t}\n\tprintk(\"\\n\");\n\t\n\tprintk(\"\\n%-19s%-4s%-4s%-15s%-12s\\n\",\n\t\t   \"MAC\", \"AID\", \"BSS\", \"Auth\", \"Encrypt\");\n\t\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry) && pEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\", (int)pEntry->Aid);\n\t\t\tprintk(\"%-4d\", (int)pEntry->apidx);\n\t\t\tprintk(\"%-15s\", GetAuthMode(pEntry->AuthMode));\n\t\t\tprintk(\"%-12s\", GetEncryptType(pEntry->WepStatus));\t\t\t\t\t\t\n\t\t\tprintk(\"\\n\");\n\t\t}\n\t} \n\n\treturn TRUE;\n}\n\n\n#ifdef DOT11_N_SUPPORT\nINT\tShow_BaTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i, j;\n\tBA_ORI_ENTRY *pOriBAEntry;\n\tBA_REC_ENTRY *pRecBAEntry;\n\tSTRING\t\t tmpBuf[6];\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_NONE(pEntry))\n\t\t\tcontinue;\n\n\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))\n\t\t\t&& (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t\tstrcpy(tmpBuf, \"ApCli\");\n\t\telse if (IS_ENTRY_WDS(pEntry))\n\t\t\tstrcpy(tmpBuf, \"WDS\");\n\t\telse if (IS_ENTRY_MESH(pEntry))\n\t\t\tstrcpy(tmpBuf, \"Mesh\");\n\t\telse\n\t\t\tstrcpy(tmpBuf, \"STA\");\n\t\n\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (%s) -\\n\",\n\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid, tmpBuf);\n\t\t\n\t\tprintk(\"[Recipient]\\n\");\n\t\tfor (j=0; j < NUM_OF_TID; j++)\n\t\t{\n\t\t\tif (pEntry->BARecWcidArray[j] != 0)\n\t\t\t{\n\t\t\t\tpRecBAEntry =&pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]];\n\t\t\t\tprintk(\"TID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\\n\", j, pRecBAEntry->BAWinSize, pRecBAEntry->LastIndSeq, pRecBAEntry->list.qlen);\n\t\t\t}\n\t\t}\n\t\tprintk(\"\\n\");\n\n\t\tprintk(\"[Originator]\\n\");\n\t\tfor (j=0; j < NUM_OF_TID; j++)\n\t\t{\n\t\t\tif (pEntry->BAOriWcidArray[j] != 0)\n\t\t\t{\n\t\t\t\tpOriBAEntry =&pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]];\n\t\t\t\tprintk(\"TID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\\n\", j, pOriBAEntry->BAWinSize, pOriBAEntry->Sequence, pEntry->TxSeq[j]);\n\t\t\t}\n\t\t}\n\t\tprintk(\"\\n\\n\");\n\t}\n\n\treturn TRUE;\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nINT\tShow_RAInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef PRE_ANT_SWITCH\n\tDBGPRINT(RT_DEBUG_OFF, (\"PreAntSwitch: %d\\n\", pAd->CommonCfg.PreAntSwitch));\n\tDBGPRINT(RT_DEBUG_OFF, (\"PreAntSwitchRSSI: %d\\n\", pAd->CommonCfg.PreAntSwitchRSSI));\n#endif /* PRE_ANT_SWITCH */\n\n#ifdef CFO_TRACK\n\tDBGPRINT(RT_DEBUG_OFF, (\"CFOTrack: %d\\n\", pAd->CommonCfg.CFOTrack));\n#endif /* CFO_TRACK */\n\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"LowTrafficThrd: %d\\n\", pAd->CommonCfg.lowTrafficThrd));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TrainUpRule: %d\\n\", pAd->CommonCfg.TrainUpRule));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TrainUpRuleRSSI: %d\\n\", pAd->CommonCfg.TrainUpRuleRSSI));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TrainUpLowThrd: %d\\n\", pAd->CommonCfg.TrainUpLowThrd));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TrainUpHighThrd: %d\\n\", pAd->CommonCfg.TrainUpHighThrd));\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"StreamMode: %d\\n\", pAd->CommonCfg.StreamMode));\n\tDBGPRINT(RT_DEBUG_OFF, (\"StreamModeMCS: 0x%04x\\n\", pAd->CommonCfg.StreamModeMCS));\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"DebugFlags: 0x%lx\\n\", pAd->CommonCfg.DebugFlags));\n#endif /* DBG_CTRL_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n\n\n#ifdef DOT11_N_SUPPORT\n#define MAX_AGG_CNT\t\t8\n\n/* DisplayTxAgg - display Aggregation statistics from MAC */\nstatic void DisplayTxAgg (\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tTX_AGG_CNT_STRUC\tTxAggCnt;\n\tTX_AGG_CNT0_STRUC\tTxAggCnt0;\n\tTX_AGG_CNT1_STRUC\tTxAggCnt1;\n\tTX_AGG_CNT2_STRUC\tTxAggCnt2;\n\tTX_AGG_CNT3_STRUC\tTxAggCnt3;\n#if MAX_AGG_CNT>8\n\tTX_AGG_CNTN_STRUC\tTxAggCntN;\n\tstatic USHORT aggReg[] = {\n\t\t\t\t\t\tTX_AGG_CNT4, TX_AGG_CNT5, TX_AGG_CNT6, TX_AGG_CNT7,\n\t\t\t\t\t\t};\n#endif\n\n\tUINT32\t\t\t\ttotalCount;\n\tUINT32\t\t\t\taggCnt[MAX_AGG_CNT];\n\tint \t\t\t\ti;\n\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);\n\n\taggCnt[0] = TxAggCnt0.field.AggSize1Count;\n\taggCnt[1] = TxAggCnt0.field.AggSize2Count;\n\taggCnt[2] = TxAggCnt1.field.AggSize3Count;\n\taggCnt[3] = TxAggCnt1.field.AggSize4Count;\n\taggCnt[4] = TxAggCnt2.field.AggSize5Count;\n\taggCnt[5] = TxAggCnt2.field.AggSize6Count;\n\taggCnt[6] = TxAggCnt3.field.AggSize7Count;\n\taggCnt[7] = TxAggCnt3.field.AggSize8Count;\n\n#if MAX_AGG_CNT>8\n\tfor (i=0; i<(MAX_AGG_CNT-8)/2; i++) {\n\t\tRTMP_IO_READ32(pAd, aggReg[i], &TxAggCntN.word);\n\t\taggCnt[2*i + 8] = TxAggCntN.field.AggSizeLowCount;\n\t\taggCnt[2*i + 9] = TxAggCntN.field.AggSizeHighCount;\n\t}\n#endif\n\n\ttotalCount = TxAggCnt.field.NonAggTxCount + TxAggCnt.field.AggTxCount;\n\tif (totalCount > 0)\n\t\tfor (i=0; i<MAX_AGG_CNT; i++) {\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\t%d MPDU=%d (%d%%)\\n\", i+1, aggCnt[i], aggCnt[i]*100/totalCount));\n\t\t}\n\tprintk(\"====================\\n\");\n\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nINT\tShow_Sat_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t/* Sanity check for calculation of sucessful count */\n\tprintk(\"TransmitCountFromOS = %d\\n\", pAd->WlanCounters.TransmitCountFrmOs.u.LowPart);\n\tprintk(\"TransmittedFragmentCount = %d\\n\", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart);\n\tprintk(\"MulticastTransmittedFrameCount = %d\\n\", pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart);\n\tprintk(\"FailedCount = %d\\n\", pAd->WlanCounters.FailedCount.u.LowPart);\n\tprintk(\"RetryCount = %d\\n\", pAd->WlanCounters.RetryCount.u.LowPart);\n\tprintk(\"MultipleRetryCount = %d\\n\", pAd->WlanCounters.MultipleRetryCount.u.LowPart);\n\tprintk(\"RTSSuccessCount = %d\\n\", pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n\tprintk(\"RTSFailureCount = %d\\n\", pAd->WlanCounters.RTSFailureCount.u.LowPart);\n\tprintk(\"ACKFailureCount = %d\\n\", pAd->WlanCounters.ACKFailureCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\tprintk(\"ReceivedFragmentCount = %d\\n\", pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);\n\tprintk(\"MulticastReceivedFrameCount = %d\\n\", pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart);\n#ifdef DBG \t\t\n\tprintk(\"RealFcsErrCount = %d\\n\", pAd->RalinkCounters.RealFcsErrCount.u.LowPart);\n#else\n\tprintk(\"FCSErrorCount = %d\\n\", pAd->WlanCounters.FCSErrorCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount.LowPart = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100);\n#endif\n\tprintk(\"TransmittedFrameCount = %d\\n\", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart);\n\tprintk(\"WEPUndecryptableCount = %d\\n\", pAd->WlanCounters.WEPUndecryptableCount.u.LowPart);\n\n#ifdef DOT11_N_SUPPORT\n\tprintk(\"\\n===Some 11n statistics variables: \\n\");\n\t/* Some 11n statistics variables */\n\tprintk(\"TransmittedAMSDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart);\n\tprintk(\"TransmittedOctetsInAMSDU = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart);\n\tprintk(\"ReceivedAMSDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.ReceivedAMSDUCount.u.LowPart);\t\n\tprintk(\"ReceivedOctesInAMSDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.ReceivedOctesInAMSDUCount.QuadPart);\t\n\tprintk(\"TransmittedAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart);\n\tprintk(\"TransmittedMPDUsInAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart);\n\tprintk(\"TransmittedOctetsInAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.u.LowPart);\n\tprintk(\"MPDUInReceivedAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.MPDUInReceivedAMPDUCount.u.LowPart);\n#ifdef DOT11N_DRAFT3\n\tprintk(\"fAnyStaFortyIntolerant=%d\\n\", pAd->MacTab.fAnyStaFortyIntolerant);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n{\n\tint apidx;\n\t\t\n\tfor (apidx=0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tprintk(\"-- IF-ra%d -- \\n\", apidx);\n\t\tprintk(\"Packets Received = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].RxCount);\n\t\tprintk(\"Packets Sent = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].TxCount);\n\t\tprintk(\"Bytes Received = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].ReceivedByteCount);\n\t\tprintk(\"Byte Sent = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].TransmittedByteCount);\n\t\tprintk(\"Error Packets Received = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].RxErrorCount);\n\t\tprintk(\"Drop Received Packets = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].RxDropCount);\n\t\t\n\n\t\tprintk(\"-- IF-ra%d end -- \\n\", apidx);\n\t}\n}\n\n{\n\tint i, j, k, maxMcs = MAX_MCS_SET -1;\n\tPMAC_TABLE_ENTRY pEntry;\n\n#ifdef DOT11N_SS3_SUPPORT\n\tif (IS_RT2883(pAd) || IS_RT3883(pAd))\n\t\tmaxMcs = 23;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\n\t\t\tprintk(\"\\n%02X:%02X:%02X:%02X:%02X:%02X - \",\n\t\t\t\t   pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\t   pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\\n\", (int)pEntry->Aid);\n\n\t\t\tfor (j=maxMcs; j>=0; j--)\n\t\t\t{\n\t\t\t\tif ((pEntry->TXMCSExpected[j] != 0) || (pEntry->TXMCSFailed[j] !=0))\n\t\t\t\t{\n\t\t\t\t\tprintk(\"MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\\n\",\n\t\t\t\t\t\t   j, pEntry->TXMCSExpected[j], pEntry->TXMCSSuccessful[j], \n\t\t\t\t\t\t   pEntry->TXMCSExpected[j] ? (100*pEntry->TXMCSSuccessful[j])/pEntry->TXMCSExpected[j] : 0,\n\t\t\t\t\t\t   pEntry->TXMCSFailed[j]);\n\t\t\t\t\tfor(k=maxMcs; k>=0; k--)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEntry->TXMCSAutoFallBack[j][k] != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprintk(\"\\t\\t\\tAutoMCS[%02d]: %u (%d%%)\\n\", k, pEntry->TXMCSAutoFallBack[j][k],\n\t\t\t\t\t\t\t\t   (100*pEntry->TXMCSAutoFallBack[j][k])/pEntry->TXMCSExpected[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n#ifdef DOT11_N_SUPPORT\n\t/* Display Tx Aggregation statistics */\n\tDisplayTxAgg(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n\nINT\tShow_Sat_Reset_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t/* Sanity check for calculation of sucessful count */\n\n\tprintk(\"TransmittedFragmentCount = %d\\n\", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart);\n\tprintk(\"MulticastTransmittedFrameCount = %d\\n\", pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart);\n\tprintk(\"FailedCount = %d\\n\", pAd->WlanCounters.FailedCount.u.LowPart);\n\tprintk(\"RetryCount = %d\\n\", pAd->WlanCounters.RetryCount.u.LowPart);\n\tprintk(\"MultipleRetryCount = %d\\n\", pAd->WlanCounters.MultipleRetryCount.u.LowPart);\n\tprintk(\"RTSSuccessCount = %d\\n\", pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n\tprintk(\"RTSFailureCount = %d\\n\", pAd->WlanCounters.RTSFailureCount.u.LowPart);\n\tprintk(\"ACKFailureCount = %d\\n\", pAd->WlanCounters.ACKFailureCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\tprintk(\"ReceivedFragmentCount = %d\\n\", pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);\n\tprintk(\"MulticastReceivedFrameCount = %d\\n\", pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart);\n#ifdef DBG \t\t\n\tprintk(\"RealFcsErrCount = %d\\n\", pAd->RalinkCounters.RealFcsErrCount.u.LowPart);\n#else\n\tprintk(\"FCSErrorCount = %d\\n\", pAd->WlanCounters.FCSErrorCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount.LowPart = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100);\n#endif\n\tprintk(\"TransmittedFrameCount = %d\\n\", pAd->WlanCounters.TransmittedFrameCount.u.LowPart);\n\tprintk(\"WEPUndecryptableCount = %d\\n\", pAd->WlanCounters.WEPUndecryptableCount.u.LowPart);\n\n\tpAd->WlanCounters.TransmittedFragmentCount.u.LowPart = 0;\n\tpAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart = 0;\n\tpAd->WlanCounters.FailedCount.u.LowPart = 0;\n\tpAd->WlanCounters.RetryCount.u.LowPart = 0;\n\tpAd->WlanCounters.MultipleRetryCount.u.LowPart = 0;\n\tpAd->WlanCounters.RTSSuccessCount.u.LowPart = 0;\n\tpAd->WlanCounters.RTSFailureCount.u.LowPart = 0;\n\tpAd->WlanCounters.ACKFailureCount.u.LowPart = 0;\n\tpAd->WlanCounters.FrameDuplicateCount.u.LowPart = 0;\n\tpAd->WlanCounters.ReceivedFragmentCount.u.LowPart = 0;\n\tpAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart = 0;\n#ifdef DBG \t\t\n\tpAd->RalinkCounters.RealFcsErrCount.u.LowPart = 0;\n#else\n\tpAd->WlanCounters.FCSErrorCount.u.LowPart = 0;\n\tpAd->WlanCounters.FrameDuplicateCount.u.LowPart = 0;\n#endif\n\n\tpAd->WlanCounters.TransmittedFrameCount.u.LowPart = 0;\n\tpAd->WlanCounters.WEPUndecryptableCount.u.LowPart = 0;\n\n{\n\tint i, j, k, maxMcs = 15;\n\tPMAC_TABLE_ENTRY pEntry;\n\n#ifdef DOT11N_SS3_SUPPORT\n\tif (IS_RT2883(pAd) || IS_RT3883(pAd))\n\t\tmaxMcs = 23;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\n\t\t\tprintk(\"\\n%02X:%02X:%02X:%02X:%02X:%02X - \",\n\t\t\t\t   pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\t   pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\\n\", (int)pEntry->Aid);\n\n\t\t\tfor (j = maxMcs; j >= 0; j--)\n\t\t\t{\n\t\t\t\tif ((pEntry->TXMCSExpected[j] != 0) || (pEntry->TXMCSFailed[j] !=0))\n\t\t\t\t{\n\t\t\t\t\tprintk(\"MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\\n\",\n\t\t\t\t\t\t   j, pEntry->TXMCSExpected[j], pEntry->TXMCSSuccessful[j], \n\t\t\t\t\t\t   pEntry->TXMCSExpected[j] ? (100*pEntry->TXMCSSuccessful[j])/pEntry->TXMCSExpected[j] : 0,\n\t\t\t\t\t\t   pEntry->TXMCSFailed[j]\n\t\t\t\t\t\t   );\n\t\t\t\t\tfor(k = maxMcs; k >= 0; k--)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEntry->TXMCSAutoFallBack[j][k] != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprintk(\"\\t\\t\\tAutoMCS[%02d]: %u (%d%%)\\n\", k, pEntry->TXMCSAutoFallBack[j][k],\n\t\t\t\t\t\t\t\t   (100*pEntry->TXMCSAutoFallBack[j][k])/pEntry->TXMCSExpected[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (j = 0; j < (maxMcs + 1); j++)\n\t\t{\n\t\t\tpEntry->TXMCSExpected[j] = 0;\n\t\t\tpEntry->TXMCSSuccessful[j] = 0;\n\t\t\tpEntry->TXMCSFailed[j] = 0;\n\t\t\tfor(k = maxMcs; k >= 0; k--)\n\t\t\t{\n\t\t\t\tpEntry->TXMCSAutoFallBack[j][k] = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n#ifdef DOT11_N_SUPPORT\n\t/* Display Tx Aggregation statistics */\n\tDisplayTxAgg(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n\n\n#ifdef DOT1X_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        It only shall be queried by 802.1x daemon for querying radius configuration.        \n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlQueryRadiusConf(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tUCHAR\tapidx, srv_idx, keyidx, KeyLen = 0;\n\tUCHAR\t*mpool;\n\tPDOT1X_CMM_CONF\tpConf;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlQueryRadiusConf==>\\n\"));\n\t\n\t/* Allocate memory */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, sizeof(DOT1X_CMM_CONF));\t\n    if (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s: out of resource!!!\\n\", __FUNCTION__));\n        return;\n    }\n\tNdisZeroMemory(mpool, sizeof(DOT1X_CMM_CONF));\n\n\tpConf = (PDOT1X_CMM_CONF)mpool;\n\n\t/* get MBSS number */\n\tpConf->mbss_num = pAd->ApCfg.BssidNum;\n\n\t/* get own ip address */\n\tpConf->own_ip_addr = pAd->ApCfg.own_ip_addr;\n\n\t/* get retry interval */\n\tpConf->retry_interval = pAd->ApCfg.retry_interval;\n\n\t/* get session timeout interval */\n\tpConf->session_timeout_interval = pAd->ApCfg.session_timeout_interval;\n\n\t/* Get the quiet interval */\n\tpConf->quiet_interval = pAd->ApCfg.quiet_interval;\n\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tPMULTISSID_STRUCT \tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\tPDOT1X_BSS_INFO  \tp1xBssInfo = &pConf->Dot1xBssInfo[apidx];\n\t\n\t\tp1xBssInfo->radius_srv_num = pMbss->radius_srv_num;\n\t\n\t\t/* prepare radius ip, port and key */\n\t\tfor (srv_idx = 0; srv_idx < pMbss->radius_srv_num; srv_idx++)\n\t\t{\n\t\t\tif (pMbss->radius_srv_info[srv_idx].radius_ip != 0)\n\t\t\t{\n\t\t\t\tp1xBssInfo->radius_srv_info[srv_idx].radius_ip = pMbss->radius_srv_info[srv_idx].radius_ip;\n\t\t\t\tp1xBssInfo->radius_srv_info[srv_idx].radius_port = pMbss->radius_srv_info[srv_idx].radius_port;\n\t\t\t\tp1xBssInfo->radius_srv_info[srv_idx].radius_key_len = pMbss->radius_srv_info[srv_idx].radius_key_len;\n\t\t\t\tif (pMbss->radius_srv_info[srv_idx].radius_key_len > 0)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(p1xBssInfo->radius_srv_info[srv_idx].radius_key, \n\t\t\t\t\t\t\t\t\tpMbss->radius_srv_info[srv_idx].radius_key, \n\t\t\t\t\t\t\t\t\tpMbss->radius_srv_info[srv_idx].radius_key_len);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tp1xBssInfo->ieee8021xWEP = (pMbss->IEEE8021X) ? 1 : 0;\n\t\t\n\t\tif (p1xBssInfo->ieee8021xWEP)\n\t\t{\n\t\t\t/* Default Key index, length and material */\n\t\t\tkeyidx = pMbss->DefaultKeyId;\n\t\t\tp1xBssInfo->key_index = keyidx;\n\n\t\t\t/* Determine if the key is valid. */\n\t\t\tKeyLen = pAd->SharedKey[apidx][keyidx].KeyLen;\n\t\t\tif (KeyLen == 5 || KeyLen == 13)\n\t\t\t{\n\t\t\t\tp1xBssInfo->key_length = KeyLen;\n\t\t\t\tNdisMoveMemory(p1xBssInfo->key_material, pAd->SharedKey[apidx][keyidx].Key, KeyLen);\n\t\t\t}\n\t\t}\n\n\t\t/* Get NAS-ID per BSS */\n\t\tif (pMbss->NasIdLen > 0)\n\t\t{\n\t\t\tp1xBssInfo->nasId_len = pMbss->NasIdLen;\n\t\t\tNdisMoveMemory(p1xBssInfo->nasId, pMbss->NasId, pMbss->NasIdLen);\n\t\t}\n\n\t\t/* get EAPifname */\n\t\tif (pAd->ApCfg.EAPifname_len[apidx] > 0)\n\t\t{\n\t\t\tpConf->EAPifname_len[apidx] = pAd->ApCfg.EAPifname_len[apidx];\n\t\t\tNdisMoveMemory(pConf->EAPifname[apidx], pAd->ApCfg.EAPifname[apidx], pAd->ApCfg.EAPifname_len[apidx]);\n\t\t}\t\n\n\t\t/* get PreAuthifname */\n\t\tif (pAd->ApCfg.PreAuthifname_len[apidx] > 0)\n\t\t{\n\t\t\tpConf->PreAuthifname_len[apidx] = pAd->ApCfg.PreAuthifname_len[apidx];\n\t\t\tNdisMoveMemory(pConf->PreAuthifname[apidx], pAd->ApCfg.PreAuthifname[apidx], pAd->ApCfg.PreAuthifname_len[apidx]);\n\t\t}\t\n\n\t}\n\t\t\t\t\n\twrq->u.data.length = sizeof(DOT1X_CMM_CONF);\n\tif (copy_to_user(wrq->u.data.pointer, pConf, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n\tos_free_mem(NULL, mpool);\n\t\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlRadiusData(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif ((pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode == Ndis802_11AuthModeWPA) \n    \t|| (pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode == Ndis802_11AuthModeWPA2)\n    \t|| (pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode == Ndis802_11AuthModeWPA1WPA2) \n    \t|| (pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X == TRUE))\n    \tWpaSend(pAd, (PUCHAR)wrq->u.data.pointer, wrq->u.data.length);\n}\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlAddWPAKey(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tNDIS_AP_802_11_KEY \t*pKey;\n\tULONG\t\t\t\tKeyIdx;\n\tMAC_TABLE_ENTRY  \t*pEntry;\n\tUCHAR\t\t\t\tapidx;\n\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx =\t(UCHAR) pObj->ioctl_if;\n\t\t\n\n\tpKey = (PNDIS_AP_802_11_KEY) wrq->u.data.pointer;\n\n\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t{\n\t\tif ((pKey->KeyLength == 32) || (pKey->KeyLength == 64))\n\t\t{\n\t\t\tif ((pEntry = MacTableLookup(pAd, pKey->addr)) != NULL)\n\t\t\t{\n\t\t\t\tINT\tk_offset = 0;\n\t\t\t\n\t\t\n\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].PMK, pKey->KeyMaterial + k_offset, 32);\t\t\t\t\n    \t        DBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Add PMK=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x....\\n\", apidx,\n            \tpAd->ApCfg.MBSSID[apidx].PMK[0],pAd->ApCfg.MBSSID[apidx].PMK[1],pAd->ApCfg.MBSSID[apidx].PMK[2],pAd->ApCfg.MBSSID[apidx].PMK[3],\n            \tpAd->ApCfg.MBSSID[apidx].PMK[4],pAd->ApCfg.MBSSID[apidx].PMK[5],pAd->ApCfg.MBSSID[apidx].PMK[6],pAd->ApCfg.MBSSID[apidx].PMK[7]));\n\t\t\t}\n\t\t}\n\t}\n\telse\t/* Old WEP stuff */\n\t{\n\t\tUCHAR\tCipherAlg;\n    \tPUCHAR\tKey;\n\n\t\tif(pKey->KeyLength > 16)\n\t\t\treturn;\n\t\t\n\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\n\t\tif (KeyIdx < 4)\n\t\t{\n\t\t\t/* it is a shared key */\n\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t{\n\t\t\t\tUINT8\tWcid;\n\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Set Group Key\\n\", apidx));\n\n\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = (UCHAR) KeyIdx;\t\t\t\t\t\t\t\t\n                     \n\t\t\t\t/* set key material and key length */\n\t\t\t\tif (pKey->KeyLength > 16)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Key length too long %d\\n\", apidx, pKey->KeyLength));\n\t\t\t\t\tpKey->KeyLength = 16;\n\t\t\t\t}\n\t\t\t\tpAd->SharedKey[apidx][KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\n\t\t\t\t/* Set Ciper type */\n\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].CipherAlg = CIPHER_WEP64;\n\t\t\t\telse\n\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].CipherAlg = CIPHER_WEP128;\n\t\t\t\n    \t\t\tCipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n    \t\t\tKey = pAd->SharedKey[apidx][KeyIdx].Key;\n\n\t\t\t\t/* Set Group key material to Asic */\n\t\t\t\tAsicAddSharedKeyEntry(pAd, apidx, (UINT8)KeyIdx, &pAd->SharedKey[apidx][KeyIdx]);\n\t\t\n\t\t\t\t/* Get a specific WCID to record this MBSS key attribute */\n\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, apidx,(UINT8)KeyIdx, \n\t\t\t\t\t\t\t\t\tCipherAlg, Wcid, SHAREDKEYTABLE);\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse\t/* For Pairwise key setting */\n\t\t\t{\n\t\t\t\tpEntry = MacTableLookup(pAd, pKey->addr);\n\t\t\t\tif (pEntry)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Set Pair-wise Key\\n\", apidx));\n\t\t\n\t\t\t\t\t/* set key material and key length */\n \t\t\t\t\tpEntry->PairwiseKey.KeyLen = (UCHAR)pKey->KeyLength;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\t\n\t\t\t\t\t/* set Cipher type */\n\t\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t\n\t\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\t\tAsicAddPairwiseKeyEntry(\n\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t(UCHAR)pEntry->Aid,\n                \t\t&pEntry->PairwiseKey);\n\n\t\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\t\t\t\t(UINT8)KeyIdx, \t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\tpEntry->Aid,\n\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlAddPMKIDCache(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tUCHAR\t\t\t\tapidx;\n\tNDIS_AP_802_11_KEY \t*pKey;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tapidx =\t(UCHAR) pObj->ioctl_if;\n\n\tpKey = (PNDIS_AP_802_11_KEY) wrq->u.data.pointer;\n    \n    if (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA2)\n\t{\n\t\tif(pKey->KeyLength == 32)\n\t\t{\n\t\t\tUCHAR\tdigest[80], PMK_key[20], macaddr[MAC_ADDR_LEN];\n\t\t\t\n\t\t\t/* Calculate PMKID */\n\t\t\tNdisMoveMemory(&PMK_key[0], \"PMK Name\", 8);\n\t\t\tNdisMoveMemory(&PMK_key[8], pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN);\n\t\t\tNdisMoveMemory(&PMK_key[14], pKey->addr, MAC_ADDR_LEN);\n\t\t\tRT_HMAC_SHA1(pKey->KeyMaterial, PMK_LEN, PMK_key, 20, digest, SHA1_DIGEST_SIZE);\n\n\t\t\tNdisMoveMemory(macaddr, pKey->addr, MAC_ADDR_LEN);\n\t\t\tRTMPAddPMKIDCache(pAd, apidx, macaddr, digest, pKey->KeyMaterial);\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPA2(pre-auth):(%02x:%02x:%02x:%02x:%02x:%02x)Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\tpKey->addr[0],pKey->addr[1],pKey->addr[2],pKey->addr[3],pKey->addr[4],pKey->addr[5],digest[0],digest[1],digest[2],digest[3],digest[4],digest[5]));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PMK =%02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\\n\",pKey->KeyMaterial[0],pKey->KeyMaterial[1],\n\t\t\t\tpKey->KeyMaterial[2],pKey->KeyMaterial[3],pKey->KeyMaterial[4],pKey->KeyMaterial[5],pKey->KeyMaterial[6],pKey->KeyMaterial[7]));\n\t\t}\n\t\telse\n            DBGPRINT(RT_DEBUG_ERROR, (\"Set::RT_OID_802_11_WPA2_ADD_PMKID_CACHE ERROR or is wep key \\n\"));\n\t}\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"<== RTMPIoctlAddPMKIDCache\\n\"));\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlStaticWepCopy(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tMAC_TABLE_ENTRY  *pEntry;\n\tUCHAR\tMacAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\tapidx;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tapidx =\t(UCHAR) pObj->ioctl_if;\n\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlStaticWepCopy-IF(ra%d)\\n\", apidx));\n\n    if (wrq->u.data.length != sizeof(MacAddr))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"RTMPIoctlStaticWepCopy: the length isn't match (%d)\\n\", wrq->u.data.length));\n        return;\n    }\n    else\n    {\n    \tUINT32 len;\n\t\t\n        len = copy_from_user(&MacAddr, wrq->u.data.pointer, wrq->u.data.length);    \n        pEntry = MacTableLookup(pAd, MacAddr);\n        if (!pEntry)\n        {\n            DBGPRINT(RT_DEBUG_ERROR, (\"RTMPIoctlStaticWepCopy: the mac address isn't match\\n\"));\n            return;\n        }\n        else\n        {\n            UCHAR\tKeyIdx;\n            \n            KeyIdx = pAd->ApCfg.MBSSID[apidx].DefaultKeyId;\n            \n            /* need to copy the default shared-key to pairwise key table for this entry in 802.1x mode */\n\t\t\tif (pAd->SharedKey[apidx][KeyIdx].KeyLen == 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: Can not get Default shared-key (index-%d)\\n\", KeyIdx));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n        \t{\n            \tpEntry->PairwiseKey.KeyLen = pAd->SharedKey[apidx][KeyIdx].KeyLen;\n            \tNdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[apidx][KeyIdx].Key, pEntry->PairwiseKey.KeyLen);\n            \tpEntry->PairwiseKey.CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n\n\t\t\t\t/* Add Pair-wise key to Asic */\n            \tAsicAddPairwiseKeyEntry(\n                \t\tpAd, \n                \t\t(UCHAR)pEntry->Aid,\n                \t\t&pEntry->PairwiseKey);\n\n\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\t\t\t\t(UINT8)KeyIdx, \n                \t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\tpEntry->Aid, \n\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n        \t}\n\t\t\t\n        }\n\t}\n    return;\n}\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlSetIdleTimeout(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tMAC_TABLE_ENTRY  \t\t*pEntry;\t\n\tPDOT1X_IDLE_TIMEOUT\t\tpIdleTime;\n\t\t\n\tif (wrq->u.data.length != sizeof(DOT1X_IDLE_TIMEOUT))\n\t{\n        DBGPRINT(RT_DEBUG_ERROR, (\"%s : the length is mis-match\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpIdleTime = (PDOT1X_IDLE_TIMEOUT)wrq->u.data.pointer;\n\n\tif ((pEntry = MacTableLookup(pAd, pIdleTime->StaAddr)) == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"%s : the entry is empty\\n\", __FUNCTION__));\n        return;\n    }\n\telse\n\t{\n\t\tpEntry->NoDataIdleCount = 0;\n\t\tpEntry->StaIdleTimeout = pIdleTime->idle_timeout;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : Update Idle-Timeout(%d) from dot1x daemon\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__, pEntry->StaIdleTimeout));\n\t}\n\t\n\treturn;\n}\n#endif /* DOT1X_SUPPORT */\n\n#ifdef DBG\n/* \n    ==========================================================================\n    Description:\n        Read / Write BBP\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 bbp               ==> read all BBP\n               2.) iwpriv ra0 bbp 1             ==> read BBP where RegID=1\n               3.) iwpriv ra0 bbp 1=10\t\t    ==> write BBP R1=0x10\n    ==========================================================================\n*/\nVOID RTMPAPIoctlBBP(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tUCHAR\t\t\t\tregBBP = 0;\n\tPSTRING\t\t\t\tmpool, msg; /*msg[2048]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tINT\t\t\t\t\tbbpId;\n\tLONG\t\t\t\tbbpValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllBBP = FALSE, bAllowDump, bCopyMsg;\n\tINT\t\t\t\t\targLen;\n\n\n\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(MAX_BBP_MSG_SIZE+256+12));\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(mpool, MAX_BBP_MSG_SIZE+256+12);\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+MAX_BBP_MSG_SIZE+3) & (ULONG)~0x03);\n\n\tbAllowDump = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NODUMPMSG) == RTPRIV_IOCTL_FLAG_NODUMPMSG) ? FALSE : TRUE;\n\tbCopyMsg = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NOSPACE) == RTPRIV_IOCTL_FLAG_NOSPACE) ? FALSE : TRUE;\n\targLen = strlen((char *)(wrq->u.data.pointer));\n\n\n\tif (argLen > 0)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (argLen > 255) ? 255 : argLen);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/* Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\t\t\t\tif (sscanf(this_char, \"%d\", &(bbpId)) == 1)\n\t\t\t\t{\n\t\t\t\t\tif (bbpId <= pAdapter->chipCap.MaxNumOfBbpId)\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t\t\t\t/* the command bbp shall read BBP register directly for dubug. */\n\t\t\t\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02x]:%02X  \", bbpId, bbpId, regBBP);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /* Write */\n\t\t\t\tif ((sscanf(this_char, \"%d\", &(bbpId)) == 1) && (sscanf(value, \"%lx\", &(bbpValue)) == 1))\n\t\t\t\t{\n\t\t\t\t\tif (bbpId <= pAdapter->chipCap.MaxNumOfBbpId)\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t\t\t\t/* the command bbp shall read/write BBP register directly for dubug. */\n\t\t\t\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tBBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue);\n\t\t\t\t\t\t\t/*Read it back for showing */\n\t\t\t\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02X]:%02X\\n\", bbpId, bbpId, regBBP);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\t\n\t\t\t\t\t\t/* Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\tbIsPrintAllBBP = TRUE;\n\n\tif (bIsPrintAllBBP)\n\t{\n\t\tmemset(msg, 0x00, MAX_BBP_MSG_SIZE);\n\t\tsprintf(msg, \"\\n\");\n\t\tfor (bbpId = 0; bbpId <= pAdapter->chipCap.MaxNumOfBbpId; bbpId++)\n\t\t{\n\t\t\t{\n\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t/* the command bbp shall read/write BBP register directly for dubug. */\n\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\tsprintf(msg+strlen(msg), \"%03d = %02X\\n\", bbpId, regBBP);\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef LINUX\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t}\n#endif /* LINUX */\n\n\tif (!bAllowDump)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Dump BBP msg[%d]=\\n\", (UINT32)strlen(msg)));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\\n\", msg));\n\t}\n\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n\tif (!bAllowDump)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlBBP\\n\\n\"));\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Read / Write MAC\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 mac 0        ==> read MAC where Addr=0x0\n               2.) iwpriv ra0 mac 0=12     ==> write MAC where Addr=0x0, value=12\n    ==========================================================================\n*/\nVOID RTMPAPIoctlMAC(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\tj = 0, k = 0;\n\tPSTRING\t\t\t\tmpool, msg; /*msg[1024]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tUINT32\t\t\t\tmacAddr = 0;\n\tUCHAR\t\t\t\ttemp[16];\n\tSTRING\t\t\t\ttemp2[16];\n\tUINT32\t\t\t\tmacValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllMAC = FALSE, bFromUI;\n\n\n/*\tmpool = (PSTRING)kmalloc(sizeof(CHAR)*(4096+256+12), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(4096+256+12));\n\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tbFromUI = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_UI) == RTPRIV_IOCTL_FLAG_UI) ? TRUE : FALSE;\n\t\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+4096+3) & (ULONG)~0x03);\n\n\tmemset(msg, 0x00, 4096);\n\tmemset(arg, 0x00, 256);\t\n\tif ((wrq->u.data.length > 1) /*No parameters. */\n\t\t)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\t\t\t\t/* Sanity check */\n\t\t\t\tif(strlen(this_char) > 4)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\t/* Mac Addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\tif(strlen(this_char) == 4)\n\t\t\t\t{\n\t\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\t\tmacAddr = *temp*256 + temp[1];\t\t\t\t\t\n\t\t\t\t\tif (macAddr < 0xFFFF)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMP_IO_READ32(pAdapter, macAddr, &macValue);\n\t\t\t\t\t    if (!bFromUI)\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MacAddr=0x%x, MacValue=0x%x\\n\", macAddr, macValue));\n\t\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%08x]:%08x  \", macAddr , macValue);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /*Write */\n\t\t\t\tNdisMoveMemory(&temp2, value, strlen(value));\n\t\t\t\ttemp2[strlen(value)] = '\\0';\n\n\t\t\t\t/* Sanity check */\n\t\t\t\tif((strlen(this_char) > 4) || strlen(temp2) > 8)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /* return; */\n\t\t\t\t}\n\n\t\t\t\tj = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(temp2[j] > 'f' || temp2[j] < '0')\n\t\t\t\t\t\tgoto done; /* return; */\n\t\t\t\t}\n\n\t\t\t\t/* MAC Addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\t/* MAC value */\n\t\t\t\tk = j = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\ttemp2[8-k+j] = temp2[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 8)\n\t\t\t\t\ttemp2[7-k++]='0';\n\t\t\t\ttemp2[8]='\\0';\n\n\t\t\t\t{\n\t\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\t\tmacAddr = *temp*256 + temp[1];\n\n\t\t\t\t\tAtoH(temp2, temp, 4);\n\t\t\t\t\tmacValue = *temp*256*256*256 + temp[1]*256*256 + temp[2]*256 + temp[3];\n\n\t\t\t\t\t/* debug mode */\n\t\t\t\t\tif (macAddr == (HW_DEBUG_SETTING_BASE + 4))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* 0x2bf4: byte0 non-zero: enable R66 tuning, 0: disable R66 tuning */\n                        if (macValue & 0x000000ff) \n                        {\n                            pAdapter->BbpTuning.bEnable = TRUE;\n                            DBGPRINT(RT_DEBUG_ERROR, (\"turn on R17 tuning\\n\"));\n                        }\n                        else\n                        {\n                            UCHAR R66;\n                            pAdapter->BbpTuning.bEnable = FALSE;\n                            R66 = 0x26 + GET_LNA_GAIN(pAdapter);\n                            /* todo AsicBBPWriteWithRxChain(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd)), RX_CHAIN_ALL); */\n\t\t\t\tif (!bFromUI)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"turn off R66 tuning, restore to 0x%02x\\n\", R66));\n                        }\n\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t    if (!bFromUI)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MacAddr=%02x, MacValue=0x%x\\n\", macAddr, macValue));\n\t\t\t\t\t\n\t\t\t\t\tRTMP_IO_WRITE32(pAdapter, macAddr, macValue);\n\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%08x]:%08x  \", macAddr, macValue);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tUINT32 IdMac;\n\n\t\tfor(IdMac=0; IdMac<=0x1500; IdMac+=4)\n\t\t{\n\t\t\tif ((IdMac & 0x0f) == 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n0x%04x: \", IdMac));\n\t\t\t}\n\n\t\t\tRTMP_IO_READ32(pAdapter, IdMac, &macValue);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%08x \", macValue));\n\t\t}\n\n\t\tbIsPrintAllMAC = TRUE;\n\t}\n\n\t\n\tif(strlen(msg) == 1)\n\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\t\n#ifdef LINUX\n\t/* Copy the information into the user buffer */\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t}\n#endif /* LINUX */\n\n\n\n\ndone:\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n\tif (!bFromUI)\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlMAC\\n\\n\"));\n}\n\n\n#ifdef RTMP_RF_RW_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Read / Write RF register\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 rf                ==> read all RF registers\n               2.) iwpriv ra0 rf 1              ==> read RF where RegID=1\n               3.) iwpriv ra0 rf 1=10\t\t    ==> write RF R1=0x10\n    ==========================================================================\n*/\nVOID RTMPAPIoctlRF(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tUCHAR\t\t\t\tregRF = 0;\n\tPSTRING\t\t\t\tmpool, msg; /*msg[2048]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tINT\t\t\t\t\trfId, maxRFIdx;\n\tLONG\t\t\t\trfValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllRF = FALSE, bFromUI;\n\tINT\t\t\t\t\tmemLen = sizeof(CHAR) * (2048+256+12);\n\t\n\tmaxRFIdx = pAdapter->chipCap.MaxNumOfRfId;\n\t\t\n/*\tmpool = (PSTRING)kmalloc(memLen, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, memLen);\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tbFromUI = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_UI) == RTPRIV_IOCTL_FLAG_UI) ? TRUE : FALSE;\n\t\n\tNdisZeroMemory(mpool, memLen);\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+2048+3) & (ULONG)~0x03);\n\t\n\tif ((wrq->u.data.length > 1) /* No parameters. */\n\t\t)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\t\t\t\tif (sscanf(this_char, \"%d\", &(rfId)) == 1)\n\t\t\t\t{\n\t\t\t\t\tif (rfId <= pAdapter->chipCap.MaxNumOfRfId)\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t\t\t\t/* the command rf shall read rf register directly for dubug. */\n\t\t\t\t\t\t\t/* BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP); */\n\t\t\t\t\t\t\tRT30xxReadRFRegister(pAdapter, rfId, &regRF);\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02x]:%02X  \", rfId, rfId, regRF);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Invalid parametes, so default printk all RF */\n\t\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* Invalid parametes, so default printk all RF */\n\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /* Write */\n\t\t\t\tif ((sscanf(this_char, \"%d\", &(rfId)) == 1) && (sscanf(value, \"%lx\", &(rfValue)) == 1))\n\t\t\t\t{\n\t\t\t\t\tif (rfId <= pAdapter->chipCap.MaxNumOfRfId)\n\t\t\t\t\t{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t\t\t\t/* the command RF shall read/write RF register directly for dubug. */\n\t\t\t\t\t\t\t/*BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP); */\n\t\t\t\t\t\t\t/*BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue); */\n\t\t\t\t\t\t\tRT30xxReadRFRegister(pAdapter, rfId, &regRF);\n\t\t\t\t\t\t\t\tRT30xxWriteRFRegister(pAdapter, (UCHAR)rfId,(UCHAR) rfValue);\n\t\t\t\t\t\t\t/* Read it back for showing */\n\t\t\t\t\t\t\tRT30xxReadRFRegister(pAdapter, rfId, &regRF);\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02X]:%02X\\n\", rfId, rfId, regRF);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\t/* Invalid parametes, so default printk all RF */\n\t\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t/* Invalid parametes, so default printk all RF */\n\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\tbIsPrintAllRF = TRUE;\n\n\tif (bIsPrintAllRF)\n\t{\n\t\tmemset(msg, 0x00, 2048);\n\t\tsprintf(msg, \"\\n\");\n\t\tfor (rfId = 0; rfId <= maxRFIdx; rfId++)\n\t\t{\n\t\t\t{\n\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t/* the command RF shall read/write RF register directly for dubug. */\n\t\t\t\tRT30xxReadRFRegister(pAdapter, rfId, &regRF);\n\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02X]:%02X    \", rfId, rfId*2, regRF);\n\t\t\t\tif (rfId%5 == 4)\n\t\t\t\t\tsprintf(msg+strlen(msg), \"\\n\");\n\t\t\t}\n\t\t}\n\t\t/* Copy the information into the user buffer */\n\n#ifdef LINUX\n\t\twrq->u.data.length = strlen(msg);\n\t\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t\t}\n#endif /* LINUX */\n\t}\n\telse\n\t{\n#ifdef LINUX\n\t\t/* Copy the information into the user buffer */\n\t\twrq->u.data.length = strlen(msg);\n\t\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t\t}\n#endif /* LINUX */\n\t}\n\t\n\tif (!bFromUI)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Dump RF msg[%d]=\\n\", (UINT32)strlen(msg)));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\\n\", msg));\n\t}\n\t\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n\tif (!bFromUI)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlRF\\n\\n\"));\n\t\n}\n#endif /* RTMP_RF_RW_SUPPORT */\n#endif /*#ifdef DBG */\n\n/* \n    ==========================================================================\n    Description:\n        Read / Write E2PROM\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 e2p 0     \t==> read E2PROM where Addr=0x0\n               2.) iwpriv ra0 e2p 0=1234    ==> write E2PROM where Addr=0x0, value=1234\n    ==========================================================================\n*/\nVOID RTMPAPIoctlE2PROM(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\tj = 0, k = 0;\n\tPSTRING\t\t\t\tmpool, msg;/*msg[1024]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tUSHORT\t\t\t\teepAddr = 0;\n\tUCHAR\t\t\t\ttemp[16];\n\tSTRING\t\t\t\ttemp2[16];\n\tUSHORT\t\t\t\teepValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllE2PROM = FALSE;\n\n/*\tmpool = (PSTRING)kmalloc(sizeof(CHAR)*(4096+256+12), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(4096+256+12));\n\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+4096+3) & (ULONG)~0x03);\n\n\n\tmemset(msg, 0x00, 4096);\n\tmemset(arg, 0x00, 256);\t\t\n\n\tif (\n#ifdef LINUX\n\t\t(wrq->u.data.length > 1) /* If no parameter, dump all e2p. */\n#endif /* LINUX */\n\t\t)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\n\t\t\t\t/* Sanity check */\n\t\t\t\tif(strlen(this_char) > 4)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\t/* E2PROM addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\tif(strlen(this_char) == 4)\n\t\t\t\t{\n\t\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\t\teepAddr = *temp*256 + temp[1];\t\t\t\t\t\n\t\t\t\t\tif (eepAddr < 0xFFFF)\n\t\t\t\t\t{\n\t\t\t\t\t\tRT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);\n\t\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%04X]:0x%04X  \", eepAddr , eepValue);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /*Write */\n\t\t\t\tNdisMoveMemory(&temp2, value, strlen(value));\n\t\t\t\ttemp2[strlen(value)] = '\\0';\n\n\t\t\t\t/* Sanity check */\n\t\t\t\tif((strlen(this_char) > 4) || strlen(temp2) > 8)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /* return; */\n\t\t\t\t}\n\t\t\t\tj = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(temp2[j] > 'f' || temp2[j] < '0')\n\t\t\t\t\t\tgoto done; /* return; */\n\t\t\t\t}\n\n\t\t\t\t/* MAC Addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\t/* MAC value */\n\t\t\t\tk = j = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\ttemp2[4-k+j] = temp2[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 4)\n\t\t\t\t\ttemp2[3-k++]='0';\n\t\t\t\ttemp2[4]='\\0';\n\n\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\teepAddr = *temp*256 + temp[1];\n\n\t\t\t\tAtoH(temp2, temp, 2);\n\t\t\t\teepValue = *temp*256 + temp[1];\n\n\t\t\t\tRT28xx_EEPROM_WRITE16(pAdapter, eepAddr, eepValue);\n\t\t\t\tsprintf(msg+strlen(msg), \"[0x%02X]:%02X  \", eepAddr, eepValue);\n\t\t\t}\n\t\t}\n\t} \n\telse \n\t{\n\t\tbIsPrintAllE2PROM = TRUE;\n\t}\n\n\tif (bIsPrintAllE2PROM)\n\t{\n\t\tsprintf(msg, \"\\n\");\n\t\t\n\t\t/* E2PROM Registers */\n\t\tfor (eepAddr = 0x00; eepAddr < 0x200; eepAddr += 2)\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);\n\t\t\tsprintf(msg+strlen(msg), \"[0x%04X]:%04X  \", eepAddr , eepValue);\n\t\t\tif ((eepAddr & 0x6) == 0x6)\n\t\t\t\tsprintf(msg+strlen(msg), \"\\n\");\n\t\t}\n\t}\n\n\tif(strlen(msg) == 1)\n\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\n\t/* Copy the information into the user buffer */\n\n\tAP_E2PROM_IOCTL_PostCtrl(wrq, msg);\n\ndone:\t\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n    if (wrq->u.data.flags != RT_OID_802_11_HARDWARE_REGISTER)\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlE2PROM\\n\"));\n}\n\n\n//#define ENHANCED_STAT_DISPLAY\t// Display PER and PLR statistics\n#ifdef RTMP_EFUSE_SUPPORT\nextern VOID eFuseGetFreeBlockCount(PRTMP_ADAPTER pAd, PUINT EfuseFreeBlock);\n#endif /* RTMP_EFUSE_SUPPORT */\n\n\n/* \n    ==========================================================================\n    Description:\n        Read statistics counter\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 stat 0     \t==> Read statistics counter\n    ==========================================================================\n*/\nVOID RTMPIoctlStatistics(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tINT Status;\n\tPSTRING msg;\n\tULONG txCount = 0;\n#ifdef ENHANCED_STAT_DISPLAY\n\tULONG per, plr;\n\tINT i;\n#endif\n#ifdef RTMP_EFUSE_SUPPORT\n\tUINT efusefreenum=0;\n#endif /* RTMP_EFUSE_SUPPORT */\n\n/*\tmsg = (PSTRING)kmalloc(sizeof(CHAR)*(2048), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));\n\tif (msg == NULL) {\n\t\treturn;\n\t}\n\n\n    memset(msg, 0x00, 1600);\n    sprintf(msg, \"\\n\");\n\n\t{\n\t\ttxCount = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;\n\t}\n\n    sprintf(msg+strlen(msg), \"Tx success                      = %ld\\n\", txCount);\n#ifdef ENHANCED_STAT_DISPLAY\n\tper = txCount==0? 0: 1000*(pAd->WlanCounters.RetryCount.u.LowPart+pAd->WlanCounters.FailedCount.u.LowPart)/(pAd->WlanCounters.RetryCount.u.LowPart+pAd->WlanCounters.FailedCount.u.LowPart+txCount);\n    sprintf(msg+strlen(msg), \"Tx retry count                  = %ld, PER=%ld.%1ld%%\\n\",\n\t\t\t\t\t\t\t\t\t(ULONG)pAd->WlanCounters.RetryCount.u.LowPart,\n\t\t\t\t\t\t\t\t\tper/10, per % 10);\n\tplr = txCount==0? 0: 10000*pAd->WlanCounters.FailedCount.u.LowPart/(pAd->WlanCounters.FailedCount.u.LowPart+txCount);\n    sprintf(msg+strlen(msg), \"Tx fail to Rcv ACK after retry  = %ld, PLR=%ld.%02ld%%\\n\",\n\t\t\t\t\t\t\t\t\t(ULONG)pAd->WlanCounters.FailedCount.u.LowPart, plr/100, plr%100);\n\n    sprintf(msg+strlen(msg), \"Rx success                      = %ld\\n\", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart);\n\tper = pAd->WlanCounters.ReceivedFragmentCount.u.LowPart==0? 0: 1000*(pAd->WlanCounters.FCSErrorCount.u.LowPart)/(pAd->WlanCounters.FCSErrorCount.u.LowPart+pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);\n\tsprintf(msg+strlen(msg), \"Rx with CRC                     = %ld, PER=%ld.%1ld%%\\n\",\n\t\t\t\t\t\t\t\t\t(ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart, per/10, per % 10);\n\tsprintf(msg+strlen(msg), \"Rx drop due to out of resource  = %ld\\n\", (ULONG)pAd->Counters8023.RxNoBuffer);\n\tsprintf(msg+strlen(msg), \"Rx duplicate frame              = %ld\\n\", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\n\tsprintf(msg+strlen(msg), \"False CCA                       = %ld\\n\", (ULONG)pAd->RalinkCounters.FalseCCACnt);\n#else\n    sprintf(msg+strlen(msg), \"Tx retry count                  = %ld\\n\", (ULONG)pAd->WlanCounters.RetryCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"Tx fail to Rcv ACK after retry  = %ld\\n\", (ULONG)pAd->WlanCounters.FailedCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"RTS Success Rcv CTS             = %ld\\n\", (ULONG)pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"RTS Fail Rcv CTS                = %ld\\n\", (ULONG)pAd->WlanCounters.RTSFailureCount.u.LowPart);\n\n    sprintf(msg+strlen(msg), \"Rx success                      = %ld\\n\", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart);\n    sprintf(msg+strlen(msg), \"Rx with CRC                     = %ld\\n\", (ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"Rx drop due to out of resource  = %ld\\n\", (ULONG)pAd->Counters8023.RxNoBuffer);\n    sprintf(msg+strlen(msg), \"Rx duplicate frame              = %ld\\n\", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\n    sprintf(msg+strlen(msg), \"False CCA (one second)          = %ld\\n\", (ULONG)pAd->RalinkCounters.OneSecFalseCCACnt);\n#endif /* ENHANCED_STAT_DISPLAY */\n\n\t{\n#ifdef ENHANCED_STAT_DISPLAY\n\tsprintf(msg+strlen(msg), \"RSSI                            = %ld %ld %ld\\n\",\n    \t\t\t(LONG)(pAd->ApCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta),\n    \t\t\t(LONG)(pAd->ApCfg.RssiSample.LastRssi1 - pAd->BbpRssiToDbmDelta),\n    \t\t\t(LONG)(pAd->ApCfg.RssiSample.LastRssi2 - pAd->BbpRssiToDbmDelta));\n\n    \t/* Display Last Rx Rate and BF SNR of first Associated entry in MAC table */\n    \tif (pAd->MacTab.Size > 0)\n    \t{\n    \t\tstatic char *phyMode[4] = {\"CCK\", \"OFDM\", \"MM\", \"GF\"};\n\n    \t\tfor (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t{\n    \t\t\tPMAC_TABLE_ENTRY pEntry = &(pAd->MacTab.Content[i]);\n    \t\t\tif (IS_ENTRY_CLIENT(pEntry) && pEntry->Sst==SST_ASSOC)\n\t\t\t\t{\n\t\t\t\t\tUINT32 lastRxRate = pEntry->LastRxRate;\n\n\t\t\t\t\tsprintf(msg+strlen(msg), \"Last RX Rate                    = MCS %d, %2dM, %cGI, %s%s\\n\",\n\t\t\t\t\t\t\tlastRxRate & 0x7F,  ((lastRxRate>>7) & 0x1)? 40: 20,\n\t\t\t\t\t\t\t((lastRxRate>>8) & 0x1)? 'S': 'L',\n\t\t\t\t\t\t\tphyMode[(lastRxRate>>14) & 0x3],\n\t\t\t\t\t\t\t((lastRxRate>>9) & 0x3)? \", STBC\": \" \");\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n    \t}\n#else\n    \tsprintf(msg+strlen(msg), \"RSSI-A                          = %ld\\n\", (LONG)(pAd->ApCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta));\n\t\tsprintf(msg+strlen(msg), \"RSSI-B (if available)           = %ld\\n\", (LONG)(pAd->ApCfg.RssiSample.LastRssi1 - pAd->BbpRssiToDbmDelta));\n\t\tsprintf(msg+strlen(msg), \"RSSI-C (if available)           = %ld\\n\\n\", (LONG)(pAd->ApCfg.RssiSample.LastRssi2 - pAd->BbpRssiToDbmDelta));\n#endif /* ENHANCED_STAT_DISPLAY */\n\t}\n\n#ifdef RTMP_EFUSE_SUPPORT\n\tif (pAd->bUseEfuse == FALSE && pAd->bFroceEEPROMBuffer == FALSE)\n\t{\n\t\t;\n\t}\n\telse\n\t{\n\t\teFuseGetFreeBlockCount(pAd, &efusefreenum);\n\t\tsprintf(msg+strlen(msg), \"efuseFreeNumber                 = %d\\n\", efusefreenum);\n\t}\n#endif /* RTMP_EFUSE_SUPPORT */    \n    /* Copy the information into the user buffer */\n    wrq->u.data.length = strlen(msg);\n    Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\n\tos_free_mem(NULL, msg);\n/*\tkfree(msg); */\n\n#if defined(TXBF_SUPPORT) && defined(ENHANCED_STAT_DISPLAY)\n#ifdef DBG_CTRL_SUPPORT\n\t/* Debug code to display BF statistics */\n\tif (pAd->CommonCfg.DebugFlags & DBF_SHOW_BF_STATS)\n\t{\n\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) {\n\t\t\tPMAC_TABLE_ENTRY pEntry = &(pAd->MacTab.Content[i]);\n\t\t\tCOUNTER_TXBF *pCnt;\n\t\t\tULONG totalNBF, totalEBF, totalIBF, totalTx, totalRetry, totalSuccess;\n\n\t\t\tif (!IS_ENTRY_CLIENT(pEntry) || pEntry->Sst!=SST_ASSOC)\n\t\t\t\tcontinue;\n\n\t\t\tpCnt = &pEntry->TxBFCounters;\n\n\t\t\ttotalNBF = pCnt->TxSuccessCount + pCnt->TxFailCount;\n\t\t\ttotalEBF = pCnt->ETxSuccessCount + pCnt->ETxFailCount;\n\t\t\ttotalIBF = pCnt->ITxSuccessCount + pCnt->ITxFailCount;\n\n\t\t\ttotalTx = totalNBF + totalEBF + totalIBF;\n\t\t\ttotalRetry = pCnt->TxRetryCount + pCnt->ETxRetryCount + pCnt->ITxRetryCount;\n\t\t\ttotalSuccess = pCnt->TxSuccessCount + pCnt->ETxSuccessCount + pCnt->ITxSuccessCount;\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"MacTable[%d]     Success    Retry/PER    Fail/PLR\\n\", i) );\n\t\t\tif (totalTx==0) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"   Total = 0\\n\") );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (totalNBF!=0) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"   NonBF (%3lu%%): %7lu  %7lu (%2lu%%) %5lu (%1lu%%)\\n\",\n\t\t\t\t\t100*totalNBF/totalTx, pCnt->TxSuccessCount,\n\t\t\t\t\tpCnt->TxRetryCount, 100*pCnt->TxRetryCount/(pCnt->TxSuccessCount+pCnt->TxRetryCount),\n\t\t\t\t\tpCnt->TxFailCount, 100*pCnt->TxFailCount/totalNBF) );\n\t\t\t}\n\n\t\t\tif (totalEBF!=0) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"   ETxBF (%3lu%%): %7lu  %7lu (%2lu%%) %5lu (%1lu%%)\\n\",\n\t\t\t\t\t 100*totalEBF/totalTx, pCnt->ETxSuccessCount,\n\t\t\t\t\tpCnt->ETxRetryCount, 100*pCnt->ETxRetryCount/(pCnt->ETxSuccessCount+pCnt->ETxRetryCount),\n\t\t\t\t\tpCnt->ETxFailCount, 100*pCnt->ETxFailCount/totalEBF) );\n\t\t\t}\n\n\t\t\tif (totalIBF!=0) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"   ITxBF (%3lu%%): %7lu  %7lu (%2lu%%) %5lu (%1lu%%)\\n\",\n\t\t\t\t\t100*totalIBF/totalTx, pCnt->ITxSuccessCount,\n\t\t\t\t\tpCnt->ITxRetryCount, 100*pCnt->ITxRetryCount/(pCnt->ITxSuccessCount+pCnt->ITxRetryCount),\n\t\t\t\t\tpCnt->ITxFailCount, 100*pCnt->ITxFailCount/totalIBF) );\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"   Total         %7lu  %7lu (%2lu%%) %5lu (%1lu%%)\\n\",\n\t\t\t\ttotalSuccess, totalRetry, 100*totalRetry/(totalSuccess + totalRetry),\n\t\t\t\tpCnt->TxFailCount+pCnt->ETxFailCount+pCnt->ITxFailCount,\n\t\t\t\t100*(pCnt->TxFailCount+pCnt->ETxFailCount+pCnt->ITxFailCount)/totalTx) );\n\t\t}\n\t}\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* defined(TXBF_SUPPORT) && defined(ENHANCED_STAT_DISPLAY) */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlStatistics\\n\"));\n}\n\n\n#ifdef DOT11_N_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Get Block ACK Table\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage:\n        \t\t1.) iwpriv ra0 get_ba_table\n        \t\t3.) UI needs to prepare at least 4096bytes to get the results\n    ==========================================================================\n*/\nVOID RTMPIoctlQueryBaTable(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\t/*char *msg; */\n\tUCHAR\tTotalEntry, i, j, index;\n\tQUERYBA_TABLE\t\t*BAT;\n\n\tBAT = vmalloc(sizeof(QUERYBA_TABLE));\n\n\tRTMPZeroMemory(BAT, sizeof(QUERYBA_TABLE));\n\n\tTotalEntry = pAd->MacTab.Size;\n\tindex = 0;\n\tfor (i=0; ((i < MAX_LEN_OF_MAC_TABLE) && (TotalEntry > 0)); i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->TXBAbitmap))\n\t\t{\n\t\t\tNdisMoveMemory(BAT->BAOriEntry[index].MACAddr, pEntry->Addr, 6);\n\t\t\tfor (j=0;j<8;j++)\n\t\t\t{\n\t\t\t\tif (pEntry->BAOriWcidArray[j] != 0)\n\t\t\t\t\tBAT->BAOriEntry[index].BufSize[j] = pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]].BAWinSize;\n\t\t\t\telse\n\t\t\t\t\tBAT->BAOriEntry[index].BufSize[j] = 0;\n\t\t\t}\n\n\t\t\tTotalEntry--;\n\t\t\tindex++;\n\t\t\tBAT->OriNum++;\n\t\t}\n\t}\n\n\tTotalEntry = pAd->MacTab.Size;\n\tindex = 0;\n\tfor (i=0; ((i < MAX_LEN_OF_MAC_TABLE) && (TotalEntry > 0)); i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->RXBAbitmap))\n\t\t{\n\t\t\tNdisMoveMemory(BAT->BARecEntry[index].MACAddr, pEntry->Addr, 6);\n\t\t\tBAT->BARecEntry[index].BaBitmap = (UCHAR)pEntry->RXBAbitmap;\n\t\t\tfor (j = 0; j < 8; j++)\n\t\t\t{\n\t\t\t\tif (pEntry->BARecWcidArray[j] != 0)\n\t\t\t\t\tBAT->BARecEntry[index].BufSize[j] = pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]].BAWinSize;\n\t\t\t\telse\n\t\t\t\t\tBAT->BARecEntry[index].BufSize[j] = 0;\n\t\t\t}\n\n\t\t\tTotalEntry--;\n\t\t\tindex++;\n\t\t\tBAT->RecNum++;\n\t\t}\n\t}\n\n\twrq->u.data.length = sizeof(QUERYBA_TABLE);\n\n\tif (copy_to_user(wrq->u.data.pointer, BAT, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n\tvfree(BAT);\n\n}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\nINT Set_ApCli_Enable_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tUINT Enable;\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tEnable = simple_strtol(arg, 0, 16);\n\n\tpAd->ApCfg.ApCliTab[ifIndex].Enable = (Enable > 0) ? TRUE : FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_Enable_Proc::(enable = %d)\\n\", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].Enable));\n\t\n\tApCliIfDown(pAd);\n\n\treturn TRUE;\n}\n\nINT Set_ApCli_Ssid_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn;\n\tINT success = FALSE;\n\t/*UCHAR keyMaterial[40]; */\n\tUCHAR PskKey[100];\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tif(strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t/* bring apcli interface down first */\n\t\tif(apcliEn == TRUE )\n\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;\n\t\t\tApCliIfDown(pAd);\n\t\t}\n\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);\n\t\tsuccess = TRUE;\n\n\t\t/* Upadte PMK and restart WPAPSK state machine for ApCli link */\n\t\tif (((pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t(pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK)) && \n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PSKLen > 0)\n\t\t{\n\t\t\tNdisZeroMemory(PskKey, 100);\n\t\t\tNdisMoveMemory(PskKey, pAd->ApCfg.ApCliTab[ifIndex].PSK, pAd->ApCfg.ApCliTab[ifIndex].PSKLen);\n\n\t\t\tRT_CfgSetWPAPSKKey(pAd, (PSTRING)PskKey, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PSKLen,\n\t\t\t\t\t\t\t\t\t(PUCHAR)pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PMK);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_Ssid_Proc::(Len=%d,Ssid=%s)\\n\", ifIndex,\n\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid));\n\n\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\treturn success;\n}\n\n\nINT Set_ApCli_Bssid_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tINT i;\n\tPSTRING value;\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn;\n\tPOS_COOKIE pObj;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t/* bring apcli interface down first */\n\tif(apcliEn == TRUE )\n\t{\n\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;\n\t\tApCliIfDown(pAd);\n\t}\n\n\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN);\n\n\tif(strlen(arg) == 17)  /* Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t{\n\t\tfor (i=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\"), i++) \n\t\t{\n\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t\treturn FALSE;  /* Invalid */\n\n\t\t\tAtoH(value, &pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[i], 1);\n\t\t}\n\n\t\tif(i != 6)\n\t\t\treturn FALSE;  /* Invalid */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ApCli_Bssid_Proc (%2X:%2X:%2X:%2X:%2X:%2X)\\n\",\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[0],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[1],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[2],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[3],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[4],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[5]));\n\n\tpAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set ApCli-IF Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG       i;\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\tifIndex;\n\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tif ((strcmp(arg, \"WEPAUTO\") == 0) || (strcmp(arg, \"wepauto\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeAutoSwitch;\n\telse if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeShared;\n\telse if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPAPSK;\n\telse if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0) || (strcmp(arg, \"WPAPSKWPA2PSK\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA2PSK;\n\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT    \n   \telse if ((strcmp(arg, \"WPA\") == 0) || (strcmp(arg, \"wpa\") == 0))\n       \tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA;    \n    \telse if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"wpa2\") == 0))\n        \tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA2;\n#endif /*APCLI_WPA_SUPPLICANT_SUPPORT */\n\n\telse\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeOpen;\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))\n\t\t{\n\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t}\n\t}\n\t\t\n    RTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].AuthMode, pAd->ApCfg.ApCliTab[ifIndex].WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\n\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId  = 0;\n\n\tif(pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA)\n\t\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = 1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_AuthMode_Proc::(AuthMode=%d)\\n\", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].AuthMode));\t\t\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set ApCli-IF Encryption Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_EncrypType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\tifIndex;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled; \n\tif ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n    {\n\t\tif (pApCliEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11WEPEnabled;\t\t\t\t  \n\t}\n\telse if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n\t{\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption2Enabled;                       \n    }\n\telse if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0) || (strcmp(arg, \"TKIPAES\") == 0))\n\t{\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption3Enabled;                            \n\t}    \n\telse\n\t{\n\t\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled;                 \n\t}\n\n\tpApCliEntry->PairCipher     = pApCliEntry->WepStatus;\n\tpApCliEntry->GroupCipher    = pApCliEntry->WepStatus;\n\tpApCliEntry->bMixCipher\t\t= FALSE;\n\n\tif (pApCliEntry->WepStatus >= Ndis802_11Encryption2Enabled)\n\t\tpApCliEntry->DefaultKeyId = 1;\n\n\tRTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_EncrypType_Proc::(EncrypType=%d)\\n\", ifIndex, pApCliEntry->WepStatus));\n\n\treturn TRUE;\n}\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Default Key ID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_DefaultKeyID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG \t\t\tKeyIdx;\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tKeyIdx = simple_strtol(arg, 0, 10);\n\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\tpApCliEntry->DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n\telse\n\t\treturn FALSE;  /* Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\\n\", ifIndex, pApCliEntry->DefaultKeyId));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key for ApCli link\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 WPA pre-shared key string\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_WPAPSK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ifIndex;\n\tPOS_COOKIE pObj;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\tINT retval;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ApCli_WPAPSK_Proc::(WPAPSK=%s)\\n\", arg));\n\n\tretval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pApCliEntry->PMK);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\t\n\tNdisMoveMemory(pApCliEntry->PSK, arg, strlen(arg));\n\tpApCliEntry->PSKLen = strlen(arg);\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY1 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\t\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[0], 0);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key1_Proc::(Key1=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n\t\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY2 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[1], 1);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key2_Proc::(Key2=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY3 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[2], 2);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key3_Proc::(Key3=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY4 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[3], 3);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key4_Proc::(Key4=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\nINT Set_ApCli_TxMode_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\t\n\tPOS_COOKIE \t\tpObj;\t\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode = \n\t\t\t\t\t\t\t\tRT_CfgSetFixedTxPhyMode(arg);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_TxMode_Proc = %d\\n\", ifIndex,\n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode));\n\n\treturn TRUE;\n}\n\nINT Set_ApCli_TxMcs_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tPOS_COOKIE \t\tpObj;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->DesiredTransmitSetting.field.MCS = \n\t\t\tRT_CfgSetTxMCSProc(arg, &pApCliEntry->bAutoTxRateSwitch);\n\n\tif (pApCliEntry->DesiredTransmitSetting.field.MCS == MCS_AUTO)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_TxMcs_Proc = AUTO\\n\", ifIndex));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_TxMcs_Proc = %d\\n\", ifIndex, \n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.MCS));\n\t}\t\n\n\treturn TRUE;\n}\n\n\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\nINT Set_ApCli_Wpa_Support(\n    IN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\n    if ( simple_strtol(arg, 0, 10) == 0)\n        pApCliEntry->WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;\n    else if ( simple_strtol(arg, 0, 10) == 1)\n        pApCliEntry->WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;\n    else if ( simple_strtol(arg, 0, 10) == 2)\n        pApCliEntry->WpaSupplicantUP = WPA_SUPPLICANT_ENABLE_WITH_WEB_UI;\n    else\n        pApCliEntry->WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_ApCli_Wpa_Support::(WpaSupplicantUP=%d)\\n\", pApCliEntry->WpaSupplicantUP));\n    \n    return TRUE;    \n}\n\nINT\tSet_ApCli_IEEE8021X_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    \tULONG ieee8021x;\n\tPOS_COOKIE \t\tpObj;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tieee8021x = simple_strtol(arg, 0, 10);\n\n\tif (ieee8021x == 1)\n        pApCliEntry->IEEE8021X = TRUE;\n\telse if (ieee8021x == 0)\n\t\tpApCliEntry->IEEE8021X = FALSE;\n\telse\n\t\treturn FALSE;  \n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_ApCli_IEEE8021X_Proc::(IEEE8021X=%d)\\n\", pObj->ioctl_if, pApCliEntry->IEEE8021X));\n\n\treturn TRUE;\n}\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n\n\n#endif /* APCLI_SUPPORT */\n\n\n\n\n\n#ifdef IAPP_SUPPORT\nINT\tSet_IappPID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tunsigned long IappPid;\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tIappPid = simple_strtol(arg, 0, 10);\n\tRTMP_GET_OS_PID(pObj->IappPid, IappPid);\n\tpObj->IappPid_nr = IappPid;\n\n/*\tDBGPRINT(RT_DEBUG_TRACE, (\"pObj->IappPid = %d\", GET_PID_NUMBER(pObj->IappPid))); */\n\treturn TRUE;\n} /* End of Set_IappPID_Proc */\n#endif /* IAPP_SUPPORT */\n\n\nINT\tSet_DisConnectSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tmacAddr[MAC_ADDR_LEN];\n\tPSTRING\t\t\t\t\tvalue;\n\tINT\t\t\t\t\t\ti;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\tif(strlen(arg) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\treturn FALSE;\n\n\tfor (i=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n\t{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  /*Invalid */\n\n\t\tAtoH(value, &macAddr[i++], 1);\n\t}\n\n\tpEntry = MacTableLookup(pAd, macAddr);\n\tif (pEntry)\n\t{\n\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);\n/*\t\tMacTableDeleteEntry(pAd, pEntry->Aid, Addr); */\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_DisConnectAllSta_Proc(\n        IN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n        CHAR value = simple_strtol(arg, 0, 10);\n\n        {\n                MacTableReset(pAd);\n        }\n\n\treturn TRUE;\n}\n\n\n#ifdef DOT1X_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set IEEE8021X.\n        This parameter is 1 when 802.1x-wep turn on, otherwise 0\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_IEEE8021X_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    ULONG ieee8021x;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tieee8021x = simple_strtol(arg, 0, 10);\n\n\tif (ieee8021x == 1)\n        pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X = TRUE;\n\telse if (ieee8021x == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_IEEE8021X_Proc::(IEEE8021X=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set pre-authentication enable or disable when WPA/WPA2 turn on\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_PreAuth_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    ULONG PreAuth;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tPreAuth = simple_strtol(arg, 0, 10);\n\n\tif (PreAuth == 1)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth = TRUE;\n\telse if (PreAuth == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_PreAuth_Proc::(PreAuth=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth));\n\n\treturn TRUE;\n}\n\nINT\tSet_OwnIPAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32\t\tip_addr;\n\n\tif (rtinet_aton(arg, &ip_addr))\n \t{\n        pAd->ApCfg.own_ip_addr = ip_addr;  \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"own_ip_addr=%s(%x)\\n\", arg, pAd->ApCfg.own_ip_addr));\n\t}\t \n\treturn TRUE;\n}\n\nINT\tSet_EAPIfName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT\t\t\ti;\n\tPSTRING\t\tmacptr;\t\n\n\tfor (i=0, macptr = rstrtok(arg,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t{\n\t\tif (strlen(macptr) > 0)\n\t\t{\n\t\t\tpAd->ApCfg.EAPifname_len[i] = strlen(macptr); \n\t\t\tNdisMoveMemory(pAd->ApCfg.EAPifname[i], macptr, strlen(macptr));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NO.%d EAPifname=%s, len=%d\\n\", i, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.EAPifname[i], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.EAPifname_len[i]));\n\t\t}\n\t}\n\treturn TRUE;\n}\n\nINT\tSet_PreAuthIfName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT\t\t\ti;\n\tPSTRING\t\tmacptr;\t\n\n\tfor (i=0, macptr = rstrtok(arg,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t{\n\t\tif (strlen(macptr) > 0)\n\t\t{\n\t\t\tpAd->ApCfg.PreAuthifname_len[i] = strlen(macptr); \n\t\t\tNdisMoveMemory(pAd->ApCfg.PreAuthifname[i], macptr, strlen(macptr));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NO.%d PreAuthifname=%s, len=%d\\n\", i,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.PreAuthifname[i], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.PreAuthifname_len[i]));\n\t\t}\n\t}\n\treturn TRUE;\n\n}\n\nINT\tSet_RADIUS_Server_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tPSTRING\t\tmacptr;\t\n\tINT\t\t\tcount;\n\tUINT32\t\tip_addr;\n\tINT\t\t\tsrv_cnt = 0;\n\n\tfor (count = 0, macptr = rstrtok(arg,\";\"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,\";\"), count++) \n\t{\n\t\tif (rtinet_aton(macptr, &ip_addr))\n\t\t{\n\t\t\tPRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];\n\t\t\n\t\t\tpSrvInfo->radius_ip = ip_addr;\n\t\t\tsrv_cnt++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_ip(seq-%d)=%s(%x)\\n\", \n\t\t\t\t\t\t\t\t\t\tapidx, srv_cnt, macptr, \n\t\t\t\t\t\t\t\t\t\tpSrvInfo->radius_ip));\t\t\t\n\t\t}\t    \n\t}\n\n\tif (srv_cnt > 0)\n\t\tpAd->ApCfg.MBSSID[apidx].radius_srv_num = srv_cnt;\n\n\treturn TRUE;\n}\n\nINT\tSet_RADIUS_Port_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tPSTRING\t\tmacptr;\t\n\tINT\t\t\tcount;\n\tINT\t\t\tsrv_cnt = 0;\n\n\tfor (count = 0, macptr = rstrtok(arg,\";\"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,\";\"), count++) \n\t{\t  \n\t\tif (srv_cnt < pAd->ApCfg.MBSSID[apidx].radius_srv_num)\n\t\t{\t\t\n\t\t\tPRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];\n\t\t\t\n        \tpSrvInfo->radius_port = (UINT32) simple_strtol(macptr, 0, 10); \n\t\t\tsrv_cnt ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_port(seq-%d)=%d\\n\", \n\t\t\t\t\t\t\t\t\t  apidx, srv_cnt, pSrvInfo->radius_port));\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nINT\tSet_RADIUS_Key_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tPSTRING\t\tmacptr;\t\n\tINT\t\t\tcount;\n\tINT\t\t\tsrv_cnt = 0;\n\n\tfor (count = 0, macptr = rstrtok(arg,\";\"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,\";\"), count++) \n\t{\t  \n\t\tif (strlen(macptr) > 0 && srv_cnt < pAd->ApCfg.MBSSID[apidx].radius_srv_num)\n\t\t{\t\t\n\t\t\tPRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];\n\n\t\t\tpSrvInfo->radius_key_len = strlen(macptr); \n\t\t\tNdisMoveMemory(pSrvInfo->radius_key, macptr, pSrvInfo->radius_key_len);\t\n\t\t\tsrv_cnt ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_key(seq-%d)=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\tapidx, srv_cnt,\n\t\t\t\t\t\t\t\t\t\tpSrvInfo->radius_key, \n\t\t\t\t\t\t\t\t\t\tpSrvInfo->radius_key_len));\t\t\t\n\t\t}\n\t}\t\t\t\t\n\treturn TRUE;\n}\n#endif /* DOT1X_SUPPORT */\n\n#ifdef UAPSD_SUPPORT\nINT Set_UAPSD_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR IdMbss = pObj->ioctl_if;\n\n\tif (simple_strtol(arg, 0, 10) != 0)\n\t\tpAd->ApCfg.MBSSID[IdMbss].UapsdInfo.bAPSDCapable = TRUE;\n\telse\n\t\tpAd->ApCfg.MBSSID[IdMbss].UapsdInfo.bAPSDCapable = FALSE;\n\t/* End of if */\n\n\treturn TRUE;\n} /* End of Set_UAPSD_Proc */\n#endif /* UAPSD_SUPPORT */\n\n\n\n#ifdef MCAST_RATE_SPECIFIC\nINT Set_McastPhyMode(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUCHAR PhyMode = simple_strtol(arg, 0, 10);\n\n\tpAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\tswitch (PhyMode)\n\t{\n\t\tcase MCAST_DISABLE: /* disable */\n\t\t\tNdisMoveMemory(&pAd->CommonCfg.MCastPhyMode, &pAd->MacTab.Content[MCAST_WCID].HTPhyMode, sizeof(HTTRANSMIT_SETTING));\n\t\t\tbreak;\n\n\t\tcase MCAST_CCK:\t/* CCK */\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_CCK;\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.BW =  BW_20;\n\t\t\tbreak;\n\n\t\tcase MCAST_OFDM:\t/* OFDM */\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_OFDM;\n\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\tcase MCAST_HTMIX:\t/* HTMIX */\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_HTMIX;\n\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\tdefault:\n\t\t\tprintk(\"unknow Muticast PhyMode %d.\\n\", PhyMode);\n\t\t\tprintk(\"0:Disable 1:CCK, 2:OFDM, 3:HTMIX.\\n\");\n\t\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_McastMcs(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUCHAR Mcs = simple_strtol(arg, 0, 10);\n\n\tif (Mcs > 15)\n\t\tprintk(\"Mcs must in range of 0 to 15\\n\");\n\n\tswitch(pAd->CommonCfg.MCastPhyMode.field.MODE)\n\t{\n\t\tcase MODE_CCK:\n\t\t\tif ((Mcs <= 3) || (Mcs >= 8 && Mcs <= 11))\n\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\telse\n\t\t\t\tprintk(\"MCS must in range of 0 ~ 3 and 8 ~ 11 for CCK Mode.\\n\");\n\t\t\tbreak;\n\n\t\tcase MODE_OFDM:\n\t\t\tif (Mcs > 7)\n\t\t\t\tprintk(\"MCS must in range from 0 to 7 for CCK Mode.\\n\");\n\t\t\telse\n\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nINT Show_McastRate(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tprintk(\"Mcast PhyMode =%d\\n\", pAd->CommonCfg.MCastPhyMode.field.MODE);\n\tprintk(\"Mcast Mcs =%d\\n\", pAd->CommonCfg.MCastPhyMode.field.MCS);\n\treturn TRUE;\n}\n#endif /* MCAST_RATE_SPECIFIC */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\nINT Set_OBSSScanParam_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING\t\t\targ)\n{\n\t\n\tINT ObssScanValue;\n\tUINT Idx;\n\tPSTRING thisChar;\n\t\n\tIdx = 0;\n\twhile ((thisChar = strsep((char **)&arg, \"-\")) != NULL)\n\t{\n\t\tObssScanValue = (INT) simple_strtol(thisChar, 0, 10);\n\t\tswitch (Idx)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tif (ObssScanValue < 5 || ObssScanValue > 1000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanPassiveDwell(%d), should in range 5~1000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = ObssScanValue;\t/* Unit : TU. 5~1000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanPassiveDwell=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tif (ObssScanValue < 10 || ObssScanValue > 1000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanActiveDwell(%d), should in range 10~1000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = ObssScanValue;\t/* Unit : TU. 10~1000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanActiveDwell=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = ObssScanValue;\t/* Unit : Second */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthTriggerScanInt=%d\\n\", ObssScanValue));\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tif (ObssScanValue < 200 || ObssScanValue > 10000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel(%d), should in range 200~10000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = ObssScanValue;\t/* Unit : TU. 200~10000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tif (ObssScanValue < 20 || ObssScanValue > 10000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanActiveTotalPerChannel(%d), should in range 20~10000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = ObssScanValue;\t/* Unit : TU. 20~10000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanActiveTotalPerChannel=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = ObssScanValue;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\\n\", ObssScanValue));\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = ObssScanValue;\t/* Unit : percentage */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\\n\", ObssScanValue));\n\t\t\t\tbreak;\n\t\t}\n\t\tIdx++;\n\t}\n\n\tif (Idx != 7)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Wrong OBSSScanParamtetrs format in ioctl cmd!!!!! Use default value\\n\"));\n\t\t\n\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell;\t/* Unit : TU. 5~1000 */\n\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell;\t/* Unit : TU. 10~1000 */\n\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval;\t/* Unit : Second */\n\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel;\t/* Unit : TU. 200~10000 */\n\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel;\t/* Unit : TU. 20~10000 */\n\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;\n\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold;\t/* Unit : percentage */\n\t}\n\tpAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelay=%ld\\n\", pAd->CommonCfg.Dot11BssWidthChanTranDelay));\n\t\n\treturn TRUE;\n}\n\n\nINT\tSet_AP2040ReScan_Proc(\n\tIN\tPRTMP_ADAPTER pAd,\n\tIN\tPSTRING arg)\n{\n\tAPOverlappingBSSScan(pAd);\n\n\t/* apply setting */\n\tSetCommonHT(pAd);\n\tAsicBBPAdjust(pAd);\n\tAsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);\n\tAsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_AP2040ReScan_Proc() Trigger AP ReScan !!!\\n\"));\n\n\treturn TRUE;\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\nINT Set_EntryLifeCheck_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING\t\t\targ)\n{\n\tULONG LifeCheckCnt = (ULONG) simple_strtol(arg, 0, 10);\n\n\tif (LifeCheckCnt <= 65535)\n\t\tpAd->ApCfg.EntryLifeCheck = LifeCheckCnt;\n\telse\n\t\tprintk(\"LifeCheckCnt must in range of 0 to 65535\\n\");\n\n\tprintk(\"EntryLifeCheck Cnt = %ld.\\n\", pAd->ApCfg.EntryLifeCheck);\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tApCfg_Set_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tINT\t\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ)\n{\n\tif ((strcmp(arg, \"WEPAUTO\") == 0) || (strcmp(arg, \"wepauto\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeAutoSwitch;\n\telse if ((strcmp(arg, \"OPEN\") == 0) || (strcmp(arg, \"open\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\telse if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeShared;\n\telse if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPAPSK;\n\telse if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA2PSK;\n\telse if ((strcmp(arg, \"WPAPSKWPA2PSK\") == 0) || (strcmp(arg, \"wpapskwpa2psk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA1PSKWPA2PSK;\n#ifdef DOT1X_SUPPORT\n\telse if ((strcmp(arg, \"WPA\") == 0) || (strcmp(arg, \"wpa\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA;\n\telse if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"wpa2\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA2;\n\telse if ((strcmp(arg, \"WPA1WPA2\") == 0) || (strcmp(arg, \"wpa1wpa2\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA1WPA2;\n#endif /* DOT1X_SUPPORT */\n\telse\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;  \n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d)::AuthMode=%d\\n\", apidx, pAd->ApCfg.MBSSID[apidx].AuthMode));\t\t\n\n\treturn TRUE;\n}\n\nINT\tApCfg_Set_MaxStaNum_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN INT\t\t\t\tapidx,\n\tIN PSTRING \t\t\targ)\n{\n\tpAd->ApCfg.MBSSID[apidx].MaxStaNum = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) %s::(MaxStaNum=%d)\\n\", \n\t\t\t\t\tapidx, __FUNCTION__, pAd->ApCfg.MBSSID[apidx].MaxStaNum));\n\treturn TRUE;\n}\n\nINT\tApCfg_Set_IdleTimeout_Proc(\n\tIN PRTMP_ADAPTER \tpAd, \n\tIN PSTRING \t\t\targ)\n{\n\tLONG idle_time;\n\n\tidle_time = simple_strtol(arg, 0, 10);\n\n\tif (idle_time < MAC_TABLE_MIN_AGEOUT_TIME)\n\t\tpAd->ApCfg.StaIdleTimeout = MAC_TABLE_MIN_AGEOUT_TIME;\n\telse\n\t\tpAd->ApCfg.StaIdleTimeout = idle_time;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : IdleTimeout=%d\\n\", __FUNCTION__, pAd->ApCfg.StaIdleTimeout));\n\n\treturn TRUE;\n}\n\n\n\n\n\n\nINT\tSet_MemDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef VENDOR_FEATURE2_SUPPORT\n\tprintk(\"Number of Packet Allocated = %lu\\n\", OS_NumOfPktAlloc);\n\tprintk(\"Number of Packet Freed = %lu\\n\", OS_NumOfPktFree);\n\tprintk(\"Offset of Packet Allocated/Freed = %lu\\n\", OS_NumOfPktAlloc - OS_NumOfPktFree);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\treturn TRUE;\n}\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\nVOID RTMPApCliAddKey(\n\tIN\tPRTMP_ADAPTER\t    pAd, \n\tIN \tINT\t\t\t\tapidx,\n\tIN\tPNDIS_APCLI_802_11_KEY    pKey)\n{\n\tULONG\t\t\t\tKeyIdx;\n\tMAC_TABLE_ENTRY  \t*pEntry;\n\tINT \tifIndex,BssIdx;\n\tPAPCLI_STRUCT pApCliEntry;\n\tMAC_TABLE_ENTRY\t\t\t\t*pMacEntry=(MAC_TABLE_ENTRY *)NULL;\n\t\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"RTMPApCliAddKey ------>\\n\"));\n\n\tifIndex=apidx;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tpMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;\n\n\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t{\n\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t{\n\t\t\t    if (pApCliEntry->AuthMode == Ndis802_11AuthModeWPANone)\n\t            \t\t{\n\t\t                NdisZeroMemory(pApCliEntry->PMK, 32);\n\t\t                NdisMoveMemory(pApCliEntry->PMK, pKey->KeyMaterial, pKey->KeyLength);\n\t                \t\tgoto end;\n\t            \t\t}\n\t\t\t    /* Update PTK */\n\t\t\t    NdisZeroMemory(&pMacEntry->PairwiseKey, sizeof(CIPHER_KEY));  \n\t            \t\tpMacEntry->PairwiseKey.KeyLen = LEN_TK;\n\t            \t\tNdisMoveMemory(pMacEntry->PairwiseKey.Key, pKey->KeyMaterial, LEN_TK);\n           \n\t\t            if (pApCliEntry->PairCipher == Ndis802_11Encryption2Enabled)\n\t\t            {\n\t\t                NdisMoveMemory(pMacEntry->PairwiseKey.RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n\t\t                NdisMoveMemory(pMacEntry->PairwiseKey.TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);\n\t\t            }\n\t\t            else\n\n\t\t            {\n\t\t            \tNdisMoveMemory(pMacEntry->PairwiseKey.TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n\t\t                NdisMoveMemory(pMacEntry->PairwiseKey.RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);\n\t\t            }\n\n            /* Decide its ChiperAlg */\n\t\t        \tif (pApCliEntry->PairCipher == Ndis802_11Encryption2Enabled)\n\t\t        \t\tpMacEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;\n\t\t        \telse if (pApCliEntry->PairCipher == Ndis802_11Encryption3Enabled)\n\t\t        \t\tpMacEntry->PairwiseKey.CipherAlg = CIPHER_AES;\n\t\t        \telse\n\t\t        \t\tpMacEntry->PairwiseKey.CipherAlg = CIPHER_NONE; \n\n\t\t    AsicAddPairwiseKeyEntry(\n\t\t        pAd, \n\t\t        (UCHAR)pMacEntry->Aid, \n\t\t        &pMacEntry->PairwiseKey);\n\n\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\tBssIdx, \n\t\t\t\t\t\t\t\t\t0, \n\t\t\t\t\t\t\t\t\tpMacEntry->PairwiseKey.CipherAlg,\n\t\t\t\t\t\t\t\t\t(UCHAR)pMacEntry->Aid, \n\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\t\n\n\t            if (pMacEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t            {\n\t                /* set 802.1x port control */\n\t                pMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t  pMacEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t            }\n\t\t}\n        else\n        {\n            /* Update GTK  */           \n            pApCliEntry->DefaultKeyId = (pKey->KeyIndex & 0xFF);\n            NdisZeroMemory(&pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId], sizeof(CIPHER_KEY));  \n            pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].KeyLen = LEN_TK;\n            NdisMoveMemory(pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].Key, pKey->KeyMaterial, LEN_TK);\n            \n            if (pApCliEntry->GroupCipher == Ndis802_11Encryption2Enabled)\n            {\n                NdisMoveMemory(pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n                NdisMoveMemory(pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);        \t\n            }\n            else\n             \n            {\n            \tNdisMoveMemory(pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n                NdisMoveMemory(pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);        \t\n            }\n\n            /* Update Shared Key CipherAlg */\n    \t\tpApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].CipherAlg = CIPHER_NONE;\n    \t\tif (pApCliEntry->GroupCipher == Ndis802_11Encryption2Enabled)\n    \t\t\tpApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].CipherAlg = CIPHER_TKIP;\n    \t\telse if (pApCliEntry->GroupCipher == Ndis802_11Encryption3Enabled)\n    \t\t\tpApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].CipherAlg = CIPHER_AES;\n\n            /* Update group key information to ASIC Shared Key Table */\t   \n        \tAsicAddSharedKeyEntry(pAd, \n        \t\t\t\t\t\t  BssIdx, \n        \t\t\t\t\t\t  pApCliEntry->DefaultKeyId, \n        \t\t\t\t\t\t  &pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId]);\n\n\t\t\n\n        \t/* Update ASIC WCID attribute table and IVEIV table */\n        \tRTMPAddWcidAttributeEntry(pAd, \n        \t\t\t\t\t\t\t  BssIdx, \n        \t\t\t\t\t\t\t  pApCliEntry->DefaultKeyId, \n        \t\t\t\t\t\t\t  pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].CipherAlg, \n        \t\t\t\t\t\t\t  NULL);\n\n\n            /* set 802.1x port control */\n             if (pMacEntry->AuthMode >= Ndis802_11AuthModeWPA)\n            {\n                /* set 802.1x port control */\n                pMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t  pMacEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n            }\n        }\n\t}\n\telse\t/* dynamic WEP from wpa_supplicant */\n\t{\n\t\tUCHAR\tCipherAlg;\n    \tPUCHAR\tKey;\n\n\t\tif(pKey->KeyLength == 32)\n\t\t\tgoto end;\n\t\t\n\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\n\t\tif (KeyIdx < 4)\n\t\t{\n\t\t\t/* it is a default shared key, for Pairwise key setting */\n\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t{\n\t\t\t\tpEntry = MacTableLookup(pAd, pKey->BSSID);\n\n\t\t\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddKey: Set Pair-wise Key\\n\"));\n\t\t\n\t\t\t\t\t/* set key material and key length */\n \t\t\t\t\tpEntry->PairwiseKey.KeyLen = (UCHAR )pKey->KeyLength;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\t\n\t\t\t\t\t/* set Cipher type */\n\t\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t\n\t\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\t\tAsicAddPairwiseKeyEntry(\n\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t(UCHAR)pEntry->Aid,\n                \t\t\t\t&pEntry->PairwiseKey);\n\n\t\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\tBssIdx, \n\t\t\t\t\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\t\tpEntry->Aid, \n\t\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\t\t\t\t}\t\n\t\t\t}\n\t\t\telse\t\n            \t\t{\n\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\tpApCliEntry->DefaultKeyId = (UCHAR) KeyIdx;\n                     \n\t\t\t\t/*/ set key material and key length */\n\t\t\t\tpApCliEntry->SharedKey[KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(pApCliEntry->SharedKey[KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\n\t\t\t\t/* Set Ciper type */\n\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\tpApCliEntry->SharedKey[KeyIdx].CipherAlg = CIPHER_WEP64;\n\t\t\t\telse\n\t\t\t\t\tpApCliEntry->SharedKey[KeyIdx].CipherAlg = CIPHER_WEP128;\n\t\t\t\n\t    \t\t\tCipherAlg = pApCliEntry->SharedKey[KeyIdx].CipherAlg;\n\t    \t\t\tKey = pApCliEntry->SharedKey[KeyIdx].Key;\n\n\t\t\t\t\t/* Set Group key material to Asic */\n\t    \t\t\tAsicAddSharedKeyEntry(pAd, BssIdx, KeyIdx, &pApCliEntry->SharedKey[KeyIdx]);\n\t\t\n\t\t\t\t/* STA doesn't need to set WCID attribute for group key */\n\t\t\n\t\t\t\t/* Update WCID attribute table and IVEIV table for this group key table */\n\t\t\t\tRTMPAddWcidAttributeEntry(pAd, BssIdx, KeyIdx, CipherAlg, NULL);\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\nend:\n\n    DBGPRINT(RT_DEBUG_INFO, (\"<------ RTMPApCliAddKey\\n\"));\n\n\treturn;\n}\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tSet power save life time.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tSet_PowerSaveLifeTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->MacTab.MsduLifeTime = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set new life time = %d\\n\", pAd->MacTab.MsduLifeTime));\n\treturn TRUE;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef MBSS_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tShow MBSS information.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tShow_MbssInfo_Display_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32 IdBss;\n\tUCHAR PhyMode;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\\tBSS Idx\\t\\tPhy Mode\\n\"));\n\n\tfor(IdBss=0; IdBss<=pAd->ApCfg.BssidNum; IdBss++)\n\t{\n\t\tif (IdBss == 0)\n\t\t{\n\t\t\tPhyMode = pAd->CommonCfg.PhyMode;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\tMAX\\t\\t\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPhyMode = pAd->ApCfg.MBSSID[IdBss-1].PhyMode;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\t%d\\t\\t\", IdBss-1));\n\t\t} /* End of if */\n\n\t\tswitch(PhyMode)\n\t\t{\n\t\t\tcase PHY_11BG_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BG Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11B:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"B Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11A:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"A Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11ABG_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ABG Mixed ==> BG Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11G:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"G Only\\n\"));\n\t\t\t\tbreak;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\tcase PHY_11ABGN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ABGN Mixed ==> BGN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11N_2_4G:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2.4G N Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11GN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"GN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11AN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11BGN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BGN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11AGN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AGN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11N_5G:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"5G N Only\\n\"));\n\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\t} /* End of switch */\n\t} /* End of for */\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\"));\n\n\treturn TRUE;\n} /* End of Show_MbssInfo_Display_Proc */\n#endif /* MBSS_SUPPORT */\n\n\n#ifdef HOSTAPD_SUPPORT\nVOID RtmpHostapdSecuritySet(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrqin)\n{\n\tif(wrqin->u.data.length > 20 && MAX_LEN_OF_RSNIE > wrqin->u.data.length && wrqin->u.data.pointer)\n\t{\n\t\tUCHAR RSNIE_Len[2];\n\t\tUCHAR RSNIe[2];\n\t\tint offset_next_ie=0;\n\t\tint Status = 0;\n\t\tINT apidx;\n\t\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\t\tapidx = pObj->ioctl_if;\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ioctl SIOCSIWGENIE pAd->IoctlIF=%d\\n\",apidx));\n\n\t\tRSNIe[0]=*(UINT8 *)wrqin->u.data.pointer;\n\t\tif(IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0] )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IE %02x != 0x30/0xdd\\n\",RSNIe[0]));\n\t\t\tStatus = -EINVAL;\n\t\t\treturn;\n\t\t}\n\t\tRSNIE_Len[0]=*((UINT8 *)wrqin->u.data.pointer + 1);\n\t\tif(wrqin->u.data.length != RSNIE_Len[0]+2)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IE use WPA1 WPA2\\n\"));\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], MAX_LEN_OF_RSNIE);\n\t\t\tRSNIe[1]=*(UINT8 *)wrqin->u.data.pointer;\n\t\t\tRSNIE_Len[1]=*((UINT8 *)wrqin->u.data.pointer + 1);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,( \"IE1 %02x %02x\\n\",RSNIe[1],RSNIE_Len[1]));\n\t\t\tpAd->ApCfg.MBSSID[apidx].RSNIE_Len[1] = RSNIE_Len[1];\n\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], (UCHAR *)(wrqin->u.data.pointer)+2, RSNIE_Len[1]);\n\t\t\toffset_next_ie=RSNIE_Len[1]+2;\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IE use only %02x\\n\",RSNIe[0]));\n\n\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], MAX_LEN_OF_RSNIE);\n\t\tRSNIe[0]=*(((UINT8 *)wrqin->u.data.pointer)+offset_next_ie);\n\t\tRSNIE_Len[0]=*(((UINT8 *)wrqin->u.data.pointer) + offset_next_ie + 1);\n\t\tif(IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0] )\n\t\t{\n\t\t\tStatus = -EINVAL;\n\t\t\treturn;\n\t\t}\n\t\tpAd->ApCfg.MBSSID[apidx].RSNIE_Len[0] = RSNIE_Len[0];\n\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], ((UCHAR *)(wrqin->u.data.pointer))+2+offset_next_ie, RSNIE_Len[0]);\n\t\tAPMakeAllBssBeacon(pAd);\n\t\tAPUpdateAllBeaconFrame(pAd);\n\t}\n}\n#endif /* HOSTAPD_SUPPORT */\n\n\n/*\n========================================================================\nRoutine Description:\n\tDriver Ioctl for AP.\n\nArguments:\n\tpAdSrc\t\t\t- WLAN control block pointer\n\twrq\t\t\t\t- the IOCTL parameters\n\tcmd\t\t\t\t- the command ID\n\tsubcmd\t\t\t- the sub-command ID\n\tpData\t\t\t- the IOCTL private data pointer\n\tData\t\t\t- the IOCTL private data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\t- IOCTL OK\n\tOtherwise\t\t\t- IOCTL fail\n\nNote:\n========================================================================\n*/\nINT RTMP_AP_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPOS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n\n\tswitch(cmd)\n\t{\n\t\tcase CMD_RTPRIV_IOCTL_SET:\n\t\t\tStatus = RTMPAPPrivIoctlSet(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase CMD_RT_PRIV_IOCTL:\n\t\t\tif (subcmd & OID_GET_SET_TOGGLE)\n\t\t\t\tStatus = RTMPAPSetInformation(pAd, wrq,  (INT)subcmd);\n\t\t\telse\n\t\t\t{\n#ifdef LLTD_SUPPORT\n\t\t\t\tif (subcmd == RT_OID_GET_PHY_MODE)\n\t\t\t\t{\n\t\t\t\t\tif(pData != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tUINT modetmp = 0;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::Get phy mode (%02X) \\n\", pAd->CommonCfg.PhyMode));\n\t\t\t\t\t\tmodetmp = (UINT) pAd->CommonCfg.PhyMode;\n\t\t\t\t\t\twrq->u.data.length = 1;\n\t\t\t\t\t\t/**(ULONG *)pData = (ULONG)pAd->CommonCfg.PhyMode; */\n\t\t\t\t\t\tif (copy_to_user(pData, &modetmp, wrq->u.data.length))\n\t\t\t\t\t\t\tStatus = -EFAULT;\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t\telse\n#endif /* LLTD_SUPPORT */\n\t\t\t\t\tStatus = RTMPAPQueryInformation(pAd, wrq, (INT)subcmd);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SHOW:\n\t\t\tStatus = RTMPAPPrivIoctlShow(pAd, wrq);\n\t\t\tbreak;\n\n\n\t\tcase CMD_RTPRIV_IOCTL_GET_MAC_TABLE:\n\t\t\tRTMPIoctlGetMacTable(pAd,wrq);\n\t\t    break;\n\n#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)\n\t\tcase CMD_RTPRIV_IOCTL_GSITESURVEY:\n\t\t\tRTMPIoctlGetSiteSurvey(pAd,wrq);\n\t\t\tbreak;\n#endif /* AP_SCAN_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_STATISTICS:\n\t\t\tRTMPIoctlStatistics(pAd, wrq);\n\t\t\tbreak;\n\n\n#ifdef DOT11_N_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_QUERY_BATABLE:\n\t\t    RTMPIoctlQueryBaTable(pAd, wrq);\n\t\t    break;\n#endif /* DOT11_N_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_E2P:\n\t\t\tRTMPAPIoctlE2PROM(pAd, wrq);\n\t\t\tbreak;\n\n#ifdef DBG\n\t\tcase CMD_RTPRIV_IOCTL_BBP:\n\t\t\tRTMPAPIoctlBBP(pAd, wrq);\n\t\t\tbreak;\n\t\t\t\n\t\tcase CMD_RTPRIV_IOCTL_MAC:\n\t\t\tRTMPAPIoctlMAC(pAd, wrq);\n\t\t\tbreak;\n            \n#ifdef RTMP_RF_RW_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_RF:\n\t\t\tRTMPAPIoctlRF(pAd, wrq);\n\t\t\tbreak;\n#endif /* RTMP_RF_RW_SUPPORT */\n#endif /* DBG */\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_GET_AR9_SHOW:\n\t\t\tStatus = RTMPAPPrivIoctlAR9Show(pAd, wrq);\n\t\t\tbreak;\n#endif /*AR9_MAPI_SUPPORT*/\n#endif/* INF_AR9 */\n\n\t\tcase CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT:\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR:\n            if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd))\n    \t\t\tNdisCopyMemory((PSTRING) wrq->u.name, (PSTRING) pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid, 6);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID:\n\t\t{\n\t\t\tRT_CMD_AP_IOCTL_SSID *pSSID = (RT_CMD_AP_IOCTL_SSID *)pData;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (pSSID->priv_flags == INT_APCLI)\n\t\t\t{\n\t\t\t\tif (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE)\n\t\t\t\t{\n\t\t\t\t\tpSSID->length = pAd->ApCfg.ApCliTab[pObj->ioctl_if].SsidLen;\n\t\t\t\t\tpSSID->pSsidStr = (char *)&pAd->ApCfg.ApCliTab[pObj->ioctl_if].Ssid;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpSSID->length = 0;\n\t\t\t\t\tpSSID->pSsidStr = NULL;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tpSSID->length = pAd->ApCfg.MBSSID[pSSID->apidx].SsidLen;\n\t\t\t\tpSSID->pSsidStr = (char *)pAd->ApCfg.MBSSID[pSSID->apidx].Ssid;\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n#ifdef MBSS_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_BEACON_UPDATE:\n\t\t\tAPMakeAllBssBeacon(pAd);\n\t\t\tAPUpdateAllBeaconFrame(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_OPEN:\n\t\t\tif (MBSS_Open(pData) != 0)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_CLOSE:\n\t\t\tMBSS_Close(pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_INIT:\n\t\t\tMBSS_Init(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_REMOVE:\n\t\t\tMBSS_Remove(pAd);\n\t\t\tbreak;\n#endif /* MBSS_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_WSC_INIT:\n\t\t{\n#ifdef APCLI_SUPPORT\n#endif /* APCLI_SUPPORT */\n\t\t}\n\t\t\tbreak;\n\n#ifdef APCLI_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_APC_UP:\n\t\t\tApCliIfUp(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_DISCONNECT:\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, Data);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_INIT:\n\t\t\tAPCli_Init(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_OPEN:\n\t\t\tif (ApCli_Open(pAd, pData) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_CLOSE:\n\t\t\tif (ApCli_Close(pAd, pData) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_REMOVE:\n\t\t\tApCli_Remove(pAd);\n\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_MAIN_OPEN:\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_PREPARE:\n\t\t{\n\t\t\tRT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pData;\n\t\t\tpConfig->Status = RTMP_AP_IoctlPrepare(pAd, pData);\n\t\t\tif (pConfig->Status != 0)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWAP:\n\t\t{\n\t\t\tUCHAR *pBssidDest = (UCHAR *)pData;\n\t\t\tPCHAR pBssidStr;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (Data == INT_APCLI)\n\t\t\t{\n\t\t\t\tif (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE)\n\t\t\t\t\tpBssidStr = (PCHAR)&APCLI_ROOT_BSSID_GET(pAd, pAd->ApCfg.ApCliTab[pObj->ioctl_if].MacTabWCID);\n\t\t\t\telse\n\t\t\t\t\tpBssidStr = NULL;\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tpBssidStr = (PCHAR) &pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid[0];\n\t\t\t}\n\n\t\t\tif (pBssidStr != NULL)\n\t\t\t{\n\t\t\t\tmemcpy(pBssidDest, pBssidStr, ETH_ALEN);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t\t\t\tpBssidStr[0],pBssidStr[1],pBssidStr[2], pBssidStr[3],pBssidStr[4],pBssidStr[5]));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmemset(pBssidDest, 0, ETH_ALEN);\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:\n\t\t/* handle for SIOCGIWRATEQ */\n\t\t{\n\t\t\tRT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData;\n\t\t\tHTTRANSMIT_SETTING HtPhyMode;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (pRate->priv_flags == INT_APCLI)\n\t\t\t\tHtPhyMode = pAd->ApCfg.ApCliTab[pObj->ioctl_if].HTPhyMode;\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n#ifdef WDS_SUPPORT\n\t\t\tif (pRate->priv_flags == INT_WDS)\n\t\t\t\tHtPhyMode = pAd->WdsTab.WdsEntry[pObj->ioctl_if].HTPhyMode;\n\t\t\telse\n#endif /* WDS_SUPPORT */\n\t\t\t{\n\t\t\t\tHtPhyMode = pAd->ApCfg.MBSSID[pObj->ioctl_if].HTPhyMode;\n\n#ifdef MBSS_SUPPORT\n\t\t\t\t/* reset phy mode for MBSS */\n\t\t\t\tMBSS_PHY_MODE_RESET(pObj->ioctl_if, HtPhyMode);\n#endif /* MBSS_SUPPORT */\n\t\t\t}\n\n\t\t\tRtmpDrvMaxRateGet(pAd, HtPhyMode.field.MODE, HtPhyMode.field.ShortGI,\n\t\t\t\t\t\t\tHtPhyMode.field.BW, HtPhyMode.field.MCS,\n\t\t\t\t\t\t\t(UINT32 *)&pRate->BitRate);\n\t\t}\n\t\t\tbreak;\n/* // remove tmp xin87.li\n#ifdef HOSTAPD_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:\n\t\t\tRtmpHostapdSecuritySet(pAd, wrq);\n\t\t\tbreak;\n#endif /* HOSTAPD_SUPPORT */\n\n\t\tdefault:\n\t\t\tStatus = RTMP_COM_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data);\n\t\t\tbreak;\n\t}\n\n\treturn Status;\n}\n\n"
  },
  {
    "path": "src/ap/ap_connect.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n \n    Module Name:\n    connect.c\n \n    Abstract:\n    Routines to deal Link UP/DOWN and build/update BEACON frame contents\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    John Chang  08-04-2003    created for 11g soft-AP\n */\n\n#include \"rt_config.h\"\n\nUCHAR PowerConstraintIE[3] = {IE_POWER_CONSTRAINT, 1, 3};\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tUsed to check the necessary to send Beancon.\n\treturn value\n\t\t0: mean no necessary.\n\t\t0: mean need to send Beacon for the service.\n\t==========================================================================\n*/\nBOOLEAN BeaconTransmitRequired(\n\tIN RTMP_ADAPTER *pAd,\n\tIN INT apidx,\n\tIN MULTISSID_STRUCT *pMbss)\n{\n\tBOOLEAN result = FALSE;\n\n\tdo\n\t{\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\tif (isCarrierDetectExist(pAd) == TRUE)\n\t\t\tbreak;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\n\t\tif (apidx == MAIN_MBSSID)\n\t\t{\n\t\t\tif (pMbss->bBcnSntReq == TRUE) \n\t\t\t{\n\t\t\t\tresult = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pMbss->bBcnSntReq == TRUE) \n\t\t\t\tresult = TRUE;\n\t\t}\n\t}\n\twhile (FALSE);\n\n\treturn result;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPre-build a BEACON frame in the shared memory\n\t==========================================================================\n*/\nVOID APMakeBssBeacon(RTMP_ADAPTER *pAd, INT apidx)\n{\n\tUCHAR DsLen = 1, SsidLen;\n\tHEADER_802_11 BcnHdr;\n\tLARGE_INTEGER FakeTimestamp;\n\tULONG FrameLen = 0;\n\tPUCHAR pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;\n\tUCHAR *ptr;\n\tUINT i;\n\tUINT32 longValue, reg_base;\n\tHTTRANSMIT_SETTING BeaconTransmit = {.word = 0};   /* MGMT frame PHY rate setting when operatin at Ht rate. */\n\tUCHAR PhyMode, SupRateLen;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tif(!BeaconTransmitRequired(pAd, apidx, &pAd->ApCfg.MBSSID[apidx]))\n\t\treturn;\n\n\tPhyMode = pAd->ApCfg.MBSSID[apidx].PhyMode;\n\n\tif (pAd->ApCfg.MBSSID[apidx].bHideSsid)\n\t\tSsidLen = 0;\n\telse\n\t\tSsidLen = pAd->ApCfg.MBSSID[apidx].SsidLen;\n\n\tMgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid);\n\t\n\t/* for update framelen to TxWI later. */\n\tSupRateLen = pAd->CommonCfg.SupRateLen;\n\tif (PhyMode == WMODE_B)\n\t\tSupRateLen = 4;\n\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n\t{\n\t\tUCHAR\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\t\tUCHAR\t\tSupRateIe = IE_SUPP_RATES;\n\t\tUCHAR\t\tSupRateLen = 0;\n\t\t\n\t\tSupRate[0]\t= 0x8C;    /* 6 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[1]\t= 0x12;    /* 9 mbps, in units of 0.5 Mbps */\n\t\tSupRate[2]\t= 0x98;    /* 12 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[3]\t= 0x24;    /* 18 mbps, in units of 0.5 Mbps */\n\t\tSupRate[4]\t= 0xb0;    /* 24 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[5]\t= 0x48;    /* 36 mbps, in units of 0.5 Mbps */\n\t\tSupRate[6]\t= 0x60;    /* 48 mbps, in units of 0.5 Mbps */\n\t\tSupRate[7]\t= 0x6c;    /* 54 mbps, in units of 0.5 Mbps */\n\t\tSupRateLen\t= 8;\n\n\t\tMakeOutgoingFrame(pBeaconFrame,                  &FrameLen,\n\t\t\t\t\t\tsizeof(HEADER_802_11),           &BcnHdr, \n\t\t\t\t\t\tTIMESTAMP_LEN,                   &FakeTimestamp,\n\t\t\t\t\t\t2,                               &pAd->CommonCfg.BeaconPeriod,\n\t\t\t\t\t\t2,                               &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,\n\t\t\t\t\t\t1,                               &SsidIe, \n\t\t\t\t\t\t1,                               &SsidLen, \n\t\t\t\t\t\tSsidLen,                       pAd->ApCfg.MBSSID[apidx].Ssid,\n\t\t\t\t\t\t1,                               &SupRateIe, \n\t\t\t\t\t\t1,                               &SupRateLen,\n\t\t\t\t\t\tSupRateLen,                 &SupRate, \n\t\t\t\t\t\t1,                               &DsIe, \n\t\t\t\t\t\t1,                               &DsLen, \n\t\t\t\t\t\t1,                               &pAd->CommonCfg.Channel,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\tMakeOutgoingFrame(pBeaconFrame,                  &FrameLen,\n\t\t\t\t\tsizeof(HEADER_802_11),           &BcnHdr, \n\t\t\t\t\tTIMESTAMP_LEN,                   &FakeTimestamp,\n\t\t\t\t\t2,                               &pAd->CommonCfg.BeaconPeriod,\n\t\t\t\t\t2,                               &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,\n\t\t\t\t\t1,                               &SsidIe, \n\t\t\t\t\t1,                               &SsidLen, \n\t\t\t\t\tSsidLen,                         pAd->ApCfg.MBSSID[apidx].Ssid,\n\t\t\t\t\t1,                               &SupRateIe, \n\t\t\t\t\t1,                               &SupRateLen,\n\t\t\t\t\tSupRateLen,                      pAd->CommonCfg.SupRate, \n\t\t\t\t\t1,                               &DsIe, \n\t\t\t\t\t1,                               &DsLen, \n\t\t\t\t\t1,                               &pAd->CommonCfg.Channel,\n\t\t\t\t\tEND_OF_ARGS);\n\n\tif ((pAd->CommonCfg.ExtRateLen) && (PhyMode != WMODE_B))\n\t{\n\t\tULONG TmpLen;\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,         &TmpLen,\n\t\t\t\t\t\t1,                               &ExtRateIe, \n\t\t\t\t\t\t1,                               &pAd->CommonCfg.ExtRateLen,\n\t\t\t\t\t\tpAd->CommonCfg.ExtRateLen,           pAd->CommonCfg.ExtRate, \n\t\t\t\t\t\tEND_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\n\n    /* add country IE, power constraint IE */\n\tif (pAd->CommonCfg.bCountryFlag)\n\t{\n\t\tULONG TmpLen, TmpLen2=0;\n\t\tUCHAR *TmpFrame = NULL;\n\t\tUCHAR CountryIe = IE_COUNTRY;\n\n\t\tos_alloc_mem(NULL, (UCHAR **)&TmpFrame, 256);\n\t\tif (TmpFrame != NULL)\n\t\t{\n\t\t\tNdisZeroMemory(TmpFrame, 256);\n\n\t\t\t/* prepare channel information */\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t\tBuildBeaconChList(pAd, TmpFrame, &TmpLen2);\n#else\n\t\t\t{\n\t\t\t\tUCHAR MaxTxPower = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel);\n\t\t\t\tMakeOutgoingFrame(TmpFrame+TmpLen2,     &TmpLen,\n\t\t\t\t\t\t\t\t\t1,                 \t&pAd->ChannelList[0].Channel,\n\t\t\t\t\t\t\t\t\t1,                 \t&pAd->ChannelListNum,\n\t\t\t\t\t\t\t\t\t1,                 \t&MaxTxPower,\n\t\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t\tTmpLen2 += TmpLen;\n\t\t\t}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\n\t\t\t/* need to do the padding bit check, and concatenate it */\n\t\t\tif ((TmpLen2%2) == 0)\n\t\t\t{\n\t\t\t\tUCHAR\tTmpLen3 = TmpLen2+4;\n\t\t\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,\n\t\t\t\t                  1,                 \t&CountryIe,\n\t\t\t\t                  1,                 \t&TmpLen3,\n\t\t\t\t                  3,                 \tpAd->CommonCfg.CountryCode,\n\t\t\t\t                  TmpLen2+1,\t\t\t\tTmpFrame,\n\t\t\t\t                  END_OF_ARGS);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR\tTmpLen3 = TmpLen2+3;\n\t\t\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,\n\t\t\t\t                  1,                 \t&CountryIe,\n\t\t\t\t                  1,                 \t&TmpLen3,\n\t\t\t\t                  3,                 \tpAd->CommonCfg.CountryCode,\n\t\t\t\t                  TmpLen2,\t\t\t\tTmpFrame,\n\t\t\t\t                  END_OF_ARGS);\n\t\t\t}\n\t\t\tFrameLen += TmpLen;\n\n\t\t\tos_free_mem(NULL, TmpFrame);\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t}\n\n\n#ifdef DOT11_N_SUPPORT\n\t/* AP Channel Report */\n\t{\n\t\tUCHAR APChannelReportIe = IE_AP_CHANNEL_REPORT;\n\t\tULONG\tTmpLen;\n\n\t\t/*\n\t\t\t802.11n D2.0 Annex J, USA regulatory \n\t\t\t\tclass 32, channel set 1~7\n\t\t\t\tclass 33, channel set 5-11\n\t\t*/\n\t\tUCHAR rclass32[]={32, 1, 2, 3, 4, 5, 6, 7};\n        UCHAR rclass33[]={33, 5, 6, 7, 8, 9, 10, 11};\n\t\tUCHAR rclasslen = 8; /*sizeof(rclass32); */\n\t\tif (PhyMode == (WMODE_B | WMODE_G | WMODE_GN))\n\t\t{\n\t\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,\n\t\t\t\t\t\t\t  1,                    &APChannelReportIe,\n\t\t\t\t\t\t\t  1,                    &rclasslen,\n\t\t\t\t\t\t\t  rclasslen,            rclass32,\n   \t\t\t\t\t\t\t  1,                    &APChannelReportIe,\n\t\t\t\t\t\t\t  1,                    &rclasslen,\n\t\t\t\t\t\t\t  rclasslen,            rclass33,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\t\t\n\t\t}\n\t}\n\n#endif /* DOT11_N_SUPPORT */\n\n\n\tRTMPWriteTxWI(pAd, &pAd->BeaconTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID, \n\t\tFrameLen, PID_MGMT, 0, 0,IFS_HTTXOP, FALSE, &BeaconTransmit);\n\n\t/*\n\t\tstep 6. move BEACON TXD and frame content to on-chip memory\n\t*/\n\tptr = (PUCHAR)&pAd->BeaconTxWI;\n#ifdef RT_BIG_ENDIAN\n    RTMPWIEndianChange(pAd, ptr, TYPE_TXWI);\n#endif\n\n\n\treg_base = pAd->BeaconOffset[pAd->ApCfg.MBSSID[apidx].BcnBufIdx];\n\tfor (i=0; i < TXWISize; i+=4)\n\t{\n\t\tlongValue = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);\n\t\tRTMP_CHIP_UPDATE_BEACON(pAd, reg_base + i, longValue, 4);\n\t\tptr += 4;\n\t}\n\n\t/* update BEACON frame content. start right after the TXWI field. */\n\tptr = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, ptr, DIR_WRITE, FALSE);\n#endif\n\n\treg_base = pAd->BeaconOffset[pAd->ApCfg.MBSSID[apidx].BcnBufIdx] + TXWISize;\n\tfor (i= 0; i< FrameLen; i+=4)\n\t{\n\t\tlongValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);\n\t\tRTMP_CHIP_UPDATE_BEACON(pAd, reg_base + i, longValue, 4);\n\t\tptr += 4;\n\t}\n\n\tpAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon = (UCHAR)FrameLen; \n\tpAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon = sizeof(HEADER_802_11) + TIMESTAMP_LEN + 2;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tUpdate the BEACON frame in the shared memory. Because TIM IE is variable\n\t\tlength. other IEs after TIM has to shift and total frame length may change\n\t\tfor each BEACON period.\n\tOutput:\n\t\tpAd->ApCfg.MBSSID[apidx].CapabilityInfo\n\t\tpAd->ApCfg.ErpIeContent\n\t==========================================================================\n*/\nVOID APUpdateBeaconFrame(RTMP_ADAPTER *pAd, INT apidx)\n{\n\tUCHAR *pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;\n\tUCHAR *ptr;\n\tULONG FrameLen = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon;\n\tULONG UpdatePos = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon;\n\tUCHAR RSNIe=IE_WPA, RSNIe2=IE_WPA2;\n\tUCHAR ID_1B, TimFirst, TimLast, *pTim;\n\tMULTISSID_STRUCT *pMbss;\n\tCOMMON_CONFIG *pComCfg;\n\tUCHAR PhyMode;\n\tBOOLEAN bHasWpsIE = FALSE;\n\tUINT  i;\n\tHTTRANSMIT_SETTING\tBeaconTransmit = {.word = 0};   /* MGMT frame PHY rate setting when operatin at Ht rate. */\n\n\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\tpComCfg = &pAd->CommonCfg;\n\tPhyMode = pMbss->PhyMode;\n\n\tif(!BeaconTransmitRequired(pAd, apidx, pMbss))\n\t\treturn;\n\n\t/*\n\t\tstep 1 - update BEACON's Capability\n\t*/\n\tptr = pBeaconFrame + pMbss->CapabilityInfoLocationInBeacon;\n\t*ptr = (UCHAR)(pMbss->CapabilityInfo & 0x00ff);\n\t*(ptr+1) = (UCHAR)((pMbss->CapabilityInfo & 0xff00) >> 8);\n\n\t/*\n\t\tstep 2 - update TIM IE\n\t\tTODO: enlarge TIM bitmap to support up to 64 STAs\n\t\tTODO: re-measure if RT2600 TBTT interrupt happens faster than BEACON sent out time\n\t*/\n\tptr = pBeaconFrame + pMbss->TimIELocationInBeacon;\n\t*ptr = IE_TIM;\n\t*(ptr + 2) = pAd->ApCfg.DtimCount;\n\t*(ptr + 3) = pAd->ApCfg.DtimPeriod;\n\n\t/* find the smallest AID (PS mode) */\n\tTimFirst = 0; /* record first TIM byte != 0x00 */\n\tTimLast = 0;  /* record last  TIM byte != 0x00 */\n\tpTim = pMbss->TimBitmaps;\n\n\tfor(ID_1B=0; ID_1B<WLAN_MAX_NUM_OF_TIM; ID_1B++)\n\t{\n\t\t/* get the TIM indicating PS packets for 8 stations */\n\t\tUCHAR tim_1B = pTim[ID_1B];\n\n\t\tif (ID_1B == 0)\n\t\t\ttim_1B &= 0xfe; /* skip bit0 bc/mc */\n\n\t\tif (tim_1B == 0)\n\t\t\tcontinue; /* find next 1B */\n\n\t\tif (TimFirst == 0)\n\t\t\tTimFirst = ID_1B;\n\n\t\tTimLast = ID_1B;\n\t}\n\n\t/* fill TIM content to beacon buffer */\n\tif (TimFirst & 0x01)\n\t\tTimFirst --; /* find the even offset byte */\n\n\t*(ptr + 1) = 3+(TimLast-TimFirst+1); /* TIM IE length */\n\t*(ptr + 4) = TimFirst;\n\n\tfor(i=TimFirst; i<=TimLast; i++)\n\t\t*(ptr + 5 + i - TimFirst) = pTim[i];\n\n\t/* bit0 means backlogged mcast/bcast */\n    if (pAd->ApCfg.DtimCount == 0)\n\t\t*(ptr + 4) |= (pMbss->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01); \n\n\t/* adjust BEACON length according to the new TIM */\n\tFrameLen += (2 + *(ptr+1)); \n\n#ifdef HOSTAPD_SUPPORT\n\tif ( pAd->ApCfg.MBSSID[apidx].HostapdWPS && (pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen))\n\t\tbHasWpsIE = TRUE;\n#endif\n\n#ifdef WSC_AP_SUPPORT\n    /* add Simple Config Information Element */\n    if (((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode >= 1) && (pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen)))\n    {\n    \tbHasWpsIE = TRUE;\n    }\n#endif /* WSC_AP_SUPPORT */\n\n\tif (bHasWpsIE)\n    {\n\t\tULONG WscTmpLen = 0;\n        \n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,                            &WscTmpLen,\n\t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen,    pAd->ApCfg.MBSSID[apidx].WscIEBeacon.Value,\n                              END_OF_ARGS);\n\t\tFrameLen += WscTmpLen;\t\t  \n    }\n\n#ifdef WSC_AP_SUPPORT\n    if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) &&\n#ifdef DOT1X_SUPPORT\n        (pAd->ApCfg.MBSSID[apidx].IEEE8021X == FALSE) && \n#endif /* DOT1X_SUPPORT */\t\t\n        (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled))\n    {\n        /*\n            Non-WPS Windows XP and Vista PCs are unable to determine if a WEP enalbed network is static key based \n            or 802.1X based. If the legacy station gets an EAP-Rquest/Identity from the AP, it assume the WEP\n            network is 802.1X enabled & will prompt the user for 802.1X credentials. If the legacy station doesn't\n            receive anything after sending an EAPOL-Start, it will assume the WEP network is static key based and\n            prompt user for the WEP key. <<from \"WPS and Static Key WEP Networks\">>\n            A WPS enabled AP should include this IE in the beacon when the AP is hosting a static WEP key network.  \n            The IE would be 7 bytes long with the Extended Capability field set to 0 (all bits zero)\n            http:msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp\n        */\n        ULONG TempLen = 0;\n        UCHAR PROVISION_SERVICE_IE[7] = {0xDD, 0x05, 0x00, 0x50, 0xF2, 0x05, 0x00};\n        MakeOutgoingFrame(pBeaconFrame+FrameLen,        &TempLen,\n\t\t\t\t\t\t  7,                            PROVISION_SERVICE_IE,\n                          END_OF_ARGS);\n        FrameLen += TempLen;\n    }\n#endif /* WSC_AP_SUPPORT */\n    \t\n\n\t/* Update ERP */\n    if ((pComCfg->ExtRateLen) && (PhyMode != WMODE_B))\n    {\n        /* fill ERP IE */\n        ptr = (UCHAR *)pBeaconFrame + FrameLen; /* pTxD->DataByteCnt; */\n        *ptr = IE_ERP;\n        *(ptr + 1) = 1;\n        *(ptr + 2) = pAd->ApCfg.ErpIeContent;\n\t\tFrameLen += 3;\n\t}\n\n#ifdef A_BAND_SUPPORT\n\t/* fill up Channel Switch Announcement Element */\n\tif ((pComCfg->Channel > 14)\n\t\t&& (pComCfg->bIEEE80211H == 1)\n\t\t&& (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE))\n\t{\n\t\tptr = pBeaconFrame + FrameLen;\n\t\t*ptr = IE_CHANNEL_SWITCH_ANNOUNCEMENT;\n\t\t*(ptr + 1) = 3;\n\t\t*(ptr + 2) = 1;\n\t\t*(ptr + 3) = pComCfg->Channel;\n\t\t*(ptr + 4) = (pAd->Dot11_H.CSPeriod - pAd->Dot11_H.CSCount - 1);\n\t\tptr      += 5;\n\t\tFrameLen += 5;\n\n#ifdef DOT11_N_SUPPORT\n\t\t/* Extended Channel Switch Announcement Element */\n\t\tif (pComCfg->bExtChannelSwitchAnnouncement)\n\t\t{\n\t\t\tHT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE\tHtExtChannelSwitchIe;\n\t\t\tbuild_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe);\n\t\t\tNdisMoveMemory(ptr, &HtExtChannelSwitchIe, sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE));\n\t\t\tptr += sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE);\n\t\t\tFrameLen += sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE);\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t}\n#endif /* A_BAND_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t/* step 5. Update HT. Since some fields might change in the same BSS. */\n\tif (WMODE_CAP_N(PhyMode) && (pMbss->DesiredHtPhyInfo.bHtEnable))\n\t{\n\t\tULONG TmpLen;\n\t\tUCHAR HtLen, HtLen1;\n\t\t/*UCHAR i; */\n\n#ifdef RT_BIG_ENDIAN\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\tADD_HT_INFO_IE\taddHTInfoTmp;\n/*\t\tUSHORT\tb2lTmp, b2lTmp2; // no use */\n#endif\n\n\t\t/* add HT Capability IE */\n\t\tHtLen = sizeof(pComCfg->HtCapability);\n\t\tHtLen1 = sizeof(pComCfg->AddHTInfo);\n#ifndef RT_BIG_ENDIAN\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t\t  1,                                &HtCapIe,\n\t\t\t\t\t\t\t\t  1,                                &HtLen,\n\t\t\t\t\t\t\t\t HtLen,          &pComCfg->HtCapability, \n\t\t\t\t\t\t\t\t  1,                                &AddHtInfoIe,\n\t\t\t\t\t\t\t\t  1,                                &HtLen1,\n\t\t\t\t\t\t\t\t HtLen1,          &pComCfg->AddHTInfo, \n\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\tNdisMoveMemory(&HtCapabilityTmp, &pComCfg->HtCapability, HtLen);\n\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t{\n\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t}\n#else\n\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\tNdisMoveMemory(&addHTInfoTmp, &pComCfg->AddHTInfo, HtLen1);\n\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));\n\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));\n\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t\t  1,                                &HtCapIe,\n\t\t\t\t\t\t\t\t  1,                                &HtLen,\n\t\t\t\t\t\t\t\t HtLen,                   &HtCapabilityTmp, \n\t\t\t\t\t\t\t\t  1,                                &AddHtInfoIe,\n\t\t\t\t\t\t\t\t  1,                                &HtLen1,\n\t\t\t\t\t\t\t\t HtLen1,                   &addHTInfoTmp, \n\t\t\t\t\t\t  END_OF_ARGS);\n#endif\n\t\tFrameLen += TmpLen;\n\n#ifdef DOT11N_DRAFT3\n\t \t/*\n\t\t\tP802.11n_D3.03, 7.3.2.60 Overlapping BSS Scan Parameters IE\n\t\t*/\n\t \tif ((pComCfg->Channel <= 14) &&\n\t\t\t(pComCfg->HtCapability.HtCapInfo.ChannelWidth == 1))\n\t \t{\n\t\t\tOVERLAP_BSS_SCAN_IE  OverlapScanParam;\n\t\t\tULONG\tTmpLen;\n\t\t\tUCHAR\tOverlapScanIE, ScanIELen;\n\n\t\t\tOverlapScanIE = IE_OVERLAPBSS_SCAN_PARM;\n\t\t\tScanIELen = 14;\n\t\t\tOverlapScanParam.ScanPassiveDwell = cpu2le16(pComCfg->Dot11OBssScanPassiveDwell);\n\t\t\tOverlapScanParam.ScanActiveDwell = cpu2le16(pComCfg->Dot11OBssScanActiveDwell);\n\t\t\tOverlapScanParam.TriggerScanInt = cpu2le16(pComCfg->Dot11BssWidthTriggerScanInt);\n\t\t\tOverlapScanParam.PassiveTalPerChannel = cpu2le16(pComCfg->Dot11OBssScanPassiveTotalPerChannel);\n\t\t\tOverlapScanParam.ActiveTalPerChannel = cpu2le16(pComCfg->Dot11OBssScanActiveTotalPerChannel);\n\t\t\tOverlapScanParam.DelayFactor = cpu2le16(pComCfg->Dot11BssWidthChanTranDelayFactor);\n\t\t\tOverlapScanParam.ScanActThre = cpu2le16(pComCfg->Dot11OBssScanActivityThre);\n\t\t\t\n\t\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t&OverlapScanIE,\n\t\t\t\t\t\t\t\t1,\t\t\t&ScanIELen,\n\t\t\t\t\t\t\t\tScanIELen,\t&OverlapScanParam,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t\n\t\t\tFrameLen += TmpLen;\n\t \t}\n#endif /* DOT11N_DRAFT3 */\n\n#ifdef DOT11_VHT_AC\n\t\tif (WMODE_CAP_AC(PhyMode) && (pComCfg->Channel > 14))\n\t\t{\n\t\t\tint _len = build_vht_ies(pAd, (UCHAR *)(pBeaconFrame+FrameLen), SUBTYPE_BEACON);\n\t\t\tFrameLen += _len;\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n#if defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT)\n\t/* 7.3.2.27 Extended Capabilities IE */\n\t{\n\t\tULONG TmpLen, infoPos;\n\t\tPUCHAR pInfo;\n\t\tUCHAR extInfoLen;\n\t\tBOOLEAN\tbNeedAppendExtIE = FALSE;\n\t\tEXT_CAP_INFO_ELEMENT\textCapInfo;\n\n\n\t\textInfoLen = sizeof(EXT_CAP_INFO_ELEMENT);\n\t\tNdisZeroMemory(&extCapInfo, extInfoLen);\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t/* P802.11n_D1.10, HT Information Exchange Support */\n\t\tif (WMODE_CAP_N(PhyMode) && (pComCfg->Channel <= 14) &&\n\t\t\t(pMbss->DesiredHtPhyInfo.bHtEnable) &&\n\t\t\t(pComCfg->bBssCoexEnable == TRUE)\n\t\t)\n\t\t{\n\t\t\textCapInfo.BssCoexistMgmtSupport = 1;\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\n\t\tpInfo = (PUCHAR)(&extCapInfo);\n\t\tfor (infoPos = 0; infoPos < extInfoLen; infoPos++)\n\t\t{\n\t\t\tif (pInfo[infoPos] != 0)\n\t\t\t{\n\t\t\t\tbNeedAppendExtIE = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (bNeedAppendExtIE == TRUE)\n\t\t{\n\t\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen,\n\t\t\t\t\t\t\t1, &ExtCapIe,\n\t\t\t\t\t\t\t1, &extInfoLen,\n\t\t\t\t\t\t\textInfoLen, &extCapInfo,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\t}\n#endif /* defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) */\n\n\n\tif ((pMbss->AuthMode == Ndis802_11AuthModeWPA) || \n\t\t(pMbss->AuthMode == Ndis802_11AuthModeWPAPSK))\n\t\tRSNIe = IE_WPA;\n\telse if ((pMbss->AuthMode == Ndis802_11AuthModeWPA2) || \n\t\t(pMbss->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tRSNIe = IE_WPA2;\n#ifdef WAPI_SUPPORT\n\telse if ((pMbss->AuthMode == Ndis802_11AuthModeWAICERT) || \n\t\t(pMbss->AuthMode == Ndis802_11AuthModeWAIPSK))\n\t\tRSNIe = IE_WAPI;\n#endif /* WAPI_SUPPORT */\n\n\t/* Append RSN_IE when  WPA OR WPAPSK, */\n\tif ((pMbss->AuthMode == Ndis802_11AuthModeWPA1WPA2) || \n\t\t(pMbss->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t{\n\t\tULONG TmpLen;\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                            &RSNIe,\n\t\t\t\t\t\t  1,                            &pMbss->RSNIE_Len[0],\n\t\t\t\t\t\t  pMbss->RSNIE_Len[0],      pMbss->RSN_IE[0],\n\t\t\t\t\t\t  1,                            &RSNIe2,\n\t\t\t\t\t\t  1,                            &pMbss->RSNIE_Len[1],\n\t\t\t\t\t\t  pMbss->RSNIE_Len[1],      pMbss->RSN_IE[1],\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\telse if (pMbss->AuthMode >= Ndis802_11AuthModeWPA)\n\t{\n\t\tULONG TmpLen;\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                            &RSNIe,\n\t\t\t\t\t\t  1,                            &pMbss->RSNIE_Len[0],\n\t\t\t\t\t\t  pMbss->RSNIE_Len[0],      pMbss->RSN_IE[0],\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\n\t/* add WMM IE here */\n\tif (pMbss->bWmmCapable)\n\t{\n\t\tULONG TmpLen;\n\t\tUCHAR i;\n\t\tUCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; \n\t\tUINT8 AIFSN[4];\n\n\t\tWmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f;\n\n#ifdef UAPSD_SUPPORT\n        UAPSD_MR_IE_FILL(WmeParmIe[8], &pMbss->UapsdInfo);\n#endif /* UAPSD_SUPPORT */\n\n\t\tNdisMoveMemory(AIFSN, pAd->ApCfg.BssEdcaParm.Aifsn, sizeof(AIFSN));\n\n\n\t\tfor (i=QID_AC_BE; i<=QID_AC_VO; i++)\n\t\t{\n\t\t\tWmeParmIe[10+ (i*4)] = (i << 5)                                         +     /* b5-6 is ACI */\n\t\t\t\t\t\t\t\t   ((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4)     +     /* b4 is ACM */\n\t\t\t\t\t\t\t\t   (AIFSN[i] & 0x0f);              /* b0-3 is AIFSN */\n\t\t\tWmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4)           +     /* b5-8 is CWMAX */\n\t\t\t\t\t\t\t\t   (pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f);              /* b0-3 is CWMIN */\n\t\t\tWmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff);        /* low byte of TXOP */\n\t\t\tWmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8);          /* high byte of TXOP */\n\t\t}\n\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,         &TmpLen,\n\t\t\t\t\t\t  26,                            WmeParmIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\n#ifdef AP_QLOAD_SUPPORT\n\tif (pAd->FlgQloadEnable != 0)\n\t{\n\t\tFrameLen += QBSS_LoadElementAppend(pAd, pBeaconFrame+FrameLen);\n\t}\n#endif /* AP_QLOAD_SUPPORT */\n\n#ifdef A_BAND_SUPPORT\n\t/* \n\t\tOnly 802.11a APs that comply with 802.11h are required to include a \n\t\tPower Constrint Element(IE=32) in beacons and probe response frames\n\t*/\n\tif (((pComCfg->Channel > 14) && pComCfg->bIEEE80211H == TRUE)\n\t\t)\n\t{\n\t\tULONG TmpLen;\n\t\tUINT8 PwrConstraintIE = IE_POWER_CONSTRAINT;\n\t\tUINT8 PwrConstraintLen = 1;\n\t\tUINT8 PwrConstraint = pComCfg->PwrConstraint;\n\n\t\t/* prepare power constraint IE */\n\t\tMakeOutgoingFrame(pBeaconFrame+FrameLen,\t&TmpLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&PwrConstraintIE,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&PwrConstraintLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&PwrConstraint,\n\t\t\t\t\t\tEND_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n#endif /* A_BAND_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\n\tif (WMODE_CAP_N(PhyMode) && \n\t\t(pMbss->DesiredHtPhyInfo.bHtEnable))\n\t{\n\t\tULONG TmpLen;\n\t\tUCHAR HtLen, HtLen1;\n\t\t/*UCHAR i; */\n#ifdef RT_BIG_ENDIAN\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\tADD_HT_INFO_IE\taddHTInfoTmp;\n/*\t\tUSHORT\tb2lTmp, b2lTmp2;*/ /* no use */\n#endif\n\t\t/* add HT Capability IE */\n\t\tHtLen = sizeof(pComCfg->HtCapability);\n\t\tHtLen1 = sizeof(pComCfg->AddHTInfo);\n\n\t\tif (pAd->bBroadComHT == TRUE)\n\t\t{\n\t\t\tUCHAR epigram_ie_len;\n\t\t\tUCHAR BROADCOM_HTC[4] = {0x0, 0x90, 0x4c, 0x33};\n\t\t\tUCHAR BROADCOM_AHTINFO[4] = {0x0, 0x90, 0x4c, 0x34};\n\n\n\t\t\tepigram_ie_len = HtLen + 4;\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen,      &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t  4,                                &BROADCOM_HTC[0],\n\t\t\t\t\t\t  HtLen,          \t\t\t\t\t&pComCfg->HtCapability, \n\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pComCfg->HtCapability, HtLen);\n\t\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t{\n\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t}\n#else\n\t\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen,       &TmpLen,\n\t\t\t\t\t\t1,                               &WpaIe,\n\t\t\t\t\t\t1,                               &epigram_ie_len,\n\t\t\t\t\t\t4,                               &BROADCOM_HTC[0], \n\t\t\t\t\t\tHtLen,                           &HtCapabilityTmp,\n\t\t\t\t\t\tEND_OF_ARGS);\n#endif\n\n\t\t\tFrameLen += TmpLen;\n\n\t\t\tepigram_ie_len = HtLen1 + 4;\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t  4,                                &BROADCOM_AHTINFO[0],\n\t\t\t\t\t\t  HtLen1, \t\t\t\t\t\t\t&pComCfg->AddHTInfo, \n\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\tNdisMoveMemory(&addHTInfoTmp, &pComCfg->AddHTInfo, HtLen1);\n\t\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));\n\t\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));\n\n\t\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t1,                             &WpaIe,\n\t\t\t\t\t\t\t1,                             &epigram_ie_len,\n\t\t\t\t\t\t\t4,                             &BROADCOM_AHTINFO[0],\n\t\t\t\t\t\t\tHtLen1,                        &addHTInfoTmp,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n#endif\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n   \t/* add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back */\n{\n\tULONG TmpLen;\n\tUCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00};\n\n\tif (pComCfg->bAggregationCapable)\n\t\tRalinkSpecificIe[5] |= 0x1;\n\tif (pComCfg->bPiggyBackCapable)\n\t\tRalinkSpecificIe[5] |= 0x2;\n#ifdef DOT11_N_SUPPORT\n\tif (pComCfg->bRdg)\n\t\tRalinkSpecificIe[5] |= 0x4;\n#endif /* DOT11_N_SUPPORT */\n\tMakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen,\n\t\t\t\t\t\t9,                   RalinkSpecificIe,\n\t\t\t\t\t\tEND_OF_ARGS);\n\tFrameLen += TmpLen;\n\n}\n\t\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n\t{\n                PUCHAR  pP2pNoAIE = NULL;\n                ULONG   P2pTmpLen;\n                UCHAR   P2pCapId = SUBID_P2P_CAP, P2pDevId = SUBID_P2P_DEVICE_ID;\n                USHORT  P2pCapIdLen = 2, P2pDevIdLen = 6;\n                UCHAR   P2pIEFixed[6] = {0xdd, 0x12, 0x50, 0x6f, 0x9a, 0x9};\n\n                MakeOutgoingFrame(pBeaconFrame+FrameLen,        &P2pTmpLen,\n                                                  6,                                            &P2pIEFixed[0],\n                                                  1,                                            &P2pCapId,\n                                                  2,                                            &P2pCapIdLen,\n                                                  2,                                            &pAd->P2pCfg.P2pCapability,\n                                                  END_OF_ARGS);\n                FrameLen += P2pTmpLen;\n\n                MakeOutgoingFrame(pBeaconFrame+FrameLen,        &P2pTmpLen,\n                                                  1,                                            &P2pDevId,\n                                                  2,                                            &P2pDevIdLen,\n                                                  6,                                            &pAd->P2pCfg.CurrentAddress,\n                                                          END_OF_ARGS);\n                FrameLen += P2pTmpLen;\n\n                /* NoA */\n                pP2pNoAIE = pBeaconFrame + FrameLen;\n                P2pTmpLen = P2pUpdateNoABeacon(pAd, apidx, pP2pNoAIE);\n\t\tFrameLen += P2pTmpLen;\n\t\tBeaconTransmit.field.MODE = MODE_OFDM;\n\t\tBeaconTransmit.field.MCS = MCS_RATE_6;\n\n\t}\n\n#ifdef WFD_SUPPORT\n\t/* Call InsertWfdSubelmtTlv directly for beacon update (timing issue) */\n\tif (pAd->StaCfg.WfdCfg.bWfdEnable)\n\t{\n\t\tPUCHAR\tpData;\n\t\tULONG TmpLen = 0, Len = 0;\n\t\tUCHAR WfdIEFixed[6] = {0xdd, 0x0c, 0x50, 0x6f, 0x9a, 0x0a};  /* Length will be modified later */\n\n\t\tpData = pBeaconFrame + FrameLen;\n\t\tRTMPMoveMemory(pData, &WfdIEFixed[0], 6);\n\t\tLen += 6;\n\t\tpData += 6;\n\t\t\n\t\tTmpLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_DEVICE_INFO, NULL, pData, ACTION_WIFI_DIRECT);\n\t\tLen += TmpLen;\n\t\tpData += TmpLen;\n\n\t\tTmpLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ASSOCIATED_BSSID, NULL, pData, ACTION_WIFI_DIRECT);\n\t\tLen += TmpLen;\n\t\tpData += TmpLen;\n\n\t\tTmpLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_COUPLED_SINK_INFO, NULL, pData, ACTION_WIFI_DIRECT);\n\t\tLen += TmpLen;\n\t\tpData += TmpLen;\n\n\t\t*(pBeaconFrame + FrameLen + 1) = (Len-2);\n\t\tFrameLen += Len;\n\t}\n#endif /* WFD_SUPPORT */\n\t\n\n#endif /* P2P_SUPPORT */\n\n\t/* step 6. Since FrameLen may change, update TXWI. */\n#ifdef A_BAND_SUPPORT\n\tif (pAd->CommonCfg.Channel > 14) {\n\t\tBeaconTransmit.field.MODE = MODE_OFDM;\n\t\tBeaconTransmit.field.MCS = MCS_RATE_6;\n\t}\n#endif /* A_BAND_SUPPORT */\n\tRTMPWriteTxWI(pAd, &pAd->BeaconTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, \n\t\tFrameLen, PID_MGMT, QID_MGMT, 0, IFS_HTTXOP, FALSE, &BeaconTransmit);\n\n\t/* step 7. move BEACON TXWI and frame content to on-chip memory */\n\tRT28xx_UpdateBeaconToAsic(pAd, apidx, FrameLen, UpdatePos);\n\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Pre-build All BEACON frame in the shared memory\n    ==========================================================================\n*/\nstatic UCHAR GetBcnNum(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint i;\n\tint NumBcn;\n\n\tNumBcn = 0;\n\tfor (i=0; i<pAd->ApCfg.BssidNum; i++)\n\t{\n\t\tif (pAd->ApCfg.MBSSID[i].bBcnSntReq)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[i].BcnBufIdx = NumBcn;\n\t\t\tNumBcn ++;\n\t\t}\n\t}\n\n\n\treturn NumBcn;\n}\n\nVOID APMakeAllBssBeacon(\n    IN PRTMP_ADAPTER pAd)\n{\n\tINT\t\ti, j;\n\tUINT32\tregValue;\n\tUCHAR\tNumOfMacs;\n\tUCHAR\tNumOfBcns;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t/* before MakeBssBeacon, clear all beacon TxD's valid bit */\n    /* Note: can not use MAX_MBSSID_NUM here, or\n\t\t\t 1. when MBSS_SUPPORT is enabled;\n             2. MAX_MBSSID_NUM will be 8;\n\t\t\t 3. if HW_BEACON_OFFSET is 0x0200,\n             we will overwrite other shared memory SRAM of chip */\n\t/* use pAd->ApCfg.BssidNum to avoid the case is best */\n\n\t/* choose the Beacon number */\n\tNumOfBcns = GetBcnNum(pAd);\n\n\tfor (i=0; i<HW_BEACON_MAX_COUNT(pAd); i++)\n\t{\n\t\tfor (j=0; j < TXWISize; j+=4)\n\t    {\n\t\t\tRTMP_CHIP_UPDATE_BEACON(pAd, pAd->BeaconOffset[i] + j, 0, 4);\n\t    }\n\t}\n\n#ifdef RTMP_MAC_USB\n\tRTUSBBssBeaconStop(pAd);\n#endif /* RTMP_MAC_USB */\n\n\tfor(i=0; i<pAd->ApCfg.BssidNum; i++)\n\t{\n\t\tAPMakeBssBeacon(pAd, i);\n\t}\n\t\n\tRTMP_IO_READ32(pAd, MAC_BSSID_DW1, &regValue);\n\tregValue &= 0x0000FFFF;\n\n\t\n\t/* \n\t\tNote:\n\t\t\t1.The MAC address of Mesh and AP-Client link are different from Main BSSID.\n\t\t\t2.If the Mesh link is included, its MAC address shall follow the last MBSSID's MAC by increasing 1.\n\t\t\t3.If the AP-Client link is included, its MAC address shall follow the Mesh interface MAC by increasing 1.\n\t*/\n\tNumOfMacs = pAd->ApCfg.BssidNum + MAX_MESH_NUM + MAX_APCLI_NUM;\n\n#ifdef P2P_SUPPORT\n#ifdef P2P_ODD_MAC_ADJUST\n\tif (NumOfMacs != 2)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, \n\t\t\t\t\t(\"The P2P mode is enabled, the NumOfMacs MUST be 2, NumOfMacs=%d\\n\",\n\t\t\t\t\tNumOfMacs));\t\t\n\t}\n#endif /* P2P_ODD_MAC_ADJUST */\n#endif /* P2P_SUPPORT */\n\n\t/* set Multiple BSSID mode */\n\tif (NumOfMacs <= 1)\n\t{\n\t\tpAd->ApCfg.MacMask = ~(1-1);\n\t\t/*regValue |= 0x0; */\n\t}\t\n\telse if (NumOfMacs <= 2)\n\t{\n\t\tif ((pAd->CurrentAddress[5] % 2 != 0)\n#ifdef P2P_SUPPORT\n#ifdef P2P_ODD_MAC_ADJUST\n\t\t\t&& FALSE\n#endif /* P2P_ODD_MAC_ADJUST */\n#endif /* P2P_SUPPORT */\n\t\t)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The 2-BSSID mode is enabled, the BSSID byte5 MUST be the multiple of 2\\n\"));\n\t\t\n\t\tregValue |= (1<<16);\n\t\tpAd->ApCfg.MacMask = ~(2-1);\n\t}\n\telse if (NumOfMacs <= 4)\n\t{\n\t\tif (pAd->CurrentAddress[5] % 4 != 0)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The 4-BSSID mode is enabled, the BSSID byte5 MUST be the multiple of 4\\n\"));\n\n\t\tregValue |= (2<<16);\n\t\tpAd->ApCfg.MacMask = ~(4-1);\n\t}\n\telse if (NumOfMacs <= 8)\n\t{\n\t\tif (pAd->CurrentAddress[5] % 8 != 0)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The 8-BSSID mode is enabled, the BSSID byte5 MUST be the multiple of 8\\n\"));\n\t\n\t\tregValue |= (3<<16);\n\t\tpAd->ApCfg.MacMask = ~(8-1);\n\t}\n\n\t/* set Multiple BSSID Beacon number */\n\tif (NumOfBcns > 1)\n\t{\n\t\tregValue |= (((NumOfBcns - 1) & 0x7)  << 18);\t\n\t}\n\t\n\t/* \tset as 0/1 bit-21 of MAC_BSSID_DW1(offset: 0x1014) \n\t\tto disable/enable the new MAC address assignment.  */\n\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\t\tregValue |= (1 << 21);\n\n\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, regValue);\n\n#ifdef HDR_TRANS_SUPPORT\n\t/*\n\t\tpoint WCID MAC table to 0x1800\n\t\tThis is for debug.\n\t\tBut HDR_TRANS doesn't work if you remove it.\n\t\tCheck after IC formal release.\n\t*/\n\tregValue |= 0x18000000;\n\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW1, regValue);\n#endif /* HDR_TRANS_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\tRTUSBBssBeaconStart(pAd);\n#endif /* RTMP_MAC_USB */\n\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Pre-build All BEACON frame in the shared memory\n    ==========================================================================\n*/\nVOID APUpdateAllBeaconFrame(\n    IN PRTMP_ADAPTER pAd)\n{\n\tINT\t\ti;\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tBOOLEAN FlgQloadIsAlarmIssued = FALSE;\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\tif (pAd->ApCfg.DtimCount == 0)\n\t\tpAd->ApCfg.DtimCount = pAd->ApCfg.DtimPeriod - 1;\n\telse\n\t\tpAd->ApCfg.DtimCount -= 1;\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t/* QLOAD ALARM */\n#ifdef AP_QLOAD_SUPPORT\n\tFlgQloadIsAlarmIssued = QBSS_LoadIsAlarmIssued(pAd);\n#endif /* AP_QLOAD_SUPPORT */\n\n\tif ((pAd->ApCfg.DtimCount == 0) && \n\t\t(((pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_SYNC) && \n\t\t  (pAd->CommonCfg.bForty_Mhz_Intolerant == FALSE)) ||\n\t\t(FlgQloadIsAlarmIssued == TRUE)))\n\t{\n\t\tUCHAR\tprevBW, prevExtChOffset;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DTIM Period reached, BSS20WidthReq=%d, Intolerant40=%d!\\n\", \n\t\t\t\tpAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq, pAd->CommonCfg.LastBSSCoexist2040.field.Intolerant40));\n\t\tpAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_INFO_SYNC);\n\t\t\n\t\tprevBW = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth; \n\t\tprevExtChOffset = pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset;\n\t\t\n\t\tif (pAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq ||\n\t\t\tpAd->CommonCfg.LastBSSCoexist2040.field.Intolerant40 ||\n\t\t\t(pAd->MacTab.fAnyStaFortyIntolerant == TRUE) ||\n\t\t\t(FlgQloadIsAlarmIssued == TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tNow RecomWidth=%d, ExtChanOffset=%d, prevBW=%d, prevExtOffset=%d\\n\", \n\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth,\n\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset,\n\t\t\t\tprevBW, prevExtChOffset));\n\t\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_NOTIFY;\n\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\tfor(i=0; i<pAd->ApCfg.BssidNum; i++)\n\t{\t\t\n\t\tAPUpdateBeaconFrame(pAd, i);\n\t}\n}\n\n\n"
  },
  {
    "path": "src/ap/ap_data.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tap_data.c\n\n\tAbstract:\n\tData path subroutines\n\n\tRevision History:\n\tWho \t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tPaul Lin\t08-01-2002\t\tcreated\n\tPaul Lin\t07-01-2003\t\tadd encryption/decryption data flow\n\tJohn Chang\t08-05-2003\t\tmodify 802.11 header for AP purpose\n\tJohn Chang\t12-20-2004\t\tmodify for 2561/2661. merge into STA driver\n\tJan Lee\t1-20-2006\t\t    modify for 2860.  \n*/\n#include \"rt_config.h\"\n\n#define IS_MULTICAST_MAC_ADDR(Addr)\t\t\t((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff))\n#define IS_BROADCAST_MAC_ADDR(Addr)\t\t\t((((Addr[0]) & 0xff) == 0xff))\n\n\nstatic VOID APFindCipherAlgorithm(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk);\n\n#ifdef DOT11_N_SUPPORT\nVOID RTMP_BASetup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pMacEntry,\n\tIN UINT8 UserPriority)\n{\n\tif (pMacEntry && (pMacEntry->NoBADataCountDown == 0) && IS_HT_STA(pMacEntry))\n\t{\n\t\t/* Don't care the status of the portSecured status. */\n\t\tif (((pMacEntry->TXBAbitmap & (1<<UserPriority)) == 0) /*&& (pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED)*/\n\t\t\t /*\n\t\t\t\tFor IOT compatibility, BA session can be bulit when following conditions matched\n\t\t\t\t\t1. It is Ralink chip or\n\t\t\t\t\t2. It is OPEN or AES mode,\n\t\t\t*/\n\t\t\t && ((IS_ENTRY_CLIENT(pMacEntry) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RALINK_CHIPSET)) || \n\t\t\t\t IS_ENTRY_MESH(pMacEntry) || IS_ENTRY_WDS(pMacEntry) ||\n\t\t\t \t (IS_ENTRY_APCLI(pMacEntry) && (pAd->MlmeAux.APRalinkIe != 0x0) && (pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED)) || \n\t\t\t \t (pMacEntry->WepStatus == Ndis802_11WEPDisabled ||\n\t\t\t\t\tpMacEntry->WepStatus == Ndis802_11Encryption3Enabled\n#ifdef WAPI_SUPPORT\n\t\t\t\t\t|| pMacEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled\n#endif /* WAPI_SUPPORT */\n\t\t\t\t\t))\n\t\t\t)\n\t\t{\n\t\t\tBAOriSessionSetUp(pAd, pMacEntry, UserPriority, 0, 10, FALSE);\n\t\t}\n\t}\n}\n#endif /* DOT11_N_SUPPORT */\n\nstatic inline BOOLEAN ApAllowToSendPacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET pPacket,\n\tOUT UCHAR\t\t*pWcid)\n{\n\tPACKET_INFO \tPacketInfo;\n\tPUCHAR\t\t\tpSrcBufVA;\n\tUINT\t\t\tSrcBufLen;\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\tSST \t\t\tSst;\n\tUSHORT\t\t\tAid;\n\tUCHAR\t\t\tPsMode, Rate;\n\tBOOLEAN\t\t\tallowed;\n\t\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n#ifdef CLIENT_WDS\n\t{\n\t\tPUCHAR pEntryAddr;\n\t\tpEntry = APSsPsInquiry(pAd, pSrcBufVA, &Sst, &Aid, &PsMode, &Rate);\n\t\tif ((pEntry == NULL)\n\t\t\t&& (pEntryAddr = CliWds_ProxyLookup(pAd, pSrcBufVA)) != NULL)\n\t\t{\n\t\t\tpEntry = APSsPsInquiry(pAd, pEntryAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t}\n\t}\n#else\n\tpEntry = APSsPsInquiry(pAd, pSrcBufVA, &Sst, &Aid, &PsMode, &Rate);\n#endif /* CLIENT_WDS */\n\n\n\tif ((pEntry && (Sst == SST_ASSOC)) || (*pSrcBufVA & 0x01))\n\t{\n\t\t/*\n\t\t\tRecord that orignal packet source is from NDIS layer,so that\n\t\t\tlater on driver knows how to release this NDIS PACKET\n\t\t*/\n\t\t*pWcid = (UCHAR)Aid; /*RTMP_SET_PACKET_WCID(pPacket, (UCHAR)Aid); */\n\t\tallowed = TRUE;\n\t}\n\telse\n\t{\n\t\tallowed = FALSE;\n\t}\n\n\treturn allowed;\n\t\n}\n\n\n\n/*\n========================================================================\nRoutine Description:\n    Early checking and OS-depened parsing for Tx packet to AP device.\n\nArguments:\n    NDIS_HANDLE \tMiniportAdapterContext\tPointer refer to the device handle, i.e., the pAd.\n\tPPNDIS_PACKET\tppPacketArray\t\t\tThe packet array need to do transmission.\n\tUINT\t\t\tNumberOfPackets\t\t\tNumber of packet in packet array.\n\t\nReturn Value:\n\tNONE\t\t\t\t\t\n\nNote:\n\tThis function do early checking and classification for send-out packet.\n\tYou only can put OS-depened & AP related code in here.\n========================================================================\n*/\nVOID APSendPackets(NDIS_HANDLE dev_hnd, PPNDIS_PACKET pkt_list, UINT pkt_cnt)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *) dev_hnd;\n\tPNDIS_PACKET pPacket;\n\tBOOLEAN allowToSend;\n\tUCHAR wcid = MCAST_WCID;\n\tUINT Index;\n\n\n\t\n\tfor (Index = 0; Index < pkt_cnt; Index++)\n\t{\n\t\tpPacket = pkt_list[Index];\n\n   \t\tif (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RADIO_OFF))\n\t\t)\n\t\t{\n\t\t\t/* Drop send request since hardware is in reset state */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* The following code do comparison must base on the following sequence: \n\t\t\t\tMIN_NET_DEVICE_FOR_APCLI> MIN_NET_DEVICE_FOR_WDS > Normal\n\t\t*/\n#ifdef P2P_SUPPORT\n\t\tif (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tallowToSend = ApAllowToSendPacket(pAd, pPacket, &wcid);\n\t\telse\n#endif /* P2P_SUPPORT */\n#ifdef APCLI_SUPPORT\n\t\tif (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\tallowToSend = ApCliAllowToSendPacket(pAd, pPacket, &wcid);\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\tallowToSend = ApAllowToSendPacket(pAd, pPacket, &wcid);\n\n\t\tif (allowToSend)\n\t\t{\n\t\t\t/* For packet send from OS, we need to set the wcid here, it will used directly in APSendPacket. */\n\t\t\tRTMP_SET_PACKET_WCID(pPacket, wcid);\n\t\t\tRTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);\n\t\t\tNDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_PENDING);\n\t\t\tpAd->RalinkCounters.PendingNdisPacketCount++;\n\t\t\t\n\t\t\tAPSendPacket(pAd, pPacket);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t}\n\t}\n\n\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n}\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tThis routine is used to do packet parsing and classification for Tx packet \n\t\tto AP device, and it will en-queue packets to our TxSwQueue depends on AC \n\t\tclass.\n\t\n\tArguments:\n\t\tpAd    Pointer to our adapter\n\t\tpPacket \tPointer to send packet\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS\t\t\tIf succes to queue the packet into TxSwQueue.\n\t\tNDIS_STATUS_FAILURE\t\t\tIf failed to do en-queue.\n\n\tpre: Before calling this routine, caller should have filled the following fields\n\n\t\tpPacket->MiniportReserved[6] - contains packet source\n\t\tpPacket->MiniportReserved[5] - contains RA's WDS index (if RA on WDS link) or AID \n\t\t\t\t\t\t\t\t\t   (if RA directly associated to this AP)\n\tpost:This routine should decide the remaining pPacket->MiniportReserved[] fields \n\t\tbefore calling APHardTransmit(), such as:\n\n\t\tpPacket->MiniportReserved[4] - Fragment # and User PRiority\n\t\tpPacket->MiniportReserved[7] - RTS/CTS-to-self protection method and TX rate\n\n\tNote:\n\t\tYou only can put OS-indepened & AP related code in here.\n\n\n========================================================================\n*/\nNDIS_STATUS APSendPacket(RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket)\n{\n\tPACKET_INFO PacketInfo;\n\tUCHAR *pSrcBufVA;\n\tUINT SrcBufLen;\n\tUINT AllowFragSize;\n\tUCHAR NumberOfFrag;\n\tUCHAR RTSRequired;\n\tUCHAR QueIdx, UserPriority, apidx = MAIN_MBSSID;\n\tSST Sst = SST_ASSOC;\n\tUCHAR PsMode = PWR_ACTIVE, Rate;\n\tUSHORT Wcid;\n\tMAC_TABLE_ENTRY *pMacEntry = NULL;\n\tunsigned long\tIrqFlags;\n#ifdef IGMP_SNOOP_SUPPORT\n\tINT InIgmpGroup = IGMP_NONE;\n\tMULTICAST_FILTER_TABLE_ENTRY *pGroupEntry = NULL;\n#endif /* IGMP_SNOOP_SUPPORT */\n\tMULTISSID_STRUCT *pMbss = NULL;\n\n\n\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n\n\tif (pSrcBufVA == NULL)\n\t{\n\t\t/*\n\t\t\tResourece is low, system did not allocate virtual address\n\t\t\treturn NDIS_STATUS_FAILURE directly to upper layer\n\t\t*/\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tif (SrcBufLen <= 14)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"APSendPacket --> Ndis Packet buffer error !!!\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn (NDIS_STATUS_FAILURE);\n\t}\n\n\tWcid = RTMP_GET_PACKET_WCID(pPacket);\n\tpMacEntry = &pAd->MacTab.Content[Wcid];\n\n\t/*\n\t\tCheck the Ethernet Frame type of this packet, and set the RTMP_SET_PACKET_SPECIFIC flags\n\t\tHere we set the PACKET_SPECIFIC flags(LLC, VLAN, DHCP/ARP, EAPOL).\n\t*/\n\tUserPriority = 0;\n\tQueIdx = QID_AC_BE;\n\tif (RTMPCheckEtherType(pAd, pPacket, pMacEntry, OPMODE_AP, &UserPriority, &QueIdx) == FALSE)\n\t{\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n#ifdef P2P_SUPPORT\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif ((pAd->Multi_Channel_Enable == TRUE) && (P2P_CLI_ON(pAd)))\n\t\t\tQueIdx = QID_HCCA;\n#endif /* CONFIG_MULTI_CHANNEL */\n#endif  /* P2P_SUPPORT */\n\n#ifdef APCLI_SUPPORT\n\tif(IS_ENTRY_APCLI(pMacEntry))\n\t{\n\t\tRate = pMacEntry->CurrTxRate;\n\t    if ((pMacEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t && (pMacEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) \t\t\t \t \t\t\t \t \n        \t && (RTMP_GET_PACKET_EAPOL(pPacket)== FALSE))\n\t\t{\n            RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); \n            return (NDIS_STATUS_FAILURE);\n        }\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n\tif (IS_ENTRY_CLIENT(pMacEntry) || (Wcid == MCAST_WCID))\n\t{\n\t\t/*USHORT Aid; */\n\t\tPsMode = pMacEntry->PsMode;\n\t\tRate = pMacEntry->CurrTxRate;\n\t\tSst = pMacEntry->Sst;\n\n\t\tif (Wcid == MCAST_WCID)\n\t\t{\n\t\t\t/* if (pAd->MacTab.Size == 0) */\n\t\t\tif (pAd->ApCfg.EntryClientCount == 0)\n\t\t\t{\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\treturn NDIS_STATUS_FAILURE;\t\t\t\n\t\t\t}\t\n\t\t\n\t\t\tapidx = RTMP_GET_PACKET_NET_DEVICE_MBSSID(pPacket);\n#ifdef P2P_SUPPORT\n\t\t\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t\tapidx = apidx - MIN_NET_DEVICE_FOR_P2P_GO;\n#endif  /* P2P_SUPPORT */\n\t\t\tMBSS_MR_APIDX_SANITY_CHECK(pAd, apidx);\n\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tapidx = pMacEntry->apidx;\n\t\t\tpMbss = pMacEntry->pMbss;\n\t\t}\n\n\t\t/* AP does not send packets before port secured. */\n\t\tif (pMbss != NULL)\n\t\t{\n\t\t\tif (((pMbss->AuthMode >= Ndis802_11AuthModeWPA)\n#ifdef DOT1X_SUPPORT\n\t\t\t\t|| (pMbss->IEEE8021X == TRUE)\n#endif /* DOT1X_SUPPORT */\n\t\t\t\t) && \n\t\t\t\t(RTMP_GET_PACKET_EAPOL(pPacket) == FALSE)\n#ifdef WAPI_SUPPORT\n\t\t\t\t&& (RTMP_GET_PACKET_WAI(pPacket) == FALSE)\n#endif /* WAPI_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\t/* Process for multicast or broadcast frame */\n\t\t\t\tif ((Wcid == MCAST_WCID) && (pMbss->PortSecured == WPA_802_1X_PORT_NOT_SECURED))\n\t\t\t\t{\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;\t\t\t\n\t\t\t\t}\n\n\t\t\t\t/* Process for unicast frame */\n\t\t\t\tif ((Wcid != MCAST_WCID) && pMacEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED)\n\t\t\t\t{\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"I/F(ra%d) APSendPacket --> Drop unknow packet !!!\\n\", apidx));\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tif (pMbss == NULL)\n\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n#ifdef IGMP_SNOOP_SUPPORT\n\tif (pAd->ApCfg.IgmpSnoopEnable)\n\t{\n\t\tUCHAR FromWhichBSSID, checkIgmpPkt = TRUE;\n\n\t\tif (IS_ENTRY_WDS(pMacEntry))\t\t\n\t\t\tFromWhichBSSID = pMacEntry->MatchWDSTabIdx + MIN_NET_DEVICE_FOR_WDS;\t\t\n\t\telse if ((Wcid == MCAST_WCID) || IS_ENTRY_CLIENT(pMacEntry))\t\t\n\t\t\tFromWhichBSSID = apidx;\t\t\n\t\telse\t\t\n\t\t\tcheckIgmpPkt = FALSE;\t\t\n\t\t  \n\t\tif (checkIgmpPkt)\n\t\t{\n\t\t\tif (IgmpPktInfoQuery(pAd, pSrcBufVA, pPacket, FromWhichBSSID,\n\t\t\t\t\t\t&InIgmpGroup, &pGroupEntry) != NDIS_STATUS_SUCCESS)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t} \n\t}\n#endif  /* IGMP_SNOOP_SUPPORT */\n\n\t/* \n\t\tSTEP 1. Decide number of fragments required to deliver this MSDU.\n\t\t\tThe estimation here is not very accurate because difficult to\n\t\t\ttake encryption overhead into consideration here. The result\n\t\t\t\"NumberOfFrag\" is then just used to pre-check if enough free\n\t\t\tTXD are available to hold this MSDU.\n\t*/\n\tif ((*pSrcBufVA & 0x01)\t/* fragmentation not allowed on multicast & broadcast */\n#ifdef IGMP_SNOOP_SUPPORT\n\t\t/* multicast packets in IgmpSn table should never send to Power-Saving queue. */\n\t\t&& (!InIgmpGroup)\n#endif /* IGMP_SNOOP_SUPPORT */\n\t\t)\n\t\tNumberOfFrag = 1;\n\telse if (pMacEntry && IS_ENTRY_CLIENT(pMacEntry)\n\t\t\t&& CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE))\n\t{\n\t\tNumberOfFrag = 1;\t/* Aggregation overwhelms fragmentation */\n\t}\n\telse\n\t{\n\t\t/*\n\t\t\tThe calculated \"NumberOfFrag\" is a rough estimation because of various\n\t\t\tencryption/encapsulation overhead not taken into consideration. This number is just\n\t\t\tused to make sure enough free TXD are available before fragmentation takes place.\n\t\t\tIn case the actual required number of fragments of an NDIS packet\n\t\t\texcceeds \"NumberOfFrag\"caculated here and not enough free TXD available, the\n\t\t\tlast fragment (i.e. last MPDU) will be dropped in RTMPHardTransmit() due to out of\n\t\t\tresource, and the NDIS packet will be indicated NDIS_STATUS_FAILURE. This should\n\t\t\trarely happen and the penalty is just like a TX RETRY fail. Affordable.\n\t\t*/\n\t\tUINT32 Size;\n\n\t\tAllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;\n\t\tSize = PacketInfo.TotalPacketLength - LENGTH_802_3 + LENGTH_802_1_H;\n\t\tif (Size >= AllowFragSize)\n\t\t\tNumberOfFrag = (Size / AllowFragSize) + 1;\n\t\telse\n\t\t\tNumberOfFrag = 1;\n\t}\n\n\t/* Save fragment number to Ndis packet reserved field */\n\tRTMP_SET_PACKET_FRAGMENTS(pPacket, NumberOfFrag);  \n\n\t/*\n\t\tSTEP 2. Check the requirement of RTS; decide packet TX rate\n\t\tIf multiple fragment required, RTS is required only for the first fragment\n\t\tif the fragment size large than RTS threshold\n\t*/\n\n\tif (NumberOfFrag > 1)\n\t\tRTSRequired = (pAd->CommonCfg.FragmentThreshold > pAd->CommonCfg.RtsThreshold) ? 1 : 0;\n\telse\n\t\tRTSRequired = (PacketInfo.TotalPacketLength > pAd->CommonCfg.RtsThreshold) ? 1 : 0;\n\n\t/* RTS/CTS may also be required in order to protect OFDM frame */\n\tif ((Rate >= RATE_FIRST_OFDM_RATE) && \n\t\t(Rate <= RATE_LAST_OFDM_RATE) && \n\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t\tRTSRequired = 1;\n\n\t/* Save RTS requirement to Ndis packet reserved field */\n\tRTMP_SET_PACKET_RTS(pPacket, RTSRequired);\n\tRTMP_SET_PACKET_TXRATE(pPacket, Rate);\n\t\n\n\n\t/* detect AC Category of tx packets to tune AC0(BE) TX_OP (MAC reg 0x1300) */\n\tdetect_wmm_traffic(pAd, UserPriority, 1);\n\n\tRTMP_SET_PACKET_UP(pPacket, UserPriority);\n\n\tRTMP_SET_PACKET_MGMT_PKT(pPacket, 0x00); /* mark as non-management frame */\n\n#ifdef INF_AMAZON_SE\n\tpAd->BulkOutDataSizeCount[QueIdx]+=SrcBufLen;\n#endif /* INF_AMAZON_SE */\n\t\n\t/*\n\t\t4. put to corrsponding TxSwQueue or Power-saving queue\n\t*/\n\n\t/* WDS and ApClient link should never go into power-save mode; just send out the frame */\n\tif (pMacEntry && (IS_ENTRY_WDS(pMacEntry) || IS_ENTRY_APCLI(pMacEntry) || IS_ENTRY_MESH(pMacEntry)))\n\t{\n\n\t\tif (pAd->TxSwQueue[QueIdx].Number >= pAd->TxSwQMaxLen)\n        {\n#ifdef BLOCK_NET_IF\n\t\t\tStopNetIfQueue(pAd, QueIdx, pPacket);\n#endif /* BLOCK_NET_IF */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\t}\n\t}\n\t/* M/BCAST frames are put to PSQ as long as there's any associated STA in power-save mode */\n\telse if ((*pSrcBufVA & 0x01) && pAd->MacTab.fAnyStationInPsm\n#ifdef IGMP_SNOOP_SUPPORT\n\t\t/* multicast packets in IgmpSn table should never send to Power-Saving queue. */\n\t\t&& (!InIgmpGroup)\n#endif /* IGMP_SNOOP_SUPPORT */\n\t\t)\n\t{\n\t\t/*\n\t\t\twe don't want too many MCAST/BCAST backlog frames to eat up all buffers. \n\t\t\tSo in case number of backlog MCAST/BCAST frames exceeds a pre-defined \n\t\t\twatermark within a DTIM period, simply drop coming new MCAST/BCAST frames. \n\t\t\tThis design is similiar to \"BROADCAST throttling in most manageable \n\t\t\tEthernet Switch chip. \n\t\t*/\n\t\tif (pAd->MacTab.McastPsQueue.Number >= MAX_PACKETS_IN_MCAST_PS_QUEUE)\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"M/BCAST PSQ(=%ld) full, drop it!\\n\", pAd->MacTab.McastPsQueue.Number));\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\tInsertHeadQueue(&pAd->MacTab.McastPsQueue, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\n\t\t\tWLAN_MR_TIM_BCMC_SET(apidx); /* mark MCAST/BCAST TIM bit */\n\t\t}\n\t}\n\t/* else if the associted STA in power-save mode, frame also goes to PSQ */\n\telse if ((PsMode == PWR_SAVE) && pMacEntry &&\n\t\t\t\tIS_ENTRY_CLIENT(pMacEntry) && (Sst == SST_ASSOC))\n\t{\n\t\tif (APInsertPsQueue(pAd, pPacket, pMacEntry, QueIdx)\n\t\t\t\t!= NDIS_STATUS_SUCCESS)\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\t/* 3. otherwise, transmit the frame */\n\telse /* (PsMode == PWR_ACTIVE) || (PsMode == PWR_UNKNOWN) */\n\t{\n\n\n#ifdef IGMP_SNOOP_SUPPORT\n\t\t/* if it's a mcast packet in igmp gourp. */\n\t\t/* ucast clone it for all members in the gourp. */\n\t\tif (((InIgmpGroup == IGMP_IN_GROUP)\n\t\t\t\t&& pGroupEntry\n\t\t\t\t&&  (IgmpMemberCnt(&pGroupEntry->MemberList) > 0))\n\t\t\t|| (InIgmpGroup == IGMP_PKT))\n\t\t{\n\t\t\tNDIS_STATUS PktCloneResult = IgmpPktClone(pAd, pPacket, InIgmpGroup, \tpGroupEntry,\n\t\t\t\t\t\t\t\t\t\t\t\tQueIdx, UserPriority, GET_OS_PKT_NETDEV(pPacket));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);\n\t\t\tif (PktCloneResult != NDIS_STATUS_SUCCESS)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\telse\n#endif /* IGMP_SNOOP_SUPPORT */\n\t\t{\n\n\t\t\tif (pAd->TxSwQueue[QueIdx].Number >= pAd->TxSwQMaxLen)\n\t\t\t{\n\n#ifdef BLOCK_NET_IF\n\t\t\t\tStopNetIfQueue(pAd, QueIdx, pPacket);\n#endif /* BLOCK_NET_IF */\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\treturn NDIS_STATUS_FAILURE;\t\t\t\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\t\t\n\t\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tRTMP_BASetup(pAd, pMacEntry, UserPriority);\n#endif /* DOT11_N_SUPPORT */\n\n/* TODO: for debug only. to be removed */\n/*\tpAd->RalinkCounters.OneSecOsTxCount[QueIdx]++; */\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/* \n\t--------------------------------------------------------\n\tFIND ENCRYPT KEY AND DECIDE CIPHER ALGORITHM\n\t\tFind the WPA key, either Group or Pairwise Key\n\t\tLEAP + TKIP also use WPA key.\n\t--------------------------------------------------------\n\tDecide WEP bit and cipher suite to be used. \n\tSame cipher suite should be used for whole fragment burst\n\tIn Cisco CCX 2.0 Leap Authentication\n\t\tWepStatus is Ndis802_11Encryption1Enabled but the key will use PairwiseKey\n\t\tInstead of the SharedKey, SharedKey Length may be Zero.\n*/\nstatic inline VOID APFindCipherAlgorithm(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tCIPHER_KEY *pKey = NULL;\n\tUCHAR KeyIdx = 0, CipherAlg = CIPHER_NONE;\n\tUCHAR apidx = pTxBlk->apidx;\n\tUCHAR RAWcid = pTxBlk->Wcid;\n\tMAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry;\n\tMULTISSID_STRUCT *pMbss;\n\n\n\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n#ifdef APCLI_SUPPORT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bApCliPacket))\n\t{\t\n\t\tAPCLI_STRUCT *pApCliEntry = pTxBlk->pApCliEntry;\n\n\t\tif (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) \n\t\t{\t\t\t\n\t\t\t/* These EAPoL frames must be clear before 4-way handshaking is completed. */\n\t\t\tif ((!(TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame))) && \n\t\t\t\t(pMacEntry->PairwiseKey.CipherAlg) &&\n\t\t\t\t(pMacEntry->PairwiseKey.KeyLen))\n\t\t\t{\n\t\t\t\tCipherAlg  = pMacEntry->PairwiseKey.CipherAlg;\n\t\t\t\tif (CipherAlg)\n\t\t\t\t\tpKey = &pMacEntry->PairwiseKey;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCipherAlg = CIPHER_NONE;\n\t\t\t\tpKey = NULL;\n\t\t\t}\n\t\t}\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\telse if ( pApCliEntry->WpaSupplicantUP && \n\t\t\t(pMacEntry->WepStatus  == Ndis802_11Encryption1Enabled) &&\n\t\t\t(pApCliEntry->IEEE8021X == TRUE) &&\n\t\t\t(pMacEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED))\n\t\t{\n\t\t\tCipherAlg = CIPHER_NONE;\n\t\t}\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n\t\telse if (pMacEntry->WepStatus == Ndis802_11Encryption1Enabled)\n\t\t{\n\t\t\tCipherAlg  = pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId].CipherAlg;\n\t\t\tif (CipherAlg)\n\t\t\t\tpKey = &pApCliEntry->SharedKey[pApCliEntry->DefaultKeyId];\n\t\t}\t\t\n\t\telse if (pMacEntry->WepStatus == Ndis802_11Encryption2Enabled ||\n\t \t\t\t pMacEntry->WepStatus == Ndis802_11Encryption3Enabled)\n\t\t{\n\t\t\tCipherAlg  = pMacEntry->PairwiseKey.CipherAlg;\n\t\t\tif (CipherAlg)\n\t\t\t\tpKey = &pMacEntry->PairwiseKey;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCipherAlg = CIPHER_NONE;\n\t\t\tpKey = NULL;\n\t\t}\t\t\t\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n#ifdef WAPI_SUPPORT\n\tif (pMbss->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t{\n\t\tif (RTMP_GET_PACKET_WAI(pTxBlk->pPacket))\n\t\t{\n\t\t\t/* WAI negotiation packet is always clear. */\n\t\t\tCipherAlg = CIPHER_NONE;\t\t\t\t\t\n\t\t\tpKey = NULL;\n\t\t}\t\n\t\telse if (!pMacEntry)\n\t\t{\n\t\t\tKeyIdx = pMbss->DefaultKeyId; /* MSK ID */\n\t\t\tCipherAlg  = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\t\t\t\n\t\t\tif (CipherAlg == CIPHER_SMS4)\n\t\t\t{\n\t\t\t\tpKey = &pAd->SharedKey[apidx][KeyIdx];\t\n#ifdef SOFT_ENCRYPT\n\t\t\t\tif (pMbss->sw_wpi_encrypt)\n\t\t\t\t{\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bSwEncrypt);\n\t\t\t\t\t/* TSC increment pre encryption transmittion */\t\t\t\t\n\t\t\t\t\tinc_iv_byte(pKey->TxTsc, LEN_WAPI_TSC, 1);\t\t\t\t\t\t\t\t\n\t\t\t\t}\n#endif /* SOFT_ENCRYPT */\n\t\t\t}\n\t\t}\t\n\t\telse\t\t\n\t\t{\t\t\t\n\t\t\tKeyIdx = pTxBlk->pMacEntry->usk_id; /* USK ID */\n\t\t\tCipherAlg  = pAd->MacTab.Content[RAWcid].PairwiseKey.CipherAlg;\n\t\t\tif (CipherAlg == CIPHER_SMS4)\n\t\t\t{\n\t\t\t\tpKey = &pAd->MacTab.Content[RAWcid].PairwiseKey;\n#ifdef SOFT_ENCRYPT\n\t\t\t\tif (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT))\t\n\t\t\t\t{\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bSwEncrypt);\n\t\t\t\t\t/* TSC increment pre encryption transmittion */\t\t\t\t\n\t\t\t\t\tinc_iv_byte(pKey->TxTsc, LEN_WAPI_TSC, 2);\t\t\t\t\n\t\t\t\t}\n#endif /* SOFT_ENCRYPT */\n\t\t\t}\n\t\t}\n\t}\n\telse\n#endif /* WAPI_SUPPORT */\n\tif ((RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket))\t\t\t||\n#ifdef DOT1X_SUPPORT\t\t\n\t\t((pMbss->WepStatus == Ndis802_11Encryption1Enabled) && (pMbss->IEEE8021X == TRUE)) || \n#endif /* DOT1X_SUPPORT */\t\t\n\t\t(pMbss->WepStatus == Ndis802_11Encryption2Enabled)\t||\n\t\t(pMbss->WepStatus == Ndis802_11Encryption3Enabled)\t||\n\t\t(pMbss->WepStatus == Ndis802_11Encryption4Enabled))\n\t{\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"APHardTransmit --> clear eap frame !!!\\n\"));          \n\t\t\tCipherAlg = CIPHER_NONE;\n\t\t\tpKey = NULL;\n\t\t}\n\t\telse if (!pMacEntry) /* M/BCAST to local BSS, use default key in shared key table */\n\t\t{\n\t\t\tKeyIdx = pMbss->DefaultKeyId;\n#ifdef P2P_APCLI_SUPPORT\n\t\t\tif (P2P_INF_ON(pAd) && P2P_GO_ON(pAd))\n\t\t\t\tCipherAlg  = pAd->SharedKey[apidx+1][KeyIdx].CipherAlg;\t\t\t\n\t\t\telse\n#endif /* P2P_APCLI_SUPPORT */\n\t\t\tCipherAlg  = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\t\t\t\n\t\t\tif (CipherAlg)\n\t\t\t\tpKey = &pAd->SharedKey[apidx][KeyIdx];\t\t\t\n\t\t}\n\t\telse /* unicast to local BSS */\n\t\t{\n\t\t\tCipherAlg  = pAd->MacTab.Content[RAWcid].PairwiseKey.CipherAlg;\n\t\t\tif (CipherAlg)\n\t\t\t\tpKey = &pAd->MacTab.Content[RAWcid].PairwiseKey;\n\n#ifdef SOFT_ENCRYPT\n\t\t\tif (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT))\t\n\t\t\t{\n\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bSwEncrypt);\n\n\t\t\t\t/* TSC increment pre encryption transmittion */\t\t\t\t\n\t\t\t\tif (pKey == NULL)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s pKey == NULL!\\n\", __FUNCTION__));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tINC_TX_TSC(pKey->TxTsc, LEN_WPA_TSC);\n\t\t\t\t}\n\t\t\t}\n#endif /* SOFT_ENCRYPT */\n\t\t}\n\t}\n\telse if (pMbss->WepStatus == Ndis802_11Encryption1Enabled) /* WEP always uses shared key table */\n\t{\n\t\tKeyIdx = pMbss->DefaultKeyId;\n\t\tCipherAlg  = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n\t\tif (CipherAlg)\n\t\t\tpKey = &pAd->SharedKey[apidx][KeyIdx];\n\t}\n\telse\n\t{\n\t\tCipherAlg = CIPHER_NONE;\n\t\tpKey = NULL;\n\t}\n\n\tpTxBlk->CipherAlg = CipherAlg;\n\tpTxBlk->pKey = pKey;\n\tpTxBlk->KeyIdx = KeyIdx;\t\n}\n\n#ifdef DOT11_N_SUPPORT\nstatic inline VOID APBuildCache802_11Header(\n\tIN RTMP_ADAPTER\t\t*pAd,\n\tIN TX_BLK\t\t\t*pTxBlk,\n\tIN UCHAR\t\t\t*pHeader)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tPHEADER_802_11\tpHeader80211;\n\n\tpHeader80211 = (PHEADER_802_11)pHeader;\n\tpMacEntry = pTxBlk->pMacEntry;\n\n\t/*\n\t\tUpdate the cached 802.11 HEADER\n\t*/\n\t\n\t/* normal wlan header size : 24 octets */\n\tpTxBlk->MpduHeaderLen = sizeof(HEADER_802_11);\n\t\n\t/* More Bit */\n\tpHeader80211->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\t\n\t/* Sequence */\n\tpHeader80211->Sequence = pMacEntry->TxSeq[pTxBlk->UserPriority];\n\tpMacEntry->TxSeq[pTxBlk->UserPriority] = (pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ;\n\t\n\t/* SA */\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\tif (FALSE\n#ifdef CLIENT_WDS\n\t\t|| TX_BLK_TEST_FLAG(pTxBlk, fTX_bClientWDSFrame)\n#endif /* CLIENT_WDS */\n\t\t)\n\t{\t/* The addr3 of WDS packet is Destination Mac address and Addr4 is the Source Mac address. */\n\t\tCOPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader);\n\t\tCOPY_MAC_ADDR(pHeader80211->Octet, pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);\n\t\tpTxBlk->MpduHeaderLen += MAC_ADDR_LEN; \n\t}\n\telse\n#endif /* WDS_SUPPORT || CLIENT_WDS */\n#ifdef APCLI_SUPPORT\n\tif(IS_ENTRY_APCLI(pMacEntry))\n\t{\t/* The addr3 of Ap-client packet is Destination Mac address. */\n\t\tCOPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader);\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n\t{\t/* The addr3 of normal packet send from DS is Src Mac address. */\n\t\tCOPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);\n\t}\n\n\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nstatic inline VOID APBuildCacheWifiInfo(\n\tIN RTMP_ADAPTER\t\t*pAd,\n\tIN TX_BLK\t\t\t*pTxBlk,\n\tIN UCHAR\t\t\t*pWiInfo)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\n\tPWIFI_INFO_STRUC pWI;\n\n\tpWI = (PWIFI_INFO_STRUC)pWiInfo;\n\tpMacEntry = pTxBlk->pMacEntry;\n\n\t/* WIFI INFO size : 4 octets */\n\tpTxBlk->MpduHeaderLen = WIFI_INFO_SIZE;\t\n\n\t/* More Bit */\n\tpWI->field.More_Data = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\t\n\t/* Sequence */\n\tpWI->field.Seq_Num = pMacEntry->TxSeq[pTxBlk->UserPriority];\n\tpMacEntry->TxSeq[pTxBlk->UserPriority] = (pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ;\n\t\n}\n#endif /* HDR_TRANS_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef HDR_TRANS_SUPPORT\nstatic inline VOID APBuildWifiInfo(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  TX_BLK          *pTxBlk)\n{\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tPWIFI_INFO_STRUC pWI;\n\n\n\t/* WIFI INFO size : 4 octets */\n\tpTxBlk->MpduHeaderLen = WIFI_INFO_SIZE;\n\n\tpWI =\n\t    (WIFI_INFO_STRUC *) & pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\n\tNdisZeroMemory(pWI, WIFI_INFO_SIZE);\n\n\tpWI->field.Mode = 1;\t/* AP */\n\tpWI->field.QoS = (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? 1 : 0;\n\n\tif (pTxBlk->pMacEntry)\n\t{\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS))\n\t\t{\t\t\t\n\t\t\tpWI->field.Seq_Num = pTxBlk->pMacEntry->NonQosDataSeq;\n\t\t\tpTxBlk->pMacEntry->NonQosDataSeq = (pTxBlk->pMacEntry->NonQosDataSeq+1) & MAXSEQ;\n\t\t}\n\t\telse\n\t\t{\t\t\n    \t    pWI->field.Seq_Num = pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority];\n    \t    pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] = (pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ;\n    \t}\t\t\n\t}\n\telse\n\t{\n\t\tpWI->field.Seq_Num = pAd->Sequence;\n\t\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ; /* next sequence */\n\t}\n\t\n\tpWI->field.More_Data = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\n#ifdef P2P_SUPPORT\n\t/* To not disturb the Opps test, set psm bit if I use power save mode.  */\n\t/* P2P Test case 7.1.3 */\n\tif (P2P_INF_ON(pAd) && P2P_CLI_ON(pAd) && \n\t\t(P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT ))\n\t\t&& (pAd->P2pCfg.bP2pCliPmEnable))\n\t\tpWI->field.PS = 1;\n#endif /* P2P_SUPPORT */\n\tif (pTxBlk->CipherAlg != CIPHER_NONE)\n\t\tpWI->field.WEP = 1;\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nstatic inline VOID APBuildCommon802_11Header(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *wifi_hdr;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t/*\n\t\tMAKE A COMMON 802.11 HEADER\n\t*/\n\n\t/* normal wlan header size : 24 octets */\n\tpTxBlk->MpduHeaderLen = sizeof(HEADER_802_11);\n\twifi_hdr = (HEADER_802_11 *) &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize + TSO_SIZE];\n\tNdisZeroMemory(wifi_hdr, sizeof(HEADER_802_11));\n\n\twifi_hdr->FC.FrDs = 1;\n\twifi_hdr->FC.Type = BTYPE_DATA;\n\twifi_hdr->FC.SubType = ((TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? SUBTYPE_QDATA : SUBTYPE_DATA);\n\n\tif (pTxBlk->pMacEntry)\n\t{\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS))\n\t\t{\t\t\t\n\t\t\twifi_hdr->Sequence = pTxBlk->pMacEntry->NonQosDataSeq;\n\t\t\tpTxBlk->pMacEntry->NonQosDataSeq = (pTxBlk->pMacEntry->NonQosDataSeq+1) & MAXSEQ;\n\t\t}\n\t\telse\n\t\t{\t\t\n\t\t\twifi_hdr->Sequence = pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority];\n\t\t\tpTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] = (pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ;\n    \t\t}\t\t\n\t}\n\telse\n\t{\n\t\twifi_hdr->Sequence = pAd->Sequence;\n\t\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ; /* next sequence */\n\t}\n\t\n\twifi_hdr->Frag = 0;\n\twifi_hdr->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\n#ifdef APCLI_SUPPORT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bApCliPacket))\n\t{\n\t\twifi_hdr->FC.ToDs = 1;\n\t\twifi_hdr->FC.FrDs = 0;\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, APCLI_ROOT_BSSID_GET(pAd, pTxBlk->Wcid));\t/* to AP2 */\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pTxBlk->pApCliEntry->CurrentAddress);\t\t/* from AP1 */\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pTxBlk->pSrcBufHeader);\t\t\t\t\t/* DA */\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\tif (FALSE\n#ifdef CLIENT_WDS\n\t\t|| TX_BLK_TEST_FLAG(pTxBlk, fTX_bClientWDSFrame)\n#endif /* CLIENT_WDS */\n\t\t)\n\t{\n\t\twifi_hdr->FC.ToDs = 1;\n\t\tif (pTxBlk->pMacEntry == NULL)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s pTxBlk->pMacEntry == NULL!\\n\", __FUNCTION__));\n\t\telse\n\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pMacEntry->Addr);\t\t\t\t/* to AP2 */\n\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pAd->CurrentAddress);\t\t\t\t\t\t/* from AP1 */\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pTxBlk->pSrcBufHeader);\t\t\t\t\t/* DA */\n\t\tCOPY_MAC_ADDR(&wifi_hdr->Octet[0], pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);/* ADDR4 = SA */\n\t\tpTxBlk->MpduHeaderLen += MAC_ADDR_LEN; \n\t}\n\telse\n#endif /* WDS_SUPPORT || CLIENT_WDS */\n\t{\n\t\t/* TODO: how about \"MoreData\" bit? AP need to set this bit especially for PS-POLL response */\n#ifdef IGMP_SNOOP_SUPPORT\n\t\tif (pTxBlk->Wcid != MCAST_WCID)\n\t\t{\n\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pMacEntry->Addr); /* DA */\n\t\t}\n\t\telse\n#endif /* IGMP_SNOOP_SUPPORT */\n\t\t{\n\t\t   \tCOPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pSrcBufHeader);\t\t\t\t\t/* DA */\n\t\t}\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pAd->ApCfg.MBSSID[pTxBlk->apidx].Bssid);\t\t/* BSSID */\n\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);\t\t\t/* SA */\n\t}\n\n#ifdef P2P_SUPPORT\n\t/* To not disturb the Opps test, set psm bit if I use power save mode.  */\n\t/* P2P Test case 7.1.3 */\n\tif (P2P_INF_ON(pAd) && P2P_CLI_ON(pAd) && \n\t\t(P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT ))\n\t\t&& (pAd->P2pCfg.bP2pCliPmEnable))\n\t\twifi_hdr->FC.PwrMgmt = 1;\n#endif /* P2P_SUPPORT */\n\tif (pTxBlk->CipherAlg != CIPHER_NONE)\n\t\twifi_hdr->FC.Wep = 1;\n}\n\n\nstatic inline PUCHAR AP_Build_ARalink_Frame_Header(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK\t\t*pTxBlk)\n{\n\tPUCHAR\t\t\tpHeaderBufPtr;/*, pSaveBufPtr; */\n\tHEADER_802_11\t*pHeader_802_11;\n\tPNDIS_PACKET\tpNextPacket;\n\tUINT32\t\t\tnextBufLen;\n\tPQUEUE_ENTRY\tpQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\t\t\n\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\tAPBuildCommon802_11Header(pAd, pTxBlk);\n\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t/* steal \"order\" bit to mark \"aggregation\" */\n\tpHeader_802_11->FC.Order = 1;\n\t\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM))\n\t{\n\t\t/*\n\t\t\tbuild QOS Control bytes\n\t\t*/\n\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\t\tif (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t)\n\t\t{\n\t\t\t/* \n\t\t\t * we can not use bMoreData bit to get EOSP bit because\n\t\t\t * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n\t\t\t */\n\t\t\t if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\t\t\t*pHeaderBufPtr |= (1 << 4);\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\n\t\t*(pHeaderBufPtr+1) = 0;\n\t\tpHeaderBufPtr +=2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\t}\n\n\t/* padding at front of LLC header. LLC header should at 4-bytes aligment. */\n\tpTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR)ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n\t\n\t/*\n\t\tFor RA Aggregation, put the 2nd MSDU length(extra 2-byte field) after \n\t\tQOS_CONTROL in little endian format\n\t*/\n\tpQEntry = pTxBlk->TxPacketList.Head;\n\tpNextPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tnextBufLen = GET_OS_PKT_LEN(pNextPacket);\n\tif (RTMP_GET_PACKET_VLAN(pNextPacket))\n\t\tnextBufLen -= LENGTH_802_1Q;\n\t\n\t*pHeaderBufPtr = (UCHAR)nextBufLen & 0xff;\n\t*(pHeaderBufPtr+1) = (UCHAR)(nextBufLen >> 8);\n\n\tpHeaderBufPtr += 2;\n\tpTxBlk->MpduHeaderLen += 2;\n\t\n\treturn pHeaderBufPtr;\n\t\n}\n\n\n#ifdef DOT11_N_SUPPORT\nstatic inline BOOLEAN BuildHtcField(\n\tIN RTMP_ADAPTER *pAd, \n\tIN TX_BLK *pTxBlk, \n\tIN  MAC_TABLE_ENTRY *pMacEntry, \n\tIN PUCHAR pHeaderBufPtr)\n{\n\tBOOLEAN bHTCPlus = FALSE;\n\t\n\n\treturn bHTCPlus;\n}\n\n\nstatic inline PUCHAR AP_Build_AMSDU_Frame_Header(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tUCHAR *pHeaderBufPtr;\n\tHEADER_802_11 *pHeader_802_11;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\n\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\tAPBuildCommon802_11Header(pAd, pTxBlk);\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\t/* build QOS Control bytes */\n\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\tif (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t)\n\t{\n\t\t/* \n\t\t * we can not use bMoreData bit to get EOSP bit because\n\t\t * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n\t\t */\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\t\t*pHeaderBufPtr |= (1 << 4);\n\t}\n#endif /* UAPSD_SUPPORT */\n\n\n\t/* A-MSDU packet */\n\t*pHeaderBufPtr |= 0x80;\n\n\t*(pHeaderBufPtr+1) = 0;\n\tpHeaderBufPtr +=2;\n\tpTxBlk->MpduHeaderLen += 2;\n\n#ifdef TXBF_SUPPORT\n\tif (pTxBlk->pMacEntry && pAd->chipCap.FlgHwTxBfCap)\n\t{\n\t\tMAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry;\n\t\tBOOLEAN bHTCPlus = FALSE;\n\n\t\tpTxBlk->TxSndgPkt = SNDG_TYPE_DISABLE;\n\n\t\tNdisAcquireSpinLock(&pMacEntry->TxSndgLock);\n\t\tif (pMacEntry->TxSndgType >= SNDG_TYPE_SOUNDING)\n\t\t{\n\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\n\t\t\tif (pMacEntry->TxSndgType == SNDG_TYPE_SOUNDING)\n\t\t\t{\n\t\t\t\t/* Select compress if supported. Otherwise select noncompress */\n\t\t\t\tif (pAd->CommonCfg.ETxBfNoncompress==0 &&\n\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) )\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\telse\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t}\n\t\t\telse if (pMacEntry->TxSndgType == SNDG_TYPE_NDP)\n\t\t\t{\n\t\t\t\t/* Select compress if supported. Otherwise select noncompress */\n\t\t\t\tif (pAd->CommonCfg.ETxBfNoncompress==0 &&\n\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ComSteerBFAntSup >= (pMacEntry->sndgMcs/8))\n\t\t\t\t\t)\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t\t/* Set NDP Announcement */\n\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->NDPAnnounce = 1;\n\n\t\t\t\tpTxBlk->TxNDPSndgBW = pMacEntry->sndgBW;\n\t\t\t\tpTxBlk->TxNDPSndgMcs = pMacEntry->sndgMcs;\n\t\t\t}\n\n\t\t\tpTxBlk->TxSndgPkt = pMacEntry->TxSndgType;\n\t\t\t/* arvin add for julian request send NDP */\n\t\t\tpMacEntry->TxSndgType = SNDG_TYPE_DISABLE;\n\t\t\tbHTCPlus = TRUE;\n\t\t}\n\t\tNdisReleaseSpinLock(&pMacEntry->TxSndgLock);\n\t\t\t\n#ifdef MFB_SUPPORT\n#if defined(MRQ_FORCE_TX) /* have to replace this by the correct condition!!! */\n\t\tpMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_MRQ;\n#endif\n\n\t\t/* \n\t\t\tIgnore sounding frame because the signal format of sounding frmae may \n\t\t\tbe different from normal data frame, which may result in different MFB\n\t\t*/\n\t\tif ((pMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ) &&\n\t\t\t(pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE))\n\t\t{\n\t\t\tif (bHTCPlus == FALSE)\n\t\t\t{\n\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t}\n\n\t\t\tMFB_PerPareMRQ(pAd, pHeaderBufPtr, pMacEntry);\n\t\t}\n\n\t\tif (pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ && pMacEntry->toTxMfb == 1)\n\t\t{\n\t\t\tif (bHTCPlus == FALSE)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\tbHTCPlus = TRUE;\n\t\t\t}\n\n\t\t\tMFB_PerPareMFB(pAd, pHeaderBufPtr, pMacEntry); /* not complete yet!!! */\n\t\t\tpMacEntry->toTxMfb = 0;\n\t\t}\n#endif /* MFB_SUPPORT */\n\n\t\tif (bHTCPlus == TRUE)\n\t\t{\n\t\t\tpHeader_802_11->FC.Order = 1;\n\t\t\tpHeaderBufPtr += 4;\n\t\t\tpTxBlk->MpduHeaderLen += 4;\n\t\t}\n\t}\n#endif /* TXBF_SUPPORT */\n\n\t/*\n\t\tpadding at front of LLC header\n\t\tLLC header should locate at 4-octets aligment\n\t\t@@@ MpduHeaderLen excluding padding @@@\n\t*/\n\tpTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);\n\t\t\n\treturn pHeaderBufPtr;\n\n}\n\n\nVOID AP_AMPDU_Frame_Tx(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *pHeader_802_11;\n\tUCHAR *pHeaderBufPtr;\n\tUSHORT freeCnt = 1;\n\tMAC_TABLE_ENTRY *pMacEntry;\n\tPQUEUE_ENTRY pQEntry;\n\tBOOLEAN\t bHTCPlus = FALSE;\n\tUINT hdr_offset;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\n\tASSERT(pTxBlk);\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\tif (pMbss != NULL)\n\t\t\tpMbss->TxDropCount ++;\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\thdr_offset = TXINFO_SIZE + TXWISize + TSO_SIZE;\n\tpMacEntry = pTxBlk->pMacEntry;\n\tif ((pMacEntry->isCached)\n#ifdef TXBF_SUPPORT\n\t\t&& (pMacEntry->TxSndgType == SNDG_TYPE_DISABLE)\n#endif /* TXBF_SUPPORT */\n\t)\n\t{\n#ifndef VENDOR_FEATURE1_SUPPORT\n\t\tNdisMoveMemory((PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (PUCHAR)(&pMacEntry->CachedBuf[0]), TXWISize + sizeof(HEADER_802_11));\n#else\n\t\tpTxBlk->HeaderBuf = (UCHAR *)(pMacEntry->HeaderBuf);\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\t\tpHeaderBufPtr = (PUCHAR)(&pTxBlk->HeaderBuf[hdr_offset]);\n\t\tAPBuildCache802_11Header(pAd, pTxBlk, pHeaderBufPtr);\n\n#ifdef SOFT_ENCRYPT\n\t\tRTMPUpdateSwCacheCipherInfo(pAd, pTxBlk, pHeaderBufPtr);\n#endif /* SOFT_ENCRYPT */\n\t}\n\telse \n\t{\n\t\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\t\tAPBuildCommon802_11Header(pAd, pTxBlk);\n\t\t\t\n\t\tpHeaderBufPtr = &pTxBlk->HeaderBuf[hdr_offset];\n\t}\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t{\t\t\t\t\n\t\tif (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE)\n\t\t{\t\t\t\t\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\t\n\t}\n#endif /* SOFT_ENCRYPT */\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\tif(pMacEntry->isCached\n\t\t&& (pMacEntry->Protocol == (RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket)))\n#ifdef SOFT_ENCRYPT\n\t\t&& !TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)\n#endif /* SOFT_ENCRYPT */\n#ifdef TXBF_SUPPORT\n\t\t&& (pMacEntry->TxSndgType == SNDG_TYPE_DISABLE)\n#endif /* TXBF_SUPPORT */\n\t)\n\t{\n\t\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\t\t\t\n\t\t/* skip common header */\n\t\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\t\t/* build QOS Control bytes */\n\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\t\tif (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t\t)\n\t\t{\n\t\t\t/* \n\t\t\t * we can not use bMoreData bit to get EOSP bit because\n\t\t\t * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n\t\t\t */\n\t\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\t\t\t*pHeaderBufPtr |= (1 << 4);\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\tpTxBlk->MpduHeaderLen = pMacEntry->MpduHeaderLen;\n\t\tpHeaderBufPtr = ((PUCHAR)pHeader_802_11) + pTxBlk->MpduHeaderLen;\n\n\t\tpTxBlk->HdrPadLen = pMacEntry->HdrPadLen;\n\n\t\t/* skip 802.3 header */\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\tpTxBlk->SrcBufLen  -= LENGTH_802_3;\n\n\t\t/* skip vlan tag */\n\t\tif (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket))\n\t\t{\n\t\t\tpTxBlk->pSrcBufData\t+= LENGTH_802_1Q;\n\t\t\tpTxBlk->SrcBufLen\t-= LENGTH_802_1Q;\n\t\t}\n\t}\n\telse\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\t{\n\t\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\t\t\t\n\t\t/* skip common header */\n\t\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\t\t/* build QOS Control bytes */\n\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\t\tif (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t\t)\n\t\t{\n\t\t\t/* \n\t\t\t * we can not use bMoreData bit to get EOSP bit because\n\t\t\t * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n\t\t\t */\n\t\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\t\t\t*pHeaderBufPtr |= (1 << 4);\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\n\t\t*(pHeaderBufPtr+1) = 0;\n\t\tpHeaderBufPtr +=2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\n\t\t/*\n\t\t\tbuild HTC+\n\t\t\tHTC control filed following QoS field\n\t\t*/\n\t\tif ((pAd->CommonCfg.bRdg == TRUE) \n\t\t\t&& (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_RDG_CAPABLE))\n#ifdef TXBF_SUPPORT \n\t\t\t&& (pMacEntry->TxSndgType != SNDG_TYPE_NDP)\n#endif /* TXBF_SUPPORT */\n\t\t)\n\t\t{\n\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t((PHT_CONTROL)pHeaderBufPtr)->RDG = 1;\n\t\t\tbHTCPlus = TRUE;\n\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t{\n\t\t\tpTxBlk->TxSndgPkt = SNDG_TYPE_DISABLE;\n\n\t\t\tNdisAcquireSpinLock(&pMacEntry->TxSndgLock);\n\t\t\tif (pMacEntry->TxSndgType >= SNDG_TYPE_SOUNDING)\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t}\n\n\t\t\t\tif (pMacEntry->TxSndgType == SNDG_TYPE_SOUNDING)\n\t\t\t\t{\n\t\t\t\t\t/* Select compress if supported. Otherwise select noncompress */\n\t\t\t\t\tif (pAd->CommonCfg.ETxBfNoncompress==0 &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) )\n\t\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t}\n\t\t\t\telse if (pMacEntry->TxSndgType == SNDG_TYPE_NDP)\n\t\t\t\t{\n\t\t\t\t\t/* Select compress if supported. Otherwise select noncompress */\n\t\t\t\t\tif ((pAd->CommonCfg.ETxBfNoncompress==0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ComSteerBFAntSup >= (pMacEntry->sndgMcs/8))\n\t\t\t\t\t)\n\t\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t\t/* Set NDP Announcement */\n\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->NDPAnnounce = 1;\n\n\t\t\t\t\tpTxBlk->TxNDPSndgBW = pMacEntry->sndgBW;\n\t\t\t\t\tpTxBlk->TxNDPSndgMcs = pMacEntry->sndgMcs;\n\t\t\t\t}\n\n\t\t\t\tpTxBlk->TxSndgPkt = pMacEntry->TxSndgType;\n\t\t\t\tpMacEntry->TxSndgType = SNDG_TYPE_DISABLE;\n\t\t\t}\n\n\t\t\tNdisReleaseSpinLock(&pMacEntry->TxSndgLock);\n\n#ifdef MFB_SUPPORT\n#if defined(MRQ_FORCE_TX) /* have to replace this by the correct condition!!! */\n\t\t\tpMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_MRQ;\n#endif\n\n\t\t\t/*\n\t\t\t\tIgnore sounding frame because the signal format of sounding frmae may \n\t\t\t\tbe different from normal data frame, which may result in different MFB \n\t\t\t*/\n\t\t\tif ((pMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ) &&\n\t\t\t\t(pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE))\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t}\n\t\t\t\tMFB_PerPareMRQ(pAd, pHeaderBufPtr, pMacEntry);\n\t\t\t}\n\n\t\t\tif (pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ && \n\t\t\t\tpMacEntry->toTxMfb == 1)\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t}\n\t\t\t\tMFB_PerPareMFB(pAd, pHeaderBufPtr, pMacEntry);/* not complete yet!!! */\n\t\t\t\tpMacEntry->toTxMfb = 0;\n\t\t\t}\n#endif /* MFB_SUPPORT */\n\t\t}\n#endif /* TXBF_SUPPORT */\n\n\t\tif (bHTCPlus == TRUE)\n\t\t{\n\t\t\t/* mark HTC bit */\n\t\t\tpHeader_802_11->FC.Order = 1;\n\t\t\tpHeaderBufPtr += 4;\n\t\t\tpTxBlk->MpduHeaderLen += 4;\n\t\t}\n\n\t\t/*pTxBlk->MpduHeaderLen = pHeaderBufPtr - pTxBlk->HeaderBuf - TXWI_SIZE - TXINFO_SIZE; */\n\t\tASSERT(pTxBlk->MpduHeaderLen >= 24);\n\n\t\t/* skip 802.3 header */\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\tpTxBlk->SrcBufLen  -= LENGTH_802_3;\n\n\t\t/* skip vlan tag */\n\t\tif (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket))\n\t\t{\n\t\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t\t}\n\n\t\t/* \n\t\t\tThe remaining content of MPDU header should locate at 4-octets aligment\n\t\t\t@@@ MpduHeaderLen excluding padding @@@ \n\t\t*/\n\t\tpTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;\n\t\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\t\tpTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\tpMacEntry->HdrPadLen = pTxBlk->HdrPadLen;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n#ifdef SOFT_ENCRYPT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t\t{\t\t\t\n\t\t\tUCHAR\tiv_offset = 0, ext_offset = 0;\n\t\t\t\n\t\t\n\t\t\t/*\n\t\t\t\tIf original Ethernet frame contains no LLC/SNAP,\n\t\t\t\tthen an extra LLC/SNAP encap is required\n\t\t\t*/\n\t\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2, pTxBlk->pExtraLlcSnapEncap);\n\t\t\t\n\t\t\t/* Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer */\n\t\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t\t{\n\t\t\t\t/* Reserve the front 8 bytes of data for LLC header */\n\t\t\t\tpTxBlk->pSrcBufData -= LENGTH_802_1_H;\n\t\t\t\tpTxBlk->SrcBufLen += LENGTH_802_1_H;\n\n\t\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData, pTxBlk->pExtraLlcSnapEncap, 6);\t\t\t\t\t\n\t\t\t}\t\n\t\t\t\t\t\t\t\n\t\t\t/* Construct and insert specific IV header to MPDU header */\n\t\t\tRTMPSoftConstructIVHdr(pTxBlk->CipherAlg, \n\t\t\t\t\t\t\t\t   pTxBlk->KeyIdx, \n\t\t\t\t\t\t\t\t   pTxBlk->pKey->TxTsc,\n\t\t\t\t\t\t\t\t   pHeaderBufPtr, \n\t\t\t\t\t\t\t\t   &iv_offset);\n\t\t\tpHeaderBufPtr += iv_offset;\n\t\t\tpTxBlk->MpduHeaderLen += iv_offset;\n\n\t\t\t/* Encrypt the MPDU data by software */\n\t\t\tRTMPSoftEncryptionAction(pAd, \n\t\t\t\t\t\t\t\t\t pTxBlk->CipherAlg, \n\t\t\t\t\t\t\t\t\t (PUCHAR)pHeader_802_11, \n\t\t\t\t\t\t\t\t\tpTxBlk->pSrcBufData, \n\t\t\t\t\t\t\t\t\tpTxBlk->SrcBufLen, \n\t\t\t\t\t\t\t\t\tpTxBlk->KeyIdx,\n\t\t\t\t\t\t\t\t\t   pTxBlk->pKey,\n\t\t\t\t\t\t\t\t\t &ext_offset);\n\t\t\tpTxBlk->SrcBufLen += ext_offset;\n\t\t\tpTxBlk->TotalFrameLen += ext_offset;\n\t\t\t\t\t\t\t\t\n\t\t}\n\t\telse\n#endif /* SOFT_ENCRYPT */\n\t\t{\n\n\n\t\t\t/* Insert LLC-SNAP encapsulation - 8 octets */\n\t\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);\n\t\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);\n\n\t\t\t\tpHeaderBufPtr += 6;\n\t\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);\n\n\t\t\t\tpHeaderBufPtr += 2;\n\t\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t\t}\n\t\t}\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\tpMacEntry->Protocol = RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket);\n\t\tpMacEntry->MpduHeaderLen = pTxBlk->MpduHeaderLen;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\t}\n\n\tif ((pMacEntry->isCached)\n#ifdef TXBF_SUPPORT\n\t\t&& (pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE)\n#endif /* TXBF_SUPPORT */\n\t)\n\t{\n\t\tRTMPWriteTxWI_Cache(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\t}\n\telse\n\t{\n\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\n\t\tNdisZeroMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), sizeof(pMacEntry->CachedBuf));\n\t\tNdisMoveMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), \n\t\t\t\t\t\t(PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), \n\t\t\t\t\t\t(pHeaderBufPtr - (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE])));\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\t/* use space to get performance enhancement */\n\t\tNdisZeroMemory((PUCHAR)(&pMacEntry->HeaderBuf[0]), sizeof(pMacEntry->HeaderBuf));\n\t\tNdisMoveMemory((PUCHAR)(&pMacEntry->HeaderBuf[0]), \n\t\t\t\t\t\t(PUCHAR)(&pTxBlk->HeaderBuf[0]), \n\t\t\t\t\t\t(pHeaderBufPtr - (PUCHAR)(&pTxBlk->HeaderBuf[0])));\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n\t\tpMacEntry->isCached = TRUE;\n\t}\n\n#ifdef TXBF_SUPPORT\n\tif (pTxBlk->TxSndgPkt != SNDG_TYPE_DISABLE)\n\t\tpMacEntry->isCached = FALSE;\n#endif /* TXBF_SUPPORT */\n\n#ifdef STATS_COUNT_SUPPORT\n\t/* calculate Transmitted AMPDU count and ByteCount */\n\t{\n\t\tpAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart ++;\n\t\tpAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen;\t\t\n\t}\n\n\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\n\tif (IS_ENTRY_CLIENT(pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t{\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n#ifdef WAPI_SUPPORT\n\t\tif (pMacEntry->WapiUskRekeyTimerRunning && \n\t\t\tpAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\tpMacEntry->wapi_usk_rekey_cnt += pTxBlk->SrcBufLen;\n#endif /* WAPI_SUPPORT */\n\t\t\t\n\t\tif (pMbss != NULL)\n\t\t{\n\t\t\tpMbss->TransmittedByteCount += pTxBlk->SrcBufLen;\n\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->mcPktsTx++;\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->bcPktsTx++;\n\t\t\telse\n\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t}\n\n\t\tif(pMacEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t}\n\t}\n\n#endif /* STATS_COUNT_SUPPORT */\n\n\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &freeCnt);\n\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\t\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID AP_AMPDU_Frame_Tx_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk)\n{\n\tPUCHAR\t\t\tpWiBufPtr;\n/*\tUCHAR\t\t\tQueIdx = pTxBlk->QueIdx; */\n\tUSHORT\t\t\tFreeNumber = 1; /* no use */\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tPQUEUE_ENTRY\tpQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tPWIFI_INFO_STRUC pWI;\n\t\n\tASSERT(pTxBlk);\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\tif (pMbss != NULL)\n\t\t\tpMbss->TxDropCount ++;\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_2[index]));\n\t}\n*/\n\n\tpMacEntry = pTxBlk->pMacEntry;\n\tif ((pMacEntry->isCached)\n\t)\n\t{\n\t\t/* It should be cleared!!! */\n\t\t/*NdisZeroMemory((PUCHAR)(&pTxBlk->HeaderBuf[0]), sizeof(pTxBlk->HeaderBuf)); */ \n\t\tNdisMoveMemory((PUCHAR)\n\t\t\t       (&pTxBlk->HeaderBuf[TXINFO_SIZE]),\n\t\t\t       (PUCHAR) (&pMacEntry->CachedBuf[0]),\n\t\t\t       TXWISize + WIFI_INFO_SIZE);\n\n\t\tpWiBufPtr = (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize]);\n\t\tAPBuildCacheWifiInfo(pAd, pTxBlk, pWiBufPtr);\n\t}\n\telse \n\t{\n\t\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\t\tAPBuildWifiInfo(pAd, pTxBlk);\n\t\t\t\n\t\tpWiBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\t}\n\n\tpWI = (PWIFI_INFO_STRUC)pWiBufPtr;\n\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader;\n\n\tif (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket))\n\t\tpWI->field.VLAN = TRUE;\n\n\tpWI->field.TID = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\tif (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t&& TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\tpWI->field.EOSP = TRUE;\n#endif /* UAPSD_SUPPORT */\n\n\tif (pTxBlk->pMbss)\n\t\tpWI->field.BssIdx = pMacEntry->apidx;\n\n\n\t{\n\n\t\t/*\n\t\t\tbuild HTC+\n\t\t\tHTC control filed following QoS field\n\t\t*/\n\t\tif ((pAd->CommonCfg.bRdg == TRUE) \n\t\t\t&& (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_RDG_CAPABLE))\n\t\t)\n\t\t{\n\t\t\tpWI->field.RDG = 1;\n\t\t}\n\n\t}\n\n/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_3[index]));\n\t}\n*/\n\n\tif ((pMacEntry->isCached)\n\t)\n\t{\n\t\tRTMPWriteTxWI_Cache(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\t}\n\telse\n\t{\n\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\t\tNdisZeroMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), sizeof(pMacEntry->CachedBuf));\n\t\tNdisMoveMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), \n\t\t\t\t\t\t(PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), \n\t\t\t\t\t\tTXWISize + WIFI_INFO_SIZE);\n\n\n\t\tpMacEntry->isCached = TRUE;\n\n\t}\n\n\n#ifdef STATS_COUNT_SUPPORT\n\t/* calculate Transmitted AMPDU count and ByteCount */\n\t{\n\t\tpAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart ++;\n\t\tpAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen;\t\t\n\t}\n\n\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\n\tif (IS_ENTRY_CLIENT(pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t{\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n#ifdef WAPI_SUPPORT\n\t\tif (pMacEntry->WapiUskRekeyTimerRunning && \n\t\t\tpAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\tpMacEntry->wapi_usk_rekey_cnt += pTxBlk->SrcBufLen;\n#endif /* WAPI_SUPPORT */\n\t\t\t\n\t\tif (pMbss != NULL)\n\t\t{\n\t\t\tpMbss->TransmittedByteCount += pTxBlk->SrcBufLen;\n\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->mcPktsTx++;\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->bcPktsTx++;\n\t\t\telse\n\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t}\n\n\t\tif(pMacEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t}\n\t}\n\n#endif /* STATS_COUNT_SUPPORT */\n\n\t/*FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); */\n\n\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);\n\n\n\n\t/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_4[index]));\n\t}\n*/\n\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\t\n/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_5[index])); \n\t\tif ( pAd->debug_index < 201 )\n\t\t{\n\t\t\tpAd->debug_index ++;\n\t\t} else {\n\t\t\tpAd->debug_on = 0;\n\t\t}\n\t}\n*/\n\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID AP_AMSDU_Frame_Tx(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tPUCHAR\t\t\tpHeaderBufPtr;\n\tUSHORT\t\t\tfreeCnt = 1; /* no use */\n\tUSHORT\t\t\tsubFramePayloadLen = 0;\t/* AMSDU Subframe length without AMSDU-Header / Padding. */\n\tUSHORT\t\t\ttotalMPDUSize=0;\n\tUCHAR\t\t\t*subFrameHeader;\n\tUCHAR\t\t\tpadding = 0;\n\tUSHORT\t\t\tFirstTx = 0, LastTxIdx = 0;\n\tint \t\t\tframeNum = 0;\n\tPQUEUE_ENTRY\tpQEntry;\n\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\n\tASSERT((pTxBlk->TxPacketList.Number > 1));\n\n\twhile(pTxBlk->TxPacketList.Head)\n\t{\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\t\n\t\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\t\tif (pMbss != NULL)\n\t\t\t\tpMbss->TxDropCount++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\t/* skip 802.3 header */\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\tpTxBlk->SrcBufLen  -= LENGTH_802_3;\n\n\t\t/* skip vlan tag */\n\t\tif (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket))\n\t\t{\n\t\t\tpTxBlk->pSrcBufData\t+= LENGTH_802_1Q;\n\t\t\tpTxBlk->SrcBufLen\t-= LENGTH_802_1Q;\n\t\t}\n\t\t\n\t\tif (frameNum == 0)\n\t\t{\n\t\t\tpHeaderBufPtr = AP_Build_AMSDU_Frame_Header(pAd, pTxBlk);\n\n\t\t\t/* NOTE: TxWI->TxWIMPDUByteCnt will be updated after final frame was handled. */\n\t\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE];\n\t\t\tpadding = ROUND_UP(LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen, 4) - (LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen);\n\t\t\tNdisZeroMemory(pHeaderBufPtr, padding + LENGTH_AMSDU_SUBFRAMEHEAD);\n\t\t\tpHeaderBufPtr += padding;\n\t\t\tpTxBlk->MpduHeaderLen = padding;\n\t\t\tpTxBlk->HdrPadLen += padding;\n\t\t}\n\n\t\t/*\n\t\t\tA-MSDU subframe\n\t\t\t\tDA(6)+SA(6)+Length(2) + LLC/SNAP Encap\n\t\t*/\n\t\tsubFrameHeader = pHeaderBufPtr;\n\t\tsubFramePayloadLen = pTxBlk->SrcBufLen;\n\n\t\tNdisMoveMemory(subFrameHeader, pTxBlk->pSrcBufHeader, 12);\n\n#ifdef APCLI_SUPPORT\n\t\tif(TX_BLK_TEST_FLAG(pTxBlk, fTX_bApCliPacket))\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[pTxBlk->pMacEntry->MatchAPCLITabIdx];\n\t\t\tif (pApCliEntry->Valid)\n\t\t\t\tNdisMoveMemory(&subFrameHeader[6] , pApCliEntry->CurrentAddress, 6);\n\t\t}\n#endif /* APCLI_SUPPORT */\n\n\n\t\tpHeaderBufPtr += LENGTH_AMSDU_SUBFRAMEHEAD;\n\t\tpTxBlk->MpduHeaderLen += LENGTH_AMSDU_SUBFRAMEHEAD;\n\n\n\n\t\t/* Insert LLC-SNAP encapsulation - 8 octets */\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);\n\n\t\tsubFramePayloadLen = pTxBlk->SrcBufLen;\n\n\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t{\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\tpHeaderBufPtr += 6;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t\tsubFramePayloadLen += LENGTH_802_1_H;\n\t\t}\n\n\t\t/* update subFrame Length field */\n\t\tsubFrameHeader[12] = (subFramePayloadLen & 0xFF00) >> 8;\n\t\tsubFrameHeader[13] = subFramePayloadLen & 0xFF;\n\n\t\ttotalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;\n\n\t\tif (frameNum ==0)\n\t\t\tFirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &freeCnt);\n\t\telse\n\t\t\tLastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &freeCnt);\t\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), NULL);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\tframeNum++;\n\n\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\t\t\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t{\n\t\t\t/* calculate Transmitted AMSDU Count and ByteCount */\n\t\t\tpAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart ++;\n\t\t\tpAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart += totalMPDUSize;\t\t\t\n\t\t}\n\n\t\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\n\t\tif (IS_ENTRY_CLIENT(pTxBlk->pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\t\t\tMAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry;\n\n#ifdef WAPI_SUPPORT\t\n\t\t\tif (pTxBlk->pMacEntry->WapiUskRekeyTimerRunning && pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\t\tpTxBlk->pMacEntry->wapi_usk_rekey_cnt += totalMPDUSize;\n#endif /* WAPI_SUPPORT */\n\t\t\n\t\t\tif (pMbss != NULL)\n\t\t\t{\n\t\t\t\tpMbss->TransmittedByteCount += totalMPDUSize;\n\t\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\t\tpMbss->mcPktsTx++;\n\t\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\t\tpMbss->bcPktsTx++;\n\t\t\t\telse\n\t\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t\t}\n\n\t\t\tif(pMacEntry->Sst == SST_ASSOC)\n\t\t\t{\n\t\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t\t}\n\t\t}\n\n#endif /* STATS_COUNT_SUPPORT */\n\t}\n\n\tHAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx);\n\tHAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx);\n\t\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nVOID AP_Legacy_Frame_Tx(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *wifi_hdr;\n\tUCHAR *pHeaderBufPtr;\n\tUSHORT freeCnt = 1;\n\tBOOLEAN bVLANPkt;\n\tQUEUE_ENTRY *pQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\n\tASSERT(pTxBlk);\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\tif (pMbss != NULL)\n\t\t\tpMbss->TxDropCount++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n#ifdef STATS_COUNT_SUPPORT\n\tif (pTxBlk->TxFrameType == TX_MCAST_FRAME)\n\t{\n\t\tINC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount);\n\t}\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\n\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\tAPBuildCommon802_11Header(pAd, pTxBlk);\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t{\t\t\t\t\n\t\tif (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE)\n\t\t{\t\t\t\t\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\t\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\t/* skip 802.3 header */\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\tpTxBlk->SrcBufLen  -= LENGTH_802_3;\n\n\t/* skip vlan tag */\n\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\tif (bVLANPkt)\n\t{\n\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t}\n\n\t/* record these MCAST_TX frames for group key rekey */\n\tif (pTxBlk->TxFrameType == TX_MCAST_FRAME)\n\t{\t\t\t\t\n\t\tINT\tidx;\n\n\t\tfor (idx = 0; idx < pAd->ApCfg.BssidNum; idx++)\n\t\t{\n\t\t\tif (pAd->ApCfg.MBSSID[idx].REKEYTimerRunning && \n\t\t\t\tpAd->ApCfg.MBSSID[idx].WPAREKEY.ReKeyMethod == PKT_REKEY)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[idx].REKEYCOUNTER += (pTxBlk->SrcBufLen);\n\t\t\t}\n\t\t}\n#ifdef WAPI_SUPPORT\n\t\tif (pAd->CommonCfg.WapiMskRekeyTimerRunning &&\n\t\t\tpAd->CommonCfg.wapi_msk_rekey_method == REKEY_METHOD_PKT)\n\t\t{\n\t\t\tpAd->CommonCfg.wapi_msk_rekey_cnt += (pTxBlk->SrcBufLen);\n\t\t}\t\t\n#endif /* WAPI_SUPPORT */\n\t}\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize + TSO_SIZE];\n\twifi_hdr = (HEADER_802_11 *)pHeaderBufPtr;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM))\n\t{\n\t\t/* build QOS Control bytes */\n\t\t*pHeaderBufPtr = ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]<<5));\n#ifdef UAPSD_SUPPORT\n\t\tif (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t)\n\t\t{\n\t\t\t/* \n\t\t\t * we can not use bMoreData bit to get EOSP bit because\n\t\t\t * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n\t\t\t */\n\t\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\t\t\t*pHeaderBufPtr |= (1 << 4);\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\n\t\t*(pHeaderBufPtr+1) = 0;\n\t\tpHeaderBufPtr +=2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap && \n\t\t\t(pTxBlk->pMacEntry) && \n\t\t\t(pTxBlk->pTransmit->field.MODE >= MODE_HTMIX))\n\t\t{\n\t\t\tMAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry;\n\t\t\tBOOLEAN bHTCPlus = FALSE;\n\t\t\t\n\t\t\tpTxBlk->TxSndgPkt = SNDG_TYPE_DISABLE;\n\t\t\t\n\t\t\tNdisAcquireSpinLock(&pMacEntry->TxSndgLock);\n\t\t\tif (pMacEntry->TxSndgType >= SNDG_TYPE_SOUNDING)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\n\t\t\t\tif (pMacEntry->TxSndgType == SNDG_TYPE_SOUNDING)\n\t\t\t\t{\n\t\t\t\t\t/* Select compress if supported. Otherwise select noncompress */\n\t\t\t\t\tif ((pAd->CommonCfg.ETxBfNoncompress==0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0))\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t}\n\t\t\t\telse if (pMacEntry->TxSndgType == SNDG_TYPE_NDP)\n\t\t\t\t{\n\t\t\t\t\t/* Select compress if supported. Otherwise select noncompress */\n\t\t\t\t\tif ((pAd->CommonCfg.ETxBfNoncompress == 0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ComSteerBFAntSup >= (pMacEntry->sndgMcs/8))\n\t\t\t\t\t)\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t\t/* Set NDP Announcement */\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->NDPAnnounce = 1;\n\n\t\t\t\t\tpTxBlk->TxNDPSndgBW = pMacEntry->sndgBW;\n\t\t\t\t\tpTxBlk->TxNDPSndgMcs = pMacEntry->sndgMcs;\n\t\t\t\t}\n\n\t\t\t\tpTxBlk->TxSndgPkt = pMacEntry->TxSndgType;\n\t\t\t\tpMacEntry->TxSndgType = SNDG_TYPE_DISABLE;\n\t\t\t\tbHTCPlus = TRUE;\n\t\t\t}\n\t\t\tNdisReleaseSpinLock(&pMacEntry->TxSndgLock);\n\n#ifdef MFB_SUPPORT\n#if defined(MRQ_FORCE_TX)\n\t\t\t/* have to replace this by the correct condition!!! */\n\t\t\tpMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_MRQ;\n#endif\n\n\t\t\t/* \n\t\t\t\tBecause the signal format of sounding frmae may be different \n\t\t\t\tfrom normal data frame, which may result in different MFB \n\t\t\t*/\n\t\t\tif ((pMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ) &&\n\t\t\t\t(pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE))\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t}\n\t\t\t\tMFB_PerPareMRQ(pAd, pHeaderBufPtr, pMacEntry);\n\t\t\t}\n\n\t\t\tif (pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ && pMacEntry->toTxMfb == 1)\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t}\n\n\t\t\t\tMFB_PerPareMFB(pAd, pHeaderBufPtr, pMacEntry);/*  not complete yet!!!*/\n\t\t\t\tpMacEntry->toTxMfb = 0;\n\t\t\t}\n#endif /* MFB_SUPPORT */\n\n\t\t\tif (bHTCPlus == TRUE)\n\t\t\t{\n\t\t\t\t/* mark HTC bit */\n\t\t\t\tpHeader_802_11->FC.Order = 1;\n\t\t\t\tpHeaderBufPtr += 4;\n\t\t\t\tpTxBlk->MpduHeaderLen += 4;\n\t\t\t}\n\t\t}\n#endif /* TXBF_SUPPORT */\n\t}\n\n\t/* The remaining content of MPDU header should locate at 4-octets aligment\t*/\n\tpTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t{\t\t\t\n\t\tUCHAR\tiv_offset = 0, ext_offset = 0;\n\n\t\t/*\n\t\t\tIf original Ethernet frame contains no LLC/SNAP,\n\t\t\tthen an extra LLC/SNAP encap is required \n\t\t*/\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2, pTxBlk->pExtraLlcSnapEncap);\n\t\t\n\t\t/* Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer */\n\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t{\n\t\t\t/* Reserve the front 8 bytes of data for LLC header */\n\t\t\tpTxBlk->pSrcBufData -= LENGTH_802_1_H;\n\t\t\tpTxBlk->SrcBufLen  += LENGTH_802_1_H;\n\n\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData, pTxBlk->pExtraLlcSnapEncap, 6);\t\t\t\t\t\n\t\t}\t\n\t\t\t\t\t\t\n\t\t/* Construct and insert specific IV header to MPDU header */\n\t\tRTMPSoftConstructIVHdr(pTxBlk->CipherAlg, \n\t\t\t\t\t\t\t   pTxBlk->KeyIdx, \n\t\t\t\t\t\t\t   pTxBlk->pKey->TxTsc,\n\t\t\t\t\t\t\t   pHeaderBufPtr, \n\t\t\t\t\t\t\t   &iv_offset);\n\t\tpHeaderBufPtr += iv_offset;\n\t\tpTxBlk->MpduHeaderLen += iv_offset;\n\n\t\t/* Encrypt the MPDU data by software */\n\t\tRTMPSoftEncryptionAction(pAd, \n\t\t\t\t\t\t\t\t pTxBlk->CipherAlg, \n\t\t\t\t\t\t\t\t (PUCHAR)wifi_hdr, \n\t\t\t\t\t\t\t\tpTxBlk->pSrcBufData, \n\t\t\t\t\t\t\t\tpTxBlk->SrcBufLen, \n\t\t\t\t\t\t\t\tpTxBlk->KeyIdx,\n\t\t\t\t\t\t\t\t   pTxBlk->pKey,\n\t\t\t\t\t\t\t\t &ext_offset);\n\t\tpTxBlk->SrcBufLen += ext_offset;\n\t\tpTxBlk->TotalFrameLen += ext_offset;\n\t\t\t\t\t\n\t}\n\telse\n#endif /* SOFT_ENCRYPT */\n\t{\n\n\t\t/*\n\t\t\tInsert LLC-SNAP encapsulation - 8 octets\n\t\t\tif original Ethernet frame contains no LLC/SNAP,\n\t\t\tthen an extra LLC/SNAP encap is required\n\t\t*/\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap);\n\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t{\n\t\t\tUCHAR vlan_size;\n\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\tpHeaderBufPtr += 6;\n\t\t\t/* skip vlan tag */\n\t\t\tvlan_size =  (bVLANPkt) ? LENGTH_802_1Q : 0;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t}\n\t}\n\n#ifdef STATS_COUNT_SUPPORT\n\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\t\n\tif (pTxBlk->pMacEntry && IS_ENTRY_CLIENT(pTxBlk->pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t{\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\t\tMAC_TABLE_ENTRY *pMacEntry=pTxBlk->pMacEntry;\n\n#ifdef WAPI_SUPPORT\t\n\t\tif (pTxBlk->pMacEntry->WapiUskRekeyTimerRunning && pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\tpTxBlk->pMacEntry->wapi_usk_rekey_cnt += pTxBlk->SrcBufLen;\n#endif /* WAPI_SUPPORT */\t\t\n\t\n\t\tif (pMbss != NULL)\n\t\t{\n\t\t\tpMbss->TransmittedByteCount += pTxBlk->SrcBufLen;\n\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->mcPktsTx++;\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->bcPktsTx++;\n\t\t\telse\n\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t}\n\n\t\tif(pMacEntry && pMacEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t}\n\t}\n\n#endif /* STATS_COUNT_SUPPORT */\n\n\t/*\n\t\tprepare for TXWI\n\t*/\n\n\t/* update Hardware Group Key Index */\n\tif (!pTxBlk->pMacEntry)\n\t{\n\t\t/* use Wcid as Hardware Key Index */\n\t\tGET_GroupKey_WCID(pAd, pTxBlk->Wcid, pTxBlk->apidx);\n\t}\n\n\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &freeCnt);\n\t\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)wifi_hdr);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID AP_Legacy_Frame_Tx_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk)\n{\n/*\tUCHAR\t\t\tQueIdx = pTxBlk->QueIdx; */\n\tUSHORT\t\t\tFreeNumber = 1; /* no use */\n\tBOOLEAN\t\t\tbVLANPkt;\n\tPQUEUE_ENTRY\tpQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tPWIFI_INFO_STRUC pWI;\n\t\n\tASSERT(pTxBlk);\n\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\tif (pMbss != NULL)\n\t\t\tpMbss->TxDropCount++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n#ifdef STATS_COUNT_SUPPORT\n\tif (pTxBlk->TxFrameType == TX_MCAST_FRAME)\n\t{\n\t\tINC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount);\n\t}\n#endif /* STATS_COUNT_SUPPORT */\n\n\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\t\n\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\n/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_2[index]));\n\t}\n*/\n\n\tAPBuildWifiInfo(pAd, pTxBlk);\n\n\tpWI = (PWIFI_INFO_STRUC)&pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader;\n\tif (bVLANPkt)\n\t\tpWI->field.VLAN = TRUE;\n\t\n\tpWI->field.TID = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM) \n\t\t&& CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t&& TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\tpWI->field.EOSP = TRUE;\n#endif /* UAPSD_SUPPORT */\n\n\t\tif (pTxBlk->pMbss)\n\t\t\tpWI->field.BssIdx = pTxBlk->pMacEntry->apidx;\n\n\n#ifdef STATS_COUNT_SUPPORT\n\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\t\n\tif (pTxBlk->pMacEntry && IS_ENTRY_CLIENT(pTxBlk->pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t{\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\t\tMAC_TABLE_ENTRY *pMacEntry=pTxBlk->pMacEntry;\n\n#ifdef WAPI_SUPPORT\t\n\t\tif (pTxBlk->pMacEntry->WapiUskRekeyTimerRunning && pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\tpTxBlk->pMacEntry->wapi_usk_rekey_cnt += pTxBlk->SrcBufLen;\n#endif /* WAPI_SUPPORT */\t\t\n\t\n\t\tif (pMbss != NULL)\n\t\t{\n\t\t\tpMbss->TransmittedByteCount += pTxBlk->SrcBufLen;\n\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->mcPktsTx++;\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->bcPktsTx++;\n\t\t\telse\n\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t}\n\n\t\tif(pMacEntry && pMacEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t}\n\t}\n\n#endif /* STATS_COUNT_SUPPORT */\n\n\t/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_3[index]));\n\t}\n*/\n\n\t/*\n\t\tprepare for TXWI\n\t*/\n\n\t/* update Hardware Group Key Index */\n\tif (!pTxBlk->pMacEntry)\n\t{\n\t\t/* use Wcid as Hardware Key Index */\n\t\tGET_GroupKey_WCID(pAd, pTxBlk->Wcid, pTxBlk->apidx);\n\t}\n\n\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\t/*FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); */\n\n\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);\n\t\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_4[index]));\n\t}\n*/\n\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n\n/*\n\tif ( pAd->debug_on )\n\t{\n\t\tUCHAR index = RTMP_GET_DEBUG_INDEX(pTxBlk->pPacket);\n\t\tdo_gettimeofday(&(pAd->debug_time_5[index])); \n\t\tif ( pAd->debug_index < 201 )\n\t\t{\n\t\t\tpAd->debug_index ++;\n\t\t} else {\n\t\t\tpAd->debug_on = 0;\n\t\t}\n\t\t\t\n\t}\n*/\n\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID AP_Fragment_Frame_Tx(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *pHeader_802_11;\n\tUCHAR *pHeaderBufPtr;\n\tUSHORT freeCnt = 1; /* no use */\n\tUCHAR fragNum = 0;\n\tUSHORT EncryptionOverhead = 0;\t\n\tUINT32 FreeMpduSize, SrcRemainingBytes;\n\tUSHORT AckDuration;\n\tUINT NextMpduSize;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\tPACKET_INFO PacketInfo;\n#ifdef SOFT_ENCRYPT\n\tUCHAR *tmp_ptr = NULL;\n\tUINT32 buf_offset = 0;\n#endif /* SOFT_ENCRYPT */\n\tHTTRANSMIT_SETTING\t*pTransmit;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\t\n\tASSERT(pTxBlk);\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\n\tif(RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\tif (pMbss != NULL)\n\t\t\tpMbss->TxDropCount++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\t\n\tASSERT(TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag));\n\n\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\t\n\tAPFindCipherAlgorithm(pAd, pTxBlk);\n\tAPBuildCommon802_11Header(pAd, pTxBlk);\n\t\n#ifdef SOFT_ENCRYPT\n\t/*\n\t\tCheck if the original data has enough buffer\n\t\tto insert or append extended field.\n\t*/\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t{\t\t\n\t\tif (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE)\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\t\n\t}\n#endif /* SOFT_ENCRYPT */\n\t\n\tif (pTxBlk->CipherAlg == CIPHER_TKIP)\n\t{\n\t\tpTxBlk->pPacket = duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket);\n\t\tif (pTxBlk->pPacket == NULL)\n\t\t\treturn;\n\t\tRTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen);\n\t}\n\t\n\t/* skip 802.3 header */\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\tpTxBlk->SrcBufLen  -= LENGTH_802_3;\n\n\t/* skip vlan tag */\n\tif (bVLANPkt)\n\t{\n\t\tpTxBlk->pSrcBufData\t+= LENGTH_802_1Q;\n\t\tpTxBlk->SrcBufLen\t-= LENGTH_802_1Q;\n\t}\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpHeader_802_11 = (HEADER_802_11 *)pHeaderBufPtr;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM))\n\t{\n\t\t/* build QOS Control bytes */\n\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef UAPSD_SUPPORT\n\t\tif (pTxBlk->pMacEntry &&\n\t\t\tCLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_APSD_CAPABLE)\n\t\t)\n\t\t{\n\t\t\t/* \n\t\t\t * we can not use bMoreData bit to get EOSP bit because\n\t\t\t * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n\t\t\t */\n\t\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP))\n\t\t\t\t*pHeaderBufPtr |= (1 << 4);\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\n\t\t*(pHeaderBufPtr+1) = 0;\n\t\tpHeaderBufPtr +=2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\t}\n\n\t/* The remaining content of MPDU header should locate at 4-octets aligment */\n\tpTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t{\t\t\t\t\n\t\tUCHAR\tiv_offset = 0;\n\t\n\t\t/*\n\t\t\tIf original Ethernet frame contains no LLC/SNAP,\n\t\t\tthen an extra LLC/SNAP encap is required\n\t\t*/\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2, pTxBlk->pExtraLlcSnapEncap);\n\t\t\n\t\t/* Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer */\n\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t{\n\t\t\t/* Reserve the front 8 bytes of data for LLC header */\n\t\t\tpTxBlk->pSrcBufData -= LENGTH_802_1_H;\n\t\t\tpTxBlk->SrcBufLen  += LENGTH_802_1_H;\n\n\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData, pTxBlk->pExtraLlcSnapEncap, 6);\t\t\t\t\t\n\t\t}\t\n\t\t\t\n\t\t/* Construct and insert specific IV header to MPDU header */\n\t\tRTMPSoftConstructIVHdr(pTxBlk->CipherAlg, \n\t\t\t\t\t\t\t   pTxBlk->KeyIdx, \n\t\t\t\t\t\t\t   pTxBlk->pKey->TxTsc, \n\t\t\t\t\t\t\t   pHeaderBufPtr, \n\t\t\t\t\t\t\t   &iv_offset);\n\t\tpHeaderBufPtr += iv_offset;\n\t\tpTxBlk->MpduHeaderLen += iv_offset;\n\n\t}\n\telse\n#endif /* SOFT_ENCRYPT */\n\t{\n\n\t\t/*\n\t\t\tInsert LLC-SNAP encapsulation - 8 octets\n\t\t\tIf original Ethernet frame contains no LLC/SNAP,\n\t\t\tthen an extra LLC/SNAP encap is required\n\t\t*/\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap);\n\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t{\n\t\t\tUCHAR vlan_size;\n\t\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\tpHeaderBufPtr += 6;\n\t\t\t/* skip vlan tag */\n\t\t\tvlan_size =  (bVLANPkt) ? LENGTH_802_1Q : 0;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t}\n\t}\n\n\t/*  1. If TKIP is used and fragmentation is required. Driver has to\n\t\t   append TKIP MIC at tail of the scatter buffer\n\t\t2. When TXWI->FRAG is set as 1 in TKIP mode, \n\t\t   MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC */\n\t/*  TKIP appends the computed MIC to the MSDU data prior to fragmentation into MPDUs. */\n\tif (pTxBlk->CipherAlg == CIPHER_TKIP)\n\t{\n\t\tRTMPCalculateMICValue(pAd, pTxBlk->pPacket, pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey, pTxBlk->apidx);\n\n\t\t/*\n\t\t\tNOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust\n\t\t\t\tto correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress.\n\t\t*/\n\t\tNdisMoveMemory(pTxBlk->pSrcBufData + pTxBlk->SrcBufLen, &pAd->PrivateInfo.Tx.MIC[0], 8);\n\t\tpTxBlk->SrcBufLen += 8;\n\t\tpTxBlk->TotalFrameLen += 8;\n\t}\n\n#ifdef STATS_COUNT_SUPPORT\n\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\n\tif (pTxBlk->pMacEntry && IS_ENTRY_CLIENT(pTxBlk->pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t{\n\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\t\tMAC_TABLE_ENTRY\t*pMacEntry=pTxBlk->pMacEntry;\n\n#ifdef WAPI_SUPPORT\t\n\t\tif (pTxBlk->pMacEntry->WapiUskRekeyTimerRunning && pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\tpTxBlk->pMacEntry->wapi_usk_rekey_cnt += pTxBlk->SrcBufLen;\n#endif /* WAPI_SUPPORT */\t\t\n\t\n\t\tif (pMbss != NULL)\n\t\t{\n\t\t\tpMbss->TransmittedByteCount += pTxBlk->SrcBufLen;\n\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->mcPktsTx++;\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\tpMbss->bcPktsTx++;\n\t\t\telse\n\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t}\n\n\t\tif(pMacEntry && pMacEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t}\n\t}\n\n#endif /* STATS_COUNT_SUPPORT */\n\n\t/*\n\t\tcalcuate the overhead bytes that encryption algorithm may add. This\n\t\taffects the calculate of \"duration\" field\n\t*/\n\tif ((pTxBlk->CipherAlg == CIPHER_WEP64) || (pTxBlk->CipherAlg == CIPHER_WEP128)) \n\t\tEncryptionOverhead = 8; /*WEP: IV[4] + ICV[4]; */\n\telse if (pTxBlk->CipherAlg == CIPHER_TKIP)\n\t\tEncryptionOverhead = 12;/*TKIP: IV[4] + EIV[4] + ICV[4], MIC will be added to TotalPacketLength */\n\telse if (pTxBlk->CipherAlg == CIPHER_AES)\n\t\tEncryptionOverhead = 16;\t/* AES: IV[4] + EIV[4] + MIC[8] */\n#ifdef WAPI_SUPPORT\n\telse if (pTxBlk->CipherAlg == CIPHER_SMS4)\n\t\tEncryptionOverhead = 16;\t/* SMS4: MIC[16] */\n#endif /* WAPI_SUPPORT */\t\t\n\telse\n\t\tEncryptionOverhead = 0;\n\n\tpTransmit = pTxBlk->pTransmit;\t\n\t/* Decide the TX rate */\n\tif (pTransmit->field.MODE == MODE_CCK)\n\t\tpTxBlk->TxRate = pTransmit->field.MCS;\n\telse if (pTransmit->field.MODE == MODE_OFDM)\n\t\tpTxBlk->TxRate = pTransmit->field.MCS + RATE_FIRST_OFDM_RATE;\n\telse\n\t\tpTxBlk->TxRate = RATE_6_5;\n\n\t/* decide how much time an ACK/CTS frame will consume in the air */\n\tif (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE)\n\t\tAckDuration = RTMPCalcDuration(pAd, pAd->CommonCfg.ExpectedACKRate[pTxBlk->TxRate], 14);\n\telse\n\t\tAckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14);\n\t/*DBGPRINT(RT_DEBUG_INFO, (\"!!!Fragment AckDuration(%d), TxRate(%d)!!!\\n\", AckDuration, pTxBlk->TxRate)); */\n\n\t/* Init the total payload length of this frame. */\n\tSrcRemainingBytes = pTxBlk->SrcBufLen;\n\t\n\tpTxBlk->TotalFragNum = 0xff;\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t{\n\t\t/* store the outgoing frame for calculating MIC per fragmented frame */\n\t\tos_alloc_mem(pAd, (PUCHAR *)&tmp_ptr, pTxBlk->SrcBufLen);\n\t\tif (tmp_ptr == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory for SW MIC calculation !!!\\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t\tNdisMoveMemory(tmp_ptr, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\tdo {\n\n\t\tFreeMpduSize = pAd->CommonCfg.FragmentThreshold - LENGTH_CRC;\n\n\t\tFreeMpduSize -= pTxBlk->MpduHeaderLen;\n\n\t\tif (SrcRemainingBytes <= FreeMpduSize)\n\t\t{\t\n\t\t\t/* This is the last or only fragment */\n\t\t\tpTxBlk->SrcBufLen = SrcRemainingBytes;\n\t\t\t\n\t\t\tpHeader_802_11->FC.MoreFrag = 0;\n\t\t\tpHeader_802_11->Duration = pAd->CommonCfg.Dsifs + AckDuration;\n\t\t\t\n\t\t\t/* Indicate the lower layer that this's the last fragment. */\n\t\t\tpTxBlk->TotalFragNum = fragNum;\n\t\t}\n\t\telse\n\t\t{\t/* more fragment is required */\n\t\t\tpTxBlk->SrcBufLen = FreeMpduSize;\n\t\t\t\n\t\t\tNextMpduSize = min(((UINT)SrcRemainingBytes - pTxBlk->SrcBufLen), ((UINT)pAd->CommonCfg.FragmentThreshold));\n\t\t\tpHeader_802_11->FC.MoreFrag = 1;\n\t\t\tpHeader_802_11->Duration = (3 * pAd->CommonCfg.Dsifs) + (2 * AckDuration) + RTMPCalcDuration(pAd, pTxBlk->TxRate, NextMpduSize + EncryptionOverhead);\n\t\t}\n\n\t\tSrcRemainingBytes -= pTxBlk->SrcBufLen;\n\n\t\tif (fragNum == 0)\n\t\t\tpTxBlk->FrameGap = IFS_HTTXOP;\n\t\telse\n\t\t\tpTxBlk->FrameGap = IFS_SIFS;\n\t\t\n#ifdef SOFT_ENCRYPT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t\t{\n\t\t\tUCHAR\text_offset = 0;\n\t\t\n\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData, tmp_ptr + buf_offset, pTxBlk->SrcBufLen);\n\t\t\tbuf_offset += pTxBlk->SrcBufLen;\n\n\t\t\t/* Encrypt the MPDU data by software */\n\t\t\tRTMPSoftEncryptionAction(pAd, \n\t\t\t\t\t\t\t\t\t pTxBlk->CipherAlg, \n\t\t\t\t\t\t\t\t\t (PUCHAR)pHeader_802_11, \n\t\t\t\t\t\t\t\t\tpTxBlk->pSrcBufData, \n\t\t\t\t\t\t\t\t\tpTxBlk->SrcBufLen, \n\t\t\t\t\t\t\t\t\tpTxBlk->KeyIdx,\n\t\t\t\t\t\t\t\t\t   pTxBlk->pKey,\n\t\t\t\t\t\t\t\t\t &ext_offset);\n\t\t\tpTxBlk->SrcBufLen += ext_offset;\n\t\t\tpTxBlk->TotalFrameLen += ext_offset;\n\t\t\t\t\t\t\n\t\t}\t\n#endif /* SOFT_ENCRYPT */\n\t\t\n\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\t\tHAL_WriteFragTxResource(pAd, pTxBlk, fragNum, &freeCnt);\n\t\t\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n#ifdef SOFT_ENCRYPT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt))\n\t\t{\n#ifdef WAPI_SUPPORT\n\t\t\tif (pTxBlk->CipherAlg == CIPHER_SMS4)\n\t\t\t{\n\t\t\t\t/* incease WPI IV for next MPDU */ \n\t\t\t\tinc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WAPI_TSC, 2);\t\n\t\t\t\t/* Construct and insert WPI-SMS4 IV header to MPDU header */\n\t\t\t\tRTMPConstructWPIIVHdr(pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, \n\t\t\t\t\t\t\t\t pHeaderBufPtr - (LEN_WPI_IV_HDR));\t\t\t\t\t\n\t\t\t}\n\t\t\telse\t\t\t\n#endif /* WAPI_SUPPORT */\t\n\t\t\tif ((pTxBlk->CipherAlg == CIPHER_WEP64) || (pTxBlk->CipherAlg == CIPHER_WEP128))\n\t\t\t{\n\t\t\t\tinc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WEP_TSC, 1);\n\t\t\t\t/* Construct and insert 4-bytes WEP IV header to MPDU header */\n\t\t\t\tRTMPConstructWEPIVHdr(pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, \n\t\t\t\t\t\t\t\t\t\tpHeaderBufPtr - (LEN_WEP_IV_HDR));\n\t\t\t}\n\t\t\telse if (pTxBlk->CipherAlg == CIPHER_TKIP)\n\t\t\t\t;\n\t\t\telse if (pTxBlk->CipherAlg == CIPHER_AES)\n\t\t\t{\n\t\t\t\tinc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WPA_TSC, 1);\n\t\t\t\t/* Construct and insert 8-bytes CCMP header to MPDU header */\n\t\t\t\tRTMPConstructCCMPHdr(pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, \n\t\t\t\t\t\t\t\t\t\tpHeaderBufPtr - (LEN_CCMP_HDR));\t\n\t\t\t}\t\t\t\t\t\n\t\t}\n\t\telse\t\t\t\n#endif /* SOFT_ENCRYPT */\t\n\t\t{\n\t\t\t/* Update the frame number, remaining size of the NDIS packet payload. */\n\t\t\tif (fragNum == 0 && pTxBlk->pExtraLlcSnapEncap)\n\t\t\t\tpTxBlk->MpduHeaderLen -= LENGTH_802_1_H;\t/* space for 802.11 header. */\n\t\t}\n\n\t\tfragNum++;\n\t\t/*SrcRemainingBytes -= pTxBlk->SrcBufLen; */\n\t\tpTxBlk->pSrcBufData += pTxBlk->SrcBufLen;\n\t\t\n\t\tpHeader_802_11->Frag++;\t /* increase Frag # */\n\t\t\n\t}while(SrcRemainingBytes > 0);\n\n#ifdef SOFT_ENCRYPT\n\tif (tmp_ptr != NULL)\n\t\tos_free_mem(pAd, tmp_ptr);\n#endif /* SOFT_ENCRYPT */\n\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\t\t\n}\n\n\nVOID AP_ARalink_Frame_Tx(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tUCHAR *pHeaderBufPtr;\n\tUSHORT freeCnt = 1; /* no use */\n\tUSHORT totalMPDUSize=0;\n\tUSHORT FirstTx, LastTxIdx;\n\tint frameNum = 0;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\n\n\tASSERT(pTxBlk);\n\tASSERT((pTxBlk->TxPacketList.Number== 2));\n\n\tFirstTx = LastTxIdx = 0;  /* Is it ok init they as 0? */\n\twhile(pTxBlk->TxPacketList.Head)\n\t{\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE)\n\t\t{\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\n\t\t\tif (pMbss != NULL)\n\t\t\t\tpMbss->TxDropCount++;\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\t\t\t\n\t\t}\n\t\t\n\t\t/* skip 802.3 header */\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\tpTxBlk->SrcBufLen  -= LENGTH_802_3;\n\n\t\t/* skip vlan tag */\n\t\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\t\tif (bVLANPkt)\n\t\t{\n\t\t\tpTxBlk->pSrcBufData\t+= LENGTH_802_1Q;\n\t\t\tpTxBlk->SrcBufLen\t-= LENGTH_802_1Q;\n\t\t}\n\t\t\n\t\tif (frameNum == 0)\n\t\t{\t/* For first frame, we need to create the 802.11 header + padding(optional) + RA-AGG-LEN + SNAP Header */\n\t\t\n\t\t\tpHeaderBufPtr = AP_Build_ARalink_Frame_Header(pAd, pTxBlk);\n\t\t\t\n\t\t\t/*\n\t\t\t\tIt's ok write the TxWI here, because the TxWI->TxWIMPDUByteCnt\n\t\t\t\twill be updated after final frame was handled.\n\t\t\t*/\n\t\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\n\t\t\t/* Insert LLC-SNAP encapsulation - 8 octets */\n\t\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);\n\n\t\t\tif (pTxBlk->pExtraLlcSnapEncap)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\t\tpHeaderBufPtr += 6;\n\t\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);\n\t\t\t\tpHeaderBufPtr += 2;\n\t\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*\n\t\t\t\tFor second aggregated frame, we need create the 802.3 header to \n\t\t\t\theaderBuf, because PCI will copy it to SDPtr0.\n\t\t\t*/\n\t\t\tpHeaderBufPtr = &pTxBlk->HeaderBuf[0];\n\t\t\tpTxBlk->MpduHeaderLen = 0;\n\t\t\t\n\t\t\t/* \n\t\t\t\tA-Ralink sub-sequent frame header is the same as 802.3 header.\n\t\t\t\t\tDA(6)+SA(6)+FrameType(2)\n\t\t\t*/\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader, 12);\n\t\t\tpHeaderBufPtr += 12;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen = LENGTH_ARALINK_SUBFRAMEHEAD;\n\t\t}\n\n\t\ttotalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;\n\n\t\tif (frameNum ==0)\n\t\t\tFirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &freeCnt);\n\t\telse\n\t\t\tLastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &freeCnt);\n\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), NULL);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\tframeNum++;\n\t\t\n\t\tpAd->RalinkCounters.OneSecTxAggregationCount++;\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t/* calculate Tx count and ByteCount per BSS */\n#ifdef WAPI_SUPPORT\n\t\tif (pTxBlk->pMacEntry && IS_ENTRY_CLIENT(pTxBlk->pMacEntry))\n#endif /* WAPI_SUPPORT */\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = pTxBlk->pMbss;\n\t\t\tMAC_TABLE_ENTRY *pMacEntry=pTxBlk->pMacEntry;\n\n#ifdef WAPI_SUPPORT\t\n\t\t\tif (pTxBlk->pMacEntry->WapiUskRekeyTimerRunning && pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t\t\t\tpTxBlk->pMacEntry->wapi_usk_rekey_cnt += totalMPDUSize;\n#endif /* WAPI_SUPPORT */\n\n\t\t\tif (pMbss != NULL)\n\t\t\t{\n\t\t\t\tpMbss->TransmittedByteCount += totalMPDUSize;\n\t\t\t\tpMbss->TxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\t\tif(IS_MULTICAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\t\tpMbss->mcPktsTx++;\n\t\t\t\telse if(IS_BROADCAST_MAC_ADDR(pTxBlk->pSrcBufHeader))\n\t\t\t\t\tpMbss->bcPktsTx++;\n\t\t\t\telse\n\t\t\t\t\tpMbss->ucPktsTx++;\n#endif /* STATS_COUNT_SUPPORT */\n\t\t\t}\n\n\t\t\tif(pMacEntry && pMacEntry->Sst == SST_ASSOC)\n\t\t\t{\n\t\t\t\tINC_COUNTER64(pMacEntry->TxPackets);\n\t\t\t\tpMacEntry->TxBytes+=pTxBlk->SrcBufLen;\n\t\t\t}\n\n\t\t}\n\n\n#endif /* STATS_COUNT_SUPPORT */\n\t}\n\n\n\tHAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx);\n\tHAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx);\n\n\n\t/*\n\t\tKick out Tx\n\t*/\n\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n}\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tCopy frame from waiting queue into relative ring buffer and set \n\tappropriate ASIC register to kick hardware encryption before really\n\tsent out to air.\n\n\tArguments:\n\t\tpAd \t   \t\tPointer to our adapter\n\t\tpTxBlk\t\t\tPointer to outgoing TxBlk structure.\n\t\tQueIdx\t\t\tQueue index for processing\n\n\tReturn Value:\n\t\tNone\n\t========================================================================\n*/\nNDIS_STATUS APHardTransmit(\t\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tUCHAR\t\t\tQueIdx)\n{\n\tPQUEUE_ENTRY\tpQEntry;\n\tPNDIS_PACKET\tpPacket;\n\tUCHAR apidx;\n\t\n/*\tPQUEUE_HEADER   pQueue; */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (P2P_CLI_ON(pAd) && (pAd->LatchRfRegs.Channel != pAd->ApCliMlmeAux.Channel)\n\t\t&& (pAd->LatchRfRegs.Channel != pAd->ApCliMlmeAux.CentralChannel))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"APHardTransmit fail pAd->LatchRfRegs.Channel=%d pAd->ApCliMlmeAux.Channel=%d pAd->ApCliMlmeAux.CentralChannel=%d\\n\",\n\t\t\tpAd->LatchRfRegs.Channel,pAd->ApCliMlmeAux.Channel,pAd->ApCliMlmeAux.CentralChannel));\n\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\tif ((pAd->Dot11_H.RDMode != RD_NORMAL_MODE)\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\t||(isCarrierDetectExist(pAd) == TRUE)\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\t)\n\t{\n\t\twhile(pTxBlk->TxPacketList.Head)\n\t\t{\t\n\t\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\t\tif (pPacket)\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t}\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tapidx = RTMP_GET_PACKET_NET_DEVICE_MBSSID(pTxBlk->pPacket);\n\tif (apidx < pAd->ApCfg.BssidNum)\n\t{\n\t\t/* carry VLAN in the air */\n\t\tif (pAd->ApCfg.MBSSID[apidx].bVLAN_Tag == TRUE)\n\t\t{\n\t\t\tRTMP_SET_PACKET_VLAN(pTxBlk->pPacket, FALSE);\n\t\t}\n\t}\n\n\n\tswitch (pTxBlk->TxFrameType)\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tcase TX_AMPDU_FRAME:\n\t\t\t\tAP_AMPDU_Frame_Tx(pAd, pTxBlk);\n\n\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\tcase TX_LEGACY_FRAME:\n\t\t\t\tAP_Legacy_Frame_Tx(pAd, pTxBlk);\n\t\t\t\tbreak;\n\t\tcase TX_MCAST_FRAME:\n\t\t\t\tAP_Legacy_Frame_Tx(pAd, pTxBlk);\n\t\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\tcase TX_AMSDU_FRAME:\n\t\t\t\tAP_AMSDU_Frame_Tx(pAd, pTxBlk);\n\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\tcase TX_RALINK_FRAME:\n\t\t\t\tAP_ARalink_Frame_Tx(pAd, pTxBlk);\n\t\t\t\tbreak;\n\t\tcase TX_FRAG_FRAME:\n\t\t\t\tAP_Fragment_Frame_Tx(pAd, pTxBlk);\n\t\t\t\tbreak;\n\t\tdefault:\n\t\t\t{\n\t\t\t\t/* It should not happened! */\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Send a pacekt was not classified!! It should not happen!\\n\"));\n\t\t\t\twhile(pTxBlk->TxPacketList.Head)\n\t\t\t\t{\t\n\t\t\t\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\t\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\t\t\t\tif (pPacket)\n\t\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\treturn (NDIS_STATUS_SUCCESS);\n\t\n}\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tCheck Rx descriptor, return NDIS_STATUS_FAILURE if any error found\n\t========================================================================\n*/\nNDIS_STATUS APCheckRxError(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RXINFO_STRUC *pRxInfo,\n\tIN UCHAR Wcid)\n{\n\tif (pRxInfo->Crc || pRxInfo->CipherErr)\n\t{\n\t\t/*\n\t\t\tWCID equal to 255 mean MAC couldn't find any matched entry in Asic-MAC table.\n\t\t\tThe incoming packet mays come from WDS or AP-Client link.\n\t\t\tWe need them for further process. Can't drop the packet here.\n\t\t*/\n\t\tif ((pRxInfo->U2M)\n\t\t\t&& (pRxInfo->CipherErr)\n\t\t\t&& (Wcid == 255)\n\t\t)\n\t\t{\n\t\t\t/* pass those packet for further process. */\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s(): pRxInfo:Crc=%d, CipherErr=%d, U2M=%d, Wcid=%d\\n\", \n\t\t\t\t\t\t__FUNCTION__, pRxInfo->Crc, pRxInfo->CipherErr, pRxInfo->U2M, Wcid));\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n}\n\n\n/*\n  ========================================================================\n  Description:\n\tThis routine checks if a received frame causes class 2 or class 3\n\terror, and perform error action (DEAUTH or DISASSOC) accordingly\n  ========================================================================\n*/\nBOOLEAN APCheckClass2Class3Error(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN \tULONG Wcid, \n\tIN\tPHEADER_802_11\tpHeader)\n{\n\t/* software MAC table might be smaller than ASIC on-chip total size. */\n\t/* If no mathed wcid index in ASIC on chip, do we need more check???  need to check again. 06-06-2006 */\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():Rx a frame from %02x:%02x:%02x:%02x:%02x:%02x with WCID(%ld) > %d\\n\",\n\t\t\t\t\t__FUNCTION__, PRINT_MAC(pHeader->Addr2), \n\t\t\t\t\tWcid, MAX_LEN_OF_MAC_TABLE));\n//+++Add by shiang for debug\n//\t\thex_dump(\"Class2ErrPkt\", (UCHAR *)pHeader, sizeof(HEADER_802_11));\n\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\tif (pEntry)\n\t\t{\n\t\t\tif ((pEntry->Sst == SST_ASSOC) && IS_ENTRY_CLIENT(pEntry))\n\t\t\t{\n\t\t\t}\n\t\t\treturn FALSE;\n\t\t}\n//---Add by shiang for debug\n\n\t\tAPCls2errAction(pAd, MAX_LEN_OF_MAC_TABLE, pHeader);\n\t\treturn TRUE;\n\t}\n\n\tif (pAd->MacTab.Content[Wcid].Sst == SST_ASSOC)\n\t\t; /* okay to receive this DATA frame */\n\telse if (pAd->MacTab.Content[Wcid].Sst == SST_AUTH)\n\t{\n\t\tAPCls3errAction(pAd, Wcid, pHeader);\n\t\treturn TRUE; \n\t}\n\telse\n\t{\n\t\tAPCls2errAction(pAd, Wcid, pHeader);\n\t\treturn TRUE; \n\t}\n\treturn FALSE;\n}\n\n/*\n  ========================================================================\n  Description:\n\tThis routine frees all packets in PSQ that's destined to a specific DA.\n\tBCAST/MCAST in DTIMCount=0 case is also handled here, just like a PS-POLL \n\tis received from a WSTA which has MAC address FF:FF:FF:FF:FF:FF\n  ========================================================================\n*/\nVOID APHandleRxPsPoll(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpAddr,\n\tIN\tUSHORT\t\t\tAid,\n    IN\tBOOLEAN\t\t\tisActive)\n{ \n\tPQUEUE_ENTRY\t  pEntry;\n\tPMAC_TABLE_ENTRY  pMacEntry;\n\tunsigned long\t\tIrqFlags;\n\n\t/*DBGPRINT(RT_DEBUG_TRACE,(\"rcv PS-POLL (AID=%d) from %02x:%02x:%02x:%02x:%02x:%02x\\n\", */\n\t/*\t  Aid, pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5])); */\n\n\tpMacEntry = &pAd->MacTab.Content[Aid];\n\tif (RTMPEqualMemory(pMacEntry->Addr, pAddr, MAC_ADDR_LEN))\n\t{\n\t\t/*\n\t\t\tSta is change to Power Active stat.\n\t\t\tReset ContinueTxFailCnt\n\t\t*/\n\t\tpMacEntry->ContinueTxFailCnt = 0;\n\n#ifdef UAPSD_SUPPORT\n        if (UAPSD_MR_IS_ALL_AC_UAPSD(isActive, pMacEntry))\n\t\t{\n\t\t\t/*\n\t\t\t\tIEEE802.11e spec.\n\t\t\t\t11.2.1.7 Receive operation for STAs in PS mode during the CP\n\t\t\t\tWhen a non-AP QSTA that is using U-APSD and has all ACs\n\t\t\t\tdelivery-enabled detects that the bit corresponding to its AID\n\t\t\t\tis set in the TIM, the non-AP QSTA shall issue a trigger frame\n\t\t\t\tor a PS-Poll frame to retrieve the buffered MSDU or management\n\t\t\t\tframes.\n\n\t\t\t\tWMM Spec. v1.1a 070601\n\t\t\t\t3.6.2\tU-APSD STA Operation\n\t\t\t\t3.6.2.3\tIn case one or more ACs are not\n\t\t\t\tdelivery-enabled ACs, the WMM STA may retrieve MSDUs and\n\t\t\t\tMMPDUs belonging to those ACs by sending PS-Polls to the WMM AP.\n\t\t\t\tIn case all ACs are delivery enabled ACs, WMM STA should only\n\t\t\t\tuse trigger frames to retrieve MSDUs and MMPDUs belonging to\n\t\t\t\tthose ACs, and it should not send PS-Poll frames.\n\n\t\t\t\tDifferent definitions in IEEE802.11e and WMM spec.\n\t\t\t\tBut we follow the WiFi WMM Spec.\n\t\t\t*/\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"All AC are UAPSD, can not use PS-Poll\\n\"));\n            return; /* all AC are U-APSD, can not use PS-Poll */\n        } /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t\t/*NdisAcquireSpinLock(&pAd->MacTabLock); */\n\t\t/*NdisAcquireSpinLock(&pAd->TxSwQueueLock); */\n        RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n        if (isActive == FALSE)\n        {\n\t\t\tif (pMacEntry->PsQueue.Head)\n\t\t\t{\n#ifdef UAPSD_SUPPORT\n\t\t\t\tUINT32 NumOfOldPsPkt;\n\t\t\t\tNumOfOldPsPkt = pAd->TxSwQueue[QID_AC_BE].Number;\n#endif /* UAPSD_SUPPORT */\n\n\t\t\t\tpEntry = RemoveHeadQueue(&pMacEntry->PsQueue);\n\t\t\t\tif ( pMacEntry->PsQueue.Number >=1 )\n\t\t\t\t\tRTMP_SET_PACKET_MOREDATA(RTPKT_TO_OSPKT(pEntry), TRUE);\n\t\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QID_AC_BE], pEntry);\n\n#ifdef UAPSD_SUPPORT\n\t\t\t\t/* we need to call RTMPDeQueuePacket() immediately as below */\n\t\t\t\tif (NumOfOldPsPkt != pAd->TxSwQueue[QID_AC_BE].Number)\n\t\t\t\t{\n\t\t\t\t\tif (RTMP_GET_PACKET_DHCP(RTPKT_TO_OSPKT(pEntry)) ||\n\t\t\t\t\t\tRTMP_GET_PACKET_EAPOL(RTPKT_TO_OSPKT(pEntry)) ||\n\t\t\t\t\t\tRTMP_GET_PACKET_WAI(RTPKT_TO_OSPKT(pEntry)))\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tThese packets will use 1M/6M rate to send.\n\t\t\t\t\t\t\tIf you use 1M(2.4G)/6M(5G) to send, no statistics\n\t\t\t\t\t\t\tcount in NICUpdateFifoStaCounters().\n\n\t\t\t\t\t\t\tSo we can not count it for UAPSD; Or the SP will\n\t\t\t\t\t\t\tnot closed until timeout.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\t;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tUAPSD_MR_MIX_PS_POLL_RCV(pAd, pMacEntry);\n\t\t\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tor transmit a (QoS) Null Frame;\n\n\t\t\t\t\tIn addtion, in Station Keep Alive mechanism, we need to\n\t\t\t\t\tsend a QoS Null frame to detect the station live status.\n\t\t\t\t*/\n\t\t\t\tBOOLEAN bQosNull = FALSE;\n\n\t\t\t\tif (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\tbQosNull = TRUE;\n\n\t            ApEnqueueNullFrame(pAd, pMacEntry->Addr, pMacEntry->CurrTxRate,\n    \t                           Aid, pMacEntry->apidx, bQosNull, TRUE, 0);\n\t\t\t}\n        }\n        else\n        {\n#ifdef UAPSD_SUPPORT\n\t\t\t/* deliver all queued UAPSD packets */\n            UAPSD_AllPacketDeliver(pAd, pMacEntry);\n\n\t\t\t/* end the SP if exists */\n\t\t\tUAPSD_MR_ENTRY_RESET(pAd, pMacEntry);\n#endif /* UAPSD_SUPPORT */\n\n\t\t\twhile(pMacEntry->PsQueue.Head)\n\t\t\t{\n\t\t\t\t\tpEntry = RemoveHeadQueue(&pMacEntry->PsQueue);\n\t\t\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QID_AC_BE], pEntry);\n\t\t\t} /* End of while */\n        } /* End of if */\n\n\t\t/*NdisReleaseSpinLock(&pAd->TxSwQueueLock); */\n\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\n\t\tif ((Aid > 0) && (Aid < MAX_LEN_OF_MAC_TABLE) &&\n\t\t\t(pMacEntry->PsQueue.Number == 0))\n\t\t{\n\t\t\t/* clear corresponding TIM bit because no any PS packet */\n\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pMacEntry->apidx, Aid);\n\t\t\tpMacEntry->PsQIdleCount = 0;\n\t\t}\n\n\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\n\t\t/*\n\t\t\tDequeue outgoing frames from TxSwQueue0..3 queue and process it\n\t\t\tTODO: 2004-12-27 it's not a good idea to handle \"More Data\" bit here. \n\t\t\t\tbecause the RTMPDeQueue process doesn't guarantee to de-queue the \n\t\t\t\tdesired MSDU from the corresponding TxSwQueue/PsQueue when QOS \n\t\t\t\tin-used. We should consider \"HardTransmt\" this MPDU using MGMT \n\t\t\t\tqueue or things like that.\n\t\t*/\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"rcv PS-POLL (AID=%d not match) from %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t  Aid, PRINT_MAC(pAddr)));\n\n\t}\n}\n\n\n/*\n\tdetect AC Category of trasmitting packets\n\tto turn AC0(BE) TX_OP (MAC reg 0x1300)\n*/\n/*static UCHAR is_on; */\nVOID detect_wmm_traffic(\n\tIN RTMP_ADAPTER *pAd, \n\tIN UCHAR UserPriority,\n\tIN UCHAR FlgIsOutput)\n{\n\t/* For BE & BK case and TxBurst function is disabled */\n\tif ((pAd->CommonCfg.bEnableTxBurst == FALSE) \n#ifdef DOT11_N_SUPPORT\n\t\t&& (pAd->CommonCfg.bRdg == FALSE)\n\t\t&& (pAd->CommonCfg.bRalinkBurstMode == FALSE)\n#endif /* DOT11_N_SUPPORT */\n\t\t&& (FlgIsOutput == 1)\n\t)\n\t{\n\t\tif (MapUserPriorityToAccessCategory[UserPriority] == QID_AC_BK)\n\t\t{\n\t\t\t/* has any BK traffic */\n\t\t\tif (pAd->flg_be_adjust == 0)\n\t\t\t{\n\t\t\t\t/* yet adjust */\n#ifdef RTMP_MAC_USB\n\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_AP_ENABLE_TX_BURST, NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t\t\t\tpAd->flg_be_adjust = 1;\n\t\t\t\tNdisGetSystemUpTime(&pAd->be_adjust_last_time);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"wmm> adjust be!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->flg_be_adjust != 0)\n\t\t\t{\n\t\t\t\tPQUEUE_HEADER pQueue;\n\n\t\t\t\t/* has adjusted */\n\t\t\t\tpQueue = &pAd->TxSwQueue[QID_AC_BK];\n\n\t\t\t\tif ((pQueue == NULL) ||\n\t\t\t\t\t((pQueue != NULL) && (pQueue->Head == NULL)))\n\t\t\t\t{\n\t\t\t\t\tULONG\tnow;\n\t\t\t\t\tNdisGetSystemUpTime(&now);\n\t\t\t\t\tif ((now - pAd->be_adjust_last_time) > TIME_ONE_SECOND)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* no any BK traffic */\n#ifdef RTMP_MAC_USB\n\t\t\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_AP_DISABLE_TX_BURST, NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t\t\t\t\t\tpAd->flg_be_adjust = 0;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"wmm> recover be!\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tNdisGetSystemUpTime(&pAd->be_adjust_last_time);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* count packets which priority is more than BE */\n\tif (UserPriority > 3)\n\t{\n\t\tpAd->OneSecondnonBEpackets++;\n\n\t\tif (pAd->OneSecondnonBEpackets > 100 \n#ifdef DOT11_N_SUPPORT\n\t\t\t&& pAd->MacTab.fAnyStationMIMOPSDynamic\n#endif /* DOT11_N_SUPPORT */\n\t\t)\n\t\t{\n\t\t\tif (!pAd->is_on)\n\t\t\t{\n#ifdef RTMP_MAC_USB\n\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_AP_ADJUST_EXP_ACK_TIME, NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t\t\t\tpAd->is_on = 1;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->is_on)\n\t\t\t{\n#ifdef RTMP_MAC_USB\n\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_AP_RECOVER_EXP_ACK_TIME, NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t\t\t\tpAd->is_on = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n\tWirte non-zero value to AC0 TXOP to boost performace\n\tTo pass WMM, AC0 TXOP must be zero.\n\tIt is necessary to turn AC0 TX_OP dynamically.\n*/\n\nVOID dynamic_tune_be_tx_op(RTMP_ADAPTER *pAd, ULONG nonBEpackets)\n{\n\tUINT32 RegValue;\n\tAC_TXOP_CSR0_STRUC csr0;\n\n\tif (pAd->CommonCfg.bEnableTxBurst \n#ifdef DOT11_N_SUPPORT\n\t\t|| pAd->CommonCfg.bRdg\n\t\t|| pAd->CommonCfg.bRalinkBurstMode\n#endif /* DOT11_N_SUPPORT */\n\t)\n\t{\n\n\t\tif (\n#ifdef DOT11_N_SUPPORT\n\t\t\t(pAd->WIFItestbed.bGreenField && pAd->MacTab.fAnyStationNonGF == TRUE) ||\n\t\t\t((pAd->OneSecondnonBEpackets > nonBEpackets) || pAd->MacTab.fAnyStationMIMOPSDynamic) || \n#endif /* DOT11_N_SUPPORT */\n\t\t\t(pAd->MacTab.fAnyTxOPForceDisable))\n\t\t{\n\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE))\n\t\t\t{\n\t\t\t\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &RegValue);\n\n\t\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE))\n\t\t\t\t{\n\t\t\t\t\tRegValue = pAd->CommonCfg.RestoreBurstMode;\n\t\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\t\t\t}\n\n\t\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE))\n\t\t\t\t{\n\t\t\t\t\tTX_LINK_CFG_STRUC   TxLinkCfg;\n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\t\t\t\t\tTxLinkCfg.field.TxRDGEn = 0;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\n\t\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\t\t}\n\t\t\t\t/* disable AC0(BE) TX_OP */\n\t\t\t\tRegValue  &= 0xFFFFFF00; /* for WMM test */\n\t\t\t\t/*if ((RegValue & 0x0000FF00) == 0x00004300) */\n\t\t\t\t/*\tRegValue += 0x00001100; */\n\t\t\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, RegValue);\n\t\t\t\tif (pAd->CommonCfg.APEdcaParm.Txop[QID_AC_VO] != 102)\n\t\t\t\t{\n\t\t\t\t\tcsr0.field.Ac0Txop = 0;\t\t/* QID_AC_BE */\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* for legacy b mode STA */\n\t\t\t\t\tcsr0.field.Ac0Txop = 10;\t\t/* QID_AC_BE */\n\t\t\t\t}\n\t\t\t\tcsr0.field.Ac1Txop = 0;\t\t/* QID_AC_BK */\n\t\t\t\tRTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);\n\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE);\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE)==0)\n\t\t\t{\n\t\t\t\t/* enable AC0(BE) TX_OP */\n\t\t\t\tUCHAR\ttxop_value_burst = 0x20;\t/* default txop for Tx-Burst */\n\t\t\t\tUCHAR   txop_value;\n\n#ifdef LINUX\n#endif /* LINUX */\n\n\t\t\t\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &RegValue);\n\t\t\t\t\n\t\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE))\n\t\t\t\t\ttxop_value = 0x80;\t\t\t\t\n\t\t\t\telse if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE))\n\t\t\t\t\ttxop_value = 0x80;\n\t\t\t\telse if (pAd->CommonCfg.bEnableTxBurst)\n\t\t\t\t\ttxop_value = txop_value_burst;\n\t\t\t\telse\n\t\t\t\t\ttxop_value = 0;\n\n\t\t\t\tRegValue  &= 0xFFFFFF00;\n\t\t\t\t/*if ((RegValue & 0x0000FF00) == 0x00005400)\n\t\t\t\t\tRegValue -= 0x00001100; */\n\t\t\t\t/*txop_value = 0; */\n\t\t\t\tRegValue  |= txop_value;  /* for performance, set the TXOP to non-zero */\n\t\t\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, RegValue);\n\t\t\t\tcsr0.field.Ac0Txop = txop_value;\t/* QID_AC_BE */\n\t\t\t\tcsr0.field.Ac1Txop = 0;\t\t\t\t/* QID_AC_BK */\n\t\t\t\tRTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);\n\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE);\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\tpAd->OneSecondnonBEpackets = 0;\n}\n\n\nVOID APRxDErrorHandle(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk)\n{\n\tMAC_TABLE_ENTRY *pEntry;\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\t\n\tif (pRxInfo->CipherErr)\n\t\tINC_COUNTER64(pAd->WlanCounters.WEPUndecryptableCount);\n\n\tif (pRxInfo->U2M && pRxInfo->CipherErr)\n\t{\t\t\n\t\tif (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)\n\t\t{\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT \n\t\t\tPCIPHER_KEY pWpaKey;\n\t\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\t\tUCHAR FromWhichBSSID = BSS0;\n\t\t\tUCHAR Wcid;\n\t\t\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\n\t\t\tWcid = pRxWI->RxWIWirelessCliID;\n\t\t\tif (VALID_WCID(Wcid))\n\t\t\t\t\tpEntry = ApCliTableLookUpByWcid(pAd, Wcid, pHeader->Addr2);\n\t\t\telse\n\t\t\t\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\n\t\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t{\t\t\t\n\t\t\t\tFromWhichBSSID = pEntry->MatchAPCLITabIdx + MIN_NET_DEVICE_FOR_APCLI;\n\t\t\t\t\n\n\n\t\t\t\t\tif (pRxInfo->CipherErr == 2)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tpWpaKey = &pEntry->PairwiseKey;\n\t\t\t                                   \n\t\t\t           \t\t if (pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].WpaSupplicantUP)\n\t\t\t\t\t\t\t\tWpaSendMicFailureToWpaSupplicant(pAd->net_dev,\n\t\t\t\t\t\t\t\t\t\t\t\t (pWpaKey->Type == PAIRWISEKEY) ? TRUE : FALSE);\n\t\t\t           \t\t if (((pRxInfo->CipherErr & 2) == 2) && INFRA_ON(pAd))\n\t\t\t                \t\tRTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pEntry->Addr, FromWhichBSSID, 0);\n\n\t\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"Rx MIC Value error\\n\"));\n\t\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ \n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\t\t/*\n\t\t\t\tMIC error\n\t\t\t\tBefore verifying the MIC, the receiver shall check FCS, ICV and TSC.\n\t\t\t\tThis avoids unnecessary MIC failure events.\n\t\t\t*/\n\t\t\tif ((pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t\t&& (pRxInfo->CipherErr == 2))\n\t\t\t{\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\tif(pAd->ApCfg.MBSSID[pEntry->apidx].Hostapd == TRUE)\n\t\t\t\t{\n\t\t\t\t\tieee80211_notify_michael_failure(pAd, pRxBlk->pHeader, (UINT32) pRxWI->RxWIKeyIndex, 0);\n\t\t\t\t}\n\t      \t\t\telse\n#endif/*HOSTAPD_SUPPORT*/\n      \t\t\t\t{\n      \t\t\t\tRTMP_HANDLE_COUNTER_MEASURE(pAd, pEntry);\n      \t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* send wireless event - for icv error */\n\t\t\tif ((pRxInfo->CipherErr & 1) == 1)\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG, pEntry->Addr, 0, 0); \n\t\t}\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx u2me Cipher Err(MPDUsize=%d, WCID=%d, CipherErr=%d)\\n\", \n\t\t\t\t\tpRxWI->RxWIMPDUByteCnt, pRxWI->RxWIWirelessCliID, pRxInfo->CipherErr));\n\n\t}\n\n\tpAd->Counters8023.RxErrors++;\n\t/* DBGPRINT(RT_DEBUG_TRACE, (\"<--APRxDErrorHandle\\n\")); */\n}\n\nstatic int dump_next_valid = 0;\nBOOLEAN APCheckVaildDataFrame(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tBOOLEAN isVaild = FALSE;\n\n\tdo\n\t{\n#ifndef APCLI_SUPPORT\n\t\t/* should not drop Ap-Client packet. */\n\t\tif (pHeader->FC.ToDs == 0)\n\t\t\tbreak; /* give up this frame */\n#endif /* APCLI_SUPPORT */\n\t\n\t\t/* check if Class2 or 3 error */\n\t\tif ((pHeader->FC.FrDs == 0) && (APCheckClass2Class3Error(pAd, pRxWI->RxWIWirelessCliID, pHeader))) \n\t\t\tbreak; /* give up this frame */\n\n//+++Add by shiang for debug\n\t\tif (pRxWI->RxWIWirelessCliID >= MAX_LEN_OF_MAC_TABLE) {\n\t\t\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n#ifdef RLT_MAC\n#ifndef MT7601\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"ErrWcidPkt: seq=%d, ts=0x%02x%02x%02x%02x\\n\",\n\t\t\t\t\t\t\t\t\tpHeader->Sequence,\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[0],\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[1],\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[2],\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[3]));\n#endif /* MT7601 */\n#endif /* RLT_MAC */\t\t\n\t\t\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\t\tif (pEntry && (pEntry->Sst == SST_ASSOC) && IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\tpRxWI->RxWIWirelessCliID = pEntry->Aid;\n\n\t\t\t\tdump_next_valid = 1;\n\t\t}\n\t\telse if (dump_next_valid)\n\t\t{\n#ifdef RLT_MAC\n#ifndef MT7601\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"NextValidWcidPkt: seq=%d, ts=0x%02x%02x%02x%02x\\n\",\n\t\t\t\t\t\t\t\t\tpHeader->Sequence,\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[0],\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[1],\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[2],\n\t\t\t\t\t\t\t\t\tpRxBlk->pRxWI->RXWI_N.rssi[3]));\n#endif /* MT7601 */\n#endif /* RLT_MAC */\t\t\n\t\t\t\tdump_next_valid = 0;\n\t\t}\n//---Add by shiang for debug\n\n\t\tif(pAd->ApCfg.BANClass3Data == TRUE)\n\t\t\tbreak; /* give up this frame */\n\n\t\tisVaild = TRUE;\n\t} while (0);\n\n\treturn isVaild;\n}\n\n/* For TKIP frame, calculate the MIC value */\nBOOLEAN APCheckTkipMICValue(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk)\n{\n\tPHEADER_802_11\tpHeader = pRxBlk->pHeader;\n\tUCHAR\t\t\t*pData = pRxBlk->pData;\n\tUSHORT\t\t\tDataSize = pRxBlk->DataSize;\n\tUCHAR\t\t\tUserPriority = pRxBlk->UserPriority;\n\tPCIPHER_KEY\t\tpWpaKey;\n\tUCHAR\t\t\t*pDA, *pSA;\n\n\tpWpaKey = &pEntry->PairwiseKey;\n\n\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS))\n\t{\n\t\tpDA = pHeader->Addr3;\n\t\tpSA = (PUCHAR)pHeader + sizeof(HEADER_802_11);\n\t}\n\telse if (RX_BLK_TEST_FLAG(pRxBlk, fRX_APCLI))\n\t{\n\t\tpDA = pHeader->Addr1;\n\t\tpSA = pHeader->Addr3;\t\t\n\t}\n\telse \n\t{\n\t\tpDA = pHeader->Addr3;\n\t\tpSA = pHeader->Addr2;\n\t}\n\n\tif (RTMPTkipCompareMICValue(pAd,\n\t\t\t\t\t\t\t\tpData,\n\t\t\t\t\t\t\t\tpDA,\n\t\t\t\t\t\t\t\tpSA,\n\t\t\t\t\t\t\t\tpWpaKey->RxMic,\n\t\t\t\t\t\t\t\tUserPriority,\n\t\t\t\t\t\t\t\tDataSize) == FALSE)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"Rx MIC Value error 2\\n\"));\n\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry) && pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].WpaSupplicantUP)\n\t\t{\n\t\t\tWpaSendMicFailureToWpaSupplicant(pAd->net_dev,\n\t\t\t\t\t\t\t (pWpaKey->Type ==\n\t\t\t\t\t\t\t  PAIRWISEKEY) ? TRUE :\n\t\t\t\t\t\t\t FALSE);\n\t\t}\n\t\telse \n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n\t\t{\n\t\t\tRTMP_HANDLE_COUNTER_MEASURE(pAd, pEntry);\n\t\t}\n\n\t\t/* release packet */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\nVOID APHandleRxMgmtFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\n\tdo\n\t{\n\n\n#ifdef IDS_SUPPORT\t\n\t\t/* Check if a rogue AP impersonats our mgmt frame to spoof clients */\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t\tif (RTMPSpoofedMgmtDetection(pAd, pHeader, pRxWI->RxWISNR2, 0, 0, pRxWI->RxWISNR1))\n\t\t\t{\n\t\t\t\t/* This is a spoofed frame, so give up it. */\n\t\t\t\tbreak;\n\t\t\t}\n\t\telse\n#endif /* MT7601 */\n\t\t\tif (RTMPSpoofedMgmtDetection(pAd, pHeader, pRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2, 0))\n\t\t\t{\n\t\t\t\t/* This is a spoofed frame, so give up it. */\n\t\t\t\tbreak;\n\t\t\t}\n#endif /* IDS_SUPPORT */\n\n#ifdef IDS_SUPPORT\n\t\t/* update sta statistics for traffic flooding detection later */\n\t\tRTMPUpdateStaMgmtCounter(pAd, pHeader->FC.SubType);\n#endif /* IDS_SUPPORT */\n\t\t\t\n\t\tif (!pRxInfo->U2M)\n\t\t{\n\t\t\tif ((pHeader->FC.SubType != SUBTYPE_BEACON) && (pHeader->FC.SubType != SUBTYPE_PROBE_REQ))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\n\t\tif (pAd->ApCfg.BANClass3Data == TRUE)\n\t\t{\n\t\t\t/* disallow new association */\n\t\t\tif ((pHeader->FC.SubType == SUBTYPE_ASSOC_REQ) || (pHeader->FC.SubType == SUBTYPE_AUTH))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Disallow new Association\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* Software decrypts WEP data during shared WEP negotiation */\n\t\tif ((pHeader->FC.SubType == SUBTYPE_AUTH) && \n\t\t\t(pHeader->FC.Wep == 1) && (pRxInfo->Decrypted == 0))\n\t\t{\n\t\t\tPUCHAR\tpMgmt = (PUCHAR)pHeader;\n\t\t\tUINT16\tmgmt_len = pRxWI->RxWIMPDUByteCnt;\n\t\t\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\t\t\t/* Skip 802.11 headre */\n\t\t\tpMgmt += LENGTH_802_11;\n\t\t\tmgmt_len -= LENGTH_802_11;\n\n\t\t\tif (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)\n\t\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\t\tif (pEntry == NULL)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: SW decrypt WEP data fails - the Entry is empty.\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* handle WEP decryption */\n\t\t\tif (RTMPSoftDecryptWEP(pAd, \n\t\t\t\t\t\t\t\t   &pAd->SharedKey[pEntry->apidx][pRxWI->RxWIKeyIndex], \n\t\t\t\t\t\t\t\t   pMgmt, \n\t\t\t\t\t\t\t\t   &mgmt_len) == FALSE)\t\t\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: SW decrypt WEP data fails.\\n\"));\t\n\t\t\t\t/* give up this frame */\n\t\t\t\tbreak;\n\t\t\t}\n#ifdef RT_BIG_ENDIAN\n\t\t\t/* swap 16 bit fields - Auth Alg No. field */\n\t\t\t*(USHORT *)pMgmt = SWAP16(*(USHORT *)pMgmt);\n\n\t\t\t/* swap 16 bit fields - Auth Seq No. field */\n\t\t\t*(USHORT *)(pMgmt + 2) = SWAP16(*(USHORT *)(pMgmt + 2));\n\n\t\t\t/* swap 16 bit fields - Status Code field */\n\t\t\t*(USHORT *)(pMgmt + 4) = SWAP16(*(USHORT *)(pMgmt + 4));\n#endif /* RT_BIG_ENDIAN */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Decrypt AUTH seq#3 successfully\\n\"));\t\n\n\t\t\t/* Update the total length */\n\t\t\tpRxWI->RxWIMPDUByteCnt -= (LEN_WEP_IV_HDR + LEN_ICV);\t\t\t\n\t\t}\n\n\t\tif (pRxBlk->DataSize > MAX_RX_PKT_LEN)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DataSize=%d\\n\", pRxBlk->DataSize));\n\t\t\thex_dump(\"MGMT ???\", (UCHAR *)pHeader, pRxBlk->pData - (UCHAR *) pHeader);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pHeader->FC.SubType == SUBTYPE_ACTION)\n\t\t{\n\t\t\t/* only PM bit of ACTION frame can be set */\n\t\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\t\t\tpEntry = PACInquiry(pAd, pRxWI->RxWIWirelessCliID);\n\t\t\tif (pEntry != NULL)\n\t\t\t   \tAPPsIndicate(pAd, pHeader->Addr2, pEntry->Aid, pHeader->FC.PwrMgmt);\n\n\t\t\t/*\n\t\t\t\tIn IEEE802.11, 11.2.1.1 STA Power Management modes,\n\t\t\t\tThe Power Managment bit shall not be set in any management\n\t\t\t\tframe, except an Action frame.\n\t\t\t*/\n\t\t\t/* In IEEE802.11e, 11.2.1.4 Power management with APSD,\n\t\t\t\tIf there is no unscheduled SP in progress, the unscheduled SP\n\t\t\t\tbegins when the QAP receives a trigger frame from a non-AP QSTA,\n\t\t\t\twhich is a QoS data or QoS Null frame associated with an AC the\n\t\t\t\tSTA has configured to be trigger-enabled. */\n\t\t\t/* So a management action frame is not trigger frame */\n\t\t}\n\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t{\n\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pHeader,\n\t\t\t\t\t\t\tpRxWI->RxWIMPDUByteCnt,\n\t\t\t\t\t\t\tpRxWI->RxWISNR2, 0,\n\t\t\t\t\t\t\t0, 0, pRxWI->RxWISNR1, OPMODE_AP);\n\t\t}\n\t\telse\n#endif /* MT7601 */\n\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pHeader,\n\t\t\t\t\t\t\tpRxWI->RxWIMPDUByteCnt,\n\t\t\t\t\t\t\tpRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1,\n\t\t\t\t\t\t\tpRxWI->RxWIRSSI2, 0, 0, OPMODE_AP);\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t{\n\t\t\tpRxBlk->pData += LENGTH_802_11;\n\t\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\t\t\tif (pHeader->FC.Order)\n\t\t\t{\n\t\t\t\thandleHtcField(pAd, pRxBlk);\n\t\t\t\tpRxBlk->pData += 4;\n\t\t\t\tpRxBlk->DataSize -= 4;\n\t\t\t}\n\n\t\t\t/* Check for compressed or non-compressed Sounding Response */\n\t\t\tif (((pHeader->FC.SubType == SUBTYPE_ACTION) || (pHeader->FC.SubType == SUBTYPE_ACTION_NO_ACK)) \n\t\t\t\t&& (pRxBlk ->pData)[0] == CATEGORY_HT \n\t\t\t\t&& ((pRxBlk ->pData)[1] == MIMO_N_BEACONFORM || (pRxBlk ->pData)[1] == MIMO_BEACONFORM)\n\t\t\t)\n\t\t\t{\n\t\t\t\thandleBfFb(pAd, pRxBlk);\n\t\t\t}\n\t\t}\n#endif /* TXBF_SUPPORT */\n\t} while (0);\n\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\treturn;\n}\n\nVOID APHandleRxControlFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk)\n{\n\tPHEADER_802_11\tpHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET\tpRxPacket = pRxBlk->pRxPacket;\n\n\tswitch (pHeader->FC.SubType)\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tcase SUBTYPE_BLOCK_ACK_REQ:\n\t\t\t{\n\t\t\t\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\t\t\t\tCntlEnqueueForRecv(pAd, pRxWI->RxWIWirelessCliID, (pRxWI->RxWIMPDUByteCnt), (PFRAME_BA_REQ)pHeader);\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\t/* handle PS-POLL here */\n\t\tcase SUBTYPE_PS_POLL:\n\t\t\t{\n\t\t\t\tUSHORT Aid = pHeader->Duration & 0x3fff;\n\t\t\t\tPUCHAR pAddr = pHeader->Addr2;\n\n\t\t\t\tif (Aid < MAX_LEN_OF_MAC_TABLE)\n\t\t\t\t\tAPHandleRxPsPoll(pAd, pAddr, Aid, FALSE);\n\t\t\t}\n\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\tcase SUBTYPE_BLOCK_ACK:\n#endif /* DOT11_N_SUPPORT */\n\t\tcase SUBTYPE_ACK:\n\t\tdefault:\t\t\n\t\t\tbreak;\n\t}\n\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\treturn;\n}\n\nVOID APRxEAPOLFrameIndicate(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tBOOLEAN \t\tCheckPktSanity = TRUE;\n\tUCHAR\t\t\t*pTmpBuf;\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\tINT eapcode;\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\tdo\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n\t} while (FALSE);\n\n\t/* Sanity Check */\n\tif(pRxBlk->DataSize < (LENGTH_802_1_H + LENGTH_EAPOL_H))\n\t{\n\t\tCheckPktSanity = FALSE;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Total pkts size is too small.\\n\"));\n\t}\t\n\telse if (!RTMPEqualMemory(SNAP_802_1H, pRxBlk->pData, 6))\n\t{\n\t\tCheckPktSanity = FALSE;\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can't find SNAP_802_1H parameter.\\n\"));\n\t}\t \n\telse if (!RTMPEqualMemory(EAPOL, pRxBlk->pData+6, 2))\n\t{\n\t\tCheckPktSanity = FALSE;\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can't find EAPOL parameter.\\n\"));\t\n\t}\t\n\telse if(*(pRxBlk->pData+9) > EAPOLASFAlert)\n\t{\n\t\tCheckPktSanity = FALSE;\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Unknown EAP type(%d).\\n\", *(pRxBlk->pData+9)));\t\n\t}\n\n\tif(CheckPktSanity == FALSE)\n\t{\n\t\tgoto done;\n\t}\n\n\n\t\n#ifdef HOSTAPD_SUPPORT\n\tif ((pEntry) && pAd->ApCfg.MBSSID[pEntry->apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Indicate_Legacy_Packet\\n\"));\n\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n#endif/*HOSTAPD_SUPPORT*/\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\tif (IS_ENTRY_APCLI(pEntry))\n\t{\n\t\teapcode=ApcliWpaCheckEapCode(pAd, pRxBlk->pData, pRxBlk->DataSize, LENGTH_802_1_H);\n\t\tprintk(\"eapcode=%d\\n\",eapcode);\n\t\tif ( pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].WpaSupplicantUP && \n\t\t\tpAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].IEEE8021X == TRUE &&\n\t\t(EAP_CODE_SUCCESS == eapcode))\n\t\t{\n\t\t\t\tPUCHAR\tKey; \t\t\t\n\t\t\t\tUCHAR \tCipherAlg;\n\t\t\t\tint     idx = 0;\n\t\t\t\tint BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + pEntry->MatchAPCLITabIdx;\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"Receive EAP-SUCCESS Packet\\n\"));\n\t\t\t\t/* pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */\n\t\t\t\t/* STA_PORT_SECURED(pAd); */\n\t\t\t\tpEntry->PortSecured=WPA_802_1X_PORT_SECURED;\n\t\t\t\tpEntry->PrivacyFilter=Ndis802_11PrivFilterAcceptAll;\n                if (pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].IEEE8021x_required_keys == FALSE)\n                {\n                    idx = pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKeyId;\n                    CipherAlg = pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx].CipherAlg;\n\t\t\t\t\tKey = pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx].Key;\n                    \n                    if (pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx].KeyLen > 0)\n    \t\t\t\t{\n\t\t\t\t\t\t/* Set key material and cipherAlg to Asic */\n\t\t\t\t\t\tRTMP_ASIC_SHARED_KEY_TABLE(pAd,BssIdx, idx, &pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx]);\n\n\t\t\t\t\t\t/* STA doesn't need to set WCID attribute for group key */\n\t\t\t\t\t\t/* Assign pairwise key info */\n\t\t\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd, BssIdx, idx, CipherAlg, pEntry->Aid, SHAREDKEYTABLE);\n\n\t\t\t\t\t\t/* RTMP_IndicateMediaState(pAd, NdisMediaStateConnected); */\n                       \t/* pAd->ExtraInfo = GENERAL_LINK_UP; */\n\t\t\t\t\t\t        \n\t\t\t\t\t\t/*  For Preventing ShardKey Table is cleared by remove key procedure. */\n    \t\t\t\t\tpAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].SharedKey[idx].CipherAlg = CipherAlg;\n\t\t\t\t\t\tpAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].SharedKey[idx].KeyLen = pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx].KeyLen;\n\t\t\t\t\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].SharedKey[idx].Key, \n\t\t\t\t\t\t\t\t\t   pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx].Key, \n\t\t\t\t\t\t\t\t\t   pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesireSharedKey[idx].KeyLen);\n    \t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\tif(pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].WpaSupplicantUP && \n\t\t\t((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2) || pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].IEEE8021X == TRUE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Indicate_Legacy_Packet\\n\"));\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\n\t}\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n#ifdef DOT1X_SUPPORT\n\t/* sent this frame to upper layer TCPIP */\n\tif ((pEntry) && (pEntry->WpaState < AS_INITPMK) && \n\t\t((pEntry->AuthMode == Ndis802_11AuthModeWPA) || \n\t\t((pEntry->AuthMode == Ndis802_11AuthModeWPA2) && (pEntry->PMKID_CacheIdx == ENTRY_NOT_FOUND)) || \n\t\tpAd->ApCfg.MBSSID[pEntry->apidx].IEEE8021X == TRUE))\n\t{\n#ifdef WSC_AP_SUPPORT                                \n\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscConfMode != WSC_DISABLE) &&\n            (!MAC_ADDR_EQUAL(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, ZERO_MAC_ADDR)))\n\t\t{\n\t\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n#ifdef MT7601\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t{\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pTmpBuf, pRxBlk->DataSize + LENGTH_802_11, pRxWI->RxWISNR2, 0, 0, 0, pRxWI->RxWISNR1, OPMODE_AP);\n\t\t\t}\n\t\t\telse\n#endif /* MT7601 */\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pTmpBuf, pRxBlk->DataSize + LENGTH_802_11, pRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2, 0, 0, OPMODE_AP);\n            pRxBlk->pHeader = (PHEADER_802_11)pTmpBuf;\n\t\t}       \n#endif /* WSC_AP_SUPPORT */\n\n\n\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn; \n\t}\n\telse\t/* sent this frame to WPA state machine */\n#endif /* DOT1X_SUPPORT */\t\n\t{\n\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n#ifdef MT7601\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t{\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pTmpBuf, pRxBlk->DataSize + LENGTH_802_11, pRxWI->RxWISNR2, 0, 0, 0, pRxWI->RxWISNR1, OPMODE_AP);\n\t\t\t}\n\t\t\telse\n#endif /* MT7601 */\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pTmpBuf, pRxBlk->DataSize + LENGTH_802_11, pRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2, 0, 0, OPMODE_AP);\n\t}\n\ndone:\n\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\treturn;\n\n}\n\nVOID Announce_or_Forward_802_3_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tif (APFowardWirelessStaToWirelessSta(pAd, pPacket, FromWhichBSSID))\n\t{\n\t\tannounce_802_3_packet(pAd, pPacket,OPMODE_AP);\n\t}\n\telse\n\t{\n\t\t/* release packet */\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t}\n}\n\n\nVOID APRxDataFrameAnnounce(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\n\t/* non-EAP frame */\n\tif (!RTMPCheckWPAframe(pAd, pEntry, pRxBlk->pData, pRxBlk->DataSize, FromWhichBSSID))\n\t{\n#ifdef WAPI_SUPPORT\n\t\t/* report to upper layer if the received frame is WAI frame */\n\t\tif (RTMPCheckWAIframe(pRxBlk->pData, pRxBlk->DataSize))\n\t\t{\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\t\t\t\n#endif /* WAPI_SUPPORT */\n\n\t\t/* \t\n\t\t\tdrop all non-EAP DATA frame before\n\t\t\tthis client's Port-Access-Control is secured\n\t\t */\n\t\tif (pEntry->PrivacyFilter == Ndis802_11PrivFilter8021xWEP)\n\t\t{\n\t\t\t/*  \t\t\t\t\n\t\t\t\tIf\t1) no any EAP frame is received within 5 sec and \n\t\t\t\t\t2) an encrypted non-EAP frame from peer associated STA is received,\n\t\t\t\tAP would send de-authentication to this STA.\n\t\t\t */\n\t\t\tif (IS_ENTRY_CLIENT(pEntry) && pRxBlk->pHeader->FC.Wep && \n\t\t\t\tpEntry->StaConnectTime > 5 && pEntry->WpaState < AS_AUTHENTICATION2)\n\t\t\t{\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"==> De-Auth this STA(%02x:%02x:%02x:%02x:%02x:%02x)\\n\", PRINT_MAC(pEntry->Addr)));\t\n\t\t\t\tMlmeDeAuthAction(pAd, pEntry, REASON_NO_LONGER_VALID, FALSE);\n\t\t\t}\n\t\t\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\n#ifdef IGMP_SNOOP_SUPPORT\n\t\tif (pEntry\n\t\t\t&& (IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_WDS(pEntry))\n\t\t\t&& (pAd->ApCfg.IgmpSnoopEnable) \n\t\t\t&& IS_MULTICAST_MAC_ADDR(pRxBlk->pHeader->Addr3))\n\t\t{\n\t\t\tPUCHAR pDA = pRxBlk->pHeader->Addr3;\n\t\t\tPUCHAR pSA = pRxBlk->pHeader->Addr2;\n\t\t\tPUCHAR pData = NdisEqualMemory(SNAP_802_1H, pRxBlk->pData, 6) ? (pRxBlk->pData + 6) : pRxBlk->pData;\n\t\t\tUINT16 protoType = OS_NTOHS(*((UINT16 *)(pData)));\n\n\t\t\tif (protoType == ETH_P_IP)\n\t\t\t\tIGMPSnooping(pAd, pDA, pSA, pData, get_netdev_from_bssid(pAd, FromWhichBSSID));\n\t\t\telse if (protoType == ETH_P_IPV6)\n\t\t\t\tMLDSnooping(pAd, pDA, pSA,  pData, get_netdev_from_bssid(pAd, FromWhichBSSID));\n\t\t}\n#endif /* IGMP_SNOOP_SUPPORT */\n\n#ifdef STATS_COUNT_SUPPORT\n\t\tif (pEntry\n\t\t\t&& (IS_ENTRY_CLIENT(pEntry))\n\t\t\t&& (pEntry->pMbss))\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = pEntry->pMbss;\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pRxBlk->pHeader->Addr3) || IS_MULTICAST_MAC_ADDR(pRxBlk->pHeader->Addr1))\n\t\t\t{\n\t\t\t\t\tpMbss->mcPktsRx++;\n\t\t\t}\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pRxBlk->pHeader->Addr3) || IS_BROADCAST_MAC_ADDR(pRxBlk->pHeader->Addr1))\n\t\t\t{\n\t\t\t\t\tpMbss->bcPktsRx++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\tpMbss->ucPktsRx++;\n\t\t\t}\n\t\t}\n#endif /* STATS_COUNT_SUPPORT */\n\t\tRX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP);\n\t\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK))\n\t\t{\n\t\t\t/* Normal legacy, AMPDU or AMSDU */\n\t\t\tCmmRxnonRalinkFrameIndicate(pAd, pRxBlk, FromWhichBSSID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* ARALINK */\n\t\t\tCmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t}\n\t}\n\telse \n\t{\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_EAP);\n\n\t\t/* Update the WPA STATE to indicate the EAP handshaking is started */\n\t\tif (pEntry->WpaState == AS_AUTHENTICATION)\n\t\t\tpEntry->WpaState = AS_AUTHENTICATION2;\n\t\t\n#ifdef DOT11_N_SUPPORT\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) \n\t\t{\t\t\t\n\t\t\tIndicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t} \n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\t/* Determin the destination of the EAP frame */\n\t\t\t/*  to WPA state machine or upper layer */\n\t\t\tAPRxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t}\n\t}\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID APRxDataFrameAnnounce_Hdr_Trns(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\n\t/* non-EAP frame */\n\tif (!RTMPCheckWPAframe_Hdr_Trns(pAd, pEntry, pRxBlk->pTransData, pRxBlk->TransDataSize, FromWhichBSSID))\n\t{\n#ifdef WAPI_SUPPORT\n\t\t/* report to upper layer if the received frame is WAI frame */\n\t\tif (RTMPCheckWAIframe(pRxBlk->pData, pRxBlk->DataSize))\n\t\t{\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\t\t\t\n#endif /* WAPI_SUPPORT */\n\n\t\t/* \t\n\t\t\tdrop all non-EAP DATA frame before\n\t\t\tthis client's Port-Access-Control is secured\n\t\t */\n\t\tif (pEntry->PrivacyFilter == Ndis802_11PrivFilter8021xWEP)\n\t\t{\n\t\t\t/*  \t\t\t\t\n\t\t\t\tIf\t1) no any EAP frame is received within 5 sec and \n\t\t\t\t\t2) an encrypted non-EAP frame from peer associated STA is received,\n\t\t\t\tAP would send de-authentication to this STA.\n\t\t\t */\n\t\t\tif (IS_ENTRY_CLIENT(pEntry) && pRxBlk->pHeader->FC.Wep && \n\t\t\t\tpEntry->StaConnectTime > 5 && pEntry->WpaState < AS_AUTHENTICATION2)\n\t\t\t{\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"==> De-Auth this STA(%02x:%02x:%02x:%02x:%02x:%02x)\\n\", PRINT_MAC(pEntry->Addr)));\t\n\t\t\t\tMlmeDeAuthAction(pAd, pEntry, REASON_NO_LONGER_VALID, FALSE);\n\t\t\t}\n\t\t\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\n#ifdef IGMP_SNOOP_SUPPORT\n\t\tif (pEntry\n\t\t\t&& (IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_WDS(pEntry))\n\t\t\t&& (pAd->ApCfg.IgmpSnoopEnable) \n\t\t\t&& IS_MULTICAST_MAC_ADDR(pRxBlk->pHeader->Addr3))\n\t\t{\n\t\t\tPUCHAR pDA = pRxBlk->pHeader->Addr3;\n\t\t\tPUCHAR pSA = pRxBlk->pHeader->Addr2;\n\t\t\tPUCHAR pData = NdisEqualMemory(SNAP_802_1H, pRxBlk->pData, 6) ? (pRxBlk->pData + 6) : pRxBlk->pData;\n\t\t\tUINT16 protoType = OS_NTOHS(*((UINT16 *)(pData)));\n\n\t\t\tif (protoType == ETH_P_IP)\n\t\t\t\tIGMPSnooping(pAd, pDA, pSA, pData, get_netdev_from_bssid(pAd, FromWhichBSSID));\n\t\t\telse if (protoType == ETH_P_IPV6)\n\t\t\t\tMLDSnooping(pAd, pDA, pSA,  pData, get_netdev_from_bssid(pAd, FromWhichBSSID));\n\t\t}\n#endif /* IGMP_SNOOP_SUPPORT */\n\n#ifdef STATS_COUNT_SUPPORT\n\t\tif (pEntry\n\t\t\t&& (IS_ENTRY_CLIENT(pEntry))\n\t\t\t&& (pEntry->pMbss))\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = pEntry->pMbss;\n\t\t\tif(IS_MULTICAST_MAC_ADDR(pRxBlk->pHeader->Addr3) || IS_MULTICAST_MAC_ADDR(pRxBlk->pHeader->Addr1))\n\t\t\t{\n\t\t\t\t\tpMbss->mcPktsRx++;\n\t\t\t}\n\t\t\telse if(IS_BROADCAST_MAC_ADDR(pRxBlk->pHeader->Addr3) || IS_BROADCAST_MAC_ADDR(pRxBlk->pHeader->Addr1))\n\t\t\t{\n\t\t\t\t\tpMbss->bcPktsRx++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\tpMbss->ucPktsRx++;\n\t\t\t}\n\t\t}\n#endif /* STATS_COUNT_SUPPORT */\n\t\tRX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP);\n\t\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK))\n\t\t{\n\t\t\t/* Normal legacy, AMPDU or AMSDU */\n\t\t\tCmmRxnonRalinkFrameIndicate_Hdr_Trns(pAd, pRxBlk, FromWhichBSSID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* ARALINK */\n\t\t\tCmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t}\n\t}\n\telse \n\t{\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_EAP);\n\n\t\t/* Update the WPA STATE to indicate the EAP handshaking is started */\n\t\tif (pEntry->WpaState == AS_AUTHENTICATION)\n\t\t\tpEntry->WpaState = AS_AUTHENTICATION2;\n\t\t\n#ifdef DOT11_N_SUPPORT\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) \n\t\t{\t\t\t\n\t\t\tIndicate_AMPDU_Packet_Hdr_Trns(pAd, pRxBlk, FromWhichBSSID);\n\t\t} \n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\t/* Determin the destination of the EAP frame */\n\t\t\t/*  to WPA state machine or upper layer */\n\t\t\tAPRxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t}\n\t}\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\n\n/*\n\tAll Rx routines use RX_BLK structure to hande rx events\n\tIt is very important to build pRxBlk attributes\n\t\t1. pHeader pointer to 802.11 Header\n\t\t2. pData pointer to payload including LLC (just skip Header)\n\t\t3. set payload size including LLC to DataSize\n\t\t4. set some flags with RX_BLK_SET_FLAG()\n*/\nVOID APHandleRxDataFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk)\n{\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tHEADER_802_11 *pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tBOOLEAN bFragment = FALSE;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tUCHAR FromWhichBSSID = BSS0;\n\tUCHAR OldPwrMgmt = PWR_ACTIVE;\t/* UAPSD AP SUPPORT */\n\tUCHAR UserPriority = 0;\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\tBOOLEAN bWdsPacket = FALSE;\n#endif /* WDS_SUPPORT || CLIENT_WDS */\n\tFRAME_CONTROL *pFmeCtrl = &pHeader->FC;\n\tCOUNTER_RALINK *pCounter = &pAd->RalinkCounters;\n\n//+++Add by shiang for debug\nif (0 /*!(pRxInfo->Mcast || pRxInfo->Bcast)*/){\n\tDBGPRINT(RT_DEBUG_OFF, (\"-->%s(%d): Dump Related Info!\\n\", __FUNCTION__, __LINE__));\n\tdump_rxinfo(pAd, pRxInfo);\n\thex_dump(\"DataFrameHeader\", (UCHAR *)pHeader, sizeof(HEADER_802_11));\n\thex_dump(\"DataFramePayload\", pRxBlk->pData , pRxBlk->DataSize);\n}\n//---Add by shiangf for debug\n\n\tif (APCheckVaildDataFrame(pAd, pRxBlk) != TRUE)\n\t{\n\t\tgoto err;\t\t\n\t}\n\n#ifdef IDS_SUPPORT\n\t/*\n\t\tReplay attack detection\n\t\tDetect a spoofed data frame from a rogue AP, ignore it.\n\t*/\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t\tif (pFmeCtrl->FrDs == 1 && \n\t\t\t(RTMPReplayAttackDetection(pAd, pHeader->Addr2, pRxWI->RxWISNR2, 0, 0, pRxWI->RxWISNR1, pRxWI->RxWIBW) == TRUE))\n\t\t{\n\t\t\tgoto err;\n\t\t}\n\telse\n#endif /* MT7601 */\n\t\tif (pFmeCtrl->FrDs == 1 && \n\t\t\t(RTMPReplayAttackDetection(pAd, pHeader->Addr2, pRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2, 0, 0) == TRUE))\n\t\t{\n\t\t\tgoto err;\n\t\t}\n#endif /* IDS_SUPPORT */\n\n\t/* handle WDS */\n\tif ((pFmeCtrl->FrDs == 1) && (pFmeCtrl->ToDs == 1))\n\t{\n\t\tdo\n\t\t{\n#ifdef CLIENT_WDS\n\t\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\tif (pEntry != NULL)\n\t\t\t{\n\t\t\t\tif (IS_ENTRY_CLIWDS(pEntry))\n\t\t\t\t\t;\n\t\t\t\telse if (IS_ENTRY_CLIENT(pEntry)\n\t\t\t\t\t\t&& (pEntry->Sst == SST_ASSOC))\n\t\t\t\t\tSET_ENTRY_CLIWDS(pEntry);\n\t\t\t\telse\n\t\t\t\t\tpEntry = NULL;\n\t\t\t}\n\n\t\t\tif (pEntry != NULL)\n\t\t\t{\n\t\t\t\tFromWhichBSSID = pEntry->apidx;\n\n\t\t\t\t/* Increase received byte counter per BSS */\n\t\t\t\tif (FromWhichBSSID < pAd->ApCfg.BssidNum)\n\t\t\t\t{\n\t\t\t\t\tMULTISSID_STRUCT *pMbss = pEntry->pMbss;\n\t\t\t\t\tif (pMbss != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tpMbss->ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\t\t\t\t\tpMbss->RxCount ++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_WDS);\n\t\t\t\tbWdsPacket = TRUE;\n\t\t\t\tCliWds_ProxyTabUpdate(pAd, pEntry->Aid, pHeader->Octet);\n\t\t\t\tbreak;\n\t\t\t}\n#endif /* CLIENT_WDS */\n\n\n\t\t} while(FALSE);\n\n\t\tif (pEntry == NULL)\n\t\t{\n\t\t\t/* have no WDS or MESH support */\n\t\t\t/* drop the packet */\n\t\t\tgoto err;\n\t\t}\n\t}\n\t/* handle APCLI. */\n\telse if ((pFmeCtrl->FrDs == 1) && (pFmeCtrl->ToDs == 0))\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (VALID_WCID(pRxWI->RxWIWirelessCliID))\n\t\t{\n\t\t\tpEntry = ApCliTableLookUpByWcid(pAd, pRxWI->RxWIWirelessCliID, pHeader->Addr2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t}\n\n\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tif (!(pEntry && APCLI_IF_UP_CHECK(pAd, pEntry->MatchAPCLITabIdx)))\n\t\t\t{\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tFromWhichBSSID = pEntry->MatchAPCLITabIdx + MIN_NET_DEVICE_FOR_APCLI;\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_APCLI);\n\n\t\t\t/* Process broadcast packets */\n\t\t\tif (pRxInfo->Mcast || pRxInfo->Bcast)\n\t\t\t{\n\t\t\t\t/* Process the received broadcast frame for AP-Client. */\n\t\t\t\tif (!ApCliHandleRxBroadcastFrame(pAd, pRxBlk, pEntry, FromWhichBSSID))\t\t\t\n\t\t\t\t{\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\t/* no APCLI support */\n\t\t\t/* release packet */\n\t\t\tgoto err;\n\t\t}\n\t}\n\telse\n\t{\n\t\tpEntry = PACInquiry(pAd, pRxWI->RxWIWirelessCliID);\n\n\t\t/*\tcan't find associated STA entry then filter invlid data frame */\n\t\tif (!pEntry)\n\t\t{\t\t\n\t\t\tgoto err;\n\t\t}\n\n\t\tFromWhichBSSID = pEntry->apidx;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t/* Increase received byte counter per BSS */\n\t\tif (pHeader->FC.FrDs == 0 &&\n\t\t\tpRxInfo->U2M &&\n\t\t\tFromWhichBSSID < pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = pEntry->pMbss;\n\t\t\tif (pMbss != NULL)\n\t\t\t{\n\t\t\t\tpMbss->ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\t\t\tpMbss->RxCount ++;\n\t\t\t}\n\t\t}\n\n\t\t/* update multicast counter */\n                if (IS_MULTICAST_MAC_ADDR(pHeader->Addr3))\n                        INC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount);\n#endif /* STATS_COUNT_SUPPORT */\t\t\n#ifdef P2P_SUPPORT\n\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t{\n\t\t\tFromWhichBSSID = pEntry->apidx + MIN_NET_DEVICE_FOR_P2P_GO;\n\t\t}\n#endif /* P2P_SUPPORT */\n\t}\n\n\tASSERT(pEntry->Aid == pRxWI->RxWIWirelessCliID);\n\n\n\n#ifdef DOT11_N_SUPPORT\n\t/* check Atheros Client */\n\tif (!pEntry->bIAmBadAtheros && (pFmeCtrl->Retry ) \n\t\t&& (pRxInfo->AMPDU == 1) && (pAd->CommonCfg.bHTProtect == TRUE)\n\t)\n\t{\n\t\tif (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)\n\t\t\tRTMP_UPDATE_PROTECT(pAd, 8 , ALLN_SETPROTECT, FALSE, FALSE);\n\t\tpEntry->bIAmBadAtheros = TRUE;\n\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n   \t/* update rssi sample */\n   \tUpdate_Rssi_Sample(pAd, &pEntry->RssiSample, pRxWI);\n\n\tif (pRxInfo->U2M)\n\t{\n#ifdef RT65xx\n\t\tpEntry->LastRxRate = (ULONG)((pRxWI->RxWIMCS) + (pRxWI->RxWIBW <<7) +\n\t\t\t\t\t\t\t\t\t(pRxWI->RxWISGI <<9) + (pRxWI->RxWISTBC <<10) +\n\t\t\t\t\t\t\t\t\t(pRxWI->RxWIPhyMode <<14));\n#else\n\t\tpEntry->LastRxRate = (ULONG)((pRxWI->RxWIMCS) + (pRxWI->RxWIBW <<7) +\n\t\t\t\t\t\t\t\t\t(pRxWI->RxWISGI <<8) + (pRxWI->RxWISTBC <<9) +\n\t\t\t\t\t\t\t\t\t(pRxWI->RxWIPhyMode <<14));\n#endif\n\n#ifdef TXBF_SUPPORT\n\t\tif (pRxWI->RxWISGI)\n\t\t\tpEntry->OneSecRxSGICount++;\n\t\telse\n\t\t\tpEntry->OneSecRxLGICount++;\n#endif // TXBF_SUPPORT //\n\t}\n\n\tpAd->ApCfg.LastSNR0 = (UCHAR)(pRxWI->RxWISNR0);\n\tpAd->ApCfg.LastSNR1 = (UCHAR)(pRxWI->RxWISNR1);\n#ifdef DOT11N_SS3_SUPPORT\n\tpAd->ApCfg.LastSNR2 = (UCHAR)(pRxWI->RxWISNR2);\n#endif /* DOT11N_SS3_SUPPORT */\n\tpEntry->freqOffset = (CHAR)(pRxWI->RxWIFOFFSET);\n\tpEntry->freqOffsetValid = TRUE;\n\n\n   \t/* Gather PowerSave information from all valid DATA frames. IEEE 802.11/1999 p.461 */\n   \t/* must be here, before no DATA check */\n\n\n\tpRxBlk->pData = (UCHAR *)pHeader;\n\n\n   \t/* 1: PWR_SAVE, 0: PWR_ACTIVE */\n   \tOldPwrMgmt = APPsIndicate(pAd, pHeader->Addr2, pEntry->Aid, pFmeCtrl->PwrMgmt);\n#ifdef UAPSD_SUPPORT\n\tif (pFmeCtrl->PwrMgmt)\n\t{\n\t   \tif ((CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_APSD_CAPABLE)) &&\n\t\t\t(pFmeCtrl->SubType & 0x08))\n\t   \t{\n\t\t\t/*\n\t\t\t\tIn IEEE802.11e, 11.2.1.4 Power management with APSD,\n\t\t\t\tIf there is no unscheduled SP in progress, the unscheduled SP begins\n\t\t\t\twhen the QAP receives a trigger frame from a non-AP QSTA, which is a\n\t\t\t\tQoS data or QoS Null frame associated with an AC the STA has\n\t\t\t\tconfigured to be trigger-enabled.\n\t\t\t*/\n\t\t\t/*\n\t\t\t\tIn WMM v1.1, A QoS Data or QoS Null frame that indicates transition\n\t\t\t\tto/from Power Save Mode is not considered to be a Trigger Frame and\n\t\t\t\tthe AP shall not respond with a QoS Null frame.\n\t\t\t*/\n\t\t\t/* Trigger frame must be QoS data or QoS Null frame */\n\t   \t\tUCHAR  OldUP;\n\n\t\t\tOldUP = (*(pRxBlk->pData+LENGTH_802_11) & 0x07);\n\t    \tif (OldPwrMgmt == PWR_SAVE)\n\t    \t\tUAPSD_TriggerFrameHandle(pAd, pEntry, OldUP);\n\t    \t/* End of if */\n\t\t}\n    } /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t/* Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame */\n\tif ((pFmeCtrl->SubType & 0x04) && (pFmeCtrl->Order == 0)) /* bit 2 : no DATA */\n\t{\n\t\t/* Increase received drop packet counter per BSS */\n\t\tif (pFmeCtrl->FrDs == 0 &&\n\t\t\tpRxInfo->U2M &&\n\t\t\tpRxWI->RxWIBSSID < pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[pRxWI->RxWIBSSID].RxDropCount ++;\t\t\t\n\t\t}\n\n\t\t/* release packet */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\t/*\n\t\tupdate RxBlk->pData, DataSize\n\t\t802.11 Header, QOS, HTC, Hw Padding\n\t*/\n\n\t/* 1. skip 802.11 HEADER */\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) || defined(MESH_SUPPORT)\n\tif (FALSE\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\t\t|| bWdsPacket\n#endif /* WDS_SUPPORT || CLIENT_WDS */\n\t\t)\n\t{\n\t\tpRxBlk->pData += LENGTH_802_11_WITH_ADDR4;\n\t\tpRxBlk->DataSize -= LENGTH_802_11_WITH_ADDR4;\n\t}\n\telse\n#endif /* WDS_SUPPORT || CLIENT_WDS || MESH_SUPPORT */\n\t{\n\t\tpRxBlk->pData += LENGTH_802_11;\n\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\t}\n\n\t/* 2. QOS */\n\tif (pFmeCtrl->SubType & 0x08)\n\t{\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_QOS);\n\t\tUserPriority = *(pRxBlk->pData) & 0x0f;\n\n\n\t\t/* count packets priroity more than BE */\n\t\tdetect_wmm_traffic(pAd, UserPriority, 0);\n\t\t/* bit 7 in QoS Control field signals the HT A-MSDU format */\n\t\tif ((*pRxBlk->pData) & 0x80)\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU);\n\n\t\t\t/* calculate received AMSDU count and ByteCount */\n\t\t\tpCounter->ReceivedAMSDUCount.u.LowPart ++;\n\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) || defined(MESH_SUPPORT)\n\t\t\tif (FALSE\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\t\t\t\t|| bWdsPacket\n#endif /* WDS_SUPPORT || CLIENT_WDS*/\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tpCounter->ReceivedOctesInAMSDUCount.QuadPart += (pRxBlk->DataSize + LENGTH_802_11_WITH_ADDR4);\n\t\t\t}\n\t\t\telse\n#endif /* WDS_SUPPORT || CLIENT_WDS || MESH_SUPPORT */\n\t\t\t{\n\t\t\t\tpCounter->ReceivedOctesInAMSDUCount.QuadPart += (pRxBlk->DataSize + LENGTH_802_11);\n\t\t\t}\n\t\t}\n\n\t\t/* skip QOS contorl field */\n\t\tpRxBlk->pData += 2;\n\t\tpRxBlk->DataSize -=2;\n\t}\n\tpRxBlk->UserPriority = UserPriority;\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap && \n\t\t(pHeader->FC.SubType & 0x08) && pHeader->FC.Order)\n\t{\n\t\thandleHtcField(pAd, pRxBlk);\n\t}\n#endif /* TXBF_SUPPORT */\n\n\t/* 3. Order bit: A-Ralink or HTC+ */\n\tif (pFmeCtrl->Order)\n\t{\n#ifdef AGGREGATION_SUPPORT\n\t\tif (\n#ifdef DOT11_N_SUPPORT\n\t\t\t(pRxWI->RxWIPhyMode < MODE_HTMIX) && \n#endif /* DOT11_N_SUPPORT */\n\t\t\t(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE))\n\t\t)\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_HTC);\n\t\t\t/* skip HTC control field */\n\t\t\tpRxBlk->pData += 4;\n\t\t\tpRxBlk->DataSize -= 4;\n\t\t}\n\t}\n\n\t/* 4. skip HW padding */\n\tif (pRxInfo->L2PAD)\n\t{\n\t\t/* just move pData pointer */\n\t\t/* because DataSize excluding HW padding */\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_PAD);\n\t\tpRxBlk->pData += 2;\n\t}\n\n\tif (pRxInfo->BA)\n\t{\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU);\n\n\t\t/* incremented by the number of MPDUs */\n\t\t/* received in the A-MPDU when an A-MPDU is received. */\n\t\tpCounter->MPDUInReceivedAMPDUCount.u.LowPart ++;\n\t}\n\n#ifdef SOFT_ENCRYPT\n\t/* Use software to decrypt the encrypted frame if necessary.\n\t   If a received \"encrypted\" unicast packet(its WEP bit as 1) \n\t   and it's passed to driver with \"Decrypted\" marked as 0 in RxD. */\n\tif ((pHeader->FC.Wep == 1) && (pRxInfo->Decrypted == 0))\n\t{\t\n\t\tif (RTMPSoftDecryptionAction(pAd, \n\t\t\t\t\t\t\t\t \t(PUCHAR)pHeader, \n\t\t\t\t\t\t\t\t\t UserPriority, \n\t\t\t\t\t\t\t\t\t &pEntry->PairwiseKey, \n\t\t\t\t\t\t\t\t \t pRxBlk->pData, \n\t\t\t\t\t\t\t\t\t &(pRxBlk->DataSize)) != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t\t/* Record the Decrypted bit as 1 */\n\t\tpRxInfo->Decrypted = 1;\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\tif (!((pHeader->Frag == 0) && (pFmeCtrl->MoreFrag == 0)))\n\t{\n\t\t/* re-assemble the fragmented packets */\n\t\t/* return complete frame (pRxPacket) or NULL */\n\t\tbFragment = TRUE;\n\t\tpRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk);\n\t}\n\n\tif (pRxPacket)\n\t{\n\t\t/* process complete frame */\n\t\tif (bFragment && (pFmeCtrl->Wep) && (pEntry->WepStatus == Ndis802_11Encryption2Enabled))\n\t\t{\n\t\t\t/* Minus MIC length */\n\t\t\tpRxBlk->DataSize -= 8;\n\n\t\t\t/* For TKIP frame, calculate the MIC value */\n\t\t\tif (APCheckTkipMICValue(pAd, pEntry, pRxBlk) == FALSE)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (pEntry)\n\t\t{\n\t\t\tpEntry->RxBytes+=pRxWI->RxWIMPDUByteCnt;\n\t\t\tINC_COUNTER64(pEntry->RxPackets);\n\t\t}\n#ifdef IKANOS_VX_1X0\n\t\tRTMP_SET_PACKET_IF(pRxPacket, FromWhichBSSID);\n#endif /* IKANOS_VX_1X0 */\n\t\tAPRxDataFrameAnnounce(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t}\n\telse\n\t{\n\t\t/* just return */\n\t\t/* because RTMPDeFragmentDataFrame() will release rx packet, */\n\t\t/* if packet is fragmented */\n\t\treturn;\n\t}\n\treturn;\n\nerr:\n\t/* Increase received error packet counter per BSS */\n\tif (pFmeCtrl->FrDs == 0 &&\n\t\tpRxInfo->U2M &&\n\t\tpRxWI->RxWIBSSID < pAd->ApCfg.BssidNum)\n\t{\n\t\tpAd->ApCfg.MBSSID[pRxWI->RxWIBSSID].RxDropCount ++;\n\t\tpAd->ApCfg.MBSSID[pRxWI->RxWIBSSID].RxErrorCount ++;\n\t}\n\n\t/* release packet */\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\treturn;\n\t\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID APHandleRxDataFrame_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk)\n{\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tHEADER_802_11 *pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tBOOLEAN bFragment = FALSE;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tUCHAR FromWhichBSSID = BSS0;\n\tUCHAR OldPwrMgmt = PWR_ACTIVE;\t/* UAPSD AP SUPPORT */\n\tUCHAR UserPriority = 0;\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\tBOOLEAN bWdsPacket = FALSE;\n#endif /* WDS_SUPPORT || CLIENT_WDS */\n\tFRAME_CONTROL *pFmeCtrl = &pHeader->FC;\n\tCOUNTER_RALINK *pCounter = &pAd->RalinkCounters;\n\tUCHAR *pData;\n\n//+++Add by shiang for debug\nif (0 /*!(pRxInfo->Mcast || pRxInfo->Bcast)*/){\n\tDBGPRINT(RT_DEBUG_OFF, (\"-->%s(%d): Dump Related Info!\\n\", __FUNCTION__, __LINE__));\n\thex_dump(\"DataFrameHeader\", pHeader, 36);\n\thex_dump(\"DataFramePayload\", pRxBlk->pTransData , pRxBlk->TransDataSize);\n}\n//---Add by shiangf for debug\n\n\tif (APCheckVaildDataFrame(pAd, pRxBlk) != TRUE)\n\t{\n\t\tgoto err;\t\t\n\t}\n\n#ifdef IDS_SUPPORT\n\t/*\n\t\tReplay attack detection\n\t\tDetect a spoofed data frame from a rogue AP, ignore it.\n\t*/\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t\tif (pFmeCtrl->FrDs == 1 && \n\t\t\t(RTMPReplayAttackDetection(pAd, pHeader->Addr2, pRxWI->RxWISNR2, 0, 0, pRxWI->RxWISNR1, pRxWI->RxWIBW) == TRUE))\n\t\t{\n\t\t\tgoto err;\n\t\t}\n\telse\n#endif /* MT7601 */\n\t\tif (pFmeCtrl->FrDs == 1 && \n\t\t\t(RTMPReplayAttackDetection(pAd, pHeader->Addr2, pRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2, 0, 0) == TRUE))\n\t\t{\n\t\t\tgoto err;\n\t\t}\n#endif /* IDS_SUPPORT */\n\n\t/* handle WDS */\n\tif ((pFmeCtrl->FrDs == 1) && (pFmeCtrl->ToDs == 1))\n\t{\n\t\tdo\n\t\t{\n#ifdef CLIENT_WDS\n\t\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\tif (pEntry != NULL)\n\t\t\t{\n\t\t\t\tif (IS_ENTRY_CLIWDS(pEntry))\n\t\t\t\t\t;\n\t\t\t\telse if (IS_ENTRY_CLIENT(pEntry)\n\t\t\t\t\t\t&& (pEntry->Sst == SST_ASSOC))\n\t\t\t\t\tSET_ENTRY_CLIWDS(pEntry);\n\t\t\t\telse\n\t\t\t\t\tpEntry = NULL;\n\t\t\t}\n\n\t\t\tif (pEntry != NULL)\n\t\t\t{\n\t\t\t\tFromWhichBSSID = pEntry->apidx;\n\n\t\t\t\t/* Increase received byte counter per BSS */\n\t\t\t\tif (FromWhichBSSID < pAd->ApCfg.BssidNum)\n\t\t\t\t{\n\t\t\t\t\tMULTISSID_STRUCT *pMbss = pEntry->pMbss;\n\t\t\t\t\tif (pMbss != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tpMbss->ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\t\t\t\t\tpMbss->RxCount ++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_WDS);\n\t\t\t\tbWdsPacket = TRUE;\n\t\t\t\tCliWds_ProxyTabUpdate(pAd, pEntry->Aid, pHeader->Octet);\n\t\t\t\tbreak;\n\t\t\t}\n#endif /* CLIENT_WDS */\n\n\n\t\t} while(FALSE);\n\n\t\tif (pEntry == NULL)\n\t\t{\n\t\t\t/* have no WDS or MESH support */\n\t\t\t/* drop the packet */\n\t\t\tgoto err;\n\t\t}\n\t}\n\t/* handle APCLI. */\n\telse if ((pFmeCtrl->FrDs == 1) && (pFmeCtrl->ToDs == 0))\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (VALID_WCID(pRxWI->RxWIWirelessCliID))\n\t\t\tpEntry = ApCliTableLookUpByWcid(pAd, pRxWI->RxWIWirelessCliID, pHeader->Addr2);\n\t\telse\n\t\t\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\n\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tif (!(pEntry && APCLI_IF_UP_CHECK(pAd, pEntry->MatchAPCLITabIdx)))\n\t\t\t{\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tFromWhichBSSID = pEntry->MatchAPCLITabIdx + MIN_NET_DEVICE_FOR_APCLI;\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_APCLI);\n\n\t\t\t/* Process broadcast packets */\n\t\t\tif (pRxInfo->Mcast || pRxInfo->Bcast)\n\t\t\t{\n\t\t\t\t/* Process the received broadcast frame for AP-Client. */\n\t\t\t\tif (!ApCliHandleRxBroadcastFrame(pAd, pRxBlk, pEntry, FromWhichBSSID))\t\t\t\n\t\t\t\t{\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\t/* no APCLI support */\n\t\t\t/* release packet */\n\t\t\tgoto err;\n\t\t}\n\t}\n\telse\n\t{\n\t\tpEntry = PACInquiry(pAd, pRxWI->RxWIWirelessCliID);\n\n\t\t/*\tcan't find associated STA entry then filter invlid data frame */\n\t\tif (!pEntry)\n\t\t{\t\t\n\t\t\tgoto err;\n\t\t}\n\n\t\tFromWhichBSSID = pEntry->apidx;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t/* Increase received byte counter per BSS */\n\t\tif (pHeader->FC.FrDs == 0 &&\n\t\t\tpRxInfo->U2M &&\n\t\t\tFromWhichBSSID < pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = pEntry->pMbss;\n\t\t\tif (pMbss != NULL)\n\t\t\t{\n\t\t\t\tpMbss->ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\t\t\tpMbss->RxCount ++;\n\t\t\t}\n\t\t}\n\n\t\t/* update multicast counter */\n                if (IS_MULTICAST_MAC_ADDR(pHeader->Addr3))\n                        INC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount);\n#endif /* STATS_COUNT_SUPPORT */\t\t\n#ifdef P2P_SUPPORT\n\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t{\n\t\t\tFromWhichBSSID = pEntry->apidx + MIN_NET_DEVICE_FOR_P2P_GO;\n\t\t}\n#endif /* P2P_SUPPORT */\n\t}\n\n\tASSERT(pEntry->Aid == pRxWI->RxWIWirelessCliID);\n\n\n\n#ifdef DOT11_N_SUPPORT\n\t/* check Atheros Client */\n\tif (!pEntry->bIAmBadAtheros && (pFmeCtrl->Retry ) \n\t\t&& (pRxInfo->AMPDU == 1) && (pAd->CommonCfg.bHTProtect == TRUE)\n\t)\n\t{\n\t\tif (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)\n\t\t\tRTMP_UPDATE_PROTECT(pAd, 8 , ALLN_SETPROTECT, FALSE, FALSE);\n\t\tpEntry->bIAmBadAtheros = TRUE;\n\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n   \t/* update rssi sample */\n   \tUpdate_Rssi_Sample(pAd, &pEntry->RssiSample, pRxWI);\n\n\tif (pRxInfo->U2M)\n\t{\n\t\tpEntry->LastRxRate = (ULONG)((pRxWI->RxWIMCS) + (pRxWI->RxWIBW <<7) +\n\t\t\t\t\t\t\t\t\t(pRxWI->RxWISGI <<8) + (pRxWI->RxWISTBC <<9) +\n\t\t\t\t\t\t\t\t\t(pRxWI->RxWIPhyMode <<14));\n\n#ifdef TXBF_SUPPORT\n\t\tif (pRxWI->RxWISGI)\n\t\t\tpEntry->OneSecRxSGICount++;\n\t\telse\n\t\t\tpEntry->OneSecRxLGICount++;\n#endif // TXBF_SUPPORT //\n\t}\n\n\tpAd->ApCfg.LastSNR0 = (UCHAR)(pRxWI->RxWISNR0);\n\tpAd->ApCfg.LastSNR1 = (UCHAR)(pRxWI->RxWISNR1);\n#ifdef DOT11N_SS3_SUPPORT\n\tpAd->ApCfg.LastSNR2 = (UCHAR)(pRxWI->RxWISNR2);\n#endif /* DOT11N_SS3_SUPPORT */\n\tpEntry->freqOffset = (CHAR)(pRxWI->RxWIFOFFSET);\n\tpEntry->freqOffsetValid = TRUE;\n\n\n   \t/* Gather PowerSave information from all valid DATA frames. IEEE 802.11/1999 p.461 */\n   \t/* must be here, before no DATA check */\n\n\n\tpData = (UCHAR *)pHeader;\n\n\n   \t/* 1: PWR_SAVE, 0: PWR_ACTIVE */\n   \tOldPwrMgmt = APPsIndicate(pAd, pHeader->Addr2, pEntry->Aid, pFmeCtrl->PwrMgmt);\n#ifdef UAPSD_SUPPORT\n\tif (pFmeCtrl->PwrMgmt)\n\t{\n\t   \tif ((CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_APSD_CAPABLE)) &&\n\t\t\t(pFmeCtrl->SubType & 0x08))\n\t   \t{\n\t\t\t/*\n\t\t\t\tIn IEEE802.11e, 11.2.1.4 Power management with APSD,\n\t\t\t\tIf there is no unscheduled SP in progress, the unscheduled SP begins\n\t\t\t\twhen the QAP receives a trigger frame from a non-AP QSTA, which is a\n\t\t\t\tQoS data or QoS Null frame associated with an AC the STA has\n\t\t\t\tconfigured to be trigger-enabled.\n\t\t\t*/\n\t\t\t/*\n\t\t\t\tIn WMM v1.1, A QoS Data or QoS Null frame that indicates transition\n\t\t\t\tto/from Power Save Mode is not considered to be a Trigger Frame and\n\t\t\t\tthe AP shall not respond with a QoS Null frame.\n\t\t\t*/\n\t\t\t/* Trigger frame must be QoS data or QoS Null frame */\n\t   \t\tUCHAR  OldUP;\n\n\t\t\tOldUP = (*(pData+LENGTH_802_11) & 0x07);\n\t    \tif (OldPwrMgmt == PWR_SAVE)\n\t    \t\tUAPSD_TriggerFrameHandle(pAd, pEntry, OldUP);\n\t    \t/* End of if */\n\t\t}\n    } /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t/* Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame */\n\tif ((pFmeCtrl->SubType & 0x04) && (pFmeCtrl->Order == 0)) /* bit 2 : no DATA */\n\t{\n\t\t/* Increase received drop packet counter per BSS */\n\t\tif (pFmeCtrl->FrDs == 0 &&\n\t\t\tpRxInfo->U2M &&\n\t\t\tpRxWI->RxWIBSSID < pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[pRxWI->RxWIBSSID].RxDropCount ++;\t\t\t\n\t\t}\n\n\t\t/* release packet */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\t/*\n\t\tupdate RxBlk->pData, DataSize\n\t\t802.11 Header, QOS, HTC, Hw Padding\n\t*/\n\n\t/* 1. skip 802.11 HEADER */\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) || defined(MESH_SUPPORT)\n\tif (FALSE\n#if defined(WDS_SUPPORT) || defined(CLIENT_WDS)\n\t\t|| bWdsPacket\n#endif /* WDS_SUPPORT || CLIENT_WDS */\n\t\t)\n\t{\n\t\tpData += LENGTH_802_11_WITH_ADDR4;\n\t}\n\telse\n#endif /* WDS_SUPPORT || CLIENT_WDS || MESH_SUPPORT */\n\t{\n\t\tpData += LENGTH_802_11;\n\t}\n\n\t/* 2. QOS */\n\tif (pFmeCtrl->SubType & 0x08)\n\t{\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_QOS);\n\t\tUserPriority = *(pData) & 0x0f;\n\n\n\t\t/* count packets priroity more than BE */\n\t\tdetect_wmm_traffic(pAd, UserPriority, 0);\n\t\t/* bit 7 in QoS Control field signals the HT A-MSDU format */\n\t\tif ((*pData) & 0x80)\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU);\n\n\t\t}\n\n\t\t/* skip QOS contorl field */\n\t\tpData += 2;\n\t}\n\tpRxBlk->UserPriority = UserPriority;\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap && \n\t\t(pHeader->FC.SubType & 0x08) && pHeader->FC.Order)\n\t{\n\t\thandleHtcField(pAd, pRxBlk);\n\t}\n#endif /* TXBF_SUPPORT */\n\n\t/* 3. Order bit: A-Ralink or HTC+ */\n\tif (pFmeCtrl->Order)\n\t{\n#ifdef AGGREGATION_SUPPORT\n\t\tif (\n#ifdef DOT11_N_SUPPORT\n\t\t\t(pRxWI->RxWIPhyMode < MODE_HTMIX) && \n#endif /* DOT11_N_SUPPORT */\n\t\t\t(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE))\n\t\t)\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_HTC);\n\t\t\t/* skip HTC control field */\n\t\t\tpData += 4;\n\t\t}\n\t}\n\n\t/* 4. skip HW padding */\n\tif (pRxInfo->L2PAD)\n\t{\n\t\t/* just move pData pointer */\n\t\t/* because DataSize excluding HW padding */\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_PAD);\n\t\tpData += 2;\n\t}\n\n\tif (pRxInfo->BA)\n\t{\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU);\n\n\t\t/* incremented by the number of MPDUs */\n\t\t/* received in the A-MPDU when an A-MPDU is received. */\n\t\tpCounter->MPDUInReceivedAMPDUCount.u.LowPart ++;\n\t}\n\n#ifdef SOFT_ENCRYPT\n\t/* Use software to decrypt the encrypted frame if necessary.\n\t   If a received \"encrypted\" unicast packet(its WEP bit as 1) \n\t   and it's passed to driver with \"Decrypted\" marked as 0 in RxD. */\n\tif ((pHeader->FC.Wep == 1) && (pRxInfo->Decrypted == 0))\n\t{\t\n\t\tif (RTMPSoftDecryptionAction(pAd, \n\t\t\t\t\t\t\t\t \t(PUCHAR)pHeader, \n\t\t\t\t\t\t\t\t\t UserPriority, \n\t\t\t\t\t\t\t\t\t &pEntry->PairwiseKey, \n\t\t\t\t\t\t\t\t \t pRxBlk->pTransData + 14, \n\t\t\t\t\t\t\t\t\t &(pRxBlk->TransDataSize)) != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t\t/* Record the Decrypted bit as 1 */\n\t\tpRxInfo->Decrypted = 1;\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\tif (!((pHeader->Frag == 0) && (pFmeCtrl->MoreFrag == 0)))\n\t{\n\t\t/* re-assemble the fragmented packets */\n\t\t/* return complete frame (pRxPacket) or NULL */\n\t\tbFragment = TRUE;\n\t\tpRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk);\n\t}\n\n\tif (pRxPacket)\n\t{\n\t\t/* process complete frame */\n\t\tif (bFragment && (pFmeCtrl->Wep) && (pEntry->WepStatus == Ndis802_11Encryption2Enabled))\n\t\t{\n\t\t\t/* Minus MIC length */\n\t\t\tpRxBlk->DataSize -= 8;\n\n\t\t\t/* For TKIP frame, calculate the MIC value */\n\t\t\tif (APCheckTkipMICValue(pAd, pEntry, pRxBlk) == FALSE)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (pEntry)\n\t\t{\n\t\t\tpEntry->RxBytes+=pRxWI->RxWIMPDUByteCnt;\n\t\t\tINC_COUNTER64(pEntry->RxPackets);\n\t\t}\n#ifdef IKANOS_VX_1X0\n\t\tRTMP_SET_PACKET_IF(pRxPacket, FromWhichBSSID);\n#endif /* IKANOS_VX_1X0 */\n\t\tAPRxDataFrameAnnounce_Hdr_Trns(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t}\n\telse\n\t{\n\t\t/* just return */\n\t\t/* because RTMPDeFragmentDataFrame() will release rx packet, */\n\t\t/* if packet is fragmented */\n\t\treturn;\n\t}\n\treturn;\n\nerr:\n\t/* Increase received error packet counter per BSS */\n\tif (pFmeCtrl->FrDs == 0 &&\n\t\tpRxInfo->U2M &&\n\t\tpRxWI->RxWIBSSID < pAd->ApCfg.BssidNum)\n\t{\n\t\tpAd->ApCfg.MBSSID[pRxWI->RxWIBSSID].RxDropCount ++;\n\t\tpAd->ApCfg.MBSSID[pRxWI->RxWIBSSID].RxErrorCount ++;\n\t}\n\n\t/* release packet */\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\treturn;\n\t\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\n/*\n\t\t========================================================================\n\t\tRoutine Description:\n\t\t\tProcess RxDone interrupt, running in DPC level\n\n\t\tArguments:\n\t\t\tpAd    Pointer to our adapter\n\n\t\tReturn Value:\n\t\t\tNone\n\n\t\tNote:\n\t\t\tThis routine has to maintain Rx ring read pointer.\n\t========================================================================\n*/\n\n\n#undef\tMAX_RX_PROCESS_CNT\n#define MAX_RX_PROCESS_CNT\t(32)\n\nBOOLEAN APRxDoneInterruptHandle(RTMP_ADAPTER *pAd) \n{\n\tUINT32 RxProcessed, RxPending;\n\tBOOLEAN bReschedule = FALSE;\n\tRXD_STRUC *pRxD;\n\tRXINFO_STRUC *pRxInfo;\n\tUCHAR *pData;\n\tRXWI_STRUC *pRxWI;\n\tPNDIS_PACKET pRxPacket;\n\tPHEADER_802_11 pHeader;\n\tRX_BLK rxblk, *pRxBlk;\n\tMULTISSID_STRUCT *pMbss;\n\tUINT8 RXWISize = pAd->chipCap.RXWISize;\n#ifdef RLT_MAC\n\tRXFCE_INFO *pFceInfo;\n#endif /* RLT_MAC */\n\n#ifdef LINUX\n#endif /* LINUX */\n\n\tRxProcessed = RxPending = 0;\n\n\t/* process whole rx ring */\n\twhile (1)\n\t{\n\n\t\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS)) || \n\t\t\t\t\t\t!RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_START_UP)) &&\n\t\t\t\t\t\t!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_TIMING_RECORD_INDEX(RxProcessed);\n#endif /* UAPSD_SUPPORT */\n\n\n\t\t/* \n\t\t\t1. allocate a new data packet into rx ring to replace received packet\n\t\t\t\tthen processing the received packet\n\t\t\t2. the callee must take charge of release of packet\n\t\t\t3. As far as driver is concerned, the rx packet must\n\t\t\t\ta. be indicated to upper layer or\n\t\t\t\tb. be released if it is discarded\n\t\t*/\n\n\t\tpRxBlk = &rxblk;\n\t\tpRxPacket = GetPacketFromRxRing(pAd, pRxBlk, &bReschedule, &RxPending);\n\t\tif (pRxPacket == NULL)\n\t\t\tbreak;\n\n\t\t/* get rx descriptor and data buffer */\n\t\tpRxD = (RXD_STRUC *)&pRxBlk->hw_rx_info[0];\n#ifdef RLT_MAC\n\t\tpFceInfo = rxblk.pRxFceInfo;\n#endif /* RLT_MAC */\n\t\tpRxInfo = rxblk.pRxInfo;\n\t\tpData = GET_OS_PKT_DATAPTR(pRxPacket);\n\t\tpRxWI = (RXWI_STRUC *)pData;\n\t\tpHeader = (PHEADER_802_11)(pData + RXWISize);\n\n#ifdef RLT_MAC\n\t\t// TODO: shiang-6590, handle packet from other ports\n\t\tif (pFceInfo->info_type != 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"==>%s(): GetFrameFromOtherPorts!\\n\", __FUNCTION__));\n\t\t\thex_dump(\"hw_rx_info\", &rxblk.hw_rx_info[0], sizeof(rxblk.hw_rx_info));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Dump the RxD, RxFCEInfo and RxInfo:\\n\"));\n\t\t\thex_dump(\"RxD\", (UCHAR *)pRxD, sizeof(RXD_STRUC));\n#ifdef RLT_MAC\n\t\t\tdumpRxFCEInfo(pAd, pFceInfo);\n#endif /* RLT_MAC */\n\t\t\tdump_rxinfo(pAd, pRxInfo);\n\t\t\thex_dump(\"RxFrame\", (UCHAR *)pData, (pFceInfo->pkt_len));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"<==\\n\"));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t\t\tcontinue;\n\t\t}\n#endif /* RLT_MAC */\n\n\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, (PUCHAR)pHeader, DIR_READ, TRUE);\n\t\tRTMPWIEndianChange(pAd , (PUCHAR)pRxWI, TYPE_RXWI);\n#endif\n\n//+++Add by shiang for debug\nif (0) {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>%s():Dump the RxD, RxFCEInfo and RxInfo:\\n\", __FUNCTION__));\n\t\thex_dump(\"hw_rx_info\", &rxblk.hw_rx_info[0], sizeof(rxblk.hw_rx_info));\n\t\thex_dump(\"RxD\", (UCHAR *)pRxD, sizeof(RXD_STRUC));\n#ifdef RLT_MAC\n\t\tdumpRxFCEInfo(pAd, pFceInfo);\n#endif /* RLT_MAC */\n\t\tdump_rxinfo(pAd, pRxInfo);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Dump the RxWI and RxPacket:\\n\"));\n\t\tdump_rxwi(pAd, pRxWI);\n\t\thex_dump(\"RxPacket\", (UCHAR *)pHeader, pRxWI->RxWIMPDUByteCnt);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==%s():Finish dump!\\n\", __FUNCTION__));\n}\n//---Add by shiang for debug\n\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_RXWI)\n\t\t\tdbQueueEnqueueRxFrame(pData, (UCHAR *)pHeader, pAd->CommonCfg.DebugFlags);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/* build RX_BLK */\n\t\trxblk.pRxWI = pRxWI;\n\t\trxblk.pHeader = pHeader;\n\t\trxblk.pRxPacket = pRxPacket;\n\t\trxblk.pData = (UCHAR *)pHeader;\n\t\trxblk.DataSize = pRxWI->RxWIMPDUByteCnt;\n\t\trxblk.Flags = 0;\n\t\tSET_PKT_OPMODE_AP(&rxblk);\n\n#ifdef HDR_TRANS_SUPPORT\n\t\trxblk.bHdrRxTrans = pRxInfo->ip_sum_err;\t\t\t/* RXINFO bit 31 */\n\t\trxblk.bHdrVlanTaged = pRxInfo->tcp_sum_err;\t\t\t/* RXINFO bit 30 */\n\t\trxblk.pTransData = (UCHAR *) pHeader +  38; /* 36 byte - 802.11 MAC header (RX Wifi Info */\n\t\trxblk.TransDataSize = pRxWI->RxWIMPDUByteCnt;\t\t\n#endif\t/* HDR_TRANS_SUPPORT */\n\n\t\t/* Increase Total receive byte counter after real data received no mater any error or not */\n\t\tpAd->RalinkCounters.ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.OneSecReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.RxCount++;\n\t\tpAd->RalinkCounters.OneSecRxCount++;\n\n\n#ifdef STATS_COUNT_SUPPORT\n#ifdef RALINK_ATE\n#ifdef CONFIG_AP_SUPPORT\n\t\tINC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tINC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);\n#endif /* CONFIG_STA_SUPPORT */\n#else /* RALINK_ATE */\n\t\tINC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);\n#endif /* RALINK_ATE */\n#endif /* STATS_COUNT_SUPPORT */\n\n\n#ifdef RALINK_ATE\n\t\tif (ATE_ON(pAd))\n\t\t{\n\t\t\tpAd->ate.RxCntPerSec++;\n\t\t\tATESampleRssi(pAd, pRxWI);\n#ifdef RALINK_QA\n\t\t\tif (pAd->ate.bQARxStart == TRUE)\n\t\t\t{\n\t\t\t\t/* GetPacketFromRxRing() has copy the endian-changed RxD if it is necessary. */\n\t\t\t\tATE_QA_Statistics(pAd, pRxWI, pRxInfo, pHeader);\n\t\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\t\t/* Check sounding frame */\n\t\t\tif ((pAd->chipCap.FlgHwTxBfCap) && (pHeader->FC.Type == BTYPE_MGMT))\n\t\t\t{\n\t\t\t\tpRxBlk->pData += LENGTH_802_11;\n\t\t\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\n\t\t\t\tif (pHeader->FC.Order) {\n\t\t\t\t\tpRxBlk->pData += 4;\n\t\t\t\t\tpRxBlk->DataSize -= 4;\n\t\t\t\t}\n\n\t\t\t\tif ((((pHeader->FC.SubType == SUBTYPE_ACTION) || (pHeader->FC.SubType == SUBTYPE_ACTION_NO_ACK)) \n\t\t\t\t\t&&  (pRxBlk ->pData)[ 0] == CATEGORY_HT \n\t\t\t\t\t&&  ((pRxBlk ->pData)[ 1] == MIMO_N_BEACONFORM /*non-compressed beamforming report */\n\t\t\t\t\t|| (pRxBlk ->pData)[1] == MIMO_BEACONFORM)  )) /*compressed beamforming report */\n\t\t\t\t{\n\t\t\t\t\t/* sounding frame */\n\t\t\t\t\t/*printk(\"Receive sounding response\\n\"); */\n\t\t\t\t\tif (pAd->ate.sounding == 1) {\n\t\t\t\t\t\tint i, Nc = ((pRxBlk ->pData)[2] & 0x3) + 1;\n\t\t\t\t\t\tpAd->ate.soundingSNR[0] = (CHAR)((pRxBlk ->pData)[8]);\n\t\t\t\t\t\tpAd->ate.soundingSNR[1] = (Nc<2)? 0: (CHAR)((pRxBlk ->pData)[9]);\n\t\t\t\t\t\tpAd->ate.soundingSNR[2] = (Nc<3)? 0: (CHAR)((pRxBlk ->pData)[10]);\n\t\t\t\t\t\tpAd->ate.sounding = 2;\n\t\t\t\t\t\tpAd->ate.soundingRespSize = pRxBlk->DataSize;\n\t\t\t\t\t\tfor (i=0; i<pRxBlk->DataSize && i<MAX_SOUNDING_RESPONSE_SIZE; i++)\n\t\t\t\t\t\t\tpAd->ate.soundingResp[i] = pRxBlk->pData[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* Roger Debug : Fix Me */\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pHeader->FC.Order)\n\t\t\t\t\t\tDBGPRINT( RT_DEBUG_WARN, (\"fcsubtype=%x\\ndata[0]=%x\\ndata[1]=%x\\n\", pHeader->FC.SubType, (pRxBlk ->pData)[0], (pRxBlk ->pData)[1]));\n\t\t\t\t}\n\t\t\t}\n#endif /* TXBF_SUPPORT */\n#endif /* RALINK_QA */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t\t\tcontinue;\n\t\t}\n#endif /* RALINK_ATE */\n\t\t\n\t\t/* Check for all RxD errors */\n\t\tif (APCheckRxError(pAd, pRxInfo, pRxWI->RxWIWirelessCliID) != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tAPRxDErrorHandle(pAd, &rxblk);\n\n\t\t\t/* Increase received error packet counter per BSS */\n\t\t\tif (pHeader->FC.FrDs == 0 &&\n\t\t\t\tpRxInfo->U2M &&\n\t\t\t\tpRxWI->RxWIBSSID < pAd->ApCfg.BssidNum)\n\t\t\t{\n\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[pRxWI->RxWIBSSID];\n\t\t\t\tpMbss->RxDropCount ++;\n\t\t\t\tpMbss->RxErrorCount ++;\n\t\t\t}\n\n\t\t\t/* discard this frame */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*\n\t\t\tAll frames to AP are directed except probe_req. IEEE 802.11/1999 - p.463\n\t\t\tDo this before checking \"duplicate frame\".\n\t\t\t2003-08-20 accept BEACON to decide if OLBC (Overlapping Legacy BSS Condition) happens\n\t\t\tTODO: consider move this code to be inside \"APCheckRxError()\"\n\t\t*/\t\t\n\t\tswitch (pHeader->FC.Type)\n\t\t{\n\t\t\tcase BTYPE_DATA:\n\t\t\t\t\tif (pRxInfo->U2M)\n\t\t\t\t\t{\n\t\t\t\t\t\tUpdate_Rssi_Sample(pAd, &pAd->ApCfg.RssiSample, pRxWI);\n\t\t\t\t\t\tpAd->ApCfg.NumOfAvgRssiSample ++;\n#ifdef DBG_DIAGNOSE\n\t\t\t\t\t\tif (pRxWI->RxWIMCS < 24) /* 3*3 */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->DiagStruct.RxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;\n\t\t\t\t\t\t\tpAd->DiagStruct.RxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pRxWI->RxWIMCS]++;\n\t\t\t\t\t\t}\n#endif /* DBG_DIAGNOSE */\n\t\t\t\t\t}\n\n#ifdef HDR_TRANS_SUPPORT\n\t\t\t\t\trxblk.bHdrRxTrans = pRxInfo->ip_sum_err;\t\t/* RXINFO bit 31 */\n\n\t\t\t\t\tif ( rxblk.bHdrRxTrans )\n\t\t\t\t\t{\n\t\t\t\t\t\trxblk.bHdrVlanTaged = pRxInfo->tcp_sum_err;\t/* RXINFO bit 30 */\n\t\t\t\t\t\trxblk.pTransData = (UCHAR *) pHeader +  38; /* 36 byte - RX WIFI Size ( 802.11 Header ) */\n\t\t\t\t\t\trxblk.TransDataSize = pRxWI->RxWIMPDUByteCnt;\n\t\t\t\t\t\trxblk.DataSize += 36;\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tAPHandleRxDataFrame_Hdr_Trns(pAd, &rxblk);\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif\t/* HDR_TRANS_SUPPORT */\n\n\t\t\t\t\tAPHandleRxDataFrame(pAd, &rxblk);\n\t\t\t\t\tbreak;\n\n\t\t\tcase BTYPE_MGMT:\n\t\t\t\t\tAPHandleRxMgmtFrame(pAd, &rxblk);\n\t\t\t\t\tbreak;\n\n\t\t\tcase BTYPE_CNTL:\n\t\t\t\t\tAPHandleRxControlFrame(pAd, &rxblk);\n\t\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n#ifdef UAPSD_SUPPORT\n\t/* dont remove the function or UAPSD will fail */\n\tUAPSD_MR_SP_RESUME(pAd);\n    UAPSD_SP_CloseInRVDone(pAd);\n#endif /* UAPSD_SUPPORT */\n\n\treturn bReschedule;\n}\n\n\nBOOLEAN APHandleRxDonePacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET\tpRxPacket,\n\tIN RX_BLK *pRxBlk)\n{\n\tRXD_STRUC *pRxD;\n\tRXINFO_STRUC *pRxInfo;\n\tRXWI_STRUC *pRxWI;\n\tPHEADER_802_11 pHeader;\n\tMULTISSID_STRUCT *pMbss;\n\tBOOLEAN\t bReschedule = FALSE;\n\n\n\tSET_PKT_OPMODE_AP(pRxBlk);\n\t/* get rx ring descriptor */\n\tpRxD = (RXD_STRUC *)&pRxBlk->hw_rx_info[0];\n\tpHeader = pRxBlk->pHeader;\n\tpRxWI = pRxBlk->pRxWI;\n\tpRxInfo = pRxBlk->pRxInfo;\n\t\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\tpAd->ate.RxCntPerSec++;\n\t\tATESampleRssi(pAd, pRxWI);\n#ifdef RALINK_QA\n\t\tif (pAd->ate.bQARxStart == TRUE)\n\t\t{\n\t\t\t/* GetPacketFromRxRing() has copy the endian-changed RxD if it is necessary. */\n\t\t\tATE_QA_Statistics(pAd, pRxWI, pRxInfo,\tpHeader);\n\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\t/* Check sounding frame */\n\t\tif ((pAd->chipCap.FlgHwTxBfCap) && (pHeader->FC.Type == BTYPE_MGMT))\n\t\t{\n\t\t\tpRxBlk->pData += LENGTH_802_11;\n\t\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\n\t\t\tif (pHeader->FC.Order)\n\t\t\t{\n\t\t\t\tpRxBlk->pData += 4;\n\t\t\t\tpRxBlk->DataSize -= 4;\t\n\t\t\t}\n\n\t\t\tif ((((pHeader->FC.SubType == SUBTYPE_ACTION) || (pHeader->FC.SubType == SUBTYPE_ACTION_NO_ACK)) \n\t\t\t\t\t&&  (pRxBlk ->pData)[ 0] == CATEGORY_HT \n\t\t\t\t\t&&  ((pRxBlk ->pData)[ 1] == MIMO_N_BEACONFORM /* non-compressed beamforming report */\n\t\t\t\t\t|| (pRxBlk ->pData)[1] == MIMO_BEACONFORM)  )) /* compressed beamforming report */\n\t\t\t{\n\t\t\t\t/* sounding frame */\n\t\t\t\t/*printk(\"Receive sounding response\\n\"); */\n\t\t\t\tif (pAd->ate.sounding == 1)\n\t\t\t\t{\n\t\t\t\t\tint i, Nc = ((pRxBlk ->pData)[2] & 0x3) + 1;\n\n\t\t\t\t\tpAd->ate.soundingSNR[0] = (CHAR)((pRxBlk ->pData)[8]);\n\t\t\t\t\tpAd->ate.soundingSNR[1] = (Nc<2)? 0: (CHAR)((pRxBlk ->pData)[9]);\n\t\t\t\t\tpAd->ate.soundingSNR[2] = (Nc<3)? 0: (CHAR)((pRxBlk ->pData)[10]);\n\t\t\t\t\tpAd->ate.sounding = 2;\n\t\t\t\t\tpAd->ate.soundingRespSize = pRxBlk->DataSize;\n\n\t\t\t\t\tfor (i=0; i < pRxBlk->DataSize && i < MAX_SOUNDING_RESPONSE_SIZE; i++)\n\t\t\t\t\t\tpAd->ate.soundingResp[i] = pRxBlk->pData[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pHeader->FC.Order)\n\t\t\t\t\tDBGPRINT( RT_DEBUG_WARN, (\"fcsubtype=%x\\ndata[0]=%x\\ndata[1]=%x\\n\", pHeader->FC.SubType, (pRxBlk ->pData)[0], (pRxBlk ->pData)[1]));\n\t\t\t}\t\n\t\t}\n#endif /* TXBF_SUPPORT */\n#endif /* RALINK_QA */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t\treturn bReschedule;\n\t}\n#endif /* RALINK_ATE */\n\t\t\n\t/* Check for all RxD errors */\n\tif (APCheckRxError(pAd, pRxInfo, pRxWI->RxWIWirelessCliID) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tAPRxDErrorHandle(pAd, pRxBlk);\n\n\t\t/* Increase received error packet counter per BSS */\n\t\tif ((pHeader->FC.FrDs == 0) &&\n\t\t\tpRxInfo->U2M &&\n\t\t\t(pRxWI->RxWIBSSID < pAd->ApCfg.BssidNum))\n\t\t{\n\t\t\tpMbss = &pAd->ApCfg.MBSSID[pRxWI->RxWIBSSID];\n\t\t\tpMbss->RxDropCount ++;\n\t\t\tpMbss->RxErrorCount ++;\n\t\t}\n\n\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn bReschedule;\n\t}\n\n\t/*\n\t\tAll frames to AP are directed except probe_req. IEEE 802.11/1999 - p.463\n\t\tDo this before checking \"duplicate frame\".\n\t\t2003-08-20 accept BEACON to decide if OLBC (Overlapping Legacy BSS Condition) happens\n\t\tTODO: consider move this code to be inside \"APCheckRxError()\"\n\t*/\n\tswitch (pHeader->FC.Type)\n\t{\n\t\tcase BTYPE_DATA:\n\t\t\tif (pRxInfo->U2M)\n\t\t\t{\n\t\t\t\tUpdate_Rssi_Sample(pAd, &pAd->ApCfg.RssiSample, pRxWI);\n\t\t\t\tpAd->ApCfg.NumOfAvgRssiSample++;\n#ifdef DBG_DIAGNOSE\n\t\t\t\tif (pRxWI->RxWIMCS < 24)\n\t\t\t\t{\n\t\t\t\t\tpAd->DiagStruct.RxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;\n\t\t\t\t\tpAd->DiagStruct.RxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pRxWI->RxWIMCS]++;\n\t\t\t\t}\n#endif /* DBG_DIAGNOSE */\n\t\t\t}\n\t\t\t\tAPHandleRxDataFrame(pAd, pRxBlk);\n\t\t\tbreak;\n\n\t\tcase BTYPE_MGMT:\n\t\t\tAPHandleRxMgmtFrame(pAd, pRxBlk);\n\t\t\tbreak;\n\n\t\tcase BTYPE_CNTL:\n\t\t\tAPHandleRxControlFrame(pAd, pRxBlk);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\tbreak;\n\t}\n\n\treturn bReschedule;\n}\n\n\nBOOLEAN APFowardWirelessStaToWirelessSta(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tULONG\t\t\tFromWhichBSSID)\n{\n    MAC_TABLE_ENTRY\t*pEntry = NULL;\n    BOOLEAN\t\t\tbAnnounce, bDirectForward;\n\tUCHAR\t\t\t*pHeader802_3;\n\tPNDIS_PACKET\tpForwardPacket;\n\n#ifdef INF_AMAZON_SE\n\t/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */\n\tRTMP_SET_PACKET_NOBULKOUT(pPacket, FALSE);\n#endif /* INF_AMAZON_SE */\n\n#ifdef P2P_SUPPORT\n\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t{\n\t\tFromWhichBSSID = FromWhichBSSID - MIN_NET_DEVICE_FOR_P2P_GO;\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n#ifdef APCLI_SUPPORT\n\t/* have no need to forwad the packet to WM */\n\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)\n\t{\n\t\t/* need annouce to upper layer */\n\t\treturn TRUE;\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n\n\tpEntry = NULL;\n\tbAnnounce = TRUE;\n\tbDirectForward = FALSE;\n\n\tpHeader802_3 = GET_OS_PKT_DATAPTR(pPacket);\n\n\tif (pHeader802_3[0] & 0x01) \n\t{\n\t\t/*\n\t\t** In the case, the BSS have only one STA behind.\n\t\t** AP have no necessary to forward the M/Bcase packet back to STA again.\n\t\t*/\n\t\tif (\n#ifdef P2P_SUPPORT\n\t\t\t(pAd->P2pCfg.bSigmaEnabled == TRUE) ||\n#endif /* P2P_SUPPORT */\n\t\t\t((FromWhichBSSID < MAX_MBSSID_NUM(pAd)) &&\n\t\t\t(FromWhichBSSID < HW_BEACON_MAX_NUM) &&\n\t\t\t(pAd->ApCfg.MBSSID[FromWhichBSSID].StaCount > 1)))\n\t\t\tbDirectForward  = TRUE;\n\n\t\t/* tell caller to deliver the packet to upper layer */\n\t\tbAnnounce = TRUE;\n\t}\t\t\n\telse\n\t{\n\t\t/* if destinated STA is a associated wireless STA */\n\t\tpEntry = MacTableLookup(pAd, pHeader802_3);\n\n\t\tif (pEntry && pEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tbDirectForward = TRUE;\n\t\t\tbAnnounce = FALSE;\n\n\t\t\tif (FromWhichBSSID == pEntry->apidx)\n\t\t\t{/* STAs in same SSID */\n\t\t\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].IsolateInterStaTraffic == 1))\n\t\t\t\t{\n\t\t\t\t\t/* release the packet */\n\t\t\t\t\tbDirectForward = FALSE;\n\t\t\t\t\tbAnnounce = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{/* STAs in different SSID */\n\t\t\t\tif (pAd->ApCfg.IsolateInterStaTrafficBTNBSSID == 1 ||\n\t\t\t\t\t((FromWhichBSSID < MAX_MBSSID_NUM(pAd)) &&\n\t\t\t\t\t(FromWhichBSSID < HW_BEACON_MAX_NUM) &&\n\t\t\t\t\t(pAd->ApCfg.MBSSID[pEntry->apidx].VLAN_VID != pAd->ApCfg.MBSSID[FromWhichBSSID].VLAN_VID)))\n\t\t\t\t\t/* destination VLAN ID != source VLAN ID */\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tDo not need to care WDS mode because packets from a\n\t\t\t\t\t\tWDS interface will be passed to upper layer to do\n\t\t\t\t\t\tbridge.\n\t\t\t\t\t*/\n\t\t\t\t\tbDirectForward = FALSE;\n\t\t\t\t\tbAnnounce = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* announce this packet to upper layer (bridge) */\n\t\t\tbDirectForward = FALSE;\n\t\t\tbAnnounce = TRUE;\n\t\t}\n\t}\n\n\tif (bDirectForward)\n\t{\n\t\t/* build an NDIS packet */\n\t\tpForwardPacket = RTMP_DUPLICATE_PACKET(pAd,\tpPacket, FromWhichBSSID);\t\t\t\n\n\t\tif (pForwardPacket == NULL)\n\t\t{\n\t\t\treturn bAnnounce;\n\t\t}\n\n\t\t{\n\t\t\t/* 1.1 apidx != 0, then we need set packet mbssid attribute. */\n\t\t\tRTMP_SET_PACKET_NET_DEVICE_MBSSID(pForwardPacket, MAIN_MBSSID);\t/* set a default value */\n\t\t\tif(pEntry && (pEntry->apidx != 0))\n\t\t\t\tRTMP_SET_PACKET_NET_DEVICE_MBSSID(pForwardPacket, pEntry->apidx);\n\n\t\t\t/* send bc/mc frame back to the same bss */\n\t\t\tif (!pEntry)\n\t\t\t\tRTMP_SET_PACKET_NET_DEVICE_MBSSID(pForwardPacket, FromWhichBSSID);\n\n\t\t\tRTMP_SET_PACKET_WCID(pForwardPacket, pEntry ? pEntry->Aid : MCAST_WCID);\t\t\t\n\t\t\tRTMP_SET_PACKET_SOURCE(pForwardPacket, PKTSRC_NDIS);\n\t\t\tRTMP_SET_PACKET_MOREDATA(pForwardPacket, FALSE);\n\n#ifdef INF_AMAZON_SE\n\t\t\t/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */\n\t\t\tRTMP_SET_PACKET_NOBULKOUT(pForwardPacket, TRUE);\n#endif /* INF_AMAZON_SE */\n\n\t\t\tAPSendPacket(pAd, pForwardPacket);\n\t\t}\n\n\t\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t}\n\t\n\treturn bAnnounce;\n}\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tThis routine is used to do insert packet into power-saveing queue.\n\t\n\tArguments:\n\t\tpAd: Pointer to our adapter\n\t\tpPacket: Pointer to send packet\n\t\tpMacEntry: portint to entry of MacTab. the pMacEntry store attribute of client (STA).\n\t\tQueIdx: Priority queue idex.\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS:If succes to queue the packet into TxSwQueue.\n\t\tNDIS_STATUS_FAILURE: If failed to do en-queue.\n========================================================================\n*/\nNDIS_STATUS APInsertPsQueue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket,\n\tIN MAC_TABLE_ENTRY *pMacEntry,\n\tIN UCHAR QueIdx)\n{\n\tULONG IrqFlags;\n#ifdef UAPSD_SUPPORT\n\t/* put the U-APSD packet to its U-APSD queue by AC ID */\n\tUINT32 ac_id = QueIdx - QID_AC_BE; /* should be >= 0 */\n\n\n\tif (UAPSD_MR_IS_UAPSD_AC(pMacEntry, ac_id))\n\t\tUAPSD_PacketEnqueue(pAd, pMacEntry, pPacket, ac_id);\n\telse\n#endif /* UAPSD_SUPPORT */\n\t{\n\t\tif (pMacEntry->PsQueue.Number >= MAX_PACKETS_IN_PS_QUEUE)\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\t\t\t\n\t\t\treturn NDIS_STATUS_FAILURE;\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\tInsertTailQueue(&pMacEntry->PsQueue, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\t}\n\t}\n\n\t/* mark corresponding TIM bit in outgoing BEACON frame */\n#ifdef UAPSD_SUPPORT\n\tif (UAPSD_MR_IS_NOT_TIM_BIT_NEEDED_HANDLED(pMacEntry, QueIdx))\n\t{\n\t\t/* 1. the station is UAPSD station;\n\t\t2. one of AC is non-UAPSD (legacy) AC;\n\t\t3. the destinated AC of the packet is UAPSD AC. */\n\t\t/* So we can not set TIM bit due to one of AC is legacy AC */\n\t}\n\telse\n#endif /* UAPSD_SUPPORT */\n\t{\n\t\tWLAN_MR_TIM_BIT_SET(pAd, pMacEntry->apidx, pMacEntry->Aid);\n\t}\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\nVOID\tApCliRTMPSendNullFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tTxRate,\n\tIN\tBOOLEAN \t\tbQosNull,\n\tIN PMAC_TABLE_ENTRY pMacEntry)\n{\n\tUCHAR\tNullFrame[48];\n\tULONG\tLength;\n\tPHEADER_802_11\tpHeader_802_11;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[pMacEntry->MatchAPCLITabIdx];\n\n    /* WPA 802.1x secured port control */\n    if (((pApCliEntry->AuthMode == Ndis802_11AuthModeWPA) || \n         (pApCliEntry->AuthMode == Ndis802_11AuthModeWPAPSK) ||\n         (pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2) || \n         (pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t  || (pApCliEntry->IEEE8021X == TRUE)\t\t\t\t\n#ifdef WAPI_SUPPORT\n\t\t  || (pApCliEntry->AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t  || (pApCliEntry->AuthMode == Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */ \n        ) &&\n       (pMacEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED)) \n\t{\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(NullFrame, 48);\n\tLength = sizeof(HEADER_802_11);\n\n\tpHeader_802_11 = (PHEADER_802_11) NullFrame;\n\t\n\tpHeader_802_11->FC.Type = BTYPE_DATA;\n\tpHeader_802_11->FC.SubType = SUBTYPE_NULL_FUNC;\n\tpHeader_802_11->FC.ToDs = 1;\n\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr1, pMacEntry->Addr);\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr2, pApCliEntry->CurrentAddress);\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr3, pMacEntry->Addr);\n\n\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t{\n\t\tpHeader_802_11->FC.PwrMgmt = PWR_SAVE;\n\t}\n\telse\n\t{\n\t\tpHeader_802_11->FC.PwrMgmt = 0;\n\t}\n\tpHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);\n\n\t/* sequence is increased in MlmeHardTx */\n\tpHeader_802_11->Sequence = pAd->Sequence;\n\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ; /* next sequence  */\n\n\t/* Prepare QosNull function frame */\n\tif (bQosNull)\n\t{\n\t\tpHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL;\n\t\t\n\t\t/* copy QOS control bytes */\n\t\tNullFrame[Length]\t=  0;\n\t\tNullFrame[Length+1] =  0;\n\t\tLength += 2;/* if pad with 2 bytes for alignment, APSD will fail */\n\t}\n\t\n\tHAL_KickOutNullFrameTx(pAd, 0, NullFrame, Length);\n\n}\n#endif /*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n"
  },
  {
    "path": "src/ap/ap_dls.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n \n    Abstract:\n \n    Handle WMM-DLS state machine.\n\n***************************************************************************/\n\n#include \"rt_config.h\"\n\n\n#ifdef QOS_DLS_SUPPORT\n\n/*\n========================================================================\nRoutine Description:\n    DLS state machine init, including state transition and timer init.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    S\t\t\t\tpointer to the DLS state machine\n\tTrans[]\t\t\t\n\nReturn Value:\n    None\n\n    Note:\n        The state machine looks like the following \n\n                                    DLS_IDLE             \n        MT2_PEER_DLS_REQ\t\t\tPeerDlsReqAction \n        MT2_PEER_DLS_RSP\t\t\tPeerDlsRspAction     \n        MT2_PEER_DLS_TEAR_DOWN\t\tPeerDlsTearDownAction\n========================================================================\n */\nVOID APDLSStateMachineInit(\n    IN\tPRTMP_ADAPTER\t\tpAd, \n    IN  STATE_MACHINE\t\t*S, \n    OUT STATE_MACHINE_FUNC\tTrans[]) \n{\n    StateMachineInit(S, (STATE_MACHINE_FUNC*)Trans, MAX_DLS_STATE, MAX_DLS_MSG,\n\t\t\t\t\t(STATE_MACHINE_FUNC)Drop, DLS_IDLE, DLS_MACHINE_BASE);\n\n    StateMachineSetAction(S, DLS_IDLE, MT2_PEER_DLS_REQ,\n\t\t\t\t\t\t\t(STATE_MACHINE_FUNC)APPeerDlsReqAction);\n    StateMachineSetAction(S, DLS_IDLE, MT2_PEER_DLS_RSP,\n\t\t\t\t\t\t\t(STATE_MACHINE_FUNC)APPeerDlsRspAction);\n    StateMachineSetAction(S, DLS_IDLE, MT2_PEER_DLS_TEAR_DOWN,\n\t\t\t\t\t\t\t(STATE_MACHINE_FUNC)APPeerDlsTearDownAction);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandle peer DLS Request action frame.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    *pElem\t\t\taction frame\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID APPeerDlsReqAction(\n    IN PRTMP_ADAPTER\tpAd,\n    IN MLME_QUEUE_ELEM\t*pElem)\n{\n\tPMAC_TABLE_ENTRY\tpDAEntry, pSAEntry;\n\tUCHAR\t\t\t\tDA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];\n\tUINT16\t\t\t\tCapabilityInfo;\n\tUINT16\t\t\t\tDLSTimeout;\n\tPUCHAR\t\t\t\tpOutBuffer = NULL;\n\tPFRAME_802_11\t\tFr;\n\tUINT16\t\t\t\tStatus;\n\tUINT32\t\t\t\tFrameLen = 0;\n\tHEADER_802_11\t\tDlsRspHdr;\n\tUCHAR\t\t\t\tCategory = CATEGORY_DLS;\n\tUCHAR\t\t\t\tAction = ACTION_DLS_RESPONSE;\n    UCHAR\t\t\t\tSupportedRatesLen = 0;\n    UCHAR\t\t\t\tSupportedRates[MAX_LEN_OF_SUPPORTED_RATES];\n\tHT_CAPABILITY_IE\tHtCapability;\n\tUCHAR\t\t\t\tHtCapabilityLen;\n\n\n\t/* frame sanity check */\n    if (!PeerDlsReqSanity(pAd, pElem->Msg, pElem->MsgLen, DA, SA,\n\t\t\t\t\t\t\t&CapabilityInfo, &DLSTimeout,\n\t\t\t\t\t\t\t&SupportedRatesLen, &SupportedRates[0],\n\t\t\t\t\t\t\t&HtCapabilityLen, &HtCapability))\n\t{\n        return;\n\t}\n\n\t/* check whether the source station is legal */\n\tpSAEntry = MacTableLookup(pAd, SA);\n\tif (!pSAEntry)\n\t\treturn;\n\n\tpSAEntry->bDlsInit\t= FALSE;\n\n\t/* check whether the destination station exists in our associated table */\n\tpDAEntry = MacTableLookup(pAd, DA);\n\tif (!pDAEntry)\n\t\tStatus = MLME_DEST_STA_NOT_IN_QBSS;\n\telse if (pDAEntry && (pDAEntry->apidx != pSAEntry->apidx))\n\t\tStatus = MLME_DEST_STA_NOT_IN_QBSS;\n\telse if (pDAEntry && !CLIENT_STATUS_TEST_FLAG(pDAEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\tStatus = MLME_DEST_STA_IS_NOT_A_QSTA;\n\telse if (pDAEntry->WepStatus != pSAEntry->WepStatus)\n\t\tStatus = MLME_QOS_UNSPECIFY; /* different security algorithm */\n\telse if (!pAd->ApCfg.MBSSID[pSAEntry->apidx].bDLSCapable)\n\t\tStatus = MLME_DLS_NOT_ALLOW_IN_QBSS;\n\telse\n\t\tStatus = MLME_SUCCESS;\n\n\tif (pDAEntry)\n\t\tpDAEntry->bDlsInit\t= FALSE;\n\n\t/* forward DLS-Request to real destination */\n\tFr = (PFRAME_802_11)pElem->Msg;\n\n/*\tpOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n\tif(pOutBuffer == NULL)\n\t\treturn;\n\n\t/*\n\t\tIf status is successful, forward DLS-Request frame to destination\n\t\totherwise send DLS-Response with reason code to originator.\n\t*/\n\tif (Status == MLME_SUCCESS)\n\t{\n\t\tNdisMoveMemory(Fr->Hdr.Addr1, DA, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(Fr->Hdr.Addr2, pAd->ApCfg.MBSSID[pSAEntry->apidx].Bssid, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(Fr->Hdr.Addr3, SA, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(pOutBuffer, pElem->Msg, pElem->MsgLen);\n\t\tFrameLen = pElem->MsgLen;\n\t}\n\telse\n\t{\n\t\t/* response error to source station */\n\t\tMgtMacHeaderInit(pAd, &DlsRspHdr, SUBTYPE_ACTION, 0, SA,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pSAEntry->apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pSAEntry->apidx].Bssid);\n\n\t\t/*\n\t\t\tCapability information and supported rate field are present\n\t\t\tonly when status code is zero.\n\t\t*/\n        MakeOutgoingFrame(pOutBuffer,\t\t\t\t(ULONG *) &FrameLen,\n                          sizeof(HEADER_802_11),\t&DlsRspHdr,\n                          1,\t\t\t\t\t\t&Category,\n                          1,\t\t\t\t\t\t&Action,\n                          2,\t\t\t\t\t\t&Status,\n                          6,\t\t\t\t\t\tSA,\n                          6,\t\t\t\t\t\tDA,\n                          END_OF_ARGS);\n\t}\n\n\t/* transmit the frame */\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n/*\tkfree(pOutBuffer); */\n\tos_free_mem(NULL, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"DLS - APPeerDlsReqAction() from %02x:%02x:%02x:%02x:%02x:%02x \"\n\t\t\t\"with Status=%d\\n\",\n\t\t\tSA[0], SA[1], SA[2], SA[3], SA[4], SA[5], Status));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandle peer DLS Response action frame.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    *pElem\t\t\taction frame\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID APPeerDlsRspAction(\n    IN PRTMP_ADAPTER\tpAd,\n    IN MLME_QUEUE_ELEM\t*pElem)\n{\n\tPMAC_TABLE_ENTRY\tpDAEntry, pSAEntry;\n\tUCHAR\t\t\t\tDA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];\n\tUINT16\t\t\t\tCapabilityInfo;\n\tUINT16\t\t\t\tStatusCode;\n\tPUCHAR\t\t\t\tpOutBuffer = NULL;\n\tPFRAME_802_11\t\tFr;\n\tUINT32\t\t\t\tFrameLen = 0;\n    UCHAR\t\t\t\tSupportedRatesLen = 0;\n    UCHAR\t\t\t\tSupportedRates[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t\t\tHtCapabilityLen;\n\tHT_CAPABILITY_IE\tHtCapability;\n\n\n\t/* frame sanity check */\n\tif (! PeerDlsRspSanity(pAd, pElem->Msg, pElem->MsgLen, DA, SA,\n\t\t\t\t\t\t\t&CapabilityInfo, &StatusCode,\n\t\t\t\t\t\t\t&SupportedRatesLen, &SupportedRates[0],\n\t\t\t\t\t\t\t&HtCapabilityLen, &HtCapability))\n\t{\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x \"\n\t\t\t\"with StatusCode=%d\\n\",\n\t\t\tSA[0], SA[1], SA[2], SA[3], SA[4], SA[5], StatusCode));\n\n\t/* check whether the source station is legal */\n\tpSAEntry = MacTableLookup(pAd, SA);\n\tif (!pSAEntry)\n    \t\treturn;\n\n\tpDAEntry = MacTableLookup(pAd, DA);\n\tif (!pDAEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Destination station does not exist!\\n\"));\n\t\treturn;\n\t}\n\n\tpSAEntry->bDlsInit = FALSE;\n\n\t/* forward DLS-Request to real destination */\n\tFr = (PFRAME_802_11)pElem->Msg;\n\n/*\tpOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n\tif (pOutBuffer == NULL)\n\t\treturn; /* fatal error, no available memory */\n\n\tNdisMoveMemory(Fr->Hdr.Addr1, DA, MAC_ADDR_LEN);\n\tNdisMoveMemory(Fr->Hdr.Addr2, pAd->ApCfg.MBSSID[pSAEntry->apidx].Bssid, MAC_ADDR_LEN);\n\tNdisMoveMemory(Fr->Hdr.Addr3, SA, MAC_ADDR_LEN);\n\n\tNdisMoveMemory(pOutBuffer, pElem->Msg, pElem->MsgLen);\n\tFrameLen = pElem->MsgLen;\n\n\t/* transmit the response frame */\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n/*\tkfree(pOutBuffer); */\n\tos_free_mem(NULL, pOutBuffer);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandle peer DLS Tear down action frame.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    *pElem\t\t\taction frame\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID APPeerDlsTearDownAction(\n    IN PRTMP_ADAPTER\tpAd,\n    IN MLME_QUEUE_ELEM\t*pElem)\n{\n\tPMAC_TABLE_ENTRY\tpDAEntry, pSAEntry;\n\tUCHAR\t\t\t\tDA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];\n\tUINT16\t\t\t\tReasonCode;\n\tPUCHAR\t\t\t\tpOutBuffer = NULL;\n\tPFRAME_802_11\t\tFr;\n\tUINT32\t\t\t\tFrameLen = 0;\n\n\n\t/* frame sanity check */\n    if (! PeerDlsTearDownSanity(pAd, pElem->Msg, pElem->MsgLen,\n\t\t\t\t\t\t\t\t\tDA, SA, &ReasonCode))\n\t{\n        return;\n\t}\n\n    DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"DLS - PeerDlsTearDownAction() from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tSA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));\n\n\tpSAEntry = MacTableLookup(pAd, SA);\n    if (!pSAEntry)\n    \treturn;\n\n\tpDAEntry = MacTableLookup(pAd, DA);\n\tif (!pDAEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Destination station does not exist!\\n\"));\n\t\treturn;\n\t}\n\n\tpSAEntry->bDlsInit = FALSE;\n\n    /* forward Tear-down to real destination */\n    Fr = (PFRAME_802_11)pElem->Msg;\n\n/*\tpOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n\tif (pOutBuffer == NULL)\n\t\treturn; /* fatal error, no available memory */\n\n\tNdisMoveMemory(Fr->Hdr.Addr1, DA, MAC_ADDR_LEN);\n\tNdisMoveMemory(Fr->Hdr.Addr2, pAd->ApCfg.MBSSID[pSAEntry->apidx].Bssid, MAC_ADDR_LEN);\n\tNdisMoveMemory(Fr->Hdr.Addr3, SA, MAC_ADDR_LEN);\n\n\tNdisMoveMemory(pOutBuffer, pElem->Msg, pElem->MsgLen);\n\tFrameLen = pElem->MsgLen;\n\n\t/* transmit the tear down frame */\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n/*\tkfree(pOutBuffer); */\n\tos_free_mem(NULL, pOutBuffer);\n}\n\n#endif /* QOS_DLS_SUPPORT */\n\n/* End of ap_dls.c */\n"
  },
  {
    "path": "src/ap/ap_ftkd.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll related IEEE802.11r Key Distribution Protocol (FT KDP) body.\n\n\tOverview:\n\n\t1. A station associates to us, send out a broadcast ADD-Notify packet.\n\n\t\tASSOC -->\n\t\tFT_KDP_EVENT_INFORM(FT_KDP_SIG_FT_ASSOCIATION) -->\n\t\tFT_KDP_EventInform(FT_KDP_SIG_FT_ASSOCIATION) -->\n\t\tNotify IAPP daemon, IAPP_RcvHandlerRawDrv(), IAPP_SIG_Process() -->\n\t\tSend ADD-Notify packet, IAPP_UDP_PacketSend(), IAPP_L2UpdateFrameSend()\n\n\t2. When receiving a ADD-Notify packet, send a unicast SSB packet to\n\t\trequest PMK-R1 key for the station with our R0KH.\n\n\t\tIAPP daemon, IAPP_RcvHandlerUdp() -->\n\t\tNotify driver, IAPP_MsgProcess() -->\n\t\tIOCTL, RTMPAPSetInformation() -->\n\t\tFT_KDP_StationInform() -->\n\t\tNotify IAPP daemon, FT_KDP_EventInform(FT_KDP_SIG_KEY_REQ_AUTO) -->\n\t\tNotify IAPP daemon, IAPP_RcvHandlerRawDrv(), IAPP_SIG_Process() -->\n\t\tSend SSB packet with R0KHID = 0, by using TCP or UDP based on peerIP\n\n\t3. A station reassociates to us, send out a MOVE-Request packet.\n\n\t\tREASSOC -->\n\t\tFT_KDP_EVENT_INFORM(FT_KDP_SIG_FT_REASSOCIATION) -->\n\t\tFT_KDP_EventInform(FT_KDP_SIG_FT_REASSOCIATION) -->\n\t\tNotify IAPP daemon, IAPP_RcvHandlerRawDrv(), IAPP_SIG_Process() -->\n\t\tSend MOVE-Request packet by using TCP or UDP, IAPP_L2UpdateFrameSend()\n\n\t4. When receiving a MOVE-Request packet, delete the STA MAC entry.\n\n\t\tIAPP daemon, IAPP_RcvHandlerUdp()/ IAPP_RcvHandlerTcp() -->\n\t\tNotify driver, IAPP_MsgProcess() -->\n\t\tIOCTL, RTMPAPSetInformation() -->\n\t\tRT_SET_DEL_MAC_ENTRY -->\n\t\tSend MOVE-Response packet by using TCP, FT_KDP_MoveFrameSend()\n\n\t5. When receiving a MOVE-Response packet, nothing to do.\n\n\t6. When receiving a SSB packet (i.e. key request), send a unicast SAB\n\t\tpacket to response the key to the R1KH.\n\n\t\tIAPP daemon -->\n\t\tNotify driver, IAPP_MsgProcess() -->\n\t\tIOCTL, RTMPAPSetInformation() -->\n\t\tFT_KDP_IOCTL_KEY_REQ() -->\n\t\tNotify IAPP daemon, FT_KDP_EventInform(FT_KDP_SIG_KEY_RSP_AUTO) -->\n\t\tSend SAB packet with my R0KHID, FT_KDP_SecurityBlockSend() by using TCP\n\n\t7. When receiving a SAB packet (i.e. key response), set the PMK-R1 key.\n\n\t\tIAPP daemon -->\n\t\tNotify driver, IAPP_MsgProcess() -->\n\t\tIOCTL, RTMPAPSetInformation() -->\n\t\tFT_KDP_KeyResponseToUs()\n\n\t8. Send a information broadcast to the LAN periodically.\n\n***************************************************************************/\n\n"
  },
  {
    "path": "src/ap/ap_ids.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n     \n     Module Name:\n     ap_ids.c\n     \n     Abstract:\n     monitor intrusion detection condition\n     \n     Revision History:\n     Who         When          What\n     --------    ----------    ----------------------------------------------\n */\n#ifdef IDS_SUPPORT\n\n#include \"rt_config.h\"\n\n#define IDS_EXEC_INTV          1000\t\t\t\t/* 1 sec */\n\n\nVOID RTMPIdsStart(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\n\tif (pAd->ApCfg.IDSTimerRunning == FALSE)\n\t{\t\t\n\t\tRTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV);\n\t\tpAd->ApCfg.IDSTimerRunning = TRUE;\n\t}\n}\n\nVOID RTMPIdsStop(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tBOOLEAN     Cancelled;\n\t\n\tif (pAd->ApCfg.IDSTimerRunning == TRUE)\n\t{\n\t\tRTMPCancelTimer(&pAd->ApCfg.IDSTimer, &Cancelled);\n\t\tpAd->ApCfg.IDSTimerRunning = FALSE;\n\t}\n}\n\n#ifdef SYSTEM_LOG_SUPPORT\nVOID RTMPHandleIdsEvent(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tINT i, j;\n\n\tUINT32\tFloodFrameCount[IW_FLOOD_EVENT_TYPE_NUM];\n\tUINT32\tFloodFrameThreshold[IW_FLOOD_EVENT_TYPE_NUM];\n\n\tFloodFrameCount[0] = pAd->ApCfg.RcvdAuthCount;\n\tFloodFrameCount[1] = pAd->ApCfg.RcvdAssocReqCount;\n\tFloodFrameCount[2] = pAd->ApCfg.RcvdReassocReqCount;\n\tFloodFrameCount[3] = pAd->ApCfg.RcvdProbeReqCount;\n\tFloodFrameCount[4] = pAd->ApCfg.RcvdDisassocCount;\n\tFloodFrameCount[5] = pAd->ApCfg.RcvdDeauthCount;\n\tFloodFrameCount[6] = pAd->ApCfg.RcvdEapReqCount;\n\n\tFloodFrameThreshold[0] = pAd->ApCfg.AuthFloodThreshold;\n\tFloodFrameThreshold[1] = pAd->ApCfg.AssocReqFloodThreshold;\n\tFloodFrameThreshold[2] = pAd->ApCfg.ReassocReqFloodThreshold;\n\tFloodFrameThreshold[3] = pAd->ApCfg.ProbeReqFloodThreshold;\n\tFloodFrameThreshold[4] = pAd->ApCfg.DisassocFloodThreshold;\n\tFloodFrameThreshold[5] = pAd->ApCfg.DeauthFloodThreshold;\n\tFloodFrameThreshold[6] = pAd->ApCfg.EapReqFloodThreshold;\n\n\t/* trigger flooding traffic event */\n\tfor (j = 0; j < IW_FLOOD_EVENT_TYPE_NUM; j++)\n\t{\t\t\n\t\tif ((FloodFrameThreshold[j] > 0) && (FloodFrameCount[j] > FloodFrameThreshold[j]))\n\t\t{\t\t\t\t\t\t\n\t\t\tRTMPSendWirelessEvent(pAd, IW_FLOOD_AUTH_EVENT_FLAG + j, NULL, MAX_MBSSID_NUM(pAd), 0);\t\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"flooding traffic event(%d) - %d\\n\", IW_FLOOD_AUTH_EVENT_FLAG + j, FloodFrameCount[j])); */\n\t\t}\n\t}\t\n\t\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t{\t\n\t\tUINT32\tSpoofedFrameCount[IW_SPOOF_EVENT_TYPE_NUM];\n\t\tCHAR\tRssiOfSpoofedFrame[IW_SPOOF_EVENT_TYPE_NUM];\n\t\tINT\t\tk;\n\n\t\tSpoofedFrameCount[0] = pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount;\n\t\tSpoofedFrameCount[1] = pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount;\n\t\tSpoofedFrameCount[2] = pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount;\n\t\tSpoofedFrameCount[3] = pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount;\n\t\tSpoofedFrameCount[4] = pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount;\n\t\tSpoofedFrameCount[5] = pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount;\n\t\tSpoofedFrameCount[6] = pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount;\n\t\tSpoofedFrameCount[7] = pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount;\n\t\tSpoofedFrameCount[8] = pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount;\n\t\tSpoofedFrameCount[9] = pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount;\n\n\t\tRssiOfSpoofedFrame[0] = pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid;\n\t\tRssiOfSpoofedFrame[1] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp;\n\t\tRssiOfSpoofedFrame[2] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp;\n\t\tRssiOfSpoofedFrame[3] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp;\n\t\tRssiOfSpoofedFrame[4] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon;\n\t\tRssiOfSpoofedFrame[5] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc;\n\t\tRssiOfSpoofedFrame[6] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth;\n\t\tRssiOfSpoofedFrame[7] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth;\n\t\tRssiOfSpoofedFrame[8] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt;\n\t\tRssiOfSpoofedFrame[9] = pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack;\n\n\t\t/* trigger spoofed attack event */\n\t\tfor (k = 0; k < IW_SPOOF_EVENT_TYPE_NUM; k++)\n\t\t{\n\t\t\tif (SpoofedFrameCount[k] > 0)\n\t\t\t{\t\t\t\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_CONFLICT_SSID_EVENT_FLAG + k, NULL, i, RssiOfSpoofedFrame[k]);\t\n\t\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"spoofed attack event(%d) - %d\\n\", IW_CONFLICT_SSID_EVENT_FLAG + k, SpoofedFrameCount[k])); */\n\t\t\t}\n\t\t}\t\t\t\t\t\n\t}\n\n}\n#endif /* SYSTEM_LOG_SUPPORT */\n\nVOID RTMPClearAllIdsCounter(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tINT\ti;\n\n\tpAd->ApCfg.RcvdAuthCount = 0;\n\tpAd->ApCfg.RcvdAssocReqCount = 0;\n\tpAd->ApCfg.RcvdReassocReqCount = 0;\n\tpAd->ApCfg.RcvdProbeReqCount = 0;\n\tpAd->ApCfg.RcvdDisassocCount = 0;\n\tpAd->ApCfg.RcvdDeauthCount = 0;\n\tpAd->ApCfg.RcvdEapReqCount = 0;\n\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t{\n\t\tpAd->ApCfg.MBSSID[i].RcvdConflictSsidCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount = 0;\n\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount = 0;\t\n\t\tpAd->ApCfg.MBSSID[i].RcvdReplayAttackCount = 0;\t\t\n\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = 0;\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = 0;\t\n\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = 0;\t\t\n\t\t\n\t}\n}\n\nVOID RTMPIdsPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tpAd->ApCfg.IDSTimerRunning = FALSE;\n\n#ifdef SYSTEM_LOG_SUPPORT\n\t/* when IDS occured, send out wireless event */\n\tif (pAd->CommonCfg.bWirelessEvent)\t\n\t\tRTMPHandleIdsEvent(pAd);\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\t/* clear all IDS counter */\n\tRTMPClearAllIdsCounter(pAd);\n\n\t/* set timer */\n\tif (pAd->ApCfg.IdsEnable)\n\t{\n\t\tRTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV);\n\t\tpAd->ApCfg.IDSTimerRunning = TRUE;\n\t}\t\n}\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tThis routine is used to check if a rogue AP sent an 802.11 management\n\t\tframe to a client using our BSSID.\n\t\t\n\tArguments:\n\t\tpAd    \t- Pointer to our adapter\n\t\tpHeader - Pointer to 802.11 header\n\n\tReturn Value:\n\t\tTRUE\t- This is a spoofed frame\n\t\tFALSE\t- This isn't a spoofed frame\n\n\t========================================================================\n*/\nBOOLEAN RTMPSpoofedMgmtDetection(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PHEADER_802_11 \tpHeader,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2,\n\tIN UCHAR\t\t\tAntSel)\n{\n\tINT\ti;\t\n\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t{\n\t\t/* Spoofed BSSID detection */\n\t\tif (NdisEqualMemory(pHeader->Addr2, pAd->ApCfg.MBSSID[i].Bssid, MAC_ADDR_LEN))\n\t\t{\n\t\t\tCHAR RcvdRssi;\n\t\t\n\t\t\tRcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Rssi0, RSSI_0, AntSel, BW_20), ConvertToRssi(pAd, Rssi1, RSSI_1, AntSel, BW_20), ConvertToRssi(pAd, Rssi2, RSSI_2, AntSel, BW_20));\n\t\t\n\t\t\tswitch (pHeader->FC.SubType) \n\t\t\t{\n        \t\tcase SUBTYPE_ASSOC_RSP:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = RcvdRssi;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SUBTYPE_REASSOC_RSP:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = RcvdRssi;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SUBTYPE_PROBE_RSP:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = RcvdRssi;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SUBTYPE_BEACON:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = RcvdRssi;\n\t\t\t\t\tbreak;\t\n\n\t\t\t\tcase SUBTYPE_DISASSOC:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = RcvdRssi;\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase SUBTYPE_AUTH:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = RcvdRssi;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SUBTYPE_DEAUTH:\n          \t\t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = RcvdRssi;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n            \t\tpAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount ++;\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = RcvdRssi;\n            \t\tbreak;\t\n\n\t\t\t}\t\t\t\t\t\n\n\t\t\treturn TRUE;\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\treturn FALSE;\n}\n\n\nVOID RTMPConflictSsidDetection(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PUCHAR\t\t\tpSsid,\n\tIN UCHAR\t\t\tSsidLen,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2,\n\tIN UCHAR\t\t\tAntSel)\n{\n\tINT\ti;\n\t\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t{\n\t\t/* Conflict SSID detection */\n\t\tif (SSID_EQUAL(pSsid, SsidLen, pAd->ApCfg.MBSSID[i].Ssid, pAd->ApCfg.MBSSID[i].SsidLen))\n\t\t{\n\t\t\tCHAR RcvdRssi;\n\t\t\n\t\t\tRcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Rssi0, RSSI_0, AntSel, BW_20), ConvertToRssi(pAd, Rssi1, RSSI_1, AntSel, BW_20), ConvertToRssi(pAd, Rssi2, RSSI_2, AntSel, BW_20));\n\n\t\t\tpAd->ApCfg.MBSSID[i].RcvdConflictSsidCount ++;\n\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = RcvdRssi;\n\t\t\treturn;\n\t\t}\t\n\t}\t\t\t\n}\n\nBOOLEAN RTMPReplayAttackDetection(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PUCHAR\t\t\tpAddr2,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2,\n\tIN UCHAR\t\t\tAntSel,\n\tIN UCHAR\t\t\tBW)\n{\n\tINT\ti;\n\t\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t{\n\t\t/* Conflict SSID detection */\n\t\tif (NdisEqualMemory(pAddr2, pAd->ApCfg.MBSSID[i].Bssid, MAC_ADDR_LEN))\n\t\t{\n\t\t\tCHAR RcvdRssi;\n\t\t\n\t\t\tRcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Rssi0, RSSI_0, AntSel, BW), ConvertToRssi(pAd, Rssi1, RSSI_1, AntSel, BW), ConvertToRssi(pAd, Rssi2, RSSI_2, AntSel, BW));\n\t\t\n\t\t\tpAd->ApCfg.MBSSID[i].RcvdReplayAttackCount ++;\n\t\t\tpAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = RcvdRssi;\n\t\t\treturn TRUE;\n\t\t}\t\n\t}\t\n\treturn FALSE;\n}\n\nVOID RTMPUpdateStaMgmtCounter(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN USHORT\t\t\ttype)\n{\n\t\t\n\tswitch (type)\n\t{\n\t\tcase SUBTYPE_ASSOC_REQ:\n          \tpAd->ApCfg.RcvdAssocReqCount ++;\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"RcvdAssocReqCount=%d\\n\", pAd->ApCfg.RcvdAssocReqCount)); */\n\t\t\tbreak;\n\n\t\tcase SUBTYPE_REASSOC_REQ:\n          \tpAd->ApCfg.RcvdReassocReqCount ++;\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"RcvdReassocReqCount=%d\\n\", pAd->ApCfg.RcvdReassocReqCount)); */\n\t\t\tbreak;\n\n\t\tcase SUBTYPE_PROBE_REQ:\n          \tpAd->ApCfg.RcvdProbeReqCount ++;\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"RcvdProbeReqCount=%d\\n\", pAd->ApCfg.RcvdProbeReqCount)); */\n\t\t\tbreak;\t\n\n\t\tcase SUBTYPE_DISASSOC:\n          \tpAd->ApCfg.RcvdDisassocCount ++;\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"RcvdDisassocCount=%d\\n\", pAd->ApCfg.RcvdDisassocCount)); */\n\t\t\tbreak;\n\n\t\tcase SUBTYPE_DEAUTH:\n          \tpAd->ApCfg.RcvdDeauthCount ++;\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"RcvdDeauthCount=%d\\n\", pAd->ApCfg.RcvdDeauthCount)); */\n\t\t\tbreak;\n\n\t\tcase SUBTYPE_AUTH:\n          \tpAd->ApCfg.RcvdAuthCount ++;\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"RcvdAuthCount=%d\\n\", pAd->ApCfg.RcvdAuthCount)); */\n\t\t\tbreak;\t\n\n\t}\n\t\n}\n\nVOID rtmp_read_ids_from_file(\n\t\t\tIN  PRTMP_ADAPTER pAd,\n\t\t\tPSTRING tmpbuf,\n\t\t\tPSTRING buffer)\n{\t\n\t/*IdsEnable */\n\tif(RTMPGetKeyParameter(\"IdsEnable\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tif (simple_strtol(tmpbuf, 0, 10) == 1)\n\t\t\tpAd->ApCfg.IdsEnable = TRUE;\n\t\telse\n\t\t\tpAd->ApCfg.IdsEnable = FALSE;\n\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IDS is %s\\n\", pAd->ApCfg.IdsEnable ? \"enabled\" : \"disabled\"));\n\t}\n\n\t/*AuthFloodThreshold */\n\tif(RTMPGetKeyParameter(\"AuthFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.AuthFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AuthFloodThreshold = %d\\n\", pAd->ApCfg.AuthFloodThreshold));\n\t}\n\n\t/*AssocReqFloodThreshold */\n\tif(RTMPGetKeyParameter(\"AssocReqFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.AssocReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AssocReqFloodThreshold = %d\\n\", pAd->ApCfg.AssocReqFloodThreshold));\n\t}\n\n\t/*ReassocReqFloodThreshold */\n\tif(RTMPGetKeyParameter(\"ReassocReqFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.ReassocReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ReassocReqFloodThreshold = %d\\n\", pAd->ApCfg.ReassocReqFloodThreshold));\n\t}\n\n\t/*ProbeReqFloodThreshold */\n\tif(RTMPGetKeyParameter(\"ProbeReqFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.ProbeReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProbeReqFloodThreshold = %d\\n\", pAd->ApCfg.ProbeReqFloodThreshold));\n\t}\n\n\t/*DisassocFloodThreshold */\n\tif(RTMPGetKeyParameter(\"DisassocFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.DisassocFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DisassocFloodThreshold = %d\\n\", pAd->ApCfg.DisassocFloodThreshold));\n\t}\n\n\t/*DeauthFloodThreshold */\n\tif(RTMPGetKeyParameter(\"DeauthFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.DeauthFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DeauthFloodThreshold = %d\\n\", pAd->ApCfg.DeauthFloodThreshold));\n\t}\n\n\t/*EapReqFloodThreshold */\n\tif(RTMPGetKeyParameter(\"EapReqFloodThreshold\", tmpbuf, 10, buffer, TRUE))\n\t{\t\t\t\t\t\t\n\t\tpAd->ApCfg.EapReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EapReqFloodThreshold = %d\\n\", pAd->ApCfg.EapReqFloodThreshold));\n\t}\n}\n\n#endif /* IDS_SUPPORT */\n"
  },
  {
    "path": "src/ap/ap_mbss.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n    Abstract:\n\n    Support multi-BSS function.\n\n    Note:\n    1. Call RT28xx_MBSS_Init() in init function and\n       call RT28xx_MBSS_Remove() in close function\n\n    2. MAC of different BSS is initialized in APStartUp()\n\n    3. BSS Index (0 ~ 15) of different rx packet is got in\n       APHandleRxDoneInterrupt() by using FromWhichBSSID = pEntry->apidx;\n       Or FromWhichBSSID = BSS0;\n\n    4. BSS Index (0 ~ 15) of different tx packet is assigned in\n       MBSS_VirtualIF_PacketSend() by using RTMP_SET_PACKET_NET_DEVICE_MBSSID()\n    5. BSS Index (0 ~ 15) of different BSS is got in APHardTransmit() by using\n       RTMP_GET_PACKET_IF()\n\n    6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if\n\n    7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1\n       to the register MAC_BSSID_DW1\n\n    8. The number of MBSS can be 1, 2, 4, or 8\n\n***************************************************************************/\n#ifdef MBSS_SUPPORT\n\n#define MODULE_MBSS\n#include \"rt_config.h\"\n\n\n/* --------------------------------- Public -------------------------------- */\n/*\n========================================================================\nRoutine Description:\n    Initialize Multi-BSS function.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    pDevMain\t\tpoints to the main BSS network interface\n\nReturn Value:\n    None\n\nNote:\n\t1. Only create and initialize virtual network interfaces.\n\t2. No main network interface here.\n\t3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat,\n\t\tit will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again.\n========================================================================\n*/\n\nextern void RtmpOSNetDevProtect(\n\tIN BOOLEAN lock_it);\n\nVOID MBSS_Init(\n\tIN PRTMP_ADAPTER \t\t\t\tpAd,\n\tIN RTMP_OS_NETDEV_OP_HOOK\t\t*pNetDevOps)\n{\n#define MBSS_MAX_DEV_NUM\t32\n\tPNET_DEV pDevNew;\n\tINT32 IdBss, MaxNumBss;\n\tINT status;\n\tRTMP_OS_NETDEV_OP_HOOK\tnetDevHook;\n\n\t/* sanity check to avoid redundant virtual interfaces are created */\n\tif (pAd->FlgMbssInit != FALSE)\n\t\treturn;\n\n\n\t/* init */\n\tMaxNumBss = pAd->ApCfg.BssidNum;\n\tif (MaxNumBss > MAX_MBSSID_NUM(pAd))\n\t\tMaxNumBss = MAX_MBSSID_NUM(pAd);\n\n\n\t/* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */\n\tfor(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++)\n\t\tpAd->ApCfg.MBSSID[IdBss].MSSIDDev = NULL;\n\n    /* create virtual network interface */\n\tfor(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++)\n\t{\n\t\tUINT32 MC_RowID = 0, IoctlIF = 0;\n#ifdef MULTIPLE_CARD_SUPPORT\n\t\tMC_RowID = pAd->MC_RowID;\n#endif /* MULTIPLE_CARD_SUPPORT */\n#ifdef HOSTAPD_SUPPORT\n\t\tIoctlIF = pAd->IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n\t\tpDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(PRTMP_ADAPTER), INF_MBSSID_DEV_NAME);\n#ifdef HOSTAPD_SUPPORT\n\t\tpAd->IoctlIF = IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n\t\tif (pDevNew == NULL)\n\t\t{\n\t\t\t/* allocation fail, exit */\n\t\t\tpAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n                     (\"Allocate network device fail (MBSS)...\\n\"));\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Register MBSSID IF (%s)\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew)));\n\t\t}\n\n\t\tRTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd);\n\t\t\n\t\t/* init operation functions and flags */\n\t\tNdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook));\n\n\t\tnetDevHook.priv_flags = INT_MBSSID;\t\t\t/* We are virtual interface */\n\t\tnetDevHook.needProtcted = TRUE;\n\n\t\t/* Init MAC address of virtual network interface */\n\t\tNdisMoveMemory(&netDevHook.devAddr[0], &pAd->ApCfg.MBSSID[IdBss].Bssid[0], MAC_ADDR_LEN);\n\n\t\t/* backup our virtual network interface */\n\t\tpAd->ApCfg.MBSSID[IdBss].MSSIDDev = pDevNew;\n\t\t\n\t\t/* register this device to OS */\n\t\tstatus = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook);\n\n\t}\n\n\tpAd->FlgMbssInit = TRUE;\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Remove Multi-BSS network interface.\n\nArguments:\n\tpAd\t\t\tpoints to our adapter\n\nReturn Value:\n    None\n\nNote:\n    FIRST_MBSSID = 1\n    Main BSS is not removed here.\n========================================================================\n*/\nVOID MBSS_Remove(\n\tIN PRTMP_ADAPTER \tpAd)\n{\n\tMULTISSID_STRUCT *pMbss;\n\tUINT IdBss;\n\n\n\n\tfor(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++)\n\t{\n\t\tpMbss = &pAd->ApCfg.MBSSID[IdBss];\n\t\tRtmpOSNetDevProtect(1);\n\t\tif (pMbss->MSSIDDev)\n\t\t{\n\t\t\tRtmpOSNetDevDetach(pMbss->MSSIDDev);\n\t\t\tRtmpOSNetDevProtect(0);\n\t\t\tRtmpOSNetDevFree(pMbss->MSSIDDev);\n\n\t\t\tRtmpOSNetDevProtect(1);\n\t\t\t/* clear it as NULL to prevent latter access error */\n\t\t\tpMbss->MSSIDDev = NULL;\n\t\t}\n\t\tRtmpOSNetDevProtect(0);\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Get multiple bss idx.\n\nArguments:\n\tpAd\t\t\t\tpoints to our adapter\n\tpDev\t\t\twhich WLAN network interface\n\nReturn Value:\n    0: close successfully\n    otherwise: close fail\n\nNote:\n========================================================================\n*/\nINT32 RT28xx_MBSS_IdxGet(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNET_DEV\t\t\tpDev)\n{\n\tINT32 BssId = -1;\n\tINT32 IdBss;\n\n\n\tfor(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)\n\t{\n\t\tif (pAd->ApCfg.MBSSID[IdBss].MSSIDDev == pDev)\n\t\t{\n\t\t\tBssId = IdBss;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn BssId;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Open a virtual network interface.\n\nArguments:\n\tpDev\t\t\twhich WLAN network interface\n\nReturn Value:\n    0: open successfully\n    otherwise: open fail\n\nNote:\n========================================================================\n*/\nINT MBSS_Open(\n\tIN\tPNET_DEV\t\tpDev)\n{\n\tPRTMP_ADAPTER pAd;\n\tINT BssId;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\tBssId = RT28xx_MBSS_IdxGet(pAd, pDev);\n    if (BssId < 0)\n        return -1;\n    \n    pAd->ApCfg.MBSSID[BssId].bBcnSntReq = TRUE;\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Close a virtual network interface.\n\nArguments:\n    pDev           which WLAN network interface\n\nReturn Value:\n    0: close successfully\n    otherwise: close fail\n\nNote:\n========================================================================\n*/\nINT MBSS_Close(\n\tIN\tPNET_DEV\t\tpDev)\n{\n\tPRTMP_ADAPTER pAd;\n\tINT BssId;\n\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\tBssId = RT28xx_MBSS_IdxGet(pAd, pDev);\n    if (BssId < 0)\n        return -1;\n\n\tRTMP_OS_NETDEV_STOP_QUEUE(pDev);\n\n\t/* kick out all stas behind the Bss */\n\tMbssKickOutStas(pAd, BssId, REASON_DISASSOC_INACTIVE);\n\n\tpAd->ApCfg.MBSSID[BssId].bBcnSntReq = FALSE;\n\n\tAPMakeAllBssBeacon(pAd);\n\tAPUpdateAllBeaconFrame(pAd);\n\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Send a packet to WLAN.\n\nArguments:\n\tpPktSrc\t\t\tpoints to our adapter\n\tpDev\t\t\twhich WLAN network interface\n\nReturn Value:\n    0: transmit successfully\n    otherwise: transmit fail\n\nNote:\n========================================================================\n*/\nint MBSS_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc)\n{\n    RTMP_ADAPTER     *pAd;\n    MULTISSID_STRUCT *pMbss;\n    PNDIS_PACKET     pPkt = (PNDIS_PACKET)pPktSrc;\n    INT              IdBss;\n\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\tASSERT(pAd);\n\n#ifdef RALINK_ATE\n    if (ATE_ON(pAd))\n    {\n        RELEASE_NDIS_PACKET(pAd, pPkt, NDIS_STATUS_FAILURE);\n        return 0;\n    }\n#endif /* RALINK_ATE */\n\n\tif ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))          ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)))\n\t{\n\t\t/* wlan is scanning/disabled/reset */\n\t\tRELEASE_NDIS_PACKET(pAd, pPkt, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n\n\n    /* 0 is main BSS, dont handle it here */\n    /* FIRST_MBSSID = 1 */\n    pMbss = pAd->ApCfg.MBSSID;\n\n    for(IdBss=FIRST_MBSSID; IdBss<pAd->ApCfg.BssidNum; IdBss++)\n    {\n\t/* find the device in our MBSS list */\n\tif (pMbss[IdBss].MSSIDDev == pDev)\n\t{\n/*\t\t\tNdisZeroMemory((PUCHAR)&(RTPKT_TO_OSPKT(pPktSrc))->cb[CB_OFF], 15); */\n\t\t\tNdisZeroMemory((PUCHAR)(GET_OS_PKT_CB(pPktSrc) + CB_OFF), 15);\n            RTMP_SET_PACKET_NET_DEVICE_MBSSID(pPktSrc, IdBss);\n/*\t\t\tSET_OS_PKT_NETDEV(pPktSrc, pDev); */\n\t\t \n\n            /* transmit the packet */\n            return Func(pPktSrc);\n\t\t}\n\t}\n\n    /* can not find the BSS so discard the packet */\n\tRELEASE_NDIS_PACKET(pAd, pPkt, NDIS_STATUS_FAILURE);\n\n    return 0;\n}\n\n\n#endif /* MBSS_SUPPORT */\n\n"
  },
  {
    "path": "src/ap/ap_mbss_inf.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n    Abstract:\n\n    Support multi-BSS function.\n\n    Note:\n    1. Call RT28xx_MBSS_Init() in init function and\n       call RT28xx_MBSS_Remove() in close function\n\n    2. MAC of different BSS is initialized in APStartUp()\n\n    3. BSS Index (0 ~ 15) of different rx packet is got in\n       APHandleRxDoneInterrupt() by using FromWhichBSSID = pEntry->apidx;\n       Or FromWhichBSSID = BSS0;\n\n    4. BSS Index (0 ~ 15) of different tx packet is assigned in\n       MBSS_VirtualIF_PacketSend() by using RTMP_SET_PACKET_NET_DEVICE_MBSSID()\n    5. BSS Index (0 ~ 15) of different BSS is got in APHardTransmit() by using\n       RTMP_GET_PACKET_IF()\n\n    6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if\n\n    7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1\n       to the register MAC_BSSID_DW1\n\n    8. The number of MBSS can be 1, 2, 4, or 8\n\n***************************************************************************/\n#define RTMP_MODULE_OS\n\n#ifdef MBSS_SUPPORT\n\n#define MODULE_MBSS\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n\n/* --------------------------------- Public -------------------------------- */\nNET_DEV_STATS *RT28xx_get_ether_stats(\n    IN  PNET_DEV net_dev);\n\n/*\n========================================================================\nRoutine Description:\n    Initialize Multi-BSS function.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    pDevMain\t\tpoints to the main BSS network interface\n\nReturn Value:\n    None\n\nNote:\n\t1. Only create and initialize virtual network interfaces.\n\t2. No main network interface here.\n\t3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat,\n\t\tit will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again.\n========================================================================\n*/\nVOID RT28xx_MBSS_Init(\n\tIN VOID *pAd,\n\tIN PNET_DEV pDevMain)\n{\n\tRTMP_OS_NETDEV_OP_HOOK\tnetDevHook;\n\n\tNdisZeroMemory(&netDevHook, sizeof(netDevHook));\n\tnetDevHook.open = MBSS_VirtualIF_Open;\t/* device opem hook point */\n\tnetDevHook.stop = MBSS_VirtualIF_Close;\t/* device close hook point */\n\tnetDevHook.xmit = MBSS_VirtualIF_PacketSend;\t/* hard transmit hook point */\n\tnetDevHook.ioctl = MBSS_VirtualIF_Ioctl;\t/* ioctl hook point */\n\tnetDevHook.get_stats = RT28xx_get_ether_stats;\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_INIT,\n\t\t\t\t\t\t0, &netDevHook, 0);\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Remove Multi-BSS network interface.\n\nArguments:\n\tpAd\t\t\tpoints to our adapter\n\nReturn Value:\n    None\n\nNote:\n    FIRST_MBSSID = 1\n    Main BSS is not removed here.\n========================================================================\n*/\nVOID RT28xx_MBSS_Remove(\n\tIN VOID \t\t\t*pAd)\n{\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_REMOVE, 0, NULL, 0);\n\n}\n\n\n\n/* --------------------------------- Private -------------------------------- */\n/*\n========================================================================\nRoutine Description:\n    Open a virtual network interface.\n\nArguments:\n\tpDev\t\t\twhich WLAN network interface\n\nReturn Value:\n    0: open successfully\n    otherwise: open fail\n\nNote:\n========================================================================\n*/\nINT MBSS_VirtualIF_Open(\n\tIN\tPNET_DEV\tpDev)\n{\n\tVOID *pAd;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===> MBSSVirtualIF_open\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pDev)));\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_OPEN, 0, pDev, 0);\n\n\tif (VIRTUAL_IF_UP(pAd) != 0)\n\t\treturn -1;\n\n\t/* increase MODULE use count */\n\tRT_MOD_INC_USE_COUNT();\n\n\tRTMP_OS_NETDEV_START_QUEUE(pDev);\n\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Close a virtual network interface.\n\nArguments:\n    pDev           which WLAN network interface\n\nReturn Value:\n    0: close successfully\n    otherwise: close fail\n\nNote:\n========================================================================\n*/\nINT MBSS_VirtualIF_Close(\n\tIN\tPNET_DEV\tpDev)\n{\n\tVOID *pAd;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===> MBSSVirtualIF_close\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pDev)));\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\t\n\tRTMP_OS_NETDEV_STOP_QUEUE(pDev);\n\n\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CLOSE, 0, pDev, 0);\n\n\tVIRTUAL_IF_DOWN(pAd);\n\n\tRT_MOD_DEC_USE_COUNT();\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Send a packet to WLAN.\n\nArguments:\n\tpPktSrc\t\t\tpoints to our adapter\n\tpDev\t\t\twhich WLAN network interface\n\nReturn Value:\n    0: transmit successfully\n    otherwise: transmit fail\n\nNote:\n========================================================================\n*/\nINT MBSS_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET\t\t\tpPktSrc, \n\tIN PNET_DEV\t\t\t\tpDev)\n{\n\n\tMEM_DBG_PKT_ALLOC_INC(pPktSrc);\n\n\tif(!(RTMP_OS_NETDEV_STATE_RUNNING(pDev)))\n\t{\n\t\t/* the interface is down */\n\t\tRELEASE_NDIS_PACKET(NULL, pPktSrc, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n\n\treturn MBSS_PacketSend(pPktSrc, pDev, rt28xx_packet_xmit);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    IOCTL to WLAN.\n\nArguments:\n\tpDev\t\t\twhich WLAN network interface\n\tpIoCtrl\t\t\tcommand information\n\tCommand\t\t\tcommand ID\n\nReturn Value:\n    0: IOCTL successfully\n    otherwise: IOCTL fail\n\nNote:\n    SIOCETHTOOL     8946    New drivers use this ETHTOOL interface to\n                            report link failure activity.\n========================================================================\n*/\nINT MBSS_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tpDev, \n\tIN OUT VOID \t\t\t*pIoCtrl, \n\tIN INT \t\t\t\t\tCommand)\n{\n\tVOID *pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\tASSERT(pAd);\n\n\tif (!pAd)\n\t\treturn -EINVAL;\n\n/*\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t\treturn -ENETDOWN;\n\n\treturn rt28xx_ioctl(pDev, pIoCtrl, Command);\n}\n\n#endif /* MBSS_SUPPORT */\n\n"
  },
  {
    "path": "src/ap/ap_mlme.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n \n    Module Name:\n    mlme.c\n \n    Abstract:\n    Major MLME state machiones here\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    John Chang  08-04-2003    created for 11g soft-AP\n */\n\n#include \"rt_config.h\"\n#include <stdarg.h>\n\n\n#ifdef DOT11_N_SUPPORT\n\nint DetectOverlappingPeriodicRound;\n\n\n#ifdef DOT11N_DRAFT3\nVOID Bss2040CoexistTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3)\n{\n\tint apidx;\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Bss2040CoexistTimeOut(): Recovery to original setting!\\n\"));\n\t\n\t/* Recovery to original setting when next DTIM Interval. */\n\tpAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_TIMER_FIRED);\n\tNdisZeroMemory(&pAd->CommonCfg.LastBSSCoexist2040, sizeof(BSS_2040_COEXIST_IE));\n\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;\n\t\n\tif (pAd->CommonCfg.bBssCoexEnable == FALSE)\n\t{\n\t\t/* TODO: Find a better way to handle this when the timer is fired and we disable the bBssCoexEable support!! */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Bss2040CoexistTimeOut(): bBssCoexEnable is FALSE, return directly!\\n\"));\n\t\treturn;\n\t}\n\t\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\tSendBSS2040CoexistMgmtAction(pAd, MCAST_WCID, apidx, 0);\n\t\n}\n#endif /* DOT11N_DRAFT3 */\n\n#endif /* DOT11_N_SUPPORT */\n\n\nVOID APDetectOverlappingExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n#ifdef DOT11_N_SUPPORT\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tif (DetectOverlappingPeriodicRound == 0)\n\t{\n\t\t/* switch back 20/40 */\n\t\tif ((pAd->CommonCfg.Channel <=14) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40))\n\t\t{\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((DetectOverlappingPeriodicRound == 25) || (DetectOverlappingPeriodicRound == 1))\n\t\t{   \n   \t\t\tif ((pAd->CommonCfg.Channel <=14) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth==BW_40))\n\t\t\t{                                     \n\t\t\t\tSendBeaconRequest(pAd, 1);\n\t\t\t\tSendBeaconRequest(pAd, 2);\n                \t\tSendBeaconRequest(pAd, 3);\n\t\t\t}\n\n\t\t}\n\t\tDetectOverlappingPeriodicRound--;\n\t}\n#endif /* DOT11_N_SUPPORT */\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        This routine is executed every second -\n        1. Decide the overall channel quality\n        2. Check if need to upgrade the TX rate to any client\n        3. perform MAC table maintenance, including ageout no-traffic clients, \n           and release packet buffer in PSQ is fail to TX in time.\n    ==========================================================================\n */\nVOID APMlmePeriodicExec(\n    PRTMP_ADAPTER pAd)\n{\n    /* \n\t\tReqeust by David 2005/05/12\n\t\tIt make sense to disable Adjust Tx Power on AP mode, since we can't \n\t\ttake care all of the client's situation\n\t\tToDo: need to verify compatibility issue with WiFi product.\n\t*/\n#ifdef CARRIER_DETECTION_SUPPORT\n\tif (isCarrierDetectExist(pAd) == TRUE)\n\t{\n\t\tPCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;\n\t\tif (pCarrierDetect->OneSecIntCount < pCarrierDetect->CarrierGoneThreshold)\n\t\t{\n\t\t\tpCarrierDetect->CD_State = CD_NORMAL;\n\t\t\tpCarrierDetect->recheck = pCarrierDetect->recheck1;\n\t\t\tif (pCarrierDetect->Debug != RT_DEBUG_TRACE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Carrier gone\\n\"));\n\t\t\t\t/* start all TX actions. */\n\t\t\t\tAPMakeAllBssBeacon(pAd);\n\t\t\t\tAPUpdateAllBeaconFrame(pAd);\n\t\t\t\tAsicEnableBssSync(pAd);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprintk(\"Carrier gone\\n\");\n\t\t\t}\n\t\t}\n\t\tpCarrierDetect->OneSecIntCount = 0;\n\t}\n\t\t\t\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\tRTMP_CHIP_HIGH_POWER_TUNING(pAd, &pAd->ApCfg.RssiSample);\n\n\n\t/* Disable Adjust Tx Power for WPA WiFi-test. */\n\t/* Because high TX power results in the abnormal disconnection of Intel BG-STA. */\n/*#ifndef WIFI_TEST */\n/*\tif (pAd->CommonCfg.bWiFiTest == FALSE) */\n\t/* for SmartBit 64-byte stream test */\n\t/* removed based on the decision of Ralink congress at 2011/7/06 */\n/*\tif (pAd->MacTab.Size > 0) */\n\tAsicAdjustTxPower(pAd);\n/*#endif // WIFI_TEST */\n\n\tRTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(pAd);\n\n\t/* BBP TUNING: dynamic tune BBP R66 to find a balance between sensibility\n\t\tand noise isolation */\n/*\tAsicBbpTuning2(pAd); */\n\n    /* walk through MAC table, see if switching TX rate is required */\n\n    /* MAC table maintenance */\n\tif (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0)\n\t{\n\t\t/* one second timer */\n\t    MacTableMaintenance(pAd);\n\t\tRTMPMaintainPMKIDCache(pAd);\n\n\n\n#ifdef CLIENT_WDS\n\tCliWds_ProxyTabMaintain(pAd);\n#endif /* CLIENT_WDS */\n\t}\n\t\n\tAPUpdateCapabilityAndErpIe(pAd);\n\n#ifdef APCLI_SUPPORT\n\tif (pAd->Mlme.OneSecPeriodicRound % 2 == 0)\n\t\tApCliIfMonitor(pAd);\n\n\tif (pAd->Mlme.OneSecPeriodicRound % 2 == 1)\n\t\tApCliIfUp(pAd);\n\n\t{\n\t\tINT loop;\n\t\tULONG Now32;\n\t\tNdisGetSystemUpTime(&Now32);\n\t\tfor (loop = 0; loop < MAX_APCLI_NUM; loop++)\n\t\t{\n\t\t\tPAPCLI_STRUCT pApCliEntry = &pAd->ApCfg.ApCliTab[loop];\n\t\t\tif ((pApCliEntry->Valid == TRUE)\n\t\t\t\t&& (pApCliEntry->MacTabWCID < MAX_LEN_OF_MAC_TABLE))\n\t\t\t{\n\t\t\t\t/* update channel quality for Roaming and UI LinkQuality display */\n\t\t\t\tMlmeCalculateChannelQuality(pAd,\n\t\t\t\t\t&pAd->MacTab.Content[pApCliEntry->MacTabWCID], Now32);\n\t\t\t}\n\t\t}\n\t}\n#endif /* APCLI_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n    if (pAd->CommonCfg.bHTProtect)\n    {\n    \t/*APUpdateCapabilityAndErpIe(pAd); */\n    \tAPUpdateOperationMode(pAd);\n\t\tif (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)\n\t\t{\n        \tAsicUpdateProtect(pAd, (USHORT)pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, pAd->MacTab.fAnyStationNonGF);\n    \t}\n    }\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef A_BAND_SUPPORT\n\tif ( (pAd->CommonCfg.Channel > 14)\n\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t)\n\t{\n#ifdef DFS_SUPPORT\n\t\tApRadarDetectPeriodic(pAd);\n#else\n\t\tpAd->Dot11_H.InServiceMonitorCount++;\n\t\tif (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)\n\t\t{\n\t\t\tif (pAd->Dot11_H.RDCount++ > pAd->Dot11_H.ChMovingTime)\n\t\t\t{\n\t\t\t\tAsicEnableBssSync(pAd);\n\t\t\t\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\t\t\t}\n\t\t}\n#endif /* !DFS_SUPPORT */\n\t\t}\n#endif /* A_BAND_SUPPORT */\n\n\n}\n\n\n/*! \\brief   To substitute the message type if the message is coming from external\n *  \\param  *Fr            The frame received\n *  \\param  *Machine       The state machine\n *  \\param  *MsgType       the message type for the state machine\n *  \\return TRUE if the substitution is successful, FALSE otherwise\n *  \\pre\n *  \\post\n */\nBOOLEAN APMsgTypeSubst(\n    IN PRTMP_ADAPTER pAd,\n    IN PFRAME_802_11 pFrame, \n    OUT INT *Machine, \n    OUT INT *MsgType) \n{\n    USHORT Seq;\n    UCHAR  EAPType;\n    BOOLEAN     Return = FALSE;\n#ifdef WSC_AP_SUPPORT\n\tUCHAR EAPCode;\n    PMAC_TABLE_ENTRY pEntry;\n#endif /* WSC_AP_SUPPORT */\n\n/*\n\tTODO:\n\t\tonly PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid; otherwise,\n\t\tignore this frame\n*/\n\n    /* wpa EAPOL PACKET */\n    if (pFrame->Hdr.FC.Type == BTYPE_DATA) \n    {    \n#ifdef WSC_AP_SUPPORT    \n        /*WSC EAPOL PACKET */\n        pEntry = MacTableLookup(pAd, pFrame->Hdr.Addr2);\n\t\tif (pEntry &&\n\t\t\t((pEntry->bWscCapable) ||\n\t\t\t(pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode < Ndis802_11AuthModeWPA)))\n\t\t{\n\t\t\tif ((MAC_ADDR_EQUAL(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, pEntry->Addr) || \n\t\t\t\t MAC_ADDR_EQUAL(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, ZERO_MAC_ADDR)) &&\n\t            IS_ENTRY_CLIENT(pEntry) && \n\t            (pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscConfMode != WSC_DISABLE))\n\t        {\n\t            *Machine = WSC_STATE_MACHINE;\n\t            EAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1);\n\t            EAPCode = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 4);\n\t            Return = WscMsgTypeSubst(EAPType, EAPCode, MsgType);\n\t        }\n\t\t}\n#endif /* WSC_AP_SUPPORT */\n        if (!Return)\n        {\n\t        *Machine = WPA_STATE_MACHINE;\n        \tEAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1);\n\t        Return = WpaMsgTypeSubst(EAPType, (INT *) MsgType);\n        }\n        return Return;\n    }\n    \n    if (pFrame->Hdr.FC.Type != BTYPE_MGMT)\n        return FALSE;\n    \n    switch (pFrame->Hdr.FC.SubType) \n    {\n        case SUBTYPE_ASSOC_REQ:\n            *Machine = AP_ASSOC_STATE_MACHINE;\n            *MsgType = APMT2_PEER_ASSOC_REQ;\n            \n            break;\n/*\n\t\tcase SUBTYPE_ASSOC_RSP:\n\t\t\t*Machine = AP_ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = APMT2_PEER_ASSOC_RSP;\n\t\t\tbreak;\n*/\n        case SUBTYPE_REASSOC_REQ:\n            *Machine = AP_ASSOC_STATE_MACHINE;\n            *MsgType = APMT2_PEER_REASSOC_REQ;\n            break;\n/*\n\t\tcase SUBTYPE_REASSOC_RSP:\n\t\t\t*Machine = AP_ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = APMT2_PEER_REASSOC_RSP;\n\t\t\tbreak;\n*/\n        case SUBTYPE_PROBE_REQ:\n            *Machine = AP_SYNC_STATE_MACHINE;              \n            *MsgType = APMT2_PEER_PROBE_REQ;\n            break;\n/* test for 40Mhz intolerant */\n\t\t/*\n\t\t\tFor Active Scan\n\t\t*/\n\t\tcase SUBTYPE_PROBE_RSP:\n          *Machine = AP_SYNC_STATE_MACHINE;\n          *MsgType = APMT2_PEER_PROBE_RSP;\n          break;\n        case SUBTYPE_BEACON:\n            *Machine = AP_SYNC_STATE_MACHINE;\n            *MsgType = APMT2_PEER_BEACON;\n            break;\n/*\n\t\tcase SUBTYPE_ATIM:\n\t\t\t*Machine = AP_SYNC_STATE_MACHINE;\n\t\t\t*MsgType = APMT2_PEER_ATIM;\n\t\t\tbreak;\n*/\n        case SUBTYPE_DISASSOC:\n            *Machine = AP_ASSOC_STATE_MACHINE;\n            *MsgType = APMT2_PEER_DISASSOC_REQ;\n            break;\n        case SUBTYPE_AUTH:\n            /* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */\n            NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT));\n            \n\t\t\t*Machine = AP_AUTH_STATE_MACHINE;\n\t\t\tif (Seq == 1)\n\t\t\t\t*MsgType = APMT2_PEER_AUTH_REQ;\n\t\t\telse if (Seq == 3)\n\t\t\t\t*MsgType = APMT2_PEER_AUTH_CONFIRM;\n            else \n            {\n                DBGPRINT(RT_DEBUG_TRACE,(\"wrong AUTH seq=%d Octet=%02x %02x %02x %02x %02x %02x %02x %02x\\n\", Seq,\n                    pFrame->Octet[0], pFrame->Octet[1], pFrame->Octet[2], pFrame->Octet[3], \n                    pFrame->Octet[4], pFrame->Octet[5], pFrame->Octet[6], pFrame->Octet[7]));\n                return FALSE;\n            }\n            break;\n\n        case SUBTYPE_DEAUTH:\n            *Machine = AP_AUTH_STATE_MACHINE; /*AP_AUTH_RSP_STATE_MACHINE;*/\n            *MsgType = APMT2_PEER_DEAUTH;\n            break;\n\n\tcase SUBTYPE_ACTION:\n\tcase SUBTYPE_ACTION_NO_ACK:\n\t\t*Machine = ACTION_STATE_MACHINE;\n\t\t/*  Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */\n#ifdef P2P_SUPPORT\n\t\t/*\tVendor specific usage. */\n\t\tif ((pFrame->Octet[0] & 0x7F) == MT2_ACT_VENDOR) /*  Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */\n\t\t{\n\t\t\tUCHAR\tP2POUIBYTE[4] = {0x50, 0x6f, 0x9a, 0x9};\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Vendor Action frame OUI= 0x%x\\n\", *(PULONG)&pFrame->Octet[1]));\n\t\t\t/* Now support WFA P2P */\n\t\t\tif (RTMPEqualMemory(&pFrame->Octet[1], P2POUIBYTE, 4) && (P2P_INF_ON(pAd)))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Vendor Action frame P2P OUI= 0x%x\\n\", *(PULONG)&pFrame->Octet[1]));\n\t\t\t\t*Machine = P2P_ACTION_STATE_MACHINE;\n\t\t\t\tif (pFrame->Octet[5] <= MT2_MAX_PEER_SUPPORT)\n\t\t\t\t{\n\t\t\t\t\t*MsgType = pFrame->Octet[5]; /* subtype.  */\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t} \n\t\telse\n#endif /* P2P_SUPPORT */\n\t\tif ((pFrame->Octet[0]&0x7F) > MAX_PEER_CATE_MSG) \n\t\t{\n\t\t\t*MsgType = MT2_ACT_INVALID;\n\t\t} \n\t\telse\n\t\t{\n\t\t\t*MsgType = (pFrame->Octet[0]&0x7F);\n\t\t} \n\t\tbreak;\n\n        default:\n            return FALSE;\n            break;\n    }\n\n    return TRUE;\n}\n\n\n\n/*\n    ========================================================================\n    Routine Description:\n        Periodic evaluate antenna link status\n        \n    Arguments:\n        pAd         - Adapter pointer\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID APAsicEvaluateRxAnt(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tULONG\tTxTotalCnt;\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n#ifdef CARRIER_DETECTION_SUPPORT\n\tif(pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)\n\treturn;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef RT8592\n\t// TODO: shiang-6590, for 8592, this EvaaluateRxAnt still need??\n\tif (IS_RT8592(pAd))\n\t\treturn;\n#endif /* RT8592 */\n\n#ifdef RT65xx //snowpin test\n\tif (IS_RT6590(pAd))\n\t\treturn;\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t\treturn;\n#endif /* MT7601 */\n\n#ifdef TXBF_SUPPORT\n\t/* TODO: we didn't do RxAnt evaluate for 3x3 chips */\n\tif (IS_RT3883(pAd) || IS_RT2883(pAd))\n\t\treturn;\n#endif /* TXBF_SUPPORT */\n\n\t\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\n\tif (pAd->ApCfg.bGreenAPActive == TRUE)\n\t\trtmp_bbp_set_rxpath(pAd, 1);\n\telse\n#endif /* GREENAP_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\t\trtmp_bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);\n\n\tTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\tpAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\tpAd->RalinkCounters.OneSecTxFailCount;\n\n\tif (TxTotalCnt > 50)\n\t{\n\t\tRTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20);\n\t\tpAd->Mlme.bLowThroughput = FALSE;\n\t}\n\telse\n\t{\n\t\tRTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);\n\t\tpAd->Mlme.bLowThroughput = TRUE;\n\t}\n}\n\n/*\n    ========================================================================\n    Routine Description:\n        After evaluation, check antenna link status\n        \n    Arguments:\n        pAd         - Adapter pointer\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID APAsicRxAntEvalTimeout(\n\tPRTMP_ADAPTER\tpAd) \n{\n\tCHAR\t\t\tlarger = -127, rssi0, rssi1, rssi2;\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\t/* if the traffic is low, use average rssi as the criteria */\n\tif (pAd->Mlme.bLowThroughput == TRUE)\n\t{\n\t\trssi0 = pAd->ApCfg.RssiSample.LastRssi0;\n\t\trssi1 = pAd->ApCfg.RssiSample.LastRssi1;\n\t\trssi2 = pAd->ApCfg.RssiSample.LastRssi2;\n\t}\n\telse\n\t{\n\t\trssi0 = pAd->ApCfg.RssiSample.AvgRssi0;\n\t\trssi1 = pAd->ApCfg.RssiSample.AvgRssi1;\n\t\trssi2 = pAd->ApCfg.RssiSample.AvgRssi2;\n\t}\n\n\tif(pAd->Antenna.field.RxPath == 3)\n\t{\n\t\tlarger = max(rssi0, rssi1);\n#ifdef DOT11N_SS3_SUPPORT\n\t\tif (pAd->CommonCfg.RxStream >= 3)\n\t\t\tpAd->Mlme.RealRxPath = 3;\n\t\telse\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t{\n\t\tif (larger > (rssi2 + 20))\n\t\t\tpAd->Mlme.RealRxPath = 2;\n\t\telse\n\t\t\tpAd->Mlme.RealRxPath = 3;\n\t\t}\n\t}\n\t/* Disable the below to fix 1T/2R issue. It's suggested by Rory at 2007/7/11. */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\n\tif (pAd->ApCfg.bGreenAPActive == TRUE)\n\t\trtmp_bbp_set_rxpath(pAd, 1);\n\telse\n#endif /* GREENAP_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\t\trtmp_bbp_set_rxpath(pAd, pAd->Mlme.RealRxPath);\n\n\t\n}\n\n/*\n    ========================================================================\n    Routine Description:\n        After evaluation, check antenna link status\n        \n    Arguments:\n        pAd         - Adapter pointer\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID\tAPAsicAntennaAvg(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t              AntSelect,\n\tIN\tSHORT*\t              RssiAvg)  \n{\n\t\t    SHORT\trealavgrssi;\n\t\t    LONG         realavgrssi1;\n\t\t    ULONG\trecvPktNum = pAd->RxAnt.RcvPktNum[AntSelect];\n\n\t\t    realavgrssi1 = pAd->RxAnt.Pair1AvgRssiGroup1[AntSelect];\n\n\t\t    if(realavgrssi1 == 0)\n\t\t    {      \n\t\t        *RssiAvg = 0;\n\t\t        return;\n\t\t    }\n\n\t\t    realavgrssi = (SHORT) (realavgrssi1 / recvPktNum);\n\n\t\t    pAd->RxAnt.Pair1AvgRssiGroup1[0] = 0;\n\t\t    pAd->RxAnt.Pair1AvgRssiGroup1[1] = 0;\n\t\t    pAd->RxAnt.Pair1AvgRssiGroup2[0] = 0;\n\t\t    pAd->RxAnt.Pair1AvgRssiGroup2[1] = 0;\n\t\t    pAd->RxAnt.RcvPktNum[0] = 0;\n\t\t    pAd->RxAnt.RcvPktNum[1] = 0;\n\t\t    *RssiAvg = realavgrssi - 256;\n}\n\n"
  },
  {
    "path": "src/ap/ap_qload.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n \n/****************************************************************************\n \n    Abstract:\n\n    Provide information on the current STA population and traffic levels\n\tin the QBSS.\n\n\tThis attribute is available only at a QAP. This attribute, when TRUE,\n\tindicates that the QAP implementation is capable of generating and\n\ttransmitting the QBSS load element in the Beacon and Probe Response frames.\n \n***************************************************************************/\n\n#include \"rt_config.h\"\n\n#ifdef AP_QLOAD_SUPPORT\n\ntypedef struct GNU_PACKED _ELM_QBSS_LOAD{\n\n\tUINT8 ElementId;\n\tUINT8 Length;\n\n\t/* the total number of STAs currently associated with this QBSS */\n\tUINT16 StationCount;\n\n\t/*\tdefined as the percentage of time, nomalized to 255, the QAP sensed the\n\t\tmedium busy, as indicated by either the physical or virtual carrier\n\t\tsense mechanism.\n\t\tThis percentage is computed using the formula:\n\t\t\t((channel busy time / (dot11ChannelUtilizationBeaconIntervals *\n\t\t\tdot11BeaconPeriod * 1024)) * 255) */\n\tUINT8 ChanUtil;\n\n\t/*\tspecifies the remaining amount of medium time available via explicit\n\t\tadmission control, in units of 32 microsecond periods per 1 second.\n\t\tThe field is helpful for roaming non-AP QSTAs to select a QAP that is\n\t\tlikely to accept future admission control requests, but it does not\n\t\trepresent a guarantee that the HC will admit these requests. */\n\tUINT16 AvalAdmCap;\n\n} ELM_QBSS_LOAD;\n\n#define ELM_QBSS_LOAD_ID\t\t\t\t\t11\n#define ELM_QBSS_LOAD_LEN\t\t\t\t\t5\n\n/*\n\tWe will send a alarm when channel busy time (primary or secondary) >=\n\tTime Threshold and Num Threshold.\n\n\tQBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD = 0 means alarm function is disabled.\n\n\tIf you want to enable it, use command\n\t\"iwpriv ra0 set qloadalarmtimethres=90\"\n*/\n#define QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD\t\t0 /* unit: % */\n#define QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD\t\t10 /* unit: 1 */\n\n/* a alarm will not re-issued until QBSS_LOAD_ALARM_DURATION * TBTT */\n#define QBSS_LOAD_ALARM_DURATION\t\t\t\t100 /* unit: TBTT */\n\n\nstatic VOID QBSS_LoadAlarmSuspend(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n/* handle a alarm */\nstatic VOID QBSS_LoadAlarm(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\nstatic VOID QBSS_LoadAlarmBusyTimeThresholdReset(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tUINT32\t\t\tTimePeriod);\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\n\n\n/* --------------------------------- Private -------------------------------- */\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n/*\n========================================================================\nRoutine Description:\n\tHandle a alarm.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n\tYou can use different methods to handle QBSS Load alarm here.\n\n\tCurrent methods are:\n\t1. Change 20/40 to 20-only.\n\t2. Change channel to the clear channel.\n========================================================================\n*/\nstatic VOID QBSS_LoadAlarm(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n\t/* suspend alarm until channel switch */\n\tQBSS_LoadAlarmSuspend(pAd);\n\n\tpAd->QloadAlarmNumber ++;\n\n\t/* check if we have already been 20M bandwidth */\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) &&\n\t\t(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0))\n\t{\n\t\tMAC_TABLE *pMacTable;\n\t\tUINT32 StaId;\n\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"qbss> Alarm! Change to 20 bw...\\n\"));\n\n\t\t/* disassociate stations without D3 2040Coexistence function */\n\t\tpMacTable = &pAd->MacTab;\n\n\t\tfor(StaId=1; StaId<MAX_LEN_OF_MAC_TABLE; StaId++)\n\t\t{\n\t\t\tMAC_TABLE_ENTRY *pEntry = &pMacTable->Content[StaId];\n\t\t\tBOOLEAN bDisconnectSta = FALSE;\n\n\t\t\tif (!IS_ENTRY_CLIENT(pEntry))\n\t\t\t\tcontinue;\n\n\t\t\tif (pEntry->Sst != SST_ASSOC)\n\t\t\t\tcontinue;\n\n\t\t\tif (pEntry->BSS2040CoexistenceMgmtSupport)\n\t\t\t\tbDisconnectSta = TRUE;\n\n\t\t\tif (bDisconnectSta)\n\t\t\t{\n\t\t\t\t/* send wireless event - for ageout */\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, pEntry->Addr, 0, 0); \n\n\t\t\t\t{\n\t\t\t\t\tPUCHAR      pOutBuffer = NULL;\n\t\t\t\t\tNDIS_STATUS NStatus;\n\t\t\t\t\tULONG       FrameLen = 0;\n\t\t\t\t\tHEADER_802_11 DeAuthHdr;\n\t\t\t\t\tUSHORT      Reason;\n\n\t\t\t\t\t/*  send out a DISASSOC request frame */\n\t\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tReason = REASON_DEAUTH_STA_LEAVING;\n\t\t\t\t\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0,\n\t\t\t\t\t\t\t\t\tpEntry->Addr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].Bssid);\t\t\t\t\n\t\t\t    \tMakeOutgoingFrame(pOutBuffer,            &FrameLen, \n\t\t\t    \t                  sizeof(HEADER_802_11), &DeAuthHdr, \n\t\t\t    \t                  2,                     &Reason, \n\t\t\t    \t                  END_OF_ARGS);\n\t\t\t    \tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t    \tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"qbss> Alarm! Deauth the station \"\n\t\t\t\t\t\t\"%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\tpEntry->Addr[0], pEntry->Addr[1],\n\t\t\t\t\t\tpEntry->Addr[2], pEntry->Addr[3],\n\t\t\t\t\t\tpEntry->Addr[4], pEntry->Addr[5]));\t\t\t\n\n\t\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t/* for 11n */\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\n\n\t\t/* always 20M */\n\t\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;\n\n\t\t/* mark alarm flag */\n\t\tpAd->FlgQloadAlarm = TRUE;\n\n\t\tQBSS_LoadAlarmResume(pAd);\n\t}\n\telse\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\t/* we are in 20MHz bandwidth so try to switch channel */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"qbss> Alarm! Switch channel...\\n\"));\n\n\t\t/* send command to switch channel */\n\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESCAN, NULL, 0);\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tRe-calculate busy time threshold.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tTimePeriod\t\t\t- TBTT\n\nReturn Value:\n\tNone\n\nNote:\n\tEX: TBTT=100ms, 90%, pAd->QloadBusyTimeThreshold = 90ms\n========================================================================\n*/\nstatic VOID QBSS_LoadAlarmBusyTimeThresholdReset(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tUINT32\t\t\tTimePeriod)\n{\n\tpAd->QloadBusyTimeThreshold = TimePeriod;\n\tpAd->QloadBusyTimeThreshold *= pAd->QloadAlarmBusyTimeThreshold;\n\tpAd->QloadBusyTimeThreshold /= 100;\n\tpAd->QloadBusyTimeThreshold <<= 10; /* translate mini-sec to micro-sec */\n}\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\n\n\n/* --------------------------------- Public -------------------------------- */\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize ASIC Channel Busy Calculation mechanism.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n\tInit Condition: WMM must be enabled.\n========================================================================\n*/\nVOID QBSS_LoadInit(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n\tUINT32 IdBss;\n\n\n\t/* check whether any BSS enables WMM feature */\n\tfor(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)\n\t{\n\t\tif ((pAd->ApCfg.MBSSID[IdBss].bWmmCapable)\n\t\t\t)\n\t\t{\n\t\t\tpAd->FlgQloadEnable = TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (pAd->FlgQloadEnable == TRUE)\n\t{\n\t\t/* Count EIFS, NAV, RX busy, TX busy as channel busy and\n\t\t\tenable Channel statistic timer (bit 0) */\n\n\t\t/* Note: if bit 0 == 0, the function will be disabled */\n\t\tRTMP_IO_WRITE32(pAd, CH_TIME_CFG, 0x0000001F);\n\n\t\t/* default value is 50, please reference to IEEE802.11e 2005 Annex D */\n\t\tpAd->QloadChanUtilBeaconInt = 50;\n\t}\n\telse\n\t{\n\t\t/* no any WMM is enabled */\n\t\tRTMP_IO_WRITE32(pAd, CH_TIME_CFG, 0x00000000);\n\t}\n\n\tpAd->QloadChanUtilTotal = 0;\n\tpAd->QloadUpTimeLast = 0;\n\n#ifdef QLOAD_FUNC_BUSY_TIME_STATS\n\t/* clear busy time statistics */\n\tNdisZeroMemory(pAd->QloadBusyCountPri, sizeof(pAd->QloadBusyCountPri));\n\tNdisZeroMemory(pAd->QloadBusyCountSec, sizeof(pAd->QloadBusyCountSec));\n#endif /* QLOAD_FUNC_BUSY_TIME_STATS */\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\t/* init threshold before QBSS_LoadAlarmReset */\n\tpAd->QloadAlarmBusyTimeThreshold = QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD;\n\tpAd->QloadAlarmBusyNumThreshold = QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD;\n\n\tQBSS_LoadAlarmReset(pAd);\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tReset alarm function.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID QBSS_LoadAlarmReset(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tpAd->FlgQloadAlarm = FALSE;\n\tpAd->QloadAlarmDuration = 0;\n\tpAd->QloadAlarmNumber = 0;\n\n\tpAd->FlgQloadAlarmIsSuspended = FALSE;\n\n\tQBSS_LoadAlarmBusyTimeThresholdReset(pAd, pAd->CommonCfg.BeaconPeriod);\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tResume alarm function.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID QBSS_LoadAlarmResume(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tpAd->FlgQloadAlarmIsSuspended = FALSE;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSuspend alarm function.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID QBSS_LoadAlarmSuspend(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tpAd->FlgQloadAlarmIsSuspended = TRUE;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet average busy time in current channel.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\taverage busy time\n\nNote:\n========================================================================\n*/\nUINT32 QBSS_LoadBusyTimeGet(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n\tif (pAd->QloadChanUtilBeaconCnt == 0)\n\t\treturn pAd->QloadChanUtilTotal;\n\n\treturn (pAd->QloadChanUtilTotal / pAd->QloadChanUtilBeaconCnt);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if a alarm is occurred and clear the alarm.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tTRUE\t\t\t\t- alarm occurs\n\tFALSE\t\t\t\t- no alarm\n\nNote:\n\tWe will clear the alarm in the function.\n========================================================================\n*/\nBOOLEAN QBSS_LoadIsAlarmIssued(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tBOOLEAN FlgQloadAlarm = pAd->FlgQloadAlarm;\n\n\tpAd->FlgQloadAlarm = FALSE;\n\treturn FlgQloadAlarm;\n#else\n\n\treturn FALSE;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the busy time is accepted.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tTURE\t\t\t\t- ok\n\tFALSE\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nBOOLEAN QBSS_LoadIsBusyTimeAccepted(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tUINT32\t\t\tBusyTime)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tif (pAd->QloadAlarmBusyTimeThreshold == 0)\n\t\treturn TRUE; /* always ok */\n\n\tif (BusyTime >= pAd->QloadBusyTimeThreshold)\n\t\treturn FALSE;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAppend the QBSS Load element to the beacon frame.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\t*pBeaconBuf\t\t\t- the beacon or probe response frame\n\nReturn Value:\n\tthe element total Length\n\nNote:\n\tAppend Condition: You must check whether WMM is enabled before the\n\tfunction is using.\n========================================================================\n*/\nUINT32 QBSS_LoadElementAppend(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tOUT\t\tUINT8\t\t\t*pBeaconBuf)\n{\n\tELM_QBSS_LOAD load, *pLoad = &load;\n\tULONG ElmLen;\n\n\n\t/* check whether channel busy time calculation is enabled */\n\tif (pAd->FlgQloadEnable == 0)\n\t\treturn 0;\n\n\t/* init */\n\tpLoad->ElementId = ELM_QBSS_LOAD_ID;\n\tpLoad->Length = ELM_QBSS_LOAD_LEN;\n\n\tpLoad->StationCount = le2cpu16(MacTableAssocStaNumGet(pAd));\n\tpLoad->ChanUtil = pAd->QloadChanUtil;\n\n\t/* because no ACM is supported, the available bandwidth is 1 sec */\n\tpLoad->AvalAdmCap = le2cpu16(0x7a12); /* 0x7a12 * 32us = 1 second */\n\t\n\n\t/* copy the element to the frame */\n    MakeOutgoingFrame(pBeaconBuf, &ElmLen,\n\t\t\t\t\t\tsizeof(ELM_QBSS_LOAD),\tpLoad,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\treturn ElmLen;\n}\n\n\n\n\n/*\n========================================================================\nRoutine Description:\n\tUpdate Channel Utilization.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tUpTime\t\t\t\t- current up time\n\nReturn Value:\n\tNone\n\nNote:\n\tUpTime is used in QLOAD_FUNC_BUSY_TIME_STATS & QLOAD_FUNC_BUSY_TIME_ALARM\n\n\tIf UpTime != 0, it means that the time period calling the function\n\tmaybe not TBTT so we need to re-calculate the time period.\n\n\tIf you call the function in kernel thread, the time period sometimes\n\twill not accurate due to kernel thread is not real-time, so we need to\n\trecalculate the time period.\n========================================================================\n*/\nVOID QBSS_LoadUpdate(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tULONG\t\t\tUpTime)\n{\n\tUINT32 ChanUtilNu, ChanUtilDe;\n\tUINT32 BusyTime = 0;\n\tUINT32 BusyTimeId;\n\tUINT32 TimePeriod = pAd->CommonCfg.BeaconPeriod;\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tBOOLEAN FlgIsBusyOverThreshold = FALSE;\n\tBOOLEAN FlgIsAlarmNeeded = FALSE;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\n\t/* check whether channel busy time calculation is enabled */\n\tif ((pAd->FlgQloadEnable == 0) ||\n\t\t(pAd->FlgQloadAlarmIsSuspended == TRUE))\n\t\treturn;\n\n\t/* calculate new time period if needed */\n\tif ((UpTime > 0) &&\n\t\t(pAd->QloadUpTimeLast > 0) &&\n\t\t(UpTime > pAd->QloadUpTimeLast))\n\t{\n\t\t/* re-calculate time period */\n\t\tTimePeriod = (UINT32)(UpTime - pAd->QloadUpTimeLast);\n\n\t\t/* translate to mini-second */\n\t\tTimePeriod = (TimePeriod*1000)/OS_HZ;\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\t\t/* re-calculate QloadBusyTimeThreshold */\n\t\tif (TimePeriod != pAd->QloadTimePeriodLast)\n\t\t\tQBSS_LoadAlarmBusyTimeThresholdReset(pAd, TimePeriod);\n\n\t\tpAd->QloadTimePeriodLast = TimePeriod;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\t}\n\n\t/* update up time */\n\tpAd->QloadUpTimeLast = UpTime;\n\n\t/* do busy time statistics */\n#ifdef DOT11_N_SUPPORT\n\tif ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) &&\n\t\t(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0))\n\t{\n\t\t/* in 20MHz, no need to check busy time of secondary channel */\n\t\tRTMP_IO_READ32(pAd, CH_BUSY_STA_SEC, &BusyTime);\n\t\tpAd->QloadLatestChannelBusyTimeSec = BusyTime;\n\n#ifdef QLOAD_FUNC_BUSY_TIME_STATS\n\t\tBusyTimeId = BusyTime >> 10; /* translate us to ms */\n\n\t\t/* ex:95ms, 95*20/100 = 19 */\n\t\tBusyTimeId = (BusyTimeId*QLOAD_BUSY_INTERVALS)/TimePeriod;\n\n\t\tif (BusyTimeId >= QLOAD_BUSY_INTERVALS)\n\t\t\tBusyTimeId = QLOAD_BUSY_INTERVALS - 1;\n\n\t\tpAd->QloadBusyCountSec[BusyTimeId] ++;\n#endif /* QLOAD_FUNC_BUSY_TIME_STATS */\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\t\tif ((pAd->FlgQloadAlarmIsSuspended == FALSE) &&\n\t\t\t(pAd->QloadAlarmBusyTimeThreshold > 0))\n\t\t{\n\t\t\t/* Alarm is not suspended and is enabled */\n\n\t\t\tif ((pAd->QloadBusyTimeThreshold != 0) &&\n\t\t\t\t(BusyTime >= pAd->QloadBusyTimeThreshold))\n\t\t\t{\n\t\t\t\tFlgIsBusyOverThreshold = TRUE;\n\t\t\t}\n\t\t}\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t/* do busy time statistics for primary channel */\n\tRTMP_IO_READ32(pAd, CH_BUSY_STA, &BusyTime);\n\tpAd->QloadLatestChannelBusyTimePri = BusyTime;\n\n#ifdef QLOAD_FUNC_BUSY_TIME_STATS\n\tBusyTimeId = BusyTime >> 10; /* translate us to ms */\n\n\t/* ex:95ms, 95*20/100 = 19 */\n\tBusyTimeId = (BusyTimeId*QLOAD_BUSY_INTERVALS)/TimePeriod;\n\n\tif (BusyTimeId >= QLOAD_BUSY_INTERVALS)\n\t\tBusyTimeId = QLOAD_BUSY_INTERVALS - 1;\n\n\tpAd->QloadBusyCountPri[BusyTimeId] ++;\n#endif /* QLOAD_FUNC_BUSY_TIME_STATS */\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tif ((pAd->FlgQloadAlarmIsSuspended == FALSE) &&\n\t\t(pAd->QloadAlarmBusyTimeThreshold > 0))\n\t{\n\t\t/* Alarm is not suspended and is enabled */\n\n\t\tif ((pAd->QloadBusyTimeThreshold != 0) &&\n\t\t\t(BusyTime >= pAd->QloadBusyTimeThreshold))\n\t\t{\n\t\t\tFlgIsBusyOverThreshold = TRUE;\n\t\t}\n\t}\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\t/* accumulate channel busy time for primary channel */\n\tpAd->QloadChanUtilTotal += BusyTime;\n\n\t/* update new channel utilization for primary channel */\n\tif (++pAd->QloadChanUtilBeaconCnt >= pAd->QloadChanUtilBeaconInt)\n\t{\n\t\tChanUtilNu = pAd->QloadChanUtilTotal;\n\t\tChanUtilNu *= 255;\n\n\t\tChanUtilDe = pAd->QloadChanUtilBeaconInt;\n\n\t\t/*\n\t\t\tStill use pAd->CommonCfg.BeaconPeriod.\n\t\t\tBecause we change QloadChanUtil not every TBTT.\n\t\t*/\n\t\tChanUtilDe *= pAd->CommonCfg.BeaconPeriod;\n\n\t\tChanUtilDe <<= 10; /* ms to us */\n\n\t\tpAd->QloadChanUtil = (UINT8)(ChanUtilNu/ChanUtilDe);\n\n\t\t/* re-accumulate channel busy time */\n\t\tpAd->QloadChanUtilBeaconCnt = 0;\n\t\tpAd->QloadChanUtilTotal = 0;\n\t}\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\t/* check if alarm function is enabled */\n\tif ((pAd->FlgQloadAlarmIsSuspended == FALSE) &&\n\t\t(pAd->QloadAlarmBusyTimeThreshold > 0))\n\t{\n\t\t/* Alarm is not suspended and is enabled */\n\n\t\t/* check if we need to issue a alarm */\n\t\tif (FlgIsBusyOverThreshold == TRUE)\n\t\t{\n\t\t\tif (pAd->QloadAlarmDuration == 0)\n\t\t\t{\n\t\t\t\t/* last alarm ended so we can check new alarm */\n\n\t\t\t\tpAd->QloadAlarmBusyNum ++;\n\n\t\t\t\tif (pAd->QloadAlarmBusyNum >= pAd->QloadAlarmBusyNumThreshold)\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tThe continued number of busy time >= threshold is larger\n\t\t\t\t\t\tthan number threshold so issuing a alarm.\n\t\t\t\t\t*/\n\t\t\t\t\tFlgIsAlarmNeeded = TRUE;\n\t\t\t\t\tpAd->QloadAlarmDuration ++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpAd->QloadAlarmBusyNum = 0;\n\n\t\tif (pAd->QloadAlarmDuration > 0)\n\t\t{\n\t\t\t/*\n\t\t\t\tNew alarm occurs so we can not re-issue new alarm during\n\t\t\t\tQBSS_LOAD_ALARM_DURATION * TBTT.\n\t\t\t*/\n\t\t\tif (++pAd->QloadAlarmDuration >= QBSS_LOAD_ALARM_DURATION)\n\t\t\t{\n\t\t\t\t/* can re-issue next alarm */\n\t\t\t\tpAd->QloadAlarmDuration = 0;\n\t\t\t\tpAd->QloadAlarmBusyNum = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (FlgIsAlarmNeeded == TRUE)\n\t\t\tQBSS_LoadAlarm(pAd);\n\t}\n\telse\n\t{\n\t\t/* clear statistics counts */\n\t\tpAd->QloadAlarmBusyNum = 0;\n\t\tpAd->QloadAlarmDuration = 0;\n\t\tpAd->FlgQloadAlarm = FALSE;\n\t}\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tClear QoS Load information.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID QBSS_LoadStatusClear(\n \tIN\t\tRTMP_ADAPTER\t*pAd)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_STATS\n\t/* clear busy time statistics */\n\tNdisZeroMemory(pAd->QloadBusyCountPri, sizeof(pAd->QloadBusyCountPri));\n\tNdisZeroMemory(pAd->QloadBusyCountSec, sizeof(pAd->QloadBusyCountSec));\n#endif /* QLOAD_FUNC_BUSY_TIME_STATS */\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\t/* clear alarm function variables */\n\tpAd->QloadChanUtilTotal = 0;\n\tpAd->FlgQloadAlarm = FALSE;\n\tpAd->QloadAlarmBusyNum = 0;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tShow QoS Load information.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tShow_QoSLoad_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_STATS\n\tUINT32 BusyTimeId;\n\tUINT32 Time;\n\n\n\tTime = pAd->CommonCfg.BeaconPeriod / QLOAD_BUSY_INTERVALS;\n\n\tprintk(\"\\n\\tPrimary Busy Time\\tTimes\\n\");\n\n\tfor(BusyTimeId=0; BusyTimeId<QLOAD_BUSY_INTERVALS; BusyTimeId++)\n\t{\n\t\tprintk(\"\\t%dms ~ %dms\\t\\t%d\\n\",\n\t\t\t\tBusyTimeId*Time,\n\t\t\t\t(BusyTimeId+1)*Time,\n\t\t\t\tpAd->QloadBusyCountPri[BusyTimeId]);\n\t}\n\n\tprintk(\"\\n\\tSecondary Busy Time\\tTimes\\n\");\n\n\tfor(BusyTimeId=0; BusyTimeId<QLOAD_BUSY_INTERVALS; BusyTimeId++)\n\t{\n\t\tprintk(\"\\t%dms ~ %dms\\t\\t%d\\n\",\n\t\t\t\tBusyTimeId*Time,\n\t\t\t\t(BusyTimeId+1)*Time,\n\t\t\t\tpAd->QloadBusyCountSec[BusyTimeId]);\n\t}\n#else\n\n\tprintk(\"\\tBusy time statistics is not included into the driver!\\n\");\n#endif /* QLOAD_FUNC_BUSY_TIME_STATS */\n\n\tprintk(\"\\n\");\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCommand for QoS Load information clear.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tSet_QloadClr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg)\n{\n\tQBSS_LoadStatusClear(pAd);\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCommand for QoS Alarm Time Threshold set.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tSet_QloadAlarmTimeThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tpAd->QloadAlarmBusyTimeThreshold = (UCHAR)simple_strtol(Arg, 0, 10);\n\n\tQBSS_LoadAlarmReset(pAd);\n\n\tpAd->QloadTimePeriodLast = pAd->CommonCfg.BeaconPeriod;\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCommand for QoS Alarm Number Threshold set.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tSet_QloadAlarmNumThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg)\n{\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n\tpAd->QloadAlarmBusyNumThreshold = (UCHAR)simple_strtol(Arg, 0, 10);\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n\treturn TRUE;\n}\n\n#endif /* AP_QLOAD_SUPPORT */\n\n"
  },
  {
    "path": "src/ap/ap_sanity.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n     \n     Module Name:\n     ap_sanity.c\n     \n     Abstract:\n     Handle association related requests either from WSTA or from local MLME\n     \n     Revision History:\n     Who         When          What\n     --------    ----------    ----------------------------------------------\n     John Chang  08-14-2003    created for 11g soft-AP\n     John Chang  12-30-2004    merge with STA driver for RT2600\n*/\n\n#include \"rt_config.h\"\n\nextern UCHAR\tCISCO_OUI[];\n\nextern UCHAR\tWPA_OUI[];\nextern UCHAR\tRSN_OUI[];\nextern UCHAR\tWME_INFO_ELEM[];\nextern UCHAR\tWME_PARM_ELEM[];\nextern UCHAR\tRALINK_OUI[];\n\nextern UCHAR \tBROADCOM_OUI[]; \nextern UCHAR    WPS_OUI[];\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\n\nBOOLEAN PeerAssocReqCmmSanity(\n\tRTMP_ADAPTER *pAd, \n\tBOOLEAN isReassoc,\n\tVOID *Msg,\n\tINT MsgLen,\n\tIE_LISTS *ie_lists)\n{\n    CHAR\t\t\t*Ptr;\n    PFRAME_802_11\tFr = (PFRAME_802_11)Msg;\n    PEID_STRUCT\t\teid_ptr;\n    UCHAR\t\t\tSanity = 0;\n    UCHAR\t\t\tWPA1_OUI[4] = { 0x00, 0x50, 0xF2, 0x01 };\n    UCHAR\t\t\tWPA2_OUI[3] = { 0x00, 0x0F, 0xAC };\n    MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)NULL;\n#ifdef P2P_SUPPORT\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\tP2POUIBYTE[4] = {0x50, 0x6f, 0x9a, 0x9};\n#endif /* P2P_SUPPORT */\n#ifdef P2P_SUPPORT\n\tUCHAR *pP2pSubelement = &ie_lists->P2pSubelement[0];\n#endif /* P2P_SUPPORT */\n\tHT_CAPABILITY_IE *pHtCapability = &ie_lists->HTCapability;\n\n\n\tpEntry = MacTableLookup(pAd, &Fr->Hdr.Addr2[0]);\n\tif (pEntry == NULL)\n\t\treturn FALSE;\n\n\tCOPY_MAC_ADDR(&ie_lists->Addr2[0], &Fr->Hdr.Addr2[0]);\n\t\n\tPtr = (PCHAR)Fr->Octet;\n\n\tNdisMoveMemory(&ie_lists->CapabilityInfo, &Fr->Octet[0], 2);\n\tNdisMoveMemory(&ie_lists->ListenInterval, &Fr->Octet[2], 2);\n\n\tif (isReassoc) \n\t{\n\t\tNdisMoveMemory(&ie_lists->ApAddr[0], &Fr->Octet[4], 6);\n\t\teid_ptr = (PEID_STRUCT) &Fr->Octet[10];\n\t}\n\telse\n\t{\n\t\teid_ptr = (PEID_STRUCT) &Fr->Octet[4];\n\t}\n\n\n    /* get variable fields from payload and advance the pointer */\n    while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < ((UCHAR *)Fr + MsgLen))\n    {\n        switch(eid_ptr->Eid)\n        {\n            case IE_SSID:\n\t\t\tif (((Sanity&0x1) == 1))\n\t\t\t\tbreak;\n\n                if ((eid_ptr->Len <= MAX_LEN_OF_SSID))\n                {\n                    Sanity |= 0x01;\n                    NdisMoveMemory(&ie_lists->Ssid[0], eid_ptr->Octet, eid_ptr->Len);\n                    ie_lists->SsidLen = eid_ptr->Len;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerAssocReqSanity - SsidLen = %d  \\n\", ie_lists->SsidLen));\n                }\n                else\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerAssocReqSanity - wrong IE_SSID\\n\"));\n                    return FALSE;\n                }\n                break;\n\n            case IE_SUPP_RATES:\n                if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) &&\n\t\t\t\t\t(eid_ptr->Len > 0))\n                {\n                    Sanity |= 0x02;\n                    NdisMoveMemory(&ie_lists->SupportedRates[0], eid_ptr->Octet, eid_ptr->Len);\n\n                    DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t(\"PeerAssocReqSanity - IE_SUPP_RATES., Len=%d. \"\n\t\t\t\t\t\t\"Rates[0]=%x\\n\", eid_ptr->Len, ie_lists->SupportedRates[0]));\n                    DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t(\"Rates[1]=%x %x %x %x %x %x %x\\n\",\n\t\t\t\t\t\tie_lists->SupportedRates[1], ie_lists->SupportedRates[2],\n\t\t\t\t\t\tie_lists->SupportedRates[3], ie_lists->SupportedRates[4],\n\t\t\t\t\t\tie_lists->SupportedRates[5], ie_lists->SupportedRates[6],\n\t\t\t\t\t\tie_lists->SupportedRates[7]));\n\n                    ie_lists->SupportedRatesLen = eid_ptr->Len;\n                }\n                else\n                {\n\t\t\t\t\tUCHAR RateDefault[8] = \\\n\t\t\t\t\t\t\t{ 0x82, 0x84, 0x8b, 0x96, 0x12, 0x24, 0x48, 0x6c };\n\n                \t/* HT rate not ready yet. return true temporarily. rt2860c */\n                    /*DBGPRINT(RT_DEBUG_TRACE, (\"PeerAssocReqSanity - wrong IE_SUPP_RATES\\n\")); */\n                    Sanity |= 0x02;\n                    ie_lists->SupportedRatesLen = 8;\n\t\t\t\t\tNdisMoveMemory(&ie_lists->SupportedRates[0], RateDefault, 8);\n\n                    DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t(\"PeerAssocReqSanity - wrong IE_SUPP_RATES., Len=%d\\n\",\n\t\t\t\t\t\teid_ptr->Len));\n                }\n                break;\n\n            case IE_EXT_SUPP_RATES:\n                if (eid_ptr->Len + ie_lists->SupportedRatesLen <= MAX_LEN_OF_SUPPORTED_RATES)\n                {\n                    NdisMoveMemory(&ie_lists->SupportedRates[ie_lists->SupportedRatesLen], eid_ptr->Octet,\n\t\t\t\t\t\t\t\t\teid_ptr->Len);\n                    ie_lists->SupportedRatesLen += eid_ptr->Len;\n                }\n                else\n                {\n                    NdisMoveMemory(&ie_lists->SupportedRates[ie_lists->SupportedRatesLen], eid_ptr->Octet,\n\t\t\t\t\t\t\t\t\tMAX_LEN_OF_SUPPORTED_RATES - (ie_lists->SupportedRatesLen));\n                    ie_lists->SupportedRatesLen = MAX_LEN_OF_SUPPORTED_RATES;\n                }\n                break;\n                \n            case IE_HT_CAP:\n\t\t\tif (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pHtCapability, eid_ptr->Octet, SIZE_HT_CAP_IE);\n\n\t\t\t\t*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t\t{\n\t\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\t\tNdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t\t}\n#else\t\t\t\t\n\t\t\t\t*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\t\tie_lists->ht_cap_len = SIZE_HT_CAP_IE;\n\t\t\t\tSanity |= 0x10;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerAssocReqSanity - IE_HT_CAP\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerAssocReqSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\\n\", eid_ptr->Len));\n\t\t\t}\n\t\t\t\t\n\t\tbreak;\n\t\tcase IE_EXT_CAPABILITY:\n\t\t\tif (eid_ptr->Len >= sizeof(EXT_CAP_INFO_ELEMENT))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_lists->ExtCapInfo, eid_ptr->Octet, sizeof(EXT_CAP_INFO_ELEMENT));\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerAssocReqSanity - IE_EXT_CAPABILITY!\\n\"));\n\t\t\t}\n\n\t\t\tbreak;\n\n            case IE_WPA:    /* same as IE_VENDOR_SPECIFIC */\n            case IE_WPA2:\n\n#ifdef P2P_SUPPORT\n\t\t\t\tif (NdisEqualMemory(eid_ptr->Octet, P2POUIBYTE, sizeof(P2POUIBYTE)) && (eid_ptr->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tif (ie_lists->P2PSubelementLen == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &eid_ptr->Eid, (eid_ptr->Len+2));\n\t\t\t\t\t\tie_lists->P2PSubelementLen = (eid_ptr->Len+2);\n\t\t\t\t\t}\n\t\t\t\t\telse if (ie_lists->P2PSubelementLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + ie_lists->P2PSubelementLen, &eid_ptr->Eid, (eid_ptr->Len+2));\n\t\t\t\t\t\tie_lists->P2PSubelementLen += (eid_ptr->Len+2);\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" ! ===>P2P - PeerAssocReqSanity  P2P IE Len becomes = %d.   %s\\n\", ie_lists->P2PSubelementLen, decodeP2PState(pP2PCtrl->P2PConnectState)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\t\tif (NdisEqualMemory(eid_ptr->Octet, WPS_OUI, 4))\n\t\t\t\t{\n#ifdef WSC_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscV2Info.bWpsEnable) ||\n\t\t\t\t\t\t(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscV2Info.bEnableWpsV2 == FALSE))\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t    ie_lists->bWscCapable = TRUE;\n#endif /* WSC_AP_SUPPORT */\n\t\t\t\t    break;\n\t\t\t\t}\n\n\t\t\t\t/* Handle Atheros and Broadcom draft 11n STAs */\n\t\t\t\tif (NdisEqualMemory(eid_ptr->Octet, BROADCOM_OUI, 3))\n\t\t\t\t{\n\t\t\t\t\tswitch (eid_ptr->Octet[3])\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0x33: \n\t\t\t\t\t\t\tif ((eid_ptr->Len-4) == sizeof(HT_CAPABILITY_IE))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisMoveMemory(pHtCapability, &eid_ptr->Octet[4], SIZE_HT_CAP_IE);\n\n\t\t\t\t\t\t\t\t*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\t\t\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t\t\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\t\t\t\t\t\tNdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t\t\t\t\t\t}\n#else\t\t\t\t\n\t\t\t\t\t\t\t\t*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\t\t\t\t\t\tie_lists->ht_cap_len = SIZE_HT_CAP_IE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t/* ignore other cases */\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n                if (NdisEqualMemory(eid_ptr->Octet, RALINK_OUI, 3) && (eid_ptr->Len == 7))\n                {\n\t\t\t\tif (eid_ptr->Octet[3] != 0)\n\t\t                    \tie_lists->RalinkIe = eid_ptr->Octet[3];\n        \t\t\telse\n        \t\t\t\tie_lists->RalinkIe = 0xf0000000; /* Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag. */\n                    break;\n                }\n                \n                /* WMM_IE */\n                if (NdisEqualMemory(eid_ptr->Octet, WME_INFO_ELEM, 6) && (eid_ptr->Len == 7))\n                {\n                    ie_lists->bWmmCapable = TRUE;\n\n#ifdef UAPSD_SUPPORT\n\t\t\t\t\tif (pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tUAPSD_AssocParse(pAd,\n\t\t\t\t\t\t\t\t\tpEntry, (UINT8 *)&eid_ptr->Octet[6],\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[\\\n\t\t\t\t\t\t\t\t\t\tpEntry->apidx].UapsdInfo.bAPSDCapable);\n\t\t\t\t\t}\n#endif /* UAPSD_SUPPORT */\n\n                    break;\n                }\n\n                if (pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode < Ndis802_11AuthModeWPA)\n                    break;\n                \n                /* \tIf this IE did not begins with 00:0x50:0xf2:0x01,  \n                \tit would be proprietary. So we ignore it. */\n                if (!NdisEqualMemory(eid_ptr->Octet, WPA1_OUI, sizeof(WPA1_OUI))\n                    && !NdisEqualMemory(&eid_ptr->Octet[2], WPA2_OUI, sizeof(WPA2_OUI)))\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Not RSN IE, maybe WMM IE!!!\\n\"));\n                    break;                          \n                }\n                \n                if (/*(eid_ptr->Len <= MAX_LEN_OF_RSNIE) &&*/ (eid_ptr->Len >= MIN_LEN_OF_RSNIE))\n                {\n\t\t\t\t\thex_dump(\"Received RSNIE in Assoc-Req\", (UCHAR *)eid_ptr, eid_ptr->Len + 2);\n                    \n\t\t\t\t\t/* Copy whole RSNIE context */\n                    NdisMoveMemory(&ie_lists->RSN_IE[0], eid_ptr, eid_ptr->Len + 2);\n\t\t\t\t\tie_lists->RSNIE_Len =eid_ptr->Len + 2;\n\n                }\n                else\n                {\n                    ie_lists->RSNIE_Len = 0;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerAssocReqSanity - missing IE_WPA(%d)\\n\",eid_ptr->Len));\n                    return FALSE;\n                }               \n                break;\n\n#ifdef WAPI_SUPPORT\t\t\t\t\n\t\t\tcase IE_WAPI:\t\t\t\t\n\t\t\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode != Ndis802_11AuthModeWAICERT) &&\n\t\t\t\t\t(pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode != Ndis802_11AuthModeWAIPSK))\n                    break;\t\t\t\t\n\n\t\t\t\t/* Sanity check the validity of WIE */\n\t\t\t\t/* Todo - AlbertY */\n\t\t\t\t\n\t\t\t\t/* Copy whole WAPI-IE context */\n                NdisMoveMemory(&ie_lists->RSN_IE[0], eid_ptr, eid_ptr->Len + 2);\n\t\t\t\tie_lists->RSNIE_Len =eid_ptr->Len + 2;\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerAssocReqSanity - IE_WAPI(%d)\\n\",eid_ptr->Len));\n\t\t\t\tbreak;\n#endif /* WAPI_SUPPORT */\t\t\t\t\n\n\n\n#ifdef DOT11_VHT_AC\n\t\tcase IE_VHT_CAP:\n\t\t\tif (eid_ptr->Len == sizeof(VHT_CAP_IE))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_lists->vht_cap, eid_ptr->Octet, sizeof(VHT_CAP_IE));\n\t\t\t\tie_lists->vht_cap_len = eid_ptr->Len;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():IE_VHT_CAP\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_VHT_CAP, eid->Len = %d\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, eid_ptr->Len));\n\t\t\t}\n#endif /* DOT11_VHT_AC */\n            default:\n                break;\n        }\n\n        eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);        \n    }\n\n\tif ((Sanity&0x3) != 0x03)\t \n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s(): - missing mandatory field\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() - success\\n\", __FUNCTION__));\n\t\treturn TRUE;\n\t}\n}\n\n\n\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN PeerDisassocReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT\tUINT16\t*SeqNum,\n    OUT USHORT *Reason) \n{\n    PFRAME_802_11 Fr = (PFRAME_802_11)Msg;\n\n    COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2);\n\t*SeqNum = Fr->Hdr.Sequence;\n    NdisMoveMemory(Reason, &Fr->Octet[0], 2);\n\n    return TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN PeerDeauthReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT\tUINT16\t*SeqNum, \n    OUT USHORT *Reason) \n{\n    PFRAME_802_11 Fr = (PFRAME_802_11)Msg;\n\n    COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2);\n\t*SeqNum = Fr->Hdr.Sequence;\n    NdisMoveMemory(Reason, &Fr->Octet[0], 2);\n\n    return TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN APPeerAuthSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr1, \n    OUT PUCHAR pAddr2, \n    OUT USHORT *Alg, \n    OUT USHORT *Seq, \n    OUT USHORT *Status, \n    CHAR *ChlgText\n    ) \n{\n    PFRAME_802_11 Fr = (PFRAME_802_11)Msg;\n\n\tCOPY_MAC_ADDR(pAddr1,  &Fr->Hdr.Addr1);\t\t/* BSSID */\n    COPY_MAC_ADDR(pAddr2,  &Fr->Hdr.Addr2);\t\t/* SA */\n    NdisMoveMemory(Alg,    &Fr->Octet[0], 2);\n    NdisMoveMemory(Seq,    &Fr->Octet[2], 2);\n    NdisMoveMemory(Status, &Fr->Octet[4], 2);\n\n    if (*Alg == AUTH_MODE_OPEN) \n    {\n        if (*Seq == 1 || *Seq == 2) \n        {\n            return TRUE;\n        } \n        else \n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"APPeerAuthSanity fail - wrong Seg# (=%d)\\n\", *Seq));\n            return FALSE;\n        }\n    } \n    else if (*Alg == AUTH_MODE_KEY) \n    {\n        if (*Seq == 1 || *Seq == 4) \n        {\n            return TRUE;\n        } \n        else if (*Seq == 2 || *Seq == 3) \n        {\n            NdisMoveMemory(ChlgText, &Fr->Octet[8], CIPHER_TEXT_LEN);\n            return TRUE;\n        } \n        else \n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"APPeerAuthSanity fail - wrong Seg# (=%d)\\n\", *Seq));\n            return FALSE;\n        }\n    } \n    else \n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"APPeerAuthSanity fail - wrong algorithm (=%d)\\n\", *Alg));\n        return FALSE;\n    }\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "src/ap/ap_sync.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n     \n     Module Name:\n     sync.c\n     \n     Abstract:\n     Synchronization state machine related services\n     \n     Revision History:\n     Who         When          What\n     --------    ----------    ----------------------------------------------\n     John Chang  08-04-2003    created for 11g soft-AP\n     \n */\n\n#include \"rt_config.h\"\n\n#define OBSS_BEACON_RSSI_THRESHOLD\t\t(-85)\n\n#ifdef DOT11_N_SUPPORT\nvoid build_ext_channel_switch_ie(\n\tIN PRTMP_ADAPTER pAd,\n\tIN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef P2P_SUPPORT\nextern UCHAR\tWILDP2PSSID[];\nextern UCHAR\tWILDP2PSSIDLEN;\n#endif /* P2P_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThe sync state machine,\n\tParameters:\n\t\tSm - pointer to the state machine\n\tNote:\n\t\tthe state machine looks like the following\n\n\t\t\t\t\t\t\tAP_SYNC_IDLE\n\tAPMT2_PEER_PROBE_REQ\tpeer_probe_req_action\n\t==========================================================================\n */\nVOID APSyncStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC *)Trans, AP_MAX_SYNC_STATE, AP_MAX_SYNC_MSG, (STATE_MACHINE_FUNC)Drop, AP_SYNC_IDLE, AP_SYNC_MACHINE_BASE);\n\n\tStateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_PEER_PROBE_REQ, (STATE_MACHINE_FUNC)APPeerProbeReqAction);\n\tStateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_PEER_BEACON, (STATE_MACHINE_FUNC)APPeerBeaconAction);\n#ifdef P2P_SUPPORT\n\tStateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)APPeerBeaconAtScanAction);\n#endif /* P2P_SUPPORT */\n#ifdef AP_SCAN_SUPPORT\n\tStateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)APMlmeScanReqAction);\n\n\t/* scan_listen state */\n\tStateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)APInvalidStateWhenScan);\n\tStateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_PEER_BEACON, (STATE_MACHINE_FUNC)APPeerBeaconAtScanAction);\n\tStateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)APPeerBeaconAtScanAction);\n\tStateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_SCAN_TIMEOUT, (STATE_MACHINE_FUNC)APScanTimeoutAction);\n\tStateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_MLME_SCAN_CNCL, (STATE_MACHINE_FUNC)APScanCnclAction);\n\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.APScanTimer, GET_TIMER_FUNCTION(APScanTimeout), pAd, FALSE);\n#endif /* AP_SCAN_SUPPORT */\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tProcess the received ProbeRequest from clients\n\tParameters:\n\t\tElem - msg containing the ProbeReq frame\n\t==========================================================================\n */\nVOID APPeerProbeReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR         Addr2[MAC_ADDR_LEN];\n\tCHAR          Ssid[MAX_LEN_OF_SSID];\n\tUCHAR         SsidLen;\n\tHEADER_802_11 ProbeRspHdr;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR        pOutBuffer = NULL;\n\tULONG         FrameLen = 0, TmpLen;\n\tLARGE_INTEGER FakeTimestamp;\n\tUCHAR         DsLen = 1;\n\tUCHAR   ErpIeLen = 1;\n\tUCHAR         apidx = 0, PhyMode, SupRateLen;\n\tUCHAR   RSNIe=IE_WPA, RSNIe2=IE_WPA2;\n\tBOOLEAN\t\tbRequestRssi=FALSE;\n\n#ifdef WSC_AP_SUPPORT\n    UCHAR\t\t  Addr3[MAC_ADDR_LEN];\n    PFRAME_802_11 pFrame = (PFRAME_802_11)Elem->Msg;\n\n\tCOPY_MAC_ADDR(Addr3, pFrame->Hdr.Addr3);\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t/* When enable P2P scan, there driver alway sent probe request.\n\t    But when user enter main page, LG request not sent probe response. */\n\tif ( pAd->P2pCfg.bSentProbeRSP != TRUE )\n\t\treturn;\n#endif /* P2P_SUPPORT */\n\t\n\tif (! PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen, &bRequestRssi))\n\t\treturn;\n\n\tfor(apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tRSNIe = IE_WPA;\n\t\n\t\tif ((pAd->ApCfg.MBSSID[apidx].MSSIDDev != NULL) &&\n\t\t\t!(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev)))\n\t\t{\n\t\t\t/* the interface is down, so we can not send probe response */\n\t\t\tcontinue;\n\t\t}\n\n\t\tPhyMode = pAd->ApCfg.MBSSID[apidx].PhyMode;\n\n\t\tif (((SsidLen == 0) && (! pAd->ApCfg.MBSSID[apidx].bHideSsid)) ||\n#ifdef WSC_AP_SUPPORT\n            /* buffalo WPS testbed STA send ProbrRequest ssid length = 32 and ssid are not AP , but DA are AP. for WPS test send ProbeResponse */\n\t\t\t((SsidLen == 32) && MAC_ADDR_EQUAL(Addr3, pAd->ApCfg.MBSSID[apidx].Bssid) && (pAd->ApCfg.MBSSID[apidx].bHideSsid == 0)) ||\n#endif /* WSC_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\t(NdisEqualMemory(Ssid, &WILDP2PSSID[0], WILDP2PSSIDLEN)) ||\n#endif /* P2P_SUPPORT */\n\t\t((SsidLen == pAd->ApCfg.MBSSID[apidx].SsidLen) && NdisEqualMemory(Ssid, pAd->ApCfg.MBSSID[apidx].Ssid, (ULONG) SsidLen)))\n\t\t\t;\n\t\telse\n\t\t\tcontinue; /* check next BSS */\n\n\t\t/* allocate and send out ProbeRsp frame */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\treturn;\n\t\tMgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid);\n\n\t\t if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA) ||\n\t\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPAPSK))\n\t\t\tRSNIe = IE_WPA;\n\t\telse if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t\tRSNIe = IE_WPA2;\n#ifdef WAPI_SUPPORT\n\t\telse if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWAICERT) ||\n\t\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWAIPSK))\n\t\t\tRSNIe = IE_WAPI;\n#endif /* WAPI_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n\t\t{\n\t\t\tUCHAR\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\t\t\tUCHAR\t\tSupRateIe = IE_SUPP_RATES;\n\t\t\tUCHAR\t\tSupRateLen = 0;\n\t\t\tUCHAR\tChannel = pAd->CommonCfg.Channel;\n\n\t\t\tif (IS_P2P_LISTEN(pAd))\n\t\t\t\tChannel = pAd->P2pCfg.ListenChannel;\n\n\t\t\tSupRate[0]\t= 0x8C;    /* 6 mbps, in units of 0.5 Mbps, basic rate */\n\t\t\tSupRate[1]\t= 0x12;    /* 9 mbps, in units of 0.5 Mbps */\n\t\t\tSupRate[2]\t= 0x98;    /* 12 mbps, in units of 0.5 Mbps, basic rate */\n\t\t\tSupRate[3]\t= 0x24;    /* 18 mbps, in units of 0.5 Mbps */\n\t\t\tSupRate[4]\t= 0xb0;    /* 24 mbps, in units of 0.5 Mbps, basic rate */\n\t\t\tSupRate[5]\t= 0x48;    /* 36 mbps, in units of 0.5 Mbps */\n\t\t\tSupRate[6]\t= 0x60;    /* 48 mbps, in units of 0.5 Mbps */\n\t\t\tSupRate[7]\t= 0x6c;    /* 54 mbps, in units of 0.5 Mbps */\n\t\t\tSupRateLen\t= 8;\n\n\t\t\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t  &FrameLen,\n\t\t\t\t\t\t\t  sizeof(HEADER_802_11),\t  &ProbeRspHdr,\n\t\t\t\t\t\t\t  TIMESTAMP_LEN,\t\t\t  &FakeTimestamp,\n\t\t\t\t\t\t\t  2,\t\t\t\t\t\t  &pAd->CommonCfg.BeaconPeriod,\n\t\t\t\t\t\t\t  2,\t\t\t\t\t\t  &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &SsidIe,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &pAd->ApCfg.MBSSID[apidx].SsidLen,\n\t\t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].SsidLen, \tpAd->ApCfg.MBSSID[apidx].Ssid,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &SupRateIe,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &SupRateLen,\n\t\t\t\t\t\t\t  SupRateLen,\t\t\t\t  &SupRate,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &DsIe,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &DsLen,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t\t  &Channel,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\tSupRateLen = pAd->CommonCfg.SupRateLen;\n\t\tif (PhyMode == WMODE_B)\n\t\t\tSupRateLen = 4;\n\n\t\tMakeOutgoingFrame(pOutBuffer,                 &FrameLen,\n\t\t\t\t\t\t  sizeof(HEADER_802_11),      &ProbeRspHdr,\n\t\t\t\t\t\t  TIMESTAMP_LEN,              &FakeTimestamp,\n\t\t\t\t\t\t  2,                          &pAd->CommonCfg.BeaconPeriod,\n\t\t\t\t\t\t  2,                          &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,\n\t\t\t\t\t\t  1,                          &SsidIe,\n\t\t\t\t\t\t  1,                          &pAd->ApCfg.MBSSID[apidx].SsidLen,\n\t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].SsidLen,     pAd->ApCfg.MBSSID[apidx].Ssid,\n\t\t\t\t\t\t  1,                          &SupRateIe,\n\t\t\t\t\t\t  1,                          &SupRateLen,\n\t\t\t\t\t\t  SupRateLen,                 pAd->CommonCfg.SupRate,\n\t\t\t\t\t\t  1,                          &DsIe,\n\t\t\t\t\t\t  1,                          &DsLen,\n\t\t\t\t\t\t  1,                          &pAd->CommonCfg.Channel,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\t}\n\n\t\tif ((pAd->CommonCfg.ExtRateLen) && (PhyMode != WMODE_B))\n\t\t{\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n\t\t\t\t\t\t\t  1,                        &ErpIe,\n\t\t\t\t\t\t\t  1,                        &ErpIeLen,\n\t\t\t\t\t\t\t  1,                        &pAd->ApCfg.ErpIeContent,\n\t\t\t\t\t\t\t  1,                        &ExtRateIe,\n\t\t\t\t\t\t\t  1,                        &pAd->CommonCfg.ExtRateLen,\n\t\t\t\t\t\t\t  pAd->CommonCfg.ExtRateLen,    pAd->CommonCfg.ExtRate,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\n#ifdef A_BAND_SUPPORT\n\t\t/* add Channel switch announcement IE */\n\t\tif ((pAd->CommonCfg.Channel > 14)\n\t\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t\t&& (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE))\n\t\t{\n\t\t\tUCHAR CSAIe=IE_CHANNEL_SWITCH_ANNOUNCEMENT;\n\t\t\tUCHAR CSALen=3;\n\t\t\tUCHAR CSAMode=1;\n\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n\t\t\t\t\t\t\t  1,                        &CSAIe,\n\t\t\t\t\t\t\t  1,                        &CSALen,\n\t\t\t\t\t\t\t  1,                        &CSAMode,\n\t\t\t\t\t\t\t  1,                        &pAd->CommonCfg.Channel,\n\t\t\t\t\t\t\t  1,                        &pAd->Dot11_H.CSCount,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif /* A_BAND_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(PhyMode) &&\n\t\t\t(pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable))\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR\tHtLen, AddHtLen, NewExtLen;\n#ifdef RT_BIG_ENDIAN\n\t\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\t\tADD_HT_INFO_IE\taddHTInfoTmp;\n#endif\n\n#ifdef A_BAND_SUPPORT\n   \t\t\tif (pAd->CommonCfg.bExtChannelSwitchAnnouncement && (pAd->CommonCfg.Channel > 14))\n\t\t\t{\n\t\t\t\tHT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE\tHtExtChannelSwitchIe;\n\n\t\t\t\tbuild_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe);\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen,\n\t\t\t\t\t\t\t\t  sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE), &HtExtChannelSwitchIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n#endif /* A_BAND_SUPPORT */\n\n\t\t\tHtLen = sizeof(pAd->CommonCfg.HtCapability);\n\t\t\tAddHtLen = sizeof(pAd->CommonCfg.AddHTInfo);\n\t\t\tNewExtLen = 1;\n\t\t\t/*New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame */\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,\n\t\t\t\t\t\t\t  1,                                &HtCapIe,\n\t\t\t\t\t\t\t  1,                                &HtLen,\n\t\t\t\t\t\t\t sizeof(HT_CAPABILITY_IE),          &pAd->CommonCfg.HtCapability,\n\t\t\t\t\t\t\t  1,                                &AddHtInfoIe,\n\t\t\t\t\t\t\t  1,                                &AddHtLen,\n\t\t\t\t\t\t\t sizeof(ADD_HT_INFO_IE),          &pAd->CommonCfg.AddHTInfo,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);\n\t\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t{\n\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t}\n#else\t\t\t\t\n\t\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\tNdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, AddHtLen);\n\t\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));\n\t\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t\t1,                           &HtCapIe,\n\t\t\t\t\t\t\t\t1,                           &HtLen,\n\t\t\t\t\t\t\t\tHtLen,                       &HtCapabilityTmp,\n\t\t\t\t\t\t\t\t1,                           &AddHtInfoIe,\n\t\t\t\t\t\t\t\t1,                           &AddHtLen,\n\t\t\t\t\t\t\t\tAddHtLen,                    &addHTInfoTmp,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\n#endif\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\t/* Append RSN_IE when  WPA OR WPAPSK, */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t; /* enough information */\n\t\telse if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2) ||\n\t\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\t{\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n\t\t\t\t\t\t\t  1,                        &RSNIe,\n\t\t\t\t\t\t\t  1,                        &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0],\n\t\t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0],  pAd->ApCfg.MBSSID[apidx].RSN_IE[0],\n\t\t\t\t\t\t\t  1,                        &RSNIe2,\n\t\t\t\t\t\t\t  1,                        &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1],\n\t\t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1],  pAd->ApCfg.MBSSID[apidx].RSN_IE[1],\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n\t\t\t\t\t\t\t  1,                        &RSNIe,\n\t\t\t\t\t\t\t  1,                        &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0],\n\t\t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0],  pAd->ApCfg.MBSSID[apidx].RSN_IE[0],\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\n\t\t/* add WMM IE here */\n\t\tif (pAd->ApCfg.MBSSID[apidx].bWmmCapable)\n\t\t{\n\t\t\tUCHAR i;\n\t\t\tUCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0};\n\t\t\tWmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f;\n#ifdef UAPSD_SUPPORT\n\t\t\tUAPSD_MR_IE_FILL(WmeParmIe[8], &pAd->ApCfg.MBSSID[apidx].UapsdInfo);\n#endif /* UAPSD_SUPPORT */\n\t\t\tfor (i=QID_AC_BE; i<=QID_AC_VO; i++)\n\t\t\t{\n\t\t\t\tWmeParmIe[10+ (i*4)] = (i << 5) + /* b5-6 is ACI */\n\t\t\t\t\t\t\t\t\t   ((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4) +     /* b4 is ACM */\n\t\t\t\t\t\t\t\t\t   (pAd->ApCfg.BssEdcaParm.Aifsn[i] & 0x0f);\t\t/* b0-3 is AIFSN */\n\t\t\t\tWmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4) +\t/* b5-8 is CWMAX */\n\t\t\t\t\t\t\t\t\t   (pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f);\t/* b0-3 is CWMIN */\n\t\t\t\tWmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff);        /* low byte of TXOP */\n\t\t\t\tWmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8);          /* high byte of TXOP */\n\t\t\t}\n\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen,\n\t\t\t\t\t\t\t  26,                       WmeParmIe,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\n#ifdef AP_QLOAD_SUPPORT\n\t\tif (pAd->FlgQloadEnable != 0)\n\t\t{\n\t\t\tFrameLen += QBSS_LoadElementAppend(pAd, pOutBuffer+FrameLen);\n\t\t}\n#endif /* AP_QLOAD_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t \t/* P802.11n_D3.03, 7.3.2.60 Overlapping BSS Scan Parameters IE */\n\t \tif (WMODE_CAP_N(PhyMode) &&\n\t\t\t(pAd->CommonCfg.Channel <= 14) &&\n\t\t\t(pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable) &&\n\t\t\t(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1))\n\t \t{\n\t\t\tOVERLAP_BSS_SCAN_IE  OverlapScanParam;\n\t\t\tULONG\tTmpLen;\n\t\t\tUCHAR\tOverlapScanIE, ScanIELen;\n\n\t\t\tOverlapScanIE = IE_OVERLAPBSS_SCAN_PARM;\n\t\t\tScanIELen = 14;\n\t\t\tOverlapScanParam.ScanPassiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveDwell);\n\t\t\tOverlapScanParam.ScanActiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveDwell);\n\t\t\tOverlapScanParam.TriggerScanInt = cpu2le16(pAd->CommonCfg.Dot11BssWidthTriggerScanInt);\n\t\t\tOverlapScanParam.PassiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel);\n\t\t\tOverlapScanParam.ActiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel);\n\t\t\tOverlapScanParam.DelayFactor = cpu2le16(pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\t\t\tOverlapScanParam.ScanActThre = cpu2le16(pAd->CommonCfg.Dot11OBssScanActivityThre);\n\t\t\t\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t&OverlapScanIE,\n\t\t\t\t\t\t\t\t1,\t\t\t&ScanIELen,\n\t\t\t\t\t\t\t\tScanIELen,\t&OverlapScanParam,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t\n\t\t\tFrameLen += TmpLen;\n\t \t}\n\n\n\n\t\t/* 7.3.2.27 Extended Capabilities IE */\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\tEXT_CAP_INFO_ELEMENT extCapInfo;\n\t\t\tUCHAR extInfoLen;\n\n\n\t\t\textInfoLen = sizeof(EXT_CAP_INFO_ELEMENT);\n\t\t\tNdisZeroMemory(&extCapInfo, extInfoLen);\n\n\t\t\t/* P802.11n_D1.10, HT Information Exchange Support */\n\t\t\tif (WMODE_CAP_N(PhyMode) && (pAd->CommonCfg.Channel <= 14) &&\n\t\t\t\t(pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable) && \n\t\t\t\t(pAd->CommonCfg.bBssCoexEnable == TRUE))\n\t\t\t{\n\t\t\textCapInfo.BssCoexistMgmtSupport = 1;\n\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen,\n\t\t\t\t\t\t\t\t1, \t\t\t&ExtCapIe,\n\t\t\t\t\t\t\t\t1, \t\t\t&extInfoLen,\n\t\t\t\t\t\t\t\textInfoLen, \t&extCapInfo,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t\t\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\t\t/* \n\t\t\tadd Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back\n\t\t                                  Byte0.b3=1 for rssi-feedback \n\t\t */\n{\n\tULONG TmpLen;\n\tUCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00};\n\n\tif (pAd->CommonCfg.bAggregationCapable)\n\t\tRalinkSpecificIe[5] |= 0x1;\n\tif (pAd->CommonCfg.bPiggyBackCapable)\n\t\tRalinkSpecificIe[5] |= 0x2;\n#ifdef DOT11_N_SUPPORT\n\tif (pAd->CommonCfg.bRdg)\n\t\tRalinkSpecificIe[5] |= 0x4;\n#endif /* DOT11_N_SUPPORT */\n#ifdef RSSI_FEEDBACK\n\tif (bRequestRssi == TRUE)\n\t{\n\t    MAC_TABLE_ENTRY *pEntry=NULL;\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\\n\",\n\t\t\t\t\t\t\t\t\tPRINT_MAC(Addr2)));\n    \n\t\tRalinkSpecificIe[5] |= 0x8;\n\t\tpEntry = MacTableLookup(pAd, Addr2);\n\n\t\tif (pEntry != NULL)\n\t\t{\n\t\t\tRalinkSpecificIe[6] = (UCHAR)pEntry->RssiSample.AvgRssi0;\n\t\t\tRalinkSpecificIe[7] = (UCHAR)pEntry->RssiSample.AvgRssi1;\n\t\t\tRalinkSpecificIe[8] = (UCHAR)pEntry->RssiSample.AvgRssi2;\n\t\t}\n\t}\n#endif /* RSSI_FEEDBACK */\n\tMakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen,\n\t\t\t\t\t\t9, RalinkSpecificIe,\n\t\t\t\t\t\tEND_OF_ARGS);\n\tFrameLen += TmpLen;\n\n}\n\n#ifdef A_BAND_SUPPORT\n\t\t/* add Channel switch announcement IE */\n\t\tif ((pAd->CommonCfg.Channel > 14)\n\t\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t\t&& (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE))\n\t\t{\n\t\t\tUCHAR CSAIe=IE_CHANNEL_SWITCH_ANNOUNCEMENT;\n\t\t\tUCHAR CSALen=3;\n\t\t\tUCHAR CSAMode=1;\n\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen,\n\t\t\t\t\t\t\t  1,                        &CSAIe,\n\t\t\t\t\t\t\t  1,                        &CSALen,\n\t\t\t\t\t\t\t  1,                        &CSAMode,\n\t\t\t\t\t\t\t  1,                        &pAd->CommonCfg.Channel,\n\t\t\t\t\t\t\t  1,                        &pAd->Dot11_H.CSCount,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n#ifdef DOT11_N_SUPPORT\n   \t\t\tif (pAd->CommonCfg.bExtChannelSwitchAnnouncement)\n\t\t\t{\n\t\t\t\tHT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE\tHtExtChannelSwitchIe;\n\n\t\t\t\tbuild_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe);\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,             &TmpLen,\n\t\t\t\t\t\t\t\t  sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE),\t&HtExtChannelSwitchIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif /* A_BAND_SUPPORT */\n\n\t    /* add country IE, power constraint IE */\n\t\tif (pAd->CommonCfg.bCountryFlag)\n\t\t{\n\t\t    ULONG TmpLen2=0;\n\t\t    UCHAR TmpFrame[256];\n\t\t    UCHAR CountryIe = IE_COUNTRY;\n\t\t    UCHAR MaxTxPower=16;\n\n#ifdef A_BAND_SUPPORT\n\t\t\t/* \n\t\t\t\tOnly 802.11a APs that comply with 802.11h are required to include\n\t\t\t\t a Power Constrint Element(IE=32) in beacons and probe response frames\n\t\t\t*/\n\t\t\tif (pAd->CommonCfg.Channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE)\n\t\t\t{\n\t\t        /* prepare power constraint IE */\n\t\t        MakeOutgoingFrame(pOutBuffer+FrameLen,    &TmpLen,\n\t\t                          3,                 \tPowerConstraintIE,\n\t\t                          END_OF_ARGS);\n\t\t        FrameLen += TmpLen;\n\t\t\t}\n#endif /* A_BAND_SUPPORT */\n\n\t\t    NdisZeroMemory(TmpFrame, sizeof(TmpFrame));\n\n\t\t\t/* prepare channel information */\n\t\t    MakeOutgoingFrame(TmpFrame+TmpLen2,     &TmpLen,\n\t\t                          1,                 \t&pAd->ChannelList[0].Channel,\n\t\t                          1,                 \t&pAd->ChannelListNum,\n\t\t                          1,                 \t&MaxTxPower,\n\t\t                          END_OF_ARGS);\n\t\t    TmpLen2 += TmpLen;\n\n\t\t    /* need to do the padding bit check, and concatenate it */\n\t\t    if ((TmpLen2%2) == 0)\n\t\t    {\n\t\t       \tUCHAR\tTmpLen3 = TmpLen2+4;\n\t\t\t    MakeOutgoingFrame(pOutBuffer+FrameLen,  &TmpLen,\n\t\t\t                         1,                 \t&CountryIe,\n\t\t\t                          1,                 \t&TmpLen3,\n\t\t\t                          3,                 \tpAd->CommonCfg.CountryCode,\n\t\t\t                          TmpLen2+1,\t\t\t\tTmpFrame,\n\t\t\t                          END_OF_ARGS);\n\t\t    }\n\t\t    else\n\t\t    {\n\t\t       \tUCHAR\tTmpLen3 = TmpLen2+3;\n\t\t\t    MakeOutgoingFrame(pOutBuffer+FrameLen,  &TmpLen,\n\t\t\t                          1,                 \t&CountryIe,\n\t\t\t                          1,                 \t&TmpLen3,\n\t\t\t                          3,                 \tpAd->CommonCfg.CountryCode,\n\t\t\t                          TmpLen2,\t\t\t\tTmpFrame,\n\t\t\t                          END_OF_ARGS);\n\t\t    }\n\t\t    FrameLen += TmpLen;\n\t\t}/* Country IE - */\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(PhyMode) &&\n\t\t\t(pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable))\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR\tHtLen, AddHtLen;/*, NewExtLen; */\n#ifdef RT_BIG_ENDIAN\n\t\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\t\tADD_HT_INFO_IE\taddHTInfoTmp;\n#endif\n\t\t\tHtLen = sizeof(pAd->CommonCfg.HtCapability);\n\t\t\tAddHtLen = sizeof(pAd->CommonCfg.AddHTInfo);\n\n\t\tif (pAd->bBroadComHT == TRUE)\n\t\t{\n\t\t\tUCHAR epigram_ie_len;\n\t\t\tUCHAR BROADCOM_HTC[4] = {0x0, 0x90, 0x4c, 0x33};\n\t\t\tUCHAR BROADCOM_AHTINFO[4] = {0x0, 0x90, 0x4c, 0x34};\n\n\n\t\t\tepigram_ie_len = HtLen + 4;\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        &TmpLen,\n\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t\t  1,                                &epigram_ie_len,\n\t\t\t\t\t\t\t  4,                                &BROADCOM_HTC[0],\n\t\t\t\t\t\t\t  HtLen,          \t\t\t\t\t&pAd->CommonCfg.HtCapability,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);\n\t\t\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t{\n\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t}\n#else\t\t\t\t\n\t\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t\t1,                               &WpaIe,\n\t\t\t\t\t\t\t\t1,                               &epigram_ie_len,\n\t\t\t\t\t\t\t\t4,                               &BROADCOM_HTC[0],\n\t\t\t\t\t\t\t\tHtLen,                           &HtCapabilityTmp,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n#endif\n\n\t\t\t\tFrameLen += TmpLen;\n\n\t\t\t\tepigram_ie_len = AddHtLen + 4;\n#ifndef RT_BIG_ENDIAN\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,          &TmpLen,\n\t\t\t\t\t\t\t\t  1,                              &WpaIe,\n\t\t\t\t\t\t\t\t  1,                              &epigram_ie_len,\n\t\t\t\t\t\t\t\t  4,                              &BROADCOM_AHTINFO[0],\n\t\t\t\t\t\t\t\t  AddHtLen, \t\t\t\t\t  &pAd->CommonCfg.AddHTInfo,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\t\tNdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, AddHtLen);\n\t\t\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));\n\t\t\t\t*(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));\n\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,         &TmpLen,\n\t\t\t\t\t\t\t\t1,                               &WpaIe,\n\t\t\t\t\t\t\t\t1,                               &epigram_ie_len,\n\t\t\t\t\t\t\t\t4,                               &BROADCOM_AHTINFO[0],\n\t\t\t\t\t\t\t\tAddHtLen,                        &addHTInfoTmp,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n#endif\n\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n\n#ifdef DOT11_VHT_AC\n\t\t\tif (WMODE_CAP_AC(PhyMode) &&\n\t\t\t\t(pAd->CommonCfg.Channel > 14)) {\n\t\t\t\tFrameLen += build_vht_ies(pAd, (UCHAR *)(pOutBuffer+FrameLen), SUBTYPE_PROBE_RSP);\n\t\t\t}\n#endif /* DOT11_VHT_AC */\n\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef WSC_AP_SUPPORT\n\t\t/* for windows 7 logo test */\n\t\tif ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) &&\n#ifdef DOT1X_SUPPORT\n\t\t\t\t(pAd->ApCfg.MBSSID[apidx].IEEE8021X == FALSE) && \n#endif /* DOT1X_SUPPORT */\n\t\t\t\t(pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled))\n\t\t{\n\t\t\t/*\n\t\t\t\tNon-WPS Windows XP and Vista PCs are unable to determine if a WEP enalbed network is static key based \n\t\t\t\tor 802.1X based. If the legacy station gets an EAP-Rquest/Identity from the AP, it assume the WEP\n\t\t\t\tnetwork is 802.1X enabled & will prompt the user for 802.1X credentials. If the legacy station doesn't\n\t\t\t\treceive anything after sending an EAPOL-Start, it will assume the WEP network is static key based and\n\t\t\t\tprompt user for the WEP key. <<from \"WPS and Static Key WEP Networks\">>\n\t\t\t\tA WPS enabled AP should include this IE in the beacon when the AP is hosting a static WEP key network.  \n\t\t\t\tThe IE would be 7 bytes long with the Extended Capability field set to 0 (all bits zero)\n\t\t\t\thttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp \n\t\t\t*/\n\t\t\tULONG TempLen1 = 0;\n\t\t\tUCHAR PROVISION_SERVICE_IE[7] = {0xDD, 0x05, 0x00, 0x50, 0xF2, 0x05, 0x00};\n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,        &TempLen1,\n\t\t\t\t\t\t\t\t7,                            PROVISION_SERVICE_IE,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tFrameLen += TempLen1;\n\t    }\n\n        /* add Simple Config Information Element */\n        if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode > WSC_DISABLE) && (pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen))\n        {\n    \t\tULONG WscTmpLen = 0;\n    \t\tMakeOutgoingFrame(pOutBuffer+FrameLen,                                  &WscTmpLen,\n    \t\t\t\t\t\t  pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen,   pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.Value,\n                              END_OF_ARGS);\n    \t\tFrameLen += WscTmpLen;\n        }\n#endif /* WSC_AP_SUPPORT */\n\n\n\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n\t{\n\t\tULONG\tPeerip, P2PSubelementLen = 0, WpsLen = 0;\n\t\tUCHAR\t\t\t*P2pSubelement;\n\t\tUCHAR\t\t\t*WpsIE;\n\n#ifdef WFD_SUPPORT\n\t\tUCHAR DeviceType, SourceCoupled, SinkCoupled, SessionAvail, WSD, PreC, CP, TimeSync, CoupledSinkStatus;\n\t\tUCHAR BssidAddr[6];\n\t\tULONG\tWfdSubelementLen;\n\t\tUSHORT\t\tRtspPort, MaxThroughput;\n\t\tPUCHAR\tWfdSubelement = NULL;\n\t\tBOOLEAN \tWfdClient = FALSE;\n#endif /* WFD_SUPPORT */\n\n\t\tos_alloc_mem(NULL, (UCHAR **)&P2pSubelement, MAX_VIE_LEN);\n\t\tos_alloc_mem(NULL, (UCHAR **)&WpsIE, MAX_VIE_LEN);\n\n#ifdef WFD_SUPPORT\n\t\tos_alloc_mem(NULL, (UCHAR **)&WfdSubelement, MAX_VIE_LEN);\n#endif /* WFD_SUPPORT */\n\n\t\t/*PeerP2pProbeReqSanity(pAd, Elem->Msg,  Elem->MsgLen, Addr2, Ssid, &SsidLen, &Peerip, &P2PSubelementLen, P2pSubelement, &WpsLen, WpsIE);*/\n\t\t/* Ralink Proprietary feature for IP */\n/*\n\t\tP2pMakeProbeRspWSCIE(pAd, pOutBuffer + FrameLen, &TmpLen);\t\t\n\t\tFrameLen += TmpLen;\n*/\n\t\t/* APPeerProbeReqAction() is called when I am already GO. So doesn't use Is_P2P_on to check whether need to add P2P IE in response. */\n\t\t/*if (P2PSubelementLen > 0)*/\n\t\tif (PeerP2pProbeReqSanity(pAd, Elem->Msg,  Elem->MsgLen, Addr2, Ssid, &SsidLen, &Peerip, &P2PSubelementLen, P2pSubelement, \n#ifdef WFD_SUPPORT\n\t\t\t&WfdSubelementLen,\n\t\t\tWfdSubelement,\n#endif /* WFD_SUPPORT */\n\t\t\t&WpsLen, WpsIE))\n\t\t{\n\t\t\tULONG\tP2PIeLen;\n\t\t\tPUCHAR\tptr;\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tP2pMakeP2pIE(pAd, SUBTYPE_PROBE_RSP, ptr, &P2PIeLen);\n\t\t\tFrameLen += P2PIeLen;\n\t\t}\n\t\t\n#ifdef WFD_SUPPORT\n\t\t{\n\t\t\tPUCHAR\tptr;\n\t\t\tULONG\tWfdIeBitmap;\n\t\t\t\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO) | (0x1 << SUBID_WFD_ALTERNATE_MAC_ADDR);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &TmpLen);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\n\t\t\n\t\tif (P2pSubelement)\n\t\t\tos_free_mem(NULL, P2pSubelement);\n\t\tif (WpsIE)\n\t\t\tos_free_mem(NULL, WpsIE);\n#ifdef WFD_SUPPORT\n\t\tif (WfdSubelement)\n\t\t\tos_free_mem(NULL, WfdSubelement);\n#endif /* WFD_SUPPORT */\t\t\n\n\t}\n\n#endif /* P2P_SUPPORT */\n\n\t\t/* 802.11n 11.1.3.2.2 active scanning. sending probe response with MCS rate is */\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tparse the received BEACON\n\n\tNOTE:\n\t\tThe only thing AP cares about received BEACON frames is to decide\n\t\tif there's any overlapped legacy BSS condition (OLBC).\n\t\tIf OLBC happened, this AP should set the ERP->Use_Protection bit in its\n\t\toutgoing BEACON. The result is to tell all its clients to use RTS/CTS\n\t\tor CTS-to-self protection to protect B/G mixed traffic\n\t==========================================================================\n */\n\n\ntypedef struct\n{\n\tULONG\tcount;\n\tUCHAR\tbssid[MAC_ADDR_LEN];\n} BSSIDENTRY;\n\n\n\nVOID APPeerBeaconAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR Rates[MAX_LEN_OF_SUPPORTED_RATES], *pRates = NULL, RatesLen;\n\tBOOLEAN LegacyBssExist;\n\tCHAR RealRssi;\n\tUCHAR *VarIE = NULL;\n\tUSHORT LenVIE;\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\tUCHAR MaxSupportedRate = 0;\n\n\n\tBCN_IE_LIST *ie_list = NULL;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (ie_list == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate ie_list fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\tNdisZeroMemory(ie_list, sizeof(BCN_IE_LIST));\n\n\t/* Init Variable IE structure */\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate VarIE fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\n\n\n\tpRates = (PUCHAR)Rates;\n\n\tie_list->Channel = Elem->Channel;\n\tRealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\t\n\tif (PeerBeaconAndProbeRspSanity(pAd,\n\t\t\t\t\t\t\t\tElem->Msg,\n\t\t\t\t\t\t\t\tElem->MsgLen,\n\t\t\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t&LenVIE,\n\t\t\t\t\t\t\t\tpVIE))\n\t{\n\n\t\t/* ignore BEACON not in this channel */\n\t\tif (ie_list->Channel != pAd->CommonCfg.Channel\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\t&& (pAd->CommonCfg.bOverlapScanning == FALSE)\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\t&& (!P2P_CLI_ON(pAd))\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\tgoto __End_Of_APPeerBeaconAction;\n\t\t}\n\n#ifdef IDS_SUPPORT\n\t\t/* Conflict SSID detection */\n\t\tRTMPConflictSsidDetection(pAd, (PUCHAR)ie_list->Ssid, ie_list->SsidLen, (CHAR)Elem->Rssi0, (CHAR)Elem->Rssi1, (CHAR)Elem->Rssi2, Elem->AntSel);\n#endif /* IDS_SUPPORT */\n\t\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t/* 40Mhz BSS Width Trigger events Intolerant devices */\n\t\tif ((RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && (ie_list->HtCapability.HtCapInfo.Forty_Mhz_Intolerant)) /* || (HtCapabilityLen == 0))) */\n\t\t{\n\t\t\tHandle_BSS_Width_Trigger_Events(pAd);\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40)\n#ifdef DOT11N_DRAFT3\n\t\t\t&& (pAd->CommonCfg.bOverlapScanning == FALSE)\n#endif /* DOT11N_DRAFT3 */\n\t\t   )\n\t\t{\n\t\t\tif (pAd->CommonCfg.Channel<=14)\n\t\t\t{\n#ifdef P2P_SUPPORT\n\t\t\t\tif(OPSTATUS_TEST_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED) && P2P_CLI_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tif (ie_list->Channel != pAd->CommonCfg.Channel)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"Channel=%d is not equal as CommonCfg.Channel = %d.\\n\", ie_list->Channel, pAd->CommonCfg.Channel));\n//\t\t\t\t\t\tgoto __End_Of_APPeerBeaconAction;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\t\tif (((pAd->CommonCfg.CentralChannel+2) != ie_list->Channel) &&\n\t\t\t\t\t((pAd->CommonCfg.CentralChannel-2) != ie_list->Channel))\n\t\t\t\t{\n/*\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x:%02x:%02x:%02x:%02x:%02x is a legacy BSS (%d) \\n\",\n\t\t\t\t\t\t\t\tBssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5], Channel));\n*/\n\t\t\t\t\tgoto __End_Of_APPeerBeaconAction;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (ie_list->Channel != pAd->CommonCfg.Channel)\n\t\t\t\t\tgoto __End_Of_APPeerBeaconAction;\n\t\t\t}\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n                SupportRate(ie_list->SupRate, ie_list->SupRateLen, ie_list->ExtRate, ie_list->ExtRateLen, &pRates, &RatesLen, &MaxSupportedRate);\n\t\t\n                if ((ie_list->Erp & 0x01) || (RatesLen <= 4))\n\t\t\tLegacyBssExist = TRUE;\n\t\telse\n\t\t\tLegacyBssExist = FALSE;\n\n\t\tif (LegacyBssExist && pAd->CommonCfg.DisableOLBCDetect == 0)\n\t\t{\n\t\t\tpAd->ApCfg.LastOLBCDetectTime = pAd->Mlme.Now32;\n\t\t\t\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\tif ((pAd->CommonCfg.bHTProtect)\n\t\t\t&& (ie_list->HtCapabilityLen == 0) && (RealRssi > OBSS_BEACON_RSSI_THRESHOLD))\n\t\t{\n\t\t\t\n\t\t\tpAd->ApCfg.LastNoneHTOLBCDetectTime = pAd->Mlme.Now32;\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef APCLI_SUPPORT\n\t\tif (Elem->Wcid < MAX_LEN_OF_MAC_TABLE)\n\t\t{\n\t\t\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\t\t\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\t\t\t\n\t\t\tif (pEntry && IS_ENTRY_APCLI(pEntry) && (pEntry->MatchAPCLITabIdx < MAX_APCLI_NUM))\n\t\t\t\tpAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].ApCliRcvBeaconTime = pAd->Mlme.Now32;\n\t\t}\n\n#ifdef P2P_SUPPORT\n\t\tif (P2P_CLI_ON(pAd) &&\n\t\t\t(ApCliWaitProbRsp(pAd, 0) == TRUE) && \n\t\t\t(NdisEqualMemory(pAd->ApCfg.ApCliTab[0].CfgApCliBssid, ie_list->Bssid, MAC_ADDR_LEN)))\n\t\t{\n\t\t\tMlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_PEER_BEACON, Elem->MsgLen, Elem->Msg, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPeerP2pBeacon(pAd, ie_list->Addr2, Elem, ie_list->TimeStamp);\n\t\t\tif(ie_list->MessageToMe)\n\t\t\t{\n\t\t\t\tMiniportMMRequest(pAd, 0, (PUCHAR)&pAd->ApCfg.ApCliTab[0].PsPollFrame, sizeof(PSPOLL_FRAME));\n\t\t\t}\n\t\t}\n#endif /* P2P_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\tif (pAd->CommonCfg.bOverlapScanning == TRUE)\n\t\t{\n\t\t\tINT\t\tindex,secChIdx;\n\t\t\tBOOLEAN\t\tfound = FALSE;\n\t\t\tADD_HTINFO *pAdd_HtInfo;\n\t\t\t\n\t\t\tfor (index = 0; index < pAd->ChannelListNum; index++)\n\t\t\t{\n\t\t\t\t/* found the effected channel, mark that. */\n\t\t\t\tif(pAd->ChannelList[index].Channel == ie_list->Channel)\n\t\t\t\t{\n\t\t\t\t\tsecChIdx = -1;\n\t\t\t\t\tif (ie_list->HtCapabilityLen > 0 && ie_list->AddHtInfoLen > 0)\n\t\t\t\t\t{\t/* This is a 11n AP. */\n\t\t\t\t\t\tpAd->ChannelList[index].bEffectedChannel |= EFFECTED_CH_PRIMARY; /* 2; \t// 2 for 11N 20/40MHz AP with primary channel set as this channel. */\n\t\t\t\t\t\tpAdd_HtInfo = &ie_list->AddHtInfo.AddHtInfo;\n\t\t\t\t\t\tif (pAdd_HtInfo->ExtChanOffset == EXTCHA_BELOW)\n\t\t\t\t\t\t{\n#ifdef A_BAND_SUPPORT\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (ie_list->Channel > 14)\n\t\t\t\t\t\t\t\tsecChIdx = ((index > 0) ? (index - 1) : -1);\n\t\t\t\t\t\t\telse\n#endif /* A_BAND_SUPPORT */\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tsecChIdx = ((index >= 4) ? (index - 4) : -1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (pAdd_HtInfo->ExtChanOffset == EXTCHA_ABOVE)\n\t\t\t\t\t\t{\n#ifdef A_BAND_SUPPORT\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (ie_list->Channel > 14)\n\t\t\t\t\t\t\t\tsecChIdx = (((index+1) < pAd->ChannelListNum) ? (index + 1) : -1);\n\t\t\t\t\t\t\telse\n#endif /* A_BAND_SUPPORT */\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tsecChIdx = (((index+4) < pAd->ChannelListNum) ? (index + 4) : -1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (secChIdx >=0)\n\t\t\t\t\t\t\tpAd->ChannelList[secChIdx].bEffectedChannel |= EFFECTED_CH_SECONDARY; /* 1; */\n\n\t\t\t\t\t\tif ((pAd->CommonCfg.Channel != ie_list->Channel) || \n\t\t\t\t\t\t\t(pAdd_HtInfo->ExtChanOffset  != pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tpAd->CommonCfg.BssCoexApCnt++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* This is a legacy AP. */\n\t\t\t\t\t\tpAd->ChannelList[index].bEffectedChannel |=  EFFECTED_CH_LEGACY; /* 4; 1 for legacy AP. */\n\t\t\t\t\t\tpAd->CommonCfg.BssCoexApCnt++;\n\t\t\t\t\t}\n\n\t\t\t\t\tfound = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t}\n\t/* sanity check fail, ignore this frame */\n\n__End_Of_APPeerBeaconAction:\n/*#ifdef AUTO_CH_SELECT_ENHANCE */\n#ifdef CONFIG_AP_SUPPORT\nIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n{\n\tif (ie_list->Channel == pAd->ApCfg.AutoChannel_Channel)\n\t{\n\t\tif (AutoChBssSearchWithSSID(pAd, ie_list->Bssid, (PUCHAR)ie_list->Ssid, ie_list->SsidLen, ie_list->Channel) == BSS_NOT_FOUND)\n\t\t\tpAd->pChannelInfo->ApCnt[pAd->ApCfg.current_channel_index]++;\n\t\tAutoChBssInsertEntry(pAd, ie_list->Bssid, ie_list->Ssid, ie_list->SsidLen, ie_list->Channel, ie_list->NewExtChannelOffset, RealRssi);\n\t}\n}\n#endif /* CONFIG_AP_SUPPORT */\n/*#endif // AUTO_CH_SELECT_ENHANCE */\n\nLabelErr:\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\n\treturn;\n}\n\n#ifdef AP_SCAN_SUPPORT\n/*\n    ==========================================================================\n    Description:\n    ==========================================================================\n */\nVOID APInvalidStateWhenScan(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AYNC - InvalidStateWhenScan(state=%ld). Reset SYNC machine\\n\", pAd->Mlme.ApSyncMachine.CurrState));\n}\n\n/*\n    ==========================================================================\n    Description:\n        Scan timeout handler, executed in timer thread\n    ==========================================================================\n */\nVOID APScanTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AP SYNC - Scan Timeout \\n\"));\n\tMlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_SCAN_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n}\n\n/*\n    ==========================================================================\n    Description:\n        Scan timeout procedure. basically add channel index by 1 and rescan\n    ==========================================================================\n */\nVOID APScanTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tpAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel);\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (pAd->MlmeAux.ScanType == SCAN_WSC_ACTIVE  && (pAd->P2pCfg.bStartP2pConnect) && (pAd->Multi_Channel_Enable == TRUE))\n                {\n\t\t\tpAd->MlmeAux.Channel = 0;\n                }\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\t\t\n\t\t/*\n\t\t\tiwpriv set auto channel selection\n\t\t\tupdate the current index of the channel\n\t\t*/\n\t\tif (pAd->ApCfg.bAutoChannelAtBootup == TRUE)\n\t\t{\n\t\t\t/* update current channel info */\n\t\t\tUpdateChannelInfo(pAd, pAd->ApCfg.current_channel_index, pAd->ApCfg.AutoChannelAlg);\n\n\t\t\t/* move to next channel */\n\t\t\tpAd->ApCfg.current_channel_index++;\n\t\t\tif (pAd->ApCfg.current_channel_index < pAd->ChannelListNum)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.AutoChannel_Channel = pAd->ChannelList[pAd->ApCfg.current_channel_index].Channel;\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\tScanNextChannel(pAd, OPMODE_AP);\n}\n\n/*\n    ==========================================================================\n    Description:\n        MLME SCAN req state machine procedure\n    ==========================================================================\n */\nVOID APMlmeScanReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tBOOLEAN        Cancelled;\n\tUCHAR          Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType;\n\n\n\t/* Suspend MSDU transmission here */\n\tRTMPSuspendMsduTransmission(pAd);\n\n\t/* first check the parameter sanity */\n\tif (MlmeScanReqSanity(pAd, Elem->Msg, Elem->MsgLen, &BssType, (PCHAR)Ssid, &SsidLen, &ScanType))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AP SYNC - MlmeScanReqAction\\n\"));\n\t\tNdisGetSystemUpTime(&pAd->ApCfg.LastScanTime);\n\n\t\tRTMPCancelTimer(&pAd->MlmeAux.APScanTimer, &Cancelled);\n\n\t\t/* record desired BSS parameters */\n\t\tpAd->MlmeAux.BssType = BssType;\n\t\tpAd->MlmeAux.ScanType = ScanType;\n\t\tpAd->MlmeAux.SsidLen = SsidLen;\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen);\n\n\t\t/* start from the first channel */\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif ((pAd->MlmeAux.ScanType == SCAN_WSC_ACTIVE) && (pAd->P2pCfg.bStartP2pConnect) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tif (pP2PCtrl->GroupOpChannel != 0)\n\t\t\t\tpAd->MlmeAux.Channel = pP2PCtrl->GroupOpChannel;\n\t\t\telse\n\t\t\t\tpAd->MlmeAux.Channel = FirstChannel(pAd);\n\t\t}\n\t\telse\n\t\tpAd->MlmeAux.Channel = FirstChannel(pAd);\n\n\t\t/* Let BBP register at 20MHz to do scan */\n//\t\trtmp_bbp_set_bw(pAd, BW_20);\n//\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n\n#else\n\t\tpAd->MlmeAux.Channel = FirstChannel(pAd);\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\t/* Let BBP register at 20MHz to do scan */\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif (pAd->ApCfg.bAutoChannelAtBootup == TRUE)/* iwpriv set auto channel selection */\n\t\t\t{\n\t\t\t\tAPAutoChannelInit(pAd);\t\n\t\t\t\tpAd->ApCfg.AutoChannel_Channel = pAd->ChannelList[0].Channel;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\tScanNextChannel(pAd, OPMODE_AP);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AP SYNC - MlmeScanReqAction() sanity check fail. BUG!!!\\n\"));\n\t\tpAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        peer sends beacon back when scanning\n    ==========================================================================\n */\nVOID APPeerBeaconAtScanAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPFRAME_802_11 pFrame;\n\tUCHAR *VarIE = NULL;\n\tUSHORT LenVIE;\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\tCHAR RealRssi = -127;\n\n\tBCN_IE_LIST *ie_list = NULL;\n\n\n\tos_alloc_mem(pAd, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (!ie_list) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Alloc memory for ie_list fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisZeroMemory((UCHAR *)ie_list, sizeof(BCN_IE_LIST));\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\n\tpFrame = (PFRAME_802_11) Elem->Msg;\n\t/* Init Variable IE structure */\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\n\n\tif (PeerBeaconAndProbeRspSanity(pAd,\n\t\t\t\t\tElem->Msg, Elem->MsgLen, Elem->Channel,\n\t\t\t\t\tie_list, &LenVIE, pVIE));\n    {\n\t\tULONG Idx;\n\t\tCHAR  Rssi = -127;\n\n\t\tRealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n#ifdef P2P_SUPPORT\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_PEER_PROB_RSP, Elem->MsgLen, Elem->Msg, ie_list->Channel);\n#endif /* P2P_SUPPORT */\n\n\t\t\n\t\t/* ignore BEACON not in this channel */\n\t\tif (ie_list->Channel != pAd->MlmeAux.Channel\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\t&& (pAd->CommonCfg.bOverlapScanning == FALSE)\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\t   )\n\t\t{\n\t\t\tgoto __End_Of_APPeerBeaconAtScanAction;\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n   \t\tif ((RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && (ie_list->HtCapability.HtCapInfo.Forty_Mhz_Intolerant)) /* || (HtCapabilityLen == 0))) */\n\t\t{\n\t\t\tHandle_BSS_Width_Trigger_Events(pAd);\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef IDS_SUPPORT\n\t\t/* Conflict SSID detection */\n\t\tif (ie_list->Channel == pAd->CommonCfg.Channel)\n\t\t\tRTMPConflictSsidDetection(pAd, ie_list->Ssid, ie_list->SsidLen, Elem->Rssi0, Elem->Rssi1, Elem->Rssi2, Elem->AntSel);\n#endif /* IDS_SUPPORT */\n\n\t\t/*\n\t\t\tThis correct im-proper RSSI indication during SITE SURVEY issue.\n\t\t\tAlways report bigger RSSI during SCANNING when receiving multiple BEACONs from the same AP.\n\t\t\tThis case happens because BEACONs come from adjacent channels, so RSSI become weaker as we\n\t\t\tswitch to more far away channels.\n\t\t*/\n        Idx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel);\n\t\tif (Idx != BSS_NOT_FOUND)\n            Rssi = pAd->ScanTab.BssEntry[Idx].Rssi;\n\n\t\t\n\n        /* TODO: 2005-03-04 dirty patch. we should change all RSSI related variables to SIGNED SHORT for easy/efficient reading and calaulation */\n\t\tRealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20), \n\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n        if ((RealRssi + pAd->BbpRssiToDbmDelta) > Rssi)\n            Rssi = RealRssi + pAd->BbpRssiToDbmDelta;\n\n\t\tIdx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, Rssi, LenVIE, pVIE);\n\t\tif (Idx != BSS_NOT_FOUND)\n\t\t{\n\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4);\n\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\t\t}\n\t}\n\n\t/* sanity check fail, ignored */\n__End_Of_APPeerBeaconAtScanAction:\n\t/*scan beacon in pastive */\n#ifdef CONFIG_AP_SUPPORT\nIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n{\n\tif (ie_list->Channel == pAd->ApCfg.AutoChannel_Channel)\n\t{\n\t\tif (AutoChBssSearchWithSSID(pAd, ie_list->Bssid, (PUCHAR)ie_list->Ssid, ie_list->SsidLen, ie_list->Channel) == BSS_NOT_FOUND)\n\t\t\tpAd->pChannelInfo->ApCnt[pAd->ApCfg.current_channel_index]++;\n\n\t\tAutoChBssInsertEntry(pAd, ie_list->Bssid, (CHAR *)ie_list->Ssid, ie_list->SsidLen, ie_list->Channel, ie_list->NewExtChannelOffset, RealRssi);   \n\t}\n}\n#endif /* CONFIG_AP_SUPPORT */\n\nLabelErr:\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\n}\n\n/*\n    ==========================================================================\n    Description:\n        MLME Cancel the SCAN req state machine procedure\n    ==========================================================================\n */\nVOID APScanCnclAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tBOOLEAN Cancelled;\n\n\tRTMPCancelTimer(&pAd->MlmeAux.APScanTimer, &Cancelled);\n\tpAd->MlmeAux.Channel = 0;\n\tScanNextChannel(pAd, OPMODE_AP);\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        if ChannelSel is false, \n        \tAP scans channels and lists the information of channels.\n        if ChannelSel is true,\n        \tAP scans channels and selects an optimal channel. \n\n    NOTE:\n    ==========================================================================\n*/\nVOID ApSiteSurvey(\n\tIN\tPRTMP_ADAPTER  \t\tpAd,\n\tIN\tPNDIS_802_11_SSID\tpSsid,\n\tIN\tUCHAR\t\t\t\tScanType,\n\tIN\tBOOLEAN\t\t\t\tChannelSel)\n{\n    MLME_SCAN_REQ_STRUCT    ScanReq;\n\n    AsicDisableSync(pAd);\n\n    BssTableInit(&pAd->ScanTab);\n    pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;\n\n\tRTMPZeroMemory(ScanReq.Ssid, MAX_LEN_OF_SSID);\n\tScanReq.SsidLen = 0;\n\tif (pSsid)\n\t{\n\t    ScanReq.SsidLen = pSsid->SsidLength;\n\t    NdisMoveMemory(ScanReq.Ssid, pSsid->Ssid, pSsid->SsidLength);\n\t}\n    ScanReq.BssType = BSS_ANY;\n    ScanReq.ScanType = ScanType;\n    pAd->ApCfg.bAutoChannelAtBootup = ChannelSel;\n    \n    MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n    RTMP_MLME_HANDLER(pAd);\n}\n\nBOOLEAN ApScanRunning(\n\t\tIN PRTMP_ADAPTER pAd)\n{\n\treturn (pAd->Mlme.ApSyncMachine.CurrState == AP_SCAN_LISTEN) ? TRUE : FALSE;\n}\n#endif /* AP_SCAN_SUPPORT */\n\nVOID SupportRate(\n\tIN PUCHAR SupRate,\n\tIN UCHAR SupRateLen,\n\tIN PUCHAR ExtRate,\n\tIN UCHAR ExtRateLen,\n\tOUT PUCHAR *ppRates,\n\tOUT PUCHAR RatesLen,\n\tOUT PUCHAR pMaxSupportRate)\n{\n\tINT i;\n\n\t*pMaxSupportRate = 0;\n\n\tif ((SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES) && (SupRateLen > 0))\n\t{\n\t\tNdisMoveMemory(*ppRates, SupRate, SupRateLen);\n\t\t*RatesLen = SupRateLen;\n\t}\n\telse\n\t{\n\t\t/* HT rate not ready yet. return true temporarily. rt2860c */\n\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"PeerAssocReqSanity - wrong IE_SUPP_RATES\\n\")); */\n\t\t*RatesLen = 8;\n\t\t*(*ppRates + 0) = 0x82;\n\t\t*(*ppRates + 1) = 0x84;\n\t\t*(*ppRates + 2) = 0x8b;\n\t\t*(*ppRates + 3) = 0x96;\n\t\t*(*ppRates + 4) = 0x12;\n\t\t*(*ppRates + 5) = 0x24;\n\t\t*(*ppRates + 6) = 0x48;\n\t\t*(*ppRates + 7) = 0x6c;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SUPP_RATES., Len=%d\\n\", SupRateLen));\n\t}\n\n\tif (ExtRateLen + *RatesLen <= MAX_LEN_OF_SUPPORTED_RATES)\n\t{\n\t\tNdisMoveMemory((*ppRates + (ULONG)*RatesLen), ExtRate, ExtRateLen);\n\t\t*RatesLen = (*RatesLen) + ExtRateLen;\n\t}\n\telse\n\t{\n\t\tNdisMoveMemory((*ppRates + (ULONG)*RatesLen), ExtRate, MAX_LEN_OF_SUPPORTED_RATES - (*RatesLen));\n\t\t*RatesLen = MAX_LEN_OF_SUPPORTED_RATES;\n\t}\n\n\t\n\n\tfor (i = 0; i < *RatesLen; i++)\n\t{\n\t\tif(*pMaxSupportRate < (*(*ppRates + i) & 0x7f))\n\t\t\t*pMaxSupportRate = (*(*ppRates + i) & 0x7f);\n\t}\n\n\treturn;\n}\n\n#ifdef DOT11_N_SUPPORT\n/* Regulatory classes in the USA */\n\ntypedef struct\n{\n\tUCHAR\tregclass;\t\t/* regulatory class */\n\tUCHAR\tspacing;\t\t/* 0: 20Mhz, 1: 40Mhz */\n\tUCHAR\tchannelset[16];\t/* max 15 channels, use 0 as terminator */\n} REG_CLASS;\n\nREG_CLASS reg_class[] =\n{\n\t{  1, 0, {36, 40, 44, 48, 0}},\n\t{  2, 0, {52, 56, 60, 64, 0}},\n\t{  3, 0, {149, 153, 157, 161, 0}},\n\t{  4, 0, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}},\n\t{  5, 0, {165, 0}},\n\t{ 22, 1, {36, 44, 0}},\n\t{ 23, 1, {52, 60, 0}},\n\t{ 24, 1, {100, 108, 116, 124, 132, 0}},\n\t{ 25, 1, {149, 157, 0}},\n\t{ 26, 1, {149, 157, 0}},\n\t{ 27, 1, {40, 48, 0}},\n\t{ 28, 1, {56, 64, 0}},\n\t{ 29, 1, {104, 112, 120, 128, 136, 0}},\n\t{ 30, 1, {153, 161, 0}},\n\t{ 31, 1, {153, 161, 0}},\n\t{ 32, 1, {1, 2, 3, 4, 5, 6, 7, 0}},\n\t{ 33, 1, {5, 6, 7, 8, 9, 10, 11, 0}},\n\t{ 0,  0, {0}}\t\t\t/* end */\n};\n\nUCHAR get_regulatory_class(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint i=0;\n\tUCHAR regclass = 0;\n\n\tdo\n\t{\n\t\tif (reg_class[i].spacing == pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth)\n\t\t{\n\t\t\tint j=0;\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (reg_class[i].channelset[j] == pAd->CommonCfg.Channel)\n\t\t\t\t{\n\t\t\t\t\tregclass = reg_class[i].regclass;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tj++;\n\t\t\t} while (reg_class[i].channelset[j] != 0);\n\t\t}\n\t\ti++;\n\t} while (reg_class[i].regclass != 0);\n\n\tASSERT(regclass);\n\n\treturn regclass;\n}\n\n\nvoid build_ext_channel_switch_ie(\n\tIN PRTMP_ADAPTER pAd,\n\tIN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE)\n{\n\n\tpIE->ID = IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT;\n\tpIE->Length = 4;\n\tpIE->ChannelSwitchMode = 1;\t/*no further frames */\n\tpIE->NewRegClass = get_regulatory_class(pAd);\n\tpIE->NewChannelNum = pAd->CommonCfg.Channel;\n    pIE->ChannelSwitchCount = pAd->Dot11_H.CSCount;\n}\n#endif /* DOT11_N_SUPPORT */\n\n"
  },
  {
    "path": "src/ap/ap_wpa.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    wpa.c\n\n    Abstract:\n\n    Revision History:\n    Who         When            What\n    --------    ----------      ----------------------------------------------\n    Jan Lee     03-07-22        Initial\n    Rory Chen   04-11-29        Add WPA2PSK\n*/\n#include \"rt_config.h\"\n\nextern UCHAR\tEAPOL[];\n\n/*\n    ==========================================================================\n    Description:\n        Port Access Control Inquiry function. Return entry's Privacy and Wpastate.\n    Return:\n        pEntry \n    ==========================================================================\n*/\nMAC_TABLE_ENTRY *PACInquiry(\n    IN  PRTMP_ADAPTER               pAd, \n    IN  ULONG                       Wcid)\n{\n\n    MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY*)NULL;\n    \n/*    *Privacy = Ndis802_11PrivFilterAcceptAll; */\n/*    *WpaState = AS_NOTUSE; */\n\n\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tpEntry = &(pAd->MacTab.Content[Wcid]);\n\n\t\t/*if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[Wcid])) */\n\n\t\t/*ASSERT(IS_ENTRY_CLIENT(&pAd->MacTab.Content[Wcid])); */\n\t\t/*ASSERT(pEntry->Sst == SST_ASSOC); */\n\n/*\t    *Privacy = pEntry->PrivacyFilter; */\n/*        *WpaState = pEntry->WpaState; */\n\t}\t\t \n\n    return pEntry;\n}\n\n/*\n    ==========================================================================\n    Description:\n       Check sanity of multicast cipher selector in RSN IE.\n    Return:\n         TRUE if match\n         FALSE otherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPCheckMcast(\n    IN PRTMP_ADAPTER    pAd,\n    IN PEID_STRUCT      eid_ptr,\n    IN MAC_TABLE_ENTRY  *pEntry)\n{\n\tUCHAR apidx;\n\n\n\tASSERT(pEntry);\n\tASSERT(pEntry->apidx < pAd->ApCfg.BssidNum);\n\n\tapidx = pEntry->apidx;\n\n    pEntry->AuthMode = pAd->ApCfg.MBSSID[apidx].AuthMode;\n\n    if (eid_ptr->Len >= 6)\n    {\n        /* WPA and WPA2 format not the same in RSN_IE */\n        if (eid_ptr->Eid == IE_WPA)\n        {\n            if (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2)\n                pEntry->AuthMode = Ndis802_11AuthModeWPA;\n            else if (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n                pEntry->AuthMode = Ndis802_11AuthModeWPAPSK;\n\n            if (NdisEqualMemory(&eid_ptr->Octet[6], &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][6], 4))\n                return TRUE;\n        }\n        else if (eid_ptr->Eid == IE_WPA2)\n        {\n            UCHAR   IE_Idx = 0;\n\n            /* When WPA1/WPA2 mix mode, the RSN_IE is stored in different structure */\n            if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2) || \n                (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n                IE_Idx = 1;\n    \n            if (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2)\n                pEntry->AuthMode = Ndis802_11AuthModeWPA2;\n            else if (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n                pEntry->AuthMode = Ndis802_11AuthModeWPA2PSK;\n\n            if (NdisEqualMemory(&eid_ptr->Octet[2], &pAd->ApCfg.MBSSID[apidx].RSN_IE[IE_Idx][2], 4))\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\n/*\n    ==========================================================================\n    Description:\n       Check sanity of unicast cipher selector in RSN IE.\n    Return:\n         TRUE if match\n         FALSE otherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPCheckUcast(\n    IN PRTMP_ADAPTER    pAd,\n    IN PEID_STRUCT      eid_ptr,\n    IN MAC_TABLE_ENTRY\t*pEntry)\n{\n\tPUCHAR \tpStaTmp;\n\tUSHORT\tCount;\n\tUCHAR \tapidx;\n\n\tASSERT(pEntry);\n\tASSERT(pEntry->apidx < pAd->ApCfg.BssidNum);\n\n\tapidx = pEntry->apidx;\n\n\tpEntry->WepStatus = pAd->ApCfg.MBSSID[apidx].WepStatus;\n    \n\tif (eid_ptr->Len < 16)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]RTMPCheckUcast : the length is too short(%d) \\n\", eid_ptr->Len));\n\t    return FALSE;\n\t}\t\n\n\t/* Store STA RSN_IE capability */\n\tpStaTmp = (PUCHAR)&eid_ptr->Octet[0];\n\tif(eid_ptr->Eid == IE_WPA2)\n\t{\n\t\t/* skip Version(2),Multicast cipter(4) 2+4==6 */\n\t\t/* point to number of unicast */\n        pStaTmp +=6;\n\t}\n\telse if (eid_ptr->Eid == IE_WPA)\t\n\t{\n\t\t/* skip OUI(4),Vesrion(2),Multicast cipher(4) 4+2+4==10 */\n\t\t/* point to number of unicast */\n        pStaTmp += 10;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]RTMPCheckUcast : invalid IE=%d\\n\", eid_ptr->Eid));\n\t    return FALSE;\n\t}\n\n\t/* Store unicast cipher count */\n    NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT));\n    Count = cpu2le16(Count);\t\t\n\n\n\t/* pointer to unicast cipher */\n    pStaTmp += sizeof(USHORT);\t\n\t\t\t\n    if (eid_ptr->Len >= 16)\n    {\n    \tif (eid_ptr->Eid == IE_WPA)\n    \t{\n    \t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\n\t\t\t{/* multiple cipher (TKIP/CCMP) */\n\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t\t\t/* TKIP */\n\t\t\t\t\tif (MIX_CIPHER_WPA_TKIP_ON(pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Compare if peer STA uses the TKIP as its unicast cipher */\n\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][12], 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->WepStatus = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Our AP uses the AES as the secondary cipher */\n\t\t\t\t\t\t/* Compare if the peer STA use AES as its unicast cipher */\n\t\t\t\t\t\tif (MIX_CIPHER_WPA_AES_ON(pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][16], 4))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpEntry->WepStatus = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t/* AES */\n\t\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][12], 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->WepStatus = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tpStaTmp += 4;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n    \t\t}\n    \t\telse\n    \t\t{/* single cipher */\n    \t\t\twhile (Count > 0)\n    \t\t\t{\n    \t\t\t\tif (RTMPEqualMemory(pStaTmp , &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][12], 4))\n\t\t            \treturn TRUE;\n\n\t\t\t\t\tpStaTmp += 4;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n    \t\t}\n    \t}\n    \telse if (eid_ptr->Eid == IE_WPA2)\n    \t{\n    \t\tUCHAR\tIE_Idx = 0;\n\n\t\t\t/* When WPA1/WPA2 mix mode, the RSN_IE is stored in different structure */\n\t\t\tif ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2) || (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\t\t\tIE_Idx = 1;\n\t\n\t\t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\n\t\t\t{/* multiple cipher (TKIP/CCMP) */\n\n\t\t\t\twhile (Count > 0)\n    \t\t\t{\n    \t\t\t\t/* WPA2 TKIP */\n\t\t\t\t\tif (MIX_CIPHER_WPA2_TKIP_ON(pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Compare if peer STA uses the TKIP as its unicast cipher */\n\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[IE_Idx][8], 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->WepStatus = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Our AP uses the AES as the secondary cipher */\n\t\t\t\t\t\t/* Compare if the peer STA use AES as its unicast cipher */\n\t\t\t\t\t\tif (MIX_CIPHER_WPA2_AES_ON(pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[IE_Idx][12], 4))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpEntry->WepStatus = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t/* AES */\n\t\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[IE_Idx][8], 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->WepStatus = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t    \t\t\t\t\n\t\t\t\t\tpStaTmp += 4;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{/* single cipher */\n\t\t\t\twhile (Count > 0)\n    \t\t\t{\n\t\t\t\t\tif (RTMPEqualMemory(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[IE_Idx][8], 4))\n\t\t\t\t\t\treturn TRUE;\n\n\t\t\t\t\tpStaTmp += 4;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\t\t\t}\n    \t}\n    }\n\n    return FALSE;\n}\n\n\n/*\n    ==========================================================================\n    Description:\n       Check invalidity of authentication method selection in RSN IE.\n    Return:\n         TRUE if match\n         FALSE otherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPCheckAKM(PUCHAR sta_akm, PUCHAR ap_rsn_ie, INT iswpa2)\n{\n\tPUCHAR pTmp;\n\tUSHORT Count;\n\n\tpTmp = ap_rsn_ie;\n\n\tif(iswpa2)\n    /* skip Version(2),Multicast cipter(4) 2+4==6 */\n        pTmp +=6;\n    else\t\n    /*skip OUI(4),Vesrion(2),Multicast cipher(4) 4+2+4==10 */\n        pTmp += 10;/*point to number of unicast */\n\t    \n    NdisMoveMemory(&Count, pTmp, sizeof(USHORT));\t\n    Count = cpu2le16(Count);\t\t\n\n    pTmp   += sizeof(USHORT);/*pointer to unicast cipher */\n\n    /* Skip all unicast cipher suite */\n    while (Count > 0)\n    \t{\n\t\t/* Skip OUI */\n\t\tpTmp += 4;\n\t\tCount--;\n\t}\n\n\tNdisMoveMemory(&Count, pTmp, sizeof(USHORT));\n    Count = cpu2le16(Count);\t\t\n\n    pTmp   += sizeof(USHORT);/*pointer to AKM cipher */\n    while (Count > 0)\n    {\n\t\t/*rtmp_hexdump(RT_DEBUG_TRACE,\"MBSS WPA_IE AKM \",pTmp,4); */\n\t\tif(RTMPEqualMemory(sta_akm,pTmp,4))\n\t\t   return TRUE;\n    \telse\n\t\t{\n\t\t\tpTmp += 4;\n\t\t\tCount--;\n\t\t}\n    }\n    return FALSE;/* do not match the AKM */\n\n}\n\n\n/*\n    ==========================================================================\n    Description:\n       Check sanity of authentication method selector in RSN IE.\n    Return:\n         TRUE if match\n         FALSE otherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPCheckAUTH(\n    IN PRTMP_ADAPTER    pAd,\n    IN PEID_STRUCT      eid_ptr,\n    IN MAC_TABLE_ENTRY\t*pEntry)\n{\n\tPUCHAR pStaTmp;\n\tUSHORT Count;\t\n\tUCHAR \tapidx;\n\n\tASSERT(pEntry);\n\tASSERT(pEntry->apidx < pAd->ApCfg.BssidNum);\n\n\tapidx = pEntry->apidx;\n\n\tif (eid_ptr->Len < 16)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPCheckAUTH ==> WPAIE len is too short(%d) \\n\", eid_ptr->Len));\n\t    return FALSE;\n\t}\t\n\n\t/* Store STA RSN_IE capability */\n\tpStaTmp = (PUCHAR)&eid_ptr->Octet[0];\n\tif(eid_ptr->Eid == IE_WPA2)\n\t{\n\t\t/* skip Version(2),Multicast cipter(4) 2+4==6 */\n\t\t/* point to number of unicast */\n        pStaTmp +=6;\n\t}\n\telse if (eid_ptr->Eid == IE_WPA)\t\n\t{\n\t\t/* skip OUI(4),Vesrion(2),Multicast cipher(4) 4+2+4==10 */\n\t\t/* point to number of unicast */\n        pStaTmp += 10;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPCheckAUTH ==> Unknown WPAIE, WPAIE=%d\\n\", eid_ptr->Eid));\n\t    return FALSE;\n\t}\n\n\t/* Store unicast cipher count */\n    NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT));\n    Count = cpu2le16(Count);\t\t\n\n\t/* pointer to unicast cipher */\n    pStaTmp += sizeof(USHORT);\t\n\n    /* Skip all unicast cipher suite */\n    while (Count > 0)\n    {\n\t\t/* Skip OUI */\n\t\tpStaTmp += 4;\n\t\tCount--;\n\t}\n\n\t/* Store AKM count */\n\tNdisMoveMemory(&Count, pStaTmp, sizeof(USHORT));\n    Count = cpu2le16(Count);\t\t\n\n\t/*pointer to AKM cipher */\n    pStaTmp += sizeof(USHORT);\t\t\t\n\n    if (eid_ptr->Len >= 16)\n    {\n    \tif (eid_ptr->Eid == IE_WPA)\n    \t{\n\t\t\twhile (Count > 0)\n\t\t\t{\n\t\t\t\tif (RTMPCheckAKM(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][0],0))\n\t\t\t\t\treturn TRUE;\n\t\n\t\t\t\tpStaTmp += 4;\n\t\t\t\tCount--;\n\t\t\t}\n    \t}\n    \telse if (eid_ptr->Eid == IE_WPA2)\n    \t{\n    \t\tUCHAR\tIE_Idx = 0;\n\n\t\t\t/* When WPA1/WPA2 mix mode, the RSN_IE is stored in different structure */\n\t\t\tif ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2) || \n\t\t\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\t\t\tIE_Idx = 1;\n\n\t\t\twhile (Count > 0)\n\t\t\t{\t\t\t\n\t\t\t\tif (RTMPCheckAKM(pStaTmp, &pAd->ApCfg.MBSSID[apidx].RSN_IE[IE_Idx][0],1))\n\t\t\t\t\treturn TRUE;\n\t\t\t\n\t\t\t\tpStaTmp += 4;\n\t\t\t\tCount--;\n\t\t\t}\n    \t}\n    }\n\n    return FALSE;\n}\n\n/*\n    ==========================================================================\n    Description:\n       Check validity of the received RSNIE.\n\n    Return:\n\t\tstatus code\n    ==========================================================================\n*/\nUINT\tAPValidateRSNIE(\n\tIN PRTMP_ADAPTER    pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN PUCHAR\t\t\tpRsnIe,\n\tIN UCHAR\t\t\trsnie_len)\n{\n\tUINT StatusCode = MLME_SUCCESS;\n\tPEID_STRUCT  eid_ptr;\n\tINT\tapidx;\n\tPMULTISSID_STRUCT pMbss;\n\n\tif (rsnie_len == 0)\n\t\treturn MLME_SUCCESS;\n\n\teid_ptr = (PEID_STRUCT)pRsnIe;\n\tif ((eid_ptr->Len + 2) != rsnie_len)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]APValidateRSNIE : the len is invalid !!!\\n\"));\n\t\treturn MLME_UNSPECIFY_FAIL;\n\t}\n\n\tapidx = pEntry->apidx;\n\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n#ifdef WAPI_SUPPORT\n\tif (eid_ptr->Eid == IE_WAPI)\t\n\t\treturn MLME_SUCCESS;\n#endif /* WAPI_SUPPORT */\n\n\t/* check group cipher */\n\tif (!RTMPCheckMcast(pAd, eid_ptr, pEntry))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]APValidateRSNIE : invalid group cipher !!!\\n\"));\t    \n\t    StatusCode = MLME_INVALID_GROUP_CIPHER;\n\t}  \n\t/* Check pairwise cipher */\n\telse if (!RTMPCheckUcast(pAd, eid_ptr, pEntry))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]APValidateRSNIE : invalid pairwise cipher !!!\\n\"));\t    \n\t    StatusCode = MLME_INVALID_PAIRWISE_CIPHER;\n\t}        \n\t/* Check AKM */\n\telse if (!RTMPCheckAUTH(pAd, eid_ptr, pEntry))\n\t{\n\t    DBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]APValidateRSNIE : invalid AKM !!!\\n\"));\n\t    StatusCode = MLME_INVALID_AKMP;\n\t}                        \n\n\tif (StatusCode != MLME_SUCCESS)\n\t{\n\t\t/* send wireless event - for RSN IE sanity check fail */\n\t\tRTMPSendWirelessEvent(pAd, IW_RSNIE_SANITY_FAIL_EVENT_FLAG, pEntry->Addr, 0, 0);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : invalid status code(%d) !!!\\n\", __FUNCTION__, StatusCode));\n\t}\n\telse\n\t{\n        UCHAR CipherAlg = CIPHER_NONE;\n\t\t\n        if (pEntry->WepStatus == Ndis802_11Encryption1Enabled)\n            CipherAlg = CIPHER_WEP64;\n        else if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n            CipherAlg = CIPHER_TKIP;\n        else if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n            CipherAlg = CIPHER_AES;\n        DBGPRINT(RT_DEBUG_TRACE, (\"%s : (AID#%d WepStatus=%s)\\n\", __FUNCTION__, pEntry->Aid, CipherName[CipherAlg]));\n\t}\n\n\t\n\t\n\treturn StatusCode;\n\n}\n\n/*\n    ==========================================================================\n    Description:\n        Function to handle countermeasures active attack.  Init 60-sec timer if necessary.\n    Return:\n    ==========================================================================\n*/\nVOID HandleCounterMeasure(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry) \n{\n    INT         i;\n    BOOLEAN     Cancelled;\n\n    if (!pEntry)\n        return;\n\n\t/* Todo by AlbertY - Not support currently in ApClient-link */\n\tif (IS_ENTRY_APCLI(pEntry))\n\t\treturn;\n\n\t/* if entry not set key done, ignore this RX MIC ERROR */\n\tif ((pEntry->WpaState < AS_PTKINITDONE) || (pEntry->GTKState != REKEY_ESTABLISHED))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"HandleCounterMeasure ===> \\n\"));\n\n    /* record which entry causes this MIC error, if this entry sends disauth/disassoc, AP doesn't need to log the CM */\n    pEntry->CMTimerRunning = TRUE;\n    pAd->ApCfg.MICFailureCounter++;\n    \n\t/* send wireless event - for MIC error */\n\tRTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pEntry->Addr, 0, 0); \n\t\n    if (pAd->ApCfg.CMTimerRunning == TRUE)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"Receive CM Attack Twice within 60 seconds ====>>> \\n\"));\n        \n\t\t/* send wireless event - for counter measures */\n\t\tRTMPSendWirelessEvent(pAd, IW_COUNTER_MEASURES_EVENT_FLAG, pEntry->Addr, 0, 0); \n\t\tApLogEvent(pAd, pEntry->Addr, EVENT_COUNTER_M);\n\t\t\n        /* renew GTK */\n\t\tGenRandom(pAd, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, pAd->ApCfg.MBSSID[pEntry->apidx].GNonce);\n\n\t\t/* Cancel CounterMeasure Timer */\n\t\tRTMPCancelTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled);\n\t\tpAd->ApCfg.CMTimerRunning = FALSE;\n\n        for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n        {\n            /* happened twice within 60 sec,  AP SENDS disaccociate all associated STAs.  All STA's transition to State 2 */\n            if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))\n            {\n                MlmeDeAuthAction(pAd, &pAd->MacTab.Content[i], REASON_MIC_FAILURE, FALSE);\n            }\n        }\n        \n        /* Further,  ban all Class 3 DATA transportation for  a period 0f 60 sec */\n        /* disallow new association , too */\n        pAd->ApCfg.BANClass3Data = TRUE;        \n\n        /* check how many entry left...  should be zero */\n        /*pAd->ApCfg.MBSSID[pEntry->apidx].GKeyDoneStations = pAd->MacTab.Size; */\n        /*DBGPRINT(RT_DEBUG_TRACE, (\"GKeyDoneStations=%d \\n\", pAd->ApCfg.MBSSID[pEntry->apidx].GKeyDoneStations)); */\n    }\n\n\tRTMPSetTimer(&pAd->ApCfg.CounterMeasureTimer, 60 * MLME_TASK_EXEC_INTV * MLME_TASK_EXEC_MULTIPLE);\n    pAd->ApCfg.CMTimerRunning = TRUE;\n    pAd->ApCfg.PrevaMICFailTime = pAd->ApCfg.aMICFailTime;\n\tRTMP_GetCurrentSystemTime(&pAd->ApCfg.aMICFailTime);\n}\n\n/*\n    ==========================================================================\n    Description:\n        countermeasures active attack timer execution\n    Return:\n    ==========================================================================\n*/\nVOID CMTimerExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    UINT            i,j=0;\n    PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER)FunctionContext;\n        \n    pAd->ApCfg.BANClass3Data = FALSE;\n    for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n    {\n        if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i])\n\t\t\t&& (pAd->MacTab.Content[i].CMTimerRunning == TRUE))\n        {\n            pAd->MacTab.Content[i].CMTimerRunning =FALSE;\n            j++;\n        }\n    }\n    if (j > 1)\n        DBGPRINT(RT_DEBUG_ERROR, (\"Find more than one entry which generated MIC Fail ..  \\n\"));\n\n    pAd->ApCfg.CMTimerRunning = FALSE;\n}\n   \nVOID WPARetryExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    MAC_TABLE_ENTRY     *pEntry = (MAC_TABLE_ENTRY *)FunctionContext;\n\n    if ((pEntry) && IS_ENTRY_CLIENT(pEntry))\n    {\n        PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd;\n        \n        pEntry->ReTryCounter++;\n        DBGPRINT(RT_DEBUG_TRACE, (\"WPARetryExec---> ReTryCounter=%d, WpaState=%d \\n\", pEntry->ReTryCounter, pEntry->WpaState));\n\n        switch (pEntry->AuthMode)\n        {\n\t\t\tcase Ndis802_11AuthModeWPA:\n            case Ndis802_11AuthModeWPAPSK:\n\t\t\tcase Ndis802_11AuthModeWPA2:\n            case Ndis802_11AuthModeWPA2PSK:\n\t\t\t\t/* 1. GTK already retried, give up and disconnect client. */\n                if (pEntry->ReTryCounter > (GROUP_MSG1_RETRY_TIMER_CTR + 1))\n                {    \n                \t/* send wireless event - for group key handshaking timeout */\n\t\t\t\t\tRTMPSendWirelessEvent(pAd, IW_GROUP_HS_TIMEOUT_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\t\t\t\t\t\n                    DBGPRINT(RT_DEBUG_TRACE, (\"WPARetryExec::Group Key HS exceed retry count, Disassociate client, pEntry->ReTryCounter %d\\n\", pEntry->ReTryCounter));\n                    MlmeDeAuthAction(pAd, pEntry, REASON_GROUP_KEY_HS_TIMEOUT, FALSE);\n                }\n\t\t\t\t/* 2. Retry GTK. */\n                else if (pEntry->ReTryCounter > GROUP_MSG1_RETRY_TIMER_CTR)\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"WPARetryExec::ReTry 2-way group-key Handshake \\n\"));\n                    if (pEntry->GTKState == REKEY_NEGOTIATING)\n                    {\n                        WPAStart2WayGroupHS(pAd, pEntry);\n\t\t\tRTMPSetTimer(&pEntry->RetryTimer, PEER_MSG3_RETRY_EXEC_INTV);\n                    }\n                }\n\t\t\t\t/* 3. 4-way message 1 retried more than three times. Disconnect client */\n                else if (pEntry->ReTryCounter > (PEER_MSG1_RETRY_TIMER_CTR + 3))\n                {\n\t\t\t\t\t/* send wireless event - for pairwise key handshaking timeout */\n\t\t\t\t\tRTMPSendWirelessEvent(pAd, IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);\n\n                    DBGPRINT(RT_DEBUG_TRACE, (\"WPARetryExec::MSG1 timeout, pEntry->ReTryCounter = %d\\n\", pEntry->ReTryCounter));\n                    MlmeDeAuthAction(pAd, pEntry, REASON_4_WAY_TIMEOUT, FALSE);\n                }\n\t\t\t\t/* 4. Retry 4 way message 1, the last try, the timeout is 3 sec for EAPOL-Start */\n                else if (pEntry->ReTryCounter == (PEER_MSG1_RETRY_TIMER_CTR + 3))                \n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"WPARetryExec::Retry MSG1, the last try\\n\"));\n                    WPAStart4WayHS(pAd , pEntry, PEER_MSG3_RETRY_EXEC_INTV);\n                }\n\t\t\t\t/* 4. Retry 4 way message 1 */\n                else if (pEntry->ReTryCounter < (PEER_MSG1_RETRY_TIMER_CTR + 3))\n                {\n                    if ((pEntry->WpaState == AS_PTKSTART) || (pEntry->WpaState == AS_INITPSK) || (pEntry->WpaState == AS_INITPMK))\n                    {\n                        DBGPRINT(RT_DEBUG_TRACE, (\"WPARetryExec::ReTry MSG1 of 4-way Handshake\\n\"));\n                        WPAStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV);\n                    }\n                }\n                break;\n\n            default:\n                break;\n        }\n    }\n#ifdef APCLI_SUPPORT\t\n\telse if ((pEntry) && IS_ENTRY_APCLI(pEntry))\n\t{\n\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK)\n\t\t{\t\t\t\t\t\t\n\t\t\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd;\n\n\t\t\tif (pEntry->MatchAPCLITabIdx < MAX_APCLI_NUM)\n\t\t\t{\t\t\n\t\t\t\tUCHAR ifIndex = pEntry->MatchAPCLITabIdx;\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCli interface[%d] startdown.\\n\", __FUNCTION__, ifIndex));\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex);\n\t\t\t}\n\t\t}\n\t}\n#endif /* APCLI_SUPPORT */\t\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Timer execution function for periodically updating group key.\n    Return:\n    ==========================================================================\n*/  \nVOID GREKEYPeriodicExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    UINT            i, apidx;\n    ULONG           temp_counter = 0;\n    PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER)FunctionContext;\n\tPRALINK_TIMER_STRUCT \tpTimer = (PRALINK_TIMER_STRUCT) SystemSpecific3;\n\tPMULTISSID_STRUCT\tpMbss = NULL;\n\n    \n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n    {\n\t\tif (&pAd->ApCfg.MBSSID[apidx].REKEYTimer == pTimer)\n\t\t\tbreak;\n    }\n    \n\tif (apidx == pAd->ApCfg.BssidNum)\n\t\treturn;\n\telse\n\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\n\tif (pMbss->AuthMode < Ndis802_11AuthModeWPA || \n\t\tpMbss->AuthMode > Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\treturn;\n\t\n    if ((pMbss->WPAREKEY.ReKeyMethod == TIME_REKEY) && (pMbss->REKEYCOUNTER < 0xffffffff))\n        temp_counter = (++pMbss->REKEYCOUNTER);\n    /* REKEYCOUNTER is incremented every MCAST packets transmitted, */\n    /* But the unit of Rekeyinterval is 1K packets */\n    else if (pMbss->WPAREKEY.ReKeyMethod == PKT_REKEY)\n        temp_counter = pMbss->REKEYCOUNTER/1000;\n    else\n    {\n\t\treturn;\n    }\n    \n\tif (temp_counter > (pMbss->WPAREKEY.ReKeyInterval))\n    {\n        pMbss->REKEYCOUNTER = 0;\n\t\tpMbss->RekeyCountDown = 3;\n        DBGPRINT(RT_DEBUG_TRACE, (\"Rekey Interval Excess, GKeyDoneStations=%d\\n\", pMbss->StaCount));\n        \n        /* take turn updating different groupkey index, */\n\t\tif ((pMbss->StaCount) > 0)\n        {\n\t\t\t/* change key index */\n\t\t\tpMbss->DefaultKeyId = (pMbss->DefaultKeyId == 1) ? 2 : 1;         \n\t\n\t\t\t/* Generate GNonce randomly */\n\t\t\tGenRandom(pAd, pMbss->Bssid, pMbss->GNonce);\n\n\t\t\t/* Update GTK */\n\t\t\tWpaDeriveGTK(pMbss->GMK, \n\t\t\t\t\t\t(UCHAR*)pMbss->GNonce, \n\t\t\t\t\t\tpMbss->Bssid, pMbss->GTK, LEN_TKIP_GTK);\n\t\t\t\t\n\t\t\t/* Process 2-way handshaking */\n            for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n            {\n\t\t\t\tMAC_TABLE_ENTRY  *pEntry;\n\n\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\tif (IS_ENTRY_CLIENT(pEntry) && \n\t\t\t\t\t(pEntry->WpaState == AS_PTKINITDONE) &&\n\t\t\t\t\t\t(pEntry->apidx == apidx))\n                {\n\t\t\t\t\tpEntry->GTKState = REKEY_NEGOTIATING;\n\t\t\t\t\t\t\n                \tWPAStart2WayGroupHS(pAd, pEntry);\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Rekey interval excess, Update Group Key for  %x %x %x  %x %x %x , DefaultKeyId= %x \\n\",\\\n\t\t\t\t\t\t\t\t\t\t\t\tpEntry->Addr[0],pEntry->Addr[1],\\\n\t\t\t\t\t\t\t\t\t\t\t\tpEntry->Addr[2],pEntry->Addr[3],\\\n\t\t\t\t\t\t\t\t\t\t\t\tpEntry->Addr[4],pEntry->Addr[5],\\\n\t\t\t\t\t\t\t\t\t\t\t  \tpMbss->DefaultKeyId));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}       \n\n\t/* Use countdown to ensure the 2-way handshaking had completed */\n\tif (pMbss->RekeyCountDown > 0)\n\t{\n\t\tpMbss->RekeyCountDown--;\n\t\tif (pMbss->RekeyCountDown == 0)\n\t\t{\n\t\t\tUSHORT\tWcid;\n\n\t\t\t/* Get a specific WCID to record this MBSS key attribute */\n\t\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\n\t\t\t/* Install shared key table */\n\t\t\tWPAInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\tpMbss->GroupKeyWepStatus, \n\t\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\t\tpMbss->DefaultKeyId, \n\t\t\t\t\t\t\t\tWcid, \n\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\tpMbss->GTK,\n\t\t\t\t\t\t\t\tLEN_TKIP_GTK);\n\t\t}\n\t}       \n    \n}\n\n\n#ifdef DOT1X_SUPPORT\n/*\n    ========================================================================\n\n    Routine Description:\n        Sending EAP Req. frame to station in authenticating state.\n        These frames come from Authenticator deamon.\n\n    Arguments:\n        pAdapter        Pointer to our adapter\n        pPacket     Pointer to outgoing EAP frame body + 8023 Header\n        Len             length of pPacket\n        \n    Return Value:\n        None\n    ========================================================================\n*/\nVOID WpaSend(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  PUCHAR          pPacket,\n    IN  ULONG           Len)\n{\n    PEAP_HDR        \tpEapHdr;\n    UCHAR         \t\tAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\tHeader802_3[LENGTH_802_3];\n    MAC_TABLE_ENTRY \t*pEntry;\n\tPUCHAR\t\t\t\tpData;\n    \n    \n    NdisMoveMemory(Addr, pPacket, 6);\n\tNdisMoveMemory(Header802_3, pPacket, LENGTH_802_3);\n    pEapHdr = (EAP_HDR*)(pPacket + LENGTH_802_3);\n\tpData = (pPacket + LENGTH_802_3);\n\t\n    if ((pEntry = MacTableLookup(pAdapter, Addr)) == NULL)\n    {\t\n\t\t\n\t\treturn;\n    }\n\n\t/* Send EAP frame to STA */\n    if (((pEntry->AuthMode >= Ndis802_11AuthModeWPA) && (pEapHdr->ProType != EAPOLKey)) ||\n        (pAdapter->ApCfg.MBSSID[pEntry->apidx].IEEE8021X == TRUE))\n\t\tRTMPToWirelessSta(pAdapter, \n\t\t\t\t\t\t  pEntry, \n\t\t\t\t\t\t  Header802_3, \n\t\t\t\t\t\t  LENGTH_802_3, \n\t\t\t\t\t\t  pData, \n\t\t\t\t\t\t  Len - LENGTH_802_3, \n\t\t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\t\t\n\t\n\t\n    if (RTMPEqualMemory((pPacket+12), EAPOL, 2))\n    {\n        switch (pEapHdr->code)\n        {\n\t\t\tcase EAP_CODE_REQUEST:\n\t\t\t\tif ((pEntry->WpaState >= AS_PTKINITDONE) && (pEapHdr->ProType == EAPPacket))\n\t\t\t\t{\n\t\t\t\t\tpEntry->WpaState = AS_AUTHENTICATION;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Start to re-authentication by 802.1x daemon\\n\"));\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t/* After receiving EAP_SUCCESS, trigger state machine */\t\n            case EAP_CODE_SUCCESS:\n                if ((pEntry->AuthMode >= Ndis802_11AuthModeWPA) && (pEapHdr->ProType != EAPOLKey))\n                {\n                    DBGPRINT(RT_DEBUG_TRACE,(\"Send EAP_CODE_SUCCESS\\n\\n\"));\n                    if (pEntry->Sst == SST_ASSOC)\n                    {\n                        pEntry->WpaState = AS_INITPMK;\n\t\t\t\t\t\t/* Only set the expire and counters */\n\t                    pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;\n\t                    WPAStart4WayHS(pAdapter, pEntry, PEER_MSG1_RETRY_EXEC_INTV);\n                    }\n                }\n                else\n                {\n                    pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n                    pEntry->WpaState = AS_PTKINITDONE;\n                    pAdapter->ApCfg.MBSSID[pEntry->apidx].PortSecured = WPA_802_1X_PORT_SECURED;\n                    pEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n#ifdef WSC_AP_SUPPORT\n                    if (pAdapter->ApCfg.MBSSID[pEntry->apidx].WscControl.WscConfMode != WSC_DISABLE)\n                        WscInformFromWPA(pEntry);\n#endif /* WSC_AP_SUPPORT */\n                    DBGPRINT(RT_DEBUG_TRACE,(\"IEEE8021X-WEP : Send EAP_CODE_SUCCESS\\n\\n\"));\n                }\n                break;\n\n            case EAP_CODE_FAILURE:\n                break;\n\n            default:\n                break;    \n        }\n    }\n    else     \n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"Send Deauth, Reason : REASON_NO_LONGER_VALID\\n\"));\n        MlmeDeAuthAction(pAdapter, pEntry, REASON_NO_LONGER_VALID, FALSE);\n    }\n}    \n\nVOID RTMPAddPMKIDCache(\n\tIN  PRTMP_ADAPTER   \t\tpAd,\n\tIN\tINT\t\t\t\t\t\tapidx,\n\tIN\tPUCHAR\t\t\t\tpAddr,\n\tIN\tUCHAR\t\t\t\t\t*PMKID,\n\tIN\tUCHAR\t\t\t\t\t*PMK)\n{\n\tINT\ti, CacheIdx;\n\n\t/* Update PMKID status */\n\tif ((CacheIdx = RTMPSearchPMKIDCache(pAd, apidx, pAddr)) != -1)\n\t{\n\t\tNdisGetSystemUpTime(&(pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[CacheIdx].RefreshTime));\n\t\tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[CacheIdx].PMKID, PMKID, LEN_PMKID);\n\t\tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[CacheIdx].PMK, PMK, PMK_LEN);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddPMKIDCache update %02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\\n\", \n           \tpAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], CacheIdx, apidx));\n\t\t\n\t\treturn;\n\t}\n\n\t/* Add a new PMKID */\n\tfor (i = 0; i < MAX_PMKID_COUNT; i++)\n\t{\n\t\tif (!pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid = TRUE;\n\t\t\tNdisGetSystemUpTime(&(pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].RefreshTime));\n\t\t\tCOPY_MAC_ADDR(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].MAC, pAddr);\n\t\t\tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].PMKID, PMKID, LEN_PMKID);\n\t\t\tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].PMK, PMK, PMK_LEN);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddPMKIDCache add %02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\\n\", \n            \tpAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], i, apidx));\n\t\t\tbreak;\n\t\t}\n\t}\n \n\tif (i == MAX_PMKID_COUNT)\n\t{\n\t\tULONG\ttimestamp = 0, idx = 0;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddPMKIDCache(IF(%d) Cache full\\n\", apidx));\n\t\tfor (i = 0; i < MAX_PMKID_COUNT; i++)\n\t\t{\n\t\t\tif (pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid)\n\t\t\t{\n\t\t\t\tif (((timestamp == 0) && (idx == 0)) || ((timestamp != 0) && timestamp < pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].RefreshTime))\n\t\t\t\t{\n\t\t\t\t\ttimestamp = pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].RefreshTime;\n\t\t\t\t\tidx = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].Valid = TRUE;\n\t\tNdisGetSystemUpTime(&(pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].RefreshTime));\n\t\tCOPY_MAC_ADDR(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].MAC, pAddr);\n\t\tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].PMKID, PMKID, LEN_PMKID);\n\t\tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx].PMK, PMK, PMK_LEN);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddPMKIDCache add %02x:%02x:%02x:%02x:%02x:%02x cache(%ld) from IF(ra%d)\\n\", \n           \tpAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], idx, apidx));\n\t}\n}\n\nINT RTMPSearchPMKIDCache(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tINT\t\t\t\tapidx,\n\tIN\tPUCHAR\t\tpAddr)\n{\n\tINT\ti = 0;\n\t\n\tfor (i = 0; i < MAX_PMKID_COUNT; i++)\n\t{\n\t\tif ((pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].Valid)\n\t\t\t&& MAC_ADDR_EQUAL(&pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[i].MAC, pAddr))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSearchPMKIDCache %02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\\n\", \n            \tpAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], i, apidx));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i == MAX_PMKID_COUNT)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSearchPMKIDCache - IF(%d) not found\\n\", apidx));\n\t\treturn -1;\n\t}\n\n\treturn i;\n}\n\nVOID RTMPDeletePMKIDCache(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tINT\t\t\t\tapidx,\n\tIN  INT\t\t\t\tidx)\n{\n\tPAP_BSSID_INFO pInfo = &pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[idx];\n\n\tif (pInfo->Valid)\n\t{\n\t\tpInfo->Valid = FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPDeletePMKIDCache(IF(%d), del PMKID CacheIdx=%d\\n\", apidx, idx));\n\t}\n}\n\nVOID RTMPMaintainPMKIDCache(\n\tIN  PRTMP_ADAPTER   pAd)\n{\n\tINT\ti, j;\n\tULONG Now;\n\tfor (i = 0; i < MAX_MBSSID_NUM(pAd); i++)\n\t{\n\t\tPMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[i];\n\t\n\t\tfor (j = 0; j < MAX_PMKID_COUNT; j++)\n\t\t{\n\t\t\tPAP_BSSID_INFO pBssInfo = &pMbss->PMKIDCache.BSSIDInfo[j];\n\n\t\t\tNdisGetSystemUpTime(&Now);\n\n\t\t\tif ((pBssInfo->Valid)\n\t\t\t\t&& /*((Now - pBssInfo->RefreshTime) >= pMbss->PMKCachePeriod)*/\n\t\t\t\t(RTMP_TIME_AFTER(Now, (pBssInfo->RefreshTime + pMbss->PMKCachePeriod))))\n\t\t\t{\n\t\t\t\tRTMPDeletePMKIDCache(pAd, i, j);\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /* DOT1X_SUPPORT */\n\nVOID RTMPGetTxTscFromAsic(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUCHAR\t\t\tapidx,\n\tOUT\tPUCHAR\t\t\tpTxTsc)\n{\n\tUSHORT\t\t\tWcid;\n\tUSHORT\t\t\toffset;\n\tUCHAR\t\t\tIvEiv[8];\n\tint\t\t\t\ti;\n\n\t/* Sanity check of apidx */\n\tif (apidx >= MAX_MBSSID_NUM(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPGetTxTscFromAsic : invalid apidx(%d)\\n\", apidx));\n\t\treturn;\n\t}\n\n\t/* Initial value */\n\tNdisZeroMemory(IvEiv, 8);\n\tNdisZeroMemory(pTxTsc, 6);\n\n\t/* Get apidx for this BSSID */\n\tGET_GroupKey_WCID(pAd, Wcid, apidx);\t\n\n\t/* When the group rekey action is triggered, a count-down(3 seconds) is started. \n\t   During the count-down, use the initial PN as TSC.\n\t   Otherwise, get the IVEIV from ASIC. */\n\tif (pAd->ApCfg.MBSSID[apidx].RekeyCountDown > 0)\n\t{\n\t\t/*\n\t\tIn IEEE 802.11-2007 8.3.3.4.3 described :\n\t\tThe PN shall be implemented as a 48-bit monotonically incrementing\n\t\tnon-negative integer, initialized to 1 when the corresponding \n\t\ttemporal key is initialized or refreshed. */\t\n\t\tIvEiv[0] = 1;\n\t}\n\telse\n\t{\n\t\tUINT32 temp1, temp2;\n\t\t/* Read IVEIV from Asic */\n\t\toffset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);\n\t\t\n\t\t/* Use Read32 to avoid endian problem */\n\t\tRTMP_IO_READ32(pAd, offset, &temp1);\n\t\tRTMP_IO_READ32(pAd, offset+4, &temp2);\n\t\tfor ( i=0; i<4; i++)\n\t\t{\n\t\t\tIvEiv[i] = (UCHAR)(temp1 >> (i*8));\n\t\t\tIvEiv[i+4] = (UCHAR)(temp2 >> (i*8));\n\t\t}\n\t}\n\n\t/* Record current TxTsc */\n\tif (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n\t{\t/* AES */\n\t\t*pTxTsc \t= IvEiv[0];\n\t\t*(pTxTsc+1) = IvEiv[1];\n\t\t*(pTxTsc+2) = IvEiv[4];\n\t\t*(pTxTsc+3) = IvEiv[5];\n\t\t*(pTxTsc+4) = IvEiv[6];\n\t\t*(pTxTsc+5) = IvEiv[7];\t\t\t\t\t\n\t}\n\telse\n\t{\t/* TKIP */\n\t\t*pTxTsc \t= IvEiv[2];\n\t\t*(pTxTsc+1) = IvEiv[0];\n\t\t*(pTxTsc+2) = IvEiv[4];\n\t\t*(pTxTsc+3) = IvEiv[5];\n\t\t*(pTxTsc+4) = IvEiv[6];\n\t\t*(pTxTsc+5) = IvEiv[7];\t\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPGetTxTscFromAsic : WCID(%d) TxTsc 0x%02x-0x%02x-0x%02x-0x%02x-0x%02x-0x%02x \\n\", \n\t\t\t\t\t\t\t\t\tWcid, *pTxTsc, *(pTxTsc+1), *(pTxTsc+2), *(pTxTsc+3), *(pTxTsc+4), *(pTxTsc+5)));\n\t\t\t\n\n}\n\n/*\n    ==========================================================================\n    Description:\n       Set group re-key timer\n\n    Return:\n\t\t\n    ==========================================================================\n*/\nVOID\tWPA_APSetGroupRekeyAction(\n\tIN  PRTMP_ADAPTER   pAd)\n{\n\tUINT8\tapidx = 0;\n\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tPMULTISSID_STRUCT\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n\t\tif ((pMbss->WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t(pMbss->WepStatus == Ndis802_11Encryption3Enabled) ||\n\t\t\t(pMbss->WepStatus == Ndis802_11Encryption4Enabled))\n\t\t{\n\t\t\t/* Group rekey related */\n\t\t\tif ((pMbss->WPAREKEY.ReKeyInterval != 0) \n\t\t\t\t&& ((pMbss->WPAREKEY.ReKeyMethod == TIME_REKEY) || (\n\t\t\t\t\tpMbss->WPAREKEY.ReKeyMethod == PKT_REKEY))) \n\t\t\t{\n\t\t\t\t/* Regularly check the timer */\n\t\t\t\tif (pMbss->REKEYTimerRunning == FALSE)\n\t\t\t\t{\n\t\t\t\t\tRTMPSetTimer(&pMbss->REKEYTimer, GROUP_KEY_UPDATE_EXEC_INTV);\n\n\t\t\t\t\tpMbss->REKEYTimerRunning = TRUE;\n\t\t\t\t\tpMbss->REKEYCOUNTER = 0;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" %s : Group rekey method= %ld , interval = 0x%lx\\n\",\n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, pMbss->WPAREKEY.ReKeyMethod,\n\t\t\t\t\t\t\t\t\t\t\tpMbss->WPAREKEY.ReKeyInterval));\n\t\t\t}\n\t\t\telse\n\t\t\t\tpMbss->REKEYTimerRunning = FALSE;\n\t\t}\n\t}\n}\n\n#ifdef QOS_DLS_SUPPORT\nVOID RTMPHandleSTAKey(\n    IN PRTMP_ADAPTER    pAd, \n    IN PMAC_TABLE_ENTRY\tpEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n\textern UCHAR\t\tOUI_WPA2_WEP40[];\n\tULONG\t\t\t\tFrameLen = 0;\n\tPUCHAR\t\t\t\tpOutBuffer = NULL;\n\tUCHAR\t\t\t\tHeader802_3[14];\n\tUCHAR\t\t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpOutPacket;\n\tPEAPOL_PACKET\t\tpSTAKey;\n\tPHEADER_802_11\t\tpHeader;\n\tUCHAR\t\t\t\tOffset = 0;\n\tULONG\t\t\t\tMICMsgLen;\n\tUCHAR\t\t\t\tDA[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\tKey_Data[512];\n\tUCHAR\t\t\t\tkey_length;\n\tUCHAR\t\t\t\tmic[LEN_KEY_DESC_MIC];\n\tUCHAR\t\t\t\trcv_mic[LEN_KEY_DESC_MIC];\n\tUCHAR\t\t\t\tdigest[80];\n\tUCHAR\t\t\t\ttemp[64];\n\tPMAC_TABLE_ENTRY\tpDaEntry;\n\n\t/*Benson add for big-endian 20081016--> */\n\tKEY_INFO\t\t\tpeerKeyInfo;\n\t/*Benson add 20081016 <-- */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> RTMPHandleSTAKey\\n\"));\n\n\tif (!pEntry)\n\t\treturn;\n\t\n\tif ((pEntry->WpaState != AS_PTKINITDONE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Not expect calling STAKey hand shaking here\"));\n\t\treturn;\n\t}\n\n    pHeader = (PHEADER_802_11) Elem->Msg;\n\n\t/* QoS control field (2B) is took off */\n/*    if (pHeader->FC.SubType & 0x08) */\n/*        Offset += 2; */\n    \n\tpSTAKey = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H + Offset];\t\n\t/*Benson add for big-endian 20081016--> */\n\tNdisZeroMemory((PUCHAR)&peerKeyInfo, sizeof(peerKeyInfo));\n\tNdisMoveMemory((PUCHAR)&peerKeyInfo, (PUCHAR)&pSTAKey->KeyDesc.KeyInfo, sizeof(KEY_INFO));\n\t*((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo));\n\t/*Benson add 20081016 <-- */\n\t\n    /* Check Replay Counter */\n    if (!RTMPEqualMemory(pSTAKey->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"Replay Counter Different in STAKey handshake!! \\n\"));\n        DBGPRINT(RT_DEBUG_ERROR, (\"Receive : %d %d %d %d  \\n\",\n\t\t\t\tpSTAKey->KeyDesc.ReplayCounter[0],\n\t\t\t\tpSTAKey->KeyDesc.ReplayCounter[1],\n\t\t\t\tpSTAKey->KeyDesc.ReplayCounter[2],\n\t\t\t\tpSTAKey->KeyDesc.ReplayCounter[3]));\n        DBGPRINT(RT_DEBUG_ERROR, (\"Current : %d %d %d %d  \\n\",\n\t\t\t\tpEntry->R_Counter[4],pEntry->R_Counter[5],\n\t\t\t\tpEntry->R_Counter[6],pEntry->R_Counter[7]));\n        return;\n    }\n\n    /* Check MIC, if not valid, discard silently */\n    NdisMoveMemory(DA, &pSTAKey->KeyDesc.KeyData[6], MAC_ADDR_LEN);\n\n\tif (peerKeyInfo.KeyMic && peerKeyInfo.Secure && peerKeyInfo.Request)/*Benson add for big-endian 20081016 --> */\n\t{\n\t\tpEntry->bDlsInit = TRUE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"STAKey Initiator: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));\n\t}\n\n\n    MICMsgLen = pSTAKey->Body_Len[1] | ((pSTAKey->Body_Len[0]<<8) && 0xff00);\n    MICMsgLen += LENGTH_EAPOL_H;\n    if (MICMsgLen > (Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"Receive wrong format EAPOL packets \\n\"));\n        return;        \n    }\n\n\t/* This is proprietary DLS protocol, it will be adhered when spec. is finished. */\n\tNdisZeroMemory(temp, 64);\n\tNdisZeroMemory(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, sizeof(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK));\n\tNdisMoveMemory(temp, \"IEEE802.11 WIRELESS ACCESS POINT\", 32);\n\n\tWpaDerivePTK(pAd, temp, temp, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, temp,\n\t\t\t\tpEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"PTK-%x %x %x %x %x %x %x %x \\n\",\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[0],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[1],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[2],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[3],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[4],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[5],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[6],\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[7]));\n\n\n\t/* Record the received MIC for check later */\n\tNdisMoveMemory(rcv_mic, pSTAKey->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\tNdisZeroMemory(pSTAKey->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n    if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n    {\n        RT_HMAC_MD5(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, (PUCHAR)pSTAKey, MICMsgLen, mic, MD5_DIGEST_SIZE);\n    }\n    else\n    {\n        RT_HMAC_SHA1(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, (PUCHAR)pSTAKey,  MICMsgLen, digest, SHA1_DIGEST_SIZE);\n        NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);\n    }\n\n    if (!RTMPEqualMemory(rcv_mic, mic, LEN_KEY_DESC_MIC))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"MIC Different in STAKey handshake!! \\n\"));\n        return;\n    }\n    else\n        DBGPRINT(RT_DEBUG_TRACE, (\"MIC VALID in STAKey handshake!! \\n\"));\n\n\t/* Receive init STA's STAKey Message-2, and terminate the handshake */\n\t/*if (pEntry->bDlsInit && !pSTAKey->KeyDesc.KeyInfo.Request) */\n\tif (pEntry->bDlsInit && !peerKeyInfo.Request) /*Benson add for big-endian 20081016 --> */\n\t{\n\t\tpEntry->bDlsInit = FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive init STA's STAKey Message-2, STAKey handshake finished \\n\"));\n\t\treturn;\n\t}\n\n\t/* Receive init STA's STAKey Message-2, and terminate the handshake */\n\tif (RTMPEqualMemory(&pSTAKey->KeyDesc.KeyData[2], OUI_WPA2_WEP40, 3))\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Receive a STAKey message which not support currently, just drop it \\n\"));\n\t\treturn;\n\t}\n\t\n    do\n    {\n    \tpDaEntry = MacTableLookup(pAd, DA);\n    \tif (!pDaEntry)\n    \t\tbreak;\n\n    \tif ((pDaEntry->WpaState != AS_PTKINITDONE))\n\t    {\n\t        DBGPRINT(RT_DEBUG_ERROR, (\"Not expect calling STAKey hand shaking here \\n\"));\n\t        break;\n\t    }\n    \t\n\t\tMlmeAllocateMemory(pAd, (PUCHAR *)&pOutBuffer);  /* allocate memory */\n        if(pOutBuffer == NULL)\n            break;\n\n        MAKE_802_3_HEADER(Header802_3, pDaEntry->Addr, pAd->ApCfg.MBSSID[pDaEntry->apidx].Bssid, EAPOL);\n\n        /* Increment replay counter by 1 */\n        ADD_ONE_To_64BIT_VAR(pDaEntry->R_Counter);\n\n\t\t/* Allocate memory for output */\n\t\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\t\tif (mpool == NULL)\n\t    {\n\t\t\tMlmeFreeMemory(pAd, (PUCHAR)pOutBuffer);\n\t        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n\t        return;\n\t    }\n\n\t\tpOutPacket = (PEAPOL_PACKET)mpool;\n\t\tNdisZeroMemory(pOutPacket, TX_EAPOL_BUFFER);\n\n        /* 0. init Packet and Fill header */\n        pOutPacket->ProVer = EAPOL_VER;\n        pOutPacket->ProType = EAPOLKey;\n        pOutPacket->Body_Len[1] = 0x5f;\n        \n        /* 1. Fill replay counter */\n/*        NdisMoveMemory(pDaEntry->R_Counter, pAd->ApCfg.R_Counter, sizeof(pDaEntry->R_Counter)); */\n        NdisMoveMemory(pOutPacket->KeyDesc.ReplayCounter, pDaEntry->R_Counter, LEN_KEY_DESC_REPLAY);\n        \n        /* 2. Fill key version, keyinfo, key len */\n        pOutPacket->KeyDesc.KeyInfo.KeyDescVer= GROUP_KEY;\n        pOutPacket->KeyDesc.KeyInfo.KeyType\t= GROUPKEY;\n        pOutPacket->KeyDesc.KeyInfo.Install\t= 1;\n        pOutPacket->KeyDesc.KeyInfo.KeyAck\t= 1;\n        pOutPacket->KeyDesc.KeyInfo.KeyMic\t= 1;\n        pOutPacket->KeyDesc.KeyInfo.Secure\t= 1;\n        pOutPacket->KeyDesc.KeyInfo.EKD_DL\t= 1;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"STAKey handshake for peer STA %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tDA[0], DA[1], DA[2], DA[3], DA[4], DA[5]));\n        \n        if ((pDaEntry->AuthMode == Ndis802_11AuthModeWPA) || (pDaEntry->AuthMode == Ndis802_11AuthModeWPAPSK))\n        {\n        \tpOutPacket->KeyDesc.Type = WPA1_KEY_DESC;\n\n        \tDBGPRINT(RT_DEBUG_TRACE, (\"pDaEntry->AuthMode == Ndis802_11AuthModeWPA/WPAPSK\\n\"));\n        }\n        else if ((pDaEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pDaEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n        {\n        \tpOutPacket->KeyDesc.Type = WPA2_KEY_DESC;\n        \tpOutPacket->KeyDesc.KeyDataLen[1] = 0;\n\n        \tDBGPRINT(RT_DEBUG_TRACE, (\"pDaEntry->AuthMode == Ndis802_11AuthModeWPA2/WPA2PSK\\n\"));\n        }\n\n        pOutPacket->KeyDesc.KeyLength[1] = LEN_TKIP_TK;\n        pOutPacket->KeyDesc.KeyDataLen[1] = LEN_TKIP_TK;\n        pOutPacket->KeyDesc.KeyInfo.KeyDescVer = KEY_DESC_TKIP;\n        if (pDaEntry->WepStatus == Ndis802_11Encryption3Enabled)\n        {\n            pOutPacket->KeyDesc.KeyLength[1] = LEN_AES_TK;\n            pOutPacket->KeyDesc.KeyDataLen[1] = LEN_AES_TK;\n            pOutPacket->KeyDesc.KeyInfo.KeyDescVer = KEY_DESC_AES;\n        }\n\n\t\t/* Key Data Encapsulation format, use Ralink OUI to distinguish proprietary and standard. */\n    \tKey_Data[0] = 0xDD;\n\t\tKey_Data[1] = 0x00;\t\t/* Length (This field will be filled later) */\n    \tKey_Data[2] = 0x00;\t\t/* OUI */\n    \tKey_Data[3] = 0x0C;\t\t/* OUI */\n    \tKey_Data[4] = 0x43;\t\t/* OUI */\n    \tKey_Data[5] = 0x02;\t\t/* Data Type (STAKey Key Data Encryption) */\n\n\t\t/* STAKey Data Encapsulation format */\n    \tKey_Data[6] = 0x00;\t\t/*Reserved */\n\t\tKey_Data[7] = 0x00;\t\t/*Reserved */\n\n\t\t/* STAKey MAC address */\n\t\tNdisMoveMemory(&Key_Data[8], pEntry->Addr, MAC_ADDR_LEN);\t\t/* initiator MAC address */\n\n\t\t/* STAKey (Handle the difference between TKIP and AES-CCMP) */\n\t\tif (pDaEntry->WepStatus == Ndis802_11Encryption3Enabled)\n        {\n        \tKey_Data[1] = 0x1E;\t/* 4+2+6+16(OUI+Reserved+STAKey_MAC_Addr+STAKey) */\n        \tNdisMoveMemory(&Key_Data[14], pEntry->PairwiseKey.Key, LEN_AES_TK);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tKey_Data[1] = 0x2E;\t/* 4+2+6+32(OUI+Reserved+STAKey_MAC_Addr+STAKey) */\n\t\t\tNdisMoveMemory(&Key_Data[14], pEntry->PairwiseKey.Key, LEN_TK);\n\t\t\tNdisMoveMemory(&Key_Data[14+LEN_TK], pEntry->PairwiseKey.TxMic, LEN_TKIP_MIC);\n\t\t\tNdisMoveMemory(&Key_Data[14+LEN_TK+LEN_TKIP_MIC], pEntry->PairwiseKey.RxMic, LEN_TKIP_MIC);\n\t\t}\n\n\t\tkey_length = Key_Data[1];\n\t\tpOutPacket->Body_Len[1] = key_length + 0x5f;\n\n\t\t/* This is proprietary DLS protocol, it will be adhered when spec. is finished. */\n\t\tNdisZeroMemory(temp, 64);\n\t\tNdisMoveMemory(temp, \"IEEE802.11 WIRELESS ACCESS POINT\", 32);\n\t\tWpaDerivePTK(pAd, temp, temp, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, temp, DA, pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PTK-0-%x %x %x %x %x %x %x %x \\n\",\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[0],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[1],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[2],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[3],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[4],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[5],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[6],\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK[7]));\n\n       \tNdisMoveMemory(pOutPacket->KeyDesc.KeyData, Key_Data, key_length);\n\t\tNdisZeroMemory(mic, sizeof(mic));\n\n\t\t*(USHORT *)(&pOutPacket->KeyDesc.KeyInfo) = cpu2le16(*(USHORT *)(&pOutPacket->KeyDesc.KeyInfo));\n\n\t\tMakeOutgoingFrame(pOutBuffer,\t\t\t&FrameLen,\n                        pOutPacket->Body_Len[1] + 4,\tpOutPacket,\n                        END_OF_ARGS);\n\t    \n\t\t/* Calculate MIC */\n        if (pDaEntry->WepStatus == Ndis802_11Encryption3Enabled)\n        {\n            RT_HMAC_SHA1(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE);\n            NdisMoveMemory(pOutPacket->KeyDesc.KeyMic, digest, LEN_KEY_DESC_MIC);\n\t    }\n        else\n        {\n            RT_HMAC_MD5(pAd->ApCfg.MBSSID[pEntry->apidx].DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, mic, MD5_DIGEST_SIZE);\n            NdisMoveMemory(pOutPacket->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC);\n        }\n\n        RTMPToWirelessSta(pAd, pDaEntry, Header802_3, LENGTH_802_3, (PUCHAR)pOutPacket, pOutPacket->Body_Len[1] + 4, FALSE);\n\n        MlmeFreeMemory(pAd, (PUCHAR)pOutBuffer);\n\t\tos_free_mem(NULL, mpool);\n    }while(FALSE);\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"<== RTMPHandleSTAKey: FrameLen=%ld\\n\", FrameLen));\n}\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n/*for sending an event to notify hostapd about michael failure. */\nVOID ieee80211_notify_michael_failure(\n\tIN\tPRTMP_ADAPTER    pAd,\n\tIN\tPHEADER_802_11   pHeader,\n\tIN\tUINT            keyix,\n\tIN\tINT              report)\n{\n\tstatic const char *tag = \"MLME-MICHAELMICFAILURE.indication\";\n/*\tstruct net_device *dev = pAd->net_dev; */\n/*\tunion iwreq_data wrqu; */\n\tchar buf[128];\t\t/* XXX */\n\n\n\t/* TODO: needed parameters: count, keyid, key type, src address, TSC */\n       if(report)/*station reports a mic error to this ap. */\n       {\n\t       snprintf(buf, sizeof(buf), \"%s(keyid=%d %scast addr=%s)\", tag,\n\t\t       keyix, \"uni\",\n\t\t       ether_sprintf(pHeader->Addr2));\n       }\n       else/*ap itself receives a mic error. */\n       {\n              snprintf(buf, sizeof(buf), \"%s(keyid=%d %scast addr=%s)\", tag,\n\t\t       keyix, IEEE80211_IS_MULTICAST(pHeader->Addr1) ?  \"broad\" : \"uni\",\n\t\t       ether_sprintf(pHeader->Addr2));\n\t }\n\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, -1, NULL, NULL, 0);\n/*\tNdisZeroMemory(&wrqu, sizeof(wrqu)); */\n/*\twrqu.data.length = strlen(buf); */\n/*\twireless_send_event(dev, RT_WLAN_EVENT_CUSTOM, &wrqu, buf); */\n}\n\n\nconst CHAR* ether_sprintf(const UINT8 *mac)\n{\n    static char etherbuf[18];\n    snprintf(etherbuf,sizeof(etherbuf),\"%02x:%02x:%02x:%02x:%02x:%02x\",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);\n    return etherbuf;\n}\n#endif /* HOSTAPD_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT \nVOID    ApcliWpaSendEapolStart(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR          pBssid,\n\tIN  PMAC_TABLE_ENTRY pMacEntry,\n\tIN\tPAPCLI_STRUCT pApCliEntry)\n{\n\tIEEE8021X_FRAME\t\tPacket;\n\tUCHAR               Header802_3[14];\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> ApCliWpaSendEapolStart\\n\"));\n\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\n\tMAKE_802_3_HEADER(Header802_3, pBssid, &pApCliEntry->CurrentAddress[0], EAPOL);\n\t\n\t// Zero message 2 body\n\tNdisZeroMemory(&Packet, sizeof(Packet));\n\tPacket.Version = EAPOL_VER;\n\tPacket.Type    = EAPOLStart;\n\tPacket.Length  = cpu2be16(0);\n\t\n\t// Copy frame to Tx ring\n\tRTMPToWirelessSta((PRTMP_ADAPTER)pAd, pMacEntry,\n\t\t\t\t\t Header802_3, LENGTH_802_3, (PUCHAR)&Packet, 4, TRUE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WpaSendEapolStart\\n\"));\n}\n\n#define\tLENGTH_EAP_H    4\n// If the received frame is EAP-Packet ,find out its EAP-Code (Request(0x01), Response(0x02), Success(0x03), Failure(0x04)).\nINT\t    ApcliWpaCheckEapCode(\n\tIN  PRTMP_ADAPTER   \t\tpAd,\n\tIN  PUCHAR\t\t\t\tpFrame,\n\tIN  USHORT\t\t\t\tFrameLen,\n\tIN  USHORT\t\t\t\tOffSet)\n{\n\t\n\tPUCHAR\tpData;\n\tINT\tresult = 0;\n\t\t\n\tif( FrameLen < OffSet + LENGTH_EAPOL_H + LENGTH_EAP_H ) \n\t\treturn result;\n\t\t\n\tpData = pFrame + OffSet; // skip offset bytes\n \t\n\tif(*(pData+1) == EAPPacket) \t// 802.1x header - Packet Type\n\t{\n\t\t result = *(pData+4);\t\t// EAP header - Code\n\t}\n\n\treturn result;\n}\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ \n#endif/*APCLI_SUPPORT*/\n"
  },
  {
    "path": "src/ate/chips/mt7601_ate.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2011, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt5592_ate.c\n\n\tAbstract:\n\tSpecific ATE funcitons and variables for RT5572/RT5592\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n#ifdef MT7601\n\n#include \"rt_config.h\"\n\nextern MT7601_FREQ_ITEM MT7601_Frequency_Plan[];\nextern UINT32 NUM_OF_MT7601_CHNL;\nextern RTMP_REG_PAIR MT7601_BBP_BW20RegTb[];\nextern UCHAR MT7601_BBP_BW20RegTb_Size;\nextern RTMP_REG_PAIR MT7601_BBP_BW40RegTb[];\nextern UCHAR MT7601_BBP_BW40RegTb_Size;\nextern RTMP_REG_PAIR MT7601_BBP_HighTempBW20RegTb[];\nextern UCHAR MT7601_BBP_HighTempBW20RegTb_Size;\nextern RTMP_REG_PAIR MT7601_BBP_HighTempBW40RegTb[];\nextern UCHAR MT7601_BBP_HighTempBW40RegTb_Size;\nextern RTMP_REG_PAIR MT7601_BBP_LowTempBW20RegTb[];\nextern UCHAR MT7601_BBP_LowTempBW20RegTb_Size;\nextern RTMP_REG_PAIR MT7601_BBP_LowTempBW40RegTb[];\nextern UCHAR MT7601_BBP_LowTempBW40RegTb_Size;\n\nVOID MT7601ATEAsicSwitchChannel(\n    IN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32 Value = 0;\n\tCHAR TxPwer = 0;\n\tUCHAR index = 0, Channel = 0;\n\t/* added to prevent RF register reading error */\n\tUCHAR RFValue = 0;\n\tINT IdReg;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tSYNC_CHANNEL_WITH_QA(pATEInfo, &Channel);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> %s: SwitchChannel#%d BW = %x\\n\",\n\t\t\t\t__FUNCTION__, Channel, pAd->ate.TxWI.TxWIBW));\n\n\t/* fill Tx power value */\n\tTxPwer = pATEInfo->TxPower0;\n\n\tif (Channel > 14)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Can't find the Channel#%d \\n\", __FUNCTION__, Channel));\n\t\treturn;\n\t}\n\n\tfor (index = 0; index < NUM_OF_MT7601_CHNL; index++)\n\t{\n\t\tif (Channel == MT7601_Frequency_Plan[index].Channel)\n\t\t{\t\t\n\t\t\t/* Frequeny plan setting */\n\t\t\tAndesRFRandomWrite(pAd, 4,\n\t\t\t\tRF_BANK0, RF_R17, MT7601_Frequency_Plan[index].K_R17,\n\t\t\t\tRF_BANK0, RF_R18, MT7601_Frequency_Plan[index].K_R18,\n\t\t\t\tRF_BANK0, RF_R19, MT7601_Frequency_Plan[index].K_R19,\n\t\t\t\tRF_BANK0, RF_R20, MT7601_Frequency_Plan[index].N_R20);\n\t\t}\n\t}\n\n\tRTMP_IO_READ32(pAd, TX_ALC_CFG_0, &Value);\n\tValue = Value & (~0x3F3F);\n\tValue |= (TxPwer & 0x3F);\n\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_0, Value);\n\n\t/* BBP setting */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));\n\n\t\t//RtmpUpdateFilterCoefficientControl(pAd, Channel);\n\n\t/* \n\t\tvcocal_en (initiate VCO calibration (reset after completion)) - It should be at the end of RF configuration. \n\t*/\n\trlt_rf_write(pAd, RF_BANK0, RF_R04, 0x0A);\n\trlt_rf_write(pAd, RF_BANK0, RF_R05, 0x20);\n\n\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RFValue);\n\tRFValue = RFValue | 0x80; \n\trlt_rf_write(pAd, RF_BANK0, RF_R04, RFValue);\n\tRTMPusecDelay(2000);\n\n\trtmp_bbp_set_bw(pAd, pAd->ate.TxWI.TxWIBW);\n\n\tswitch (pAd->ate.TxWI.TxWIBW)\n\t{\n\t\tcase BW_20:\n\t\t\tif ( pChipCap->TemperatureMode == TEMPERATURE_MODE_HIGH )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempBW20RegTb, MT7601_BBP_HighTempBW20RegTb_Size);\n\t\t\t}\n\t\t\telse if ( pChipCap->TemperatureMode == TEMPERATURE_MODE_LOW )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempBW20RegTb, MT7601_BBP_LowTempBW20RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_BW20RegTb, MT7601_BBP_BW20RegTb_Size);\n\t\t\t}\n\n\n\t\t\t/* Tx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10001);\n\t\t\t/* Rx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10000);\n\t\t\tbreak;\n\t\tcase BW_40:\n\t\t\tif ( pChipCap->TemperatureMode == TEMPERATURE_MODE_HIGH )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempBW40RegTb, MT7601_BBP_HighTempBW40RegTb_Size);\n\t\t\t}\n\t\t\telse if ( pChipCap->TemperatureMode == TEMPERATURE_MODE_LOW )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempBW40RegTb, MT7601_BBP_LowTempBW40RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_BW40RegTb, MT7601_BBP_BW40RegTb_Size);\n\t\t\t}\n\n\t\t\t/* Tx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10101);\n\t\t\t/* Rx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10100);\n\n\t\t\tbreak;\n\t\tdefault:\t\t\t\n\t\t\tbreak;\n\t}\n\n\tATEAsicSetTxRxPath(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== %s: SwitchChannel#%d\\n\",\n\t\t\t\t__FUNCTION__, Channel));\n\n}\n\n\nINT MT7601ATETxPwrHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN char index)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR TxPower = 0;\n\tUCHAR MaxPower;\n\tUINT32 RegValue = 0;\n\tUCHAR Channel = pATEInfo->Channel;\n\n#ifdef RALINK_QA\n\tif ((pATEInfo->bQATxStart == TRUE) || (pATEInfo->bQARxStart == TRUE))\n\t{\n\t\treturn 0;\n\t}\n\telse\n#endif /* RALINK_QA */\n\tif (index == 0)\n\t{\n\t\tTxPower = pATEInfo->TxPower0;\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"%s : Only TxPower0 and TxPower1 are adjustable !\\n\", __FUNCTION__));\n\t\tDBGPRINT_ERR((\"%s : TxPower%d is out of range !\\n\", __FUNCTION__, index));\n\t\treturn -1;\n\t}\n\n\tif (Channel <= 14) /* G band */\n\t{\n\n\t\tif ( pATEInfo->bAutoTxAlc == FALSE )\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TX_ALC_CFG_1, &RegValue);\n\t\t\tRegValue &= ~(0xFFFF);\n\t\t\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_1, RegValue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_1, pAd->chipCap.TxALCData.InitTxAlcCfg1);\n\t\t}\n\n\t\tRTMP_IO_READ32(pAd, TX_ALC_CFG_0, &RegValue);\n\t\tMaxPower = RegValue >> 24;\n\t\tRegValue = RegValue & (~0x3F3F);\n\t\tif ( TxPower > MaxPower )\n\t\t\tTxPower = MaxPower;\n\t\tRegValue |= (TxPower & 0x3F);\n\t\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_0, RegValue);\n\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : (TxPower%d=%d)\\n\", __FUNCTION__, index, TxPower));\n\t\n\treturn 0;\n}\t\n\n\n/* \n==========================================================================\n    Description:\n        Set  RT5370 and RT5372 and RT5390 and RT5392  ATE RF BW\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tMT7601_Set_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT powerIndex;\n\tUCHAR value = 0;\n\tUCHAR BBPCurrentBW;\n\tINT IdReg;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\t\n\tBBPCurrentBW = simple_strtol(arg, 0, 10);\n\n\tif ((BBPCurrentBW == 0))\n\t{\n\t\tpAd->ate.TxWI.TxWIBW = BW_20;\n\t}\n\telse\n\t{\n\t\tpAd->ate.TxWI.TxWIBW = BW_40;\n \t}\n\n\tif ((pAd->ate.TxWI.TxWIPHYMODE == MODE_CCK) && (pAd->ate.TxWI.TxWIBW == BW_40))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ATE_TX_BW_Proc!! Warning!! CCK only supports 20MHZ!!\\nBandwidth switch to 20\\n\"));\n\t\tpAd->ate.TxWI.TxWIBW = BW_20;\n\t}\n\n\tif (pAd->ate.TxWI.TxWIBW == BW_20)\n\t{\n\t\tif (pAd->ate.Channel <= 14)\n\t\t{\n\t\t\t/* BW=20;G band */\n \t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n \t\t\t{\n\t\t\t\tif (pAd->Tx20MPwrCfgGBand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx20MPwrCfgGBand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\t/* BW=20 */\n\t\t{\n\t\t/* Set BBP R4 bit[4:3]=0:0 */\n \t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, &value);\n \t\tvalue &= (~0x18);\n \t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\n\t\t}\n\n\t\tif ( pChipCap->TemperatureMode == TEMPERATURE_MODE_HIGH )\n\t\t{\n\t\t\tfor(IdReg=0; IdReg < MT7601_BBP_HighTempBW20RegTb_Size; IdReg++)\n\t\t\t{\n\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, MT7601_BBP_HighTempBW20RegTb[IdReg].Register,\n\t\t\t\t\t\tMT7601_BBP_HighTempBW20RegTb[IdReg].Value);\n\t\t\t}\n\t\t}\n\t\telse if ( pChipCap->TemperatureMode == TEMPERATURE_MODE_LOW )\n\t\t{\n\t\t\tfor(IdReg=0; IdReg < MT7601_BBP_LowTempBW20RegTb_Size; IdReg++)\n\t\t\t{\n\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, MT7601_BBP_LowTempBW20RegTb[IdReg].Register,\n\t\t\t\t\t\tMT7601_BBP_LowTempBW20RegTb[IdReg].Value);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor(IdReg=0; IdReg < MT7601_BBP_BW20RegTb_Size; IdReg++)\n\t\t\t{\n\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, MT7601_BBP_BW20RegTb[IdReg].Register,\n\t\t\t\t\t\tMT7601_BBP_BW20RegTb[IdReg].Value);\n\t\t\t}\n\t\t}\n\n\t\t/* Please don't move this block backward. */\n\t\t/* BBP_R4 should be overwritten for every chip if the condition matched. */\n\t\tif (pAd->ate.Channel == 14)\n\t\t{\n\t\t\tINT TxMode = pAd->ate.TxWI.TxWIPHYMODE;\n\n\t\t\tif (TxMode == MODE_CCK)\n\t\t\t{\n\t\t\t\t/* when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 */\n \t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, &value);\n\t\t\t\tvalue |= 0x20; /* set bit5=1 */\n \t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\t/* If bandwidth = 40M, set RF Reg4 bit 21 = 0. */\n\telse if (pAd->ate.TxWI.TxWIBW == BW_40)\n\t{\n\t\tif (pAd->ate.Channel <= 14)\n\t\t{\n\t\t\t/* BW=40;G band */\n\t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n\t\t\t{\n\t\t\t\tif (pAd->Tx40MPwrCfgGBand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx40MPwrCfgGBand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\n\t\t}\t\t\n\n\t\t{\n\t\t\t/* Set BBP R4 bit[4:3]=1:0 */\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n\t\t\tvalue &= (~0x18);\n\t\t\tvalue |= 0x10;\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\n\t\t}\n\n\t\t\tif ( pChipCap->TemperatureMode == TEMPERATURE_MODE_HIGH )\n\t\t\t{\n\t\t\t\tfor(IdReg=0; IdReg < MT7601_BBP_HighTempBW40RegTb_Size; IdReg++)\n\t\t\t\t{\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, MT7601_BBP_HighTempBW40RegTb[IdReg].Register,\n\t\t\t\t\t\t\tMT7601_BBP_HighTempBW40RegTb[IdReg].Value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( pChipCap->TemperatureMode == TEMPERATURE_MODE_LOW )\n\t\t\t{\n\t\t\t\tfor(IdReg=0; IdReg < MT7601_BBP_LowTempBW40RegTb_Size; IdReg++)\n\t\t\t\t{\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, MT7601_BBP_LowTempBW40RegTb[IdReg].Register,\n\t\t\t\t\t\t\tMT7601_BBP_LowTempBW40RegTb[IdReg].Value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor(IdReg=0; IdReg < MT7601_BBP_BW40RegTb_Size; IdReg++)\n\t\t\t\t{\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, MT7601_BBP_BW40RegTb[IdReg].Register,\n\t\t\t\t\t\t\tMT7601_BBP_BW40RegTb[IdReg].Value);\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_BW_Proc (BBPCurrentBW = %d)\\n\", pAd->ate.TxWI.TxWIBW));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_BW_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\t\n\n\n\n\n\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\n\nBOOLEAN MT7601ATEGetTssiCompensationParam(\n\tIN \t\tPRTMP_ADAPTER \t\tpAd, \n\tOUT \tPCHAR \t\t\t\tTssiLinear0,\n\tOUT \tPCHAR \t\t\t\tTssiLinear1, \n\tOUT \tPINT32 \t\t\t\tTargetPower)\n{\n#define MAX_TSSI_WAITING_COUNT\t40\n\tUCHAR RFReg, BBPReg;\n\tUCHAR PacketType;\n\tUCHAR BbpR47;\n\tUCHAR TxRate;\n\tINT32 Power;\n\tUINT count;\n\tUCHAR ch = 0;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\n\tif ((pAd->ate.Channel >= 1) && (pAd->ate.Channel <= 14))\n\t{\n\t\tch = pAd->ate.Channel;\n\t}\n\telse\n\t{\n\t\tch = 1;\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Incorrect channel #%d\\n\", __FUNCTION__, pAd->ate.Channel));\n\t}\n\n\tif ( pTxALCData->TssiTriggered == 0 )\n\t{\n\t\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD) )\n\t\t{\n\t\t\tMT7601_EnableTSSI(pAd);\n\t\t\tpTxALCData->TssiTriggered = 1;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPReg);\t\n\tif(BBPReg & 0x10)\n\t{\n\t\tprintk(\"#\\n\");\n\n\t\treturn FALSE;\n\t}\n\n\t/* 4. Read TSSI */\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BbpR47);\n\tBbpR47 = (BbpR47 & ~0x07);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, TssiLinear0);\n\n\n\t/* 5. Read Temperature */\n\tBbpR47 = (BbpR47 & ~0x07) | 0x04;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &(pAd->chipCap.CurrentTemperBbpR49));\n\n\tBbpR47 = (BbpR47 & ~0x07) | 0x01;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &PacketType);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI = 0x%X\\n\", *TssiLinear0));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"temperature = 0x%X\\n\", pAd->chipCap.CurrentTemperBbpR49));\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"PacketType = 0x%X\\n\", PacketType));\n\n\tPower = pAd->ate.TxPower0;\n\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"Channel Desire Power = %d\\n\", Power));\n\n\tswitch ( PacketType & 0x03)\n\t{\n\t\tcase 0:\n\t\t\tTxRate = (PacketType >> 2) & 0x03;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tx_11b_rate: %x\\n\", TxRate));\n\t\t\tswitch (TxRate)\n\t\t\t{\n\t\t\t\tcase 0:\t// 1 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_CCK_1M : BW20_MCS_POWER_CCK_1M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_1M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\t// 2 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_CCK_2M : BW20_MCS_POWER_CCK_2M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_2M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\t// 5.5 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_CCK_5M : BW20_MCS_POWER_CCK_5M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_5M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\t// 11Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_CCK_11M : BW20_MCS_POWER_CCK_11M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_11M;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R178, &BBPReg);\n\t\t\tif ( BBPReg == 0 )\n\t\t\t{\n\t\t\t\tPower += 24576;\t\t\t// 3 * 8192\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPower += 819;\t\t\t//0.1 x 8192;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tTxRate = (PacketType >> 4) & 0x0F;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tx_11g_rate: %x\\n\", TxRate));\n\t\t\tswitch ( TxRate )\n\t\t\t{\n\t\t\t\tcase 0xB:\t// 6 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_6M : BW20_MCS_POWER_OFDM_6M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_6M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xF:\t// 9 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_9M : BW20_MCS_POWER_OFDM_9M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_9M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xA:\t// 12 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_12M : BW20_MCS_POWER_OFDM_12M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_12M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xE:\t// 18 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_18M : BW20_MCS_POWER_OFDM_18M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_18M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x9:\t// 24 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_24M : BW20_MCS_POWER_OFDM_24M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_24M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xD:\t// 36 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_36M : BW20_MCS_POWER_OFDM_36M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_36M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x8:\t// 48 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_48M : BW20_MCS_POWER_OFDM_48M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_48M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xC:\t// 54 Mbps\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_OFDM_54M : BW20_MCS_POWER_OFDM_54M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_54M;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tBbpR47 = (BbpR47 & ~0x07) | 0x02;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &TxRate);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tx_11n_rate: %x\\n\", TxRate));\n\t\t\tTxRate &= 0x7F;\t\t\t\t// TxRate[7] is bandwidth\n\t\t\tswitch ( TxRate )\n\t\t\t{\n\t\t\t\tcase 0x0:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS0: BW20_MCS_POWER_HT_MCS0;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x1:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS1: BW20_MCS_POWER_HT_MCS1;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x2:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS2: BW20_MCS_POWER_HT_MCS2;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x3:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS3: BW20_MCS_POWER_HT_MCS3;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS3;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x4:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS4: BW20_MCS_POWER_HT_MCS4;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS4;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x5:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS5: BW20_MCS_POWER_HT_MCS5;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS5;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x6:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS6: BW20_MCS_POWER_HT_MCS6;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS6;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x7:\n\t\t\t\t\tPower += (pAd->ate.TxWI.TxWIBW == BW_40)? BW40_MCS_POWER_HT_MCS7: BW20_MCS_POWER_HT_MCS7;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS7;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPReg);\n\tswitch ( BBPReg & 0x3 )\n\t{\n\t\tcase 1:\n\t\t\tPower -= 49152;\t\t// -6 dB*8192\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tPower -= 98304;\t\t//-12 dB*8192\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tPower += 49152;\t\t// 6 dB*8192\n\t\t\tbreak;\n\t\tcase 0:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tPower += pTxALCData->MT7601_TSSI_T0_Delta_Offset;\n\n\t*TargetPower = Power;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TargetPower: 0x%x(%d)\\n\", *TargetPower, *TargetPower));\n\n\treturn TRUE;\n\t\n}\n\n\nVOID MT7601ATEAsicTxAlcGetAutoAgcOffset(\n\tIN PRTMP_ADAPTER \t\t\tpAd)\n{\n\tINT32 TargetPower, CurrentPower, PowerDiff;\n\tUCHAR TssiLinear0, TssiLinear1;\n\tCHAR tssi_offset;\n\tINT16 tssi_db, tssi_m_dc;\n\tUINT32 value;\n\tUCHAR ch = 0;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\t//if (pATEInfo->OneSecPeriodicRound % 4 == 0)\n\t{\n\n\t\tif ((pAd->ate.Channel >= 1) && (pAd->ate.Channel <= 14))\n\t\t{\n\t\t\tch = pAd->ate.Channel;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tch = 1;\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Incorrect channel #%d\\n\", __FUNCTION__, pAd->ate.Channel));\n\t\t}\n\n              // if base power is lower than 10 dBm use High VGA\n\t\tif(pAd->TxPower[ch - 1].Power <= 20)\n\t\t\tpTxALCData->TSSI_USE_HVGA = 1;\n\t\telse\n\t\t\tpTxALCData->TSSI_USE_HVGA = 0;\n\n\t\tif (MT7601ATEGetTssiCompensationParam(pAd, &TssiLinear0 , &TssiLinear1, &TargetPower) == FALSE )\n\t\t\treturn;\n\t\t\n\t\ttssi_m_dc = TssiLinear0 - ((pTxALCData->TSSI_USE_HVGA == 1) ? pTxALCData->TssiDC0_HVGA : pTxALCData->TssiDC0);\n\n\t\t\n\t\ttssi_db = lin2dBd(tssi_m_dc);\n\n\t\tif ( ch <= 4 )\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[0];\n\t\telse if ( ch >= 9 )\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[2];\n\t\telse\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[1];\n\n              if(pTxALCData->TSSI_USE_HVGA == 1)\n  \t\t\ttssi_db -= pTxALCData->TSSI_DBOFFSET_HVGA;\n\n\t\tCurrentPower = (pTxALCData->TssiSlope*tssi_db) + (tssi_offset << 9);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CurrentPower: %d\\n\", CurrentPower));\n  \t\t\t\n\t\tPowerDiff = TargetPower - CurrentPower;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PowerDiff: %d\\n\", PowerDiff));\n\n\t\tif((TssiLinear0 > 126) && ( PowerDiff > 0)) \t\t\t// upper saturation\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s :: upper saturation.\\n\", __FUNCTION__));\n\t\t\tPowerDiff = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//if(((TssiLinear0 -TssiDC0) < 1) && (PowerDiff < 0)) \t// lower saturation\n\t\t\tif(((TssiLinear0 -((pTxALCData->TSSI_USE_HVGA == 1) ? pTxALCData->TssiDC0_HVGA : pTxALCData->TssiDC0)) < 1) && (PowerDiff < 0)) \t// lower saturation\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s :: lower saturation.\\n\", __FUNCTION__));\n\t\t\t\tPowerDiff = 0;\n\t\t\t}\n\t\t}\n\n\t\tif( ((pTxALCData->PowerDiffPre ^ PowerDiff) < 0 )\n                  && ( (PowerDiff  < 4096) && (PowerDiff  > -4096))\t\t\t// +- 0.5\n\t\t   && ( (pTxALCData->PowerDiffPre < 4096) && (pTxALCData->PowerDiffPre > -4096)))\t\t// +- 0.5\n\t\t{ \n\t\t\tif((PowerDiff > 0) && ((PowerDiff + pTxALCData->PowerDiffPre) >= 0))\n\t\t\t\tPowerDiff = 0;\n\t\t\telse if((PowerDiff < 0) && ((PowerDiff + pTxALCData->PowerDiffPre) < 0))\n\t\t\t\tPowerDiff = 0;\n\t\t\telse\n\t\t\t\tpTxALCData->PowerDiffPre = PowerDiff;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tpTxALCData->PowerDiffPre =  PowerDiff;\n\t\t}\n\t\t\n\t\tPowerDiff = PowerDiff + ((PowerDiff>0)?2048:-2048);\n\t\tPowerDiff = PowerDiff / 4096;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"final PowerDiff: %d(0x%x)\\n\", PowerDiff, PowerDiff));\n\n\t\tRTMP_IO_READ32(pAd, TX_ALC_CFG_1, &value);\n\t\tCurrentPower = (value & 0x3F);\n\t\tCurrentPower = CurrentPower > 0x1F ? CurrentPower - 0x40 : CurrentPower;\n\t\tPowerDiff += CurrentPower;\n\t\tif ( PowerDiff > 31 )\n\t\t\tPowerDiff = 31;\n\t\tif ( PowerDiff < -32 )\n\t\t\tPowerDiff = -32;\n\t\t//PowerDiff = PowerDiff + (value & 0x3F);\n\t\tvalue = (value & ~0x3F) | (PowerDiff & 0x3F);\n\t\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_1, value);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MAC 13b4: 0x%x\\n\", value));\t\t\n\n\t\t//MT7601AsicTemperatureCompensation(pAd);\n\n\t\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD) )\n\t\t{\n\t\t\tMT7601_EnableTSSI(pAd);\n\t\t\tpTxALCData->TssiTriggered = 1;\n\t\t}\n\n\t}\n\n\n}\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\nVOID MT7601ATEAsicTemperatureCompensation(\n\tIN PRTMP_ADAPTER\t\t\tpAd)\n{\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->OneSecPeriodicRound % 4 == 0)\n\t{\n#ifdef RTMP_INTERNAL_TX_ALC\n\t\tif ( pAd->TxPowerCtrl.bInternalTxALC == FALSE )\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t\t{\n\t\t\tMT7601_Read_Temperature(pAd, &pChipCap->CurrentTemperBbpR49);\n\t\t}\n\n\t\tMT7601AsicTemperatureCompensation(pAd, FALSE);\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tGives CCK TX rate 2 more dB TX power.\n\t\tThis routine works only in LINK UP in INFRASTRUCTURE mode.\n\n\t\tcalculate desired Tx power in RF R3.Tx0~5,\tshould consider -\n\t\t0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment)\n\t\t1. TxPowerPercentage\n\t\t2. auto calibration based on TSSI feedback\n\t\t3. extra 2 db for CCK\n\t\t4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP\n\n\tNOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment),\n\t\tit should be called AFTER MlmeDynamicTxRatSwitching()\n\t==========================================================================\n */\n\nVOID MT7601ATEAsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tCHAR\t\tDeltaPwr = 0;\n\tCHAR\t\tTxAgcCompensate = 0;\n\tCHAR\t\tDeltaPowerByBbpR1 = 0; \n\tCHAR\t\tTotalDeltaPower = 0; /* (non-positive number) including the transmit power controlled by the MAC and the BBP R1 */\n\tCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC CfgOfTxPwrCtrlOverMAC = {0};\t\n\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\t/* Get temperature compensation delta power value */\n\tMT7601ATEAsicTxAlcGetAutoAgcOffset(pAd);\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set MT7601 ATE RF central frequency offset\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tMT7601_Set_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR RFFreqOffset = 0;\n\tULONG R4 = 0;\n\tUCHAR RFValue = 0;\n\tUCHAR PreRFValue = 0;\n\tRFFreqOffset = simple_strtol(arg, 0, 10);\n\n\tpAd->ate.RFFreqOffset = RFFreqOffset;\n\n\tif ( IS_MT7601(pAd))\n\t{\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R12, pAd->ate.RFFreqOffset);\n\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R04, 0x0A);\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R05, 0x20);\n\n\t\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RFValue);\n\t\tRFValue = RFValue | 0x80; \t/* vcocal_en (initiate VCO calibration (reset after completion)) - It should be at the end of RF configuration. */\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R04, RFValue);\n\t\tRTMPusecDelay(2000);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_FREQOFFSET_Proc (RFFreqOffset = %d)\\n\", pAd->ate.RFFreqOffset));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_FREQOFFSET_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\nVOID MT7601ATERxVGAInit(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR R66 = 0x14;\n\tCHAR LNAGain = GET_LNA_GAIN(pAd);\n\t\n\t//RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x14);\n\n\tATEBBPWriteWithRxChain(pAd, BBP_R66, R66, RX_CHAIN_ALL);\n\n\n\treturn;\n}\n\n\nVOID MT7601ATEAsicSetTxRxPath(\n    IN PRTMP_ADAPTER pAd)\n{\n\tUCHAR\tBbpValue = 0;\n\n\tAsicSetRxAnt(pAd, pAd->ate.RxAntennaSel);\n}\n\n\nstruct _ATE_CHIP_STRUCT MT7601ATE =\n{\n\t/* functions */\n\t.ChannelSwitch = MT7601ATEAsicSwitchChannel,\n\t.TxPwrHandler = MT7601ATETxPwrHandler,\n\t.TssiCalibration = NULL,\n\t.ExtendedTssiCalibration = NULL /* RT5572_ATETssiCalibrationExtend */,\n\t.RxVGAInit = MT7601ATERxVGAInit,\n\t.AsicSetTxRxPath = MT7601ATEAsicSetTxRxPath,\n\t.AdjustTxPower = MT7601ATEAsicAdjustTxPower,\n\t//.AsicExtraPowerOverMAC = DefaultATEAsicExtraPowerOverMAC,\n\t.Set_BW_Proc = MT7601_Set_ATE_TX_BW_Proc,\n\t.Set_FREQ_OFFSET_Proc = MT7601_Set_ATE_TX_FREQ_OFFSET_Proc,\n\t.TemperCompensation = MT7601ATEAsicTemperatureCompensation,\n\n\t/* variables */\n\t.maxTxPwrCnt = 5,\n\t.bBBPStoreTXCARR = FALSE,\n\t.bBBPStoreTXCARRSUPP = FALSE,\t\n\t.bBBPStoreTXCONT = FALSE,\n\t.bBBPLoadATESTOP = FALSE,/* ralink debug */\n};\n\n\n#endif /* MT7601 */\n\n"
  },
  {
    "path": "src/ate/chips/rt28xx_ate.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt28xx_ate.c\n\n\tAbstract:\n\tSpecific ATE funcitons and variables for \n\t\tRT2860\n\t\tRT2870\n\t\tRT2880\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifdef RT28xx\n\n#include \"rt_config.h\"\n\nextern RTMP_RF_REGS RF2850RegTable[];\nextern UCHAR NUM_OF_2850_CHNL;\n\n\n/*\n==========================================================================\n    Description:\n\n\tAsicSwitchChannel() dedicated for RT28xx ATE.\n    \n==========================================================================\n*/\nVOID RT28xxATEAsicSwitchChannel(\n    IN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32 Value = 0;\n\tCHAR TxPwer = 0, TxPwer2 = 0;\n\tUCHAR index = 0, BbpValue = 0, Channel = 0;\n\tUINT32 R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0;\n\tRTMP_RF_REGS *RFRegTable = NULL;\n\n\tSYNC_CHANNEL_WITH_QA(pATEInfo, &Channel);\n\n\t/* fill Tx power value */\n\tTxPwer = pATEInfo->TxPower0;\n\tTxPwer2 = pATEInfo->TxPower1;\n\n\tRFRegTable = RF2850RegTable;\n\n\tswitch (pAd->RfIcType)\n\t{\n\t\t/* But only 2850 and 2750 support 5.5GHz band... */\n\t\tcase RFIC_2820:\n\t\tcase RFIC_2850:\n\t\tcase RFIC_2720:\n\t\tcase RFIC_2750:\n\t\t\tfor (index = 0; index < NUM_OF_2850_CHNL; index++)\n\t\t\t{\n\t\t\t\tif (Channel == RFRegTable[index].Channel)\n\t\t\t\t{\n\t\t\t\t\tR2 = RFRegTable[index].R2;\n\n\t\t\t\t\t/* If TX path is 1, bit 14 = 1. */\n\t\t\t\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tR2 |= 0x4000;\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (pAd->Antenna.field.TxPath == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pATEInfo->TxAntennaSel == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* If TX Antenna select is 1 , bit 14 = 1; Disable Ant 2 */\n\t\t\t\t\t\t\tR2 |= 0x4000;\t\n\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue);\n\t\t\t\t\t\t\tBbpValue &= 0xE7;\t\t/* 11100111B */\n\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (pATEInfo->TxAntennaSel == 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* If TX Antenna select is 2 , bit 15 = 1; Disable Ant 1 */\n\t\t\t\t\t\t\tR2 |= 0x8000;\t\n\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue);\n\t\t\t\t\t\t\tBbpValue &= 0xE7;\t\n\t\t\t\t\t\t\tBbpValue |= 0x08;\n\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue);\n\t\t\t\t\t\t\tBbpValue &= 0xE7;\n\t\t\t\t\t\t\tBbpValue |= 0x10;\n\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (pAd->Antenna.field.RxPath == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (pATEInfo->RxAntennaSel)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\tR2 |= 0x20040;\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\tBbpValue |= 0x00;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tR2 |= 0x10040;\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\tBbpValue |= 0x01;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\t\n\t\t\t\t\t\t\t\tR2 |= 0x40;\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\t/* Only enable two Antenna to receive. */\n\t\t\t\t\t\t\t\tBbpValue |= 0x08;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (pAd->Antenna.field.RxPath == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* write 1 to off RxPath */\n\t\t\t\t\t\tR2 |= 0x20040;\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (pAd->Antenna.field.RxPath == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (pATEInfo->RxAntennaSel)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\tR2 |= 0x20040;\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\tBbpValue |= 0x00;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tR2 |= 0x10040;\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\tBbpValue |= 0x01;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\t\n\t\t\t\t\t\t\t\tR2 |= 0x30000;\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\tBbpValue |= 0x02;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\n\t\t\t\t\t\t\t\tbreak;\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdefault:\t\n\t\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);\n\t\t\t\t\t\t\t\tBbpValue &= 0xE4;\n\t\t\t\t\t\t\t\tBbpValue |= 0x10;\n\t\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (Channel > 14)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* initialize R3, R4 */\n\t\t\t\t\t\tR3 = (RFRegTable[index].R3 & 0xffffc1ff);\n\t\t\t\t\t\tR4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pATEInfo->RFFreqOffset << 15);\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tAccording the Rory's suggestion to solve the middle range issue.\n\n\t\t\t\t\t\t\t5.5G band power range : 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\tmeans the TX power reduce 7dB.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\t/* R3 */\n\t\t\t\t\t\tif ((TxPwer >= -7) && (TxPwer < 0))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTxPwer = (7+TxPwer);\n\t\t\t\t\t\t\tR3 |= (TxPwer << 10);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ATEAsicSwitchChannel: TxPwer=%d \\n\", TxPwer));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer);\n\t\t\t\t\t\t\tR3 |= (TxPwer << 10) | (1 << 9);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* R4 */\n\t\t\t\t\t\tif ((TxPwer2 >= -7) && (TxPwer2 < 0))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTxPwer2 = (7+TxPwer2);\n\t\t\t\t\t\t\tR4 |= (TxPwer2 << 7);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ATEAsicSwitchChannel: TxPwer2=%d \\n\", TxPwer2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2);\n\t\t\t\t\t\t\tR4 |= (TxPwer2 << 7) | (1 << 6);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Set TX power0. */\n\t\t\t\t\t\tR3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9);\n\t\t\t\t\t\t/* Set frequency offset and TX power1. */\n\t\t\t\t\t\tR4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pATEInfo->RFFreqOffset << 15) | (TxPwer2 <<6);\n\t\t\t\t\t}\n\n\t\t\t\t\t/* based on BBP current mode before changing RF channel */\n\t\t\t\t\tif (pATEInfo->TxWI.BW == BW_40)\n\t\t\t\t\t{\n\t\t\t\t\t\tR4 |=0x200000;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/* Update variables. */\n\t\t\t\t\tpAd->LatchRfRegs.Channel = Channel;\n\t\t\t\t\tpAd->LatchRfRegs.R1 = RFRegTable[index].R1;\n\t\t\t\t\tpAd->LatchRfRegs.R2 = R2;\n\t\t\t\t\tpAd->LatchRfRegs.R3 = R3;\n\t\t\t\t\tpAd->LatchRfRegs.R4 = R4;\n\n\t\t\t\t\tRtmpRfIoWrite(pAd);\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\t/* Change BBP setting during switch from a->g, g->a */\n\tif (Channel <= 14)\n\t{\n\t\tUINT32 TxPinCfg = 0x00050F0A;/* 2007.10.09 by Brian : 0x0005050A ==> 0x00050F0A */\n\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));\n\n\t\t/* According the Rory's suggestion to solve the middle range issue. */\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);\t\n\n\t\t/* Rx High power VGA offset for LNA select */\n\t\tif (pAd->NicConfig2.field.ExternalLNAForG)\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84);\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);\n\t\t}\n\n\t\t/* 2.4 G band selection PIN */\n\t\trtmp_mac_set_band(pAd, BAND_24G);\n\n\t\t/* Turn off unused PA or LNA when only 1T or 1R. */\n\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFFFF3;\n\t\t}\n\n\t\tif (pAd->Antenna.field.RxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFF3FF;\n\t\t}\n\n\t\t/* calibration power unbalance issues */\n\t\tif (pAd->Antenna.field.TxPath == 2)\n\t\t{\n\t\t\tif (pATEInfo->TxAntennaSel == 1)\n\t\t\t{\n\t\t\t\tTxPinCfg &= 0xFFFFFFF7;\n\t\t\t}\n\t\t\telse if (pATEInfo->TxAntennaSel == 2)\n\t\t\t{\n\t\t\t\tTxPinCfg &= 0xFFFFFFFD;\n\t\t\t}\n\t\t}\n\t\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\t}\n\t/* channel > 14 */\n\telse\n\t{\n\t    UINT32\tTxPinCfg = 0x00050F05;/* 2007.10.09 by Brian : 0x00050505 ==> 0x00050F05 */\n\t\t\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));\n\n\t\t/* According the Rory's suggestion to solve the middle range issue. */\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);        \n\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2);\n\n\t\t/* Rx High power VGA offset for LNA select */\n\t\tif (pAd->NicConfig2.field.ExternalLNAForA)\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);\n\t\t}\n\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R91, &BbpValue);\n\t\tASSERT((BbpValue == 0x04));\n\n\t\t/* 5 G band selection PIN, bit1 and bit2 are complement */\n\t\trtmp_mac_set_band(pAd, BAND_5G);\n\n\t\t/* Turn off unused PA or LNA when only 1T or 1R. */\n\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFFFF3;\n\t\t}\n\n\t\tif (pAd->Antenna.field.RxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFF3FF;\n\t\t}\n\n\t\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\t}\n\n\tATE_CHIP_RX_VGA_GAIN_INIT(pAd);\n\n\tRtmpOsMsDelay(1);  \n\n\tif (Channel > 14)\n\t{\n\t\t/* When 5.5GHz band the LSB of TxPwr will be used to reduced 7dB or not. */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT28xx:SwitchChannel#%d(RF=%d, %dT) to , R1=0x%08x, R2=0x%08x, R3=0x%08x, R4=0x%08x\\n\",\n\t\t\t\t\t\t\t\t  Channel, \n\t\t\t\t\t\t\t\t  pAd->RfIcType, \n\t\t\t\t\t\t\t\t  pAd->Antenna.field.TxPath,\n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R1, \n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R2, \n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R3, \n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R4));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT28xx:SwitchChannel#%d(RF=%d, Pwr0=%u, Pwr1=%u, %dT) to , R1=0x%08x, R2=0x%08x, R3=0x%08x, R4=0x%08x\\n\",\n\t\t\t\t\t\t\t\t  Channel, \n\t\t\t\t\t\t\t\t  pAd->RfIcType, \n\t\t\t\t\t\t\t\t  (R3 & 0x00003e00) >> 9,\n\t\t\t\t\t\t\t\t  (R4 & 0x000007c0) >> 6,\n\t\t\t\t\t\t\t\t  pAd->Antenna.field.TxPath,\n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R1, \n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R2, \n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R3, \n\t\t\t\t\t\t\t\t  pAd->LatchRfRegs.R4));\n    }\n}\n\n\nINT RT28xxATETxPwrHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN char index)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tULONG R;\n\tCHAR TxPower = 0;\n\tUCHAR Bbp94 = 0;\n\tBOOLEAN bPowerReduce = FALSE;\n\n#ifdef RALINK_QA\n\tif ((pATEInfo->bQATxStart == TRUE) || (pATEInfo->bQARxStart == TRUE))\n\t{\n\t\treturn 0;\n\t}\n\telse\n#endif /* RALINK_QA */\n\tif (index == 0)\n\t{\n\t\tTxPower = pATEInfo->TxPower0;\n\t}\n\telse if (index == 1)\n\t{\n\t\tTxPower = pATEInfo->TxPower1;\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"%s : Only TxPower0 and TxPower1 are adjustable !\\n\", __FUNCTION__));\n\t\tDBGPRINT_ERR((\"%s : TxPower%d is out of range !\\n\", __FUNCTION__, index));\n\t\treturn -1;\n\t}\n\n\tif (pATEInfo->Channel <= 14)\n\t{\n\t\tif (TxPower > 31)\n\t\t{\n\t\t\t/* R3, R4 can't large than 31 (0x24), 31 ~ 36 used by BBP 94 */\n\t\t\tR = 31;\n\t\t\tif (TxPower <= 36)\n\t\t\t\tBbp94 = BBPR94_DEFAULT + (UCHAR)(TxPower - 31);\t\t\n\t\t}\n\t\telse if (TxPower < 0)\n\t\t{\n\t\t\t/* R3, R4 can't less than 0, -1 ~ -6 used by BBP 94 */\n\t\t\tR = 0;\n\t\t\tif (TxPower >= -6)\n\t\t\t\tBbp94 = BBPR94_DEFAULT + TxPower;\n\t\t}\n\t\telse\n\t\t{  \n\t\t\t/* 0 ~ 31 */\n\t\t\tR = (ULONG) TxPower;\n\t\t\tBbp94 = BBPR94_DEFAULT;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : (TxPower=%d, R=%ld, BBP_R94=%d)\\n\", __FUNCTION__, TxPower, R, Bbp94));\n\t}\n\telse /* 5.5 GHz */\n\t{\n\t\tif (TxPower > 15)\n\t\t{\n\t\t\t/* R3, R4 can't large than 15 (0x0F) */\n\t\t\tR = 15;\n\t\t}\n\t\telse if (TxPower < 0)\n\t\t{\n\t\t\t/* R3, R4 can't less than 0 */\n\t\t\t/* -1 ~ -7 */\n\t\t\tASSERT((TxPower >= -7));\n\t\t\tR = (ULONG)(TxPower + 7);\n\t\t\tbPowerReduce = TRUE;\n\t\t}\n\t\telse\n\t\t{  \n\t\t\t/* 0 ~ 15 */\n\t\t\tR = (ULONG) TxPower;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : (TxPower=%d, R=%lu)\\n\", __FUNCTION__, TxPower, R));\n\t}\n\n\tif (pATEInfo->Channel <= 14)\n\t{\n\t\tif (index == 0)\n\t\t{\n\t\t\t/* shift TX power control to correct RF(R3) register bit position */\n\t\t\tR = R << 9;\t\t\n\t\t\tR |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);\n\t\t\tpAd->LatchRfRegs.R3 = R;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* shift TX power control to correct RF(R4) register bit position */\n\t\t\tR = R << 6;\t\t\n\t\t\tR |= (pAd->LatchRfRegs.R4 & 0xfffff83f);\n\t\t\tpAd->LatchRfRegs.R4 = R;\n\t\t}\n\t}\n\telse /* 5.5GHz */\n\t{\n\t\tif (bPowerReduce == FALSE)\n\t\t{\n\t\t\tif (index == 0)\n\t\t\t{\n\t\t\t\t/* shift TX power control to correct RF(R3) register bit position */\n\t\t\t\tR = (R << 10) | (1 << 9);\t\t\n\t\t\t\tR |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);\n\t\t\t\tpAd->LatchRfRegs.R3 = R;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* shift TX power control to correct RF(R4) register bit position */\n\t\t\t\tR = (R << 7) | (1 << 6);\t\t\n\t\t\t\tR |= (pAd->LatchRfRegs.R4 & 0xfffff83f);\n\t\t\t\tpAd->LatchRfRegs.R4 = R;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (index == 0)\n\t\t\t{\n\t\t\t\t/* shift TX power control to correct RF(R3) register bit position */\n\t\t\t\tR = (R << 10);\t\t\n\t\t\t\tR |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);\n\n\t\t\t\t/* Clear bit 9 of R3 to reduce 7dB. */ \n\t\t\t\tpAd->LatchRfRegs.R3 = (R & (~(1 << 9)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* shift TX power control to correct RF(R4) register bit position */\n\t\t\t\tR = (R << 7);\t\t\n\t\t\t\tR |= (pAd->LatchRfRegs.R4 & 0xfffff83f);\n\n\t\t\t\t/* Clear bit 6 of R4 to reduce 7dB. */ \n\t\t\t\tpAd->LatchRfRegs.R4 = (R & (~(1 << 6)));\n\t\t\t}\n\t\t}\n\t}\n\tRtmpRfIoWrite(pAd);\n\n\treturn 0;\n}\n\n\nVOID RT28xxATERxVGAInit(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR R66;\n\tCHAR LNAGain = GET_LNA_GAIN(pAd);\n\t\n\tif (pATEInfo->Channel <= 14)\n\t{\n\t\t/* BG band */\n\t\tR66 = (UCHAR)(0x2E + LNAGain);\n\t}\n\telse \n\t{\n\t\t/* A band */\n\t\tif (pATEInfo->TxWI.BW == BW_20)\n\t\t{\n\t\t\t/* A band, BW == 20 */\n\t\t\tR66 = (UCHAR)(0x32 + (LNAGain*5)/3);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* A band, BW == 40 */\n\t\t\tR66 = (UCHAR)(0x3A + (LNAGain*5)/3);\n\t\t}\n\t}\n\n\tATEBBPWriteWithRxChain(pAd, BBP_R66, R66, RX_CHAIN_ALL);\n\n\n\treturn;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set RT28xx/RT2880 ATE RF BW\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tRT28xx_Set_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT powerIndex;\n\tUCHAR value = 0;\n\tUCHAR BBPCurrentBW;\n\t\n\tBBPCurrentBW = simple_strtol(arg, 0, 10);\n\n\tif (BBPCurrentBW == 0)\n\t{\n\t\tpATEInfo->TxWI.BW = BW_20;\n\t}\n\telse\n\t{\n\t\tpATEInfo->TxWI.BW = BW_40;\n \t}\n\n\tif ((pATEInfo->TxWI.TxWIPHYMODE == MODE_CCK) && (pATEInfo->TxWI.TxWIBW == BW_40))\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_BW_Proc!! Warning!! CCK only supports 20MHZ!!\\n\"));\n\t\tDBGPRINT_ERR((\"Bandwidth switch to 20!!\\n\"));\n\t\tpATEInfo->TxWI.BW = BW_20;\n\t}\n\n\tif (pATEInfo->TxWI.BW == BW_20)\n\t{\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\t/* BW=20;G band */\n \t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n \t\t\t{\n\t\t\t\tif (pAd->Tx20MPwrCfgGBand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/* TX_PWR_CFG_0 ~ TX_PWR_CFG_4 */\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx20MPwrCfgGBand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* BW=20;A band */\n \t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n \t\t\t{\n\t\t\t\tif (pAd->Tx20MPwrCfgABand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/* TX_PWR_CFG_0 ~ TX_PWR_CFG_4 */\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx20MPwrCfgABand[powerIndex]);\t\n \t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n \t\t\t}\n\t\t}\n\n\t\t/* set BW = 20 MHz */\n\t\t/* Set BBP R4 bit[4:3]=0:0 */\n \t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n \t\tvalue &= (~0x18);\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\n\n\t\t/* Set BBP R66=0x3C */\n\t\tvalue = 0x3C;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value);\n\n\t\t/* set BW = 20 MHz */\n\t\tpAd->LatchRfRegs.R4 &= ~0x00200000;\n\t\tRtmpRfIoWrite(pAd);\n\n\t\t/* BW = 20 MHz */\n\t\t/* Set BBP R68=0x0B to improve Rx sensitivity. */\n\t\tvalue = 0x0B;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value);\n\t\t/* Set BBP R69=0x16 */\n\t\tvalue = 0x16;\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value);\n\t\t/* Set BBP R70=0x08 */\n\t\tvalue = 0x08;\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value);\n\t\t/* Set BBP R73=0x11 */\n\t    value = 0x11;\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value);\n\n\t\tif (pATEInfo->Channel == 14)\n\t\t{\n\t\t\tINT TxMode = pATEInfo->TxWI.TxWIPHYMODE;\n\n\t\t\tif (TxMode == MODE_CCK)\n\t\t\t{\n\t\t\t\t/* when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 */\n \t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n\t\t\t\tvalue |= 0x20; /* set bit5=1 */\n \t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\t/* If bandwidth = 40M, set RF Reg4 bit 21 = 0. */\n\telse if (pATEInfo->TxWI.TxWIBW == BW_40)\n\t{\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\t/* BW=40;G band */\n\t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n\t\t\t{\n\t\t\t\tif (pAd->Tx40MPwrCfgGBand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/* TX_PWR_CFG_0 ~ TX_PWR_CFG_4 */\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx40MPwrCfgGBand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* BW=40;A band */\n\t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n\t\t\t{\n\t\t\t\tif (pAd->Tx40MPwrCfgABand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/* TX_PWR_CFG_0 ~ TX_PWR_CFG_4 */\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx40MPwrCfgABand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\t\t\n\n\t\t\tif ((pATEInfo->TxWI.TxWIPHYMODE >= 2) && (pATEInfo->TxWI.TxWIMCS == 7))\n\t\t\t{\n    \t\t\tvalue = 0x28;\n    \t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, value);\n\t\t\t}\n\t\t}\n\n\t\t/* Set BBP R4 bit[4:3]=1:0 */\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n\t\tvalue &= (~0x18);\n\t\tvalue |= 0x10;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\n\n\t\t/* Set BBP R66=0x3C */\n\t\tvalue = 0x3C;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value);\n\n\t\t/* set BW = 40 MHz */\n\t\tpAd->LatchRfRegs.R4 |= 0x00200000;\n\t\tRtmpRfIoWrite(pAd);\n\n\t\t/* BW = 40 MHz */\n\t\t/* Set BBP R68=0x0C to improve Rx sensitivity. */\n\t\tvalue = 0x0C;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value);\n\t\t/* Set BBP R69=0x1A */\n\t\tvalue = 0x1A;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value);\n\t\t/* Set BBP R70=0x0A */\n\t\tvalue = 0x0A;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value);\n\t\t/* Set BBP R73=0x16 */\n\t    value = 0x16;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value);\n\t}\n\n\treturn TRUE;\n}\t\n\n\nINT\tRT28xx_Set_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tULONG R4 = 0;\n\tUCHAR RFFreqOffset = 0;\n\n\tRFFreqOffset = simple_strtol(arg, 0, 10);\n\n\tif (RFFreqOffset >= 64)\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_FREQ_OFFSET_Proc::Out of range(0 ~ 63).\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpATEInfo->RFFreqOffset = RFFreqOffset;\n\n\t/* shift TX power control to correct RF register bit position */\n\tR4 = pATEInfo->RFFreqOffset << 15;\t\t\n\tR4 |= (pAd->LatchRfRegs.R4 & ((~0x001f8000)));\n\tpAd->LatchRfRegs.R4 = R4;\n\t\n\tRtmpRfIoWrite(pAd);\n\t\n\treturn TRUE;\n}\n\n\n\n\n#endif /*RT28xx */\n\n"
  },
  {
    "path": "src/ate/chips/rt30xx_ate.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2011, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt5592_ate.c\n\n\tAbstract:\n\tSpecific ATE funcitons and variables for RT5572/RT5592\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n"
  },
  {
    "path": "src/ate/chips/rt33xx_ate.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2011, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt5592_ate.c\n\n\tAbstract:\n\tSpecific ATE funcitons and variables for RT5572/RT5592\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n"
  },
  {
    "path": "src/ate/chips/rt5390_ate.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2011, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt5592_ate.c\n\n\tAbstract:\n\tSpecific ATE funcitons and variables for RT5572/RT5592\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n"
  },
  {
    "path": "src/ate/common/ate_usb.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n \tModule Name:\n\tate_usb.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n*/\n\n#ifdef RTMP_MAC_USB\n\n#include \"rt_config.h\"\n\nextern UCHAR EpToQueue[];\n/* 802.11 MAC Header, Type:Data, Length:24bytes + 6 bytes QOS/HTC + 2 bytes padding */\nextern UCHAR TemplateFrame[32];\n\nINT TxDmaBusy(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tINT result;\n\tUSB_DMA_CFG_STRUC UsbCfg;\n\n\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word);\t/* disable DMA */\n\tresult = (UsbCfg.field.TxBusy) ? TRUE : FALSE;\n\n\treturn result;\n}\n\n\nINT RxDmaBusy(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tINT result;\n\tUSB_DMA_CFG_STRUC UsbCfg;\n\n\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word);\t/* disable DMA */\n\tresult = (UsbCfg.field.RxBusy) ? TRUE : FALSE;\n\n\treturn result;\n}\n\n\nVOID RtmpDmaEnable(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT Enable)\n{\n\tBOOLEAN value;\n\tULONG WaitCnt;\n\tUSB_DMA_CFG_STRUC UsbCfg;\n\t\n\tvalue = Enable > 0 ? 1 : 0;\n\n\t/* check DMA is in busy mode. */\n\tWaitCnt = 0;\n\n\twhile (TxDmaBusy(pAd) || RxDmaBusy(pAd))\n\t{\n\t\tRTMPusecDelay(10);\n\t\tif (WaitCnt++ > 100)\n\t\t\tbreak;\n\t}\n\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word);\t/* disable DMA */\n\tUsbCfg.field.TxBulkEn = value;\n\tUsbCfg.field.RxBulkEn = value;\n\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word);\t/* abort all TX rings */\n\tRtmpOsMsDelay(5);\n\n\treturn;\n}\n\n\nstatic VOID ATEWriteTxWI(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTXWI_STRUC *pTxWI,\n\tIN\tBOOLEAN\t\t\tFRAG,\t\n\tIN\tBOOLEAN\t\t\tInsTimestamp,\n\tIN\tBOOLEAN \t\tAMPDU,\n\tIN\tBOOLEAN \t\tAck,\n\tIN\tBOOLEAN \t\tNSeq,\t\t/* HW new a sequence. */\n\tIN\tUCHAR\t\t\tBASize,\n\tIN\tUCHAR\t\t\tWCID,\n\tIN\tULONG\t\t\tLength,\n\tIN\tUCHAR \t\t\tPID,\n\tIN\tUCHAR\t\t\tMIMOps,\n\tIN\tUCHAR\t\t\tTxopmode,\t\n\tIN\tBOOLEAN\t\t\tCfAck,\t\n\tIN\tHTTRANSMIT_SETTING\tTransmit)\n{\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);\n\tpTxWI->TxWIFRAG= FRAG;\n\tpTxWI->TxWITS= InsTimestamp;\n\tpTxWI->TxWIAMPDU = AMPDU;\n\n\tpTxWI->TxWIMIMOps = PWR_ACTIVE;\n\tpTxWI->TxWIMpduDensity = 4;\n\tpTxWI->TxWIACK = Ack;\n\tpTxWI->TxWITXOP = Txopmode;\n\tpTxWI->TxWINSEQ = NSeq;\n\t//pTxWI->TxWIBAWinSize = BASize;\t\n\tpTxWI->TxWIBAWinSize = 21;\t\n\n\tpTxWI->TxWIWirelessCliID = WCID;\n\tpTxWI->TxWIMPDUByteCnt = Length; \n\t//pTxWI->TxWIPacketId = PID; \n\tpTxWI->TxWIPacketId = 7; \n\t\n\tpTxWI->TxWIBW = Transmit.field.BW;\n\tpTxWI->TxWIShortGI = Transmit.field.ShortGI;\n\tpTxWI->TxWISTBC= Transmit.field.STBC;\n\t\n\tpTxWI->TxWIMCS = Transmit.field.MCS;\n\tpTxWI->TxWIPHYMODE= Transmit.field.MODE;\n\tpTxWI->TxWICFACK = CfAck;\n\n\treturn;\n}\n\n\n/*\n========================================================================\n\tRoutine\tDescription:\n\t\tWrite TxInfo for ATE mode.\n\t\t\n\tReturn Value:\n\t\tNone\n========================================================================\n*/\nstatic VOID ATEWriteTxInfo(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTXINFO_STRUC *pTxInfo,\n\tIN\tUSHORT\t\tUSBDMApktLen,\n\tIN\tBOOLEAN\t\tbWiv,\n\tIN\tUCHAR\t\t\tQueueSel,\n\tIN\tUCHAR\t\t\tNextValid,\n\tIN\tUCHAR\t\t\tTxBurst)\n{\n#ifdef RLT_MAC\n\tstruct _TXINFO_NMAC_PKT *nmac_info;\n\n\tnmac_info = (struct _TXINFO_NMAC_PKT *)pTxInfo;\n\tnmac_info->pkt_80211 = 1;\n\tnmac_info->info_type = 0;\n\tnmac_info->d_port = 0;\n\tnmac_info->cso = 0;\n\tnmac_info->tso = 0;\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n\t/* ATE doesn't support checksum offload. */\n\tpTxInfo->TxInfoCSO = 1;\n\tpTxInfo->TxInfoUSO = 0;\n\tpTxInfo->TxInfoTCPOffset = 0;\n\tpTxInfo->TxInfoIPOffset = 0;\n#endif /* RTMP_MAC */\n\n\tpTxInfo->TxInfoPktLen = USBDMApktLen;\n\tpTxInfo->TxInfoQSEL = QueueSel;\n\n\tif (QueueSel != FIFO_EDCA)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"======= QueueSel != FIFO_EDCA =======\\n\"));\n\n\tpTxInfo->TxInfoUDMANextVld = NextValid;\n\tpTxInfo->TxInfoUDMATxburst = TxBurst;\n\tpTxInfo->TxInfoWIV = bWiv;\n#ifndef USB_BULK_BUF_ALIGMENT\n\tpTxInfo->TxInfoSwLstRnd = 0;\n#else\n\tpTxInfo->bFragLasAlignmentsectiontRound = 0;\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\treturn;\n}\n\n\nINT ATESetUpFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT32 TxIdx)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT pos = 0;\n\tPTX_CONTEXT\tpNullContext;\n\tPUCHAR\t\t\tpDest;\n\tHTTRANSMIT_SETTING\tTxHTPhyMode;\n\tTXWI_STRUC *pTxWI;\n\tTXINFO_STRUC *pTxInfo;\t\n\tUINT32\t\t\tTransferBufferLength, OrgBufferLength = 0;\n\tUCHAR\t\t\tpadLen = 0;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n#ifdef RALINK_QA\n\tPHEADER_802_11\tpHeader80211 = NULL;\n#endif /* RALINK_QA */\n\t\n\tif ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\treturn -1;\n\t}\n\n\t/* We always use QID_AC_BE and FIFO_EDCA in ATE mode. */\n\n\tpNullContext = &(pAd->NullContext[0]);\n\tASSERT(pNullContext != NULL);\n\t\n\tif (pNullContext->InUse == FALSE)\n\t{\n\t\t/* set the in use bit */\n\t\tpNullContext->InUse = TRUE;\n\t\tNdisZeroMemory(&(pAd->NullFrame), sizeof(HEADER_802_11));\n\t\t\n\t\t/* fill 802.11 header */\n#ifdef RALINK_QA\n\t\tif (pATEInfo->bQATxStart == TRUE) \n\t\t{\n\t\t\tpHeader80211 = NdisMoveMemory(&(pAd->NullFrame),\n\t\t\t\tpATEInfo->Header, pATEInfo->HLen);\n\t\t}\n\t\telse\n#endif /* RALINK_QA */\n\t\t{\n\t\t\tNdisMoveMemory(&(pAd->NullFrame), TemplateFrame,\n\t\t\tsizeof(HEADER_802_11));\n\t\t}\n\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, (PUCHAR)&(pAd->NullFrame), DIR_READ, FALSE);\n#endif /* RT_BIG_ENDIAN */\n\n#ifdef RALINK_QA\n\t\tif (pATEInfo->bQATxStart == TRUE) \n\t\t{\n\t\t\t/* modify sequence number... */\n\t\t\tif (pATEInfo->TxDoneCount == 0)\n\t\t\t{\n\t\t\t\tpATEInfo->seq = pHeader80211->Sequence;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpHeader80211->Sequence = ++pATEInfo->seq;\n\t\t\t}\n\t\t\t/* We already got all the address fields from QA GUI. */\n\t\t}\n\t\telse\n#endif /* RALINK_QA */\n\t\t{\n\t\t\tCOPY_MAC_ADDR(pAd->NullFrame.Addr1, pATEInfo->Addr1);\n\t\t\tCOPY_MAC_ADDR(pAd->NullFrame.Addr2, pATEInfo->Addr2);\n\t\t\tCOPY_MAC_ADDR(pAd->NullFrame.Addr3, pATEInfo->Addr3);\n\t\t}\n\n\t\tRTMPZeroMemory(&pAd->NullContext[0].TransferBuffer->field.WirelessPacket[0], TX_BUFFER_NORMSIZE);\n\t\tpTxInfo = (TXINFO_STRUC *)&pAd->NullContext[0].TransferBuffer->field.WirelessPacket[0];\n\n#ifdef RALINK_QA\n\t\tif (pATEInfo->bQATxStart == TRUE) \n\t\t{\n\t\t\t/* Avoid to exceed the range of WirelessPacket[]. */\n\t\t\tASSERT(pATEInfo->TxInfo.TxInfoPktLen <= (MAX_FRAME_SIZE - 34/* == 2312 */));\n\t\t\tNdisMoveMemory(pTxInfo, &(pATEInfo->TxInfo), sizeof(pATEInfo->TxInfo));\n\t\t}\n\t\telse\n#endif /* RALINK_QA */\n\t\t{\n\t\t\t/* Avoid to exceed the range of WirelessPacket[]. */\n\t\t\tASSERT(pATEInfo->TxLength <= (MAX_FRAME_SIZE - 34/* == 2312 */));\n\n\t\t\t/* pTxInfo->TxInfoPktLen will be updated to include padding later */\n\t\t\tATEWriteTxInfo(pAd, pTxInfo, (USHORT)(TXWISize + pATEInfo->TxLength)\n\t\t\t, TRUE, EpToQueue[MGMTPIPEIDX], FALSE,  FALSE);\n\t\t\tpTxInfo->TxInfoQSEL = FIFO_EDCA;\n\t\t}\n\n\t\tpTxWI = (TXWI_STRUC *)&pAd->NullContext[0].TransferBuffer->field.WirelessPacket[TXINFO_SIZE];\n\n\t\t/* fill TxWI */\n\t\tif (pATEInfo->bQATxStart == TRUE) \n\t\t{\n\t\t\tTxHTPhyMode.field.BW = pATEInfo->TxWI.TxWIBW;\n\t\t\tTxHTPhyMode.field.ShortGI = pATEInfo->TxWI.TxWIShortGI;\n\t\t\tTxHTPhyMode.field.STBC = pATEInfo->TxWI.TxWISTBC;\n\t\t\tTxHTPhyMode.field.MCS = pATEInfo->TxWI.TxWIMCS;\n\t\t\tTxHTPhyMode.field.MODE = pATEInfo->TxWI.TxWIPHYMODE;\n\t\t\tATEWriteTxWI(pAd, pTxWI, pATEInfo->TxWI.TxWIFRAG, pATEInfo->TxWI.TxWITS,\n\t\t\t\tpATEInfo->TxWI.TxWIAMPDU, pATEInfo->TxWI.TxWIACK, pATEInfo->TxWI.TxWINSEQ, \n\t\t\t\tpATEInfo->TxWI.TxWIBAWinSize, BSSID_WCID,\n\t\t\t\tpATEInfo->TxWI.TxWIMPDUByteCnt/* include 802.11 header */,\n\t\t\t\tpATEInfo->TxWI.TxWIPacketId,\n\t\t\t\t0, pATEInfo->TxWI.TxWITXOP/*IFS_HTTXOP*/, pATEInfo->TxWI.TxWICFACK\n\t\t\t\t/*FALSE*/, TxHTPhyMode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxHTPhyMode.field.BW = pATEInfo->TxWI.TxWIBW;\n\t\t\tTxHTPhyMode.field.ShortGI = pATEInfo->TxWI.TxWIShortGI;\n\t\t\tTxHTPhyMode.field.STBC = 0;\n\t\t\tTxHTPhyMode.field.MCS = pATEInfo->TxWI.TxWIMCS;\n\t\t\tTxHTPhyMode.field.MODE = pATEInfo->TxWI.TxWIPHYMODE;\n\n\t\t\tATEWriteTxWI(pAd, pTxWI,  FALSE, FALSE, FALSE, FALSE\n\t\t\t\t/* No ack required. */, FALSE, 0, BSSID_WCID, pATEInfo->TxLength,\n\t\t\t\t0, 0, IFS_HTTXOP, FALSE, TxHTPhyMode);\n\t\t}\n\n\t\thex_dump(\"ATE\", pAd->NullContext[0].TransferBuffer->field.WirelessPacket, 24);\n\t\tdump_txinfo(pAd, pTxInfo);\n\t\tdumpTxWI(pAd, pTxWI);\n\t\t\n\t\t\n\t\tRTMPMoveMemory(&pAd->NullContext[0].TransferBuffer->field.WirelessPacket[TXINFO_SIZE + TXWISize],\n\t\t\t&pAd->NullFrame, sizeof(HEADER_802_11));\n\n\t\tpDest = &(pAd->NullContext[0].TransferBuffer->field.WirelessPacket[TXINFO_SIZE + TXWISize + sizeof(HEADER_802_11)]);\n\n\t\t/* prepare frame payload */\n#ifdef RALINK_QA\n\t\tif (pATEInfo->bQATxStart == TRUE) \n\t\t{\n\t\t\t/* copy the pattern one by one to the frame payload */\n\t\t\tif ((pATEInfo->PLen != 0) && (pATEInfo->DLen != 0))\n\t\t\t{\n\t\t\t\tfor (pos = 0; pos < pATEInfo->DLen; pos += pATEInfo->PLen)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(pDest, pATEInfo->Pattern, pATEInfo->PLen);\n\t\t\t\t\tpDest += pATEInfo->PLen;\n\t\t\t\t}\n\t\t\t}\n\t\t\tTransferBufferLength = TXINFO_SIZE + TXWISize + pATEInfo->TxWI.TxWIMPDUByteCnt;\n\t\t}\n\t\telse\n#endif /* RALINK_QA */\n\t\t{\n\t\t    for (pos = 0; pos < (pATEInfo->TxLength - sizeof(HEADER_802_11)); pos++)\n\t\t    {\n\t\t\t\t/* default payload is 0xA5 */\n\t\t\t\t*pDest = pATEInfo->Payload;\n\t\t\t\tpDest += 1;\n\t\t    }\n\t\t\tTransferBufferLength = TXINFO_SIZE + TXWISize + pATEInfo->TxLength;\n\t\t}\n\n\t\tOrgBufferLength = TransferBufferLength;\n\t\tTransferBufferLength = (TransferBufferLength + 3) & (~3);\n\n\t\t/* Always add 4 extra bytes at every packet. */\n\t\tpadLen = TransferBufferLength - OrgBufferLength + 4;/* 4 == last packet padding */\n\n\t\t/* \n\t\t\tRTMP_PKT_TAIL_PADDING == 11.\n\t\t\t[11 == 3(max 4 byte padding) + 4(last packet padding) + 4(MaxBulkOutsize align padding)]\t\t\n\t\t*/\n\t\tASSERT((padLen <= (RTMP_PKT_TAIL_PADDING - 4/* 4 == MaxBulkOutsize alignment padding */)));\n\n\t\t/* Now memzero all extra padding bytes. */\n\t\tNdisZeroMemory(pDest, padLen);\n\t\tpDest += padLen;\n\n\t\t/* Update pTxInfo->TxInfoPktLen to include padding. */\n\t\tpTxInfo->TxInfoPktLen = TransferBufferLength - TXINFO_SIZE;\n\n\t\tTransferBufferLength += 4;\n\n\t\t/* If TransferBufferLength is multiple of 64, add extra 4 bytes again. */\n\t\tif ((TransferBufferLength % pAd->BulkOutMaxPacketSize) == 0)\n\t\t{\n\t\t\tNdisZeroMemory(pDest, 4);\n\t\t\tTransferBufferLength += 4;\n\t\t}\n\n\t\t/* Fill out frame length information for global Bulk out arbitor. */\n\t\tpAd->NullContext[0].BulkOutSize = TransferBufferLength;\n\t}\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPWIEndianChange(pAd, (PUCHAR)pTxWI, TYPE_TXWI);\n\tRTMPFrameEndianChange(pAd, (((PUCHAR)pTxInfo) + TXWISize + TXINFO_SIZE), DIR_WRITE, FALSE);\n\tRTMPDescriptorEndianChange((PUCHAR)pTxInfo, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n\n\thex_dump(\"ATE TX\", &pAd->NullContext[0].TransferBuffer->field.WirelessPacket[0], TXWISize + TXINFO_SIZE);\n\n\treturn 0;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\n========================================================================\n*/\nVOID ATE_RTUSBBulkOutDataPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBulkOutPipeId)\n{\n\tPTX_CONTEXT\t\tpNullContext = &(pAd->NullContext[0]);\n\tPURB\t\t\tpUrb;\n\tINT\t\t\tret = 0;\n\tULONG\t\t\tIrqFlags;\n\n\n\tASSERT(BulkOutPipeId == 0);\n\n\t/* Build up the frame first. */\n\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\n\tif (pAd->BulkOutPending[BulkOutPipeId] == TRUE)\n\t{\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\treturn;\n\t}\n\n\tpAd->BulkOutPending[BulkOutPipeId] = TRUE;\n\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\n\t/* Increase total transmit byte counter. */\n\tpAd->RalinkCounters.OneSecTransmittedByteCount +=  pNullContext->BulkOutSize; \n\tpAd->RalinkCounters.TransmittedByteCount +=  pNullContext->BulkOutSize;\n\n\t/* Clear ATE frame bulk out flag. */\n\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n\n\t/* Init Tx context descriptor. */\n\tpNullContext->IRPPending = TRUE;\n\tRTUSBInitTxDesc(pAd, pNullContext, BulkOutPipeId,\n\t\t(usb_complete_t)RTUSBBulkOutDataPacketComplete);\n\tpUrb = pNullContext->pUrb;\n\t\n\tif ((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t{\n\t\tDBGPRINT_ERR((\"ATE_RTUSBBulkOutDataPacket: Submit Tx URB failed %d\\n\", ret));\n\t\treturn;\n\t}\n\n\tpAd->BulkOutReq++;\n\n\treturn;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\n========================================================================\n*/\nVOID ATE_RTUSBCancelPendingBulkInIRP(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPRX_CONTEXT\t\tpRxContext = NULL;\n\tUINT\t\t\trx_ring_index;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->ATE_RTUSBCancelPendingBulkInIRP\\n\"));\n\n\tfor (rx_ring_index = 0; rx_ring_index < (RX_RING_SIZE); rx_ring_index++)\n\t{\n\t\tpRxContext = &(pAd->RxContext[rx_ring_index]);\n\n\t\tif (pRxContext->IRPPending == TRUE)\n\t\t{\n\t\t\tRTUSB_UNLINK_URB(pRxContext->pUrb);\n\t\t\tpRxContext->IRPPending = FALSE;\n\t\t\tpRxContext->InUse = FALSE;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---ATE_RTUSBCancelPendingBulkInIRP\\n\"));\n\n\treturn;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\n========================================================================\n*/\nVOID ATEResetBulkIn(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tif ((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tDBGPRINT_ERR((\"ATE : BulkIn IRP Pending!!!\\n\"));\n\t\tATE_RTUSBCancelPendingBulkInIRP(pAd);\n\t\tRtmpOsMsDelay(100);\n\t\tpAd->PendingRx = 0;\n\t}\n\n\treturn;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n========================================================================\n*/\nINT ATEResetBulkOut(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tPTX_CONTEXT\tpNullContext = &(pAd->NullContext);\n\tINT ret=0;\n\n\tpNullContext->IRPPending = TRUE;\n\n\t/*\n\t\tIf driver is still in ATE TXFRAME mode, \n\t\tkeep on transmitting ATE frames.\n\t*/\n\tDBGPRINT(RT_DEBUG_TRACE, (\"pATEInfo->Mode == %d\\npAd->ContinBulkOut == %d\\npAd->BulkOutRemained == %d\\n\",\n\t\tpATEInfo->Mode, pAd->ContinBulkOut, atomic_read(&pAd->BulkOutRemained)));\n\n\tif ((pATEInfo->Mode == ATE_TXFRAME) && ((pAd->ContinBulkOut == TRUE) || (atomic_read(&pAd->BulkOutRemained) > 0)))\n    {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"After CMDTHREAD_RESET_BULK_OUT, continue to bulk out frames !\\n\"));\n\n\t\t/* Init Tx context descriptor. */\n\t\tRTUSBInitTxDesc(pAd, pNullContext, 0/* pAd->bulkResetPipeid */, (usb_complete_t)RTUSBBulkOutDataPacketComplete);\n\t\t\n\t\tif ((ret = RTUSB_SUBMIT_URB(pNullContext->pUrb))!=0)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"ATE_RTUSBBulkOutDataPacket: Submit Tx URB failed %d\\n\", ret));\n\t\t}\n\n\t\tpAd->BulkOutReq++;\n\t}\n\n\treturn ret;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL = \n\t\n\tNote:\n\t\n========================================================================\n*/\nVOID RTUSBRejectPendingPackets(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\t\t\tIndex;\n\tPQUEUE_ENTRY\tpEntry;\n\tPNDIS_PACKET\tpPacket;\n\tPQUEUE_HEADER\tpQueue;\n\t\n\n\tfor (Index = 0; Index < 4; Index++)\n\t{\n\t\tNdisAcquireSpinLock(&pAd->TxSwQueueLock[Index]);\n\t\twhile (pAd->TxSwQueue[Index].Head != NULL)\n\t\t{\n\t\t\tpQueue = (PQUEUE_HEADER) &(pAd->TxSwQueue[Index]);\n\t\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t}\n\t\tNdisReleaseSpinLock(&pAd->TxSwQueueLock[Index]);\n\n\t}\n\n}\n\n#endif /* RTMP_MAC_USB */\n\n"
  },
  {
    "path": "src/ate/common/rt_ate.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n \n \tModule Name:\n\trt_ate.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n*/\n#include \"rt_config.h\"\n \n#define ATE_BBP_REG_NUM\t168\nUCHAR restore_BBP[ATE_BBP_REG_NUM]={0};\n\n/* 802.11 MAC Header, Type:Data, Length:24bytes + 6 bytes QOS/HTC + 2 bytes padding */\nUCHAR TemplateFrame[32] = {0x08,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n\t\t0x00,0xAA,0xBB,0x12,0x34,0x56,0x00,0x11,0x22,0xAA,0xBB,0xCC,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};\n\nextern FREQUENCY_ITEM *FreqItems3020;\nextern UCHAR NUM_OF_3020_CHNL;\n\nstatic UINT32 Default_TX_PIN_CFG;\n#define RA_TX_PIN_CFG 0x1328\n#define TXCONT_TX_PIN_CFG_A 0x040C0050\n#define TXCONT_TX_PIN_CFG_G 0x080C00A0\n\n#define ATE_TASK_EXEC_INTV 100\t\t// 1000 -> 100\n\nstatic CHAR CCKRateTable[] = {0, 1, 2, 3, 8, 9, 10, 11, -1}; /* CCK Mode. */\nstatic CHAR OFDMRateTable[] = {0, 1, 2, 3, 4, 5, 6, 7, -1}; /* OFDM Mode. */\n#ifdef DOT11N_SS3_SUPPORT\nstatic CHAR HTMIXRateTable3T3R[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1}; /* HT Mix Mode for 3*3. */\n#endif /* DOT11N_SS3_SUPPORT */\nstatic CHAR HTMIXRateTable[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1}; /* HT Mix Mode. */\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\n/* The desired TSSI over CCK */\nextern CHAR desiredTSSIOverCCK[4];\n\n/* The desired TSSI over OFDM */\nextern CHAR desiredTSSIOverOFDM[8];\n\n/* The desired TSSI over HT */\nextern CHAR desiredTSSIOverHT[8];\n\n/* The desired TSSI over HT using STBC */\nextern CHAR desiredTSSIOverHTUsingSTBC[8];\n\n/* The Tx power tuning entry*/\nextern TX_POWER_TUNING_ENTRY_STRUCT TxPowerTuningTable[];\n\n/*\n==========================================================================\n\tDescription:\n\t\tGet the desired TSSI based on ATE setting.\n\n\tArguments:\n\t\tpAd\n\n\tReturn Value:\n\t\tThe desired TSSI\n==========================================================================\n */\n #ifdef MT7601\nCHAR ATEGetDesiredTSSI(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Currently not support singledriver.\\n\", __FUNCTION__));\n\treturn 0;\n\n }\n #else\nCHAR ATEGetDesiredTSSI(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR desiredTSSI = 0;\n\tUCHAR MCS = 0;\n\tUCHAR MaxMCS = 7;\n\n\tMCS = (UCHAR)(pATEInfo->TxWI.TxWIMCS);\n\t\n\tif (pATEInfo->TxWI.TxWIPHYMODE == MODE_CCK)\n\t{\n\t\tif (MCS > 3) /* boundary verification */\n\t\t{\n\t\t\tDBGPRINT_ERR((\"%s: incorrect MCS: MCS = %d\\n\", \n\t\t\t\t__FUNCTION__, \n\t\t\t\tMCS));\n\t\t\t\n\t\t\tMCS = 0;\n\t\t}\n\t\n\t\tdesiredTSSI = desiredTSSIOverCCK[MCS];\n\t}\n\telse if (pATEInfo->TxWI.TxWIPHYMODE == MODE_OFDM)\n\t{\n\t\tif (MCS > 7) /* boundary verification */\n\t\t{\n\t\t\tDBGPRINT_ERR((\"%s: incorrect MCS: MCS = %d\\n\", \n\t\t\t\t__FUNCTION__, \n\t\t\t\tMCS));\n\n\t\t\tMCS = 0;\n\t\t}\n\n\t\tdesiredTSSI = desiredTSSIOverOFDM[MCS];\n\t}\n\telse if ((pATEInfo->TxWI.TxWIPHYMODE == MODE_HTMIX) || (pATEInfo->TxWI.TxWIPHYMODE == MODE_HTGREENFIELD))\n\t{\n\t\tif (pATEInfo->TxWI.TxWISTBC == STBC_NONE)\n\t\t{\n\t\t\tif (MCS > MaxMCS) /* boundary verification */\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"%s: incorrect MCS: MCS = %d\\n\", \n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tMCS));\n\n\t\t\t\tMCS = 0;\n\t\t\t}\n\n\t\t\tdesiredTSSI = desiredTSSIOverHT[MCS];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (MCS > MaxMCS) /* boundary verification */\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"%s: incorrect MCS: MCS = %d\\n\", \n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tMCS));\n\n\t\t\t\tMCS = 0;\n\t\t\t}\n\n\t\t\tdesiredTSSI = desiredTSSIOverHTUsingSTBC[MCS];\n\t\t}\n\n\t\t\n\t\t/* \n\t\t\tFor HT BW40 MCS 7 with/without STBC configuration, \n\t\t\tthe desired TSSI value should subtract one from the formula.\n\t\t*/\n\t\tif ((pATEInfo->TxWI.TxWIBW == BW_40) && (MCS == MCS_7))\n\t\t{\n\t\t\tdesiredTSSI -= 1;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: desiredTSSI = %d, Latest Tx setting: MODE = %d, MCS = %d, STBC = %d\\n\", \n\t\t__FUNCTION__, \n\t\tdesiredTSSI, \n\t\tpATEInfo->TxWI.TxWIPHYMODE, \n\t\tpATEInfo->TxWI.TxWIMCS, \n\t\tpATEInfo->TxWI.TxWISTBC));\n\n\n\treturn desiredTSSI;\n}\n#endif /* MT7601 */\n\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\n/*\n==========================================================================\n\tDescription:\n\t\tGives CCK TX rate 2 more dB TX power.\n\t\tThis routine works only in ATE mode.\n\n\t\tcalculate desired Tx power in RF R3.Tx0~5,\tshould consider -\n\t\t0. TxPowerPercentage\n\t\t1. auto calibration based on TSSI feedback\n\t\t2. extra 2 db for CCK\n\t\t3. -10 db upon very-short distance (AvgRSSI >= -40db) to AP\n\n==========================================================================\n*/\nVOID DefaultATEAsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPATE_INFO   pATEInfo = &(pAd->ate);\n\tPATE_CHIP_STRUCT pChipStruct = pATEInfo->pChipStruct;\n\tINT\t\t\tindex = 0, inner_index = 0, maxTxPwrCnt;\n\tCHAR\t\tDeltaPwr = 0;\n\tBOOLEAN\t\tbAutoTxAgc = FALSE;\n\tUCHAR\t\tTssiRef, *pTssiMinusBoundary, *pTssiPlusBoundary, TxAgcStep;\n\tUCHAR\t\tBbpR49 = 0, idx;\n\tPCHAR\t\tpTxAgcCompensate;\n\tULONG\t\tTxPwr[9];\t/* NOTE: the TxPwr array size should be the maxima value of all supported chipset!!!! */\n\tCHAR\t\tValue;\n#ifdef RTMP_INTERNAL_TX_ALC\n\t/* (non-positive number) including the transmit power controlled by the MAC and the BBP R1 */    \n\tCHAR TotalDeltaPower = 0; \n\tUCHAR desiredTSSI = 0, currentTSSI = 0;\n\tconst TX_POWER_TUNING_ENTRY_STRUCT *TxPowerTuningTable = pAd->chipCap.TxPowerTuningTable_2G;\n\tPTX_POWER_TUNING_ENTRY_STRUCT pTxPowerTuningEntry = NULL;\n\tUCHAR RFValue = 0, TmpValue = 0;   \n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\tmaxTxPwrCnt = pChipStruct->maxTxPwrCnt;\n\n\tif (pATEInfo->TxWI.TxWIBW == BW_40)\n\t{\n\t\tif (pATEInfo->Channel > 14)\n\t\t{\n\t\t\tfor (index =0 ; index < maxTxPwrCnt; index ++)\n\t\t\t{\n\t\t\t\tTxPwr[index] = pAd->Tx40MPwrCfgABand[index];\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (index =0 ; index < maxTxPwrCnt; index ++)\n\t\t\t{\n\t\t\t\tTxPwr[index] = pAd->Tx40MPwrCfgGBand[index];\t\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (pATEInfo->Channel > 14)\n\t\t{\n\t\t\tfor (index =0 ; index < maxTxPwrCnt; index ++)\n\t\t\t{\n\t\t\t\tTxPwr[index] = pAd->Tx20MPwrCfgABand[index];\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (index =0 ; index < maxTxPwrCnt; index ++)\n\t\t\t{\n\t\t\t\tTxPwr[index] = pAd->Tx20MPwrCfgGBand[index];\t\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\t/* Locate the internal Tx ALC tuning entry */\n\tif (pAd->TxPowerCtrl.bInternalTxALC == TRUE)\n\t{\n\t\t{\n\t\t\tdesiredTSSI = ATEGetDesiredTSSI(pAd);\n\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49);\n\n\t\t\tcurrentTSSI = BbpR49 & 0x1F;\n\n\t\t\tif (pAd->TxPowerCtrl.bExtendedTssiMode == TRUE) /* Per-channel TSSI */\n\t\t\t{\n\t\t\t\tif ((pATEInfo->Channel >= 1) && (pATEInfo->Channel <= 14))\t\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: bExtendedTssiMode = %d, original desiredTSSI = %d, CentralChannel = %d, PerChTxPwrOffset = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\t\tpAd->TxPowerCtrl.bExtendedTssiMode, \n\t\t\t\t\t\tdesiredTSSI, \n\t\t\t\t\t\tpATEInfo->Channel, \n\t\t\t\t\t\tpAd->TxPowerCtrl.PerChTxPwrOffset[pATEInfo->Channel]));\n\n\t\t\t\t\tdesiredTSSI += pAd->TxPowerCtrl.PerChTxPwrOffset[pATEInfo->Channel];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (desiredTSSI > 0x1F)\n\t\t\t{\n\t\t\t\tdesiredTSSI = 0x1F;\n\t\t\t}\n\n\t\t\tif (desiredTSSI > currentTSSI)\n\t\t\t{\n\t\t\t\tpAd->TxPowerCtrl.idxTxPowerTable++;\n\t\t\t}\n\n\t\t\tif (desiredTSSI < currentTSSI)\n\t\t\t{\n\t\t\t\tpAd->TxPowerCtrl.idxTxPowerTable--;\n\t\t\t}\n\n\t\t\tif (pAd->TxPowerCtrl.idxTxPowerTable < LOWERBOUND_TX_POWER_TUNING_ENTRY)\n\t\t\t{\n\t\t\t\tpAd->TxPowerCtrl.idxTxPowerTable = LOWERBOUND_TX_POWER_TUNING_ENTRY;\n\t\t\t}\n\n\t\t\tif (pAd->TxPowerCtrl.idxTxPowerTable >= UPPERBOUND_TX_POWER_TUNING_ENTRY(pAd))\n\t\t\t{\n\t\t\t\tpAd->TxPowerCtrl.idxTxPowerTable = UPPERBOUND_TX_POWER_TUNING_ENTRY(pAd);\n\t\t\t}\n\n\t\t\t/* Valid pAd->TxPowerCtrl.idxTxPowerTable: -30 ~ 45 */\n\t\t\tpTxPowerTuningEntry = &TxPowerTuningTable[pAd->TxPowerCtrl.idxTxPowerTable + TX_POWER_TUNING_ENTRY_OFFSET]; /* zero-based array */\n\t\t\tpAd->TxPowerCtrl.RF_TX_ALC = pTxPowerTuningEntry->RF_TX_ALC;\n\t\t\tpAd->TxPowerCtrl.MAC_PowerDelta = pTxPowerTuningEntry->MAC_PowerDelta;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->TxPowerCtrl.idxTxPowerTable = %d, pAd->TxPowerCtrl.RF_TX_ALC = %d, pAd->TxPowerCtrl.MAC_PowerDelta = %d\\n\", \n\t\t\t        pAd->TxPowerCtrl.idxTxPowerTable, pAd->TxPowerCtrl.RF_TX_ALC, pAd->TxPowerCtrl.MAC_PowerDelta  ));\n\n\t\t\t/* Tx power adjustment over RF */\n\t\t\t/* In ATE mode, only adjust TX0_ALC by default. */\n\t\t\tif (IS_RT5350(pAd))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MT7601 Bata driver not support RT30xxReadRFRegister() and RT30xxWriteRFRegister().\\n\"));\n\t\t\t}\n\t\t\telse if (IS_RT3352(pAd))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MT7601 Bata driver not support RT30xxReadRFRegister() and RT30xxWriteRFRegister().\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MT7601 Bata driver not support RT30xxReadRFRegister() and RT30xxWriteRFRegister().\\n\"));\n\t\t\t}\n\n\t\t\t/* Tx power adjustment over MAC */\n \t\t\tTotalDeltaPower += pAd->TxPowerCtrl.MAC_PowerDelta;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: desiredTSSI = %d, currentTSSI = %d, idxTxPowerTable = %d, {RF_TX_ALC = %d, MAC_PowerDelta = %d}\\n\", \n\t\t\t        __FUNCTION__, \n\t\t\t        desiredTSSI, \n\t\t\t        currentTSSI, \n\t\t\t        pAd->TxPowerCtrl.idxTxPowerTable, \n\t\t\t        pTxPowerTuningEntry->RF_TX_ALC, \n\t\t\t        pTxPowerTuningEntry->MAC_PowerDelta));\n\t\t}\n\t}\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\t/* TX power compensation for temperature variation based on TSSI. */\n\t/* Do it per 4 seconds. */\n\tif (pATEInfo->OneSecPeriodicRound % 4 == 0)\n\t{\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\t/* bg channel */\n\t\t\tbAutoTxAgc         = pAd->bAutoTxAgcG;\n\t\t\tTssiRef            = pAd->TssiRefG;\n\t\t\tpTssiMinusBoundary = &pAd->TssiMinusBoundaryG[0];\n\t\t\tpTssiPlusBoundary  = &pAd->TssiPlusBoundaryG[0];\n\t\t\tTxAgcStep          = pAd->TxAgcStepG;\n\t\t\tpTxAgcCompensate   = &pAd->TxAgcCompensateG;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* a channel */\n\t\t\tbAutoTxAgc         = pAd->bAutoTxAgcA;\n\t\t\tTssiRef            = pAd->TssiRefA;\n\t\t\tpTssiMinusBoundary = &pAd->TssiMinusBoundaryA[0];\n\t\t\tpTssiPlusBoundary  = &pAd->TssiPlusBoundaryA[0];\n\t\t\tTxAgcStep          = pAd->TxAgcStepA;\n\t\t\tpTxAgcCompensate   = &pAd->TxAgcCompensateA;\n\t\t}\n\n\t\tif (bAutoTxAgc)\n\t\t{\n\t\t\t/* BbpR49 is unsigned char. */\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49);\n\n\t\t\t/* (p) TssiPlusBoundaryG[0] = 0 = (m) TssiMinusBoundaryG[0] */\n\t\t\t/* compensate: +4     +3   +2   +1    0   -1   -2   -3   -4 * steps */\n\t\t\t/* step value is defined in pAd->TxAgcStepG for tx power value */\n\n\t\t\t/* [4]+1+[4]   p4     p3   p2   p1   o1   m1   m2   m3   m4 */\n\t\t\t/* ex:         0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0\n\t\t\t   above value are examined in mass factory production */\n\t\t\t/*             [4]    [3]  [2]  [1]  [0]  [1]  [2]  [3]  [4] */\n\n\t\t\t/* plus is 0x10 ~ 0x40, minus is 0x60 ~ 0x90 */\n\t\t\t/* if value is between p1 ~ o1 or o1 ~ s1, no need to adjust tx power */\n\t\t\t/* if value is 0x65, tx power will be -= TxAgcStep*(2-1) */\n\n\t\t\tif (BbpR49 > pTssiMinusBoundary[1])\n\t\t\t{\n\t\t\t\t/* Reading is larger than the reference value. */\n\t\t\t\t/* Check for how large we need to decrease the Tx power. */\n\t\t\t\tfor (idx = 1; idx < 5; idx++)\n\t\t\t\t{\n\t\t\t\t\t/* Found the range. */\n\t\t\t\t\tif (BbpR49 <= pTssiMinusBoundary[idx])  \n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* The index is the step we should decrease, idx = 0 means there is nothing to compensate. */\n\t\t\t\t*pTxAgcCompensate = -(TxAgcStep * (idx-1));\n\t\t\t\t\n\t\t\t\tDeltaPwr += (*pTxAgcCompensate);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"-- Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = -%d\\n\",\n\t\t\t\t\tBbpR49, TssiRef, TxAgcStep, idx-1));                    \n\t\t\t}\n\t\t\telse if (BbpR49 < pTssiPlusBoundary[1])\n\t\t\t{\n\t\t\t\t/* Reading is smaller than the reference value. */\n\t\t\t\t/* Check for how large we need to increase the Tx power. */\n\t\t\t\tfor (idx = 1; idx < 5; idx++)\n\t\t\t\t{\n\t\t\t\t\t/* Found the range. */\n\t\t\t\t\tif (BbpR49 >= pTssiPlusBoundary[idx])   \n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* The index is the step we should increase, idx = 0 means there is nothing to compensate. */\n\t\t\t\t*pTxAgcCompensate = TxAgcStep * (idx-1);\n\t\t\t\tDeltaPwr += (*pTxAgcCompensate);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"++ Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\\n\",\n\t\t\t\t\tBbpR49, TssiRef, TxAgcStep, idx-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*pTxAgcCompensate = 0;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"   Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\\n\",\n\t\t\t\t\tBbpR49, TssiRef, TxAgcStep, 0));\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\tbAutoTxAgc         = pAd->bAutoTxAgcG;\n\t\t\tpTxAgcCompensate   = &pAd->TxAgcCompensateG;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbAutoTxAgc         = pAd->bAutoTxAgcA;\n\t\t\tpTxAgcCompensate   = &pAd->TxAgcCompensateA;\n\t\t}\n\n\t\tif (bAutoTxAgc)\n\t\t\tDeltaPwr += (*pTxAgcCompensate);\n\t}\n\n\t/* Reset different new tx power for different TX rate. */\n\tfor (index=0; index<maxTxPwrCnt; index++)\n\t{\n\t\tif (TxPwr[index] != 0xffffffff)\n\t\t{\n\t\t\tfor (inner_index=0; inner_index<8; inner_index++)\n\t\t\t{\n\t\t\t\tValue = (CHAR)((TxPwr[index] >> inner_index*4) & 0x0F); /* 0 ~ 15 */\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\t\t\t\t/*\n\t\t\t\t\tThe upper bounds of the MAC 0x1314~0x1324 \n\t\t\t\t\tare variable when the STA uses the internal Tx ALC.\n\t\t\t\t*/\n\t\t\t\tif (pAd->TxPowerCtrl.bInternalTxALC == TRUE)\n\t\t\t\t{\n\t\t\t\t\tswitch (TX_PWR_CFG_0 + (index * 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tcase TX_PWR_CFG_0: \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tValue = 0xE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TX_PWR_CFG_1: \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((inner_index >= 0) && (inner_index <= 3))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xC)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0xC;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0xE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TX_PWR_CFG_2: \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((inner_index == 0) || (inner_index == 2) || (inner_index == 3))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xC)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0xC;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0xE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TX_PWR_CFG_3: \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((inner_index == 0) || (inner_index == 2) || (inner_index == 3) || \n\t\t\t\t\t\t\t((inner_index >= 4) && (inner_index <= 7)))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xC)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0xC;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue = 0xE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TX_PWR_CFG_4: \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((Value + TotalDeltaPower) < 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tValue = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((Value + TotalDeltaPower) > 0xC)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tValue = 0xC;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tValue += TotalDeltaPower;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: \n\t\t\t\t\t\t{                                                      \n\t\t\t\t\t\t\t/* do nothing */\n\t\t\t\t\t\t\tDBGPRINT_ERR((\"%s : unknown register = 0x%X\\n\", \n\t\t\t\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\t\t\t(TX_PWR_CFG_0 + (index << 2))));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t\t\t\t{\n\t\t\t\t\tif ((Value + DeltaPwr) < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tValue = 0; /* min */\n\t\t\t\t\t}\n\t\t\t\t\telse if ((Value + DeltaPwr) > 0xF)\n\t\t\t\t\t{\n\t\t\t\t\t\tValue = 0xF; /* max */\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tValue += DeltaPwr; /* temperature compensation */\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* fill new value to CSR offset */\n\t\t\t\tTxPwr[index] = (TxPwr[index] & ~(0x0000000F << inner_index*4)) | (Value << inner_index*4);\n\t\t\t}\n\n\t\t\t/* write tx power value to CSR */\n\t\t\t/* \n\t\t\t\tTX_PWR_CFG_0 (8 tx rate) for\tTX power for OFDM 12M/18M\n\t\t\t\t\t\t\t\t\t\t\t\tTX power for OFDM 6M/9M\n\t\t\t\t\t\t\t\t\t\t\t\tTX power for CCK5.5M/11M\n\t\t\t\t\t\t\t\t\t\t\t\tTX power for CCK1M/2M\n\t\t\t*/\n\t\t\t/* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tif (IS_RT2883(pAd) || IS_RT3883(pAd))\n\t\t\t{\n\t\t\t\tif (index == 5)\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_5, TxPwr[index]);\n\t\t\t\t}\n\t\t\t\telse if (index == 6)\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_6, TxPwr[index]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + (index << 2), TxPwr[index]);\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0_EXT + (index << 2), (TxPwr[index] & 0xf0f0f0f0) >> 4);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + (index << 2), TxPwr[index]);\n\t\t\t}\t\n#else\n\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + (index << 2), TxPwr[index]);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ATEAsicAdjustTxPower - DeltaPwr=%d, offset=0x%x, TxPwr=%lx, BbpR1=%x, round=%ld, pTxAgcCompensate=%d \\n\",\n\t\t\t\tDeltaPwr, TX_PWR_CFG_0 + (index << 2), TxPwr[index], BbpR49, pATEInfo->OneSecPeriodicRound, *pTxAgcCompensate));\n\t\t\t\n\t\t}\n\t}\n\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t\tGives CCK TX rate 2 more dB TX power.\n\t\tThis routine works only in ATE mode.\n\n\t\tcalculate desired Tx power in RF R3.Tx0~5,\tshould consider -\n\t\t0. TxPowerPercentage\n\t\t1. auto calibration based on TSSI feedback\n\t\t2. extra 2 db for CCK\n\t\t3. -10 db upon very-short distance (AvgRSSI >= -40db) to AP\n\n==========================================================================\n*/\nVOID ATEAsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->AdjustTxPower != NULL)\n\t\tpATEInfo->pChipStruct->AdjustTxPower(pAd);\n\telse\n\t\tDBGPRINT_ERR((\"%s: AdjustTxPower() for this chipset does not exist !\\n\", __FUNCTION__));\n\n\treturn;\n}\n\n\nCHAR ATEConvertToRssi(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tCHAR\tRssi,\n\tIN  UCHAR   RssiNumber)\n{\n\tUCHAR\tRssiOffset, LNAGain;\n\n\t/* Rssi equals to zero should be an invalid value */\n\tif (Rssi == 0 || (RssiNumber >= 3))\n\t\treturn -99;\n\t\n\tLNAGain = GET_LNA_GAIN(pAd);\n\tif (pAd->LatchRfRegs.Channel > 14)\n\t\tRssiOffset = pAd->ARssiOffset[RssiNumber];\n\telse\n\t\tRssiOffset = pAd->BGRssiOffset[RssiNumber];\n\n\treturn (-12 - RssiOffset - LNAGain - Rssi);\n}\n\n\nVOID ATESampleRssi(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RXWI_STRUC *pRxWI)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pRxWI->RxWIRSSI0 != 0)\n\t{\n\t\tpATEInfo->LastRssi0\t= ATEConvertToRssi(pAd, (CHAR) pRxWI->RxWIRSSI0, RSSI_0);\n\t\tpATEInfo->AvgRssi0X8 = (pATEInfo->AvgRssi0X8 - pATEInfo->AvgRssi0) + pATEInfo->LastRssi0;\n\t\tpATEInfo->AvgRssi0 = pATEInfo->AvgRssi0X8 >> 3;\n\t}\n\n\tif (pRxWI->RxWIRSSI1 != 0)\n\t{\n\t\tpATEInfo->LastRssi1\t= ATEConvertToRssi(pAd, (CHAR) pRxWI->RxWIRSSI1, RSSI_1);\n\t\tpATEInfo->AvgRssi1X8 = (pATEInfo->AvgRssi1X8 - pATEInfo->AvgRssi1) + pATEInfo->LastRssi1;\n\t\tpATEInfo->AvgRssi1 = pATEInfo->AvgRssi1X8 >> 3;\n\t}\n\n\tif (pRxWI->RxWIRSSI2 != 0)\n\t{\n\t\tpATEInfo->LastRssi2\t= ATEConvertToRssi(pAd, (CHAR) pRxWI->RxWIRSSI2, RSSI_2);\n\t\tpATEInfo->AvgRssi2X8 = (pATEInfo->AvgRssi2X8 - pATEInfo->AvgRssi2) + pATEInfo->LastRssi2;\n\t\tpATEInfo->AvgRssi2 = pATEInfo->AvgRssi2X8 >> 3;\n\t}\n\n\tpATEInfo->LastSNR0 = (CHAR)(pRxWI->RxWIRSSI0);\n\tpATEInfo->LastSNR1 = (CHAR)(pRxWI->RxWIRSSI1);\n#ifdef DOT11N_SS3_SUPPORT\n\tpATEInfo->LastSNR2 = (CHAR)(pRxWI->RxWIRSSI2);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\tpATEInfo->NumOfAvgRssiSample ++;\n\n\treturn;\n}\n\n\nVOID rt_ee_read_all(PRTMP_ADAPTER pAd, USHORT *Data)\n{\n\tUSHORT offset = 0;\n\tUSHORT value;\n\n\n\tfor (offset = 0; offset < (EEPROM_SIZE >> 1);)\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, (offset << 1), value);\n\t\tData[offset] = value;\n\t\toffset++;\n\t}\n\n\treturn;\n}\n\n\nVOID rt_ee_write_all(PRTMP_ADAPTER pAd, USHORT *Data)\n{\n\tUSHORT offset = 0;\n\tUSHORT value;\n\n\n#ifdef RTMP_FLASH_SUPPORT\n\tif (pAd->infType == RTMP_DEV_INF_USB)\n\t{\n\t\t/* for RT3352+RT3572 solution */\n\t\trtmp_ee_flash_write_all(pAd, Data);\n\t\treturn;\n\t}\n#endif /* RTMP_FLASH_SUPPORT */\n\n#ifdef RTMP_USB_SUPPORT\n\tif (pAd->infType == RTMP_DEV_INF_USB)\n\t{\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t{\n\t\t\tUSHORT\tlength = 0x100;\n\t\t\tUCHAR\t*ptr = (UCHAR *)Data;\n\t\t\tUCHAR\tindex;\n\t\t\tUCHAR\tAllFF[16] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };\n\t\t\tfor ( offset = 0 ; offset < length ; offset += 16 )\n\t\t\t{\n\t\t\t\tif ( memcmp( ptr, AllFF, 16 ) )\n\t\t\t\t{\n\t\t\t\t\tfor ( index = 0 ; index < 16 ; index += 2 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = *(USHORT *)(ptr + index);\n\t\t\t\t\t\teFuseWrite(pAd, offset + index ,&value, 2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tptr += 16;\n\t\t\t}\n\t\t\tpAd->bCalFreeIC = FALSE;\n\t\t\treturn;\n\t\t}\n\t\telse\n#endif /* MT7601 */\n\t\t{\n\t\t\tUSHORT offset = 0;\n\t\t\tUSHORT length = EEPROM_SIZE;\n\n\t\t\tRTUSBWriteEEPROM(pAd, offset, (UCHAR *)Data, length);\n\t\t\treturn;\n\t\t}\n\t}\n#endif /* RTMP_USB_SUPPORT */\n\n\tfor (offset = 0; offset < (EEPROM_SIZE >> 1);)\n\t{\n\t\tvalue = Data[offset];\n\t\tRT28xx_EEPROM_WRITE16(pAd, (offset << 1), value);\n\t\toffset++;\n\t}\n\n\treturn;\n}\n\n\nVOID rt_ee_write_bulk(PRTMP_ADAPTER pAd, USHORT *Data, USHORT offset, USHORT length)\n{\n\tUSHORT pos;\n\tUSHORT value;\n\tUSHORT len = length;\n\n\n\tfor (pos = 0; pos < (len >> 1);)\n\t{\n\t\tvalue = Data[pos];\n\t\tRT28xx_EEPROM_WRITE16(pAd, offset+(pos*2), value);\n\t\tpos++;\n\t}\n\n\treturn;\n}\n\n\nVOID RtmpRfIoWrite(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/* Set RF value 1's set R3[bit2] = [0] */\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);\n\tRTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);\n\n\tRTMPusecDelay(200);\n\n\t/* Set RF value 2's set R3[bit2] = [1] */\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);\n\tRTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 | 0x04));\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);\n\n\tRTMPusecDelay(200);\n\n\t/* Set RF value 3's set R3[bit2] = [0] */\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);\n\tRTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);\n\n\treturn;\n}\n\n\nVOID DefaultATEAsicSetTxRxPath(\n    IN PRTMP_ADAPTER pAd)\n{\n\n}\n\n\nVOID ATEAsicSetTxRxPath(\n    IN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->AsicSetTxRxPath != NULL)\n\t\tpATEInfo->pChipStruct->AsicSetTxRxPath(pAd);\n\n\treturn;\n}\n\n\n/*\n==========================================================================\n    Description:\n\n\tDefault AsicSwitchChannel() dedicated for ATE.\n    \n==========================================================================\n*/\nVOID DefaultATEAsicSwitchChannel(\n    IN PRTMP_ADAPTER pAd) \n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32 Value = 0;\n\tCHAR TxPwer = 0, TxPwer2 = 0;\n\tUCHAR BbpValue = 0, R66 = 0x30, Channel = 0;\n\n\tSYNC_CHANNEL_WITH_QA(pATEInfo, &Channel);\n\n\t/* fill Tx power value */\n\tTxPwer = pATEInfo->TxPower0;\n\tTxPwer2 = pATEInfo->TxPower1;\n\n\t/* Change BBP setting during switch from a->g, g->a */\n\tif (Channel <= 14)\n\t{\n\t\tUINT32 TxPinCfg = 0x00050F0A;/* 2007.10.09 by Brian : 0x0005050A ==> 0x00050F0A */\n\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));\n\n\t\t/* Rx High power VGA offset for LNA select */\n\t\tif (pAd->NicConfig2.field.ExternalLNAForG)\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84);\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);\n\t\t}\n\n\t\t/* 2.4 G band selection PIN */\n\t\tRTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);\n\t\tValue &= (~0x6);\n\t\tValue |= (0x04);\n\t\tRTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);\n\n\t\t/* Turn off unused PA or LNA when only 1T or 1R. */\n\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFFFF3;\n\t\t}\n\t\tif (pAd->Antenna.field.RxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFF3FF;\n\t\t}\n\n\t\t/* calibration power unbalance issues */\n\t\tif (pAd->Antenna.field.TxPath == 2)\n\t\t{\n\t\t\tif (pATEInfo->TxAntennaSel == 1)\n\t\t\t{\n\t\t\t\tTxPinCfg &= 0xFFFFFFF7;\n\t\t\t}\n\t\t\telse if (pATEInfo->TxAntennaSel == 2)\n\t\t\t{\n\t\t\t\tTxPinCfg &= 0xFFFFFFFD;\n\t\t\t}\n\t\t}\n\n\t\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\t}\n\t/* channel > 14 */\n\telse\n\t{\n\t    UINT32\tTxPinCfg = 0x00050F05;/* 2007.10.09 by Brian : 0x00050505 ==> 0x00050F05 */\n\t\t\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));\n\n\t\t/* According the Rory's suggestion to solve the middle range issue. */\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);        \n\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2);\n\n\t\t/* Rx High power VGA offset for LNA select */\n\t\tif (pAd->NicConfig2.field.ExternalLNAForA)\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);\n\t\t}\n\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R91, &BbpValue);\n\t\tASSERT((BbpValue == 0x04));\n\n\t\t/* 5 G band selection PIN, bit1 and bit2 are complement */\n\t\tRTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);\n\t\tValue &= (~0x6);\n\t\tValue |= (0x02);\n\t\tRTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);\n\n\t\t/* Turn off unused PA or LNA when only 1T or 1R. */\n\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFFFF3;\n\t\t}\n\n\t\tif (pAd->Antenna.field.RxPath == 1)\n\t\t{\n\t\t\tTxPinCfg &= 0xFFFFF3FF;\n\t\t}\n\n\t\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\t}\n\n\t/* R66 should be set according to Channel. */\n\tif (Channel <= 14)\n\t{\t\n\t\t/* BG band */\n\t\tR66 = 0x2E + GET_LNA_GAIN(pAd);\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);\n\t}\n\telse\n\t{\t\n\t\t/* A band, BW == 20 */\n\t\tif (pATEInfo->TxWI.TxWIBW == BW_20)\n\t\t{\n\t\t\tR66 = (UCHAR)(0x32 + (GET_LNA_GAIN(pAd)*5)/3);\n    \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* A band, BW == 40 */\n\t\t\tR66 = (UCHAR)(0x3A + (GET_LNA_GAIN(pAd)*5)/3);\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);\n\t\t}\n\t}\n\n\tRtmpOsMsDelay(1);  \n\n}\n\n\n/*\n==========================================================================\n    Description:\n\n\tAsicSwitchChannel() dedicated for ATE.\n    \n==========================================================================\n*/\nVOID ATEAsicSwitchChannel(\n    IN PRTMP_ADAPTER pAd) \n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->ChannelSwitch != NULL)\n\t\tpATEInfo->pChipStruct->ChannelSwitch(pAd);\n\n\treturn;\n}\n\n\nVOID BbpSoftReset(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR BbpData = 0;\n\n\t/* Soft reset, set BBP R21 bit0=1->0 */\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BbpData);\n\tBbpData |= 0x00000001; /* set bit0=1 */\n\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BbpData);\n\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BbpData);\n\tBbpData &= ~(0x00000001); /* set bit0=0 */\n\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BbpData);\n\n\treturn;\n}\n\n\nstatic VOID BbpHardReset(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32 MacData = 0;\n\n\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);\n\tMacData = MacData | 0x00000002;\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);\n\n\tRtmpOsMsDelay(10);\n\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);\n\tMacData = MacData & ~(0x00000002);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);\n\n\treturn;\n}\n\n\nstatic int CheckMCSValid(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN UCHAR Mode,\n\tIN UCHAR Mcs)\n{\n\tint index;\n\tPCHAR pRateTab = NULL;\n\n\tswitch (Mode)\n\t{\n\t\tcase MODE_CCK:\n\t\t\tpRateTab = CCKRateTable;\n\t\t\tbreak;\n\t\tcase MODE_OFDM:\n\t\t\tpRateTab = OFDMRateTable;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 2: /*MODE_HTMIX*/\n\t\tcase 3: /*MODE_HTGREENFIELD*/\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tif (IS_RT2883(pAd) || IS_RT3883(pAd) || IS_RT3593(pAd))\n\t\t\t\tpRateTab = HTMIXRateTable3T3R;\n\t\t\telse\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t\tpRateTab = HTMIXRateTable;\n\t\t\tbreak;\n\t\t\t\n\t\tdefault: \n\t\t\tDBGPRINT_ERR((\"unrecognizable Tx Mode %d\\n\", Mode));\n\t\t\treturn -1;\n\t\t\tbreak;\n\t}\n\n\tindex = 0;\n\twhile (pRateTab[index] != -1)\n\t{\n\t\tif (pRateTab[index] == Mcs)\n\t\t\treturn 0;\n\t\tindex++;\n\t}\n\n\treturn -1;\n}\n\n\nINT DefaultATETxPwrHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN char index)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR TxPower = 0;\n\n#ifdef RALINK_QA\n\tif ((pATEInfo->bQATxStart == TRUE) || (pATEInfo->bQARxStart == TRUE))\n\t{\n\t\t/* \n\t\t\tWhen QA is used for Tx, pATEInfo->TxPower0/1 and real tx power\n\t\t\tare not synchronized.\n\t\t*/\n\t\treturn 0;\n\t}\n\telse\n#endif /* RALINK_QA */\n\n\tif (index == 0)\n\t{\n\t\tTxPower = pATEInfo->TxPower0;\n\t}\n\telse if (index == 1)\n\t{\n\t\tTxPower = pATEInfo->TxPower1;\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"%s : Only TxPower0 and TxPower1 are adjustable !\\n\", __FUNCTION__));\n\t\tDBGPRINT_ERR((\"TxPower%d is out of range !\\n\", index));\n\t\treturn -1;\n\t}\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--- %s\\n\", __FUNCTION__));\n\t\n\treturn 0;\n}\n\n\nINT ATETxPwrHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN char index)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->TxPwrHandler != NULL)\n\t\tpATEInfo->pChipStruct->TxPwrHandler(pAd, index);\n\n\treturn 0;\n}\n\n\n/*\n========================================================================\n\n\tRoutine Description:\n\t\tSet Japan filter coefficients if needed.\n\tNote:\n\t\tThis routine should only be called when\n\t\tentering TXFRAME mode or TXCONT mode.\n\t\t\t\t\n========================================================================\n*/\nstatic VOID SetJapanFilter(\n\tIN\t\tPRTMP_ADAPTER\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR\t\t\tBbpData = 0;\n\n\t/*\n\t\tIf Channel=14 and Bandwidth=20M and Mode=CCK, set BBP R4 bit5=1\n\t\t(Japan Tx filter coefficients)when (TXFRAME or TXCONT).\n\t*/\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BbpData);\n\n\tif ((pATEInfo->TxWI.TxWIPHYMODE == MODE_CCK) && (pATEInfo->Channel == 14) && (pATEInfo->TxWI.TxWIBW == BW_20))\n\t{\n\t\tBbpData |= 0x20;    /* turn on */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SetJapanFilter!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tBbpData &= 0xdf;    /* turn off */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ClearJapanFilter!!!\\n\"));\n\t}\n\n\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData);\n\n\treturn;\n}\n\n\n/*\n========================================================================\n\n\tRoutine Description:\n\t\tDisable protection for ATE.\n========================================================================\n*/\nVOID ATEDisableAsicProtect(\n\tIN\t\tPRTMP_ADAPTER\tpAd)\n{\n\tPROT_CFG_STRUC\tProtCfg, ProtCfg4;\n\tUINT32 Protect[6];\n\tUSHORT\t\t\toffset;\n\tUCHAR\t\t\tstep;\n\tUINT32 MacReg = 0;\n\n\t/* Config ASIC RTS threshold register */\n\tRTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg);\n\tMacReg &= 0xFF0000FF;\n\tMacReg |= (0xFFF << 8);\n\tRTMP_IO_WRITE32(pAd, TX_RTS_CFG, MacReg);\n\n\t/* Initial common protection settings */\n\tRTMPZeroMemory(Protect, sizeof(Protect));\n\tProtCfg4.word = 0;\n\tProtCfg.word = 0;\n\tProtCfg.field.TxopAllowGF40 = 1;\n\tProtCfg.field.TxopAllowGF20 = 1;\n\tProtCfg.field.TxopAllowMM40 = 1;\n\tProtCfg.field.TxopAllowMM20 = 1;\n\tProtCfg.field.TxopAllowOfdm = 1;\n\tProtCfg.field.TxopAllowCck = 1;\n\tProtCfg.field.RTSThEn = 1;\n\tProtCfg.field.ProtectNav = ASIC_SHORTNAV;\n\n\t/* Handle legacy(B/G) protection */\n\tProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate;\n\tProtCfg.field.ProtectCtrl = 0;\n\tProtect[0] = ProtCfg.word;\n\tProtect[1] = ProtCfg.word;\n\t/* CTS-self is not used */\n\tpAd->FlgCtsEnabled = 0; \n\n\t/*\n\t\tNO PROTECT \n\t\t\t1.All STAs in the BSS are 20/40 MHz HT\n\t\t\t2. in a 20/40MHz BSS\n\t\t\t3. all STAs are 20MHz in a 20MHz BSS\n\t\tPure HT. no protection.\n\t*/\n\t/*\n\t\tMM20_PROT_CFG\n\t\t\tReserved (31:27)\n\t\t\tPROT_TXOP(25:20) -- 010111\n\t\t\tPROT_NAV(19:18)  -- 01 (Short NAV protection)\n\t\t\tPROT_CTRL(17:16) -- 00 (None)\n\t\t\tPROT_RATE(15:0)  -- 0x4004 (OFDM 24M)\n\t*/\n\tProtect[2] = 0x01744004;\t\n\n\t/*\n\t\tMM40_PROT_CFG\n\t\t\tReserved (31:27)\n\t\t\tPROT_TXOP(25:20) -- 111111\n\t\t\tPROT_NAV(19:18)  -- 01 (Short NAV protection)\n\t\t\tPROT_CTRL(17:16) -- 00 (None) \n\t\t\tPROT_RATE(15:0)  -- 0x4084 (duplicate OFDM 24M)\n\t*/\n\tProtect[3] = 0x03f44084;\n\n\t/*\n\t\tCF20_PROT_CFG\n\t\t\tReserved (31:27)\n\t\t\tPROT_TXOP(25:20) -- 010111\n\t\t\tPROT_NAV(19:18)  -- 01 (Short NAV protection)\n\t\t\tPROT_CTRL(17:16) -- 00 (None)\n\t\t\tPROT_RATE(15:0)  -- 0x4004 (OFDM 24M)\n\t*/\n\tProtect[4] = 0x01744004;\n\n\t/*\n\t\tCF40_PROT_CFG\n\t\t\tReserved (31:27)\n\t\t\tPROT_TXOP(25:20) -- 111111\n\t\t\tPROT_NAV(19:18)  -- 01 (Short NAV protection)\n\t\t\tPROT_CTRL(17:16) -- 00 (None)\n\t\t\tPROT_RATE(15:0)  -- 0x4084 (duplicate OFDM 24M)\n\t*/\n\tProtect[5] = 0x03f44084;\n\n\tpAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE;\n\t\n\toffset = CCK_PROT_CFG;\n\tfor (step = 0;step < 6;step++)\n\t\tRTMP_IO_WRITE32(pAd, offset + step*4, Protect[step]);\n\n\treturn;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT \n/*\n==========================================================================\n\tDescription:\n\t\tUsed only by ATE to disassociate all STAs and stop AP service.\n\tNote:\n==========================================================================\n*/\nVOID ATEAPStop(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBOOLEAN     Cancelled;\n\tUINT32\t\tValue = 0;\n\tINT         apidx = 0;\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! ATEAPStop !!!\\n\"));\n\n\t/* To prevent MCU to modify BBP registers w/o indications from driver. */\n#ifdef DFS_SUPPORT\n\t\tNewRadarDetectionStop(pAd);\n#endif /* DFS_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT\n\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t{\n\t\tCarrierDetectionStop(pAd);\n\t}\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\n#ifdef APCLI_SUPPORT\n\tApCliIfDown(pAd);\n#endif /* APCLI_SUPPORT */\n\n\tMacTableReset(pAd);\n\n\t/* Disable pre-tbtt interrupt */\n\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\tValue &=0xe;\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\t/* Disable piggyback */\n\tRTMPSetPiggyBack(pAd, FALSE);\n\n\tATEDisableAsicProtect(pAd);\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\tAsicDisableSync(pAd);\n\n#ifdef LED_CONTROL_SUPPORT\n\t\t/* Set LED */\n\t\tRTMPSetLED(pAd, LED_LINK_DOWN);\n#endif /* LED_CONTROL_SUPPORT */\n\t}\n\n#ifdef RTMP_MAC_USB\n\t/* For USB, we need to clear the beacon sync buffer. */\n\tRTUSBBssBeaconExit(pAd);\n#endif /* RTMP_MAC_USB */\n\n\tfor (apidx = 0; apidx < MAX_MBSSID_NUM(pAd); apidx++)\n\t{\n\t\tif (pAd->ApCfg.MBSSID[apidx].REKEYTimerRunning == TRUE)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx].REKEYTimer, &Cancelled);\n\t\t\tpAd->ApCfg.MBSSID[apidx].REKEYTimerRunning = FALSE;\n\t\t}\n\t}\n\n\tif (pAd->ApCfg.CMTimerRunning == TRUE)\n\t{\n\t\tRTMPCancelTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled);\n\t\tpAd->ApCfg.CMTimerRunning = FALSE;\n\t}\n\t\n#ifdef WAPI_SUPPORT\n\tRTMPCancelWapiRekeyTimerAction(pAd, NULL);\n#endif /* WAPI_SUPPORT */\n\t\n\t/* Cancel the Timer, to make sure the timer was not queued. */\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\n\tif (pAd->ApCfg.ApQuickResponeForRateUpTimerRunning == TRUE)\n\t\tRTMPCancelTimer(&pAd->ApCfg.ApQuickResponeForRateUpTimer, &Cancelled);\n\n#ifdef IDS_SUPPORT\n\t/* if necessary, cancel IDS timer */\n\tRTMPIdsStop(pAd);\n#endif /* IDS_SUPPORT */\n\n\n#ifdef GREENAP_SUPPORT\n\tif (pAd->ApCfg.bGreenAPEnable == TRUE)\n\t{\n\t\tRTMP_CHIP_DISABLE_AP_MIMOPS(pAd);\n\t\tpAd->ApCfg.GreenAPLevel=GREENAP_WITHOUT_ANY_STAS_CONNECT;\n\t\tpAd->ApCfg.bGreenAPEnable = FALSE;\n\t}\n#endif /* GREENAP_SUPPORT */\n\n\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID RTMPStationStop(\n    IN  PRTMP_ADAPTER   pAd)\n{\n    DBGPRINT(RT_DEBUG_TRACE, (\"==> RTMPStationStop\\n\"));\n\n    /* Do nothing. */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<== RTMPStationStop\\n\"));\n}\n\n\nVOID RTMPStationStart(\n    IN  PRTMP_ADAPTER   pAd)\n{\n    DBGPRINT(RT_DEBUG_TRACE, (\"==> RTMPStationStart\\n\"));\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== RTMPStationStart\\n\"));\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n\nstatic NDIS_STATUS ATESTART(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0, atemode=0, temp=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n#ifdef RTMP_MAC_USB\n\tUCHAR LoopCount=0;\n#endif /* RTMP_MAC_USB */\n\tPATE_CHIP_STRUCT pChipStruct = pATEInfo->pChipStruct;\n\tBOOLEAN Cancelled;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\n#ifdef RTMP_MAC_USB\n\tRTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);\n#endif /* RTMP_MAC_USB */\n\n\tatemode = pATEInfo->Mode;\n\tpATEInfo->Mode = ATE_START;\n\n    if (atemode == ATE_STOP)\n\t{\n\t\t/* DUT just enters ATE mode from normal mode. */\n\t\t/* Only at this moment, we need to switch back to the channel of normal mode. */\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t/* empty function */\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n    }\n\n#ifdef RTMP_MAC_USB\n\n#ifdef MT7601\n\tMT7601DisableTxRx(pAd, GUIRADIO_OFF);\n#endif /* MT7601 */\n\n\n\t/* one second is enough for waiting bulk-in urb */\n\twhile ((pAd->PendingRx > 0) && (LoopCount < 2))\t\n\t{\n\t\t/* delay 0.5 seconds */\n\t\tOS_WAIT(500);\n\t\tLoopCount++;\n\t}\n#endif /* RTMP_MAC_USB */\n\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\n\t/* Disable auto responder */\n\tRTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp);\n\ttemp = temp & 0xFFFFFFFE;\n\tRTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp);\n\n\tATE_MAC_TX_CTS_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\tif (atemode == ATE_TXCARR)\n\t{\n\t\tif (pChipStruct->bBBPStoreTXCARR == TRUE)\n\t\t{\n\t\t\tUINT32\t\t\tbbp_index=0;\n\t\t\tUCHAR\t\t\tRestoreRfICType=pAd->RfIcType;\n\n\t\t\tBbpHardReset(pAd);\n\n\t\t\t/* Restore All BBP Value */\n\t\t\tfor (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]);\n\n\t\t\tpAd->RfIcType=RestoreRfICType;\n\t\t}\n\n\t\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t\t{\n\t\t\t/* No Carrier Test set BBP R22 bit6=0, bit[5~0]=0x0 */\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);\n\t\t\tBbpData &= 0xFFFFFF80; /* clear bit6, bit[5~0] */\t\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);\n\n\t\t\tBbpSoftReset(pAd);\n\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, Default_TX_PIN_CFG);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0 */\n\t\t\tATE_BBP_RESET_TX_MODE(pAd, BBP_R22, &BbpData);\n\t\t}\n\t}\n\telse if (atemode == ATE_TXCARRSUPP)\n\t{\n\t\tif (pChipStruct->bBBPStoreTXCARRSUPP == TRUE)\n\t\t{\n\t\t\tUINT32\t\t\tbbp_index=0;\n\t\t\tUCHAR\t\t\tRestoreRfICType=pAd->RfIcType;\n\n\t\t\tBbpHardReset(pAd);\n\n\t\t\t/* Restore All BBP Value */\n\t\t\tfor (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]);\n\n\t\t\tpAd->RfIcType=RestoreRfICType;\t\t\t\n\t\t}\n\n\t\t/* No Cont. TX set BBP R22 bit7=0 */\n\t\tATE_BBP_STOP_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t\t/* No Carrier Suppression set BBP R24 bit0=0 */\n\t\tATE_BBP_CTS_TX_SIN_WAVE_DISABLE(pAd, BBP_R24, &BbpData);\n\n\t\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t\t{\n\t\t\tBbpSoftReset(pAd);\n\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, Default_TX_PIN_CFG);\n\t\t}\n\t}\t\t\n\n\t/*\n\t\tWe should free some resource which was allocated\n\t\twhen ATE_TXFRAME , ATE_STOP, and ATE_TXCONT.\n\t*/\n\telse if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP))\n\t{\n\t\tif (atemode == ATE_TXCONT)\n\t\t{\n\t\t\tif (pChipStruct->bBBPStoreTXCONT == TRUE)\n\t\t\t{\n\t\t\t\tUINT32\t\t\tbbp_index=0;\n\t\t\t\tUCHAR\t\t\tRestoreRfICType=pAd->RfIcType;\n\n\t\t\t\tBbpHardReset(pAd);\n\n\t\t\t\t/* Restore All BBP Value */\n\t\t\t\tfor (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]);\n\n\t\t\t\tpAd->RfIcType=RestoreRfICType;\n\t\t\t}\n\n\t\t\t/* Not Cont. TX anymore, so set BBP R22 bit7=0 */\n\t\t\tATE_BBP_STOP_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t\t\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t\t\t{\n\t\t\t\tBbpSoftReset(pAd);\n\t\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, Default_TX_PIN_CFG);\n\t\t\t}\n\t\t}\n\n\t\t/* Abort Tx, Rx DMA. */\n\t\tRtmpDmaEnable(pAd, 0);\n\n\t\t/* Start Tx, RX DMA */\n\t\tRtmpDmaEnable(pAd, 1);\n\t}\n\n#ifdef RTMP_MAC_USB\n/*\tpAd->ContinBulkIn = FALSE; */\n\tRTUSBRejectPendingPackets(pAd);\n\tRTUSBCleanUpDataBulkOutQueue(pAd);\n\n#ifdef CONFIG_STA_SUPPORT\n\t/*\n\t\tIt will be called in MlmeSuspend().\n\t\tCancel pending timers.\n\t*/\n\tRTMPCancelTimer(&pAd->MlmeAux.AssocTimer,      &Cancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,    &Cancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.DisassocTimer,   &Cancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.AuthTimer,       &Cancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer,     &Cancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer,       &Cancelled);\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTUSBCleanUpMLMEBulkOutQueue(pAd);\n\n\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/* Abort Tx, RX DMA. */\n\t/* If disable DMA TX and RX, in-band command not word */\n\t//RtmpDmaEnable(pAd, 0);\n\n\t/* Disable Tx */\n\tATE_MAC_TX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/*\n\t\tMake sure there are no pending bulk in/out IRPs before we go on.\n\t\tpAd->BulkFlags != 0 : wait bulk out finish\n\t*/\t\n\twhile ((pAd->PendingRx > 0))\t\n\t{\n\t\tATE_RTUSBCancelPendingBulkInIRP(pAd);\n\n\t\t/* delay 0.5 seconds */\n\t\tRtmpOsMsDelay(500);\n\t\tpAd->PendingRx = 0;\n\t}\n\n\twhile (((pAd->BulkOutPending[0] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[1] == TRUE) || \n\t\t\t(pAd->BulkOutPending[2] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))\n\t\t\t/* pAd->BulkFlags != 0 : wait bulk out finish */\t\n\t{\n\t\tdo \n\t\t{\n\t\t\t/* \n\t\t\t\tpAd->BulkOutPending[y] will be set to FALSE\n\t\t\t\tin RTUSBCancelPendingBulkOutIRP(pAd)\n\t\t\t*/\n\t\t\tRTUSBCancelPendingBulkOutIRP(pAd);\n\t\t} while (FALSE);\t\t\t\n\n\t}\n\n\tASSERT(pAd->PendingRx == 0);\n#endif /* RTMP_MAC_USB */\n\n\t/* reset Rx statistics. */\n\tpATEInfo->LastSNR0 = 0;\n\tpATEInfo->LastSNR1 = 0;\n#ifdef DOT11N_SS3_SUPPORT\n\tpATEInfo->LastSNR2 = 0;\n#endif /* DOT11N_SS3_SUPPORT */\n\tpATEInfo->LastRssi0 = 0;\n\tpATEInfo->LastRssi1 = 0;\n\tpATEInfo->LastRssi2 = 0;\n\tpATEInfo->AvgRssi0 = 0;\n\tpATEInfo->AvgRssi1 = 0;\n\tpATEInfo->AvgRssi2 = 0;\n\tpATEInfo->AvgRssi0X8 = 0;\n\tpATEInfo->AvgRssi1X8 = 0;\n\tpATEInfo->AvgRssi2X8 = 0;\n\tpATEInfo->NumOfAvgRssiSample = 0;\n\n#ifdef RALINK_QA\n\t/* Tx frame */\n\tpATEInfo->bQATxStart = FALSE;\n\tpATEInfo->bQARxStart = FALSE;\n\tpATEInfo->seq = 0; \n\n\t/* counters */\n\tpATEInfo->U2M = 0;\n\tpATEInfo->OtherData = 0;\n\tpATEInfo->Beacon = 0;\n\tpATEInfo->OtherCount = 0;\n\tpATEInfo->TxAc0 = 0;\n\tpATEInfo->TxAc1 = 0;\n\tpATEInfo->TxAc2 = 0;\n\tpATEInfo->TxAc3 = 0;\n\tpATEInfo->TxHCCA = 0;\n\tpATEInfo->TxMgmt = 0;\n\tpATEInfo->RSSI0 = 0;\n\tpATEInfo->RSSI1 = 0;\n\tpATEInfo->RSSI2 = 0;\n\tpATEInfo->SNR0 = 0;\n\tpATEInfo->SNR1 = 0;\n#ifdef DOT11N_SS3_SUPPORT\n\tpATEInfo->SNR2 = 0;\n#endif /* DOT11N_SS3_SUPPORT */\n\tpATEInfo->IPG = 200;\n\n\t/* control */\n\tpATEInfo->TxDoneCount = 0;\n\t/* TxStatus : 0 --> task is idle, 1 --> task is running */\n\tpATEInfo->TxStatus = 0;\n#endif /* RALINK_QA */\n\n\t\t/* Soft reset BBP. */\n\t\tBbpSoftReset(pAd);\n\n#ifdef CONFIG_AP_SUPPORT \n\n\t/* Set IPG 200 by default. */\n\tSet_ATE_IPG_Proc(pAd, \"200\"); \n\tif (atemode == ATE_STOP)\n\tATEAPStop(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT \n\tAsicDisableSync(pAd);\n\tATEDisableAsicProtect(pAd);\n\tRTMPStationStop(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif ((atemode == ATE_STOP) && (pATEInfo->PeriodicTimer.State == FALSE))\n\t{\n\t\t/* Do it for the first time entering ATE mode */\n\t\tpATEInfo->PeriodicTimer.State = TRUE;\n\t}\n\t\n\tif (pATEInfo->PeriodicTimer.State == TRUE)\n\t{\n\t\t/* \n\t\t\tFor rx statistics, we cancel pAd->Mlme.PeriodicTimer\n\t\t\tand set pAd->ate.PeriodicTimer.\n\t\t*/\n\t\tRTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);\n\t\t/* Init ATE periodic timer */\n\t\tRTMPInitTimer(pAd, &pAd->ate.PeriodicTimer, GET_TIMER_FUNCTION(ATEPeriodicExec), pAd, TRUE);\n\t\t/* Set ATE periodic timer */\n\t\tRTMPSetTimer(&pAd->ate.PeriodicTimer, ATE_TASK_EXEC_INTV);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"We are still in ATE mode, \"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"so we keep ATE periodic timer running.\\n\"));\n\t}\n\n#ifdef LED_CONTROL_SUPPORT\n\tRTMPExitLEDMode(pAd);\t\n#endif /* LED_CONTROL_SUPPORT */\n\n\n#ifdef RTMP_MAC_USB\n\t/* Default value in BBP R22 is 0x0. */\n   \tATE_BBP_RESET_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t/* Clear bit4 to stop continuous Tx production test. */\n\tATE_MAC_TX_CTS_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/* Clear ATE Bulk in/out counter and continue setup */\n\tInterlockedExchange(&pAd->BulkOutRemained, 0);\n\n\t/* NdisAcquireSpinLock()/NdisReleaseSpinLock() need only one argument in RT28xx */\n\tNdisAcquireSpinLock(&pAd->GenericLock);\t\n\tpAd->ContinBulkOut = FALSE;\t\t\n\tpAd->ContinBulkIn = FALSE;\n\tNdisReleaseSpinLock(&pAd->GenericLock);\n\n\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n#endif /* RTMP_MAC_USB */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic NDIS_STATUS ATESTOP(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0, ring_index=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n\tPATE_CHIP_STRUCT pChipStruct = pATEInfo->pChipStruct;\n\tBOOLEAN Cancelled;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\tif (pChipStruct->bBBPLoadATESTOP == TRUE)\n\t{\n\t\tUINT32\t\t\tbbp_index=0;\n\t\tUCHAR\t\t\tRestoreRfICType=pAd->RfIcType;\n\n\t\tBbpHardReset(pAd);\n\n\t\t/* Supposed that we have had a record in restore_BBP[] */\n\t\t/* restore all BBP value */\n\t\tfor (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]);\n\n\t\tASSERT(RestoreRfICType != 0);\n\t\tpAd->RfIcType=RestoreRfICType;\n\t}\n\n\n\tInterlockedExchange(&pAd->BulkOutRemained, 0);\t\t\t\t\n\tNdisAcquireSpinLock(&pAd->GenericLock);\n\tpAd->ContinBulkOut = FALSE;\t\t\n\t//pAd->ContinBulkIn = FALSE;\n\tNdisReleaseSpinLock(&pAd->GenericLock);\t\t\n\n\t/* Default value in BBP R22 is 0x0. */\n\tATE_BBP_RESET_TX_MODE(pAd, BBP_R22, &BbpData);\n\n#ifdef MT7601\n\tMT7601DisableTxRx(pAd, GUIRADIO_OFF);\n#else\n\t/* Clear bit4 to stop continuous Tx production test. */\n\tATE_MAC_TX_CTS_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\n\t/* Abort Tx, RX DMA */\n\tRtmpDmaEnable(pAd, 0);\n\n\t/* Disable Tx */\n\tATE_MAC_TX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n#endif /* MT7601 */\n\n\tpAd->ContinBulkIn = FALSE;\n\n\n\tif (pATEInfo->PeriodicTimer.State == FALSE)\n\t{\n\t\t/* \n\t\t\tFor rx statistics, we cancel pAd->Mlme.PeriodicTimer\n\t\t\tand set pATEInfo->PeriodicTimer in stead of. \n\t\t\tNow we recover it before we leave ATE mode.\n\t\t*/\n\t\tRTMPCancelTimer(&pATEInfo->PeriodicTimer, &Cancelled);\n\t\t/* Init MLME periodic timer */\n\t\tRTMPInitTimer(pAd, &pAd->Mlme.PeriodicTimer, GET_TIMER_FUNCTION(MlmePeriodicExec), pAd, TRUE);\n\t\t/* Set MLME periodic timer */\n\t\tRTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV);\n\t}\n\telse\n\t{\n\t\t/* ATE periodic timer has been cancelled. */\n\t\tStatus = NDIS_STATUS_FAILURE;\n\t\tDBGPRINT_ERR((\"Initialization of MLME periodic timer failed, Status[=0x%08x]\\n\", Status));\n\n\t\treturn Status;\n\t}\t\n\n\n#ifdef RTMP_MAC_USB\n\t/* \n\t\tMake sure there are no pending bulk in/out IRPs before we go on.\n\t\tpAd->BulkFlags != 0 : wait bulk out finish\n\t*/\n/*\tpAd->ContinBulkIn = FALSE; */\n\n\tif (pAd->PendingRx > 0)\n\t{\n\t\tATE_RTUSBCancelPendingBulkInIRP(pAd);\n\t\t//RtmpOsMsDelay(500);\n\t}\n\n\twhile (((pAd->BulkOutPending[0] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[1] == TRUE) || \n\t\t\t(pAd->BulkOutPending[2] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))\n\t\t\t/* pAd->BulkFlags != 0 : wait bulk out finish */\n\t{\n\t\tdo \n\t\t{\n\t\t\tRTUSBCancelPendingBulkOutIRP(pAd);\n\t\t} while (FALSE);\t\t\t\n\n\t\tRtmpOsMsDelay(500);\n\t}\n\n\tASSERT(pAd->PendingRx == 0);\n/*=========================================================================*/\n/*      Reset Rx RING                                                      */ \n/*=========================================================================*/\n\tpAd->PendingRx = 0;\n\t/* Next Rx Read index */\n\tpAd->NextRxBulkInReadIndex = 0;\t\n\t/* Rx Bulk pointer */\n\tpAd->NextRxBulkInIndex = RX_RING_SIZE - 1;\t\n\tpAd->NextRxBulkInPosition = 0;\n\tfor (ring_index = 0; ring_index < (RX_RING_SIZE); ring_index++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[ring_index]);\n\t\tNdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);\n\n\t\tpRxContext->pAd\t= pAd;\n\t\tpRxContext->pIrp = NULL;\n\t\tpRxContext->BulkInOffset = 0;\n\t\tpRxContext->bRxHandling = FALSE;\n\t\tpRxContext->InUse\t\t= FALSE;\n\t\tpRxContext->IRPPending\t= FALSE;\n\t\tpRxContext->Readable\t= FALSE;\n\t}\n\n/*=========================================================================*/\n/*      Reset Tx RING                                                      */ \n/*=========================================================================*/\n\tdo \n\t{\n\t\tRTUSBCancelPendingBulkOutIRP(pAd);\n\t} while (FALSE);\n\n\t/* Enable auto responder. */\n\tRTMP_IO_READ32(pAd, AUTO_RSP_CFG, &MacData);\n\tMacData = MacData | (0x01);\n\tRTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, MacData);\n\n\tAsicEnableBssSync(pAd);\n\tBbpSoftReset(pAd);\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t/* Set all state machines back IDLE */\n\t\tpAd->Mlme.CntlMachine.CurrState    = CNTL_IDLE;\n\t\tpAd->Mlme.AssocMachine.CurrState   = ASSOC_IDLE;\n\t\tpAd->Mlme.AuthMachine.CurrState    = AUTH_REQ_IDLE;\n\t\tpAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE;\n\t\tpAd->Mlme.SyncMachine.CurrState    = SYNC_IDLE;\n\t\tpAd->Mlme.ActMachine.CurrState    = ACT_IDLE;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/*\n\t\t\t===> refer to MlmeRestartStateMachine().\n\t\t\tWhen we entered ATE_START mode, PeriodicTimer was not cancelled.\n\t\t\tSo we don't have to set it here.\n\t\t*/\n\t\t\n\t\tASSERT(pAd->CommonCfg.Channel != 0);\t\t\t\n\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\n\t\t/* empty function */\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\n#ifdef CONFIG_AP_SUPPORT \n\t    APStartUp(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT \n\t    RTMPStationStart(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n\t}\t\n\n\t/* Clear ATE Bulk in/out counter and continue setup. */\n\n\t/* Wait 50ms to prevent next URB to bulkout during HW reset. */\n\t/* todo : remove this if not necessary */\n\tRtmpOsMsDelay(50);\n\n\tpATEInfo->Mode = ATE_STOP;\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_AP_SUPPORT \n\t/* restore RX_FILTR_CFG */\n\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, APNORMAL);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT \n\t/* restore RX_FILTR_CFG due to that QA maybe set it to 0x3 */\n\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL);\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Enable Tx */\n\tATE_MAC_TX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/* Enable Tx, Rx DMA. */\n\tRtmpDmaEnable(pAd, 1);\n\n\t/* Enable Rx */\n\tATE_MAC_RX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\n#ifdef RTMP_MAC_USB\n\t/* Wait 10ms for all of the bulk-in URBs to complete. */\n\tRtmpOsMsDelay(10);\n\n\t/* Everything is ready to start normal Tx/Rx. */\n\tRTUSBBulkReceive(pAd);\n#endif /* RTMP_MAC_USB */\n\tRTMP_OS_NETDEV_START_QUEUE(pAd->net_dev);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic NDIS_STATUS TXCARR(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n\tPATE_CHIP_STRUCT pChipStruct = pATEInfo->pChipStruct;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\tpATEInfo->Mode = ATE_TXCARR;\n\n\tif (pChipStruct->bBBPStoreTXCARR == TRUE)\n\t{\n\t\tUINT32 bbp_index=0;\n\n\t\t/* Zero All BBP Value */\t\n\tfor (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\trestore_BBP[bbp_index]=0;\n\n\t/* Record All BBP Value */\n\tfor (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd,bbp_index,&restore_BBP[bbp_index]);\n\t}\n\n#ifdef RTMP_MAC_USB\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n#endif /* RTMP_MAC_USB */\n\n\t/* QA has done the following steps if it is used. */\n\tif (pATEInfo->bQATxStart == FALSE) \n\t{\n\t\tif ((!IS_RT3883(pAd)) && (!IS_RT3352(pAd)) && (!IS_RT5350(pAd)) && (!IS_RT3593(pAd)))\n\t\t\tBbpSoftReset(pAd);/* Soft reset BBP. */\n\n\t\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t\t{\n\t\t\t/* store the original value of RA_TX_PIN_CFG */\n\t\t\tRTMP_IO_READ32(pAd, RA_TX_PIN_CFG, &Default_TX_PIN_CFG);\n\n\t\t\t/* give RA_TX_PIN_CFG(0x1328) a proper value. */\n\t\t\tif (pATEInfo->Channel <= 14)\n\t\t\t{\n\t\t\t\t/* G band */\n\t\t\t\tMacData = TXCONT_TX_PIN_CFG_G;\n\t\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, MacData);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* A band */\n\t\t\t\tMacData = TXCONT_TX_PIN_CFG_A;\n\t\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, MacData);\n\t\t\t}\n\n\t\t\t/* Carrier Test set BBP R22 bit6=1, bit[5~0]=0x01 */\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);\n\t\t\tBbpData &= 0xFFFFFF80; /* bit6, bit[5~0] */\n\t\t\tBbpData |= 0x00000041; /* set bit6=1, bit[5~0]=0x01 */\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Carrier Test set BBP R22 bit7=1, bit6=1, bit[5~0]=0x01 */\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);\n\t\t\tBbpData &= 0xFFFFFF00; /* clear bit7, bit6, bit[5~0] */\n\t\t\tBbpData |= 0x000000C1; /* set bit7=1, bit6=1, bit[5~0]=0x01 */\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);\n\n\t\t\t/* Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1. */\n\t\t\tATE_MAC_TX_CTS_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic NDIS_STATUS TXCONT(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n\tPATE_CHIP_STRUCT pChipStruct = pATEInfo->pChipStruct;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\tif (pATEInfo->bQATxStart == TRUE)\n\t{\n\t\t/*\n\t\t\tset MAC_SYS_CTRL(0x1004) bit4(Continuous Tx Production Test)\n\t\t\tand bit2(MAC TX enable) back to zero.\n\t\t*/ \n\t\tATE_MAC_TX_CTS_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\tATE_MAC_TX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t\t/* set BBP R22 bit7=0 */\n\t\tATE_BBP_STOP_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\t}\n\telse\n\t{\n\t\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t\t{\n\t\t\t/* store the original value of RA_TX_PIN_CFG */\n\t\t\tRTMP_IO_READ32(pAd, RA_TX_PIN_CFG, &Default_TX_PIN_CFG);\n\t\t}\n\t}\n\n\tif (pChipStruct->bBBPStoreTXCONT == TRUE)\n\t{\n\t\tUINT32 bbp_index=0;\n\n\t\t/* Zero All BBP Value */\n\t\tfor(bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\t\trestore_BBP[bbp_index]=0;\n\n\t\t/* Record All BBP Value */\n\t\tfor(bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd,bbp_index,&restore_BBP[bbp_index]);\n\t}\n\n\t/* Step 1: send 50 packets first. */\n\tpATEInfo->Mode = ATE_TXCONT;\n\tpATEInfo->TxCount = 50;\n\n\tif ((!IS_RT3883(pAd)) && (!IS_RT3352(pAd)) && (!IS_RT5350(pAd)) && (!IS_RT3593(pAd)))\n\t\tBbpSoftReset(pAd);/* Soft reset BBP. */\n\n\t/* Abort Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 0);\n\n\n\t/* Do it after Tx/Rx DMA is aborted. */\n\tpATEInfo->TxDoneCount = 0;\n\t\n\t/* Only needed if we have to send some normal frames. */\n\tSetJapanFilter(pAd);\n\n\n#ifdef RTMP_MAC_USB\n\t/* Setup frame format. */\n\tATESetUpFrame(pAd, 0);\n#endif /* RTMP_MAC_USB */\n\n\t/* Enable Tx */\n\tATE_MAC_TX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/* Start Tx, Rx DMA. */\n\tRtmpDmaEnable(pAd, 1);\n\n#ifdef RTMP_MAC_USB\n\tInterlockedExchange(&pAd->BulkOutRemained, pATEInfo->TxCount);\n#endif /* RTMP_MAC_USB */\n\n#ifdef RALINK_QA\n\tif (pATEInfo->bQATxStart == TRUE)\n\t{\n\t\tpATEInfo->TxStatus = 1;\n\t}\n#endif /* RALINK_QA */\n\n\n#ifdef RTMP_MAC_USB\n\tNdisAcquireSpinLock(&pAd->GenericLock);\n\tpAd->ContinBulkOut = FALSE;\t\t\n\tNdisReleaseSpinLock(&pAd->GenericLock);\n\n\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n\n\t/* Kick bulk out */ \n\tRTUSBKickBulkOut(pAd);\n\n\t/* To make sure all the 50 frames have been bulk out before executing step 2 */\n\twhile (atomic_read(&pAd->BulkOutRemained) > 0)\n\t{\n\t\tRtmpOsMsDelay(5);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t{\n\t\t/* give RA_TX_PIN_CFG(0x1328) a proper value. */\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\t/* G band */\n\t\t\tMacData = TXCONT_TX_PIN_CFG_G;\n\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, MacData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* A band */\n\t\t\tMacData = TXCONT_TX_PIN_CFG_A;\n\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, MacData);\n\t\t}\n\n\t\t/* Cont. TX set BBP R22 bit7=1 */\n\t\tATE_BBP_START_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\t}\n\telse\n\t{\n\t\t/* Step 2: send more 50 packets then start Continuous Tx Mode. */\n\t\t/* Abort Tx, RX DMA. */\n\t\tRtmpDmaEnable(pAd, 0);\n\n\t\t/* Cont. TX set BBP R22 bit7=1 */\n\t\tATE_BBP_START_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t\tpATEInfo->TxCount = 50;\n\n\t\tpATEInfo->TxDoneCount = 0;\n\t\tSetJapanFilter(pAd);\n\n\n#ifdef RTMP_MAC_USB\n\t\t/* Build up Tx frame. */\n\t\tATESetUpFrame(pAd, 0);\n#endif /* RTMP_MAC_USB */\n\n\t\t/* Enable Tx */\n\t\tATE_MAC_TX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t\t/* Disable Rx */\n\t\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t\t/* Start Tx, Rx DMA. */\n\t\tRtmpDmaEnable(pAd, 1);\n\n#ifdef RTMP_MAC_USB\n\t\tInterlockedExchange(&pAd->BulkOutRemained, pATEInfo->TxCount);\n#endif /* RTMP_MAC_USB */\n#ifdef RALINK_QA\n\t\tif (pATEInfo->bQATxStart == TRUE)\n\t\t{\n\t\t\tpATEInfo->TxStatus = 1;\n\t\t}\n#endif /* RALINK_QA */\n\n\n#ifdef RTMP_MAC_USB\n\t\tNdisAcquireSpinLock(&pAd->GenericLock);\n\t\tpAd->ContinBulkOut = FALSE;\t\t\n\t\tNdisReleaseSpinLock(&pAd->GenericLock);\n\n\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n\t\t/* Kick bulk out */\n\t\tRTUSBKickBulkOut(pAd);\n\n\t\t/* Let pAd->BulkOutRemained be consumed to zero. */\n#endif /* RTMP_MAC_USB */\n\t\tRTMPusecDelay(500);\n\n\t\t/* enable continuous tx production test */\n\t\tATE_MAC_TX_CTS_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic NDIS_STATUS TXCARS(\n        IN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n\tPATE_CHIP_STRUCT pChipStruct = pATEInfo->pChipStruct;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\tpATEInfo->Mode = ATE_TXCARRSUPP;\n\n\tif (pChipStruct->bBBPStoreTXCARRSUPP == TRUE)\n\t{\n\t\tUINT32 bbp_index=0;\n\n\t\t/* Zero All BBP Value */\n        for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n                restore_BBP[bbp_index]=0;\n\n        /* Record All BBP Value */\n        for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++)\n                ATE_BBP_IO_READ8_BY_REG_ID(pAd,bbp_index,&restore_BBP[bbp_index]);\n\t}\n#ifdef RTMP_MAC_USB\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n#endif /* RTMP_MAC_USB */\n\n\t/* QA has done the following steps if it is used. */\n\tif (pATEInfo->bQATxStart == FALSE) \n\t{\n\t\tif (!IS_RT3883(pAd) && !IS_RT3593(pAd))\n\t\t{\n\t\t\t/* RT3883 and RT3593 do not need BbpSoftReset() */\n\t\t\t/* Soft reset BBP. */\n\t\t\tBbpSoftReset(pAd);\n\t\t}\n\n\t\tif (pATEInfo->TxMethod == TX_METHOD_1)\n\t\t{\n\t\t\t/* store the original value of RA_TX_PIN_CFG */\n\t\t\tRTMP_IO_READ32(pAd, RA_TX_PIN_CFG, &Default_TX_PIN_CFG);\n\n\t\t\t/* give RA_TX_PIN_CFG(0x1328) a proper value. */\n\t\t\tif (pATEInfo->Channel <= 14)\n\t\t\t{\n\t\t\t\t/* G band */\n\t\t\t\tMacData = TXCONT_TX_PIN_CFG_G;\n\t\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, MacData);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* A band */\n\t\t\t\tMacData = TXCONT_TX_PIN_CFG_A;\n\t\t\t\tRTMP_IO_WRITE32(pAd, RA_TX_PIN_CFG, MacData);\n\t\t\t}\n\n\t\t\t/* Carrier Suppression set BBP R22 bit7=1 (Enable Continuous Tx Mode) */\n\t\t\tATE_BBP_START_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t\t\t/* Carrier Suppression set BBP R24 bit0=1 (TX continuously send out 5.5MHZ sin save) */\n\t\t\tATE_BBP_CTS_TX_SIN_WAVE_ENABLE(pAd, BBP_R24, &BbpData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Carrier Suppression set BBP R22 bit7=1 (Enable Continuous Tx Mode) */\n\t\t\tATE_BBP_START_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t\t\t/* Carrier Suppression set BBP R24 bit0=1 (TX continuously send out 5.5MHZ sin save) */\n\t\t\tATE_BBP_CTS_TX_SIN_WAVE_ENABLE(pAd, BBP_R24, &BbpData);\n\n\t\t\t/* Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1. */\n\t\t\tATE_MAC_TX_CTS_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic NDIS_STATUS TXFRAME(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0;\n#ifdef RTMP_MAC_USB\n\tULONG\t\t\tIrqFlags = 0;\n#endif /* RTMP_MAC_USB */\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n\tSTRING\t\t\tIPGStr[8] = {0};\n#ifdef RTMP_INTERNAL_TX_ALC\n#if defined(RT3350) || defined(RT3352)\n\tUCHAR\t\tRFValue, BBP49Value;\n\tCHAR\t\tChannelPower = pATEInfo->TxPower0;\n\tCHAR\t\t*TssiRefPerChannel = pATEInfo->TssiRefPerChannel;\n\tUCHAR\t\tCurrentChannel = pATEInfo->Channel;\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n#ifdef RTMP_INTERNAL_TX_ALC\n#if defined(RT3350) || defined(RT3352)\n\tif (pATEInfo->bTSSICalbrEnableG == TRUE)\n\t{\n\t\tif ((!IS_RT3350(pAd)) && (!IS_RT3352(pAd)))                  \n\t\t{\n\t\t\tDBGPRINT_ERR((\"Not support TSSI calibration since not 3350/3352 chip!!!\\n\"));\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\n\t\t\treturn Status;\n\t\t}\n\n\t\t/* Internal TSSI 0 */\n\t\tRFValue = (0x3 | 0x0 << 2 | 0x3 << 4);\n\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R27, RFValue);\n\n\t\tRFValue = (0x3 | 0x0 << 2);\n\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R28, RFValue);\n\n\t\t/* set BBP R49[7] = 1 */\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpData);\n\t\tBBP49Value = BbpData;\n\t\tBbpData |= 0x80;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R49, BbpData);\n\t}\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s(Count=%u)\\n\", __FUNCTION__, pATEInfo->TxCount));\n\tpATEInfo->Mode |= ATE_TXFRAME;\n\n\tif (pATEInfo->bQATxStart == FALSE)  \n\t{\n\t\t/* set IPG to sync tx power with QA tools */\n\t\t/* default value of IPG is 200 */\n\t\tsnprintf(IPGStr, sizeof(IPGStr), \"%u\", pATEInfo->IPG);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IPGstr=%s\\n\", IPGStr));\n\t\tSet_ATE_IPG_Proc(pAd, IPGStr);\n\t}\n\n\n#ifdef RTMP_MAC_USB\n\t/* Soft reset BBP. */\n\tBbpSoftReset(pAd);\n\n\t/* Default value in BBP R22 is 0x0. */\n   \tATE_BBP_RESET_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t/* Clear bit4 to stop continuous Tx production test. */\n\tATE_MAC_TX_CTS_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n#endif /* RTMP_MAC_USB */\n\n#ifdef RALINK_QA\n\t/* add this for LoopBack mode */\n\tif (pATEInfo->bQARxStart == FALSE)  \n\t{\n#ifdef TXBF_SUPPORT\n\t\t/* Enable Rx if Sending Sounding. Otherwise Disable */\n\t\tif (pATEInfo->txSoundingMode != 0)\n\t\t{\n\t\t\tATE_MAC_RX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\t}\n\t\telse\n#endif /* TXBF_SUPPORT */\n\t\t{\n\t\t\t/* Disable Rx */\n\t\t\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t\t}\n\t}\n\n\tif (pATEInfo->bQATxStart == TRUE)  \n\t{\n\t\tpATEInfo->TxStatus = 1;\n\t}\n#else\n#ifdef TXBF_SUPPORT\n\t/* Enable Rx if Sending Sounding. Otherwise Disable */\n\tif (pATEInfo->txSoundingMode != 0)\n\t{\n\t\tATE_MAC_RX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t}\n\telse\n#endif /* TXBF_SUPPORT */\n\t{\n\t\t/* Disable Rx */\n\t\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\t}\n#endif /* RALINK_QA */\n\n\n#ifdef RTMP_MAC_USB\n\t/* Enable Tx */\n\tATE_MAC_TX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\tSetJapanFilter(pAd);\n\t\n\t/* Abort Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 0);\n\n\tpATEInfo->TxDoneCount = 0;\n\n\t/* Setup frame format. */\n\tATESetUpFrame(pAd, 0);\t\n\n\t/* Start Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 1);\n\n\t/* Check count is continuous or not yet. */\n\tif (pATEInfo->TxCount == 0)\n\t{\n\t\tInterlockedExchange(&pAd->BulkOutRemained, 0);\n\t}\n\telse\n\t{\n\t\tInterlockedExchange(&pAd->BulkOutRemained, pATEInfo->TxCount);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"bulk out count = %d\\n\", atomic_read(&pAd->BulkOutRemained)));\n\tASSERT((atomic_read(&pAd->BulkOutRemained) >= 0));\n\n\tif (atomic_read(&pAd->BulkOutRemained) == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Send packet continuously\\n\"));\n\n\t\t/* NdisAcquireSpinLock() == spin_lock_bh() */\n\t\t/* NdisAcquireSpinLock only need one argument. */\n\t\tNdisAcquireSpinLock(&pAd->GenericLock);\n\t\tpAd->ContinBulkOut = TRUE;\t\t\n\t\tNdisReleaseSpinLock(&pAd->GenericLock);\n\n\t\t/* BULK_OUT_LOCK() == spin_lock_irqsave() */\n\t\tBULK_OUT_LOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\tpAd->BulkOutPending[0] = FALSE;\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Send packets depend on counter\\n\"));\n\n\t\tNdisAcquireSpinLock(&pAd->GenericLock);\n\t\tpAd->ContinBulkOut = FALSE;\t\t\n\t\tNdisReleaseSpinLock(&pAd->GenericLock);\n\n\t\tBULK_OUT_LOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\tpAd->BulkOutPending[0] = FALSE;\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t}\t\t\t\t\n\n\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n\n\t/* Kick bulk out */ \n\tRTUSBKickBulkOut(pAd);\n#endif /* RTMP_MAC_USB */\n\n#ifdef RTMP_INTERNAL_TX_ALC\n#if defined(RT3350) || defined(RT3352)\n\tif (pATEInfo->bTSSICalbrEnableG == TRUE)\n\t{\n\t\tif ((IS_RT3350(pAd)) || (IS_RT3352(pAd))) \n\t\t{\n\t\t\tif ((pATEInfo->TxWI.MCS == 7)\n\t\t\t\t&& (pATEInfo->TxWI.BW == BW_20)\t&& (pATEInfo->TxAntennaSel == 1))                  \n\t\t\t{\n\t\t\t\tif (pATEInfo->Channel == 7)\n\t\t\t\t{\n\t\t\t\t\t/* step 1: get calibrated channel 7 TSSI reading as reference */\n\t\t\t\t\tRtmpOsMsDelay(500);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel %d, Calibrated Tx.Power0= 0x%04x\\n\", CurrentChannel, ChannelPower));\n\n\t\t\t\t\t/* read BBP R49[4:0] and write to EEPROM 0x6E */\n\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpData);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP R49 = 0x%02x\\n\", BbpData)); \n\t\t\t\t\tBbpData &= 0x1f;\n\t\t\t\t\tTssiRefPerChannel[CurrentChannel-1] = BbpData;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI = 0x%02x\\n\", TssiRefPerChannel[CurrentChannel-1]));  \n\t\t\t\t}\n\n\t\t\t\t/* step 2: calibrate channel 1 and 13 TSSI delta values */\n\t\t\t\telse if (pATEInfo->Channel == 1)\n\t\t\t\t{\n\t\t\t\t\t/* Channel 1 */\n\t\t\t\t\tRtmpOsMsDelay(500);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel %d, Calibrated Tx.Power0= 0x%04x\\n\", CurrentChannel, ChannelPower));\n\n\t\t\t\t\t/* read BBP R49[4:0] */\n\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpData);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP R49 = 0x%02x\\n\", BbpData)); \n\t\t\t\t\tBbpData &= 0x1f;\n\t\t\t\t\tTssiRefPerChannel[CurrentChannel-1] = BbpData;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI = 0x%02x\\n\", TssiRefPerChannel[CurrentChannel-1]));\n\t\t\t\t}\n\t\t\t\telse if (pATEInfo->Channel == 13)\n\t\t\t\t{\n\t\t\t\t\t/* Channel 13 */\n\t\t\t\t\tRtmpOsMsDelay(500);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel %d, Calibrated Tx.Power0= 0x%04x\\n\", CurrentChannel, ChannelPower));\n\n\t\t\t\t\t/* read BBP R49[4:0] */\n\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpData);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP R49 = 0x%02x\\n\", BbpData)); \n\t\t\t\t\tBbpData &= 0x1f;\n\t\t\t\t\tTssiRefPerChannel[CurrentChannel-1] = BbpData;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI = 0x%02x\\n\", TssiRefPerChannel[CurrentChannel-1]));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Channel %d, Calibrated Tx.Power0= 0x%04x\\n\", CurrentChannel, ChannelPower));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic NDIS_STATUS RXFRAME(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n#ifdef RTMP_MAC_USB\n\tUINT32\t\t\tring_index=0;\n#endif /* RTMP_MAC_USB */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\t/* Disable Rx of MAC block */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\t/* Default value in BBP R22 is 0x0. */\n\tATE_BBP_RESET_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\n\t/* Clear bit4 to stop continuous Tx production test. */\n\tATE_MAC_TX_CTS_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\tpATEInfo->Mode |= ATE_RXFRAME;\n\n#ifdef RTMP_MAC_USB\n\t/* Abort Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 0);\n#endif /* RTMP_MAC_USB */\n\n\t/* Disable Tx of MAC block. */\n\tATE_MAC_TX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n#ifdef RTMP_MAC_USB\n    /* Reset Rx RING */\n\tfor (ring_index = 0; ring_index < (RX_RING_SIZE); ring_index++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[ring_index]);\n\n\t\tpRxContext->InUse = FALSE;\n\t\tpRxContext->IRPPending = FALSE;\n\t\tpRxContext->Readable = FALSE;\n\n\t\t/* Get the URB from kernel(i.e., host control driver) back to driver. */\n\t\tRTUSB_UNLINK_URB(pRxContext->pUrb);\n\n\t\t/* Sleep 200 microsecs to give cancellation time to work. */\n\t\tRTMPusecDelay(200);\n\t\tpAd->BulkInReq = 0;\n\n\t\tpAd->PendingRx = 0;\n\t\t/* Next Rx Read index */\n\t\tpAd->NextRxBulkInReadIndex = 0;\n\t\t/* Rx Bulk pointer */\n\t\tpAd->NextRxBulkInIndex\t\t= RX_RING_SIZE - 1;\t\n\t\tpAd->NextRxBulkInPosition = 0;\t\t\t\n\t}\n\n\t/* read to clear counters */\n\tRTUSBReadMACRegister(pAd, RX_STA_CNT0, &MacData); /* RX PHY & RX CRC count */\n\tRTUSBReadMACRegister(pAd, RX_STA_CNT1, &MacData); /* RX PLCP error count & CCA false alarm count */\n\tRTUSBReadMACRegister(pAd, RX_STA_CNT2, &MacData); /* RX FIFO overflow frame count & RX duplicated filtered frame count */\n\n\tpAd->ContinBulkIn = TRUE;\n\n\t/* Enable Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 1);\n#endif /* RTMP_MAC_USB */\n\n\t/* Enable Rx of MAC block. */\n\tATE_MAC_RX_ENABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\n#ifdef RTMP_MAC_USB\n\t/* Kick bulk in. */\n\tRTUSBBulkReceive(pAd);\n#endif /* RTMP_MAC_USB */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\n/*\n==========================================================================\n    Description:\n        Set ATE operation mode to\n        0. ATESTART  = Start/Reset ATE Mode\n        1. ATESTOP   = Stop ATE Mode\n        2. TXCARR    = Transmit Carrier\n        3. TXCONT    = Continuous Transmit\n        4. TXFRAME   = Transmit Frames\n        5. RXFRAME   = Receive Frames\n#ifdef RALINK_QA\n        6. TXSTOP    = Stop Any Type of Transmition\n        7. RXSTOP    = Stop Receiving Frames        \n#endif\n\n    Return:\n        NDIS_STATUS_SUCCESS if all parameters are OK.\n==========================================================================\n*/\nstatic NDIS_STATUS\tATECmdHandler(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> %s\\n\", __FUNCTION__));\n\n#ifdef CONFIG_RT2880_ATE_CMD_NEW\n\tif (!strcmp(arg, \"ATESTART\")) \t\t\n\t{\n\t\t/* Enter/Reset ATE mode and set Tx/Rx Idle */\n\t\tStatus = ATESTART(pAd);\n\t}\n\telse if (!strcmp(arg, \"ATESTOP\")) \n\t{\n\t\t/* Leave ATE mode */\n\t\tStatus = ATESTOP(pAd);\n\t}\n#else\n\tif (!strcmp(arg, \"APSTOP\")) \t\t\n\t{\n\t\tStatus = ATESTART(pAd);\n\t}\n\telse if (!strcmp(arg, \"APSTART\")) \n\t{\n\t\tStatus = ATESTOP(pAd);\n\t}\n#endif\n\telse if (!strcmp(arg, \"TXCARR\"))\t\n\t{\n\t\tATEAsicSwitchChannel(pAd);\n\t\t/* AsicLockChannel() is empty function so far in fact */\n\t\tAsicLockChannel(pAd, pATEInfo->Channel);\n\t\tRtmpOsMsDelay(5);\n\n\t\tStatus = TXCARR(pAd);\n\t}\n\telse if (!strcmp(arg, \"TXCARS\"))\n\t{\n\t\tATEAsicSwitchChannel(pAd);\n\t\t/* AsicLockChannel() is empty function so far in fact */\n\t\tAsicLockChannel(pAd, pATEInfo->Channel);\n\t\tRtmpOsMsDelay(5);\n\n\t\tStatus = TXCARS(pAd);\n\t}\n\telse if (!strcmp(arg, \"TXCONT\"))\t\n\t{\n\t\tATEAsicSwitchChannel(pAd);\n\t\t/* AsicLockChannel() is empty function so far in fact */\n\t\tAsicLockChannel(pAd, pATEInfo->Channel);\n\t\tRtmpOsMsDelay(5);\n\n\t\tStatus = TXCONT(pAd);\n\t}\n\telse if (!strcmp(arg, \"TXFRAME\")) \n\t{\n\t\n\t\tATEAsicSwitchChannel(pAd);\n\t\t/* AsicLockChannel() is empty function so far in fact */\n\t\tAsicLockChannel(pAd, pATEInfo->Channel);\n\t\tRtmpOsMsDelay(5);\n\n\t\tStatus = TXFRAME(pAd);\n\t}\n\telse if (!strcmp(arg, \"RXFRAME\")) \n\t{\n\t\tATEAsicSwitchChannel(pAd);\n\t\t/* AsicLockChannel() is empty function so far in fact */\n\t\tAsicLockChannel(pAd, pATEInfo->Channel);\n\t\tRTMPusecDelay(5);\n\n\t\tStatus = RXFRAME(pAd);\n\t}\n#ifdef RALINK_QA\n\t/* Enter ATE mode and set Tx/Rx Idle */\n\telse if (!strcmp(arg, \"TXSTOP\"))\n\t{\n\t\tStatus = TXSTOP(pAd);\n\t}\n\telse if (!strcmp(arg, \"RXSTOP\"))\n\t{\n\t\tStatus = RXSTOP(pAd);\n\t}\n#endif /* RALINK_QA */\n\telse\n\t{\t\n\t\tDBGPRINT_ERR((\"ATE : Invalid arg in %s!\\n\", __FUNCTION__));\n\t\tStatus = NDIS_STATUS_INVALID_DATA;\n\t}\n\tRtmpOsMsDelay(5);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nINT\tSet_ATE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\t/* Handle ATEACTIVE and ATEPASSIVE commands as a special case */\n\tif (!strcmp(arg, \"ATEACTIVE\"))\n\t{\n\t\tpATEInfo->PassiveMode = FALSE;\n\t\treturn TRUE;\n\t}\n\n\tif (!strcmp(arg, \"ATEPASSIVE\"))\n\t{\n\t\tpATEInfo->PassiveMode = TRUE;\n\t\treturn TRUE;\n\t}\n\n\t/* Disallow all other ATE commands in passive mode */\n\tif (pATEInfo->PassiveMode)\n\t\treturn TRUE;\n\n\tif (ATECmdHandler(pAd, arg) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_Proc Failed\\n\"));\n\t\treturn FALSE;\n\t}\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE ADDR1=DA for TxFrame(AP  : To DS = 0 ; From DS = 1)\n        or\n        Set ATE ADDR3=DA for TxFrame(STA : To DS = 1 ; From DS = 0)        \n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_DA_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\toctet;\n\n\t/* Mac address acceptable format 01:02:03:04:05:06 length 17 */\t\n\tif (strlen(arg) != 17)  \n\t\treturn FALSE;\n\n\tfor (octet = 0, value = rstrtok(arg, \":\"); value; value = rstrtok(NULL, \":\")) \n\t{\n\t\t/* sanity check */\n\t\tif ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))))\n\t\t{\n\t\t\treturn FALSE;  \n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\tAtoH(value, &pATEInfo->Addr1[octet++], 1);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tAtoH(value, &pATEInfo->Addr3[octet++], 1);\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n\t/* sanity check */\n\tif (octet != MAC_ADDR_LEN)\n\t{\n\t\treturn FALSE;  \n\t}\n#ifdef CONFIG_AP_SUPPORT\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_DA_Proc (DA = %02x:%02x:%02x:%02x:%02x:%02x)\\n\", \n\t\tpATEInfo->Addr1[0], pATEInfo->Addr1[1], pATEInfo->Addr1[2], pATEInfo->Addr1[3],\n\t\tpATEInfo->Addr1[4], pATEInfo->Addr1[5]));\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_DA_Proc (DA = %02x:%02x:%02x:%02x:%02x:%02x)\\n\", \n\t\tpATEInfo->Addr3[0], pATEInfo->Addr3[1], pATEInfo->Addr3[2], pATEInfo->Addr3[3],\n\t\tpATEInfo->Addr3[4], pATEInfo->Addr3[5]));\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_DA_Proc Success\\n\"));\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE ADDR3=SA for TxFrame(AP  : To DS = 0 ; From DS = 1)\n        or\n        Set ATE ADDR2=SA for TxFrame(STA : To DS = 1 ; From DS = 0)\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_SA_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\toctet;\n\n\t/* Mac address acceptable format 01:02:03:04:05:06 length 17 */\t\n\tif (strlen(arg) != 17)  \n\t\treturn FALSE;\n\n\tfor (octet=0, value = rstrtok(arg, \":\"); value; value = rstrtok(NULL, \":\")) \n\t{\n\t\t/* sanity check */\n\t\tif ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))))\n\t\t{\n\t\t\treturn FALSE;  \n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\tAtoH(value, &pATEInfo->Addr3[octet++], 1);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tAtoH(value, &pATEInfo->Addr2[octet++], 1);\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n\t/* sanity check */\n\tif (octet != MAC_ADDR_LEN)\n\t{\n\t\treturn FALSE;\n\t}\n#ifdef CONFIG_AP_SUPPORT\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_SA_Proc (SA = %02x:%02x:%02x:%02x:%02x:%02x)\\n\", \n\t\tpATEInfo->Addr3[0], pATEInfo->Addr3[1], pATEInfo->Addr3[2], pATEInfo->Addr3[3],\n\t\tpATEInfo->Addr3[4], pATEInfo->Addr3[5]));\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_SA_Proc (SA = %02x:%02x:%02x:%02x:%02x:%02x)\\n\", \n\t\tpATEInfo->Addr2[0], pATEInfo->Addr2[1], pATEInfo->Addr2[2], pATEInfo->Addr2[3],\n\t\tpATEInfo->Addr2[4], pATEInfo->Addr2[5]));\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_SA_Proc Success\\n\"));\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE ADDR2=BSSID for TxFrame(AP  : To DS = 0 ; From DS = 1)\n        or\n        Set ATE ADDR1=BSSID for TxFrame(STA : To DS = 1 ; From DS = 0)\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_BSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\toctet;\n\n\t/* Mac address acceptable format 01:02:03:04:05:06 length 17 */\t\n\tif (strlen(arg) != 17)  \n\t\treturn FALSE;\n\n\tfor (octet=0, value = rstrtok(arg, \":\"); value; value = rstrtok(NULL, \":\")) \n\t{\n\t\t/* sanity check */\n\t\tif ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))))\n\t\t{\n\t\t\treturn FALSE;  \n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\tAtoH(value, &pATEInfo->Addr2[octet++], 1);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tAtoH(value, &pATEInfo->Addr1[octet++], 1);\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n\t/* sanity check */\n\tif (octet != MAC_ADDR_LEN)\n\t{\n\t\treturn FALSE;\n\t}\n#ifdef CONFIG_AP_SUPPORT\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_BSSID_Proc (BSSID = %02x:%02x:%02x:%02x:%02x:%02x)\\n\",\t\n\t\tpATEInfo->Addr2[0], pATEInfo->Addr2[1], pATEInfo->Addr2[2], pATEInfo->Addr2[3],\n\t\tpATEInfo->Addr2[4], pATEInfo->Addr2[5]));\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_BSSID_Proc (BSSID = %02x:%02x:%02x:%02x:%02x:%02x)\\n\",\t\n\t\tpATEInfo->Addr1[0], pATEInfo->Addr1[1], pATEInfo->Addr1[2], pATEInfo->Addr1[3],\n\t\tpATEInfo->Addr1[4], pATEInfo->Addr1[5]));\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_BSSID_Proc Success\\n\"));\n\n\treturn TRUE;\n}\n\n\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Channel\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_CHANNEL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR channel;\n\t\n\n\tchannel = simple_strtol(arg, 0, 10);\n\n\t/* to allow A band channel : ((channel < 1) || (channel > 14)) */\n\tif ((channel < 1) || (channel > 216))\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_CHANNEL_Proc::Out of range, it should be in range of 1~14.\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpATEInfo->Channel = channel;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_CHANNEL_Proc (ATE Channel = %d)\\n\", pATEInfo->Channel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_CHANNEL_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Initialize the channel - set the power and switch to selected channel\n\t\t\t0 => use current value\n\t\t\telse set channel to specified channel\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_INIT_CHAN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tint index;\n\tint value;\n\n\t/* Get channel parameter */\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tif (value<0 || value>216)\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_INIT_CHAN_Proc::Channel out of range\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tif (value != 0)\n\t\tpATEInfo->Channel = value;\n\n\tfor (index=0; index<MAX_NUM_OF_CHANNELS; index++)\n\t{\n\t\tif (pATEInfo->Channel == pAd->TxPower[index].Channel)\n\t\t{\n\t\t\tpATEInfo->TxPower0 = pAd->TxPower[index].Power;\n\t\t\tpATEInfo->TxPower1 = pAd->TxPower[index].Power2;\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tif (IS_RT2883(pAd) || IS_RT3593(pAd) || IS_RT3883(pAd))\n\t\t\t\tpATEInfo->TxPower2 = pAd->TxPower[index].Power3;\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (index == MAX_NUM_OF_CHANNELS)\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_INIT_CHAN_Proc::Channel not found\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t/* Force non-QATool mode */\n\tpATEInfo->bQATxStart = pATEInfo->bQARxStart = FALSE;\n\n\tATETxPwrHandler(pAd, 0);\n\tATETxPwrHandler(pAd, 1);\n#ifdef DOT11N_SS3_SUPPORT\n\tATETxPwrHandler(pAd, 2);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_INIT_CHAN_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Power\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nstatic INT ATESetAntennaTxPower(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING \t\targ,\t\n\tIN  INT \t\tAntenna)\n\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR TxPower;\n\tINT  index, maximun_index;\n\n\tpATEInfo = &(pAd->ate);\n\tTxPower = simple_strtol(arg, 0, 10);\n\tindex = Antenna;\n\tmaximun_index = pAd->Antenna.field.TxPath - 1;\n\n\tif ((index < 0) || (index > maximun_index))\n\t{\n\t\tDBGPRINT_ERR((\"No such antenna! The range is 0~%d.\\n\", maximun_index));\n\t\treturn FALSE;\n\t}\n\n\tif (pATEInfo->Channel <= 14) /* 2.4 GHz */\n\t{\n#ifdef MT7601\n\t\tif (IS_MT7601(pAd))\n\t\t{\n\t\t\tCHAR MaxPower;\n\t\t\tUINT32 RegValue = 0;\n\n\t\t\tRTMP_IO_READ32(pAd, TX_ALC_CFG_0, &RegValue);\n\t\t\tMaxPower = (RegValue & 0x003F0000) >> 16;\n\t\t\tif (TxPower > MaxPower )\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"Set_ATE_TX_POWER%d_Proc::Out of range! (Value=%d)\\n\", index, TxPower));\n\t\t\t\tDBGPRINT_ERR((\"TxPower range is 0~39 in G band.\\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* MT7601 */\n\t\tif (!IS_RT3390(pAd))\n\t\t{\n\t\t\tif ((TxPower > 31) || (TxPower < 0))\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"Set_ATE_TX_POWER%d_Proc::Out of range! (Value=%d)\\n\", index, TxPower));\n\t\t\t\tDBGPRINT_ERR((\"TxPower range is 0~31 in G band.\\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t}\n\telse /* 5.5 GHz */\n\t{\n\t\tif ((TxPower > (pATEInfo->MaxTxPowerBandA)) || (TxPower < (pATEInfo->MinTxPowerBandA)))\n\t\t{\n\t\t\tDBGPRINT_ERR((\"Set_ATE_TX_POWER%d_Proc::Out of range! (Value=%d)\\n\", index, TxPower));\n\t\t\tDBGPRINT_ERR((\"TxPower range is %d~%d in A band.\\n\", pATEInfo->MinTxPowerBandA, pATEInfo->MaxTxPowerBandA));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tswitch (index)\n\t{\n\t\tcase 0:\n\t\t\tpATEInfo->TxPower0 = TxPower;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tpATEInfo->TxPower1 = TxPower;\n\t\t\tbreak;\n#ifdef DOT11N_SS3_SUPPORT\n\t\tcase 2:\n\t\t\tpATEInfo->TxPower2 = TxPower;\n\t\t\tbreak;\t\n#endif /* DOT11N_SS3_SUPPORT */\n\t\tdefault: \n\t\t\treturn FALSE;\t\n\t}\n\n\tATETxPwrHandler(pAd, index);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_POWER%d_Proc Success\\n\", index));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Power0\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_POWER0_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tINT ret;\n\t\n\tret = ATESetAntennaTxPower(pAd, arg, 0);\n\treturn ret;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Power1\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_POWER1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tINT ret;\n\t\n\tret = ATESetAntennaTxPower(pAd, arg, 1);\n\treturn ret;\n}\n\n\n#ifdef DOT11N_SS3_SUPPORT\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Power2\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_POWER2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tINT ret;\n\t\n\tret = ATESetAntennaTxPower(pAd, arg, 2);\n\treturn ret;\n}\n#endif /* DOT11N_SS3_SUPPORT */\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Antenna\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_Antenna_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR value;\n\tINT maximun_index = pAd->Antenna.field.TxPath;\n\t\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tif ((value > maximun_index) || (value < 0))\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_Antenna_Proc::Out of range (Value=%d)\\n\", value));\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_Antenna_Proc::The range is 0~%d\\n\", maximun_index));\n\n\t\treturn FALSE;\n\t}\n\n\tpATEInfo->TxAntennaSel = value;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_Antenna_Proc (Antenna = %d)\\n\", pATEInfo->TxAntennaSel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_Antenna_Proc Success\\n\"));\n\n\t/* calibration power unbalance issues */\n\tATEAsicSwitchChannel(pAd);\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Rx Antenna\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_RX_Antenna_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR value;\n\tINT maximun_index = pAd->Antenna.field.RxPath;\n\t\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tif ((value > maximun_index) || (value < 0))\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_RX_Antenna_Proc::Out of range (Value=%d)\\n\", value));\n\t\tDBGPRINT_ERR((\"Set_ATE_RX_Antenna_Proc::The range is 0~%d\\n\", maximun_index));\n\n\t\treturn FALSE;\n\t}\n\n\tpATEInfo->RxAntennaSel = value;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_RX_Antenna_Proc (Antenna = %d)\\n\", pATEInfo->RxAntennaSel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_RX_Antenna_Proc Success\\n\"));\n\n\t/* calibration power unbalance issues */\n\tATEAsicSwitchChannel(pAd);\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\nVOID DefaultATEAsicExtraPowerOverMAC(\n\tIN\tPRTMP_ADAPTER \t\tpAd)\n{\n\tULONG\tExtraPwrOverMAC = 0;\n\tULONG\tExtraPwrOverTxPwrCfg7 = 0, ExtraPwrOverTxPwrCfg8 = 0, ExtraPwrOverTxPwrCfg9 = 0;\n\n\t/* For OFDM_54 and HT_MCS_7, extra fill the corresponding register value into MAC 0x13D4 */\n\tRTMP_IO_READ32(pAd, 0x1318, &ExtraPwrOverMAC);  \n\tExtraPwrOverTxPwrCfg7 |= (ExtraPwrOverMAC & 0x0000FF00) >> 8; /* Get Tx power for OFDM 54 */\n\tRTMP_IO_READ32(pAd, 0x131C, &ExtraPwrOverMAC);  \n\tExtraPwrOverTxPwrCfg7 |= (ExtraPwrOverMAC & 0x0000FF00) << 8; /* Get Tx power for HT MCS 7 */\t\t\t\n\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_7, ExtraPwrOverTxPwrCfg7);\n\n\t/* For STBC_MCS_7, extra fill the corresponding register value into MAC 0x13DC */\n\tRTMP_IO_READ32(pAd, 0x1324, &ExtraPwrOverMAC);  \n\tExtraPwrOverTxPwrCfg9 |= (ExtraPwrOverMAC & 0x0000FF00) >> 8; /* Get Tx power for STBC MCS 7 */\n\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_9, ExtraPwrOverTxPwrCfg9);\n\n\tif (IS_RT5392(pAd))\n\t{\t\n\t\t/*  For HT_MCS_15, extra fill the corresponding register value into MAC 0x13DC */\n\t\tRTMP_IO_READ32(pAd, 0x1320, &ExtraPwrOverMAC);  \n\t\tExtraPwrOverTxPwrCfg8 |= (ExtraPwrOverMAC & 0x0000FF00) >> 8; /* Get Tx power for HT MCS 15 */\n\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_8, ExtraPwrOverTxPwrCfg8);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Offset =0x13D8, TxPwr = 0x%08X, \", (UINT)ExtraPwrOverTxPwrCfg8));\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Offset = 0x13D4, TxPwr = 0x%08X, Offset = 0x13DC, TxPwr = 0x%08X\\n\", \n\t\t(UINT)ExtraPwrOverTxPwrCfg7, \n\t\t(UINT)ExtraPwrOverTxPwrCfg9));\n}\n\n\nVOID ATEAsicExtraPowerOverMAC(\n\tIN\tPRTMP_ADAPTER \t\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->AsicExtraPowerOverMAC!= NULL)\n\t\tpATEInfo->pChipStruct->AsicExtraPowerOverMAC(pAd);\n\n\treturn;\n}\n\n\nVOID ATEAsicTemperCompensation(\n\tIN\tPRTMP_ADAPTER \t\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->TemperCompensation!= NULL)\n\t\tpATEInfo->pChipStruct->TemperCompensation(pAd);\n\n\treturn;\n}\n\n\n#ifdef RT3350\n/* \n==========================================================================\n    Description:\n        Set ATE PA bias to improve EVM\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT Set_ATE_PA_Bias_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR PABias = 0;\n\tUCHAR RFValue;\n\t\n\tPABias = simple_strtol(arg, 0, 10);\n\n\tif (PABias >= 16)\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_PA_Bias_Proc::Out of range, it should be in range of 0~15.\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpATEInfo->PABias = PABias;\n\n\tATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R19, (PUCHAR)&RFValue);\n\tRFValue = (((RFValue & 0x0F) | (pATEInfo->PABias << 4)));\n\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R19, (UCHAR)RFValue);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_PA_Bias_Proc (PABias = %d)\\n\", pATEInfo->PABias));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_PA_Bias_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n#endif /* RT3350 */\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE RF BW(default)\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tDefault_Set_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR RFFreqOffset = 0;\n\n\t\n\tRFFreqOffset = simple_strtol(arg, 0, 10);\n\n\tif (RFFreqOffset >= 64)\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_FREQ_OFFSET_Proc::Out of range(0 ~ 63).\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpATEInfo->RFFreqOffset = RFFreqOffset;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_FREQOFFSET_Proc (RFFreqOffset = %d)\\n\", pATEInfo->RFFreqOffset));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_FREQOFFSET_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE RF frequence offset\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT ret = FALSE;\n\n\tif (pATEInfo->pChipStruct->Set_FREQ_OFFSET_Proc != NULL)\n\t{\n\t\tret = pATEInfo->pChipStruct->Set_FREQ_OFFSET_Proc(pAd, arg);\n\t}\n\n\tif (ret == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_FREQ_OFFSET_Proc (RFFreqOffset = %d)\\n\", pATEInfo->RFFreqOffset));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_FREQ_OFFSET_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n\treturn ret;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE RF BW(default)\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tDefault_Set_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT powerIndex;\n\tUCHAR value = 0;\n\tUCHAR BBPCurrentBW;\n\t\n\tBBPCurrentBW = simple_strtol(arg, 0, 10);\n\n\tif ((BBPCurrentBW == 0)\n\t\t)\n\t{\n\t\tpATEInfo->TxWI.TxWIBW = BW_20;\n\t}\n\telse\n\t{\n\t\tpATEInfo->TxWI.TxWIBW = BW_40;\n \t}\n\n\tif ((pATEInfo->TxWI.TxWIPHYMODE == MODE_CCK) && (pATEInfo->TxWI.TxWIBW == BW_40))\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_BW_Proc!! Warning!! CCK only supports 20MHZ!!\\n\"));\n\t\tDBGPRINT_ERR((\"Bandwidth switch to 20!!\\n\"));\n\t\tpATEInfo->TxWI.TxWIBW = BW_20;\n\t}\n\n\tif (pATEInfo->TxWI.TxWIBW == BW_20)\n\t{\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\t/* BW=20;G band */\n \t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n \t\t\t{\n\t\t\t\tif (pAd->Tx20MPwrCfgGBand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx20MPwrCfgGBand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* BW=20;A band */\n \t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n \t\t\t{\n\t\t\t\tif (pAd->Tx20MPwrCfgABand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx20MPwrCfgABand[powerIndex]);\t\n \t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n \t\t\t}\n\t\t}\n\n\t\t/* set BW = 20 MHz */\n\t\t/* Set BBP R4 bit[4:3]=0:0 */\n \t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n \t\tvalue &= (~0x18);\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\n\n\t\t/* Set BBP R66=0x3C */\n\t\tvalue = 0x3C;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value);\n\n\t\t/* set BW = 20 MHz */\n\t\t{\n\t\t\tpAd->LatchRfRegs.R4 &= ~0x00200000;\n\t\t\tRtmpRfIoWrite(pAd);\n\t\t}\n\n\t\t/* BW = 20 MHz */\n\t\t/* Set BBP R68=0x0B to improve Rx sensitivity. */\n\t\tvalue = 0x0B;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value);\n\t\t/* Set BBP R69=0x16 */\n\t\tvalue = 0x16;\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value);\n\t\t/* Set BBP R70=0x08 */\n\t\tvalue = 0x08;\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value);\n\t\t/* Set BBP R73=0x11 */\n\t        if ( IS_RT5390(pAd) || IS_RT5392(pAd))\n\t\t    value = 0x13;\n\t        else\n\t\t    value = 0x11;\n\n \t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value);\n\n\n\t\tif (pATEInfo->Channel == 14)\n\t\t{\n\t\t\tINT TxMode = pATEInfo->TxWI.TxWIPHYMODE;\n\n\t\t\tif (TxMode == MODE_CCK)\n\t\t\t{\n\t\t\t\t/* when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 */\n \t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n\t\t\t\tvalue |= 0x20; /* set bit5=1 */\n \t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\t/* If bandwidth = 40M, set RF Reg4 bit 21 = 0. */\n\telse if (pATEInfo->TxWI.TxWIBW == BW_40)\n\t{\n\t\tif (pATEInfo->Channel <= 14)\n\t\t{\n\t\t\t/* BW=40;G band */\n\t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n\t\t\t{\n\t\t\t\tif (pAd->Tx40MPwrCfgGBand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx40MPwrCfgGBand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* BW=40;A band */\n\t\t\tfor (powerIndex=0; powerIndex<MAX_TXPOWER_ARRAY_SIZE; powerIndex++)\n\t\t\t{\n\t\t\t\tif (pAd->Tx40MPwrCfgABand[powerIndex] == 0xffffffff)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + powerIndex*4, pAd->Tx40MPwrCfgABand[powerIndex]);\t\n\t\t\t\tRtmpOsMsDelay(5);\t\t\t\t\n\t\t\t}\t\t\n\n\t\t\tif ((pATEInfo->TxWI.TxWIPHYMODE >= 2) && (pATEInfo->TxWI.TxWIMCS == 7))\n\t\t\t{\n    \t\t\tvalue = 0x28;\n    \t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, value);\n\t\t\t}\n\t\t}\n\n\t\t/* Set BBP R4 bit[4:3]=1:0 */\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);\n\t\tvalue &= (~0x18);\n\t\tvalue |= 0x10;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);\n\n\t\t/* Set BBP R66=0x3C */\n\t\tvalue = 0x3C;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value);\n\n\n\t\t/* Set BBP R68=0x0C to improve Rx sensitivity. */\n\t\tvalue = 0x0C;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value);\n\t\t/* Set BBP R69=0x1A */\n\t\tvalue = 0x1A;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value);\n\t\t/* Set BBP R70=0x0A */\n\t\tvalue = 0x0A;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value);\n\t\t/* Set BBP R73=0x16 */\n\t        if (IS_RT5390(pAd) || IS_RT5392(pAd))\n\t\t    value = 0x13;\n\t        else\n\t\t    value = 0x16;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_BW_Proc (BBPCurrentBW = %d)\\n\", pATEInfo->TxWI.TxWIBW));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_BW_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE RF BW\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->Set_BW_Proc != NULL)\n\t\tpATEInfo->pChipStruct->Set_BW_Proc(pAd, arg);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_BW_Proc (BBPCurrentBW = %d)\\n\", pATEInfo->TxWI.TxWIBW));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_BW_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx frame length\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_LENGTH_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tpATEInfo->TxLength = simple_strtol(arg, 0, 10);\n\n\tif ((pATEInfo->TxLength < 24) || (pATEInfo->TxLength > (MAX_FRAME_SIZE - 34/* == 2312 */)))\n\t{\n\t\tpATEInfo->TxLength = (MAX_FRAME_SIZE - 34/* == 2312 */);\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_LENGTH_Proc::Out of range, it should be in range of 24~%d.\\n\", (MAX_FRAME_SIZE - 34/* == 2312 */)));\n\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_LENGTH_Proc (TxLength = %d)\\n\", pATEInfo->TxLength));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_LENGTH_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx frame count\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_COUNT_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\tpATEInfo->TxCount = simple_strtol(arg, 0, 10);\n\n\tif (pATEInfo->TxCount == 0)\n\t{\n\t\tpATEInfo->TxCount = 0xFFFFFFFF;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_COUNT_Proc (TxCount = %d)\\n\", pATEInfo->TxCount));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_COUNT_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx frame MCS\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_MCS_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR MCS;\n\tINT result;\n\n\tMCS = simple_strtol(arg, 0, 10);\n\tresult = CheckMCSValid(pAd, pATEInfo->TxWI.TxWIPHYMODE, MCS);\n\n\tif (result != -1)\n\t{\n\t\tpATEInfo->TxWI.TxWIMCS = (UCHAR)MCS;\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_MCS_Proc::Out of range, refer to rate table.\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_MCS_Proc (MCS = %d)\\n\", pATEInfo->TxWI.TxWIMCS));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_MCS_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx frame Mode\n        0: MODE_CCK\n        1: MODE_OFDM\n        2: MODE_HTMIX\n        3: MODE_HTGREENFIELD\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_MODE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR BbpData = 0;\n\n\tpATEInfo->TxWI.TxWIPHYMODE = simple_strtol(arg, 0, 10);\n\n\tif (pATEInfo->TxWI.TxWIPHYMODE > 3)\n\t{\n\t\tpATEInfo->TxWI.TxWIPHYMODE = 0;\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_MODE_Proc::Out of range.\\nIt should be in range of 0~3\\n\"));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"0: CCK, 1: OFDM, 2: HT_MIX, 3: HT_GREEN_FIELD.\\n\"));\n\t\treturn FALSE;\n\t}\n\n#if defined(RT5592) || defined(MT7601)\n\t/* Turn on BBP 20MHz mode by request here. */\n\tif (IS_RT5592(pAd) || IS_MT7601(pAd))\n\t{\n\t\tif (pATEInfo->TxWI.TxWIBW == BW_20)\n\t\t{\n\t\t\tBbpData = 0x40;\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData);\n\t\t}\n\t\telse /* BW == 40MHz */\n\t\t{\n\t\t\tBbpData = 0x50;\n\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData);\n\t\t}\n\t}\n\t//else\n#endif /* defined(RT5592) || defined(MT7601) */\n\t/* Turn on BBP 20MHz mode by request here. */\n\tif (pATEInfo->TxWI.TxWIPHYMODE == MODE_CCK)\n\t{\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BbpData);\n\t\tBbpData &= (~0x18);\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData);\n\t\tpATEInfo->TxWI.TxWIBW = BW_20;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_ATE_TX_MODE_Proc::CCK Only support 20MHZ. Switch to 20MHZ.\\n\"));\n\t}\n\n#ifdef RT3350\n\tif (IS_RT3350(pAd))\n\t{\n\t\tif (pATEInfo->TxWI.TxWIPHYMODE == MODE_CCK)\n\t\t{\n\t\t\tUSHORT value;\n\t\t\tUCHAR  rf_offset;\n\t\t\tUCHAR  rf_value;\n\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x126, value);\n\t\t\trf_value = value & 0x00FF;\n\t\t\trf_offset = (value & 0xFF00) >> 8;\n\n\t\t\tif(rf_offset == 0xff)\n\t\t\t    rf_offset = RF_R21;\n\t\t\tif(rf_value == 0xff)\n\t\t\t    rf_value = 0x4F;\n\t\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, rf_offset, (UCHAR)rf_value);\n\t\t\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x12a, value);\n\t\t\trf_value = value & 0x00FF;\n\t\t\trf_offset = (value & 0xFF00) >> 8;\n\n\t\t\tif(rf_offset == 0xff)\n\t\t\t    rf_offset = RF_R29;\n\t\t\tif(rf_value == 0xff)\n\t\t\t    rf_value = 0x07;\n\t\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, rf_offset, (UCHAR)rf_value);\n\t\t\n\n\t\t\t/* set RF_R24 */\n\t\t\tif (pATEInfo->TxWI.BW == BW_40)\n\t\t\t{    \n\t\t\t\tvalue = 0x3F;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvalue = 0x1F;\n\t\t\t}\n\t\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR)value);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUSHORT value;\n\t\t\tUCHAR  rf_offset;\n\t\t\tUCHAR  rf_value;\n\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x124, value);\n\t\t\trf_value = value & 0x00FF;\n\t\t\trf_offset = (value & 0xFF00) >> 8;\n\n\t\t\tif(rf_offset == 0xff)\n\t\t\t    rf_offset = RF_R21;\n\t\t\tif(rf_value == 0xff)\n\t\t\t    rf_value = 0x6F;\n\t\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, rf_offset, (UCHAR)rf_value);\n\t\t\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x128, value);\n\t\t\trf_value = value & 0x00FF;\n\t\t\trf_offset = (value & 0xFF00) >> 8;\n\n\t\t\tif(rf_offset == 0xff)\n\t\t\t    rf_offset = RF_R29;\n\t\t\tif(rf_value == 0xff)\n\t\t\t    rf_value = 0x07;\n\t\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, rf_offset, (UCHAR)rf_value);\n\t\t\n\t\t\t/* set RF_R24 */\n\t\t\tif (pATEInfo->TxWI.BW == BW_40)\n\t\t\t{    \n\t\t\t\tvalue = 0x28;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvalue = 0x18;\n\t\t\t}\n\t\t\tATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR)value);\n\t\t}\n\t}\n#endif /* RT3350 */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_MODE_Proc (TxMode = %d)\\n\", pATEInfo->TxWI.TxWIPHYMODE));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_MODE_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx frame GI\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TX_GI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\tpATEInfo->TxWI.TxWIShortGI = simple_strtol(arg, 0, 10);\n\n\tif (pATEInfo->TxWI.TxWIShortGI > 1)\n\t{\n\t\tpATEInfo->TxWI.TxWIShortGI = 0;\n\t\tDBGPRINT_ERR((\"Set_ATE_TX_GI_Proc::Out of range\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_TX_GI_Proc (GI = %d)\\n\", pATEInfo->TxWI.TxWIShortGI));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_TX_GI_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\nINT\tSet_ATE_RX_FER_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tpATEInfo->bRxFER = simple_strtol(arg, 0, 10);\n\n\tif (pATEInfo->bRxFER == 1)\n\t{\n\t\tpATEInfo->RxCntPerSec = 0;\n\t\tpATEInfo->RxTotalCnt = 0;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_RX_FER_Proc (bRxFER = %d)\\n\", pATEInfo->bRxFER));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_RX_FER_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\nINT Set_ATE_Read_RF_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"R1 = %x\\n\", pAd->LatchRfRegs.R1));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"R2 = %x\\n\", pAd->LatchRfRegs.R2));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"R3 = %x\\n\", pAd->LatchRfRegs.R3));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"R4 = %x\\n\", pAd->LatchRfRegs.R4));\n\t}\n\treturn TRUE;\n}\n\n\nINT Set_ATE_Write_RF1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32 value = (UINT32) simple_strtol(arg, 0, 16);\t\n\n\tpAd->LatchRfRegs.R1 = value;\n\tRtmpRfIoWrite(pAd);\n\n\treturn TRUE;\n}\n\n\nINT Set_ATE_Write_RF2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32 value = (UINT32) simple_strtol(arg, 0, 16);\n\n\tpAd->LatchRfRegs.R2 = value;\n\tRtmpRfIoWrite(pAd);\n\n\treturn TRUE;\n}\n\n\nINT Set_ATE_Write_RF3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32 value = (UINT32) simple_strtol(arg, 0, 16);\n\n\tpAd->LatchRfRegs.R3 = value;\n\tRtmpRfIoWrite(pAd);\n\n\treturn TRUE;\n}\n\n\nINT Set_ATE_Write_RF4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32 value = (UINT32) simple_strtol(arg, 0, 16);\n\n\tpAd->LatchRfRegs.R4 = value;\n\tRtmpRfIoWrite(pAd);\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Load and Write EEPROM from a binary file prepared in advance.\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT Set_ATE_Load_E2P_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\t\t    \tret = FALSE;\n\tPSTRING\t\t\tsrc = EEPROM_BIN_FILE_NAME;\n\tRTMP_OS_FD\t\tsrcf;\n\tINT32 \t\t\tretval;\n\tUSHORT \t\t\tWriteEEPROM[(EEPROM_SIZE >> 1)];\n\tINT\t\t\t\tFileLength = 0;\n\tUINT32 \t\t\tvalue = (UINT32) simple_strtol(arg, 0, 10);\n\tRTMP_OS_FS_INFO\tosFSInfo;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"===> %s (value=%d)\\n\\n\", __FUNCTION__, value));\n\n\tif (value > 0)\n\t{\n\t\t/* zero the e2p buffer */\n\t\tNdisZeroMemory((PUCHAR)WriteEEPROM, EEPROM_SIZE);\n\n\t\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\t\tdo\n\t\t{\n\t\t\t/* open the bin file */\n\t\t\tsrcf = RtmpOSFileOpen(src, O_RDONLY, 0);\n\n\t\t\tif (IS_FILE_OPEN_ERR(srcf)) \n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"%s - Error opening file %s\\n\", __FUNCTION__, src));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* read the firmware from the file *.bin */\n\t\t\tFileLength = RtmpOSFileRead(srcf, (PSTRING)WriteEEPROM, EEPROM_SIZE);\n\n\t\t\tif (FileLength != EEPROM_SIZE)\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"%s : error file length (=%d) in e2p.bin\\n\",\n\t\t\t\t\t   __FUNCTION__, FileLength));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* write the content of .bin file to EEPROM */\n\t\t\t\trt_ee_write_all(pAd, WriteEEPROM);\n\t\t\t\tret = TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t\t} while(TRUE);\n\n\t\t/* close firmware file */\n\t\tif (IS_FILE_OPEN_ERR(srcf))\n\t\t{\n\t\t\t;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tretval = RtmpOSFileClose(srcf);\t\t\t\n\n\t\t\tif (retval)\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"--> Error %d closing %s\\n\", -retval, src));\n\t\t\t\t\n\t\t\t} \n\t\t}\n\n\t\t/* restore */\n\t\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\t\t\n\t}\n\n    DBGPRINT(RT_DEBUG_OFF, (\"<=== %s (ret=%d)\\n\", __FUNCTION__, ret));\n\n    return ret;\n}\n\n\n#ifdef RTMP_EFUSE_SUPPORT\n/* \n==========================================================================\n    Description:\n        Load and Write E-Fuse from pAd->EEPROMImage.\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT Set_ATE_Load_E2P_From_Buf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\t\t    \tret = FALSE;\n\tUINT32 \t\t\tvalue = (UINT32) simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"===> %s (value=%d)\\n\\n\", __FUNCTION__, value));\n\n\tif (value > 0)\n\t{\n\n\t\trt_ee_write_all(pAd, pAd->EEPROMImage);\n\t\tret = TRUE;\n\t\n\t}\n\n    DBGPRINT(RT_DEBUG_OFF, (\"<=== %s (ret=%d)\\n\", __FUNCTION__, ret));\n\n    return ret;\n}\n\n\nINT Set_ATE_Cal_Free_Info_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\t\t    \tret = FALSE;\n\n\tif ( pAd->bCalFreeIC )\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s (bCalFreeIC=TRUE)\\n\\n\", __FUNCTION__));\n\telse\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s (bCalFreeIC=FALSE)\\n\\n\", __FUNCTION__));\n\n\treturn TRUE;\n}\n\n#endif /* RTMP_EFUSE_SUPPORT */\n\n\nINT Set_ATE_Read_E2P_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT buffer[EEPROM_SIZE >> 1];\n\tUSHORT *p;\n\tint i;\n\t\n\trt_ee_read_all(pAd, (USHORT *)buffer);\n\tp = buffer;\n\tfor (i = 0; i < (EEPROM_SIZE >> 1); i++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%4.4x \", *p));\n\t\tif (((i+1) % 16) == 0)\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\tp++;\n\t}\n\treturn TRUE;\n}\n\n\n#ifdef LED_CONTROL_SUPPORT\n#endif /* LED_CONTROL_SUPPORT */\n\n\n/* \n==========================================================================\n    Description:\n        Enable ATE auto Tx alc (Tx auto level control).\n        According to the chip temperature, auto adjust the transmit power.  \n        \n        0: disable\n        1: enable\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_AUTO_ALC_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32 value = simple_strtol(arg, 0, 10);\n\n\tif (value > 0)\n\t{\n\t\tpATEInfo->bAutoTxAlc = TRUE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ATEAUTOALC = TRUE , auto alc enabled!\\n\"));\n\t}\n\telse\n\t{\n\t\tpATEInfo->bAutoTxAlc = FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ATEAUTOALC = FALSE , auto alc disabled!\\n\"));\n\t}\t\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n#ifdef TXBF_SUPPORT\n/* \n==========================================================================\n    Description:\n        Set ATE Tx Beamforming mode\n        \n        Return:\n        \tTRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TXBF_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR value;\n\t\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tswitch (value)\n\t{\n\t\tcase 0:\n\t\t\t/* no BF */\n\t\t\tpATEInfo->TxWI.iTxBF = pATEInfo->TxWI.eTxBF = 0;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\t/* ETxBF */\n\t\t\tpATEInfo->TxWI.eTxBF = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\t/* ITxBF */\n\t\t\tpATEInfo->TxWI.iTxBF = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\t/* Enable TXBF support */\n\t\tpATEInfo->bTxBF = TRUE;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\t/* Disable TXBF support */\n\t\t\tpATEInfo->bTxBF = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT_ERR((\"Set_ATE_TXBF_Proc: Invalid parameter %d\\n\", value));\n\t\t\tbreak;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n\t}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Sounding type\n\t\t\t0 => no sounding\n\t\t\t1 => Data sounding\n\t\t\t2 => 2 stream NDP sounding\n\t\t\t3 => 3 stream NDP Sounding\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TXSOUNDING_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tCHAR value;\n\t\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tif (value<0 || value>3)\n\t{\n\t\tDBGPRINT_ERR((\"Set_ATE_TXSOUNDING_Proc: Invalid parameter %d\\n\", value));\n\t\treturn FALSE;\n\t}\t\n\n\tpATEInfo->txSoundingMode = value;\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Do a Divider Calibration on calibration channels and save in EEPROM\n\t\t\t0 => do G and A band\n\t\t\t1 => G band only\n\t\t\t2 => A band only\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TXBF_DIVCAL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tint value;\n\tITXBF_DIV_PARAMS divParams;\n\tCHAR initChanArg[] = \"0\";\n\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tif (value<0 || value>2)\n\t\treturn FALSE;\n\n\t/* G band */\n\tif (value==0 || value==1)\n\t{\n\t\tpATEInfo->Channel = 1;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFDividerCalibration(pAd, 1, 0, NULL);\n\n\t\tpATEInfo->Channel = 14;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFDividerCalibration(pAd, 1, 0, NULL);\n\n\t\t/* Display delta phase information */\n\t\tITxBFGetEEPROM(pAd, NULL, NULL, &divParams);\n\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Divider Cal Done:\\n\"\n\t\t\t\t\t\t\"ch1-ch14 = [%2d, %2d] degrees\\n\"\n\t\t\t\t\t\t\"ant0-ant2 = [%2d, %2d] degrees\\n\",\n\t\t\t\t(UCHAR)(divParams.gBeg[0]-divParams.gEnd[0])*360/256,\n\t\t\t\t(UCHAR)(divParams.gBeg[1]-divParams.gEnd[1])*360/256,\n\t\t\t\t(UCHAR)(divParams.gBeg[0]-divParams.gBeg[1])*360/256,\n\t\t\t\t(UCHAR)(divParams.gEnd[0]-divParams.gEnd[1])*360/256) );\n\t}\n\n\t/* A Band */\n\tif (value==0 || value==2)\n\t{\n\t\tpATEInfo->Channel = 36;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFDividerCalibration(pAd, 1, 0, NULL);\n\n\t\tpATEInfo->Channel = 120;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFDividerCalibration(pAd, 1, 0, NULL);\n\n\t\tpATEInfo->Channel = 165;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFDividerCalibration(pAd, 1, 0, NULL);\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n==========================================================================\n    Description:\n        Do a LNA Calibration on calibration channels and save in EEPROM\n\t\t\t0 => do G and A band\n\t\t\t1 => G band only\n\t\t\t2 => A band only\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_TXBF_LNACAL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tint value;\n\tint i;\n\tCHAR initChanArg[] = \"0\";\n\n\tvalue = simple_strtol(arg, 0, 10);\n\n\tif (value<0 || value>2)\n\t\treturn FALSE;\n\n\t/* G Band */\n\tif (value==0 || value==1)\n\t{\n\t\tpATEInfo->Channel = 1;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFLNACalibration(pAd, 1, 0, TRUE);\n\n\t\tpATEInfo->Channel = 14;\n\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\tITxBFLNACalibration(pAd, 1, 0, TRUE);\n\t}\n\n\t/* A Band */\n\tif (value==0 || value==2)\n\t{\n\t\tstatic UCHAR channels[6] = {36, 64, 100, 128, 132, 165};\n\t\tfor (i=0; i<6; i++)\n\t\t{\n\t\t\tpATEInfo->Channel = channels[i];\n\t\t\tSet_ATE_INIT_CHAN_Proc(pAd, initChanArg);\n\t\t\tITxBFLNACalibration(pAd, 1, 0, FALSE);\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n\tSanity check for the channel of Implicit TxBF calibration.\n        \t\n    Return:\n\tTRUE if all parameters are OK, FALSE otherwise\n\n    Note: \n\t1. This sanity check function only work for Implicit TxBF calibration.\n\t2. Currently supported channels are:\n        \t1, 14, 36, 64, 128, 132, 165\n==========================================================================\n*/\nstatic BOOLEAN rtmp_ate_txbf_cal_valid_ch(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR channel)\n{\n\tBOOLEAN bValidCh;\n\n\t/* TODO: shall we check the capability of the chipset here ?? */\n\tswitch (channel)\n\t{\n\t\tcase 1:\n\t\tcase 14:\n#ifdef A_BAND_SUPPORT\n\t\tcase 36:\n\t\tcase 64:\n\t\tcase 100:\n\t\tcase 128:\n\t\tcase 132:\n\t\tcase 165:\n#endif /* A_BAND_SUPPORT */\n\t\t\tbValidCh = TRUE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbValidCh = FALSE;\n\t\t\tbreak;\n\t}\n\n\treturn bValidCh;\t\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set to start the initialization procedures of iTxBf calibration in DUT side\n\t\t\t0 => do nothing\n\t\t\t1 => do following initializations\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n\n    Note: \n   \tThis cmd shall only used in DUT side for calibration\n==========================================================================\n*/\nINT Set_ATE_TXBF_INIT_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tint val;\n\tUSHORT eepromVal;\n\tUCHAR cmdStr[32];\n\t\n\tval = simple_strtol(arg, 0, 10);\n\tif (val != 1)\n\t\treturn FALSE;\n\n\t/* Do ATESTART */\n#ifdef CONFIG_RT2880_ATE_CMD_NEW\n\tSet_ATE_Proc(pAd, \"ATESTART\");\n#else\n\tSet_ATE_Proc(pAd, \"APSTOP\");\n#endif /* CONFIG_RT2880_ATE_CMD_NEW */\n\n\t/* set ATETXBF=3 */\n\tSet_ATE_TXBF_Proc(pAd, \"3\");\n\n\n\t/* Set self mac address as 22:22:22:22:22:22 */\n\tRTMP_IO_WRITE32(pAd, 0x1008, 0x22222222);\n\tRTMP_IO_WRITE32(pAd, 0x100c, 0x00002222);\n\n\t/* set ATEDA=11:11:11:11:11:11 */\n\t/* set ATESA=22:22:22:22:22:22 */\n\t/* set ATEBSSID=22:22:22:22:22:22 */\n\tfor (val = 0; val < MAC_ADDR_LEN; val++)\n\t{\n\t\tpATEInfo->Addr1[val] = 0x11; /* the RA */\n\t\tpATEInfo->Addr2[val] = 0x22; /* the TA */\n\t\tpATEInfo->Addr3[val] = 0x22;\t/* the BSSID */\n\t}\n\n\t/* set ATETXMODE=2 */\n\tSet_ATE_TX_MODE_Proc(pAd, \"2\");\n\t\n\t/* set ATETXMCS=16 */\n\tSet_ATE_TX_MCS_Proc(pAd, \"16\");\n\t\n\t/* set ATETXBW=0 */\n\tSet_ATE_TX_BW_Proc(pAd, \"0\");\n\t\n\t/* set ATETXGI=0 */\n\tSet_ATE_TX_GI_Proc(pAd, \"0\");\n\t\n\t/* set ATETXANT=0 */\n\tSet_ATE_TX_Antenna_Proc(pAd, \"0\");\n\t\n\t/* set ATERXANT=0 */\n\tSet_ATE_RX_Antenna_Proc(pAd, \"0\");\n\t\n\t/* set ATETXFREQOFFSET=eeprom */\n\t/* read EEPROM Frequency offset from EEPROM and set it to BBP */\n\tRT28xx_EEPROM_READ16(pAd, 0x44, eepromVal);\n\tsnprintf(cmdStr, sizeof(cmdStr), \"%d\\n\", (eepromVal & 0xff));\n\tSet_ATE_TX_FREQ_OFFSET_Proc(pAd, cmdStr);\n\t\n\t/* bbp 65=29 */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R65, 0x29);\n\t\n\t/* bbp 163=bd */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R163, 0xbd);\n\t\n\t/* bbp 173=28 */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, 0x28);\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set to do iTxBF calibration procedures for specific channel, following show us the supported channels.\n        \t1, 14, 36, 64, 128, 132, 165\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n\n    Note: \n   \tThis cmd shall only used in DUT side for calibration\n==========================================================================\n*/\nINT Set_ATE_TXBF_CAL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ch;\n\tUCHAR cmdStr[32];\n\t\n\tch = simple_strtol(arg, 0, 10);\n\tif (rtmp_ate_txbf_cal_valid_ch(pAd, ch) == FALSE)\n\t\treturn FALSE;\n\n\t/* iwpriv ra0 set ATECHANNEL=Channel */\n\tsnprintf(cmdStr, sizeof(cmdStr), \"%d\\n\", ch);\n\tif (Set_ATE_CHANNEL_Proc(pAd, cmdStr) == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATEINITCHAN =0 */\n\tif (Set_ATE_INIT_CHAN_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXSOUNDING=3 */\n\tif (Set_ATE_TXSOUNDING_Proc(pAd, \"3\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ETxBfNoncompress=0 */\n\tif (Set_ETxBfNoncompress_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXMCS=0 */\n\tif (Set_ATE_TX_MCS_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXCNT=1 */\n\tif (Set_ATE_TX_COUNT_Proc(pAd, \"1\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXLEN=258 */\n\tif (Set_ATE_TX_LENGTH_Proc(pAd, \"258\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set InvTxBfTag=0 */\n\tif (Set_InvTxBfTag_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATE=TXFRAME */\n\tif (Set_ATE_Proc(pAd, \"TXFRAME\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ITxBfCal=1 */\n\treturn Set_ITxBfCal_Proc(pAd, \"1\");\n\t\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set to start the initialization procedures of iTxBf calibration in Golden side at specified channel\n\t\t\targ => valid values are \"1, 14, 36, 64, 128, 132, 165\"\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n\n    Note: \n   \tThis cmd shall only used in GOLDEN side for calibration feedback\n==========================================================================\n*/\nINT Set_ATE_TXBF_GOLDEN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ch;\n\tUCHAR cmdStr[32];\n\tUSHORT eepromVal;\n\t\n\tch = simple_strtol(arg, 0, 10);\n\tif (rtmp_ate_txbf_cal_valid_ch(pAd, ch) == FALSE)\n\t\treturn FALSE;\t\n\n\t/* iwpriv ra0 set ATE=ATESTART */\n#ifdef\tCONFIG_RT2880_ATE_CMD_NEW\n\tSet_ATE_Proc(pAd, \"ATESTART\");\n#else\n\tSet_ATE_Proc(pAd, \"APSTOP\");\n#endif // CONFIG_RT2880_ATE_CMD_NEW //\n\n\t/* set the ate channel and read txpower from EEPROM and set to bbp */\n\t/* iwpriv ra0 set ATECHANNEL=Channel */\n\t/* iwpriv ra0 set ATETXPOWER=0 */\n\tsnprintf(cmdStr, sizeof(cmdStr), \"%d\\n\", ch);\n\tSet_ATE_INIT_CHAN_Proc(pAd, cmdStr);\n\t\n\n\t/* Set self mac address as 11:11:11:11:11:11 */\n\t/* iwpriv ra0 set ATESA=11:11:11:11:11:11 */\n\tRTMP_IO_WRITE32(pAd, 0x1008, 0x11111111);\n\tRTMP_IO_WRITE32(pAd, 0x100c, 0x00001111);\n\t\n\t/* iwpriv ra0 set ATETXMODE=2 */\n\tSet_ATE_TX_MODE_Proc(pAd, \"2\");\n\t\n\t/* iwpriv ra0 set ATETXBW=0 */\n\tSet_ATE_TX_BW_Proc(pAd, \"0\");\n\t\n\t/* iwpriv ra0 set ATETXGI=0 */\n\tSet_ATE_TX_GI_Proc(pAd, \"0\");\n\t\n\t/* iwpriv ra0 set ATETXANT=1 */\n\tSet_ATE_TX_Antenna_Proc(pAd, \"1\");\n\t\n\t/* iwpriv ra0 set ATERXANT=1 */\n\tSet_ATE_RX_Antenna_Proc(pAd, \"1\");\n\n\t/* iwpriv ra0 set ATETXFREQOFFSET=ValueOfEEPROM */\n\tRT28xx_EEPROM_READ16(pAd, 0x44, eepromVal);\n\tsnprintf(cmdStr, sizeof(cmdStr), \"%d\\n\", (eepromVal & 0xff));\n\tSet_ATE_TX_FREQ_OFFSET_Proc(pAd, cmdStr);\n\t\n\t/* iwpriv ra0 bbp 65=29 */\n\t/* iwpriv ra0 bbp 163=9d */\n\t/* iwpriv ra0 bbp 173=00 */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R65, 0x29);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R163, 0x9d);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, 0x00);\n\t\n\t/* iwpriv ra0 set ATE=RXFRAME */\n\tSet_ATE_Proc(pAd, \"RXFRAME\");\n\t\n\t/* reset the BBP_R173 as 0 to eliminate the compensation */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, 0x00);\n\t\n\treturn TRUE;\n\n}\n\n\n/* \n==========================================================================\n    Description:\n\tSet to do iTxBF calibration verification procedures at sepcified channel, following show us the supported channels.\n\t\targs=> valid values are \"1, 14, 36, 64, 128, 132, 165\"\n\n    Return:\n\tTRUE if all parameters are OK, FALSE otherwise\n\n    Note: \n\tThis cmd shall only used in GOLDEN side for calibration verification\n==========================================================================\n*/\nINT Set_ATE_TXBF_VERIFY_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ch;\n\tUCHAR cmdStr[32];\n\t\n\tch = simple_strtol(arg, 0, 10);\n\tif (rtmp_ate_txbf_cal_valid_ch(pAd, ch) == FALSE)\n\t\treturn FALSE;\n\n\t/* iwpriv ra0 set ATECHANNEL=Channel */\n\tsnprintf(cmdStr, sizeof(cmdStr), \"%d\\n\", ch);\n\tif (Set_ATE_CHANNEL_Proc(pAd, cmdStr) == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXSOUNDING=3 */\n\tif (Set_ATE_TXSOUNDING_Proc(pAd, \"3\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ETxBfNoncompress=0 */\n\tif (Set_ETxBfNoncompress_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\n\t/* iwpriv ra0 set ATETXMCS=0 */\t\n\tif (Set_ATE_TX_MCS_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXCNT=1 */\n\tif (Set_ATE_TX_COUNT_Proc(pAd, \"1\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXLEN=258 */\n\tif (Set_ATE_TX_LENGTH_Proc(pAd, \"258\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set InvTxBfTag=0 */\n\tif (Set_InvTxBfTag_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\n\t/* iwpriv ra0 set ATE=TXFRAME */\n\tif (Set_ATE_Proc(pAd, \"TXFRAME\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ITxBfCal=0 */\n\treturn Set_ITxBfCal_Proc(pAd, \"0\");\n}\n\n\nINT Set_ATE_ForceBBP_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR bbpReg;\n\n\tbbpReg = simple_strtol(arg, 0, 10);\n\n\t/*\n\t\t0: no any restriction for BBP writing\n\t\t1~255: force to not allow to change this specific BBP register.\n\t\t\n\t\tNote: \n\t\t\tBBP_R0 is not write-able, so use 0 as the rest operation shall be safe enough\n\t*/\n\tpATEInfo->forceBBPReg = bbpReg;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_ForceBBP_Proc:(forceBBPReg value=%d)\\n\", pATEInfo->forceBBPReg));\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n\tSet to do iTxBF calibration verification without R173 compensation procedures at sepcified channel, following show us the supported channels.\n\t\targs=> valid values are \"1, 14, 36, 64, 128, 132, 165\"\n\n    Return:\n\tTRUE if all parameters are OK, FALSE otherwise\n\n    Note: \n\tThis cmd shall only used in GOLDEN side for calibration verification\n==========================================================================\n*/\nINT Set_ATE_TXBF_VERIFY_NoComp_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ch;\n\tUCHAR cmdStr[32];\n\tUCHAR bbpR173 = 0;\n\tint retval;\n\t\n\tch = simple_strtol(arg, 0, 10);\n\tif (rtmp_ate_txbf_cal_valid_ch(pAd, ch) == FALSE)\n\t\treturn FALSE;\n\n\t/* iwpriv ra0 set ATECHANNEL=Channel */\n\tsnprintf(cmdStr, sizeof(cmdStr), \"%d\\n\", ch);\n\tif (Set_ATE_CHANNEL_Proc(pAd, cmdStr) == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXSOUNDING=3 */\n\tif (Set_ATE_TXSOUNDING_Proc(pAd, \"3\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ETxBfNoncompress=0 */\n\tif (Set_ETxBfNoncompress_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\n\t/* iwpriv ra0 set ATETXMCS=0 */\t\n\tif (Set_ATE_TX_MCS_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXCNT=1 */\n\tif (Set_ATE_TX_COUNT_Proc(pAd, \"1\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set ATETXLEN=258 */\n\tif (Set_ATE_TX_LENGTH_Proc(pAd, \"258\") == FALSE)\n\t\treturn FALSE;\n\t\n\t/* iwpriv ra0 set InvTxBfTag=0 */\n\tif (Set_InvTxBfTag_Proc(pAd, \"0\") == FALSE)\n\t\treturn FALSE;\n\n\t/* save current BBP_R173 value and reset it as 0 */\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R173, &bbpR173);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, 0);\n\n\t/* force BBP_R173 value when do following procedures. */\n\tSet_ATE_ForceBBP_Proc(pAd, \"173\");\n\t\n\t/* iwpriv ra0 set ATE=TXFRAME */\n\tif (Set_ATE_Proc(pAd, \"TXFRAME\") == FALSE)\n\t{\n\t\tSet_ATE_ForceBBP_Proc(pAd, \"0\");\n\t\treturn FALSE;\n\t}\n\n\t/* enable the update of BBP_R173 */\n\tSet_ATE_ForceBBP_Proc(pAd, \"0\");\n\t\n\t/* iwpriv ra0 set ITxBfCal=0 */\n\tretval = Set_ITxBfCal_Proc(pAd, \"0\");\n\n\t/* recovery the BBP_173 to original value */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, bbpR173);\n\n\t/* done and return */\n\treturn retval;\n\t\n}\n#endif /* TXBF_SUPPORT */\t\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE Tx frame IPG\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_IPG_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32           data, value;\n\n\tpATEInfo->IPG = simple_strtol(arg, 0, 10);\n\tvalue = pATEInfo->IPG;\n\n\tRTMP_IO_READ32(pAd, XIFS_TIME_CFG, &data);\n\n\tif (value <= 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_ATE_IPG_Proc::IPG is disabled(IPG == 0).\\n\"));\n\t\treturn TRUE;\n\t}\n\n\tASSERT(value > 0);\n\n\tif ((value > 0) && (value < 256))\n\t{               \n\t    RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &data);\n\t    data &= 0x0;\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, data);\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC1_CFG, &data);\n\t    data &= 0x0;\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, data);\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC2_CFG, &data);\n\t    data &= 0x0;\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, data);\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC3_CFG, &data);\n\t    data &= 0x0;\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, data);\n\t}\n\telse\n\t{\n\t    UINT32 aifsn, slottime;\n\n\t    RTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &slottime);\n\t    slottime &= 0x000000FF;\n\n\t    aifsn = value / slottime;                  \n\t    value = value % slottime;\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &data);\n\t    data &= 0x0;\n\t    data |= (aifsn << 8);\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, data);\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC1_CFG, &data);\n\t    data &= 0x0;\n\t    data |= (aifsn << 8);\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, data);\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC2_CFG, &data);\n\t    data &= 0x0;\n\t    data |= (aifsn << 8);\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, data);\n\n\t    RTMP_IO_READ32(pAd, EDCA_AC3_CFG, &data);\n\t    data &= 0x0;\n\t    data |= (aifsn << 8);\n\t    RTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, data);\n\t}\n\n\tdata = (value & 0xFFFF0000) | value | (value << 8);\n\tRTMP_IO_WRITE32(pAd, XIFS_TIME_CFG, data);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_IPG_Proc (IPG = %u)\\n\", pATEInfo->IPG));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_IPG_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n/* \n==========================================================================\n    Description:\n        Set ATE payload pattern for TxFrame\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n==========================================================================\n*/\nINT\tSet_ATE_Payload_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tPSTRING\t\t\t\tvalue;\n\n\tvalue = arg;\n\n\t/* only one octet acceptable */\t\n\tif (strlen(value) != 2)  \n\t\treturn FALSE;\n\n\tAtoH(value, &(pATEInfo->Payload), 1);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ATE_Payload_Proc (repeated pattern = 0x%2x)\\n\", pATEInfo->Payload));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink: Set_ATE_Payload_Proc Success\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n\n\n\nINT\tSet_ATE_Show_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tPSTRING Mode_String = NULL;\n\tPSTRING TxMode_String = NULL;\n\t\n\tswitch (pATEInfo->Mode)\n\t{\n#ifdef CONFIG_RT2880_ATE_CMD_NEW\n\t\tcase (fATE_IDLE):\n\t\t\tMode_String = \"ATESTART\";\n\t\t\tbreak;\n\t\tcase (fATE_EXIT):\n\t\t\tMode_String = \"ATESTOP\";\n\t\t\tbreak;\n#else\n\t\tcase (fATE_IDLE):\n\t\t\tMode_String = \"APSTOP\";\n\t\t\tbreak;\n\t\tcase (fATE_EXIT):\n\t\t\tMode_String = \"APSTART\";\n\t\t\tbreak;\n#endif /* CONFIG_RT2880_ATE_CMD_NEW */\n\t\tcase ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE)):\n\t\t\tMode_String = \"TXCONT\";\n\t\t\tbreak;\n\t\tcase ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE)):\n\t\t\tMode_String = \"TXCARR\";\n\t\t\tbreak;\n\t\tcase ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE)):\n\t\t\tMode_String = \"TXCARS\";\n\t\t\tbreak;\n\t\tcase (fATE_TX_ENABLE):\n\t\t\tMode_String = \"TXFRAME\";\n\t\t\tbreak;\n\t\tcase (fATE_RX_ENABLE):\n\t\t\tMode_String = \"RXFRAME\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t{\n\t\t\tMode_String = \"Unknown ATE mode\";\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"ERROR! Unknown ATE mode!\\n\"));\n\t\t\tbreak;\n\t\t}\n\t}\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATE Mode=%s\\n\", Mode_String));\n#ifdef RT3350\n\tif (IS_RT3350(pAd))\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"PABias=%u\\n\", pATEInfo->PABias));\n#endif /* RT3350 */\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxPower0=%d\\n\", pATEInfo->TxPower0));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxPower1=%d\\n\", pATEInfo->TxPower1));\n#ifdef DOT11N_SS3_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxPower2=%d\\n\", pATEInfo->TxPower2));\n#endif /* DOT11N_SS3_SUPPORT */\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxAntennaSel=%d\\n\", pATEInfo->TxAntennaSel));\n\tDBGPRINT(RT_DEBUG_OFF, (\"RxAntennaSel=%d\\n\", pATEInfo->RxAntennaSel));\n\tDBGPRINT(RT_DEBUG_OFF, (\"BBPCurrentBW=%u\\n\", pATEInfo->TxWI.TxWIBW));\n\tDBGPRINT(RT_DEBUG_OFF, (\"GI=%u\\n\", pATEInfo->TxWI.TxWIShortGI));\n\tDBGPRINT(RT_DEBUG_OFF, (\"MCS=%u\\n\", pATEInfo->TxWI.TxWIMCS));\n\n\tswitch (pATEInfo->TxWI.TxWIPHYMODE)\n\t{\n\t\tcase 0:\n\t\t\tTxMode_String = \"CCK\";\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tTxMode_String = \"OFDM\";\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tTxMode_String = \"HT-Mix\";\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tTxMode_String = \"GreenField\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t{\n\t\t\tTxMode_String = \"Unknown TxMode\";\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"ERROR! Unknown TxMode!\\n\"));\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxMode=%s\\n\", TxMode_String));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Addr1=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tpATEInfo->Addr1[0], pATEInfo->Addr1[1], pATEInfo->Addr1[2], pATEInfo->Addr1[3], pATEInfo->Addr1[4], pATEInfo->Addr1[5]));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Addr2=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tpATEInfo->Addr2[0], pATEInfo->Addr2[1], pATEInfo->Addr2[2], pATEInfo->Addr2[3], pATEInfo->Addr2[4], pATEInfo->Addr2[5]));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Addr3=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tpATEInfo->Addr3[0], pATEInfo->Addr3[1], pATEInfo->Addr3[2], pATEInfo->Addr3[3], pATEInfo->Addr3[4], pATEInfo->Addr3[5]));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Channel=%u\\n\", pATEInfo->Channel));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxLength=%u\\n\", pATEInfo->TxLength));\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxCount=%u\\n\", pATEInfo->TxCount));\n\tDBGPRINT(RT_DEBUG_OFF, (\"RFFreqOffset=%u\\n\", pATEInfo->RFFreqOffset));\n\tDBGPRINT(RT_DEBUG_OFF, (\"bAutoTxAlc=%d\\n\", pATEInfo->bAutoTxAlc));\n\tDBGPRINT(RT_DEBUG_OFF, (\"IPG=%u\\n\", pATEInfo->IPG));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Payload=0x%02x\\n\", pATEInfo->Payload));\n#ifdef TXBF_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"bTxBF=%d\\n\", pATEInfo->bTxBF));\n\tDBGPRINT(RT_DEBUG_OFF, (\"txSoundingMode=%d\\n\", pATEInfo->txSoundingMode));\n#endif /* TXBF_SUPPORT */\n\tDBGPRINT(RT_DEBUG_OFF, (\"Set_ATE_Show_Proc Success\\n\"));\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\treturn TRUE;\n}\n\n\nINT\tSet_ATE_Help_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef CONFIG_RT2880_ATE_CMD_NEW\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXCARS, TXFRAME, RXFRAME\\n\"));\n#else\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATE=APSTOP, APSTART, TXCONT, TXCARR, TXCARS, TXFRAME, RXFRAME\\n\"));\n#endif /* CONFIG_RT2880_ATE_CMD_NEW */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEDA\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATESA\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEBSSID\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATECHANNEL, range:0~14(unless A band !)\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXPOW0, set power level of antenna 1.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXPOW1, set power level of antenna 2.\\n\"));\n#ifdef DOT11N_SS3_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXPOW2, set power level of antenna 3.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXANT, set TX antenna. 0:all, 1:antenna one, 2:antenna two, 3:antenna three.\\n\"));\n#else\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXANT, set TX antenna. 0:all, 1:antenna one, 2:antenna two.\\n\"));\n#endif /* DOT11N_SS3_SUPPORT */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATERXANT, set RX antenna.0:all, 1:antenna one, 2:antenna two, 3:antenna three.\\n\"));\n#ifdef RT3350\n\tif (IS_RT3350(pAd))\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"ATEPABIAS, set power amplifier bias for EVM, range 0~15\\n\"));\n#endif /* RT3350 */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXFREQOFFSET, set frequency offset, range 0~63\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXBW, set BandWidth, 0:20MHz, 1:40MHz.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXLEN, set Frame length, range 24~%d\\n\", (MAX_FRAME_SIZE - 34/* == 2312 */)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXCNT, set how many frame going to transmit.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXMCS, set MCS, reference to rate table.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXMODE, set Mode 0:CCK, 1:OFDM, 2:HT-Mix, 3:GreenField, reference to rate table.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXGI, set GI interval, 0:Long, 1:Short\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATERXFER, 0:disable Rx Frame error rate. 1:enable Rx Frame error rate.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATERRF, show all RF registers.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEWRF1, set RF1 register.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEWRF2, set RF2 register.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEWRF3, set RF3 register.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEWRF4, set RF4 register.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATELDE2P, load EEPROM from .bin file.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATERE2P, display all EEPROM content.\\n\"));\n#ifdef LED_CONTROL_SUPPORT\n#endif /* LED_CONTROL_SUPPORT */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEAUTOALC, enable ATE auto Tx alc (Tx auto level control).\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEIPG, set ATE Tx frame IPG.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEPAYLOAD, set ATE payload pattern for TxFrame.\\n\"));\n#ifdef TXBF_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXBF, enable ATE Tx beam forming.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETXSOUNDING, Sounding mode 0:none, 1:Data sounding, 2:2 stream NDP, 3:3 stream NDP.\\n\"));\n#endif /* TXBF_SUPPORT */ \n#ifdef RTMP_INTERNAL_TX_ALC\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETSSICBA, start internal TSSI calibration.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATETSSICBAEX, start extended internal TSSI calibration.\\n\"));\n#endif /* RTMP_INTERNAL_TX_ALC */\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEREADEXTSSI, start advanced temperature TSSI calibration.\\n\"));\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATESHOW, display all parameters of ATE.\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"ATEHELP, online help.\\n\"));\n\n\treturn TRUE;\n}\n\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\n\nINT Set_ATE_TSSI_CALIBRATION_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{    \n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->TssiCalibration != NULL)\n{\n\t\tpATEInfo->pChipStruct->TssiCalibration(pAd, arg);\n\t}\n\telse\n\t{\n\t\tRTMP_CHIP_ATE_TSSI_CALIBRATION(pAd, arg);\n\t}\n\n\treturn TRUE;\n}\n\t\n\nINT Set_ATE_TSSI_CALIBRATION_EX_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{    \n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tif (pATEInfo->pChipStruct->ExtendedTssiCalibration != NULL)\n\t{\n\t\tpATEInfo->pChipStruct->ExtendedTssiCalibration(pAd, arg);\n\t}\n\telse\n\t{\n\t\tRTMP_CHIP_ATE_TSSI_CALIBRATION_EXTEND(pAd, arg);\n\t}\n\n\treturn TRUE;\n}\n\n\n#if defined(RT3350) || defined(RT3352)\nINT RT335x2_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n\t\t{\n\tBOOLEAN\tbTSSICalbrEnableG = FALSE;\n\t\n\tif (pAd->TxPowerCtrl.bInternalTxALC == FALSE)                  \n\t\t\t{\n\t\tDBGPRINT_ERR((\"Please set e2p 0x36 as 0x2024!!!\\n\"));\n\t\treturn FALSE;\n\t\t}\n\n\tif ((!IS_RT3350(pAd)) && (!IS_RT3352(pAd)))                  \n\t{\n\t\tDBGPRINT_ERR((\"Not support TSSI calibration since not 3350/3352 chip!!!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tif (strcmp(arg, \"0\") == 0)\n\t\t{\n\t\tbTSSICalbrEnableG = FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI calibration disabled!\\n\"));\n\t}\n\telse if (strcmp(arg, \"1\") == 0)\n\t\t\t{\n\t\tbTSSICalbrEnableG = TRUE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI calibration enabled!\\n\"));\n\t\t\t}\n\telse\n\t{\n\t\treturn FALSE;\n\t\t}\n\n\tpAd->ate.bTSSICalbrEnableG = bTSSICalbrEnableG;\n\t\t\t\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n\t}\n\n\nCHAR InsertTssi(UCHAR InChannel, UCHAR Channel0, UCHAR Channel1,CHAR Tssi0, CHAR Tssi1)\n{\n\tCHAR     InTssi;\n\tCHAR     ChannelDelta, InChannelDelta;\n\tCHAR     TssiDelta;\n\n\tChannelDelta = Channel1 - Channel0;\n\tInChannelDelta = InChannel - Channel0;\n\tTssiDelta = Tssi1 - Tssi0;\n\n\tInTssi = Tssi0 + ((InChannelDelta * TssiDelta) / ChannelDelta);\n\n\treturn InTssi;\n}\n\n\nINT RT335xATETssiCalibrationExtend(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{    \n\tCHAR\t\tTssiRefPerChannel[CFG80211_NUM_OF_CHAN_2GHZ], TssiDeltaPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];\n\tUCHAR\t\tCurrentChannel;\n\tUCHAR\t\tBbpData = 0;\n\tUSHORT\t\tEEPData;\n\n\tif (pAd->ate.bTSSICalbrEnableG == FALSE)\n\t{\n\t\tDBGPRINT_ERR((\"No TSSI readings obtained !!!\\n\"));\n\t\tDBGPRINT_ERR((\"TSSI calibration failed !!!\\n\"));\n\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tpAd->ate.bTSSICalbrEnableG = FALSE;\n\t}\n\n\tNdisCopyMemory(TssiRefPerChannel, pAd->ate.TssiRefPerChannel, CFG80211_NUM_OF_CHAN_2GHZ);\n\tNdisCopyMemory(TssiDeltaPerChannel, pAd->ate.TssiDeltaPerChannel, CFG80211_NUM_OF_CHAN_2GHZ);\n\n\t/* step 1: write TSSI_ref to EEPROM 0x6E */\n\tCurrentChannel = 7;\n\tBbpData = TssiRefPerChannel[CurrentChannel-1];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI_ref = 0x%02x\\n\", TssiRefPerChannel[CurrentChannel-1]));  \n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TSSI_OVER_OFDM_54, EEPData);\n\tEEPData &= 0xff00;\n\tEEPData |= BbpData;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Write  E2P 0x6e: 0x%04x\\n\", EEPData));  \n#ifdef RTMP_EFUSE_SUPPORT\n\tif(pAd->bUseEfuse)\n\t{\n\t\tif(pAd->bFroceEEPROMBuffer)\n\t\t\tNdisMoveMemory(&(pAd->EEPROMImage[EEPROM_TSSI_OVER_OFDM_54]), (PUCHAR) (&EEPData) ,2);\n\t\telse\n\t\t\teFuseWrite(pAd, EEPROM_TSSI_OVER_OFDM_54, (PUCHAR) (&EEPData), 2);\n\t}\n\telse\n#endif /* RTMP_EFUSE_SUPPORT */\n\t{\n\t\tRT28xx_EEPROM_WRITE16(pAd, EEPROM_TSSI_OVER_OFDM_54, EEPData);\n\t\tRTMPusecDelay(10);\n\t}\n\n\t/* step 2: insert the TSSI table */\n\t/* insert channel 2 to 6 TSSI values */\n\tfor (CurrentChannel = 2; CurrentChannel < 7; CurrentChannel++)\n\t\tTssiRefPerChannel[CurrentChannel-1] = InsertTssi(CurrentChannel, 1, 7, TssiRefPerChannel[0], TssiRefPerChannel[6]);\n\n\t/* insert channel 8 to 12 TSSI values */\n\tfor (CurrentChannel = 8; CurrentChannel < 13; CurrentChannel++)\n\t\tTssiRefPerChannel[CurrentChannel-1] = InsertTssi(CurrentChannel, 7, 13, TssiRefPerChannel[6], TssiRefPerChannel[12]);\n\n\t/* channel 14 TSSI equals channel 13 TSSI */\n\tTssiRefPerChannel[13] = TssiRefPerChannel[12];\n\n\tfor (CurrentChannel = 1; CurrentChannel <= 14; CurrentChannel++)\n\t{\n\t\tTssiDeltaPerChannel[CurrentChannel-1] = TssiRefPerChannel[CurrentChannel-1] - TssiRefPerChannel[6];\n\n\t\t/* boundary check */\n\t\tif(TssiDeltaPerChannel[CurrentChannel-1] > 7 )\n\t\t\tTssiDeltaPerChannel[CurrentChannel-1]  = 7;\n\t\tif(TssiDeltaPerChannel[CurrentChannel-1] < -8 )\n\t\t\tTssiDeltaPerChannel[CurrentChannel-1]  = -8;\n\n\t\t/* eeprom only use 4 bit for TSSI delta */\n\t\tTssiDeltaPerChannel[CurrentChannel-1]  &= 0x0f;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel %d, TSSI= 0x%x, TssiDelta=0x%x\\n\", \n\t\tCurrentChannel, TssiRefPerChannel[CurrentChannel-1], TssiDeltaPerChannel[CurrentChannel-1]));    \n\t}\n\n\t/* step 3: store TSSI delta values to EEPROM */\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TX_POWER_OFFSET_OVER_CH_1-1, EEPData);\n\tEEPData &= 0x00ff;\n\tEEPData |= (TssiDeltaPerChannel[0] << 8) | (TssiDeltaPerChannel[1] << 12);\n\n#ifdef RTMP_EFUSE_SUPPORT\n\tif (pAd->bUseEfuse)\n\t{\n\t\tif (pAd->bFroceEEPROMBuffer)\n\t\t\tNdisMoveMemory(&(pAd->EEPROMImage[EEPROM_TX_POWER_OFFSET_OVER_CH_1-1]), (PUCHAR)(&EEPData), 2);\n\t\telse\n\t\t\teFuseWrite(pAd, EEPROM_TX_POWER_OFFSET_OVER_CH_1-1, (PUCHAR) (&EEPData), 2);\n\t}\n\telse\n#endif /* RTMP_EFUSE_SUPPORT */\n\t{\n\t\tRT28xx_EEPROM_WRITE16(pAd, EEPROM_TX_POWER_OFFSET_OVER_CH_1-1, EEPData);\n\t\tRTMPusecDelay(10);\n\t}\n\n\tfor (CurrentChannel = 3; CurrentChannel <= 14; CurrentChannel += 4)\n\t{\n\t\tEEPData = (TssiDeltaPerChannel[CurrentChannel+2] << 12) |(TssiDeltaPerChannel[CurrentChannel+1] << 8)\n\t\t\t| (TssiDeltaPerChannel[CurrentChannel] << 4) | TssiDeltaPerChannel[CurrentChannel-1];\n#ifdef RTMP_EFUSE_SUPPORT\n\t\tif (pAd->bUseEfuse)\n\t\t{\n\t\t\tif (pAd->bFroceEEPROMBuffer)\n\t\t\t\tNdisMoveMemory(&(pAd->EEPROMImage[(EEPROM_TX_POWER_OFFSET_OVER_CH_3 +((CurrentChannel-3)/2))]), (PUCHAR)(&EEPData), 2);\n\t\t\telse\n\t\t\t\teFuseWrite(pAd, (EEPROM_TX_POWER_OFFSET_OVER_CH_3 +((CurrentChannel-3)/2)), (PUCHAR) (&EEPData), 2);\n\t\t}\n\t\telse\n#endif /* RTMP_EFUSE_SUPPORT */\n\t\t{\n\t\t\tRT28xx_EEPROM_WRITE16(pAd, (EEPROM_TX_POWER_OFFSET_OVER_CH_3 +((CurrentChannel-3)/2)), EEPData);\n\t\t\tRTMPusecDelay(10);\n\t\t}\n\t}\n\n\t/* step 4: disable legacy ALC and set TSSI enabled and TSSI extend mode to EEPROM */\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TSSI_ENABLE, EEPData);\n\t/* disable legacy ALC */\n\tEEPData &= ~(1 << 1);\n\t/* enable TSSI */\n\tEEPData |= (1 << 13);\n#ifdef RTMP_EFUSE_SUPPORT\n\tif (pAd->bUseEfuse)\n\t{\n\t\tif (pAd->bFroceEEPROMBuffer)\n\t\t\tNdisMoveMemory(&(pAd->EEPROMImage[EEPROM_TSSI_ENABLE]), (PUCHAR)(&EEPData), 2);\n\t\telse\n\t\t\teFuseWrite(pAd, EEPROM_TSSI_ENABLE, (PUCHAR)(&EEPData), 2);\n\t}\n\telse\n#endif /* RTMP_EFUSE_SUPPORT */\n\t{\n\t\tRT28xx_EEPROM_WRITE16(pAd, EEPROM_TSSI_ENABLE, EEPData);\n\t\tRTMPusecDelay(10);\n\t}\n\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TSSI_MODE_EXTEND, EEPData);\n\t/* set extended TSSI mode */\n\tEEPData |= (1 << 15);\n#ifdef RTMP_EFUSE_SUPPORT\n\tif (pAd->bUseEfuse)\n\t{\n\t\tif (pAd->bFroceEEPROMBuffer)\n\t\t\tNdisMoveMemory(&(pAd->EEPROMImage[EEPROM_TSSI_MODE_EXTEND]), (PUCHAR)(&EEPData), 2);\n\t\telse\n\t\t\teFuseWrite(pAd, EEPROM_TSSI_MODE_EXTEND, (PUCHAR)(&EEPData), 2);\n\t}\n\telse\n#endif /* RTMP_EFUSE_SUPPORT */\n\t{\n\t\tRT28xx_EEPROM_WRITE16(pAd, EEPROM_TSSI_MODE_EXTEND, EEPData);\n\t\tRTMPusecDelay(10);\n\t}\n\n\t/* step 5: synchronize ATE private data structure with the values written to EEPROM */\n\tNdisCopyMemory(pAd->ate.TssiRefPerChannel, TssiRefPerChannel, CFG80211_NUM_OF_CHAN_2GHZ);\n\tNdisCopyMemory(pAd->ate.TssiDeltaPerChannel, TssiDeltaPerChannel, CFG80211_NUM_OF_CHAN_2GHZ);\n\n\treturn TRUE;\n}\n\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n\n\nINT Set_ATE_READ_EXTERNAL_TSSI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\n\tRTMP_CHIP_ATE_READ_EXTERNAL_TSSI(pAd, arg);\n\treturn TRUE;\n}\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n\n\n\n#ifdef MT7601\nINT Set_ATE_Read_Temperature_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tCHAR\tTemperature;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Set_MT7601ATE_Read_Temperature_Proc\\n\"));\n\n\tMT7601_Read_Temperature(pAd, &Temperature);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Temperature = %d (0x%X)\\n\", Temperature, Temperature));\n\n\treturn TRUE;\n}\n\n\nINT Set_ATE_Read_TSSI_DC_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR BbpReg;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Set_ATE_Read_TSSI_DC_Proc\\n\"));\n\n\tRTMP_IO_WRITE32(pAd, 0x50C, 0x30);\n\tRTMP_IO_WRITE32(pAd, 0x504, 0xC0030);\n\t/* Set VGA gain */\n\trlt_rf_write(pAd, RF_BANK5, RF_R03, 0x8);\n\t/* Mixer disable */\n\trlt_rf_write(pAd, RF_BANK4, RF_R39, 0x0);\n\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4  , 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R58  , 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21  , 0x1);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21  , 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47  , 0x50);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22  , 0x40);\n\tRtmpOsMsDelay(10);\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BbpReg);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, 0x40);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpReg);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"TSSI DC = %d (0x%X)\\n\", BbpReg, BbpReg));\n\tRtmpOsMsDelay(1);\n\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22  , 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21  , 0x1);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21  , 0x0);\n\tRTMP_IO_WRITE32(pAd, 0x504, 0x0);\n\tRTMP_IO_WRITE32(pAd, 0x50C, 0x0);\n\trlt_rf_write(pAd, RF_BANK4, RF_R39, 0xB3);\n\n\treturn TRUE;\n}\n#endif /* MT7601 */\n\n\nstruct _ATE_CHIP_STRUCT RALINKDefault =\n{\n\t/* functions */\n\t.ChannelSwitch = DefaultATEAsicSwitchChannel,\n\t.TxPwrHandler = DefaultATETxPwrHandler,\n\t.TssiCalibration = NULL,\n\t.ExtendedTssiCalibration = NULL,\n\t.RxVGAInit = NULL,\n\t.AsicSetTxRxPath = DefaultATEAsicSetTxRxPath,\n\t.AdjustTxPower = DefaultATEAsicAdjustTxPower,\t\n\t.AsicExtraPowerOverMAC = NULL,\n\n\t/* command handlers */\n\t.Set_BW_Proc = Default_Set_ATE_TX_BW_Proc,\n\t.Set_FREQ_OFFSET_Proc = Default_Set_ATE_TX_FREQ_OFFSET_Proc,\n\n\t/* variables */\n\t.maxTxPwrCnt = 5,\n\t.bBBPStoreTXCARR = TRUE,\n\t.bBBPStoreTXCARRSUPP = TRUE,\t\n\t.bBBPStoreTXCONT = FALSE,\n\t.bBBPLoadATESTOP = TRUE,\n};\n\n#ifdef RT28xx\n#ifdef RTMP_MAC_USB\nextern ATE_CHIP_STRUCT RALINK2870;\n#endif /* RTMP_MAC_USB */\n#endif /* RT28xx */\n\n\n\n\n\n\n\n\n\n\n\n\n#ifdef MT7601\nextern ATE_CHIP_STRUCT MT7601ATE;\n#endif\n\n/*\n==========================================================================\n\tDescription:\n\t\tAssign chip structure when initialization.\n\t\tThis routine is specific for ATE.\n\n==========================================================================\n*/\nNDIS_STATUS ChipStructAssign(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tpATEInfo->pChipStruct = &RALINKDefault;\n\n#ifdef RT28xx\n#ifdef A_BAND_SUPPORT\n\tif (IS_PCI_ONLY_INF(pAd) || IS_USB_INF(pAd) || IS_RBUS_INF(pAd))\n\n\t{\n\n\n\n\t\tif (pATEInfo->pChipStruct == &RALINKDefault)\n\t\t{\n\t\t\t/* Not RT2860/RT2870/RT2880 ! */\n\t\t\tDBGPRINT_ERR((\"Error - Unknown chipset !!!\\n\"));\n\t\t\tDBGPRINT_ERR((\"The interface type is %d\\n\", pAd->infType));\n\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n#endif /* A_BAND_SUPPORT */\n#endif /* RT28xx */\n\n\n\n\n\n\n\n\n\n\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tpATEInfo->pChipStruct = &MT7601ATE;\n\t}\n#endif /* MT7601 */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t\tInitialize ATE_INFO structure.\n\t\tThis routine is specific for ATE.\n\n==========================================================================\n*/\nNDIS_STATUS ATEInit(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tNdisZeroMemory(pATEInfo, sizeof(ATE_INFO));\n\n\tif (ChipStructAssign(pAd) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"%s failed !\\n\", __FUNCTION__));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\t\n\tpATEInfo->Mode = ATE_STOP;\n#ifdef RT3350\n\tpATEInfo->PABias = 0;\n#endif /* RT3350  */\n\tpATEInfo->TxCount = 1000;/* to sync with QA and to exceed TX_RING_SIZE ... */\n\tpATEInfo->TxDoneCount = 0;\n\tpATEInfo->RFFreqOffset = 0;\n\tpATEInfo->Payload = 0xA5;/* to be backward compatible */\t\n\tpATEInfo->IPG = 200;/* 200 : sync with QA */\t\n\tpATEInfo->TxLength = 1024;\n\tpATEInfo->TxWI.TxWIShortGI = 0;/* LONG GI : 800 ns*/\n\tpATEInfo->TxWI.TxWIPHYMODE = MODE_CCK;\n\tpATEInfo->TxWI.TxWIMCS = 3;\n\tpATEInfo->TxWI.TxWIBW = BW_20;\n\t/* please do not change this default channel value */\n\tpATEInfo->Channel = 1;\n\n\n\tpATEInfo->QID = QID_AC_BE;\n\n#ifdef DOT11N_SS3_SUPPORT\n\t/* For 3T/3R ++ */\n\t/* use broadcast address as default value */\n\tpATEInfo->Addr1[0] = 0xFF;\n\tpATEInfo->Addr1[1] = 0xFF;\n\tpATEInfo->Addr1[2] = 0xFF;\n\tpATEInfo->Addr1[3] = 0xFF;\n\tpATEInfo->Addr1[4] = 0xFF;\n\tpATEInfo->Addr1[5] = 0xFF;\n\n\tpATEInfo->Addr2[0] = 0x00;\n\tpATEInfo->Addr2[1] = 0x11;\n\tpATEInfo->Addr2[2] = 0x22;\n\tpATEInfo->Addr2[3] = 0xAA;\n\tpATEInfo->Addr2[4] = 0xBB;\n\tpATEInfo->Addr2[5] = 0xCC;\n\n\tNdisMoveMemory(pATEInfo->Addr3, pATEInfo->Addr2, ETH_LENGTH_OF_ADDRESS);\n\n\t{\t\t\n\t\tUINT32 data;\n\n\t\tdata = 0xFFFFFFFF;\n    \tRTMP_IO_WRITE32(pAd, 0x1044, data); \n    \tRTMP_IO_READ32(pAd, 0x1048, &data); \n\n    \tdata = data | 0x0000FFFF;\n    \tRTMP_IO_WRITE32(pAd, 0x1048, data); \n\t}\n\t/* For stream mode in 3T/3R -- */\n#else\n\tpATEInfo->Addr1[0] = 0x00;\n\tpATEInfo->Addr1[1] = 0x11;\n\tpATEInfo->Addr1[2] = 0x22;\n\tpATEInfo->Addr1[3] = 0xAA;\n\tpATEInfo->Addr1[4] = 0xBB;\n\tpATEInfo->Addr1[5] = 0xCC;\n\n\tNdisMoveMemory(pATEInfo->Addr2, pATEInfo->Addr1, ETH_LENGTH_OF_ADDRESS);\n\tNdisMoveMemory(pATEInfo->Addr3, pATEInfo->Addr1, ETH_LENGTH_OF_ADDRESS);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\tpATEInfo->bRxFER = 0;\n\tpATEInfo->bQAEnabled = FALSE;\n\tpATEInfo->bQATxStart = FALSE;\n\tpATEInfo->bQARxStart = FALSE;\n\tpATEInfo->bAutoTxAlc = FALSE;\n#ifdef RTMP_INTERNAL_TX_ALC\n#if defined(RT3350) || defined(RT3352)\n\tpATEInfo->bTSSICalbrEnableG = FALSE;\n\tNdisZeroMemory((PUCHAR)&(pATEInfo->TssiRefPerChannel), CFG80211_NUM_OF_CHAN_2GHZ);\n\tNdisZeroMemory((PUCHAR)&(pATEInfo->TssiDeltaPerChannel), CFG80211_NUM_OF_CHAN_2GHZ);\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t/* Default TXCONT/TXCARR/TXCARS mechanism is TX_METHOD_1 */\n\tpATEInfo->TxMethod = TX_METHOD_1;\n\tif ((IS_RT2070(pAd) || IS_RT2860(pAd) || IS_RT2872(pAd) || IS_RT2883(pAd)))\n\t{\n\t\t/* Early chipsets must be applied original TXCONT/TXCARR/TXCARS mechanism. */\n\t\tpATEInfo->TxMethod = TX_METHOD_0;\n\t}\n\n\t/* Power range is 0~31 in A band. */\n\tpATEInfo->MinTxPowerBandA = 0;\n\tpATEInfo->MaxTxPowerBandA = 31;\n\tif ((IS_RT2860(pAd)) || (IS_RT2872(pAd)) || (IS_RT2883(pAd)))\n\t{\n\t\t/* Power range of early chipsets is -7~15 in A band. */\n\t\tpATEInfo->MinTxPowerBandA = -7;\n\t\tpATEInfo->MaxTxPowerBandA = 15;\n\t}\n\n#ifdef TXBF_SUPPORT\n\tpATEInfo->bTxBF = FALSE;\t\n#endif /* TXBF_SUPPORT */\n\n\n#ifdef RTMP_MAC_USB\n#endif /* RTMP_MAC_USB */\n\n#ifdef RALINK_QA\n\tpATEInfo->TxStatus = 0;\n\tRtmpOsTaskPidInit(&(pATEInfo->AtePid));\n/*\tpATEInfo->AtePid = THREAD_PID_INIT_VALUE; */\n#endif /* RALINK_QA */\n\tpATEInfo->OneSecPeriodicRound = 0;\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef RALINK_QA\n/*\n==========================================================================\n\tDescription:\n\t\tThis routine is specific for ATE.\n\t\tWhen we start tx from QA GUI, it will modify BBP registers without\n\t\tnotify ATE driver what the tx subtype is.\n\n    Return:\n        VOID\n==========================================================================\n*/\nVOID ReadQATxTypeFromBBP(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR   Bbp22Value = 0, Bbp24Value = 0;\n\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &Bbp22Value);\n\n\tswitch (Bbp22Value)\n\t{\n\t\tcase BBP22_TXFRAME:\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"START TXFRAME\\n\"));\n\t\t\t\tpATEInfo->bQATxStart = TRUE;\n\t\t\t\tSet_ATE_Proc(pAd, \"TXFRAME\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BBP22_TXCONT_OR_CARRSUPP:\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BBP22_TXCONT_OR_CARRSUPP\\n\"));\n\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R24, &Bbp24Value);\n\n\t\t\t\tswitch (Bbp24Value)\n\t\t\t\t{\n\t\t\t\t\tcase BBP24_TXCONT:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"START TXCONT\\n\"));\n\t\t\t\t\t\t\tpATEInfo->bQATxStart = TRUE;\n\n\t\t\t\t\t\t\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSet_ATE_Proc(pAd, \"TXCONT\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase BBP24_CARRSUPP:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"START TXCARRSUPP\\n\"));\n\t\t\t\t\t\t\tpATEInfo->bQATxStart = TRUE;\n\n\t\t\t\t\t\t\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSet_ATE_Proc(pAd, \"TXCARS\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT_ERR((\"Unknown TX subtype !\\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\t\n\n\t\tcase BBP22_TXCARR:\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"START TXCARR\\n\"));\n\t\t\t\tpATEInfo->bQATxStart = TRUE;\n\n\t\t\t\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t\t\t\t{\n\t\t\t\t\tSet_ATE_Proc(pAd, \"TXCARR\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\t\t\t\t\t\t\t\n\n\t\tdefault:\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"Unknown Start TX subtype !\\n\"));\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\treturn;\n}\n#endif /* RALINK_QA */\n\n\nNDIS_STATUS ATEBBPWriteWithRxChain(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR bbpId,\n\tIN CHAR bbpVal,\n\tIN RX_CHAIN_IDX rx_ch_idx)\n{\n\tUCHAR idx = 0, val = 0;\n\n\tif (((pAd->MACVersion & 0xffff0000) < 0x28830000) || \n\t\t(pAd->Antenna.field.RxPath == 1))\n\t{\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, bbpId, bbpVal);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\t\n\twhile (rx_ch_idx != 0)\n\t{\n\t\tif (idx >= pAd->Antenna.field.RxPath)\n\t\t\tbreak;\n\t\t\n\t\tif (rx_ch_idx & 0x01)\n\t\t{\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R27, &val);\n\t\t\tval = (val & (~0x60)/* clear bit5 and bit6 */) | (idx << 5);\n#ifdef RTMP_MAC_USB\n\t\t\tif (IS_USB_INF(pAd))\n\t\t\t{\n\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, val);\n\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, bbpId, bbpVal);\n\t\t\t}\n#endif /* RTMP_MAC_USB */\n\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, \n\t\t\t\t\t(\"%s(Idx):Write(R%d,val:0x%x) to Chain(0x%x, idx:%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, bbpId, bbpVal, rx_ch_idx, idx));\n\t\t}\n\t\trx_ch_idx >>= 1;\n\t\tidx++;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#define SMM_BASEADDR                      0x4000\n#define PKT_BASEADDR                      0x8000\n\n\n#ifdef RLT_MAC\nINT Set_ADCDump_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\n\tDBGPRINT_ERR((\"%s::Not supported!!!\\n\", __FUNCTION__));\n\treturn TRUE;\n}\n\n#else\nINT Set_ADCDump_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR BBP_R21_Ori=0,BBP_R60_Ori=0,BBP_R142_ORI=0,BBP_R143_ORI=0;\n\tUINT32 MACValue=0,PBF_SYS_CTRL_ORI=0,PBF_CAP_CTRL_ORI=0;\n\tUINT32 CaptureModeOffset=0,CaptureStartAddr=0;\n\tUINT32 SMM_Addr;\n\tUINT32 PKT_Addr;\n\tint i = 0; \n\tPSTRING\t\t\t\t\tsrc = \"ADCDump.txt\";\n\tRTMP_OS_FD\t\t\t\tsrcf;\n\tRTMP_OS_FS_INFO\t\t\tosFSInfo;\n\tUCHAR\t\t\t\tmsg[128];\n\tUCHAR\t\t\t\tmsg1[128];\n\tCAPTURE_MODE_SHARE_MEMORY     SMMValued;\n\tCAPTURE_MODE_PACKET_BUFFER    PKTValue1d;\n\tCAPTURE_MODE_PACKET_BUFFER    PKTValue2d;\n\tUCHAR retval=0;\n\tUCHAR DataSourceADC6=simple_strtol(arg, 0, 10);\n\t\n\tpAd->ate.Mode = ATE_START;\n\n\t/* Disable Tx/Rx */\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);\n\tBBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BBP_R21_Ori);\n\n\t/* Disable BBP power saving */\n\t   \n\t/* disable all Tx/Rx Queue */\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, 0x00000000);\n\n\t/* capture mode */\n\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MACValue);\n\tPBF_SYS_CTRL_ORI=MACValue;\n\tMACValue |= 0x00004000; /* bit[14]=1 */\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MACValue);\n\n\t/* capture setting */\n\tif (DataSourceADC6 == 1)\n\t{\n\t\tBBP_IO_READ8_BY_REG_ID(pAd, BBP_R60, &BBP_R60_Ori);                              \n\t\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R60, 0x80);\n\t\tBBP_IO_READ8_BY_REG_ID(pAd, BBP_R142, &BBP_R142_ORI);\n\t\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R142, 0x10);\n\t\tBBP_IO_READ8_BY_REG_ID(pAd, BBP_R143, &BBP_R143_ORI);\n\t\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R143, 0x05);\n\n\t\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &MACValue);\n\t\tPBF_CAP_CTRL_ORI=MACValue;\n\t\tMACValue |= 0x00008000; /* set bit[15]=1 for ADC 6 */\n\t\tMACValue &= ~0x80000000; /* set bit[31]=0 */\n\t\tRTMP_IO_WRITE32(pAd, PBF_CAP_CTRL, MACValue);\n\t}\n\telse\n\t{\n\t\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &MACValue);\n\t\tPBF_CAP_CTRL_ORI=MACValue;\n\t\tMACValue &= ~0x80008000; /* set bit[31]=0, bit[15]=0 for ADC 8 */\n\t\tRTMP_IO_WRITE32(pAd, PBF_CAP_CTRL, MACValue);\n\t}\n\n\t/* trigger offset */\n\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &MACValue);\n\tMACValue &= ~(0x1FFF0000);\n\tRTMP_IO_WRITE32(pAd, PBF_CAP_CTRL, MACValue);\n\t\t\t\t\t\t\n\tif ((CaptureModeOffset > 0) && (CaptureModeOffset <= 0x1FFF))\n\t{\n\t\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &MACValue);\n\t\tMACValue |= CaptureModeOffset << 16;\n\t\tRTMP_IO_WRITE32(pAd, PBF_CAP_CTRL, MACValue);\n\t}\n\n\t/* start capture */\n\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &MACValue);\n\tMACValue = MACValue | 0x40000000; /* set bit[30]=1 */\n\tRTMP_IO_WRITE32(pAd, PBF_CAP_CTRL, MACValue);\n\n\tif (0)\n\t{\n\t\t/* start TX */\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4);\n\t}\n\telse\n\t{\n\t\t/* start RX */\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x8);\n\t}\n                        \n\t/* Wait until [0x440] bit30=0 */\n\tdo\n\t{\n\t\ti++;\n\t\tRTMPusecDelay(10);\n\t\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &MACValue);\n\t\tMACValue = MACValue & 0x40000000; /* bit[30] */\n\n\t\tif (MACValue == 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tif (i == 1000) /* 3 sec */\n\t\t{\n\t\t\tprintk(\"Error, over 3s\\n\");\n\t\t\tbreak;\n\t\t}\n\t} while (MACValue != 0);\n\n\tif (DataSourceADC6 == 1)\n\t{\n\t\t/* restore BBP R60 */\n\t\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R60, BBP_R60_Ori);\n\t}\n\n\t/* Stop TX/RX */\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);\n\n\t/* Read [0x440] bit[12:0] */\n\tRTMP_IO_READ32(pAd, PBF_CAP_CTRL, &CaptureStartAddr);\n\tCaptureStartAddr = CaptureStartAddr & 0x00001FFF;\n\n\t/* Dump data from MAC memory */\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tSMM_Addr=SMM_BASEADDR+CaptureStartAddr*2;\n\tPKT_Addr=PKT_BASEADDR+CaptureStartAddr*4;\n\t\n\t/* SMM Address must be four byte alignment*/\n\tSMM_Addr=(SMM_Addr/4)*4;\n\n\t/* open file */\n\tif (src && *src)\n\t{\n\t\tsrcf = RtmpOSFileOpen(src, O_WRONLY|O_CREAT, 0);\n\n\t\tif (IS_FILE_OPEN_ERR(srcf)) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error opening %s\\n\", src));\n\t\t\treturn FALSE;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tmemset(msg, 0x00, 128);\n\t\t\tmemset(msg1, 0x00, 128);\n\n\t\t\tfor (i=0;i<0x1000;i++)\n\t\t\t{\n\t\t\t\tRTMP_IO_READ32(pAd,SMM_Addr, &SMMValued.Value);\n\t\t\t\tSMM_Addr += 4;\n\n\t\t\t\tif(SMM_Addr >= 0x8000)\n\t\t\t\t\tSMM_Addr = SMM_Addr - SMM_BASEADDR;\n\n\t\t\t\tRTMP_IO_READ32(pAd,PKT_Addr, &PKTValue1d.Value);\n\t\t\t\tPKT_Addr += 4;\n\n\t\t\t\tif(PKT_Addr >= 0x10000)\n\t\t\t\t\tPKT_Addr = PKT_Addr - PKT_BASEADDR;\n\n\t\t\t\tRTMP_IO_READ32(pAd,PKT_Addr, &PKTValue2d.Value);\n\t\t\t\tPKT_Addr += 4;\n\n\t\t\t\tif(PKT_Addr >= 0x10000)\n\t\t\t\t\tPKT_Addr = PKT_Addr - PKT_BASEADDR;\n\n\t\t\t\tsprintf(msg, \"%d %d %d %d %d %d\\n\",SMMValued.field.LOW_BYTE1,SMMValued.field.LOW_BYTE0\n\t\t\t\t              ,PKTValue1d.field.BYTE3,PKTValue1d.field.BYTE2\n\t\t\t\t              ,PKTValue1d.field.BYTE1,PKTValue1d.field.BYTE0);\n\t\t\t\tsprintf(msg1, \"%d %d %d %d %d %d\\n\",SMMValued.field.LOW_BYTE1,SMMValued.field.LOW_BYTE0\n\t\t\t\t              ,PKTValue2d.field.BYTE3,PKTValue2d.field.BYTE2\n\t\t\t\t              ,PKTValue2d.field.BYTE1,PKTValue2d.field.BYTE0);\n\n\t\t\t\tretval=RtmpOSFileWrite(srcf, (PSTRING)msg, strlen(msg));\n\t\t\t\tretval=RtmpOSFileWrite(srcf, (PSTRING)msg1, strlen(msg1));\n\t\t\t}           \n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error src  or srcf is null\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tretval=RtmpOSFileClose(srcf);\n\t\t\t\n\tif (retval)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> Error %d closing %s\\n\", -retval, src));\n\t}\n\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BBP_R21_Ori);\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R60, BBP_R60_Ori); \n\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R142, BBP_R142_ORI);\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R142, BBP_R142_ORI);\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, PBF_SYS_CTRL_ORI);\n\tRTMP_IO_WRITE32(pAd, PBF_CAP_CTRL, PBF_CAP_CTRL_ORI);\n\n\t/* Finish */\n\t/* normal mode */\n\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MACValue);\n\tMACValue &= ~0x00004000;\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MACValue);\n\n\t/* reset packet buffer */\n\tRTMP_IO_WRITE32(pAd, PBF_CTRL,0x00000020 );\n\n\t/* enable Tx/Rx Queue */\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, 0x00F40016);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0C);\n\tpAd->ate.Mode = ATE_STOP;\n\n\treturn TRUE;\n}\n#endif /* RLT_MAC */\n\n\n/* one-second periodic execution */\nVOID ATEPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3)\n{\n\tPRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\tif (ATE_ON(pAd))\n\t{\t\n\t\tpATEInfo->OneSecPeriodicRound++;\n\n\t\t/* for performace enchanement */\n\t\tNdisZeroMemory(&pAd->RalinkCounters,\n\t\t\t\t\t\t(UINT32)&pAd->RalinkCounters.OneSecEnd -\n\t\t\t\t\t\t(UINT32)&pAd->RalinkCounters.OneSecStart);\n        NICUpdateRawCounters(pAd);\n\n\t\tif (pATEInfo->bRxFER == 1)\n\t\t{\n\t\t\tpATEInfo->RxTotalCnt += pATEInfo->RxCntPerSec;\n\t\t    ate_print(KERN_EMERG \"ATEPeriodicExec: Rx packet cnt = %d/%d\\n\",\n\t\t\t\tpATEInfo->RxCntPerSec, pATEInfo->RxTotalCnt);\n\t\t\tpATEInfo->RxCntPerSec = 0;\n\n\t\t\tif (pATEInfo->RxAntennaSel == 0)\n\t\t\t\tate_print(KERN_EMERG \"ATEPeriodicExec: Rx AvgRssi0=%d, AvgRssi1=%d, AvgRssi2=%d\\n\\n\",\n\t\t\t\t\tpATEInfo->AvgRssi0, pATEInfo->AvgRssi1, pATEInfo->AvgRssi2);\n\t\t\telse\n\t\t\t\tate_print(KERN_EMERG \"ATEPeriodicExec: Rx AvgRssi=%d\\n\\n\", pATEInfo->AvgRssi0);\n\t\t}\n\n\t\tMlmeResetRalinkCounters(pAd);\n\n\t\t/* In QA Mode, QA will handle all registers. */\n\t\tif (pATEInfo->bQAEnabled == TRUE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif ((pATEInfo->bAutoTxAlc == TRUE)\n\t\t\t&& ((pATEInfo->Mode == ATE_TXFRAME) || (pATEInfo->Mode == ATE_TXCONT)))\n\t\t{\n\t\t\tATEAsicAdjustTxPower(pAd);\n\t\t}\n\t\t\n\t\tATEAsicExtraPowerOverMAC(pAd);\t\n\n\t\t//ATEAsicTemperCompensation(pAd);\n\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"%s is NOT called in ATE mode.\\n\", __FUNCTION__));\n\t}\n\n\treturn;\n}\n\n"
  },
  {
    "path": "src/ate/common/rt_qa.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n \n \tModule Name:\n\trt_qa.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n*/\n#include \"rt_config.h\"\n \n#ifdef RALINK_QA\nNDIS_STATUS TXSTOP(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0, atemode=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tBbpData = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\t\n\tatemode = pATEInfo->Mode;\n\tpATEInfo->Mode &= ATE_TXSTOP;\n\tpATEInfo->bQATxStart = FALSE;\n\n\tif (atemode == ATE_TXCARR)\n\t{\n\t\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t\t{\n\t\t\t/* No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0 */\n\t\t\tATE_BBP_RESET_TX_MODE(pAd, BBP_R22, &BbpData);\n\t\t}\n\t}\n\telse if (atemode == ATE_TXCARRSUPP)\n\t{\n\t\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t\t{\n\t\t\t/* No Cont. TX set BBP R22 bit7=0 */\n\t\t\t/* QA will do this in new TXCARRSUPP proposal */\n\t\t\tATE_BBP_STOP_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\n\t\t\t/* No Carrier Suppression set BBP R24 bit0=0 */\n\t\t\tATE_BBP_CTS_TX_SIN_WAVE_DISABLE(pAd, BBP_R24, &BbpData);\n\t\t}\n\t}\t\t\n\n\t/*\n\t\tWe should free some resource which was allocated\n\t\twhen ATE_TXFRAME, ATE_STOP, and ATE_TXCONT.\n\t*/\n\telse if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP))\n\t{\n\t\tif (atemode == ATE_TXCONT)\n\t\t{\n\t\t\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t\t\t{\n\t\t\t\t/* No Cont. TX set BBP R22 bit7=0 */\n\t\t\t\t/* QA will do this in new TXCONT proposal */\n\t\t\t\tATE_BBP_STOP_CTS_TX_MODE(pAd, BBP_R22, &BbpData);\n\t\t\t}\n\t\t}\n\n\n#ifdef RTMP_MAC_USB\n\tRTUSBRejectPendingPackets(pAd);\n\tRTUSBCleanUpDataBulkOutQueue(pAd);\n\tRTUSBCleanUpMLMEBulkOutQueue(pAd);\n\n\t/* Abort Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 0);\n\twhile (pAd->PendingRx > 0)\n\t{\n\t\tATE_RTUSBCancelPendingBulkInIRP(pAd);\n\t\tRtmpOsMsDelay(500);\n\t}\n\n\twhile (((pAd->BulkOutPending[0] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[1] == TRUE) || \n\t\t\t(pAd->BulkOutPending[2] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))\t\n\t\t\t/* pAd->BulkFlags != 0 : wait bulk out finish */\n\t{\n\t\tdo \n\t\t{\n\t\t\tRTUSBCancelPendingBulkOutIRP(pAd);\n\t\t} while (FALSE);\t\t\t\n\n\t\tRtmpOsMsDelay(500);\n\t}\n\n\tASSERT(pAd->PendingRx == 0);\n\n\t/* Enable Tx, Rx DMA. */\n\tRtmpDmaEnable(pAd, 1);\n#endif /* RTMP_MAC_USB */\n\t}\n\n\t/* task Tx status : 0 --> task is idle, 1 --> task is running */\n\tpATEInfo->TxStatus = 0;\n\n\tif (pATEInfo->TxMethod == TX_METHOD_0)\n\t{\n\t\tBbpSoftReset(pAd);/* Soft reset BBP. */\n\t}\n\n\t/* Disable Tx */\n\tATE_MAC_TX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n#ifdef RTMP_MAC_USB\n\t/* Clear ATE bulk in/out counter and continue setup */\n\tInterlockedExchange(&pAd->BulkOutRemained, 0);\n\tpAd->ContinBulkOut = FALSE;\n#endif /* RTMP_MAC_USB */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nNDIS_STATUS RXSTOP(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32\t\t\tMacData=0;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : ===> %s\\n\", __FUNCTION__));\n\n\t/* Disable Rx */\n\tATE_MAC_RX_DISABLE(pAd, MAC_SYS_CTRL, &MacData);\n\n\tpATEInfo->Mode &= ATE_RXSTOP;\n\tpATEInfo->bQARxStart = FALSE;\n\n#ifdef RTMP_MAC_USB\n\tRTUSBRejectPendingPackets(pAd);\n\tRTUSBCleanUpDataBulkOutQueue(pAd);\n\n\tRTUSBCleanUpMLMEBulkOutQueue(pAd);\n\n\t/* Abort Tx, RX DMA. */\n\tRtmpDmaEnable(pAd, 0);\n\n\twhile (pAd->PendingRx > 0)\n\t{\n\t\tATE_RTUSBCancelPendingBulkInIRP(pAd);\n\t\tRtmpOsMsDelay(500);\n\t}\n\n\twhile (((pAd->BulkOutPending[0] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[1] == TRUE) || \n\t\t\t(pAd->BulkOutPending[2] == TRUE) ||\n\t\t\t(pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))\t\n\t\t\t/* pAd->BulkFlags != 0 : wait bulk out finish */\n\t{\n\t\tdo\n\t\t{\n\t\t\tRTUSBCancelPendingBulkOutIRP(pAd);\n\t\t} while (FALSE);\n\t\t\n\t\tRtmpOsMsDelay(500);\n\t}\n\n\tASSERT(pAd->PendingRx == 0);\n\tpAd->ContinBulkIn = FALSE;\n#endif /* RTMP_MAC_USB */\n\n\tif ((!IS_RT3883(pAd)) && (!IS_RT3352(pAd)) && (!IS_RT5350(pAd)))\n\t\tBbpSoftReset(pAd);/* Soft reset BBP. */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ATE : <=== %s\\n\", __FUNCTION__));\n\treturn Status;\n}\n\n\nstatic VOID memcpy_exl(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len)\n{\n\tUINT32 i, Value = 0;\n\tUCHAR *pDst = NULL, *pSrc = NULL;\n\t\n\tfor (i = 0 ; i < (len >> 2); i++)\n\t{\n\t\tpDst = (dst + i*4);\n\t\tpSrc = (src + i*4);\n\t\t/* For alignment issue, we need a variable \"Value\". */\n\t\tmemmove(&Value, pSrc, 4);\n\t\tValue = OS_HTONL(Value); \n\t\tmemmove(pDst, &Value, 4);\t\t\n\t\tpDst += 4;\n\t\tpSrc += 4;\n\t}\n\n\tif ((len % 4) != 0)\n\t{\n\t\t/* wish that it will never reach here */\n\t\tmemmove(&Value, pSrc, (len % 4));\n\t\tValue = OS_HTONL(Value); \n\t\tmemmove(pDst, &Value, (len % 4));\n\t}\n}\n\n\nstatic VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len)\n{\n\tULONG i;\n\t{\n\t\tUSHORT *pDst, *pSrc;\n\t\t\n\t\tpDst = (USHORT *) dst;\n\t\tpSrc = (USHORT *) src;\n\n\t\tfor (i =0; i < (len >> 1); i++)\n\t\t{\n\t\t\t*pDst = OS_NTOHS(*pSrc);\n\t\t\tpDst++;\n\t\t\tpSrc++;\n\t\t}\n\t\t\n\t\tif ((len % 2) != 0)\n\t\t{\n\t\t\tmemcpy(pDst, pSrc, (len % 2));\n\t\t\t*pDst = OS_NTOHS(*pDst);\n\t\t}\n\t}\n\treturn;\n}\n\n\nstatic VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *dst, UINT32 offset, UINT32 len)\n{\n\tUINT32 i, Value = 0;\n\tUCHAR *pDst;\n\n\tfor (i = 0 ; i < (len >> 2); i++)\n\t{\n\t\tpDst = (dst + (i << 2));\n\t\tRTMP_IO_READ32(pAd, offset, &Value);\n\t\tValue = OS_HTONL(Value);\n\t\tmemmove(pDst, &Value, 4);\n\t\toffset += 4;\n\t}\n\treturn;\n}\n\n\nVOID BubbleSort(INT32 size, INT32 array[])\n{ \n\tINT32 outer, inner, temp;\n\n\tfor (outer = size-1;  outer>0;  outer--)\n\t{\n\t\tfor (inner = 0; inner<outer; inner++)\n\t\t{\n\t\t\tif (array[inner] > array[inner+1])\n\t\t\t{\n\t\t\t\ttemp = array[inner]; \n\t\t\t\tarray[inner]=array[inner+1]; \n\t\t\t\tarray[inner+1]=temp;\n\t\t\t}\n\t\t}\n\t}\n\treturn;\n} \n\n\nVOID CalNoiseLevel(PRTMP_ADAPTER pAd, UCHAR channel, INT32 RSSI[3][10])\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT32\t\tRSSI0, RSSI1, RSSI2;\n \tCHAR\t\tRssi0Offset, Rssi1Offset, Rssi2Offset;\n\tUCHAR\t\tBbpR50Rssi0 = 0, BbpR51Rssi1 = 0, BbpR52Rssi2 = 0;\n\tUCHAR\t\tOrg_BBP66value = 0, Org_BBP69value = 0, Org_BBP70value = 0, data = 0;\n\tUSHORT\t\tLNA_Gain = 0;\n\tINT32\t\tcolumn = 0;\n\tUCHAR\t\tOrg_Channel = pATEInfo->Channel;\n\tUSHORT\t    GainValue = 0, OffsetValue = 0;\n\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &Org_BBP66value);\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R69, &Org_BBP69value);\t\n\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R70, &Org_BBP70value);\n\n\t/************************************************************************/\n\t/* Read the value of LNA gain and RSSI offset */\n\t/************************************************************************/\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, GainValue);\n\n\t/* for Noise Level */\n\tif (channel <= 14)\n\t{\n\t\tLNA_Gain = GainValue & 0x00FF;\t\t \n\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, OffsetValue);\n\t\tRssi0Offset = OffsetValue & 0x00FF;\n\t\tRssi1Offset = (OffsetValue & 0xFF00) >> 8;\n\n\t\tRT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_BG_OFFSET + 2)/* 0x48 */, OffsetValue);\n\t\tRssi2Offset = OffsetValue & 0x00FF;\n\t}\n\telse\n\t{\n\t\tLNA_Gain = (GainValue & 0xFF00) >> 8;\n\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, OffsetValue);\n\t\tRssi0Offset = OffsetValue & 0x00FF;\n\t\tRssi1Offset = (OffsetValue & 0xFF00) >> 8;\n\n\t\tRT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET + 2)/* 0x4C */, OffsetValue);\n\t\tRssi2Offset = OffsetValue & 0x00FF;\n\t}\n\t/***********************************************************************/\t\n\t{\n\t\tpATEInfo->Channel = channel;\n\t\tATEAsicSwitchChannel(pAd);\n\t\tRtmpOsMsDelay(5);\n\n\t\tdata = 0x10;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, data);\t\n\t\tdata = 0x40;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, data);\n\t\tdata = 0x40;\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, data);\n\t\tRtmpOsMsDelay(5);\n\n\t\t/* start Rx */\n\t\tpATEInfo->bQARxStart = TRUE;\n\t\tSet_ATE_Proc(pAd, \"RXFRAME\");\n\n\t\tRtmpOsMsDelay(5);\n\n\t\tfor (column = 0; column < 10; column++)\n\t\t{\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R50, &BbpR50Rssi0);\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R51, &BbpR51Rssi1);\t\n\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R52, &BbpR52Rssi2);\n\n\t\t\tRtmpOsMsDelay(10);\n\n\t\t\t/* calculate RSSI 0 */\n\t\t\tif (BbpR50Rssi0 == 0)\n\t\t\t{\n\t\t\t\tRSSI0 = -100;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRSSI0 = (INT32)(-12 - BbpR50Rssi0 - LNA_Gain - Rssi0Offset);\n\t\t\t}\n\t\t\tRSSI[0][column] = RSSI0;\n\n\t\t\tif ( pAd->Antenna.field.RxPath >= 2 ) /* 2R */\n\t\t\t{\n\t\t\t\t/* calculate RSSI 1 */\n\t\t\t\tif (BbpR51Rssi1 == 0)\n\t\t\t\t{\n\t\t\t\t\tRSSI1 = -100;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRSSI1 = (INT32)(-12 - BbpR51Rssi1 - LNA_Gain - Rssi1Offset);\n\t\t\t\t}\n\t\t\t\tRSSI[1][column] = RSSI1;\n\t\t\t}\n\n\t\t\tif ( pAd->Antenna.field.RxPath >= 3 ) /* 3R */\n\t\t\t{\n\t\t\t\t/* calculate RSSI 2 */\n\t\t\t\tif (BbpR52Rssi2 == 0)\n\t\t\t\t\tRSSI2 = -100;\n\t\t\t\telse\n\t\t\t\t\tRSSI2 = (INT32)(-12 - BbpR52Rssi2 - LNA_Gain - Rssi2Offset);\n\n\t\t\t\tRSSI[2][column] = RSSI2;\n\t\t\t}\n\t\t}\n\n\t\t/* stop Rx */\n\t\tSet_ATE_Proc(pAd, \"RXSTOP\");\n\n\t\tRtmpOsMsDelay(5);\n\n\t\tBubbleSort(10, RSSI[0]); /* 1R */\t\t\n\n\t\tif ( pAd->Antenna.field.RxPath >= 2 ) /* 2R */\n\t\t{\n\t\t\tBubbleSort(10, RSSI[1]);\n\t\t}\n\n\t\tif ( pAd->Antenna.field.RxPath >= 3 ) /* 3R */\n\t\t{\n\t\t\tBubbleSort(10, RSSI[2]);\n\t\t}\t\n\t}\n\n\tpATEInfo->Channel = Org_Channel;\n\tATEAsicSwitchChannel(pAd);\n\n\t/* restore original value */\t\n\n\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, Org_BBP69value);\n\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, Org_BBP70value);\n\n\treturn;\n}\n\n\nstatic VOID ATE_BBPRead(\n\t\tIN\tPRTMP_ADAPTER\tpAd,\n\t\tIN\tUCHAR\t\t\toffset,\n\t\tIN  UCHAR\t\t\t*pValue)\n{\n\tif (ATE_ON(pAd))\n\t{\n\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, offset, pValue);\n\t}\n\telse\n\t{\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, offset, pValue);\n\t}\n}\n\n\nstatic VOID ATE_BBPWrite(\n\t\tIN\tPRTMP_ADAPTER\tpAd,\n\t\tIN\tUCHAR\t\t\toffset,\n\t\tIN  UCHAR\t\t\tvalue)\n{\n\tif (ATE_ON(pAd))\n\t{\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, offset, value);\n\t}\n\telse\n\t{\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, offset, value);\n\t}\n}\n\n\nBOOLEAN SyncTxRxConfig(PRTMP_ADAPTER pAd, USHORT offset, UCHAR value)\n{ \n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUCHAR tmp = 0, bbp_data = 0;\n\n\tATE_BBPRead(pAd, offset, &bbp_data);\n\n\t/* confirm again */\n\tASSERT(bbp_data == value);\n\n\tswitch (offset)\n\t{\n\t\tcase BBP_R1:\n\t\t\t/* Need to synchronize tx configuration with legacy ATE. */\n\t\t\ttmp = (bbp_data & ((1 << 4) | (1 << 3))/* 0x18 */) >> 3;\n\t\t    switch (tmp)\n\t\t    {\n\t\t\t\t/* The BBP R1 bit[4:3] = 2 :: Both DACs will be used by QA. */\n\t\t        case 2:\n\t\t\t\t\t/* All */\n\t\t\t\t\tpATEInfo->TxAntennaSel = 0;\n\t\t            break;\n\t\t\t\t/* The BBP R1 bit[4:3] = 0 :: DAC 0 will be used by QA. */\n\t\t        case 0:\n\t\t\t\t\t/* Antenna one */\n\t\t\t\t\tpATEInfo->TxAntennaSel = 1;\n\t\t            break;\n\t\t\t\t/* The BBP R1 bit[4:3] = 1 :: DAC 1 will be used by QA. */\n\t\t        case 1:\n\t\t\t\t\t/* Antenna two */\n\t\t\t\t\tpATEInfo->TxAntennaSel = 2;\n\t\t            break;\n\t\t        default:\n\t\t            DBGPRINT_ERR((\"%s -- Sth. wrong!  : return FALSE; \\n\", __FUNCTION__));    \n\t\t            return FALSE;\n\t\t    }\n\t\t\tbreak;/* case BBP_R1 */\n\n\t\tcase BBP_R3:\n\t\t\t/* Need to synchronize rx configuration with legacy ATE. */\n\t\t\ttmp = (bbp_data & ((1 << 1) | (1 << 0))/* 0x03 */);\n\t\t    switch(tmp)\n\t\t    {\n\t\t\t\t/* The BBP R3 bit[1:0] = 3 :: All ADCs will be used by QA. */\n\t\t        case 3:\n\t\t\t\t\t/* All */\n\t\t\t\t\tpATEInfo->RxAntennaSel = 0;\n\t\t            break;\n\t\t\t\t/*\n\t\t\t\t\tThe BBP R3 bit[1:0] = 0 :: ADC 0 will be used by QA,\n\t\t\t\t\tunless the BBP R3 bit[4:3] = 2\n\t\t\t\t*/\n\t\t        case 0:\n\t\t\t\t\t/* Antenna one */\n\t\t\t\t\tpATEInfo->RxAntennaSel = 1;\n\t\t\t\t\ttmp = ((bbp_data & ((1 << 4) | (1 << 3))/* 0x03 */) >> 3);\n\t\t\t\t\tif (tmp == 2) /* 3R */\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Default : All ADCs will be used by QA */\n\t\t\t\t\t\tpATEInfo->RxAntennaSel = 0;\n\t\t\t\t\t}\n\t\t            break;\n\t\t\t\t/* The BBP R3 bit[1:0] = 1 :: ADC 1 will be used by QA. */\n\t\t        case 1:\n\t\t\t\t\t/* Antenna two */\n\t\t\t\t\tpATEInfo->RxAntennaSel = 2;\n\t\t            break;\n\t\t\t\t/* The BBP R3 bit[1:0] = 2 :: ADC 2 will be used by QA. */\n\t\t        case 2:\n\t\t\t\t\t/* Antenna three */\n\t\t\t\t\tpATEInfo->RxAntennaSel = 3;\n\t\t            break;\n\t\t        default:\n\t\t            DBGPRINT_ERR((\"%s -- Impossible!  : return FALSE; \\n\", __FUNCTION__));    \n\t\t            return FALSE;\n\t\t    }\n\t\t\tbreak;/* case BBP_R3 */\n\n        default:\n            DBGPRINT_ERR((\"%s -- Sth. wrong!  : return FALSE; \\n\", __FUNCTION__));    \n            return FALSE;\n\t\t\n\t}\n\treturn TRUE;\n}\n\n\nstatic INT ResponseToGUI(\n\tIN  struct ate_racfghdr *pRaCfg,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*pwrq,\n\tIN  INT Length,\n\tIN  INT Status)\n{\n\t(pRaCfg)->length = OS_HTONS((Length));\n\t(pRaCfg)->status = OS_HTONS((Status));\n\t(pwrq)->u.data.length = sizeof((pRaCfg)->magic_no) + sizeof((pRaCfg)->command_type)\n\t\t\t\t\t\t\t+ sizeof((pRaCfg)->command_id) + sizeof((pRaCfg)->length)\n\t\t\t\t\t\t\t+ sizeof((pRaCfg)->sequence) + OS_NTOHS((pRaCfg)->length);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"wrq->u.data.length = %d\\n\", (pwrq)->u.data.length));\n\n\tif (copy_to_user((pwrq)->u.data.pointer, (UCHAR *)(pRaCfg), (pwrq)->u.data.length))\n\t{\n\t\t\n\t\tDBGPRINT_ERR((\"copy_to_user() fail in %s\\n\", __FUNCTION__));\n\t\treturn (-EFAULT);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RACFG command(0x%04x)[magic number(0x%08x)] is done\\n\", \n\t\t\t\t\t\t\t\t\t\tOS_NTOHS(pRaCfg->command_id), OS_NTOHL(pRaCfg->magic_no)));\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_START(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_START\\n\"));\n\n\tpATEInfo->bQAEnabled = TRUE;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"pATEInfo->bQAEnabled = %s\\n\", (pATEInfo->bQAEnabled)? \"TRUE\":\"FALSE\"));\n\t\n\t/* Prepare feedback as soon as we can to avoid QA timeout. */\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\t\n#ifdef\tCONFIG_RT2880_ATE_CMD_NEW\n\tSet_ATE_Proc(pAd, \"ATESTART\");\n#else\n\tSet_ATE_Proc(pAd, \"APSTOP\");\n#endif /* CONFIG_RT2880_ATE_CMD_NEW */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_STOP(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT32 ret;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_STOP\\n\"));\n\n\tpATEInfo->bQAEnabled = FALSE;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"pATEInfo->bQAEnabled = %s\\n\", (pATEInfo->bQAEnabled)? \"TRUE\":\"FALSE\"));\n\n\t/*\n\t\tDistinguish this command came from QA(via ate agent)\n\t\tor ate agent according to the existence of pid in payload.\n\n\t\tNo need to prepare feedback if this cmd came directly from ate agent,\n\t\tnot from QA.\n\t*/\n\tpRaCfg->length = OS_NTOHS(pRaCfg->length);\n\n\tif (pRaCfg->length == sizeof(pATEInfo->AtePid))\n\t{\n\t\t/*\n\t\t\tThis command came from QA.\n\t\t\tGet the pid of ATE agent.\n\t\t*/\n\t\tmemcpy((UCHAR *)&pATEInfo->AtePid,\n\t\t\t\t\t\t(&pRaCfg->data[0]) - 2/* == sizeof(pRaCfg->status) */,\n\t\t\t\t\t\tsizeof(pATEInfo->AtePid));\t\t\t\t\t\n\n\t\t/* Prepare feedback as soon as we can to avoid QA timeout. */\n\t\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\t\t/* Kill ATE agent when leaving ATE mode. */\n#ifdef LINUX\n\t\tret = RTMP_THREAD_PID_KILL(pATEInfo->AtePid);\n\t\tif (ret)\n\t\t\tDBGPRINT_ERR((\"%s : unable to kill ate thread\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)));\n#endif /* LINUX */\n\t}\n\t\t\n\n\t/* AP/STA may be already in ATE_STOP mode due to cmd from QA. */\n\tif (ATE_ON(pAd))\n\t{\n\t\t/* Someone has killed ate agent while QA GUI is still open. */\n\n#ifdef\tCONFIG_RT2880_ATE_CMD_NEW\n\t\tSet_ATE_Proc(pAd, \"ATESTOP\");\n#else\n\t\tSet_ATE_Proc(pAd, \"APSTART\");\n#endif\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RACFG_CMD_AP_START is done !\\n\"));\n\t}\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_RF_WRITE_ALL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUINT32 R1, R2, R3, R4;\n\tUSHORT channel;\n\t\n\tmemcpy(&R1, pRaCfg->data-2, 4);\n\tmemcpy(&R2, pRaCfg->data+2, 4);\n\tmemcpy(&R3, pRaCfg->data+6, 4);\n\tmemcpy(&R4, pRaCfg->data+10, 4);\n\tmemcpy(&channel, pRaCfg->data+14, 2);\t\t\n\t\n\tpAd->LatchRfRegs.R1 = OS_NTOHL(R1);\n\tpAd->LatchRfRegs.R2 = OS_NTOHL(R2);\n\tpAd->LatchRfRegs.R3 = OS_NTOHL(R3);\n\tpAd->LatchRfRegs.R4 = OS_NTOHL(R4);\n\tpAd->LatchRfRegs.Channel = OS_NTOHS(channel);\n\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R3);\n\tRTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn  NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_E2PROM_READ16(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUINT16\toffset=0, value=0;\n\tUSHORT  tmp=0;\t\t\t\t\n\n\toffset = OS_NTOHS(pRaCfg->status);\n\tRT28xx_EEPROM_READ16(pAd, offset, tmp);\n\tvalue = tmp;\n\tvalue = OS_HTONS(value);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"EEPROM Read offset = 0x%04x, value = 0x%04x\\n\", offset, value));\n\tmemcpy(pRaCfg->data, &value, 2);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+2, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_E2PROM_WRITE16(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT\toffset, value;\n\t\n\toffset = OS_NTOHS(pRaCfg->status);\n\tmemcpy(&value, pRaCfg->data, 2);\n\tvalue = OS_NTOHS(value);\n\tRT28xx_EEPROM_WRITE16(pAd, offset, value);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_E2PROM_READ_ALL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT buffer[EEPROM_SIZE >> 1];\n\n\trt_ee_read_all(pAd,(USHORT *)buffer);\n\tmemcpy_exs(pAd, pRaCfg->data, (UCHAR *)buffer, EEPROM_SIZE);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+EEPROM_SIZE, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_E2PROM_WRITE_ALL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT buffer[EEPROM_SIZE >> 1];\n\n\tNdisZeroMemory((UCHAR *)buffer, EEPROM_SIZE);\n\tmemcpy_exs(pAd, (UCHAR *)buffer, (UCHAR *)&pRaCfg->status, EEPROM_SIZE);\n\trt_ee_write_all(pAd,(USHORT *)buffer);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_IO_READ(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUINT32\toffset;\n\tUINT32\tvalue;\n\t\n\tmemcpy(&offset, &pRaCfg->status, 4);\n\toffset = OS_NTOHL(offset);\n\n\t{\n\t\t/*\n\t\t\tWe do not need the base address.\n\t\t\tSo just extract the offset out.\n\t\t*/\n\t\toffset &= 0x0000FFFF;\n\t\tRTMP_IO_READ32(pAd, offset, &value);\n\t}\n\tvalue = OS_HTONL(value);\n\tmemcpy(pRaCfg->data, &value, 4);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+4, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_IO_WRITE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUINT32\toffset, value;\n\t\t\t\t\t\n\tmemcpy(&offset, pRaCfg->data-2, 4);\n\tmemcpy(&value, pRaCfg->data+2, 4);\n\n\toffset = OS_NTOHL(offset);\n\n\t/*\n\t\tWe do not need the base address.\n\t\tSo just extract the offset out.\n\t*/\n\toffset &= 0x0000FFFF;\n\tvalue = OS_NTOHL(value);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_IO_WRITE: offset = %x, value = %x\\n\", offset, value));\n\tRTMP_IO_WRITE32(pAd, offset, value);\n\t\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_IO_READ_BULK(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUINT32\toffset;\n\tUSHORT\tlen;\n\t\n\tmemcpy(&offset, &pRaCfg->status, 4);\n\toffset = OS_NTOHL(offset);\n\n\toffset &= 0x0000FFFF;\n\tmemcpy(&len, pRaCfg->data+2, 2);\n\tlen = OS_NTOHS(len);\n\n\tif (len > 371)\n\t{\n\t\tDBGPRINT_ERR((\"%s : length requested is too large, make it smaller\\n\", __FUNCTION__));\n\t\tpRaCfg->length = OS_HTONS(2);\n\t\tpRaCfg->status = OS_HTONS(1);\n\n\t\treturn -EFAULT;\n\t}\n\n\tRTMP_IO_READ_BULK(pAd, pRaCfg->data, offset, (len << 2));/* unit in four bytes*/\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+(len << 2), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_BBP_READ8(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT\toffset;\n\tUCHAR\tvalue;\n\t\n\tvalue = 0;\n\toffset = OS_NTOHS(pRaCfg->status);\n\n\tATE_BBPRead(pAd, offset, &value);\n\n\tpRaCfg->data[0] = value;\n\t\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+1, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_BBP_WRITE8(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT\toffset;\n\tUCHAR\tvalue;\n\t\n\toffset = OS_NTOHS(pRaCfg->status);\n\tmemcpy(&value, pRaCfg->data, 1);\n\tATE_BBPWrite(pAd, offset, value);\n\n\tif ((offset == BBP_R1) || (offset == BBP_R3))\n\t{\n\t\tSyncTxRxConfig(pAd, offset, value);\n\t}\n\t\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_BBP_READ_ALL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT bbp_reg_index;\n\t\n\tfor (bbp_reg_index = 0; bbp_reg_index < pAd->chipCap.MaxNumOfBbpId+1; bbp_reg_index++)\n\t{\n\t\tpRaCfg->data[bbp_reg_index] = 0;\n\t\tATE_BBPRead(pAd, bbp_reg_index, &pRaCfg->data[bbp_reg_index]);\n\t}\n\t\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+ pAd->chipCap.MaxNumOfBbpId+1, NDIS_STATUS_SUCCESS);\n\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_GET_NOISE_LEVEL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUCHAR\tchannel;\n\tINT32   buffer[3][10];/* 3 : RxPath ; 10 : no. of per rssi samples */\n\n\tchannel = (OS_NTOHS(pRaCfg->status) & 0x00FF);\n\tCalNoiseLevel(pAd, channel, buffer);\n\tmemcpy_exl(pAd, (UCHAR *)pRaCfg->data, (UCHAR *)&(buffer[0][0]), (sizeof(INT32)*3*10));\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+(sizeof(INT32)*3*10), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n\n\nstatic  INT DO_RACFG_CMD_GET_COUNTER(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tmemcpy_exl(pAd, &pRaCfg->data[0], (UCHAR *)&pATEInfo->U2M, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[4], (UCHAR *)&pATEInfo->OtherData, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[8], (UCHAR *)&pATEInfo->Beacon, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[12], (UCHAR *)&pATEInfo->OtherCount, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[16], (UCHAR *)&pATEInfo->TxAc0, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[20], (UCHAR *)&pATEInfo->TxAc1, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[24], (UCHAR *)&pATEInfo->TxAc2, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[28], (UCHAR *)&pATEInfo->TxAc3, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[32], (UCHAR *)&pATEInfo->TxHCCA, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[36], (UCHAR *)&pATEInfo->TxMgmt, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[40], (UCHAR *)&pATEInfo->RSSI0, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[44], (UCHAR *)&pATEInfo->RSSI1, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[48], (UCHAR *)&pATEInfo->RSSI2, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[52], (UCHAR *)&pATEInfo->SNR0, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[56], (UCHAR *)&pATEInfo->SNR1, 4);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+60, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_CLEAR_COUNTER(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\tpATEInfo->U2M = 0;\n\tpATEInfo->OtherData = 0;\n\tpATEInfo->Beacon = 0;\n\tpATEInfo->OtherCount = 0;\n\tpATEInfo->TxAc0 = 0;\n\tpATEInfo->TxAc1 = 0;\n\tpATEInfo->TxAc2 = 0;\n\tpATEInfo->TxAc3 = 0;\n\tpATEInfo->TxHCCA = 0;\n\tpATEInfo->TxMgmt = 0;\n\tpATEInfo->TxDoneCount = 0;\n\t\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_TX_START(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUSHORT *p;\n\tUSHORT\terr = 1;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUINT8 TxInfoSize = 4;\n\n\tif ((pATEInfo->TxStatus != 0) && (pATEInfo->Mode & ATE_TXFRAME))\n\t{\n\t\tDBGPRINT_ERR((\"%s : Ate Tx is already running,\"\n\t\t\t\"to run next Tx, you must stop it first\\n\", __FUNCTION__));\n\t\terr = 2;\n\t\tgoto tx_start_error;\n\t}\n\telse if ((pATEInfo->TxStatus != 0) && !(pATEInfo->Mode & ATE_TXFRAME))\n\t{\n\t\tint slot = 0;\n\n\t\twhile ((slot++ < 10) && (pATEInfo->TxStatus != 0))\n\t\t{\n\t\t\tRtmpOsMsDelay(5);\n\t\t}\n\n\t\t/* force it to stop */\n\t\tpATEInfo->TxStatus = 0;\n\t\tpATEInfo->TxDoneCount = 0;\n\t\tpATEInfo->bQATxStart = FALSE;\n\t}\n\n\t/*\n\t\tReset ATE mode and set Tx/Rx idle\n\t\tfor new proposed TXCONT/TXCARR/TXCARRSUPP solution.\n\t*/\n\tif ((pATEInfo->Mode & ATE_TXFRAME) && (pATEInfo->TxMethod == TX_METHOD_1))\n\t{\n\t\tTXSTOP(pAd);\n\t}\n\n\t/*\n\t\tIf pRaCfg->length == 0, this \"RACFG_CMD_TX_START\"\n\t\tis for Carrier test or Carrier Suppression test.\n\t*/\n\tif (OS_NTOHS(pRaCfg->length) != 0)\n\t{\n\t\t/* get frame info */\n#ifdef RTMP_MAC_USB\n\t\tNdisMoveMemory(&pATEInfo->TxInfo, pRaCfg->data - 2, TxInfoSize);\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPDescriptorEndianChange((PUCHAR) &pATEInfo->TxInfo, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n#endif /* RTMP_MAC_USB */\n\n\t\tNdisMoveMemory(&pATEInfo->TxWI, pRaCfg->data + 2, TXWISize);\t\t\t\t\t\t\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPWIEndianChange(pAd, (PUCHAR)&pATEInfo->TxWI, TYPE_TXWI);\n#endif /* RT_BIG_ENDIAN */\n\n\t\tNdisMoveMemory(&pATEInfo->TxCount, pRaCfg->data + TXWISize + 2, 4);\n\t\tpATEInfo->TxCount = OS_NTOHL(pATEInfo->TxCount);\n\n/*\t\tp = (USHORT *)(&pRaCfg->data[TXWISize + TxInfoSize + 2]); */\n\n\t\t/* always use QID_AC_BE */\n\t\tpATEInfo->QID = 0;\n\n\t\tp = (USHORT *)(&pRaCfg->data[TXWISize + TxInfoSize + 2*2]);\n\t\tpATEInfo->HLen = OS_NTOHS(*p);\n\n\t\tif (pATEInfo->HLen > 32)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"%s : pATEInfo->HLen > 32\\n\", __FUNCTION__));\n\t\t\tDBGPRINT_ERR((\"pATEInfo->HLen = %d\\n\", pATEInfo->HLen));\n\t\t\terr = 3;\n\t\t\tgoto tx_start_error;\n\t\t}\n\n\t\tNdisMoveMemory(&pATEInfo->Header, pRaCfg->data + (TXWISize + TxInfoSize + 2*3), pATEInfo->HLen);\n\n\t\tpATEInfo->PLen = OS_NTOHS(pRaCfg->length) - (pATEInfo->HLen + (TXWISize + TxInfoSize + 2*4));\n\n\t\tif (pATEInfo->PLen > 32)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"%s : pATEInfo->PLen > 32\\n\", __FUNCTION__));\n\t\t\terr = 4;\n\t\t\tgoto tx_start_error;\n\t\t}\n\n\t\tNdisMoveMemory(&pATEInfo->Pattern, pRaCfg->data + (TXWISize + TxInfoSize + 2*3) + pATEInfo->HLen, pATEInfo->PLen);\n\t\tpATEInfo->DLen = pATEInfo->TxWI.TxWIMPDUByteCnt - pATEInfo->HLen;\n\n\n\t}\n\n\tReadQATxTypeFromBBP(pAd);\n\n\tif (pATEInfo->bQATxStart == TRUE)\n\t{\n\t\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\ntx_start_error:\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), err);\n\n\treturn err;\n}\n\n\nstatic  INT DO_RACFG_CMD_GET_TX_STATUS(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tUINT32 count=0;\n\t\n\tcount = OS_HTONL(pATEInfo->TxDoneCount);\n\tNdisMoveMemory(pRaCfg->data, &count, 4);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+4, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_TX_STOP(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_TX_STOP\\n\"));\n\n\tSet_ATE_Proc(pAd, \"TXSTOP\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_RX_START(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_RX_START\\n\"));\n\n\tpATEInfo->bQARxStart = TRUE;\n\tSet_ATE_Proc(pAd, \"RXFRAME\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\t\n\n\nstatic  INT DO_RACFG_CMD_RX_STOP(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_RX_STOP\\n\"));\n\n\tSet_ATE_Proc(pAd, \"RXSTOP\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_START_TX_CARRIER(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_START_TX_CARRIER\\n\"));\n\n\tSet_ATE_Proc(pAd, \"TXCARR\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_START_TX_CONT(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_START_TX_CONT\\n\"));\n\n\tSet_ATE_Proc(pAd, \"TXCONT\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_START_TX_FRAME(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_START_TX_FRAME\\n\"));\n\n\tSet_ATE_Proc(pAd, \"TXFRAME\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\t\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_BW(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_BW\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\n\tSet_ATE_TX_BW_Proc(pAd, str);\n\t\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_TX_POWER0(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_TX_POWER0\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_POWER0_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_TX_POWER1(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_TX_POWER1\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_POWER1_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef DOT11N_SS3_SUPPORT\nstatic  INT DO_RACFG_CMD_ATE_SET_TX_POWER2(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_TX_POWER2\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_POWER2_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* DOT11N_SS3_SUPPORT */\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_FREQ_OFFSET(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_FREQ_OFFSET\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_FREQ_OFFSET_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_GET_STATISTICS(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_GET_STATISTICS\\n\"));\n\n\tmemcpy_exl(pAd, &pRaCfg->data[0], (UCHAR *)&pATEInfo->TxDoneCount, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[4], (UCHAR *)&pAd->WlanCounters.RetryCount.u.LowPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[8], (UCHAR *)&pAd->WlanCounters.FailedCount.u.LowPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[12], (UCHAR *)&pAd->WlanCounters.RTSSuccessCount.u.LowPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[16], (UCHAR *)&pAd->WlanCounters.RTSFailureCount.u.LowPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[20], (UCHAR *)&pAd->WlanCounters.ReceivedFragmentCount.QuadPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[24], (UCHAR *)&pAd->WlanCounters.FCSErrorCount.u.LowPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[28], (UCHAR *)&pAd->Counters8023.RxNoBuffer, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[32], (UCHAR *)&pAd->WlanCounters.FrameDuplicateCount.u.LowPart, 4);\n\tmemcpy_exl(pAd, &pRaCfg->data[36], (UCHAR *)&pAd->RalinkCounters.OneSecFalseCCACnt, 4);\n\t\n\tif (pATEInfo->RxAntennaSel == 0)\n\t{\n\t\tINT32 RSSI0 = 0;\n\t\tINT32 RSSI1 = 0;\n\t\tINT32 RSSI2 = 0;\n\n\t\tRSSI0 = (INT32)(pATEInfo->LastRssi0 - pAd->BbpRssiToDbmDelta);\n\t\tRSSI1 = (INT32)(pATEInfo->LastRssi1 - pAd->BbpRssiToDbmDelta);\n\t\tRSSI2 = (INT32)(pATEInfo->LastRssi2 - pAd->BbpRssiToDbmDelta);\n\t\tmemcpy_exl(pAd, &pRaCfg->data[40], (UCHAR *)&RSSI0, 4);\n\t\tmemcpy_exl(pAd, &pRaCfg->data[44], (UCHAR *)&RSSI1, 4);\n\t\tmemcpy_exl(pAd, &pRaCfg->data[48], (UCHAR *)&RSSI2, 4);\n\t\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+52, NDIS_STATUS_SUCCESS);\n\t}\n\telse\n\t{\n\t\tINT32 RSSI0 = 0;\n\t\n\t\tRSSI0 = (INT32)(pATEInfo->LastRssi0 - pAd->BbpRssiToDbmDelta);\n\t\tmemcpy_exl(pAd, &pRaCfg->data[40], (UCHAR *)&RSSI0, 4);\n\t\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+44, NDIS_STATUS_SUCCESS);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_RESET_COUNTER(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tSHORT    value = 1;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_RESET_COUNTER\\n\"));\t\t\t\t\n\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ResetStatCounter_Proc(pAd, str);\n\n\tpATEInfo->TxDoneCount = 0;\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SEL_TX_ANTENNA(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\t\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SEL_TX_ANTENNA\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_Antenna_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SEL_RX_ANTENNA(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SEL_RX_ANTENNA\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_RX_Antenna_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_PREAMBLE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_PREAMBLE\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_MODE_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_CHANNEL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_CHANNEL\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_CHANNEL_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_ADDR1(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_ADDR1\\n\"));\n\tmemcpy(pATEInfo->Addr1, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_ADDR2(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_ADDR2\\n\"));\n\tmemcpy(pATEInfo->Addr2, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_ADDR3(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_ADDR3\\n\"));\n\tmemcpy(pATEInfo->Addr3, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_RATE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_RATE\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_MCS_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_TX_FRAME_LEN(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_TX_FRAME_LEN\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\tSet_ATE_TX_LENGTH_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_SET_TX_FRAME_COUNT(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_ATE_SET_TX_FRAME_COUNT\\n\"));\t\t\t\t\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\n\t{\n\t\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\t\tSet_ATE_TX_COUNT_Proc(pAd, str);\n\t}\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_START_RX_FRAME(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RACFG_CMD_RX_START\\n\"));\n\n\tSet_ATE_Proc(pAd, \"RXFRAME\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_E2PROM_READ_BULK(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT offset;\n\tUSHORT len;\n\tUSHORT buffer[EEPROM_SIZE >> 1];\n\t\n\toffset = OS_NTOHS(pRaCfg->status);\n\tmemcpy(&len, pRaCfg->data, 2);\n\tlen = OS_NTOHS(len);\n\t\n\trt_ee_read_all(pAd, (USHORT *)buffer);\n\n\tif (offset + len <= EEPROM_SIZE)\n\t\tmemcpy_exs(pAd, pRaCfg->data, (UCHAR *)buffer+offset, len);\n\telse\n\t\tDBGPRINT_ERR((\"%s : exceed EEPROM size\\n\", __FUNCTION__));\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+len, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_E2PROM_WRITE_BULK(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT offset;\n\tUSHORT len;\n\tUSHORT buffer[EEPROM_SIZE >> 1];\n\t\n\toffset = OS_NTOHS(pRaCfg->status);\n\tmemcpy(&len, pRaCfg->data, 2);\n\tlen = OS_NTOHS(len);\n\n\tmemcpy_exs(pAd, (UCHAR *)buffer + offset, (UCHAR *)pRaCfg->data + 2, len);\n\n\tif ((offset + len) <= EEPROM_SIZE)\n\t{\n\t\trt_ee_write_bulk(pAd,(USHORT *)(((UCHAR *)buffer) + offset), offset, len);\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"%s : exceed EEPROM size(%d)\\n\", __FUNCTION__, EEPROM_SIZE));\n\t\tDBGPRINT_ERR((\"offset=%d\\n\", offset));\n\t\tDBGPRINT_ERR((\"length=%d\\n\", len));\n\t\tDBGPRINT_ERR((\"offset+length=%d\\n\", (offset+len)));\n\t}\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_IO_WRITE_BULK(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUINT32 offset, pos, value;\n\tUSHORT len;\n\t\n\tmemcpy(&offset, &pRaCfg->status, 4);\n\toffset = OS_NTOHL(offset);\n\tmemcpy(&len, pRaCfg->data+2, 2);\n\tlen = OS_NTOHS(len);\n\t\n\tfor (pos = 0; pos < len; pos += 4)\n\t{\n\t\tmemcpy_exl(pAd, (UCHAR *)&value, pRaCfg->data+4+pos, 4);\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Write %x %x\\n\", offset + pos, value));\n\t\tRTMP_IO_WRITE32(pAd, ((offset+pos) & (0xffff)), value);\n\t}\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_BBP_READ_BULK(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT offset;\n\tUSHORT len;\n\tUSHORT pos;\n\t\n\toffset = OS_NTOHS(pRaCfg->status);\n\tmemcpy(&len, pRaCfg->data, 2);\n\tlen = OS_NTOHS(len);\n\t\n\tfor (pos = offset; pos < (offset+len); pos++)\n\t{\n\t\tpRaCfg->data[pos - offset] = 0;\n\t\t\n\t\tATE_BBPRead(pAd, pos, &pRaCfg->data[pos - offset]);\n\t}\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+len, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_BBP_WRITE_BULK(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT offset;\n\tUSHORT len;\n\tUSHORT pos;\n\tUCHAR *value;\n\t\n\toffset = OS_NTOHS(pRaCfg->status);\n\tmemcpy(&len, pRaCfg->data, 2);\n\tlen = OS_NTOHS(len);\n\t\t\t\t\t\n\tfor (pos = offset; pos < (offset+len); pos++)\n\t{\n\t\tvalue = pRaCfg->data + 2 + (pos - offset);\n\t\tATE_BBPWrite(pAd, pos,  *value);\n\t}\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n\n\n\n\n\n\n#ifdef TXBF_SUPPORT\nstatic  INT DO_RACFG_CMD_ATE_TXBF_DUT_INIT(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_DUT_INIT\\n\"));\n\n\tSet_ATE_TXBF_INIT_Proc(pAd, \"1\");\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_TXBF_LNA_CAL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT band;\n\tCHAR bandStr[32] = {0};\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_LNA_CAL\\n\"));\n\n\tband = OS_NTOHS(pRaCfg->status);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : band=0x%x(0x%x)\\n\", \n\t\t\t\t\t__FUNCTION__, band, pRaCfg->status));\n\tsnprintf(bandStr, sizeof(bandStr), \"%d\\n\", band);\n\tSet_ATE_TXBF_LNACAL_Proc(pAd, &bandStr[0]);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_TXBF_DIV_CAL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tUSHORT band;\n\tCHAR bandStr[32] = {0};\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_DIV_CAL\\n\"));\n\n\tband = OS_NTOHS(pRaCfg->status);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : band=0x%x(0x%x)\\n\", \n\t\t\t\t__FUNCTION__, band, pRaCfg->status));\n\tsnprintf(bandStr, sizeof(bandStr), \"%d\\n\", band);\n\tSet_ATE_TXBF_DIVCAL_Proc(pAd, &bandStr[0]);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_TXBF_PHASE_CAL(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\tBOOLEAN\tresult = FALSE;\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_PHASE_CAL\\n\"));\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\n\tresult = (BOOLEAN)Set_ATE_TXBF_CAL_Proc(pAd, str);\n\tpRaCfg->data[0] = result;\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status) + 1, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_TXBF_GOLDEN_INIT(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\n\tNdisZeroMemory(str, LEN_OF_ARG);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_GOLDEN_INIT\\n\"));\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\n\tSet_ATE_TXBF_GOLDEN_Proc(pAd, str);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_TXBF_VERIFY(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\tBOOLEAN\tresult;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_VERIFY\\n\"));\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\n\tresult = (BOOLEAN)Set_ATE_TXBF_VERIFY_Proc(pAd, str);\n\n\tpRaCfg->data[0] = result;\n\tpRaCfg->data[1] = pATEInfo->calParams[0];\n\tpRaCfg->data[2] = pATEInfo->calParams[1];\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status) + 3, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic  INT DO_RACFG_CMD_ATE_TXBF_VERIFY_NOCOMP(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tSHORT    value = 0;\n\tSTRING    str[LEN_OF_ARG];\n\tBOOLEAN\tresult;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"DO_RACFG_CMD_ATE_TXBF_VERIFY_NOCOMP\\n\"));\n\n\tmemcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);\n\tvalue = OS_NTOHS(value);\n\tsnprintf((char *)str, sizeof(str), \"%d\", value);\n\n\tresult = (BOOLEAN)Set_ATE_TXBF_VERIFY_NoComp_Proc(pAd, str);\n\n\tpRaCfg->data[0] = result;\n\tpRaCfg->data[1] = pATEInfo->calParams[0];\n\tpRaCfg->data[2] = pATEInfo->calParams[1];\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status) + 3, NDIS_STATUS_SUCCESS);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* TXBF_SUPPORT */\n\n\nstatic INT32 DO_RACFG_CMD_ATE_SHOW_PARAM(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT32 Status = NDIS_STATUS_SUCCESS;\n\tUINT32 Len;\n\tATE_EX_PARAM ATEExParam;\n\t\n\tATEExParam.mode = pATEInfo->Mode;\n\tATEExParam.TxPower0 = pATEInfo->TxPower0;\n\tATEExParam.TxPower1 = pATEInfo->TxPower1;\n\n#ifdef DOT11N_SS3_SUPPORT\n\tATEExParam.TxPower2 = pATEInfo->TxPower2;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\tATEExParam.TxAntennaSel = pATEInfo->TxAntennaSel;\n\tATEExParam.RxAntennaSel = pATEInfo->RxAntennaSel;\n\n#ifdef CONFIG_AP_SUPPORT\n\tNdisMoveMemory(ATEExParam.DA, pATEInfo->Addr1, MAC_ADDR_LEN);\n\tNdisMoveMemory(ATEExParam.SA, pATEInfo->Addr3, MAC_ADDR_LEN);\n\tNdisMoveMemory(ATEExParam.BSSID, pATEInfo->Addr2, MAC_ADDR_LEN);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tNdisMoveMemory(ATEExParam.DA, pATEInfo->Addr3, MAC_ADDR_LEN);\n\tNdisMoveMemory(ATEExParam.SA, pATEInfo->Addr2, MAC_ADDR_LEN);\n\tNdisMoveMemory(ATEExParam.BSSID, pATEInfo->Addr1, MAC_ADDR_LEN);\n#endif /* CONFIG_STA_SUPPORT */\n\n\tATEExParam.MCS = pATEInfo->TxWI.TxWIMCS;\n\tATEExParam.PhyMode = pATEInfo->TxWI.TxWIPHYMODE;\n\tATEExParam.ShortGI = pATEInfo->TxWI.TxWIShortGI;\n\tATEExParam.BW = pATEInfo->TxWI.TxWIBW;\n\tATEExParam.Channel = OS_HTONL(pATEInfo->Channel);\n\tATEExParam.TxLength = OS_HTONL(pATEInfo->TxLength);\n\tATEExParam.TxCount = OS_HTONL(pATEInfo->TxCount);\n\tATEExParam.RFFreqOffset = OS_HTONL(pATEInfo->RFFreqOffset);\n\tATEExParam.IPG = OS_HTONL(pATEInfo->IPG);\n\tATEExParam.RxTotalCnt = OS_HTONL(pATEInfo->RxTotalCnt);\n\tATEExParam.RxCntPerSec = OS_HTONL(pATEInfo->RxCntPerSec);\n\tATEExParam.LastSNR0 = pATEInfo->LastSNR0;\n\tATEExParam.LastSNR1 = pATEInfo->LastSNR1;\n#ifdef DOT11N_SS3_SUPPORT\n\tATEExParam.LastSNR2 = pATEInfo->LastSNR2;\n#endif /* DOT11N_SS3_SUPPORT */\n\tATEExParam.LastRssi0 = pATEInfo->LastRssi0;\n\tATEExParam.LastRssi1 = pATEInfo->LastRssi1;\n\tATEExParam.LastRssi2 = pATEInfo->LastRssi2;\n\tATEExParam.AvgRssi0 = pATEInfo->AvgRssi0;\n\tATEExParam.AvgRssi1 = pATEInfo->AvgRssi1;\n\tATEExParam.AvgRssi2 = pATEInfo->AvgRssi2;\n\tATEExParam.AvgRssi0X8 = OS_HTONS(pATEInfo->AvgRssi0X8);\n\tATEExParam.AvgRssi1X8 = OS_HTONS(pATEInfo->AvgRssi1X8);\n\tATEExParam.AvgRssi2X8 = OS_HTONS(pATEInfo->AvgRssi2X8);\n\n\tLen = sizeof(ATEExParam);\n\tNdisMoveMemory(pRaCfg->data, &ATEExParam, Len);\n\n\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status) + Len, NDIS_STATUS_SUCCESS);\n\t\n\treturn Status;\n}\n\n\ntypedef INT (*RACFG_CMD_HANDLER)(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN  struct ate_racfghdr *pRaCfg);\n\n\nstatic RACFG_CMD_HANDLER RACFG_CMD_SET1[] =\n{\n\t/* cmd id start from 0x0 */\n\tDO_RACFG_CMD_RF_WRITE_ALL,/* 0x0000 */\t\n\tDO_RACFG_CMD_E2PROM_READ16,/* 0x0001 */\n\tDO_RACFG_CMD_E2PROM_WRITE16,/* 0x0002 */\n\tDO_RACFG_CMD_E2PROM_READ_ALL,/* 0x0003 */\n\tDO_RACFG_CMD_E2PROM_WRITE_ALL,/* 0x0004 */\n\tDO_RACFG_CMD_IO_READ,/* 0x0005 */\n\tDO_RACFG_CMD_IO_WRITE,/* 0x0006 */\n\tDO_RACFG_CMD_IO_READ_BULK,/* 0x0007 */\n\tDO_RACFG_CMD_BBP_READ8,/* 0x0008 */\n\tDO_RACFG_CMD_BBP_WRITE8,/* 0x0009 */\n\tDO_RACFG_CMD_BBP_READ_ALL,/* 0x000a */\n\tDO_RACFG_CMD_GET_COUNTER,/* 0x000b */\n\tDO_RACFG_CMD_CLEAR_COUNTER,/* 0x000c */\n\tNULL /* RACFG_CMD_RSV1 */,/* 0x000d */\n\tNULL /* RACFG_CMD_RSV2 */,/* 0x000e */\n\tNULL /* RACFG_CMD_RSV3 */,/* 0x000f */\n\tDO_RACFG_CMD_TX_START,/* 0x0010 */\n\tDO_RACFG_CMD_GET_TX_STATUS,/* 0x0011 */\n\tDO_RACFG_CMD_TX_STOP,/* 0x0012 */\n\tDO_RACFG_CMD_RX_START,/* 0x0013 */\n\tDO_RACFG_CMD_RX_STOP,/* 0x0014 */\n\tDO_RACFG_CMD_GET_NOISE_LEVEL,/* 0x0015 */\n\tNULL\n\t/* cmd id end with 0x20 */\n};\n\n\nstatic RACFG_CMD_HANDLER RACFG_CMD_SET2[] =\n{\n\t/* cmd id start from 0x80 */\n\tDO_RACFG_CMD_ATE_START,/* 0x0080 */\n\tDO_RACFG_CMD_ATE_STOP/* 0x0081 */\n\t/* cmd id end with 0x81 */\n};\n\n\nstatic RACFG_CMD_HANDLER RACFG_CMD_SET3[] =\n{\n\t/* cmd id start from 0x100 */\n\tDO_RACFG_CMD_ATE_START_TX_CARRIER,/* 0x0100 */\n\tDO_RACFG_CMD_ATE_START_TX_CONT,/* 0x0101 */\n\tDO_RACFG_CMD_ATE_START_TX_FRAME,/* 0x0102 */\n\tDO_RACFG_CMD_ATE_SET_BW,/* 0x0103 */\n\tDO_RACFG_CMD_ATE_SET_TX_POWER0,/* 0x0104 */\n\tDO_RACFG_CMD_ATE_SET_TX_POWER1,/* 0x0105 */\n\tDO_RACFG_CMD_ATE_SET_FREQ_OFFSET,/* 0x0106 */\n\tDO_RACFG_CMD_ATE_GET_STATISTICS,/* 0x0107 */\n\tDO_RACFG_CMD_ATE_RESET_COUNTER,/* 0x0108 */\n\tDO_RACFG_CMD_ATE_SEL_TX_ANTENNA,/* 0x0109 */\n\tDO_RACFG_CMD_ATE_SEL_RX_ANTENNA,/* 0x010a */\n\tDO_RACFG_CMD_ATE_SET_PREAMBLE,/* 0x010b */\n\tDO_RACFG_CMD_ATE_SET_CHANNEL,/* 0x010c */\n\tDO_RACFG_CMD_ATE_SET_ADDR1,/* 0x010d */\n\tDO_RACFG_CMD_ATE_SET_ADDR2,/* 0x010e */\n\tDO_RACFG_CMD_ATE_SET_ADDR3,/* 0x010f */\n\tDO_RACFG_CMD_ATE_SET_RATE,/* 0x0110 */\n\tDO_RACFG_CMD_ATE_SET_TX_FRAME_LEN,/* 0x0111 */\n\tDO_RACFG_CMD_ATE_SET_TX_FRAME_COUNT,/* 0x0112 */\n\tDO_RACFG_CMD_ATE_START_RX_FRAME,/* 0x0113 */\n\tDO_RACFG_CMD_ATE_E2PROM_READ_BULK,/* 0x0114 */\n\tDO_RACFG_CMD_ATE_E2PROM_WRITE_BULK,/* 0x0115 */\n\tDO_RACFG_CMD_ATE_IO_WRITE_BULK,/* 0x0116 */\n\tDO_RACFG_CMD_ATE_BBP_READ_BULK,/* 0x0117 */\n\tDO_RACFG_CMD_ATE_BBP_WRITE_BULK,/* 0x0118 */\n\tNULL,/* 0x0119 */\n\tNULL,/* 0x011a */\n#ifdef DOT11N_SS3_SUPPORT\n\tDO_RACFG_CMD_ATE_SET_TX_POWER2,/* 0x011b */\n#else\n\tNULL,/* 0x011b */\n#endif /* DOT11N_SS3_SUPPORT */\n#ifdef TXBF_SUPPORT\n\tDO_RACFG_CMD_ATE_TXBF_DUT_INIT,/* 0x011c */\n\tDO_RACFG_CMD_ATE_TXBF_LNA_CAL,/* 0x011d */\n\tDO_RACFG_CMD_ATE_TXBF_DIV_CAL,/* 0x011e */\n\tDO_RACFG_CMD_ATE_TXBF_PHASE_CAL,/* 0x011f */\n\tDO_RACFG_CMD_ATE_TXBF_GOLDEN_INIT,/* 0x0120 */\n\tDO_RACFG_CMD_ATE_TXBF_VERIFY,/* 0x0121 */\n\tDO_RACFG_CMD_ATE_TXBF_VERIFY_NOCOMP/* 0x0122 */\n#else\n\tNULL,/* 0x011c */\n\tNULL,/* 0x011d */\n\tNULL,/* 0x011e */\n\tNULL,/* 0x011f */\n\tNULL,/* 0x0120 */\n\tNULL,/* 0x0121 */\n\tNULL/* 0x0122 */\n#endif /* TXBF_SUPPORT */\n\t/* cmd id end with 0x122 */\n};\n\n\nstatic RACFG_CMD_HANDLER RACFG_CMD_SET4[] =\n{\n\t/* cmd id start from 0x200 */\n\tNULL,/* 0x0200 */\n\tNULL,/* 0x0201 */\n\tNULL/* 0x0202 */\n\t/* cmd id end with 0x202 */\n};\n\n\nstatic RACFG_CMD_HANDLER RACFG_CMD_SET5[] =\n{\n\tDO_RACFG_CMD_ATE_SHOW_PARAM\n};\n\n\ntypedef struct RACFG_CMD_TABLE_{\n\tRACFG_CMD_HANDLER *cmdSet;\n\tint\tcmdSetSize;\n\tint\tcmdOffset;\n}RACFG_CMD_TABLE;\n\n\nRACFG_CMD_TABLE RACFG_CMD_TABLES[]={\n\t{\n\t\tRACFG_CMD_SET1,\n\t\tsizeof(RACFG_CMD_SET1) / sizeof(RACFG_CMD_HANDLER),\n\t\t0x0,\n\t},\n\t{\n\t\tRACFG_CMD_SET2,\n\t\tsizeof(RACFG_CMD_SET2) / sizeof(RACFG_CMD_HANDLER),\n\t\t0x80,\n\t},\n\t{\n\t\tRACFG_CMD_SET3,\n\t\tsizeof(RACFG_CMD_SET3) / sizeof(RACFG_CMD_HANDLER),\n\t\t0x100,\n\t},\n\t{\n\t\tRACFG_CMD_SET4,\n\t\tsizeof(RACFG_CMD_SET4) / sizeof(RACFG_CMD_HANDLER),\n\t\t0x200,\n\t},\n\t{\n\t\tRACFG_CMD_SET5,\n\t\tsizeof(RACFG_CMD_SET5) / sizeof(RACFG_CMD_HANDLER),\n\t\t0xff00,\n\t}\n\t\n};\n\n\nstatic INT32 RACfgCMDHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq,\n\tIN pRACFGHDR pRaCfg)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\tINT32 Status = NDIS_STATUS_SUCCESS;\n\tUSHORT Command_Id;\n\tUINT32 TableIndex = 0;\n\n\tCommand_Id = OS_NTOHS(pRaCfg->command_id);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n%s: Command_Id = 0x%04x !\\n\", __FUNCTION__, Command_Id));\n\t\n\twhile (TableIndex < (sizeof(RACFG_CMD_TABLES) / sizeof(RACFG_CMD_TABLE)))\n\t{\n \t\tint cmd_index = 0;\n \t\tcmd_index = Command_Id - RACFG_CMD_TABLES[TableIndex].cmdOffset;\n \t\tif ((cmd_index >= 0) && (cmd_index < RACFG_CMD_TABLES[TableIndex].cmdSetSize))\n \t\t{\n\t\t\tRACFG_CMD_HANDLER *pCmdSet;\n\n\t\t\tpCmdSet = RACFG_CMD_TABLES[TableIndex].cmdSet;\n\t\t\t\n\t\t\tif (pCmdSet[cmd_index] != NULL)\n\t\t\t\tStatus = (*pCmdSet[cmd_index])(pAd, wrq, pRaCfg);\n\t\t\tbreak;\n\t\t}\n\t\tTableIndex++;\n\t}\n\n\t/* In passive mode, only commands that read registers are allowed. */ \n\tif (pATEInfo->PassiveMode)\n\t{\n\t\tint entry, allowCmd = FALSE;\n\t\tstatic int allowedCmds[] = {\n\t\t\t\tRACFG_CMD_E2PROM_READ16, RACFG_CMD_E2PROM_READ_ALL,\n\t\t\t\tRACFG_CMD_IO_READ, RACFG_CMD_IO_READ_BULK,\n\t\t\t\tRACFG_CMD_BBP_READ8, RACFG_CMD_BBP_READ_ALL,\n\t\t\t\tRACFG_CMD_ATE_E2PROM_READ_BULK,\n\t\t\t\tRACFG_CMD_ATE_BBP_READ_BULK,\n\t\t\t\tRACFG_CMD_ATE_RF_READ_BULK,\n\t\t\t\t};\n\n\t\tfor (entry=0; entry<sizeof(allowedCmds)/sizeof(allowedCmds[0]); entry++)\n\t\t{\n\t\t\tif (Command_Id==allowedCmds[entry])\n\t\t\t{\n\t\t\t\tallowCmd = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* Also allow writes to BF profile registers */\n\t\tif (Command_Id==RACFG_CMD_BBP_WRITE8)\n\t\t{\n\t\t\tint offset = OS_NTOHS(pRaCfg->status);\n\t\t\tif (offset==BBP_R27 || (offset>=BBP_R174 && offset<=BBP_R182))\n\t\t\t\tallowCmd = TRUE;\n\t\t}\n\n\t\t/* If not allowed, then ignore the command. */\n\t\tif (!allowCmd)\n\t\t{\n\t\t\tResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS);\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n\n\treturn Status;\n}\n\n\nINT RtmpDoAte(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t\t*wrq,\n\tIN\tPSTRING\t\t\twrq_name)\n{\n\tINT32 Status = NDIS_STATUS_SUCCESS;\n\tstruct ate_racfghdr *pRaCfg;\n\tUINT32 ATEMagicNum;\n\n\tos_alloc_mem_suspend(pAd, (UCHAR **)&pRaCfg, sizeof(struct ate_racfghdr));\n\n\tif (!pRaCfg)\n\t{\n\t\tStatus = -ENOMEM;\n\t\tgoto ERROR0;\n\t}\n\t\t\t\t\n\tNdisZeroMemory(pRaCfg, sizeof(struct ate_racfghdr));\n\tStatus = copy_from_user((PUCHAR)pRaCfg, wrq->u.data.pointer, wrq->u.data.length);\n\t\n\tif (Status)\n\t{\n\t\tStatus = -EFAULT;\n\t\tgoto ERROR1;\n\t}\n\n\tATEMagicNum = OS_NTOHL(pRaCfg->magic_no);\n\t\n\tswitch(ATEMagicNum)\n\t{\n\t\tcase RACFG_MAGIC_NO:\n\t\t\tStatus = RACfgCMDHandler(pAd, wrq, pRaCfg);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\tDBGPRINT_ERR((\"Unknown magic number of RACFG command = %x\\n\", ATEMagicNum));\n\t\t\tbreak;\n\t}\n\t\n ERROR1:\n\tos_free_mem(NULL, pRaCfg);\n ERROR0:\n\treturn Status;\n}\n\n\nVOID ATE_QA_Statistics(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RXWI_STRUC *pRxWI,\n\tIN RXINFO_STRUC *pRxInfo,\n\tIN PHEADER_802_11 pHeader)\n{\n\tPATE_INFO pATEInfo = &(pAd->ate);\n\n\t/* update counter first */\n\tif (pHeader != NULL)\n\t{\n\t\tif (pHeader->FC.Type == BTYPE_DATA)\n\t\t{\n\t\t\tif (pRxInfo->U2M)\n\t\t\t{\n\t\t\t\tpATEInfo->U2M++;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpATEInfo->OtherData++;\n\t\t}\n\t\telse if (pHeader->FC.Type == BTYPE_MGMT)\n\t\t{\n\t\t\tif (pHeader->FC.SubType == SUBTYPE_BEACON)\n\t\t\t\tpATEInfo->Beacon++;\n\t\t\telse\n\t\t\t\tpATEInfo->OtherCount++;\n\t\t}\n\t\telse if (pHeader->FC.Type == BTYPE_CNTL)\n\t\t{\n\t\t\tpATEInfo->OtherCount++;\n\t\t}\n\t}\n\tpATEInfo->RSSI0 = pRxWI->RxWIRSSI0;\n\tpATEInfo->RSSI1 = pRxWI->RxWIRSSI1;\n\tpATEInfo->RSSI2 = pRxWI->RxWIRSSI2;\n\tpATEInfo->SNR0 = pRxWI->RxWISNR0;\n\tpATEInfo->SNR1 = pRxWI->RxWISNR1;\n\n\n}\n\n\nINT Set_TxStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Set_TxStop_Proc\\n\"));\n\n\tif (Set_ATE_Proc(pAd, \"TXSTOP\"))\n\t{\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;\n\t}\n}\n\n\nINT Set_RxStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Set_RxStop_Proc\\n\"));\n\n\tif (Set_ATE_Proc(pAd, \"RXSTOP\"))\n\t{\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;\n\t}\n}\n\n\n#ifdef DBG\nINT Set_EERead_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT buffer[EEPROM_SIZE >> 1];\n\tUSHORT *p;\n\tINT offset;\n\t\n\trt_ee_read_all(pAd, (USHORT *)buffer);\n\tp = buffer;\n\n\tfor (offset = 0; offset < (EEPROM_SIZE >> 1); offset++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%4.4x \", *p));\n\t\tif (((offset+1) % 16) == 0)\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\tp++;\n\t}\n\n\treturn TRUE;\n}\n\n\nINT Set_EEWrite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT offset = 0, value;\n\tPSTRING p2 = arg;\n\t\n\twhile ((*p2 != ':') && (*p2 != '\\0'))\n\t{\n\t\tp2++;\n\t}\n\t\n\tif (*p2 == ':')\n\t{\n\t\tA2Hex(offset, arg);\n\t\tA2Hex(value, p2 + 1);\n\t}\n\telse\n\t{\n\t\tA2Hex(value, arg);\n\t}\n\t\n\tif (offset >= EEPROM_SIZE)\n\t{\n\t\tDBGPRINT_ERR((\"Offset can not exceed EEPROM_SIZE( == 0x%04x)\\n\", EEPROM_SIZE));\t\n\t\treturn FALSE;\n\t}\n\t\n\tRT28xx_EEPROM_WRITE16(pAd, offset, value);\n\n\treturn TRUE;\n}\n\n\nINT Set_BBPRead_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR value = 0, offset;\n\n\tA2Hex(offset, arg);\t\n\t\t\t\n\tATE_BBPRead(pAd, offset, &value);\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%x\\n\", value));\n\t\t\n\treturn TRUE;\n}\n\n\nINT Set_BBPWrite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT offset = 0;\n\tPSTRING p2 = arg;\n\tUCHAR value;\n\t\n\twhile ((*p2 != ':') && (*p2 != '\\0'))\n\t{\n\t\tp2++;\n\t}\n\t\n\tif (*p2 == ':')\n\t{\n\t\tA2Hex(offset, arg);\t\n\t\tA2Hex(value, p2 + 1);\t\n\t}\n\telse\n\t{\n\t\tA2Hex(value, arg);\t\n\t}\n\n\tATE_BBPWrite(pAd, offset, value);\n\n\treturn TRUE;\n}\n\n\nINT Set_RFWrite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPSTRING p2, p3, p4;\n\tUINT32 R1, R2, R3, R4;\n\t\n\tp2 = arg;\n\n\twhile ((*p2 != ':') && (*p2 != '\\0'))\n\t{\n\t\tp2++;\n\t}\n\t\n\tif (*p2 != ':')\n\t\treturn FALSE;\n\t\n\tp3 = p2 + 1;\n\n\twhile((*p3 != ':') && (*p3 != '\\0'))\n\t{\n\t\tp3++;\n\t}\n\n\tif (*p3 != ':')\n\t\treturn FALSE;\n\t\n\tp4 = p3 + 1;\n\n\twhile ((*p4 != ':') && (*p4 != '\\0'))\n\t{\n\t\tp4++;\n\t}\n\n\tif (*p4 != ':')\n\t\treturn FALSE;\n\n\t\t\n\tA2Hex(R1, arg);\t\n\tA2Hex(R2, p2 + 1);\t\n\tA2Hex(R3, p3 + 1);\t\n\tA2Hex(R4, p4 + 1);\t\n\t\n\tRTMP_RF_IO_WRITE32(pAd, R1);\n\tRTMP_RF_IO_WRITE32(pAd, R2);\n\tRTMP_RF_IO_WRITE32(pAd, R3);\n\tRTMP_RF_IO_WRITE32(pAd, R4);\n\t\n\treturn TRUE;\n}\n#endif /* DBG */\n#endif /* RALINK_QA */\n\n"
  },
  {
    "path": "src/ate/include/rt_ate.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n \n \tModule Name:\n\trt_ate.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n*/\n\n#ifndef __RT_ATE_H__\n#define __RT_ATE_H__\n\ntypedef struct _ATE_CHIP_STRUCT {\n\t/* functions */\n\tVOID\t(*ChannelSwitch)(PRTMP_ADAPTER pAd);\n\tINT\t\t(*TxPwrHandler)(PRTMP_ADAPTER pAd, char index);\n\tINT\t\t(*TssiCalibration)(PRTMP_ADAPTER pAd, PSTRING arg);\n\tINT\t\t(*ExtendedTssiCalibration)(PRTMP_ADAPTER pAd, PSTRING arg);\n\tVOID\t(*RxVGAInit)(PRTMP_ADAPTER pAd);\n\tVOID\t(*AsicSetTxRxPath)(PRTMP_ADAPTER pAd);\n\tVOID\t(*AdjustTxPower)(PRTMP_ADAPTER pAd);\n\tVOID\t(*AsicExtraPowerOverMAC)(PRTMP_ADAPTER pAd);\n\tVOID \t(*TemperCompensation)(PRTMP_ADAPTER *pAd);\n\t\n\t/* command handlers */\n\tINT\t\t(*Set_BW_Proc)(PRTMP_ADAPTER pAd, PSTRING arg);\n\tINT\t\t(*Set_FREQ_OFFSET_Proc)(PRTMP_ADAPTER pAd, PSTRING arg);\t\n\n\t/* variables */\n\tINT maxTxPwrCnt;\n\tBOOLEAN bBBPStoreTXCARR;\n\tBOOLEAN bBBPStoreTXCARRSUPP;\n\tBOOLEAN bBBPStoreTXCONT;\n\tBOOLEAN bBBPLoadATESTOP;\n\t\t\n}ATE_CHIP_STRUCT, *PATE_CHIP_STRUCT;\n\ntypedef union _CAPTURE_MODE_SHARE_MEMORY {\n\tstruct \n\t{\n\t\tUINT32       LOW_BYTE0:8;\n\t\tUINT32       LOW_BYTE1:8;\n\t\tUINT32       HIGH_BYTE0:8;\n\t\tUINT32       HIGH_BYTE1:8;\n\t} field;\n\tUINT32                   Value;\n}CAPTURE_MODE_SHARE_MEMORY, *PCAPTURE_MODE_SHARE_MEMORY;\n\ntypedef struct _ATE_INFO {\n\tPATE_CHIP_STRUCT pChipStruct; \n\tUCHAR Mode;\n\tBOOLEAN PassiveMode;\n#ifdef RT3350\n\tUCHAR   PABias;\n#endif /* RT3350 */\n\tCHAR TxPower0;\n\tCHAR TxPower1;\n#ifdef DOT11N_SS3_SUPPORT\n\tCHAR TxPower2;\n#endif /* DOT11N_SS3_SUPPORT */\n\tCHAR MinTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */\n\tCHAR MaxTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */\n\tCHAR TxAntennaSel;\n\tCHAR RxAntennaSel;\n\tTXWI_STRUC TxWI;\t/* TXWI */\n\tUSHORT QID;\n\tUCHAR Addr1[MAC_ADDR_LEN];\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUCHAR Addr3[MAC_ADDR_LEN];\n\tUCHAR Channel;\n\tUCHAR Payload;\t\t/* Payload pattern */\n\tUCHAR TxMethod; /* Early chipsets must be applied old TXCONT/TXCARR/TXCARS mechanism. */\n\tUINT32 TxLength;\n\tUINT32 TxCount;\n\tUINT32 TxDoneCount;\t/* Tx DMA Done */\n\tUINT32 RFFreqOffset;\n\tUINT32 IPG;\n\tBOOLEAN bRxFER;\t\t/* Show Rx Frame Error Rate */\n\tBOOLEAN\tbQAEnabled;\t/* QA is used. */\n\tBOOLEAN bQATxStart;\t/* Have compiled QA in and use it to ATE tx. */\n\tBOOLEAN bQARxStart;\t/* Have compiled QA in and use it to ATE rx. */\n\tBOOLEAN bAutoTxAlc;\t/* Set Auto Tx Alc */\n#ifdef RTMP_INTERNAL_TX_ALC\n#if defined(RT3350) || defined(RT3352)\n\tBOOLEAN bTSSICalbrEnableG; /* Enable TSSI calibration */\n\tCHAR\tTssiRefPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];\n\tCHAR\tTssiDeltaPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n#ifdef TXBF_SUPPORT\n\tBOOLEAN bTxBF;\t\t/* Enable Tx Bean Forming */\n\tSHORT\ttxSoundingMode;\t/* Sounding mode for non-QA ATE. 0=none, 1=Data Sounding, 2=NDP */\n\tUCHAR\tcalParams[2];\n#endif\t\t\t\t/* TXBF_SUPPORT */\n\tUINT32 RxTotalCnt;\n\tUINT32 RxCntPerSec;\n\tUCHAR\tforceBBPReg;\t/* force to not update the specific BBP register, now used for ATE TxBF */\n\n\tCHAR LastSNR0;\t\t/* last received SNR */\n\tCHAR LastSNR1;\t\t/* last received SNR for 2nd  antenna */\n#ifdef DOT11N_SS3_SUPPORT\n\tCHAR LastSNR2;\n#endif\t\t\t\t/* DOT11N_SS3_SUPPORT */\n\tCHAR LastRssi0;\t\t/* last received RSSI */\n\tCHAR LastRssi1;\t\t/* last received RSSI for 2nd  antenna */\n\tCHAR LastRssi2;\t\t/* last received RSSI for 3rd  antenna */\n\tCHAR AvgRssi0;\t\t/* last 8 frames' average RSSI */\n\tCHAR AvgRssi1;\t\t/* last 8 frames' average RSSI */\n\tCHAR AvgRssi2;\t\t/* last 8 frames' average RSSI */\n\tSHORT AvgRssi0X8;\t/* sum of last 8 frames' RSSI */\n\tSHORT AvgRssi1X8;\t/* sum of last 8 frames' RSSI */\n\tSHORT AvgRssi2X8;\t/* sum of last 8 frames' RSSI */\n\tUINT32 NumOfAvgRssiSample;\n\tUSHORT HLen;\t\t/* Header Length */\n\n#ifdef RALINK_QA\n\t/* Tx frame */\n#ifdef RTMP_MAC_USB\n\tTXINFO_STRUC TxInfo;\t/* TxInfo */\n#endif /* RTMP_MAC_USB */\n\tUSHORT PLen;\t\t/* Pattern Length */\n\tUCHAR Header[32];\t/* Header buffer */\n\tUCHAR Pattern[32];\t/* Pattern buffer */\n\tUSHORT DLen;\t\t/* Data Length */\n\tUSHORT seq;\n\tUINT32 CID;\n\tRTMP_OS_PID AtePid;\n\t/* counters */\n\tUINT32 U2M;\n\tUINT32 OtherData;\n\tUINT32 Beacon;\n\tUINT32 OtherCount;\n\tUINT32 TxAc0;\n\tUINT32 TxAc1;\n\tUINT32 TxAc2;\n\tUINT32 TxAc3;\n\tUINT32 TxHCCA;\n\tUINT32 TxMgmt;\n\tUINT32 RSSI0;\n\tUINT32 RSSI1;\n\tUINT32 RSSI2;\n\tUINT32 SNR0;\n\tUINT32 SNR1;\n#ifdef DOT11N_SS3_SUPPORT\n\tUINT32 SNR2;\n#endif /* DOT11N_SS3_SUPPORT */\n\tINT32 BF_SNR[3];\t/* Last RXWI BF SNR. Units=0.25 dB */\n\t/* TxStatus : 0 --> task is idle, 1 --> task is running */\n\tUCHAR TxStatus;\n#endif /* RALINK_QA */\n#ifdef TXBF_SUPPORT\n#define MAX_SOUNDING_RESPONSE_SIZE\t(57*2*2*9+3+2+6)\t/* Assume 114 carriers (40MHz), 3x3, 8bits/coeff, + SNR + HT HEADER + MIMO CONTROL FIELD */\n\tUCHAR sounding;\n\tUINT32 sounding_jiffies;\n\tCHAR soundingSNR[3];\n\tUINT32 LastRxRate;\n\tUINT32 LastTxRate;\n\tUINT32 soundingRespSize;\t/* Size of Sounding response */\n\tUCHAR soundingResp[MAX_SOUNDING_RESPONSE_SIZE];\t/* Entire Sounding response */\n#endif /* TXBF_SUPPORT */\n\tRALINK_TIMER_STRUCT PeriodicTimer;\n\tULONG OneSecPeriodicRound;\n} ATE_INFO, *PATE_INFO;\n\n/* \n\tUse bitmap to allow coexist of ATE_TXFRAME \n\tand ATE_RXFRAME(i.e.,to support LoopBack mode).\n*/\n#define fATE_IDLE\t\t\t\t\t0x00\n#define fATE_TX_ENABLE\t\t\t\t0x01\n#define fATE_RX_ENABLE\t\t\t\t0x02\n#define fATE_TXCONT_ENABLE\t\t\t0x04\n#define fATE_TXCARR_ENABLE\t\t\t0x08\n#define fATE_TXCARRSUPP_ENABLE\t\t0x10\n#define fATE_RESERVED_1\t\t\t\t0x20\n#define fATE_RESERVED_2\t\t\t\t0x40\n#define fATE_EXIT\t\t\t\t\t0x80\n\n/* Enter/Reset ATE */\n#define\tATE_START                   (fATE_IDLE)\n/* Stop/Exit ATE */\n#define\tATE_STOP                    (fATE_EXIT)\n/* Continuous Transmit Frames (without time gap) */\n#define\tATE_TXCONT                  ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE))\n/* Transmit Carrier */\n#define\tATE_TXCARR                  ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE))\n/* Transmit Carrier Suppression (information without carrier) */\n#define\tATE_TXCARRSUPP              ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE))\n/* Transmit Frames */\n#define\tATE_TXFRAME                 (fATE_TX_ENABLE)\n/* Receive Frames */\n#define\tATE_RXFRAME                 (fATE_RX_ENABLE)\n\n\n#ifdef RTMP_INTERNAL_TX_ALC\n#define EEPROM_TSSI_ENABLE 0x36\n#define EEPROM_TSSI_MODE_EXTEND 0x76\n\n#define ATE_MDSM_NORMAL_TX_POWER\t\t\t\t\t\t0x00\n#define ATE_MDSM_DROP_TX_POWER_BY_6dBm\t\t\t\t\t0x01\n#define ATE_MDSM_DROP_TX_POWER_BY_12dBm\t\t\t\t\t0x02\n#define ATE_MDSM_ADD_TX_POWER_BY_6dBm\t\t\t\t\t0x03\n#define ATE_MDSM_BBP_R1_STATIC_TX_POWER_CONTROL_MASK\t0x03\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#define\tLEN_OF_ARG 16\n#define ATE_ON(_p)              (((_p)->ate.Mode) != ATE_STOP)\n#define TX_METHOD_0 0 /* Early chipsets must be applied this original TXCONT/TXCARR/TXCARS mechanism. */\n#define TX_METHOD_1 1 /* Default TXCONT/TXCARR/TXCARS mechanism is TX_METHOD_1 */\n\n#define ATE_MAC_TX_ENABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(_A, _I, _pV);\t\t\\\n\t(*(_pV)) |= (1 << 2);\t\t\t\t\\\n\tRTMP_IO_WRITE32(_A, _I, (*(_pV)));\t\\\n}\n\n#define ATE_MAC_TX_DISABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(_A, _I, _pV);\t\t\\\n\t(*(_pV)) &= ~(1 << 2);\t\t\t\t\\\n\tRTMP_IO_WRITE32(_A, _I, (*(_pV)));\t\\\n}\n\n#define ATE_MAC_RX_ENABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(_A, _I, _pV);\t\t\\\n\t(*(_pV)) |= (1 << 3);\t\t\t\t\\\n\tRTMP_IO_WRITE32(_A, _I, (*(_pV)));\t\\\n}\n\n#define ATE_MAC_RX_DISABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(_A, _I, _pV);\t\t\\\n\t(*(_pV)) &= ~(1 << 3);\t\t\t\t\\\n\tRTMP_IO_WRITE32(_A, _I, (*(_pV)));\t\\\n}\n\n/* Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1. */\n#define ATE_MAC_TX_CTS_ENABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(_A, _I, _pV);\t\t\t\\\n\t(*(_pV)) |= (1 << 4);\t\t\t\t\t\\\n\tRTMP_IO_WRITE32(_A, _I, (*(_pV)));\t\t\\\n}\n\n/* Clear MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 0. */\n#define ATE_MAC_TX_CTS_DISABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(_A, _I, _pV);\t\t\t\\\n\t(*(_pV)) &= ~(1 << 4);\t\t\t\t\t\\\n\tRTMP_IO_WRITE32(_A, _I, (*(_pV)));\t\t\\\n}\n\n/* Clear BBP R22 to reset Tx Mode (bit7~bit0) = 0. */\n#define ATE_BBP_RESET_TX_MODE(_A, _I, _pV)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV);\t\t\\\n\t(*(_pV)) &= (0x00);\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV)));\t\\\n}\n\n/* Set BBP R22 to start Continuous Tx Mode (bit7) = 1. */\n#define ATE_BBP_START_CTS_TX_MODE(_A, _I, _pV)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV);\t\t\\\n\t(*(_pV)) |= (1 << 7);\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV)));\t\\\n}\n\n/* Clear BBP R22 to stop Continuous Tx Mode (bit7) = 0. */\n#define ATE_BBP_STOP_CTS_TX_MODE(_A, _I, _pV)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV);\t\t\\\n\t(*(_pV)) &= ~(1 << 7);\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV)));\t\\\n}\n\n/* Set BBP R24 to send out Continuous Tx sin wave (bit0) = 1. */\n#define ATE_BBP_CTS_TX_SIN_WAVE_ENABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV);\t\t\\\n\t(*(_pV)) |= (1 << 0);\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV)));\t\\\n}\n\n/* Clear BBP R24 to stop Continuous Tx sin wave (bit0) = 0. */\n#define ATE_BBP_CTS_TX_SIN_WAVE_DISABLE(_A, _I, _pV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV);\t\t\\\n\t(*(_pV)) &= ~(1 << 0);\t\t\t\t\t\t\t\\\n\tATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV)));\t\\\n}\n\n/*\n==========================================================================\n\tDescription:\n\t\tThis routine sets initial value of VGA in the RX chain.\n\t\tAGC is the abbreviation of \"Automatic Gain Controller\",\n\t\twhile VGA (Variable Gain Amplifier) is a part of AGC loop.\n\t\t(i.e., VGA + level detector + feedback loop = AGC)\n\n    Return:\n        VOID\n==========================================================================\n*/\n#define ATE_CHIP_RX_VGA_GAIN_INIT(__pAd)\t\t\t\t\t\t\t\t\\\n\tif (__pAd->ate.pChipStruct->RxVGAInit != NULL)\t\\\n\t\t__pAd->ate.pChipStruct->RxVGAInit(__pAd)\n\n#define ATE_CHIP_SET_TX_RX_PATH(__pAd)\t\t\t\t\t\t\t\t\\\n\tif (__pAd->ate.pChipStruct->AsicSetTxRxPath != NULL)\t\\\n\t\t__pAd->ate.pChipStruct->AsicSetTxRxPath(__pAd)\n\n\n\n#ifdef RTMP_MAC_USB\n#define ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)    RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)\n#define ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)    RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)\n\n#define BULK_OUT_LOCK(pLock, IrqFlags)\t\\\n\t\tif(1 /*!(in_interrupt() & 0xffff0000)*/)\t\\\n\t\t\tRTMP_IRQ_LOCK((pLock), IrqFlags);\n\t\t\n#define BULK_OUT_UNLOCK(pLock, IrqFlags)\t\\\n\t\tif(1 /*!(in_interrupt() & 0xffff0000)*/)\t\\\n\t\t\tRTMP_IRQ_UNLOCK((pLock), IrqFlags);\n\nVOID ATE_RTUSBBulkOutDataPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBulkOutPipeId);\n\nVOID ATE_RTUSBCancelPendingBulkInIRP(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID ATEResetBulkIn(\n\tIN PRTMP_ADAPTER\tpAd);\n\nINT ATEResetBulkOut(\n\tIN PRTMP_ADAPTER\tpAd);\n#endif /* RTMP_MAC_USB */\n\nINT DefaultATETxPwrHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN char index);\n\n\n\n\n\n#if defined(RT28xx) || defined(RT2880)\nVOID RT28xxATEAsicSwitchChannel(\n    IN PRTMP_ADAPTER pAd);\n\nINT RT28xxATETxPwrHandler(\n\tIN PRTMP_ADAPTER pAd,\n\tIN char index);\n#endif /* defined(RT28xx) || defined(RT2880) */\n\n\n#ifdef RALINK_QA\nVOID ATE_QA_Statistics(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RXWI_STRUC *pRxWI,\n\tIN RXINFO_STRUC *pRxInfo,\n\tIN PHEADER_802_11 pHeader);\n\t\nINT RtmpDoAte(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq,\n\tIN PSTRING wrq_name);\n\nINT Set_TxStop_Proc(\n\tIN RTMP_ADAPTER\t*pAd,\n\tIN PSTRING arg);\n\nINT Set_RxStop_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg);\n\n#ifdef DBG\nINT Set_EERead_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_EEWrite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_BBPRead_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_BBPWrite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_RFWrite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DBG */ \n#endif /* RALINK_QA */\n\n\n\n#ifdef RALINK_QA\n#define SYNC_CHANNEL_WITH_QA(_A, _pV)\\\n\tif ((_A->bQATxStart == TRUE) || (_A->bQARxStart == TRUE))\\\n\t{\\\n\t\treturn;\\\n\t}\\\n\telse\\\n\t\t*_pV = _A->Channel\n#else\n#define SYNC_CHANNEL_WITH_QA(_A, _pV)\\\n\t*_pV = _A->Channel\n#endif /* RALINK_QA */\n\nVOID rt_ee_read_all(\n\tIN  PRTMP_ADAPTER   pAd,\n\tOUT USHORT *Data);\n\nVOID rt_ee_write_all(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  USHORT *Data);\n\nVOID rt_ee_write_bulk(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  USHORT *Data,\n\tIN  USHORT offset,\n\tIN  USHORT length);\n\nINT Set_ATE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_DA_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_SA_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_BSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tSet_ATE_CHANNEL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_INIT_CHAN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ADCDump_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#ifdef RTMP_INTERNAL_TX_ALC\nINT Set_ATE_TSSI_CALIBRATION_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_TSSI_CALIBRATION_EX_Proc(\n\tIN      PRTMP_ADAPTER   pAd,\n\tIN      PSTRING                 arg);\n\n\n#if defined(RT3350) || defined(RT3352)\nINT RT335x_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nCHAR InsertTssi(\n\tIN UCHAR InChannel,\n\tIN UCHAR Channel0,\n\tIN UCHAR Channel1,\n\tIN CHAR Tssi0,\n\tIN CHAR Tssi1);\n\nINT RT335xATETssiCalibrationExtend(\n\tIN struct _RTMP_ADAPTER\t\t*pAd,\n\tIN PSTRING\t\t\t\t\targ);\n#endif /* defined(RT3350) || defined(RT3352) */\n\nCHAR ATEGetDesiredTSSI(\n\tIN PRTMP_ADAPTER\t\tpAd);\n\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n\nINT Set_ATE_READ_EXTERNAL_TSSI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\nINT\tSet_ATE_TX_POWER0_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TX_POWER1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT11N_SS3_SUPPORT\nINT\tSet_ATE_TX_POWER2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#endif /* DOT11N_SS3_SUPPORT */\n\nINT\tSet_ATE_TX_Antenna_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_RX_Antenna_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nVOID DefaultATEAsicExtraPowerOverMAC(\n\tIN\tPRTMP_ADAPTER \t\tpAd);\n\nVOID ATEAsicExtraPowerOverMAC(\n\tIN\tPRTMP_ADAPTER\tpAd);\n#ifdef RT3350\nINT\tSet_ATE_PA_Bias_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* RT3350 */\n\nINT\tDefault_Set_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n\n\n\n#if defined(RT28xx) || defined(RT2880)\nINT\tRT28xx_Set_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* defined(RT28xx) || defined(RT2880) */\n\n\nINT\tSet_ATE_TX_FREQ_OFFSET_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tDefault_Set_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n\n\n\n#if defined(RT28xx) || defined(RT2880)\nINT\tRT28xx_Set_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* defined(RT28xx) || defined(RT2880) */\n\n\nINT\tSet_ATE_TX_BW_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TX_LENGTH_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TX_COUNT_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TX_MCS_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TX_MODE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TX_GI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tSet_ATE_RX_FER_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Read_RF_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Write_RF1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Write_RF2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Write_RF3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Write_RF4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Load_E2P_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef RTMP_EFUSE_SUPPORT\nINT Set_ATE_Load_E2P_From_Buf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Cal_Free_Info_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* RTMP_EFUSE_SUPPORT */\n\nINT Set_ATE_Read_E2P_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef LED_CONTROL_SUPPORT\n#endif /* LED_CONTROL_SUPPORT */\n\nINT\tSet_ATE_AUTO_ALC_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_IPG_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Payload_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\n#ifdef TXBF_SUPPORT\nINT\tSet_ATE_TXBF_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TXSOUNDING_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TXBF_DIVCAL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_TXBF_LNACAL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_TXBF_INIT_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_TXBF_CAL_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_TXBF_GOLDEN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_TXBF_VERIFY_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_TXBF_VERIFY_NoComp_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_ForceBBP_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* TXBF_SUPPORT */\n\n\nINT\tSet_ATE_Show_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ATE_Help_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nVOID DefaultATEAsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd);\n\n\n#ifdef MT7601\nINT Set_ATE_Read_Temperature_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ATE_Read_TSSI_DC_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* MT7601 */\n\nVOID ATEAsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ATESampleRssi(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN RXWI_STRUC *pRxWI);\t\n\n\n#ifdef RTMP_MAC_USB\nINT TxDmaBusy(\n\tIN PRTMP_ADAPTER pAd);\n\nINT RxDmaBusy(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RtmpDmaEnable(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT Enable);\n\nINT ATESetUpFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT32 TxIdx);\n\nVOID RTUSBRejectPendingPackets(\n\tIN\tPRTMP_ADAPTER\tpAd);\n#endif /* RTMP_MAC_USB */\n\n\nNDIS_STATUS ChipStructAssign(\n IN\tPRTMP_ADAPTER pAd);\n\nNDIS_STATUS ATEInit(\n IN PRTMP_ADAPTER pAd);\n\n#ifdef RALINK_QA\nVOID ReadQATxTypeFromBBP(\n IN\tPRTMP_ADAPTER\tpAd);\n#endif /* RALINK_QA */\n\nNDIS_STATUS ATEBBPWriteWithRxChain(\n IN RTMP_ADAPTER *pAd,\n IN UCHAR bbpId,\n IN CHAR bbpVal,\n IN RX_CHAIN_IDX rx_ch_idx);\n\n\n\n\n\n\n#if defined(RT28xx) || defined(RT2880)\nVOID RT28xxATERxVGAInit(\n IN PRTMP_ADAPTER\t\tpAd);\n#endif /* defined(RT28xx) || defined(RT2880) */\n\n\nVOID  ATEPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID ATEAsicSetTxRxPath(\n    IN PRTMP_ADAPTER pAd);\n\nVOID RtmpRfIoWrite(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ATEAsicSwitchChannel(\n    IN PRTMP_ADAPTER pAd);\n\nVOID BbpSoftReset(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /* __RT_ATE_H__ */\n\n"
  },
  {
    "path": "src/ate/include/rt_qa.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n \n \tModule Name:\n\trt_qa.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n*/\n\n#ifndef __RT_QA_H__\n#define __RT_QA_H__\n\n#ifdef RALINK_QA\n#ifndef RALINK_ATE\n#error \"For supporting QA GUI, please set HAS_ATE=y and HAS_QA_SUPPORT=y.\"\n#endif /* RALINK_ATE */\n\n#include \"rt_ate.h\"\n\ntypedef struct ate_racfghdr {\n \tUINT32\t\tmagic_no;\n\tUSHORT\t\tcommand_type;\n\tUSHORT\t\tcommand_id;\n\tUSHORT\t\tlength;\n\tUSHORT\t\tsequence;\n\tUSHORT\t\tstatus;\n\tUCHAR\t\tdata[2046];\n}  __attribute__((packed))RACFGHDR, *pRACFGHDR;\n\n/* Stop Transmission */\n#define ATE_TXSTOP                  ((~(fATE_TX_ENABLE))&(~(fATE_TXCONT_ENABLE))&(~(fATE_TXCARR_ENABLE))&(~(fATE_TXCARRSUPP_ENABLE)))\n/* Stop Receiving Frames */\n#define ATE_RXSTOP\t\t\t\t\t(~(fATE_RX_ENABLE))\n\n/* NOTE : may be different with chipset in the future ++ */\n#define\tBBP22_TXFRAME     \t\t\t0x00\t/* Transmit Frames */\n#define\tBBP22_TXCONT_OR_CARRSUPP    0x80\t/* Continuous Transmit or Carrier Suppression */\n#define\tBBP22_TXCARR                0xc1\t/* Transmit Carrier */\n#define\tBBP24_TXCONT                0x00\t/* Continuous Transmit */\n#define\tBBP24_CARRSUPP              0x01\t/* Carrier Suppression */\n/* NOTE : may be different with chipset in the future -- */\n\n/* Eth QA RACFG Command */\n#define RACFG_MAGIC_NO\t\t\t0x18142880\n/* command id with Cmd Type == 0x0005(for iNIC)/0x0008(for others) */\n#define RACFG_CMD_RF_WRITE_ALL\t\t\t0x0000\n#define RACFG_CMD_E2PROM_READ16\t\t\t0x0001\n#define RACFG_CMD_E2PROM_WRITE16\t\t0x0002\n#define RACFG_CMD_E2PROM_READ_ALL\t\t0x0003\n#define RACFG_CMD_E2PROM_WRITE_ALL\t\t0x0004\n#define RACFG_CMD_IO_READ\t\t\t\t0x0005\n#define RACFG_CMD_IO_WRITE\t\t\t\t0x0006\n#define RACFG_CMD_IO_READ_BULK\t\t\t0x0007\n#define RACFG_CMD_BBP_READ8\t\t\t\t0x0008\n#define RACFG_CMD_BBP_WRITE8\t\t\t0x0009\n#define RACFG_CMD_BBP_READ_ALL\t\t\t0x000a\n#define RACFG_CMD_GET_COUNTER\t\t\t0x000b\n#define RACFG_CMD_CLEAR_COUNTER\t\t\t0x000c\n\n#define RACFG_CMD_RSV1\t\t\t\t\t0x000d\n#define RACFG_CMD_RSV2\t\t\t\t\t0x000e\n#define RACFG_CMD_RSV3\t\t\t\t\t0x000f\n\n#define RACFG_CMD_TX_START\t\t\t\t0x0010\n#define RACFG_CMD_GET_TX_STATUS\t\t\t0x0011\n#define RACFG_CMD_TX_STOP\t\t\t\t0x0012\n#define RACFG_CMD_RX_START\t\t\t\t0x0013\n#define RACFG_CMD_RX_STOP\t\t\t\t0x0014\n#define RACFG_CMD_GET_NOISE_LEVEL\t\t0x0015\n\n#define RACFG_CMD_ATE_START\t\t\t\t0x0080\n#define RACFG_CMD_ATE_STOP\t\t\t\t0x0081\n\n#define RACFG_CMD_ATE_START_TX_CARRIER\t\t0x0100\n#define RACFG_CMD_ATE_START_TX_CONT\t\t\t0x0101\n#define RACFG_CMD_ATE_START_TX_FRAME\t\t0x0102\n#define RACFG_CMD_ATE_SET_BW\t            0x0103\n#define RACFG_CMD_ATE_SET_TX_POWER0\t        0x0104\n#define RACFG_CMD_ATE_SET_TX_POWER1\t\t\t0x0105\n#define RACFG_CMD_ATE_SET_FREQ_OFFSET\t\t0x0106\n#define RACFG_CMD_ATE_GET_STATISTICS\t\t0x0107\n#define RACFG_CMD_ATE_RESET_COUNTER\t\t\t0x0108\n#define RACFG_CMD_ATE_SEL_TX_ANTENNA\t\t0x0109\n#define RACFG_CMD_ATE_SEL_RX_ANTENNA\t\t0x010a\n#define RACFG_CMD_ATE_SET_PREAMBLE\t\t\t0x010b\n#define RACFG_CMD_ATE_SET_CHANNEL\t\t\t0x010c\n#define RACFG_CMD_ATE_SET_ADDR1\t\t\t\t0x010d\n#define RACFG_CMD_ATE_SET_ADDR2\t\t\t\t0x010e\n#define RACFG_CMD_ATE_SET_ADDR3\t\t\t\t0x010f\n#define RACFG_CMD_ATE_SET_RATE\t\t\t\t0x0110\n#define RACFG_CMD_ATE_SET_TX_FRAME_LEN\t\t0x0111\n#define RACFG_CMD_ATE_SET_TX_FRAME_COUNT\t0x0112\n#define RACFG_CMD_ATE_START_RX_FRAME\t\t0x0113\n#define RACFG_CMD_ATE_E2PROM_READ_BULK\t\t0x0114\n#define RACFG_CMD_ATE_E2PROM_WRITE_BULK\t\t0x0115\n#define RACFG_CMD_ATE_IO_WRITE_BULK\t\t\t0x0116\n#define RACFG_CMD_ATE_BBP_READ_BULK\t\t\t0x0117\n#define RACFG_CMD_ATE_BBP_WRITE_BULK\t\t0x0118\n#define RACFG_CMD_ATE_RF_READ_BULK\t\t\t0x0119\n#define RACFG_CMD_ATE_RF_WRITE_BULK\t\t\t0x011a\n#define RACFG_CMD_ATE_SET_TX_POWER2\t\t\t0x011b\n#ifdef TXBF_SUPPORT\n#define RACFG_CMD_ATE_TXBF_DUT_INIT\t\t0x011c\n#define RACFG_CMD_ATE_TXBF_LNA_CAL\t\t0x011d\n#define RACFG_CMD_ATE_TXBF_DIV_CAL\t\t0x011e\n#define RACFG_CMD_ATE_TXBF_PHASE_CAL\t\t0x011f\n#define RACFG_CMD_ATE_TXBF_GOLDEN_INIT\t\t0x0120\n#define RACFG_CMD_ATE_TXBF_VERIFY\t\t0x0121\n#endif /* TXBF_SUPPORT */\n\n\n/* QA RACFG Command for ate test from localhost */\n#define RACFG_CMD_ATE_SHOW_PARAM 0xff00\n\n/* ATE export paramters to uppler layer */\ntypedef struct __ATE_EX_PARAM\n{\n\tunsigned char mode;\n\tchar TxPower0;\n\tchar TxPower1;\n#ifdef DOT11N_SS3_SUPPORT\n\tchar TxPower2;\n#endif /* DOT11N_SS3_SUPPORT */\n\tchar TxAntennaSel;\n\tchar RxAntennaSel;\n\tunsigned char DA[MAC_ADDR_LEN];\n\tunsigned char SA[MAC_ADDR_LEN];\n\tunsigned char BSSID[MAC_ADDR_LEN];\n\tunsigned char MCS;\n\tunsigned char PhyMode;\n\tBOOLEAN ShortGI;\n\tBOOLEAN BW;\n\tunsigned int Channel;\n\tunsigned int TxLength;\n\tunsigned int TxCount;\n\tunsigned int RFFreqOffset;\n\tunsigned int IPG;\n\tunsigned int RxTotalCnt;\n\tunsigned int RxCntPerSec;\n\tchar LastSNR0;\n\tchar LastSNR1;\n\tchar LastSNR2;\n\tchar LastRssi0;\n\tchar LastRssi1;\n\tchar LastRssi2;\n\tchar AvgRssi0;\n\tchar AvgRssi1;\n\tchar AvgRssi2;\n\tshort AvgRssi0X8;\n\tshort AvgRssi1X8;\n\tshort AvgRssi2X8;\n}ATE_EX_PARAM, *pATE_EX_PARAM;\n\nNDIS_STATUS TXSTOP(\n\tIN PRTMP_ADAPTER pAd);\n\nNDIS_STATUS RXSTOP(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /* RALINK_QA */\n\n#endif /* __RT_QA_H__ */\n"
  },
  {
    "path": "src/chips/mt7601.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tmt7601.c\n\n\tAbstract:\n\tSpecific funcitons and configurations for MT7601 (RT63xx)\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifdef MT7601\n\n#include\t\"rt_config.h\"\n\n#include \"mcu/MT7601_firmware.h\"\n\n//#define MT7601FPGA\n\n#ifdef RTMP_EFUSE_SUPPORT\n/* MT7601_USB_V0_C-20130107 */\nUCHAR MT7601_EFUSE_DEFAULT_BIN[] = {\n\t0x01, 0x76, 0x00, 0x0c, 0x00, 0x0c, 0x43, 0x26, 0x60, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0x01, 0x02, 0x8f, 0x14, 0x01, 0x76, 0x00, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x80, 0x50, 0x08, 0x00, \n\t0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x20, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0xff, 0xff, 0xff, 0xff, 0x11, 0xff, 0x04, 0x28, 0xff, 0xff, 0x2c, 0x01, 0xff, 0xff, 0x99, 0x99, \n\t0x8c, 0x88, 0xff, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n\t0x20, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, \n\t0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, \n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \n};\n#endif /* RTMP_EFUSE_SUPPORT */\n\nstatic RTMP_REG_PAIR\tMT7601_MACRegTable[] = {\n\t//{TSO_CTRL, \t\t\t\t0x16058},\t\t// must set when enable HDR_TRANS_SUPPORT\n\t{TSO_CTRL, \t\t\t\t0x06050},\t\t// must set when enable HDR_TRANS_SUPPORT\n\t{BCN_OFFSET0,\t\t\t0x18100800}, \n\t{BCN_OFFSET1,\t\t\t0x38302820}, \n\t{PBF_SYS_CTRL,\t\t\t0x80c00},\n\t{PBF_CFG,\t\t\t\t0x7F723c1f},\n\t{FCE_CTRL,\t\t\t\t0x1},\n\t{0xA38,\t\t\t\t\t0x0},\t\t\t// For bi-direction RX fifo overflow issue.\n\t{TX0_RF_GAIN_CORR,\t\t0x003B0005},\t\t// 20120806 Jason Huang\n\t{TX0_RF_GAIN_ATTEN,\t\t0x00006900},\t\t// 20120806 Jason Huang\n\t{TX0_BB_GAIN_ATTEN,\t\t0x00000400},\t\t// 20120806 Jason Huang\n\t{TX_ALC_VGA3,\t\t\t0x00060006},\t\t// 20120806 Jason Huang\n\t//{TX_SW_CFG0,\t\t\t0x400},\t\t\t// 20120822 Gary\n\t{TX_SW_CFG0,\t\t\t0x402},\t\t\t// 20121017 Jason Huang\n\t{TX_SW_CFG1,\t\t\t0x0},\t\t\t// 20120822 Gary\n\t{TX_SW_CFG2,\t\t\t0x0},\t\t\t// 20120822 Gary\n\n#ifdef HDR_TRANS_SUPPORT\n\t{HEADER_TRANS_CTRL_REG, 0x2},\n#else\n\t{HEADER_TRANS_CTRL_REG, 0x0},\t\n#endif /* HDR_TRANS_SUPPORT */\n\n#ifdef CONFIG_RX_CSO_SUPPORT\n\t{CHECKSUM_OFFLOAD,\t0x30f},\n\t{FCE_PARAM,\t\t\t0x00256f0f},\n#else\n\t{CHECKSUM_OFFLOAD,\t0x200},\n\t{FCE_PARAM,\t\t\t0x00254f0f},\n#endif /* CONFIG_RX_CSO_SUPPORT */\n};\nstatic UCHAR MT7601_NUM_MAC_REG_PARMS = (sizeof(MT7601_MACRegTable) / sizeof(RTMP_REG_PAIR));\n\n\n//1019 BBP CR\nstatic RTMP_REG_PAIR MT7601_BBP_InitRegTb[] = {\n\t/* TX/RX Controls */\n\t{BBP_R1, 0x04},\n\t{BBP_R4, 0x40},\n\t{BBP_R20, 0x06},\n\t{BBP_R31, 0x08},\n\t/* CCK Tx Control  */\n\t{BBP_R178, 0xFF},\n\t/* AGC/Sync controls */\n\t//{BBP_R65, 0x2C},\n\t{BBP_R66, 0x14},\n\t{BBP_R68, 0x8B},\n\t{BBP_R69, 0x12},\n\t{BBP_R70, 0x09},\n\t{BBP_R73, 0x11},\n\t{BBP_R75, 0x60},\n\t{BBP_R76, 0x44},\n\t{BBP_R84, 0x9A},\n\t{BBP_R86, 0x38},\n\t{BBP_R91, 0x07},\n\t{BBP_R92, 0x02},\t\n\t/* Rx Path Controls */\n\t{BBP_R99, 0x50},\t\n\t{BBP_R101, 0x00},\n\t{BBP_R103, 0xC0},\n\t{BBP_R104, 0x92},\n\t{BBP_R105, 0x3C},\n\t{BBP_R106, 0x03},\n\t{BBP_R128, 0x12},\n\t/* Change RXWI content: Gain Report */\n\t{BBP_R142, 0x04},\n\t{BBP_R143, 0x37},\n\t/* Change RXWI content: Antenna Report */\n\t{BBP_R142, 0x03},\n\t{BBP_R143, 0x99},\n\t/* Calibration Index Register */\n\t/* CCK Receiver Control */\n\t{BBP_R160, 0xEB},\n\t{BBP_R161, 0xC4},\n\t{BBP_R162, 0x77},\n\t{BBP_R163, 0xF9},\n\t{BBP_R164, 0x88},\n\t{BBP_R165, 0x80},\n\t{BBP_R166, 0xFF},\n\t{BBP_R167, 0xE4},\n\t/* Added AGC controls */\n\t/* These AGC/GLRT registers are accessed through R195 and R196. */\n\t/* 0x00 */\n\t{BBP_R195, 0x00},\n\t{BBP_R196, 0x00},\n\t/* 0x01 */\n\t{BBP_R195, 0x01},\n\t{BBP_R196, 0x04},\n\t/* 0x02 */\n\t{BBP_R195, 0x02},\n\t{BBP_R196, 0x20},\n\t/* 0x03 */\n\t{BBP_R195, 0x03},\n\t{BBP_R196, 0x0A},\n\t/* 0x06 */\n\t{BBP_R195, 0x06},\n\t{BBP_R196, 0x16},\n\t/* 0x07 */\n\t{BBP_R195, 0x07},\n\t{BBP_R196, 0x05},\n\t/* 0x08 */\n\t{BBP_R195, 0x08},\n\t{BBP_R196, 0x37},\n\t/* 0x0A */\n\t{BBP_R195, 0x0A},\n\t{BBP_R196, 0x15},\n\t/* 0x0B */\n\t{BBP_R195, 0x0B},\n\t{BBP_R196, 0x17},\n\t/* 0x0C */\n\t{BBP_R195, 0x0C},\n\t{BBP_R196, 0x06},\n\t/* 0x0D */\n\t{BBP_R195, 0x0D},\n\t{BBP_R196, 0x09},\n\t/* 0x0E */\n\t{BBP_R195, 0x0E},\n\t{BBP_R196, 0x05},\n\t/* 0x0F */\n\t{BBP_R195, 0x0F},\n\t{BBP_R196, 0x09},\n\t/* 0x10 */\n\t{BBP_R195, 0x10},\n\t{BBP_R196, 0x20},\n\t/* 0x20 */\n\t{BBP_R195, 0x20},\n\t{BBP_R196, 0x17},\n\t/* 0x21 */\n\t{BBP_R195, 0x21},\n\t{BBP_R196, 0x06},\n\t/* 0x22 */\n\t{BBP_R195, 0x22},\n\t{BBP_R196, 0x09},\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x17},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x06},\n\t/* 0x25 */\n\t{BBP_R195, 0x25},\n\t{BBP_R196, 0x09},\n\t/* 0x26 */\n\t{BBP_R195, 0x26},\n\t{BBP_R196, 0x17},\n\t/* 0x27 */\n\t{BBP_R195, 0x27},\n\t{BBP_R196, 0x06},\n\t/* 0x28 */\n\t{BBP_R195, 0x28},\n\t{BBP_R196, 0x09},\n\t/* 0x29 */\n\t{BBP_R195, 0x29},\n\t{BBP_R196, 0x05},\n\t/* 0x2A */\n\t{BBP_R195, 0x2A},\n\t{BBP_R196, 0x09},\n\t/* 0x80 */\n\t{BBP_R195, 0x80},\n\t{BBP_R196, 0x8B},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x12},\n\t/* 0x82 */\n\t{BBP_R195, 0x82},\n\t{BBP_R196, 0x09},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x17},\n\t/* 0x84 */\n\t{BBP_R195, 0x84},\n\t{BBP_R196, 0x11},\n\t/* 0x85 */\n\t{BBP_R195, 0x85},\n\t{BBP_R196, 0x00},\n\t/* 0x86 */\n\t{BBP_R195, 0x86},\n\t{BBP_R196, 0x00},\n\t/* 0x87 */\n\t{BBP_R195, 0x87},\n\t{BBP_R196, 0x18},\n\t/* 0x88 */\n\t{BBP_R195, 0x88},\n\t{BBP_R196, 0x60},\n\t/* 0x89 */\n\t{BBP_R195, 0x89},\n\t{BBP_R196, 0x44},\n\t/*     */\n\t{BBP_R195, 0x8A},\n\t{BBP_R196, 0x8B},\n\t{BBP_R195, 0x8B},\n\t{BBP_R196, 0x8B},\n\t{BBP_R195, 0x8C},\n\t{BBP_R196, 0x8B},\n\t{BBP_R195, 0x8D},\n\t{BBP_R196, 0x8B},\n\t/*     */\n\t{BBP_R195, 0x8E},\n\t{BBP_R196, 0x09},\n\t{BBP_R195, 0x8F},\n\t{BBP_R196, 0x09},\n\t{BBP_R195, 0x90},\n\t{BBP_R196, 0x09},\n\t{BBP_R195, 0x91},\n\t{BBP_R196, 0x09},\n\t/*     */\n\t{BBP_R195, 0x92},\n\t{BBP_R196, 0x11},\n\t{BBP_R195, 0x93},\n\t{BBP_R196, 0x11},\n\t{BBP_R195, 0x94},\n\t{BBP_R196, 0x11},\n\t{BBP_R195, 0x95},\n\t{BBP_R196, 0x11},\n\t// PPAD\n\t{BBP_R47, 0x80},\n\t{BBP_R60, 0x80},\n\t{BBP_R150, 0xD2},\n\t{BBP_R151, 0x32},\n\t{BBP_R152, 0x23},\n\t{BBP_R153, 0x41},\n\t{BBP_R154, 0x00},\n\t{BBP_R155, 0x4F},\n\t{BBP_R253, 0x7E},\n\t{BBP_R195, 0x30},\n\t{BBP_R196, 0x32},\n\t{BBP_R195, 0x31},\n\t{BBP_R196, 0x23},\n\t{BBP_R195, 0x32},\n\t{BBP_R196, 0x45},\n\t{BBP_R195, 0x35},\n\t{BBP_R196, 0x4A},\n\t{BBP_R195, 0x36},\n\t{BBP_R196, 0x5A},\n\t{BBP_R195, 0x37},\n\t{BBP_R196, 0x5A},\n};\nstatic UCHAR MT7601_BBP_InitRegTb_Size = (sizeof(MT7601_BBP_InitRegTb) / sizeof(RTMP_REG_PAIR));\n\nRTMP_REG_PAIR MT7601_BBP_BW20RegTb[] = {\n\t{BBP_R69, 0x12},\n\t{BBP_R91, 0x07},\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x17},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x06},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x12},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x17},\n};\nconst UCHAR MT7601_BBP_BW20RegTb_Size = (sizeof(MT7601_BBP_BW20RegTb) / sizeof(RTMP_REG_PAIR));\n\nRTMP_REG_PAIR MT7601_BBP_BW40RegTb[] = {\n\t{BBP_R69, 0x15},\n\t{BBP_R91, 0x04},\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x12},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x08},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x15},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x16},\n};\nconst UCHAR MT7601_BBP_BW40RegTb_Size = (sizeof(MT7601_BBP_BW40RegTb) / sizeof(RTMP_REG_PAIR));\n\nstatic RTMP_REG_PAIR MT7601_BBP_CommonRegTb[] = {\n\t{BBP_R75, 0x60},\n\t{BBP_R92, 0x02},\n\t{BBP_R178, 0xFF},\t\t// For CCK CH14 OBW\n\t/* 0x88 */\n\t{BBP_R195, 0x88},\n\t{BBP_R196, 0x60},\n\n};\nconst static UCHAR MT7601_BBP_CommonRegTb_Size = (sizeof(MT7601_BBP_CommonRegTb) / sizeof(RTMP_REG_PAIR));\n\n\nRTMP_REG_PAIR MT7601_BBP_HighTempBW20RegTb[] = {\n\t{BBP_R69, 0x12},\n\t{BBP_R91, 0x07},\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x17},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x06},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x12},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x17},\n};\nconst UCHAR MT7601_BBP_HighTempBW20RegTb_Size = (sizeof(MT7601_BBP_HighTempBW20RegTb) / sizeof(RTMP_REG_PAIR));\n\nRTMP_REG_PAIR MT7601_BBP_HighTempBW40RegTb[] = {\n\t{BBP_R69, 0x15},\n\t{BBP_R91, 0x04},\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x12},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x08},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x15},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x16},\n};\nconst UCHAR MT7601_BBP_HighTempBW40RegTb_Size = (sizeof(MT7601_BBP_HighTempBW40RegTb) / sizeof(RTMP_REG_PAIR));\n\nstatic RTMP_REG_PAIR MT7601_BBP_HighTempCommonRegTb[] = {\n\t{BBP_R75, 0x60},\n\t{BBP_R92, 0x02},\n\t{BBP_R178, 0xFF},\t\t// For CCK CH14 OBW\n\t/* 0x88 */\n\t{BBP_R195, 0x88},\n\t{BBP_R196, 0x60},\n};\nconst static UCHAR MT7601_BBP_HighTempCommonRegTb_Size = (sizeof(MT7601_BBP_HighTempCommonRegTb) / sizeof(RTMP_REG_PAIR));\n\nRTMP_REG_PAIR MT7601_BBP_LowTempBW20RegTb[] = {\n\t{BBP_R69, 0x12},\n\t{BBP_R75, 0x5E},\n\t{BBP_R91, 0x07},\n\t{BBP_R92, 0x02},\t\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x17},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x06},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x12},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x17},\n\t/* 0x88 */\n\t{BBP_R195, 0x88},\n\t{BBP_R196, 0x5E},\n};\nconst UCHAR MT7601_BBP_LowTempBW20RegTb_Size = (sizeof(MT7601_BBP_LowTempBW20RegTb) / sizeof(RTMP_REG_PAIR));\n\nRTMP_REG_PAIR MT7601_BBP_LowTempBW40RegTb[] = {\n\t{BBP_R69, 0x15},\n\t{BBP_R75, 0x5C},\n\t{BBP_R91, 0x04},\n\t{BBP_R92, 0x03},\t\n\t/* 0x23 */\n\t{BBP_R195, 0x23},\n\t{BBP_R196, 0x10},\n\t/* 0x24 */\n\t{BBP_R195, 0x24},\n\t{BBP_R196, 0x08},\n\t/* 0x81 */\n\t{BBP_R195, 0x81},\n\t{BBP_R196, 0x15},\n\t/* 0x83 */\n\t{BBP_R195, 0x83},\n\t{BBP_R196, 0x16},\n\t/* 0x88 */\n\t{BBP_R195, 0x88},\n\t{BBP_R196, 0x5B},\n};\nUCHAR MT7601_BBP_LowTempBW40RegTb_Size = (sizeof(MT7601_BBP_LowTempBW40RegTb) / sizeof(RTMP_REG_PAIR));\n\nstatic RTMP_REG_PAIR MT7601_BBP_LowTempCommonRegTb[] = {\n\t{BBP_R178, 0xFF},\t\t// For CCK CH14 OBW\n};\nconst static UCHAR MT7601_BBP_LowTempCommonRegTb_Size = (sizeof(MT7601_BBP_LowTempCommonRegTb) / sizeof(RTMP_REG_PAIR));\n\n// 20121122 RF CR\n/* Bank\tRegister Value(Hex) */\nstatic BANK_RF_REG_PAIR MT7601_RF_Central_RegTb[] = {\n/*\n\tBank 0 - For central blocks: BG, PLL, XTAL, LO, ADC/DAC\n*/\n\t{RF_BANK0,\tRF_R00, 0x02},\n\t{RF_BANK0,\tRF_R01, 0x01},\n\t{RF_BANK0,\tRF_R02, 0x11},\n\t{RF_BANK0,\tRF_R03, 0xFF},\n\t{RF_BANK0,\tRF_R04, 0x0A},\n\t{RF_BANK0,\tRF_R05, 0x20},\n\t{RF_BANK0,\tRF_R06, 0x00},\n\n\t/*\n\t\tBG\n\t*/\n\t{RF_BANK0,\tRF_R07, 0x00},\n\t{RF_BANK0,\tRF_R08, 0x00}, \n\t{RF_BANK0,\tRF_R09, 0x00},\n\t{RF_BANK0,\tRF_R10, 0x00},\n\t{RF_BANK0,\tRF_R11, 0x21},\n\n\t/*\n\t\tXO\n\t*/\n\t//{RF_BANK0,\tRF_R12, 0x00},\t\t// By EEPROM\n\t{RF_BANK0,\tRF_R13, 0x00},\t\t// 40MHZ xtal\n\t//{RF_BANK0,\tRF_R13, 0x13},\t\t// 20MHZ xtal\n\t{RF_BANK0,\tRF_R14, 0x7C},\n\t{RF_BANK0,\tRF_R15, 0x22},\n\t{RF_BANK0,\tRF_R16, 0x80},\n\n\n\t/*\n\t\tPLL\n\t*/\n\t{RF_BANK0,\tRF_R17, 0x99},\n\t{RF_BANK0,\tRF_R18, 0x99},\n\t{RF_BANK0,\tRF_R19, 0x09},\n\t{RF_BANK0,\tRF_R20, 0x50},\n\t{RF_BANK0,\tRF_R21, 0xB0},\n\t{RF_BANK0,\tRF_R22, 0x00},\n\t{RF_BANK0,\tRF_R23, 0xC5},\n\t{RF_BANK0,\tRF_R24, 0xFC},\n\t{RF_BANK0,\tRF_R25, 0x40},\n\t{RF_BANK0,\tRF_R26, 0x4D},\n\t{RF_BANK0,\tRF_R27, 0x02},\n\t{RF_BANK0,\tRF_R28, 0x72},\n\t{RF_BANK0,\tRF_R29, 0x01},\n\t{RF_BANK0,\tRF_R30, 0x00},\n\t{RF_BANK0,\tRF_R31, 0x00},\n\n\t/*\n\t\tTest Ports\n\t*/\n\t{RF_BANK0,\tRF_R32, 0x00},\n\t{RF_BANK0,\tRF_R33, 0x00},\n\t{RF_BANK0,\tRF_R34, 0x23},\n\t{RF_BANK0,\tRF_R35, 0x01}, /* Change setting to reduce spurs */\n\t{RF_BANK0,\tRF_R36, 0x00},\n\t{RF_BANK0,\tRF_R37, 0x00},\t\n\n\t/*\n\t\tADC/DAC\n\t*/\n\t{RF_BANK0,\tRF_R38, 0x00},\n\t{RF_BANK0,\tRF_R39, 0x20},\n\t{RF_BANK0,\tRF_R40, 0x00},\n\t{RF_BANK0,\tRF_R41, 0xD0},\n\t{RF_BANK0,\tRF_R42, 0x1B},\n\t{RF_BANK0,\tRF_R43, 0x02},\n\t{RF_BANK0,\tRF_R44, 0x00},\n};\nstatic UINT32 MT7601_RF_Central_RegTb_Size = (sizeof(MT7601_RF_Central_RegTb) / sizeof(BANK_RF_REG_PAIR));\n\nstatic BANK_RF_REG_PAIR MT7601_RF_Channel_RegTb[] = {\n\t{RF_BANK4,\tRF_R00, 0x01},\n\t{RF_BANK4,\tRF_R01, 0x00},\n\t{RF_BANK4,\tRF_R02, 0x00},\n\t{RF_BANK4,\tRF_R03, 0x00},\n\n\t/*\n\t\tLDO\n\t*/\n\t{RF_BANK4,\tRF_R04, 0x00},\n\t{RF_BANK4,\tRF_R05, 0x08},\n\t{RF_BANK4,\tRF_R06, 0x00},\n\n\t/*\n\t\tRX\n\t*/\n\t{RF_BANK4,\tRF_R07, 0x5B},\n\t{RF_BANK4,\tRF_R08, 0x52},\n\t{RF_BANK4,\tRF_R09, 0xB6},\n\t{RF_BANK4,\tRF_R10, 0x57},\n\t{RF_BANK4,\tRF_R11, 0x33},\n\t{RF_BANK4,\tRF_R12, 0x22},\n\t{RF_BANK4,\tRF_R13, 0x3D},\n\t{RF_BANK4,\tRF_R14, 0x3E},\n\t{RF_BANK4,\tRF_R15, 0x13},\n\t{RF_BANK4,\tRF_R16, 0x22},\n\t{RF_BANK4,\tRF_R17, 0x23},\n\t{RF_BANK4,\tRF_R18, 0x02},\n\t{RF_BANK4,\tRF_R19, 0xA4},\n\t{RF_BANK4,\tRF_R20, 0x01},\n\t{RF_BANK4,\tRF_R21, 0x12},\n\t{RF_BANK4,\tRF_R22, 0x80},\n\t{RF_BANK4,\tRF_R23, 0xB3},\n\t{RF_BANK4,\tRF_R24, 0x00}, /* Reserved */\n\t{RF_BANK4,\tRF_R25, 0x00}, /* Reserved */\n\t{RF_BANK4,\tRF_R26, 0x00}, /* Reserved */\n\t{RF_BANK4,\tRF_R27, 0x00}, /* Reserved */\n\n\t/*\n\t\tLOGEN\n\t*/\n\t{RF_BANK4,\tRF_R28, 0x18},\n\t{RF_BANK4,\tRF_R29, 0xEE},\n\t{RF_BANK4,\tRF_R30, 0x6B},\n\t{RF_BANK4,\tRF_R31, 0x31},\n\t{RF_BANK4,\tRF_R32, 0x5D},\n\t{RF_BANK4,\tRF_R33, 0x00}, /* Reserved */\n\n\t/*\n\t\tTX\n\t*/\n\t{RF_BANK4,\tRF_R34, 0x96},\n\t{RF_BANK4,\tRF_R35, 0x55},\n\t{RF_BANK4,\tRF_R36, 0x08},\n\t{RF_BANK4,\tRF_R37, 0xBB},\n\t{RF_BANK4,\tRF_R38, 0xB3},\n\t{RF_BANK4,\tRF_R39, 0xB3},\n\t{RF_BANK4,\tRF_R40, 0x03},\n\t{RF_BANK4,\tRF_R41, 0x00}, /* Reserved */\n\t{RF_BANK4,\tRF_R42, 0x00}, /* Reserved */\n\t{RF_BANK4,\tRF_R43, 0xC5},\n\t{RF_BANK4,\tRF_R44, 0xC5},\n\t{RF_BANK4,\tRF_R45, 0xC5},\n\t{RF_BANK4,\tRF_R46, 0x07},\n\t{RF_BANK4,\tRF_R47, 0xA8},\n\t{RF_BANK4,\tRF_R48, 0xEF},\n\t{RF_BANK4,\tRF_R49, 0x1A},\n\n\t/*\n\t\tPA\n\t*/\n\t{RF_BANK4,\tRF_R54, 0x07},\n\t{RF_BANK4,\tRF_R55, 0xA7},\n\t{RF_BANK4,\tRF_R56, 0xCC},\n\t{RF_BANK4,\tRF_R57, 0x14},\n\t{RF_BANK4,\tRF_R58, 0x07},\n\t{RF_BANK4,\tRF_R59, 0xA8},\n\t{RF_BANK4,\tRF_R60, 0xD7},\n\t{RF_BANK4,\tRF_R61, 0x10},\n\t{RF_BANK4,\tRF_R62, 0x1C},\n\t{RF_BANK4,\tRF_R63, 0x00}, /* Reserved */\n};\nstatic UINT32 MT7601_RF_Channel_RegTb_Size = (sizeof(MT7601_RF_Channel_RegTb) / sizeof(BANK_RF_REG_PAIR));\n\nstatic BANK_RF_REG_PAIR MT7601_RF_VGA_RegTb[] = {\n\t{RF_BANK5,\tRF_R00, 0x47},\n\t{RF_BANK5,\tRF_R01, 0x00},\n\t{RF_BANK5,\tRF_R02, 0x00},\n\t{RF_BANK5,\tRF_R03, 0x08},\n\t{RF_BANK5,\tRF_R04, 0x04},\n\t{RF_BANK5,\tRF_R05, 0x20},\n\t{RF_BANK5,\tRF_R06, 0x3A},\n\t{RF_BANK5,\tRF_R07, 0x3A},\n\t{RF_BANK5,\tRF_R08, 0x00},\n\t{RF_BANK5,\tRF_R09, 0x00},\n\t{RF_BANK5,\tRF_R10, 0x10},\n\t{RF_BANK5,\tRF_R11, 0x10},\n\t{RF_BANK5,\tRF_R12, 0x10},\n\t{RF_BANK5,\tRF_R13, 0x10},\n\t{RF_BANK5,\tRF_R14, 0x10},\n\t{RF_BANK5,\tRF_R15, 0x20},\n\t{RF_BANK5,\tRF_R16, 0x22},\n\t{RF_BANK5,\tRF_R17, 0x7C},\n\t{RF_BANK5,\tRF_R18, 0x00},\n\t{RF_BANK5,\tRF_R19, 0x00},\n\t{RF_BANK5,\tRF_R20, 0x00},\n\t{RF_BANK5,\tRF_R21, 0xF1},\n\t{RF_BANK5,\tRF_R22, 0x11},\n\t{RF_BANK5,\tRF_R23, 0x02},\n\t{RF_BANK5,\tRF_R24, 0x41},\n\t{RF_BANK5,\tRF_R25, 0x20},\n\t{RF_BANK5,\tRF_R26, 0x00},\n\t{RF_BANK5,\tRF_R27, 0xD7},\n\t{RF_BANK5,\tRF_R28, 0xA2},\n\t{RF_BANK5,\tRF_R29, 0x20},\n\t{RF_BANK5,\tRF_R30, 0x49},\n\t{RF_BANK5,\tRF_R31, 0x20},\n\t{RF_BANK5,\tRF_R32, 0x04},\n\t{RF_BANK5,\tRF_R33, 0xF1},\n\t{RF_BANK5,\tRF_R34, 0xA1},\n\t{RF_BANK5,\tRF_R35, 0x01},\n\t{RF_BANK5,\tRF_R41, 0x00},\n\t{RF_BANK5,\tRF_R42, 0x00},\n\t{RF_BANK5,\tRF_R43, 0x00},\n\t{RF_BANK5,\tRF_R44, 0x00},\n\t{RF_BANK5,\tRF_R45, 0x00},\n\t{RF_BANK5,\tRF_R46, 0x00},\n\t{RF_BANK5,\tRF_R47, 0x00},\n\t{RF_BANK5,\tRF_R48, 0x00},\n\t{RF_BANK5,\tRF_R49, 0x00},\n\t{RF_BANK5,\tRF_R50, 0x00},\n\t{RF_BANK5,\tRF_R51, 0x00},\n\t{RF_BANK5,\tRF_R52, 0x00},\n\t{RF_BANK5,\tRF_R53, 0x00},\n\t{RF_BANK5,\tRF_R54, 0x00},\n\t{RF_BANK5,\tRF_R55, 0x00},\n\t{RF_BANK5,\tRF_R56, 0x00},\n\t{RF_BANK5,\tRF_R57, 0x00},\n\t{RF_BANK5,\tRF_R58, 0x31},\n\t{RF_BANK5,\tRF_R59, 0x31},\n\t{RF_BANK5,\tRF_R60, 0x0A},\n\t{RF_BANK5,\tRF_R61, 0x02},\n\t{RF_BANK5,\tRF_R62, 0x00},\n\t{RF_BANK5,\tRF_R63, 0x00},\n};\nstatic UINT32 MT7601_RF_VGA_RegTb_Size = (sizeof(MT7601_RF_VGA_RegTb) / sizeof(BANK_RF_REG_PAIR));\n\nconst MT7601_FREQ_ITEM MT7601_Frequency_Plan[] =\n{\n\t/* CH,\tK_R17,\tK_R18,\tK_R19,\tN_R20 */\n\t{ 1,\t\t0x99,\t0x99,\t0x09,\t0x50},\n\t{ 2,\t\t0x46,\t0x44,\t0x0A,\t0x50},\n\t{ 3,\t\t0xEC,\t0xEE,\t0x0A,\t0x50},\n\t{ 4,\t\t0x99,\t0x99,\t0x0B,\t0x50},\n\t{ 5,\t\t0x46,\t0x44,\t0x08,\t0x51},\n\t{ 6,\t\t0xEC,\t0xEE,\t0x08,\t0x51},\n\t{ 7,\t\t0x99,\t0x99,\t0x09,\t0x51},\n\t{ 8,\t\t0x46,\t0x44,\t0x0A,\t0x51},\n\t{ 9,\t\t0xEC,\t0xEE,\t0x0A,\t0x51},\n\t{ 10,\t0x99,\t0x99,\t0x0B,\t0x51},\n\t{ 11,\t0x46,\t0x44,\t0x08,\t0x52},\n\t{ 12,\t0xEC,\t0xEE,\t0x08,\t0x52},\n\t{ 13,\t0x99,\t0x99,\t0x09,\t0x52},\n\t{ 14,\t0x33,\t0x33,\t0x0B,\t0x52},\n};\nUINT32 NUM_OF_MT7601_CHNL = (sizeof(MT7601_Frequency_Plan) / sizeof(MT7601_FREQ_ITEM));\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tEnable Wlan function. this action will enable wlan clock so that chip can accept command. So MUST put in the \n\t\tvery beginning of Initialization. And put in the very LAST in the Halt function.\n\n\tArguments:\n\t\tpAd\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL <= DISPATCH_LEVEL\n\t\n\tNote:\n\t\tBefore Enable RX, make sure you have enabled Interrupt.\n\t========================================================================\n*/\nVOID MT7601_WLAN_ChipOnOff(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bOn,\n\tIN BOOLEAN bResetWLAN)\n{\n\tWLAN_FUN_CTRL_STRUC WlanFunCtrl = {.word=0};\n\tint RET;\n\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->hw_atomic, RET);\n\t\tif (RET != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", RET));\n\t\t\treturn;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\tDBGPRINT(RT_DEBUG_INFO, (\"==>%s(): OnOff:%d, pAd->WlanFunCtrl:0x%x, Reg-WlanFunCtrl=0x%x\\n\",\n\t\t\t\t__FUNCTION__, bOn, pAd->WlanFunCtrl.word, WlanFunCtrl.word));\n\n\tif (bResetWLAN == TRUE)\n\t{\n\t\tWlanFunCtrl.field.GPIO0_OUT_OE_N = 0xFF;\n\t\tWlanFunCtrl.field.FRC_WL_ANT_SET = 0;\n\n\t\tif (pAd->WlanFunCtrl.field.WLAN_EN)\n\t\t{\n\t\t\t/*\n\t\t\t\tRestore all HW default value and reset RF.\n\t\t\t*/\t\t\t\t\t\n\t\t\tWlanFunCtrl.field.WLAN_RESET = 1;\n\t\t\tWlanFunCtrl.field.WLAN_RESET_RF = 1;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Reset(1) WlanFunCtrl.word = 0x%x\\n\", WlanFunCtrl.word));\n\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\t\n\t\t\tRTMPusecDelay(20);\n\t\t\tWlanFunCtrl.field.WLAN_RESET = 0;\n\t\t\tWlanFunCtrl.field.WLAN_RESET_RF = 0;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Reset(2) WlanFunCtrl.word = 0x%x\\n\", WlanFunCtrl.word));\n\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\tRTMPusecDelay(20);\n\t\t}\n\t}\n\n\tif (bOn == TRUE)\n\t{\n\t\t/*\n\t\t\tEnable WLAN function and clock\n\t\t\tWLAN_FUN_CTRL[1:0] = 0x3\n\t\t*/\n\t\tENABLE_WLAN_FUN(WlanFunCtrl);\n\t}\n\telse\n\t{\n\t\t/*\n\t\t\tDiable WLAN function and clock\n\t\t\tWLAN_FUN_CTRL[1:0] = 0x0\n\t\t*/\n\t\tDISABLE_WLAN_FUN(WlanFunCtrl);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WlanFunCtrl.word = 0x%x\\n\", WlanFunCtrl.word));\n\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\t\n\tRTMPusecDelay(20);\n\n\tif (bOn)\n\t{\n\tRTMP_IO_READ32(pAd, MAC_CSR0, &pAd->MACVersion);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MACVersion = 0x%08x\\n\", pAd->MACVersion));\n\t}\n\t\t\n\tif (bOn == TRUE)\n\t{\n\t\tUINT index = 0;\t\t\n\t\tCMB_CTRL_STRUC CmbCtrl;\n\t\t\n\t\tCmbCtrl.word = 0;\n\t\t\t\t\n\t\tdo\n\t\t{\n\t\t\tdo \n\t\t\t{\n\t\t\t\tRTMP_IO_READ32(pAd, CMB_CTRL, &CmbCtrl.word);\n\n\t\t\t\t/*\n\t\t\t\t\tCheck status of PLL_LD & XTAL_RDY.\n\t\t\t\t\tHW issue: Must check PLL_LD&XTAL_RDY when setting EEP to disable PLL power down\n\t\t\t\t*/\n\t\t\t\tif ((CmbCtrl.field.PLL_LD == 1) && (CmbCtrl.field.XTAL_RDY == 1))\n\t\t\t\t\tbreak;\n\n\t\t\t\tRTMPusecDelay(20);\n\t\t\t} while (index++ < MAX_CHECK_COUNT);\n\n\t\t\tif (index >= MAX_CHECK_COUNT)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, \n\t\t\t\t\t\t(\"Lenny:[boundary]Check PLL_LD ..CMB_CTRL 0x%08x, index=%d!\\n\",\n\t\t\t\t\t\tCmbCtrl.word, index));\n\t\t\t\t/*\n\t\t\t\t\tDisable WLAN then enable WLAN again\n\t\t\t\t*/\n\t\t\t\tDISABLE_WLAN_FUN(WlanFunCtrl);\n\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\t\tRTMPusecDelay(20);\n\n\t\t\t\tENABLE_WLAN_FUN(WlanFunCtrl);\n\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\t\tRTMPusecDelay(20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\t\n\t\twhile (TRUE);\n\t}\n\n\tpAd->WlanFunCtrl.word = WlanFunCtrl.word;\n\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\tDBGPRINT(RT_DEBUG_INFO,\n\t\t(\"<== %s():  pAd->WlanFunCtrl.word = 0x%x, Reg->WlanFunCtrl=0x%x!\\n\",\n\t\t__FUNCTION__, pAd->WlanFunCtrl.word, WlanFunCtrl.word));\n\n\t\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->hw_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n}\n\n\nVOID MT7601_RXDC_CAL(RTMP_ADAPTER *pAd)\n{\n#define MAX_RXDCOC_RETRY_CNT\t20\n\tUINT count;\n\tUCHAR RValue;\n\tUINT32 Mac_R1004;\n\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Mac_R1004);\n\t\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x08);\n\n//1012 BBP CR\n\tAndesBBPRandomWrite(pAd, 4,\n\tBBP_R158, 0x8D,\n\tBBP_R159, 0xFC,\n\tBBP_R158, 0x8C,\n\tBBP_R159, 0x4C);\n\n\tfor ( count = 0; count < MAX_RXDCOC_RETRY_CNT; count++ )\n\t{\n\t\tRTMPusecDelay(300);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R158, 0x8C);\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R159, &RValue);\n\n\t\tif ( RValue == 0x0c )\n\t\t\tbreak;\n\t}\n\n\tif (count == MAX_RXDCOC_RETRY_CNT )\n\t\tDBGPRINT_ERR((\"MT7601_RXDC_CAL Fail!\\n\")); \n\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);\n\n\t//0725 BBP CR change DCOC sequence.\n\tAndesBBPRandomWrite(pAd, 2,\n\tBBP_R158, 0x8D,\n\tBBP_R159, 0xE0);\n\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Mac_R1004);\n}\n\n\nVOID MT7601_INIT_CAL(RTMP_ADAPTER *pAd)\n{\n\tUCHAR RfValue;\n\tUINT32 Mac_R1004;\n\tUCHAR Temperature;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==>%s\\n\", __FUNCTION__));\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\tMT7601_Bootup_Read_Temperature(pAd, &pAd->chipCap.CurrentTemperBbpR49);\n\tpAd->chipCap.CurrentTemperature = (pAd->chipCap.CurrentTemperBbpR49 - pAd->chipCap.TemperatureRef25C) * MT7601_E2_TEMPERATURE_SLOPE;\n#ifdef DPD_CALIBRATION_SUPPORT\n\tpAd->chipCap.TemperatureDPD = pAd->chipCap.CurrentTemperature;\n#endif /* DPD_CALIBRATION_SUPPORT */\n\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Mac_R1004);\n\n\t// R Calibration\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_R, 0);\n\n\t// VCO Cal\n\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RfValue);\n\tRfValue = RfValue | 0x80; \n\trlt_rf_write(pAd, RF_BANK0, RF_R04, RfValue);\n\tRTMPusecDelay(2000);\n\n\t/* TXDC */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_TXDCOC, 0);\n\n\t// MT7601_RXDC_CAL\n\tMT7601_RXDC_CAL(pAd);\n\n\t/* Tx Filter BW */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x00001);\n\n\t/* Rx Filter BW */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x00000);\n\n\t/* TXLOFT */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_LOFT, 0);\n\n\t/* TXIQ */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_TXIQ, 0);\n\n\t/* RXIQ */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_RXIQ, 0);\n\n#ifdef DPD_CALIBRATION_SUPPORT\n\t/* DPD-Calibration */\n\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_DPD, pAd->chipCap.CurrentTemperature);\n#endif /* DPD_CALIBRATION_SUPPORT */\n\n\t// MT7601_RXDC_CAL\n\tMT7601_RXDC_CAL(pAd);\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\tMT7601_TssiDcGainCalibration(pAd);\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Mac_R1004);\n\n\tMT7601AsicTemperatureCompensation(pAd, TRUE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==%s\\n\", __FUNCTION__));\n\n}\n\n\nVOID dump_bw_info(RTMP_ADAPTER *pAd)\n{\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize FCE.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID InitFce(\n\tPRTMP_ADAPTER pAd)\n{\n\tL2_STUFFING_STRUC L2Stuffing = { {0} };\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: -->\\n\", __FUNCTION__));\n\n\tRTMP_IO_READ32(pAd, FCE_L2_STUFF, &L2Stuffing.word);\n\tL2Stuffing.field.FS_WR_MPDU_LEN_EN = 0;\n\tRTMP_IO_WRITE32(pAd, FCE_L2_STUFF, L2Stuffing.word);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: <--\\n\", __FUNCTION__));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize specific RF registers.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID NICInitMT7601RFRegisters(RTMP_ADAPTER *pAd)\n{\n\n\tUINT32 IdReg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\\n\", __FUNCTION__));\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\trlt_rf_write(pAd, RF_BANK0, RF_R12, pAd->RfFreqOffset);\n\n\tAndesRFRandomWritePair(pAd, MT7601_RF_Central_RegTb, MT7601_RF_Central_RegTb_Size);\n\n\tAndesRFRandomWritePair(pAd, MT7601_RF_Channel_RegTb, MT7601_RF_Channel_RegTb_Size);\n\n\tAndesRFRandomWritePair(pAd, MT7601_RF_VGA_RegTb, MT7601_RF_VGA_RegTb_Size);\n\n\tMT7601_INIT_CAL(pAd);\n\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize specific MAC registers.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID NICInitMT7601MacRegisters(RTMP_ADAPTER *pAd)\n{\n\tUINT32 IdReg;\n\tUINT32 MacReg = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\\n\", __FUNCTION__));\n\n\t/*\n\t\tEnable PBF and MAC clock\n\t\tSYS_CTRL[11:10] = 0x3\n\t*/\t\n\tAndesRandomWritePair(pAd, MT7601_MACRegTable, MT7601_NUM_MAC_REG_PARMS);\n\t\n\t/*\n\t\tRelease BBP and MAC reset\n\t\tMAC_SYS_CTRL[1:0] = 0x0\n\t*/\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacReg);\n\tMacReg &= ~(0x3);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacReg);\n\n\t//InitFce(pAd);\n\t\n\tRTMP_IO_WRITE32(pAd, AUX_CLK_CFG, 0);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize specific BBP registers.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID NICInitMT7601BbpRegisters(\n\tIN\tPRTMP_ADAPTER pAd)\n{\n\tINT IdReg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\\n\", __FUNCTION__));\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\tAndesBBPRandomWritePair(pAd, MT7601_BBP_InitRegTb, MT7601_BBP_InitRegTb_Size);\n\n\treturn;\n}\n\n\nstatic VOID MT7601_AsicAntennaDefaultReset(\n\tIN struct _RTMP_ADAPTER\t*pAd,\n\tIN EEPROM_ANTENNA_STRUC *pAntenna)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\\n\", __FUNCTION__));\n\tpAntenna->word = 0;\n\tpAntenna->field.RfIcType = 0xf;\n\tpAntenna->field.TxPath = 1;\n\tpAntenna->field.RxPath = 1;\n}\n\n\nstatic VOID MT7601_ChipBBPAdjust(RTMP_ADAPTER *pAd)\n{\n\tstatic char *ext_str[]={\"extNone\", \"extAbove\", \"\", \"extBelow\"};\n\tUCHAR rf_bw, ext_ch;\n\n#ifdef DOT11_N_SUPPORT\n\tif (get_ht_cent_ch(pAd, &rf_bw, &ext_ch) == FALSE)\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t}\n\n\trtmp_bbp_set_bw(pAd, rf_bw);\n\n\t/* TX/Rx : control channel setting */\n\trtmp_mac_set_ctrlch(pAd, ext_ch);\n\trtmp_bbp_set_ctrlch(pAd, ext_ch);\n\n#ifdef DOT11_N_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() : %s, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \\n\",\n\t\t\t\t\t__FUNCTION__, ext_str[ext_ch],\n\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth,\n\t\t\t\t\tpAd->CommonCfg.Channel,\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA,\n\t\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset));\n#endif /* DOT11_N_SUPPORT */\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tdynamic tune BBP R66 to find a balance between sensibility and \n\t\tnoise isolation\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nUCHAR MT7601_ChipAGCAdjust(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN CHAR\t\t\t\t\tRssi,\n\tIN UCHAR\t\t\t\tOrigR66Value)\n{\n\tUCHAR R66=0x14; /* R66UpperBound = 0x30, R66LowerBound = 0x30; */\n\tCHAR lan_gain = GET_LNA_GAIN(pAd);\n\t\n\tif (pAd->LatchRfRegs.Channel <= 14) /* BG band */\n\t{\t\n\n\t\tR66 += 2 * (lan_gain - 8 );\n\n\t\tif ( Rssi > -60 )\n\t\t\tR66 += 0x20;\n\t\telse if ( Rssi > -70 )\n\t\t\tR66 += 0x10;\n\t\t\n\t\tif (OrigR66Value != R66)\n\t\t{\n\t\t\trtmp_bbp_set_agc(pAd, R66, RX_CHAIN_ALL);\n\t\t}\n\t}\n\t\n\treturn R66;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nVOID MT7601_ChipAGCInit(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN UCHAR\t\t\t\tBandWidth)\n{\n\tUCHAR R66 = 0x14;\n\tCHAR lan_gain = GET_LNA_GAIN(pAd);\n\t\n\tif (pAd->LatchRfRegs.Channel <= 14) /* BG band */\n\t{\t\n\t\t/* Gary was verified Amazon AP and find that RT307x has BBP_R66 invalid default value */\n\n\t\tR66 += 2 * (lan_gain - 8 ) + 0x20;\n\t\t\n\t\trtmp_bbp_set_agc(pAd, R66, RX_CHAIN_ALL);\n\t\t\n\t}\n\n}\n\n\nstatic VOID MT7601_ChipSwitchChannel(\n\tstruct _RTMP_ADAPTER *pAd,\n\tUCHAR Channel,\n\tBOOLEAN\t bScan)\n{\n\n\tCHAR TxPwer = 0;\n\tUCHAR\tindex;\n\tUCHAR RFValue = 0;\n\tUINT32 Value = 0;\n\tINT IdReg;\n\tUINT32 ret;\n#ifdef SINGLE_SKU_V2\n\tCHAR SkuBasePwr;\n\tCHAR ChannelPwrAdj;\n#endif /* SINGLE_SKU_V2 */\n\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: SwitchChannel#%d(RF=%d, %dT)\\n\",\n\t\t\t\t__FUNCTION__, Channel, pAd->RfIcType, pAd->Antenna.field.TxPath));\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\tif (Channel > 14)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AsicSwitchChannel: Can't find the Channel#%d \\n\", Channel));\n\t\treturn;\n\t}\n\n#ifdef SINGLE_SKU_V2\n\tSkuBasePwr = GetSkuChannelBasePwr(pAd, Channel);\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\tif (pAd->TxPowerCtrl.bInternalTxALC != TRUE)\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t{\n\t\tUINT32 value;\n\t\tif ( pAd->DefaultTargetPwr > SkuBasePwr )\n\t\t\tChannelPwrAdj = SkuBasePwr - pAd->DefaultTargetPwr;\n\t\telse\n\t\t\tChannelPwrAdj = 0;\n\n\t\tif ( ChannelPwrAdj > 31 )\n\t\t\tChannelPwrAdj = 31;\n\t\tif ( ChannelPwrAdj < -32 )\n\t\t\tChannelPwrAdj = -32;\n\n\t\tRTMP_IO_READ32(pAd, TX_ALC_CFG_1, &value);\n\t\tvalue = (value & ~0x3F) | (ChannelPwrAdj & 0x3F);\n\t\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_1, value);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SkuBasePwr = 0x%x,  DefaultTargetPwr = 0x%x, ChannelPwrAdj 0x13b4: 0x%x\\n\", SkuBasePwr, pAd->DefaultTargetPwr, value));\n\t}\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\tif (pAd->TxPowerCtrl.bInternalTxALC)\n\t{\n\t\tTxPwer = SkuBasePwr;\n\t\tpAd->TxPower[Channel - 1].Power = TxPwer;\n\t}\n\telse\n#endif /* RTMP_INTERNAL_TX_ALC */\n#endif /* SINGLE_SKU_V2 */\n\tTxPwer = pAd->TxPower[Channel - 1].Power;\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->hw_atomic, ret);\n\t\tif (ret != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\t\treturn;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tfor (index = 0; index < NUM_OF_MT7601_CHNL; index++)\n\t{\n\t\tif (Channel == MT7601_Frequency_Plan[index].Channel)\n\t\t{\t\t\n\t\t\t/* Frequeny plan setting */\n\t\t\tAndesRFRandomWrite(pAd, 4,\n\t\t\t\tRF_BANK0, RF_R17, MT7601_Frequency_Plan[index].K_R17,\n\t\t\t\tRF_BANK0, RF_R18, MT7601_Frequency_Plan[index].K_R18,\n\t\t\t\tRF_BANK0, RF_R19, MT7601_Frequency_Plan[index].K_R19,\n\t\t\t\tRF_BANK0, RF_R20, MT7601_Frequency_Plan[index].N_R20);\n\t\t}\n\t}\n\n\tRTMP_IO_READ32(pAd, TX_ALC_CFG_0, &Value);\n\tValue = Value & (~0x3F3F);\n\tValue |= (TxPwer & 0x3F);\n\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_0, Value);\n\n\tpAd->LatchRfRegs.Channel = Channel; /* Channel latch */\n\n\t/* BBP setting */\n\tif (Channel <= 14)\n\t{\n\t\tAndesBBPRandomWrite(pAd, 3,\n\t\t\tBBP_R62, (0x37 - GET_LNA_GAIN(pAd)),\n\t\t\tBBP_R63, (0x37 - GET_LNA_GAIN(pAd)),\n\t\t\tBBP_R64, (0x37 - GET_LNA_GAIN(pAd)));\n\t\t//RtmpUpdateFilterCoefficientControl(pAd, Channel);\n\t}\n\n\t/* \n\t\tvcocal_en (initiate VCO calibration (reset after completion)) - It should be at the end of RF configuration. \n\t*/\n\trlt_rf_write(pAd, RF_BANK0, RF_R04, 0x0A);\n\trlt_rf_write(pAd, RF_BANK0, RF_R05, 0x20);\n\n\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RFValue);\n\tRFValue = RFValue | 0x80; \n\trlt_rf_write(pAd, RF_BANK0, RF_R04, RFValue);\n\tRTMPusecDelay(2000);\n\n\trtmp_bbp_set_bw(pAd, pAd->CommonCfg.BBPCurrentBW);\n\n\tswitch (pAd->CommonCfg.BBPCurrentBW)\n\t{\n\t\tcase BW_20:\n\t\t\tif ( pChipCap->TemperatureMode == TEMPERATURE_MODE_HIGH )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempBW20RegTb, MT7601_BBP_HighTempBW20RegTb_Size);\n\t\t\t}\n\t\t\telse if ( pChipCap->TemperatureMode == TEMPERATURE_MODE_LOW )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempBW20RegTb, MT7601_BBP_LowTempBW20RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_BW20RegTb, MT7601_BBP_BW20RegTb_Size);\n\t\t\t}\n\n\n\t\t\t/* Tx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10001);\n\t\t\t/* Rx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10000);\n\t\t\tbreak;\n\t\tcase BW_40:\n\t\t\tif ( pChipCap->TemperatureMode == TEMPERATURE_MODE_HIGH )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempBW40RegTb, MT7601_BBP_HighTempBW40RegTb_Size);\n\t\t\t}\n\t\t\telse if ( pChipCap->TemperatureMode == TEMPERATURE_MODE_LOW )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempBW40RegTb, MT7601_BBP_LowTempBW40RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_BW40RegTb, MT7601_BBP_BW40RegTb_Size);\n\n\t\t\t}\n\n\t\t\t/* Tx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10101);\n\t\t\t/* Rx Filter BW */\n\t\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_BW, 0x10100);\n\n\t\t\tbreak;\n\t\tdefault:\t\t\t\n\t\t\tbreak;\n\t}\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t/* B5.R6 and B5.R7 */\n\trlt_rf_read(pAd, RF_BANK5, RF_R06, &RFValue);\n\tpAd->CommonCfg.MO_Cfg.Stored_RF_B5_R6 = RFValue;\n\trlt_rf_read(pAd, RF_BANK5, RF_R07, &RFValue);\n\tpAd->CommonCfg.MO_Cfg.Stored_RF_B5_R7 = RFValue;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t/* CCK CH14 OBW */\n\tif ( (pAd->CommonCfg.BBPCurrentBW == BW_20) && ( Channel == 14 ) )\n\t{\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, 0x60);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R178, 0x0);\n\t\t\n\t\tUINT32\tvalue;\n\t\tCHAR\tCCK1MPwr, CCK11MPwr;\n\t\tvalue = pAd->TxCCKPwrCfg;\n\t\tCCK1MPwr = value & 0x3F;\n\t\tCCK1MPwr -= 2;\n\t\tif ( CCK1MPwr < -32 )\n\t\t\tCCK1MPwr = -32;\n\t\tCCK11MPwr = (value & 0x3F00) >> 8;\n\t\tCCK11MPwr -= 2;\n\t\tif ( CCK11MPwr < -32 )\n\t\t\tCCK11MPwr = -32;\n\n\t\tvalue = (value & ~0xFFFF) | (CCK11MPwr << 8 ) | CCK1MPwr;\n\n\t\tpAd->Tx20MPwrCfgGBand[0] = value;\n\t}\n\telse\n\t{\n\t\tUCHAR BBPValue;\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);\n\t\tBBPValue &= ~(0x20);\n\t\tAndesBBPRandomWrite(pAd, 2,\n\t\t\tBBP_R4, BBPValue,\n\t\t\tBBP_R178, 0xFF);\n\t\tpAd->Tx20MPwrCfgGBand[0] = pAd->TxCCKPwrCfg;\n\t}\n\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0, pAd->Tx20MPwrCfgGBand[0]);\n\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->hw_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n#ifdef SINGLE_SKU_V2\n\t\tUpdateSkuRatePwr(pAd, Channel, pAd->CommonCfg.BBPCurrentBW, SkuBasePwr);\n#endif /* SINGLE_SKU_V2 */\t\n\n\n}\n\n\nNTSTATUS MT7601DisableTxRx(\n\tRTMP_ADAPTER *pAd,\n\tUCHAR Level)\n{\n\tUINT32 MacReg = 0;\n\tUINT32 MTxCycle;\n\tBOOLEAN bResetWLAN = FALSE;\n\tBOOLEAN bFree = TRUE;\n\tUINT8 CheckFreeTimes = 0;\n\tUINT32 MaxRetry;\n\n\tif (!IS_MT7601(pAd))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"----> %s\\n\", __FUNCTION__));\n\n\tif ( Level == DOT11POWERSAVE )\n\t\tMaxRetry = 20;\n\telse\n\t\tMaxRetry = 2000;\n\n\tif (Level == RTMP_HALT)\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);\n\t}\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s Tx success = %ld\\n\", \n\t\t__FUNCTION__, (ULONG)pAd->WlanCounters.TransmittedFragmentCount.u.LowPart));\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s Tx success = %ld\\n\", \n\t\t__FUNCTION__, (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart));\n\n\tif ( StopDmaTx(pAd, Level) == STATUS_UNSUCCESSFUL )\n\t\treturn STATUS_UNSUCCESSFUL;\n\n\t/*\n\t\tCheck page count in TxQ,\n\t*/\n\tfor (MTxCycle = 0; MTxCycle < MaxRetry; MTxCycle++)\n\t{\n\t\tBOOLEAN bFree = TRUE;\n\t\tRTMP_IO_READ32(pAd, 0x438, &MacReg);\n\t\tif (MacReg != 0)\n\t\t\tbFree = FALSE;\n\t\tRTMP_IO_READ32(pAd, 0xa30, &MacReg);\n\t\tif (MacReg & 0x000000FF)\n\t\t\tbFree = FALSE;\n\t\tRTMP_IO_READ32(pAd, 0xa34, &MacReg);\n\t\tif (MacReg & 0xFF00FF00)\n\t\t\tbFree = FALSE;\n\t\tif (bFree)\n\t\t\tbreak;\n\t\tif (MacReg == 0xFFFFFFFF)\n\t\t{\n\t\t\t//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n\n\tif (MTxCycle >= MaxRetry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Check TxQ page count max\\n\"));\n\t\tRTMP_IO_READ32(pAd, 0x0a30, &MacReg);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x0a30 = 0x%08x\\n\", MacReg));\n\n\t\tRTMP_IO_READ32(pAd, 0x0a34, &MacReg);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x0a34 = 0x%08x\\n\", MacReg));\n\n\t\tRTMP_IO_READ32(pAd, 0x438, &MacReg);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x438 = 0x%08x\\n\", MacReg));\n\t\tbResetWLAN = TRUE;\n\n\t\tif ( Level == DOT11POWERSAVE )\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\t/*\n\t\tCheck MAC Tx idle\n\t*/\n\tfor (MTxCycle = 0; MTxCycle < MaxRetry; MTxCycle++)\n\t{\n\t\tRTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacReg);\n\t\tif (MacReg & 0x1)\n\t\t\tRTMPusecDelay(50);\n\t\telse\n\t\t\tbreak;\n\n\t\tif (MacReg == 0xFFFFFFFF)\n\t\t{\n\t\t\t//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n\n\tif (MTxCycle >= MaxRetry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Check MAC Tx idle max(0x%08x)\\n\", MacReg));\n\t\tbResetWLAN = TRUE;\n\n\t\tif ( Level == DOT11POWERSAVE )\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\t\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) == FALSE)\n\t{\n\t\tif (Level == RTMP_HALT)\n\t\t{\n\t\t\t/*\n\t\t\t\tDisable MAC TX/RX\n\t\t\t*/\n\t\t\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacReg);\n\t\t\tMacReg &= ~(0x0000000c);\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacReg);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*\n\t\t\t\tDisable MAC RX\n\t\t\t*/\n\t\t\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacReg);\n\t\t\tMacReg &= ~(0x00000008);\n\t\t\t//MacReg &= ~(0x0000000c);\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacReg);\n\t\t}\n\t}\n\n\t/*\n\t\tCheck page count in RxQ,\n\t*/\n\tfor (MTxCycle = 0; MTxCycle < MaxRetry; MTxCycle++)\n\t{\n\t\tbFree = TRUE;\n\t\tRTMP_IO_READ32(pAd, 0x430, &MacReg);\n\t\t\n\t\tif (MacReg & (0x00FF0000))\n\t\t\tbFree = FALSE;\n\t\t\n\t\tRTMP_IO_READ32(pAd, 0xa30, &MacReg);\n\t\t\n\t\tif (MacReg != 0)\n\t\t\tbFree = FALSE;\n\t\t\n\t\tRTMP_IO_READ32(pAd, 0xa34, &MacReg);\n\t\t\n\t\tif (MacReg != 0)\n\t\t\tbFree = FALSE;\n\n\t\tif (bFree && (CheckFreeTimes > 5)) //&& (!IsInBandCmdProcessing(pAd)))\n\t\t\tbreak;\n\n\t\tif (bFree)\n\t\t\tCheckFreeTimes++;\n\t\t\n\t\tif (MacReg == 0xFFFFFFFF)\n\t\t{\n\t\t\t//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n#ifdef RTMP_MAC_USB\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE);\n\t\tRTUSBBulkCmdRspEventReceive(pAd);\n\t\tRTUSBBulkReceive(pAd);\n#endif\n\t}\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE);\n\t\n\tif (MTxCycle >= MaxRetry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Check RxQ page count max\\n\"));\n\t\t\n\t\tRTMP_IO_READ32(pAd, 0x0a30, &MacReg);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x0a30 = 0x%08x\\n\", MacReg));\n\n\t\tRTMP_IO_READ32(pAd, 0x0a34, &MacReg);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x0a34 = 0x%08x\\n\", MacReg));\n\n\t\tRTMP_IO_READ32(pAd, 0x0430, &MacReg);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x0430 = 0x%08x\\n\", MacReg));\n\t\tbResetWLAN = TRUE;\n\n\t\tif ( Level == DOT11POWERSAVE )\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\t/*\n\t\tCheck MAC Rx idle\n\t*/\n\tfor (MTxCycle = 0; MTxCycle < MaxRetry; MTxCycle++)\n\t{\n\t\tRTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacReg);\n\t\tif (MacReg & 0x2)\n\t\t\tRTMPusecDelay(50);\n\t\telse\n\t\t\tbreak;\n\t\tif (MacReg == 0xFFFFFFFF)\n\t\t{\n\t\t\t//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n\n\tif (MTxCycle >= MaxRetry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Check MAC Rx idle max(0x%08x)\\n\", MacReg));\n\t\tbResetWLAN = TRUE;\n\n\t\tif ( Level == DOT11POWERSAVE )\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\tif ( StopDmaRx(pAd, Level) == STATUS_UNSUCCESSFUL )\n\t\treturn STATUS_UNSUCCESSFUL;\n\n\tif ((Level == RTMP_HALT) &&\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) == FALSE))\n\t{\t\n\t\tif (!pAd->chipCap.IsComboChip)\n\t\t\tNICEraseFirmware(pAd);\n\t\t\n\t\t/*\n\t\t\tDisable RF/MAC\n\t\t*/\n\n\t\tif ((pAd->chipCap.IsComboChip) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SUSPEND)\n\t\t\t\t|| RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_CMD_RADIO_OFF))\n\t\t\tbResetWLAN = 0;\n\n\t\tMT7601_WLAN_ChipOnOff(pAd, FALSE, bResetWLAN);\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---- %s\\n\", __FUNCTION__));\n\n\treturn STATUS_SUCCESS;\n}\n\n\n#ifdef RTMP_USB_SUPPORT\nVOID MT7601UsbAsicRadioOff(RTMP_ADAPTER *pAd, UCHAR Stage)\n{\n\tUINT32 Value, ret;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s\\n\", __FUNCTION__));\n\n\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) )\n\t\treturn;\n\n\tif (Stage == SUSPEND_RADIO_OFF)\n\t{\n\t\tMT7601DisableTxRx(pAd, RTMP_HALT);\n\t}\n\telse\n\t{\n\t\tif ( MT7601DisableTxRx(pAd, DOT11POWERSAVE) == STATUS_UNSUCCESSFUL )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Give up radio off!\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->hw_atomic, ret);\n\t\tif (ret != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\t\t\treturn;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tRTMP_SET_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP);\n\n\tif (Stage != SUSPEND_RADIO_OFF )\n\t{\n\t\tPWR_SAVING_OP(pAd, RADIO_OFF, 1, 0, 0, 0, 0);\n\t}\n\t\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\n\t/* Stop bulkin pipe*/\n\tif((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tRTUSBCancelPendingBulkInIRP(pAd);\n\t\t//pAd->PendingRx = 0;\n\t}\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->hw_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- %s\\n\", __FUNCTION__));\n}\n\n\nVOID MT7601UsbAsicRadioOn(RTMP_ADAPTER *pAd, UCHAR Stage)\n{\n\tUINT32 MACValue = 0;\n\tUINT32 rx_filter_flag;\n\tWPDMA_GLO_CFG_STRUC GloCfg;\n\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\tUCHAR RFValue = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> %s\\n\", __FUNCTION__));\n\n\tif ( !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) )\n\t\treturn;\n\n\tRTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP);\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s\\n\", __FUNCTION__));\n\t\n\tif( (RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: autopm_resume success\\n\", __FUNCTION__));\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t}\n\telse if ((RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == (-1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: autopm_resume fail ------\\n\", __FUNCTION__));\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t\treturn;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: autopm_resume do nothing\\n\", __FUNCTION__));\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\t\n\tif (pAd->WlanFunCtrl.field.WLAN_EN == 0)\n\t{\n\t\tMT7601_WLAN_ChipOnOff(pAd, TRUE, FALSE);\n\t}\n\n\t/* make some traffic to invoke EvtDeviceD0Entry callback function*/\n\tRTUSBReadMACRegister(pAd,0x1000, &MACValue);\n\t//DBGPRINT(RT_DEBUG_TRACE,(\"A MAC query to invoke EvtDeviceD0Entry, MACValue = 0x%x\\n\",MACValue));\n\n\t/* enable RX of MAC block*/\n#ifdef XLINK_SUPPORT\n\tif (pAd->StaCfg.PSPXlink)\n\t\trx_filter_flag = PSPXLINK;\n\telse\n#endif /* XLINK_SUPPORT */\t\n\t\trx_filter_flag = STANORMAL;     /* Staion not drop control frame will fail WiFi Certification.*/\n\t\n\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);\n\n\t/* 4. Clear idle flag*/\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\n\t/* Send Bulkin IRPs after flag fRTMP_ADAPTER_IDLE_RADIO_OFF is cleared.*/\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tRTUSBBulkCmdRspEventReceive(pAd);\n\t\tRTUSBBulkReceive(pAd);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\n\tAndesRFRandomWrite(pAd, 2,\n\t\tRF_BANK0, RF_R04, 0x0A,\n\t\tRF_BANK0, RF_R05, 0x20);\n\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RFValue);\n\tRFValue = RFValue | 0x80; \n\trlt_rf_write(pAd, RF_BANK0, RF_R04, RFValue);\n\tRTMPusecDelay(2000);\n\n#ifdef CONFIG_STA_SUPPORT\n\tif ( pAd->Mlme.bSendNullFrameAfterWareUp == TRUE)\n\t{\n\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t  (pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t\t\t  pAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n\t\tpAd->Mlme.bSendNullFrameAfterWareUp = FALSE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== %s\\n\", __FUNCTION__));\n}\n#endif /* RTMP_USB_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nstatic VOID MT7601_NetDevNickNameInit(RTMP_ADAPTER *pAd)\n{\n\tsnprintf((PSTRING) pAd->nickname, sizeof(pAd->nickname), \"MT7601STA\");\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nVOID MT7601_NICInitAsicFromEEPROM(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\t// TODO: wait TC6008 EEPROM format\n}\n\n\nINT MT7601_ReadChannelPwr(RTMP_ADAPTER *pAd)\n{\n\tUINT32 i, idx, ss_offset_g, MacReg;\n\tEEPROM_TX_PWR_STRUC Power;\n\tCHAR tx_pwr1, tx_pwr2;\n\tCHAR max_tx1_pwr;\n\tUINT16 TargetPwr = 0;\n\tBOOLEAN bUseDefault = TRUE;\n#ifdef RTMP_INTERNAL_TX_ALC\n\tEEPROM_NIC_CONFIG2_STRUC NicConfig2;\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s()--->\\n\", __FUNCTION__));\n\n\tRTMP_IO_READ32(pAd, TX_ALC_CFG_0, &MacReg);\n\tmax_tx1_pwr = (MacReg >> 16) & 0x3F;\n\n#if defined (RTMP_INTERNAL_TX_ALC) || defined (SINGLE_SKU_V2)\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TARGET_POWER, TargetPwr);\n\ttx_pwr1 = TargetPwr & 0xFF;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: EEPROM 0xD0 = 0x%x\\n\", __FUNCTION__, tx_pwr1));\n\t\n\tif ( (tx_pwr1 == 0x0) || (tx_pwr1 > max_tx1_pwr) )\n\t{\n\t\ttx_pwr1 = 0x20;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: EEPROM 0xD0 Error! Use Default Target Power = 0x%x\\n\", __FUNCTION__, tx_pwr1));\n\t}\n#endif /* defined (RTMP_INTERNAL_TX_ALC) || defined (SINGLE_SKU_V2) */\n\n#ifdef SINGLE_SKU_V2\n\tpAd->DefaultTargetPwr = tx_pwr1;\n#endif /* SINGLE_SKU_V2 */\n\t\t\n\t/* Read Tx power value for all channels*/\n\t/* Value from 1 - 0x7f. Default value is 24.*/\n\t/* Power value : 2.4G 0x00 (0) ~ 0x1F (31)*/\n\t/*             : 5.5G 0xF9 (-7) ~ 0x0F (15)*/\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\tNicConfig2.word = pAd->EEPROMDefaultValue[EEPROM_NIC_CFG2_OFFSET];\n\tif ( NicConfig2.field.bInternalTxALC )\n\t{\n\n\t\tfor ( i = 0; i < 7; i++ )\n\t\t{\n\t\t\tidx = i * 2;\n\n\t\t\tpAd->TxPower[idx].Power = tx_pwr1;\n\t\t\tpAd->TxPower[idx + 1].Power = tx_pwr1;\n\n\t\t\tpAd->TxPower[idx].Channel = i * 2 +1;\n\t\t\tpAd->TxPower[idx + 1].Channel = i * 2 + 2;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: TxPower[%d].Power = 0x%02X, TxPower[%d].Power = 0x%02X\\n\", \n\t\t\t\t__FUNCTION__, \n\t\t\t\ti * 2, \n\t\t\t\tpAd->TxPower[i * 2].Power, \n\t\t\t\ti * 2 + 1, \n\t\t\t\tpAd->TxPower[i * 2 + 1].Power));\n\t\t}\n\n\t\treturn TRUE;\n\t}\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\t/* 0. 11b/g, ch1 - ch 14, 1SS */\n\tss_offset_g = EEPROM_G_TX_PWR_OFFSET;\n\n\tfor (i = 0; i < 7; i++)\n\t{\n\t\tidx = i * 2;\n\t\tRT28xx_EEPROM_READ16(pAd, ss_offset_g + idx, Power.word);\n\n\t\ttx_pwr1 = tx_pwr2 = DEFAULT_TX_POWER;\n\n\t\tif ((Power.field.Byte0 <= max_tx1_pwr) && (Power.field.Byte0 >= 0))\n\t\t\ttx_pwr1 = Power.field.Byte0;\n\n\t\tif ((Power.field.Byte1 <= max_tx1_pwr) || (Power.field.Byte1 >= 0))\n\t\t\ttx_pwr2 = Power.field.Byte1;\n\n\t\tpAd->TxPower[idx].Power = tx_pwr1;\n\t\tpAd->TxPower[idx + 1].Power = tx_pwr2;\n\n\t\tpAd->TxPower[idx].Channel = i * 2 +1;\n\t\tpAd->TxPower[idx + 1].Channel = i * 2 + 2;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: TxPower[%d].Power = 0x%02X, TxPower[%d].Power = 0x%02X\\n\", \n\t\t\t__FUNCTION__, \n\t\t\ti * 2, \n\t\t\tpAd->TxPower[i * 2].Power, \n\t\t\ti * 2 + 1, \n\t\t\tpAd->TxPower[i * 2 + 1].Power));\n\n\t}\n\n\treturn TRUE;\n}\n\n\nVOID MT7601_ReadTxPwrPerRate(RTMP_ADAPTER *pAd)\n{\n\tUINT32\t\tdata, Adata, Gdata;\n\tUSHORT\t\ti, value, value2;\n\tCHAR\t\tvalue_1, value_2;\n\tCHAR\t\tApwrdelta, Gpwrdelta;\n\tCHAR\t\tt1,t2;\n\n\t/* Get power delta for 20MHz and 40MHz.*/\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Txpower per Rate\\n\"));\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);\n\tApwrdelta = 0;\n\tGpwrdelta = 0;\n\n\tif ((value2 & 0xff) != 0xff)\n\t{\n\t\tif ((value2 & 0x80))\n\t\t{\n\t\t\t/* Unit = 0.5 dBm, Max is 4 dBm */\n\t\t\tGpwrdelta = (value2&0x1f);\n\t\t\tif ( Gpwrdelta > 8 )\n\t\t\t\tGpwrdelta = 8;\n\n\t\t\tif ((value2 & 0x40) == 0 )\n\t\t\t\tGpwrdelta = -Gpwrdelta;\n\t\t}\n\t\t\n\t}\n\tif ((value2 & 0xff00) != 0xff00)\n\t{\n\t\tif ((value2 & 0x8000))\n\t\t{\n\t\t\tApwrdelta = ((value2&0x1f00)>>8);\n\t\t\tif ( Apwrdelta > 8 )\n\t\t\t\tApwrdelta = 8;\n\n\t\t\tif ((value2 & 0x4000) == 0)\n\t\t\t\tApwrdelta = - Apwrdelta;\n\t\t}\n\t}\n\t\n#ifdef SINGLE_SKU_V2\n\tpAd->chipCap.Apwrdelta = Apwrdelta;\n\tpAd->chipCap.Gpwrdelta = Gpwrdelta;\n#endif /* SINGLE_SKU_V2 */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Gpwrdelta = %d, Apwrdelta = %d .\\n\", Gpwrdelta, Apwrdelta));\n\t\n\t/* Get Txpower per MCS for 20MHz in 2.4G.*/\n\t\n\tfor (i=0; i<5; i++)\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);\n\t\tdata = value;\n\n\t\t/* signed 6-bit */\t\t\n\t\tvalue_1 = (value&0x3f);\n\t\tvalue_2 = (value&0x3f00)>>8;\n\n\t\t/* signed extension */\n\t\tvalue_1 = (value_1 > 0x1F) ? value_1 - 0x40 : value_1;\n\t\tvalue_2 = (value_2 > 0x1F) ? value_2 - 0x40 : value_2;\n\n\t\tt1 = value_1 + Gpwrdelta;\n\t\tt2 = value_2 + Gpwrdelta;\n\n\t\t/* boundary check */\n\t\tif ( t1 > 31 )\n\t\t\tt1 = 31;\n\t\tif ( t1 < -32 )\n\t\t\tt1 = -32;\n\n\t\tif ( t2 > 31 )\n\t\t\tt2 = 31;\n\t\tif ( t2 < -32 )\n\t\t\tt2 = -32;\n\n\t\tGdata = (t1 & 0x3f) + ((t2 & 0x3f)<<8);\n\n\t\tt1 = value_1 + Apwrdelta;\n\t\tt2 = value_2 + Apwrdelta;\n\n\t\t/* boundary check */\n\t\tif ( t1 > 31 )\n\t\t\tt1 = 31;\n\t\tif ( t1 < -32 )\n\t\t\tt1 = -32;\n\n\t\tif ( t2 > 31 )\n\t\t\tt2 = 31;\n\t\tif ( t2 < -32 )\n\t\t\tt2 = -32;\n\n\t\tAdata = (t1 & 0x3f)  + (( t2 & 0x3f ) <<8);\n\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);\n\n\t\tif ( i != 4 )\n\t\t{\n\t\t\t/* signed 6-bit */\t\t\n\t\t\tvalue_1 = (value&0x3f);\n\t\t\tvalue_2 = (value&0x3f00)>>8;\n\n\t\t\t/* signed extension */\n\t\t\tvalue_1 = (value_1 > 0x1F) ? value_1 - 0x40 : value_1;\n\t\t\tvalue_2 = (value_2 > 0x1F) ? value_2 - 0x40 : value_2;\n\n\t\t\tt1 = value_1 + Gpwrdelta;\n\t\t\tt2 = value_2 + Gpwrdelta;\n\n\t\t\t/* boundary check */\n\t\t\tif ( t1 > 31 )\n\t\t\t\tt1 = 31;\n\t\t\tif ( t1 < -32 )\n\t\t\t\tt1 = -32;\n\n\t\t\tif ( t2 > 31 )\n\t\t\t\tt2 = 31;\n\t\t\tif ( t2 < -32 )\n\t\t\t\tt2 = -32;\n\n\t\t\tGdata |= (( (t1 & 0x3f )<<16) + ( (t2 & 0x3f )<<24));\n\n\t\t\tt1 = value_1 + Apwrdelta;\n\t\t\tt2 = value_2 + Apwrdelta;\n\n\t\t\t/* boundary check */\n\t\t\tif ( t1 > 31 )\n\t\t\t\tt1 = 31;\n\t\t\tif ( t1 < -32 )\n\t\t\t\tt1 = -32;\n\n\t\t\tif ( t2 > 31 )\n\t\t\t\tt2 = 31;\n\t\t\tif ( t2 < -32 )\n\t\t\t\tt2 = -32;\n\t\t\n\t\t\tAdata |= (( (t1 & 0x3f ) <<16) + ( (t2 & 0x3f ) <<24));\n\t\t} \n\t\telse\n\t\t{\n\t\t\tGdata |= 0xFFFF0000;\n\t\t\tAdata |= 0xFFFF0000;\n\t\t}\n\t\tdata |= (value<<16);\n\n\t\t/* For 20M/40M Power Delta issue */\t\t\n\t\tpAd->Tx20MPwrCfgABand[i] = data;\n\t\tpAd->Tx20MPwrCfgGBand[i] = data;\n\t\tpAd->Tx40MPwrCfgABand[i] = Adata;\n\t\tpAd->Tx40MPwrCfgGBand[i] = Gdata;\n\t\t\n\t\tif (data != 0xffffffff)\n\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"20MHz BW, 2.4G band-%08x,  Adata = %08x,  Gdata = %08x \\n\", data, Adata, Gdata));\n\t}\n\n\t/* Extra set MAC registers to compensate Tx power if any */\n\tRTMP_CHIP_ASIC_EXTRA_POWER_OVER_MAC(pAd);\n\n\tpAd->TxCCKPwrCfg = pAd->Tx20MPwrCfgGBand[0];\n\n}\n\n\nVOID MT7601_AsicExtraPowerOverMAC(\n\tIN\tPRTMP_ADAPTER \t\tpAd)\n{\n\tULONG\tExtraPwrOverMAC = 0;\n\tULONG\tExtraPwrOverTxPwrCfg7 = 0, ExtraPwrOverTxPwrCfg9 = 0;\n\n\t/* For OFDM_54 and HT_MCS_7, extra fill the corresponding register value into MAC 0x13D4 */\n\tRTMP_IO_READ32(pAd, 0x1318, &ExtraPwrOverMAC);  \n\tExtraPwrOverTxPwrCfg7 |= (ExtraPwrOverMAC & 0x0000FF00) >> 8; /* Get Tx power for OFDM 54 */\n\tRTMP_IO_READ32(pAd, 0x131C, &ExtraPwrOverMAC);  \n\tExtraPwrOverTxPwrCfg7 |= (ExtraPwrOverMAC & 0x0000FF00) << 8; /* Get Tx power for HT MCS 7 */\t\t\t\n\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_7, ExtraPwrOverTxPwrCfg7);\n\n\t/* For STBC_MCS_7, extra fill the corresponding register value into MAC 0x13DC */\n\tRTMP_IO_READ32(pAd, 0x1324, &ExtraPwrOverMAC);  \n\tExtraPwrOverTxPwrCfg9 |= (ExtraPwrOverMAC & 0x0000FF00) >> 8; /* Get Tx power for STBC MCS 7 */\n\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_9, ExtraPwrOverTxPwrCfg9);\n\t\n\tDBGPRINT(RT_DEBUG_INFO, (\"Offset = 0x13D4, TxPwr = 0x%08X, Offset = 0x13DC, TxPwr = 0x%08X\\n\", \n\t\t(UINT)ExtraPwrOverTxPwrCfg7, \n\t\t(UINT)ExtraPwrOverTxPwrCfg9));\n}\n\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2)\nVOID MT7601_InitPAModeTable(\n\tIN PRTMP_ADAPTER\t\t\tpAd)\n{\n\tINT32 PAMode;\n\tUINT32 Value = 0;\n\tUINT16 index, offset;\n\n\tRTMP_IO_READ32(pAd, RF_PA_MODE_CFG0, &Value);\n\tfor ( index = 0, offset = 0; index < 4 ; index++, offset+= 2 )\n\t{\n\t\tPAMode = (Value >> offset ) & 0x3;\n\t\tif ( PAMode == 3 )\n\t\t\tpAd->chipCap.PAModeCCK[index] = RF_PA_MODE3_DECODE;\n\t\telse if ( PAMode == 1 )\n\t\t\tpAd->chipCap.PAModeCCK[index] = RF_PA_MODE1_DECODE;\n\t\telse if ( PAMode == 0 )\n\t\t\tpAd->chipCap.PAModeCCK[index] = RF_PA_MODE0_DECODE;\n\t\telse if ( PAMode == 2 )\n\t\t\tpAd->chipCap.PAModeCCK[index] = RF_PA_MODE2_DECODE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PAModeCCK[%d] = %d\\n\", index, pAd->chipCap.PAModeCCK[index]));\n\t}\n\n\tfor ( index = 0, offset = 8; index < 8 ; index++, offset+= 2 )\n\t{\n\t\tPAMode = (Value >> offset ) & 0x3;\n\t\tif ( PAMode == 3 )\n\t\t\tpAd->chipCap.PAModeOFDM[index] = RF_PA_MODE3_DECODE;\n\t\telse if ( PAMode == 1 )\n\t\t\tpAd->chipCap.PAModeOFDM[index] = RF_PA_MODE1_DECODE;\n\t\telse if ( PAMode == 0 )\n\t\t\tpAd->chipCap.PAModeOFDM[index] = RF_PA_MODE0_DECODE;\n\t\telse if ( PAMode == 2 )\n\t\t\tpAd->chipCap.PAModeOFDM[index] = RF_PA_MODE2_DECODE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PAModeOFDM[%d] = %d\\n\", index, pAd->chipCap.PAModeOFDM[index]));\n\t}\n\n\tRTMP_IO_READ32(pAd, RF_PA_MODE_CFG1, &Value);  \n\n\tfor ( index = 0, offset = 0; index < 16 ; index++, offset+= 2 )\n\t{\n\t\tPAMode = (Value >> offset ) & 0x3;\n\t\tif ( PAMode == 3 )\n\t\t\tpAd->chipCap.PAModeHT[index] = RF_PA_MODE3_DECODE;\n\t\telse if ( PAMode == 1 )\n\t\t\tpAd->chipCap.PAModeHT[index] = RF_PA_MODE1_DECODE;\n\t\telse if ( PAMode == 0 )\n\t\t\tpAd->chipCap.PAModeHT[index] = RF_PA_MODE0_DECODE;\n\t\telse if ( PAMode == 2 )\n\t\t\tpAd->chipCap.PAModeHT[index] = RF_PA_MODE2_DECODE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PAModeHT[%d] = %d\\n\", index, pAd->chipCap.PAModeHT[index]));\n\t}\n\n}\n#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2) */\n\n\nVOID MT7601_InitTemperatureCompensation(\n\tIN PRTMP_ADAPTER\t\t\tpAd)\n{\n\tUINT32 Value = 0;\n\n\tpAd->chipCap.TemperatureMode = TEMPERATURE_MODE_NORMAL;\n\tpAd->chipCap.CurrentTemperature = 0;\n\tpAd->chipCap.bPllLockProtect = FALSE;\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TARGET_POWER, Value);\n\tpAd->chipCap.TemperatureRef25C = (Value >> 8) & 0xFF;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->TemperatureRef25C = 0x%x\\n\", pAd->chipCap.TemperatureRef25C));\n\n}\n\n\nVOID MT7601_TemperatureCompensation(\n\tIN PRTMP_ADAPTER\t\t\tpAd)\n{\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tif (pAd->Mlme.OneSecPeriodicRound % 4 == 0)\n\t{\n#ifdef RTMP_INTERNAL_TX_ALC\n\t\tif ( pAd->TxPowerCtrl.bInternalTxALC == FALSE )\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t\t{\n\t\t\tMT7601_Read_Temperature(pAd, &pChipCap->CurrentTemperBbpR49);\n\t\t}\n\n\t\tMT7601AsicTemperatureCompensation(pAd, FALSE);\n\t}\n}\n\n\nVOID MT7601AsicTemperatureCompensation(\n\tIN PRTMP_ADAPTER\t\t\tpAd,\n\tIN BOOLEAN\t\t\t\t\tbPowerOn)\n{\n\tINT32\tCurrentTemper;\n\tINT IdReg;\n\tUCHAR\tRfReg;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 high_temp_cr_threshold, low_temp_cr_threshold;\n\n\tCurrentTemper = (pChipCap->CurrentTemperBbpR49 - pChipCap->TemperatureRef25C) * MT7601_E2_TEMPERATURE_SLOPE;\t\t// 3.9 * 10\n\tpChipCap->CurrentTemperature = CurrentTemper;\n\n#ifdef DPD_CALIBRATION_SUPPORT\n\t/* DPD Calibration */\n\tif ( ((CurrentTemper - pChipCap->TemperatureDPD) > 450) || ((CurrentTemper - pChipCap->TemperatureDPD) < -450 ))\n\t{\n\t\tpChipCap->TemperatureDPD = CurrentTemper;\n\n\t\t/* DPD-Calibration */\n\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_DPD, pChipCap->TemperatureDPD);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::ReCalibration DPD.\\n\", __FUNCTION__));\n\t}\n#endif /* DPD_CALIBRATION_SUPPORT */\n\n\t/* PLL Lock Protect */\n\tif ( CurrentTemper < -50 )\t\t\t\t\t\t\t\t\t\t\t\t// ( 20 - 25 ) * 10 = -50\n\t{\n\t\tif ( pAd->chipCap.bPllLockProtect == FALSE )\n\t\t{\n\t\t\tpAd->chipCap.bPllLockProtect = TRUE;\n\t\t\trlt_rf_write(pAd, RF_BANK4, RF_R04, 0x06);\n\n\t\t\trlt_rf_read(pAd, RF_BANK4, RF_R10, &RfReg);\n\t\t\tRfReg = RfReg & ~0x30; \n\t\t\trlt_rf_write(pAd, RF_BANK4, RF_R10, RfReg);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Enable PLL Lock Protect.\\n\", __FUNCTION__));\n\t\t}\n\t}\n\telse if ( CurrentTemper > 50 )\t\t\t\t\t\t\t\t\t\t\t// ( 30 - 25 ) * 10 = 50\n\t{\n\t\tif ( pAd->chipCap.bPllLockProtect == TRUE )\n\t\t{\n\t\t\tpAd->chipCap.bPllLockProtect = FALSE;\n\t\t\trlt_rf_write(pAd, RF_BANK4, RF_R04, 0x0);\n\n\t\t\trlt_rf_read(pAd, RF_BANK4, RF_R10, &RfReg);\n\t\t\tRfReg = (RfReg & ~0x30) | 0x10;\n\t\t\trlt_rf_write(pAd, RF_BANK4, RF_R10, RfReg);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Disable PLL Lock Protect.\\n\", __FUNCTION__));\n\t\t}\n\t}\n\n\tif ( bPowerOn )\n\t{\n\t\thigh_temp_cr_threshold = 350;\n\t\tlow_temp_cr_threshold = -250;\n\t}\n\telse\n\t{\n\t\thigh_temp_cr_threshold = 400;\n\t\tlow_temp_cr_threshold = -200;\n\t}\n\n\n\t/* BBP CR for H, L, N temperature */\n\tif ( CurrentTemper > high_temp_cr_threshold  )\t\t\t\t\t\t\t\t\t\t\t\t\t// (60 - 25) * 10 = 350\n\t{\n\t\tif ( pChipCap->TemperatureMode != TEMPERATURE_MODE_HIGH )\n\t\t{\n\t\t\tpChipCap->TemperatureMode = TEMPERATURE_MODE_HIGH;\n\n\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempCommonRegTb, MT7601_BBP_HighTempCommonRegTb_Size);\n\n\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_20 )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempBW20RegTb, MT7601_BBP_HighTempBW20RegTb_Size);\n\t\t\t}\n\t\t\telse if (pAd->CommonCfg.BBPCurrentBW == BW_40 )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_HighTempBW40RegTb, MT7601_BBP_HighTempBW40RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Unsupported BW(%x)\\n\", __FUNCTION__, pAd->CommonCfg.BBPCurrentBW));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Change to TEMPERATURE_MODE_HIGH\\n\", __FUNCTION__));\n\t\t}\n\t}\n\telse if ( CurrentTemper > low_temp_cr_threshold )\t\t\t\t\t\t\t\t\t// ( 0 - 25 ) * 10\n\t{\n\t\tif ( pChipCap->TemperatureMode != TEMPERATURE_MODE_NORMAL )\n\t\t{\n\t\t\tpChipCap->TemperatureMode = TEMPERATURE_MODE_NORMAL;\n\n\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_CommonRegTb, MT7601_BBP_CommonRegTb_Size);\n\n\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_20 )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_BW20RegTb, MT7601_BBP_BW20RegTb_Size);\n\t\t\t}\n\t\t\telse if (pAd->CommonCfg.BBPCurrentBW == BW_40 )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_BW40RegTb, MT7601_BBP_BW40RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Unsupported BW(%x)\\n\", __FUNCTION__, pAd->CommonCfg.BBPCurrentBW));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Change to TEMPERATURE_MODE_NORMAL\\n\", __FUNCTION__));\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ( pChipCap->TemperatureMode != TEMPERATURE_MODE_LOW )\n\t\t{\n\t\t\tpChipCap->TemperatureMode = TEMPERATURE_MODE_LOW;\n\n\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempCommonRegTb, MT7601_BBP_LowTempCommonRegTb_Size);\n\n\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_20 )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempBW20RegTb, MT7601_BBP_LowTempBW20RegTb_Size);\n\t\t\t}\n\t\t\telse if (pAd->CommonCfg.BBPCurrentBW == BW_40 )\n\t\t\t{\n\t\t\t\tAndesBBPRandomWritePair(pAd, MT7601_BBP_LowTempBW40RegTb, MT7601_BBP_LowTempBW40RegTb_Size);\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Unsupported BW(%x)\\n\", __FUNCTION__, pAd->CommonCfg.BBPCurrentBW));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Change to TEMPERATURE_MODE_LOW\\n\", __FUNCTION__));\n\t\t}\n\t}\n\t\n}\n\n\n#ifdef RTMP_INTERNAL_TX_ALC\nINT16 lin2dBd(UINT16 linearValue)\n{\n    short exp;\n    unsigned int mantisa;\n    int app,dBd;\n    // Default backoff ; to enhance leading bit searching time\n    mantisa = linearValue << DEFAULT_BO;\n    exp = -(DEFAULT_BO);\n    // Leading bit searching\n    if (mantisa < (0x8000)) {\n        while (mantisa < (0x8000)) {\n            mantisa = mantisa << 1; // no need saturation\n            exp--;\n            if (exp < -20) {\n                //printf(\"error, input too small\");\n                //printf(\"exponent = %d\\n\",exp);\n                return LIN2DB_ERROR_CODE;\n            }\n        }\n    }\n    else {\n        while (mantisa > (0xFFFF)) {\n            mantisa = mantisa >> 1; // no need saturation\n            exp ++;\n            if (exp > 20) {\n                //printf(\"error, input too large\");\n                //printf(\"exponent = %d\\n\",exp);\n                return LIN2DB_ERROR_CODE;\n            }\n        }\n    }\n\t//printf(\"exp=0d%d,mantisa=0x%x\\n\",exp,mantisa);\n\n    if (mantisa <= 47104) {\n\t    app= (mantisa+(mantisa>>3)+(mantisa>>4)-38400); //S(15,0)\n        if(app<0) {app=0;}\n    }\n    else {\n        app=(mantisa-(mantisa>>3)-(mantisa>>6)-23040); //S(15,0)\n        if(app<0) {app=0;}\n    }\n\n    dBd=((15+exp)<<15)+app;//since 2^15=1 here\n\t//printf(\"dBd1=%d\\n\",dBd);\n    dBd=(dBd<<2)+(dBd<<1)+(dBd>>6)+(dBd>>7);\n\tdBd=(dBd>>10);//S10.5\n\t//printf(\"app=%d,dBd=%d,dBdF=%f\\n\",app,dBd,(double)dBd/32);\n    return(dBd);\n}\n\n\nVOID MT7601_EnableTSSI(IN \t\tPRTMP_ADAPTER \t\tpAd)\n{\n\tUCHAR RFReg, BBPReg;\n\tUINT32 ret;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\n\t\tAndesFunSetOP(pAd, 5, pTxALCData->TSSI_USE_HVGA);\n\n\n\n}\n\n\nVOID MT7601_TssiDcGainCalibration(RTMP_ADAPTER *pAd)\n{\n\tUCHAR Rf_B5_R03, Rf_B4_R39, bbp_r47;\n\tINT i, count;\n\tUCHAR RValue;\n\tINT16 tssi_linear;\n\tINT16 tssi0_db = 0, tssi0_db_hvga = 0;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\n\t/* Mac Bypass */\n\tRTMP_IO_WRITE32(pAd, 0x50C, 0x30);\n\tRTMP_IO_WRITE32(pAd, 0x504, 0xC0030);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);\n\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R58, 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R241, 0x2);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R23, 0x8);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &bbp_r47);\n\n\n\t/* Set VGA gain */\n\trlt_rf_read(pAd, RF_BANK5, RF_R03, &Rf_B5_R03);\n\trlt_rf_write(pAd, RF_BANK5, RF_R03, 0x8);\n\n\t/* Mixer disable */\n\trlt_rf_read(pAd, RF_BANK4, RF_R39, &Rf_B4_R39);\n\trlt_rf_write(pAd, RF_BANK4, RF_R39, 0x0);\n\n\tfor( i = 0; i < 4; i++)\n\t{\n\t\tif ( ( i == 0 ) || ( i == 2 ) )\n\t\t\trlt_rf_write(pAd, RF_BANK4, RF_R39, 0x0);\t\t//disable PA\n\t\telse\n\t\t\trlt_rf_write(pAd, RF_BANK4, RF_R39, Rf_B4_R39);\t// enable PA\n\n\t\tif( i < 2)\n\t\t{\n \t\t \tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R23, 0x8);\n\t\t\trlt_rf_write(pAd, RF_BANK5, RF_R03, 0x8);\n\t\t}\n\t\telse\n\t\t{ \t\n \t\t \tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R23, 0x2);\n\t\t\trlt_rf_write(pAd, RF_BANK5, RF_R03, 0x11);\n\t\t}\n\n\t\t/* BBP TSSI initial and soft reset */\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22  , 0x0);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R244, 0x0);\t\n\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, 0x1);\n\t\tRTMPusecDelay(1);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, 0x0);\n\n\t\t/* TSSI measurement */\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, 0x50); \n\t\tif ( ( i == 0 ) || ( i == 2 ) )\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, 0x40);\t\t// enable dc\n\t\telse\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R244, 0x31);\t// enable ton gen\n\t\t\n\t\tfor ( count = 0; count < 20; count++ )\n\t\t{\n\t\t\t//RTMPusecDelay(100);\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &RValue);\n\n\t\t\tif ( (RValue & 0x10) == 0x00 )\n\t\t\t\tbreak;\n\t\t}\n\t\tif ( count == 20 )\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TssiDC0 Read Fail!\\n\"));\n\n\t\t/* TSSI read */\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, 0x40);\n\t\tif(i == 0)\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &pTxALCData->TssiDC0);\n\t\telse if(i == 2)\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &pTxALCData->TssiDC0_HVGA);\n\t\telse \n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, (PUCHAR)&tssi_linear);\n\n\t\ttssi_linear = tssi_linear & 0xff;\n\t\ttssi_linear = (tssi_linear & 0x80) ? tssi_linear - 0x100 : tssi_linear;   \n\n\t\tif(i==1)\n\t\t\ttssi0_db = lin2dBd(tssi_linear - pTxALCData->TssiDC0);\n\t\telse if(i == 3)\n\t\t{\n\t\t\ttssi_linear = tssi_linear - pTxALCData->TssiDC0_HVGA;\n\t\t\ttssi_linear = tssi_linear * 4;\n\t\t\ttssi0_db_hvga = lin2dBd(tssi_linear);\n\t\t}\n\t\t\t\n       }\n\n\tpTxALCData->TSSI0_DB = tssi0_db;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tssi0_db_hvga = %x\\n\", tssi0_db_hvga));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tssi0_db = %x\\n\", tssi0_db));\n\n\n\tpTxALCData->TSSI_DBOFFSET_HVGA = tssi0_db_hvga - tssi0_db;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R244, 0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, 0x1);\n\tRTMPusecDelay(1);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, 0x0);\n\tRTMP_IO_WRITE32(pAd, 0x504, 0x0);\n\tRTMP_IO_WRITE32(pAd, 0x50C, 0x0);\n\trlt_rf_write(pAd, RF_BANK5, RF_R03, Rf_B5_R03);\n\trlt_rf_write(pAd, RF_BANK4, RF_R39, Rf_B4_R39);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, bbp_r47);\n\t// -(tssi0_db*slope +tssi0_db) / 4096\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TssiDC0 = %d (0x%x)\\n\", pTxALCData->TssiDC0, pTxALCData->TssiDC0));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TssiDC0_HVGA = %d (0x%x)\\n\", pTxALCData->TssiDC0_HVGA, pTxALCData->TssiDC0));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI_DBOFFSET_HVGA = %x\\n\", pTxALCData->TSSI_DBOFFSET_HVGA));\n\n}\n\n\nVOID MT7601_InitDesiredTSSITable(\n\tIN PRTMP_ADAPTER\t\t\tpAd)\n{\n\tUINT32 Value = 0;\n\tUINT16 index, offset;\n\tINT32 init_offset;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\n\n\tif (pAd->TxPowerCtrl.bInternalTxALC == FALSE)\n\t{\n\t\treturn;\n\t}\n\n\t/* TSSI Slope in EEPROM 0x6E u.2.6 */\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TX0_TSSI_SLOPE, Value);\n\tpTxALCData->TssiSlope = Value & 0xFF;\n\n\t/* TSSI Offset Channel 1 ~ 4 in EEPROF 0x6F s.3.4 */\n\tpTxALCData->MT7601_TSSI_OFFSET[0] = (Value & 0xFF00) >> 8;\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TX0_TSSI_OFFSET_GROUP1, Value);\n\tpTxALCData->MT7601_TSSI_OFFSET[1] = Value & 0xFF;\n\tpTxALCData->MT7601_TSSI_OFFSET[2] = (Value & 0xFF00) >> 8;\n\n#ifdef DOT11_N_SUPPORT\n\t\tif(pAd->TxPower[pAd->CommonCfg.CentralChannel-1].Power <= 20)\n\t\t\tpTxALCData->TSSI_USE_HVGA = 1;\n\t\telse\n\t\t\tpTxALCData->TSSI_USE_HVGA = 0;\n#else\n\t\tif(pAd->TxPower[pAd->CommonCfg.Channel-1].Power <= 20)\n\t\t\tpTxALCData->TSSI_USE_HVGA = 1;\n\t\telse\n\t\t\tpTxALCData->TSSI_USE_HVGA = 0;\n#endif /* DOT11_N_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI slope = 0x%x, offset[0] = 0x%x, offset[1] = 0x%x, offset[2] = 0x%x, TSSI_USE_HVGA = %x\\n\",\n\t\tpTxALCData->TssiSlope, pTxALCData->MT7601_TSSI_OFFSET[0], pTxALCData->MT7601_TSSI_OFFSET[1], \n\t\tpTxALCData->MT7601_TSSI_OFFSET[2], pTxALCData->TSSI_USE_HVGA));\n\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TX0_TSSI_OFFSET, Value);\n\tpTxALCData->MT7601_TSSI_T0_Delta_Offset = ((CHAR)(Value & 0xFF)) * 1024;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI T0 Delta offset = %d\\n\", pTxALCData->MT7601_TSSI_T0_Delta_Offset));\n\n\tRTMP_IO_READ32(pAd, TX_ALC_CFG_1, &Value);\n\tinit_offset = ( (pTxALCData->TSSI0_DB * pTxALCData->TssiSlope) + pTxALCData->MT7601_TSSI_OFFSET[1]) / 4096;\n\tinit_offset = -(init_offset-10);\n\t\n\tif(init_offset < -0x20)\n\t\tinit_offset = 0x20;\n\telse if(init_offset > 0x1f)\n\t\tinit_offset = 0x1f;\n\t\n\tValue = (Value & ~0x3F) | (init_offset & 0x3F);\n\tpTxALCData->InitTxAlcCfg1 = Value;\n\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_1, Value);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Init MAC 13b4: 0x%x\\n\", Value));\t\t\n\n\tMT7601_InitPAModeTable(pAd);\n}\n\n\nBOOLEAN MT7601_GetTssiCompensationParam(\n\tIN \t\tPRTMP_ADAPTER \t\tpAd, \n\tOUT \tPCHAR \t\t\t\tTssiLinear0,\n\tOUT \tPCHAR \t\t\t\tTssiLinear1, \n\tOUT \tPINT32 \t\t\t\tTargetPower)\n{\n\tUCHAR RFReg, BBPReg;\n\tUCHAR PacketType;\n\tUCHAR BbpR47;\n\tUCHAR BBPR4, BBPR178;\n\tUCHAR TxRate;\n\tINT32 Power;\n\tUINT count;\n\tUINT32 ret;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\n\tif ( pTxALCData->TssiTriggered == 0 )\n\t{\n\t\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD) )\n\t\t{\n\t\t\tMT7601_EnableTSSI(pAd);\n\t\t\tpTxALCData->TssiTriggered = 1;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPReg);\t\n\tif(BBPReg & 0x10)\n\t{\n\t\t//printk(\"#\\n\");\n\n\t\treturn FALSE;\n\t}\n\n\t/* 4. Read TSSI */\t\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BbpR47);\n\tBbpR47 = (BbpR47 & ~0x07);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, TssiLinear0);\n\n\n\t/* 5. Read Temperature */\n\tBbpR47 = (BbpR47 & ~0x07) | 0x04;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &(pAd->chipCap.CurrentTemperBbpR49));\n\n\tBbpR47 = (BbpR47 & ~0x07) | 0x01;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &PacketType);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TSSI = 0x%X\\n\", *TssiLinear0));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"temperature = 0x%X\\n\", pAd->chipCap.CurrentTemperBbpR49));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"PacketType = 0x%X\\n\", PacketType));\n\n\tpTxALCData->TssiTriggered = 0;\n\n#ifdef DOT11_N_SUPPORT\n\tPower = pAd->TxPower[pAd->CommonCfg.CentralChannel-1].Power;\n#else\n\tPower = pAd->TxPower[pAd->CommonCfg.Channel-1].Power ;\n#endif /* DOT11_N_SUPPORT */\t\n\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"Channel Desire Power = %d\\n\", Power));\n\n\tswitch ( PacketType & 0x03)\n\t{\n\t\tcase 0:\n\t\t\tTxRate = (PacketType >> 4) & 0x03;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tx_11b_rate: %x\\n\", TxRate));\n\t\t\tswitch (TxRate)\n\t\t\t{\n\t\t\t\tcase 0:\t// 1 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_CCK_1M : BW20_MCS_POWER_CCK_1M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_1M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\t// 2 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_CCK_2M : BW20_MCS_POWER_CCK_2M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_2M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\t// 5.5 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_CCK_5M : BW20_MCS_POWER_CCK_5M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_5M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\t// 11Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_CCK_11M : BW20_MCS_POWER_CCK_11M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_CCK_11M;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPR4);\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R178, &BBPR178);\n\t\t\tif ( BBPR4 & 0x20 )\n\t\t\t{\n\t\t\t\tif ( BBPR178 == 0 )\n\t\t\t\t{\n\t\t\t\t\tPower += 9830;\t\t// 8192 * 1.2\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPower += 18022;\t\t// 8192 * 2.2\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( BBPR178 == 0 )\n\t\t\t\t{\n\t\t\t\t\tPower += 24576;\t\t// 8192 * 3\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPower += 819;\t\t/// 8192 * 0.1\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tTxRate = (PacketType >> 4) & 0x0F;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tx_11g_rate: %x\\n\", TxRate));\n\t\t\tswitch ( TxRate )\n\t\t\t{\n\t\t\t\tcase 0xB:\t// 6 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_6M : BW20_MCS_POWER_OFDM_6M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_6M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xF:\t// 9 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_9M : BW20_MCS_POWER_OFDM_9M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_9M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xA:\t// 12 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_12M : BW20_MCS_POWER_OFDM_12M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_12M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xE:\t// 18 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_18M : BW20_MCS_POWER_OFDM_18M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_18M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x9:\t// 24 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_24M : BW20_MCS_POWER_OFDM_24M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_24M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xD:\t// 36 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_36M : BW20_MCS_POWER_OFDM_36M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_36M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x8:\t// 48 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_48M : BW20_MCS_POWER_OFDM_48M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_48M;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xC:\t// 54 Mbps\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_OFDM_54M : BW20_MCS_POWER_OFDM_54M;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_OFDM_54M;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tBbpR47 = (BbpR47 & ~0x07) | 0x02;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpR47);\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &TxRate);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tx_11n_rate: %x\\n\", TxRate));\n\t\t\tTxRate &= 0x7F;\t\t\t\t// TxRate[7] is bandwidth\n\t\t\tswitch ( TxRate )\n\t\t\t{\n\t\t\t\tcase 0x0:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS0: BW20_MCS_POWER_HT_MCS0;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x1:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS1: BW20_MCS_POWER_HT_MCS1;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x2:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS2: BW20_MCS_POWER_HT_MCS2;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x3:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS3: BW20_MCS_POWER_HT_MCS3;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS3;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x4:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS4: BW20_MCS_POWER_HT_MCS4;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS4;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x5:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS5: BW20_MCS_POWER_HT_MCS5;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS5;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x6:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS6: BW20_MCS_POWER_HT_MCS6;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS6;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x7:\n\t\t\t\t\tPower += (pAd->CommonCfg.BBPCurrentBW == BW_40)? BW40_MCS_POWER_HT_MCS7: BW20_MCS_POWER_HT_MCS7;\n\t\t\t\t\tPower = Power << 12;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel PWR + MCS PWR = %x\\n\", Power));\n\t\t\t\t\tPower += RF_PA_MODE_HT_MCS7;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPReg);\n\tswitch ( BBPReg & 0x3 )\n\t{\n\t\tcase 1:\n\t\t\tPower -= 49152;\t\t// -6 dB*8192\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tPower -= 98304;\t\t//-12 dB*8192\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tPower += 49152;\t\t// 6 dB*8192\n\t\t\tbreak;\n\t\tcase 0:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tPower += pTxALCData->MT7601_TSSI_T0_Delta_Offset;\n\n\t*TargetPower = Power;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TargetPower: 0x%x(%d)\\n\", *TargetPower, *TargetPower));\n\n\treturn TRUE;\n\t\n}\n\nVOID MT7601_AsicTxAlcGetAutoAgcOffset(\n\tIN PRTMP_ADAPTER \t\t\tpAd,\n\tIN PCHAR\t\t\t\t\tpDeltaPwr,\n\tIN PCHAR\t\t\t\t\tpTotalDeltaPwr,\n\tIN PCHAR\t\t\t\t\tpAgcCompensate,\n\tIN PCHAR \t\t\t\t\tpDeltaPowerByBbpR1)\n{\n\tINT32 TargetPower, CurrentPower, PowerDiff;\n\tUCHAR TssiLinear0, TssiLinear1;\n\tCHAR tssi_offset;\n\tINT16 tssi_db, tssi_m_dc;\n\tUINT32 value;\n\tUCHAR BBPReg;\n\tMT7601_TX_ALC_DATA *pTxALCData = &pAd->chipCap.TxALCData;\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\tif ( pAd->TxPowerCtrl.bInternalTxALC == FALSE )\n\t\treturn;\n\n\tif (pAd->Mlme.OneSecPeriodicRound % 4 == 0)\n\t{\n              // if base power is lower than 10 dBm use High VGA\n#ifdef DOT11_N_SUPPORT\n\t\tif(pAd->TxPower[pAd->CommonCfg.CentralChannel-1].Power <= 20)\n\t\t\tpTxALCData->TSSI_USE_HVGA = 1;\n\t\telse\n\t\t\tpTxALCData->TSSI_USE_HVGA = 0;\n#else\n\t\tif(pAd->TxPower[pAd->CommonCfg.Channel-1].Power <= 20)\n\t\t\tpTxALCData->TSSI_USE_HVGA = 1;\n\t\telse\n\t\t\tpTxALCData->TSSI_USE_HVGA = 0;\n#endif /* DOT11_N_SUPPORT */\n\n\t\tif (MT7601_GetTssiCompensationParam(pAd, &TssiLinear0 , &TssiLinear1, &TargetPower) == FALSE )\n\t\t\treturn;\n\t\t\n\t\ttssi_m_dc = TssiLinear0 - ((pTxALCData->TSSI_USE_HVGA == 1) ? pTxALCData->TssiDC0_HVGA : pTxALCData->TssiDC0);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tssi_m_dc: %d\\n\", tssi_m_dc));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TssiLinear0: %d\\n\", TssiLinear0));\n\t\tif ( pTxALCData->TSSI_USE_HVGA == 1 )\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TssiDC0_HVGA: %d\\n\", pTxALCData->TssiDC0_HVGA));\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TssiDC0: %d\\n\", pTxALCData->TssiDC0));\n\t\t\n\t\ttssi_db = lin2dBd(tssi_m_dc);\n\n#ifdef DOT11_N_SUPPORT\n\t\tif ( pAd->CommonCfg.CentralChannel <= 4 )\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[0];\n\t\telse if ( pAd->CommonCfg.CentralChannel >= 9 )\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[2];\n\t\telse\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[1];\n#else\n\t\tif ( pAd->CommonCfg.Channel <= 4 )\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[0];\n\t\telse if ( pAd->CommonCfg.Channel >= 9 )\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[2];\n\t\telse\n\t\t\ttssi_offset = pTxALCData->MT7601_TSSI_OFFSET[1];\n#endif /* DOT11_N_SUPPORT */\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tssi_offset: %d\\n\", tssi_offset));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tssi_offset<<9: %d\\n\", tssi_offset<<9));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TssiSlope: %d\\n\", pTxALCData->TssiSlope));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tssi_db: %d\\n\", tssi_db));\n              if(pTxALCData->TSSI_USE_HVGA == 1)\n  \t\t\ttssi_db -= pTxALCData->TSSI_DBOFFSET_HVGA;\n\t\t\t  \n\t\tCurrentPower = (pTxALCData->TssiSlope*tssi_db) + (tssi_offset << 9);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CurrentPower: %d\\n\", CurrentPower));\n  \t\t\t\n\t\tPowerDiff = TargetPower - CurrentPower;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PowerDiff: %d\\n\", PowerDiff));\n\n\t\tif((TssiLinear0 > 126) && ( PowerDiff > 0)) \t\t\t// upper saturation\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s :: upper saturation.\\n\", __FUNCTION__));\n\t\t\tPowerDiff = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//if(((TssiLinear0 -TssiDC0) < 1) && (PowerDiff < 0)) \t// lower saturation\n\t\t\tif(((TssiLinear0 -((pTxALCData->TSSI_USE_HVGA == 1) ? pTxALCData->TssiDC0_HVGA : pTxALCData->TssiDC0)) < 1) && (PowerDiff < 0)) \t// lower saturation\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s :: lower saturation.\\n\", __FUNCTION__));\n\t\t\t\tPowerDiff = 0;\n\t\t\t}\n\t\t}\n\n\t\tif( ((pTxALCData->PowerDiffPre ^ PowerDiff) < 0 )\n                  && ( (PowerDiff  < 4096) && (PowerDiff  > -4096))\t\t\t// +- 0.5\n\t\t   && ( (pTxALCData->PowerDiffPre < 4096) && (pTxALCData->PowerDiffPre > -4096)))\t\t// +- 0.5\n\t\t{ \n\t\t\tif((PowerDiff > 0) && ((PowerDiff + pTxALCData->PowerDiffPre) >= 0))\n\t\t\t\tPowerDiff = 0;\n\t\t\telse if((PowerDiff < 0) && ((PowerDiff + pTxALCData->PowerDiffPre) < 0))\n\t\t\t\tPowerDiff = 0;\n\t\t\telse\n\t\t\t\tpTxALCData->PowerDiffPre = PowerDiff;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tpTxALCData->PowerDiffPre =  PowerDiff;\n\t\t}\n\t\t\n\t\tPowerDiff = PowerDiff + ((PowerDiff>0)?2048:-2048);\n\t\tPowerDiff = PowerDiff / 4096;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"final PowerDiff: %d(0x%x)\\n\", PowerDiff, PowerDiff));\n\n\t\tRTMP_IO_READ32(pAd, TX_ALC_CFG_1, &value);\n\t\tCurrentPower = (value & 0x3F);\n\t\tCurrentPower = CurrentPower > 0x1F ? CurrentPower - 0x40 : CurrentPower;\n\t\tPowerDiff += CurrentPower;\n\t\tif ( PowerDiff > 31 )\n\t\t\tPowerDiff = 31;\n\t\tif ( PowerDiff < -32 )\n\t\t\tPowerDiff = -32;\n\t\t//PowerDiff = PowerDiff + (value & 0x3F);\n\t\tvalue = (value & ~0x3F) | (PowerDiff & 0x3F);\n\t\tRTMP_IO_WRITE32(pAd, TX_ALC_CFG_1, value);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MAC 13b4: 0x%x\\n\", value));\t\t\n\n\t\t//MT7601AsicTemperatureCompensation(pAd);\n\n\t\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD) )\n\t\t{\n\t\t\tMT7601_EnableTSSI(pAd);\n\t\t\tpTxALCData->TssiTriggered = 1;\n\t\t}\n\n\t}\n\n\n}\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\nINT MT7601_Bootup_Read_Temperature(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tCHAR*\t\t\tTemperature)\n{\n\tUINT32\tMAC0504, MAC050C;\n\tUCHAR\tBBPReg;\n\tint i;\n\n\tRTMP_IO_READ32(pAd, 0x50C, &MAC050C);\n\tRTMP_IO_READ32(pAd, 0x504, &MAC0504);\n\n\tRTMP_IO_WRITE32(pAd, 0x504, 0x0);\n\tRTMP_IO_WRITE32(pAd, 0x50C, 0x10);\n\tRTMP_IO_WRITE32(pAd, 0x504, 0x10);\n\n\t/* BBP R47[4] = 1 */\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPReg);\n\tBBPReg &= (~0x7f);\n\tBBPReg |= 0x10;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPReg);\n\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, 0x40);\n\n\ti = 100;\n\twhile ( i > 0 )\n\t{\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPReg);\n\t\tif( (BBPReg & 0x10) == 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\ti--;\n\t}\n\n\tBBPReg = (BBPReg & ~0x07) | 0x04;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPReg);\n\tRTMPusecDelay(500);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, Temperature);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Boot up temperature = 0x%X\\n\", *Temperature));\n\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, 0x0);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BBPReg);\n\tBBPReg |= 0x2;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BBPReg);\n\tBBPReg &= ~0x2;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BBPReg);\n\n\tRTMP_IO_WRITE32(pAd, 0x504, 0);\n\tRTMP_IO_WRITE32(pAd, 0x50C, MAC050C);\n\tRTMP_IO_WRITE32(pAd, 0x504, MAC0504);\n\n\treturn TRUE;\n}\n\n\nINT MT7601_Read_Temperature(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tCHAR*\t\t\tTemperature)\n{\n\tUCHAR\tBBPReg;\n\tint i;\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\tif ( (pAd->chipCap.TxALCData.TssiTriggered == 1)  && ( pAd->TxPowerCtrl.bInternalTxALC == TRUE ) )\n\t{\n\t\t*Temperature = pAd->chipCap.CurrentTemperBbpR49;\n\t}\n\telse\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t{\n\t\t/* BBP R47[4] = 1 */\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPReg);\n\t\tBBPReg &= (~0x7f);\n\t\tBBPReg |= 0x10;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPReg);\n\n\t\ti = 100;\n\t\twhile ( i > 0 )\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPReg);\n\t\t\tif( (BBPReg & 0x10) == 0)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ti--;\n\t\t}\n\n\t\tBBPReg = (BBPReg & ~0x07) | 0x04;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPReg);\n\t\tRTMPusecDelay(500);\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, Temperature);\n\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"temperature = 0x%X\\n\", *Temperature));\n\t}\n\n\treturn TRUE;\n}\n\n\nVOID MT7601SetRxAnt(\n    IN PRTMP_ADAPTER    pAd,\n    IN UCHAR            Ant)\n{\n\tUCHAR Val;\n\n    if ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))  ||\n        (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))   ||\n        (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) ||\n        (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n    {\n        return;\n    }\n\n   /* For PPAD Debug, BBP R153[7] = 1 --> Main Ant, R153[7] = 0 --> Aux Ant */\n   RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, 0x00); /* Disable ANTSW_OFDM */\n   RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, 0x00); /* Disable ANTSW_CCK */\n   RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, 0x00); /* Clear R154[4], Rx Ant is not bound to the previous rx packet selected Ant */\n\n   if (Ant == 0)\n   {\n       RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R152, &Val);\n\t   Val &= ~0x80;\n       RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, Val); /* Main Ant */\n       DBGPRINT(RT_DEBUG_OFF, (\"\\x1b[31m%s: MT7601 --> switch to main\\x1b[m\\n\", __FUNCTION__));\n   }\n   else\n   {\n       RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R152, &Val);\n\t   Val |= 0x80;\n       RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, Val); /* Aux Ant */\n       DBGPRINT(RT_DEBUG_OFF, (\"\\x1b[31m%s: MT7601 --> switch to aux\\x1b[m\\n\", __FUNCTION__));\n   }\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize MT7601.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID MT7601_Init(RTMP_ADAPTER *pAd)\n{\n\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tUINT32 Value;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-->%s():\\n\", __FUNCTION__));\n\t\n\tpAd->RfIcType = RFIC_UNKNOWN;\n\t/* \n\t\tInit chip capabilities\n\t*/\n\tRTMP_IO_READ32(pAd, 0x00, &Value);\t\n\tpChipCap->ChipID = Value;\n\n\tpChipCap->MaxNss = 1;\n\tpChipCap->TXWISize = 20;\n\tpChipCap->RXWISize = 24;\n\t// TODO: check WPDMABurstSIZE???\n\tpChipCap->WPDMABurstSIZE = 3;\n\t\n\tpChipCap->SnrFormula = SNR_FORMULA2;\n\tpChipCap->FlgIsHwWapiSup = TRUE;\n\tpChipCap->VcoPeriod = 10;\n\tpChipCap->FlgIsVcoReCalMode = VCO_CAL_MODE_3;\n\tpChipCap->FlgIsHwAntennaDiversitySup = TRUE;\n\tpChipCap->FlgSwBasedPPAD = TRUE;\n#ifdef STREAM_MODE_SUPPORT\n\tpChipCap->FlgHwStreamMode = FALSE;\n#endif /* STREAM_MODE_SUPPORT */\n#ifdef TXBF_SUPPORT\n\tpChipCap->FlgHwTxBfCap = FALSE;\n#endif /* TXBF_SUPPORT */\n#ifdef FIFO_EXT_SUPPORT\n\tpChipCap->FlgHwFifoExtCap = TRUE;\n#endif /* FIFO_EXT_SUPPORT */\n\n#ifdef CONFIG_RX_CSO_SUPPORT\n\tpChipCap->asic_caps |= fASIC_CAP_CSO;\n#endif /* CONFIG_RX_CSO_SUPPORT */\n\n\tpChipCap->asic_caps |= (fASIC_CAP_PMF_ENC);\n\n\tpChipCap->phy_caps = fPHY_CAP_24G;\n\tpChipCap->phy_caps |= fPHY_CAP_HT;\n\n\t// TODO: check RfReg17WtMethod???\n\t//pChipCap->RfReg17WtMethod = RF_REG_WT_METHOD_STEP_ON;\n\n\tpChipCap->MaxNumOfRfId = 63;\n\tpChipCap->pRFRegTable = NULL;\n\n\tpChipCap->MaxNumOfBbpId = 255;\t\n\tpChipCap->pBBPRegTable = NULL;\n\tpChipCap->bbpRegTbSize = 0;\n\n#ifdef NEW_MBSSID_MODE\n\tpChipCap->MBSSIDMode = MBSSID_MODE1;\n#else\n\tpChipCap->MBSSIDMode = MBSSID_MODE0;\n#endif /* NEW_MBSSID_MODE */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n#ifndef MT7601FPGA\n\t/* Frequence Calibration */\n\tpChipCap->FreqCalibrationSupport = TRUE;\n\t/* BBP CR for Rx OFDM/CCK frequency offset report is unnecessary */\n\tpChipCap->FreqCalInitMode = FREQ_CAL_INIT_UNKNOW;\n\tpChipCap->FreqCalMode = FREQ_CAL_MODE2;\n\tpChipCap->RxWIFrqOffset = RXWI_FRQ_OFFSET_FIELD1;\n#endif /* MT7601FPGA */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef RTMP_EFUSE_SUPPORT\n\tpChipCap->EFUSE_USAGE_MAP_START = 0x1E0;\n\tpChipCap->EFUSE_USAGE_MAP_END = 0x1FC;      \n\tpChipCap->EFUSE_USAGE_MAP_SIZE = 29;\n\tpChipCap->EFUSE_DEFAULT_BIN = MT7601_EFUSE_DEFAULT_BIN;\n\tpChipCap->EFUSE_DEFAULT_BIN_SIZE = 0x100;\n#endif /* RTMP_EFUSE_SUPPORT */\n\n\tpChipCap->WlanMemmapOffset = 0x410000;\n\tpChipCap->InbandPacketMaxLen = 192;\n\n\tRTMP_DRS_ALG_INIT(pAd, RATE_ALG_GRP);\n\t\t\n\t/*\n\t\tFollowing function configure beacon related parameters\n\t\tin pChipCap\n\t\t\tFlgIsSupSpecBcnBuf / BcnMaxHwNum / \n\t\t\tWcidHwRsvNum / BcnMaxHwSize / BcnBase[]\n\t*/\n\trlt_bcn_buf_init(pAd);\n\n\t/*\n\t\tinit operator\n\t*/\n\n\t/* BBP adjust */\n\tpChipOps->ChipBBPAdjust = MT7601_ChipBBPAdjust;\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tpChipOps->ChipAGCAdjust = MT7601_ChipAGCAdjust;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Channel */\n\tpChipOps->ChipSwitchChannel = MT7601_ChipSwitchChannel;\n\tpChipOps->ChipAGCInit = MT7601_ChipAGCInit;\n\n\tpChipOps->AsicMacInit = NICInitMT7601MacRegisters;\n\tpChipOps->AsicBbpInit = NICInitMT7601BbpRegisters;\n\tpChipOps->AsicRfInit = NICInitMT7601RFRegisters;\n\tpChipOps->AsicRfTurnOn = NULL;\n\n\tpChipOps->AsicHaltAction = NULL;\n\tpChipOps->AsicRfTurnOff = NULL;\n\tpChipOps->AsicReverseRfFromSleepMode = NULL;\n\tpChipOps->AsicResetBbpAgent = NULL;\n\t\n\t/* MAC */\n\n\t/* EEPROM */\n\tpChipOps->NICInitAsicFromEEPROM = MT7601_NICInitAsicFromEEPROM;\n\n\t/* Temperature Compensation */\n\tpChipOps->InitTemperCompensation = MT7601_InitTemperatureCompensation;\n\tpChipOps->TemperCompensation = MT7601_TemperatureCompensation;\n\t\n\t/* Antenna */\n\tpChipOps->AsicAntennaDefaultReset = MT7601_AsicAntennaDefaultReset;\n\n\t/* TX ALC */\n \tpChipOps->ATETssiCalibration = NULL;\n\tpChipOps->ATETssiCalibrationExtend = NULL;\n\tpChipOps->AsicTxAlcGetAutoAgcOffset = NULL;\n\tpChipOps->ATEReadExternalTSSI = NULL;\n\tpChipOps->TSSIRatio = NULL;\n\t\n\t/* Others */\n#ifdef CONFIG_STA_SUPPORT\n\tpChipOps->NetDevNickNameInit = MT7601_NetDevNickNameInit;\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CARRIER_DETECTION_SUPPORT\n\tpAd->chipCap.carrier_func = TONE_RADAR_V2;\n\tpChipOps->ToneRadarProgram = ToneRadarProgram_v2;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\t/* Chip tuning */\n\tpChipOps->RxSensitivityTuning = NULL;\n#ifdef RTMP_INTERNAL_TX_ALC\n\tpChipOps->InitDesiredTSSITable = MT7601_InitDesiredTSSITable;\n\tpChipOps->AsicTxAlcGetAutoAgcOffset = MT7601_AsicTxAlcGetAutoAgcOffset;\n\tpChipCap->TxALCData.TssiSlope = 0;\n\tpChipCap->TxALCData.TssiDC0 = 0;\n\tpChipCap->TxALCData.TssiDC0_HVGA = 0;\n\tpChipCap->TxALCData.TSSI_USE_HVGA = 0;\n\tpChipCap->TxALCData.PowerDiffPre = 100;\n#endif /* RTMP_INTERNAL_TX_ALC */\n\tpChipOps->AsicGetTxPowerOffset = AsicGetTxPowerOffset;\n\n\tpChipOps->AsicExtraPowerOverMAC = MT7601_AsicExtraPowerOverMAC;\n\n\tpChipOps->SetRxAnt = MT7601SetRxAnt;\n\n\n\tpChipOps->DisableTxRx = MT7601DisableTxRx;\n\n#ifdef RTMP_USB_SUPPORT\n\tpChipOps->AsicRadioOn = MT7601UsbAsicRadioOn;\n\tpChipOps->AsicRadioOff = MT7601UsbAsicRadioOff;\n#endif\n\n\n#ifdef RTMP_USB_SUPPORT\n\tpChipOps->loadFirmware = USBLoadFirmwareToAndes;\n#endif\n\n\t//pChipOps->sendCommandToMcu = AsicSendCmdToAndes;\n\t//pChipOps->loadFirmware = NULL;\n#ifdef CONFIG_ANDES_SUPPORT\n\tpChipCap->WlanMemmapOffset = 0x410000;\n\tpChipCap->InbandPacketMaxLen = 192;\n\tpChipCap->CmdRspRxRing = RX_RING1;\n#endif\n\tpChipCap->MCUType = ANDES;\n\tpChipCap->FWImageName = MT7601_FirmwareImage;\n\t\n/* Following callback functions already initiailized in RtmpChipOpsEepromHook( ) */\n\t/*  Calibration access related callback functions */\n/*\n\tint (*eeinit)(struct _RTMP_ADAPTER *pAd);\n\tint (*eeread)(struct _RTMP_ADAPTER *pAd, USHORT offset, PUSHORT pValue);\n\tint (*eewrite)(struct _RTMP_ADAPTER *pAd, USHORT offset, USHORT value);\n*/\n\t/* MCU related callback functions */\n/*\n\tint (*loadFirmware)(struct _RTMP_ADAPTER *pAd);\n\tint (*eraseFirmware)(struct _RTMP_ADAPTER *pAd);\n\tint (*sendCommandToMcu)(struct _RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1, BOOLEAN FlgIsNeedLocked);\n*/\n\n/* \n\tFollowing callback functions already initiailized in RtmpChipOpsHook() \n\t1. Power save related\n*/\n#ifdef GREENAP_SUPPORT\n\tpChipOps->EnableAPMIMOPS = NULL;\n\tpChipOps->DisableAPMIMOPS = NULL;\n#endif /* GREENAP_SUPPORT */\n\t// TODO: ------Upper parameters are not finialized yet!!\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tpChipOps->AsicMeasureFalseCCA = MT7601_AsicMeasureFalseCCA;\n\tpChipOps->AsicMitigateMicrowave = MT7601_AsicMitigateMicrowave;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n#ifdef HDR_TRANS_SUPPORT\n\tif (1) {\n\t\tUINT8 cnt = HT_RX_WCID_SIZE/HT_RX_WCID_OFFSET;\n\t\tUINT32 RegVal;\n\n\t\t/* enable TX/RX Header Translation */\n\t\tRTMP_IO_WRITE32(pAd, HT_RX_WCID_EN_BASE , 0xFF);\t/* all RX WCID enable */\n\n\t\t/* black list - skip EAP-888e/DLS-890d */\n\t\tRTMP_IO_WRITE32(pAd, HT_RX_BL_BASE, 0x888e890d);\n\t\t//RTMP_IO_WRITE32(pAd, HT_RX_BL_BASE, 0x08000806);\n\n\t\t/* tsc conrotl */\n/*\n\t\tRTMP_IO_READ32(pAd, 0x250, &RegVal);\n\t\tRegVal |= 0x6000;\n\t\tRTMP_IO_WRITE32(pAd, 0x250, RegVal);\n*/\n\t}\t\n#endif /* HDR_TRANS_SUPPORT */\n\n#ifdef NEW_WOW_SUPPORT\n\tpChipOps->AsicWOWEnable = RT28xxAndesWOWEnable;\n\tpChipOps->AsicWOWDisable = RT28xxAndesWOWDisable;\n#endif /* NEW_WOW_SUPPORT */\n\n}\n\n\n#ifdef MICROWAVE_OVEN_SUPPORT\nVOID MT7601_AsicMeasureFalseCCA(\n\tIN PRTMP_ADAPTER pAd\n)\n{\n\tUINT32 reg;\n\t/* restore LAN gain*/\n\t//printk(\"Stored_BBP_R65=%x @%s \\n\", pAd->CommonCfg.MO_Cfg.Stored_BBP_R65, __FUNCTION__);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R65, pAd->CommonCfg.MO_Cfg.Stored_BBP_R65);\n\t/* restore RF LPF threshold */\n\trlt_rf_write(pAd, RF_BANK5, RF_R06, pAd->CommonCfg.MO_Cfg.Stored_RF_B5_R6);\n\trlt_rf_write(pAd, RF_BANK5, RF_R07, pAd->CommonCfg.MO_Cfg.Stored_RF_B5_R7);\n\t\n\t/* clear false cca counter */\n\tRTMP_IO_READ32(pAd, RX_STA_CNT1, &reg);\n\n\t/* reset false CCA counter */\n\tpAd->CommonCfg.MO_Cfg.nFalseCCACnt = 0;\n}\n\n\nVOID MT7601_AsicMitigateMicrowave(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT8\tRegValue;\n\t//printk(\"Detect Microwave...\\n\");\n\t/* set middle gain */\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R65, &RegValue);\n\tRegValue |= 0x08;\n\tRegValue &= 0xFB; /*BBP_R65[3:2] from 3 into 2 */\n\t/* narrow down RF LPF */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R65, RegValue);\n\trlt_rf_write(pAd, RF_BANK5, RF_R06, 0x3F);\n\trlt_rf_write(pAd, RF_BANK5, RF_R07, 0x3F);\n\t\n}\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n#endif /* MT7601 */\n\n"
  },
  {
    "path": "src/chips/rtmp_chip.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt_chip.c\n\n\tAbstract:\n\tRalink Wireless driver CHIP related functions\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n#include \"rt_config.h\"\n\n\n\nFREQUENCY_ITEM RtmpFreqItems3020[] =\n{\t\n\t/* ISM : 2.4 to 2.483 GHz,  11g */\n\t/*-CH---N-------R---K-----------*/\n\t{1,    241,  2,  2},\n\t{2,    241,\t 2,  7},\n\t{3,    242,\t 2,  2},\n\t{4,    242,\t 2,  7},\n\t{5,    243,\t 2,  2},\n\t{6,    243,\t 2,  7},\n\t{7,    244,\t 2,  2},\n\t{8,    244,\t 2,  7},\n\t{9,    245,\t 2,  2},\n\t{10,   245,\t 2,  7},\n\t{11,   246,\t 2,  2},\n\t{12,   246,\t 2,  7},\n\t{13,   247,\t 2,  2},\n\t{14,   248,\t 2,  4},\n};\n\nFREQUENCY_ITEM FreqItems3020_Xtal20M[] =\n{\t\n\t/*\n\t * RF_R08:\n\t * <7:0>: pll_N<7:0>\n\t *\n\t * RF_R09:\n\t * <3:0>: pll_K<3:0>\n\t * <4>: pll_N<8>\n\t * <7:5>pll_N<11:9>\n\t *\n\t */\n\t/*-CH---N--------R---N[7:4]K[3:0]------*/\n\t{1,    0xE2,     2,  0x14},\n\t{2,    0xE3,\t 2,  0x14},\n\t{3,    0xE4,\t 2,  0x14},\n\t{4,    0xE5,\t 2,  0x14},\n\t{5,    0xE6,\t 2,  0x14},\n\t{6,    0xE7,\t 2,  0x14},\n\t{7,    0xE8,\t 2,  0x14},\n\t{8,    0xE9,\t 2,  0x14},\n\t{9,    0xEA,\t 2,  0x14},\n\t{10,   0xEB,\t 2,  0x14},\n\t{11,   0xEC,\t 2,  0x14},\n\t{12,   0xED,\t 2,  0x14},\n\t{13,   0xEE,\t 2,  0x14},\n\t{14,   0xF0,\t 2,  0x18},\n};\n\nUCHAR\tNUM_OF_3020_CHNL = (sizeof(RtmpFreqItems3020) / sizeof(FREQUENCY_ITEM));\n\nFREQUENCY_ITEM *FreqItems3020 = RtmpFreqItems3020;\n\n#if defined(RT28xx) || defined(RT2883) \n/* Reset the RFIC setting to new series    */\nRTMP_RF_REGS RF2850RegTable[] = {\n\t/*\tch\t R1 \t\t R2 \t\t R3(TX0~4=0) R4*/\n\t\t{1,  0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b},\n\t\t{2,  0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f},\n\t\t{3,  0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b},\n\t\t{4,  0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f},\n\t\t{5,  0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b},\n\t\t{6,  0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f},\n\t\t{7,  0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b},\n\t\t{8,  0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f},\n\t\t{9,  0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b},\n\t\t{10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f},\n\t\t{11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b},\n\t\t{12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f},\n\t\t{13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b},\n\t\t{14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193},\n\n\t\t/* 802.11 UNI / HyperLan 2*/\n\t\t{36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3},\n\t\t{38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193},\n\t\t{40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183},\n\t\t{44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3},\n\t\t{46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b},\n\t\t{48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b},\n\t\t{52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193},\n\t\t{54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3},\n\t\t{56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b},\n\t\t{60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183},\n\t\t{62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193},\n\t\t{64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3}, /* Plugfest#4, Day4, change RFR3 left4th 9->5.*/\n\n\t\t/* 802.11 HyperLan 2*/\n\t\t{100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783},\n\t\t\n\t\t/* 2008.04.30 modified */\n\t\t/* The system team has AN to improve the EVM value */\n\t\t/* for channel 102 to 108 for the RT2850/RT2750 dual band solution.*/\n\t\t{102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793},\n\t\t{104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3},\n\t\t{108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193},\n\n\t\t{110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183},\n\t\t{112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b},\n\t\t{116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3},\n\t\t{118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193},\n\t\t{120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183},\n\t\t{124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193},\n\t\t{126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b}, /* 0x980ed1bb->0x980ed15b required by Rory 20070927*/\n\t\t{128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3},\n\t\t{132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b},\n\t\t{134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193},\n\t\t{136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b},\n\t\t{140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183},\n\n\t\t/* 802.11 UNII*/\n\t\t{149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7},\n\t\t{151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187},\n\t\t{153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f},\n\t\t{157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f},\n\t\t{159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7},\n\t\t{161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187},\n\t\t{165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197},\n\t\t{167, 0x98402ec4, 0x984c03d2, 0x98179855, 0x9815531f},\n\t\t{169, 0x98402ec4, 0x984c03d2, 0x98179855, 0x98155327},\n\t\t{171, 0x98402ec4, 0x984c03d6, 0x98179855, 0x98155307},\n\t\t{173, 0x98402ec4, 0x984c03d6, 0x98179855, 0x9815530f},\n\n\t\t/* Japan*/\n\t\t{184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b},\n\t\t{188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13},\n\t\t{192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b},\n\t\t{196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23},\n\t\t{208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13},\n\t\t{212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b},\n\t\t{216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23},\n\n\t\t/* still lack of MMAC(Japan) ch 34,38,42,46*/\n};\nUCHAR\tNUM_OF_2850_CHNL = (sizeof(RF2850RegTable) / sizeof(RTMP_RF_REGS));\n#endif /* defined(RT28xx) || defined(RT2883) */\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) \n\n/* The Tx power tuning entry*/\nconst TX_POWER_TUNING_ENTRY_STRUCT TxPowerTuningTableOrg[] = \n{\n/*\tidxTxPowerTable\t\tTx power control over RF\t\t\tTx power control over MAC*/\n/*\t(zero-based array)\t\t{ RF R12[4:0]: Tx0 ALC},\t\t\t{MAC 0x1314~0x1324}*/\n/*\t0\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-15}, \n/*\t1\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-15}, \n/*\t2\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-14}, \n/*\t3\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-14}, \n/*\t4\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-13}, \n/*\t5\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-13}, \n/*\t6\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-12}, \n/*\t7\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-12}, \n/*\t8\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-11}, \n/*\t9\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-11}, \n/*\t10\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-10}, \n/*\t11\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-10}, \n/*\t12\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-9}, \n/*\t13\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-9}, \n/*\t14\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-8}, \n/*\t15\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-8}, \n/*\t16\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-7}, \n/*\t17\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-7}, \n/*\t18\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-6}, \n/*\t19\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-6}, \n/*\t20\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-5}, \n/*\t21\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-5}, \n/*\t22\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-4}, \n/*\t23\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-4}, \n/*\t24\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-3}, \n/*\t25\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-3}, \n/*\t26\t*/\t\t\t\t{0x00,\t\t\t\t\t\t\t-2}, \n/*\t27\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-2}, \n/*\t28\t*/\t\t\t\t{0x00, \t\t\t\t\t\t\t-1}, \n/*\t29\t*/\t\t\t\t{0x01, \t\t\t\t\t\t\t-1}, \n/*\t30\t*/\t\t\t\t{0x00,\t\t\t\t\t\t\t0}, \n/*\t31\t*/\t\t\t\t{0x01,\t\t\t\t\t\t\t0}, \n/*\t32\t*/\t\t\t\t{0x02,\t\t\t\t\t\t\t0}, \n/*\t33\t*/\t\t\t\t{0x03,\t\t\t\t\t\t\t0}, \n/*\t34\t*/\t\t\t\t{0x04,\t\t\t\t\t\t\t0}, \n/*\t35\t*/\t\t\t\t{0x05,\t\t\t\t\t\t\t0}, \n/*\t36\t*/\t\t\t\t{0x06,\t\t\t\t\t\t\t0}, \n/*\t37\t*/\t\t\t\t{0x07,\t\t\t\t\t\t\t0}, \n/*\t38\t*/\t\t\t\t{0x08,\t\t\t\t\t\t\t0}, \n/*\t39\t*/\t\t\t\t{0x09,\t\t\t\t\t\t\t0}, \n/*\t40\t*/\t\t\t\t{0x0A,\t\t\t\t\t\t\t0}, \n/*\t41\t*/\t\t\t\t{0x0B,\t\t\t\t\t\t\t0}, \n/*\t42\t*/\t\t\t\t{0x0C,\t\t\t\t\t\t\t0}, \n/*\t43\t*/\t\t\t\t{0x0D,\t\t\t\t\t\t\t0}, \n/*\t44\t*/\t\t\t\t{0x0E,\t\t\t\t\t\t\t0}, \n/*\t45\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t0}, \n/*\t46\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t1}, \n/*\t47\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t1}, \n/*\t48\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t2}, \n/*\t49\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t2}, \n/*\t50\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t3}, \n/*\t51\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t3}, \n/*\t52\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t4}, \n/*\t53\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t4}, \n/*\t54\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t5}, \n/*\t55\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t5}, \n/*\t56\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t6}, \n/*\t57\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t6}, \n/*\t58\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t7}, \n/*\t59\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t7}, \n/*\t60\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t8}, \n/*\t61\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t8}, \n/*\t62\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t9}, \n/*\t63\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t9}, \n/*\t64\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t10}, \n/*\t65\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t10}, \n/*\t66\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t11}, \n/*\t67\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t11}, \n/*\t68\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t12}, \n/*\t69\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t12}, \n/*\t70\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t13}, \n/*\t71\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t13}, \n/*\t72\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t14}, \n/*\t73\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t14}, \n/*\t74\t*/\t\t\t\t{0x0F-1,\t\t\t\t\t\t\t15}, \n/*\t75\t*/\t\t\t\t{0x0F,\t\t\t\t\t\t\t15}, \n};\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize specific beacon frame architecture.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpChipBcnSpecInit(RTMP_ADAPTER *pAd)\n{\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize normal beacon frame architecture.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpChipBcnInit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\n\tpChipCap->FlgIsSupSpecBcnBuf = FALSE;\n\tpChipCap->BcnMaxHwNum = 8;\n\tpChipCap->BcnMaxNum = (pChipCap->BcnMaxHwNum - MAX_MESH_NUM - MAX_APCLI_NUM);\n\tpChipCap->BcnMaxHwSize = 0x1000;\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd))\n\t{\n\t\tpChipCap->BcnBase[0] = 0xC000;\n\t\tpChipCap->BcnBase[1] = 0xC200;\n\t\tpChipCap->BcnBase[2] = 0xC400;\n\t\tpChipCap->BcnBase[3] = 0xC600;\n\t\tpChipCap->BcnBase[4] = 0xC800;\n\t\tpChipCap->BcnBase[5] = 0xCA00;\n\t\tpChipCap->BcnBase[6] = 0xCC00;\n\t\tpChipCap->BcnBase[7] = 0xCE00;\n\t} else\n#endif /* MT7601 */\n\t{\n\tpChipCap->BcnBase[0] = 0x7800;\n\tpChipCap->BcnBase[1] = 0x7A00;\n\tpChipCap->BcnBase[2] = 0x7C00;\n\tpChipCap->BcnBase[3] = 0x7E00;\n\tpChipCap->BcnBase[4] = 0x7200;\n\tpChipCap->BcnBase[5] = 0x7400;\n\tpChipCap->BcnBase[6] = 0x5DC0;\n\tpChipCap->BcnBase[7] = 0x5BC0;\n\t}\n\n\t/*\n\t\tIf the MAX_MBSSID_NUM is larger than 6,\n\t\tit shall reserve some WCID space(wcid 222~253) for beacon frames.\n\t\t-\tthese wcid 238~253 are reserved for beacon#6(ra6).\n\t\t-\tthese wcid 222~237 are reserved for beacon#7(ra7).\n\t*/\n#ifdef MT7601\n\tif ( IS_MT7601(pAd))\n\t\tpChipCap->WcidHwRsvNum = 127;\n\telse\n#endif\n\tif (pChipCap->BcnMaxNum == 8)\n\t\tpChipCap->WcidHwRsvNum = 222;\n\telse if (pChipCap->BcnMaxNum == 7)\n\t\tpChipCap->WcidHwRsvNum = 238;\n\telse\n\t\tpChipCap->WcidHwRsvNum = 255;\n\n\tpAd->chipOps.BeaconUpdate = RtmpChipWriteMemory;\n}\n\n\n#ifdef RLT_MAC\n/*\n========================================================================\nRoutine Description:\n\tInitialize specific beacon frame architecture.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID rlt_bcn_buf_init(RTMP_ADAPTER *pAd)\n{\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tpChipCap->FlgIsSupSpecBcnBuf = FALSE;\n\tpChipCap->BcnMaxHwNum = 16;\n#ifdef MT7601\n\tif ( IS_MT7601(pAd))\n\t\tpChipCap->WcidHwRsvNum = 127;\n\telse\n#endif\n\t\tpChipCap->WcidHwRsvNum = 255;\n\n/*\n\tIn 16-MBSS support mode, if AP-Client is enabled, \n\tthe last 8-MBSS would be occupied for AP-Client using.\n*/\n#ifdef APCLI_SUPPORT\n\tpChipCap->BcnMaxNum = (8 - MAX_MESH_NUM);\n#else\n\tpChipCap->BcnMaxNum = (pChipCap->BcnMaxHwNum - MAX_MESH_NUM);\n#endif /* APCLI_SUPPORT */\n\n\tpChipCap->BcnMaxHwSize = 0x2000;\n\n\tpChipCap->BcnBase[0] = 0xc000;\n\tpChipCap->BcnBase[1] = 0xc200;\n\tpChipCap->BcnBase[2] = 0xc400;\n\tpChipCap->BcnBase[3] = 0xc600;\n\tpChipCap->BcnBase[4] = 0xc800;\n\tpChipCap->BcnBase[5] = 0xca00;\n\tpChipCap->BcnBase[6] = 0xcc00;\n\tpChipCap->BcnBase[7] = 0xce00;\n\tpChipCap->BcnBase[8] = 0xd000;\n\tpChipCap->BcnBase[9] = 0xd200;\n\tpChipCap->BcnBase[10] = 0xd400;\n\tpChipCap->BcnBase[11] = 0xd600;\n\tpChipCap->BcnBase[12] = 0xd800;\n\tpChipCap->BcnBase[13] = 0xda00;\n\tpChipCap->BcnBase[14] = 0xdc00;\n\tpChipCap->BcnBase[15] = 0xde00;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t/* Record HW Null Frame offset */\n\t//pAd->NullBufOffset[0] = 0xd000;\n\tpAd->NullBufOffset[0] = 0xd000;\n\tpAd->NullBufOffset[1] = 0xd200;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\tpAd->chipOps.BeaconUpdate = RtmpChipWriteMemory;\n}\n#endif /* RLT_MAC */\n\n\n/*\n========================================================================\nRoutine Description:\n\twrite high memory.\n\tif firmware do not support auto high/low memory switching, we should switch to high memory by ourself.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tOffset\t\t\t- Memory offsets\n\tValue\t\t\t- Written value\n\tUnit\t\t\t\t- Unit in \"Byte\"\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpChipWriteHighMemory(\n\tIN RTMP_ADAPTER *pAd,\n\tIN USHORT Offset,\n\tIN UINT32 Value,\n\tIN UINT8 Unit)\n{\n#ifdef RTMP_MAC_USB\n\tswitch(Unit)\n\t{\n\t\tcase 1:\n\t\t\tRTUSBSingleWrite(pAd, Offset, Value, TRUE);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t{\n\t\t\tUINT16 ShortVal = (UINT16)Value;\n\t\t\tRTUSBMultiWrite(pAd, Offset, (UCHAR *) &ShortVal, 2, TRUE);\n\t\t\tbreak;\n\t\t}\n\t\tcase 4:\n\t\t\tRTUSBWriteMACRegister(pAd, Offset, Value, TRUE);\n\t\tdefault:\n\t\t\tbreak;\n\t}\n#endif /* RTMP_MAC_USB */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\twrite memory\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tOffset\t\t\t- Memory offsets\n\tValue\t\t\t- Written value\n\tUnit\t\t\t\t- Unit in \"Byte\"\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpChipWriteMemory(\n\tIN\tRTMP_ADAPTER\t*pAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tUINT32\t\t\tValue,\n\tIN\tUINT8\t\t\tUnit)\n{\n\tswitch(Unit)\n\t{\n\t\tcase 1:\n\t\t\tRTMP_IO_WRITE8(pAd, Offset, Value);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tRTMP_IO_WRITE16(pAd, Offset, Value);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tRTMP_IO_WRITE32(pAd, Offset, Value);\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\n#ifdef GREENAP_SUPPORT\nstatic VOID EnableAPMIMOPSv2(RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower)\n\t{\n\trtmp_bbp_set_mmps(pAd, ReduceCorePower);\n\trtmp_mac_set_mmps(pAd, ReduceCorePower);\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"EnableAPMIMOPSNew, 30xx changes the # of antenna to 1\\n\"));\n\t}\n\n\nstatic VOID DisableAPMIMOPSv2(RTMP_ADAPTER *pAd)\n\t{\n\trtmp_bbp_set_mmps(pAd, FALSE);\n\trtmp_mac_set_mmps(pAd, FALSE);\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"DisableAPMIMOPSNew, 30xx reserve only one antenna\\n\"));\n}\n\n\nstatic VOID EnableAPMIMOPSv1(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BOOLEAN ReduceCorePower)\n{\n\tUCHAR\tBBPR3 = 0,BBPR1 = 0;\n\tULONG\tTxPinCfg = 0x00050F0A;/*Gary 2007/08/09 0x050A0A*/\n\tUCHAR\tBBPR4=0;\n\tUCHAR\tCentralChannel;\n\n\n\n\tif(pAd->CommonCfg.Channel>14)\n\t\tTxPinCfg=0x00050F05;\n\t\t\n\tTxPinCfg &= 0xFFFFFFF3;\n\tTxPinCfg &= 0xFFFFF3FF;\n\tpAd->ApCfg.bGreenAPActive=TRUE;\n\n\tCentralChannel = pAd->CommonCfg.CentralChannel;\n\tDBGPRINT(RT_DEBUG_INFO, (\"Run with BW_20\\n\"));\n\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\tCentralChannel = pAd->CommonCfg.Channel;\n\n\t/* Set BBP registers to BW20 */\n\trtmp_bbp_set_bw(pAd, BW_20);\n\n\t/* RF Bandwidth related registers would be set in AsicSwitchChannel() */\n\tif (pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1)\n\t{\n\t\t/*Tx/Rx Stream*/\n\t\trtmp_bbp_set_txdac(pAd, 0);\n\t\trtmp_bbp_set_rxpath(pAd, 1);\n\t\t\n\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\n\t}\n\tAsicSwitchChannel(pAd, CentralChannel, FALSE);\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"EnableAPMIMOPS, 305x/28xx changes the # of antenna to 1\\n\"));\n}\n\n\nstatic VOID DisableAPMIMOPSv1(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\tUCHAR\tBBPR3=0,BBPR1=0;\n\tULONG\tTxPinCfg = 0x00050F0A; /* Gary 2007/08/09 0x050A0A */\n\tUCHAR\tCentralChannel;\n\tUINT32\tValue=0;\n\n\n\n\tif(pAd->CommonCfg.Channel>14)\n\t\tTxPinCfg=0x00050F05;\n\t/* Turn off unused PA or LNA when only 1T or 1R*/\n\tif (pAd->Antenna.field.TxPath == 1)\n\t\tTxPinCfg &= 0xFFFFFFF3;\n\tif (pAd->Antenna.field.RxPath == 1)\n\t\tTxPinCfg &= 0xFFFFF3FF;\n\n\tpAd->ApCfg.bGreenAPActive=FALSE;\n\n\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && (pAd->CommonCfg.Channel != 14))\n\t{\n\t\tINT ext_ch = EXTCHA_NONE;\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"Run with BW_40\\n\"));\n\t\t/* Set CentralChannel to work for BW40 */\n\t\tif (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t{\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;\n\t\t\text_ch = EXTCHA_ABOVE;\n\t\t}\n\t\telse if ((pAd->CommonCfg.Channel > 2) && (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW))\n\t\t{\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;\n\t\t\text_ch = EXTCHA_BELOW;\n\t\t}\n\t\tCentralChannel = pAd->CommonCfg.CentralChannel;\n\t\tAsicSetChannel(pAd, CentralChannel, BW_40, ext_ch, FALSE);\n\t}\n\n\t/*Tx Stream*/\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && (pAd->Antenna.field.TxPath == 2))\n\t\trtmp_bbp_set_txdac(pAd, 2);\n\telse\n\t\trtmp_bbp_set_txdac(pAd, 0);\n\n\t/*Rx Stream*/\n\trtmp_bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);\n\n\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"DisableAPMIMOPS, 305x/28xx reserve only one antenna\\n\"));\n}\n#endif /* GREENAP_SUPPORT */\n\n\nstatic VOID RxSensitivityTuning(RTMP_ADAPTER *pAd)\n{\n\tUCHAR R66 = 0x26 + GET_LNA_GAIN(pAd);\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);\n\t}\n\telse\n#endif /* RALINK_ATE */\n\t{\n\t\trtmp_bbp_set_agc(pAd, R66, RX_CHAIN_ALL);\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"turn off R17 tuning, restore to 0x%02x\\n\", R66));\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\nstatic UCHAR ChipAGCAdjust(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN CHAR\t\t\t\t\tRssi,\n\tIN UCHAR\t\t\t\tOrigR66Value)\n{\n\tUCHAR R66 = OrigR66Value;\n\tCHAR lanGain = GET_LNA_GAIN(pAd);\n\t\n\tif (pAd->LatchRfRegs.Channel <= 14)\n\t{\t/*BG band*/\n\t\tR66 = 0x2E + lanGain;\n\t\tif (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY)\n\t\t\tR66 += 0x10;\n\t}\n\telse\n\t{\t/*A band*/\n\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_20)\n\t\t\tR66 = 0x32 + (lanGain * 5) / 3;\n\t\telse\n\t\t\tR66 = 0x3A + (lanGain * 5) / 3;\n\n\t\tif (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY)\n\t\t\t\tR66 += 0x10;\n\t}\n\n\tif (OrigR66Value != R66)\n\t\trtmp_bbp_set_agc(pAd, R66, RX_CHAIN_ALL);\n\n\n\treturn R66;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nstatic VOID ChipBBPAdjust(RTMP_ADAPTER *pAd)\n{\n\tUCHAR rf_bw, ext_ch;\n\tUCHAR bbp_val;\n\n#ifdef DOT11_N_SUPPORT\n\tif (get_ht_cent_ch(pAd, &rf_bw, &ext_ch) == FALSE)\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t}\n\n\trtmp_bbp_set_bw(pAd, rf_bw);\n\n\t/*  TX/RX : control channel setting */\n\trtmp_mac_set_ctrlch(pAd, ext_ch);\n\trtmp_bbp_set_ctrlch(pAd, ext_ch);\n\n\t/* request by Gary 20070208 for middle and long range G Band*/\n#ifdef DOT11_N_SUPPORT\n\tif (rf_bw == BW_40)\n\t\tbbp_val = (pAd->CommonCfg.Channel > 14) ? 0x48 : 0x38;\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t\tbbp_val = (pAd->CommonCfg.Channel > 14) ? 0x40 : 0x38;\n\trtmp_bbp_set_agc(pAd, bbp_val, RX_CHAIN_ALL);\n\n\n\tif (pAd->MACVersion == 0x28600100)\n\t{\n#ifdef RT28xx\n\t\tRT28xx_ch_tunning(pAd, BW_40);\n#endif /* RT28xx */\n\t}\n\telse\n\t{\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x10);\n\t}\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): BW_%s, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \\n\",\n\t\t\t\t\t__FUNCTION__, (rf_bw == BW_40 ? \"40\" : \"20\"),\n\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth, \n\t\t\t\t\tpAd->CommonCfg.Channel, \n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA,\n\t\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset));\n\n\t/* request by Gary 20070208 for middle and long range A Band*/\n\tif (pAd->CommonCfg.Channel > 14)\n\t\tbbp_val = 0x1D;\n\telse\n\t\tbbp_val = 0x2D;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, 0x2D);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, 0x2D);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, 0x2D);\n\t/*RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x2D);*/\n}\n\n\nstatic VOID Default_ChipSwitchChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Channel,\n\tIN BOOLEAN bScan) \n{\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): dummy channel switch function!\\n\", __FUNCTION__));\n}\n\n\nstatic VOID Default_ChipAGCInit(RTMP_ADAPTER *pAd, UCHAR BandWidth)\n{\n\tUCHAR R66 = 0x30, lan_gain;\n\n\tlan_gain = GET_LNA_GAIN(pAd);\n\tif (pAd->LatchRfRegs.Channel <= 14)\n\t{\t// BG band\n\t\t{\n\t\t\tR66 = 0x2E + lan_gain;\n\t\t}\n\t}\n\telse\n\t{\t//A band\n\t\t{\t\n\t\t\tif (BandWidth == BW_20)\n\t\t\t\tR66 = (UCHAR)(0x32 + (lan_gain * 5) / 3);\n#ifdef DOT11_N_SUPPORT\n\t\t\telse\n\t\t\t\tR66 = (UCHAR)(0x3A + (lan_gain * 5) / 3);\n#endif // DOT11_N_SUPPORT //\n\t\t}\n\t}\n\trtmp_bbp_set_agc(pAd, R66, RX_CHAIN_ALL);\n\n}\n\n\nstatic VOID AsicAntennaDefaultReset(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN EEPROM_ANTENNA_STRUC\t*pAntenna)\n{\n\t{\n\n\t\tpAntenna->word = 0;\n\t\tpAntenna->field.RfIcType = RFIC_2820;\n\t\tpAntenna->field.TxPath = 1;\n\t\tpAntenna->field.RxPath = 2;\n\t}\n\tDBGPRINT(RT_DEBUG_WARN, (\"E2PROM error, hard code as 0x%04x\\n\", pAntenna->word));\t\n}\n\n\nVOID NetDevNickNameInit(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_MAC_USB\n\t\tsnprintf((PSTRING) pAd->nickname, sizeof(pAd->nickname), \"RT2870STA\");\n#endif /* RTMP_MAC_USB */\n#endif /* CONFIG_STA_SUPPORT */\n}\n\n\n\n\n#ifdef HW_ANTENNA_DIVERSITY_SUPPORT\nUINT32 SetHWAntennaDivsersity(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN BOOLEAN\t\t\t\tEnable)\n{\n\tif (Enable == TRUE)\n\t{\n\t\tUINT8 BBPValue = 0, RFValue = 0;\n\t\tUSHORT value;\n\n\t\t// RF_R29 bit7:6\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_GAIN, value);\n\t\t\n\t\tRT30xxReadRFRegister(pAd, RF_R29, &RFValue);\n\t\tRFValue &= 0x3f; // clear bit7:6\n\t\tRFValue |= (value << 6);\t\t\t\n\t\tRT30xxWriteRFRegister(pAd, RF_R29, RFValue);\n\n\t\t// BBP_R47 bit7=1\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPValue);\n\t\tBBPValue |= 0x80;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPValue);\n\t\n\t\tBBPValue = 0xbe;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);\n\t\tBBPValue = 0xb0;\t\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);\n\t\tBBPValue = 0x23;\t\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);\n\t\tBBPValue = 0x3a;\t\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R153, BBPValue);\n\t\tBBPValue = 0x10;\t\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);\n\t\tBBPValue = 0x3b;\t\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R155, BBPValue);\n\t\tBBPValue = 0x04;\t\t\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R253, BBPValue);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HwAnDi> Enable!\\n\"));\n\t}\n\telse\n\t{\n\t\tUINT8 BBPValue = 0;\n\n\t\t/*\n\t\t\tmain antenna: BBP_R152 bit7=1\n\t\t\taux antenna: BBP_R152 bit7=0\n\t\t */\n\t\tif (pAd->FixDefaultAntenna == 0)\n\t\t{\n\t\t\t/* fix to main antenna */\n\t\t\t/* do not care BBP R153, R155, R253 */\n\t\t\tBBPValue = 0x3e;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);\n\t\t\tBBPValue = 0x30;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);\n\t\t\tBBPValue = 0x23;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);\n\t\t\tBBPValue = 0x00;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* fix to aux antenna */\n\t\t\t/* do not care BBP R153, R155, R253 */\n\t\t\tBBPValue = 0x3e;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);\n\t\t\tBBPValue = 0x30;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);\n\t\t\tBBPValue = 0xa3;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);\n\t\t\tBBPValue = 0x00;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HwAnDi> Disable!\\n\"));\n\t}\n\n\treturn 0;\n}\n#endif // HW_ANTENNA_DIVERSITY_SUPPORT // \n\n\n\n\nINT WaitForAsicReady(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tUINT32 mac_val = 0, reg = MAC_CSR0;\n\tint idx = 0;\n\n#ifdef RT3290\t\n\tif (IS_RT3290(pAd))\n\t\treg = ASIC_VERSION;\n#endif /* RT3290 */\n\tdo\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\n\t\t\treturn FALSE;\n\t\t\n\t\tRTMP_IO_READ32(pAd, reg, &mac_val);\n\t\tif ((mac_val != 0x00) && (mac_val != 0xFFFFFFFF))\n\t\t\treturn TRUE;\n\n\t\tRTMPusecDelay(10);\n\t} while (idx++ < 100);\n\n\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t(\"%s(0x%x):AsicNotReady!\\n\",\n\t\t\t\t__FUNCTION__, mac_val));\n\t\n\treturn TRUE;\n}\n\n\nINT AsicGetMacVersion(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tUINT32 reg = MAC_CSR0;\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t\treg = 0x0;\n#endif /* RT3290 */\n\n\tif (WaitForAsicReady(pAd) == TRUE)\n\t{\n\t\tRTMP_IO_READ32(pAd, reg, &pAd->MACVersion);\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"MACVersion[Ver:Rev]=0x%08x\\n\",\n\t\t\t\t\tpAd->MACVersion));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s() failed!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize chip related information.\n\nArguments:\n\tpCB\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpChipOpsHook(VOID *pCB)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pCB;\n\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tUINT32 MacValue;\n\n\n\t/* sanity check */\n\tWaitForAsicReady(pAd);\n\tRTMP_IO_READ32(pAd, MAC_CSR0, &MacValue);\n\tpAd->MACVersion = MacValue;\t\n\n\t/* default init */\n\tRTMP_DRS_ALG_INIT(pAd, RATE_ALG_LEGACY);\n\n\n\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t{\n\t\tRT3290_Init(pAd);\n\t\tgoto done;\n\t}\n#endif /* RT290 */\n\n#ifdef RT8592\n\tif (IS_RT8592(pAd)) {\n\t\tRT85592_Init(pAd);\n\t\tgoto done;\n\t}\n#endif /* RT8592 */\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd)) {\n\t\tRT6590_Init(pAd);\n\t\tgoto done;\n\t}\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd)) {\n\t\tMT7601_Init(pAd);\n\t\tgoto done;\n\t}\n#endif /* MT7601 */\n\n#ifdef GREENAP_SUPPORT\n\tpChipOps->EnableAPMIMOPS = EnableAPMIMOPSv1;\n\tpChipOps->DisableAPMIMOPS = DisableAPMIMOPSv1;\n#endif /* GREENAP_SUPPORT */\n\n\t/* init default value whatever chipsets */\n\t/* default pChipOps content will be 0x00 */\n\tpChipCap->bbpRegTbSize = 0;\n\tpChipCap->MaxNumOfRfId = 31;\n\tpChipCap->MaxNumOfBbpId = 136;\n\tpChipCap->SnrFormula = SNR_FORMULA1;\n\tpChipCap->RfReg17WtMethod = RF_REG_WT_METHOD_NONE;\n\tpChipCap->TXWISize = 16;\n\tpChipCap->RXWISize = 16;\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)\n\tpChipCap->TxPowerTuningTable_2G = TxPowerTuningTableOrg;\n#ifdef A_BAND_SUPPORT\n\tpChipCap->TxPowerTuningTable_5G = TxPowerTuningTableOrg;\n#endif /* A_BAND_SUPPORT */\n#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */\n\tpChipOps->AsicMacInit = NULL;\n\tpChipOps->AsicBbpInit = NULL;\n\tpChipOps->AsicRfInit = NULL;\n\n#ifdef RTMP_EFUSE_SUPPORT\n\tpChipCap->EFUSE_USAGE_MAP_START = 0x2d0;\n\tpChipCap->EFUSE_USAGE_MAP_END = 0x2fc;      \n       \tpChipCap->EFUSE_USAGE_MAP_SIZE = 45;\n#endif /* RTMP_EFUSE_SUPPORT */\n\n\tpChipCap->VcoPeriod = 10;\n\tpChipCap->FlgIsVcoReCalMode = VCO_CAL_DISABLE;\n\tpChipCap->WPDMABurstSIZE = 2; /* default 64B */\n\tpChipCap->MBSSIDMode = MBSSID_MODE0; \n\n\n\tRtmpChipBcnInit(pAd);\n\n\tpChipOps->RxSensitivityTuning = RxSensitivityTuning;\n#ifdef CONFIG_STA_SUPPORT\n\tpChipOps->ChipAGCAdjust = ChipAGCAdjust;\n#endif /* CONFIG_STA_SUPPORT */\n\tpChipOps->ChipBBPAdjust = ChipBBPAdjust;\n\tpChipOps->ChipSwitchChannel = Default_ChipSwitchChannel;\n\n\t/* TX ALC */\n\tpChipCap->bTempCompTxALC = FALSE;\n\tpChipOps->AsicGetTxPowerOffset = NULL;\n\tpChipOps->InitDesiredTSSITable = NULL;\n\tpChipOps->AsicTxAlcGetAutoAgcOffset = NULL;\n\tpChipOps->AsicExtraPowerOverMAC = NULL;\n\n\tpChipOps->ChipAGCInit = Default_ChipAGCInit;\n\tpChipOps->AsicAntennaDefaultReset = AsicAntennaDefaultReset;\n\tpChipOps->NetDevNickNameInit = NetDevNickNameInit;\n\t/* Init value. If pChipOps->AsicResetBbpAgent==NULL, \"AsicResetBbpAgent\" as default. If your chipset has specific routine, please re-hook it at self init function */\n\tpChipOps->AsicResetBbpAgent = NULL;\n\n\tpChipOps->InitTemperCompensation = NULL;\n\tpChipOps->TemperCompensation = NULL;\n\n#ifdef RT28xx\n\tpChipOps->ChipSwitchChannel = RT28xx_ChipSwitchChannel;\n#endif /* RT28xx */\n#ifdef CARRIER_DETECTION_SUPPORT\n\tpChipCap->carrier_func = DISABLE_TONE_RADAR;\n\tpChipOps->ToneRadarProgram = NULL;\n#endif /* CARRIER_DETECTOIN_SUPPORT */\n#ifdef DFS_SUPPORT\n\tpChipCap->DfsEngineNum = 4;\n#endif /* DFS_SUPPORT */\n\tpChipOps->CckMrcStatusCtrl = NULL;\n\tpChipOps->RadarGLRTCompensate = NULL;\n\n\n\t/* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */\n\n\n\n#if defined(RT3883) || defined(RT3290) || defined(RT65xx) || defined(MT7601)\ndone:\n#endif /* defined(RT3883) || defined(RT3290) || defined(RT65xx) || define(MT7601) */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Chip specific bbpRegTbSize=%d!\\n\", pChipCap->bbpRegTbSize));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Chip VCO calibration mode = %d!\\n\", pChipCap->FlgIsVcoReCalMode));\n}\n"
  },
  {
    "path": "src/common/action.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\taction.c\n \n    Abstract:\n    Handle association related requests either from WSTA or from local MLME\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n\tJan Lee\t\t2006\t  \tcreated for rt2860\n */\n\n#include \"rt_config.h\"\n#include \"action.h\"\n\nextern UCHAR  ZeroSsid[32];\n#ifdef IWSC_SUPPORT\nextern UCHAR  IWSC_ACTION_OUI[];\n#endif // IWSC_SUPPORT //\n\n#ifdef P2P_SUPPORT\n/* Group Formation Action */\n\nextern VOID P2pPeerGoNegoReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerGoNegoRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerGoNegoConfirmAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerProvisionReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerProvisionRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerDeviceDiscRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerInvitesReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerInvitesRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nextern VOID P2pPeerDevDiscoverReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n#endif /* P2P_SUPPORT */\n\nstatic VOID ReservedAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\n\n/*  \n    ==========================================================================\n    Description: \n        association state machine init, including state transition and timer init\n    Parameters: \n        S - pointer to the association state machine\n    Note:\n        The state machine looks like the following \n        \n                                    ASSOC_IDLE             \n        MT2_MLME_DISASSOC_REQ    mlme_disassoc_req_action \n        MT2_PEER_DISASSOC_REQ    peer_disassoc_action     \n        MT2_PEER_ASSOC_REQ       drop                     \n        MT2_PEER_REASSOC_REQ     drop                     \n        MT2_CLS3ERR              cls3err_action           \n    ==========================================================================\n */\nVOID ActionStateMachineInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN  STATE_MACHINE *S, \n    OUT STATE_MACHINE_FUNC Trans[]) \n{\n\tStateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_ACT_STATE, MAX_ACT_MSG, (STATE_MACHINE_FUNC)Drop, ACT_IDLE, ACT_MACHINE_BASE);\n\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE, (STATE_MACHINE_FUNC)PeerSpectrumAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE, (STATE_MACHINE_FUNC)PeerQOSAction);\n\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)ReservedAction);\n#ifdef QOS_DLS_SUPPORT\n\t\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)PeerDLSAction);\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);\n#endif /* DOT11_N_SUPPORT */\n\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);\n\t\n\tStateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction);\n\tStateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction);\n\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\n}\n\n#ifdef DOT11_N_SUPPORT\nVOID MlmeADDBAAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n\n{\n\tMLME_ADDBA_REQ_STRUCT *pInfo;\n\tUCHAR           Addr[6];\n\tPUCHAR         pOutBuffer = NULL;\n\tNDIS_STATUS     NStatus;\n\tULONG\t\tIdx;\n\tFRAME_ADDBA_REQ  Frame;\n\tULONG\t\tFrameLen;\n\tBA_ORI_ENTRY\t\t\t*pBAEntry = NULL;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\tapidx;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n#endif /* P2P_SUPPORT */\n\n\tpInfo = (MLME_ADDBA_REQ_STRUCT *)Elem->Msg;\n\tNdisZeroMemory(&Frame, sizeof(FRAME_ADDBA_REQ));\n\t\n\tif(MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr) &&\n\t\tVALID_WCID(pInfo->Wcid)) \n\t{\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory*/\n\t\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BA - MlmeADDBAAction() allocate memory failed \\n\"));\n\t\t\treturn;\n\t\t}\n\t\t/* 1. find entry */\n\t\tIdx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];\n\t\tif (Idx == 0)\n\t\t{\n\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"BA - MlmeADDBAAction() can't find BAOriEntry \\n\"));\n\t\t\treturn;\n\t\t} \n\t\telse\n\t\t{\n\t\t\tpBAEntry =&pAd->BATable.BAOriEntry[Idx];\n\t\t}\n\t\t\n#ifdef P2P_SUPPORT\n\t\t/*if (VALID_WCID(pInfo->Wcid))*/\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[pInfo->Wcid];\n\n\t\t\tif (pEntry)\n\t\t\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (ADHOC_ON(pAd)\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\t\t|| (IS_ENTRY_DLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\t|| (IS_ENTRY_TDLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\t\t\t}\n\t\t\t\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pEntry->HdrAddr2, pEntry->HdrAddr3);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[pInfo->Wcid]))\n\t\t\t{\n\t\t\t\tapidx = pAd->MacTab.Content[pInfo->Wcid].MatchAPCLITabIdx;\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, pInfo->pAddr);\t\t\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tapidx = pAd->MacTab.Content[pInfo->Wcid].apidx;\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif (ADHOC_ON(pAd)\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\t|| (IS_ENTRY_DLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t|| (IS_ENTRY_TDLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t)\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\t\telse\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */ \n#endif /* P2P_SUPPORT */\n\n\t\tFrame.Category = CATEGORY_BA;\n\t\tFrame.Action = ADDBA_REQ;\n\t\tFrame.BaParm.AMSDUSupported = 0;\n\t\tFrame.BaParm.BAPolicy = IMMED_BA;\n\t\tFrame.BaParm.TID = pInfo->TID;\n\t\tFrame.BaParm.BufSize = pInfo->BaBufSize;\n\t\tFrame.Token = pInfo->Token;\n\t\tFrame.TimeOutValue = pInfo->TimeOutValue;\n\t\tFrame.BaStartSeq.field.FragNum = 0;\n\t\tFrame.BaStartSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID];\n\n#ifdef UNALIGNMENT_SUPPORT\n\t\t{\n\t\t\tBA_PARM\t\ttmpBaParm;\n\n\t\t\tNdisMoveMemory((PUCHAR)(&tmpBaParm), (PUCHAR)(&Frame.BaParm), sizeof(BA_PARM));\n\t\t\t*(USHORT *)(&tmpBaParm) = cpu2le16(*(USHORT *)(&tmpBaParm));\n\t\t\tNdisMoveMemory((PUCHAR)(&Frame.BaParm), (PUCHAR)(&tmpBaParm), sizeof(BA_PARM));\n\t\t}\n#else\n\t\t*(USHORT *)(&(Frame.BaParm)) = cpu2le16((*(USHORT *)(&(Frame.BaParm))));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\tFrame.TimeOutValue = cpu2le16(Frame.TimeOutValue);\n\t\tFrame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word);\n\n\t\tMakeOutgoingFrame(pOutBuffer,\t\t   &FrameLen,\n\t\t              sizeof(FRAME_ADDBA_REQ), &Frame,\n\t\t              END_OF_ARGS);\n\n\t\tMiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[pInfo->TID]), pOutBuffer, FrameLen);\n\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BA - Send ADDBA request. StartSeq = %x,  FrameLen = %ld. BufSize = %d\\n\", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize));\n    }\n}\n\n/*\n    ==========================================================================\n    Description:\n        send DELBA and delete BaEntry if any\n    Parametrs:\n        Elem - MLME message MLME_DELBA_REQ_STRUCT\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID MlmeDELBAAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{\n\tMLME_DELBA_REQ_STRUCT *pInfo;\n\tPUCHAR         pOutBuffer = NULL;\n\tPUCHAR\t\t   pOutBuffer2 = NULL;\n\tNDIS_STATUS     NStatus;\n\tULONG\t\tIdx;\n\tFRAME_DELBA_REQ  Frame;\n\tULONG\t\tFrameLen;\n\tFRAME_BAR\tFrameBar;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\tapidx;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n#endif /* P2P_SUPPORT */\n\t\n\tpInfo = (MLME_DELBA_REQ_STRUCT *)Elem->Msg;\t\n\t/* must send back DELBA */\n\tNdisZeroMemory(&Frame, sizeof(FRAME_DELBA_REQ));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> MlmeDELBAAction(), Initiator(%d) \\n\", pInfo->Initiator));\n\t\n\tif(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen) &&\n\t\tVALID_WCID(pInfo->Wcid))\n\t{\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory*/\n\t\tif(NStatus != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"BA - MlmeDELBAAction() allocate memory failed 1. \\n\"));\n\t\t\treturn;\n\t\t}\n\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer2);  /*Get an unused nonpaged memory*/\n\t\tif(NStatus != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BA - MlmeDELBAAction() allocate memory failed 2. \\n\"));\n\t\t\treturn;\n\t\t}\n\n\t\t/* SEND BAR (Send BAR to refresh peer reordering buffer.) */\n\t\tIdx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];\n#ifdef P2P_SUPPORT\n\t\t/*if (VALID_WCID(pInfo->Wcid)) */\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[pInfo->Wcid];\n\n\t\t\tif (pEntry)\n\t\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pEntry->HdrAddr2);\n\t\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[pInfo->Wcid]))\n\t\t\t{\n\t\t\t\tapidx = pAd->MacTab.Content[pInfo->Wcid].MatchAPCLITabIdx;\n\t\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress);\n\t\t\t}\t\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tapidx = pAd->MacTab.Content[pInfo->Wcid].apidx;\n\t\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t\tFrameBar.StartingSeq.field.FragNum = 0; /* make sure sequence not clear in DEL funciton.*/\n\t\tFrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; /* make sure sequence not clear in DEL funciton.*/\n\t\tFrameBar.BarControl.TID = pInfo->TID; /* make sure sequence not clear in DEL funciton.*/\n\t\tFrameBar.BarControl.ACKPolicy = IMMED_BA; /* make sure sequence not clear in DEL funciton.*/\n\t\tFrameBar.BarControl.Compressed = 1; /* make sure sequence not clear in DEL funciton.*/\n\t\tFrameBar.BarControl.MTID = 0; /* make sure sequence not clear in DEL funciton.*/\n\n\t\tMakeOutgoingFrame(pOutBuffer2,\t\t\t\t&FrameLen,\n\t\t\t\t\t  sizeof(FRAME_BAR),\t  &FrameBar,\n\t\t\t\t\t  END_OF_ARGS);\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer2);\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \\n\"));\n\n\t\t/* SEND DELBA FRAME*/\n\t\tFrameLen = 0;\n#ifdef P2P_SUPPORT\n\t\tif (VALID_WCID(pInfo->Wcid))\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[pInfo->Wcid];\n\n\t\t\tif (pEntry)\n\t\t\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (ADHOC_ON(pAd)\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\t\t|| (IS_ENTRY_DLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\t|| (IS_ENTRY_TDLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\t\t\t}\n\t\t\t\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pEntry->HdrAddr2, pEntry->HdrAddr3);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[pInfo->Wcid]))\n\t\t\t{\n\t\t\t\tapidx = pAd->MacTab.Content[pInfo->Wcid].MatchAPCLITabIdx;\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);\t\t\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tapidx = pAd->MacTab.Content[pInfo->Wcid].apidx;\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr,  pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif (ADHOC_ON(pAd)\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\t|| (IS_ENTRY_DLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t|| (IS_ENTRY_TDLS(&pAd->MacTab.Content[pInfo->Wcid]))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t)\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\t\telse\n\t\t\t\tActHeaderInit(pAd, &Frame.Hdr,  pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t\tFrame.Category = CATEGORY_BA;\n\t\tFrame.Action = DELBA;\n\t\tFrame.DelbaParm.Initiator = pInfo->Initiator;\n\t\tFrame.DelbaParm.TID = pInfo->TID;\n\t\tFrame.ReasonCode = 39; /* Time Out*/\n\t\t*(USHORT *)(&Frame.DelbaParm) = cpu2le16(*(USHORT *)(&Frame.DelbaParm));\n\t\tFrame.ReasonCode = cpu2le16(Frame.ReasonCode);\n\t\t\n\t\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t              sizeof(FRAME_DELBA_REQ),    &Frame,\n\t\t              END_OF_ARGS);\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\\n\", pInfo->Initiator));\n    \t}\n}\n#endif /* DOT11_N_SUPPORT */\n\nVOID MlmeQOSAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{\n}\n\nVOID MlmeDLSAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{\n}\n\nVOID MlmeInvalidAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{\n\t/*PUCHAR\t\t   pOutBuffer = NULL;*/\n\t/*Return the receiving frame except the MSB of category filed set to 1.  7.3.1.11*/\n}\n\nVOID PeerQOSAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n}\n\n#ifdef QOS_DLS_SUPPORT\nVOID PeerDLSAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\n\tswitch(Action)\n\t{\n\t\tcase ACTION_DLS_REQUEST:\n#ifdef CONFIG_AP_SUPPORT\n#ifndef P2P_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tAPPeerDlsReqAction(pAd, Elem);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tPeerDlsReqAction(pAd, Elem);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase ACTION_DLS_RESPONSE:\n#ifdef CONFIG_AP_SUPPORT\n#ifndef P2P_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tAPPeerDlsRspAction(pAd, Elem);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tPeerDlsRspAction(pAd, Elem);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase ACTION_DLS_TEARDOWN:\n#ifdef CONFIG_AP_SUPPORT\n#ifndef P2P_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tAPPeerDlsTearDownAction(pAd, Elem);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tPeerDlsTearDownAction(pAd, Elem);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tbreak;\n\t}\n}\n#endif /* QOS_DLS_SUPPORT */\n\n\n\n#ifdef DOT11_N_SUPPORT\nVOID PeerBAAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\t\n\tswitch(Action)\n\t{\n\t\tcase ADDBA_REQ:\n\t\t\tPeerAddBAReqAction(pAd,Elem);\n\t\t\tbreak;\n\t\tcase ADDBA_RESP:\n\t\t\tPeerAddBARspAction(pAd,Elem);\n\t\t\tbreak;\n\t\tcase DELBA:\n\t\t\tPeerDelBAAction(pAd,Elem);\n\t\t\tbreak;\n\t}\n}\n\n\n#ifdef DOT11N_DRAFT3\n#ifdef CONFIG_AP_SUPPORT\nextern UCHAR get_regulatory_class(IN PRTMP_ADAPTER pAd);\n\nVOID ApPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\tBSS_2040_COEXIST_IE\t\tBssCoexist;\n\t\n\t/* Format as in IEEE 7.4.7.2*/\n\tif (Action == ACTION_BSS_2040_COEXIST)\n\t{\n\t\tBssCoexist.word = Elem->Msg[LENGTH_802_11+2];\n\t}\n}\n\n\nVOID SendBSS2040CoexistMgmtAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\tWcid,\n\tIN\tUCHAR\tapidx,\n\tIN\tUCHAR\tInfoReq)\n{\n\tPUCHAR\t\t\tpOutBuffer = NULL;\n\tNDIS_STATUS \tNStatus;\n\tFRAME_ACTION_HDR\tFrame;\n\tULONG\t\t\tFrameLen;\n\tBSS_2040_COEXIST_ELEMENT\t\tBssCoexistInfo;\n\tBSS_2040_INTOLERANT_CH_REPORT\tBssIntolerantInfo;\n\tPUCHAR\t\tpAddr1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SendBSS2040CoexistMgmtAction(): Wcid=%d, apidx=%d, InfoReq=%d!\\n\", Wcid, apidx, InfoReq));\n\t\n\tNdisZeroMemory((PUCHAR)&BssCoexistInfo, sizeof(BSS_2040_COEXIST_ELEMENT));\n\tNdisZeroMemory((PUCHAR)&BssIntolerantInfo, sizeof(BSS_2040_INTOLERANT_CH_REPORT));\n\t\n\tBssCoexistInfo.ElementID = IE_2040_BSS_COEXIST;\n\tBssCoexistInfo.Len = 1;\n\tBssCoexistInfo.BssCoexistIe.word = pAd->CommonCfg.LastBSSCoexist2040.word;\n\tBssCoexistInfo.BssCoexistIe.field.InfoReq = InfoReq;\n\tBssIntolerantInfo.ElementID = IE_2040_BSS_INTOLERANT_REPORT;\n\tBssIntolerantInfo.Len = 1;\n\tBssIntolerantInfo.RegulatoryClass = get_regulatory_class(pAd);\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - SendBSS2040CoexistMgmtAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tif (Wcid == MCAST_WCID)\n\t\tpAddr1 = &BROADCAST_ADDR[0];\n\telse\n\t\tpAddr1 = pAd->MacTab.Content[Wcid].Addr;\n\tActHeaderInit(pAd, &Frame.Hdr, pAddr1, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\n\tFrame.Category = CATEGORY_PUBLIC;\n\tFrame.Action = ACTION_BSS_2040_COEXIST;\n\t\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t\tsizeof(FRAME_ACTION_HDR),\t  &Frame,\n\t\t\t\t\tsizeof(BSS_2040_COEXIST_ELEMENT),\t\t&BssCoexistInfo,\n\t\t\t\t\tsizeof(BSS_2040_INTOLERANT_CH_REPORT), &BssIntolerantInfo,\n\t\t\t\t  \tEND_OF_ARGS);\n\t\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\n\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - SendBSS2040CoexistMgmtAction( BSSCoexist2040 = 0x%x )  \\n\", BssCoexistInfo.BssCoexistIe.word));\n\t\n}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nVOID StaPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN BSS_2040_COEXIST_IE *pBssCoexIE) \n{\n\tMLME_SCAN_REQ_STRUCT ScanReq;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION - StaPeerPublicAction  Bss2040Coexist = %x\\n\", *((PUCHAR)pBssCoexIE)));\n\n\t/* AP asks Station to return a 20/40 BSS Coexistence mgmt frame.  So we first starts a scan, then send back 20/40 BSS Coexistence mgmt frame */\n\tif ((pBssCoexIE->field.InfoReq == 1) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)))\n\t{\n\t\t/* Clear record first.  After scan , will update those bit and send back to transmiter.*/\n\t\tpAd->CommonCfg.BSSCoexist2040.field.InfoReq = 1;\n\t\tpAd->CommonCfg.BSSCoexist2040.field.Intolerant40 = 0;\n\t\tpAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 0;\n\t\t/* Clear Trigger event table*/\n\t\tTriEventInit(pAd);\n\t\t/* Fill out stuff for scan request  and kick to scan*/\n\t\tScanParmFill(pAd, &ScanReq, ZeroSsid, 0, BSS_ANY, SCAN_2040_BSS_COEXIST);\n\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n}\n\n\n/*\nDescription : Build Intolerant Channel Rerpot from Trigger event table.\nreturn : how many bytes copied. \n*/\nULONG BuildIntolerantChannelRep(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    PUCHAR  pDest) \n{\n\tULONG\t\t\tFrameLen = 0;\n\tULONG\t\t\tReadOffset = 0;\n\tUCHAR\t\t\ti, j, k, idx = 0;\n\t/*UCHAR\t\t\tLastRegClass = 0xff;*/\n\tUCHAR\t\t\tChannelList[MAX_TRIGGER_EVENT];\n\tUCHAR\t\t\tTmpRegClass;\n\tUCHAR\t\t\tRegClassArray[7] = {0, 11,12, 32, 33, 54,55}; /* Those regulatory class has channel in 2.4GHz. See Annex J.*/\n\n\n\tRTMPZeroMemory(ChannelList, MAX_TRIGGER_EVENT);\n\n\t/* Find every regulatory class*/\n\tfor ( k = 0;k < 7;k++)\n\t{\n\t\tTmpRegClass = RegClassArray[k];\n\t\t\n\t\tidx = 0;\n\t\t/* Find Channel report with the same regulatory class in 2.4GHz.*/\n\t\tfor ( i = 0;i < pAd->CommonCfg.TriggerEventTab.EventANo;i++)\n\t\t{\n\t\t\tif (pAd->CommonCfg.TriggerEventTab.EventA[i].bValid == TRUE)\n\t\t\t{\n\t\t\t\tif (pAd->CommonCfg.TriggerEventTab.EventA[i].RegClass == TmpRegClass)\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tfor (j = 0;j < idx;j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ChannelList[j] == (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif ((j == idx))\n\t\t\t\t\t{\n\t\t\t\t\t\tChannelList[idx] = (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel;\n\t\t\t\t\t\tidx++;\n\t\t\t\t\t} \n\t\t\t\t\tpAd->CommonCfg.TriggerEventTab.EventA[i].bValid = FALSE;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - BuildIntolerantChannelRep , Total Channel number = %d \\n\", idx));\n\t\t\t}\n\t\t}\n\n\t\t/* idx > 0 means this regulatory class has some channel report and need to copy to the pDest.*/\n\t\tif (idx > 0)\n\t\t{\n\t\t\t/* For each regaulatory IE report, contains all channels that has the same regulatory class.*/\n\t\t\t*(pDest + ReadOffset) = IE_2040_BSS_INTOLERANT_REPORT;  /* IE*/\n\t\t\t*(pDest + ReadOffset + 1) = 1+ idx;\t/* Len = RegClass byte + channel byte.*/\n\t\t\t*(pDest + ReadOffset + 2) = TmpRegClass;\t/* Len = RegClass byte + channel byte.*/\n\t\t\tRTMPMoveMemory(pDest + ReadOffset + 3, ChannelList, idx);\n\n\t\t\tFrameLen += (3 + idx);\n\t\t\tReadOffset += (3 + idx);\n\t\t}\n\t\t\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT-BuildIntolerantChannelRep(Size=%ld)\\n\", FrameLen));\n\thex_dump(\"ACT-pDestMsg\", pDest, FrameLen);\n\n\treturn FrameLen;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\tAfter scan, Update 20/40 BSS Coexistence IE and send out.\n\tAccording to 802.11n D3.03 11.14.10\n\t\t\n\tParameters: \n\t==========================================================================\n */\nVOID Update2040CoexistFrameAndNotify(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN\tBOOLEAN\tbAddIntolerantCha) \n{\n\tBSS_2040_COEXIST_IE\t\tOldValue;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - Update2040CoexistFrameAndNotify. BSSCoexist2040 = %x. EventANo = %d. \\n\", pAd->CommonCfg.BSSCoexist2040.word, pAd->CommonCfg.TriggerEventTab.EventANo));\n\tOldValue.word = pAd->CommonCfg.BSSCoexist2040.word;\n\t/* Reset value.*/\n\tpAd->CommonCfg.BSSCoexist2040.word = 0;\n\n\tif (pAd->CommonCfg.TriggerEventTab.EventBCountDown > 0)\n\t\tpAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 1;\n\n\t/* Need to check !!!!*/\n\t/* How STA will set Intolerant40 if implementation dependent. Now we don't set this bit first!!!!!*/\n\t/* So Only check BSS20WidthReq change.*/\n\t/*if (OldValue.field.BSS20WidthReq != pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq)*/\n\t{\n\t\tSend2040CoexistAction(pAd, Wcid, bAddIntolerantCha);\n\t}\n}\n\n/*\nDescription : Send 20/40 BSS Coexistence Action frame If one trigger event is triggered.\n*/\nVOID Send2040CoexistAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN\tBOOLEAN\tbAddIntolerantCha) \n{\n\tPUCHAR\t\t\tpOutBuffer = NULL;\n\tNDIS_STATUS \tNStatus;\n\tFRAME_ACTION_HDR\tFrame;\n\tULONG\t\t\tFrameLen;\n\tUINT32\t\t\tIntolerantChaRepLen;\n\tUCHAR\t\t\tHtLen = 1;\n\n\tIntolerantChaRepLen = 0;\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - Send2040CoexistAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\t\n\n\tFrame.Category = CATEGORY_PUBLIC;\n\tFrame.Action = ACTION_BSS_2040_COEXIST; /*COEXIST_2040_ACTION;*/\n\t\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t  sizeof(FRAME_ACTION_HDR),\t  &Frame,\n\t\t\t\t  1,                                &BssCoexistIe,\n\t\t\t\t  1,                                &HtLen,\n\t\t\t\t  1,                                &pAd->CommonCfg.BSSCoexist2040.word,\n\t\t\t\t  END_OF_ARGS);\n\t\n\tif (bAddIntolerantCha == TRUE)\n\t\tIntolerantChaRepLen = BuildIntolerantChannelRep(pAd, pOutBuffer + FrameLen);\n\n\t/*2009 PF#3: IOT issue with Motorola AP. It will not check the field of BSSCoexist2040.*/\n\t/*11.14.12 Switching between 40 MHz and 20 MHz*/\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IntolerantChaRepLen=%d, BSSCoexist2040=0x%x!\\n\", \n\t\t\t\t\t\t\t\tIntolerantChaRepLen, pAd->CommonCfg.BSSCoexist2040.word));\n\tif (!((IntolerantChaRepLen == 0) && (pAd->CommonCfg.BSSCoexist2040.word == 0)))\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen + IntolerantChaRepLen);\n\t\t\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"ACT - Send2040CoexistAction( BSSCoexist2040 = 0x%x )  \\n\", pAd->CommonCfg.BSSCoexist2040.word));\n}\n\nVOID UpdateBssScanParm(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tOVERLAP_BSS_SCAN_IE\tAPBssScan) \n{\t\t\t\t\t\t\t\t\t \n\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = le2cpu16(APBssScan.DelayFactor); /*APBssScan.DelayFactor[1] * 256 + APBssScan.DelayFactor[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif ((pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor <5) || (pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor > 100))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11BssWidthChanTranDelayFactor out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = 5;\n\t}\n\n\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = le2cpu16(APBssScan.TriggerScanInt); /*APBssScan.TriggerScanInt[1] * 256 + APBssScan.TriggerScanInt[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif ((pAd->CommonCfg.Dot11BssWidthTriggerScanInt < 10) ||(pAd->CommonCfg.Dot11BssWidthTriggerScanInt > 900))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11BssWidthTriggerScanInt out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = 900;\n\t}\n\t\t\n\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = le2cpu16(APBssScan.ScanPassiveDwell); /*APBssScan.ScanPassiveDwell[1] * 256 + APBssScan.ScanPassiveDwell[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif ((pAd->CommonCfg.Dot11OBssScanPassiveDwell < 5) ||(pAd->CommonCfg.Dot11OBssScanPassiveDwell > 1000))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11OBssScanPassiveDwell out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = 20;\n\t}\n\t\n\tpAd->CommonCfg.Dot11OBssScanActiveDwell = le2cpu16(APBssScan.ScanActiveDwell); /*APBssScan.ScanActiveDwell[1] * 256 + APBssScan.ScanActiveDwell[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif ((pAd->CommonCfg.Dot11OBssScanActiveDwell < 10) ||(pAd->CommonCfg.Dot11OBssScanActiveDwell > 1000))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11OBssScanActiveDwell out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = 10;\n\t}\n\t\n\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = le2cpu16(APBssScan.PassiveTalPerChannel); /*APBssScan.PassiveTalPerChannel[1] * 256 + APBssScan.PassiveTalPerChannel[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif ((pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel < 200) ||(pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel > 10000))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11OBssScanPassiveTotalPerChannel out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = 200;\n\t}\n\t\n\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = le2cpu16(APBssScan.ActiveTalPerChannel); /*APBssScan.ActiveTalPerChannel[1] * 256 + APBssScan.ActiveTalPerChannel[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif ((pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel < 20) ||(pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel > 10000))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11OBssScanActiveTotalPerChannel out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = 20;\n\t}\n\t\n\tpAd->CommonCfg.Dot11OBssScanActivityThre = le2cpu16(APBssScan.ScanActThre); /*APBssScan.ScanActThre[1] * 256 + APBssScan.ScanActThre[0];*/\n\t/* out of range defined in MIB... So fall back to default value.*/\n\tif (pAd->CommonCfg.Dot11OBssScanActivityThre > 100)\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR,(\"ACT - UpdateBssScanParm( Dot11OBssScanActivityThre out of range !!!!)  \\n\"));*/\n\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = 25;\n\t}\n\n\tpAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\t/*DBGPRINT(RT_DEBUG_LOUD,(\"ACT - UpdateBssScanParm( Dot11BssWidthTriggerScanInt = %d )  \\n\", pAd->CommonCfg.Dot11BssWidthTriggerScanInt));*/\n}\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\nBOOLEAN ChannelSwitchSanityCheck(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN    UCHAR  NewChannel,\n\tIN    UCHAR  Secondary) \n{\n\tUCHAR\t\ti;\n\t\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn FALSE;\n\n\tif ((NewChannel > 7) && (Secondary == 1))\n\t\treturn FALSE;\n\n\tif ((NewChannel < 5) && (Secondary == 3))\n\t\treturn FALSE;\n\n\t/* 0. Check if new channel is in the channellist.*/\n\tfor (i = 0;i < pAd->ChannelListNum;i++)\n\t{\n\t\tif (pAd->ChannelList[i].Channel == NewChannel)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i == pAd->ChannelListNum)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nVOID ChannelSwitchAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Wcid,\n\tIN UCHAR NewChannel,\n\tIN UCHAR Secondary)\n{\n\tUCHAR rf_channel = 0, rf_bw;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s(): NewChannel=%d, Secondary=%d\\n\", \n\t\t\t\t__FUNCTION__, NewChannel, Secondary));\n\n\tif (ChannelSwitchSanityCheck(pAd, Wcid, NewChannel, Secondary) == FALSE)\n\t\treturn;\n\n\tpAd->CommonCfg.Channel = NewChannel;\n\tif (Secondary == EXTCHA_NONE)\n\t{\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\tpAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\t\t\n\n\t\trf_bw = BW_20;\n\t\trf_channel = pAd->CommonCfg.Channel;\n\t}\n\t/* 1.  Switches to BW = 40 And Station supports BW = 40.*/\n\telse if (((Secondary == EXTCHA_ABOVE) || (Secondary == EXTCHA_BELOW)) &&\n\t\t\t(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1)\n\t)\n\t{\n\t\trf_bw = BW_40;\n#ifdef GREENAP_SUPPORT\n\t\tif (pAd->ApCfg.bGreenAPActive == 1)\n\t\t{\n\t\t\trf_bw = BW_20;\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\t}\n\t\telse\n#endif /* GREENAP_SUPPORT */\n\t\tif (Secondary == EXTCHA_ABOVE)\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;\n\t\telse\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;\n\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\tpAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 1;\n\t}\n\n\tif (rf_channel != 0) {\n\t\tAsicSetChannel(pAd, rf_channel, rf_bw, Secondary, FALSE);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): %dMHz LINK UP, CtrlChannel=%d,  CentralChannel= %d \\n\",\n\t\t\t\t\t__FUNCTION__, (rf_bw == BW_40 ? 40 : 20),\n\t\t\t\t\tpAd->CommonCfg.Channel, \n\t\t\t\t\tpAd->CommonCfg.CentralChannel));\n\t}\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\nVOID PeerPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n#ifdef P2P_SUPPORT\n\tif (!P2P_INF_ON(pAd))\n#endif /* P2P_SUPPORT */\n\tif ((Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t&& (Action != ACTION_TDLS_DISCOVERY_RSP)\n#endif // DOT11Z_TDLS_SUPPORT //\n\t\t)\n\t\treturn;\n\n\n\tswitch(Action)\n\t{\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\tcase ACTION_BSS_2040_COEXIST:\t/* Format defined in IEEE 7.4.7a.1 in 11n Draf3.03*/\n\t\t\t{\n\t\t\t\t/*UCHAR\tBssCoexist;*/\n\t\t\t\tBSS_2040_COEXIST_ELEMENT\t\t*pCoexistInfo;\n\t\t\t\tBSS_2040_COEXIST_IE \t\t\t*pBssCoexistIe;\n\t\t\t\tBSS_2040_INTOLERANT_CH_REPORT\t*pIntolerantReport = NULL;\n\t\t\t\t\n\t\t\t\tif (Elem->MsgLen <= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT)) )\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ACTION - 20/40 BSS Coexistence Management Frame length too short! len = %ld!\\n\", Elem->MsgLen));\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ACTION - 20/40 BSS Coexistence Management action----> \\n\"));\n\t\t\t\thex_dump(\"CoexistenceMgmtFrame\", Elem->Msg, Elem->MsgLen);\n\n\t\t\t\t\n\t\t\t\tpCoexistInfo = (BSS_2040_COEXIST_ELEMENT *) &Elem->Msg[LENGTH_802_11+2];\n\t\t\t\t/*hex_dump(\"CoexistInfo\", (PUCHAR)pCoexistInfo, sizeof(BSS_2040_COEXIST_ELEMENT));*/\n\t\t\t\tif (Elem->MsgLen >= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT) + sizeof(BSS_2040_INTOLERANT_CH_REPORT)))\n\t\t\t\t{\n\t\t\t\t\tpIntolerantReport = (BSS_2040_INTOLERANT_CH_REPORT *)((PUCHAR)pCoexistInfo + sizeof(BSS_2040_COEXIST_ELEMENT));\n\t\t\t\t}\n\t\t\t\t/*hex_dump(\"IntolerantReport \", (PUCHAR)pIntolerantReport, sizeof(BSS_2040_INTOLERANT_CH_REPORT));*/\n\t\t\t\t\n\t\t\t\tif(pAd->CommonCfg.bBssCoexEnable == FALSE || (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"20/40 BSS CoexMgmt=%d, bForty_Mhz_Intolerant=%d, ignore this action!!\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.bBssCoexEnable,\n\t\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.bForty_Mhz_Intolerant));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpBssCoexistIe = (BSS_2040_COEXIST_IE *)(&pCoexistInfo->BssCoexistIe);\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif ((Elem->OpMode == OPMODE_AP) || (pAd->OpMode == OPMODE_AP))\n#else\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN\t\tbNeedFallBack = FALSE;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t/*ApPublicAction(pAd, Elem);*/\n\t\t\t\t\tif ((pBssCoexistIe->field.BSS20WidthReq ==1) || (pBssCoexistIe->field.Intolerant40 == 1))\n\t\t\t\t\t{\t\n\t\t\t\t\t\tbNeedFallBack = TRUE;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSS_2040_COEXIST: BSS20WidthReq=%d, Intolerant40=%d!\\n\", pBssCoexistIe->field.BSS20WidthReq, pBssCoexistIe->field.Intolerant40));\n\t\t\t\t\t}\n\t\t\t\t\telse if ((pIntolerantReport) && (pIntolerantReport->Len > 1)\n\t\t\t\t\t\t\t/*&& (pIntolerantReport->RegulatoryClass == get_regulatory_class(pAd))*/)\n\t\t\t\t\t{\n\t\t\t\t\t\tint i;\n\t\t\t\t\t\tUCHAR *ptr;\n\t\t\t\t\t\tINT retVal;\n\t\t\t\t\t\tBSS_COEX_CH_RANGE coexChRange;\n\n\t\t\t\t\t\tptr = pIntolerantReport->ChList;\n\t\t\t\t\t\tbNeedFallBack = TRUE;\n\t\t\t\t\t\t\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The pIntolerantReport len = %d, chlist=\", pIntolerantReport->Len));\n\t\t\t\t\t\tfor(i =0 ; i < (pIntolerantReport->Len -1); i++, ptr++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%d,\", *ptr));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\n\t\t\t\t\t\tretVal = GetBssCoexEffectedChRange(pAd, &coexChRange);\n\t\t\t\t\t\tif (retVal == TRUE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tptr = pIntolerantReport->ChList;\n\t\t\t\t\t\t\tbNeedFallBack = FALSE;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Check IntolerantReport Channel List in our effectedChList(%d~%d)\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ChannelList[coexChRange.effectChStart].Channel,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ChannelList[coexChRange.effectChEnd].Channel));\n\t\t\t\t\t\t\tfor(i =0 ; i < (pIntolerantReport->Len -1); i++, ptr++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tUCHAR chEntry;\n\n\t\t\t\t\t\t\t\tchEntry = *ptr;\n\t\t\t\t\t\t\t\tif (chEntry >= pAd->ChannelList[coexChRange.effectChStart].Channel && \n\t\t\t\t\t\t\t\t\tchEntry <= pAd->ChannelList[coexChRange.effectChEnd].Channel)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Found Intolerant channel in effect range=%d!\\n\", *ptr));\n\t\t\t\t\t\t\t\t\tbNeedFallBack = TRUE;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"After CoexChRange Check, bNeedFallBack=%d!\\n\", bNeedFallBack));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (bNeedFallBack)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpBssCoexistIe->field.Intolerant40 = 1;\n\t\t\t\t\t\t\tpBssCoexistIe->field.BSS20WidthReq = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bNeedFallBack)\n\t\t\t\t\t{\n\t\t\t\t\t\tint apidx;\n\t\t\t\t\t\t\n\t\t\t\t\t\tNdisMoveMemory((PUCHAR)&pAd->CommonCfg.LastBSSCoexist2040, (PUCHAR)pBssCoexistIe, sizeof(BSS_2040_COEXIST_IE));\n\t\t\t\t\t\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;\n\n\t\t\t\t\t\tif (!(pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_TIMER_FIRED))\n\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Fire the Bss2040CoexistTimer with timeout=%ld!\\n\", \n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelay));\n\n\t\t\t\t\t\t\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_TIMER_FIRED;\n\t\t\t\t\t\t\t/* More 5 sec for the scan report of STAs.*/\n\t\t\t\t\t\t\tRTMPSetTimer(&pAd->CommonCfg.Bss2040CoexistTimer,  (pAd->CommonCfg.Dot11BssWidthChanTranDelay + 5) * 1000);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Already fallback to 20MHz, Extend the timeout of Bss2040CoexistTimer!\\n\"));\n\t\t\t\t\t\t\t/* More 5 sec for the scan report of STAs.*/\n\t\t\t\t\t\t\tRTMPModTimer(&pAd->CommonCfg.Bss2040CoexistTimer, (pAd->CommonCfg.Dot11BssWidthChanTranDelay + 5) * 1000);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tapidx = pAd->MacTab.Content[Elem->Wcid].apidx;\n\t\t\t\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t\t\t\t\tSendBSS2040CoexistMgmtAction(pAd, MCAST_WCID, apidx, 0);\n\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif ((Elem->OpMode == OPMODE_STA) || (pAd->OpMode == OPMODE_STA))\n#else\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tStaPublicAction(pAd, pBssCoexistIe);\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\t\tcase ACTION_WIFI_DIRECT:\n#ifdef IWSC_SUPPORT\n\t\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\tNdisEqualMemory(&(Elem->Msg[LENGTH_802_11+2]), IWSC_ACTION_OUI, 4)) \n\t\t\t{\n\t\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_PEER_ACTION_FRAME, Elem->MsgLen, Elem->Msg, 0);\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t\tbreak;\n\t\t\t}\n#endif // IWSC_SUPPORT //\n\n#ifdef P2P_SUPPORT\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<---- Public. Vendor OUI+type = %08x \\n\", *(PULONG)&Elem->Msg[LENGTH_802_11+2] ));\n#ifdef RT_BIG_ENDIAN\n\t\t\tif (SWAP32(*(PUINT32)&Elem->Msg[LENGTH_802_11+2]) == P2P_OUI)\n#else\n\t\t\tif (*(PUINT32)&Elem->Msg[LENGTH_802_11+2] == P2P_OUI)\n#endif /* RT_BIG_ENDIAN */\n\t\t\t{\n\t\t\t\tUCHAR\tSubtype = Elem->Msg[LENGTH_802_11+6];\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!!! Public action frames with Vendor specific OUI = WFAP2P.Subtype = %d. \\n\", Subtype));\n\t\t\t\tpAd->P2pCfg.bPeriodicListen = FALSE;\n\t\t\t\tif (pAd->P2pCfg.P2pCounter.bStartScan)\n\t\t\t\t{\n\t\t\t\t\tpAd->P2pCfg.P2pCounter.bStartScan = FALSE;\n\t\t\t\t\tpAd->P2pCfg.P2pCounter.bListen = FALSE;\n\t\t\t\t\tpAd->P2pCfg.P2pCounter.bNextScan = FALSE;\n\t\t\t\t\t/* update P2P Ctrl State Machine status. */\n\t\t\t\t\tMlmeEnqueue(pAd, P2P_CTRL_STATE_MACHINE, P2P_CTRL_DISC_CANL_EVT, 0, NULL, 0);\n\t\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t\t}\n\t\t\t\tswitch(Subtype)\n\t\t\t\t{\n\t\t\t\t\tcase GO_NEGOCIATION_REQ:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Group Nego. Req\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerGoNegoReqAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase GO_NEGOCIATION_RSP:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Group Nego. Rsp\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerGoNegoRspAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase GO_NEGOCIATION_CONFIRM:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Group Nego. Confirm\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerGoNegoConfirmAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_INVITE_REQ:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Invite Req\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerInvitesReqAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_INVITE_RSP:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Invite Rsp\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerInvitesRspAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_DEV_DIS_REQ:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Device Discovery Req\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerDevDiscoverReqAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_DEV_DIS_RSP:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Device Discovery Rsp\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerDeviceDiscRspAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_PROVISION_REQ:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Provision Req\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerProvisionReqAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_PROVISION_RSP:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : recv Provision Rsp\\n\", __FUNCTION__));\n\t\t\t\t\t\tP2pPeerProvisionRspAction(pAd,Elem);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tpAd->P2pCfg.bPeriodicListen = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Unknown Public action frames with Vendor specific OUI = WFAP2P.Subtype = %d \\n\", Subtype));\n\t\t\t\t\t\tbreak;\t\t\t\n\t\t\t\t}\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\tbreak;\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tcase ACTION_TDLS_DISCOVERY_RSP:\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tTDLS_DiscoveryRspPublicAction(pAd, Elem, Elem->Msg, Elem->MsgLen);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n#endif // DOT11Z_TDLS_SUPPORT //\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n}\t\n\n\nstatic VOID ReservedAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR Category;\n\n\tif (Elem->MsgLen <= LENGTH_802_11)\n\t{\n\t\treturn;\n\t}\n\n\tCategory = Elem->Msg[LENGTH_802_11];\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Rcv reserved category(%d) Action Frame\\n\", Category));\n\thex_dump(\"Reserved Action Frame\", &Elem->Msg[0], Elem->MsgLen);\n}\n\nVOID PeerRMAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n\n{\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\treturn;\n}\n\n#ifdef DOT11_N_SUPPORT\nstatic VOID respond_ht_information_exchange_action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPUCHAR\t\t\tpOutBuffer = NULL;\n\tNDIS_STATUS\t\tNStatus;\n\tULONG\t\t\tFrameLen;\n#ifdef CONFIG_AP_SUPPORT\n\tINT         \tapidx;\n#endif /* CONFIG_AP_SUPPORT */\n\tFRAME_HT_INFO\tHTINFOframe, *pFrame;\n\tUCHAR   \t\t*pAddr;\n#ifdef P2P_SUPPORT\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n#endif /* P2P_SUPPORT */\n\n\n\t/* 2. Always send back ADDBA Response */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t /*Get an unused nonpaged memory*/\n\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION - respond_ht_information_exchange_action() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\t/* get RA */\n\tpFrame = (FRAME_HT_INFO *) &Elem->Msg[0];\n\tpAddr = pFrame->Hdr.Addr2;\n\n\tNdisZeroMemory(&HTINFOframe, sizeof(FRAME_HT_INFO));\n\t/* 2-1. Prepare ADDBA Response frame.*/\n#ifdef P2P_SUPPORT\n\tif (VALID_WCID(Elem->Wcid))\n\t{\n\t\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\n\t\tActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pEntry->HdrAddr2, pEntry->HdrAddr3);\n\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[Elem->Wcid]))\n\t\t{\n\t\t\tapidx = pAd->MacTab.Content[Elem->Wcid].MatchAPCLITabIdx;\n\t\t\tActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, pAddr);\t\t\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tapidx = pAd->MacTab.Content[Elem->Wcid].apidx;\n\t\t\tActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (ADHOC_ON(pAd))\n\t\t\tActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\telse\n\t\tActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\tHTINFOframe.Category = CATEGORY_HT;\n\tHTINFOframe.Action = HT_INFO_EXCHANGE;\n\tHTINFOframe.HT_Info.Request = 0;\n\tHTINFOframe.HT_Info.Forty_MHz_Intolerant = pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant;\n\tHTINFOframe.HT_Info.STA_Channel_Width\t = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth;\t\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t\t&FrameLen,\n\t\t\t\t\t  sizeof(FRAME_HT_INFO),\t&HTINFOframe,\n\t\t\t\t\t  END_OF_ARGS);\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DOT11N_DRAFT3\nVOID SendNotifyBWActionFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR  Wcid,\n\tIN UCHAR apidx)\n{\n\tPUCHAR\t\t\tpOutBuffer = NULL;\n\tNDIS_STATUS \tNStatus;\n\tFRAME_ACTION_HDR\tFrame;\n\tULONG\t\t\tFrameLen;\n\tPUCHAR\t\t\tpAddr1;\n\n\t\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - SendNotifyBWAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tif (Wcid == MCAST_WCID)\n\t\tpAddr1 = &BROADCAST_ADDR[0];\n\telse\n\t\tpAddr1 = pAd->MacTab.Content[Wcid].Addr;\n\n\tActHeaderInit(pAd, &Frame.Hdr, pAddr1, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\n\tFrame.Category = CATEGORY_HT;\n\tFrame.Action = NOTIFY_BW_ACTION;\n\t\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t  sizeof(FRAME_ACTION_HDR),\t  &Frame,\n\t\t\t\t  END_OF_ARGS);\n\n\t*(pOutBuffer + FrameLen) = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth;\n\tFrameLen++;\n\t\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"ACT - SendNotifyBWAction(NotifyBW= %d)!\\n\", pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth));\n\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* CONFIG_AP_SUPPORT */\n\n\nVOID PeerHTAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR Action = Elem->Msg[LENGTH_802_11+1];\n\tMAC_TABLE_ENTRY *pEntry;\n\t\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn;\n\n\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\n\tswitch(Action)\n\t{\n\t\tcase NOTIFY_BW_ACTION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION - HT Notify Channel bandwidth action----> \\n\"));\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif(pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)\n\t\t\t{\n\t\t\t\t/* Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps */\n\t\t\t\t/* sending BW_Notify Action frame, and cause us to linkup and linkdown. */\n\t\t\t\t/* In legacy mode, don't need to parse HT action frame.*/\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \\n\", \n\t\t\t\t\t\t\t\tElem->Msg[LENGTH_802_11+2] ));\n\t\t\t\tbreak;\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tif (Elem->Msg[LENGTH_802_11+2] == 0)\t/* 7.4.8.2. if value is 1, keep the same as supported channel bandwidth. */\n\t\t\t\tpEntry->HTPhyMode.field.BW = 0;\n\t\t\telse \n\t\t\t{\n\t\t\t\tpEntry->HTPhyMode.field.BW = pEntry->MaxHTPhyMode.field.BW &\n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth;\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase SMPS_ACTION:\n\t\t\t/* 7.3.1.25*/\n \t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION - SMPS action----> \\n\"));\n\t\t\tif (((Elem->Msg[LENGTH_802_11+2] & 0x1) == 0))\n\t\t\t\tpEntry->MmpsMode = MMPS_ENABLE;\n\t\t\telse if (((Elem->Msg[LENGTH_802_11+2] & 0x2) == 0))\n\t\t\t\tpEntry->MmpsMode = MMPS_STATIC;\n\t\t\telse\n\t\t\t\tpEntry->MmpsMode = MMPS_DYNAMIC;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Aid(%d) MIMO PS = %d\\n\", Elem->Wcid, pEntry->MmpsMode));\n\t\t\t/* rt2860c : add something for smps change.*/\n\t\t\tbreak;\n \n\t\tcase SETPCO_ACTION:\n\t\t\tbreak;\n\t\t\t\n\t\tcase MIMO_CHA_MEASURE_ACTION:\n\t\t\tbreak;\n\t\t\t\n\t\tcase HT_INFO_EXCHANGE:\n\t\t\t{\t\t\t\n\t\t\t\tHT_INFORMATION_OCTET *pHT_info;\n\n\t\t\t\tpHT_info = (HT_INFORMATION_OCTET *) &Elem->Msg[LENGTH_802_11+2];\n    \t\t\t\t/* 7.4.8.10*/\n    \t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION - HT Information Exchange action----> \\n\"));\n    \t\t\t\tif (pHT_info->Request)\n    \t\t\t\t{\n    \t\t\t\t\trespond_ht_information_exchange_action(pAd, Elem);\n    \t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t{\n\t    \t\t\t\tif (pHT_info->Forty_MHz_Intolerant)\n\t    \t\t\t\t{\n\t    \t\t\t\t\tHandle_BSS_Width_Trigger_Events(pAd);\n\t    \t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t}\n    \t\tbreak;\n\t}\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tRetry sending ADDBA Reqest.\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tParametrs:\n\tp8023Header: if this is already 802.3 format, p8023Header is NULL\n\t\n\tReturn\t: TRUE if put into rx reordering buffer, shouldn't indicaterxhere.\n\t\t\t\tFALSE , then continue indicaterx at this moment.\n\t==========================================================================\n */\nVOID ORIBATimerTimeout(\n\tIN\tPRTMP_ADAPTER\tpAd) \n{\n\tMAC_TABLE_ENTRY\t*pEntry;\n\tINT\t\t\ti, total;\n/*\tFRAME_BAR\t\t\tFrameBar;*/\n/*\tULONG\t\t\tFrameLen;*/\n/*\tNDIS_STATUS \tNStatus;*/\n/*\tPUCHAR\t\t\tpOutBuffer = NULL;*/\n/*\tUSHORT\t\t\tSequence;*/\n\tUCHAR\t\t\tTID;\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\ttotal = pAd->MacTab.Size * NUM_OF_TID;\n\n\tfor (i = 1; ((i <MAX_LEN_OF_BA_ORI_TABLE) && (total > 0)) ; i++)\n\t{\n\t\tif  (pAd->BATable.BAOriEntry[i].ORI_BA_Status == Originator_Done)\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[pAd->BATable.BAOriEntry[i].Wcid];\n\t\t\tTID = pAd->BATable.BAOriEntry[i].TID;\n\n\t\t\tASSERT(pAd->BATable.BAOriEntry[i].Wcid < MAX_LEN_OF_MAC_TABLE);\n\t\t}\n\t\ttotal --;\n\t}\n}\n\n\nVOID SendRefreshBAR(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry) \n{\n\tFRAME_BAR\t\tFrameBar;\n\tULONG\t\t\tFrameLen;\n\tNDIS_STATUS \tNStatus;\n\tPUCHAR\t\t\tpOutBuffer = NULL;\n\tUSHORT\t\t\tSequence;\n\tUCHAR\t\t\ti, TID;\n\tUSHORT\t\t\tidx;\n\tBA_ORI_ENTRY\t*pBAEntry;\n\n\tfor (i = 0; i <NUM_OF_TID; i++)\n\t{\n\t\tidx = pEntry->BAOriWcidArray[i];\n\t\tif (idx == 0)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tpBAEntry = &pAd->BATable.BAOriEntry[idx];\n\n\t\tif  (pBAEntry->ORI_BA_Status == Originator_Done)\n\t\t{\n\t\t\tTID = pBAEntry->TID;\n\n\t\t\tASSERT(pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLE);\n\n\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory*/\n\t\t\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"BA - MlmeADDBAAction() allocate memory failed \\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\t\n\t\t\tSequence = pEntry->TxSeq[TID];\n\n#ifdef P2P_SUPPORT\n\t\t\tBarHeaderInit(pAd, &FrameBar, pEntry->Addr, pEntry->HdrAddr2);\n#else\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\t\tif (IS_ENTRY_APCLI(pEntry))\t\t\n\t\t\t\t\tBarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].CurrentAddress);\t\t\t\n\t\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t\t\tBarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid);\t\t\t\t\t\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tBarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->CurrentAddress);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t\t\tFrameBar.StartingSeq.field.FragNum = 0; /* make sure sequence not clear in DEL function.*/\n\t\t\tFrameBar.StartingSeq.field.StartSeq = Sequence; /* make sure sequence not clear in DEL funciton.*/\n\t\t\tFrameBar.BarControl.TID = TID; /* make sure sequence not clear in DEL funciton.*/\n\n\t\t\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t\t\t\t  sizeof(FRAME_BAR),\t  &FrameBar,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t/*if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET)))*/\n\t\t\tif (1)\t/* Now we always send BAR.*/\n\t\t\t{\n\t\t\t\t/*MiniportMMRequestUnlock(pAd, 0, pOutBuffer, FrameLen);*/\n\t\t\t\tMiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[TID]), pOutBuffer, FrameLen);\t\t\t\t\n\n\t\t\t}\n\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t}\n\t}\n}\n#endif /* DOT11_N_SUPPORT */\n\nVOID ActHeaderInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN OUT PHEADER_802_11 pHdr80211, \n    IN PUCHAR Addr1, \n    IN PUCHAR Addr2,\n    IN PUCHAR Addr3) \n{\n    NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));\n    pHdr80211->FC.Type = BTYPE_MGMT;\n    pHdr80211->FC.SubType = SUBTYPE_ACTION;\n\n    COPY_MAC_ADDR(pHdr80211->Addr1, Addr1);\n\tCOPY_MAC_ADDR(pHdr80211->Addr2, Addr2);\n    COPY_MAC_ADDR(pHdr80211->Addr3, Addr3);\n}\n\nVOID BarHeaderInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN OUT PFRAME_BAR pCntlBar, \n\tIN PUCHAR pDA,\n\tIN PUCHAR pSA) \n{\n/*\tUSHORT\tDuration;*/\n\n\tNdisZeroMemory(pCntlBar, sizeof(FRAME_BAR));\n\tpCntlBar->FC.Type = BTYPE_CNTL;\n\tpCntlBar->FC.SubType = SUBTYPE_BLOCK_ACK_REQ;\n   \tpCntlBar->BarControl.MTID = 0;\n\tpCntlBar->BarControl.Compressed = 1;\n\tpCntlBar->BarControl.ACKPolicy = 0;\n\n\n\tpCntlBar->Duration = 16 + RTMPCalcDuration(pAd, RATE_1, sizeof(FRAME_BA));\n\n\tCOPY_MAC_ADDR(pCntlBar->Addr1, pDA);\n\tCOPY_MAC_ADDR(pCntlBar->Addr2, pSA);\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInsert Category and action code into the action frame.\n\t\t\n\tParametrs:\n\t\t1. frame buffer pointer.\n\t\t2. frame length.\n\t\t3. category code of the frame.\n\t\t4. action code of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID InsertActField(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 Category,\n\tIN UINT8 ActCode)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(\tpFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&Category,\n\t\t\t\t\t\t1,\t\t\t\t&ActCode,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n"
  },
  {
    "path": "src/common/ba_action.c",
    "content": "#ifdef DOT11_N_SUPPORT\n\n#include \"rt_config.h\"\n\n\n\n#define BA_ORI_INIT_SEQ\t\t(pEntry->TxSeq[TID]) /*1\t\t\t inital sequence number of BA session*/\n\n#define ORI_SESSION_MAX_RETRY\t8\n#define ORI_BA_SESSION_TIMEOUT\t(2000)\t/* ms*/\n#define REC_BA_SESSION_IDLE_TIMEOUT\t(1000)\t/* ms*/\n\n#define REORDERING_PACKET_TIMEOUT\t\t((100 * OS_HZ)/1000)\t/* system ticks -- 100 ms*/\n#define MAX_REORDERING_PACKET_TIMEOUT\t((3000 * OS_HZ)/1000)\t/* system ticks -- 100 ms*/\n\n\n#define RESET_RCV_SEQ\t\t(0xFFFF)\n\nstatic void ba_mpdu_blk_free(PRTMP_ADAPTER pAd, struct reordering_mpdu *mpdu_blk);\n\n\nBA_ORI_ENTRY *BATableAllocOriEntry(\n\t\t\t\t\t\t\t\t  IN  PRTMP_ADAPTER   pAd,\n\t\t\t\t\t\t\t\t  OUT USHORT          *Idx);\n\nBA_REC_ENTRY *BATableAllocRecEntry(\n\t\t\t\t\t\t\t\t  IN  PRTMP_ADAPTER   pAd,\n\t\t\t\t\t\t\t\t  OUT USHORT          *Idx);\n\nVOID BAOriSessionSetupTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\nVOID BARecSessionIdleTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\n\nBUILD_TIMER_FUNCTION(BAOriSessionSetupTimeout);\nBUILD_TIMER_FUNCTION(BARecSessionIdleTimeout);\n\n#define ANNOUNCE_REORDERING_PACKET(_pAd, _mpdu_blk)\t\\\n\t\t\tAnnounce_Reordering_Packet(_pAd, _mpdu_blk);\n\nVOID BA_MaxWinSizeReasign(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN MAC_TABLE_ENTRY  *pEntryPeer,\n\tOUT UCHAR\t\t\t*pWinSize)\n{\n\tUCHAR MaxSize;\n\tUCHAR MaxPeerRxSize;\n\n\n\tif (CLIENT_STATUS_TEST_FLAG(pEntryPeer, fCLIENT_STATUS_RALINK_CHIPSET))\n\t\tMaxPeerRxSize = (1 << (pEntryPeer->MaxRAmpduFactor + 3));  /* (2^(13 + exp)) / 2048 bytes */\n\telse\n\t\tMaxPeerRxSize = (((1 << (pEntryPeer->MaxRAmpduFactor + 3)) * 10) / 16) -1;\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t\tMaxSize = 31;\n\telse\n#endif /* RT65xx */\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\tMaxSize = 21;\n\telse\n#endif /* MT7601 */\n\tif (pAd->MACVersion >= RALINK_2883_VERSION)\n\t{\n\t\tif (pAd->MACVersion >= RALINK_3070_VERSION)\n\t\t{\n\t\t\tif (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t\tMaxSize = 7; /* for non-open mode*/\n\t\t\telse\n\t\t\t\tMaxSize = 13;\n\t\t}\n\t\telse\n\t\t\tMaxSize = 31;\n\t}\n\telse if (pAd->MACVersion >= RALINK_2880E_VERSION) /* 2880e */\n\t{\n\t\tif (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\tMaxSize = 7; /* for non-open mode */\n\t\telse\n\t\t\tMaxSize = 13;\n\t}\n\telse\n\t\tMaxSize = 7;\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ba>WinSize=%d, MaxSize=%d, MaxPeerRxSize=%d\\n\", \n\t\t\t*pWinSize, MaxSize, MaxPeerRxSize));\n\n\tMaxSize = min(MaxPeerRxSize, MaxSize);\n\tif ((*pWinSize) > MaxSize)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ba> reassign max win size from %d to %d\\n\", \n\t\t\t\t*pWinSize, MaxSize));\n\n\t\t*pWinSize = MaxSize;\n\t}\n}\n\nvoid Announce_Reordering_Packet(IN PRTMP_ADAPTER\t\t\tpAd,\n\t\t\t\t\t\t\t\tIN struct reordering_mpdu\t*mpdu)\n{\n\tPNDIS_PACKET    pPacket;\n\n\tpPacket = mpdu->pPacket;\n\n\tif (mpdu->bAMSDU)\n\t{\n\t\t/*ASSERT(0);*/\n\t\tBA_Reorder_AMSDU_Annnounce(pAd, pPacket, mpdu->OpMode);\n\t}\n\telse\n\t{\n\t\t\n\t\t/* pass this 802.3 packet to upper layer or forward this packet to WM directly */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket, RTMP_GET_PACKET_IF(pPacket));\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (IS_OPMODE_AP(mpdu))\n\t\t{\n\t\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket, RTMP_GET_PACKET_IF(pPacket));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket, RTMP_GET_PACKET_IF(pPacket));\n\t\t}\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket, RTMP_GET_PACKET_IF(pPacket));\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n}\n\n/*\n * Insert a reordering mpdu into sorted linked list by sequence no.\n */\nBOOLEAN ba_reordering_mpdu_insertsorted(struct reordering_list *list, struct reordering_mpdu *mpdu)\n{\n\n\tstruct reordering_mpdu **ppScan = &list->next;\n\n\twhile (*ppScan != NULL)\n\t{\n\t\tif (SEQ_SMALLER((*ppScan)->Sequence, mpdu->Sequence, MAXSEQ))\n\t\t{\n\t\t\tppScan = &(*ppScan)->next;          \n\t\t}\n\t\telse if ((*ppScan)->Sequence == mpdu->Sequence)\n\t\t{\n\t\t\t/* give up this duplicated frame */\n\t\t\treturn(FALSE);         \n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* find position */\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tmpdu->next = *ppScan;\n\t*ppScan = mpdu;\n\tlist->qlen++;\n\treturn TRUE;\n}\n\n\n/*\n * caller lock critical section if necessary\n */\nstatic inline void ba_enqueue(struct reordering_list *list, struct reordering_mpdu *mpdu_blk)\n{\n\tlist->qlen++;\n\tmpdu_blk->next = list->next;\n\tlist->next = mpdu_blk;\n}\n\n/*\n * caller lock critical section if necessary\n */\nstatic inline struct reordering_mpdu * ba_dequeue(struct reordering_list *list)\n{\n\tstruct reordering_mpdu *mpdu_blk = NULL;\n\n\tASSERT(list);\n\n\t\tif (list->qlen)\n\t\t{\n\t\t\tlist->qlen--;\n\t\t\tmpdu_blk = list->next;\n\t\t\tif (mpdu_blk)\n\t\t\t{\n\t\t\t\tlist->next = mpdu_blk->next;\n\t\t\t\tmpdu_blk->next = NULL;\n\t\t\t}\n\t\t}\n\treturn mpdu_blk;\n}\n\n\nstatic inline struct reordering_mpdu  *ba_reordering_mpdu_dequeue(struct reordering_list *list)\n{\n\treturn(ba_dequeue(list));\n}\n\n\nstatic inline struct reordering_mpdu  *ba_reordering_mpdu_probe(struct reordering_list *list)\n\t{\n\tASSERT(list);\n\n\t\treturn(list->next);\n\t}\n\n\n/* \n * free all resource for reordering mechanism \n */\nvoid ba_reordering_resource_release(PRTMP_ADAPTER pAd) \n{\n\tBA_TABLE        *Tab;\n\tPBA_REC_ENTRY   pBAEntry;\n\tstruct reordering_mpdu *mpdu_blk;\n\tint i;\n\n\tTab = &pAd->BATable;\n\n\t/* I.  release all pending reordering packet */\n\tNdisAcquireSpinLock(&pAd->BATabLock);\n\tfor (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++)\n\t{\n\t\tpBAEntry = &Tab->BARecEntry[i];\n\t\tif (pBAEntry->REC_BA_Status != Recipient_NONE)\n\t\t{\n\t\t\twhile ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list)))\n\t\t\t{\n\t\t\t\tASSERT(mpdu_blk->pPacket);\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, mpdu_blk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\tba_mpdu_blk_free(pAd, mpdu_blk);\n\t\t\t}           \n\t\t}\n\t}\n\tNdisReleaseSpinLock(&pAd->BATabLock);\n\n\tASSERT(pBAEntry->list.qlen == 0);\n\t/* II. free memory of reordering mpdu table */\n\tNdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);\n\tos_free_mem(pAd, pAd->mpdu_blk_pool.mem);\n\tNdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);\n}\n\n\n\n/* \n * Allocate all resource for reordering mechanism \n */\nBOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num)\n{\n\tint     i;\n\tPUCHAR  mem;\n\tstruct reordering_mpdu *mpdu_blk;\n\tstruct reordering_list *freelist;\n\n\t/* allocate spinlock */\n\tNdisAllocateSpinLock(pAd, &pAd->mpdu_blk_pool.lock);\n\n\t/* initialize freelist */\n\tfreelist = &pAd->mpdu_blk_pool.freelist;\n\tfreelist->next = NULL;\n\tfreelist->qlen = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Allocate %d memory for BA reordering\\n\", (UINT32)(num*sizeof(struct reordering_mpdu))));\n\n\t/* allocate number of mpdu_blk memory */\n\tos_alloc_mem(pAd, (PUCHAR *)&mem, (num*sizeof(struct reordering_mpdu)));\n\n\tpAd->mpdu_blk_pool.mem = mem;\n\n\tif (mem == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can't Allocate Memory for BA Reordering\\n\"));\n\t\treturn(FALSE);\n\t}\n\n\t/* build mpdu_blk free list */\n\tfor (i=0; i<num; i++)\n\t{\n\t\t/* get mpdu_blk */\n\t\tmpdu_blk = (struct reordering_mpdu *) mem;\n\t\t/* initial mpdu_blk */\n\t\tNdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu));\n\t\t/* next mpdu_blk */\n\t\tmem += sizeof(struct reordering_mpdu);\n\t\t/* insert mpdu_blk into freelist */\n\t\tba_enqueue(freelist, mpdu_blk);\n\t}\n\n\treturn(TRUE);\n}\n\n/* static int blk_count=0;  sample take off, no use */\n\nstatic struct reordering_mpdu *ba_mpdu_blk_alloc(PRTMP_ADAPTER pAd)\n{\n\tstruct reordering_mpdu *mpdu_blk;\n\n\tNdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);\n\tmpdu_blk = ba_dequeue(&pAd->mpdu_blk_pool.freelist);\n\tif (mpdu_blk)\n\t{\n/*\t\tblk_count++; */\n\t\t/* reset mpdu_blk */\n\t\tNdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu));\n\t}\n\tNdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);\n\treturn mpdu_blk;\n}\n\nstatic void ba_mpdu_blk_free(PRTMP_ADAPTER pAd, struct reordering_mpdu *mpdu_blk)\n{\n\tASSERT(mpdu_blk);\n\n\tNdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);\n/*\tblk_count--; */\n\tba_enqueue(&pAd->mpdu_blk_pool.freelist, mpdu_blk);\n\tNdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);\n}\n\n\nstatic USHORT ba_indicate_reordering_mpdus_in_order(\n\t\t\t\t\t\t\t\t\t\t\t\t   IN PRTMP_ADAPTER    pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t   IN PBA_REC_ENTRY    pBAEntry,\n\t\t\t\t\t\t\t\t\t\t\t\t   IN USHORT           StartSeq)\n{\n\tstruct reordering_mpdu *mpdu_blk;\n\tUSHORT  LastIndSeq = RESET_RCV_SEQ;\n\n\tNdisAcquireSpinLock(&pBAEntry->RxReRingLock);\n\n\twhile ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list)))\n\t\t{\n\t\t\t/* find in-order frame */\n\t\tif (!SEQ_STEPONE(mpdu_blk->Sequence, StartSeq, MAXSEQ))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/* dequeue in-order frame from reodering list */\n\t\t\tmpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list);\n\t\t\t/* pass this frame up */\n\t\tANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);\n\t\t/* move to next sequence */\n\t\t\tStartSeq = mpdu_blk->Sequence;\n\t\tLastIndSeq = StartSeq;\n\t\t/* free mpdu_blk */\n\t\t\tba_mpdu_blk_free(pAd, mpdu_blk);\n\t}\n\n\tNdisReleaseSpinLock(&pBAEntry->RxReRingLock);\n\n\t/* update last indicated sequence */\n\treturn LastIndSeq;\n}\n\nstatic void ba_indicate_reordering_mpdus_le_seq(\n\t\t\t\t\t\t\t\t\t\t\t   IN PRTMP_ADAPTER    pAd, \n\t\t\t\t\t\t\t\t\t\t\t   IN PBA_REC_ENTRY    pBAEntry,\n\t\t\t\t\t\t\t\t\t\t\t   IN USHORT           Sequence)\n{\n\tstruct reordering_mpdu *mpdu_blk;\n\n\tNdisAcquireSpinLock(&pBAEntry->RxReRingLock);\n\twhile ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list)))\n\t\t{\n\t\t\t/* find in-order frame */\n\t\tif ((mpdu_blk->Sequence == Sequence) || SEQ_SMALLER(mpdu_blk->Sequence, Sequence, MAXSEQ))\n\t\t{\n\t\t\t/* dequeue in-order frame from reodering list */\n\t\t\tmpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list);\n\t\t\t/* pass this frame up */\n\t\t\tANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);\n\t\t\t/* free mpdu_blk */\n\t\t\tba_mpdu_blk_free(pAd, mpdu_blk);            \n\t\t}\n\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t}\n\tNdisReleaseSpinLock(&pBAEntry->RxReRingLock);   \n}\n\n\nstatic void ba_refresh_reordering_mpdus(\n\t\t\t\t\t\t\t\t\t   IN PRTMP_ADAPTER    pAd, \n\t\t\t\t\t\t\t\t\t   PBA_REC_ENTRY       pBAEntry)\n{\n\tstruct reordering_mpdu *mpdu_blk;\n\n\tNdisAcquireSpinLock(&pBAEntry->RxReRingLock);\n\n\t\t\t/* dequeue in-order frame from reodering list */\n\twhile ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list)))\n\t{\n\t\t\t/* pass this frame up */\n\t\tANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);\n\n\t\tpBAEntry->LastIndSeq = mpdu_blk->Sequence;\n\t\t\tba_mpdu_blk_free(pAd, mpdu_blk);\n\t\t\t\n\t\t/* update last indicated sequence */                    \n\t}\n\tASSERT(pBAEntry->list.qlen == 0);\n\tpBAEntry->LastIndSeq = RESET_RCV_SEQ;\n\tNdisReleaseSpinLock(&pBAEntry->RxReRingLock);   \n}\n\n\n/* static */\nvoid ba_flush_reordering_timeout_mpdus(\n\t\t\t\t\t\t\t\t\tIN PRTMP_ADAPTER    pAd, \n\t\t\t\t\t\t\t\t\tIN PBA_REC_ENTRY    pBAEntry,\n\t\t\t\t\t\t\t\t\tIN ULONG            Now32)\n\n{\n\tUSHORT Sequence;\n\n    if ((pBAEntry == NULL) || (pBAEntry->list.qlen <= 0))\n        return;\n\n/*\tif ((RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+REORDERING_PACKET_TIMEOUT)) &&*/\n/*\t\t (pBAEntry->list.qlen > ((pBAEntry->BAWinSize*7)/8))) ||*/\n/*\t\t(RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(10*REORDERING_PACKET_TIMEOUT))) &&*/\n/*\t\t (pBAEntry->list.qlen > (pBAEntry->BAWinSize/8)))*/\n\tif (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(MAX_REORDERING_PACKET_TIMEOUT/6))) \n\t\t &&(pBAEntry->list.qlen > 1)\n\t\t)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"timeout[%d] (%08lx-%08lx = %d > %d): %x, flush all!\\n \", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), \n\t\t\t   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), MAX_REORDERING_PACKET_TIMEOUT,\n\t\t\t   pBAEntry->LastIndSeq));\n\t\tba_refresh_reordering_mpdus(pAd, pBAEntry);\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\t}\n\telse\n\tif (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))\n\t\t&& (pBAEntry->list.qlen > 0)\n\t   )\n\t\t{\n/*\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"timeout[%d] (%lx-%lx = %d > %d): %x, \", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer),\n\t\t\t   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), REORDERING_PACKET_TIMEOUT,\n\t\t\t   pBAEntry->LastIndSeq));\n*/\n    \t\t\n\t\t/* force LastIndSeq to shift to LastIndSeq+1*/\n    \t\tSequence = (pBAEntry->LastIndSeq+1) & MAXSEQ;\n    \t\tba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);\n    \t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\t\t\tpBAEntry->LastIndSeq = Sequence;\n    \t\t\n    \t\t/* indicate in-order mpdus*/\n    \t\tSequence = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, Sequence);\n    \t\tif (Sequence != RESET_RCV_SEQ)\n    \t\t{\n    \t\t\tpBAEntry->LastIndSeq = Sequence;\n    \t\t}\n\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%x, flush one!\\n\", pBAEntry->LastIndSeq));\n\n\t}\n}\n\n\n/* \n * generate ADDBA request to \n * set up BA agreement\n */\nVOID BAOriSessionSetUp(\n\t\t\t\t\t  IN PRTMP_ADAPTER    pAd, \n\t\t\t\t\t  IN MAC_TABLE_ENTRY  *pEntry,\n\t\t\t\t\t  IN UCHAR            TID,\n\t\t\t\t\t  IN USHORT           TimeOut,\n\t\t\t\t\t  IN ULONG            DelayTime,\n\t\t\t\t\t  IN BOOLEAN          isForced)\n\n{\n\t/*MLME_ADDBA_REQ_STRUCT\tAddbaReq;*/\n\tBA_ORI_ENTRY            *pBAEntry = NULL;\n\tUSHORT                  Idx;\n\tBOOLEAN                 Cancelled;\n\n\tASSERT(TID < NUM_OF_TID);\n\tif (TID >= NUM_OF_TID)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Wrong TID %d!\\n\", TID));\n\t\treturn;\n\t}\n    \n\tif ((pAd->CommonCfg.BACapability.field.AutoBA != TRUE)  &&  (isForced == FALSE))\n\t\treturn;\n\n\t/* if this entry is limited to use legacy tx mode, it doesn't generate BA.  */\n\tif (RTMPStaFixedTxMode(pAd, pEntry) != FIXED_TXMODE_HT)\n\t\treturn;\n\n\tif ((pEntry->BADeclineBitmap & (1<<TID)) && (isForced == FALSE))\n\t{\n\t\t/* try again after 3 secs*/\n\t\tDelayTime = 3000; \n/*\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DeCline BA from Peer\\n\"));*/\n/*\t\treturn;*/\n\t}\n\n\t\n\tIdx = pEntry->BAOriWcidArray[TID];  \n\tif (Idx == 0)\n\t{\n\t\t/* allocate a BA session*/\n\t\tpBAEntry = BATableAllocOriEntry(pAd, &Idx);     \n\t\tif (pBAEntry == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ADDBA - MlmeADDBAAction() allocate BA session failed \\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\tpBAEntry =&pAd->BATable.BAOriEntry[Idx];\n\t}\n\n\tif (pBAEntry->ORI_BA_Status >= Originator_WaitRes)\n\t{\n\t\treturn;\n\t}\n\n\tpEntry->BAOriWcidArray[TID] = Idx;\n\n\t/* Initialize BA session */\n\tpBAEntry->ORI_BA_Status = Originator_WaitRes;       \n\tpBAEntry->Wcid = pEntry->Aid;\n\tpBAEntry->BAWinSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit;   \n\tpBAEntry->Sequence = BA_ORI_INIT_SEQ;\n\tpBAEntry->Token = 1;\t/* (2008-01-21) Jan Lee recommends it - this token can't be 0*/\n\tpBAEntry->TID = TID;\n\tpBAEntry->TimeOutValue = TimeOut;   \n\tpBAEntry->pAdapter = pAd;\n\t\n\tif (!(pEntry->TXBAbitmap & (1<<TID)))\n\t{\n\t\tRTMPInitTimer(pAd, &pBAEntry->ORIBATimer, GET_TIMER_FUNCTION(BAOriSessionSetupTimeout), pBAEntry, FALSE);\n\t}\n\telse\n\t\tRTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);\n\n\t/* set timer to send ADDBA request */\n\tRTMPSetTimer(&pBAEntry->ORIBATimer, DelayTime);\n}\n\nVOID BAOriSessionAdd(\n\t\t\tIN PRTMP_ADAPTER    pAd, \n\t\t\t\t\tIN MAC_TABLE_ENTRY  *pEntry,\n\t\t\tIN PFRAME_ADDBA_RSP pFrame)\n{\n\tBA_ORI_ENTRY  *pBAEntry = NULL;\n\tBOOLEAN       Cancelled;\n\tUCHAR         TID;\n\tUSHORT        Idx;\n\tPUCHAR          pOutBuffer2 = NULL;\n\tNDIS_STATUS     NStatus;\n\tULONG           FrameLen;\n\tFRAME_BAR       FrameBar;\n\tUCHAR\t\t\tMaxPeerBufSize;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\tapidx;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tTID = pFrame->BaParm.TID;\n\tIdx = pEntry->BAOriWcidArray[TID];  \n\tpBAEntry =&pAd->BATable.BAOriEntry[Idx];\n\n\tMaxPeerBufSize = 0;\n\n\t/* Start fill in parameters.*/\n\tif ((Idx !=0) && (pBAEntry->TID == TID) && (pBAEntry->ORI_BA_Status == Originator_WaitRes))\n\t{\n\t\tMaxPeerBufSize = (UCHAR)pFrame->BaParm.BufSize;\n\n\t\tif (MaxPeerBufSize > 0)\n\t\t\tMaxPeerBufSize -= 1;\n\t\telse\n\t\t\tMaxPeerBufSize = 0;\n\t\tpBAEntry->BAWinSize = min(pBAEntry->BAWinSize, MaxPeerBufSize);\n\t\tBA_MaxWinSizeReasign(pAd, pEntry, &pBAEntry->BAWinSize);\n\n\t\tpBAEntry->TimeOutValue = pFrame->TimeOutValue;\n\t\tpBAEntry->ORI_BA_Status = Originator_Done;\n\t\tpAd->BATable.numDoneOriginator ++;\n\t\t\n\t\t/* reset sequence number */\n\t\tpBAEntry->Sequence = BA_ORI_INIT_SEQ;\n\t\t/* Set Bitmap flag.*/\n\t\tpEntry->TXBAbitmap |= (1<<TID);\n\t\tRTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);\n\n\t\tpBAEntry->ORIBATimer.TimerValue = 0;\t/*pFrame->TimeOutValue;*/\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():TXBAbitmap=%x, BAWinSize=%d, TimeOut=%ld\\n\",\n\t\t\t\t\t__FUNCTION__, pEntry->TXBAbitmap, \n\t\t\t\t\tpBAEntry->BAWinSize, pBAEntry->ORIBATimer.TimerValue));\n\n\t\t/* SEND BAR */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer2);  /*Get an unused nonpaged memory*/\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BA - BAOriSessionAdd() allocate memory failed \\n\"));\n\t\t\treturn;\n\t\t}\n\n#ifdef P2P_SUPPORT\n\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->MacTab.Content[pBAEntry->Wcid].HdrAddr2);\n#else\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[pBAEntry->Wcid]))\n\t\t\t{\t\t\t\n\t\t\t\tapidx = pAd->MacTab.Content[pBAEntry->Wcid].MatchAPCLITabIdx;\n\t\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress);\n\t\t\t}\t\n\t\t\telse\n#endif /* APCLI_SUPPORT */\t\t\t\n\t\t\t{\t\t\t\n\t\t\t\tapidx = pAd->MacTab.Content[pBAEntry->Wcid].apidx;\n\t\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tBarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->CurrentAddress);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t\tFrameBar.StartingSeq.field.FragNum = 0;\t/* make sure sequence not clear in DEL function.*/\n\t\tFrameBar.StartingSeq.field.StartSeq = pBAEntry->Sequence; /* make sure sequence not clear in DEL funciton.*/\n\t\tFrameBar.BarControl.TID = pBAEntry->TID; /* make sure sequence not clear in DEL funciton.*/\n\t\tMakeOutgoingFrame(pOutBuffer2,              &FrameLen,\n\t\t\t\t\t\t\tsizeof(FRAME_BAR),      &FrameBar,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer2);\n\n\t\tif (pBAEntry->ORIBATimer.TimerValue)\n\t\t\tRTMPSetTimer(&pBAEntry->ORIBATimer, pBAEntry->ORIBATimer.TimerValue); /* in mSec */\n\t}\n}\n\nBOOLEAN BARecSessionAdd(\n\t\t\t\t\t   IN PRTMP_ADAPTER    pAd, \n\t\t\t\t\t   IN MAC_TABLE_ENTRY  *pEntry,\n\t\t\t\t\t   IN PFRAME_ADDBA_REQ pFrame)\n{\n\tBA_REC_ENTRY            *pBAEntry = NULL;\n\tBOOLEAN                 Status = TRUE;\n\tBOOLEAN                 Cancelled;\n\tUSHORT                  Idx;\n\tUCHAR                   TID;\n\tUCHAR                   BAWinSize;\n\t/*UINT32                  Value;*/\n\t/*UINT                    offset;*/\n\n\n\tASSERT(pEntry);\n\n\t/* find TID*/\n\tTID = pFrame->BaParm.TID;\n\n\tBAWinSize = min(((UCHAR)pFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit);\n\n\t/* Intel patch*/\n\tif (BAWinSize == 0)\n\t{\n\t\tBAWinSize = 64;\n\t}\n\n\t/* get software BA rec array index, Idx*/\n\tIdx = pEntry->BARecWcidArray[TID];\n\n\n\tif (Idx == 0)\n\t{\n\t\t/* allocate new array entry for the new session*/\n\t\tpBAEntry = BATableAllocRecEntry(pAd, &Idx);     \n\t}\n\telse\n\t{\n\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t\t/* flush all pending reordering mpdus*/\n\t\tba_refresh_reordering_mpdus(pAd, pBAEntry);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s(%ld): Idx = %d, BAWinSize(req %d) = %d\\n\", __FUNCTION__, pAd->BATable.numAsRecipient, Idx, \n\t\t\t\t\t\t\t pFrame->BaParm.BufSize, BAWinSize));\n\n\t/* Start fill in parameters.*/\n\tif (pBAEntry != NULL)\n\t{\n\t\tASSERT(pBAEntry->list.qlen == 0);\n\n\t\tpBAEntry->REC_BA_Status = Recipient_HandleRes;\n\t\tpBAEntry->BAWinSize = BAWinSize;\n\t\tpBAEntry->Wcid = pEntry->Aid;\n\t\tpBAEntry->TID = TID;\n\t\tpBAEntry->TimeOutValue = pFrame->TimeOutValue;\n\t\tpBAEntry->REC_BA_Status = Recipient_Accept;\n\t\t/* initial sequence number */\n\t\tpBAEntry->LastIndSeq = RESET_RCV_SEQ; /*pFrame->BaStartSeq.field.StartSeq;*/\n\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Start Seq = %08x\\n\",  pFrame->BaStartSeq.field.StartSeq));\n\n\t\tif (pEntry->RXBAbitmap & (1<<TID))\n\t\t{\n\t\t\tRTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMPInitTimer(pAd, &pBAEntry->RECBATimer, GET_TIMER_FUNCTION(BARecSessionIdleTimeout), pBAEntry, TRUE);\n\t\t}\n\n\n\t\t/* Set Bitmap flag.*/\n\t\tpEntry->RXBAbitmap |= (1<<TID);\n\t\tpEntry->BARecWcidArray[TID] = Idx;\n\n\t\tpEntry->BADeclineBitmap &= ~(1<<TID);\n\n\t\t/* Set BA session mask in WCID table.*/\n\t\tRTMP_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\\n\", \n\t\t\t\tpEntry->Aid, pEntry->RXBAbitmap, pEntry->BARecWcidArray[TID]));\n\t}\n\telse\n\t{\n\t\tStatus = FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Can't Accept ADDBA for %02x:%02x:%02x:%02x:%02x:%02x TID = %d\\n\", \n\t\t\t\tPRINT_MAC(pEntry->Addr), TID));\n\t}\n\treturn(Status);\n}\n\n\nBA_REC_ENTRY *BATableAllocRecEntry(\n\t\t\t\t\t\t\t\t  IN  PRTMP_ADAPTER   pAd,\n\t\t\t\t\t\t\t\t  OUT USHORT          *Idx)\n{\n\tint             i;\n\tBA_REC_ENTRY    *pBAEntry = NULL;\n\n\n\tNdisAcquireSpinLock(&pAd->BATabLock);\n\n\tif (pAd->BATable.numAsRecipient >= (MAX_LEN_OF_BA_REC_TABLE - 1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"BA Recipeint Session (%ld) > %d\\n\", \n\t\t\t\t\t\t\tpAd->BATable.numAsRecipient, (MAX_LEN_OF_BA_REC_TABLE - 1)));\n\t\tgoto done;\n\t}\n\n\t/* reserve idx 0 to identify BAWcidArray[TID] as empty*/\n\tfor (i=1; i < MAX_LEN_OF_BA_REC_TABLE; i++)\n\t{\n\t\tpBAEntry =&pAd->BATable.BARecEntry[i];\n\t\tif ((pBAEntry->REC_BA_Status == Recipient_NONE))\n\t\t{\n\t\t\t/* get one */\n\t\t\tpAd->BATable.numAsRecipient++;\n\t\t\tpBAEntry->REC_BA_Status = Recipient_USED;\n\t\t\t*Idx = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\ndone:\n\tNdisReleaseSpinLock(&pAd->BATabLock);\n\treturn pBAEntry;\n}\n\nBA_ORI_ENTRY *BATableAllocOriEntry(\n\t\t\t\t\t\t\t\t  IN  PRTMP_ADAPTER   pAd,\n\t\t\t\t\t\t\t\t  OUT USHORT          *Idx)\n{\n\tint             i;\n\tBA_ORI_ENTRY    *pBAEntry = NULL;\n\n\tNdisAcquireSpinLock(&pAd->BATabLock);\n\n\tif (pAd->BATable.numAsOriginator >= (MAX_LEN_OF_BA_ORI_TABLE - 1))\n\t{\n\t\tgoto done;\n\t}\n\t\t\n\t/* reserve idx 0 to identify BAWcidArray[TID] as empty*/\n\tfor (i=1; i<MAX_LEN_OF_BA_ORI_TABLE; i++)\n\t{\n\t\tpBAEntry =&pAd->BATable.BAOriEntry[i];\n\t\tif ((pBAEntry->ORI_BA_Status == Originator_NONE))\n\t\t{\n\t\t\t/* get one */\n\t\t\tpAd->BATable.numAsOriginator++;\n\t\t\tpBAEntry->ORI_BA_Status = Originator_USED;\n\t\t\tpBAEntry->pAdapter = pAd;\n\t\t\t*Idx = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\ndone:\n\tNdisReleaseSpinLock(&pAd->BATabLock);\n\treturn pBAEntry;\n}\n\n\nVOID BATableFreeOriEntry(\n\t\t\t\t\t\tIN  PRTMP_ADAPTER   pAd,\n\t\t\t\t\t\tIN  ULONG           Idx)\n{\n\tBA_ORI_ENTRY    *pBAEntry = NULL;\n\tMAC_TABLE_ENTRY *pEntry;\n\n\n\tif ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))\n\t\treturn;\n\n\tpBAEntry =&pAd->BATable.BAOriEntry[Idx];\n\n\tif (pBAEntry->ORI_BA_Status != Originator_NONE)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[pBAEntry->Wcid];\n\t\tpEntry->BAOriWcidArray[pBAEntry->TID] = 0;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Wcid = %d, TID = %d\\n\", __FUNCTION__, pBAEntry->Wcid, pBAEntry->TID));\n\n\n\t\tNdisAcquireSpinLock(&pAd->BATabLock);\n\t\tif (pBAEntry->ORI_BA_Status == Originator_Done)\n\t\t{\n\t\t\tpAd->BATable.numDoneOriginator -= 1;\n\t\t \tpEntry->TXBAbitmap &= (~(1<<(pBAEntry->TID) ));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BATableFreeOriEntry numAsOriginator= %ld\\n\", pAd->BATable.numAsRecipient));\n\t\t\t/* Erase Bitmap flag.*/\n\t\t}\n\t\n\t\tASSERT(pAd->BATable.numAsOriginator != 0);\n\n\t\tpAd->BATable.numAsOriginator -= 1;\n\t\t\n\t\tpBAEntry->ORI_BA_Status = Originator_NONE;\n\t\tpBAEntry->Token = 0;\n\t\tNdisReleaseSpinLock(&pAd->BATabLock);\n\t}\n}\n\n\nVOID BATableFreeRecEntry(\n\t\t\t\t\t\tIN  PRTMP_ADAPTER   pAd,\n\t\t\t\t\t\tIN  ULONG           Idx)\n{\n\tBA_REC_ENTRY    *pBAEntry = NULL;\n\tMAC_TABLE_ENTRY *pEntry;\n\n\n\tif ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_REC_TABLE))\n\t\treturn;\n\n\tpBAEntry =&pAd->BATable.BARecEntry[Idx];\n\n\tif (pBAEntry->REC_BA_Status != Recipient_NONE)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[pBAEntry->Wcid];\n\t\tpEntry->BARecWcidArray[pBAEntry->TID] = 0;\n\n\t\tNdisAcquireSpinLock(&pAd->BATabLock);\n\t\t\n\t\tASSERT(pAd->BATable.numAsRecipient != 0);\n\n\t\tpAd->BATable.numAsRecipient -= 1;\n\n\t\tpBAEntry->REC_BA_Status = Recipient_NONE;\n\t\tNdisReleaseSpinLock(&pAd->BATabLock);\n\t}\n}\n\n\nVOID BAOriSessionTearDown(\n\t\t\t\t\t\t IN OUT  PRTMP_ADAPTER   pAd, \n\t\t\t\t\t\t IN      UCHAR           Wcid,\n\t\t\t\t\t\t IN      UCHAR           TID,\n\t\t\t\t\t\t IN      BOOLEAN         bPassive,\n\t\t\t\t\t\t IN      BOOLEAN         bForceSend)\n{\n\tULONG           Idx = 0;\n\tBA_ORI_ENTRY    *pBAEntry;\n\tBOOLEAN         Cancelled;\n\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\treturn;\n\t}\n\n\t\n\t/* Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID).*/\n\tIdx = pAd->MacTab.Content[Wcid].BAOriWcidArray[TID];\n\tif ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))\n\t{\n\t\tif (bForceSend == TRUE)\n\t\t{\n\t\t\t/* force send specified TID DelBA*/\n\t\t\tMLME_DELBA_REQ_STRUCT   DelbaReq;   \n\t\t\tMLME_QUEUE_ELEM *Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif (Elem != NULL)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&DelbaReq, sizeof(DelbaReq));\n\t\t\t\tNdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\n\t\t\t\tCOPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr);\n\t\t\t\tDelbaReq.Wcid = Wcid;\n\t\t\t\tDelbaReq.TID = TID;\n\t\t\t\tDelbaReq.Initiator = ORIGINATOR;\n\t\t\t\tElem->MsgLen  = sizeof(DelbaReq);\t\t\t\n\t\t\t\tNdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));\n\t\t\t\tMlmeDELBAAction(pAd, Elem);\n/*\t\t\t\tkfree(Elem);*/\n\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(bForceSend):alloc memory failed!\\n\", __FUNCTION__));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s===>Wcid=%d.TID=%d \\n\", __FUNCTION__, Wcid, TID));\n\n\tpBAEntry = &pAd->BATable.BAOriEntry[Idx];\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\t===>Idx = %ld, Wcid=%d.TID=%d, ORI_BA_Status = %d \\n\", Idx, Wcid, TID, pBAEntry->ORI_BA_Status));\n\t\n\t/* Prepare DelBA action frame and send to the peer.*/\n\tif ((bPassive == FALSE) && (TID == pBAEntry->TID) && (pBAEntry->ORI_BA_Status == Originator_Done))\n\t{\n\t\tMLME_DELBA_REQ_STRUCT   DelbaReq;   \n\t\tMLME_QUEUE_ELEM *Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n\t\tos_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\tif (Elem != NULL)\n\t\t{\n\t\t\tNdisZeroMemory(&DelbaReq, sizeof(DelbaReq));\n\t\t\tNdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\n\t\t\tCOPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr);\n\t\t\tDelbaReq.Wcid = Wcid;\n\t\t\tDelbaReq.TID = pBAEntry->TID;\n\t\t\tDelbaReq.Initiator = ORIGINATOR;\n\t\t\tElem->MsgLen  = sizeof(DelbaReq);\t\t\t\n\t\t\tNdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));\n\t\t\tMlmeDELBAAction(pAd, Elem);\n/*\t\t\tkfree(Elem);*/\n\t\t\tos_free_mem(NULL, Elem);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():alloc memory failed!\\n\", __FUNCTION__));\n\t\t\treturn;\n\t\t}\n\t}\n\tRTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);\n\tBATableFreeOriEntry(pAd, Idx);\n\n\tif (bPassive)\n\t{\n\t\t/*BAOriSessionSetUp(pAd, &pAd->MacTab.Content[Wcid], TID, 0, 10000, TRUE);*/\n\t}\n}\n\nVOID BARecSessionTearDown(\n\t\t\t\t\t\t IN OUT  PRTMP_ADAPTER   pAd, \n\t\t\t\t\t\t IN      UCHAR           Wcid,\n\t\t\t\t\t\t IN      UCHAR           TID,\n\t\t\t\t\t\t IN      BOOLEAN         bPassive)\n{\n\tULONG           Idx = 0;\n\tBA_REC_ENTRY    *pBAEntry;\n\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\treturn;\n\t}\n\n\t\n\t/*  Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID).*/\n\tIdx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n\tif (Idx == 0)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s===>Wcid=%d.TID=%d \\n\", __FUNCTION__, Wcid, TID));\n\t\n\n\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\t===>Idx = %ld, Wcid=%d.TID=%d, REC_BA_Status = %d \\n\", Idx, Wcid, TID, pBAEntry->REC_BA_Status));\n\t\n\t/* Prepare DelBA action frame and send to the peer.*/\n\tif ((TID == pBAEntry->TID) && (pBAEntry->REC_BA_Status == Recipient_Accept))\n\t{\n\t\tMLME_DELBA_REQ_STRUCT   DelbaReq;\n\t\tBOOLEAN \t\t\t\tCancelled;\n\t\t/*ULONG   offset; */\n\t\t/*UINT32  VALUE;*/\n\t\t\t\t\n\t\tRTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);         \n\n\t\t\n\t\t/* 1. Send DELBA Action Frame*/\n\t\tif (bPassive == FALSE)\n\t\t{\n\t\t\tMLME_QUEUE_ELEM *Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif (Elem != NULL)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&DelbaReq, sizeof(DelbaReq));\n\t\t\t\tNdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\n\t\t\t\tCOPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr);\n\t\t\t\tDelbaReq.Wcid = Wcid;\n\t\t\t\tDelbaReq.TID = TID;\n\t\t\t\tDelbaReq.Initiator = RECIPIENT;\n\t\t\t\tElem->MsgLen  = sizeof(DelbaReq);\t\t\t\n\t\t\t\tNdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));\n\t\t\t\tMlmeDELBAAction(pAd, Elem);\n/*\t\t\t\tkfree(Elem);*/\n\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():alloc memory failed!\\n\", __FUNCTION__));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\n\t\t\n\t\t/* 2. Free resource of BA session*/\n\t\t/* flush all pending reordering mpdus */\n\t\tba_refresh_reordering_mpdus(pAd, pBAEntry);\n\n\t\tNdisAcquireSpinLock(&pAd->BATabLock);\n\n\t\t/* Erase Bitmap flag.*/\n\t\tpBAEntry->LastIndSeq = RESET_RCV_SEQ;\n\t\tpBAEntry->BAWinSize = 0;\n\t\t/* Erase Bitmap flag at software mactable*/\n\t\tpAd->MacTab.Content[Wcid].RXBAbitmap &= (~(1<<(pBAEntry->TID)));\n\t\tpAd->MacTab.Content[Wcid].BARecWcidArray[TID] = 0;\n\n\t\tRTMP_DEL_BA_SESSION_FROM_ASIC(pAd, Wcid, TID);\n\n\t\tNdisReleaseSpinLock(&pAd->BATabLock);\n\n\t}\n\n\tBATableFreeRecEntry(pAd, Idx);\n}\n\nVOID BASessionTearDownALL(\n\t\t\t\t\t\t IN OUT  PRTMP_ADAPTER pAd, \n\t\t\t\t\t\t IN      UCHAR Wcid)\n{\n\tint i;\n\n\tfor (i=0; i<NUM_OF_TID; i++)\n\t{\n\t\tBAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE);\n\t\tBARecSessionTearDown(pAd, Wcid, i, FALSE);\n\t}\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tRetry sending ADDBA Reqest.\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tParametrs:\n\tp8023Header: if this is already 802.3 format, p8023Header is NULL\n\t\n\tReturn\t: TRUE if put into rx reordering buffer, shouldn't indicaterxhere.\n\t\t\t\tFALSE , then continue indicaterx at this moment.\n\t==========================================================================\n */\nVOID BAOriSessionSetupTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n\tBA_ORI_ENTRY    *pBAEntry = (BA_ORI_ENTRY *)FunctionContext;\n\tMAC_TABLE_ENTRY *pEntry;\n\tPRTMP_ADAPTER   pAd;\n\t\n\tif (pBAEntry == NULL)\n\t\treturn;\n\n\tpAd = pBAEntry->pAdapter;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Do nothing if monitor mode is on*/\n\t\tif (MONITOR_ON(pAd))\n\t\t\treturn;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n    \n#ifdef RALINK_ATE\n\t/* Nothing to do in ATE mode. */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\tpEntry = &pAd->MacTab.Content[pBAEntry->Wcid];\n\n\tif ((pBAEntry->ORI_BA_Status == Originator_WaitRes) && (pBAEntry->Token < ORI_SESSION_MAX_RETRY))\n\t{\n\t\tMLME_ADDBA_REQ_STRUCT    AddbaReq;  \n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif ((pAd->OpMode == OPMODE_STA) && IS_ENTRY_CLIENT(pEntry) && IS_P2P_ENTRY_NONE(pEntry))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tif (INFRA_ON(pAd) && \n\t\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&\n\t\t\t\t(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)))\n\t\t\t{\n\t\t\t\t/* In scan progress and have no chance to send out, just re-schedule to another time period */\n\t\t\t\tRTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tNdisZeroMemory(&AddbaReq, sizeof(AddbaReq));\n\t\tCOPY_MAC_ADDR(AddbaReq.pAddr, pEntry->Addr);\n\t\tAddbaReq.Wcid = (UCHAR)(pEntry->Aid);\n\t\tAddbaReq.TID = pBAEntry->TID;\n\t\tAddbaReq.BaBufSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit;\n\t\tAddbaReq.TimeOutValue = 0;\n\t\tAddbaReq.Token = pBAEntry->Token;\n\t\tMlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(MLME_ADDBA_REQ_STRUCT), (PVOID)&AddbaReq, 0);\n\t\tRTMP_MLME_HANDLER(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BA Ori Session Timeout(%d) : Send ADD BA again\\n\", pBAEntry->Token));\n\n\t\tpBAEntry->Token++;\n\t\tRTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);\n\t}\n\telse\n\t{\n\t\tBATableFreeOriEntry(pAd, pEntry->BAOriWcidArray[pBAEntry->TID]);\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tRetry sending ADDBA Reqest.\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tParametrs:\n\tp8023Header: if this is already 802.3 format, p8023Header is NULL\n\t\n\tReturn\t: TRUE if put into rx reordering buffer, shouldn't indicaterxhere.\n\t\t\t\tFALSE , then continue indicaterx at this moment.\n\t==========================================================================\n */\nVOID BARecSessionIdleTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n\t\n\tBA_REC_ENTRY    *pBAEntry = (BA_REC_ENTRY *)FunctionContext;\n\tPRTMP_ADAPTER   pAd;\n\tULONG           Now32;\n\t\n\tif (pBAEntry == NULL)\n\t\treturn;\n\n\tif ((pBAEntry->REC_BA_Status == Recipient_Accept))\n\t{\n\t\tNdisGetSystemUpTime(&Now32);\n\n\t\tif (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer + REC_BA_SESSION_IDLE_TIMEOUT)))\n\t\t{\n\t\t\tpAd = pBAEntry->pAdapter;\n\t\t\t/* flush all pending reordering mpdus */\n\t\t\tba_refresh_reordering_mpdus(pAd, pBAEntry); \n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%ld: REC BA session Timeout\\n\", Now32));\n\t\t}\n\t}\n}\n\n\nVOID PeerAddBAReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n\n{\n\t/*\t7.4.4.1*/\n\t/*ULONG\tIdx;*/\n\tUCHAR   Status = 1;\n\tUCHAR   pAddr[6];\n\tFRAME_ADDBA_RSP ADDframe;\n\tPUCHAR         pOutBuffer = NULL;\n\tNDIS_STATUS     NStatus;\n\tPFRAME_ADDBA_REQ  pAddreqFrame = NULL;\n\t/*UCHAR\t\tBufSize;*/\n\tULONG       FrameLen;\n\tPULONG      ptemp;\n\tPMAC_TABLE_ENTRY\tpMacEntry;\n#ifdef CONFIG_AP_SUPPORT\n\tINT         apidx;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s ==> (Wcid = %d)\\n\", __FUNCTION__, Elem->Wcid));\n\n\t/*hex_dump(\"AddBAReq\", Elem->Msg, Elem->MsgLen);*/\n\n\t/*ADDBA Request from unknown peer, ignore this.*/\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn;\n\t\n\tpMacEntry = &pAd->MacTab.Content[Elem->Wcid];\n\tDBGPRINT(RT_DEBUG_TRACE,(\"BA - PeerAddBAReqAction----> \\n\"));\n\tptemp = (PULONG)Elem->Msg;\n\t/*DBGPRINT_RAW(RT_DEBUG_EMU, (\"%08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x\\n\", *(ptemp), *(ptemp+1), *(ptemp+2), *(ptemp+3), *(ptemp+4), *(ptemp+5), *(ptemp+6), *(ptemp+7), *(ptemp+8)));*/\n\n\tif (PeerAddBAReqActionSanity(pAd, Elem->Msg, Elem->MsgLen, pAddr))\n\t{\n\n\t\tif ((pAd->CommonCfg.bBADecline == FALSE) && IS_HT_STA(pMacEntry))\n\t\t{\n\t\t\tpAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]);\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Rcv Wcid(%d) AddBAReq\\n\", Elem->Wcid));\n\t\t\tif (BARecSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pAddreqFrame))\n\t\t\t\tStatus = 0;\n\t\t\telse\n\t\t\t\tStatus = 38; /* more parameters have invalid values*/\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus = 37; /* the request has been declined.*/\n\t\t}\n\t}\n\n\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[Elem->Wcid]))\n\t\tASSERT(pAd->MacTab.Content[Elem->Wcid].Sst == SST_ASSOC);\n\n\tpAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]);\n\t/* 2. Always send back ADDBA Response */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t /*Get an unused nonpaged memory*/\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ACTION - PeerBAAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(&ADDframe, sizeof(FRAME_ADDBA_RSP));\n\t/* 2-1. Prepare ADDBA Response frame.*/\n#ifdef P2P_SUPPORT\n\t\tif (pMacEntry)\n\t\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (ADHOC_ON(pAd)\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\t|| (IS_ENTRY_DLS(&pAd->MacTab.Content[Elem->Wcid]))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t|| (IS_ENTRY_TDLS(&pAd->MacTab.Content[Elem->Wcid]))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\t\t}\n\t\t\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t{\n\t\t\t\tActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pMacEntry->HdrAddr2, pMacEntry->HdrAddr3);\n\t\t\t}\n\t\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[Elem->Wcid]))\n\t\t{\n\t\t\tapidx = pAd->MacTab.Content[Elem->Wcid].MatchAPCLITabIdx;\n\t\t\tActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, pAddr);\t\t\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tapidx = pAd->MacTab.Content[Elem->Wcid].apidx;\n\t\t\tActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (ADHOC_ON(pAd)\n#ifdef QOS_DLS_SUPPORT\n\t\t\t|| (IS_ENTRY_DLS(&pAd->MacTab.Content[Elem->Wcid]))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t|| (IS_ENTRY_TDLS(&pAd->MacTab.Content[Elem->Wcid]))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t)\n\t\t\tActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\telse\n\t\t\tActHeaderInit(pAd, &ADDframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\tADDframe.Category = CATEGORY_BA;\n\tADDframe.Action = ADDBA_RESP;\n\tADDframe.Token = pAddreqFrame->Token;\n\t/* What is the Status code??  need to check.*/\n\tADDframe.StatusCode = Status;\n\tADDframe.BaParm.BAPolicy = IMMED_BA;\n\tADDframe.BaParm.AMSDUSupported = 0;\n\tADDframe.BaParm.TID = pAddreqFrame->BaParm.TID;\n\tADDframe.BaParm.BufSize = min(((UCHAR)pAddreqFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit);\n\tif (ADDframe.BaParm.BufSize == 0)\n\t{\n\t\tADDframe.BaParm.BufSize = 64; \n\t}\n\tADDframe.TimeOutValue = 0; /* pAddreqFrame->TimeOutValue; */\n\n#ifdef UNALIGNMENT_SUPPORT\n\t{\n\t\tBA_PARM\t\ttmpBaParm;\n\n\t\tNdisMoveMemory((PUCHAR)(&tmpBaParm), (PUCHAR)(&ADDframe.BaParm), sizeof(BA_PARM));\n\t\t*(USHORT *)(&tmpBaParm) = cpu2le16(*(USHORT *)(&tmpBaParm));\n\t\tNdisMoveMemory((PUCHAR)(&ADDframe.BaParm), (PUCHAR)(&tmpBaParm), sizeof(BA_PARM));\n\t}\n#else\n\t*(USHORT *)(&ADDframe.BaParm) = cpu2le16(*(USHORT *)(&ADDframe.BaParm));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\tADDframe.StatusCode = cpu2le16(ADDframe.StatusCode);\n\tADDframe.TimeOutValue = cpu2le16(ADDframe.TimeOutValue);\n\n\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t\t\t\t  sizeof(FRAME_ADDBA_RSP),  &ADDframe,\n\t\t\t  END_OF_ARGS);\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(%d): TID(%d), BufSize(%d) <== \\n\", __FUNCTION__, Elem->Wcid, ADDframe.BaParm.TID, \n\t\t\t\t\t\t\t  ADDframe.BaParm.BufSize));\n}\n\n\nVOID PeerAddBARspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n\n{\n\t/*UCHAR\t\tIdx, i;*/\n\t/*PUCHAR\t\t   pOutBuffer = NULL;*/\n\tPFRAME_ADDBA_RSP    pFrame = NULL;\n\t/*PBA_ORI_ENTRY\t\tpBAEntry;*/\n\t\n\t/*ADDBA Response from unknown peer, ignore this.*/\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s ==> Wcid(%d)\\n\", __FUNCTION__, Elem->Wcid));\n\t\n\t/*hex_dump(\"PeerAddBARspAction()\", Elem->Msg, Elem->MsgLen);*/\n\n\tif (PeerAddBARspActionSanity(pAd, Elem->Msg, Elem->MsgLen))\n\t{\n\t\tpFrame = (PFRAME_ADDBA_RSP)(&Elem->Msg[0]);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t StatusCode = %d\\n\", pFrame->StatusCode));\n\t\tswitch (pFrame->StatusCode)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\t/* I want a BAsession with this peer as an originator. */\n\t\t\t\tBAOriSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pFrame);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t/* check status == USED ??? */\n\t\t\t\tBAOriSessionTearDown(pAd, Elem->Wcid, pFrame->BaParm.TID, TRUE, FALSE);\n\t\t\t\tbreak;\n\t\t}\n\t\t/* Rcv Decline StatusCode*/\n\t\tif ((pFrame->StatusCode == 37) \n#ifdef CONFIG_STA_SUPPORT            \n            || ((pAd->OpMode == OPMODE_STA) && STA_TGN_WIFI_ON(pAd) && (pFrame->StatusCode != 0))\n#endif /* CONFIG_STA_SUPPORT */            \n            ) \n\t\t{\n\t\t\tpAd->MacTab.Content[Elem->Wcid].BADeclineBitmap |= 1<<pFrame->BaParm.TID;\n\t\t}\n\t}\n}\n\nVOID PeerDelBAAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n\n{\n\t/*UCHAR\t\t\t\tIdx;*/\n\t/*PUCHAR\t\t\t\tpOutBuffer = NULL;*/\n\tPFRAME_DELBA_REQ    pDelFrame = NULL;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s ==>\\n\", __FUNCTION__));\n\t/*DELBA Request from unknown peer, ignore this.*/\n\tif (PeerDelBAActionSanity(pAd, Elem->Wcid, Elem->Msg, Elem->MsgLen))\n\t{\n\t\tpDelFrame = (PFRAME_DELBA_REQ)(&Elem->Msg[0]);\n\t\tif (pDelFrame->DelbaParm.Initiator == ORIGINATOR)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BA - PeerDelBAAction----> ORIGINATOR\\n\"));\n\t\t\tBARecSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BA - PeerDelBAAction----> RECIPIENT, Reason = %d\\n\",  pDelFrame->ReasonCode));\n\t\t\t/*hex_dump(\"DelBA Frame\", pDelFrame, Elem->MsgLen);*/\n\t\t\tBAOriSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE, FALSE);\n\t\t}\n\t}\n}\n\n\nBOOLEAN CntlEnqueueForRecv(\n\t\t\t\t\t\t  IN PRTMP_ADAPTER\t\tpAd, \n\t\t\t\t\t\t  IN ULONG\t\t\t\tWcid, \n\t\t\t\t\t\t  IN ULONG\t\t\t\tMsgLen, \n\t\t\t\t\t\t  IN PFRAME_BA_REQ\t\tpMsg) \n{\n\tPFRAME_BA_REQ   pFrame = pMsg;\n\t/*PRTMP_REORDERBUF\tpBuffer;*/\n\t/*PRTMP_REORDERBUF\tpDmaBuf;*/\n\tPBA_REC_ENTRY pBAEntry;\n\t/*BOOLEAN \tResult;*/\n\tULONG   Idx;\n\t/*UCHAR\tNumRxPkt;*/\n\tUCHAR\tTID;/*, i;*/\n\t\n\tTID = (UCHAR)pFrame->BARControl.TID;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): BAR-Wcid(%ld), Tid (%d)\\n\", __FUNCTION__, Wcid, TID));\n\t/*hex_dump(\"BAR\", (PCHAR) pFrame, MsgLen);*/\n\t/* Do nothing if the driver is starting halt state.*/\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt*/\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn FALSE;\n\n\t/* First check the size, it MUST not exceed the mlme queue size*/\n\tif (MsgLen > MGMT_DMA_BUFFER_SIZE) /* 1600B */\n\t{\n\t\tDBGPRINT_ERR((\"CntlEnqueueForRecv: frame too large, size = %ld \\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\telse if (MsgLen != sizeof(FRAME_BA_REQ))\n\t{\n\t\tDBGPRINT_ERR((\"CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\telse if (MsgLen != sizeof(FRAME_BA_REQ))\n\t{\n\t\tDBGPRINT_ERR((\"CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\t\t\n\tif ((Wcid < MAX_LEN_OF_MAC_TABLE) && (TID < 8))\n\t\t{\n\t\t/* if this receiving packet is from SA that is in our OriEntry. Since WCID <9 has direct mapping. no need search.*/\n\t\tIdx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t\t}\n\t\telse\n\t\t{\n\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BAR(%ld) : Tid (%d) - %04x:%04x\\n\", Wcid, TID, pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq ));\n\n\tif (SEQ_SMALLER(pBAEntry->LastIndSeq, pFrame->BAStartingSeq.field.StartSeq, MAXSEQ))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"BAR Seq = %x, LastIndSeq = %x\\n\", pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq));*/\n\t\tba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, pFrame->BAStartingSeq.field.StartSeq);\n\t\tpBAEntry->LastIndSeq = (pFrame->BAStartingSeq.field.StartSeq == 0) ? MAXSEQ :(pFrame->BAStartingSeq.field.StartSeq -1);\n\t}\n\t/*ba_refresh_reordering_mpdus(pAd, pBAEntry);*/\n\treturn TRUE;\n}\n\n/*\nDescription : Send PSMP Action frame If PSMP mode switches.\n*/\nVOID SendPSMPAction(\n\t\t\t\t   IN PRTMP_ADAPTER\t\tpAd,\n\t\t\t\t   IN UCHAR\t\t\t\tWcid,\n\t\t\t\t   IN UCHAR\t\t\t\tPsmp) \n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tFRAME_PSMP_ACTION Frame;\n\tULONG FrameLen;\n#ifdef CONFIG_AP_SUPPORT\t\n\tUCHAR apidx;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\tPMAC_TABLE_ENTRY pEntry;\n#endif /* P2P_SUPPORT */\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t /*Get an unused nonpaged memory*/\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"BA - MlmeADDBAAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n#ifdef P2P_SUPPORT\n\tif (VALID_WCID(Wcid))\n\t{\n\t\tpEntry = &pAd->MacTab.Content[Wcid];\n\n\t\tif (pEntry)\n\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pEntry->HdrAddr2, pEntry->HdrAddr3);\n\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[Wcid]))\n\t\t{\n\t\t\tapidx = pAd->MacTab.Content[Wcid].MatchAPCLITabIdx;\n\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, pAd->MacTab.Content[Wcid].Addr);\t\t\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tapidx = pAd->MacTab.Content[Wcid].apidx;\n\t\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[Wcid].Addr);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\tFrame.Category = CATEGORY_HT;\n\tFrame.Action = SMPS_ACTION;\n\tswitch (Psmp)\n\t{\n\t\tcase MMPS_ENABLE:\n\t\t\tFrame.Psmp = 0;\n\t\t\tbreak;\n\t\tcase MMPS_DYNAMIC:\n\t\t\tFrame.Psmp = 3;\n\t\t\tbreak;\n\t\tcase MMPS_STATIC:\n\t\t\tFrame.Psmp = 1;\n\t\t\tbreak;\n\t}\n\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t\t\t\t  sizeof(FRAME_PSMP_ACTION),      &Frame,\n\t\t\t\t\t  END_OF_ARGS);\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tDBGPRINT(RT_DEBUG_ERROR,(\"HT - SendPSMPAction( %d )  \\n\", Frame.Psmp));\n}\n\n\n#define RADIO_MEASUREMENT_REQUEST_ACTION\t0\n\ntypedef struct GNU_PACKED _BEACON_REQUEST {\n\tUCHAR\tRegulatoryClass;\n\tUCHAR\tChannelNumber;\n\tUSHORT\tRandomInterval;\n\tUSHORT\tMeasurementDuration;\n\tUCHAR\tMeasurementMode;\n\tUCHAR   BSSID[MAC_ADDR_LEN];\n\tUCHAR\tReportingCondition;\n\tUCHAR\tThreshold;\n\tUCHAR   SSIDIE[2];\t\t\t/* 2 byte*/\n} BEACON_REQUEST;\n\ntypedef struct GNU_PACKED _MEASUREMENT_REQ\n{\n\tUCHAR\tID;\n\tUCHAR\tLength;\n\tUCHAR\tToken;\n\tUCHAR\tRequestMode;\n\tUCHAR\tType;\n} MEASUREMENT_REQ;\n\n#ifdef CONFIG_AP_SUPPORT\nVOID SendBeaconRequest(\n\t\t\t\t   IN PRTMP_ADAPTER\t\tpAd,\n\t\t\t\t   IN UCHAR\t\t\t\tWcid)\n{\n\tPUCHAR          \tpOutBuffer = NULL;\n\tNDIS_STATUS     \tNStatus;\n\tFRAME_RM_REQ_ACTION   Frame;\n\tULONG           \tFrameLen;\n\tBEACON_REQUEST\t\tBeaconReq;\n\tMEASUREMENT_REQ\t\tMeasureReg;\n\tUCHAR\t\t\t\tapidx;\n\n\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[Wcid]))\n\t\treturn;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t /*Get an unused nonpaged memory*/\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Radio - SendBeaconRequest() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\tapidx = pAd->MacTab.Content[Wcid].apidx;\n\tActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->ApCfg.MBSSID[apidx].Bssid, pAd->ApCfg.MBSSID[apidx].Bssid);\n\n\tFrame.Category = CATEGORY_RM;\n\tFrame.Action = RADIO_MEASUREMENT_REQUEST_ACTION;\n\tFrame.Token = 1;\n\tFrame.Repetition = 0;\t/* executed once*/\n\n\tBeaconReq.RegulatoryClass = 32;\t\t/* ?????*/\n\tBeaconReq.ChannelNumber = 255;\t\t/* all channels*/\n\tBeaconReq.RandomInterval = 0;\n\tBeaconReq.MeasurementDuration = 10;\t/* 10 TU*/\n\tBeaconReq.MeasurementMode = 1; \t\t/* Active mode */\n\tCOPY_MAC_ADDR(BeaconReq.BSSID, \tBROADCAST_ADDR);\n\tBeaconReq.ReportingCondition = 254;\t/* report not necesssary*/\n\tBeaconReq.Threshold = 0;\t\t\t/* minimum RCPI*/\n\tBeaconReq.SSIDIE[0] = 0;\n\tBeaconReq.SSIDIE[1] = 0; \t\t\t/* wildcard SSID zero length */\n\n\n\tMeasureReg.ID = IE_MEASUREMENT_REQUEST;\n\tMeasureReg.Token = 0;\n\tMeasureReg.RequestMode = 0;\n\tMeasureReg.Type = 5;\t\t\t\t/* Beacon Request*/\n\tMeasureReg.Length = sizeof(MEASUREMENT_REQ)+sizeof(BEACON_REQUEST)-2;\n\n\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t\t\t\t  sizeof(FRAME_RM_REQ_ACTION),      &Frame,\n\t\t\t\t\t  sizeof(MEASUREMENT_REQ),\t\t\t&MeasureReg,\n\t\t\t\t\t  sizeof(BEACON_REQUEST),\t\t\t&BeaconReq,\n\t\t\t\t\t  END_OF_ARGS);\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Radio - SendBeaconRequest\\n\"));\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\nvoid convert_reordering_packet_to_preAMSDU_or_802_3_packet(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN  UCHAR\t\t\tFromWhichBSSID)\n{\n\tPNDIS_PACKET\tpRxPkt;\n\tUCHAR\t\t\tHeader802_3[LENGTH_802_3];\n\n/* \n\t1. get 802.3 Header\n\t2. remove LLC\n\t\ta. pointer pRxBlk->pData to payload\n\t\tb. modify pRxBlk->DataSize\n*/\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tRTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tRTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n\t}\n\telse\n\t{\n\t\tRTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tRTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tASSERT(pRxBlk->pRxPacket);\n\n\tpRxPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);\n\n\tRTMP_OS_PKT_INIT(pRxBlk->pRxPacket,\n\t\t\t\t\tget_netdev_from_bssid(pAd, FromWhichBSSID),\n\t\t\t\t\tpRxBlk->pData, pRxBlk->DataSize);\n\n\t\n\t/* copy 802.3 header, if necessary*/\n\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* maybe insert VLAN tag to the received packet */\n\t\t\tUCHAR VLAN_Size = 0;\n\t\t\tUCHAR *data_p;\n\t\t\tUSHORT VLAN_VID = 0, VLAN_Priority = 0;\n\n\t\t\t/* VLAN related */\n\t\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\t\t\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\t\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\n\t\t\tif (VLAN_VID != 0)\n\t\t\t\tVLAN_Size = LENGTH_802_1Q;\n\n\t\t\tdata_p = OS_PKT_HEAD_BUF_EXTEND(pRxPkt, LENGTH_802_3+VLAN_Size);\n\t\t\tRT_VLAN_8023_HEADER_COPY(pAd, VLAN_VID, VLAN_Priority,\n\t\t\t\t\t\t\t\t\tHeader802_3, LENGTH_802_3,\n\t\t\t\t\t\t\t\t\tdata_p, FromWhichBSSID, TPID);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t\t{\n\t\t\t/* maybe insert VLAN tag to the received packet */\n\t\t\tUCHAR VLAN_Size = 0;\n\t\t\tUCHAR *data_p;\n\t\t\tUSHORT VLAN_VID = 0, VLAN_Priority = 0;\n\t\t\tUCHAR\tWhichBSSID = FromWhichBSSID;\n\t\n\t\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t\tWhichBSSID = FromWhichBSSID - MIN_NET_DEVICE_FOR_P2P_GO;\n\n\t\t\t/* VLAN related */\n\t\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, WhichBSSID);\n\t\t\t\n#ifdef WDS_VLAN_SUPPORT\n\t\t\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\t\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\n\t\t\tif (VLAN_VID != 0)\n\t\t\t\tVLAN_Size = LENGTH_802_1Q;\n\n\t\t\tdata_p = OS_PKT_HEAD_BUF_EXTEND(pRxPkt, LENGTH_802_3+VLAN_Size);\n\t\t\tRT_VLAN_8023_HEADER_COPY(pAd, VLAN_VID, VLAN_Priority, \n\t\t\t\t\t\t\t\t\tHeader802_3, LENGTH_802_3,\n\t\t\t\t\t\t\t\t\tdata_p, FromWhichBSSID, TPID);\n\t\t}\n\t\telse\n\t\t{\n#ifdef LINUX\n\t\t\tUCHAR *data_p;\n\t\t\tdata_p = OS_PKT_HEAD_BUF_EXTEND(pRxPkt, LENGTH_802_3);\n\t\t\tNdisMoveMemory(data_p, Header802_3, LENGTH_802_3);\n#endif\n\t\t}\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef LINUX\n\t\t\tUCHAR *data_p;\n\t\t\tdata_p = OS_PKT_HEAD_BUF_EXTEND(pRxPkt, LENGTH_802_3);\n\t\t\tNdisMoveMemory(data_p, Header802_3, LENGTH_802_3);\n#endif\n\t\t}\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n}\n\n\n#define INDICATE_LEGACY_OR_AMSDU(_pAd, _pRxBlk, _fromWhichBSSID)\t\t\\\n\tdo\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \tif (RX_BLK_TEST_FLAG(_pRxBlk, fRX_AMSDU))\t\t\t\t\t\t\\\n    \t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \t\tIndicate_AMSDU_Packet(_pAd, _pRxBlk, _fromWhichBSSID);\t\t\\\n    \t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_EAP))\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tIndicate_EAPOL_Packet(_pAd, _pRxBlk, _fromWhichBSSID);\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \t\tIndicate_Legacy_Packet(_pAd, _pRxBlk, _fromWhichBSSID);\t\t\\\n    \t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t} while (0);\n\n#define INDICATE_LEGACY_OR_AMSDU_HDR_TRNS(_pAd, _pRxBlk, _fromWhichBSSID)\t\t\\\n\tdo\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \tif (RX_BLK_TEST_FLAG(_pRxBlk, fRX_AMSDU))\t\t\t\t\t\t\\\n    \t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \t\tIndicate_AMSDU_Packet(_pAd, _pRxBlk, _fromWhichBSSID);\t\t\\\n    \t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_EAP))\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tIndicate_EAPOL_Packet(_pAd, _pRxBlk, _fromWhichBSSID);\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n    \t\tIndicate_Legacy_Packet_Hdr_Trns(_pAd, _pRxBlk, _fromWhichBSSID);\t\t\\\n    \t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t} while (0);\n\nstatic VOID ba_enqueue_reordering_packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPBA_REC_ENTRY\tpBAEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tstruct reordering_mpdu *mpdu_blk;\n\tUINT16\tSequence = (UINT16) pRxBlk->pHeader->Sequence;\n\n\tmpdu_blk = ba_mpdu_blk_alloc(pAd);\n\tif ((mpdu_blk != NULL) &&\n\t\t(!RX_BLK_TEST_FLAG(pRxBlk, fRX_EAP)))\n\t{\n\t\t/* Write RxD buffer address & allocated buffer length */\n\t\tNdisAcquireSpinLock(&pBAEntry->RxReRingLock);\n\n\t\tmpdu_blk->Sequence = Sequence;\n\t\tmpdu_blk->OpMode = pRxBlk->OpMode;\n\n\t\tmpdu_blk->bAMSDU = RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU);\n\n\t\tconvert_reordering_packet_to_preAMSDU_or_802_3_packet(pAd, pRxBlk, FromWhichBSSID);\n\n\t\tSTATS_INC_RX_PACKETS(pAd, FromWhichBSSID);\n\n        \n\t\t/* it is necessary for reordering packet to record \n\t\t\twhich BSS it come from\n\t\t*/\n\t\tRTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);\n\n\t\tmpdu_blk->pPacket = pRxBlk->pRxPacket;\n\n\t\tif (ba_reordering_mpdu_insertsorted(&pBAEntry->list, mpdu_blk) == FALSE)\n\t\t{\n\t\t\t/* had been already within reordering list don't indicate */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_SUCCESS);                     \n\t\t\tba_mpdu_blk_free(pAd, mpdu_blk);\n\t\t}\n\n\t\tASSERT((0<= pBAEntry->list.qlen)  && (pBAEntry->list.qlen <= pBAEntry->BAWinSize));\n\t\tNdisReleaseSpinLock(&pBAEntry->RxReRingLock);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,  (\"!!! (%d) Can't allocate reordering mpdu blk\\n\",\n\t\t\t\t\t\t\t\t   pBAEntry->list.qlen));\n\t\t/* \n\t\t * flush all pending reordering mpdus \n\t\t * and receving mpdu to upper layer\n\t\t * make tcp/ip to take care reordering mechanism\n\t\t */\n\t\t/*ba_refresh_reordering_mpdus(pAd, pBAEntry);*/\n\t\tba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);\n\n\t\tpBAEntry->LastIndSeq = Sequence;\n\t\tINDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);\n\t}\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nstatic VOID ba_enqueue_reordering_packet_hdr_trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPBA_REC_ENTRY\tpBAEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tstruct reordering_mpdu *mpdu_blk;\n\tUINT16\tSequence = (UINT16) pRxBlk->pHeader->Sequence;\n\n\tmpdu_blk = ba_mpdu_blk_alloc(pAd);\n\tif ((mpdu_blk != NULL) &&\n\t\t(!RX_BLK_TEST_FLAG(pRxBlk, fRX_EAP)))\n\t{\n\t\n\t\t/* Write RxD buffer address & allocated buffer length */\n\t\tNdisAcquireSpinLock(&pBAEntry->RxReRingLock);\n\n\t\tmpdu_blk->Sequence = Sequence;\n\t\tmpdu_blk->OpMode = pRxBlk->OpMode;\n\n\t\tmpdu_blk->bAMSDU = RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU);\n\n\t\tconvert_reordering_packet_to_preAMSDU_or_802_3_packet(pAd, pRxBlk, FromWhichBSSID);\n\n\n\t\tRTMP_OS_PKT_INIT(pRxBlk->pRxPacket,\n\t\t\t\t\tget_netdev_from_bssid(pAd, FromWhichBSSID),\n\t\t\t\t\tpRxBlk->pTransData, pRxBlk->TransDataSize);\n\n\n\t\tSTATS_INC_RX_PACKETS(pAd, FromWhichBSSID);\n\n        \n\t\t/* it is necessary for reordering packet to record \n\t\t\twhich BSS it come from\n\t\t*/\n\t\t//RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);\n\n\n\t\tmpdu_blk->pPacket = pRxBlk->pRxPacket;\n\n\t\tif (ba_reordering_mpdu_insertsorted(&pBAEntry->list, mpdu_blk) == FALSE)\n\t\t{\n\t\t\t/* had been already within reordering list don't indicate */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_SUCCESS);                     \n\t\t\tba_mpdu_blk_free(pAd, mpdu_blk);\n\t\t}\n\n\t\tASSERT((0<= pBAEntry->list.qlen)  && (pBAEntry->list.qlen <= pBAEntry->BAWinSize));\n\t\tNdisReleaseSpinLock(&pBAEntry->RxReRingLock);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,  (\"!!! (%d) Can't allocate reordering mpdu blk\\n\",\n\t\t\t\t\t\t\t\t   pBAEntry->list.qlen));\n\n\t\t/* \n\t\t * flush all pending reordering mpdus \n\t\t * and receving mpdu to upper layer\n\t\t * make tcp/ip to take care reordering mechanism\n\t\t */\n\t\t/*ba_refresh_reordering_mpdus(pAd, pBAEntry);*/\n\t\tba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);\n\n\t\tpBAEntry->LastIndSeq = Sequence;\n\t\tINDICATE_LEGACY_OR_AMSDU_HDR_TRNS(pAd, pRxBlk, FromWhichBSSID);\n\t}\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tIndicate this packet to upper layer or put it into reordering buffer\t\n\t\n\tParametrs:\n\t\tpRxBlk         : carry necessary packet info 802.11 format\n\t\tFromWhichBSSID : the packet received from which BSS\n\n\tReturn\t: \n\t\t\t  none\n\n\tNote    :\n\t          the packet queued into reordering buffer need to cover to 802.3 format \n\t\t\t  or pre_AMSDU format\n\t==========================================================================\n */\n\nVOID Indicate_AMPDU_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tUSHORT Idx;\n\tPBA_REC_ENTRY pBAEntry = NULL;\n\tUINT16 Sequence = pRxBlk->pHeader->Sequence;\n\tULONG Now32;\n\tUCHAR Wcid = pRxBlk->pRxWI->RxWIWirelessCliID;\n\tUCHAR TID = pRxBlk->pRxWI->RxWITID;\n\n\n\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU) &&  (pRxBlk->DataSize > MAX_RX_PKT_LEN))\n\t{\n\t\tstatic int err_size;\n\n\t\terr_size++;\n\t\tif (err_size > 20) {\n\t\t\t DBGPRINT(RT_DEBUG_TRACE, (\"AMPDU DataSize = %d\\n\", pRxBlk->DataSize));\n\t\t\t hex_dump(\"802.11 Header\", (UCHAR *)pRxBlk->pHeader, 24);\n\t\t\t hex_dump(\"Payload\", pRxBlk->pData, 64);\n\t\t\t err_size = 0;\n\t\t}\n\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\n\n\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tIdx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n\t\tif (Idx == 0)\n\t\t{\n\t\t\t/* Rec BA Session had been torn down */\n\t\t\tINDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID); \n\t\t\treturn;\n\t\t}\n\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t}\n\telse\n\t{\n\t\t/* impossible !!!*/\n\t\tASSERT(0);\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\tASSERT(pBAEntry);\n\n\t/* update last rx time*/\n\tNdisGetSystemUpTime(&Now32);\n\n\tpBAEntry->rcvSeq = Sequence;\n\n\n\tba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);\n\tpBAEntry->LastIndSeqAtTimer = Now32;\n\n\t\n\t/* Reset Last Indicate Sequence*/\n\t/* */\n\tif (pBAEntry->LastIndSeq == RESET_RCV_SEQ)\n\t{\n\t\tASSERT((pBAEntry->list.qlen == 0) && (pBAEntry->list.next == NULL));\n\n\t\t/* reset rcv sequence of BA session */\n\t\tpBAEntry->LastIndSeq = Sequence;\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\t\tINDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n\n\t\n\t/* I. Check if in order.*/\n\tif (SEQ_STEPONE(Sequence, pBAEntry->LastIndSeq, MAXSEQ))\n\t{\n\t\tUSHORT  LastIndSeq;\n\n\t\tpBAEntry->LastIndSeq = Sequence;\n\t\tINDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);\n \t\tLastIndSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq);\n\t\tif (LastIndSeq != RESET_RCV_SEQ)\n\t\t{\n\t\t\tpBAEntry->LastIndSeq = LastIndSeq;\n\t\t}\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\t}\n\t\n\t/* II. Drop Duplicated Packet*/\n\telse if (Sequence == pBAEntry->LastIndSeq)\n\t{\n\t\t\n\t\t/* drop and release packet*/\n\t\tpBAEntry->nDropPacket++;\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t}\n\t\n\t/* III. Drop Old Received Packet*/\n\telse if (SEQ_SMALLER(Sequence, pBAEntry->LastIndSeq, MAXSEQ))\n\t{\n\t\t\n\t\t/* drop and release packet*/\n\t\tpBAEntry->nDropPacket++;\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t}\n\t\n\t/* IV. Receive Sequence within Window Size*/\n\telse if (SEQ_SMALLER(Sequence, (((pBAEntry->LastIndSeq+pBAEntry->BAWinSize+1)) & MAXSEQ), MAXSEQ))\n\t{\n\t\tba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk, FromWhichBSSID);\n\t}\n\t\n\t/* V. Receive seq surpasses Win(lastseq + nMSDU). So refresh all reorder buffer*/\n\telse\n\t{\n\t\tLONG WinStartSeq, TmpSeq;\n\n\n\t\tTmpSeq = Sequence - (pBAEntry->BAWinSize) -1;\n\t\tif (TmpSeq < 0)\n\t\t{\n\t\t\tTmpSeq = (MAXSEQ+1) + TmpSeq;\n\t\t}\n\t\tWinStartSeq = (TmpSeq+1) & MAXSEQ;\n\t\tba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, WinStartSeq);\n\t\tpBAEntry->LastIndSeq = WinStartSeq; /*TmpSeq;          */\n\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\n\t\tba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk, FromWhichBSSID);\n\n\t\tTmpSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq);\n\t\tif (TmpSeq != RESET_RCV_SEQ)\n\t\t{\n\t\t\tpBAEntry->LastIndSeq = TmpSeq;\n\t\t}\n\t}\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID Indicate_AMPDU_Packet_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tUSHORT Idx;\n\tPBA_REC_ENTRY pBAEntry = NULL;\n\tUINT16 Sequence = pRxBlk->pHeader->Sequence;\n\tULONG Now32;\n\tUCHAR Wcid = pRxBlk->pRxWI->RxWIWirelessCliID;\n\tUCHAR TID = pRxBlk->pRxWI->RxWITID;\n\n\n\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU) &&  (pRxBlk->TransDataSize > 1514))\n\t{\n\t\tstatic int err_size;\n\n\t\terr_size++;\n\t\tif (err_size > 20) {\n\t\t\t DBGPRINT(RT_DEBUG_TRACE, (\"AMPDU DataSize = %d\\n\", pRxBlk->DataSize));\n\t\t\t hex_dump(\"802.11 Header\", (UCHAR *)pRxBlk->pHeader, 24);\n\t\t\t hex_dump(\"Payload\", pRxBlk->pData, 64);\n\t\t\t err_size = 0;\n\t\t}\n\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\n\n\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tIdx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n\t\tif (Idx == 0)\n\t\t{\n\t\t\t/* Rec BA Session had been torn down */\n\t\t\tINDICATE_LEGACY_OR_AMSDU_HDR_TRNS(pAd, pRxBlk, FromWhichBSSID); \n\t\t\treturn;\n\t\t}\n\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t}\n\telse\n\t{\n\t\t/* impossible !!!*/\n\t\tASSERT(0);\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\tASSERT(pBAEntry);\n\n\t/* update last rx time*/\n\tNdisGetSystemUpTime(&Now32);\n\n\tpBAEntry->rcvSeq = Sequence;\n\n\n\tba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);\n\tpBAEntry->LastIndSeqAtTimer = Now32;\n\n\t\n\t/* Reset Last Indicate Sequence*/\n\t/* */\n\tif (pBAEntry->LastIndSeq == RESET_RCV_SEQ)\n\t{\n\t\tASSERT((pBAEntry->list.qlen == 0) && (pBAEntry->list.next == NULL));\n\n\t\t/* reset rcv sequence of BA session */\n\t\tpBAEntry->LastIndSeq = Sequence;\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\t\tINDICATE_LEGACY_OR_AMSDU_HDR_TRNS(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n\t\n\t/* I. Check if in order.*/\n\tif (SEQ_STEPONE(Sequence, pBAEntry->LastIndSeq, MAXSEQ))\n\t{\n\t\tUSHORT  LastIndSeq;\n\n\t\tpBAEntry->LastIndSeq = Sequence;\n\t\tINDICATE_LEGACY_OR_AMSDU_HDR_TRNS(pAd, pRxBlk, FromWhichBSSID);\n \t\tLastIndSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq);\n\t\tif (LastIndSeq != RESET_RCV_SEQ)\n\t\t{\n\t\t\tpBAEntry->LastIndSeq = LastIndSeq;\n\t\t}\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\t}\n\t\n\t/* II. Drop Duplicated Packet*/\n\telse if (Sequence == pBAEntry->LastIndSeq)\n\t{\n\t\n\t\t\n\t\t/* drop and release packet*/\n\t\tpBAEntry->nDropPacket++;\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t}\n\t\n\t/* III. Drop Old Received Packet*/\n\telse if (SEQ_SMALLER(Sequence, pBAEntry->LastIndSeq, MAXSEQ))\n\t{\n\t\n\t\t\n\t\t/* drop and release packet*/\n\t\tpBAEntry->nDropPacket++;\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t}\n\t\n\t/* IV. Receive Sequence within Window Size*/\n\telse if (SEQ_SMALLER(Sequence, (((pBAEntry->LastIndSeq+pBAEntry->BAWinSize+1)) & MAXSEQ), MAXSEQ))\n\t{\n\t\tba_enqueue_reordering_packet_hdr_trns(pAd, pBAEntry, pRxBlk, FromWhichBSSID);\n\t}\n\t\n\t/* V. Receive seq surpasses Win(lastseq + nMSDU). So refresh all reorder buffer*/\n\telse\n\t{\n\t\tLONG WinStartSeq, TmpSeq;\n\n\n\t\tprintk(\"999999999\\n\");\n\n\t\tTmpSeq = Sequence - (pBAEntry->BAWinSize) -1;\n\t\tif (TmpSeq < 0)\n\t\t{\n\t\t\tTmpSeq = (MAXSEQ+1) + TmpSeq;\n\t\t}\n\t\tWinStartSeq = (TmpSeq+1) & MAXSEQ;\n\t\tba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, WinStartSeq);\n\t\tpBAEntry->LastIndSeq = WinStartSeq; /*TmpSeq;          */\n\n\t\tpBAEntry->LastIndSeqAtTimer = Now32;\n\n\t\tba_enqueue_reordering_packet_hdr_trns(pAd, pBAEntry, pRxBlk, FromWhichBSSID);\n\n\t\tTmpSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq);\n\t\tif (TmpSeq != RESET_RCV_SEQ)\n\t\t{\n\t\t\tpBAEntry->LastIndSeq = TmpSeq;\n\t\t}\n\t}\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID BaReOrderingBufferMaintain(\n    IN PRTMP_ADAPTER pAd)\n{\n    ULONG Now32;\n    UCHAR Wcid;\n    USHORT Idx;\n    UCHAR TID;\n    PBA_REC_ENTRY pBAEntry = NULL;\n    PMAC_TABLE_ENTRY pEntry = NULL;\n \n    /* update last rx time*/\n    NdisGetSystemUpTime(&Now32);\n \n    for (Wcid = 1; Wcid < MAX_LEN_OF_MAC_TABLE; Wcid++)\n    {\n        pEntry = &pAd->MacTab.Content[Wcid];\n        if (IS_ENTRY_NONE(pEntry))\n            continue;\n \n        for (TID= 0; TID < NUM_OF_TID; TID++)\n        {\n            Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n            pBAEntry = &pAd->BATable.BARecEntry[Idx];\n            ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);\n        }\n    }\n}\n#endif /* DOT11_N_SUPPORT */\n\n"
  },
  {
    "path": "src/common/client_wds.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tclient_wds.c\n\n\tAbstract:\n*/\n\n\n#ifdef CLIENT_WDS\n\n#include \"rt_config.h\"\n\nVOID CliWds_ProxyTabInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tINT idx;\n\tULONG i;\n\n\tNdisAllocateSpinLock(pAd, &pAd->ApCfg.CliWdsTabLock);\n\n/*\tpAd->ApCfg.pCliWdsEntryPool = kmalloc(sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE, GFP_ATOMIC);*/\n\tos_alloc_mem(pAd, (UCHAR **)&(pAd->ApCfg.pCliWdsEntryPool), sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE);\n\tif (pAd->ApCfg.pCliWdsEntryPool)\n\t{\n\t\tNdisZeroMemory(pAd->ApCfg.pCliWdsEntryPool, sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE);\n\t\tinitList(&pAd->ApCfg.CliWdsEntryFreeList);\n\t\tfor (i = 0; i < CLIWDS_POOL_SIZE; i++)\n\t\t\tinsertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (PLIST_ENTRY)(pAd->ApCfg.pCliWdsEntryPool + (ULONG)i));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Fail to alloc memory for pAd->CommonCfg.pCliWdsEntryPool\", __FUNCTION__));\n\t}\n\n\tfor (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)\n\t\tinitList(&pAd->ApCfg.CliWdsProxyTab[idx]);\n\n\treturn;\n}\n\n\nVOID CliWds_ProxyTabDestory(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tINT idx;\n\tPCLIWDS_PROXY_ENTRY pCliWdsEntry;\n\n\tNdisFreeSpinLock(&pAd->ApCfg.CliWdsTabLock);\n\n\tfor (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)\n\t{\n\t\tpCliWdsEntry =\n\t\t\t(PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTab[idx].pHead;\n\t\twhile(pCliWdsEntry)\n\t\t{\n\t\t\tPCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;\n\t\t\tCliWdsEntyFree(pAd, pCliWdsEntry);\n\t\t\tpCliWdsEntry = pCliWdsEntryNext;\n\t\t}\n\t}\n\n\tif (pAd->ApCfg.pCliWdsEntryPool)\n/*\t\tkfree(pAd->ApCfg.pCliWdsEntryPool);*/\n\t\tos_free_mem(NULL, pAd->ApCfg.pCliWdsEntryPool);\n\tpAd->ApCfg.pCliWdsEntryPool = NULL;\t\n\n\treturn;\n}\n\n\nPCLIWDS_PROXY_ENTRY CliWdsEntyAlloc(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPCLIWDS_PROXY_ENTRY pCliWdsEntry;\n\n\tRTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock);\n\n\tpCliWdsEntry = (PCLIWDS_PROXY_ENTRY)removeHeadList(&pAd->ApCfg.CliWdsEntryFreeList);\n\n\tRTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock);\n\n\treturn pCliWdsEntry;\n}\n\n\nVOID CliWdsEntyFree(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PCLIWDS_PROXY_ENTRY pCliWdsEntry)\n{\n\tRTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock);\n\n\tinsertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (PLIST_ENTRY)pCliWdsEntry);\n\n\tRTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock);\n\n\treturn;\n}\n\n\nPUCHAR CliWds_ProxyLookup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMac)\n{\n\tUINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1));\n\tPCLIWDS_PROXY_ENTRY pCliWdsEntry;\n\n\tpCliWdsEntry =\n\t\t(PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTab[HashId].pHead;\n\twhile (pCliWdsEntry)\n\t{\n\t\tif (MAC_ADDR_EQUAL(pMac, pCliWdsEntry->Addr))\n\t\t{\n\t\t\tULONG Now;\n\t\t\tNdisGetSystemUpTime(&Now);\n\n\t\t\tpCliWdsEntry->LastRefTime = Now;\n\t\t\tif (VALID_WCID(pCliWdsEntry->Aid))\n\t\t\t\treturn pAd->MacTab.Content[pCliWdsEntry->Aid].Addr;\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\tpCliWdsEntry = pCliWdsEntry->pNext;\n\t}\n\treturn NULL;\n}\n\n\nVOID CliWds_ProxyTabUpdate(\n\tIN PRTMP_ADAPTER pAd,\n\tIN SHORT Aid,\n\tIN PUCHAR pMac)\n{\n\tUINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1));\n\tPCLIWDS_PROXY_ENTRY pCliWdsEntry;\n\n\tif (CliWds_ProxyLookup(pAd, pMac) != NULL)\n\t\treturn;\n\n\tpCliWdsEntry = CliWdsEntyAlloc(pAd);\n\tif (pCliWdsEntry)\n\t{\n\t\tULONG Now;\n\t\tNdisGetSystemUpTime(&Now);\n\n\t\tpCliWdsEntry->Aid = Aid;\n\t\tCOPY_MAC_ADDR(&pCliWdsEntry->Addr, pMac);\n\t\tpCliWdsEntry->LastRefTime = Now;\n\t\tpCliWdsEntry->pNext = NULL;\n\t\tinsertTailList(&pAd->ApCfg.CliWdsProxyTab[HashId], (PLIST_ENTRY)pCliWdsEntry);\n\t}\n\treturn;\n}\n\n\nVOID CliWds_ProxyTabMaintain(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tULONG idx;\n\tPCLIWDS_PROXY_ENTRY pCliWdsEntry;\n\tULONG Now;\n\n\tNdisGetSystemUpTime(&Now);\n\tfor (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)\n\t{\n\t\tpCliWdsEntry = (PCLIWDS_PROXY_ENTRY)(pAd->ApCfg.CliWdsProxyTab[idx].pHead);\n\t\twhile(pCliWdsEntry)\n\t\t{\n\t\t\tPCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;\n\t\t\tif (RTMP_TIME_AFTER(Now, pCliWdsEntry->LastRefTime + (CLI_WDS_ENTRY_AGEOUT * OS_HZ / 1000)))\n\t\t\t{\n\t\t\t\tdelEntryList(&pAd->ApCfg.CliWdsProxyTab[idx], (PLIST_ENTRY)pCliWdsEntry);\n\t\t\t\tCliWdsEntyFree(pAd, pCliWdsEntry);\n\t\t\t}\n\t\t\tpCliWdsEntry = pCliWdsEntryNext;\n\t\t}\n\t}\n\treturn;\n}\n\n#endif /* CLIENT_WDS */\n\n"
  },
  {
    "path": "src/common/cmm_aes.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_aes.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tPaul Wu\t\t02-25-02\t\tInitial\n*/\n\n#include\t\"rt_config.h\"\n\n\n\n/*****************************/\n/******** SBOX Table *********/\n/*****************************/\n\nUCHAR SboxTable[256] =\n{\n\t0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,\n\t0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n\t0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n\t0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,\n\t0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,\n\t0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n\t0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,\n\t0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,\n\t0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n\t0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,\n\t0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,\n\t0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n\t0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,\n\t0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,\n\t0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n\t0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,\n\t0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,\n\t0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n\t0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\n\t0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,\n\t0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n\t0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,\n\t0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,\n\t0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n\t0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,\n\t0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,\n\t0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n\t0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,\n\t0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,\n\t0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n\t0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,\n\t0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16\n};\n\nVOID xor_32(\n\tIN  PUCHAR  a,\n\tIN  PUCHAR  b,\n\tOUT PUCHAR  out)\n{\n\tINT i;\n\n\tfor (i=0;i<4; i++)\n\t{\n\t\tout[i] = a[i] ^ b[i];\n\t}\n}\n\nVOID xor_128(\n\tIN  PUCHAR  a,\n\tIN  PUCHAR  b,\n\tOUT PUCHAR  out)\n{\n\tINT i;\n\n\tfor (i=0;i<16; i++)\n\t{\n\t\tout[i] = a[i] ^ b[i];\n\t}\n}\n\nUCHAR RTMPCkipSbox(\n\tIN  UCHAR   a)\n{\n\treturn SboxTable[(int)a];\n}\n\nVOID next_key(\n\tIN  PUCHAR  key,\n\tIN  INT     round)\n{\n\tUCHAR       rcon;\n\tUCHAR       sbox_key[4];\n\tUCHAR       rcon_table[12] =\n\t{\n\t\t0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n\t\t0x1b, 0x36, 0x36, 0x36\n\t};\n\n\tsbox_key[0] = RTMPCkipSbox(key[13]);\n\tsbox_key[1] = RTMPCkipSbox(key[14]);\n\tsbox_key[2] = RTMPCkipSbox(key[15]);\n\tsbox_key[3] = RTMPCkipSbox(key[12]);\n\n\trcon = rcon_table[round];\n\n\txor_32(&key[0], sbox_key, &key[0]);\n\tkey[0] = key[0] ^ rcon;\n\n\txor_32(&key[4], &key[0], &key[4]);\n\txor_32(&key[8], &key[4], &key[8]);\n\txor_32(&key[12], &key[8], &key[12]);\n}\n\nVOID byte_sub(\n\tIN  PUCHAR  in,\n\tOUT PUCHAR  out)\n{\n\tINT i;\n\n\tfor (i=0; i< 16; i++)\n\t{\n\t\tout[i] = RTMPCkipSbox(in[i]);\n\t}\n}\n\n/************************************/\n/* bitwise_xor()                    */\n/* A 128 bit, bitwise exclusive or  */\n/************************************/\n\nvoid bitwise_xor(unsigned char *ina, unsigned char *inb, unsigned char *out)\n{\n\tint i;\n\tfor (i=0; i<16; i++)\n\t{\n\t\tout[i] = ina[i] ^ inb[i];\n\t}\n}\n\nVOID shift_row(\n\tIN  PUCHAR  in,\n\tOUT PUCHAR  out)\n{\n\tout[0] =  in[0];\n\tout[1] =  in[5];\n\tout[2] =  in[10];\n\tout[3] =  in[15];\n\tout[4] =  in[4];\n\tout[5] =  in[9];\n\tout[6] =  in[14];\n\tout[7] =  in[3];\n\tout[8] =  in[8];\n\tout[9] =  in[13];\n\tout[10] = in[2];\n\tout[11] = in[7];\n\tout[12] = in[12];\n\tout[13] = in[1];\n\tout[14] = in[6];\n\tout[15] = in[11];\n}\n\nVOID mix_column(\n\tIN  PUCHAR  in,\n\tOUT PUCHAR  out)\n{\n\tINT         i;\n\tUCHAR       add1b[4];\n\tUCHAR       add1bf7[4];\n\tUCHAR       rotl[4];\n\tUCHAR       swap_halfs[4];\n\tUCHAR       andf7[4];\n\tUCHAR       rotr[4];\n\tUCHAR       temp[4];\n\tUCHAR       tempb[4];\n\n\tfor (i=0 ; i<4; i++)\n\t{\n\t\tif ((in[i] & 0x80)== 0x80)\n\t\t\tadd1b[i] = 0x1b;\n\t\telse\n\t\t\tadd1b[i] = 0x00;\n\t}\n\n\tswap_halfs[0] = in[2];    /* Swap halfs */\n\tswap_halfs[1] = in[3];\n\tswap_halfs[2] = in[0];\n\tswap_halfs[3] = in[1];\n\n\trotl[0] = in[3];        /* Rotate left 8 bits */\n\trotl[1] = in[0];\n\trotl[2] = in[1];\n\trotl[3] = in[2];\n\n\tandf7[0] = in[0] & 0x7f;\n\tandf7[1] = in[1] & 0x7f;\n\tandf7[2] = in[2] & 0x7f;\n\tandf7[3] = in[3] & 0x7f;\n\n\tfor (i = 3; i>0; i--)    /* logical shift left 1 bit */\n\t{\n\t\tandf7[i] = andf7[i] << 1;\n\t\tif ((andf7[i-1] & 0x80) == 0x80)\n\t\t{\n\t\t\tandf7[i] = (andf7[i] | 0x01);\n\t\t}\n\t}\n\tandf7[0] = andf7[0] << 1;\n\tandf7[0] = andf7[0] & 0xfe;\n\n\txor_32(add1b, andf7, add1bf7);\n\n\txor_32(in, add1bf7, rotr);\n\n\ttemp[0] = rotr[0];         /* Rotate right 8 bits */\n\trotr[0] = rotr[1];\n\trotr[1] = rotr[2];\n\trotr[2] = rotr[3];\n\trotr[3] = temp[0];\n\n\txor_32(add1bf7, rotr, temp);\n\txor_32(swap_halfs, rotl,tempb);\n\txor_32(temp, tempb, out);\n}\n\n\n/************************************************/\n/* construct_mic_header1()                      */\n/* Builds the first MIC header block from       */\n/* header fields.                               */\n/************************************************/\n\nvoid construct_mic_header1(\n\tunsigned char *mic_header1,\n\tint header_length,\n\tunsigned char *mpdu)\n{\n\tmic_header1[0] = (unsigned char)((header_length - 2) / 256);\n\tmic_header1[1] = (unsigned char)((header_length - 2) % 256);\n\tmic_header1[2] = mpdu[0] & 0xcf;    /* Mute CF poll & CF ack bits */\n\tmic_header1[3] = mpdu[1] & 0xc7;    /* Mute retry, more data and pwr mgt bits */\n\tmic_header1[4] = mpdu[4];       /* A1 */\n\tmic_header1[5] = mpdu[5];\n\tmic_header1[6] = mpdu[6];\n\tmic_header1[7] = mpdu[7];\n\tmic_header1[8] = mpdu[8];\n\tmic_header1[9] = mpdu[9];\n\tmic_header1[10] = mpdu[10];     /* A2 */\n\tmic_header1[11] = mpdu[11];\n\tmic_header1[12] = mpdu[12];\n\tmic_header1[13] = mpdu[13];\n\tmic_header1[14] = mpdu[14];\n\tmic_header1[15] = mpdu[15];\n}\n\n/************************************************/\n/* construct_mic_header2()                      */\n/* Builds the last MIC header block from        */\n/* header fields.                               */\n/************************************************/\n\nvoid construct_mic_header2(\n\tunsigned char *mic_header2,\n\tunsigned char *mpdu,\n\tint a4_exists,\n\tint qc_exists)\n{\n\tint i;\n\n\tfor (i = 0; i<16; i++) mic_header2[i]=0x00;\n\n\tmic_header2[0] = mpdu[16];    /* A3 */\n\tmic_header2[1] = mpdu[17];\n\tmic_header2[2] = mpdu[18];\n\tmic_header2[3] = mpdu[19];\n\tmic_header2[4] = mpdu[20];\n\tmic_header2[5] = mpdu[21];\n\n\t/* In Sequence Control field, mute sequence numer bits (12-bit) */\n\tmic_header2[6] = mpdu[22] & 0x0f;   /* SC */\n\tmic_header2[7] = 0x00; /* mpdu[23]; */\n\n\tif ((!qc_exists) & a4_exists)\n\t{\n\t\tfor (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i];   /* A4 */\n\n\t}\n\n\tif (qc_exists && (!a4_exists))\n\t{\n\t\tmic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */\n\t\tmic_header2[9] = mpdu[25] & 0x00;\n\t}\n\n\tif (qc_exists && a4_exists)\n\t{\n\t\tfor (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i];   /* A4 */\n\n\t\tmic_header2[14] = mpdu[30] & 0x0f;\n\t\tmic_header2[15] = mpdu[31] & 0x00;\n\t}\n}\n\n\n/************************************************/\n/* construct_mic_iv()                           */\n/* Builds the MIC IV from header fields and PN  */\n/************************************************/\n\nvoid construct_mic_iv(\n\tunsigned char *mic_iv,\n\tint qc_exists,\n\tint a4_exists,\n\tunsigned char *mpdu,\n\tunsigned int payload_length,\n\tunsigned char *pn_vector)\n{\n\tint i;\n\n\tmic_iv[0] = 0x59;\n\tif (qc_exists && a4_exists) \n\t\tmic_iv[1] = mpdu[30] & 0x0f;    /* QoS_TC           */\n\tif (qc_exists && !a4_exists) \n\t\tmic_iv[1] = mpdu[24] & 0x0f;   /* mute bits 7-4    */\n\tif (!qc_exists) \n\t\tmic_iv[1] = 0x00;\n\tfor (i = 2; i < 8; i++)\n\t\tmic_iv[i] = mpdu[i + 8];                    /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */\n#ifdef CONSISTENT_PN_ORDER\n\t\tfor (i = 8; i < 14; i++)\n\t\t\tmic_iv[i] = pn_vector[i - 8];           /* mic_iv[8:13] = PN[0:5] */\n#else\n\t\tfor (i = 8; i < 14; i++)\n\t\t\tmic_iv[i] = pn_vector[13 - i];          /* mic_iv[8:13] = PN[5:0] */\n#endif\n\ti = (payload_length / 256);\n\ti = (payload_length % 256);\n\tmic_iv[14] = (unsigned char) (payload_length / 256);\n\tmic_iv[15] = (unsigned char) (payload_length % 256);\n\n}\n\n/****************************************/\n/* aes128k128d()                        */\n/* Performs a 128 bit AES encrypt with  */\n/* 128 bit data.                        */\n/****************************************/\nvoid aes128k128d(unsigned char *key, unsigned char *data, unsigned char *ciphertext)\n{\n\tint round;\n\tint i;\n\tunsigned char intermediatea[16];\n\tunsigned char intermediateb[16];\n\tunsigned char round_key[16];\n\n\tfor(i=0; i<16; i++) round_key[i] = key[i];\n\n\tfor (round = 0; round < 11; round++)\n\t{\n\t\tif (round == 0)\n\t\t{\n\t\t\txor_128(round_key, data, ciphertext);\n\t\t\tnext_key(round_key, round);         \n\t\t}\n\t\telse if (round == 10)\n\t\t{\n\t\t\tbyte_sub(ciphertext, intermediatea);\n\t\t\tshift_row(intermediatea, intermediateb);\n\t\t\txor_128(intermediateb, round_key, ciphertext);\n\t\t}\n\t\telse    /* 1 - 9 */\n\t\t{\n\t\t\tbyte_sub(ciphertext, intermediatea);\n\t\t\tshift_row(intermediatea, intermediateb);\n\t\t\tmix_column(&intermediateb[0], &intermediatea[0]);\n\t\t\tmix_column(&intermediateb[4], &intermediatea[4]);\n\t\t\tmix_column(&intermediateb[8], &intermediatea[8]);\n\t\t\tmix_column(&intermediateb[12], &intermediatea[12]);\n\t\t\txor_128(intermediatea, round_key, ciphertext);\n\t\t\tnext_key(round_key, round);\n\t\t}\n\t}\n\n}\n\nvoid construct_ctr_preload(\n\tunsigned char *ctr_preload,\n\tint a4_exists,\n\tint qc_exists,\n\tunsigned char *mpdu,\n\tunsigned char *pn_vector,\n\tint c)\n{\n\n\tint i = 0;\n\tfor (i=0; i<16; i++) ctr_preload[i] = 0x00;\n\ti = 0;\n\n\tctr_preload[0] = 0x01;                                  /* flag */\n\tif (qc_exists && a4_exists) ctr_preload[1] = mpdu[30] & 0x0f;   /* QoC_Control  */\n\tif (qc_exists && !a4_exists) ctr_preload[1] = mpdu[24] & 0x0f;\n\n\tfor (i = 2; i < 8; i++)\n\t\tctr_preload[i] = mpdu[i + 8];                       /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */\n#ifdef CONSISTENT_PN_ORDER\n\t  for (i = 8; i < 14; i++)\n\t\t\tctr_preload[i] =    pn_vector[i - 8];           /* ctr_preload[8:13] = PN[0:5] */\n#else\n\t  for (i = 8; i < 14; i++)\n\t\t\tctr_preload[i] =    pn_vector[13 - i];          /* ctr_preload[8:13] = PN[5:0] */\n#endif\n\tctr_preload[14] =  (unsigned char) (c / 256); /* Ctr */\n\tctr_preload[15] =  (unsigned char) (c % 256);\n\n}\n\nBOOLEAN RTMPSoftDecryptAES(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpData,\n\tIN ULONG\tDataByteCnt, \n\tIN PCIPHER_KEY\tpWpaKey)\n{\n\tUINT\t\t\tHeaderLen;\n\tUCHAR\t\t\tPN[6];\n\tUINT\t\t\tpayload_len;\t\n\tUINT\t\t\tnum_blocks;\n\tUINT\t\t\tpayload_remainder;\n\tUSHORT\t\t\tfc;\n\tUCHAR\t\t\tfc0;\n\tUCHAR\t\t\tfc1;\t\n\tUINT\t\t\tframe_type;\n\tUINT\t\t\tframe_subtype;\n\tUINT\t\t\tfrom_ds;\n\tUINT\t\t\tto_ds;\n\tINT\t\t\t\ta4_exists;\n\tINT\t\t\t\tqc_exists;\n\tUCHAR\t\t\taes_out[16];\n\tint \t\t\tpayload_index;\n\tUINT \t\t\ti;\n\tUCHAR \t\t\tctr_preload[16];\n\tUCHAR \t\t\tchain_buffer[16];\n\tUCHAR \t\t\tpadded_buffer[16];\n\tUCHAR \t\t\tmic_iv[16];\n\tUCHAR \t\t\tmic_header1[16];\n\tUCHAR \t\t\tmic_header2[16];\t\n\tUCHAR\t\t\tMIC[8];\n\tUCHAR\t\t\tTrailMIC[8];\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE);\n#endif\n\n\tfc0 = *pData;\n\tfc1 = *(pData + 1);\n\n\tfc = *((PUSHORT)pData);\t\n\n\tframe_type = ((fc0 >> 2) & 0x03);\n\tframe_subtype = ((fc0 >> 4) & 0x0f);\t\n\n\tfrom_ds = (fc1 & 0x2) >> 1;\n\tto_ds = (fc1 & 0x1);\n\n\ta4_exists = (from_ds & to_ds);\n\tqc_exists = ((frame_subtype == 0x08) ||    /* Assumed QoS subtypes */\n\t\t\t\t  (frame_subtype == 0x09) ||   /* Likely to change.    */\n\t\t\t\t  (frame_subtype == 0x0a) || \n\t\t\t\t  (frame_subtype == 0x0b)\n\t\t\t\t );\n\n\tHeaderLen = 24;\n\t\n\tif (a4_exists)\n\t\tHeaderLen += 6;\n\n\tif (qc_exists)\n\t\tHeaderLen += 2;\n\n\tif (pWpaKey->KeyLen == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSoftDecryptAES failed!(the Length can not be 0)\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tPN[0] = *(pData+ HeaderLen);\n\tPN[1] = *(pData+ HeaderLen + 1);\n\tPN[2] = *(pData+ HeaderLen + 4);\n\tPN[3] = *(pData+ HeaderLen + 5);\n\tPN[4] = *(pData+ HeaderLen + 6);\n\tPN[5] = *(pData+ HeaderLen + 7);\n\n\tpayload_len = DataByteCnt - HeaderLen - 8 - 8;\t/* 8 bytes for CCMP header , 8 bytes for MIC*/\n\tpayload_remainder = (payload_len) % 16;\n\tnum_blocks = (payload_len) / 16; \n\t\n\t\n\n\t/* Find start of payload*/\n\tpayload_index = HeaderLen + 8; /*IV+EIV*/\n\n\tfor (i=0; i< num_blocks; i++)\t\n\t{\n\t\tconstruct_ctr_preload(ctr_preload,\n\t\t\t\t\t\t\t\ta4_exists,\n\t\t\t\t\t\t\t\tqc_exists,\n\t\t\t\t\t\t\t\tpData,\n\t\t\t\t\t\t\t\tPN,\n\t\t\t\t\t\t\t\ti+1 );\n\n\t\taes128k128d(pWpaKey->Key, ctr_preload, aes_out);\n\n\t\tbitwise_xor(aes_out, pData + payload_index, chain_buffer);\n\t\tNdisMoveMemory(pData + payload_index - 8, chain_buffer, 16);\n\t\tpayload_index += 16;\n\t}\n\n\t\n\t/* If there is a short final block, then pad it*/\n\t/* encrypt it and copy the unpadded part back */\n\t\n\tif (payload_remainder > 0)\n\t{\n\t\tconstruct_ctr_preload(ctr_preload,\n\t\t\t\t\t\t\t\ta4_exists,\n\t\t\t\t\t\t\t\tqc_exists,\n\t\t\t\t\t\t\t\tpData,\n\t\t\t\t\t\t\t\tPN,\n\t\t\t\t\t\t\t\tnum_blocks + 1);\n\n\t\tNdisZeroMemory(padded_buffer, 16);\n\t\tNdisMoveMemory(padded_buffer, pData + payload_index, payload_remainder);\n\n\t\taes128k128d(pWpaKey->Key, ctr_preload, aes_out);\n\n\t\tbitwise_xor(aes_out, padded_buffer, chain_buffer);\n\t\tNdisMoveMemory(pData + payload_index - 8, chain_buffer, payload_remainder);\n\t\tpayload_index += payload_remainder;\n\t}\n\n\t\n\t/* Descrypt the MIC*/\n\tconstruct_ctr_preload(ctr_preload,\n\t\t\t\t\t\t\ta4_exists,\n\t\t\t\t\t\t\tqc_exists,\n\t\t\t\t\t\t\tpData,\n\t\t\t\t\t\t\tPN,\n\t\t\t\t\t\t\t0);\n\tNdisZeroMemory(padded_buffer, 16);\n\tNdisMoveMemory(padded_buffer, pData + payload_index, 8); \n\t\n\taes128k128d(pWpaKey->Key, ctr_preload, aes_out);\n\n\tbitwise_xor(aes_out, padded_buffer, chain_buffer);\t\n\n\tNdisMoveMemory(TrailMIC, chain_buffer, 8);\n\t\n\t\n\t\n\t/* Calculate MIC*/\n\t\n\n\t/*Force the protected frame bit on*/\n\t*(pData + 1) = *(pData + 1) | 0x40;\n\n\t/* Find start of payload*/\n\t/* Because the CCMP header has been removed*/\n\tpayload_index = HeaderLen;\n\n\tconstruct_mic_iv(\n\t\t\t\t\tmic_iv,\n\t\t\t\t\tqc_exists,\n\t\t\t\t\ta4_exists,\n\t\t\t\t\tpData,\n\t\t\t\t\tpayload_len,\n\t\t\t\t\tPN);\n\n\tconstruct_mic_header1(\n\t\t\t\t\t\tmic_header1,\n\t\t\t\t\t\tHeaderLen,\n\t\t\t\t\t\tpData);\n\n\tconstruct_mic_header2(\n\t\t\t\t\t\tmic_header2,\n\t\t\t\t\t\tpData,\n\t\t\t\t\t\ta4_exists,\n\t\t\t\t\t\tqc_exists);\n\n\taes128k128d(pWpaKey->Key, mic_iv, aes_out);\n\tbitwise_xor(aes_out, mic_header1, chain_buffer);\n\taes128k128d(pWpaKey->Key, chain_buffer, aes_out);\n\tbitwise_xor(aes_out, mic_header2, chain_buffer);\n\taes128k128d(pWpaKey->Key, chain_buffer, aes_out);\n\n\t/* iterate through each 16 byte payload block */\n\tfor (i = 0; i < num_blocks; i++)     \n\t{\n\t\tbitwise_xor(aes_out, pData + payload_index, chain_buffer);\n\t\tpayload_index += 16;\n\t\taes128k128d(pWpaKey->Key, chain_buffer, aes_out);\n\t}\n\n\t/* Add on the final payload block if it needs padding */\n\tif (payload_remainder > 0)\n\t{\n\t\tNdisZeroMemory(padded_buffer, 16);\n\t\tNdisMoveMemory(padded_buffer, pData + payload_index, payload_remainder);\n\n\t\tbitwise_xor(aes_out, padded_buffer, chain_buffer);\n\t\taes128k128d(pWpaKey->Key, chain_buffer, aes_out);\t\t\n\t}\n\n\t/* aes_out contains padded mic, discard most significant*/\n\t/* 8 bytes to generate 64 bit MIC*/\n\tfor (i = 0 ; i < 8; i++) MIC[i] = aes_out[i];\n\n\tif (!NdisEqualMemory(MIC, TrailMIC, 8))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPSoftDecryptAES, MIC Error !\\n\"));\t /* MIC error. */\n\t\treturn FALSE;\n\t}\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE);\n#endif\n\n\treturn TRUE;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct AAD of CCMP.\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\tIt's described in IEEE Std 802.11-2007.\n\t\tThe AAD is constructed from the MPDU header.\n\t\t\n\t========================================================================\n*/\nVOID RTMPConstructCCMPAAD(\n\tIN PUCHAR pHdr,\n\tIN BOOLEAN isDataFrame,\n\tIN UINT8 a4_exists,\n\tIN UINT8 qc_exists,\n\tOUT UCHAR *aad_hdr,\n\tOUT UINT *aad_len)\n{\n\tUINT len = 0;\n\n\t/* Frame control -\n\t\tSubtype bits (bits 4 5 6) in a Data MPDU masked to 0\n\t\tRetry bit (bit 11) masked to 0\n\t\tPwrMgt bit (bit 12) masked to 0\n\t\tMoreData bit (bit 13) masked to 0\n\t\tProtected Frame bit (bit 14) always set to 1 */\n\tif (isDataFrame)\n\t\taad_hdr[0] = (*pHdr) & 0x8f;\n\telse\n\t\taad_hdr[0] = (*pHdr);\n\taad_hdr[1] = (*(pHdr + 1)) & 0xc7;\n\taad_hdr[1] = aad_hdr[1] | 0x40;\n\tlen = 2;\n\t\n\t/* Append Addr 1, 2 & 3 */\n\tNdisMoveMemory(&aad_hdr[len], pHdr + 4, 3 * MAC_ADDR_LEN);\n\tlen += (3 * MAC_ADDR_LEN);\n\n\t/*  SC - \n\t\tMPDU Sequence Control field, with the Sequence Number \n\t\tsubfield (bits 4-15 of the Sequence Control field) \n\t\tmasked to 0. The Fragment Number subfield is not modified. */\t \n\taad_hdr[len] = (*(pHdr + 22)) & 0x0f;   \n\taad_hdr[len + 1] = 0x00;\n\tlen += 2;\n\t\n\t\t\t\n\t/* Append the Addr4 field if present. */ \n\tif (a4_exists)\n\t{\n\t\tNdisMoveMemory(&aad_hdr[len], pHdr + 24, MAC_ADDR_LEN);\n\t\tlen += MAC_ADDR_LEN;\n\t}\n\t\n\t/*  QC - \n\t\tQoS Control field, if present, a 2-octet field that includes \n\t\tthe MSDU priority. The QC TID field is used in the \n\t\tconstruction of the AAD and the remaining QC fields are \n\t\tset to 0 for the AAD calculation (bits 4 to 15 are set to 0). */\n\tif (qc_exists & a4_exists)\n\t{\n\t\taad_hdr[len] = (*(pHdr + 30)) & 0x0f;   /* Qos_TC */\n\t\taad_hdr[len + 1] = 0x00;\n\t\tlen += 2;\n\t}\n\telse if (qc_exists & !a4_exists)\n\t{\n\t\taad_hdr[len] = (*(pHdr + 24)) & 0x0f;   /* Qos_TC */\n\t\taad_hdr[len + 1] = 0x00;\n\t\tlen += 2;\n\t}\t\n\n\t*aad_len = len;\t\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct NONCE header of CCMP.\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\t\t\t\n\t========================================================================\n*/\nVOID RTMPConstructCCMPNonce(\n\tIN PUCHAR pHdr,\n\tIN UINT8 a4_exists,\n\tIN UINT8 qc_exists,\n\tIN BOOLEAN isMgmtFrame,\n\tIN UCHAR *pn,\t\t\n\tOUT UCHAR *nonce_hdr,\n\tOUT UINT *nonce_hdr_len)\n{\n\tUINT n_offset = 0;\n\tINT i;\n\n\t/* Decide the Priority Octet \n\t\tThe Priority sub-field of the Nonce Flags field shall \n\t\tbe set to the fixed value 0 when there is no QC field \n\t\tpresent in the MPDU header. When the QC field is present, \n\t\tbits 0 to 3 of the Priority field shall be set to the \n\t\tvalue of the QC TID (bits 0 to 3 of the QC field).*/\n\tif (qc_exists && a4_exists) \n\t\tnonce_hdr[0] = (*(pHdr + 30)) & 0x0f;\n\tif (qc_exists && !a4_exists) \n\t\tnonce_hdr[0] = (*(pHdr + 24)) & 0x0f;\n\n\tn_offset += 1;\n\n\t/* Fill in MPDU Address A2 field */\t\n\tNdisMoveMemory(&nonce_hdr[n_offset], pHdr + 10, MAC_ADDR_LEN);\n\tn_offset += MAC_ADDR_LEN;\n\n\t/* Fill in the PN. The PN field occupies octets 7V12. \n\t\tThe octets of PN shall be ordered so that PN0 is at octet index 12\n\t\tand PN5 is at octet index 7. */\n \tfor (i = 0; i < 6; i++)\n\t\tnonce_hdr[n_offset + i] = pn[5 - i];\n\tn_offset += LEN_PN;\n\n\t*nonce_hdr_len = n_offset;\n\t\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct CCMP header.\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\tIt's a 8-octets header.\n\t\t\t\t\n\t========================================================================\n*/\nVOID RTMPConstructCCMPHdr(\n        IN UINT8 key_idx,\n\tIN UCHAR *pn,\t\t\n\tOUT UCHAR *ccmp_hdr)\n{\n\tNdisZeroMemory(ccmp_hdr, LEN_CCMP_HDR);\n\n\tccmp_hdr[0] = pn[0];\n\tccmp_hdr[1] = pn[1];\n\tccmp_hdr[3] = (key_idx <<6) | 0x20;\t\n\tccmp_hdr[4] = pn[2];\n\tccmp_hdr[5] = pn[3];\n\tccmp_hdr[6] = pn[4];\n\tccmp_hdr[7] = pn[5];\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\t\t\t\t\n\t========================================================================\n*/\nBOOLEAN RTMPSoftEncryptCCMP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pHdr,\n\tIN PUCHAR pIV,\n\tIN PUCHAR pKey,\n\tINOUT PUCHAR pData,\n\tIN UINT32 DataLen)\n{\n\tUINT8 frame_type, frame_subtype;\n\tUINT8 from_ds, to_ds;\n\tUINT8 a4_exists, qc_exists;\n\tUINT8 aad_hdr[30];\n\tUINT aad_len = 0;\n\tUINT8 nonce_hdr[13];\t\n\tUINT32 nonce_hdr_len = 0;\n\tUINT32 out_len = DataLen + 8;\n\t\t\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE);\n#endif\n\n\t/* Initial variable */\n\tNdisZeroMemory(aad_hdr, 30);\n\tNdisZeroMemory(nonce_hdr, 13);\n\n\t/* Indicate type and subtype of Frame Control field */\n\tframe_type = (((*pHdr) >> 2) & 0x03);\n\tframe_subtype = (((*pHdr) >> 4) & 0x0f);\t\n\n\t/* Indicate the fromDS and ToDS */\n\tfrom_ds = ((*(pHdr + 1)) & 0x2) >> 1;\n\tto_ds = ((*(pHdr + 1)) & 0x1);\n\t\t\t\n\t/* decide if the Address 4 exist or QoS exist */\n\ta4_exists = (from_ds & to_ds);\n\tqc_exists = 0;\n\tif (frame_type == BTYPE_DATA)\n\t{                \n\tqc_exists = ((frame_subtype == SUBTYPE_QDATA) || \n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFACK) ||\n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFPOLL) ||\n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL));\n\t}\n\n\t/* Construct AAD header */\n\tRTMPConstructCCMPAAD(pHdr, \n\t\t\t\t\t\t (frame_type == BTYPE_DATA), \n\t\t\t\t\t\t a4_exists,\n\t\t\t\t\t\t qc_exists,\n\t\t\t\t\t\t aad_hdr, \n\t\t\t\t\t\t &aad_len);\n\n\t/* Construct NONCE header */\n\tRTMPConstructCCMPNonce(pHdr, \n\t\t\t\t\t\t   a4_exists,\n\t\t\t\t\t\t   qc_exists,\n\t\t\t\t\t\t   (frame_type == BTYPE_MGMT), \n\t\t\t\t\t\t   pIV, \n\t\t\t\t\t\t   nonce_hdr,\n\t\t\t\t\t\t   &nonce_hdr_len);\n\n\t/* CCM originator processing -\n\t   Use the temporal key, AAD, nonce, and MPDU data to \n\t   form the cipher text and MIC. */\n\tif (AES_CCM_Encrypt(pData, DataLen, \n\t\t\t\t\tpKey, 16, \n\t\t\t\t\tnonce_hdr, nonce_hdr_len, \n\t\t\t\t\taad_hdr, aad_len, LEN_CCMP_MIC, \n\t\t\t\t\tpData, &out_len))\n\t\treturn FALSE;\n\t\t\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE);\n#endif\n\t\n\treturn TRUE;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tDecrypt data with CCMP.\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nBOOLEAN RTMPSoftDecryptCCMP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pHdr,\n\tIN PCIPHER_KEY pKey,\n\tINOUT PUCHAR pData,\n\tINOUT UINT16 *DataLen)\n{\n\tUINT8 frame_type, frame_subtype;\n\tUINT8 from_ds, to_ds;\n\tUINT8 a4_exists, qc_exists;\n\tUINT8 aad_hdr[30];\n\tUINT aad_len = 0;\n\tUINT8 pn[LEN_PN];\t\n\tPUCHAR cipherData_ptr;\n\tUINT32 cipherData_len;\n\tUINT8 nonce_hdr[13];\t\n\tUINT32 nonce_hdr_len = 0;\t\n\tUINT32 out_len = *DataLen;\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE);\n#endif\n\n\t/* Check the key is valid */\n\tif (pKey->KeyLen == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The key is not available !\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\t/* Initial variable */\n\tNdisZeroMemory(aad_hdr, 30);\n\tNdisZeroMemory(nonce_hdr, 13);\n\n\t/* Indicate type and subtype of Frame Control field */\n\tframe_type = (((*pHdr) >> 2) & 0x03);\n\tframe_subtype = (((*pHdr) >> 4) & 0x0f);\t\n\n\t/* Indicate the fromDS and ToDS */\n\tfrom_ds = ((*(pHdr + 1)) & 0x2) >> 1;\n\tto_ds = ((*(pHdr + 1)) & 0x1);\n\n\t/* decide if the Address 4 exist or QoS exist */\n\ta4_exists = (from_ds & to_ds);\n\tqc_exists = 0;\n\tif (frame_type == BTYPE_DATA)\n\t{                        \n\tqc_exists = ((frame_subtype == SUBTYPE_QDATA) || \n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFACK) ||\n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFPOLL) ||\n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL));\t\n        }\n\t\t\t\n\t/* Extract PN and from CCMP header */\n\tpn[0] =\tpData[0];\n\tpn[1] = pData[1];\n\tpn[2] = pData[4];\n\tpn[3] = pData[5];\n\tpn[4] = pData[6];\n\tpn[5] = pData[7];\n\n\t/* skip ccmp header */\n\tcipherData_ptr = pData + LEN_CCMP_HDR;\n\tcipherData_len = *DataLen - LEN_CCMP_HDR;\n\t\t\n\t/* Construct AAD header */\n\tRTMPConstructCCMPAAD(pHdr, \n\t\t\t\t\t\t (frame_type == BTYPE_DATA), \n\t\t\t\t\t\t a4_exists,\n\t\t\t\t\t\t qc_exists,\n\t\t\t\t\t\t aad_hdr, \n\t\t\t\t\t\t &aad_len);\n\n\t/* Construct NONCE header */\n\tRTMPConstructCCMPNonce(pHdr, \n\t\t\t\t\t\t   a4_exists,\n\t\t\t\t\t\t   qc_exists,\n\t\t\t\t\t\t   (frame_type == BTYPE_MGMT), \n\t\t\t\t\t\t   pn, \n\t\t\t\t\t\t   nonce_hdr,\n\t\t\t\t\t\t   &nonce_hdr_len);\n\t\n\t/* CCM recipient processing -\n\t   uses the temporal key, AAD, nonce, MIC, \n\t   and MPDU cipher text data */\n\tif (AES_CCM_Decrypt(cipherData_ptr, cipherData_len,\n\t\t\t\t\tpKey->Key, 16, \n\t\t\t\t\tnonce_hdr, nonce_hdr_len, \n\t\t\t\t\taad_hdr, aad_len, LEN_CCMP_MIC, \n\t\t\t\t\tpData, &out_len))\n\t\treturn FALSE;\n\n\t*DataLen = out_len;\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE);\n#endif\n\n\treturn TRUE;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCCMP test vector\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\t\t\n\t\t\t\t\t\n\t========================================================================\n*/\nVOID CCMP_test_vector(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT input)\n{\n\tUINT8 Key_ID = 0;\n\t/*UINT8 A1[6] =  {0x0f, 0xd2, 0xe1, 0x28, 0xa5, 0x7c};*/\n\t/*UINT8 A2[6] =  {0x50, 0x30, 0xf1, 0x84, 0x44, 0x08};*/\n\t/*UINT8 A3[6] =  {0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba};*/\n\tUINT8 TK[16] = {0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85, \n\t\t\t\t  \t0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f};\n\tUINT8 PN[6] =  {0x0C, 0xE7, 0x76, 0x97, 0x03, 0xB5};\t\t\t\t\t\n\tUINT8 HDR[24]= {0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28, \n\t\t\t\t\t0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, \n\t\t\t\t\t0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33};\n\tUINT8 AAD[22] = {0x08, 0x40, 0x0f, 0xd2, 0xe1, 0x28, 0xa5, 0x7c, \n\t\t\t\t     0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0xab, 0xae, \n\t\t\t\t     0xa5, 0xb8, 0xfc, 0xba, 0x00, 0x00};\n\tUINT8 CCMP_HDR[8] = {0x0c, 0xe7, 0x00, 0x20, 0x76, 0x97, 0x03, 0xb5};\n\tUINT8 CCM_NONCE[13] = {0x00, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0xb5, \n\t\t\t\t\t\t   0x03, 0x97, 0x76, 0xe7, 0x0c};\n\tUINT8 P_TEXT_DATA[20] = {0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae, \n\t\t\t\t\t\t     0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb, \n\t\t\t\t\t\t     0x7e, 0x78, 0xa0, 0x50};\n\tUINT8 C_TEXT_DATA[28] = {0xf3, 0xd0, 0xa2, 0xfe, 0x9a, 0x3d, 0xbf, 0x23,\n\t\t\t\t\t\t\t 0x42, 0xa6, 0x43, 0xe4, 0x32, 0x46, 0xe8, 0x0c, \n\t\t\t\t\t\t\t 0x3c, 0x04, 0xd0, 0x19, 0x78, 0x45, 0xce, 0x0b,\n\t\t\t\t\t\t\t 0x16, 0xf9, 0x76, 0x23};\t\t\n\tUINT8 res_buf[100];\n\tUINT res_len = 0;\n\n\tprintk(\"== CCMP test vector == \\n\");\n\n\t/* Check AAD */\n\tNdisZeroMemory(res_buf, 100);\n\tres_len = 0;\n\tRTMPConstructCCMPAAD(HDR, TRUE, 0, 0, res_buf, &res_len);\n\tif (res_len == 22 && NdisEqualMemory(res_buf, AAD, res_len))\n\t\tprintk(\"Construct AAD is OK!!!\\n\");\n\telse\n\t{\n\t\tprintk(\"\\n!!!Construct AAD is FAILURE!!!\\n\\n\");\n\t\thex_dump(\"Calculate AAD\", res_buf, res_len);\n\t}\n\t/* Check NONCE */\n\tNdisZeroMemory(res_buf, 100);\n\tres_len = 0;\n\tRTMPConstructCCMPNonce(HDR, 0, 0, FALSE, PN, res_buf, &res_len);\n\tif (res_len == 13 && NdisEqualMemory(res_buf, CCM_NONCE, res_len))\n\t\tprintk(\"Construct NONCE is OK!!!\\n\");\n\telse\n\t{\n\t\tprintk(\"\\n!!!Construct NONCE is FAILURE!!!\\n\\n\");\n\t\thex_dump(\"Calculate NONCE\", res_buf, res_len);\n\t}\n\t/* Check CCMP-Header */\n\tNdisZeroMemory(res_buf, 100);\n\tres_len = 0;\n\tRTMPConstructCCMPHdr(Key_ID, PN, res_buf);\n\tif (NdisEqualMemory(res_buf, CCMP_HDR, 8))\n\t\tprintk(\"Construct CCMP_HDR is OK!!!\\n\");\n\telse\n\t{\n\t\tprintk(\"\\n!!!Construct CCMP_HDR is FAILURE!!!\\n\\n\");\n\t\thex_dump(\"Calculate CCMP_HDR\", res_buf, 8);\n\t}\n\n\t/* Encrypt action */\n\tNdisZeroMemory(res_buf, 100);\t\n\tNdisMoveMemory(res_buf, P_TEXT_DATA, sizeof(P_TEXT_DATA));\n\tres_len = sizeof(C_TEXT_DATA);\n\tif (AES_CCM_Encrypt(res_buf, sizeof(P_TEXT_DATA), \n\t\t\t\t\tTK, sizeof(TK), \n\t\t\t\t\tCCM_NONCE, sizeof(CCM_NONCE), \n\t\t\t\t\tAAD, sizeof(AAD), 8, \n\t\t\t\t\tres_buf, &res_len) == 0)\n\t{\n\t\tif (res_len == sizeof(C_TEXT_DATA) && \n\t\t\t\tNdisEqualMemory(res_buf, C_TEXT_DATA, res_len))\n\t\t\tprintk(\"CCM_Encrypt is OK!!!\\n\");\n\t\telse\n\t\t{\n\t\t\tprintk(\"\\n!!!CCM_Encrypt is FAILURE!!!\\n\\n\");\n\t\t\thex_dump(\"CCM_Encrypt\", res_buf, res_len);\n\t\t}\n\t}\n\t\n\t/* Decrypt action */\n\tNdisZeroMemory(res_buf, 100);\n\tNdisMoveMemory(res_buf, C_TEXT_DATA, sizeof(C_TEXT_DATA));\n\tres_len = sizeof(P_TEXT_DATA);\n\tif (AES_CCM_Decrypt(res_buf, sizeof(C_TEXT_DATA), TK, 16, \n\t\t\t\t\tCCM_NONCE, sizeof(CCM_NONCE), \n\t\t\t\t\tAAD, sizeof(AAD), 8, \n\t\t\t\t\tres_buf, &res_len) == 0)\n\t{\n\t\tif (res_len == sizeof(P_TEXT_DATA) && \n\t\t\t\tNdisEqualMemory(res_buf, P_TEXT_DATA, res_len))\n\t\t\tprintk(\"CCM_Decrypt is OK!!!\\n\");\n\t\telse\n\t\t{\n\t\t\tprintk(\"\\n!!!CCM_Decrypt is FAILURE!!!\\n\\n\");\n\t\t\thex_dump(\"CCM_Decrypt\", res_buf, res_len);\n\t\t}\n\t}\t\n\t\n\tprintk(\"== CCMP test vector == \\n\");\n\n\t}\n\n\n"
  },
  {
    "path": "src/common/cmm_asic.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_asic.c\n\n\tAbstract:\n\tFunctions used to communicate with ASIC\n\t\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n*/\n\n#include \"rt_config.h\"\n\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID AsicUpdateAutoFallBackTable(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpRateTable)\n{\n\tUCHAR\t\t\t\t\ti;\n\tHT_FBK_CFG0_STRUC\t\tHtCfg0;\n\tHT_FBK_CFG1_STRUC\t\tHtCfg1;\n\tLG_FBK_CFG0_STRUC\t\tLgCfg0;\n\tLG_FBK_CFG1_STRUC\t\tLgCfg1;\n#ifdef DOT11N_SS3_SUPPORT\n\tTX_FBK_CFG_3S_0_STRUC\tHt3SSCfg0;\n\tTX_FBK_CFG_3S_1_STRUC\tHt3SSCfg1;\n#endif /* DOT11N_SS3_SUPPORT */\n\tRTMP_RA_LEGACY_TB *pCurrTxRate, *pNextTxRate;\n\n#ifdef AGS_SUPPORT\n\tRTMP_RA_AGS_TB *pCurrTxRate_AGS, *pNextTxRate_AGS;\t\n\tBOOLEAN\t\t\t\t\tbUseAGS = FALSE;\n\n\tif (AGS_IS_USING(pAd, pRateTable))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Use AGS\\n\", __FUNCTION__));\n\t\t\n\t\tbUseAGS = TRUE;\n\n\t\tHt3SSCfg0.word = 0x1211100f;\n\t\tHt3SSCfg1.word = 0x16151413;\t\n\t}\n#endif /* AGS_SUPPORT */\n\n#ifdef DOT11N_SS3_SUPPORT\n\tif (IS_RT3883(pAd))\n\t{\n\t\tHt3SSCfg0.word = 0x12111008;\n\t\tHt3SSCfg1.word = 0x16151413;\n\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t/* set to initial value*/\n\tHtCfg0.word = 0x65432100;\n\tHtCfg1.word = 0xedcba980;\n\tLgCfg0.word = 0xedcba988;\n\tLgCfg1.word = 0x00002100;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t/* Use standard fallback if using new rate table */\n\tif (ADAPT_RATE_TABLE(pRateTable))\n\t\tgoto skipUpdate;\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\tif (bUseAGS)\n\t{\n\t\tpNextTxRate_AGS = (RTMP_RA_AGS_TB *)pRateTable+1;\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *)pNextTxRate_AGS;\n\t}\n\telse\n#endif /* AGS_SUPPORT */\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *)pRateTable+1;\n\n\tfor (i = 1; i < *((PUCHAR) pRateTable); i++)\n\t{\n#ifdef AGS_SUPPORT\n\t\tif (bUseAGS)\n\t\t{\n\t\t\tpCurrTxRate_AGS = (RTMP_RA_AGS_TB *)pRateTable+1+i;\n\t\t\tpCurrTxRate = (RTMP_RA_LEGACY_TB *)pCurrTxRate_AGS;\n\t\t}\n\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\tpCurrTxRate = (RTMP_RA_LEGACY_TB *)pRateTable+1+i;\n\n\t\tswitch (pCurrTxRate->Mode)\n\t\t{\n\t\t\tcase 0:\t\t/* CCK */\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\t/* OFDM */\n\t\t\t\t{\n\t\t\t\t\tswitch(pCurrTxRate->CurrMCS)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS0FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS1FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS2FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS3FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS4FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS5FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS6FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\tLgCfg0.field.OFDMMCS7FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\t\tcase 2:\t\t/* HT-MIX */\n\t\t\tcase 3:\t\t/* HT-GF */\n\t\t\t\t{\n\t\t\t\t\tif ((pNextTxRate->Mode >= MODE_HTMIX) && (pCurrTxRate->CurrMCS != pNextTxRate->CurrMCS))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pCurrTxRate->CurrMCS <= 15)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch(pCurrTxRate->CurrMCS)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS0FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS1FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS2FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS3FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS4FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS5FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS6FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\t\t\tHtCfg0.field.HTMCS7FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS8FBK = 0;//pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 9:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS9FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS10FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS11FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS12FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS13FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 14:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS14FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 15:\n\t\t\t\t\t\t\t\t\tHtCfg1.field.HTMCS15FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse \n#ifdef AGS_SUPPORT\n\t\t\t\t\t\tif ((bUseAGS == TRUE) && \n\t\t\t\t\t\t\t(pCurrTxRate->CurrMCS >= 16) && (pCurrTxRate->CurrMCS <= 23))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch(pCurrTxRate->CurrMCS)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\t\t\tHt3SSCfg0.field.HTMCS16FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\t\t\t\tHt3SSCfg0.field.HTMCS17FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 18:\n\t\t\t\t\t\t\t\t\tHt3SSCfg0.field.HTMCS18FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 19:\n\t\t\t\t\t\t\t\t\tHt3SSCfg0.field.HTMCS19FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 20:\n\t\t\t\t\t\t\t\t\tHt3SSCfg1.field.HTMCS20FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 21:\n\t\t\t\t\t\t\t\t\tHt3SSCfg1.field.HTMCS21FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 22:\n\t\t\t\t\t\t\t\t\tHt3SSCfg1.field.HTMCS22FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 23:\n\t\t\t\t\t\t\t\t\tHt3SSCfg1.field.HTMCS23FBK = pNextTxRate->CurrMCS;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AsicUpdateAutoFallBackTable: not support CurrMCS=%d\\n\", pCurrTxRate->CurrMCS));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\t}\n\n\t\tpNextTxRate = pCurrTxRate;\n\t}\n\n#ifdef AGS_SUPPORT\n\tif (bUseAGS == TRUE)\n\t{\n\t\tHt3SSCfg0.field.HTMCS16FBK = 0x8; // MCS 16 -> MCS 8\n\t\tHtCfg1.field.HTMCS8FBK = 0x0; // MCS 8 -> MCS 0\n\n\t\tLgCfg0.field.OFDMMCS2FBK = 0x3; // OFDM 12 -> CCK 11\n\t\tLgCfg0.field.OFDMMCS1FBK = 0x2; // OFDM 9 -> CCK 5.5\n\t\tLgCfg0.field.OFDMMCS0FBK = 0x2; // OFDM 6 -> CCK 5.5\n\t}\n#endif /* AGS_SUPPORT */\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\nskipUpdate:\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n\tRTMP_IO_WRITE32(pAd, HT_FBK_CFG0, HtCfg0.word);\n\tRTMP_IO_WRITE32(pAd, HT_FBK_CFG1, HtCfg1.word);\n\tRTMP_IO_WRITE32(pAd, LG_FBK_CFG0, LgCfg0.word);\n\tRTMP_IO_WRITE32(pAd, LG_FBK_CFG1, LgCfg1.word);\n\n#ifdef DOT11N_SS3_SUPPORT\n\tif (IS_RT2883(pAd) || IS_RT3883(pAd)\n#ifdef AGS_SUPPORT\n\t\t|| (bUseAGS == TRUE)\n#endif /* AGS_SUPPORT */ \n\t)\n\t{\n\t\tRTMP_IO_WRITE32(pAd, TX_FBK_CFG_3S_0, Ht3SSCfg0.word);\n\t\tRTMP_IO_WRITE32(pAd, TX_FBK_CFG_3S_1, Ht3SSCfg1.word);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AsicUpdateAutoFallBackTable: Ht3SSCfg0=0x%x, Ht3SSCfg1=0x%x\\n\", Ht3SSCfg0.word, Ht3SSCfg1.word));\n\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tSet MAC register value according operation mode.\n\t\tOperationMode AND bNonGFExist are for MM and GF Proteciton.\n\t\tIf MM or GF mask is not set, those passing argument doesn't not take effect.\n\t\t\n\t\tOperation mode meaning:\n\t\t= 0 : Pure HT, no preotection.\n\t\t= 0x01; there may be non-HT devices in both the control and extension channel, protection is optional in BSS.\n\t\t= 0x10: No Transmission in 40M is protected.\n\t\t= 0x11: Transmission in both 40M and 20M shall be protected\n\t\tif (bNonGFExist)\n\t\t\twe should choose not to use GF. But still set correct ASIC registers.\n\t========================================================================\n*/\nVOID \tAsicUpdateProtect(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT OperationMode,\n\tIN UCHAR SetMask,\n\tIN BOOLEAN bDisableBGProtect,\n\tIN BOOLEAN bNonGFExist)\t\n{\n\tPROT_CFG_STRUC\tProtCfg, ProtCfg4;\n\tUINT32 Protect[6];\n\tUSHORT offset;\n\tUCHAR i;\n\tUINT32 MacReg = 0;\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n#ifdef DOT11_N_SUPPORT\n\tif (!(pAd->CommonCfg.bHTProtect) && (OperationMode != 8))\n\t\treturn;\n\n\tif (pAd->BATable.numDoneOriginator)\n\t{\n\t\t/* enable the RTS/CTS to avoid channel collision*/\n\t\tSetMask |= ALLN_SETPROTECT;\n\t\tOperationMode = 8;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Config ASIC RTS threshold register*/\n\tRTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg);\n\tMacReg &= 0xFF0000FF;\n\t/* If the user want disable RtsThreshold and enbale Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096*/\n        if ((\n#ifdef DOT11_N_SUPPORT\n\t\t\t(pAd->CommonCfg.BACapability.field.AmsduEnable) || \n#endif /* DOT11_N_SUPPORT */\n\t\t\t(pAd->CommonCfg.bAggregationCapable == TRUE))\n            && pAd->CommonCfg.RtsThreshold == MAX_RTS_THRESHOLD)\n        {\n\t\t\tMacReg |= (0x1000 << 8);\n        }\n        else\n        {\n\t\t\tMacReg |= (pAd->CommonCfg.RtsThreshold << 8);\n        }\n\n\tRTMP_IO_WRITE32(pAd, TX_RTS_CFG, MacReg);\n\n\t/* Initial common protection settings*/\n\tRTMPZeroMemory(Protect, sizeof(Protect));\n\tProtCfg4.word = 0;\n\tProtCfg.word = 0;\n\tProtCfg.field.TxopAllowGF40 = 1;\n\tProtCfg.field.TxopAllowGF20 = 1;\n\tProtCfg.field.TxopAllowMM40 = 1;\n\tProtCfg.field.TxopAllowMM20 = 1;\n\tProtCfg.field.TxopAllowOfdm = 1;\n\tProtCfg.field.TxopAllowCck = 1;\n\tProtCfg.field.RTSThEn = 1;\n\tProtCfg.field.ProtectNav = ASIC_SHORTNAV;\n\n\t/* update PHY mode and rate*/\n\tif (pAd->OpMode == OPMODE_AP)\n\t{\n\t\t/* update PHY mode and rate*/\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\tProtCfg.field.ProtectRate = 0x4000;\n\t\tProtCfg.field.ProtectRate |= pAd->CommonCfg.RtsRate;\t\n\t}\n\telse if (pAd->OpMode == OPMODE_STA)\n\t{\n\t\t// Decide Protect Rate for Legacy packet\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t{\n\t\t\tProtCfg.field.ProtectRate = 0x4000; // OFDM 6Mbps\n\t\t}\n\t\telse \n\t\t{\n\t\t\tProtCfg.field.ProtectRate = 0x0000; // CCK 1Mbps\n\t\t\tif (pAd->CommonCfg.MinTxRate > RATE_11)\n\t\t\t\tProtCfg.field.ProtectRate |= 0x4000; // OFDM 6Mbps\n\t\t}\n\t}\n\n\t/* Handle legacy(B/G) protection*/\n\tif (bDisableBGProtect)\n\t{\n\t\t/*ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate;*/\n\t\tProtCfg.field.ProtectCtrl = 0;\n\t\tProtect[0] = ProtCfg.word;\n\t\tProtect[1] = ProtCfg.word;\n\t\tpAd->FlgCtsEnabled = 0; /* CTS-self is not used */\n\t}\n\telse\n\t{\n\t\t/*ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate;*/\n\t\tProtCfg.field.ProtectCtrl = 0;\t\t\t/* CCK do not need to be protected*/\n\t\tProtect[0] = ProtCfg.word;\n\t\tProtCfg.field.ProtectCtrl = ASIC_CTS;\t/* OFDM needs using CCK to protect*/\n\t\tProtect[1] = ProtCfg.word;\n\t\tpAd->FlgCtsEnabled = 1; /* CTS-self is used */\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\t/* Decide HT frame protection.*/\n\tif ((SetMask & ALLN_SETPROTECT) != 0)\n\t{\n\t\tswitch(OperationMode)\n\t\t{\n\t\t\tcase 0x0:\n\t\t\t\t/* NO PROTECT */\n\t\t\t\t/* 1.All STAs in the BSS are 20/40 MHz HT*/\n\t\t\t\t/* 2. in ai 20/40MHz BSS*/\n\t\t\t\t/* 3. all STAs are 20MHz in a 20MHz BSS*/\n\t\t\t\t/* Pure HT. no protection.*/\n\n\t\t\t\t/* MM20_PROT_CFG*/\n\t\t\t\t/*\tReserved (31:27)*/\n\t\t\t\t/* \tPROT_TXOP(25:20) -- 010111*/\n\t\t\t\t/*\tPROT_NAV(19:18)  -- 01 (Short NAV protection)*/\n\t\t\t\t/*  PROT_CTRL(17:16) -- 00 (None)*/\n\t\t\t\t/* \tPROT_RATE(15:0)  -- 0x4004 (OFDM 24M)*/\n\t\t\t\tProtect[2] = 0x01744004;\t\n\n\t\t\t\t/* MM40_PROT_CFG*/\n\t\t\t\t/*\tReserved (31:27)*/\n\t\t\t\t/* \tPROT_TXOP(25:20) -- 111111*/\n\t\t\t\t/*\tPROT_NAV(19:18)  -- 01 (Short NAV protection)*/\n\t\t\t\t/*  PROT_CTRL(17:16) -- 00 (None) */\n\t\t\t\t/* \tPROT_RATE(15:0)  -- 0x4084 (duplicate OFDM 24M)*/\n\t\t\t\tProtect[3] = 0x03f44084;\n\n\t\t\t\t/* CF20_PROT_CFG*/\n\t\t\t\t/*\tReserved (31:27)*/\n\t\t\t\t/* \tPROT_TXOP(25:20) -- 010111*/\n\t\t\t\t/*\tPROT_NAV(19:18)  -- 01 (Short NAV protection)*/\n\t\t\t\t/*  PROT_CTRL(17:16) -- 00 (None)*/\n\t\t\t\t/* \tPROT_RATE(15:0)  -- 0x4004 (OFDM 24M)*/\n\t\t\t\tProtect[4] = 0x01744004;\n\n\t\t\t\t/* CF40_PROT_CFG*/\n\t\t\t\t/*\tReserved (31:27)*/\n\t\t\t\t/* \tPROT_TXOP(25:20) -- 111111*/\n\t\t\t\t/*\tPROT_NAV(19:18)  -- 01 (Short NAV protection)*/\n\t\t\t\t/*  PROT_CTRL(17:16) -- 00 (None)*/\n\t\t\t\t/* \tPROT_RATE(15:0)  -- 0x4084 (duplicate OFDM 24M)*/\n\t\t\t\tProtect[5] = 0x03f44084;\n\n\t\t\t\tif (bNonGFExist)\n\t\t\t\t{\n\t\t\t\t\t/* PROT_NAV(19:18)  -- 01 (Short NAV protectiion)*/\n\t\t\t\t\t/* PROT_CTRL(17:16) -- 01 (RTS/CTS)*/\n\t\t\t\t\tProtect[4] = 0x01754004;\n\t\t\t\t\tProtect[5] = 0x03f54084;\n\t\t\t\t}\n\t\t\t\tpAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE;\n\n#ifdef DOT11_VHT_AC\n#ifdef RT65xx\n\t\t\t\t// TODO: shiang-6590, fix me for this protection mechanism\n\t\t\t\tif (IS_RT65XX(pAd))\n\t\t\t\t{\n\t\t\t\t\t// Temporary tuen on RTS in VHT, MAC: TX_PROT_CFG6, TX_PROT_CFG7, TX_PROT_CFG8\n\t\t\t\t\tPROT_CFG_STRUC vht_port_cfg;\n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG6, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = 0;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG6, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG7, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = 0;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG7, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG8, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = 0;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG8, vht_port_cfg.word);  \n\t\t\t\t}\n#endif /* RT65xx */\n#endif /* DOT11_VHT_AC */\n\n\n\t\t\t\tbreak;\n\t\t\t\t\n \t\t\tcase 1:\n\t\t\t\t/* This is \"HT non-member protection mode.\"*/\n\t\t\t\t/* If there may be non-HT STAs my BSS*/\n\t\t\t\tProtCfg.word = 0x01744004;\t/* PROT_CTRL(17:16) : 0 (None)*/\n\t\t\t\tProtCfg4.word = 0x03f44084; /* duplicaet legacy 24M. BW set 1.*/\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t\t\t\t{\n\t\t\t\t\tProtCfg.word = 0x01740003;\t/*ERP use Protection bit is set, use protection rate at Clause 18..*/\n\t\t\t\t\tProtCfg4.word = 0x03f40003; /* Don't duplicate RTS/CTS in CCK mode. 0x03f40083; */\n\t\t\t\t}\n\t\t\t\t/*Assign Protection method for 20&40 MHz packets*/\n\t\t\t\tProtCfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\tProtCfg.field.ProtectNav = ASIC_SHORTNAV;\n\t\t\t\tProtCfg4.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\tProtCfg4.field.ProtectNav = ASIC_SHORTNAV;\n\t\t\t\tProtect[2] = ProtCfg.word;\n\t\t\t\tProtect[3] = ProtCfg4.word;\n\t\t\t\tProtect[4] = ProtCfg.word;\n\t\t\t\tProtect[5] = ProtCfg4.word;\n\t\t\t\tpAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE;\n\n#ifdef DOT11_VHT_AC\n#ifdef RT65xx\n\t\t\t\t// TODO: shiang-6590, fix me for this protection mechanism\n\t\t\t\tif (IS_RT65XX(pAd))\n\t\t\t\t{\n\t\t\t\t\t// Temporary tuen on RTS in VHT, MAC: TX_PROT_CFG6, TX_PROT_CFG7, TX_PROT_CFG8\n\t\t\t\t\tPROT_CFG_STRUC vht_port_cfg;\n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG6, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG6, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG7, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG7, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG8, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG8, vht_port_cfg.word);  \n\t\t\t\t}\n#endif /* RT65xx */\n#endif /* DOT11_VHT_AC */\n\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase 2:\n\t\t\t\t/* If only HT STAs are in BSS. at least one is 20MHz. Only protect 40MHz packets*/\n\t\t\t\tProtCfg.word = 0x01744004;  /* PROT_CTRL(17:16) : 0 (None)*/\n\t\t\t\tProtCfg4.word = 0x03f44084; /* duplicaet legacy 24M. BW set 1.*/\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t\t\t\t{\n\t\t\t\t\tProtCfg.word = 0x01740003;\t/*ERP use Protection bit is set, use protection rate at Clause 18..*/\n\t\t\t\t\tProtCfg4.word = 0x03f40003; /* Don't duplicate RTS/CTS in CCK mode. 0x03f40083; */\n\t\t\t\t} \n\t\t\t\t/*Assign Protection method for 40MHz packets*/\n\t\t\t\tProtCfg4.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\tProtCfg4.field.ProtectNav = ASIC_SHORTNAV;\n\t\t\t\tProtect[2] = ProtCfg.word;\n\t\t\t\tProtect[3] = ProtCfg4.word;\n\t\t\t\tif (bNonGFExist)\n\t\t\t\t{\n\t\t\t\t\tProtCfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tProtCfg.field.ProtectNav = ASIC_SHORTNAV;\n\t\t\t\t}\n\t\t\t\tProtect[4] = ProtCfg.word;\n\t\t\t\tProtect[5] = ProtCfg4.word;\n\n\t\t\t\tpAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE;\n\n#ifdef DOT11_VHT_AC\n#ifdef RT65xx\n\t\t\t\t// TODO: shiang-6590, fix me for this protection mechanism\n\t\t\t\tif (IS_RT65XX(pAd))\n\t\t\t\t{\n\t\t\t\t\t// Temporary tuen on RTS in VHT, MAC: TX_PROT_CFG6, TX_PROT_CFG7, TX_PROT_CFG8\n\t\t\t\t\tPROT_CFG_STRUC vht_port_cfg;\n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG6, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = 0;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG6, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG7, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG7, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG8, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG8, vht_port_cfg.word);  \n\t\t\t\t}\n#endif /* RT65xx */\n#endif /* DOT11_VHT_AC */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase 3:\n\t\t\t\t/* HT mixed mode.\t PROTECT ALL!*/\n\t\t\t\t/* Assign Rate*/\n\t\t\t\tProtCfg.word = 0x01744004;\t/*duplicaet legacy 24M. BW set 1.*/\n\t\t\t\tProtCfg4.word = 0x03f44084;\n\t\t\t\t/* both 20MHz and 40MHz are protected. Whether use RTS or CTS-to-self depends on the*/\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t\t\t\t{\n\t\t\t\t\tProtCfg.word = 0x01740003;\t/*ERP use Protection bit is set, use protection rate at Clause 18..*/\n\t\t\t\t\tProtCfg4.word = 0x03f40003; /* Don't duplicate RTS/CTS in CCK mode. 0x03f40083*/\n\t\t\t\t}\n\t\t\t\t/*Assign Protection method for 20&40 MHz packets*/\n\t\t\t\tProtCfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\tProtCfg.field.ProtectNav = ASIC_SHORTNAV;\n\t\t\t\tProtCfg4.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\tProtCfg4.field.ProtectNav = ASIC_SHORTNAV;\n\t\t\t\tProtect[2] = ProtCfg.word;\n\t\t\t\tProtect[3] = ProtCfg4.word;\n\t\t\t\tProtect[4] = ProtCfg.word;\n\t\t\t\tProtect[5] = ProtCfg4.word;\n\t\t\t\tpAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE;\n\n#ifdef DOT11_VHT_AC\n#ifdef RT65xx\n\t\t\t\t// TODO: shiang-6590, fix me for this protection mechanism\n\t\t\t\tif (IS_RT65XX(pAd))\n\t\t\t\t{\n\t\t\t\t\t// Temporary tuen on RTS in VHT, MAC: TX_PROT_CFG6, TX_PROT_CFG7, TX_PROT_CFG8\n\t\t\t\t\tPROT_CFG_STRUC vht_port_cfg;\n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG6, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG6, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG7, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG7, vht_port_cfg.word);  \n\n\t\t\t\t\tRTMP_IO_READ32(pAd, TX_PROT_CFG8, &vht_port_cfg.word);\n\t\t\t\t\tvht_port_cfg.field.ProtectCtrl = ASIC_RTS;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PROT_CFG8, vht_port_cfg.word);  \n\t\t\t\t}\n#endif /* RT65xx */\n#endif /* DOT11_VHT_AC */\n\t\t\t\tbreak;\t\n\t\t\t\t\n\t\t\tcase 8:\n\t\t\t\t/* Special on for Atheros problem n chip.*/\n\t\t\t\tProtCfg.word = 0x01754004;\t/*duplicaet legacy 24M. BW set 1.*/\n\t\t\t\tProtCfg4.word = 0x03f54084;\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t\t\t\t{\n\t\t\t\t\tProtCfg.word = 0x01750003;\t/*ERP use Protection bit is set, use protection rate at Clause 18..*/\n\t\t\t\t\tProtCfg4.word = 0x03f50003; /* Don't duplicate RTS/CTS in CCK mode. 0x03f40083*/\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tProtect[2] = ProtCfg.word; \t/*0x01754004;*/\n\t\t\t\tProtect[3] = ProtCfg4.word; /*0x03f54084;*/\n\t\t\t\tProtect[4] = ProtCfg.word; \t/*0x01754004;*/\n\t\t\t\tProtect[5] = ProtCfg4.word; /*0x03f54084;*/\n\t\t\t\tpAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE;\n\t\t\t\tbreak;\t\t\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\t\n\toffset = CCK_PROT_CFG;\n\tfor (i = 0;i < 6;i++)\n\t{\n\t\t\tif ((SetMask & (1<< i)))\n\t\t{\n\t\tRTMP_IO_WRITE32(pAd, offset + i*4, Protect[i]);\n\t}\n}\n}\n\n\nVOID AsicBBPAdjust(RTMP_ADAPTER *pAd)\n{\n\t// TODO: shiang-6590, now this function only used for AP mode, why we need this differentation?\n\tif (pAd->chipOps.ChipBBPAdjust != NULL)\n\t\tpAd->chipOps.ChipBBPAdjust(pAd);\n}\n\n\t\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicSwitchChannel(\n\tIN RTMP_ADAPTER *pAd, \n\tIN UCHAR Channel,\n\tIN BOOLEAN bScan) \n{\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\n\t\t\tif( (RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == 1)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): autopm_resume success\\n\", __FUNCTION__));\n\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t\t\t}\n\t\t\telse if ((RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == (-1))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): autopm_resume fail\\n\", __FUNCTION__));\n\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): autopm_resume do nothing\\n\", __FUNCTION__));\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef AP_QLOAD_SUPPORT\n\t/* clear all statistics count for QBSS Load */\n\tQBSS_LoadStatusClear(pAd);\n#endif /* AP_QLOAD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif (pAd->chipOps.ChipSwitchChannel)\n\t\tpAd->chipOps.ChipSwitchChannel(pAd, Channel, bScan);\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"For this chip, no specified channel switch function!\\n\"));\n\n\t/* R66 should be set according to Channel and use 20MHz when scanning*/\n\tif (bScan)\n\t\tRTMPSetAGCInitValue(pAd, BW_20);\n\telse\n\t\tRTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW);\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis function is required for 2421 only, and should not be used during\n\t\tsite survey. It's only required after NIC decided to stay at a channel\n\t\tfor a longer period.\n\t\tWhen this function is called, it's always after AsicSwitchChannel().\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicLockChannel(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR Channel) \n{\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\n\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\nVOID InitLookupTable(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint Idx, IdxTmp;\n\tint i;\n\tenum IEEE80211_BAND band;\n\tint band_nums = 1;\n\tconst int Offset = 7;\n\tEEPROM_WORD_STRUC WordStruct = {{0}};\n\tUCHAR PlusStepNum[IEEE80211_BAND_NUMS][8] = {{0, 1, 3, 2, 3, 3, 3, 2}, {0, 1, 3, 2, 3, 3, 3, 2}};\n\tUCHAR MinusStepNum[IEEE80211_BAND_NUMS][8] = {{1, 1, 1, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1, 0, 1}};\n\tUCHAR Step[IEEE80211_BAND_NUMS] = {10, 10};\n\tUCHAR RFValue = 0, BbpValue = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> InitLookupTable\\n\"));\n\t\n\t/* Read from EEPROM, as parameters for lookup table for G band */\n\tRT28xx_EEPROM_READ16(pAd, 0x6e, WordStruct.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] EEPROM 6e = %x\\n\", WordStruct.word));\n\tPlusStepNum[IEEE80211_BAND_2G][0] = (WordStruct.field.Byte0 & 0x0F);\n\tPlusStepNum[IEEE80211_BAND_2G][1] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\tPlusStepNum[IEEE80211_BAND_2G][2] = (WordStruct.field.Byte1 & 0x0F);\n\tPlusStepNum[IEEE80211_BAND_2G][3] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\tRT28xx_EEPROM_READ16(pAd, 0x70, WordStruct.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] EEPROM 70 = %x\\n\", WordStruct.word));\n\tPlusStepNum[IEEE80211_BAND_2G][4] = (WordStruct.field.Byte0 & 0x0F);\n\tPlusStepNum[IEEE80211_BAND_2G][5] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\tPlusStepNum[IEEE80211_BAND_2G][6] = (WordStruct.field.Byte1 & 0x0F);\n\tPlusStepNum[IEEE80211_BAND_2G][7] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\tRT28xx_EEPROM_READ16(pAd, 0x72, WordStruct.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] EEPROM 72 = %x\\n\", WordStruct.word));\n\tMinusStepNum[IEEE80211_BAND_2G][0] = (WordStruct.field.Byte0 & 0x0F);\n\tMinusStepNum[IEEE80211_BAND_2G][1] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\tMinusStepNum[IEEE80211_BAND_2G][2] = (WordStruct.field.Byte1 & 0x0F);\n\tMinusStepNum[IEEE80211_BAND_2G][3] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\tRT28xx_EEPROM_READ16(pAd, 0x74, WordStruct.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4] EEPROM 74 = %x\\n\", WordStruct.word));\n\tMinusStepNum[IEEE80211_BAND_2G][4] = (WordStruct.field.Byte0 & 0x0F);\n\tMinusStepNum[IEEE80211_BAND_2G][5] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\tMinusStepNum[IEEE80211_BAND_2G][6] = (WordStruct.field.Byte1 & 0x0F);\n\tMinusStepNum[IEEE80211_BAND_2G][7] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\tRT28xx_EEPROM_READ16(pAd, 0x76, WordStruct.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] EEPROM 76 = %x\\n\", WordStruct.word));\n\tpAd->TxPowerCtrl.TssiGain[IEEE80211_BAND_2G] = (WordStruct.field.Byte0 & 0x0F);\n\tStep[IEEE80211_BAND_2G] = (WordStruct.field.Byte0 >> 4);\n\tpAd->TxPowerCtrl.RefTemp[IEEE80211_BAND_2G] = (CHAR)WordStruct.field.Byte1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] Plus = %u %u %u %u %u %u %u %u\\n\",\n\t\tPlusStepNum[IEEE80211_BAND_2G][0],\n\t\tPlusStepNum[IEEE80211_BAND_2G][1],\n\t\tPlusStepNum[IEEE80211_BAND_2G][2],\n\t\tPlusStepNum[IEEE80211_BAND_2G][3],\n\t\tPlusStepNum[IEEE80211_BAND_2G][4],\n\t\tPlusStepNum[IEEE80211_BAND_2G][5],\n\t\tPlusStepNum[IEEE80211_BAND_2G][6],\n\t\tPlusStepNum[IEEE80211_BAND_2G][7]\n\t\t));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] Minus = %u %u %u %u %u %u %u %u\\n\",\n\t\tMinusStepNum[IEEE80211_BAND_2G][0],\n\t\tMinusStepNum[IEEE80211_BAND_2G][1],\n\t\tMinusStepNum[IEEE80211_BAND_2G][2],\n\t\tMinusStepNum[IEEE80211_BAND_2G][3],\n\t\tMinusStepNum[IEEE80211_BAND_2G][4],\n\t\tMinusStepNum[IEEE80211_BAND_2G][5],\n\t\tMinusStepNum[IEEE80211_BAND_2G][6],\n\t\tMinusStepNum[IEEE80211_BAND_2G][7]\n\t\t));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4G] tssi gain/step = %u\\n\", pAd->TxPowerCtrl.TssiGain[IEEE80211_BAND_2G]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4] Step = %u\\n\", Step[IEEE80211_BAND_2G]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 2.4] RefTemp_2G = %d\\n\", pAd->TxPowerCtrl.RefTemp[IEEE80211_BAND_2G]));\n\n#ifdef A_BAND_SUPPORT\n\tif (RFIC_IS_5G_BAND(pAd))\n\t{\n\t\t/* Read from EEPROM, as parameters for lookup table for A band */\n\t\tRT28xx_EEPROM_READ16(pAd, 0xd4, WordStruct.word);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] EEPROM d4 = %x\\n\", WordStruct.word));\n\t\tPlusStepNum[IEEE80211_BAND_5G][0] = (WordStruct.field.Byte0 & 0x0F);\n\t\tPlusStepNum[IEEE80211_BAND_5G][1] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\t\tPlusStepNum[IEEE80211_BAND_5G][2] = (WordStruct.field.Byte1 & 0x0F);\n\t\tPlusStepNum[IEEE80211_BAND_5G][3] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\t\tRT28xx_EEPROM_READ16(pAd, 0xd6, WordStruct.word);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] EEPROM d6 = %x\\n\", WordStruct.word));\n\t\tPlusStepNum[IEEE80211_BAND_5G][4] = (WordStruct.field.Byte0 & 0x0F);\n\t\tPlusStepNum[IEEE80211_BAND_5G][5] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\t\tPlusStepNum[IEEE80211_BAND_5G][6] = (WordStruct.field.Byte1 & 0x0F);\n\t\tPlusStepNum[IEEE80211_BAND_5G][7] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\t\tRT28xx_EEPROM_READ16(pAd, 0xd8, WordStruct.word);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] EEPROM d8 = %x\\n\", WordStruct.word));\n\t\tMinusStepNum[IEEE80211_BAND_5G][0] = (WordStruct.field.Byte0 & 0x0F);\n\t\tMinusStepNum[IEEE80211_BAND_5G][1] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\t\tMinusStepNum[IEEE80211_BAND_5G][2] = (WordStruct.field.Byte1 & 0x0F);\n\t\tMinusStepNum[IEEE80211_BAND_5G][3] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\t\tRT28xx_EEPROM_READ16(pAd, 0xda, WordStruct.word);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] EEPROM da = %x\\n\", WordStruct.word));\n\t\tMinusStepNum[IEEE80211_BAND_5G][4] = (WordStruct.field.Byte0 & 0x0F);\n\t\tMinusStepNum[IEEE80211_BAND_5G][5] = (((WordStruct.field.Byte0 & 0xF0) >> 4) & 0x0F);\n\t\tMinusStepNum[IEEE80211_BAND_5G][6] = (WordStruct.field.Byte1 & 0x0F);\n\t\tMinusStepNum[IEEE80211_BAND_5G][7] = (((WordStruct.field.Byte1 & 0xF0) >> 4) & 0x0F);\n\n\t\tRT28xx_EEPROM_READ16(pAd, 0xdc, WordStruct.word);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] EEPROM dc = %x\\n\", WordStruct.word));\n\t\tpAd->TxPowerCtrl.TssiGain[IEEE80211_BAND_5G] = (WordStruct.field.Byte0 & 0x0F);\n\t\tStep[IEEE80211_BAND_5G] = (WordStruct.field.Byte0 >> 4);\n\t\tpAd->TxPowerCtrl.RefTemp[IEEE80211_BAND_5G] = (CHAR)WordStruct.field.Byte1;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] Plus = %u %u %u %u %u %u %u %u\\n\",\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][0],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][1],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][2],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][3],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][4],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][5],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][6],\n\t\t\tPlusStepNum[IEEE80211_BAND_5G][7]\n\t\t\t));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] Minus = %u %u %u %u %u %u %u %u\\n\",\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][0],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][1],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][2],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][3],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][4],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][5],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][6],\n\t\t\tMinusStepNum[IEEE80211_BAND_5G][7]\n\t\t\t));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] tssi gain/step = %u\\n\", pAd->TxPowerCtrl.TssiGain[IEEE80211_BAND_5G]));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] Step = %u\\n\", Step[IEEE80211_BAND_5G]));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation 5G] RefTemp_2G = %d\\n\", pAd->TxPowerCtrl.RefTemp[IEEE80211_BAND_5G]));\n\n\t\tband_nums = IEEE80211_BAND_NUMS;\n\t}\n#endif /* A_BAND_SUPPORT */\n\n\n\tfor (band = IEEE80211_BAND_2G; band < band_nums; band++)\n\t{\n\t\t/* positive */\n\t\ti = 0;\n\t\tIdxTmp = 1;\n\n\t\tpAd->TxPowerCtrl.LookupTable[band][1 + Offset] = Step[band] / 2;\n\t\tpAd->TxPowerCtrl.LookupTable[band][0 + Offset] = pAd->TxPowerCtrl.LookupTable[band][1 + Offset] - Step[band];\n\t\tfor (Idx = 2; Idx < 26;)/* Idx++ )*/\n\t\t{\n\t\t\tif (PlusStepNum[band][i] != 0 || i >= 8)\n\t\t\t{\n\t\t\t\tif (Idx >= IdxTmp + PlusStepNum[band][i] && i < 8)\n\t\t\t\t{\n\t\t\t\t\tpAd->TxPowerCtrl.LookupTable[band][Idx + Offset] = pAd->TxPowerCtrl.LookupTable[band][Idx - 1 + Offset] + (Step[band] - (i+1) + 1);\n\t\t\t\t\tIdxTmp = IdxTmp + PlusStepNum[band][i];\n\t\t\t\t\ti += 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->TxPowerCtrl.LookupTable[band][Idx + Offset] = pAd->TxPowerCtrl.LookupTable[band][Idx - 1 + Offset] + (Step[band] - (i+1) + 1);\n\t\t\t\t}\n\t\t\t\tIdx++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\n\t\t/* negative */\n\t\ti = 0;\n\t\tIdxTmp = 1;\n\t\tfor (Idx = 1; Idx < 8;)/* Idx++ )*/\n\t\t{\n\t\t\tif (MinusStepNum[band][i] != 0 || i >= 8)\n\t\t\t{\n\t\t\t\tif ((Idx + 1) >= IdxTmp + MinusStepNum[band][i] && i < 8)\n\t\t\t\t{\n\t\t\t\t\tpAd->TxPowerCtrl.LookupTable[band][-Idx + Offset] = pAd->TxPowerCtrl.LookupTable[band][-Idx + 1 + Offset] - (Step[band] + (i+1) - 1);\n\t\t\t\t\tIdxTmp = IdxTmp + MinusStepNum[band][i];\n\t\t\t\t\ti += 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->TxPowerCtrl.LookupTable[band][-Idx + Offset] = pAd->TxPowerCtrl.LookupTable[band][-Idx + 1 + Offset] - (Step[band] + (i+1) - 1);\n\t\t\t\t}\n\t\t\t\tIdx++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation] Lookup table as below:\\n\"));\n\t\tfor (Idx = 0; Idx < 33; Idx++)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation band(%d)] %d, %d\\n\", band, Idx - Offset, pAd->TxPowerCtrl.LookupTable[band][Idx]));\n\t\t}\n\t}\n\t\n\t/* Set BBP_R47 */\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BbpValue);\n\tBbpValue = (BbpValue & 0xf7);\t/* bit3 = 0 */\n\tBbpValue = (BbpValue | 0x80);\t/* bit7 = 1, bit4 = 0 */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BbpValue);\n\t\n\t/*  Set RF_R27 */\n\tRT30xxReadRFRegister(pAd, RF_R27, &RFValue);\n\t/* Set [7:6] to 01. For method 2, it is set at initialization. */\n\tRFValue = ((RFValue & 0x7f) | 0x40);\n\tRT30xxWriteRFRegister(pAd, RF_R27, RFValue);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"[temp. compensation] Set RF_R27 to 0x%x\\n\", RFValue));\n}\n\n\nVOID AsicGetAutoAgcOffsetForTemperatureSensor(\n\tIN PRTMP_ADAPTER \t\tpAd,\n\tIN PCHAR\t\t\t\tpDeltaPwr,\n\tIN PCHAR\t\t\t\tpTotalDeltaPwr,\n\tIN PCHAR\t\t\t\tpAgcCompensate,\n\tIN PCHAR \t\t\t\tpDeltaPowerByBbpR1)\n{\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tconst TX_POWER_TUNING_ENTRY_STRUCT *TxPowerTuningTable;\n\tTX_POWER_TUNING_ENTRY_STRUCT *TxPowerTuningTableEntry0 = NULL; /* Ant0 */\n\tTX_POWER_TUNING_ENTRY_STRUCT *TxPowerTuningTableEntry1 = NULL; /* Ant1 */\n\tBBP_R49_STRUC\tBbpR49;\n\tBOOLEAN\t\t\tbAutoTxAgc = FALSE;\n\tPCHAR\t\t\tpTxAgcCompensate = NULL;\n\tUCHAR \t\t\tRFValue = 0;\n\tCHAR\t\t\tTuningTableUpperBound = 0, TuningTableIndex0 = 0, TuningTableIndex1 = 0;\n\tINT \t\t\t\tCurrentTemp = 0;\n\tINT RefTemp;\n\tINT *LookupTable;\n\tINT\tLookupTableIndex = pAd->TxPowerCtrl.LookupTableIndex + TEMPERATURE_COMPENSATION_LOOKUP_TABLE_OFFSET;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"-->%s\\n\", __FUNCTION__));\n\t\n\tBbpR49.byte = 0;\n\t*pTotalDeltaPwr = 0;\n\n#ifdef A_BAND_SUPPORT\n\tif (pAd->CommonCfg.Channel > 14)\n\t{\n\t\t/* a band channel */\n\t\tbAutoTxAgc = pAd->bAutoTxAgcA;\n\t\tpTxAgcCompensate = &pAd->TxAgcCompensateA;\n\t\tTxPowerTuningTable = pChipCap->TxPowerTuningTable_5G;\n\t\tRefTemp = pAd->TxPowerCtrl.RefTemp[IEEE80211_BAND_5G];\n\t\tLookupTable = &pAd->TxPowerCtrl.LookupTable[IEEE80211_BAND_5G][0];\n\t\tTuningTableUpperBound = pChipCap->TxAlcTxPowerUpperBound_5G;\n\t}\n\telse\n#endif /* A_BAND_SUPPORT */\n\t{\n\t\t/* bg band channel */\n\t\tbAutoTxAgc = pAd->bAutoTxAgcG;\n\t\tpTxAgcCompensate = &pAd->TxAgcCompensateG;\n\t\tTxPowerTuningTable = pChipCap->TxPowerTuningTable_2G;\n\t\tRefTemp = pAd->TxPowerCtrl.RefTemp[IEEE80211_BAND_2G];\n\t\tLookupTable = &pAd->TxPowerCtrl.LookupTable[IEEE80211_BAND_2G][0];\n\t\tTuningTableUpperBound = pChipCap->TxAlcTxPowerUpperBound_2G;\n\t}\n\n\t/* AutoTxAgc in EEPROM means temperature compensation enabled/diablded. */\n\tif (bAutoTxAgc)\n\t{ \n\t\t/* Current temperature */\n#ifdef RT65xx\n\t\tif (IS_RT65XX(pAd))\n\t\t{\n\t\t\tUINT32 bbp_val;\t\n\t\t\tRTMP_BBP_IO_READ32(pAd, CORE_R35, &bbp_val);\n\t\t\tCurrentTemp = (UCHAR)(bbp_val & 0xff);\n\t\t}\n\t\telse\n#endif /* RT65xx */\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49.byte);\n\t\t\tCurrentTemp = (CHAR)BbpR49.byte;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] BBP_R49 = %02x, current temp = %d\\n\", BbpR49.byte, CurrentTemp));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] RefTemp = %d\\n\", RefTemp));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] index = %d\\n\", pAd->TxPowerCtrl.LookupTableIndex));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] f(%d)= %d\\n\", pAd->TxPowerCtrl.LookupTableIndex - 1, LookupTable[LookupTableIndex - 1]));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] f(%d)= %d\\n\", pAd->TxPowerCtrl.LookupTableIndex, LookupTable[LookupTableIndex]));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] f(%d)= %d\\n\", pAd->TxPowerCtrl.LookupTableIndex + 1, LookupTable[LookupTableIndex + 1]));\n\t\tif (CurrentTemp > RefTemp + LookupTable[LookupTableIndex + 1] + ((LookupTable[LookupTableIndex + 1] - LookupTable[LookupTableIndex]) >> 2) &&\n\t\t\tLookupTableIndex < 32)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] ++\\n\"));\n\t\t\tLookupTableIndex++;\n\t\t\tpAd->TxPowerCtrl.LookupTableIndex++;\n\t\t}\n\t\telse if (CurrentTemp < RefTemp + LookupTable[LookupTableIndex] - ((LookupTable[LookupTableIndex] - LookupTable[LookupTableIndex - 1]) >> 2) &&\n\t\t\tLookupTableIndex > 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] --\\n\"));\n\t\t\tLookupTableIndex--;\n\t\t\tpAd->TxPowerCtrl.LookupTableIndex--;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] ==\\n\"));\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] idxTxPowerTable=%d, idxTxPowerTable2=%d, TuningTableUpperBound=%d\\n\",\n\t\t\tpAd->TxPowerCtrl.idxTxPowerTable + pAd->TxPowerCtrl.LookupTableIndex,\n\t\t\tpAd->TxPowerCtrl.idxTxPowerTable2 + pAd->TxPowerCtrl.LookupTableIndex,\n\t\t\tTuningTableUpperBound));\n\n\t\tTuningTableIndex0 = pAd->TxPowerCtrl.idxTxPowerTable \n\t\t\t\t\t\t\t\t\t+ pAd->TxPowerCtrl.LookupTableIndex \n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\t\t\t\t\t+ pAd->TxPower[pAd->CommonCfg.CentralChannel-1].Power;\n#else\n\t\t\t\t\t\t\t\t\t+ pAd->TxPower[pAd->CommonCfg.Channel-1].Power;\n#endif /* DOT11_N_SUPPORT */\n\t\t/* The boundary verification */ \n\t\tTuningTableIndex0 = (TuningTableIndex0 > TuningTableUpperBound) ? TuningTableUpperBound : TuningTableIndex0;\n\t\tTuningTableIndex0 = (TuningTableIndex0 < LOWERBOUND_TX_POWER_TUNING_ENTRY) ? \n\t\t\t\t\t\t\tLOWERBOUND_TX_POWER_TUNING_ENTRY : TuningTableIndex0;\n\t\tTxPowerTuningTableEntry0 = &TxPowerTuningTable[TuningTableIndex0 + TX_POWER_TUNING_ENTRY_OFFSET];\n\t\t\n\t\tTuningTableIndex1 = pAd->TxPowerCtrl.idxTxPowerTable2 \n\t\t\t\t\t\t\t\t\t+ pAd->TxPowerCtrl.LookupTableIndex \n#ifdef DOT11_N_SUPPORT\t\t\t\t\n\t\t\t\t\t\t\t\t\t+ pAd->TxPower[pAd->CommonCfg.CentralChannel-1].Power2;\n#else\n\t\t\t\t\t\t\t\t\t+ pAd->TxPower[pAd->CommonCfg.Channel-1].Power2;\n#endif /* DOT11_N_SUPPORT */\n\t\t/* The boundary verification */\n\t\tTuningTableIndex1 = (TuningTableIndex1 > TuningTableUpperBound) ? TuningTableUpperBound : TuningTableIndex1;\n\t\tTuningTableIndex1 = (TuningTableIndex1 < LOWERBOUND_TX_POWER_TUNING_ENTRY) ? \n\t\t\t\t\t\t\tLOWERBOUND_TX_POWER_TUNING_ENTRY : TuningTableIndex1;\n\t\tTxPowerTuningTableEntry1 = &TxPowerTuningTable[TuningTableIndex1 + TX_POWER_TUNING_ENTRY_OFFSET];\n\t\t\t\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] (tx0)RF_TX_ALC = %x, MAC_PowerDelta = %d, TuningTableIndex = %d\\n\",\n\t\t\tTxPowerTuningTableEntry0->RF_TX_ALC, TxPowerTuningTableEntry0->MAC_PowerDelta, TuningTableIndex0));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] (tx1)RF_TX_ALC = %x, MAC_PowerDelta = %d, TuningTableIndex = %d\\n\",\n\t\t\tTxPowerTuningTableEntry1->RF_TX_ALC, TxPowerTuningTableEntry1->MAC_PowerDelta, TuningTableIndex1));\n\n\t\t/* Update RF_R49 [0:5] */\n\t\tRT30xxReadRFRegister(pAd, RF_R49, &RFValue);\n\t\tRFValue = ((RFValue & ~0x3F) | TxPowerTuningTableEntry0->RF_TX_ALC);\n\t\tif ((RFValue & 0x3F) > 0x27) /* The valid range of the RF R49 (<5:0>tx0_alc<5:0>) is 0x00~0x27 */\n\t\t{\n\t\t\tRFValue = ((RFValue & ~0x3F) | 0x27);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] Update RF_R49[0:5] to 0x%x\\n\", TxPowerTuningTableEntry0->RF_TX_ALC));\n\t\tRT30xxWriteRFRegister(pAd, RF_R49, RFValue);\n\n\t\t/* Update RF_R50 [0:5] */\n\t\tRT30xxReadRFRegister(pAd, RF_R50, &RFValue);\n\t\tRFValue = ((RFValue & ~0x3F) | TxPowerTuningTableEntry1->RF_TX_ALC);\n\t\tif ((RFValue & 0x3F) > 0x27) /* The valid range of the RF R49 (<5:0>tx0_alc<5:0>) is 0x00~0x27 */\n\t\t{\n\t\t\tRFValue = ((RFValue & ~0x3F) | 0x27);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"[temp. compensation] Update RF_R50[0:5] to 0x%x\\n\", TxPowerTuningTableEntry1->RF_TX_ALC));\n\t\tRT30xxWriteRFRegister(pAd, RF_R50, RFValue);\n\t\t\n\t\t*pTotalDeltaPwr = TxPowerTuningTableEntry0->MAC_PowerDelta;\n\t\t\n\t}\n\n\t*pAgcCompensate = *pTxAgcCompensate;\n\tDBGPRINT(RT_DEBUG_INFO, (\"<--%s\\n\", __FUNCTION__));\n}\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n\nVOID AsicResetBBPAgent(\nIN PRTMP_ADAPTER pAd)\n{\n\tBBP_CSR_CFG_STRUC\tBbpCsr;\n\n\t/* Still need to find why BBP agent keeps busy, but in fact, hardware still function ok. Now clear busy first.\t*/\n\t/* IF chipOps.AsicResetBbpAgent == NULL, run \"else\" part */\n\tRTMP_CHIP_ASIC_RESET_BBP_AGENT(pAd);\n\t\telse\n\t\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"Reset BBP Agent busy bit.!! \\n\"));\n\tRTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word);\n\tBbpCsr.field.Busy = 0;\n\tRTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);\n}\n\t\n}\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tput PHY to sleep here, and set next wakeup timer. PHY doesn't not wakeup \n\t\tautomatically. Instead, MCU will issue a TwakeUpInterrupt to host after\n\t\tthe wakeup timer timeout. Driver has to issue a separate command to wake\n\t\tPHY up.\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AsicSleepThenAutoWakeup(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT TbttNumToNextWakeUp) \n{\n\tRTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tAsicForceWakeup() is used whenever manual wakeup is required\n\t\tAsicForceSleep() should only be used when not in INFRA BSS. When\n\t\tin INFRA BSS, we should use AsicSleepThenAutoWakeup() instead.\n\t==========================================================================\n */\nVOID AsicForceSleep(\n\tIN PRTMP_ADAPTER pAd)\n{\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tAsicForceWakeup() is used whenever Twakeup timer (set via AsicSleepThenAutoWakeup)\n\t\texpired.\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t==========================================================================\n */\nVOID AsicForceWakeup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN    bFromTx)\n{\n    DBGPRINT(RT_DEBUG_INFO, (\"--> AsicForceWakeup \\n\"));\n    RTMP_STA_FORCE_WAKEUP(pAd, bFromTx);\t\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tSet My BSSID\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AsicSetBssid(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pBssid) \n{\n\tULONG\t\t  Addr4;\n#ifdef P2P_SUPPORT\n\tUINT32\tregValue;\n#endif /* P2P_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> AsicSetBssid %x:%x:%x:%x:%x:%x\\n\",\n\t\t\t\tPRINT_MAC(pBssid)));\n\t\n\tAddr4 = (ULONG)(pBssid[0]) | \n\t\t\t(ULONG)(pBssid[1] << 8)  | \n\t\t\t(ULONG)(pBssid[2] << 16) |\n\t\t\t(ULONG)(pBssid[3] << 24);\n\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4);\n\n#ifdef HDR_TRANS_SUPPORT\n\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW0, Addr4);\n#endif /* HDR_TRANS_SUPPORT */\n\n\tAddr4 = 0;\n\t/* always one BSSID in STA mode*/\n\tAddr4 = (ULONG)(pBssid[4]) | (ULONG)(pBssid[5] << 8);\n\n#ifdef P2P_SUPPORT\n#ifdef P2P_ODD_MAC_ADJUST\n\tif ( (pAd->CurrentAddress[5] & 0x01 ) == 0x01 )\n\t{\n\t\tAddr4 |= (1 << 16 );\n\t}\n#endif /* P2P_ODD_MAC_ADJUST */\n#endif /* P2P_SUPPORT */\n\n\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4);\n\n#ifdef HDR_TRANS_SUPPORT\n\t/*\n\t\tpoint WCID MAC table to 0x1800\n\t\tThis is for debug.\n\t\tBut HDR_TRANS doesn't work if you remove it.\n\t\tCheck after IC formal release.\n\t*/\n\tAddr4 |= 0x18000000;\n\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW1, Addr4);\n#endif /* HDR_TRANS_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (P2P_INF_ON(pAd))\n\t{\n\t\tPUCHAR pP2PBssid = &pAd->CurrentAddress[0];\n\n\t\tAddr4 = (ULONG)(pP2PBssid[0]) | \n\t\t\t\t(ULONG)(pP2PBssid[1] << 8)  | \n\t\t\t\t(ULONG)(pP2PBssid[2] << 16) |\n\t\t\t\t(ULONG)(pP2PBssid[3] << 24);\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4);\n\n#ifdef HDR_TRANS_SUPPORT\n\t\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW0, Addr4);\n#endif /* HDR_TRANS_SUPPORT */\n\n\t\tAddr4 = 0;\n\n\t\t/* always one BSSID in STA mode */\n\t\tAddr4 = (ULONG)(pP2PBssid[4]) | (ULONG)(pP2PBssid[5] << 8);\n\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4);\n\n\t\tRTMP_IO_READ32(pAd, MAC_BSSID_DW1, &regValue);\n\t\tregValue &= 0x0000FFFF;\n\t\tregValue |= (1 << 16);\t\t\n\n\t\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE0)\n\t\t{\n\t\t\tif ((pAd->CurrentAddress[5] % 2 != 0)\n#ifdef P2P_SUPPORT\n#ifdef P2P_ODD_MAC_ADJUST\n\t\t\t\t&& FALSE\n#endif /* P2P_ODD_MAC_ADJUST */\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The 2-BSSID mode is enabled, the BSSID byte5 MUST be the multiple of 2\\n\"));\n\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*set as 0/1 bit-21 of MAC_BSSID_DW1(offset: 0x1014) \n\t\t\tto disable/enable the new MAC address assignment.  */\n\t\t    regValue |= (1 << 21);\n\t\t}\n\t\t\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, regValue);\n#ifdef HDR_TRANS_SUPPORT\n\t\t/*\n\t\t\tpoint WCID MAC table to 0x1800\n\t\t\tThis is for debug.\n\t\t\tBut HDR_TRANS doesn't work if you remove it.\n\t\t\tCheck after IC formal release.\n\t\t*/\n\t\tregValue |= 0x18000000;\n\t\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW1, regValue);\n#endif /* HDR_TRANS_SUPPORT */\n\t}\n#endif /* P2P_SUPPORT */\n}\n\n\nVOID AsicSetMcastWC(RTMP_ADAPTER *pAd)\n{\n\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[MCAST_WCID];\n\t\n\tpEntry->Sst = SST_ASSOC;\n\tpEntry->Aid = MCAST_WCID;\t/* Softap supports 1 BSSID and use WCID=0 as multicast Wcid index*/\n\tpEntry->PsMode = PWR_ACTIVE;\n\tpEntry->CurrTxRate = pAd->CommonCfg.MlmeRate; \n\t//offset = MAC_WCID_BASE + BSS0Mcast_WCID * HW_WCID_ENTRY_SIZE;\n}\n\n/*\n\t==========================================================================\n\tDescription:   \n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AsicDelWcidTab(RTMP_ADAPTER *pAd, UCHAR Wcid) \n{\n\tUINT32 offset;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"AsicDelWcidTab==>Wcid = 0x%x\\n\",Wcid));\n\n\toffset = MAC_WCID_BASE + Wcid * HW_WCID_ENTRY_SIZE;\n\tRTMP_IO_WRITE32(pAd, offset, 0x0);\n\toffset += 4;\n\tRTMP_IO_WRITE32(pAd, offset, 0x0);\n}\n\n#ifdef DOT11_N_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicEnableRDG(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tTX_LINK_CFG_STRUC\tTxLinkCfg;\n\tUINT32\t\t\t\tData = 0;\n\n\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\tTxLinkCfg.field.TxRDGEn = 1;\n\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\n\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\tData  &= 0xFFFFFF00;\n\tData  |= 0x80;\n\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicDisableRDG(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tTX_LINK_CFG_STRUC\tTxLinkCfg;\n\tUINT32\t\t\t\tData = 0;\n\n\n\n\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\tTxLinkCfg.field.TxRDGEn = 0;\n\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\n\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\t\n\tData  &= 0xFFFFFF00;\n\t/*Data  |= 0x20;*/\n#ifndef WIFI_TEST\n\t/*if ( pAd->CommonCfg.bEnableTxBurst )\t*/\n\t/*\tData |= 0x60;  for performance issue not set the TXOP to 0*/\n#endif\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE) \n#ifdef DOT11_N_SUPPORT\n\t\t&& (pAd->MacTab.fAnyStationMIMOPSDynamic == FALSE)\n#endif /* DOT11_N_SUPPORT */\n\t)\n\t{\n\t\t/* For CWC test, change txop from 0x30 to 0x20 in TxBurst mode*/\n\t\tif (pAd->CommonCfg.bEnableTxBurst)\n\t\tData |= 0x20;\n\t}\n\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n\n}\n#endif /* DOT11_N_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicDisableSync(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBCN_TIME_CFG_STRUC csr;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->Disable TSF synchronization\\n\"));\n\n\t/* 2003-12-20 disable TSF and TBTT while NIC in power-saving have side effect*/\n\t/*\t\t\t  that NIC will never wakes up because TSF stops and no more */\n\t/*\t\t\t  TBTT interrupts*/\n\tpAd->TbttTickCount = 0;\n\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);\n\tcsr.field.bBeaconGen = 0;\n\tcsr.field.bTBTTEnable = 0;\n\tcsr.field.TsfSyncMode = 0;\n\tcsr.field.bTsfTicking = 0;\n\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicEnableBssSync(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBCN_TIME_CFG_STRUC csr;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->AsicEnableBssSync(INFRA mode)\\n\"));\n\n\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);\n/*\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, 0x00000000);*/\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tcsr.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; /* ASIC register in units of 1/16 TU*/\n\t\tcsr.field.bTsfTicking = 1;\n\t\tcsr.field.TsfSyncMode = 3; /* sync TSF similar as in ADHOC mode?*/\n\t\tcsr.field.bBeaconGen  = 1; /* AP should generate BEACON*/\n\t\tcsr.field.bTBTTEnable = 1;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\t\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tcsr.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; /* ASIC register in units of 1/16 TU*/\n\t\tcsr.field.bTsfTicking = 1;\n\t\tcsr.field.TsfSyncMode = 1; /* sync TSF in INFRASTRUCTURE mode*/\n\t\tcsr.field.bBeaconGen  = 0; /* do NOT generate BEACON*/\n\t\tcsr.field.bTBTTEnable = 1;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\t\n\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\tNote: \n\t\tBEACON frame in shared memory should be built ok before this routine\n\t\tcan be called. Otherwise, a garbage frame maybe transmitted out every\n\t\tBeacon period.\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicEnableIbssSync(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tBCN_TIME_CFG_STRUC csr9;\n\tPUCHAR\t\t\tptr;\n\tUINT i;\n\tULONG beaconBaseLocation = 0;\n\tUSHORT\t\t\tbeaconLen = (USHORT) pAd->BeaconTxWI.TxWIMPDUByteCnt;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUINT32 longptr;\n\t\n#ifdef RT_BIG_ENDIAN\n\t{\n\tTXWI_STRUC\t\tlocalTxWI;\n\t\n\tNdisMoveMemory((PUCHAR)&localTxWI, (PUCHAR)&pAd->BeaconTxWI, TXWISize);\n\tRTMPWIEndianChange(pAd, (PUCHAR)&localTxWI, TYPE_TXWI);\n\tbeaconLen = (USHORT) localTxWI.TxWIMPDUByteCnt;\n\t}\n#endif /* RT_BIG_ENDIAN */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->AsicEnableIbssSync(TxWIMPDUByteCnt=%d, beaconLen=%d)\\n\", pAd->BeaconTxWI.TxWIMPDUByteCnt, beaconLen));\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->AsicEnableIbssSync(ADHOC mode. TxWIMPDUByteCnt = %d)\\n\", pAd->BeaconTxWI.TxWIMPDUByteCnt));\n\n\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr9.word);\n\tcsr9.field.bBeaconGen = 0;\n\tcsr9.field.bTBTTEnable = 0;\n\tcsr9.field.bTsfTicking = 0;\n\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word);\n\tbeaconBaseLocation = HW_BEACON_BASE0(pAd);\n\n\n#ifdef RTMP_MAC_USB\n\t/* move BEACON TXD and frame content to on-chip memory*/\n\tptr = (PUCHAR)&pAd->BeaconTxWI;\n\tfor (i=0; i < TXWISize; i+=2)\n\t{\n\t\tlongptr =  *ptr + (*(ptr+1)<<8);\n\t\tRTMP_CHIP_UPDATE_BEACON(pAd, HW_BEACON_BASE0(pAd) + i, longptr, 2);\n\t\tptr += 2;\n\t}\n\n\t/* start right after the 16-byte TXWI field*/\n\tptr = pAd->BeaconBuf;\n\t/*for (i=0; i< pAd->BeaconTxWI.TxWIMPDUByteCnt; i+=2)*/\n\tfor (i=0; i< beaconLen; i+=2)\n\t{\n\t\tlongptr =  *ptr + (*(ptr+1)<<8);\n\t\tRTMP_CHIP_UPDATE_BEACON(pAd, HW_BEACON_BASE0(pAd) + TXWISize + i, longptr, 2);\n\t\tptr +=2;\n\t}\n#endif /* RTMP_MAC_USB */\n\n\n\t\n\t/* For Wi-Fi faily generated beacons between participating stations. */\n\t/* Set TBTT phase adaptive adjustment step to 8us (default 16us)*/\n\t/* don't change settings 2006-5- by Jerry*/\n\t/*RTMP_IO_WRITE32(pAd, TBTT_SYNC_CFG, 0x00001010);*/\n\t\n\t/* start sending BEACON*/\n\tcsr9.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; /* ASIC register in units of 1/16 TU*/\n\tcsr9.field.bTsfTicking = 1;\n#ifdef IWSC_SUPPORT\n\t/*\n\t\t SYNC with nobody\n\t\t If Canon loses our Beacon over 5 seconds, Canon will delete us silently.\n\t*/\n\tcsr9.field.TsfSyncMode = 3; // sync TSF in IBSS mode\n#else /* IWSC_SUPPORT */\n\t/*\n\t\t(STA ad-hoc mode) Upon the reception of BEACON frame from associated BSS, \n\t\tlocal TSF is updated with remote TSF only if the remote TSF is greater than local TSF\n\t*/\n\tcsr9.field.TsfSyncMode = 2; /* sync TSF in IBSS mode*/\n#endif /* !IWSC_SUPPORT */\n\tcsr9.field.bTBTTEnable = 1;\n\tcsr9.field.bBeaconGen = 1;\n\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicSetEdcaParm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PEDCA_PARM\t pEdcaParm)\n{\n\tEDCA_AC_CFG_STRUC   Ac0Cfg, Ac1Cfg, Ac2Cfg, Ac3Cfg;\n\tAC_TXOP_CSR0_STRUC csr0;\n\tAC_TXOP_CSR1_STRUC csr1;\n\tAIFSN_CSR_STRUC    AifsnCsr;\n\tCWMIN_CSR_STRUC    CwminCsr;\n\tCWMAX_CSR_STRUC    CwmaxCsr;\n\tint i;\n\n\tAc0Cfg.word = 0;\n\tAc1Cfg.word = 0;\n\tAc2Cfg.word = 0;\n\tAc3Cfg.word = 0;\n\tif ((pEdcaParm == NULL) || (pEdcaParm->bValid == FALSE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"AsicSetEdcaParm\\n\"));\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WMM_INUSED);\n\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t{\n\t\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) || IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))\n\t\t\t\tCLIENT_STATUS_CLEAR_FLAG(&pAd->MacTab.Content[i], fCLIENT_STATUS_WMM_CAPABLE);\n\t\t}\n\n\t\t/*========================================================*/\n\t\t/*      MAC Register has a copy .*/\n\t\t/*========================================================*/\n/*#ifndef WIFI_TEST*/\n\t\tif( pAd->CommonCfg.bEnableTxBurst )\t\t\n\t\t{\n\t\t\t/* For CWC test, change txop from 0x30 to 0x20 in TxBurst mode*/\n\t\t\tAc0Cfg.field.AcTxop = 0x20; /* Suggest by John for TxBurst in HT Mode*/\n\t\t}\n\t\telse\n\t\t\tAc0Cfg.field.AcTxop = 0;\t/* QID_AC_BE*/\n/*#else*/\n/*\t\tAc0Cfg.field.AcTxop = 0;\t QID_AC_BE*/\n/*#endif\t\t\t\t\t*/\n\t\tAc0Cfg.field.Cwmin = CW_MIN_IN_BITS;\n\t\tAc0Cfg.field.Cwmax = CW_MAX_IN_BITS;\n\t\tAc0Cfg.field.Aifsn = 2;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Ac0Cfg.word);\n\n\t\tAc1Cfg.field.AcTxop = 0;\t/* QID_AC_BK*/\n\t\tAc1Cfg.field.Cwmin = CW_MIN_IN_BITS;\n\t\tAc1Cfg.field.Cwmax = CW_MAX_IN_BITS;\n\t\tAc1Cfg.field.Aifsn = 2;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, Ac1Cfg.word);\n\n\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\t{\n\t\t\tAc2Cfg.field.AcTxop = 192;\t/* AC_VI: 192*32us ~= 6ms*/\n\t\t\tAc3Cfg.field.AcTxop = 96;\t/* AC_VO: 96*32us  ~= 3ms*/\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAc2Cfg.field.AcTxop = 96;\t/* AC_VI: 96*32us ~= 3ms*/\n\t\t\tAc3Cfg.field.AcTxop = 48;\t/* AC_VO: 48*32us ~= 1.5ms*/\n\t\t}\n\t\tAc2Cfg.field.Cwmin = CW_MIN_IN_BITS;\n\t\tAc2Cfg.field.Cwmax = CW_MAX_IN_BITS;\n\t\tAc2Cfg.field.Aifsn = 2;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, Ac2Cfg.word);\n\t\tAc3Cfg.field.Cwmin = CW_MIN_IN_BITS;\n\t\tAc3Cfg.field.Cwmax = CW_MAX_IN_BITS;\n\t\tAc3Cfg.field.Aifsn = 2;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, Ac3Cfg.word);\n\n\t\t/*========================================================*/\n\t\t/*      DMA Register has a copy too.*/\n\t\t/*========================================================*/\n\t\tcsr0.field.Ac0Txop = 0;\t\t/* QID_AC_BE*/\n\t\tcsr0.field.Ac1Txop = 0;\t\t/* QID_AC_BK*/\n\t\tRTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);\n\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\t{\n\t\t\tcsr1.field.Ac2Txop = 192;\t\t/* AC_VI: 192*32us ~= 6ms*/\n\t\t\tcsr1.field.Ac3Txop = 96;\t\t/* AC_VO: 96*32us  ~= 3ms*/\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcsr1.field.Ac2Txop = 96;\t\t/* AC_VI: 96*32us ~= 3ms*/\n\t\t\tcsr1.field.Ac3Txop = 48;\t\t/* AC_VO: 48*32us ~= 1.5ms*/\n\t\t}\n\t\tRTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr1.word);\n\n\t\tCwminCsr.word = 0;\n\t\tCwminCsr.field.Cwmin0 = CW_MIN_IN_BITS;\n\t\tCwminCsr.field.Cwmin1 = CW_MIN_IN_BITS;\n\t\tCwminCsr.field.Cwmin2 = CW_MIN_IN_BITS;\n\t\tCwminCsr.field.Cwmin3 = CW_MIN_IN_BITS;\n\t\tRTMP_IO_WRITE32(pAd, WMM_CWMIN_CFG, CwminCsr.word);\n\n\t\tCwmaxCsr.word = 0;\n\t\tCwmaxCsr.field.Cwmax0 = CW_MAX_IN_BITS;\n\t\tCwmaxCsr.field.Cwmax1 = CW_MAX_IN_BITS;\n\t\tCwmaxCsr.field.Cwmax2 = CW_MAX_IN_BITS;\n\t\tCwmaxCsr.field.Cwmax3 = CW_MAX_IN_BITS;\n\t\tRTMP_IO_WRITE32(pAd, WMM_CWMAX_CFG, CwmaxCsr.word);\n\n\t\tRTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, 0x00002222);\n\n\t\tNdisZeroMemory(&pAd->CommonCfg.APEdcaParm, sizeof(EDCA_PARM));\n\n\t}\n\telse\n\t{\t\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_WMM_INUSED);\n\t\t/*========================================================*/\n\t\t/*      MAC Register has a copy.*/\n\t\t/*========================================================*/\n\t\t\n\t\t/* Modify Cwmin/Cwmax/Txop on queue[QID_AC_VI], Recommend by Jerry 2005/07/27*/\n\t\t/* To degrade our VIDO Queue's throughput for WiFi WMM S3T07 Issue.*/\n\t\t\n\t\t/*pEdcaParm->Txop[QID_AC_VI] = pEdcaParm->Txop[QID_AC_VI] * 7 / 10;  rt2860c need this\t\t*/\n\n\t\tAc0Cfg.field.AcTxop =  pEdcaParm->Txop[QID_AC_BE];\n\t\tAc0Cfg.field.Cwmin= pEdcaParm->Cwmin[QID_AC_BE];\n\t\tAc0Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_BE];\n\t\tAc0Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BE]; /*+1;*/\n\n\t\tAc1Cfg.field.AcTxop =  pEdcaParm->Txop[QID_AC_BK];\n\t\tAc1Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_BK]; /*+2; */\n\t\tAc1Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_BK];\n\t\tAc1Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BK]; /*+1;*/\n\n\n\t\tAc2Cfg.field.AcTxop = (pEdcaParm->Txop[QID_AC_VI] * 6) / 10;\n\t\t{\n\t\tAc2Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VI];\n\t\tAc2Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VI];\n\t\t}\n\t\t/*sync with window 20110524*/\n\t\tAc2Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VI] + 1; /* 5.2.27 T6 Pass Tx VI+BE, but will impack 5.2.27/28 T7. Tx VI*/\n\t\t\n#ifdef INF_AMAZON_SE\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tAc2Cfg.field.Aifsn = 0x3; /*for WiFi WMM A1-T07.*/\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* INF_AMAZON_SE */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\t/* Tuning for Wi-Fi WMM S06*/\n\t\t\tif (pAd->CommonCfg.bWiFiTest && \n\t\t\t\tpEdcaParm->Aifsn[QID_AC_VI] == 10)\n\t\t\t\tAc2Cfg.field.Aifsn -= 1; \n\n\t\t\t/* Tuning for TGn Wi-Fi 5.2.32*/\n\t\t\t/* STA TestBed changes in this item: conexant legacy sta ==> broadcom 11n sta*/\n\t\t\tif (STA_TGN_WIFI_ON(pAd) && \n\t\t\t\tpEdcaParm->Aifsn[QID_AC_VI] == 10)\n\t\t\t{\n\t\t\t\tAc0Cfg.field.Aifsn = 3;\n\t\t\t\tAc2Cfg.field.AcTxop = 5;\n\t\t\t}\n\t\t\t\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tAc3Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VO];\n\t\tAc3Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VO];\n\t\tAc3Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VO];\n\t\tAc3Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VO];\n\n/*#ifdef WIFI_TEST*/\n\t\tif (pAd->CommonCfg.bWiFiTest)\n\t\t{\n\t\t\tif (Ac3Cfg.field.AcTxop == 102)\n\t\t\t{\n\t\t\tAc0Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BE] ? pEdcaParm->Txop[QID_AC_BE] : 10;\n\t\t\t\tAc0Cfg.field.Aifsn  = pEdcaParm->Aifsn[QID_AC_BE]-1; /* AIFSN must >= 1 */\n\t\t\tAc1Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BK];\n\t\t\t\tAc1Cfg.field.Aifsn  = pEdcaParm->Aifsn[QID_AC_BK];\n\t\t\tAc2Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VI];\n\t\t\t}\n\t\t}\n/*#endif  WIFI_TEST */\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Ac0Cfg.word);\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, Ac1Cfg.word);\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, Ac2Cfg.word);\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, Ac3Cfg.word);\n\n\n\t\t/*========================================================*/\n\t\t/*      DMA Register has a copy too.*/\n\t\t/*========================================================*/\n\t\tcsr0.field.Ac0Txop = Ac0Cfg.field.AcTxop;\n\t\tcsr0.field.Ac1Txop = Ac1Cfg.field.AcTxop;\n\t\tRTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);\n\n\t\tcsr1.field.Ac2Txop = Ac2Cfg.field.AcTxop;\n\t\tcsr1.field.Ac3Txop = Ac3Cfg.field.AcTxop;\n\t\tRTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr1.word);\n\n\t\tCwminCsr.word = 0;\n\t\tCwminCsr.field.Cwmin0 = pEdcaParm->Cwmin[QID_AC_BE];\n\t\tCwminCsr.field.Cwmin1 = pEdcaParm->Cwmin[QID_AC_BK];\n\t\tCwminCsr.field.Cwmin2 = pEdcaParm->Cwmin[QID_AC_VI];\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tCwminCsr.field.Cwmin3 = pEdcaParm->Cwmin[QID_AC_VO];\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tCwminCsr.field.Cwmin3 = pEdcaParm->Cwmin[QID_AC_VO] - 1; /*for TGn wifi test*/\n#endif /* CONFIG_STA_SUPPORT */\n\t\tRTMP_IO_WRITE32(pAd, WMM_CWMIN_CFG, CwminCsr.word);\n\n\t\tCwmaxCsr.word = 0;\n\t\tCwmaxCsr.field.Cwmax0 = pEdcaParm->Cwmax[QID_AC_BE];\n\t\tCwmaxCsr.field.Cwmax1 = pEdcaParm->Cwmax[QID_AC_BK];\n\t\tCwmaxCsr.field.Cwmax2 = pEdcaParm->Cwmax[QID_AC_VI];\n\t\tCwmaxCsr.field.Cwmax3 = pEdcaParm->Cwmax[QID_AC_VO];\n\t\tRTMP_IO_WRITE32(pAd, WMM_CWMAX_CFG, CwmaxCsr.word);\n\n\t\tAifsnCsr.word = 0;\n\t\tAifsnCsr.field.Aifsn0 = Ac0Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_BE];*/\n\t\tAifsnCsr.field.Aifsn1 = Ac1Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_BK];*/\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_MAC_USB\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif(pAd->Antenna.field.TxPath == 1)\n\t\t\t\tAifsnCsr.field.Aifsn1 = Ac1Cfg.field.Aifsn + 2; \t/*5.2.27 T7 Pass*/\n\t\t}\n#endif /* RTMP_MAC_USB */\n#endif /* CONFIG_STA_SUPPORT */\n\t\tAifsnCsr.field.Aifsn2 = Ac2Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_VI];*/\n#ifdef INF_AMAZON_SE\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tAifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_VO]*/\n\t\t\tAifsnCsr.field.Aifsn2 = 0x2; /*pEdcaParm->Aifsn[QID_AC_VI]; for WiFi WMM A1-T07.*/\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* INF_AMAZON_SE */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\t/* Tuning for Wi-Fi WMM S06*/\n\t\t\tif (pAd->CommonCfg.bWiFiTest &&\n\t\t\t\tpEdcaParm->Aifsn[QID_AC_VI] == 10)\n\t\t\t\tAifsnCsr.field.Aifsn2 = Ac2Cfg.field.Aifsn - 4;\n\n\t\t\t/* Tuning for TGn Wi-Fi 5.2.32*/\n\t\t\t/* STA TestBed changes in this item: connexant legacy sta ==> broadcom 11n sta*/\n\t\t\tif (STA_TGN_WIFI_ON(pAd) && \n\t\t\t\tpEdcaParm->Aifsn[QID_AC_VI] == 10)\n\t\t\t{\n\t\t\t\tAifsnCsr.field.Aifsn0 = 3;\n\t\t\t\tAifsnCsr.field.Aifsn2 = 7;\n\t\t\t}\n\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_WMM_CAPABLE);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tAifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_VO]*/\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tAifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn - 1; /*pEdcaParm->Aifsn[QID_AC_VO]; for TGn wifi test*/\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\tRTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, AifsnCsr.word);\n\n\t\tNdisMoveMemory(&pAd->CommonCfg.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM));\n\t\tif (!ADHOC_ON(pAd))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"EDCA [#%d]: AIFSN CWmin CWmax  TXOP(us)  ACM\\n\", pEdcaParm->EdcaUpdateCount));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"     AC_BE      %2d     %2d     %2d      %4d     %d\\n\",\n\t\t\t\t\t\t\t\t\t pEdcaParm->Aifsn[0],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmin[0],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmax[0],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Txop[0]<<5,\n\t\t\t\t\t\t\t\t\t pEdcaParm->bACM[0]));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"     AC_BK      %2d     %2d     %2d      %4d     %d\\n\",\n\t\t\t\t\t\t\t\t\t pEdcaParm->Aifsn[1],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmin[1],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmax[1],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Txop[1]<<5,\n\t\t\t\t\t\t\t\t\t pEdcaParm->bACM[1]));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"     AC_VI      %2d     %2d     %2d      %4d     %d\\n\",\n\t\t\t\t\t\t\t\t\t pEdcaParm->Aifsn[2],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmin[2],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmax[2],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Txop[2]<<5,\n\t\t\t\t\t\t\t\t\t pEdcaParm->bACM[2]));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"     AC_VO      %2d     %2d     %2d      %4d     %d\\n\",\n\t\t\t\t\t\t\t\t\t pEdcaParm->Aifsn[3],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmin[3],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Cwmax[3],\n\t\t\t\t\t\t\t\t\t pEdcaParm->Txop[3]<<5,\n\t\t\t\t\t\t\t\t\t pEdcaParm->bACM[3]));\n\t\t}\n\n\t}\n\n\tpAd->CommonCfg.RestoreBurstMode = Ac0Cfg.word;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID \tAsicSetSlotTime(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN bUseShortSlotTime) \n{\n\tULONG\tSlotTime;\n\tUINT32\tRegValue = 0;\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (pAd->CommonCfg.Channel > 14)\n\t\tbUseShortSlotTime = TRUE;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (bUseShortSlotTime && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED))\n\t\treturn;\n\telse if ((!bUseShortSlotTime) && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED)))\n\t\treturn;\n\n\tif (bUseShortSlotTime)\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);\n\telse\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);\n\n\tSlotTime = (bUseShortSlotTime)? 9 : 20;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* force using short SLOT time for FAE to demo performance when TxBurst is ON*/\n\t\tif (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)))\n#ifdef DOT11_N_SUPPORT\n\t\t\t|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))\n#endif /* DOT11_N_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\t/* In this case, we will think it is doing Wi-Fi test*/\n\t\t\t/* And we will not set to short slot when bEnableTxBurst is TRUE.*/\n\t\t}\n\t\telse if (pAd->CommonCfg.bEnableTxBurst)\n\t\t{\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);\n\t\t\tSlotTime = 9;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\n\t/* For some reasons, always set it to short slot time.*/\n\t/* ToDo: Should consider capability with 11B*/\n#ifdef CONFIG_STA_SUPPORT \n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\t\n\t\t{\n\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);\n\t\t\tSlotTime = 20;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue);\n\tRegValue = RegValue & 0xFFFFFF00;\n\n\tRegValue |= SlotTime;\n\n\tRTMP_IO_WRITE32(pAd, BKOFF_SLOT_CFG, RegValue);\n}\n\n/*\n\t========================================================================\n\tDescription:\n\t\tAdd Shared key information into ASIC. \n\t\tUpdate shared key, TxMic and RxMic to Asic Shared key table\n\t\tUpdate its cipherAlg to Asic Shared key Mode.\n\t\t\n    Return:\n\t========================================================================\n*/\nVOID AsicAddSharedKeyEntry(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR\t\t \tBssIndex,\n\tIN UCHAR\t\t \tKeyIdx,\n\tIN PCIPHER_KEY\t\tpCipherKey)\n{\n\tULONG offset; /*, csr0;*/\n\tSHAREDKEY_MODE_STRUC csr1;\n\n\tPUCHAR\t\tpKey = pCipherKey->Key;\n\tPUCHAR\t\tpTxMic = pCipherKey->TxMic;\n\tPUCHAR\t\tpRxMic = pCipherKey->RxMic;\n\tUCHAR\t\tCipherAlg = pCipherKey->CipherAlg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AsicAddSharedKeyEntry BssIndex=%d, KeyIdx=%d\\n\", BssIndex,KeyIdx));\n/*============================================================================================*/\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"AsicAddSharedKeyEntry: %s key #%d\\n\", CipherName[CipherAlg], BssIndex*4 + KeyIdx));\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\" \tKey = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tpKey[0],pKey[1],pKey[2],pKey[3],pKey[4],pKey[5],pKey[6],pKey[7],pKey[8],pKey[9],pKey[10],pKey[11],pKey[12],pKey[13],pKey[14],pKey[15]));\n\tif (pRxMic)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\" \tRx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpRxMic[0],pRxMic[1],pRxMic[2],pRxMic[3],pRxMic[4],pRxMic[5],pRxMic[6],pRxMic[7]));\n\t}\n\tif (pTxMic)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\" \tTx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpTxMic[0],pTxMic[1],pTxMic[2],pTxMic[3],pTxMic[4],pTxMic[5],pTxMic[6],pTxMic[7]));\n\t}\n/*============================================================================================*/\n\t\n\t/* fill key material - key + TX MIC + RX MIC*/\n\t\n\n#ifdef RTMP_MAC_USB\n{\n\toffset = SHARED_KEY_TABLE_BASE + (4*BssIndex + KeyIdx)*HW_KEY_ENTRY_SIZE;\n\tRTUSBMultiWrite(pAd, offset, pKey, MAX_LEN_OF_SHARE_KEY, FALSE);\n\n\toffset += MAX_LEN_OF_SHARE_KEY;\n\tif (pTxMic)\n\t{\n\t\tRTUSBMultiWrite(pAd, offset, pTxMic, 8, FALSE);\n\t}\n\n\toffset += 8;\n\tif (pRxMic)\n\t{\n\t\tRTUSBMultiWrite(pAd, offset, pRxMic, 8, FALSE);\n\t}\n}\n#endif /* RTMP_MAC_USB */\n\n\t\n\t/* Update cipher algorithm. WSTA always use BSS0*/\n\tRTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), &csr1.word);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Read: SHARED_KEY_MODE_BASE at this Bss[%d] KeyIdx[%d]= 0x%x \\n\", BssIndex,KeyIdx, csr1.word));\n\tif ((BssIndex%2) == 0)\n\t{\n\t\tif (KeyIdx == 0)\n\t\t\tcsr1.field.Bss0Key0CipherAlg = CipherAlg;\n\t\telse if (KeyIdx == 1)\n\t\t\tcsr1.field.Bss0Key1CipherAlg = CipherAlg;\n\t\telse if (KeyIdx == 2)\n\t\t\tcsr1.field.Bss0Key2CipherAlg = CipherAlg;\n\t\telse\n\t\t\tcsr1.field.Bss0Key3CipherAlg = CipherAlg;\n\t}\n\telse\n\t{\n\t\tif (KeyIdx == 0)\n\t\t\tcsr1.field.Bss1Key0CipherAlg = CipherAlg;\n\t\telse if (KeyIdx == 1)\n\t\t\tcsr1.field.Bss1Key1CipherAlg = CipherAlg;\n\t\telse if (KeyIdx == 2)\n\t\t\tcsr1.field.Bss1Key2CipherAlg = CipherAlg;\n\t\telse\n\t\t\tcsr1.field.Bss1Key3CipherAlg = CipherAlg;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Write: SHARED_KEY_MODE_BASE at this Bss[%d] = 0x%x \\n\", BssIndex, csr1.word));\n\tRTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), csr1.word);\n\t\t\n}\n\n/*\tIRQL = DISPATCH_LEVEL*/\nVOID AsicRemoveSharedKeyEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t BssIndex,\n\tIN UCHAR\t\t KeyIdx)\n{\n\t/*ULONG SecCsr0;*/\n\tSHAREDKEY_MODE_STRUC csr1;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"AsicRemoveSharedKeyEntry: #%d \\n\", BssIndex*4 + KeyIdx));\n\n\tRTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), &csr1.word);\n\tif ((BssIndex%2) == 0)\n\t{\n\t\tif (KeyIdx == 0)\n\t\t\tcsr1.field.Bss0Key0CipherAlg = 0;\n\t\telse if (KeyIdx == 1)\n\t\t\tcsr1.field.Bss0Key1CipherAlg = 0;\n\t\telse if (KeyIdx == 2)\n\t\t\tcsr1.field.Bss0Key2CipherAlg = 0;\n\t\telse\n\t\t\tcsr1.field.Bss0Key3CipherAlg = 0;\n\t}\n\telse\n\t{\n\t\tif (KeyIdx == 0)\n\t\t\tcsr1.field.Bss1Key0CipherAlg = 0;\n\t\telse if (KeyIdx == 1)\n\t\t\tcsr1.field.Bss1Key1CipherAlg = 0;\n\t\telse if (KeyIdx == 2)\n\t\t\tcsr1.field.Bss1Key2CipherAlg = 0;\n\t\telse\n\t\t\tcsr1.field.Bss1Key3CipherAlg = 0;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Write: SHARED_KEY_MODE_BASE at this Bss[%d] = 0x%x \\n\", BssIndex, csr1.word));\n\tRTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), csr1.word);\n\tASSERT(BssIndex < 4);\n\tASSERT(KeyIdx < 4);\n\n}\n\nVOID AsicUpdateWCIDIVEIV(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT\t\tWCID,\n\tIN ULONG        uIV,\n\tIN ULONG        uEIV)\n{\n\tULONG\toffset;\n\n\toffset = MAC_IVEIV_TABLE_BASE + (WCID * HW_IVEIV_ENTRY_SIZE);\n\n\tRTMP_IO_WRITE32(pAd, offset, uIV);\n\tRTMP_IO_WRITE32(pAd, offset + 4, uEIV);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: wcid(%d) 0x%08lx, 0x%08lx \\n\", \n\t\t\t\t\t\t\t\t\t__FUNCTION__, WCID, uIV, uEIV));\t\n}\n\nVOID AsicUpdateRxWCIDTable(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT\t\tWCID,\n\tIN PUCHAR        pAddr)\n{\n\tULONG offset;\n\tULONG Addr;\n\t\n\toffset = MAC_WCID_BASE + (WCID * HW_WCID_ENTRY_SIZE);\t\n\tAddr = pAddr[0] + (pAddr[1] << 8) +(pAddr[2] << 16) +(pAddr[3] << 24);\n\tRTMP_IO_WRITE32(pAd, offset, Addr);\n\tAddr = pAddr[4] + (pAddr[5] << 8);\n\tRTMP_IO_WRITE32(pAd, offset + 4, Addr);\t\n}\n\t\n/*\n\t========================================================================\n\tDescription:\n\t\tAdd Client security information into ASIC WCID table and IVEIV table.\n    Return:\n\n    Note :\n\t\tThe key table selection rule :\n    \t1.\tWds-links and Mesh-links always use Pair-wise key table. \t\n\t\t2. \tWhen the CipherAlg is TKIP, AES, SMS4 or the dynamic WEP is enabled, \n\t\t\tit needs to set key into Pair-wise Key Table.\n\t\t3.\tThe pair-wise key security mode is set NONE, it means as no security.\n\t\t4.\tIn STA Adhoc mode, it always use shared key table.\n\t\t5.\tOtherwise, use shared key table\n\n\t========================================================================\n*/\nVOID\tAsicUpdateWcidAttributeEntry(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBssIdx,\n\tIN \tUCHAR\t\t \tKeyIdx,\n\tIN \tUCHAR\t\t \tCipherAlg,\n\tIN\tUINT8\t\t\tWcid,\n\tIN\tUINT8\t\t\tKeyTabFlag)\n{\n\tWCID_ATTRIBUTE_STRUC WCIDAttri;\t\n\tUSHORT\t\toffset;\n\n\t/* Initialize the content of WCID Attribue  */\n\tWCIDAttri.word = 0;\n\n\t/* The limitation of HW WCID table */\n\tif (/*Wcid < 1 ||*/ Wcid > 254)\n\t{\t\t\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s: Wcid is invalid (%d). \\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, Wcid));\t\n\t\treturn;\n\t}\n\n\t/* Update the pairwise key security mode.\n\t   Use bit10 and bit3~1 to indicate the pairwise cipher mode */\t\n\tWCIDAttri.field.PairKeyModeExt = ((CipherAlg & 0x08) >> 3);\n\tWCIDAttri.field.PairKeyMode = (CipherAlg & 0x07);\n\n\t/* Update the MBSS index.\n\t   Use bit11 and bit6~4 to indicate the BSS index */\t\n\tWCIDAttri.field.BSSIdxExt = ((BssIdx & 0x08) >> 3);\n\tWCIDAttri.field.BSSIdx = (BssIdx & 0x07);\n\n#ifdef WAPI_SUPPORT\n\t/* Update WAPI related information */\n\tif (CipherAlg == CIPHER_SMS4)\n\t{\n\t\tif (KeyTabFlag == SHAREDKEYTABLE)\n\t\t\tWCIDAttri.field.WAPI_MCBC = 1;\n\t\tWCIDAttri.field.WAPIKeyIdx = ((KeyIdx == 0) ? 0 : 1); \n\t}\n#endif /* WAPI_SUPPORT */\n\t\n\t/* Assign Key Table selection */\t\t\n\tWCIDAttri.field.KeyTab = KeyTabFlag;\n\n\t/* Update related information to ASIC */\n\toffset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);\n\tRTMP_IO_WRITE32(pAd, offset, WCIDAttri.word);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : WCID #%d, KeyIndex #%d, Alg=%s\\n\", __FUNCTION__, Wcid, KeyIdx, CipherName[CipherAlg]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\t\tWCIDAttri = 0x%x \\n\", WCIDAttri.word));\t\n\t\n}\n\t\n\n/*\n\t========================================================================\n\tDescription:\n\t\tAdd Pair-wise key material into ASIC. \n\t\tUpdate pairwise key, TxMic and RxMic to Asic Pair-wise key table\n\t\t\t\t\n    Return:\n\t========================================================================\n*/\nVOID AsicAddPairwiseKeyEntry(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR\t\t\tWCID,\n\tIN PCIPHER_KEY\t\tpCipherKey)\n{\n\tINT i;\n\tULONG \t\toffset;\n\tPUCHAR\t\t pKey = pCipherKey->Key;\n\tPUCHAR\t\t pTxMic = pCipherKey->TxMic;\n\tPUCHAR\t\t pRxMic = pCipherKey->RxMic;\n\tUCHAR\t\tCipherAlg = pCipherKey->CipherAlg;\n\n\t/* EKEY*/\n\toffset = PAIRWISE_KEY_TABLE_BASE + (WCID * HW_KEY_ENTRY_SIZE);\n#ifdef RTMP_MAC_USB\n\tRTUSBMultiWrite(pAd, offset, &pCipherKey->Key[0], MAX_LEN_OF_PEER_KEY, FALSE);\n#endif /* RTMP_MAC_USB */\n\tfor (i=0; i<MAX_LEN_OF_PEER_KEY; i+=4)\n\t{\n\t\tUINT32 Value;\n\t\tRTMP_IO_READ32(pAd, offset + i, &Value);\n\t}\n\n\toffset += MAX_LEN_OF_PEER_KEY;\n\t\n\t/*  MIC KEY*/\n\tif (pTxMic)\n\t{\n#ifdef RTMP_MAC_USB\n\t\tRTUSBMultiWrite(pAd, offset, &pCipherKey->TxMic[0], 8, FALSE);\n#endif /* RTMP_MAC_USB */\n\t}\n\toffset += 8;\n\tif (pRxMic)\n\t{\n#ifdef RTMP_MAC_USB\n\t\tRTUSBMultiWrite(pAd, offset, &pCipherKey->RxMic[0], 8, FALSE);\n#endif /* RTMP_MAC_USB */\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"AsicAddPairwiseKeyEntry: WCID #%d Alg=%s\\n\",WCID, CipherName[CipherAlg]));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\tKey = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tpKey[0],pKey[1],pKey[2],pKey[3],pKey[4],pKey[5],pKey[6],pKey[7],pKey[8],pKey[9],pKey[10],pKey[11],pKey[12],pKey[13],pKey[14],pKey[15]));\n\tif (pRxMic)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\tRx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpRxMic[0],pRxMic[1],pRxMic[2],pRxMic[3],pRxMic[4],pRxMic[5],pRxMic[6],pRxMic[7]));\n\t}\n\tif (pTxMic)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\tTx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpTxMic[0],pTxMic[1],pTxMic[2],pTxMic[3],pTxMic[4],pTxMic[5],pTxMic[6],pTxMic[7]));\n\t}\n}\n\n/*\n\t========================================================================\n\tDescription:\n\t\tRemove Pair-wise key material from ASIC. \n\n    Return:\n\t========================================================================\n*/\t\nVOID AsicRemovePairwiseKeyEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t Wcid)\n{\n\t/* Set the specific WCID attribute entry as OPEN-NONE */\n\tAsicUpdateWcidAttributeEntry(pAd, \n\t\t\t\t\t\t\t  BSS0,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  CIPHER_NONE, \n\t\t\t\t\t\t\t  Wcid,\n\t\t\t\t\t\t\t  PAIRWISEKEYTABLE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : Wcid #%d \\n\", __FUNCTION__, Wcid));\n}\n\nBOOLEAN AsicSendCommandToMcu(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Command,\n\tIN UCHAR Token,\n\tIN UCHAR Arg0,\n\tIN UCHAR Arg1,\n\tIN BOOLEAN in_atomic)\n{\n#ifdef RT65xx\n\t// TODO: shiang-6590, fix me, currently firmware is not ready yet, so ignore it!\n\tif (IS_RT65XX(pAd))\n\t\treturn TRUE;\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\treturn TRUE;\n#endif /* MT7601 */\n\n\tif (pAd->chipOps.sendCommandToMcu)\n\t\treturn pAd->chipOps.sendCommandToMcu(pAd, Command, Token, Arg0, Arg1, in_atomic);\n\telse\n\t\treturn FALSE;\n}\n\n\nBOOLEAN AsicSendCommandToMcuBBP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t Command,\n\tIN UCHAR\t\t Token,\n\tIN UCHAR\t\t Arg0,\n\tIN UCHAR\t\t Arg1,\n\tIN BOOLEAN\t\tFlgIsNeedLocked)\n{\n#ifdef RT65xx\n\t// TODO: shiang-6590, fix me, currently firmware is not ready yet, so ignore it!\n\tif (IS_RT65XX(pAd)) {\n\t\treturn TRUE;\n\t}\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\treturn TRUE;\n#endif /* MT7601 */\n\n\tif (pAd->chipOps.sendCommandToMcu)\n\t\treturn pAd->chipOps.sendCommandToMcu(pAd, Command, Token, Arg0, Arg1, FlgIsNeedLocked);\n\telse\n\t\treturn FALSE;\n}\n\n/*\n\t========================================================================\n\tDescription:\n\t\tFor 1x1 chipset : 2070 / 3070 / 3090 / 3370 / 3390 / 5370 / 5390 \n\t\tUsage :\t1. Set Default Antenna as initialize\n\t\t\t\t2. Antenna Diversity switching used\n\t\t\t\t3. iwpriv command switch Antenna\n\n    Return:\n\t========================================================================\n */\nVOID AsicSetRxAnt(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tAnt)\n{\n\tif (pAd->chipOps.SetRxAnt)\n\t\tpAd->chipOps.SetRxAnt(pAd, Ant);\n}\n\n\nVOID AsicTurnOffRFClk(\n\tIN PRTMP_ADAPTER pAd, \n\tIN\tUCHAR\t\tChannel) \n{\n\tif (pAd->chipOps.AsicRfTurnOff)\n\t{\n\t\tpAd->chipOps.AsicRfTurnOff(pAd);\n\t}\n\telse\n\t{\n#if defined(RT28xx) || defined(RT2880) || defined(RT2883)\n\t\t/* RF R2 bit 18 = 0*/\n\t\tUINT32\t\t\tR1 = 0, R2 = 0, R3 = 0;\n\t\tUCHAR\t\t\tindex;\n\t\tRTMP_RF_REGS\t*RFRegTable;\n\t\n\t\tRFRegTable = RF2850RegTable;\n#endif /* defined(RT28xx) || defined(RT2880) || defined(RT2883) */\n\n\t\tswitch (pAd->RfIcType)\n\t\t{\n#if defined(RT28xx) || defined(RT2880) || defined(RT2883)\n#if defined(RT28xx) || defined(RT2880)\n\t\t\tcase RFIC_2820:\n\t\t\tcase RFIC_2850:\n\t\t\tcase RFIC_2720:\n\t\t\tcase RFIC_2750:\n#endif /* defined(RT28xx) || defined(RT2880) */\n\t\t\t\tfor (index = 0; index < NUM_OF_2850_CHNL; index++)\n\t\t\t\t{\n\t\t\t\t\tif (Channel == RFRegTable[index].Channel)\n\t\t\t\t\t{\n\t\t\t\t\t\tR1 = RFRegTable[index].R1 & 0xffffdfff;\n\t\t\t\t\t\tR2 = RFRegTable[index].R2 & 0xfffbffff;\n\t\t\t\t\t\tR3 = RFRegTable[index].R3 & 0xfff3ffff;\n\n\t\t\t\t\t\tRTMP_RF_IO_WRITE32(pAd, R1);\n\t\t\t\t\t\tRTMP_RF_IO_WRITE32(pAd, R2);\n\n\t\t\t\t\t\t/* Program R1b13 to 1, R3/b18,19 to 0, R2b18 to 0. */\n\t\t\t\t\t\t/* Set RF R2 bit18=0, R3 bit[18:19]=0*/\n\t\t\t\t\t\t/*if (pAd->StaCfg.bRadio == FALSE)*/\n\t\t\t\t\t\tif (1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMP_RF_IO_WRITE32(pAd, R3);\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AsicTurnOffRFClk#%d(RF=%d, ) , R2=0x%08x,  R3 = 0x%08x \\n\",\n\t\t\t\t\t\t\t\tChannel, pAd->RfIcType, R2, R3));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AsicTurnOffRFClk#%d(RF=%d, ) , R2=0x%08x \\n\",\n\t\t\t\t\t\t\t\tChannel, pAd->RfIcType, R2));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif /* defined(RT28xx) || defined(RT2880) || defined(RT2883) */\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AsicTurnOffRFClk#%d : Unkonwn RFIC=%d\\n\",\n\t\t\t\t\t\t\t\t\t\t\tChannel, pAd->RfIcType));\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n#ifdef WAPI_SUPPORT\nVOID AsicUpdateWAPIPN(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT\t\t WCID,\n\tIN ULONG         pn_low,\n\tIN ULONG         pn_high)\n{\n\tif (IS_HW_WAPI_SUPPORT(pAd))\n\t{\n\t\tULONG\toffset;\n\n\t\toffset = WAPI_PN_TABLE_BASE + (WCID * WAPI_PN_ENTRY_SIZE);\n\n\t\tRTMP_IO_WRITE32(pAd, offset, pn_low);\n\t\tRTMP_IO_WRITE32(pAd, offset + 4, pn_high);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s : Not support HW_WAPI_PN_TABLE\\n\", \n\t\t\t\t\t\t\t\t__FUNCTION__));\n\t}\n\t\n}\n#endif /* WAPI_SUPPORT */\n\n\n\n#ifdef VCORECAL_SUPPORT\nVOID AsicVCORecalibration(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR RFValue = 0;\n\tUINT32 TxPinCfg = 0;\n\tUINT8 mode = pAd->chipCap.FlgIsVcoReCalMode;\n\n\tif (mode == VCO_CAL_DISABLE)\n\t\treturn;\n\n#ifdef RTMP_INTERNAL_TX_ALC\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\tRTMP_IO_READ32(pAd, TX_PIN_CFG, &TxPinCfg);\n\tTxPinCfg &= 0xFCFFFFF0;\n\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\n\tswitch (mode)\n\t{\n\n#ifdef RLT_RF\n\t\tcase VCO_CAL_MODE_3:\n\n\t\t\trlt_rf_write(pAd, RF_BANK0, RF_R04, 0x0A);\n\t\t\trlt_rf_write(pAd, RF_BANK0, RF_R05, 0x20);\n\t\t\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RFValue);\n\t\t\tRFValue = RFValue | 0x80; /* bit 7=vcocal_en*/\n\t\t\trlt_rf_write(pAd, RF_BANK0, RF_R04, RFValue);\n\t\t\tbreak;\n#endif /* RLT_RF */\n\n\t\tdefault:\n\t\t\treturn;\n\t}\n\n\tRtmpOsMsDelay(1);\n\n\tRTMP_IO_READ32(pAd, TX_PIN_CFG, &TxPinCfg);\n\tif (pAd->CommonCfg.Channel <= 14)\n\t{\n\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t\tTxPinCfg |= 0x2;\n\t\telse if (pAd->Antenna.field.TxPath == 2)\n\t\t\tTxPinCfg |= 0xA;\n\t\telse if (pAd->Antenna.field.TxPath == 3)\n\t\t\tTxPinCfg |= 0x0200000A;\n\t}\n\telse\n\t{\n\t\tif (pAd->Antenna.field.TxPath == 1)\n\t\t\tTxPinCfg |= 0x1;\n\t\telse if (pAd->Antenna.field.TxPath == 2)\n\t\t\tTxPinCfg |= 0x5;\n\t\telse if (pAd->Antenna.field.TxPath == 3)\n\t\t\tTxPinCfg |= 0x01000005;\n\t}\n\tRTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);\n\n#ifdef TXBF_SUPPORT\n\t\t// Do a Divider Calibration and update BBP registers\n\t\tif (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_DISABLE_CAL)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t{\n\t\t\tITxBFDividerCalibration(pAd, 2, 0, NULL);\n\t\t}\n\n\t\tif (pAd->CommonCfg.ETxBfEnCond)\n\t\t{\n\t\t\tINT idx;\n\t\t\t\n\t\t\tfor (idx = 1; idx < MAX_LEN_OF_MAC_TABLE; idx++)\n\t\t\t{\n\t\t\t\tMAC_TABLE_ENTRY\t\t*pEntry;\n\n\t\t\t\tpEntry = &pAd->MacTab.Content[idx];\n\t\t\t\tif ((IS_ENTRY_CLIENT(pEntry)) && (pEntry->eTxBfEnCond))\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN Cancelled;\n\n\t\t\t\t\tRTMPCancelTimer(&pEntry->eTxBfProbeTimer, &Cancelled);\n\n\t\t\t\t\tpEntry->bfState = READY_FOR_SNDG0;\n\t\t\t\t\teTxBFProbing(pAd, pEntry);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif // TXBF_SUPPORT //\n}\n#endif /* VCORECAL_SUPPORT */\n\n\n#ifdef STREAM_MODE_SUPPORT\n// StreamModeRegVal - return MAC reg value for StreamMode setting\nUINT32 StreamModeRegVal(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tUINT32 streamWord;\n\n\tswitch (pAd->CommonCfg.StreamMode)\n\t{\n\t\tcase 1:\n\t\t\tstreamWord = 0x030000;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tstreamWord = 0x0c0000;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tstreamWord = 0x0f0000;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstreamWord = 0x0;\n\t\t\tbreak;\n\t}\n\n\treturn streamWord;\n}\n\n\n/*\n\t========================================================================\n\tDescription:\n\t\tconfigure the stream mode of specific MAC or all MAC and set to ASIC. \n\n\tPrameters:\n\t\tpAd\t\t --- \n\t\tpMacAddr ---\n\t\tbClear\t --- disable the stream mode for specific macAddr when\n\t\t\t\t\t\t(pMacAddr!=NULL)\n\t\n    Return:\n\t========================================================================\n*/\nVOID AsicSetStreamMode(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PUCHAR pMacAddr,\n\tIN INT chainIdx,\n\tIN BOOLEAN bEnabled)\n{\n\tUINT32 streamWord;\n\tUINT32 regAddr, regVal;\n\n\t\n\tif (!pAd->chipCap.FlgHwStreamMode)\n\t\treturn;\n\t\t\n\tstreamWord = StreamModeRegVal(pAd);\n\tif (!bEnabled)\n\t\tstreamWord = 0;\n\n\tregAddr = TX_CHAIN_ADDR0_L + chainIdx * 4;\n\tRTMP_IO_WRITE32(pAd, regAddr,  \n\t\t\t\t\t(UINT32)(pMacAddr[0]) | \n\t\t\t\t\t(UINT32)(pMacAddr[1] << 8)  | \n\t\t\t\t\t(UINT32)(pMacAddr[2] << 16) | \n\t\t\t\t\t(UINT32)(pMacAddr[3] << 24));\n\t\n\tRTMP_IO_READ32(pAd, regAddr + 4, &regVal);\n\tregVal &= (~0x000f0000);\n\tRTMP_IO_WRITE32(pAd, regAddr + 4, \n\t\t\t\t\t(regVal | streamWord) | \n\t\t\t\t\t(UINT32)(pMacAddr[4]) | \n\t\t\t\t\t(UINT32)(pMacAddr[5] << 8));\n\t\n}\n\n\nVOID RtmpStreamModeInit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tint chainIdx;\n\tUCHAR *pMacAddr;\n\n\tif (pAd->chipCap.FlgHwStreamMode == FALSE)\n\t\treturn;\t\n\t\n\tfor (chainIdx = 0; chainIdx < STREAM_MODE_STA_NUM; chainIdx++)\n\t{\n\t\tpMacAddr = &pAd->CommonCfg.StreamModeMac[chainIdx][0];\n\t\tAsicSetStreamMode(pAd, pMacAddr, chainIdx, TRUE);\n\t}\n}\n#endif // STREAM_MODE_SUPPORT //\n\n\n#ifdef DOT11_N_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicEnableRalinkBurstMode(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tUINT32\t\t\t\tData = 0;\n\n\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\tpAd->CommonCfg.RestoreBurstMode = Data;\n\tData  &= 0xFFF00000;\n\tData  |= 0x86380;\n\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID AsicDisableRalinkBurstMode(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tUINT32\t\t\t\tData = 0;\n\n\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\n\tData = pAd->CommonCfg.RestoreBurstMode;\n\tData &= 0xFFFFFF00;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE) \n#ifdef DOT11_N_SUPPORT\n\t\t&& (pAd->MacTab.fAnyStationMIMOPSDynamic == FALSE)\n#endif // DOT11_N_SUPPORT //\n\t)\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE))\n\t\t\tData |= 0x80;\n\t\telse if (pAd->CommonCfg.bEnableTxBurst)\n\t\t\tData |= 0x20;\n\t}\n\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n}\n#endif // DOT11_N_SUPPORT //\n\n\n#ifdef WOW_SUPPORT\n#ifdef RTMP_MAC_USB\n\n/* switch firmware\n   a) before into WOW mode, switch firmware to WOW-enable firmware\n   b) exit from WOW mode, switch firmware to normal firmware\n*/\nVOID AsicLoadWOWFirmware(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN WOW)\n{\n\tif (WOW) \n\t\tpAd->WOW_Cfg.bWOWFirmware = TRUE;\n\telse\n\t\tpAd->WOW_Cfg.bWOWFirmware = FALSE;\n\t\t\n\tRtmpAsicLoadFirmware(pAd);\n}\n\n/* In WOW mode, 8051 mcu will send null frame, and pick data from 0x7780 \n * the null frame includes TxWI and 802.11 header \t\t\t\t\t\t*/\nVOID AsicWOWSendNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR TxRate,\n\tIN BOOLEAN bQosNull)\n{\n\t\n\tTXWI_STRUC *TxWI;\n\tPUCHAR NullFrame;\n\tUINT8  packet_len;\n\tPUCHAR ptr;\n\tUSHORT offset;\n\tUINT32 cipher = pAd->StaCfg.GroupCipher;\n\tUINT32 Value;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\t\n\n\tComposeNullFrame(pAd);\t\n\tTxWI = (TXWI_STRUC *)&pAd->NullContext[0].TransferBuffer->field.WirelessPacket[TXINFO_SIZE];\n\tNullFrame = (PUCHAR)&pAd->NullFrame;\n\tpacket_len = TxWI->TxWIMPDUByteCnt;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxWI:\\n\"));\n\t/* copy TxWI to MCU memory */\n\tptr = (PUCHAR)TxWI;\n\tfor (offset = 0; offset < TXWISize; offset += 4)  \n\t{\n\t\tRTMPMoveMemory(&Value, ptr+offset, 4);\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"offset: %02d %08x\\n\", offset, Value));\n\t\tRTMP_IO_WRITE32(pAd, HW_NULL2_BASE + offset, Value);\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"802.11 header:\\n\"));\n\t/* copy 802.11 header to memory */\n\tptr = (PUCHAR)NullFrame;\n\tfor (offset = 0; offset < packet_len; offset += 4)\n\t{\n\t\tRTMPMoveMemory(&Value, ptr+offset, 4);\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"offset: %02d %08x\\n\", offset, Value));\n\t\tRTMP_IO_WRITE32(pAd, HW_NULL2_BASE + TXWISize + offset, Value);\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Write GroupCipher Mode: %d\\n\", pAd->StaCfg.GroupCipher));\n\n\tRTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE, &Value);\n\t\n\tswitch (cipher) /* don't care WEP, because it dosen't have re-key issue */\n\t{\n\t\tcase Ndis802_11Encryption2Enabled: /* TKIP */\n\t\t\tValue |= 0x0330;\n\t\t\tRTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE, Value);\n\t\t\tbreak;\n\t\tcase Ndis802_11Encryption3Enabled: /* AES */\n\t\t\tValue |= 0x0440;\n\t\t\tRTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE, Value);\n\t\t\tbreak;\n\t}\n}\n\n#endif /* RTMP_MAC_USB */\n#endif /* WOW_SUPPORT */\n\n\nINT AsicSetPreTbttInt(RTMP_ADAPTER *pAd, BOOLEAN enable)\n{\n\tUINT32 val;\n\t\n\tRTMP_IO_READ32(pAd, INT_TIMER_CFG, &val);\n\tval &= 0xffff0000;\n\tval |= 6 << 4; /* Pre-TBTT is 6ms before TBTT interrupt. 1~10 ms is reasonable. */\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_CFG, val);\n\t/* Enable pre-tbtt interrupt */\n\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &val);\n\tval |=0x1;\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, val);\n\n\treturn TRUE;\n}\n\n\nBOOLEAN AsicWaitPDMAIdle(struct _RTMP_ADAPTER *pAd, INT round, INT wait_us)\n{\n\tINT i = 0;\n\tWPDMA_GLO_CFG_STRUC GloCfg;\n\n\n\tdo {\n\t\tRTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);\n\t\tif ((GloCfg.field.TxDMABusy == 0)  && (GloCfg.field.RxDMABusy == 0)) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>  DMAIdle, GloCfg=0x%x\\n\", GloCfg.word));\n\t\t\treturn TRUE;\n\t\t}\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn FALSE;\n\t\tRTMPusecDelay(wait_us);\n\t}while ((i++) < round);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==>  DMABusy, GloCfg=0x%x\\n\", GloCfg.word));\n\t\n\treturn FALSE;\n}\n\n\n#ifdef DOT11_N_SUPPORT\n#if defined(RT65xx) || defined(MT7601)\n#define MAX_AGG_CNT\t32\n#elif defined(RT2883) || defined(RT3883)\n#define MAX_AGG_CNT\t16\n#else\n#define MAX_AGG_CNT\t8\n#endif\nINT AsicReadAggCnt(RTMP_ADAPTER *pAd, ULONG *aggCnt, int cnt_len)\n{\n\tUINT32 reg_addr;\n\tTX_AGG_CNT_STRUC reg_val;\n\tint i, cnt, seg;\n\tstatic USHORT aggReg[] = {\n\t\t\t\t\t\tTX_AGG_CNT, TX_AGG_CNT3,\n#if MAX_AGG_CNT > 8\n\t\t\t\t\t\tTX_AGG_CNT4, TX_AGG_CNT7,\n#endif\n#if MAX_AGG_CNT > 16\n\t\t\t\t\t\tTX_AGG_CNT8, TX_AGG_CNT15, \n#endif\n\t};\n\n\n\tNdisZeroMemory(aggCnt, cnt_len * sizeof(ULONG));\n\tseg = (sizeof(aggReg) /sizeof(USHORT));\n\n\tcnt = 0;\n\tfor (i = 0; i < seg; i += 2)\n\t{\n\t\tfor (reg_addr = aggReg[i] ; reg_addr <= aggReg[i+1] ; reg_addr += 4)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, reg_addr, &reg_val.word);\n\t\t\tif (cnt < (cnt_len -1)) {\n\t\t\t\taggCnt[cnt] = reg_val.field.NonAggTxCount;\n\t\t\t\taggCnt[cnt+1] = reg_val.field.AggTxCount;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():Get AggSize at Reg(0x%x) with val(0x%08x) [AGG_%d=>%ld, AGG_%d=>%ld]\\n\",\n\t\t\t\t\t\t__FUNCTION__, reg_addr, reg_val.word, cnt, aggCnt[cnt], cnt+1, aggCnt[cnt+1]));\n\t\t\t\tcnt += 2;\n\t\t\t} else {\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():Get AggSize at Reg(0x%x) failed, no enough buffer(cnt_len=%d, cnt=%d)\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, reg_addr, cnt_len, cnt));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n#endif /* DOT11_N_SUPPORT */\n\n\nINT AsicSetChannel(RTMP_ADAPTER *pAd, UCHAR ch, UCHAR bw, UCHAR ext_ch, BOOLEAN bScan)\n{\n\trtmp_bbp_set_bw(pAd, bw);\n\n\t/*  Tx/RX : control channel setting */\n\trtmp_bbp_set_ctrlch(pAd, ext_ch);\n\trtmp_mac_set_ctrlch(pAd, ext_ch);\n\n\t/* Let BBP register at 20MHz to do scan */\n\tAsicSwitchChannel(pAd, ch, bScan);\n\tAsicLockChannel(pAd, ch);\n\n#ifdef RT28xx\n\tRT28xx_ch_tunning(pAd, bw);\n#endif /* RT28xx */\n\n\treturn 0;\n}\n\n\n#ifdef NEW_WOW_SUPPORT\nVOID RT28xxAndesWOWEnable(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNEW_WOW_MASK_CFG_STRUCT mask_cfg;\n\tNEW_WOW_SEC_CFG_STRUCT sec_cfg;\n\tNEW_WOW_INFRA_CFG_STRUCT infra_cfg;\n\tNEW_WOW_P2P_CFG_STRUCT p2p_cfg;\n\tNEW_WOW_PARAM_STRUCT wow_param;\n\tstruct CMD_UNIT CmdUnit;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\n\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\n\t/* WOW enable */\n\tNdisZeroMemory(&wow_param, sizeof(wow_param));\n\n\twow_param.Parameter = WOW_ENABLE; /* WOW enable */\n\twow_param.Value = TRUE;\n\n\tCmdUnit.u.ANDES.Type = CMD_WOW_FEATURE; /* feature enable */\n\tCmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_PARAM_STRUCT);\n\tCmdUnit.u.ANDES.CmdPayload = (PUCHAR)&wow_param;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tif (Ret != NDIS_STATUS_SUCCESS)\n\t{\n\t\tprintk(\"\\x1b[31m%s: send WOW config command failed(%d/%d)!!\\x1b[m\\n\", __FUNCTION__,\n\t\t\t\t\tCmdUnit.u.ANDES.Type, wow_param.Parameter);\n\t\treturn;\n\t}\n\n\tRtmpOsMsDelay(1);\n\t/* mask configuration */\n\tNdisZeroMemory(&mask_cfg, sizeof(mask_cfg));\n\n\tmask_cfg.Config_Type = WOW_MASK_CFG; \t/* detect mask config */\n\tmask_cfg.Function_Enable = TRUE;\n\tmask_cfg.Detect_Mask = 1UL << WOW_MAGIC_PKT;\t/* magic packet */\n\tmask_cfg.Event_Mask = 0;\n\t\n\tCmdUnit.u.ANDES.Type = CMD_WOW_CONFIG; /* WOW config */\n\tCmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_MASK_CFG_STRUCT);\n\tCmdUnit.u.ANDES.CmdPayload = (PUCHAR)&mask_cfg;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tif (Ret != NDIS_STATUS_SUCCESS)\n\t{\n\t\tprintk(\"\\x1b[31m%s: send WOW config command failed!!(%d/%d)\\x1b[m\\n\", __FUNCTION__,\n\t\t\t\t\tCmdUnit.u.ANDES.Type, mask_cfg.Config_Type);\n\t\treturn;\n\t}\n\n\tRtmpOsMsDelay(1);\n\n\t/* security configuration */\n\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPAPSK)\n\t{\n\t\tNdisZeroMemory(&sec_cfg, sizeof(sec_cfg));\n\t\n\t\tsec_cfg.Config_Type = WOW_SEC_CFG; \t/* security config */\n\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)\n\t\t\tsec_cfg.WPA_Ver = 0;\n\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\tsec_cfg.WPA_Ver = 1;\n\t\t\n\t\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\n\t\tNdisCopyMemory(sec_cfg.PTK, pEntry->PTK, 64);\n\t\tNdisCopyMemory(sec_cfg.R_COUNTER, pEntry->R_Counter, LEN_KEY_DESC_REPLAY);\n\t\t\n\t\tsec_cfg.Key_Id = pAd->StaCfg.DefaultKeyId;\n\t\tsec_cfg.Cipher_Alg = pEntry->WepStatus;\n\t\tprintk(\"\\x1b[31m%s: wep status %d\\x1b[m\\n\", __FUNCTION__, pEntry->WepStatus);\n\t\tsec_cfg.Group_Cipher = pAd->StaCfg.GroupCipher;\n\t\tprintk(\"\\x1b[31m%s: group status %d\\x1b[m\\n\", __FUNCTION__, sec_cfg.Group_Cipher);\n\t\tprintk(\"\\x1b[31m%s: aid %d\\x1b[m\\n\", __FUNCTION__, pEntry->Aid);\n\t\tsec_cfg.WCID = BSSID_WCID;\n\t\t\n\t\tCmdUnit.u.ANDES.Type = CMD_WOW_CONFIG; /* WOW config */\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_SEC_CFG_STRUCT);\n\t\tCmdUnit.u.ANDES.CmdPayload = (PUCHAR)&sec_cfg;\n\t\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tprintk(\"\\x1b[31m%s: send WOW config command failed(%d/%d)!!\\x1b[m\\n\", __FUNCTION__,\n\t\t\t\t\tCmdUnit.u.ANDES.Type, sec_cfg.Config_Type);\n\t\t\treturn;\n\t\t}\n\t\n\t\tRtmpOsMsDelay(1);\n\t}\n\n\t/* Infra configuration */\n\n\tNdisZeroMemory(&infra_cfg, sizeof(infra_cfg));\n\n\tinfra_cfg.Config_Type = WOW_INFRA_CFG; \t/* infra config */\n\n\tCOPY_MAC_ADDR(infra_cfg.STA_MAC, pAd->CurrentAddress);\n\tCOPY_MAC_ADDR(infra_cfg.AP_MAC, pAd->CommonCfg.Bssid);\n\n\tCmdUnit.u.ANDES.Type = CMD_WOW_CONFIG; /* WOW config */\n\tCmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_INFRA_CFG_STRUCT);\n\tCmdUnit.u.ANDES.CmdPayload = (PUCHAR)&infra_cfg;\n\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\tinfra_cfg.AP_Status = TRUE;\n\telse\n\t\tinfra_cfg.AP_Status = FALSE;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tif (Ret != NDIS_STATUS_SUCCESS)\n\t{\n\t\tprintk(\"\\x1b[31m%s: send WOW config command failed(%d/%d)!!\\x1b[m\\n\", __FUNCTION__,\n\t\t\t\t\tCmdUnit.u.ANDES.Type, infra_cfg.Config_Type);\n\t\treturn;\n\t}\n\n\tRtmpOsMsDelay(1);\n\t\n\n\t/* P2P configuration */\n\n\t/* Wakeup Option */\n\tNdisZeroMemory(&wow_param, sizeof(wow_param));\n\n\twow_param.Parameter = WOW_WAKEUP; /* Wakeup Option */\n\tif (pAd->WOW_Cfg.bInBand)\n\t{\n\t\twow_param.Value = WOW_WAKEUP_BY_USB;\n\t}\n\telse\n\t{\n\t\tINT32 Value;\n\t\t\n\t\twow_param.Value = WOW_WAKEUP_BY_GPIO;\n\n\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &Value);\n\t\tprintk(\"\\x1b[31m%s: 0x80 = %x\\x1b[m\\n\", __FUNCTION__, Value);\n\t\tValue &= ~0x01010000; /* GPIO0(ouput) --> 0(data) */ \n\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, Value);\n\t}\n\n\tCmdUnit.u.ANDES.Type = CMD_WOW_FEATURE; /* feature enable */\n\tCmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_PARAM_STRUCT);\n\tCmdUnit.u.ANDES.CmdPayload = (PUCHAR)&wow_param;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tif (Ret != NDIS_STATUS_SUCCESS)\n\t{\n\t\tprintk(\"\\x1b[31m%s: send WOW config command failed(%d/%d)!!\\x1b[m\\n\", __FUNCTION__,\n\t\t\t\t\tCmdUnit.u.ANDES.Type, wow_param.Parameter);\n\t\treturn;\n\t}\n\n\tRtmpOsMsDelay(1);\n\n\n\t/* traffic to Andes */\n\tNdisZeroMemory(&wow_param, sizeof(wow_param));\n\twow_param.Parameter = WOW_TRAFFIC; /* Traffic switch */\n\twow_param.Value = WOW_PKT_TO_ANDES;\t/* incoming packet to FW */\n\n\tCmdUnit.u.ANDES.Type = CMD_WOW_FEATURE; /* feature enable */\n\tCmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_PARAM_STRUCT);\n\tCmdUnit.u.ANDES.CmdPayload = (PUCHAR)&wow_param.Parameter;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tif (Ret != NDIS_STATUS_SUCCESS)\n\t{\n\t\tprintk(\"\\x1b[31m%s: send WOW config command failed(%d/%d)!!\\x1b[m\\n\", __FUNCTION__,\n\t\t\t\t\tCmdUnit.u.ANDES.Type, wow_param.Parameter);\n\t\treturn;\n\t}\n\t\n\tRtmpOsMsDelay(1);\n\n    RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n}\n\nVOID RT28xxAndesWOWDisable(\n    IN PRTMP_ADAPTER pAd)\n{\n    NEW_WOW_PARAM_STRUCT param;\n    struct CMD_UNIT CmdUnit;\n    RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n    INT32 Ret;\n    UINT32 Value;\n    MAC_TABLE_ENTRY *pEntry = NULL;\n\n    printk(\"\\x1b[31m%s: ...\\x1b[m\", __FUNCTION__);\n\n    /* clean BulkIn Reset flag */\n    //pAd->Flags &= ~0x80000;\n    RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\n    NdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\n    /* WOW disable */\n    NdisZeroMemory(&param, sizeof(param));\n    param.Parameter = WOW_ENABLE;\n    param.Value = FALSE;\n\n    CmdUnit.u.ANDES.Type = CMD_WOW_FEATURE; /* WOW enable */\n    CmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_PARAM_STRUCT);\n    CmdUnit.u.ANDES.CmdPayload = (PUCHAR)&param;\n\n    Ret = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n    if (Ret != NDIS_STATUS_SUCCESS)\n    {\n        printk(\"\\x1b[31m%s: send WOW config command failed!!\\x1b[m\\n\", __FUNCTION__);\n        return;\n    }\n\n    RtmpOsMsDelay(1);\n\n\n    /* traffic to Host */\n    NdisZeroMemory(&param, sizeof(param));\n    param.Parameter = WOW_TRAFFIC;\n    param.Value = WOW_PKT_TO_HOST;\n\n    CmdUnit.u.ANDES.Type = CMD_WOW_FEATURE;\n    CmdUnit.u.ANDES.CmdPayloadLen = sizeof(NEW_WOW_PARAM_STRUCT);\n    CmdUnit.u.ANDES.CmdPayload = (PUCHAR)&param;\n\n    Ret = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n    if (Ret != NDIS_STATUS_SUCCESS)\n    {\n        printk(\"\\x1b[31m%s: send WOW config command failed!!\\x1b[m\\n\", __FUNCTION__);\n        return;\n    }\n\n    RtmpOsMsDelay(1);\n\n\n    /* Restore MAC TX/RX */\n    RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);\n    Value |= 0xC;\n    RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);\n\n\n    RTUSBBulkReceive(pAd);\n    RTUSBBulkCmdRspEventReceive(pAd);\n\n    //printk(\"\\x1b[31m%s: pendingRx %d\\x1b[m\\n\", __FUNCTION__, pAd->PendingRx);\n    //printk(\"\\x1b[31m%s: BulkInReq %d\\x1b[m\\n\", __FUNCTION__, pAd->BulkInReq);\n\n    /* restore hardware remote wakeup flag */\n    RTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &Value);\n    printk(\"\\x1b[31m%s: 0x80 %08x\\x1b[m\\n\", __FUNCTION__, Value);\n    Value &= ~0x80;\n    RTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, Value);\n\n\tif (pAd->WOW_Cfg.bInBand == FALSE)\n\t{\n\t\tINT32 Value;\n\t\t\n\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &Value);\n\t\tprintk(\"\\x1b[31m%s: 0x80 = %x\\x1b[m\\n\", __FUNCTION__, Value);\n\t\tValue &= ~0x01010000; /* GPIO0(ouput) --> 0(data) */ \n\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, Value);\n\t}\n}\n\n#endif /* NEW_WOW_SUPPORT */\n"
  },
  {
    "path": "src/common/cmm_cfg.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tcmm_cfg.c\n\n    Abstract:\n    Ralink WiFi Driver configuration related subroutines\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n*/\n\n\n\n#include \"rt_config.h\"\n#ifdef DOT11_N_SUPPORT\n#if defined(RT65xx) || defined(MT7601)\n#define MAX_AGG_CNT\t32\n#elif defined(RT2883) || defined(RT3883)\n#define MAX_AGG_CNT\t16\n#else\n#define MAX_AGG_CNT\t8\n#endif\n/* DisplayTxAgg - display Aggregation statistics from MAC */\nvoid DisplayTxAgg (RTMP_ADAPTER *pAd)\n{\n\tULONG totalCount;\n\tULONG aggCnt[MAX_AGG_CNT + 2];\n\tint i;\n\n\tAsicReadAggCnt(pAd, aggCnt, sizeof(aggCnt) / sizeof(ULONG));\n\ttotalCount = aggCnt[0] + aggCnt[1];\n\tif (totalCount > 0)\n\t\tfor (i=0; i<MAX_AGG_CNT; i++) {\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\t%d MPDU=%ld (%ld%%)\\n\", i+1, aggCnt[i+2], aggCnt[i+2]*100/totalCount));\n\t\t}\n\tprintk(\"====================\\n\");\n\n}\n#endif /* DOT11_N_SUPPORT */\n\nstatic BOOLEAN RT_isLegalCmdBeforeInfUp(\n       IN PSTRING SetCmd);\n\n\nINT ComputeChecksum(\n\tIN UINT PIN)\n{\n\tINT digit_s;\n    UINT accum = 0;\n\n\tPIN *= 10;\n\taccum += 3 * ((PIN / 10000000) % 10); \n\taccum += 1 * ((PIN / 1000000) % 10); \n\taccum += 3 * ((PIN / 100000) % 10); \n\taccum += 1 * ((PIN / 10000) % 10); \n\taccum += 3 * ((PIN / 1000) % 10); \n\taccum += 1 * ((PIN / 100) % 10); \n\taccum += 3 * ((PIN / 10) % 10); \n\n\tdigit_s = (accum % 10);\n\treturn ((10 - digit_s) % 10);\n} /* ComputeChecksum*/\n\nUINT GenerateWpsPinCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n    IN  BOOLEAN         bFromApcli,\t\n\tIN\tUCHAR\t\t\tapidx)\n{\n\tUCHAR\tmacAddr[MAC_ADDR_LEN];\n\tUINT \tiPin;\n\tUINT\tchecksum;\n\n\tNdisZeroMemory(macAddr, MAC_ADDR_LEN);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t    if (bFromApcli)\n\t        NdisMoveMemory(&macAddr[0], pAd->ApCfg.ApCliTab[apidx].CurrentAddress, MAC_ADDR_LEN);\n\t    else\n#endif /* APCLI_SUPPORT */\n\t\tNdisMoveMemory(&macAddr[0], pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tNdisMoveMemory(&macAddr[0], pAd->CurrentAddress, MAC_ADDR_LEN);\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\tNdisMoveMemory(&macAddr[0], pAd->P2PCurrentAddress, MAC_ADDR_LEN);\n\n\tif (bFromApcli)\n\t{\n\t\tAPCLI_MR_APIDX_SANITY_CHECK(apidx);\n\t\tNdisMoveMemory(&macAddr[0], pAd->ApCfg.ApCliTab[apidx].CurrentAddress, MAC_ADDR_LEN);\n\t}\n#endif /* P2P_SUPPORT */\n\tiPin = macAddr[3] * 256 * 256 + macAddr[4] * 256 + macAddr[5];\n\n\tiPin = iPin % 10000000;\n\n\t\n\tchecksum = ComputeChecksum( iPin );\n\tiPin = iPin*10 + checksum;\n\n\treturn iPin;\n}\n\n\nstatic char *phy_mode_str[]={\"CCK\", \"OFDM\", \"HTMIX\", \"GF\", \"VHT\"};\nchar* get_phymode_str(int Mode)\n{\n\tif (Mode >= MODE_CCK && Mode <= MODE_VHT)\n\t\treturn phy_mode_str[Mode];\n\telse\n\t\treturn \"N/A\";\n}\n\n\nstatic UCHAR *phy_bw_str[] = {\"20M\", \"40M\", \"80M\", \"10M\"};\nchar* get_bw_str(int bandwidth)\n{\n\tif (bandwidth >= BW_20 && bandwidth <= BW_10)\n\t\treturn phy_bw_str[bandwidth];\n\telse\n\t\treturn \"N/A\";\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Country Region to pAd->CommonCfg.CountryRegion.\n        This command will not work, if the field of CountryRegion in eeprom is programmed.\n        \n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT RT_CfgSetCountryRegion(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN PSTRING\t\t\targ,\n\tIN INT\t\t\t\tband)\n{\n\tLONG region;\n\tUCHAR *pCountryRegion;\n\t\n\tregion = simple_strtol(arg, 0, 10);\n\n\tif (band == BAND_24G)\n\t\tpCountryRegion = &pAd->CommonCfg.CountryRegion;\n\telse\n\t\tpCountryRegion = &pAd->CommonCfg.CountryRegionForABand;\n\t\n    /*\n               1. If this value is set before interface up, do not reject this value.\n               2. Country can be set only when EEPROM not programmed\n    */\n    if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE) && (*pCountryRegion & EEPROM_IS_PROGRAMMED))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CfgSetCountryRegion():CountryRegion in eeprom was programmed\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tif((region >= 0) && \n\t   (((band == BAND_24G) &&((region <= REGION_MAXIMUM_BG_BAND) || \n\t   (region == REGION_31_BG_BAND) || (region == REGION_32_BG_BAND) || (region == REGION_33_BG_BAND) )) || \n\t    ((band == BAND_5G) && (region <= REGION_MAXIMUM_A_BAND) ))\n\t  )\n\t{\n\t\t*pCountryRegion= (UCHAR) region;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CfgSetCountryRegion():region(%ld) out of range!\\n\", region));\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n\t\n}\n\n\nstatic UCHAR CFG_WMODE_MAP[]={\n\tPHY_11BG_MIXED, (WMODE_B | WMODE_G), /* 0 => B/G mixed */\n\tPHY_11B, (WMODE_B), /* 1 => B only */\n\tPHY_11A, (WMODE_A), /* 2 => A only */\n\tPHY_11ABG_MIXED, (WMODE_A | WMODE_B | WMODE_G), /* 3 => A/B/G mixed */\n\tPHY_11G, WMODE_G, /* 4 => G only */\n\tPHY_11ABGN_MIXED, (WMODE_B | WMODE_G | WMODE_GN | WMODE_A | WMODE_AN), /* 5 => A/B/G/GN/AN mixed */\n\tPHY_11N_2_4G, (WMODE_GN), /* 6 => N in 2.4G band only */\n\tPHY_11GN_MIXED, (WMODE_G | WMODE_GN), /* 7 => G/GN, i.e., no CCK mode */\n\tPHY_11AN_MIXED, (WMODE_A | WMODE_AN), /* 8 => A/N in 5 band */\n\tPHY_11BGN_MIXED, (WMODE_B | WMODE_G | WMODE_GN), /* 9 => B/G/GN mode*/\n\tPHY_11AGN_MIXED, (WMODE_G | WMODE_GN | WMODE_A | WMODE_AN), /* 10 => A/AN/G/GN mode, not support B mode */\n\tPHY_11N_5G, (WMODE_AN), /* 11 => only N in 5G band */\n#ifdef DOT11_VHT_AC\n\tPHY_11VHT_N_ABG_MIXED, (WMODE_B | WMODE_G | WMODE_GN |WMODE_A | WMODE_AN | WMODE_AC), /* 12 => B/G/GN/A/AN/AC mixed*/\n\tPHY_11VHT_N_AG_MIXED, (WMODE_G | WMODE_GN |WMODE_A | WMODE_AN | WMODE_AC), /* 13 => G/GN/A/AN/AC mixed , no B mode */\n\tPHY_11VHT_N_A_MIXED, (WMODE_A | WMODE_AN | WMODE_AC), /* 14 => A/AC/AN mixed */\n\tPHY_11VHT_N_MIXED, (WMODE_AN | WMODE_AC), /* 15 => AC/AN mixed, but no A mode */\n#endif /* DOT11_VHT_AC */\n\tPHY_MODE_MAX, WMODE_INVALID /* default phy mode if not match */\n};\n\n\nstatic PSTRING BAND_STR[] = {\"Invalid\", \"2.4G\", \"5G\", \"2.4G/5G\"};\nstatic PSTRING WMODE_STR[]= {\"\", \"A\", \"B\", \"G\", \"gN\", \"aN\", \"AC\"};\n\nUCHAR *wmode_2_str(UCHAR wmode)\n{\n\tUCHAR *str;\n\tINT idx, pos, max_len;\n\n\tmax_len = WMODE_COMP * 3;\n\tif (os_alloc_mem(NULL, &str, max_len) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tNdisZeroMemory(str, max_len);\n\t\tpos = 0;\n\t\tfor (idx = 0; idx < WMODE_COMP; idx++)\n\t\t{\n\t\t\tif (wmode & (1 << idx)) {\n\t\t\t\tif ((strlen(str) +  strlen(WMODE_STR[idx + 1])) >= (max_len - 1))\n\t\t\t\t\tbreak;\n\t\t\t\tif (strlen(str)) {\n\t\t\t\t\tNdisMoveMemory(&str[pos], \"/\", 1);\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(&str[pos], WMODE_STR[idx + 1], strlen(WMODE_STR[idx + 1]));\n\t\t\t\tpos += strlen(WMODE_STR[idx + 1]);\n\t\t\t}\n\t\t\tif (strlen(str) >= max_len)\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn str;\n\t}\n\telse\n\t\treturn NULL;\n}\n\n\nUCHAR cfgmode_2_wmode(UCHAR cfg_mode)\n{\n\tDBGPRINT(RT_DEBUG_OFF, (\"cfg_mode=%d\\n\", cfg_mode));\n\tif (cfg_mode >= PHY_MODE_MAX)\n\t\tcfg_mode =  PHY_MODE_MAX;\n\t\n\treturn CFG_WMODE_MAP[cfg_mode * 2 + 1];\n}\n\n\nUCHAR wmode_2_cfgmode(UCHAR wmode)\n{\n\tINT index;\n\tDBGPRINT(RT_DEBUG_OFF, (\"wmode=%d\\n\", wmode));\n\n\tfor (index = 0; index < PHY_MODE_MAX; index++ )\n\t{\n\t\tif ( wmode == CFG_WMODE_MAP[index*2 + 1])\n\t\t\treturn CFG_WMODE_MAP[index*2];\n\t}\n\n\treturn PHY_11ABGN_MIXED;\n}\n\n\nstatic BOOLEAN wmode_valid(RTMP_ADAPTER *pAd, enum WIFI_MODE wmode)\n{\n\tif ((WMODE_CAP_5G(wmode) && (!PHY_CAP_5G(pAd->chipCap.phy_caps))) ||\n\t\t(WMODE_CAP_2G(wmode) && (!PHY_CAP_2G(pAd->chipCap.phy_caps))) ||\n\t\t(WMODE_CAP_N(wmode) && RTMP_TEST_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N))\n\t)\n\t\treturn FALSE;\n\telse\n\t\treturn TRUE;\n}\n\n\nstatic BOOLEAN wmode_valid_and_correct(RTMP_ADAPTER *pAd, UCHAR* wmode)\n{\n\tBOOLEAN ret = TRUE;\n\tUCHAR mode = *wmode;\n\n\tif (WMODE_CAP_5G(*wmode) && (!PHY_CAP_5G(pAd->chipCap.phy_caps)))\n\t{\n\t\t*wmode = *wmode & ~(WMODE_A | WMODE_AN | WMODE_AC);\n\t}\n\telse if (WMODE_CAP_2G(*wmode) && (!PHY_CAP_2G(pAd->chipCap.phy_caps)))\n\t{\n\t\t*wmode = *wmode & ~(WMODE_B | WMODE_G | WMODE_GN);\n\t}\n\telse if (WMODE_CAP_N(*wmode) && RTMP_TEST_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N))\n\t{\n\t\t*wmode = *wmode & ~(WMODE_GN | WMODE_AN);\n\t}\n\n\tif ( *wmode == 0 )\n\t\tret = FALSE;\n\n\treturn ret;\n}\n\n\nBOOLEAN wmode_band_equal(UCHAR smode, UCHAR tmode)\n{\n\tBOOLEAN eq = FALSE;\n\tUCHAR *str1, *str2;\n\t\n\tif ((WMODE_CAP_5G(smode) == WMODE_CAP_5G(tmode)) &&\n\t\t(WMODE_CAP_2G(smode) == WMODE_CAP_2G(tmode)))\n\t\teq = TRUE; \n\n\tstr1 = wmode_2_str(smode);\n\tstr2 = wmode_2_str(tmode);\n\tif (str1 && str2)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"Old WirelessMode:%s(0x%x), \"\n\t\t\t \"New WirelessMode:%s(0x%x)!\\n\",\n\t\t\tstr1, smode, str2, tmode));\n\t}\n\tif (str1)\n\t\tos_free_mem(NULL, str1);\n\tif (str2)\n\t\tos_free_mem(NULL, str2);\n\t\t\n\treturn eq;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Wireless Mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT RT_CfgSetWirelessMode(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tLONG cfg_mode;\n\tUCHAR wmode, *mode_str;\n\n\n\tcfg_mode = simple_strtol(arg, 0, 10);\n\n\t/* check if chip support 5G band when WirelessMode is 5G band */\n\twmode = cfgmode_2_wmode((UCHAR)cfg_mode);\n\tif ((wmode == WMODE_INVALID) || (!wmode_valid_and_correct(pAd, &wmode))) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t(\"%s(): Invalid wireless mode(%ld), ChipCap(%s)\\n\",\n\t\t\t\t__FUNCTION__, cfg_mode,\n\t\t\t\tBAND_STR[pAd->chipCap.phy_caps & 0x3]));\n\t\treturn FALSE;\n\t}\n\n\tif (wmode_band_equal(pAd->CommonCfg.PhyMode, wmode) == TRUE)\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"wmode_band_equal(): Band Equal!\\n\"));\n\telse\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"wmode_band_equal(): Band Not Equal!\\n\"));\n\t\n\tpAd->CommonCfg.PhyMode = wmode;\n\tpAd->CommonCfg.cfg_wmode = wmode;\n\n\tmode_str = wmode_2_str(wmode);\n\tif (mode_str)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Set WMODE=%s(0x%x)\\n\",\n\t\t\t\t__FUNCTION__, mode_str, wmode));\n\t\tos_free_mem(NULL, mode_str);\n\t}\n\n\treturn TRUE;\n}\n\n\n/* maybe can be moved to GPL code, ap_mbss.c, but the code will be open */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\nstatic UCHAR RT_CfgMbssWirelessModeMaxGet(RTMP_ADAPTER *pAd)\n{\n\tUCHAR wmode = 0, *mode_str;\n\tINT idx;\n\tMULTISSID_STRUCT *wdev;\n\n\tfor(idx = 0; idx < pAd->ApCfg.BssidNum; idx++) {\n\t\twdev = &pAd->ApCfg.MBSSID[idx];\n\t\tmode_str = wmode_2_str(wdev->PhyMode);\n\t\tif (mode_str)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(BSS%d): wmode=%s(0x%x)\\n\",\n\t\t\t\t\t__FUNCTION__, idx, mode_str, wdev->PhyMode));\n\t\t\tos_free_mem(pAd, mode_str);\n\t\t}\n\t\twmode |= wdev->PhyMode;\n\t}\n\n\tmode_str = wmode_2_str(wmode);\n\tif (mode_str)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Combined WirelessMode = %s(0x%x)\\n\", \n\t\t\t\t\t__FUNCTION__, mode_str, wmode));\n\t\tos_free_mem(pAd, mode_str);\n\t}\n\treturn wmode;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Wireless Mode for MBSS\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT RT_CfgSetMbssWirelessMode(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tLONG cfg_mode;\n\tUCHAR wmode;\n\n\n\tcfg_mode = simple_strtol(arg, 0, 10);\n\n\twmode = cfgmode_2_wmode((UCHAR)cfg_mode);\n\tif ((wmode == WMODE_INVALID) || (!wmode_valid(pAd, wmode))) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t(\"%s(): Invalid wireless mode(%d, wmode=0x%x), ChipCap(%s)\\n\",\n\t\t\t\t__FUNCTION__, cfg_mode, wmode,\n\t\t\t\tBAND_STR[pAd->chipCap.phy_caps & 0x3]));\n\t\treturn FALSE;\n\t}\n\t\n\tif (WMODE_CAP_5G(wmode) && WMODE_CAP_2G(wmode))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AP cannot support 2.4G/5G band mxied mode!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tif (pAd->ApCfg.BssidNum > 1)\n\t{\n\t\t/* pAd->CommonCfg.PhyMode = maximum capability of all MBSS */\n\t\tif (wmode_band_equal(pAd->CommonCfg.PhyMode, wmode) == TRUE)\n\t\t{\n\t\t\twmode = RT_CfgMbssWirelessModeMaxGet(pAd);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"mbss> Maximum phy mode = %d!\\n\", wmode));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUINT32 IdBss;\n\n\t\t\t/* replace all phy mode with the one with different band */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"mbss> Different band with the current one!\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"mbss> Reset band of all BSS to the new one!\\n\"));\n\n\t\t\tfor(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)\n\t\t\t\tpAd->ApCfg.MBSSID[IdBss].PhyMode = wmode;\n\t\t}\n\t}\n\n\tpAd->CommonCfg.PhyMode = wmode;\n\tpAd->CommonCfg.cfg_wmode = wmode;\n\treturn TRUE;\n}\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\nstatic BOOLEAN RT_isLegalCmdBeforeInfUp(\n       IN PSTRING SetCmd)\n{\n\t\tBOOLEAN TestFlag;\n\t\tTestFlag =\t!strcmp(SetCmd, \"Debug\") ||\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\t\t\t\t\t!strcmp(SetCmd, \"OpMode\") ||\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t\t\t\t!strcmp(SetCmd, \"CountryCode\") ||\n\t\t\t\t\t!strcmp(SetCmd, \"DfsType\") ||\n\t\t\t\t\t!strcmp(SetCmd, \"ChannelListAdd\") ||\n\t\t\t\t\t!strcmp(SetCmd, \"ChannelListShow\") ||\n\t\t\t\t\t!strcmp(SetCmd, \"ChannelListDel\") ||\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#ifdef SINGLE_SKU\n\t\t\t\t\t!strcmp(SetCmd, \"ModuleTxpower\") ||\n#endif /* SINGLE_SKU */\n\t\t\t\t\tFALSE; /* default */\n       return TestFlag;\n}\n\n\nINT RT_CfgSetShortSlot(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tLONG ShortSlot;\n\n\tShortSlot = simple_strtol(arg, 0, 10);\n\n\tif (ShortSlot == 1)\n\t\tpAd->CommonCfg.bUseShortSlotTime = TRUE;\n\telse if (ShortSlot == 0)\n\t\tpAd->CommonCfg.bUseShortSlotTime = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY base on KeyIdx\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tRT_CfgSetWepKey(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tkeyString,\n\tIN\tCIPHER_KEY\t\t*pSharedKey,\n\tIN\tINT\t\t\t\tkeyIdx)\n{\n\tINT\t\t\t\tKeyLen;\n\tINT\t\t\t\ti;\n\t/*UCHAR\t\t\tCipherAlg = CIPHER_NONE;*/\n\tBOOLEAN\t\t\tbKeyIsHex = FALSE;\n\n\t/* TODO: Shall we do memset for the original key info??*/\n\tmemset(pSharedKey, 0, sizeof(CIPHER_KEY));\n\tKeyLen = strlen(keyString);\n\tswitch (KeyLen)\n\t{\n\t\tcase 5: /*wep 40 Ascii type*/\n\t\tcase 13: /*wep 104 Ascii type*/\n\t\t\tbKeyIsHex = FALSE;\n\t\t\tpSharedKey->KeyLen = KeyLen;\n\t\t\tNdisMoveMemory(pSharedKey->Key, keyString, KeyLen);\n\t\t\tbreak;\n\t\t\t\n\t\tcase 10: /*wep 40 Hex type*/\n\t\tcase 26: /*wep 104 Hex type*/\n\t\t\tfor(i=0; i < KeyLen; i++)\n\t\t\t{\n\t\t\t\tif( !isxdigit(*(keyString+i)) )\n\t\t\t\t\treturn FALSE;  /*Not Hex value;*/\n\t\t\t}\n\t\t\tbKeyIsHex = TRUE;\n\t\t\tpSharedKey->KeyLen = KeyLen/2 ;\n\t\t\tAtoH(keyString, pSharedKey->Key, pSharedKey->KeyLen);\n\t\t\tbreak;\n\t\t\t\n\t\tdefault: /*Invalid argument */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_CfgSetWepKey(keyIdx=%d):Invalid argument (arg=%s)\\n\", keyIdx, keyString));\n\t\t\treturn FALSE;\n\t}\n\n\tpSharedKey->CipherAlg = ((KeyLen % 5) ? CIPHER_WEP128 : CIPHER_WEP64);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_CfgSetWepKey:(KeyIdx=%d,type=%s, Alg=%s)\\n\", \n\t\t\t\t\t\tkeyIdx, (bKeyIsHex == FALSE ? \"Ascii\" : \"Hex\"), CipherName[pSharedKey->CipherAlg]));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key\n\n    Arguments:\n        pAdapter\tPointer to our adapter\n        keyString\tWPA pre-shared key string\n        pHashStr\tString used for password hash function\n        hashStrLen\tLenght of the hash string\n        pPMKBuf\t\tOutput buffer of WPAPSK key\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT RT_CfgSetWPAPSKKey(\n\tIN RTMP_ADAPTER\t*pAd, \n\tIN PSTRING\t\tkeyString,\n\tIN INT\t\t\tkeyStringLen,\n\tIN UCHAR\t\t*pHashStr,\n\tIN INT\t\t\thashStrLen,\n\tOUT PUCHAR\t\tpPMKBuf)\n{\n\tUCHAR keyMaterial[40];\n\n\tif ((keyStringLen < 8) || (keyStringLen > 64))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\\n\", \n\t\t\t\t\t\t\t\t\tkeyStringLen, keyString));\n\t\treturn FALSE;\n\t}\n\n\tNdisZeroMemory(pPMKBuf, 32);\n\tif (keyStringLen == 64)\n\t{\n\t    AtoH(keyString, pPMKBuf, 32);\n\t}\n\telse\n\t{\n\t    RtmpPasswordHash(keyString, pHashStr, hashStrLen, keyMaterial);\n\t    NdisMoveMemory(pPMKBuf, keyMaterial, 32);\t\t\n\t}\n\n\treturn TRUE;\n}\n\nINT\tRT_CfgSetFixedTxPhyMode(PSTRING arg)\n{\n\tINT fix_tx_mode = FIXED_TXMODE_HT;\n\tULONG value;\n\n\n\tif (rtstrcasecmp(arg, \"OFDM\") == TRUE)\n\t\tfix_tx_mode = FIXED_TXMODE_OFDM;\n\telse if (rtstrcasecmp(arg, \"CCK\") == TRUE)\n\t    fix_tx_mode = FIXED_TXMODE_CCK;\n\telse if (rtstrcasecmp(arg, \"HT\") == TRUE)\n\t    fix_tx_mode = FIXED_TXMODE_HT;\n\telse if (rtstrcasecmp(arg, \"VHT\") == TRUE)\n\t\tfix_tx_mode = FIXED_TXMODE_VHT;\n\telse\n\t{\n\t\tvalue = simple_strtol(arg, 0, 10);\n\t\tswitch (value)\n\t\t{\n\t\t\tcase FIXED_TXMODE_CCK:\n\t\t\tcase FIXED_TXMODE_OFDM:\n\t\t\tcase FIXED_TXMODE_HT:\n\t\t\tcase FIXED_TXMODE_VHT:\n\t\t\t\tfix_tx_mode = value;\n\t\t\tdefault:\n\t\t\t\tfix_tx_mode = FIXED_TXMODE_HT;\n\t\t}\n\t}\n\n\treturn fix_tx_mode;\n\t\t\t\t\t\n}\t\n\nINT\tRT_CfgSetMacAddress(\n\tIN \tPRTMP_ADAPTER \tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tINT\ti, mac_len;\n\t\n\t/* Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\tmac_len = strlen(arg);\n\tif(mac_len != 17)  \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : invalid length (%d)\\n\", __FUNCTION__, mac_len));\n\t\treturn FALSE;\n\t}\n\n\tif(strcmp(arg, \"00:00:00:00:00:00\") == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : invalid mac setting \\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tfor (i = 0; i < MAC_ADDR_LEN; i++)\n\t{\n\t\tAtoH(arg, &pAd->CurrentAddress[i], 1);\n\t\targ = arg + 3;\n\t}\t\n\n\tpAd->bLocalAdminMAC = TRUE;\n\treturn TRUE;\n}\n\nINT\tRT_CfgSetTxMCSProc(PSTRING arg, BOOLEAN *pAutoRate)\n{\n\tINT\tValue = simple_strtol(arg, 0, 10);\n\tINT\tTxMcs;\n\t\n\tif ((Value >= 0 && Value <= 23) || (Value == 32)) /* 3*3*/\n\t{\n\t\tTxMcs = Value;\n\t\t*pAutoRate = FALSE;\n\t}\n\telse\n\t{\t\t\n\t\tTxMcs = MCS_AUTO;\n\t\t*pAutoRate = TRUE;\n\t}\n\n\treturn TxMcs;\n\n}\n\nINT\tRT_CfgSetAutoFallBack(\n\tIN \tPRTMP_ADAPTER \tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tTX_RTY_CFG_STRUC tx_rty_cfg;\n\tUCHAR AutoFallBack = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\ttx_rty_cfg.field.TxautoFBEnable = (AutoFallBack) ? 1 : 0;\n\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_CfgSetAutoFallBack::(tx_rty_cfg=0x%x)\\n\", tx_rty_cfg.word));\n\treturn TRUE;\n}\n\n#ifdef WSC_INCLUDED\nINT\tRT_CfgSetWscPinCode(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\tpPinCodeStr,\n\tOUT PWSC_CTRL   pWscControl)\n{\n\tUINT pinCode;\n\n\tpinCode = (UINT) simple_strtol(pPinCodeStr, 0, 10); /* When PinCode is 03571361, return value is 3571361.*/\n\tif (strlen(pPinCodeStr) == 4)\n\t{\n\t\tpWscControl->WscEnrolleePinCode = pinCode;\n\t\tpWscControl->WscEnrolleePinCodeLen = 4;\n\t}\n\telse if ( ValidateChecksum(pinCode) )\n\t{\n\t\tpWscControl->WscEnrolleePinCode = pinCode;\n\t\tpWscControl->WscEnrolleePinCodeLen = 8;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RT_CfgSetWscPinCode(): invalid Wsc PinCode (%d)\\n\", pinCode));\n\t\treturn FALSE;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_CfgSetWscPinCode():Wsc PinCode=%d\\n\", pinCode));\n\t\n\treturn TRUE;\n\t\n}\n#endif /* WSC_INCLUDED */\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWNAME.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT RtmpIoctl_rt_ioctl_giwname(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n#ifdef P2P_SUPPORT\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* P2P_SUPPORT */\n\tUCHAR CurOpMode = OPMODE_AP;\n\n\tif (CurOpMode == OPMODE_AP)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (pObj->ioctl_if_type == INT_P2P)\n\t\t{\n\t\t\tif (P2P_CLI_ON(pAd))\n\t\t\t\tstrcpy(pData, \"Ralink P2P Cli\");\n\t\t\telse if (P2P_GO_ON(pAd))\n\t\t\t\tstrcpy(pData, \"Ralink P2P GO\");\n\t\t\telse\n\t\t\t\tstrcpy(pData, \"Ralink P2P\");\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\tstrcpy(pData, \"RTWIFI SoftAP\");\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT RTMP_COM_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPOS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;\n\tINT Status = NDIS_STATUS_SUCCESS, i;\n\tUCHAR PermanentAddress[MAC_ADDR_LEN];\n\tUSHORT Addr01, Addr23, Addr45;\n\n\n\tpObj = pObj; /* avoid compile warning */\n\n\tswitch(cmd)\n\t{\n\t\tcase CMD_RTPRIV_IOCTL_NETDEV_GET:\n\t\t/* get main net_dev */\n\t\t{\n\t\t\tVOID **ppNetDev = (VOID **)pData;\n\t\t\t*ppNetDev = (VOID *)(pAd->net_dev);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_NETDEV_SET:\n\t\t/* set main net_dev */\n\t\t\tpAd->net_dev = pData;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = pData;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_OPMODE_GET:\n\t\t/* get Operation Mode */\n\t\t\t*(ULONG *)pData = pAd->OpMode;\n\t\t\tbreak;\n\n\n\t\tcase CMD_RTPRIV_IOCTL_TASK_LIST_GET:\n\t\t/* get all Tasks */\n\t\t{\n\t\t\tRT_CMD_WAIT_QUEUE_LIST *pList = (RT_CMD_WAIT_QUEUE_LIST *)pData;\n\n\t\t\tpList->pMlmeTask = &pAd->mlmeTask;\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\t\t\tpList->pTimerTask = &pAd->timerTask;\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\t\t\tpList->pCmdQTask = &pAd->cmdQTask;\n#ifdef WSC_INCLUDED\n\t\t\tpList->pWscTask = &pAd->wscTask;\n#endif /* WSC_INCLUDED */\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_IRQ_INIT:\n\t\t/* init IRQ */\n\t\t\tRTMP_IRQ_INIT(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_IRQ_RELEASE:\n\t\t/* release IRQ */\n\t\t\tRTMP_OS_IRQ_RELEASE(pAd, pAd->net_dev);\n\t\t\tbreak;\n\n\n\t\tcase CMD_RTPRIV_IOCTL_NIC_NOT_EXIST:\n\t\t/* set driver state to fRTMP_ADAPTER_NIC_NOT_EXIST */\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR:\n\t\t\tRTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP);\n\t\t\tbreak;\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_MAX_IN_BIT:\n\t\t\t/* set MAX_IN_BIT for WMM */\n\t\t\tCW_MAX_IN_BITS = Data;\n\t\t\tbreak;\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n//#ifdef CONFIG_PM\n//#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n                case CMD_RTPRIV_IOCTL_USB_DEV_GET:\n                /* get USB DEV */\n                {\n                        VOID **ppUsb_Dev = (VOID **)pData;\n                        *ppUsb_Dev = (VOID *)(pObj->pUsb_Dev);\n                }\n                        break;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_SEND_DISSASSOCIATE:\n\t\t/* clear driver state to fRTMP_ADAPTER_SUSPEND */\n\t\t\tif (INFRA_ON(pAd) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t\t{\n\t\t\t\tMLME_DISASSOC_REQ_STRUCT\tDisReq;\n\t\t\t\tMLME_QUEUE_ELEM *MsgElem;/* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&MsgElem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\tif (MsgElem)\n\t\t\t\t{\n\t\t\t\t\tCOPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid);\n\t\t\t\t\tDisReq.Reason =  REASON_DEAUTH_STA_LEAVING;\n\t\t\t\t\tMsgElem->Machine = ASSOC_STATE_MACHINE;\n\t\t\t\t\tMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;\n\t\t\t\t\tMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);\n\t\t\t\t\tNdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));\n\t\t\t\t\t/* Prevent to connect AP again in STAMlmePeriodicExec*/\n\t\t\t\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\t\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\n\t\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;\n\t\t\t\t\tMlmeDisassocReqAction(pAd, MsgElem);/*\t\t\t\tkfree(MsgElem);*/\n\t\t\t\t\tos_free_mem(NULL, MsgElem);\n\t\t\t\t}\n\t\t\t\t/*\t\t\t\tRTMPusecDelay(1000);*/\n\t\t\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CGIWAP, -1, NULL, NULL, 0);\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_TEST:\n\t\t/* test driver state to fRTMP_ADAPTER_SUSPEND */\n\t\t\t*(UCHAR *)pData = RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_SUSPEND);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_IDLE_RADIO_OFF_TEST:\n\t\t/* test driver state to fRTMP_ADAPTER_IDLE_RADIO_OFF */\n\t\t\t*(UCHAR *)pData = RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\t\t\tbreak;\n\n\n//#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_STATUS:\n\t\t\t*(UCHAR *)pData = (UCHAR)pAd->WOW_Cfg.bEnable;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_ENABLE:\n\t\t\tASIC_WOW_ENABLE(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_DISABLE:\n\t\t\tASIC_WOW_DISABLE(pAd);\n\t\t\tbreak;\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n//#endif /* CONFIG_PM */\t\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_BSSID_GET:\n\t\t\tif (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)\n\t\t\t\tNdisCopyMemory(pData, pAd->MlmeAux.Bssid, 6);\n\t\t\telse\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET:\n\t\t/* set driver state to fRTMP_ADAPTER_SUSPEND */\n\t\t\tRTMP_SET_FLAG(pAd,fRTMP_ADAPTER_SUSPEND);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR:\n\t\t/* clear driver state to fRTMP_ADAPTER_SUSPEND */\n\t\t\tRTMP_CLEAR_FLAG(pAd,fRTMP_ADAPTER_SUSPEND);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF:\n\t\t/* RT28xxUsbAsicRadioOff */\n\t\t\t//RT28xxUsbAsicRadioOff(pAd);\n\t\t\tASIC_RADIO_OFF(pAd, SUSPEND_RADIO_OFF);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON:\n\t\t/* RT28xxUsbAsicRadioOn */\n\t\t\t//RT28xxUsbAsicRadioOn(pAd);\n\t\t\tASIC_RADIO_ON(pAd, RESUME_RADIO_ON);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SANITY_CHECK:\n\t\t/* sanity check before IOCTL */\n\t\t\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n#ifdef IFUP_IN_PROBE\n\t\t\t|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))\n\t\t\t|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\t\t|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n#endif /* IFUP_IN_PROBE */\n\t\t\t)\n\t\t\t{\n\t\t\t\tif(pData == NULL ||\tRT_isLegalCmdBeforeInfUp((PSTRING) pData) == FALSE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SIOCGIWFREQ:\n\t\t/* get channel number */\n\t\t\t*(ULONG *)pData = pAd->CommonCfg.Channel;\n\t\t\tbreak;\n\n\n#ifdef P2P_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_P2P_INIT:\n\t\t\tP2pInit(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_P2P_REMOVE:\n\t\t\tP2P_Remove(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_P2P_OPEN_PRE:\n\t\t\tif (P2P_OpenPre(pData) != 0)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_P2P_OPEN_POST:\n\t\t\tif (P2P_OpenPost(pData) != 0)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_P2P_CLOSE:\n\t\t\tP2P_Close(pData);\n\t\t\tbreak;\n#endif /* P2P_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_BEACON_UPDATE:\n\t\t/* update all beacon contents */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tAPMakeAllBssBeacon(pAd);\n\t\t\tAPUpdateAllBeaconFrame(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_RXPATH_GET:\n\t\t/* get the number of rx path */\n\t\t\t*(ULONG *)pData = pAd->Antenna.field.RxPath;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET:\n\t\t\t*(ULONG *)pData = pAd->ChannelListNum;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_CHAN_LIST_GET:\n\t\t{\n\t\t\tUINT32 i;\n\t\t\tUCHAR *pChannel = (UCHAR *)pData;\n\n\t\t\tfor (i = 1; i <= pAd->ChannelListNum; i++)\n\t\t\t{\n\t\t\t\t*pChannel = pAd->ChannelList[i-1].Channel;\n\t\t\t\tpChannel ++;\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_FREQ_LIST_GET:\n\t\t{\n\t\t\tUINT32 i;\n\t\t\tUINT32 *pFreq = (UINT32 *)pData;\n\t\t\tUINT32 m;\n\n\t\t\tfor (i = 1; i <= pAd->ChannelListNum; i++)\n\t\t\t{\n\t\t\t\tm = 2412000;\n\t\t\t\tMAP_CHANNEL_ID_TO_KHZ(pAd->ChannelList[i-1].Channel, m);\n\t\t\t\t(*pFreq) = m;\n\t\t\t\tpFreq ++;\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n       case CMD_RTPRIV_SET_PRECONFIG_VALUE:\n       /* Set some preconfigured value before interface up*/\n           pAd->CommonCfg.DfsType = MAX_RD_REGION;\n           break;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\n#ifdef RTMP_USB_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_USB_MORE_FLAG_SET:\n\t\t{\n\t\t\tRT_CMD_USB_MORE_FLAG_CONFIG *pConfig;\n\t\t\tUINT32 VendorID, ProductID;\n\n\n\t\t\tpConfig = (RT_CMD_USB_MORE_FLAG_CONFIG *)pData;\n\t\t\tVendorID = pConfig->VendorID;\n\t\t\tProductID = pConfig->ProductID;\n\n\t\t\tif (VendorID == 0x0DB0)\n\t\t\t{\n\t\t\t\tif ((ProductID == 0x871C) || (ProductID == 0x822C))\n\t\t\t\t{\n\t\t\t\t\tRTMP_SET_MORE_FLAG(pAd, (fRTMP_ADAPTER_DISABLE_DOT_11N | fRTMP_ADAPTER_WSC_PBC_PIN0));\n\t\t\t\t}\n\t\t\t\tif ((ProductID == 0x871A) || (ProductID == 0x822A))\n\t\t\t\t{\n\t\t\t\t\tRTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N);\n\t\t\t\t}\n\t\t\t\tif ((ProductID == 0x871B) || (ProductID == 0x822B))\n\t\t\t\t{\n\t\t\t\t\tRTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_WSC_PBC_PIN0);\n\t\t\t\t}\n\t\t\t}\n\n\t    \tif (VendorID == 0x07D1)\n\t    \t{\n\t\t\t\tif (ProductID == 0x3C0F)\n\t\t\t\t\tRTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N);\n\t    \t}\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_USB_CONFIG_INIT:\n\t\t{\n\t\t\tRT_CMD_USB_DEV_CONFIG *pConfig;\n\t\t\tUINT32 i;\n\t\t\tpConfig = (RT_CMD_USB_DEV_CONFIG *)pData;\n\t\t\tpAd->NumberOfPipes = pConfig->NumberOfPipes;\n\t\t\tpAd->BulkInMaxPacketSize = pConfig->BulkInMaxPacketSize;\n\t\t\tpAd->BulkOutMaxPacketSize = pConfig->BulkOutMaxPacketSize;\n\n\t\t\tfor (i = 0; i < 6; i++) \n\t\t\t\tpAd->BulkOutEpAddr[i] = pConfig->BulkOutEpAddr[i];\n\n\t\t\tfor (i = 0; i < 6; i++) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s():pAd->BulkOutEpAddr=0x%x\\n\", __FUNCTION__, pAd->BulkOutEpAddr[i]));\n\t\t\t}\n\n\t\t\t\n\t\t\tfor (i = 0; i < 2; i++)\n\t\t\t\tpAd->BulkInEpAddr[i] = pConfig->BulkInEpAddr[i];\n\n\t\t\tpAd->config = pConfig->pConfig;\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_USB_SUSPEND:\n\t\t\tpAd->PM_FlgSuspend = 1;\n\t\t\tif (Data)\n\t\t\t{\n\t\t\t\tRTUSBCancelPendingBulkInIRP(pAd);\n\t\t\t\tRTUSBCancelPendingBulkOutIRP(pAd);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_USB_RESUME:\n\t\t\tpAd->PM_FlgSuspend = 0;\n\t\t\tbreak;\n#endif /* RTMP_USB_SUPPORT */\n\n\n#ifdef RT_CFG80211_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_CFG80211_CFG_START:\n\t\t\tRT_CFG80211_REINIT(pAd);\n\t\t\tRT_CFG80211_CRDA_REG_RULE_APPLY(pAd);\n\t\t\tbreak;\n#endif /* RT_CFG80211_SUPPORT */\n\n#ifdef INF_PPA_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_INF_PPA_INIT:\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB));\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_PPA_EXIT:\n\t\t\tif (ppa_hook_directpath_register_dev_fn && pAd->PPAEnable==TRUE) \n\t\t\t{\n\t\t\t\tUINT status;\n\t\t\t\tstatus=ppa_hook_directpath_register_dev_fn(&pAd->g_if_id, pAd->net_dev, NULL, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"unregister PPA:g_if_id=%d status=%d\\n\",pAd->g_if_id,status));\n\t\t\t}\n\t\t\tos_free_mem(NULL, pAd->pDirectpathCb);\n\t\t\tbreak;\n#endif /* INF_PPA_SUPPORT*/\n\n\t\tcase CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP:\n\t\t/* interface up */\n\t\t{\n\t\t\tRT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData;\n\n\t\t\tif (VIRTUAL_IF_NUM(pAd) == 0)\n\t\t\t{\n\t\t\t\tif (pInfConf->rt28xx_open(pAd->net_dev) != 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"rt28xx_open return fail!\\n\"));\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\textern VOID APMakeAllBssBeacon(IN PRTMP_ADAPTER pAd);\n\t\t\t\textern VOID  APUpdateAllBeaconFrame(IN PRTMP_ADAPTER pAd);\n\t\t\t\tAPMakeAllBssBeacon(pAd);\n\t\t\t\tAPUpdateAllBeaconFrame(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t}\n\t\t\tVIRTUAL_IF_INC(pAd);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN:\n\t\t/* interface down */\n\t\t{\n\t\t\tRT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData;\n\n\t\t\tVIRTUAL_IF_DEC(pAd);\n\t\t\tif (VIRTUAL_IF_NUM(pAd) == 0)\n\t\t\t\tpInfConf->rt28xx_close(pAd->net_dev);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET:\n\t\t/* get virtual interface number */\n\t\t\t*(ULONG *)pData = VIRTUAL_IF_NUM(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_TYPE_GET:\n\t\t/* get current interface type */\n\t\t\t*(ULONG *)pData = pAd->infType;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_STATS_GET:\n\t\t\t/* get statistics */\n\t\t\t{\t\t\t\n\t\t\t\tRT_CMD_STATS *pStats = (RT_CMD_STATS *)pData;\n\t\t\t\tpStats->pStats = pAd->stats;\n\t\t\t\tif(pAd->OpMode == OPMODE_STA)\n\t\t\t\t{\n\t\t\t\t\tpStats->rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;\n\t\t\t\t\tpStats->tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;\n\t\t\t\t\tpStats->rx_bytes = pAd->RalinkCounters.ReceivedByteCount;\n\t\t\t\t\tpStats->tx_bytes = pAd->RalinkCounters.TransmittedByteCount;\n\t\t\t\t\tpStats->rx_errors = pAd->Counters8023.RxErrors;\n\t\t\t\t\tpStats->tx_errors = pAd->Counters8023.TxErrors;\n\t\t\t\t\tpStats->multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;   /* multicast packets received*/\n\t\t\t\t\tpStats->collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions;  /* Collision packets*/\n\t\t\t\t\tpStats->rx_over_errors = pAd->Counters8023.RxNoBuffer;                   /* receiver ring buff overflow*/\n\t\t\t\t\tpStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount;      recved pkt with crc error*/\n\t\t\t\t\tpStats->rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors;          /* recv'd frame alignment error*/\n\t\t\t\t\tpStats->rx_fifo_errors = pAd->Counters8023.RxNoBuffer;                   /* recv'r fifo overrun*/\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\telse if(pAd->OpMode == OPMODE_AP)\n\t\t\t\t{\n\t\t\t\t\tINT index;\n\t\t\t\t\tfor(index = 0; index < MAX_MBSSID_NUM(pAd); index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[index].MSSIDDev == (PNET_DEV)(pStats->pNetDev))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\tif(index >= MAX_MBSSID_NUM(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\t//reset counters\n\t\t\t\t\t\tpStats->rx_packets = 0;\n\t\t\t\t\t\tpStats->tx_packets = 0;\n\t\t\t\t\t\tpStats->rx_bytes = 0;\n\t\t\t\t\t\tpStats->tx_bytes = 0;\n\t\t\t\t\t\tpStats->rx_errors = 0;\n\t\t\t\t\t\tpStats->tx_errors = 0;\n\t\t\t\t\t\tpStats->multicast = 0;   /* multicast packets received*/\n\t\t\t\t\t\tpStats->collisions = 0;  /* Collision packets*/\n\t\t\t\t\t\tpStats->rx_over_errors = 0; /* receiver ring buff overflow*/\n\t\t\t\t\t\tpStats->rx_crc_errors = 0; /* recved pkt with crc error*/\n\t\t\t\t\t\tpStats->rx_frame_errors = 0; /* recv'd frame alignment error*/\n\t\t\t\t\t\tpStats->rx_fifo_errors = 0; /* recv'r fifo overrun*/\n\t\t\t\t\t\t   \n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CMD_RTPRIV_IOCTL_INF_STATS_GET: can not find mbss I/F\\n\"));\n\t\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tpStats->rx_packets = pAd->ApCfg.MBSSID[index].RxCount;\n\t\t\t\t\tpStats->tx_packets = pAd->ApCfg.MBSSID[index].TxCount;\n\t\t\t\t\tpStats->rx_bytes = pAd->ApCfg.MBSSID[index].ReceivedByteCount;\n\t\t\t\t\tpStats->tx_bytes = pAd->ApCfg.MBSSID[index].TransmittedByteCount;\n\t\t\t\t\tpStats->rx_errors = pAd->ApCfg.MBSSID[index].RxErrorCount;\n\t\t\t\t\tpStats->tx_errors = pAd->ApCfg.MBSSID[index].TxErrorCount;\n\t\t\t\t\tpStats->multicast = pAd->ApCfg.MBSSID[index].mcPktsRx; /* multicast packets received */\n\t\t\t\t\tpStats->collisions = 0;  /* Collision packets*/\n\t\t\t\t\tpStats->rx_over_errors = 0;                   /* receiver ring buff overflow*/\n\t\t\t\t\tpStats->rx_crc_errors = 0;/* recved pkt with crc error*/\n\t\t\t\t\tpStats->rx_frame_errors = 0;          /* recv'd frame alignment error*/\n\t\t\t\t\tpStats->rx_fifo_errors = 0;                   /* recv'r fifo overrun*/\n\t\t\t\t}\n#endif\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET:\n\t\t/* get wireless statistics */\n\t\t{\n\t\t\tUCHAR CurOpMode = OPMODE_AP;\n#ifdef CONFIG_AP_SUPPORT \n\t\t\tPMAC_TABLE_ENTRY pMacEntry = NULL;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tRT_CMD_IW_STATS *pStats = (RT_CMD_IW_STATS *)pData;\n\n\t\t\tpStats->qual = 0;\n\t\t\tpStats->level = 0;\n\t\t\tpStats->noise = 0;\n\t\t\tpStats->pStats = pAd->iw_stats;\n\t\t\t\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (pAd->OpMode == OPMODE_STA)\n\t\t\t{\n\t\t\t\tCurOpMode = OPMODE_STA;\n#ifdef P2P_SUPPORT\n\t\t\t\tif (pStats->priv_flags == INT_P2P)\n\t\t\t\t\tCurOpMode = OPMODE_AP;\n#endif /* P2P_SUPPORT */\t\t\t\t\t\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t/*check if the interface is down*/\n\t\t\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t\t\t\treturn NDIS_STATUS_FAILURE;\t\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == OPMODE_AP)\n\t\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\t\tif ((pStats->priv_flags == INT_APCLI)\n#ifdef P2P_SUPPORT\n\t\t\t\t\t|| (P2P_CLI_ON(pAd))\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tINT ApCliIdx = ApCliIfLookUp(pAd, (PUCHAR)pStats->dev_addr);\n\t\t\t\t\tif ((ApCliIdx >= 0) && VALID_WCID(pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID))\n\t\t\t\t\t\tpMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID];\n\t\t\t\t}\n\t\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tonly AP client support wireless stats function.\n\t\t\t\t\t\treturn NULL pointer for all other cases.\n\t\t\t\t\t*/\n\t\t\t\t\tpMacEntry = NULL;\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == OPMODE_STA)\n\t\t\t\tpStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10);\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == OPMODE_AP)\n\t\t\t{\n\t\t\t\tif (pMacEntry != NULL)\n\t\t\t\t\tpStats->qual = ((pMacEntry->ChannelQuality * 12)/10 + 10);\n\t\t\t\telse\n\t\t\t\t\tpStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10);\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\tif (pStats->qual > 100)\n\t\t\t\tpStats->qual = 100;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == OPMODE_STA)\n\t\t\t{\n\t\t\t\tpStats->level =\n\t\t\t\t\tRTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi1,\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi2);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == OPMODE_AP)\n\t\t\t{\n\t\t\t\tif (pMacEntry != NULL)\n\t\t\t\t\tpStats->level =\n\t\t\t\t\t\tRTMPMaxRssi(pAd, pMacEntry->RssiSample.AvgRssi0,\n\t\t\t\t\t\t\t\t\t\tpMacEntry->RssiSample.AvgRssi1,\n\t\t\t\t\t\t\t\t\t\tpMacEntry->RssiSample.AvgRssi2);\n#ifdef P2P_APCLI_SUPPORT\n\t\t\t\telse\n\t\t\t\t\tpStats->level =\n\t\t\t\t\t\tRTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi1,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi2);\n#endif /* P2P_APCLI_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tpStats->noise = RTMPMaxRssi(pAd, pAd->ApCfg.RssiSample.AvgRssi0,\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.RssiSample.AvgRssi1,\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.RssiSample.AvgRssi2) -\n\t\t\t\t\t\t\t\t\t\tRTMPMinSnr(pAd, pAd->ApCfg.RssiSample.AvgSnr0,\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.RssiSample.AvgSnr1);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tpStats->noise = RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi1,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi2) - \n\t\t\t\t\t\t\t\t\t\tRTMPMinSnr(pAd, pAd->StaCfg.RssiSample.AvgSnr0, \n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgSnr1);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_MAIN_CREATE:\n\t\t\t*(VOID **)pData = RtmpPhyNetDevMainCreate(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET:\n\t\t\t*(ULONG *)pData = INT_MAIN;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_MAIN_CHECK:\n\t\t\tif (Data != INT_MAIN)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_INF_P2P_CHECK:\n\t\t\tif (Data != INT_P2P)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\n#ifdef RALINK_ATE\n#ifdef RALINK_QA\n\t\tcase CMD_RTPRIV_IOCTL_ATE:\n\t\t\tRtmpDoAte(pAd, wrq, pData);\n\t\t\tbreak;\n#endif /* RALINK_QA */ \n#endif /* RALINK_ATE */\n\n\t\tcase CMD_RTPRIV_IOCTL_MAC_ADDR_GET:\n\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x04, Addr01);\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x06, Addr23);\n\t\t\tRT28xx_EEPROM_READ16(pAd, 0x08, Addr45);\t\t\t\n\t\t\t\n\t\t\tPermanentAddress[0] = (UCHAR)(Addr01 & 0xff);\t\t\n\t\t\tPermanentAddress[1] = (UCHAR)(Addr01 >> 8);\n\t\t\tPermanentAddress[2] = (UCHAR)(Addr23 & 0xff);\n\t\t\tPermanentAddress[3] = (UCHAR)(Addr23 >> 8);\n\t\t\tPermanentAddress[4] = (UCHAR)(Addr45 & 0xff);\n\t\t\tPermanentAddress[5] = (UCHAR)(Addr45 >> 8);\t\t\t\t\n\t\t\t\n\t\t\tfor(i=0; i<6; i++)\n\t\t\t\t*(UCHAR *)(pData+i) = PermanentAddress[i];\n\t\t\tbreak;\n#ifdef CONFIG_AP_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:\n\t\t/* handle for SIOCGIWRATEQ */\n\t\t{\n\t\t\tRT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData;\n\t\t\tHTTRANSMIT_SETTING HtPhyMode;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (pRate->priv_flags == INT_APCLI)\n\t\t\t\tHtPhyMode = pAd->ApCfg.ApCliTab[pObj->ioctl_if].HTPhyMode;\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tHtPhyMode = pAd->ApCfg.MBSSID[pObj->ioctl_if].HTPhyMode;\n#ifdef MBSS_SUPPORT\n\t\t\t\t/* reset phy mode for MBSS */\n\t\t\t\tMBSS_PHY_MODE_RESET(pObj->ioctl_if, HtPhyMode);\n#endif /* MBSS_SUPPORT */\n\t\t\t}\n\t\t\tRtmpDrvMaxRateGet(pAd, HtPhyMode.field.MODE, HtPhyMode.field.ShortGI,\n\t\t\t\t\t\t\tHtPhyMode.field.BW, HtPhyMode.field.MCS,\n\t\t\t\t\t\t\t(UINT32 *)&pRate->BitRate);\n\t\t}\n\t\t\tbreak;\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_SIOCGIWNAME:\n\t\t\tRtmpIoctl_rt_ioctl_giwname(pAd, pData, 0);\n\t\t\tbreak;\n\n#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT)\n\t\tcase CMD_RTPRIV_IOCTL_ADAPTER_CSO_SUPPORT_TEST:\n\t\t\t*(UCHAR *)pData = (pAd->MoreFlags & fASIC_CAP_CSO) ? 1:0;\n\t\t\tbreak;\n#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT) */\n\n\t}\n\n#ifdef RT_CFG80211_SUPPORT\n\tif ((CMD_RTPRIV_IOCTL_80211_START <= cmd) &&\n\t\t(cmd <= CMD_RTPRIV_IOCTL_80211_END))\n\t{\n\t\tCFG80211DRV_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data);\n\t}\n#endif /* RT_CFG80211_SUPPORT */\n\n\tif (cmd >= CMD_RTPRIV_IOCTL_80211_COM_LATEST_ONE)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\treturn Status;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Issue a site survey command to driver\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set site_survey\n    ==========================================================================\n*/\nINT Set_SiteSurvey_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tNDIS_802_11_SSID Ssid;\n\tPOS_COOKIE pObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\t//check if the interface is down\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\treturn -ENETDOWN;   \n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (MONITOR_ON(pAd))\n    \t{\n        \tDBGPRINT(RT_DEBUG_TRACE, (\"!!! Driver is in Monitor Mode now !!!\\n\"));\n        \treturn -EINVAL;\n    \t}\n\t}\n#endif // CONFIG_STA_SUPPORT //\n\n    NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef AP_SCAN_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (pObj->ioctl_if_type == INT_P2P)\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\tif ((strlen(arg) != 0) && (strlen(arg) <= MAX_LEN_OF_SSID))\n    \t{\n        \tNdisMoveMemory(Ssid.Ssid, arg, strlen(arg));\n        \tSsid.SsidLength = strlen(arg);\n\t\t}\n\n\t\tif (Ssid.SsidLength == 0)\n\t\t\tApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, FALSE);\n\t\telse\n\t\t\tApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE);\n\n\t\treturn TRUE;\n\t}\n#endif /* AP_SCAN_SUPPORT */\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tSsid.SsidLength = 0; \n\t\tif ((arg != NULL) &&\n\t\t\t(strlen(arg) <= MAX_LEN_OF_SSID))\n\t\t{\n\t\t\tRTMPMoveMemory(Ssid.Ssid, arg, strlen(arg));\n\t\t\tSsid.SsidLength = strlen(arg);\n\t\t}\n\n\t\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\t\tStaSiteSurvey(pAd, &Ssid, SCAN_ACTIVE);\n\t}\n#endif // CONFIG_STA_SUPPORT //\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_SiteSurvey_Proc\\n\"));\n\n    return TRUE;\n}\n\nINT\tSet_Antenna_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tANT_DIVERSITY_TYPE UsedAnt;\n\tint i;\n\tDBGPRINT(RT_DEBUG_OFF, (\"==> Set_Antenna_Proc *******************\\n\"));\n\n\tfor (i = 0; i < strlen(arg); i++)\n\t\tif (!isdigit(arg[i]))\n\t\t\treturn -EINVAL;\n\n\tUsedAnt = simple_strtol(arg, 0, 10);\n\n\tswitch (UsedAnt)\n\t{\n\t\t/* 2: Fix in the PHY Antenna CON1*/\n\t\tcase ANT_FIX_ANT0:\n\t\t\tAsicSetRxAnt(pAd, 0);\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"<== Set_Antenna_Proc(Fix in Ant CON1), (%d,%d)\\n\", \n\t\t\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt, pAd->RxAnt.Pair1SecondaryRxAnt));\n\t\t\tbreak;\n    \t/* 3: Fix in the PHY Antenna CON2*/\n\t\tcase ANT_FIX_ANT1:\n\t\t\tAsicSetRxAnt(pAd, 1);\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"<== %s(Fix in Ant CON2), (%d,%d)\\n\", \n\t\t\t\t\t\t\t__FUNCTION__, pAd->RxAnt.Pair1PrimaryRxAnt, pAd->RxAnt.Pair1SecondaryRxAnt));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<== %s(N/A cmd: %d), (%d,%d)\\n\", __FUNCTION__, UsedAnt,\n\t\t\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt, pAd->RxAnt.Pair1SecondaryRxAnt));\n\t\t\tbreak;\n\t}\n\t\n\treturn TRUE;\n}\n\n\n\n#ifdef MICROWAVE_OVEN_SUPPORT\nINT Set_MO_FalseCCATh_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG th;\n\n\tth = simple_strtol(arg, 0, 10);\n\t\n\tif (th > 65535)\n\t\tth = 65535;\n\n\tpAd->CommonCfg.MO_Cfg.nFalseCCATh = th;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s: set falseCCA threshold %lu for microwave oven application!!\\n\", __FUNCTION__, th));\n\n\treturn TRUE;\n}\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_cmd.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n \n \tModule Name:\n\tcmm_cmd.c\n\n\tAbstract:\n\tAll command related API.\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n\tPaul Lin    06-25-2004  created\n*/\n\n#include \"rt_config.h\"\n\n\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tIRQL = \n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTInitializeCmdQ(\n\tIN\tPCmdQ\tcmdq)\n{\n\tcmdq->head = NULL;\n\tcmdq->tail = NULL;\n\tcmdq->size = 0;\n\tcmdq->CmdQState = RTMP_TASK_STAT_INITED;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tIRQL = \n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTThreadDequeueCmd(\n\tIN\tPCmdQ\t\tcmdq,\n\tOUT\tPCmdQElmt\t*pcmdqelmt)\n{\n\t*pcmdqelmt = cmdq->head;\n\t\n\tif (*pcmdqelmt != NULL)\n\t{\n\t\tcmdq->head = cmdq->head->next;\n\t\tcmdq->size--;\n\t\tif (cmdq->size == 0)\n\t\t\tcmdq->tail = NULL;\n\t}\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL = \n\t\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS RTEnqueueInternalCmd(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN NDIS_OID\t\t\tOid,\n\tIN PVOID\t\t\tpInformationBuffer,\n\tIN UINT32\t\t\tInformationBufferLength)\t\n{\n\tNDIS_STATUS\tstatus;\n\tPCmdQElmt\tcmdqelmt = NULL;\n\t\n\n\tstatus = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(CmdQElmt));\n\tif ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))\n\t\treturn (NDIS_STATUS_RESOURCES);\n\tNdisZeroMemory(cmdqelmt, sizeof(CmdQElmt));\n\n\tif(InformationBufferLength > 0)\n\t{\n\t\tstatus = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength);\n\t\tif ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))\n\t\t{\n\t\t\tos_free_mem(pAd, cmdqelmt);\n\t\t\treturn (NDIS_STATUS_RESOURCES);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);\n\t\t\tcmdqelmt->bufferlength = InformationBufferLength;\n\t\t}\n\t}\n\telse\n\t{\n\t\tcmdqelmt->buffer = NULL;\n\t\tcmdqelmt->bufferlength = 0;\n\t}\n\n\tcmdqelmt->command = Oid;\n\tcmdqelmt->CmdFromNdis = FALSE;\n\n\tif (cmdqelmt != NULL)\n\t{\n\t\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\t\tif (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)\n\t\t{\n\t\t\tEnqueueCmd((&pAd->CmdQ), cmdqelmt);\n\t\t\tstatus = NDIS_STATUS_SUCCESS;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\n\t\tif (status == NDIS_STATUS_FAILURE)\n\t\t{\n\t\t\tif (cmdqelmt->buffer)\n\t\t\t\tos_free_mem(pAd, cmdqelmt->buffer);\n\t\t\tos_free_mem(pAd, cmdqelmt);\n\t\t}\n\t\telse\n\t\t\tRTCMDUp(&pAd->cmdQTask);\n\t}\n\treturn(NDIS_STATUS_SUCCESS);\n}\n"
  },
  {
    "path": "src/common/cmm_cs.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    cmm_cs.c\n\n    Abstract:\n    Carrier Sensing related functions\n\n    Revision History:\n    Who       When            What\n    ---------------------------------------------------------------------\n*/\n#include \"rt_config.h\"\n\n#ifdef CARRIER_DETECTION_SUPPORT\nstatic ULONG time[20];\nstatic ULONG idle[20];\nstatic ULONG busy[20];\nstatic ULONG cd_idx=0;\n\nstatic void ToneRadarProgram(PRTMP_ADAPTER pAd);\n\n#ifdef CONFIG_AP_SUPPORT\n/* \n    ==========================================================================\n    Description:\n\tCheck current CS state, indicating Silient state (carrier exist) or not \n\tArguments:\n\t    pAd                    Pointer to our adapter\n\n    Return Value:\n        TRUE if the current state is SILENT state, FALSE other wise\n    Note:\n    ==========================================================================\n*/\nINT isCarrierDetectExist(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)\n\t\treturn TRUE;\n\telse\n\t\treturn FALSE;\n}\t\t\n\n/* \n    ==========================================================================\n    Description:\n        Enable or Disable Carrier Detection feature (AP ioctl).\n\tArguments:\n\t    pAd                    Pointer to our adapter\n\t    arg                     Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set CarrierDetect=[1/0]\n    ==========================================================================\n*/\nINT Set_CarrierDetect_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR apidx = pObj->ioctl_if;\n\tUINT Enable;\n\n\tif (apidx != MAIN_MBSSID)\n\t\treturn FALSE;\n\n\tEnable = (UINT) simple_strtol(arg, 0, 10);\n\n\tpAd->CommonCfg.CarrierDetect.Enable = (BOOLEAN)(Enable == 0 ? FALSE : TRUE);\n\t\n\tRTMP_CHIP_RADAR_GLRT_COMPENSATE(pAd);\n\tRTMP_CHIP_CCK_MRC_STATUS_CTRL(pAd);\t\n\n\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\tCarrierDetectionStart(pAd);\n\telse\n\t\tCarrierDetectionStop(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: %s\\n\", __FUNCTION__,\n\t\tpAd->CommonCfg.CarrierDetect.Enable == TRUE ? \"Enable Carrier Detection\":\"Disable Carrier Detection\"));\n\n\treturn TRUE;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        When h/w interrupt is not available for CS, f/w take care of the operation, this function monitor necessary \n        parameters that determine the CS state periodically. (every 100ms)\n        \n\tArguments:\n\t    pAd                    Pointer to our adapter\n\n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID CarrierDetectionPeriodicStateCtrl(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tCD_STATE *pCD_State = &pAd->CommonCfg.CarrierDetect.CD_State;\n\tULONG *pOneSecIntCount = &pAd->CommonCfg.CarrierDetect.OneSecIntCount;\n\tCARRIER_DETECT_PARAM CarrDetectParam;\n\n\t\t\t\n#ifdef RALINK_ATE\t\t\n\t/* Nothing to do in ATE mode */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\t/* tell firmware to prepare Recheck and RadarToneCount  */\n\tAsicSendCommandToMcu(pAd, CD_CHECKOUT_MCU_CMD, 0xff, 0x00, 0x00, FALSE);\n\t/* Debug */\n\tif (pAd->CommonCfg.CarrierDetect.Debug == RT_DEBUG_TRACE)\n\t{\n\t\tCARRIER_DETECT_DEBUG CarrDetectDebug;\n\t\tRTUSBMultiRead(pAd, 0x4CB0, (PUCHAR) &CarrDetectDebug, sizeof(CarrDetectDebug));\n\t\tprintk(\"delta_div = 0x%02X, rRadarToneCount = %u, Recheck = %u, Criteria = %u, Threshold = 0x%08X, VGA_Mask = 0x%04X\\n\",\n\t\t\t\tCarrDetectDebug.delta_div,\n\t\t\t\tCarrDetectDebug.RadarToneCount,\n\t\t\t\tCarrDetectDebug.ReCheck,\n\t\t\t\tCarrDetectDebug.Criteria << 6, /* ms -> 16us*/\n\t\t\t\tCarrDetectDebug.Threshold,\n\t\t\t\tCarrDetectDebug.VGA_Mask);\n\t}\n\n\tRTUSBMultiRead(pAd, RADAR_TONE_COUNT, (PUCHAR) &CarrDetectParam, sizeof(CarrDetectParam));\n\tswitch(*pCD_State)\n\t{\n\t\tcase CD_NORMAL:\n\t\t\tif (CarrDetectParam.ReCheck == 0)\n\t\t\t{\n\t\t\t\t*pCD_State = CD_SILENCE;\t\t\t\t\n\t\t\t\tif (pAd->CommonCfg.CarrierDetect.Debug != RT_DEBUG_TRACE)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Carrier Detected\\n\"));\n\t\t\t\t\n\t\t\t\t\t/* stop all TX actions including Beacon sending.*/\n\t\t\t\t\tAsicDisableSync(pAd);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\tprintk(\"Carrier Detected\\n\");\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase CD_SILENCE:\n                     *pOneSecIntCount += CarrDetectParam.RadarToneCount;\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\t\t\t \n}\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\n\n/* \n    ==========================================================================\n    Description:\n        When there is no f/w taking care of CS operation, this function depends on h/w interrupts for every possible carrier\n        tone to judge the CS state \n                \n\tArguments:\n\t    pAd                    Pointer to our adapter\n\n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID RTMPHandleRadarInterrupt(PRTMP_ADAPTER  pAd)\n{\n\tUINT32 value, delta;\n\tUCHAR bbp=0;\n\tPCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPHandleRadarInterrupt()\\n\"));\n\tRTMP_IO_READ32(pAd, PBF_LIFE_TIMER, &value);\n\tRTMP_IO_READ32(pAd, CH_IDLE_STA, &pCarrierDetect->idle_time);\n\tRTMP_IO_READ32(pAd, CH_BUSY_STA, &pCarrierDetect->busy_time);\n\tdelta = (value >> 4) - pCarrierDetect->TimeStamp;\n\tpCarrierDetect->TimeStamp = value >> 4;\n\tpCarrierDetect->OneSecIntCount++;\n\n\tif(pAd->chipCap.carrier_func==TONE_RADAR_V2)\n\t{\n\t\tRTMP_CARRIER_IO_READ8(pAd, 1, &bbp);\n\t\tif (!(bbp & 0x1))\n\t\t\treturn;\n\t\telse\n\t\t{\n\t\t\t/* Disable carrier detection and clear the status bit*/\n\t\t\tRTMP_CARRIER_IO_WRITE8(pAd, 0, 0);\n\t\t\tRTMP_CARRIER_IO_WRITE8(pAd, 1, 1);\n\t\t\t/* Clear interrupt */\n\t\t\tRTMP_IO_WRITE32(pAd, INT_SOURCE_CSR ,(1<<20));\n\t\t}\n\t}\n\n\tif (pCarrierDetect->Debug)\n\t{\n\t\tif (cd_idx < 20)\n\t\t{\n\t\t\ttime[cd_idx] = delta;\n\t\t\tidle[cd_idx] = pCarrierDetect->idle_time;\n\t\t\tbusy[cd_idx] = pCarrierDetect->busy_time;\n\t\t\tcd_idx++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint i;\n\t\t\tpCarrierDetect->Debug = 0;\n\t\t\tfor (i = 0; i < 20; i++)\n\t\t\t{\n\t\t\t\tprintk(\"%3d %4ld %ld %ld\\n\", i, time[i], idle[i], busy[i]);\n\t\t\t}\n\t\t\tcd_idx = 0;\n\t\t\t\n\t\t}\n\t}\n\n\tif (pCarrierDetect->CD_State == CD_NORMAL)\n\t{\n\t\tif ((delta < pCarrierDetect->criteria) && (pCarrierDetect->recheck))\n\t\t\tpCarrierDetect->recheck --;\n\t\telse\n\t\t\tpCarrierDetect->recheck = pCarrierDetect->recheck1;\n\t\t\n\t\tif (pCarrierDetect->recheck == 0)\n\t\t{\n\t\t\t/* declare carrier sense*/\n\t\t\tpCarrierDetect->CD_State = CD_SILENCE;\n\n\t\t\tif (pCarrierDetect->Debug != RT_DEBUG_TRACE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Carrier Detected\\n\"));\n\t\t\t\t\n\t\t\t\t/* stop all TX actions including Beacon sending.*/\n\t\t\t\tAsicDisableSync(pAd);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprintk(\"Carrier Detected\\n\");\n\t\t\t}\n\t\t}\n\t}\n\n\tif(pAd->chipCap.carrier_func == TONE_RADAR_V2)\n\t{\n\t\t/* Clear Status bit */\n\t\t//RTMP_CARRIER_IO_WRITE8(pAd, 1, bbp);\n\t\tRTMP_CARRIER_IO_READ8(pAd, 1, &bbp);\n\t\tif (bbp & 0x1)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CS bit not cleared!!!\\n\"));\n\t\t/* re-enable carrier detection */\n\t\tRTMP_CARRIER_IO_WRITE8(pAd, 0, 1);\n\t}\n\telse if(pAd->chipCap.carrier_func == TONE_RADAR_V1 &&\n\t\tpCarrierDetect->Enable)\n\t{\n\t\t\tToneRadarProgram(pAd);\n\t}\n}\n\n/* \n    ==========================================================================\n    Description:\n\tReset CS state to NORMAL state.\n\tArguments:\n\t    pAd                    Pointer to our adapter\n\n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT CarrierDetectReset(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tpAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL;\n\treturn 0;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tCriteria in CS is a timing difference threshold for a pair of carrier tones. This function is a ioctl uesed to adjust the \n\tCriteria. (unit: 16us)\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    arg\t\t\tPointer to the ioctl argument\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT Set_CarrierCriteria_Proc(\n\tIN PRTMP_ADAPTER \tpAd, \n\tIN PSTRING\t\t\targ)\n{\n\tUINT32 Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\n\tpAd->CommonCfg.CarrierDetect.criteria = Value;\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n\t{\n\t\tUSHORT sVal = (USHORT) (Value >> 6); /* convert unit from 16us to ms:(2^4 /2^10)  */\n\t\tRTUSBMultiWrite(pAd, CD_CRITERIA, (PUCHAR) &sVal, 2, FALSE);\n\t\t/* send enable cmd to mcu to take effect */\n\t\tAsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);\n\t}\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tReCheck in CS is a value indicating how many continuous incoming carrier tones is enough us to announce  that there \n\tis carrier tone (and hence enter SILENT state). This function is a ioctl uesed to adjust the ReCheck value.\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    arg\t\t\tPointer to the ioctl argument\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT Set_CarrierReCheck_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tpAd->CommonCfg.CarrierDetect.recheck1 = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set Recheck = %u\\n\", pAd->CommonCfg.CarrierDetect.recheck1));\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n\tRTMP_IO_WRITE8(pAd, CD_CHECK_COUNT, pAd->CommonCfg.CarrierDetect.recheck1);\n\t/* send enable cmd to mcu to take effect */\n\tAsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tCarrierGoneThreshold is used to determine whether we should leave SILENT state. When the number of carrier \n\ttones in a certain period of time is less than CarrierGoneThreshold, we should return to NORMAL state. This function \n\tis a ioctl uesed to adjust the CarrierGoneThreshold.\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    arg\t\t\tPointer to the ioctl argument\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT Set_CarrierGoneThreshold_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tpAd->CommonCfg.CarrierDetect.CarrierGoneThreshold = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set CarrierGoneThreshold = %u\\n\", pAd->CommonCfg.CarrierDetect.CarrierGoneThreshold));\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tSetting up the carrier debug level. set 0 means to turning off the carrier debug\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    arg\t\t\tPointer to the ioctl argument\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT\tSet_CarrierDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.CarrierDetect.Debug = simple_strtol(arg, 0, 10);\n\tprintk(\"pAd->CommonCfg.CarrierDetect.Debug = %ld\\n\", pAd->CommonCfg.CarrierDetect.Debug);\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tDelta control the delay line characteristic of the cross correlation energy calculation.\n\tThis function is a ioctl uesed to adjust the Delta value.\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    arg\t\t\tPointer to the ioctl argument\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT\tSet_CarrierDelta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.CarrierDetect.delta = simple_strtol(arg, 0, 10);\n\tprintk(\"Delta = %d\\n\", pAd->CommonCfg.CarrierDetect.delta);\n\tCarrierDetectionStart(pAd);\n\n\treturn TRUE;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\tTo set ON/OFF of the \"Not Divide Flag\"\n\t\n\tArguments:\n\t\tpAd \t\tPointer to our adapter\n\t\targ \t\tPointer to the ioctl argument\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t==========================================================================\n*/\nINT\tSet_CarrierDivFlag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.CarrierDetect.div_flag = simple_strtol(arg, 0, 10);\n\tprintk(\"DivFlag = %d\\n\", pAd->CommonCfg.CarrierDetect.div_flag);\n\tCarrierDetectionStart(pAd);\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tCarrier Threshold is the energy threshold for h/w to determine a carrier tone or not.\n\tThis function is a ioctl uesed to adjust the Threshold value.\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    arg\t\t\tPointer to the ioctl argument\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nINT\tSet_CarrierThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.CarrierDetect.threshold = simple_strtol(arg, 0, 10);\n\tprintk(\"CarrThrd = %d(0x%x)\\n\", pAd->CommonCfg.CarrierDetect.threshold, pAd->CommonCfg.CarrierDetect.threshold);\n\tCarrierDetectionStart(pAd);\n\n\treturn TRUE;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\tCarrier SymRund is the number of round bits in Radar Symmetric Round Bits Option.\n\tThis function is a ioctl uesed to adjust the SymRund. (unit: bit)\n\t\n\tArguments:\n\t\tpAd \t\tPointer to our adapter\n\t\targ \t\tPointer to the ioctl argument\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t==========================================================================\n*/\nINT\tSet_CarrierSymRund_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.CarrierDetect.SymRund= simple_strtol(arg, 0, 10);\n\tprintk(\"SymRund = %d\\n\", pAd->CommonCfg.CarrierDetect.SymRund);\n\tCarrierDetectionStart(pAd);\n\n\treturn TRUE;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\tCarrier Masks are used to prevent false trigger while doing Rx_PE, Packet_End, and AGC tuning.\n\tThis function is a ioctl uesed to adjust these three mask. (unit: 100ns)\n\t\n\tArguments:\n\t\tpAd \t\tPointer to our adapter\n\t\targ \t\tPointer to the ioctl argument\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t==========================================================================\n*/\nINT Set_CarrierMask_Proc(\n        IN      PRTMP_ADAPTER   pAd,\n        IN      PSTRING                 arg)\n{\n\tpAd->CommonCfg.CarrierDetect.VGA_Mask = simple_strtol(arg, 0, 10);\n\tpAd->CommonCfg.CarrierDetect.Packet_End_Mask = simple_strtol(arg, 0, 10);\n\tpAd->CommonCfg.CarrierDetect.Rx_PE_Mask = simple_strtol(arg, 0, 10);\n\tprintk(\"CarrMask = %u(%x)\\n\", pAd->CommonCfg.CarrierDetect.VGA_Mask, pAd->CommonCfg.CarrierDetect.VGA_Mask);\n\tCarrierDetectionStart(pAd);\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tInitialize CS parameters.\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID CSInit(\n\t\tIN PRTMP_ADAPTER pAd)\n{\n\tPCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;\n\n\tpCarrierDetect->TimeStamp = 0;\n\tpCarrierDetect->recheck = pCarrierDetect->recheck1;\n\tpCarrierDetect->OneSecIntCount = 0;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tTo trigger CS start\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID CarrierDetectionStart(PRTMP_ADAPTER pAd)\n{\t\t\n\t/*ULONG Value;*/\n\t/* Enable Bandwidth usage monitor*/\n\tDBGPRINT(RT_DEBUG_TRACE, (\"CarrierDetectionStart\\n\"));\n\t/*RTMP_IO_READ32(pAd, CH_TIME_CFG, &Value);*/\n\t/*RTMP_IO_WRITE32(pAd, CH_TIME_CFG, Value | 0x1f);\t*/\n\n\t/* Init Carrier Detect*/\n\tif (pAd->CommonCfg.CarrierDetect.Enable)\n\t{\n\t\tCSInit(pAd);\n\t\tToneRadarProgram(pAd);\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n\t\t{\n\t\tUSHORT criteria = (USHORT) (pAd->CommonCfg.CarrierDetect.criteria >> 6); /* convert unit from 16us to 1ms:(2^4 /2^10)  */\n\t\tRTUSBMultiWrite(pAd, CD_CRITERIA, (PUCHAR) &criteria, 2, FALSE);\n\t\tRTMP_IO_WRITE8(pAd, CD_CHECK_COUNT, pAd->CommonCfg.CarrierDetect.recheck1);\n\t\tAsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);\n\t\t}\n#else \n\t\t/* trun on interrupt polling for pcie device */\n\t\tif (pAd->infType == RTMP_DEV_INF_PCIE)\n\t\t\tAsicSendCommandToMcu(pAd, CD_INT_POLLING_CMD, 0xff, 0x01, 0x00, FALSE);\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\t\n\t}\n}\n\n/* \n    ==========================================================================\n    Description:\n\tTo stop CS\n\t\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID CarrierDetectionStop(IN PRTMP_ADAPTER\tpAd)\n{\n\tCarrierDetectReset(pAd);\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n\t/* Stop firmware CS action */\n\tAsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x00, 0x00, FALSE);\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n\tTo program CS related BBP registers (CS initialization)\n\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nstatic VOID ToneRadarProgram(PRTMP_ADAPTER pAd)\n{\n\tULONG threshold;\n\t/* if wireless mode is 20Mhz mode, then the threshold should div by 2 */\t\n\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_20)\t\t\n\t\tthreshold = pAd->CommonCfg.CarrierDetect.threshold >> 1;\t\n\telse\t\t\n\t\tthreshold = pAd->CommonCfg.CarrierDetect.threshold;\n\t/* Call ToneRadarProgram_v1/ToneRadarProgram_v2*/\n\tRTMP_CHIP_CARRIER_PROGRAM(pAd, threshold);\n}\n\n/* \n    ==========================================================================\n    Description:\n\tTo program CS v1 related BBP registers (CS initialization)\n\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID ToneRadarProgram_v1(PRTMP_ADAPTER pAd, ULONG threshold)\n{\n\tUCHAR bbp;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ToneRadarProgram v1\\n\"));\n\t/* programe delta delay & division bit*/\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0xf0);\n\tbbp = pAd->CommonCfg.CarrierDetect.delta << 4;\n\tbbp |= (pAd->CommonCfg.CarrierDetect.div_flag & 0x1) << 3;\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, bbp);\n\n\t/* program threshold*/\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x34);\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff000000) >> 24);\n\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x24);\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff0000) >> 16);\n\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x14);\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff00) >> 8);\n\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x04);\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, threshold & 0xff);\n\n\t/* ToneRadarEnable v1 */\n\tBBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x05);\n}\n\n/* \n    ==========================================================================\n    Description:\n\tTo program CS v2 related BBP registers (CS initialization)\n\n\tArguments:\n\t    pAd\t\t\tPointer to our adapter\n\t    \n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nVOID ToneRadarProgram_v2(PRTMP_ADAPTER pAd, ULONG threshold)\n{\n\tUCHAR bbp;\n\n\t/* programe delta delay & division bit*/\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ToneRadarProgram v2\\n\"));\n\tbbp = pAd->CommonCfg.CarrierDetect.delta |\t\t\t\t\t\t\t\\\n\t\t\t((pAd->CommonCfg.CarrierDetect.SymRund & 0x3) << 4)\t |\t\t\\\n\t\t\t((pAd->CommonCfg.CarrierDetect.div_flag & 0x1) << 6) |\t\t\\\n\t\t\t0x80;\t/* Full 40MHz Detection Mode */\n\tRTMP_CARRIER_IO_WRITE8(pAd, 5, bbp);\n\t\n\t/* program *_mask*/\n\tRTMP_CARRIER_IO_WRITE8(pAd, 2, pAd->CommonCfg.CarrierDetect.VGA_Mask);\n\tRTMP_CARRIER_IO_WRITE8(pAd, 3, pAd->CommonCfg.CarrierDetect.Packet_End_Mask);\n\tRTMP_CARRIER_IO_WRITE8(pAd, 4, pAd->CommonCfg.CarrierDetect.Rx_PE_Mask);\n\n\t/* program threshold*/\n\tRTMP_CARRIER_IO_WRITE8(pAd, 6, threshold & 0xff);\n\tRTMP_CARRIER_IO_WRITE8(pAd, 7, (threshold & 0xff00) >> 8);\n\tRTMP_CARRIER_IO_WRITE8(pAd, 8, (threshold & 0xff0000) >> 16);\n\tRTMP_CARRIER_IO_WRITE8(pAd, 9, (threshold & 0xff000000) >> 24);\n\n\t/* ToneRadarEnable v2 */\n\tRTMP_CARRIER_IO_WRITE8(pAd, 0, 1);\n}\n\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_data.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tcmm_data.c\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n \n#include \"rt_config.h\"\n\n\nUCHAR\tSNAP_802_1H[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};\nUCHAR\tSNAP_BRIDGE_TUNNEL[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};\nUCHAR\tEAPOL[] = {0x88, 0x8e};\nUCHAR   TPID[] = {0x81, 0x00}; /* VLAN related */\n\nUCHAR\tIPX[] = {0x81, 0x37};\nUCHAR\tAPPLE_TALK[] = {0x80, 0xf3};\n\n\nUCHAR MapUserPriorityToAccessCategory[8] = {QID_AC_BE, QID_AC_BK, QID_AC_BK, QID_AC_BE, QID_AC_VI, QID_AC_VI, QID_AC_VO, QID_AC_VO};\n\n\n\nVOID dump_rxinfo(RTMP_ADAPTER *pAd, RXINFO_STRUC *pRxInfo)\n{\n\thex_dump(\"RxInfo Raw Data\", (UCHAR *)pRxInfo, sizeof(RXINFO_STRUC));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"RxInfo Fields:\\n\"));\n\n#ifdef RLT_MAC\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBA=%d\\n\", pRxInfo->BA));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tDATA=%d\\n\", pRxInfo->DATA));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tNULLDATA=%d\\n\", pRxInfo->NULLDATA));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tFRAG=%d\\n\", pRxInfo->FRAG));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tU2M=%d\\n\", pRxInfo->U2M));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMcast=%d\\n\", pRxInfo->Mcast));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBcast=%d\\n\", pRxInfo->Bcast));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMyBss=%d\\n\", pRxInfo->MyBss));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tCrc=%d\\n\", pRxInfo->Crc));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tCipherErr=%d\\n\", pRxInfo->CipherErr));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tAMSDU=%d\\n\", pRxInfo->AMSDU));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tHTC=%d\\n\", pRxInfo->HTC));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRSSI=%d\\n\", pRxInfo->RSSI));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tL2PAD=%d\\n\", pRxInfo->L2PAD));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tAMPDU=%d\\n\", pRxInfo->AMPDU));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tDecrypted=%d\\n\", pRxInfo->Decrypted));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBssIdx3=%d\\n\", pRxInfo->BssIdx3));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\twapi_kidx=%d\\n\", pRxInfo->wapi_kidx));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tpn_len=%d\\n\", pRxInfo->pn_len));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\ttcp_sum_bypass=%d\\n\", pRxInfo->tcp_sum_bypass));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tip_sum_bypass=%d\\n\", pRxInfo->ip_sum_bypass));\t\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t\" ));\n#endif /* RTMP_MAC */\n}\n\n\n#ifdef RLT_MAC\nVOID dumpRxFCEInfo(RTMP_ADAPTER *pAd, RXFCE_INFO *pRxFceInfo)\n{\n\thex_dump(\"RxFCEInfo Raw Data\", (UCHAR *)pRxFceInfo, sizeof(RXFCE_INFO));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"RxFCEInfo Fields:\\n\"));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tinfo_type=%d\\n\", pRxFceInfo->info_type));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\ts_port=%d\\n\", pRxFceInfo->s_port));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tqsel=%d\\n\", pRxFceInfo->qsel));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tpcie_intr=%d\\n\", pRxFceInfo->pcie_intr));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tmac_len=%d\\n\", pRxFceInfo->mac_len));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tl3l4_done=%d\\n\", pRxFceInfo->l3l4_done));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tpkt_80211=%d\\n\", pRxFceInfo->pkt_80211));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tip_err=%d\\n\", pRxFceInfo->ip_err));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\ttcp_err=%d\\n\", pRxFceInfo->tcp_err));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tudp_err=%d\\n\", pRxFceInfo->udp_err));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tpkt_len=%d\\n\", pRxFceInfo->pkt_len));\n}\n#endif /* RLT_MAC */\n\n\nstatic UCHAR *txwi_txop_str[]={\"HT_TXOP\", \"PIFS\", \"SIFS\", \"BACKOFF\", \"Invalid\"};\n#define TXWI_TXOP_STR(_x)\t((_x) <= 3 ? txwi_txop_str[(_x)]: txwi_txop_str[4])\n\nVOID dumpTxWI(RTMP_ADAPTER *pAd, TXWI_STRUC *pTxWI)\n{\n\thex_dump(\"TxWI Raw Data: \", (UCHAR *)pTxWI, sizeof(TXWI_STRUC));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxWI Fields:\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tPHYMODE=%d(%s)\\n\", pTxWI->TxWIPHYMODE,  get_phymode_str(pTxWI->TxWIPHYMODE)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tSTBC=%d\\n\", pTxWI->TxWISTBC));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tShortGI=%d\\n\", pTxWI->TxWIShortGI));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBW=%d(%sMHz)\\n\", pTxWI->TxWIBW, get_bw_str(pTxWI->TxWIBW)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMCS=%d\\n\", pTxWI->TxWIMCS));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTxOP=%d(%s)\\n\", pTxWI->TxWITXOP, TXWI_TXOP_STR(pTxWI->TxWITXOP)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMpduDensity=%d\\n\", pTxWI->TxWIMpduDensity));\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tAMPDU=%d\\n\", pTxWI->TxWIAMPDU));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTS=%d\\n\", pTxWI->TxWITS));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tCF-ACK=%d\\n\", pTxWI->TxWICFACK));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMIMO-PS=%d\\n\", pTxWI->TxWIMIMOps));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tNSEQ=%d\\n\", pTxWI->TxWINSEQ));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tACK=%d\\n\", pTxWI->TxWIACK));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tFRAG=%d\\n\", pTxWI->TxWIFRAG));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tWCID=%d\\n\", pTxWI->TxWIWirelessCliID));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBAWinSize=%d\\n\", pTxWI->TxWIBAWinSize));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMPDUtotalByteCnt=%d\\n\", pTxWI->TxWIMPDUByteCnt));\t\n#ifdef RLT_MAC\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tPID=%d\\n\", pTxWI->TxWIPacketId));\t\n#endif /* RLT_MAC */\n}\n\n\nVOID dump_rxwi(RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI)\n{\n\thex_dump(\"RxWI Raw Data\", (UCHAR *)pRxWI, sizeof(RXWI_STRUC));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"RxWI Fields:\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tWCID=%d\\n\", pRxWI->RxWIWirelessCliID));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tPhyMode=%d(%s)\\n\", pRxWI->RxWIPhyMode, get_phymode_str(pRxWI->RxWIPhyMode)));\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd) && (pRxWI->RxWIPhyMode == MODE_VHT))\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMCS=%d(Nss:%d, MCS:%d)\\n\", pRxWI->RxWIMCS, (pRxWI->RxWIMCS >> 4), (pRxWI->RxWIMCS & 0xf)));\n\telse\n#endif /* RT65xx */\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMCS=%d\\n\", pRxWI->RxWIMCS));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBW=%d\\n\", pRxWI->RxWIBW));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tSGI=%d\\n\", pRxWI->RxWISGI));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMPDUtotalByteCnt=%d\\n\", pRxWI->RxWIMPDUByteCnt));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTID=%d\\n\", pRxWI->RxWITID));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tSTBC=%d\\n\", pRxWI->RxWISTBC));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tkey_idx=%d\\n\", pRxWI->RxWIKeyIndex));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tBSS_IDX=%d\\n\", pRxWI->RxWIBSSID));\t\n}\n\n\nstatic UCHAR *txinfo_type_str[]={\"PKT\", \"\", \"CMD\", \"RSV\", \"Invalid\"};\nstatic UCHAR *txinfo_d_port_str[]={\"WLAN\", \"CPU_RX\", \"CPU_TX\", \"HOST\", \"VIRT_RX\", \"VIRT_TX\", \"DROP\", \"Invalid\"};\nstatic UCHAR *txinfo_que_str[]={\"MGMT\", \"HCCA\", \"EDCA_1\", \"EDCA_2\", \"Invalid\"};\n\n#define TXINFO_TYPE_STR(_x)  \t((_x)<=3 ?  txinfo_type_str[_x] : txinfo_type_str[4])\n#define TXINFO_DPORT_STR(_x)\t((_x) <= 6 ? txinfo_d_port_str[_x]: txinfo_d_port_str[7])\n#define TXINFO_QUE_STR(_x)\t\t((_x) <= 3 ? txinfo_que_str[_x]: txinfo_que_str[4])\n\nVOID dump_txinfo(RTMP_ADAPTER *pAd, TXINFO_STRUC *pTxInfo)\n{\n\thex_dump(\"TxInfo Raw Data: \", (UCHAR *)pTxInfo, sizeof(TXINFO_STRUC));\n\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"TxInfo Fields:\\n\"));\n\n#ifdef RLT_MAC\n{\n\tstruct _TXINFO_NMAC_PKT *pkt_txinfo = (struct _TXINFO_NMAC_PKT *)pTxInfo;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tInfo_Type=%d(%s)\\n\", pkt_txinfo->info_type, TXINFO_TYPE_STR(pkt_txinfo->info_type)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\td_port=%d(%s)\\n\", pkt_txinfo->d_port, TXINFO_DPORT_STR(pkt_txinfo->d_port)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tQSEL=%d(%s)\\n\", pkt_txinfo->QSEL, TXINFO_QUE_STR(pkt_txinfo->QSEL)));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tWIV=%d\\n\", pkt_txinfo->wiv));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t802.11=%d\\n\", pkt_txinfo->pkt_80211));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tcso=%d\\n\", pkt_txinfo->cso));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\ttso=%d\\n\", pkt_txinfo->tso));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tpkt_len=0x%x\\n\", pkt_txinfo->pkt_len));\n}\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n#endif /* RTMP_MAC */\n}\n\n\n#ifdef DBG_DIAGNOSE\nstatic VOID dumpTxBlk(TX_BLK *pTxBlk)\n{\n\tNDIS_PACKET *pPacket;\n\tint i, frameNum;\n\tPQUEUE_ENTRY\tpQEntry;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Dump TX_BLK Structure:\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tTxFrameType=%d!\\n\", pTxBlk->TxFrameType));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tTotalFrameLen=%d\\n\", pTxBlk->TotalFrameLen));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tTotalFrameNum=%ld!\\n\", pTxBlk->TxPacketList.Number));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tTotalFragNum=%d!\\n\", pTxBlk->TotalFragNum));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tpPacketList=\\n\"));\n\n\tframeNum = pTxBlk->TxPacketList.Number;\n\n\tfor(i=0; i < frameNum; i++)\n\t{\tint j;\n\t\tUCHAR\t*pBuf;\n\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\tif (pPacket)\n\t\t{\n\t\t\tpBuf = GET_OS_PKT_DATAPTR(pPacket);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\t\\t[%d]:ptr=0x%x, Len=%d!\\n\", i, (UINT32)(GET_OS_PKT_DATAPTR(pPacket)), GET_OS_PKT_LEN(pPacket)));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\t\\t\"));\n\t\t\tfor (j =0 ; j < GET_OS_PKT_LEN(pPacket); j++)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%02x \", (pBuf[j] & 0xff)));\n\t\t\t\tif (j == 16)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tInsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tWcid=%d!\\n\", pTxBlk->Wcid));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tapidx=%d!\\n\", pTxBlk->apidx));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"----EndOfDump\\n\"));\n\n}\n#endif\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tAPI for MLME to transmit management frame to AP (BSS Mode)\n\tor station (IBSS Mode)\n\t\t\n\tArguments:\n\t\tpAd Pointer to our adapter\n\t\tpData\t\tPointer to the outgoing 802.11 frame\n\t\tLength\t\tSize of outgoing management frame\n\t\t\n\tReturn Value:\n\t\tNDIS_STATUS_FAILURE\n\t\tNDIS_STATUS_PENDING\n\t\tNDIS_STATUS_SUCCESS\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS MiniportMMRequest(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN UCHAR *pData,\n\tIN UINT Length)\n{\n\tPNDIS_PACKET pPacket;\n\tNDIS_STATUS Status = NDIS_STATUS_SUCCESS;\n\tULONG FreeNum;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUCHAR rtmpHwHdr[40];\n\tBOOLEAN bUseDataQ = FALSE, FlgDataQForce = FALSE, FlgIsLocked = FALSE;\n\tint retryCnt = 0, hw_len = TXINFO_SIZE + TXWISize + TSO_SIZE;\n\n\n\tASSERT(Length <= MGMT_DMA_BUFFER_SIZE);\n\n\tif ((QueIdx & MGMT_USE_QUEUE_FLAG) == MGMT_USE_QUEUE_FLAG)\n\t{\n\t\tbUseDataQ = TRUE;\n\t\tQueIdx &= (~MGMT_USE_QUEUE_FLAG);\n\t}\n\n#ifdef FPGA_MODE\n\tif (pAd->fpga_on & 0x1) {\n\t\tif (pAd->tx_kick_cnt > 0) {\n\t\t\tif (pAd->tx_kick_cnt < 0xffff) \n\t\t\t\tpAd->tx_kick_cnt--;\n\t\t}\n\t\telse\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\n\t\tQueIdx = 0;\n\t\tbUseDataQ = TRUE;\n\t}\n#endif /* FPGA_MODE */\n\n\n\tdo\n\t{\n\t\t/* Reset is in progress, stop immediately*/\n\t\tif (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST)) ||\n\t\t\t !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)\n#ifdef P2P_SUPPORT\n\t\t\t|| IS_P2P_ABSENCE(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\t\t}\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_MAC_USB\n\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\t{\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\tASIC_RADIO_ON(pAd, DOT11_RADIO_ON);\n\t\t\telse\n\t\t\t\tRT28xxUsbAsicRadioOn(pAd);\n\t\t}\n#endif /* RTMP_MAC_USB */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/* Check Free priority queue*/\n\t\t/* Since we use PBF Queue2 for management frame.  Its corresponding DMA ring should be using TxRing.*/\n\t\t{\n\t\t\tFreeNum = GET_MGMTRING_FREENO(pAd);\n\t\t}\n\n\t\tif ((FreeNum > 0))\n\t\t{\n\t\t\t/* We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870*/\n\t\t\tNdisZeroMemory(&rtmpHwHdr, hw_len);\n\t\t\tStatus = RTMPAllocateNdisPacket(pAd, &pPacket, (PUCHAR)&rtmpHwHdr, hw_len, pData, Length);\n\t\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"MiniportMMRequest (error:: can't allocate NDIS PACKET)\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t\t\tUAPSD_MR_QOS_NULL_HANDLE(pAd, pData, pPacket);\n#endif /* UAPSD_SUPPORT */\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef UAPSD_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (P2P_GO_ON(pAd))\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t{\n\t\t\t\tUAPSD_MR_QOS_NULL_HANDLE(pAd, pData, pPacket);\n\t\t\t}\n#endif /* UAPSD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n\t\t\tStatus = MlmeHardTransmit(pAd, QueIdx, pPacket, FlgDataQForce, FlgIsLocked);\n\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\tretryCnt = 0;\n\t\t\telse\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, Status);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->RalinkCounters.MgmtRingFullCount++;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Qidx(%d), not enough space in MgmtRing, MgmtRingFullCount=%ld!\\n\",\n\t\t\t\t\t\t\t\t\t\tQueIdx, pAd->RalinkCounters.MgmtRingFullCount));\n\t\t}\n\t} while (retryCnt > 0);\n\n\t\n\n\treturn Status;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tCopy frame from waiting queue into relative ring buffer and set\n\tappropriate ASIC register to kick hardware transmit function\n\n\tArguments:\n\t\tpAd Pointer to our adapter\n\t\tpBuffer \tPointer to\tmemory of outgoing frame\n\t\tLength\t\tSize of outgoing management frame\n\t\tFlgIsDeltsFrame 1: the frame is a DELTS frame\n\t\t\n\tReturn Value:\n\t\tNDIS_STATUS_FAILURE\n\t\tNDIS_STATUS_PENDING\n\t\tNDIS_STATUS_SUCCESS\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\n\tNote:\n\n\t========================================================================\n*/\nvoid AP_QueuePsActionPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pMacEntry,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tBOOLEAN\t\t\tFlgIsDeltsFrame,\n\tIN\tBOOLEAN\t\t\tFlgIsLocked,\n\tIN\tUCHAR\t\t\tMgmtQid)\n{\n\n#ifdef UAPSD_SUPPORT\n#ifdef UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY\n\tPNDIS_PACKET DuplicatePkt = NULL;\n#endif /* UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY */\n#endif /* UAPSD_SUPPORT */\n\n\t/* Note: for original mode of 4 AC are UAPSD, if station want to change\n\t\t\tthe mode of a AC to legacy PS, we dont know where to put the\n\t\t\tresponse;\n\t\t\t1. send the response;\n\t\t\t2. but the station is in ps mode, so queue the response;\n\t\t\t3. we should queue the reponse to UAPSD queue because the station\n\t\t\t\tis not yet change its mode to legacy ps AC;\n\t\t\t4. so AP should change its mode to legacy ps AC only when the station\n\t\t\t\tsends a trigger frame and we send out the reponse;\n\t\t\t5. the mechanism is too complicate; */\n\n#ifdef UAPSD_SUPPORT\n\t/*\n\t\tIf the frame is action frame and the VO is UAPSD, we can not send the\n\t\tframe to VO queue, we need to send to legacy PS queue; or the frame\n\t\tmaybe not got from QSTA.\n\t*/\n/*    if ((pMacEntry->bAPSDDeliverEnabledPerAC[MgmtQid]) &&*/\n/*\t\t(FlgIsDeltsFrame == 0))*/\n    if (pMacEntry->bAPSDDeliverEnabledPerAC[MgmtQid])\n\t{\n\t\t/* queue the management frame to VO queue if VO is deliver-enabled */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ps> mgmt to UAPSD queue %d ... (IsDelts: %d)\\n\",\n\t\t\t\tMgmtQid, FlgIsDeltsFrame));\n\n#ifdef UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY\n\t\tif (!pMacEntry->bAPSDAllAC)\n\t\t{\n\t\t\t/* duplicate one packet to legacy PS queue */\n\t\t\tRTMP_SET_PACKET_UAPSD(pPacket, 0, MgmtQid);\n\t\t\tDuplicatePkt = RTMP_DUPLICATE_PACKET(pAd, pPacket, pMacEntry->apidx);\n\t\t}\n\t\telse\n#endif /* UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY */\n\t\t{\n\t\t\tRTMP_SET_PACKET_UAPSD(pPacket, 1, MgmtQid);\n\t\t}\n\n        UAPSD_PacketEnqueue(pAd, pMacEntry, pPacket, MgmtQid);\n\n\t\tif (pMacEntry->bAPSDAllAC)\n\t\t{\n\t\t\t/* mark corresponding TIM bit in outgoing BEACON frame*/\n\t\t\tWLAN_MR_TIM_BIT_SET(pAd, pMacEntry->apidx, pMacEntry->Aid);\n\t\t}\n\t\telse\n\t\t{\n#ifdef UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY\n\t\t\t/* duplicate one packet to legacy PS queue */\n\n\t\t\t/*\n\t\t\t\tSometimes AP will send DELTS frame to STA but STA will not\n\t\t\t\tsend any trigger frame to get the DELTS frame.\n\t\t\t\tWe must force to send it so put another one in legacy PS\n\t\t\t\tqueue.\n\t\t\t*/\n\t\t\tif (DuplicatePkt != NULL)\n\t\t\t{\n\t\t\t\tpPacket = DuplicatePkt;\n\t\t\t\tgoto Label_Legacy_PS;\n\t\t\t}\n#endif /* UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY */\n\t\t}\n    }\n    else\n#endif /* UAPSD_SUPPORT */\n    {\n/*\t\tDuplicatePkt = DuplicatePacket(get_netdev_from_bssid(pAd, pMacEntry->apidx), pPacket, pMacEntry->apidx);*/\n\n#ifdef UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY\nLabel_Legacy_PS:\n#endif /* UAPSD_CC_FUNC_PS_MGMT_TO_LEGACY */\n\t\tif (pMacEntry->PsQueue.Number >= MAX_PACKETS_IN_PS_QUEUE)\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES);\n\t\t\treturn;\n\t\t}\n        else\n        {\n\t\t\tULONG IrqFlags=0;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ps> mgmt to legacy ps queue... (%d)\\n\", FlgIsDeltsFrame));\n\n\t\t\tif (FlgIsLocked == FALSE)\n\t\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t    InsertTailQueue(&pMacEntry->PsQueue, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\tif (FlgIsLocked == FALSE)\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n        }\n\n\t\t/* mark corresponding TIM bit in outgoing BEACON frame*/\n\t\tWLAN_MR_TIM_BIT_SET(pAd, pMacEntry->apidx, pMacEntry->Aid);\n    }\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tCopy frame from waiting queue into relative ring buffer and set\n\tappropriate ASIC register to kick hardware transmit function\n\t\n\tArguments:\n\t\tpAd Pointer to our adapter\n\t\tpBuffer \tPointer to\tmemory of outgoing frame\n\t\tLength\t\tSize of outgoing management frame\n\t\t\n\tReturn Value:\n\t\tNDIS_STATUS_FAILURE\n\t\tNDIS_STATUS_PENDING\n\t\tNDIS_STATUS_SUCCESS\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS MlmeHardTransmit(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN PNDIS_PACKET pPacket,\n\tIN BOOLEAN FlgDataQForce,\n\tIN BOOLEAN FlgIsLocked)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tPHEADER_802_11\tpHeader_802_11;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n#endif /* CONFIG_AP_SUPPORT */\n\tPACKET_INFO \tPacketInfo;\n\tPUCHAR\t\t\tpSrcBufVA;\n\tUINT\t\t\tSrcBufLen;\n\n\tif ((pAd->Dot11_H.RDMode != RD_NORMAL_MODE)\n#ifdef CARRIER_DETECTION_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\n\t\t||(isCarrierDetectExist(pAd) == TRUE)\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\t)\n\t{\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n\tif (pSrcBufVA == NULL)\n\t\treturn NDIS_STATUS_FAILURE;\n\n#ifdef CONFIG_AP_SUPPORT\n\tpHeader_802_11 = (PHEADER_802_11) (pSrcBufVA + TXINFO_SIZE + TXWISize + TSO_SIZE);\n\n\t/*\n\t\tSection 11.2.1.1 STA Power Management modes of IEEE802.11-2007:\n\t\tThe Power Managment bit shall not be set in any management frame,\n\t\texcept an Action frame.\n\n\t\tSo in the 'baseline' test plan\n\t\t(Wi-Fi 802.11 WPA2, WPA, WEP Interoperability Test Plan),\n\t\tSection 2.2.6, the following Requirement:\n        APs shall ignore the power save bit in any received Authenticate and\n\t\t(Re) Associate, and shall assume that the station is awake for the\n\t\tresponse.\n\t*/\n\n\t/*\n\t\tIEEE802.11, 11.2.1.4 AP operation during the contention period f)\n\t\tA single buffered MSDU or management frame for a STA in the PS mode shall\n\t\tbe forwarded to the STA after a PS-Poll has been received from that STA.\n\t\tThe More Data field shall be set to indicate the presence of further\n\t\tbuffered MSDUs or \"management frames\" for the polling STA.\n\t*/\n\n\t/*\n\t\tIEEE802.11e, 11.2.1.4 Power management with APSD,\n\t\tAn unscheduled SP ends after the QAP has attempted to transmit at least\n\t\tone MSDU or MMPDU associated with a delivery-enabled AC and destined for\n\t\tthe non-AP QSTA, but no more than the number indicated in the Max SP\n\t\tLength field if the field has a nonzero value.\n\t*/\n\n\tif ((pHeader_802_11->FC.Type == BTYPE_DATA) ||\n\t\t(pHeader_802_11->FC.Type == BTYPE_MGMT))\n\t{\n\t\tif (pHeader_802_11->FC.SubType != SUBTYPE_QOS_NULL)\n\t\t\tpEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);\n\t}\n\n\n\n\tif ((pEntry != NULL) &&\n\t\t(pEntry->PsMode == PWR_SAVE) &&\n\t\t(((pHeader_802_11->FC.Type == BTYPE_DATA) &&\n\t\t\t(pHeader_802_11->FC.SubType != SUBTYPE_NULL_FUNC) &&\n\t\t\t(pHeader_802_11->FC.SubType != SUBTYPE_QOS_NULL)) ||\n\t\t((pHeader_802_11->FC.Type == BTYPE_MGMT) &&\n\t\t\t(pHeader_802_11->FC.SubType == SUBTYPE_ACTION)) ||\n\t\t((pHeader_802_11->FC.Type == BTYPE_MGMT) &&\n\t\t\t(pHeader_802_11->FC.SubType == SUBTYPE_ACTION_NO_ACK))))\n\t{\n\t\t/* the peer is in PS mode, we need to queue the management frame */\n\t\tUINT8 FlgIsDeltsFrame = 0, MgmtQid = QID_AC_VO;\n\n\t\t/*\n\t\t\t1. Data & Not QoS Null, or\n\t\t\t2. Management & Action, or\n\t\t\t3. Management & Action No ACK;\n\t\t*/\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"STA in ps mode, queue the mgmt frame\\n\"));\n\t\tRTMP_SET_PACKET_WCID(pPacket, pEntry->Aid);\n\t\tRTMP_SET_PACKET_MGMT_PKT(pPacket, 1); /* is management frame */\n\t\tRTMP_SET_PACKET_MGMT_PKT_DATA_QUE(pPacket, 0); /* default to management queue */\n\n#ifdef P2P_SUPPORT\n\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t{\n\t\t\tRTMP_SET_PACKET_NET_DEVICE_P2P(pPacket,MAIN_MBSSID);\n\t\t\tRTMP_SET_PACKET_OPMODE(pPacket, OPMODE_AP);\n\t\t}\n#endif /* P2P_SUPPORT */\t\n\t\t\n\t\tif (FlgDataQForce == TRUE)\n\t\t\tRTMP_SET_PACKET_MGMT_PKT_DATA_QUE(pPacket, 1); /* force to data queue */\n\n\t\tif ((pHeader_802_11->FC.Type == BTYPE_MGMT) &&\n\t\t\t(pHeader_802_11->FC.SubType == SUBTYPE_ACTION))\n\t\t{\n\t\t\tFRAME_ADDBA_REQ *pFrameBa = (FRAME_ADDBA_REQ *)pHeader_802_11;\n\t\t\tif (pFrameBa->Category == CATEGORY_BA)\n\t\t\t\tMgmtQid = QueIdx;\n\t\t}\n\n\n\t\tAP_QueuePsActionPacket(pAd, pEntry, pPacket, FlgIsDeltsFrame,\n\t\t\t\t\t\t\t\tFlgIsLocked, MgmtQid);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n    else\n#endif /* CONFIG_AP_SUPPORT */\n    {\n    \t\treturn MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket);\n    }\n}\n\n\nNDIS_STATUS MlmeHardTransmitMgmtRing(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN PNDIS_PACKET pPacket)\n{\n\tPACKET_INFO PacketInfo;\n\tUCHAR *pSrcBufVA;\n\tUINT SrcBufLen;\n\tHEADER_802_11 *pHeader_802_11;\n\tBOOLEAN bAckRequired, bInsertTimestamp;\n\tUCHAR MlmeRate;\n\tTXWI_STRUC *pFirstTxWI;\n\tMAC_TABLE_ENTRY *pMacEntry = NULL;\n\tUCHAR PID;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n\n\t/* Make sure MGMT ring resource won't be used by other threads*/\n\tRTMP_SEM_LOCK(&pAd->MgmtRingLock);\n\tif (pSrcBufVA == NULL)\n\t{\n\t\t/* The buffer shouldn't be NULL*/\n\t\t\tRTMP_SEM_UNLOCK(&pAd->MgmtRingLock);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* outgoing frame always wakeup PHY to prevent frame lost*/\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n\t\t\tAsicForceWakeup(pAd, TRUE);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpFirstTxWI = (TXWI_STRUC *)(pSrcBufVA +  TXINFO_SIZE);\n\tpHeader_802_11 = (PHEADER_802_11) (pSrcBufVA + TXINFO_SIZE + TSO_SIZE + TXWISize);\n\t\n\tif (pHeader_802_11->Addr1[0] & 0x01)\n\t{\n\t\tMlmeRate = pAd->CommonCfg.BasicMlmeRate;\n\t}\n\telse\n\t{\n\t\tMlmeRate = pAd->CommonCfg.MlmeRate;\n\t}\n\t\n\t/* Verify Mlme rate for a / g bands.*/\n\tif ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) /* 11A band*/\n\t\tMlmeRate = RATE_6;\n\n\tif ((pHeader_802_11->FC.Type == BTYPE_DATA) &&\n\t\t(pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL))\n\t{\n\t\tpMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);\n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Fixed W52 with Activity scan issue in ABG_MIXED and ABGN_MIXED mode.*/\n\t\t// TODO: shiang-6590, why we need this condition check here?\n\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_A | WMODE_B | WMODE_G)\n#ifdef DOT11_N_SUPPORT\n\t\t\t|| WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_A | WMODE_B | WMODE_G | WMODE_AN | WMODE_GN)\n#endif /* DOT11_N_SUPPORT */\n#ifdef DOT11_VHT_AC\n\t\t\t|| WMODE_CAP(pAd->CommonCfg.PhyMode, WMODE_AC)\n#endif /* DOT11_VHT_AC*/\n\t\t)\n\t\t{\n\t\t\tif (pAd->LatchRfRegs.Channel > 14)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\t\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;\n\t\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = MCS_0;\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (P2P_INF_ON(pAd))\n\t{\n\t\tif (MAC_ADDR_EQUAL(pHeader_802_11->Addr2, pAd->P2pCfg.CurrentAddress) ||\n\t\t\t(pAd->LatchRfRegs.Channel > 14))\n\t\t{\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = MCS_0;\n\t\t}\n\t}\n#endif /* P2P_SUPPORT */\n\t/* Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE)*/\n\t/* Snice it's been set to 0 while on MgtMacHeaderInit*/\n\t/* By the way this will cause frame to be send on PWR_SAVE failed.*/\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t{\n\t\t\t/* We are in scan progress, just let the PwrMgmt bit keep as it orginally should be.*/\n\t\t}\n\t\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tpHeader_802_11->FC.PwrMgmt = PWR_ACTIVE; /* (pAd->StaCfg.Psm == PWR_SAVE);*/\n#ifdef CONFIG_STA_SUPPORT\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\n\t/* In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame*/\n\t/* Data-Null packets alse pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD*/\n/*\tif ((pHeader_802_11->FC.Type != BTYPE_DATA) && (pHeader_802_11->FC.Type != BTYPE_CNTL))*/\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif ((pHeader_802_11->FC.SubType == SUBTYPE_ACTION) ||\n\t\t\t((pHeader_802_11->FC.Type == BTYPE_DATA) &&\n\t\t\t((pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL) ||\n\t\t\t(pHeader_802_11->FC.SubType == SUBTYPE_NULL_FUNC))))\n\t\t{\n\t\t\tif (RtmpPktPmBitCheck(pAd) == TRUE)\n\t\t\t\tpHeader_802_11->FC.PwrMgmt = PWR_SAVE;\n\t\t\telse if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && \n\t\t\t\t\tINFRA_ON(pAd) && \n\t\t\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t\t{\n\t\t\t\t/* We are in scan progress, just let the PwrMgmt bit keep as it orginally should be */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpHeader_802_11->FC.PwrMgmt = pAd->CommonCfg.bAPSDForcePowerSave;\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tpHeader_802_11->FC.MoreData = RTMP_GET_PACKET_MOREDATA(pPacket);\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\tbInsertTimestamp = FALSE;\n\tif (pHeader_802_11->FC.Type == BTYPE_CNTL) /* must be PS-POLL*/\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t/*Set PM bit in ps-poll, to fix WLK 1.2  PowerSaveMode_ext failure issue.*/\n\t\tif ((pAd->OpMode == OPMODE_STA) && (pHeader_802_11->FC.SubType == SUBTYPE_PS_POLL))\n\t\t{\n\t\t\tpHeader_802_11->FC.PwrMgmt = PWR_SAVE;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\tbAckRequired = FALSE;\n\t}\n\telse /* BTYPE_MGMT or BTYPE_DATA(must be NULL frame)*/\n\t{\n\t\tif (pHeader_802_11->Addr1[0] & 0x01) /* MULTICAST, BROADCAST*/\n\t\t{\n\t\t\tbAckRequired = FALSE;\n\t\t\tpHeader_802_11->Duration = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbAckRequired = TRUE;\n\t\t\tpHeader_802_11->Duration = RTMPCalcDuration(pAd, MlmeRate, 14);\n\t\t\tif ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) && (pHeader_802_11->FC.Type == BTYPE_MGMT))\n\t\t\t{\n\t\t\t\tbInsertTimestamp = TRUE;\n\t\t\t\tbAckRequired = FALSE; /* Disable ACK to prevent retry 0x1f for Probe Response*/\n\t\t\t}\n\t\t\telse if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_REQ) && (pHeader_802_11->FC.Type == BTYPE_MGMT))\n\t\t\t{\n\t\t\t\tbAckRequired = FALSE; /* Disable ACK to prevent retry 0x1f for Probe Request*/\n\t\t\t}\n\t\t}\n\t}\n\n\tpHeader_802_11->Sequence = pAd->Sequence++;\n\tif (pAd->Sequence >0xfff)\n\t\tpAd->Sequence = 0;\n\n\t/*\n\t\tBefore radar detection done, mgmt frame can not be sent but probe req\n\t\tBecause we need to use probe req to trigger driver to send probe req in passive scan\n\t*/\n\tif ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ)\n\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t&& (pAd->Dot11_H.RDMode != RD_NORMAL_MODE))\n\t{\n\t\tRTMP_SEM_UNLOCK(&pAd->MgmtRingLock);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pHeader_802_11, DIR_WRITE, FALSE);\n#endif\n\n\t\n\t/*\n\t\tfill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET\n\t\tshould always has only one physical buffer, and the whole frame size equals\n\t\tto the first scatter buffer size\n\t*/\n\t\n\n\t/*\n\t\tInitialize TX Descriptor\n\t\tFor inter-frame gap, the number is for this frame and next frame\n\t\tFor MLME rate, we will fix as 2Mb to match other vendor's implement\n\t*/\n\t/*pAd->CommonCfg.MlmeTransmit.field.MODE = 1;*/\n\t\n\t/*\n\t\tmanagement frame doesn't need encryption. \n\t\tso use RESERVED_WCID no matter u are sending to specific wcid or not\n\t*/\n\tPID = PID_MGMT;\n\n\n\tif (pMacEntry == NULL)\n\t{\n\t\tRTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE,\n\t\t\t\t\t\t0, RESERVED_WCID, (SrcBufLen - TXINFO_SIZE - TXWISize - TSO_SIZE), PID, 0,\n\t\t\t\t\t\t(UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE,\n\t\t\t\t\t\t&pAd->CommonCfg.MlmeTransmit);\n\t}\n\telse\n\t{\n#ifdef P2P_SUPPORT\n\t\t/* P2P Test Case 6.1.12, only OFDM rate can be captured by sniffer */\n\t\tif ((pAd->P2pCfg.bLowRateQoSNULL == TRUE) &&\n\t\t\t((pHeader_802_11->FC.Type == BTYPE_DATA) &&\n\t\t\t(pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s:: Using Low Rate to send QOS NULL!!\\n\", __FUNCTION__));\n\t\t\tpMacEntry->MaxHTPhyMode.field.MODE = 1;\n\t\t\tpMacEntry->MaxHTPhyMode.field.MCS = MCS_RATE_54;\n\t\t}\n#endif /* P2P_SUPPORT */\n\t\t/* dont use low rate to send QoS Null data frame */\n\t\tRTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE,\n\t\t\t\t\tbInsertTimestamp, FALSE, bAckRequired, FALSE,\n\t\t\t\t\t0, pMacEntry->Aid, (SrcBufLen - TXINFO_SIZE - TXWISize - TSO_SIZE),\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.MCS, 0,\n\t\t\t\t\t(UCHAR)pMacEntry->MaxHTPhyMode.field.MCS,\n\t\t\t\t\tIFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode);\n\t}\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPWIEndianChange(pAd, (PUCHAR)pFirstTxWI, TYPE_TXWI);\n#endif\n\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"TxMgmtPkt\", (UCHAR *)pHeader_802_11, ((SrcBufLen - TXINFO_SIZE - TXWISize - TSO_SIZE) > 7000 ? 7000 : (SrcBufLen - TXINFO_SIZE - TXWISize - TSO_SIZE)));\n}\n//---Add by shiang for debug\n\n\t/* Now do hardware-depened kick out.*/\n\tHAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen);\n\n\t/* Make sure to release MGMT ring resource*/\n/*\tif (!IrqState)*/\n\t\tRTMP_SEM_UNLOCK(&pAd->MgmtRingLock);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/********************************************************************************\n\t\t\n\tNew DeQueue Procedures.\n\n ********************************************************************************/\n#define DEQUEUE_LOCK(lock, bIntContext, IrqFlags) \t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (bIntContext == FALSE)\t\t\t\t\t\t\\\n\t\t\t\tRTMP_IRQ_LOCK((lock), IrqFlags);\t\t\\\n\t\t\t}while(0)\n\n#define DEQUEUE_UNLOCK(lock, bIntContext, IrqFlags)\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (bIntContext == FALSE)\t\t\t\t\t\t\\\n\t\t\t\t\tRTMP_IRQ_UNLOCK((lock), IrqFlags);\t\\\n\t\t\t}while(0)\n\n\n/*\n\t========================================================================\n\tTx Path design algorithm:\n\t\tBasically, we divide the packets into four types, Broadcast/Multicast, 11N Rate(AMPDU, AMSDU, Normal), B/G Rate(ARALINK, Normal),\n\t\tSpecific Packet Type. Following show the classification rule and policy for each kinds of packets.\n\t\t\t\tClassification Rule=>\n\t\t\t\t\tMulticast: (*addr1 & 0x01) == 0x01\n\t\t\t\t\tSpecific : bDHCPFrame, bARPFrame, bEAPOLFrame, etc.\n\t\t\t\t\t11N Rate : If peer support HT\n\t\t\t\t\t\t\t\t(1).AMPDU  -- If TXBA is negotiated.\n\t\t\t\t\t\t\t\t(2).AMSDU  -- If AMSDU is capable for both peer and ourself.\n\t\t\t\t\t\t\t\t\t\t\t*). AMSDU can embedded in a AMPDU, but now we didn't support it.\n\t\t\t\t\t\t\t\t(3).Normal -- Other packets which send as 11n rate.\n\t\t\t\t\t\t\t\t\n\t\t\t\t\tB/G Rate : If peer is b/g only.\n\t\t\t\t\t\t\t\t(1).ARALINK-- If both of peer/us supprot Ralink proprietary Aggregation and the TxRate is large than RATE_6\n\t\t\t\t\t\t\t\t(2).Normal -- Other packets which send as b/g rate.\n\t\t\t\t\tFragment:\n\t\t\t\t\t\t\t\tThe packet must be unicast, NOT A-RALINK, NOT A-MSDU, NOT 11n, then can consider about fragment.\n\t\t\t\t\t\t\t\t\n\t\t\t\tClassified Packet Handle Rule=>\n\t\t\t\t\tMulticast:\n\t\t\t\t\t\t\t\tNo ACK, \t\tpTxBlk->bAckRequired = FALSE;\n\t\t\t\t\t\t\t\tNo WMM, \t\tpTxBlk->bWMM = FALSE;\n\t\t\t\t\t\t\t\tNo piggyback,   pTxBlk->bPiggyBack = FALSE;\n\t\t\t\t\t\t\t\tForce LowRate,  pTxBlk->bForceLowRate = TRUE;\n\t\t\t\t\tSpecific :\tBasically, for specific packet, we should handle it specifically, but now all specific packets are use\n\t\t\t\t\t\t\t\t\tthe same policy to handle it.\n\t\t\t\t\t\t\t\tForce LowRate,  pTxBlk->bForceLowRate = TRUE;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t11N Rate :\n\t\t\t\t\t\t\t\tNo piggyback,\tpTxBlk->bPiggyBack = FALSE;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t(1).AMSDU\n\t\t\t\t\t\t\t\t\tpTxBlk->bWMM = TRUE;\n\t\t\t\t\t\t\t\t(2).AMPDU\n\t\t\t\t\t\t\t\t\tpTxBlk->bWMM = TRUE;\n\t\t\t\t\t\t\t\t(3).Normal\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tB/G Rate :\n\t\t\t\t\t\t\t\t(1).ARALINK\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t(2).Normal\n\t========================================================================\n*/\nstatic UCHAR TxPktClassification(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET  pPacket)\n{\n\tUCHAR\t\t\tTxFrameType = TX_UNKOWN_FRAME;\n\tUCHAR\t\t\tWcid;\n\tMAC_TABLE_ENTRY\t*pMacEntry = NULL;\n#ifdef DOT11_N_SUPPORT\n\tBOOLEAN\t\t\tbHTRate = FALSE;\n#endif /* DOT11_N_SUPPORT */\n\n\tWcid = RTMP_GET_PACKET_WCID(pPacket);\n\tif (Wcid == MCAST_WCID)\n\t{\t/* Handle for RA is Broadcast/Multicast Address.*/\n\t\treturn TX_MCAST_FRAME;\n\t}\n\n\t/* Handle for unicast packets*/\n\tpMacEntry = &pAd->MacTab.Content[Wcid];\n\tif (RTMP_GET_PACKET_LOWRATE(pPacket))\n\t{\t/* It's a specific packet need to force low rate, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame*/\n\t\tTxFrameType = TX_LEGACY_FRAME;\n\t}\n#ifdef DOT11Z_TDLS_SUPPORT\n\telse if (RTMP_GET_PACKET_TDLS(pPacket))\n\t{\n\t\tTxFrameType = TX_LEGACY_FRAME;\n\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n#ifdef DOT11_N_SUPPORT\n\telse if (IS_HT_RATE(pMacEntry))\n\t{\t/* it's a 11n capable packet*/\n\n\t\t/* Depends on HTPhyMode to check if the peer support the HTRate transmission.*/\n\t\t/* \tCurrently didn't support A-MSDU embedded in A-MPDU*/\n\t\tbHTRate = TRUE;\n\t\tif (RTMP_GET_PACKET_MOREDATA(pPacket) || (pMacEntry->PsMode == PWR_SAVE))\n\t\t\tTxFrameType = TX_LEGACY_FRAME;\n#ifdef UAPSD_SUPPORT\n\t\telse if (RTMP_GET_PACKET_EOSP(pPacket))\n\t\t\tTxFrameType = TX_LEGACY_FRAME;\n#endif /* UAPSD_SUPPORT */\n\t\telse if(((pMacEntry->TXBAbitmap & (1<<(RTMP_GET_PACKET_UP(pPacket)))) != 0)\n#ifdef WFA_VHT_PF\n\t\t\t\t&& (pAd->force_amsdu == FALSE)\n#endif /* WFA_VHT_PF */\n\t\t\t)\n\t\t\treturn TX_AMPDU_FRAME;\n\t\telse if((CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AMSDU_INUSED)\n#ifdef WFA_VHT_PF\n\t\t\t\t|| (pAd->force_amsdu == TRUE)\n#endif /* WFA_VHT_PF */\n\t\t\t\t)\n\t\t)\n\t\t\treturn TX_AMSDU_FRAME;\n\t\telse\n\t\t\tTxFrameType = TX_LEGACY_FRAME;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\telse\n\t{\t/* it's a legacy b/g packet.*/\n\t\tif ((CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE) && pAd->CommonCfg.bAggregationCapable) &&\n\t\t\t(RTMP_GET_PACKET_TXRATE(pPacket) >= RATE_6) &&\n\t\t\t(!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)))\n\t\t)\n\t\t{\t/* if peer support Ralink Aggregation, we use it.*/\n\t\t\tTxFrameType = TX_RALINK_FRAME;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxFrameType = TX_LEGACY_FRAME;\n\t\t}\n\t}\n\n\t/* Currently, our fragment only support when a unicast packet send as NOT-ARALINK, NOT-AMSDU and NOT-AMPDU.*/\n\tif ((RTMP_GET_PACKET_FRAGMENTS(pPacket) > 1)\n\t\t && (TxFrameType == TX_LEGACY_FRAME)\n#ifdef DOT11_N_SUPPORT\n\t\t&& ((pMacEntry->TXBAbitmap & (1<<(RTMP_GET_PACKET_UP(pPacket)))) == 0)\n#endif /* DOT11_N_SUPPORT */\n\t\t)\n\t\tTxFrameType = TX_FRAG_FRAME;\n\n\treturn TxFrameType;\n}\n\n\nBOOLEAN RTMP_FillTxBlkInfo(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tPACKET_INFO PacketInfo;\n\tPNDIS_PACKET pPacket;\n\tMAC_TABLE_ENTRY *pMacEntry = NULL;\n\n\tpPacket = pTxBlk->pPacket;\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen);\n#ifdef TX_PKT_SG\n\tNdisMoveMemory( &pTxBlk->pkt_info, &PacketInfo, sizeof(PacketInfo));\n#endif /* TX_PKT_SG */\n\tpTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket);\n\tpTxBlk->apidx = RTMP_GET_PACKET_IF(pPacket);\n\tpTxBlk->UserPriority = RTMP_GET_PACKET_UP(pPacket);\n\tpTxBlk->FrameGap = IFS_HTTXOP;\n#ifdef CONFIG_AP_SUPPORT\n\tpTxBlk->pMbss = NULL;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\tif (pTxBlk->apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\tpTxBlk->apidx = pTxBlk->apidx - MIN_NET_DEVICE_FOR_P2P_GO;\n#endif /* P2P_SUPPORT */\n\n\tif (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pTxBlk->pPacket))\n\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame);\n\telse\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bClearEAPFrame);\n\n\t/* Default to clear this flag*/\n\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bForceNonQoS);\n\n#ifdef WAPI_SUPPORT\n\t/* Check if this is an WPI data frame*/\n\tif ((RTMPIsWapiCipher(pAd, pTxBlk->apidx) == TRUE) &&\n\t\t (RTMP_GET_PACKET_WAI(pTxBlk->pPacket) == FALSE))\n\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bWPIDataFrame);\n\telse\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWPIDataFrame);\n#endif /* WAPI_SUPPORT */\n\t\n\tif (pTxBlk->Wcid == MCAST_WCID)\n\t{\n\t\tpTxBlk->pMacEntry = NULL;\n\t\t{\n#ifdef MCAST_RATE_SPECIFIC\n\t\t\tPUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket);\n\t\t\tif (((*pDA & 0x01) == 0x01) && (*pDA != 0xff))\n\t\t\t\tpTxBlk->pTransmit = &pAd->CommonCfg.MCastPhyMode;\n\t\t\telse\n#endif /* MCAST_RATE_SPECIFIC */\n\t\t\t\tpTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;\n\t\t}\n\t\t\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);\t/* AckRequired = FALSE, when broadcast packet in Adhoc mode.*/\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAllowFrag);\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);\n\t\tif (RTMP_GET_PACKET_MOREDATA(pPacket))\n\t\t{\n\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);\n\t\t}\n\t}\n\telse\n\t{\n\t\tpTxBlk->pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid];\n\t\tpTxBlk->pTransmit = &pTxBlk->pMacEntry->HTPhyMode;\n\n\t\tpMacEntry = pTxBlk->pMacEntry;\n#ifdef CONFIG_AP_SUPPORT\n\t\tpTxBlk->pMbss = pMacEntry->pMbss;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\n\t\t/* For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK.*/\n\t\tif (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != NORMAL_ACK)\n\t\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);\n\t\telse\n\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef XLINK_SUPPORT\n\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t(ADHOC_ON(pAd)) /*&& \n\t\t\t(RX_FILTER_TEST_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS))*/)\n\t\t{\n\t\t\tif(pAd->StaCfg.PSPXlink)\n\t\t\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);\n\t\t}\n#endif /* XLINK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (pTxBlk->OpMode == OPMODE_AP)\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\t\tif(IS_ENTRY_APCLI(pMacEntry))\n\t\t\t\t{\n\t\t\t\t\tPNDIS_PACKET \tapCliPkt = NULL;\n\t\t\t\t\t\t\n\t\t\t\t\t/* For each tx packet, update our MAT convert engine databases.*/\n\t\t\t\t\tapCliPkt = (PNDIS_PACKET)MATEngineTxHandle(pAd, pPacket, pMacEntry->MatchAPCLITabIdx, pTxBlk->OpMode);\n\t\t\t\t\tif(apCliPkt)\n\t\t\t\t\t{\n\t\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);\n\t\t\t\t\t\tpPacket = apCliPkt;\n\t\t\t\t\t\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen);\n\t\t\t\t\t\tpTxBlk->pPacket = apCliPkt;\n\t\t\t\t\t}\n\t\t\t\t\tpTxBlk->pApCliEntry = &pAd->ApCfg.ApCliTab[pMacEntry->MatchAPCLITabIdx];\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bApCliPacket);\n\n\t\t\t\t}\n\t\t\t\telse\n#endif /* APCLI_SUPPORT */\n#ifdef CLIENT_WDS\n\t\t\t\tif (IS_ENTRY_CLIWDS(pMacEntry))\n\t\t\t\t{\n\t\t\t\t\tPUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket);\n\t\t\t\t\tPUCHAR pSA = GET_OS_PKT_DATAPTR(pPacket) + MAC_ADDR_LEN;\n\t\t\t\t\tif (((pMacEntry->apidx < MAX_MBSSID_NUM(pAd))\n\t\t\t\t\t\t&& !MAC_ADDR_EQUAL(pSA, pAd->ApCfg.MBSSID[pMacEntry->apidx].Bssid))\n\t\t\t\t\t\t|| !MAC_ADDR_EQUAL(pDA, pMacEntry->Addr)\n\t\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bClientWDSFrame);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n#endif /* CLIENT_WDS */\n\t\t\t\tif (IS_ENTRY_CLIENT(pMacEntry))\n\t\t\t\t{ }\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\n\t\t\t\t/* If both of peer and us support WMM, enable it.*/\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bWMM);\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (pTxBlk->OpMode == OPMODE_STA)\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t{\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\tif(IS_ENTRY_TDLS(pMacEntry))\n\t\t\t\t{\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bTdlsEntry);\n\t\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n\t\t\t\t/* If support WMM, enable it.*/\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) &&\n\t\t\t\t\tCLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bWMM);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\n\t\tif (pTxBlk->TxFrameType == TX_LEGACY_FRAME)\n\t\t{\n\t\t\tif ( (RTMP_GET_PACKET_LOWRATE(pPacket)) ||\n\t\t\t\t((pAd->OpMode == OPMODE_AP) && (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1))\n\t\t\t)\n\t\t\t{\t/* Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate.*/\n\t\t\t\tpTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;\n\n#ifdef WAPI_SUPPORT\n\t\t\t\t/* \tAccording to WAPIA certification description, WAI packets can not\n\t\t\t\t\tinclude QoS header */\n\t\t\t\tif (RTMP_GET_PACKET_WAI(pTxBlk->pPacket))\n\t\t\t\t{\n\t\t\t\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bForceNonQoS);\n\t\t\t\t}\n#endif /* WAPI_SUPPORT */\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t/* Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it? */\n\t\t\t\tif (IS_HT_STA(pTxBlk->pMacEntry) &&\n\t\t\t\t\t(CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RALINK_CHIPSET)) &&\n\t\t\t\t\t((pAd->CommonCfg.bRdg == TRUE) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RDG_CAPABLE)))\n\t\t\t\t{\n\t\t\t\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bForceNonQoS);\n\t\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n#ifdef P2P_SUPPORT\n                /* If it is P2P EAPOL, we should use OFDM rate (6Mbps) */\n                if (RTMP_GET_PACKET_EAPOL(pPacket) && pMacEntry && pMacEntry->bP2pClient)\n                {\n                    /* Follow Mgmt rate */\n                    pTxBlk->pTransmit = &pAd->CommonCfg.MlmeTransmit;\n                }\n#endif /* P2P_SUPPORT */\n\t\t\t}\n\t\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t\tif ( (IS_HT_RATE(pMacEntry) == FALSE) &&\n\t\t\t\t(CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE)))\n\t\t\t{\t/* Currently piggy-back only support when peer is operate in b/g mode.*/\n\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack);\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tif (RTMP_GET_PACKET_MOREDATA(pPacket))\n\t\t\t{\n\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);\n\t\t\t}\n#ifdef UAPSD_SUPPORT\n\t\t\tif (RTMP_GET_PACKET_EOSP(pPacket))\n\t\t\t{\n\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP);\n\t\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\t}\n\t\telse if (pTxBlk->TxFrameType == TX_FRAG_FRAME)\n\t\t{\n\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bAllowFrag);\n\t\t}\n\t\t\n\t\tpMacEntry->DebugTxCount++;\n\t}\n\n\n\tpAd->LastTxRate = (USHORT)pTxBlk->pTransmit->word;\n\n\treturn TRUE;\n}\n\n\nBOOLEAN CanDoAggregateTransmit(\n\tIN RTMP_ADAPTER *pAd,\n\tIN NDIS_PACKET *pPacket,\n\tIN TX_BLK\t\t*pTxBlk)\n{\n\tint minLen = LENGTH_802_3;\n\n\t/*DBGPRINT(RT_DEBUG_TRACE, (\"Check if can do aggregation! TxFrameType=%d!\\n\", pTxBlk->TxFrameType));*/\n\t\n\tif (RTMP_GET_PACKET_WCID(pPacket) == MCAST_WCID)\n\t\treturn FALSE;\n\n\tif (RTMP_GET_PACKET_DHCP(pPacket) ||\n\t\tRTMP_GET_PACKET_EAPOL(pPacket) ||\n\t\tRTMP_GET_PACKET_WAI(pPacket)\n\t)\n\t\treturn FALSE;\n\t\n\t/* Make sure the first packet has non-zero-length data payload */\n\tif (RTMP_GET_PACKET_VLAN(pPacket))\n\t\tminLen += LENGTH_802_1Q; /* VLAN tag */\n\telse if (RTMP_GET_PACKET_LLCSNAP(pPacket))\n\t\tminLen += 8; /* SNAP hdr Len*/\n\tif (minLen >= GET_OS_PKT_LEN(pPacket))\n\t\treturn FALSE;\n\t\n\tif ((pTxBlk->TxFrameType == TX_AMSDU_FRAME) &&\n\t\t((pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket))> (RX_BUFFER_AGGRESIZE - 100)))\n\t{\t/* For AMSDU, allow the packets with total length < max-amsdu size*/\n\t\treturn FALSE;\n\t}\n\t\n\tif ((pTxBlk->TxFrameType == TX_RALINK_FRAME) &&\n\t\t(pTxBlk->TxPacketList.Number == 2))\n\t{\t/* For RALINK-Aggregation, allow two frames in one batch.*/\n\t\treturn FALSE;\n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\tif ((INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) /* must be unicast to AP*/\n\t\treturn TRUE;\n\telse\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\tif ((MAC_ADDR_EQUAL(GET_OS_PKT_DATAPTR(pTxBlk->pPacket), GET_OS_PKT_DATAPTR(pPacket))) && (pAd->OpMode == OPMODE_AP)) /* unicast to same STA*/\n\t\treturn TRUE;\n\telse\n#endif /* CONFIG_AP_SUPPORT */\n\t\treturn FALSE;\n\t\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tTo do the enqueue operation and extract the first item of waiting\n\t\tlist. If a number of available shared memory segments could meet\n\t\tthe request of extracted item, the extracted item will be fragmented\n\t\tinto shared memory segments.\n\t\n\tArguments:\n\t\tpAd Pointer to our adapter\n\t\tpQueue\t\tPointer to Waiting Queue\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID RTMPDeQueuePacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bIntContext,\n\tIN UCHAR QIdx,\n\tIN INT Max_Tx_Packets)\n{\n\tPQUEUE_ENTRY pEntry = NULL;\n\tPNDIS_PACKET pPacket;\n\tNDIS_STATUS Status = NDIS_STATUS_SUCCESS;\n\tUCHAR Count=0;\n\tPQUEUE_HEADER   pQueue;\n\tULONG FreeNumber[NUM_OF_TX_RING];\n\tUCHAR QueIdx, sQIdx, eQIdx;\n\tunsigned long\tIrqFlags = 0;\n\tBOOLEAN hasTxDesc = FALSE;\n\tTX_BLK TxBlk, *pTxBlk;\n\n#ifdef DBG_DIAGNOSE\n\tBOOLEAN\t\t\tfirstRound;\n\tRtmpDiagStruct\t*pDiagStruct = &pAd->DiagStruct;\n#endif\n\n\n\tif (QIdx == NUM_OF_TX_RING)\n\t{\n\t\tsQIdx = 0;\n#ifdef CONFIG_MULTI_CHANNEL\n\t\teQIdx = QID_HCCA;\t/* 5 ACs, start from 0.*/\n#else\n\t\teQIdx = QID_AC_VO;\t/* 4 ACs, start from 0.*/\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t}\n\telse\n\t{\n\t\tsQIdx = eQIdx = QIdx;\n\t}\n\n\tfor (QueIdx=sQIdx; QueIdx <= eQIdx; QueIdx++)\n\t{\n\t\tCount=0;\n\n\t\tRTMP_START_DEQUEUE(pAd, QueIdx, IrqFlags);\n\n#ifdef DBG_DIAGNOSE\n\t\tfirstRound = ((QueIdx == 0) ? TRUE : FALSE);\n#endif /* DBG_DIAGNOSE */\n\n\t\twhile (1)\n\t\t{\n\t\t\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_DISABLE_DEQUEUEPACKET |  \n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST\n\t\t\t)))\n\n#ifdef P2P_SUPPORT\n\t\t\t\t|| IS_P2P_ABSENCE(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tRTMP_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);\n\t\t\t\treturn;\n\t\t\t}\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif ((pAd->MultiChannelFlowCtl & (1 << QueIdx)) == (1 << QueIdx))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\t\t\n\t\t\tif (Count >= Max_Tx_Packets)\n\t\t\t\tbreak;\n\n\t\t\tDEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\tif (&pAd->TxSwQueue[QueIdx] == NULL)\n\t\t\t{\n#ifdef DBG_DIAGNOSE\n\t\t\t\tif (firstRound == TRUE)\n\t\t\t\t\tpDiagStruct->TxSWQueCnt[pDiagStruct->ArrayCurIdx][0]++;\n#endif /* DBG_DIAGNOSE */\n\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\tbreak;\n\t\t\t}\n\n\n\t\t\t/* probe the Queue Head*/\n\t\t\tpQueue = &pAd->TxSwQueue[QueIdx];\n\t\t\tif ((pEntry = pQueue->Head) == NULL)\n\t\t\t{\n\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpTxBlk = &TxBlk;\n\t\t\tNdisZeroMemory((PUCHAR)pTxBlk, sizeof(TX_BLK));\n\t\t\t\n\t\t\tpTxBlk->QueIdx = QueIdx;\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\t\tpTxBlk->HeaderBuf = (UCHAR *)pTxBlk->HeaderBuffer;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (RTMP_GET_PACKET_OPMODE(pPacket))\n\t\t\t{\n#endif /* P2P_SUPPORT */\n\t\t\tif (RTMP_GET_PACKET_MGMT_PKT(pPacket) == 1)\n\t\t\t{\n\t\t\t\t/* this is a management frame */\n\t\t\t\tNDIS_STATUS status;\n\n\t\t\t\tpEntry = RemoveHeadQueue(pQueue);\n\n\t\t\t\t\tstatus = MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket);\n\n\t\t\t\tif (status != NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t\t\t(\"Transmit queued management frame error!\\n\"));\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t}\n\n\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\tCount++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\t/*when WDS Jam happen, drop following 1min to HW TxRing Pkts*/\n\t\t\t\tMAC_TABLE_ENTRY *pMacEntry = NULL;\n\t\t\t\tUCHAR RAWcid;\n\t\t\t\tRAWcid = RTMP_GET_PACKET_WCID(pPacket);\n\t\t\t\tpMacEntry = &pAd->MacTab.Content[RAWcid];\n\n\t\t\t\tif (!IS_ENTRY_NONE(pMacEntry)\n\t\t\t\t\t&& (pMacEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tSample Lin, 20100412\n\n\t\t\t\t\t\tFor non-WDS interface, we need to send packet to detect\n\t\t\t\t\t\tthe link periodically; Or when\n\t\t\t\t\t\tpMacEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck,\n\t\t\t\t\t\tno any chance to clear pMacEntry->ContinueTxFailCnt.\n\n\t\t\t\t\t\tEX: When pMacEntry->ContinueTxFailCnt >=\n\t\t\t\t\t\tpAd->ApCfg.EntryLifeCheck, the condition will not be\n\t\t\t\t\t\tremoved and we will drop all packets for the pEntry.\n\t\t\t\t\t\tBut maybe the signal becomes better.\n\t\t\t\t\t\tSo we try to send a packet periodically and we will\n\t\t\t\t\t\tget the tx status in tx done interrupt.\n\t\t\t\t\t\tIf the tx status is success, pMacEntry->ContinueTxFailCnt\n\t\t\t\t\t\twill be cleared to 0.\n\t\t\t\t\t*/\n#define ENTRY_RETRY_INTERVAL\t(100 * OS_HZ / 1000)\n\t\t\t\t\tULONG Now32;\n\t\t\t\t    NdisGetSystemUpTime(&Now32);\n\t\t\t\t\tif(RTMP_TIME_BEFORE(Now32, pMacEntry->TimeStamp_toTxRing + ENTRY_RETRY_INTERVAL))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t    NdisGetSystemUpTime(&pMacEntry->TimeStamp_toTxRing);\n\t\t\t\t}\n\t\t\t}\n#ifdef P2P_SUPPORT\n\t\t\t}\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\n\t\t\t/* Early check to make sure we have enoguh Tx Resource.*/\n\t\t\thasTxDesc = RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket);\n\t\t\tif (!hasTxDesc)\n\t\t\t{\n\t\t\t\tpAd->PrivateInfo.TxRingFullCnt++;\n\n\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpTxBlk->TxFrameType = TxPktClassification(pAd, pPacket);\n\t\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t\tpTxBlk->TotalFrameNum++;\n\t\t\tpTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket);\t/* The real fragment number maybe vary*/\n\t\t\tpTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket);\n\t\t\tpTxBlk->pPacket = pPacket;\n#ifdef P2P_SUPPORT\n\t\t\tpTxBlk->OpMode = RTMP_GET_PACKET_OPMODE(pPacket);\n#endif /* P2P_SUPPORT */\n\t\t\tInsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));\n\n\t\t\tif (pTxBlk->TxFrameType & (TX_RALINK_FRAME | TX_AMSDU_FRAME))\n\t\t\t{\n\t\t\t\t// Enhance SW Aggregation Mechanism\n\t\t\t\tif (NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, FreeNumber[QueIdx], pTxBlk->TxFrameType))\n\t\t\t\t{\n\t\t\t\t\tInsertHeadQueue(pQueue, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tif (pTxBlk->TxFrameType == TX_RALINK_FRAME || pTxBlk->TxFrameType == TX_AMSDU_FRAME)\n\t\t\t{\n\t\t\t\t// Enhance SW Aggregation Mechanism\n\t\t\t\tif (NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, FreeNumber[QueIdx], pTxBlk->TxFrameType))\n\t\t\t\t{\n\t\t\t\t\tInsertHeadQueue(pQueue, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdo{\n\t\t\t\t\tif((pEntry = pQueue->Head) == NULL)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t/* For TX_AMSDU_FRAME/TX_RALINK_FRAME, Need to check if next pakcet can do aggregation.*/\n\t\t\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\t\t\t\t\tFreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx);\n\t\t\t\t\thasTxDesc = RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket);\n\t\t\t\t\tif ((hasTxDesc == FALSE) || (CanDoAggregateTransmit(pAd, pPacket, pTxBlk) == FALSE))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t/*Remove the packet from the TxSwQueue and insert into pTxBlk*/\n\t\t\t\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t\t\t\tASSERT(pEntry);\n\t\t\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\n\n\t\t\t\t\tpTxBlk->TotalFrameNum++;\n\t\t\t\t\tpTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket);\t/* The real fragment number maybe vary*/\n\t\t\t\t\tpTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket);\n\t\t\t\t\tInsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\t\t}while(1);\n\n\t\t\t\tif (pTxBlk->TxPacketList.Number == 1)\n\t\t\t\t\tpTxBlk->TxFrameType = TX_LEGACY_FRAME;\n\t\t\t}\n\n#ifdef RTMP_MAC_USB\n\t\t\tDEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);\n#endif /* RTMP_MAC_USB */\n\t\t\t\t\t\n\t\t\tCount += pTxBlk->TxPacketList.Number;\n\n\t\t\t\t/* Do HardTransmit now.*/\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tStatus = APHardTransmit(pAd, pTxBlk, QueIdx);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n#ifdef P2P_SUPPORT\n\t\t\t//if (FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\tif (RTMP_GET_PACKET_OPMODE(pPacket))\n\t\t\t\tStatus = APHardTransmit(pAd, pTxBlk, QueIdx);\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\t\tStatus = STAHardTransmit(pAd, pTxBlk, QueIdx);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\t\t}\n\n\t\tRTMP_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);\n\n#ifdef RTMP_MAC_USB\n\t\tif (!hasTxDesc)\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif ((pAd->MultiChannelFlowCtl & (1 << QueIdx)) != (1 << QueIdx))\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\tRTUSBKickBulkOut(pAd);\n#endif /* RTMP_MAC_USB */\n\t\t\n#ifdef BLOCK_NET_IF\n\t\tif ((pAd->blockQueueTab[QueIdx].SwTxQueueBlockFlag == TRUE)\n\t\t\t&& (pAd->TxSwQueue[QueIdx].Number < 1))\n\t\t{\n\t\t\treleaseNetIf(&pAd->blockQueueTab[QueIdx]);\n\t\t}\n#endif /* BLOCK_NET_IF */\n\n\t}\n\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tCalculates the duration which is required to transmit out frames\n\twith given size and specified rate.\n\t\t\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\tRate\t\t\tTransmit rate\n\t\tSize\t\t\tFrame size in units of byte\n\t\t\n\tReturn Value:\n\t\tDuration number in units of usec\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nUSHORT\tRTMPCalcDuration(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tRate,\n\tIN\tULONG\t\t\tSize)\n{\n\tULONG\tDuration = 0;\n\n\tif (Rate < RATE_FIRST_OFDM_RATE) /* CCK*/\n\t{\n\t\tif ((Rate > RATE_1) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED))\n\t\t\tDuration = 96;\t/* 72+24 preamble+plcp*/\n\t\telse\n\t\t\tDuration = 192; /* 144+48 preamble+plcp*/\n\n\t\tDuration += (USHORT)((Size << 4) / RateIdTo500Kbps[Rate]);\n\t\tif ((Size << 4) % RateIdTo500Kbps[Rate])\n\t\t\tDuration ++;\n\t}\n\telse if (Rate <= RATE_LAST_OFDM_RATE)/* OFDM rates*/\n\t{\n\t\tDuration = 20 + 6;\t\t/* 16+4 preamble+plcp + Signal Extension*/\n\t\tDuration += 4 * (USHORT)((11 + Size * 4) / RateIdTo500Kbps[Rate]);\n\t\tif ((11 + Size * 4) % RateIdTo500Kbps[Rate])\n\t\t\tDuration += 4;\n\t}\n\telse\t/*mimo rate*/\n\t{\n\t\tDuration = 20 + 6;\t\t/* 16+4 preamble+plcp + Signal Extension*/\n\t}\n\t\n\treturn (USHORT)Duration;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tSuspend MSDU transmission\n\t\t\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID RTMPSuspendMsduTransmission(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tDBGPRINT(RT_DEBUG_TRACE,(\"SCANNING, suspend MSDU transmission ...\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT /* Roger sync Carrier */\n\t/* no carrier detection when scanning */\n\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t{\n\t\tCarrierDetectionStop(pAd);\n\t}\n#endif\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\t/*\n\t\tBefore BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and\n\t\tuse Lowbound as R66 value on ScanNextChannel(...)\n\t*/\n\trtmp_bbp_get_agc(pAd, &pAd->BbpTuning.R66CurrentValue, RX_CHAIN_0);\n\n\tpAd->hw_cfg.bbp_bw = pAd->CommonCfg.BBPCurrentBW;\n\n\tRTMPSetAGCInitValue(pAd, BW_20);\n\t\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);\n\t/* abort all TX rings */\n\t/*RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000);\t*/\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tResume MSDU transmission\n\t\t\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID RTMPResumeMsduTransmission(\n\tIN PRTMP_ADAPTER pAd)\n{  \n\tDBGPRINT(RT_DEBUG_TRACE,(\"SCAN done, resume MSDU transmission ...\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT\n\t/* no carrier detection when scanning*/\n\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\t\tCarrierDetectionStart(pAd);\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/*\n\t\tAfter finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value\n\t\tR66 should not be 0\n\t*/\n\tif (pAd->BbpTuning.R66CurrentValue == 0)\n\t{\n\t\tpAd->BbpTuning.R66CurrentValue = 0x38;\n\t\tDBGPRINT_ERR((\"RTMPResumeMsduTransmission, R66CurrentValue=0...\\n\"));\n\t}\n\trtmp_bbp_set_agc(pAd, pAd->BbpTuning.R66CurrentValue, RX_CHAIN_ALL);\n\t\n\tpAd->CommonCfg.BBPCurrentBW = pAd->hw_cfg.bbp_bw;\n\t\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);\n/* sample, for IRQ LOCK to SEM LOCK */\n/*\n\tIrqState = pAd->irq_disabled;\n\tif (IrqState)\n\t\tRTMPDeQueuePacket(pAd, TRUE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\telse\n*/\n\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n}\n\n\n#ifdef DOT11_N_SUPPORT\nUINT deaggregate_AMSDU_announce(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tPNDIS_PACKET\t\tpPacket,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tULONG\t\t\tDataSize,\n\tIN\tUCHAR\t\t\tOpMode)\n{\n\tUSHORT \t\t\tPayloadSize;\n\tUSHORT \t\t\tSubFrameSize;\n\tPHEADER_802_3 \tpAMSDUsubheader;\n\tUINT\t\t\tnMSDU;\n    UCHAR\t\t\tHeader802_3[14];\n\n\tPUCHAR\t\t\tpPayload, pDA, pSA, pRemovedLLCSNAP;\n\tPNDIS_PACKET\tpClonePacket;\n\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR FromWhichBSSID = RTMP_GET_PACKET_IF(pPacket);\n\tUCHAR VLAN_Size;\n\tUSHORT VLAN_VID = 0, VLAN_Priority = 0;\n\n\n\tif ((FromWhichBSSID < pAd->ApCfg.BssidNum)\n#ifdef P2P_SUPPORT\n\t\t&& (OpMode == OPMODE_AP)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t\tVLAN_Size = (pAd->ApCfg.MBSSID[FromWhichBSSID].VLAN_VID != 0) ? LENGTH_802_1Q : 0;\n#ifdef WDS_VLAN_SUPPORT\n\telse if ((FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS) &&\n\t\t\t(FromWhichBSSID < (MIN_NET_DEVICE_FOR_WDS + MAX_WDS_ENTRY)))\n\t{\n\t\tVLAN_Size = (pAd->WdsTab.\\\n\t\t\t\t\t\tWdsEntry[FromWhichBSSID - MIN_NET_DEVICE_FOR_WDS].\\\n\t\t\t\t\t\t\tVLAN_VID != 0) ? LENGTH_802_1Q : 0;\n\t}\n#endif /* WDS_VLAN_SUPPORT */\n\telse /* only MBssid support VLAN.*/\n\t\tVLAN_Size = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tnMSDU = 0;\n\n\twhile (DataSize > LENGTH_802_3)\n\t{\n\n\t\tnMSDU++;\n\n\t\t/*hex_dump(\"subheader\", pData, 64);*/\n\t\tpAMSDUsubheader = (PHEADER_802_3)pData;\n\t\t/*pData += LENGTH_802_3;*/\n\t\tPayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8);\n\t\tSubFrameSize = PayloadSize + LENGTH_802_3;\n\n\n\t\tif ((DataSize < SubFrameSize) || (PayloadSize > 1518 ))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t/*DBGPRINT(RT_DEBUG_TRACE,(\"%d subframe: Size = %d\\n\",  nMSDU, PayloadSize));*/\n\n\t\tpPayload = pData + LENGTH_802_3;\n\t\tpDA = pData;\n\t\tpSA = pData + MAC_ADDR_LEN;\n\n\t\t/* convert to 802.3 header*/\n        CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP);\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((Header802_3[12] == 0x88) && (Header802_3[13] == 0x8E)\n#ifdef P2P_SUPPORT\n\t\t\t&& (OpMode == OPMODE_STA)\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\t/* avoid local heap overflow, use dyanamic allocation */\n\t\t\tMLME_QUEUE_ELEM *Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif (Elem != NULL)\n\t\t\t{\n\t\t\t\tmemmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize);\n\t\t\t\tElem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize;\n\t\t\t\t/*WpaEAPOLKeyAction(pAd, Elem);*/\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, BSSID_WCID, Elem->Msg, Elem->MsgLen, 0, 0, 0, 0, 0, OPMODE_STA);\n/*\t\t\t\tkfree(Elem);*/\n\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (OpMode == OPMODE_AP)\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUCHAR\tWhichBSSID = FromWhichBSSID;\n#ifdef P2P_SUPPORT\n\t\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t\tWhichBSSID = FromWhichBSSID - MIN_NET_DEVICE_FOR_P2P_GO;\n#endif /* P2P_SUPPORT */\n\t\t\tif (pRemovedLLCSNAP)\n\t\t\t{\n\t\t\t\tpPayload -= (LENGTH_802_3 + VLAN_Size);\n\t\t\t\tPayloadSize += (LENGTH_802_3 + VLAN_Size);\n\t\t\t\t/*NdisMoveMemory(pPayload, &Header802_3, LENGTH_802_3);*/\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpPayload -= VLAN_Size;\n\t\t\t\tPayloadSize += VLAN_Size;\n\t\t\t}\n\n\t\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, WhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\t\t\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\t\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\n\t\t\tRT_VLAN_8023_HEADER_COPY(pAd, VLAN_VID, VLAN_Priority,\n\t\t\t\t\t\t\t\t\tHeader802_3, LENGTH_802_3, pPayload,\n\t\t\t\t\t\t\t\t\tFromWhichBSSID, TPID);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t        \tif (pRemovedLLCSNAP)\n\t        \t{\n\t    \t\t\tpPayload -= LENGTH_802_3;\n\t    \t\t\tPayloadSize += LENGTH_802_3;\n\t    \t\t\tNdisMoveMemory(pPayload, &Header802_3[0], LENGTH_802_3);\n\t        \t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tpClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize);\n\t\tif (pClonePacket)\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (OpMode == OPMODE_AP)\n\t\t\t{\n\t\t\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));\n\t\t\t}\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\n\n\t\t/* A-MSDU has padding to multiple of 4 including subframe header.*/\n\t\t/* align SubFrameSize up to multiple of 4*/\n\t\tSubFrameSize = (SubFrameSize+3)&(~0x3);\n\n\n\t\tif (SubFrameSize > 1528 || SubFrameSize < 32)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tif (DataSize > SubFrameSize)\n\t\t{\n\t\t\tpData += SubFrameSize;\n\t\t\tDataSize -= SubFrameSize;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* end of A-MSDU*/\n\t\t\tDataSize = 0;\n\t\t}\n\t}\n\t\n\t/* finally release original rx packet*/\n\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);\n\n\treturn nMSDU;\n}\n\n\nUINT BA_Reorder_AMSDU_Annnounce(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tUCHAR\t\t\tOpMode)\n{\n\tPUCHAR\t\t\tpData;\n\tUSHORT\t\t\tDataSize;\n\tUINT\t\t\tnMSDU = 0;\n\n\tpData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);\n\tDataSize = (USHORT) GET_OS_PKT_LEN(pPacket);\n\n\tnMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize, OpMode);\n\n\treturn nMSDU;\n}\n\nVOID Indicate_AMSDU_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tUINT\t\t\tnMSDU;\n\n\tRTMP_UPDATE_OS_PACKET_INFO(pAd, pRxBlk, FromWhichBSSID);\n\tRTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);\n\tnMSDU = deaggregate_AMSDU_announce(pAd, pRxBlk->pRxPacket, pRxBlk->pData, pRxBlk->DataSize, pRxBlk->OpMode);\n}\n#endif /* DOT11_N_SUPPORT */\n\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID AssocParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,\n\tIN PUCHAR                     pAddr,\n\tIN USHORT                     CapabilityInfo,\n\tIN ULONG                      Timeout,\n\tIN USHORT                     ListenIntv)\n{\n\tCOPY_MAC_ADDR(AssocReq->Addr, pAddr);\n\t/* Add mask to support 802.11b mode only */\n\tAssocReq->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; /* not cf-pollable, not cf-poll-request*/\n\tAssocReq->Timeout = Timeout;\n\tAssocReq->ListenIntv = ListenIntv;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID DisassocParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,\n\tIN PUCHAR pAddr,\n\tIN USHORT Reason)\n{\n\tCOPY_MAC_ADDR(DisassocReq->Addr, pAddr);\n\tDisassocReq->Reason = Reason;\n}\n\n\nBOOLEAN RTMPCheckEtherType(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tPMAC_TABLE_ENTRY pMacEntry,\n\tIN\tUCHAR\t\t\tOpMode,\n\tOUT PUCHAR pUserPriority,\n\tOUT PUCHAR pQueIdx)\n{\n\tUSHORT\tTypeLen;\n\tUCHAR\tByte0, Byte1;\n\tPUCHAR\tpSrcBuf;\n\tUINT32\tpktLen;\n\tUINT16 \tsrcPort, dstPort;\n#ifdef CONFIG_AP_SUPPORT\n\tMULTISSID_STRUCT *pMbss;\n#endif /* CONFIG_AP_SUPPORT */\n\tBOOLEAN bWmmReq;\n\n#ifdef CONFIG_AP_SUPPORT\n/*\tif (IS_ENTRY_CLIENT(pMacEntry))*/\n/*\t\t pMbss = pMacEntry->pMbss;*/\n/*\telse*/\n/*\t\t pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];*/\n#ifdef P2P_SUPPORT\n\tif (OpMode == OPMODE_AP)\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\t/* for APClient, WDS, Mesh, they use MAIN BSS */\n\t\tUCHAR apidx;\n\t\tapidx = RTMP_GET_PACKET_NET_DEVICE(pPacket);\n\t\tif (apidx >= MAX_MBSSID_NUM(pAd))\n\t\t\tapidx = MAIN_MBSSID;\n\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tpMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n#endif /* P2P_SUPPORT */\n\t/*\n\t\tfor bc/mc packets, if it has VLAN tag or DSCP field, we also need\n\t\tto get UP for IGMP use.\n\t*/\n\tbWmmReq = (\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t(\n#ifdef P2P_SUPPORT\n\t\t\t\t(OpMode == OPMODE_AP) &&\n#endif /* P2P_SUPPORT */\n\t\t\t\t(pMbss->bWmmCapable)) || \n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))\n\t\t\t\t&& ((pMacEntry) &&\n\t\t\t\t\t((VALID_WCID(pMacEntry->Aid) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\t\t|| (pMacEntry->Aid == MCAST_WCID)));\n\n\tpSrcBuf = GET_OS_PKT_DATAPTR(pPacket);\n\tpktLen = GET_OS_PKT_LEN(pPacket);\n\n\tASSERT(pSrcBuf);\n\n\tRTMP_SET_PACKET_SPECIFIC(pPacket, 0);\n\t\n\t/* get Ethernet protocol field*/\n\tTypeLen = (pSrcBuf[12] << 8) | pSrcBuf[13];\n\n\tpSrcBuf += LENGTH_802_3;\t/* Skip the Ethernet Header.*/\n\t\n\tif (TypeLen <= 1500)\n\t{\t/* 802.3, 802.3 LLC*/\n\t\t/*\n\t\t\tDestMAC(6) + SrcMAC(6) + Lenght(2) +\n\t\t\tDSAP(1) + SSAP(1) + Control(1) +\n\t\t\tif the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header.\n\t\t\t\t=> + SNAP (5, OriginationID(3) + etherType(2))\n\t\t*/\n\t\tif (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA && pSrcBuf[2] == 0x03)\n\t\t{\n\t\t\tSniff2BytesFromNdisBuffer((PNDIS_BUFFER)pSrcBuf, 6, &Byte0, &Byte1);\n\t\t\tRTMP_SET_PACKET_LLCSNAP(pPacket, 1);\n\t\t\tTypeLen = (USHORT)((Byte0 << 8) + Byte1);\n\t\t\tpSrcBuf += 8; /* Skip this LLC/SNAP header*/\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it.*/\n\t\t}\n\t}\n\t\n\t/* If it's a VLAN packet, get the real Type/Length field.*/\n\tif (TypeLen == 0x8100)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tUSHORT VLAN_VID = 0;\n\n\t\t/* 0x8100 means VLAN packets */\n\n\t\t/* Dest. MAC Address (6-bytes) +\n\t\t   Source MAC Address (6-bytes) +\n\t\t   Length/Type = 802.1Q Tag Type (2-byte) +\n\t\t   Tag Control Information (2-bytes) +\n\t\t   Length / Type (2-bytes) +\n\t\t   data payload (0-n bytes) +\n\t\t   Pad (0-p bytes) +\n\t\t   Frame Check Sequence (4-bytes) */\n\n\t\t/* No matter unicast or multicast */\n\t\t/*if (IS_ENTRY_CLIENT(pMacEntry))*/\n#ifdef WDS_VLAN_SUPPORT\n\t\tif (IS_ENTRY_WDS(pMacEntry))\n\t\t{\n\t\t\tUINT32 WdsId;\n\n\t\t\tWdsId = RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_WDS;\n\t\t\tif (WdsId < MAX_WDS_ENTRY)\n\t\t\t\tVLAN_VID = pAd->WdsTab.WdsEntry[WdsId].VLAN_VID;\n\t\t}\n\t\telse\n#endif /* WDS_VLAN_SUPPORT */\n\t\t{\n\t\t\tVLAN_VID = pMbss->VLAN_VID;\n\t\t}\n\n\t\tif (VLAN_VID != 0)\n\t\t{\n\t\t\t/* check if the packet is my VLAN */\n\t\t\t/* VLAN tag: 3-bit UP + 1-bit CFI + 12-bit VLAN ID */\n\t\t\tUSHORT vlan_id = *(USHORT *)pSrcBuf;\n\n\t\t\tvlan_id = cpu2be16(vlan_id);\n\t\t\tvlan_id = vlan_id & 0x0FFF; /* 12 bit */\n\t\t\tif (vlan_id != VLAN_VID)\n\t\t\t{\n\t\t\t\t/* not my VLAN packet, discard it */\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tRTMP_SET_PACKET_VLAN(pPacket, 1);\n\t\tSniff2BytesFromNdisBuffer((PNDIS_BUFFER)pSrcBuf, 2, &Byte0, &Byte1);\n\t\tTypeLen = (USHORT)((Byte0 << 8) + Byte1);\n\n\t\t/* only use VLAN tag */\n\t\tif (bWmmReq)\n\t\t{\n\t\t\t*pUserPriority = (*pSrcBuf & 0xe0) >> 5;\n\t\t\t*pQueIdx = MapUserPriorityToAccessCategory[*pUserPriority];\n\t\t}\n\n\t\tpSrcBuf += 4; /* Skip the VLAN Header.*/\n\t}\n\telse if (TypeLen == 0x0800)\n\t{\n\t\tif (bWmmReq)\n\t\t{\n\t\t\tif ((*pSrcBuf & 0xf0) == 0x40) /* IPv4 */\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tVersion - 4-bit Internet Protocol version number.\n\t\t\t\t\tLength - 4-bit IP header length.\n\t\t\t\t\tTraffic Class - 8-bit TOS field.\n\t\t\t\t*/\n\t\t\t\t*pUserPriority = (*(pSrcBuf + 1) & 0xe0) >> 5;\n\t\t\t}\n\n\t\t\t*pQueIdx = MapUserPriorityToAccessCategory[*pUserPriority];\n\t\t}\n\t}\n\telse if (TypeLen == 0x86dd)\n\t{\n\t\tif (bWmmReq)\n\t\t{\n\t\t\tif ((*pSrcBuf & 0xf0) == 0x60) /* IPv6 */\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tVersion - 4-bit Internet Protocol version number.\n\t\t\t\t\tTraffic Class - 8-bit traffic class field.\n\t\t\t\t*/\n\t\t\t\t*pUserPriority = ((*pSrcBuf) & 0x0e) >> 1;\n\t\t\t}\n\n\t\t\t*pQueIdx = MapUserPriorityToAccessCategory[*pUserPriority];\n\t\t}\n\t}\n\n\tswitch (TypeLen)\n\t{\n\t\tcase 0x0800:\n\t\t\t{\n\t\t\t\t/* return AC_BE if packet is not IPv4*/\n\t\t\t\tif (bWmmReq && (*pSrcBuf & 0xf0) != 0x40)\n\t\t\t\t{\n\t\t\t\t\t*pUserPriority = 0;\n\t\t\t\t\t*pQueIdx = QID_AC_BE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tRTMP_SET_PACKET_IPV4(pPacket, 1);\n\n\t\t\t\tASSERT((pktLen > 34));\n\t\t\t\tif (*(pSrcBuf + 9) == 0x11)\n\t\t\t\t{\t/* udp packet*/\n\t\t\t\t\tASSERT((pktLen > 34));\t/* 14 for ethernet header, 20 for IP header*/\n\t\t\t\t\t\n\t\t\t\t\tpSrcBuf += 20;\t/* Skip the IP header*/\n\t\t\t\t\tsrcPort = OS_NTOHS(get_unaligned((PUINT16)(pSrcBuf)));\n\t\t\t\t\tdstPort = OS_NTOHS(get_unaligned((PUINT16)(pSrcBuf+2)));\n\t\t\n\t\t\t\t\tif ((srcPort==0x44 && dstPort==0x43) || (srcPort==0x43 && dstPort==0x44))\n\t\t\t\t\t{\t/*It's a BOOTP/DHCP packet*/\n\t\t\t\t\t\tRTMP_SET_PACKET_DHCP(pPacket, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x86dd:\n\t\t\t{\n\t\t\t\t/* return AC_BE if packet is not IPv6 */\n\t\t\t\tif (bWmmReq &&\n\t\t\t\t\t((*pSrcBuf & 0xf0) != 0x60))\n\t\t\t\t{\n\t\t\t\t\t*pUserPriority = 0;\n\t\t\t\t\t*pQueIdx = QID_AC_BE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x0806:\n\t\t\t{\n\t\t\t\t/*ARP Packet.*/\n\t\t\t\tRTMP_SET_PACKET_DHCP(pPacket, 1);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x888e:\n\t\t\t{\n\t\t\t\t/* EAPOL Packet.*/\n\t\t\t\tRTMP_SET_PACKET_EAPOL(pPacket, 1);\n\t\t\t}\n\t\t\tbreak;\n#ifdef WAPI_SUPPORT\n\t\tcase 0x88b4:\n\t\t\t{\n\t\t\t\t/* WAI Packet.*/\n\t\t\t\t/*hex_dump(\"WAI Packet\", pSrcBuf, pktLen);*/\n\t\t\t\tRTMP_SET_PACKET_WAI(pPacket, 1);\n\t\t\t}\n\t\t\tbreak;\n#endif /* WAPI_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tcase 0x890d:\n\t\t\t{\n\t\t\t\tRTMP_SET_PACKET_TDLS(pPacket, 1);\n\t\t\t\t*pUserPriority = 5;\n\t\t\t\t*pQueIdx = QID_AC_VI;\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\tRTMP_SET_PACKET_PROTOCOL(pPacket, TypeLen);\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n\t/* have to check ACM bit. downgrade UP & QueIdx before passing ACM*/\n\t/* NOTE: AP doesn't have to negotiate TSPEC. ACM is controlled purely via user setup, not protocol handshaking*/\n\t/*\n\t\tUnder WMM ACM control, we dont need to check the bit;\n\t\tOr when a TSPEC is built for VO but we will change priority to\n\t\tBE here and when we issue a BA session, the BA session will\n\t\tbe BE session, not VO session.\n\t*/\n\tif (pAd->CommonCfg.APEdcaParm.bACM[*pQueIdx])\n\t{\n\t\t*pUserPriority = 0;\n\t\t*pQueIdx\t\t = QID_AC_BE;\n\t}\n\n\n\treturn TRUE;\n\t\n}\n\n\nVOID Update_Rssi_Sample(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RSSI_SAMPLE *pRssi,\n\tIN RXWI_STRUC *pRxWI)\n{\n\tCHAR rssi[3];\n\tUCHAR snr[3];\n\tBOOLEAN bInitial = FALSE;\n\tCHAR Phymode = get_pkt_phymode_by_rxwi(pRxWI);\n\n \n\tif (!(pRssi->AvgRssi0 | pRssi->AvgRssi0X8 | pRssi->LastRssi0))\n\t{\n\t\tbInitial = TRUE;\n\t}\n\n\tget_pkt_rssi_by_rxwi(pAd, pRxWI, 3, &rssi[0]);\n\tget_pkt_snr_by_rxwi(pAd, pRxWI, 3, &snr[0]);\n\tif (rssi[0] != 0)\n\t{\n\t\tpRssi->LastRssi0 = ConvertToRssi(pAd, (CHAR)rssi[0], RSSI_0, pRxWI->RxWISNR1, pRxWI->RxWIBW);\n\t\tif (bInitial)\n\t\t{\n\t\t\tpRssi->AvgRssi0X8 = pRssi->LastRssi0 << 3;\n\t\t\tpRssi->AvgRssi0  = pRssi->LastRssi0;\n\t\t}\n\t\telse\n\t\t\tpRssi->AvgRssi0X8 = (pRssi->AvgRssi0X8 - pRssi->AvgRssi0) + pRssi->LastRssi0;\n \n\t\tpRssi->AvgRssi0 = pRssi->AvgRssi0X8 >> 3;\n\t}\n\n\tif (snr[0] != 0 && Phymode != MODE_CCK)\n\t{\t\t\t\n\t\tpRssi->LastSnr0 = ConvertToSnr(pAd, (UCHAR)snr[0]);\n\t\tif (bInitial)\n\t\t{\n\t\t\tpRssi->AvgSnr0X8 = pRssi->LastSnr0 << 3;\n\t\t\tpRssi->AvgSnr0  = pRssi->LastSnr0;\n\t\t}\n\t\telse\n\t\t\tpRssi->AvgSnr0X8 = (pRssi->AvgSnr0X8 - pRssi->AvgSnr0) + pRssi->LastSnr0;\n\n\t\tpRssi->AvgSnr0 = pRssi->AvgSnr0X8 >> 3;\n\t}\n \n\tif (rssi[1] != 0)\n\t{   \n\t\tpRssi->LastRssi1 = ConvertToRssi(pAd, (CHAR)rssi[1], RSSI_1, pRxWI->RxWISNR1, pRxWI->RxWIBW);\n\t\tif (bInitial)\n\t\t{\n\t\t\tpRssi->AvgRssi1X8 = pRssi->LastRssi1 << 3;\n\t\t\tpRssi->AvgRssi1  = pRssi->LastRssi1;\n\t\t}\n\t\telse\n\t\t\tpRssi->AvgRssi1X8 = (pRssi->AvgRssi1X8 - pRssi->AvgRssi1) + pRssi->LastRssi1;\n\n\t\tpRssi->AvgRssi1 = pRssi->AvgRssi1X8 >> 3;\n\t}\n\n\tif (snr[1] != 0 && Phymode != MODE_CCK)\n\t{\t\t\t\n\t\tpRssi->LastSnr1 = ConvertToSnr(pAd, (UCHAR)snr[1]);\n\t\tif (bInitial)\n\t\t{\n\t\t\tpRssi->AvgSnr1X8 = pRssi->LastSnr1 << 3;\n\t\t\tpRssi->AvgSnr1  = pRssi->LastSnr1;\n\t\t}\n\t\telse\n\t\t\tpRssi->AvgSnr1X8 = (pRssi->AvgSnr1X8 - pRssi->AvgSnr1) + pRssi->LastSnr1;\n\t\t\n\t\tpRssi->AvgSnr1 = pRssi->AvgSnr1X8 >> 3;\n\t}\n\n\tif (rssi[2] != 0)\n\t{\n\t\tpRssi->LastRssi2 = ConvertToRssi(pAd, (CHAR)rssi[2], RSSI_2, pRxWI->RxWISNR1, pRxWI->RxWIBW);\n\n\t\tif (bInitial)\n\t\t{\n\t\t\tpRssi->AvgRssi2X8 = pRssi->LastRssi2 << 3;\n\t\t\tpRssi->AvgRssi2  = pRssi->LastRssi2;\n\t\t}\n\t\telse\n\t\t\tpRssi->AvgRssi2X8 = (pRssi->AvgRssi2X8 - pRssi->AvgRssi2) + pRssi->LastRssi2;\n\n\t\tpRssi->AvgRssi2 = pRssi->AvgRssi2X8 >> 3;\n\t}\n}\n\n\n\n/* Normal legacy Rx packet indication*/\nVOID Indicate_Legacy_Packet(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tUCHAR Header802_3[LENGTH_802_3];\n\tUSHORT VLAN_VID = 0, VLAN_Priority = 0;\n\n\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"Indicate_Legacy_Packet\", pRxBlk->pData, pRxBlk->DataSize);\n\thex_dump(\"802_11_hdr\", (UCHAR *)pRxBlk->pHeader, LENGTH_802_11);\n}\n//---Add by shiang for debug\n\n\t/*\n\t\t1. get 802.3 Header\n\t\t2. remove LLC\n\t\t\ta. pointer pRxBlk->pData to payload\n\t\t\tb. modify pRxBlk->DataSize\n\t*/\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tRTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tRTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n\t}\n\telse\n\t{\n\t\tRTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tRTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pRxBlk->DataSize > MAX_RX_PKT_LEN)\n\t{\n\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\tSTATS_INC_RX_PACKETS(pAd, FromWhichBSSID);\n\n#ifdef RTMP_MAC_USB\n#ifdef DOT11_N_SUPPORT\n\tif (pAd->CommonCfg.bDisableReordering == 0)\n\t{\n\t\tPBA_REC_ENTRY\t\tpBAEntry;\n\t\tULONG\t\t\t\tNow32;\n\t\tUCHAR\t\t\t\tWcid = pRxBlk->pRxWI->RxWIWirelessCliID;\n\t\tUCHAR\t\t\t\tTID = pRxBlk->pRxWI->RxWITID;\n\t\tUSHORT\t\t\t\tIdx;\n\t\t\n#define REORDERING_PACKET_TIMEOUT\t\t((100 * OS_HZ)/1000)\t/* system ticks -- 100 ms*/\n\n\t\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t\t{\n\t\t\tIdx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n\t\t\tif (Idx != 0)\n\t\t\t{\n\t\t\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t\t\t\t/* update last rx time*/\n\t\t\t\tNdisGetSystemUpTime(&Now32);\n\t\t\t\tif ((pBAEntry->list.qlen > 0) &&\n\t\t\t\t\t RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))\n\t   \t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Indicate_Legacy_Packet():flush reordering_timeout_mpdus! RxWI->Flags=%d, pRxWI.TID=%d, RxD->AMPDU=%d!\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\tpRxBlk->Flags, pRxBlk->pRxWI->RxWITID, pRxBlk->pRxInfo->AMPDU));\n\t\t\t\t\thex_dump(\"Dump the legacy Packet:\", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), 64);\n\t\t\t\t\tba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_AP_SUPPORT\n\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"Before80211_2_8023\", pRxBlk->pData, pRxBlk->DataSize);\n\thex_dump(\"header802_3\", &Header802_3[0], LENGTH_802_3);\n}\n//---Add by shiang for debug\n\tRT_80211_TO_8023_PACKET(pAd, VLAN_VID, VLAN_Priority,\n\t\t\t\t\t\t\tpRxBlk, Header802_3, FromWhichBSSID, TPID);\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"After80211_2_8023\", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), GET_OS_PKT_LEN(pRxBlk->pRxPacket));\n}\n//---Add by shiang for debug\n\n\t\n\t/* pass this 802.3 packet to upper layer or forward this packet to WM directly*/\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tUCHAR\tWhichBSSID = FromWhichBSSID;\n\t\t\n\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tWhichBSSID = FromWhichBSSID - MIN_NET_DEVICE_FOR_P2P_GO;\n\n\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, WhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\t\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n\t}\n\telse\n\t{\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\n/* Normal legacy Rx packet indication*/\nVOID Indicate_Legacy_Packet_Hdr_Trns(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tUCHAR Header802_3[LENGTH_802_3];\n\tUSHORT VLAN_VID = 0, VLAN_Priority = 0;\n\n\tstruct sk_buff *pOSPkt;\n\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"Indicate_Legacy_Packet\", pRxBlk->pTransData, pRxBlk->TransDataSize);\n\thex_dump(\"802_11_hdr\", pRxBlk->pHeader, LENGTH_802_11);\n}\n//---Add by shiang for debug\n\n\t/*\n\t\t1. get 802.3 Header\n\t\t2. remove LLC\n\t\t\ta. pointer pRxBlk->pData to payload\n\t\t\tb. modify pRxBlk->DataSize\n\t*/\n\n\tif (pRxBlk->TransDataSize > 1514 )\n\t{\n\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\n\tSTATS_INC_RX_PACKETS(pAd, FromWhichBSSID);\n\n#ifdef RTMP_MAC_USB\n#ifdef DOT11_N_SUPPORT\n\tif (pAd->CommonCfg.bDisableReordering == 0)\n\t{\n\t\tPBA_REC_ENTRY\t\tpBAEntry;\n\t\tULONG\t\t\t\tNow32;\n\t\tUCHAR\t\t\t\tWcid = pRxBlk->pRxWI->RxWIWirelessCliID;\n\t\tUCHAR\t\t\t\tTID = pRxBlk->pRxWI->RxWITID;\n\t\tUSHORT\t\t\t\tIdx;\n\t\t\n#define REORDERING_PACKET_TIMEOUT\t\t((100 * OS_HZ)/1000)\t/* system ticks -- 100 ms*/\n\n\t\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t\t{\n\t\t\tIdx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];\n\t\t\tif (Idx != 0)\n\t\t\t{\n\t\t\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t\t\t\t/* update last rx time*/\n\t\t\t\tNdisGetSystemUpTime(&Now32);\n\t\t\t\tif ((pBAEntry->list.qlen > 0) &&\n\t\t\t\t\t RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))\n\t   \t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Indicate_Legacy_Packet():flush reordering_timeout_mpdus! RxWI->Flags=%d, pRxWI.TID=%d, RxD->AMPDU=%d!\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\tpRxBlk->Flags, pRxBlk->pRxWI->RxWITID, pRxBlk->pRxInfo->AMPDU));\n\t\t\t\t\thex_dump(\"Dump the legacy Packet:\", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), 64);\n\t\t\t\t\tba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_AP_SUPPORT\n\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"Before80211_2_8023\", pRxBlk->pData, pRxBlk->TransDataSize);\n\thex_dump(\"header802_3\", &Header802_3[0], LENGTH_802_3);\n}\n//---Add by shiang for debug\n\n\n\n\n\n\tRtmpOsSetPacket(get_netdev_from_bssid(pAd, FromWhichBSSID), pRxPacket, pRxBlk->pTransData, pRxBlk->TransDataSize);\n\n\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"After80211_2_8023\", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), GET_OS_PKT_LEN(pRxBlk->pRxPacket));\n}\n//---Add by shiang for debug\n\n\n\t/* pass this 802.3 packet to upper layer or forward this packet to WM directly*/\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tUCHAR\tWhichBSSID = FromWhichBSSID;\n\t\t\n\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tWhichBSSID = FromWhichBSSID - MIN_NET_DEVICE_FOR_P2P_GO;\n\n\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, WhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\t\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n\t}\n\telse\n\t{\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\n/* Normal, AMPDU or AMSDU*/\nVOID CmmRxnonRalinkFrameIndicate(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n#ifdef DOT11_N_SUPPORT\n\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0))\n\t{\n\t\tIndicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))\n\t\t{\n\t\t\t/* handle A-MSDU*/\n\t\t\tIndicate_AMSDU_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t}\n\t}\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID CmmRxnonRalinkFrameIndicate_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n#ifdef DOT11_N_SUPPORT\n\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0))\n\t{\n\t\tIndicate_AMPDU_Packet_Hdr_Trns(pAd, pRxBlk, FromWhichBSSID);\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))\n\t\t{\n\t\t\t/* handle A-MSDU*/\n\t\t\tIndicate_AMSDU_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tIndicate_Legacy_Packet_Hdr_Trns(pAd, pRxBlk, FromWhichBSSID);\n\t\t}\n\t}\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID CmmRxRalinkFrameIndicate(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tUCHAR\t\t\tHeader802_3[LENGTH_802_3];\n\tUINT16\t\t\tMsdu2Size;\n\tUINT16 \t\t\tPayload1Size, Payload2Size;\n\tPUCHAR \t\t\tpData2;\n\tPNDIS_PACKET\tpPacket2 = NULL;\n\tUSHORT\t\t\tVLAN_VID = 0, VLAN_Priority = 0;\n\n\n\tMsdu2Size = *(pRxBlk->pData) + (*(pRxBlk->pData+1) << 8);\n\n\tif ((Msdu2Size <= 1536) && (Msdu2Size < pRxBlk->DataSize))\n\t{\n\t\t/* skip two byte MSDU2 len */\n\t\tpRxBlk->pData += 2;\n\t\tpRxBlk->DataSize -= 2;\n\t}\n\telse\n\t{\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\t/* get 802.3 Header and  remove LLC*/\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tRTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tRTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n\t}\n\telse\n\t{\n\t\tRTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tRTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\tASSERT(pRxBlk->pRxPacket);\n\n\t/* Ralink Aggregation frame*/\n\tpAd->RalinkCounters.OneSecRxAggregationCount ++;\n\tPayload1Size = pRxBlk->DataSize - Msdu2Size;\n\tPayload2Size = Msdu2Size - LENGTH_802_3;\n\n\tpData2 = pRxBlk->pData + Payload1Size + LENGTH_802_3;\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tUSHORT VLAN_VID = 0, VLAN_Priority = 0;\n\n\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#ifdef WDS_VLAN_SUPPORT\n\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\n\t\tRT_VLAN_PKT_DUPLICATE(pPacket2, pAd, VLAN_VID, VLAN_Priority,\n\t\t\t\t\t\t\t(pData2-LENGTH_802_3), LENGTH_802_3, pData2,\n\t\t\t\t\t\t\tPayload2Size, FromWhichBSSID, TPID);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\t/* pPacket2 = duplicate_pkt_with_VLAN(pAd, (pData2-LENGTH_802_3), LENGTH_802_3, pData2, Payload2Size, FromWhichBSSID, TPID); */\n\t\tRT_VLAN_PKT_DUPLICATE(pPacket2, pAd, VLAN_VID, VLAN_Priority, \n\t\t\t\t\t\t\t(pData2-LENGTH_802_3), LENGTH_802_3, pData2, \n\t\t\t\t\t\t\tPayload2Size, FromWhichBSSID, TPID);\n\t}\n\telse\n\t{\n\t\tpPacket2 = duplicate_pkt(get_netdev_from_bssid(pAd, FromWhichBSSID),\n\t\t\t\t\t\t\t\t(pData2-LENGTH_802_3), LENGTH_802_3, pData2,\n\t\t\t\t\t\t\t\tPayload2Size, FromWhichBSSID);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tpPacket2 = duplicate_pkt(get_netdev_from_bssid(pAd, FromWhichBSSID),\n\t\t\t\t\t\t\t\t(pData2-LENGTH_802_3), LENGTH_802_3, pData2,\n\t\t\t\t\t\t\t\tPayload2Size, FromWhichBSSID);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (!pPacket2)\n\t{\n\t\t/* release packet*/\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\t/* update payload size of 1st packet*/\n\tpRxBlk->DataSize = Payload1Size;\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n#endif /* P2P_SUPPORT */\n\t{\n\t\tMBSS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n\n#ifdef WDS_VLAN_SUPPORT\n\t\tif (VLAN_VID == 0) /* maybe WDS packet */\n\t\t\tWDS_VLAN_INFO_GET(pAd, VLAN_VID, VLAN_Priority, FromWhichBSSID);\n#endif /* WDS_VLAN_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\tRT_80211_TO_8023_PACKET(pAd, VLAN_VID, VLAN_Priority,\n\t\t\t\t\t\t\tpRxBlk, Header802_3, FromWhichBSSID, TPID);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket, FromWhichBSSID);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket, FromWhichBSSID);\n\t}\n\telse\n\t{\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket, FromWhichBSSID);\n\t}\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket, FromWhichBSSID);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pPacket2)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t{\n\t\tAP_ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID);\n\t}\n\telse\n\t{\n\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID);\n\t}\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n}\n\n\n#define RESET_FRAGFRAME(_fragFrame) \\\n\t{\t\t\t\t\t\t\t\t\\\n\t\t_fragFrame.RxSize = 0;\t\t\\\n\t\t_fragFrame.Sequence = 0;\t\\\n\t\t_fragFrame.LastFrag = 0;\t\\\n\t\t_fragFrame.Flags = 0;\t\t\\\n\t}\n\n\nPNDIS_PACKET RTMPDeFragmentDataFrame(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tHEADER_802_11 *pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tUCHAR *pData = pRxBlk->pData;\n\tUSHORT DataSize = pRxBlk->DataSize;\n\tPNDIS_PACKET pRetPacket = NULL;\n\tUCHAR *pFragBuffer = NULL;\n\tBOOLEAN bReassDone = FALSE;\n\tUCHAR HeaderRoom = 0;\n\n\n\tASSERT(pHeader);\n\n\tHeaderRoom = pData - (UCHAR *)pHeader;\n\n\t/* Re-assemble the fragmented packets*/\n\tif (pHeader->Frag == 0)\t\t/* Frag. Number is 0 : First frag or only one pkt*/\n\t{\n\t\t/* the first pkt of fragment, record it.*/\n\t\tif (pHeader->FC.MoreFrag)\n\t\t{\n\t\t\tASSERT(pAd->FragFrame.pFragPacket);\n\t\t\tpFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket);\n\t\t\tpAd->FragFrame.RxSize   = DataSize + HeaderRoom;\n\t\t\tNdisMoveMemory(pFragBuffer,\t pHeader, pAd->FragFrame.RxSize);\n\t\t\tpAd->FragFrame.Sequence = pHeader->Sequence;\n\t\t\tpAd->FragFrame.LastFrag = pHeader->Frag;\t   /* Should be 0*/\n\t\t\tASSERT(pAd->FragFrame.LastFrag == 0);\n\t\t\tgoto done;\t/* end of processing this frame*/\n\t\t}\n\t}\n\telse\t/*Middle & End of fragment*/\n\t{\n\t\tif ((pHeader->Sequence != pAd->FragFrame.Sequence) ||\n\t\t\t(pHeader->Frag != (pAd->FragFrame.LastFrag + 1)))\n\t\t{\n\t\t\t/* Fragment is not the same sequence or out of fragment number order*/\n\t\t\t/* Reset Fragment control blk*/\n\t\t\tRESET_FRAGFRAME(pAd->FragFrame);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Fragment is not the same sequence or out of fragment number order.\\n\"));\n\t\t\tgoto done; /* give up this frame*/\n\t\t}\n\t\telse if ((pAd->FragFrame.RxSize + DataSize) > MAX_FRAME_SIZE)\n\t\t{\n\t\t\t/* Fragment frame is too large, it exeeds the maximum frame size.*/\n\t\t\t/* Reset Fragment control blk*/\n\t\t\tRESET_FRAGFRAME(pAd->FragFrame);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Fragment frame is too large, it exeeds the maximum frame size.\\n\"));\n\t\t\tgoto done; /* give up this frame*/\n\t\t}\n\n        \n\t\t/* Broadcom AP(BCM94704AGR) will send out LLC in fragment's packet, LLC only can accpet at first fragment.*/\n\t\t/* In this case, we will dropt it.*/\n\t\t\n\t\tif (NdisEqualMemory(pData, SNAP_802_1H, sizeof(SNAP_802_1H)))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Find another LLC at Middle or End fragment(SN=%d, Frag=%d)\\n\", pHeader->Sequence, pHeader->Frag));\n\t\t\tgoto done; /* give up this frame*/\n\t\t}\n\n\t\tpFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket);\n\n\t\t/* concatenate this fragment into the re-assembly buffer*/\n\t\tNdisMoveMemory((pFragBuffer + pAd->FragFrame.RxSize), pData, DataSize);\n\t\tpAd->FragFrame.RxSize  += DataSize;\n\t\tpAd->FragFrame.LastFrag = pHeader->Frag;\t   /* Update fragment number*/\n\n\t\t/* Last fragment*/\n\t\tif (pHeader->FC.MoreFrag == FALSE)\n\t\t{\n\t\t\tbReassDone = TRUE;\n\t\t}\n\t}\n\ndone:\n\t/* always release rx fragmented packet*/\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\n\t/* return defragmented packet if packet is reassembled completely*/\n\t/* otherwise return NULL*/\n\tif (bReassDone)\n\t{\n\t\tPNDIS_PACKET pNewFragPacket;\n\n\t\t/* allocate a new packet buffer for fragment*/\n\t\tpNewFragPacket = RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);\n\t\tif (pNewFragPacket)\n\t\t{\n\t\t\t/* update RxBlk*/\n\t\t\tpRetPacket = pAd->FragFrame.pFragPacket;\n\t\t\tpAd->FragFrame.pFragPacket = pNewFragPacket;\n\t\t\tpRxBlk->pHeader = (PHEADER_802_11) GET_OS_PKT_DATAPTR(pRetPacket);\n\t\t\tpRxBlk->pData = (UCHAR *)pRxBlk->pHeader + HeaderRoom;\n\t\t\tpRxBlk->DataSize = pAd->FragFrame.RxSize - HeaderRoom;\n\t\t\tpRxBlk->pRxPacket = pRetPacket;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRESET_FRAGFRAME(pAd->FragFrame);\n\t\t}\n\t}\n\n\treturn pRetPacket;\n}\n\n\nVOID Indicate_EAPOL_Packet(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\tif (pRxBlk->pRxWI->RxWIWirelessCliID >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Indicate_EAPOL_Packet: invalid wcid.\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\tpEntry = &pAd->MacTab.Content[pRxBlk->pRxWI->RxWIWirelessCliID];\n\tif (pEntry == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Indicate_EAPOL_Packet: drop and release the invalid packet.\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\t\t\n\t\tAPRxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (IS_PKT_OPMODE_AP(pRxBlk))\n\t\t{\t\n\t\t\tAPRxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tASSERT((pRxBlk->pRxWI->RxWIWirelessCliID == BSSID_WCID));\n\t\t\tSTARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n\n\n#define BCN_TBTT_OFFSET\t\t64\t/*defer 64 us*/\nVOID ReSyncBeaconTime(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tUINT32  Offset;\n\n\n\tOffset = (pAd->TbttTickCount) % (BCN_TBTT_OFFSET);\n\tpAd->TbttTickCount++;\n\n\t/*\n\t\tThe updated BeaconInterval Value will affect Beacon Interval after two TBTT\n\t\tbeacasue the original BeaconInterval had been loaded into next TBTT_TIMER\n\t*/\n\tif (Offset == (BCN_TBTT_OFFSET-2))\n\t{\n\t\tBCN_TIME_CFG_STRUC csr;\n\t\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);\n\t\tcsr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod << 4) - 1 ;\t/* ASIC register in units of 1/16 TU = 64us*/\n\t\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);\n\t}\n\telse\n\t{\n\t\tif (Offset == (BCN_TBTT_OFFSET-1))\n\t\t{\n\t\t\tBCN_TIME_CFG_STRUC csr;\n\n\t\t\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);\n\t\t\tcsr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod) << 4; /* ASIC register in units of 1/16 TU*/\n\t\t\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);\n\t\t}\n\t}\n}\n\n#ifdef SOFT_ENCRYPT\nBOOLEAN RTMPExpandPacketForSwEncrypt(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tPTX_BLK\t\t\tpTxBlk)\n{\n\tPACKET_INFO\t\tPacketInfo;\n\tUINT32\tex_head = 0, ex_tail = 0;\n\tUCHAR \tNumberOfFrag = RTMP_GET_PACKET_FRAGMENTS(pTxBlk->pPacket);\n\n#ifdef WAPI_SUPPORT\n\tif (pTxBlk->CipherAlg == CIPHER_SMS4)\n\t\tex_tail = LEN_WPI_MIC;\n\telse\n#endif /* WAPI_SUPPORT */\t\t\t\n\tif (pTxBlk->CipherAlg == CIPHER_AES)\n\t\tex_tail = LEN_CCMP_MIC;\n\n\tex_tail = (NumberOfFrag * ex_tail);\n\n\tpTxBlk->pPacket = ExpandPacket(pAd, pTxBlk->pPacket, ex_head, ex_tail);\n\tif (pTxBlk->pPacket == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: out of resource.\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\tRTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen);\t\t\t\t\t\t\t\t\t\n\n\treturn TRUE;\n}\n\nVOID RTMPUpdateSwCacheCipherInfo(\t\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tPTX_BLK\t\t\tpTxBlk,\n\tIN\tPUCHAR\t\t\tpHdr)\n{\n\tPHEADER_802_11 \t\tpHeader_802_11;\n\tPMAC_TABLE_ENTRY\tpMacEntry;\n\n\tpHeader_802_11 = (HEADER_802_11 *) pHdr;\n\tpMacEntry = pTxBlk->pMacEntry;\n\n\tif (pMacEntry && pHeader_802_11->FC.Wep && \n\t\tCLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT))\t\n\t{\n\t\tPCIPHER_KEY pKey = &pMacEntry->PairwiseKey;\n\t\n\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bSwEncrypt);\n\n\t\tpTxBlk->CipherAlg = pKey->CipherAlg;\n\t\tpTxBlk->pKey = pKey;\n#ifdef WAPI_SUPPORT\n\t\tpTxBlk->KeyIdx = pMacEntry->usk_id;\n\n\t\t/* TSC increment pre encryption transmittion */\n\t\tif (pKey->CipherAlg == CIPHER_SMS4)\t\t\t\t\t\t\n\t\t\tinc_iv_byte(pKey->TxTsc, LEN_WAPI_TSC, 2);\t\t\t\n\t\telse \n#endif /* WAPI_SUPPORT */\t\t\n\t\tif ((pKey->CipherAlg == CIPHER_WEP64) || (pKey->CipherAlg == CIPHER_WEP128))\n\t\t\tinc_iv_byte(pKey->TxTsc, LEN_WEP_TSC, 1);\n\t\telse if ((pKey->CipherAlg == CIPHER_TKIP) || (pKey->CipherAlg == CIPHER_AES))\n\t\t\tinc_iv_byte(pKey->TxTsc, LEN_WPA_TSC, 1);\n\t\t\n\t}\n\n}\n\n#endif /* SOFT_ENCRYPT */\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tSend out a NULL frame to a specified STA at a higher TX rate. The \n\t\tpurpose is to ensure the designated client is okay to received at this\n\t\trate.\n\t==========================================================================\n */\nVOID RtmpEnqueueNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR        pAddr,\n\tIN UCHAR         TxRate,\n\tIN UCHAR         PID,\n\tIN UCHAR         apidx,\n    IN BOOLEAN       bQosNull,\n    IN BOOLEAN       bEOSP,\n    IN UCHAR         OldUP)\n{\n#ifdef DOT11Z_TDLS_SUPPORT\n\tMAC_TABLE_ENTRY *pEntry;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\tNDIS_STATUS    NState;\n\tPHEADER_802_11 pNullFr;\n\tPUCHAR pFrame;\n\tULONG\t\t   Length;\n\n\t/* since TxRate may change, we have to change Duration each time */\n\tNState = MlmeAllocateMemory(pAd, (PUCHAR *)&pFrame);\n\tpNullFr = (PHEADER_802_11) pFrame;\n    Length = sizeof(HEADER_802_11);\n\n\tif (NState == NDIS_STATUS_SUCCESS) \n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tMgtMacHeaderInit(pAd, pNullFr, SUBTYPE_NULL_FUNC, 0, pAddr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid);\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tpNullFr->FC.Type = BTYPE_DATA;\n\t\tpNullFr->FC.FrDs = 1;\n\t\tpNullFr->Duration = RTMPCalcDuration(pAd, TxRate, 14);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tpEntry = MacTableLookup(pAd, pAddr);\n\t\tif ((pEntry != NULL) && (IS_ENTRY_TDLS(pEntry)))\n\t\t{\n\t\t\tpNullFr->FC.FrDs = 0;\n\t\t\tpNullFr->FC.ToDs = 0;\n\n\t\t\tCOPY_MAC_ADDR(pNullFr->Addr1, pAddr);\n\t\t\tCOPY_MAC_ADDR(pNullFr->Addr2, pAd->CurrentAddress);\n\t\t\tCOPY_MAC_ADDR(pNullFr->Addr3, pAd->CommonCfg.Bssid);\n\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef UAPSD_SUPPORT\n\t\tif (bQosNull)\n\t\t{\n\t\t\tUCHAR *qos_p = ((UCHAR *)pNullFr) + Length;\n\n\t\t\tpNullFr->FC.SubType = SUBTYPE_QOS_NULL;\n\n\t\t\t/* copy QOS control bytes */\n\t\t\tqos_p[0] = ((bEOSP) ? (1 << 4) : 0) | OldUP;\n\t\t\tqos_p[1] = 0;\n\t\t\tLength += 2;\n\t\t} /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"send NULL Frame @%d Mbps to AID#%d...\\n\", RateIdToMbps[TxRate], PID & 0x3f));\n\t\tMiniportMMRequest(pAd, MapUserPriorityToAccessCategory[7], (PUCHAR)pNullFr, Length);\n\t\tMlmeFreeMemory(pAd, pFrame);\n\t}\n}\n\n#ifdef P2P_SUPPORT\nBOOLEAN RxDoneInterruptHandle(\n\tIN RTMP_ADAPTER *pAd) \n{\n\tUINT32 RxProcessed, RxPending;\n\tBOOLEAN bReschedule = FALSE;\n\tUCHAR *pData;\n\tRXWI_STRUC *pRxWI;\n\tPNDIS_PACKET\tpRxPacket;\n\tPHEADER_802_11\tpHeader;\n\tRX_BLK\t\t\tRxBlk, *pRxBlk;\n//#ifdef CONFIG_AP_SUPPORT\n//\tMULTISSID_STRUCT *pMbss;\n//#endif // CONFIG_AP_SUPPORT //\n\tRXD_STRUC *pRxD;\n\tUINT8 RXWISize = pAd->chipCap.RXWISize;\n\n#ifdef LINUX\n#endif // LINUX //\n\n\tRxProcessed = RxPending = 0;\n\n\t// process whole rx ring\n\twhile (1)\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST) ||\n\t\t\t!RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_START_UP))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_TIMING_RECORD_INDEX(RxProcessed);\n#endif // UAPSD_SUPPORT //\n\n\n\t\t/*\n\t\t\t1. allocate a new data packet into rx ring to replace received packet \n\t\t\t\tthen processing the received packet\n\t\t\t2. the callee must take charge of release of packet\n\t\t\t3. As far as driver is concerned, the rx packet must \n\t\t\t\ta. be indicated to upper layer or \n\t\t\t\tb. be released if it is discarded\n\t\t*/\n\n\t\tpRxBlk = &RxBlk;\n\t\tpRxPacket = GetPacketFromRxRing(pAd, pRxBlk, &bReschedule, &RxPending);\n\t\tif (pRxPacket == NULL)\n\t\t\tbreak;\n\n\t\t/* get rx ring descriptor and data buffer */\n\t\tpRxD = &(RxBlk.hw_rx_info[0]);\n\t\tpData = GET_OS_PKT_DATAPTR(pRxPacket);\n\t\tpRxWI = (RXWI_STRUC *) pData;\n\t\tpHeader = (PHEADER_802_11) (pData + RXWISize) ;\n\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, (PUCHAR)pHeader, DIR_READ, TRUE);\n\t\tRTMPWIEndianChange(pAd, (PUCHAR)pRxWI, TYPE_RXWI);\n#endif\n\t\t// build RxBlk\n\t\tpRxBlk->pRxWI = pRxWI;\n\t\tpRxBlk->pHeader = pHeader;\n\t\tpRxBlk->pRxPacket = pRxPacket;\n\t\tpRxBlk->pData = (UCHAR *) pHeader;\n\t\tpRxBlk->DataSize = pRxWI->RxWIMPDUByteCnt;\n\t\tpRxBlk->Flags = 0;\n\n\t\t// Increase Total receive byte counter after real data received no mater any error or not\n\t\tpAd->RalinkCounters.ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.OneSecReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.RxCount ++;\n\t\tpAd->RalinkCounters.OneSecRxCount ++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\tINC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);\n#endif // STATS_COUNT_SUPPORT //\n\n\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tif (NdisEqualMemory(pAd->P2PCurrentAddress, pHeader->Addr1, MAC_ADDR_LEN) ||\n\t\t\t\t(pHeader->FC.SubType == SUBTYPE_PROBE_REQ) ||\n\t\t\t\t(pHeader->FC.SubType == SUBTYPE_BEACON\n\t\t\t\t\t&& NdisEqualMemory(pAd->ApCfg.ApCliTab[0].CfgApCliBssid, pHeader->Addr2, MAC_ADDR_LEN)) ||\n\t\t\t\tNdisEqualMemory(pAd->ApCliMlmeAux.Bssid, pHeader->Addr2, MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\tbReschedule = APHandleRxDonePacket(pAd, pRxPacket, pRxBlk);\n\t\t\t}\n\t\t\telse\n\t\t\t\tbReschedule = STAHandleRxDonePacket(pAd, pRxPacket, pRxBlk);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbReschedule = STAHandleRxDonePacket(pAd, pRxPacket, pRxBlk);\n\t\t}\n\t}\n\n#ifdef UAPSD_SUPPORT\n\t/* dont remove the function or UAPSD will fail */\n\tUAPSD_MR_SP_RESUME(pAd);\n    UAPSD_SP_CloseInRVDone(pAd);\n#endif // UAPSD_SUPPORT //\n\n\treturn bReschedule;\n}\n#endif /* P2P_SUPPORT */\n\n\n#ifdef RLT_MAC\nBOOLEAN CmdRspEventCallbackHandle(PRTMP_ADAPTER pAd, PUCHAR pRspBuffer)\n{\n\n\tINT32 Ret;\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\tstruct CMD_RSP_EVENT *CmdRspEvent, *CmdRspEventTmp;\n\tRXFCE_INFO_CMD *pFceInfo = (RXFCE_INFO_CMD *)pRspBuffer;\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPDescriptorEndianChange((PUCHAR)pFceInfo, TYPE_RXINFO);\n#endif\n\n\n\tif ((pFceInfo->info_type != CMD_PACKET))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Packet is not command response/event\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t} \n\n\tif (pFceInfo->self_gen)\n\t{\n\t\t/* if have callback function */\n\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESPONSE_EVENT_CALLBACK, \n\t\t\t\t\t\t\t\t\tpRspBuffer, \n\t\t\t\t\t\t\t\t\tsizeof(*pFceInfo) + pFceInfo->pkt_len);\n\t}\n\telse\n\t{\n\t\tunsigned long IrqFlags;\n\t\tRTMP_IRQ_LOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t\tDlListForEachSafe(CmdRspEvent, CmdRspEventTmp, &MCtrl->CmdRspEventList, struct CMD_RSP_EVENT, List)\n\t\t{\n\t\t\tif (CmdRspEvent->CmdSeq == pFceInfo->cmd_seq)\n\t\t\t{\n\t\t\t\t\n\t\t\t\tif ((*CmdRspEvent->RspPayloadLen == pFceInfo->pkt_len) && (*CmdRspEvent->RspPayloadLen != 0))\n\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(*CmdRspEvent->RspPayload, pRspBuffer + sizeof(*pFceInfo),\n\t\t\t\t\t\t\t\t\t\t\t\tpFceInfo->pkt_len);\n\t\t\t\t}\n\t\t\t\telse if ((*CmdRspEvent->RspPayloadLen == 0) && (pFceInfo->pkt_len == 8))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"Command response(ack) success\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Expect response len(%d), Command response len(%d) invalid\\n\", *CmdRspEvent->RspPayloadLen, pFceInfo->pkt_len));\n\t\t\t\t\t*CmdRspEvent->RspPayloadLen = pFceInfo->pkt_len;\n\t\t\t\t}\n\n\t\t\t\tif (CmdRspEvent->NeedWait)\n\t\t\t\t{\n\t\t\t\t\tRtmpComplete(CmdRspEvent->AckDone);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDlListDel(&CmdRspEvent->List);\n\t\t\t\t\tos_free_mem(NULL, CmdRspEvent);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tRTMP_IRQ_UNLOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t}\n\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef RTMP_USB_SUPPORT\nBOOLEAN CmdRspEventHandle(RTMP_ADAPTER *pAd)\n{\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\n\tCmdRspEventCallbackHandle(pAd, pCmdRspEventContext->CmdRspBuffer);\n\n\treturn TRUE;\n\n}\n#endif /* RTMP_USB_SUPPORT */\n#endif /* RLT_MAC */\n\n\n#ifdef CONFIG_AP_SUPPORT\nMAC_TABLE_ENTRY *MulTestTableLookup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr,\n\tIN BOOLEAN bResetIdelCount)\n{\n\tUSHORT HashIdx;\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\n\tHashIdx = MAC_ADDR_HASH_INDEX(pAddr);\n\tpEntry = pAd->MacTab.Hash[HashIdx];\n\n\twhile (pEntry)\n\t{\n\t\tif (MAC_ADDR_EQUAL(pEntry->Addr, pAddr))\n\t\t{\n\t\t\tif(bResetIdelCount)\n\t\t\t\tpEntry->NoDataIdleCount = 0;\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t\tpEntry = pEntry->pNext;\n\t}\n\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\treturn pEntry;\n}\n\n\nMAC_TABLE_ENTRY *MacTableInsertMulTestEntry(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR pAddr,\n\tUINT WdsTabIdx)\n{\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\tHTTRANSMIT_SETTING HTPhyMode;\n\n\t/* if FULL, return */\n\tif (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn NULL;\n\n\tif((pEntry = MulTestTableLookup(pAd, pAddr, TRUE)) != NULL)\n\t\treturn pEntry;\n\n\t/* allocate one WDS entry */\n\tdo\n\t{\n\t\t/* allocate one MAC entry */\n\t\tpEntry = MacTableInsertEntry(pAd, pAddr, BSS0, OPMODE_AP, TRUE);\n\t\tif (pEntry)\n\t\t{\n\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\n\t\t\t/* specific Max Tx Rate for Wds link. */\n\t\t\tNdisZeroMemory(&HTPhyMode, sizeof(HTTRANSMIT_SETTING));\n\t\t\tswitch (pAd->MulTestTab.WdsEntry[WdsTabIdx].PhyMode)\n\t\t\t{\n\t\t\t\tcase 0xff: /* user doesn't specific a Mode for WDS link. */\n\t\t\t\tcase MODE_OFDM: /* specific OFDM mode. */\n\t\t\t\t\tHTPhyMode.field.MODE = MODE_OFDM;\n\t\t\t\t\tHTPhyMode.field.MCS = 7;\n\t\t\t\t\tpEntry->RateLen = 8;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MODE_CCK:\n\t\t\t\t\tHTPhyMode.field.MODE = MODE_CCK;\n\t\t\t\t\tHTPhyMode.field.MCS = 3;\n\t\t\t\t\tpEntry->RateLen = 4;\n\t\t\t\t\tbreak;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tcase MODE_HTMIX:\n\t\t\t\t\tHTPhyMode.field.MCS = 7;\n\t\t\t\t\tHTPhyMode.field.ShortGI = pAd->MulTestTab.WdsEntry[WdsTabIdx].HTPhyMode.field.ShortGI;\n\t\t\t\t\tHTPhyMode.field.BW = pAd->MulTestTab.WdsEntry[WdsTabIdx].HTPhyMode.field.BW;\n\t\t\t\t\tHTPhyMode.field.STBC = pAd->MulTestTab.WdsEntry[WdsTabIdx].HTPhyMode.field.STBC;\n\t\t\t\t\tHTPhyMode.field.MODE = MODE_HTMIX;\n\t\t\t\t\tpEntry->RateLen = 12;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MODE_HTGREENFIELD:\n\t\t\t\t\tHTPhyMode.field.MCS = 7;\n\t\t\t\t\tHTPhyMode.field.ShortGI = pAd->MulTestTab.WdsEntry[WdsTabIdx].HTPhyMode.field.ShortGI;\n\t\t\t\t\tHTPhyMode.field.BW = pAd->MulTestTab.WdsEntry[WdsTabIdx].HTPhyMode.field.BW;\n\t\t\t\t\tHTPhyMode.field.STBC = pAd->MulTestTab.WdsEntry[WdsTabIdx].HTPhyMode.field.STBC;\n\t\t\t\t\tHTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t\t\t\t\tpEntry->RateLen = 12;\n\t\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tpEntry->Sst = SST_ASSOC;\n\n\t\t\t\tpEntry->MaxSupportedRate = RATE_54;\n\t\t\t\n\t\t\t\tif (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE)\n\t\t\t\t{\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_CCK;\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate;\n\t\t\t\t\tpEntry->MinHTPhyMode.field.MODE = MODE_CCK;\n\t\t\t\t\tpEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate;\n\t\t\t\t\tpEntry->HTPhyMode.field.MODE = MODE_CCK;\n\t\t\t\t\tpEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_OFDM;\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];\n\t\t\t\t\tpEntry->MinHTPhyMode.field.MODE = MODE_OFDM;\n\t\t\t\t\tpEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];\n\t\t\t\t\tpEntry->HTPhyMode.field.MODE = MODE_OFDM;\n\t\t\t\t\tpEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];\n\t\t\t\t}\n\n\t\t\t\t// Set WMM capability\n\t\t\t\tif ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) || (pAd->CommonCfg.bWmmCapable))\n\t\t\t\t{\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tj, bitmask; /*k,bitmask; */\n\t\t\t\t\tCHAR\ti;\n\t\t\t\n\t\t\t\t\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF))\n\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\t\t\t\t\tpAd->MacTab.fAnyStationNonGF = TRUE;\n\t\t\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW= BW_40;\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20));\n\t\t\t\t\t\tpAd->MacTab.fAnyStation20Only = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t/* find max fixed rate */\n\t\t\t\t\tfor (i=23; i>=0; i--) /* 3*3 */\n\t\t\t\t\t{\n\t\t\t\t\t\tj = i/8;\n\t\t\t\t\t\tbitmask = (1<<(i-(j*8)));\n\t\t\t\t\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].DesiredHtPhyInfo.MCSSet[j] & bitmask) && (pAd->CommonCfg.HtCapability.MCSSet[j] & bitmask))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (i==0)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[pEntry->apidx].DesiredTransmitSetting.field.MCS != MCS_AUTO)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"@@@ IF-ra%d DesiredTransmitSetting.field.MCS = %d\\n\", pEntry->apidx,\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].DesiredTransmitSetting.field.MCS));\n\n\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[pEntry->apidx].DesiredTransmitSetting.field.MCS == 32)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Fix MCS as HT Duplicated Mode */\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW = 1;\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.STBC = 0;\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = 0;\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = 32;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (pEntry->MaxHTPhyMode.field.MCS > pAd->ApCfg.MBSSID[pEntry->apidx].HTPhyMode.field.MCS)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* STA supports fixed MCS */\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = pAd->ApCfg.MBSSID[pEntry->apidx].HTPhyMode.field.MCS;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.STBC = (pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity < 5)\n\t\t\t\t\t\tpEntry->MpduDensity = 5;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->MpduDensity = pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity;\n\t\t\t\t\tpEntry->MaxRAmpduFactor = pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor;\n\t\t\t\t\tpEntry->MmpsMode = (UCHAR)pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs;\n\t\t\t\t\tpEntry->AMsduSize = (UCHAR)pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize;\n\t\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\t\t\t\n\t\t\t\t\tif (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE))\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED);\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.bRdg && pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\n\n\t\t\t\t\t/* Record the received capability from association request */\n\t\t\t\t\tNdisMoveMemory(&pEntry->HTCapability, &pAd->CommonCfg.HtCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->MacTab.fAnyStationIsLegacy = TRUE;\n\t\t\t\t\tNdisZeroMemory(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\t\t}\n\t\t\t\n\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\t\t\t\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\t\t\t}\n\n\t\t\t//pEntry->MaxHTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\t\t\t//pEntry->MinHTPhyMode.word = pAd->MulTestTab.WdsEntry[WdsTabIdx].MinHTPhyMode.word;\n\t\t\t//pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\n\t\t\t/*if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */\n\t\t\tif (pAd->MulTestTab.WdsEntry[WdsTabIdx].bAutoTxRateSwitch == FALSE)\n\t\t\t{\n\t\t\t\tpEntry->HTPhyMode.field.MCS = pAd->MulTestTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.MCS;\n\t\t\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\t\t\t\t/* If the legacy mode is set, overwrite the transmit setting of this entry. */\n\t\t\t\tRTMPUpdateLegacyTxSetting((UCHAR)pAd->MulTestTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\t\t\t}\n\t\t\t\n\t\t\tpAd->MulTestTab.WdsEntry[WdsTabIdx].MacTabMatchWCID = (UCHAR)pEntry->Aid;\n\t\t\tpEntry->MatchWDSTabIdx = WdsTabIdx;\n\n\t\t\tAsicUpdateMulTestEncryption(pAd, pEntry->Aid);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTableInsertWDSEntry - allocate entry #%d, Total= %d\\n\",WdsTabIdx, pAd->MacTab.Size));\n\t\t\tbreak;\n\t\t}\n\t}while(FALSE);\n\n\treturn pEntry;\n}\n\n\nVOID AsicUpdateMulTestRxWCIDTable(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT index;\n\n\tfor(index = 0; index < MAX_WDS_ENTRY; index++)\n\t{\n\t\tif (pAd->MulTestTab.WdsEntry[index].Valid != TRUE)\n\t\t\tcontinue;\n\n\t\tMacTableInsertMulTestEntry(pAd, pAd->MulTestTab.WdsEntry[index].PeerWdsAddr, index);\n\t}\n\n\treturn;\n}\n\nVOID AsicUpdateMulTestEncryption(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR wcid)\n{\n\tUINT WdsIdex;\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\tdo\n\t{\n\t\tif (wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\t\tbreak;\n\n\t\tpEntry = &pAd->MacTab.Content[wcid];\n\t\tif (pAd->MulTestTab.WdsEntry[pEntry->MatchWDSTabIdx].Valid != TRUE)\n\t\t\tbreak;\n\n\t\tWdsIdex = pEntry->MatchWDSTabIdx;\n\t\t\t\t\n\t\tif (((pAd->MulTestTab.WdsEntry[WdsIdex].WepStatus == Ndis802_11Encryption1Enabled) || \n\t\t\t   (pAd->MulTestTab.WdsEntry[WdsIdex].WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t   (pAd->MulTestTab.WdsEntry[WdsIdex].WepStatus == Ndis802_11Encryption3Enabled)\n#ifdef WAPI_SUPPORT\n\t\t\t\t|| (pAd->MulTestTab.WdsEntry[WdsIdex].WepStatus == Ndis802_11EncryptionSMS4Enabled)\n#endif /* WAPI_SUPPORT */\n\t\t\t   ) && (pAd->MulTestTab.WdsEntry[WdsIdex].WdsKey.KeyLen > 0))\n\t\t{\n\t\t\t\n\t\t\tINT DefaultKeyId = 0;\n\n\t\t\tif (pAd->MulTestTab.WdsEntry[WdsIdex].WepStatus == Ndis802_11Encryption1Enabled)\n\t\t\t\tDefaultKeyId = pAd->MulTestTab.WdsEntry[pEntry->MatchWDSTabIdx].KeyIdx;\n\n\t\t\tNdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));   \n\n\t\t\t/* Assign key material and its length */\n\t\t\tNdisMoveMemory((PUCHAR)(&pEntry->PairwiseKey), (PUCHAR)(&pAd->MulTestTab.WdsEntry[WdsIdex].WdsKey), sizeof(CIPHER_KEY));\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry->PairwiseKey.CipherAlg = (%d)\\n\", pEntry->PairwiseKey.CipherAlg));\n\t\n\t\t\tpEntry->WepStatus = pAd->MulTestTab.WdsEntry[WdsIdex].WepStatus;\n\n\t\t\t/* Assign the pairwise cipher algorithm */\n\t\t\tif (pEntry->WepStatus == Ndis802_11Encryption1Enabled)\n\t\t\t{\n\t\t\t\tif (pAd->MulTestTab.WdsEntry[WdsIdex].WdsKey.CipherAlg == CIPHER_WEP64)\n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;\n\t\t\t\telse if (pAd->MulTestTab.WdsEntry[WdsIdex].WdsKey.CipherAlg == CIPHER_WEP128)\n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : fails (wcid-%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, pEntry->Aid));\t\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;\n\t\t\telse if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_AES;\n#ifdef WAPI_SUPPORT\n\t\t\telse if (pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_SMS4;\n#endif /* WAPI_SUPPORT */\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : fails (wcid-%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, pEntry->Aid));\t\n\t\t\t\treturn;\n\t\t\t}\n\n#ifdef SOFT_ENCRYPT\n\t\t\tif (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"===> SW_ENC ON(wcid=%d) \\n\", pEntry->Aid));\n\t\t\t\tNdisZeroMemory(pEntry->PairwiseKey.TxTsc, LEN_WPA_TSC);\n\t\t\t\tNdisZeroMemory(pEntry->PairwiseKey.RxTsc, LEN_WPA_TSC); \t\n\t\t\t}\t\n\t\t\telse\n#endif /* SOFT_ENCRYPT */\t\t\n\t\t\t{\n\t\t\t\t/* Update key into Asic Pairwise key table */\n\t\t\t\tRTMP_ASIC_PAIRWISE_KEY_TABLE(\n\t\t\t\t\t\t\t\t\t\tpAd,\n\t\t\t\t\t\t\t\t\t\tpEntry->Aid,\n\t\t\t\t\t\t\t\t\t\t&pAd->MulTestTab.WdsEntry[pEntry->MatchWDSTabIdx].WdsKey);\n\n\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\tRTMP_SET_WCID_SEC_INFO(\n\t\t\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\t\t\tDefaultKeyId, \n\t\t\t\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[pEntry->MatchWDSTabIdx].WdsKey.CipherAlg,\n\t\t\t\t\t\t\t\t\tpEntry->Aid, \n\t\t\t\t\t\t\t\t\tPAIRWISEKEY);\n\t\t\t}\n\n\n\n\n\t\t}\n\t} while (FALSE);\n\n\treturn;\n}\n#endif\n\n\nNTSTATUS StopDmaRx(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Level)\n{\n\tPNDIS_PACKET\tpRxPacket;\n\tRX_BLK\t\t\tRxBlk, *pRxBlk;\n\tUINT32 RxPending = 0, MacReg = 0, MTxCycle = 0;\n\tBOOLEAN bReschedule = FALSE;\n\tUINT32 MaxRetry;\n\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"====> %s\\n\", __FUNCTION__));\n\n\tif ( Level == DOT11POWERSAVE )\n\t\tMaxRetry = 20;\n\telse\n\t\tMaxRetry = 2000;\n\n\t/*\n\t\tprocess whole rx ring\n\t*/\n\twhile (1)\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\tpRxBlk = &RxBlk;\n\t\tpRxPacket = GetPacketFromRxRing(pAd, pRxBlk, &bReschedule, &RxPending);\n\t\tif ((RxPending == 0) && (bReschedule == FALSE))\n\t\t\tbreak;\n\t\telse\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t}\n\n\t/*\n\t\tCheck DMA Rx idle\n\t*/\n\tfor (MTxCycle = 0; MTxCycle < MaxRetry ; MTxCycle++)\n\t{\n\n#ifdef RTMP_MAC_USB\n\t\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &MacReg);\n\n\t\tif (MacReg & 0x40000000)\n\t\t{\n\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"==>  DMA Rx Idle, MacReg=0x%x\\n\", MacReg));\n\t\t\tbreak;\n\t\t}\n#endif /* RTMP_MAC_USB */\n\t\t\n\t\tif (MacReg == 0xFFFFFFFF)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n\n\tif (MTxCycle >= MaxRetry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:RX DMA busy!! DMA_CFG = 0x%08x\\n\", __FUNCTION__, MacReg));\n\n\t\tif ( Level == GUIRADIO_OFF )\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\tif (Level == RTMP_HALT)\n\t{\n\t\t/*\n\t\t\tDisable DMA RX\n\t\t*/\n\n\t}\n\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"<==== %s\\n\", __FUNCTION__));\n\treturn STATUS_SUCCESS;\n}\n\n\nNTSTATUS StopDmaTx(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Level)\n{\n\tUINT32 MacReg = 0, MTxCycle = 0;\n#ifdef RTMP_MAC_USB\n\tUSB_DMA_CFG_STRUC UsbCfg;\n#endif /* RTMP_MAC_USB */\n\tUINT8 IdleNums = 0;\n\tUINT32 MaxRetry;\n\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"====> %s\\n\", __FUNCTION__));\n\n\tif ( Level == DOT11POWERSAVE )\n\t\tMaxRetry = 20;\n\telse\n\t\tMaxRetry = 2000;\n\n\tfor (MTxCycle = 0; MTxCycle < MaxRetry; MTxCycle++)\n\t{\n\n#ifdef RTMP_MAC_USB\n\t\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &MacReg);\n\n\t\tif (MacReg & 0x80000000 )\n\t\t{\n\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"==>  DMA Tx Idle, MacReg=0x%x\\n\", MacReg));\n\t\t\tbreak;\n\t\t}\t\n#endif /* RTMP_MAC_USB */\n\t\t\n\t\tif (MacReg == 0xFFFFFFFF)\n\t\t{\n\t\t\t//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n\t\n\tif (MTxCycle >= MaxRetry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TX DMA busy!! DMA_CFG(%x)\\n\", MacReg));\n\n\t\tif ( Level == GUIRADIO_OFF )\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\tif (Level == RTMP_HALT)\n\t{\n\t}\n\n\t//DBGPRINT(RT_DEBUG_TRACE, (\"<==== %s\\n\", __FUNCTION__));\n\treturn STATUS_SUCCESS;\n}\n\n\n\n"
  },
  {
    "path": "src/common/cmm_data_usb.c",
    "content": "/*\n   All functions in this file must be USB-depended, or you should out your function\n\tin other files.\n\n*/\n\n#ifdef RTMP_MAC_USB\n\n#include\t\"rt_config.h\"\n\n\nNDIS_STATUS RTUSBFreeDescriptorRelease(RTMP_ADAPTER *pAd, UCHAR BulkOutPipeId)\n{\n\tHT_TX_CONTEXT *pHTTXContext;\n\tunsigned long IrqFlags;\n\n\n\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);\n\tpHTTXContext->bCurWriting = FALSE;\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tThis subroutine will scan through releative ring descriptor to find\n\t\tout avaliable free ring descriptor and compare with request size.\n\t\t\n\tArguments:\n\t\tpAd\tPointer\tto our adapter\n\t\tRingType\tSelected Ring\n\t\t\n\tReturn Value:\n\t\tNDIS_STATUS_FAILURE\t\tNot enough free descriptor\n\t\tNDIS_STATUS_SUCCESS\t\tEnough free descriptor\n\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS\tRTUSBFreeDescRequest(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR BulkOutPipeId,\n\tIN UINT32 req_cnt)\n{\n\tNDIS_STATUS\t Status = NDIS_STATUS_FAILURE;\n\tunsigned long IrqFlags;\n\tHT_TX_CONTEXT *pHTTXContext;\n\n\n\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);\n#ifdef USB_BULK_BUF_ALIGMENT\n\tif( ((pHTTXContext->CurWriteIdx< pHTTXContext->NextBulkIdx  ) &&   (pHTTXContext->NextBulkIdx - pHTTXContext->CurWriteIdx == 1)) \n\t\t|| ((pHTTXContext->CurWriteIdx ==(BUF_ALIGMENT_RINGSIZE -1) ) &&  (pHTTXContext->NextBulkIdx == 0 )))\n\t{\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\n\t}\n\telse if (pHTTXContext->bCurWriting == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BUF_ALIGMENT RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\\n\", BulkOutPipeId, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition));\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\t}\n\n#else\n\tif ((pHTTXContext->CurWritePosition < pHTTXContext->NextBulkOutPosition) && ((pHTTXContext->CurWritePosition + req_cnt + LOCAL_TXBUF_SIZE) > pHTTXContext->NextBulkOutPosition))\n\t{\n\t\t\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\t}\n\telse if ((pHTTXContext->CurWritePosition == 8) && (pHTTXContext->NextBulkOutPosition < (req_cnt + LOCAL_TXBUF_SIZE)))\n\t{\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\t}\n\telse if (pHTTXContext->bCurWriting == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\\n\", BulkOutPipeId, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition));\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\telse\n\t{\n\t\tStatus = NDIS_STATUS_SUCCESS;\n\t}\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);\n\n\t\n\treturn Status;\n}\n\n\nBOOLEAN\tRTUSBNeedQueueBackForAgg(RTMP_ADAPTER *pAd, UCHAR BulkOutPipeId)\n{\n\tHT_TX_CONTEXT *pHTTXContext;\n\tBOOLEAN needQueBack = FALSE;\n\tunsigned long   IrqFlags;\n\n\n\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\t\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);\n\tif ((pHTTXContext->IRPPending == TRUE)  /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */)\n\t{\n\t\tif ((pHTTXContext->CurWritePosition < pHTTXContext->ENextBulkOutPosition) && \n\t\t\t(((pHTTXContext->ENextBulkOutPosition+MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT) || (pHTTXContext->CurWritePosition > MAX_AGGREGATION_SIZE)))\n\t\t{\n\t\t\tneedQueBack = TRUE;\n\t\t}\n\t\telse if ((pHTTXContext->CurWritePosition > pHTTXContext->ENextBulkOutPosition) && \n\t\t\t\t ((pHTTXContext->ENextBulkOutPosition + MAX_AGGREGATION_SIZE) < pHTTXContext->CurWritePosition))\n\t\t{\n\t\t\tneedQueBack = TRUE;\n\t\t}\n\t}\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);\n\n\treturn needQueBack;\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine\tDescription:\n\t\tCalculates the duration which is required to transmit out frames \n\twith given size and specified rate.\n\t\t\n\tArguments:\n\t\tpTxD\t\tPointer to transmit descriptor\n\t\tAck\t\t\tSetting for Ack requirement bit\n\t\tFragment\tSetting for Fragment bit\n\t\tRetryMode\tSetting for retry mode\n\t\tIfs\t\t\tSetting for IFS gap\n\t\tRate\t\tSetting for transmit rate\n\t\tService\t\tSetting for service\n\t\tLength\t\tFrame length\n\t\tTxPreamble  Short or Long preamble when using CCK rates\n\t\tQueIdx - 0-3, according to 802.11e/d4.4 June/2003\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t========================================================================\n*/\nstatic VOID rlt_usb_write_txinfo(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TXINFO_STRUC *pTxInfo,\n\tIN USHORT USBDMApktLen,\n\tIN BOOLEAN bWiv,\n\tIN UCHAR QueueSel,\n\tIN UCHAR NextValid,\n\tIN UCHAR TxBurst,\n\tIN UCHAR pkt_80211 )\n{\n#ifdef RLT_MAC\n\tstruct _TXINFO_NMAC_PKT *nmac_info;\n\n\tnmac_info = (struct _TXINFO_NMAC_PKT *)pTxInfo;\n#ifdef HDR_TRANS_SUPPORT\n\tnmac_info->pkt_80211 = pkt_80211;\n#else\n\tnmac_info->pkt_80211 = 1;\n#endif /* HDR_TRANS_SUPPORT */\n\tnmac_info->info_type = 0;\n\tnmac_info->d_port = 0;\n\tnmac_info->cso = 0;\n\tnmac_info->tso = 0;\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n\n#endif /* RTMP_MAC */\n\n\tpTxInfo->TxInfoPktLen = USBDMApktLen;\n\tpTxInfo->TxInfoQSEL = QueueSel;\n#ifndef CONFIG_MULTI_CHANNEL\n\tif (QueueSel != FIFO_EDCA)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"====> QueueSel != FIFO_EDCA <====\\n\"));\n#endif /* !CONFIG_MULTI_CHANNEL */\n\tpTxInfo->TxInfoUDMANextVld = FALSE; /*NextValid;   Need to check with Jan about this.*/\n\tpTxInfo->TxInfoUDMATxburst = TxBurst;\n\tpTxInfo->TxInfoWIV = bWiv;\n#ifndef USB_BULK_BUF_ALIGMENT\n\tpTxInfo->TxInfoSwLstRnd = 0;\n#else\n\tpTxInfo->bFragLasAlignmentsectiontRound = 0;\n#endif /* USB_BULK_BUF_ALIGMENT */\n}\n\n\nstatic VOID rlt_usb_update_txinfo(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TXINFO_STRUC *pTxInfo,\n\tIN TX_BLK *pTxBlk)\n{\n#ifdef RLT_MAC\n#endif /* RLT_MAC */\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID ComposePsPoll(RTMP_ADAPTER *pAd)\n{\n\tTXINFO_STRUC *pTxInfo;\n\tTXWI_STRUC *pTxWI;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUCHAR *buf;\n\tUSHORT data_len;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ComposePsPoll\\n\"));\n\tNdisZeroMemory(&pAd->PsPollFrame, sizeof (PSPOLL_FRAME));\n\n\tpAd->PsPollFrame.FC.PwrMgmt = 0;\n\tpAd->PsPollFrame.FC.Type = BTYPE_CNTL;\n\tpAd->PsPollFrame.FC.SubType = SUBTYPE_PS_POLL;\n\tpAd->PsPollFrame.Aid = pAd->StaActive.Aid | 0xC000;\n\tCOPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid);\n\tCOPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress);\n\n\tbuf = &pAd->PsPollContext.TransferBuffer->field.WirelessPacket[0];\n\tpTxInfo = (TXINFO_STRUC *)buf;\n\tpTxWI = (TXWI_STRUC *)&buf[TXINFO_SIZE];\n\tRTMPZeroMemory(buf, 100);\n\tdata_len = sizeof (PSPOLL_FRAME);\n\trlt_usb_write_txinfo(pAd, pTxInfo, data_len + TXWISize + TSO_SIZE, TRUE, \n\t\t\t\t\t\tEpToQueue[MGMTPIPEIDX], FALSE, FALSE, 1);\n\tRTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0,\n\t\t      BSSID_WCID, data_len, 0, 0,\n\t\t      (UCHAR) pAd->CommonCfg.MlmeTransmit.field.MCS,\n\t\t      IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);\n\tRTMPMoveMemory((VOID *)&buf[TXWISize + TXINFO_SIZE + TSO_SIZE], (VOID *)&pAd->PsPollFrame, data_len);\n\t/* Append 4 extra zero bytes. */\n\tpAd->PsPollContext.BulkOutSize = TXINFO_SIZE + TXWISize + TSO_SIZE + data_len + 4;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/* IRQL = DISPATCH_LEVEL */\nVOID ComposeNullFrame(RTMP_ADAPTER *pAd)\n{\n\tTXINFO_STRUC *pTxInfo;\n\tTXWI_STRUC *pTxWI;\n\tUCHAR *buf;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUSHORT data_len = sizeof(pAd->NullFrame);;\n\n\tPTX_CONTEXT pNullContext = &pAd->NullContext[0];\n\n\tNdisZeroMemory(&pAd->NullFrame, data_len);\n\tpAd->NullFrame.FC.Type = BTYPE_DATA;\n\tpAd->NullFrame.FC.SubType = SUBTYPE_NULL_FUNC;\n\tpAd->NullFrame.FC.ToDs = 1;\n\tCOPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid);\n\tCOPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress);\n\tCOPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid);\n\tbuf = (PUCHAR)&pNullContext->TransferBuffer->field.WirelessPacket[0];\n\n\tRTMPZeroMemory(buf, 100);\n\tpTxInfo = (TXINFO_STRUC *)buf;\n\tpTxWI = (TXWI_STRUC *)&buf[TXINFO_SIZE];\n\trlt_usb_write_txinfo(pAd, pTxInfo,\n\t\t\t(USHORT)(data_len + TXWISize + TSO_SIZE), TRUE,\n\t\t\tEpToQueue[MGMTPIPEIDX], FALSE, FALSE, 1);\n\tRTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0,\n\t\t      BSSID_WCID, data_len, 0, 0,\n\t\t      (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS,\n\t\t      IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);\n\tRTMPMoveMemory((VOID *)&buf[TXWISize + TXINFO_SIZE], (VOID *)&pAd->NullFrame, data_len);\n\tpNullContext->BulkOutSize = TXINFO_SIZE + TXWISize + TSO_SIZE + data_len + 4;\n\n}\n\n\n/*\n\tWe can do copy the frame into pTxContext when match following conditions.\n\t\t=>\n\t\t=>\n\t\t=>\n*/\nstatic inline NDIS_STATUS RtmpUSBCanDoWrite(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN HT_TX_CONTEXT *pHTTXContext)\n{\n\tNDIS_STATUS\tcanWrite = NDIS_STATUS_RESOURCES;\n\n#ifdef USB_BULK_BUF_ALIGMENT\n\tif( ((pHTTXContext->CurWriteIdx< pHTTXContext->NextBulkIdx  ) &&   (pHTTXContext->NextBulkIdx - pHTTXContext->CurWriteIdx == 1)) \n\t\t|| ((pHTTXContext->CurWriteIdx ==(BUF_ALIGMENT_RINGSIZE -1) ) &&  (pHTTXContext->NextBulkIdx == 0 )))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"RtmpUSBCanDoWrite USB_BULK_BUF_ALIGMENT c1!\\n\"));\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));\t\t\n\t}\n\telse if (pHTTXContext->bCurWriting == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"RtmpUSBCanDoWrite USB_BULK_BUF_ALIGMENT c3!!\\n\"));\n\n\t}\n#else\n\n\tif (((pHTTXContext->CurWritePosition) < pHTTXContext->NextBulkOutPosition) && (pHTTXContext->CurWritePosition + LOCAL_TXBUF_SIZE) > pHTTXContext->NextBulkOutPosition)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"RtmpUSBCanDoWrite c1!\\n\"));\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));\n\t}\n\telse if ((pHTTXContext->CurWritePosition == 8) && (pHTTXContext->NextBulkOutPosition < LOCAL_TXBUF_SIZE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"RtmpUSBCanDoWrite c2!\\n\"));\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));\n\t}\n\telse if (pHTTXContext->bCurWriting == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"RtmpUSBCanDoWrite c3!\\n\"));\n\t}\n\telse if ((pHTTXContext->ENextBulkOutPosition == 8)  && ((pHTTXContext->CurWritePosition + 7912 ) > MAX_TXBULK_LIMIT)  )\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"RtmpUSBCanDoWrite c4!\\n\"));\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));\n\t}\n\n#endif /* USB_BULK_BUF_ALIGMENT */\n\telse\n\t{\n\t\tcanWrite = NDIS_STATUS_SUCCESS;\n\t}\n\t\n\n\treturn canWrite;\n}\n\n\nUSHORT RtmpUSB_WriteSubTxResource(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN BOOLEAN bIsLast,\n\tOUT\tUSHORT *freeCnt)\n{\n\n\t/* Dummy function. Should be removed in the future.*/\n\treturn 0;\n\t\n}\n\nUSHORT\tRtmpUSB_WriteFragTxResource(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN UCHAR fragNum,\n\tOUT\tUSHORT *freeCnt)\n{\n\tHT_TX_CONTEXT\t*pHTTXContext;\n\tUSHORT\t\t\thwHdrLen;\t/* The hwHdrLen consist of 802.11 header length plus the header padding length.*/\n\tUINT32\t\t\tfillOffset;\n\tTXINFO_STRUC\t*pTxInfo;\n\tTXWI_STRUC\t\t*pTxWI;\n\tPUCHAR\t\t\tpWirelessPacket = NULL;\n\tUCHAR\t\t\tQueIdx;\n\tNDIS_STATUS\t\tStatus;\n\tunsigned long\tIrqFlags;\n\tUINT32\t\t\tUSBDMApktLen = 0, DMAHdrLen, padding;\n#ifdef USB_BULK_BUF_ALIGMENT\t\n\tBOOLEAN\t\t\tbLasAlignmentsectiontRound = FALSE;\n#else\n\tBOOLEAN\t\t\tTxQLastRound = FALSE;\n#endif /* USB_BULK_BUF_ALIGMENT */\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\t\n\t\n\t/* get Tx Ring Resource & Dma Buffer address*/\n\t\n\tQueIdx = pTxBlk->QueIdx;\n\tpHTTXContext  = &pAd->TxContext[QueIdx];\n\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\t\n\tpHTTXContext  = &pAd->TxContext[QueIdx];\n\tfillOffset = pHTTXContext->CurWritePosition;\n\n\tif(fragNum == 0)\n\t{\n\t\t/* Check if we have enough space for this bulk-out batch.*/\n\t\tStatus = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext);\n\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tpHTTXContext->bCurWriting = TRUE;\n\n#ifndef USB_BULK_BUF_ALIGMENT\t\t\t\n\t\t\t/* Reserve space for 8 bytes padding.*/\n\t\t\tif ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition))\n\t\t\t{\n\t\t\t\tpHTTXContext->ENextBulkOutPosition += 8;\n\t\t\t\tpHTTXContext->CurWritePosition += 8;\n\t\t\t\tfillOffset += 8;\n\t\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\t\t\tpTxBlk->Priv = 0;\n\t\t\tpHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\t\t\t\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn(Status);\n\t\t}\n\t}\n\telse \n\t{\n\t\t/* For sub-sequent frames of this bulk-out batch. Just copy it to our bulk-out buffer.*/\n\t\tStatus = ((pHTTXContext->bCurWriting == TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE);\n\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tfillOffset += pTxBlk->Priv;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\t\t\t\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn(Status);\n\t\t}\n\t}\n\t\n\tNdisZeroMemory((PUCHAR)(&pTxBlk->HeaderBuf[0]), TXINFO_SIZE);\n\tpTxInfo = (TXINFO_STRUC *)(&pTxBlk->HeaderBuf[0]);\n\tpTxWI= (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]);\n\n\tpWirelessPacket = &pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset];\n\n\t/* copy TXWI + WLAN Header + LLC into DMA Header Buffer*/\n\t/*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4);*/\n\thwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;\n\n\t/* Build our URB for USBD*/\n\tDMAHdrLen = TXWISize + hwHdrLen;\n\tUSBDMApktLen = DMAHdrLen + pTxBlk->SrcBufLen;\n\tpadding = (4 - (USBDMApktLen % 4)) & 0x03;\t/* round up to 4 byte alignment*/\n\tUSBDMApktLen += padding;\n\n\tpTxBlk->Priv += (TXINFO_SIZE + USBDMApktLen);\n\n\t/* For TxInfo, the length of USBDMApktLen = TXWI_SIZE + 802.11 header + payload*/\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((QueIdx == QID_HCCA) && (pAd->Multi_Channel_Enable == TRUE))\n\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(USBDMApktLen), \n\t\t\t\t\t\t\t\tFALSE, FIFO_EDCA2, FALSE, FALSE, 1);\n\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(USBDMApktLen), FALSE, FIFO_EDCA, FALSE /*NextValid*/,  FALSE, 1);\n\t\n\tif (fragNum == pTxBlk->TotalFragNum) \n\t{\n\t\tpTxInfo->TxInfoUDMATxburst = 0;\n\n#ifdef USB_BULK_BUF_ALIGMENT\t\n\t\t/*\n\t\t\twhen CurWritePosition > 0x6000  mean that it is at the max bulk out  size,\n\t\t\twe CurWriteIdx must move to the next alignment section.\n\t\t\tOtherwirse,  CurWriteIdx will be moved to the next section at databulkout.\n\n\t\t\t\n\t\t\t(((pHTTXContext->CurWritePosition + 3906)& 0x00007fff) & 0xffff6000) == 0x00006000)\n\t\t\twe must make sure that the last fragNun packet just over the 0x6000\n\t\t\totherwise it will error because the last frag packet will at the section but will not bulk out.\n\t\t\tex:   when secoend packet writeresouce and it > 0x6000\n\t\t\t\tAnd the last packet writesource and it also > 0x6000  at this time CurWriteIdx++\n\t\t\t\tbut when data bulk out , because at second packet it will > 0x6000 , the last packet will not bulk out.\n\t\t\t\n\t\t*/\n\n\t\tif ( ((pHTTXContext->CurWritePosition + 3906)  & 0x00006000) == 0x00006000)\n\t\t{\n\n\t\t\tbLasAlignmentsectiontRound = TRUE;\n\t\t\tpTxInfo->bFragLasAlignmentsectiontRound = 1;\n\t\t}\n#else\n\t\tif ((pHTTXContext->CurWritePosition + pTxBlk->Priv + 3906)> MAX_TXBULK_LIMIT)\n\t\t{\n\t\t\tpTxInfo->TxInfoSwLstRnd = 1;\n\t\t\tTxQLastRound = TRUE;\n\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\t}\n\telse\n\t{\n\t\tpTxInfo->TxInfoUDMATxburst = 1;\n\t}\n\n\tNdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf, TXINFO_SIZE + TXWISize + hwHdrLen); \n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, (PUCHAR)(pWirelessPacket + TXINFO_SIZE + TXWISize), DIR_WRITE, FALSE);\n#endif /* RT_BIG_ENDIAN */\n\tpWirelessPacket += (TXINFO_SIZE + TXWISize + hwHdrLen);\n\tpHTTXContext->CurWriteRealPos += (TXINFO_SIZE + TXWISize + hwHdrLen);\n\t\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\t\n\tNdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);\n\n\t/*\tZero the last padding.*/\n\tpWirelessPacket += pTxBlk->SrcBufLen;\n\tNdisZeroMemory(pWirelessPacket, padding + 8);\n\n\tif (fragNum == pTxBlk->TotalFragNum)\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\t\t\n\t\t/* Update the pHTTXContext->CurWritePosition. 3906 used to prevent the NextBulkOut is a A-RALINK/A-MSDU Frame.*/\n\t\tpHTTXContext->CurWritePosition += pTxBlk->Priv;\n#ifndef USB_BULK_BUF_ALIGMENT\t\n\t\tif (TxQLastRound == TRUE)\n\t\t\tpHTTXContext->CurWritePosition = 8;\n#endif /* USB_BULK_BUF_ALIGMENT */\n#ifdef USB_BULK_BUF_ALIGMENT\n\t\tif(bLasAlignmentsectiontRound == TRUE)\n\t\t{\t\n\t\t\tpHTTXContext->CurWritePosition = ((CUR_WRITE_IDX_INC(pHTTXContext->CurWriteIdx, BUF_ALIGMENT_RINGSIZE)) * 0x8000);\n\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\tpHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;\n\n#ifdef UAPSD_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tUAPSD_TagFrame(pAd, pTxBlk->pPacket, pTxBlk->Wcid, pHTTXContext->CurWritePosition);\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUAPSD_TagFrame(pAd, pTxBlk->pPacket, pTxBlk->Wcid, pHTTXContext->CurWritePosition);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n\t\t/* Finally, set bCurWriting as FALSE*/\n\tpHTTXContext->bCurWriting = FALSE;\n\n\t\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\n\t\t/* succeed and release the skb buffer*/\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS);\n\t}\n\n\t\t\n\treturn(Status);\n\t\n}\n\n\nUSHORT RtmpUSB_WriteSingleTxResource(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN BOOLEAN bIsLast,\n\tOUT\tUSHORT *freeCnt)\n{\n\tHT_TX_CONTEXT *pHTTXContext;\n\tUINT32 fillOffset;\n\tTXINFO_STRUC *pTxInfo;\n\tTXWI_STRUC *pTxWI;\n\tUCHAR *pWirelessPacket, *buf;\n\tUCHAR QueIdx;\n\tunsigned long\tIrqFlags;\n\tNDIS_STATUS Status;\n\tUINT32 hdr_copy_len, hdr_len, dma_len = 0, padding;\n#ifndef USB_BULK_BUF_ALIGMENT\n\tBOOLEAN bTxQLastRound = FALSE;\n#endif /* USB_BULK_BUF_ALIGMENT */\t\t\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t/* get Tx Ring Resource & Dma Buffer address*/\n\tQueIdx = pTxBlk->QueIdx;\n\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\tpHTTXContext  = &pAd->TxContext[QueIdx];\n\tfillOffset = pHTTXContext->CurWritePosition;\n\n\t\n\t\n\t/* Check ring full */\n\tStatus = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext);\n\tif(Status == NDIS_STATUS_SUCCESS)\n\t{\n\t\tpHTTXContext->bCurWriting = TRUE;\n\t\tbuf = &pTxBlk->HeaderBuf[0];\n\t\tpTxInfo = (TXINFO_STRUC *)buf;\n\t\tpTxWI= (TXWI_STRUC *)&buf[TXINFO_SIZE];\n\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\t/* Reserve space for 8 bytes padding.*/\n\t\tif ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition))\n\t\t{\n\t\t\tpHTTXContext->ENextBulkOutPosition += 8;\n\t\t\tpHTTXContext->CurWritePosition += 8;\n\t\t\tfillOffset += 8;\n\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\t\tpHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;\n\n\t\tpWirelessPacket = &pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset];\n\n\t\t/* Build our URB for USBD */\n\t\thdr_len = TXWISize + TSO_SIZE + pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;\n\t\thdr_copy_len = TXINFO_SIZE + hdr_len;\n\t\tdma_len = hdr_len + pTxBlk->SrcBufLen;\n\t\tpadding = (4 - (dma_len % 4)) & 0x03;\t/* round up to 4 byte alignment*/\n\t\tdma_len += padding;\n\n\t\tpTxBlk->Priv = (TXINFO_SIZE + dma_len);\n\n\t\t/* For TxInfo, the length of USBDMApktLen = TXWI_SIZE + TSO_SIZE + 802.11 header + payload */\n#ifdef HDR_TRANS_SUPPORT\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((QueIdx == QID_HCCA) && (pAd->Multi_Channel_Enable == TRUE))\n\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(dma_len), FALSE, FIFO_EDCA2, FALSE /*NextValid*/,  FALSE, pTxBlk->NeedTrans?0:1);\n\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(dma_len), FALSE, FIFO_EDCA, FALSE /*NextValid*/,  FALSE, pTxBlk->NeedTrans?0:1);\n#else\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((QueIdx == QID_HCCA) && (pAd->Multi_Channel_Enable == TRUE))\n\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(dma_len), FALSE, FIFO_EDCA2, FALSE /*NextValid*/,  FALSE, 1);\n\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(dma_len), FALSE, FIFO_EDCA, FALSE /*NextValid*/,  FALSE, 1);\n#endif /* HDR_TRANS_SUPPORT */\n\n\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\tif ((pHTTXContext->CurWritePosition + 3906 + pTxBlk->Priv) > MAX_TXBULK_LIMIT)\n\t\t{\n\t\t\tpTxInfo->TxInfoSwLstRnd = 1;\n\t\t\tbTxQLastRound = TRUE;\n\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\tNdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf, hdr_copy_len);\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, (PUCHAR)(pWirelessPacket + TXINFO_SIZE + TXWISize + TSO_SIZE), DIR_WRITE, FALSE);\n#endif /* RT_BIG_ENDIAN */\n\t\tpWirelessPacket += (hdr_copy_len);\n\n\t\t/* We unlock it here to prevent the first 8 bytes maybe over-writed issue.*/\n\t\t/*\t1. First we got CurWritePosition but the first 8 bytes still not write to the pTxcontext.*/\n\t\t/*\t2. An interrupt break our routine and handle bulk-out complete.*/\n\t\t/*\t3. In the bulk-out compllete, it need to do another bulk-out, */\n\t\t/*\t\t\tif the ENextBulkOutPosition is just the same as CurWritePosition, it will save the first 8 bytes from CurWritePosition,*/\n\t\t/*\t\t\tbut the payload still not copyed. the pTxContext->SavedPad[] will save as allzero. and set the bCopyPad = TRUE.*/\n\t\t/*\t4. Interrupt complete.*/\n\t\t/*  5. Our interrupted routine go back and fill the first 8 bytes to pTxContext.*/\n\t\t/*\t6. Next time when do bulk-out, it found the bCopyPad==TRUE and will copy the SavedPad[] to pTxContext->NextBulkOutPosition.*/\n\t\t/*\t\tand the packet will wrong.*/\n\t\tpHTTXContext->CurWriteRealPos += hdr_copy_len;\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n#ifdef TX_PKT_SG\n\t\tif (pTxBlk->pkt_info.BufferCount > 1) {\n\t\t\tINT i, len;\n\t\t\tvoid *data;\n\t\t\tPKT_SG_T *sg = &pTxBlk->pkt_info.sg_list[0];\n\t\t\t\n\t\t\tfor (i = 0 ; i < pTxBlk->pkt_info.BufferCount; i++) {\n\t\t\t\tdata = sg[i].data;\n\t\t\t\tlen = sg[i].len;\n\t\t\t\tif (i == 0) {\n\t\t\t\t\tlen -= ((ULONG)pTxBlk->pSrcBufData - (ULONG)sg[i].data);\n\t\t\t\t\tdata = pTxBlk->pSrcBufData;\n\t\t\t\t}\n\t\t\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"%s:sg[%d]=0x%x, len=%d\\n\", __FUNCTION__, i, data, len));\n\t\t\t\tif (len <= 0) {\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():sg[%d] info error, sg.data=0x%x, sg.len=%d, pTxBlk->pSrcBufData=0x%x, pTxBlk->SrcBufLen=%d, data=0x%x, len=%d\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, i, sg[i].data, sg[i].len, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, data, len));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(pWirelessPacket, data, len);\n\t\t\t\tpWirelessPacket += len;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* TX_PKT_SG */\n\t\t{\n\t\t\tNdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);\n\t\t\tpWirelessPacket += pTxBlk->SrcBufLen;\n\t\t}\n\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\tNdisZeroMemory(pWirelessPacket, padding + 8);\n\t\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\tpHTTXContext->CurWritePosition += pTxBlk->Priv;\n#ifdef UAPSD_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tUAPSD_TagFrame(pAd, pTxBlk->pPacket, pTxBlk->Wcid, pHTTXContext->CurWritePosition);\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUAPSD_TagFrame(pAd, pTxBlk->pPacket, pTxBlk->Wcid, pHTTXContext->CurWritePosition);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n#ifdef USB_BULK_BUF_ALIGMENT\n\t\t/*\n\t\t\twhen CurWritePosition > 0x6000  mean that it is at the max bulk out size,\n\t\t\twe CurWriteIdx must move to the next alignment section.\n\t\t\tOtherwirse,  CurWriteIdx will be moved to the next section at databulkout.\n\n\t\t\tWritingflag = TRUE ,mean that when we writing resource ,and databulkout happen, \n\t\t\tSo we bulk out when this packet finish.\n\t\t*/\n\t\tif ( (pHTTXContext->CurWritePosition  & 0x00006000) == 0x00006000)\n\t\t{\n\t\t\tpHTTXContext->CurWritePosition = ((CUR_WRITE_IDX_INC(pHTTXContext->CurWriteIdx, BUF_ALIGMENT_RINGSIZE)) * 0x8000);\n\t\t}\n#else\n\t\tif (bTxQLastRound)\n\t\t\tpHTTXContext->CurWritePosition = 8;\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\tpHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;\n\t\tpHTTXContext->bCurWriting = FALSE;\n\t}\n\n\t\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\n\n\t/* succeed and release the skb buffer*/\n\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS);\n\t\n\treturn(Status);\n\n}\n\n\nUSHORT RtmpUSB_WriteMultiTxResource(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN UCHAR frmNum,\n\tOUT USHORT *freeCnt)\n{\n\tHT_TX_CONTEXT *pHTTXContext;\n\tUSHORT hwHdrLen;\t/* The hwHdrLen consist of 802.11 header length plus the header padding length.*/\n\tUINT32 fillOffset;\n\tTXINFO_STRUC *pTxInfo;\n\tTXWI_STRUC *pTxWI;\n\tUCHAR *pWirelessPacket = NULL;\n\tUCHAR QueIdx;\n\tNDIS_STATUS Status;\n\tunsigned long IrqFlags;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t\n\t/* get Tx Ring Resource & Dma Buffer address*/\n\tQueIdx = pTxBlk->QueIdx;\n\tpHTTXContext  = &pAd->TxContext[QueIdx];\n\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\t\n\tif(frmNum == 0)\t\n\t{\t\n\t\t/* Check if we have enough space for this bulk-out batch.*/\n\t\tStatus = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext);\n\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tpHTTXContext->bCurWriting = TRUE;\n\n\t\t\tpTxInfo = (TXINFO_STRUC *)(&pTxBlk->HeaderBuf[0]);\n\t\t\tpTxWI= (TXWI_STRUC *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]);\n\t\t\t\n#ifndef USB_BULK_BUF_ALIGMENT\t\n\t\t\t/* Reserve space for 8 bytes padding.*/\n\t\t\tif ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition))\n\t\t\t{\n\t\t\t\t\n\t\t\t\tpHTTXContext->CurWritePosition += 8;\n\t\t\t\tpHTTXContext->ENextBulkOutPosition += 8;\n\t\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\t\t\tfillOffset = pHTTXContext->CurWritePosition;\n\t\t\tpHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;\n\n\t\t\tpWirelessPacket = &pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset];\n\n\t\t\t\n\t\t\t/* Copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer*/\n\t\t\t\n\t\t\tif (pTxBlk->TxFrameType == TX_AMSDU_FRAME)\n\t\t\t\t/*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD, 4)+LENGTH_AMSDU_SUBFRAMEHEAD;*/\n\t\t\t\thwHdrLen = pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD + pTxBlk->HdrPadLen + LENGTH_AMSDU_SUBFRAMEHEAD;\n\t\t\telse if (pTxBlk->TxFrameType == TX_RALINK_FRAME)\n\t\t\t\t/*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_ARALINK_HEADER_FIELD, 4)+LENGTH_ARALINK_HEADER_FIELD;*/\n\t\t\t\thwHdrLen = pTxBlk->MpduHeaderLen-LENGTH_ARALINK_HEADER_FIELD + pTxBlk->HdrPadLen + LENGTH_ARALINK_HEADER_FIELD;\n\t\t\telse\n\t\t\t\t/*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4);*/\n\t\t\t\thwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;\n\n\t\t\t/* Update the pTxBlk->Priv.*/\n\t\t\tpTxBlk->Priv = TXINFO_SIZE + TXWISize + hwHdrLen;\n\n\t\t\t/*\tpTxInfo->USBDMApktLen now just a temp value and will to correct latter.*/\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif ((QueIdx == QID_HCCA) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(pTxBlk->Priv), FALSE, FIFO_EDCA2, FALSE /*NextValid*/,  FALSE, 1);\n\t\t\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(pTxBlk->Priv), FALSE, FIFO_EDCA, FALSE /*NextValid*/,  FALSE, 1);\n\t\t\t\n\t\t\t/* Copy it.*/\n\t\t\tNdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf, pTxBlk->Priv); \n#ifdef RT_BIG_ENDIAN\n\t\t\tRTMPFrameEndianChange(pAd, (PUCHAR)(pWirelessPacket+ TXINFO_SIZE + TXWISize), DIR_WRITE, FALSE);\n#endif /* RT_BIG_ENDIAN */\n\t\t\tpHTTXContext->CurWriteRealPos += pTxBlk->Priv;\n\t\t\tpWirelessPacket += pTxBlk->Priv;\n\t\t}\n\t}\n\telse\n\t{\t/* For sub-sequent frames of this bulk-out batch. Just copy it to our bulk-out buffer.*/\n\t\n\t\tStatus = ((pHTTXContext->bCurWriting == TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE);\n\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tfillOffset =  (pHTTXContext->CurWritePosition + pTxBlk->Priv);\n\t\t\tpWirelessPacket = &pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset];\n\n\t\t\t/*hwHdrLen = pTxBlk->MpduHeaderLen;*/\n\t\t\tNdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf, pTxBlk->MpduHeaderLen);\n\t\t\tpWirelessPacket += (pTxBlk->MpduHeaderLen);\n\t\t\tpTxBlk->Priv += pTxBlk->MpduHeaderLen;\n\t\t}\n\t\telse\n\t\t{\t/* It should not happened now unless we are going to shutdown.*/\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WriteMultiTxResource():bCurWriting is FALSE when handle sub-sequent frames.\\n\"));\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n\n\n\t/*\n\t\tWe unlock it here to prevent the first 8 bytes maybe over-write issue.\n\t\t1. First we got CurWritePosition but the first 8 bytes still not write to the pTxContext.\n\t\t2. An interrupt break our routine and handle bulk-out complete.\n\t\t3. In the bulk-out compllete, it need to do another bulk-out,\n\t\t\tif the ENextBulkOutPosition is just the same as CurWritePosition, it will save the first 8 bytes from CurWritePosition,\n\t\t\tbut the payload still not copyed. the pTxContext->SavedPad[] will save as allzero. and set the bCopyPad = TRUE.\n\t\t4. Interrupt complete.\n\t\t5. Our interrupted routine go back and fill the first 8 bytes to pTxContext.\n\t\t6. Next time when do bulk-out, it found the bCopyPad==TRUE and will copy the SavedPad[] to pTxContext->NextBulkOutPosition.\n\t\t\tand the packet will wrong.\n\t*/\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"WriteMultiTxResource: CWPos = %ld, NBOutPos = %ld.\\n\", pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition));\n\t\tgoto done;\n\t}\n\n\t/* Copy the frame content into DMA buffer and update the pTxBlk->Priv*/\n\tNdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);\n\tpWirelessPacket += pTxBlk->SrcBufLen;\n\tpTxBlk->Priv += pTxBlk->SrcBufLen;\n\ndone:\t\n\t/* Release the skb buffer here*/\n\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS);\t\n\n\treturn(Status);\n\n}\n\n\nVOID RtmpUSB_FinalWriteTxResource(\n\tIN RTMP_ADAPTER\t*pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN USHORT totalMPDUSize,\n\tIN USHORT TxIdx)\n{\n\tUCHAR\t\t\tQueIdx;\n\tHT_TX_CONTEXT\t*pHTTXContext;\n\tUINT32\t\t\tfillOffset;\n\tTXINFO_STRUC\t*pTxInfo;\n\tTXWI_STRUC\t\t*pTxWI;\n\tUINT32\t\t\tUSBDMApktLen, padding;\n\tunsigned long\tIrqFlags;\n\tPUCHAR\t\t\tpWirelessPacket;\n\n\tQueIdx = pTxBlk->QueIdx;\n\tpHTTXContext  = &pAd->TxContext[QueIdx];\n\t\n\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\n\tif (pHTTXContext->bCurWriting == TRUE)\n\t{\t\t\n\t\tfillOffset = pHTTXContext->CurWritePosition;\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\tif (((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) || ((pHTTXContext->ENextBulkOutPosition-8) == pHTTXContext->CurWritePosition))\n\t\t\t&& (pHTTXContext->bCopySavePad == TRUE))\n\t\t\tpWirelessPacket = (PUCHAR)(&pHTTXContext->SavedPad[0]);\n\t\telse \n#endif /* USB_BULK_BUF_ALIGMENT */\n\t\t\tpWirelessPacket = (PUCHAR)(&pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset]);\n\n\t\t\n\t\t/* Update TxInfo->USBDMApktLen , */\n\t\t/*\t\tthe length = TXWI_SIZE + 802.11_hdr + 802.11_hdr_pad + payload_of_all_batch_frames + Bulk-Out-padding*/\n\t\t\n\t\tpTxInfo = (TXINFO_STRUC *)(pWirelessPacket);\n\n\t\t/* Calculate the bulk-out padding*/\n\t\tUSBDMApktLen = pTxBlk->Priv - TXINFO_SIZE;\n\t\tpadding = (4 - (USBDMApktLen % 4)) & 0x03;\t/* round up to 4 byte alignment*/\n\t\tUSBDMApktLen += padding;\n\t\t\n\t\tpTxInfo->TxInfoPktLen = USBDMApktLen;\n\n\t\t\n\t\t/*\n\t\t\tUpdate TXWI->TxWIMPDUByteCnt,\n\t\t\t\tthe length = 802.11 header + payload_of_all_batch_frames\n\t\t*/\n\t\tpTxWI= (TXWI_STRUC *)(pWirelessPacket + TXINFO_SIZE);\n\t\tpTxWI->TxWIMPDUByteCnt = totalMPDUSize;\n\n\t\t\n\t\t/* Update the pHTTXContext->CurWritePosition*/\n\t\t\n\t\tpHTTXContext->CurWritePosition += (TXINFO_SIZE + USBDMApktLen);\n#ifdef USB_BULK_BUF_ALIGMENT\n\t\t/*\n\t\t\twhen CurWritePosition > 0x6000  mean that it is at the max bulk out size,\n\t\t\twe CurWriteIdx must move to the next alignment section.\n\t\t\tOtherwirse,  CurWriteIdx will be moved to the next section at databulkout.\n\n\t\t\tWritingflag = TRUE ,mean that when we writing resource ,and databulkout happen, \n\t\t\tSo we bulk out when this packet finish.\n\t\t*/\n\n\t\tif ( (pHTTXContext->CurWritePosition  & 0x00006000) == 0x00006000)\n\t\t{\n\t\t\tpHTTXContext->CurWritePosition = ((CUR_WRITE_IDX_INC(pHTTXContext->CurWriteIdx, BUF_ALIGMENT_RINGSIZE)) * 0x8000);\n\t\t}\n#else\n\t\tif ((pHTTXContext->CurWritePosition + 3906)> MAX_TXBULK_LIMIT)\n\t\t{\t/* Add 3906 for prevent the NextBulkOut packet size is a A-RALINK/A-MSDU Frame.*/\n\t\t\tpHTTXContext->CurWritePosition = 8;\n\t\t\tpTxInfo->TxInfoSwLstRnd = 1;\n\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\t\t\n\n\t\tpHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;\n\t\t\n#ifdef UAPSD_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tUAPSD_TagFrame(pAd, pTxBlk->pPacket, pTxBlk->Wcid, pHTTXContext->CurWritePosition);\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUAPSD_TagFrame(pAd, pTxBlk->pPacket, pTxBlk->Wcid, pHTTXContext->CurWritePosition);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n\t\t\n\t\t/*\tZero the last padding.*/\n\t\tpWirelessPacket = (&pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset + pTxBlk->Priv]);\n\t\tNdisZeroMemory(pWirelessPacket, padding + 8);\n\t\t\n\t\t/* Finally, set bCurWriting as FALSE*/\n\t\tpHTTXContext->bCurWriting = FALSE;\n\n\t}\n\telse\n\t{\t/* It should not happened now unless we are going to shutdown.*/\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"FinalWriteTxResource():bCurWriting is FALSE when handle last frames.\\n\"));\n\t}\n\t\n\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);\n\n}\n\n\nVOID RtmpUSBDataLastTxIdx(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN USHORT TxIdx)\n{\n\t/* DO nothing for USB.*/\n}\n\n\n/*\n\tWhen can do bulk-out:\n\t\t1. TxSwFreeIdx < TX_RING_SIZE;\n\t\t\tIt means has at least one Ring entity is ready for bulk-out, kick it out.\n\t\t2. If TxSwFreeIdx == TX_RING_SIZE\n\t\t\tCheck if the CurWriting flag is FALSE, if it's FALSE, we can do kick out.\n\n*/\nVOID RtmpUSBDataKickOut(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN UCHAR QueIdx)\n{\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((pAd->MultiChannelFlowCtl & (1 << QueIdx)) == (1 << QueIdx))\n\t{\n\t\treturn;\n\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));\n\tRTUSBKickBulkOut(pAd);\n\n}\n\n\n/*\n\tMust be run in Interrupt context\n\tThis function handle RT2870 specific TxDesc and cpu index update and kick the packet out.\n */\nint RtmpUSBMgmtKickOut(\n\tIN RTMP_ADAPTER *pAd, \n\tIN UCHAR QueIdx,\n\tIN PNDIS_PACKET pPacket,\n\tIN UCHAR *pSrcBufVA,\n\tIN UINT SrcBufLen)\n{\n\tTXINFO_STRUC *pTxInfo;\n\tULONG BulkOutSize;\n\tUCHAR padLen;\n\tPUCHAR pDest;\n\tULONG SwIdx = pAd->MgmtRing.TxCpuIdx;\n\tTX_CONTEXT *pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[SwIdx].AllocVa;\n\tULONG IrqFlags;\n\n\t\n\tpTxInfo = (TXINFO_STRUC *)(pSrcBufVA);\n\n\t/* Build our URB for USBD*/\n\tBulkOutSize = (SrcBufLen + 3) & (~3);\n\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(BulkOutSize - TXINFO_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE,  FALSE, 1);\n\t\n\tBulkOutSize += 4; /* Always add 4 extra bytes at every packet.*/\n\n//+++Add by shiang for debug\nif (0) {\n\tDBGPRINT(RT_DEBUG_OFF, (\"-->%s():shiang-6590, QueIdx=%d, SrcBufLen=%d\\n\", __FUNCTION__, QueIdx, SrcBufLen));\n\tdump_txinfo(pAd, pTxInfo);\n\tdumpTxWI(pAd, (TXWI_STRUC *)(pSrcBufVA + TXINFO_SIZE));\n}\n//---Add by shiang for debug\n\n/* WY , it cause Tx hang on Amazon_SE , Max said the padding is useless*/\n\t/* If BulkOutSize is multiple of BulkOutMaxPacketSize, add extra 4 bytes again.*/\n/*\tif ((BulkOutSize % pAd->BulkOutMaxPacketSize) == 0)*/\n/*\t\tBulkOutSize += 4;*/\n\n\tpadLen = BulkOutSize - SrcBufLen;\n\tASSERT((padLen <= RTMP_PKT_TAIL_PADDING));\n\t\n\t/* Now memzero all extra padding bytes.*/\n\tpDest = (PUCHAR)(pSrcBufVA + SrcBufLen);\n\tOS_PKT_TAIL_BUF_EXTEND(pPacket, padLen);\n\tNdisZeroMemory(pDest, padLen);\n\n\tRTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);\n\t\n\tpAd->MgmtRing.Cell[pAd->MgmtRing.TxCpuIdx].pNdisPacket = pPacket;\n\tpMLMEContext->TransferBuffer = (PTX_BUFFER)(GET_OS_PKT_DATAPTR(pPacket));\n\n\t/* Length in TxInfo should be 8 less than bulkout size.*/\n\tpMLMEContext->BulkOutSize = BulkOutSize;\n\tpMLMEContext->InUse = TRUE;\n\tpMLMEContext->bWaitingBulkOut = TRUE;\n\n#ifdef UAPSD_SUPPORT\n\t\t/*\n\t\t\tIf the packet is QoS Null frame, we mark the packet with its WCID;\n\t\t\tIf not, we mark the packet with bc/mc WCID = 0.\n\n\t\t\tWe will handle it in rtusb_mgmt_dma_done_tasklet().\n\n\t\t\tEven AP send a QoS Null frame but not EOSP frame in USB mode,\n\t\t\tthen we will call UAPSD_SP_Close() and we will check\n\t\t\tpEntry->bAPSDFlagSPStart() so do not worry about it.\n\t\t*/\n#ifdef DOT11Z_TDLS_SUPPORT\n\tif (RTMP_GET_PACKET_QOS_NULL(pPacket) != 0x00)\n\t\tpMLMEContext->Wcid = RTMP_GET_PACKET_WCID(pPacket);\n\telse\n\t\tpMLMEContext->Wcid = MCAST_WCID;\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\tif (RTMP_GET_PACKET_QOS_NULL(pPacket) != 0x00)\n\t\t\tpMLMEContext->Wcid = RTMP_GET_PACKET_WCID(pPacket);\n\t\telse\n\t\t\tpMLMEContext->Wcid = MCAST_WCID;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n\t/*hex_dump(\"RtmpUSBMgmtKickOut\", &pMLMEContext->TransferBuffer->field.WirelessPacket[0], (pMLMEContext->BulkOutSize > 16 ? 16 : pMLMEContext->BulkOutSize));*/\n\n/*\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\tif (pAd->MgmtRing.TxSwFreeIdx == MGMT_RING_SIZE)\n\t\tneedKickOut = TRUE;\n*/\n\n\t/* Decrease the TxSwFreeIdx and Increase the TX_CTX_IDX*/\n\tpAd->MgmtRing.TxSwFreeIdx--;\n\tINC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE);\n\t\n\tRTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);\t\n\t\n\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);\n\t/*if (needKickOut)*/\n\tRTUSBKickBulkOut(pAd);\n\t\n\treturn 0;\n}\n\n\nVOID RtmpUSBNullFrameKickOut(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN UCHAR *pNullFrame,\n\tIN UINT32 frameLen)\n{\n\n\tPTX_CONTEXT\tpNullContext = &pAd->NullContext[0];\n\n#ifdef CONFIG_MULTI_CHANNEL\n\n\n\tif (QueIdx == EDCA_AC0_PIPE)\n\t{\n\t\tpNullContext = &pAd->NullContext[0];\n\t}\n\telse if (QueIdx == HCCA_PIPE)\n\t{\n\t\tpNullContext = &pAd->NullContext[1];\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Unknow pipe!!\\n\", __FUNCTION__));\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\tif (pNullContext->InUse == FALSE)\n\t{\n\t\tPTX_CONTEXT pNullContext;\n\t\tTXINFO_STRUC *pTxInfo;\n\t\tTXWI_STRUC *pTxWI;\n\t\tUCHAR *pWirelessPkt;\n\t\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t\tpNullContext = &(pAd->NullContext[0]);\n\n\t\t/* Set the in use bit*/\n\t\tpNullContext->InUse = TRUE;\n\t\tpWirelessPkt = (PUCHAR)&pNullContext->TransferBuffer->field.WirelessPacket[0];\n\n\t\tRTMPZeroMemory(&pWirelessPkt[0], 100);\n\t\tpTxInfo = (TXINFO_STRUC *)&pWirelessPkt[0];\n\t\trlt_usb_write_txinfo(pAd, pTxInfo, (USHORT)(frameLen + TXWISize + TSO_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE,  FALSE, 1);\n\t\tpTxInfo->TxInfoQSEL = FIFO_EDCA;\n\t\tpTxWI = (TXWI_STRUC *)&pWirelessPkt[TXINFO_SIZE];\n\t\tRTMPWriteTxWI(pAd, pTxWI,  FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, frameLen,\n\t\t\t0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit);\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPWIEndianChange(pAd, (PUCHAR)pTxWI, TYPE_TXWI);\n#endif /* RT_BIG_ENDIAN */\n\t\tRTMPMoveMemory(&pWirelessPkt[TXWISize + TXINFO_SIZE + TSO_SIZE], pNullFrame, frameLen);\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, (PUCHAR)&pWirelessPkt[TXINFO_SIZE + TXWISize + TSO_SIZE], DIR_WRITE, FALSE);\n#endif /* RT_BIG_ENDIAN */\n\t\tpNullContext->BulkOutSize =  TXINFO_SIZE + TXWISize + TSO_SIZE + frameLen + 4;\n\n\n\t\t/* Fill out frame length information for global Bulk out arbitor*/\n\t\t/*pNullContext->BulkOutSize = TransferBufferLength;*/\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - Send NULL Frame @%d Mbps...\\n\", __FUNCTION__, RateIdToMbps[pAd->CommonCfg.TxRate]));\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif ((QueIdx == HCCA_PIPE) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL_HCCA);\n\t\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);\n\n\t\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ;\n\t\t\n\t\t/* Kick bulk out */\n\t\tRTUSBKickBulkOut(pAd);\n\t}\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Get a received packet.\n\nArguments:\n\tpAd\t\t\t\t\tdevice control block\n\tpSaveRxD\t\t\treceive descriptor information\n\t*pbReschedule\t\tneed reschedule flag\n\t*pRxPending\t\t\tpending received packet flag\n\nReturn Value:\n    the recieved packet\n\nNote:\n========================================================================\n*/\nPNDIS_PACKET GetPacketFromRxRing(\n\tIN RTMP_ADAPTER *pAd,\n\tOUT RX_BLK *pRxBlk,\n\tOUT BOOLEAN *pbReschedule,\n\tINOUT UINT32 *pRxPending)\n{\n\tRX_CONTEXT *pRxContext;\n\tPNDIS_PACKET pNetPkt;\n\tUCHAR *pData;\n\tULONG ThisFrameLen, RxBufferLength, valid_len;\n\tRXWI_STRUC *pRxWI;\n\tUINT8 RXWISize = pAd->chipCap.RXWISize;\n\tRXINFO_STRUC *pRxInfo;\n#ifdef RLT_MAC\n\tRXFCE_INFO *pRxFceInfo;\n#endif /* RLT_MAC */\n\n\n\tpRxContext = &pAd->RxContext[pAd->NextRxBulkInReadIndex];\n\tif ((pRxContext->Readable == FALSE) || (pRxContext->InUse == TRUE))\n\t\treturn NULL;\n\n\tRxBufferLength = pRxContext->BulkInOffset - pAd->ReadPosition;\n\tvalid_len = RXDMA_FIELD_SIZE + RXWISize + sizeof(RXINFO_STRUC);\n#ifdef RLT_MAC\n\tvalid_len += sizeof(RXFCE_INFO);\n#endif /* RLT_MAC */\n\tif (RxBufferLength < valid_len)\n\t{\n\t\tgoto label_null;\n\t}\n\t\n\tpData = &pRxContext->TransferBuffer[pAd->ReadPosition];\n//+++Add by shiang for debug\nif (0) {\n\thex_dump(\"GetPacketFromRxRing\", pData, (RxBufferLength > 7000 ? 7000 : RxBufferLength));\n}\n//---Add by shiang for debug\n\n\t/* The RXDMA field is 4 bytes, now just use the first 2 bytes. The Length including the (RXWI + MSDU + Padding) */\n\tThisFrameLen = *pData + (*(pData+1)<<8);\n\tif (ThisFrameLen == 0)\n\t{\t    \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BIRIdx(%d): RXDMALen is zero.[%ld], BulkInBufLen = %ld)\\n\", \n\t\t\t\t\t\t\t\tpAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset));     \n\t\tgoto label_null;\n\t}   \n\tif ((ThisFrameLen & 0x3) != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BIRIdx(%d): RXDMALen not multiple of 4.[%ld], BulkInBufLen = %ld)\\n\", \n\t\t\t\t\t\t\t\tpAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset));\n\t\tgoto label_null;\n\t}\n\n\tif ((ThisFrameLen + 8) > RxBufferLength)\t/* 8 for (RXDMA_FIELD_SIZE + sizeof(RXINFO_STRUC))*/\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"BIRIdx(%d):FrameLen(0x%lx) outranges. BulkInLen=0x%lx, remaining RxBufLen=0x%lx, ReadPos=0x%lx\\n\", \n\t\t\t\t\t\tpAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset, RxBufferLength, pAd->ReadPosition));\n\n\t\t/* error frame. finish this loop*/\n\t\tgoto label_null;\n\t}\n\n\t/* skip USB frame length field*/\n\tpData += RXDMA_FIELD_SIZE;\n#ifdef RLT_MAC\n\tpRxInfo = (RXINFO_STRUC *)pData;\n\tpRxFceInfo = (RXFCE_INFO *)(pData + ThisFrameLen);\n\n\tpData += RXINFO_SIZE;\n#endif /* RLT_MAC */\n#ifdef RTMP_MAC\n\tpRxInfo = (RXINFO_STRUC *)(pData + ThisFrameLen);\n#endif /* RTMP_MAC */\n\n\tpRxWI = (RXWI_STRUC *)pData;\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPWIEndianChange(pAd, pData, TYPE_RXWI);\n#endif /* RT_BIG_ENDIAN */\n\tif (pRxWI->RxWIMPDUByteCnt > ThisFrameLen)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():pRxWIMPDUtotalByteCount(%d) large than RxDMALen(%ld)\\n\", \n\t\t\t\t\t\t\t\t\t__FUNCTION__, pRxWI->RxWIMPDUByteCnt, ThisFrameLen));\n\t\tgoto label_null;\n\t}\n#ifdef RT_BIG_ENDIAN\n\tRTMPWIEndianChange(pAd, pData, TYPE_RXWI);\n#endif /* RT_BIG_ENDIAN */\n\n\t/* allocate a rx packet*/\n\tpNetPkt = RTMP_AllocateFragPacketBuffer(pAd, ThisFrameLen);\n\tif (pNetPkt == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s():Cannot Allocate sk buffer for this Bulk-In buffer!\\n\", __FUNCTION__));\n\t\tgoto label_null;\n\t}\n\n\t/* copy the rx packet*/\n\tRTMP_USB_PKT_COPY(get_netdev_from_bssid(pAd, BSS0), pNetPkt, ThisFrameLen, pData);\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPDescriptorEndianChange((PUCHAR)pRxInfo, TYPE_RXINFO);\n#endif /* RT_BIG_ENDIAN */\t\n\n#ifdef RLT_MAC\n\tNdisMoveMemory((VOID *)&pRxBlk->hw_rx_info[0], (VOID *)pRxFceInfo, sizeof(RXFCE_INFO));\n\tpRxBlk->pRxFceInfo = (RXFCE_INFO *)&pRxBlk->hw_rx_info[0];\n#endif /* RLT_MAC */\n\n\tNdisMoveMemory(&pRxBlk->hw_rx_info[RXINFO_OFFSET], pRxInfo, RXINFO_SIZE);\n\tpRxBlk->pRxInfo = (RXINFO_STRUC *)&pRxBlk->hw_rx_info[RXINFO_OFFSET];\n\n\n\t/* update next packet read position.*/\n\tpAd->ReadPosition += (ThisFrameLen + RXDMA_FIELD_SIZE + RXINFO_SIZE);\t/* 8 for (RXDMA_FIELD_SIZE + sizeof(RXINFO_STRUC))*/\n\n\treturn pNetPkt;\n\nlabel_null:\n\t\n\treturn NULL;\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCheck Rx descriptor, return NDIS_STATUS_FAILURE if any error dound\n\t\t\n\tArguments:\n\t\tpRxD\t\tPointer\tto the Rx descriptor\n\t\t\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS\t\tNo err\n\t\tNDIS_STATUS_FAILURE\t\tError\n\t\t\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS\tRTMPCheckRxError(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PHEADER_802_11 pHeader,\t\n\tIN RXWI_STRUC *pRxWI,\t\n\tIN RXINFO_STRUC *pRxInfo)\n{\t\n\tPCIPHER_KEY pWpaKey;\n\tINT dBm;\n\t\n\tif(pRxInfo == NULL)\n\t\treturn(NDIS_STATUS_FAILURE);\n\n\t/* Phy errors & CRC errors*/\n\tif (pRxInfo->Crc)\n\t{\n\t\t/* Check RSSI for Noise Hist statistic collection.*/\n\t\tdBm = (INT) (pRxWI->RxWIRSSI0) - pAd->BbpRssiToDbmDelta;\n\t\tif (dBm <= -87)\n\t\t\tpAd->StaCfg.RPIDensity[0] += 1;\n\t\telse if (dBm <= -82)\n\t\t\tpAd->StaCfg.RPIDensity[1] += 1;\n\t\telse if (dBm <= -77)\n\t\t\tpAd->StaCfg.RPIDensity[2] += 1;\n\t\telse if (dBm <= -72)\n\t\t\tpAd->StaCfg.RPIDensity[3] += 1;\n\t\telse if (dBm <= -67)\n\t\t\tpAd->StaCfg.RPIDensity[4] += 1;\n\t\telse if (dBm <= -62)\n\t\t\tpAd->StaCfg.RPIDensity[5] += 1;\n\t\telse if (dBm <= -57)\n\t\t\tpAd->StaCfg.RPIDensity[6] += 1;\n\t\telse if (dBm > -57)\n\t\t\tpAd->StaCfg.RPIDensity[7] += 1;\n\t\t\n\t\treturn(NDIS_STATUS_FAILURE);\n\t}\n\t\n\t/* Add Rx size to channel load counter, we should ignore error counts*/\n\tpAd->StaCfg.CLBusyBytes += (pRxWI->RxWIMPDUByteCnt + 14);\n\n#ifndef CLIENT_WDS\n\tif (pHeader->FC.ToDs\n\t\t)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Err;FC.ToDs\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n#endif /* CLIENT_WDS */\n\n\t/* Paul 04-03 for OFDM Rx length issue*/\n\tif (pRxWI->RxWIMPDUByteCnt > MAX_AGGREGATION_SIZE)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"received packet too long\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t/* Drop not U2M frames, cant's drop here because we will drop beacon in this case*/\n\t/* I am kind of doubting the U2M bit operation*/\n\t/* if (pRxD->U2M == 0)*/\n\t/*\treturn(NDIS_STATUS_FAILURE);*/\n\n\t/* drop decyption fail frame*/\n\tif (pRxInfo->Decrypted && pRxInfo->CipherErr)\n\t{\n\t\t\t\t\t\t\n\t\tif (((pRxInfo->CipherErr & 1) == 1) && INFRA_ON(pAd))\n            RTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);\t\t\t\n\n\t\tif (((pRxInfo->CipherErr & 2) == 2) && INFRA_ON(pAd))\n                RTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);\n\n\t\t\n\t\t/* MIC Error*/\n\t\tif ((pRxInfo->CipherErr == 2) && pRxInfo->MyBss)\n\t\t{\t\t\t\n\t\t\tpWpaKey = &pAd->SharedKey[BSS0][pRxWI->RxWIKeyIndex];\n#ifdef WPA_SUPPLICANT_SUPPORT                                    \n            if (pAd->StaCfg.WpaSupplicantUP)\n                WpaSendMicFailureToWpaSupplicant(pAd->net_dev, \n                                   (pWpaKey->Type == PAIRWISEKEY) ? TRUE:FALSE);\n            else\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\tRTMPReportMicError(pAd, pWpaKey);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"Rx MIC Value error\\n\"));\n\t\t}\n\t\t\n\t\tif (pRxInfo->Decrypted &&\n\t\t\t(pAd->SharedKey[BSS0][pRxWI->RxWIKeyIndex].CipherAlg == CIPHER_AES) &&\n\t\t\t(pHeader->Sequence == pAd->FragFrame.Sequence))\n\t\t{\n\t\t\t\n\t\t\t/* Acceptable since the First FragFrame no CipherErr problem.*/\n\t\t\treturn(NDIS_STATUS_SUCCESS);\n\t\t}\n\n\t\treturn(NDIS_STATUS_FAILURE);\n\t}\n\n\treturn(NDIS_STATUS_SUCCESS);\n}\n\n\nVOID RtmpUsbStaAsicForceWakeupTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\t\n\n\tif (pAd && pAd->Mlme.AutoWakeupTimerRunning)\n\t{\n\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t{\n\t\t\tif ( !OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) )\n\t\t\t{\n\t\t\t\tRTMPSetTimer(&pAd->Mlme.AutoWakeupTimer, AUTO_WAKEUP_TIMEOUT);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\t\n\t\t\tASIC_RADIO_ON(pAd, MLME_RADIO_ON);\n\t\t}\n\t\telse\n#endif /* MT7601 */\n\t\t{\n\t\t\tRTUSBBulkReceive(pAd);\n\n\t\t\tAsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02, FALSE);\n\t\t}\n\n\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);\n\t\tpAd->Mlme.AutoWakeupTimerRunning = FALSE;\n\t}\n}\n\n\nVOID RT28xxUsbStaAsicForceWakeup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN       bFromTx)\n{\n\tBOOLEAN\tCanceled;\n\n\tif (pAd->Mlme.AutoWakeupTimerRunning)\n\t{\n\t\tif ( !OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) )\n\t\t{\n\t\t\treturn;\t\n\t\t}\n\t\tRTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled);\n\t\tpAd->Mlme.AutoWakeupTimerRunning = FALSE;\n\t}\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tASIC_RADIO_ON(pAd, DOT11_RADIO_ON);\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\t\tAsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02, FALSE);\n\t}\n\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);\n}\n\n\nVOID RT28xxUsbStaAsicSleepThenAutoWakeup(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT TbttNumToNextWakeUp) \n{\n\n\n\t/* Not going to sleep if in the Count Down Time*/\n\tif (pAd->CountDowntoPsm > 0)\n\t\treturn;\n\n\tif (pAd->Mlme.AutoWakeupTimerRunning == TRUE)\n\t\treturn;\n\n\t/* we have decided to SLEEP, so at least do it for a BEACON period.*/\n\tif (TbttNumToNextWakeUp == 0)\n\t\tTbttNumToNextWakeUp = 1;\n\n\n\tRTMPSetTimer(&pAd->Mlme.AutoWakeupTimer, AUTO_WAKEUP_TIMEOUT);\n\tpAd->Mlme.AutoWakeupTimerRunning = TRUE;\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tASIC_RADIO_OFF(pAd, DOT11_RADIO_OFF);\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\t\tAsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02, FALSE);   /* send POWER-SAVE command to MCU. Timeout 40us.*/\n\t\t/* cancel bulk-in IRPs prevent blocking CPU enter C3.*/\n\t\tif((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t{\n\t\t\tRTUSBCancelPendingBulkInIRP(pAd);\n\t\t\t/* resend bulk-in IRPs to receive beacons after a period of (pAd->CommonCfg.BeaconPeriod - 40) ms*/\n\t\t\tpAd->PendingRx = 0;\n\t\t}\n\t}\n\n\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE);\n\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n#endif /* RTMP_MAC_USB */\n\n"
  },
  {
    "path": "src/common/cmm_dfs.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    ap_dfs.c\n\n    Abstract:\n    Support DFS function.\n\n    Revision History:\n    Who       When            What\n    --------  ----------      ----------------------------------------------\n*/\n\n#include \"rt_config.h\"\n\n#ifdef DFS_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\n\n#ifdef DFS_DEBUG\nNewDFSDebugResult TestResult[1000];\n#endif\n\nNewDFSValidRadar NewDFSValidTable[] = \n{\n\t/* FCC-1  && (Japan W53 Radar 1 / W56 Radar 2)*/\n\t{\n\t(NEW_DFS_FCC | NEW_DFS_JAP | NEW_DFS_JAP_W53),\n\t7,\n\t10, 1000,\n\t0,\n\t4,\n\t0, 0, \n\t28570 - 70,\n\t150\n\t},\n\t/* FCC-2*/\n\t{\n\t(NEW_DFS_FCC | NEW_DFS_JAP),\n\t7,\n\t13, 1000,\n\t0,\n\t1,\n\t3000, 4600 - 20,\n\t0,\n\t25\n\t},\n\t/* FCC-3 & FCC-4*/\n\t{\n\t(NEW_DFS_FCC | NEW_DFS_JAP),\n\t7,\n\t/*120, 200, FCC-3 */\n\t/*220, 400, FCC-4*/\n\t100, 1500, \n\t0,\n\t1,\n\t4000, 10000 - 40, \n\t0,\n\t60\n\t},\n\t/* FCC-6*/\n\t{\n\t(NEW_DFS_FCC | NEW_DFS_JAP),\n\t7,\n\t12, 1000,\n\t0,\n\t1,\n\t0, 0, \n\t6660-10,\n\t35\n\t},\n\t/* Japan W53 Radar 2*/\n\t{\n\tNEW_DFS_JAP_W53,\n\t7,\n\t40, 1000, \n\t0,\n\t1,\n\t0, 0, \n\t76923 - 30,\n\t180\n\t},\n\t/* Japan W56 Radar 1*/\n\t{\n\tNEW_DFS_JAP,\n\t7,\n\t5, 500, \n\t0,\n\t2,\n\t0, 0, \n\t27777 - 30,\n\t70\n\t},\n\t/* Japan W56 Radar 3*/\n\t{\n\tNEW_DFS_JAP,\n\t7,\n\t30, 1000, \n\t0,\n\t1,\n\t0, 0, \n\t80000 - 50,\n\t200\n\t},\n\n/* CE Staggered radar*/\n\n\t{\n\t/*\tEN-1*/\n\t/*\twidth\t0.8 - 5 us*/\n\t/*\tPRF\t\t200 - 1000 Hz*/\n\t/*\tPRI\t\t5000 - 1000 us\t(T: 20000 - 100000)*/\n\t/*\t*/\n\tNEW_DFS_EU,\n\t0xf,\n\t10, 1000, \n\t0,\n\t1,\n\t20000-15, 100000-70, \n\t0,\n\t120\n\t},\n\t/*\tEN-2*/\n\t/*\twidth\t0.8 - 15 us*/\n\t/*\tPRF\t\t200 - 1600 Hz*/\n\t/*\tPRI\t\t5000 - 625 us\t(T: 12500 - 100000)*/\n\t{\n\tNEW_DFS_EU,\n\t0xf,\n\t10, 2000, \n\t0,\n\t1,\n\t12500 - 10, 100000 - 70, \n\t0,\n\t120\n\t},\n\t\n\t/*\tEN-3*/\n\t/*\twidth\t0.8 - 15 us*/\n\t/*\tPRF\t\t2300 - 4000 Hz*/\n\t/*\tPRI\t\t434 - 250 us\t(T: 5000 - 8695)*/\n\t{\n\tNEW_DFS_EU,\n\t0xf,\n\t21, 2000, \n\t0,\n\t1,\n\t5000 - 4, 8695 - 7, \n\t0,\n\t50\n\t},\n\t/*\tEN-4*/\n\t/*\twidth\t20 - 30 us*/\n\t/*\tPRF\t\t2000 - 4000 Hz*/\n\t/*\tPRI\t\t500 - 250 us\t(T: 5000 - 10000)*/\n\t/*\tNote : with Chirp Modulation +- 2,5Mhz*/\n\t{\n\tNEW_DFS_EU,\n\t0xf,\n\t380, 3000, \n\t0,\n\t4,\n\t5000 - 4, 10000 - 8, \n\t0,\n\t60\n\t},\n\t/*\tEN-5*/\n\t/*\twidth\t0.8 - 2 us*/\n\t/*\tPRF\t\t300 - 400 Hz*/\n\t/*\tPRI\t\t3333 - 2500 us\t(T: 50000 - 66666)*/\n\t/*\tStaggered PRF, 20 - 50 pps*/\n\t{\n\tNEW_DFS_EU,\n\t0xf,\n\t10, 800, \n\t0,\n\t1,\n\t50000 - 35, 66666 + 50,\n\t0,\n\t30\n\t},\n\t/*\tEN-6*/\n\t/*\twidth\t0.8 - 2 us*/\n\t/*\tPRF\t\t400 - 1200 Hz*/\n\t/*\tPRI\t\t2500 - 833 us\t(T: 16666 - 50000)*/\n\t/*\tStaggered PRF, 80 - 400 pps*/\n\t{\n\tNEW_DFS_EU,\n\t0xf,\n\t10, 800, \n\t0,\n\t1,\n\t16666 - 13, 50000 + 35,\n\t0,\n\t30\n\t},\n\t\n\t{\n\tNEW_DFS_END,\n\t0,\n\t0, 0, \n\t0,\n\t0,\n\t0, 0, \n\t0,\n\t0,\n\t},\n};\n\nstatic NewDFSTable NewDFSTable1[] = \n{\n\t{\n\t\t/* ch, mode(0~7), M(~511), el, eh(~4095), wl, wh(~4095), err_w, tl, th, err_t, bl, bh*/\n\t\tNEW_DFS_FCC,\n\t\t{\n\t\t{0, 0,  10,   8,  16,   6, 2000,  5, 2900, 29000,  5, 0, 0},\n\t\t{1, 0,  70,  42, 126,  20, 5000,  5, 2900, 29000, 10, 0, 0},\n\t\t{2, 0, 100,  42, 160,  20, 5000, 25, 2900, 10100, 20, 0, 0},\n\t\t{3, 2, 200,  20, 150, 900, 2200, 50, 1000, 999999999, 200, 0, 999999999},\n\t\t}\n\t},\n\n    {\n        NEW_DFS_EU,\n        {\n            {0, 0,  10,  10,  18,   4, 4095,   5,  7800, 101000,   5, 0, 0},\n            {1, 0,  70,  42,  90,  20, 4095,   3,  4900, 101000,  10, 0, 0},\n            {2, 0, 100,  42, 160,  20, 4095,   5,  4900, 101000,  20, 0, 0},\n            {3, 3, 200,  20, 150, 200, 4095, 100,  4900,  11000, 200, 0, 0},      \n            {4, 8,   0,   8,  17,  7,   70,   2, 32500, 200500,  10, 0, 0},\n            /*{5, 1,   0,  12,  16,   8,  700,  5, 33000, 135000,    100, 0, 0},*/\n        }\n    },\n\n\t{\n\t\tNEW_DFS_JAP,\n\t\t{\n\t\t{0, 0,  10,   8,  16,   4, 2000,  5, 2900, 85000,  5, 0, 0},\n\t\t{1, 0, 70,  48, 126,   20, 5000,  5,  2900, 85000,  10,  0,   0},\n\t\t{2, 0, 100, 48, 160,   20, 5000, 25,  2900, 85000,  20,  0,   0},\n\t\t{3, 2, 200, 20, 150,  900, 2200, 50,  1000, 999999999,  200,  0, 999999999},\n\t\t}\n\t},\n\n\t{\n\t\tNEW_DFS_JAP_W53,\n\t\t{\n\t\t{0, 0,  10,   8,  16,   8,  2000,  5, 28000, 85000, 10},\n\t\t{1, 0, 32,  24,  64,   20, 2000, 5,  28000, 85000, 10},\n\t\t{2, 0, 100,  42, 160,   20, 2000, 25,  28000, 85000, 10},\n\t\t/*{3, 2, 200,  20, 150, 300, 2000,  50, 15000, 45000, 200},*/\n\t\t}\n\t},\n};\n\nstatic void dfs_sw_init(\n\t\tIN PRTMP_ADAPTER pAd);\n\nstatic BOOLEAN StagerRadarCheck(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tUINT8 dfs_channel);\n\nstatic BOOLEAN ChirpRadarCheck(\n\t\tIN PRTMP_ADAPTER pAd);\n\nstatic BOOLEAN DfsEventDataFetch(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN PUCHAR\t\t  pData,\n\t\tOUT PDFS_EVENT pDfsEvent);\n\nstatic VOID DfsCheckBusyIdle(\n\t\tIN PRTMP_ADAPTER pAd);\n\nstatic BOOLEAN DfsChannelCheck(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN UINT8 DfsChannel);\n\nstatic VOID ChannelSelectOnRadarDetection(\n\t\tIN PRTMP_ADAPTER pAd);\n\nstatic BOOLEAN DfsEventDrop(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN PDFS_EVENT pDfsEvent);\n\nstatic inline BOOLEAN NewRadarDetectionMcuStart(PRTMP_ADAPTER pAd)\n{\n\t/*\n\t\t8051 firmware don't care parameter Token, Arg0 and Arg1\n\t*/\n\treturn AsicSendCommandToMcu(pAd, DFS_ONOFF_MCU_CMD, 0xff, 0x01, 0x01, FALSE);\n}\n\nstatic inline BOOLEAN NewRadarDetectionMcuStop(PRTMP_ADAPTER pAd)\n{\n\t/*\n\t\t8051 firmware don't care parameter Token, Arg0 and Arg1\n\t*/\n\treturn AsicSendCommandToMcu(pAd, DFS_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);\n}\n\n\n#ifdef RTMP_MAC_USB\nstatic VOID SwCheckDfsEventWithFw(\n\t\tIN PRTMP_ADAPTER pAd);\n#endif /*RTMP_MAC_USB  */\n\n/*\n    ========================================================================\n    Routine Description:\n        Radar wave detection. The API should be invoke each second.\n        \n    Arguments:\n        pAd         - Adapter pointer\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID ApRadarDetectPeriodic(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tINT\ti;\n\n\tpAd->Dot11_H.InServiceMonitorCount++;\n\n\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->ChannelList[i].RemainingTimeForUse > 0)\n\t\t{\n\t\t\tpAd->ChannelList[i].RemainingTimeForUse --;\n\t\t\tif ((pAd->Mlme.PeriodicRound%5) == 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"RadarDetectPeriodic - ch=%d, RemainingTimeForUse=%d\\n\",\n\t\t\t\t\tpAd->ChannelList[i].Channel, pAd->ChannelList[i].RemainingTimeForUse));\n\t\t\t}\n\t\t}\n\t}\n\t/*radar detect*/\n\tif ((pAd->CommonCfg.Channel > 14)\n\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t&& RadarChannelCheck(pAd, pAd->CommonCfg.Channel))\n\t{\n\t\tRadarDetectPeriodic(pAd);\n\t}\n\treturn;\n}\n\n\n/* \t0 = Switch Channel when Radar Hit (Normal mode) \n\t1 = Don't Switch Channel when Radar Hit */\nINT\tSet_RadarDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\n\tpRadarDetect->McuRadarDebug = simple_strtol(arg, 0, 16);\n\t\n\tif (pRadarDetect->McuRadarDebug & RADAR_DONT_SWITCH)\n\t\tprintk(\"Dont Switch Channel\\n\");\n\t\n\tif (pRadarDetect->McuRadarDebug & RADAR_DEBUG_SILENCE)\n\t\tprintk(\"Silence\\n\");\n\t\n\tif (pRadarDetect->McuRadarDebug & RADAR_DEBUG_EVENT)\n\t{\n\t\tif (pRadarDetect->bDfsSwDisable == 1)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): Warning!! DfsSwDisable is 1\\n\", __FUNCTION__));\n\t\tprintk(\"Show effective event\\n\");\n\t}\n\t\n\tif (pRadarDetect->McuRadarDebug & RADAR_DEBUG_SW_SILENCE)\n\t\tprintk(\"SW detection Silence\\n\");\n\treturn TRUE;\n}\n\nINT\tSet_ResetRadarHwDetect_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR channel = 0;\n#ifdef RT65xx\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t/* Reset status */\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R1, pRadarDetect->EnabledChMask);\n#else\n\t/*Set BBP_R140=0x02 and Read BBP_R141 to store at channel */\n\tRTMP_DFS_IO_READ8(pAd, 0x2, &channel);\n\t/* reset the radar channel for new counting */\n\tRTMP_DFS_IO_WRITE8(pAd, 0x2, channel);\n#endif\n\tprintk(\"==>reset the radar channel for new counting channel =0x%x\\n\",channel);\n\treturn TRUE;\n}\n\n\nINT\tSet_DfsLowerLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\n\tpRadarDetect->DfsLowerLimit = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_DfsUpperLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\n\tpRadarDetect->DfsUpperLimit = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\n\nINT Set_DfsSwDisable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t\n\tpRadarDetect->bDfsSwDisable = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"pRadarDetect->bDfsSwDisable = %u\\n\", pRadarDetect->bDfsSwDisable));\n\treturn TRUE;\n}\n\nINT Set_DfsEnvtDropAdjTime_Proc(\n\tIN PRTMP_ADAPTER   pAd, \n\tIN PSTRING  arg)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->EvtDropAdjTime = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"EventDropAdjTime = %u\\n\", pDfsSwParam->EvtDropAdjTime));\n\treturn TRUE;\n}\n\nINT\tSet_RadarStart_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pAd->CommonCfg.RadarDetect.DfsProgramParam;\n\t\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t{\n\t\tNewRadarDetectionStart(pAd);\n\t}\n\telse if ((simple_strtol(arg, 0, 10) >= 1) && (simple_strtol(arg, 0, 10) <= pAd->CommonCfg.RadarDetect.EnabledChMask))\n\t{\n\t\tpDfsProgramParam->ChEnable = simple_strtol(arg, 0, 10);\n\t\tprintk(\"Ch Enable == 0x%x\\n\", pDfsProgramParam->ChEnable);\n\t\tNewRadarDetectionStart(pAd);\n\t}\n\t\n\treturn TRUE;\n}\n\nINT\tSet_RadarStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tNewRadarDetectionStop(pAd);\n\treturn TRUE;\n}\n\n\nINT\tSet_RadarSetTbl1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPUCHAR p2 = arg;\n\tULONG idx, value;\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pAd->CommonCfg.RadarDetect.DfsProgramParam;\n\t\n\twhile((*p2 != ':') && (*p2 != '\\0'))\n\t{\n\t\tp2++;\n\t}\n\t\n\tif (*p2 == ':')\n\t{\n\t\tA2Dec(idx, arg);\n\t\tA2Dec(value, p2+ 1);\n\t\tif (idx == 0)\n\t\t{\n\t\t\tpDfsProgramParam->DeltaDelay = value;\n\t\t\tprintk(\"Delta_Delay = %d\\n\", pDfsProgramParam->DeltaDelay);\n\t\t}\n\t\telse\n\t\t\tmodify_table1(pAd, idx, value);\n\t\tNewRadarDetectionStart(pAd);\n\t}\n\telse\n\t\tprintk(\"please enter iwpriv ra0 set RadarT1=xxx:yyy\\n\");\n\t\n\treturn TRUE;\n}\n\nINT\tSet_RadarSetTbl2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPUCHAR p2 = arg;\n\tULONG idx, value;\n\t\n\twhile((*p2 != ':') && (*p2 != '\\0'))\n\t{\n\t\tp2++;\n\t}\n\t\n\tif (*p2 == ':')\n\t{\n\t\tA2Dec(idx, arg);\n\t\tA2Dec(value, p2+ 1);\n\t\tmodify_table2(pAd, idx, value);\n\t}\n\telse\n\t\tprintk(\"please enter iwpriv ra0 set RadarT2=xxx:yyy\\n\");\n\t\n\treturn TRUE;\n}\n\n\nINT\tSet_Fcc5Thrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->fcc_5_threshold = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_ChBusyThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint i;\n\tPUCHAR p1 = arg, p2;\n\tULONG value;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t\n\tpRadarDetect->fdf_num = 0;\n\tfor (i = 0; i < MAX_FDF_NUMBER; i++)\n\t{\n\t\tp2 = p1;\n\t\twhile((*p2 != ':') && (*p2 != '\\0'))\n\t\t{\n\t\t\tp2++;\n\t\t}\n\t\n\t\tif (*p2 == ':')\n\t\t{\n\t\t\tif (*p1 == '-')\n\t\t\t{\n\t\t\t\tp1++;\n\t\t\t\tA2Dec(value, p1);\n\t\t\t\tvalue *= -1;\n\t\t\t}\n\t\t\telse\n\t\t\t\tA2Dec(value, p1);\n\t\t\t\n\t\t\tpRadarDetect->ch_busy_threshold[i] = value;\n\t\t\tprintk(\"pRadarDetect->ch_busy_threshold[%d] = %d\\n\", i, pRadarDetect->ch_busy_threshold[i]);\n\t\t\tpRadarDetect->fdf_num++;\n\t\t\tp1 = p2 + 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpRadarDetect->ch_busy_threshold[i] = simple_strtol(p1, 0, 10);\n\t\t\tprintk(\"pRadarDetect->ch_busy_threshold[%d] = %d\\n\", i, pRadarDetect->ch_busy_threshold[i]);\n\t\t\tpRadarDetect->fdf_num++;\n\t\t\tbreak;\n\t\t}\n\t}\n\tprintk(\"pRadarDetect->fdf_num = %d\\n\", pRadarDetect->fdf_num);\n\n\treturn TRUE;\n}\n\n\nINT\tSet_RssiThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint i;\n\tPUCHAR p1 = arg, p2;\n\tULONG value;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t\n\tpRadarDetect->fdf_num = 0;\n\tfor (i = 0; i < MAX_FDF_NUMBER; i++)\n\t{\n\t\tp2 = p1;\n\t\twhile((*p2 != ':') && (*p2 != '\\0'))\n\t\t{\n\t\t\tp2++;\n\t\t}\n\t\n\t\tif (*p2 == ':')\n\t\t{\n\t\t\tif (*p1 == '-')\n\t\t\t{\n\t\t\t\tp1++;\n\t\t\t\tA2Dec(value, p1);\n\t\t\t\tvalue *= -1;\n\t\t\t}\n\t\t\telse\n\t\t\t\tA2Dec(value, p1);\n\t\t\t\n\t\t\tpRadarDetect->rssi_threshold[i] = value;\n\t\t\tprintk(\"pRadarDetect->rssi_threshold[%d] = %d\\n\", i, pRadarDetect->rssi_threshold[i]);\n\t\t\tpRadarDetect->fdf_num++;\n\t\t\tp1 = p2 + 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpRadarDetect->rssi_threshold[i] = simple_strtol(p1, 0, 10);\n\t\t\tprintk(\"pRadarDetect->rssi_threshold[%d] = %d\\n\", i, pRadarDetect->rssi_threshold[i]);\n\t\t\tpRadarDetect->fdf_num++;\n\t\t\tbreak;\n\t\t}\n\t}\n\tprintk(\"pRadarDetect->fdf_num = %d\\n\", pRadarDetect->fdf_num);\n\n\treturn TRUE;\n\tpRadarDetect->rssi_threshold[0] = simple_strtol(arg, 0, 10);\n\n\treturn TRUE;\n}\n\nINT\tSet_PollTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tpRadarDetect->PollTime = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_Ch0LErr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_width_ch0_err_L = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_DeclareThres_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_declare_thres = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_CheckLoop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_check_loop = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_MaxPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_max_period = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_PeriodErr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_period_err = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_Ch0HErr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_width_ch0_err_H = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_Ch1Shift_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_width_diff_ch1_Shift = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_Ch2Shift_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tpDfsSwParam->dfs_width_diff_ch2_Shift = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\n\n#ifdef DFS_DEBUG\nINT\tSet_CEPrintDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint i;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\t\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t{\n\t\tpDfsSwParam->DebugPortPrint = 1;\n\t}\n\t\n\tif (simple_strtol(arg, 0, 10) == 1)\n\t{\n\t\tif (pDfsSwParam->DebugPortPrint == 3)\n\t\t{\n\t\t\tfor (i = 0; i < 384; i++)\n\t\t\t{\n\t\t\t\tprintk(\"%02x \", pDfsSwParam->DebugPort[i]);\n\t\t\t\tif (((i+1) % 18) == 0)\n\t\t\t\t\tprintk(\"\\n\");\n\t\t\t}\n\t\t\tpDfsSwParam->DebugPortPrint = 0;\n\t\t}\n\t}\n\treturn TRUE;\n}\n#endif /* DFS_DEBUG */\n\n\nINT\tSet_RadarSim_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\nint i=0, id=0;\nint dfs_data[] = {\t\t208, 142172,\n\t\t\t\t\t160, 260514,\n\t\t\t\t\t208, 363873,\n\t\t\t\t\t160, 482216,\n\t\t\t\t\t208, 585575,\n\t\t\t\t\t164, 703918,\n\t\t\t\t\t208, 807277,\n\t\t\t\t\t160, 925620,\n\t\t\t\t\t208, 1028979,\n\t\t\t\t\t164, 1147321};\n\n\tpDfsSwParam->dfs_w_counter++;\n\tfor (i = 0; i < 10; i++)\n\t{\n\t\tpDfsSwParam->DFS_W[id][pDfsSwParam->dfs_w_idx[id]].counter = pDfsSwParam->dfs_w_counter;\n\t\tpDfsSwParam->DFS_W[id][pDfsSwParam->dfs_w_idx[id]].timestamp = dfs_data[2*i+1];\n\t\tpDfsSwParam->DFS_W[id][pDfsSwParam->dfs_w_idx[id]].width = dfs_data[2*i];\n\t\tpDfsSwParam->dfs_w_last_idx[id] = pDfsSwParam->dfs_w_idx[id];\n\t\tpDfsSwParam->dfs_w_idx[id]++;\n\t\tif (pDfsSwParam->dfs_w_idx[id] >= NEW_DFS_DBG_PORT_ENT_NUM)\n\t\t\tpDfsSwParam->dfs_w_idx[id] = 0;\t\n\t}\n\tpDfsSwParam->hw_idx[0] = pDfsSwParam->dfs_w_idx[0];\n\tSWRadarCheck(pAd, 0);\n\treturn TRUE;\n}\n\nINT\tSet_PrintBusyIdle_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tpRadarDetect->print_ch_busy_sta = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_BusyIdleRatio_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tpRadarDetect->ch_busy_idle_ratio = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_DfsRssiHigh_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tpRadarDetect->DfsRssiHigh = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\n\nINT\tSet_DfsRssiLow_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tpRadarDetect->DfsRssiLow = simple_strtol(arg, 0, 10);\n\treturn TRUE;\n}\nINT\tSet_EventExpire_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN      PSTRING                 arg) \n{\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pAd->CommonCfg.RadarDetect.DfsProgramParam;\n\tUINT8 dfs_channel, bbp_val;\n\tUINT32 EventExpiration = 0;\n       STRING StrBuf[64];\n\tPSTRING SubStr = NULL;\n\n\tstrncpy(StrBuf, arg, 64);\n\tif ((SubStr = strchr(StrBuf, '_')) != NULL)\n\t{\n\t\t*SubStr = '\\0';\n\t\tSubStr++;\n\t\tEventExpiration = (UINT32) simple_strtol(SubStr, 0, 16);\n\t\tdfs_channel = (UINT8) simple_strtol(StrBuf, 0, 16);\n\t\tDBGPRINT(RT_DEBUG_TRACE, \n\t\t\t(\"%s(): dfs_channel = %u, EventExpiration = 0x%08x\\n\",\n\t\t\t__FUNCTION__, dfs_channel, EventExpiration));\n\n\t\tpDfsProgramParam->RadarEventExpire[dfs_channel] = EventExpiration;\n\t\t\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, dfs_channel); /* disable DFS and select channel */\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R17, EventExpiration); /* set value */\n\t\t/* Enable detection*/\n\t\tbbp_val = (pDfsProgramParam->ChEnable << 16);\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, bbp_val);\n\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, \n\t\t\t(\"%s(): Input format Error. (should be <Channel>_<value>)\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\n\treturn TRUE;\n}\nINT\tSet_CEPrint_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tint i, j, id = simple_strtol(arg, 0, 10);\n\tint n = pDfsSwParam->dfs_w_last_idx[id];\n\n\tif ((id >= 0) && (id <= 3))\n\t{\n\t\tprintk(\"Last Idx = %d\\n\", n);\n\t\tfor (i = 0; i < NEW_DFS_DBG_PORT_ENT_NUM; i++)\n\t\t{\n\t\t\tprintk(\"Cnt=%u, w= %u  Time=%u\\n\", (unsigned int)(pDfsSwParam->DFS_W[id][i].counter),\n\t\t\tpDfsSwParam->DFS_W[id][i].width,\n\t\t\t(unsigned int)pDfsSwParam->DFS_W[id][i].timestamp);\n\t\t\tif (pDfsSwParam->DFS_W[id][i].counter == 0)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\t\n\tif ((id >= 10) && (id < 13))\n\t{\n\t\tid -= 10;\n\t\tfor (i = 0; i < NEW_DFS_MPERIOD_ENT_NUM; i++)\n\t\t{\n\t\t\tprintk(\"T=%u, w1= %u(%u), w2= %u(%u)\\n\", (unsigned int)(pDfsSwParam->DFS_T[id][i].period),\n\t\t\tpDfsSwParam->DFS_T[id][i].width, pDfsSwParam->DFS_T[id][i].idx,\n\t\t\tpDfsSwParam->DFS_T[id][i].width2, pDfsSwParam->DFS_T[id][i].idx2);\n\t\t\tif (pDfsSwParam->DFS_T[id][i].period == 0)\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t}\n\tif (id == 77)\n\t{\n\t\tfor (i = 0; i < 4; i++)\n\t\t{\n\t\t\tfor (j = 0; j < NEW_DFS_DBG_PORT_ENT_NUM; j++)\n\t\t\t{\n\t\t\t\tpDfsSwParam->DFS_W[i][j].counter = 0;\n\t\t\t\tpDfsSwParam->DFS_W[i][j].width = 0;\n\t\t\t\tpDfsSwParam->DFS_W[i][j].timestamp = 0;\n\t\t\t}\n\t\t\tfor (j = 0; j < NEW_DFS_MPERIOD_ENT_NUM; j++)\n\t\t\t{\n\t\t\t\tpDfsSwParam->DFS_T[i][j].period = 0;\t\n\t\t\t\tpDfsSwParam->DFS_T[i][j].width = 0;\n\t\t\t\tpDfsSwParam->DFS_T[i][j].width2 = 0;\t\n\t\t\t\tpDfsSwParam->DFS_T[i][j].idx = 0;\n\t\t\t\tpDfsSwParam->DFS_T[i][j].idx2 = 0;\n\t\t\t}\n\t\t}\n\t}\n#ifdef DFS_DEBUG\t\n\tif (id > 20)\n\t{\n\t\tpDfsSwParam->BBP127Repeat = id - 20;\n\t}\n\t\n\tif (id == 5)\n\t{\n\t\t\n\t\tfor (i = 0; i < NEW_DFS_DBG_PORT_ENT_NUM; i++)\n\t\t{\n\t\t\tprintk(\"Cnt=%u, w= %u  Time=%lu,  start_idx = %u end_idx = %u\\n\", (unsigned int)(pDfsSwParam->CE_DebugCh0[i].counter),\n\t\t\t(unsigned int)pDfsSwParam->CE_DebugCh0[i].width, pDfsSwParam->CE_DebugCh0[i].timestamp,\n\t\t\tpDfsSwParam->CE_DebugCh0[i].start_idx, pDfsSwParam->CE_DebugCh0[i].end_idx);\n\t\t}\n\n\t\tfor (i = 0; i < NEW_DFS_MPERIOD_ENT_NUM; i++)\n\t\t{\n\t\t\tprintk(\"T=%lu, w1= %u(%u), w2= %u(%u)\\n\", (pDfsSwParam->CE_TCh0[i].period),\n\t\t\tpDfsSwParam->CE_TCh0[i].width, pDfsSwParam->CE_TCh0[i].idx,\n\t\t\tpDfsSwParam->CE_TCh0[i].width2, pDfsSwParam->CE_TCh0[i].idx2);\n\t\t}\n\n\t}\n#endif /* DFS_DEBUG */\n\t\n\treturn TRUE;\n}\n\n\nINT Set_RfReg_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n\n\tprintk(\"1 %x\\n\", pAd->LatchRfRegs.R1);\n\tprintk(\"2 %x\\n\", pAd->LatchRfRegs.R2);\n\tprintk(\"3 %x\\n\", pAd->LatchRfRegs.R3);\n\tprintk(\"4 %x\\n\", pAd->LatchRfRegs.R4);\n\treturn TRUE;\n}\n\nINT\tShow_BlockCh_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint i; \n\n\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->ChannelList[i].RemainingTimeForUse != 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Ch%d: RemainingTimeForUse:%d sec;\\n\",\n\t\t\t\tpAd->ChannelList[i].Channel, pAd->ChannelList[i].RemainingTimeForUse));\n\t\t}\n\t}\n\treturn TRUE;\n}\n\n\nVOID DFSInit(PRTMP_ADAPTER pAd)\n{\n\tINT i;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;\n\t\n\tpRadarDetect->ch_busy_countdown = -1;\n\tpRadarDetect->EnabledChMask = ((1 << pAd->chipCap.DfsEngineNum) -1);\n\tpRadarDetect->PollTime = 3;\n\tpRadarDetect->DfsRssiHigh = -30;\n\tpRadarDetect->DfsRssiLow = -90;\n\tpRadarDetect->DFSWatchDogIsRunning=FALSE;\n\tpRadarDetect->use_tasklet = 1;\n\tpRadarDetect->McuRadarDebug = RADAR_DONT_SWITCH; //snowpin test 0;\n\tpRadarDetect->radarDeclared = 0;\n\tpRadarDetect->dfs_func = HARDWARE_DFS_V2;\n\tpDfsProgramParam->DeltaDelay = 0x3;\n\tpDfsProgramParam->ChEnable = pRadarDetect->EnabledChMask;\t\n\tfor (i=0; i < pAd->chipCap.DfsEngineNum; i++)\n\t{\n\t\tif ((i == 3) &&\n\t\t    (pAd->CommonCfg.RDDurRegion == FCC || pAd->CommonCfg.RDDurRegion == JAP))\n\t\t\tpDfsProgramParam->RadarEventExpire[i] = 0x10000000; /* for Chirp Radar */\n\t\telse\n\t\t\tpDfsProgramParam->RadarEventExpire[i] = 0x1000000;\n\t}\n\t/*pDfsProgramParam->RadarEventExpire[0] = 0x1000000;*/\n\t/*pDfsProgramParam->RadarEventExpire[3] = 0x99999999;*/\n\tpDfsProgramParam->Symmetric_Round = 1;\n\tpDfsProgramParam->VGA_Mask = 45;\n\tpDfsProgramParam->Packet_End_Mask = 45;\n\tpDfsProgramParam->Rx_PE_Mask = 45;\n\t\n\t/*pAd->CommonCfg.ce_sw_check = CE_SW_CHECK;*/\n\t/*pDfsSwParam->ce_sw_id_check = 0;*/\n\t/*pDfsSwParam->ce_sw_t_diff = 14;*/\n\n\t/* from dfs_mcu.c, one time init */\n\tdfs_sw_init(pAd);\n\t\n}\n\nvoid NewRadarDetectionStart(PRTMP_ADAPTER pAd)\n{\n\tpNewDFSTable pDFS2Table;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t/*PDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;*/\n\t\n\tpRadarDetect->bDfsInit = FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->NewRadarDetectionStart()\\n\"));\n\n\tDFSInit(pAd);\n\n#ifdef RTMP_MAC_USB\n\tINIT_DFS_EVENT_BUFF_SHARED_MEMORY(pAd, BBPR127TABLE_OFFSET, 8, 0xfe);\n#endif /* RTMP_MAC_USB */\n\n\tRTMP_CHIP_RADAR_GLRT_COMPENSATE(pAd);\n\n\tif ((pAd->CommonCfg.RDDurRegion == CE) && RESTRICTION_BAND_1(pAd))\n\t\tpAd->Dot11_H.ChMovingTime = 605;\n\telse\n\t\tpAd->Dot11_H.ChMovingTime = 65;\n\n\tif (pAd->CommonCfg.RDDurRegion == FCC)\n\t{\n\t\tif (pRadarDetect->ch_busy_idle_ratio == 0)\n\t\t\tpRadarDetect->ch_busy_idle_ratio = 2;\n\t\t\n\t\tpDFS2Table = &NewDFSTable1[0];\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"DFS start, use FCC table\\n\"));\n\t}\n\telse if (pAd->CommonCfg.RDDurRegion == CE)\n\t{\n\t\tif (pRadarDetect->ch_busy_idle_ratio == 0)\n\t\t\tpRadarDetect->ch_busy_idle_ratio = 3;\n\t\t\n\t\tpDFS2Table = &NewDFSTable1[1];\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"DFS start, use CE table\\n\"));\n\t}\n\telse /* JAP*/\n\t{\n\n\t\tif ((pAd->CommonCfg.Channel >= 52) && (pAd->CommonCfg.Channel <= 64))\n\t\t{\n\t\t\tpDFS2Table = &NewDFSTable1[3];\n\t\t\t\n\t\t\tif (pRadarDetect->ch_busy_idle_ratio == 0)\n\t\t\t\tpRadarDetect->ch_busy_idle_ratio = 3;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpDFS2Table = &NewDFSTable1[2];\n\t\t\t/*pDfsProgramParam->Symmetric_Round = 1;*/\n\n\t\t\tif (pRadarDetect->ch_busy_idle_ratio == 0)\n\t\t\t\tpRadarDetect->ch_busy_idle_ratio = 2;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"DFS start, use JAP table\\n\"));\n\t}\t\n\n\tNewRadarDetectionProgram(pAd, pDFS2Table);\n\n\t/*the usage of dfs_sw_init*/\n\t/*dfs_sw_init(pAd);*/\n\t\n#ifdef RTMP_MAC_USB\n\tif (NewRadarDetectionMcuStart(pAd) == FALSE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NewRadarDetectionMcuStart failed.\\n\"));\n\t}\n#endif /* RTMP_MAC_USB */\n\tpRadarDetect->bDfsInit = TRUE;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Poll Time=%d\\n\", pRadarDetect->PollTime));\n}\n\nVOID NewRadarDetectionStop(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"NewRadarDetectionStop\\n\"));\n\n\t/* set init bit = false to prevent dfs rotines */\n\tpRadarDetect->bDfsInit = FALSE;\n\tpRadarDetect->radarDeclared = 0;\n\t\n#ifdef RT65xx\n\t/* Disable detection*/\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, 0);\n\t\n\t/* Clear status */\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R1, pRadarDetect->EnabledChMask);\n#else\n\t/* Disable detection*/\n\tRTMP_DFS_IO_WRITE8(pAd, 0x1, 0);\n\n\t/* Clear Status */\n\tRTMP_DFS_IO_WRITE8(pAd, 0x2, pRadarDetect->EnabledChMask);\n#endif\n\t\n#ifdef RTMP_MAC_USB\n\tif (NewRadarDetectionMcuStop(pAd) == FALSE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NewRadarDetectionMcuStop failed.\\n\"));\n\t}\n#endif /* RTMP_MAC_USB */\n\n}\n\n\n/* the debug port have timestamp 22 digit, the max number is 0x3fffff, each unit is 25ns for 40Mhz mode and 50ns for 20Mhz mode*/\n/* so a round of timestamp is about 25 * 0x3fffff / 1000 = 104857us (about 100ms) or*/\n/* 50 * 0x3fffff / 1000 = 209715us (about 200ms) in 20Mhz mode*/\n/* 3ms = 3000,000 ns / 25ns = 120000 -- a unit */\n/* 0x3fffff/120000 = 34.9 ~= 35*/\n/* CE Staggered radar check*/\n/* At beginning, the goal is to detect staggered radar, now, we also detect regular radar with this function.*/\n\n\nint SWRadarCheck(\n\tIN PRTMP_ADAPTER pAd, USHORT id)\n{\n\tint i, j, start_idx, end_idx;\n\tpNewDFSDebugPort pCurrent, p1, pEnd;\n\tULONG period;\n\tint radar_detected = 0;\n\tUSHORT\twidthsum;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;\t\n\t/*ENTRY_PLUS could be replace by (pDfsSwParam->sw_idx[id]+1)%128*/\n\tUSHORT\tTotal, SwIdxPlus = ENTRY_PLUS(pDfsSwParam->sw_idx[id], 1, NEW_DFS_DBG_PORT_ENT_NUM);\n\tUCHAR\tCounterToCheck;\t\n\t\n\tif (!DFS_CHECK_FLAGS(pAd, pRadarDetect) ||\n\t\t(SwIdxPlus == pDfsSwParam->hw_idx[id]))  /* no entry to process*/\n\t\treturn 0;\n\t\n\t/* process how many entries?? total NEW_DFS_DBG_PORT_ENT_NUM*/\n\tif (pDfsSwParam->hw_idx[id] > SwIdxPlus)\n\t\tTotal = pDfsSwParam->hw_idx[id] - SwIdxPlus;\n\telse\n\t\tTotal = pDfsSwParam->hw_idx[id] + NEW_DFS_DBG_PORT_ENT_NUM - SwIdxPlus;\n\t\n\tif (Total > NEW_DFS_DBG_PORT_ENT_NUM)\n\t\tpDfsSwParam->pr_idx[id] = ENTRY_PLUS(pDfsSwParam->sw_idx[id], MAX_PROCESS_ENTRY, NEW_DFS_DBG_PORT_ENT_NUM);\n\telse\n\t\tpDfsSwParam->pr_idx[id] = ENTRY_PLUS(pDfsSwParam->sw_idx[id], Total, NEW_DFS_DBG_PORT_ENT_NUM);\n\t\n\t\n\tstart_idx = ENTRY_PLUS(pDfsSwParam->pr_idx[id], 1, NEW_DFS_DBG_PORT_ENT_NUM);\n\tend_idx = pDfsSwParam->pr_idx[id];\n\t\n\tpEnd = &pDfsSwParam->DFS_W[id][end_idx];\n\t/*printk(\"start_idx = %d, end_idx=%d, counter=%d\\n\", start_idx, end_idx, pEnd->counter);*/\n\t\n\t/*if (pDfsSwParam->dfs_w_counter != pEnd->counter)*/\n\t/*\treturn 0;*/\n\t\n\tif (start_idx > end_idx)\n\t\tend_idx += NEW_DFS_DBG_PORT_ENT_NUM;\n\t\n\t\n\tpDfsSwParam->sw_idx[id] = pDfsSwParam->pr_idx[id];\n\t\n\t/* FCC && Japan*/\n\n\tif (pAd->CommonCfg.RDDurRegion != CE)\n\t{\n\t\tULONG minPeriod = (3000 << 1);\n\t\t/* Calculate how many counters to check*/\n\t\t/* if pRadarDetect->PollTime is 1ms, a round of timestamp is 107 for 20Mhz, 53 for 40Mhz*/\n\t\t/* if pRadarDetect->PollTime is 2ms, a round of timestamp is 71 for 20Mhz, 35 for 40Mhz*/\n\t\t/* if pRadarDetect->PollTime is 3ms, a round of timestamp is 53 for 20Mhz, 27 for 40Mhz*/\n\t\t/* if pRadarDetect->PollTime is 4ms, a round of timestamp is 43 for 20Mhz, 21 for 40Mhz*/\n\t\t/* the max period to check for 40Mhz for FCC is 28650 * 2*/\n\t\t/* the max period to check for 40Mhz for Japan is 80000 * 2*/\n\t\t/* 0x40000 = 4194304 / 57129 = 73.xxx*/\n\t\t/* 0x40000 = 4194304 / 160000 = 26.2144*/\n\t\t/* 53/73 < 1 (1+1)*/\n\t\t/* 53/26.2144 = 2.02... (2+1)*/\n\t\t/* 27/26.2144 = 1.02... (1+1)*/\n\t\t/* 20M should use the same value as 40Mhz mode*/\n\n\n\t\tif (pRadarDetect->MCURadarRegion == NEW_DFS_JAP_W53)\n\t\t{\n\t\t\tminPeriod = 28500 << 1;\n\t\t}\n\t\t\n\t\t\n\t\tif (pAd->CommonCfg.RDDurRegion == FCC)\n\t\t{\n\t\t\tCounterToCheck = 1+1; \n\t\t}\n\t\telse /* if (pAd->CommonCfg.RDDurRegion == JAP)*/\n\t\t{\n\t\t\tif (pRadarDetect->PollTime <= 2)\n\t\t\t\tCounterToCheck = 2+1;\n\t\t\telse\n\t\t\t\tCounterToCheck = 1+1;\n\t\t}\n\t\t\n\n\t\t\n\t\t/* First Loop for FCC/JAP*/\n\t\tfor (i = end_idx; i > start_idx; i--)\n\t\t{\n\t\t\tpCurrent = &pDfsSwParam->DFS_W[id][i & NEW_DFS_DBG_PORT_MASK];\n\t\t\t\t\n\t\t\t/* we only handle entries has same counter with the last one*/\n\t\t\tif (pCurrent->counter != pEnd->counter)\n\t\t\t\tbreak;\n\t\t\n\t\t\tpCurrent->start_idx = 0xffff;\n\n\t\t\t/* calculate if any two pulse become a valid period, add it in period table,*/\n\t\t\tfor (j = i - 1; j > start_idx; j--)\n\t\t\t{\n\t\t\t\tp1 = &pDfsSwParam->DFS_W[id][j & NEW_DFS_DBG_PORT_MASK];\n\t\t\t\t\n\t\t\t\t/* check period, must within max period*/\n\t\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\t\t\t{\n\t\t\t\t\tif (p1->counter + CounterToCheck < pCurrent->counter)\n\t\t\t\t\t\tbreak;\n            \t\n\t\t\t\t\twidthsum = p1->width + pCurrent->width;\n\t\t\t\t\tif (id == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (widthsum < 600)\n\t\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = pDfsSwParam->dfs_width_ch0_err_L;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch2_Shift;\n\t\t\t\t\t}\n\t\t\t\t\telse if (id == 1)\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch1_Shift;\n\t\t\t\t\telse if (id == 2)\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch2_Shift;\n\t\t\t\t\t\n\t\t\t\t\tif ( (pAd->Dot11_H.RDMode == RD_SILENCE_MODE) ||\n\t\t\t\t\t\t (PERIOD_MATCH(p1->width, pCurrent->width, pDfsSwParam->dfs_width_diff)) )\n\t\t\t\t\t{\n\t\t\t\t\t\tif (p1->timestamp >= pCurrent->timestamp)\n\t\t\t\t\t\t\tperiod = 0x400000 + pCurrent->timestamp - p1->timestamp;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tperiod = pCurrent->timestamp - p1->timestamp;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ((period >= (minPeriod - 2)) && (period <= pDfsSwParam->dfs_max_period))\n\t\t\t\t\t\t{\n            \t\n\t\t\t\t\t\t\t/* add in period table*/\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx = (i & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width = pCurrent->width;\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx2 = (j & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width2 = p1->width;\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].period = period;\n            \t\n            \t\n\t\t\t\t\t\t\tif (pCurrent->start_idx == 0xffff)\n\t\t\t\t\t\t\t\tpCurrent->start_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\t\tpCurrent->end_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id]++;\n\t\t\t\t\t\t\tif (pDfsSwParam->dfs_t_idx[id] >= NEW_DFS_MPERIOD_ENT_NUM)\n\t\t\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (period > pDfsSwParam->dfs_max_period)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (p1->counter + CounterToCheck < pCurrent->counter)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\twidthsum = p1->width + pCurrent->width;\n\t\t\t\t\tif (id == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (widthsum < 600)\n\t\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = pDfsSwParam->dfs_width_ch0_err_L;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch2_Shift;\n\t\t\t\t\t}\n\t\t\t\t\telse if (id == 1)\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch1_Shift;\n\t\t\t\t\telse if (id == 2)\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch2_Shift;\n\n            \t\n\t\t\t\t\tif ( (pAd->Dot11_H.RDMode == RD_SILENCE_MODE) || \n\t\t\t\t\t\t (PERIOD_MATCH(p1->width, pCurrent->width, pDfsSwParam->dfs_width_diff)) )\n            \t\n\t\t\t\t\t{\n\t\t\t\t\t\tif (p1->timestamp >= pCurrent->timestamp)\n\t\t\t\t\t\t\tperiod = 0x400000 + pCurrent->timestamp - p1->timestamp;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tperiod = pCurrent->timestamp - p1->timestamp;\n            \t\n\t\t\t\t\t\tif ((period >= ((minPeriod >> 1) - 2)) && (period <= (pDfsSwParam->dfs_max_period >> 1)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* add in period table*/\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx = (i & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width = pCurrent->width;\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx2 = (j & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width2 = p1->width;\n\t\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].period = period;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (pCurrent->start_idx == 0xffff)\n\t\t\t\t\t\t\t\tpCurrent->start_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\t\tpCurrent->end_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id]++;\n\t\t\t\t\t\t\tif (pDfsSwParam->dfs_t_idx[id] >= NEW_DFS_MPERIOD_ENT_NUM)\n\t\t\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (period > (pDfsSwParam->dfs_max_period >> 1))\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} /* for (j = i - 1; j > start_idx; j--)*/\n\n\t\t} /* for (i = end_idx; i > start_idx; i--)*/\n\n\n\t\t/* Second Loop for FCC/JAP*/\n\t\tfor (i = end_idx; i > start_idx; i--)\n\t\t{\n\t\t\t\n\t\t\tpCurrent = &pDfsSwParam->DFS_W[id][i & NEW_DFS_DBG_PORT_MASK];\n\t\t\t\t\n\t\t\t/* we only handle entries has same counter with the last one*/\n\t\t\tif (pCurrent->counter != pEnd->counter)\n\t\t\t\tbreak;\n\t\t\tif (pCurrent->start_idx != 0xffff)\n\t\t\t{\n\t\t\t\t/*pNewDFSDebugPort\tp2, p3, p4, p5, p6;*/\n\t\t\t\tpNewDFSDebugPort\tp2, p3;\n\t\t\t\tpNewDFSMPeriod pCE_T;\n\t\t\t\tULONG idx[10], T[10];\n\n\t\t\t\tfor (idx[0] = pCurrent->start_idx; idx[0] <= pCurrent->end_idx; idx[0]++)\n\t\t\t\t{\n\n\t\t\t\t\tpCE_T = &pDfsSwParam->DFS_T[id][idx[0]];\n\t\t\t\t\n\t\t\t\t\tp2 = &pDfsSwParam->DFS_W[id][pCE_T->idx2];\n\t\t\t\t\n\t\t\t\t\tif (p2->start_idx == 0xffff)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t\tT[0] = pCE_T->period;\n\n\n\t\t\t\t\tfor (idx[1] = p2->start_idx; idx[1] <= p2->end_idx; idx[1]++)\n\t\t\t\t\t{\n\t\t\t\t\t\t\n\t\t\t\t\t\tpCE_T = &pDfsSwParam->DFS_T[id][idx[1]];\n\t\t\t\t\t\n\t\t\t\t\t\tp3 = &pDfsSwParam->DFS_W[id][pCE_T->idx2];\n\n\t\t\t\t\t\tif (idx[0] == idx[1])\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (p3->start_idx == 0xffff)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\n\n\t\t\t\t\t\tT[1] = pCE_T->period;\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( PERIOD_MATCH(T[0], T[1], pDfsSwParam->dfs_period_err))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (id <= 2) /* && (id >= 0)*/\n\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t/*if (((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) && (T[1] > minPeriod)) ||*/\n\t\t\t\t\t\t\t\t/*\t((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_20) && (T[1] > (minPeriod >> 1))) )*/\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tunsigned int loop, PeriodMatched = 0, idx1;\n\t\t\t\t\t\t\t\t\tfor (loop = 1; loop < pDfsSwParam->dfs_check_loop; loop++)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tidx1 = (idx[1] >= loop)? (idx[1] - loop): (NEW_DFS_MPERIOD_ENT_NUM + idx[1] - loop);\n\t\t\t\t\t\t\t\t\t\tif (PERIOD_MATCH(pDfsSwParam->DFS_T[id][idx1].period, T[1], pDfsSwParam->dfs_period_err))\n\t\t\t\t\t\t\t\t\t\t{\n#ifdef DFS_DEBUG\n\t\t\t\t\t\t\t\t\t\t\tif (PeriodMatched < 5)\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->CounterStored[PeriodMatched] = pDfsSwParam->DFS_W[id][pDfsSwParam->DFS_T[id][idx1].idx].counter;\n\t\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->CounterStored2[PeriodMatched] = loop;\n\t\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->CounterStored3 = idx[1];\n\t\t\t\t\t\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"%d %d\\n\", loop, pDfsSwParam->DFS_T[id][idx[1]-loop].period);*/\n\t\t\t\t\t\t\t\t\t\t\tPeriodMatched++;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (PeriodMatched > pDfsSwParam->dfs_declare_thres)\n\t\t\t\t\t\t\t\t\t{\n#ifdef DFS_DEBUG\n\t\t\t\t\t\t\t\t\t\tif (PeriodMatched == 3)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_3++;\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1], pDfsSwParam->CounterStored[2]);*/\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1], pDfsSwParam->CounterStored2[2]);*/\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (PeriodMatched == 4)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_4++;\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d %d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1], pDfsSwParam->CounterStored[2], pDfsSwParam->CounterStored[3]);*/\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d %d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1], pDfsSwParam->CounterStored2[2], pDfsSwParam->CounterStored2[3]);*/\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_5++;\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d %d %d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1], pDfsSwParam->CounterStored[2], pDfsSwParam->CounterStored[3], pDfsSwParam->CounterStored[4]);*/\n\t\t\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d %d %d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1], pDfsSwParam->CounterStored2[2], pDfsSwParam->CounterStored2[3], pDfsSwParam->CounterStored2[4]);*/\n\t\t\t\t\t\t\t\t\t\t}\n                                    \t\n\t\t\t\t\t\t\t\t\t\tpDfsSwParam->DebugPortPrint = 1;\n\t\t\t\t\t\t\t\t\t\n#endif\n\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpNewDFSValidRadar pDFSValidRadar;\n\t\t\t\t\t\t\t\t\t\t\tULONG T1 = (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)? (T[1]>>1) : T[1];\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tpDFSValidRadar = &NewDFSValidTable[0];\n\t\t\t\t\t\t\t\t\t\t\t\n                    \t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\twhile (pDFSValidRadar->type != NEW_DFS_END)\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tif ((pDFSValidRadar->type & pRadarDetect->MCURadarRegion) == 0)\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tpDFSValidRadar++;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif (pDFSValidRadar->TLow)\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tif ( (T1 > (pDFSValidRadar->TLow - pDFSValidRadar->TMargin)) && \n\t\t\t\t\t\t\t\t\t\t\t\t\t     (T1 < (pDFSValidRadar->THigh + pDFSValidRadar->TMargin)) )\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tradar_detected = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tif ( (T1 > (pDFSValidRadar->T - pDFSValidRadar->TMargin)) &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t     (T1 < (pDFSValidRadar->T + pDFSValidRadar->TMargin)) )\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tradar_detected = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tpDFSValidRadar++;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (radar_detected == 1)\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"W=%d, T=%d (%d), period matched=%d\\n\", (unsigned int)pCE_T->width, (unsigned int)T1, (unsigned int)id, PeriodMatched));\n\t\t\t\t\t\t\t\t\t\t\t\tprintk(\"SWRadarCheck: Radar Detected\\n\");\n\t\t\t\t\t\t\t\t\t\t\t\treturn radar_detected;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (pRadarDetect->MCURadarRegion != NEW_DFS_JAP_W53)\n\t\t\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"W=%d, T=%d (%d), period matched=%d\\n\", (unsigned int)pCE_T->width, (unsigned int)T1, (unsigned int)id, PeriodMatched));\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n#ifdef DFS_DEBUG\n\t\t\t\t\t\t\t\t\telse if (PeriodMatched == 2)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_2++;\n\t\t\t\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t} /* if (id <= 2)  && (id >= 0)*/\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t} /* for (idx[1] = p2->start_idx; idx[1] <= p2->end_idx; idx[1]++)*/\n\n\n\t\t\t\t\t/* increase FCC-1 detection*/\n\t\t\t\t\tif (id <= 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (IS_FCC_RADAR_1((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40), T[0]))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint loop, idx1, PeriodMatched_fcc1 = 0;\n\t\t\t\t\t\t\t\tfor (loop = 1; loop < pDfsSwParam->dfs_check_loop; loop++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tidx1 = (idx[0] >= loop)? (idx[0] - loop): (NEW_DFS_MPERIOD_ENT_NUM + idx[0] - loop);\n\t\t\t\t\t\t\t\t\tif ( IS_FCC_RADAR_1((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40), pDfsSwParam->DFS_T[id][idx1].period) )\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t/*printk(\"%d %d %d\\n\", PeriodMatched_fcc1, pDfsSwParam->DFS_T[id][idx1].period, loop);*/\n\t\t\t\t\t\t\t\t\t\tPeriodMatched_fcc1++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (PeriodMatched_fcc1 > 3)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeriodMatched_fcc1 = %d (%d)\\n\", PeriodMatched_fcc1, id));\n\t\t\t\t\t\t\t\t\tradar_detected = 1;\n\t\t\t\t\t\t\t\t\treturn radar_detected;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\n\t\t\t\t\t/* increase W56-3 detection*/\n\t\t\t\t\tif ((pRadarDetect->MCURadarRegion == NEW_DFS_JAP) && (id <= 2))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (IS_W56_RADAR_3((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40), T[0]))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint loop, idx1, PeriodMatched_w56_3 = 0;\n\t\t\t\t\t\t\t\tfor (loop = 1; loop < pDfsSwParam->dfs_check_loop; loop++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tidx1 = (idx[0] >= loop)? (idx[0] - loop): (NEW_DFS_MPERIOD_ENT_NUM + idx[0] - loop);\n\t\t\t\t\t\t\t\t\tif ( IS_W56_RADAR_3((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40), pDfsSwParam->DFS_T[id][idx1].period) )\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t/*printk(\"%d %d %d\\n\", PeriodMatched_w56_3, pDfsSwParam->DFS_T[id][idx1].period, loop);*/\n\t\t\t\t\t\t\t\t\t\tPeriodMatched_w56_3++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (PeriodMatched_w56_3 > 3)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeriodMatched_w56_3 = %d (%d)\\n\", PeriodMatched_w56_3, id));\n\t\t\t\t\t\t\t\t\tradar_detected = 1;\n\t\t\t\t\t\t\t\t\treturn radar_detected;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ((pRadarDetect->MCURadarRegion == NEW_DFS_JAP_W53) && (id <= 2) && IS_W53_RADAR_2((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40), T[0]))\n\t\t\t\t\t{\n\t\t\t\t\t\tint loop, idx1, PeriodMatched_W56_2 = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor (loop = 1; loop < pDfsSwParam->dfs_check_loop; loop++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tidx1 = (idx[0] >= loop)? (idx[0] - loop): (NEW_DFS_MPERIOD_ENT_NUM + idx[0] - loop);\n\t\t\t\t\t\t\tif ( IS_W53_RADAR_2((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40), pDfsSwParam->DFS_T[id][idx1].period) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/*printk(\"%d %d %d\\n\", PeriodMatched_W56_2, pDfsSwParam->DFS_T[id][idx1].period, loop);*/\n\t\t\t\t\t\t\t\tPeriodMatched_W56_2++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (PeriodMatched_W56_2 >= 3)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeriodMatched_W56_2 = %d(%d)\\n\", PeriodMatched_W56_2, id));\n\t\t\t\t\t\t\tradar_detected = 1;\n\t\t\t\t\t\t\treturn radar_detected;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\n\t\t\t\t} /* for (idx[0] = pCurrent->start_idx; idx[0] <= pCurrent->end_idx; idx[0]++)*/\n\t\t\t} /* if (pCurrent->start_idx != 0xffff)*/\n\t\t} /* for (i = end_idx; i > start_idx; i--)*/\n\t\t\n\t\treturn radar_detected;\n\t}\n\n\t/* CE have staggered radar\t*/\n\t\n\t/* Calculate how many counters to check*/\n\t/* if pRadarDetect->PollTime is 1ms, a round of timestamp is 107 for 20Mhz, 53 for 40Mhz*/\n\t/* if pRadarDetect->PollTime is 2ms, a round of timestamp is 71 for 20Mhz, 35 for 40Mhz*/\n\t/* if pRadarDetect->PollTime is 3ms, a round of timestamp is 53 for 20Mhz, 27 for 40Mhz*/\n\t/* if pRadarDetect->PollTime is 4ms, a round of timestamp is 43 for 20Mhz, 21 for 40Mhz*/\n\t/* if pRadarDetect->PollTime is 8ms, a round of timestamp is ?? for 20Mhz, 12 for 40Mhz*/\n\t/* the max period to check for 40Mhz is 133333 + 125000 + 117647 = 375980*/\n\t/* 0x40000 = 4194304 / 375980 = 11.1556*/\n\t/* 53/11.1556 = 4.75...*/\n\t/* 35/11.1556 = 3.1374, (4+1) is safe, (3+1) to save CPU power, but may lost some data*/\n\t/* 27/11.1556 = 2.42, (3+1) is OK*/\n\t/* 21/11.1556 = 1.88, (2+1) is OK*/\n\t/* 20M should use the same value as 40Mhz mode*/\n\tif (pRadarDetect->PollTime == 1)\n\t\tCounterToCheck = 5+1;\n\telse if (pRadarDetect->PollTime == 2)\n\t\tCounterToCheck = 4+1;\n\telse if (pRadarDetect->PollTime == 3)\n\t\tCounterToCheck = 3+1;\n\telse if (pRadarDetect->PollTime <= 8)\n\t\tCounterToCheck = 2+1;\n\telse\n\t\tCounterToCheck = 1+1;\n\n\t/* First Loop for CE*/\n\tfor (i = end_idx; i > start_idx; i--)\n\t{\n\t\tpCurrent = &pDfsSwParam->DFS_W[id][i & NEW_DFS_DBG_PORT_MASK];\n\t\t\t\t\n\t\t/* we only handle entries has same counter with the last one*/\n\t\tif (pCurrent->counter != pEnd->counter)\n\t\t\tbreak;\n\t\t\n\t\tpCurrent->start_idx = 0xffff;\n\n\t\t/* calculate if any two pulse become a valid period, add it in period table,*/\n\t\tfor (j = i - 1; j > start_idx; j--)\n\t\t{\n\t\t\tp1 = &pDfsSwParam->DFS_W[id][j & NEW_DFS_DBG_PORT_MASK];\n\t\t\t\n\n\t\t\t/* check period, must within 16666 ~ 66666*/\n\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\t\t{\n\t\t\t\tif (p1->counter + CounterToCheck < pCurrent->counter)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\twidthsum = p1->width + pCurrent->width;\n\t\t\t\tif (id == 0)\n\t\t\t\t{\n\t\t\t\t\tif (((p1->width > 310) && (pCurrent->width < 300)) || ((pCurrent->width > 310) && ((p1->width < 300))) )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif (widthsum < 620)\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = pDfsSwParam->dfs_width_ch0_err_H;\n\t\t\t\t\telse\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = pDfsSwParam->dfs_width_ch0_err_L;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if (id == 1)\n\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch1_Shift;\n\t\t\t\telse if (id == 2)\n\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> pDfsSwParam->dfs_width_diff_ch2_Shift;\n\t\t\t\t\n\t\t\t\tif ( (pAd->Dot11_H.RDMode == RD_SILENCE_MODE) ||\n\t\t\t\t\t (PERIOD_MATCH(p1->width, pCurrent->width, pDfsSwParam->dfs_width_diff)) )\n\t\t\t\t{\n\t\t\t\t\tif (p1->timestamp >= pCurrent->timestamp)\n\t\t\t\t\t\tperiod = 0x400000 + pCurrent->timestamp - p1->timestamp;\n\t\t\t\t\telse\n\t\t\t\t\t\tperiod = pCurrent->timestamp - p1->timestamp;\n\t\t\t\t\t\n\t\t\t\t\t/*if ((period >= (33333 - 20)) && (period <= (133333 + 20)))*/\n\t\t\t\t\tif ((period >= (33333 - 20)) && (period <= pDfsSwParam->dfs_max_period))\n\t\t\t\t\t//if ((period >= (10000 - 2)) && (period <= pDfsSwParam->dfs_max_period))\n\t\t\t\t\t{\n\n\t\t\t\t\t\t/* add in period table*/\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx = (i & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width = pCurrent->width;\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx2 = (j & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width2 = p1->width;\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].period = period;\n        \n        \n\t\t\t\t\t\tif (pCurrent->start_idx == 0xffff)\n\t\t\t\t\t\t\tpCurrent->start_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\tpCurrent->end_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\t\n\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id]++;\n\t\t\t\t\t\tif (pDfsSwParam->dfs_t_idx[id] >= NEW_DFS_MPERIOD_ENT_NUM)\n\t\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id] = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse if (period > pDfsSwParam->dfs_max_period) /* to allow miss a pulse*/\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (p1->counter + CounterToCheck < pCurrent->counter)\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\twidthsum = p1->width + pCurrent->width;\n\t\t\t\tif (id == 0)\n\t\t\t\t{\n\t\t\t\t\tif (((p1->width > 300) && (pCurrent->width < 300)) || ((pCurrent->width > 300) && ((p1->width < 300))) )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif (widthsum < 620)\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = pDfsSwParam->dfs_width_ch0_err_H;\n\t\t\t\t\telse\n\t\t\t\t\t\tpDfsSwParam->dfs_width_diff = pDfsSwParam->dfs_width_ch0_err_L;\n\t\t\t\t}\n\t\t\t\telse if (id == 1)\n\t\t\t\t{\n\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> 3;  /* for 20M verified */\n\t\t\t\t\t//printk(\"dfs_width_diff = %u\\n\",pDfsSwParam->dfs_width_diff);\n\t\t\t\t}\n\t\t\t\telse if (id == 2)\n\t\t\t\t\tpDfsSwParam->dfs_width_diff = widthsum >> 6;\n\n\t\t\t\tif ( (pAd->Dot11_H.RDMode == RD_SILENCE_MODE) || \n\t\t\t\t\t (PERIOD_MATCH(p1->width, pCurrent->width, pDfsSwParam->dfs_width_diff)) )\n\n\t\t\t\t{\n\t\t\t\t\tif (p1->timestamp >= pCurrent->timestamp)\n\t\t\t\t\t\tperiod = 0x400000 + pCurrent->timestamp - p1->timestamp;\n\t\t\t\t\telse\n\t\t\t\t\t\tperiod = pCurrent->timestamp - p1->timestamp;\n\n\t\t\t\t\t//if ((period >= (5000 - 2)) && (period <= (pDfsSwParam->dfs_max_period >> 1)))\n\t\t\t\t\tif ((period >= (16666 - 20)) && (period <= (pDfsSwParam->dfs_max_period >> 1)))//neil modify for ce 5-1\n\t\t\t\t\t{\n\t\t\t\t\t\t/* add in period table*/\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx = (i & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width = pCurrent->width;\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].idx2 = (j & NEW_DFS_DBG_PORT_MASK);\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].width2 = p1->width;\n\t\t\t\t\t\tpDfsSwParam->DFS_T[id][pDfsSwParam->dfs_t_idx[id]].period = period;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (pCurrent->start_idx == 0xffff)\n\t\t\t\t\t\t\tpCurrent->start_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\tpCurrent->end_idx = pDfsSwParam->dfs_t_idx[id];\n\t\t\t\t\t\t\n\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id]++;\n\t\t\t\t\t\tif (pDfsSwParam->dfs_t_idx[id] >= NEW_DFS_MPERIOD_ENT_NUM)\n\t\t\t\t\t\t\tpDfsSwParam->dfs_t_idx[id] = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse if (period > (pDfsSwParam->dfs_max_period >> 1))\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} /* for (j = i - 1; j > start_idx; j--)*/\n\t}\n\n\t/* Second Loop for CE*/\n\tfor (i = end_idx; i > start_idx; i--)\n\t{\n\t\tpCurrent = &pDfsSwParam->DFS_W[id][i & NEW_DFS_DBG_PORT_MASK];\n\t\t\t\t\n\t\t/* we only handle entries has same counter with the last one*/\n\t\tif (pCurrent->counter != pEnd->counter)\n\t\t\tbreak;\n\t\t\n\t\t/* Check Staggered radar*/\n\t\tif (pCurrent->start_idx != 0xffff)\n\t\t{\n\t\t\tpNewDFSDebugPort\tp2, p3;\n\t\t\tpNewDFSMPeriod pCE_T;\n\t\t\tULONG idx[10], T[10];\n\t\t\t\n\t\t\t/*printk(\"pCurrent=%d, idx=%d~%d\\n\", pCurrent->timestamp, pCurrent->start_idx, pCurrent->end_idx);*/\n\n\t\t\tfor (idx[0] = pCurrent->start_idx; idx[0] <= pCurrent->end_idx; idx[0]++)\n\t\t\t{\n\t\t\t\tpCE_T = &pDfsSwParam->DFS_T[id][idx[0]];\n\t\t\t\t\n\t\t\t\tp2 = &pDfsSwParam->DFS_W[id][pCE_T->idx2];\n\t\t\t\t\n\t\t\t\t/*printk(\"idx[0]= %d, idx=%d p2=%d, idx=%d~%d\\n\", idx[0], pCE_T->idx2, p2->timestamp, p2->start_idx, p2->end_idx);*/\n\t\t\t\t\n\t\t\t\tif (p2->start_idx == 0xffff)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tT[0] = pCE_T->period;\n\n\n\t\t\t\tfor (idx[1] = p2->start_idx; idx[1] <= p2->end_idx; idx[1]++)\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tpCE_T = &pDfsSwParam->DFS_T[id][idx[1]];\n\t\t\t\t\t\n\t\t\t\t\tp3 = &pDfsSwParam->DFS_W[id][pCE_T->idx2];\n\t\t\t\t\t\n\t\t\t\t\t/*printk(\"p3=%d, idx=%d~%d\\n\", p3->timestamp, p3->start_idx, p3->end_idx);*/\n\n\t\t\t\t\tif (idx[0] == idx[1])\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\tif (p3->start_idx == 0xffff)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\n\n\t\t\t\t\tT[1] = pCE_T->period;\n\n\t\t\n\t\t\t\t\tif (PERIOD_MATCH(T[0], T[1], pDfsSwParam->dfs_period_err))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (id <= 2) /* && (id >= 0)*/\n\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) && (T[1] > 66666)) ||\n\t\t\t\t\t\t\t\t((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_20) && (T[1] > 33333)) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tunsigned int loop, PeriodMatched = 0, idx1;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tfor (loop = 1; loop < pDfsSwParam->dfs_check_loop; loop++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tidx1 = (idx[1] >= loop)? (idx[1] - loop): (NEW_DFS_MPERIOD_ENT_NUM + idx[1] - loop);\n\t\t\t\t\t\t\t\t\tif (PERIOD_MATCH(pDfsSwParam->DFS_T[id][idx1].period, T[1], pDfsSwParam->dfs_period_err))\n\t\t\t\t\t\t\t\t\t{\n#ifdef DFS_DEBUG\n\t\t\t\t\t\t\t\t\t\tif (PeriodMatched < 5)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->CounterStored[PeriodMatched] = pDfsSwParam->DFS_W[id][pDfsSwParam->DFS_T[id][idx1].idx].counter;\n\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->CounterStored2[PeriodMatched] = loop;\n\t\t\t\t\t\t\t\t\t\t\tpDfsSwParam->CounterStored3 = idx[1];\n\t\t\t\t\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\t\t\t\t\t/*printk(\"%d %d\\n\", loop, pDfsSwParam->DFS_T[id][idx[1]-loop].period);*/\n\t\t\t\t\t\t\t\t\t\tPeriodMatched++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (PeriodMatched > pDfsSwParam->dfs_declare_thres)\n\t\t\t\t\t\t\t\t{\n#ifdef DFS_DEBUG\n\t\t\t\t\t\t\t\t\tif (PeriodMatched == 3)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_3++;\n\t\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1], pDfsSwParam->CounterStored[2]);*/\n\t\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1], pDfsSwParam->CounterStored2[2]);*/\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (PeriodMatched == 4)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_4++;\n\t\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d %d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1], pDfsSwParam->CounterStored[2], pDfsSwParam->CounterStored[3]);*/\n\t\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d %d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1], pDfsSwParam->CounterStored2[2], pDfsSwParam->CounterStored2[3]);*/\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_5++;\n\t\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d %d %d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1], pDfsSwParam->CounterStored[2], pDfsSwParam->CounterStored[3], pDfsSwParam->CounterStored[4]);*/\n\t\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d %d %d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1], pDfsSwParam->CounterStored2[2], pDfsSwParam->CounterStored2[3], pDfsSwParam->CounterStored2[4]);*/\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tpDfsSwParam->DebugPortPrint = 1;\n#endif\n\t\t\t\t\t\t\t\t\tprintk(\"Radar Detected(CE), W=%d, T=%d (%d), period matched=%d\\n\", (unsigned int)pCE_T->width, (unsigned int)T[1], (unsigned int)id, PeriodMatched);\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\tif (PeriodMatched > (pDfsSwParam->dfs_declare_thres + 1))\n \t\t\t\t\t\t\t\t      \t\tradar_detected = 1;\n\t\t\t\t\t\t\t\t\treturn radar_detected;\n\t\t\t\t\t\t\t\t}\n#ifdef DFS_DEBUG\n\t\t\t\t\t\t\t\telse if (PeriodMatched == 2)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpDfsSwParam->T_Matched_2++;\n\t\t\t\t\t\t\t\t\t/*printk(\"counter=%d %d\\n\", pDfsSwParam->CounterStored[0], pDfsSwParam->CounterStored[1]);*/\n\t\t\t\t\t\t\t\t\t/*printk(\"idx[1]=%d, loop =%d %d\\n\", pDfsSwParam->CounterStored3, pDfsSwParam->CounterStored2[0], pDfsSwParam->CounterStored2[1]);*/\n\t\t\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t} /* for (idx[1] = p2->start_idx; idx[1] <= p2->end_idx; idx[1]++)*/\n\n\t\t\t} /* for (idx[0] = pCurrent->start_idx; idx[0] <= pCurrent->end_idx; idx[0]++)*/\n\n\t\t}\n\t\t\n\t} /* for (i = end_idx; i < start_idx; i--)*/\n\t\n\t\n\treturn radar_detected;\n}\n\n/* \n    ==========================================================================\n    Description:\n\t\tRecheck DFS radar of stager type.\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    dfs_channel                DFS detect channel\n    Return Value:\n        \"TRUE\" if check pass, \"FALSE\" otherwise.\n    Note:\n    ==========================================================================\n */\nstatic BOOLEAN StagerRadarCheck(IN PRTMP_ADAPTER pAd, UINT8 dfs_channel)\n{\n\tUINT T1=0, T2=0, T3=0, T_all=0, F1, F2, F3 = 0, Fmax = 0, freq_diff_min, freq_diff_max;\n\tUINT8  dfs_stg2=0, dfs_typ5=0; /*, bbp141=0;*/\n\tUINT F_MAX, F_MID, F_MIN;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->StagerRadarCheck()\\n\"));\n\t{\n\tUINT32 bbp_val = 0;\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pAd->CommonCfg.RadarDetect.DfsProgramParam;\n\n\t/* select channel */\n\tbbp_val = (pDfsProgramParam->ChEnable << 16) | dfs_channel;\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, bbp_val);\n\n\tRTMP_BBP_IO_READ32(pAd, DFS_R19, &T_all);\n\tRTMP_BBP_IO_READ32(pAd, DFS_R22, &T1);\n\tRTMP_BBP_IO_READ32(pAd, DFS_R25, &T2);\n\t}\n\t\n\tT3 = T_all - T1 -T2;\n\n\tif (T3 < 5)\n\t\tT3 = 0;\n\t\n\t/*1.\tCheck radar stagger2 or stagger3*/\n\tif (T3 == 0 || ((T3 > (T1 + T2) ? (T3 - T1 - T2) : (T1 + T2 - T3)) < 25))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"stg2 confirmed\\n\"));\n\t\tdfs_stg2 =1;\n\t\tF1 = 20000000/T1; /*hz*/\n\t\tF2 = 20000000/T2;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"stg3 confirmed\\n\"));\n\t\tF1 = 20000000/T1; /*hz*/\n\t\tF2 = 20000000/T2;\n\t\tF3 = 20000000/T3;\n\t}\n\n\tF_MAX = (F1 > F2) ? ( (F1 > F3) ? F1 : F3 ) : ( (F2 > F3) ? F2 : F3 );\n\tF_MIN = (F1 < F2) ? ( (F1 < F3) ? F1 : F3 ) : ( (F2 < F3) ? F2 : F3 );  \t\n\tF_MID = (F1 > F2) ? ((F1 < F3) ? F1 : ( (F2 > F3) ?  F2 : F3 )) : ( F2 < F3 ? F2 : ((F1 > F3) ? F1 :F3)  );\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"F_MAX=%d F_MID=%d F_MIN=%d\\n\", F_MAX, F_MID, F_MIN));\n\t\n\tF1 = F_MAX;\t\n\tF2 = F_MID;\t\n\tF3 = F_MIN;\t\n         \n\tFmax = F1;\n\t\n\t/*2.\tCheck radar type 5 or type6*/\n\tif (Fmax>295 && Fmax<=405)\n\t{\t\n\t\tdfs_typ5 = 1;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"type5 confirmed\\n\"));\n\t\tfreq_diff_min = 20;\n\t\tfreq_diff_max = 50;\n\t}\n\telse if (Fmax>405 && Fmax<=1205) /* tolerate more range for looser type6 */\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"type6 confirmed\\n\"));\n\t\tfreq_diff_min = 80;\n\t\tfreq_diff_max = 400;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck failed, T1=%d, T2=%d, T3=%d\\n\", T1, T2, T3));\n\t\treturn FALSE;\n\t}\n\t\n\t/*3.\tAccording to decision of stagger and type do period check */\n\tif (dfs_stg2 == 1)\n\t{\n        UINT freq_diff = (F1 - F2);\n        \t\n        DBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck freq_diff_min=%d freq_diff_max=%d \\n\", freq_diff_min, freq_diff_max));\t\n        DBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck dfs_stg2, dff=%d  \\n\", freq_diff));\t\t\n        \t\n\t\tif ((freq_diff >= freq_diff_min) && (freq_diff <= freq_diff_max))\n\t\t\treturn TRUE; /* S/W check success */\n\t\telse\n\t\t{\t\t\t\n            DBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck failed, F1=%d, F2=%d\\n\", F1, F2));\n            DBGPRINT(RT_DEBUG_TRACE, (\"stg2 fail on S/W Freq confirmed\\n\"));\n\t\t\treturn FALSE; \t/* S/W check fail */\n\t\t}\n\t}\n\telse /* dfs_stg3 */\n\t{\n        UINT freq_diff_1 = (F1 - F2);\n        UINT freq_diff_2 = (F2 - F3);\n        \n        \t\n        DBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck freq_diff_min=%d freq_diff_max=%d \\n\", freq_diff_min, freq_diff_max));\t\t\n        DBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck dfs_stg3, dff_1=%d, dff_2=%d \\n\", freq_diff_1, freq_diff_2));\t\n        \t\n\n\t\tif( (freq_diff_1 >= freq_diff_min) && (freq_diff_1 <= freq_diff_max) && (freq_diff_2 >= freq_diff_min) && (freq_diff_2 <= freq_diff_max) )\n\t\t\treturn TRUE; /* S/W check success */\n\t\telse\n\t\t{\n            DBGPRINT(RT_DEBUG_TRACE, (\"StagerRadarCheck failed, F1=%d, F2=%d, F3=%d\\n\", F1, F2, F3));\n            DBGPRINT(RT_DEBUG_TRACE, (\"stg3 fail on S/W Freq confirmed\\n\"));\n\t\t\treturn FALSE;   /* S/W check fail */\n\t\t}\n\t}\n\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"<---StagerRadarCheck()\\n\"));\n}\n\n\n/* \n    ==========================================================================\n    Description:\n\t\tRecheck DFS radar of chrp type.\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    dfs_channel                DFS detect channel\n    Return Value:\n        \"TRUE\" if check pass, \"FALSE\" otherwise.\n    Note:\n    ==========================================================================\n */\nstatic BOOLEAN ChirpRadarCheck(IN PRTMP_ADAPTER pAd)\n{\n\tUINT32 CurrentTime, delta;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t\n\n\tRTMP_IO_READ32(pAd, PBF_LIFE_TIMER, &CurrentTime);\n\tdelta = CurrentTime - pRadarDetect->TimeStamp;\n\tpRadarDetect->TimeStamp = CurrentTime;\n\t\n\t/* ChirpCheck = 0 means the very first detection since start up*/\n\tif (pRadarDetect->ChirpCheck++ == 0)\n\t\treturn FALSE;\n\t\n\tif (delta <= (12*(1<<20)))  /* 12 sec */\n\t{\n\t\tif (pRadarDetect->ChirpCheck >= 2)\n\t\t{\n\t\t\t/* Anouce the radar on any mutiple detection within 12 sec*/\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ChirpRadarCheck OK.\\n\"));\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ChirpRadarCheck failed, discard previous detection.\\n\"));\n\t\tpRadarDetect->ChirpCheck = 1;\t\t\n\t\treturn FALSE;\n\t}\n\t/* default */\n\treturn FALSE;\n}\n\nstatic VOID DfsCheckBusyIdle(\n\t\t\tIN PRTMP_ADAPTER pAd)\n{\n\tint busy_delta, idle_delta;\t\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\n\tRTMP_IO_READ32(pAd, CH_IDLE_STA, &pRadarDetect->idle_time);\n\tRTMP_IO_READ32(pAd, CH_BUSY_STA, &pRadarDetect->busy_time);\n\n\t/*ch_busy_sta_index begining at 0.*/\n\tbusy_delta = pRadarDetect->busy_time - pRadarDetect->ch_busy_sta[pRadarDetect->ch_busy_sta_index];\n\tidle_delta = pRadarDetect->idle_time - pRadarDetect->ch_idle_sta[pRadarDetect->ch_busy_sta_index];\n\n\tif (busy_delta < 0)\n\t{\n\t\tbusy_delta = ~busy_delta;\n\t\tbusy_delta = (busy_delta >> CH_BUSY_SAMPLE_POWER);\n\t\tbusy_delta = ~busy_delta;\n\t}\n\telse\n\t\tbusy_delta = busy_delta >> CH_BUSY_SAMPLE_POWER;\n\n\tif (idle_delta < 0)\n\t{\n\t\tidle_delta = ~idle_delta;\n\t\tidle_delta = idle_delta >> CH_BUSY_SAMPLE_POWER;\n\t\tidle_delta = ~idle_delta;\n\t}\n\telse\n\t\tidle_delta = idle_delta >> CH_BUSY_SAMPLE_POWER;\n\n\tpRadarDetect->ch_busy_sum += busy_delta;\n\tpRadarDetect->ch_idle_sum += idle_delta;\n\t\t\t\n\t/* not sure if this is necessary??*/\n\tif (pRadarDetect->ch_busy_sum < 0)\n\t\tpRadarDetect->ch_busy_sum = 0;\n\tif (pRadarDetect->ch_idle_sum < 0)\n\t\tpRadarDetect->ch_idle_sum = 0;\n\t\t\t\n\tpRadarDetect->ch_busy_sta[pRadarDetect->ch_busy_sta_index] = pRadarDetect->busy_time;\n\tpRadarDetect->ch_idle_sta[pRadarDetect->ch_busy_sta_index] = pRadarDetect->idle_time;\n\t\t\t\n\tpRadarDetect->ch_busy_sta_index++;\n\tpRadarDetect->ch_busy_sta_index &= CH_BUSY_MASK;\n\t\t\t\n\tif ((pRadarDetect->ch_idle_sum >> pRadarDetect->ch_busy_idle_ratio) < pRadarDetect->ch_busy_sum )\n\t{\n\t\n\t\tif (!(pRadarDetect->McuRadarDebug & RADAR_DEBUG_DONT_CHECK_BUSY))\t\n\t\t\tpRadarDetect->ch_busy = 1;\n\t}\n\telse \n\t{\n\t\tif (!(pRadarDetect->McuRadarDebug & RADAR_DEBUG_DONT_CHECK_RSSI))\n\t\t{\n\t\t\tif ((pAd->ApCfg.RssiSample.AvgRssi0) && (pAd->ApCfg.RssiSample.AvgRssi0 > pRadarDetect->DfsRssiHigh))\n\t\t\t\tpRadarDetect->ch_busy = 2;\n\t\t\telse if ((pAd->ApCfg.RssiSample.AvgRssi0) && (pAd->ApCfg.RssiSample.AvgRssi0 < pRadarDetect->DfsRssiLow))\n\t\t\t\tpRadarDetect->ch_busy = 3;\n\t\t\telse\n\t\t\t\tpRadarDetect->ch_busy = 0;\n\t\t}\n\t}\n\n\tif (pRadarDetect->print_ch_busy_sta)\n\t\tDBGPRINT(RT_DEBUG_TRACE, \n\t\t\t\t(\"%d %d %d %d\\n\", pRadarDetect->ch_idle_sum, pRadarDetect->ch_busy_sum, pAd->ApCfg.RssiSample.AvgRssi0, pRadarDetect->ch_busy));\n\n}\n\nstatic BOOLEAN DfsChannelCheck(\n\t\t\tIN PRTMP_ADAPTER pAd,\n\t\t\tIN UINT8 DfsChannel)\n{\n\tpNewDFSTable pDFS2Table;\n\tUINT8 i;\n\tUINT32 W, T;\n\tBOOLEAN radarDeclared = 0;\n\t/*UCHAR BBP_1 = 0, BBP_2 = 0, BBP_3 = 0, BBP_4 = 0;*/\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"DFS HW check channel = 0x%x\\n\", DfsChannel));\n\t/*Select the DFS table based on radar country region*/\n\tif (pAd->CommonCfg.RDDurRegion == FCC)\n\t\tpDFS2Table = &NewDFSTable1[0];\n\telse if (pAd->CommonCfg.RDDurRegion == CE)\n\t{\n\t\tpDFS2Table = &NewDFSTable1[1];\n\t}\n\telse /* Japan*/\n\t{\n\t\tif ((pAd->CommonCfg.Channel >= 52) && (pAd->CommonCfg.Channel <= 64))\n\t\t{\n\t\t\tpDFS2Table = &NewDFSTable1[3];\n\t\t}\n\t\telse\n\t\t{\n\t\tpDFS2Table = &NewDFSTable1[2];\n\t\t}\n\t}\n\t/*check which channe(0~3) is detecting radar signals*/\n\tfor (i = 0; i < pAd->chipCap.DfsEngineNum; i++)\n\t{\n\t\t\n\t\tif (DfsChannel & (0x1 << i))\n\t\t{\n\t\t\tUINT32 bbp_val = 0;\n\t\t\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pAd->CommonCfg.RadarDetect.DfsProgramParam;\n\n\t\t\t/* select channel */\n\t\t\tbbp_val = (pDfsProgramParam->ChEnable << 16) | i;\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, bbp_val);\n\n\t\t\tRTMP_BBP_IO_READ32(pAd, DFS_R19, &T);\n\t\t\tRTMP_BBP_IO_READ32(pAd, DFS_R20, &W);\n\t\t\tif (DfsSwCheckOnHwDetection(pAd, pDFS2Table, i, T, W) == FALSE)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tprintk(\"T = %u, W= %u detected by ch %d\\n\", T, W, i);\n\t\t\tRTMP_BBP_IO_READ32(pAd, 0x2a70, &bbp_val);\n\t\t\tprintk(\"bbp 0x2a70 = 0x%08x\\n\", bbp_val);\n\t\t\t\n\t\t\t/*set this variable to 1 for announcing that we find the radar signals.*/\n\t\t\tradarDeclared = 1;\n\n\t\t\tif ( ((i == 3) || (i == 2)) && (pDFS2Table->entry[i].mode != 0) )\n\t\t\t{\n\t\t\t\tULONG B, W2;\n\t\t\t\tRTMP_BBP_IO_READ32(pAd, DFS_R22, &B);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Burst = %lu(0x%lx)\\n\", B, B));\n\t\t\t\t\n\t\t\t\tRTMP_BBP_IO_READ32(pAd, DFS_R23, &W2);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The second Width = %lu(0x%lx)\\n\", W2, W2));\n\t\t\t}\n\n\t\t}\n\t}\n\treturn radarDeclared;\n}\n\nstatic BOOLEAN DfsEventDataFetch(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN PUCHAR\t\t  pData,\n\t\tOUT PDFS_EVENT pDfsEvent)\n{\n\tpDfsEvent->EngineId = pData[0];\n\tif (pDfsEvent->EngineId == 0xff) /* end of event */\n\t\treturn FALSE;\n\t\n\tpDfsEvent->TimeStamp = pData[1];\n\tpDfsEvent->TimeStamp |= (pData[2] << 8);\n\tpDfsEvent->TimeStamp |= (pData[3] << 16);\n\n\tpDfsEvent->Width = pData[4];\n\tpDfsEvent->Width |= (pData[5] << 8);\n\t\n\t/* Check if event is valid */\n\tif (!DFS_EVENT_SANITY_CHECK(pAd, *pDfsEvent))\n\t\t return FALSE;\n\n\treturn TRUE;\n}\n\nVOID NewRadarDetectionProgram(PRTMP_ADAPTER pAd, pNewDFSTable pDFS2Table)\n{\n\tUINT8 idx, TalbeIdx, DFSR3;\n\tUINT8 DfsEngineNum = pAd->chipCap.DfsEngineNum;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;\n\n\n\tpRadarDetect->bDfsInit = FALSE;\n\n\t/* Get Table index*/\n\tfor (TalbeIdx = 0; !((1<<TalbeIdx) & pDFS2Table->type); TalbeIdx++)\n\t{\n\t\tif (TalbeIdx > MAX_RD_REGION)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table index out of range.\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tfor(idx = 0; idx<DfsEngineNum; idx++)\n\t{\n\t\tif ((pRadarDetect->DFSParamFromConfig & (0x1<<idx)) && pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].valid)\n\t\t{\n\t\t\tpDFS2Table->entry[idx].mode = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].mode;\n\t\t\tpDFS2Table->entry[idx].avgLen = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].avgLen;\n\t\t\tpDFS2Table->entry[idx].ELow = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].ELow;\n\t\t\tpDFS2Table->entry[idx].EHigh = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].EHigh;\n\t\t\tpDFS2Table->entry[idx].WLow = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].WLow;\n\t\t\tpDFS2Table->entry[idx].WHigh = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].WHigh;\n\t\t\tpDFS2Table->entry[idx].EpsilonW = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].EpsilonW;\n\t\t\tpDFS2Table->entry[idx].TLow = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].TLow;\n\t\t\tpDFS2Table->entry[idx].THigh = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].THigh;\n\t\t\tpDFS2Table->entry[idx].EpsilonT = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].EpsilonT;\n\t\t\tpDFS2Table->entry[idx].BLow = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].BLow;\n\t\t\tpDFS2Table->entry[idx].BHigh = pDfsProgramParam->NewDFSTableEntry[(TalbeIdx*DfsEngineNum)+idx].BHigh;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TalbeIdx = %d; idx = %d; DFSParam = %2d; %3d; %3d; %3d; %3d; %4d; %3d; %6lu; %7lu; %4d; %2lu; %2lu\\n\", TalbeIdx, idx,\n\t\t\t\t\tpDFS2Table->entry[idx].mode, pDFS2Table->entry[idx].avgLen, pDFS2Table->entry[idx].ELow, \n\t\t\t\t\tpDFS2Table->entry[idx].EHigh, pDFS2Table->entry[idx].WLow, pDFS2Table->entry[idx].WHigh,\n\t\t\t\t\tpDFS2Table->entry[idx].EpsilonW, pDFS2Table->entry[idx].TLow, pDFS2Table->entry[idx].THigh,\n\t\t\t\t\tpDFS2Table->entry[idx].EpsilonT, pDFS2Table->entry[idx].BLow, pDFS2Table->entry[idx].BHigh));\n\t\t}\n\t}\n\t\n\t/* Symmetric round*/\n    if(pRadarDetect->SymRoundFromCfg != 0)\n    {\n        pDfsProgramParam->Symmetric_Round = pRadarDetect->SymRoundFromCfg;\n        DBGPRINT(RT_DEBUG_TRACE, (\"Symmetric_Round = %d\\n\", pDfsProgramParam->Symmetric_Round));\n    }\n\n    /* BusyIdleRatio*/\n    if(pRadarDetect->BusyIdleFromCfg != 0)\n    {\n        pRadarDetect->ch_busy_idle_ratio = pRadarDetect->BusyIdleFromCfg;\n        DBGPRINT(RT_DEBUG_TRACE, (\"ch_busy_idle_ratio = %d\\n\", pRadarDetect->ch_busy_idle_ratio));\n    }\n    /* DfsRssiHigh*/\n    if(pRadarDetect->DfsRssiHighFromCfg != 0)\n    {\n        pRadarDetect->DfsRssiHigh = pRadarDetect->DfsRssiHighFromCfg;\n        DBGPRINT(RT_DEBUG_TRACE, (\"DfsRssiHigh = %d\\n\", pRadarDetect->DfsRssiHigh));\n    }\n    /* DfsRssiLow*/\n    if(pRadarDetect->DfsRssiLowFromCfg != 0)\n    {\n        pRadarDetect->DfsRssiLow = pRadarDetect->DfsRssiLowFromCfg;\n        DBGPRINT(RT_DEBUG_TRACE, (\"DfsRssiLow = %d\\n\", pRadarDetect->DfsRssiLow));\n    }\n\t\n\t/*pRadarDetect->MCURadarRegion = pAd->CommonCfg.RDDurRegion;*/\n\tpRadarDetect->MCURadarRegion = pDFS2Table->type;\n\t\n\t{\n\tUINT32 bbp_val = 0;\n\t\n\tDFSR3 = pDfsProgramParam->Symmetric_Round << 4;\n\n\t/* Full 40Mhz*/\n\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\tDFSR3 |= 0x80;  /* BW 40*/\n\n\t/* Delta Delay*/\n\tDFSR3 |= (pDfsProgramParam->DeltaDelay & 0xf);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"R3 = 0x%x\\n\", DFSR3));\n\t\n\t/* VGA Mask*/\n\tDBGPRINT(RT_DEBUG_TRACE,(\"VGA_Mask = 0x%x\\n\", pDfsProgramParam->VGA_Mask));\n\n\t/* Input Control 0 */\n\tbbp_val = (pDfsProgramParam->VGA_Mask << 16) | (DFSR3);\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R2, bbp_val);\n\n\t\n\t/* packet end Mask*/\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Packet_End_Mask = 0x%x\\n\", pDfsProgramParam->Packet_End_Mask));\n\t\n\t/* Rx PE Mask*/\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Rx_PE_Mask = 0x%x\\n\", pDfsProgramParam->Rx_PE_Mask));\n\n\t/* Input Control 1 */\n\tbbp_val = (pDfsProgramParam->Rx_PE_Mask << 16) | (pDfsProgramParam->Packet_End_Mask);\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R3, bbp_val);\n\t\n\t/* program each channel*/\n\tfor (idx = 0; idx < DfsEngineNum; idx++)\n\t{\n\t\t/* select channel*/\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, idx);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"write DFS Channle[%d] configuration \\n\", idx));\n\n\t\t/* Detection Mode */\n\t\tbbp_val = (pDFS2Table->entry[idx].mode & 0xf);\n\t\t\n\t\tif (pAd->chipCap.DfsEngineNum > 4 && (idx==4 || idx==5))\n\t\t\tbbp_val |= ((pDFS2Table->entry[idx].avgLen & 0x3) << 28);\n\t\telse\n\t\t\tbbp_val |= ((pDFS2Table->entry[idx].avgLen & 0x1ff) << 16);\n\n\t\t/* DFS Mode */\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R4, bbp_val);\n\n\t\t/* DFS Energy */\n\t\tbbp_val = ((pDFS2Table->entry[idx].EHigh & 0x0fff) << 16) | (pDFS2Table->entry[idx].ELow & 0x0fff);\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R5, bbp_val);\n\n\t\t/* DFS Period Low */\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R7, pDFS2Table->entry[idx].TLow);\n\n\t\t/* DFS Period High */\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R9, pDFS2Table->entry[idx].THigh);\n\n\t\t/* DFS Burst Low */\n\t\t/* DFS Burst High */\n\t\t\n\t\t/* DFS Width */\n\t\tbbp_val = ((pDFS2Table->entry[idx].WHigh & 0x0fff) << 16) | (pDFS2Table->entry[idx].WLow & 0x0fff);\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R14, bbp_val);\n\n\n\t\t/* DFS Measurement Uncertainty */\n\t\tbbp_val = (pDFS2Table->entry[idx].EpsilonW << 16) | (pDFS2Table->entry[idx].EpsilonT);\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R15, bbp_val);\n\n\t\t/* DFS Event Expiration */\n\t\tif (pDfsProgramParam->RadarEventExpire[idx] != 0)\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R17, pDfsProgramParam->RadarEventExpire[idx]);\n\t\t\n\t}\t\n\n\t/* Reset status */\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R1, pRadarDetect->EnabledChMask);\n\t\n\t/* Enable detection*/\n\tbbp_val = (pDfsProgramParam->ChEnable << 16);\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, bbp_val);\n\t}\n\tpRadarDetect->bDfsInit = TRUE;\n\n}\n\nBOOLEAN DfsSwCheckOnHwDetection(\n\t IN PRTMP_ADAPTER pAd,\n\t IN pNewDFSTable pDFS2Table,\n\t IN UINT8 DfsChannel,\n\t IN ULONG RadarPeriod,\n\t IN ULONG RadarWidth)\n{\n\tBOOLEAN bRadarCheck = TRUE;\n\tif (!RadarPeriod || !RadarWidth)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Block eception on zero RadarPeriod or RadarWidth\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tif (pDFS2Table->type == NEW_DFS_JAP)\n\t{\n\t\t/* Double check on pusle Width and Period*/\n\t\tif (DfsChannel < 3)\n\t\t{\n\t\t\t/*check short pulse*/\n\t\t\tif (RadarWidth < 375) \n\t\t\t{\n\t\t\t\t/* block the illegal period */\n\t\t\t\tif ((RadarPeriod < 2800) ||\n\t\t\t\t\t(RadarPeriod > 5000 && RadarPeriod < 6400) ||\n\t\t\t\t\t(RadarPeriod > 6800 && RadarPeriod < 27560)||\n\t\t\t\t\t(RadarPeriod > 27960 && RadarPeriod < 28360) ||\n\t\t\t\t\t(RadarPeriod > 28700 && RadarPeriod < 79900) ||\n\t\t\t\t\t(RadarPeriod > 80100))\n\t\t\t\t{ \n\t\t\t\t\t /*(0~140), (250~320us), (340~1378us), (1398~1418), (1435~3995us) and (4005us~) according to the spec*/\n\t\t\t\t\t DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"Radar check: ch=%u, T=%lu, W=%lu, blocked\\n\", DfsChannel, RadarPeriod, RadarWidth));\n\t\t\t\t\t bRadarCheck = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (RadarWidth > 375)\n\t\t\t{\n\t\t\t\tif ((RadarPeriod<3500) || (RadarPeriod>10400))\n\t\t\t\t{ \n\t\t\t\t\t /* block the illegal period */\n\t\t\t\t\t /*(0~175) and (520us~) according to the spec*/\n\t\t\t\t\t DBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"Radar check: ch=%u, T=%lu, W=%lu, blocked\\n\", DfsChannel, RadarPeriod, RadarWidth));\n\t\t\t\t\t bRadarCheck = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (DfsChannel == 3)\n\t\t{\n\t\t\tbRadarCheck = ChirpRadarCheck(pAd);\n\t\t}\n\t}\n\telse if (pDFS2Table->type == NEW_DFS_EU)\n\t{\n\t\tif (DfsChannel == 4) /* to do: check dfs mode 8or9*/\n\t\t{\n\t\t\tif (StagerRadarCheck(pAd, DfsChannel) == FALSE)\n\t\t\t\tbRadarCheck = FALSE;\n\t\t}\n\t}\n\treturn bRadarCheck;\n}\n\nstatic VOID ChannelSelectOnRadarDetection(\n\t\tIN PRTMP_ADAPTER pAd)\n{\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\t\n\tUINT i;\n\n\tif (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)\n\t\treturn;\n\t\n\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)\n\t\t{\n\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40)\n\t\t\t{\n\t\t\t\tif ((pAd->ChannelList[i].Channel >> 2) & 1)\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->ChannelList[i+1].Channel - pAd->ChannelList[i].Channel) == 4 )\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Find extend channel = %u\\n\", pAd->ChannelList[i+1].Channel));\n\t\t\t\t\t\tpAd->ChannelList[i+1].RemainingTimeForUse = 1800;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tif ((pAd->ChannelList[i].Channel - pAd->ChannelList[i-1].Channel) == 4 )\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Find extend channel = %u\\n\", pAd->ChannelList[i-1].Channel));\n\t\t\t\t\t\tpAd->ChannelList[i-1].RemainingTimeForUse = 1800;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BW is not 40.\\n\"));\n\t\t\t\n\t\t\tpAd->ChannelList[i].RemainingTimeForUse = 1800;/*30 min = 1800 sec*/\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/*when find an radar, the ChMovingTime will be set to announce how many seconds to sending software radar detection time.*/\n\tif ((pAd->CommonCfg.RDDurRegion == CE) && RESTRICTION_BAND_1(pAd))\n\t\tpAd->Dot11_H.ChMovingTime = 605;\n\telse\n\t\tpAd->Dot11_H.ChMovingTime = 65;\n\n\t/*if the Radar country region is JAP, we need find a new clear channel */\n\tif (pAd->CommonCfg.RDDurRegion == JAP_W56)\n\t{\n\t\tfor (i = 0; i < pAd->ChannelListNum ; i++)\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = APAutoSelectChannel(pAd, FALSE);\n\t\t\tif ((pAd->CommonCfg.Channel >= 100) && (pAd->CommonCfg.Channel <= 140))\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse if (pAd->CommonCfg.RDDurRegion == JAP_W53)\n\t{\n\t\tfor (i = 0; i < pAd->ChannelListNum ; i++)\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = APAutoSelectChannel(pAd, FALSE);\n\t\t\tif ((pAd->CommonCfg.Channel >= 36) && (pAd->CommonCfg.Channel <= 60))\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t\tpAd->CommonCfg.Channel = APAutoSelectChannel(pAd, FALSE);\n\t\t\n#ifdef DOT11_N_SUPPORT\n\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\t/*ApSelectChannelCheck(pAd);*/\n\tif (pAd->Dot11_H.RDMode == RD_NORMAL_MODE)\n\t{\n\t\tpAd->Dot11_H.RDMode = RD_SWITCHING_MODE;\n\t\t/* Prepare a count-down for channel switching */\n\t\tpAd->Dot11_H.CSCount = 0;\n\t}\n\telse if (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)\n\t{\n\t\tpAd->Dot11_H.RDMode = RD_SWITCHING_MODE;\n\t\t/*set this flag to 1 and the AP will restart to switch into new channel */\n\t\tpRadarDetect->DFSAPRestart = 1;\n\t\tschedule_dfs_task(pAd);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): Error! Unexpected radar state.\\n\", __FUNCTION__));\n\t}\n\t\tpRadarDetect->radarDeclared = 0;\n}\n\nstatic BOOLEAN DfsEventDrop(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN PDFS_EVENT pDfsEvent)\n{\n\tUINT32 TimeDiff = 0;  /* unit: 50ns */\n\tUINT16 PreEnvtWidth = 0;\n\tBOOLEAN RetVal = FALSE;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pAd->CommonCfg.RadarDetect.DfsSwParam;\n\tPDFS_EVENT pPreDfsEvent = &pDfsSwParam->PreDfsEvent;\n\n\tif (pDfsEvent->EngineId != pPreDfsEvent->EngineId)\n\t{\n\t\t/* update prevoius event record then leave */\n\t\tNdisCopyMemory(pPreDfsEvent, pDfsEvent, DFS_EVENT_SIZE);\n\t\treturn FALSE;\n\t}\n\n\tif (pDfsEvent->EngineId == 0x01 || pDfsEvent->EngineId == 0x02)\n\t{\n\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\t{\n\t\t\tTimeDiff = ((pDfsEvent->TimeStamp - pPreDfsEvent->TimeStamp) >> 1);  /* 25ns to 50ns*/\n\t\t\tPreEnvtWidth = pPreDfsEvent->Width >> 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTimeDiff = (pDfsEvent->TimeStamp - pPreDfsEvent->TimeStamp);\n\t\t\tPreEnvtWidth = pPreDfsEvent->Width;\n\t\t}\n\t\t\n\t\tif (TimeDiff < pDfsSwParam->EvtDropAdjTime &&\n\t\t\tPreEnvtWidth >= 200)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, \n\t\t\t\t\t(\"%s(): EngineId = %x,  Width = %u, TimeStamp = %u\\n\",\n\t\t\t\t\t__FUNCTION__,\n\t\t\t\t\tpDfsEvent->EngineId,\n\t\t\t\t\tpDfsEvent->Width,\n\t\t\t\t\tpDfsEvent->TimeStamp));\n\t\t\tRetVal = TRUE;\n\t\t}\n\t}\n\n\t/* update prevoius event record */\n\tNdisCopyMemory(pPreDfsEvent, pDfsEvent, DFS_EVENT_SIZE);\n\t\n\treturn RetVal;\n}\n\nstatic void dfs_sw_init(PRTMP_ADAPTER pAd)\n{\n\tint j, k;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;\n\n\tpDfsSwParam->fcc_5_threshold = 1000;\n\tpDfsSwParam->fcc_5_idx = 0;\n\tpDfsSwParam->fcc_5_last_idx = 0;\n\tpDfsSwParam->dfs_check_loop = DFS_SW_RADAR_CHECK_LOOP;\n\tpDfsSwParam->dfs_width_diff_ch1_Shift = DFS_SW_RADAR_CH1_SHIFT;\t\n\tpDfsSwParam->dfs_width_diff_ch2_Shift = DFS_SW_RADAR_CH2_SHIFT;\t\n\tpDfsSwParam->PreDfsEvent.EngineId = 0xff;\n\tpDfsSwParam->EvtDropAdjTime = 2000;\n\n\t\t/* clear long pulse table */\n\t\tpDfsSwParam->FCC_5[pDfsSwParam->fcc_5_idx].counter = 0;\n\t\tpDfsSwParam->fcc_5_idx = 0;\n\t\tpDfsSwParam->fcc_5_last_idx = 0;\n\n\t/*pDfsSwParam->dfs_width_diff_Shift = DFS_SW_RADAR_SHIFT;*/\n\tpDfsSwParam->dfs_width_ch0_err_L = DFS_SW_RADAR_CH0_ERR;\n\tif (pAd->CommonCfg.RDDurRegion == CE)\t\n\t\tpDfsSwParam->dfs_period_err = (DFS_SW_RADAR_PERIOD_ERR << 2);\n\telse\n\t\tpDfsSwParam->dfs_period_err = DFS_SW_RADAR_PERIOD_ERR;\n\tif (pAd->CommonCfg.RDDurRegion == CE)\n\t{\n\t\tpDfsSwParam->dfs_width_ch0_err_H = CE_STAGGERED_RADAR_CH0_H_ERR;\n\t\tpDfsSwParam->dfs_declare_thres = CE_STAGGERED_RADAR_DECLARE_THRES;\n\t\tpDfsSwParam->dfs_max_period = CE_STAGGERED_RADAR_PERIOD_MAX;\n\t}\n\telse\t\n\t{\t\t\n\t\t/*pDfsSwParam->dfs_declare_thres = DFS_SW_RADAR_DECLARE_THRES;*/\n\t\tif (pAd->CommonCfg.RDDurRegion == FCC)\n\t\t\tpDfsSwParam->dfs_max_period = FCC_RADAR_PERIOD_MAX;\n\t\telse if (pAd->CommonCfg.RDDurRegion == JAP)\n\t\t\tpDfsSwParam->dfs_max_period = JAP_RADAR_PERIOD_MAX;\n\t}\n\t\n\tpDfsSwParam->dfs_check_loop = DFS_SW_RADAR_CHECK_LOOP;\n\tpDfsSwParam->dfs_width_diff_ch1_Shift = DFS_SW_RADAR_CH1_SHIFT;\n\tpDfsSwParam->dfs_width_diff_ch2_Shift = DFS_SW_RADAR_CH2_SHIFT;\n\tpDfsSwParam->dfs_width_ch0_err_L = DFS_SW_RADAR_CH0_ERR;\n\tif (pAd->CommonCfg.RDDurRegion == CE)\n\t\tpDfsSwParam->dfs_period_err = (DFS_SW_RADAR_PERIOD_ERR << 2);\n\telse\n\t\tpDfsSwParam->dfs_period_err = DFS_SW_RADAR_PERIOD_ERR;\n\n\tif (pAd->CommonCfg.RDDurRegion == CE)\n\t{\n\t\tpDfsSwParam->dfs_width_ch0_err_H = CE_STAGGERED_RADAR_CH0_H_ERR;\n\t\tpDfsSwParam->dfs_declare_thres = CE_STAGGERED_RADAR_DECLARE_THRES;\n\t\tpDfsSwParam->dfs_max_period = CE_STAGGERED_RADAR_PERIOD_MAX;\n\t}\n\telse\n\t{\n\t\t/*pDfsSwParam->dfs_declare_thres = DFS_SW_RADAR_DECLARE_THRES;*/\n\t\tif (pAd->CommonCfg.RDDurRegion == FCC)\n\t\t\tpDfsSwParam->dfs_max_period = FCC_RADAR_PERIOD_MAX;\n\t\telse if (pAd->CommonCfg.RDDurRegion == JAP)\n\t\t\tpDfsSwParam->dfs_max_period = JAP_RADAR_PERIOD_MAX;\n\t}\n\n\tif (pRadarDetect->use_tasklet)\n\t\tpRadarDetect->PollTime = NEW_DFS_CHECK_TIME_TASKLET;\n\telse\n\t\tpRadarDetect->PollTime = NEW_DFS_CHECK_TIME;\n\n\tfor (k = 0; k < pAd->chipCap.DfsEngineNum; k++)\n\t{\n\t\tfor (j = 0; j < NEW_DFS_DBG_PORT_ENT_NUM; j++)\n\t\t{\n\t\t\tpDfsSwParam->DFS_W[k][j].start_idx = 0xffff;\n\t\t}\n\t}\n\n\tfor (k = 0; k < pAd->chipCap.DfsEngineNum; k++)\n\t{\n\t\tpDfsSwParam->sw_idx[k] = NEW_DFS_DBG_PORT_ENT_NUM - 1;\n\t\tpDfsSwParam->hw_idx[k] = 0;\n\t}\n\t\t\n\tNdisZeroMemory(pDfsSwParam->DFS_T, sizeof(pDfsSwParam->DFS_T));\n\tNdisZeroMemory(pDfsSwParam->DFS_W, sizeof(pDfsSwParam->DFS_W));\n}\n\nvoid modify_table1(PRTMP_ADAPTER pAd, ULONG idx, ULONG value)\n{\n\tpNewDFSTable pDFS2Table;\n\tULONG x, y;\t\n\tUINT8 DfsEngineNum = pAd->chipCap.DfsEngineNum;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;\n\n\tif (pAd->CommonCfg.RDDurRegion == FCC)\n\t\tpDFS2Table = &NewDFSTable1[0];\n\telse if (pAd->CommonCfg.RDDurRegion == CE)\n\t{\n\t\tpDFS2Table = &NewDFSTable1[1];\n\t}\n\telse /* Japan*/\n\t{\n\t\tif ((pAd->CommonCfg.Channel >= 52) && (pAd->CommonCfg.Channel <= 64))\n\t\t{\n\t\t\tpDFS2Table = &NewDFSTable1[3];\n\t\t}\n\t\telse\n\t\t{\n\t\tpDFS2Table = &NewDFSTable1[2];\n\t\t}\n\t}\n\n\tif (idx == 0)\n\t{\n\t\tpDfsProgramParam->DeltaDelay = value;\n\t}\n\telse if (idx <= (DfsEngineNum*16))\n\t{\t\n\t\tx = idx / 16;\n\t\ty = idx % 16;\n\t\tpRadarDetect->DFSParamFromConfig = 0; /* to prevent table be loaded from config file again */\n\t\tswitch (y)\n\t\t{\n\t\tcase 1:\n\t\t\tpDFS2Table->entry[x].mode = (USHORT)value;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tpDFS2Table->entry[x].avgLen = (USHORT)value;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tpDFS2Table->entry[x].ELow = (USHORT)value;\n\t\t\tbreak;\n    \t\n\t\tcase 4:\n\t\t\tpDFS2Table->entry[x].EHigh = (USHORT)value;\n\t\t\tbreak;\n    \t\n\t\tcase 5:\n\t\t\tpDFS2Table->entry[x].WLow = (USHORT)value;\n\t\t\tbreak;\n    \t\n\t\tcase 6:\n\t\t\tpDFS2Table->entry[x].WHigh = (USHORT)value;\n\t\t\tbreak;\n    \t\n\t\tcase 7:\n\t\t\tpDFS2Table->entry[x].EpsilonW = (USHORT)value;\n\t\t\tbreak;\n    \t\n\t\tcase 8:\n\t\t\tpDFS2Table->entry[x].TLow = (ULONG)value;\n\t\t\tbreak;\n    \t\n\t\tcase 9:\n\t\t\tpDFS2Table->entry[x].THigh = (ULONG)value;\n\t\t\tbreak;\n    \t\n\t\tcase 0xa:\n\t\t\tpDFS2Table->entry[x].EpsilonT = (USHORT)value;\n\t\t\tbreak;\n\n\t\tcase 0xb:\n\t\t\tpDFS2Table->entry[x].BLow= (USHORT)value;\n\t\t\tbreak;\n\t\tcase 0xc:\n\t\t\tpDFS2Table->entry[x].BHigh = (USHORT)value;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n    \t\n\t}\n\telse if (idx == (DfsEngineNum*16 +1))\n\t{\n\t\tpDfsProgramParam->Symmetric_Round = (ULONG)value;\n\t}\n\telse if (idx == (DfsEngineNum*16 +2))\n\t{\n\t\tpDfsProgramParam->VGA_Mask = (ULONG)value;\n\t}\n\telse if (idx == (DfsEngineNum*16 +3))\n\t{\n\t\tpDfsProgramParam->Packet_End_Mask = (ULONG)value;\n\t}\n\telse if (idx == (DfsEngineNum*16 +4))\n\t{\n\t\tpDfsProgramParam->Rx_PE_Mask = (ULONG)value;\n\t}\n\n\tprintk(\"Delta_Delay(0) = %d\\n\", pDfsProgramParam->DeltaDelay);\n\n\tfor (x = 0; x < DfsEngineNum; x++)\n\t{\n\t\tprintk(\"Channel %lu\\n\", x);\n\t\tprintk(\"\\t\\tmode(%02lu)=%d, M(%02lu)=%03d, EL(%02lu)=%03d EH(%02lu)=%03d, WL(%02lu)=%03d WH(%02lu)=%04d, eW(%02lu)=%02d\\n\\t\\tTL(%02lu)=%05u TH(%02lu)=%06u, eT(%02lu)=%03d, BL(%02lu)=%u, BH(%02lu)=%u\\n\",\n\t\t(x*16+1), (unsigned int)pDFS2Table->entry[x].mode,\n\t\t(x*16+2), (unsigned int)pDFS2Table->entry[x].avgLen,\n\t\t(x*16+3), (unsigned int)pDFS2Table->entry[x].ELow,\n\t\t(x*16+4), (unsigned int)pDFS2Table->entry[x].EHigh,\n\t\t(x*16+5), (unsigned int)pDFS2Table->entry[x].WLow,\n\t\t(x*16+6), (unsigned int)pDFS2Table->entry[x].WHigh,\n\t\t(x*16+7), (unsigned int)pDFS2Table->entry[x].EpsilonW,\n\t\t(x*16+8), (unsigned int)pDFS2Table->entry[x].TLow,\n\t\t(x*16+9), (unsigned int)pDFS2Table->entry[x].THigh,\n\t\t(x*16+0xa), (unsigned int)pDFS2Table->entry[x].EpsilonT,\n\t\t(x*16+0xb), (unsigned int)pDFS2Table->entry[x].BLow,\n\t\t(x*16+0xc), (unsigned int)pDFS2Table->entry[x].BHigh);\n\t}\n\n\tprintk(\"Symmetric_Round(%02d) = %d\\n\", (DfsEngineNum*16 +1), pDfsProgramParam->Symmetric_Round);\n\tprintk(\"VGA_Mask(%02d) = %d\\n\", (DfsEngineNum*16 +2), pDfsProgramParam->VGA_Mask);\n\tprintk(\"Packet_End_Mask(%02d) = %d\\n\", (DfsEngineNum*16 +3), pDfsProgramParam->Packet_End_Mask);\n\tprintk(\"Rx_PE_Mask(%02d) = %d\\n\", (DfsEngineNum*16 +4), pDfsProgramParam->Rx_PE_Mask);\n\n}\n\n\nvoid modify_table2(PRTMP_ADAPTER pAd, ULONG idx, ULONG value)\n{\n\tpNewDFSValidRadar pDFSValidRadar;\n\tULONG x, y;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t\n\tidx--;\n\n\tx = idx / 17;\n\ty = idx % 17;\n\t\n\tpDFSValidRadar = &NewDFSValidTable[0];\n\t\n\twhile (pDFSValidRadar->type != NEW_DFS_END)\n\t{\n\t\tif (pDFSValidRadar->type & pRadarDetect->MCURadarRegion)\n\t\t{\n\t\t\tif (x == 0)\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t{\n\t\t\t\tx--;\n\t\t\t\tpDFSValidRadar++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpDFSValidRadar++;\n\t}\n\t\n\tif (pDFSValidRadar->type == NEW_DFS_END)\n\t{\n\t\tprintk(\"idx=%d exceed max number\\n\", (unsigned int)idx);\n\t\treturn;\n\t}\n\tswitch(y)\n\t{\n\tcase 0:\n\t\tpDFSValidRadar->channel = value;\n\t\tbreak;\n\tcase 1:\n\t\tpDFSValidRadar->WLow = value;\n\t\tbreak;\n\tcase 2:\n\t\tpDFSValidRadar->WHigh = value;\n\t\tbreak;\n\tcase 3:\n\t\tpDFSValidRadar->W = value;\n\t\tbreak;\n\tcase 8:\n\t\tpDFSValidRadar->WMargin = value;\n\t\tbreak;\n\tcase 9:\n\t\tpDFSValidRadar->TLow = value;\n\t\tbreak;\n\tcase 10:\n\t\tpDFSValidRadar->THigh = value;\n\t\tbreak;\n\tcase 11:\n\t\tpDFSValidRadar->T = value;\n\t\tbreak;\n\tcase 16:\n\t\tpDFSValidRadar->TMargin = value;\n\t\tbreak;\n\t}\n\t\n\tpDFSValidRadar = &NewDFSValidTable[0];\n\twhile (pDFSValidRadar->type != NEW_DFS_END)\n\t{\n\t\tif (pDFSValidRadar->type & pRadarDetect->MCURadarRegion)\n\t\t{\n\t\t\tprintk(\"ch = %x  --- \", pDFSValidRadar->channel);\n\t\t\tprintk(\"wl:wh = %d:%d  \", pDFSValidRadar->WLow, pDFSValidRadar->WHigh);\n\t\t\tprintk(\"W = %u  --- \", pDFSValidRadar->W);\n\t\t\tprintk(\"W Margin = %d\\n\", pDFSValidRadar->WMargin);\n\t\t\tprintk(\"Tl:Th = %d:%d  \", (unsigned int)pDFSValidRadar->TLow, (unsigned int)pDFSValidRadar->THigh);\n\t\t\tprintk(\"T = %lu  --- \", pDFSValidRadar->T);\n\t\t\tprintk(\"T Margin = %d\\n\", pDFSValidRadar->TMargin);\n\t\t}\n\t\tpDFSValidRadar++;\n\t}\n\n}\n\n\n#ifdef RTMP_MAC_USB\nVOID NewUsbTimerCB_Radar(\n \tIN PRTMP_ADAPTER pAd)\n\n{\n\tUCHAR channel=0;\n\tUCHAR radarDeclared = 0;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\n#ifdef RALINK_ATE\t\t\n\t/* Nothing to do in ATE mode */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\tif (!DFS_CHECK_FLAGS(pAd, pRadarDetect) ||\n\t\t(pRadarDetect->PollTime == 0))\n\t\treturn;\n\n\tif (pRadarDetect->RadarTimeStampLow++ > 5)\n\t\tpRadarDetect->RadarTimeStampLow = 0;\n\n\t/*500ms*/\n\tif ((pRadarDetect->RadarTimeStampLow % 5) == 0)\n\t\tDfsCheckBusyIdle(pAd);\n\t\n\tif (!pRadarDetect->bDfsSwDisable &&\n\t\t(pRadarDetect->RadarTimeStampLow & 0x1) && /* 200ms */\n\t\t!pRadarDetect->ch_busy) \n\t\tSwCheckDfsEventWithFw(pAd);\n\n\t/* \n\t\tThe following codes is used to check if the hardware find the Radar Signal\n\t\tRead the 0~3 channel which had detected radar signals\n\t\tPoll Status register\n\t\tSet BBP_R140=0x02 and Read BBP_R141 to store at channel\n\t*/\n\t//RTMP_DFS_IO_READ8(pAd, 0x2, &channel);\n\tRTMP_BBP_IO_READ32(pAd, DFS_R1, &channel);\n\n\tif (channel & pRadarDetect->EnabledChMask)\n\t{\n\t\tradarDeclared = DfsChannelCheck(pAd, channel & pRadarDetect->EnabledChMask);\n\t}\n\n\t/* reset the radar channel for new counting */\n\t//RTMP_DFS_IO_WRITE8(pAd, 0x2, channel);\n\tRTMP_BBP_IO_WRITE32(pAd, DFS_R1, channel);\n\n\n\tif (pRadarDetect->McuRadarDebug & RADAR_SIMULATE)\n\t{\n\t\tradarDeclared = 1;\n\t\tpRadarDetect->McuRadarDebug &= ~RADAR_SIMULATE;\n\t}\n\n\t/* Now, find an Radar signal */\n\tif (radarDeclared || pRadarDetect->radarDeclared)\n\t{\t\t\n\t\t/* \n\t\t  Radar found!!!\n\t\t  Announce that this channel could not use in 30 minutes if we need find a clear channel\n\t\t*/\n\t\tif (!(pRadarDetect->McuRadarDebug & RADAR_DONT_SWITCH))\n\t\t{\n\t\t\tChannelSelectOnRadarDetection(pAd);\n\t\t}\n\t\telse\n\t\t\tpRadarDetect->radarDeclared = 0;\t\t\t\n\n\t}\n}\n\nstatic VOID SwCheckDfsEventWithFw(\n\t\tIN PRTMP_ADAPTER pAd)\n{\n\tint k, NumEvent = 64; /* event number per event buffer */\n\tUCHAR id = 0;\n\tUCHAR BBPR127_Table[DFS_EVENT_BUFFER_SIZE];\n\tUCHAR BBPR127_OWERID;\n\tUCHAR OwenerIDValue = 0;\n\tUCHAR BBP127TableIdx = 0;\n\tDFS_EVENT DfsEvent;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;\t\n\n\t/*pRadarDetect->McuRadarTick = 0;*/\n\n\tfor (BBP127TableIdx = 0; BBP127TableIdx < 6; BBP127TableIdx++)\n\t{\n\t\tRTUSBMultiRead(pAd, BBPR127TABLE_OWNERID + BBP127TableIdx, &BBPR127_OWERID, 1);\n\n\t\tif (BBPR127_OWERID == 1)\n\t\t\tcontinue;\n\n\t\tNdisZeroMemory(BBPR127_Table, DFS_EVENT_BUFFER_SIZE);\n\t\tRTUSBMultiRead(pAd, BBPR127TABLE_OFFSET + (BBP127TableIdx * 512), BBPR127_Table, DFS_EVENT_BUFFER_SIZE);\n\n\t\tOwenerIDValue = 0x01;\n\t\tRTUSBMultiWrite_OneByte(pAd, BBPR127TABLE_OWNERID + BBP127TableIdx, &OwenerIDValue);\n\n\t\tpDfsSwParam->dfs_w_counter++;\n\n\t\tif (pRadarDetect->McuRadarDebug & RADAR_DEBUG_SHOW_RAW_EVENT)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"\\n=============0x%02x==============\\n\", BBP127TableIdx));\n\t\t\tif (IS_RT3572(pAd))\n\t\t\t{\n\t\t\t\tDFS_EVENT_BUFF_PRINT(1, BBPR127_Table, DFS_EVENT_BUFFER_SIZE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDFS_EVENT_BUFF_PRINT(0, BBPR127_Table, DFS_EVENT_BUFFER_SIZE);\n\t\t\t}\n\t\t}\n\n\t\tfor (k = 0; k < NumEvent; k++)\n\t\t{\n\t\t\tPUCHAR pTableOffset = NULL; \n\t\t\tif (IS_RT3572(pAd))\n\t\t\t{\n\t\t\t\tpTableOffset = (BBPR127_Table+1) + (DFS_EVENT_SIZE*k);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpTableOffset = BBPR127_Table + (DFS_EVENT_SIZE*k);\n\t\t\t}\n\n\t\t\tif (DfsEventDataFetch(pAd, pTableOffset, &DfsEvent) == FALSE)\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tif (DfsEventDrop(pAd, &DfsEvent) == TRUE)\n\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\tif (pRadarDetect->use_tasklet)\n\t\t\t{\n\t\t\t\tid = DfsEvent.EngineId;\n\n\t\t\t\tif (id < pAd->chipCap.DfsEngineNum)\n\t\t\t\t{\n\t\t\t\t\t/*if (DfsEvent.TimeStamp != pDfsSwParam->DFS_W[id][((pDfsSwParam->dfs_w_idx[id] == 0)? (NEW_DFS_DBG_PORT_ENT_NUM-1):(pDfsSwParam->dfs_w_idx[id] - 1))].timestamp)*/\n\t\t\t\t\t{\n\t\t\t\t\t\tpDfsSwParam->DFS_W[id][pDfsSwParam->dfs_w_idx[id]].counter = pDfsSwParam->dfs_w_counter;\n\t\t\t\t\t\tpDfsSwParam->DFS_W[id][pDfsSwParam->dfs_w_idx[id]].timestamp = DfsEvent.TimeStamp;\n\t\t\t\t\t\tpDfsSwParam->DFS_W[id][pDfsSwParam->dfs_w_idx[id]].width = DfsEvent.Width;\n\n\t\t\t\t\t\tif (pRadarDetect->McuRadarDebug & RADAR_DEBUG_EVENT)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprintk(\"counter = %lu \", pDfsSwParam->dfs_w_counter);\n\t\t\t\t\t\t\tDFS_EVENT_PRINT(DfsEvent);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tpDfsSwParam->dfs_w_last_idx[id] = pDfsSwParam->dfs_w_idx[id];\n\t\t\t\t\t\tpDfsSwParam->dfs_w_idx[id]++;\n\n\t\t\t\t\t\tif (pDfsSwParam->dfs_w_idx[id] >= NEW_DFS_DBG_PORT_ENT_NUM)\n\t\t\t\t\t\t\tpDfsSwParam->dfs_w_idx[id] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (pRadarDetect->use_tasklet)\n\t\t{\n\t\t\t/* set hw_idx*/\n\t\t\tpDfsSwParam->hw_idx[0] = pDfsSwParam->dfs_w_idx[0];\n\t\t\tpDfsSwParam->hw_idx[1] = pDfsSwParam->dfs_w_idx[1];\n\t\t\tpDfsSwParam->hw_idx[2] = pDfsSwParam->dfs_w_idx[2];\n\t\t\tpDfsSwParam->hw_idx[3] = pDfsSwParam->dfs_w_idx[3];\n\n\t\t\t/*dfs tasklet will call SWRadarCheck*/\n\t\t\tschedule_dfs_task(pAd);\n\t\t}\n\t}\n}\n\nvoid schedule_dfs_task(PRTMP_ADAPTER pAd)\n{\n\tPOS_COOKIE pObj;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;\n\t\n    pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif (pRadarDetect->DFSAPRestart == 1)\n\t{\n\t\tint i, j;\n\n\t\tpDfsSwParam->dfs_w_counter += 10;\n\t\t/* reset period table */\n\t\tfor (i = 0; i < pAd->chipCap.DfsEngineNum; i++)\n\t\t{\n\t\t\tfor (j = 0; j < NEW_DFS_MPERIOD_ENT_NUM; j++)\n\t\t\t{\n\t\t\t\tpDfsSwParam->DFS_T[i][j].period = 0;\n\t\t\t\tpDfsSwParam->DFS_T[i][j].idx = 0;\n\t\t\t\tpDfsSwParam->DFS_T[i][j].idx2 = 0;\n\t\t\t}\n\t\t}\n\n\t\tAPStop(pAd);\n\t\tAPStartUp(pAd);\n\t\tRTMP_BBP_IO_WRITE32(pAd, DFS_R0, (pRadarDetect->EnabledChMask << 16)); /* re-enable DFS engine */\n\t\t//RTMP_DFS_IO_WRITE8(pAd, pRadarDetect->EnabledChMask, 1); /* re-enable DFS engine */\n\t\tpRadarDetect->DFSAPRestart = 0;\n\t}\n\telse\n\t{\n\t\t/*s/w check radar event buffer*/\n\t\tint idx;\n\t\tif (pRadarDetect->radarDeclared == 0)\n\t\t{\n\t\t\tfor (idx = 0; idx < 4; idx++)\n\t\t\t{\n\t\t\t\tif (SWRadarCheck(pAd, idx) == 1)\n\t\t\t\t{\n\t\t\t\t\t//radar signals found\n\t\t\t\t\tpRadarDetect->radarDeclared = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /* RTMP_MAC_USB */\n#endif /*CONFIG_AP_SUPPORT*/\n#endif /* DFS_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_info.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tcmm_info.c\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n \n#include\t\"rt_config.h\"\n\n\n\n/*\n    ==========================================================================\n    Description:\n        Get Driver version.\n\n    Return:\n    ==========================================================================\n*/\nINT Set_DriverVersion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Driver version-%s\\n\", AP_DRIVER_VERSION));\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Driver version-%s\\n\", STA_DRIVER_VERSION));\n#endif /* CONFIG_STA_SUPPORT */\n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Country Region.\n        This command will not work, if the field of CountryRegion in eeprom is programmed.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_CountryRegion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint retval;\n\t\n#ifdef EXT_BUILD_CHANNEL_LIST\n\treturn -EOPNOTSUPP;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\tretval = RT_CfgSetCountryRegion(pAd, arg, BAND_24G);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\t\n\t/* if set country region, driver needs to be reset*/\n\tBuildChannelList(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryRegion_Proc::(CountryRegion=%d)\\n\", pAd->CommonCfg.CountryRegion));\n\t\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Country Region for A band.\n        This command will not work, if the field of CountryRegion in eeprom is programmed.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_CountryRegionABand_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint retval;\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\treturn -EOPNOTSUPP;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\tretval = RT_CfgSetCountryRegion(pAd, arg, BAND_5G);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\n\t/* if set country region, driver needs to be reset*/\n\tBuildChannelList(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryRegionABand_Proc::(CountryRegion=%d)\\n\", pAd->CommonCfg.CountryRegionForABand));\n\t\n\treturn TRUE;\n}\n\n\nINT\tSet_Cmm_WirelessMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ,\n\tIN\tBOOLEAN\t\t\tFlgIsDiffMbssModeUsed)\n{\n\tINT\tsuccess = TRUE;\n#ifdef CONFIG_AP_SUPPORT\n\tUINT32 i = 0;\n#ifdef MBSS_SUPPORT\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif (FlgIsDiffMbssModeUsed) {\n\t\tLONG cfg_mode = simple_strtol(arg, 0, 10);\n\t\t\n\t\t/* assign wireless mode for the BSS */\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].PhyMode = \n\t\t\t\t\tcfgmode_2_wmode((UCHAR)cfg_mode);\n\n\t\t/*\n\t\t\tIf the band is different with other BSS, we will correct it in\n\t\t\tRT_CfgSetMbssWirelessMode()\n\t\t*/\n\t\tsuccess = RT_CfgSetMbssWirelessMode(pAd, arg);\n\t}\n\telse\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\tsuccess = RT_CfgSetWirelessMode(pAd, arg);\n\n\tif (success)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* recover Wmm Capable for \"each\" BSS */\n\t\t\t/* all phy mode of MBSS are the same */\n\t\t\tfor(i=0; i<pAd->ApCfg.BssidNum; i++)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].bWmmCapable = \\\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].bWmmCapableOrg;\n\n#ifdef MBSS_SUPPORT\n\t\t\t\t/* In Same-MBSS Mode, all phy modes are the same */\n\t\t\t\tif (FlgIsDiffMbssModeUsed == 0)\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].PhyMode = pAd->CommonCfg.PhyMode;\n#endif /* MBSS_SUPPORT */\n\t\t\t}\n\n\t\t\tRTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\t/* clean up previous SCAN result */\n\t\t\tBssTableInit(&pAd->ScanTab);\n\t\t\tpAd->StaCfg.LastScanTime = 0;\n\t\t\t\n\t\t\tRTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode);\n\t\t\t/* Set AdhocMode rates*/\n\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t{\n\t\t\t\tMlmeUpdateTxRates(pAd, FALSE, 0);\n\t\t\t\tMakeIbssBeacon(pAd);           /* re-build BEACON frame*/\n\t\t\t\tAsicEnableIbssSync(pAd);       /* copy to on-chip memory*/\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_Cmm_WirelessMode_Proc::(=%d)\\n\", pAd->CommonCfg.PhyMode));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_Cmm_WirelessMode_Proc::(BSS%d=%d)\\n\",\n\t\t\t\tpObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].PhyMode));\n\n\t\tfor(i=0; i<pAd->ApCfg.BssidNum; i++)\n\t\t{\n\t\t\t/*\n\t\t\t\tWhen last mode is not 11B-only, new mode is 11B, we need to re-make\n\t\t\t\tbeacon frame content.\n\n\t\t\t\tBecause we put support rate/extend support rate element in\n\t\t\t\tAPMakeBssBeacon(), not APUpdateBeaconFrame().\n\t\t\t*/\n\t\t\tAPMakeBssBeacon(pAd, i);\n\t\t}\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_WirelessMode_Proc::parameters out of range\\n\"));\n\t}\n\t\n\treturn success;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set Wireless Mode for MBSS\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_MBSS_WirelessMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\treturn Set_Cmm_WirelessMode_Proc(pAd, arg, 1);\n}\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n/* \n    ==========================================================================\n    Description:\n        Set Wireless Mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_WirelessMode_Proc(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\treturn Set_Cmm_WirelessMode_Proc(pAd, arg, 0);\n}\n\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Channel\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_Channel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tINT\t\ti;\n#endif /* CONFIG_AP_SUPPORT */\n \tINT\t\tsuccess = TRUE;\n\tUCHAR\tChannel;\t\n\n\tChannel = (UCHAR) simple_strtol(arg, 0, 10);\n\n\t/* check if this channel is valid*/\n\tif (ChannelSanity(pAd, Channel) == TRUE)\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = Channel;\n\t\t\t/* Save the channel on MlmeAux for CntlOidRTBssidProc used. */\n\t\t\tpAd->MlmeAux.Channel = Channel;\n\n\t\t\tif (MONITOR_ON(pAd))\n\t\t\t{\n\t\t\t\tUCHAR rf_channel;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tN_ChannelCheck(pAd);\n\t\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t\t\trf_channel = N_SetCenCh(pAd, pAd->CommonCfg.Channel);\n\t\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\t\trf_channel = pAd->CommonCfg.Channel;\n\n\t\t\t\tAsicSwitchChannel(pAd, rf_channel, FALSE);\n\t\t\t\tAsicLockChannel(pAd, rf_channel);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): CtrlChannel(%d), CentralChannel(%d) \\n\", \n\t\t\t\t\t\t\t__FUNCTION__, pAd->CommonCfg.Channel,\n\t\t\t\t\t\t\tpAd->CommonCfg.CentralChannel));\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\tsuccess = TRUE;\n\t}\n\telse\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tChannel = FirstChannel(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"This channel is out of channel list, set as the first channel(%d) \\n \", Channel));\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tsuccess = FALSE;\n\t\tDBGPRINT(RT_DEBUG_WARN,(\"This channel is out of channel list, nothing to do!\\n \"));\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tif ((WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t\t\t&& (pAd->CommonCfg.bIEEE80211H == TRUE))\n\t\t{\n\t\t\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t\t\t{\n\t\t\t\tif (pAd->ChannelList[i].Channel == Channel)\n\t\t\t\t{\n\t\t\t\t\tif (pAd->ChannelList[i].RemainingTimeForUse > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: previous detection of a radar on this channel(Channel=%d)\\n\", Channel));\n\t\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"RemainingTimeForUse %d ,Channel %d\\n\",\n\t\t\t\t\t\t\t\tpAd->ChannelList[i].RemainingTimeForUse, Channel));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (success == TRUE)\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = Channel;\n#ifdef DOT11_N_SUPPORT\n\t\t\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tif ((pAd->CommonCfg.Channel > 14 )\n\t\t\t\t&& (pAd->CommonCfg.bIEEE80211H == TRUE))\n\t\t\t{\n\t\t\t\tif (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)\n\t\t\t\t{\n\t\t\t\t\tAPStop(pAd);\n\t\t\t\t\tAPStartUp(pAd);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tNotifyChSwAnnToPeerAPs(pAd, ZERO_MAC_ADDR, pAd->CurrentAddress, 1, pAd->CommonCfg.Channel);\n\t\t\t\t\tpAd->Dot11_H.RDMode = RD_SWITCHING_MODE;\n\t\t\t\t\tpAd->Dot11_H.CSCount = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAPStop(pAd);\n\t\t\t\tAPStartUp(pAd);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif (success == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_Channel_Proc::(Channel=%d)\\n\", pAd->CommonCfg.Channel));\n\n\treturn success;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Short Slot Time Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ShortSlot_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint retval;\n\t\n\tretval = RT_CfgSetShortSlot(pAd, arg);\n\tif (retval == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ShortSlot_Proc::(ShortSlot=%d)\\n\", pAd->CommonCfg.bUseShortSlotTime));\n\n\treturn retval;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Tx power\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_TxPower_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tLONG TxPower;\n\tINT   success = FALSE;\n\n\tTxPower = simple_strtol(arg, 0, 10);\n\tif (TxPower <= 100)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tpAd->CommonCfg.TxPowerPercentage = TxPower;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpAd->CommonCfg.TxPowerDefault = TxPower;\n\t\t\tpAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\tsuccess = TRUE;\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_TxPower_Proc::(TxPowerPercentage=%ld)\\n\", pAd->CommonCfg.TxPowerPercentage));\n\n\treturn success;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set 11B/11G Protection\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_BGProtection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tswitch (simple_strtol(arg, 0, 10))\n\t{\n\t\tcase 0: /*AUTO*/\n\t\t\tpAd->CommonCfg.UseBGProtection = 0;\n\t\t\tbreak;\n\t\tcase 1: /*Always On*/\n\t\t\tpAd->CommonCfg.UseBGProtection = 1;\n\t\t\tbreak;\n\t\tcase 2: /*Always OFF*/\n\t\t\tpAd->CommonCfg.UseBGProtection = 2;\n\t\t\tbreak;\t\t\n\t\tdefault:  /*Invalid argument */\n\t\t\treturn FALSE;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAPUpdateCapabilityAndErpIe(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_BGProtection_Proc::(BGProtection=%ld)\\n\", pAd->CommonCfg.UseBGProtection));\t\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set TxPreamble\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_TxPreamble_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tRT_802_11_PREAMBLE\tPreamble;\n\n\tPreamble = (RT_802_11_PREAMBLE)simple_strtol(arg, 0, 10);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\tif (Preamble == Rt802_11PreambleAuto)\n\t\treturn FALSE;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tswitch (Preamble)\n\t{\n\t\tcase Rt802_11PreambleShort:\n\t\t\tpAd->CommonCfg.TxPreamble = Preamble;\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tMlmeSetTxPreamble(pAd, Rt802_11PreambleShort);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tbreak;\n\t\tcase Rt802_11PreambleLong:\n#ifdef CONFIG_STA_SUPPORT\n\t\tcase Rt802_11PreambleAuto:\n\t\t\t/* \n\t\t\t\tIf user wants AUTO, initialize to LONG here, then change according to AP's\n\t\t\t\tcapability upon association\n\t\t\t*/\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tpAd->CommonCfg.TxPreamble = Preamble;\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tMlmeSetTxPreamble(pAd, Rt802_11PreambleLong);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tbreak;\n\t\tdefault: /*Invalid argument */\n\t\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_TxPreamble_Proc::(TxPreamble=%ld)\\n\", pAd->CommonCfg.TxPreamble));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set RTS Threshold\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_RTSThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t NDIS_802_11_RTS_THRESHOLD           RtsThresh;\n\n\tRtsThresh = simple_strtol(arg, 0, 10);\n\n\tif((RtsThresh > 0) && (RtsThresh <= MAX_RTS_THRESHOLD))\n\t\tpAd->CommonCfg.RtsThreshold  = (USHORT)RtsThresh;\n#ifdef CONFIG_STA_SUPPORT\n\telse if (RtsThresh == 0)\n\t\tpAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;\n#endif /* CONFIG_STA_SUPPORT */\n\telse\n\t\treturn FALSE; /*Invalid argument */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_RTSThreshold_Proc::(RTSThreshold=%d)\\n\", pAd->CommonCfg.RtsThreshold));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Fragment Threshold\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_FragThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t NDIS_802_11_FRAGMENTATION_THRESHOLD     FragThresh;\n\n\tFragThresh = simple_strtol(arg, 0, 10);\n\n\tif (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)\n\t{ \n\t\t/*Illegal FragThresh so we set it to default*/\n\t\tpAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;\n\t}\n\telse if (FragThresh % 2 == 1)\n\t{\n\t\t/*\n\t\t\tThe length of each fragment shall always be an even number of octets, \n\t\t\texcept for the last fragment of an MSDU or MMPDU, which may be either \n\t\t\tan even or an odd number of octets.\n\t\t*/\n\t\tpAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);\n\t}\n\telse\n\t{\n\t\tpAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;\n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pAd->CommonCfg.FragmentThreshold == MAX_FRAG_THRESHOLD)\n\t\t\tpAd->CommonCfg.bUseZeroToDisableFragment = TRUE;\n\t\telse\n\t\t\tpAd->CommonCfg.bUseZeroToDisableFragment = FALSE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_FragThreshold_Proc::(FragThreshold=%d)\\n\", pAd->CommonCfg.FragmentThreshold));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set TxBurst\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_TxBurst_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tLONG TxBurst;\n\n\tTxBurst = simple_strtol(arg, 0, 10);\n\tif (TxBurst == 1)\n\t\tpAd->CommonCfg.bEnableTxBurst = TRUE;\n\telse if (TxBurst == 0)\n\t\tpAd->CommonCfg.bEnableTxBurst = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_TxBurst_Proc::(TxBurst=%d)\\n\", pAd->CommonCfg.bEnableTxBurst));\n\n\treturn TRUE;\n}\n\n\n\n\n#ifdef AGGREGATION_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set TxBurst\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_PktAggregate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tLONG aggre;\n\n\taggre = simple_strtol(arg, 0, 10);\n\n\tif (aggre == 1)\n\t\tpAd->CommonCfg.bAggregationCapable = TRUE;\n\telse if (aggre == 0)\n\t\tpAd->CommonCfg.bAggregationCapable = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef PIGGYBACK_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tpAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;\n\t\tRTMPSetPiggyBack(pAd, pAd->CommonCfg.bPiggyBackCapable);\n\t}\n#endif /* PIGGYBACK_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_PktAggregate_Proc::(AGGRE=%d)\\n\", pAd->CommonCfg.bAggregationCapable));\n\n\treturn TRUE;\n}\n#endif\n\n\n#ifdef INF_PPA_SUPPORT\nINT\tSet_INF_AMAZON_SE_PPA_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPUCHAR\t\t\targ)\n{\n\tULONG aggre;\n\tUINT status;\n\t\n\taggre = simple_strtol(arg, 0, 10);\n\n\tif (aggre == 1)\n\t{\n\t\tif(pAd->PPAEnable==TRUE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INF_AMAZON_SE_PPA already enabled \\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (ppa_hook_directpath_register_dev_fn) \n\t\t\t{\n\t\t\t\tUINT32 g_if_id;\n\t\t\t\t\n\t\t\t\tif (pAd->pDirectpathCb == NULL) \n\t\t\t\t{\n/*\t\t\t\t\tpAd->pDirectpathCb = (PPA_DIRECTPATH_CB *) kmalloc (sizeof(PPA_DIRECTPATH_CB), GFP_ATOMIC);*/\n\t\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Realloc memory for  pDirectpathCb ??\\n\"));\n\t\t\t\t}\n\n\t\t\t\t/* register callback */\n\t\t\t\tpAd->pDirectpathCb->rx_fn = ifx_ra_start_xmit;\n\t\t\t\tpAd->pDirectpathCb->stop_tx_fn = NULL;\n\t\t\t\tpAd->pDirectpathCb->start_tx_fn = NULL;\n\n\t\t\t\tstatus = ppa_hook_directpath_register_dev_fn(&g_if_id, pAd->net_dev, pAd->pDirectpathCb, PPA_F_DIRECTPATH_REGISTER|PPA_F_DIRECTPATH_ETH_IF);\n\n\t\t\t\tif(status==IFX_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tpAd->g_if_id=g_if_id;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"register INF_AMAZON_SE_PPA success :ret:%d id:%d:%d\\n\",status,pAd->g_if_id,g_if_id));\n\t\t\t\t\tpAd->PPAEnable=TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"register INF_AMAZON_SE_PPA fail :ret:%d\\n\",status));\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INF_AMAZON_SE_PPA enable fail : there is no INF_AMAZON_SE_PPA module . \\n\"));\n\t\t\t}\n\t\t}\n\n\t\t\n\t}\n\telse if (aggre == 0)\n\t{\n\t\tif(pAd->PPAEnable==FALSE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INF_AMAZON_SE_PPA already disable \\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (ppa_hook_directpath_register_dev_fn) \n\t\t\t{\n\t\t\t\tUINT32 g_if_id;\n\t\t\t\tg_if_id=pAd->g_if_id;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"g_if_id=%d \\n\",pAd->g_if_id));\n\t\t\t\tstatus=ppa_hook_directpath_register_dev_fn(&g_if_id, pAd->net_dev, NULL, 0/*PPA_F_DIRECTPATH_REGISTER*/);\n\n\t\t\t\tif(status==1)\n\t\t\t\t{\n\t\t\t\t\tpAd->g_if_id=0;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"unregister INF_AMAZON_SE_PPA success :ret:%d\\n\",status));\n\t\t\t\t\tpAd->PPAEnable=FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"unregister INF_AMAZON_SE_PPA fail :ret:%d\\n\",status));\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INF_AMAZON_SE_PPA enable fail : there is no INF_AMAZON_SE_PPA module . \\n\"));\n\t\t\t}\n\t\t}\n\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Invalid argument %d \\n\",aggre));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\t\n\n\treturn TRUE;\n\n}\n#endif /* INF_PPA_SUPPORT */\n\n\n/* \n    ==========================================================================\n    Description:\n        Set IEEE80211H.\n        This parameter is 1 when needs radar detection, otherwise 0\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_IEEE80211H_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    LONG ieee80211h;\n\n\tieee80211h = simple_strtol(arg, 0, 10);\n\n\tif (ieee80211h == 1)\n\t\tpAd->CommonCfg.bIEEE80211H = TRUE;\n\telse if (ieee80211h == 0)\n\t\tpAd->CommonCfg.bIEEE80211H = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_IEEE80211H_Proc::(IEEE80211H=%d)\\n\", pAd->CommonCfg.bIEEE80211H));\n\n\treturn TRUE;\n}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n/* \n    ==========================================================================\n    Description:\n        Set Country Code.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_ExtCountryCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s can only be used when interface is down.\\n\", __FUNCTION__));\n\t\treturn TRUE;\n\t}\n\t\n\tif(strlen(arg) == 2)\n\t{\n\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, arg, 2);\n\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\t}\n\telse\n\t{\n\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\tpAd->CommonCfg.bCountryFlag = FALSE;\n\t}\t\n\n\t{\t\n\t\tUCHAR CountryCode[3] = {0};\n\t\tNdisMoveMemory(CountryCode, pAd->CommonCfg.CountryCode, 2);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryCode_Proc::(bCountryFlag=%d, CountryCode=%s)\\n\",\n\t\t\t\t\t\t\tpAd->CommonCfg.bCountryFlag,\n\t\t\t\t\t\t\tCountryCode));\n\t}\n\treturn TRUE;\n}\n/* \n    ==========================================================================\n    Description:\n        Set Ext DFS Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_ExtDfsType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t*pDfsType = &pAd->CommonCfg.DfsType;\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s can only be used when interface is down.\\n\", __FUNCTION__));\n\t\treturn TRUE;\n\t}\n\n\tif (!strcmp(arg, \"CE\"))\n\t\t*pDfsType = CE;\n\telse if (!strcmp(arg, \"FCC\"))\n\t\t*pDfsType = FCC;\n\telse if (!strcmp(arg, \"JAP\"))\n\t\t*pDfsType = JAP;\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Unsupported DFS type:%s (Legal types are: CE, FCC, JAP)\\n\", arg));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Add new channel list\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_ChannelListAdd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tCH_DESP\t\tinChDesp;\n\tPCH_REGION pChRegion = NULL;\n\t\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s can only be used when interface is down.\\n\", __FUNCTION__));\n\t\treturn TRUE;\n\t}\n\n\t/* Get Channel Region (CountryCode)*/\n\t{\n\t\tINT loop = 0;\n\n\t\twhile (strcmp((PSTRING) ChRegion[loop].CountReg, \"\") != 0)\n\t\t{\n\t\t\tif (strncmp((PSTRING) ChRegion[loop].CountReg, pAd->CommonCfg.CountryCode, 2) == 0)\n\t\t\t{\n\t\t\t\tpChRegion = &ChRegion[loop];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tloop++;\n\t\t}\n\t\tif (pChRegion == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CountryCode is not configured or not valid\\n\"));\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\t/* Parsing the arg, IN:arg; OUT:inChRegion */\n\t{\n\t\tUCHAR strBuff[64], count = 0;\n\t\tPUCHAR\tpStart, pEnd, tempIdx, tempBuff[5];\n\t\t\n\t\tif (strlen(arg) <64)\n\t\t\tNdisCopyMemory(strBuff, arg, strlen(arg));\n\n\t\tif ((pStart = rtstrchr(strBuff, '[')) != NULL)\n\t\t{\n\t\t\tif ((pEnd = rtstrchr(pStart++, ']')) != NULL)\n\t\t\t{\n\t\t\t\ttempBuff[count++] = pStart;\n\t\t\t\tfor(tempIdx = pStart ;tempIdx != pEnd; tempIdx++)\n\t\t\t\t{\n\t\t\t\t\tif(*tempIdx == ',')\n\t\t\t\t\t{\n\t\t\t\t\t\t*tempIdx = '\\0';\n\t\t\t\t\t\ttempBuff[count++] = ++tempIdx;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t*(pEnd) = '\\0';\n\n\t\t\t\tif (count != 5)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Input Error. Too more or too less parameters.\\n\"));\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tinChDesp.FirstChannel = (UCHAR) simple_strtol(tempBuff[0], 0, 10);\n\t\t\t\t\tinChDesp.NumOfCh = (UCHAR) simple_strtol(tempBuff[1], 0, 10);\n\t\t\t\t\tinChDesp.MaxTxPwr = (UCHAR) simple_strtol(tempBuff[2], 0, 10);\n\t\t\t\t\tinChDesp.Geography = (!strcmp(tempBuff[3], \"BOTH\") ? BOTH: (!strcmp(tempBuff[3], \"IDOR\") ? IDOR : ODOR));\n\t\t\t\t\tinChDesp.DfsReq= (!strcmp(tempBuff[4], \"TRUE\") ? TRUE : FALSE);\n\t\t\t\t} \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Missing End \\\"]\\\"\\n\"));\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Invalid input format.\\n\", __FUNCTION__));\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\t/* Add entry to Channel List*/\n\t{\n\t\tUCHAR EntryIdx;\n\t\tPCH_DESP pChDesp = NULL;\n\t\tUCHAR CountryCode[3] = {0};\n\t\tif (pAd->CommonCfg.pChDesp == NULL)\n\t\t{\t\t\t\n\t\t\tos_alloc_mem(pAd,  &pAd->CommonCfg.pChDesp, MAX_PRECONFIG_DESP_ENTRY_SIZE*sizeof(CH_DESP));\n\t\t\tpChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\t\t\tif (pChDesp)\n\t\t\t{\n\t\t\t\tfor (EntryIdx= 0; pChRegion->pChDesp[EntryIdx].FirstChannel != 0; EntryIdx++)\n\t\t\t\t{\t\n\t\t\t\t\tif (EntryIdx == (MAX_PRECONFIG_DESP_ENTRY_SIZE-2)) /* Keep an NULL entry in the end of table*/\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Table is full.\\n\"));\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\t\t\t\t\tNdisCopyMemory(&pChDesp[EntryIdx], &pChRegion->pChDesp[EntryIdx], sizeof(CH_DESP));\n\t\t\t\t}\n\t\t\t\t/* Copy the NULL entry*/\n\t\t\t\tNdisCopyMemory(&pChDesp[EntryIdx], &pChRegion->pChDesp[EntryIdx], sizeof(CH_DESP));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"os_alloc_mem failded.\\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\t\n\t\t\tpChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\t\t\tfor (EntryIdx= 0; pChDesp[EntryIdx].FirstChannel != 0; EntryIdx++)\n\t\t\t{\t\n\t\t\t\tif(EntryIdx ==  (MAX_PRECONFIG_DESP_ENTRY_SIZE-2)) /* Keep an NULL entry in the end of table*/\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Table is full.\\n\"));\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\t\t\n\t\tNdisMoveMemory(CountryCode, pAd->CommonCfg.CountryCode, 2);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Add channel lists {%u, %u, %u, %s, %s} to %s.\\n\",\n\t\t\t\t\t\t\tinChDesp.FirstChannel,\n\t\t\t\t\t\t\tinChDesp.NumOfCh,\n\t\t\t\t\t\t\tinChDesp.MaxTxPwr,\n\t\t\t\t\t\t\t(inChDesp.Geography == BOTH) ? \"BOTH\" : (inChDesp.Geography == IDOR) ?  \"IDOR\" : \"ODOR\",\n\t\t\t\t\t\t\t(inChDesp.DfsReq == TRUE) ? \"TRUE\" : \"FALSE\",\n\t\t\t\t\t\t\tCountryCode));\n\t\tNdisCopyMemory(&pChDesp[EntryIdx], &inChDesp, sizeof(CH_DESP));\n\t\tpChDesp[++EntryIdx].FirstChannel = 0; \n\t}\n\treturn TRUE;\n}\n\nINT Set_ChannelListShow_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPCH_REGION\tpChRegion = NULL;\n\tUCHAR\t\tEntryIdx, CountryCode[3]={0};\n\t\n\t/* Get Channel Region (CountryCode)*/\n\t{\n\t\tINT loop = 0;\n\n\t\twhile (strcmp((PSTRING) ChRegion[loop].CountReg, \"\") != 0)\n\t\t{\n\t\t\tif (strncmp((PSTRING) ChRegion[loop].CountReg, pAd->CommonCfg.CountryCode, 2) == 0)\n\t\t\t{\n\t\t\t\tpChRegion = &ChRegion[loop];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tloop++;\n\t\t}\n\t\tif (pChRegion == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CountryCode is not configured or not valid\\n\"));\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\tNdisMoveMemory(CountryCode, pAd->CommonCfg.CountryCode, 2);\n\tif (pAd->CommonCfg.DfsType == MAX_RD_REGION)\n\t\tpAd->CommonCfg.DfsType = pChRegion->DfsType;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"=========================================\\n\"));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"CountryCode:%s\\n\", CountryCode));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"DfsType:%s\\n\",\n\t\t\t\t\t(pAd->CommonCfg.DfsType == JAP) ? \"JAP\" :\n\t\t\t\t\t((pAd->CommonCfg.DfsType == FCC) ? \"FCC\" : \"CE\" )));\n\t\t\t\t\t\n\tif (pAd->CommonCfg.pChDesp != NULL)\n\t{\n\t\tPCH_DESP pChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\t\tfor (EntryIdx = 0; pChDesp[EntryIdx].FirstChannel != 0; EntryIdx++)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%u. {%3u, %2u, %2u, %s, %5s}.\\n\",\n\t\t\t\t\t\tEntryIdx,\n\t\t\t\t\t\tpChDesp[EntryIdx].FirstChannel,\n\t\t\t\t\t\tpChDesp[EntryIdx].NumOfCh,\n\t\t\t\t\t\tpChDesp[EntryIdx].MaxTxPwr,\n\t\t\t\t\t\t(pChDesp[EntryIdx].Geography == BOTH) ? \"BOTH\" : (pChDesp[EntryIdx].Geography == IDOR) ?  \"IDOR\" : \"ODOR\",\n\t\t\t\t\t\t(pChDesp[EntryIdx].DfsReq == TRUE) ? \"TRUE\" : \"FALSE\"));\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Default channel list table:\\n\"));\n\t\tfor (EntryIdx = 0; pChRegion->pChDesp[EntryIdx].FirstChannel != 0; EntryIdx++)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%u. {%3u, %2u, %2u, %s, %5s}.\\n\",\n\t\t\t\t\t\tEntryIdx,\n\t\t\t\t\t\tpChRegion->pChDesp[EntryIdx].FirstChannel,\n\t\t\t\t\t\tpChRegion->pChDesp[EntryIdx].NumOfCh,\n\t\t\t\t\t\tpChRegion->pChDesp[EntryIdx].MaxTxPwr,\n\t\t\t\t\t\t(pChRegion->pChDesp[EntryIdx].Geography == BOTH) ? \"BOTH\" : (pChRegion->pChDesp[EntryIdx].Geography == IDOR) ?  \"IDOR\" : \"ODOR\",\n\t\t\t\t\t\t(pChRegion->pChDesp[EntryIdx].DfsReq == TRUE) ? \"TRUE\" : \"FALSE\"));\n\t\t}\t\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\"=========================================\\n\"));\n\treturn TRUE;\n}\n\nINT Set_ChannelListDel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR EntryIdx, TargetIdx, NumOfEntry;\n\tPCH_REGION\tpChRegion = NULL;\n\tPCH_DESP pChDesp = NULL; \n\tTargetIdx = simple_strtol(arg, 0, 10);\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s can only be used when interface is down.\\n\", __FUNCTION__));\n\t\treturn TRUE;\n\t}\n\t\n\t/* Get Channel Region (CountryCode)*/\n\t{\n\t\tINT loop = 0;\n\t\twhile (strcmp((PSTRING) ChRegion[loop].CountReg, \"\") != 0)\n\t\t{\n\t\t\tif (strncmp((PSTRING) ChRegion[loop].CountReg, pAd->CommonCfg.CountryCode, 2) == 0)\n\t\t\t{\n\t\t\t\tpChRegion = &ChRegion[loop];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tloop++;\n\t\t}\n\t\tif (pChRegion == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CountryCode is not configured or not valid\\n\"));\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\tif (pAd->CommonCfg.pChDesp == NULL)\n\t{\n\t\tos_alloc_mem(pAd,  &pAd->CommonCfg.pChDesp, MAX_PRECONFIG_DESP_ENTRY_SIZE*sizeof(CH_DESP));\n\t\tif (pAd->CommonCfg.pChDesp)\n\t\t{\n\t\t\tpChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\t\t\tfor (EntryIdx= 0; pChRegion->pChDesp[EntryIdx].FirstChannel != 0; EntryIdx++)\n\t\t\t{\t\n\t\t\t\tif (EntryIdx == (MAX_PRECONFIG_DESP_ENTRY_SIZE-2)) /* Keep an NULL entry in the end of table*/\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Table is full.\\n\"));\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t\tNdisCopyMemory(&pChDesp[EntryIdx], &pChRegion->pChDesp[EntryIdx], sizeof(CH_DESP));\n\t\t\t}\n\t\t\t/* Copy the NULL entry*/\n\t\t\tNdisCopyMemory(&pChDesp[EntryIdx], &pChRegion->pChDesp[EntryIdx], sizeof(CH_DESP));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"os_alloc_mem failded.\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\telse\n\t\tpChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\t\t\n\tif (!strcmp(arg, \"default\"))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Default table used.\\n\" ));\n\t\tif (pAd->CommonCfg.pChDesp != NULL)\n\t\t\tos_free_mem(NULL, pAd->CommonCfg.pChDesp);\n\t\tpAd->CommonCfg.pChDesp = NULL;\n\t\tpAd->CommonCfg.DfsType = MAX_RD_REGION;\n\t}\n\telse if (!strcmp(arg, \"all\"))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Remove all entries.\\n\" ));\n\t\tfor (EntryIdx = 0; EntryIdx < MAX_PRECONFIG_DESP_ENTRY_SIZE; EntryIdx++)\n\t\t\tNdisZeroMemory(&pChDesp[EntryIdx], sizeof(CH_DESP));\n\t}\n\telse if (TargetIdx < (MAX_PRECONFIG_DESP_ENTRY_SIZE-1))\n\t{\n\t\tfor (EntryIdx= 0; pChDesp[EntryIdx].FirstChannel != 0; EntryIdx++)\n\t\t{\t\n\t\t\tif(EntryIdx ==  (MAX_PRECONFIG_DESP_ENTRY_SIZE-2)) /* Keep an NULL entry in the end of table */\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Last entry should be NULL.\\n\"));\n\t\t\t\tpChDesp[EntryIdx].FirstChannel = 0;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t\tNumOfEntry = EntryIdx;\n\t\tif (TargetIdx >= NumOfEntry)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Out of table range.\\n\"));\n\t\t\treturn TRUE;\n\t\t}\n\t\tfor (EntryIdx = TargetIdx; EntryIdx < NumOfEntry; EntryIdx++)\n\t\t\tNdisCopyMemory(&pChDesp[EntryIdx], &pChDesp[EntryIdx+1], sizeof(CH_DESP));\n\t\tNdisZeroMemory(&pChDesp[EntryIdx], sizeof(CH_DESP)); /*NULL entry*/\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Entry %u deleted.\\n\", TargetIdx));\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Entry not found.\\n\"));\n\t\n\treturn TRUE;\n}\n#endif /* EXT_BUILD_CHANNEL_LIST  */\n\n#ifdef WSC_INCLUDED\nINT\tSet_WscGenPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    PWSC_CTRL   pWscControl = NULL;\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t    apidx = pObj->ioctl_if;\n    \n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t    if (pObj->ioctl_if_type == INT_APCLI)\n\t    {\n\t        pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscGenPinCode_Proc:: This command is from apcli interface now.\\n\", apidx));\n\t    }\n\t    else\n#endif /* APCLI_SUPPORT */\n\t    {\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscGenPinCode_Proc:: This command is from ra interface now.\\n\", apidx));\n\t    }\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (pObj->ioctl_if_type == INT_P2P)\n\t{\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscGenPinCode_Proc:: This command is from apcli interface now.\\n\", apidx));\n\t\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (pObj->ioctl_if_type != INT_P2P)\n#endif /* P2P_SUPPORT */\n{\n    \tpWscControl = &pAd->StaCfg.WscControl;\n\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pWscControl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pWscControl == NULL!\\n\", __FUNCTION__));\n\t\treturn TRUE;\n\t}\n\n\tif (pWscControl->WscEnrollee4digitPinCode)\t\n\t{\n\t\tpWscControl->WscEnrolleePinCodeLen = 4;\n\t\tpWscControl->WscEnrolleePinCode = WscRandomGen4digitPinCode(pAd);\n\t}\n\telse\n\t{\n\t\tpWscControl->WscEnrolleePinCodeLen = 8;\n\t\tpWscControl->WscEnrolleePinCode = WscRandomGeneratePinCode(pAd, apidx);\n\t}\n\n#ifdef P2P_SUPPORT\n\tif (pObj->ioctl_if_type == INT_P2P)\t\n\t{\n\t\tPWSC_CTRL   pApWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\tpApWscControl->WscEnrolleePinCodeLen  = pWscControl->WscEnrolleePinCodeLen;\n\t\tpApWscControl->WscEnrolleePinCode  = pWscControl->WscEnrolleePinCode;\n\t}\n#endif /* P2P_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscGenPinCode_Proc:: Enrollee PinCode\\t\\t%08u\\n\", pWscControl->WscEnrolleePinCode));\n\n\treturn TRUE;\n}\n\nINT Set_WscVendorPinCode_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n\tPWSC_CTRL   pWscControl = NULL;\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR       apidx = pObj->ioctl_if;\n\n#ifdef CONFIG_AP_SUPPORT\n/*\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;*/\n/*\tUCHAR       apidx = pObj->ioctl_if;*/\n\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t{\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscVendorPinCode_Proc() for apcli(%d)\\n\", apidx));\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscVendorPinCode_Proc() for ra%d!\\n\", apidx));\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (pObj->ioctl_if_type == INT_P2P)\n\t{\n\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\tRT_CfgSetWscPinCode(pAd, arg, pWscControl);\n\n\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\tRT_CfgSetWscPinCode(pAd, arg, pWscControl);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscVendorPinCode_Proc() for p2p(%d)\\n\", apidx));\n\t\treturn TRUE;\n\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n \t{\n#ifdef P2P_SUPPORT\n\t\tif (pObj->ioctl_if_type != INT_P2P)\n#endif /* P2P_SUPPORT */\n \t\tpWscControl = &pAd->StaCfg.WscControl;\n \t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (!pWscControl)\n\t\treturn FALSE;\n\telse\n\treturn RT_CfgSetWscPinCode(pAd, arg, pWscControl);\n}\n#endif /* WSC_INCLUDED */\n\n#ifdef DBG\n/* \n    ==========================================================================\n    Description:\n        For Debug information\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_Debug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==>%s()\\n\", __FUNCTION__));\n\n    if(simple_strtol(arg, 0, 10) <= RT_DEBUG_LOUD)\n        RTDebugLevel = simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==%s(RTDebugLevel = %ld)\\n\",\n\t\t\t\t__FUNCTION__, RTDebugLevel));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        For DebugFunc information\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_DebugFunc_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg)\n{\n\tDBGPRINT_S(RT_DEBUG_TRACE, (\"==>%s()\\n\", __FUNCTION__));\n\tRTDebugFunc = simple_strtol(arg, 0, 10);\n\tDBGPRINT_S(RT_DEBUG_TRACE, (\"Set RTDebugFunc = 0x%x\\n\",__FUNCTION__, RTDebugFunc));\n\n\treturn TRUE;\n}\n#endif\n\n\nINT\tShow_DescInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Reset statistics counter\n\n    Arguments:\n        pAd            Pointer to our adapter\n        arg                 \n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ResetStatCounter_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t/*UCHAR           i;*/\n\t/*MAC_TABLE_ENTRY *pEntry;*/\n    \n\tDBGPRINT(RT_DEBUG_TRACE, (\"==>Set_ResetStatCounter_Proc\\n\"));\n\n\t/* add the most up-to-date h/w raw counters into software counters*/\n\tNICUpdateRawCounters(pAd);\n    \n\tNdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));\n\tNdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));\n\tNdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t{\n\t\tint i;\n\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\tNdisZeroMemory(&pAd->MacTab.Content[i].TxBFCounters, sizeof(pAd->MacTab.Content[i].TxBFCounters));\n\t}\n#endif /* TXBF_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nBOOLEAN RTMPCheckStrPrintAble(\n    IN  CHAR *pInPutStr, \n    IN  UCHAR strLen)\n{\n    UCHAR i=0;\n    \n    for (i=0; i<strLen; i++)\n    {\n        if ((pInPutStr[i] < 0x20) ||\n            (pInPutStr[i] > 0x7E))\n            return FALSE;\n    }\n    \n    return TRUE;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRemove WPA Key process\n\n\tArguments:\n\t\tpAd \t\t\t\t\tPointer to our adapter\n\t\tpBuf\t\t\t\t\t\t\tPointer to the where the key stored\n\n\tReturn Value:\n\t\tNDIS_SUCCESS\t\t\t\t\tAdd key successfully\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\n#ifdef CONFIG_STA_SUPPORT\nVOID    RTMPSetDesiredRates(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  LONG            Rates)\n{\n    NDIS_802_11_RATES aryRates;\n\n    memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));\n    switch (pAdapter->CommonCfg.PhyMode)\n    {\n        case (WMODE_A): /* A only*/\n            switch (Rates)\n            {\n                case 6000000: /*6M*/\n                    aryRates[0] = 0x0c; /* 6M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;\n                    break;\n                case 9000000: /*9M*/\n                    aryRates[0] = 0x12; /* 9M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;\n                    break;\n                case 12000000: /*12M*/\n                    aryRates[0] = 0x18; /* 12M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;\n                    break;\n                case 18000000: /*18M*/\n                    aryRates[0] = 0x24; /* 18M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;\n                    break;\n                case 24000000: /*24M*/\n                    aryRates[0] = 0x30; /* 24M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;\n                    break;\n                case 36000000: /*36M*/\n                    aryRates[0] = 0x48; /* 36M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;\n                    break;\n                case 48000000: /*48M*/\n                    aryRates[0] = 0x60; /* 48M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;\n                    break;\n                case 54000000: /*54M*/\n                    aryRates[0] = 0x6c; /* 54M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;\n                    break;\n                case -1: /*Auto*/\n                default:\n                    aryRates[0] = 0x6c; /* 54Mbps*/\n                    aryRates[1] = 0x60; /* 48Mbps*/\n                    aryRates[2] = 0x48; /* 36Mbps*/\n                    aryRates[3] = 0x30; /* 24Mbps*/\n                    aryRates[4] = 0x24; /* 18M*/\n                    aryRates[5] = 0x18; /* 12M*/\n                    aryRates[6] = 0x12; /* 9M*/\n                    aryRates[7] = 0x0c; /* 6M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;\n                    break;\n            }\n            break;\n        case (WMODE_B | WMODE_G): /* B/G Mixed*/\n        case (WMODE_B): /* B only*/\n        case (WMODE_A | WMODE_B | WMODE_G): /* A/B/G Mixed*/\n        default:\n            switch (Rates)\n            {\n                case 1000000: /*1M*/\n                    aryRates[0] = 0x02;\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;\n                    break;\n                case 2000000: /*2M*/\n                    aryRates[0] = 0x04;\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;\n                    break;\n                case 5000000: /*5.5M*/\n                    aryRates[0] = 0x0b; /* 5.5M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;\n                    break;\n                case 11000000: /*11M*/\n                    aryRates[0] = 0x16; /* 11M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;\n                    break;\n                case 6000000: /*6M*/\n                    aryRates[0] = 0x0c; /* 6M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;\n                    break;\n                case 9000000: /*9M*/\n                    aryRates[0] = 0x12; /* 9M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;\n                    break;\n                case 12000000: /*12M*/\n                    aryRates[0] = 0x18; /* 12M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;\n                    break;\n                case 18000000: /*18M*/\n                    aryRates[0] = 0x24; /* 18M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;\n                    break;\n                case 24000000: /*24M*/\n                    aryRates[0] = 0x30; /* 24M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;\n                    break;\n                case 36000000: /*36M*/\n                    aryRates[0] = 0x48; /* 36M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;\n                    break;\n                case 48000000: /*48M*/\n                    aryRates[0] = 0x60; /* 48M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;\n                    break;\n                case 54000000: /*54M*/\n                    aryRates[0] = 0x6c; /* 54M*/\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;\n                    break;\n                case -1: /*Auto*/\n                default:\n                    if (pAdapter->CommonCfg.PhyMode == WMODE_B)\n                    { /*B Only*/\n                        aryRates[0] = 0x16; /* 11Mbps*/\n                        aryRates[1] = 0x0b; /* 5.5Mbps*/\n                        aryRates[2] = 0x04; /* 2Mbps*/\n                        aryRates[3] = 0x02; /* 1Mbps*/\n                    }\n                    else\n                    { /*(B/G) Mixed or (A/B/G) Mixed*/\n                        aryRates[0] = 0x6c; /* 54Mbps*/\n                        aryRates[1] = 0x60; /* 48Mbps*/\n                        aryRates[2] = 0x48; /* 36Mbps*/\n                        aryRates[3] = 0x30; /* 24Mbps*/\n                        aryRates[4] = 0x16; /* 11Mbps*/\n                        aryRates[5] = 0x0b; /* 5.5Mbps*/\n                        aryRates[6] = 0x04; /* 2Mbps*/\n                        aryRates[7] = 0x02; /* 1Mbps*/\n                    }\n                    pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;\n                    break;\n            }\n            break;\n    }\n\n    NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);\n    NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));\n    DBGPRINT(RT_DEBUG_TRACE, (\" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\\n\",\n        pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1],\n        pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3],\n        pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5],\n        pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] ));\n    /* Changing DesiredRate may affect the MAX TX rate we used to TX frames out*/\n    MlmeUpdateTxRates(pAdapter, FALSE, 0);\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_WPA_SUPPLICANT_SUPPORT)\nNDIS_STATUS RTMPWPARemoveKeyProc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPVOID\t\t\tpBuf)\n{\n\tPNDIS_802_11_REMOVE_KEY pKey;\n\tULONG\t\t\t\t\tKeyIdx;\n\tNDIS_STATUS \t\t\tStatus = NDIS_STATUS_FAILURE;\n\tBOOLEAN \tbTxKey; \t\t/* Set the key as transmit key*/\n\tBOOLEAN \tbPairwise;\t\t/* Indicate the key is pairwise key*/\n\tBOOLEAN \tbKeyRSC;\t\t/* indicate the receive  SC set by KeyRSC value.*/\n\t\t\t\t\t\t\t\t/* Otherwise, it will set by the NIC.*/\n\tBOOLEAN \tbAuthenticator; /* indicate key is set by authenticator.*/\n\tINT \t\ti;\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn=FALSE;\n\tINT \t\tidx, BssIdx;\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\tDBGPRINT(RT_DEBUG_TRACE,(\"---> RTMPWPARemoveKeyProc\\n\"));\n\t\n\tpKey = (PNDIS_802_11_REMOVE_KEY) pBuf;\n\tKeyIdx = pKey->KeyIndex & 0xff;\n\t/* Bit 31 of Add-key, Tx Key*/\n\tbTxKey\t\t   = (pKey->KeyIndex & 0x80000000) ? TRUE : FALSE;\n\t/* Bit 30 of Add-key PairwiseKey*/\n\tbPairwise\t   = (pKey->KeyIndex & 0x40000000) ? TRUE : FALSE;\n\t/* Bit 29 of Add-key KeyRSC*/\n\tbKeyRSC \t   = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE;\n\t/* Bit 28 of Add-key Authenticator*/\n\tbAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE;\n\n\t/* 1. If bTx is TRUE, return failure information*/\n\tif (bTxKey == TRUE)\n\t\treturn(NDIS_STATUS_INVALID_DATA);\n\n\t/* 2. Check Pairwise Key*/\n\tif (bPairwise)\n\t{\n\t\t/* a. If BSSID is broadcast, remove all pairwise keys.*/\n\t\t/* b. If not broadcast, remove the pairwise specified by BSSID*/\n\t\tfor (i = 0; i < SHARE_KEY_NUM; i++)\n\t\t{\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t\t{\n\t\t\t\t/*if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].SharedKey[i].BssId, pKey->BSSID)) */\n\t\t\t\t{\n\t\t\t\t\tifIndex = pObj->ioctl_if;\n\t\t\t\t\tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"APCLI RTMPWPARemoveKeyProc(KeyIdx=%d)\\n\", i));\n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].SharedKey[i].KeyLen = 0;\n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].SharedKey[i].CipherAlg = CIPHER_NONE;\n\t\t\t\t\tAsicRemoveSharedKeyEntry(pAd, BssIdx, (UCHAR)i);\n\t\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\t\t\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (MAC_ADDR_EQUAL(pAd->SharedKey[BSS0][i].BssId, pKey->BSSID))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"RTMPWPARemoveKeyProc(KeyIdx=%d)\\n\", i));\n\t\t\t\t\tpAd->SharedKey[BSS0][i].KeyLen = 0;\n\t\t\t\t\tpAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE;\n\t\t\t\t\tAsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)i);\n\t\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif/*CONFIG_STA_SUPPORT*/\n\t\t\t}\n\t\t}\n\t}\n\t/* 3. Group Key*/\n\telse\n\t{\n\t\t/* a. If BSSID is broadcast, remove all group keys indexed*/\n\t\t/* b. If BSSID matched, delete the group key indexed.*/\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"RTMPWPARemoveKeyProc(KeyIdx=%ld)\\n\", KeyIdx));\n\t\tpAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;\n\t\tpAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;\n\t\tAsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx);\n\t\tStatus = NDIS_STATUS_SUCCESS;\n\t}\n\n\treturn (Status);\n}\n#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_WPA_SUPPLICANT_SUPPORT) */\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRemove All WPA Keys\n\n\tArguments:\n\t\tpAd \t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPWPARemoveAllKeys(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\n\tUCHAR \ti;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\\n\", pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));\n\t/*\n\t\tFor WEP/CKIP, there is no need to remove it, since WinXP won't set it \n\t\tagain after Link up. And it will be replaced if user changed it.\n\t*/\n\tif (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n\t\treturn;\n\n\t/* For WPA-None, there is no need to remove it, since WinXP won't set it again after*/\n\t/* Link up. And it will be replaced if user changed it.*/\n\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n\t\treturn;\n\n#ifdef PCIE_PS_SUPPORT\n        RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n\n\t/* set BSSID wcid entry of the Pair-wise Key table as no-security mode*/\n\tAsicRemovePairwiseKeyEntry(pAd, BSSID_WCID);\n\n\t/* set all shared key mode as no-security. */\n\tfor (i = 0; i < SHARE_KEY_NUM; i++)\n    {\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"remove %s key #%d\\n\", CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));\n\t\tNdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY));  \t\t\t\t\t\t\n\n\t\tAsicRemoveSharedKeyEntry(pAd, BSS0, i);\n\t}\n#ifdef PCIE_PS_SUPPORT\n\tRTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n\n}\n#endif /* CONFIG_STA_SUPPORT */\t\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tChange NIC PHY mode. Re-association may be necessary\n\n\tArguments:\n\t\tpAd - Pointer to our adapter\n\t\tphymode  - \n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t========================================================================\n*/\nVOID RTMPSetPhyMode(\n\tIN RTMP_ADAPTER *pAd,\n\tIN ULONG phymode)\n{\n\tINT i;\n\t/* the selected phymode must be supported by the RF IC encoded in E2PROM*/\n\n\tpAd->CommonCfg.PhyMode = (UCHAR)phymode;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RTMPSetPhyMode : PhyMode=%d, channel=%d \\n\", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tBuildChannelListEx(pAd);\n#else\n\tBuildChannelList(pAd);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\t/* sanity check user setting*/\n\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)\n\t\t\tbreak;\n\t}\n\n\tif (i == pAd->ChannelListNum)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tif (pAd->CommonCfg.Channel != 0)\n\t\t\t\tpAd->CommonCfg.Channel = FirstChannel(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tpAd->CommonCfg.Channel = FirstChannel(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPSetPhyMode: channel is out of range, use first channel=%d \\n\", pAd->CommonCfg.Channel));\n\t}\n\t\n\tNdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);\n\tNdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);\n\tNdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);\n\tswitch (phymode) {\n\t\tcase (WMODE_B):\n\t\t\tpAd->CommonCfg.SupRate[0]  = 0x82;\t  /* 1 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[1]  = 0x84;\t  /* 2 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[2]  = 0x8B;\t  /* 5.5 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[3]  = 0x96;\t  /* 11 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRateLen  = 4;\n\t\t\tpAd->CommonCfg.ExtRateLen  = 0;\n\t\t\tpAd->CommonCfg.DesireRate[0]  = 2;\t   /* 1 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[1]  = 4;\t   /* 2 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[2]  = 11;    /* 5.5 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[3]  = 22;    /* 11 mbps, in units of 0.5 Mbps*/\n\t\t\t/*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK;  This MODE is only FYI. not use*/\n\t\t\tbreak;\n\n\t\t/*\n\t\t\tIn current design, we will put supported/extended rate element in\n\t\t\tbeacon even we are 11n-only mode.\n\t\t\tOr some 11n stations will not connect to us if we do not put\n\t\t\tsupported/extended rate element in beacon.\n\t\t*/\n\t\tcase (WMODE_G):\n\t\tcase (WMODE_B | WMODE_G):\n\t\tcase (WMODE_A | WMODE_B | WMODE_G):\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_GN):\n\t\tcase (WMODE_A | WMODE_B | WMODE_G | WMODE_GN | WMODE_AN):\n\t\tcase (WMODE_B | WMODE_G | WMODE_GN):\n\t\tcase (WMODE_G | WMODE_GN):\n#endif /* DOT11_N_SUPPORT */\n\t\t\tpAd->CommonCfg.SupRate[0]  = 0x82;\t  /* 1 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[1]  = 0x84;\t  /* 2 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[2]  = 0x8B;\t  /* 5.5 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[3]  = 0x96;\t  /* 11 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[4]  = 0x12;\t  /* 9 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[5]  = 0x24;\t  /* 18 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[6]  = 0x48;\t  /* 36 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[7]  = 0x6c;\t  /* 54 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRateLen  = 8;\n\t\t\tpAd->CommonCfg.ExtRate[0]  = 0x0C;\t  /* 6 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.ExtRate[1]  = 0x18;\t  /* 12 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.ExtRate[2]  = 0x30;\t  /* 24 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.ExtRate[3]  = 0x60;\t  /* 48 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.ExtRateLen  = 4;\n\t\t\tpAd->CommonCfg.DesireRate[0]  = 2;\t   /* 1 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[1]  = 4;\t   /* 2 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[2]  = 11;    /* 5.5 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[3]  = 22;    /* 11 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[4]  = 12;    /* 6 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[5]  = 18;    /* 9 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[6]  = 24;    /* 12 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[7]  = 36;    /* 18 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[8]  = 48;    /* 24 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[9]  = 72;    /* 36 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[10] = 96;    /* 48 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[11] = 108;   /* 54 mbps, in units of 0.5 Mbps*/\n\t\t\tbreak;\n\n\t\tcase (WMODE_A):\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_A | WMODE_AN):\n\t\tcase (WMODE_A | WMODE_G | WMODE_GN | WMODE_AN):\n\t\tcase (WMODE_AN):\n#endif /* DOT11_N_SUPPORT */\n#ifdef DOT11_VHT_AC\n\t\tcase (WMODE_A | WMODE_AN | WMODE_AC):\n\t\tcase (WMODE_AN | WMODE_AC):\n#endif /* DOT11_VHT_AC */\n\t\t\tpAd->CommonCfg.SupRate[0]  = 0x8C;\t  /* 6 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[1]  = 0x12;\t  /* 9 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[2]  = 0x98;\t  /* 12 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[3]  = 0x24;\t  /* 18 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[4]  = 0xb0;\t  /* 24 mbps, in units of 0.5 Mbps, basic rate*/\n\t\t\tpAd->CommonCfg.SupRate[5]  = 0x48;\t  /* 36 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[6]  = 0x60;\t  /* 48 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRate[7]  = 0x6c;\t  /* 54 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.SupRateLen  = 8;\n\t\t\tpAd->CommonCfg.ExtRateLen  = 0;\n\t\t\tpAd->CommonCfg.DesireRate[0]  = 12;    /* 6 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[1]  = 18;    /* 9 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[2]  = 24;    /* 12 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[3]  = 36;    /* 18 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[4]  = 48;    /* 24 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[5]  = 72;    /* 36 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[6]  = 96;    /* 48 mbps, in units of 0.5 Mbps*/\n\t\t\tpAd->CommonCfg.DesireRate[7]  = 108;   /* 54 mbps, in units of 0.5 Mbps*/\n\t\t\t/*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM;  This MODE is only FYI. not use*/\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tUINT\tapidx;\n\t\t\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tMlmeUpdateTxRates(pAd, FALSE, apidx);\n\t\t}\t\n#ifdef APCLI_SUPPORT\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t{\t\t\t\t\n\t\t\tMlmeUpdateTxRates(pAd, FALSE, apidx + MIN_NET_DEVICE_FOR_APCLI);\t\t\t\n\t\t}\n#endif /* APCLI_SUPPORT */\t\t\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tUINT\tapidx;\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tMlmeUpdateTxRates(pAd, FALSE, apidx + MIN_NET_DEVICE_FOR_P2P_GO);\n\t\t}\n\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t{\t\t\t\t\n\t\t\tMlmeUpdateTxRates(pAd, FALSE, apidx + MIN_NET_DEVICE_FOR_APCLI);\t\t\t\n\t\t}\n\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n\tSetCommonVHT(pAd);\n#endif /* DOT11_VHT_AC */\n}\n\n\n/*\n\t========================================================================\n\tDescription:\n\t\tAdd Client security information into ASIC WCID table and IVEIV table.\n    Return:\n\t========================================================================\n*/\nVOID\tRTMPAddWcidAttributeEntry(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBssIdx,\n\tIN \tUCHAR\t\t \tKeyIdx,\n\tIN \tUCHAR\t\t \tCipherAlg,\n\tIN \tMAC_TABLE_ENTRY *pEntry)\n{\n\tUINT32\t\tWCIDAttri = 0;\n\tUSHORT\t\toffset;\n\tUCHAR\t\tIVEIV = 0;\n\tUSHORT\t\tWcid = 0;\n#ifdef CONFIG_AP_SUPPORT\n\tBOOLEAN\t\tIEEE8021X = FALSE;\n#endif /* CONFIG_AP_SUPPORT */\n\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (BssIdx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\t{\n\t\t\t\tif (pEntry)\t\t\n\t\t\t\t\tBssIdx -= MIN_NET_DEVICE_FOR_APCLI;\t\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"RTMPAddWcidAttributeEntry: AP-Client link doesn't need to set Group WCID Attribute. \\n\"));\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\t\n\t\t\telse \n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tif (BssIdx >= pAd->ApCfg.BssidNum)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for MBSSID link. \\n\", BssIdx));\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* choose wcid number*/\n\t\t\tif (pEntry)\n\t\t\t\tWcid = pEntry->Aid;\n\t\t\telse\n\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, BssIdx);\t\t\n\n#ifdef DOT1X_SUPPORT\n\t\t\tif ((BssIdx < pAd->ApCfg.BssidNum) && (BssIdx < MAX_MBSSID_NUM(pAd)) && (BssIdx < HW_BEACON_MAX_NUM))\n\t\t\t\tIEEE8021X = pAd->ApCfg.MBSSID[BssIdx].IEEE8021X;\n#endif /* DOT1X_SUPPORT */\t\t\t\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif (BssIdx > BSS0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \\n\", BssIdx));\t\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t\t1.\tIn ADHOC mode, the AID is wcid number. And NO mesh link exists.\n\t\t\t\t2.\tIn Infra mode, the AID:1 MUST be wcid of infra STA.\n\t\t\t\t\t\t\t\t\tthe AID:2~ assign to mesh link entry.\n\t\t\t*/\n\t\t\tif (pEntry)\n\t\t\t\tWcid = pEntry->Aid;\n\t\t\telse\n\t\t\t\tWcid = MCAST_WCID;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n\t/* Update WCID attribute table*/\n\toffset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\t/*\n\t\t\t1.\tWds-links and Mesh-links always use Pair-wise key table.\n\t\t\t2. \tWhen the CipherAlg is TKIP, AES or the dynamic WEP is enabled,\n\t\t\t\tit needs to set key into Pair-wise Key Table.\n\t\t\t3.\tThe pair-wise key security mode is set NONE, it means as no security.\n\t\t*/\n\t\tif (pEntry && (IS_ENTRY_WDS(pEntry) || IS_ENTRY_MESH(pEntry)))\n\t\t\tWCIDAttri = (BssIdx<<4) | (CipherAlg<<1) | PAIRWISEKEYTABLE;\n\t\telse if ((pEntry) && \n\t\t\t\t((CipherAlg == CIPHER_TKIP) || \n\t\t\t\t (CipherAlg == CIPHER_AES) || \n\t\t\t\t (CipherAlg == CIPHER_NONE) || \n\t\t\t\t (IEEE8021X == TRUE)))\n\t\t\tWCIDAttri = (BssIdx<<4) | (CipherAlg<<1) | PAIRWISEKEYTABLE;\n\t\telse\n\t\t\tWCIDAttri = (BssIdx<<4) | (CipherAlg<<1) | SHAREDKEYTABLE;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pEntry && IS_ENTRY_MESH(pEntry))\n\t\t\tWCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;\n#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT)\n\t\telse if ((pEntry) && (IS_ENTRY_DLS(pEntry) || IS_ENTRY_TDLS(pEntry)) &&\n\t\t\t\t\t((CipherAlg == CIPHER_TKIP) || \n\t\t\t\t\t(CipherAlg == CIPHER_AES) || \n\t\t\t\t \t(CipherAlg == CIPHER_NONE))) \n\t\t\tWCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;\n#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT) */\n\t\telse\n\t\tWCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\n\tRTMP_IO_WRITE32(pAd, offset, WCIDAttri);\n\n\t\t\n\t/* Update IV/EIV table*/\n\toffset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);\n\n\t/* WPA mode*/\n\tif ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_AES))\n\t{\t\n\t\t/* Eiv bit on. keyid always is 0 for pairwise key \t\t\t*/\n\t\tIVEIV = (KeyIdx <<6) | 0x20;\t\n\t}\t \n\telse\n\t{\n\t\t/* WEP KeyIdx is default tx key. */\n\t\tIVEIV = (KeyIdx << 6);\t\n\t}\n\n\t/* For key index and ext IV bit, so only need to update the position(offset+3).*/\n#ifdef RTMP_MAC_USB\n\tRTUSBMultiWrite_OneByte(pAd, offset+3, &IVEIV);\n#endif /* RTMP_MAC_USB */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\\n\",Wcid, KeyIdx, CipherName[CipherAlg]));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"\tWCIDAttri = 0x%x \\n\",  WCIDAttri));\t\n\n}\n\n/* \n    ==========================================================================\n    Description:\n        Parse encryption type\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n    ==========================================================================\n*/\nPSTRING GetEncryptType(CHAR enc)\n{\n    if(enc == Ndis802_11WEPDisabled)\n        return \"NONE\";\n    if(enc == Ndis802_11WEPEnabled)\n    \treturn \"WEP\";\n    if(enc == Ndis802_11Encryption2Enabled)\n    \treturn \"TKIP\";\n    if(enc == Ndis802_11Encryption3Enabled)\n    \treturn \"AES\";\n\tif(enc == Ndis802_11Encryption4Enabled)\n    \treturn \"TKIPAES\";\n#ifdef WAPI_SUPPORT\n\tif(enc == Ndis802_11EncryptionSMS4Enabled)\n    \treturn \"SMS4\";\n#endif /* WAPI_SUPPORT */\n    else\n    \treturn \"UNKNOW\";\n}\n\nPSTRING GetAuthMode(CHAR auth)\n{\n    if(auth == Ndis802_11AuthModeOpen)\n    \treturn \"OPEN\";\n    if(auth == Ndis802_11AuthModeShared)\n    \treturn \"SHARED\";\n\tif(auth == Ndis802_11AuthModeAutoSwitch)\n    \treturn \"AUTOWEP\";\n    if(auth == Ndis802_11AuthModeWPA)\n    \treturn \"WPA\";\n    if(auth == Ndis802_11AuthModeWPAPSK)\n    \treturn \"WPAPSK\";\n    if(auth == Ndis802_11AuthModeWPANone)\n    \treturn \"WPANONE\";\n    if(auth == Ndis802_11AuthModeWPA2)\n    \treturn \"WPA2\";\n    if(auth == Ndis802_11AuthModeWPA2PSK)\n    \treturn \"WPA2PSK\";\n\tif(auth == Ndis802_11AuthModeWPA1WPA2)\n    \treturn \"WPA1WPA2\";\n\tif(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n    \treturn \"WPA1PSKWPA2PSK\";\n#ifdef WAPI_SUPPORT\n\tif(auth == Ndis802_11AuthModeWAICERT)\n    \treturn \"WAI-CERT\";\n\tif(auth == Ndis802_11AuthModeWAIPSK)\n    \treturn \"WAI-PSK\";\n#endif /* WAPI_SUPPORT */\n\t\n    \treturn \"UNKNOW\";\n}\t\t\n\n\n/* \n    ==========================================================================\n    Description:\n        Get site survey results\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage:\n        \t\t1.) UI needs to wait 4 seconds after issue a site survey command\n        \t\t2.) iwpriv ra0 get_site_survey\n        \t\t3.) UI needs to prepare at least 4096bytes to get the results\n    ==========================================================================\n*/\n#define\tLINE_LEN\t(4+33+20+23+9+7+7+3)\t/* Channel+SSID+Bssid+Security+Signal+WiressMode+ExtCh+NetworkType*/\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\n#define\tWPS_LINE_LEN\t(4+5)\t/* WPS+DPID*/\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\nVOID\tRTMPCommSiteSurveyData(\n\tIN  PSTRING\t\tmsg,\n\tIN  PBSS_ENTRY\tpBss,\n\tIN  UINT32\t\tMsgLen)\n{\n\tINT         Rssi = 0;\n\tUINT        Rssi_Quality = 0;\n\tNDIS_802_11_NETWORK_TYPE    wireless_mode;\n\tCHAR\t\tSsid[MAX_LEN_OF_SSID +1];\n\tSTRING\t\tSecurityStr[32] = {0};\n\tNDIS_802_11_ENCRYPTION_STATUS\tap_cipher = Ndis802_11EncryptionDisabled;\n\tNDIS_802_11_AUTHENTICATION_MODE\tap_auth_mode = Ndis802_11AuthModeOpen;\n\n\t\t/*Channel*/\n\t\tsprintf(msg+strlen(msg),\"%-4d\", pBss->Channel);\n\n\n\t\t/*SSID*/\n\tNdisZeroMemory(Ssid, (MAX_LEN_OF_SSID +1));\n\tif (RTMPCheckStrPrintAble((PCHAR)pBss->Ssid, pBss->SsidLen))\n\t\tNdisMoveMemory(Ssid, pBss->Ssid, pBss->SsidLen);\n\telse\n\t{\n\t\tINT idx = 0;\n\t\tsprintf(Ssid, \"0x\");\n\t\tfor (idx = 0; (idx < 14) && (idx < pBss->SsidLen); idx++)\n\t\t\tsprintf(Ssid + 2 + (idx*2), \"%02X\", (UCHAR)pBss->Ssid[idx]);\n\t}\n\t\tsprintf(msg+strlen(msg),\"%-33s\", Ssid);      \n\t\t\n\t\t/*BSSID*/\n\t\tsprintf(msg+strlen(msg),\"%02x:%02x:%02x:%02x:%02x:%02x   \", \n\t\t\tpBss->Bssid[0], \n\t\t\tpBss->Bssid[1],\n\t\t\tpBss->Bssid[2], \n\t\t\tpBss->Bssid[3], \n\t\t\tpBss->Bssid[4], \n\t\t\tpBss->Bssid[5]);\n\t\n\t/*Security*/\n\tRTMPZeroMemory(SecurityStr, 32);\n\tif ((Ndis802_11AuthModeWPA <= pBss->AuthMode) &&\n\t\t(pBss->AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t{\n\t\tif (pBss->AuthMode == Ndis802_11AuthModeWPANone)\n\t\t{\n\t\t\tap_auth_mode = pBss->AuthMode;\n\t\t\t\tap_cipher = pBss->WPA.PairCipher;\n\t\t}\n\t\telse if (pBss->AuthModeAux == Ndis802_11AuthModeOpen)\n\t\t{\n\t\t\tap_auth_mode = pBss->AuthMode;\n\t\t\tif ((ap_auth_mode == Ndis802_11AuthModeWPA) || \n\t\t\t\t(ap_auth_mode == Ndis802_11AuthModeWPAPSK))\n\t\t\t{\n\t\t\t\tif (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)\n\t\t\t\t\tap_cipher = pBss->WPA.PairCipher;\n\t\t\t\telse \n\t\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\t}\n\t\t\telse if ((ap_auth_mode == Ndis802_11AuthModeWPA2) || \n\t\t\t\t\t (ap_auth_mode == Ndis802_11AuthModeWPA2PSK))\n\t\t\t{\n\t\t\t\tif (pBss->WPA2.PairCipherAux == Ndis802_11WEPDisabled)\n\t\t\t\t\tap_cipher = pBss->WPA2.PairCipher;\n\t\t\t\telse \n\t\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\t}\n\t\t}\n\t\telse if ((pBss->AuthMode == Ndis802_11AuthModeWPAPSK) || \n\t\t\t\t (pBss->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t{\n\t\t\tif ((pBss->AuthModeAux == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t(pBss->AuthModeAux == Ndis802_11AuthModeWPA2PSK))\n\t\t\t\tap_auth_mode = Ndis802_11AuthModeWPA1PSKWPA2PSK;\n\t\t\telse\n\t\t\t\tap_auth_mode = pBss->AuthMode;\n\t\t\t\n\t\t\tif (pBss->WPA.PairCipher != pBss->WPA2.PairCipher)\n\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\telse if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux != pBss->WPA2.PairCipherAux))\n\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\telse if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux != Ndis802_11WEPDisabled))\n\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\telse if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled))\n\t\t\t\tap_cipher = pBss->WPA.PairCipher;\n\t\t}\n\t\telse if ((pBss->AuthMode == Ndis802_11AuthModeWPA) || \n\t\t\t\t (pBss->AuthMode == Ndis802_11AuthModeWPA2))\n\t\t{\n\t\t\tif ((pBss->AuthModeAux == Ndis802_11AuthModeWPA) ||\n\t\t\t\t(pBss->AuthModeAux == Ndis802_11AuthModeWPA2))\n\t\t\t\tap_auth_mode = Ndis802_11AuthModeWPA1WPA2;\n\t\t\telse\n\t\t\t\tap_auth_mode = pBss->AuthMode;\n\t\t\t\n\t\t\tif (pBss->WPA.PairCipher != pBss->WPA2.PairCipher)\n\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\telse if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux != pBss->WPA2.PairCipherAux))\n\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\telse if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux != Ndis802_11WEPDisabled))\n\t\t\t\tap_cipher = Ndis802_11Encryption4Enabled;\n\t\t\telse if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&\n\t\t\t\t\t (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled))\n\t\t\t\tap_cipher = pBss->WPA.PairCipher;\n\t\t}\n\n\t\tsprintf(SecurityStr, \"%s/%s\", GetAuthMode((CHAR)ap_auth_mode), GetEncryptType((CHAR)ap_cipher));\t\t\n\t}\t\t\t\n\telse\n\t{\n\t\tap_auth_mode = pBss->AuthMode;\n\t\tap_cipher = pBss->WepStatus;\t\t\n\t\tif (ap_cipher == Ndis802_11WEPDisabled)\n\t\t\tsprintf(SecurityStr, \"NONE\");\n\t\telse if (ap_cipher == Ndis802_11WEPEnabled)\n\t\t\tsprintf(SecurityStr, \"WEP\");\n\t\telse\n\t\t\tsprintf(SecurityStr, \"%s/%s\", GetAuthMode((CHAR)ap_auth_mode), GetEncryptType((CHAR)ap_cipher));\t\t\n\t}\n\t\n\tsprintf(msg+strlen(msg), \"%-23s\", SecurityStr);\n\n\t\t/* Rssi*/\n\t\tRssi = (INT)pBss->Rssi;\n\t\tif (Rssi >= -50)\n\t\t\tRssi_Quality = 100;\n\t\telse if (Rssi >= -80)    /* between -50 ~ -80dbm*/\n\t\t\tRssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10);\n\t\telse if (Rssi >= -90)   /* between -80 ~ -90dbm*/\n\t\t\tRssi_Quality = (UINT)(((Rssi + 90) * 26)/10);\n\t\telse    /* < -84 dbm*/\n\t\t\tRssi_Quality = 0;\n\t\tsprintf(msg+strlen(msg),\"%-9d\", Rssi_Quality);\n\t\t\n\t\t/* Wireless Mode*/\n\t\twireless_mode = NetworkTypeInUseSanity(pBss);\n\t\tif (wireless_mode == Ndis802_11FH ||\n\t\t\twireless_mode == Ndis802_11DS)\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \"11b\");\n\t\telse if (wireless_mode == Ndis802_11OFDM5)\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \"11a\");\n\t\telse if (wireless_mode == Ndis802_11OFDM5_N)\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \"11a/n\");\n\t\telse if (wireless_mode == Ndis802_11OFDM24)\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \"11b/g\");\n\t\telse if (wireless_mode == Ndis802_11OFDM24_N)\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \"11b/g/n\");\n\t\telse\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \"unknow\");\n\n\t\t/* Ext Channel*/\n\t\tif (pBss->AddHtInfoLen > 0)\n\t\t{\n\t\t\tif (pBss->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE)\n\t\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \" ABOVE\");\n\t\t\telse if (pBss->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW)\n\t\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \" BELOW\");\n\t\t\telse\n\t\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \" NONE\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsprintf(msg+strlen(msg),\"%-7s\", \" NONE\");\n\t\t}\n\t\t\n\t\t/*Network Type\t\t*/\n\t\tif (pBss->BssType == BSS_ADHOC)\n\t\t\tsprintf(msg+strlen(msg),\"%-3s\", \" Ad\");\n\t\telse\n\t\t\tsprintf(msg+strlen(msg),\"%-3s\", \" In\");\n\n        sprintf(msg+strlen(msg),\"\\n\");\n\t\n\treturn;\n}\n\n#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)\nVOID RTMPIoctlGetSiteSurvey(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\tmsg;\n\tINT \t\ti=0;\t \n\tINT\t\t\tWaitCnt;\n\tINT \t\tStatus=0;\t\n    INT         max_len = LINE_LEN;\t\t\n\tPBSS_ENTRY\tpBss;\n\tUINT32 TotalLen, BufLen = IW_SCAN_MAX_DATA;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\n\tmax_len += WPS_LINE_LEN;\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tTotalLen = sizeof(CHAR)*((MAX_LEN_OF_BSS_TABLE)*max_len) + 100;\n\n\tif (wrq->u.data.length == 0)\n\t\tBufLen = IW_SCAN_MAX_DATA;\t\n\telse\n\t\tBufLen = wrq->u.data.length;\n\n\tos_alloc_mem(NULL, (PUCHAR *)&msg, TotalLen);\n\n\tif (msg == NULL)\n\t{   \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlGetSiteSurvey - msg memory alloc fail.\\n\"));\n\t\treturn;\n\t}\n\n\tmemset(msg, 0 , TotalLen);\n\tsprintf(msg,\"%s\",\"\\n\");\n\n\tsprintf(msg+strlen(msg),\"%-4s%-33s%-20s%-23s%-9s%-7s%-7s%-3s\\n\",\n\t    \"Ch\", \"SSID\", \"BSSID\", \"Security\", \"Siganl(%)\", \"W-Mode\", \" ExtCH\",\" NT\");\t\n\n#ifdef WSC_INCLUDED\n\tsprintf(msg+strlen(msg)-1,\"%-4s%-5s\\n\", \" WPS\", \" DPID\");\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\tWaitCnt = 0;\n#ifdef CONFIG_STA_SUPPORT\n\tpAdapter->StaCfg.bSkipAutoScanConn = TRUE;\n#endif /* CONFIG_STA_SUPPORT */\n\n\twhile ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200))\n\t\tOS_WAIT(500);\t\n\n\tfor(i=0; i<pAdapter->ScanTab.BssNr ;i++)\n\t{\n\t\tpBss = &pAdapter->ScanTab.BssEntry[i];\n\t\t\n\t\tif( pBss->Channel==0)\n\t\t\tbreak;\n\n\t\tif((strlen(msg)+100 ) >= BufLen)\n\t\t\tbreak;\n\n\n\t\tRTMPCommSiteSurveyData(msg, pBss, TotalLen);\n\t\t\n#ifdef WSC_INCLUDED\n        /*WPS*/\n        if (pBss->WpsAP & 0x01)\n\t\t\tsprintf(msg+strlen(msg)-1,\"%-4s\", \" YES\");\n\t\telse\n\t\t\tsprintf(msg+strlen(msg)-1,\"%-4s\", \"  NO\");\n\n\t\tif (pBss->WscDPIDFromWpsAP == DEV_PASS_ID_PIN)\n\t\t\tsprintf(msg+strlen(msg),\"%-5s\\n\", \" PIN\");\n\t\telse if (pBss->WscDPIDFromWpsAP == DEV_PASS_ID_PBC)\n\t\t\tsprintf(msg+strlen(msg),\"%-5s\\n\", \" PBC\");\n\t\telse\n\t\t\tsprintf(msg+strlen(msg),\"%-5s\\n\", \" \");\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\tpAdapter->StaCfg.bSkipAutoScanConn = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n\twrq->u.data.length = strlen(msg);\n\tStatus = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlGetSiteSurvey - wrq->u.data.length = %d\\n\", wrq->u.data.length));\n\tos_free_mem(NULL, (PUCHAR)msg);\t\n}\n#endif\n\n\n\n\n#define\tMAC_LINE_LEN\t(1+14+4+4+4+4+10+10+10+6+6)\t/* \"\\n\"+Addr+aid+psm+datatime+rxbyte+txbyte+current tx rate+last tx rate+\"\\n\" */\nVOID RTMPIoctlGetMacTable(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tINT i;\n/*\tRT_802_11_MAC_TABLE MacTab;*/\n\tRT_802_11_MAC_TABLE *pMacTab = NULL;\n\tRT_802_11_MAC_ENTRY *pDst;\n\tMAC_TABLE_ENTRY *pEntry;\n\tchar *msg;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pMacTab, sizeof(RT_802_11_MAC_TABLE));\n\tif (pMacTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(pMacTab, sizeof(RT_802_11_MAC_TABLE));\n\tpMacTab->Num = 0;\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &(pAd->MacTab.Content[i]);\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\t\t\tpDst = &pMacTab->Entry[pMacTab->Num];\n\n\n\t\t\tpDst->ApIdx = (UCHAR)pEntry->apidx;\n\t\t\tCOPY_MAC_ADDR(pDst->Addr, &pEntry->Addr);\n\t\t\tpDst->Aid = (UCHAR)pEntry->Aid;\n\t\t\tpDst->Psm = pEntry->PsMode;\n#ifdef DOT11_N_SUPPORT\n\t\t\tpDst->MimoPs = pEntry->MmpsMode;\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t/* Fill in RSSI per entry*/\n\t\t\tpDst->AvgRssi0 = pEntry->RssiSample.AvgRssi0;\n\t\t\tpDst->AvgRssi1 = pEntry->RssiSample.AvgRssi1;\n\t\t\tpDst->AvgRssi2 = pEntry->RssiSample.AvgRssi2;\n\n\t\t\t/* the connected time per entry*/\n\t\t\tpDst->ConnectedTime = pEntry->StaConnectTime;\n\t\t\tpDst->TxRate.word = pEntry->HTPhyMode.word;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\tpMacTab->Num += 1;\n\t\t}\n\t}\n\n\twrq->u.data.length = sizeof(RT_802_11_MAC_TABLE);\n\tif (copy_to_user(wrq->u.data.pointer, pMacTab, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n\n/*\tmsg = kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN));\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\tgoto LabelOK;\n\t}\n\tmemset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN );\n\tsprintf(msg,\"%s\",\"\\n\");\n\tsprintf(msg+strlen(msg),\"%-14s%-4s%-4s%-4s%-4s%-6s%-6s%-10s%-10s%-10s\\n\",\n\t\t\"MAC\", \"AP\",  \"AID\", \"PSM\", \"AUTH\", \"CTxR\", \"LTxR\",\"LDT\", \"RxB\", \"TxB\");\n\t\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\t\t\tif((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) )\n\t\t\t\tbreak;\t\n\t\t\tsprintf(msg+strlen(msg),\"%02x%02x%02x%02x%02x%02x  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->apidx);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->Aid);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->PsMode);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->AuthState);\n\t\t\tsprintf(msg+strlen(msg),\"%-6d\",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]);\n\t\t\tsprintf(msg+strlen(msg),\"%-6d\",0/*RateIdToMbps[pAd->MacTab.Content[i].HTPhyMode.word]*/); /* ToDo*/\n\t\t\tsprintf(msg+strlen(msg),\"%-10d\",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); /* ToDo*/\n\t\t\tsprintf(msg+strlen(msg),\"%-10d\",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); /* ToDo*/\n\t\t\tsprintf(msg+strlen(msg),\"%-10d\\n\",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); /* ToDo*/\n\n\t\t}\n\t} \n\t/* for compatible with old API just do the printk to console*/\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\", msg));\n/*\tkfree(msg);*/\n\tos_free_mem(NULL, msg);\n\nLabelOK:\n\tif (pMacTab != NULL)\n\t\tos_free_mem(NULL, pMacTab);\n}\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\nVOID RTMPAR9IoctlGetMacTable(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tINT i;\n\tchar *msg;\n\n/*\tmsg = kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN));\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tmemset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN );\n\tsprintf(msg,\"%s\",\"\\n\");\n\tsprintf(msg+strlen(msg),\"%-14s%-4s%-4s%-4s%-4s%-6s%-6s%-10s%-10s%-10s\\n\",\n\t\t\"MAC\", \"AP\",  \"AID\", \"PSM\", \"AUTH\", \"CTxR\", \"LTxR\",\"LDT\", \"RxB\", \"TxB\");\n\t\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\t\t\tif((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) )\n\t\t\t\tbreak;\t\n\t\t\tsprintf(msg+strlen(msg),\"%02x%02x%02x%02x%02x%02x  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->apidx);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->Aid);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->PsMode);\n\t\t\tsprintf(msg+strlen(msg),\"%-4d\", (int)pEntry->AuthState);\n\t\t\tsprintf(msg+strlen(msg),\"%-6d\",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]);\n\t\t\tsprintf(msg+strlen(msg),\"%-6d\",0/*RateIdToMbps[pAd->MacTab.Content[i].HTPhyMode.word]*/); /* ToDo*/\n\t\t\tsprintf(msg+strlen(msg),\"%-10d\",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); /* ToDo*/\n\t\t\tsprintf(msg+strlen(msg),\"%-10d\",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); /* ToDo*/\n\t\t\tsprintf(msg+strlen(msg),\"%-10d\\n\",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); /* ToDo*/\n\n\t\t}\n\t} \n\t/* for compatible with old API just do the printk to console*/\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\", msg));\n\t}\n\n/*\tkfree(msg);*/\n\tos_free_mem(NULL, msg);\n}\n\nVOID RTMPIoctlGetSTAT2(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tchar *msg;\n\tPMULTISSID_STRUCT\tpMbss;\n\tINT apidx;\n\n\n/*\tmsg = kmalloc(sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)), MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)));\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tmemset(msg, 0 ,pAd->ApCfg.BssidNum*(14*128));\n\tsprintf(msg,\"%s\",\"\\n\");\n\t\n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tpMbss=&pAd->ApCfg.MBSSID[apidx];\n\t\t\n\t\tsprintf(msg+strlen(msg),\"ra%d\\n\",apidx);\n\t\tsprintf(msg+strlen(msg),\"bytesTx = %ld\\n\",(pMbss->TransmittedByteCount));\n\t\tsprintf(msg+strlen(msg),\"bytesRx = %ld\\n\",(pMbss->ReceivedByteCount));\n\t\tsprintf(msg+strlen(msg),\"pktsTx = %ld\\n\",pMbss->TxCount);\n\t\tsprintf(msg+strlen(msg),\"pktsRx = %ld\\n\",pMbss->RxCount);\n\t\tsprintf(msg+strlen(msg),\"errorsTx = %ld\\n\",pMbss->TxErrorCount);\n\t\tsprintf(msg+strlen(msg),\"errorsRx = %ld\\n\",pMbss->RxErrorCount);\n\t\tsprintf(msg+strlen(msg),\"discardPktsTx = %ld\\n\",pMbss->TxDropCount);\n\t\tsprintf(msg+strlen(msg),\"discardPktsRx = %ld\\n\",pMbss->RxDropCount);\n\t\tsprintf(msg+strlen(msg),\"ucPktsTx = %ld\\n\",pMbss->ucPktsTx);\n\t\tsprintf(msg+strlen(msg),\"ucPktsRx = %ld\\n\",pMbss->ucPktsRx);\n\t\tsprintf(msg+strlen(msg),\"mcPktsTx = %ld\\n\",pMbss->mcPktsTx);\n\t\tsprintf(msg+strlen(msg),\"mcPktsRx = %ld\\n\",pMbss->mcPktsRx);\n\t\tsprintf(msg+strlen(msg),\"bcPktsTx = %ld\\n\",pMbss->bcPktsTx);\n\t\tsprintf(msg+strlen(msg),\"bcPktsRx = %ld\\n\",pMbss->bcPktsRx);\n\t\t\n\t}\n\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\", msg));\n\t}\n\n/*\tkfree(msg);*/\n\tos_free_mem(NULL, msg);\n}\n\n\nVOID RTMPIoctlGetRadioDynInfo(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tchar *msg;\n\tPMULTISSID_STRUCT\tpMbss;\n\tINT status,bandwidth,ShortGI;\n\t\n\n/*\tmsg = kmalloc(sizeof(CHAR)*(4096), MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(4096));\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tmemset(msg, 0 ,4096);\n\tsprintf(msg,\"%s\",\"\\n\");\n\t\n\n\t\tpMbss=&pAd->ApCfg.MBSSID[0];\n\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\n\t\t\tstatus = 0;\n\t\telse\n\t\t\tstatus = 1;\n\n\t\tif(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\t\tbandwidth = 1;\n\t\telse\n\t\t\tbandwidth = 0;\n\n\t\tif(pAd->CommonCfg.RegTransmitSetting.field.ShortGI == GI_800)\n\t\t\tShortGI = 1;\n\t\telse\n\t\t\tShortGI = 0;\n\n\t\t\n\t\tsprintf(msg+strlen(msg),\"status = %d\\n\",status);\n\t\tsprintf(msg+strlen(msg),\"channelsInUse = %d\\n\",pAd->ChannelListNum);\n\t\tsprintf(msg+strlen(msg),\"channel = %d\\n\",pAd->CommonCfg.Channel);\n\t\tsprintf(msg+strlen(msg),\"chanWidth = %d\\n\",bandwidth);\n\t\tsprintf(msg+strlen(msg),\"guardIntvl = %d\\n\",ShortGI);\n\t\tsprintf(msg+strlen(msg),\"MCS = %d\\n\",pMbss->DesiredTransmitSetting.field.MCS);\n\t\t\n\twrq->u.data.length = strlen(msg);\n\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\", msg));\n\t}\n\n/*\tkfree(msg);*/\n\tos_free_mem(NULL, msg);\n}\n#endif/*CONFIG_AP_SUPPORT*/\n#endif/*AR9_MAPI_SUPPORT*/\n#endif/* INF_AR9 */\n\n#ifdef DOT11_N_SUPPORT\nINT\tSet_BASetup_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    UCHAR mac[6], tid;\n\tPSTRING token;\n\tSTRING sepValue[] = \":\", DASH = '-';\n\tINT i;\n    MAC_TABLE_ENTRY *pEntry;\n\n/*\n\tThe BASetup inupt string format should be xx:xx:xx:xx:xx:xx-d, \n\t\t=>The six 2 digit hex-decimal number previous are the Mac address, \n\t\t=>The seventh decimal number is the tid value.\n*/\n\t/*DBGPRINT(RT_DEBUG_TRACE,(\"\\n%s\\n\", arg));*/\n\t\n\tif(strlen(arg) < 19)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 plus the \"-\" and tid value in decimal format.*/\n\t\treturn FALSE;\n\n\ttoken = strchr(arg, DASH);\n\tif ((token != NULL) && (strlen(token)>1))\n\t{\n\t\ttid = (UCHAR) simple_strtol((token+1), 0, 10);\n\t\t/* tid is 0 ~ 7; Or kernel will crash in BAOriSessionSetUp() */\n\t\tif (tid > (NUM_OF_TID-1))\n\t\t\treturn FALSE;\n\t\t\n\t\t*token = '\\0';\n\t\tfor (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)\n\t\t{\n\t\t\tif((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))\n\t\t\t\treturn FALSE;\n\t\t\tAtoH(token, (&mac[i]), 1);\n\t\t}\n\t\tif(i != 6)\n\t\t\treturn FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\\n\", \n\t\t\t\t\t\t\t\tmac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid));\n\n\t    pEntry = MacTableLookup(pAd, (PUCHAR) mac);\n\n    \tif (pEntry) {\n        \tDBGPRINT(RT_DEBUG_OFF, (\"\\nSetup BA Session: Tid = %d\\n\", tid));\n\t        BAOriSessionSetUp(pAd, pEntry, tid, 0, 100, TRUE);\n    \t}\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n\n}\n\nINT\tSet_BADecline_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG bBADecline;\n\n\tbBADecline = simple_strtol(arg, 0, 10);\n\n\tif (bBADecline == 0)\n\t{\n\t\tpAd->CommonCfg.bBADecline = FALSE;\n\t}\n\telse if (bBADecline == 1)\n\t{\n\t\tpAd->CommonCfg.bBADecline = TRUE;\n\t}\n\telse \n\t{\n\t\treturn FALSE; /*Invalid argument*/\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_BADecline_Proc::(BADecline=%d)\\n\", pAd->CommonCfg.bBADecline));\n\n\treturn TRUE;\n}\n\nINT\tSet_BAOriTearDown_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    UCHAR mac[6], tid;\n\tPSTRING token;\n\tSTRING sepValue[] = \":\", DASH = '-';\n\tINT i;\n    MAC_TABLE_ENTRY *pEntry;\n\n    /*DBGPRINT(RT_DEBUG_TRACE,(\"\\n%s\\n\", arg));*/\n/*\n\tThe BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, \n\t\t=>The six 2 digit hex-decimal number previous are the Mac address, \n\t\t=>The seventh decimal number is the tid value.\n*/\n    if(strlen(arg) < 19)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 plus the \"-\" and tid value in decimal format.*/\n\t\treturn FALSE;\n\n\ttoken = strchr(arg, DASH);\n\tif ((token != NULL) && (strlen(token)>1))\n\t{\n\t\ttid = simple_strtol((token+1), 0, 10);\n\t\t/* tid will be 0 ~ 7; Or kernel will crash in BAOriSessionTearDown() */\n\t\tif (tid > (NUM_OF_TID-1))\n\t\t\treturn FALSE;\n\t\t\n\t\t*token = '\\0';\n\t\tfor (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)\n\t\t{\n\t\t\tif((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))\n\t\t\t\treturn FALSE;\n\t\t\tAtoH(token, (&mac[i]), 1);\n\t\t}\n\t\tif(i != 6)\n\t\t\treturn FALSE;\n\n\t    DBGPRINT(RT_DEBUG_OFF, (\"\\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\", \n\t\t\t\t\t\t\t\tmac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid));\n\n\t    pEntry = MacTableLookup(pAd, (PUCHAR) mac);\n\n\t    if (pEntry) {\n\t        DBGPRINT(RT_DEBUG_OFF, (\"\\nTear down Ori BA Session: Tid = %d\\n\", tid));\n\t        BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, TRUE);\n\t    }\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n\n}\n\nINT\tSet_BARecTearDown_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    UCHAR mac[6], tid;\n\tPSTRING token;\n\tSTRING sepValue[] = \":\", DASH = '-';\n\tINT i;\n    MAC_TABLE_ENTRY *pEntry;\n\n    /*DBGPRINT(RT_DEBUG_TRACE,(\"\\n%s\\n\", arg));*/\n/*\n\tThe BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, \n\t\t=>The six 2 digit hex-decimal number previous are the Mac address, \n\t\t=>The seventh decimal number is the tid value.\n*/\n    if(strlen(arg) < 19)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 plus the \"-\" and tid value in decimal format.*/\n\t\treturn FALSE;\n\n\ttoken = strchr(arg, DASH);\n\tif ((token != NULL) && (strlen(token)>1))\n\t{\n\t\ttid = simple_strtol((token+1), 0, 10);\n\t\t/* tid will be 0 ~ 7; Or kernel will crash in BARecSessionTearDown() */\n\t\tif (tid > (NUM_OF_TID-1))\n\t\t\treturn FALSE;\n\t\t\n\t\t*token = '\\0';\n\t\tfor (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)\n\t\t{\n\t\t\tif((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))\n\t\t\t\treturn FALSE;\n\t\t\tAtoH(token, (&mac[i]), 1);\n\t\t}\n\t\tif(i != 6)\n\t\t\treturn FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\", \n\t\t\t\t\t\t\t\tmac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid));\n\n\t\tpEntry = MacTableLookup(pAd, (PUCHAR) mac);\n\n\t\tif (pEntry) {\n\t\t    DBGPRINT(RT_DEBUG_OFF, (\"\\nTear down Rec BA Session: Tid = %d\\n\", tid));\n\t\t    BARecSessionTearDown(pAd, pEntry->Aid, tid, FALSE);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n\n}\n\nINT\tSet_HtBw_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG HtBw;\n\n\tHtBw = simple_strtol(arg, 0, 10);\n\n\tif (HtBw == BW_40)\n\t\tpAd->CommonCfg.RegTransmitSetting.field.BW  = BW_40;\n\telse if (HtBw == BW_20)\n\t\tpAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtBw_Proc::(HtBw=%d)\\n\", pAd->CommonCfg.RegTransmitSetting.field.BW));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_HtMcs_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG HtMcs, Mcs_tmp, ValidMcs = 15;\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* CONFIG_AP_SUPPORT */\t\n#ifdef CONFIG_STA_SUPPORT    \n    BOOLEAN bAutoRate = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef DOT11N_SS3_SUPPORT\n\tif (pAd->CommonCfg.TxStream >= 3)\n\t\tValidMcs = 23;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\tMcs_tmp = simple_strtol(arg, 0, 10);\n\t\t\n\tif (Mcs_tmp <= ValidMcs || Mcs_tmp == 32)\t\t\t\n\t\tHtMcs = Mcs_tmp;\t\n\telse\n\t\tHtMcs = MCS_AUTO;\t\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredTransmitSetting.field.MCS = HtMcs;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtMcs_Proc::(HtMcs=%d) for ra%d\\n\", \n\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredTransmitSetting.field.MCS, pObj->ioctl_if));\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS = HtMcs;\n\t\tpAd->StaCfg.bAutoTxRateSwitch = (HtMcs == MCS_AUTO) ? TRUE:FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtMcs_Proc::(HtMcs=%d, bAutoTxRateSwitch = %d)\\n\", \n\t\t\t\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.bAutoTxRateSwitch));\n\n\t\tif ((!WMODE_CAP_N(pAd->CommonCfg.PhyMode)) ||\n\t\t\t(pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))\n\t\t{\n\t\t\tif ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) && \n\t\t\t\t(HtMcs <= 3) && \n\t\t\t\t(pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_CCK))\n\t\t\t{\n\t\t\t\tRTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs] * 1000000));\n\t\t\t}\n\t\t\telse if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) && \n\t\t\t\t\t(HtMcs <= 7) &&\n\t            \t\t\t(pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_OFDM))\n\t\t\t{\n\t\t\t\tRTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs+4] * 1000000));\n\t\t\t}\n\t\t\telse\n\t\t\t\tbAutoRate = TRUE;\n\n\t\t\tif (bAutoRate)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\t\t\t\tRTMPSetDesiredRates(pAd, -1);\n\t\t\t}\n\t        DBGPRINT(RT_DEBUG_TRACE, (\"Set_HtMcs_Proc::(FixedTxMode=%d)\\n\",pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode));\n\t\t}\n        if (ADHOC_ON(pAd))\n            return TRUE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tSetCommonHT(pAd);\n\t\n\treturn TRUE;\n}\n\nINT\tSet_HtGi_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG HtGi;\n\n\tHtGi = simple_strtol(arg, 0, 10);\n\t\t\n\tif ( HtGi == GI_400)\t\t\t\n\t\tpAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;\n\telse if ( HtGi == GI_800 )\n\t\tpAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;\n\telse \n\t\treturn FALSE; /* Invalid argument */\n\n\tSetCommonHT(pAd);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtGi_Proc::(ShortGI=%d)\\n\",pAd->CommonCfg.RegTransmitSetting.field.ShortGI));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_HtTxBASize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR Size;\n\n\tSize = simple_strtol(arg, 0, 10);\n\t\t\n\tif (Size <=0 || Size >=64)\n\t{\n\t\tSize = 8;\n\t}\n\tpAd->CommonCfg.TxBASize = Size-1;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_HtTxBASize ::(TxBASize= %d)\\n\", Size));\n\n\treturn TRUE;\n}\n\nINT\tSet_HtDisallowTKIP_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\t\t\n\tif (Value == 1)\n\t{\n\t\tpAd->CommonCfg.HT_DisallowTKIP = TRUE;\n\t}\n\telse\n\t{\n\t\tpAd->CommonCfg.HT_DisallowTKIP = FALSE;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtDisallowTKIP_Proc ::%s\\n\", \n\t\t\t\t(pAd->CommonCfg.HT_DisallowTKIP == TRUE) ? \"enabled\" : \"disabled\"));\n\n\treturn TRUE;\n}\n\nINT\tSet_HtOpMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\n\tif (Value == HTMODE_GF)\n\t\tpAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_GF;\n\telse if ( Value == HTMODE_MM )\n\t\tpAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_MM;\n\telse \n\t\treturn FALSE; /*Invalid argument */\n\n\tSetCommonHT(pAd);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtOpMode_Proc::(HtOpMode=%d)\\n\",pAd->CommonCfg.RegTransmitSetting.field.HTMODE));\n\n\treturn TRUE;\n\n}\t\n\nINT\tSet_HtStbc_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\t\n\tif (Value == STBC_USE)\n\t\tpAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;\n\telse if ( Value == STBC_NONE )\n\t\tpAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;\n\telse \n\t\treturn FALSE; /*Invalid argument */\n\n\tSetCommonHT(pAd);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_Stbc_Proc::(HtStbc=%d)\\n\",pAd->CommonCfg.RegTransmitSetting.field.STBC));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\n}\n\nINT\tSet_HtHtc_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->HTCEnable = FALSE;\n\telse if ( Value ==1 )\n        pAd->HTCEnable = TRUE;\n\telse \n\t\treturn FALSE; /*Invalid argument \t*/\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtHtc_Proc::(HtHtc=%d)\\n\",pAd->HTCEnable));\n\n\treturn TRUE;\t\t\n}\n\t\t\t\nINT\tSet_HtExtcha_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\t\n\tif (Value == 0)\n\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA  = EXTCHA_BELOW;\n\telse if ( Value ==1 )\n\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;\n\telse \n\t\treturn FALSE; /*Invalid argument \t*/\n\t\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtExtcha_Proc::(HtExtcha=%d)\\n\",pAd->CommonCfg.RegTransmitSetting.field.EXTCHA));\n\n\treturn TRUE;\t\t\t\n}\n\nINT\tSet_HtMpduDensity_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\t\n\tif (Value <=7)\n\t\tpAd->CommonCfg.BACapability.field.MpduDensity = Value;\n\telse\n\t\tpAd->CommonCfg.BACapability.field.MpduDensity = 4;\n\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtMpduDensity_Proc::(HtMpduDensity=%d)\\n\",pAd->CommonCfg.BACapability.field.MpduDensity));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\n\nINT\tSet_HtBaWinSize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* Intel IOT*/\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tValue = 64;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif (Value >=1 && Value <= 64)\n\t{\n\t\tpAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;\n\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;\n\t}\n\telse\n\t{\n        pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;\n\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;\n\t}\n\t\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtBaWinSize_Proc::(HtBaWinSize=%d)\\n\",pAd->CommonCfg.BACapability.field.RxBAWinLimit));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\t\t\n\nINT\tSet_HtRdg_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\t\n\tif (Value == 0)\t\t\t\n\t\tpAd->CommonCfg.bRdg = FALSE;\n\telse if ( Value ==1 )\n\t{\n\t\tpAd->HTCEnable = TRUE;\n        pAd->CommonCfg.bRdg = TRUE;\n\t}\n\telse \n\t\treturn FALSE; /*Invalid argument*/\n\t\n\tSetCommonHT(pAd);\t\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtRdg_Proc::(HtRdg=%d)\\n\",pAd->CommonCfg.bRdg));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\t\t\n\nINT\tSet_HtLinkAdapt_Proc(\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->bLinkAdapt = FALSE;\n\telse if ( Value ==1 )\n\t{\n\t\t\tpAd->HTCEnable = TRUE;\n\t\t\tpAd->bLinkAdapt = TRUE;\n\t}\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtLinkAdapt_Proc::(HtLinkAdapt=%d)\\n\",pAd->bLinkAdapt));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\t\t\n\nINT\tSet_HtAmsdu_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;\n\telse if ( Value == 1 )\n        pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\t\n\tSetCommonHT(pAd);\t\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtAmsdu_Proc::(HtAmsdu=%d)\\n\",pAd->CommonCfg.BACapability.field.AmsduEnable));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\t\t\t\n\nINT\tSet_HtAutoBa_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t{\n\t\tpAd->CommonCfg.BACapability.field.AutoBA = FALSE;\n\t\tpAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;\n\t}\n    else if (Value == 1)\t\n    {\n\t\tpAd->CommonCfg.BACapability.field.AutoBA = TRUE;\n\t\tpAd->CommonCfg.BACapability.field.Policy = IMMED_BA;\n    }\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\t\n    pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;\n\tpAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;\n\tSetCommonHT(pAd);\t\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtAutoBa_Proc::(HtAutoBa=%d)\\n\",pAd->CommonCfg.BACapability.field.AutoBA));\n\n\treturn TRUE;\t\t\t\t\n\t\t\n}\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\nINT\tSet_HtProtect_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->CommonCfg.bHTProtect = FALSE;\n    else if (Value == 1)\t\n\t\tpAd->CommonCfg.bHTProtect = TRUE;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtProtect_Proc::(HtProtect=%d)\\n\",pAd->CommonCfg.bHTProtect));\n\n\treturn TRUE;\n}\n\nINT\tSet_SendPSMPAction_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    UCHAR mac[6], mode;\n\tPSTRING token;\n\tSTRING sepValue[] = \":\", DASH = '-';\n\tINT i;\n    MAC_TABLE_ENTRY *pEntry;\n\n    /*DBGPRINT(RT_DEBUG_TRACE,(\"\\n%s\\n\", arg));*/\n/*\n\tThe BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, \n\t\t=>The six 2 digit hex-decimal number previous are the Mac address, \n\t\t=>The seventh decimal number is the mode value.\n*/\n    if(strlen(arg) < 19)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 plus the \"-\" and mode value in decimal format.*/\n\t\treturn FALSE;\n\n   \ttoken = strchr(arg, DASH);\n\tif ((token != NULL) && (strlen(token)>1))\n\t{\n\t\tmode = simple_strtol((token+1), 0, 10);\n\t\tif (mode > MMPS_ENABLE)\n\t\t\treturn FALSE;\n\t\t\n\t\t*token = '\\0';\n\t\tfor (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)\n\t\t{\n\t\t\tif((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))\n\t\t\t\treturn FALSE;\n\t\t\tAtoH(token, (&mac[i]), 1);\n\t\t}\n\t\tif(i != 6)\n\t\t\treturn FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\", \n\t\t\t\t\t\t\t\tmac[0], mac[1], mac[2], mac[3], mac[4], mac[5], mode));\n\n\t\tpEntry = MacTableLookup(pAd, mac);\n\n\t\tif (pEntry) {\n\t\t    DBGPRINT(RT_DEBUG_OFF, (\"\\nSendPSMPAction MIPS mode = %d\\n\", mode));\n\t\t    SendPSMPAction(pAd, pEntry->Aid, mode);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n\n\n}\n\nINT\tSet_HtMIMOPSmode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\t\n\tif (Value <=3)\n\t\tpAd->CommonCfg.BACapability.field.MMPSmode = Value;\n\telse\n\t\tpAd->CommonCfg.BACapability.field.MMPSmode = 3;\n\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\\n\",pAd->CommonCfg.BACapability.field.MMPSmode));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n}\n\n#ifdef CONFIG_AP_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set Tx Stream number\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_HtTxStream_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG \tValue;\t\n\t\t\n\tValue = simple_strtol(arg, 0, 10);\n\n\tif ((Value <= 3) && (Value >= 1) && (Value <= pAd->Antenna.field.TxPath)) /* 3*3*/\n\t\tpAd->CommonCfg.TxStream = Value;\n\telse\n\t\tpAd->CommonCfg.TxStream = pAd->Antenna.field.TxPath;\n\n\tif ((pAd->MACVersion < RALINK_2883_VERSION) &&\n\t\t(pAd->CommonCfg.TxStream > 2))\n\t{\n\t\tpAd->CommonCfg.TxStream = 2; /* only 2 TX streams for RT2860 series*/\n\t}\n\n\tSetCommonHT(pAd);\n\n\tAPStop(pAd);\n\tAPStartUp(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtTxStream_Proc::(Tx Stream=%d)\\n\",pAd->CommonCfg.TxStream));\n\t\t\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Rx Stream number\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_HtRxStream_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG \tValue;\t\n\t\t\n\tValue = simple_strtol(arg, 0, 10);\n\n\tif ((Value <= 3) && (Value >= 1) && (Value <= pAd->Antenna.field.RxPath))\n\t\tpAd->CommonCfg.RxStream = Value;\n\telse\n\t\tpAd->CommonCfg.RxStream = pAd->Antenna.field.RxPath;\n\n\tif ((pAd->MACVersion < RALINK_2883_VERSION) &&\n\t\t(pAd->CommonCfg.RxStream > 2)) /* 3*3*/\n\t{\n\t\tpAd->CommonCfg.RxStream = 2; /* only 2 RX streams for RT2860 series*/\n\t}\n\n\tSetCommonHT(pAd);\n\n\tAPStop(pAd);\n\tAPStartUp(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtRxStream_Proc::(Rx Stream=%d)\\n\",pAd->CommonCfg.RxStream));\n\t\t\n\treturn TRUE;\n}\n\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\nINT\tSet_GreenAP_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t{\n\t\tpAd->ApCfg.bGreenAPActive=FALSE;\n\t\tpAd->ApCfg.bGreenAPEnable = FALSE;\n\t}\n\telse if (Value == 1)\t\n\t\tpAd->ApCfg.bGreenAPEnable = TRUE;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_GreenAP_Proc::(bGreenAPEnable=%d)\\n\",pAd->ApCfg.bGreenAPEnable));\n\n\treturn TRUE;\n}\n#endif /* GREENAP_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\nINT\tSet_ForceShortGI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->WIFItestbed.bShortGI = FALSE;\n\telse if (Value == 1)\t\n\t\tpAd->WIFItestbed.bShortGI = TRUE;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ForceShortGI_Proc::(ForceShortGI=%d)\\n\", pAd->WIFItestbed.bShortGI));\n\n\treturn TRUE;\n}\n\n\n\nINT\tSet_ForceGF_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->WIFItestbed.bGreenField = FALSE;\n\telse if (Value == 1)\t\n\t\tpAd->WIFItestbed.bGreenField = TRUE;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\n\tSetCommonHT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ForceGF_Proc::(ForceGF=%d)\\n\", pAd->WIFItestbed.bGreenField));\n\n\treturn TRUE;\n}\n\nINT\tSet_HtMimoPs_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\tif (Value == 0)\n\t\tpAd->CommonCfg.bMIMOPSEnable = FALSE;\n\telse if (Value == 1)\t\n\t\tpAd->CommonCfg.bMIMOPSEnable = TRUE;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_HtMimoPs_Proc::(HtMimoPs=%d)\\n\",pAd->CommonCfg.bMIMOPSEnable));\n\n\treturn TRUE;\n}\n\n\n#ifdef DOT11N_DRAFT3\nINT Set_HT_BssCoex_Proc(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPSTRING\t\t\t\tpParam)\n{\n\tUCHAR bBssCoexEnable = simple_strtol(pParam, 0, 10);\n\n\tpAd->CommonCfg.bBssCoexEnable = ((bBssCoexEnable == 1) ? TRUE: FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set bBssCoexEnable=%d!\\n\", pAd->CommonCfg.bBssCoexEnable));\n\t\n\treturn TRUE;\n}\n\n\nINT Set_HT_BssCoexApCntThr_Proc(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPSTRING\t\t\t\tpParam)\n{\n\tpAd->CommonCfg.BssCoexApCntThr = simple_strtol(pParam, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set BssCoexApCntThr=%d!\\n\", pAd->CommonCfg.BssCoexApCntThr));\n\t\n\treturn TRUE;\n}\n#endif /* DOT11N_DRAFT3 */\n\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef DOT11_VHT_AC\nINT\tSet_VhtBw_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg)\n{\n\tULONG vht_cw;\n\tUCHAR cent_ch;\n\tvht_cw = simple_strtol(arg, 0, 10);\n\n\n\tif (vht_cw == VHT_BW_80)\n\t\tpAd->CommonCfg.vht_bw = VHT_BW_80;\n\telse\n\t\tpAd->CommonCfg.vht_bw = VHT_BW_2040;\n\n#ifdef DOT11_VHT_AC\n\tif (!WMODE_CAP_AC(pAd->CommonCfg.PhyMode))\n\t\tgoto direct_done;\n\t\n\tSetCommonHT(pAd);\n\tif(pAd->CommonCfg.BBPCurrentBW == BW_80)\n\t\tcent_ch = pAd->CommonCfg.vht_cent_ch;\n\telse\n\t\tcent_ch = pAd->CommonCfg.CentralChannel;\n\n\tAsicSwitchChannel(pAd, cent_ch, FALSE);\n\tAsicLockChannel(pAd, cent_ch);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BW_%s, PrimaryChannel(%d), %s CentralChannel = %d, apply it immediately\\n\", \n\t\t\t\t\t\t(pAd->CommonCfg.BBPCurrentBW == BW_80 ? \"80\":\n\t\t\t\t\t\t\t(pAd->CommonCfg.BBPCurrentBW == BW_40 ? \"40\" :\n\t\t\t\t\t\t\t\"20\")),\n\t\t\t\t\t\tpAd->CommonCfg.Channel,\n\t\t\t\t\t\t(pAd->CommonCfg.BBPCurrentBW == BW_80 ? \"VHT\" : \"HT\"), cent_ch));\n\ndirect_done:\n#endif /* DOT11_VHT_AC */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_VhtBw_Proc::(VHT_BW=%d)\\n\", pAd->CommonCfg.vht_bw));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_VhtStbc_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg)\n{\n\tULONG Value;\n\t\n\tValue = simple_strtol(arg, 0, 10);\n\t\n\tif (Value == STBC_USE)\n\t\tpAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;\n\telse if ( Value == STBC_NONE )\n\t\tpAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;\n\telse \n\t\treturn FALSE; /*Invalid argument */\n\n\tSetCommonHT(pAd);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_Stbc_Proc::(HtStbc=%d)\\n\",pAd->CommonCfg.RegTransmitSetting.field.STBC));\n\n\treturn TRUE;\t\t\t\t\t\t\t\t\t\t\t\n}\n#endif /* DOT11_VHT_AC */\n\n\n\nINT\tSet_FixedTxMode_Proc(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* CONFIG_AP_SUPPORT */\t\t\n\tINT\tfix_tx_mode = RT_CfgSetFixedTxPhyMode(arg);\n\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tpAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():(FixedTxMode=%d)\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, fix_tx_mode));\n\n\treturn TRUE;\n}\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\nINT\tSet_OpMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\n#ifdef RTMP_MAC_USB\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n#endif /* RTMP_MAC_USB */\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can not switch operate mode on interface up !! \\n\"));\n\t\treturn FALSE;\n\t}\n\n\tif (Value == 0)\n\t\tpAd->OpMode = OPMODE_STA;\n\telse if (Value == 1)\t\n\t\tpAd->OpMode = OPMODE_AP;\n\telse\n\t\treturn FALSE; /*Invalid argument*/\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_OpMode_Proc::(OpMode=%s)\\n\", pAd->OpMode == 1 ? \"AP Mode\" : \"STA Mode\"));\n\n\treturn TRUE;\n}\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n/* ---------------------- DEBUG QUEUE ------------------------*/\n\n#define DBQ_LENGTH\t512\n#define DBQ_DATA_LENGTH\t8\n\n/* Define to include TX and RX HT Control field in log */\n/* #define DBQ_INCLUDE_HTC */\n\ntypedef\nstruct {\n\tUCHAR type;\t\t\t\t\t/* type of data*/\n\tULONG timestamp;\t\t\t/* sec/usec timestamp from gettimeofday*/\n\tUCHAR data[DBQ_DATA_LENGTH];\t/* data*/\n} DBQUEUE_ENTRY;\n\n/* Type field definitions */\n#define DBQ_TYPE_EMPTY\t0\n#define DBQ_TYPE_TXWI\t0x70\t\t/* TXWI*/\n#define DBQ_TYPE_TXHDR\t0x72\t\t/* TX Header*/\n#define DBQ_TYPE_TXFIFO\t0x73\t\t/* TX Stat FIFO*/\n#define DBQ_TYPE_RXWI\t0x78\t\t/* RXWI uses 0x78 to 0x7A for 5 longs*/\n#define DBQ_TYPE_RXHDR\t0x7B\t\t/* RX Header*/\n#define DBQ_TYPE_TXQHTC\t0x7c\t\t/* RX Qos+HT Control field*/\n#define DBQ_TYPE_RXQHTC\t0x7d\t\t/* RX Qos+HT Control field */\n#define DBQ_TYPE_RALOG\t0x7e\t\t/* RA Log */\n\n#define DBQ_INIT_SIG\t0x4442484E\t/* 'DBIN' - dbqInit initialized flag*/\n#define DBQ_ENA_SIG\t\t0x4442454E\t/* 'DBEN' - dbqEnable enabled flag*/\n\nstatic DBQUEUE_ENTRY dbQueue[DBQ_LENGTH];\nstatic ULONG dbqTail=0;\nstatic ULONG dbqEnable=0;\nstatic ULONG dbqInit=0;\n\n/* dbQueueInit - initialize Debug Queue variables and clear the queue*/\nvoid dbQueueInit(void)\n{\n\tint i;\n\n\tfor (i=0; i<DBQ_LENGTH; i++)\n\t\tdbQueue[i].type = DBQ_TYPE_EMPTY;\n\tdbqTail = 0;\n\tdbqInit = DBQ_INIT_SIG;\n}\n\n/* dbQueueEnqueue - enqueue data*/\nvoid dbQueueEnqueue(UCHAR type, UCHAR *data)\n{\n\tDBQUEUE_ENTRY *oldTail;\n\tstruct timeval tval;\n\n\tif (dbqEnable!=DBQ_ENA_SIG || data==NULL)\n\t\treturn;\n\n\tif (dbqInit!=DBQ_INIT_SIG || dbqTail>=DBQ_LENGTH)\n\t\tdbQueueInit();\n\n\toldTail = &dbQueue[dbqTail];\n\n\t/* Advance tail and mark as empty*/\n\tif (dbqTail >= DBQ_LENGTH-1)\n\t\tdbqTail = 0;\n\telse\n\t\tdbqTail++;\n\tdbQueue[dbqTail].type = DBQ_TYPE_EMPTY;\n\n\t/* Enqueue data*/\n\toldTail->type = type;\n\tdo_gettimeofday(&tval);\n\toldTail->timestamp = tval.tv_sec*1000000L + tval.tv_usec;\n\tmemcpy(oldTail->data, data, DBQ_DATA_LENGTH);\n}\n\nvoid dbQueueEnqueueTxFrame(UCHAR *pTxWI, UCHAR *pHeader_802_11)\n{\n\tdbQueueEnqueue(DBQ_TYPE_TXWI, pTxWI);\n\n\t/* 802.11 Header */\n\tif (pHeader_802_11 != NULL) {\n\t\tdbQueueEnqueue(DBQ_TYPE_TXHDR, pHeader_802_11);\n#ifdef DBQ_INCLUDE_HTC\n\t\t/* Qos+HT Control field */\n\t\tif ((pHeader_802_11[0] & 0x08) && (pHeader_802_11[1] & 0x80))\n\t\t\tdbQueueEnqueue(DBQ_TYPE_TXQHTC, pHeader_802_11+24);\n#endif /* DBQ_INCLUDE_HTC */\n\t}\n}\n\nvoid dbQueueEnqueueRxFrame(UCHAR *pRxWI, UCHAR *pHeader_802_11, ULONG flags)\n{\n\t/* Ignore Beacons if disabled */\n\tif ((flags & DBF_DBQ_NO_BCN) && (pHeader_802_11[0] & 0xfc)==0x80)\n\t\treturn;\n\n\t/* RXWI */\n\tdbQueueEnqueue(DBQ_TYPE_RXWI, pRxWI);\n\tif (flags & DBF_DBQ_RXWI_FULL) {\n\t\tdbQueueEnqueue(DBQ_TYPE_RXWI+1, pRxWI+8);\n\t\tdbQueueEnqueue(DBQ_TYPE_RXWI+2, pRxWI+16);\n\t}\n\n\t/* 802.11 Header */\n\tdbQueueEnqueue(DBQ_TYPE_RXHDR, (UCHAR *)pHeader_802_11);\n\n#ifdef DBQ_INCLUDE_HTC\n\t/* Qos+HT Control field */\n\tif ((pHeader_802_11[0] & 0x08) &&\n\t\t(pHeader_802_11[1] & 0x80))\n\t\tdbQueueEnqueue(DBQ_TYPE_RXQHTC, pHeader_802_11+24);\n#endif /* DBQ_INCLUDE_HTC */\n}\n\n\n/* dbQueueDisplayPhy - Display PHY rate */\nstatic void dbQueueDisplayPHY(USHORT phyRate)\n{\n\tstatic CHAR *mode[4] = {\" C\", \"oM\",\"mM\", \"gM\"};\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%2s%02d %c%c%c%c\",\n\t\t//(phyRate>>8) & 0xFF, phyRate & 0xFF,\n\t\tmode[(phyRate>>14) & 0x3],\t\t\t\t\t\t\t// Mode: c, o, m, g\n\t\tphyRate & 0x7F,\t\t\t\t\t\t\t\t\t\t// MCS\n\t\t(phyRate & 0x0100)? 'S': 'L',\t\t\t\t\t\t// Guard Int: S or L\n\t\t(phyRate & 0x0080)? '4': '2',\t\t\t\t\t\t// BW: 4 or 2\n\t\t(phyRate & 0x0200)? 'S': 's',\t\t\t\t\t\t// STBC:  S or s\n\t\t(phyRate & 0x2000)? 'I': ((phyRate & 0x800)? 'E': '_')\t// Beamforming:  E or I or _\n\t\t) );\n}\n\n/* dbQueueDump - dump contents of debug queue*/\nstatic void dbQueueDump(\n\tIN  PRTMP_ADAPTER   pAd,\n\tBOOLEAN decode)\n{\n\tDBQUEUE_ENTRY *oldTail;\n\tint i, origMCS, succMCS;\n\tULONG lastTimestamp=0;\n\tBOOLEAN showTimestamp;\n\tUSHORT phyRate;\n\n\tif (dbqInit!=DBQ_INIT_SIG || dbqTail>=DBQ_LENGTH)\n\t\treturn;\n\n\toldTail = &dbQueue[dbqTail];\n\n\tfor (i=0; i<DBQ_LENGTH; i++) {\n\t\tif (++oldTail >= &dbQueue[DBQ_LENGTH])\n\t\t\toldTail = dbQueue;\n\n\t\t/* Skip empty entries*/\n\t\tif (oldTail->type == DBQ_TYPE_EMPTY)\n\t\t\tcontinue;\n\n\t\tshowTimestamp = FALSE;\n\n\t\tswitch (oldTail->type) {\n\t\tcase 0x70:\t/* TXWI - 2 longs, MSB to LSB */\n\t\tcase 0x78:\t/* RXWI - 2 longs, MSB to LSB */\n\t\t\tshowTimestamp = TRUE;\n\n\t\t\tif (decode && oldTail->type==0x70) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\nTxWI \") );\n\t\t\t\tdbQueueDisplayPHY(oldTail->data[3]*256 + oldTail->data[2]);\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%c s=%03X %02X %s-\",\n\t\t\t\t\t\t(oldTail->data[0] & 0x10)? 'A': '_',\t\t\t\t// AMPDU\n\t\t\t\t\t\t(oldTail->data[7]*256 + oldTail->data[6]) & 0xFFF,\t// Size\n\t\t\t\t\t\toldTail->data[5],\t\t\t\t\t\t\t\t\t// WCID\n\t\t\t\t\t\t(oldTail->data[4] & 0x01)? \"AK\": \"NA\" ));\t\t\t// ACK/NACK\n\t\t\t}\n\t\t\telse if (decode && oldTail->type==0x78) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\nRxWI \") );\n\t\t\t\tdbQueueDisplayPHY(oldTail->data[7]*256 + oldTail->data[6]);\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\" s=%03X %02X %02X%01X-\",\n\t\t\t\t\t\t(oldTail->data[3]*256 + oldTail->data[2]) & 0xFFF,\t// Size\n\t\t\t\t\t\toldTail->data[0],\t\t\t\t\t\t\t\t\t// WCID\n\t\t\t\t\t\toldTail->data[5], oldTail->data[4]>>4 ));\t\t\t// Seq Number\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%cxWI %02X%02X %02X%02X-%02X%02X %02X%02X----\",\n\t\t\t\t\toldTail->type==0x70? 'T': 'R',\n\t\t\t\t\toldTail->data[3], oldTail->data[2], oldTail->data[1], oldTail->data[0],\n\t\t\t\t\toldTail->data[7], oldTail->data[6], oldTail->data[5], oldTail->data[4]) );\n\t\t\tbreak;\n\n\t\tcase 0x79:\t/* RXWI - next 2 longs, MSB to LSB */\n\t\t\tif (decode) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Rx2  %2d %2d %2d S:%d %d %d \",\n\t\t\t\t\t\tConvertToRssi(pAd, (CHAR)oldTail->data[0], RSSI_0),\n\t\t\t\t\t\tConvertToRssi(pAd, (CHAR)oldTail->data[1], RSSI_1),\n\t\t\t\t\t\tConvertToRssi(pAd, (CHAR)oldTail->data[2], RSSI_2),\n\t\t\t\t\t\t(oldTail->data[4]*3 + 8)/16,\n\t\t\t\t\t\t(oldTail->data[5]*3 + 8)/16,\n\t\t\t\t\t\t(oldTail->data[6]*3 + 8)/16) );\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Rx2  %02X%02X %02X%02X-%02X%02X %02X%02X    \",\n\t\t\t\t\t\toldTail->data[3], oldTail->data[2], oldTail->data[1], oldTail->data[0],\n\t\t\t\t\t\toldTail->data[7], oldTail->data[6], oldTail->data[5], oldTail->data[4]) );\n\t\t\tbreak;\n\n\n\t\tcase 0x7c:\t/* TX HTC+QoS, 6 bytes, MSB to LSB */\n\t\tcase 0x7d:\t/* RX HTC+QoS, 6 bytes, MSB to LSB */\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%cxHTC  H:%02X%02X%02X%02X Q:%02X%02X   \",\n\t\t\t\t\toldTail->type==0x7c? 'T': 'R',\n\t\t\t\t\toldTail->data[5], oldTail->data[4], oldTail->data[3], oldTail->data[2],\n\t\t\t\t\toldTail->data[1], oldTail->data[0]) );\n\t\t\tbreak;\n\n\t\tcase 0x72:\t/* Tx 802.11 header, MSB to LSB, translate type/subtype*/\n\t\tcase 0x7b:\t/* Rx*/\n\t\t\t{\n\t\t\tUCHAR tCode;\n\t\t\tstruct _typeTableEntry {\n\t\t\t\tUCHAR code;\t/* Type/subtype*/\n\t\t\t\tCHAR  str[4];\n\t\t\t} *pTab;\n\t\t\tstatic struct _typeTableEntry typeTable[] = {\n\t\t\t\t{0x00, \"mARq\"}, {0x01, \"mARp\"}, {0x02, \"mRRq\"}, {0x03, \"mRRp\"},\n\t\t\t\t{0x04, \"mPRq\"}, {0x05, \"mPRp\"}, {0x08, \"mBcn\"}, {0x09, \"mATI\"},\n\t\t\t\t{0x0a, \"mDis\"}, {0x0b, \"mAut\"}, {0x0c, \"mDAu\"}, {0x0d, \"mAct\"},\n\t\t\t\t{0x0e, \"mANA\"},\n\t\t\t\t{0x17, \"cCWr\"}, {0x18, \"cBAR\"}, {0x19, \"cBAc\"}, {0x1a, \"cPSP\"},\n\t\t\t\t{0x1b, \"cRTS\"}, {0x1c, \"cCTS\"}, {0x1d, \"cACK\"}, {0x1e, \"cCFE\"},\n\t\t\t\t{0x1f, \"cCEA\"},\n\t\t\t\t{0x20, \"dDat\"}, {0x21, \"dDCA\"}, {0x22, \"dDCP\"}, {0x23, \"dDAP\"},\n\t\t\t\t{0x24, \"dNul\"}, {0x25, \"dCFA\"}, {0x26, \"dCFP\"}, {0x27, \"dCAP\"},\n\t\t\t\t{0x28, \"dQDa\"}, {0x29, \"dQCA\"}, {0x2a, \"dQCP\"}, {0x2b, \"dQAP\"},\n\t\t\t\t{0x2c, \"dQNu\"}, {0x2e, \"dQNP\"}, {0x2f, \"dQNA\"},\n\t\t\t\t{0xFF, \"RESV\"}};\n\n\t\t\ttCode = ((oldTail->data[0]<<2) & 0x30) | ((oldTail->data[0]>>4) & 0xF);\n\t\t\tfor (pTab=typeTable; pTab->code!=0xFF; pTab++) {\n\t\t\t\tif (pTab->code == tCode)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%cxH  %c%c%c%c [%02X%02X %02X%02X]       \\n\",\n\t\t\t\t\toldTail->type==0x72? 'T': 'R',\n\t\t\t\t\tpTab->str[0], pTab->str[1], pTab->str[2], pTab->str[3],\n\t\t\t\t\toldTail->data[3], oldTail->data[2], oldTail->data[1], oldTail->data[0]) );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 0x73:\t/* TX STAT FIFO*/\n\t\t\tshowTimestamp = TRUE;\n\n\t\t\t/* origMCS is limited to 4 bits. Check for case of MCS16 to 23*/\n\t\t\torigMCS = (oldTail->data[0]>>1) & 0xF;\n\t\t\tsuccMCS = (oldTail->data[2] & 0x7F);\n\t\t\tif (succMCS>origMCS && origMCS<8)\n\t\t\t\torigMCS += 16;\n\t\t\tphyRate = (oldTail->data[3]<<8) + oldTail->data[2];\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"TxFI %02X%02X%02X%02X=%c%c%c%c%c M%02d/%02d%c%c\",\n\t\t\t\t\toldTail->data[3], oldTail->data[2],\n\t\t\t\t\toldTail->data[1], oldTail->data[0],\n\t\t\t\t\t(phyRate & 0x0100)? 'S': 'L',\t\t\t\t/* Guard Int:    S or L */\n\t\t\t\t\t(phyRate & 0x0080)? '4': '2',\t\t\t\t/* BW: \t\t\t 4 or 2 */\n\t\t\t\t\t(phyRate & 0x0200)? 'S': 's',\t\t\t\t/* STBC:         S or s */\n\t\t\t\t\t(phyRate & 0x2000)? 'I': ((phyRate & 0x0800)? 'E': '_'), /* Beamforming:  E or I or _ */\n\t\t\t\t\t(oldTail->data[0] & 0x40)? 'A': '_',\t\t/* Aggregated:   A or _ */\n\t\t\t\t\tsuccMCS, origMCS,\t\t\t\t\t\t\t/* MCS:          <Final>/<orig> */\n\t\t\t\t\tsuccMCS==origMCS? ' ': '*',\t\t\t\t\t/* Retry:        '*' if MCS doesn't match */\n\t\t\t\t\t(oldTail->data[0] & 0x20)? ' ': 'F') );\t\t/* Success/Fail  _ or F */\n\t\t\tbreak;\n\t\tcase 0x7E:\t/* RA Log info */\n\t\t\t{\n\t\t\t\tstruct {USHORT phy; USHORT per; USHORT tp; USHORT bfPer;} *p = (void*)(oldTail->data);\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"RALog %02X%02X %d %d %d    \",\n\t\t\t\t\t\t\t\t\t\t\t(p->phy>>8) & 0xFF, p->phy & 0xFF, p->per, p->tp, p->bfPer) );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%02X   %02X%02X %02X%02X %02X%02X %02X%02X   \", oldTail->type,\n\t\t\t\t\toldTail->data[0], oldTail->data[1], oldTail->data[2], oldTail->data[3], \n\t\t\t\t\toldTail->data[4], oldTail->data[5], oldTail->data[6], oldTail->data[7]) );\n\t\t\tbreak;\n\t\t}\n\n\t\tif (showTimestamp)\n\t\t{\n\t\t\tULONG t = oldTail->timestamp;\n\t\t\tULONG dt = oldTail->timestamp-lastTimestamp;\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%lu.%06lu \", t/1000000L, t % 1000000L) );\n\n\t\t\tif (dt>999999L)\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"+%lu.%06lu s\\n\", dt/1000000L, dt % 1000000L) );\n\t\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"+%lu us\\n\", dt) );\n\t\t\tlastTimestamp = oldTail->timestamp;\n\t\t}\n\t}\n}\n\n/*\n\tSet_DebugQueue_Proc - Control DBQueue\n\t\tiwpriv ra0 set DBQueue=dd.\n\t\t\tdd: 0=>disable, 1=>enable, 2=>dump, 3=>clear, 4=>dump & decode\n*/\nINT Set_DebugQueue_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n    ULONG argValue = simple_strtol(arg, 0, 10);\n\n\tswitch (argValue) {\n\tcase 0:\n\t\tdbqEnable = 0;\n\t\tbreak;\n\tcase 1:\n\t\tdbqEnable = DBQ_ENA_SIG;\n\t\tbreak;\n\tcase 2:\n\t\tdbQueueDump(pAd, FALSE);\n\t\tbreak;\n\tcase 3:\n\t\tdbQueueInit();\n\t\tbreak;\n\tcase 4:\n\t\tdbQueueDump(pAd, TRUE);\n\t\tbreak;\n\tdefault:\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tSet the enable/disable the stream mode\n\t\t\n\tArguments:\n\t\t1:\tenable for 1SS \n\t\t2:\tenable for 2SS\n\t\t3:\tenable for 1SS and 2SS\n\t\t0:\tdisable\n\n\tNotes:\n\t\tCurrently only support 1SS\n\t========================================================================\n*/\nINT Set_StreamMode_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tUINT32 streamWord, reg, regAddr;\n\t\n\tif (pAd->chipCap.FlgHwStreamMode == FALSE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"chip not supported feature\\n\"));\n\t\treturn FALSE;\n\t}\n\t\n\tpAd->CommonCfg.StreamMode = (simple_strtol(arg, 0, 10) & 0x3);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():StreamMode=%d\\n\", __FUNCTION__, pAd->CommonCfg.StreamMode));\n\n\tstreamWord = StreamModeRegVal(pAd);\n\tfor (regAddr = TX_CHAIN_ADDR0_H; regAddr <= TX_CHAIN_ADDR3_H; regAddr += 8)\n\t{\n\t\tRTMP_IO_READ32(pAd, regAddr, &reg);\n\t\treg &= (~0x000F0000);\n\t\tRTMP_IO_WRITE32(pAd, regAddr, streamWord | reg);\n\t}\n\n\treturn TRUE;\n}\n\n\nINT Set_StreamModeMac_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\treturn FALSE;\n}\n\n\nINT Set_StreamModeMCS_Proc(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PSTRING         arg)\n{\n\tpAd->CommonCfg.StreamModeMCS = simple_strtol(arg, 0, 16);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():StreamModeMCS=%02X\\n\", \n\t\t\t\t__FUNCTION__, pAd->CommonCfg.StreamModeMCS));\n\t\n\treturn TRUE;\n}\n#endif /* STREAM_MODE_SUPPORT */\n\n\n#ifdef PRE_ANT_SWITCH\n/*\n\tSet_PreAntSwitch_Proc - enable/disable Preamble Antenna Switch\n\t\tusage: iwpriv ra0 set PreAntSwitch=[0 | 1]\n*/\nINT Set_PreAntSwitch_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n    pAd->CommonCfg.PreAntSwitch = simple_strtol(arg, 0, 10)!=0;\n    DBGPRINT(RT_DEBUG_TRACE, (\"%s():(PreAntSwitch=%d)\\n\",\n\t\t\t\t__FUNCTION__, pAd->CommonCfg.PreAntSwitch));\n\treturn TRUE;\n}\n\n\n/*\n\tSet_PreAntSwitchRSSI_Proc - set Preamble Antenna Switch RSSI threshold\n\t\tusage: iwpriv ra0 set PreAntSwitchRSSI=<RSSI threshold in dBm>\n*/\nINT Set_PreAntSwitchRSSI_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg)\n{\n    pAd->CommonCfg.PreAntSwitchRSSI = simple_strtol(arg, 0, 10);\n    DBGPRINT(RT_DEBUG_TRACE, (\"%s():(PreAntSwitchRSSI=%d)\\n\", \n\t\t\t\t__FUNCTION__, pAd->CommonCfg.PreAntSwitchRSSI));\n\treturn TRUE;\n}\n\n/*\n\tSet_PreAntSwitchTimeout_Proc - set Preamble Antenna Switch Timeout threshold\n\t\tusage: iwpriv ra0 set PreAntSwitchTimeout=<timeout in seconds, 0=>disabled>\n*/\nINT Set_PreAntSwitchTimeout_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg)\n{\n    pAd->CommonCfg.PreAntSwitchTimeout = simple_strtol(arg, 0, 10);\n    DBGPRINT(RT_DEBUG_TRACE, (\"%s():(PreAntSwitchTimeout=%d)\\n\", \n\t\t\t\t__FUNCTION__, pAd->CommonCfg.PreAntSwitchTimeout));\n\treturn TRUE;\n}\n#endif /* PRE_ANT_SWITCH */\n\n\n\n\n#ifdef CFO_TRACK\n/*\n\tSet_CFOTrack_Proc - enable/disable CFOTrack\n\t\tusage: iwpriv ra0 set CFOTrack=[0..8]\n*/\nINT Set_CFOTrack_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg)\n{\n    pAd->CommonCfg.CFOTrack = simple_strtol(arg, 0, 10);\n    DBGPRINT(RT_DEBUG_TRACE, (\"%s():(CFOTrack=%d)\\n\",\n\t\t\t\t__FUNCTION__, pAd->CommonCfg.CFOTrack));\n\treturn TRUE;\n}\n#endif /* CFO_TRACK */\n\n\n#ifdef DBG_CTRL_SUPPORT\nINT Set_DebugFlags_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n    pAd->CommonCfg.DebugFlags = simple_strtol(arg, 0, 16);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_DebugFlags_Proc::(DebugFlags=%02lX)\\n\", pAd->CommonCfg.DebugFlags));\n\treturn TRUE;\n}\n#endif /* DBG_CTRL_SUPPORT */\n\n\n\n\n\n\nINT Set_LongRetryLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ)\n{\n\tTX_RTY_CFG_STRUC\ttx_rty_cfg;\n\tUCHAR\t\t\t\tLongRetryLimit = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tRTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word);\n\ttx_rty_cfg.field.LongRtyLimit = LongRetryLimit;\n\tRTMP_IO_WRITE32(pAdapter, TX_RTY_CFG, tx_rty_cfg.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_LongRetryLimit_Proc::(tx_rty_cfg=0x%x)\\n\", tx_rty_cfg.word));\n\treturn TRUE;\n}\n\nINT Set_ShortRetryLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ)\n{\n\tTX_RTY_CFG_STRUC\ttx_rty_cfg;\n\tUCHAR\t\t\t\tShortRetryLimit = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tRTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word);\n\ttx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit;\n\tRTMP_IO_WRITE32(pAdapter, TX_RTY_CFG, tx_rty_cfg.word);\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_ShortRetryLimit_Proc::(tx_rty_cfg=0x%x)\\n\", tx_rty_cfg.word));\n\treturn TRUE;\n}\n\nINT Set_AutoFallBack_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ)\n{\n\treturn RT_CfgSetAutoFallBack(pAdapter, arg);\n}\n\n\n\nPSTRING RTMPGetRalinkAuthModeStr(\n    IN  NDIS_802_11_AUTHENTICATION_MODE authMode)\n{\n\tswitch(authMode)\n\t{\n\t\tcase Ndis802_11AuthModeOpen:\n\t\t\treturn \"OPEN\";\n\t\tcase Ndis802_11AuthModeWPAPSK:\n\t\t\treturn \"WPAPSK\";\n\t\tcase Ndis802_11AuthModeShared:\n\t\t\treturn \"SHARED\";\n\t\tcase Ndis802_11AuthModeAutoSwitch:\n\t\t\treturn \"WEPAUTO\";\n\t\tcase Ndis802_11AuthModeWPA:\n\t\t\treturn \"WPA\";\n\t\tcase Ndis802_11AuthModeWPA2:\n\t\t\treturn \"WPA2\";\n\t\tcase Ndis802_11AuthModeWPA2PSK:\n\t\t\treturn \"WPA2PSK\";\n        case Ndis802_11AuthModeWPA1PSKWPA2PSK:\n\t\t\treturn \"WPAPSKWPA2PSK\";\n        case Ndis802_11AuthModeWPA1WPA2:\n\t\t\treturn \"WPA1WPA2\";\n\t\tcase Ndis802_11AuthModeWPANone:\n\t\t\treturn \"WPANONE\";\n\t\tdefault:\n\t\t\treturn \"UNKNOW\";\n\t}\n}\n\nPSTRING RTMPGetRalinkEncryModeStr(\n    IN  USHORT encryMode)\n{\n\tswitch(encryMode)\n\t{\n\t\tcase Ndis802_11WEPDisabled:\n\t\t\treturn \"NONE\";\n\t\tcase Ndis802_11WEPEnabled:\n\t\t\treturn \"WEP\";        \n\t\tcase Ndis802_11Encryption2Enabled:\n\t\t\treturn \"TKIP\";\n\t\tcase Ndis802_11Encryption3Enabled:\n\t\t\treturn \"AES\";\n        case Ndis802_11Encryption4Enabled:\n\t\t\treturn \"TKIPAES\";\n\t\tdefault:\n\t\t\treturn \"UNKNOW\";\n\t}\n}\n\n\nINT\tShow_SSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tUCHAR\tssid_str[33];\n\n\n\tNdisZeroMemory(&ssid_str[0], 33);\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\tNdisMoveMemory(&ssid_str[0], \n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, \n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tNdisMoveMemory(&ssid_str[0], \n\t\t\t\t\t\tpAd->CommonCfg.Ssid,\n\t\t\t\t\t\tpAd->CommonCfg.SsidLen);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tsnprintf(pBuf, BufLen, \"\\t%s\", ssid_str);\n\treturn 0;\n}\n\nINT\tShow_WirelessMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->CommonCfg.PhyMode)\n\t{\n\t\tcase (WMODE_B | WMODE_G):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11B/G\");\n\t\t\tbreak;\n\t\tcase (WMODE_B):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11B\");\n\t\t\tbreak;\n\t\tcase (WMODE_A):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11A\");\n\t\t\tbreak;\n\t\tcase (WMODE_A | WMODE_B | WMODE_G):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11A/B/G\");\n\t\t\tbreak;\n\t\tcase (WMODE_G):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11G\");\n\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_A | WMODE_B | WMODE_G | WMODE_GN | WMODE_AN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11A/B/G/N\");\n\t\t\tbreak;\n\t\tcase (WMODE_GN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11N only with 2.4G\");\n\t\t\tbreak;\n\t\tcase (WMODE_G | WMODE_GN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11G/N\");\n\t\t\tbreak;\n\t\tcase (WMODE_A | WMODE_AN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11A/N\");\n\t\t\tbreak;\n\t\tcase (WMODE_B | WMODE_G | WMODE_GN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11B/G/N\");\n\t\t\tbreak;\n\t\tcase (WMODE_A | WMODE_G | WMODE_GN | WMODE_AN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11A/G/N\");\n\t\t\tbreak;\n\t\tcase (WMODE_AN):\n\t\t\tsnprintf(pBuf, BufLen, \"\\t11N only with 5G\");\n\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%d)\", pAd->CommonCfg.PhyMode);\n\t\t\tbreak;\n\t}\n\n\treturn 0;\n}\n\n\nINT\tShow_TxBurst_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.bEnableTxBurst ? \"TRUE\":\"FALSE\");\n\treturn 0;\n}\n\nINT\tShow_TxPreamble_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->CommonCfg.TxPreamble)\n\t{\n\t\tcase Rt802_11PreambleShort:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tShort\");\n\t\t\tbreak;\n\t\tcase Rt802_11PreambleLong:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tLong\");\n\t\t\tbreak;\n\t\tcase Rt802_11PreambleAuto:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tAuto\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknown Value(%lu)\", pAd->CommonCfg.TxPreamble);\n\t\t\tbreak;\n\t}\n\t\n\treturn 0;\n}\n\nINT\tShow_TxPower_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%lu\", pAd->CommonCfg.TxPowerPercentage);\n\treturn 0;\n}\n\nINT\tShow_Channel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%d\", pAd->CommonCfg.Channel);\n\treturn 0;\n}\n\nINT\tShow_BGProtection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->CommonCfg.UseBGProtection)\n\t{\n\t\tcase 1: /*Always On*/\n\t\t\tsnprintf(pBuf, BufLen, \"\\tON\");\n\t\t\tbreak;\n\t\tcase 2: /*Always OFF*/\n\t\t\tsnprintf(pBuf, BufLen, \"\\tOFF\");\n\t\t\tbreak;\n\t\tcase 0: /*AUTO*/\n\t\t\tsnprintf(pBuf, BufLen, \"\\tAuto\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%lu)\", pAd->CommonCfg.UseBGProtection);\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n\nINT\tShow_RTSThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%u\", pAd->CommonCfg.RtsThreshold);\n\treturn 0;\n}\n\nINT\tShow_FragThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%u\", pAd->CommonCfg.FragmentThreshold);\n\treturn 0;\n}\n\n#ifdef DOT11_N_SUPPORT\nINT\tShow_HtBw_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tif (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t{\n\t\tsnprintf(pBuf, BufLen, \"\\t40 MHz\");\n\t}\n\telse\n\t{\n        snprintf(pBuf, BufLen, \"\\t20 MHz\");\n\t}\n\treturn 0;\n}\n\nINT\tShow_HtMcs_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tsnprintf(pBuf, BufLen, \"\\t%u\", pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredTransmitSetting.field.MCS);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tsnprintf(pBuf, BufLen, \"\\t%u\", pAd->StaCfg.DesiredTransmitSetting.field.MCS);\n#endif /* CONFIG_STA_SUPPORT */\n\treturn 0;\n}\n\nINT\tShow_HtGi_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI)\n\t{\n\t\tcase GI_400:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tGI_400\");\n\t\t\tbreak;\n\t\tcase GI_800:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tGI_800\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%u)\", pAd->CommonCfg.RegTransmitSetting.field.ShortGI);\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n\nINT\tShow_HtOpMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE)\n\t{\n\t\tcase HTMODE_GF:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tGF\");\n\t\t\tbreak;\n\t\tcase HTMODE_MM:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tMM\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%u)\", pAd->CommonCfg.RegTransmitSetting.field.HTMODE);\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n\nINT\tShow_HtExtcha_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)\n\t{\n\t\tcase EXTCHA_BELOW:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tBelow\");\n\t\t\tbreak;\n\t\tcase EXTCHA_ABOVE:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tAbove\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%u)\", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA);\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n\n\nINT\tShow_HtMpduDensity_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%u\", pAd->CommonCfg.BACapability.field.MpduDensity);\n\treturn 0;\n}\n\nINT\tShow_HtBaWinSize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%u\", pAd->CommonCfg.BACapability.field.RxBAWinLimit);\n\treturn 0;\n}\n\nINT\tShow_HtRdg_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.bRdg ? \"TRUE\":\"FALSE\");\n\treturn 0;\n}\n\nINT\tShow_HtAmsdu_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.BACapability.field.AmsduEnable ? \"TRUE\":\"FALSE\");\n\treturn 0;\n}\n\nINT\tShow_HtAutoBa_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.BACapability.field.AutoBA ? \"TRUE\":\"FALSE\");\n\treturn 0;\n}\n#endif /* DOT11_N_SUPPORT */\n\nINT\tShow_CountryRegion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%d\", pAd->CommonCfg.CountryRegion);\n\treturn 0;\n}\n\nINT\tShow_CountryRegionABand_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%d\", pAd->CommonCfg.CountryRegionForABand);\n\treturn 0;\n}\n\nINT\tShow_CountryCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.CountryCode);\n\treturn 0;\n}\n\n#ifdef AGGREGATION_SUPPORT\nINT\tShow_PktAggregate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.bAggregationCapable ? \"TRUE\":\"FALSE\");\n\treturn 0;\n}\n#endif /* AGGREGATION_SUPPORT */\n\n#ifdef WMM_SUPPORT\nINT\tShow_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable ? \"TRUE\":\"FALSE\");\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.bWmmCapable ? \"TRUE\":\"FALSE\");\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\treturn 0;\n}\n#endif /* WMM_SUPPORT */\n\nINT\tShow_IEEE80211H_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\t%s\", pAd->CommonCfg.bIEEE80211H ? \"TRUE\":\"FALSE\");\n\treturn 0;\n}\n\n#ifdef CONFIG_STA_SUPPORT\nINT\tShow_NetworkType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->StaCfg.BssType)\n\t{\n\t\tcase BSS_ADHOC:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tAdhoc\");\n\t\t\tbreak;\n\t\tcase BSS_INFRA:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tInfra\");\n\t\t\tbreak;\n\t\tcase BSS_ANY:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tAny\");\n\t\t\tbreak;\n\t\tcase BSS_MONITOR:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tMonitor\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsprintf(pBuf, \"\\tUnknow Value(%d)\", pAd->StaCfg.BssType);\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n\n#ifdef WSC_STA_SUPPORT\nINT\tShow_WpsPbcBand_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tswitch(pAd->StaCfg.WscControl.WpsApBand)\n\t{\n\t\tcase PREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST:\n\t\t\tsnprintf(pBuf, BufLen, \"\\t2.4G\");\n\t\t\tbreak;\n\t\tcase PREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST:\n\t\t\tsnprintf(pBuf, BufLen, \"\\t5G\");\n\t\t\tbreak;\n\t\tcase PREFERRED_WPS_AP_PHY_TYPE_AUTO_SELECTION:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tAuto\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%d)\", pAd->StaCfg.WscControl.WpsApBand);\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n#endif /* WSC_STA_SUPPORT */\n\nINT\tShow_WPAPSK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tif ((pAd->StaCfg.WpaPassPhraseLen >= 8) &&\n\t\t(pAd->StaCfg.WpaPassPhraseLen < 64))\n\t\tsnprintf(pBuf, BufLen, \"\\tWPAPSK = %s\", pAd->StaCfg.WpaPassPhrase);\n\telse\n\t{\n\t\tINT idx;\n\t\tsnprintf(pBuf, BufLen, \"\\tWPAPSK = \");\n\t\tfor (idx = 0; idx < 32; idx++)\n\t\t\tsnprintf(pBuf+strlen(pBuf), BufLen-strlen(pBuf), \"%02X\", pAd->StaCfg.WpaPassPhrase[idx]);\t\n\t}\n\n\treturn 0;\n}\n\nINT\tShow_AutoReconnect_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\tAutoReconnect = %d\", pAd->StaCfg.bAutoReconnect);\n\treturn 0;\n}\n\n#endif /* CONFIG_STA_SUPPORT */\n\nINT\tShow_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tNDIS_802_11_AUTHENTICATION_MODE\tAuthMode = Ndis802_11AuthModeOpen; \n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAuthMode = pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tAuthMode = pAd->StaCfg.AuthMode;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif ((AuthMode >= Ndis802_11AuthModeOpen) && \n\t\t(AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", RTMPGetRalinkAuthModeStr(AuthMode));\n#ifdef WAPI_SUPPORT\n\telse if (AuthMode == Ndis802_11AuthModeWAICERT)\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", \"WAI_CERT\");\n\telse if (AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", \"WAI_PSK\");\t\t\t\t \n#endif /* WAPI_SUPPORT */\n\telse\n\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%d)\", AuthMode);\n\t\n\treturn 0;\n}\n\nINT\tShow_EncrypType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tNDIS_802_11_WEP_STATUS\tWepStatus = Ndis802_11WEPDisabled;\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tWepStatus = pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tWepStatus = pAd->StaCfg.WepStatus;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif ((WepStatus >= Ndis802_11WEPEnabled) && \n\t\t(WepStatus <= Ndis802_11Encryption4KeyAbsent))\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", RTMPGetRalinkEncryModeStr(WepStatus));\n#ifdef WAPI_SUPPORT\n\telse if (WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\tsnprintf(pBuf, BufLen, \"\\t%s\", \"WPI_SMS4\");\n#endif /* WAPI_SUPPORT */\n\telse\n\t\tsnprintf(pBuf, BufLen, \"\\tUnknow Value(%d)\", WepStatus);\n\t\n\treturn 0;\n}\n\nINT\tShow_DefaultKeyID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tUCHAR DefaultKeyId = 0;\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tDefaultKeyId = pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tDefaultKeyId = pAd->StaCfg.DefaultKeyId;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tsnprintf(pBuf, BufLen, \"\\t%d\", DefaultKeyId);\n\n\treturn 0;\n}\n\nINT\tShow_WepKey_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  INT\t\t\t\tKeyIdx,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tUCHAR   Key[16] = {0}, KeyLength = 0;\n\tINT\t\tindex = BSS0;\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tindex = pObj->ioctl_if;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tKeyLength = pAd->SharedKey[index][KeyIdx].KeyLen;\n\tNdisMoveMemory(Key, pAd->SharedKey[index][KeyIdx].Key, KeyLength);\t\t\n\t\t\n\t/*check key string is ASCII or not*/\n    if (RTMPCheckStrPrintAble((PCHAR)Key, KeyLength))\n        sprintf(pBuf, \"\\t%s\", Key);\n    else\n    {\n        int idx;\n        sprintf(pBuf, \"\\t\");\n        for (idx = 0; idx < KeyLength; idx++)\n            sprintf(pBuf+strlen(pBuf), \"%02X\", Key[idx]);\n    }\n\treturn 0;\n}\n\nINT\tShow_Key1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tShow_WepKey_Proc(pAd, 0, pBuf, BufLen);\n\treturn 0;\n}\n\nINT\tShow_Key2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tShow_WepKey_Proc(pAd, 1, pBuf, BufLen);\n\treturn 0;\n}\n\nINT\tShow_Key3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tShow_WepKey_Proc(pAd, 2, pBuf, BufLen);\n\treturn 0;\n}\n\nINT\tShow_Key4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tShow_WepKey_Proc(pAd, 3, pBuf, BufLen);\n\treturn 0;\n}\n\nINT\tShow_PMK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tINT \tidx;\n\tUCHAR\tPMK[32] = {0};\n\n#ifdef CONFIG_AP_SUPPORT    \n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tNdisMoveMemory(PMK, pAd->ApCfg.MBSSID[pObj->ioctl_if].PMK, 32);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tNdisMoveMemory(PMK, pAd->StaCfg.PMK, 32);\n#endif /* CONFIG_STA_SUPPORT */\n\t\n    sprintf(pBuf, \"\\tPMK = \");\n    for (idx = 0; idx < 32; idx++)\n        sprintf(pBuf+strlen(pBuf), \"%02X\", PMK[idx]);\n\n\treturn 0;\n}\n\n\nINT\tShow_STA_RAInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsprintf(pBuf, \"\\n\");\n#ifdef PRE_ANT_SWITCH\n\tsprintf(pBuf+strlen(pBuf), \"PreAntSwitch: %d\\n\", pAd->CommonCfg.PreAntSwitch);\n\tsprintf(pBuf+strlen(pBuf), \"PreAntSwitchRSSI: %d\\n\", pAd->CommonCfg.PreAntSwitchRSSI);\n#endif /* PRE_ANT_SWITCH */\n\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tsprintf(pBuf+strlen(pBuf), \"LowTrafficThrd: %d\\n\", pAd->CommonCfg.lowTrafficThrd);\n\tsprintf(pBuf+strlen(pBuf), \"TrainUpRule: %d\\n\", pAd->CommonCfg.TrainUpRule);\n\tsprintf(pBuf+strlen(pBuf), \"TrainUpRuleRSSI: %d\\n\", pAd->CommonCfg.TrainUpRuleRSSI);\n\tsprintf(pBuf+strlen(pBuf), \"TrainUpLowThrd: %d\\n\", pAd->CommonCfg.TrainUpLowThrd);\n\tsprintf(pBuf+strlen(pBuf), \"TrainUpHighThrd: %d\\n\", pAd->CommonCfg.TrainUpHighThrd);\n#endif // NEW_RATE_ADAPT_SUPPORT //\n\n#ifdef STREAM_MODE_SUPPORT\n\tsprintf(pBuf+strlen(pBuf), \"StreamMode: %d\\n\", pAd->CommonCfg.StreamMode);\n\tsprintf(pBuf+strlen(pBuf), \"StreamModeMCS: 0x%04x\\n\", pAd->CommonCfg.StreamModeMCS);\n#endif // STREAM_MODE_SUPPORT //\n#ifdef TXBF_SUPPORT\n\tsprintf(pBuf+strlen(pBuf), \"ITxBfEn: %d\\n\", pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn);\n\tsprintf(pBuf+strlen(pBuf), \"ITxBfTimeout: %ld\\n\", pAd->CommonCfg.ITxBfTimeout);\n\tsprintf(pBuf+strlen(pBuf), \"ETxBfTimeout: %ld\\n\", pAd->CommonCfg.ETxBfTimeout);\n\tsprintf(pBuf+strlen(pBuf), \"ETxBfEnCond: %ld\\n\", pAd->CommonCfg.ETxBfEnCond);\n\tsprintf(pBuf+strlen(pBuf), \"ETxBfNoncompress: %d\\n\", pAd->CommonCfg.ETxBfNoncompress);\n\tsprintf(pBuf+strlen(pBuf), \"ETxBfIncapable: %d\\n\", pAd->CommonCfg.ETxBfIncapable);\n#endif // TXBF_SUPPORT //\n\n#ifdef DBG_CTRL_SUPPORT\n\tsprintf(pBuf+strlen(pBuf), \"DebugFlags: 0x%lx\\n\", pAd->CommonCfg.DebugFlags);\n#endif /* DBG_CTRL_SUPPORT */\n\treturn 0;\n}\n\n\nINT show_devinfo_proc(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tUCHAR *pstr;\n\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Device MAC\\n\"));\n\tif (pAd->OpMode == OPMODE_AP)\n\t\tpstr = \"AP\";\n\telse if (pAd->OpMode == OPMODE_STA)\n\t\tpstr = \"STA\";\n\telse\n\t\tpstr = \"Unknown\";\n\tDBGPRINT(RT_DEBUG_OFF, (\"Operation Mode: %s\\n\", pstr));\n\n\tpstr = wmode_2_str(pAd->CommonCfg.PhyMode);\n\tif (pstr) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"WirelessMode: %s(%d)\\n\", pstr, pAd->CommonCfg.PhyMode));\n\t\tos_free_mem(pAd, pstr);\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Channel: %d\\n\", pAd->CommonCfg.Channel));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tCentralChannel: %d\\n\", pAd->CommonCfg.CentralChannel));\n#ifdef DOT11_VHT_AC\n\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode))\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tVHT CentralChannel: %d\\n\", pAd->CommonCfg.vht_cent_ch));\n#endif /* DOT11_VHT_AC */\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRF Channel: %d\\n\", pAd->LatchRfRegs.Channel));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Bandwidth\\n\"));\n\tpstr = (pAd->CommonCfg.RegTransmitSetting.field.BW) ? \"20/40\" : \"20\";\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tHT-BW: %s\\n\", pstr));\n#ifdef DOT11_VHT_AC\n\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode))\n\t{\n\t\tif (pAd->CommonCfg.vht_bw)\n\t\t\tpstr = \"80\";\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tVHT-BW: %s\\n\", pstr));\n\t}\n#endif /* DOT11_VHT_AC */\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t{\n\t\tdump_bw_info(pAd);\n\t}\n#endif /* RT65xx */\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Security\\n\"));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"MAC Ver: %s\\n\", MAC_VERSION));\n\tDBGPRINT(RT_DEBUG_OFF, (\"BBP Ver: %s\\n\", BBP_VERSION));\n\tDBGPRINT(RT_DEBUG_OFF, (\"RF Ver: %s\\n\", RF_VERSION));\n\n\treturn TRUE;\n}\n\n\n#ifdef WSC_STA_SUPPORT\nINT\tShow_WpsManufacturer_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN ULONG\t\t\tBufLen)\n{\n\tsprintf(pBuf, \"\\tManufacturer = %s\", pAd->StaCfg.WscControl.RegData.SelfInfo.Manufacturer);\t\n\treturn 0;\n}\n\nINT\tShow_WpsModelName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN ULONG\t\t\tBufLen)\n{\n\tsprintf(pBuf, \"\\tModelName = %s\", pAd->StaCfg.WscControl.RegData.SelfInfo.ModelName);\n\treturn 0;\n}\n\nINT\tShow_WpsDeviceName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN ULONG\t\t\tBufLen)\n{\n\tsprintf(pBuf, \"\\tDeviceName = %s\", pAd->StaCfg.WscControl.RegData.SelfInfo.DeviceName);\n\treturn 0;\n}\n\nINT\tShow_WpsModelNumber_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN ULONG\t\t\tBufLen)\n{\n\tsprintf(pBuf, \"\\tModelNumber = %s\", pAd->StaCfg.WscControl.RegData.SelfInfo.ModelNumber);\n\treturn 0;\n}\n\nINT\tShow_WpsSerialNumber_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN ULONG\t\t\tBufLen)\n{\n\tsprintf(pBuf, \"\\tSerialNumber = %s\", pAd->StaCfg.WscControl.RegData.SelfInfo.SerialNumber);\n\treturn 0;\n}\n\nINT\tShow_WpsUuid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN ULONG\t\t\tBufLen)\n{\n\tUCHAR *bin = pAd->StaCfg.WscControl.RegData.SelfInfo.Uuid;\n\n\tsprintf(pBuf, \"\\tUuid = %02x%02x%02x%02x-%02x%02x-%02x%02x-\"\n\t\t\t  \"%02x%02x-%02x%02x%02x%02x%02x%02x\",\n\t\t\t  bin[0], bin[1], bin[2], bin[3],\n\t\t\t  bin[4], bin[5], bin[6], bin[7],\n\t\t\t  bin[8], bin[9], bin[10], bin[11],\n\t\t\t  bin[12], bin[13], bin[14], bin[15]);\n\t\n\treturn 0;\n}\n#endif /* WSC_STA_SUPPORT */\n\n\n#ifdef SINGLE_SKU\nINT\tShow_ModuleTxpower_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen)\n{\n\tsnprintf(pBuf, BufLen, \"\\tModuleTxpower = %d\", pAd->CommonCfg.ModuleTxpower);\n\treturn 0;\n}\n#endif /* SINGLE_SKU */\n\n#ifdef APCLI_SUPPORT\n INT RTMPIoctlConnStatus(\n\tIN\tPRTMP_ADAPTER\tpAd, \n \tIN\tPSTRING\t\t\targ)\n{\n \n \tINT i=0;\n \tPOS_COOKIE pObj;\n \tUCHAR ifIndex;\n\tBOOLEAN bConnect=FALSE;\n \t\n \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n \n \n \n \tDBGPRINT(RT_DEBUG_TRACE, (\"==>RTMPIoctlConnStatus\\n\"));\n \n \tif (pObj->ioctl_if_type != INT_APCLI)\n \t\treturn FALSE;\n \n \tifIndex = pObj->ioctl_if;\n \t\n \n \tDBGPRINT(RT_DEBUG_OFF, (\"=============================================================\\n\"));\n \tif((pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState == APCLI_CTRL_CONNECTED)\n \t\t&& (pAd->ApCfg.ApCliTab[ifIndex].SsidLen != 0))\n \t{\n \t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n \t\t{\n \t\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n \n \t\t\tif ( IS_ENTRY_APCLI(pEntry)\n\t\t\t\t&& (pEntry->Sst == SST_ASSOC)\n\t\t\t\t&& (pEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n \t\t\t\t{\n \t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"ApCli%d Connected AP : %02X:%02X:%02X:%02X:%02X:%02X   SSID:%s\\n\",ifIndex,\n \t\t\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n \t\t\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5],\n \t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].Ssid));\n\t\t\t\t\tbConnect=TRUE;\n \t\t\t\t}\n \t\t}\n\n\t\tif (!bConnect)\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"ApCli%d Connected AP : Disconnect\\n\",ifIndex));\n \t}\n \telse\n \t{\n \t\tDBGPRINT(RT_DEBUG_OFF, (\"ApCli%d Connected AP : Disconnect\\n\",ifIndex));\n \t}\n \tDBGPRINT(RT_DEBUG_OFF, (\"=============================================================\\n\"));\n     \tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlConnStatus\\n\"));\n \treturn TRUE;\n}\n#endif/*APCLI_SUPPORT*/\n\nvoid  getRate(HTTRANSMIT_SETTING HTSetting, ULONG* fLastTxRxRate)\n\n{\n\t INT MCSMappingRateTable[] =\n\t{2,  4,   11,  22, /* CCK*/\n\t12, 18,   24,  36, 48, 72, 96, 108, /* OFDM*/\n\t13, 26,   39,  52,  78, 104, 117, 130, 26,  52,  78, 104, 156, 208, 234, 260, /* 20MHz, 800ns GI, MCS: 0 ~ 15*/\n\t39, 78,  117, 156, 234, 312, 351, 390,\t\t\t\t\t\t\t\t\t\t  /* 20MHz, 800ns GI, MCS: 16 ~ 23*/\n\t27, 54,   81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, /* 40MHz, 800ns GI, MCS: 0 ~ 15*/\n\t81, 162, 243, 324, 486, 648, 729, 810,\t\t\t\t\t\t\t\t\t\t  /* 40MHz, 800ns GI, MCS: 16 ~ 23*/\n\t14, 29,   43,  57,  87, 115, 130, 144, 29, 59,   87, 115, 173, 230, 260, 288, /* 20MHz, 400ns GI, MCS: 0 ~ 15*/\n\t43, 87,  130, 173, 260, 317, 390, 433,\t\t\t\t\t\t\t\t\t\t  /* 20MHz, 400ns GI, MCS: 16 ~ 23*/\n\t30, 60,   90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, /* 40MHz, 400ns GI, MCS: 0 ~ 15*/\n\t90, 180, 270, 360, 540, 720, 810, 900};\n\n\tint rate_count = sizeof(MCSMappingRateTable)/sizeof(int);\n\tint rate_index = 0;  \n\tint value = 0;\n\n#ifdef DOT11_N_SUPPORT\n    if (HTSetting.field.MODE >= MODE_HTMIX)\n    {\n/*    \trate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS);*/\n    \trate_index = 12 + ((UCHAR)HTSetting.field.BW *24) + ((UCHAR)HTSetting.field.ShortGI *48) + ((UCHAR)HTSetting.field.MCS);\n    }\n    else \n#endif /* DOT11_N_SUPPORT */\n    if (HTSetting.field.MODE == MODE_OFDM)                \n    \trate_index = (UCHAR)(HTSetting.field.MCS) + 4;\n    else if (HTSetting.field.MODE == MODE_CCK)   \n    \trate_index = (UCHAR)(HTSetting.field.MCS);\n\n    if (rate_index < 0)\n        rate_index = 0;\n    \n    if (rate_index >= rate_count)\n        rate_index = rate_count-1;\n\n    value = (MCSMappingRateTable[rate_index] * 5)/10;\n\t*fLastTxRxRate=(ULONG)value;\n\treturn;\n}\n\n\n#ifdef TXBF_SUPPORT\n\n/*\n\tSet_ReadITxBf_Proc - Read Implicit BF profile and display it\n\t\tiwpriv ra0 set ReadITxBf=<profile number>\n*/\nINT\tSet_ReadITxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint profileNum = simple_strtol(arg, 0, 10);\n\tint scIndex, i, maxCarriers;\n\n\tRead_TxBfProfile(pAd, &profData, profileNum, TRUE);\n\n\t/* Display profile. Note: each column is displayed as a row. This shortens the display */\n\tDBGPRINT(RT_DEBUG_OFF, (\"---ITxBF Profile: %d - %dx%d, %dMHz\\n\",\n\t\tprofileNum, profData.rows, profData.columns, profData.fortyMHz? 40: 20));\n\n\tmaxCarriers = profData.fortyMHz? PROFILE_MAX_CARRIERS_40: PROFILE_MAX_CARRIERS_20;\n\n\tfor (scIndex=0; scIndex<maxCarriers; scIndex++) {\n\t\tfor (i=0; i<profData.rows; i++) {\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%d %d    \", Unpack_IBFValue(profData.data[scIndex], 2*i+1), Unpack_IBFValue(profData.data[scIndex], 2*i)));\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\n\t\tif (profData.columns>1) {\n\t\t\tfor (i=0; i<profData.rows; i++) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%d %d    \", Unpack_IBFValue(profData.data[scIndex], 2*i+7), Unpack_IBFValue(profData.data[scIndex], 2*i+6)));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ReadETxBf_Proc - Read Explicit BF profile and display it\n\t\tusage: iwpriv ra0 set ReadETxBf=<profile number>\n*/\nINT\tSet_ReadETxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint profileNum = simple_strtol(arg, 0, 10);\n\tint scIndex, i, maxCarriers;\n\n\tRead_TxBfProfile(pAd, &profData, profileNum, FALSE);\n\n\t/* Dump ETxBF profile values. Note: each column is displayed as a row. This shortens the display */\n\tDBGPRINT(RT_DEBUG_OFF, (\"---ETxBF Profile: %d - %dx%d, %dMHz, grp=%d\\n\",\n\t\tprofileNum, profData.rows, profData.columns, profData.fortyMHz? 40: 20, profData.grouping));\n\n\tmaxCarriers = profData.fortyMHz? PROFILE_MAX_CARRIERS_40: PROFILE_MAX_CARRIERS_20;\n\n\tfor (scIndex=0; scIndex<maxCarriers; scIndex++) {\n\t\tfor (i=0; i<profData.rows; i++) {\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%d %d\\t\", (CHAR)(profData.data[scIndex][6*i]), (CHAR)(profData.data[scIndex][6*i+1]) ));\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\n\t\tif (profData.columns>1) {\n\t\t\tfor (i=0; i<profData.rows; i++) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%d %d    \", (CHAR)(profData.data[scIndex][6*i+2]), (CHAR)(profData.data[scIndex][6*i+3]) ));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t}\n\n\t\tif (profData.columns>2) {\n\t\t\tfor (i=0; i<profData.rows; i++) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%d %d    \", (CHAR)(profData.data[scIndex][6*i+4]), (CHAR)(profData.data[scIndex][6*i+5]) ));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_WriteITxBf_Proc - Write Implicit BF matrix\n\t\tusage: iwpriv ra0 set WriteITxBf=<profile number>\n\t\tAssumes profData contains a valid Implicit Profile\n*/\nINT\tSet_WriteITxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint profileNum = simple_strtol(arg, 0, 10);\n\n\tif (!profData.impProfile)\n\t\treturn FALSE;\n\n\tWrite_TxBfProfile(pAd, &profData, profileNum);\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_WriteETxBf_Proc - Write Explicit BF matrix\n\t\tusage: iwpriv ra0 set WriteETxBf=<profile number>\n\t\tAssumes profData contains a valid Explicit Profile\n*/\nINT\tSet_WriteETxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint profileNum = simple_strtol(arg, 0, 10);\n\n\tif (profData.impProfile)\n\t\treturn FALSE;\n\n\tWrite_TxBfProfile(pAd, &profData, profileNum);\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_StatITxBf_Proc - Compute power of each chain in Implicit BF matrix\n\t\tusage: iwpriv ra0 set StatITxBf=<profile number>\n*/\nINT\tSet_StatITxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint scIndex, maxCarriers, i;\n\tunsigned long col1Power[3] = {0,0,0}, col2Power[3] = {0,0,0};\n\tint profileNum = simple_strtol(arg, 0, 10);\n\tPROFILE_DATA *pProfData;\n\n\tpProfData = (PROFILE_DATA *)kmalloc(sizeof(PROFILE_DATA), MEM_ALLOC_FLAG);\n\tif (pProfData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_StatITxBf_Proc: kmalloc failed\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tRead_TxBfProfile(pAd, pProfData, profileNum, TRUE);\n\n\tmaxCarriers = pProfData->fortyMHz? PROFILE_MAX_CARRIERS_40: PROFILE_MAX_CARRIERS_20;\n\n\tfor (scIndex=0; scIndex<maxCarriers; scIndex++) {\n\t\tfor (i=0; i<pProfData->rows; i++) {\n\t\t\tint ival = Unpack_IBFValue(pProfData->data[scIndex], 2*i+1);\n\t\t\tint qval = Unpack_IBFValue(pProfData->data[scIndex], 2*i);\n\t\t\tcol1Power[i] += ival*ival+qval*qval;\n\n\t\t\tif (pProfData->columns==2) {\n\t\t\t\tival = Unpack_IBFValue(pProfData->data[scIndex], 2*i+7);\n\t\t\t\tqval = Unpack_IBFValue(pProfData->data[scIndex], 2*i+6);\n\t\t\t\tcol2Power[i] += ival*ival+qval*qval;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Remove implied scale factor of 2^-16. Convert to thousandths */\n\tfor (i=0; i<pProfData->rows; i++) {\n\t\tcol1Power[i] >>= 12;\n\t\tcol1Power[i] = ((col1Power[i]*1000)/maxCarriers)>>4;\n\t\tcol2Power[i] >>= 12;\n\t\tcol2Power[i] = ((col2Power[i]*1000)/maxCarriers)>>4;\n\t}\n\n\t/* Display stats */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ITxBF Stats:\\n  %dx1=[0.%03lu 0.%03lu, 0.%03lu]\\n\",\n\t\t\t\tpProfData->rows, col1Power[0], col1Power[1], col1Power[2]));\n\tif (pProfData->columns==2) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"  %dx2=[0.%03lu 0.%03lu, 0.%03lu]\\n\",\n\t\t\t\t\tpProfData->rows, (col1Power[0]+col2Power[0])/2, (col1Power[1]+col2Power[1])/2,\n\t\t\t\t\t(col1Power[2]+col2Power[2])/2) );\n\t}\n\n\tkfree(pProfData);\n\n\treturn TRUE;\n}\n\n/*\n\tSet_StatETxBf_Proc - Compute power of each chain in Explicit BF matrix\n\t\tusage: iwpriv ra0 set StatETxBf=<profile number>\n*/\nINT\tSet_StatETxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tint scIndex, maxCarriers, i;\n\tunsigned long col1Power[3] = {0,0,0}, col2Power[3] = {0,0,0}, col3Power[3] = {0,0,0};\n\tint profileNum = simple_strtol(arg, 0, 10);\n\tPROFILE_DATA *pProfData;\n\n\tpProfData = (PROFILE_DATA *)kmalloc(sizeof(PROFILE_DATA), MEM_ALLOC_FLAG);\n\tif (pProfData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_StatETxBf_Proc: kmalloc failed\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tRead_TxBfProfile(pAd, pProfData, profileNum, FALSE);\n\n\tmaxCarriers = pProfData->fortyMHz? PROFILE_MAX_CARRIERS_40: PROFILE_MAX_CARRIERS_20;\n\n\tfor (scIndex=0; scIndex<maxCarriers; scIndex++) {\n\t\tfor (i=0; i<pProfData->rows; i++) {\n\t\t\tint ival = (CHAR)(pProfData->data[scIndex][6*i]);\n\t\t\tint qval = (CHAR)(pProfData->data[scIndex][6*i+1]);\n\t\t\tcol1Power[i] += ival*ival+qval*qval;\n\n\t\t\tif (pProfData->columns>1) {\n\t\t\t\tival = (CHAR)(pProfData->data[scIndex][6*i+2]);\n\t\t\t\tqval = (CHAR)(pProfData->data[scIndex][6*i+3]);\n\t\t\t\tcol2Power[i] += ival*ival+qval*qval;\n\t\t\t}\n\n\t\t\tif (pProfData->columns>2) {\n\t\t\t\tival = (CHAR)(pProfData->data[scIndex][6*i+4]);\n\t\t\t\tqval = (CHAR)(pProfData->data[scIndex][6*i+5]);\n\t\t\t\tcol3Power[i] += ival*ival+qval*qval;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Remove implied scale factor of 2^-14. Convert to thousandths */\n\tfor (i=0; i<pProfData->rows; i++) {\n\t\tcol1Power[i] >>= 10;\n\t\tcol1Power[i] = ((col1Power[i]*1000)/maxCarriers)>>4;\n\t\tcol2Power[i] >>= 10;\n\t\tcol2Power[i] = ((col2Power[i]*1000)/maxCarriers)>>4;\n\t\tcol3Power[i] >>= 10;\n\t\tcol3Power[i] = ((col3Power[i]*1000)/maxCarriers)>>4;\n\t}\n\n\t/* Display stats */\n\tDBGPRINT(RT_DEBUG_OFF, (\"ETxBF Stats:\\n  %dx1=[0.%03lu 0.%03lu, 0.%03lu]\\n\",\n\t\t\t\tpProfData->rows, col1Power[0], col1Power[1], col1Power[2]));\n\tif (pProfData->columns==2) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"  %dx2=[0.%03lu 0.%03lu, 0.%03lu]\\n\",\n\t\t\t\t\tpProfData->rows, (col1Power[0]+col2Power[0])/2,\n\t\t\t\t\t(col1Power[1]+col2Power[1])/2, (col1Power[2]+col2Power[2])/2) );\n\t\t}\n\tif (pProfData->columns==3) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"  %dx3=[0.%03lu 0.%03lu, 0.%03lu]\\n\",\n\t\t\t\t\tpProfData->rows, (col1Power[0]+col2Power[0]+col3Power[0])/3,\n\t\t\t\t\t(col1Power[1]+col2Power[1]+col3Power[1])/3,\n\t\t\t\t\t(col1Power[2]+col2Power[2]+col3Power[2])/3) );\n\t}\n\n\tkfree(pProfData);\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_TxBfTag_Proc - Display BF Profile Tags\n\t\tusage: \"iwpriv ra0 set TxBfTag=n\"\n\t\t\t\t\tn: 0=>all,\n\t\t\t\t\t   1=>Explicit,\n\t\t\t\t\t   2=>Implicit,\n\t\t\t\t\t   3=>dump Power table\n*/\nINT\tSet_TxBfTag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n    IN  PSTRING         arg)\n{\n\tint argVal = simple_strtol(arg, 0, 10);\n\tint profileNum;\n\n\tif (argVal==0 || argVal==1) {\n\t\t/* Display Explicit tagfield */\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"---Explicit TxBfTag:\\n\"));\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, 4);\n\t\tfor (profileNum=0; profileNum<4; profileNum++)\n\t\t\tdisplayTagfield(pAd, profileNum, FALSE);\n\t}\n\n\tif (argVal==0 || argVal==2) {\n\t\t/* Display Implicit tagfield */\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"---Implicit TxBfTag:\\n\"));\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, 0);\n\t\tfor (profileNum=0; profileNum<4; profileNum++)\n\t\t\tdisplayTagfield(pAd, profileNum, TRUE);\n\t}\n\t\n\tif (argVal==3) {\n\t\tint i;\n\t\t/* 4. Dump power table */\n\t\tfor (i = 0; i < (14 + 12 + 16 + 7); i++)\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%d: Ch%2d=[%d, %d %d]\\n\", i,\n\t\t\t\t\t\tpAd->TxPower[i].Channel, pAd->TxPower[i].Power,\n\t\t\t\t\t\tpAd->TxPower[i].Power2, pAd->TxPower[i].Power3));\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_InvTxBfTag_Proc - Invalidate BF Profile Tags\n\t\tusage: \"iwpriv ra0 set InvTxBfTag=n\"\n\t\tReset Valid bit and zero out MAC address of each profile. The next profile will be stored in profile 0\n*/\nINT\tSet_InvTxBfTag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n    IN  PSTRING         arg)\n{\n\tint profileNum;\n\tUCHAR row[EXP_MAX_BYTES];\n\tUCHAR r163Value = 0;\n\n\t/* Disable Profile Updates during access */\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R163, &r163Value);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R163, r163Value & ~0x88);\n\n\t/* Invalidate Implicit tags */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, 0);\n\tfor (profileNum=0; profileNum<4; profileNum++) {\n\t\tRead_TagField(pAd, row, profileNum);\n\t\trow[0] &= 0x7F;\n\t\trow[1] = row[2] = row[3] = row[4] = row[5] = row[6] = 0xAA;\n\t\tWrite_TagField(pAd, row, profileNum);\n\t}\n\n\t/* Invalidate Explicit tags */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, 4);\n\tfor (profileNum=0; profileNum<4; profileNum++) {\n\t\tRead_TagField(pAd, row, profileNum);\n\t\trow[0] &= 0x7F;\n\t\trow[1] = row[2] = row[3] = row[4] = row[5] = row[6] = 0x55;\n\t\tWrite_TagField(pAd, row, profileNum);\n\t}\n\n\t/* Restore Profile Updates */\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R163, r163Value);\n\t\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ITxBfTimeout_Proc - Set ITxBF timeout value\n\tusage: iwpriv ra0 set ITxBfTimeout=<decimal timeout in units of 25 microsecs>\n*/\nINT Set_ITxBfTimeout_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 65535) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ITxBfTimeout_Proc: value > 65535!\\n\"));\n\t\treturn FALSE;\n\t}\n\n    pAd->CommonCfg.ITxBfTimeout = t;\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, 0x02);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R180, 0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R182, pAd->CommonCfg.ITxBfTimeout & 0xFF);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R180, 1);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R182, (pAd->CommonCfg.ITxBfTimeout>>8) & 0xFF);\n\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_ITxBfTimeout_Proc::(ITxBfTimeout=%d)\\n\", (int)pAd->CommonCfg.ITxBfTimeout));\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ETxBfTimeout_Proc - Set ITxBF timeout value\n\t\tusage: iwpriv ra0 set ETxBfTimeout=<decimal timeout in units of 25 microsecs>\n*/\nINT Set_ETxBfTimeout_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 65535) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ETxBfTimeout_Proc: value > 65535!\\n\"));\n\t\treturn FALSE;\n\t}\n\n    pAd->CommonCfg.ETxBfTimeout = t;\n\tRTMP_IO_WRITE32(pAd, TX_TXBF_CFG_3, pAd->CommonCfg.ETxBfTimeout);\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_ETxBfTimeout_Proc::(ETxBfTimeout=%d)\\n\", (int)pAd->CommonCfg.ETxBfTimeout));\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ETxBfCodebook_Proc - Set ETxBf Codebook \n\tusage: iwpriv ra0 set ETxBfCodebook=0 to 3\n*/\nINT Set_ETxBfCodebook_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tTX_TXBF_CFG_0_STRUC regValue;\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 3) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ETxBfCodebook_Proc: value > 3!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tRTMP_IO_READ32(pAd, TX_TXBF_CFG_0, &regValue.word);\n\tregValue.field.EtxbfFbkCode = t;\n\tRTMP_IO_WRITE32(pAd, TX_TXBF_CFG_0, regValue.word);\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ETxBfCoefficient_Proc - Set ETxBf Coefficient \n\t\tusage: iwpriv ra0 set ETxBfCoefficient=0 to 3\n*/\nINT Set_ETxBfCoefficient_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tTX_TXBF_CFG_0_STRUC regValue;\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 3) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ETxBfCoefficient_Proc: value > 3!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tRTMP_IO_READ32(pAd, TX_TXBF_CFG_0, &regValue.word);\n\tregValue.field.EtxbfFbkCoef = t;\n\tRTMP_IO_WRITE32(pAd, TX_TXBF_CFG_0, regValue.word);\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ETxBfGrouping_Proc - Set ETxBf Grouping \n\t\tusage: iwpriv ra0 set ETxBfGrouping=0 to 2\n*/\nINT Set_ETxBfGrouping_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tTX_TXBF_CFG_0_STRUC regValue;\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 2) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ETxBfGrouping_Proc: value > 2!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tRTMP_IO_READ32(pAd, TX_TXBF_CFG_0, &regValue.word);\n\tregValue.field.EtxbfFbkNg = t;\n\tRTMP_IO_WRITE32(pAd, TX_TXBF_CFG_0, regValue.word);\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ETxBfNoncompress_Proc - Set ETxBf Noncompress option \n\t\tusage: iwpriv ra0 set ETxBfNoncompress=0 or 1\n*/\nINT Set_ETxBfNoncompress_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 1) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ETxBfNoncompress_Proc: value > 1!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpAd->CommonCfg.ETxBfNoncompress = t;\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ETxBfIncapable_Proc - Set ETxBf Incapable option\n\t\tusage: iwpriv ra0 set ETxBfIncapable=0 or 1\n*/\nINT Set_ETxBfIncapable_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg)\n{\n\tULONG t = simple_strtol(arg, 0, 10);\n\n\tif (t > 1)\n\t\treturn FALSE;\n\n\tpAd->CommonCfg.ETxBfIncapable = t;\n\tsetETxBFCap(pAd, &pAd->CommonCfg.HtCapability.TxBFCap);\n\n\treturn TRUE;\n}\n\n\n/*\n\tSet_ITxBfDivCal_Proc - Calculate ITxBf Divider Calibration parameters\n\tusage: iwpriv ra0 set ITxBfDivCal=dd\n\t\t\t0=>display calibration parameters\n\t\t\t1=>update EEPROM values\n\t\t\t2=>update BBP R176\n\t\t\t10=>display calibration parameters and dump capture data\n\t\t\t11=>Skip divider calibration, just capture and dump capture data\n*/\nINT\tSet_ITxBfDivCal_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n    IN  PSTRING         arg)\n{\n\tint calFunction;\n\n\tcalFunction = simple_strtol(arg, 0, 10);\n\n\treturn ITxBFDividerCalibration(pAd, calFunction, 0, NULL);\n}\n\n\n/*\n\tSet_ITxBfLNACal_Proc - Calculate ITxBf LNA Calibration parameters\n\tusage: iwpriv ra0 set ITxBfLnaCal=dd\n\t\t\t0=>display calibration parameters\n\t\t\t1=>update EEPROM values\n\t\t\t2=>update BBP R174\n\t\t\t10=>display calibration parameters and dump capture data\n*/\nINT\tSet_ITxBfLnaCal_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n    IN  PSTRING         arg)\n{\n\tUCHAR channel = pAd->CommonCfg.Channel;\n\tint calFunction;\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\tchannel = pAd->ate.Channel;\n#endif /* RALINK_ATE */\n\n\tcalFunction = simple_strtol(arg, 0, 10);\n\n\treturn ITxBFLNACalibration(pAd, calFunction, 0, channel<=14);\n}\n\n\n/*\n\tSet_ITxBfCal_Proc - Calculate ITxBf Calibration parameters\n\tusage: \"iwpriv ra0 set ITxBfCal=[0 | 1]\"\n\t\t\t0=>calculate values, 1=>update BBP and EEPROM\n*/\nINT\tSet_ITxBfCal_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n    IN  PSTRING         arg)\n{\n\tint calFunction = simple_strtol(arg, 0, 10);\n\tint calParams[2];\n\tint ret;\n\tUCHAR channel = pAd->CommonCfg.Channel;\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\tchannel = pAd->ate.Channel;\n#endif /* RALINK_ATE */\n\n\tret = iCalcCalibration(pAd, calParams, 0);\n\tif (ret < 0) {\n\t\tif (ret == -3)\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_ITxBfCal_Proc: kmalloc failed\\n\"));\n\t\telse if (ret == -2)\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_ITxBfCal_Proc: MAC Address mismatch\\n\"));\n\t\telse\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_ITxBfCal_Proc: Invalid profiles\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t/* Display result */\n\tDBGPRINT((calFunction==0? RT_DEBUG_OFF: RT_DEBUG_WARN),\n\t\t\t\t(\"ITxBfCal Result = [0x%02x 0x%02x]\\n\", calParams[0], calParams[1]));\n\n#ifdef RALINK_ATE\n\tpAd->ate.calParams[0] = (UCHAR)calParams[0];\n\tpAd->ate.calParams[1] = (UCHAR)calParams[1];\n\n\t/* Double check */\n\tDBGPRINT((calFunction==0? RT_DEBUG_OFF: RT_DEBUG_WARN),\n\t\t\t\t(\"ITxBfCal Result in ATE = [0x%02x 0x%02x]\\n\", pAd->ate.calParams[0], pAd->ate.calParams[1]));\n#endif /* RALINK_ATE */\n\n\t/* Update BBP R176 and EEPROM for Ant 0 and 2 */\n\tif (calFunction == 1) {\n\t\tUCHAR r27Value = 0, r173Value = 0;\n\t\tITXBF_PHASE_PARAMS phaseParams;\n\t\tUCHAR divPhase[2] = {0}, phaseValues[2] = {0};\n\n\t\t/* Read R173 to see if Phase compensation is already enabled */\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R173, &r173Value);\n\n\t\t/* Select Ant 0 */\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R27, &r27Value);\n\t\tr27Value &= ~0x60;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, r27Value);\n\n\t\t/* Update R176 */\n\t\tif (r173Value & 0x08) {\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R176, &phaseValues[0]);\n\t\t\tphaseValues[0] += calParams[0];\n\t\t}\n\t\telse\n\t\t\tphaseValues[0] = calParams[0];\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R176, phaseValues[0]);\n\n\t\t/* Select Ant 2 */\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, r27Value | 0x40);\n\n\t\t/* Update R176 */\n\t\tif (r173Value & 0x08) {\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R176, &phaseValues[1]);\n\t\t\tphaseValues[1] += calParams[1];\n\t\t}\n\t\telse\n\t\t\tphaseValues[1] = calParams[1];\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R176, phaseValues[1]);\n\n\t\t/* Enable TX Phase Compensation */\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, r173Value | 0x08);\n\n\t\t/* Remove Divider phase */\n\t\tITxBFDividerCalibration(pAd, 3, 0, divPhase);\n\t\tphaseValues[0] -= divPhase[0];\n\t\tphaseValues[1] -= divPhase[1];\n\n\t\t/* Update EEPROM */\n\n\t\tITxBFGetEEPROM(pAd, &phaseParams, 0, 0);\n\n\t\t/* Only allow calibration on specific channels */\n\t\tif (channel == 1) {\n\t\t\tphaseParams.gBeg[0] = phaseValues[0];\n\t\t\tphaseParams.gBeg[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 14) {\n\t\t\tphaseParams.gEnd[0] = phaseValues[0];\n\t\t\tphaseParams.gEnd[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 36) {\n\t\t\tphaseParams.aLowBeg[0] = phaseValues[0];\n\t\t\tphaseParams.aLowBeg[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 64) {\n\t\t\tphaseParams.aLowEnd[0] = phaseValues[0];\n\t\t\tphaseParams.aLowEnd[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 100) {\n\t\t\tphaseParams.aMidBeg[0] = phaseValues[0];\n\t\t\tphaseParams.aMidBeg[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 128) {\n\t\t\tphaseParams.aMidEnd[0] = phaseValues[0];\n\t\t\tphaseParams.aMidEnd[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 132) {\n\t\t\tphaseParams.aHighBeg[0] = phaseValues[0];\n\t\t\tphaseParams.aHighBeg[1] = phaseValues[1];\n\t\t}\n\t\telse if (channel == 165) {\n\t\t\tphaseParams.aHighEnd[0] = phaseValues[0];\n\t\t\tphaseParams.aHighEnd[1] = phaseValues[1];\n\t\t}\n\t\telse {\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t\t(\"Invalid channel: %d\\nMust calibrate channel 1, 14, 36, 64, 100, 128, 132 or 165\", channel) );\n\t\t\treturn FALSE;\n\t\t}\n\t\tITxBFSetEEPROM(pAd, &phaseParams, 0, 0);\n\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Set_ITxBfCal_Proc: Calibration Parameters updated\\n\"));\n\t}\n\n\treturn TRUE;\n}\n\n\n/* \n\tSet_ETxBfEnCond_Proc - enable/disable ETxBF\n\tusage: iwpriv ra0 set ETxBfEnCond=dd\n\t\t0=>disable, 1=>enable\n\tNote: After use this command, need to re-run apStartup()/LinkUp() operations to sync all status.\n\t\t  If ETxBfIncapable!=0 then we don't need to reassociate.\n*/\nINT\tSet_ETxBfEnCond_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR i, enableETxBf;\n\tMAC_TABLE_ENTRY\t\t*pEntry;\n\tUINT8\tbyteValue;\n\n\tenableETxBf = simple_strtol(arg, 0, 10);\n\n\tif (enableETxBf > 1)\n\t\treturn FALSE;\n\n\tpAd->CommonCfg.ETxBfEnCond = enableETxBf && (pAd->Antenna.field.TxPath > 1);\n\tpAd->CommonCfg.RegTransmitSetting.field.TxBF = enableETxBf==0? 0: 1;\n\n\tsetETxBFCap(pAd, &pAd->CommonCfg.HtCapability.TxBFCap);\n\trtmp_asic_set_bf(pAd);\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (!IS_ENTRY_NONE(pEntry))\n\t\t{\n\t\t\tpEntry->eTxBfEnCond = clientSupportsETxBF(pAd, &pEntry->HTCapability.TxBFCap)? enableETxBf: 0;\n\t\t\tpEntry->bfState = READY_FOR_SNDG0;\n\t\t}\n\t}\n\n\n\tif (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn || enableETxBf)\n\t{\n\t\tRT30xxReadRFRegister(pAd, RF_R39, (PUCHAR)&byteValue);\n\t\tbyteValue |= 0x40;\n\t\tRT30xxWriteRFRegister(pAd, RF_R39, (UCHAR)byteValue);\n\n\t\tRT30xxReadRFRegister(pAd, RF_R49, (PUCHAR)&byteValue);\n\t\tbyteValue |= 0x20;\n\t\tRT30xxWriteRFRegister(pAd, RF_R49, (UCHAR)byteValue);\n\t}\n\telse\n\t{\n\t\t/* depends on Gary Tsao's comments. we shall disable it */\n\t\tif (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn == 0)\n\t\t{\n\t\t\tRT30xxReadRFRegister(pAd, RF_R39, (PUCHAR)&byteValue);\n\t\t\tbyteValue &= (~0x40);\n\t\t\tRT30xxWriteRFRegister(pAd, RF_R39, (UCHAR)byteValue);\n\n\t\t\tRT30xxReadRFRegister(pAd, RF_R49, (PUCHAR)&byteValue);\n\t\t\tbyteValue &= (~0x20);\n\t\t\tRT30xxWriteRFRegister(pAd, RF_R49, (UCHAR)byteValue);\n\t\t}\n\t}\n\n\n\treturn TRUE;\t\n}\n\nINT\tSet_NoSndgCntThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR i;\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){\n\t\tpAd->MacTab.Content[i].noSndgCntThrd = simple_strtol(arg, 0, 10);\n\t}\n\treturn TRUE;\t\n}\n\nINT\tSet_NdpSndgStreams_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR i;\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){\n\t\tpAd->MacTab.Content[i].ndpSndgStreams = simple_strtol(arg, 0, 10);\n\t}\n\treturn TRUE;\t\n}\n\n\nINT\tSet_Trigger_Sounding_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\tmacAddr[MAC_ADDR_LEN];\n\tCHAR\t\t\t*value;\n\tINT\t\t\t\ti;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\t/* Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\tif(strlen(arg) != 17)\n\t\treturn FALSE;\n\n\tfor (i=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n\t{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  /*Invalid*/\n\n\t\tAtoH(value, &macAddr[i++], 1);\n\t}\n\n\t/*DBGPRINT(RT_DEBUG_TRACE, (\"TriggerSounding=%02x:%02x:%02x:%02x:%02x:%02x\\n\",*/\n\t/*\t\tmacAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5], macAddr[6]) );*/\n\tpEntry = MacTableLookup(pAd, macAddr);\n\tif (pEntry==NULL)\n\t\treturn FALSE;\n\n\tTrigger_Sounding_Packet(pAd, SNDG_TYPE_SOUNDING, 0, pEntry->sndgMcs, pEntry);\n\n\treturn TRUE;\n}\n\n/*\n\tSet_ITxBfEn_Proc - enable/disable ITxBF\n\tusage: iwpriv ra0 set ITxBfEn=dd\n\t0=>disable, 1=>enable\n*/\nINT\tSet_ITxBfEn_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR i;\n\tUCHAR enableITxBF;\n\tBOOLEAN bCalibrated;\n\tUINT8 byteValue;\n\n\tenableITxBF = simple_strtol(arg, 0, 10);\n\n\tif (enableITxBF > 1)\n\t\treturn FALSE;\n\n\tbCalibrated = rtmp_chk_itxbf_calibration(pAd);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set ITxBfEn=%d, calibration of ITxBF=%d, so enableITxBF=%d!\\n\", \n\t\t\t\t\tenableITxBF , bCalibrated, (enableITxBF & bCalibrated)));\n\t\n\tenableITxBF &= bCalibrated;\n\t\n\tpAd->CommonCfg.RegTransmitSetting.field.ITxBfEn = enableITxBF && (pAd->Antenna.field.TxPath > 1);\n\n\trtmp_asic_set_bf(pAd);\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tMAC_TABLE_ENTRY *pMacEntry = &pAd->MacTab.Content[i];\n\t\tif ((!IS_ENTRY_NONE(pMacEntry)) && (pAd->Antenna.field.TxPath> 1))\n\t\t\tpMacEntry->iTxBfEn = enableITxBF;\n\t}\n\n\tif (enableITxBF || pAd->CommonCfg.ETxBfEnCond)\n\t{\n\t\tRT30xxReadRFRegister(pAd, RF_R39, (PUCHAR)&byteValue);\n\t\tbyteValue |= 0x40;\n\t\tRT30xxWriteRFRegister(pAd, RF_R39, (UCHAR)byteValue);\n\n\t\tRT30xxReadRFRegister(pAd, RF_R49, (PUCHAR)&byteValue);\n\t\tbyteValue |= 0x20;\n\t\tRT30xxWriteRFRegister(pAd, RF_R49, (UCHAR)byteValue);\n\t}\n\t\n\t/* If enabling ITxBF then set LNA compensation, do a Divider Calibration and update BBP registers */\n\tif (enableITxBF) {\n\t\tITxBFLoadLNAComp(pAd);\n\t\tITxBFDividerCalibration(pAd, 2, 0, NULL);\n\t}\n\telse\n\t{\n\t\t/* depends on Gary Tsao's comments. */\n\t\tif (pAd->CommonCfg.ETxBfEnCond == 0)\n\t\t{\n\t\tRT30xxReadRFRegister(pAd, RF_R39, (PUCHAR)&byteValue);\n\t\t\tbyteValue &= (~0x40);\n\t\tRT30xxWriteRFRegister(pAd, RF_R39, (UCHAR)byteValue);\n\n\t\tRT30xxReadRFRegister(pAd, RF_R49, (PUCHAR)&byteValue);\n\t\t\tbyteValue &= (~0x20);\n\t\tRT30xxWriteRFRegister(pAd, RF_R49, (UCHAR)byteValue);\n\t}\n\t\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R173, 0);\n\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R27, &byteValue);\n\t\tbyteValue &= ~0x60;\n\t\tfor ( i = 0; i < 3; i++)\n\t\t{\t\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, (byteValue & (i << 5)));\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R174, 0);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R176, 0);\n\t\t}\n\t}\n\treturn TRUE;\t\n}\n#endif /* TXBF_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\nvoid assoc_ht_info_debugshow(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR ht_cap_len,\n\tIN HT_CAPABILITY_IE *pHTCapability)\n{\n\tHT_CAP_INFO\t\t\t*pHTCap;\n\tHT_CAP_PARM\t\t*pHTCapParm;\n\tEXT_HT_CAP_INFO\t\t*pExtHT;\n#ifdef TXBF_SUPPORT\n\tHT_BF_CAP\t\t\t*pBFCap;\n#endif /* TXBF_SUPPORT */\n\n\n\tif (pHTCapability && (ht_cap_len > 0))\n\t{\n\t\tpHTCap = &pHTCapability->HtCapInfo;\n\t\tpHTCapParm = &pHTCapability->HtCapParm;\n\t\tpExtHT = &pHTCapability->ExtHtCapInfo;\n#ifdef TXBF_SUPPORT\n\t\tpBFCap = &pHTCapability->TxBFCap;\n#endif /* TXBF_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Peer - 11n HT Info\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tHT Cap Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t AdvCode(%d), BW(%d), MIMOPS(%d), GF(%d), ShortGI_20(%d), ShortGI_40(%d)\\n\",\n\t\t\tpHTCap->AdvCoding, pHTCap->ChannelWidth, pHTCap->MimoPs, pHTCap->GF,\n\t\t\tpHTCap->ShortGIfor20, pHTCap->ShortGIfor40));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t TxSTBC(%d), RxSTBC(%d), DelayedBA(%d), A-MSDU(%d), CCK_40(%d)\\n\",\n\t\t\tpHTCap->TxSTBC, pHTCap->RxSTBC, pHTCap->DelayedBA, pHTCap->AMsduSize, pHTCap->CCKmodein40));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t PSMP(%d), Forty_Mhz_Intolerant(%d), L-SIG(%d)\\n\",\n\t\t\tpHTCap->PSMP, pHTCap->Forty_Mhz_Intolerant, pHTCap->LSIGTxopProSup));\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tHT Parm Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t MaxRx A-MPDU Factor(%d), MPDU Density(%d)\\n\",\n\t\t\tpHTCapParm->MaxRAmpduFactor, pHTCapParm->MpduDensity));\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tHT MCS set: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t RxMCS(%02x %02x %02x %02x %02x) MaxRxMbps(%d) TxMCSSetDef(%02x)\\n\",\n\t\t\tpHTCapability->MCSSet[0], pHTCapability->MCSSet[1], pHTCapability->MCSSet[2],\n\t\t\tpHTCapability->MCSSet[3], pHTCapability->MCSSet[4],\n\t\t\t(pHTCapability->MCSSet[11]<<8) + pHTCapability->MCSSet[10],\n\t\t\tpHTCapability->MCSSet[12]));\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tExt HT Cap Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t PCO(%d), TransTime(%d), MCSFeedback(%d), +HTC(%d), RDG(%d)\\n\",\n\t\t\tpExtHT->Pco, pExtHT->TranTime, pExtHT->MCSFeedback, pExtHT->PlusHTC, pExtHT->RDGSupport));\n\n#ifdef TXBF_SUPPORT\n        \tDBGPRINT(RT_DEBUG_TRACE, (\"\\tTX BF Cap: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t ImpRxCap(%d), RXStagSnd(%d), TXStagSnd(%d), RxNDP(%d), TxNDP(%d) ImpTxCap(%d)\\n\",\n\t\t\tpBFCap->TxBFRecCapable, pBFCap->RxSoundCapable, pBFCap->TxSoundCapable,\n\t\t\tpBFCap->RxNDPCapable, pBFCap->TxNDPCapable, pBFCap->ImpTxBFCapable));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t Calibration(%d), ExpCSICapable(%d), ExpComSteerCapable(%d), ExpCSIFbk(%d), ExpNoComBF(%d) ExpComBF(%d)\\n\",\n\t\t\tpBFCap->Calibration, pBFCap->ExpCSICapable, pBFCap->ExpComSteerCapable,\n\t\t\tpBFCap->ExpCSIFbk, pBFCap->ExpNoComBF, pBFCap->ExpComBF));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\t MinGrouping(%d), CSIBFAntSup(%d), NoComSteerBFAntSup(%d), ComSteerBFAntSup(%d), CSIRowBFSup(%d) ChanEstimation(%d)\\n\",\n\t\t\tpBFCap->MinGrouping, pBFCap->CSIBFAntSup, pBFCap->NoComSteerBFAntSup,\n\t\t\tpBFCap->ComSteerBFAntSup, pBFCap->CSIRowBFSup, pBFCap->ChanEstimation));\n#endif /* TXBF_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\nPeer - MODE=%d, BW=%d, MCS=%d, ShortGI=%d, MaxRxFactor=%d, MpduDensity=%d, MIMOPS=%d, AMSDU=%d\\n\",\n\t\t\tpEntry->HTPhyMode.field.MODE, pEntry->HTPhyMode.field.BW,\n\t\t\tpEntry->HTPhyMode.field.MCS, pEntry->HTPhyMode.field.ShortGI,\n\t\t\tpEntry->MaxRAmpduFactor, pEntry->MpduDensity,\n\t\t\tpEntry->MmpsMode, pEntry->AMsduSize));\n\n#ifdef DOT11N_DRAFT3\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tExt Cap Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tBss2040CoexistMgmt=%d\\n\", pEntry->BSS2040CoexistenceMgmtSupport));\n#endif /* DOT11N_DRAFT3 */\n\t}\n}\n\n\nINT\tSet_BurstMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Value;\n\n\tValue = simple_strtol(arg, 0, 10);\n\n\tif (Value == 1)\n\t{\n\t\tpAd->CommonCfg.bRalinkBurstMode= TRUE;\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\tAsicEnableRalinkBurstMode(pAd);\n\t}\n\telse\n\t{\n\t\tpAd->CommonCfg.bRalinkBurstMode = FALSE;\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE);\n\t\tAsicDisableRalinkBurstMode(pAd);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_BurstMode_Proc ::%s\\n\", \n\t\t\t\t(pAd->CommonCfg.bRalinkBurstMode == TRUE) ? \"enabled\" : \"disabled\"));\n\n\treturn TRUE;\n}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef DOT11_VHT_AC\nVOID assoc_vht_info_debugshow(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN VHT_CAP_IE *vht_cap,\n\tIN VHT_OP_IE *vht_op)\n{\n\tVHT_CAP_INFO *cap_info;\n\tVHT_MCS_SET *mcs_set;\n\tVHT_OP_INFO *op_info;\n\tVHT_MCS_MAP *mcs_map;\n\n\n\tif (!WMODE_CAP_AC(pAd->CommonCfg.PhyMode))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Peer - 11AC VHT Info\\n\"));\n\tif (vht_cap)\n\t{\n\t\tcap_info = &vht_cap->vht_cap;\n\t\tmcs_set = &vht_cap->mcs_set;\n\n\t\thex_dump(\"peer vht_cap raw data\", (UCHAR *)cap_info, sizeof(VHT_CAP_INFO));\n\t\thex_dump(\"peer vht_mcs raw data\", (UCHAR *)mcs_set, sizeof(VHT_MCS_SET));\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tVHT Cap Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tMaxMpduLen(%d), BW(%d), SGI_80M(%d), TxSTBC(%d), RxSTBC(%d), +HTC-VHT(%d)\\n\",\n\t\t\t\tcap_info->max_mpdu_len, cap_info->ch_width, cap_info->sgi_80M, cap_info->tx_stbc,\n\t\t\t\tcap_info->rx_stbc, cap_info->htc_vht_cap));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tMaxAmpduExp(%d), VhtLinkAdapt(%d), RxAntConsist(%d), TxAntConsist(%d)\\n\",\n\t\t\t\tcap_info->max_ampdu_exp, cap_info->vht_link_adapt, cap_info->rx_ant_consistency, cap_info->tx_ant_consistency));\n\t\tmcs_map = &mcs_set->rx_mcs_map;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tRxMcsSet: HighRate(%d), RxMCSMap(%d,%d,%d,%d,%d,%d,%d)\\n\",\n\t\t\tmcs_set->rx_high_rate, mcs_map->mcs_ss1, mcs_map->mcs_ss2, mcs_map->mcs_ss3,\n\t\t\tmcs_map->mcs_ss4, mcs_map->mcs_ss5, mcs_map->mcs_ss6, mcs_map->mcs_ss7));\n\t\tmcs_map = &mcs_set->tx_mcs_map;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tTxMcsSet: HighRate(%d), TxMcsMap(%d,%d,%d,%d,%d,%d,%d)\\n\",\n\t\t\tmcs_set->tx_high_rate, mcs_map->mcs_ss1, mcs_map->mcs_ss2, mcs_map->mcs_ss3,\n\t\t\tmcs_map->mcs_ss4, mcs_map->mcs_ss5, mcs_map->mcs_ss6, mcs_map->mcs_ss7));\n\t}\n\n\tif (vht_op)\n\t{\n\t\top_info = &vht_op->vht_op_info;\n\t\tmcs_map = &vht_op->basic_mcs_set;\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tHT OP Info: \\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tChannel Width(%d), CenteralFreq1(%d), CenteralFreq2(%d)\\n\",\n\t\t\top_info->ch_width, op_info->center_freq_1, op_info->center_freq_2));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tBasicMCSSet(SS1:%d, SS2:%d, SS3:%d, SS4:%d, SS5:%d, SS6:%d, SS7:%d)\\n\",\n\t\t\tmcs_map->mcs_ss1, mcs_map->mcs_ss2, mcs_map->mcs_ss3,\n\t\t\tmcs_map->mcs_ss4, mcs_map->mcs_ss5, mcs_map->mcs_ss6,\n\t\t\tmcs_map->mcs_ss7));\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\n}\n#endif /* DOT11_VHT_AC */\n\n\nINT Set_RateAdaptInterval(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING arg)\n{\n\tUINT32 ra_time, ra_qtime;\n\tPSTRING token;\n\tchar sep = ':';\n\tULONG irqFlags;\n\n/*\n\tThe ra_interval inupt string format should be d:d, in units of ms. \n\t\t=>The first decimal number indicates the rate adaptation checking period, \n\t\t=>The second decimal number indicates the rate adaptation quick response checking period.\n*/\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s():%s\\n\", __FUNCTION__, arg));\n\t\n\ttoken = strchr(arg, sep);\n\tif (token != NULL)\n\t{\n\t\t*token = '\\0';\n\n\t\tif (strlen(arg) && strlen(token+1))\n\t\t{\n\t\t\tra_time = simple_strtol(arg, 0, 10);\n\t\t\tra_qtime = simple_strtol(token+1, 0, 10);\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s():Set RateAdaptation TimeInterval as(%d:%d) ms\\n\", \n\t\t\t\t\t\t__FUNCTION__, ra_time, ra_qtime));\n\n\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, irqFlags);\n\t\t\tpAd->ra_interval = ra_time;\n\t\t\tpAd->ra_fast_interval = ra_qtime;\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (pAd->ApCfg.ApQuickResponeForRateUpTimerRunning == TRUE)\n\t\t\t{\n\t\t\t\tBOOLEAN Cancelled;\n\t\t\t\t\n\t\t\t\tRTMPCancelTimer(&pAd->ApCfg.ApQuickResponeForRateUpTimer, &Cancelled);\t\n\t\t\t\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = FALSE;\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT  */\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, irqFlags);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\t\n\treturn FALSE;\n\n}\n\n\nINT Set_VcoPeriod_Proc(\n\tIN RTMP_ADAPTER\t\t*pAd,\n\tIN PSTRING\t\t\targ)\n{\n\tpAd->chipCap.VcoPeriod = simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"VCO Period = %d seconds\\n\", pAd->chipCap.VcoPeriod));\n\treturn TRUE;\n}\n\n#ifdef SINGLE_SKU\nINT Set_ModuleTxpower_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT16 Value;\n\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Do NOT accept this command after interface is up.\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tValue = (UINT16)simple_strtol(arg, 0, 10);\n\tpAd->CommonCfg.ModuleTxpower = Value;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_ModuleTxpower_Proc::(ModuleTxpower=%d)\\n\", pAd->CommonCfg.ModuleTxpower));\n\treturn TRUE;\n}\n#endif /* SINGLE_SKU */\n\n\n#ifdef FPGA_MODE\nINT set_tx_kickcnt(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tpAd->tx_kick_cnt = (INT)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():tx_kick_cnt=%d\\n\", __FUNCTION__, pAd->tx_kick_cnt));\n\n\treturn TRUE;\n}\n\n\nINT set_data_phy_mode(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tpAd->data_phy = (INT)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_phy=%d\\n\", __FUNCTION__, pAd->data_phy));\n\t\n\treturn TRUE;\n}\n\n\nINT set_data_bw(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tpAd->data_bw = (UCHAR)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_bw=%d\\n\", __FUNCTION__, pAd->data_bw));\n\n\treturn TRUE;\n}\n\n\nINT set_data_mcs(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tUCHAR mcs = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tpAd->data_mcs = ((mcs / 10) <<4) | (mcs % 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_mcs=%d\\n\", __FUNCTION__, pAd->data_mcs));\n\n\treturn TRUE;\n}\n\n\nINT set_data_gi(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tpAd->data_gi = (UCHAR)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_gi=%d\\n\", __FUNCTION__, pAd->data_gi));\n\n\treturn TRUE;\n}\n\n\nINT set_data_basize(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tpAd->data_basize = (UCHAR)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_basize=%d\\n\", __FUNCTION__, pAd->data_basize));\n\n\treturn TRUE;\n}\n\n\nINT set_fpga_mode(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tULONG fpga_on;\n\t\n\tfpga_on = simple_strtol(arg, 0, 10);\n\n\tif (fpga_on & 2)\n\t{\n\t\tpAd->data_phy = MODE_VHT;\n\t\tpAd->data_bw = BW_80;\n\t\tpAd->data_gi = 1;\n\t\tpAd->data_mcs = 7;\n\t\tpAd->data_basize = 31;\n#ifdef CONFIG_AP_SUPPORT\n\t\tpAd->ApCfg.MBSSID[0].bAutoTxRateSwitch = FALSE;\n#endif /* CONFIG_AP_SUPPORT */\n\t} else {\n#ifdef CONFIG_AP_SUPPORT\n\t\tpAd->ApCfg.MBSSID[0].bAutoTxRateSwitch = TRUE;\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n\tif (fpga_on & 4)\n\t\tpAd->data_mcs = (1 <<4) | 7;\n\n\tpAd->fpga_on = fpga_on;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): fpga_on=%d\\n\", __FUNCTION__, pAd->fpga_on));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_phy=%d\\n\", __FUNCTION__, pAd->data_phy));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_bw=%d\\n\", __FUNCTION__, pAd->data_bw));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_mcs=%d\\n\", __FUNCTION__, pAd->data_mcs));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_gi=%d\\n\", __FUNCTION__, pAd->data_gi));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): data_basize=%d\\n\", __FUNCTION__, pAd->data_basize));\n\n#ifdef CONFIG_AP_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): bAutoTxRateSwitch=%d\\n\",\n\t\t\t\t__FUNCTION__,\n\t\t\t\tpAd->ApCfg.MBSSID[0].bAutoTxRateSwitch));\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\treturn TRUE;\n}\n\n#endif /* FPGA_MODE */\n\n#ifdef WFA_VHT_PF\nINT set_force_amsdu(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tpAd->force_amsdu = (simple_strtol(arg, 0, 10) > 0 ? TRUE : FALSE);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): force_amsdu=%d\\n\",\n\t\t\t\t__FUNCTION__, pAd->force_amsdu));\n\treturn TRUE;\n}\n#endif /* WFA_VHT_PF */\n\n#ifdef RLT_RF\nINT set_rf(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tINT bank_id = 0, rf_id = 0, rv = 0;\n\tUCHAR rf_val = 0;\n\t\n\tif (arg)\n\t{\n\t\trv = sscanf(arg, \"%d-%d-%x\", &(bank_id), &(rf_id), &(rf_val));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():rv = %d, bank_id = %d, rf_id = %d, rf_val = 0x%02x\\n\", __FUNCTION__, rv, bank_id, rf_id, rf_val));\n\t\tif (rv == 3)\n\t\t{\n\t\t\trlt_rf_write(pAd, (UCHAR)bank_id, (UCHAR)rf_id, (UCHAR)rf_val);\n\t\t\t\n\t\t\trlt_rf_read(pAd, bank_id, rf_id, &rf_val);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():%d %03d 0x%02X\\n\", __FUNCTION__, bank_id, rf_id, rf_val));\n\t\t}\n\t\telse if (rv == 2)\n\t\t{\n\t\t\trlt_rf_read(pAd, bank_id, rf_id, &rf_val);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():%d %03d 0x%02X\\n\", __FUNCTION__, bank_id, rf_id, rf_val));\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n#endif /* RLT_RF */\n\nstatic struct {\n\tPSTRING name;\n\tINT (*show_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg, ULONG BufLen);\n} *PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC, RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC[] = {\n#ifdef DBG\n\t{\"SSID\",\t\t\t\t\tShow_SSID_Proc}, \n\t{\"WirelessMode\",\t\t\tShow_WirelessMode_Proc},       \n\t{\"TxBurst\",\t\t\t\t\tShow_TxBurst_Proc},\n\t{\"TxPreamble\",\t\t\t\tShow_TxPreamble_Proc},\n\t{\"TxPower\",\t\t\t\t\tShow_TxPower_Proc},\n\t{\"Channel\",\t\t\t\t\tShow_Channel_Proc},            \n\t{\"BGProtection\",\t\t\tShow_BGProtection_Proc},\n\t{\"RTSThreshold\",\t\t\tShow_RTSThreshold_Proc},       \n\t{\"FragThreshold\",\t\t\tShow_FragThreshold_Proc},      \n#ifdef DOT11_N_SUPPORT\n\t{\"HtBw\",\t\t\t\t\tShow_HtBw_Proc},\n\t{\"HtMcs\",\t\t\t\t\tShow_HtMcs_Proc},\n\t{\"HtGi\",\t\t\t\t\tShow_HtGi_Proc},\n\t{\"HtOpMode\",\t\t\t\tShow_HtOpMode_Proc},\n\t{\"HtExtcha\",\t\t\t\tShow_HtExtcha_Proc},\n\t{\"HtMpduDensity\",\t\t\tShow_HtMpduDensity_Proc},\n\t{\"HtBaWinSize\",\t\t        Show_HtBaWinSize_Proc},\n\t{\"HtRdg\",\t\t        \tShow_HtRdg_Proc},\n\t{\"HtAmsdu\",\t\t        \tShow_HtAmsdu_Proc},\n\t{\"HtAutoBa\",\t\t        Show_HtAutoBa_Proc},\n#endif /* DOT11_N_SUPPORT */\n\t{\"CountryRegion\",\t\t\tShow_CountryRegion_Proc},\n\t{\"CountryRegionABand\",\t\tShow_CountryRegionABand_Proc},\n\t{\"CountryCode\",\t\t\t\tShow_CountryCode_Proc},\n#ifdef AGGREGATION_SUPPORT\n\t{\"PktAggregate\",\t\t\tShow_PktAggregate_Proc},       \n#endif\n\n#ifdef WMM_SUPPORT\n\t{\"WmmCapable\",\t\t\t\tShow_WmmCapable_Proc},         \n#endif         \n\t{\"IEEE80211H\",\t\t\t\tShow_IEEE80211H_Proc},\n#ifdef CONFIG_STA_SUPPORT\t\n    {\"NetworkType\",\t\t\t\tShow_NetworkType_Proc},        \n#ifdef WSC_STA_SUPPORT\n    {\"WpsApBand\",\t\t\t\tShow_WpsPbcBand_Proc},\n    {\"Manufacturer\",\t\t\tShow_WpsManufacturer_Proc},\n    {\"ModelName\",\t\t\t\tShow_WpsModelName_Proc},\n    {\"DeviceName\",\t\t\t\tShow_WpsDeviceName_Proc},\n    {\"ModelNumber\",\t\t\t\tShow_WpsModelNumber_Proc},\n    {\"SerialNumber\",\t\t\tShow_WpsSerialNumber_Proc},\n    {\"Uuid\",\t\t\t\t\tShow_WpsUuid_Proc},\n#endif /* WSC_STA_SUPPORT */\n\t{\"WPAPSK\",\t\t\t\t\tShow_WPAPSK_Proc},\n\t{\"AutoReconnect\", \t\t\tShow_AutoReconnect_Proc},\n#endif /* CONFIG_STA_SUPPORT */\n\t{\"AuthMode\",\t\t\t\tShow_AuthMode_Proc},           \n\t{\"EncrypType\",\t\t\t\tShow_EncrypType_Proc},         \n\t{\"DefaultKeyID\",\t\t\tShow_DefaultKeyID_Proc},       \n\t{\"Key1\",\t\t\t\t\tShow_Key1_Proc},               \n\t{\"Key2\",\t\t\t\t\tShow_Key2_Proc},               \n\t{\"Key3\",\t\t\t\t\tShow_Key3_Proc},               \n\t{\"Key4\",\t\t\t\t\tShow_Key4_Proc},               \n\t{\"PMK\",\t\t\t\t\t\tShow_PMK_Proc},\n#ifdef SINGLE_SKU\n\t{\"ModuleTxpower\",\t\t\tShow_ModuleTxpower_Proc},\n#endif /* SINGLE_SKU */\n#endif /* DBG */\n\t{\"rainfo\",\t\t\t\t\tShow_STA_RAInfo_Proc},\n\t{NULL, NULL}\n};\n\n\nINT RTMPShowCfgValue(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tpName,\n\tIN\tPSTRING\t\t\tpBuf,\n\tIN\tUINT32\t\t\tMaxLen)\n{\n\tINT\tStatus = 0;\t\n\t\n\tfor (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)\n\t{\n\t\tif (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name)) \n\t\t{\t\t\t\t\t\t\n\t\t\tif(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf, MaxLen))\n\t\t\t\tStatus = -EINVAL;\n\t\t\tbreak;  /*Exit for loop.*/\n\t\t}\n\t}\n\n\tif(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL)\n\t{\n\t\tsnprintf(pBuf, MaxLen, \"\\n\");\n\t\tfor (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)\n\t\t{\n\t\t\tif ((strlen(pBuf) + strlen(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name)) >= MaxLen)\n\t\t\t\tbreak;\n\t\t\tsprintf(pBuf, \"%s%s\\n\", pBuf, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);\n\t\t}\n\t}\n\t\n\treturn Status;\n}\n"
  },
  {
    "path": "src/common/cmm_mac_usb.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n\n#ifdef RTMP_MAC_USB\n\n\n#include\t\"rt_config.h\"\n\n\nstatic NDIS_STATUS RTMPAllocUsbBulkBufStruct(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PURB *ppUrb,\n\tIN PVOID *ppXBuffer,\n\tIN INT\tbufLen,\n\tIN ra_dma_addr_t *pDmaAddr,\n\tIN PSTRING pBufName)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\t\n\t*ppUrb = RTUSB_ALLOC_URB(0);\n\tif (*ppUrb == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<-- ERROR in Alloc urb struct for %s !\\n\", pBufName));\n\t\treturn NDIS_STATUS_RESOURCES;\n\t}\n\t\n\t*ppXBuffer = RTUSB_URB_ALLOC_BUFFER(pObj->pUsb_Dev, bufLen, pDmaAddr);\n\tif (*ppXBuffer == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<-- ERROR in Alloc Bulk buffer for %s!\\n\", pBufName));\n\t\treturn NDIS_STATUS_RESOURCES;\n\t}\n\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NDIS_STATUS RTMPFreeUsbBulkBufStruct(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PURB *ppUrb,\n\tIN PUCHAR *ppXBuffer,\n\tIN INT bufLen,\n\tIN ra_dma_addr_t data_dma)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tif (NULL != *ppUrb) {\n\t\tRTUSB_UNLINK_URB(*ppUrb);\n\t\tRTUSB_FREE_URB(*ppUrb);\n\t\t*ppUrb = NULL;\n\t}\n\t\n\tif (NULL != *ppXBuffer) {\n\t\tRTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, bufLen,\t*ppXBuffer, data_dma);\n\t\t*ppXBuffer = NULL;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef RESOURCE_PRE_ALLOC\nVOID RTMPResetTxRxRingMemory(\n\tIN RTMP_ADAPTER * pAd)\n{\n\tUINT index, i, acidx;\n\tPTX_CONTEXT pNullContext   = &pAd->NullContext[0];\n\tPTX_CONTEXT pPsPollContext = &pAd->PsPollContext;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\tunsigned int IrqFlags;\n\n\t/* Free TxSwQueue Packet*/\n\tfor (index = 0; index < NUM_OF_TX_RING; index++)\n\t{\n\t\tPQUEUE_ENTRY pEntry;\n\t\tPNDIS_PACKET pPacket;\n\t\tPQUEUE_HEADER pQueue;\n\n\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\tpQueue = &pAd->TxSwQueue[index];\n\t\twhile (pQueue->Head)\n\t\t{\n\t\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t}\n\t\t RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t}\n\n\t/* unlink all urbs for the RECEIVE buffer queue.*/\n\tfor(i=0; i<(RX_RING_SIZE); i++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\t\tif (pRxContext->pUrb)\n\t\t\tRTUSB_UNLINK_URB(pRxContext->pUrb);\n\t}\n\n\tif (pCmdRspEventContext->pUrb)\n\t\tRTUSB_UNLINK_URB(pCmdRspEventContext->pUrb);\n\n\t/* unlink PsPoll urb resource*/\n\tif (pPsPollContext && pPsPollContext->pUrb)\n\t\tRTUSB_UNLINK_URB(pPsPollContext->pUrb);\n\n\t/* Free NULL frame urb resource*/\n\tif (pNullContext && pNullContext->pUrb)\n\t\tRTUSB_UNLINK_URB(pNullContext->pUrb);\n\n\n\t/* Free mgmt frame resource*/\n\tfor(i = 0; i < MGMT_RING_SIZE; i++)\n\t{\n\t\tPTX_CONTEXT pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;\n\t\tif (pMLMEContext)\n\t\t{\n\t\t\tif (NULL != pMLMEContext->pUrb)\n\t\t\t{\n\t\t\t\tRTUSB_UNLINK_URB(pMLMEContext->pUrb);\n\t\t\t\tRTUSB_FREE_URB(pMLMEContext->pUrb);\n\t\t\t\tpMLMEContext->pUrb = NULL;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (NULL != pAd->MgmtRing.Cell[i].pNdisPacket) \n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pAd->MgmtRing.Cell[i].pNdisPacket, NDIS_STATUS_FAILURE);\n\t\t\tpAd->MgmtRing.Cell[i].pNdisPacket = NULL;\n\t\t\tif (pMLMEContext)\n\t\t\t\tpMLMEContext->TransferBuffer = NULL; \n\t\t}\n\t\t\n\t}\n\t\n\t\n\t/* Free Tx frame resource*/\n\tfor (acidx = 0; acidx < 4; acidx++)\n\t{\n\t\tPHT_TX_CONTEXT pHTTXContext = &(pAd->TxContext[acidx]);\n\t\tif (pHTTXContext && pHTTXContext->pUrb)\n\t\t\tRTUSB_UNLINK_URB(pHTTXContext->pUrb);\n\t}\n\t\n\tfor(i=0; i<6; i++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->BulkOutLock[i]);\n\t}\n\n\tNdisFreeSpinLock(&pAd->BulkInLock);\n\tNdisFreeSpinLock(&pAd->CmdRspLock);\n\tNdisFreeSpinLock(&pAd->MLMEBulkOutLock);\n\n\tNdisFreeSpinLock(&pAd->CmdQLock);\n#ifdef RALINK_ATE\n\tNdisFreeSpinLock(&pAd->GenericLock);\n#endif /* RALINK_ATE */\n\t/* Clear all pending bulk-out request flags.*/\n\tRTUSB_CLEAR_BULK_FLAG(pAd, 0xffffffff);\n\t\n\tfor (i = 0; i < NUM_OF_TX_RING; i++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->TxContextQueueLock[i]);\n\t}\n\t\n/*\n\tNdisFreeSpinLock(&pAd->MacTabLock);\n\tfor(i=0; i<MAX_LEN_OF_BA_REC_TABLE; i++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->BATable.BARecEntry[i].RxReRingLock);\n\t}\n*/\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCalls USB_InterfaceStop and frees memory allocated for the URBs\n    calls NdisMDeregisterDevice and frees the memory\n    allocated in VNetInitialize for the Adapter Object\n\nArguments:\n\t*pAd\t\t\t\tthe raxx interface data pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID\tRTMPFreeTxRxRingMemory(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUINT                i, acidx;\n\tPTX_CONTEXT\t\t\tpNullContext   = &pAd->NullContext[0];\n\tPTX_CONTEXT\t\t\tpPsPollContext = &pAd->PsPollContext;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"---> RTMPFreeTxRxRingMemory\\n\"));\n\n\t/* Free all resources for the RECEIVE buffer queue.*/\n\tfor(i=0; i<(RX_RING_SIZE); i++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\t\tif (pRxContext)\n\t\t\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t&pRxContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pRxContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\tMAX_RXBULK_SIZE, \n\t\t\t\t\t\t\t\t\t\tpRxContext->data_dma);\n\t}\n\n\t/* Command Response */\n\tRTMPFreeUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t &pCmdRspEventContext->pUrb,\n\t\t\t\t\t\t\t (PUCHAR *)&pCmdRspEventContext->CmdRspBuffer,\n\t\t\t\t\t\t\t CMD_RSP_BULK_SIZE,\n\t\t\t\t\t\t\t pCmdRspEventContext->data_dma); \n\t\t\t\t\t\n\n\n\t/* Free PsPoll frame resource*/\n\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t&pPsPollContext->pUrb, \n\t\t\t\t\t\t\t\t(PUCHAR *)&pPsPollContext->TransferBuffer, \n\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\tpPsPollContext->data_dma);\n\n\t/* Free NULL frame resource*/\n\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t&pNullContext->pUrb, \n\t\t\t\t\t\t\t\t(PUCHAR *)&pNullContext->TransferBuffer, \n\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\tpNullContext->data_dma);\n\n\t/* Free mgmt frame resource*/\n\tfor(i = 0; i < MGMT_RING_SIZE; i++)\n\t{\n\t\tPTX_CONTEXT pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;\n\t\tif (pMLMEContext)\n\t\t{\n\t\t\tif (NULL != pMLMEContext->pUrb)\n\t\t\t{\n\t\t\t\tRTUSB_UNLINK_URB(pMLMEContext->pUrb);\n\t\t\t\tRTUSB_FREE_URB(pMLMEContext->pUrb);\n\t\t\t\tpMLMEContext->pUrb = NULL;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (NULL != pAd->MgmtRing.Cell[i].pNdisPacket) \n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pAd->MgmtRing.Cell[i].pNdisPacket, NDIS_STATUS_FAILURE);\n\t\t\tpAd->MgmtRing.Cell[i].pNdisPacket = NULL;\n\t\t\tif (pMLMEContext)\n\t\t\t\tpMLMEContext->TransferBuffer = NULL; \n\t\t}\n\t}\n\t\n\tif (pAd->MgmtDescRing.AllocVa)\n\t\tos_free_mem(pAd, pAd->MgmtDescRing.AllocVa);\n\t\n\t\n\t/* Free Tx frame resource*/\n\tfor (acidx = 0; acidx < 4; acidx++)\n\t{\n\t\tPHT_TX_CONTEXT pHTTXContext = &(pAd->TxContext[acidx]);\n\t\tif (pHTTXContext)\n\t\t\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t&pHTTXContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pHTTXContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\tsizeof(HTTX_BUFFER), \n\t\t\t\t\t\t\t\t\t\tpHTTXContext->data_dma);\n\t}\n\t\n\tif (pAd->FragFrame.pFragPacket)\n\t\tRELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket, NDIS_STATUS_SUCCESS);\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"<--- RTMPFreeTxRxRingMemory\\n\"));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Initialize receive data structures.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_RESOURCES\n\nNote:\n\tInitialize all receive releated private buffer, include those define\n\tin RTMP_ADAPTER structure and all private data structures. The major\n\twork is to allocate buffer for each packet and chain buffer to \n\tNDIS packet descriptor.\n========================================================================\n*/\nNDIS_STATUS\tNICInitRecv(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\t\t\t\ti;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitRecv\\n\"));\n\n\n\tpAd->PendingRx = 0;\n\tpAd->NextRxBulkInReadIndex \t= 0;\t/* Next Rx Read index*/\n\tpAd->NextRxBulkInIndex\t\t= 0 ; /*RX_RING_SIZE -1;  Rx Bulk pointer*/\n\tpAd->NextRxBulkInPosition \t= 0;\n\n\tfor (i = 0; i < (RX_RING_SIZE); i++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\n\t\tASSERT((pRxContext->TransferBuffer != NULL));\n\t\tASSERT((pRxContext->pUrb != NULL));\n\t\t\n\t\tNdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);\n\n\t\tpRxContext->pAd\t= pAd;\n\t\tpRxContext->pIrp = NULL;\n\t\tpRxContext->InUse = FALSE;\n\t\tpRxContext->IRPPending = FALSE;\n\t\tpRxContext->Readable\t= FALSE;\n\t\tpRxContext->bRxHandling = FALSE;\n\t\tpRxContext->BulkInOffset = 0;\n\t}\n\n\tpCmdRspEventContext->pAd = pAd;\n\tpCmdRspEventContext->InUse = FALSE;\n\tpCmdRspEventContext->Readable = FALSE;\n\tNdisZeroMemory(pCmdRspEventContext->CmdRspBuffer, CMD_RSP_BULK_SIZE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitRecv()\\n\"));\n\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Initialize transmit data structures.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_RESOURCES\n\nNote:\n========================================================================\n*/\nNDIS_STATUS\tNICInitTransmit(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\t\t\ti, acidx;\n\tNDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\n\tPTX_CONTEXT\t\tpNullContext   = &(pAd->NullContext[0]);\n\tPTX_CONTEXT\t\tpPsPollContext = &(pAd->PsPollContext);\n\tPTX_CONTEXT\t\tpMLMEContext = NULL;\n\tPVOID\t\t\tRingBaseVa;\n\tRTMP_MGMT_RING  *pMgmtRing;\n\tPVOID pTransferBuffer;\n\tPURB\tpUrb;\n\tra_dma_addr_t data_dma;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitTransmit\\n\"));\n\n\n\t/* Init 4 set of Tx parameters*/\n\tfor(acidx = 0; acidx < NUM_OF_TX_RING; acidx++)\n\t{\n\t\t/* Initialize all Transmit releated queues*/\n\t\tInitializeQueueHeader(&pAd->TxSwQueue[acidx]);\n\n\t\t/* Next Local tx ring pointer waiting for buck out*/\n\t\tpAd->NextBulkOutIndex[acidx] = acidx;\n\t\tpAd->BulkOutPending[acidx] = FALSE; /* Buck Out control flag\t*/\n\t}\n\n\n\tdo\n\t{\n\t\t\n\t\t/* TX_RING_SIZE, 4 ACs*/\n\t\t\n\t\tfor(acidx=0; acidx<NUM_OF_TX_RING; acidx++)\n\t\t{\n\t\t\tPHT_TX_CONTEXT\tpHTTXContext = &(pAd->TxContext[acidx]);\n\n\t\t\tpTransferBuffer = pHTTXContext->TransferBuffer;\n\t\t\tpUrb = pHTTXContext->pUrb;\n\t\t\tdata_dma = pHTTXContext->data_dma;\n\t\t\t\n\t\t\tASSERT( (pTransferBuffer != NULL));\n\t\t\tASSERT( (pUrb != NULL));\n\t\t\t\n\t\t\tNdisZeroMemory(pHTTXContext, sizeof(HT_TX_CONTEXT));\n\t\t\tpHTTXContext->TransferBuffer = pTransferBuffer;\n\t\t\tpHTTXContext->pUrb = pUrb;\n\t\t\tpHTTXContext->data_dma = data_dma;\n\t\t\t\n\t\t\tNdisZeroMemory(pHTTXContext->TransferBuffer->Aggregation, 4);\t\t\t\n\t\t\t\n\t\t\tpHTTXContext->pAd = pAd;\n\t\t\tpHTTXContext->BulkOutPipeId = acidx;\n\t\t\tpHTTXContext->bRingEmpty = TRUE;\n\t\t\tpHTTXContext->bCopySavePad = FALSE;\n\n\t\t\tpAd->BulkOutPending[acidx] = FALSE;\n\t\t}\n\n\t\t\n\t\t\n\t\t/* MGMT_RING_SIZE*/\n\t\t\n\t\tNdisZeroMemory(pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocSize);\n\t\tRingBaseVa = pAd->MgmtDescRing.AllocVa;\n\n\t\t/* Initialize MGMT Ring and associated buffer memory*/\n\t\tpMgmtRing = &pAd->MgmtRing;\n\t\tfor (i = 0; i < MGMT_RING_SIZE; i++)\n\t\t{\n\t\t\t/* link the pre-allocated Mgmt buffer to MgmtRing.Cell*/\n\t\t\tpMgmtRing->Cell[i].AllocSize = sizeof(TX_CONTEXT);\n\t\t\tpMgmtRing->Cell[i].AllocVa = RingBaseVa;\n\t\t\tpMgmtRing->Cell[i].pNdisPacket = NULL;\n\t\t\tpMgmtRing->Cell[i].pNextNdisPacket = NULL;\n\n\t\t\t/*Allocate URB for MLMEContext*/\n\t\t\tpMLMEContext = (PTX_CONTEXT) pAd->MgmtRing.Cell[i].AllocVa;\n\t\t\tpMLMEContext->pUrb = RTUSB_ALLOC_URB(0);\n\t\t\tif (pMLMEContext->pUrb == NULL)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<-- ERROR in Alloc TX MLMEContext[%d] urb!! \\n\", i));\n\t\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t\t\tgoto err; \n\t\t\t}\n\t\t\tpMLMEContext->pAd = pAd;\n\t\t\tpMLMEContext->SelfIdx = i;\n\t\t\t\n\t\t\t/* Offset to next ring descriptor address*/\n\t\t\tRingBaseVa = (PUCHAR) RingBaseVa + sizeof(TX_CONTEXT);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MGMT Ring: total %d entry allocated\\n\", i));\n\t\t\n\t\t/*pAd->MgmtRing.TxSwFreeIdx = (MGMT_RING_SIZE - 1);*/\n\t\tpAd->MgmtRing.TxSwFreeIdx = MGMT_RING_SIZE;\n\t\tpAd->MgmtRing.TxCpuIdx = 0;\n\t\tpAd->MgmtRing.TxDmaIdx = 0;\n\n\n\t\t\n\t\t/* NullContext*/\n\t\t\n\t\tpTransferBuffer = pNullContext->TransferBuffer;\n\t\tpUrb = pNullContext->pUrb;\n\t\tdata_dma = pNullContext->data_dma;\n\t\t\n\t\tNdisZeroMemory(pNullContext, sizeof(TX_CONTEXT));\n\t\tpNullContext->TransferBuffer = pTransferBuffer;\n\t\tpNullContext->pUrb = pUrb;\n\t\tpNullContext->data_dma = data_dma;\n\t\tpNullContext->pAd = pAd;\n\n\n\t\t\n\t\t/* PsPollContext*/\n\t\t\n\t\tpTransferBuffer = pPsPollContext->TransferBuffer;\n\t\tpUrb = pPsPollContext->pUrb;\n\t\tdata_dma = pPsPollContext->data_dma;\n\t\tNdisZeroMemory(pPsPollContext, sizeof(TX_CONTEXT));\n\t\tpPsPollContext->TransferBuffer = pTransferBuffer;\n\t\tpPsPollContext->pUrb = pUrb;\n\t\tpPsPollContext->data_dma = data_dma;\n\t\tpPsPollContext->pAd = pAd;\n\t\tpPsPollContext->LastOne = TRUE;\n\n\t}   while (FALSE);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitTransmit(Status=%d)\\n\", Status));\n\n\treturn Status;\n\n\t/* --------------------------- ERROR HANDLE --------------------------- */\nerr:\t\n\tif (pAd->MgmtDescRing.AllocVa)\n\t{\n\t\tpMgmtRing = &pAd->MgmtRing;\n\t\tfor(i = 0; i < MGMT_RING_SIZE; i++)\n\t\t{\n\t\t\tpMLMEContext = (PTX_CONTEXT) pAd->MgmtRing.Cell[i].AllocVa;\n\t\t\tif (pMLMEContext)\n\t\t\t\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t&pMLMEContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pMLMEContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\t\t\t\tpMLMEContext->data_dma);\n\t\t}\n\t\tos_free_mem(pAd, pAd->MgmtDescRing.AllocVa);\n\t\tpAd->MgmtDescRing.AllocVa = NULL;\n\t}\n\t\n\t/* Here we didn't have any pre-allocated memory need to free.*/\n\t\n\treturn Status;\t\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Allocate DMA memory blocks for send, receive.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\tNDIS_STATUS_RESOURCES\n\nNote:\n========================================================================\n*/\nNDIS_STATUS\tRTMPAllocTxRxRingMemory(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\t\n\tNDIS_STATUS Status = NDIS_STATUS_FAILURE;\n\tPTX_CONTEXT pNullContext   = &(pAd->NullContext);\n\tPTX_CONTEXT pPsPollContext = &(pAd->PsPollContext);\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &(pAd->CmdRspEventContext);\n\tINT i, acidx;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> RTMPAllocTxRxRingMemory\\n\"));\n\n\tdo\n\t{\n\t\t\n\t\t/* Init send data structures and related parameters*/\n\t\t\n\t\t\n\t\t/* TX_RING_SIZE, 4 ACs*/\n\t\t\n\t\tfor(acidx=0; acidx<NUM_OF_TX_RING; acidx++)\n\t\t{\n\t\t\tPHT_TX_CONTEXT\tpHTTXContext = &(pAd->TxContext[acidx]);\n\n\t\t\tNdisZeroMemory(pHTTXContext, sizeof(HT_TX_CONTEXT));\n\t\t\t/*Allocate URB and bulk buffer*/\n\t\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t&pHTTXContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pHTTXContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\t\t\tsizeof(HTTX_BUFFER), \n\t\t\t\t\t\t\t\t\t\t\t\t&pHTTXContext->data_dma,\n\t\t\t\t\t\t\t\t\t\t\t\t\"HTTxContext\");\n\t\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\t\tgoto err;\n\t\t}\n\n\n\t\t\n\t\t/* MGMT_RING_SIZE*/\n\t\t\n\t\t/* Allocate MGMT ring descriptor's memory*/\n\t\tpAd->MgmtDescRing.AllocSize = MGMT_RING_SIZE * sizeof(TX_CONTEXT);\n\t\tos_alloc_mem(pAd, (PUCHAR *)(&pAd->MgmtDescRing.AllocVa), pAd->MgmtDescRing.AllocSize);\n\t\tif (pAd->MgmtDescRing.AllocVa == NULL)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"Failed to allocate a big buffer for MgmtDescRing!\\n\"));\n\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t\tgoto err;\n\t\t}\n\n\n\t\t\n\t\t/* NullContext*/\n\t\t\n\t\tNdisZeroMemory(pNullContext, sizeof(TX_CONTEXT));\n\t\t/*Allocate URB*/\n\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t&pNullContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pNullContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\t\t\t\t&pNullContext->data_dma,\n\t\t\t\t\t\t\t\t\t\t\t\"TxNullContext\");\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tgoto err;\n\n\t\t\n\t\t/* PsPollContext*/\n\t\t\n\t\tNdisZeroMemory(pPsPollContext, sizeof(TX_CONTEXT));\n\t\t/*Allocate URB*/\n\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t&pPsPollContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pPsPollContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\t\t\t\t&pPsPollContext->data_dma,\n\t\t\t\t\t\t\t\t\t\t\t\"TxPsPollContext\");\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tgoto err;\n\n\t\t\n\t\t\n\t\t/* Init receive data structures and related parameters*/\n\t\tfor (i = 0; i < (RX_RING_SIZE); i++)\n\t\t{\n\t\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\n\t\t\t/*Allocate URB*/\n\t\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t&pRxContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pRxContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\t\t\tMAX_RXBULK_SIZE, \n\t\t\t\t\t\t\t\t\t\t\t\t&pRxContext->data_dma, \n\t\t\t\t\t\t\t\t\t\t\t\t\"RxContext\");\n\t\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\t\tgoto err;\n\t\t\n\t\t}\n\t\n\t\t/* Init command response event related parameters */\n\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t\t\t   &pCmdRspEventContext->pUrb,\n\t\t\t\t\t\t\t\t\t\t   (PVOID *)&pCmdRspEventContext->CmdRspBuffer,\n\t\t\t\t\t\t\t\t\t\t   CMD_RSP_BULK_SIZE,\n\t\t\t\t\t\t\t\t\t\t   &pCmdRspEventContext->data_dma,\n\t\t\t\t\t\t\t\t\t\t   \"CmdRspEventContext\");\n\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tgoto err;\n\t\t\n\n\t\tNdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));\n\t\tpAd->FragFrame.pFragPacket =  RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);\n\n\t\tif (pAd->FragFrame.pFragPacket == NULL)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t}\n\t} while (FALSE);\n\t\n\tDBGPRINT_S(Status, (\"<-- RTMPAllocTxRxRingMemory, Status=%x\\n\", Status));\n\treturn Status;\n\nerr:\n\tStatus = NDIS_STATUS_RESOURCES;\n\tRTMPFreeTxRxRingMemory(pAd);\n\t\n\treturn Status;\n}\n\n\nNDIS_STATUS RTMPInitTxRxRingMemory\n\t(IN RTMP_ADAPTER *pAd)\n{\n\tINT\t\t\t\tnum;\n\tNDIS_STATUS\t\tStatus;\n\n\t/* Init the CmdQ and CmdQLock*/\n\tNdisAllocateSpinLock(pAd, &pAd->CmdQLock);\t\n\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\tRTInitializeCmdQ(&pAd->CmdQ);\n\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\n\t\n\tNdisAllocateSpinLock(pAd, &pAd->MLMEBulkOutLock);\n\tNdisAllocateSpinLock(pAd, &pAd->BulkInLock);\n\tNdisAllocateSpinLock(pAd, &pAd->CmdRspLock);\n\tfor(num =0 ; num < 6; num++)\n\t{\n\t\tNdisAllocateSpinLock(pAd, &pAd->BulkOutLock[num]);\n\t}\n\n\n\tfor (num = 0; num < NUM_OF_TX_RING; num++)\n\t{\n\t\tNdisAllocateSpinLock(pAd, &pAd->TxContextQueueLock[num]);\n\t}\n\t\n#ifdef RALINK_ATE\n\tNdisAllocateSpinLock(pAd, &pAd->GenericLock);\n#endif /* RALINK_ATE */\n\n\tNICInitRecv(pAd);\n\n\n\tStatus = NICInitTransmit(pAd);\n\t\n\treturn Status;\n\t\n}\n\n\n#else\n\n/*\n========================================================================\nRoutine Description:\n    Initialize receive data structures.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_RESOURCES\n\nNote:\n\tInitialize all receive releated private buffer, include those define\n\tin RTMP_ADAPTER structure and all private data structures. The mahor\n\twork is to allocate buffer for each packet and chain buffer to \n\tNDIS packet descriptor.\n========================================================================\n*/\nNDIS_STATUS\tNICInitRecv(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\t\t\t\ti;\n\tNDIS_STATUS\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\tPOS_COOKIE\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitRecv\\n\"));\n\tpObj = pObj;\n\n\t/*InterlockedExchange(&pAd->PendingRx, 0);*/\n\tpAd->PendingRx = 0;\n\tpAd->NextRxBulkInReadIndex \t= 0;\t/* Next Rx Read index*/\n\tpAd->NextRxBulkInIndex\t\t= 0 ; /*RX_RING_SIZE -1;  Rx Bulk pointer*/\n\tpAd->NextRxBulkInPosition \t= 0;\n\n\tfor (i = 0; i < (RX_RING_SIZE); i++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\n\t\t/*Allocate URB*/\n\t\tpRxContext->pUrb = RTUSB_ALLOC_URB(0);\t\t\n\t\tif (pRxContext->pUrb == NULL) \n\t\t{\n\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t\tgoto out1;\n\t\t}\n\n\t\t/* Allocate transfer buffer*/\n\t\tpRxContext->TransferBuffer = RTUSB_URB_ALLOC_BUFFER(pObj->pUsb_Dev, MAX_RXBULK_SIZE, &pRxContext->data_dma);\n\t\tif (pRxContext->TransferBuffer == NULL)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t\tgoto out1;\n\t\t}\n\n\t\tNdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);\n\n\t\tpRxContext->pAd\t= pAd;\n\t\tpRxContext->pIrp = NULL;\n\t\tpRxContext->InUse\t\t= FALSE;\n\t\tpRxContext->IRPPending\t= FALSE;\n\t\tpRxContext->Readable\t= FALSE;\n\t\t/*pRxContext->ReorderInUse = FALSE;*/\n\t\tpRxContext->bRxHandling = FALSE;\n\t\tpRxContext->BulkInOffset = 0;\n\t}\n\t\n\tpCmdRspEventContext->pAd = pAd;\n\tpCmdRspEventContext->InUse = FALSE;\n\tpCmdRspEventContext->Readable\t= FALSE;\n\tNdisZeroMemory(pCmdRspEventContext->TransferBuffer, CMD_RSP_BULK_SIZE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitRecv(Status=%d)\\n\", Status));\n\treturn Status;\n\nout1:\n\tfor (i = 0; i < (RX_RING_SIZE); i++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\n\t\tif (NULL != pRxContext->TransferBuffer)\n\t\t{\n\t\t\tRTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, MAX_RXBULK_SIZE, \n\t\t\t\t\t\t\t\tpRxContext->TransferBuffer, pRxContext->data_dma);\n\t\t\tpRxContext->TransferBuffer = NULL;\n\t\t}\n\n\t\tif (NULL != pRxContext->pUrb)\n\t\t{\n\t\t\tRTUSB_UNLINK_URB(pRxContext->pUrb);\n\t\t\tRTUSB_FREE_URB(pRxContext->pUrb);\n\t\t\tpRxContext->pUrb = NULL;\n\t\t}\n\t}\n\t\n\treturn Status;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Initialize transmit data structures.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_RESOURCES\n\nNote:\n========================================================================\n*/\nNDIS_STATUS\tNICInitTransmit(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\t\t\ti, acidx;\n\tNDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\n\tPTX_CONTEXT\t\tpNullContext   = &(pAd->NullContext[0]);\n\tPTX_CONTEXT\t\tpPsPollContext = &(pAd->PsPollContext);\n\tPTX_CONTEXT\t\tpMLMEContext = NULL;\n\tPOS_COOKIE\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tPVOID\t\t\tRingBaseVa;\n\tRTMP_MGMT_RING  *pMgmtRing;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitTransmit\\n\"));\n\tpObj = pObj;\n\n\t/* Init 4 set of Tx parameters*/\n\tfor(acidx = 0; acidx < NUM_OF_TX_RING; acidx++)\n\t{\n\t\t/* Initialize all Transmit releated queues*/\n\t\tInitializeQueueHeader(&pAd->TxSwQueue[acidx]);\n\n\t\t/* Next Local tx ring pointer waiting for buck out*/\n\t\tpAd->NextBulkOutIndex[acidx] = acidx;\n\t\tpAd->BulkOutPending[acidx] = FALSE; /* Buck Out control flag\t*/\n\t}\n\n\n\tdo\n\t{\n\t\t\n\t\t/* TX_RING_SIZE, 4 ACs*/\n\t\t\n\t\tfor(acidx=0; acidx<NUM_OF_TX_RING; acidx++)\n\t\t{\n\t\t\tPHT_TX_CONTEXT\tpHTTXContext = &(pAd->TxContext[acidx]);\n\n\t\t\tNdisZeroMemory(pHTTXContext, sizeof(HT_TX_CONTEXT));\n\t\t\t/*Allocate URB*/\n\t\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t&pHTTXContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pHTTXContext->TransferBuffer, \n\t\t\t\t\t\t\t\t\t\t\t\tsizeof(HTTX_BUFFER), \n\t\t\t\t\t\t\t\t\t\t\t\t&pHTTXContext->data_dma, \n\t\t\t\t\t\t\t\t\t\t\t\t\"HTTxContext\");\n\t\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\t\tgoto err;\n\n\t\t\tNdisZeroMemory(pHTTXContext->TransferBuffer->Aggregation, 4);\t\t\t\n\t\t\tpHTTXContext->pAd = pAd;\n\t\t\tpHTTXContext->pIrp = NULL;\n\t\t\tpHTTXContext->IRPPending = FALSE;\n\t\t\tpHTTXContext->NextBulkOutPosition = 0;\n\t\t\tpHTTXContext->ENextBulkOutPosition = 0;\n\t\t\tpHTTXContext->CurWritePosition = 0;\n\t\t\tpHTTXContext->CurWriteRealPos = 0;\n\t\t\tpHTTXContext->BulkOutSize = 0;\n\t\t\tpHTTXContext->BulkOutPipeId = acidx;\n\t\t\tpHTTXContext->bRingEmpty = TRUE;\n\t\t\tpHTTXContext->bCopySavePad = FALSE;\n\t\t\tpAd->BulkOutPending[acidx] = FALSE;\n\t\t}\n\n\t\t\n\t\t\n\t\t/* MGMT Ring*/\n\t\t\n\t\t\n\t\t/* Allocate MGMT ring descriptor's memory*/\n\t\tpAd->MgmtDescRing.AllocSize = MGMT_RING_SIZE * sizeof(TX_CONTEXT);\n\t\tos_alloc_mem(pAd, (PUCHAR *)(&pAd->MgmtDescRing.AllocVa), pAd->MgmtDescRing.AllocSize);\n\t\tif (pAd->MgmtDescRing.AllocVa == NULL)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"Failed to allocate a big buffer for MgmtDescRing!\\n\"));\n\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t\tgoto err;\n\t\t}\n\t\tNdisZeroMemory(pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocSize);\n\t\tRingBaseVa     = pAd->MgmtDescRing.AllocVa;\n\n\t\t/* Initialize MGMT Ring and associated buffer memory*/\n\t\tpMgmtRing = &pAd->MgmtRing;\n\t\tfor (i = 0; i < MGMT_RING_SIZE; i++)\n\t\t{\n\t\t\t/* link the pre-allocated Mgmt buffer to MgmtRing.Cell*/\n\t\t\tpMgmtRing->Cell[i].AllocSize = sizeof(TX_CONTEXT);\n\t\t\tpMgmtRing->Cell[i].AllocVa = RingBaseVa;\n\t\t\tpMgmtRing->Cell[i].pNdisPacket = NULL;\n\t\t\tpMgmtRing->Cell[i].pNextNdisPacket = NULL;\n\n\t\t\t/*Allocate URB for MLMEContext*/\n\t\t\tpMLMEContext = (PTX_CONTEXT) pAd->MgmtRing.Cell[i].AllocVa;\n\t\t\tpMLMEContext->pUrb = RTUSB_ALLOC_URB(0);\n\t\t\tif (pMLMEContext->pUrb == NULL)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<-- ERROR in Alloc TX MLMEContext[%d] urb!! \\n\", i));\n\t\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t\t\tgoto err; \n\t\t\t}\n\t\t\tpMLMEContext->pAd = pAd;\n\t\t\tpMLMEContext->pIrp = NULL;\n\t\t\tpMLMEContext->TransferBuffer = NULL;\n\t\t\tpMLMEContext->InUse = FALSE;\n\t\t\tpMLMEContext->IRPPending = FALSE;\n\t\t\tpMLMEContext->bWaitingBulkOut = FALSE;\n\t\t\tpMLMEContext->BulkOutSize = 0;\n\t\t\tpMLMEContext->SelfIdx = i;\n\t\t\t\n\t\t\t/* Offset to next ring descriptor address*/\n\t\t\tRingBaseVa = (PUCHAR) RingBaseVa + sizeof(TX_CONTEXT);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MGMT Ring: total %d entry allocated\\n\", i));\n\t\t\n\t\t/*pAd->MgmtRing.TxSwFreeIdx = (MGMT_RING_SIZE - 1);*/\n\t\tpAd->MgmtRing.TxSwFreeIdx = MGMT_RING_SIZE;\n\t\tpAd->MgmtRing.TxCpuIdx = 0;\n\t\tpAd->MgmtRing.TxDmaIdx = 0;\n\n\t\t\n\t\t/* NullContext URB and usb buffer*/\n\t\t\n\t\tNdisZeroMemory(pNullContext, sizeof(TX_CONTEXT));\n\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t\t\t\t&pNullContext->pUrb,\n\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pNullContext->TransferBuffer,\n\t\t\t\t\t\t\t\t\t\t\tsizeof(TX_BUFFER),\n\t\t\t\t\t\t\t\t\t\t\t&pNullContext->data_dma,\n\t\t\t\t\t\t\t\t\t\t\t\"TxNullContext\");\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tgoto err;\n\n\t\tpNullContext->pAd = pAd;\n\t\tpNullContext->pIrp = NULL;\n\t\tpNullContext->InUse = FALSE;\n\t\tpNullContext->IRPPending = FALSE;\n\n\t\t\n\t\t/* PsPollContext URB and usb buffer*/\n\t\t\n\t\tStatus = RTMPAllocUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t\t\t\t&pPsPollContext->pUrb,\n\t\t\t\t\t\t\t\t\t\t\t(PVOID *)&pPsPollContext->TransferBuffer,\n\t\t\t\t\t\t\t\t\t\t\tsizeof(TX_BUFFER),\n\t\t\t\t\t\t\t\t\t\t\t&pPsPollContext->data_dma,\n\t\t\t\t\t\t\t\t\t\t\t\"TxPsPollContext\");\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tgoto err;\n\n\t\tpPsPollContext->pAd = pAd;\n\t\tpPsPollContext->pIrp = NULL;\n\t\tpPsPollContext->InUse = FALSE;\n\t\tpPsPollContext->IRPPending = FALSE;\n\t\tpPsPollContext->bAggregatible = FALSE;\n\t\tpPsPollContext->LastOne = TRUE;\n\n\t}while (FALSE);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitTransmit(Status=%d)\\n\", Status));\n\n\treturn Status;\n\n\t\n\t/* --------------------------- ERROR HANDLE --------------------------- */\nerr:\n\t/* Free PsPoll frame resource*/\n\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t&pPsPollContext->pUrb, \n\t\t\t\t\t\t\t\t(PUCHAR *)&pPsPollContext->TransferBuffer, \n\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\tpPsPollContext->data_dma);\n\n\t/* Free NULL frame resource*/\n\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t&pNullContext->pUrb, \n\t\t\t\t\t\t\t\t(PUCHAR *)&pNullContext->TransferBuffer, \n\t\t\t\t\t\t\t\tsizeof(TX_BUFFER), \n\t\t\t\t\t\t\t\tpNullContext->data_dma);\n\t\n\t/* MGMT Ring*/\n\tif (pAd->MgmtDescRing.AllocVa)\n\t{\n\t\tpMgmtRing = &pAd->MgmtRing;\n\t\tfor(i=0; i<MGMT_RING_SIZE; i++)\n\t\t{\n\t\t\tpMLMEContext = (PTX_CONTEXT) pAd->MgmtRing.Cell[i].AllocVa;\n\t\t\tif (pMLMEContext)\n\t\t\t{\n\t\t\t\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t\t&pMLMEContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pMLMEContext->TransferBuffer,\n\t\t\t\t\t\t\t\t\t\t\tsizeof(TX_BUFFER),\n\t\t\t\t\t\t\t\t\t\t\tpMLMEContext->data_dma);\n\t\t\t}\n\t\t}\n\t\tos_free_mem(pAd, pAd->MgmtDescRing.AllocVa);\n\t\tpAd->MgmtDescRing.AllocVa = NULL;\n\t}\n\t\n\t\n\t/* Tx Ring*/\n\tfor (acidx = 0; acidx < 4; acidx++)\n\t{\n\t\tPHT_TX_CONTEXT pHTTxContext = &(pAd->TxContext[acidx]);\n\t\tif (pHTTxContext)\n\t\t{\n\t\t\tRTMPFreeUsbBulkBufStruct(pAd, \n\t\t\t\t\t\t\t\t\t\t&pHTTxContext->pUrb, \n\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pHTTxContext->TransferBuffer,\n\t\t\t\t\t\t\t\t\t\tsizeof(HTTX_BUFFER),\n\t\t\t\t\t\t\t\t\t\tpHTTxContext->data_dma);\n\t\t}\n\t}\n\n\t/* Here we didn't have any pre-allocated memory need to free.*/\n\t\n\treturn Status;\t\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Allocate DMA memory blocks for send, receive.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\tNDIS_STATUS_RESOURCES\n\nNote:\n========================================================================\n*/\nNDIS_STATUS\tRTMPAllocTxRxRingMemory(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n/*\tCOUNTER_802_11\tpCounter = &pAd->WlanCounters;*/\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tINT\t\t\t\tnum;\n\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> RTMPAllocTxRxRingMemory\\n\"));\n\n\n\tdo\n\t{\n\t\t/* Init the CmdQ and CmdQLock*/\n\t\tNdisAllocateSpinLock(pAd, &pAd->CmdQLock);\t\n\t\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\t\tRTInitializeCmdQ(&pAd->CmdQ);\n\t\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\n\n\t\tNdisAllocateSpinLock(pAd, &pAd->MLMEBulkOutLock);\n\t\tNdisAllocateSpinLock(pAd, &pAd->BulkInLock);\n\t\tNdisAllocateSpinLock(pAd, &pAd->CmdRspLock);\n\t\tfor(num =0 ; num < 6; num++)\n\t\t{\n\t\t\tNdisAllocateSpinLock(pAd, &pAd->BulkOutLock[num]);\n\t\t}\n\n\t\tfor (num = 0; num < NUM_OF_TX_RING; num++)\n\t\t{\n\t\t\tNdisAllocateSpinLock(pAd, &pAd->TxContextQueueLock[num]);\n\t\t}\n\t\t\n#ifdef RALINK_ATE\n\t\tNdisAllocateSpinLock(pAd, &pAd->GenericLock);\n#endif /* RALINK_ATE */\n\n\n\t\t\n\t\t/* Init send data structures and related parameters*/\n\t\t\n\t\tStatus = NICInitTransmit(pAd);\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tbreak;\n\n\t\t\n\t\t/* Init receive data structures and related parameters*/\n\t\t\n\t\tStatus = NICInitRecv(pAd);\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t\tbreak;\n\n\t\tNdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));\n\t\tpAd->FragFrame.pFragPacket =  RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);\n\n\t\tif (pAd->FragFrame.pFragPacket == NULL)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\t}\n\t} while (FALSE);\n\t\n\tDBGPRINT_S(Status, (\"<-- RTMPAllocTxRxRingMemory, Status=%x\\n\", Status));\n\treturn Status;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCalls USB_InterfaceStop and frees memory allocated for the URBs\n    calls NdisMDeregisterDevice and frees the memory\n    allocated in VNetInitialize for the Adapter Object\n\nArguments:\n\t*pAd\t\t\t\tthe raxx interface data pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID\tRTMPFreeTxRxRingMemory(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUINT                i, acidx;\n\tPTX_CONTEXT\t\t\tpNullContext   = &pAd->NullContext;\n\tPTX_CONTEXT\t\t\tpPsPollContext = &pAd->PsPollContext;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &(pAd->CmdRspEventContext);\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"---> RTMPFreeTxRxRingMemory\\n\"));\n\n\n\t/* Free all resources for the RxRing buffer queue.*/\n\tfor(i=0; i<(RX_RING_SIZE); i++)\n\t{\n\t\tPRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);\n\t\tif (pRxContext)\n\t\t\tRTMPFreeUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t\t\t&pRxContext->pUrb,\n\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pRxContext->TransferBuffer,\n\t\t\t\t\t\t\t\t\t\tMAX_RXBULK_SIZE,\n\t\t\t\t\t\t\t\t\t\tpRxContext->data_dma);\n\t}\n\n\tif (pCmdRspEventContext)\n\t{\n\t\tRTMPFreeUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t &pCmdRspEventContext->pUrb,\n\t\t\t\t\t\t\t\t (PUCHAR *)&pCmdRspEventContext->TransferBuffer,\n\t\t\t\t\t\t\t\t CMD_RSP_BULK_SIZE,\n\t\t\t\t\t\t\t\t pCmdRspEventContext->data_dma);\n\t}\n\n\t/* Free PsPoll frame resource*/\n\tRTMPFreeUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t&pPsPollContext->pUrb,\n\t\t\t\t\t\t\t\t(PUCHAR *)&pPsPollContext->TransferBuffer,\n\t\t\t\t\t\t\t\tsizeof(TX_BUFFER),\n\t\t\t\t\t\t\t\tpPsPollContext->data_dma);\n\n\t/* Free NULL frame resource*/\n\tRTMPFreeUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t&pNullContext->pUrb,\n\t\t\t\t\t\t\t\t(PUCHAR *)&pNullContext->TransferBuffer,\n\t\t\t\t\t\t\t\tsizeof(TX_BUFFER),\n\t\t\t\t\t\t\t\tpNullContext->data_dma);\n\n\t/* Free mgmt frame resource*/\n\tfor(i = 0; i < MGMT_RING_SIZE; i++)\n\t{\n\t\tPTX_CONTEXT pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;\n\t\tif (pMLMEContext)\n\t\t{\n\t\t\tif (NULL != pMLMEContext->pUrb)\n\t\t\t{\n\t\t\t\tRTUSB_UNLINK_URB(pMLMEContext->pUrb);\n\t\t\t\tRTUSB_FREE_URB(pMLMEContext->pUrb);\n\t\t\t\tpMLMEContext->pUrb = NULL;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (NULL != pAd->MgmtRing.Cell[i].pNdisPacket) \n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pAd->MgmtRing.Cell[i].pNdisPacket, NDIS_STATUS_FAILURE);\n\t\t\tpAd->MgmtRing.Cell[i].pNdisPacket = NULL;\n\t\t\tif (pMLMEContext)\n\t\t\tpMLMEContext->TransferBuffer = NULL; \n\t\t}\n\t\t\n\t}\n\tif (pAd->MgmtDescRing.AllocVa)\n\t\tos_free_mem(pAd, pAd->MgmtDescRing.AllocVa);\n\t\n\t\n\t/* Free Tx frame resource*/\n\tfor (acidx = 0; acidx < 4; acidx++)\n\t\t{\n\t\tPHT_TX_CONTEXT pHTTXContext = &(pAd->TxContext[acidx]);\n\t\t\tif (pHTTXContext)\n\t\t\tRTMPFreeUsbBulkBufStruct(pAd,\n\t\t\t\t\t\t\t\t\t\t&pHTTXContext->pUrb,\n\t\t\t\t\t\t\t\t\t\t(PUCHAR *)&pHTTXContext->TransferBuffer,\n\t\t\t\t\t\t\t\t\t\tsizeof(HTTX_BUFFER),\n\t\t\t\t\t\t\t\t\t\tpHTTXContext->data_dma);\n\t\t}\n\t\n\t/* Free fragement frame buffer*/\n\tif (pAd->FragFrame.pFragPacket)\n\t\tRELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket, NDIS_STATUS_SUCCESS);\n\n\n\t/* Free spinlocks*/\n\tfor(i=0; i<6; i++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->BulkOutLock[i]);\n\t}\n\n\tNdisFreeSpinLock(&pAd->BulkInLock);\n\tNdisFreeSpinLock(&pAd->CmdRspLock);\n\tNdisFreeSpinLock(&pAd->MLMEBulkOutLock);\n\n\tNdisFreeSpinLock(&pAd->CmdQLock);\n#ifdef RALINK_ATE\n\tNdisFreeSpinLock(&pAd->GenericLock);\n#endif /* RALINK_ATE */\n\n\t/* Clear all pending bulk-out request flags.*/\n\tRTUSB_CLEAR_BULK_FLAG(pAd, 0xffffffff);\n\t\n\tfor (i = 0; i < NUM_OF_TX_RING; i++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->TxContextQueueLock[i]);\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"<--- RTMPFreeTxRxRingMemory\\n\"));\n}\n\n#endif /* RESOURCE_PRE_ALLOC */\n\n\n/*\n========================================================================\nRoutine Description:\n    Write WLAN MAC address to USB 2870.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\nNote:\n========================================================================\n*/\nNDIS_STATUS\tRTUSBWriteHWMACAddress(\n\tIN\tPRTMP_ADAPTER\t\tpAd)\n{\n\tMAC_DW0_STRUC\tStaMacReg0;\n\tMAC_DW1_STRUC\tStaMacReg1;\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tLARGE_INTEGER\tNOW;\n\n\n\t/* initialize the random number generator*/\n\tRTMP_GetCurrentSystemTime(&NOW);\n\t\n\t/* Write New MAC address to MAC_CSR2 & MAC_CSR3 & let ASIC know our new MAC*/\n\tStaMacReg0.field.Byte0 = pAd->CurrentAddress[0];\n\tStaMacReg0.field.Byte1 = pAd->CurrentAddress[1];\n\tStaMacReg0.field.Byte2 = pAd->CurrentAddress[2];\n\tStaMacReg0.field.Byte3 = pAd->CurrentAddress[3];\n\tStaMacReg1.field.Byte4 = pAd->CurrentAddress[4];\n\tStaMacReg1.field.Byte5 = pAd->CurrentAddress[5];\n\tStaMacReg1.field.U2MeMask = 0xff;\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"Local MAC = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\tpAd->CurrentAddress[0], pAd->CurrentAddress[1], pAd->CurrentAddress[2],\n\t\t\tpAd->CurrentAddress[3], pAd->CurrentAddress[4], pAd->CurrentAddress[5]));\n\n\tRTUSBWriteMACRegister(pAd, MAC_ADDR_DW0, StaMacReg0.word, FALSE);\n\tRTUSBWriteMACRegister(pAd, MAC_ADDR_DW1, StaMacReg1.word, FALSE);\n#ifdef HDR_TRANS_SUPPORT\n\tRTUSBWriteMACRegister(pAd, HT_MAC_ADDR_DW0, StaMacReg0.word, FALSE);\n\tStaMacReg1.word &= 0xff00ffff;\n\tStaMacReg1.word |= 0x00410000;\n\tRTUSBWriteMACRegister(pAd, HT_MAC_ADDR_DW1, StaMacReg1.word, FALSE);\n#endif /* HDR_TRANS_SUPPORT */\n\treturn Status;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Disable DMA.\n\nArguments:\n\t*pAd\t\t\t\tthe raxx interface data pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RT28XXDMADisable(\n\tIN RTMP_ADAPTER \t\t*pAd)\n{\n\t/* no use*/\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Enable DMA.\n\nArguments:\n\t*pAd\t\t\t\tthe raxx interface data pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RT28XXDMAEnable(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tWPDMA_GLO_CFG_STRUC GloCfg;\n\tUSB_DMA_CFG_STRUC\tUsbCfg;\n\t\n\t\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4);\n\n\tif (AsicWaitPDMAIdle(pAd, 200, 1000) == FALSE) {\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn;\n\t}\n\n/*\n\t// USB not support WPDMA\n\tRTMPusecDelay(50);\n\tRTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);\n\tGloCfg.field.EnTXWriteBackDDONE = 1;\n\tGloCfg.field.EnableRxDMA = 1;\n\tGloCfg.field.EnableTxDMA = 1;\n\tRTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== WRITE DMA offset 0x208 = 0x%x\\n\", GloCfg.word));\n*/\n\n\n}\n\n/********************************************************************\n  *\n  *\t2870 Beacon Update Related functions.\n  *\n  ********************************************************************/\n  \n/*\n========================================================================\nRoutine Description:\n    Write Beacon buffer to Asic.\n\nArguments:\n\t*pAd\t\t\t\tthe raxx interface data pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RT28xx_UpdateBeaconToAsic(\n\tIN RTMP_ADAPTER\t\t*pAd,\n\tIN INT\t\t\t\tapidx,\n\tIN ULONG\t\t\tFrameLen,\n\tIN ULONG\t\t\tUpdatePos)\n{\n\tPUCHAR        \tpBeaconFrame = NULL;\n\tUCHAR  \t\t\t*ptr;\n\tUINT  \t\t\ti, padding;\n\tBEACON_SYNC_STRUCT\t*pBeaconSync = pAd->CommonCfg.pBeaconSync;\n\tUINT32\t\t\tlongValue;\n/*\tUSHORT\t\t\tshortValue;*/\n\tBOOLEAN\t\t\tbBcnReq = FALSE;\n\tUCHAR\t\t\tbcn_idx = 0;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n#ifdef CONFIG_AP_SUPPORT\n\tif ((apidx < pAd->ApCfg.BssidNum) && (apidx < MAX_MBSSID_NUM(pAd)))\n\t{\n\t\tbcn_idx = pAd->ApCfg.MBSSID[apidx].BcnBufIdx;\n\t\tpBeaconFrame = (PUCHAR) pAd->ApCfg.MBSSID[apidx].BeaconBuf;\n\t\tbBcnReq = BeaconTransmitRequired(pAd, apidx, &pAd->ApCfg.MBSSID[apidx]);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif (pBeaconFrame == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"pBeaconFrame is NULL!\\n\"));\n\t\treturn;\n\t}\n\n\tif (pBeaconSync == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"pBeaconSync is NULL!\\n\"));\n\t\treturn;\n\t}\n\t\n\tif (bBcnReq == FALSE)\n\t{\n\t\t/* when the ra interface is down, do not send its beacon frame */\n\t\t/* clear all zero */\n\t\tfor(i=0; i < TXWISize; i+=4) {\n\t\t\tRTMP_CHIP_UPDATE_BEACON(pAd, pAd->BeaconOffset[bcn_idx] + i, 0x00, 4);\n\t\t}\n\n\t\tpBeaconSync->BeaconBitMap &= (~(BEACON_BITMAP_MASK & (1 << bcn_idx)));\n\t\tNdisZeroMemory(pBeaconSync->BeaconTxWI[bcn_idx], TXWISize);\n\t}\n\telse\n\t{\n\t\tptr = (PUCHAR)&pAd->BeaconTxWI;\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPWIEndianChange(pAd, ptr, TYPE_TXWI);\n#endif\n\t\tif (NdisEqualMemory(pBeaconSync->BeaconTxWI[bcn_idx], &pAd->BeaconTxWI, TXWISize) == FALSE)\n\t\t{\t/* If BeaconTxWI changed, we need to rewrite the TxWI for the Beacon frames.*/\n\t\t\tpBeaconSync->BeaconBitMap &= (~(BEACON_BITMAP_MASK & (1 << bcn_idx)));\n\t\t\tNdisMoveMemory(pBeaconSync->BeaconTxWI[bcn_idx], &pAd->BeaconTxWI, TXWISize);\n\t\t}\n\t\t\n\t\tif ((pBeaconSync->BeaconBitMap & (1 << bcn_idx)) != (1 << bcn_idx))\n\t\t{\n\t\t\tfor (i=0; i < TXWISize; i+=4)\n\t\t\t{\n\t\t\t\tlongValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);\n\t\t\t\tRTMP_CHIP_UPDATE_BEACON(pAd, pAd->BeaconOffset[bcn_idx] + i, longValue, 4);\n\t\t\t\tptr += 4;\n\t\t\t}\n\t\t}\n\n\t\tptr = pBeaconSync->BeaconBuf[bcn_idx];\n\t\tpadding = (FrameLen & 0x01);\n\t\tNdisZeroMemory((PUCHAR)(pBeaconFrame + FrameLen), padding);\n\t\tFrameLen += padding;\n\t\tfor (i = 0 ; i < FrameLen /*HW_BEACON_OFFSET*/; i += 2)\n\t\t{\n\t\t\tif (NdisEqualMemory(ptr, pBeaconFrame, 2) == FALSE)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(ptr, pBeaconFrame, 2);\n\t\t\t\tlongValue =  *ptr + (*(ptr+1)<<8);\n\t\t\t\tRTMP_CHIP_UPDATE_BEACON(pAd, pAd->BeaconOffset[bcn_idx] + TXWISize + i, longValue, 2);\n\t\t\t}\n\t\t\tptr +=2;\n\t\t\tpBeaconFrame += 2;\n\t\t}\n\n\n\t\tpBeaconSync->BeaconBitMap |= (1 << bcn_idx);\n\t\n\t\t/* For AP interface, set the DtimBitOn so that we can send Bcast/Mcast frame out after this beacon frame.*/\n#ifdef CONFIG_AP_SUPPORT\n\t\t{\n\t\t\tptr = (PUCHAR) (pAd->ApCfg.MBSSID[apidx].BeaconBuf + pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon);\n\t\t\tif ((*(ptr + 4)) & 0x01)\n\t\t\t\tpBeaconSync->DtimBitOn |= (1 << apidx);\n\t\t\telse\n\t\t\t\tpBeaconSync->DtimBitOn &= ~(1 << apidx);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n}\n\n}\n\n\nVOID RTUSBBssBeaconStop(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tBEACON_SYNC_STRUCT\t*pBeaconSync;\n\tint i, offset;\n\tBOOLEAN\tCancelled = TRUE;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tpBeaconSync = pAd->CommonCfg.pBeaconSync;\n\tif (pBeaconSync && pBeaconSync->EnableBeacon)\n\t{\n\t\tINT NumOfBcn = 0;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tNumOfBcn = pAd->ApCfg.BssidNum + MAX_MESH_NUM;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tNumOfBcn = MAX_MESH_NUM;\n#ifdef P2P_SUPPORT\n\t\t\tNumOfBcn +=  MAX_P2P_NUM;\n#endif /* P2P_SUPPORT */\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tRTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);\n\n\t\tfor(i=0; i<NumOfBcn; i++)\n\t\t{\n\t\t\tNdisZeroMemory(pBeaconSync->BeaconBuf[i], HW_BEACON_OFFSET);\n\t\t\tNdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWISize);\n\n\t\t\tfor (offset=0; offset<HW_BEACON_OFFSET; offset+=4)\n\t\t\t\tRTMP_CHIP_UPDATE_BEACON(pAd, pAd->BeaconOffset[i] + offset, 0x00, 4);\n\t\t\t\n\t\t\tpBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;\n\t\t\tpBeaconSync->TimIELocationInBeacon[i] = 0;\n\t\t}\n\t\tpBeaconSync->BeaconBitMap = 0;\n\t\tpBeaconSync->DtimBitOn = 0;\n\t}\n}\n\n\nVOID RTUSBBssBeaconStart(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tint apidx;\n\tBEACON_SYNC_STRUCT\t*pBeaconSync;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n/*\tLARGE_INTEGER \ttsfTime, deltaTime;*/\n\n\tpBeaconSync = pAd->CommonCfg.pBeaconSync;\n\tif (pBeaconSync && pBeaconSync->EnableBeacon)\n\t{\n\t\tINT NumOfBcn = 0;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tNumOfBcn = pAd->ApCfg.BssidNum + MAX_MESH_NUM;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tNumOfBcn = MAX_MESH_NUM;\n#ifdef P2P_SUPPORT\n\t\t\tNumOfBcn +=  MAX_P2P_NUM;\n#endif /* P2P_SUPPORT */\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tfor(apidx=0; apidx<NumOfBcn; apidx++)\n\t\t{\n\t\t\tUCHAR CapabilityInfoLocationInBeacon = 0;\n\t\t\tUCHAR TimIELocationInBeacon = 0;\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tCapabilityInfoLocationInBeacon = pAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon;\n\t\t\t\t\tTimIELocationInBeacon = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon;\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\t\t{\n\t\t\t\t\tCapabilityInfoLocationInBeacon = pAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon;\n\t\t\t\t\tTimIELocationInBeacon = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon;\n\t\t\t\t}\n#else\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tNdisZeroMemory(pBeaconSync->BeaconBuf[apidx], HW_BEACON_OFFSET);\n\t\t\tpBeaconSync->CapabilityInfoLocationInBeacon[apidx] = CapabilityInfoLocationInBeacon;\n\t\t\tpBeaconSync->TimIELocationInBeacon[apidx] = TimIELocationInBeacon;\n\t\t\tNdisZeroMemory(pBeaconSync->BeaconTxWI[apidx], TXWISize);\n\t\t}\n\t\tpBeaconSync->BeaconBitMap = 0;\n\t\tpBeaconSync->DtimBitOn = 0;\n\t\tpAd->CommonCfg.BeaconUpdateTimer.Repeat = TRUE;\n\n\t\tpAd->CommonCfg.BeaconAdjust = 0;\n\t\tpAd->CommonCfg.BeaconFactor = 0xffffffff / (pAd->CommonCfg.BeaconPeriod << 10);\n\t\tpAd->CommonCfg.BeaconRemain = (0xffffffff % (pAd->CommonCfg.BeaconPeriod << 10)) + 1;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBssBeaconStart:BeaconFactor=%d, BeaconRemain=%d!\\n\", \n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.BeaconFactor, pAd->CommonCfg.BeaconRemain));\n\t\tRTMPSetTimer(&pAd->CommonCfg.BeaconUpdateTimer, 10 /*pAd->CommonCfg.BeaconPeriod*/);\n\n\t}\n}\n\n\nVOID RTUSBBssBeaconInit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tBEACON_SYNC_STRUCT\t*pBeaconSync;\n\tint i, j;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tos_alloc_mem(pAd, (PUCHAR *)(&pAd->CommonCfg.pBeaconSync), sizeof(BEACON_SYNC_STRUCT));\n\n\tif (pAd->CommonCfg.pBeaconSync)\n\t{\n\t\tpBeaconSync = pAd->CommonCfg.pBeaconSync;\n\t\tNdisZeroMemory(pBeaconSync, sizeof(BEACON_SYNC_STRUCT));\n\t\tfor(i=0; i < HW_BEACON_MAX_COUNT(pAd); i++)\n\t\t{\n\t\t\tNdisZeroMemory(pBeaconSync->BeaconBuf[i], HW_BEACON_OFFSET);\n\t\t\tpBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;\n\t\t\tpBeaconSync->TimIELocationInBeacon[i] = 0;\n\t\t\tos_alloc_mem(pAd, &pBeaconSync->BeaconTxWI[i], TXWISize);\n\t\t\tif (pBeaconSync->BeaconTxWI[i])\n\t\t\t\tNdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWISize);\n\t\t\telse\n\t\t\t\tgoto error2;\n\t\t}\n\t\tpBeaconSync->BeaconBitMap = 0;\n\t\t\n\t\t/*RTMPInitTimer(pAd, &pAd->CommonCfg.BeaconUpdateTimer, GET_TIMER_FUNCTION(BeaconUpdateExec), pAd, TRUE);*/\n\t\tpBeaconSync->EnableBeacon = TRUE;\n\t}else\n\t\tgoto error1;\n\n\treturn;\n\nerror2:\n\tfor (j = 0; j < i; j++)\n\t\tos_free_mem(pAd, pBeaconSync->BeaconTxWI[j]);\n\t\n\tos_free_mem(pAd, pAd->CommonCfg.pBeaconSync);\n\nerror1:\n\tDBGPRINT(RT_DEBUG_ERROR, (\"memory are not available\\n\"));\n}\n\n\nVOID RTUSBBssBeaconExit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tBEACON_SYNC_STRUCT\t*pBeaconSync;\n\tBOOLEAN\tCancelled = TRUE;\n\tint i;\n\n\tif (pAd->CommonCfg.pBeaconSync)\n\t{\n\t\tpBeaconSync = pAd->CommonCfg.pBeaconSync;\n\t\tpBeaconSync->EnableBeacon = FALSE;\n\t\tRTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);\n\t\tpBeaconSync->BeaconBitMap = 0;\n\n\t\tfor(i=0; i<HW_BEACON_MAX_COUNT(pAd); i++)\n\t\t{\n\t\t\tNdisZeroMemory(pBeaconSync->BeaconBuf[i], HW_BEACON_OFFSET);\n\t\t\tpBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;\n\t\t\tpBeaconSync->TimIELocationInBeacon[i] = 0;\n\t\t\tos_free_mem(pAd, pBeaconSync->BeaconTxWI[i]);\n\t\t}\n\n\t\tos_free_mem(pAd, pAd->CommonCfg.pBeaconSync);\n\t\tpAd->CommonCfg.pBeaconSync = NULL;\n\t}\n}\n\n\n/*\n    ========================================================================\n    Routine Description:\n        For device work as AP mode but didn't have TBTT interrupt event, we need a mechanism \n        to update the beacon context in each Beacon interval. Here we use a periodical timer \n        to simulate the TBTT interrupt to handle the beacon context update.\n        \n    Arguments:\n        SystemSpecific1         - Not used.\n        FunctionContext         - Pointer to our Adapter context.\n        SystemSpecific2         - Not used.\n        SystemSpecific3         - Not used.\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID BeaconUpdateExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n\tPRTMP_ADAPTER\tpAd = (PRTMP_ADAPTER)FunctionContext;\n\tLARGE_INTEGER\ttsfTime_a;/*, tsfTime_b, deltaTime_exp, deltaTime_ab;*/\n\tUINT32\t\t\tdelta, delta2MS, period2US, remain, remain_low, remain_high;\n/*\tBOOLEAN\t\t\tpositive;*/\n\n\tif (pAd->CommonCfg.IsUpdateBeacon==TRUE)\n\t{\n\t\tReSyncBeaconTime(pAd);\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_INF_ON(pAd) && P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tBEACON_SYNC_STRUCT *pBeaconSync = pAd->CommonCfg.pBeaconSync;\n\t\t\tULONG UpTime;\n\n\t\t\t/* update channel utilization */\n\t\t\tNdisGetSystemUpTime(&UpTime);\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t\tQBSS_LoadUpdate(pAd, UpTime);\n#endif /* AP_QLOAD_SUPPORT */\n\n\t\t\n\t\t\tif (pAd->ApCfg.DtimCount == 0 && pBeaconSync->DtimBitOn)\n\t\t\t{\n\t\t\t\tPOS_COOKIE pObj;\n\t\t\t\n\t\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->tbtt_task);\n\t\t\t}\n\n\n\t\t\tAPUpdateAllBeaconFrame(pAd);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t}\n\t\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &tsfTime_a.u.LowPart);\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW1, &tsfTime_a.u.HighPart);\n\t\n\n\t/*\n\t\tCalculate next beacon time to wake up to update.\n\n\t\tBeaconRemain = (0xffffffff % (pAd->CommonCfg.BeaconPeriod << 10)) + 1;\n\n\t\tBackground: Timestamp (us) % Beacon Period (us) shall be 0 at TBTT\n\n\t\tFormula:\t(a+b) mod m = ((a mod m) + (b mod m)) mod m \n\t\t\t\t\t(a*b) mod m = ((a mod m) * (b mod m)) mod m \n\n\t\t==> ((HighPart * 0xFFFFFFFF) + LowPart) mod Beacon_Period\n\t\t==> (((HighPart * 0xFFFFFFFF) mod Beacon_Period) +\n\t\t\t(LowPart mod (Beacon_Period))) mod Beacon_Period\n\t\t==> ((HighPart mod Beacon_Period) * (0xFFFFFFFF mod Beacon_Period)) mod\n\t\t\tBeacon_Period\n\n\t\tSteps:\n\t\t1. Calculate the delta time between now and next TBTT;\n\n\t\t\tdelta time = (Beacon Period) - ((64-bit timestamp) % (Beacon Period))\n\n\t\t\t(1) If no overflow for LowPart, 32-bit, we can calcualte the delta\n\t\t\t\ttime by using LowPart;\n\n\t\t\t\tdelta time = LowPart % (Beacon Period)\n\n\t\t\t(2) If overflow for LowPart, we need to care about HighPart value;\n\n\t\t\t\tdelta time = (BeaconRemain * HighPart + LowPart) % (Beacon Period)\n\n\t\t\t\tEx: if the maximum value is 0x00 0xFF (255), Beacon Period = 100,\n\t\t\t\t\tTBTT timestamp will be 100, 200, 300, 400, ...\n\t\t\t\t\twhen TBTT timestamp is 300 = 1*56 + 44, means HighPart = 1,\n\t\t\t\t\tLow Part = 44\n\n\t\t2. Adjust next update time of the timer to (delta time + 10ms).\n\t*/\n\n\t/*positive=getDeltaTime(tsfTime_a, expectedTime, &deltaTime_exp);*/\n\tperiod2US = (pAd->CommonCfg.BeaconPeriod << 10);\n\tremain_high = pAd->CommonCfg.BeaconRemain * tsfTime_a.u.HighPart;\n\tremain_low = tsfTime_a.u.LowPart % (pAd->CommonCfg.BeaconPeriod << 10);\n\tremain = (remain_high + remain_low)%(pAd->CommonCfg.BeaconPeriod << 10);\n\tdelta = (pAd->CommonCfg.BeaconPeriod << 10) - remain;\n\n\tdelta2MS = (delta>>10);\n\tif (delta2MS > 150)\n\t{\n\t\tpAd->CommonCfg.BeaconUpdateTimer.TimerValue = 100;\n\t\tpAd->CommonCfg.IsUpdateBeacon=FALSE;\n\t}\n\telse\n\t{\n\t\tpAd->CommonCfg.BeaconUpdateTimer.TimerValue = delta2MS + 10;\n\t\tpAd->CommonCfg.IsUpdateBeacon=TRUE;\n\t}\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tif ((pAd->CommonCfg.Channel > 14)\n\t\t\t&& (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t\t&& (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE))\n\t\t{\n\t\t\tChannelSwitchingCountDownProc(pAd);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n}\n\n\n/********************************************************************\n  *\n  *\t2870 Radio on/off Related functions.\n  *\n  ********************************************************************/\nVOID RT28xxUsbMlmeRadioOn(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t\n    DBGPRINT(RT_DEBUG_TRACE,(\"RT28xxUsbMlmeRadioOn()\\n\"));\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\n\t\treturn;\n\n\tASIC_RADIO_ON(pAd, MLME_RADIO_ON);\n\t\n\t/* Clear Radio off flag*/\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAPStartUp(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Set LED*/\n#ifdef CONFIG_STA_SUPPORT\n\tRTMPSetLED(pAd, LED_RADIO_ON);\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\tRTMPSetLED(pAd, LED_LINK_UP);\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* LED_CONTROL_SUPPORT */\n\n}\n\n\nVOID RT28xxUsbMlmeRadioOFF(\n\tIN PRTMP_ADAPTER pAd)\n{\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n\tUINT\tWPSLedMode10;\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RT28xxUsbMlmeRadioOFF()\\n\"));\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\n\t\treturn;\n\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n\tif(LED_MODE(pAd) == WPS_LED_MODE_10)\n\t{\n\t\t//WPSLedMode10 = LINK_STATUS_WPS_MODE10_TURN_OFF;\n\t\t//RTEnqueueInternalCmd(pAd, CMDTHREAD_LED_WPS_MODE10, &WPSLedMode10, sizeof(WPSLedMode10));\n\t}\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_STA_SUPPORT\t\n\t/* Clear PMKID cache.*/\n\tpAd->StaCfg.SavedPMKNum = 0;\n\tRTMPZeroMemory(pAd->StaCfg.SavedPMK, (PMKID_NO * sizeof(BSSID_INFO)));\n\n\t/* Link down first if any association exists*/\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\tif (INFRA_ON(pAd) || ADHOC_ON(pAd))\n\t\t{\n\t\t\tMLME_DISASSOC_REQ_STRUCT DisReq;\n\t\t\tMLME_QUEUE_ELEM *pMsgElem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pMsgElem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif (pMsgElem)\n\t\t\t{\n\t\t\t\tCOPY_MAC_ADDR(&DisReq.Addr, pAd->CommonCfg.Bssid);\n\t\t\t\tDisReq.Reason =  REASON_DISASSOC_STA_LEAVING;\n\n\t\t\t\tpMsgElem->Machine = ASSOC_STATE_MACHINE;\n\t\t\t\tpMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;\n\t\t\t\tpMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);\n\t\t\t\tNdisMoveMemory(pMsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));\n\t\t\t\n\t\t\t\tMlmeDisassocReqAction(pAd, pMsgElem);\n/*\t\t\t\tkfree(pMsgElem);*/\n\t\t\t\tos_free_mem(NULL, pMsgElem);\n\t\t\t\t\n\t\t\t\tRTMPusecDelay(1000);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\n\t/* Set Radio off flag*/\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Link down first if any association exists*/\n\t\tif (INFRA_ON(pAd) || ADHOC_ON(pAd))\n\t\t\tLinkDown(pAd, FALSE);\n\t\tRTMPusecDelay(10000);\n\n\t\t/*==========================================*/\n\t\t/* Clean up old bss table*/\n#ifndef ANDROID_SUPPORT\n/* because abdroid will get scan table when interface down, so we not clean scan table */\n\t\tBssTableInit(&pAd->ScanTab);\n#endif /* ANDROID_SUPPORT */\n\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAPStop(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Set LED*/\n\tRTMPSetLED(pAd, LED_RADIO_OFF);\n#endif /* LED_CONTROL_SUPPORT */\n\n\tASIC_RADIO_OFF(pAd, MLME_RADIO_OFF);\n}\n\n\nVOID RT28xxUsbAsicRadioOff(RTMP_ADAPTER *pAd)\n{\n\tWPDMA_GLO_CFG_STRUC GloCfg;\n\tUINT32 Value;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s\\n\", __FUNCTION__));\n\n\tif (pAd->CommonCfg.CentralChannel)\n\t\tAsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel);\n\telse\n\t\tAsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\t//MT7601DisableTxRx(pAd, GUIRADIO_OFF);\n\t\tMT7601DisableTxRx(pAd, GUIRADIO_OFF);\n\n\t\tAndesPwrSavingOP(pAd, RADIO_OFF, 0x01, 0, 0, 0, 0);\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\t/* Disable Tx/Rx DMA*/\n\tRTUSBReadMACRegister(pAd, WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */\n\tGloCfg.field.EnableTxDMA = 0;\n\tGloCfg.field.EnableRxDMA = 0;\n\tRTUSBWriteMACRegister(pAd, WPDMA_GLO_CFG, GloCfg.word, FALSE); /* abort all TX rings*/\n\n\t/* Waiting for DMA idle*/\n\tAsicWaitPDMAIdle(pAd, 100, 1000);\n\n\t/* Disable MAC Tx/Rx*/\n\tRTUSBReadMACRegister(pAd, MAC_SYS_CTRL, &Value);\n\tValue &= (0xfffffff3);\n\tRTUSBWriteMACRegister(pAd, MAC_SYS_CTRL, Value, FALSE);\n\t}\n#ifdef CONFIG_STA_SUPPORT\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\n\tAsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02, FALSE);   /* send POWER-SAVE command to MCU. Timeout 40us.*/\n\n\t/* Stop bulkin pipe*/\n\tif((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tRTUSBCancelPendingBulkInIRP(pAd);\n\t\tpAd->PendingRx = 0;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== %s\\n\", __FUNCTION__));\n\n}\n\n\nVOID RT28xxUsbAsicRadioOn(RTMP_ADAPTER *pAd)\n{\n\tUINT32 MACValue = 0;\n\tBOOLEAN brc;\n\tUINT RetryRound = 0;\n\tUINT32 rx_filter_flag;\n\tWPDMA_GLO_CFG_STRUC GloCfg;\n\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s\\n\", __FUNCTION__));\n\t\n\tif( (RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT28xxUsbAsicRadioOn: autopm_resume success\\n\"));\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t}\n\telse if ((RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == (-1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RT28xxUsbAsicRadioOn autopm_resume fail ------\\n\"));\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t\treturn;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT28xxUsbAsicRadioOn: autopm_resume do nothing \\n\"));\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n\t\n\t/* make some traffic to invoke EvtDeviceD0Entry callback function*/\n\t\n\n\tRTUSBReadMACRegister(pAd,0x1000,&MACValue);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"A MAC query to invoke EvtDeviceD0Entry, MACValue = 0x%x\\n\",MACValue));\n\n\t/* 1. Send wake up command.*/\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\t\tAndesPwrSavingOP(pAd, RADIO_ON, 0, 0, 0, 0, 0);\n\t\t\n\t\t//pAd->hw_cfg.cent_ch = pAd->CommonCfg.CentralChannel;\n\n\t\t//AsicSwitchChannel(pAd, pAd->hw_cfg.cent_ch, FALSE);\n\t\t//AsicLockChannel(pAd, pAd->hw_cfg.cent_ch);\n\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\tRetryRound = 0;\n\n\tdo\n\t{\n\t\tbrc = AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02, FALSE);   \n\t\tif (brc)\n\t\t{\n\t\t\t/* Wait command ok.*/\n\t\t\tbrc = AsicCheckCommandOk(pAd, PowerWakeCID);\n\t\t}\n\t\tif(brc){\n\t\t\tbreak;      /* PowerWakeCID cmd successed*/\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"PSM :WakeUp Cmd Failed, retry %d\\n\", RetryRound));\n\n\t\t/* try 10 times at most*/\n\t\tif ((RetryRound++) > 10)\n\t\t\tbreak;\n\t\t/* delay and try again*/\n\t\tRTMPusecDelay(200);\n\t} while (TRUE);\n\tif (RetryRound > 10)\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"PSM :ASIC 0x31 WakeUp Cmd may Fail %d*******\\n\", RetryRound));\n\n\t}\n\n\n\t/* 2. Enable Tx/Rx DMA.*/\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4);\n\n\n\t/* enable RX of MAC block*/\n\n#ifdef XLINK_SUPPORT\n\t\tif (pAd->StaCfg.PSPXlink)\n\t\t\trx_filter_flag = PSPXLINK;\n\t\telse\n#endif /* XLINK_SUPPORT */\t\n\t\t\trx_filter_flag = STANORMAL;     /* Staion not drop control frame will fail WiFi Certification.*/\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);\n\n\t/* 3. Turn on RF*/\n/*\tRT28xxUsbAsicRFOn(pAd);*/\n\tif (pChipOps->AsicReverseRfFromSleepMode)\n\t\tpChipOps->AsicReverseRfFromSleepMode(pAd, FALSE);\n\n\n\t/* 4. Clear idle flag*/\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\t\n\t/* Send Bulkin IRPs after flag fRTMP_ADAPTER_IDLE_RADIO_OFF is cleared.*/\n\t/*\t*/\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tRTUSBBulkReceive(pAd);\n\t\tRTUSBBulkCmdRspEventReceive(pAd);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== %s\\n\", __FUNCTION__));\n\n\n}\n\n\nBOOLEAN AsicCheckCommandOk(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t Command)\n{\n\tUINT32\tCmdStatus, CID, i;\n\tUINT32\tThisCIDMask = 0;\n\tINT ret;\n\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd))\n\t{\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, ret);\n\t\tif (ret != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\t\n\ti = 0;\n\tdo\n\t{\n\t\tRTUSBReadMACRegister(pAd, H2M_MAILBOX_CID, &CID);\n\t\tif ((CID & CID0MASK) == Command)\n\t\t{\n\t\t\tThisCIDMask = CID0MASK;\n\t\t\tbreak;\n\t\t}\n\t\telse if ((((CID & CID1MASK)>>8) & 0xff) == Command)\n\t\t{\n\t\t\tThisCIDMask = CID1MASK;\n\t\t\tbreak;\n\t\t}\n\t\telse if ((((CID & CID2MASK)>>16) & 0xff) == Command)\n\t\t{\n\t\t\tThisCIDMask = CID2MASK;\n\t\t\tbreak;\n\t\t}\n\t\telse if ((((CID & CID3MASK)>>24) & 0xff) == Command)\n\t\t{\n\t\t\tThisCIDMask = CID3MASK;\n\t\t\tbreak;\n\t\t}\n\n\t\tRTMPusecDelay(100);\n\t\ti++;\n\t}while (i < 200);\n\n\tret = FALSE;\n\tRTUSBReadMACRegister(pAd, H2M_MAILBOX_STATUS, &CmdStatus);\n\tif (i < 200)\n\t{\n\t\tif (((CmdStatus & ThisCIDMask) == 0x1) || ((CmdStatus & ThisCIDMask) == 0x100) \n\t\t\t|| ((CmdStatus & ThisCIDMask) == 0x10000) || ((CmdStatus & ThisCIDMask) == 0x1000000))\n\t\t\tret = TRUE;\n\t}\n\t\t\tRTUSBWriteMACRegister(pAd, H2M_MAILBOX_STATUS, 0xffffffff, FALSE);\n\t\t\tRTUSBWriteMACRegister(pAd, H2M_MAILBOX_CID, 0xffffffff, FALSE);\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd))\n\t{\n\t\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\n\treturn ret;\n\n}\n\n\n#ifdef WOW_SUPPORT\nVOID RT28xxUsbAsicWOWEnable(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32 Value;\n\t\n\t/* load WOW-enable firmware */\n\tAsicLoadWOWFirmware(pAd, TRUE);\n\t/* put null frame data to MCU memory from 0x7780 */\n\tAsicWOWSendNullFrame(pAd, pAd->CommonCfg.TxRate, (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE));\n\t/* send WOW enable command to MCU. */\n\tAsicSendCommandToMcu(pAd, 0x33, 0xff, pAd->WOW_Cfg.nSelectedGPIO, pAd->WOW_Cfg.nDelay, FALSE);   \n\t/* set GPIO pulse hold time at MSB (Byte) */\n\tRTMP_IO_READ32(pAd, GPIO_HOLDTIME_OFFSET, &Value);\n\tValue &= 0x00FFFFFF;\n\tValue |= (pAd->WOW_Cfg.nHoldTime << 24);\n\tRTMP_IO_WRITE32(pAd, GPIO_HOLDTIME_OFFSET, Value);\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"Send WOW enable cmd (%d/%d/%d)\\n\", pAd->WOW_Cfg.nDelay, pAd->WOW_Cfg.nSelectedGPIO, pAd->WOW_Cfg.nHoldTime));\n\tRTMP_IO_READ32(pAd, GPIO_HOLDTIME_OFFSET, &Value);\n\tDBGPRINT(RT_DEBUG_OFF, (\"Hold time: 0x7020 ==> %x\\n\", Value));\n}\n\nVOID RT28xxUsbAsicWOWDisable(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32 Value;\n\t/* load normal firmware */\n\tAsicLoadWOWFirmware(pAd, FALSE);\n\t/* for suspend/resume, needs to restore RX Queue operation mode to auto mode */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Value);\n\tValue &= ~0x2200;\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Value);\n    //AsicSendCommandToMcu(pAd, 0x34, 0xff, 0x00, 0x00, FALSE);   /* send WOW disable command to MCU*/\n    DBGPRINT(RT_DEBUG_OFF, (\"MCU back to normal mode (%d/%d)\\n\", pAd->WOW_Cfg.nDelay, pAd->WOW_Cfg.nSelectedGPIO));\n}\n#endif /* WOW_SUPPORT */\n#endif /* RTMP_MAC_USB */\n"
  },
  {
    "path": "src/common/cmm_mat.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2007, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    cmm_mat.c\n\n    Abstract:\n\t    Support Mac Address Translation function.\n\n    Note:\n\t\tMAC Address Translation(MAT) engine subroutines, we should just take care \n\t packet to bridge.\n\t\t\n    Revision History:\n    Who             When            What\n    --------------  ----------      ----------------------------------------------\n    Shiang  \t\t02-26-2007      Init version\n*/\n\n#ifdef MAT_SUPPORT\n\n#include \"rt_config.h\"\n\n\nextern MATProtoOps MATProtoIPHandle;\nextern MATProtoOps MATProtoARPHandle;\nextern MATProtoOps MATProtoPPPoEDisHandle;\nextern MATProtoOps MATProtoPPPoESesHandle;\nextern MATProtoOps MATProtoIPv6Handle;\n\nextern UCHAR SNAP_802_1H[];\nextern UCHAR SNAP_BRIDGE_TUNNEL[];\n\n#define MAX_MAT_NODE_ENTRY_NUM\t128\t/* We support maximum 128 node entry for our system */\n#define MAT_NODE_ENTRY_SIZE\t40 /*28\t// bytes   //change to 40 for IPv6Mac Table */\n\ntypedef struct _MATNodeEntry\n{\n\tUCHAR data[MAT_NODE_ENTRY_SIZE];\n\tstruct _MATNodeEntry *next;\n}MATNodeEntry, *PMATNodeEntry;\n\n\n#ifdef KMALLOC_BATCH\n/*static MATNodeEntry *MATNodeEntryPoll = NULL; */\n#endif\n\nstatic MATProtoTable MATProtoTb[]=\n{\n\t{ETH_P_IP, \t\t\t&MATProtoIPHandle},\t\t\t/* IP handler */\n\t{ETH_P_ARP, \t\t&MATProtoARPHandle},\t\t/* ARP handler */\n\t{ETH_P_PPP_DISC,\t&MATProtoPPPoEDisHandle}, \t/* PPPoE discovery stage handler */\n\t{ETH_P_PPP_SES,\t\t&MATProtoPPPoESesHandle},\t/* PPPoE session stage handler */\n\t{ETH_P_IPV6,\t\t&MATProtoIPv6Handle},\t\t/* IPv6 handler */\n};\n\n#define MAX_MAT_SUPPORT_PROTO_NUM (sizeof(MATProtoTb)/sizeof(MATProtoTable))\n\n\n/* --------------------------------- Public Function-------------------------------- */\nNDIS_STATUS MATDBEntryFree(\n\tIN MAT_STRUCT \t*pMatStruct, \n\tIN PUCHAR \t\tNodeEntry)\n{\n#ifdef KMALLOC_BATCH\n\tMATNodeEntry *pPtr, *pMATNodeEntryPoll;\n\n\tpMATNodeEntryPoll = (MATNodeEntry *)pAd->MatCfg.MATNodeEntryPoll;\n\tpPtr = (MATNodeEntry *)NodeEntry;\n\tNdisZeroMemory(pPtr, sizeof(MATNodeEntry));\n\tif (pMATNodeEntryPoll->next)\n\t{\n\t\tpPtr->next = pMATNodeEntryPoll->next;\n\t\tpMATNodeEntryPoll->next = pPtr;\n\t} else {\n\t\tpMATNodeEntryPoll->next = pPtr;\n\t}\n#else\n\tos_free_mem(NULL, NodeEntry);\n#endif\n\n\treturn TRUE;\n\n}\n\nPUCHAR MATDBEntryAlloc(IN MAT_STRUCT *pMatStruct, IN UINT32 size)\n{\n#ifdef KMALLOC_BATCH\n\tMATNodeEntry *pPtr = NULL, *pMATNodeEntryPoll;\n\tpMATNodeEntryPoll = (MATNodeEntry *)pMatStruct->pMATNodeEntryPoll;\n\t\n\tif (pMATNodeEntryPoll->next)\n\t{\n\t\tpPtr = pMATNodeEntryPoll->next;\n\t\tpMATNodeEntryPoll->next = pPtr->next;\n\t}\n\t\n#else\n\tUCHAR *pPtr = NULL;\n\n\tos_alloc_mem(NULL, (PUCHAR *)&pPtr, size);\n\t/*pPtr = kmalloc(size, MEM_ALLOC_FLAG); */\n\n#endif\n\n\treturn (PUCHAR)pPtr;\n}\n\n\nVOID dumpPkt(PUCHAR pHeader, int len)\n{\n\tint i;\n\tPSTRING tmp;\n\n\ttmp = (PSTRING)pHeader;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"--StartDump\\n\"));\n\tfor(i=0;i<len; i++)\n\t{\n\t\tif ( (i%16==0) && (i!=0))\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%02x \", tmp[i]& 0xff));\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n--EndDump\\n\"));\n\n\treturn;\n}\n\n\n/*\n\t========================================================================\n\tRoutine\tDescription:\n\t\tFor each out-going packet, check the upper layer protocol type if need\n\t\tto handled by our APCLI convert engine. If yes, call corresponding handler \n\t\tto handle it.\n\t\t\n\tArguments:\n\t\tpAd\t\t=>Pointer to our adapter\n\t\tpPkt \t=>pointer to the 802.11 header of outgoing packet \n\t\tifIdx   =>Interface Index want to dispatch to.\n\n\tReturn Value:\n\t\tSuccess\t=>\n\t\t\tTRUE\n\t\t\tMapped mac address if found, else return specific default mac address \n\t\t\tdepends on the upper layer protocol type.\n\t\tError\t=>\n\t\t\tFALSE.\n\n\tNote:\n\t\t1.the pPktHdr must be a 802.3 packet.\n\t\t2.Maybe we need a TxD arguments?\n\t\t3.We check every packet here including group mac address becasue we need to\n\t\t  handle DHCP packet.\n\t========================================================================\n */\nPUCHAR MATEngineTxHandle(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNDIS_PACKET\t    pPkt,\n\tIN UINT\t\t\t\tifIdx,\n\tIN UCHAR    OpMode)\n{\n\tPUCHAR \t\tpLayerHdr = NULL, pPktHdr = NULL,  pMacAddr = NULL;\n\tUINT16\t\tprotoType, protoType_ori;\n\tINT\t\t\ti;\n\tstruct _MATProtoOps \t*pHandle = NULL;\n\tPUCHAR  retSkb = NULL;\n\tBOOLEAN bVLANPkt = FALSE;\n\n\n\tif(pAd->MatCfg.status != MAT_ENGINE_STAT_INITED)\n\t\treturn NULL;\n\t\n\tpPktHdr = GET_OS_PKT_DATAPTR(pPkt);\n\tif (!pPktHdr)\n\t\treturn NULL;\n\t\n\tprotoType_ori = get_unaligned((PUINT16)(pPktHdr + 12));\n\t\n\t/* Get the upper layer protocol type of this 802.3 pkt. */\n\tprotoType = OS_NTOHS(protoType_ori);\n\n\t/* handle 802.1q enabled packet. Skip the VLAN tag field to get the protocol type. */\n\tif (protoType == 0x8100)\n\t{\n\t\tprotoType_ori = get_unaligned((PUINT16)(pPktHdr + 12 + 4));\n\t\tprotoType = OS_NTOHS(protoType_ori);\n\t\tbVLANPkt = TRUE;\n\t}\n\n\t\n\t/* For differnet protocol, dispatch to specific handler */\n\tfor (i=0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)\n\t{\n\t\tif (protoType == MATProtoTb[i].protocol)\n\t\t{\n\t\t\tpHandle = MATProtoTb[i].pHandle;\t/* the pHandle must not be null! */\n\t\t\tpLayerHdr = bVLANPkt ? (pPktHdr + MAT_VLAN_ETH_HDR_LEN) : (pPktHdr + MAT_ETHER_HDR_LEN);\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tpMacAddr = &pAd->ApCfg.ApCliTab[ifIdx].CurrentAddress[0];\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tif (pHandle->tx!=NULL)\n\t\t\t\tretSkb = pHandle->tx((PVOID)&pAd->MatCfg, RTPKT_TO_OSPKT(pPkt), pLayerHdr, pMacAddr);\n\n\t\t\treturn retSkb;\n\t\t}\n\t}\n\treturn retSkb;\n}\n\n\n/*\n\t========================================================================\n\tRoutine\tDescription:\n\t\tDepends on the Received packet, check the upper layer protocol type\n\t\tand search for specific mapping table to find out the real destination \n\t\tMAC address.\n\t\t\n\tArguments:\n\t\tpAd\t\t=>Pointer to our adapter\n\t\tpPkt\t=>pointer to the 802.11 header of receviced packet \n\t\tinfIdx\t=>Interface Index want to dispatch to.\n\n\tReturn Value:\n\t\tSuccess\t=>\n\t\t\tMapped mac address if found, else return specific default mac address \n\t\t\tdepends on the upper layer protocol type.\n\t\tError\t=>\n\t\t\tNULL\n\n\tNote:\n\t========================================================================\n */\nPUCHAR MATEngineRxHandle(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNDIS_PACKET\t\tpPkt,\n\tIN UINT\t\t\t\tinfIdx)\n{\n\tPUCHAR\t\t\t\tpMacAddr = NULL;\n\tPUCHAR \t\tpLayerHdr = NULL, pPktHdr = NULL;\n\tUINT16\t\tprotoType;\n\tINT\t\t\ti =0;\n\tstruct _MATProtoOps \t*pHandle = NULL;\n\n\n\tif(pAd->MatCfg.status != MAT_ENGINE_STAT_INITED)\n\t\treturn NULL;\n\n\tpPktHdr = GET_OS_PKT_DATAPTR(pPkt);\n\tif (!pPktHdr)\n\t\treturn NULL;\n\n\t/* If it's a multicast/broadcast packet, we do nothing. */\n\tif (IS_GROUP_MAC(pPktHdr))\n\t\treturn NULL;\n\n\t/* Get the upper layer protocol type of this 802.3 pkt and dispatch to specific handler */\n\tprotoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + 12)));\n\t\n\tfor (i=0; i<MAX_MAT_SUPPORT_PROTO_NUM; i++)\n\t{\n\t\tif (protoType == MATProtoTb[i].protocol)\n\t\t{\n\t\t\tpHandle = MATProtoTb[i].pHandle;\t/* the pHandle must not be null! */\n\t\t\tpLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);\n/*\t\t\tRTMP_SEM_LOCK(&MATDBLock); */\n\t\t\tif(pHandle->rx!=NULL)\n\t\t\t\tpMacAddr = pHandle->rx((PVOID)&pAd->MatCfg, RTPKT_TO_OSPKT(pPkt), pLayerHdr, NULL);\n/*\t\t\tRTMP_SEM_UNLOCK(&MATDBLock); */\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (pMacAddr)\n\t\tNdisMoveMemory(pPktHdr, pMacAddr, MAC_ADDR_LEN);\n\n\treturn NULL;\n\n}\n\n\nBOOLEAN MATPktRxNeedConvert(\n\t\tIN PRTMP_ADAPTER\tpAd, \n\t\tIN PNET_DEV\t\t\tnet_dev)\n{\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tint i = 0;\n\t\t\n\t\t/* Check if the packet will be send to apcli interface. */\n\t\twhile(i<MAX_APCLI_NUM)\n\t\t{\n\t\t\t/*BSSID match the ApCliBssid ?(from a valid AP) */\n\t\t\tif ((pAd->ApCfg.ApCliTab[i].Valid == TRUE) \n\t\t\t\t&& (net_dev == pAd->ApCfg.ApCliTab[i].dev))\n\t\t\t\treturn TRUE;\n\t\t\ti++;\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn FALSE;\n\t\n}\n\n\nNDIS_STATUS MATEngineExit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tstruct _MATProtoOps\t\t*pHandle = NULL;\n\tint i;\n\n\tif(pAd->MatCfg.status == MAT_ENGINE_STAT_EXITED)\n\t\treturn TRUE;\n\t\n\t/* For each registered protocol, we call it's exit handler. */\n\tfor (i=0; i<MAX_MAT_SUPPORT_PROTO_NUM; i++)\n\t{\n\t\t\tpHandle = MATProtoTb[i].pHandle;\n\t\t\tif (pHandle->exit!=NULL)\n\t\t\tpHandle->exit(&pAd->MatCfg);\n\t}\n\n#ifdef KMALLOC_BATCH\n\t/* Free the memory used to store node entries. */\n\tif (pAd->MatCfg.pMATNodeEntryPoll)\n\t{\n\t\tos_free_mem(pAd, pAd->MatCfg.pMATNodeEntryPoll);\n\t\tpAd->MatCfg.pMATNodeEntryPoll = NULL;\n\t}\n#endif\n\n\tpAd->MatCfg.status = MAT_ENGINE_STAT_EXITED;\n\t\n\treturn TRUE;\n\t\n}\n\n\nNDIS_STATUS MATEngineInit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tMATProtoOps \t*pHandle = NULL;\n\tint i, status;\n\n\tif(pAd->MatCfg.status == MAT_ENGINE_STAT_INITED)\n\t\treturn TRUE;\n\t\n#ifdef KMALLOC_BATCH\n\t/* Allocate memory for node entry, we totally allocate 128 entries and link them together. */\n/*\tpAd->MatCfg.pMATNodeEntryPoll = kmalloc(sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM, GFP_KERNEL); */\n\tos_alloc_mem_suspend(NULL, (UCHAR **)&(pAd->MatCfg.pMATNodeEntryPoll), sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM);\n\tif (pAd->MatCfg.pMATNodeEntryPoll != NULL)\n\t{\n\t\tMATNodeEntry *pPtr=NULL;\n\n\t\tNdisZeroMemory(pAd->MatCfg.pMATNodeEntryPoll, sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM);\n\t\tpPtr = pAd->MatCfg.pMATNodeEntryPoll;\n\t\tfor (i = 0; i < (MAX_MAT_NODE_ENTRY_NUM -1); i++)\n\t\t{\n\t\t\tpPtr->next = (MATNodeEntry *)(pPtr+1);\n\t\t\tpPtr = pPtr->next;\n\t\t}\n\t\tpPtr->next = NULL;\n\t} else {\n\t\treturn FALSE;\n\t}\n#endif\n\n\t/* For each specific protocol, call it's init function. */\n\tfor (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)\n\t{\n\t\t\tpHandle = MATProtoTb[i].pHandle;\n\t\tASSERT(pHandle);\n\t\t\tif (pHandle->init != NULL)\n\t\t{\n\t\t\tstatus = pHandle->init(&pAd->MatCfg);\n\t\t\tif (status == FALSE) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MATEngine Init Protocol (0x%x) failed, Stop the MAT Funciton initialization failed!\\n\", MATProtoTb[i].protocol));\n\t\t\t\tgoto init_failed;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MATEngine Init Protocol (0x%04x) success!\\n\", MATProtoTb[i].protocol));\n\t\t}\n\t}\n\n\tNdisAllocateSpinLock(pAd, &pAd->MatCfg.MATDBLock);\n\tpAd->MatCfg.pPriv = (VOID *)pAd;\n\tpAd->MatCfg.status = MAT_ENGINE_STAT_INITED;\n\n\treturn TRUE;\n\ninit_failed:\n\t/* For each specific protocol, call it's exit function. */\n\tfor (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)\n\t{\n\t\tif ((pHandle = MATProtoTb[i].pHandle) != NULL)\n\t\t{\n\t\t\tif (pHandle->exit != NULL)\n\t\t\t{\n\t\t\t\tstatus = pHandle->exit(&pAd->MatCfg);\n\t\t\t\tif (status == FALSE)\n\t\t\t\t\tgoto init_failed;\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef KMALLOC_BATCH\n\tif (pAd->MatCfg.pMATNodeEntryPoll)\n\t\tos_free_mem(pAd, pAd->MatCfg.pMATNodeEntryPoll);\n\tpAd->MatCfg.status = MAT_ENGINE_STAT_EXITED;\n#endif /* KMALLOC_BATCH */\n\n\treturn FALSE;\n\t\n}\n\n#endif /* MAT_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_mat_iparp.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2007, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_mat_iparp.c\n\n\tAbstract:\n\t\tMAT convert engine subroutine for ip base protocols, currently now we \n\tjust handle IP/ARP protocols.\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tShiang      02/26/07      Init version\n*/\n#ifdef MAT_SUPPORT\n\n#include \"rt_config.h\"\n\nstatic NDIS_STATUS MATProto_IP_Init(MAT_STRUCT *pMatCfg);\nstatic NDIS_STATUS MATProto_IP_Exit(MAT_STRUCT *pMatCfg);\nstatic PUCHAR MATProto_IP_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);\nstatic PUCHAR MATProto_IP_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);\n\nstatic NDIS_STATUS MATProto_ARP_Init(MAT_STRUCT *pMatCfg);\nstatic NDIS_STATUS MATProto_ARP_Exit(MAT_STRUCT *pMatCfg);\nstatic PUCHAR MATProto_ARP_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);\nstatic PUCHAR MATProto_ARP_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb,PUCHAR pLayerHdr, PUCHAR pMacAddr);\n\n#define IPV4_ADDR_LEN 4\n\n#define NEED_UPDATE_IPMAC_TB(Mac, IP) (IS_UCAST_MAC(Mac) && IS_GOOD_IP(IP))\n\n\ntypedef struct _IPMacMappingEntry\n{\n\tUINT\tipAddr;\t/* In network order */\n\tUCHAR\tmacAddr[MAC_ADDR_LEN];\n\tULONG\tlastTime;\n\tstruct _IPMacMappingEntry *pNext;\n}IPMacMappingEntry, *PIPMacMappingEntry;\n\n\ntypedef struct _IPMacMappingTable\n{\n\tBOOLEAN\t\t\tvalid;\n\tIPMacMappingEntry *hash[MAT_MAX_HASH_ENTRY_SUPPORT+1]; /*0~63 for specific station, 64 for broadcast MacAddress */\n\tUCHAR\t\t\tcurMcastAddr[MAC_ADDR_LEN]; /* The multicast mac addr for currecnt received packet destined to ipv4 multicast addr */\n}IPMacMappingTable;\n\n\nstruct _MATProtoOps MATProtoIPHandle =\n{\n\t.init = MATProto_IP_Init,\n\t.tx = MATProto_IP_Tx,\n\t.rx = MATProto_IP_Rx,\n\t.exit = MATProto_IP_Exit,\n};\n\nstruct _MATProtoOps MATProtoARPHandle =\n{\n\t.init = MATProto_ARP_Init,\n\t.tx = MATProto_ARP_Tx,\n\t.rx = MATProto_ARP_Rx,\n\t.exit =MATProto_ARP_Exit,\n};\n\n\nVOID dumpIPMacTb(\n\tIN MAT_STRUCT\t*pMatCfg,\n\tIN int \t\t\tindex)\n{\n\tIPMacMappingTable *pIPMacTable;\n\tIPMacMappingEntry *pHead;\n\tint startIdx, endIdx;\n\n\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\tif (!pIPMacTable)\n\t\treturn;\n\t\n\tif (!pIPMacTable->valid)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s():IPMacTable not init yet, so cannot do dump!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\t\n\tif(index < 0)\n\t{\t/* dump all. */\n\t\tstartIdx = 0;\n\t\tendIdx = MAT_MAX_HASH_ENTRY_SUPPORT;\n\t}\n\telse\n\t{\t/* dump specific hash index. */\n\t\tstartIdx = endIdx = index;\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s():\\n\", __FUNCTION__));\n\tfor(; startIdx<= endIdx; startIdx++)\n\t{\n\t\tpHead = pIPMacTable->hash[startIdx];\n\t\twhile(pHead)\n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"IPMac[%d]:\\n\", startIdx));\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\t:IP=0x%x,Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, next=%p\\n\", \n\t\t\t\t\t\t\t\tpHead->ipAddr, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],\n\t\t\t\t\t\t\t\tpHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5], pHead->lastTime,\n\t\t\t\t\t\t\t\tpHead->pNext));\n\t\t\tpHead = pHead->pNext;\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t----EndOfDump!\\n\"));\n\t\n}\n\n\nstatic inline NDIS_STATUS getDstIPFromIpPkt(\n\tIN PUCHAR pIpHdr, \n\tIN UINT *dstIP)\n{\n\t\n\tif (!pIpHdr)\n\t\treturn FALSE;\n\t\n\tNdisMoveMemory(dstIP, (pIpHdr + 16), 4); /*shift 16 for IP header len before DstIP. */\n/*\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Get the dstIP=0x%x\\n\", __FUNCTION__, *dstIP)); */\n\t\n\treturn TRUE;\n}\n\nstatic inline NDIS_STATUS getSrcIPFromIpPkt(\n\tIN PUCHAR pIpHdr,\n\tIN UINT   *pSrcIP)\n{\n\t\n\tif (!pIpHdr)\n\t\treturn FALSE;\n\t\n\tNdisMoveMemory(pSrcIP, (pIpHdr + 12), 4); /*shift 12 for IP header len before DstIP. */\n/*\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Get the srcIP=0x%x\\n\", __FUNCTION__, *pSrcIP)); */\n\t\n\treturn TRUE;\n\t\n}\n\nstatic NDIS_STATUS IPMacTableUpdate(\n\tIN MAT_STRUCT\t\t*pMatCfg,\n\tIN PUCHAR\t\t\tpMacAddr,\n\tIN UINT\t\t\t\tipAddr)\n{\n\tUINT \t\t\t\thashIdx;\n\tIPMacMappingTable *pIPMacTable;\n\tIPMacMappingEntry\t*pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;\n\tULONG\t\t\tnow;\n\n\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\n\tif (!pIPMacTable)\n\t\treturn FALSE;\n\t\t\n\tif (!pIPMacTable->valid)\n\t\treturn FALSE;\n\n\thashIdx = MAT_IP_ADDR_HASH_INDEX(ipAddr);\n\n\tpEntry = pPrev = pIPMacTable->hash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tNdisGetSystemUpTime(&now);\n\t\t\n\t\t/* Find a existed IP-MAC Mapping entry */\n\t\tif (ipAddr == pEntry->ipAddr)\n\t\t{\n\t\t\t/*\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Got the Mac(%02x:%02x:%02x:%02x:%02x:%02x) of mapped IP(%d.%d.%d.%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2], pEntry->macAddr[3],pEntry->macAddr[4],\n\t\t\t\t\t\tpEntry->macAddr[5], (ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff)); \n\t\t\t*/\n\t\t\t/* compare is useless. So we directly copy it into the entry. */\n\t\t\tNdisMoveMemory(pEntry->macAddr, pMacAddr, 6);\n\t\t\tpEntry->lastTime = now;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\t/* handle the age-out situation */\n\t\t\t/*if ((Now - pEntry->lastTime) > MAT_TB_ENTRY_AGEOUT_TIME) */\n\t\t\tif (RTMP_TIME_AFTER(now, pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME))\n\t\t\t{\n\t\t\t\t/* Remove the aged entry */\n\t\t\t\tif (pEntry == pIPMacTable->hash[hashIdx])\n\t\t\t\t{\n\t\t\t\t\tpIPMacTable->hash[hashIdx]= pEntry->pNext;\n\t\t\t\t\tpPrev = pIPMacTable->hash[hashIdx];\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\t\n\t\t\t\t\tpPrev->pNext = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\n\t\t\t\tpEntry = (pPrev == NULL ? NULL: pPrev->pNext);\n\t\t\t\tpMatCfg->nodeCount--;\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tpPrev = pEntry;\n\t\t\t\tpEntry = pEntry->pNext;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/* Allocate a new IPMacMapping entry and insert into the hash */\n\tpNewEntry = (IPMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPMacMappingEntry));\n\tif (pNewEntry != NULL)\n\t{\t\n\t\tpNewEntry->ipAddr = ipAddr;\n\t\tNdisMoveMemory(pNewEntry->macAddr, pMacAddr, 6);\n\t\tpNewEntry->pNext = NULL;\n\t\tNdisGetSystemUpTime(&pNewEntry->lastTime);\n\n\t\tif (pIPMacTable->hash[hashIdx] == NULL)\n\t\t{\t/* Hash list is empty, directly assign it. */\n\t\t\tpIPMacTable->hash[hashIdx] = pNewEntry;\n\t\t} \n\t\telse \n\t\t{\n\t\t\t/* Ok, we insert the new entry into the root of hash[hashIdx] */\n\t\t\tpNewEntry->pNext = pIPMacTable->hash[hashIdx];\n\t\t\tpIPMacTable->hash[hashIdx] = pNewEntry;\n\t\t}\n\t\t/*dumpIPMacTb(pMatCfg, hashIdx); //for debug */\n\n\t\tpMatCfg->nodeCount++;\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\n\nstatic PUCHAR IPMacTableLookUp(\n\tIN MAT_STRUCT\t*pMatCfg,\n\tIN UINT\t\t\tipAddr)\n{\n\tIPMacMappingTable *pIPMacTable;\n\tUINT \t\t\t\thashIdx, ip;\n\tIPMacMappingEntry\t*pEntry = NULL;\n\tPUCHAR\t\t\t\tpGroupMacAddr;\n\n\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\n\tif (!pIPMacTable)\n\t\treturn NULL;\n\t\t\n\tif (!pIPMacTable->valid)\n\t\treturn NULL;\n\t\n\t/*if multicast ip, need converting multicast group address to ethernet address. */\n\tip = ntohl(ipAddr);\t\n\tif (IS_MULTICAST_IP(ip))\t\n\t{\n\t\tpGroupMacAddr = (PUCHAR)(&pIPMacTable->curMcastAddr);\n\t\tConvertMulticastIP2MAC((PUCHAR) &ipAddr, (UCHAR **)(&pGroupMacAddr), ETH_P_IP);\n\t\treturn pIPMacTable->curMcastAddr;\t\n\t}\n\n\t/* Use hash to find out the location of that entry and get the Mac address. */\n\thashIdx = MAT_IP_ADDR_HASH_INDEX(ipAddr);\n\n/*\tspin_lock_irqsave(&IPMacTabLock, irqFlag); */\n\tpEntry = pIPMacTable->hash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tif (pEntry->ipAddr == ipAddr)\n\t\t{\n/*\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): dstMac=%02x:%02x:%02x:%02x:%02x:%02x for mapped dstIP(%d.%d.%d.%d)\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2],\n\t\t\t\t\tpEntry->macAddr[3],pEntry->macAddr[4],pEntry->macAddr[5],\n\t\t\t\t\t(ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff)); \n*/\n\t\t\t\n\t\t\t/*Update the lastTime to prevent the aging before pDA processed! */\n\t\t\tNdisGetSystemUpTime(&pEntry->lastTime);\n\t\t\t\n\t\t\treturn pEntry->macAddr;\n\t\t}\n\t\telse\n\t\t\tpEntry = pEntry->pNext;\n\t}\n\t\n\t/*\n\t\tWe didn't find any matched Mac address, our policy is treat it as\n\t\tbroadcast packet and send to all.\n\t*/\n\treturn pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST]->macAddr;\n\t\n}\n\n\nstatic NDIS_STATUS IPMacTable_RemoveAll(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tIPMacMappingEntry *pEntry;\n\tIPMacMappingTable *pIPMacTable;\n\tINT\t\ti;\n\n\n\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\n\tif (!pIPMacTable)\n\t\treturn TRUE;\n\t\n\tif (pIPMacTable->valid)\n\t{\t\n\t\tpIPMacTable->valid = FALSE;\n\t\tfor (i=0; i<IPMAC_TB_HASH_ENTRY_NUM; i++)\n\t\t{\n\t\t\twhile((pEntry = pIPMacTable->hash[i]) != NULL)\n\t\t\t{\n\t\t\t\tpIPMacTable->hash[i] = pEntry->pNext;\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t}\n\t\t}\n\t}\n\n/*\tkfree(pIPMacTable); */\n\tos_free_mem(NULL, pIPMacTable);\n\tpMatCfg->MatTableSet.IPMacTable = NULL;\n\t\n\treturn TRUE;\n\t\n}\n\n\nstatic NDIS_STATUS IPMacTable_init(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tIPMacMappingTable *pIPMacTable;\n\tIPMacMappingEntry *pEntry = NULL;\n\n\n\tif (pMatCfg->MatTableSet.IPMacTable != NULL)\n\t{\n\t\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\t}\n\telse\n\t{\n/*\t\tpMatCfg->MatTableSet.IPMacTable = kmalloc(sizeof(IPMacMappingTable), GFP_KERNEL); */\n\t\tos_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.IPMacTable), sizeof(IPMacMappingTable));\n\t\tif (pMatCfg->MatTableSet.IPMacTable)\n\t\t{\n\t\t\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\t\t\tNdisZeroMemory(pIPMacTable, sizeof(IPMacMappingTable));\n\t\t} \n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IPMacTable_init(): Allocate memory for IPMacTable failed!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\t\n\tif (pIPMacTable->valid == FALSE)\n\t{\n\t\t/*Set the last hash entry (hash[64]) as our default broadcast Mac address */\n\t\tpEntry = (IPMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPMacMappingEntry));\n\t\tif (!pEntry)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IPMacTable_init(): Allocate memory for IPMacTable broadcast entry failed!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\t/*pEntry->ipAddr = 0; */\n\t\tNdisZeroMemory(pEntry, sizeof(IPMacMappingEntry));\n\t\tNdisMoveMemory(&pEntry->macAddr[0], &BROADCAST_ADDR[0], 6);\n\t\tpEntry->pNext = NULL;\n\t\tpIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST] = pEntry;\n\t\n\t\tpIPMacTable->valid = TRUE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): IPMacTable already inited!\\n\", __FUNCTION__));\n\t}\n\n\treturn TRUE;\n\t\n}\n\n\nstatic NDIS_STATUS MATProto_ARP_Exit(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tINT status;\n\t\t\n\tstatus = IPMacTable_RemoveAll(pMatCfg);\n\n\treturn status;\n}\n\nstatic PUCHAR MATProto_ARP_Rx(\n\tIN MAT_STRUCT \t\t*pMatCfg, \n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR\t\t\tpLayerHdr,\n\tIN PUCHAR \t\t\tpMacAddr)\n{\n\tPUCHAR pArpHdr = NULL, pRealMac = NULL;\n\tPUCHAR\ttgtMac, tgtIP;\n\tBOOLEAN isUcastMac, isGoodIP;\n\n\t\n\tpArpHdr = pLayerHdr;\n\n/*dumpPkt(RTPKT_TO_OSPKT(pSkb)->data, RTPKT_TO_OSPKT(pSkb)->len); */\n\t/* We just take care about the target(Mac/IP address) fields. */\n\ttgtMac = pArpHdr + 18;\n\ttgtIP = tgtMac + 6;\n\t\t\n\t/* isUcastMac = !(00:00:00:00:00:00|| mcastMac); */\n\tisUcastMac = ((tgtMac[0]|tgtMac[1]|tgtMac[2]|tgtMac[3]|tgtMac[4]|tgtMac[5])!=0);\n\tisUcastMac &= ((tgtMac[0] & 0x1)==0);\n\n\t/* isGoodIP = ip address is not 0.0.0.0 */\n\tisGoodIP = (*(UINT *)tgtIP != 0);\n\t\n\t\t\n\tif (isUcastMac && isGoodIP)\n\t\tpRealMac = IPMacTableLookUp(pMatCfg, *(UINT *)tgtIP);\n\t\t\n\t/*\n\t\tFor need replaced mac, we need to replace the targetMAC as correct one to make\n\t\tthe real receiver can receive that.\n\t*/\n\tif (isUcastMac && pRealMac)\n\t\tNdisMoveMemory(tgtMac, pRealMac, MAC_ADDR_LEN);\n\n\tif (pRealMac == NULL)\n\t\tpRealMac = &BROADCAST_ADDR[0];\n/*\t\tpRealMac = pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST]->macAddr; */\n\t\n\treturn pRealMac;\n}\n\nstatic PUCHAR MATProto_ARP_Tx(\n\tIN MAT_STRUCT \t\t*pMatCfg,\n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR \t\t\tpMacAddr)\n{\n\tPUCHAR\tpSMac, pSIP;\n\tBOOLEAN isUcastMac, isGoodIP;\n\tNET_PRO_ARP_HDR *arpHdr;\n\tPUCHAR pPktHdr;\n\tPNDIS_PACKET newSkb = NULL;\n\n\tpPktHdr = GET_OS_PKT_DATAPTR(pSkb);\n\t\n\tarpHdr = (NET_PRO_ARP_HDR *)pLayerHdr;\n\n\t/*\n\t\tCheck the arp header.\n\t\tWe just handle ether type hardware address and IPv4 internet\n\t\taddress type and opcode is  ARP reuqest/response.\n\t*/\n\tif ((arpHdr->ar_hrd != OS_HTONS(ARPHRD_ETHER)) || (arpHdr->ar_pro != OS_HTONS(ETH_P_IP)) ||\n\t\t(arpHdr->ar_op != OS_HTONS(ARPOP_REPLY) && arpHdr->ar_op != OS_HTONS(ARPOP_REQUEST)))\n\t\treturn NULL;\n\n\t/* We just take care about the sender(Mac/IP address) fields. */\n\tpSMac =(PUCHAR)(pLayerHdr + 8);\n\tpSIP = (PUCHAR)(pSMac + MAC_ADDR_LEN);\n\t\n\tisUcastMac = IS_UCAST_MAC(pSMac);\n\tisGoodIP = IS_GOOD_IP(get_unaligned32((PUINT) pSIP));\n\t\n/*\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s(): ARP Pkt=>senderIP=%d.%d.%d.%d, senderMac=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t__FUNCTION__, pSIP[0], pSIP[1], pSIP[2], pSIP[3],\n\t\t\tpSMac[0],pSMac[1],pSMac[2],pSMac[3],pSMac[4],pSMac[5]));\t\n*/\n\tif (isUcastMac && isGoodIP)\n\t\tIPMacTableUpdate(pMatCfg, pSMac, get_unaligned32((PUINT) pSIP));\n\n\t/*\n\t\tFor outgoing unicast mac, we need to replace the senderMAC as ourself to make\n\t\tthe receiver can send to us.\n\t*/\n\tif (isUcastMac)\n\t{\n\t\tif(OS_PKT_CLONED(pSkb)) \n\t\t{\n\t\t\tnewSkb = (PNDIS_PACKET)OS_PKT_COPY(pSkb);\n\t\t\tif(newSkb) \n\t\t\t{\n\t\t\t\tif (IS_VLAN_PACKET(GET_OS_PKT_DATAPTR(newSkb)))\n\t\t\t\t\tpSMac = (PUCHAR)(GET_OS_PKT_DATAPTR(newSkb) + MAT_VLAN_ETH_HDR_LEN + 8);\n\t\t\t\telse\n\t\t\t\t\tpSMac = (PUCHAR)(GET_OS_PKT_DATAPTR(newSkb) + MAT_ETHER_HDR_LEN + 8);\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT(pMacAddr);\n\t\tNdisMoveMemory(pSMac, pMacAddr, MAC_ADDR_LEN);\n\t}\n\n\treturn (PUCHAR)newSkb;\n}\n\n\nstatic NDIS_STATUS MATProto_ARP_Init(\n\tIN MAT_STRUCT \t*pMatCfg)\n{\n\tBOOLEAN status = FALSE;\n\n\tstatus = IPMacTable_init(pMatCfg);\n\t\n\treturn status;\n}\n\n\nstatic NDIS_STATUS MATProto_IP_Exit(\n\tIN MAT_STRUCT\t*pMatCfg)\n{\n\tINT status;\n\t\t\n\tstatus = IPMacTable_RemoveAll(pMatCfg);\n\n\treturn status;\n}\n\n\nstatic PUCHAR MATProto_IP_Rx(\n\tIN MAT_STRUCT \t\t*pMatCfg, \n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR \t\t\tpDevMacAdr)\n{\n\tPUCHAR\t pMacAddr;\n\tUINT   \tdstIP;\n\t\n\t/* Fetch the IP addres from the packet header. */\n\tgetDstIPFromIpPkt(pLayerHdr, &dstIP);\n\tpMacAddr = IPMacTableLookUp(pMatCfg, dstIP); \n\t\n\treturn pMacAddr;\n}\n\nstatic UCHAR  DHCP_MAGIC[]= {0x63, 0x82, 0x53, 0x63};\nstatic PUCHAR MATProto_IP_Tx(\n\tIN MAT_STRUCT \t\t*pMatCfg,\n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR \t\t\tpDevMacAdr)\n{\n\tPUCHAR pSrcMac;\n\tPUCHAR pSrcIP;\n\tBOOLEAN needUpdate;\n\tPUCHAR pPktHdr;\n\n\tpPktHdr = GET_OS_PKT_DATAPTR(pSkb);\n\t\n\tpSrcMac = pPktHdr + 6;\n\tpSrcIP = pLayerHdr + 12;\n\n\n\tneedUpdate = NEED_UPDATE_IPMAC_TB(pSrcMac, get_unaligned32((PUINT)(pSrcIP)));\n\tif (needUpdate)\n\t\tIPMacTableUpdate(pMatCfg, pSrcMac, get_unaligned32((PUINT)(pSrcIP)));\n\n\t/*For UDP packet, we need to check about the DHCP packet, to modify the flag of DHCP discovey/request as broadcast. */\n\tif (*(pLayerHdr + 9) == 0x11)\n\t{\n\t\tPUCHAR udpHdr;\n\t\tUINT16 srcPort, dstPort;\n\t\t\n\t\tudpHdr = pLayerHdr + 20;\n\t\tsrcPort = OS_NTOHS(get_unaligned((PUINT16)(udpHdr)));\n\t\tdstPort = OS_NTOHS(get_unaligned((PUINT16)(udpHdr+2)));\n\t\t\n\t\tif (srcPort==68 && dstPort==67) /*It's a DHCP packet */\n\t\t{\n\t\t\tPUCHAR bootpHdr;\n\t\t\tUINT16 bootpFlag;\t\n\t\t\t\n\t\t\tbootpHdr = udpHdr + 8;\n\t\t\tbootpFlag = OS_NTOHS(get_unaligned((PUINT16)(bootpHdr+10)));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"is bootp packet! bootpFlag=0x%x\\n\", bootpFlag));\n\t\t\tif (bootpFlag != 0x8000) /*check if it's a broadcast request. */\n\t\t\t{\n\t\t\t\tPUCHAR dhcpHdr;\n\t\t\t\t\n\t\t\t\tdhcpHdr = bootpHdr + 236;\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"the DHCP flag is a unicast, dhcp_magic=%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\t\t\t\t\t\tdhcpHdr[0], dhcpHdr[1], dhcpHdr[2], dhcpHdr[3]));\n\t\t\t\tif (NdisEqualMemory(dhcpHdr, DHCP_MAGIC, 4))\n\t\t\t\t{\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"dhcp magic macthed!\\n\"));\t\n\t\t\t\t\tbootpFlag = OS_HTONS(0x8000);\n\t\t\t\t\tNdisMoveMemory((bootpHdr+10), &bootpFlag, 2);\t/*Set the bootp flag as broadcast */\n\t\t\t\t\tNdisZeroMemory((udpHdr+6), 2); /*modify the UDP chksum as zero */\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\n\nstatic NDIS_STATUS MATProto_IP_Init(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tBOOLEAN status;\n\t\n\tstatus = IPMacTable_init(pMatCfg);\n\t\n\treturn status;\n}\n\n\nstatic inline void IPintToIPstr(int ipint, char Ipstr[20], ULONG BufLen)\n{\n\t int temp = 0;\n\t \n\t temp = ipint & 0x000FF;\n\t snprintf(Ipstr, BufLen, \"%d.\", temp);\n\t temp = (ipint>>8) & 0x000FF;\n\t snprintf(Ipstr, BufLen, \"%s%d.\", Ipstr, temp);\n\t temp = (ipint>>16) & 0x000FF;\n\t snprintf(Ipstr, BufLen, \"%s%d.\", Ipstr, temp);\n\t temp = (ipint>>24) & 0x000FF;\n\t snprintf(Ipstr, BufLen, \"%s%d\", Ipstr, temp);\n}\n\n\nVOID getIPMacTbInfo(\n\tIN MAT_STRUCT *pMatCfg, \n\tIN char *pOutBuf,\n\tIN ULONG BufLen)\n{\n\tIPMacMappingTable *pIPMacTable;\n\tIPMacMappingEntry *pHead;\n\tint startIdx, endIdx;\n\tchar Ipstr[20] = {0};\n\n\n\tpIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;\n\tif ((!pIPMacTable) || (!pIPMacTable->valid))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():IPMacTable not init yet!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\t\n\t/* dump all. */\n\tstartIdx = 0;\n\tendIdx = MAT_MAX_HASH_ENTRY_SUPPORT;\n\n\tsprintf(pOutBuf, \"\\n\");\n\tsprintf(pOutBuf+strlen(pOutBuf), \"%-18s%-20s\\n\", \"IP\", \"MAC\");\n\tfor(; startIdx< endIdx; startIdx++)\n\t{\n\t\tpHead = pIPMacTable->hash[startIdx];\n\t\twhile(pHead)\n\t\t{\n/*\t\t\tif (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) */\n\t\t\tif (RtmpOsCmdDisplayLenCheck(strlen(pOutBuf), 30) == FALSE)\n\t\t\t    break;\n\t\t\tNdisZeroMemory(Ipstr, 20);\n\t\t\tIPintToIPstr(pHead->ipAddr, Ipstr, sizeof(Ipstr));\n\t\t\tsprintf(pOutBuf+strlen(pOutBuf), \"%-18s%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\tIpstr, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],\n\t\t\t\tpHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5]);\n\t\t\tpHead = pHead->pNext;\n\t\t}\n\t}\n}\n\n#endif /* MAT_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_mat_ipv6.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2007, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_mat_ipv6.c\n\n\tAbstract:\n\t\tMAT convert engine subroutine for ipv6 base protocols, currently now we \n\tjust handle IPv6/ICMPv6 packets without Authentication/Encryption headers. \n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tShiang      06/03/07      Init version\n*/\n#ifdef MAT_SUPPORT\n\n#include \"rt_config.h\"\n#include \"ipv6.h\"\n\n/*#include <asm/checksum.h> */\n/*#include <net/ip6_checksum.h> */\n\nconst UCHAR IPV6_LOOPBACKADDR[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};\n\nstatic NDIS_STATUS MATProto_IPv6_Init(MAT_STRUCT *pMatCfg);\nstatic NDIS_STATUS MATProto_IPv6_Exit(MAT_STRUCT *pMatCfg);\nstatic PUCHAR MATProto_IPv6_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);\nstatic PUCHAR MATProto_IPv6_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);\n\n#define RT_UDP_HDR_LEN\t8\n\ntypedef struct _IPv6MacMappingEntry\n{\n\tUCHAR ipv6Addr[16];\t/* In network order */\n\tUCHAR macAddr[MAC_ADDR_LEN];\n\tULONG lastTime;\n\tstruct _IPv6MacMappingEntry *pNext;\n}IPv6MacMappingEntry, *PIPv6MacMappingEntry;\n\n\ntypedef struct _IPv6MacMappingTable\n{\n\tBOOLEAN\t\t\tvalid;\n\tIPv6MacMappingEntry *hash[MAT_MAX_HASH_ENTRY_SUPPORT+1]; /*0~63 for specific station, 64 for broadcast MacAddress */\n\tUCHAR\t\t\tcurMcastAddr[MAC_ADDR_LEN];\t/* The multicast mac addr for currecnt received packet destined to ipv6 multicast addr */\n}IPv6MacMappingTable;\n\n\nstruct _MATProtoOps MATProtoIPv6Handle =\n{\n\t.init = MATProto_IPv6_Init,\n\t.tx = MATProto_IPv6_Tx,\n\t.rx = MATProto_IPv6_Rx,\n\t.exit = MATProto_IPv6_Exit,\n};\n\nstatic inline BOOLEAN needUpdateIPv6MacTB(\n\tUCHAR \t\t\t*pMac,\n\tRT_IPV6_ADDR \t*pIPv6Addr)\n{\n\tASSERT(pIPv6Addr);\n\t\n\tif (isMcastEtherAddr(pMac) || isZeroEtherAddr(pMac))\n\t\treturn FALSE;\n\t\n\t/* IPv6 multicast address */\n\tif (IS_MULTICAST_IPV6_ADDR(*pIPv6Addr))\n\t\treturn FALSE;\n\t\n\t/* unspecified address */\n\tif(IS_UNSPECIFIED_IPV6_ADDR(*pIPv6Addr))\n\t\treturn FALSE;\n\n\t/* loopback address */\n\tif (IS_LOOPBACK_IPV6_ADDR(*pIPv6Addr)) \n\t\treturn FALSE;\n\n/*\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s(): Good IPv6 unicast addr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\\n\",\n\t\t\t\t__FUNCTION__, PRINT_IPV6_ADDR(*pIPv6Addr)));\n*/\t\n\treturn TRUE;\n}\n\n\n/*\n\tIPv6 Header Format\n\n     0               1               2               3\n     0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    |Version| Traffic Class |           Flow Label                  |\n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    |      Payload Length           |  Next Header  |   Hop Limit   |\n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    |                                                               |\n    +                                                               +\n    |                      Source Address                           |\n    +                                                               +\n    |                                                               |\n    +                                                               +\n    |                                                               |\n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    |                                                               |\n    +                                                               +\n    |                   Destination Address                         |\n    +                                                               +\n    |                                                               |\n    +                                                               +\n    |                                                               |\n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n\nICMPv6 Format:\n\t|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\t|     Type      |     Code      |           Checksum            |\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\t|                       Message Body                            |\n\t+                                                               +\n\t|                                                               |\n                                    ......\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\n\nNDIS_STATUS  dumpIPv6MacTb(\n\tIN MAT_STRUCT *pMatCfg, \n\tIN int index)\n{\n\tIPv6MacMappingTable *pIPv6MacTable;\n\tIPv6MacMappingEntry *pHead;\n\tint startIdx, endIdx;\n\n\n\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\tif ((!pIPv6MacTable) || (!pIPv6MacTable->valid))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s():IPv6MacTable not init yet, so cannot do dump!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\t\n\t\n\tif(index < 0)\n\t{\t/* dump all. */\n\t\tstartIdx = 0;\n\t\tendIdx = MAT_MAX_HASH_ENTRY_SUPPORT;\n\t}\n\telse\n\t{\t/* dump specific hash index. */\n\t\tstartIdx = endIdx = index;\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s():\\n\", __FUNCTION__));\n\tfor(; startIdx<= endIdx; startIdx++)\n\t{\n\t\tpHead = pIPv6MacTable->hash[startIdx];\n\t\twhile(pHead)\n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"IPv6Mac[%d]:\\n\", startIdx));\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\t:IPv6=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x,Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, next=%p\\n\", \n\t\t\t\t\tPRINT_IPV6_ADDR(*((RT_IPV6_ADDR *)(&pHead->ipv6Addr[0]))), pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],\n\t\t\t\t\tpHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5], pHead->lastTime, pHead->pNext));\n\t\t\tpHead = pHead->pNext;\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t----EndOfDump!\\n\"));\n\n\treturn TRUE;\n}\n\n\n\nstatic NDIS_STATUS IPv6MacTableUpdate(\n\tIN MAT_STRUCT\t\t*pMatCfg,\n\tIN PUCHAR\t\t\tpMacAddr,\n\tIN PCHAR\t\t\tpIPv6Addr)\n{\n\tUINT \t\t\t\thashIdx;\n\tIPv6MacMappingTable\t*pIPv6MacTable;\n\tIPv6MacMappingEntry\t*pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;\n\tULONG\t\t\t\tnow;\n\n\n\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\tif ((!pIPv6MacTable) || (!pIPv6MacTable->valid))\n\t\treturn FALSE;\n\t\n\thashIdx = MAT_IPV6_ADDR_HASH_INDEX(pIPv6Addr);\n\tpEntry = pPrev = pIPv6MacTable->hash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tNdisGetSystemUpTime(&now);\n\t\t\n\t\t/* Find a existed IP-MAC Mapping entry */\n\t\tif (NdisEqualMemory(pIPv6Addr, pEntry->ipv6Addr, IPV6_ADDR_LEN))\n    \t{\n\t\t\t\n\t\t\t/* comparison is useless. So we directly copy it into the entry. */\n\t\t\tNdisMoveMemory(pEntry->macAddr, pMacAddr, 6);\n\t\t\tNdisGetSystemUpTime(&pEntry->lastTime);\n\t\t\t\n\t        return TRUE;\n\t\t}\n        else\n        {\t/* handle the aging-out situation */\n\t\t\tif (RTMP_TIME_AFTER(now, (pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME)))\n        \t{\n        \t\t/* Remove the aged entry */\n\t\t\t\tif (pEntry == pIPv6MacTable->hash[hashIdx])\n\t\t\t\t{\n\t\t\t\t\tpIPv6MacTable->hash[hashIdx]= pEntry->pNext;\n\t\t\t\t\tpPrev = pIPv6MacTable->hash[hashIdx];\n        \t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t        \t\tpPrev->pNext = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t\t\n\t\t\t\tpEntry = (pPrev == NULL ? NULL: pPrev->pNext);\n\t\t\t\tpMatCfg->nodeCount--;\n        \t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tpPrev = pEntry;\n\t            pEntry = pEntry->pNext;\n        \t}\n        }\n\t}\n\n\n\t/* Allocate a new IPv6MacMapping entry and insert into the hash */\n\tpNewEntry = (IPv6MacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPv6MacMappingEntry));\n\tif (pNewEntry != NULL)\n\t{\t\t\n\t\tNdisMoveMemory(pNewEntry->ipv6Addr, pIPv6Addr, IPV6_ADDR_LEN);\n\t\tNdisMoveMemory(pNewEntry->macAddr, pMacAddr, 6);\n\t\tpNewEntry->pNext = NULL;\n\t\tNdisGetSystemUpTime(&pNewEntry->lastTime);\n\n\t\tif (pIPv6MacTable->hash[hashIdx] == NULL)\n\t\t{\t/* Hash list is empty, directly assign it. */\n\t\t\tpIPv6MacTable->hash[hashIdx] = pNewEntry;\n\t\t} \n\t\telse \n\t\t{\n\t\t\t/* Ok, we insert the new entry into the root of hash[hashIdx] */\n\t\t\tpNewEntry->pNext = pIPv6MacTable->hash[hashIdx];\n\t\t\tpIPv6MacTable->hash[hashIdx] = pNewEntry;\n\t\t}\n\t\t/*dumpIPv6MacTb(pMatCfg, hashIdx); //for debug */\n\t\t\n\t\tpMatCfg->nodeCount++;\n\n\t\treturn TRUE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IPv6MacTableUpdate():Insertion failed!\\n\"));\n\t\n\treturn FALSE;\n}\n\n\nstatic PUCHAR IPv6MacTableLookUp(\n\tIN\tMAT_STRUCT\t\t*pMatCfg,\n\tIN\tPUCHAR\t\t\tpIPv6Addr)\n{\n    UINT \t\t\t\thashIdx;\n\tIPv6MacMappingTable\t*pIPv6MacTable;\n    IPv6MacMappingEntry\t*pEntry = NULL;\n\tPUCHAR \t\t\t\tpGroupMacAddr;\n\n\n\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\tif ((!pIPv6MacTable) ||(!pIPv6MacTable->valid))\n        return NULL;\n\t\n\t/*if IPV6 multicast address, need converting multicast group address to ethernet address. */\n\tif (IS_MULTICAST_IPV6_ADDR(*(RT_IPV6_ADDR *)pIPv6Addr))\n\t{\n\t\tpGroupMacAddr = (PUCHAR)&pIPv6MacTable->curMcastAddr;\n\t\tConvertMulticastIP2MAC(pIPv6Addr, (UCHAR **)(&pGroupMacAddr), ETH_P_IPV6);\n\t\treturn pIPv6MacTable->curMcastAddr;\n\t}\n    \n\t/* Use hash to find out the location of that entry and get the Mac address. */\n\thashIdx = MAT_IPV6_ADDR_HASH_INDEX(pIPv6Addr);\n\n/*\tspin_lock_irqsave(&IPMacTabLock, irqFlag); */\n\tpEntry = pIPv6MacTable->hash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tif (NdisEqualMemory(pEntry->ipv6Addr, pIPv6Addr, IPV6_ADDR_LEN))\n        {\n\t\t\t\n\t\t\t/*Update the lastTime to prevent the aging before pDA processed! */\n\t\t\tNdisGetSystemUpTime(&pEntry->lastTime);\n\t\t\t\n\t\t\treturn pEntry->macAddr;\n        }\n        else\n\t\t{\n            pEntry = pEntry->pNext;\n\t\t}\n\t}\n\t\n\t/*\n\t\tWe didn't find any matched Mac address, our policy is treat it as\n\t\tbroadcast packet and send to all.\n\t*/\n\treturn pIPv6MacTable->hash[IPV6MAC_TB_HASH_INDEX_OF_BCAST]->macAddr;\n\t\n}\n\n\nstatic inline unsigned short int icmpv6_csum(\n\tRT_IPV6_ADDR *saddr,\n\tRT_IPV6_ADDR *daddr,\n\tUSHORT\t\t  len,\n\tUCHAR \t\t  proto,\n\tUCHAR \t\t *pICMPMsg)\n{\n\tint \tcarry;\n\tUINT32 \tulen;\n\tUINT32 \tuproto;\n\tint i;\n\tunsigned int csum = 0;\n\tunsigned short int chksum;\n\n\tif (len % 4)\n\t\treturn 0;\n\t\n\tfor( i = 0; i < 4; i++)\n\t{\n\t\tcsum += saddr->ipv6_addr32[i];\n\t\tcarry = (csum < saddr->ipv6_addr32[i]);\n\t\tcsum += carry;\n\t}\n\n\tfor( i = 0; i < 4; i++)\n\t{\n\t\tcsum += daddr->ipv6_addr32[i];\n\t\tcarry = (csum < daddr->ipv6_addr32[i]);\n\t\tcsum += carry;\n\t}\n\n\tulen = OS_HTONL((UINT32)len);\n\tcsum += ulen;\n\tcarry = (csum < ulen);\n\tcsum += carry;\n\n\tuproto = OS_HTONL((UINT32)proto);\n\tcsum += uproto;\n\tcarry = (csum < uproto);\n\tcsum += carry;\n\t\n\tfor (i = 0; i < len; i += 4)\n\t{\n\t\tcsum += get_unaligned32(((UINT32 *)&pICMPMsg[i]));\n\t\tcarry = (csum < get_unaligned32(((UINT32 *)&pICMPMsg[i])));\n\t\tcsum += carry;\n\t}\n\n\twhile (csum>>16)\n\t\tcsum = (csum & 0xffff) + (csum >> 16);\n\n\tchksum = ~csum;\n\t\n\treturn chksum;\n}\n\n\n\nstatic PUCHAR MATProto_IPv6_Rx(\n\tIN MAT_STRUCT \t\t*pMatCfg, \n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR\t\t\tpDevMacAdr)\n{\n\n\tPUCHAR pMacAddr;\n\tPUCHAR pDstIPv6Addr;\n\t\n\t/* Fetch the IPv6 addres from the packet header. */\n\tpDstIPv6Addr = (UCHAR *)(&((RT_IPV6_HDR *)pLayerHdr)->dstAddr);\n\t\n\tpMacAddr = IPv6MacTableLookUp(pMatCfg, pDstIPv6Addr);\n\t\n\treturn pMacAddr;\n\n}\n\nstatic PNDIS_PACKET ICMPv6_Handle_Tx(\n\tIN MAT_STRUCT \t\t*pMatSrtuct,\n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR\t\t\tpLayerHdr,\n\tIN PUCHAR \t\t\tpDevMacAdr,\n\tIN UINT32\t\t\toffset)\n{\n\tRT_IPV6_HDR \t\t\t*pIPv6Hdr;\n\tRT_ICMPV6_HDR \t\t\t*pICMPv6Hdr;\n\tRT_ICMPV6_OPTION_HDR \t*pOptHdr;\n\n\tUSHORT payloadLen;\n\tUINT32 ICMPOffset = 0, ICMPMsgLen = 0, leftLen;\n\t\n\tPNDIS_PACKET newSkb = NULL;\n\tBOOLEAN needModify = FALSE;\n\tPUCHAR pSrcMac;\n\n\tpIPv6Hdr = (RT_IPV6_HDR *)pLayerHdr;\n\tpayloadLen = OS_NTOHS(pIPv6Hdr->payload_len);\n\t\n\tpICMPv6Hdr = (RT_ICMPV6_HDR *)(pLayerHdr + offset);\n\tICMPOffset = offset;\n\tICMPMsgLen = payloadLen + IPV6_HDR_LEN - ICMPOffset;\n\t\n\t\n\n\tleftLen = ICMPMsgLen;\n\tswitch (pICMPv6Hdr->type)\n\t{\n\t\tcase ICMPV6_MSG_TYPE_ROUTER_SOLICITATION:\n\t\t\toffset += ROUTER_SOLICITATION_FIXED_LEN;\n\t\t\t/* for unspecified source address, it should not include the option about link-layer address. */\n\t\t\tif (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))\n\t\t\t{\n\t\t\t\twhile(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))\n\t\t\t\t{\n\t\t\t\t\tpOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);\t\t\t\t\t\n\t\t\t\t\tif (pOptHdr->len == 0)\n\t\t\t\t\t\tbreak;  /* discard it, because it's invalid. */\n\t\t\t\t\t\n\t\t\t\t\tif (pOptHdr->type == TYPE_SRC_LL_ADDR)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*replace the src link-layer address as ours. */\n\t\t\t\t\t\tneedModify = TRUE;\n\t\t\t\t\t\toffset += 2;\t/* 2 = \"type, len\" fields. Here indicate to the place of src mac. */\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toffset += (pOptHdr->len * 8);  /* in unit of 8 octets. */\n\t\t\t\t\t\tleftLen -= (pOptHdr->len * 8);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT:\n\t\t\toffset += ROUTER_ADVERTISEMENT_FIXED_LEN;\n\t\t\t/* for unspecified source address, it should not include the option about link-layer address. */\n\t\t\tif (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))\n\t\t\t{\n\t\t\t\twhile(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))\n\t\t\t\t{\n\t\t\t\t\tpOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);\n\t\t\t\t\tif (pOptHdr->len == 0)\n\t\t\t\t\t\tbreak;  /* discard it, because it's invalid. */\n\t\t\t\t\t\t\n\t\t\t\t\tif (pOptHdr->type == TYPE_SRC_LL_ADDR)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*replace the src link-layer address as ours. */\n\t\t\t\t\t\tneedModify = TRUE;\n\t\t\t\t\t\toffset += 2;\t/* 2 = \"type, len\" fields. Here indicate to the place of src mac. */\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toffset += (pOptHdr->len * 8);  /* in unit of 8 octets. */\n\t\t\t\t\t\tleftLen -= (pOptHdr->len * 8);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION:\n\t\t\toffset += NEIGHBOR_SOLICITATION_FIXED_LEN;\n\t\t\t/* for unspecified source address, it should not include the option about link-layer address. */\n\t\t\tif (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))\n\t\t\t{\n\t\t\t\twhile(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))\n\t\t\t\t{\n\t\t\t\t\tpOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);\n\t\t\t\t\tif (pOptHdr->len == 0)\n\t\t\t\t\t\tbreak;  /* discard it, because it's invalid. */\n\t\t\t\t\t\t\n\t\t\t\t\tif (pOptHdr->type == TYPE_SRC_LL_ADDR)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*replace the src link-layer address as ours. */\n\t\t\t\t\t\tneedModify = TRUE;\n\t\t\t\t\t\toffset += 2;\t/* 2 = \"type, len\" fields. Here indicate to the place of src mac. */\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toffset += (pOptHdr->len * 8);  /* in unit of 8 octets. */\n\t\t\t\t\t\tleftLen -= (pOptHdr->len * 8);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT:\n\t\t\toffset += NEIGHBOR_ADVERTISEMENT_FIXED_LEN;\n\t\t\t/* for unspecified source address, it should not include the option about link-layer address. */\n\t\t\tif (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))\n\t\t\t{\n\t\t\t\twhile(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))\n\t\t\t\t{\n\t\t\t\t\tpOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);\n\t\t\t\t\tif (pOptHdr->len == 0)\n\t\t\t\t\t\tbreak;  /* discard it, because it's invalid. */\n\t\t\t\t\t\t\n\t\t\t\t\tif (pOptHdr->type == TYPE_TGT_LL_ADDR)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*replace the src link-layer address as ours. */\n\t\t\t\t\t\tneedModify = TRUE;\n\t\t\t\t\t\toffset += 2;\t/* 2 = \"type, len\" fields. */\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}else {\n\t\t\t\t\t\toffset += (pOptHdr->len * 8);  /* in unit of 8 octets. */\n\t\t\t\t\t\tleftLen -= (pOptHdr->len * 8);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ICMPV6_MSG_TYPE_REDIRECT:\n\t\t\toffset += REDIRECT_FIXED_LEN;\n\t\t\t/* for unspecified source address, it should not include the options about link-layer address. */\n\t\t\tif (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))\n\t\t\t{\n\t\t\t\twhile(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))\n\t\t\t\t{\n\t\t\t\t\tpOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);\n\t\t\t\t\tif (pOptHdr->len == 0)\n\t\t\t\t\t\tbreak;  /* discard it, because it's invalid. */\n\n\t\t\t\t\tif (pOptHdr->type == TYPE_TGT_LL_ADDR)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* TODO: Need to check if the TGT_LL_ADDR is the inner MAC. */\n\t\t\t\t\t\t/*replace the src link-layer address as ours. */\n\t\t\t\t\t\tneedModify = TRUE;\n\t\t\t\t\t\toffset += 2;\t/* 2 = \"type, len\" fields. */\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}else {\n\t\t\t\t\t\toffset += (pOptHdr->len * 8);  /* in unit of 8 octets. */\n\t\t\t\t\t\tleftLen -= (pOptHdr->len * 8);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Un-supported ICMPv6 msg type(0x%x)! Ignore it\\n\", pICMPv6Hdr->type));\n\t\t\tbreak;\n\t}\n\t\n\t/* We need to handle about the solicitation/Advertisement packets. */\n\tif (needModify)\n\t{\t\n\t\tif(OS_PKT_CLONED(pSkb)) \n\t\t{\n\t\t\tnewSkb = (PNDIS_PACKET)OS_PKT_COPY(RTPKT_TO_OSPKT(pSkb));\n\t\t\tif(newSkb) {\n\t\t\t\tif (IS_VLAN_PACKET(GET_OS_PKT_DATAPTR(newSkb)))\n\t\t\t\t\tpIPv6Hdr = (RT_IPV6_HDR *)(GET_OS_PKT_DATAPTR(newSkb) + MAT_VLAN_ETH_HDR_LEN); \n\t\t\t\telse\n\t\t\t\t\tpIPv6Hdr = (RT_IPV6_HDR *)(GET_OS_PKT_DATAPTR(newSkb) + MAT_ETHER_HDR_LEN);\n\t\t\t}\n\t\t}\n\n\t\tpICMPv6Hdr = (RT_ICMPV6_HDR *)((PUCHAR)pIPv6Hdr + ICMPOffset);\n\t\tpSrcMac = (PUCHAR)((PUCHAR)pIPv6Hdr + offset);\n\t\tNdisMoveMemory(pSrcMac, pDevMacAdr, MAC_ADDR_LEN);\n\t\t\n\t\t/* Now re-calculate the Checksum. */\n\t\tpICMPv6Hdr->chksum = 0;\n\t\tpICMPv6Hdr->chksum = icmpv6_csum(&pIPv6Hdr->srcAddr, &pIPv6Hdr->dstAddr, ICMPMsgLen , \n\t\t\t\t\t\t\t\t\t\t\tIPV6_NEXT_HEADER_ICMPV6, (PUCHAR)pICMPv6Hdr);\n\t}\n\n\treturn newSkb;\n\t\n}\n\n\nstatic PUCHAR MATProto_IPv6_Tx(\n\tIN MAT_STRUCT \t\t*pMatCfg,\n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR\t\t\tpDevMacAdr)\n{\n\tPUCHAR pSrcMac, pSrcIP;\n\tBOOLEAN needUpdate;\n\tUCHAR nextProtocol;\n\tUINT32 offset;\t\n\tHEADER_802_3 *pEthHdr;\n\tRT_IPV6_HDR *pIPv6Hdr;\n\tPNDIS_PACKET newSkb = NULL;\n\t\n\tpIPv6Hdr = (RT_IPV6_HDR *)pLayerHdr;\n\tpEthHdr = (HEADER_802_3 *)(GET_OS_PKT_DATAPTR(pSkb));\n\t\n\tpSrcMac = (UCHAR *)&pEthHdr->SAAddr2;\n\tpSrcIP = (UCHAR *)&pIPv6Hdr->srcAddr;\n\n\t\n\t\n\tneedUpdate = needUpdateIPv6MacTB(pSrcMac, (RT_IPV6_ADDR *)(&pIPv6Hdr->srcAddr));\n\tif (needUpdate)\n\t\tIPv6MacTableUpdate(pMatCfg, pSrcMac, (CHAR *)(&pIPv6Hdr->srcAddr));\n\n\n\t/* We need to traverse the whole IPv6 Header and extend headers to check about the ICMPv6 pacekt. */\n\t\n\tnextProtocol = pIPv6Hdr->nextHdr;\n\toffset = IPV6_HDR_LEN;\n\t/*DBGPRINT(RT_DEBUG_INFO, (\"NextProtocol=0x%x! payloadLen=%d! offset=%d!\\n\", nextProtocol, payloadLen, offset)); */\n\twhile(nextProtocol != IPV6_NEXT_HEADER_ICMPV6 && \n\t\t  nextProtocol != IPV6_NEXT_HEADER_UDP && \n\t\t  nextProtocol != IPV6_NEXT_HEADER_TCP && \n\t\t  nextProtocol != IPV6_NEXT_HEADER_NONE)\n\t{\n\t\tif(IPv6ExtHdrHandle((RT_IPV6_EXT_HDR *)(pLayerHdr + offset), &nextProtocol, &offset) == FALSE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IPv6ExtHdrHandle failed!\\n\"));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tswitch (nextProtocol)\n\t{\n\t\tcase IPV6_NEXT_HEADER_ICMPV6:\n\t\t\tnewSkb = ICMPv6_Handle_Tx(pMatCfg, pSkb, pLayerHdr, pDevMacAdr, offset);\n\t\t\tbreak;\n\t\t\t\n\t\tcase IPV6_NEXT_HEADER_UDP:\n\t\t\t/*newSkb = DHCPv6_Handle_Tx(pMatStrcut, pSkb, pLayerHdr, pMacAddr, offset); */\n\t\t\tbreak;\n\t\t\t\n\t\tcase IPV6_NEXT_HEADER_TCP:\n\t\tcase IPV6_NEXT_HEADER_NONE:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn (PUCHAR)newSkb;\n\n}\n\n\n\nstatic NDIS_STATUS IPv6MacTable_RemoveAll(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tIPv6MacMappingTable\t*pIPv6MacTable;\n\tIPv6MacMappingEntry\t*pEntry;\n\tUINT32\t\t\t\ti;\n\n\n\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\tif (!pIPv6MacTable)\n\t\treturn TRUE;\n\t\n\tif (pIPv6MacTable->valid)\n\t{\t\n\t\tpIPv6MacTable->valid = FALSE;\n\tfor (i=0; i<IPV6MAC_TB_HASH_ENTRY_NUM; i++)\n\t{\n\t\t\twhile((pEntry = pIPv6MacTable->hash[i]) != NULL)\n\t\t{\n\t\t\t\tpIPv6MacTable->hash[i] = pEntry->pNext;\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t}\n\t\t}\n\t}\n\n/*\tkfree(pIPv6MacTable); */\n\tos_free_mem(NULL, pIPv6MacTable);\n\tpMatCfg->MatTableSet.IPv6MacTable = NULL;\n\n\treturn TRUE;\n\t\n}\n\n\nstatic NDIS_STATUS IPv6MacTable_init(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tIPv6MacMappingEntry *pEntry = NULL;\n\tIPv6MacMappingTable\t*pIPv6MacTable;\n\t\n\t\n\tif (pMatCfg->MatTableSet.IPv6MacTable != NULL)\n\t{\n\t\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\t}\n\telse\n\t{\n/*\t\tpMatCfg->MatTableSet.IPv6MacTable = kmalloc(sizeof(IPv6MacMappingTable), GFP_KERNEL); */\n\t\tos_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.IPv6MacTable), sizeof(IPv6MacMappingTable));\n\t\tif (pMatCfg->MatTableSet.IPv6MacTable)\n\t\t{\n\t\t\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\t\t\tNdisZeroMemory(pIPv6MacTable, sizeof(IPv6MacMappingTable));\n\t\t} \n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IPMacTable_init(): Allocate memory for IPv6MacTable failed!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tif (pIPv6MacTable->valid == FALSE)\n\t{\n\t/*Set the last hash entry (hash[64]) as our default broadcast Mac address */\n\t\tpEntry = (IPv6MacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPv6MacMappingEntry));\n\tif (!pEntry)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IPMacTable_init(): Allocate memory for IPMacTable broadcast entry failed!\\n\"));\n\t\treturn FALSE;\n\t\t}\n\t\tNdisZeroMemory(pEntry, sizeof(IPv6MacMappingEntry));\n\tNdisMoveMemory(pEntry->macAddr, BROADCAST_ADDR, MAC_ADDR_LEN);\n\tpEntry->pNext = NULL;\n\t\tpIPv6MacTable->hash[IPV6MAC_TB_HASH_INDEX_OF_BCAST] = pEntry;\n\t\n\t\tpIPv6MacTable->valid = TRUE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): IPv6MacTable already inited!\\n\", __FUNCTION__));\n\t}\n\t\n\treturn TRUE;\n\t\n}\n\n\nstatic NDIS_STATUS MATProto_IPv6_Exit(\n\tIN MAT_STRUCT \t*pMatCfg)\n{\n\tINT status;\n\t\t\n\tstatus = IPv6MacTable_RemoveAll(pMatCfg);\n\n\treturn status;\n}\n\n\nstatic NDIS_STATUS MATProto_IPv6_Init(\n\tIN MAT_STRUCT \t*pMatCfg)\n{\n\n\tBOOLEAN status = FALSE;\n\n\tstatus = IPv6MacTable_init(pMatCfg);\n\t\n\treturn status;\n}\n\n\n\nVOID getIPv6MacTbInfo(\n\tIN MAT_STRUCT *pMatCfg, \n\tIN char *pOutBuf,\n\tIN ULONG BufLen)\n{\n\tIPv6MacMappingTable *pIPv6MacTable;\n\tIPv6MacMappingEntry *pHead;\n\tint startIdx, endIdx;\n\tchar Ipv6str[40] = {0};\n\n\n\tpIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;\n\tif ((!pIPv6MacTable) || (!pIPv6MacTable->valid))\n\t{\n        DBGPRINT(RT_DEBUG_TRACE, (\"%s():IPv6MacTable not init yet!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\t\n\t/* dump all. */\n\tstartIdx = 0;\n\tendIdx = MAT_MAX_HASH_ENTRY_SUPPORT;\n\n\tsprintf(pOutBuf, \"\\n\");\n    sprintf(pOutBuf+strlen(pOutBuf), \"%-40s%-20s\\n\", \"IP\", \"MAC\");\n\tfor(; startIdx< endIdx; startIdx++)\n\t{\n\t\tpHead = pIPv6MacTable->hash[startIdx];\n\n        while(pHead)\n    \t{\n/*    \t    if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) */\n\t\t\tif (RtmpOsCmdDisplayLenCheck(strlen(pOutBuf), 30) == FALSE)\n                break;\n\t\t\tNdisZeroMemory(Ipv6str, 40);\n\t\t\tsprintf(Ipv6str, \"%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\", PRINT_IPV6_ADDR(*((RT_IPV6_ADDR *)(&pHead->ipv6Addr[0]))));\n\t\t\tsprintf(pOutBuf+strlen(pOutBuf), \"%-40s%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\tIpv6str, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],\n\t\t\t\tpHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5]);\n    \t\tpHead = pHead->pNext;\n    \t}\n\t}\n}\n\n#endif /* MAT_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_mat_pppoe.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2007, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_mat_pppoe.c\n\n\tAbstract:\n\t    MAT convert engine subroutine for PPPoE protocol.Due to the difference \n\tof characteristic of PPPoE discovery stage and session stage, we seperate \n\tthat as two parts and used different stretegy to handle it.\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tShiang      02/26/07      Init version\n*/\n\n#ifdef MAT_SUPPORT\n\n#include \"rt_config.h\"\n\nstatic NDIS_STATUS MATProto_PPPoEDis_Init(MAT_STRUCT *pMatStruct);\nstatic NDIS_STATUS MATProto_PPPoEDis_Exit(MAT_STRUCT *pMatStruct);\nstatic PUCHAR MATProto_PPPoEDis_Rx(MAT_STRUCT *pMatStruct, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);\nstatic PUCHAR MATProto_PPPoEDis_Tx(MAT_STRUCT *pMatStruct, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);\n\nstatic NDIS_STATUS MATProto_PPPoESes_Init(MAT_STRUCT *pMatStruct);\nstatic NDIS_STATUS MATProto_PPPoESes_Exit(MAT_STRUCT *pMatStruct);\nstatic PUCHAR MATProto_PPPoESes_Rx(MAT_STRUCT *pMatStruct, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);\nstatic PUCHAR MATProto_PPPoESes_Tx(MAT_STRUCT *pMatStruct, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);\n\n\n/*\n                  1                 2               3             4\n    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n   |  VER  | TYPE  |      CODE     |          SESSION_ID           |\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n   |            LENGTH             |           payload             ~\n   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n\tVER = 0x1, TYPE =0x1\n\t\nPPPoE Discovery Stage(Ethernet protocol type = 0x8863):\n\tPADI:\n\t\tDESTINATION_ADDR = 0xffffffff\n\t\tCODE = 0x09, SESSION_ID = 0x0000\n\t\tLENGTH = payload length\n\n\tPADO:\n\t\tDESTINATION_ADDR = Unicast Ethernet address of sender\n\t\tCODE = 0x07, SESSION_ID = 0x0000\n\t\tLENGTH = payload length\n\t\tNEcessary TAGS: AC-NAME(0x0102), Sevice-Name(0x0101), and other service names.\n\n\t\tNote: if the PPPoE server cannot serve the PADI it MUST NOT respond with a PADO\n\n\t\n\tPADR:\n\t\tDESTINATION_ADDR = unicast Ethernet address \n\t\tCODE = 0x19, SESSION_ID = 0x0000\n\t\tLENGTH = payload length\n\t\tNecessary TAGS: Service-Name(0x0101)\n\t\tOptional TAGS: ....\n\n\tPADS:\n\t\tIf success:\n\t\t\tDESTINATION_ADDR = unicast Ethernet address \n\t\t\tCODE = 0x65, SESSION_ID = unique value for this pppoe session.(16 bits)\n\t\t\tLENGHT - payload length\n\t\t\tNecessary TAGS: Service-Name(0x0101)\n\n\t\tif failed:\n\t\t\tSESSION_ID = 0x0000\n\t\t\tNecessary TAGS: Service-Name-Error(0x0201).\n\n\tPADT:\n\t\tDESTINATION_ADDR = unicast Ethernet address\n\t\tCODE = 0xa7, SESSION_ID = previous assigned 16 bits session ID.\n\t\tNecessary TAGS: NO.\n\nPPPoE Session Stage(Ethernet protocol type = 0x8864):\n\tPPP data:\n\t\tDESTINATION_ADDR = unicast Ethernet address\n\t\tCODE = 0x00, \n\tLCP:\n\t\tDESTINATION_ADDR = unicast Ethernet address\n\t\tCODE = 0x00, \n\n*/\n\n#define PPPOE_CODE_PADI\t\t\t0x09\n#define PPPOE_CODE_PADO\t\t\t0x07\n#define PPPOE_CODE_PADR\t\t\t0x19\n#define PPPOE_CODE_PADS\t\t\t0x65\n#define PPPOE_CODE_PADT\t\t\t0xa7\n#define PPPOE_TAG_ID_HOST_UNIQ\t0x0103\n#define PPPOE_TAG_ID_AC_COOKIE\t0x0104\n\n#define PPPoE_SES_ENTRY_AGEOUT_TIME 3000\n\n/* Data structure used for PPPoE discovery stage */\n#define PPPOE_DIS_UID_LEN\t\t6\ntypedef struct _UidMacMappingEntry\n{\n\tUCHAR isServer;\n\tUCHAR uIDAddByUs;\t\t\t\t /* If the host-uniq or AC-cookie is add by our driver, set it as 1, else set as 0. */\n\tUCHAR uIDStr[PPPOE_DIS_UID_LEN]; /* String used for identify who sent this pppoe packet in discovery stage. */\n\tUCHAR macAddr[MAC_ADDR_LEN];\t /* Mac address associated to this uid string. */\n\tULONG lastTime;\n\tstruct _UidMacMappingEntry *pNext;\t/*Pointer to next entry in link-list of Uid hash table. */\n}UidMacMappingEntry, *PUidMacMappingEntry;\n\ntypedef struct _UidMacMappingTable\n{\n\tBOOLEAN valid;\n\tUidMacMappingEntry *uidHash[MAT_MAX_HASH_ENTRY_SUPPORT];\n}UidMacMappingTable;\n\n/* \"Host-Uniq <-> Mac Address\" Mapping table used for PPPoE Discovery stage */\n\n/* Data struct used for PPPoE session stage */\ntypedef struct _SesMacMappingEntry\n{\n\tUINT16\tsessionID;\t/* In network order */\n\tUCHAR\toutMacAddr[MAC_ADDR_LEN];\n\tUCHAR\tinMacAddr[MAC_ADDR_LEN];\n\tULONG \tlastTime;\n\tstruct\t_SesMacMappingEntry *pNext;\t\n}SesMacMappingEntry, *PSesMacMappingEntry;\n\ntypedef struct _SesMacMappingTable\n{\n\tBOOLEAN valid;\n\tSesMacMappingEntry *sesHash[MAT_MAX_HASH_ENTRY_SUPPORT];\n}SesMacMappingTable;\n\n/* Declaration of protocol handler for PPPoE Discovery stage */\nstruct _MATProtoOps MATProtoPPPoEDisHandle =\n{\n\t.init = MATProto_PPPoEDis_Init,\n\t.tx = MATProto_PPPoEDis_Tx,\n\t.rx = MATProto_PPPoEDis_Rx,\n\t.exit = MATProto_PPPoEDis_Exit,\n};\n\n/* Declaration of protocol handler for PPPoE Session stage */\nstruct _MATProtoOps MATProtoPPPoESesHandle =\n{\n\t.init = MATProto_PPPoESes_Init,\n\t.tx = MATProto_PPPoESes_Tx,\n\t.rx = MATProto_PPPoESes_Rx,\n\t.exit =MATProto_PPPoESes_Exit,\n};\n\n\nNDIS_STATUS dumpSesMacTb(\n\tIN MAT_STRUCT *pMatCfg, \n\tIN int hashIdx)\n{\n\tSesMacMappingTable *pSesMacTable;\n\tSesMacMappingEntry *pHead;\n\tint startIdx, endIdx;\n\n\n\tpSesMacTable = (SesMacMappingTable *)pMatCfg->MatTableSet.SesMacTable;\n\tif ((!pSesMacTable) || (!pSesMacTable->valid))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"SesMacTable not init yet, so cannot do dump!\\n\"));\n\t\treturn FALSE;\n\t}\n\t\n\tif(hashIdx < 0)\n\t{\t/* dump all. */\n\t\tstartIdx = 0;\n\t\tendIdx = MAT_MAX_HASH_ENTRY_SUPPORT - 1;\n\t}\n\telse\n\t{\t/* dump specific hash index. */\n\t\tstartIdx = endIdx = hashIdx;\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s():\\n\", __FUNCTION__));\n\tfor (; startIdx<= endIdx; startIdx++)\n\t{\n\t\tpHead = pSesMacTable->sesHash[startIdx];\n\t\twhile(pHead)\n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"SesMac[%d]:\\n\", startIdx));\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tsesID=%d,inMac=%02x:%02x:%02x:%02x:%02x:%02x,outMac=%02x:%02x:%02x:%02x:%02x:%02x,lastTime=0x%lx, pNext=%p\\n\",\n\t\t\t\t\t\t\t\tpHead->sessionID, PRINT_MAC(pHead->inMacAddr), PRINT_MAC(pHead->outMacAddr), pHead->lastTime, pHead->pNext));\n\t\t\tpHead = pHead->pNext;\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t----EndOfDump!\\n\"));\n\n\treturn TRUE;\n\n}\n\n\nNDIS_STATUS dumpUidMacTb(MAT_STRUCT *pMatCfg, int hashIdx)\n{\n\tUidMacMappingTable *pUidMacTable;\n\tUidMacMappingEntry *pHead;\n\tint i;\n\tint startIdx, endIdx;\n\t\n\n\tpUidMacTable = (UidMacMappingTable *)pMatCfg->MatTableSet.UidMacTable;\n\tif ((!pUidMacTable) || (!pUidMacTable->valid))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"UidMacTable not init yet, so cannot do dump!\\n\"));\n\t\treturn FALSE;\n\t}\n\t\n\tif(hashIdx < 0)\n\t{\t/* dump all. */\n\t\tstartIdx = 0;\n\t\tendIdx = MAT_MAX_HASH_ENTRY_SUPPORT-1;\n\t}\n\telse\n\t{\t/* dump specific hash index. */\n\t\tstartIdx = endIdx = hashIdx;\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s():\\n\", __FUNCTION__));\n\tfor (; startIdx<= endIdx; startIdx++)\n\t{\n\t\tpHead = pUidMacTable->uidHash[startIdx];\n\t\twhile(pHead)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"UidMac[%d]:\\n\", startIdx));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tisSrv=%d, uIDAddbyUs=%d, Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, pNext=%p\\n\", \n\t\t\t\t\t\t\t\t\tpHead->isServer, pHead->uIDAddByUs, PRINT_MAC(pHead->macAddr), pHead->lastTime, pHead->pNext));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\tuIDStr=\"));\n\t\t\tfor(i=0; i< PPPOE_DIS_UID_LEN; i++)\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%02x\", pHead->uIDStr[i]));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t\tpHead = pHead->pNext;\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t----EndOfDump!\\n\"));\n\t\n\treturn TRUE;\n}\n\n\nstatic NDIS_STATUS UidMacTable_RemoveAll(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tUidMacMappingTable *pUidMacTable;\n\tUidMacMappingEntry *pEntry;\n\tINT             i;\n\n\tpUidMacTable = (UidMacMappingTable *)pMatCfg->MatTableSet.UidMacTable;\n\n\tif(!pUidMacTable)\n\t\treturn TRUE;\n\n\tif (pUidMacTable->valid)\n\t{\n\t\tpUidMacTable->valid = FALSE;\n\t\tfor (i=0; i<MAT_MAX_HASH_ENTRY_SUPPORT; i++)\n\t\t{\n\t\t\twhile((pEntry = pUidMacTable->uidHash[i]) != NULL)\n\t\t\t{\n\t\t\t\tpUidMacTable->uidHash[i] = pEntry->pNext;\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t}\n\t\t}\n\t}\n\n/*\tkfree(pMatCfg->MatTableSet.UidMacTable); */\n\tos_free_mem(NULL, pMatCfg->MatTableSet.UidMacTable);\n\tpMatCfg->MatTableSet.UidMacTable = NULL;\n\n\treturn TRUE;\n}\n\n\nstatic NDIS_STATUS SesMacTable_RemoveAll(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tSesMacMappingTable *pSesMacTable;\n\tSesMacMappingEntry *pEntry;\n\tINT             i;\n\n\tpSesMacTable = (SesMacMappingTable *)pMatCfg->MatTableSet.SesMacTable;\n\tif (!pSesMacTable)\n\t\treturn TRUE;\n\n\tif (pSesMacTable->valid)\n\t{\n\t\tpSesMacTable->valid = FALSE;\n\t\tfor (i=0; i<MAT_MAX_HASH_ENTRY_SUPPORT; i++)\n\t\t{\n\t\t\twhile((pEntry = pSesMacTable->sesHash[i]) != NULL)\n\t\t{\n\t\t\t\tpSesMacTable->sesHash[i] = pEntry->pNext;\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t}\n\t\t}\n\t}\n\n/*\tkfree(pMatCfg->MatTableSet.SesMacTable); */\n\tos_free_mem(NULL, pMatCfg->MatTableSet.SesMacTable);\n\tpMatCfg->MatTableSet.SesMacTable = NULL;\n\t\n\treturn TRUE;\n\n}\n\n\nstatic PUidMacMappingEntry UidMacTableUpdate(\n\tIN MAT_STRUCT\t\t*pMatCfg,\n\tIN PUCHAR\t\t\tpInMac,\n\tIN PUCHAR\t\t\tpOutMac,\n\tIN PUCHAR\t\t\tpTagInfo,\n\tIN UINT16\t\t\ttagLen,\n\tIN UINT16\t\t\tisServer)\n{\n\tUINT \t\t\t\thashIdx, i=0, uIDAddByUs = 0;\n\tUidMacMappingTable \t*pUidMacTable;\n\tUidMacMappingEntry\t*pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;\n\tUCHAR \t\t\t\thashVal = 0;\n\tPUCHAR\t\t\t\tpUIDStr= NULL;\n\tULONG\t\t\t\tnow;\n\n\n\tpUidMacTable = (UidMacMappingTable *)pMatCfg->MatTableSet.UidMacTable;\n\tif ((!pUidMacTable) || (!pUidMacTable->valid))\n\t\treturn NULL;\n\n\tif (pTagInfo && tagLen >0)\n\t{\n\t\tpUIDStr = pTagInfo;\n\t\tuIDAddByUs = 0;\n\t\ttagLen = (tagLen > PPPOE_DIS_UID_LEN ? PPPOE_DIS_UID_LEN : tagLen);\n\t}\n\telse\n\t{\n\t\t/*\n\t\t\tWe assume the station just have one role,i.e., just a PPPoE server or just a PPPoE client.\n\t\t\tFor a packet send by server, we use the destination MAC as our uIDStr\n\t\t\tFor a packet send by client, we use the source MAC as our uIDStr.\n\t\t*/\n\t\tpUIDStr = isServer ? pOutMac: pInMac;\n\t\ttagLen = MAC_ADDR_LEN;\n\t\tuIDAddByUs = 1;\n\t}\n\n\tfor (i=0; i<tagLen; i++)\n\t\thashVal ^= (pUIDStr[i] & 0xff);\n\thashIdx = hashVal % MAT_MAX_HASH_ENTRY_SUPPORT;\n\t\n\t/*First, check if the hashIdx exists */\n\tif (hashIdx < MAT_MAX_HASH_ENTRY_SUPPORT)\n\t{\n\t\tpEntry = pPrev = pUidMacTable->uidHash[hashIdx];\n\t\twhile(pEntry)\n\t\t{\n\t\t\tNdisGetSystemUpTime(&now);\n\t\t\t\n\t\t\t/* Find the existed UidMac Mapping entry */\n\t\t\tif (NdisEqualMemory(pUIDStr, pEntry->uIDStr, tagLen) && IS_EQUAL_MAC(pEntry->macAddr, pInMac))\n    \t\t{\n\t\t\t\t/* Update info of this entry */\n\t\t\t\tpEntry->isServer = isServer;\n\t\t\t\tpEntry->uIDAddByUs = uIDAddByUs;\n\t\t\t\tpEntry->lastTime = now;\n\t\t\t\t\n\t\t\t\treturn pEntry;\n\t\t\t}\n\t\t\telse\n        \t{\t/* handle the age-out situation */\n\t\t\t\tif (RTMP_TIME_AFTER(now, (pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME)))\n\t\t\t\t{\n\t\t\t\t\t/* Remove the aged entry from the uidHash */\n\t\t\t\t\tif (pEntry == pUidMacTable->uidHash[hashIdx])\n\t\t\t\t\t{\n\t\t\t\t\t\tpUidMacTable->uidHash[hashIdx]= pEntry->pNext;\n\t\t\t\t\t\tpPrev = pUidMacTable->uidHash[hashIdx];\n\t        \t\t}\n\t\t\t\t\telse \n\t\t\t\t\t{\t\n\t\t\t\t\t\tpPrev->pNext = pEntry->pNext;\n\t\t\t\t\t}\n\n\t\t\t\t\t/*After remove this entry from macHash list and uidHash list, now free it! */\n\t\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t\t\tpMatCfg->nodeCount--;\n\t\t\t\t\tpEntry = (pPrev == NULL ? NULL: pPrev->pNext);\n\t        \t\t} \n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpPrev = pEntry;\n\t\t\t\t\tpEntry = pEntry->pNext;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/* Allocate a new UidMacMapping entry and insert into the double-hash */\n\tpNewEntry = (UidMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(UidMacMappingEntry));\n\tif (pNewEntry)\n\t{\t\n\t\tNdisZeroMemory(pNewEntry, sizeof(UidMacMappingEntry));\n\t\t\n\t\tpNewEntry->isServer = isServer;\n\t\tpNewEntry->uIDAddByUs = uIDAddByUs;\n\t\tNdisMoveMemory(pNewEntry->macAddr, pInMac, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(pNewEntry->uIDStr, pUIDStr, tagLen);\n\t\tpNewEntry->pNext = NULL;\n\t\tNdisGetSystemUpTime(&pNewEntry->lastTime);\n\t\t\n\t\t/* Update mac-side hash link list */\n\t\tif (pUidMacTable->uidHash[hashIdx] == NULL)\n\t\t{\t/* Hash list is empty, directly assign it. */\n\t\t\tpUidMacTable->uidHash[hashIdx] = pNewEntry;\n\t\t}\n\t\telse \n\t\t{\n\t\t\t/* Ok, we insert the new entry into the root of uidHash[hashIdx] */\n\t\t\tpNewEntry->pNext = pUidMacTable->uidHash[hashIdx];\n\t\t\tpUidMacTable->uidHash[hashIdx] = pNewEntry;\n\t\t}\n\t\t/*dumpUidMacTb(pMatCfg, hashIdx); //for debug */\n\t\t\n\t\tpMatCfg->nodeCount++;\n\n\t\treturn pNewEntry;\n\t}\n\t\n\treturn NULL;\n}\n\n\nstatic PUidMacMappingEntry UidMacTableLookUp(\n\tIN MAT_STRUCT \t\t*pMatCfg,\n\tIN PUCHAR\t\t\tpTagInfo,\n\tIN UINT16\t\t\ttagLen)\n{\n    UINT \t\t\t\thashIdx;\n\tUINT16\t\t\t\tlen;\n\tUCHAR\t\t\t\thashValue = 0;\n    UidMacMappingEntry\t*pEntry = NULL;\n\tUidMacMappingTable *pUidMacTable;\n\n\tpUidMacTable = (UidMacMappingTable *)pMatCfg->MatTableSet.UidMacTable;\n\tif ((!pUidMacTable) || (!pUidMacTable->valid))\n\t\treturn NULL;\n\n\t/* Use hash to find out the location of that entry and get the Mac address. */\n\tlen = tagLen;\n\twhile(len)\n\t\thashValue ^= pTagInfo[--len];\n\thashIdx = hashValue % MAT_MAX_HASH_ENTRY_SUPPORT;\n\n\tpEntry = pUidMacTable->uidHash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tif (NdisEqualMemory(pEntry->uIDStr, pTagInfo, tagLen))\n\t\t{\n/*\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%s(): dstMac=%02x:%02x:%02x:%02x:%02x:%02x for mapped dstIP(%d.%d.%d.%d)\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2],\n\t\t\t\t\tpEntry->macAddr[3],pEntry->macAddr[4],pEntry->macAddr[5],\n\t\t\t\t\t(ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff)); \n*/\t\t\t\n\t\t\t/*Update the lastTime to prevent the aging before pDA processed! */\n\t\t\tNdisGetSystemUpTime(&pEntry->lastTime);\n\t\t\t\n\t\t\treturn pEntry;\n        }\n        else\n\t\t\tpEntry = pEntry->pNext;\n\t}\n\t\n\t/* We didn't find any matched Mac address. */\n\treturn NULL;\n\t\n}\n\n\nstatic PUCHAR getInMacByOutMacFromSesMacTb(\n\tIN MAT_STRUCT *pMatCfg,\n\tIN PUCHAR outMac,\n\tIN UINT16 sesID)\n{\n\tUINT16 \t\t\t\thashIdx;\n\tSesMacMappingEntry *pEntry = NULL;\n\tSesMacMappingTable *pSesMacTable;\n\t\n\tpSesMacTable = (SesMacMappingTable *)pMatCfg->MatTableSet.SesMacTable;\n\n\tif (!pSesMacTable->valid)\n\t\treturn NULL;\n\t\n\t/* Use hash to find out the location of that entry and get the Mac address. */\n\thashIdx = sesID % MAT_MAX_HASH_ENTRY_SUPPORT;\n\n\tpEntry = pSesMacTable->sesHash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tif ((pEntry->sessionID == sesID) &&  IS_EQUAL_MAC(pEntry->outMacAddr, outMac))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): find it! dstMac=%02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t__FUNCTION__, pEntry->inMacAddr[0],pEntry->inMacAddr[1],pEntry->inMacAddr[2],\n\t\t\t\tpEntry->inMacAddr[3],pEntry->inMacAddr[4],pEntry->inMacAddr[5]));\n\n\t\t\t/*Update the lastTime to prevent the aging before pDA processed! */\n\t\t\tNdisGetSystemUpTime(&pEntry->lastTime);\n\n\t\t\treturn pEntry->inMacAddr;\n\t\t} \n\t\telse\n\t\t{\n\t\t\tpEntry = pEntry->pNext;\n\t\t}\n\t}\n\n\t/* We didn't find any matched Mac address, just return and didn't do any modification */\n\treturn NULL;\n}\n\t\t\n\n/* This function used to maintain the pppoe convert table which incoming node \n\tis a pppoe client and want to connect to use inner pppoe server.\n*/\nstatic NDIS_STATUS SesMacTableUpdate(\n\tIN MAT_STRUCT \t*pMatCfg,\n\tIN PUCHAR \t\tinMacAddr,\n\tIN UINT16 \t\tsesID,\n\tIN PUCHAR \t\toutMacAddr)\n{\n\tUINT16 hashIdx;\n\tSesMacMappingEntry *pEntry, *pPrev, *pNewEntry;\n\tSesMacMappingTable *pSesMacTable;\n\tULONG\tnow;\n\n\tpSesMacTable = (SesMacMappingTable *)pMatCfg->MatTableSet.SesMacTable;\n\tif ((!pSesMacTable) || (!pSesMacTable->valid))\n\t\treturn FALSE;\n\t\n\thashIdx = sesID % MAT_MAX_HASH_ENTRY_SUPPORT;\n\n/*\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s():sesID=0x%04x,inMac=%02x%02x:%02x:%02x:%02x:%02x, \n\t\t\toutMac=%02x:%02x:%02x:%02x:%02x:%02x\\n\", __FUNCTION__, sesID,\n\t\t\tinMacAddr[0],inMacAddr[1],inMacAddr[2],inMacAddr[3],inMacAddr[4],inMacAddr[5],\n\t\t\toutMacAddr[0],outMacAddr[1],outMacAddr[2],outMacAddr[3],outMacAddr[4],outMacAddr[5]));\n*/\n\n\tpEntry = pPrev = pSesMacTable->sesHash[hashIdx];\n\twhile(pEntry)\n\t{\n\t\tNdisGetSystemUpTime(&now);\n\t\t\n\t\t/* Find a existed IP-MAC Mapping entry */\n\t\tif ((sesID == pEntry->sessionID) && \n\t\t\t IS_EQUAL_MAC(pEntry->inMacAddr, inMacAddr) && \n\t\t\t IS_EQUAL_MAC(pEntry->outMacAddr, outMacAddr))\n    \t{\n\t\t\t/* compare is useless. So we directly copy it into the entry. */\n\t\t\tpEntry->lastTime = now;\n\t\t\t\n\t        return TRUE;\n\t\t}\n        else\n        {\t/* handle the age-out situation */\n\t\t\tif (RTMP_TIME_AFTER(now, (pEntry->lastTime + PPPoE_SES_ENTRY_AGEOUT_TIME)))\n        \t{\n        \t\t/* Remove the aged entry */\n\t\t\t\tif (pEntry == pSesMacTable->sesHash[hashIdx])\n\t\t\t\t{\n\t\t\t\t\tpSesMacTable->sesHash[hashIdx]= pEntry->pNext;\n\t\t\t\t\tpPrev = pSesMacTable->sesHash[hashIdx];\n        \t\t}\n\t\t\t\telse \n\t\t\t\t{\t\n\t        \t\tpPrev->pNext = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\tMATDBEntryFree(pMatCfg, (PUCHAR)pEntry);\n\t\t\t\tpMatCfg->nodeCount--;\n\t\t\t\tpEntry = (pPrev == NULL ? NULL: pPrev->pNext);\n        \t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tpPrev = pEntry;\n\t            pEntry = pEntry->pNext;\n        \t}\n        }\n\t}\n\t\n\n\t/* Allocate a new IPMacMapping entry and insert into the hash */\n\tpNewEntry = (SesMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(SesMacMappingEntry));\n\tif (pNewEntry != NULL)\n\t{\t\n\t\tpNewEntry->sessionID= sesID;\n\t\tNdisMoveMemory(pNewEntry->inMacAddr, inMacAddr, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(pNewEntry->outMacAddr, outMacAddr, MAC_ADDR_LEN);\n\t\tpNewEntry->pNext = NULL;\n\t\tNdisGetSystemUpTime(&pNewEntry->lastTime);\n\n\t\tif (pSesMacTable->sesHash[hashIdx] == NULL)\n\t\t{\t/* Hash list is empty, directly assign it. */\n\t\t\tpSesMacTable->sesHash[hashIdx] = pNewEntry;\n\t\t} \n\t\telse \n\t\t{\n\t\t\t/* Ok, we insert the new entry into the root of hash[hashIdx] */\n\t\t\tpNewEntry->pNext = pSesMacTable->sesHash[hashIdx];\n\t\t\tpSesMacTable->sesHash[hashIdx] = pNewEntry;\n\t\t}\n\t\t\t\n\t\t/*dumpSesMacTb(pMatCfg, hashIdx); */\n\t\tpMatCfg->nodeCount++;\n\n\t\treturn TRUE;\n\t}\n\t\n\treturn FALSE;\n}\n\n\n/* PPPoE discovery stage Rx handler.\n\tWhen Rx, check if the PPPoE tag \"Host-uniq\" exists or not.\n\tIf exists, we check our database and convert the dstMac to correct one.\n */\nstatic PUCHAR MATProto_PPPoEDis_Rx(\n\tIN MAT_STRUCT \t\t*pMatCfg,\n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR\t\t\tpLayerHdr,\n\tIN PUCHAR\t\t\tpDevMacAdr)\n{\n\tPUCHAR pData, pSrvMac = NULL, pCliMac= NULL, pOutMac=NULL, pInMac = NULL, pTagContent = NULL, pPayloadLen;\n\tUINT16 payloadLen, leftLen;\n\tUINT16 tagID, tagLen =0;\n\tUINT16 needUpdateSesTb= 0, sesID=0, isPADT = 0;\n\tUINT16 findTag=0;\n\tPUidMacMappingEntry pEntry = NULL; \n\n\tpData = pLayerHdr;\n\tif (*(pData) != 0x11)\n\t\treturn NULL;\n\t\n\t/* Check the Code type. */\n\tpData++;\n\tswitch(*pData)\n\t{\n\t\tcase PPPOE_CODE_PADO:\n\t\t\t/*It's a packet send by a PPPoE server which behind of our device. */\n\t\t\tfindTag = PPPOE_TAG_ID_HOST_UNIQ;\n\t\t\tbreak;\n\t\tcase PPPOE_CODE_PADS:\n\t\t\tneedUpdateSesTb = 1;\n\t\t\tfindTag = PPPOE_TAG_ID_HOST_UNIQ;\n\t\t\tpCliMac = (PUCHAR)(GET_OS_PKT_DATAPTR(pSkb));\n\t\t\tpSrvMac = (PUCHAR)(GET_OS_PKT_DATAPTR(pSkb) + 6);\n\t\t\tbreak;\n\t\tcase PPPOE_CODE_PADR:\n\t\t\t/*It's a packet send by a PPPoE client which in front of our device. */\n\t\t\tfindTag = PPPOE_TAG_ID_AC_COOKIE;\n\t\t\tbreak;\n\t\tcase PPPOE_CODE_PADI:\n\t\t\t/*Do nothing! Just forward this packet to upper layer directly. */\n\t\t\treturn NULL;\n\t\tcase PPPOE_CODE_PADT:\n\t\t\tisPADT = 1;\n\t\t\tpOutMac= (PUCHAR)(GET_OS_PKT_DATAPTR(pSkb) + 6);\n\t\t\tbreak;\n\t\tdefault:\n\t\treturn NULL;\n\t}\n\n\t/* Ignore the Code field(length=1) */\n\tpData ++;\n\tif (needUpdateSesTb || isPADT)\n\t\tsesID = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\n\tif (isPADT)\n\t{\n\t\tpInMac = getInMacByOutMacFromSesMacTb(pMatCfg, pOutMac, sesID);\n\t\treturn pInMac;\n\t}\n\t/* Ignore the session ID field.(length = 2) */\n\tpData += 2;\n\n\t/* Get the payload length, ignore the payload length field.(length = 2) */\n\tpayloadLen = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\tpPayloadLen = pData;\n\tpData += 2; \n\n\n\t/* First parsing the PPPoE paylod to find out the required tag(e.g., x0103 or 0x0104) */\n\tleftLen = payloadLen;\n\twhile (leftLen)\n\t{\n\t\ttagID = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\t\ttagLen = OS_NTOHS(get_unaligned((PUINT16)(pData+2)));\n\t\t\n\t\tif (tagID== findTag && tagLen>0)\n\t\t{\n\t\t\t\n\t\t\t/*shift to the tag value field. */\n\t\t\tpTagContent = pData + 4; \n\t\t\ttagLen = tagLen > PPPOE_DIS_UID_LEN ? PPPOE_DIS_UID_LEN : tagLen;\n\t\t\tbreak;\n\t\t} \n\t\telse\n\t\t{\n\t\t\tpData += (tagLen + 4);\n\t\t\tleftLen -= (tagLen + 4);\t\t\n\t\t}\n\t}\n\t\n\n\t/* Now update our pppoe discovery table \"UidMacTable\" */\n\tif (pTagContent)\n\t{\n\t\tpEntry  = UidMacTableLookUp(pMatCfg, pTagContent, tagLen);\n\n\t\t/* Remove the AC-Cookie or host-uniq if we ever add the field for this session. */\n\t\tif (pEntry)\n\t\t{\n\t\t\tif (pEntry->uIDAddByUs)\n\t\t\t{\n\t\t\t\tPUCHAR tagHead, nextTagHead;\n\t\t\t\tUINT removedTagLen, tailLen;\n\n\t\t\t\tremovedTagLen = 4 + tagLen;  \t/*The total length tag ID/info we want to remove. */\n\t\t\t\ttagHead = pTagContent - 4;\t/*The start address of the tag we want to remove in sk bufffer */\n\t\t\t\ttailLen = GET_OS_PKT_LEN(pSkb) - (pTagContent - (PUCHAR)(GET_OS_PKT_DATAPTR(pSkb))) - removedTagLen; /*Total left bytes we want to move. */\n\t\t\t\tif (tailLen)\n\t\t\t\t{\n\t\t\t\t\tnextTagHead = pTagContent + tagLen;\t/*The start address of next tag ID/info in sk buffer. */\n\t\t\t\t\tmemmove(tagHead, nextTagHead, tailLen);\n\t\t\t\t}\n/*\t\t\t\tSET_OS_PKT_DATATAIL(pSkb, GET_OS_PKT_DATATAIL(pSkb), (-removedTagLen)); */\n/*\t\t\t\tGET_OS_PKT_LEN(pSkb) -= removedTagLen; */\n\t\t\t\tOS_PKT_TAIL_ADJUST(pSkb, removedTagLen);\n\n\t\t\t\t*((UINT16 *)pPayloadLen) = OS_HTONS(payloadLen - removedTagLen);\n\t\t\t}\n\n\t\t\tif (needUpdateSesTb) {\n\t\t\t\t\n\t\t\t\tSesMacTableUpdate(pMatCfg, pEntry->macAddr,sesID, pSrvMac);\n\t\t\t}\n\t\t\t\n\t\t\treturn pEntry->macAddr;\n\t\t}\t\n\t}\n\t\n\treturn NULL;\n}\n\n\n\n/* PPPoE discovery stage Tx handler.\n\tIf the pakcet is PADI/PADR, check if the PPPoE tag \"Host-uniq\" exists or not. \n\t\tIf exists, we just record it in our table, else we insert the Mac address \n\t\t of Sender as well as the host-uniq, then forward to the destination. It's\n\t\t a one(MAC)-to-one(Host-uniq) mapping in our table.\n\tIf the packet is PADO/PADS, check if the PPPoE tag \"AC-Cookie\" exists or not.\n\t\tIf exists, we just record it in our table, else we insert the Mac address\n\t\tof Sender as well as the AC-Cookie, then forward to the destination. It may\n\t\tone(MAC)-to-many(AC-Cookie) mapping in our table.\n\n    Host-uniq TAG ID= 0x0103\n    AC-Cookie TAG ID= 0x0104\n */\nstatic PUCHAR MATProto_PPPoEDis_Tx(\n\tIN MAT_STRUCT \t\t*pMatStruct,\n\tIN PNDIS_PACKET \t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR\t\t\tpDevMacAdr)\n{\n\tPUCHAR pData, pTagContent = NULL, pPayloadLen, pPPPPoETail;\n\tPUCHAR pSrcMac, pDstMac;\n\tUINT16 payloadLen, leftLen, offset;\n\tUINT16 tagID, tagLen =0;\n\tUINT16 isServer = 0, needUpdateSesTb= 0, sesID = 0;\n\tUINT16 findTag=0;\n\tPUidMacMappingEntry pEntry = NULL; \n\tPUCHAR pPktHdr;\n\tPNDIS_PACKET pModSkb = NULL;\n\n\tpPktHdr = GET_OS_PKT_DATAPTR(pSkb);\n\tpDstMac = pPktHdr;\n\tpSrcMac = (pPktHdr + 6);\n\tpData = pLayerHdr;\n\n\n\t/* Check the pppoe version and Type. It should be 0x11 */\n\tif (*(pData) != 0x11)\n\t\treturn NULL;\n\n\t/* Check the Code type. */\n\tpData++;\n\tswitch(*pData)\n\t{\n\t\t/* Send by pppoe client */\n\t\tcase PPPOE_CODE_PADI:\n\t\tcase PPPOE_CODE_PADR:\n\t\t\tfindTag = PPPOE_TAG_ID_HOST_UNIQ;\n\t\t\tbreak;\n\t\t/* Send by pppoe server */\n\t\tcase PPPOE_CODE_PADO:\n\t\tcase PPPOE_CODE_PADS:\n\t\t\tisServer = 1;\n\t\t\tfindTag = PPPOE_TAG_ID_AC_COOKIE;\n\t\t\tif (*pData == PPPOE_CODE_PADS)  /* For PADS, we need record the session ID. */\n\t\t\t\tneedUpdateSesTb = 1;\n\t\t\tbreak;\n\t\t/* Both server and client can send this packet */\n\t\tcase PPPOE_CODE_PADT:\n\t\t\t/* TODO:\n\t\t\t\tcurrently we didn't handle PADT packet. We just leave the \n\t\t\t\tsession entry and make it age-out automatically. Maybe we\n\t\t\t\tcan remove the entry when we receive this packet.\n\t\t\t */\n\t\t\treturn NULL;\n\t\tdefault:\n\t\t\treturn NULL;\n\t}\n\t\n\t/*\n\t\tIgnore the Code field(length=1) and if it's a PADS packet, we\n\t\tshould hold the session ID and for latter to update our table.\n\t*/\n\tpData ++;\n\tif (needUpdateSesTb)\n\t\tsesID = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\n\t/* Ignore the session ID field.(length = 2) */\n\tpData += 2;\n\n\t/* Get the payload length, and  shift the payload length field(length = 2) to next field. */\n\tpayloadLen = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\tpPayloadLen = pData;\n\toffset = pPayloadLen - (PUCHAR)(GET_OS_PKT_DATAPTR(pSkb));\n\tpData += 2; \n\n\n\t/* First parsing the PPPoE paylod to find out the required tag(e.g., x0103 or 0x0104) */\n\tleftLen = payloadLen;\n\twhile (leftLen)\n\t{\n\t\ttagID = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\t\ttagLen = OS_NTOHS(get_unaligned((PUINT16)(pData+2)));\n\t\t\n\t\tif (tagID== findTag && tagLen>0)\n\t\t{\n\t\t\t\n\t\t\t/* Move the pointer to the tag value field. 4 = 2(TAG ID) + 2(TAG_LEN) */\n\t\t\tpTagContent = pData + 4; \n/*\t\t\ttagLen = tagLen > PPPOE_DIS_UID_LEN ? PPPOE_DIS_UID_LEN : tagLen; */\n\t\t\tbreak;\n\t\t} \n\t\telse\n\t\t{\n\t\t\tpData += (tagLen + 4);\n\t\t\tleftLen -= (tagLen + 4);\t\t\n\t\t}\n\t}\n\t\n\n\t/* Now update our pppoe discovery table \"UidMacTable\" */\n\tpEntry  = UidMacTableUpdate(pMatStruct, pSrcMac, pDstMac, pTagContent, tagLen, isServer);\n\t\n\tif (pEntry && (pTagContent == NULL))\n\t{\n\t\tPUCHAR tailHead;\n\n\t\tif(OS_PKT_CLONED(pSkb))\n\t\t{\n/*\t\t\tpModSkb = (PNDIS_PACKET)skb_copy(RTPKT_TO_OSPKT(pSkb), MEM_ALLOC_FLAG); */\n\t\t\tpModSkb = (PNDIS_PACKET)OS_PKT_COPY(RTPKT_TO_OSPKT(pSkb));\n\t\t}\n\t\telse\n\t\t\tpModSkb = (PNDIS_PACKET)RTPKT_TO_OSPKT(pSkb);\n\n\t\tif(!pModSkb)\n\t\t\treturn NULL;\n\t\t\n/*\t\ttailHead = skb_put(RTPKT_TO_OSPKT(pModSkb), (PPPOE_DIS_UID_LEN + 4)); */\n\t\ttailHead = OS_PKT_TAIL_BUF_EXTEND(pModSkb, (PPPOE_DIS_UID_LEN + 4));\n\t\tif (tailHead)\n\t\t{\n\t\t\tpPayloadLen = GET_OS_PKT_DATAPTR(pModSkb) + offset;\n\t\t\tpPPPPoETail = pPayloadLen + payloadLen;\n\t\t\tif(tailHead > pPPPPoETail)\n\t\t\t\ttailHead = pPPPPoETail;\n\t\t\t\t\n\t\t\tif (pEntry->isServer)\n\t\t\t{\t/*Append the AC-Cookie tag info in the tail of the pppoe packet. */\n\t\t\t\ttailHead[0] = 0x01;\n\t\t\t\ttailHead[1] = 0x04;\n\t\t\t\ttailHead[2] = 0x00;\n\t\t\t\ttailHead[3] = PPPOE_DIS_UID_LEN;\n\t\t\t\ttailHead += 4;\n\t\t\t\tNdisMoveMemory(tailHead, pEntry->uIDStr, PPPOE_DIS_UID_LEN);\n\t\t\t} \n\t\t\telse \n\t\t\t{\t/*Append the host-uniq tag info in the tail of the pppoe packet. */\n\t\t\t\ttailHead[0] = 0x01;\n\t\t\t\ttailHead[1] = 0x03;\n\t\t\t\ttailHead[2] = 0x00;\n\t\t\t\ttailHead[3] = PPPOE_DIS_UID_LEN;\n\t\t\t\ttailHead += 4;\n\t\t\t\tNdisMoveMemory(tailHead, pEntry->uIDStr, PPPOE_DIS_UID_LEN);\n\t\t\t}\n\t\t\t*(UINT16 *)pPayloadLen = OS_HTONS(payloadLen + 4 + PPPOE_DIS_UID_LEN);\n\t\t}\n\t}\n\n\tif (needUpdateSesTb)\n\t\tSesMacTableUpdate(pMatStruct, pSrcMac, sesID, pDstMac);\n\t\n\treturn (PUCHAR)pModSkb;\n}\n\n\n/* PPPoE discovery stage init function */\nstatic NDIS_STATUS MATProto_PPPoEDis_Init(\n\tIN MAT_STRUCT\t*pMatCfg)\n{\n\tUidMacMappingTable *pUidMacTable;\n\tSesMacMappingTable *pSesMacTable;\n\n\tpUidMacTable = (UidMacMappingTable *)pMatCfg->MatTableSet.UidMacTable;\n\tif (!pUidMacTable)\n\t{\n/*\t\tpMatCfg->MatTableSet.UidMacTable = (VOID *)kmalloc(sizeof(UidMacMappingTable), GFP_KERNEL); */\n\t\tos_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.UidMacTable), sizeof(UidMacMappingTable));\n\t\tif (pMatCfg->MatTableSet.UidMacTable)\n\t\t{\n\t\t\tpUidMacTable = (UidMacMappingTable *)pMatCfg->MatTableSet.UidMacTable;\n\t\t\tNdisZeroMemory(pUidMacTable, sizeof(UidMacMappingTable));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MATProto_PPPoEDis_Init(): Allocate memory for UidMacTable failed!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\tpUidMacTable->valid = TRUE;\n\n\tpSesMacTable = (SesMacMappingTable *)pMatCfg->MatTableSet.SesMacTable;\n\tif (!pSesMacTable)\n\t{\n/*\t\tpMatCfg->MatTableSet.SesMacTable = (VOID *)kmalloc(sizeof(SesMacMappingTable), GFP_KERNEL); */\n\t\tos_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.SesMacTable), sizeof(SesMacMappingTable));\n\t\tif (pMatCfg->MatTableSet.SesMacTable)\n\t\t{\n\t\t\tpSesMacTable = (SesMacMappingTable *)pMatCfg->MatTableSet.SesMacTable;\n\t\t\tNdisZeroMemory(pSesMacTable, sizeof(SesMacMappingTable));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MATProto_PPPoEDis_Init(): Allocate memory for SesMacTable failed!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\tpSesMacTable->valid = TRUE;\n\t\n\treturn TRUE;\n}\n\n\n/* PPPoE discovery stage exit function */\nstatic NDIS_STATUS MATProto_PPPoEDis_Exit(\n\tIN MAT_STRUCT *pMatCfg)\n{\n\tUidMacTable_RemoveAll(pMatCfg);\n\tSesMacTable_RemoveAll(pMatCfg);\n\t\n\treturn TRUE;\n}\n\n\n/* PPPoE Session stage Rx handler\n\tWhen we receive a ppp pakcet, first check if the srcMac is a PPPoE server or not.\n\t\tif it's a server, check the session ID of specific PPPoEServeryEntry and find out the\n\t\t\tcorrect dstMac Address.\n\t\tif it's not a server, check the session ID and find out the cor\n\t\t\n */\nstatic PUCHAR MATProto_PPPoESes_Rx(\n\tIN MAT_STRUCT \t\t*pMatCfg,\n\tIN PNDIS_PACKET\t\tpSkb,\n\tIN PUCHAR\t\t\tpLayerHdr,\n\tIN PUCHAR\t\t\tpDevMacAdr)\n{\n\tPUCHAR srcMac, dstMac = NULL, pData;\t\n\tUINT16 sesID;\n\t\n\tsrcMac = (GET_OS_PKT_DATAPTR(pSkb) + 6);\n\tpData = pLayerHdr;\n\n\t/*skip the first two bytes.(version/Type/Code) */\n\tpData += 2;\n\n\t/*get the session ID */\n\tsesID = OS_NTOHS(get_unaligned((PUINT16)(pData)));\n\n\t/* Try to find the dstMac from SesMacHash table. */\n\tdstMac = getInMacByOutMacFromSesMacTb(pMatCfg, srcMac, sesID);\n\n\treturn dstMac;\n}\n\n/* PPPoE Session stage Tx handler */\nstatic PUCHAR MATProto_PPPoESes_Tx(\n\tIN MAT_STRUCT \t\t*pMatStruct,\n\tIN PNDIS_PACKET \t\tpSkb,\n\tIN PUCHAR \t\t\tpLayerHdr,\n\tIN PUCHAR\t\t\tpDevMacAdr)\n{\n\n\t/*\n\t\tFor transmit packet, we do nothing.\n\t */\n\treturn NULL;\n}\n\n\n/* PPPoE session stage init function */\nstatic NDIS_STATUS MATProto_PPPoESes_Init(\n\tIN MAT_STRUCT\t*pMatStruct)\n{\t\n\treturn TRUE;\n}\n\n/* PPPoE session stage exit function */\nstatic NDIS_STATUS MATProto_PPPoESes_Exit(\n\tIN MAT_STRUCT\t*pMatStruct)\n{\n\n\treturn TRUE;\n}\n\n#endif /* MAT_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_profile.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tcmm_profile.c\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n \n#include \"rt_config.h\"\n\n\n#define ETH_MAC_ADDR_STR_LEN 17  /* in format of xx:xx:xx:xx:xx:xx*/\n\n/* We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed.*/\nBOOLEAN rtstrmactohex(PSTRING s1, PSTRING s2)\n{\n\tint i = 0;\n\tPSTRING ptokS = s1, ptokE = s1;\n\n\tif (strlen(s1) != ETH_MAC_ADDR_STR_LEN)\n\t\treturn FALSE;\n\n\twhile((*ptokS) != '\\0')\n\t{\n\t\tif((ptokE = strchr(ptokS, ':')) != NULL)\n\t\t\t*ptokE++ = '\\0';\n\t\tif ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))\n\t\t\tbreak; /* fail*/\n\t\tAtoH(ptokS, (PUCHAR)&s2[i++], 1);\n\t\tptokS = ptokE;\n\t\tif (ptokS == NULL)\n\t\t\tbreak;\n\t\tif (i == 6)\n\t\t\tbreak; /* parsing finished*/\n\t}\n\n\treturn ( i == 6 ? TRUE : FALSE);\n\n}\n\n\n#define ASC_LOWER(_x)\t((((_x) >= 0x41) && ((_x) <= 0x5a)) ? (_x) + 0x20 : (_x))\n/* we assume the s1 and s2 both are strings.*/\nBOOLEAN rtstrcasecmp(PSTRING s1, PSTRING s2)\n{\n\tPSTRING p1 = s1, p2 = s2;\n\tCHAR c1, c2;\n\t\n\tif (strlen(s1) != strlen(s2))\n\t\treturn FALSE;\n\t\n\twhile(*p1 != '\\0')\n\t{\n\t\tc1 = ASC_LOWER(*p1);\n\t\tc2 = ASC_LOWER(*p2);\n\t\tif(c1 != c2)\n\t\t\treturn FALSE;\n\t\tp1++;\n\t\tp2++;\n\t}\n\t\n\treturn TRUE;\n}\n\n\n/* we assume the s1 (buffer) and s2 (key) both are strings.*/\nPSTRING rtstrstruncasecmp(PSTRING s1, PSTRING s2)\n{\n\tINT l1, l2, i;\n\tchar temp1, temp2;\n\n\tl2 = strlen(s2);\n\tif (!l2)\n\t\treturn (char *) s1;\n\n\tl1 = strlen(s1);\n\n\twhile (l1 >= l2)\n\t{\n\t\tl1--;\n\n\t\tfor(i=0; i<l2; i++)\n\t\t{\n\t\t\ttemp1 = *(s1+i);\n\t\t\ttemp2 = *(s2+i);\n\n\t\t\tif (('a' <= temp1) && (temp1 <= 'z'))\n\t\t\t\ttemp1 = 'A'+(temp1-'a');\n\t\t\tif (('a' <= temp2) && (temp2 <= 'z'))\n\t\t\t\ttemp2 = 'A'+(temp2-'a');\n\n\t\t\tif (temp1 != temp2)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (i == l2)\n\t\t\treturn (char *) s1;\n\n\t\ts1++;\n\t}\n\t\n\treturn NULL; /* not found*/\n}\n\n\n /**\n  * strstr - Find the first substring in a %NUL terminated string\n  * @s1: The string to be searched\n  * @s2: The string to search for\n  */\nPSTRING rtstrstr(PSTRING s1,const PSTRING s2)\n{\n\tINT l1, l2;\n\n\tl2 = strlen(s2);\n\tif (!l2)\n\t\treturn s1;\n\t\n\tl1 = strlen(s1);\n\t\n\twhile (l1 >= l2)\n\t{\n\t\tl1--;\n\t\tif (!memcmp(s1,s2,l2))\n\t\t\treturn s1;\n\t\ts1++;\n\t}\n\t\n\treturn NULL;\n}\n \n/**\n * rstrtok - Split a string into tokens\n * @s: The string to be searched\n * @ct: The characters to search for\n * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.\n */\nPSTRING __rstrtok;\nPSTRING rstrtok(PSTRING s,const PSTRING ct)\n{\n\tPSTRING sbegin, send;\n\n\tsbegin  = s ? s : __rstrtok;\n\tif (!sbegin)\n\t{\n\t\treturn NULL;\n\t}\n\n\tsbegin += strspn(sbegin,ct);\n\tif (*sbegin == '\\0')\n\t{\n\t\t__rstrtok = NULL;\n\t\treturn( NULL );\n\t}\n\n\tsend = strpbrk( sbegin, ct);\n\tif (send && *send != '\\0')\n\t\t*send++ = '\\0';\n\n\t__rstrtok = send;\n\n\treturn (sbegin);\n}\n\n/**\n * delimitcnt - return the count of a given delimiter in a given string.\n * @s: The string to be searched.\n * @ct: The delimiter to search for.\n * Notice : We suppose the delimiter is a single-char string(for example : \";\").\n */\nINT delimitcnt(PSTRING s,PSTRING ct)\n{\n\tINT count = 0;\n\t/* point to the beginning of the line */\n\tPSTRING token = s; \n\n\tfor ( ;; )\n\t{\n\t\ttoken = strpbrk(token, ct); /* search for delimiters */\n\n        if ( token == NULL )\n\t\t{\n\t\t\t/* advanced to the terminating null character */\n\t\t\tbreak; \n\t\t}\n\t\t/* skip the delimiter */\n\t    ++token; \n\n\t\t/*\n\t\t * Print the found text: use len with %.*s to specify field width.\n\t\t */\n        \n\t\t/* accumulate delimiter count */\n\t    ++count; \n\t}\n    return count;\n}\n\n/*\n  * converts the Internet host address from the standard numbers-and-dots notation\n  * into binary data.\n  * returns nonzero if the address is valid, zero if not.\t\n  */\nint rtinet_aton(PSTRING cp, unsigned int *addr)\n{\n\tunsigned int \tval;\n\tint         \tbase, n;\n\tSTRING        \tc;\n\tunsigned int    parts[4];\n\tunsigned int    *pp = parts;\n\n\tfor (;;)\n    {\n         /*\n          * Collect number up to ``.''. \n          * Values are specified as for C: \n          *\t0x=hex, 0=octal, other=decimal.\n          */\n         val = 0;\n         base = 10;\n         if (*cp == '0')\n         {\n             if (*++cp == 'x' || *cp == 'X')\n                 base = 16, cp++;\n             else\n                 base = 8;\n         }\n         while ((c = *cp) != '\\0')\n         {\n             if (isdigit((unsigned char) c))\n             {\n                 val = (val * base) + (c - '0');\n                 cp++;\n                 continue;\n             }\n             if (base == 16 && isxdigit((unsigned char) c))\n             {\n                 val = (val << 4) +\n                     (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));\n                 cp++;\n                 continue;\n             }\n             break;\n         }\n         if (*cp == '.')\n         {\n             /*\n              * Internet format: a.b.c.d a.b.c   (with c treated as 16-bits)\n              * a.b     (with b treated as 24 bits)\n              */\n             if (pp >= parts + 3 || val > 0xff)\n                 return 0;\n             *pp++ = val, cp++;\n         }\n         else\n             break;\n     }\n \n     /*\n      * Check for trailing junk.\n      */\n     while (*cp)\n         if (!isspace((unsigned char) *cp++))\n             return 0;\n \n     /*\n      * Concoct the address according to the number of parts specified.\n      */\n     n = pp - parts + 1;\n     switch (n)\n     {\n \n         case 1:         /* a -- 32 bits */\n             break;\n \n         case 2:         /* a.b -- 8.24 bits */\n             if (val > 0xffffff)\n                 return 0;\n             val |= parts[0] << 24;\n             break;\n \n         case 3:         /* a.b.c -- 8.8.16 bits */\n             if (val > 0xffff)\n                 return 0;\n             val |= (parts[0] << 24) | (parts[1] << 16);\n             break;\n \n         case 4:         /* a.b.c.d -- 8.8.8.8 bits */\n             if (val > 0xff)\n                 return 0;\n             val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);\n             break;\n     }\n\t      \n     *addr = OS_HTONL(val);\n     return 1;\n\n}\n\n/*\n    ========================================================================\n\n    Routine Description:\n        Find key section for Get key parameter.\n\n    Arguments:\n        buffer                      Pointer to the buffer to start find the key section\n        section                     the key of the secion to be find\n\n    Return Value:\n        NULL                        Fail\n        Others                      Success\n    ========================================================================\n*/\nPSTRING RTMPFindSection(\n    IN  PSTRING   buffer)\n{\n    STRING temp_buf[32];\n    PSTRING  ptr;\n\n    strcpy(temp_buf, \"Default\");\n\n    if((ptr = rtstrstr(buffer, temp_buf)) != NULL)\n            return (ptr+strlen(\"\\n\"));\n        else\n            return NULL;\n}\n\n/*\n    ========================================================================\n\n    Routine Description:\n        Get key parameter.\n\n    Arguments:\n\tkey\t\t\tPointer to key string\n\tdest\t\t\tPointer to destination      \n\tdestsize\t\tThe datasize of the destination\n\tbuffer\t\tPointer to the buffer to start find the key\n\tbTrimSpace\tSet true if you want to strip the space character of the result pattern\n\t\n    Return Value:\n        TRUE                        Success\n        FALSE                       Fail\n\n    Note:\n\tThis routine get the value with the matched key (case case-sensitive)\n\tFor SSID and security key related parameters, we SHALL NOT trim the space(' ') character.\n    ========================================================================\n*/\nINT RTMPGetKeyParameter(\n    IN PSTRING key,\n    OUT PSTRING dest,\n    IN INT destsize,\n    IN PSTRING buffer,\n    IN BOOLEAN bTrimSpace)\n{\n\tPSTRING pMemBuf, temp_buf1 = NULL, temp_buf2 = NULL;\n\tPSTRING start_ptr, end_ptr;\n\tPSTRING ptr;\n\tPSTRING offset = NULL;\n\tINT  len, keyLen;\n\n\n\tkeyLen = strlen(key);\n\tos_alloc_mem(NULL, (PUCHAR *)&pMemBuf, MAX_PARAM_BUFFER_SIZE  * 2);\n\tif (pMemBuf == NULL)\n\t\treturn (FALSE);\n\t\n\tmemset(pMemBuf, 0, MAX_PARAM_BUFFER_SIZE * 2);\n\ttemp_buf1 = pMemBuf;\n\ttemp_buf2 = (PSTRING)(pMemBuf + MAX_PARAM_BUFFER_SIZE);\n\n\n\t/*find section*/\n\tif((offset = RTMPFindSection(buffer)) == NULL)\n\t{\n\t\tos_free_mem(NULL, (PUCHAR)pMemBuf);\n\t\treturn (FALSE);\n\t}\n\n\tstrcpy(temp_buf1, \"\\n\");\n\tstrcat(temp_buf1, key);\n\tstrcat(temp_buf1, \"=\");\n\n\t/*search key*/\n\tif((start_ptr=rtstrstr(offset, temp_buf1)) == NULL)\n\t{\n\t\tos_free_mem(NULL, (PUCHAR)pMemBuf);\n\t\treturn (FALSE);\n\t}\n\n\tstart_ptr += strlen(\"\\n\");\n\tif((end_ptr = rtstrstr(start_ptr, \"\\n\"))==NULL)\n\t\tend_ptr = start_ptr+strlen(start_ptr);\n\n\tif (end_ptr<start_ptr)\n\t{\n\t\tos_free_mem(NULL, (PUCHAR)pMemBuf);\n\t\treturn (FALSE);\n\t}\n\n\tNdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);\n\ttemp_buf2[end_ptr-start_ptr]='\\0';\n\n\tif((start_ptr=rtstrstr(temp_buf2, \"=\")) == NULL)\n\t{\n\t\tos_free_mem(NULL, (PUCHAR)pMemBuf);\n\t\treturn (FALSE);\n\t}\n\tptr = (start_ptr +1);\n\t/*trim special characters, i.e.,  TAB or space*/\n\twhile(*start_ptr != 0x00)\n\t{\n\t\tif( ((*ptr == ' ') && bTrimSpace) || (*ptr == '\\t') )\n\t\t\tptr++;\n\t\telse\n\t\t\tbreak;\n\t}\n\tlen = strlen(start_ptr);\n\n\tmemset(dest, 0x00, destsize);\n\tstrncpy(dest, ptr, ((len >= destsize) ? destsize: len));\n\n\tos_free_mem(NULL, (PUCHAR)pMemBuf);\n\t\n\treturn TRUE;\n}\n\n\n/*\n    ========================================================================\n\n    Routine Description:\n        Get multiple key parameter.\n\n    Arguments:\n        key                         Pointer to key string\n        dest                        Pointer to destination      \n        destsize                    The datasize of the destination\n        buffer                      Pointer to the buffer to start find the key\n\n    Return Value:\n        TRUE                        Success\n        FALSE                       Fail\n\n    Note:\n        This routine get the value with the matched key (case case-sensitive)\n    ========================================================================\n*/\nINT RTMPGetKeyParameterWithOffset(\n    IN  PSTRING   key,\n    OUT PSTRING   dest,   \n    OUT\tUSHORT\t*end_offset,\t\t\n    IN  INT     destsize,\n    IN  PSTRING   buffer,\n    IN\tBOOLEAN\tbTrimSpace)\n{\n    PSTRING temp_buf1 = NULL;\n    PSTRING temp_buf2 = NULL;\n    PSTRING start_ptr;\n    PSTRING end_ptr;\n    PSTRING ptr;\n    PSTRING offset = 0;\n    INT  len;\n\n\tif (*end_offset >= MAX_INI_BUFFER_SIZE)\n\t\treturn (FALSE);\n\t\n\tos_alloc_mem(NULL, (PUCHAR *)&temp_buf1, MAX_PARAM_BUFFER_SIZE);\n\n\tif(temp_buf1 == NULL)\n        return (FALSE);\n\t\t\n\tos_alloc_mem(NULL, (PUCHAR *)&temp_buf2, MAX_PARAM_BUFFER_SIZE);\n\tif(temp_buf2 == NULL)\n\t{\n\t\tos_free_mem(NULL, (PUCHAR)temp_buf1);\n        return (FALSE);\n\t}\n\t\n    /*find section\t\t*/\n\tif(*end_offset == 0)\n    {\n\t\tif ((offset = RTMPFindSection(buffer)) == NULL)\n\t\t{\n\t\t\tos_free_mem(NULL, (PUCHAR)temp_buf1);\n\t    \tos_free_mem(NULL, (PUCHAR)temp_buf2);\n    \t    return (FALSE);\n\t\t}\n    }\n\telse\n\t\toffset = buffer + (*end_offset);\t\n\t\t\n    strcpy(temp_buf1, \"\\n\");\n    strcat(temp_buf1, key);\n    strcat(temp_buf1, \"=\");\n\n    /*search key*/\n    if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)\n    {\n\t\tos_free_mem(NULL, (PUCHAR)temp_buf1);\n    \tos_free_mem(NULL, (PUCHAR)temp_buf2);\n        return (FALSE);\n    }\n\n    start_ptr+=strlen(\"\\n\");\n    if((end_ptr=rtstrstr(start_ptr, \"\\n\"))==NULL)\n       end_ptr=start_ptr+strlen(start_ptr);\n\t\n    if (end_ptr<start_ptr)\n    {\n\t\tos_free_mem(NULL, (PUCHAR)temp_buf1);\n    \tos_free_mem(NULL, (PUCHAR)temp_buf2);\n        return (FALSE);\n    }\n\n\t*end_offset = end_ptr - buffer;\n\n    NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);\n    temp_buf2[end_ptr-start_ptr]='\\0';\n    len = strlen(temp_buf2);\n    strcpy(temp_buf1, temp_buf2);\n    if((start_ptr=rtstrstr(temp_buf1, \"=\")) == NULL)\n    {\n\t\tos_free_mem(NULL, (PUCHAR)temp_buf1);\n    \tos_free_mem(NULL, (PUCHAR)temp_buf2);\n        return (FALSE);\n    }\n\n    strcpy(temp_buf2, start_ptr+1);\n    ptr = temp_buf2;\n    /*trim space or tab*/\n    while(*ptr != 0x00)\n    {\n        if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\\t') )\n            ptr++;\n        else\n           break;\n    }\n\n    len = strlen(ptr);    \n    memset(dest, 0x00, destsize);\n    strncpy(dest, ptr, len >= destsize ?  destsize: len);\n\n\tos_free_mem(NULL, (PUCHAR)temp_buf1);\n    os_free_mem(NULL, (PUCHAR)temp_buf2);\n    return TRUE;\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\ninline void RTMPSetSTADefKeyId(RTMP_ADAPTER *pAd, ULONG KeyIdx)\n{\n\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\tpAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);\n\telse\n\t\tpAd->StaCfg.DefaultKeyId = 0;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nstatic int rtmp_parse_key_buffer_from_file(IN  PRTMP_ADAPTER pAd,IN  PSTRING buffer,IN  ULONG KeyType,IN  INT BSSIdx,IN  INT KeyIdx)\n{\n\tPSTRING\t\tkeybuff;\n\t/*INT\t\t\ti = BSSIdx, idx = KeyIdx, retVal;*/\n\tULONG\t\tKeyLen;\n\t/*UCHAR\t\tCipherAlg = CIPHER_WEP64;*/\n\tCIPHER_KEY\t*pSharedKey;\n\t\n\tkeybuff = buffer;\n\tKeyLen = strlen(keybuff);\n\tpSharedKey = &pAd->SharedKey[BSSIdx][KeyIdx];\n\n\tif(((KeyType != 0) && (KeyType != 1)) ||\n\t    ((KeyType == 0) && (KeyLen != 10) && (KeyLen != 26)) ||\n\t    ((KeyType== 1) && (KeyLen != 5) && (KeyLen != 13)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Key%dStr is Invalid key length(%ld) or Type(%ld)\\n\", \n\t\t\t\t\t\t\t\tKeyIdx+1, KeyLen, KeyType));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\treturn RT_CfgSetWepKey(pAd, buffer, pSharedKey, KeyIdx);\n\t}\n\t\n}\n\n\nstatic void rtmp_read_key_parms_from_file(IN  PRTMP_ADAPTER pAd, PSTRING tmpbuf, PSTRING buffer)\n{\n\tSTRING\t\ttok_str[16];\n\tPSTRING\t\tmacptr;\t\t\t\t\t\t\n\tINT\t\t\ti = 0, idx;\n\tULONG\t\tKeyType[HW_BEACON_MAX_NUM];\n\tULONG\t\tKeyIdx;\n\n\tNdisZeroMemory(KeyType, sizeof(KeyType));\n\n\t/*DefaultKeyID*/\n\tif(RTMPGetKeyParameter(\"DefaultKeyID\", tmpbuf, 25, buffer, TRUE))\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t{\n\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tKeyIdx = simple_strtol(macptr, 0, 10);\n\t\t\t\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n\t\t\t\telse\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].DefaultKeyId = 0;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) DefaultKeyID(0~3)=%d\\n\", i, pAd->ApCfg.MBSSID[i].DefaultKeyId));\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tKeyIdx = simple_strtol(tmpbuf, 0, 10);\n\t\t\tRTMPSetSTADefKeyId(pAd, KeyIdx);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DefaultKeyID(0~3)=%d\\n\", pAd->StaCfg.DefaultKeyId));\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\n\t}\t   \n\n\n\tfor (idx = 0; idx < 4; idx++)\n\t{\n\t\tsnprintf(tok_str, sizeof(tok_str), \"Key%dType\", idx + 1);\n\t\t/*Key1Type*/\n\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, TRUE))\n\t\t{\n\t\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t    {\n\t\t\t\t/*\n\t\t\t\t\tdo sanity check for KeyType length;\n\t\t\t\t\tor in station mode, the KeyType length > 1,\n\t\t\t\t\tthe code will overwrite the stack of caller\n\t\t\t\t\t(RTMPSetProfileParameters) and cause srcbuf = NULL\n\t\t\t\t*/\n\t\t\t\tif (i < MAX_MBSSID_NUM(pAd))\n\t\t\t\t\tKeyType[i] = simple_strtol(macptr, 0, 10);\n\t\t    }\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t\t\tif (TRUE)\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN bKeyxStryIsUsed = FALSE;\n \n\t\t\t\t\t//GPRINT(RT_DEBUG_TRACE, (\"pAd->ApCfg.BssidNum=%d\\n\", pAd->ApCfg.BssidNum));\n\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t        \t{\n\t\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"Key%dStr%d\", idx + 1, i + 1);\n\t\t\t\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[i], i, idx);\n\n\t\t\t\t\t\t\tif (bKeyxStryIsUsed == FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbKeyxStryIsUsed = TRUE;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bKeyxStryIsUsed == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"Key%dStr\", idx + 1);\n\t\t\t\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (pAd->ApCfg.BssidNum == 1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* Anyway, we still do the legacy dissection of the whole KeyxStr string.*/\n\t\t\t\t\t\t\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t\t    {\n\t\t\t\t\t\t\t\t\trtmp_parse_key_buffer_from_file(pAd, macptr, KeyType[i], i, idx);\n\t\t\t\t\t\t\t    }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"Key%dStr\", idx + 1);\n\t\t\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))\n\t\t\t\t{\n\t\t\t\t\trtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\t}\n}\n\n#ifdef CONFIG_AP_SUPPORT \n\n#ifdef APCLI_SUPPORT\nstatic void rtmp_read_ap_client_from_file(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING tmpbuf,\n\tIN PSTRING buffer)\n{\n\tPSTRING\t\tmacptr = NULL;\n\tINT\t\t\ti=0, j=0, idx;\n\tUCHAR\t\tmacAddress[MAC_ADDR_LEN];\n\t/*UCHAR\t\tkeyMaterial[40];*/\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\tULONG\t\tKeyIdx;\n\tSTRING\t\ttok_str[16];\n\tULONG\t\tKeyType[MAX_APCLI_NUM];\n\tULONG\t\tKeyLen;\n\t/*UCHAR\t\tCipherAlg = CIPHER_WEP64;*/\n\n\n\tNdisZeroMemory(KeyType, sizeof(KeyType));\n\n\t/*ApCliEnable*/\n\tif(RTMPGetKeyParameter(\"ApCliEnable\", tmpbuf, 128, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\t\t\tif ((strncmp(macptr, \"0\", 1) == 0))\n\t\t\t\tpApCliEntry->Enable = FALSE;\n\t\t\telse if ((strncmp(macptr, \"1\", 1) == 0))\n\t\t\t\tpApCliEntry->Enable = TRUE;\n\t        else\n\t\t\t\tpApCliEntry->Enable = FALSE;\n\n\t\t\tif (pApCliEntry->Enable)\n\t\t\t{\n\t\t\t\t/*pApCliEntry->WpaState = SS_NOTUSE;*/\n\t\t\t\t/*pApCliEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;*/\n\t\t\t\t/*NdisZeroMemory(pApCliEntry->ReplayCounter, LEN_KEY_DESC_REPLAY); */\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliEntry[%d].Enable=%d\\n\", i, pApCliEntry->Enable));\n\t    }\n\t}\n\n\t/*ApCliSsid*/\n\tif(RTMPGetKeyParameter(\"ApCliSsid\", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, FALSE))\n\t{\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\t/*Ssid acceptable strlen must be less than 32 and bigger than 0.*/\n\t\t\tpApCliEntry->CfgSsidLen = (UCHAR)strlen(macptr);\n\t\t\tif (pApCliEntry->CfgSsidLen > 32)\n\t\t\t{\n\t\t\t\tpApCliEntry->CfgSsidLen = 0;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tif(pApCliEntry->CfgSsidLen > 0)\n\t\t\t{\n\t\t\t\tmemcpy(&pApCliEntry->CfgSsid, macptr, pApCliEntry->CfgSsidLen);\n\t\t\t\tpApCliEntry->Valid = FALSE;/* it should be set when successfuley association*/\n\t\t\t} else\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&(pApCliEntry->CfgSsid), MAX_LEN_OF_SSID);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliEntry[%d].CfgSsidLen=%d, CfgSsid=%s\\n\", i, pApCliEntry->CfgSsidLen, pApCliEntry->CfgSsid));\n\t\t}\n\t}\n\n\t/*ApCliBssid*/\n\tif(RTMPGetKeyParameter(\"ApCliBssid\", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))\n\t{\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\tif(strlen(macptr) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17*/\n\t\t\t\tcontinue; \n\t\t\tif(strcmp(macptr,\"00:00:00:00:00:00\") == 0)\n\t\t\t\tcontinue; \n\t\t\tfor (j=0; j<ETH_LENGTH_OF_ADDRESS; j++)\n\t\t\t{\n\t\t\t\tAtoH(macptr, &macAddress[j], 1);\n\t\t\t\tmacptr=macptr+3;\n\t\t\t}\t\n\t\t\tmemcpy(pApCliEntry->CfgApCliBssid, &macAddress, ETH_LENGTH_OF_ADDRESS);\n\t\t\tpApCliEntry->Valid = FALSE;/* it should be set when successfuley association*/\n\t\t}\n\t}\n\n\t/*ApCliAuthMode*/\n\tif (RTMPGetKeyParameter(\"ApCliAuthMode\", tmpbuf, 255, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\t\t\t\n\t\t\tif ((strncmp(macptr, \"WEPAUTO\", 7) == 0) || (strncmp(macptr, \"wepauto\", 7) == 0))\n\t\t\t\tpApCliEntry->AuthMode = Ndis802_11AuthModeAutoSwitch;\n\t\t\telse if ((strncmp(macptr, \"SHARED\", 6) == 0) || (strncmp(macptr, \"shared\", 6) == 0))\n\t\t\t\tpApCliEntry->AuthMode = Ndis802_11AuthModeShared;\n\t\t\telse if ((strncmp(macptr, \"WPAPSK\", 6) == 0) || (strncmp(macptr, \"wpapsk\", 6) == 0))\n\t\t\t\tpApCliEntry->AuthMode = Ndis802_11AuthModeWPAPSK;\n\t\t\telse if ((strncmp(macptr, \"WPA2PSK\", 7) == 0) || (strncmp(macptr, \"wpa2psk\", 7) == 0))\n\t\t\t\tpApCliEntry->AuthMode = Ndis802_11AuthModeWPA2PSK;\n\t\t\telse\n\t\t\t\tpApCliEntry->AuthMode = Ndis802_11AuthModeOpen;\n\n\t\t\t/*pApCliEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;*/\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) ApCli_AuthMode=%d \\n\", i, pApCliEntry->AuthMode));\n\t\t\tRTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (i + MIN_NET_DEVICE_FOR_APCLI));\n\t\t}\n\n\t}\n\n\t/*ApCliEncrypType*/\n\tif (RTMPGetKeyParameter(\"ApCliEncrypType\", tmpbuf, 255, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled;\n\t\t\tif ((strncmp(macptr, \"WEP\", 3) == 0) || (strncmp(macptr, \"wep\", 3) == 0))\n            {\n\t\t\t\tif (pApCliEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\tpApCliEntry->WepStatus = Ndis802_11WEPEnabled;\t\t\t\t  \n\t\t\t}\n\t\t\telse if ((strncmp(macptr, \"TKIP\", 4) == 0) || (strncmp(macptr, \"tkip\", 4) == 0))\n\t\t\t{\n\t\t\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption2Enabled;                       \n            }\n\t\t\telse if ((strncmp(macptr, \"AES\", 3) == 0) || (strncmp(macptr, \"aes\", 3) == 0))\n\t\t\t{\n\t\t\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption3Enabled;                            \n\t\t\t}    \n\t\t\telse\n\t\t\t{\n\t\t\t\tpApCliEntry->WepStatus      = Ndis802_11WEPDisabled;                 \n\t\t\t}\n\n\t\t\tpApCliEntry->PairCipher     = pApCliEntry->WepStatus;\n\t\t\tpApCliEntry->GroupCipher    = pApCliEntry->WepStatus;\n\t\t\tpApCliEntry->bMixCipher\t\t= FALSE;\n\t\t\t\n\t\t\t/*pApCliEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;*/\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) APCli_EncrypType = %d \\n\", i, pApCliEntry->WepStatus));\n\t\t\tRTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (i + MIN_NET_DEVICE_FOR_APCLI));\n\t\t}\n\n\t}\n\t\n\t/*ApCliWPAPSK*/\n\tif (RTMPGetKeyParameter(\"ApCliWPAPSK\", tmpbuf, 255, buffer, FALSE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tint retval = TRUE;\n\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\tif((strlen(macptr) < 8) || (strlen(macptr) > 64))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"APCli_WPAPSK_KEY, key string required 8 ~ 64 characters!!!\\n\"));\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\t\n\t\t\tNdisMoveMemory(pApCliEntry->PSK, macptr, strlen(macptr));\n\t\t\tpApCliEntry->PSKLen = strlen(macptr);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) APCli_WPAPSK_KEY=%s, Len=%d\\n\", i, pApCliEntry->PSK, pApCliEntry->PSKLen));\n\n\t\t\tif ((pApCliEntry->AuthMode != Ndis802_11AuthModeWPAPSK) &&\n\t\t\t\t(pApCliEntry->AuthMode != Ndis802_11AuthModeWPA2PSK))\n\t\t\t{\n\t\t\t\tretval = FALSE;\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tretval = RT_CfgSetWPAPSKKey(pAd, macptr, strlen(macptr), (PUCHAR)pApCliEntry->CfgSsid, (INT)pApCliEntry->CfgSsidLen, pApCliEntry->PMK);\n\t\t\t}\n\t\t\tif (retval == TRUE)\n\t\t\t{\n\t\t\t\t/* Start STA supplicant WPA state machine*/\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Start AP-client WPAPSK state machine \\n\"));\n\t\t\t\t/*pApCliEntry->WpaState = SS_START;\t\t\t\t*/\n\t\t\t}\n\n\t\t\t/*RTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (i + MIN_NET_DEVICE_FOR_APCLI));\t\t\t*/\n#ifdef DBG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) PMK Material => \\n\", i));\n\t\t\t\n\t\t\tfor (j = 0; j < 32; j++)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%02x:\", pApCliEntry->PMK[j]));\n\t\t\t\tif ((j%16) == 15)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"\\n\"));\n#endif\n\t\t}\n\t}\n\n\t/*ApCliDefaultKeyID*/\n\tif (RTMPGetKeyParameter(\"ApCliDefaultKeyID\", tmpbuf, 255, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\t\t\t\n\t\t\tKeyIdx = simple_strtol(macptr, 0, 10);\n\t\t\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\t\t\tpApCliEntry->DefaultKeyId = (UCHAR) (KeyIdx - 1);\n\t\t\telse\n\t\t\t\tpApCliEntry->DefaultKeyId = 0;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) DefaultKeyID(0~3)=%d\\n\", i, pApCliEntry->DefaultKeyId));\n\t\t}\n\t}\n\n\t/*ApCliKeyXType, ApCliKeyXStr*/\n\tfor (idx=0; idx<4; idx++)\n\t{\n\t\tsnprintf(tok_str, sizeof(tok_str),  \"ApCliKey%dType\", idx+1);\n\t\t/*ApCliKey1Type*/\n\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, TRUE))\n\t\t{\n\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t{\n\t\t\t    KeyType[i] = simple_strtol(macptr, 0, 10);\n\t\t\t}\n\n\t\t\tsnprintf(tok_str, sizeof(tok_str), \"ApCliKey%dStr\", idx+1);\n\t\t\t/*ApCliKey1Str*/\n\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 512, buffer, FALSE))\n\t\t\t{\n\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t{\n\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\t\t\t\t\tKeyLen = strlen(macptr);\n\t\t\t\t\tif(((KeyType[i] == 0) && (KeyLen != 10) && (KeyLen != 26)) ||\n\t\t\t\t\t    ((KeyType[i] != 0) && (KeyLen != 5) && (KeyLen != 13)))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"I/F(apcli%d) Key%dStr is Invalid key length!\\n\", i, idx+1));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (RT_CfgSetWepKey(pAd, macptr, &pApCliEntry->SharedKey[idx], idx) != TRUE)\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RT_CfgSetWepKey fail!\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* ApCliTxMode*/\n\tif (RTMPGetKeyParameter(\"ApCliTxMode\", tmpbuf, 25, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode = \n\t\t\t\t\t\t\t\t\t\tRT_CfgSetFixedTxPhyMode(macptr);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Tx Mode = %d\\n\", i,\n\t\t\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode));\t\t\t\t\t\n\t\t}\t\n\t}\n\n\t/* ApCliTxMcs*/\n\tif (RTMPGetKeyParameter(\"ApCliTxMcs\", tmpbuf, 50, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_APCLI_NUM); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\tpApCliEntry->DesiredTransmitSetting.field.MCS = \n\t\t\t\t\tRT_CfgSetTxMCSProc(macptr, &pApCliEntry->bAutoTxRateSwitch);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Tx MCS = %s(%d)\\n\", i,\n\t\t\t\t\t\t(pApCliEntry->DesiredTransmitSetting.field.MCS == MCS_AUTO ? \"AUTO\" : \"\"),\n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.MCS));\n\t\t}\t\n\t}\n\n\t\n#ifdef WSC_AP_SUPPORT\n\n\t\t/* Wsc4digitPinCode = TRUE use 4-digit Pin code, otherwise 8-digit Pin code */\n\t\tif (RTMPGetKeyParameter(\"ApCli_Wsc4digitPinCode\", tmpbuf, 32, buffer, TRUE))\n\t\t{\n\t\t\tif (simple_strtol(macptr, 0, 10) != 0)\t//Enable\n\t\t\t\tpAd->ApCfg.ApCliTab[0].WscControl.WscEnrollee4digitPinCode = TRUE;\n\t\t\telse //Disable\n\t\t\t\tpAd->ApCfg.ApCliTab[0].WscControl.WscEnrollee4digitPinCode = FALSE;\n\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) ApCli_Wsc4digitPinCode=%d\\n\", i, pAd->ApCfg.ApCliTab[0].WscControl.WscEnrollee4digitPinCode));\n\t\t}\n#endif /* WSC_AP_SUPPORT */\t\n\n\n#ifdef UAPSD_SUPPORT\n\t/*APSDCapable*/\n\tif(RTMPGetKeyParameter(\"ApCliAPSDCapable\", tmpbuf, 10, buffer, TRUE))\n\t{\n\t\tpAd->ApCfg.FlgApCliIsUapsdInfoUpdated = TRUE;\n\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\");\n\t\t\t(macptr && i < MAX_APCLI_NUM);\n\t\t\tmacptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[i];\n\n\t\t\tpApCliEntry->UapsdInfo.bAPSDCapable = \\\n\t\t\t\t\t\t\t\t\t(UCHAR) simple_strtol(macptr, 0, 10);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliAPSDCapable[%d]=%d\\n\", i,\n\t\t\t\t\tpApCliEntry->UapsdInfo.bAPSDCapable));\n\t    }\n\t}\n#endif /* UAPSD_SUPPORT */\n}\n#endif /* APCLI_SUPPORT */\n\n\nstatic void rtmp_read_acl_parms_from_file(IN  PRTMP_ADAPTER pAd, PSTRING tmpbuf, PSTRING buffer)\n{\n\tSTRING\t\ttok_str[32];\n\tPSTRING\t\tmacptr;\t\t\t\t\t\t\n\tINT\t\t\ti=0, j=0, idx;\n\tUCHAR\t\tmacAddress[MAC_ADDR_LEN];\n\n\n\tmemset(macAddress, 0, MAC_ADDR_LEN);\n\tfor (idx=0; idx<MAX_MBSSID_NUM(pAd); idx++)\n\t{\n\t\tmemset(&pAd->ApCfg.MBSSID[idx].AccessControlList, 0, sizeof(RT_802_11_ACL));\n\t\t/* AccessPolicyX*/\n\t\tsnprintf(tok_str, sizeof(tok_str), \"AccessPolicy%d\", idx);\n\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 10, buffer, TRUE))\n\t\t{\n\t\t\tswitch (simple_strtol(tmpbuf, 0, 10))\n\t\t\t{\n\t\t\t\tcase 1: /* Allow All, and the AccessControlList is positive now.*/\n\t\t\t\t\tpAd->ApCfg.MBSSID[idx].AccessControlList.Policy = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2: /* Reject All, and the AccessControlList is negative now.*/\n\t\t\t\t\tpAd->ApCfg.MBSSID[idx].AccessControlList.Policy = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0: /* Disable, don't care the AccessControlList.*/\n\t\t\t\tdefault:\n\t\t\t\t\tpAd->ApCfg.MBSSID[idx].AccessControlList.Policy = 0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s=%ld\\n\", tok_str, pAd->ApCfg.MBSSID[idx].AccessControlList.Policy));\n\t\t}\n\t\t/* AccessControlListX*/\n\t\tsnprintf(tok_str, sizeof(tok_str), \"AccessControlList%d\", idx);\n\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))\n\t\t{\n\t\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++) \n\t\t\t{\n\t\t\t\tif (strlen(macptr) != 17)  /* Mac address acceptable format 01:02:03:04:05:06 length 17*/\n\t\t\t\t\tcontinue;\n\n\t\t\t\tASSERT(pAd->ApCfg.MBSSID[idx].AccessControlList.Num <= MAX_NUM_OF_ACL_LIST);\n\t\t\t\t\n\t\t\t\tfor (j=0; j<ETH_LENGTH_OF_ADDRESS; j++)\n\t\t\t\t{\n\t\t\t\t\tAtoH(macptr, &macAddress[j], 1);\n\t\t\t\t\tmacptr=macptr+3;\n\t\t\t\t}\n\n\t\t\t\tif (pAd->ApCfg.MBSSID[idx].AccessControlList.Num == MAX_NUM_OF_ACL_LIST)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"The AccessControlList is full, and no more entry can join the list!\\n\"));\n        \t\t\tDBGPRINT(RT_DEBUG_WARN, (\"The last entry of ACL is %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n        \t\t\t\tmacAddress[0],macAddress[1],macAddress[2],macAddress[3],macAddress[4],macAddress[5]));\n\n\t\t\t\t    break;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tpAd->ApCfg.MBSSID[idx].AccessControlList.Num++;\n\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[idx].AccessControlList.Entry[(pAd->ApCfg.MBSSID[idx].AccessControlList.Num - 1)].Addr, macAddress, ETH_LENGTH_OF_ADDRESS);\t\t\t\t\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s=Get %ld Mac Address\\n\", tok_str, pAd->ApCfg.MBSSID[idx].AccessControlList.Num));\n \t\t}\n\t}\n}\n\n/*\n    ========================================================================\n\n    Routine Description:\n        In kernel mode read parameters from file\n\n    Arguments:\n        src                     the location of the file.\n        dest                        put the parameters to the destination.\n        Length                  size to read.\n\n    Return Value:\n        None\n\n    Note:\n\n    ========================================================================\n*/\nstatic void rtmp_read_ap_wmm_parms_from_file(IN  PRTMP_ADAPTER pAd, PSTRING tmpbuf, PSTRING buffer)\n{\n\tPSTRING\t\t\t\t\tmacptr;\t\t\t\t\t\t\n\tINT\t\t\t\t\t\ti=0;\n\n\t/*WmmCapable*/\n\tif(RTMPGetKeyParameter(\"WmmCapable\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    BOOLEAN bEnableWmm = FALSE;\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(simple_strtol(macptr, 0, 10) != 0)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].bWmmCapable = TRUE;\n\t\t\t\tbEnableWmm = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].bWmmCapable = FALSE;\n\t\t\t}\n\n\t\t\tif (bEnableWmm)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.APEdcaParm.bValid = TRUE;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.bValid = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.APEdcaParm.bValid = FALSE;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.bValid = FALSE;\n\t\t\t}\n\n\t\t\tpAd->ApCfg.MBSSID[i].bWmmCapableOrg = \\\n\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].bWmmCapable;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WmmCapable=%d\\n\", i, pAd->ApCfg.MBSSID[i].bWmmCapable));\n\t    }\n\t}\n\t/*DLSCapable*/\n\tif(RTMPGetKeyParameter(\"DLSCapable\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(simple_strtol(macptr, 0, 10) != 0)  /*Enable*/\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].bDLSCapable = TRUE;\n\t\t\t}\n\t\t\telse /*Disable*/\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].bDLSCapable = FALSE;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) DLSCapable=%d\\n\", i, pAd->ApCfg.MBSSID[i].bDLSCapable));\n\t    }\n\t}\n\t/*APAifsn*/\n\tif(RTMPGetKeyParameter(\"APAifsn\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APAifsn[%d]=%d\\n\", i, pAd->CommonCfg.APEdcaParm.Aifsn[i]));\n\t    }\n\t}\n\t/*APCwmin*/\n\tif(RTMPGetKeyParameter(\"APCwmin\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCwmin[%d]=%d\\n\", i, pAd->CommonCfg.APEdcaParm.Cwmin[i]));\n\t    }\n\t}\n\t/*APCwmax*/\n\tif(RTMPGetKeyParameter(\"APCwmax\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCwmax[%d]=%d\\n\", i, pAd->CommonCfg.APEdcaParm.Cwmax[i]));\n\t    }\n\t}\n\t/*APTxop*/\n\tif(RTMPGetKeyParameter(\"APTxop\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[i] = (USHORT) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APTxop[%d]=%d\\n\", i, pAd->CommonCfg.APEdcaParm.Txop[i]));\n\t    }\n\t}\n\t/*APACM*/\n\tif(RTMPGetKeyParameter(\"APACM\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->CommonCfg.APEdcaParm.bACM[i] = (BOOLEAN) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APACM[%d]=%d\\n\", i, pAd->CommonCfg.APEdcaParm.bACM[i]));\n\t    }\n\t}\n\t/*BSSAifsn*/\n\tif(RTMPGetKeyParameter(\"BSSAifsn\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSSAifsn[%d]=%d\\n\", i, pAd->ApCfg.BssEdcaParm.Aifsn[i]));\n\t    }\n\t}\n\t/*BSSCwmin*/\n\tif(RTMPGetKeyParameter(\"BSSCwmin\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSSCwmin[%d]=%d\\n\", i, pAd->ApCfg.BssEdcaParm.Cwmin[i]));\n\t    }\n\t}\n\t/*BSSCwmax*/\n\tif(RTMPGetKeyParameter(\"BSSCwmax\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSSCwmax[%d]=%d\\n\", i, pAd->ApCfg.BssEdcaParm.Cwmax[i]));\n\t    }\n\t}\n\t/*BSSTxop*/\n\tif(RTMPGetKeyParameter(\"BSSTxop\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[i] = (USHORT) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSSTxop[%d]=%d\\n\", i, pAd->ApCfg.BssEdcaParm.Txop[i]));\n\t    }\n\t}\n\t/*BSSACM*/\n\tif(RTMPGetKeyParameter(\"BSSACM\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->ApCfg.BssEdcaParm.bACM[i] = (BOOLEAN) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSSACM[%d]=%d\\n\", i, pAd->ApCfg.BssEdcaParm.bACM[i]));\n\t    }\n\t}\n\t/*AckPolicy*/\n\tif(RTMPGetKeyParameter(\"AckPolicy\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tpAd->CommonCfg.AckPolicy[i] = (UCHAR) simple_strtol(macptr, 0, 10);;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AckPolicy[%d]=%d\\n\", i, pAd->CommonCfg.AckPolicy[i]));\n\t    }\n\t}\n#ifdef UAPSD_SUPPORT\n\t/*APSDCapable*/\n\tif(RTMPGetKeyParameter(\"APSDCapable\", tmpbuf, 10, buffer, TRUE))\n\t{\n\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tif (i < HW_BEACON_MAX_NUM)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].UapsdInfo.bAPSDCapable = \\\n\t\t\t\t\t\t\t\t\t\t(UCHAR) simple_strtol(macptr, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"APSDCapable[%d]=%d\\n\", i,\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].UapsdInfo.bAPSDCapable));\n\t\t\t}\n\t    }\n\n\t\tif (i == 1)\n\t\t{\n\t\t\t/*\n\t\t\t\tOld format in UAPSD settings: only 1 parameter\n\t\t\t\ti.e. UAPSD for all BSS is enabled or disabled.\n\t\t\t*/\n\t\t\tfor(i=1; i<HW_BEACON_MAX_NUM; i++)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].UapsdInfo.bAPSDCapable =\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].UapsdInfo.bAPSDCapable;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"APSDCapable[%d]=%d\\n\", i,\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].UapsdInfo.bAPSDCapable));\n\t\t\t}\n\t\t}\n\n#ifdef APCLI_SUPPORT\n\t\tif (pAd->ApCfg.FlgApCliIsUapsdInfoUpdated == FALSE)\n\t\t{\n\t\t\t/*\n\t\t\t\tBackward:\n\t\t\t\tAll UAPSD for AP Client interface is same as MBSS0\n\t\t\t\twhen we can not find \"ApCliAPSDCapable\".\n\t\t\t\tWhen we find \"ApCliAPSDCapable\" hereafter, we will over-write.\n\t\t\t*/\n\t\t\tfor(i=0; i<MAX_APCLI_NUM; i++)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.ApCliTab[i].UapsdInfo.bAPSDCapable = \\\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].UapsdInfo.bAPSDCapable;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"default ApCliAPSDCapable[%d]=%d\\n\",\n\t\t\t\t\t\ti, pAd->ApCfg.ApCliTab[i].UapsdInfo.bAPSDCapable));\n\t\t\t}\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* UAPSD_SUPPORT */\n}\n\n#ifdef DOT1X_SUPPORT\n/*\n    ========================================================================\n\n    Routine Description:\n        In kernel mode read parameters from file\n\n    Arguments:\n        src                     the location of the file.\n        dest                        put the parameters to the destination.\n        Length                  size to read.\n\n    Return Value:\n        None\n\n    Note:\n\n    ========================================================================\n*/\nstatic void rtmp_read_radius_parms_from_file(IN  PRTMP_ADAPTER pAd, PSTRING tmpbuf, PSTRING buffer)\n{\n\tSTRING\t\t\t\t\ttok_str[16];\n\tPSTRING\t\t\t\t\tmacptr;\t\t\n\tUINT32\t\t\t\t\tip_addr;\n\tINT\t\t\t\t\t\ti=0;\n\tBOOLEAN\t\t\t\t\tbUsePrevFormat = FALSE;\n\tUSHORT\t\t\t\t\toffset;\n\tINT\t\t\t\t\t\tcount[HW_BEACON_MAX_NUM];\n\n\t/* own_ip_addr*/\n\tif (RTMPGetKeyParameter(\"own_ip_addr\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tSet_OwnIPAddr_Proc(pAd, tmpbuf);\n\t}\n\n\n\t/* session_timeout_interval*/\n\tif (RTMPGetKeyParameter(\"session_timeout_interval\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tpAd->ApCfg.session_timeout_interval = simple_strtol(tmpbuf, 0, 10); \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"session_timeout_interval=%d\\n\", pAd->ApCfg.session_timeout_interval));\n\t} \n\n\t/* quiet_interval*/\n\tif (RTMPGetKeyParameter(\"quiet_interval\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tpAd->ApCfg.quiet_interval = simple_strtol(tmpbuf, 0, 10); \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"quiet_interval=%d\\n\", pAd->ApCfg.quiet_interval));\n\t} \n\n\t/* EAPifname*/\n\tif (RTMPGetKeyParameter(\"EAPifname\", tmpbuf, 256, buffer, TRUE))\n\t{\n\t\tSet_EAPIfName_Proc(pAd, tmpbuf);\n\t}\n\t\n\t/* PreAuthifname*/\n\tif (RTMPGetKeyParameter(\"PreAuthifname\", tmpbuf, 256, buffer, TRUE))\n\t{\n\t\tSet_PreAuthIfName_Proc(pAd, tmpbuf);\n\t}\n\t\n\t/*PreAuth*/\n\tif(RTMPGetKeyParameter(\"PreAuth\", tmpbuf, 10, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\tbreak;\n\n\t\t\tif(simple_strtol(macptr, 0, 10) != 0)  /*Enable*/\n\t\t\t\tpAd->ApCfg.MBSSID[i].PreAuth = TRUE;\n\t\t\telse /*Disable*/\n\t\t\t\tpAd->ApCfg.MBSSID[i].PreAuth = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) PreAuth=%d\\n\", i, pAd->ApCfg.MBSSID[i].PreAuth));\n\t    }\n\t}\n\n\t/*IEEE8021X*/\n\tif(RTMPGetKeyParameter(\"IEEE8021X\", tmpbuf, 10, buffer, TRUE))\n\t{\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\tbreak;\n\n\t\t\tif(simple_strtol(macptr, 0, 10) != 0)  /*Enable*/\n\t\t\t\tpAd->ApCfg.MBSSID[i].IEEE8021X = TRUE;\n\t\t\telse /*Disable*/\n\t\t\t\tpAd->ApCfg.MBSSID[i].IEEE8021X = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), IEEE8021X=%d\\n\", i, pAd->ApCfg.MBSSID[i].IEEE8021X));\n\t    }\n\t}\n\t\n\t/* RADIUS_Server*/\n\toffset = 0;\n\t/*if (RTMPGetKeyParameter(\"RADIUS_Server\", tmpbuf, 256, buffer, TRUE))*/\n\twhile (RTMPGetKeyParameterWithOffset(\"RADIUS_Server\", tmpbuf, &offset, 256, buffer, TRUE))\t\n\t{\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\n\t\t\tif (rtinet_aton(macptr, &ip_addr) && pAd->ApCfg.MBSSID[i].radius_srv_num < MAX_RADIUS_SRV_NUM)\n\t\t\t{\n\t\t\t\tINT\tsrv_idx = pAd->ApCfg.MBSSID[i].radius_srv_num;\n\n\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_ip = ip_addr;\n\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_num++;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_ip(seq-%d)=%s(%x)\\n\", i, pAd->ApCfg.MBSSID[i].radius_srv_num, macptr, pAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_ip));\n\t\t\t}\t    \n\t\t}\n\t}\n\t/* RADIUS_Port*/\n\t/*if (RTMPGetKeyParameter(\"RADIUS_Port\", tmpbuf, 128, buffer, TRUE))*/\n\toffset = 0;\n\tmemset(&count[0], 0, sizeof(count));\n\twhile (RTMPGetKeyParameterWithOffset(\"RADIUS_Port\", tmpbuf, &offset, 128, buffer, TRUE))\n\t{\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\t  \n\t\t\tif (count[i] < pAd->ApCfg.MBSSID[i].radius_srv_num)\n\t\t\t{\t\t\n\t\t\t\tINT\t\tsrv_idx = count[i];\n\t\t\t\t\n            \tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_port = (UINT32) simple_strtol(macptr, 0, 10); \n\t\t\t\tcount[i] ++;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_port(seq-%d)=%d\\n\", i, count[i], pAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_port));\n\t\t\t}\n\t\t}\n\t}\n\t/* RADIUS_Key*/\n\t/*if (RTMPGetKeyParameter(\"RADIUS_Key\", tmpbuf, 640, buffer, FALSE))*/\n\toffset = 0;\n\tmemset(&count[0], 0, sizeof(count));\n\twhile (RTMPGetKeyParameterWithOffset(\"RADIUS_Key\", tmpbuf, &offset, 640, buffer, FALSE))\n\t{\n\t\tif (strlen(tmpbuf) > 0)\n\t\t\tbUsePrevFormat = TRUE;\n\t\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\t  \n\t\t\tif (strlen(macptr) > 0 && (count[i] < pAd->ApCfg.MBSSID[i].radius_srv_num))\n\t\t\t{\n\t\t\t\tINT\t\tsrv_idx = count[i];\n\t\t\t\n\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key_len = strlen(macptr); \n\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key, macptr, strlen(macptr));\n\t\t\t\tcount[i] ++;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_key(seq-%d)=%s, len=%d\\n\", i, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcount[i],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key_len));\n\t\t\t}\n\t\t}\n\t}\n\n\t/* NasIdX, X indicate the interface index(1~8) */\t\t\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t{\n\t\tsnprintf(tok_str, sizeof(tok_str), \"NasId%d\", i + 1);\n\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 33, buffer, FALSE))\n\t\t{\n\t\t\tif (strlen(tmpbuf) > 0)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].NasIdLen = strlen(tmpbuf); \n\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[i].NasId, tmpbuf, strlen(tmpbuf));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF-ra%d NAS-ID=%s, len=%d\\n\", i, \n\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].NasId, \n\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].NasIdLen));\n\t\t\t}\t\t\t\t\t\n\t\t}\n\t}\n\t\n\tif (!bUsePrevFormat)\n\t{\n\t\tfor (i = 0; i < MAX_MBSSID_NUM(pAd); i++)\n\t\t{\n\t\t\tINT\tsrv_idx = 0;\n\t\t\t\n\t\t\tsnprintf(tok_str, sizeof(tok_str), \"RADIUS_Key%d\", i + 1);\n\t\t\t\n\t\t\t/* RADIUS_KeyX (X=1~MAX_MBSSID_NUM)*/\n\t\t\t/*if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))\t\t\t*/\n\t\t\toffset = 0;\n\t\t\twhile (RTMPGetKeyParameterWithOffset(tok_str, tmpbuf, &offset, 128, buffer, FALSE))\n\t\t\t{\n\t\t\t\tif (strlen(tmpbuf) > 0 && (srv_idx < pAd->ApCfg.MBSSID[i].radius_srv_num))\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key_len = strlen(tmpbuf); \n\t\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key, tmpbuf, strlen(tmpbuf));\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), update radius_key(seq-%d)=%s, len=%d\\n\", i, srv_idx+1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].radius_srv_info[srv_idx].radius_key_len));\n\t\t\t\t\tsrv_idx ++;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /* DOT1X_SUPPORT */\n\nstatic int rtmp_parse_wpapsk_buffer_from_file(IN  PRTMP_ADAPTER pAd,IN  PSTRING buffer,IN  INT BSSIdx)\n{\n\tPSTRING\t\ttmpbuf = buffer;\n\tINT\t\t\ti = BSSIdx;\n\t/*UCHAR\t\tkeyMaterial[40];*/\n\tULONG\t\tlen = strlen(tmpbuf);\n\tint         ret = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WPAPSK_KEY=%s\\n\", i, tmpbuf));\n\n\tret = RT_CfgSetWPAPSKKey(pAd, tmpbuf, len, (PUCHAR)pAd->ApCfg.MBSSID[i].Ssid, pAd->ApCfg.MBSSID[i].SsidLen, pAd->ApCfg.MBSSID[i].PMK);\n\tif (ret == FALSE)\n\t\treturn FALSE;\n\n#ifdef WSC_AP_SUPPORT\n\tNdisZeroMemory(pAd->ApCfg.MBSSID[i].WscControl.WpaPsk, 64);\n\tpAd->ApCfg.MBSSID[i].WscControl.WpaPskLen = 0;\n\tif ((len >= 8) && (len <= 64))\n\t{                                    \n\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[i].WscControl.WpaPsk, tmpbuf, len);\n\t\tpAd->ApCfg.MBSSID[i].WscControl.WpaPskLen = len;\n\t}\n#endif /* WSC_AP_SUPPORT */\n\treturn ret;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nstatic void rtmp_read_sta_wmm_parms_from_file(IN  PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)\n{\n\tPSTRING\t\t\t\t\tmacptr;\t\t\t\t\t\t\n\tINT\t\t\t\t\t\ti=0;\n\tBOOLEAN\t\t\t\t\tbWmmEnable = FALSE;\n\t\n\t/*WmmCapable*/\n\tif(RTMPGetKeyParameter(\"WmmCapable\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tif(simple_strtol(tmpbuf, 0, 10) != 0) /*Enable*/\n\t\t{\n\t\t\tpAd->CommonCfg.bWmmCapable = TRUE;\n\t\t\tbWmmEnable = TRUE;\n\t\t}\n\t\telse /*Disable*/\n\t\t{\n\t\t\tpAd->CommonCfg.bWmmCapable = FALSE;\n\t\t}\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WmmCapable=%d\\n\", pAd->CommonCfg.bWmmCapable));\n\t}\n\n#ifdef QOS_DLS_SUPPORT\n\t/*DLSCapable*/\n\tif(RTMPGetKeyParameter(\"DLSCapable\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t{\n\t\t\tpAd->CommonCfg.bDLSCapable = TRUE;\n\t\t}\n\t\telse /*Disable*/\n\t\t{\n\t\t\tpAd->CommonCfg.bDLSCapable = FALSE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"bDLSCapable=%d\\n\", pAd->CommonCfg.bDLSCapable));\n\t}\n#endif /* QOS_DLS_SUPPORT */\n\n\t/*AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO*/\n\tif(RTMPGetKeyParameter(\"AckPolicy\", tmpbuf, 32, buffer, TRUE))\n\t{\t\t\t\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tpAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AckPolicy[%d]=%d\\n\", i, pAd->CommonCfg.AckPolicy[i]));\n\t\t}\n\t}\n\n#ifdef UAPSD_SUPPORT\n\tif (bWmmEnable)\n\t{\n\t\t/*APSDCapable*/\n\t\tif(RTMPGetKeyParameter(\"APSDCapable\", tmpbuf, 10, buffer, TRUE))\n\t\t{\n\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t\t\tpAd->StaCfg.UapsdInfo.bAPSDCapable = TRUE;\n\t\t\telse\n\t\t\t\tpAd->StaCfg.UapsdInfo.bAPSDCapable = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APSDCapable=%d\\n\", pAd->StaCfg.UapsdInfo.bAPSDCapable));\n\t\t}\n\n\t\t/*MaxSPLength*/\n\t\tif(RTMPGetKeyParameter(\"MaxSPLength\", tmpbuf, 10, buffer, TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.MaxSPLength = simple_strtol(tmpbuf, 0, 10);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MaxSPLength=%d\\n\", pAd->CommonCfg.MaxSPLength));\n\t\t}\n\n\t\t/*APSDAC for AC_BE, AC_BK, AC_VI, AC_VO*/\n\t\tif(RTMPGetKeyParameter(\"APSDAC\", tmpbuf, 32, buffer, TRUE))\n\t\t{\n\t\t\tBOOLEAN apsd_ac[4];\n\t\t\t\t\t\t\n\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t{\n\t\t\t\tapsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APSDAC%d  %d\\n\", i,  apsd_ac[i]));\n\t\t\t}\n\t\t\t\t\t\n\t\t\tpAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];\n\t\t\tpAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];\n\t\t\tpAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];\n\t\t\tpAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];\n\n\t\t\tpAd->CommonCfg.bACMAPSDTr[0] = apsd_ac[0];\n\t\t\tpAd->CommonCfg.bACMAPSDTr[1] = apsd_ac[1];\n\t\t\tpAd->CommonCfg.bACMAPSDTr[2] = apsd_ac[2];\n\t\t\tpAd->CommonCfg.bACMAPSDTr[3] = apsd_ac[3];\n\t\t}\n\t}\n#endif /* UAPSD_SUPPORT */\n}\n\n#ifdef XLINK_SUPPORT\nstatic void rtmp_get_psp_xlink_mode_from_file(IN  PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)\n{\n\tUINT32 Value = 0;\n\n\t/* Xlink Mode*/\n\tif (RTMPGetKeyParameter(\"PSP_XLINK_MODE\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tif(simple_strtol(tmpbuf, 0, 10) != 0) /* enable*/\n\t\t{\n\t\t\tpAd->StaCfg.PSPXlink = TRUE;\n\t\t}\n\t\telse /* disable*/\n\t\t{\n\t\t\tpAd->StaCfg.PSPXlink = FALSE;\n\t\t}\n\n\t\tif (pAd->StaCfg.PSPXlink)\n\t\t\tValue = PSPXLINK;\n\t\telse\n\t\t\tValue = STANORMAL;\n\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PSP_XLINK_MODE=%d\\n\", pAd->StaCfg.PSPXlink));\n\t}\n}\n#endif /* XLINK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef DOT11_VHT_AC\nstatic void VHTParametersHook(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING pValueStr,\n\tIN PSTRING pInput)\n{\n\tlong Value;\n\n\t/* Channel Width */\n\tif (RTMPGetKeyParameter(\"VHT_BW\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\n\t\tif (Value == VHT_BW_80)\n\t\t\tpAd->CommonCfg.vht_bw = VHT_BW_80;\n\t\telse\n\t\t\tpAd->CommonCfg.vht_bw = VHT_BW_2040;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"VHT: Channel Width = %s\\n\", (Value==VHT_BW_80) ? \"80 MHz\" : \"20/40 MHz\" ));\n\t}\n}\n\n#endif /* DOT11_VHT_AC */\n\n#ifdef CUSTOMER_DEMO\nvoid demo_mode_cfg(RTMP_ADAPTER *pAd)\n{\n\tint IdBss, i;\n\tUCHAR cfg_mode;\n\n\tpAd->CommonCfg.Channel = 40;\n\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n        {\n                cfg_mode = 14;\n                pAd->ApCfg.MBSSID[i].PhyMode = cfgmode_2_wmode(cfg_mode);\n                DBGPRINT(RT_DEBUG_TRACE, (\"BSS%d PhyMode=%d\\n\", i, pAd->ApCfg.MBSSID[i].PhyMode));\n\n                if (i == 0)\n                {\n                \t/* for first time, update all phy mode is same as ra0 */\n                \tfor(IdBss=1; IdBss<pAd->ApCfg.BssidNum; IdBss++)\n                        \tpAd->ApCfg.MBSSID[IdBss].PhyMode = pAd->ApCfg.MBSSID[0].PhyMode;\n                        /* set mode for 1st time */\n                        RT_CfgSetWirelessMode(pAd, \"14\");\n                }\n\t\telse\n\t\t\tRT_CfgSetMbssWirelessMode(pAd, \"14\");\n\t}\n        DBGPRINT(RT_DEBUG_TRACE, (\"PhyMode=%d\\n\", pAd->CommonCfg.PhyMode));\n\t\n\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;\n\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA  = EXTCHA_BELOW;\n\tpAd->CommonCfg.vht_bw = VHT_BW_80;\n}\n#endif /* CUSTOMER_DEMO */\n\n\n#ifdef DOT11_N_SUPPORT\nstatic void HTParametersHook(\n\tIN\tPRTMP_ADAPTER pAd, \n\tIN\tPSTRING\t\t  pValueStr,\n\tIN\tPSTRING\t\t  pInput)\n{\n\tlong Value;\n#ifdef CONFIG_AP_SUPPORT\t\n\tINT\t\t\ti=0;\n\tPSTRING\t\tBufptr;\n#endif /* CONFIG_AP_SUPPORT */\n\n    if (RTMPGetKeyParameter(\"HT_PROTECT\", pValueStr, 25, pInput, TRUE))\n    {\n        Value = simple_strtol(pValueStr, 0, 10);\n        if (Value == 0)\n        {\n            pAd->CommonCfg.bHTProtect = FALSE;\n        }\n        else\n        {\n            pAd->CommonCfg.bHTProtect = TRUE;\n        }\n        DBGPRINT(RT_DEBUG_TRACE, (\"HT: Protection  = %s\\n\", (Value==0) ? \"Disable\" : \"Enable\"));\n    }\n\n\n    if (RTMPGetKeyParameter(\"HT_MIMOPSMode\", pValueStr, 25, pInput, TRUE))\n    {\n        Value = simple_strtol(pValueStr, 0, 10);\n        if (Value > MMPS_ENABLE)\n        {\n\t\t\tpAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;\n        }\n        else\n        {\n            /*TODO: add mimo power saving mechanism*/\n            pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;\n\t\t\t/*pAd->CommonCfg.BACapability.field.MMPSmode = Value;*/\n        }\n        DBGPRINT(RT_DEBUG_TRACE, (\"HT: MIMOPS Mode  = %d\\n\", (INT) Value));\n    }\n\n    if (RTMPGetKeyParameter(\"HT_BADecline\", pValueStr, 25, pInput, TRUE))\n    {\n        Value = simple_strtol(pValueStr, 0, 10);\n        if (Value == 0)\n        {\n            pAd->CommonCfg.bBADecline = FALSE;\n        }\n        else\n        {\n            pAd->CommonCfg.bBADecline = TRUE;\n        }\n        DBGPRINT(RT_DEBUG_TRACE, (\"HT: BA Decline  = %s\\n\", (Value==0) ? \"Disable\" : \"Enable\"));\n    }\n\n\n    if (RTMPGetKeyParameter(\"HT_AutoBA\", pValueStr, 25, pInput, TRUE))\n    {\n        Value = simple_strtol(pValueStr, 0, 10);\n        if (Value == 0)\n        {\n            pAd->CommonCfg.BACapability.field.AutoBA = FALSE;\n\t\t\tpAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;\n        }\n        else\n        {\n            pAd->CommonCfg.BACapability.field.AutoBA = TRUE;\n\t\t\tpAd->CommonCfg.BACapability.field.Policy = IMMED_BA;\n        }\n        pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;\n\t\tpAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;\n        DBGPRINT(RT_DEBUG_TRACE, (\"HT: Auto BA  = %s\\n\", (Value==0) ? \"Disable\" : \"Enable\"));\n    }\n\n\t/* Tx_+HTC frame*/\n    if (RTMPGetKeyParameter(\"HT_HTC\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == 0)\n\t\t{\n\t\t\tpAd->HTCEnable = FALSE;\n\t\t}\n\t\telse\n\t\t{\n            pAd->HTCEnable = TRUE;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Tx +HTC frame = %s\\n\", (Value==0) ? \"Disable\" : \"Enable\"));\n\t}\n\n\n\t/* Reverse Direction Mechanism*/\n    if (RTMPGetKeyParameter(\"HT_RDG\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == 0)\n\t\t{\t\t\t\n\t\t\tpAd->CommonCfg.bRdg = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->HTCEnable = TRUE;\n            pAd->CommonCfg.bRdg = TRUE;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: RDG = %s\\n\", (Value==0) ? \"Disable\" : \"Enable(+HTC)\"));\n\t}\n\n\n\n\n\t/* Tx A-MSUD ?*/\n    if (RTMPGetKeyParameter(\"HT_AMSDU\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == 0)\n\t\t{\n\t\t\tpAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;\n\t\t}\n\t\telse\n\t\t{\n            pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Tx A-MSDU = %s\\n\", (Value==0) ? \"Disable\" : \"Enable\"));\n\t}\n\n\t/* MPDU Density*/\n    if (RTMPGetKeyParameter(\"HT_MpduDensity\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value <=7 && Value >= 0)\n\t\t{\t\t\n\t\t\tpAd->CommonCfg.BACapability.field.MpduDensity = Value;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: MPDU Density = %d\\n\", (INT) Value));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.BACapability.field.MpduDensity = 4;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: MPDU Density = %d (Default)\\n\", 4));\n\t\t}\n\t}\n\n\t/* Max Rx BA Window Size*/\n    if (RTMPGetKeyParameter(\"HT_BAWinSize\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t/* Intel IOT*/\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tValue = 64;\n#endif /* CONFIG_AP_SUPPORT */\n\t\tif (Value >=1 && Value <= 64)\n\t\t{\t\t\n\t\t\tpAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;\n\t\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: BA Windw Size = %d\\n\", (INT) Value));\n\t\t}\n\t\telse\n\t\t{\n            pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;\n\t\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: BA Windw Size = 64 (Defualt)\\n\"));\n\t\t}\n\n\t}\n\n\t/* Guard Interval*/\n\tif (RTMPGetKeyParameter(\"HT_GI\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\n\t\tif (Value == GI_400)\n\t\t{\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;\n\t\t}\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Guard Interval = %s\\n\", (Value==GI_400) ? \"400\" : \"800\" ));\n\t}\n\n\t/* HT Operation Mode : Mixed Mode , Green Field*/\n\tif (RTMPGetKeyParameter(\"HT_OpMode\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\n\t\tif (Value == HTMODE_GF)\n\t\t{\n\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_GF;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_MM;\n\t\t}\t\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Operate Mode = %s\\n\", (Value==HTMODE_GF) ? \"Green Field\" : \"Mixed Mode\" ));\n\t}\n\n\t/* Fixed Tx mode : CCK, OFDM*/\n\tif (RTMPGetKeyParameter(\"FixedTxMode\", pValueStr, 25, pInput, TRUE))\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tfor (i = 0, Bufptr = rstrtok(pValueStr,\";\"); (Bufptr && i < MAX_MBSSID_NUM(pAd)); Bufptr = rstrtok(NULL,\";\"), i++) \t\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[i].DesiredTransmitSetting.field.FixedTxMode = \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tRT_CfgSetFixedTxPhyMode(Bufptr);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(IF-ra%d) Fixed Tx Mode = %d\\n\", i, \n\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].DesiredTransmitSetting.field.FixedTxMode));\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = \n\t\t\t\t\t\t\t\t\t\tRT_CfgSetFixedTxPhyMode(pValueStr);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Fixed Tx Mode = %d\\n\", \n\t\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode));\t\t\t\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n\n\t/* Channel Width */\n\tif (RTMPGetKeyParameter(\"HT_BW\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == BW_40)\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;\n\t\telse\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;\n\n#ifdef MCAST_RATE_SPECIFIC\n\t\tpAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;\n#endif /* MCAST_RATE_SPECIFIC */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Channel Width = %s\\n\", (Value==BW_40) ? \"40 MHz\" : \"20 MHz\" ));\n\t}\n\n\tif (RTMPGetKeyParameter(\"HT_EXTCHA\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\n\t\tif (Value == 0)\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA  = EXTCHA_BELOW;\n\t\telse\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Ext Channel = %s\\n\", (Value==0) ? \"BELOW\" : \"ABOVE\" ));\n\t}\n\n\t/* MSC*/\n\tif (RTMPGetKeyParameter(\"HT_MCS\", pValueStr, 50, pInput, TRUE))\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tfor (i = 0, Bufptr = rstrtok(pValueStr,\";\"); (Bufptr && i < MAX_MBSSID_NUM(pAd)); Bufptr = rstrtok(NULL,\";\"), i++) \t\n\t\t\t{\n\t\t\t\tValue = simple_strtol(Bufptr, 0, 10);\t\t\t\n\t\t\t\tif ((Value >= 0 && Value <= 23) || (Value == 32))\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].DesiredTransmitSetting.field.MCS  = Value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].DesiredTransmitSetting.field.MCS  = MCS_AUTO;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(IF-ra%d) HT: MCS = %s(%d)\\n\", i, \n\t\t\t\t\t\t(pAd->ApCfg.MBSSID[i].DesiredTransmitSetting.field.MCS == MCS_AUTO ? \"AUTO\" : \"Fixed\"),\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].DesiredTransmitSetting.field.MCS));\n\t\t\t}\t\t\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT \t\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\t\tif ((Value >= 0 && Value <= 23) || (Value == 32))\n\t\t\t{\n\t\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS  = Value;\n#ifdef P2P_SUPPORT\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].DesiredTransmitSetting.field.MCS  = Value;\n#endif /* P2P_SUPPORT */\n\t\t\t\tpAd->StaCfg.bAutoTxRateSwitch = FALSE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: MCS = %d\\n\", pAd->StaCfg.DesiredTransmitSetting.field.MCS));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS  = MCS_AUTO;\n#ifdef P2P_SUPPORT\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].DesiredTransmitSetting.field.MCS  = MCS_AUTO;\n#endif /* P2P_SUPPORT */\n\t\t\t\tpAd->StaCfg.bAutoTxRateSwitch = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: MCS = AUTO\\n\"));\n\t\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\n\t}\n\n\t/* STBC */\n    if (RTMPGetKeyParameter(\"HT_STBC\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == STBC_USE)\n\t\t{\t\t\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: STBC = %d\\n\", pAd->CommonCfg.RegTransmitSetting.field.STBC));\n\t}\n\n\t/* 40_Mhz_Intolerant*/\n\tif (RTMPGetKeyParameter(\"HT_40MHZ_INTOLERANT\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == 0)\n\t\t{\t\t\n\t\t\tpAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: 40MHZ INTOLERANT = %d\\n\", pAd->CommonCfg.bForty_Mhz_Intolerant));\n\t}\n\t/*HT_TxStream*/\n\tif(RTMPGetKeyParameter(\"HT_TxStream\", pValueStr, 10, pInput, TRUE))\n\t{\n\t\tswitch (simple_strtol(pValueStr, 0, 10))\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tpAd->CommonCfg.TxStream = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tpAd->CommonCfg.TxStream = 2;\n\t\t\t\tbreak;\n\t\t\tcase 3: /* 3*3*/\n\t\t\tdefault:\n\t\t\t\tpAd->CommonCfg.TxStream = 3;\n\n\t\t\t\tif (pAd->MACVersion < RALINK_2883_VERSION)\n\t\t\t\t\tpAd->CommonCfg.TxStream = 2; /* only 2 tx streams for RT2860 series*/\n\t\t\t\tbreak;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Tx Stream = %d\\n\", pAd->CommonCfg.TxStream));\n\t}\n\t/*HT_RxStream*/\n\tif(RTMPGetKeyParameter(\"HT_RxStream\", pValueStr, 10, pInput, TRUE))\n\t{\n\t\tswitch (simple_strtol(pValueStr, 0, 10))\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tpAd->CommonCfg.RxStream = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tpAd->CommonCfg.RxStream = 2;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\tpAd->CommonCfg.RxStream = 3;\n\n\t\t\t\tif (pAd->MACVersion < RALINK_2883_VERSION)\n\t\t\t\t\tpAd->CommonCfg.RxStream = 2; /* only 2 rx streams for RT2860 series*/\n\t\t\t\tbreak;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Rx Stream = %d\\n\", pAd->CommonCfg.RxStream));\n\t}\n#ifdef GREENAP_SUPPORT\n\t/*Green AP*/\n\tif(RTMPGetKeyParameter(\"GreenAP\", pValueStr, 10, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tif (Value == 0)\n\t\t{\t\t\n\t\t\tpAd->ApCfg.bGreenAPEnable = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->ApCfg.bGreenAPEnable = TRUE;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Green AP= %d\\n\", pAd->ApCfg.bGreenAPEnable));\n\t}\n#endif /* GREENAP_SUPPORT */\n\t/* HT_DisallowTKIP*/\n\tif (RTMPGetKeyParameter(\"HT_DisallowTKIP\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\n\t\tif (Value == 1)\n\t\t{\n\t\t\tpAd->CommonCfg.HT_DisallowTKIP = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.HT_DisallowTKIP = FALSE;\n\t\t}\t\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: Disallow TKIP mode = %s\\n\", (pAd->CommonCfg.HT_DisallowTKIP == TRUE) ? \"ON\" : \"OFF\" ));\n\t}\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\tif (RTMPGetKeyParameter(\"OBSSScanParam\", pValueStr, 32, pInput, TRUE))\n\t\t\t{\n\t\t\t\tint ObssScanValue, idx;\n\t\t\t\tPSTRING\tmacptr;\t\n\t\t\t\tfor (idx = 0, macptr = rstrtok(pValueStr,\";\"); macptr; macptr = rstrtok(NULL,\";\"), idx++)\n\t\t\t\t{\n\t\t\t\t\tObssScanValue = simple_strtol(macptr, 0, 10);\n\t\t\t\t\tswitch (idx)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (ObssScanValue < 5 || ObssScanValue > 1000)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanPassiveDwell(%d), should in range 5~1000\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = ObssScanValue;\t/* Unit : TU. 5~1000*/\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanPassiveDwell=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tif (ObssScanValue < 10 || ObssScanValue > 1000)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanActiveDwell(%d), should in range 10~1000\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = ObssScanValue;\t/* Unit : TU. 10~1000*/\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanActiveDwell=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = ObssScanValue;\t/* Unit : Second*/\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthTriggerScanInt=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tif (ObssScanValue < 200 || ObssScanValue > 10000)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel(%d), should in range 200~10000\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = ObssScanValue;\t/* Unit : TU. 200~10000*/\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tif (ObssScanValue < 20 || ObssScanValue > 10000)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanActiveTotalPerChannel(%d), should in range 20~10000\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = ObssScanValue;\t/* Unit : TU. 20~10000*/\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanActiveTotalPerChannel=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = ObssScanValue;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = ObssScanValue;\t/* Unit : percentage*/\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\\n\", ObssScanValue));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\t\t\n\t\t\t\t}\n\n\t\t\t\tif (idx != 7)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Wrong OBSSScanParamtetrs format in dat file!!!!! Use default value.\\n\"));\n\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell;\t/* Unit : TU. 5~1000*/\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell;\t/* Unit : TU. 10~1000*/\n\t\t\t\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval;\t/* Unit : Second\t*/\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel;\t/* Unit : TU. 200~10000*/\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel;\t/* Unit : TU. 20~10000*/\n\t\t\t\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold;\t/* Unit : percentage*/\n\t\t\t\t}\n\t\t\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelay=%ld\\n\", pAd->CommonCfg.Dot11BssWidthChanTranDelay));\n\t\t\t}\n\n\t\t\tif (RTMPGetKeyParameter(\"HT_BSSCoexistence\", pValueStr, 25, pInput, TRUE))\n\t\t\t{\n\t\t\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\t\t\tpAd->CommonCfg.bBssCoexEnable = ((Value == 1) ? TRUE : FALSE);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: 20/40 BssCoexSupport = %s\\n\", (pAd->CommonCfg.bBssCoexEnable == TRUE) ? \"ON\" : \"OFF\" ));\n\t\t\t}\n\n\t\t\t\n\t\t\tif (RTMPGetKeyParameter(\"HT_BSSCoexApCntThr\", pValueStr, 25, pInput, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.BssCoexApCntThr = simple_strtol(pValueStr, 0, 10);;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: 20/40 BssCoexApCntThr = %d\\n\", pAd->CommonCfg.BssCoexApCntThr));\n\t\t\t}\n\t\t\t\t\n#endif /* DOT11N_DRAFT3 */\n\n\tif (RTMPGetKeyParameter(\"BurstMode\", pValueStr, 25, pInput, TRUE))\n\t{\n\t\tValue = simple_strtol(pValueStr, 0, 10);\n\t\tpAd->CommonCfg.bRalinkBurstMode = ((Value == 1) ? 1 : 0);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT: RaBurstMode= %d\\n\", pAd->CommonCfg.bRalinkBurstMode));\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nvoid RTMPSetSTASSID(RTMP_ADAPTER *pAd, PSTRING SSID)\n{\n\tpAd->CommonCfg.SsidLen = (UCHAR) strlen(SSID);\n\tNdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);\n\tNdisMoveMemory(pAd->CommonCfg.Ssid, SSID, pAd->CommonCfg.SsidLen);\n\tpAd->CommonCfg.LastSsidLen= pAd->CommonCfg.SsidLen;\n\tNdisZeroMemory(pAd->CommonCfg.LastSsid, NDIS_802_11_LENGTH_SSID);\n\tNdisMoveMemory(pAd->CommonCfg.LastSsid, SSID, pAd->CommonCfg.LastSsidLen);\n\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;\n\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);\n\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, SSID, pAd->MlmeAux.AutoReconnectSsidLen);\n\tpAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;\n\tNdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);\n\tNdisMoveMemory(pAd->MlmeAux.Ssid, SSID, pAd->MlmeAux.SsidLen);\n}\n\n\nvoid RTMPSetSTAPassPhrase(RTMP_ADAPTER *pAd, PSTRING PassPh)\n{\n\tint     ret = TRUE;\n\n\tPassPh[strlen(PassPh)] = '\\0'; /* make STA can process .$^& for WPAPSK input */\n\n\tif ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&\n\t\t(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&\n\t\t(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) \n#ifdef WAPI_SUPPORT\n\t\t&& (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWAICERT)\n\t\t&& (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t\t)\n\t{\n\t\tret = FALSE;\n\t}\n\telse\n\t{\n\t\tret = RT_CfgSetWPAPSKKey(pAd, PassPh, strlen(PassPh), (PUCHAR)pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->StaCfg.PMK);\n\t}\n\t\t\t\t\n\tif (ret == TRUE)\n\t{\n\t\tRTMPZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);\n\t\tRTMPMoveMemory(pAd->StaCfg.WpaPassPhrase, PassPh, strlen(PassPh));\n\t\tpAd->StaCfg.WpaPassPhraseLen= strlen(PassPh);\n\t\t\t\t\t\n\t    if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t{\n\t\t\t/* Start STA supplicant state machine*/\n\t\t\tpAd->StaCfg.WpaState = SS_START;\n\t\t}\n\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n\t\t{\n\t\t\tpAd->StaCfg.WpaState = SS_NOTUSE;\n\t\t}\n#ifdef WSC_STA_SUPPORT\n\t\tNdisZeroMemory(pAd->StaCfg.WscControl.WpaPsk, 64);\n\t\tpAd->StaCfg.WscControl.WpaPskLen = 0;\n\t\tif ((strlen(PassPh) >= 8) && (strlen(PassPh) <= 64))\n\t\t{\n\t\t\tNdisMoveMemory(pAd->StaCfg.WscControl.WpaPsk, PassPh, strlen(PassPh));\n\t\t\tpAd->StaCfg.WscControl.WpaPskLen = strlen(PassPh);\n\t\t}\n#endif /* WSC_STA_SUPPORT */ \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(WPAPSK=%s)\\n\", __FUNCTION__, PassPh));\n\t}\n}\n\n\ninline void RTMPSetSTACipherSuites(RTMP_ADAPTER *pAd, NDIS_802_11_ENCRYPTION_STATUS WepStatus)\n{\n\t/* Update all wepstatus related*/\n\tpAd->StaCfg.PairCipher\t\t= WepStatus;\n\tpAd->StaCfg.GroupCipher \t= WepStatus;\n\tpAd->StaCfg.bMixCipher \t\t= FALSE;\n}\n\n#ifdef  CREDENTIAL_STORE\n\n/*RECOVER THE OLD CONNECT INFO */\nNDIS_STATUS RecoverConnectInfo(\n\tIN  RTMP_ADAPTER *pAd)\n{\n\tINT idx;\n\tchar ssidStr[NDIS_802_11_LENGTH_SSID + 1];\n\n\tNdisZeroMemory(&ssidStr[0], sizeof(ssidStr));\n\t\n\tRTMP_SEM_LOCK(&pAd->StaCtIf.Lock);\n\tif ((pAd->StaCtIf.Changeable== FALSE) || (pAd->StaCtIf.SsidLen > NDIS_802_11_LENGTH_SSID))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" DRIVER INIT  not need to RecoverConnectInfo() \\n\"));\n\t\tRTMP_SEM_UNLOCK(&pAd->StaCtIf.Lock);\n\t\treturn 0;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-->RecoverConnectInfo()\\n\"));\n\n\tNdisMoveMemory(ssidStr, pAd->StaCtIf.Ssid, pAd->StaCtIf.SsidLen);\n\tRTMPSetSTASSID(pAd, &ssidStr[0]);\n\n\tpAd->StaCfg.AuthMode = pAd->StaCtIf.AuthMode;\n\tpAd->StaCfg.WepStatus = pAd->StaCtIf.WepStatus;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tpAd->StaCfg.IEEE8021X = pAd->StaCtIf.IEEE8021X;\n\tpAd->StaCfg.DesireSharedKeyId = pAd->StaCtIf.DefaultKeyId; \n#endif // WPA_SUPPLICANT_SUPPORT //\n\tpAd->StaCfg.DefaultKeyId = pAd->StaCtIf.DefaultKeyId; \n\tNdisMoveMemory( pAd->StaCfg.PMK, pAd->StaCtIf.PMK, 32);\n\tRTMPMoveMemory(pAd->StaCfg.WpaPassPhrase, pAd->StaCtIf.WpaPassPhrase, pAd->StaCfg.WpaPassPhraseLen);\n\tpAd->StaCfg.WpaPassPhraseLen = pAd->StaCtIf.WpaPassPhraseLen;\n\tfor (idx = 0; idx < 4; idx++)\n\t{\n\t\tNdisMoveMemory(&pAd->SharedKey[BSS0][idx], &pAd->StaCtIf.SharedKey[BSS0][idx], sizeof(CIPHER_KEY));\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tNdisMoveMemory(&pAd->StaCfg.DesireSharedKey[idx], &pAd->StaCtIf.SharedKey[BSS0][idx], sizeof(CIPHER_KEY));\n#endif // WPA_SUPPLICANT_SUPPORT //\n\n\t}\n\n\t if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t{\n\t\t\t// Start STA supplicant state machine\n\t\t\tpAd->StaCfg.WpaState = SS_START;\n\t}\n\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n\t{\n\t\t\tpAd->StaCfg.WpaState = SS_NOTUSE;\n\t}\n\tRTMP_SEM_UNLOCK(&pAd->StaCtIf.Lock);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--RecoverConnectInfo()\\n\"));\n\n\treturn 0;\n}\n\n\n/*STORE THE CONNECT INFO*/\nNDIS_STATUS StoreConnectInfo(\n\tIN  RTMP_ADAPTER *pAd)\n{\n\tINT idx;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-->StoreConnectInfo()\\n\"));\n\n\tRTMP_SEM_LOCK(&pAd->StaCtIf.Lock);\n\tpAd->StaCtIf.Changeable = TRUE;\n \tpAd->StaCtIf.SsidLen = pAd->CommonCfg.SsidLen;\n\tNdisMoveMemory(pAd->StaCtIf.Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\tpAd->StaCtIf.AuthMode = pAd->StaCfg.AuthMode;\n\tpAd->StaCtIf.WepStatus = pAd->StaCfg.WepStatus;\n\n\tpAd->StaCtIf.DefaultKeyId = pAd->StaCfg.DefaultKeyId; \n#ifdef WPA_SUPPLICANT_SUPPORT\n\tpAd->StaCtIf.DefaultKeyId = pAd->StaCfg.DesireSharedKeyId; \n\tpAd->StaCtIf.IEEE8021X = pAd->StaCfg.IEEE8021X;\n#endif // WPA_SUPPLICANT_SUPPORT //\n\tNdisMoveMemory(pAd->StaCtIf.PMK, pAd->StaCfg.PMK, 32);\n\tRTMPMoveMemory(pAd->StaCtIf.WpaPassPhrase, pAd->StaCfg.WpaPassPhrase, pAd->StaCfg.WpaPassPhraseLen);\n\tpAd->StaCtIf.WpaPassPhraseLen = pAd->StaCfg.WpaPassPhraseLen;\n\n\tfor (idx = 0; idx < 4; idx++)\n\t{\n\t\tNdisMoveMemory(&pAd->StaCtIf.SharedKey[BSS0][idx], &pAd->SharedKey[BSS0][idx], sizeof(CIPHER_KEY));\n\t}\n\n\tRTMP_SEM_UNLOCK(&pAd->StaCtIf.Lock);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--StoreConnectInfo()\\n\"));\n\n\treturn 0;\n}\n\n#endif /* CREDENTIAL_STORE */\n\n#endif /* CONFIG_STA_SUPPORT */ \n\n\nvoid RTMPSetCountryCode(RTMP_ADAPTER *pAd, PSTRING CountryCode)\n{\n\tNdisMoveMemory(pAd->CommonCfg.CountryCode, CountryCode , 2);\n\tpAd->CommonCfg.CountryCode[2] = ' ';\n#ifdef CONFIG_STA_SUPPORT\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tNdisMoveMemory(pAd->StaCfg.StaOriCountryCode, CountryCode , 2);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\n\tif (strlen((PSTRING) pAd->CommonCfg.CountryCode) != 0)\n\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"CountryCode=%s\\n\", pAd->CommonCfg.CountryCode));\n}\n\n\nNDIS_STATUS\tRTMPSetProfileParameters(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING\tpBuffer)\n{\n\tPSTRING\t\t\t\t\ttmpbuf;\n\tULONG\t\t\t\t\tRtsThresh;\n\tULONG\t\t\t\t\tFragThresh;\n\tPSTRING\t\t\t\t\tmacptr;\t\t\t\t\t\t\t\n\tINT\t\t\t\t\t\ti = 0, retval;\n\n/*\ttmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&tmpbuf, MAX_PARAM_BUFFER_SIZE);\n\tif(tmpbuf == NULL)\n\t\treturn NDIS_STATUS_FAILURE;\n\t\n\tdo\n\t{\n\t\t/* set file parameter to portcfg*/\n\t\tif (RTMPGetKeyParameter(\"MacAddress\", tmpbuf, 25, pBuffer, TRUE))\n\t\t{\t\t\t\t\t\n\t\t\tretval = RT_CfgSetMacAddress(pAd, tmpbuf);\n\t\t\tif (retval)\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacAddress = %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\t\t\t\t\t\t\tPRINT_MAC(pAd->CurrentAddress)));\n\t\t}\n\t\t/*CountryRegion*/\n\t\tif(RTMPGetKeyParameter(\"CountryRegion\", tmpbuf, 25, pBuffer, TRUE))\n\t\t{\n\t\t\tretval = RT_CfgSetCountryRegion(pAd, tmpbuf, BAND_24G);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CountryRegion=%d\\n\", pAd->CommonCfg.CountryRegion));\n\t\t}\n\t\t/*CountryRegionABand*/\n\t\tif(RTMPGetKeyParameter(\"CountryRegionABand\", tmpbuf, 25, pBuffer, TRUE))\n\t\t{\n\t\t\tretval = RT_CfgSetCountryRegion(pAd, tmpbuf, BAND_5G);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CountryRegionABand=%d\\n\", pAd->CommonCfg.CountryRegionForABand));\n\t\t}\n#ifdef RTMP_EFUSE_SUPPORT\n\t\t/*EfuseBufferMode*/\n\t\tif(RTMPGetKeyParameter(\"EfuseBufferMode\", tmpbuf, 25, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->bEEPROMFile = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EfuseBufferMode=%d\\n\", pAd->bUseEfuse));\n\t\t}\n#endif /* RTMP_EFUSE_SUPPORT */\n\t\t/*CountryCode*/\n\n\t\tif (pAd->CommonCfg.bCountryFlag == 0)\n\t\t{\n\t\tif(RTMPGetKeyParameter(\"CountryCode\", tmpbuf, 25, pBuffer, TRUE))\n\t\t\tRTMPSetCountryCode(pAd, tmpbuf);\n\t\t}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t/*ChannelGeography*/\n\t\tif(RTMPGetKeyParameter(\"ChannelGeography\", tmpbuf, 25, pBuffer, TRUE))\n\t\t{\n\t\t\tUCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t\t\tif (Geography <= BOTH)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.Geography = Geography;\n\t\t\t\tpAd->CommonCfg.CountryCode[2] =\n\t\t\t\t\t(pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');\n#ifdef CONFIG_STA_SUPPORT\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\tpAd->StaCfg.StaOriGeography = pAd->CommonCfg.Geography;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ChannelGeography=%d\\n\", pAd->CommonCfg.Geography));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.Geography = BOTH;\n\t\t\tpAd->CommonCfg.CountryCode[2] = ' ';\n\t\t}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef MBSS_SUPPORT\n\t\t\t/*BSSIDNum; This must read first of other multiSSID field, so list this field first in configuration file*/\n\t\t\tif(RTMPGetKeyParameter(\"BssidNum\", tmpbuf, 25, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->ApCfg.BssidNum = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tif(pAd->ApCfg.BssidNum > MAX_MBSSID_NUM(pAd))\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.BssidNum = MAX_MBSSID_NUM(pAd);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BssidNum=%d(MAX_MBSSID_NUM is %d)\\n\", pAd->ApCfg.BssidNum,MAX_MBSSID_NUM(pAd)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BssidNum=%d\\n\", pAd->ApCfg.BssidNum));\n\t\t\t}\n\n\t\t\tif (HW_BEACON_OFFSET > (HW_BEACON_MAX_SIZE(pAd) / pAd->ApCfg.BssidNum))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"mbss> fatal error! beacon offset is error in driver! \"\n\t\t\t\t\t\t\"Please re-assign HW_BEACON_OFFSET!\\n\"));\n\t\t\t}\n#else\n\t\t\tpAd->ApCfg.BssidNum = 1;\n#endif /* MBSS_SUPPORT */\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* SSID*/\n\t\t\tif (TRUE)\n\t\t\t{\n\t\t\t\tSTRING tok_str[16];\n\t\t\t\tUCHAR BssidCountSupposed = 0;\n\t\t\t\tBOOLEAN bSSIDxIsUsed = FALSE;\n\n\t\t\t\t//PRINT(RT_DEBUG_TRACE, (\"pAd->ApCfg.BssidNum=%d\\n\", pAd->ApCfg.BssidNum));\n\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t{\n\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"SSID%d\", i + 1);\n\t\t\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 33, pBuffer, FALSE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[i].Ssid, tmpbuf , strlen(tmpbuf));\n\t\t\t\t\t    \tpAd->ApCfg.MBSSID[i].Ssid[strlen(tmpbuf)] = '\\0';\n\t\t\t\t\t\t\t\t    \tpAd->ApCfg.MBSSID[i].SsidLen = strlen((PSTRING) pAd->ApCfg.MBSSID[i].Ssid);\n\t\t\t\t\t\t\tif (bSSIDxIsUsed == FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbSSIDxIsUsed = TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t    \tDBGPRINT(RT_DEBUG_TRACE, (\"SSID[%d]=%s\\n\", i, pAd->ApCfg.MBSSID[i].Ssid));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tif (bSSIDxIsUsed == FALSE)\n\t\t\t\t{\n\t\t\t\t\tif(RTMPGetKeyParameter(\"SSID\", tmpbuf, 256, pBuffer, FALSE))\n\t\t\t\t\t{\t\t\t\n\t\t\t\t\t\tBssidCountSupposed = delimitcnt(tmpbuf, \";\") + 1;\n\t\t\t\t\t\tif (pAd->ApCfg.BssidNum != BssidCountSupposed)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT_ERR((\"Your no. of SSIDs( = %d) does not match your BssidNum( = %d)!\\n\", BssidCountSupposed, pAd->ApCfg.BssidNum));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pAd->ApCfg.BssidNum > 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Anyway, we still do the legacy dissection of the whole SSID string.*/\n\t\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint apidx = 0;\n\n\t\t\t\t\t\t\t\tif (i < pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tapidx = i;\n\t\t\t\t\t\t\t\t} \n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].Ssid, macptr , strlen(macptr));\n\t\t\t\t    \t\t\tpAd->ApCfg.MBSSID[apidx].Ssid[strlen(macptr)] = '\\0';\n\t\t\t\t\t\t\t   pAd->ApCfg.MBSSID[apidx].SsidLen = strlen((PSTRING) pAd->ApCfg.MBSSID[apidx].Ssid);\n\n\t\t\t\t    \t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SSID[%d]=%s\\n\", i, pAd->ApCfg.MBSSID[apidx].Ssid));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((strlen(tmpbuf) > 0) && (strlen(tmpbuf) <= 32))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[BSS0].Ssid, tmpbuf , strlen(tmpbuf));\n\t\t\t\t\t\t    \tpAd->ApCfg.MBSSID[BSS0].Ssid[strlen(tmpbuf)] = '\\0';\n\t\t\t\t\t\t\t\t\t    \tpAd->ApCfg.MBSSID[BSS0].SsidLen = strlen((PSTRING) pAd->ApCfg.MBSSID[BSS0].Ssid);\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SSID=%s\\n\", pAd->ApCfg.MBSSID[BSS0].Ssid));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\t/*SSID*/\n\t\t\tif (RTMPGetKeyParameter(\"SSID\", tmpbuf, 256, pBuffer, FALSE))\n\t\t\t{\n\t\t\t\tif (strlen(tmpbuf) <= 32)\n\t\t\t\t{\n\t\t\t\t\tRTMPSetSTASSID(pAd, tmpbuf);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(SSID=%s)\\n\", __FUNCTION__, tmpbuf));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\t/*NetworkType*/\n\t\t\tif (RTMPGetKeyParameter(\"NetworkType\", tmpbuf, 25, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->bConfigChanged = TRUE;\n\t\t\t\tif (strcmp(tmpbuf, \"Adhoc\") == 0)\n\t\t\t\t\tpAd->StaCfg.BssType = BSS_ADHOC;\n\t\t\t\telse /*Default Infrastructure mode*/\n\t\t\t\t\tpAd->StaCfg.BssType = BSS_INFRA;\n\t\t\t\t/* Reset Ralink supplicant to not use, it will be set to start when UI set PMK key*/\n\t\t\t\tpAd->StaCfg.WpaState = SS_NOTUSE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(NetworkType=%d)\\n\", __FUNCTION__, pAd->StaCfg.BssType));\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\n\t\t/*Channel*/\n\t\tif(RTMPGetKeyParameter(\"Channel\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel=%d\\n\", pAd->CommonCfg.Channel));\n\t\t}\n\n\t\t/*WirelessMode*/\n\t\t/*Note: BssidNum must be put before WirelessMode in dat file*/\n\t\tif(RTMPGetKeyParameter(\"WirelessMode\", tmpbuf, 32, pBuffer, TRUE))\n\t\t{\n\t\t\tUCHAR cfg_mode;\n\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t{\n\t\t\t\tcfg_mode = simple_strtol(macptr, 0, 10);\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\n\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\tbreak;\n\n\t\t\t\tpAd->ApCfg.MBSSID[i].PhyMode = cfgmode_2_wmode(cfg_mode);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BSS%d PhyMode=%d\\n\", i, pAd->ApCfg.MBSSID[i].PhyMode));\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\t\tif (i == 0)\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\n\t\t\t\t\t/* for first time, update all phy mode is same as ra0 */\n\t\t\t\t\t{\n\t\t\t\t\t\tUINT32 IdBss;\n\t\t\t\t\t\tfor(IdBss=1; IdBss<pAd->ApCfg.BssidNum; IdBss++)\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[IdBss].PhyMode = pAd->ApCfg.MBSSID[0].PhyMode;\n\t\t\t\t\t}\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t\t/* set mode for 1st time */\n\t\t\t\t\tRT_CfgSetWirelessMode(pAd, macptr);\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\n\t\t\t\telse\n\t\t\t\t\tRT_CfgSetMbssWirelessMode(pAd, macptr);\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PhyMode=%d\\n\", pAd->CommonCfg.PhyMode));\n\t\t}\n\n\t    /*BasicRate*/\n\t\tif(RTMPGetKeyParameter(\"BasicRate\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);\n\t\t\tpAd->CommonCfg.BasicRateBitmapOld = (ULONG) simple_strtol(tmpbuf, 0, 10);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BasicRate=%ld\\n\", pAd->CommonCfg.BasicRateBitmap));\n\t\t}\n\t\t/*BeaconPeriod*/\n\t\tif(RTMPGetKeyParameter(\"BeaconPeriod\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tUSHORT bcn_val = (USHORT) simple_strtol(tmpbuf, 0, 10);\n\n\t\t\t/* The acceptable is 20~1000 ms. Refer to WiFi test plan. */\n\t\t\tif (bcn_val >= 20 && bcn_val <= 1000)\t\n\t\t\t\tpAd->CommonCfg.BeaconPeriod = bcn_val;\n\t\t\telse\n\t\t\t\tpAd->CommonCfg.BeaconPeriod = 100;\t/* Default value*/\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BeaconPeriod=%d\\n\", pAd->CommonCfg.BeaconPeriod));\n\t\t}\n\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DFS_SUPPORT\n\t/*DFSIndoor*/\n\t{\n\t\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\t\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;\n\t\t\n\t\tif (RTMPGetKeyParameter(\"DfsIndoor\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->Dot11_H.bDFSIndoor = (USHORT) (simple_strtol(tmpbuf, 0, 10) != 0);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DfsIndoor=%d\\n\", pAd->Dot11_H.bDFSIndoor));\n\t\t}\n\t\t{\n\t\t\tINT k=0;\n\t\t/*SymRoundFromCfg*/\n\t            if (RTMPGetKeyParameter(\"SymRoundFromCfg\", tmpbuf, 10, pBuffer, TRUE))\n\t            {\n\t\t                pRadarDetect->SymRoundFromCfg = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t                pRadarDetect->SymRoundCfgValid = 1;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"SymRoundFromCfg=%d\\n\", pRadarDetect->SymRoundFromCfg));\n\t            }\n\n\t            /*BusyIdleFromCfg*/\n\t            if (RTMPGetKeyParameter(\"BusyIdleFromCfg\", tmpbuf, 10, pBuffer, TRUE))\n\t            {\n\t                pRadarDetect->BusyIdleFromCfg = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t                pRadarDetect->BusyIdleCfgValid = 1;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"BusyIdleFromCfg=%d\\n\", pRadarDetect->BusyIdleFromCfg));\n\t            }\n\t            /*DfsRssiHighFromCfg*/\n\t            if (RTMPGetKeyParameter(\"DfsRssiHighFromCfg\", tmpbuf, 10, pBuffer, TRUE))\n\t            {\n\t                pRadarDetect->DfsRssiHighFromCfg = simple_strtol(tmpbuf, 0, 10);\n\t                pRadarDetect->DfsRssiHighCfgValid = 1;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"DfsRssiHighFromCfg=%d\\n\", pRadarDetect->DfsRssiHighFromCfg));\n\t            }\n\n\t            /*DfsRssiLowFromCfg*/\n\t            if (RTMPGetKeyParameter(\"DfsRssiLowFromCfg\", tmpbuf, 10, pBuffer, TRUE))\n\t            {\n\t                pRadarDetect->DfsRssiLowFromCfg = simple_strtol(tmpbuf, 0, 10);\n\t                pRadarDetect->DfsRssiLowCfgValid = 1;\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"DfsRssiLowFromCfg=%d\\n\", pRadarDetect->DfsRssiLowFromCfg));\n\t            }\n\n\t\t/*DFSParamFromConfig*/\n\t\t if (RTMPGetKeyParameter(\"DFSParamFromConfig\", tmpbuf, 10, pBuffer, TRUE))\n\t\t {\n\t\t\t\tpRadarDetect->DFSParamFromConfig = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DFSParamFromConfig=%d\\n\", pRadarDetect->DFSParamFromConfig));\n\t\t }\n\t\t\n\t\t/* DFSParam*/\n\t\t\tfor(k = 0; k < 4*pAd->chipCap.DfsEngineNum; k++) \n\t\t{\n\t\t\tSTRING\ttok_str[32];\n\t\t\tINT index ; \n\t\t\t\tUINT8 DfsEngineNum = pAd->chipCap.DfsEngineNum;\n\t\t\t\tindex = (k%DfsEngineNum);\n\t\t\t\tif (((k-k%DfsEngineNum)/DfsEngineNum) == 0)\n\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"FCCParamCh%d\", index);\n\t\t\t\telse if (((k-k%DfsEngineNum)/DfsEngineNum) == 1)\n\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"CEParamCh%d\", index);\n\t\t\t\telse if (((k-k%DfsEngineNum)/DfsEngineNum) == 2)\n\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"JAPParamCh%d\", index);\n\t\t\t\telse if (((k-k%DfsEngineNum)/DfsEngineNum) == 3)\n\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"JAPW53ParamCh%d\", index);\n\n\t\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tULONG DfsParam;\n\t\t    \t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t    \t\t{\n\t\t    \t\t\tDfsParam = simple_strtol(macptr, 0, 10);\n\t\t    \t\t\tswitch (i)\n\t\t    \t\t\t{\n\t\t    \t\t\t\tcase 0:\n\t\t    \t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].mode = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 1:\n\t\t    \t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].avgLen = DfsParam;\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].valid = 1;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t \t\tcase 2:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].ELow = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].EHigh = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].WLow = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 5:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].WHigh = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 6:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].EpsilonW = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 7:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].TLow = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 8:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].THigh = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t\tcase 9:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].EpsilonT = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].BLow = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\t\t\tpDfsProgramParam->NewDFSTableEntry[k].BHigh = DfsParam;\n\t\t    \t\t\t\t\tbreak;\n\n\t\t    \t\t\t\tdefault:\n\t\t    \t\t\t\t\tbreak;\n\t\t    \t\t\t}\n\t\t    \t\t}\n\t\t\t}\n\t\t}\n\t\t}\n\t}\t\n#endif /* DFS_SUPPORT */\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/*DtimPeriod*/\n\t\t\tif(RTMPGetKeyParameter(\"DtimPeriod\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->ApCfg.DtimPeriod = (UCHAR) simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DtimPeriod=%d\\n\", pAd->ApCfg.DtimPeriod));\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\t\t\t\t\t\n\t    /*TxPower*/\n\t\tif(RTMPGetKeyParameter(\"TxPower\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tpAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TxPower=%ld\\n\", pAd->CommonCfg.TxPowerPercentage));\n\t\t}\n\t\t/*BGProtection*/\n\t\tif(RTMPGetKeyParameter(\"BGProtection\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t/*#if 0\t#ifndef WIFI_TEST*/\n\t/*\t\tpAd->CommonCfg.UseBGProtection = 2; disable b/g protection for throughput test*/\n\t/*#else*/\n\t\t\tswitch (simple_strtol(tmpbuf, 0, 10))\n\t\t\t{\n\t\t\t\tcase 1: /*Always On*/\n\t\t\t\t\tpAd->CommonCfg.UseBGProtection = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2: /*Always OFF*/\n\t\t\t\t\tpAd->CommonCfg.UseBGProtection = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0: /*AUTO*/\n\t\t\t\tdefault:\n\t\t\t\t\tpAd->CommonCfg.UseBGProtection = 0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t/*#endif*/\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BGProtection=%ld\\n\", pAd->CommonCfg.UseBGProtection));\n\t\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t/*OLBCDetection*/\n\t\tif(RTMPGetKeyParameter(\"DisableOLBC\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tswitch (simple_strtol(tmpbuf, 0, 10))\n\t\t\t{\n\t\t\t\tcase 1: /*disable OLBC Detection*/\n\t\t\t\t\tpAd->CommonCfg.DisableOLBCDetect = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0: /*enable OLBC Detection*/\n\t\t\t\t\tpAd->CommonCfg.DisableOLBCDetect = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpAd->CommonCfg.DisableOLBCDetect= 0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OLBCDetection=%ld\\n\", pAd->CommonCfg.DisableOLBCDetect));\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\t\t\n\t\t/*TxPreamble*/\n\t\tif(RTMPGetKeyParameter(\"TxPreamble\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tswitch (simple_strtol(tmpbuf, 0, 10))\n\t\t\t{\n\t\t\t\tcase Rt802_11PreambleShort:\n\t\t\t\t\tpAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;\n\t\t\t\t\tbreak;\n\t\t\t\tcase Rt802_11PreambleLong:\n\t\t\t\tdefault:\n\t\t\t\t\tpAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TxPreamble=%ld\\n\", pAd->CommonCfg.TxPreamble));\n\t\t}\n\t\t/*RTSThreshold*/\n\t\tif(RTMPGetKeyParameter(\"RTSThreshold\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tRtsThresh = simple_strtol(tmpbuf, 0, 10);\n\t\t\tif( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )\n\t\t\t\tpAd->CommonCfg.RtsThreshold  = (USHORT)RtsThresh;\n\t\t\telse\n\t\t\t\tpAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSThreshold=%d\\n\", pAd->CommonCfg.RtsThreshold));\n\t\t}\n\t\t/*FragThreshold*/\n\t\tif(RTMPGetKeyParameter(\"FragThreshold\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\t\t\n\t\t\tFragThresh = simple_strtol(tmpbuf, 0, 10);\n\t\t\tpAd->CommonCfg.bUseZeroToDisableFragment = FALSE;\n\n\t\t\tif (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)\n\t\t\t{ /*illegal FragThresh so we set it to default*/\n\t\t\t\tpAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;\n\t\t\t\tpAd->CommonCfg.bUseZeroToDisableFragment = TRUE;\n\t\t\t}\n\t\t\telse if (FragThresh % 2 == 1)\n\t\t\t{\n\t\t\t\t/* The length of each fragment shall always be an even number of octets, except for the last fragment*/\n\t\t\t\t/* of an MSDU or MMPDU, which may be either an even or an odd number of octets.*/\n\t\t\t\tpAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;\n\t\t\t}\n\t\t\t/*pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;*/\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"FragThreshold=%d\\n\", pAd->CommonCfg.FragmentThreshold));\n\t\t}\n\t\t/*TxBurst*/\n\t\tif(RTMPGetKeyParameter(\"TxBurst\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t/*#ifdef WIFI_TEST*/\n\t/*\t\t\t\t\t\tpAd->CommonCfg.bEnableTxBurst = FALSE;*/\n\t/*#else*/\n\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t\t\tpAd->CommonCfg.bEnableTxBurst = TRUE;\n\t\t\telse /*Disable*/\n\t\t\t\tpAd->CommonCfg.bEnableTxBurst = FALSE;\n\t/*#endif*/\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TxBurst=%d\\n\", pAd->CommonCfg.bEnableTxBurst));\n\t\t}\n\n#ifdef AGGREGATION_SUPPORT\n\t\t/*PktAggregate*/\n\t\tif(RTMPGetKeyParameter(\"PktAggregate\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t\t\tpAd->CommonCfg.bAggregationCapable = TRUE;\n\t\t\telse /*Disable*/\n\t\t\t\tpAd->CommonCfg.bAggregationCapable = FALSE;\n#ifdef PIGGYBACK_SUPPORT\n\t\t\tpAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;\n#endif /* PIGGYBACK_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PktAggregate=%d\\n\", pAd->CommonCfg.bAggregationCapable));\n\t\t}\n#else\n\t\tpAd->CommonCfg.bAggregationCapable = FALSE;\n\t\tpAd->CommonCfg.bPiggyBackCapable = FALSE;\n#endif /* AGGREGATION_SUPPORT */\n\n\t\t/* WmmCapable*/\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\trtmp_read_ap_wmm_parms_from_file(pAd, tmpbuf, pBuffer);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\trtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, pBuffer);\n#ifdef XLINK_SUPPORT\n\t\t\trtmp_get_psp_xlink_mode_from_file(pAd, tmpbuf, pBuffer);\n#endif /* XLINK_SUPPORT */\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#if defined(P2P_SUPPORT) || defined(CONFIG_AP_SUPPORT)\n\t\t/* IdleTimeout & StationKeepAlive shall be supported in P2P mode,\n\t\t   so moved out from CONFIG_AP_SUPPORT block\n\t\t*/\n\t\t/* IdleTimeout*/\n\t\tif(RTMPGetKeyParameter(\"IdleTimeout\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tApCfg_Set_IdleTimeout_Proc(pAd, tmpbuf);\n\t\t}\n\n\t\t/*StationKeepAlive*/\n\t\tif(RTMPGetKeyParameter(\"StationKeepAlive\", tmpbuf, 32, pBuffer, TRUE))\n\t\t{\n\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t{\n\t\t\t\tint apidx = i;\n\n\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\tbreak;\n\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].StationKeepAliveTime = simple_strtol(macptr, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) StationKeepAliveTime=%d\\n\", i, pAd->ApCfg.MBSSID[apidx].StationKeepAliveTime));\n\t\t\t}\n\t\t}\n#endif /* defined(P2P_SUPPORT) || defined(CONFIG_AP_SUPPORT) */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* MaxStaNum*/\n\t\t\tif (RTMPGetKeyParameter(\"MaxStaNum\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t    {\n\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tApCfg_Set_MaxStaNum_Proc(pAd, i, macptr);\t\t\t\t\t\n\t\t\t    }\n\t\t\t}\n\t\t\n\t\t\t/*NoForwarding*/\n\t\t\tif(RTMPGetKeyParameter(\"NoForwarding\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t    {\n\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif(simple_strtol(macptr, 0, 10) != 0)  /*Enable*/\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].IsolateInterStaTraffic = TRUE;\n\t\t\t\t\telse /*Disable*/\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].IsolateInterStaTraffic = FALSE;\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) NoForwarding=%ld\\n\", i, pAd->ApCfg.MBSSID[i].IsolateInterStaTraffic));\n\t\t\t    }\n\t\t\t}\n\t\t\t/*NoForwardingBTNBSSID*/\n\t\t\tif(RTMPGetKeyParameter(\"NoForwardingBTNBSSID\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t\t\t\tpAd->ApCfg.IsolateInterStaTrafficBTNBSSID = TRUE;\n\t\t\t\telse /*Disable*/\n\t\t\t\t\tpAd->ApCfg.IsolateInterStaTrafficBTNBSSID = FALSE;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NoForwardingBTNBSSID=%ld\\n\", pAd->ApCfg.IsolateInterStaTrafficBTNBSSID));\n\t\t\t}\n\t\t\t/*HideSSID*/\n\t\t\tif(RTMPGetKeyParameter(\"HideSSID\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t    {\n\t\t\t\t\tint apidx = i;\n\n\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif(simple_strtol(macptr, 0, 10) != 0)  /*Enable*/\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].bHideSsid = TRUE;\t\t\t\t\t\t\t\t\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bWpsEnable = FALSE;\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t}\n\t\t\t\t\telse /*Disable*/\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].bHideSsid = FALSE;\t\t\t\t\t\t\t\t\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) HideSSID=%d\\n\", i, pAd->ApCfg.MBSSID[apidx].bHideSsid));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/*AutoChannelSelect*/\n\t\t\tif(RTMPGetKeyParameter(\"AutoChannelSelect\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t\t\t{\n\t\t\t\t\tChannelSel_Alg SelAlg=(ChannelSel_Alg)simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\tif (SelAlg > 2 || SelAlg < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ApCfg.bAutoChannelAtBootup = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\telse /*Enable*/\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ApCfg.bAutoChannelAtBootup = TRUE;\n\t\t\t\t\t\tpAd->ApCfg.AutoChannelAlg = SelAlg;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse /*Disable*/\n\t\t\t\t\tpAd->ApCfg.bAutoChannelAtBootup = FALSE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AutoChannelAtBootup=%d\\n\", pAd->ApCfg.bAutoChannelAtBootup));\n\t\t\t}\n\t\t\t/*AutoChannelSkipList*/\n\t\t\tif (RTMPGetKeyParameter(\"AutoChannelSkipList\", tmpbuf, 50, pBuffer, FALSE))\n\t\t\t{\t\t\n\t\t\t\tpAd->ApCfg.AutoChannelSkipListNum = delimitcnt(tmpbuf, \";\") + 1;\n\t\t\t\tif ( pAd->ApCfg.AutoChannelSkipListNum > 10 )\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Your no. of AutoChannelSkipList( %d ) is larger than 10 (boundary)\\n\",pAd->ApCfg.AutoChannelSkipListNum));\n\t\t\t\t\tpAd->ApCfg.AutoChannelSkipListNum = 10;\n\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr ; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t{\n\t\t\t\t\tif (i < pAd->ApCfg.AutoChannelSkipListNum )\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ApCfg.AutoChannelSkipList[i] = simple_strtol(macptr, 0, 10);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" AutoChannelSkipList[%d]= %d \\n\", i, pAd->ApCfg.AutoChannelSkipList[i]));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n#ifdef AP_SCAN_SUPPORT\n\t\t\t/*ACSCheckTime*/\n\t\t\tif (RTMPGetKeyParameter(\"ACSCheckTime\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tUINT8 Hour = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tpAd->ApCfg.ACSCheckTime = Hour*3600; /* Hour to second */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ACSCheckTime = %u (hour) \\n\", Hour));\n\t\t\t}\n#endif /* AP_SCAN_SUPPORT */\t\t\t\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t/*ShortSlot*/\n\t\tif(RTMPGetKeyParameter(\"ShortSlot\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tRT_CfgSetShortSlot(pAd, tmpbuf);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ShortSlot=%d\\n\", pAd->CommonCfg.bUseShortSlotTime));\n\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t{\n#if defined(CONFIG_AP_SUPPORT) || defined(STA_ITXBF_SUPPORT)\n\t\t\t/*ITxBfEn*/\n\t\t\tif(RTMPGetKeyParameter(\"ITxBfEn\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.ITxBfEn = (simple_strtol(tmpbuf, 0, 10) != 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ITxBfEn = %d\\n\", pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn));\n\n\t\t\t\trtmp_asic_set_bf(pAd);\n\t\t\t}\n\n\t\t\t/* ITxBfTimeout */\n\t\t\tif(RTMPGetKeyParameter(\"ITxBfTimeout\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.ITxBfTimeout = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ITxBfTimeout = %ld\\n\", pAd->CommonCfg.ITxBfTimeout));\n\t\t\t}\n#endif /* defined(CONFIG_AP_SUPPORT) || defined(STA_ITXBF_SUPPORT) */\n\n\t\t\t/* ETxBfEnCond*/\n\t\t\tif(RTMPGetKeyParameter(\"ETxBfEnCond\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.ETxBfEnCond = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ETxBfEnCond = %ld\\n\", pAd->CommonCfg.ETxBfEnCond));\n\n\t\t\t\tif (pAd->CommonCfg.ETxBfEnCond)\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.TxBF = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.TxBF = FALSE;\n\t\t\t}\n\t\t\t\trtmp_asic_set_bf(pAd);\n\t\t\t}\n\n\t\t\t/* ETxBfTimeout*/\n\t\t\tif(RTMPGetKeyParameter(\"ETxBfTimeout\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.ETxBfTimeout = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ETxBfTimeout = %ld\\n\", pAd->CommonCfg.ETxBfTimeout));\n\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t/* ETxBfNoncompress*/\n\t\t\tif(RTMPGetKeyParameter(\"ETxBfNoncompress\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.ETxBfNoncompress = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ETxBfNoncompress = %d\\n\", pAd->CommonCfg.ETxBfNoncompress));\n\t\t\t}\n\n\t\t\t/* ETxBfIncapable */\n\t\t\tif(RTMPGetKeyParameter(\"ETxBfIncapable\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.ETxBfIncapable = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ETxBfIncapable = %d\\n\", pAd->CommonCfg.ETxBfIncapable));\n\t\t\t}\n\t\t}\n#endif /* TXBF_SUPPORT */\n\n\n#ifdef PRE_ANT_SWITCH\n\t\t/*PreAntSwitch*/\n\t\tif(RTMPGetKeyParameter(\"PreAntSwitch\", tmpbuf, 32, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.PreAntSwitch = (simple_strtol(tmpbuf, 0, 10) != 0);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PreAntSwitch = %d\\n\", pAd->CommonCfg.PreAntSwitch));\n\t\t}\n#endif /* PRE_ANT_SWITCH */\n\n\n\n#ifdef STREAM_MODE_SUPPORT\n\t\t/* StreamMode*/\n\t\tif (pAd->chipCap.FlgHwStreamMode)\n\t\t{\n\t\t\tif(RTMPGetKeyParameter(\"StreamMode\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.StreamMode = (simple_strtol(tmpbuf, 0, 10) & 0x03);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"StreamMode= %d\\n\", pAd->CommonCfg.StreamMode));\n\t\t\t}\n\n\t\t\t/* StreamModeMac*/\n\t\t\tfor (i = 0; i < STREAM_MODE_STA_NUM; i++)\n\t\t\t{\n\t\t\t\tSTRING\t\ttok_str[32];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\tsprintf(tok_str, \"StreamModeMac%d\", i);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, MAX_PARAM_BUFFER_SIZE, pBuffer, TRUE))\n\t\t\t\t{\n\t\t\t\t\tint j;\n\t\t\t\t\tif(strlen(tmpbuf) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17*/\n\t\t\t\t\t\tcontinue; \n\t    \t\t\t\t\t\t\t    \n\t\t\t\t\tfor (j=0; j<ETH_LENGTH_OF_ADDRESS; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tAtoH(tmpbuf, &pAd->CommonCfg.StreamModeMac[i][j], 1);\n\t\t\t\t\t\ttmpbuf=tmpbuf+3;\n\t\t\t\t\t}\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (NdisEqualMemory(ZERO_MAC_ADDR, &pAd->CommonCfg.StreamModeMac[0][0], MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\t/* set default broadcast mac to entry 0 if user not set it */\n\t\t\t\tNdisMoveMemory(&pAd->CommonCfg.StreamModeMac[0][0], BROADCAST_ADDR, MAC_ADDR_LEN);\n\t\t\t}\n\t\t}\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n\t\t/*DebugFlags*/\n\t\tif(RTMPGetKeyParameter(\"DebugFlags\", tmpbuf, 32, pBuffer, TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.DebugFlags = simple_strtol(tmpbuf, 0, 16);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DebugFlags = 0x%02lx\\n\", pAd->CommonCfg.DebugFlags));\n\t\t}\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/*IEEE80211H*/\n\t\tif(RTMPGetKeyParameter(\"IEEE80211H\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t    {\n\t\t\t\tif(simple_strtol(macptr, 0, 10) != 0)  /*Enable*/\n\t\t\t\t\tpAd->CommonCfg.bIEEE80211H = TRUE;\n\t\t\t\telse /*Disable*/\n\t\t\t\t\tpAd->CommonCfg.bIEEE80211H = FALSE;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IEEE80211H=%d\\n\", pAd->CommonCfg.bIEEE80211H));\n\t\t    }\n\t\t}\n\t\t\n#ifdef DFS_SUPPORT\n\t{\n\t\t/*CSPeriod*/\n\t\tif(RTMPGetKeyParameter(\"CSPeriod\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t    if(simple_strtol(tmpbuf, 0, 10) != 0)\n\t\t\t\tpAd->Dot11_H.CSPeriod = simple_strtol(tmpbuf, 0, 10);\n\t\t\telse\n\t\t\t\tpAd->Dot11_H.CSPeriod = 0;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CSPeriod=%d\\n\", pAd->Dot11_H.CSPeriod));\n\t\t}\n\n\t\t}\n#endif /* DFS_SUPPORT */\n\n\t\t/*RDRegion*/\n\t\tif(RTMPGetKeyParameter(\"RDRegion\", tmpbuf, 128, pBuffer, TRUE))\n\t\t{\n\t\t\tif ((strncmp(tmpbuf, \"JAP_W53\", 7) == 0) || (strncmp(tmpbuf, \"jap_w53\", 7) == 0))\n\t\t\t{\n\t\t\t\t\t\t\tpAd->CommonCfg.RDDurRegion = JAP_W53;\n\t\t\t\t\t\t\t/*pRadarDetect->DfsSessionTime = 15;*/\n\t\t\t}\n\t\t\telse if ((strncmp(tmpbuf, \"JAP_W56\", 7) == 0) || (strncmp(tmpbuf, \"jap_w56\", 7) == 0))\n\t\t\t{\n\t\t\t\t\t\t\tpAd->CommonCfg.RDDurRegion = JAP_W56;\n\t\t\t\t\t\t\t/*pRadarDetect->DfsSessionTime = 13;*/\n\t\t\t}\n\t\t\telse if ((strncmp(tmpbuf, \"JAP\", 3) == 0) || (strncmp(tmpbuf, \"jap\", 3) == 0))\n\t\t\t{\n\t\t\t\t\t\t\tpAd->CommonCfg.RDDurRegion = JAP;\n\t\t\t\t\t\t\t/*pRadarDetect->DfsSessionTime = 5;*/\n\t\t\t}\n\t\t\telse  if ((strncmp(tmpbuf, \"FCC\", 3) == 0) || (strncmp(tmpbuf, \"fcc\", 3) == 0))\n\t\t\t{\n\t\t\t\t\t\t\tpAd->CommonCfg.RDDurRegion = FCC;\n\t\t\t\t\t\t\t/*pRadarDetect->DfsSessionTime = 5;*/\n\t\t\t}\n\t\t\telse if ((strncmp(tmpbuf, \"CE\", 2) == 0) || (strncmp(tmpbuf, \"ce\", 2) == 0))\n\t\t\t{\n\t\t\t\t\t\t\tpAd->CommonCfg.RDDurRegion = CE;\n\t\t\t\t\t\t\t/*pRadarDetect->DfsSessionTime = 13;*/\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\t\t\tpAd->CommonCfg.RDDurRegion = CE;\n\t\t\t\t\t\t\t/*pRadarDetect->DfsSessionTime = 13;*/\n\t\t\t}\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RDRegion=%d\\n\", pAd->CommonCfg.RDDurRegion));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.RDDurRegion = CE;\n\t\t\t/*pRadarDetect->DfsSessionTime = 13;*/\n\t\t}\n\n#ifdef SYSTEM_LOG_SUPPORT\n\t\t/*WirelessEvent*/\n\t\tif(RTMPGetKeyParameter(\"WirelessEvent\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tBOOLEAN FlgIsWEntSup = FALSE;\n\n\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)\n\t\t\t\tFlgIsWEntSup = TRUE;\n\n\t\t\tRtmpOsWlanEventSet(pAd, &pAd->CommonCfg.bWirelessEvent, FlgIsWEntSup);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WirelessEvent=%d\\n\", pAd->CommonCfg.bWirelessEvent));\n\t\t}\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\t\t\t\n\t\t/*AuthMode*/\n\t\tif(RTMPGetKeyParameter(\"AuthMode\", tmpbuf, 128, pBuffer, TRUE))\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t   \t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < pAd->ApCfg.BssidNum); macptr = rstrtok(NULL,\";\"), i++)\n\t\t    \t{\n\t\t\t\t\tApCfg_Set_AuthMode_Proc(pAd, i, macptr);\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tif ((strcmp(tmpbuf, \"WEPAUTO\") == 0) || (strcmp(tmpbuf, \"wepauto\") == 0))\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;\n\t                        else if ((strcmp(tmpbuf, \"SHARED\") == 0) || (strcmp(tmpbuf, \"shared\") == 0))\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;\n\t                        else if ((strcmp(tmpbuf, \"WPAPSK\") == 0) || (strcmp(tmpbuf, \"wpapsk\") == 0))\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;\n\t                        else if ((strcmp(tmpbuf, \"WPANONE\") == 0) || (strcmp(tmpbuf, \"wpanone\") == 0))\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;\n\t                        else if ((strcmp(tmpbuf, \"WPA2PSK\") == 0) || (strcmp(tmpbuf, \"wpa2psk\") == 0))\n\t\t\t\t\t\t\t    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;\n#ifdef WPA_SUPPLICANT_SUPPORT\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telse if ((strcmp(tmpbuf, \"WPA\") == 0) || (strcmp(tmpbuf, \"wpa\") == 0))\n\t\t\t                    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;\n\t\t\t\t\t\t\telse if ((strcmp(tmpbuf, \"WPA2\") == 0) || (strcmp(tmpbuf, \"wpa2\") == 0))\n\t\t\t\t\t\t\t    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;  \n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef WAPI_SUPPORT\n\t\t\t\t\t\t\telse if ((strcmp(tmpbuf, \"WAICERT\") == 0) || (strcmp(tmpbuf, \"waicert\") == 0))\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWAICERT;  \n\t\t\t\t\t\t\telse if ((strcmp(tmpbuf, \"WAIPSK\") == 0) || (strcmp(tmpbuf, \"waipsk\") == 0))\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWAIPSK;  \n#endif /* WAPI_SUPPORT */\n\t                        else\n\t                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n\n\t                        pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(AuthMode=%d)\\n\", __FUNCTION__, pAd->StaCfg.AuthMode));\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\t\t/*EncrypType*/\n\t\tif(RTMPGetKeyParameter(\"EncrypType\", tmpbuf, 128, pBuffer, TRUE))\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tWe need to reset the WepStatus of all interfaces as 1 (Ndis802_11WEPDisabled) first.\n\t\t\t\t\tOr it may have problem when some interface enabled but didn't configure it.\n\t\t\t\t*/\n\t\t\t\tfor ( i= 0; i<pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\tpAd->ApCfg.MBSSID[i].WepStatus = Ndis802_11WEPDisabled;\n\t\t    \t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t    \t\t{\n\t\t\t\t\tint apidx;\n\n\t\t\t\t\tif (i<pAd->ApCfg.BssidNum)\n\t\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\t\tapidx = i;\n\t\t\t\t\t}\n\t\t        \t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((strncmp(macptr, \"NONE\", 4) == 0) || (strncmp(macptr, \"none\", 4) == 0))\n\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPDisabled;\n\t\t        \t\telse if ((strncmp(macptr, \"WEP\", 3) == 0) || (strncmp(macptr, \"wep\", 3) == 0))\n\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPEnabled;\n\t\t        \t\telse if ((strncmp(macptr, \"TKIPAES\", 7) == 0) || (strncmp(macptr, \"tkipaes\", 7) == 0))\n\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption4Enabled;\n\t\t        \t\telse if ((strncmp(macptr, \"TKIP\", 4) == 0) || (strncmp(macptr, \"tkip\", 4) == 0))\n\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption2Enabled;\n\t\t        \t\telse if ((strncmp(macptr, \"AES\", 3) == 0) || (strncmp(macptr, \"aes\", 3) == 0))\n\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption3Enabled;\n#ifdef WAPI_SUPPORT\n\t\t\t\t\t\t\t\t\telse if ((strncmp(macptr, \"SMS4\", 4) == 0) || (strncmp(macptr, \"sms4\", 4) == 0))\n\t\t\t\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11EncryptionSMS4Enabled;\t\t\t\t\t\t\t\t\t\n#endif /* WAPI_SUPPORT */\n\t\t        \t\telse\n\t\t            \t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPDisabled;\n\n\t\t\t\t\t\t/* decide the group key encryption type*/\n\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\t\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\t\t\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = pAd->ApCfg.MBSSID[apidx].WepStatus;\n\n\t\t\t\t\t\t/* move to ap.c::APStartUp to process*/\n\t        \t\t\t/*RTMPMakeRSNIE(pAd, pAd->ApCfg.MBSSID[apidx].AuthMode, pAd->ApCfg.MBSSID[apidx].WepStatus, apidx);*/\n\t\t        \t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) EncrypType=%d\\n\", i, pAd->ApCfg.MBSSID[apidx].WepStatus));\n\t\t    \t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT \n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tif ((strcmp(tmpbuf, \"WEP\") == 0) || (strcmp(tmpbuf, \"wep\") == 0))\n\t\t\t\t\tpAd->StaCfg.WepStatus\t= Ndis802_11WEPEnabled;\n\t\t\t\telse if ((strcmp(tmpbuf, \"TKIP\") == 0) || (strcmp(tmpbuf, \"tkip\") == 0))\n\t\t\t\t\tpAd->StaCfg.WepStatus\t= Ndis802_11Encryption2Enabled;\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\telse if ((strcmp(tmpbuf, \"AES\") == 0) || (strcmp(tmpbuf, \"aes\") == 0))\n\t\t\t\t\tpAd->StaCfg.WepStatus\t= Ndis802_11Encryption3Enabled;\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n#ifdef WAPI_SUPPORT\n\t\t\t\telse if ((strcmp(tmpbuf, \"SMS4\") == 0) || (strcmp(tmpbuf, \"sms4\") == 0))\n\t\t            pAd->StaCfg.WepStatus\t= Ndis802_11EncryptionSMS4Enabled;\t\t\t\t\t\t\t\t\t\n#endif /* WAPI_SUPPORT */\n\t\t\t\telse\n\t\t\t\t\tpAd->StaCfg.WepStatus\t= Ndis802_11WEPDisabled;\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tRTMPSetSTACipherSuites(pAd, pAd->StaCfg.WepStatus);\n\t\t\t\t/*RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);*/\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(EncrypType=%d)\\n\", __FUNCTION__, pAd->StaCfg.WepStatus));\n\t\t\t}\n\t\t#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t{\n\t\t\t\t\t/* WpaMixPairCipher*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"WpaMixPairCipher\", tmpbuf, 256, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tIn WPA-WPA2 mix mode, it provides a more flexible cipher combination. \n\t\t\t\t\t\t\t-\tWPA-AES and WPA2-TKIP\n\t\t\t\t\t\t\t-\tWPA-AES and WPA2-TKIPAES\n\t\t\t\t\t\t\t-\tWPA-TKIP and WPA2-AES\n\t\t\t\t\t\t\t-\tWPA-TKIP and WPA2-TKIPAES\n\t\t\t\t\t\t\t-\tWPA-TKIPAES and WPA2-AES\n\t\t\t\t\t\t\t-\tWPA-TKIPAES and WPA2-TKIP\n\t\t\t\t\t\t\t-\tWPA-TKIPAES and WPA2-TKIPAES (default)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t */\t\t\t\t\t\t\t\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[i].AuthMode != Ndis802_11AuthModeWPA1WPA2 && \n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].AuthMode != Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[i].WepStatus != Ndis802_11Encryption4Enabled)\n\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\tif ((strncmp(macptr, \"WPA_AES_WPA2_TKIPAES\", 20) == 0) || (strncmp(macptr, \"wpa_aes_wpa2_tkipaes\", 20) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_AES_WPA2_TKIPAES;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telse if ((strncmp(macptr, \"WPA_AES_WPA2_TKIP\", 17) == 0) || (strncmp(macptr, \"wpa_aes_wpa2_tkip\", 17) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_AES_WPA2_TKIP;\t\t\t\t\t\t\t\t \t\t\t\t\t\t\n\t\t\t\t\t\t\telse if ((strncmp(macptr, \"WPA_TKIP_WPA2_AES\", 17) == 0) || (strncmp(macptr, \"wpa_tkip_wpa2_aes\", 17) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_TKIP_WPA2_AES;\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telse if ((strncmp(macptr, \"WPA_TKIP_WPA2_TKIPAES\", 21) == 0) || (strncmp(macptr, \"wpa_tkip_wpa2_tkipaes\", 21) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_TKIP_WPA2_TKIPAES;\n\t\t\t\t\t\t\telse if ((strncmp(macptr, \"WPA_TKIPAES_WPA2_AES\", 20) == 0) || (strncmp(macptr, \"wpa_tkipaes_wpa2_aes\", 20) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_TKIPAES_WPA2_AES;\n\t\t\t\t\t\t\telse if ((strncmp(macptr, \"WPA_TKIPAES_WPA2_TKIPAES\", 24) == 0) || (strncmp(macptr, \"wpa_tkipaes_wpa2_tkipaes\", 24) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;\n\t\t\t\t\t\t\telse if ((strncmp(macptr, \"WPA_TKIPAES_WPA2_TKIP\", 21) == 0) || (strncmp(macptr, \"wpa_tkipaes_wpa2_tkip\", 21) == 0))\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIP;\n\t\t\t\t\t\t\telse /*Default*/\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"I/F(ra%d) MixWPACipher=0x%02x\\n\", i, pAd->ApCfg.MBSSID[i].WpaMixPairCipher));\n\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t}\t\t\t\n\t\t\t\t\n\t\t\t\t\t/*RekeyMethod*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"RekeyMethod\", tmpbuf, 128, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\t\t\t\t\n\t\t\t\t\t\t\tPRT_WPA_REKEY pRekeyInfo = &pAd->ApCfg.MBSSID[i].WPAREKEY;\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tif ((strcmp(macptr, \"TIME\") == 0) || (strcmp(macptr, \"time\") == 0))\n\t\t\t\t\t\t\t\tpRekeyInfo->ReKeyMethod = TIME_REKEY;\n\t\t\t\t\t\t\telse if ((strcmp(macptr, \"PKT\") == 0) || (strcmp(macptr, \"pkt\") == 0))\n\t\t\t\t\t\t\t\tpRekeyInfo->ReKeyMethod = PKT_REKEY;\n\t\t\t\t\t\t\telse if ((strcmp(macptr, \"DISABLE\") == 0) || (strcmp(macptr, \"disable\") == 0))\n\t\t\t\t\t\t\t\tpRekeyInfo->ReKeyMethod = DISABLE_REKEY;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpRekeyInfo->ReKeyMethod = DISABLE_REKEY;\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) ReKeyMethod=%ld\\n\", i, pRekeyInfo->ReKeyMethod));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Apply to remaining MBSS*/\n\t\t\t\t\t\tif (i == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (i = 1; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WPAREKEY.ReKeyMethod = \n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].WPAREKEY.ReKeyMethod;\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) ReKeyMethod=%ld\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\ti, pAd->ApCfg.MBSSID[i].WPAREKEY.ReKeyMethod));\n\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/*RekeyInterval*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"RekeyInterval\", tmpbuf, 255, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\t\t\t\t\n\t\t\t\t\t\t\tULONG\tvalue_interval;\n\t\t\t\t\t\t\tPRT_WPA_REKEY pRekeyInfo = &pAd->ApCfg.MBSSID[i].WPAREKEY;\n\n\t\t\t\t\t\t\tvalue_interval = simple_strtol(macptr, 0, 10);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tif((value_interval >= 10) && (value_interval < MAX_REKEY_INTER))\n\t\t\t\t\t\t\t\tpRekeyInfo->ReKeyInterval = value_interval;\n\t\t\t\t\t\t\telse /*Default*/\n\t\t\t\t\t\t\t\tpRekeyInfo->ReKeyInterval = 3600;\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) ReKeyInterval=%ld\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ti, pRekeyInfo->ReKeyInterval));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Apply to remaining MBSS*/\n\t\t\t\t\t\tif (i == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (i = 1; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WPAREKEY.ReKeyInterval = \n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].WPAREKEY.ReKeyInterval;\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) ReKeyInterval=%ld\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ti, pAd->ApCfg.MBSSID[i].WPAREKEY.ReKeyInterval));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\t/*PMKCachePeriod*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"PMKCachePeriod\", tmpbuf, 255, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].PMKCachePeriod = \n\t\t\t\t\t\t\t\t\t\t\t\t\tsimple_strtol(macptr, 0, 10) * 60 * OS_HZ;\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) PMKCachePeriod=%ld\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\ti, pAd->ApCfg.MBSSID[i].PMKCachePeriod));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Apply to remaining MBSS*/\n\t\t\t\t\t\tif (i == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (i = 1; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].PMKCachePeriod = \n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].PMKCachePeriod;\n\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) PMKCachePeriod=%ld\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ti, pAd->ApCfg.MBSSID[i].PMKCachePeriod));\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*WPAPSK_KEY*/\n\t\t\t\t\tif(TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tSTRING tok_str[16];\n\t\t\t\t\t\tBOOLEAN bWPAPSKxIsUsed = FALSE;\n\n\t\t\t\t\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"pAd->ApCfg.BssidNum=%d\\n\", pAd->ApCfg.BssidNum));\n\t\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"WPAPSK%d\", i + 1);\n\t\t\t\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 65, pBuffer, FALSE))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trtmp_parse_wpapsk_buffer_from_file(pAd, tmpbuf, i);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (bWPAPSKxIsUsed == FALSE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tbWPAPSKxIsUsed = TRUE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (bWPAPSKxIsUsed == FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tif (RTMPGetKeyParameter(\"WPAPSK\", tmpbuf, 512, pBuffer, FALSE))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (pAd->ApCfg.BssidNum == 1)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\trtmp_parse_wpapsk_buffer_from_file(pAd, tmpbuf, BSS0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* Anyway, we still do the legacy dissection of the whole WPAPSK passphrase.*/\n\t\t\t\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\trtmp_parse_wpapsk_buffer_from_file(pAd, macptr, i);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n#ifdef DBG\n\t\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint j;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WPAPSK Key => \\n\", i));\n\t\t\t\t\t\t\t\t\t\t\tfor (j = 0; j < 32; j++)\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x:\", pAd->ApCfg.MBSSID[i].PMK[j]));\n\t\t\t\t\t\t\t\t\t\t\t\tif ((j%16) == 15)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\tif(RTMPGetKeyParameter(\"WPAPSK\", tmpbuf, 512, pBuffer, FALSE))\n\t\t\t\t\t\tRTMPSetSTAPassPhrase(pAd, tmpbuf);\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t/*DefaultKeyID, KeyType, KeyStr*/\n\t\t\t\trtmp_read_key_parms_from_file(pAd, tmpbuf, pBuffer);\n\n#ifdef WAPI_SUPPORT\n\t\t\t\trtmp_read_wapi_parms_from_file(pAd, tmpbuf, pBuffer);\n#endif /* WAPI_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t{\n\t\t\t\t\t/*Access Control List*/\n\t\t\t\t\trtmp_read_acl_parms_from_file(pAd, tmpbuf, pBuffer);\n\n#ifdef APCLI_SUPPORT\t\t\t\t\t\n\t\t\t\t\trtmp_read_ap_client_from_file(pAd, tmpbuf, pBuffer);\n#endif /* APCLI_SUPPORT */\n\n#ifdef IGMP_SNOOP_SUPPORT\n\t\t\t\t\t/* Igmp Snooping information*/\n\t\t\t\t\trtmp_read_igmp_snoop_from_file(pAd, tmpbuf, pBuffer);\n#endif /* IGMP_SNOOP_SUPPORT */\n\n\n#ifdef DOT1X_SUPPORT\n\t\t\t\t\trtmp_read_radius_parms_from_file(pAd, tmpbuf, pBuffer);\n#endif /* DOT1X_SUPPORT */\n\n#ifdef IDS_SUPPORT\n\t\t\t\t\trtmp_read_ids_from_file(pAd, tmpbuf, pBuffer);\n#endif /* IDS_SUPPORT */\n\t\t\t\t\trtmp_read_multest_from_file(pAd, tmpbuf, pBuffer);\n\t\t\t\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tHTParametersHook(pAd, tmpbuf, pBuffer);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n\t\t\t\tVHTParametersHook(pAd, tmpbuf, pBuffer);\n#endif /* DOT11_VHT_AC */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t{\n#ifdef WSC_AP_SUPPORT\n\t\t\t\t\tSTRING\ttok_str[16] = {0};\n\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"WscDefaultSSID%d\", i + 1);\n\t\t\t\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 33, pBuffer, FALSE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNdisZeroMemory(&pAd->ApCfg.MBSSID[i].WscControl.WscDefaultSsid, sizeof(NDIS_802_11_SSID));\n\t\t\t\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[i].WscControl.WscDefaultSsid.Ssid, tmpbuf , strlen(tmpbuf));\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscDefaultSsid.SsidLength = strlen(tmpbuf);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscDefaultSSID[%d]=%s\\n\", i, pAd->ApCfg.MBSSID[i].WscControl.WscDefaultSsid.Ssid));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/*WscConfMode*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"WscConfMode\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tINT WscConfMode = simple_strtol(macptr, 0, 10);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tif (WscConfMode > 0 && WscConfMode < 8)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscConfMode = WscConfMode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscConfMode = WSC_DISABLE;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WscConfMode=%d\\n\", i, pAd->ApCfg.MBSSID[i].WscControl.WscConfMode));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*WscConfStatus*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"WscConfStatus\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscConfStatus = (INT) simple_strtol(macptr, 0, 10);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WscConfStatus=%d\\n\", i, pAd->ApCfg.MBSSID[i].WscControl.WscConfStatus));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/*WscConfMethods*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"WscConfMethods\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscConfigMethods = (USHORT)simple_strtol(macptr, 0, 16);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WscConfMethods=0x%x\\n\", i, pAd->ApCfg.MBSSID[i].WscControl.WscConfigMethods));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*WscKeyASCII (0:Hex, 1:ASCII(random length), others: ASCII length, default 8)*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"WscKeyASCII\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tINT Value;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tValue = (INT) simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\tif(Value==0 || Value==1)\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscKeyASCII = Value;\n\t\t\t\t\t\t\telse if(Value >= 8 && Value <=63)\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscKeyASCII = Value;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscKeyASCII = 8;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"WscKeyASCII=%d\\n\", pAd->ApCfg.MBSSID[i].WscControl.WscKeyASCII));\n\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (RTMPGetKeyParameter(\"WscSecurityMode\", tmpbuf, 50, pBuffer, TRUE))\t\t\t\n\t\t\t\t\t{\t\t\t\t\n\t\t\t\t\t\tfor (i= 0; i<pAd->ApCfg.BssidNum; i++)\t\t\t\t\t\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscSecurityMode = WPAPSKTKIP;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\t\t\t\t\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tINT tmpMode = 0;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\ttmpMode = (INT) simple_strtol(macptr, 0, 10);\n\t\t\t\t\t\t\tif (tmpMode <= WPAPSKTKIP)\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscSecurityMode = tmpMode;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSetProfileParameters I/F(ra%d) WscSecurityMode=%d\\n\", \n\t\t\t\t\t\t\t\ti, pAd->ApCfg.MBSSID[i].WscSecurityMode));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* WCNTest*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"WCNTest\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tBOOLEAN\tbEn = FALSE;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ((strncmp(tmpbuf, \"0\", 1) == 0))\n\t\t\t\t\t\t\tbEn = FALSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tbEn = TRUE;\n\n\t\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.bWCNTest = bEn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WCNTest=%d\\n\", bEn));\n\t\t\t\t\t}\n\n\t\t\t\t\t/*WSC UUID Str*/\n\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tPWSC_CTRL\tpWpsCtrl = &pAd->ApCfg.MBSSID[i].WscControl;\n\t\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"WSC_UUID_Str%d\", i + 1);\n\t\t\t\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 40, pBuffer, FALSE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNdisMoveMemory(&pWpsCtrl->Wsc_Uuid_Str[0], tmpbuf , strlen(tmpbuf));\n\t\t\t\t\t    \tDBGPRINT(RT_DEBUG_TRACE, (\"UUID_Str[%d]=%s\\n\", i+1, pWpsCtrl->Wsc_Uuid_Str));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*WSC UUID Hex*/\n\t\t\t\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tPWSC_CTRL\tpWpsCtrl = &pAd->ApCfg.MBSSID[i].WscControl;\n\t\t\t\t\t\tsnprintf(tok_str, sizeof(tok_str), \"WSC_UUID_E%d\", i + 1);\n\t\t\t\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 40, pBuffer, FALSE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAtoH(tmpbuf, &pWpsCtrl->Wsc_Uuid_E[0], UUID_LEN_HEX);\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Wsc_Uuid_E[%d]\", i+1));\n\t\t\t\t\t\t\thex_dump(\"\", &pWpsCtrl->Wsc_Uuid_E[0], UUID_LEN_HEX);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\n#endif /* WSC_AP_SUPPORT */\n\n\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\t\t\t\t/*CarrierDetect*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"CarrierDetect\", tmpbuf, 128, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((strncmp(tmpbuf, \"0\", 1) == 0))\n\t\t\t\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = FALSE;\n\t\t\t\t\t\telse if ((strncmp(tmpbuf, \"1\", 1) == 0))\n\t\t\t\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = TRUE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = FALSE;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CarrierDetect.Enable=%d\\n\", pAd->CommonCfg.CarrierDetect.Enable));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = FALSE;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\t/*PSMode*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"PSMode\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((strcmp(tmpbuf, \"MAX_PSP\") == 0) || (strcmp(tmpbuf, \"max_psp\") == 0))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\tdo NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()\n\t\t\t\t\t\t\t\t\tto exclude certain situations\n\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t/*\tMlmeSetPsm(pAd, PWR_SAVE);*/\n\t\t\t\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\t\t\t\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;\n\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;\n\t\t\t\t\t\t\t\tpAd->StaCfg.DefaultListenCount = 5;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telse if ((strcmp(tmpbuf, \"Fast_PSP\") == 0) || (strcmp(tmpbuf, \"fast_psp\") == 0) \n\t\t\t\t\t\t\t\t|| (strcmp(tmpbuf, \"FAST_PSP\") == 0))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()*/\n\t\t\t\t\t\t\t\t/* to exclude certain situations.*/\n\t\t\t\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\t\t\t\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;\n\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;\n\t\t\t\t\t\t\t\tpAd->StaCfg.DefaultListenCount = 3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((strcmp(tmpbuf, \"Legacy_PSP\") == 0) || (strcmp(tmpbuf, \"legacy_psp\") == 0) \n\t\t\t\t\t\t\t\t|| (strcmp(tmpbuf, \"LEGACY_PSP\") == 0))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()*/\n\t\t\t\t\t\t\t\t/* to exclude certain situations.*/\n\t\t\t\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\t\t\t\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;\n\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;\n\t\t\t\t\t\t\t\tpAd->StaCfg.DefaultListenCount = 3;\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\t\t\t\tpAd->StaCfg.DefaultListenCount = 1;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{ /*Default Ndis802_11PowerModeCAM*/\n\t\t\t\t\t\t\t\t/* clear PSM bit immediately*/\n\t\t\t\t\t\t\t\tRTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);\n\t\t\t\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\t\t\t\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;\n\t\t\t\t\t\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PSMode=%ld\\n\", pAd->StaCfg.WindowsPowerMode));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/* AutoRoaming by RSSI*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"AutoRoaming\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) == 0)\n\t\t\t\t\t\t\tpAd->StaCfg.bAutoRoaming = FALSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->StaCfg.bAutoRoaming = TRUE;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AutoRoaming=%d\\n\", pAd->StaCfg.bAutoRoaming));\n\t\t\t\t\t}\n\t\t\t\t\t/* RoamThreshold*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"RoamThreshold\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tlong lInfo = simple_strtol(tmpbuf, 0, 10);\n\n\t\t\t\t\t\tif (lInfo > 90 || lInfo < 60)\n\t\t\t\t\t\t\tpAd->StaCfg.dBmToRoam = -70;\n\t\t\t\t\t\telse    \n\t\t\t\t\t\t\tpAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RoamThreshold=%d  dBm\\n\", pAd->StaCfg.dBmToRoam));\n\t\t\t\t\t}\n\n\t\t\n\t\t\t\t\t\t \n\n\t\t\t\t\tif(RTMPGetKeyParameter(\"TGnWifiTest\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\t\t\t\t\n\t\t\t\t\t\tif(simple_strtol(tmpbuf, 0, 10) == 0)\n\t\t\t\t\t\t\tpAd->StaCfg.bTGnWifiTest = FALSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->StaCfg.bTGnWifiTest = TRUE;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TGnWifiTest=%d\\n\", pAd->StaCfg.bTGnWifiTest));\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Beacon Lost Time*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"BeaconLostTime\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tULONG lInfo = (ULONG)simple_strtol(tmpbuf, 0, 10);\n\n\t\t\t\t\t\tif ((lInfo != 0) && (lInfo <= 60))\n\t\t\t\t\t\t\tpAd->StaCfg.BeaconLostTime = (lInfo * OS_HZ);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BeaconLostTime=%ld \\n\", pAd->StaCfg.BeaconLostTime));\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Auto Connet Setting if no SSID\t\t\t*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"AutoConnect\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) == 0)\n\t\t\t\t\t\t\tpAd->StaCfg.bAutoConnectIfNoSSID = FALSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->StaCfg.bAutoConnectIfNoSSID = TRUE;\n\t\t\t\t\t}\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\tif(RTMPGetKeyParameter(\"TDLSCapable\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(simple_strtol(tmpbuf, 0, 10) != 0)  /*Enable*/\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.bTDLSCapable = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse /*Disable*/\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.bTDLSCapable = FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"bTDLSCapable=%d\\n\", pAd->StaCfg.TdlsInfo.bTDLSCapable));\n\t\t\t\t\t}\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\t\t\tif (RTMPGetKeyParameter(\"TDLS_AutoLink\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) != 0)  //Enable\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsAutoLink = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse //Disable\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsAutoLink = FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TdlsAutoLink=%d\\n\", pAd->StaCfg.TdlsInfo.TdlsAutoLink));\n\t\t\t\t\t}\n#endif /* TDLS_AUTOLINK_SUPPORT */\n\n\t\t\t\t\tif (RTMPGetKeyParameter(\"TDLS_SwitchChSupp\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) != 0)  //Enable\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsChSwitchSupp = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse //Disable\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsChSwitchSupp = FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TdlsSwitchChSupp=%d\\n\", pAd->StaCfg.TdlsInfo.TdlsChSwitchSupp));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (RTMPGetKeyParameter(\"TDLS_PsmSupp\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) != 0)  //Enable\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsPsmSupp = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse //Disable\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsPsmSupp = FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TdlsPsmSupp=%d\\n\", pAd->StaCfg.TdlsInfo.TdlsPsmSupp));\n\t\t\t\t\t}\n\n\t\t\t\t\t//APSDAC for AC_BE, AC_BK, AC_VI, AC_VO\n\t\t\t\t\tif (RTMPGetKeyParameter(\"TDLS_APSDAC\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tBOOLEAN FlgIsAcUapsdEnabled[4];\n\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFlgIsAcUapsdEnabled[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS APSDAC%d  %d\\n\", i, FlgIsAcUapsdEnabled[i]));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BE = FlgIsAcUapsdEnabled[0];\n\t\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BK = FlgIsAcUapsdEnabled[1];\n\t\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VI = FlgIsAcUapsdEnabled[2];\n\t\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VO = FlgIsAcUapsdEnabled[3];\n\t\t\t\t\t}\n\n\t\t\t\t\t//MaxSPLength\n\t\t\t\t\tif (RTMPGetKeyParameter(\"TDLS_MaxSPLength\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->CommonCfg.TDLS_MaxSPLength = simple_strtol(tmpbuf, 0, 10);\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS MaxSPLength=%d\\n\", pAd->CommonCfg.TDLS_MaxSPLength));\n\t\t\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t\n\n\t\t\t\t\t/* FastConnect*/\n\t\t\t\t\tif(RTMPGetKeyParameter(\"FastConnect\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) == 0)\n\t\t\t\t\t\t\tpAd->StaCfg.bFastConnect = FALSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->StaCfg.bFastConnect = TRUE;\n\t\t\t\t\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"FastConnect=%d\\n\", pAd->StaCfg.bFastConnect));\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t{\n#ifdef MCAST_RATE_SPECIFIC\n\t\t\t\t\t/* McastPhyMode*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"McastPhyMode\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\t\n\t\t\t\t\t\tUCHAR PhyMode = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\t\t\t\t\t\tswitch (PhyMode)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tcase MCAST_DISABLE: /* disable*/\n\t\t\t\t\t\t\t\t\t\t\tNdisMoveMemory(&pAd->CommonCfg.MCastPhyMode,\n\t\t\t\t\t\t\t\t\t\t\t\t&pAd->MacTab.Content[MCAST_WCID].HTPhyMode, sizeof(HTTRANSMIT_SETTING));\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase MCAST_CCK:\t/* CCK*/\n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_CCK;\n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.BW =  BW_20;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase MCAST_OFDM:\t/* OFDM*/\n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_OFDM;\n\t\t\t\t\t\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\t\t\t\t\t\tcase MCAST_HTMIX:\t/* HTMIX*/\n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_HTMIX;\n\t\t\t\t\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"unknow Muticast PhyMode %d.\\n\", PhyMode));\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"0:Disable 1:CCK, 2:OFDM, 3:HTMIX.\\n\"));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tNdisMoveMemory(&pAd->CommonCfg.MCastPhyMode,\n\t\t\t\t\t\t\t\t\t\t&pAd->MacTab.Content[MCAST_WCID].HTPhyMode, sizeof(HTTRANSMIT_SETTING));\n\n\t\t\t\t\t/* McastMcs*/\n\t\t\t\t\tif (RTMPGetKeyParameter(\"McastMcs\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR Mcs = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\tswitch(pAd->CommonCfg.MCastPhyMode.field.MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase MODE_CCK:\n\t\t\t\t\t\t\t\tif ((Mcs <= 3) || (Mcs >= 8 && Mcs <= 11))\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"MCS must in range of 0 ~ 3 and 8 ~ 11 for CCK Mode.\\n\"));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase MODE_OFDM:\n\t\t\t\t\t\t\t\tif (Mcs > 7)\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"MCS must in range from 0 to 7 for CCK Mode.\\n\"));\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = 0;\n#endif /* MCAST_RATE_SPECIFIC */\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef WSC_INCLUDED\n\n\t\t\t\trtmp_read_wsc_user_parms_from_file(pAd, tmpbuf, pBuffer);\n\n\t\t\t\t/* Wsc4digitPinCode = TRUE use 4-digit Pin code, otherwise 8-digit Pin code */\n\t\t\t\tif (RTMPGetKeyParameter(\"Wsc4digitPinCode\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tif (simple_strtol(macptr, 0, 10) != 0)\t//Enable\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscEnrollee4digitPinCode = TRUE;\n\t\t\t\t\t\t\telse //Disable\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscEnrollee4digitPinCode = FALSE;\n\t\t\t\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Wsc4digitPinCode=%d\\n\", i, pAd->ApCfg.MBSSID[i].WscControl.WscEnrollee4digitPinCode));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n#endif // CONFIG_AP_SUPPORT //\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (simple_strtol(tmpbuf, 0, 10) != 0)\t//Enable\n\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscEnrollee4digitPinCode = TRUE;\n\t\t\t\t\t\telse //Disable\n\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscEnrollee4digitPinCode = FALSE;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Wsc4digitPinCode=%d\\n\", pAd->StaCfg.WscControl.WscEnrollee4digitPinCode));\n\t\t\t\t\t}\n#endif // CONFIG_STA_SUPPORT //\n\t\t\t\t}\n\t\t\n\t\t\t\tif (RTMPGetKeyParameter(\"WscVendorPinCode\", tmpbuf, 256, pBuffer, TRUE))\n\t\t\t\t{\n\t\t\t\t\tPWSC_CTRL pWscContrl;\n\t\t\t\t\tint bSetOk;\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tpWscContrl = &pAd->ApCfg.MBSSID[BSS0].WscControl;\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tpWscContrl = &pAd->StaCfg.WscControl;\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\tbSetOk = RT_CfgSetWscPinCode(pAd, tmpbuf, pWscContrl);\n\t\t\t\t\tif (bSetOk)\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - WscVendorPinCode= (%d)\\n\", __FUNCTION__, bSetOk));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s - WscVendorPinCode: invalid pin code(%s)\\n\", __FUNCTION__, tmpbuf));\n\t\t\t\t}\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tif (RTMPGetKeyParameter(\"WscV2Support\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t\t{\n\t\t\t\t\tUCHAR \t\t\tbEnable;\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (i >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tbEnable = (UCHAR)simple_strtol(macptr, 0, 10);\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[i].WscControl.WscV2Info.bEnableWpsV2 = bEnable;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WscV2Support=%d\\n\", i, bEnable));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tbEnable = (UCHAR)simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\t\t\n\t\t\t\t\t\tpAd->StaCfg.WscControl.WscV2Info.bEnableWpsV2 = bEnable;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - WscV2Support= (%d)\\n\", __FUNCTION__, bEnable));\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n#endif /* WSC_V2_SUPPORT */\n\n\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t/* EntryLifeCheck is used to check */\n\t\t\t\tif (RTMPGetKeyParameter(\"EntryLifeCheck\", tmpbuf, 256, pBuffer, TRUE))\n\t\t\t\t{\n\t\t\t\t\tlong LifeCheckCnt = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\tif ((LifeCheckCnt <= 65535) && (LifeCheckCnt != 0))\n\t\t\t\t\t\tpAd->ApCfg.EntryLifeCheck = LifeCheckCnt;\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->ApCfg.EntryLifeCheck = MAC_ENTRY_LIFE_CHECK_CNT;\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"EntryLifeCheck=%ld\\n\", pAd->ApCfg.EntryLifeCheck));\n\t\t\t\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef SINGLE_SKU\n\t\t\t\tif(RTMPGetKeyParameter(\"AntGain\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t{\n\t\t\t\t\tUCHAR AntGain = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\tpAd->CommonCfg.AntGain= AntGain;\n\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AntGain=%d\\n\", pAd->CommonCfg.AntGain));\n\t\t\t\t}\n\t\t\t\tif(RTMPGetKeyParameter(\"BandedgeDelta\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t\t{\n\t\t\t\t\tUCHAR Bandedge = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\t\tpAd->CommonCfg.BandedgeDelta = Bandedge;\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BandedgeDelta=%d\\n\", pAd->CommonCfg.BandedgeDelta));\n\t\t\t\t}\n#endif /* SINGLE_SKU */\n\n\n\n#ifdef P2P_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif(RTMPGetKeyParameter(\"P2P_GOIntent\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.GoIntentIdx = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_GOIntent=%d\\n\", pAd->P2pCfg.GoIntentIdx));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_DevName\", tmpbuf, 32, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tif ((strlen(tmpbuf) <= 32)\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tpAd->P2pCfg.DeviceNameLen = (UCHAR) strlen(tmpbuf);\n\t\t\t\t\tNdisZeroMemory(pAd->P2pCfg.DeviceName, 32);\n\t\t\t\t\tNdisMoveMemory(pAd->P2pCfg.DeviceName, tmpbuf, pAd->P2pCfg.DeviceNameLen);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():P2P_DevName=%s\\n\", __FUNCTION__, tmpbuf));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_ListChannel\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.ListenChannel = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_ListChannel=%d\\n\", pAd->P2pCfg.ListenChannel));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_OpChannel\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.GroupChannel = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_OpChannel=%d\\n\", pAd->P2pCfg.GroupChannel));\n\t\t\t}\n\t\t\tif(RTMPGetKeyParameter(\"P2P_WscCfgMethod\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tUCHAR CfgMethod = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tif (pAd->P2pCfg.WscMode == WSC_PIN_MODE)\n\t\t\t\t{\n\t\t\t\t\tif (CfgMethod == P2P_REG_CM_DISPLAY)\n\t\t\t\t\t\tpAd->P2pCfg.DefaultConfigMethod = P2P_REG_CM_DISPLAY;\n\t\t\t\t\telse if (CfgMethod == P2P_REG_CM_KEYPAD)\n\t\t\t\t\t\tpAd->P2pCfg.DefaultConfigMethod = P2P_REG_CM_KEYPAD;\n\t\t\t\t}\n\t\t\t\telse if (pAd->P2pCfg.WscMode == WSC_PBC_MODE)\n\t\t\t\t{\n\t\t\t\t\tpAd->P2pCfg.DefaultConfigMethod = P2P_REG_CM_PBC;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_WscCfgMethod=%d\\n\", pAd->P2pCfg.DefaultConfigMethod));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_ExtListenEnable\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tUINT32 ExtList = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tif (ExtList == 0)\n\t\t\t\t\tpAd->P2pCfg.bExtListen = FALSE;\n\t\t\t\telse if (ExtList == 1)\n\t\t\t\t\tpAd->P2pCfg.bExtListen = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_ExtListen=%d\\n\", pAd->P2pCfg.bExtListen));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_ExtListenPrd\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.ExtListenPeriod = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_ExtListenPrd=%d\\n\", pAd->P2pCfg.ExtListenPeriod));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_ExtenListenInv\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.ExtListenInterval = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_ExtenListenInv=%d\\n\", pAd->P2pCfg.ExtListenInterval));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_IntraBss\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tUINT32 IntraBss = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tif (IntraBss == 0)\n\t\t\t\t\tpAd->P2pCfg.bIntraBss = FALSE;\n\t\t\t\telse if (IntraBss == 1)\n\t\t\t\t\tpAd->P2pCfg.bIntraBss = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_IntraBss=%d\\n\", pAd->P2pCfg.bIntraBss));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_NoACnt\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.GONoASchedule.Count = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_NoACnt=%d\\n\", pAd->P2pCfg.GONoASchedule.Count));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_NoADuration\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.GONoASchedule.Duration = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_NoADuration=%ld\\n\", pAd->P2pCfg.GONoASchedule.Duration));\n\t\t\t}\n\n\t\t\tif(RTMPGetKeyParameter(\"P2P_NoAInv\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.GONoASchedule.Interval = simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_NoAInv=%d\\n\", pAd->P2pCfg.GONoASchedule.Interval));\n\t\t\t}\n\t\t\tif(RTMPGetKeyParameter(\"P2P_MaxEntry\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.p2pMaxEntry= simple_strtol(tmpbuf, 0, 10);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_MaxEntry=%d\\n\", pAd->P2pCfg.p2pMaxEntry));\n\t\t\t}\n\n\n\t\t}\n#endif /* P2P_SUPPORT */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\t\t/* set GPIO pin for wake-up signal */\n\t\tif (RTMPGetKeyParameter(\"WOW_GPIO\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\tSet_WOW_GPIO(pAd, tmpbuf);\n\n\t\t/* set WOW enable/disable */\n\t\tif (RTMPGetKeyParameter(\"WOW_Enable\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\tSet_WOW_Enable(pAd, tmpbuf);\n\n\t\t/* set delay time for WOW really enable */\n\t\tif (RTMPGetKeyParameter(\"WOW_Delay\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\tSet_WOW_Delay(pAd, tmpbuf);\n\n\t\t/* set GPIO pulse hold time */\n\t\tif (RTMPGetKeyParameter(\"WOW_Hold\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\tSet_WOW_Hold(pAd, tmpbuf);\n\n\t\t/* set wakeup signal type */\n\t\tif (RTMPGetKeyParameter(\"WOW_InBand\", tmpbuf, 10, pBuffer, TRUE))\n\t\t\tSet_WOW_InBand(pAd, tmpbuf);\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t\tif (RTMPGetKeyParameter(\"MO_FalseCCATh\", tmpbuf, 10, pBuffer, TRUE))\n\t\t{\n\t\t\tSet_MO_FalseCCATh_Proc(pAd, tmpbuf);\n\t\t}\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t}while(0);\n\n#ifdef CUSTOMER_DEMO\n\tdemo_mode_cfg(pAd);\n#endif /* CUSTOMER_DEMO */\n\n\tos_free_mem(NULL, tmpbuf);\n\t\t\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef MULTIPLE_CARD_SUPPORT\n/* record whether the card in the card list is used in the card file*/\nUINT8  MC_CardUsed[MAX_NUM_OF_MULTIPLE_CARD];\n/* record used card mac address in the card list*/\nstatic UINT8  MC_CardMac[MAX_NUM_OF_MULTIPLE_CARD][6];\n\n/*\n========================================================================\nRoutine Description:\n\tGet card profile path.\n\nArguments:\n\tpAd\n\nReturn Value:\n\tTRUE\t\t- Find a card profile\n\tFALSE\t\t- use default profile\n\nNote:\n========================================================================\n*/\nBOOLEAN RTMP_CardInfoRead(\n\tIN\tPRTMP_ADAPTER pAd)\n{\n#define MC_SELECT_CARDID\t\t0\t/* use CARD ID (0 ~ 31) to identify different cards */\n#define MC_SELECT_MAC\t\t\t1\t/* use CARD MAC to identify different cards */\n#define MC_SELECT_CARDTYPE\t\t2\t/* use CARD type (abgn or bgn) to identify different cards */\n\n#define LETTER_CASE_TRANSLATE(txt_p, card_id)\t\t\t\\\n\t{\tUINT32 _len; char _char;\t\t\t\t\t\t\\\n\t\tfor(_len=0; _len<strlen(card_id); _len++) {\t\t\\\n\t\t\t_char = *(txt_p + _len);\t\t\t\t\t\\\n\t\t\tif (('A' <= _char) && (_char <= 'Z'))\t\t\\\n\t\t\t\t*(txt_p+_len) = 'a'+(_char-'A');\t\t\\\n\t\t} }\n\n\tRTMP_OS_FD srcf;\n\tINT retval;\n\tPSTRING buffer, tmpbuf;\n\tSTRING card_id_buf[30], RFIC_word[30];\n\tBOOLEAN flg_match_ok = FALSE;\n\tINT32 card_select_method;\n\tINT32 card_free_id, card_nouse_id, card_same_mac_id, card_match_id;\n\tEEPROM_ANTENNA_STRUC antenna;\n\tUSHORT addr01, addr23, addr45;\n\tUINT8 mac[6];\n\tUINT32 data, card_index;\n\tUCHAR *start_ptr;\n\tRTMP_OS_FS_INFO osFSInfo;\n\n\t/* init*/\n\tos_alloc_mem(NULL, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE);\n\tif (buffer == NULL)\n\t\treturn FALSE;\n\n\tos_alloc_mem(NULL, (UCHAR **)&tmpbuf, MAX_PARAM_BUFFER_SIZE);\n\tif(tmpbuf == NULL)\n\t{\n\t\tos_free_mem(NULL, buffer);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t/* get RF IC type*/\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &data);\n\t\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, antenna.word);\n\n\tif ((antenna.field.RfIcType == RFIC_2850) ||\n\t\t(antenna.field.RfIcType == RFIC_2750) || \n\t\t(antenna.field.RfIcType == RFIC_2853) || \n\t\t(antenna.field.RfIcType == RFIC_3853) ||\n\t\t(antenna.field.RfIcType == RFIC_5592))\n\t{\n\t\t/* ABGN card */\n\t\tstrcpy(RFIC_word, \"abgn\");\n\t}\n\telse\n\t{\n\t\t/* BGN card */\n\t\tstrcpy(RFIC_word, \"bgn\");\n\t}\n\n\t/* get MAC address*/\n\tRT28xx_EEPROM_READ16(pAd, 0x04, addr01);\n\tRT28xx_EEPROM_READ16(pAd, 0x06, addr23);\n\tRT28xx_EEPROM_READ16(pAd, 0x08, addr45);\n\n\tmac[0] = (UCHAR)(addr01 & 0xff);\n\tmac[1] = (UCHAR)(addr01 >> 8);\n\tmac[2] = (UCHAR)(addr23 & 0xff);\n\tmac[3] = (UCHAR)(addr23 >> 8);\n\tmac[4] = (UCHAR)(addr45 & 0xff);\n\tmac[5] = (UCHAR)(addr45 >> 8);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"mac addr=%02x:%02x:%02x:%02x:%02x:%02x!\\n\", PRINT_MAC(mac)));\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\t/* open card information file*/\n\tsrcf = RtmpOSFileOpen(CARD_INFO_PATH, O_RDONLY, 0);\n\tif (IS_FILE_OPEN_ERR(srcf)) \n\t{\n\t\t/* card information file does not exist */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"--> Error opening %s\\n\", CARD_INFO_PATH));\n\t\tgoto  free_resource;\n\t}\n\n\t/* card information file exists so reading the card information */\n\tmemset(buffer, 0x00, MAX_INI_BUFFER_SIZE);\n\tretval = RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);\n\tif (retval < 0)\n\t{\n\t\t/* read fail */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"--> Read %s error %d\\n\", CARD_INFO_PATH, -retval));\n\t}\n\telse\n\t{\n\t\t/* get card selection method */\n\t\tmemset(tmpbuf, 0x00, MAX_PARAM_BUFFER_SIZE);\n\t\tcard_select_method = MC_SELECT_CARDTYPE; /* default*/\n\n\t\tif (RTMPGetKeyParameter(\"SELECT\", tmpbuf, 256, buffer, TRUE))\n\t\t{\n\t\t\tif (strcmp(tmpbuf, \"CARDID\") == 0)\n\t\t\t\tcard_select_method = MC_SELECT_CARDID;\n\t\t\telse if (strcmp(tmpbuf, \"MAC\") == 0)\n\t\t\t\tcard_select_method = MC_SELECT_MAC;\n\t\t\telse if (strcmp(tmpbuf, \"CARDTYPE\") == 0)\n\t\t\t\tcard_select_method = MC_SELECT_CARDTYPE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"MC> Card Selection = %d\\n\", card_select_method));\n\n\t\t/* init*/\n\t\tcard_free_id = -1;\n\t\tcard_nouse_id = -1;\n\t\tcard_same_mac_id = -1;\n\t\tcard_match_id = -1;\n\n\t\t/* search current card information records*/\n\t\tfor(card_index=0;\n\t\t\tcard_index<MAX_NUM_OF_MULTIPLE_CARD;\n\t\t\tcard_index++)\n\t\t{\n\t\t\tif ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) &&\n\t\t\t\t(*(UINT16 *)&MC_CardMac[card_index][4] == 0))\n\t\t\t{\n\t\t\t\t/* MAC is all-0 so the entry is available*/\n\t\t\t\tMC_CardUsed[card_index] = 0;\n\n\t\t\t\tif (card_free_id < 0)\n\t\t\t\t\tcard_free_id = card_index; /* 1st free entry*/\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (memcmp(MC_CardMac[card_index], mac, 6) == 0)\n\t\t\t\t{\n\t\t\t\t\t/* we find the entry with same MAC*/\n\t\t\t\t\tif (card_same_mac_id < 0)\n\t\t\t\t\t\tcard_same_mac_id = card_index; /* 1st same entry*/\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* MAC is not all-0 but used flag == 0*/\n\t\t\t\t\tif ((MC_CardUsed[card_index] == 0) &&\n\t\t\t\t\t\t(card_nouse_id < 0))\n\t\t\t\t\t{\n\t\t\t\t\t\tcard_nouse_id = card_index; /* 1st available entry*/\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"MC> Free = %d, Same = %d, NOUSE = %d\\n\",\n\t\t\t\tcard_free_id, card_same_mac_id, card_nouse_id));\n\n\t\tif ((card_same_mac_id >= 0) &&\n\t\t\t((card_select_method == MC_SELECT_CARDID) ||\n\t\t\t(card_select_method == MC_SELECT_CARDTYPE)))\n\t\t{\n\t\t\t/* same MAC entry is found*/\n\t\t\tcard_match_id = card_same_mac_id;\n\n\t\t\tif (card_select_method == MC_SELECT_CARDTYPE)\n\t\t\t{\n\t\t\t\t/* for CARDTYPE*/\n\t\t\t\tsnprintf(card_id_buf, sizeof(card_id_buf), \"%02dCARDTYPE%s\",\n\t\t\t\t\t\tcard_match_id, RFIC_word);\n\n\t\t\t\tif ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, card_id_buf)) != NULL)\n\t\t\t\t{\n\t\t\t\t\t/* we found the card ID*/\n\t\t\t\t\tLETTER_CASE_TRANSLATE(start_ptr, card_id_buf);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* the card is 1st plug-in, try to find the match card profile*/\n\t\t\tswitch(card_select_method)\n\t\t\t{\n\t\t\t\tcase MC_SELECT_CARDID: /* CARDID*/\n\t\t\t\tdefault:\n\t\t\t\t\tif (card_free_id >= 0)\n\t\t\t\t\t\tcard_match_id = card_free_id;\n\t\t\t\t\telse\n\t\t\t\t\t\tcard_match_id = card_nouse_id;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MC_SELECT_MAC: /* MAC*/\n\t\t\t\t\tsnprintf(card_id_buf, sizeof(card_id_buf), \"MAC%02x:%02x:%02x:%02x:%02x:%02x\",\n\t\t\t\t\t\t\tmac[0], mac[1], mac[2],\n\t\t\t\t\t\t\tmac[3], mac[4], mac[5]);\n\n\t\t\t\t\t/* try to find the key word in the card file */\n\t\t\t\t\tif ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, card_id_buf)) != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tLETTER_CASE_TRANSLATE(start_ptr, card_id_buf);\n\n\t\t\t\t\t\t/* get the row ID (2 ASCII characters) */\n\t\t\t\t\t\tstart_ptr -= 2;\n\t\t\t\t\t\tcard_id_buf[0] = *(start_ptr);\n\t\t\t\t\t\tcard_id_buf[1] = *(start_ptr+1);\n\t\t\t\t\t\tcard_id_buf[2] = 0x00;\n\n\t\t\t\t\t\tcard_match_id = simple_strtol(card_id_buf, 0, 10);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MC_SELECT_CARDTYPE: /* CARDTYPE*/\n\t\t\t\t\tcard_nouse_id = -1;\n\n\t\t\t\t\tfor(card_index=0;\n\t\t\t\t\t\tcard_index<MAX_NUM_OF_MULTIPLE_CARD;\n\t\t\t\t\t\tcard_index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tsnprintf(card_id_buf, sizeof(card_id_buf), \"%02dCARDTYPE%s\",\n\t\t\t\t\t\t\t\tcard_index, RFIC_word);\n\n\t\t\t\t\t\tif ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcard_id_buf)) != NULL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLETTER_CASE_TRANSLATE(start_ptr, card_id_buf);\n\n\t\t\t\t\t\t\tif (MC_CardUsed[card_index] == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* current the card profile is not used */\n\t\t\t\t\t\t\t\tif ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) &&\n\t\t\t\t\t\t\t\t\t(*(UINT16 *)&MC_CardMac[card_index][4] == 0))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* find it and no previous card use it*/\n\t\t\t\t\t\t\t\t\tcard_match_id = card_index;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* ever a card use it*/\n\t\t\t\t\t\t\t\t\tif (card_nouse_id < 0)\n\t\t\t\t\t\t\t\t\t\tcard_nouse_id = card_index;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* if not find a free one, use the available one*/\n\t\t\t\t\tif (card_match_id < 0)\n\t\t\t\t\t\tcard_match_id = card_nouse_id;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (card_match_id >= 0)\n\t\t{\n\t\t\t/* make up search keyword*/\n\t\t\tswitch(card_select_method)\n\t\t\t{\n\t\t\t\tcase MC_SELECT_CARDID: /* CARDID*/\n\t\t\t\t\tsnprintf(card_id_buf, sizeof(card_id_buf), \"%02dCARDID\", card_match_id);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MC_SELECT_MAC: /* MAC*/\n\t\t\t\t\tsnprintf(card_id_buf, sizeof(card_id_buf),\n\t\t\t\t\t\t\t\"%02dmac%02x:%02x:%02x:%02x:%02x:%02x\",\n\t\t\t\t\t\t\tcard_match_id,\n\t\t\t\t\t\t\tmac[0], mac[1], mac[2],\n\t\t\t\t\t\t\tmac[3], mac[4], mac[5]);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MC_SELECT_CARDTYPE: /* CARDTYPE*/\n\t\t\t\tdefault:\n\t\t\t\t\tsnprintf(card_id_buf, sizeof(card_id_buf), \"%02dcardtype%s\",\n\t\t\t\t\t\t\tcard_match_id, RFIC_word);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Search Keyword = %s\\n\", card_id_buf));\n\n\t\t\t/* read card file path*/\n\t\t\tif (RTMPGetKeyParameter(card_id_buf, tmpbuf, 256, buffer, TRUE))\n\t\t\t{\n\t\t\t\tif (strlen(tmpbuf) < sizeof(pAd->MC_FileName))\n\t\t\t\t{\n\t\t\t\t\t/* backup card information*/\n\t\t\t\t\tpAd->MC_RowID = card_match_id; /* base 0 */\n\t\t\t\t\tMC_CardUsed[card_match_id] = 1;\n\t\t\t\t\tmemcpy(MC_CardMac[card_match_id], mac, sizeof(mac));\n\n\t\t\t\t\t/* backup card file path*/\n\t\t\t\t\tNdisMoveMemory(pAd->MC_FileName, tmpbuf , strlen(tmpbuf));\n\t\t\t\t\tpAd->MC_FileName[strlen(tmpbuf)] = '\\0';\n\t\t\t\t\tflg_match_ok = TRUE;\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t(\"Card Profile Name = %s\\n\", pAd->MC_FileName));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t\t\t(\"Card Profile Name length too large!\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"Can not find search key word in card.dat!\\n\"));\n\t\t\t}\n\n\t\t\tif ((flg_match_ok != TRUE) &&\n\t\t\t\t(card_match_id < MAX_NUM_OF_MULTIPLE_CARD))\n\t\t\t{\n\t\t\t\tMC_CardUsed[card_match_id] = 0;\n\t\t\t\tmemset(MC_CardMac[card_match_id], 0, sizeof(mac));\n\t\t\t}\n\t\t} /* if (card_match_id >= 0)*/\n\t\t}\n\n\n/* close file*/\nretval = RtmpOSFileClose(srcf);\n\nfree_resource:\nRtmpOSFSInfoChange(&osFSInfo, FALSE);\n/*\tkfree(buffer);*/\n/*\tkfree(tmpbuf);*/\nos_free_mem(NULL, buffer);\nos_free_mem(NULL, tmpbuf);\n\nreturn flg_match_ok;\n}\n#endif /* MULTIPLE_CARD_SUPPORT */\n\n\n#ifdef WSC_INCLUDED\nvoid rtmp_read_wsc_user_parms(\n\tPWSC_CTRL pWscControl,\n\tSTRING *tmpbuf, \n\tSTRING *buffer)\n{\n\t\tif(RTMPGetKeyParameter(\"WscManufacturer\", tmpbuf, WSC_MANUFACTURE_LEN, buffer,TRUE))\n\t{\n\t\tNdisZeroMemory(pWscControl->RegData.SelfInfo.Manufacturer, WSC_MANUFACTURE_LEN);\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.Manufacturer, tmpbuf, strlen(tmpbuf));\n\t\t\tif(pWscControl->RegData.SelfInfo.Manufacturer[0] != 0x00)\n\t\tRTMP_SET_FLAG(pWscControl, 0x01);\n\t}\n\n\t/*WSC_User_ModelName*/\n\t\tif(RTMPGetKeyParameter(\"WscModelName\", tmpbuf, WSC_MODELNAME_LEN, buffer,TRUE))\n\t{\n\t\tNdisZeroMemory(pWscControl->RegData.SelfInfo.ModelName, WSC_MODELNAME_LEN);\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.ModelName, tmpbuf, strlen(tmpbuf));\n\t\t\tif(pWscControl->RegData.SelfInfo.ModelName[0] != 0x00)\n\t\tRTMP_SET_FLAG(pWscControl, 0x02);\n\t}\n\n\t/*WSC_User_DeviceName*/\n\t\tif(RTMPGetKeyParameter(\"WscDeviceName\", tmpbuf, WSC_DEVICENAME_LEN, buffer,TRUE))\n\t{\n\t\tNdisZeroMemory(pWscControl->RegData.SelfInfo.DeviceName, WSC_DEVICENAME_LEN);\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.DeviceName, tmpbuf, strlen(tmpbuf));\n\t\t\tif(pWscControl->RegData.SelfInfo.DeviceName[0] != 0x00)\n\t\tRTMP_SET_FLAG(pWscControl, 0x04);\n\t}\n\n\t/*WSC_User_ModelNumber*/\n\t\tif(RTMPGetKeyParameter(\"WscModelNumber\", tmpbuf, WSC_MODELNUNBER_LEN, buffer,TRUE))\n\t{\n\t\tNdisZeroMemory(pWscControl->RegData.SelfInfo.ModelNumber, WSC_MODELNUNBER_LEN);\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.ModelNumber, tmpbuf, strlen(tmpbuf));\n\t\t\tif(pWscControl->RegData.SelfInfo.ModelNumber[0] != 0x00)\n\t\tRTMP_SET_FLAG(pWscControl, 0x08);\n\t}\n\n\t/*WSC_User_SerialNumber*/\n\t\tif(RTMPGetKeyParameter(\"WscSerialNumber\", tmpbuf, WSC_SERIALNUNBER_LEN, buffer,TRUE))\n\t{\n\t\tNdisZeroMemory(pWscControl->RegData.SelfInfo.SerialNumber, WSC_SERIALNUNBER_LEN);\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.SerialNumber, tmpbuf, strlen(tmpbuf));\n\t\t\tif(pWscControl->RegData.SelfInfo.SerialNumber[0] != 0x00)\n\t\tRTMP_SET_FLAG(pWscControl, 0x10);\n\t}\n}\n\nvoid rtmp_read_wsc_user_parms_from_file(IN\tPRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)\n{\n\tPWSC_CTRL           pWscControl;\n\n#ifdef WSC_AP_SUPPORT\n\tint i=0;\n\tfor(i = 0; i < MAX_MBSSID_NUM(pAd); i++)\n\t{\n\t\tpWscControl = &pAd->ApCfg.MBSSID[i].WscControl;\n\t\trtmp_read_wsc_user_parms(pWscControl, tmpbuf, buffer);\n}\n#ifdef APCLI_SUPPORT\n\tpWscControl = &pAd->ApCfg.ApCliTab[0].WscControl;\n\trtmp_read_wsc_user_parms(pWscControl, tmpbuf, buffer);\n#endif /* APCLI_SUPPORT */\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\tpWscControl = &pAd->StaCfg.WscControl;\n\trtmp_read_wsc_user_parms(pWscControl, tmpbuf, buffer);\n#endif /* WSC_STA_SUPPORT */\n\n}\n#endif/*WSC_INCLUDED*/\n\n\nVOID rtmp_read_multest_from_file(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING tmpbuf,\n\tIN PSTRING buffer)\n{\n\tPSTRING\t\tmacptr;\n\tINT\t\t\ti=0, j;\n\tSTRING\t\ttok_str[16];\n\tBOOLEAN\t\tbUsePrevFormat = FALSE;\n\tUCHAR\t\tmacAddress[MAC_ADDR_LEN];\n\tUCHAR\t    keyMaterial[40];\t\n\tUCHAR\t\tKeyLen, CipherAlg = CIPHER_NONE, KeyIdx;\n\tPRT_802_11_WDS_ENTRY pWdsEntry;\n\t\t\n\t/*WdsPhyMode */\n\tif (RTMPGetKeyParameter(\"WdsPhyMode\", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))\n\t{\t\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\n\t        if ((strncmp(macptr, \"CCK\", 3) == 0) || (strncmp(macptr, \"cck\", 3) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].PhyMode = MODE_CCK;\n\t        else if ((strncmp(macptr, \"OFDM\", 4) == 0) || (strncmp(macptr, \"ofdm\", 4) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].PhyMode = MODE_OFDM;\n#ifdef DOT11_N_SUPPORT\n\t        else if ((strncmp(macptr, \"HTMIX\", 5) == 0) || (strncmp(macptr, \"htmix\", 5) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].PhyMode = MODE_HTMIX;\n\t        else if ((strncmp(macptr, \"GREENFIELD\", 10) == 0) || (strncmp(macptr, \"greenfield\", 10) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].PhyMode = MODE_HTGREENFIELD;\n#endif /* DOT11_N_SUPPORT */\n\t        else\n\t            pAd->MulTestTab.WdsEntry[i].PhyMode = 0xff;\n\t\t\n\t        DBGPRINT(RT_DEBUG_TRACE, (\"If/wds%d - WdsPhyMode=%d\\n\", i, pAd->MulTestTab.WdsEntry[i].PhyMode));\t    \n\t\t}\n\t}\n\t\n\t/*WdsList */\n\tif (RTMPGetKeyParameter(\"WdsList\", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))\n\t{\n\t\tfor (i=0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,\";\"), i++) \n\t\t{\t\t\t\t\n\t\t\tif(strlen(macptr) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t\t\tcontinue; \n\t\t\tif(strcmp(macptr,\"00:00:00:00:00:00\") == 0)\n\t\t\t\tcontinue; \n\t\t\tif(i >= MAX_WDS_ENTRY)\n\t\t\t\tbreak; \n\n\t\t\tfor (j=0; j<ETH_LENGTH_OF_ADDRESS; j++)\n\t\t\t{\n\t\t\t\tAtoH(macptr, &macAddress[j], 1);\n\t\t\t\tmacptr=macptr+3;\n\t\t\t}\t\n\n\t\t\t{\n\t\t\t\tINT iii;\n\t\t\t\tLONG WdsTabIdx = -1;\n\t\t\t\t\n\t\t\t\tfor (iii = 0; iii < MAX_WDS_ENTRY; iii++)\n\t\t\t\t{\n\t\t\t\t\tif (pAd->MulTestTab.WdsEntry[iii].Valid == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[iii].Valid = TRUE;\n\t\t\t\t\t\tpAd->MulTestTab.Size ++;\n\t\t\t\t\t\tCOPY_MAC_ADDR(pAd->MulTestTab.WdsEntry[iii].PeerWdsAddr, macAddress);\n\t\t\t\t\t\tWdsTabIdx = iii;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (MAC_ADDR_EQUAL(pAd->MulTestTab.WdsEntry[iii].PeerWdsAddr, macAddress))\n\t\t\t\t\t{\n\t\t\t\t\t\tWdsTabIdx = iii;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (iii == MAX_WDS_ENTRY)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Unable to allocate MulTestEntry.\\n\", __FUNCTION__));\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\n\t/*WdsEncrypType */\n\tif (RTMPGetKeyParameter(\"WdsEncrypType\", tmpbuf, 128, buffer, TRUE))\n\t{\t\t\t\t\n\t    for (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,\";\"), i++)\n\t    {\n\t        if ((strncmp(macptr, \"NONE\", 4) == 0) || (strncmp(macptr, \"none\", 4) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11WEPDisabled;\n\t        else if ((strncmp(macptr, \"WEP\", 3) == 0) || (strncmp(macptr, \"wep\", 3) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11WEPEnabled;\n\t        else if ((strncmp(macptr, \"TKIP\", 4) == 0) || (strncmp(macptr, \"tkip\", 4) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11Encryption2Enabled;\n\t        else if ((strncmp(macptr, \"AES\", 3) == 0) || (strncmp(macptr, \"aes\", 3) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11Encryption3Enabled;\n#ifdef WAPI_SUPPORT\n\t        else if ((strncmp(macptr, \"SMS4\", 4) == 0) || (strncmp(macptr, \"sms4\", 4) == 0))\n\t            pAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11EncryptionSMS4Enabled;\n#endif /* WAPI_SUPPORT */\n\t        else\n\t            pAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11WEPDisabled;\n\n\t        DBGPRINT(RT_DEBUG_TRACE, (\"WdsEncrypType[%d]=%d(%s)\\n\", i, pAd->MulTestTab.WdsEntry[i].WepStatus, GetEncryptType(pAd->MulTestTab.WdsEntry[i].WepStatus)));\n\t    }\n\t\t\n\t\t/* Previous WDS only supports single encryption type. */\n\t\t/* For backward compatible, other wds link encryption type shall be the same with the first. */\n\t\tif (i == 1)\n\t\t{\n\t\t\tfor (j = 1; j < MAX_WDS_ENTRY; j++)\n\t\t\t{\n\t\t\t\tpAd->MulTestTab.WdsEntry[j].WepStatus = pAd->MulTestTab.WdsEntry[0].WepStatus;\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"@WdsEncrypType[%d]=%d(%s)\\n\", j, pAd->MulTestTab.WdsEntry[i].WepStatus, GetEncryptType(pAd->MulTestTab.WdsEntry[i].WepStatus)));\t\n\t\t\t}\n\t\t}\n\t}\n\n\t/* WdsKey */\n\t/* This is a previous parameter and it only stores WPA key material, not WEP key */\n\tif (RTMPGetKeyParameter(\"WdsKey\", tmpbuf, 255, buffer, FALSE))\n\t{\t\t\t\n\t\tfor (i = 0; i < MAX_WDS_ENTRY; i++)\n\t\t\tNdisZeroMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey, sizeof(CIPHER_KEY));\n\n\t\tif (strlen(tmpbuf) > 0)\n\t\t\tbUsePrevFormat = TRUE;\n\n\t\t/* check if the wds-0 link key material is valid */\n\t\tif (((pAd->MulTestTab.WdsEntry[0].WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t|| (pAd->MulTestTab.WdsEntry[0].WepStatus == Ndis802_11Encryption3Enabled))\n\t\t\t&& (strlen(tmpbuf) >= 8) && (strlen(tmpbuf) <= 64))\n\t\t{\n\t\t\tRT_CfgSetWPAPSKKey(pAd, tmpbuf, strlen(tmpbuf), (PUCHAR)RALINK_PASSPHRASE, sizeof(RALINK_PASSPHRASE), keyMaterial);\n\t\t\tif (pAd->MulTestTab.WdsEntry[0].WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\tpAd->MulTestTab.WdsEntry[0].WdsKey.CipherAlg = CIPHER_AES;\n\t\t\telse\n\t\t\t\tpAd->MulTestTab.WdsEntry[0].WdsKey.CipherAlg = CIPHER_TKIP;\n\t\t\t\n\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[0].WdsKey.Key, keyMaterial, 16);\n\t\t\tpAd->MulTestTab.WdsEntry[0].WdsKey.KeyLen = 16;\n\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[0].WdsKey.RxMic, keyMaterial+16, 8);\n\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[0].WdsKey.TxMic, keyMaterial+16, 8);\n\t\t}\n\n\t\t/* Previous WDS only supports single key-material. */\n\t\t/* For backward compatible, other wds link key-material shall be the same with the first. */\n\t\tif (pAd->MulTestTab.WdsEntry[0].WdsKey.KeyLen == 16)\n\t\t{\n\t\t\tfor (j = 1; j < MAX_WDS_ENTRY; j++)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[j].WdsKey, &pAd->MulTestTab.WdsEntry[0].WdsKey, sizeof(CIPHER_KEY));\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t\n\t}\n\n\t/* The parameters can provide different key information for each WDS-Link */\n\t/* no matter WEP or WPA */\n\tif (!bUsePrevFormat)\n\t{\n\t\tfor (i = 0; i < MAX_WDS_ENTRY; i++)\n\t\t{\n\t\t\tAP_WDS_KeyNameMakeUp(tok_str, sizeof(tok_str), i);\n\n\t\t\t/* WdsXKey (X=0~MAX_WDS_ENTRY-1) */\n\t\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))\n\t\t\t{\t\t\t\n\t\t\t\tif (pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11Encryption1Enabled)\n\t\t\t\t{\n\t\t\t\t\t/* Ascii type */\n\t\t\t\t\tif (strlen(tmpbuf) == 5 || strlen(tmpbuf) == 13)\n\t\t\t\t\t{\t\t\n\t\t\t\t\t\tKeyLen = strlen(tmpbuf);\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.KeyLen = KeyLen;\n\t\t\t\t\t\tNdisMoveMemory(pAd->MulTestTab.WdsEntry[i].WdsKey.Key, tmpbuf, KeyLen);\n\t\t\t\t\t\tif (KeyLen == 5)\n\t\t\t\t\t\t\tCipherAlg = CIPHER_WEP64;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tCipherAlg = CIPHER_WEP128;\t\n\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.CipherAlg = CipherAlg;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF/wds%d Key=%s ,type=Ascii, CipherAlg(%s)\\n\", i, tmpbuf, (CipherAlg == CIPHER_WEP64 ? \"wep64\" : \"wep128\")));\n\t\t\t\t\t}\n\t\t\t\t\t/* Hex type */\n\t\t\t\t\telse if (strlen(tmpbuf) == 10 || strlen(tmpbuf) == 26)\n\t\t\t\t\t{\t\t\n\t\t\t\t\t\tKeyLen = strlen(tmpbuf);\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.KeyLen = KeyLen / 2;\n\t\t\t\t\t\tAtoH(tmpbuf, pAd->MulTestTab.WdsEntry[i].WdsKey.Key, KeyLen / 2);\t\t\t\t\t\t\n\t\t\t\t\t\tif (KeyLen == 10)\n\t\t\t\t\t\t\tCipherAlg = CIPHER_WEP64;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tCipherAlg = CIPHER_WEP128;\t\n\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.CipherAlg = CipherAlg;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF/wds%d Key=%s ,type=Hex, CipherAlg(%s)\\n\", i, tmpbuf, (CipherAlg == CIPHER_WEP64 ? \"wep64\" : \"wep128\")));\n\t\t\t\t\t}\n\t\t\t\t\t/* Invalid type */\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t\t\t\tNdisZeroMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey, sizeof(CIPHER_KEY));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF/wds%d has invalid key for WEP, reset encryption to OPEN\\n\", i));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t\t|| (pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11Encryption3Enabled)\n#ifdef WAPI_SUPPORT\n\t\t\t\t\t|| (pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11EncryptionSMS4Enabled)\n#endif /* WAPI_SUPPORT */\n\t\t\t\t\t)\t\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tif ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) <= 64))\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_CfgSetWPAPSKKey(pAd, tmpbuf, strlen(tmpbuf), (PUCHAR) RALINK_PASSPHRASE, sizeof(RALINK_PASSPHRASE), keyMaterial);\n\n\t\t\t\t\t\tif (pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.CipherAlg = CIPHER_AES;\n\t\t\t\t\t\t\tCipherAlg = CIPHER_AES;\n\t\t\t\t\t\t}\n#ifdef WAPI_SUPPORT\n\t\t\t\t\t\telse if (pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.CipherAlg = CIPHER_SMS4;\n\t\t\t\t\t\t\tCipherAlg = CIPHER_SMS4;\n\t\t\t\t\t\t}\n#endif /* WAPI_SUPPORT */\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.CipherAlg = CIPHER_TKIP;\n\t\t\t\t\t\t\tCipherAlg = CIPHER_TKIP;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey.Key, keyMaterial, 16);\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WdsKey.KeyLen = 16;\n\t\t\t\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey.RxMic, keyMaterial+16, 8);\n\t\t\t\t\t\tNdisMoveMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey.TxMic, keyMaterial+16, 8);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF/wds%d Key=%s, CipherAlg(%s)\\n\", i, tmpbuf, (CipherAlg == CIPHER_AES ? \"AES\" : \"TKIP\")));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF/wds%d has invalid key for WPA, reset encryption to OPEN\\n\", i));\n\t\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t\t\t\tNdisZeroMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey, sizeof(CIPHER_KEY));\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tpAd->MulTestTab.WdsEntry[i].WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t\t\tNdisZeroMemory(&pAd->MulTestTab.WdsEntry[i].WdsKey, sizeof(CIPHER_KEY));\n\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\t/* WdsDefaultKeyID */\n\tif(RTMPGetKeyParameter(\"WdsDefaultKeyID\", tmpbuf, 10, buffer, TRUE))\n\t{\n\t\tfor (i = 0, macptr = rstrtok(tmpbuf,\";\"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,\";\"), i++)\n\t\t{\n\t\t\tKeyIdx = (UCHAR) simple_strtol(macptr, 0, 10);\n\t\t\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\t\t\tpAd->MulTestTab.WdsEntry[i].KeyIdx = (UCHAR) (KeyIdx - 1);\n\t\t\telse\n\t\t\t\tpAd->MulTestTab.WdsEntry[i].KeyIdx = 0;\n\n\t\t\tif ((pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t\t|| (pAd->MulTestTab.WdsEntry[i].WepStatus == Ndis802_11Encryption3Enabled))\n\t\t\t\tpAd->MulTestTab.WdsEntry[i].KeyIdx = 0;\t\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF/wds%d - WdsDefaultKeyID(0~3)=%d\\n\", i, pAd->MulTestTab.WdsEntry[i].KeyIdx));\t\n\t\t}\t\t\t\t\n\t}\n}\n\n\n#ifdef SINGLE_SKU_V2\nNDIS_STATUS\tRTMPSetSingleSKUParameters(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tPSTRING buffer;\n\tPSTRING\t\treadline, token;\n\tRTMP_OS_FD srcf;\n\tINT retval;\n\tPSTRING ptr;\n\tint index, i;\n\tCH_POWER *StartCh = NULL;\n\tUCHAR MaxPwr;\n\tUCHAR channel, *temp;\n\tRTMP_OS_FS_INFO osFSInfo;\n\n\tDlListInit(&pAd->SingleSkuPwrList);\n\n\t/* init*/\n\tos_alloc_mem(NULL, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE);\n\tif (buffer == NULL)\n\t\treturn FALSE;\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\t/* open card information file*/\n\tsrcf = RtmpOSFileOpen(SINGLE_SKU_TABLE_FILE_NAME, O_RDONLY, 0);\n\tif (IS_FILE_OPEN_ERR(srcf)) \n\t{\n\t\t/* card information file does not exist */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"--> Error opening %s\\n\", SINGLE_SKU_TABLE_FILE_NAME));\n\t\tgoto  free_resource;\n\t}\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\tif (pAd->TxPowerCtrl.bInternalTxALC != TRUE)\n#endif /* RTMP_INTERNAL_TX_ALC */\n\t\tMT7601_InitPAModeTable(pAd);\n\n\t/* card information file exists so reading the card information */\n\tNdisZeroMemory(buffer, MAX_INI_BUFFER_SIZE);\n\tretval = RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);\n\tif (retval < 0)\n\t{\n\t\t/* read fail */\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"--> Read %s error %d\\n\", SINGLE_SKU_TABLE_FILE_NAME, -retval));\n\t}\n\telse\n\t{\n\n\t\tfor ( readline = ptr = buffer, index=0; (ptr = strchr(readline, '\\n')) != NULL; readline = ptr + 1, index++ )\n\t\t{\n\t\t\t*ptr = '\\0';\n\t\t\t\n\t\t\tif ( readline[0] == '#' )\n\t\t\t\tcontinue;\n\n\t\t\tif ( !strncmp(readline, \"ch\", 2) )\n\t\t\t{\n\n\t\t\t\tCH_POWER *pwr;\n\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pwr, sizeof(*pwr));\n\t\t\t\tNdisZeroMemory(pwr, sizeof(*pwr));\n\n\t\t\t\ttoken= rstrtok(readline +2 ,\" \");\n\t\t\t\tchannel = simple_strtol(token, 0, 10);\n\t\t\t\tpwr->StartChannel = channel;\n\n\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_CCK_LENGTH ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttoken = rstrtok(NULL ,\" \");\n\t\t\t\t\tif ( token == NULL )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tpwr->PwrCCK[i] = simple_strtol(token, 0, 10) * 2;\n\t\t\t\t}\n\n\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_OFDM_LENGTH ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttoken = rstrtok(NULL ,\" \");\n\t\t\t\t\tif ( token == NULL )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tpwr->PwrOFDM[i] = simple_strtol(token, 0, 10) *2;\n\t\t\t\t}\n\n\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttoken = rstrtok(NULL ,\" \");\n\t\t\t\t\tif ( token == NULL )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tpwr->PwrHT20[i] = simple_strtol(token, 0, 10) *2;\n\t\t\t\t}\n\n\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttoken = rstrtok(NULL ,\" \");\n\t\t\t\t\tif ( token == NULL )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tpwr->PwrHT40[i] = simple_strtol(token, 0, 10) *2;\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\tif ( StartCh == NULL )\n\t\t\t\t{\n\t\t\t\t\tStartCh = pwr;\n\t\t\t\t\tDlListAddTail(&pAd->SingleSkuPwrList, &pwr->List);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN isSame = TRUE;\n\n\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_CCK_LENGTH ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( StartCh->PwrCCK[i] != pwr->PwrCCK[i] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tisSame = FALSE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isSame == TRUE )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_OFDM_LENGTH ; i++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( StartCh->PwrOFDM[i] != pwr->PwrOFDM[i] )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tisSame = FALSE;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isSame == TRUE )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( StartCh->PwrHT20[i] != pwr->PwrHT20[i] )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tisSame = FALSE;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isSame == TRUE )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( StartCh->PwrHT40[i] != pwr->PwrHT40[i] )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tisSame = FALSE;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isSame == TRUE )\n\t\t\t\t\t{\n\t\t\t\t\t\tos_free_mem(NULL, pwr);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tStartCh = pwr;\n\t\t\t\t\t\tDlListAddTail(&pAd->SingleSkuPwrList, &StartCh->List);\n\t\t\t\t\t\tpwr = NULL;\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\n\n\t\t\t\tStartCh->num ++;\n\t\t\t\tos_alloc_mem(pAd, (PUCHAR *)&temp, StartCh->num);\n\t\t\t\tif ( StartCh->Channel != NULL )\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(temp, StartCh->Channel, StartCh->num-1);\n\t\t\t\t\tos_free_mem(pAd, StartCh->Channel);\n\t\t\t\t}\n\t\t\t\tStartCh->Channel = temp;\n\t\t\t\tStartCh->Channel[StartCh->num-1] = channel;\n\t\t\t}\n\t\t}\n\n\n\t}\n\n\t{\n\t\tCH_POWER *ch, *ch_temp;\n\t\tDlListForEachSafe(ch, ch_temp, &pAd->SingleSkuPwrList, CH_POWER, List)\n\t\t{\n\t\t\tint i;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"start ch = %d, ch->num = %d\\n\", ch->StartChannel, ch->num));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel: \"));\n\t\t\tfor ( i = 0 ; i < ch->num ; i++ )\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%d \", ch->Channel[i]));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n\"));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CCK: \"));\n\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_CCK_LENGTH ; i++ )\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%d \", ch->PwrCCK[i]));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n\"));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OFDM: \"));\n\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_OFDM_LENGTH ; i++ )\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%d \", ch->PwrOFDM[i]));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n\"));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT20: \"));\n\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%d \", ch->PwrHT20[i]));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n\"));\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"HT40: \"));\n\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%d \", ch->PwrHT40[i]));\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n\"));\n\n\t\t}\n\t}\n\n\t/* close file*/\n\tretval = RtmpOSFileClose(srcf);\n\nfree_resource:\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\n\tos_free_mem(NULL, buffer);\n\n}\n\n\nUCHAR GetSkuChannelBasePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR \t\t\tchannel)\n{\n\tCH_POWER *ch, *ch_temp;\n\tUCHAR start_ch;\n\tUCHAR base_pwr = pAd->DefaultTargetPwr;\n\tUINT8 i, j;\n\t\n\tDlListForEachSafe(ch, ch_temp, &pAd->SingleSkuPwrList, CH_POWER, List)\n\t{\n\t\tstart_ch = ch->StartChannel;\n\n\t\tif ( channel >= start_ch )\n\t\t{\n\t\t\tfor ( j = 0; j < ch->num; j++ )\n\t\t\t{\n\t\t\t\tif ( channel == ch->Channel[j] )\n\t\t\t\t{\n\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_CCK_LENGTH ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( base_pwr > ch->PwrCCK[i] )\n\t\t\t\t\t\t\tbase_pwr = ch->PwrCCK[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_OFDM_LENGTH ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( base_pwr > ch->PwrOFDM[i] )\n\t\t\t\t\t\t\tbase_pwr = ch->PwrOFDM[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( base_pwr > ch->PwrHT20[i] )\n\t\t\t\t\t\t\tbase_pwr = ch->PwrHT20[i];\n\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( i= 0 ; i < SINGLE_SKU_TABLE_HT_LENGTH ; i++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( ch->PwrHT40[i] == 0 )\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tif ( base_pwr > ch->PwrHT40[i] )\n\t\t\t\t\t\t\t\tbase_pwr = ch->PwrHT40[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn base_pwr;\n\n}\n\n#define\tSKU_PHYMODE_CCK_1M_2M\t\t\t\t0\n#define\tSKU_PHYMODE_CCK_5M_11M\t\t\t\t1\n#define\tSKU_PHYMODE_OFDM_6M_9M\t\t\t\t2\n#define\tSKU_PHYMODE_OFDM_12M_18M\t\t\t3\n#define\tSKU_PHYMODE_OFDM_24M_36M\t\t\t4\n#define\tSKU_PHYMODE_OFDM_48M_54M\t\t\t5\n#define\tSKU_PHYMODE_HT_MCS0_MCS1\t\t\t6\n#define\tSKU_PHYMODE_HT_MCS2_MCS3\t\t\t7\n#define\tSKU_PHYMODE_HT_MCS4_MCS5\t\t\t8\n#define\tSKU_PHYMODE_HT_MCS6_MCS7\t\t\t9\n#define\tSKU_PHYMODE_HT_MCS8_MCS9\t\t\t10\n#define\tSKU_PHYMODE_HT_MCS10_MCS11\t\t\t11\n#define\tSKU_PHYMODE_HT_MCS12_MCS13\t\t\t12\n#define\tSKU_PHYMODE_HT_MCS14_MCS15\t\t\t13\n#define\tSKU_PHYMODE_STBC_MCS0_MCS1\t\t\t14\n#define\tSKU_PHYMODE_STBC_MCS2_MCS3\t\t\t15\n#define\tSKU_PHYMODE_STBC_MCS4_MCS5\t\t\t16\n#define\tSKU_PHYMODE_STBC_MCS6_MCS7\t\t\t17\n\n\nVOID InitSkuRateDiffTable(\n\tIN PRTMP_ADAPTER \tpAd )\n{\n\tUSHORT\t\ti, value;\n\tCHAR\t\tBasePwr, Pwr;\n\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + 4, value);\n\tBasePwr = (value >> 8) & 0xFF;\n\tBasePwr = (BasePwr > 0x1F ) ? BasePwr - 0x40: BasePwr;\n\n\tfor ( i = 0 ; i < 9; i++ )\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*2, value);\n\t\tPwr = value & 0xFF ;\n\t\tPwr = (Pwr > 0x1F ) ? Pwr - 0x40: Pwr;\n\t\tpAd->SingleSkuRatePwrDiff[i *2] = Pwr - BasePwr;\n\t\tPwr = (value >> 8) & 0xFF;\n\t\tPwr = (Pwr > 0x1F ) ? Pwr - 0x40: Pwr;\n\t\tpAd->SingleSkuRatePwrDiff[i *2 + 1] = Pwr - BasePwr;\n\t}\n}\n\nINT32 GetSkuPAModePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR\t\t\tPAMode)\n{\n\tINT32 pa_mode_pwr = 0;\n\t\n\tswitch ( PAMode )\n\t{\n\t\tcase SKU_PHYMODE_CCK_1M_2M:\n\t\t\tpa_mode_pwr = RF_PA_MODE_CCK_1M;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_CCK_5M_11M:\n\t\t\tpa_mode_pwr = RF_PA_MODE_CCK_5M;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_OFDM_6M_9M:\n\t\t\tpa_mode_pwr = RF_PA_MODE_OFDM_6M;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_OFDM_12M_18M:\n\t\t\tpa_mode_pwr = RF_PA_MODE_OFDM_12M;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_OFDM_24M_36M:\n\t\t\tpa_mode_pwr = RF_PA_MODE_OFDM_24M;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_OFDM_48M_54M:\n\t\t\tpa_mode_pwr = RF_PA_MODE_OFDM_48M;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS0_MCS1:\n\t\tcase SKU_PHYMODE_STBC_MCS0_MCS1:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS0;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS2_MCS3:\n\t\tcase SKU_PHYMODE_STBC_MCS2_MCS3:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS2;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS4_MCS5:\n\t\tcase SKU_PHYMODE_STBC_MCS4_MCS5:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS4;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS6_MCS7:\n\t\tcase SKU_PHYMODE_STBC_MCS6_MCS7:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS6;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS8_MCS9:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS8;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS10_MCS11:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS10;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS12_MCS13:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS12;\n\t\t\tbreak;\n\t\tcase SKU_PHYMODE_HT_MCS14_MCS15:\n\t\t\tpa_mode_pwr = RF_PA_MODE_HT_MCS14;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn pa_mode_pwr;\n}\n\n\nUCHAR GetSkuRatePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN CHAR \t\t\t\tphymode,\n\tIN UCHAR \t\t\tchannel,\n\tIN UCHAR\t\t\tbw)\n{\n\tUINT8 i;\n\tCH_POWER *ch, *ch_temp;\n\tUCHAR start_ch;\n\tUCHAR rate_pwr = pAd->DefaultTargetPwr;\n\tUCHAR max_pwr;\n\tINT32 pwr_diff;\n\n\tDlListForEachSafe(ch, ch_temp, &pAd->SingleSkuPwrList, CH_POWER, List)\n\t{\n\t\tstart_ch = ch->StartChannel;\n\n\t\tif ( channel >= start_ch )\n\t\t{\n\t\t\tfor ( i = 0; i < ch->num; i++ )\n\t\t\t{\n\t\t\t\tif ( channel == ch->Channel[i] )\n\t\t\t\t{\n\t\t\t\t\tswitch ( phymode )\n\t\t\t\t\t{\n\t\t\t\t\t\tcase SKU_PHYMODE_CCK_1M_2M:\n\t\t\t\t\t\t\trate_pwr = ch->PwrCCK[0];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_CCK_5M_11M:\n\t\t\t\t\t\t\trate_pwr = ch->PwrCCK[2];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_OFDM_6M_9M:\n\t\t\t\t\t\t\trate_pwr = ch->PwrOFDM[0];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_OFDM_12M_18M:\n\t\t\t\t\t\t\trate_pwr = ch->PwrOFDM[2];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_OFDM_24M_36M:\n\t\t\t\t\t\t\trate_pwr = ch->PwrOFDM[4];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_OFDM_48M_54M:\n\t\t\t\t\t\t\trate_pwr = ch->PwrOFDM[6];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS0_MCS1:\n\t\t\t\t\t\tcase SKU_PHYMODE_STBC_MCS0_MCS1:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[0];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[0];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS2_MCS3:\n\t\t\t\t\t\tcase SKU_PHYMODE_STBC_MCS2_MCS3:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[2];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[2];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS4_MCS5:\n\t\t\t\t\t\tcase SKU_PHYMODE_STBC_MCS4_MCS5:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[4];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[4];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS6_MCS7:\n\t\t\t\t\t\tcase SKU_PHYMODE_STBC_MCS6_MCS7:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[6];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[6];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS8_MCS9:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[8];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[8];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS10_MCS11:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[10];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[10];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS12_MCS13:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[12];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[12];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SKU_PHYMODE_HT_MCS14_MCS15:\n\t\t\t\t\t\t\tif ( bw == BW_20 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT20[14];\n\t\t\t\t\t\t\telse if ( bw == BW_40 )\n\t\t\t\t\t\t\t\trate_pwr = ch->PwrHT40[14];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpwr_diff = GetSkuPAModePwr(pAd, phymode) + (pAd->SingleSkuRatePwrDiff[phymode] << 12) + 2048;\n\tpwr_diff = pwr_diff >> 12;\n\tmax_pwr = pAd->DefaultTargetPwr + pwr_diff;\n\n\tif ( rate_pwr > max_pwr )\n\t\trate_pwr = max_pwr;\n\n\treturn rate_pwr;\n\n}\n\n\nVOID UpdateSkuRatePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR \t\t\tchannel,\n\tIN UCHAR\t\t\tbw,\n\tIN CHAR\t\t\t\tbase_pwr)\n{\n\tINT32\tsku_rate_pwr;\n\tINT32\trate_pwr;\n\tINT32\tmcs_digital_pwr, pa_mode_pwr, diff_pwr;\n\tUINT32\tdata, Adata, Gdata;\n\tUCHAR \tBBPR4, BBPR178;\n\tUCHAR\ti;\n\tCHAR\trate_table[18];\n\n\tprintk(\"channel = %d, bw = %d\\n\", channel, bw);\n\n\tfor ( i = 0 ; i < 18; i++ )\n\t{\n\t\tsku_rate_pwr = GetSkuRatePwr(pAd, i, channel, bw);\n\t\tprintk(\"sku_rate_pwr = %d\", sku_rate_pwr);\n\t\tsku_rate_pwr = sku_rate_pwr << 12;\t\t\t// sku_rate_power * 4096\n\t\tprintk(\"\\tsku_rate_pwr = %d\\n\", sku_rate_pwr);\n\n\t\tif ( i < SKU_PHYMODE_CCK_5M_11M )\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPR4);\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R178, &BBPR178);\n\t\t\tif ( BBPR4 & 0x20 )\n\t\t\t{\n\t\t\t\tif ( BBPR178 == 0 )\n\t\t\t\t{\n\t\t\t\t\tmcs_digital_pwr = 9830;\t\t// 8192 * 1.2\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmcs_digital_pwr = 18022;\t\t// 8192 * 2.2\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( BBPR178 == 0 )\n\t\t\t\t{\n\t\t\t\t\tmcs_digital_pwr = 24576;\t\t// 8192 * 3\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmcs_digital_pwr = 819;\t\t\t/// 8192 * 0.1\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmcs_digital_pwr = 0;\n\t\t}\n\n\t\tpa_mode_pwr = GetSkuPAModePwr(pAd, i);\n\n\t\tprintk(\"base_pwr = %d\", base_pwr);\n\t\trate_pwr = base_pwr << 12;\n\t\tprintk(\"\\t base_pwr = %d\\n\", rate_pwr);\n\t\tprintk(\"mcs_digital_pwr = %d\\n\", mcs_digital_pwr);\n\t\tprintk(\"pa_mode_pwr = %d\\n\", pa_mode_pwr);\n\t\trate_pwr = rate_pwr + mcs_digital_pwr + pa_mode_pwr;\n\t\tprintk(\"rate_pwr = %d\\n\", rate_pwr);\n\t\tdiff_pwr = sku_rate_pwr - rate_pwr;\n\t\tprintk(\"diff_pwr = %d\", diff_pwr);\n\t\tdiff_pwr = diff_pwr >> 12;\n\t\tprintk(\"\\tdiff_pwr = %d\\n\", diff_pwr);\n\n\t\trate_table[i] = diff_pwr -1;\n\t}\n\n\tfor ( i = 0 ; i < 5; i++ )\n\t{\n\t\tdata = 0;\n\t\tAdata = 0;\n\t\tGdata = 0;\n\n\t\tdata = (rate_table[i*4] & 0x3F )+ ((rate_table[i*4 + 1] &0x3F) << 8);\n\t\tAdata = ((rate_table[i*4] + pAd->chipCap.Apwrdelta ) & 0x3F )+ ( ((rate_table[i*4 + 1] + pAd->chipCap.Apwrdelta) & 0x3F) << 8);\n\t\tGdata = ((rate_table[i*4] + pAd->chipCap.Gpwrdelta ) & 0x3F ) + ( ((rate_table[i*4 + 1] + pAd->chipCap.Gpwrdelta) & 0x3F) << 8);\n\t\t\n\t\tif ( i != 4 )\n\t\t{\n\t\t\tdata |= ((rate_table[i*4 + 2] &0x3F) << 16 )+ ((rate_table[i*4 + 3] & 0x3F) << 24);\n\t\t\tAdata |= ( ((rate_table[i*4 + 2] + pAd->chipCap.Apwrdelta ) & 0x3F) << 16) + ( ((rate_table[i*4 + 3] + pAd->chipCap.Apwrdelta) & 0x3F) << 24);\n\t\t\tGdata |= ( ((rate_table[i*4 + 2] + pAd->chipCap.Gpwrdelta ) & 0x3F) << 16) + ( ((rate_table[i*4 + 3] + pAd->chipCap.Gpwrdelta) & 0x3F) << 24);\n\t\t}\n\n\t\t/* For 20M/40M Power Delta issue */\t\t\n\t\tpAd->Tx20MPwrCfgABand[i] = data;\n\t\tpAd->Tx20MPwrCfgGBand[i] = data;\n\t\tpAd->Tx40MPwrCfgABand[i] = Adata;\n\t\tpAd->Tx40MPwrCfgGBand[i] = Gdata;\n\n\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);\n\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"20MHz BW, 2.4G band-%08x,  Adata = %08x,  Gdata = %08x \\n\", data, Adata, Gdata));\n\t}\n\n\t/* Extra set MAC registers to compensate Tx power if any */\n\tRTMP_CHIP_ASIC_EXTRA_POWER_OVER_MAC(pAd);\n\n}\n\n\n#endif /* SINGLE_SKU_V2 */\n\n"
  },
  {
    "path": "src/common/cmm_radar.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    cmm_radar.c\n\n    Abstract:\n    CS/DFS common functions.\n\n    Revision History:\n    Who       When            What\n    --------  ----------      ----------------------------------------------\n*/\n#include \"rt_config.h\"\n\n/*----- 802.11H -----*/\n\n/* Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt()*/\n/* Before switch channel, driver needs doing channel switch announcement.*/\nVOID RadarDetectPeriodic(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\t/* need to check channel availability, after switch channel*/\n\tif (pAd->Dot11_H.RDMode != RD_SILENCE_MODE)\n\t\t\treturn;\n\n\t/* channel availability check time is 60sec, use 65 for assurance*/\n\tif (pAd->Dot11_H.RDCount++ > pAd->Dot11_H.ChMovingTime)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Not found radar signal, start send beacon and radar detection in service monitor\\n\\n\"));\n\t\tAsicEnableBssSync(pAd);\n\t\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\t\treturn;\n\t}\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tRadar channel check routine\n\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\n\tReturn Value:\n\t\tTRUE\tneed to do radar detect\n\t\tFALSE\tneed not to do radar detect\n\n\t========================================================================\n*/\nBOOLEAN RadarChannelCheck(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tCh)\n{\n\tINT \ti;\n\tBOOLEAN result = FALSE;\n\n\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t{\n\t\tif (Ch == pAd->ChannelList[i].Channel)\n\t\t{\n\t\t\tresult = pAd->ChannelList[i].DfsReq;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nULONG JapRadarType(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tULONG\t\ti;\n\tconst UCHAR\tChannel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};\n\n\tif (pAd->CommonCfg.RDDurRegion != JAP)\n\t{\n\t\treturn pAd->CommonCfg.RDDurRegion;\n\t}\n\n\tfor (i=0; i<15; i++)\n\t{\n\t\tif (pAd->CommonCfg.Channel == Channel[i])\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i < 4)\n\t\treturn JAP_W53;\n\telse if (i < 15)\n\t\treturn JAP_W56;\n\telse\n\t\treturn JAP; /* W52*/\n\n}\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tChannel switching count down process upon radar detection\n\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\n\t========================================================================\n*/\nVOID ChannelSwitchingCountDownProc(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():Channel Switching...(%d/%d)\\n\",\n\t\t\t\t__FUNCTION__, pAd->Dot11_H.CSCount, pAd->Dot11_H.CSPeriod));\n\t\n\tpAd->Dot11_H.CSCount++;\n\tif (pAd->Dot11_H.CSCount >= pAd->Dot11_H.CSPeriod)\n\t{\n#ifdef DFS_SUPPORT\n\t\tpAd->CommonCfg.RadarDetect.DFSAPRestart = 1;\n\t\tschedule_dfs_task(pAd);\n#else\n\t\tAPStop(pAd);\n\t\tAPStartUp(pAd);\n#endif /* !DFS_SUPPORT */\t\t\n\t}\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n/* \n    ==========================================================================\n    Description:\n        Set channel switch Period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_CSPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->Dot11_H.CSPeriod = (USHORT) simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CSPeriod_Proc::(CSPeriod=%d)\\n\", pAd->Dot11_H.CSPeriod));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n\t\tchange channel moving time for DFS testing.\n\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set ChMovTime=[value]\n    ==========================================================================\n*/\nINT Set_ChMovingTime_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tUINT8 Value;\n\n\tValue = (UINT8) simple_strtol(arg, 0, 10);\n\n\tpAd->Dot11_H.ChMovingTime = Value;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: %d\\n\", __FUNCTION__,\n\t\tpAd->Dot11_H.ChMovingTime));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n\t\tReset channel block status.\n\tArguments:\n\t    pAd\t\t\t\tPointer to our adapter\n\t    arg\t\t\t\tNot used\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set ChMovTime=[value]\n    ==========================================================================\n*/\nINT Set_BlockChReset_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tINT i;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Reset channel block status.\\n\", __FUNCTION__));\t\n\t\n\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t\tpAd->ChannelList[i].RemainingTimeForUse = 0;\n\n\treturn TRUE;\n}\n\n\n#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)\n\nINT\tSet_RadarShow_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef DFS_SUPPORT\n\tint i;\n\tUINT8 idx;\n\tPRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;\n\tPDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;\n\tPDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;\n\n\t\tprintk(\"DFSUseTasklet = %d\\n\", pRadarDetect->use_tasklet);\n\t\tprintk(\"McuRadarDebug = %x\\n\", (unsigned int)pRadarDetect->McuRadarDebug);\n\t\tprintk(\"PollTime = %d\\n\", pRadarDetect->PollTime);\n\t\tprintk(\"ChEnable = %d (0x%x)\\n\", pDfsProgramParam->ChEnable, pDfsProgramParam->ChEnable);\n\t\tprintk(\"DeltaDelay = %d\\n\", pDfsProgramParam->DeltaDelay);\n\t\tprintk(\"Fcc5Thrd = %d\\n\", pDfsSwParam->fcc_5_threshold);\n\t\tprintk(\"PeriodErr = %d\\n\", pDfsSwParam->dfs_period_err);\n\t\tprintk(\"MaxPeriod = %d\\n\", (unsigned int)pDfsSwParam->dfs_max_period);\n\t\tprintk(\"Ch0LErr = %d\\n\", pDfsSwParam->dfs_width_ch0_err_L);\n\t\tprintk(\"Ch0HErr = %d\\n\", pDfsSwParam->dfs_width_ch0_err_H);\n\t\tprintk(\"Ch1Shift = %d\\n\", pDfsSwParam->dfs_width_diff_ch1_Shift);\n\t\tprintk(\"Ch2Shift = %d\\n\", pDfsSwParam->dfs_width_diff_ch2_Shift);\n\t\t/*printk(\"CeSwCheck = %d\\n\", pAd->CommonCfg.ce_sw_check);*/\n\t\t/*printk(\"CEStagCheck = %d\\n\", pAd->CommonCfg.ce_staggered_check);*/\n\t\t/*printk(\"HWDFSDisabled = %d\\n\", pAd->CommonCfg.hw_dfs_disabled);*/\n\t\tprintk(\"DfsRssiHigh = %d\\n\", pRadarDetect->DfsRssiHigh);\n\t\tprintk(\"DfsRssiLow = %d\\n\", pRadarDetect->DfsRssiLow);\n\t\tprintk(\"DfsSwDisable = %u\\n\", pRadarDetect->bDfsSwDisable);\n\t\tprintk(\"CheckLoop = %d\\n\", pDfsSwParam->dfs_check_loop);\n\t\tprintk(\"DeclareThres = %d\\n\", pDfsSwParam->dfs_declare_thres);\n\t\tfor (i =0; i < pRadarDetect->fdf_num; i++)\n\t\t{\n\t\t\tprintk(\"ChBusyThrd[%d] = %d\\n\", i, pRadarDetect->ch_busy_threshold[i]);\n\t\t\tprintk(\"RssiThrd[%d] = %d\\n\", i, pRadarDetect->rssi_threshold[i]);\n\t\t}\n\t\tfor (idx=0; idx < pAd->chipCap.DfsEngineNum; idx++)\n\t\t\tprintk(\"sw_idx[%u] = %u\\n\", idx, pDfsSwParam->sw_idx[idx]);\n\t\tfor (idx=0; idx < pAd->chipCap.DfsEngineNum; idx++)\n\t\t\tprintk(\"hw_idx[%u] = %u\\n\", idx, pDfsSwParam->hw_idx[idx]);\n#ifdef DFS_DEBUG\n\t\tprintk(\"Total[0] = %lu\\n\", pDfsSwParam->TotalEntries[0]);\n\t\tprintk(\"Total[1] = %lu\\n\", pDfsSwParam->TotalEntries[1]);\n\t\tprintk(\"Total[2] = %lu\\n\", pDfsSwParam->TotalEntries[2]);\n\t\tprintk(\"Total[3] = %lu\\n\", pDfsSwParam->TotalEntries[3]);\n\n\t\tpDfsSwParam->TotalEntries[0] = pDfsSwParam->TotalEntries[1] = pDfsSwParam->TotalEntries[2] = pDfsSwParam->TotalEntries[3] = 0;\n\n\t\tprintk(\"T_Matched_2 = %lu\\n\", pDfsSwParam->T_Matched_2);\n\t\tprintk(\"T_Matched_3 = %lu\\n\", pDfsSwParam->T_Matched_3);\n\t\tprintk(\"T_Matched_4 = %lu\\n\", pDfsSwParam->T_Matched_4);\n\t\tprintk(\"T_Matched_5 = %lu\\n\", pDfsSwParam->T_Matched_5);\t\t\n#endif /* DFS_DEBUG */\n\n\tprintk(\"pAd->Dot11_H.ChMovingTime = %d\\n\", pAd->Dot11_H.ChMovingTime);\n\tprintk(\"pAd->Dot11_H.RDMode = %d\\n\", pAd->Dot11_H.RDMode);\n#endif /* DFS_SUPPORT */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\tprintk(\"pAd->CommonCfg.CarrierDetect.CD_State = %d\\n\", pAd->CommonCfg.CarrierDetect.CD_State);\n\tprintk(\"pAd->CommonCfg.CarrierDetect.criteria = %d\\n\", pAd->CommonCfg.CarrierDetect.criteria);\n\tprintk(\"pAd->CommonCfg.CarrierDetect.Delta = %d\\n\", pAd->CommonCfg.CarrierDetect.delta);\n\tprintk(\"pAd->CommonCfg.CarrierDetect.DivFlag = %d\\n\", pAd->CommonCfg.CarrierDetect.div_flag);\n\tprintk(\"pAd->CommonCfg.CarrierDetect.Threshold = %d(0x%x)\\n\", pAd->CommonCfg.CarrierDetect.threshold, pAd->CommonCfg.CarrierDetect.threshold);\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\treturn TRUE;\n}\n\n/*\n\t========================================================================\n       Routine Description:\n               Control CCK_MRC Status\n       Arguments:\n               pAd     Pointer to our adapter\n       Return Value:\n\n       ========================================================================\n*/\nVOID CckMrcStatusCtrl(IN PRTMP_ADAPTER pAd)\n{\n}\n\n\n/*\n       ========================================================================\n       Routine Description:\n               Enhance DFS/CS when using GLRT.\n       Arguments:\n               pAd     Pointer to our adapter\n       Return Value:\n\n       ========================================================================\n*/\nVOID RadarGLRTCompensate(IN PRTMP_ADAPTER pAd)\n{\n}\n#endif /*defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */\n\n"
  },
  {
    "path": "src/common/cmm_sanity.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tsanity.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn Chang  2004-09-01      add WMM support\n*/\n#include \"rt_config.h\"\n\nextern UCHAR\tCISCO_OUI[];\n\nextern UCHAR\tWPA_OUI[];\nextern UCHAR\tRSN_OUI[];\nextern UCHAR\tWME_INFO_ELEM[];\nextern UCHAR\tWME_PARM_ELEM[];\nextern UCHAR\tRALINK_OUI[];\nextern UCHAR\tBROADCOM_OUI[];\nextern UCHAR    WPS_OUI[];\n\n\n#ifdef IWSC_SUPPORT\nextern UCHAR    IWSC_OUI[];\n#endif // IWSC_SUPPORT //\n\ntypedef struct wsc_ie_probreq_data\n{\n\tUCHAR\tssid[32];\n\tUCHAR\tmacAddr[6];\n\tUCHAR\tdata[2];\n} WSC_IE_PROBREQ_DATA;\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN MlmeAddBAReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2) \n{\n    PMLME_ADDBA_REQ_STRUCT   pInfo;\n\n    pInfo = (MLME_ADDBA_REQ_STRUCT *)Msg;\n\n    if ((MsgLen != sizeof(MLME_ADDBA_REQ_STRUCT)))\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"MlmeAddBAReqSanity fail - message lenght not correct.\\n\"));\n        return FALSE;\n    }\t\n\t\n    if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE))\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"MlmeAddBAReqSanity fail - The peer Mac is not associated yet.\\n\"));\n        return FALSE;\n    }\t\n\n\t/*\n    if ((pInfo->BaBufSize > MAX_RX_REORDERBUF) || (pInfo->BaBufSize < 2))\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"MlmeAddBAReqSanity fail - Rx Reordering buffer too big or too small\\n\"));\n        return FALSE;\n    } \n\t*/  \n\n    if ((pInfo->pAddr[0]&0x01) == 0x01)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"MlmeAddBAReqSanity fail - broadcast address not support BA\\n\"));\n        return FALSE;\n    }\t\n    \n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN MlmeDelBAReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen) \n{\n\tMLME_DELBA_REQ_STRUCT *pInfo;\n\tpInfo = (MLME_DELBA_REQ_STRUCT *)Msg;\n\n    if ((MsgLen != sizeof(MLME_DELBA_REQ_STRUCT)))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"MlmeDelBAReqSanity fail - message lenght not correct.\\n\"));\n        return FALSE;\n    }\t\n\t\n    if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"MlmeDelBAReqSanity fail - The peer Mac is not associated yet.\\n\"));\n        return FALSE;\n    }\t\n\n    if ((pInfo->TID & 0xf0))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"MlmeDelBAReqSanity fail - The peer TID is incorrect.\\n\"));\n        return FALSE;\n    }\t\n\n\tif (NdisEqualMemory(pAd->MacTab.Content[pInfo->Wcid].Addr, pInfo->Addr, MAC_ADDR_LEN) == 0)\n    {    \t\n        DBGPRINT(RT_DEBUG_ERROR, (\"MlmeDelBAReqSanity fail - the peer addr dosen't exist.\\n\"));\t\t\n        return FALSE;\n    }\t\n    \n    return TRUE;\n}\n\nBOOLEAN PeerAddBAReqActionSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen,\n\tOUT PUCHAR pAddr2)\n{\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;\n\tPFRAME_ADDBA_REQ pAddFrame;\n\tpAddFrame = (PFRAME_ADDBA_REQ)(pMsg);\n\tif (MsgLen < (sizeof(FRAME_ADDBA_REQ)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"PeerAddBAReqActionSanity: ADDBA Request frame length size = %ld incorrect\\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\t/* we support immediate BA.*/\n#ifdef UNALIGNMENT_SUPPORT\n\t{\n\t\tBA_PARM\t\ttmpBaParm;\n\n\t\tNdisMoveMemory((PUCHAR)(&tmpBaParm), (PUCHAR)(&pAddFrame->BaParm), sizeof(BA_PARM));\n\t\t*(USHORT *)(&tmpBaParm) = cpu2le16(*(USHORT *)(&tmpBaParm));\n\t\tNdisMoveMemory((PUCHAR)(&pAddFrame->BaParm), (PUCHAR)(&tmpBaParm), sizeof(BA_PARM));\n\t}\n#else\n\t*(USHORT *)(&pAddFrame->BaParm) = cpu2le16(*(USHORT *)(&pAddFrame->BaParm));\n#endif\n\tpAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue);\n\tpAddFrame->BaStartSeq.word = cpu2le16(pAddFrame->BaStartSeq.word); \n\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\n\tif (pAddFrame->BaParm.BAPolicy != IMMED_BA)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"PeerAddBAReqActionSanity: ADDBA Request Ba Policy[%d] not support\\n\", pAddFrame->BaParm.BAPolicy));\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ADDBA Request. tid=%x, Bufsize=%x, AMSDUSupported=%x \\n\", pAddFrame->BaParm.TID, pAddFrame->BaParm.BufSize, pAddFrame->BaParm.AMSDUSupported));\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nBOOLEAN PeerAddBARspActionSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen)\n{\n\t/*PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;*/\n\tPFRAME_ADDBA_RSP pAddFrame;\n\t\n\tpAddFrame = (PFRAME_ADDBA_RSP)(pMsg);\n\tif (MsgLen < (sizeof(FRAME_ADDBA_RSP)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"PeerAddBARspActionSanity: ADDBA Response frame length size = %ld incorrect\\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\t/* we support immediate BA.*/\n#ifdef UNALIGNMENT_SUPPORT\n\t{\n\t\tBA_PARM\t\ttmpBaParm;\n\n\t\tNdisMoveMemory((PUCHAR)(&tmpBaParm), (PUCHAR)(&pAddFrame->BaParm), sizeof(BA_PARM));\n\t\t*(USHORT *)(&tmpBaParm) = cpu2le16(*(USHORT *)(&tmpBaParm));\n\t\tNdisMoveMemory((PUCHAR)(&pAddFrame->BaParm), (PUCHAR)(&tmpBaParm), sizeof(BA_PARM));\n\t}\n#else\n\t*(USHORT *)(&pAddFrame->BaParm) = cpu2le16(*(USHORT *)(&pAddFrame->BaParm));\n#endif\n\tpAddFrame->StatusCode = cpu2le16(pAddFrame->StatusCode);\n\tpAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue);\n\n\tif (pAddFrame->BaParm.BAPolicy != IMMED_BA)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"PeerAddBAReqActionSanity: ADDBA Response Ba Policy[%d] not support\\n\", pAddFrame->BaParm.BAPolicy));\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n\n}\n\nBOOLEAN PeerDelBAActionSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN UCHAR Wcid, \n    IN VOID *pMsg, \n    IN ULONG MsgLen )\n{\n\t/*PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;*/\n\tPFRAME_DELBA_REQ  pDelFrame;\n\tif (MsgLen != (sizeof(FRAME_DELBA_REQ)))\n\t\treturn FALSE;\n\t\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn FALSE;\n\t\n\tpDelFrame = (PFRAME_DELBA_REQ)(pMsg);\n\n\t*(USHORT *)(&pDelFrame->DelbaParm) = cpu2le16(*(USHORT *)(&pDelFrame->DelbaParm));\n\tpDelFrame->ReasonCode = cpu2le16(pDelFrame->ReasonCode);\n\n\treturn TRUE;\n}\n\n\nBOOLEAN PeerBeaconAndProbeRspSanity_Old(\n    IN PRTMP_ADAPTER pAd,\n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    IN UCHAR  MsgChannel,\n    OUT PUCHAR pAddr2, \n    OUT PUCHAR pBssid, \n    OUT CHAR Ssid[], \n    OUT UCHAR *pSsidLen, \n    OUT UCHAR *pBssType, \n    OUT USHORT *pBeaconPeriod, \n    OUT UCHAR *pChannel, \n    OUT UCHAR *pNewChannel, \n    OUT LARGE_INTEGER *pTimestamp, \n    OUT CF_PARM *pCfParm, \n    OUT USHORT *pAtimWin, \n    OUT USHORT *pCapabilityInfo, \n    OUT UCHAR *pErp,\n    OUT UCHAR *pDtimCount, \n    OUT UCHAR *pDtimPeriod, \n    OUT UCHAR *pBcastFlag, \n    OUT UCHAR *pMessageToMe, \n    OUT UCHAR SupRate[],\n    OUT UCHAR *pSupRateLen,\n    OUT UCHAR ExtRate[],\n    OUT UCHAR *pExtRateLen,\n    OUT UCHAR *pCkipFlag,\n    OUT UCHAR *pAironetCellPowerLimit,\n    OUT PEDCA_PARM pEdcaParm,\n    OUT PQBSS_LOAD_PARM pQbssLoad,\n    OUT PQOS_CAPABILITY_PARM pQosCapability,\n    OUT ULONG *pRalinkIe,\n    OUT UCHAR *pHtCapabilityLen,\n#ifdef CONFIG_STA_SUPPORT\n    OUT UCHAR *pPreNHtCapabilityLen,\n#endif /* CONFIG_STA_SUPPORT */\n    OUT HT_CAPABILITY_IE *pHtCapability,\n    OUT EXT_CAP_INFO_ELEMENT\t*pExtCapInfo,\n    OUT UCHAR *AddHtInfoLen,\n    OUT ADD_HT_INFO_IE *AddHtInfo,\n    OUT UCHAR *NewExtChannelOffset,\t\t/* Ht extension channel offset(above or below)*/\n    OUT USHORT *LengthVIE,\t\n    OUT PNDIS_802_11_VARIABLE_IEs pVIE)\n{\n    UCHAR\t\t\t\t*Ptr;\n#ifdef CONFIG_STA_SUPPORT\n\tUCHAR \t\t\t\tTimLen;\n#ifdef IWSC_SUPPORT\n\tBOOLEAN\t\t\t\tbFoundIWscIe = FALSE;\n\tUSHORT \t\t\t\tPeerConfigMethod = 0;\n#endif /* IWSC_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n    PFRAME_802_11\t\tpFrame;\n    PEID_STRUCT         pEid;\n    UCHAR\t\t\t\tSubType;\n    UCHAR\t\t\t\tSanity;\n    /*UCHAR\t\t\t\tECWMin, ECWMax;*/\n    /*MAC_CSR9_STRUC\t\tCsr9;*/\n    ULONG\t\t\t\tLength = 0;\n\tUCHAR\t\t\t\t*pPeerWscIe = NULL;\n\tINT\t\t\t\t\tPeerWscIeLen = 0;\n    UCHAR\t\t\t\tLatchRfChannel = 0;\n\n\n\t/*\n\t\tFor some 11a AP which didn't have DS_IE, we use two conditions to decide the channel\n\t\t1. If the AP is 11n enabled, then check the control channel.\n\t\t2. If the AP didn't have any info about channel, use the channel we received this \n\t\t\tframe as the channel. (May inaccuracy!!)\n\t*/\n\tUCHAR\t\t\tCtrlChannel = 0;\n\t\n\t\n\tos_alloc_mem(NULL, &pPeerWscIe, 512);\n    /* Add for 3 necessary EID field check*/\n    Sanity = 0;\n\n    *pAtimWin = 0;\n    *pErp = 0;\t\n    *pDtimCount = 0;\n    *pDtimPeriod = 0;\n    *pBcastFlag = 0;\n    *pMessageToMe = 0;\n    *pExtRateLen = 0;\n    *pCkipFlag = 0;\t\t\t        /* Default of CkipFlag is 0*/\n    *pAironetCellPowerLimit = 0xFF;  /* Default of AironetCellPowerLimit is 0xFF*/\n    *LengthVIE = 0;\t\t\t\t\t/* Set the length of VIE to init value 0*/\n    *pHtCapabilityLen = 0;\t\t\t\t\t/* Set the length of VIE to init value 0*/\n#ifdef CONFIG_STA_SUPPORT\n\tif (pAd->OpMode == OPMODE_STA)\n\t\t*pPreNHtCapabilityLen = 0;\t\t\t\t\t/* Set the length of VIE to init value 0*/\n#endif /* CONFIG_STA_SUPPORT */\n    *AddHtInfoLen = 0;\t\t\t\t\t/* Set the length of VIE to init value 0*/\n    NdisZeroMemory(pExtCapInfo, sizeof(EXT_CAP_INFO_ELEMENT));\n    *pRalinkIe = 0;\n    *pNewChannel = 0;\n    *NewExtChannelOffset = 0xff;\t/*Default 0xff means no such IE*/\n    pCfParm->bValid = FALSE;        /* default: no IE_CF found*/\n    pQbssLoad->bValid = FALSE;      /* default: no IE_QBSS_LOAD found*/\n    pEdcaParm->bValid = FALSE;      /* default: no IE_EDCA_PARAMETER found*/\n    pQosCapability->bValid = FALSE; /* default: no IE_QOS_CAPABILITY found*/\n    \n    pFrame = (PFRAME_802_11)Msg;\n    \n    /* get subtype from header*/\n    SubType = (UCHAR)pFrame->Hdr.FC.SubType;\n\n    /* get Addr2 and BSSID from header*/\n    COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n    COPY_MAC_ADDR(pBssid, pFrame->Hdr.Addr3);\n    \n/*\thex_dump(\"Beacon\", Msg, MsgLen);*/\n\n    Ptr = pFrame->Octet;\n    Length += LENGTH_802_11;\n    \n    /* get timestamp from payload and advance the pointer*/\n    NdisMoveMemory(pTimestamp, Ptr, TIMESTAMP_LEN);\n\n\tpTimestamp->u.LowPart = cpu2le32(pTimestamp->u.LowPart);\n\tpTimestamp->u.HighPart = cpu2le32(pTimestamp->u.HighPart);\n\n    Ptr += TIMESTAMP_LEN;\n    Length += TIMESTAMP_LEN;\n\n    /* get beacon interval from payload and advance the pointer*/\n    NdisMoveMemory(pBeaconPeriod, Ptr, 2);\n    Ptr += 2;\n    Length += 2;\n\n    /* get capability info from payload and advance the pointer*/\n    NdisMoveMemory(pCapabilityInfo, Ptr, 2);\n    Ptr += 2;\n    Length += 2;\n\n    if (CAP_IS_ESS_ON(*pCapabilityInfo)) \n        *pBssType = BSS_INFRA;\n    else \n        *pBssType = BSS_ADHOC;\n\n    pEid = (PEID_STRUCT) Ptr;\n\n    /* get variable fields from payload and advance the pointer*/\n    while ((Length + 2 + pEid->Len) <= MsgLen)    \n    {\n        \n        /* Secure copy VIE to VarIE[MAX_VIE_LEN] didn't overflow.*/\n        if ((*LengthVIE + pEid->Len + 2) >= MAX_VIE_LEN)\n        {\n            DBGPRINT(RT_DEBUG_WARN, (\"%s() - Variable IEs out of resource [len(=%d) > MAX_VIE_LEN(=%d)]\\n\",\n                    __FUNCTION__, (*LengthVIE + pEid->Len + 2), MAX_VIE_LEN));\n            break;\n        }\n\n        switch(pEid->Eid)\n        {\n            case IE_SSID:\n                /* Already has one SSID EID in this beacon, ignore the second one*/\n                if (Sanity & 0x1)\n                    break;\n                if(pEid->Len <= MAX_LEN_OF_SSID)\n                {\n                    NdisMoveMemory(Ssid, pEid->Octet, pEid->Len);\n                    *pSsidLen = pEid->Len;\n                    Sanity |= 0x1;\n                }\n                else\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_SSID (len=%d)\\n\", __FUNCTION__, pEid->Len));\n                    goto SanityCheck;\n                }\n                break;\n\n            case IE_SUPP_RATES:\n                if(pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n                {\n                    Sanity |= 0x2;\n                    NdisMoveMemory(SupRate, pEid->Octet, pEid->Len);\n                    *pSupRateLen = pEid->Len;\n\n                    /*\n\t\t\t\t\t\tTODO: 2004-09-14 not a good design here, cause it exclude extra \n\t\t\t\t\t\t\trates from ScanTab. We should report as is. And filter out \n\t\t\t\t\t\t\tunsupported rates in MlmeAux\n\t\t\t\t\t*/\n                    /* Check against the supported rates*/\n                    /* RTMPCheckRates(pAd, SupRate, pSupRateLen);*/\n                }\n                else\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_SUPP_RATES (len=%d)\\n\",__FUNCTION__, pEid->Len));\n                    goto SanityCheck;\n                }\n                break;\n\n            case IE_HT_CAP:\n\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE)  /*Note: allow extension.!!*/\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pHtCapability, pEid->Octet, sizeof(HT_CAPABILITY_IE));\n\t\t\t\t*pHtCapabilityLen = SIZE_HT_CAP_IE;\t/* Nnow we only support 26 bytes.*/\n\n\t\t\t\t*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t\t{\n\t\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\t\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\t\tNdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t}\n#else\n\t\t\t\t*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\t*pPreNHtCapabilityLen = 0;\t/* Now we only support 26 bytes.*/\n\n\t\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s() - wrong IE_HT_CAP. pEid->Len = %d\\n\", __FUNCTION__, pEid->Len));\n\t\t\t}\n\t\t\t\n\t\tbreak;\n            case IE_ADD_HT:\n\t\t\tif (pEid->Len >= sizeof(ADD_HT_INFO_IE))\t\t\t\t\n\t\t\t{\n\t\t\t\t/* \n\t\t\t\t\tThis IE allows extension, but we can ignore extra bytes beyond our \n\t\t\t\t\tknowledge , so only copy first sizeof(ADD_HT_INFO_IE)\n\t\t\t\t*/\n\t\t\t\tNdisMoveMemory(AddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE));\n\t\t\t\t*AddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n\n\t\t\t\tCtrlChannel = AddHtInfo->ControlChan;\n\t\t\t\t\n\t\t\t\t*(USHORT *)(&AddHtInfo->AddHtInfo2) = cpu2le16(*(USHORT *)(&AddHtInfo->AddHtInfo2));\n\t\t\t\t*(USHORT *)(&AddHtInfo->AddHtInfo3) = cpu2le16(*(USHORT *)(&AddHtInfo->AddHtInfo3));\n           \n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t                Ptr = (PUCHAR) pVIE;\n\t\t\t                NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t                *LengthVIE += (pEid->Len + 2);\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s() - wrong IE_ADD_HT. \\n\", __FUNCTION__));\n\t\t\t}\n\t\t\t\t\n\t\tbreak;\n            case IE_SECONDARY_CH_OFFSET:\n\t\t\tif (pEid->Len == 1)\n\t\t\t{\n\t\t\t\t*NewExtChannelOffset = pEid->Octet[0];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s() - wrong IE_SECONDARY_CH_OFFSET. \\n\", __FUNCTION__));\n\t\t\t}\n\t\t\t\t\n\t\tbreak;\n            case IE_FH_PARM:\n                DBGPRINT(RT_DEBUG_TRACE, (\"%s(IE_FH_PARM) \\n\", __FUNCTION__));\n                break;\n\n            case IE_DS_PARM:\n                if(pEid->Len == 1)\n                {\n                    *pChannel = *pEid->Octet;\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ChannelSanity(pAd, *pChannel) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tgoto SanityCheck;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n                    Sanity |= 0x4;\n                }\n                else\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_DS_PARM (len=%d)\\n\",__FUNCTION__,pEid->Len));\n                    goto SanityCheck;\n                }\n                break;\n\n            case IE_CF_PARM:\n                if(pEid->Len == 6)\n                {\n                    pCfParm->bValid = TRUE;\n                    pCfParm->CfpCount = pEid->Octet[0];\n                    pCfParm->CfpPeriod = pEid->Octet[1];\n                    pCfParm->CfpMaxDuration = pEid->Octet[2] + 256 * pEid->Octet[3];\n                    pCfParm->CfpDurRemaining = pEid->Octet[4] + 256 * pEid->Octet[5];\n                }\n                else\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_CF_PARM\\n\", __FUNCTION__));\n\t\t\t\t\tif (pPeerWscIe)\n\t\t\t\t\t\tos_free_mem(NULL, pPeerWscIe);\n                    return FALSE;\n                }\n                break;\n\n            case IE_IBSS_PARM:\n                if(pEid->Len == 2)\n                {\n                    NdisMoveMemory(pAtimWin, pEid->Octet, pEid->Len);\n                }\n                else\n                {\n                    DBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_IBSS_PARM\\n\", __FUNCTION__));\n\t\t\t\t\tif (pPeerWscIe)\n\t\t\t\t\t\tos_free_mem(NULL, pPeerWscIe);\n                    return FALSE;\n                }\n                break;\n\n#ifdef CONFIG_STA_SUPPORT\n            case IE_TIM:\n                if(SubType == SUBTYPE_BEACON)\n                {\n#ifdef P2P_SUPPORT\n                    if (P2P_CLI_ON(pAd) && NdisEqualMemory(pBssid, pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN))\n                    {\n                        GetTimBit((PCHAR)pEid, pAd->ApCliMlmeAux.Aid, &TimLen, pBcastFlag, pDtimCount, pDtimPeriod, pMessageToMe);\n                    }\n#endif /* P2P_SUPPORT */\n\t\t\t\t\tif (INFRA_ON(pAd) && NdisEqualMemory(pBssid, pAd->CommonCfg.Bssid, MAC_ADDR_LEN))\n                    {\n                        GetTimBit((PCHAR)pEid, pAd->StaActive.Aid, &TimLen, pBcastFlag, pDtimCount, pDtimPeriod, pMessageToMe);\n                    }\n                }\n                break;\n#endif /* CONFIG_STA_SUPPORT */\n            case IE_CHANNEL_SWITCH_ANNOUNCEMENT:\n                if(pEid->Len == 3)\n                {\n                \t*pNewChannel = pEid->Octet[1];\t/*extract new channel number*/\n                }\n                break;\n\n            /* \n\t\t\t\tNew for WPA\n\t\t\t\tCCX v2 has the same IE, we need to parse that too\n\t\t\t\tWifi WMM use the same IE vale, need to parse that too\n\t\t\t*/\n            /* case IE_WPA:*/\n            case IE_VENDOR_SPECIFIC:\n                /* Check the OUI version, filter out non-standard usage*/\n                if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 7))\n                {\n\t\t\tif (pEid->Octet[3] != 0)\n        \t\t\t\t*pRalinkIe = pEid->Octet[3];\n        \t\t\telse\n        \t\t\t\t*pRalinkIe = 0xf0000000; /* Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag.*/\n                }\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11_N_SUPPORT\n\t\t/* This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan.*/\n                \n                /* Other vendors had production before IE_HT_CAP value is assigned. To backward support those old-firmware AP,*/\n                /* Check broadcom-defiend pre-802.11nD1.0 OUI for HT related IE, including HT Capatilities IE and HT Information IE*/\n                else if ((*pHtCapabilityLen == 0) && NdisEqualMemory(pEid->Octet, PRE_N_HT_OUI, 3) && (pEid->Len >= 4) && (pAd->OpMode == OPMODE_STA))\n                {\n                    if ((pEid->Octet[3] == OUI_PREN_HT_CAP) && (pEid->Len >= 30) && (*pHtCapabilityLen == 0))\n                    {\n                        NdisMoveMemory(pHtCapability, &pEid->Octet[4], sizeof(HT_CAPABILITY_IE));\n                        *pPreNHtCapabilityLen = SIZE_HT_CAP_IE;\n                    }\n\n                    if ((pEid->Octet[3] == OUI_PREN_ADD_HT) && (pEid->Len >= 26))\n                    {\n                        NdisMoveMemory(AddHtInfo, &pEid->Octet[4], sizeof(ADD_HT_INFO_IE));\n                        *AddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n                    }\n                }\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n                else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))\n                {\n                    /* Copy to pVIE which will report to bssid list.*/\n                    Ptr = (PUCHAR) pVIE;\n                    NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n                    *LengthVIE += (pEid->Len + 2);\n                }\n                else if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))\n                {\n                    PUCHAR ptr;\n                    int i;\n\n                    /* parsing EDCA parameters*/\n                    pEdcaParm->bValid          = TRUE;\n                    pEdcaParm->bQAck           = FALSE; /* pEid->Octet[0] & 0x10;*/\n                    pEdcaParm->bQueueRequest   = FALSE; /* pEid->Octet[0] & 0x20;*/\n                    pEdcaParm->bTxopRequest    = FALSE; /* pEid->Octet[0] & 0x40;*/\n                    pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;\n                    pEdcaParm->bAPSDCapable    = (pEid->Octet[6] & 0x80) ? 1 : 0;\n                    ptr = &pEid->Octet[8];\n                    for (i=0; i<4; i++)\n                    {\n                        UCHAR aci = (*ptr & 0x60) >> 5; /* b5~6 is AC INDEX*/\n                        pEdcaParm->bACM[aci]  = (((*ptr) & 0x10) == 0x10);   /* b5 is ACM*/\n                        pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f;               /* b0~3 is AIFSN*/\n                        pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f;             /* b0~4 is Cwmin*/\n                        pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4;               /* b5~8 is Cwmax*/\n                        pEdcaParm->Txop[aci]  = *(ptr+2) + 256 * (*(ptr+3)); /* in unit of 32-us*/\n                        ptr += 4; /* point to next AC*/\n                    }\n                }\n                else if (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6) && (pEid->Len == 7))\n                {\n                    /* parsing EDCA parameters*/\n                    pEdcaParm->bValid          = TRUE;\n                    pEdcaParm->bQAck           = FALSE; /* pEid->Octet[0] & 0x10;*/\n                    pEdcaParm->bQueueRequest   = FALSE; /* pEid->Octet[0] & 0x20;*/\n                    pEdcaParm->bTxopRequest    = FALSE; /* pEid->Octet[0] & 0x40;*/\n                    pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;\n                    pEdcaParm->bAPSDCapable    = (pEid->Octet[6] & 0x80) ? 1 : 0;\n\n                    /* use default EDCA parameter*/\n                    pEdcaParm->bACM[QID_AC_BE]  = 0;\n                    pEdcaParm->Aifsn[QID_AC_BE] = 3;\n                    pEdcaParm->Cwmin[QID_AC_BE] = CW_MIN_IN_BITS;\n                    pEdcaParm->Cwmax[QID_AC_BE] = CW_MAX_IN_BITS;\n                    pEdcaParm->Txop[QID_AC_BE]  = 0;\n\n                    pEdcaParm->bACM[QID_AC_BK]  = 0;\n                    pEdcaParm->Aifsn[QID_AC_BK] = 7;\n                    pEdcaParm->Cwmin[QID_AC_BK] = CW_MIN_IN_BITS;\n                    pEdcaParm->Cwmax[QID_AC_BK] = CW_MAX_IN_BITS;\n                    pEdcaParm->Txop[QID_AC_BK]  = 0;\n\n                    pEdcaParm->bACM[QID_AC_VI]  = 0;\n                    pEdcaParm->Aifsn[QID_AC_VI] = 2;\n                    pEdcaParm->Cwmin[QID_AC_VI] = CW_MIN_IN_BITS-1;\n                    pEdcaParm->Cwmax[QID_AC_VI] = CW_MAX_IN_BITS;\n                    pEdcaParm->Txop[QID_AC_VI]  = 96;   /* AC_VI: 96*32us ~= 3ms*/\n\n                    pEdcaParm->bACM[QID_AC_VO]  = 0;\n                    pEdcaParm->Aifsn[QID_AC_VO] = 2;\n                    pEdcaParm->Cwmin[QID_AC_VO] = CW_MIN_IN_BITS-2;\n                    pEdcaParm->Cwmax[QID_AC_VO] = CW_MAX_IN_BITS-1;\n                    pEdcaParm->Txop[QID_AC_VO]  = 48;   /* AC_VO: 48*32us ~= 1.5ms*/\n                }\n\t\t\t\telse if (NdisEqualMemory(pEid->Octet, WPS_OUI, 4)\n #ifdef IWSC_SUPPORT\n\t\t\t\t\t\t || NdisEqualMemory(pEid->Octet, IWSC_OUI, 4)\n#endif // IWSC_SUPPORT //\n\t\t\t\t\t\t )\n                {\n\t\t\t\t\tif (PeerWscIeLen >= 512)\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: PeerWscIeLen = %d (>= 512)\\n\", __FUNCTION__, PeerWscIeLen));\n\t\t\t\t\tif (pPeerWscIe && (PeerWscIeLen < 512))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pPeerWscIe+PeerWscIeLen, pEid->Octet+4, pEid->Len-4);\n\t\t\t\t\t\tPeerWscIeLen += (pEid->Len - 4);\n\t\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\t\tif (NdisEqualMemory(pEid->Octet, IWSC_OUI, 4))\n\t\t\t\t\t\tbFoundIWscIe = TRUE;\n#endif /* IWSC_SUPPORT */\n\t\t\t\t\t\n\n\t\t\t\t\t\n                }\n\n                \n                break;\n\n            case IE_EXT_SUPP_RATES:\n                if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n                {\n                    NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);\n                    *pExtRateLen = pEid->Len;\n\n                    /*\n\t\t\t\t\t\tTODO: 2004-09-14 not a good design here, cause it exclude extra rates\n\t\t\t\t\t\t\t\tfrom ScanTab. We should report as is. And filter out unsupported\n\t\t\t\t\t\t\t\trates in MlmeAux\n\t\t\t\t\t*/\n                    /* Check against the supported rates*/\n                    /* RTMPCheckRates(pAd, ExtRate, pExtRateLen);*/\n                }\n                break;\n\n            case IE_ERP:\n                if (pEid->Len == 1)\n                {\n                    *pErp = (UCHAR)pEid->Octet[0];\n                }\n                break;\n\n            case IE_AIRONET_CKIP:\n                /*\n\t\t\t\t\t0. Check Aironet IE length, it must be larger or equal to 28\n\t\t\t\t\t\tCisco AP350 used length as 28\n\t\t\t\t\t\tCisco AP12XX used length as 30\n\t\t\t\t*/\n                if (pEid->Len < (CKIP_NEGOTIATION_LENGTH - 2))\n                    break;\n\n                /* 1. Copy CKIP flag byte to buffer for process*/\n                *pCkipFlag = *(pEid->Octet + 8);\t\t\t\t\n                break;\n\n            case IE_AP_TX_POWER:\n                /* AP Control of Client Transmit Power*/\n                /*0. Check Aironet IE length, it must be 6*/\n                if (pEid->Len != 0x06)\n                    break;\n\n                /* Get cell power limit in dBm*/\n                if (NdisEqualMemory(pEid->Octet, CISCO_OUI, 3) == 1)\n                    *pAironetCellPowerLimit = *(pEid->Octet + 4);\t\n                break;\n\n            /* WPA2 & 802.11i RSN*/\n            case IE_RSN:\n                /* There is no OUI for version anymore, check the group cipher OUI before copying*/\n                if (RTMPEqualMemory(pEid->Octet + 2, RSN_OUI, 3))\n                {\n                    /* Copy to pVIE which will report to microsoft bssid list.*/\n                    Ptr = (PUCHAR) pVIE;\n                    NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n                    *LengthVIE += (pEid->Len + 2);\n                }\n                break;\n#ifdef WAPI_SUPPORT\n\t\t\t/* WAPI information element*/\n            case IE_WAPI:                \n                if (RTMPEqualMemory(pEid->Octet + 4, WAPI_OUI, 3))\n                {\n                    /* Copy to pVIE*/\n                    Ptr = (PUCHAR) pVIE;\n                    NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n                    *LengthVIE += (pEid->Len + 2);\n                }\n                break;\n#endif /* WAPI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#if defined (EXT_BUILD_CHANNEL_LIST) || defined (RT_CFG80211_SUPPORT)\n\t\t\tcase IE_COUNTRY:\n\t\t\t\tPtr = (PUCHAR) pVIE;\n                NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n                *LengthVIE += (pEid->Len + 2);\n\t\t\t\tbreak;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\n\n            case IE_QBSS_LOAD:\n                if (pEid->Len == 5)\n                {\n                    pQbssLoad->bValid = TRUE;\n                    pQbssLoad->StaNum = pEid->Octet[0] + pEid->Octet[1] * 256;\n                    pQbssLoad->ChannelUtilization = pEid->Octet[2];\n                    pQbssLoad->RemainingAdmissionControl = pEid->Octet[3] + pEid->Octet[4] * 256;\n\n\t\t\t\t\t/* Copy to pVIE*/\n                    Ptr = (PUCHAR) pVIE;\n                    NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n                    *LengthVIE += (pEid->Len + 2);\n                }\n                break;\n                \n\n\n\t\t\tcase IE_EXT_CAPABILITY:\n\t\t\t\tif (pEid->Len >= 1)\n\t\t\t\t{\n\t\t\t\t\tUCHAR MaxSize;\n\t\t\t\t\tUCHAR MySize = sizeof(EXT_CAP_INFO_ELEMENT);\n\n\t\t\t\t\tMaxSize = min(pEid->Len, MySize);\n\n\t\t\t\t\tNdisMoveMemory(pExtCapInfo,&pEid->Octet[0], MaxSize);\n\t\t\t\t}\n\t\t\t\tbreak;\n            default:\n                break;\n        }\n        \n        Length = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len]*/\n        pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n    }\n\n\tLatchRfChannel = MsgChannel;\n\n\t\tif ((pAd->LatchRfRegs.Channel > 14) && ((Sanity & 0x4) == 0))\n\t\t{\n\t\t\tif (CtrlChannel != 0)\n\t\t\t\t*pChannel = CtrlChannel;\n\t\t\telse\n\t\t\t\t*pChannel = LatchRfChannel;\n\t\t\tSanity |= 0x4;\n\t\t}\n\n\t\tif (pPeerWscIe && (PeerWscIeLen > 0) && (PeerWscIeLen < 512))\n\t\t{\n\t\t\tUCHAR WscIe[] = {0xdd, 0x00, 0x00, 0x50, 0xF2, 0x04};\n\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\tWscIe[1] = PeerWscIeLen + 4;\n\t\t\tNdisMoveMemory(Ptr + *LengthVIE, WscIe, 6);\n\t\t\tNdisMoveMemory(Ptr + *LengthVIE + 6, pPeerWscIe, PeerWscIeLen);\n\t\t\t*LengthVIE += (PeerWscIeLen + 6);\n#ifdef IWSC_SUPPORT\n\t\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\t(SubType == SUBTYPE_PROBE_RSP) &&\n\t\t\t\t(bFoundIWscIe == TRUE))\n\t\t\t{\n\t\t\t\tBOOLEAN bSelReg = FALSE;\n\t\t\t\tUSHORT DataLen = 0;\n\t\t\t\t\n\t\t\t\t/* re-use this boolean variable */\n\t\t\t\tbFoundIWscIe = FALSE;\n\t\t\t\tWscGetDataFromPeerByTag(pAd, pPeerWscIe, PeerWscIeLen, WSC_ID_SEL_REGISTRAR, &bSelReg, NULL);\t\t\t\t\n\t\t\t\tif (bSelReg)\n\t\t\t\t{\n\t\t\t\t\tbFoundIWscIe = TRUE;\n\t\t\t\t\tif (WscGetDataFromPeerByTag(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\tpPeerWscIe, \n\t\t\t\t\t\t\t\t\t\t\t\tPeerWscIeLen,\n\t\t\t\t\t\t\t\t\t\t\t\tWSC_ID_MAC_ADDR, \n\t\t\t\t\t\t\t\t\t\t\t\t&pAd->StaCfg.WscControl.WscPeerMAC[0], \n\t\t\t\t\t\t\t\t\t\t\t\tNULL) == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.WscControl.WscPeerMAC[0], pAddr2, MAC_ADDR_LEN);\n\t\t\t\t\t}\n\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.WscControl.EntryAddr[0], \n\t\t\t\t\t\t\t&pAd->StaCfg.WscControl.WscPeerMAC[0], \n\t\t\t\t\t\t\tMAC_ADDR_LEN);\n\t\t\t\t\thex_dump(\"PeerBeaconAndProbeRspSanity - WscPeerMAC\", &pAd->StaCfg.WscControl.WscPeerMAC[0], MAC_ADDR_LEN);\n\t\t\t\t\t\n\t\t\t\t\tWscGetDataFromPeerByTag(pAd, \n\t\t\t\t\t\t\t\t\t\t\tpPeerWscIe, \n\t\t\t\t\t\t\t\t\t\t\tPeerWscIeLen,\n\t\t\t\t\t\t\t\t\t\t\tWSC_ID_SEL_REG_CFG_METHODS, \n\t\t\t\t\t\t\t\t\t\t\t&PeerConfigMethod, \n\t\t\t\t\t\t\t\t\t\t\tNULL);\n\t\t\t\t}\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t}\n\t\t\n\nSanityCheck:\n\tif (pPeerWscIe)\n\t\tos_free_mem(NULL, pPeerWscIe);\n\n\tif (Sanity != 0x7)\n\t{\n\t\tDBGPRINT(RT_DEBUG_LOUD, (\"%s() - missing field, Sanity=0x%02x\\n\", __FUNCTION__, Sanity));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n#ifdef IWSC_SUPPORT\n\t\tif (bFoundIWscIe && (pAd->StaCfg.BssType == BSS_ADHOC))\n\t\t{\n\t\t\tPWSC_CTRL pWscCtrl = &pAd->StaCfg.WscControl;\n\t\t\tif ((pWscCtrl->WscConfMode == WSC_ENROLLEE) &&\n\t\t\t\t(pWscCtrl->WscMode == WSC_PIN_MODE) &&\n\t\t\t\t(pWscCtrl->bWscTrigger == TRUE))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&pWscCtrl->WscSsid, sizeof(NDIS_802_11_SSID));\n\t\t\t\tif ((*pSsidLen) <= 32 && (*pSsidLen) != 0)\n\t\t\t\t{\n\t\t\t\t\tpWscCtrl->WscSsid.SsidLength = *pSsidLen;\n\t\t\t\t\tNdisMoveMemory(pWscCtrl->WscSsid.Ssid, Ssid, pWscCtrl->WscSsid.SsidLength);\n\t\t\t\t\tPeerConfigMethod = be2cpu16(PeerConfigMethod);\n\t\t\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_PEER_PROBE_RSP, sizeof(USHORT), &PeerConfigMethod, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\treturn TRUE;\n\t}\n\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN PeerBeaconAndProbeRspSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN UCHAR  MsgChannel,\n\tOUT BCN_IE_LIST *ie_list,\n\tOUT USHORT *LengthVIE,\t\n\tOUT PNDIS_802_11_VARIABLE_IEs pVIE)\n{\n\tUCHAR *Ptr;\n#ifdef CONFIG_STA_SUPPORT\n\tUCHAR TimLen;\n#ifdef IWSC_SUPPORT\n\tBOOLEAN bFoundIWscIe = FALSE;\n\tUSHORT PeerConfigMethod = 0;\n#endif /* IWSC_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\tPFRAME_802_11 pFrame;\n\tPEID_STRUCT pEid;\n\tUCHAR SubType;\n\tUCHAR Sanity;\n\tULONG Length = 0;\n\tUCHAR *pPeerWscIe = NULL;\n\tINT PeerWscIeLen = 0;\n\tUCHAR LatchRfChannel = 0;\n\t\n\n\t/*\n\t\tFor some 11a AP which didn't have DS_IE, we use two conditions to decide the channel\n\t\t1. If the AP is 11n enabled, then check the control channel.\n\t\t2. If the AP didn't have any info about channel, use the channel we received this \n\t\t\tframe as the channel. (May inaccuracy!!)\n\t*/\n\tUCHAR CtrlChannel = 0;\n\t\n\n\n\tos_alloc_mem(NULL, &pPeerWscIe, 512);\n\tSanity = 0;\t\t/* Add for 3 necessary EID field check*/\n\n\tie_list->AironetCellPowerLimit = 0xFF;  /* Default of AironetCellPowerLimit is 0xFF*/\n\tie_list->NewExtChannelOffset = 0xff;\t/*Default 0xff means no such IE*/\n\t*LengthVIE = 0; /* Set the length of VIE to init value 0*/\n\t\n\tpFrame = (PFRAME_802_11)Msg;\n    \n\t/* get subtype from header*/\n\tSubType = (UCHAR)pFrame->Hdr.FC.SubType;\n\n    /* get Addr2 and BSSID from header*/\n    COPY_MAC_ADDR(&ie_list->Addr2[0], pFrame->Hdr.Addr2);\n    COPY_MAC_ADDR(&ie_list->Bssid[0], pFrame->Hdr.Addr3);\n\n    Ptr = pFrame->Octet;\n    Length += LENGTH_802_11;\n    \n    /* get timestamp from payload and advance the pointer*/\n    NdisMoveMemory(&ie_list->TimeStamp, Ptr, TIMESTAMP_LEN);\n\n\tie_list->TimeStamp.u.LowPart = cpu2le32(ie_list->TimeStamp.u.LowPart);\n\tie_list->TimeStamp.u.HighPart = cpu2le32(ie_list->TimeStamp.u.HighPart);\n\n    Ptr += TIMESTAMP_LEN;\n    Length += TIMESTAMP_LEN;\n\n    /* get beacon interval from payload and advance the pointer*/\n    NdisMoveMemory(&ie_list->BeaconPeriod, Ptr, 2);\n    Ptr += 2;\n    Length += 2;\n\n    /* get capability info from payload and advance the pointer*/\n    NdisMoveMemory(&ie_list->CapabilityInfo, Ptr, 2);\n    Ptr += 2;\n    Length += 2;\n\n    if (CAP_IS_ESS_ON(ie_list->CapabilityInfo)) \n        ie_list->BssType = BSS_INFRA;\n    else \n        ie_list->BssType = BSS_ADHOC;\n\n    pEid = (PEID_STRUCT) Ptr;\n\n    /* get variable fields from payload and advance the pointer*/\n    while ((Length + 2 + pEid->Len) <= MsgLen)    \n    {\n        \n        /* Secure copy VIE to VarIE[MAX_VIE_LEN] didn't overflow.*/\n        if ((*LengthVIE + pEid->Len + 2) >= MAX_VIE_LEN)\n        {\n            DBGPRINT(RT_DEBUG_WARN, (\"%s() - Variable IEs out of resource [len(=%d) > MAX_VIE_LEN(=%d)]\\n\",\n                    __FUNCTION__, (*LengthVIE + pEid->Len + 2), MAX_VIE_LEN));\n            break;\n        }\n\n        switch(pEid->Eid)\n\t{\n\t\tcase IE_SSID:\n\t\t\t/* Already has one SSID EID in this beacon, ignore the second one*/\n\t\t\tif (Sanity & 0x1)\n\t\t\t\tbreak;\n\t\t\tif(pEid->Len <= MAX_LEN_OF_SSID)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_list->Ssid[0], pEid->Octet, pEid->Len);\n\t\t\t\tie_list->SsidLen = pEid->Len;\n\t\t\t\tSanity |= 0x1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_SSID (len=%d)\\n\",__FUNCTION__,pEid->Len));\n\t\t\t\tgoto SanityCheck;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_SUPP_RATES:\n\t\t\tif(pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t{\n\t\t\t\tSanity |= 0x2;\n\t\t\t\tNdisMoveMemory(&ie_list->SupRate[0], pEid->Octet, pEid->Len);\n\t\t\t\tie_list->SupRateLen = pEid->Len;\n\n\t\t\t\t/*\n\t\t\t\tTODO: 2004-09-14 not a good design here, cause it exclude extra \n\t\t\t\trates from ScanTab. We should report as is. And filter out \n\t\t\t\tunsupported rates in MlmeAux\n\t\t\t\t*/\n\t\t\t\t/* Check against the supported rates*/\n\t\t\t\t/* RTMPCheckRates(pAd, SupRate, pSupRateLen);*/\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_SUPP_RATES (len=%d)\\n\",__FUNCTION__,pEid->Len));\n\t\t\t\tgoto SanityCheck;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_HT_CAP:\n\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE)  /*Note: allow extension.!!*/\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_list->HtCapability, pEid->Octet, sizeof(HT_CAPABILITY_IE));\n\t\t\t\tie_list->HtCapabilityLen = SIZE_HT_CAP_IE;\t/* Nnow we only support 26 bytes.*/\n\n\t\t\t\t*(USHORT *)(&ie_list->HtCapability.HtCapInfo) = cpu2le16(*(USHORT *)(&ie_list->HtCapability.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t\t{\n\t\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\t\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&ie_list->HtCapability.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\t\tNdisMoveMemory((PUCHAR)(&ie_list->HtCapability.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t}\n#else\n\t\t\t\t*(USHORT *)(&ie_list->HtCapability.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&ie_list->HtCapability.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\tie_list->PreNHtCapabilityLen = 0;\t/* Now we only support 26 bytes.*/\n\n\t\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s() - wrong IE_HT_CAP. pEid->Len = %d\\n\", __FUNCTION__, pEid->Len));\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase IE_ADD_HT:\n\t\t\tif (pEid->Len >= sizeof(ADD_HT_INFO_IE))\t\t\t\t\n\t\t\t{\n\t\t\t\t/* \n\t\t\t\tThis IE allows extension, but we can ignore extra bytes beyond our \n\t\t\t\tknowledge , so only copy first sizeof(ADD_HT_INFO_IE)\n\t\t\t\t*/\n\t\t\t\tNdisMoveMemory(&ie_list->AddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE));\n\t\t\t\tie_list->AddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n\n\t\t\t\tCtrlChannel = ie_list->AddHtInfo.ControlChan;\n\n\t\t\t\t*(USHORT *)(&ie_list->AddHtInfo.AddHtInfo2) = cpu2le16(*(USHORT *)(&ie_list->AddHtInfo.AddHtInfo2));\n\t\t\t\t*(USHORT *)(&ie_list->AddHtInfo.AddHtInfo3) = cpu2le16(*(USHORT *)(&ie_list->AddHtInfo.AddHtInfo3));\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s() - wrong IE_ADD_HT. \\n\", __FUNCTION__));\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase IE_SECONDARY_CH_OFFSET:\n\t\t\tif (pEid->Len == 1)\n\t\t\t\tie_list->NewExtChannelOffset = pEid->Octet[0];\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s() - wrong IE_SECONDARY_CH_OFFSET. \\n\", __FUNCTION__));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_FH_PARM:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(IE_FH_PARM) \\n\", __FUNCTION__));\n\t\t\tbreak;\n\n\t\tcase IE_DS_PARM:\n\t\t\tif(pEid->Len == 1)\n\t\t\t{\n\t\t\t\tie_list->Channel = *pEid->Octet;\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\tif (ChannelSanity(pAd, ie_list->Channel) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tgoto SanityCheck;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\tSanity |= 0x4;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_DS_PARM (len=%d)\\n\",__FUNCTION__,pEid->Len));\n\t\t\t\tgoto SanityCheck;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_CF_PARM:\n\t\t\tif(pEid->Len == 6)\n\t\t\t{\n\t\t\t\tie_list->CfParm.bValid = TRUE;\n\t\t\t\tie_list->CfParm.CfpCount = pEid->Octet[0];\n\t\t\t\tie_list->CfParm.CfpPeriod = pEid->Octet[1];\n\t\t\t\tie_list->CfParm.CfpMaxDuration = pEid->Octet[2] + 256 * pEid->Octet[3];\n\t\t\t\tie_list->CfParm.CfpDurRemaining = pEid->Octet[4] + 256 * pEid->Octet[5];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_CF_PARM\\n\", __FUNCTION__));\n\t\t\t\tif (pPeerWscIe)\n\t\t\t\t\tos_free_mem(NULL, pPeerWscIe);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_IBSS_PARM:\n\t\t\tif(pEid->Len == 2)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_list->AtimWin, pEid->Octet, pEid->Len);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() - wrong IE_IBSS_PARM\\n\", __FUNCTION__));\n\t\t\t\tif (pPeerWscIe)\n\t\t\t\t\tos_free_mem(NULL, pPeerWscIe);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tcase IE_TIM:\n\t\t\tif(SubType == SUBTYPE_BEACON)\n\t\t\t{\n#ifdef P2P_SUPPORT\n\t\t\t\tif (P2P_CLI_ON(pAd) && NdisEqualMemory(&ie_list->Bssid[0], pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN))\n\t\t\t\t{\n\t\t\t\t\tGetTimBit((PCHAR)pEid, pAd->ApCliMlmeAux.Aid, &TimLen,\n\t\t\t\t\t&ie_list->BcastFlag, &ie_list->DtimCount,\n\t\t\t\t\t&ie_list->DtimPeriod, &ie_list->MessageToMe);\n\t\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\t\tif (INFRA_ON(pAd) && NdisEqualMemory(&ie_list->Bssid[0], pAd->CommonCfg.Bssid, MAC_ADDR_LEN))\n\t\t\t\t{\n\t\t\t\t\tGetTimBit((PCHAR)pEid, pAd->StaActive.Aid, &TimLen, &ie_list->BcastFlag,\n\t\t\t\t\t&ie_list->DtimCount, &ie_list->DtimPeriod, &ie_list->MessageToMe);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n#endif /* CONFIG_STA_SUPPORT */\n\t\tcase IE_CHANNEL_SWITCH_ANNOUNCEMENT:\n\t\t\tif(pEid->Len == 3)\n\t\t\t\tie_list->NewChannel = pEid->Octet[1];\t/*extract new channel number*/\n\t\t\tbreak;\n\n\t\t\t/* \n\t\t\tNew for WPA\n\t\t\tCCX v2 has the same IE, we need to parse that too\n\t\t\tWifi WMM use the same IE vale, need to parse that too\n\t\t\t*/\n\t\t/* case IE_WPA:*/\n\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t/* Check the OUI version, filter out non-standard usage*/\n\t\t\tif (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 7))\n\t\t\t{\n\t\t\t\tif (pEid->Octet[3] != 0)\n\t\t\t\t\tie_list->RalinkIe = pEid->Octet[3];\n\t\t\t\telse\n\t\t\t\t\tie_list->RalinkIe = 0xf0000000; /* Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag.*/\n\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan.*/\n\n\t\t\t/* Other vendors had production before IE_HT_CAP value is assigned. To backward support those old-firmware AP,*/\n\t\t\t/* Check broadcom-defiend pre-802.11nD1.0 OUI for HT related IE, including HT Capatilities IE and HT Information IE*/\n\t\t\telse if ((ie_list->HtCapabilityLen == 0) && NdisEqualMemory(pEid->Octet, PRE_N_HT_OUI, 3) && (pEid->Len >= 4) && (pAd->OpMode == OPMODE_STA))\n\t\t\t{\n\t\t\t\tif ((pEid->Octet[3] == OUI_PREN_HT_CAP) && (pEid->Len >= 30) && (ie_list->HtCapabilityLen == 0))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(&ie_list->HtCapability, &pEid->Octet[4], sizeof(HT_CAPABILITY_IE));\n\t\t\t\t\tie_list->PreNHtCapabilityLen = SIZE_HT_CAP_IE;\n\t\t\t\t}\n\n\t\t\t\tif ((pEid->Octet[3] == OUI_PREN_ADD_HT) && (pEid->Len >= 26))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(&ie_list->AddHtInfo, &pEid->Octet[4], sizeof(ADD_HT_INFO_IE));\n\t\t\t\t\tie_list->AddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n\t\t\t\t}\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\telse if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))\n\t\t\t{\n\t\t\t\t/* Copy to pVIE which will report to bssid list.*/\n\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t}\n\t\t\telse if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))\n\t\t\t{\n\t\t\t\tPUCHAR ptr;\n\t\t\t\tint i;\n\n\t\t\t\t/* parsing EDCA parameters*/\n\t\t\t\tie_list->EdcaParm.bValid          = TRUE;\n\t\t\t\tie_list->EdcaParm.bQAck           = FALSE; /* pEid->Octet[0] & 0x10;*/\n\t\t\t\tie_list->EdcaParm.bQueueRequest   = FALSE; /* pEid->Octet[0] & 0x20;*/\n\t\t\t\tie_list->EdcaParm.bTxopRequest    = FALSE; /* pEid->Octet[0] & 0x40;*/\n\t\t\t\tie_list->EdcaParm.EdcaUpdateCount = pEid->Octet[6] & 0x0f;\n\t\t\t\tie_list->EdcaParm.bAPSDCapable    = (pEid->Octet[6] & 0x80) ? 1 : 0;\n\t\t\t\tptr = &pEid->Octet[8];\n\t\t\t\tfor (i=0; i<4; i++)\n\t\t\t\t{\n\t\t\t\t\tUCHAR aci = (*ptr & 0x60) >> 5; /* b5~6 is AC INDEX*/\n\t\t\t\t\tie_list->EdcaParm.bACM[aci]  = (((*ptr) & 0x10) == 0x10);   /* b5 is ACM*/\n\t\t\t\t\tie_list->EdcaParm.Aifsn[aci] = (*ptr) & 0x0f;               /* b0~3 is AIFSN*/\n\t\t\t\t\tie_list->EdcaParm.Cwmin[aci] = *(ptr+1) & 0x0f;             /* b0~4 is Cwmin*/\n\t\t\t\t\tie_list->EdcaParm.Cwmax[aci] = *(ptr+1) >> 4;               /* b5~8 is Cwmax*/\n\t\t\t\t\tie_list->EdcaParm.Txop[aci]  = *(ptr+2) + 256 * (*(ptr+3)); /* in unit of 32-us*/\n\t\t\t\t\tptr += 4; /* point to next AC*/\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6) && (pEid->Len == 7))\n\t\t\t{\n\t\t\t\t/* parsing EDCA parameters*/\n\t\t\t\tie_list->EdcaParm.bValid          = TRUE;\n\t\t\t\tie_list->EdcaParm.bQAck           = FALSE; /* pEid->Octet[0] & 0x10;*/\n\t\t\t\tie_list->EdcaParm.bQueueRequest   = FALSE; /* pEid->Octet[0] & 0x20;*/\n\t\t\t\tie_list->EdcaParm.bTxopRequest    = FALSE; /* pEid->Octet[0] & 0x40;*/\n\t\t\t\tie_list->EdcaParm.EdcaUpdateCount = pEid->Octet[6] & 0x0f;\n\t\t\t\tie_list->EdcaParm.bAPSDCapable    = (pEid->Octet[6] & 0x80) ? 1 : 0;\n\n\t\t\t\t/* use default EDCA parameter*/\n\t\t\t\tie_list->EdcaParm.bACM[QID_AC_BE]  = 0;\n\t\t\t\tie_list->EdcaParm.Aifsn[QID_AC_BE] = 3;\n\t\t\t\tie_list->EdcaParm.Cwmin[QID_AC_BE] = CW_MIN_IN_BITS;\n\t\t\t\tie_list->EdcaParm.Cwmax[QID_AC_BE] = CW_MAX_IN_BITS;\n\t\t\t\tie_list->EdcaParm.Txop[QID_AC_BE]  = 0;\n\n\t\t\t\tie_list->EdcaParm.bACM[QID_AC_BK]  = 0;\n\t\t\t\tie_list->EdcaParm.Aifsn[QID_AC_BK] = 7;\n\t\t\t\tie_list->EdcaParm.Cwmin[QID_AC_BK] = CW_MIN_IN_BITS;\n\t\t\t\tie_list->EdcaParm.Cwmax[QID_AC_BK] = CW_MAX_IN_BITS;\n\t\t\t\tie_list->EdcaParm.Txop[QID_AC_BK]  = 0;\n\n\t\t\t\tie_list->EdcaParm.bACM[QID_AC_VI]  = 0;\n\t\t\t\tie_list->EdcaParm.Aifsn[QID_AC_VI] = 2;\n\t\t\t\tie_list->EdcaParm.Cwmin[QID_AC_VI] = CW_MIN_IN_BITS-1;\n\t\t\t\tie_list->EdcaParm.Cwmax[QID_AC_VI] = CW_MAX_IN_BITS;\n\t\t\t\tie_list->EdcaParm.Txop[QID_AC_VI]  = 96;   /* AC_VI: 96*32us ~= 3ms*/\n\n\t\t\t\tie_list->EdcaParm.bACM[QID_AC_VO]  = 0;\n\t\t\t\tie_list->EdcaParm.Aifsn[QID_AC_VO] = 2;\n\t\t\t\tie_list->EdcaParm.Cwmin[QID_AC_VO] = CW_MIN_IN_BITS-2;\n\t\t\t\tie_list->EdcaParm.Cwmax[QID_AC_VO] = CW_MAX_IN_BITS-1;\n\t\t\t\tie_list->EdcaParm.Txop[QID_AC_VO]  = 48;   /* AC_VO: 48*32us ~= 1.5ms*/\n\t\t\t}\n\t\t\telse if (NdisEqualMemory(pEid->Octet, WPS_OUI, 4)\n#ifdef IWSC_SUPPORT\n\t\t\t\t\t|| NdisEqualMemory(pEid->Octet, IWSC_OUI, 4)\n#endif // IWSC_SUPPORT //\n\t\t\t)\n\t\t\t{\n\t\t\t\tif (PeerWscIeLen >= 512)\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: PeerWscIeLen = %d (>= 512)\\n\", __FUNCTION__, PeerWscIeLen));\n\t\t\t\tif (pPeerWscIe && (PeerWscIeLen < 512))\n\t\t\t\t{\n\t\t\t\tNdisMoveMemory(pPeerWscIe+PeerWscIeLen, pEid->Octet+4, pEid->Len-4);\n\t\t\t\tPeerWscIeLen += (pEid->Len - 4);\n\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, IWSC_OUI, 4))\n\t\t\t\tbFoundIWscIe = TRUE;\n#endif /* IWSC_SUPPORT */\n\n\t\t\t}\n\n\n\t\t\tbreak;\n\n\t\tcase IE_EXT_SUPP_RATES:\n\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_list->ExtRate[0], pEid->Octet, pEid->Len);\n\t\t\t\tie_list->ExtRateLen = pEid->Len;\n\n\t\t\t\t/*\n\t\t\t\tTODO: 2004-09-14 not a good design here, cause it exclude extra rates\n\t\t\t\tfrom ScanTab. We should report as is. And filter out unsupported\n\t\t\t\trates in MlmeAux\n\t\t\t\t*/\n\t\t\t\t/* Check against the supported rates*/\n\t\t\t\t/* RTMPCheckRates(pAd, ExtRate, pExtRateLen);*/\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_ERP:\n\t\t\tif (pEid->Len == 1)\n\t\t\t\tie_list->Erp = (UCHAR)pEid->Octet[0];\n\t\t\tbreak;\n\n\t\tcase IE_AIRONET_CKIP:\n\t\t\t/*\n\t\t\t0. Check Aironet IE length, it must be larger or equal to 28\n\t\t\tCisco AP350 used length as 28\n\t\t\tCisco AP12XX used length as 30\n\t\t\t*/\n\t\t\tif (pEid->Len < (CKIP_NEGOTIATION_LENGTH - 2))\n\t\t\t\tbreak;\n\n\t\t\t/* 1. Copy CKIP flag byte to buffer for process*/\n\t\t\tie_list->CkipFlag = *(pEid->Octet + 8);\t\t\t\t\n\t\t\tbreak;\n\n\t\tcase IE_AP_TX_POWER:\n\t\t\t/* AP Control of Client Transmit Power*/\n\t\t\t/*0. Check Aironet IE length, it must be 6*/\n\t\t\tif (pEid->Len != 0x06)\n\t\t\t\tbreak;\n\n\t\t\t/* Get cell power limit in dBm*/\n\t\t\tif (NdisEqualMemory(pEid->Octet, CISCO_OUI, 3) == 1)\n\t\t\t\tie_list->AironetCellPowerLimit = *(pEid->Octet + 4);\t\n\t\t\tbreak;\n\n\t\t/* WPA2 & 802.11i RSN*/\n\t\tcase IE_RSN:\n\t\t\t/* There is no OUI for version anymore, check the group cipher OUI before copying*/\n\t\t\tif (RTMPEqualMemory(pEid->Octet + 2, RSN_OUI, 3))\n\t\t\t{\n\t\t\t\t/* Copy to pVIE which will report to microsoft bssid list.*/\n\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef WAPI_SUPPORT\n\t\t/* WAPI information element*/\n\t\tcase IE_WAPI:                \n\t\t\tif (RTMPEqualMemory(pEid->Octet + 4, WAPI_OUI, 3))\n\t\t\t{\n\t\t\t\t/* Copy to pVIE*/\n\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t}\n\t\t\tbreak;\n#endif /* WAPI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#if defined (EXT_BUILD_CHANNEL_LIST) || defined (RT_CFG80211_SUPPORT)\n\t\tcase IE_COUNTRY:\n\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\tbreak;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tcase IE_QBSS_LOAD:\n\t\t\tif (pEid->Len == 5)\n\t\t\t{\n\t\t\t\tie_list->QbssLoad.bValid = TRUE;\n\t\t\t\tie_list->QbssLoad.StaNum = pEid->Octet[0] + pEid->Octet[1] * 256;\n\t\t\t\tie_list->QbssLoad.ChannelUtilization = pEid->Octet[2];\n\t\t\t\tie_list->QbssLoad.RemainingAdmissionControl = pEid->Octet[3] + pEid->Octet[4] * 256;\n\n\t\t\t\t/* Copy to pVIE*/\n\t\t\t\tPtr = (PUCHAR) pVIE;\n\t\t\t\tNdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t*LengthVIE += (pEid->Len + 2);\n\t\t\t}\n\t\t\tbreak;\n\n\n\n\t\tcase IE_EXT_CAPABILITY:\n\t\t\tif (pEid->Len >= 1)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&ie_list->ExtCapInfo,&pEid->Octet[0], sizeof(EXT_CAP_INFO_ELEMENT) /*4*/);\n\t\t\t\tbreak;\n\t\t\t}\n\n#ifdef DOT11_VHT_AC\n\t\tcase IE_VHT_CAP:\n\t\t\tif (pEid->Len == sizeof(VHT_CAP_IE)) {\n\t\t\t\tNdisMoveMemory(&ie_list->vht_cap_ie, &pEid->Octet[0], sizeof(VHT_CAP_IE));\n\t\t\t\tie_list->vht_cap_len = pEid->Len;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IE_VHT_OP:\n\t\t\tif (pEid->Len == sizeof(VHT_OP_IE)) {\n\t\t\t\tNdisMoveMemory(&ie_list->vht_op_ie, &pEid->Octet[0], sizeof(VHT_OP_IE));\n\t\t\t\tie_list->vht_op_len = pEid->Len;\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11_VHT_AC */\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n        \n\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len]*/\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n    }\n\n\tLatchRfChannel = MsgChannel;\n\n\tif ((pAd->LatchRfRegs.Channel > 14) && ((Sanity & 0x4) == 0))\n\t{\n\t\tif (CtrlChannel != 0)\n\t\t\tie_list->Channel = CtrlChannel;\n\t\telse\n\t\t\tie_list->Channel = LatchRfChannel;\n\t\tSanity |= 0x4;\n\t}\n\n\tif (pPeerWscIe && (PeerWscIeLen > 0) && (PeerWscIeLen < 512))\n\t{\n\t\tUCHAR WscIe[] = {0xdd, 0x00, 0x00, 0x50, 0xF2, 0x04};\n\t\tPtr = (PUCHAR) pVIE;\n\t\tWscIe[1] = PeerWscIeLen + 4;\n\t\tNdisMoveMemory(Ptr + *LengthVIE, WscIe, 6);\n\t\tNdisMoveMemory(Ptr + *LengthVIE + 6, pPeerWscIe, PeerWscIeLen);\n\t\t*LengthVIE += (PeerWscIeLen + 6);\n#ifdef IWSC_SUPPORT\n\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t(SubType == SUBTYPE_PROBE_RSP) &&\n\t\t\t(bFoundIWscIe == TRUE))\n\t\t{\n\t\t\tBOOLEAN bSelReg = FALSE;\n\t\t\tUSHORT DataLen = 0;\n\t\t\t\n\t\t\t/* re-use this boolean variable */\n\t\t\tbFoundIWscIe = FALSE;\n\t\t\tWscGetDataFromPeerByTag(pAd, pPeerWscIe, PeerWscIeLen, WSC_ID_SEL_REGISTRAR, &bSelReg, NULL);\t\t\t\t\n\t\t\tif (bSelReg)\n\t\t\t{\n\t\t\t\tbFoundIWscIe = TRUE;\n\t\t\t\tif (WscGetDataFromPeerByTag(pAd, \n\t\t\t\t\t\t\t\t\t\t\tpPeerWscIe, \n\t\t\t\t\t\t\t\t\t\t\tPeerWscIeLen,\n\t\t\t\t\t\t\t\t\t\t\tWSC_ID_MAC_ADDR, \n\t\t\t\t\t\t\t\t\t\t\t&pAd->StaCfg.WscControl.WscPeerMAC[0], \n\t\t\t\t\t\t\t\t\t\t\tNULL) == FALSE)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.WscControl.WscPeerMAC[0], ie_list->Addr2, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(&pAd->StaCfg.WscControl.EntryAddr[0], \n\t\t\t\t\t\t&pAd->StaCfg.WscControl.WscPeerMAC[0], \n\t\t\t\t\t\tMAC_ADDR_LEN);\n\t\t\t\thex_dump(\"PeerBeaconAndProbeRspSanity - WscPeerMAC\", &pAd->StaCfg.WscControl.WscPeerMAC[0], MAC_ADDR_LEN);\n\t\t\t\t\n\t\t\t\tWscGetDataFromPeerByTag(pAd, \n\t\t\t\t\t\t\t\t\t\tpPeerWscIe, \n\t\t\t\t\t\t\t\t\t\tPeerWscIeLen,\n\t\t\t\t\t\t\t\t\t\tWSC_ID_SEL_REG_CFG_METHODS, \n\t\t\t\t\t\t\t\t\t\t&PeerConfigMethod, \n\t\t\t\t\t\t\t\t\t\tNULL);\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t}\n\t\t\n\nSanityCheck:\n\tif (pPeerWscIe)\n\t\tos_free_mem(NULL, pPeerWscIe);\n\n\tif (Sanity != 0x7)\n\t{\n\t\tDBGPRINT(RT_DEBUG_LOUD, (\"%s() - missing field, Sanity=0x%02x\\n\", __FUNCTION__, Sanity));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n#ifdef IWSC_SUPPORT\n\t\tif (bFoundIWscIe && (pAd->StaCfg.BssType == BSS_ADHOC))\n\t\t{\n\t\t\tPWSC_CTRL pWscCtrl = &pAd->StaCfg.WscControl;\n\t\t\tif ((pWscCtrl->WscConfMode == WSC_ENROLLEE) &&\n\t\t\t\t(pWscCtrl->WscMode == WSC_PIN_MODE) &&\n\t\t\t\t(pWscCtrl->bWscTrigger == TRUE))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&pWscCtrl->WscSsid, sizeof(NDIS_802_11_SSID));\n\t\t\t\tif ((ie_list->SsidLen) <= 32 && (ie_list->SsidLen) != 0)\n\t\t\t\t{\n\t\t\t\t\tpWscCtrl->WscSsid.SsidLength = ie_list->SsidLen;\n\t\t\t\t\tNdisMoveMemory(pWscCtrl->WscSsid.Ssid, &ie_list->Ssid[0], pWscCtrl->WscSsid.SsidLength);\n\t\t\t\t\tPeerConfigMethod = be2cpu16(PeerConfigMethod);\n\t\t\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_PEER_PROBE_RSP, sizeof(USHORT), &PeerConfigMethod, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\treturn TRUE;\n\t}\n}\n\n\n#ifdef DOT11N_DRAFT3\n/* \n\t==========================================================================\n\tDescription:\n\t\tMLME message sanity check for some IE addressed  in 802.11n d3.03.\n\tReturn:\n\t\tTRUE if all parameters are OK, FALSE otherwise\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nBOOLEAN PeerBeaconAndProbeRspSanity2(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN OVERLAP_BSS_SCAN_IE *BssScan,\n\tOUT UCHAR \t*RegClass)\n{\n\tCHAR\t\t\t\t*Ptr;\n\tPFRAME_802_11\t\tpFrame;\n\tPEID_STRUCT\t\t\tpEid;\n\tULONG\t\t\t\tLength = 0;\t\n\tBOOLEAN\t\t\t\tbrc;\n\n\tpFrame = (PFRAME_802_11)Msg;\n\n\t*RegClass = 0;\n\tPtr = pFrame->Octet;\n\tLength += LENGTH_802_11;\n\n\t/* get timestamp from payload and advance the pointer*/\n\tPtr += TIMESTAMP_LEN;\n\tLength += TIMESTAMP_LEN;\n\n\t/* get beacon interval from payload and advance the pointer*/\n\tPtr += 2;\n\tLength += 2;\n\n\t/* get capability info from payload and advance the pointer*/\n\tPtr += 2;\n\tLength += 2;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\tbrc = FALSE;\n\n\tRTMPZeroMemory(BssScan, sizeof(OVERLAP_BSS_SCAN_IE));\n\t/* get variable fields from payload and advance the pointer*/\n\twhile ((Length + 2 + pEid->Len) <= MsgLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_SUPP_REG_CLASS:\n\t\t\t\tif(pEid->Len > 0)\n\t\t\t\t{\n\t\t\t\t\t*RegClass = *pEid->Octet;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerBeaconAndProbeRspSanity - wrong IE_SUPP_REG_CLASS (len=%d)\\n\",pEid->Len));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IE_OVERLAPBSS_SCAN_PARM:\n\t\t\t\tif (pEid->Len == sizeof(OVERLAP_BSS_SCAN_IE))\n\t\t\t\t{\n\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\tRTMPMoveMemory(BssScan, pEid->Octet, sizeof(OVERLAP_BSS_SCAN_IE));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerBeaconAndProbeRspSanity - wrong IE_OVERLAPBSS_SCAN_PARM (len=%d)\\n\",pEid->Len));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerBeaconAndProbeRspSanity - IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT\\n\"));\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len]\t*/\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t}\n\n\treturn brc;\n\n}\n#endif /* DOT11N_DRAFT3 */\n\n#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT)\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN MlmeScanReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT UCHAR *pBssType, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT UCHAR *pScanType) \n{\n\tMLME_SCAN_REQ_STRUCT *Info;\n\n\tInfo = (MLME_SCAN_REQ_STRUCT *)(Msg);\n\t*pBssType = Info->BssType;\n\t*pSsidLen = Info->SsidLen;\t\n\tNdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);\n\t*pScanType = Info->ScanType;\n\n\tif ((*pBssType == BSS_INFRA || *pBssType == BSS_ADHOC || *pBssType == BSS_ANY)\n\t\t&& (SCAN_MODE_VALID(*pScanType))\n\t)\n\t{\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeScanReqSanity fail - wrong BssType or ScanType\\n\"));\n\t\treturn FALSE;\n\t}\n}\n#endif\n\n/* IRQL = DISPATCH_LEVEL*/\nUCHAR ChannelSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN UCHAR channel)\n{\n    int i;\n\n    for (i = 0; i < pAd->ChannelListNum; i ++)\n    {\n        if (channel == pAd->ChannelList[i].Channel)\n            return 1;\n    }\n    return 0;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN PeerDeauthSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr1, \n    OUT PUCHAR pAddr2, \n    OUT PUCHAR pAddr3, \n    OUT USHORT *pReason) \n{\n    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;\n\n\tCOPY_MAC_ADDR(pAddr1, pFrame->Hdr.Addr1);\n    COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\tCOPY_MAC_ADDR(pAddr3, pFrame->Hdr.Addr3);\n    NdisMoveMemory(pReason, &pFrame->Octet[0], 2);\n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN PeerAuthSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr, \n    OUT USHORT *pAlg, \n    OUT USHORT *pSeq, \n    OUT USHORT *pStatus, \n    CHAR *pChlgText) \n{\n    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;\n\n    COPY_MAC_ADDR(pAddr,   pFrame->Hdr.Addr2);\n    NdisMoveMemory(pAlg,    &pFrame->Octet[0], 2);\n    NdisMoveMemory(pSeq,    &pFrame->Octet[2], 2);\n    NdisMoveMemory(pStatus, &pFrame->Octet[4], 2);\n\n    if (*pAlg == AUTH_MODE_OPEN)\n    {\n        if (*pSeq == 1 || *pSeq == 2) \n        {\n            return TRUE;\n        } \n        else \n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"PeerAuthSanity fail - wrong Seg#\\n\"));\n            return FALSE;\n        }\n    } \n    else if (*pAlg == AUTH_MODE_KEY) \n    {\n        if (*pSeq == 1 || *pSeq == 4) \n        {\n            return TRUE;\n        } \n        else if (*pSeq == 2 || *pSeq == 3) \n        {\n            NdisMoveMemory(pChlgText, &pFrame->Octet[8], CIPHER_TEXT_LEN);\n            return TRUE;\n        } \n        else \n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"PeerAuthSanity fail - wrong Seg#\\n\"));\n            return FALSE;\n        }\n    } \n    else \n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"PeerAuthSanity fail - wrong algorithm\\n\"));\n        return FALSE;\n    }\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN MlmeAuthReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr, \n    OUT ULONG *pTimeout, \n    OUT USHORT *pAlg) \n{\n    MLME_AUTH_REQ_STRUCT *pInfo;\n\n    pInfo  = (MLME_AUTH_REQ_STRUCT *)Msg;\n    COPY_MAC_ADDR(pAddr, pInfo->Addr);\n    *pTimeout = pInfo->Timeout;\n    *pAlg = pInfo->Alg;\n    \n    if (((*pAlg == AUTH_MODE_KEY) ||(*pAlg == AUTH_MODE_OPEN)\n     \t) && \n        ((*pAddr & 0x01) == 0)) \n    {\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_INCLUDED\n\t\tif (pAd->StaCfg.WscControl.bWscTrigger && (pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE))\n\t\t\t*pAlg = AUTH_MODE_OPEN;\n#endif /* WSC_INCLUDED */\n#endif /* CONFIG_STA_SUPPORT */\n        return TRUE;\n    } \n    else \n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"MlmeAuthReqSanity fail - wrong algorithm\\n\"));\n        return FALSE;\n    }\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN MlmeAssocReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pApAddr, \n    OUT USHORT *pCapabilityInfo, \n    OUT ULONG *pTimeout, \n    OUT USHORT *pListenIntv) \n{\n    MLME_ASSOC_REQ_STRUCT *pInfo;\n\n    pInfo = (MLME_ASSOC_REQ_STRUCT *)Msg;\n    *pTimeout = pInfo->Timeout;                             /* timeout*/\n    COPY_MAC_ADDR(pApAddr, pInfo->Addr);                   /* AP address*/\n    *pCapabilityInfo = pInfo->CapabilityInfo;               /* capability info*/\n    *pListenIntv = pInfo->ListenIntv;\n    \n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN PeerDisassocSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT USHORT *pReason) \n{\n    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;\n\n    COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n    NdisMoveMemory(pReason, &pFrame->Octet[0], 2);\n\n    return TRUE;\n}\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tSanity check NetworkType (11b, 11g or 11a)\n\t\t\n\tArguments:\n\t\tpBss - Pointer to BSS table.\n\n\tReturn Value:\n        Ndis802_11DS .......(11b)\n        Ndis802_11OFDM24....(11g)\n        Ndis802_11OFDM5.....(11a)\n        \n\tIRQL = DISPATCH_LEVEL\n\t\n\t========================================================================\n*/\nNDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(\n    IN PBSS_ENTRY pBss)\n{\n\tNDIS_802_11_NETWORK_TYPE\tNetWorkType;\n\tUCHAR\t\t\t\t\t\trate, i;\n\n\tNetWorkType = Ndis802_11DS;\n\t\n\tif (pBss->Channel <= 14)\n\t{\n\t\t\n\t\t/* First check support Rate.*/\n\t\tfor (i = 0; i < pBss->SupRateLen; i++)\n\t\t{\n\t\t\trate = pBss->SupRate[i] & 0x7f; /* Mask out basic rate set bit*/\n\t\t\tif ((rate == 2) || (rate == 4) || (rate == 11) || (rate == 22))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\n\t\t\t\t/* Otherwise (even rate > 108) means Ndis802_11OFDM24*/\n\t\t\t\tNetWorkType = Ndis802_11OFDM24;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\t\t\n\t\t/* Second check Extend Rate.*/\n\t\tif (NetWorkType != Ndis802_11OFDM24)\n\t\t{\n\t\t\tfor (i = 0; i < pBss->ExtRateLen; i++)\n\t\t\t{\n\t\t\t\trate = pBss->SupRate[i] & 0x7f; /* Mask out basic rate set bit*/\n\t\t\t\tif ((rate == 2) || (rate == 4) || (rate == 11) || (rate == 22))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\t/* Otherwise (even rate > 108) means Ndis802_11OFDM24*/\n\t\t\t\t\tNetWorkType = Ndis802_11OFDM24;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tNetWorkType = Ndis802_11OFDM5;\n\t}\n\n    if (pBss->HtCapabilityLen != 0)\n    {\n        if (NetWorkType == Ndis802_11OFDM5)\n            NetWorkType = Ndis802_11OFDM5_N;\n        else\n            NetWorkType = Ndis802_11OFDM24_N;\n    }\n\n\treturn NetWorkType;\n}\t\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\nBOOLEAN MlmeDlsReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PRT_802_11_DLS *pDLS,\n    OUT PUSHORT pReason)\n{\n\tMLME_DLS_REQ_STRUCT *pInfo;\n\n    pInfo = (MLME_DLS_REQ_STRUCT *)Msg;\n    \n\t*pDLS = pInfo->pDLS;\n\t*pReason = pInfo->Reason;\n\n\treturn TRUE;\n}\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef QOS_DLS_SUPPORT\nBOOLEAN PeerDlsReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PUCHAR pDA,\n    OUT PUCHAR pSA,\n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pDlsTimeout,\n    OUT UCHAR *pRatesLen,\n    OUT UCHAR Rates[],\n\tOUT UCHAR *pHtCapabilityLen,\n    OUT HT_CAPABILITY_IE *pHtCapability)\n{\n\tCHAR            *Ptr;\n    PFRAME_802_11\tFr = (PFRAME_802_11)Msg;\n\tPEID_STRUCT  eid_ptr;\n\n    /* to prevent caller from using garbage output value*/\n    *pCapabilityInfo\t= 0;\n    *pDlsTimeout\t= 0;\n\t*pHtCapabilityLen = 0;\n\n    Ptr = (PCHAR)Fr->Octet;\n\n\t/* offset to destination MAC address (Category and Action field)*/\n    Ptr += 2;\n\n    /* get DA from payload and advance the pointer*/\n    NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN);\n    Ptr += MAC_ADDR_LEN;\n\n    /* get SA from payload and advance the pointer*/\n    NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN);\n    Ptr += MAC_ADDR_LEN;\n\n    /* get capability info from payload and advance the pointer*/\n    NdisMoveMemory(pCapabilityInfo, Ptr, 2);\n    Ptr += 2;\n\n    /* get capability info from payload and advance the pointer*/\n    NdisMoveMemory(pDlsTimeout, Ptr, 2);\n    Ptr += 2;\n\n\t/* Category and Action field + DA + SA + capability + Timeout*/\n\teid_ptr = (PEID_STRUCT) &Fr->Octet[18];\t\n\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((UCHAR*)Fr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_SUPP_RATES:\n                if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0))\n                {\n                    NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len);\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsReqSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\\n\",eid_ptr->Len, Rates[0]));\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Rates[1]=%x %x %x %x %x %x %x\\n\", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7]));\n                    *pRatesLen = eid_ptr->Len;\n                }\n                else\n                {\n                    *pRatesLen = 8;\n\t\t\t\t\tRates[0] = 0x82;\n\t\t\t\t\tRates[1] = 0x84;\n\t\t\t\t\tRates[2] = 0x8b;\n\t\t\t\t\tRates[3] = 0x96;\n\t\t\t\t\tRates[4] = 0x12;\n\t\t\t\t\tRates[5] = 0x24;\n\t\t\t\t\tRates[6] = 0x48;\n\t\t\t\t\tRates[7] = 0x6c;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsReqSanity - wrong IE_SUPP_RATES., Len=%d\\n\",eid_ptr->Len));\n                }\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_SUPP_RATES:\n                if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES)\n                {\n                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len);\n                    *pRatesLen = (*pRatesLen) + eid_ptr->Len;\n                }\n                else\n                {\n                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen));\n                    *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES;\n                }\n\t\t\t\tbreak;\n\n\t\t\tcase IE_HT_CAP:\n\t\t\t\tif (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pHtCapability, eid_ptr->Octet, sizeof(HT_CAPABILITY_IE));\n\n\t\t\t\t\t*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t\t\t{\n\t\t\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\t\t\tNdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t\t\t}\n#else\t\t\t\t\n\t\t\t\t\t*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\t\t\t\t\t*pHtCapabilityLen = sizeof(HT_CAPABILITY_IE);\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsReqSanity - IE_HT_CAP\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsReqSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\\n\", eid_ptr->Len));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);\n\t}\n\n    return TRUE;\n}\n\nBOOLEAN PeerDlsRspSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PUCHAR pDA,\n    OUT PUCHAR pSA,\n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pStatus,\n    OUT UCHAR *pRatesLen,\n    OUT UCHAR Rates[],\n    OUT UCHAR *pHtCapabilityLen,\n    OUT HT_CAPABILITY_IE *pHtCapability) \n{\n    CHAR            *Ptr;\n    PFRAME_802_11\tFr = (PFRAME_802_11)Msg;\n\tPEID_STRUCT  eid_ptr;\n\n    /* to prevent caller from using garbage output value*/\n\tif (pStatus)\n    *pStatus\t\t= 0;\n    *pCapabilityInfo\t= 0;\n\t*pHtCapabilityLen = 0;\n\n    Ptr = (PCHAR)Fr->Octet;\n\n\t/* offset to destination MAC address (Category and Action field)*/\n    Ptr += 2;\n\n\t/* get status code from payload and advance the pointer*/\n\tif (pStatus)\n\t\tNdisMoveMemory(pStatus, Ptr, 2);\n    Ptr += 2;\n\n    /* get DA from payload and advance the pointer*/\n    NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN);\n    Ptr += MAC_ADDR_LEN;\n\n    /* get SA from payload and advance the pointer*/\n    NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN);\n    Ptr += MAC_ADDR_LEN;\n\n\tif (pStatus == 0)\n\t{\n\t    /* get capability info from payload and advance the pointer*/\n\t    NdisMoveMemory(pCapabilityInfo, Ptr, 2);\n\t    Ptr += 2;\n\t}\n\n\t/* Category and Action field + status code + DA + SA + capability*/\n\teid_ptr = (PEID_STRUCT) &Fr->Octet[18];\t\n\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((UCHAR*)Fr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_SUPP_RATES:\n                if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0))\n                {\n                    NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len);\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsRspSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\\n\",eid_ptr->Len, Rates[0]));\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Rates[1]=%x %x %x %x %x %x %x\\n\", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7]));\n                    *pRatesLen = eid_ptr->Len;\n                }\n                else\n                {\n                    *pRatesLen = 8;\n\t\t\t\t\tRates[0] = 0x82;\n\t\t\t\t\tRates[1] = 0x84;\n\t\t\t\t\tRates[2] = 0x8b;\n\t\t\t\t\tRates[3] = 0x96;\n\t\t\t\t\tRates[4] = 0x12;\n\t\t\t\t\tRates[5] = 0x24;\n\t\t\t\t\tRates[6] = 0x48;\n\t\t\t\t\tRates[7] = 0x6c;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsRspSanity - wrong IE_SUPP_RATES., Len=%d\\n\",eid_ptr->Len));\n                }\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_SUPP_RATES:\n                if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES)\n                {\n                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len);\n                    *pRatesLen = (*pRatesLen) + eid_ptr->Len;\n                }\n                else\n                {\n                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen));\n                    *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES;\n                }\n\t\t\t\tbreak;\n\n\t\t\tcase IE_HT_CAP:\n\t\t\t\tif (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pHtCapability, eid_ptr->Octet, sizeof(HT_CAPABILITY_IE));\n\n\t\t\t\t\t*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t\t\t{\n\t\t\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\t\t\tNdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t\t\t}\n#else\t\t\t\t\n\t\t\t\t\t*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\t\t\t\t\t*pHtCapabilityLen = sizeof(HT_CAPABILITY_IE);\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsRspSanity - IE_HT_CAP\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerDlsRspSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\\n\", eid_ptr->Len));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);\n\t}\n\n    return TRUE;\n}\n\nBOOLEAN PeerDlsTearDownSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PUCHAR pDA,\n    OUT PUCHAR pSA,\n    OUT USHORT *pReason) \n{\n    CHAR            *Ptr;\n    PFRAME_802_11\tFr = (PFRAME_802_11)Msg;\n\n    /* to prevent caller from using garbage output value*/\n    *pReason\t= 0;\n\n    Ptr = (PCHAR)Fr->Octet;\n\n\t/* offset to destination MAC address (Category and Action field)*/\n    Ptr += 2;\n\n    /* get DA from payload and advance the pointer*/\n    NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN);\n    Ptr += MAC_ADDR_LEN;\n\n    /* get SA from payload and advance the pointer*/\n    NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN);\n    Ptr += MAC_ADDR_LEN;\n\n\t/* get reason code from payload and advance the pointer*/\n    NdisMoveMemory(pReason, Ptr, 2);\n    Ptr += 2;\n\n    return TRUE;\n}\n#endif /* QOS_DLS_SUPPORT */\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN PeerProbeReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2,\n    OUT CHAR Ssid[], \n    OUT UCHAR *SsidLen, \n    OUT BOOLEAN *bRssiRequested)\n{\n    PFRAME_802_11 Fr = (PFRAME_802_11)Msg;\n    UCHAR\t\t*Ptr;\n    UCHAR\t\teid =0, eid_len = 0, *eid_data;\n#ifdef CONFIG_AP_SUPPORT\n    UCHAR       apidx = MAIN_MBSSID;\n\tUCHAR       Addr1[MAC_ADDR_LEN];\n#ifdef WSC_INCLUDED\n\tUCHAR\t\t*pPeerWscIe = NULL;\n\tUINT\t\tPeerWscIeLen = 0;\n#endif /* WSC_INCLUDED */\n#endif /* CONFIG_AP_SUPPORT */\n\tUINT\t\ttotal_ie_len = 0;\t\n\n    /* to prevent caller from using garbage output value*/\n#ifdef CONFIG_AP_SUPPORT\n\tapidx = apidx; /* avoid compile warning */\n#endif /* CONFIG_AP_SUPPORT */\n    *SsidLen = 0;\n\n    COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2);\n\n    if (Fr->Octet[0] != IE_SSID || Fr->Octet[1] > MAX_LEN_OF_SSID) \n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"APPeerProbeReqSanity fail - wrong SSID IE\\n\"));\n        return FALSE;\n    } \n    \n    *SsidLen = Fr->Octet[1];\n    NdisMoveMemory(Ssid, &Fr->Octet[2], *SsidLen);\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tCOPY_MAC_ADDR(Addr1, &Fr->Hdr.Addr1);\n#ifdef WSC_AP_SUPPORT\n\tos_alloc_mem(NULL, &pPeerWscIe, 512);\n#endif /* WSC_AP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n    Ptr = Fr->Octet;\n    eid = Ptr[0];\n    eid_len = Ptr[1];\n\ttotal_ie_len = eid_len + 2;\n\teid_data = Ptr+2;\n    \n    /* get variable fields from payload and advance the pointer*/\n\twhile((eid_data + eid_len) <= ((UCHAR*)Fr + MsgLen))\n    {    \t\n        switch(eid)\n        {\n\t        case IE_VENDOR_SPECIFIC:\n\t\t\t\tif (eid_len <= 4)\n\t\t\t\t\tbreak;\n#ifdef RSSI_FEEDBACK\n                if (bRssiRequested && NdisEqualMemory(eid_data, RALINK_OUI, 3) && (eid_len == 7))\n                {\n\t\t\t\t\tif (*(eid_data + 3/* skip RALINK_OUI */) & 0x8)\n                    \t*bRssiRequested = TRUE;\n                    break;\n                }\n#endif /* RSSI_FEEDBACK */\n\n                if (NdisEqualMemory(eid_data, WPS_OUI, 4)\n #ifdef IWSC_SUPPORT\n\t\t\t\t\t|| NdisEqualMemory(eid_data, IWSC_OUI, 4) \n#endif // IWSC_SUPPORT //\n\t\t\t\t\t)\n                {\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef WSC_INCLUDED\n\n\n#ifdef IWSC_SUPPORT\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (NdisEqualMemory(eid_data, IWSC_OUI, 4))\n\t\t\t\t\t\t\tWscCheckPeerDPID(pAd, Fr, eid_data, eid_len);\n\t\t\t\t\t}\n\t\t\t\t\telse if (NdisEqualMemory(eid_data, WPS_OUI, 4))\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* IWSC_SUPPORT */\n\t\t\t\t\tWscCheckPeerDPID(pAd, Fr, eid_data, eid_len);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (PeerWscIeLen >= 512)\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"APPeerProbeReqSanity : PeerWscIeLen = %d (>= 512)\\n\", PeerWscIeLen));\n\t\t\t\t\tif (pPeerWscIe && (PeerWscIeLen < 512))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pPeerWscIe+PeerWscIeLen, eid_data+4, eid_len-4);\n\t\t\t\t\t\tPeerWscIeLen += (eid_len - 4);\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* WSC_INCLUDED */\n                    break;\n                }\n\n            default:\n                break;\n        }\n\t\teid = Ptr[total_ie_len];\n    \teid_len = Ptr[total_ie_len + 1];\n\t\teid_data = Ptr + total_ie_len + 2;\n\t\ttotal_ie_len += (eid_len + 2);\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_INCLUDED\n\tif (pPeerWscIe && (PeerWscIeLen > 0))\n\t{\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tif (NdisEqualMemory(Addr1, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN))\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/*\n\t\t\tDue to Addr1 in Probe Request may be FF:FF:FF:FF:FF:FF \n\t\t\tand we need to send out this information to external registrar.\n\t\t\tTherefore we choose ra0 to send this probe req when we couldn't find apidx by Addr1.\n\t\t*/\n\t\tif (apidx >= pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tapidx = MAIN_MBSSID;\n\t\t}\n\t\t\n\t\tif ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode & WSC_PROXY) != WSC_DISABLE)\n\t\t{\n\t    \tint bufLen = 0;\n\t    \tPUCHAR pBuf = NULL;\n\t    \tWSC_IE_PROBREQ_DATA\t*pprobreq = NULL;\n\n\t\t\t/*\n\t\t\t\tPeerWscIeLen: Len of WSC IE without WSC OUI\n\t\t\t*/\n\t\t\tbufLen = sizeof(WSC_IE_PROBREQ_DATA) + PeerWscIeLen;\n\t\t\tos_alloc_mem(NULL, &pBuf, bufLen);\n\t\t\tif(pBuf)\n\t\t\t{\n\t\t\t\t/*Send WSC probe req to UPnP*/\n\t\t\t\tNdisZeroMemory(pBuf, bufLen);\n\t\t\t\tpprobreq = (WSC_IE_PROBREQ_DATA*)pBuf;\n\t\t\t\tif (32 >= *SsidLen)\t/*Well, I think that it must be TRUE!*/\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pprobreq->ssid, Ssid, *SsidLen);\t\t\t/* SSID*/\n\t\t\t\t\tNdisMoveMemory(pprobreq->macAddr, Fr->Hdr.Addr2, 6);\t/* Mac address*/\n\t\t\t\t\tpprobreq->data[0] = PeerWscIeLen>>8; \t\t\t\t\t\t\t\t\t/* element ID*/\n\t\t\t\t\tpprobreq->data[1] = PeerWscIeLen & 0xff;\t\t\t\t\t\t\t/* element Length\t\t\t\t\t*/\n\t\t\t\t\tNdisMoveMemory((pBuf+sizeof(WSC_IE_PROBREQ_DATA)), pPeerWscIe, PeerWscIeLen);\t/* (WscProbeReqData)*/\n\t\t\t\t\tWscSendUPnPMessage(pAd, apidx, \n\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_MGMT, WSC_UPNP_MGMT_SUB_PROBE_REQ, \n\t\t\t\t\t\t\t\t\t\t\tpBuf, bufLen, 0, 0, &Fr->Hdr.Addr2[0], AP_MODE);\n\t\t\t\t}\n\t\t\t\tos_free_mem(NULL, pBuf);\n\t\t\t}\n\t\t}\t\t\n\t}\n\tif (pPeerWscIe)\n\t\tos_free_mem(NULL, pPeerWscIe);\n#endif /* WSC_INCLUDED */\n#endif /* CONFIG_AP_SUPPORT */\n\n    return TRUE;\n}\n\n\n\n"
  },
  {
    "path": "src/common/cmm_sync.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_sync.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn Chang\t2004-09-01      modified for rt2561/2661\n*/\n#include \"rt_config.h\"\n\n/*BaSizeArray follows the 802.11n definition as MaxRxFactor.  2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8.*/\nUCHAR BaSizeArray[4] = {8,16,32,64};\n\n#ifdef P2P_SUPPORT\nextern UCHAR\tWILDP2PSSID[];\nextern UCHAR\tWILDP2PSSIDLEN;\n#endif /* P2P_SUPPORT */\n\nextern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_2GHZ[];\nextern UINT16 const Country_Region_GroupNum_2GHZ;\nextern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_5GHZ[];\nextern UINT16 const Country_Region_GroupNum_5GHZ;\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tUpdate StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type,\n\t\tand 3) PHY-mode user selected.\n\t\tThe outcome is used by driver when doing site survey.\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID BuildChannelList(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR i, j, index=0, num=0;\n\tPCH_DESC pChDesc = NULL;\n\tBOOLEAN bRegionFound = FALSE;\n\tPUCHAR pChannelList;\n\tPUCHAR pChannelListFlag;\n\n\tNdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));\n\n\t/* if not 11a-only mode, channel list starts from 2.4Ghz band*/\n\tif (!WMODE_5G_ONLY(pAd->CommonCfg.PhyMode))\n\t{\n\t\tfor (i = 0; i < Country_Region_GroupNum_2GHZ; i++)\n\t\t{\n\t\t\tif ((pAd->CommonCfg.CountryRegion & 0x7f) ==\n\t\t\t\tCountry_Region_ChDesc_2GHZ[i].RegionIndex)\n\t\t\t{\n\t\t\t\tpChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc;\n\t\t\t\tnum = TotalChNum(pChDesc);\n\t\t\t\tbRegionFound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!bRegionFound)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"CountryRegion=%d not support\", pAd->CommonCfg.CountryRegion));\n\t\t\treturn;\t\t\n\t\t}\n\n\t\tif (num > 0)\n\t\t{\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR));\n\n\t\t\tif (!pChannelList)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s:Allocate memory for ChannelList failed\\n\", __FUNCTION__));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR));\n\n\t\t\tif (!pChannelListFlag)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s:Allocate memory for ChannelListFlag failed\\n\", __FUNCTION__));\n\t\t\t\tos_free_mem(NULL, pChannelList);\n\t\t\t\treturn;\t\n\t\t\t}\n\n\t\t\tfor (i = 0; i < num; i++)\n\t\t\t{\n\t\t\t\tpChannelList[i] = GetChannel_2GHZ(pChDesc, i);\n\t\t\t\tpChannelListFlag[i] = GetChannelFlag(pChDesc, i);\n\t\t\t}\n\n\t\t\tfor (i = 0; i < num; i++)\n\t\t\t{\n\t\t\t\tfor (j = 0; j < MAX_NUM_OF_CHANNELS; j++)\n\t\t\t\t{\n\t\t\t\t\tif (pChannelList[i] == pAd->TxPower[j].Channel)\n\t\t\t\t\t\tNdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));\n\t\t\t\t\t\tpAd->ChannelList[index + i].Flags = pChannelListFlag[i];\n\t\t\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\t\tif (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel))\n\t\t\t\t\t\t\tpAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP;\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t\tpAd->ChannelList[index+i].MaxTxPwr = 20;\n\t\t\t}\n\n\t\t\tindex += num;\n\n\t\t\tos_free_mem(NULL, pChannelList);\n\t\t\tos_free_mem(NULL, pChannelListFlag);\n\t\t}\n\t\tbRegionFound = FALSE;\n\t\tnum = 0;\n\t}\n\n\tif (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t{\n\t\tfor (i = 0; i < Country_Region_GroupNum_5GHZ; i++)\n\t\t{\n\t\t\tif ((pAd->CommonCfg.CountryRegionForABand & 0x7f) ==\n\t\t\t\tCountry_Region_ChDesc_5GHZ[i].RegionIndex)\n\t\t\t{\n\t\t\t\tpChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc;\n\t\t\t\tnum = TotalChNum(pChDesc);\n\t\t\t\tbRegionFound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!bRegionFound)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"CountryRegionABand=%d not support\", pAd->CommonCfg.CountryRegionForABand));\n\t\t\treturn;\n\t\t}\n\n\t\tif (num > 0)\n\t\t{\n\t\t\tUCHAR RadarCh[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tUCHAR q=0;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR));\n\n\t\t\tif (!pChannelList)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s:Allocate memory for ChannelList failed\\n\", __FUNCTION__));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR));\n\n\t\t\tif (!pChannelListFlag)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s:Allocate memory for ChannelListFlag failed\\n\", __FUNCTION__));\n\t\t\t\tos_free_mem(NULL, pChannelList);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < num; i++)\n\t\t\t{\n\t\t\t\tpChannelList[i] = GetChannel_5GHZ(pChDesc, i);\n\t\t\t\tpChannelListFlag[i] = GetChannelFlag(pChDesc, i);\n\t\t\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tfor (i = 0; i < num; i++)\n\t\t\t{\n\t\t\t\tif((pAd->CommonCfg.bIEEE80211H == 0)|| ((pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RDDurRegion != FCC)))\t\t\t \t\n\t\t\t\t{\n\t\t\t\t\tpChannelList[q] = GetChannel_5GHZ(pChDesc, i);\n\t\t\t\t\tpChannelListFlag[q] = GetChannelFlag(pChDesc, i);\n\t\t\t\t\tq++;\n\t\t\t\t}\n\t\t\t\t/*Based on the requiremnt of FCC, some channles could not be used anymore when test DFS function.*/\n\t\t\t\telse if ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t\t\t\t(pAd->CommonCfg.RDDurRegion == FCC) &&\n\t\t\t\t\t\t(pAd->Dot11_H.bDFSIndoor == 1))\n\t\t\t\t{\n\t\t\t\t\tif((GetChannel_5GHZ(pChDesc, i) < 116) || (GetChannel_5GHZ(pChDesc, i) > 128))\n\t\t\t\t\t{\n\t\t\t\t\t\tpChannelList[q] = GetChannel_5GHZ(pChDesc, i);\n\t\t\t\t\t\tpChannelListFlag[q] = GetChannelFlag(pChDesc, i);\n\t\t\t\t\t\tq++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t\t\t\t(pAd->CommonCfg.RDDurRegion == FCC) &&\n\t\t\t\t\t\t(pAd->Dot11_H.bDFSIndoor == 0))\n\t\t\t\t{\n\t\t\t\t\tif((GetChannel_5GHZ(pChDesc, i) < 100) || (GetChannel_5GHZ(pChDesc, i) > 140) )\n\t\t\t\t\t{\n\t\t\t\t\t\tpChannelList[q] = GetChannel_5GHZ(pChDesc, i);\n\t\t\t\t\t\tpChannelListFlag[q] = GetChannelFlag(pChDesc, i);\n\t\t\t\t\t\tq++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tnum = q;\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\tfor (i=0; i<num; i++)\n\t\t\t{\n\t\t\t\tfor (j=0; j<MAX_NUM_OF_CHANNELS; j++)\n\t\t\t\t{\n\t\t\t\t\tif (pChannelList[i] == pAd->TxPower[j].Channel)\n\t\t\t\t\t\tNdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));\n\t\t\t\t\t\tpAd->ChannelList[index + i].Flags = pChannelListFlag[i];\n\t\t\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tif (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel))\n\t\t\t\t\tpAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP;\n#endif /* DOT11_N_SUPPORT */\t\n\n\t\t\t\tfor (j=0; j<15; j++)\n\t\t\t\t{\n\t\t\t\t\tif (pChannelList[i] == RadarCh[j])\n\t\t\t\t\t\tpAd->ChannelList[index+i].DfsReq = TRUE;\n\t\t\t\t}\n\t\t\t\tpAd->ChannelList[index+i].MaxTxPwr = 20;\n\t\t\t}\n\t\t\tindex += num;\n\n\t\t\tos_free_mem(NULL, pChannelList);\n\t\t\tos_free_mem(NULL, pChannelListFlag);\n\t\t}\n\t}\n\n\tpAd->ChannelListNum = index;\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\\n\", \n\t\tpAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum));\n\n#ifdef RT_CFG80211_SUPPORT\n\tfor (i=0;i<pAd->ChannelListNum;i++)\n\t{\n\t\tCFG80211OS_ChanInfoInit(\n\t\t\t\t\tpAd->pCfg80211_CB,\n\t\t\t\t\ti,\n\t\t\t\t\tpAd->ChannelList[i].Channel,\n\t\t\t\t\tpAd->ChannelList[i].MaxTxPwr,\n\t\t\t\t\tWMODE_CAP_N(pAd->CommonCfg.PhyMode),\n\t\t\t\t\t(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20));\n\t}\n#endif /* RT_CFG80211_SUPPORT */\n\n#ifdef DBG\t\n\tfor (i=0;i<pAd->ChannelListNum;i++)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,(\"BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, Flags = %x\\n \", \n\t\t\t\t\t\t\t\t\t pAd->ChannelList[i].Channel, \n\t\t\t\t\t\t\t\t\t pAd->ChannelList[i].Power, \n\t\t\t\t\t\t\t\t\t pAd->ChannelList[i].Power2, \n\t\t\t\t\t\t\t\t\t pAd->ChannelList[i].Flags));\n\t}\n#endif\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tThis routine return the first channel number according to the country \n\t\tcode selection and RF IC selection (signal band or dual band). It is called\n\t\twhenever driver need to start a site survey of all supported channels.\n\tReturn:\n\t\tch - the first channel number of current country code setting\n\n\tIRQL = PASSIVE_LEVEL\n\n\t==========================================================================\n */\nUCHAR FirstChannel(\n\tIN PRTMP_ADAPTER pAd)\n{\n\treturn pAd->ChannelList[0].Channel;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tThis routine returns the next channel number. This routine is called\n\t\tduring driver need to start a site survey of all supported channels.\n\tReturn:\n\t\tnext_channel - the next channel number valid in current country code setting.\n\tNote:\n\t\treturn 0 if no more next channel\n\t==========================================================================\n */\nUCHAR NextChannel(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR channel)\n{\n\tint i;\n\tUCHAR next_channel = 0;\n#ifdef P2P_SUPPORT\n\tUCHAR\tCurrentChannel = channel;\n\n\tif (pAd->MlmeAux.ScanType == SCAN_P2P_SEARCH)\n\t{\n\t\tif (IS_P2P_LISTEN(pAd))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Error !! P2P Discovery state machine has change to Listen state during scanning !\\n\"));\n\t\t\treturn next_channel;\n\t\t}\t\n\n\t\tfor (i = 0; i < (pAd->P2pCfg.P2pProprietary.ListenChanelCount - 1); i++)\n\t\t{\n\t\t\tif (CurrentChannel == pAd->P2pCfg.P2pProprietary.ListenChanel[i])\n\t\t\t\tnext_channel = pAd->P2pCfg.P2pProprietary.ListenChanel[i+1];\t\t\t\t\n\t\t}\n\t\tP2P_INC_CHA_INDEX(pAd->P2pCfg.P2pProprietary.ListenChanelIndex, pAd->P2pCfg.P2pProprietary.ListenChanelCount);\n\t\tif (next_channel == CurrentChannel)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC -  next_channel equals to CurrentChannel= %d\\n\", next_channel));\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC -  ListenChannel List : %d  %d  %d\\n\", pAd->P2pCfg.P2pProprietary.ListenChanel[0], pAd->P2pCfg.P2pProprietary.ListenChanel[1], pAd->P2pCfg.P2pProprietary.ListenChanel[2]));\n\n\t\t\tnext_channel = 0;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC - P2P Scan return channel = %d.    Listen Channel = %d.\\n\", next_channel, pAd->CommonCfg.Channel));\n\n\t\treturn next_channel;\n\t}\n#endif /* P2P_SUPPORT */\n\t\t\t\n\tfor (i = 0; i < (pAd->ChannelListNum - 1); i++)\n\t{\n\t\tif (channel == pAd->ChannelList[i].Channel)\n\t\t{\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\t/* Only scan effected channel if this is a SCAN_2040_BSS_COEXIST*/\n\t\t\t/* 2009 PF#2: Nee to handle the second channel of AP fall into affected channel range.*/\n\t\t\tif ((pAd->MlmeAux.ScanType == SCAN_2040_BSS_COEXIST) && (pAd->ChannelList[i+1].Channel >14))\n\t\t\t{\n\t\t\t\tchannel = pAd->ChannelList[i+1].Channel;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\t\t{\n\t\t\t\t/* Record this channel's idx in ChannelList array.*/\n\t\t\tnext_channel = pAd->ChannelList[i+1].Channel;\n\t\t\tbreak;\n\t}\n\t\t}\n\t\t\n\t}\n\treturn next_channel;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tThis routine is for Cisco Compatible Extensions 2.X \n\t\tSpec31. AP Control of Client Transmit Power\n\tReturn:\n\t\tNone\n\tNote:\n\t   Required by Aironet dBm(mW)\n\t\t   0dBm(1mW),   1dBm(5mW), 13dBm(20mW), 15dBm(30mW),\n\t\t  17dBm(50mw), 20dBm(100mW)\n\n\t   We supported \n\t\t   3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%),\n\t\t  14dBm(75%),   15dBm(100%)\n\n\t\tThe client station's actual transmit power shall be within +/- 5dB of\n\t\tthe minimum value or next lower value.\n\t==========================================================================\n */\nVOID ChangeToCellPowerLimit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR         AironetCellPowerLimit)\n{\n\t/*\n\t\tvalud 0xFF means that hasn't found power limit information\n\t\tfrom the AP's Beacon/Probe response\n\t*/\n\tif (AironetCellPowerLimit == 0xFF)\n\t\treturn;  \n\t\n\tif (AironetCellPowerLimit < 6) /*Used Lowest Power Percentage.*/\n\t\tpAd->CommonCfg.TxPowerPercentage = 6; \n\telse if (AironetCellPowerLimit < 9)\n\t\tpAd->CommonCfg.TxPowerPercentage = 10;\n\telse if (AironetCellPowerLimit < 12)\n\t\tpAd->CommonCfg.TxPowerPercentage = 25;\n\telse if (AironetCellPowerLimit < 14)\n\t\tpAd->CommonCfg.TxPowerPercentage = 50;\n\telse if (AironetCellPowerLimit < 15)\n\t\tpAd->CommonCfg.TxPowerPercentage = 75;\n\telse\n\t\tpAd->CommonCfg.TxPowerPercentage = 100; /*else used maximum*/\n\n\tif (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)\n\t\tpAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;\n\t\n}\n\n\nCHAR ConvertToRssi(RTMP_ADAPTER *pAd, CHAR Rssi, UCHAR rssi_idx, UCHAR AntSel, UCHAR BW)\n{\n\tUCHAR\tRssiOffset, LNAGain;\n\n\t/* Rssi equals to zero or rssi_idx larger than 3 should be an invalid value*/\n\tif (Rssi == 0 || rssi_idx >= 3)\n\t\treturn -99;\n\n\tLNAGain = GET_LNA_GAIN(pAd);\n\tif (pAd->LatchRfRegs.Channel > 14)\n\t\tRssiOffset = pAd->ARssiOffset[rssi_idx];\n\telse\n\t\tRssiOffset = pAd->BGRssiOffset[rssi_idx];\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t\treturn (Rssi - LNAGain - RssiOffset);\n\telse\n#endif /* RT65xx */\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tCHAR LNA, RSSI;\n\t\tPCHAR LNATable;\n/*\n\t\tCHAR MainBW40LNA[] = { 1, 18, 35 };\n\t\tCHAR MainBW20LNA[] = { 1, 18, 36 };\n\t\tCHAR AuxBW40LNA[] = { 1, 23, 42 };\n\t\tCHAR AuxBW20LNA[] = { 1, 23, 42 };\n*/\n\t\tCHAR MainBW40LNA[] = { 0, 16, 34 };\n\t\tCHAR MainBW20LNA[] = { -2, 15, 33 };\n\t\tCHAR AuxBW40LNA[] = { -2, 16, 34 };\n\t\tCHAR AuxBW20LNA[] = { -2, 15, 33 };\n\n\t\tLNA = (Rssi >> 6) & 0x3;\n\t\tRSSI = Rssi & 0x3F;\n\n\t\tif ( (AntSel >> 7) == 0 )\n\t\t{\n\t\t\tif (BW == BW_40)\n\t\t\t\tLNATable = MainBW40LNA;\n\t\t\telse\n\t\t\t\tLNATable = MainBW20LNA;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (BW == BW_40)\n\t\t\t\tLNATable = AuxBW40LNA;\n\t\t\telse\n\t\t\t\tLNATable = AuxBW20LNA;\n\t\t}\n\n\t\tif ( LNA == 3 )\n\t\t\tLNA = LNATable[2];\n\t\telse if ( LNA == 2 )\n\t\t\tLNA = LNATable[1];\n\t\telse\n\t\t\tLNA = LNATable[0];\n\n\t\treturn ( 8 - LNA - RSSI - LNAGain - RssiOffset );\n\t}\n\telse\n#endif /* MT7601 */\n\t\treturn (-12 - RssiOffset - LNAGain - Rssi);\n}\n\n\nCHAR ConvertToSnr(RTMP_ADAPTER *pAd, UCHAR Snr)\n{\n\tif (pAd->chipCap.SnrFormula == SNR_FORMULA2)\n\t\treturn (Snr * 3 + 8) >> 4;\n\telse if (pAd->chipCap.SnrFormula == SNR_FORMULA3)\n\t\treturn (Snr * 3 / 16 ); /* * 0.1881 */\n\telse\n\t\treturn ((0xeb\t- Snr) * 3) /\t16 ;\n}\n\n\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DOT11_N_SUPPORT\nextern int DetectOverlappingPeriodicRound;\n\nVOID Handle_BSS_Width_Trigger_Events(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tULONG Now32;\n\t\n\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&\n\t\t(pAd->CommonCfg.Channel <=14))\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rcv BSS Width Trigger Event: 40Mhz --> 20Mhz \\n\"));\n        NdisGetSystemUpTime(&Now32);\n\t\tpAd->CommonCfg.LastRcvBSSWidthTriggerEventsTime = Now32;\n\t\tpAd->CommonCfg.bRcvBSSWidthTriggerEvents = TRUE;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\t\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\n        DetectOverlappingPeriodicRound = 31;\n\t}\n}\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n"
  },
  {
    "path": "src/common/cmm_tkip.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_tkip.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tPaul Wu\t\t02-25-02\t\tInitial\n*/\n\n#include\t\"rt_config.h\"\n\n/* Rotation functions on 32 bit values */\n#define ROL32( A, n ) \\\n\t( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) \n#define ROR32( A, n ) ROL32( (A), 32-(n) ) \n\nUINT Tkip_Sbox_Lower[256] = \n{ \n\t0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54, \n\t0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A, \n\t0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B, \n\t0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B, \n\t0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F, \n\t0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F, \n\t0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5, \n\t0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F, \n\t0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB, \n\t0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97, \n\t0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED, \n\t0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A, \n\t0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94, \n\t0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3, \n\t0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04, \n\t0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D, \n\t0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39, \n\t0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95, \n\t0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83, \n\t0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76, \n\t0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4, \n\t0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B, \n\t0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0, \n\t0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18, \n\t0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51, \n\t0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85, \n\t0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12, \n\t0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9, \n\t0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7, \n\t0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A, \n\t0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8, \n\t0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A \n};\n\nUINT Tkip_Sbox_Upper[256] = \n{ \n\t0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91, \n\t0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC, \n\t0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB, \n\t0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B, \n\t0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83, \n\t0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A, \n\t0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F, \n\t0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA, \n\t0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B, \n\t0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13, \n\t0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6, \n\t0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85, \n\t0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11, \n\t0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B, \n\t0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1, \n\t0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF, \n\t0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E, \n\t0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6, \n\t0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B, \n\t0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD, \n\t0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8, \n\t0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2, \n\t0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49, \n\t0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10, \n\t0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97, \n\t0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F, \n\t0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C, \n\t0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27, \n\t0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33, \n\t0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5, \n\t0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0, \n\t0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C \n}; \n\n\n/* Expanded IV for TKIP function.*/\n\ntypedef\tstruct GNU_PACKED _IV_CONTROL_\n{\n\tunion GNU_PACKED\n\t{\n\t\tstruct GNU_PACKED\n\t\t{\n\t\t\tUCHAR\t\trc0;\n\t\t\tUCHAR\t\trc1;\n\t\t\tUCHAR\t\trc2;\n\n\t\t\tunion GNU_PACKED\n\t\t\t{\n\t\t\t\tstruct GNU_PACKED\n\t\t\t\t{\n#ifdef RT_BIG_ENDIAN\n\t\t\t\t\tUCHAR\tKeyID:2;\n\t\t\t\t\tUCHAR\tExtIV:1;\n\t\t\t\t\tUCHAR\tRsvd:5;\n#else\n\t\t\t\t\tUCHAR\tRsvd:5;\n\t\t\t\t\tUCHAR\tExtIV:1;\n\t\t\t\t\tUCHAR\tKeyID:2;\n#endif\n\t\t\t\t}\tfield;\n\t\t\t\tUCHAR\t\tByte;\n\t\t\t}\tCONTROL;\n\t\t}\tfield;\n\t\t\n\t\tULONG\tword;\n\t}\tIV16;\n\t\n\tULONG\tIV32;\n}\tTKIP_IV, *PTKIP_IV;\n\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tConvert from UCHAR[] to ULONG in a portable way \n\t\t\n\tArguments:\n      pMICKey\t\tpointer to MIC Key\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nULONG\tRTMPTkipGetUInt32( \t\n\tIN\tPUCHAR\tpMICKey)\n{  \t\n\tULONG\tres = 0; \n\tINT\t\ti;\n\t\n\tfor (i = 0; i < 4; i++) \n\t{ \n\t\tres |= (*pMICKey++) << (8 * i); \n\t}\n\n\treturn res; \n} \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tConvert from ULONG to UCHAR[] in a portable way \n\t\t\n\tArguments:\n      pDst\t\t\tpointer to destination for convert ULONG to UCHAR[]\n      val\t\t\tthe value for convert\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPTkipPutUInt32(\n\tIN OUT\tPUCHAR\t\tpDst,\n\tIN\t\tULONG\t\tval)\t\t\t\t\t  \n{ \t\n\tINT i;\n\t\n\tfor(i = 0; i < 4; i++) \n\t{ \n\t\t*pDst++ = (UCHAR) (val & 0xff); \n\t\tval >>= 8; \n\t} \n} \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tSet the MIC Key.\n\t\t\n\tArguments:\n      pAd\t\tPointer to our adapter\n      pMICKey\t\tpointer to MIC Key\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPTkipSetMICKey(  \n\tIN\tPTKIP_KEY_INFO\tpTkip,\t\n\tIN\tPUCHAR\t\t\tpMICKey)\n{ \n\t/* Set the key */\n\tpTkip->K0 = RTMPTkipGetUInt32(pMICKey); \n\tpTkip->K1 = RTMPTkipGetUInt32(pMICKey + 4); \n\t/* and reset the message */\n\tpTkip->L = pTkip->K0;\n\tpTkip->R = pTkip->K1;\n\tpTkip->nBytesInM = 0;\n\tpTkip->M = 0;\n} \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCalculate the MIC Value.\n\t\t\n\tArguments:\n      pAd\t\tPointer to our adapter\n      uChar\t\t\tAppend this uChar\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPTkipAppendByte( \n\tIN\tPTKIP_KEY_INFO\tpTkip,\t\n\tIN\tUCHAR \t\t\tuChar)\n{ \n\t/* Append the byte to our word-sized buffer */\n\tpTkip->M |= (uChar << (8* pTkip->nBytesInM)); \n\tpTkip->nBytesInM++; \n\t/* Process the word if it is full. */\n\tif( pTkip->nBytesInM >= 4 ) \n\t{ \n\t\tpTkip->L ^= pTkip->M; \n\t\tpTkip->R ^= ROL32( pTkip->L, 17 ); \n\t\tpTkip->L += pTkip->R; \n\t\tpTkip->R ^= ((pTkip->L & 0xff00ff00) >> 8) | ((pTkip->L & 0x00ff00ff) << 8); \n\t\tpTkip->L += pTkip->R; \n\t\tpTkip->R ^= ROL32( pTkip->L, 3 ); \n\t\tpTkip->L += pTkip->R; \n\t\tpTkip->R ^= ROR32( pTkip->L, 2 ); \n\t\tpTkip->L += pTkip->R; \n\t\t/* Clear the buffer */\n\t\tpTkip->M = 0; \n\t\tpTkip->nBytesInM = 0; \n\t} \n} \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCalculate the MIC Value.\n\t\t\n\tArguments:\n      pAd\t\tPointer to our adapter\n      pSrc\t\t\tPointer to source data for Calculate MIC Value\n      Len\t\t\tIndicate the length of the source data\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPTkipAppend( \n\tIN\tPTKIP_KEY_INFO\tpTkip,\t\n\tIN\tPUCHAR\t\t\tpSrc,\n\tIN\tUINT\t\t\tnBytes)\t\t\t\t\t\t  \n{ \n\t/* This is simple */\n\twhile(nBytes > 0) \n\t{ \n\t\tRTMPTkipAppendByte(pTkip, *pSrc++); \n\t\tnBytes--; \n\t} \n} \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tGet the MIC Value.\n\t\t\n\tArguments:\n      pAd\t\tPointer to our adapter\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tthe MIC Value is store in pAd->PrivateInfo.MIC\n\t========================================================================\n*/\nVOID\tRTMPTkipGetMIC( \n\tIN\tPTKIP_KEY_INFO\tpTkip)\n{ \n\t/* Append the minimum padding*/\n\tRTMPTkipAppendByte(pTkip, 0x5a );\t\n\tRTMPTkipAppendByte(pTkip, 0 ); \n\tRTMPTkipAppendByte(pTkip, 0 ); \n\tRTMPTkipAppendByte(pTkip, 0 ); \n\tRTMPTkipAppendByte(pTkip, 0 ); \n\t/* and then zeroes until the length is a multiple of 4 */\n\twhile( pTkip->nBytesInM != 0 ) \n\t{ \n\t\tRTMPTkipAppendByte(pTkip, 0 ); \n\t} \n\t/* The appendByte function has already computed the result. */\n\tRTMPTkipPutUInt32(pTkip->MIC, pTkip->L);\n\tRTMPTkipPutUInt32(pTkip->MIC + 4, pTkip->R);\n} \n\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tInit MIC Value calculation function which include set MIC key & \n\t\tcalculate first 16 bytes (DA + SA + priority +  0)\n\t\t\n\tArguments:\n      pAd\t\tPointer to our adapter\n\t\tpTKey       Pointer to the Temporal Key (TK), TK shall be 128bits.\n\t\tpDA\t\t\tPointer to DA address\n\t\tpSA\t\t\tPointer to SA address\n\t\tpMICKey\t\tpointer to MIC Key\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTMPInitMICEngine(\n\tIN\tPRTMP_ADAPTER\tpAd,\t\n\tIN\tPUCHAR\t\t\tpKey,\n\tIN\tPUCHAR\t\t\tpDA,\n\tIN\tPUCHAR\t\t\tpSA,\n\tIN  UCHAR           UserPriority,\n\tIN\tPUCHAR\t\t\tpMICKey)\n{\n\tULONG Priority = UserPriority;\n\n\t/* Init MIC value calculation*/\n\tRTMPTkipSetMICKey(&pAd->PrivateInfo.Tx, pMICKey);\n\t/* DA*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, pDA, MAC_ADDR_LEN);\n\t/* SA*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, pSA, MAC_ADDR_LEN);\n\t/* Priority + 3 bytes of 0*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, (PUCHAR)&Priority, 4);\n}\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCompare MIC value of received MSDU\n\t\t\n\tArguments:\n\t\tpAd\tPointer to our adapter\n\t\tpSrc        Pointer to the received Plain text data\n\t\tpDA\t\t\tPointer to DA address\n\t\tpSA\t\t\tPointer to SA address\n\t\tpMICKey\t\tpointer to MIC Key\n\t\tLen         the length of the received plain text data exclude MIC value\n\t\t\n\tReturn Value:\n\t\tTRUE        MIC value matched\n\t\tFALSE       MIC value mismatched\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nBOOLEAN\tRTMPTkipCompareMICValue(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpSrc,\n\tIN\tPUCHAR\t\t\tpDA,\n\tIN\tPUCHAR\t\t\tpSA,\n\tIN\tPUCHAR\t\t\tpMICKey,\n\tIN\tUCHAR\t\t\tUserPriority,\n\tIN\tUINT\t\t\tLen)\n{\n\tUCHAR\tOldMic[8];\n\tULONG\tPriority = UserPriority;\n\n\t/* Init MIC value calculation*/\n\tRTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);\n\t/* DA*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN);\n\t/* SA*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN);\n\t/* Priority + 3 bytes of 0*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4);\n\t\n\t/* Calculate MIC value from plain text data*/\n\tRTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len);\n\n\t/* Get MIC valude from received frame*/\n\tNdisMoveMemory(OldMic, pSrc + Len, 8);\n\t\n\t/* Get MIC value from decrypted plain data*/\n\tRTMPTkipGetMIC(&pAd->PrivateInfo.Rx);\n\t\t\n\t/* Move MIC value from MSDU, this steps should move to data path.*/\n\t/* Since the MIC value might cross MPDUs.*/\n\tif(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"RTMPTkipCompareMICValue(): TKIP MIC Error !\\n\"));  /*MIC error.*/\n\n\t\t\n\t\treturn (FALSE);\n\t}\n\treturn (TRUE);\n}\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCopy frame from waiting queue into relative ring buffer and set \n\tappropriate ASIC register to kick hardware transmit function\n\t\t\n\tArguments:\n\t\tpAd\t\tPointer\tto our adapter\n\t\tPNDIS_PACKET\tPointer to Ndis Packet for MIC calculation\n\t\tpEncap\t\t\tPointer to LLC encap data\n\t\tLenEncap\t\tTotal encap length, might be 0 which indicates no encap\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTMPCalculateMICValue(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tPUCHAR\t\t\tpEncap,\n\tIN\tPCIPHER_KEY\t\tpKey,\n\tIN\tUCHAR\t\t\tapidx)\n{\n\tPACKET_INFO\t\tPacketInfo;\n\tPUCHAR\t\t\tpSrcBufVA;\n\tUINT\t\t\tSrcBufLen;\n\tPUCHAR\t\t\tpSrc;\n    UCHAR           UserPriority;\n\tUCHAR\t\t\tvlan_offset = 0;\n\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n\n\tUserPriority = RTMP_GET_PACKET_UP(pPacket);\n\tpSrc = pSrcBufVA;\n    \n\t/* determine if this is a vlan packet */\n\tif (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100)\n\t\tvlan_offset = 4;\n\t\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\t\n\t/* Start Calculate MIC Value*/\n\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI && ((apidx - MIN_NET_DEVICE_FOR_APCLI) < MAX_APCLI_NUM) && (pAd->OpMode == OPMODE_AP))\n\t{\t/* For packet which need to do MATConvert, we need to use the CurrentAddress of specific ApCli interface.*/\n\t\tRTMPInitMICEngine(\n\t\t\tpAd,\n\t\t\tpKey->Key,\n\t\t\tpSrc,\n\t\t\tpAd->ApCfg.ApCliTab[apidx-MIN_NET_DEVICE_FOR_APCLI].CurrentAddress,\n\t\t\tUserPriority,\n\t\t\tpKey->TxMic);\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n#ifdef IGMP_SNOOP_SUPPORT\n\tif ((RTMP_GET_PACKET_WCID(pPacket) != MCAST_WCID) && (*pSrc & 0x01) && (pAd->OpMode == OPMODE_AP))\n\t{\n\t\tRTMPInitMICEngine(\n\t\t\tpAd,\n\t\t\tpKey->Key,\n\t\t\tpAd->MacTab.Content[RTMP_GET_PACKET_WCID(pPacket)].Addr,\n\t\t\tpSrc + 6,\n\t\t\tUserPriority,\n\t\t\tpKey->TxMic);\t\t\n\t}\n\telse\n#endif /* IGMP_SNOOP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\t{\n\t\tRTMPInitMICEngine(\n\t\t\tpAd,\n\t\t\tpKey->Key,\n\t\t\tpSrc,\n\t\t\tpSrc + 6,\n\t\t\tUserPriority,\n\t\t\tpKey->TxMic);\n\t}\n\t\n\n\tif (pEncap != NULL)\n\t{\n\t\t/* LLC encapsulation*/\n\t\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, pEncap, 6);\n\t\t/* Protocol Type*/\n\t\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc + 12 + vlan_offset, 2);\t\t\n\t}\n\tSrcBufLen -= (14 + vlan_offset);\n\tpSrc += (14 + vlan_offset);\n\tdo\n\t{\n\t\tif (SrcBufLen > 0)\n\t\t{\n\t\t\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen);\n\t\t}\n\t\t\n\t\tbreak;\t/* No need handle next packet\t*/\n\n\t} while (TRUE);\n\n\t/* Compute the final MIC Value*/\n\tRTMPTkipGetMIC(&pAd->PrivateInfo.Tx);\n}\n\n\n/************************************************************/ \n/* tkip_sbox()\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t*/ \n/* Returns a 16 bit value from a 64K entry table. The Table */ \n/* is synthesized from two 256 entry byte wide tables.\t\t*/ \n/************************************************************/ \n\nUINT tkip_sbox(UINT index) \n{ \n\tUINT index_low; \n\tUINT index_high; \n\tUINT left, right; \n\n\tindex_low = (index % 256); \n\tindex_high = ((index >> 8) % 256); \n\n\tleft = Tkip_Sbox_Lower[index_low] + (Tkip_Sbox_Upper[index_low] * 256); \n\tright = Tkip_Sbox_Upper[index_high] + (Tkip_Sbox_Lower[index_high] * 256); \n\n\treturn (left ^ right); \n}\n\nUINT rotr1(UINT a) \n{ \n\tunsigned int b; \n\n\tif ((a & 0x01) == 0x01) \n\t{ \n\t\tb = (a >> 1) | 0x8000; \n\t} \n\telse \n\t{ \n\t\tb = (a >> 1) & 0x7fff; \n\t} \n\tb = b % 65536; \n\treturn b; \n} \n\nVOID RTMPTkipMixKey(\n\tUCHAR *key, \n\tUCHAR *ta, \n\tULONG pnl, /* Least significant 16 bits of PN */\n\tULONG pnh, /* Most significant 32 bits of PN */ \n\tUCHAR *rc4key, \n\tUINT *p1k)\n{\n\n\tUINT tsc0; \n\tUINT tsc1;\n\tUINT tsc2; \n\n\tUINT ppk0; \n\tUINT ppk1; \n\tUINT ppk2; \n\tUINT ppk3; \n\tUINT ppk4; \n\tUINT ppk5; \n\n\tINT i; \n\tINT j; \n\n\ttsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */ \n\ttsc1 = (unsigned int)(pnh % 65536); \n\ttsc2 = (unsigned int)(pnl % 65536); /* lsb */ \n\n\t/* Phase 1, step 1 */ \n\tp1k[0] = tsc1; \n\tp1k[1] = tsc0; \n\tp1k[2] = (UINT)(ta[0] + (ta[1]*256)); \n\tp1k[3] = (UINT)(ta[2] + (ta[3]*256)); \n\tp1k[4] = (UINT)(ta[4] + (ta[5]*256)); \n\n\t/* Phase 1, step 2 */ \n\tfor (i=0; i<8; i++) \n\t{ \n\t\tj = 2*(i & 1); \n\t\tp1k[0] = (p1k[0] + tkip_sbox( (p1k[4] ^ ((256*key[1+j]) + key[j])) % 65536 )) % 65536; \n\t\tp1k[1] = (p1k[1] + tkip_sbox( (p1k[0] ^ ((256*key[5+j]) + key[4+j])) % 65536 )) % 65536; \n\t\tp1k[2] = (p1k[2] + tkip_sbox( (p1k[1] ^ ((256*key[9+j]) + key[8+j])) % 65536 )) % 65536; \n\t\tp1k[3] = (p1k[3] + tkip_sbox( (p1k[2] ^ ((256*key[13+j]) + key[12+j])) % 65536 )) % 65536; \n\t\tp1k[4] = (p1k[4] + tkip_sbox( (p1k[3] ^ (((256*key[1+j]) + key[j]))) % 65536 )) % 65536; \n\t\tp1k[4] = (p1k[4] + i) % 65536; \n\t} \n\n\t/* Phase 2, Step 1 */ \n\tppk0 = p1k[0]; \n\tppk1 = p1k[1]; \n\tppk2 = p1k[2]; \n\tppk3 = p1k[3]; \n\tppk4 = p1k[4]; \n\tppk5 = (p1k[4] + tsc2) % 65536; \n\n\t/* Phase2, Step 2 */ \n\tppk0 = ppk0 + tkip_sbox( (ppk5 ^ ((256*key[1]) + key[0])) % 65536); \n\tppk1 = ppk1 + tkip_sbox( (ppk0 ^ ((256*key[3]) + key[2])) % 65536); \n\tppk2 = ppk2 + tkip_sbox( (ppk1 ^ ((256*key[5]) + key[4])) % 65536); \n\tppk3 = ppk3 + tkip_sbox( (ppk2 ^ ((256*key[7]) + key[6])) % 65536); \n\tppk4 = ppk4 + tkip_sbox( (ppk3 ^ ((256*key[9]) + key[8])) % 65536); \n\tppk5 = ppk5 + tkip_sbox( (ppk4 ^ ((256*key[11]) + key[10])) % 65536); \n\n\tppk0 = ppk0 + rotr1(ppk5 ^ ((256*key[13]) + key[12])); \n\tppk1 = ppk1 + rotr1(ppk0 ^ ((256*key[15]) + key[14])); \n\tppk2 = ppk2 + rotr1(ppk1); \n\tppk3 = ppk3 + rotr1(ppk2); \n\tppk4 = ppk4 + rotr1(ppk3); \n\tppk5 = ppk5 + rotr1(ppk4); \n\n\t/* Phase 2, Step 3 */ \n    /* Phase 2, Step 3 */\n\n\ttsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */ \n\ttsc1 = (unsigned int)(pnh % 65536); \n\ttsc2 = (unsigned int)(pnl % 65536); /* lsb */ \n\n\trc4key[0] = (tsc2 >> 8) % 256; \n\trc4key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f; \n\trc4key[2] = tsc2 % 256; \n\trc4key[3] = ((ppk5 ^ ((256*key[1]) + key[0])) >> 1) % 256; \n\n\trc4key[4] = ppk0 % 256; \n\trc4key[5] = (ppk0 >> 8) % 256; \n\n\trc4key[6] = ppk1 % 256; \n\trc4key[7] = (ppk1 >> 8) % 256; \n\n\trc4key[8] = ppk2 % 256; \n\trc4key[9] = (ppk2 >> 8) % 256; \n\n\trc4key[10] = ppk3 % 256; \n\trc4key[11] = (ppk3 >> 8) % 256; \n\n\trc4key[12] = ppk4 % 256; \n\trc4key[13] = (ppk4 >> 8) % 256; \n\n\trc4key[14] = ppk5 % 256; \n\trc4key[15] = (ppk5 >> 8) % 256; \n}\n\n\n/*\n\tTRUE: Success!\n\tFALSE: Decrypt Error!\n*/\nBOOLEAN RTMPSoftDecryptTKIP(\n\tIN \t\tPRTMP_ADAPTER \tpAd,\n\tIN \t\tPUCHAR\t\t\tpHdr,\n\tIN \t\tUCHAR    \t\tUserPriority,\n\tIN \t\tPCIPHER_KEY\t\tpKey,\n\tINOUT \tPUCHAR\t\t\tpData,\n\tIN \t\tUINT16\t\t\t*DataByteCnt)\n{\n\tPHEADER_802_11\tpFrame;\n\tUINT8\t\t\tframe_type;\n\tUINT8\t\t\tframe_subtype;\n\tUINT8\t\t\tfrom_ds;\n    UINT8\t\t\tto_ds;\n\tUINT8\t\t\ta4_exists;\n\tUINT8\t\t\tqc_exists;\n\tUCHAR\t\t\tTA[MAC_ADDR_LEN];\n\tUCHAR\t\t\tDA[MAC_ADDR_LEN];\n\tUCHAR\t\t\tSA[MAC_ADDR_LEN];\t\n\tUCHAR\t\t\tRC4Key[16];\n\tUINT\t\t\tp1k[5]; /*for mix_key;*/\n\tULONG\t\t\tpnl;/* Least significant 16 bits of PN */\n\tULONG\t\t\tpnh;/* Most significant 32 bits of PN */ \n\tARC4_CTX_STRUC \tARC4_CTX;\n\tPUCHAR\t\t\tplaintext_ptr;\n\tUINT32\t\t\tplaintext_len;\n\tPUCHAR\t\t\tciphertext_ptr;\n\tUINT32\t\t\tciphertext_len;\n\tUINT\t\t\tcrc32 = 0;\n\tUINT\t\t\ttrailfcs = 0;\n\tUCHAR\t\t\tMIC[8];\n\tUCHAR\t\t\tTrailMIC[8];\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);\n#endif\n\n\tif (pKey->KeyLen == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : the key is empty)\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\t/* Indicate type and subtype of Frame Control field */\n\tframe_type = (((*pHdr) >> 2) & 0x03);\n\tframe_subtype = (((*pHdr) >> 4) & 0x0f);\t\n\n\t/* Indicate the fromDS and ToDS */\n\tfrom_ds = ((*(pHdr + 1)) & 0x2) >> 1;\n\tto_ds = ((*(pHdr + 1)) & 0x1);\n\n\t/* decide if the Address 4 exist or QoS exist */\n\ta4_exists = (from_ds & to_ds);\n\tqc_exists = ((frame_subtype == SUBTYPE_QDATA) || \n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFACK) ||\n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFPOLL) ||\n\t\t\t\t (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL));\n\n\t/* pointer to 802.11 header */\n\tpFrame = (PHEADER_802_11)pHdr;\n\n\t/* Assign DA, SA and TA for TKIP calculation */\n\tif (to_ds == 0 && from_ds == 1)\n\t{\n\t\tNdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);  /*BSSID\t\t*/\n\t\tNdisMoveMemory(SA, pFrame->Addr3, MAC_ADDR_LEN);\n\t}\t\n\telse if (to_ds == 0 && from_ds == 0 )\n\t{\n\t\tNdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);\t\t\n\t\tNdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN);\n\t}\n\telse if (to_ds == 1 && from_ds == 0)\n\t{\n\t\tNdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN);\n\t}\n\telse if (to_ds == 1 && from_ds == 1)\n\t{\n\t\tNdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(SA, pFrame->Octet, MAC_ADDR_LEN);\n\t}\n\n\tpnl = (*(pData)) << 8 | (*(pData + 2));\t\n\tpnh = *((PULONG)(pData + 4));\n\tpnh = cpu2le32(pnh);\t\n\tRTMPTkipMixKey(pKey->Key, TA, pnl, pnh, RC4Key, p1k);\n\n\t/* skip 8-bytes TKIP IV/EIV header */\n\tciphertext_ptr = pData + LEN_TKIP_IV_HDR;\n\tciphertext_len = *DataByteCnt - LEN_TKIP_IV_HDR;\n\n\t/* WEP Decapsulation */\n\t/* Generate an RC4 key stream */\n\tARC4_INIT(&ARC4_CTX, &RC4Key[0], 16);\n\n\t/* Decrypt the TKIP MPDU by ARC4. \n\t   It shall include plaintext, MIC and ICV.\n\t   The result output would overwrite the original TKIP IV/EIV header position */\n\tARC4_Compute(&ARC4_CTX, ciphertext_ptr, ciphertext_len, pData);\n\n\t/* Point to the decrypted data frame and its length shall exclude ICV length */\n\tplaintext_ptr = pData;\n\tplaintext_len = ciphertext_len - LEN_ICV;\n\n\t/* Extract peer's ICV */\t\n\tNdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV);\n\t\n\t/* Re-computes the ICV and \n\t   bit-wise compares with the peer's ICV. */\n\tcrc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len);\n\tcrc32 ^= 0xffffffff;             /* complement */\n\n    if(crc32 != cpu2le32(trailfcs))\n    {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"! WEP Data CRC Error !\\n\"));\t /*CRC error.*/\n\t\treturn FALSE;\n\t}\n\n\t/* Extract peer's MIC and subtract MIC length from total data length */\n\tplaintext_len -= LEN_TKIP_MIC;\n\tNdisMoveMemory(TrailMIC, plaintext_ptr + plaintext_len, LEN_TKIP_MIC);\n\tRTMPInitMICEngine(pAd, pKey->Key, DA, SA, UserPriority, pKey->RxMic);\n\tRTMPTkipAppend(&pAd->PrivateInfo.Tx, plaintext_ptr, plaintext_len);\n\tRTMPTkipGetMIC(&pAd->PrivateInfo.Tx);\n\tNdisMoveMemory(MIC, pAd->PrivateInfo.Tx.MIC, LEN_TKIP_MIC);\n\n\tif (!NdisEqualMemory(MIC, TrailMIC, LEN_TKIP_MIC))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"! TKIP MIC Error !\\n\"));\t /*MIC error.*/\n#ifdef CONFIG_STA_SUPPORT\n\t\t/*RTMPReportMicError(pAd, &pWpaKey[KeyID]);\t marked by AlbertY @ 20060630 */\n#ifdef WPA_SUPPLICANT_SUPPORT\n        if (pAd->StaCfg.WpaSupplicantUP) {\n                WpaSendMicFailureToWpaSupplicant(pAd->net_dev,\n                                                (pKey->Type ==\n                                                  PAIRWISEKEY) ? TRUE :\n                                                FALSE);\n        } else\n#endif /* WPA_SUPPLICANT_SUPPORT */\n        RTMPReportMicError(pAd, pKey);\n#endif /* CONFIG_STA_SUPPORT */\n\t\treturn FALSE;\t\t\n\t}\n\n\t/* Update the total data length */\n\t*DataByteCnt = plaintext_len;\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);\n#endif\t\n\treturn TRUE;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tUse RC4 to protect the Key Data field of EAPoL frame. \n\t\tIt's defined in IEEE 802.11i-2004 p.84 \n\n\tArguments:\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID TKIP_GTK_KEY_WRAP( \n    IN UCHAR    *key,\n    IN UCHAR\t*iv,\n    IN UCHAR    *input_text,\n    IN UINT32    input_len,\n    OUT UCHAR   *output_text)\n{\t\n\tUCHAR\tekey[LEN_KEY_DESC_IV + LEN_PTK_KEK];\t\n/*\tARC4_CTX_STRUC ARC4_CTX;*/\n\tARC4_CTX_STRUC *pARC4_CTX = NULL;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pARC4_CTX, sizeof(ARC4_CTX_STRUC));\n\tif (pARC4_CTX == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* The encryption key is generated by concatenating the\n\t   EAPOL-Key IV field and the KEK. */\n\tNdisMoveMemory(ekey, iv, LEN_KEY_DESC_IV);\n\tNdisMoveMemory(&ekey[LEN_KEY_DESC_IV], key, LEN_PTK_KEK);\n\n\t/* RC4 stream cipher initialization with the KEK */\t\n\tARC4_INIT(pARC4_CTX, &ekey[0], LEN_KEY_DESC_IV + LEN_PTK_KEK);\n\n\t/* The first 256 octets of the RC4 key stream shall be discarded */\n\tARC4_Discard_KeyLength(pARC4_CTX, 256);\n\n\t/* encryption begins using the 257th key stream octet */\n\tARC4_Compute(pARC4_CTX, input_text, input_len, output_text);\n\n\tif (pARC4_CTX != NULL)\n\t\tos_free_mem(NULL, pARC4_CTX);\n}\n\nVOID TKIP_GTK_KEY_UNWRAP( \n    IN UCHAR    *key,\n    IN UCHAR\t*iv,\n    IN UCHAR    *input_text,\n    IN UINT32    input_len,\n    OUT UCHAR   *output_text)\n{\n\tTKIP_GTK_KEY_WRAP(key, iv, input_text, input_len, output_text);\n}\n\n"
  },
  {
    "path": "src/common/cmm_video.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tcmm_video.c\n\n    Abstract:\n    Ralink WiFi Driver video mode related subroutines\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n\n*/\n\n#include \"rt_config.h\"\n\n\n#ifdef VIDEO_TURBINE_SUPPORT\n\n\n\nBOOLEAN UpdateFromGlobal = FALSE;\n\nvoid VideoTurbineUpdate(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (UpdateFromGlobal == TRUE) \n\t{\n\t\tpAd->VideoTurbine.Enable = GLOBAL_AP_VIDEO_CONFIG.Enable;\n\t\tpAd->VideoTurbine.ClassifierEnable = GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable;\n\t\tpAd->VideoTurbine.HighTxMode = GLOBAL_AP_VIDEO_CONFIG.HighTxMode;\n\t\tpAd->VideoTurbine.TxPwr = GLOBAL_AP_VIDEO_CONFIG.TxPwr;\n\t\tpAd->VideoTurbine.VideoMCSEnable = GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable;\n\t\tpAd->VideoTurbine.VideoMCS = GLOBAL_AP_VIDEO_CONFIG.VideoMCS;\n\t\tpAd->VideoTurbine.TxBASize = GLOBAL_AP_VIDEO_CONFIG.TxBASize;\n\t\tpAd->VideoTurbine.TxLifeTimeMode = GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode;\n\t\tpAd->VideoTurbine.TxLifeTime = GLOBAL_AP_VIDEO_CONFIG.TxLifeTime;\n\t\tpAd->VideoTurbine.TxRetryLimit = GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit;\n\t}\n}\n\n\nVOID TxSwQDepthAdjust(IN RTMP_ADAPTER *pAd, IN UINT32 qLen)\n{\n\tULONG IrqFlags;\n\tINT qIdx;\n\tQUEUE_HEADER *pTxQ, *pEntry;\n\tPNDIS_PACKET pPacket;\n\t\n\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\tpAd->TxSwQMaxLen = qLen;\n\tfor (qIdx = 0; qIdx < NUM_OF_TX_RING; qIdx++)\n\t{\n\t\tpTxQ = &pAd->TxSwQueue[qIdx];\n\t\twhile(pTxQ->Number >= pAd->TxSwQMaxLen)\n\t\t{\n\t\t\tpEntry = RemoveHeadQueue(pTxQ);\n\t\t\tif (pEntry)\n\t\t\t{\n\t\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\t}\n\t\t\telse\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s():Set TxSwQMaxLen as %d\\n\", \n\t\t\t__FUNCTION__, pAd->TxSwQMaxLen));\n}\n\n\nVOID VideoTurbineDynamicTune(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->VideoTurbine.Enable == TRUE) \n\t{\n\t\t\tUINT32 MacReg = 0;\n\n\t\t{\n\t\t\t/* Tx retry limit = 2F,1F */\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &MacReg);\n\t\t\tMacReg &= 0xFFFF0000;\n\t\t\tMacReg |= GetAsicVideoRetry(pAd);\n\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, MacReg);\n\t\t}\n\n\t\tpAd->VideoTurbine.TxBASize = GetAsicVideoTxBA(pAd);\n\n\t\tSet_RateAdaptInterval(pAd, \"100:50\");\n\t\tTxSwQDepthAdjust(pAd, 1024);\n\t\t\t\n\t}\n\telse \n\t{\n\t\t\tUINT32 MacReg = 0;\n\n\n\t\t/* Default Tx retry limit = 1F,0F */\n\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &MacReg);\n\t\tMacReg &= 0xFFFF0000;\n\t\t\tMacReg |= GetAsicDefaultRetry(pAd);\n\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, MacReg);\n\n\t\tpAd->VideoTurbine.TxBASize = GetAsicDefaultTxBA(pAd);\n\n\t\t/* reset to default rate adaptation simping interval */\n\t\tif ((pAd->ra_interval != DEF_RA_TIME_INTRVAL) || \n\t\t\t(pAd->ra_fast_interval != DEF_QUICK_RA_TIME_INTERVAL))\n\t\t\tSet_RateAdaptInterval(pAd, \"500:100\");\n\n\t\tTxSwQDepthAdjust(pAd, MAX_PACKETS_IN_QUEUE);\n\t}\n}\n\nUINT32 GetAsicDefaultRetry(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32 RetryLimit;\n\n\tRetryLimit = 0x1F0F;\n\n\treturn RetryLimit;\n}\n\nUCHAR GetAsicDefaultTxBA(\n\tIN PRTMP_ADAPTER pAd)\n{\n        return pAd->CommonCfg.TxBASize;\n}\n\nUINT32 GetAsicVideoRetry(\n\tIN PRTMP_ADAPTER pAd)\n{\n\treturn pAd->VideoTurbine.TxRetryLimit;\n}\n\nUCHAR GetAsicVideoTxBA(\n\tIN PRTMP_ADAPTER pAd)\n{\n\treturn pAd->VideoTurbine.TxBASize;\n}\n\nVOID VideoConfigInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tpAd->VideoTurbine.Enable = FALSE;\n\tpAd->VideoTurbine.TxRetryLimit = 0x2F1F;\n\tpAd->VideoTurbine.TxBASize = pAd->CommonCfg.TxBASize; \n}\n\n#endif /* VIDEO_TURBINE_SUPPORT */\n\n\n"
  },
  {
    "path": "src/common/cmm_wep.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_wep.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tPaul Wu\t\t10-28-02\t\tInitial\n*/\n\n#include\t\"rt_config.h\"\n\nUINT FCSTAB_32[256] = \n{\n\t0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,\n\t0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,\n\t0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n\t0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,\n\t0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n\t0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n\t0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,\n\t0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,\n\t0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n\t0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n\t0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,\n\t0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n\t0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,\n\t0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,\n\t0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n\t0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,\n\t0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,\n\t0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n\t0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,\n\t0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n\t0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, \n\t0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, \n\t0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, \n\t0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, \n\t0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, \n\t0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, \n\t0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, \n\t0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, \n\t0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, \n\t0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, \n\t0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, \n\t0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, \n\t0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, \n\t0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, \n\t0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, \n\t0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, \n\t0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, \n\t0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, \n\t0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, \n\t0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, \n\t0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, \n\t0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, \n\t0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, \n\t0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, \n\t0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, \n\t0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, \n\t0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, \n\t0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, \n\t0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, \n\t0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, \n\t0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, \n\t0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, \n\t0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, \n\t0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, \n\t0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, \n\t0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, \n\t0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, \n\t0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, \n\t0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, \n\t0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, \n\t0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, \n\t0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, \n\t0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, \n\t0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d \n}; \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCalculate a new FCS given the current FCS and the new data.\n\t\t\n\tArguments:\n\t\tFcs\t      the original FCS value\n\t\tCp          pointer to the data which will be calculate the FCS\n\t\tLen         the length of the data\n\t\t\n\tReturn Value:\n\t\tUINT - FCS 32 bits\n\t\t        \n\tIRQL = DISPATCH_LEVEL\n\n\tNote:\n\t\n\t========================================================================\n*/\nUINT\tRTMP_CALC_FCS32(\n\tIN\tUINT\tFcs,\n\tIN\tPUCHAR\tCp,\n\tIN\tINT\t\tLen)\n{\n\twhile (Len--)\n\t   Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);\n\n\treturn (Fcs); \n} \n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tInit WEP function.\t\n\t\t\n\tArguments:\n      pAd\t\tPointer to our adapter\n\t\tpKey        Pointer to the WEP KEY\n\t\tKeyId\t\t   WEP Key ID\n\t\tKeyLen      the length of WEP KEY\n\t\tpDest       Pointer to the destination which Encryption data will store in.\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTMPInitWepEngine(\n\tIN\tPUCHAR\t\t\tpIv,\n\tIN\tPUCHAR\t\t\tpKey,\n\tIN\tUCHAR\t\t\tKeyLen,\n\tOUT\tARC4_CTX_STRUC  *pARC4_CTX)\n{\t\n/*\tUCHAR   seed[16];*/\n\tPUCHAR\tseed = NULL;\n\tUINT8\tseed_len;\n\t\t\n\tos_alloc_mem(NULL, (UCHAR **)&seed, sizeof(UCHAR)*16);\n\tif (seed == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: seed Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\t/* WEP seed construction */\n\tNdisZeroMemory(seed, 16);\n\tNdisMoveMemory(seed, pIv, 3);\n\tNdisMoveMemory(&seed[3], pKey, KeyLen);\n\tseed_len = 3 + KeyLen;\n\n\t/* RC4 uses a pseudo-random number generator (PRNG) \n\t   to generate a key stream */\n\tARC4_INIT(pARC4_CTX, &seed[0], seed_len);    \t\t\n\n\tif (seed != NULL)\n\t\tos_free_mem(NULL, seed);\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct WEP IV header.\n\n\tArguments:\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\tIt's a 4-octets header.\n\t\t\t\t\n\t========================================================================\n*/\nVOID RTMPConstructWEPIVHdr(\n\tIN\tUINT8 \t\t\tkey_idx,\n\tIN\tUCHAR\t\t\t*pn,\t\n\tOUT\tUCHAR\t\t\t*iv_hdr)\n{\t\n\tNdisZeroMemory(iv_hdr, LEN_WEP_IV_HDR);\n\n\tNdisMoveMemory(iv_hdr, pn, LEN_WEP_TSC);\n\n\t/* Append key index */\n\tiv_hdr[3] = (key_idx << 6);        \n}\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tWEP MPDU cryptographic encapsulation \t\n\t\t\n\tArguments:\n\t\tpAdapter\t\tPointer to our adapter\n\t\tpSrc        Pointer to the received data\n\t\tLen         the length of the received data\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\n\t========================================================================\n*/\nBOOLEAN\tRTMPSoftEncryptWEP(\n\tIN \t\tPRTMP_ADAPTER \tpAd,\n\tIN \t\tPUCHAR\t\t\tpIvHdr,\n\tIN \t\tPCIPHER_KEY\t\tpKey,\n\tINOUT \tPUCHAR\t\t\tpData,\n\tIN \t\tULONG\t\t\tDataByteCnt)\n{\n\tARC4_CTX_STRUC *ARC4_CTX = NULL;\n\tUINT \tFCSCRC32;\n\n\tos_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC));\n\tif (ARC4_CTX == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ARC4_CTX Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tif (pKey->KeyLen == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The key is empty !\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\t/* Initialize WEP key stream */\n\tRTMPInitWepEngine(pIvHdr, \n\t\t\t\t\t  pKey->Key, \t\t\t\t\t   \n\t\t\t\t\t  pKey->KeyLen,\n\t\t\t\t\t  ARC4_CTX);\n\n\t/* WEP computes the ICV over the plaintext data */\n\tFCSCRC32 = RTMP_CALC_FCS32(PPPINITFCS32, pData, DataByteCnt);\n\tFCSCRC32 ^= 0xffffffff;             /* complement */\n\tFCSCRC32 = cpu2le32(FCSCRC32);\n\n\t/* Append 4-bytes ICV after the MPDU data */\n\tNdisMoveMemory(pData + DataByteCnt, (PUCHAR)&FCSCRC32, LEN_ICV);\n\n\t/* Encrypt the MPDU plaintext data and ICV using ARC4 with a seed */\n\tARC4_Compute(ARC4_CTX, pData, DataByteCnt + LEN_ICV, pData);\n\n\tif (ARC4_CTX != NULL)\n\t\tos_free_mem(NULL, ARC4_CTX);\n\n\treturn TRUE;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tDecrypt received WEP data\t\n\t\t\n\tArguments:\n\t\tpAdapter\t\tPointer to our adapter\n\t\tpSrc        Pointer to the received data\n\t\tLen         the length of the received data\n\t\t\n\tReturn Value:\n\t\tTRUE        Decrypt WEP data success\n\t\tFALSE       Decrypt WEP data failed\n\t\t\n\tNote:\n\t\n\t========================================================================\n*/\nBOOLEAN\tRTMPSoftDecryptWEP(\n\tIN \t\tPRTMP_ADAPTER \tpAd,\n\tIN \t\tPCIPHER_KEY\t\tpKey,\n\tINOUT \tPUCHAR\t\t\tpData,\n\tINOUT \tUINT16\t\t\t*DataByteCnt)\n{\n\t/*ARC4_CTX_STRUC \tARC4_CTX;*/\n\tARC4_CTX_STRUC \t*ARC4_CTX = NULL;\n\tPUCHAR\t\t\tplaintext_ptr;\n\tUINT16\t\t\tplaintext_len;\n\tPUCHAR\t\t\tciphertext_ptr;\n\tUINT16\t\t\tciphertext_len;\n\tUINT\t\t\ttrailfcs;\n\tUINT    \t\tcrc32;\n\t\n\tos_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC));\n\tif (ARC4_CTX == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ARC4_CTX Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tif (pKey->KeyLen == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The key is not available !\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\t/* Initialize WEP key stream */\n\tRTMPInitWepEngine(pData, \n\t\t\t\t\t  pKey->Key, \t\t\t\t\t   \n\t\t\t\t\t  pKey->KeyLen,\n\t\t\t\t\t  ARC4_CTX);\n\n\t/* Skip the WEP IV header (4-bytes) */\n\tciphertext_ptr = pData + LEN_WEP_IV_HDR;\n\tciphertext_len = *DataByteCnt - LEN_WEP_IV_HDR;\n\t\n\t/* Decrypt the WEP MPDU. It shall include plaintext and ICV.\n\t   The result output would overwrite the original WEP IV header position */\n\tARC4_Compute(ARC4_CTX, \n\t\t\t\t ciphertext_ptr, \n\t\t\t\t ciphertext_len, \n\t\t\t\t pData);\n\n\t/* Point to the decrypted data frame and its length shall exclude ICV length */\n\tplaintext_ptr = pData;\n\tplaintext_len = ciphertext_len - LEN_ICV;\n\n\t/* Extract peer's the ICV */\n\tNdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV);\n\n\t/* WEP recomputes the ICV and \n\t   bit-wise compares it with the decrypted ICV from the MPDU. */\n\tcrc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len);\n\tcrc32 ^= 0xffffffff;             /* complement */\n\n    if(crc32 != cpu2le32(trailfcs))\n    {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"! WEP Data CRC Error !\\n\"));\t /*CRC error.*/\n\t\treturn FALSE;\n\t}\n\n\t/* Update the total data length */\n\t*DataByteCnt = plaintext_len;\n\t\n\tif (ARC4_CTX != NULL)\n\t\tos_free_mem(NULL, ARC4_CTX);\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "src/common/cmm_wpa.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twpa.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJan\tLee\t\t03-07-22\t\tInitial\n\tPaul Lin\t03-11-28\t\tModify for supplicant\n*/\n#include \"rt_config.h\"\n\n/* WPA OUI*/\nUCHAR\t\tOUI_WPA[3]\t\t\t\t= {0x00, 0x50, 0xF2};\nUCHAR\t\tOUI_WPA_NONE_AKM[4]\t\t= {0x00, 0x50, 0xF2, 0x00};\nUCHAR       OUI_WPA_VERSION[4]      = {0x00, 0x50, 0xF2, 0x01};\nUCHAR       OUI_WPA_WEP40[4]      = {0x00, 0x50, 0xF2, 0x01};\nUCHAR       OUI_WPA_TKIP[4]     = {0x00, 0x50, 0xF2, 0x02};\nUCHAR       OUI_WPA_CCMP[4]     = {0x00, 0x50, 0xF2, 0x04};\nUCHAR       OUI_WPA_WEP104[4]      = {0x00, 0x50, 0xF2, 0x05};\nUCHAR       OUI_WPA_8021X_AKM[4]\t= {0x00, 0x50, 0xF2, 0x01};\nUCHAR       OUI_WPA_PSK_AKM[4]      = {0x00, 0x50, 0xF2, 0x02};\n/* WPA2 OUI*/\nUCHAR\t\tOUI_WPA2[3]\t\t\t\t= {0x00, 0x0F, 0xAC};\nUCHAR       OUI_WPA2_WEP40[4]   = {0x00, 0x0F, 0xAC, 0x01};\nUCHAR       OUI_WPA2_TKIP[4]        = {0x00, 0x0F, 0xAC, 0x02};\nUCHAR       OUI_WPA2_CCMP[4]        = {0x00, 0x0F, 0xAC, 0x04};\nUCHAR       OUI_WPA2_8021X_AKM[4]   = {0x00, 0x0F, 0xAC, 0x01};\nUCHAR       OUI_WPA2_PSK_AKM[4]   \t= {0x00, 0x0F, 0xAC, 0x02};\nUCHAR       OUI_WPA2_WEP104[4]   = {0x00, 0x0F, 0xAC, 0x05};\nUCHAR       OUI_WPA2_1X_SHA256[4]   = {0x00, 0x0F, 0xAC, 0x05};\nUCHAR       OUI_WPA2_PSK_SHA256[4]   = {0x00, 0x0F, 0xAC, 0x06};\n\n\n\nstatic VOID\tConstructEapolKeyData(\n\tIN\tPMAC_TABLE_ENTRY\tpEntry,\n\tIN\tUCHAR\t\t\tGroupKeyWepStatus,\t\n\tIN\tUCHAR\t\t\tkeyDescVer,\n\tIN \tUCHAR\t\t\tMsgType,\n\tIN\tUCHAR\t\t\tDefaultKeyIdx,\n\tIN\tUCHAR\t\t\t*GTK,\n\tIN\tUCHAR\t\t\t*RSNIE,\n\tIN\tUCHAR\t\t\tRSNIE_LEN,\n\tOUT PEAPOL_PACKET   pMsg);\n\nstatic VOID WpaEAPPacketAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem); \n\nstatic VOID WpaEAPOLASFAlertAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem); \n\nstatic VOID WpaEAPOLLogoffAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem); \n\nstatic VOID WpaEAPOLStartAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem);\n\nstatic VOID WpaEAPOLKeyAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem);\n\n/*  \n    ==========================================================================\n    Description: \n        association state machine init, including state transition and timer init\n    Parameters: \n        S - pointer to the association state machine\n    ==========================================================================\n */\nVOID WpaStateMachineInit(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  STATE_MACHINE *S, \n    OUT STATE_MACHINE_FUNC Trans[]) \n{\n    StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_WPA_PTK_STATE, MAX_WPA_MSG, (STATE_MACHINE_FUNC)Drop, WPA_PTK, WPA_MACHINE_BASE);\n\n    StateMachineSetAction(S, WPA_PTK, MT2_EAPPacket, (STATE_MACHINE_FUNC)WpaEAPPacketAction);\n    StateMachineSetAction(S, WPA_PTK, MT2_EAPOLStart, (STATE_MACHINE_FUNC)WpaEAPOLStartAction);\n    StateMachineSetAction(S, WPA_PTK, MT2_EAPOLLogoff, (STATE_MACHINE_FUNC)WpaEAPOLLogoffAction);\n    StateMachineSetAction(S, WPA_PTK, MT2_EAPOLKey, (STATE_MACHINE_FUNC)WpaEAPOLKeyAction);\n    StateMachineSetAction(S, WPA_PTK, MT2_EAPOLASFAlert, (STATE_MACHINE_FUNC)WpaEAPOLASFAlertAction);\n}\n\n/*\n    ==========================================================================\n    Description:\n        this is state machine function. \n        When receiving EAP packets which is  for 802.1x authentication use. \n        Not use in PSK case\n    Return:\n    ==========================================================================\n*/\nVOID WpaEAPPacketAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{   \n}\n\nVOID WpaEAPOLASFAlertAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{   \n}\n\nVOID WpaEAPOLLogoffAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem) \n{   \n}\n\n/*\n    ==========================================================================\n    Description:\n       Start 4-way HS when rcv EAPOL_START which may create by our driver in assoc.c\n    Return:\n    ==========================================================================\n*/\nVOID WpaEAPOLStartAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem) \n{   \n    MAC_TABLE_ENTRY     *pEntry;\n    PHEADER_802_11      pHeader;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t    \n    \tif (ADHOC_ON(pAd)) {\n            Adhoc_WpaEAPOLStartAction(pAd, Elem);\n            return;\n        }\n    }        \n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */    \n\n    DBGPRINT(RT_DEBUG_TRACE, (\"WpaEAPOLStartAction ===> \\n\"));\n    \n    pHeader = (PHEADER_802_11)Elem->Msg;\n    \n    /*For normaol PSK, we enqueue an EAPOL-Start command to trigger the process.*/\n    if (Elem->MsgLen == 6)\n        pEntry = MacTableLookup(pAd, Elem->Msg);\n    else\n    {\n        pEntry = MacTableLookup(pAd, pHeader->Addr2);\n#ifdef WSC_AP_SUPPORT\n        /* \n            a WSC enabled AP must ignore EAPOL-Start frames received from clients that associated to \n            the AP with an RSN IE or SSN IE indicating a WPA2-PSK/WPA-PSK authentication method in \n            the assication request.  <<from page52 in Wi-Fi Simple Config Specification version 1.0g>>\n        */\n        if (pEntry && \n            (pEntry->apidx == MAIN_MBSSID) &&\n            (pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscConfMode != WSC_DISABLE) &&\n            ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) &&\n\t\t\tpEntry->bWscCapable)\n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"WPS enabled AP: Ignore EAPOL-Start frames received from clients.\\n\"));\n            return;\n        }\n#endif /* WSC_AP_SUPPORT */\n    }\n    \n    if (pEntry) \n    {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" PortSecured(%d), WpaState(%d), AuthMode(%d), PMKID_CacheIdx(%d) \\n\", pEntry->PortSecured, pEntry->WpaState, pEntry->AuthMode, pEntry->PMKID_CacheIdx));\n\n        if ((pEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED)\n\t\t\t&& (pEntry->WpaState < AS_PTKSTART)\n            && ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) || ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) && (pEntry->PMKID_CacheIdx != ENTRY_NOT_FOUND))))\n        {\n            pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n            pEntry->WpaState = AS_INITPSK;\n            pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n            NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));\n            pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;\n            \n            WPAStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV);\n        }\n    }\n}\n\n/*\n    ==========================================================================\n    Description:\n        This is state machine function. \n        When receiving EAPOL packets which is  for 802.1x key management. \n        Use both in WPA, and WPAPSK case. \n        In this function, further dispatch to different functions according to the received packet.  3 categories are : \n          1.  normal 4-way pairwisekey and 2-way groupkey handshake\n          2.  MIC error (Countermeasures attack)  report packet from STA.\n          3.  Request for pairwise/group key update from STA\n    Return:\n    ==========================================================================\n*/\nVOID WpaEAPOLKeyAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem) \n{\t\n    MAC_TABLE_ENTRY     *pEntry;\n    PHEADER_802_11      pHeader;\n    PEAPOL_PACKET       pEapol_packet;\t\n\tKEY_INFO\t\t\tpeerKeyInfo;\n\tUINT\t\t\t\teapol_len;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t    \n    \tif (ADHOC_ON(pAd)) {\n            Adhoc_WpaEAPOLKeyAction(pAd, Elem);\n            return;\n        }\n    }\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */   \n\n    DBGPRINT(RT_DEBUG_TRACE, (\"WpaEAPOLKeyAction ===>\\n\"));\n\n    pHeader = (PHEADER_802_11)Elem->Msg;\n    pEapol_packet = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\teapol_len = CONV_ARRARY_TO_UINT16(pEapol_packet->Body_Len) + LENGTH_EAPOL_H;\n\n\tNdisZeroMemory((PUCHAR)&peerKeyInfo, sizeof(peerKeyInfo));\n\tNdisMoveMemory((PUCHAR)&peerKeyInfo, (PUCHAR)&pEapol_packet->KeyDesc.KeyInfo, sizeof(KEY_INFO));\n\n\n\t*((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo));\n\n    do\n    {\n        pEntry = MacTableLookup(pAd, pHeader->Addr2);\n\n\t\tif (!pEntry || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\t\t\n            break;\n\n\t\tif (pEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\tbreak;\t\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPoL-Key frame from STA %02X-%02X-%02X-%02X-%02X-%02X\\n\", PRINT_MAC(pEntry->Addr)));\n\n\t\tif (eapol_len > Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H)\n\t\t{\n            DBGPRINT(RT_DEBUG_ERROR, (\"The length of EAPoL packet is invalid \\n\"));\n            break;\n        }\n\n        if (((pEapol_packet->ProVer != EAPOL_VER) && (pEapol_packet->ProVer != EAPOL_VER2)) || \n\t\t\t((pEapol_packet->KeyDesc.Type != WPA1_KEY_DESC) && (pEapol_packet->KeyDesc.Type != WPA2_KEY_DESC)))\n        {\n            DBGPRINT(RT_DEBUG_ERROR, (\"Key descripter does not match with WPA rule\\n\"));\n            break;\n        }\n\n\t\t/* The value 1 shall be used for all EAPOL-Key frames to and from a STA when */\n\t\t/* neither the group nor pairwise ciphers are CCMP for Key Descriptor 1.*/\n\t\tif ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) && (peerKeyInfo.KeyDescVer != KEY_DESC_TKIP))\n        {\n\t        DBGPRINT(RT_DEBUG_ERROR, (\"Key descripter version not match(TKIP) \\n\"));\n    \t    break;\n    \t}\t\n\t\t/* The value 2 shall be used for all EAPOL-Key frames to and from a STA when */\n\t\t/* either the pairwise or the group cipher is AES-CCMP for Key Descriptor 2 or 3.*/\n                else if ((pEntry->WepStatus == Ndis802_11Encryption3Enabled) \n                        && (peerKeyInfo.KeyDescVer != KEY_DESC_AES)\n                        && (peerKeyInfo.KeyDescVer != KEY_DESC_EXT))\n    \t{\n                        DBGPRINT(RT_DEBUG_ERROR, (\"Key descripter version not match(AES) pEntry->WepStatus=%d, peerKeyInfo.KeyDescVer=%d\\n\", pEntry->WepStatus, peerKeyInfo.KeyDescVer));\n        \tbreak;\n    \t}\n\n\t\t/* Check if this STA is in class 3 state and the WPA state is started \t\t\t\t\t\t*/\n        if ((pEntry->Sst == SST_ASSOC) && (pEntry->WpaState >= AS_INITPSK))\n        {\t\t\t \t\t\n\t\t\t/* Check the Key Ack (bit 7) of the Key Information to determine the Authenticator */\n\t\t\t/* or not.*/\n\t\t\t/* An EAPOL-Key frame that is sent by the Supplicant in response to an EAPOL-*/\n\t\t\t/* Key frame from the Authenticator must not have the Ack bit set.*/\n\t\t\tif (peerKeyInfo.KeyAck == 1)\n\t\t\t{\n\t\t\t\t/* The frame is snet by Authenticator. */\n\t\t\t\t/* So the Supplicant side shall handle this.*/\n\n\t\t\t\tif ((peerKeyInfo.Secure == 0) && (peerKeyInfo.Request == 0) && \n\t\t\t\t\t(peerKeyInfo.Error == 0) && (peerKeyInfo.KeyType == PAIRWISEKEY))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tProcess \n\t\t\t\t\t\t\t1. the message 1 of 4-way HS in WPA or WPA2 \n\t\t\t\t\t\t\t\t\tEAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1)\n\t\t\t\t\t\t\t2. the message 3 of 4-way HS in WPA \n\t\t\t\t\t\t\t\t\tEAPOL-Key(0,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3)\n\t\t\t\t\t*/\n\t\t\t\t\tif (peerKeyInfo.KeyMic == 0)\n                    \tPeerPairMsg1Action(pAd, pEntry, Elem);\n\t                else                \t                \t\n    \t                PeerPairMsg3Action(pAd, pEntry, Elem);\n\t\t\t\t}\n\t\t\t\telse if ((peerKeyInfo.Secure == 1) && \n\t\t\t\t\t\t (peerKeyInfo.KeyMic == 1) &&\n\t\t\t\t\t\t (peerKeyInfo.Request == 0) && \n\t\t\t\t\t\t (peerKeyInfo.Error == 0))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tProcess\n\t\t\t\t\t\t\t1. the message 3 of 4-way HS in WPA2\n\t\t\t\t\t\t\t\tEAPOL-Key(1,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3)\n\t\t\t\t\t\t\t2. the message 1 of group KS in WPA or WPA2\n\t\t\t\t\t\t\t\tEAPOL-Key(1,1,1,0,G,0,Key RSC,0, MIC,GTK[N])\n\t\t\t\t\t*/\n\t\t\t\t\tif (peerKeyInfo.KeyType == PAIRWISEKEY)\n\t\t\t\t\t\tPeerPairMsg3Action(pAd, pEntry, Elem);\n\t\t\t\t\telse\n\t\t\t\t\t\tPeerGroupMsg1Action(pAd, pEntry, Elem);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tThe frame is snet by Supplicant.So the Authenticator \n\t\t\t\t\tside shall handle this.\n\t\t\t\t*/\n#ifdef CONFIG_AP_SUPPORT\n#ifdef QOS_DLS_SUPPORT\t\t\t\t\n\t\t\t\tif ((peerKeyInfo.KeyMic == 1) && \n\t\t\t\t\t(peerKeyInfo.Secure == 1) && \n\t\t\t\t\t(peerKeyInfo.Error == 0) &&\n\t\t\t\t\t(peerKeyInfo.KeyType == GROUPKEY) &&\n\t\t\t\t\t(pEapol_packet->KeyDesc.KeyDataLen[1] == 12))\n\t    \t    {\n\t    \t    \t/* This is a ralink proprietary DLS STA-Key processing*/\n\t        \t\tRTMPHandleSTAKey(pAd, pEntry, Elem);\n\t\t    \t}\n\t\t\t\telse\n#endif /* QOS_DLS_SUPPORT */\n\t\t\t\tif ((peerKeyInfo.KeyMic == 1) && \n\t\t\t\t\t(peerKeyInfo.Request == 1) && \n\t\t\t\t\t(peerKeyInfo.Error == 1))\n\t            {\t                \n\t\t\t\t\t/* The Supplicant uses a single Michael MIC Failure Report frame */\n\t\t\t\t\t/* to report a MIC failure event to the Authenticator. */\n\t\t\t\t\t/* A Michael MIC Failure Report is an EAPOL-Key frame with */\n\t\t\t\t\t/* the following Key Information field bits set to 1: */\n\t\t\t\t\t/* MIC bit, Error bit, Request bit, Secure bit.*/\n\n\t                DBGPRINT(RT_DEBUG_ERROR, (\"Received an Michael MIC Failure Report, active countermeasure \\n\"));\n\t                RTMP_HANDLE_COUNTER_MEASURE(pAd, pEntry);\n\t            }\n\t\t\t\telse \n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tif ((peerKeyInfo.Request == 0) && \n\t\t\t\t\t \t (peerKeyInfo.Error == 0) && \n\t\t\t\t\t \t (peerKeyInfo.KeyMic == 1))\n\t\t\t\t{\n\t\t\t\t\tif (peerKeyInfo.Secure == 0 && peerKeyInfo.KeyType == PAIRWISEKEY)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,Data)*/\n\t\t\t\t\t\t/* Process 1. message 2 of 4-way HS in WPA or WPA2 */\n\t\t\t\t\t\t/*\t\t   2. message 4 of 4-way HS in WPA\t*/\n\t\t\t\t\t\tif (CONV_ARRARY_TO_UINT16(pEapol_packet->KeyDesc.KeyDataLen) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPeerPairMsg4Action(pAd, pEntry, Elem);\n    \t            \t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPeerPairMsg2Action(pAd, pEntry, Elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (peerKeyInfo.Secure == 1 && peerKeyInfo.KeyType == PAIRWISEKEY)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* EAPOL-Key(1,1,0,0,P,0,0,0,MIC,0)\t\t\t\t\t\t*/\n\t\t\t\t\t\t/* Process message 4 of 4-way HS in WPA2*/\n\t\t\t\t\t\tPeerPairMsg4Action(pAd, pEntry, Elem);\n\t\t\t\t\t}\n\t\t\t\t\telse if (peerKeyInfo.Secure == 1 && peerKeyInfo.KeyType == GROUPKEY)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* EAPOL-Key(1,1,0,0,G,0,0,0,MIC,0)*/\n\t\t\t\t\t\t/* Process message 2 of Group key HS in WPA or WPA2 */\n\t\t\t\t\t\tPeerGroupMsg2Action(pAd, pEntry, &Elem->Msg[LENGTH_802_11], (Elem->MsgLen - LENGTH_802_11));\n\t\t\t\t\t}\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\t\t\t\t\n\t\t\t\telse if ((peerKeyInfo.Request == 1) && (peerKeyInfo.Error == 0))\n\t\t\t\t{\t\t\t\n\t\t\t\t\tINT\t\ti;\n\t\t\t\t\tUCHAR \tapidx = pEntry->apidx;\t\n\t\t\t\t\t\n\t                /* Need to check KeyType for groupkey or pairwise key update, refer to 8021i P.114, */\n\t                if (peerKeyInfo.KeyType == GROUPKEY)\n\t                {\n\t\t\t\t\t\tUINT8\t\tWcid;\n\t\t\t\t\t\tPMULTISSID_STRUCT\tpMbssEntry;\n\t            \n\t                    DBGPRINT(RT_DEBUG_TRACE, (\"REQUEST=1, ERROR=0, update group key\\n\"));\n\t        \n\t\t\t\t\t\tpMbssEntry = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\n\t\t\t\t\t\tGenRandom(pAd, pMbssEntry->Bssid, pMbssEntry->GNonce);\n\t\t\t\t\t\tpMbssEntry->DefaultKeyId = (pMbssEntry->DefaultKeyId == 1) ? 2 : 1;   \n\t\t\t\t\t\tWpaDeriveGTK(pMbssEntry->GMK, \n\t\t\t\t\t\t\t\t\t pMbssEntry->GNonce, \n\t\t\t\t\t\t\t\t\t pMbssEntry->Bssid, \n\t\t\t\t\t\t\t\t\t pMbssEntry->GTK, LEN_TKIP_GTK);\n\t                    \n\t\t\t\t\t\tfor (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t                    {\n\t                    \tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) \n\t\t\t\t\t\t\t\t&& (pAd->MacTab.Content[i].WpaState == AS_PTKINITDONE)\n\t\t\t\t\t\t\t\t&& (pAd->MacTab.Content[i].apidx == apidx))\n\t                    \t{\n\t                        \tpAd->MacTab.Content[i].GTKState = REKEY_NEGOTIATING;\n\t                        \tWPAStart2WayGroupHS(pAd, &pAd->MacTab.Content[i]);\n\t\t\t\t\t\t\t\tpAd->MacTab.Content[i].ReTryCounter = GROUP_MSG1_RETRY_TIMER_CTR;\n\t\t\t\t\t\t\t\tRTMPModTimer(&pAd->MacTab.Content[i].RetryTimer, PEER_MSG3_RETRY_EXEC_INTV);\n\t                    \t}\n\t                \t}\n\n\t\t\t\t\t\t/* Get a specific WCID to record this MBSS key attribute */\n\t\t\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\n\t\t\t\t\t\tWPAInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\t\t\t\tpMbssEntry->GroupKeyWepStatus, \n\t\t\t\t\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\t\t\t\t\tpMbssEntry->DefaultKeyId, \n\t\t\t\t\t\t\t\t\t\t\tWcid, \n\t\t\t\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\t\t\t\tpMbssEntry->GTK,\n\t\t\t\t\t\t\t\t\t\t\tLEN_TKIP_GTK);\n\n\t                }\n\t                else\n\t                {\n\t                    DBGPRINT(RT_DEBUG_TRACE, (\"REQUEST=1, ERROR= 0, update pairwise key\\n\"));\n\t                    \n\t\t\t\t\t\tNdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));  \n\t\t\t\t\t\t\n\t\t\t\t\t\t/* clear this entry as no-security mode*/\n\t\t\t\t\t\tAsicRemovePairwiseKeyEntry(pAd, pEntry->Aid); \n\n\t                    pEntry->Sst = SST_ASSOC;\n\t                    if (pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPA2)\n\t                        pEntry->WpaState = AS_INITPMK;  \n\t                    else if (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t                        pEntry->WpaState = AS_INITPSK;  \n\t\t\t\t\t\t\n\t                    pEntry->GTKState = REKEY_NEGOTIATING;\n\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t                    pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;\n\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t\tNdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));\n\t            \n\t\t\t            WPAStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV);\n\t                }\n\t            }\t\n#endif /* CONFIG_AP_SUPPORT */\t\t\t\t\n\t\t\t}\t\t\t            \n        }\n    }while(FALSE);\n}\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCopy frame from waiting queue into relative ring buffer and set \n\tappropriate ASIC register to kick hardware encryption before really\n\tsent out to air.\n\t\t\n\tArguments:\n\t\tpAd\t\tPointer\tto our adapter\n\t\tPNDIS_PACKET\tPointer to outgoing Ndis frame\n\t\tNumberOfFrag\tNumber of fragment required\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\n\t========================================================================\n*/\nVOID RTMPToWirelessSta(\n    IN  PRTMP_ADAPTER   \tpAd,\n    IN  PMAC_TABLE_ENTRY \tpEntry,\n    IN  PUCHAR          \tpHeader802_3,\n    IN  UINT            \tHdrLen,\n    IN  PUCHAR          \tpData,\n    IN  UINT            \tDataLen,\n    IN\tBOOLEAN\t\t\t\tbClearFrame)\n{\n    PNDIS_PACKET    pPacket;\n    NDIS_STATUS     Status;\n\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t && (!IS_ENTRY_TDLS(pEntry))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t))\n\t\treturn;\n\n\tdo {\n        \t/* build a NDIS packet*/\n        \tStatus = RTMPAllocateNdisPacket(pAd, &pPacket, pHeader802_3, HdrLen, pData, DataLen);\n        \tif (Status != NDIS_STATUS_SUCCESS)\n            \tbreak;\n\n        \n\t\t\tif (bClearFrame)\n\t\t\t\tRTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 1);\n\t\t\telse\n\t\t\t\tRTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 0);\n#ifdef CONFIG_AP_SUPPORT\t\t\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tRTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);\n\t\t\tRTMP_SET_PACKET_MOREDATA(pPacket, FALSE);\n\t\t\tRTMP_SET_PACKET_NET_DEVICE_APCLI(pPacket, pEntry->MatchAPCLITabIdx);\n\t\t\tRTMP_SET_PACKET_WCID(pPacket, pEntry->Aid); /* to ApClient links.*/\n#ifdef P2P_SUPPORT\n\t\t\tRTMP_SET_PACKET_OPMODE(pPacket, OPMODE_AP);\n#endif /* P2P_SUPPORT */\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t{\n\t\t\tRTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);\n\n\t\t\tRTMP_SET_PACKET_NET_DEVICE_MBSSID(pPacket, MAIN_MBSSID);\t/* set a default value*/\n\t\t\tif(pEntry->apidx != 0)\n        \t\tRTMP_SET_PACKET_NET_DEVICE_MBSSID(pPacket, pEntry->apidx);\n\t\t\n        \tRTMP_SET_PACKET_WCID(pPacket, (UCHAR)pEntry->Aid);\n\t\t\tRTMP_SET_PACKET_MOREDATA(pPacket, FALSE);\n#ifdef P2P_SUPPORT\n\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t{\n\t\t\t\tRTMP_SET_PACKET_NET_DEVICE_P2P(pPacket, MAIN_MBSSID);\n\t\t\t\tRTMP_SET_PACKET_OPMODE(pPacket, OPMODE_AP);\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* send out the packet */\n\t\t\tAPSendPacket(pAd, pPacket);\n\n\t\t\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it*/\n\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef P2P_SUPPORT\n\t\t\tif (IS_ENTRY_APCLI(pEntry) || IS_P2P_GO_ENTRY(pEntry))\n\t\t\t{\n\t\t\t    \t/* send out the packet */\n\t\t        \tAPSendPacket(pAd, pPacket);\n\n\t\t\t\t /* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t    \t    \t\tbreak;\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\t/* send out the packet*/\n\t\t\tStatus = STASendPacket(pAd, pPacket);\n\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t{\n\t\t\t\tUCHAR   Index;\n\t\t\t\t\n\t\t\t\t/* Dequeue one frame from TxSwQueue0..3 queue and process it*/\n\t\t\t\t/* There are three place calling dequeue for TX ring.*/\n\t\t\t\t/* 1. Here, right after queueing the frame.*/\n\t\t\t\t/* 2. At the end of TxRingTxDone service routine.*/\n\t\t\t\t/* 3. Upon NDIS call RTMPSendPackets*/\n\t\t\t\tif((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) && \n\t\t\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)))\n\t\t\t\t{\n\t\t\t\t\tfor(Index = 0; Index < 5; Index ++)\n\t\t\t\t\t\tif(pAd->TxSwQueue[Index].Number > 0)\n\t\t\t\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, Index, MAX_TX_PROCESS);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n  \n    } while (FALSE);\n}\n\n/*\n    ==========================================================================\n    Description:\n        Check the validity of the received EAPoL frame\n    Return:\n        TRUE if all parameters are OK, \n        FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN PeerWpaMessageSanity(\n    IN \tPRTMP_ADAPTER \t\tpAd, \n    IN \tPEAPOL_PACKET \t\tpMsg, \n    IN \tULONG \t\t\t\tMsgLen, \n    IN \tUCHAR\t\t\t\tMsgType,\n    IN \tMAC_TABLE_ENTRY  \t*pEntry)\n{\n\tUCHAR\t\t\tmic[LEN_KEY_DESC_MIC], digest[80]; /*, KEYDATA[MAX_LEN_OF_RSNIE];*/\n\tUCHAR\t\t\t*KEYDATA = NULL;\n\tBOOLEAN\t\t\tbReplayDiff = FALSE;\n\tBOOLEAN\t\t\tbWPA2 = FALSE;\n\tKEY_INFO\t\tEapolKeyInfo;\t\n\tUCHAR\t\t\tGroupKeyIndex = 0;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&KEYDATA, MAX_LEN_OF_RSNIE);\n\tif (KEYDATA == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tNdisZeroMemory(mic, sizeof(mic));\n\tNdisZeroMemory(digest, sizeof(digest));\n\tNdisZeroMemory(KEYDATA, MAX_LEN_OF_RSNIE);\n\tNdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo));\n\t\n\tNdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, sizeof(KEY_INFO));\n\n\t*((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo));\n\n\t/* Choose WPA2 or not*/\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tbWPA2 = TRUE;\n\n\t/* 0. Check MsgType*/\n\tif ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The message type is invalid(%d)! \\n\", MsgType));\n\t\tgoto LabelErr;\n\t}\n\t\t\t\t\n\t/* 1. Replay counter check\t*/\n \tif (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1)\t/* For supplicant*/\n    {\n    \t/* First validate replay counter, only accept message with larger replay counter.*/\n\t\t/* Let equal pass, some AP start with all zero replay counter*/\n\t\tUCHAR\tZeroReplay[LEN_KEY_DESC_REPLAY];\n\t\t\n        NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);\n\t\tif ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY) != 1) &&\n\t\t\t(RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0))\n    \t{\n\t\t\tbReplayDiff = TRUE;\n    \t}\t\t\t\t\t\t\n \t}\n\telse if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)\t/* For authenticator*/\n\t{\n\t\t/* check Replay Counter coresponds to MSG from authenticator, otherwise discard*/\n    \tif (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY))\n    \t{\t\n\t\t\tbReplayDiff = TRUE;\t        \n    \t}\n\t}\n\n\t/* Replay Counter different condition*/\n\tif (bReplayDiff)\n\t{\n\t\t/* send wireless event - for replay counter different*/\n\t\t\tRTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n\t\tif (MsgType < EAPOL_GROUP_MSG_1)\n\t\t{\n           \tDBGPRINT(RT_DEBUG_ERROR, (\"Replay Counter Different in pairwise msg %d of 4-way handshake!\\n\", MsgType));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Replay Counter Different in group msg %d of 2-way handshake!\\n\", (MsgType - EAPOL_PAIR_MSG_4)));\n\t\t}\n\t\t\n\t\thex_dump(\"Receive replay counter \", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\n\t\thex_dump(\"Current replay counter \", pEntry->R_Counter, LEN_KEY_DESC_REPLAY);\t\n        goto LabelErr;\n\t}\n\n\t/* 2. Verify MIC except Pairwise Msg1*/\n\tif (MsgType != EAPOL_PAIR_MSG_1)\n\t{\n\t\tUCHAR\t\t\trcvd_mic[LEN_KEY_DESC_MIC];\n\t\tUINT\t\t\teapol_len = CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4;\n\n\t\t/* Record the received MIC for check later*/\n\t\tNdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\t\tNdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\t\t\t\t\t\t\t\n        if (EapolKeyInfo.KeyDescVer == KEY_DESC_TKIP)\t/* TKIP*/\n        {\t\n            RT_HMAC_MD5(pEntry->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, eapol_len, mic, MD5_DIGEST_SIZE);\n        }\n        else if (EapolKeyInfo.KeyDescVer == KEY_DESC_AES)\t/* AES        */\n        {                        \n            RT_HMAC_SHA1(pEntry->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, eapol_len, digest, SHA1_DIGEST_SIZE);\n            NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);\n        }\n                else if (EapolKeyInfo.KeyDescVer == KEY_DESC_EXT)\t/* AES-128 */        \n                {                \n                        UINT mlen = AES_KEY128_LENGTH;\n                        AES_CMAC((PUCHAR)pMsg, eapol_len, pEntry->PTK, LEN_PTK_KCK, mic, &mlen);\t\t\t\n                }        \n        \n\t\n        if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))\n        {\n\t\t\t/* send wireless event - for MIC different*/\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n\t\t\tif (MsgType < EAPOL_GROUP_MSG_1)\n\t\t\t{\n            \tDBGPRINT(RT_DEBUG_ERROR, (\"MIC Different in pairwise msg %d of 4-way handshake!\\n\", MsgType));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MIC Different in group msg %d of 2-way handshake!\\n\", (MsgType - EAPOL_PAIR_MSG_4)));\n\t\t\t}\n\t\n\t\t\thex_dump(\"Received MIC\", rcvd_mic, LEN_KEY_DESC_MIC);\n\t\t\thex_dump(\"Desired  MIC\", mic, LEN_KEY_DESC_MIC);\n\n\t\t\tgoto LabelErr;\n        }        \n\t}\n\n\t/* 1. Decrypt the Key Data field if GTK is included.*/\n\t/* 2. Extract the context of the Key Data field if it exist.\t */\n\t/* The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is clear.*/\n\t/* The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted.*/\n\tif (CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen) > 0)\n\t{\t\t\n\t\t/* Decrypt this field\t\t*/\n\t\tif ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))\n\t\t{\t\t\t\t\t\n\t\t\tif((EapolKeyInfo.KeyDescVer == KEY_DESC_EXT) || (EapolKeyInfo.KeyDescVer == KEY_DESC_AES))\n\t\t\t{\n\t\t\t\tUINT aes_unwrap_len = 0;\n\t\t\t\t\n\t\t\t\t/* AES */\n\t\t\t\tAES_Key_Unwrap(pMsg->KeyDesc.KeyData, \n\t\t\t\t\t\t\t\t\tCONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen),\n\t\t\t\t\t\t\t   &pEntry->PTK[LEN_PTK_KCK], LEN_PTK_KEK, \n\t\t\t\t\t\t\t   KEYDATA, &aes_unwrap_len);\n\t\t\t\tSET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, aes_unwrap_len);\n\t\t\t} \n\t\t\telse\t  \n\t\t\t{\n\t\t\t\tTKIP_GTK_KEY_UNWRAP(&pEntry->PTK[LEN_PTK_KCK], \n\t\t\t\t\t\t\t\t\tpMsg->KeyDesc.KeyIv,\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tpMsg->KeyDesc.KeyData, \n\t\t\t\t\t\t\t\t\tCONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen),\n\t\t\t\t\t\t\t\t\tKEYDATA);\n\t\t\t}\t\n\n\t\t\tif (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))\n\t\t\t\tGroupKeyIndex = EapolKeyInfo.KeyIndex;\n\t\t\t\n\t\t}\n\t\telse if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2))\n\t\t{\t\t\t\t\t\n\t\t\tNdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen));\t\t\t     \n\t\t}\n\t\telse\n\t\t{\n\t\t\t\n\t\t\tgoto LabelOK;\n\t\t}\n\n\t\t/* Parse Key Data field to */\n\t\t/* 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2)*/\n\t\t/* 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2*/\n\t\t/* 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2)*/\n\t\tif (!RTMPParseEapolKeyData(pAd, KEYDATA, \n\t\t\t\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen), \n\t\t\t\t\t\t\t\t  GroupKeyIndex, MsgType, bWPA2, pEntry))\n\t\t{\n\t\t\tgoto LabelErr;\n\t\t}\n\t}\n\nLabelOK:\n\tif (KEYDATA != NULL)\n\t\tos_free_mem(NULL, KEYDATA);\n\treturn TRUE;\n\t\nLabelErr:\n\tif (KEYDATA != NULL)\n\t\tos_free_mem(NULL, KEYDATA);\n\treturn FALSE;\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        This is a function to initilize 4-way handshake\n        \n    Return:\n         \n    ==========================================================================\n*/\nVOID WPAStart4WayHS(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN ULONG\t\t\tTimeInterval) \n{\n    UCHAR           Header802_3[14];\n\tUCHAR   \t\t*mpool;\n    PEAPOL_PACKET\tpEapolFrame;\n\tPUINT8\t\t\tpBssid = NULL;\n\tUCHAR\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\tapidx = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t\n        if (ADHOC_ON(pAd)) {\n            Adhoc_WpaStart4WayHS(pAd, pEntry, TimeInterval);\n            return;\n        }\n    }        \n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */  \n\n    DBGPRINT(RT_DEBUG_TRACE, (\"===> WPAStart4WayHS\\n\"));\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : The interface is closed...\\n\"));\n\t\treturn;\t\t\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\t\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\t\t\t\n        if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n        {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : The entry doesn't exist.\\n\"));\t\t\n\t\t\treturn;\n        }\n\n\t\tif (pEntry->apidx < pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tapidx = pEntry->apidx;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : The apidx(%d) is invalid.\\n\", pEntry->apidx));\t\t\n\t\t\treturn;\n        }\n\t\t\n\t\t/* pointer to the corresponding position*/\n\t\tpBssid = pAd->ApCfg.MBSSID[apidx].Bssid;\n\t\tgroup_cipher = pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus;\n\t}\t\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif (pBssid == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : No corresponding Authenticator.\\n\"));\t\t\n\t\treturn;\n    }\n\n\t/* Check the status*/\n    if ((pEntry->WpaState > AS_PTKSTART) || (pEntry->WpaState < AS_INITPMK))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : Not expect calling\\n\"));\n        return;\n    }\n    \n#ifdef WSC_AP_SUPPORT\n    if (MAC_ADDR_EQUAL(pEntry->Addr, pAd->ApCfg.MBSSID[apidx].WscControl.EntryAddr) &&\n        pAd->ApCfg.MBSSID[apidx].WscControl.EapMsgRunning)\n    {\n        pEntry->WpaState = AS_NOTUSE;\n        DBGPRINT(RT_DEBUG_ERROR, (\"This is a WSC-Enrollee. Not expect calling WPAStart4WayHS here \\n\"));\n        return;\n    }\n#endif /* WSC_AP_SUPPORT */\n    \n\t/* Increment replay counter by 1*/\n\tADD_ONE_To_64BIT_VAR(pEntry->R_Counter);\n\t\n\t/* Randomly generate ANonce\t\t*/\n\tGenRandom(pAd, (UCHAR *)pBssid, pEntry->ANonce);\t\n\n\t/* Allocate memory for output*/\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\t\n\t/* Construct EAPoL message - Pairwise Msg 1*/\n\t/* EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1)\t\t*/\n\tConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_PAIR_MSG_1,\n\t\t\t\t\t  0,\t\t\t\t\t/* Default key index*/\n\t\t\t\t\t  pEntry->ANonce,\n\t\t\t\t\t  NULL,\t\t\t\t\t/* TxRSC*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* GTK*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* RSNIE*/\n\t\t\t\t\t  0,\t\t\t\t\t/* RSNIE length\t*/\n\t\t\t\t\t  pEapolFrame);\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* If PMKID match in WPA2-enterprise mode, fill PMKID into Key data field and update PMK here\t*/\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) && (pEntry->PMKID_CacheIdx != ENTRY_NOT_FOUND))\n\t{\n\t\t\t/* Fill in value for KDE */\n\t\tpEapolFrame->KeyDesc.KeyData[0] = 0xDD;\n        pEapolFrame->KeyDesc.KeyData[2] = 0x00;\n        pEapolFrame->KeyDesc.KeyData[3] = 0x0F;\n        pEapolFrame->KeyDesc.KeyData[4] = 0xAC;\n        pEapolFrame->KeyDesc.KeyData[5] = 0x04;\n\n\t\tNdisMoveMemory(&pEapolFrame->KeyDesc.KeyData[6], &pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[pEntry->PMKID_CacheIdx].PMKID, LEN_PMKID);\n    \tNdisMoveMemory(&pAd->ApCfg.MBSSID[apidx].PMK, &pAd->ApCfg.MBSSID[apidx].PMKIDCache.BSSIDInfo[pEntry->PMKID_CacheIdx].PMK, PMK_LEN);\n    \t\t\n    \tpEapolFrame->KeyDesc.KeyData[1] = 0x14;/* 4+LEN_PMKID*/\n    \tINC_UINT16_TO_ARRARY(pEapolFrame->KeyDesc.KeyDataLen, 6 + LEN_PMKID);    \t\t\t\n    \tINC_UINT16_TO_ARRARY(pEapolFrame->Body_Len, 6 + LEN_PMKID);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\n\t/* Make outgoing frame*/\n    MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);            \n    RTMPToWirelessSta(pAd, pEntry, Header802_3, \n\t\t\t\t\t  LENGTH_802_3, (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, \n\t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\n\n\t/* Trigger Retry Timer*/\n    RTMPModTimer(&pEntry->RetryTimer, TimeInterval);\t\t\n\n\t/* Update State*/\n    pEntry->WpaState = AS_PTKSTART;\n\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== WPAStart4WayHS: send Msg1 of 4-way \\n\"));\n        \n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess Pairwise key Msg-1 of 4-way handshaking and send Msg-2 \n\n\tArguments:\n\t\tpAd\t\t\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID PeerPairMsg1Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n\tUCHAR\t\t\t\tPTK[80];\n\tUCHAR               Header802_3[14];\n\tPEAPOL_PACKET\t\tpMsg1;\n\tUINT            \tMsgLen;\t\n\tUCHAR   \t\t\t*mpool;\n    PEAPOL_PACKET\t\tpEapolFrame;\n\tPUINT8\t\t\t\tpCurrentAddr = NULL;\n\tPUINT8\t\t\t\tpmk_ptr = NULL;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\tPUINT8\t\t\t\trsnie_ptr = NULL;\n\tUCHAR\t\t\t\trsnie_len = 0;\n\t   \n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> PeerPairMsg1Action \\n\"));\n\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\n\t\treturn;\n\n    if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n        return;\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tUINT\t\t\t\tIfIndex = 0;\n\t\t\t\n\t\t\tIfIndex = pEntry->MatchAPCLITabIdx;\n\t\t\tif (IfIndex >= MAX_APCLI_NUM)\n\t\t\t\treturn;\n\n\t\t\tpCurrentAddr = pAd->ApCfg.ApCliTab[IfIndex].CurrentAddress;\n\t\t\tpmk_ptr = pAd->ApCfg.ApCliTab[IfIndex].PMK;\n\t\t\tgroup_cipher = pAd->ApCfg.ApCliTab[IfIndex].GroupCipher;\n\t\t\trsnie_ptr = pAd->ApCfg.ApCliTab[IfIndex].RSN_IE;\n\t\t\trsnie_len = pAd->ApCfg.ApCliTab[IfIndex].RSNIE_Len;\n\t\t}\n#endif /* APCLI_SUPPORT */\t\t\t\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t\t\n#ifdef P2P_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tUINT\t\t\t\tIfIndex = 0;\n\t\t\t\n\t\t\tIfIndex = pEntry->MatchAPCLITabIdx;\n\t\t\tif (IfIndex >= MAX_APCLI_NUM)\n\t\t\t\treturn;\n\n\t\t\tpCurrentAddr = pAd->ApCfg.ApCliTab[IfIndex].CurrentAddress;\n\t\t\tpmk_ptr = pAd->ApCfg.ApCliTab[IfIndex].PMK;\n\t\t\tgroup_cipher = pAd->ApCfg.ApCliTab[IfIndex].GroupCipher;\n\t\t\trsnie_ptr = pAd->ApCfg.ApCliTab[IfIndex].RSN_IE;\n\t\t\trsnie_len = pAd->ApCfg.ApCliTab[IfIndex].RSNIE_Len;\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\tpCurrentAddr = pAd->CurrentAddress;\n\t\tpmk_ptr = pAd->StaCfg.PMK;\n\t\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\t\trsnie_ptr = pAd->StaCfg.RSN_IE;\n\t\trsnie_len = pAd->StaCfg.RSNIE_Len;\n\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pCurrentAddr == NULL)\n\t\treturn;\n\n\t/* Store the received frame*/\n\tpMsg1 = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\t\n\t/* Sanity Check peer Pairwise message 1 - Replay Counter*/\n\tif (PeerWpaMessageSanity(pAd, pMsg1, MsgLen, EAPOL_PAIR_MSG_1, pEntry) == FALSE)\n\t\treturn;\n\t\n\t/* Store Replay counter, it will use to verify message 3 and construct message 2*/\n\tNdisMoveMemory(pEntry->R_Counter, pMsg1->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\t\t\n\n\t/* Store ANonce*/\n\tNdisMoveMemory(pEntry->ANonce, pMsg1->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE);\n\t\t\n\t/* Generate random SNonce*/\n\tGenRandom(pAd, (UCHAR *)pCurrentAddr, pEntry->SNonce);\n\n\t{\n\t    /* Calculate PTK(ANonce, SNonce)*/\n\t    WpaDerivePTK(pAd,\n\t    \t\t\tpmk_ptr,\n\t\t\t     \tpEntry->ANonce,\n\t\t\t\t \tpEntry->Addr, \n\t\t\t\t \tpEntry->SNonce,\n\t\t\t\t \tpCurrentAddr, \n\t\t\t\t    PTK, \n\t\t\t\t    LEN_PTK);\n\n\t\t/* Save key to PTK entry*/\n\t\tNdisMoveMemory(pEntry->PTK, PTK, LEN_PTK);\n\t}\t\t    \n\t\t\n\t/* Update WpaState*/\n\tpEntry->WpaState = AS_PTKINIT_NEGOTIATING;\n\n\t/* Allocate memory for output*/\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n\t/* Construct EAPoL message - Pairwise Msg 2*/\n\t/*  EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,DataKD_M2)*/\n\tConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_PAIR_MSG_2,  \n\t\t\t\t\t  0,\t\t\t\t/* DefaultKeyIdx*/\n\t\t\t\t\t  pEntry->SNonce,\n\t\t\t\t\t  NULL,\t\t\t\t/* TxRsc*/\n\t\t\t\t\t  NULL,\t\t\t\t/* GTK*/\n\t\t\t\t\t  (UCHAR *)rsnie_ptr,\n\t\t\t\t\t  rsnie_len,\n\t\t\t\t\t  pEapolFrame);\n\n\t/* Make outgoing frame*/\n\tMAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);\t\n\t\n\tRTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, sizeof(Header802_3), (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, TRUE);\n\n\tos_free_mem(NULL, mpool);\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerPairMsg1Action: send Msg2 of 4-way \\n\"));\n}\t\n\n\n/*\n    ==========================================================================\n    Description:\n        When receiving the second packet of 4-way pairwisekey handshake.\n    Return:\n    ==========================================================================\n*/\nVOID PeerPairMsg2Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{   \n\tUCHAR\t\t\t\tPTK[80];\n    BOOLEAN             Cancelled;\n    PHEADER_802_11      pHeader;\n\tUCHAR   \t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tPEAPOL_PACKET       pMsg2;\n\tUINT            \tMsgLen;\n    UCHAR               Header802_3[LENGTH_802_3];\n\tUCHAR \t\t\t\tTxTsc[6];\t\n\tPUINT8\t\t\t\tpBssid = NULL;\n\tPUINT8\t\t\t\tpmk_ptr = NULL;\n\tPUINT8\t\t\t\tgtk_ptr = NULL;\n\tUCHAR\t\t\t\tdefault_key = 0;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\tPUINT8\t\t\t\trsnie_ptr = NULL;\n\tUCHAR\t\t\t\trsnie_len = 0;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\t\tapidx = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"===> PeerPairMsg2Action \\n\"));\n\n    if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n        return;\n        \n    if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n        return;\n\n    /* check Entry in valid State*/\n    if (pEntry->WpaState < AS_PTKSTART)\n        return;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\t\t\t\n\t\tif (pEntry->apidx >= pAd->ApCfg.BssidNum)\n        \treturn;\n\t\telse\n\t\t\tapidx = pEntry->apidx;\n\t\t\t\n\t\tpBssid = pAd->ApCfg.MBSSID[apidx].Bssid;\n\t\tpmk_ptr = pAd->ApCfg.MBSSID[apidx].PMK;\n\t\tgtk_ptr = pAd->ApCfg.MBSSID[apidx].GTK;\n\t\tgroup_cipher = pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus;\n\t\tdefault_key = pAd->ApCfg.MBSSID[apidx].DefaultKeyId;\n\n\t\t/* Get Group TxTsc form Asic*/\n\t\tRTMPGetTxTscFromAsic(pAd, apidx, TxTsc);\n\n\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK))\n        {\n\t\t\trsnie_len = pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0];\n\t\t\trsnie_ptr = &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][0];\n        }\n        else\n        {\n            if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK) ||\n\t\t\t\t(pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2)) \n            {\n                rsnie_len = pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1];\n                rsnie_ptr = &pAd->ApCfg.MBSSID[apidx].RSN_IE[1][0];\n            }\n            else\n            {\n                rsnie_len = pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0];\n                rsnie_ptr = &pAd->ApCfg.MBSSID[apidx].RSN_IE[0][0];\n            }\n        }\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\n\n    /* pointer to 802.11 header*/\n\tpHeader = (PHEADER_802_11)Elem->Msg;\n\n\t/* skip 802.11_header(24-byte) and LLC_header(8) */\n\tpMsg2 = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];       \n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n\t/* Store SNonce*/\n\tNdisMoveMemory(pEntry->SNonce, pMsg2->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE);\n\n\t{\n\t\t/* Derive PTK*/\n\t\tif ((pmk_ptr == NULL) || (pBssid == NULL))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t(\"%s: pmk_ptr or pBssid == NULL!\\n\", __FUNCTION__));\n\t\t\treturn;\n\t\t}\n\n\t\tWpaDerivePTK(pAd, \n\t\t\t\t\t(UCHAR *)pmk_ptr,  \n\t\t\t\t\tpEntry->ANonce, \t\t/* ANONCE*/\n\t\t\t\t\t(UCHAR *)pBssid, \n\t\t\t\t\tpEntry->SNonce, \t\t/* SNONCE*/\n\t\t\t\t\tpEntry->Addr, \n\t\t\t\t\tPTK, \n\t\t\t\t\tLEN_PTK); \t\t\n\n    \tNdisMoveMemory(pEntry->PTK, PTK, LEN_PTK);\n\t}\n\n\t/* Sanity Check peer Pairwise message 2 - Replay Counter, MIC, RSNIE*/\n\tif (PeerWpaMessageSanity(pAd, pMsg2, MsgLen, EAPOL_PAIR_MSG_2, pEntry) == FALSE)\n\t\treturn;\n\n    do\n    {\n\t\t/* Allocate memory for input*/\n\t\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\t\tif (mpool == NULL)\n\t    {\n\t        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n\t        return;\n\t    }\n\n\t\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\t\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\t    \n        /* delete retry timer*/\n\t\tRTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n\n\t\t/* Change state*/\n        pEntry->WpaState = AS_PTKINIT_NEGOTIATING;\n\n\t\t/* Increment replay counter by 1*/\n\t\tADD_ONE_To_64BIT_VAR(pEntry->R_Counter);\n\n\t\t/* Construct EAPoL message - Pairwise Msg 3*/\n\t\tConstructEapolMsg(pEntry,\n\t\t\t\t\t\t  group_cipher,\n\t\t\t\t\t\t  EAPOL_PAIR_MSG_3,\n\t\t\t\t\t\t  default_key,\n\t\t\t\t\t\t  pEntry->ANonce,\n\t\t\t\t\t\t  TxTsc,\n\t\t\t\t\t\t  (UCHAR *)gtk_ptr,\n\t\t\t\t\t\t  (UCHAR *)rsnie_ptr,\n\t\t\t\t\t\t  rsnie_len,\n\t\t\t\t\t\t  pEapolFrame);\n            \n        /* Make outgoing frame*/\n        MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);            \n        RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, \n\t\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, \n\t\t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\n\n        pEntry->ReTryCounter = PEER_MSG3_RETRY_TIMER_CTR;\n\t\tRTMPSetTimer(&pEntry->RetryTimer, PEER_MSG3_RETRY_EXEC_INTV);\n        \n\t\t/* Update State*/\n        pEntry->WpaState = AS_PTKINIT_NEGOTIATING;\n\t\t\n\t\tos_free_mem(NULL, mpool);\n\t\n    }while(FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerPairMsg2Action: send Msg3 of 4-way \\n\"));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess Pairwise key Msg 3 of 4-way handshaking and send Msg 4 \n\n\tArguments:\n\t\tpAd\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID PeerPairMsg3Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n\tPHEADER_802_11\t\tpHeader;\n\tUCHAR               Header802_3[14];\n\tUCHAR\t\t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tPEAPOL_PACKET\t\tpMsg3;\n\tUINT            \tMsgLen;\t\t\t\t\n\tPUINT8\t\t\t\tpCurrentAddr = NULL;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n#ifdef P2P_SUPPORT\n\tBOOLEAN\t\t\t\tCancelled;\n#endif /* P2P_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> PeerPairMsg3Action \\n\"));\n\t\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\n\t\treturn;\n\n    if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n\t\treturn;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tUINT\t\t\t\tIfIndex = 0;\n\t\t\n\t\t\tIfIndex = pEntry->MatchAPCLITabIdx;\n\t\t\tif (IfIndex >= MAX_APCLI_NUM)\n\t\t\t\treturn;\n\n\t\t\tpCurrentAddr = pAd->ApCfg.ApCliTab[IfIndex].CurrentAddress;\n\t\t\tgroup_cipher = pAd->ApCfg.ApCliTab[IfIndex].GroupCipher;\n\n\t\t}\n#endif /* APCLI_SUPPORT */\t\t\t\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t\t\n#ifdef P2P_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tUINT\t\t\t\tIfIndex = 0;\n\t\t\n\t\t\tIfIndex = pEntry->MatchAPCLITabIdx;\n\t\t\tif (IfIndex >= MAX_APCLI_NUM)\n\t\t\t\treturn;\n\n\t\t\tpCurrentAddr = pAd->ApCfg.ApCliTab[IfIndex].CurrentAddress;\n\t\t\tgroup_cipher = pAd->ApCfg.ApCliTab[IfIndex].GroupCipher;\n\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\tpCurrentAddr = pAd->CurrentAddress;\n\t\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\n\t}\t\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pCurrentAddr == NULL)\n\t\treturn;\n\t\n\t/* Record 802.11 header & the received EAPOL packet Msg3*/\n\tpHeader\t= (PHEADER_802_11) Elem->Msg;\n\tpMsg3 = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n\t/* Sanity Check peer Pairwise message 3 - Replay Counter, MIC, RSNIE*/\n\tif (PeerWpaMessageSanity(pAd, pMsg3, MsgLen, EAPOL_PAIR_MSG_3, pEntry) == FALSE)\n\t\treturn;\n\t\n\t/* Save Replay counter, it will use construct message 4*/\n\tNdisMoveMemory(pEntry->R_Counter, pMsg3->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\n\n\t/* Double check ANonce*/\n\tif (!NdisEqualMemory(pEntry->ANonce, pMsg3->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE))\n\t{\n\t\treturn;\n\t}\n\n\t/* Allocate memory for output*/\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n\t/* Construct EAPoL message - Pairwise Msg 4*/\n\tConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_PAIR_MSG_4,  \n\t\t\t\t\t  0,\t\t\t\t\t/* group key index not used in message 4*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* Nonce not used in message 4*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* TxRSC not used in message 4*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* GTK not used in message 4*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* RSN IE not used in message 4*/\n\t\t\t\t\t  0,\n\t\t\t\t\t  pEapolFrame);\n\n\t/* Update WpaState*/\n\tpEntry->WpaState = AS_PTKINITDONE;\t \t\n#ifdef P2P_SUPPORT\n\tif (IS_P2P_CLI_ENTRY(pEntry) && (pEntry->bP2pClient))\n\t{\n\t\tif (pAd->P2pCfg.bP2pCliReConnectTimerRunning)\n\t\t{\n\t\t\tpAd->P2pCfg.bP2pCliReConnectTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pCliReConnectTimer, &Cancelled);\n\t\t}\n\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pWscTimer, &Cancelled);\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tP2pSendWirelessEvent(pAd, RT_P2P_AP_STA_CONNECTED, NULL, pEntry->Addr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t}\n#endif /* P2P_SUPPORT */\n\t/* Update pairwise key\t\t*/\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\t\n\t\tif (IS_ENTRY_APCLI(pEntry))\t\n\t\t \tAPCliInstallPairwiseKey(pAd, pEntry);\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\t\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\n\t\t \tAPCliInstallPairwiseKey(pAd, pEntry);\n\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\tNdisMoveMemory(pAd->StaCfg.PTK, pEntry->PTK, LEN_PTK);\n\t\tWPAInstallPairwiseKey(pAd, \n\t\t\t\t\t\t\t  BSS0, \n\t\t\t\t\t\t\t  pEntry, \n\t\t\t\t\t\t\t  FALSE);\n\t\tNdisMoveMemory(&pAd->SharedKey[BSS0][0], &pEntry->PairwiseKey, sizeof(CIPHER_KEY));\n\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* open 802.1x port control and privacy filter*/\n\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK || \n\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2)\n\t{\n\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\t\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\t{\n\t\t\tMultiChannelTimerStart(pAd,pEntry);\n\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tSTA_PORT_SECURED(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerPairMsg3Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \\n\",\n\t\t\t\t\t\t\t\t\tGetAuthMode(pEntry->AuthMode),\n\t\t\t\t\t\t\t\t\tGetEncryptType(pEntry->WepStatus),\n\t\t\t\t\t\t\t\t\tGetEncryptType(group_cipher)));\n\t}\n\telse\n\t{\t\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef APCLI_SUPPORT\t\n\t\t\t/* Patch issue with gateway AP*/\n\t\t\t/* In WPA mode, AP doesn't send out message 1 of group-key HS.*/\n\t\t\t/* So, Supplicant shall maintain a timeout action to disconnect */\n\t\t\t/* this link.*/\n\t\t\t/* Todo - Does it need to apply to STA ?*/\n\t\t\tif (IS_ENTRY_APCLI(pEntry))\t\n\t\t\t \tRTMPSetTimer(&pEntry->RetryTimer, PEER_GROUP_KEY_UPDATE_INIV);\n#endif /* APCLI_SUPPORT */\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\t\t\n\t}\n\n\t/* Init 802.3 header and send out*/\n\tMAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);\t\n\tRTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, sizeof(Header802_3), \n\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, TRUE);\n\n\tos_free_mem(NULL, mpool);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerPairMsg3Action: send Msg4 of 4-way \\n\"));\n}\n\n/*\n    ==========================================================================\n    Description:\n        When receiving the last packet of 4-way pairwisekey handshake.\n        Initilize 2-way groupkey handshake following.\n    Return:\n    ==========================================================================\n*/\nVOID PeerPairMsg4Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{    \n\tPEAPOL_PACKET   \tpMsg4;    \n    PHEADER_802_11      pHeader;\n    UINT            \tMsgLen;\n    BOOLEAN             Cancelled;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"===> PeerPairMsg4Action\\n\"));\n\n    do\n    {\n        if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n            break;\n\t\t\n        if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG ) )\n            break;\n\n        if (pEntry->WpaState < AS_PTKINIT_NEGOTIATING)\n            break;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUCHAR apidx = 0;\n\t\t\n\t\t\tif (pEntry->apidx >= pAd->ApCfg.BssidNum)\n\t\t\t\tbreak;\n\t\t    else\n\t\t\t\tapidx = pEntry->apidx;\t\n\n\t\t\tgroup_cipher = pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus;\t\t\t\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n        /* pointer to 802.11 header*/\n        pHeader = (PHEADER_802_11)Elem->Msg;\n\n\t\t/* skip 802.11_header(24-byte) and LLC_header(8) */\n\t\tpMsg4 = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; \n\t\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n        /* Sanity Check peer Pairwise message 4 - Replay Counter, MIC*/\n\t\tif (PeerWpaMessageSanity(pAd, pMsg4, MsgLen, EAPOL_PAIR_MSG_4, pEntry) == FALSE)\n\t\t\tbreak;\n\n        /* 3. Install pairwise key */\n\t\tWPAInstallPairwiseKey(pAd, pEntry->apidx, pEntry, TRUE);\n        \n        /* 4. upgrade state */\n        pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n        pEntry->WpaState = AS_PTKINITDONE;\n\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n        \n#ifdef WSC_AP_SUPPORT\n        if (pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscConfMode != WSC_DISABLE)\n            WscInformFromWPA(pEntry);\n#endif /* WSC_AP_SUPPORT */\n\n\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA2 || \n\t\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t{\n\t\t\tpEntry->GTKState = REKEY_ESTABLISHED;\n\t\t\tRTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DOT1X_SUPPORT\n\t\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA2)\n        \t{\n        \t\tUCHAR  PMK_key[20];\n\t\t\t\tUCHAR  digest[80];\n\t\t\t\n\t\t\t\t/* Calculate PMKID, refer to IEEE 802.11i-2004 8.5.1.2*/\n\t\t\t\tNdisMoveMemory(&PMK_key[0], \"PMK Name\", 8);\n\t\t\t\tNdisMoveMemory(&PMK_key[8], pAd->ApCfg.MBSSID[pEntry->apidx].Bssid, MAC_ADDR_LEN);\n\t\t\t\tNdisMoveMemory(&PMK_key[14], pEntry->Addr, MAC_ADDR_LEN);\n\t\t\t\tRT_HMAC_SHA1(pAd->ApCfg.MBSSID[pEntry->apidx].PMK, PMK_LEN, PMK_key, 20, digest, SHA1_DIGEST_SIZE);\n\t\t\t\tRTMPAddPMKIDCache(pAd, pEntry->apidx, pEntry->Addr, digest, pAd->ApCfg.MBSSID[pEntry->apidx].PMK);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\\n\", digest[0],digest[1],digest[2],digest[3],digest[4],digest[5]));\n        \t}\n#endif /* DOT1X_SUPPORT */\t\t\t\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\t/* send wireless event - for set key done WPA2*/\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n#ifdef P2P_SUPPORT\n\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t{\n\t\t\tif (pEntry->bP2pClient)\n\t\t\t{\n#if defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t\t\t\tUCHAR p2pIndex = P2P_NOT_FOUND;\n\t\t\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = NULL;\n\n\t\t\t\tp2pIndex = P2pGroupTabSearch(pAd, pEntry->Addr);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pEntry->bP2pClient: p2pIndex = %d, %02X-%02X-%02X-%02X-%02X-%02X\\n\", p2pIndex, PRINT_MAC(pEntry->Addr)));\n\t\t\t\tif (p2pIndex != P2P_NOT_FOUND)\n\t\t\t\t{\n\t\t\t\t\tpP2pEntry = &pAd->P2pTable.Client[p2pIndex];\n\t\t\t\t}\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_AP_STA_CONNECTED, pP2pEntry, pEntry->Addr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n#endif\n\t\t\t\tpAd->P2pCfg.bPeriodicListen = TRUE;\n\t\t\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pWscTimer, &Cancelled);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_AP_STA_CONNECTED, NULL, pEntry->Addr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t}\n\t\t}\n#endif /* P2P_SUPPORT */\n\t \n\t        DBGPRINT(RT_DEBUG_OFF, (\"AP SETKEYS DONE - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\\n\\n\", \n\t\t\t\t\t\t\t\t\tpEntry->AuthMode, GetAuthMode(pEntry->AuthMode), \n\t\t\t\t\t\t\t\t\tpEntry->WepStatus, GetEncryptType(pEntry->WepStatus), \n\t\t\t\t\t\t\t\t\tgroup_cipher, \n\t\t\t\t\t\t\t\t\tGetEncryptType(group_cipher)));\n\t\t}\n\t\telse\n\t\t{\n        \t/* 5. init Group 2-way handshake if necessary.*/\n\t        WPAStart2WayGroupHS(pAd, pEntry);\n\n        \tpEntry->ReTryCounter = GROUP_MSG1_RETRY_TIMER_CTR;\n\t\t\tRTMPModTimer(&pEntry->RetryTimer, PEER_MSG3_RETRY_EXEC_INTV);\n\t\t}\n    }while(FALSE);\n    \n}\n\n/*\n    ==========================================================================\n    Description:\n        This is a function to send the first packet of 2-way groupkey handshake\n    Return:\n         \n    ==========================================================================\n*/\nVOID WPAStart2WayGroupHS(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry) \n{\n    UCHAR               Header802_3[14];\n\tUCHAR   \t\t\tTxTsc[6]; \n\tUCHAR   \t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\t\n\tUCHAR\t\t\t\tdefault_key = 0;\n\tPUINT8\t\t\t\tgnonce_ptr = NULL;\n\tPUINT8\t\t\t\tgtk_ptr = NULL;\n\tPUINT8\t\t\t\tpBssid = NULL;\n    \n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> WPAStart2WayGroupHS\\n\"));\n\n    if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n        return;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\tUCHAR\tapidx = 0;\n\t\n\t\tif (pEntry->apidx >= pAd->ApCfg.BssidNum)\n\t\t\treturn;\n\t    else\n\t\t\tapidx = pEntry->apidx;\t\n\n\t\tgroup_cipher = pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus;\n\t\tdefault_key = pAd->ApCfg.MBSSID[apidx].DefaultKeyId;\n\t\tgnonce_ptr = pAd->ApCfg.MBSSID[apidx].GNonce;\n\t\tgtk_ptr = pAd->ApCfg.MBSSID[apidx].GTK;\n\t\tpBssid = pAd->ApCfg.MBSSID[apidx].Bssid;\n\n\t\t/* Get Group TxTsc form Asic*/\n\t\tRTMPGetTxTscFromAsic(pAd, apidx, TxTsc);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* Allocate memory for output*/\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n    /* Increment replay counter by 1*/\n\tADD_ONE_To_64BIT_VAR(pEntry->R_Counter);\n\t\t\n\t/* Construct EAPoL message - Group Msg 1*/\n\tConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher, \n\t\t\t\t\t  EAPOL_GROUP_MSG_1,\n\t\t\t\t\t  default_key,\n\t\t\t\t\t  (UCHAR *)gnonce_ptr,\n\t\t\t\t\t  TxTsc,\n\t\t\t\t\t  (UCHAR *)gtk_ptr,\n\t\t\t\t\t  NULL,\n\t\t\t\t\t  0,\n\t\t\t\t  \t  pEapolFrame);\n\n\t/* Make outgoing frame*/\n\tif (pBssid == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pBssid == NULL!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n    MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);            \n    RTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, LENGTH_802_3, \n\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, FALSE);\n\n\tos_free_mem(NULL, mpool);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<=== WPAStart2WayGroupHS : send out Group Message 1 \\n\"));\n        \n    return;\n}\n     \n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess Group key 2-way handshaking\n\n\tArguments:\n\t\tpAd\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tPeerGroupMsg1Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n    UCHAR               Header802_3[14];\n\tUCHAR\t\t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tPEAPOL_PACKET\t\tpGroup;\n\tUINT            \tMsgLen;\n\tUCHAR\t\t\t\tdefault_key = 0;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\tPUINT8\t\t\t\tpCurrentAddr = NULL;\n#ifdef APCLI_SUPPORT\n\tBOOLEAN             Cancelled;\n#endif /* APCLI_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> PeerGroupMsg1Action \\n\"));\n\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\n        return;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tUINT\t\t\t\tIfIndex = 0;\n\t\t\n\t\t\tIfIndex = pEntry->MatchAPCLITabIdx;\n\t\t\tif (IfIndex >= MAX_APCLI_NUM)\n\t\t\t\treturn;\n\n\t\t\tpCurrentAddr = pAd->ApCfg.ApCliTab[IfIndex].CurrentAddress;\n\t\t\tgroup_cipher = pAd->ApCfg.ApCliTab[IfIndex].GroupCipher;\n\t\t\tdefault_key = pAd->ApCfg.ApCliTab[IfIndex].DefaultKeyId;\n\n\t\t}\n#endif /* APCLI_SUPPORT */\t\t\t\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t\t\n\t\tpCurrentAddr = pAd->CurrentAddress;\n\t\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\t\tdefault_key = pAd->StaCfg.DefaultKeyId;\n\t}\t\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pCurrentAddr == NULL)\n\t\treturn;\n\t   \n\t/* Process Group Message 1 frame. skip 802.11 header(24) & LLC_SNAP header(8)*/\n\tpGroup = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n\t/* Sanity Check peer group message 1 - Replay Counter, MIC, RSNIE*/\n\tif (PeerWpaMessageSanity(pAd, pGroup, MsgLen, EAPOL_GROUP_MSG_1, pEntry) == FALSE)\n\t\treturn;\n\n\t/* delete retry timer*/\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n#ifdef APCLI_SUPPORT\t\n\t\t/* Patch issue with gateway AP*/\n\t\t/* In WPA mode, AP doesn't send out message 1 of group-key HS.*/\n\t\t/* So, Supplicant shall maintain a timeout action to disconnect */\n\t\t/* this link.*/\n\t\t/* Todo - Does it need to apply to STA ?*/\n\t\tif (IS_ENTRY_APCLI(pEntry))\t\n\t\t\tRTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\t\n\n\t/* Save Replay counter, it will use to construct message 2*/\n\tNdisMoveMemory(pEntry->R_Counter, pGroup->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\t\n\n\t/* Allocate memory for output*/\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n\n\t/* Construct EAPoL message - Group Msg 2*/\n\tConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_GROUP_MSG_2,  \n\t\t\t\t\t  default_key,\n\t\t\t\t\t  NULL,\t\t\t\t\t/* Nonce not used*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* TxRSC not used*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* GTK not used*/\n\t\t\t\t\t  NULL,\t\t\t\t\t/* RSN IE not used*/\n\t\t\t\t\t  0,\n\t\t\t\t\t  pEapolFrame);\n\t\t\t\t\t\n    /* open 802.1x port control and privacy filter*/\n\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (IS_ENTRY_CLIENT(pEntry))\n#endif /* P2P_SUPPORT */\n\tSTA_PORT_SECURED(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerGroupMsg1Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \\n\",\n\t\t\t\t\t\t\t\t\tGetAuthMode(pEntry->AuthMode),\n\t\t\t\t\t\t\t\t\tGetEncryptType(pEntry->WepStatus),\n\t\t\t\t\t\t\t\t\tGetEncryptType(group_cipher)));\n\t\t\n\t/* init header and Fill Packet and send Msg 2 to authenticator\t*/\n\tMAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);\t\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tif ((pAd->OpMode == OPMODE_STA) && INFRA_ON(pAd) && \n\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&\n\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&\n\t\t(pAd->MlmeAux.Channel == pAd->CommonCfg.Channel)\n#ifdef P2P_SUPPORT\n\t\t&& IS_ENTRY_CLIENT(pEntry)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\t/* Now stop the scanning and need to send the rekey packet out */\n\t\tpAd->MlmeAux.Channel = 0;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, sizeof(Header802_3), \n\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, FALSE);\n\n\tos_free_mem(NULL, mpool);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerGroupMsg1Action: send group message 2\\n\"));\n}\t\n\n\nVOID EnqueueStartForPSKExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n\tMAC_TABLE_ENTRY     *pEntry = (PMAC_TABLE_ENTRY) FunctionContext;\n\n\tif ((pEntry) && IS_ENTRY_CLIENT(pEntry) && (pEntry->WpaState < AS_PTKSTART))\n\t{\n\t\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd;\n\n\t\tswitch (pEntry->EnqueueEapolStartTimerRunning)\n\t\t{\n\t\t\tcase EAPOL_START_PSK:\t\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Enqueue EAPoL-Start-PSK for sta(%02x:%02x:%02x:%02x:%02x:%02x) \\n\", PRINT_MAC(pEntry->Addr)));\n\n\t\t\t\tMlmeEnqueue(pAd, WPA_STATE_MACHINE, MT2_EAPOLStart, 6, &pEntry->Addr, 0);\n\t\t\t\tbreak;\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DOT1X_SUPPORT\n\t\t\tcase EAPOL_START_1X:\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Enqueue EAPoL-Start-1X for sta(%02x:%02x:%02x:%02x:%02x:%02x) \\n\", PRINT_MAC(pEntry->Addr)));\n\n\t\t\t\tDOT1X_EapTriggerAction(pAd, pEntry);\n\t\t\t\tbreak;\n#endif /* DOT1X_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t\n\t\t}\n\t}\t\t\t\n\t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;\n\t\t\n}\n\n\nVOID MlmeDeAuthAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n\tIN USHORT           Reason,\n\tIN BOOLEAN          bDataFrameFirst)\n{\n    PUCHAR          pOutBuffer = NULL;\n    ULONG           FrameLen = 0;\n    HEADER_802_11   DeAuthHdr;\n    NDIS_STATUS     NStatus;\n\n    if (pEntry)\n    {\n        /* Send out a Deauthentication request frame*/\n        NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n        if (NStatus != NDIS_STATUS_SUCCESS)\n            return;\n\n\t\t/* send wireless event - for send disassication */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n        DBGPRINT(RT_DEBUG_TRACE, (\"Send DEAUTH frame with ReasonCode(%d) to %02x:%02x:%02x:%02x:%02x:%02x \\n\",Reason, PRINT_MAC(pEntry->Addr)));\n\n#ifdef P2P_SUPPORT\n\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr, pEntry->HdrAddr2, pEntry->HdrAddr3);\n#else\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n        MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr, pAd->CommonCfg.Bssid);\t\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT        \n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\t\n        MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].Bssid);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* P2P_SUPPORT */\n        MakeOutgoingFrame(pOutBuffer,               &FrameLen, \n                          sizeof(HEADER_802_11),    &DeAuthHdr,\n                          2,                        &Reason,\n                          END_OF_ARGS);\n\n\n\n\t\tif (bDataFrameFirst)\n            MiniportMMRequest(pAd, MGMT_USE_QUEUE_FLAG, pOutBuffer, FrameLen);\n        else\n            MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n        MlmeFreeMemory(pAd, pOutBuffer);\n    \n        /* ApLogEvent(pAd, pEntry->Addr, EVENT_DISASSOCIATED);*/\n        MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n    }\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        When receiving the last packet of 2-way groupkey handshake.\n    Return:\n    ==========================================================================\n*/\nVOID PeerGroupMsg2Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN VOID             *Msg,\n    IN UINT             MsgLen) \n{\n    UINT            \tLen;\n    PUCHAR          \tpData;\n    BOOLEAN         \tCancelled;\n\tPEAPOL_PACKET       pMsg2;\t\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> PeerGroupMsg2Action \\n\"));\n\n    if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n        return;\n            \n    if (MsgLen < (LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n        return;\n            \n    if (pEntry->WpaState != AS_PTKINITDONE)\n        return;\n\n\n    do\n    {\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUCHAR\tapidx = 0;\n\t\t\n\t\t\tif (pEntry->apidx >= pAd->ApCfg.BssidNum)\n\t\t\t\treturn;\n\t\t    else\n\t\t\t\tapidx = pEntry->apidx;\t\n\n\t\t\tgroup_cipher = pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus;\t\t\t\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n        \n        pData = (PUCHAR)Msg;\n\t\tpMsg2 = (PEAPOL_PACKET) (pData + LENGTH_802_1_H);\n        Len = MsgLen - LENGTH_802_1_H;\n\n\t\t/* Sanity Check peer group message 2 - Replay Counter, MIC*/\n\t\tif (PeerWpaMessageSanity(pAd, pMsg2, Len, EAPOL_GROUP_MSG_2, pEntry) == FALSE)\n            break;\n\n        /* 3.  upgrade state*/\n\n\t\tRTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n        pEntry->GTKState = REKEY_ESTABLISHED;\n        \n\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t{\n\t\t\t/* send wireless event - for set key done WPA2*/\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"AP SETKEYS DONE - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\\n\\n\", \n\t\t\t\t\t\t\t\t\t\tpEntry->AuthMode, GetAuthMode(pEntry->AuthMode), \n\t\t\t\t\t\t\t\t\t\tpEntry->WepStatus, GetEncryptType(pEntry->WepStatus), \n\t\t\t\t\t\t\t\t\t\tgroup_cipher, GetEncryptType(group_cipher)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* send wireless event - for set key done WPA*/\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA1_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n        \tDBGPRINT(RT_DEBUG_OFF, (\"AP SETKEYS DONE - WPA1, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\\n\\n\", \n\t\t\t\t\t\t\t\t\t\tpEntry->AuthMode, GetAuthMode(pEntry->AuthMode), \n\t\t\t\t\t\t\t\t\t\tpEntry->WepStatus, GetEncryptType(pEntry->WepStatus), \n\t\t\t\t\t\t\t\t\t\tgroup_cipher, GetEncryptType(group_cipher)));\n\t\t}\t\n    }while(FALSE);  \n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tClassify WPA EAP message type\n\n\tArguments:\n\t\tEAPType\t\tValue of EAP message type\n\t\tMsgType\t\tInternal Message definition for MLME state machine\n\t\t\n\tReturn Value:\n\t\tTRUE\t\tFound appropriate message type\n\t\tFALSE\t\tNo appropriate message type\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tAll these constants are defined in wpa_cmm.h\n\t\tFor supplicant, there is only EAPOL Key message avaliable\n\t\t\n\t========================================================================\n*/\nBOOLEAN\tWpaMsgTypeSubst(\n\tIN\tUCHAR\tEAPType,\n\tOUT\tINT\t\t*MsgType)\t\n{\n\tswitch (EAPType)\n\t{\n\t\tcase EAPPacket:\n\t\t\t*MsgType = MT2_EAPPacket;\n\t\t\tbreak;\n\t\tcase EAPOLStart:\n\t\t\t*MsgType = MT2_EAPOLStart;\n\t\t\tbreak;\n\t\tcase EAPOLLogoff:\n\t\t\t*MsgType = MT2_EAPOLLogoff;\n\t\t\tbreak;\n\t\tcase EAPOLKey:\n\t\t\t*MsgType = MT2_EAPOLKey;\n\t\t\tbreak;\n\t\tcase EAPOLASFAlert:\n\t\t\t*MsgType = MT2_EAPOLASFAlert;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn FALSE;\t\t\n\t}\t\n\treturn TRUE;\n}\n\n/**\n * inc_iv_byte - Increment arbitrary length byte array\n * @counter: Pointer to byte array\n * @len: Length of the counter in bytes\n *\n * This function increments the least byte of the counter by one and continues\n * rolling over to more significant bytes if the byte was incremented from\n * 0xff to 0x00.\n */\nvoid inc_iv_byte(UCHAR *iv, UINT len, UINT cnt)\n{\n\tint \tpos = 0;\n\tint \tcarry = 0;\n\tUCHAR\tpre_iv;\n\n\twhile (pos < len)\n\t{\n\t\tpre_iv = iv[pos];\n\t\n\t\tif (carry == 1)\n\t\t\tiv[pos] ++;\n\t\telse\n\t\t\tiv[pos] += cnt;\n\t\t\n\t\tif (iv[pos] > pre_iv)\n\t\t\tbreak;\t\n\t\t\n\t\tcarry = 1;\n\t\tpos++;\n\t}\n\n\tif (pos >= len)\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"!!! inc_iv_byte overflow !!!\\n\"));\t\n}\n\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tThe pseudo-random function(PRF) that hashes various inputs to \n\t\tderive a pseudo-random value. To add liveness to the pseudo-random \n\t\tvalue, a nonce should be one of the inputs.\n\n\t\tIt is used to generate PTK, GTK or some specific random value.  \n\n\tArguments:\n\t\tUCHAR\t*key,\t\t-\tthe key material for HMAC_SHA1 use\n\t\tINT\t\tkey_len\t\t-\tthe length of key\n\t\tUCHAR\t*prefix\t\t-\ta prefix label\n\t\tINT\t\tprefix_len\t-\tthe length of the label\n\t\tUCHAR\t*data\t\t-\ta specific data with variable length\t\t\n\t\tINT\t\tdata_len\t-\tthe length of a specific data\t\n\t\tINT\t\tlen\t\t\t-\tthe output lenght\n\n\tReturn Value:\n\t\tUCHAR\t*output\t\t-\tthe calculated result \n\n\tNote:\n\t\t802.11i-2004\tAnnex H.3\n\n\t========================================================================\n*/\nVOID\tPRF(\n\tIN\tUCHAR\t*key,\n\tIN\tINT\t\tkey_len,\n\tIN\tUCHAR\t*prefix,\n\tIN\tINT\t\tprefix_len,\n\tIN\tUCHAR\t*data,\n\tIN\tINT\t\tdata_len,\n\tOUT\tUCHAR\t*output,\n\tIN\tINT\t\tlen)\n{\n\tINT\t\ti;\n    UCHAR   *input;\n\tINT\t\tcurrentindex = 0;\n\tINT\t\ttotal_len;\n\n\t/* Allocate memory for input*/\n\tos_alloc_mem(NULL, (PUCHAR *)&input, 1024);\n\t\n    if (input == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!PRF: no memory!!!\\n\"));\n        return;\n    }\n\t\n\t/* Generate concatenation input*/\n\tNdisMoveMemory(input, prefix, prefix_len);\n\n\t/* Concatenate a single octet containing 0*/\n\tinput[prefix_len] =\t0;\n\n\t/* Concatenate specific data*/\n\tNdisMoveMemory(&input[prefix_len + 1], data, data_len);\n\ttotal_len =\tprefix_len + 1 + data_len;\n\n\t/* Concatenate a single octet containing 0*/\n\t/* This octet shall be update later*/\n\tinput[total_len] = 0;\n\ttotal_len++;\n\n\t/* Iterate to calculate the result by hmac-sha-1*/\n\t/* Then concatenate to last result*/\n\tfor\t(i = 0;\ti <\t(len + 19) / 20; i++)\n\t{\n\t\tRT_HMAC_SHA1(key, key_len, input, total_len, &output[currentindex], SHA1_DIGEST_SIZE);\n\t\tcurrentindex +=\t20;\n\n\t\t/* update the last octet */\n\t\tinput[total_len - 1]++;\n\t}\t\n    os_free_mem(NULL, input);\n}\n\n/*\n* F(P, S, c, i) = U1 xor U2 xor ... Uc \n* U1 = PRF(P, S || Int(i)) \n* U2 = PRF(P, U1) \n* Uc = PRF(P, Uc-1) \n*/ \n\nstatic void F(char *password, unsigned char *ssid, int ssidlength, int iterations, int count, unsigned char *output) \n{ \n    unsigned char digest[36], digest1[SHA1_DIGEST_SIZE]; \n    int i, j, len; \n\t\n\tlen = strlen(password);\n\t\t\n    /* U1 = PRF(P, S || int(i)) */ \n    memcpy(digest, ssid, ssidlength); \n    digest[ssidlength] = (unsigned char)((count>>24) & 0xff); \n    digest[ssidlength+1] = (unsigned char)((count>>16) & 0xff); \n    digest[ssidlength+2] = (unsigned char)((count>>8) & 0xff); \n    digest[ssidlength+3] = (unsigned char)(count & 0xff); \n    RT_HMAC_SHA1((unsigned char*) password, len, digest, ssidlength+4, digest1, SHA1_DIGEST_SIZE); /* for WPA update*/\n\n    /* output = U1 */ \n    memcpy(output, digest1, SHA1_DIGEST_SIZE); \n    for (i = 1; i < iterations; i++) \n    {\n        /* Un = PRF(P, Un-1) */ \n        RT_HMAC_SHA1((unsigned char*) password, len, digest1, SHA1_DIGEST_SIZE, digest, SHA1_DIGEST_SIZE); /* for WPA update*/\n        memcpy(digest1, digest, SHA1_DIGEST_SIZE); \n\n        /* output = output xor Un */ \n        for (j = 0; j < SHA1_DIGEST_SIZE; j++) \n        { \n            output[j] ^= digest[j]; \n        } \n    } \n}\n\n/* \n* password - ascii string up to 63 characters in length \n* ssid - octet string up to 32 octets \n* ssidlength - length of ssid in octets \n* output must be 40 octets in length and outputs 256 bits of key \n*/ \nint RtmpPasswordHash(PSTRING password, PUCHAR ssid, INT ssidlength, PUCHAR output) \n{ \n    if ((strlen(password) > 63) || (ssidlength > 32))\n        return 0; \n\n    F(password, ssid, ssidlength, 4096, 1, output); \n    F(password, ssid, ssidlength, 4096, 2, &output[SHA1_DIGEST_SIZE]); \n    return 1; \n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tThe key derivation function(KDF) is defined in IEEE 802.11r/D9.0, 8.5.1.5.2\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\tOutput  KDF-Length (K, label, Context) where\n\t\tInput:    K, a 256-bit key derivation key\n\t\t\t\t  label, a string identifying the purpose of the keys derived using this KDF\n\t\t\t\t  Context, a bit string that provides context to identify the derived key\n\t\t\t\t  Length, the length of the derived key in bits\n\t\tOutput: a Length-bit derived key\n\n\t\tresult  \"\"\n\t\titerations  (Length+255)/256 \n\t\tdo i = 1 to iterations\n\t\t\tresult  result || HMAC-SHA256(K, i || label || Context || Length)\n\t\tod\n\t\treturn first Length bits of result, and securely delete all unused bits\n\n\t\tIn this algorithm, i and Length are encoded as 16-bit unsigned integers.\n\n\t========================================================================\n*/\nVOID\tKDF(\n\tIN\tPUINT8\tkey,\n\tIN\tINT\t\tkey_len,\n\tIN\tPUINT8\tlabel,\n\tIN\tINT\t\tlabel_len,\n\tIN\tPUINT8\tdata,\n\tIN\tINT\t\tdata_len,\n\tOUT\tPUINT8\toutput,\n\tIN\tUSHORT\tlen)\n{\n\tUSHORT\ti;\n    UCHAR   *input;\n\tINT\t\tcurrentindex = 0;\n\tINT\t\ttotal_len;\n\tUINT\tlen_in_bits = (len << 3);\n\n\tos_alloc_mem(NULL, (PUCHAR *)&input, 1024);\n\t\n\tif (input == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!!KDF: no memory!!!\\n\"));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(input, 1024);\n\t\n\t/* Initial concatenated value (i || label || Context || Length)*/\n\t/* concatenate 16-bit unsigned integer, its initial value is 1.\t*/\n\tinput[0] = 1;\n\tinput[1] = 0;\t\n\ttotal_len = 2;\n\n\t/* concatenate a prefix string*/\n\tNdisMoveMemory(&input[total_len], label, label_len);\n\ttotal_len += label_len;\n\n\t/* concatenate the context*/\n\tNdisMoveMemory(&input[total_len], data, data_len);\n\ttotal_len += data_len;\n\n\t/* concatenate the length in bits (16-bit unsigned integer)*/\n\tinput[total_len] = (len_in_bits & 0xFF);\n\tinput[total_len + 1] = (len_in_bits & 0xFF00) >> 8;\t\n\ttotal_len += 2;\n\t \n\tfor\t(i = 1;\ti <= ((len_in_bits + 255) / 256); i++)\n\t{\n\t\t/* HMAC-SHA256 derives output */\n\t\tRT_HMAC_SHA256((UCHAR *)key, key_len, input, total_len, (UCHAR *)&output[currentindex], 32);\t\t\n\n\t\tcurrentindex +=\t32; /* next concatenation location*/\n\t\tinput[0]++;\t\t\t/* increment octet count*/\n\n\t}\t\t\t\n    os_free_mem(NULL, input);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPDerivePMKID(\n\tIN\tPUINT8\t\t\tpAaddr,\n\tIN\tPUINT8\t\t\tpSpaddr,\n\tIN\tPUINT8\t\t\tpKey,\n\tIN\tPUINT8\t\t\tpAkm_oui,\n\tOUT\tPUINT8\t\t\tpPMKID)\n{\n\tUCHAR\tdigest[80], text_buf[20];\n\tUINT8\ttext_len;\n\t\t\t\n\t/* Concatenate the text for PMKID calculation*/\n\tNdisMoveMemory(&text_buf[0], \"PMK Name\", 8);\t\n\tNdisMoveMemory(&text_buf[8], pAaddr, MAC_ADDR_LEN);\n\tNdisMoveMemory(&text_buf[14], pSpaddr, MAC_ADDR_LEN);\n\ttext_len = 20;\n\n\t{\n\t\tRT_HMAC_SHA1(pKey, PMK_LEN, text_buf, text_len, digest, SHA1_DIGEST_SIZE);\n\t}\n\n\t/* Truncate the first 128-bit of output result */\n\tNdisMoveMemory(pPMKID, digest, LEN_PMKID);\n\n}\n\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tIt utilizes PRF-384 or PRF-512 to derive session-specific keys from a PMK.\n\t\tIt shall be called by 4-way handshake processing.\n\n\tArguments:\n\t\tpAd \t-\tpointer to our pAdapter context\n\t\tPMK\t\t-\tpointer to PMK\n\t\tANonce\t-\tpointer to ANonce\n\t\tAA\t\t-\tpointer to Authenticator Address\n\t\tSNonce\t-\tpointer to SNonce\n\t\tSA\t\t-\tpointer to Supplicant Address\t\t\n\t\tlen\t\t-\tindicate the length of PTK (octet)\t\t\n\t\t\n\tReturn Value:\n\t\tOutput\t\tpointer to the PTK\n\n\tNote:\n\t\tRefer to IEEE 802.11i-2004 8.5.1.2\n\t\t\n\t========================================================================\n*/\nVOID WpaDerivePTK(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUCHAR\t*PMK,\n\tIN\tUCHAR\t*ANonce,\n\tIN\tUCHAR\t*AA,\n\tIN\tUCHAR\t*SNonce,\n\tIN\tUCHAR\t*SA,\n\tOUT\tUCHAR\t*output,\n\tIN\tUINT\tlen)\n{\t\n\tUCHAR\tconcatenation[76];\n\tUINT\tCurrPos = 0;\n\tUCHAR\ttemp[32];\n\tUCHAR\tPrefix[] = {'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', ' ', 'k', 'e', 'y', ' ', \n\t\t\t\t\t\t'e', 'x', 'p', 'a', 'n', 's', 'i', 'o', 'n'};\n\n\t/* initiate the concatenation input*/\n\tNdisZeroMemory(temp, sizeof(temp));\n\tNdisZeroMemory(concatenation, 76);\n\n\t/* Get smaller address*/\n\tif (RTMPCompareMemory(SA, AA, 6) == 1)\n\t\tNdisMoveMemory(concatenation, AA, 6);\n\telse\n\t\tNdisMoveMemory(concatenation, SA, 6);\n\tCurrPos += 6;\n\n\t/* Get larger address*/\n\tif (RTMPCompareMemory(SA, AA, 6) == 1)\n\t\tNdisMoveMemory(&concatenation[CurrPos], SA, 6);\n\telse\n\t\tNdisMoveMemory(&concatenation[CurrPos], AA, 6);\n\t\t\n\t/* store the larger mac address for backward compatible of */\n\t/* ralink proprietary STA-key issue\t\t*/\n\tNdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN);\t\t\n\tCurrPos += 6;\n\n\t/* Get smaller Nonce*/\n\tif (RTMPCompareMemory(ANonce, SNonce, 32) == 0)\n\t\tNdisMoveMemory(&concatenation[CurrPos], temp, 32);\t/* patch for ralink proprietary STA-key issue*/\n\telse if (RTMPCompareMemory(ANonce, SNonce, 32) == 1)\n\t\tNdisMoveMemory(&concatenation[CurrPos], SNonce, 32);\n\telse\n\t\tNdisMoveMemory(&concatenation[CurrPos], ANonce, 32);\n\tCurrPos += 32;\n\n\t/* Get larger Nonce*/\n\tif (RTMPCompareMemory(ANonce, SNonce, 32) == 0)\n\t\tNdisMoveMemory(&concatenation[CurrPos], temp, 32);\t/* patch for ralink proprietary STA-key issue*/\n\telse if (RTMPCompareMemory(ANonce, SNonce, 32) == 1)\n\t\tNdisMoveMemory(&concatenation[CurrPos], ANonce, 32);\n\telse\n\t\tNdisMoveMemory(&concatenation[CurrPos], SNonce, 32);\n\tCurrPos += 32;\n\n\thex_dump(\"PMK\", PMK, LEN_PMK);\n\thex_dump(\"concatenation=\", concatenation, 76);\n\n\t/* Use PRF to generate PTK*/\n\tPRF(PMK, LEN_PMK, Prefix, 22, concatenation, 76, output, len);\n\n}\n\nVOID WpaDeriveGTK(\n    IN  UCHAR   *GMK,\n    IN  UCHAR   *GNonce,\n    IN  UCHAR   *AA,\n    OUT UCHAR   *output,\n    IN  UINT    len)\n{\n    UCHAR   concatenation[76];\n    UINT    CurrPos=0;\n    UCHAR   Prefix[19];\n    UCHAR   temp[80];   \n\n    NdisMoveMemory(&concatenation[CurrPos], AA, 6);\n    CurrPos += 6;\n\n    NdisMoveMemory(&concatenation[CurrPos], GNonce , 32);\n    CurrPos += 32;\n\n    Prefix[0] = 'G';\n    Prefix[1] = 'r';\n    Prefix[2] = 'o';\n    Prefix[3] = 'u';\n    Prefix[4] = 'p';\n    Prefix[5] = ' ';\n    Prefix[6] = 'k';\n    Prefix[7] = 'e';\n    Prefix[8] = 'y';\n    Prefix[9] = ' ';\n    Prefix[10] = 'e';\n    Prefix[11] = 'x';\n    Prefix[12] = 'p';\n    Prefix[13] = 'a';\n    Prefix[14] = 'n';\n    Prefix[15] = 's';\n    Prefix[16] = 'i';\n    Prefix[17] = 'o';\n    Prefix[18] = 'n';\n\n    PRF(GMK, PMK_LEN, Prefix,  19, concatenation, 38 , temp, len);\n    NdisMoveMemory(output, temp, len);\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tGenerate random number by software.\n\n\tArguments:\n\t\tpAd\t\t-\tpointer to our pAdapter context \n\t\tmacAddr\t-\tpointer to local MAC address\n\t\t\n\tReturn Value:\n\n\tNote:\n\t\t802.1ii-2004  Annex H.5\n\t\t\n\t========================================================================\n*/\nVOID\tGenRandom(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUCHAR\t\t\t*macAddr,\n\tOUT\tUCHAR\t\t\t*random)\n{\t\n\tINT\t\ti, curr;\n\tUCHAR\tlocal[80], KeyCounter[32];\n\tUCHAR\tresult[80];\n\tULONG\tCurrentTime;\n\tUCHAR\tprefix[] = {'I', 'n', 'i', 't', ' ', 'C', 'o', 'u', 'n', 't', 'e', 'r'};\n\n\t/* Zero the related information*/\n\tNdisZeroMemory(result, 80);\n\tNdisZeroMemory(local, 80);\n\tNdisZeroMemory(KeyCounter, 32);\t\n\n\tfor\t(i = 0;\ti <\t32;\ti++)\n\t{\t\t\n\t\t/* copy the local MAC address*/\n\t\tCOPY_MAC_ADDR(local, macAddr);\n\t\tcurr =\tMAC_ADDR_LEN;\n\n\t\t/* concatenate the current time*/\n\t\tNdisGetSystemUpTime(&CurrentTime);\n\t\tNdisMoveMemory(&local[curr],  &CurrentTime,\tsizeof(CurrentTime));\n\t\tcurr +=\tsizeof(CurrentTime);\n\n\t\t/* concatenate the last result*/\n\t\tNdisMoveMemory(&local[curr],  result, 32);\n\t\tcurr +=\t32;\n\t\t\n\t\t/* concatenate a variable */\n\t\tNdisMoveMemory(&local[curr],  &i,  2);\t\t\n\t\tcurr +=\t2;\n\n\t\t/* calculate the result*/\n\t\tPRF(KeyCounter, 32, prefix,12, local, curr, result, 32); \n\t}\n\t\n\tNdisMoveMemory(random, result,\t32);\t\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild cipher suite in RSN-IE. \n\t\tIt only shall be called by RTMPMakeRSNIE. \n\n\tArguments:\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n    \tElementID\t-\tindicate the WPA1 or WPA2\n    \tWepStatus\t-\tindicate the encryption type\n\t\tbMixCipher\t-\ta boolean to indicate the pairwise cipher and group \n\t\t\t\t\t\tcipher are the same or not\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nstatic VOID RTMPMakeRsnIeCipher(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUCHAR\t\t\tElementID,\t\n\tIN\tUINT\t\t\tWepStatus,\n\tIN\tUCHAR\t\t\tapidx,\n\tIN\tBOOLEAN\t\t\tbMixCipher,\n\tIN\tUCHAR\t\t\tFlexibleCipher,\n\tOUT\tPUCHAR\t\t\tpRsnIe,\n\tOUT\tUCHAR\t\t\t*rsn_len)\n{\t\t\n\tUCHAR\tPairwiseCnt;\n\n\t*rsn_len = 0;\n\n\t/* decide WPA2 or WPA1\t*/\n\tif (ElementID == Wpa2Ie)\n\t{\n\t\tRSNIE2\t*pRsnie_cipher = (RSNIE2*)pRsnIe;\n\n\t\t/* Assign the verson as 1*/\n\t\tpRsnie_cipher->version = 1;\n\n        switch (WepStatus)\n        {\n        \t/* TKIP mode*/\n            case Ndis802_11Encryption2Enabled:\n                NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);\n                pRsnie_cipher->ucount = 1;\n                NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4);\n                *rsn_len = sizeof(RSNIE2);\n                break;\n\n\t\t\t/* AES mode*/\n            case Ndis802_11Encryption3Enabled:\n\t\t\t\tif (bMixCipher)\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);\n\t\t\t\telse\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_CCMP, 4);\t\t\t\t\t\t\t\t\n                pRsnie_cipher->ucount = 1;\n                NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4);\n                *rsn_len = sizeof(RSNIE2);\n                break;\n\n\t\t\t/* TKIP-AES mix mode*/\n            case Ndis802_11Encryption4Enabled:\n                NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);\n\n\t\t\t\tPairwiseCnt = 1;\n\t\t\t\t/* Insert WPA2 TKIP as the first pairwise cipher */\n\t\t\t\tif (MIX_CIPHER_WPA2_TKIP_ON(FlexibleCipher))\n\t\t\t\t{\n                \tNdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4);\n\t\t\t\t\t/* Insert WPA2 AES as the secondary pairwise cipher*/\n\t\t\t\t\tif (MIX_CIPHER_WPA2_AES_ON(FlexibleCipher))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pRsnIe + sizeof(RSNIE2), OUI_WPA2_CCMP, 4);\n\t\t\t\t\t\tPairwiseCnt = 2;\n\t\t\t\t\t}\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* Insert WPA2 AES as the first pairwise cipher */\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4);\t\n\t\t\t\t}\n\t\t\t\t\t\t\t\n                pRsnie_cipher->ucount = PairwiseCnt;\t\t\t\t\n                *rsn_len = sizeof(RSNIE2) + (4 * (PairwiseCnt - 1));\n                break;\t\t\t\n        }   \n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t(pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&\n\t\t\t(pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled)\n#ifdef P2P_SUPPORT\n\t\t\t&& (apidx == BSS0)\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\tUINT\tGroupCipher = pAd->StaCfg.GroupCipher;\n\t\t\tswitch(GroupCipher)\n\t\t\t{\n\t\t\t\tcase Ndis802_11GroupWEP40Enabled:\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP40, 4);\n\t\t\t\t\tbreak;\n\t\t\t\tcase Ndis802_11GroupWEP104Enabled:\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP104, 4);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/* swap for big-endian platform*/\n\t\tpRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);\n\t    pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);\n\t}\n\telse\n\t{\n\t\tRSNIE\t*pRsnie_cipher = (RSNIE*)pRsnIe;\n\n\t\t/* Assign OUI and version*/\n\t\tNdisMoveMemory(pRsnie_cipher->oui, OUI_WPA_VERSION, 4);\n        pRsnie_cipher->version = 1;\n\n\t\tswitch (WepStatus)\n\t\t{\n\t\t\t/* TKIP mode*/\n            case Ndis802_11Encryption2Enabled:\n                NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);\n                pRsnie_cipher->ucount = 1;\n                NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4);\n                *rsn_len = sizeof(RSNIE);\n                break;\n\n\t\t\t/* AES mode*/\n            case Ndis802_11Encryption3Enabled:\t\t\t\t\n\t\t\t\tif (bMixCipher)\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);\n\t\t\t\telse\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_CCMP, 4);\t\t\t\n                pRsnie_cipher->ucount = 1;\n                NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4);\n                *rsn_len = sizeof(RSNIE);\n                break;\n\n\t\t\t/* TKIP-AES mix mode*/\n            case Ndis802_11Encryption4Enabled:\n                NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);\n\n\t\t\t\tPairwiseCnt = 1;\n\t\t\t\t/* Insert WPA TKIP as the first pairwise cipher */\n\t\t\t\tif (MIX_CIPHER_WPA_TKIP_ON(FlexibleCipher))\n\t\t\t\t{\n                \tNdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4);\n\t\t\t\t\t/* Insert WPA AES as the secondary pairwise cipher*/\n\t\t\t\t\tif (MIX_CIPHER_WPA_AES_ON(FlexibleCipher))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pRsnIe + sizeof(RSNIE), OUI_WPA_CCMP, 4);\n\t\t\t\t\t\tPairwiseCnt = 2;\n\t\t\t\t\t}\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* Insert WPA AES as the first pairwise cipher */\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4);\t\n\t\t\t\t}\n\t\t\t\t\t\t\n                pRsnie_cipher->ucount = PairwiseCnt;\t\t\t\t\n                *rsn_len = sizeof(RSNIE) + (4 * (PairwiseCnt - 1));\t\t\t\t\n                break;\t\t\t\t\t\n        }\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t(pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&\n\t\t\t(pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled)\n#ifdef P2P_SUPPORT\n\t\t\t&& (apidx == BSS0)\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\tUINT\tGroupCipher = pAd->StaCfg.GroupCipher;\n\t\t\tswitch(GroupCipher)\n\t\t\t{\n\t\t\t\tcase Ndis802_11GroupWEP40Enabled:\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP40, 4);\n\t\t\t\t\tbreak;\n\t\t\t\tcase Ndis802_11GroupWEP104Enabled:\n\t\t\t\t\tNdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP104, 4);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/* swap for big-endian platform*/\n\t\tpRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);\n\t    pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);\n\t}\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild AKM suite in RSN-IE. \n\t\tIt only shall be called by RTMPMakeRSNIE. \n\n\tArguments:\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n    \tElementID\t-\tindicate the WPA1 or WPA2\n    \tAuthMode\t-\tindicate the authentication mode\n\t\tapidx\t\t-\tindicate the interface index\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nstatic VOID RTMPMakeRsnIeAKM(\t\n\tIN  PRTMP_ADAPTER   pAd,\t\n\tIN\tUCHAR\t\t\tElementID,\t\n\tIN\tUINT\t\t\tAuthMode,\n\tIN\tUCHAR\t\t\tapidx,\n\tOUT\tPUCHAR\t\t\tpRsnIe,\n\tOUT\tUCHAR\t\t\t*rsn_len)\n{\n\tRSNIE_AUTH\t\t*pRsnie_auth;\t\n\tUCHAR\t\t\tAkmCnt = 1;\t\t/* default as 1*/\n\n\tpRsnie_auth = (RSNIE_AUTH*)(pRsnIe + (*rsn_len));\n\n\t/* decide WPA2 or WPA1\t */\n\tif (ElementID == Wpa2Ie)\n\t{\n\n\t\tswitch (AuthMode)\n        {\n            case Ndis802_11AuthModeWPA2:\n            case Ndis802_11AuthModeWPA1WPA2:\n                \tNdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_8021X_AKM, 4);\n\n                break;\n\n            case Ndis802_11AuthModeWPA2PSK:\n            case Ndis802_11AuthModeWPA1PSKWPA2PSK:\n                \tNdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_PSK_AKM, 4);\n\n                break;\n\t\t\tdefault:\n\t\t\t\tAkmCnt = 0;\n\t\t\t\tbreak;\n\t\t\t\t\n        }\n\t}\n\telse\n\t{\n\t\tswitch (AuthMode)\n        {\n            case Ndis802_11AuthModeWPA:\n            case Ndis802_11AuthModeWPA1WPA2:\n                NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_8021X_AKM, 4);\n                break;\n\n            case Ndis802_11AuthModeWPAPSK:\n            case Ndis802_11AuthModeWPA1PSKWPA2PSK:\n                NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_PSK_AKM, 4);\n                break;\n\n\t\t\tcase Ndis802_11AuthModeWPANone:\n                NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_NONE_AKM, 4);\n                break;\n\t\t\tdefault:\n\t\t\t\tAkmCnt = 0;\n\t\t\t\tbreak;\t\n        }\t\t\t\n\t}\n\t\t \n\tpRsnie_auth->acount = AkmCnt;\n\tpRsnie_auth->acount = cpu2le16(pRsnie_auth->acount);\n\t\n\t/* update current RSNIE length*/\n\t(*rsn_len) += (sizeof(RSNIE_AUTH) + (4 * (AkmCnt - 1)));\t\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild capability in RSN-IE. \n\t\tIt only shall be called by RTMPMakeRSNIE. \n\n\tArguments:\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n    \tElementID\t-\tindicate the WPA1 or WPA2    \t\n\t\tapidx\t\t-\tindicate the interface index\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nstatic VOID RTMPMakeRsnIeCap(\t\n\tIN  PRTMP_ADAPTER   pAd,\t\n\tIN\tUCHAR\t\t\tElementID,\n\tIN\tUCHAR\t\t\tapidx,\n\tOUT\tPUCHAR\t\t\tpRsnIe,\n\tOUT\tUCHAR\t\t\t*rsn_len)\n{\n\tRSN_CAPABILITIES    *pRSN_Cap;\n\n\t/* it could be ignored in WPA1 mode*/\n\tif (ElementID == WpaIe)\n\t\treturn;\n\t\n\tpRSN_Cap = (RSN_CAPABILITIES*)(pRsnIe + (*rsn_len));\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tif (apidx < pAd->ApCfg.BssidNum)\t\t\n\t\t{\n\t\t\tPMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[apidx];\n\n#ifdef DOT1X_SUPPORT\n        \tpRSN_Cap->field.PreAuth = (pMbss->PreAuth == TRUE) ? 1 : 0;\n#endif /* DOT1X_SUPPORT */\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\t\t\t        \n\n#ifdef CONFIG_STA_SUPPORT\n\n#ifdef P2P_SUPPORT\n\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t{\n\t\tPMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n\n#ifdef DOT1X_SUPPORT\n        pRSN_Cap->field.PreAuth = (pMbss->PreAuth == TRUE) ? 1 : 0;\n#endif /* DOT1X_SUPPORT */\n\t}\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\t\t\t      \n\t\t\t\t\t \n\tpRSN_Cap->word = cpu2le16(pRSN_Cap->word);\n\t\n\t(*rsn_len) += sizeof(RSN_CAPABILITIES);\t/* update current RSNIE length*/\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild PMKID in RSN-IE. \n\t\tIt only shall be called by RTMPMakeRSNIE. \n\n\tArguments:\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n    \tElementID\t-\tindicate the WPA1 or WPA2    \t\n\t\tapidx\t\t-\tindicate the interface index\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tBuild RSN IE context. It is not included element-ID and length.\n\n\tArguments:\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n    \tAuthMode\t-\tindicate the authentication mode\n    \tWepStatus\t-\tindicate the encryption type\n\t\tapidx\t\t-\tindicate the interface index\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPMakeRSNIE(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  UINT            AuthMode,\n    IN  UINT            WepStatus,\n\tIN\tUCHAR\t\t\tapidx)\n{\n\tPUCHAR\t\tpRsnIe = NULL;\t\t\t/* primary RSNIE*/\n\tUCHAR \t\t*rsnielen_cur_p = 0;\t/* the length of the primary RSNIE \t\t*/\n#ifdef CONFIG_AP_SUPPORT\n\tPUCHAR\t\tpRsnIe_ex = NULL;\t\t/* secondary RSNIE, it's ONLY used in WPA-mix mode */\n\tBOOLEAN               bMixRsnIe = FALSE;      /* indicate WPA-mix mode is on or off*/\n\tUCHAR\t\ts_offset;\n#endif /* CONFIG_AP_SUPPORT */\n\tUCHAR\t\t*rsnielen_ex_cur_p = 0;\t/* the length of the secondary RSNIE\t  \t*/\n\tUCHAR\t\tPrimaryRsnie;\t\t\t\n\tBOOLEAN\t\tbMixCipher = FALSE;\t/* indicate the pairwise and group cipher are different*/\n\tUCHAR\t\tp_offset;\t\t\n\tWPA_MIX_PAIR_CIPHER\t\tFlexibleCipher = MIX_CIPHER_NOTUSE;\t/* it provide the more flexible cipher combination in WPA-WPA2 and TKIPAES mode*/\n\t\t\n\trsnielen_cur_p = NULL;\n\trsnielen_ex_cur_p = NULL;\n\n\tdo\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\n\t\t\tif ((AuthMode != Ndis802_11AuthModeWPA) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPAPSK) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA2) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA2PSK) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA1WPA2) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA1PSKWPA2PSK)\n#ifdef WAPI_SUPPORT\n\t\t\t\t&& (AuthMode != Ndis802_11AuthModeWAICERT)\n\t\t\t\t&& (AuthMode != Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"==> RTMPMakeRSNIE(p2p%d)\\n\", MAIN_MBSSID));\n\n\t\t\t/* decide the group key encryption type */\n\t\t\tif (WepStatus == Ndis802_11Encryption4Enabled)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\n\t\t\t\tFlexibleCipher = pAd->ApCfg.MBSSID[MAIN_MBSSID].WpaMixPairCipher;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].GroupKeyWepStatus = WepStatus;\n\n\t\t\t/* Initiate some related information */\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].RSNIE_Len[0] = 0;\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].RSNIE_Len[1] = 0;\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[MAIN_MBSSID].RSN_IE[0], MAX_LEN_OF_RSNIE);\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[MAIN_MBSSID].RSN_IE[1], MAX_LEN_OF_RSNIE);\n\n\t\t\t/* Pointer to the first RSNIE context */\n\t\t\trsnielen_cur_p = &pAd->ApCfg.MBSSID[MAIN_MBSSID].RSNIE_Len[0];\n\t\t\tpRsnIe = pAd->ApCfg.MBSSID[MAIN_MBSSID].RSN_IE[0];\n\n\t\t\t/* Pointer to the secondary RSNIE context */\n\t\t\trsnielen_ex_cur_p = &pAd->ApCfg.MBSSID[MAIN_MBSSID].RSNIE_Len[1];\n\t\t\tpRsnIe_ex = pAd->ApCfg.MBSSID[MAIN_MBSSID].RSN_IE[1];\n\n\t\t\t/* Decide whether the authentication mode is WPA1-WPA2 mixed mode */\n\t\t\tif ((AuthMode == Ndis802_11AuthModeWPA1WPA2) || \n\t\t\t\t(AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\t\t{\n\t\t\t\tbMixRsnIe = TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef APCLI_SUPPORT\t\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\n\t\t\tUINT\tapcliIfidx = 0;\n\n\t\t\t/* Only support WPAPSK or WPA2PSK for AP-Client mode */\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->ApCfg.ApCliTab[apcliIfidx].WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)\n\t\t\t{\n\t\t\t\tif (AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n\t\t\t{\n\n\t\t\t\tif ((AuthMode != Ndis802_11AuthModeWPAPSK) && \n\t\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA2PSK))\n\t\t\t    \treturn;\n\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"==> RTMPMakeRSNIE(ApCli)\\n\"));\n\t\n\t\t\tapcliIfidx = apidx - MIN_NET_DEVICE_FOR_APCLI;\n\n\t\t\t/* Initiate some related information */\n\t\t\t\tif (apcliIfidx < MAX_APCLI_NUM)\n\t\t\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[apcliIfidx].RSNIE_Len = 0;\n\t\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[apcliIfidx].RSN_IE, MAX_LEN_OF_RSNIE);\n\t\t\trsnielen_cur_p = &pAd->ApCfg.ApCliTab[apcliIfidx].RSNIE_Len;\n\t\t\tpRsnIe = pAd->ApCfg.ApCliTab[apcliIfidx].RSN_IE;\n\t\n\t\t\tbMixCipher = pAd->ApCfg.ApCliTab[apcliIfidx].bMixCipher;\n\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPMakeRSNIE: invalid apcliIfidx(%d)\\n\", apcliIfidx));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t}\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* Sanity check for apidx */\n\t\t\tMBSS_MR_APIDX_SANITY_CHECK(pAd, apidx);\n#ifdef HOSTAPD_SUPPORT\n\t\t\tif(pAd->ApCfg.MBSSID[apidx].Hostapd)\n\t\t\t\treturn;\n#endif /* HOSTAPD_SUPPORT */\n\t\t\tif ((AuthMode != Ndis802_11AuthModeWPA) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPAPSK) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA2) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA2PSK) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA1WPA2) && \n\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA1PSKWPA2PSK)\n#ifdef WAPI_SUPPORT\n\t\t\t\t&& (AuthMode != Ndis802_11AuthModeWAICERT)\n\t\t\t\t&& (AuthMode != Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"==> RTMPMakeRSNIE(AP-ra%d)\\n\", apidx));\n\n\t\t\t/* decide the group key encryption type */\n\t\t\tif (WepStatus == Ndis802_11Encryption4Enabled)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\n\t\t\t\tFlexibleCipher = pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = WepStatus;\n\n\t\t\t/* Initiate some related information */\n\t\t\tpAd->ApCfg.MBSSID[apidx].RSNIE_Len[0] = 0;\n\t\t\tpAd->ApCfg.MBSSID[apidx].RSNIE_Len[1] = 0;\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], MAX_LEN_OF_RSNIE);\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], MAX_LEN_OF_RSNIE);\n\n\t\t\t/* Pointer to the first RSNIE context */\n\t\t\trsnielen_cur_p = &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0];\n\t\t\tpRsnIe = pAd->ApCfg.MBSSID[apidx].RSN_IE[0];\n\n\t\t\t/* Pointer to the secondary RSNIE context */\n\t\t\trsnielen_ex_cur_p = &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1];\n\t\t\tpRsnIe_ex = pAd->ApCfg.MBSSID[apidx].RSN_IE[1];\n\n\t\t\t/* Decide whether the authentication mode is WPA1-WPA2 mixed mode */\n\t\t\tif ((AuthMode == Ndis802_11AuthModeWPA1WPA2) || \n\t\t\t\t(AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\t\t{\n\t\t\t\tbMixRsnIe = TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)\n\t\t\t{\n\t\t\t\tif (AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t{\n\t\t\t\t/* Support WPAPSK or WPA2PSK in STA-Infra mode */\n\t\t\t\t/* Support WPANone in STA-Adhoc mode */\n\t\t\t\tif ((AuthMode != Ndis802_11AuthModeWPAPSK) && \n\t\t\t\t\t(AuthMode != Ndis802_11AuthModeWPA2PSK) && \n\t\t\t\t\t(AuthMode != Ndis802_11AuthModeWPANone)\n#ifdef WAPI_SUPPORT\n\t\t\t\t\t&& (AuthMode != Ndis802_11AuthModeWAICERT)\n\t\t\t\t\t&& (AuthMode != Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t}\t\n\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"==> RTMPMakeRSNIE(STA)\\n\"));\n\n\t\t\t/* Zero RSNIE context */\n\t\t\tpAd->StaCfg.RSNIE_Len = 0;\n\t\t\tNdisZeroMemory(pAd->StaCfg.RSN_IE, MAX_LEN_OF_RSNIE);\n\n\t\t\t/* Pointer to RSNIE */\n\t\t\trsnielen_cur_p = &pAd->StaCfg.RSNIE_Len;\n\t\t\tpRsnIe = pAd->StaCfg.RSN_IE;\n\n\t\t\tbMixCipher = pAd->StaCfg.bMixCipher;\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t} while(FALSE);\n\n\t/* indicate primary RSNIE as WPA or WPA2*/\n\tif ((AuthMode == Ndis802_11AuthModeWPA) || \n\t\t(AuthMode == Ndis802_11AuthModeWPAPSK) || \n\t\t(AuthMode == Ndis802_11AuthModeWPANone) || \n\t\t(AuthMode == Ndis802_11AuthModeWPA1WPA2) || \n\t\t(AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\t\tPrimaryRsnie = WpaIe;\n#ifdef WAPI_SUPPORT\n\telse if ((AuthMode == Ndis802_11AuthModeWAICERT) || \n\t\t\t (AuthMode == Ndis802_11AuthModeWAIPSK))\n\t\tPrimaryRsnie = WapiIe;\n#endif /* WAPI_SUPPORT */\n\telse\n\t\tPrimaryRsnie = Wpa2Ie;\n\n#ifdef WAPI_SUPPORT\n\tif (PrimaryRsnie == WapiIe)\n\t{\n\t\tRTMPInsertWapiIe(AuthMode, WepStatus, pRsnIe, &p_offset);\n\t}\n\telse\n#endif /* WAPI_SUPPORT */\t\t\n\t{\n\t\t/* Build the primary RSNIE*/\n\t\t/* 1. insert cipher suite*/\n\t\tRTMPMakeRsnIeCipher(pAd, PrimaryRsnie, WepStatus, apidx, bMixCipher, FlexibleCipher, pRsnIe, &p_offset);\n\n\t\t/* 2. insert AKM*/\n\t\tRTMPMakeRsnIeAKM(pAd, PrimaryRsnie, AuthMode, apidx, pRsnIe, &p_offset);\n\n\t\t/* 3. insert capability*/\n\t\tRTMPMakeRsnIeCap(pAd, PrimaryRsnie, apidx, pRsnIe, &p_offset);\n\n\t}\n\n\t/* 4. update the RSNIE length*/\n\tif (rsnielen_cur_p == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: rsnielen_cur_p == NULL!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t*rsnielen_cur_p = p_offset; \n\n\thex_dump(\"The primary RSNIE\", pRsnIe, (*rsnielen_cur_p));\n\n#ifdef CONFIG_AP_SUPPORT\n\tif ((pAd->OpMode == OPMODE_AP)\n#ifdef P2P_SUPPORT\n\t\t|| (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\t/* if necessary, build the secondary RSNIE*/\n\t\tif (bMixRsnIe)\n\t\t{\n\t\t\t/* 1. insert cipher suite*/\n\t\t\tRTMPMakeRsnIeCipher(pAd, Wpa2Ie, WepStatus, apidx, bMixCipher, FlexibleCipher, pRsnIe_ex, &s_offset);\n\n\t\t\t/* 2. insert AKM*/\n\t\t\tRTMPMakeRsnIeAKM(pAd, Wpa2Ie, AuthMode, apidx, pRsnIe_ex, &s_offset);\n\n\t\t\t/* 3. insert capability*/\n\t\t\tRTMPMakeRsnIeCap(pAd, Wpa2Ie, apidx, pRsnIe_ex, &s_offset);\n\n\n\t\t\t/* Update the RSNIE length*/\n\t\t\t*rsnielen_ex_cur_p = s_offset; \n\n\t\t\thex_dump(\"The secondary RSNIE\", pRsnIe_ex, (*rsnielen_ex_cur_p));\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n}\n\n/*\n    ==========================================================================\n    Description:\n\t\tCheck whether the received frame is EAP frame.\n\n\tArguments:\n\t\tpAd\t\t\t\t-\tpointer to our pAdapter context\t\n\t\tpEntry\t\t\t-\tpointer to active entry\n\t\tpData\t\t\t-\tthe received frame\n\t\tDataByteCount \t-\tthe received frame's length\t\t\n\t\tFromWhichBSSID\t-\tindicate the interface index\n       \n    Return:\n         TRUE \t\t\t-\tThis frame is EAP frame\n         FALSE \t\t\t-\totherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPCheckWPAframe(\n    IN PRTMP_ADAPTER    pAd,\n    IN PMAC_TABLE_ENTRY\tpEntry,\n    IN PUCHAR           pData,\n    IN ULONG            DataByteCount,\n\tIN UCHAR\t\t\tFromWhichBSSID)\n{\n\tULONG\tBody_len;\n\tBOOLEAN Cancelled;\n\n\tdo\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tbreak;\n#endif /* P2P_SUPPORT */\n\t} while (FALSE);\n\n    if(DataByteCount < (LENGTH_802_1_H + LENGTH_EAPOL_H))\n        return FALSE;\n\n    \n\t/* Skip LLC header\t*/\n    if (NdisEqualMemory(SNAP_802_1H, pData, 6) ||\n        /* Cisco 1200 AP may send packet with SNAP_BRIDGE_TUNNEL*/\n        NdisEqualMemory(SNAP_BRIDGE_TUNNEL, pData, 6)) \n    {\n        pData += 6;\n    }\n\t/* Skip 2-bytes EAPoL type */\n    if (NdisEqualMemory(EAPOL, pData, 2)) \n/*\tif (*(UINT16 *)EAPOL == *(UINT16 *)pData)*/\n    {\n        pData += 2;         \n    }\n    else    \n        return FALSE;\n\n    switch (*(pData+1))     \n    {   \n        case EAPPacket:\n\t\t\tBody_len = (*(pData+2)<<8) | (*(pData+3));\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n#ifdef IDS_SUPPORT\n\t\t\t\tif((*(pData+4)) == EAP_CODE_REQUEST)\n\t\t\t\t\tpAd->ApCfg.RcvdEapReqCount ++;\n#endif /* IDS_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAP-Packet frame, TYPE = 0, Length = %ld\\n\", Body_len));\n            break;\n        case EAPOLStart:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOL-Start frame, TYPE = 1 \\n\"));\n\t\t\tif (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)\n            {    \n            \tDBGPRINT(RT_DEBUG_TRACE, (\"Cancel the EnqueueEapolStartTimerRunning \\n\"));\n                RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n                pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;             \n            }\t\t\t\t\n            break;\n        case EAPOLLogoff:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOLLogoff frame, TYPE = 2 \\n\"));\n            break;\n        case EAPOLKey:\n\t\t\tBody_len = (*(pData+2)<<8) | (*(pData+3));\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOL-Key frame, TYPE = 3, Length = %ld\\n\", Body_len));\n            break;\n        case EAPOLASFAlert:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOLASFAlert frame, TYPE = 4 \\n\"));\n            break;\n        default:\n            return FALSE;\n    \n    }   \n    return TRUE;\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nBOOLEAN RTMPCheckWPAframe_Hdr_Trns(\n    IN PRTMP_ADAPTER    pAd,\n    IN PMAC_TABLE_ENTRY\tpEntry,\n    IN PUCHAR           pData,\n    IN ULONG            DataByteCount,\n\tIN UCHAR\t\t\tFromWhichBSSID)\n{\n\tULONG\tBody_len;\n\tBOOLEAN Cancelled;\n\n\tdo\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tbreak;\n#endif /* P2P_SUPPORT */\n\t} while (FALSE);\n\n    if(DataByteCount < (LENGTH_802_3 + LENGTH_EAPOL_H))\n        return FALSE;\n\n    \n\t/* Skip LLC header\t*/\n\n\tpData += LENGTH_802_3;\n\n\t/* Skip 2-bytes EAPoL type */\n    if (NdisEqualMemory(EAPOL, pData, 2)) \n/*\tif (*(UINT16 *)EAPOL == *(UINT16 *)pData)*/\n    {\n        pData += 2;         \n    }\n    else    \n        return FALSE;\n\n    switch (*(pData+1))     \n    {   \n        case EAPPacket:\n\t\t\tBody_len = (*(pData+2)<<8) | (*(pData+3));\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n#ifdef IDS_SUPPORT\n\t\t\t\tif((*(pData+4)) == EAP_CODE_REQUEST)\n\t\t\t\t\tpAd->ApCfg.RcvdEapReqCount ++;\n#endif /* IDS_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAP-Packet frame, TYPE = 0, Length = %ld\\n\", Body_len));\n            break;\n        case EAPOLStart:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOL-Start frame, TYPE = 1 \\n\"));\n\t\t\tif (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)\n            {    \n            \tDBGPRINT(RT_DEBUG_TRACE, (\"Cancel the EnqueueEapolStartTimerRunning \\n\"));\n                RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n                pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;             \n            }\t\t\t\t\n            break;\n        case EAPOLLogoff:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOLLogoff frame, TYPE = 2 \\n\"));\n            break;\n        case EAPOLKey:\n\t\t\tBody_len = (*(pData+2)<<8) | (*(pData+3));\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOL-Key frame, TYPE = 3, Length = %ld\\n\", Body_len));\n            break;\n        case EAPOLASFAlert:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPOLASFAlert frame, TYPE = 4 \\n\"));\n            break;\n        default:\n            return FALSE;\n    \n    }   \n    return TRUE;\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\n/*\n    ==========================================================================\n    Description:\n\t\tReport the EAP message type\n\n\tArguments:\n\t\tmsg\t\t-\tEAPOL_PAIR_MSG_1\n\t\t\t\t\tEAPOL_PAIR_MSG_2\n\t\t\t\t\tEAPOL_PAIR_MSG_3\n\t\t\t\t\tEAPOL_PAIR_MSG_4\n\t\t\t\t\tEAPOL_GROUP_MSG_1\n\t\t\t\t\tEAPOL_GROUP_MSG_2\n\t\t\t\t\t\t\t\t\t\t\t       \n    Return:\n         message type string\n\n    ==========================================================================\n*/\nPSTRING GetEapolMsgType(CHAR msg)\n{\n    if(msg == EAPOL_PAIR_MSG_1)\n        return \"Pairwise Message 1\";\n    else if(msg == EAPOL_PAIR_MSG_2)\n        return \"Pairwise Message 2\";\n\telse if(msg == EAPOL_PAIR_MSG_3)\n        return \"Pairwise Message 3\";\n\telse if(msg == EAPOL_PAIR_MSG_4)\n        return \"Pairwise Message 4\";\n\telse if(msg == EAPOL_GROUP_MSG_1)\n        return \"Group Message 1\";\n\telse if(msg == EAPOL_GROUP_MSG_2)\n        return \"Group Message 2\";\n    else\n    \treturn \"Invalid Message\";\n}\n\n\n/*\n    ========================================================================\n    \n    Routine Description:\n    Check Sanity RSN IE of EAPoL message\n\n    Arguments:\n        \n    Return Value:\n\n\t\t\n    ========================================================================\n*/\nBOOLEAN RTMPCheckRSNIE(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pData,\n\tIN  UCHAR           DataLen,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tOUT\tUCHAR\t\t\t*Offset)\n{\n\tPUCHAR              pVIE;\n\tUCHAR               len;\n\tPEID_STRUCT         pEid;\n\tBOOLEAN\t\t\t\tresult = FALSE;\n\t\t\n\tpVIE = pData;\n\tlen\t = DataLen;\n\t*Offset = 0;\n\n\twhile (len > sizeof(RSNIE2))\n\t{\n\t\tpEid = (PEID_STRUCT) pVIE;\t\n\t\t/* WPA RSN IE*/\n\t\tif ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)))\n\t\t{\t\t\t\n\t\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) &&\n\t\t\t\t(NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&\n\t\t\t\t(pEntry->RSNIE_Len == (pEid->Len + 2)))\n\t\t\t{\n\t\t\t\t\tresult = TRUE;\t\t\t\t\n\t\t\t}\t\t\n\t\t\t\n\t\t\t*Offset += (pEid->Len + 2);\t\t\t\n\t\t}\n\t\t/* WPA2 RSN IE, doesn't need to check RSNIE Capabilities field        */\n\t\telse if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)))\n\t\t{\n\t\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2 || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) &&\n\t\t\t\t(pEid->Eid == pEntry->RSN_IE[0]) &&\n\t\t\t\t((pEid->Len + 2) >= pEntry->RSNIE_Len) &&\n\t\t\t\t(NdisEqualMemory(pEid->Octet, &pEntry->RSN_IE[2], pEntry->RSNIE_Len - 4)))\n\t\t\t{\n\n\t\t\t\t\tresult = TRUE;\t\t\t\t\n\t\t\t}\t\t\t\n\n\t\t\t*Offset += (pEid->Len + 2);\n\t\t}\t\t\n\t\telse\n\t\t{\t\t\t\n\t\t\tbreak;\n\t\t}\n\n\t\tpVIE += (pEid->Len + 2);\n\t\tlen  -= (pEid->Len + 2);\n\t}\n\t\n\t\t\n\treturn result;\n\t\n}\n\n\n/*\n    ========================================================================\n    \n    Routine Description:\n    Parse KEYDATA field.  KEYDATA[] May contain 2 RSN IE and optionally GTK.  \n    GTK  is encaptulated in KDE format at  p.83 802.11i D10\n\n    Arguments:\n        \n    Return Value:\n\n    Note:\n        802.11i D10  \n        \n    ========================================================================\n*/\nBOOLEAN RTMPParseEapolKeyData(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pKeyData,\n\tIN  UCHAR           KeyDataLen,\n\tIN\tUCHAR\t\t\tGroupKeyIndex,\n\tIN\tUCHAR\t\t\tMsgType,\n\tIN\tBOOLEAN\t\t\tbWPA2,\n\tIN  MAC_TABLE_ENTRY *pEntry)\n{\n    PUCHAR              pMyKeyData = pKeyData;\n    UCHAR               KeyDataLength = KeyDataLen;\n\tUCHAR\t\t\t\tGTK[MAX_LEN_GTK];\n    UCHAR               GTKLEN = 0;\n\tUCHAR\t\t\t\tDefaultIdx = 0;\n\tUCHAR\t\t\t\tskip_offset = 0;\t\t\t\n\n\n\tNdisZeroMemory(GTK, MAX_LEN_GTK);\n\n\t/* Verify The RSN IE contained in pairewise_msg_2 && pairewise_msg_3 and skip it*/\n\tif (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_3)\n    {\n\t\t{\n\t\t\tif (bWPA2 && MsgType == EAPOL_PAIR_MSG_3)\n\t\t\t{\n\t\t\t\t/*WpaShowAllsuite(pMyKeyData, skip_offset);*/\n\t\t\t\n\t\t\t\t/* skip RSN IE*/\n\t\t\t\tpMyKeyData += skip_offset;\n\t\t\t\tKeyDataLength -= skip_offset;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPParseEapolKeyData ==> WPA2/WPA2PSK RSN IE matched in Msg 3, Length(%d) \\n\", skip_offset));\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn TRUE;\t\t\t\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"RTMPParseEapolKeyData ==> KeyDataLength %d without RSN_IE \\n\", KeyDataLength));\n\t/*hex_dump(\"remain data\", pMyKeyData, KeyDataLength);*/\n\n\n\t/* Parse KDE format in pairwise_msg_3_WPA2 && group_msg_1_WPA2*/\n\tif (bWPA2 && (MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1))\n\t{\t\t\t\t\n\t\tPEID_STRUCT     pEid;\n\t\t\t\n\t\tpEid = (PEID_STRUCT) pMyKeyData;\n\t\tskip_offset = 0;\n\t\twhile ((skip_offset + 2 + pEid->Len) <= KeyDataLength)\n\t\t{\n\t\t\tswitch(pEid->Eid)\n\t\t\t{\n\t\t\t\tcase WPA_KDE_TYPE:\n\t\t\t\t\t{\n\t\t\t\t\t\tPKDE_HDR\tpKDE;\n\n\t\t\t\t\t\tpKDE = (PKDE_HDR)pEid;\n\t\t\t\t\t\tif (NdisEqualMemory(pKDE->OUI, OUI_WPA2, 3))\n    \t\t\t\t\t{\n\t\t\t\t\t\t\tif (pKDE->DataType == KDE_GTK)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPGTK_KDE pKdeGtk;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tpKdeGtk = (PGTK_KDE) &pKDE->octet[0];\n\t\t\t\t\t\t\t\tDefaultIdx = pKdeGtk->Kid;\n\n\t\t\t\t\t\t\t\t/* Get GTK length - refer to IEEE 802.11i-2004 p.82 */\n\t\t\t\t\t\t\t\tGTKLEN = pKDE->Len -6;\n\t\t\t\t\t\t\t\tif (GTKLEN < LEN_WEP64)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: GTK Key length is too short (%d) \\n\", GTKLEN));\n        \t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tNdisMoveMemory(GTK, pKdeGtk->GTK, GTKLEN);\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"GTK in KDE format ,DefaultKeyID=%d, KeyLen=%d \\n\", DefaultIdx, GTKLEN));\n    \t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tskip_offset = skip_offset + 2 + pEid->Len;\n\t        pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);   \n\t\t}\n\n\t\t/* skip KDE Info*/\n\t\tpMyKeyData += skip_offset;\n\t\tKeyDataLength -= skip_offset;\t\t\n\t}\n\telse if (!bWPA2 && MsgType == EAPOL_GROUP_MSG_1)\n\t{\n\t\tDefaultIdx = GroupKeyIndex;\n\t\tGTKLEN = KeyDataLength;\n\t\tNdisMoveMemory(GTK, pMyKeyData, KeyDataLength);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"GTK without KDE, DefaultKeyID=%d, KeyLen=%d \\n\", DefaultIdx, GTKLEN));\n\t}\n\t\t\n\t/* Sanity check - shared key index must be 0 ~ 3*/\n\tif (DefaultIdx > 3)\t\n    {\n     \tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: GTK Key index(%d) is invalid in %s %s \\n\", DefaultIdx, ((bWPA2) ? \"WPA2\" : \"WPA\"), GetEapolMsgType(MsgType)));\n        return FALSE;\n    } \n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\t\t\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\t/* Set Group key material, TxMic and RxMic for AP-Client*/\n\t\t\tif (!APCliInstallSharedKey(pAd, GTK, GTKLEN, DefaultIdx, pEntry))\n\t\t\t{\t\t\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\t\t\t\n#ifdef ADHOC_WPA2PSK_SUPPORT\t\n        if (ADHOC_ON(pAd)) {\n            if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) {\n                NdisZeroMemory(&pEntry->RxGTK, sizeof(CIPHER_KEY));                                \n      \t\t\tNdisMoveMemory(pEntry->RxGTK.Key, GTK, LEN_TK);\n                pEntry->RxGTK.CipherAlg = CIPHER_AES;\n                pEntry->RxGTK.KeyLen= LEN_TK;\n            }                \n        } else \n#endif /* ADHOC_WPA2PSK_SUPPORT */\n       {                        \n#ifdef P2P_SUPPORT\n\t\t\tif (IS_ENTRY_CLIENT(pEntry))\n#endif /* P2P_SUPPORT */\n        {                        \n    \t\t/* set key material, TxMic and RxMic\t\t*/\n    \t\tNdisMoveMemory(pAd->StaCfg.GTK, GTK, GTKLEN);\n    \t\tpAd->StaCfg.DefaultKeyId = DefaultIdx;\n\n    \t\tWPAInstallSharedKey(pAd, \n    \t\t\t\t\t\t\tpAd->StaCfg.GroupCipher, \n    \t\t\t\t\t\t\tBSS0, \n    \t\t\t\t\t\t\tpAd->StaCfg.DefaultKeyId, \n    \t\t\t\t\t\t\tMCAST_WCID, \n    \t\t\t\t\t\t\tFALSE, \n    \t\t\t\t\t\t\tpAd->StaCfg.GTK,\n    \t\t\t\t\t\t\tGTKLEN);\n\t\t\t}\n        }            \n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n \n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct KDE common format  \n\t\tIts format is below,\n\t\t\n\t\t+--------------------+\n\t\t| Type (0xdd)\t\t |  1 octet\n\t\t+--------------------+\n\t\t| Length\t\t\t |\t1 octet\t\n\t\t+--------------------+\n\t\t| OUI\t\t\t\t |  3 octets\n\t\t+--------------------+\n\t\t| Data Type\t\t\t |\t1 octet\n\t\t+--------------------+\n\t\t\n\tArguments:\n\t\t\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\tIt's defined in IEEE 802.11-2007 Figure 8-25.\n\t\t\n\t========================================================================\n*/\nVOID WPA_ConstructKdeHdr(\n\tIN \tUINT8\tdata_type,\t\n\tIN \tUINT8 \tdata_len,\n\tOUT PUCHAR \tpBuf)\n{\n\tPKDE_HDR\tpHdr;\n\n\tpHdr = (PKDE_HDR)pBuf;\n\n\tNdisZeroMemory(pHdr, sizeof(KDE_HDR));\n\n    pHdr->Type = WPA_KDE_TYPE;\n\n\t/* The Length field specifies the number of octets in the OUI, Data\n\t   Type, and Data fields. */\t   \n\tpHdr->Len = 4 + data_len;\n\n\tNdisMoveMemory(pHdr->OUI, OUI_WPA2, 3);\n\tpHdr->DataType = data_type;\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct EAPoL message for WPA handshaking \n\t\tIts format is below,\n\t\t\n\t\t+--------------------+\n\t\t| Protocol Version\t |  1 octet\n\t\t+--------------------+\n\t\t| Protocol Type\t\t |\t1 octet\t\n\t\t+--------------------+\n\t\t| Body Length\t\t |  2 octets\n\t\t+--------------------+\n\t\t| Descriptor Type\t |\t1 octet\n\t\t+--------------------+\n\t\t| Key Information    |\t2 octets\n\t\t+--------------------+\n\t\t| Key Length\t     |  1 octet\n\t\t+--------------------+\n\t\t| Key Repaly Counter |\t8 octets\n\t\t+--------------------+\n\t\t| Key Nonce\t\t     |  32 octets\n\t\t+--------------------+\n\t\t| Key IV\t\t\t |  16 octets\n\t\t+--------------------+\n\t\t| Key RSC\t\t\t |  8 octets\n\t\t+--------------------+\n\t\t| Key ID or Reserved |\t8 octets\n\t\t+--------------------+\n\t\t| Key MIC\t\t\t |\t16 octets\n\t\t+--------------------+\n\t\t| Key Data Length\t |\t2 octets\n\t\t+--------------------+\n\t\t| Key Data\t\t\t |\tn octets\n\t\t+--------------------+\n\t\t\n\n\tArguments:\n\t\tpAd\t\t\tPointer\tto our adapter\n\t\t\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tConstructEapolMsg(\n\tIN \tPMAC_TABLE_ENTRY\tpEntry,\n    IN \tUCHAR\t\t\t\tGroupKeyWepStatus,\n    IN \tUCHAR\t\t\t\tMsgType,  \n    IN\tUCHAR\t\t\t\tDefaultKeyIdx,\n\tIN \tUCHAR\t\t\t\t*KeyNonce,\n\tIN\tUCHAR\t\t\t\t*TxRSC,\n\tIN\tUCHAR\t\t\t\t*GTK,\n\tIN\tUCHAR\t\t\t\t*RSNIE,\n\tIN\tUCHAR\t\t\t\tRSNIE_Len,\n    OUT PEAPOL_PACKET       pMsg)\n{\n\tBOOLEAN\tbWPA2 = FALSE;\n\tUCHAR\tKeyDescVer;\n\n\t/* Choose WPA2 or not*/\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || \n\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tbWPA2 = TRUE;\n\t\t\n    /* Init Packet and Fill header    */\n    pMsg->ProVer = EAPOL_VER;\n    pMsg->ProType = EAPOLKey;\n\n\t/* Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field*/\n\tSET_UINT16_TO_ARRARY(pMsg->Body_Len, MIN_LEN_OF_EAPOL_KEY_MSG);\n\n\t/* Fill in EAPoL descriptor*/\n\tif (bWPA2)\n\t\tpMsg->KeyDesc.Type = WPA2_KEY_DESC;\n\telse\n\t\tpMsg->KeyDesc.Type = WPA1_KEY_DESC;\n\t\t\t\n\t/* Key Descriptor Version (bits 0-2) specifies the key descriptor version type*/\n\t{\n\t\t/* Fill in Key information, refer to IEEE Std 802.11i-2004 page 78 */\n\t\t/* When either the pairwise or the group cipher is AES, the KEY_DESC_AES shall be used.*/\n\t\tKeyDescVer = (((pEntry->WepStatus == Ndis802_11Encryption3Enabled) || \n\t\t        \t\t(GroupKeyWepStatus == Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES) : (KEY_DESC_TKIP));\n\t}\n\n\tpMsg->KeyDesc.KeyInfo.KeyDescVer = KeyDescVer;\n\n\t/* Specify Key Type as Group(0) or Pairwise(1)*/\n\tif (MsgType >= EAPOL_GROUP_MSG_1)\n\t\tpMsg->KeyDesc.KeyInfo.KeyType = GROUPKEY;\n\telse\n\t\tpMsg->KeyDesc.KeyInfo.KeyType = PAIRWISEKEY;\n\n\t/* Specify Key Index, only group_msg1_WPA1*/\n\tif (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))\n\t\tpMsg->KeyDesc.KeyInfo.KeyIndex = DefaultKeyIdx;\n\t\n\tif (MsgType == EAPOL_PAIR_MSG_3)\n\t\tpMsg->KeyDesc.KeyInfo.Install = 1;\n\t\n\tif ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1))\n\t\tpMsg->KeyDesc.KeyInfo.KeyAck = 1;\n\n\tif (MsgType != EAPOL_PAIR_MSG_1)\t\n\t\tpMsg->KeyDesc.KeyInfo.KeyMic = 1;\n \n\tif ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) || \n\t\t(!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1)))\n    {                        \n       \tpMsg->KeyDesc.KeyInfo.Secure = 1;                   \n    }\n\n\t/* This subfield shall be set, and the Key Data field shall be encrypted, if\n\t   any key material (e.g., GTK or SMK) is included in the frame. */\n\tif (bWPA2 && ((MsgType == EAPOL_PAIR_MSG_3) || \n\t\t(MsgType == EAPOL_GROUP_MSG_1)))\n    {                               \t\n        pMsg->KeyDesc.KeyInfo.EKD_DL = 1;            \n    }\n\n\t/* key Information element has done. */\n\t*(USHORT *)(&pMsg->KeyDesc.KeyInfo) = cpu2le16(*(USHORT *)(&pMsg->KeyDesc.KeyInfo));\n\n\t/* Fill in Key Length*/\n\tif (bWPA2)\n\t{\n\t\t/* In WPA2 mode, the field indicates the length of pairwise key cipher, */\n\t\t/* so only pairwise_msg_1 and pairwise_msg_3 need to fill. */\n\t\tif ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3))\n\t\t\tpMsg->KeyDesc.KeyLength[1] = ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_TK : LEN_AES_TK);\n\t}\n\telse if (!bWPA2)\n\t{\n\t\tif (MsgType >= EAPOL_GROUP_MSG_1)\n\t\t{\n\t\t\t/* the length of group key cipher*/\n\t\t\tpMsg->KeyDesc.KeyLength[1] = ((GroupKeyWepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_GTK : LEN_AES_GTK);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* the length of pairwise key cipher*/\n\t\t\tpMsg->KeyDesc.KeyLength[1] = ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_TK : LEN_AES_TK);\t\t\t\n\t\t}\t\t\t\t\n\t}\t\t\t\n\t\n \t/* Fill in replay counter        \t\t*/\n    NdisMoveMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY);\n\n\t/* Fill Key Nonce field\t\t  */\n\t/* ANonce : pairwise_msg1 & pairwise_msg3*/\n\t/* SNonce : pairwise_msg2*/\n\t/* GNonce : group_msg1_wpa1\t*/\n\tif ((MsgType <= EAPOL_PAIR_MSG_3) || ((!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))))\n    \tNdisMoveMemory(pMsg->KeyDesc.KeyNonce, KeyNonce, LEN_KEY_DESC_NONCE);\n\n\t/* Fill key IV - WPA2 as 0, WPA1 as random*/\n\tif (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))\n\t{\t\t\n\t\t/* Suggest IV be random number plus some number,*/\n\t\tNdisMoveMemory(pMsg->KeyDesc.KeyIv, &KeyNonce[16], LEN_KEY_DESC_IV);\t\t\n        pMsg->KeyDesc.KeyIv[15] += 2;\t\t\n\t}\n\t\n    /* Fill Key RSC field        */\n    /* It contains the RSC for the GTK being installed.*/\n\tif ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))\n\t{\t\t\n        NdisMoveMemory(pMsg->KeyDesc.KeyRsc, TxRSC, 6);\n\t}\n\n\t/* Clear Key MIC field for MIC calculation later   */\n    NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\t\n\tConstructEapolKeyData(pEntry,\n\t\t\t\t\t\t  GroupKeyWepStatus, \n\t\t\t\t\t\t  KeyDescVer,\n\t\t\t\t\t\t  MsgType, \n\t\t\t\t\t\t  DefaultKeyIdx, \n\t\t\t\t\t\t  GTK,\n\t\t\t\t\t\t  RSNIE,\n\t\t\t\t\t\t  RSNIE_Len,\n\t\t\t\t\t\t  pMsg);\n \n\t/* Calculate MIC and fill in KeyMic Field except Pairwise Msg 1.*/\n\tif (MsgType != EAPOL_PAIR_MSG_1)\n\t{\n\t\tCalculateMIC(KeyDescVer, pEntry->PTK, pMsg);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> ConstructEapolMsg for %s %s\\n\", ((bWPA2) ? \"WPA2\" : \"WPA\"), GetEapolMsgType(MsgType)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\t     Body length = %d \\n\", CONV_ARRARY_TO_UINT16(pMsg->Body_Len)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\t     Key length  = %d \\n\", CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyLength)));\n\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct the Key Data field of EAPoL message \n\n\tArguments:\n\t\tpAd\t\t\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tConstructEapolKeyData(\n\tIN\tPMAC_TABLE_ENTRY\tpEntry,\n\tIN\tUCHAR\t\t\tGroupKeyWepStatus,\n\tIN\tUCHAR\t\t\tkeyDescVer,\n\tIN \tUCHAR\t\t\tMsgType,\n\tIN\tUCHAR\t\t\tDefaultKeyIdx,\n\tIN\tUCHAR\t\t\t*GTK,\n\tIN\tUCHAR\t\t\t*RSNIE,\n\tIN\tUCHAR\t\t\tRSNIE_LEN,\n\tOUT PEAPOL_PACKET   pMsg)\n{\n\tUCHAR\t\t*mpool, *Key_Data, *eGTK;  \t  \n\tULONG\t\tdata_offset;\n\tBOOLEAN\t\tbWPA2Capable = FALSE;\n\tBOOLEAN\t\tGTK_Included = FALSE;\n\n\t/* Choose WPA2 or not*/\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || \n\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tbWPA2Capable = TRUE;\n\n\tif (MsgType == EAPOL_PAIR_MSG_1 || \n\t\tMsgType == EAPOL_PAIR_MSG_4 || \n\t\tMsgType == EAPOL_GROUP_MSG_2)\n\t\treturn;\n \n\t/* allocate memory pool*/\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, 1500);\n\n    if (mpool == NULL)\n\t\treturn;\n        \n\t/* eGTK Len = 512 */\n\teGTK = (UCHAR *) ROUND_UP(mpool, 4);\n\t/* Key_Data Len = 512 */\n\tKey_Data = (UCHAR *) ROUND_UP(eGTK + 512, 4);\n\n\tNdisZeroMemory(Key_Data, 512);\n\tSET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, 0);\n\tdata_offset = 0;\n\t\n\t/* Encapsulate RSNIE in pairwise_msg2 & pairwise_msg3\t\t*/\n\tif (RSNIE_LEN && ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3)))\n\t{\n\t\tPUINT8\tpmkid_ptr = NULL;\n\t\tUINT8 \tpmkid_len = 0;\n\n\n\t\tRTMPInsertRSNIE(&Key_Data[data_offset], \n\t\t\t\t\t\t&data_offset,\n\t\t\t\t\t\tRSNIE, \n\t\t\t\t\t\tRSNIE_LEN, \n\t\t\t\t\t\tpmkid_ptr, \n\t\t\t\t\t\tpmkid_len);\n\t}\n\n\n\t/* Encapsulate GTK \t\t*/\n\t/* Only for pairwise_msg3_WPA2 and group_msg1*/\n\tif ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable) || (MsgType == EAPOL_GROUP_MSG_1))\n\t{\n\t\tUINT8\tgtk_len;\n\n\t\t/* Decide the GTK length */ \n\t\tif (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n\t\t\tgtk_len = LEN_AES_GTK;\n\t\telse\n\t\t\tgtk_len = LEN_TKIP_GTK;\n\t\t\n\t\t/* Insert GTK KDE format in WAP2 mode */\n\t\tif (bWPA2Capable)\n\t\t{\n\t\t\t/* Construct the common KDE format */\n\t\t\tWPA_ConstructKdeHdr(KDE_GTK, 2 + gtk_len, &Key_Data[data_offset]);\n\t\t\tdata_offset += sizeof(KDE_HDR);\n\n\t\t\t/* GTK KDE format - 802.11i-2004  Figure-43x*/\n\t        Key_Data[data_offset] = (DefaultKeyIdx & 0x03);\n\t        Key_Data[data_offset + 1] = 0x00;\t/* Reserved Byte*/\n\t        data_offset += 2;\n\t\t}\n\n\t\t/* Fill in GTK */\n\t\tNdisMoveMemory(&Key_Data[data_offset], GTK, gtk_len);\n\t\tdata_offset += gtk_len;\n\n\n\t\tGTK_Included = TRUE;\n\t}\n\n\n\n\t/* If the Encrypted Key Data subfield (of the Key Information field) \n\t   is set, the entire Key Data field shall be encrypted. */\n\t/* This whole key-data field shall be encrypted if a GTK is included.*/\n\t/* Encrypt the data material in key data field with KEK*/\n\tif (GTK_Included)\n\t{\n\t\t/*hex_dump(\"GTK_Included\", Key_Data, data_offset);*/\n\t\n\t\tif (\n\t\t\t(keyDescVer == KEY_DESC_AES))\n\t\t{\n\t\t\tUCHAR \tremainder = 0;\n\t\t\tUCHAR\tpad_len = 0;\t\t\t\n\t\t\tUINT\twrap_len =0;\n\n\t\t\t/* Key Descriptor Version 2 or 3: AES key wrap, defined in IETF RFC 3394, */\n\t\t\t/* shall be used to encrypt the Key Data field using the KEK field from */\n\t\t\t/* the derived PTK.*/\n\n\t\t\t/* If the Key Data field uses the NIST AES key wrap, then the Key Data field */\n\t\t\t/* shall be padded before encrypting if the key data length is less than 16 */\n\t\t\t/* octets or if it is not a multiple of 8. The padding consists of appending*/\n\t\t\t/* a single octet 0xdd followed by zero or more 0x00 octets. */\n\t\t\tif ((remainder = data_offset & 0x07) != 0)\n\t\t\t{\n\t\t\t\tINT\t\ti;\n\t\t\t\n\t\t\t\tpad_len = (8 - remainder);\n\t\t\t\tKey_Data[data_offset] = 0xDD;\n\t\t\t\tfor (i = 1; i < pad_len; i++)\n\t\t\t\t\tKey_Data[data_offset + i] = 0;\n\n\t\t\t\tdata_offset += pad_len;\n\t\t\t}\n\t\t\n\t\t\tAES_Key_Wrap(Key_Data, (UINT) data_offset, \n\t\t\t\t\t\t &pEntry->PTK[LEN_PTK_KCK], LEN_PTK_KEK, \n\t\t\t\t\t\t eGTK, &wrap_len);\t\n\t\t\tdata_offset = wrap_len;\n\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTKIP_GTK_KEY_WRAP(&pEntry->PTK[LEN_PTK_KCK], \n\t\t\t\t\t\t\t\tpMsg->KeyDesc.KeyIv,\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tKey_Data, \n\t\t\t\t\t\t\t\tdata_offset,\n\t\t\t\t\t\t\t\teGTK);\n\t\t}\n\n\t\tNdisMoveMemory(pMsg->KeyDesc.KeyData, eGTK, data_offset);\n\t}\n\telse\n\t{\n\t\tNdisMoveMemory(pMsg->KeyDesc.KeyData, Key_Data, data_offset);\n\t}\n\n\t/* Update key data length field and total body length*/\n\tSET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, data_offset);\n\tINC_UINT16_TO_ARRARY(pMsg->Body_Len, data_offset);\n\n\tos_free_mem(NULL, mpool);\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCalcaulate MIC. It is used during 4-ways handsharking.\n\n\tArguments:\n\t\tpAd\t\t\t\t-\tpointer to our pAdapter context\t\n    \tPeerWepStatus\t-\tindicate the encryption type    \t\t\t \n\t\t\n\tReturn Value:\n\n\tNote:\n\t The EAPOL-Key MIC is a MIC of the EAPOL-Key frames, \n\t from and including the EAPOL protocol version field \n\t to and including the Key Data field, calculated with \n\t the Key MIC field set to 0.\n\t\t\n\t========================================================================\n*/\nVOID\tCalculateMIC(\n\tIN\tUCHAR\t\t\tKeyDescVer,\t\n\tIN\tUCHAR\t\t\t*PTK,\n\tOUT PEAPOL_PACKET   pMsg)\n{\n    UCHAR   *OutBuffer;\n\tULONG\tFrameLen = 0;\n\tUCHAR\tmic[LEN_KEY_DESC_MIC];\n\tUCHAR\tdigest[80];\n\n\t/* allocate memory for MIC calculation*/\n\tos_alloc_mem(NULL, (PUCHAR *)&OutBuffer, 512);\n\n    if (OutBuffer == NULL)\n    {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!!CalculateMIC: no memory!!!\\n\"));\n\t\treturn;\n    }\n\t\t\n\t/* make a frame for calculating MIC.*/\n    MakeOutgoingFrame(OutBuffer,            \t&FrameLen,\n                      CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4,  \tpMsg,\n                      END_OF_ARGS);\n\n\tNdisZeroMemory(mic, sizeof(mic));\n\t\t\t\n\t/* Calculate MIC*/\n    if (KeyDescVer == KEY_DESC_AES)\n \t{\n\t\tRT_HMAC_SHA1(PTK, LEN_PTK_KCK, OutBuffer,  FrameLen, digest, SHA1_DIGEST_SIZE);\n\t\tNdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);\n\t}\n\telse if (KeyDescVer == KEY_DESC_TKIP)\n\t{\n\t\tRT_HMAC_MD5(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, mic, MD5_DIGEST_SIZE);\n\t}\n\telse if (KeyDescVer == KEY_DESC_EXT)\n\t{\n\t\tUINT\tmlen = AES_KEY128_LENGTH;\n\t\tAES_CMAC(OutBuffer, FrameLen, PTK, LEN_PTK_KCK, mic, &mlen);\n\t}        \n\n\t/* store the calculated MIC*/\n\tNdisMoveMemory(pMsg->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC);\n\n\tos_free_mem(NULL, OutBuffer);\n}\n\nUCHAR\tRTMPExtractKeyIdxFromIVHdr(\t\n\tIN\tPUCHAR\t\t\tpIV,\n\tIN\tUINT8\t\t\tCipherAlg)\n{\n\tUCHAR\tkeyIdx = 0xFF;\n\n\t/* extract the key index from IV header */\n\tswitch (CipherAlg)\n\t{\n\t\tcase Ndis802_11Encryption1Enabled:\n\t\tcase Ndis802_11Encryption2Enabled:\n\t\tcase Ndis802_11Encryption3Enabled:\n\t\t\tkeyIdx = (*(pIV + 3) & 0xc0) >> 6;\n\t\t\tbreak;\n\n#ifdef WAPI_SUPPORT\n\t\tcase Ndis802_11EncryptionSMS4Enabled:\n\t\t\tkeyIdx = *(pIV) & 0xFF;\n\t\t\tbreak;\n#endif /* WAPI_SUPPORT */\t\t\t\n\t}\n\n\treturn keyIdx;\n\n}\n\nPCIPHER_KEY RTMPSwCipherKeySelection(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PUCHAR pIV,\n\tIN RX_BLK *pRxBlk,\n\tIN MAC_TABLE_ENTRY *pEntry)\n{\n\tPCIPHER_KEY pKey = NULL;\t\n\tUCHAR keyIdx = 0;\n\tUINT8 CipherAlg = Ndis802_11EncryptionDisabled;\n\n\tif ((pEntry == NULL) ||\n\t\t(RX_BLK_TEST_FLAG(pRxBlk, fRX_APCLI)) || \n\t\t(RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) ||\n\t\t(RX_BLK_TEST_FLAG(pRxBlk, fRX_MESH)))\n\t\treturn NULL;\n\n\tif (pRxBlk->pRxInfo->U2M)\n\t{\n\t\tCipherAlg = pEntry->WepStatus;\n\t}\n\telse\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\t\t\t\t\n\t\t\tCipherAlg = pAd->StaCfg.GroupCipher;\n\t\t}\t\n#endif /* CONFIG_STA_SUPPORT */\t\t\n\t}\n\n\tif ((keyIdx = RTMPExtractKeyIdxFromIVHdr(pIV, CipherAlg)) > 3)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : Invalid key index(%d) !!!\\n\", \n\t\t\t\t\t\t\t\t  __FUNCTION__, keyIdx));\n\t\treturn NULL;\n\t}\n\n\tif (CipherAlg == Ndis802_11Encryption1Enabled)\n\t{\n\t\tpKey = &pAd->SharedKey[pEntry->apidx][keyIdx];\n\t}\n\telse if ((CipherAlg == Ndis802_11Encryption2Enabled) ||\n  \t\t\t (CipherAlg == Ndis802_11Encryption3Enabled))\n\t{\n\t\tif (pRxBlk->pRxInfo->U2M)\n\t\t\tpKey = &pEntry->PairwiseKey;\n\t\telse {\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n            if (ADHOC_ON(pAd))\n    \t\t\tpKey = &pEntry->RxGTK;\n            else\n#endif /* ADHOC_WPA2PSK_SUPPORT */                \n#endif /* CONFIG_STA_SUPPORT */\t    \t                \n\t\t    \tpKey = &pAd->SharedKey[pEntry->apidx][keyIdx];\n        }\n\t}\n#ifdef WAPI_SUPPORT\n\telse if (CipherAlg == Ndis802_11EncryptionSMS4Enabled)\n\t{\n\t\tif (pRxBlk->pRxInfo->U2M)\n\t\t\tpKey = &pEntry->PairwiseKey;\n\t\telse\n\t\t\tpKey = &pAd->SharedKey[pEntry->apidx][keyIdx];\n\t}\n#endif /* WAPI_SUPPORT */\n\n\treturn pKey;\n\t\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tSome received frames can't decrypt by Asic, so decrypt them by software.  \n\n\tArguments:\n\t\tpAd\t\t\t\t-\tpointer to our pAdapter context\t\n    \tPeerWepStatus\t-\tindicate the encryption type    \t\t\t \n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS\t\t-\tdecryption successful\t\n\t\tNDIS_STATUS_FAILURE\t\t-\tdecryption failure\n\t\t\n\t========================================================================\n*/\nNDIS_STATUS\tRTMPSoftDecryptionAction(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN \t\tPUCHAR\t\t\tpHdr,\n\tIN \t\tUCHAR    \t\tUserPriority,\n\tIN \t\tPCIPHER_KEY\t\tpKey,\n\tINOUT \tPUCHAR\t\t\tpData,\n\tINOUT \tUINT16\t\t\t*DataByteCnt)\n{\t\t\n\tswitch (pKey->CipherAlg)\n    {    \t        \t        \n\t\tcase CIPHER_WEP64:\n\t\tcase CIPHER_WEP128:\n\t\t\t/* handle WEP decryption */\n\t\t\tif (RTMPSoftDecryptWEP(pAd, pKey, pData, &(*DataByteCnt)) == FALSE)\t\t\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR : SW decrypt WEP data fails.\\n\"));\t\n\t\t\t\t/* give up this frame*/\n\t\t\t\treturn NDIS_STATUS_FAILURE; \n\t\t\t}        \t\t\t\t\t\t\t\t\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase CIPHER_TKIP:\n\t\t\t/* handle TKIP decryption */\n\t\t\tif (RTMPSoftDecryptTKIP(pAd, pHdr, UserPriority, \n\t\t\t\t\t\t\t\tpKey, pData, &(*DataByteCnt)) == FALSE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR : SW decrypt TKIP data fails.\\n\"));\n\t\t\t\t/* give up this frame*/\n\t\t\t\treturn NDIS_STATUS_FAILURE; \n\t\t\t}        \t\t\t\t\t\t\t\t\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase CIPHER_AES:\n\t\t\t/* handle AES decryption */\n\t\t\tif (RTMPSoftDecryptCCMP(pAd, pHdr, pKey, pData, &(*DataByteCnt)) == FALSE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR : SW decrypt AES data fails.\\n\"));\n\t\t\t\t/* give up this frame*/\n\t\t\t\treturn NDIS_STATUS_FAILURE; \n        \t}\n\t\t\tbreak;\n#ifdef WAPI_SUPPORT\n#ifdef SOFT_ENCRYPT\n\t\tcase CIPHER_SMS4:\n\t\t\t{\n\t\t\t\tINT\tret;\n#ifdef RT_BIG_ENDIAN\n\t\t\t\tRTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);\n#endif\t\t\t\t\n\t\t\t\tif ((ret = RTMPSoftDecryptSMS4(pHdr, FALSE, pKey, pData, &(*DataByteCnt))) != STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR : SW decrypt SMS4 data fails(%d).\\n\", ret));\n\t\t\t\t\t/* give up this frame*/\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;  \n\t\t\t\t}\n#ifdef RT_BIG_ENDIAN\n\t\t\t\tRTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);\n#endif\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n#endif /* SOFT_ENCRYPT */\t\t\t\n#endif /* WAPI_SUPPORT */\t\t\t\n\t\tdefault:\n\t\t\t/* give up this frame*/\n\t\t\treturn NDIS_STATUS_FAILURE;  \n\t\t\tbreak;\t\t\t\n\t}\t\n\n\treturn NDIS_STATUS_SUCCESS;\n\t\t\n}\n\nVOID RTMPSoftConstructIVHdr(\n\tIN\tUCHAR\t\t\tCipherAlg,\n\tIN\tUCHAR\t\t\tkey_id,\n\tIN\tPUCHAR\t\t\tpTxIv,\n\tOUT PUCHAR \t\t\tpHdrIv,\n\tOUT\tUINT8\t\t\t*hdr_iv_len)\n{\n\t*hdr_iv_len = 0;\n\n#ifdef WAPI_SUPPORT\n\tif (CipherAlg == CIPHER_SMS4)\n\t{\n\t\t/* Construct and insert WPI-SMS4 IV header to MPDU header */\n\t\tRTMPConstructWPIIVHdr(key_id, pTxIv, pHdrIv);\t\t\n\t\t*hdr_iv_len = LEN_WPI_IV_HDR;\n\t}\n\telse\n#endif /* WAPI_SUPPORT */\n\tif ((CipherAlg == CIPHER_WEP64) || (CipherAlg == CIPHER_WEP128))\n\t{\n\t\t/* Construct and insert 4-bytes WEP IV header to MPDU header */\n\t\tRTMPConstructWEPIVHdr(key_id, pTxIv, pHdrIv);\n\t\t*hdr_iv_len = LEN_WEP_IV_HDR;\t\n\t}\n\telse if (CipherAlg == CIPHER_TKIP)\n\t\t;\n\telse if (CipherAlg == CIPHER_AES)\n\t{\n\t\t/* Construct and insert 8-bytes CCMP header to MPDU header */\n\t\tRTMPConstructCCMPHdr(key_id, pTxIv, pHdrIv);\t\n\t\t*hdr_iv_len = LEN_CCMP_HDR;\n\t}\n\n}\n\nVOID RTMPSoftEncryptionAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tCipherAlg,\n\tIN\tPUCHAR\t\t\tpHdr,\n\tIN\tPUCHAR\t\t\tpSrcBufData,\n\tIN\tUINT32\t\t\tSrcBufLen,\n\tIN\tUCHAR\t\t\tKeyIdx,\n\tIN\tPCIPHER_KEY\t\tpKey,\n\tOUT\tUINT8\t\t\t*ext_len)\n{\n\t*ext_len = 0;\n\n#ifdef WAPI_SUPPORT\n#ifdef SOFT_ENCRYPT\n\tif (CipherAlg == CIPHER_SMS4)\n\t{\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);\n#endif\n\t\t/* Encrypt the MPDU data by software*/\n\t\tRTMPSoftEncryptSMS4(pHdr, \n\t\t\t\t\t\t\tpSrcBufData, \n\t\t\t\t\t\t\tSrcBufLen, \n\t\t\t\t\t\t\tKeyIdx,\n\t\t\t\t\t\t\tpKey->Key, \n\t\t\t\t\t\t\tpKey->TxTsc);\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);\n#endif\n\t\t*ext_len = LEN_WPI_MIC;\n\t}\n\telse\n#endif /* SOFT_ENCRYPT */\t\t\n#endif /* WAPI_SUPPORT */\n\tif ((CipherAlg == CIPHER_WEP64) || (CipherAlg == CIPHER_WEP128))\n\t{\n\t\t/* Encrypt the MPDU data by software*/\n\t\tRTMPSoftEncryptWEP(pAd, \n\t\t\t\t\t\t   pKey->TxTsc, \n\t\t\t\t\t\t   pKey, \n\t\t\t\t\t\t   pSrcBufData, \n\t\t\t\t\t\t   SrcBufLen);\n\t\t\t\t\n\t\t*ext_len = LEN_ICV;\t\n\t}\n\telse if (CipherAlg == CIPHER_TKIP)\n\t\t;\n\telse if (CipherAlg == CIPHER_AES)\n\t{\t\t\t\t\t\t\n\t\t/* Encrypt the MPDU data by software*/\n\t\tRTMPSoftEncryptCCMP(pAd, \n\t\t\t\t\t\t\tpHdr,\n\t\t\t\t\t\t\tpKey->TxTsc, \n\t\t\t\t\t\t\tpKey->Key, \n\t\t\t\t\t\t\tpSrcBufData, \n\t\t\t\t\t\t\tSrcBufLen);\n\t\t\t\t\n\t\t*ext_len = LEN_CCMP_MIC;\n\t}\n\n}\n\nPUINT8\tWPA_ExtractSuiteFromRSNIE(\n\t\tIN \tPUINT8\trsnie,\n\t\tIN \tUINT\trsnie_len,\n\t\tIN\tUINT8\ttype,\n\t\tOUT\tUINT8\t*count)\n{\n\tPEID_STRUCT pEid;\n\tINT\t\t\tlen;\n\tPUINT8\t\tpBuf;\n\tINT\t\t\toffset = 0;\n\n\tpEid = (PEID_STRUCT)rsnie;\n\tlen = rsnie_len - 2;\t/* exclude IE and length*/\n\tpBuf = (PUINT8)&pEid->Octet[0];\n\t\n\t/* set default value*/\n\t*count = 0;\n\n\t/* Check length*/\n\tif ((len <= 0) || (pEid->Len != len))\n\t{\n\t\tDBGPRINT_ERR((\"%s : The length is invalid\\n\", __FUNCTION__));\n\t\tgoto out;\n\t}\n\t\n\t/* Check WPA or WPA2*/\n\tif (pEid->Eid == IE_WPA)\n\t{\n\t\t/* Check the length */\n\t\tif (len < sizeof(RSNIE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The length is too short for WPA\\n\", __FUNCTION__));\n\t\t\tgoto out;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPRSNIE\tpRsnie;\n\t\t\tUINT16 \tu_cnt;\n\n\t\t\tpRsnie = (PRSNIE)pBuf;\n\t\t\tu_cnt = cpu2le16(pRsnie->ucount);\n\t\t\toffset = sizeof(RSNIE) + (LEN_OUI_SUITE * (u_cnt - 1));\n\n\t\t\tif (len < offset)\n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The expected lenght(%d) exceed the remaining length(%d) for WPA-RSN \\n\",\n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, offset, len));\n\t\t\t\tgoto out;\n\t\t}\n\t\t\telse\n\t\t\t{\n\t\t/* Get the group cipher*/\n\t\tif (type == GROUP_SUITE)\n\t\t{\n\t\t\t*count = 1;\n\t\t\treturn pRsnie->mcast;\n\t\t}\n\t\t/* Get the pairwise cipher suite*/\n\t\telse if (type == PAIRWISE_SUITE)\n\t\t{\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : The count of pairwise cipher is %d\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, u_cnt));\n\t\t\t\t\t\t*count = u_cnt;\t\t\t\n\t\t\treturn pRsnie->ucast[0].oui;\n\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\telse if (pEid->Eid == IE_RSN)\n\t{\n\t\tif (len < sizeof(RSNIE2))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The length is too short for WPA2\\n\", __FUNCTION__));\n\t\t\tgoto out;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPRSNIE2\tpRsnie2;\n\t\t\tUINT16 \tu_cnt;\n\n\t\t\tpRsnie2 = (PRSNIE2)pBuf;\n\t\t\tu_cnt = cpu2le16(pRsnie2->ucount);\n\t\t\toffset = sizeof(RSNIE2) + (LEN_OUI_SUITE * (u_cnt - 1));\n\n\t\t\tif (len < offset)\n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The expected lenght(%d) exceed the remaining length(%d) for WPA2-RSN \\n\",\n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, offset, len));\n\t\t\t\tgoto out;\n\t\t}\n\t\t\telse\n\t\t\t{\n\t\t/* Get the group cipher*/\n\t\tif (type == GROUP_SUITE)\n\t\t{\n\t\t\t*count = 1;\n\t\t\t\t\treturn pRsnie2->mcast;\n\t\t}\n\t\t/* Get the pairwise cipher suite*/\n\t\telse if (type == PAIRWISE_SUITE)\n\t\t{\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : The count of pairwise cipher is %d\\n\",\n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, u_cnt));\n\t\t\t\t\t*count = u_cnt;\t\t\t\n\t\t\t\t\treturn pRsnie2->ucast[0].oui;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : Unknown IE (%d)\\n\", __FUNCTION__, pEid->Eid));\n\t\tgoto out;\n\t}\n\n\t/* skip group cipher and pairwise cipher suite\t*/\n\tpBuf += offset;\n\tlen -= offset;\n\n\t/* Ready to extract the AKM information and its count */\n\tif (len < sizeof(RSNIE_AUTH))\n\t{\n\t\tDBGPRINT_ERR((\"%s : The length of AKM of RSN is too short\\n\", __FUNCTION__));\n\t\tgoto out;\n\t}\n\telse\n\t{\n\t\tPRSNIE_AUTH\tpAkm;\n\t\tUINT16 \t\ta_cnt;\n\n\t\t/* pointer to AKM count */\n\tpAkm = (PRSNIE_AUTH)pBuf;\n\t\ta_cnt = cpu2le16(pAkm->acount);\n\t\toffset = sizeof(RSNIE_AUTH) + (LEN_OUI_SUITE * (a_cnt - 1));\n\n\t\tif (len < offset)\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The expected lenght(%d) exceed the remaining length(%d) for AKM \\n\",\n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, offset, len));\n\t\t\tgoto out;\n\t}\n\t\telse\n\t\t{\n\t\t\t/* Get the AKM suite */\n\tif (type == AKM_SUITE)\n\t{\t\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : The count of AKM is %d\\n\",\n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, a_cnt));\n\t\t\t\t*count = a_cnt;\t\t\t\n\t\treturn pAkm->auth[0].oui;\n\t}\n\t\t}\n\t}\n\n\t/* For WPA1, the remaining shall be ignored. */\n\tif (pEid->Eid == IE_WPA)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : The remaining shall be ignored in WPA mode\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__));\n\t\tgoto out;\n\t}\n\n\t/* skip the AKM capability */\n\tpBuf += offset;\n\tlen -= offset;\n\n\t/* Parse the RSN Capabilities */\n\tif (len < sizeof(RSN_CAPABILITIES))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : The peer RSNIE doesn't include RSN-Cap\\n\", __FUNCTION__));\n\t\tgoto out;\n\t}\n\telse\n\t{\n\t\t/* Report the content of the RSN capabilities */\n\t\tif (type == RSN_CAP_INFO)\n\t\t{\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : Extract RSN Capabilities\\n\", __FUNCTION__));\n\t\t\t*count = 1;\t\n\t\t\treturn pBuf;\n\t\t}\n\n\t\t/* skip RSN capability (2-bytes) */\t\t\n\t\toffset = sizeof(RSN_CAPABILITIES);\n\t\tpBuf += offset;\n\t\tlen -= offset;\n\t}\n\n\t/* Extract PMKID-list field */\n\tif (len < sizeof(UINT16))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : The peer RSNIE doesn't include PMKID list Count\\n\", __FUNCTION__));\n\t\tgoto out;\n\t}\n\telse\n\t{\n\t\tUINT16 \tp_count;\n\t\tPUINT8\tpPmkidList = NULL;\n\t\t\n\t\tNdisMoveMemory(&p_count, pBuf, sizeof(UINT16));\n\t\tp_count = cpu2le16(p_count);\n\n\t\t/* Get count of the PMKID list */\n\t\tif (p_count > 0)\n\t\t{\t\t\n\t\t\tPRSNIE_PMKID \tpRsnPmkid;\n\n\t\t\t/* the expected length of PMKID-List field */\n\t\t\toffset = sizeof(RSNIE_PMKID) + (LEN_PMKID * (p_count - 1));\n\n\t\t\t/* sanity check about the length of PMKID-List field */\n\t\t\tif (len < offset)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The expected lenght(%d) exceed the remaining length(%d) in PMKID-field \\n\",\n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, offset, len));\n\t\t\t\tgoto out;\n\t\t\t}\n\n\t\t\t/* pointer to PMKID field */\n\t\t\tpRsnPmkid = (PRSNIE_PMKID)pBuf;\n\t\t\tpPmkidList = pRsnPmkid->pmkid[0].list;\n\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\t/* The PMKID field shall be without PMKID-List */\n\t\t\toffset = sizeof(UINT16);\n\t\t\tpPmkidList = NULL;\n\t\t}\n\n\n\t\t/* Extract PMKID list and its count */\n\t\tif (type == PMKID_LIST)\n\t\t{\n\t\t\t*count = p_count;\t\t\t\n\t\t\treturn pPmkidList;\n\t\t}\t\n\n\t\t/* skip the PMKID field */\n\t\tpBuf += offset;\n\t\tlen -= offset;\n\n\t}\n\n\nout:\n\t*count = 0;\t\n\treturn NULL;\n\t\n}\t\n\nVOID WpaShowAllsuite(\n\tIN \tPUINT8\trsnie,\n\tIN \tUINT\trsnie_len)\n{\n\tPUINT8 pSuite = NULL;\n\tUINT8 count;\n\n\thex_dump(\"RSNIE\", rsnie, rsnie_len);\n\t\n\t/* group cipher*/\n\tif ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, GROUP_SUITE, &count)) != NULL)\n\t{\t\t\t\n\t\thex_dump(\"group cipher\", pSuite, 4*count);\n\t}\n\n\t/* pairwise cipher*/\n\tif ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PAIRWISE_SUITE, &count)) != NULL)\n\t{\t\t\t\n\t\thex_dump(\"pairwise cipher\", pSuite, 4*count);\n\t}\n\n\t/* AKM*/\n\tif ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, AKM_SUITE, &count)) != NULL)\n\t{\t\t\t\n\t\thex_dump(\"AKM suite\", pSuite, 4*count);\n\t}\n\n\t/* PMKID*/\n\tif ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PMKID_LIST, &count)) != NULL)\n\t{\t\t\t\n\t\thex_dump(\"PMKID\", pSuite, LEN_PMKID);\n\t}\n\n}\t\n\nVOID RTMPInsertRSNIE(\n\tIN PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN PUINT8 rsnie_ptr,\n\tIN UINT8  rsnie_len,\n\tIN PUINT8 pmkid_ptr,\n\tIN UINT8  pmkid_len)\n{\n\tPUCHAR\tpTmpBuf;\n\tULONG \tTempLen = 0;\n\tUINT8 \textra_len = 0;\n\tUINT16 \tpmk_count = 0;\n\tUCHAR\tie_num;\n\tUINT8 \ttotal_len = 0;\t\n    UCHAR\tWPA2_OUI[3]={0x00,0x0F,0xAC};\n\n\tpTmpBuf = pFrameBuf;\n\n\t/* PMKID-List Must larger than 0 and the multiple of 16. */\n\tif (pmkid_len > 0 && ((pmkid_len & 0x0f) == 0))\n\t{\t\t\n\t\textra_len = sizeof(UINT16) + pmkid_len;\n\n\t\tpmk_count = (pmkid_len >> 4);\n\t\tpmk_count = cpu2le16(pmk_count);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : no PMKID-List included(%d).\\n\", __FUNCTION__, pmkid_len));\n\t}\n\n\tif (rsnie_len != 0)\n\t{\t\n\t\tie_num = IE_WPA;\n\t\ttotal_len = rsnie_len;\n\t\n\t\tif (NdisEqualMemory(rsnie_ptr + 2, WPA2_OUI, sizeof(WPA2_OUI)))\n\t\t{\t\n\t\t\tie_num = IE_RSN;\n\t\t\ttotal_len += extra_len;\n\t\t}\n\n\t\t/* construct RSNIE body */\n\t\tMakeOutgoingFrame(pTmpBuf,\t\t\t&TempLen,\n\t\t\t\t\t  \t  1,\t\t\t\t&ie_num,\n\t\t\t\t\t  \t  1,\t\t\t\t&total_len,\n\t\t\t\t\t  \t  rsnie_len,\t\trsnie_ptr,\n\t\t\t\t\t  \t  END_OF_ARGS);\n\n\t\tpTmpBuf += TempLen;\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\n\t\tif (ie_num == IE_RSN)\n\t\t{\n\t\t\t/* Insert PMKID-List field */\n\t\t\tif (extra_len > 0)\n\t\t\t{\n\t\t\t\tMakeOutgoingFrame(pTmpBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t\t  \t  2,\t\t\t\t\t\t&pmk_count,\n\t\t\t\t\t\t\t  \t  pmkid_len,\t\t\t\tpmkid_ptr,\n\t\t\t\t\t\t\t  \t  END_OF_ARGS);\n\t\t\t\n\t\t\t\tpTmpBuf += TempLen;\n\t\t\t\t*pFrameLen = *pFrameLen + TempLen;\n\t\t\t}\t\t\t\t\t\t\t\t\n\t\t}\n\t}\n\t\t\n\treturn; \n}\n\n\nVOID WPAInstallPairwiseKey(\n\tPRTMP_ADAPTER\t\tpAd,\n\tUINT8\t\t\t\tBssIdx,\n\tPMAC_TABLE_ENTRY\tpEntry,\n\tBOOLEAN\t\t\t\tbAE)\n{\n    NdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));   \n\n\t/* Assign the pairwise cipher algorithm\t*/\n    if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n        pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;\n    else if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n        pEntry->PairwiseKey.CipherAlg = CIPHER_AES;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : fails (wcid-%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, pEntry->Aid));\t\n\t\treturn;\n\t}\t\n\n\t/* Assign key material and its length */\n    pEntry->PairwiseKey.KeyLen = LEN_TK;\n    NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], LEN_TK);\n\tif (pEntry->PairwiseKey.CipherAlg == CIPHER_TKIP)\n\t{\n\t\tif (bAE)\n\t\t{\n\t\t    NdisMoveMemory(pEntry->PairwiseKey.TxMic, &pEntry->PTK[OFFSET_OF_AP_TKIP_TX_MIC], LEN_TKIP_MIC);\n\t\t    NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pEntry->PTK[OFFSET_OF_AP_TKIP_RX_MIC], LEN_TKIP_MIC);\n\t\t}\n\t\telse\n\t\t{\n\t\t    NdisMoveMemory(pEntry->PairwiseKey.TxMic, &pEntry->PTK[OFFSET_OF_STA_TKIP_TX_MIC], LEN_TKIP_MIC);\n\t\t    NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pEntry->PTK[OFFSET_OF_STA_TKIP_RX_MIC], LEN_TKIP_MIC);\n\t\t}\n\t}\n\n#ifdef SOFT_ENCRYPT\n\tif (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"===> SW_ENC ON(wcid=%d) \\n\", pEntry->Aid));\n\t\tNdisZeroMemory(pEntry->PairwiseKey.TxTsc, LEN_WPA_TSC);\n\t\tNdisZeroMemory(pEntry->PairwiseKey.RxTsc, LEN_WPA_TSC);\t\t\n\t}\t\n\telse\n#endif /* SOFT_ENCRYPT */\t\t\n\t{\n\t\t/* Add Pair-wise key to Asic */\n\t    AsicAddPairwiseKeyEntry(\n\t        pAd, \n\t        (UCHAR)pEntry->Aid, \n\t        &pEntry->PairwiseKey);\n\n\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\tBssIdx, \n\t\t\t\t\t\t\t\t0, \n\t\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg,\n\t\t\t\t\t\t\t\t(UCHAR)pEntry->Aid, \n\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\t\t\n\t}\n\t\n}\n\nVOID WPAInstallSharedKey(\n\tPRTMP_ADAPTER\t\tpAd,\n\tUINT8\t\t\t\tGroupCipher,\n\tUINT8\t\t\t\tBssIdx,\n\tUINT8\t\t\t\tKeyIdx,\n\tUINT8\t\t\t\tWcid,\n\tBOOLEAN\t\t\t\tbAE,\n\tPUINT8\t\t\t\tpGtk,\n\tUINT8\t\t\t\tGtkLen)\n{\n\tPCIPHER_KEY \tpSharedKey;\n\t\n\tif (BssIdx >= MAX_MBSSID_NUM(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The BSS-index(%d) is out of range for MBSSID link. \\n\", \n\t\t\t\t\t\t\t\t\t__FUNCTION__, BssIdx));\t\n\t\treturn;\n\t}\n\n\tpSharedKey = &pAd->SharedKey[BssIdx][KeyIdx];\n\tNdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY));\n\t\n\t/* Set the group cipher */\n\tif (GroupCipher == Ndis802_11GroupWEP40Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_WEP64;\n\telse if (GroupCipher == Ndis802_11GroupWEP104Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_WEP128;\n\telse if (GroupCipher == Ndis802_11Encryption2Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_TKIP;\n\telse if (GroupCipher == Ndis802_11Encryption3Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_AES;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : fails (IF/ra%d) \\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, BssIdx));\t\n\t\treturn;\n\t}\n\t\t\t\n\t/* Set the key material and its length */\n\tif (GroupCipher == Ndis802_11GroupWEP40Enabled || \n\t\tGroupCipher == Ndis802_11GroupWEP104Enabled)\n\t{\n\t\t/* Sanity check the length */\n\t\tif ((GtkLen != LEN_WEP64) && (GtkLen != LEN_WEP128))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : (IF/ra%d) WEP key invlaid(%d) \\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, BssIdx, GtkLen));\t\n\t\t\treturn;\n\t\t}\n\t\t\t\t\n\t\tpSharedKey->KeyLen = GtkLen;\n\t\tNdisMoveMemory(pSharedKey->Key, pGtk, GtkLen);\n\t}\n\telse\n\t{\n\t\t/* Sanity check the length */\n\t\tif (GtkLen < LEN_TK)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : (IF/ra%d) WPA key invlaid(%d) \\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, BssIdx, GtkLen));\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tpSharedKey->KeyLen = LEN_TK;\n\t\tNdisMoveMemory(pSharedKey->Key, pGtk, LEN_TK);\n\t\tif (pSharedKey->CipherAlg == CIPHER_TKIP)\n\t\t{\n\t\t\tif (bAE)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pSharedKey->TxMic, pGtk + 16, LEN_TKIP_MIC);\n\t\t\t\tNdisMoveMemory(pSharedKey->RxMic, pGtk + 24, LEN_TKIP_MIC);            \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pSharedKey->TxMic, pGtk + 24, LEN_TKIP_MIC);\n\t\t\t\tNdisMoveMemory(pSharedKey->RxMic, pGtk + 16, LEN_TKIP_MIC);            \n\t\t\t}\n\t\t}\n\t}\n    \n\t/* Update group key table(0x6C00) and group key mode(0x7000) */\n    AsicAddSharedKeyEntry(\n\t\t\t\tpAd, \n\t\t\t\tBssIdx, \n\t\t\t\tKeyIdx, \n\t\t\t\tpSharedKey);\n\n\t/* When Wcid isn't zero, it means that this is a Authenticator Role. \n\t   Only Authenticator entity needs to set HW IE/EIV table (0x6000)\n\t   and WCID attribute table (0x6800) for group key. */\n\tif (Wcid != 0)\n\t{\t\n\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\tBssIdx, \n\t\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\t\tpSharedKey->CipherAlg,\n\t\t\t\t\t\t\t\tWcid, \n\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\n\t}\n}\n\nVOID RTMPSetWcidSecurityInfo(\n\tPRTMP_ADAPTER\t\tpAd,\n\tUINT8\t\t\t\tBssIdx,\n\tUINT8\t\t\t\tKeyIdx,\n\tUINT8\t\t\t\tCipherAlg,\n\tUINT8\t\t\t\tWcid,\n\tUINT8\t\t\t\tKeyTabFlag)\n{\n\tUINT32\t\t\tIV = 0;\n\tUINT8\t\t\tIV_KEYID = 0;\n\t\n\t/* Prepare initial IV value */\n\tif (CipherAlg == CIPHER_WEP64 || CipherAlg == CIPHER_WEP128)\n\t{\n\t\tINT\ti;\t\n\t\tUCHAR\tTxTsc[LEN_WEP_TSC];\n\n\t\t/* Generate 3-bytes IV randomly for encryption using */\t\t\t\t\t\t\n\t\tfor(i = 0; i < LEN_WEP_TSC; i++)\n\t\t\tTxTsc[i] = RandomByte(pAd);\n\n\t\t/* Update HW IVEIV table */\n\t\tIV_KEYID = (KeyIdx << 6);\n\t\tIV = (IV_KEYID << 24) | \n\t\t\t (TxTsc[2] << 16) |\n\t\t\t (TxTsc[1] << 8) |\n\t\t\t (TxTsc[0]);\t\n\t}\n\telse if (CipherAlg == CIPHER_TKIP || CipherAlg == CIPHER_AES)\n\t{\n\t\t/* Set IVEIV as 1 in Asic -\n\t\tIn IEEE 802.11-2007 8.3.3.4.3 described :\n\t\tThe PN shall be implemented as a 48-bit monotonically incrementing\n\t\tnon-negative integer, initialized to 1 when the corresponding \n\t\ttemporal key is initialized or refreshed. */\t\n\t\tIV_KEYID = (KeyIdx << 6) | 0x20;\n\t\tIV = (IV_KEYID << 24) | 1;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : Unsupport cipher Alg (%d) for Wcid-%d \\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, CipherAlg, Wcid));\n\t\treturn;\n\t}\n\t/* Update WCID IV/EIV table */\n\tAsicUpdateWCIDIVEIV(pAd, Wcid, IV, 0);\n\t\t\n\t/* Update WCID attribute entry */\n\tAsicUpdateWcidAttributeEntry(pAd, \n\t\t\t\t\t\t\tBssIdx, \n\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\tCipherAlg,\n\t\t\t\t\t\t\tWcid,\n\t\t\t\t\t\t\tKeyTabFlag);\n\n}\n\n"
  },
  {
    "path": "src/common/cmm_wpa_adhoc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_wpa_adhoc.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n*/\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\n#include \"rt_config.h\"\n\nVOID Adhoc_RTMPGetTxTscFromAsic(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUCHAR\t\t\tapidx,\n\tOUT\tPUCHAR\t\t\tpTxTsc)\n{\n\tUSHORT\t\t\tWcid;\n\tUSHORT\t\t\toffset;\n\tUCHAR\t\t\tIvEiv[8];\n/*\tint\t\t\t\ti; */\n    UINT32\t\t\tIV = 0;\n    UINT32\t\t\tEIV = 0;\n\n\t/* Get apidx for this BSSID */\n\tGET_GroupKey_WCID(pAd, Wcid, apidx);\t\n\n\t/* Read IVEIV from Asic */\n\toffset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);\n\tNdisZeroMemory(IvEiv, 8);\n\tNdisZeroMemory(pTxTsc, 6);\n\t\t\t\n\tRTMP_IO_READ32(pAd, offset, &IV);\n\tRTMP_IO_READ32(pAd, offset + 4, &EIV);\n\n\t*pTxTsc \t= IV & 0x000000ff;\n\t*(pTxTsc+1) = IV & 0x0000ff00;\n\t*(pTxTsc+2) = EIV & 0x000000ff;\n\t*(pTxTsc+3) = EIV & 0x0000ff00;\n\t*(pTxTsc+4) = EIV & 0x00ff0000;\n\t*(pTxTsc+5) = EIV & 0xff000000;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Adhoc_RTMPGetTxTscFromAsic : WCID(%d) TxTsc 0x%02x-0x%02x-0x%02x-0x%02x-0x%02x-0x%02x \\n\", \n\t\t\t\t\t\t\t\t\tWcid, *pTxTsc, *(pTxTsc+1), *(pTxTsc+2), *(pTxTsc+3), *(pTxTsc+4), *(pTxTsc+5)));\n\t\t\t\n\n}\n\n/*\n    ==========================================================================\n    Description:\n       Start 4-way HS when rcv EAPOL_START which may create by our driver in assoc.c\n    Return:\n    ==========================================================================\n*/\nVOID Adhoc_WpaEAPOLStartAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem) \n{   \n    MAC_TABLE_ENTRY     *pEntry;\n    PHEADER_802_11      pHeader;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Adhoc_WpaEAPOLStartAction ===> \\n\"));\n    \n    pHeader = (PHEADER_802_11)Elem->Msg;\n    \n    /*For normaol PSK, we enqueue an EAPOL-Start command to trigger the process. */\n    if (Elem->MsgLen == 6)\n        pEntry = MacTableLookup(pAd, Elem->Msg);\n    else\n    {\n        pEntry = MacTableLookup(pAd, pHeader->Addr2);\n    }\n    \n    if (pEntry) \n    {    \n        PFOUR_WAY_HANDSHAKE_PROFILE pAuthenticator = &pEntry->WPA_Authenticator;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" PortSecured(%d), WpaState(%d), AuthMode(%d), PMKID_CacheIdx(%d) \\n\", pEntry->PortSecured, pAuthenticator->WpaState, pEntry->AuthMode, pEntry->PMKID_CacheIdx));\n\n        if ((pEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED)\n\t\t\t&& (pAuthenticator->WpaState < AS_PTKSTART)\n            && ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) || ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) && (pEntry->PMKID_CacheIdx != ENTRY_NOT_FOUND))))\n        {\n            pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n            pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n            /*Added by Eddy */\n            pAuthenticator->WpaState = AS_INITPSK;\n            pAuthenticator->MsgRetryCounter = 4;\n            Adhoc_WpaStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV);\n        }\n    }\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Check the validity of the received EAPoL frame\n    Return:\n        TRUE if all parameters are OK, \n        FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN Adhoc_PeerWpaMessageSanity (\n    IN \tPRTMP_ADAPTER \t\tpAd, \n    IN \tPEAPOL_PACKET \t\tpMsg, \n    IN \tULONG \t\t\t\tMsgLen, \n    IN \tUCHAR\t\t\t\tMsgType,\n\tIN  PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,    \n    IN \tMAC_TABLE_ENTRY  \t*pEntry)\n{\n\tUCHAR\t\t\tmic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE];\n\tBOOLEAN\t\t\tbReplayDiff = FALSE;\n\tBOOLEAN\t\t\tbWPA2 = FALSE;\n\tKEY_INFO\t\tEapolKeyInfo;\t\n\tUCHAR\t\t\tGroupKeyIndex = 0;\n\t\n\t\n\tNdisZeroMemory(mic, sizeof(mic));\n\tNdisZeroMemory(digest, sizeof(digest));\n\tNdisZeroMemory(KEYDATA, sizeof(KEYDATA));\n\tNdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo));\n\t\n\tNdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, sizeof(KEY_INFO));\n\n\t*((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo));\n\n\t/* Choose WPA2 or not */\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tbWPA2 = TRUE;\n\n\t/* 0. Check MsgType */\n\tif ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The message type is invalid(%d)! \\n\", MsgType));\n\t\treturn FALSE;\n\t}\n\t\t\t\t\n\t/* 1. Replay counter check */\n \tif (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1)\t/* For supplicant */\n    {\n    \t/* First validate replay counter, only accept message with larger replay counter. */\n\t\t/* Let equal pass, some AP start with all zero replay counter */\n\t\tUCHAR\tZeroReplay[LEN_KEY_DESC_REPLAY];\n\t\t\n        NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);\n\t\tif ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, p4WayProfile->ReplayCounter, LEN_KEY_DESC_REPLAY) != 1) &&\n\t\t\t(RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0))\n    \t{\n\t\t\tbReplayDiff = TRUE;\n    \t}\t\t\t\t\t\t\n \t}\n\telse if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)\t/* For authenticator */\n\t{\n\t\t/* check Replay Counter coresponds to MSG from authenticator, otherwise discard */\n    \tif (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, p4WayProfile->ReplayCounter, LEN_KEY_DESC_REPLAY))\n    \t{\t\n\t\t\tbReplayDiff = TRUE;\t        \n    \t}\n\t}\n\n\t/* Replay Counter different condition */\n\tif (bReplayDiff)\n\t{\n\t\t/* send wireless event - for replay counter different */\n\t\tRTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n\t\tif (MsgType < EAPOL_GROUP_MSG_1)\n\t\t{\n           \tDBGPRINT(RT_DEBUG_ERROR, (\"Replay Counter Different in pairwise msg %d of 4-way handshake!\\n\", MsgType));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Replay Counter Different in group msg %d of 2-way handshake!\\n\", (MsgType - EAPOL_PAIR_MSG_4)));\n\t\t}\n\t\t\n\t\thex_dump(\"Receive replay counter \", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\n\t\thex_dump(\"Current replay counter \", p4WayProfile->ReplayCounter, LEN_KEY_DESC_REPLAY);\t\n        return FALSE;\n\t}\n\n\t/* 2. Verify MIC except Pairwise Msg1 */\n\tif (MsgType != EAPOL_PAIR_MSG_1)\n\t{\n\t\tUCHAR\t\t\trcvd_mic[LEN_KEY_DESC_MIC];\n\t\tUINT\t\t\teapol_len = CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4;\n\n\t\t/* Record the received MIC for check later */\n\t\tNdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\t\tNdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\t\t\t\t\t\t\t\n        if (EapolKeyInfo.KeyDescVer == KEY_DESC_TKIP)\t/* TKIP */\n        {\t\n            RT_HMAC_MD5(p4WayProfile->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, eapol_len, mic, MD5_DIGEST_SIZE);\n        }\n        else if (EapolKeyInfo.KeyDescVer == KEY_DESC_AES)\t/* AES */\n        {                        \n            RT_HMAC_SHA1(p4WayProfile->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, eapol_len, digest, SHA1_DIGEST_SIZE);\n            NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);\n        }\n\t\n        if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))\n        {\n\t\t\t/* send wireless event - for MIC different */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \n\n\t\t\tif (MsgType < EAPOL_GROUP_MSG_1)\n\t\t\t{\n            \tDBGPRINT(RT_DEBUG_ERROR, (\"MIC Different in pairwise msg %d of 4-way handshake!\\n\", MsgType));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MIC Different in group msg %d of 2-way handshake!\\n\", (MsgType - EAPOL_PAIR_MSG_4)));\n\t\t\t}\n\t\n\t\t\thex_dump(\"Received MIC\", rcvd_mic, LEN_KEY_DESC_MIC);\n\t\t\thex_dump(\"Desired  MIC\", mic, LEN_KEY_DESC_MIC);\n\n\t\t\treturn FALSE;\n        }        \n\t}\n\n\t/* 1. Decrypt the Key Data field if GTK is included. */\n\t/* 2. Extract the context of the Key Data field if it exist. */\n\t/* The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is clear. */\n\t/* The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted. */\n\tif (CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen) > 0)\n\t{\t\t\n\t\t/* Decrypt this field */\n\t\tif ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))\n\t\t{\t\t\t\t\t\n\t\t\tif((EapolKeyInfo.KeyDescVer == KEY_DESC_AES))\n\t\t\t{\n\t\t\t\tUINT aes_unwrap_len = 0;\n\n   \t\t\t\tAES_Key_Unwrap(pMsg->KeyDesc.KeyData, \n                               CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen),\n  \t\t\t\t\t\t\t   &p4WayProfile->PTK[LEN_PTK_KCK], LEN_PTK_KEK, \n   \t\t\t\t\t\t\t   KEYDATA, &aes_unwrap_len);\n    \t\t\tSET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, aes_unwrap_len);\n\t\t\t} \n\t\t\telse\t  \n\t\t\t{\n\t\t\t\tTKIP_GTK_KEY_UNWRAP(&pEntry->PTK[LEN_PTK_KCK], \n\t\t\t\t\t\t\t\t\tpMsg->KeyDesc.KeyIv,\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tpMsg->KeyDesc.KeyData, \n\t\t\t\t\t\t\t\t\tCONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen),\n\t\t\t\t\t\t\t\t\tKEYDATA);\n\t\t\t}\t\n\n\t\t\tif (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))\n\t\t\t\tGroupKeyIndex = EapolKeyInfo.KeyIndex;\n\t\t\t\n\t\t}\n\t\telse if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2))\n\t\t{\t\t\t\t\t\n\t\t\tNdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen));\t\t\t     \n\t\t}\n\t\telse\n\t\t{\n\t\t\t\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t/* Parse Key Data field to */\n\t\t/* 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2) */\n\t\t/* 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2 */\n\t\t/* 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2) */\n\t\tif (!RTMPParseEapolKeyData(pAd, KEYDATA, \n\t\t\t\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen), \n\t\t\t\t\t\t\t\t  GroupKeyIndex, MsgType, bWPA2, pEntry))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\treturn TRUE;\n\t\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        This is state machine function. \n        When receiving EAPOL packets which is  for 802.1x key management. \n        Use both in WPA, and WPAPSK case. \n        In this function, further dispatch to different functions according to the received packet.  3 categories are : \n          1.  normal 4-way pairwisekey and 2-way groupkey handshake\n          2.  MIC error (Countermeasures attack)  report packet from STA.\n          3.  Request for pairwise/group key update from STA\n    Return:\n    ==========================================================================\n*/\nVOID Adhoc_WpaEAPOLKeyAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem) \n{\t\n    MAC_TABLE_ENTRY     *pEntry;    \n    PHEADER_802_11      pHeader;\n    PEAPOL_PACKET       pEapol_packet;\t\n\tKEY_INFO\t\t\tpeerKeyInfo;\n\tUINT\t\t\t\teapol_len;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Adhoc_WpaEAPOLKeyAction ===>\\n\"));\n\n    pHeader = (PHEADER_802_11)Elem->Msg;\n    pEapol_packet = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\teapol_len = CONV_ARRARY_TO_UINT16(pEapol_packet->Body_Len) + LENGTH_EAPOL_H;\n\n\tNdisZeroMemory((PUCHAR)&peerKeyInfo, sizeof(peerKeyInfo));\n\tNdisMoveMemory((PUCHAR)&peerKeyInfo, (PUCHAR)&pEapol_packet->KeyDesc.KeyInfo, sizeof(KEY_INFO));\n\n\t*((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo));\n\n    do\n    {\n        pEntry = MacTableLookup(pAd, pHeader->Addr2);\n\n\t\tif (!pEntry || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\t\t\n            break;\n\n\t\tif (pEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\tbreak;\t\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive EAPoL-Key frame from STA %02X-%02X-%02X-%02X-%02X-%02X\\n\", PRINT_MAC(pEntry->Addr)));\n\n\t\tif (eapol_len > Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H)\n\t\t{\n            DBGPRINT(RT_DEBUG_ERROR, (\"The length of EAPoL packet is invalid \\n\"));\n            break;\n        }\n\n        if (((pEapol_packet->ProVer != EAPOL_VER) && (pEapol_packet->ProVer != EAPOL_VER2)) || \n\t\t\t((pEapol_packet->KeyDesc.Type != WPA1_KEY_DESC) && (pEapol_packet->KeyDesc.Type != WPA2_KEY_DESC)))\n        {\n            DBGPRINT(RT_DEBUG_ERROR, (\"Key descripter does not match with WPA rule\\n\"));\n            break;\n        }\n\n\t\t/* The value 1 shall be used for all EAPOL-Key frames to and from a STA when */\n\t\t/* neither the group nor pairwise ciphers are CCMP for Key Descriptor 1. */\n\t\tif ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) && (peerKeyInfo.KeyDescVer != KEY_DESC_TKIP))\n        {\n\t        DBGPRINT(RT_DEBUG_ERROR, (\"Key descripter version not match(TKIP) \\n\"));\n    \t    break;\n    \t}\t\n\t\t/* The value 2 shall be used for all EAPOL-Key frames to and from a STA when */\n\t\t/* either the pairwise or the group cipher is AES-CCMP for Key Descriptor 2. */\n    \telse if ((pEntry->WepStatus == Ndis802_11Encryption3Enabled) && (peerKeyInfo.KeyDescVer != KEY_DESC_AES))\n    \t{\n        \tDBGPRINT(RT_DEBUG_ERROR, (\"Key descripter version not match(AES) \\n\"));\n        \tbreak;\n    \t}\n\n\t\t/* Check if this STA is in class 3 state and the WPA state is started */\n        if (pEntry->Sst == SST_ASSOC)\n        {\t\t\t \t\t\n\t\t\t/* Check the Key Ack (bit 7) of the Key Information to determine the Authenticator */\n\t\t\t/* or not. */\n\t\t\t/* An EAPOL-Key frame that is sent by the Supplicant in response to an EAPOL- */\n\t\t\t/* Key frame from the Authenticator must not have the Ack bit set. */\n\t\t\tif ((peerKeyInfo.KeyAck == 1) && (pEntry->WPA_Supplicant.WpaState >= AS_INITPSK))\n\t\t\t{\n\t\t\t\t/* The frame is snet by Authenticator. */\n\t\t\t\t/* So the Supplicant side shall handle this. */\n\t\t\t\tif ((peerKeyInfo.Secure == 0) && (peerKeyInfo.Request == 0) && \n\t\t\t\t\t(peerKeyInfo.Error == 0) && (peerKeyInfo.KeyType == PAIRWISEKEY))\n\t\t\t\t{\n\t\t\t\t\t/* Process 1. the message 1 of 4-way HS in WPA or WPA2 */\n\t\t\t\t\t/*\t\t\t  EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) */\n\t\t\t\t\t/*\t\t   2. the message 3 of 4-way HS in WPA */\n\t\t\t\t\t/*\t\t\t  EAPOL-Key(0,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) */\n\t\t\t\t\tif (peerKeyInfo.KeyMic == 0) {\n                    \tAdhoc_PeerPairMsg1Action(pAd, pEntry, Elem);\n\t                } else {\n    \t                Adhoc_PeerPairMsg3Action(pAd, pEntry, Elem);\n                    }\n\t\t\t\t}\n\t\t\t\telse if ((peerKeyInfo.Secure == 1) && \n\t\t\t\t\t\t (peerKeyInfo.KeyMic == 1) &&\n\t\t\t\t\t\t (peerKeyInfo.Request == 0) && \n\t\t\t\t\t\t (peerKeyInfo.Error == 0))\n\t\t\t\t{\n\t\t\t\t\t/* Process 1. the message 3 of 4-way HS in WPA2 */\n\t\t\t\t\t/*\t\t\t  EAPOL-Key(1,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) */\n\t\t\t\t\t/*\t\t   2. the message 1 of group KS in WPA or WPA2 */\n\t\t\t\t\t/*\t\t\t  EAPOL-Key(1,1,1,0,G,0,Key RSC,0, MIC,GTK[N]) */\n\t\t\t\t\tif (peerKeyInfo.KeyType == PAIRWISEKEY) {\n\t\t\t\t\t\tAdhoc_PeerPairMsg3Action(pAd, pEntry, Elem);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tAdhoc_PeerGroupMsg1Action(pAd, pEntry, Elem);\t\n                    }\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry->WPA_Authenticator.WpaState >= AS_INITPSK)\n\t\t\t{\t\t\t\n\t\t\t\t/* The frame is snet by Supplicant. */\n\t\t\t\t/* So the Authenticator side shall handle this. */\n\t\t\t\tif ((peerKeyInfo.KeyMic == 1) && \n\t\t\t\t\t(peerKeyInfo.Request == 1) && \n\t\t\t\t\t(peerKeyInfo.Error == 1))\n\t            {\t                \n\t\t\t\t\t/* The Supplicant uses a single Michael MIC Failure Report frame */\n\t\t\t\t\t/* to report a MIC failure event to the Authenticator. */\n\t\t\t\t\t/* A Michael MIC Failure Report is an EAPOL-Key frame with */\n\t\t\t\t\t/* the following Key Information field bits set to 1: */\n\t\t\t\t\t/* MIC bit, Error bit, Request bit, Secure bit. */\n\n\t                DBGPRINT(RT_DEBUG_ERROR, (\"Received an Michael MIC Failure Report, active countermeasure \\n\"));\n\t            }\n\t\t\t\telse if ((peerKeyInfo.Request == 0) && \n\t\t\t\t\t \t (peerKeyInfo.Error == 0) && \n\t\t\t\t\t \t (peerKeyInfo.KeyMic == 1))\n\t\t\t\t{\n\t\t\t\t\tif (peerKeyInfo.Secure == 0 && peerKeyInfo.KeyType == PAIRWISEKEY)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,Data) */\n\t\t\t\t\t\t/* Process 1. message 2 of 4-way HS in WPA or WPA2 */\n\t\t\t\t\t\t/*\t\t   2. message 4 of 4-way HS in WPA */\n\t\t\t\t\t\tif (CONV_ARRARY_TO_UINT16(pEapol_packet->KeyDesc.KeyDataLen) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAdhoc_PeerPairMsg4Action(pAd, pEntry, Elem);\n    \t            \t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAdhoc_PeerPairMsg2Action(pAd, pEntry, Elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (peerKeyInfo.Secure == 1 && peerKeyInfo.KeyType == PAIRWISEKEY)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* EAPOL-Key(1,1,0,0,P,0,0,0,MIC,0) */\n\t\t\t\t\t\t/* Process message 4 of 4-way HS in WPA2 */\n\t\t\t\t\t\tAdhoc_PeerPairMsg4Action(pAd, pEntry, Elem);\n\t\t\t\t\t}\n\t\t\t\t\telse if (peerKeyInfo.Secure == 1 && peerKeyInfo.KeyType == GROUPKEY)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* EAPOL-Key(1,1,0,0,G,0,0,0,MIC,0) */\n\t\t\t\t\t\t/* Process message 2 of Group key HS in WPA or WPA2 */\n/*\t\t\t\t\t\tAdhoc_PeerGroupMsg2Action(pAd, pEntry, &Elem->Msg[LENGTH_802_11], (Elem->MsgLen - LENGTH_802_11)); */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\t\t            \n        }\n    }while(FALSE);\n}\n\n\n\n/*\n    ==========================================================================\n    Description:\n        This is a function to initilize 4-way handshake\n        \n    Return:\n         \n    ==========================================================================\n*/\nVOID Adhoc_WpaStart4WayHS(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN ULONG\t\t\tTimeInterval) \n{\n    UCHAR           Header802_3[14];\n\tUCHAR   \t\t*mpool;\n    PEAPOL_PACKET\tpEapolFrame;\n\tPUINT8\t\t\tpBssid = NULL;\n    BOOLEAN         Cancelled;    \n\tUCHAR\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n    PFOUR_WAY_HANDSHAKE_PROFILE pAuthenticator = NULL;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"===> Adhoc_WpaStart4WayHS\\n\"));\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : The interface is closed...\\n\"));\n\t\treturn;\t\t\n\t}\n    if (!pEntry) {\n        DBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : The entry doesn't exist.\\n\"));\t\t\n        return;\n    }\n    pAuthenticator = &pEntry->WPA_Authenticator;\n\tpBssid = pAd->CommonCfg.Bssid;\n\tgroup_cipher = pAd->StaCfg.GroupCipher;\t\n\n     /* delete retry timer */\n    RTMPCancelTimer(&pAuthenticator->MsgRetryTimer, &Cancelled);\n\n\tif (pBssid == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : No corresponding Authenticator.\\n\"));\t\t\n\t\treturn;\n    }\n\n\t/* Check the status */\n    if ((pAuthenticator->WpaState > AS_PTKSTART) || (pAuthenticator->WpaState < AS_INITPMK))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"[ERROR]WPAStart4WayHS : Not expect calling=%d\\n\", pAuthenticator->WpaState));\n        return;\n    }\n\n\t/* Increment replay counter by 1 */\n\tADD_ONE_To_64BIT_VAR(pAuthenticator->ReplayCounter);\n\t\n\t/* Randomly generate ANonce */\n\tGenRandom(pAd, (UCHAR *)pBssid, pAuthenticator->ANonce);\t\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\t\n\t/* Construct EAPoL message - Pairwise Msg 1 */\n\t/* EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) */\n\tAdhoc_ConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_PAIR_MSG_1,\n\t\t\t\t\t  0,\t\t\t\t\t/* Default key index */\n\t\t\t\t\t  pAuthenticator->ANonce,\n\t\t\t\t\t  NULL,\t\t\t\t\t/* TxRSC */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* GTK */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* RSNIE */\n\t\t\t\t\t  0,\t\t\t\t\t/* RSNIE length */\n\t\t\t\t\t  pAuthenticator,\n\t\t\t\t\t  pEapolFrame);\n\n    if (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n    {\n        UCHAR\tdigest[80], PMK_key[20];\n        PKEY_DESCRIPTER  pKeyDesc = &pEapolFrame->KeyDesc;\n\n        pKeyDesc->KeyData[0] = 0xDD;\n        pKeyDesc->KeyData[2] = 0x00;\n        pKeyDesc->KeyData[3] = 0x0F;\n        pKeyDesc->KeyData[4] = 0xAC;\n        pKeyDesc->KeyData[5] = 0x04;\n\n        NdisMoveMemory(&PMK_key[0], \"PMK Name\", 8);\n        NdisMoveMemory(&PMK_key[8], pAd->CurrentAddress, MAC_ADDR_LEN);\n        NdisMoveMemory(&PMK_key[14], pEntry->Addr, MAC_ADDR_LEN);\n        RT_HMAC_SHA1(pAd->StaCfg.PMK, PMK_LEN, PMK_key, 20, digest, LEN_PMKID);\n\n        NdisMoveMemory(&pKeyDesc->KeyData[6], digest, LEN_PMKID);\n        pKeyDesc->KeyData[1] = 0x14;/* 4+LEN_PMKID */\n        INC_UINT16_TO_ARRARY(pKeyDesc->KeyDataLen, 6 + LEN_PMKID);    \t\t\t\n        INC_UINT16_TO_ARRARY(pEapolFrame->Body_Len, 6 + LEN_PMKID);\n    }\n        \n\t/* Make outgoing frame */\n    MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);            \n    RTMPToWirelessSta(pAd, pEntry, Header802_3, \n\t\t\t\t\t  LENGTH_802_3, (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, \n\t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\n\n\t/* Trigger Retry Timer */\n    pAuthenticator->MsgType = EAPOL_PAIR_MSG_1;\n    RTMPSetTimer(&pAuthenticator->MsgRetryTimer, TimeInterval);\n    \n\t/* Update State */\n    pAuthenticator->WpaState = AS_PTKSTART;\n\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== Adhoc_WpaStart4WayHS: send Msg1 of 4-way \\n\"));\n        \n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess Pairwise key Msg-1 of 4-way handshaking and send Msg-2 \n\n\tArguments:\n\t\tpAd\t\t\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID Adhoc_PeerPairMsg1Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n\tUCHAR\t\t\t\tPTK[80];\n\tUCHAR               Header802_3[14];\n\tPEAPOL_PACKET\t\tpMsg1;\n\tUINT            \tMsgLen;\t\n\tUCHAR   \t\t\t*mpool;\n    PEAPOL_PACKET\t\tpEapolFrame;\n\tPUINT8\t\t\t\tpCurrentAddr = NULL;\n\tPUINT8\t\t\t\tpmk_ptr = NULL;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\tPUINT8\t\t\t\trsnie_ptr = NULL;\n\tUCHAR\t\t\t\trsnie_len = 0;\n    PFOUR_WAY_HANDSHAKE_PROFILE pSupplicant = NULL;\n    \t   \n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> Adhoc_PeerPairMsg1Action \\n\"));\n\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\n\t\treturn;\n\n    if (ADHOC_ON(pAd) && (pEntry->WPA_Supplicant.WpaState == AS_PTKINITDONE))\n    {\n        MlmeDeAuthAction(pAd, pEntry, REASON_DEAUTH_STA_LEAVING, FALSE);\n        return;\n    }\n\n    pSupplicant = &pEntry->WPA_Supplicant;\n    \n    if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n        return;\n\t\n\tpCurrentAddr = pAd->CurrentAddress;\n\tpmk_ptr = pAd->StaCfg.PMK;\n\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\trsnie_ptr = pAd->StaCfg.RSN_IE;\n\trsnie_len = pAd->StaCfg.RSNIE_Len;\n\n\t/* Store the received frame */\n\tpMsg1 = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\t\n\t/* Sanity Check peer Pairwise message 1 - Replay Counter */\n\tif (Adhoc_PeerWpaMessageSanity(pAd, pMsg1, MsgLen, EAPOL_PAIR_MSG_1, pSupplicant, pEntry) == FALSE)\n\t\treturn;\n\n    \n\t/* Store Replay counter, it will use to verify message 3 and construct message 2 */\n\tNdisMoveMemory(pSupplicant->ReplayCounter, pMsg1->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\t\t\n        \n\t/* Store ANonce */\n\tNdisMoveMemory(pSupplicant->ANonce, pMsg1->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE);\n\t\t\n\t/* Generate random SNonce */\n\tGenRandom(pAd, (UCHAR *)pCurrentAddr, pSupplicant->SNonce);\n\n    /* Calculate PTK(ANonce, SNonce) */\n    WpaDerivePTK(pAd,\n    \t\t\tpmk_ptr,\n\t\t     \tpSupplicant->ANonce,\n\t\t\t \tpEntry->Addr, \n\t\t\t \tpSupplicant->SNonce,\n\t\t\t \tpCurrentAddr, \n\t\t\t    PTK, \n\t\t\t    LEN_PTK);\n\n\t/* Save key to PTK entry */\n\tNdisMoveMemory(pSupplicant->PTK, PTK, LEN_PTK);\n\t\t\n\t/* Update WpaState */\n\tpSupplicant->WpaState = AS_PTKINIT_NEGOTIATING;\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n\t/* Construct EAPoL message - Pairwise Msg 2 */\n\t/*  EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,DataKD_M2) */\n\tAdhoc_ConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_PAIR_MSG_2,  \n\t\t\t\t\t  0,\t\t\t\t/* DefaultKeyIdx */\n\t\t\t\t\t  pSupplicant->SNonce,\n\t\t\t\t\t  NULL,\t\t\t\t/* TxRsc */\n\t\t\t\t\t  NULL,\t\t\t\t/* GTK */\n\t\t\t\t\t  (UCHAR *)rsnie_ptr,\n\t\t\t\t\t  rsnie_len,\n\t\t\t\t\t  pSupplicant,\n\t\t\t\t\t  pEapolFrame);\n\n\t/* Make outgoing frame */\n\tMAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);\t\n\t\n\tRTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, sizeof(Header802_3), (PUCHAR)pEapolFrame, \n   \t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, \n   \t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\n\n\tos_free_mem(NULL, mpool);\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerPairMsg1Action: send Msg2 of 4-way \\n\"));\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        When receiving the second packet of 4-way pairwisekey handshake.\n    Return:\n    ==========================================================================\n*/\nVOID Adhoc_PeerPairMsg2Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{   \n\tUCHAR\t\t\t\tPTK[80];\n    BOOLEAN             Cancelled;\n    PHEADER_802_11      pHeader;\n\tUCHAR   \t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tPEAPOL_PACKET       pMsg2;\n\tUINT            \tMsgLen;\n    UCHAR               Header802_3[LENGTH_802_3];\n\tUCHAR \t\t\t\tTxTsc[6];\t\n\tPUINT8\t\t\t\tpBssid = NULL;\n\tPUINT8\t\t\t\tpmk_ptr = NULL;\n\tPUINT8\t\t\t\tgtk_ptr = NULL;\n\tUCHAR\t\t\t\tdefault_key = 0;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\tPUCHAR\t\t\t\trsnie_ptr = NULL;\n\tUCHAR\t\t\t\trsnie_len = 0;\n    PFOUR_WAY_HANDSHAKE_PROFILE pAuthenticator = NULL;    \n\n    DBGPRINT(RT_DEBUG_TRACE, (\"===> Adhoc_PeerPairMsg2Action \\n\"));\n\n    if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n        return;\n\n    pAuthenticator = &pEntry->WPA_Authenticator;\n        \n    if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n        return;\n\n    /* check Entry in valid State */\n    if (pAuthenticator->WpaState < AS_PTKSTART)\n        return;\n\n\tpBssid = pAd->CommonCfg.Bssid;\n\n\tpmk_ptr = pAd->StaCfg.PMK;\n\tgtk_ptr = pAd->StaCfg.GTK;\n\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\n\tdefault_key = pAd->StaCfg.DefaultKeyId;\n    if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n    {\n        rsnie_len = pAd->StaCfg.RSNIE_Len;\n        rsnie_ptr = pAd->StaCfg.RSN_IE;\n    }\n\t\n\n    /* pointer to 802.11 header */\n\tpHeader = (PHEADER_802_11)Elem->Msg;\n\n\t/* skip 802.11_header(24-byte) and LLC_header(8) */\n\tpMsg2 = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];       \n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n\t/* Store SNonce */\n\tNdisMoveMemory(pAuthenticator->SNonce, pMsg2->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE);\n\n\t/* Derive PTK */\n\tWpaDerivePTK(pAd, \n\t\t\t\t(UCHAR *)pmk_ptr,  \n\t\t\t\tpAuthenticator->ANonce, \t\t/* ANONCE */\n\t\t\t\tpAd->CurrentAddress, \n\t\t\t\tpAuthenticator->SNonce, \t\t/* SNONCE */\n\t\t\t\tpEntry->Addr, \n\t\t\t\tPTK, \n\t\t\t\tLEN_PTK); \t\t\n\n\t/* Get Group TxTsc form Asic */\n\tAdhoc_RTMPGetTxTscFromAsic(pAd, BSS0, TxTsc);\n\n   \tNdisMoveMemory(pAuthenticator->PTK, PTK, LEN_PTK);\n\n\t/* Sanity Check peer Pairwise message 2 - Replay Counter, MIC, RSNIE */\n\tif (Adhoc_PeerWpaMessageSanity(pAd, pMsg2, MsgLen, EAPOL_PAIR_MSG_2, pAuthenticator, pEntry) == FALSE)\n\t\treturn;\n\n    do\n    {\n\t\t/* Allocate memory for input */\n\t\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\t\tif (mpool == NULL)\n\t    {\n\t        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n\t        return;\n\t    }\n\n\t\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\t\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\t    \n        /* delete retry timer */\n\t\tRTMPCancelTimer(&pAuthenticator->MsgRetryTimer, &Cancelled);\n\n\t\t/* Increment replay counter by 1 */\n\t\tADD_ONE_To_64BIT_VAR(pAuthenticator->ReplayCounter);\n\n\t\t/* Construct EAPoL message - Pairwise Msg 3 */\n\t\tAdhoc_ConstructEapolMsg(pEntry,\n\t\t\t\t\t\t  group_cipher,\n\t\t\t\t\t\t  EAPOL_PAIR_MSG_3,\n\t\t\t\t\t\t  default_key,\n\t\t\t\t\t\t  pAuthenticator->ANonce,\n\t\t\t\t\t\t  TxTsc,\n\t\t\t\t\t\t  (UCHAR *)gtk_ptr,\n\t\t\t\t\t\t  (UCHAR *)rsnie_ptr,\n\t\t\t\t\t\t  rsnie_len,\n\t\t\t\t\t\t  pAuthenticator,\n\t\t\t\t\t\t  pEapolFrame);\n            \n        /* Make outgoing frame */\n        MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);            \n        RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, \n\t\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, \n\t\t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\n\n        pAuthenticator->MsgType = EAPOL_PAIR_MSG_3;\n\t\tRTMPSetTimer(&pAuthenticator->MsgRetryTimer, PEER_MSG3_RETRY_EXEC_INTV);\n\n\t\t/* Update State */\n        pAuthenticator->WpaState = AS_PTKINIT_NEGOTIATING;\n\n\t\tos_free_mem(NULL, mpool);\n\t\n    }while(FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerPairMsg2Action: send Msg3 of 4-way \\n\"));\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess Pairwise key Msg 3 of 4-way handshaking and send Msg 4 \n\n\tArguments:\n\t\tpAd\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID Adhoc_PeerPairMsg3Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n\tPHEADER_802_11\t\tpHeader;\n\tUCHAR               Header802_3[14];\n\tUCHAR\t\t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tPEAPOL_PACKET\t\tpMsg3;\n\tUINT            \tMsgLen;\t\t\t\t\n\tPUINT8\t\t\t\tpCurrentAddr = NULL;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n    PFOUR_WAY_HANDSHAKE_PROFILE pSupplicant = NULL;\n    \n\tDBGPRINT(RT_DEBUG_ERROR, (\"===> Adhoc_PeerPairMsg3Action \\n\"));\n\t\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\n\t\treturn;\n\n    pSupplicant = &pEntry->WPA_Supplicant;\n    if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG))\n\t\treturn;\n\n\tpCurrentAddr = pAd->CurrentAddress;\n\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\t\t\n\t/* Record 802.11 header & the received EAPOL packet Msg3 */\n\tpHeader\t= (PHEADER_802_11) Elem->Msg;\n\tpMsg3 = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n\t/* Sanity Check peer Pairwise message 3 - Replay Counter, MIC, RSNIE */\n\tif (Adhoc_PeerWpaMessageSanity(pAd, pMsg3, MsgLen, EAPOL_PAIR_MSG_3, pSupplicant, pEntry) == FALSE)\n\t\treturn;\n\t\n\t/* Save Replay counter, it will use construct message 4 */\n\tNdisMoveMemory(pSupplicant->ReplayCounter, pMsg3->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\n\n\t/* Double check ANonce */\n\tif (!NdisEqualMemory(pSupplicant->ANonce, pMsg3->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE))\n\t{\n\t\treturn;\n\t}\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n\t/* Construct EAPoL message - Pairwise Msg 4 */\n\tAdhoc_ConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_PAIR_MSG_4,  \n\t\t\t\t\t  0,\t\t\t\t\t/* group key index not used in message 4 */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* Nonce not used in message 4 */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* TxRSC not used in message 4 */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* GTK not used in message 4 */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* RSN IE not used in message 4 */\n\t\t\t\t\t  0,\n\t\t\t\t\t  pSupplicant,\n\t\t\t\t\t  pEapolFrame);\n\n\t/* open 802.1x port control and privacy filter */\n\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK || \n\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerPairMsg3Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \\n\",\n\t\t\t\t\t\t\t\t\tGetAuthMode(pEntry->AuthMode),\n\t\t\t\t\t\t\t\t\tGetEncryptType(pEntry->WepStatus),\n\t\t\t\t\t\t\t\t\tGetEncryptType(group_cipher)));\n\t}\n\n\t/* Init 802.3 header and send out */\n\tMAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);\t\n\tRTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, sizeof(Header802_3), \n\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, \n   \t\t\t\t\t  (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);\n\n\t/* Update WpaState */\n\tpSupplicant->WpaState = AS_PTKINITDONE;\n    Adhoc_Wpa4WayComplete(pAd, pEntry);\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerPairMsg3Action: send Msg4 of 4-way \\n\"));\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        When receiving the last packet of 4-way pairwisekey handshake.\n        Initilize 2-way groupkey handshake following.\n    Return:\n    ==========================================================================\n*/\nVOID Adhoc_PeerPairMsg4Action(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{    \n\tPEAPOL_PACKET   \tpMsg4;    \n    PHEADER_802_11      pHeader;\n    UINT            \tMsgLen;\n    BOOLEAN             Cancelled;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n    PFOUR_WAY_HANDSHAKE_PROFILE pAuthenticator = NULL; \n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"===> Adhoc_PeerPairMsg4Action\\n\"));\n\n    if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry))\n        return;\n\n    pAuthenticator = &pEntry->WPA_Authenticator;\n\n    do\n    {\t\t\n        if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG ) )\n            break;\n\n        if (pAuthenticator->WpaState < AS_PTKINIT_NEGOTIATING)\n            break;\n\n\t\tgroup_cipher = pAd->StaCfg.GroupCipher;\n \n        /* pointer to 802.11 header */\n        pHeader = (PHEADER_802_11)Elem->Msg;\n\n\t\t/* skip 802.11_header(24-byte) and LLC_header(8) */\n\t\tpMsg4 = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; \n\t\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n        /* Sanity Check peer Pairwise message 4 - Replay Counter, MIC */\n\t\tif (Adhoc_PeerWpaMessageSanity(pAd, pMsg4, MsgLen, EAPOL_PAIR_MSG_4, pAuthenticator, pEntry) == FALSE)\n\t\t\tbreak;\n\n        pAuthenticator->WpaState = AS_PTKINITDONE;\n\t\tRTMPCancelTimer(&pAuthenticator->MsgRetryTimer, &Cancelled);\n        RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n\n        Adhoc_Wpa4WayComplete(pAd, pEntry);\n        \n \t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA2 || \n\t\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t{\n\t\t\tpEntry->GTKState = REKEY_ESTABLISHED;\n\n\t\t\t/* send wireless event - for set key done WPA2 */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); \t \n\t\t}\n    }while(FALSE);\n    \n}\n\n\nVOID Adhoc_PeerGroupMsg1Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem) \n{\n    UCHAR               Header802_3[14];\n\tUCHAR\t\t\t\t*mpool;\n\tPEAPOL_PACKET\t\tpEapolFrame;\n\tPEAPOL_PACKET\t\tpGroup;\n\tUINT            \tMsgLen;\n\tUCHAR\t\t\t\tdefault_key = 0;\n\tUCHAR\t\t\t\tgroup_cipher = Ndis802_11WEPDisabled;\n\tPUINT8\t\t\t\tpCurrentAddr = NULL;\n    PFOUR_WAY_HANDSHAKE_PROFILE pSupplicant = NULL;\n    \t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"===> Adhoc_PeerGroupMsg1Action \\n\"));\n\n\tif ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry)))\n        return;\n\n    pSupplicant = &pEntry->WPA_Supplicant;\n\tpCurrentAddr = pAd->CurrentAddress;\n\tgroup_cipher = pAd->StaCfg.GroupCipher;\n\tdefault_key = pAd->StaCfg.DefaultKeyId;\n\t   \n\t/* Process Group Message 1 frame. skip 802.11 header(24) & LLC_SNAP header(8) */\n\tpGroup = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n\tMsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;\n\n\t/* Sanity Check peer group message 1 - Replay Counter, MIC, RSNIE */\n\tif (Adhoc_PeerWpaMessageSanity(pAd, pGroup, MsgLen, EAPOL_GROUP_MSG_1, pSupplicant, pEntry) == FALSE)\n\t\treturn;\n\n\t/* Save Replay counter, it will use to construct message 2 */\n\tNdisMoveMemory(pSupplicant->ReplayCounter, pGroup->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);\t\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpEapolFrame = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER);\n\n\n\t/* Construct EAPoL message - Group Msg 2 */\n    Adhoc_ConstructEapolMsg(pEntry,\n\t\t\t\t\t  group_cipher,\n\t\t\t\t\t  EAPOL_GROUP_MSG_2,  \n\t\t\t\t\t  default_key,\n\t\t\t\t\t  NULL,\t\t\t\t\t/* Nonce not used */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* TxRSC not used */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* GTK not used */\n\t\t\t\t\t  NULL,\t\t\t\t\t/* RSN IE not used */\n\t\t\t\t\t  0,\n\t\t\t\t\t  pSupplicant,\n\t\t\t\t\t  pEapolFrame);\n\t\t\t\t\t\n    /* open 802.1x port control and privacy filter */\n\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\n#ifdef CONFIG_STA_SUPPORT\n\tSTA_PORT_SECURED(pAd);\n    /* Indicate Connected for GUI */\n    pAd->IndicateMediaState = NdisMediaStateConnected;\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerGroupMsg1Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \\n\",\n\t\t\t\t\t\t\t\t\tGetAuthMode(pEntry->AuthMode),\n\t\t\t\t\t\t\t\t\tGetEncryptType(pEntry->WepStatus),\n\t\t\t\t\t\t\t\t\tGetEncryptType(group_cipher)));\n\t\t\n\t/* init header and Fill Packet and send Msg 2 to authenticator */\n\tMAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);\t\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tif ((pAd->OpMode == OPMODE_STA) && INFRA_ON(pAd) && \n\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&\n\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&\n\t\t(pAd->MlmeAux.Channel == pAd->CommonCfg.Channel))\n\t{\n\t\t/* Now stop the scanning and need to send the rekey packet out */\n\t\tpAd->MlmeAux.Channel = 0;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMPToWirelessSta(pAd, pEntry, \n\t\t\t\t\t  Header802_3, sizeof(Header802_3), \n\t\t\t\t\t  (PUCHAR)pEapolFrame, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, FALSE);\n\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== PeerGroupMsg1Action: send group message 2\\n\"));\n}\n\n\nVOID Adhoc_Wpa4WayComplete(\n    IN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry)\n{\n    PFOUR_WAY_HANDSHAKE_PROFILE pAuthenticator = NULL; \n    PFOUR_WAY_HANDSHAKE_PROFILE pSupplicant = NULL; \n\tINT compare_address;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"===> Adhoc_Wpa4WayComplete\\n\"));\n    \n    if (!pEntry)\n        return;\n\n    pAuthenticator = &pEntry->WPA_Authenticator;\n    pSupplicant = &pEntry->WPA_Supplicant;\n\n\tcompare_address = NdisCmpMemory(pAd->CurrentAddress, pEntry->Addr, MAC_ADDR_LEN);\n    if ((compare_address > 0) && (pAuthenticator->WpaState == AS_PTKINITDONE)) {\n        NdisMoveMemory(pEntry->PTK, pAuthenticator->PTK, 64);\n    } else if ((compare_address < 0) && (pSupplicant->WpaState == AS_PTKINITDONE)) {\n        NdisMoveMemory(pEntry->PTK, pSupplicant->PTK, 64);\n    } else\n        return;\n    \n#ifdef IWSC_SUPPORT\n\tif (pEntry)\n\t{\n\t\tPWSC_CTRL pWpsCtrl = &pAd->StaCfg.WscControl;\n\t\tPWSC_PEER_ENTRY pWscPeerEntry = NULL;\n\n\t\tRTMP_SEM_LOCK(&pWpsCtrl->WscConfiguredPeerListSemLock);\n\t\tpWscPeerEntry = WscFindPeerEntry(&pWpsCtrl->WscConfiguredPeerList, pEntry->Addr);\n\t\tif (pWscPeerEntry)\n\t\t{\n\t\t\tWscDelListEntryByMAC(&pWpsCtrl->WscConfiguredPeerList, pEntry->Addr);\n\t\t}\n\t\tRTMP_SEM_UNLOCK(&pWpsCtrl->WscConfiguredPeerListSemLock);\n\t}\n#endif /* IWSC_SUPPORT */\n    \n\tWPAInstallPairwiseKey(pAd, \n\t\t\t\t\t\t  BSS0, \n\t\t\t\t\t\t  pEntry, \n\t\t\t\t\t\t  FALSE);\n\n    pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n    pEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\n    STA_PORT_SECURED(pAd);\n    /* Indicate Connected for GUI */\n    pAd->IndicateMediaState = NdisMediaStateConnected;\n\n    DBGPRINT(RT_DEBUG_OFF, (\"Adhoc_Wpa4WayComplete - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\\n\\n\", \n\t\t\t\t\t\t\tpEntry->AuthMode, GetAuthMode(pEntry->AuthMode), \n\t\t\t\t\t\t\tpEntry->WepStatus, GetEncryptType(pEntry->WepStatus), \n\t\t\t\t\t\t\tpAd->StaCfg.GroupCipher, \n\t\t\t\t\t\t\tGetEncryptType(pAd->StaCfg.GroupCipher)));        \n}\n\n\nVOID Adhoc_WpaRetryExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    MAC_TABLE_ENTRY     *pEntry = (MAC_TABLE_ENTRY *)FunctionContext;\n\n    if ((pEntry) && IS_ENTRY_CLIENT(pEntry))\n    {\n        PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd;\n        PFOUR_WAY_HANDSHAKE_PROFILE pAuthenticator = &pEntry->WPA_Authenticator;\n       \n        DBGPRINT(RT_DEBUG_TRACE, (\"Adhoc_WPARetryExec---> ReTryCounter=%d, WpaState=%d \\n\", pAuthenticator->MsgRetryCounter, pAuthenticator->WpaState));\n\n        switch (pEntry->AuthMode)\n        {\n\t\t\tcase Ndis802_11AuthModeWPA:\n            case Ndis802_11AuthModeWPAPSK:\n\t\t\tcase Ndis802_11AuthModeWPA2:\n            case Ndis802_11AuthModeWPA2PSK:\n                if (pAuthenticator->MsgRetryCounter == 0)\n                {\n\t\t\t\t\t/* send wireless event - for pairwise key handshaking timeout */\n\t\t\t\t\tRTMPSendWirelessEvent(pAd, IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);\n\n                    pEntry->WPA_Authenticator.WpaState = AS_NOTUSE;\n#ifdef IWSC_SUPPORT\n\t\t\t\t\tif (pAd->StaCfg.WscControl.bWscTrigger == FALSE)\n#endif // IWSC_SUPPORT //\t\t\t\t\t\n\t\t\t\t\t{\n                    MlmeDeAuthAction(pAd, pEntry, REASON_4_WAY_TIMEOUT, FALSE);                    \n                    DBGPRINT(RT_DEBUG_ERROR, (\"Adhoc_WPARetryExec::MSG1 timeout\\n\"));\n\t\t\t\t\t}\n                \n                } \n                else if (pAuthenticator->MsgType == EAPOL_PAIR_MSG_1)\n                {\n                    if ((pAuthenticator->WpaState == AS_PTKSTART) || (pAuthenticator->WpaState == AS_INITPSK) || (pAuthenticator->WpaState == AS_INITPMK))\n                    {\n                        DBGPRINT(RT_DEBUG_TRACE, (\"Adhoc_WPARetryExec::ReTry MSG1 of 4-way Handshake\\n\"));\n                        Adhoc_WpaStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV);\n                    }                \n                }\n                else if (pAuthenticator->MsgType == EAPOL_PAIR_MSG_3)\n                {\n                \tpEntry->WPA_Authenticator.WpaState = AS_INITPSK;\n#ifdef IWSC_SUPPORT\n\t\t\t\t\tif (pAd->StaCfg.WscControl.bWscTrigger == FALSE)\n#endif // IWSC_SUPPORT //\t\n\t\t\t\t\t{\n                    MlmeDeAuthAction(pAd, pEntry, REASON_4_WAY_TIMEOUT, FALSE);\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Adhoc_WPARetryExec::Retry MSG3, TIMEOUT\\n\"));\n                }\n                }\n                break;\n            default:\n                break;\n        }\n        pAuthenticator->MsgRetryCounter--;        \n    }\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct EAPoL message for WPA handshaking \n\t\tIts format is below,\n\t\t\n\t\t+--------------------+\n\t\t| Protocol Version\t |  1 octet\n\t\t+--------------------+\n\t\t| Protocol Type\t\t |\t1 octet\t\n\t\t+--------------------+\n\t\t| Body Length\t\t |  2 octets\n\t\t+--------------------+\n\t\t| Descriptor Type\t |\t1 octet\n\t\t+--------------------+\n\t\t| Key Information    |\t2 octets\n\t\t+--------------------+\n\t\t| Key Length\t     |  1 octet\n\t\t+--------------------+\n\t\t| Key Repaly Counter |\t8 octets\n\t\t+--------------------+\n\t\t| Key Nonce\t\t     |  32 octets\n\t\t+--------------------+\n\t\t| Key IV\t\t\t |  16 octets\n\t\t+--------------------+\n\t\t| Key RSC\t\t\t |  8 octets\n\t\t+--------------------+\n\t\t| Key ID or Reserved |\t8 octets\n\t\t+--------------------+\n\t\t| Key MIC\t\t\t |\t16 octets\n\t\t+--------------------+\n\t\t| Key Data Length\t |\t2 octets\n\t\t+--------------------+\n\t\t| Key Data\t\t\t |\tn octets\n\t\t+--------------------+\n\t\t\n\n\tArguments:\n\t\tpAd\t\t\tPointer\tto our adapter\n\t\t\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID    Adhoc_ConstructEapolMsg(\n\tIN \tPMAC_TABLE_ENTRY\tpEntry,\n    IN \tUCHAR\t\t\t\tGroupKeyWepStatus,\n    IN \tUCHAR\t\t\t\tMsgType,  \n    IN\tUCHAR\t\t\t\tDefaultKeyIdx,\n\tIN \tUCHAR\t\t\t\t*KeyNonce,\n\tIN\tUCHAR\t\t\t\t*TxRSC,\n\tIN\tUCHAR\t\t\t\t*GTK,\n\tIN\tUCHAR\t\t\t\t*RSNIE,\n\tIN\tUCHAR\t\t\t\tRSNIE_Len,\n\tIN  PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,\n    OUT PEAPOL_PACKET       pMsg)\n{\n\tBOOLEAN\tbWPA2 = FALSE;\n\tUCHAR\tKeyDescVer;\n    PKEY_DESCRIPTER pKeyDesc = &pMsg->KeyDesc;\n\tPKEY_INFO       pKeyInfo = &pMsg->KeyDesc.KeyInfo;\n    \n\t/* Choose WPA2 or not */\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || \n\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tbWPA2 = TRUE;\n\t\t\n    /* Init Packet and Fill header */\n    pMsg->ProVer = EAPOL_VER;\n    pMsg->ProType = EAPOLKey;\n\n\t/* Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field */\n\tSET_UINT16_TO_ARRARY(pMsg->Body_Len, MIN_LEN_OF_EAPOL_KEY_MSG);\n\n\t/* Fill in EAPoL descriptor */\n\tif (bWPA2)\n\t\tpKeyDesc->Type = WPA2_KEY_DESC;\n\telse\n\t\tpKeyDesc->Type = WPA1_KEY_DESC;\n\t\t\t\n\t/* Key Descriptor Version (bits 0-2) specifies the key descriptor version type */\n\t/* Fill in Key information, refer to IEEE Std 802.11i-2004 page 78 */\n\t/* When either the pairwise or the group cipher is AES, the KEY_DESC_AES shall be used. */\n\tKeyDescVer = (((pEntry->WepStatus == Ndis802_11Encryption3Enabled) || \n\t        \t\t(GroupKeyWepStatus == Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES) : (KEY_DESC_TKIP));\n\n\tpKeyInfo->KeyDescVer = KeyDescVer;\n\n\t/* Specify Key Type as Group(0) or Pairwise(1) */\n\tif (MsgType >= EAPOL_GROUP_MSG_1)\n\t\tpKeyInfo->KeyType = GROUPKEY;\n\telse\n\t\tpKeyInfo->KeyType = PAIRWISEKEY;\n\n\t/* Specify Key Index, only group_msg1_WPA1 */\n\tif (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))\n\t\tpKeyInfo->KeyIndex = DefaultKeyIdx;\n\t\n\tif (MsgType == EAPOL_PAIR_MSG_3)\n\t\tpKeyInfo->Install = 1;\n\t\n\tif ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1))\n\t\tpKeyInfo->KeyAck = 1;\n\n\tif (MsgType != EAPOL_PAIR_MSG_1)\t\n\t\tpKeyInfo->KeyMic = 1;\n \n\tif ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) || (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1)))\n       \tpKeyInfo->Secure = 1;                   \n\n\t/* This subfield shall be set, and the Key Data field shall be encrypted, if\n\t   any key material (e.g., GTK or SMK) is included in the frame. */\n\tif (bWPA2 && ((MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1)))\n        pKeyInfo->EKD_DL = 1;            \n\n\t/* key Information element has done. */\n\t*(USHORT *)(pKeyInfo) = cpu2le16(*(USHORT *)(pKeyInfo));\n\n\t/* Fill in Key Length */\n\tif (bWPA2)\n\t{\n\t\t/* In WPA2 mode, the field indicates the length of pairwise key cipher, */\n\t\t/* so only pairwise_msg_1 and pairwise_msg_3 need to fill. */\n\t\tif ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3))\n\t\t\tpKeyDesc->KeyLength[1] = ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_TK : LEN_AES_TK);\n\t}\n\telse\n\t{\n\t\tif (MsgType >= EAPOL_GROUP_MSG_1)\n\t\t{\n\t\t\t/* the length of group key cipher */\n\t\t\tpKeyDesc->KeyLength[1] = ((GroupKeyWepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_GTK : LEN_AES_GTK);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* the length of pairwise key cipher */\n\t\t\tpKeyDesc->KeyLength[1] = ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_TK : LEN_AES_TK);\t\t\t\n\t\t}\t\t\t\t\n\t}\t\t\t\n\t\n \t/* Fill in replay counter */\n    NdisMoveMemory(pKeyDesc->ReplayCounter, p4WayProfile->ReplayCounter, LEN_KEY_DESC_REPLAY);\n\n\t/* Fill Key Nonce field */\n\t/* ANonce : pairwise_msg1 & pairwise_msg3 */\n\t/* SNonce : pairwise_msg2 */\n\t/* GNonce : group_msg1_wpa1 */\n\tif ((MsgType <= EAPOL_PAIR_MSG_3) || ((!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))))\n    \tNdisMoveMemory(pKeyDesc->KeyNonce, KeyNonce, LEN_KEY_DESC_NONCE);\n\n\t/* Fill key IV - WPA2 as 0, WPA1 as random */\n\tif (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))\n\t{\t\t\n\t\t/* Suggest IV be random number plus some number, */\n\t\tNdisMoveMemory(pKeyDesc->KeyIv, &KeyNonce[16], LEN_KEY_DESC_IV);\t\t\n        pKeyDesc->KeyIv[15] += 2;\t\t\n\t}\n\t\n    /* Fill Key RSC field */\n    /* It contains the RSC for the GTK being installed. */\n\tif ((TxRSC != NULL) && ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1)))\n\t{\t\t\n        NdisMoveMemory(pKeyDesc->KeyRsc, TxRSC, 6);\n\t}\n\n\t/* Clear Key MIC field for MIC calculation later */\n    NdisZeroMemory(pKeyDesc->KeyMic, LEN_KEY_DESC_MIC);\n\t\n\tAdhoc_ConstructEapolKeyData(pEntry,\n\t\t\t\t\t\t  GroupKeyWepStatus, \n\t\t\t\t\t\t  KeyDescVer,\n\t\t\t\t\t\t  MsgType, \n\t\t\t\t\t\t  DefaultKeyIdx, \n\t\t\t\t\t\t  GTK,\n\t\t\t\t\t\t  RSNIE,\n\t\t\t\t\t\t  RSNIE_Len,\n\t\t\t\t\t\t  p4WayProfile,\n\t\t\t\t\t\t  pMsg);\n \n\t/* Calculate MIC and fill in KeyMic Field except Pairwise Msg 1. */\n\tif (MsgType != EAPOL_PAIR_MSG_1)\n        CalculateMIC(KeyDescVer, p4WayProfile->PTK, pMsg);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> ConstructEapolMsg for %s %s\\n\", ((bWPA2) ? \"WPA2\" : \"WPA\"), GetEapolMsgType(MsgType)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\t     Body length = %d \\n\", CONV_ARRARY_TO_UINT16(pMsg->Body_Len)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\t     Key length  = %d \\n\", CONV_ARRARY_TO_UINT16(pKeyDesc->KeyLength)));\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tConstruct the Key Data field of EAPoL message \n\n\tArguments:\n\t\tpAd\t\t\tPointer\tto our adapter\n\t\tElem\t\tMessage body\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tAdhoc_ConstructEapolKeyData(\n\tIN\tPMAC_TABLE_ENTRY\tpEntry,\n\tIN\tUCHAR\t\t\tGroupKeyWepStatus,\n\tIN\tUCHAR\t\t\tkeyDescVer,\n\tIN \tUCHAR\t\t\tMsgType,\n\tIN\tUCHAR\t\t\tDefaultKeyIdx,\n\tIN\tUCHAR\t\t\t*GTK,\n\tIN\tUCHAR\t\t\t*RSNIE,\n\tIN\tUCHAR\t\t\tRSNIE_LEN,\n\tIN  PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,\t\n\tOUT PEAPOL_PACKET   pMsg)\n{\n\tUCHAR\t\t*mpool, *Key_Data, *eGTK;  \t  \n\tULONG\t\tdata_offset;\n\tBOOLEAN\t\tbWPA2Capable = FALSE;\n\tBOOLEAN\t\tGTK_Included = FALSE;\n    PKEY_DESCRIPTER pKeyDesc = &pMsg->KeyDesc;\n    \n\t/* Choose WPA2 or not */\n\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || \n\t\t(pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\tbWPA2Capable = TRUE;\n\n\tif (MsgType == EAPOL_PAIR_MSG_1 || \n\t\tMsgType == EAPOL_PAIR_MSG_4 || \n\t\tMsgType == EAPOL_GROUP_MSG_2)\n\t\treturn;\n \n\t/* allocate memory pool */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, 1500);\n\n    if (mpool == NULL)\n\t\treturn;\n        \n\t/* eGTK Len = 512 */\n\teGTK = (UCHAR *) ROUND_UP(mpool, 4);\n\t/* Key_Data Len = 512 */\n\tKey_Data = (UCHAR *) ROUND_UP(eGTK + 512, 4);\n\n\tNdisZeroMemory(Key_Data, 512);\n\tSET_UINT16_TO_ARRARY(pKeyDesc->KeyDataLen, 0);\n\tdata_offset = 0;\n\t\n\t/* Encapsulate RSNIE in pairwise_msg2 & pairwise_msg3 */\n\tif (RSNIE_LEN && ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3)))\n\t{\n\t\tPUINT8\tpmkid_ptr = NULL;\n\t\tUINT8 \tpmkid_len = 0;\n\n\t\tRTMPInsertRSNIE(&Key_Data[data_offset], \n\t\t\t\t\t\t&data_offset,\n\t\t\t\t\t\tRSNIE, \n\t\t\t\t\t\tRSNIE_LEN, \n\t\t\t\t\t\tpmkid_ptr, \n\t\t\t\t\t\tpmkid_len);\n\t}\n\n\t/* Encapsulate GTK */\n\t/* Only for pairwise_msg3_WPA2 and group_msg1 */\n\tif ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable) || (MsgType == EAPOL_GROUP_MSG_1))\n\t{\n\t\tUINT8\tgtk_len;\n\n\t\t/* Decide the GTK length */ \n\t\tif (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n\t\t\tgtk_len = LEN_AES_GTK;\n\t\telse\n\t\t\tgtk_len = LEN_TKIP_GTK;\n\t\t\n\t\t/* Insert GTK KDE format in WAP2 mode */\n\t\tif (bWPA2Capable)\n\t\t{\n\t\t\t/* Construct the common KDE format */\n\t\t\tWPA_ConstructKdeHdr(KDE_GTK, 2 + gtk_len, &Key_Data[data_offset]);\n\t\t\tdata_offset += sizeof(KDE_HDR);\n\n\t\t\t/* GTK KDE format - 802.11i-2004  Figure-43x */\n\t        Key_Data[data_offset] = (DefaultKeyIdx & 0x03);\n\t        Key_Data[data_offset + 1] = 0x00;\t/* Reserved Byte */\n\t        data_offset += 2;\n\n\t\t}\n\n\t\t/* Fill in GTK */\n\t\tNdisMoveMemory(&Key_Data[data_offset], GTK, gtk_len);\n\t\tdata_offset += gtk_len;\n\n\n\n\t\tGTK_Included = TRUE;\n\t}\n\n\t/* If the Encrypted Key Data subfield (of the Key Information field) \n\t   is set, the entire Key Data field shall be encrypted. */\n\t/* This whole key-data field shall be encrypted if a GTK is included. */\n\t/* Encrypt the data material in key data field with KEK */\n\tif (GTK_Included)\n\t{\n\t\tif ((keyDescVer == KEY_DESC_AES))\n\t\t{\n\t\t\tUCHAR \tremainder = 0;\n\t\t\tUCHAR\tpad_len = 0;\t\t\t\n\t\t\tUINT\twrap_len =0;\n\n\t\t\t/* Key Descriptor Version 2 or 3: AES key wrap, defined in IETF RFC 3394, */\n\t\t\t/* shall be used to encrypt the Key Data field using the KEK field from */\n\t\t\t/* the derived PTK. */\n\n\t\t\t/* If the Key Data field uses the NIST AES key wrap, then the Key Data field */\n\t\t\t/* shall be padded before encrypting if the key data length is less than 16 */\n\t\t\t/* octets or if it is not a multiple of 8. The padding consists of appending */\n\t\t\t/* a single octet 0xdd followed by zero or more 0x00 octets. */\n\t\t\tif ((remainder = data_offset & 0x07) != 0)\n\t\t\t{\n\t\t\t\tINT\t\ti;\n\t\t\t\n\t\t\t\tpad_len = (8 - remainder);\n\t\t\t\tKey_Data[data_offset] = 0xDD;\n\t\t\t\tfor (i = 1; i < pad_len; i++)\n\t\t\t\t\tKey_Data[data_offset + i] = 0;\n\n\t\t\t\tdata_offset += pad_len;\n\t\t\t}\n   \t\t\tAES_Key_Wrap(Key_Data, (UINT) data_offset, \n   \t\t\t\t\t\t &p4WayProfile->PTK[LEN_PTK_KCK], LEN_PTK_KEK, \n   \t\t\t\t\t\t eGTK, &wrap_len);\t\n   \t\t\tdata_offset = wrap_len;\n\t\t}\n\t\telse\n\t\t{\n   \t\t\tTKIP_GTK_KEY_WRAP(&p4WayProfile->PTK[LEN_PTK_KCK], \n   \t\t\t\t\t\t\t\tpMsg->KeyDesc.KeyIv,\t\t\t\t\t\t\t\t\t\n   \t\t\t\t\t\t\t\tKey_Data, \n   \t\t\t\t\t\t\t\tdata_offset,\n   \t\t\t\t\t\t\t\teGTK);\n\t\t}\n\n\t\tNdisMoveMemory(pKeyDesc->KeyData, eGTK, data_offset);\n\t}\n\telse\n\t{\n\t\tNdisMoveMemory(pKeyDesc->KeyData, Key_Data, data_offset);\n\t}\n\n\t/* Update key data length field and total body length */\n\tSET_UINT16_TO_ARRARY(pKeyDesc->KeyDataLen, data_offset);\n\tINC_UINT16_TO_ARRARY(pMsg->Body_Len, data_offset);\n\n\tos_free_mem(NULL, mpool);\n\n}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\n"
  },
  {
    "path": "src/common/crypt_aes.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    AES\n\n    Abstract:\n    RFC 3394: Advanced Encryption Standard (AES) Key Wrap Algorithm\n    RFC 3601: Counter with CBC-MAC (CCM)\n    RFC 4493: The AES-CMAC Algorithm\n    FIPS PUBS 197: ADVANCED ENCRYPTION STANDARD (AES)\n    NIST 800-38A: Recommendation for Block Cipher Modes of Operation\n    NIST 800-38C: The CCM Mode for Authentication and Confidentiality \n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/05/19      Create AES-Key Wrap    \n    Eddy        2009/04/20      Create AES-CMAC, AES-CCM    \n    Eddy        2009/01/19      Create AES-128, AES-192, AES-256, AES-CBC\n***************************************************************************/\n\n#include \"crypt_aes.h\"\n\n\n/* The value given by [x^(i-1),{00},{00},{00}], with x^(i-1) being powers of x in the field GF(2^8). */\nstatic const UINT32 aes_rcon[] = {\n\t0x00000000, 0x01000000, 0x02000000, 0x04000000, \n    0x08000000, 0x10000000, 0x20000000, 0x40000000, \n    0x80000000, 0x1B000000, 0x36000000};\n\nstatic const UINT8 aes_sbox_enc[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7 ,0xab, 0x76, /* 0 */\n    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4 ,0x72, 0xc0, /* 1 */\n    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8 ,0x31, 0x15, /* 2 */\n    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27 ,0xb2, 0x75, /* 3 */\n    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3 ,0x2f, 0x84, /* 4 */\n    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c ,0x58, 0xcf, /* 5 */\n    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c ,0x9f, 0xa8, /* 6 */\n    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff ,0xf3, 0xd2, /* 7 */\n    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d ,0x19, 0x73, /* 8 */\n    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e ,0x0b, 0xdb, /* 9 */\n    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95 ,0xe4, 0x79, /* a */\n    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a ,0xae, 0x08, /* b */\n    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd ,0x8b, 0x8a, /* c */\n    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1 ,0x1d, 0x9e, /* d */\n    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55 ,0x28, 0xdf, /* e */\n    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54 ,0xbb, 0x16, /* f */\n};\n\nstatic const UINT8 aes_sbox_dec[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, /* 0 */\n    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /* 1 */\n    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /* 2 */\n    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /* 3 */\n    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /* 4 */\n    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /* 5 */\n    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, /* 6 */\n    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, /* 7 */\n    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, /* 8 */\n    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, /* 9 */\n    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, /* a */\n    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, /* b */\n    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, /* c */\n    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, /* d */\n    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, /* e */\n    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, /* f */\n};\n\n/* ArrayIndex*{02} */\nstatic const UINT8 aes_mul_2[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, /* 0 */\n    0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, /* 1 */\n    0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, /* 2 */\n    0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, /* 3 */\n    0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, /* 4 */\n    0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, /* 5 */\n    0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, /* 6 */\n    0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, /* 7 */\n    0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, /* 8 */\n    0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, /* 9 */\n    0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, /* a */\n    0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, /* b */\n    0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, /* c */\n    0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, /* d */\n    0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, /* e */\n    0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5, /* f */\n};\n\n/* ArrayIndex*{03} */\nstatic const UINT8 aes_mul_3[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, /* 0 */\n    0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, /* 1 */\n    0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, /* 2 */\n    0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, /* 3 */\n    0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, /* 4 */\n    0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, /* 5 */\n    0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, /* 6 */\n    0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, /* 7 */\n    0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a, /* 8 */\n    0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba, /* 9 */\n    0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, /* a */\n    0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, /* b */\n    0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, /* c */\n    0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, /* d */\n    0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, /* e */\n    0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a, /* f */\n};\n\n/* ArrayIndex*{09} */\nstatic const UINT8 aes_mul_9[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, /* 0 */\n    0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, /* 1 */\n    0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, /* 2 */\n    0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, /* 3 */\n    0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, /* 4 */\n    0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, /* 5 */\n    0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, /* 6 */\n    0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, /* 7 */\n    0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, /* 8 */\n    0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, /* 9 */\n    0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, /* a */\n    0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, /* b */\n    0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, /* c */\n    0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, /* d */\n    0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, /* e */\n    0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46, /* f */\n};\n\n/* ArrayIndex*{0b} */\nstatic const UINT8 aes_mul_b[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, /* 0 */\n    0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, /* 1 */\n    0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, /* 2 */\n    0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, /* 3 */\n    0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, /* 4 */\n    0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, /* 5 */\n    0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, /* 6 */\n    0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, /* 7 */\n    0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, /* 8 */\n    0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, /* 9 */\n    0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, /* a */\n    0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, /* b */\n    0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, /* c */\n    0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, /* d */\n    0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, /* e */\n    0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3, /* f */\n};\n\n/* ArrayIndex*{0d} */\nstatic const UINT8 aes_mul_d[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, /* 0 */\n    0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, /* 1 */\n    0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, /* 2 */\n    0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, /* 3 */\n    0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, /* 4 */\n    0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, /* 5 */\n    0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, /* 6 */\n    0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, /* 7 */\n    0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, /* 8 */\n    0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, /* 9 */\n    0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, /* a */\n    0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, /* b */\n    0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, /* c */\n    0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, /* d */\n    0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, /* e */\n    0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97, /* f */\n};\n\n/* ArrayIndex*{0e} */\nstatic const UINT8 aes_mul_e[] = {\n  /*  0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f    */\n    0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, /* 0 */\n    0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, /* 1 */\n    0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, /* 2 */\n    0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, /* 3 */\n    0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, /* 4 */\n    0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, /* 5 */\n    0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, /* 6 */\n    0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, /* 7 */\n    0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, /* 8 */\n    0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, /* 9 */\n    0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, /* a */\n    0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, /* b */\n    0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, /* c */\n    0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, /* d */\n    0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, /* e */\n    0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, /* f */\n};\n\n/* For AES_CMAC */\n#define AES_MAC_LENGTH 16 /* 128-bit string */\nstatic UINT8 Const_Zero[16] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\nstatic UINT8 Const_Rb[16] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87};\n   \n/*\n========================================================================\nRoutine Description:\n    AES key expansion (key schedule)\n\nArguments:\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n    paes_ctx         Pointer to AES_CTX_STRUC\n\nReturn Value:\n    paes_ctx         Retrun the KeyWordExpansion of AES_CTX_STRUC\n\nNote:\n    Pseudo code for key expansion\n    ------------------------------------------\n       Nk = (key length/4);\n       \n       while (i < Nk)\n           KeyWordExpansion[i] = word(key[4*i], key[4*i + 1], key[4*i + 2], key[4*i + 3]);\n           i++;\n       end while\n\n       while (i < ((key length/4 + 6 + 1)*4) )\n           temp = KeyWordExpansion[i - 1];\n           if (i % Nk ==0)\n               temp = SubWord(RotWord(temp)) ^ Rcon[i/Nk];\n           else if ((Nk > 6) && (i % 4 == 4))\n               temp = SubWord(temp);\n           end if\n\n           KeyWordExpansion[i] = KeyWordExpansion[i - Nk]^ temp;\n           i++;\n       end while\n========================================================================\n*/\nVOID RT_AES_KeyExpansion (\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    INOUT AES_CTX_STRUC *paes_ctx)\n{\n    UINT KeyIndex = 0;\n    UINT NumberOfWordOfKey, NumberOfWordOfKeyExpansion;\n    UINT8  TempWord[AES_KEY_ROWS], Temp;\n    UINT32 Temprcon;\n\n    NumberOfWordOfKey = KeyLength >> 2;\n    while (KeyIndex < NumberOfWordOfKey)\n    {\n        paes_ctx->KeyWordExpansion[0][KeyIndex] = Key[4*KeyIndex];\n        paes_ctx->KeyWordExpansion[1][KeyIndex] = Key[4*KeyIndex + 1];\n        paes_ctx->KeyWordExpansion[2][KeyIndex] = Key[4*KeyIndex + 2];\n        paes_ctx->KeyWordExpansion[3][KeyIndex] = Key[4*KeyIndex + 3];\n        KeyIndex++;\n    }\n\n    NumberOfWordOfKeyExpansion = ((UINT) AES_KEY_ROWS) * ((KeyLength >> 2) + 6 + 1);    \n    while (KeyIndex < NumberOfWordOfKeyExpansion)\n    {\n        TempWord[0] = paes_ctx->KeyWordExpansion[0][KeyIndex - 1];\n        TempWord[1] = paes_ctx->KeyWordExpansion[1][KeyIndex - 1];\n        TempWord[2] = paes_ctx->KeyWordExpansion[2][KeyIndex - 1];\n        TempWord[3] = paes_ctx->KeyWordExpansion[3][KeyIndex - 1];\n        if ((KeyIndex % NumberOfWordOfKey) == 0) {\n            Temprcon = aes_rcon[KeyIndex/NumberOfWordOfKey];\n            Temp = aes_sbox_enc[TempWord[1]]^((Temprcon >> 24) & 0xff);\n            TempWord[1] = aes_sbox_enc[TempWord[2]]^((Temprcon >> 16) & 0xff);\n            TempWord[2] = aes_sbox_enc[TempWord[3]]^((Temprcon >>  8) & 0xff);\n            TempWord[3] = aes_sbox_enc[TempWord[0]]^((Temprcon      ) & 0xff);\n            TempWord[0] = Temp;\n        } else if ((NumberOfWordOfKey > 6) && ((KeyIndex % NumberOfWordOfKey) == 4)) {\n            Temp = aes_sbox_enc[TempWord[0]];\n            TempWord[1] = aes_sbox_enc[TempWord[1]];\n            TempWord[2] = aes_sbox_enc[TempWord[2]];\n            TempWord[3] = aes_sbox_enc[TempWord[3]];\n            TempWord[0] = Temp;\n        }\n        paes_ctx->KeyWordExpansion[0][KeyIndex] = paes_ctx->KeyWordExpansion[0][KeyIndex - NumberOfWordOfKey]^TempWord[0];\n        paes_ctx->KeyWordExpansion[1][KeyIndex] = paes_ctx->KeyWordExpansion[1][KeyIndex - NumberOfWordOfKey]^TempWord[1];\n        paes_ctx->KeyWordExpansion[2][KeyIndex] = paes_ctx->KeyWordExpansion[2][KeyIndex - NumberOfWordOfKey]^TempWord[2];\n        paes_ctx->KeyWordExpansion[3][KeyIndex] = paes_ctx->KeyWordExpansion[3][KeyIndex - NumberOfWordOfKey]^TempWord[3];\n        KeyIndex++;\n    }\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES encryption\n\nArguments:\n    PlainBlock       The block of plain text, 16 bytes(128 bits) each block\n    PlainBlockSize   The length of block of plain text in bytes\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n    CipherBlockSize  The length of allocated cipher block in bytes\n\nReturn Value:\n    CipherBlock      Return cipher text\n    CipherBlockSize  Return the length of real used cipher block in bytes\n\nNote:\n    Reference to FIPS-PUB 197\n    1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits)\n    2. Transfer the plain block to state block \n    3. Main encryption rounds\n    4. Transfer the state block to cipher block\n    ------------------------------------------\n       NumberOfRound = (key length / 4) + 6;\n       state block = plain block;\n       \n       AddRoundKey(state block, key);\n       for round = 1 to NumberOfRound\n           SubBytes(state block)\n           ShiftRows(state block)\n           MixColumns(state block)\n           AddRoundKey(state block, key);\n       end for\n\n       SubBytes(state block)\n       ShiftRows(state block)\n       AddRoundKey(state block, key);\n\n       cipher block = state block;\n========================================================================\n*/\nVOID RT_AES_Encrypt (\n    IN UINT8 PlainBlock[],\n    IN UINT PlainBlockSize,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 CipherBlock[],\n    INOUT UINT *CipherBlockSize)\n{\n/*    AES_CTX_STRUC aes_ctx;\n*/\n\tAES_CTX_STRUC *paes_ctx = NULL;\n    UINT RowIndex, ColumnIndex;\n    UINT RoundIndex, NumberOfRound = 0;\n    UINT8 Temp, Row0, Row1, Row2, Row3;\n\n    /*   \n     * 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) \n     */\n    if (PlainBlockSize != AES_BLOCK_SIZES) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"RT_AES_Encrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\\n\", \n            PlainBlockSize, AES_BLOCK_SIZES));\n        return;\n    }\n    if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"RT_AES_Encrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH));\n        return;\n    }\n    if (*CipherBlockSize < AES_BLOCK_SIZES) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"RT_AES_Encrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\\n\", \n            *CipherBlockSize, AES_BLOCK_SIZES));\n        return;\n    }\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&paes_ctx, sizeof(AES_CTX_STRUC));\n\tif (paes_ctx == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n    /* \n     * 2. Transfer the plain block to state block \n     */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] = PlainBlock[RowIndex + 4*ColumnIndex];\n\n    /* \n     *  3. Main encryption rounds\n     */\n    RT_AES_KeyExpansion(Key, KeyLength, paes_ctx);\n    NumberOfRound = (KeyLength >> 2) + 6;\n\n    /* AES_AddRoundKey */\n    RoundIndex = 0;\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] ^= paes_ctx->KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex];\n\n    for (RoundIndex = 1; RoundIndex < NumberOfRound;RoundIndex++)\n    {\n        /* AES_SubBytes */\n        for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n            for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n                paes_ctx->State[RowIndex][ColumnIndex] = aes_sbox_enc[paes_ctx->State[RowIndex][ColumnIndex]];\n\n        /* AES_ShiftRows */\n        Temp = paes_ctx->State[1][0];\n        paes_ctx->State[1][0] = paes_ctx->State[1][1];\n        paes_ctx->State[1][1] = paes_ctx->State[1][2];\n        paes_ctx->State[1][2] = paes_ctx->State[1][3];\n        paes_ctx->State[1][3] = Temp;\n        Temp = paes_ctx->State[2][0];\n        paes_ctx->State[2][0] = paes_ctx->State[2][2];\n        paes_ctx->State[2][2] = Temp;\n        Temp = paes_ctx->State[2][1];\n        paes_ctx->State[2][1] = paes_ctx->State[2][3];\n        paes_ctx->State[2][3] = Temp;\n        Temp = paes_ctx->State[3][3];\n        paes_ctx->State[3][3] = paes_ctx->State[3][2];\n        paes_ctx->State[3][2] = paes_ctx->State[3][1];\n        paes_ctx->State[3][1] = paes_ctx->State[3][0];\n        paes_ctx->State[3][0] = Temp;\n\n        /* AES_MixColumns */\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n        {\n            Row0 = paes_ctx->State[0][ColumnIndex];\n            Row1 = paes_ctx->State[1][ColumnIndex];\n            Row2 = paes_ctx->State[2][ColumnIndex];\n            Row3 = paes_ctx->State[3][ColumnIndex];\n            paes_ctx->State[0][ColumnIndex] = aes_mul_2[Row0]^aes_mul_3[Row1]^Row2^Row3;\n            paes_ctx->State[1][ColumnIndex] = Row0^aes_mul_2[Row1]^aes_mul_3[Row2]^Row3;\n            paes_ctx->State[2][ColumnIndex] = Row0^Row1^aes_mul_2[Row2]^aes_mul_3[Row3];\n            paes_ctx->State[3][ColumnIndex] = aes_mul_3[Row0]^Row1^Row2^aes_mul_2[Row3];\n        }\n\n        /* AES_AddRoundKey */\n        for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n            for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n                paes_ctx->State[RowIndex][ColumnIndex] ^= paes_ctx->KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex];\n    }\n\n    /* AES_SubBytes */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] = aes_sbox_enc[paes_ctx->State[RowIndex][ColumnIndex]];\n    /* AES_ShiftRows */\n    Temp = paes_ctx->State[1][0];\n    paes_ctx->State[1][0] = paes_ctx->State[1][1];\n    paes_ctx->State[1][1] = paes_ctx->State[1][2];\n    paes_ctx->State[1][2] = paes_ctx->State[1][3];\n    paes_ctx->State[1][3] = Temp;\n    Temp = paes_ctx->State[2][0];\n    paes_ctx->State[2][0] = paes_ctx->State[2][2];\n    paes_ctx->State[2][2] = Temp;\n    Temp = paes_ctx->State[2][1];\n    paes_ctx->State[2][1] = paes_ctx->State[2][3];\n    paes_ctx->State[2][3] = Temp;\n    Temp = paes_ctx->State[3][3];\n    paes_ctx->State[3][3] = paes_ctx->State[3][2];\n    paes_ctx->State[3][2] = paes_ctx->State[3][1];\n    paes_ctx->State[3][1] = paes_ctx->State[3][0];\n    paes_ctx->State[3][0] = Temp;\n    /* AES_AddRoundKey */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] ^= paes_ctx->KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex];\n\n    /* \n     * 4. Transfer the state block to cipher block \n     */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            CipherBlock[RowIndex + 4*ColumnIndex] = paes_ctx->State[RowIndex][ColumnIndex];\n\n    *CipherBlockSize = ((UINT) AES_STATE_ROWS)*((UINT) AES_STATE_COLUMNS);\n\n\tif (paes_ctx != NULL)\n\t\tos_free_mem(NULL, paes_ctx);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES decryption\n\nArguments:\n    CipherBlock      The block of cipher text, 16 bytes(128 bits) each block\n    CipherBlockSize  The length of block of cipher text in bytes\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n    PlainBlockSize   The length of allocated plain block in bytes\n\nReturn Value:\n    PlainBlock       Return plain text\n    PlainBlockSize  Return the length of real used plain block in bytes\n\nNote:\n    Reference to FIPS-PUB 197\n    1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits)\n    2. Transfer the cipher block to state block \n    3. Main decryption rounds\n    4. Transfer the state block to plain block\n    ------------------------------------------\n       NumberOfRound = (key length / 4) + 6;\n       state block = cipher block;\n       \n       AddRoundKey(state block, key);\n       for round = NumberOfRound to 1\n           InvSubBytes(state block)\n           InvShiftRows(state block)\n           InvMixColumns(state block)\n           AddRoundKey(state block, key);\n       end for\n\n       InvSubBytes(state block)\n       InvShiftRows(state block)\n       AddRoundKey(state block, key);\n\n       plain block = state block;\n========================================================================\n*/\nVOID RT_AES_Decrypt (\n    IN UINT8 CipherBlock[],\n    IN UINT CipherBlockSize,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 PlainBlock[],\n    INOUT UINT *PlainBlockSize)\n{\n/*    AES_CTX_STRUC aes_ctx;\n*/\n\tAES_CTX_STRUC *paes_ctx = NULL;\n    UINT RowIndex, ColumnIndex;\n    UINT RoundIndex, NumberOfRound = 0;\n    UINT8 Temp, Row0, Row1, Row2, Row3;\n\n    /*   \n     * 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) \n     */\n    if (*PlainBlockSize < AES_BLOCK_SIZES) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"RT_AES_Decrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\\n\", \n            *PlainBlockSize, AES_BLOCK_SIZES));\n        return;\n    }\n    if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"RT_AES_Decrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH));\n        return;\n    }\n    if (CipherBlockSize != AES_BLOCK_SIZES) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"RT_AES_Decrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\\n\", \n            CipherBlockSize, AES_BLOCK_SIZES));\n        return;\n    }\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&paes_ctx, sizeof(AES_CTX_STRUC));\n\tif (paes_ctx == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n    /* \n     * 2. Transfer the cipher block to state block \n     */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] = CipherBlock[RowIndex + 4*ColumnIndex];\n\n    /* \n     *  3. Main decryption rounds\n     */\n    RT_AES_KeyExpansion(Key, KeyLength, paes_ctx);\n    NumberOfRound = (KeyLength >> 2) + 6;\n\n    /* AES_AddRoundKey */\n    RoundIndex = NumberOfRound;\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] ^= paes_ctx->KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex];\n\n    for (RoundIndex = (NumberOfRound - 1); RoundIndex > 0 ;RoundIndex--)\n    {\n        /* AES_InvShiftRows */\n        Temp = paes_ctx->State[1][3];\n        paes_ctx->State[1][3] = paes_ctx->State[1][2];\n        paes_ctx->State[1][2] = paes_ctx->State[1][1];\n        paes_ctx->State[1][1] = paes_ctx->State[1][0];\n        paes_ctx->State[1][0] = Temp;\n        Temp = paes_ctx->State[2][0];\n        paes_ctx->State[2][0] = paes_ctx->State[2][2];\n        paes_ctx->State[2][2] = Temp;\n        Temp = paes_ctx->State[2][1];\n        paes_ctx->State[2][1] = paes_ctx->State[2][3];\n        paes_ctx->State[2][3] = Temp;\n        Temp = paes_ctx->State[3][0];\n        paes_ctx->State[3][0] = paes_ctx->State[3][1];\n        paes_ctx->State[3][1] = paes_ctx->State[3][2];\n        paes_ctx->State[3][2] = paes_ctx->State[3][3];\n        paes_ctx->State[3][3] = Temp;\n\n        /* AES_InvSubBytes */\n        for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n            for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n                paes_ctx->State[RowIndex][ColumnIndex] = aes_sbox_dec[paes_ctx->State[RowIndex][ColumnIndex]];\n\n        /* AES_AddRoundKey */\n        for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n            for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n                paes_ctx->State[RowIndex][ColumnIndex] ^= paes_ctx->KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex];\n\n        /* AES_InvMixColumns */\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n        {\n            Row0 = paes_ctx->State[0][ColumnIndex];\n            Row1 = paes_ctx->State[1][ColumnIndex];\n            Row2 = paes_ctx->State[2][ColumnIndex];\n            Row3 = paes_ctx->State[3][ColumnIndex];\n            paes_ctx->State[0][ColumnIndex] = aes_mul_e[Row0]^aes_mul_b[Row1]^aes_mul_d[Row2]^aes_mul_9[Row3];\n            paes_ctx->State[1][ColumnIndex] = aes_mul_9[Row0]^aes_mul_e[Row1]^aes_mul_b[Row2]^aes_mul_d[Row3];\n            paes_ctx->State[2][ColumnIndex] = aes_mul_d[Row0]^aes_mul_9[Row1]^aes_mul_e[Row2]^aes_mul_b[Row3];\n            paes_ctx->State[3][ColumnIndex] = aes_mul_b[Row0]^aes_mul_d[Row1]^aes_mul_9[Row2]^aes_mul_e[Row3];\n        }\n    }\n\n    /* AES_InvShiftRows */\n    Temp = paes_ctx->State[1][3];\n    paes_ctx->State[1][3] = paes_ctx->State[1][2];\n    paes_ctx->State[1][2] = paes_ctx->State[1][1];\n    paes_ctx->State[1][1] = paes_ctx->State[1][0];\n    paes_ctx->State[1][0] = Temp;\n    Temp = paes_ctx->State[2][0];\n    paes_ctx->State[2][0] = paes_ctx->State[2][2];\n    paes_ctx->State[2][2] = Temp;\n    Temp = paes_ctx->State[2][1];\n    paes_ctx->State[2][1] = paes_ctx->State[2][3];\n    paes_ctx->State[2][3] = Temp;\n    Temp = paes_ctx->State[3][0];\n    paes_ctx->State[3][0] = paes_ctx->State[3][1];\n    paes_ctx->State[3][1] = paes_ctx->State[3][2];\n    paes_ctx->State[3][2] = paes_ctx->State[3][3];\n    paes_ctx->State[3][3] = Temp;\n    /* AES_InvSubBytes */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] = aes_sbox_dec[paes_ctx->State[RowIndex][ColumnIndex]];\n    /* AES_AddRoundKey */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            paes_ctx->State[RowIndex][ColumnIndex] ^= paes_ctx->KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex];\n\n    /* \n     * 4. Transfer the state block to plain block \n     */\n    for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++)\n        for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++)\n            PlainBlock[RowIndex + 4*ColumnIndex] = paes_ctx->State[RowIndex][ColumnIndex];\n\n    *PlainBlockSize = ((UINT) AES_STATE_ROWS)*((UINT) AES_STATE_COLUMNS);\n\n\tif (paes_ctx != NULL)\n\t\tos_free_mem(NULL, paes_ctx);\n}\n\n\n\n/*\n========================================================================\nRoutine Description:\n    AES-CBCMAC \n\nArguments:\n    Payload        Data\n    PayloadLength  The length of data in bytes\n    Key              Cipher key\n    KeyLength        The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes)\n    Nonce            Nonce\n    NonceLength      The length of nonce in bytes\n    AAD              Additional authenticated data\n    AADLength        The length of AAD in bytes\n    MACLength        The length of MAC in bytes\n\nReturn Value:\n    MACText       The mac\n\nNote:\n    Reference to RFC 3601, and NIST 800-38C.\n========================================================================\n*/\nVOID AES_CCM_MAC (\n    IN UINT8 Payload[],\n    IN UINT  PayloadLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    IN UINT8 Nonce[],\n    IN UINT  NonceLength,\n    IN UINT8 AAD[],\n    IN UINT  AADLength,\n    IN UINT  MACLength,\n    OUT UINT8 MACText[])\n{\n    UINT8 Block[AES_BLOCK_SIZES], Block_MAC[AES_BLOCK_SIZES];\n    UINT  Block_Index = 0, ADD_Index = 0, Payload_Index = 0;\n    UINT  Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0;\n\n    /*   \n     * 1. Formatting of the Control Information and the Nonce\n     */\n    NdisZeroMemory(Block, AES_BLOCK_SIZES);\n    if (AADLength > 0)\n        Block[0] |= 0x40; /* Set bit 6 to 1 */\n    Temp_Value = ((MACLength - 2) >> 1) << 3; /* Set bit 3-5 to (t-2)/2 */\n    Block[0] |= Temp_Value;\n    Temp_Value = (15 - NonceLength) - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */\n    Block[0] |= Temp_Value;\n    for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++)\n        Block[Temp_Index + 1] = Nonce[Temp_Index];\n    if (NonceLength < 12)\n        Block[12] = (PayloadLength >> 24) & 0xff;\n    if (NonceLength < 13)\n        Block[13] = (PayloadLength >> 16) & 0xff;\n    Block[14] = (PayloadLength >> 8) & 0xff;\n    Block[15] = PayloadLength & 0xff;\n\n    NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES);\n    Temp_Length = sizeof(Block_MAC);\n    RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, Block_MAC, &Temp_Length);\n\n    /*\n     * 2. Formatting of the Associated Data\n     *      If 0 < AADLength < (2^16 - 2^8), AData_Length = 2\n     *      If (2^16 - 2^8) < AADLength < 2^32, AData_Length = 6\n     *      If 2^32 < AADLength < 2^64, AData_Length = 10 (not implement)\n     */    \n    NdisZeroMemory(Block, AES_BLOCK_SIZES);\n    if ((AADLength > 0) && (AADLength < 0xFF00)) {\n        Block_Index = 2;\n        Block[0] = (AADLength >> 8) & 0xff;\n        Block[1] = AADLength & 0xff;\n    } else {\n        Block_Index = 6;\n        Block[2] = (AADLength >> 24) & 0xff;\n        Block[3] = (AADLength >> 16) & 0xff;\n        Block[4] = (AADLength >> 8) & 0xff;\n        Block[5] = AADLength & 0xff;\n    }\n\n    while (ADD_Index < AADLength) \n    {\n        Copy_Length = AADLength - ADD_Index;\n        if (Copy_Length > AES_BLOCK_SIZES)\n            Copy_Length = AES_BLOCK_SIZES;\n        if ((Copy_Length + Block_Index) > AES_BLOCK_SIZES) {\n            Copy_Length = AES_BLOCK_SIZES - Block_Index;\n        }\n        for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++)\n            Block[Temp_Index + Block_Index] = AAD[ADD_Index + Temp_Index];        \n        for (Temp_Index = 0; Temp_Index < AES_BLOCK_SIZES; Temp_Index++)\n            Block[Temp_Index] ^= Block_MAC[Temp_Index];\n        NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES);\n        Temp_Length = sizeof(Block_MAC);        \n        RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, Block_MAC, &Temp_Length);\n        ADD_Index += Copy_Length;\n        Block_Index = 0;        \n        NdisZeroMemory(Block, AES_BLOCK_SIZES);\n    }\n\n    /*\n     * 3. Calculate the MAC (MIC)\n     */\n    while (Payload_Index < PayloadLength) \n    {\n        NdisZeroMemory(Block, AES_BLOCK_SIZES);\n        Copy_Length = PayloadLength - Payload_Index;\n        if (Copy_Length > AES_BLOCK_SIZES)\n            Copy_Length = AES_BLOCK_SIZES;\n        for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++)\n            Block[Temp_Index] = Payload[Payload_Index + Temp_Index];        \n        for (Temp_Index = 0; Temp_Index < AES_BLOCK_SIZES; Temp_Index++)\n            Block[Temp_Index] ^= Block_MAC[Temp_Index];\n        NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES);\n        Temp_Length = sizeof(Block_MAC);\n        RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, Block_MAC, &Temp_Length);\n        Payload_Index += Copy_Length;\n    }\n    for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++)\n        MACText[Temp_Index] = Block_MAC[Temp_Index];\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES-CBCMAC Encryption\n\nArguments:\n    PlainText        Plain text\n    PlainTextLength  The length of plain text in bytes\n    Key              Cipher key\n    KeyLength        The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes)\n    Nonce            Nonce\n    NonceLength      The length of nonce in bytes\n    AAD              Additional authenticated data\n    AADLength        The length of AAD in bytes\n    MACLength        The length of MAC in bytes\n    CipherTextLength    The length of allocated memory spaces in bytes\n\nReturn Value:\n    CipherText       The ciphertext\n    CipherTextLength Return the length of the ciphertext in bytes\n\nFunction Value:\n     0: Success\n    -1: The key length must be 16 bytes.\n    -2: A valid nonce length is 7-13 bytes.\n    -3: The MAC length  must be 4, 6, 8, 10, 12, 14, or 16 bytes.\n    -4: The CipherTextLength is not enough.\n\nNote:\n    Reference to RFC 3601, and NIST 800-38C.\n    Here, the implement of AES_CCM is suitable for WI_FI.\n========================================================================\n*/\nINT AES_CCM_Encrypt (\n    IN UINT8 PlainText[],\n    IN UINT PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    IN UINT8 Nonce[],\n    IN UINT NonceLength,\n    IN UINT8 AAD[],\n    IN UINT AADLength,\n    IN UINT MACLength,\n    OUT UINT8 CipherText[],\n    INOUT UINT *CipherTextLength)\n{\n    UINT8 Block_MAC[AES_BLOCK_SIZES];\n    UINT8 Block_CTR[AES_BLOCK_SIZES], Block_CTR_Cipher[AES_BLOCK_SIZES];\n    UINT  Cipher_Index = 0;\n    UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0;\n\n    /*   \n     * 1. Check Input Values\n     *    - Key length must be 16 bytes\n     *    - Nonce length range is form 7 to 13 bytes\n     *    - MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes\n     *    - CipherTextLength > PlainTextLength + MACLength\n     */\n    if (KeyLength != AES_KEY128_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Encrypt: The key length must be %d bytes\\n\", AES_KEY128_LENGTH));\n        return -1;\n    }\n\n    if ((NonceLength < 7) || (NonceLength > 13)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Encrypt: A valid nonce length is 7-13 bytes\\n\"));\n        return -2;\n    }\n\n    if ((MACLength != 4) && (MACLength != 6) && (MACLength != 8) && (MACLength != 10)\n        && (MACLength != 12) && (MACLength != 14) && (MACLength != 16)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Encrypt: The MAC length  must be 4, 6, 8, 10, 12, 14, or 16 bytes\\n\"));\n        return -3;\n    }\n\n    if (*CipherTextLength < (PlainTextLength + MACLength)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Encrypt: The CipherTextLength is not enough.\\n\"));\n        return -4;\n    }\n\n\n    /*   \n     * 1. Formatting of the Counter Block\n     */\n    NdisZeroMemory(Block_CTR, AES_BLOCK_SIZES);\n    Temp_Value = (15 - NonceLength) - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */\n    Block_CTR[0] |= Temp_Value;\n    for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++)\n        Block_CTR[Temp_Index + 1] = Nonce[Temp_Index];\n\n    /*\n     * 2. Calculate the MAC (MIC)\n     */\n    AES_CCM_MAC(PlainText, PlainTextLength, Key, KeyLength, Nonce, NonceLength, AAD, AADLength, MACLength, Block_MAC);\n    Temp_Length = sizeof(Block_CTR_Cipher);\n    RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length);\n    for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++)\n        Block_MAC[Temp_Index] ^= Block_CTR_Cipher[Temp_Index];\n\n    /*   \n     * 3. Cipher Payload\n     */\n    while (Cipher_Index < PlainTextLength) \n    {\n        Block_CTR[15] += 1;\n        Temp_Length = sizeof(Block_CTR_Cipher);\n        RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length);\n\n        Copy_Length = PlainTextLength - Cipher_Index;\n        if (Copy_Length > AES_BLOCK_SIZES)\n            Copy_Length = AES_BLOCK_SIZES;                \n        for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++)\n            CipherText[Cipher_Index + Temp_Index] = PlainText[Cipher_Index + Temp_Index]^Block_CTR_Cipher[Temp_Index];\n\n        Cipher_Index += Copy_Length;\n    }\n    for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++)\n            CipherText[PlainTextLength + Temp_Index] = Block_MAC[Temp_Index];    \n    *CipherTextLength = PlainTextLength + MACLength;\n\n    return 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES-CBCMAC Decryption\n\nArguments:\n    CipherText       The ciphertext\n    CipherTextLength The length of cipher text in bytes\n    Key              Cipher key\n    KeyLength        The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes)\n    Nonce            Nonce\n    NonceLength      The length of nonce in bytes\n    AAD              Additional authenticated data\n    AADLength        The length of AAD in bytes\n    CipherTextLength    The length of allocated memory spaces in bytes\n\nReturn Value:\n    PlainText        Plain text\n    PlainTextLength  Return the length of the plain text in bytes\n\nFunction Value:\n     0: Success\n    -1: The key length must be 16 bytes.\n    -2: A valid nonce length is 7-13 bytes.\n    -3: The MAC length  must be 4, 6, 8, 10, 12, 14, or 16 bytes.\n    -4: The PlainTextLength is not enough.\n    -5: The MIC does not match.\n    \nNote:\n    Reference to RFC 3601, and NIST 800-38C.\n    Here, the implement of AES_CCM is suitable for WI_FI.\n========================================================================\n*/\nINT AES_CCM_Decrypt (\n    IN UINT8 CipherText[],\n    IN UINT  CipherTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    IN UINT8 Nonce[],\n    IN UINT  NonceLength,\n    IN UINT8 AAD[],\n    IN UINT  AADLength,\n    IN UINT  MACLength,    \n    OUT UINT8 PlainText[],\n    INOUT UINT *PlainTextLength)\n{\n    UINT8 Block_MAC[AES_BLOCK_SIZES], Block_MAC_From_Cipher[AES_BLOCK_SIZES];\n    UINT8 Block_CTR[AES_BLOCK_SIZES], Block_CTR_Cipher[AES_BLOCK_SIZES];\n    UINT  Block_Index = 0, Cipher_Index = 0;\n    UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0;\n\n\n    /*   \n     * 1. Check Input Values\n     *    - Key length must be 16 bytes\n     *    - Nonce length range is form 7 to 13 bytes\n     */\n    if (KeyLength != AES_KEY128_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Decrypt: The key length must be %d bytes\\n\", AES_KEY128_LENGTH));\n        return -1;\n    }\n\n    if ((NonceLength < 7) || (NonceLength > 13)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Decrypt: A valid nonce length is 7-13 bytes\\n\"));\n        return -2;\n    }\n    \n    if ((MACLength != 4) && (MACLength != 6) && (MACLength != 8) && (MACLength != 10)\n        && (MACLength != 12) && (MACLength != 14) && (MACLength != 16)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Decrypt: The MAC length  must be 4, 6, 8, 10, 12, 14, or 16 bytes\\n\"));\n        return -3;\n    }\n    \n    if (*PlainTextLength < (CipherTextLength - MACLength)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Decrypt: The PlainTextLength is not enough.\\n\"));\n        return -4;\n    }\n\n    /*   \n     * 2. Formatting of the Counter Block\n     */\n    NdisZeroMemory(Block_CTR, AES_BLOCK_SIZES);\n    Temp_Value = (15 - NonceLength) - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */\n    Block_CTR[0] |= Temp_Value;\n    for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++)\n        Block_CTR[Temp_Index + 1] = Nonce[Temp_Index];\n    Temp_Length = sizeof(Block_CTR_Cipher);\n    RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length);\n\n    /*\n     * 3. Catch the MAC (MIC) from CipherText\n     */\n    Block_Index = 0;\n    for (Temp_Index = (CipherTextLength - MACLength); Temp_Index < CipherTextLength; Temp_Index++, Block_Index++)\n        Block_MAC_From_Cipher[Block_Index] = CipherText[Temp_Index]^Block_CTR_Cipher[Block_Index];\n\n    /*\n     * 4. Decryption the Payload\n     */     \n    while (Cipher_Index < (CipherTextLength - MACLength)) \n    {\n        Block_CTR[15] += 1;\n        Temp_Length = sizeof(Block_CTR_Cipher);\n        RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length);\n\n        Copy_Length = (CipherTextLength - MACLength) - Cipher_Index;\n        if (Copy_Length > AES_BLOCK_SIZES)\n            Copy_Length = AES_BLOCK_SIZES;                \n        for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++)\n            PlainText[Cipher_Index + Temp_Index] = CipherText[Cipher_Index + Temp_Index]^Block_CTR_Cipher[Temp_Index];\n        Cipher_Index += Copy_Length;\n    }\n    *PlainTextLength = CipherTextLength - MACLength;\n    \n    /*\n     * 5. Calculate the MAC (MIC) from Payload\n     */\n    AES_CCM_MAC(PlainText, *PlainTextLength, Key, KeyLength, Nonce, NonceLength, AAD, AADLength, MACLength, Block_MAC);\n\n    /*\n     * 6. Check the MIC\n     */\n    if (NdisCmpMemory(Block_MAC_From_Cipher, Block_MAC, MACLength) != 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CCM_Decrypt: The MIC does not match.\\n\"));\n        return -5;\n    }\n\n    return 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES-CMAC generate subkey\n\nArguments:\n    Key        Cipher key 128 bits\n    KeyLength  The length of Cipher key in bytes\n\nReturn Value:\n    SubKey1    SubKey 1 128 bits\n    SubKey2    SubKey 2 128 bits\n\nNote:\n    Reference to RFC 4493\n    \n    Step 1.  L := AES-128(K, const_Zero);\n    Step 2.  if MSB(L) is equal to 0\n                then    K1 := L << 1;\n                else    K1 := (L << 1) XOR const_Rb;\n    Step 3.  if MSB(K1) is equal to 0\n                then    K2 := K1 << 1;\n                else    K2 := (K1 << 1) XOR const_Rb;\n    Step 4.  return K1, K2;\n========================================================================\n*/\nVOID AES_CMAC_GenerateSubKey (\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 SubKey1[],\n    OUT UINT8 SubKey2[])\n{\n    UINT8 MSB_L = 0, MSB_K1 = 0, Top_Bit = 0;\n    UINT  SubKey1_Length = 0;\n    INT   Index = 0;\n\n    if (KeyLength != AES_KEY128_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CMAC_GenerateSubKey: key length is %d bytes, it must be %d bytes(128 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH));\n        return;\n    }\n\n    /* Step 1: L := AES-128(K, const_Zero); */\n    SubKey1_Length = 16;\n    RT_AES_Encrypt(Const_Zero, sizeof(Const_Zero), Key, KeyLength, SubKey1, &SubKey1_Length);\n\n    /*\n     * Step 2.  if MSB(L) is equal to 0\n     *           then    K1 := L << 1;\n     *           else    K1 := (L << 1) XOR const_Rb;\n     */\n    MSB_L = SubKey1[0] & 0x80;    \n    for(Index = 0; Index < 15; Index++) {\n        Top_Bit = (SubKey1[Index + 1] & 0x80)?1:0;\n        SubKey1[Index] <<= 1;\n        SubKey1[Index] |= Top_Bit;\n    }\n    SubKey1[15] <<= 1;\n    if (MSB_L > 0) {\n        for(Index = 0; Index < 16; Index++)\n            SubKey1[Index] ^= Const_Rb[Index];\n    }\n\n    /*\n     * Step 3.  if MSB(K1) is equal to 0\n     *           then    K2 := K1 << 1;\n     *           else    K2 := (K1 << 1) XOR const_Rb;\n     */\n    MSB_K1 = SubKey1[0] & 0x80;\n    for(Index = 0; Index < 15; Index++) {\n        Top_Bit = (SubKey1[Index + 1] & 0x80)?1:0;\n        SubKey2[Index] = SubKey1[Index] << 1;\n        SubKey2[Index] |= Top_Bit;\n    }\n    SubKey2[15] = SubKey1[15] << 1;\n    if (MSB_K1 > 0) {\n        for(Index = 0; Index < 16; Index++)\n            SubKey2[Index] ^= Const_Rb[Index];\n    }\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES-CMAC\n\nArguments:\n    PlainText        Plain text\n    PlainTextLength  The length of plain text in bytes\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n    MACTextLength    The length of allocated memory spaces in bytes\n\nReturn Value:\n    MACText       Message authentication code (128-bit string)\n    MACTextLength Return the length of Message authentication code in bytes\n\nNote:\n    Reference to RFC 4493\n========================================================================\n*/\nVOID AES_CMAC (\n    IN UINT8 PlainText[],\n    IN UINT PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 MACText[],\n    INOUT UINT *MACTextLength)\n{\n    UINT  PlainBlockStart;\n    UINT8 X[AES_BLOCK_SIZES], Y[AES_BLOCK_SIZES];\n    UINT8 SubKey1[16];\n    UINT8 SubKey2[16];\n    INT Index;\n    UINT X_Length;\n\n    if (*MACTextLength < AES_MAC_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CMAC: MAC text length is less than %d bytes).\\n\", \n            AES_MAC_LENGTH));\n        return;\n    }\n    if (KeyLength != AES_KEY128_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CMAC: key length is %d bytes, it must be %d bytes(128 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH));\n        return;\n    }\n\n    /* Step 1.  (K1,K2) := Generate_Subkey(K); */\n    NdisZeroMemory(SubKey1, 16);\n    NdisZeroMemory(SubKey2, 16);   \n    AES_CMAC_GenerateSubKey(Key, KeyLength, SubKey1, SubKey2);\n\n    /*   \n     * 2. Main algorithm\n     *    - Plain text divide into serveral blocks (16 bytes/block)\n     *    - If plain text is not divided with no remainder by block, padding size = (block - remainder plain text)\n     *    - Execute RT_AES_Encrypt procedure.\n     */\n    PlainBlockStart = 0;\n    NdisMoveMemory(X, Const_Zero, AES_BLOCK_SIZES);\n    while ((PlainTextLength - PlainBlockStart) > AES_BLOCK_SIZES)\n    {\n        for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                Y[Index] = PlainText[PlainBlockStart + Index]^X[Index];\n\n        X_Length = sizeof(X);\n        RT_AES_Encrypt(Y, sizeof(Y) , Key, KeyLength, X, &X_Length);\n        PlainBlockStart += ((UINT) AES_BLOCK_SIZES);\n    }\n    if ((PlainTextLength - PlainBlockStart) == AES_BLOCK_SIZES) {\n        for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                Y[Index] = PlainText[PlainBlockStart + Index]^X[Index]^SubKey1[Index];        \n    } else {    \n        NdisZeroMemory(Y, AES_BLOCK_SIZES);\n        NdisMoveMemory(Y, &PlainText[PlainBlockStart], (PlainTextLength - PlainBlockStart));\n        Y[(PlainTextLength - PlainBlockStart)] = 0x80;\n        for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                Y[Index] = Y[Index]^X[Index]^SubKey2[Index];\n    }\n    RT_AES_Encrypt(Y, sizeof(Y) , Key, KeyLength, MACText, MACTextLength);\n}\n\n\n/* For AES_Key_Wrap */\n#define AES_KEY_WRAP_IV_LENGTH 8 /* 64-bit */\n#define AES_KEY_WRAP_BLOCK_SIZE 8 /* 64-bit */\nstatic UINT8 Default_IV[8] = {\n    0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6};\n\n/*\n========================================================================\nRoutine Description:\n    AES-CBC encryption\n\nArguments:\n    PlainText        Plain text\n    PlainTextLength  The length of plain text in bytes\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n    IV               Initialization vector, it may be 16 bytes (128 bits)\n    IVLength         The length of initialization vector in bytes\n    CipherTextLength The length of allocated cipher text in bytes\n\nReturn Value:\n    CipherText       Return cipher text\n    CipherTextLength Return the length of real used cipher text in bytes\n\nNote:\n    Reference to RFC 3602 and NIST 800-38A\n========================================================================\n*/\nVOID AES_CBC_Encrypt (\n    IN UINT8 PlainText[],\n    IN UINT PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    IN UINT8 IV[],\n    IN UINT IVLength,\n    OUT UINT8 CipherText[],\n    INOUT UINT *CipherTextLength)\n{\n    UINT PaddingSize, PlainBlockStart, CipherBlockStart, CipherBlockSize;\n    UINT Index;\n    UINT8 Block[AES_BLOCK_SIZES];\n\n    /*   \n     * 1. Check the input parameters\n     *    - CipherTextLength > (PlainTextLength + Padding size), Padding size = block size - (PlainTextLength % block size)\n     *    - Key length must be 16, 24, or 32 bytes(128, 192, or 256 bits) \n     *    - IV length must be 16 bytes(128 bits) \n     */\n    PaddingSize = ((UINT) AES_BLOCK_SIZES) - (PlainTextLength % ((UINT)AES_BLOCK_SIZES));\n    if (*CipherTextLength < (PlainTextLength + PaddingSize)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CBC_Encrypt: cipher text length is %d bytes < (plain text length %d bytes + padding size %d bytes).\\n\", \n            *CipherTextLength, PlainTextLength, PaddingSize));\n        return;\n    }\n    if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CBC_Encrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH));\n        return;\n    }\n    if (IVLength != AES_CBC_IV_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CBC_Encrypt: IV length is %d bytes, it must be %d bytes(128bits).\\n\", \n            IVLength, AES_CBC_IV_LENGTH));\n        return;\n    }\n\n\n    /*   \n     * 2. Main algorithm\n     *    - Plain text divide into serveral blocks (16 bytes/block)\n     *    - If plain text is divided with no remainder by block, add a new block and padding size = block(16 bytes)\n     *    - If plain text is not divided with no remainder by block, padding size = (block - remainder plain text)\n     *    - Execute RT_AES_Encrypt procedure.\n     *    \n     *    - Padding method: The remainder bytes will be filled with padding size (1 byte)\n     */\n    PlainBlockStart = 0;\n    CipherBlockStart = 0;\n    while ((PlainTextLength - PlainBlockStart) >= AES_BLOCK_SIZES)\n    {\n        if (CipherBlockStart == 0) {\n            for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                Block[Index] = PlainText[PlainBlockStart + Index]^IV[Index];                \n        } else {\n            for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                Block[Index] = PlainText[PlainBlockStart + Index]^CipherText[CipherBlockStart - ((UINT) AES_BLOCK_SIZES) + Index];\n        }\n            \n        CipherBlockSize = *CipherTextLength - CipherBlockStart;\n        RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, CipherText + CipherBlockStart, &CipherBlockSize);\n\n        PlainBlockStart += ((UINT) AES_BLOCK_SIZES);\n        CipherBlockStart += CipherBlockSize;\n    }\n\n    NdisMoveMemory(Block, (&PlainText[0] + PlainBlockStart), (PlainTextLength - PlainBlockStart));\n    NdisFillMemory((Block + (((UINT) AES_BLOCK_SIZES) -PaddingSize)), PaddingSize, (UINT8) PaddingSize);\n    if (CipherBlockStart == 0) {\n       for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n           Block[Index] ^= IV[Index];\n    } else {\n       for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n           Block[Index] ^= CipherText[CipherBlockStart - ((UINT) AES_BLOCK_SIZES) + Index];\n    }\n    CipherBlockSize = *CipherTextLength - CipherBlockStart;\n    RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, CipherText + CipherBlockStart, &CipherBlockSize);\n    CipherBlockStart += CipherBlockSize;\n    *CipherTextLength = CipherBlockStart;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES-CBC decryption\n\nArguments:\n    CipherText       Cipher text\n    CipherTextLength The length of cipher text in bytes\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n    IV               Initialization vector, it may be 16 bytes (128 bits)\n    IVLength         The length of initialization vector in bytes\n    PlainTextLength  The length of allocated plain text in bytes\n\nReturn Value:\n    PlainText        Return plain text\n    PlainTextLength  Return the length of real used plain text in bytes\n\nNote:\n    Reference to RFC 3602 and NIST 800-38A\n========================================================================\n*/\nVOID AES_CBC_Decrypt (\n    IN UINT8 CipherText[],\n    IN UINT CipherTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    IN UINT8 IV[],\n    IN UINT IVLength,\n    OUT UINT8 PlainText[],\n    INOUT UINT *PlainTextLength)\n{\n    UINT PaddingSize, PlainBlockStart, CipherBlockStart, PlainBlockSize;\n    UINT Index;\n\n    /*   \n     * 1. Check the input parameters\n     *    - CipherTextLength must be divided with no remainder by block\n     *    - Key length must be 16, 24, or 32 bytes(128, 192, or 256 bits) \n     *    - IV length must be 16 bytes(128 bits) \n     */\n    if ((CipherTextLength % AES_BLOCK_SIZES) != 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CBC_Decrypt: cipher text length is %d bytes, it can't be divided with no remainder by block size(%d).\\n\", \n            CipherTextLength, AES_BLOCK_SIZES));\n        return;\n    }\n    if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CBC_Decrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH));\n        return;\n    }\n    if (IVLength != AES_CBC_IV_LENGTH) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_CBC_Decrypt: IV length is %d bytes, it must be %d bytes(128bits).\\n\", \n            IVLength, AES_CBC_IV_LENGTH));\n        return;\n    }\n\n\n    /*   \n     * 2. Main algorithm\n     *    - Cypher text divide into serveral blocks (16 bytes/block)\n     *    - Execute RT_AES_Decrypt procedure.\n     *    - Remove padding bytes, padding size is the last byte of plain text\n     */\n    CipherBlockStart = 0;\n    PlainBlockStart = 0;\n    while ((CipherTextLength - CipherBlockStart) >= AES_BLOCK_SIZES)\n    {\n        PlainBlockSize = *PlainTextLength - PlainBlockStart;\n        RT_AES_Decrypt(CipherText + CipherBlockStart, AES_BLOCK_SIZES , Key, KeyLength, PlainText + PlainBlockStart, &PlainBlockSize);\n\n        if (PlainBlockStart == 0) {\n            for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                PlainText[PlainBlockStart + Index] ^= IV[Index];                \n        } else {\n            for (Index = 0; Index < AES_BLOCK_SIZES; Index++)\n                PlainText[PlainBlockStart + Index] ^= CipherText[CipherBlockStart + Index - ((UINT) AES_BLOCK_SIZES)];\n        }\n\n        CipherBlockStart += AES_BLOCK_SIZES;\n        PlainBlockStart += PlainBlockSize;\n    }\n\n    PaddingSize = (UINT8) PlainText[PlainBlockStart -1];   \n    *PlainTextLength = PlainBlockStart - PaddingSize;\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    AES key wrap algorithm\n\nArguments:\n    PlainText        Plain text\n    PlainTextLength  The length of plain text in bytes\n    Key              Cipher key\n    KeyLength        The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes)\n\nReturn Value:\n    CipherText       The ciphertext\n    CipherTextLength Return the length of the ciphertext in bytes\n    \nFunction Value:\n     0: Success\n    -1: The key length must be 16, 24, or 32 bytes\n    -2: Not enough memory\n    \nNote:\n    Reference to RFC 3394\n========================================================================\n*/\nINT AES_Key_Wrap (\n    IN UINT8 PlainText[],\n    IN UINT  PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    OUT UINT8 CipherText[],\n    OUT UINT *CipherTextLength)\n{\n    UINT8 IV[8], Block_B[16], Block_Input[16];\n    UINT8 *pResult;\n    UINT  Temp_Length = 0, Number_Of_Block = 0;\n    INT   Index_i = 0, Index_j = 0;\n    \n    /*   \n     * 0. Check input parameter\n     */\n    if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_Key_Wrap: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH));\n        return -1;\n    } /* End of if */    \n\tos_alloc_mem(NULL, (UCHAR **)&pResult, sizeof(UINT8)*PlainTextLength);\n/*    if ((pResult = (UINT8 *) kmalloc(sizeof(UINT8)*PlainTextLength, GFP_ATOMIC)) == NULL) {\n*/\n    if (pResult == NULL) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_Key_Wrap: allocate %d bytes memory failure.\\n\", sizeof(UINT8)*PlainTextLength));\n        return -2;\n    } /* End of if */\n\n\n    /*\n     * 1. Initialize variables\n     */\n    Number_Of_Block = PlainTextLength / AES_KEY_WRAP_BLOCK_SIZE; /* 64 bits each block\n*/\n    NdisMoveMemory(IV, Default_IV, AES_KEY_WRAP_IV_LENGTH);\n    NdisMoveMemory(pResult, PlainText, PlainTextLength);\n\n\n    /*\n     * 2. Calculate intermediate values\n     */\n    for (Index_j = 0;Index_j < 6 ;Index_j++)\n    {   \n        for (Index_i = 0;Index_i < Number_Of_Block;Index_i++)\n        {\n            NdisMoveMemory(Block_Input, IV, 8);\n            NdisMoveMemory(Block_Input + 8, pResult + (Index_i*8), 8);\n            Temp_Length = sizeof(Block_B);            \n            RT_AES_Encrypt(Block_Input, AES_BLOCK_SIZES , Key, KeyLength, Block_B, &Temp_Length);\n\n            NdisMoveMemory(IV, Block_B, 8);\n            IV[7] = Block_B[7] ^ ((Number_Of_Block * Index_j) + Index_i + 1);            \n            NdisMoveMemory(pResult + (Index_i*8), (Block_B + 8), 8);\n        } /* End of for */\n    } /* End of for */\n\n\n    /*\n     * 3. Output the results\n     */\n    *CipherTextLength = PlainTextLength + AES_KEY_WRAP_IV_LENGTH;\n    NdisMoveMemory(CipherText, IV, AES_KEY_WRAP_IV_LENGTH);\n    NdisMoveMemory(CipherText + AES_KEY_WRAP_IV_LENGTH, pResult, PlainTextLength);\n\n/*    kfree(pResult);\n*/\n\tos_free_mem(NULL, pResult);\n    return 0;\n} /* End of AES_Key_Wrap */\n\n\n/*\n========================================================================\nRoutine Description:\n    AES key unwrap algorithm\n\nArguments:\n    CipherText       The ciphertext\n    CipherTextLength The length of cipher text in bytes\n    Key              Cipher key\n    KeyLength        The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes)\n\nReturn Value:\n    PlainText        Plain text\n    PlainTextLength  Return the length of the plain text in bytes    \n\nFunction Value:\n     0: Success\n\nNote:\n    Reference to RFC 3394\n========================================================================\n*/\nINT AES_Key_Unwrap (\n    IN UINT8 CipherText[],\n    IN UINT  CipherTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    OUT UINT8 PlainText[],\n    OUT UINT *PlainTextLength)\n{\n    UINT8 IV[8], Block_B[16], Block_Input[16];\n    UINT8 *pResult;\n    UINT  Temp_Length = 0, Number_Of_Block = 0, PlainLength;\n    INT   Index_i = 0, Index_j = 0;\n    \n    /*   \n     * 0. Check input parameter\n     */\n    PlainLength = CipherTextLength - AES_KEY_WRAP_IV_LENGTH;\n    if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_Key_Unwrap: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\\n\", \n            KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH));\n        return -1;\n    } /* End of if */    \n\tos_alloc_mem(NULL, (UCHAR **)&pResult, sizeof(UINT8)*PlainLength);\n/*    if ((pResult = (UINT8 *) kmalloc(sizeof(UINT8)*PlainLength, GFP_ATOMIC)) == NULL) {\n*/\n    if (pResult == NULL) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"AES_Key_Unwrap: allocate %d bytes memory failure.\\n\", sizeof(UINT8)*PlainLength));\n        return -2;\n    } /* End of if */\n\n\n    /*\n     * 1. Initialize variables\n     */\n    Number_Of_Block = PlainLength / AES_KEY_WRAP_BLOCK_SIZE; /* 64 bits each block\n*/\n    NdisMoveMemory(IV, CipherText, AES_KEY_WRAP_IV_LENGTH);\n    NdisMoveMemory(pResult, CipherText + AES_KEY_WRAP_IV_LENGTH, PlainLength);\n\n\n    /*\n     * 2. Calculate intermediate values\n     */\n    for (Index_j = 5;Index_j >= 0 ;Index_j--)\n    {   \n        for (Index_i = (Number_Of_Block - 1);Index_i >= 0;Index_i--)\n        {\n            IV[7] = IV[7] ^ ((Number_Of_Block * Index_j) + Index_i + 1);\n            NdisMoveMemory(Block_Input, IV, 8);\n            NdisMoveMemory(Block_Input + 8, pResult + (Index_i*8), 8);\n            Temp_Length = sizeof(Block_B);\n            RT_AES_Decrypt(Block_Input, AES_BLOCK_SIZES , Key, KeyLength, Block_B, &Temp_Length);\n            \n            NdisMoveMemory(IV, Block_B, 8);\n            NdisMoveMemory(pResult + (Index_i*8), (Block_B + 8), 8);\n        } /* End of for */\n    } /* End of for */\n\n    /*\n     * 3. Output the results\n     */\n    *PlainTextLength = PlainLength;\n    NdisMoveMemory(PlainText, pResult, PlainLength);\n\n/*    kfree(pResult);    \n*/\n\tos_free_mem(NULL, pResult);\n    return 0;\n} /* End of AES_Key_Unwrap */\n\n\n"
  },
  {
    "path": "src/common/crypt_arc4.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n\n/****************************************************************************\n    Module Name:\n    RC4\n\n    Abstract:\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/05/13      ARC4\n***************************************************************************/\n\n#include \"crypt_arc4.h\"\n\n\n/*\n========================================================================\nRoutine Description:\n    ARC4 initialize the key block\n\nArguments:\n    pARC4_CTX        Pointer to ARC4 CONTEXT\n    Key              Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)\n    KeyLength        The length of cipher key in bytes\n\n========================================================================\n*/\nVOID ARC4_INIT (\n    IN ARC4_CTX_STRUC *pARC4_CTX,\n    IN PUCHAR pKey,\n\tIN UINT KeyLength)\n{\n    UINT BlockIndex = 0, SWAPIndex = 0, KeyIndex = 0;\n    UINT8 TempValue = 0;\n\n    /*Initialize the block value*/\n    pARC4_CTX->BlockIndex1 = 0;\n    pARC4_CTX->BlockIndex2 = 0;\n    for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)\n        pARC4_CTX->KeyBlock[BlockIndex] = (UINT8) BlockIndex;\n\n    /*Key schedule*/\n    for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)\n    {\n        TempValue = pARC4_CTX->KeyBlock[BlockIndex];\n        KeyIndex = BlockIndex % KeyLength;\n        SWAPIndex = (SWAPIndex + TempValue + pKey[KeyIndex]) & 0xff;\n        pARC4_CTX->KeyBlock[BlockIndex] = pARC4_CTX->KeyBlock[SWAPIndex];\n        pARC4_CTX->KeyBlock[SWAPIndex] = TempValue;                \n    } /* End of for */\n\n} /* End of ARC4_INIT */\n\n\n/*\n========================================================================\nRoutine Description:\n    ARC4 encryption/decryption\n\nArguments:\n    pARC4_CTX       Pointer to ARC4 CONTEXT\n    InputText       Input text\n    InputTextLength The length of input text in bytes\n\nReturn Value:\n    OutputBlock       Return output text\n ========================================================================\n*/\nVOID ARC4_Compute (\n    IN ARC4_CTX_STRUC *pARC4_CTX,\n    IN UINT8 InputBlock[],\n    IN UINT InputBlockSize,\n    OUT UINT8 OutputBlock[])\n{\n    UINT InputIndex = 0;\n    UINT8 TempValue = 0;\n\n    for (InputIndex = 0; InputIndex < InputBlockSize; InputIndex++)\n    {\n        pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;\n        TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];\n        pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;\n        \n        pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];\n        pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;\n        \n        TempValue = (TempValue + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]) & 0xff;\n        OutputBlock[InputIndex] = InputBlock[InputIndex]^pARC4_CTX->KeyBlock[TempValue];\n\n    } /* End of for */\n} /* End of ARC4_Compute */\n\n\n/*\n========================================================================\nRoutine Description:\n    Discard the key length\n\nArguments:\n    pARC4_CTX   Pointer to ARC4 CONTEXT\n    Length      Discard the key length\n\n========================================================================\n*/\nVOID ARC4_Discard_KeyLength (\n    IN ARC4_CTX_STRUC *pARC4_CTX,\n    IN UINT Length)    \n{\n    UINT Index = 0;\n    UINT8 TempValue = 0;\n    \n    for (Index = 0; Index < Length; Index++)\n    {\n        pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;\n        TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];\n        pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;\n        \n        pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];\n        pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;\n    } /* End of for */\n\n} /* End of ARC4_Discard_KeyLength */\n\n\n"
  },
  {
    "path": "src/common/crypt_biginteger.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n#include \"crypt_biginteger.h\"\n\n\n#ifdef __KERNEL__\n#define DEBUGPRINT(fmt, args...) printk(KERN_ERR fmt, ## args)\n#else\n#define DEBUGPRINT(fmt, args...) printf(fmt, ## args)\n#endif /* __KERNEL__ */\n\n#define UINT32_HBITS(value)\t(((value) >> 0x10) & 0xffff)\n#define UINT32_LBITS(value)\t((value) & 0xffff)\n#define UINT32_GETBYTE(value, index)\t(((value) >> ((index)*8)) & 0xff)\n#define UINT64_HBITS(value)\t(((value) >> 0x20) & 0xffffffff)\n#define UINT64_LBITS(value)\t((value) & 0xffffffff)\n\nstatic UINT8 WPS_DH_P_VALUE[192] = \n{\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n    0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n    0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n    0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n    0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n    0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n    0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n    0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n    0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n    0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n    0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n    0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n    0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n    0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n    0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n    0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,\n    0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,\n    0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n    0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,\n    0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,\n    0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n    0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,\n    0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n};\n\nstatic UINT8 WPS_DH_R_VALUE[193] = \n{\n    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00,\n}; \n \nstatic UINT8 WPS_DH_X_VALUE[184] = \n{\n    0x36, 0xf0, 0x25, 0x5d, 0xde, 0x97, 0x3d, 0xcb,\n    0x3b, 0x39, 0x9d, 0x74, 0x7f, 0x23, 0xe3, 0x2e,\n    0xd6, 0xfd, 0xb1, 0xf7, 0x75, 0x98, 0x33, 0x8b,\n    0xfd, 0xf4, 0x41, 0x59, 0xc4, 0xec, 0x64, 0xdd,\n    0xae, 0xb5, 0xf7, 0x86, 0x71, 0xcb, 0xfb, 0x22,\n    0x10, 0x6a, 0xe6, 0x4c, 0x32, 0xc5, 0xbc, 0xe4,\n    0xcf, 0xd4, 0xf5, 0x92, 0x0d, 0xa0, 0xeb, 0xc8,\n    0xb0, 0x1e, 0xca, 0x92, 0x92, 0xae, 0x3d, 0xba,\n    0x1b, 0x7a, 0x4a, 0x89, 0x9d, 0xa1, 0x81, 0x39,\n    0x0b, 0xb3, 0xbd, 0x16, 0x59, 0xc8, 0x12, 0x94,\n    0xf4, 0x00, 0xa3, 0x49, 0x0b, 0xf9, 0x48, 0x12,\n    0x11, 0xc7, 0x94, 0x04, 0xa5, 0x76, 0x60, 0x5a,\n    0x51, 0x60, 0xdb, 0xee, 0x83, 0xb4, 0xe0, 0x19,\n    0xb6, 0xd7, 0x99, 0xae, 0x13, 0x1b, 0xa4, 0xc2,\n    0x3d, 0xff, 0x83, 0x47, 0x5e, 0x9c, 0x40, 0xfa,\n    0x67, 0x25, 0xb7, 0xc9, 0xe3, 0xaa, 0x2c, 0x65,\n    0x96, 0xe9, 0xc0, 0x57, 0x02, 0xdb, 0x30, 0xa0,\n    0x7c, 0x9a, 0xa2, 0xdc, 0x23, 0x5c, 0x52, 0x69,\n    0xe3, 0x9d, 0x0c, 0xa9, 0xdf, 0x7a, 0xad, 0x44,\n    0x61, 0x2a, 0xd6, 0xf8, 0x8f, 0x69, 0x69, 0x92,\n    0x98, 0xf3, 0xca, 0xb1, 0xb5, 0x43, 0x67, 0xfb,\n    0x0e, 0x8b, 0x93, 0xf7, 0x35, 0xdc, 0x8c, 0xd8,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n};\n\nstatic UINT8 WPS_DH_RRModP_VALUE[192] = \n{\n\t0xe3, 0xb3, 0x3c, 0x72, 0x59, 0x54, 0x1c, 0x01,\n\t0xee, 0x9c, 0x9a, 0x21, 0x6c, 0xc1, 0xeb, 0xd2,\n\t0xae, 0x59, 0x41, 0x04, 0x79, 0x29, 0xa1, 0xc7,\n\t0xe9, 0xc3, 0xfa, 0x02, 0xcc, 0x24, 0x56, 0xef,\n\t0x10, 0x26, 0x30, 0xfa, 0x9a, 0x36, 0xa5, 0x1f,\n\t0x57, 0xb5, 0x93, 0x48, 0x67, 0x98, 0x44, 0x60,\n\t0x0b, 0xe4, 0x96, 0x47, 0xa8, 0x7c, 0x7b, 0x37,\n\t0xf8, 0x05, 0x65, 0x64, 0x96, 0x9b, 0x7f, 0x02,\n\t0xdc, 0x54, 0x1a, 0x4e, 0xd4, 0x05, 0x3f, 0x54,\n\t0xd6, 0x2a, 0x0e, 0xea, 0xb2, 0x70, 0x52, 0x1b,\n\t0x22, 0xc2, 0x96, 0xe9, 0xd4, 0x6f, 0xec, 0x23,\n\t0x8e, 0x1a, 0xbd, 0x78, 0x02, 0x23, 0xb7, 0x6b,\n\t0xb8, 0xfe, 0x61, 0x21, 0x19, 0x6b, 0x7e, 0x88,\n\t0x1c, 0x72, 0x9c, 0x7e, 0x04, 0xb9, 0xf7, 0x96,\n\t0x07, 0xcd, 0x0a, 0x62, 0x8e, 0x43, 0x41, 0x30,\n\t0x04, 0xa5, 0x41, 0xff, 0x93, 0xae, 0x1c, 0xeb,\n\t0xb0, 0x04, 0xa7, 0x50, 0xdb, 0x10, 0x2d, 0x39,\n\t0xb9, 0x05, 0x2b, 0xb4, 0x7a, 0x58, 0xf1, 0x70,\n\t0x7e, 0x8c, 0xd2, 0xac, 0x98, 0xb5, 0xfb, 0x62,\n\t0x8f, 0x23, 0x31, 0xb1, 0x3b, 0x01, 0xe0, 0x18,\n\t0xf4, 0x66, 0xee, 0x5f, 0xbc, 0xd4, 0x9d, 0x68,\n\t0xd0, 0xab, 0x92, 0xe1, 0x83, 0x97, 0xf2, 0x45,\n\t0x8e, 0x0e, 0x3e, 0x21, 0x67, 0x47, 0x8c, 0x73,\n\t0xf1, 0x15, 0xd2, 0x7d, 0x32, 0xc6, 0x95, 0xe0,\n};\n\nstatic UINT8 Value_0[1] = {0x00};\nstatic UINT8 Value_1[1] = {0x01};\nstatic PBIG_INTEGER pBI_U = NULL, pBI_S = NULL, pBI_O = NULL;\nstatic UINT Bits_Of_R = 0;\n\n\nVOID BigInteger_Print (\n    IN PBIG_INTEGER pBI)\n{\n    int i = 0, j = 0;\n\n    if ((pBI == NULL) || (pBI->pIntegerArray == NULL))\n        return;\n\n    if (strlen(pBI->Name) != 0)\n        DEBUGPRINT(\"Name=%s\\n\", pBI->Name);    \n    DEBUGPRINT(\"AllocSize=%d, ArrayLength=%d, IntegerLength=%d, Signed=%d\\n\", pBI->AllocSize, pBI->ArrayLength, pBI->IntegerLength, pBI->Signed);\n    for (i = (pBI->ArrayLength - 1), j = 0;i >=0;i--,j++) {\n        DEBUGPRINT(\"%08x, \", pBI->pIntegerArray[i]);\n        if ((j%8) == 7)\n            DEBUGPRINT(\"\\n\");\n    } /* End od for */\n    DEBUGPRINT(\"\\n\\n\");        \n} /* End of BigInteger_Print */\n\n   \nVOID BigInteger_Init (\n    INOUT PBIG_INTEGER *pBI)\n{\n    if (*pBI != NULL)\n        BigInteger_Free(pBI);\n\n\tos_alloc_mem(NULL, (UCHAR **)pBI, sizeof(BIG_INTEGER));\n/*    if ((*pBI = (PBIG_INTEGER) kmalloc(sizeof(BIG_INTEGER), GFP_ATOMIC)) == NULL) { */\n    if (*pBI == NULL) {\n        DEBUGPRINT(\"BigInteger_Init: allocate %d bytes memory failure.\\n\", (sizeof(BIG_INTEGER)));\n        return;\n    } /* End of if */\n\n    NdisZeroMemory(*pBI, sizeof(BIG_INTEGER));\n    (*pBI)->pIntegerArray = NULL;\n    (*pBI)->Signed = 1;\n} /* End of BigInteger_Init */\n\n\nVOID BigInteger_Free_AllocSize (\n    IN PBIG_INTEGER *pBI)\n{\n    if ((*pBI != NULL) && ((*pBI)->pIntegerArray != NULL)) {\n/*        kfree((*pBI)->pIntegerArray); */\n\t\tos_free_mem(NULL, (*pBI)->pIntegerArray);\n        NdisZeroMemory(*pBI, sizeof(BIG_INTEGER));\n        (*pBI)->pIntegerArray = NULL;\n        (*pBI)->Signed = 1;\n    } /* End of if */\n} /* End of BigInteger_Free_AllocSize */\n\n\nVOID BigInteger_Free (\n    IN PBIG_INTEGER *pBI)\n{   \n    if (*pBI != NULL) {\n        BigInteger_Free_AllocSize(pBI);\n/*        kfree(*pBI); */\n\t\tos_free_mem(NULL, *pBI);\n    } /* End of if */ \n\n    *pBI = NULL;\n} /* End of BigInteger_Free */\n\n\nVOID BigInteger_AllocSize (\n    IN PBIG_INTEGER *pBI,\n    IN INT Length)\n{\n    UINT ArrayLength = 0;\n\n    if (Length <= 0)\n        return;\n\n    if (*pBI == NULL)\n        BigInteger_Init(pBI);\n\n    /* Caculate array size */\n    ArrayLength = Length >> 0x2;\n    if ((Length & 0x3) != 0)\n        ArrayLength++;\n\n    if (((*pBI)->pIntegerArray != NULL) && ((*pBI)->AllocSize < (sizeof(UINT32)*ArrayLength)))\n        BigInteger_Free_AllocSize(pBI);\n\n    if ((*pBI)->pIntegerArray == NULL) {        \n\t\t\tos_alloc_mem(NULL, (UCHAR **)&((*pBI)->pIntegerArray), sizeof(UINT32)*ArrayLength);\n/*        if (((*pBI)->pIntegerArray = (UINT32 *) kmalloc(sizeof(UINT32)*ArrayLength, GFP_ATOMIC)) == NULL) { */\n        if ((*pBI)->pIntegerArray == NULL) {\n            DEBUGPRINT(\"BigInteger_AllocSize: allocate %d bytes memory failure.\\n\", (sizeof(UINT32)*ArrayLength));\n            return;\n        } /* End of if */\n        (*pBI)->AllocSize = sizeof(UINT32)*ArrayLength;\n    } /* End of if */\n\n    NdisZeroMemory((*pBI)->pIntegerArray, (*pBI)->AllocSize);\n    (*pBI)->ArrayLength = ArrayLength;\n    (*pBI)->IntegerLength = Length;\n} /* End of BigInteger_AllocSize */\n\n\nVOID BigInteger_ClearHighBits (\n    IN PBIG_INTEGER pBI)\n{\n    INT BIArrayIndex, ShiftIndex = 0;\n    UINT8 value;\n\n    if ((pBI == NULL) || (pBI->pIntegerArray == NULL))\n        return;\n\n    BIArrayIndex = pBI->ArrayLength - 1;\n    while ((BIArrayIndex >= 0) && (pBI->pIntegerArray[BIArrayIndex] == 0))\n    \tBIArrayIndex--;\n\n    if (BIArrayIndex >= 0) { \n        value = 0;\n        ShiftIndex = 4;\n        while (value == 0) {      \n            ShiftIndex--;\n            value = UINT32_GETBYTE(pBI->pIntegerArray[BIArrayIndex], ShiftIndex);\n    \t} /* End of while */\t\n    } /* End of if */\n\n    if (BIArrayIndex < 0) {\n        pBI->IntegerLength = 1;\n        pBI->ArrayLength = 1;\n        pBI->Signed = 1;\n    } else {\n        pBI->IntegerLength = (BIArrayIndex*4) + ShiftIndex + 1;\n        pBI->ArrayLength = BIArrayIndex + 1;\n    } /* End of if */\t\n} /* End of BigInteger_ClearHighBits */\n\n\nVOID BigInteger_BI2Bin (\n    IN PBIG_INTEGER pBI, \n    OUT UINT8 *pValue,\n    OUT UINT *Length)\n{\n    INT  ValueIndex, BIArrayIndex, ShiftIndex;\n    UINT32  Number;\n\n    if (pBI == NULL) {\n        DEBUGPRINT(\"BigInteger_BI2Bin: pBI is NUll\\n\");\n        *Length = 0;\n        return;\n    } /* End of if */\n  \n    if (*Length < (sizeof(UINT8) * pBI->IntegerLength)) {\n        DEBUGPRINT(\"BigInteger_BI2Bin: length(%d) is not enough.\\n\", *Length);\n        *Length = 0;\n        return;\n    } /* End of if */\n\n    if (pBI->pIntegerArray == NULL) {\n        *Length = 0;\n        return;\n    } /* End of if */\n\n    BigInteger_ClearHighBits(pBI);\n    if ((ShiftIndex = pBI->IntegerLength & 0x3) == 0)\n       ShiftIndex = 4;\n    BIArrayIndex = pBI->ArrayLength - 1;\n    ValueIndex = 0;\n\n    Number = pBI->pIntegerArray[BIArrayIndex];\n    while (ValueIndex < pBI->IntegerLength)\n    {\n        pValue[ValueIndex++] = (UINT8) UINT32_GETBYTE(Number, ShiftIndex - 1);\n        if ((--ShiftIndex) == 0) {\n            ShiftIndex = 4;\n            BIArrayIndex--;\n            Number = pBI->pIntegerArray[BIArrayIndex];\n        } /* End of if */\n    } /* End of while */  \n    *Length = pBI->IntegerLength;\n} /* End of BigInteger_BI2Bin */\n\n\nVOID BigInteger_Bin2BI (\n    IN UINT8 *pValue,\n    IN UINT Length,\n    OUT PBIG_INTEGER *pBI)\n{\n    INT  ValueIndex, BIArrayIndex, ShiftIndex;\n    UINT32  Number;\n    \n    BigInteger_AllocSize(pBI, Length);    \n\n    if ((*pBI)->pIntegerArray != NULL) {\n        Number = 0;\n        if ((ShiftIndex = Length & 0x3) == 0)\n            ShiftIndex = 4;\n        BIArrayIndex = (*pBI)->ArrayLength - 1;\n        ValueIndex = 0;\n        while (ValueIndex < Length)\n        {\n            Number = (Number << 8) | (UINT8) pValue[ValueIndex++];\n            if ((--ShiftIndex) == 0) {\n                (*pBI)->pIntegerArray[BIArrayIndex] = Number;\n                ShiftIndex = 4;\n                BIArrayIndex--;\n                Number = 0;\n            } /* End of if */\n        } /* End of while */\n    } /* End of if */\n} /* End of BigInteger_Bin2BI */\n\n\n/* Calculate the bits of BigInteger, the highest bit is 1 */\nVOID BigInteger_BitsOfBI (\n    IN PBIG_INTEGER pBI,\n    OUT UINT *Bits_Of_P)\n{\n    UINT32 Number, Index;\n\n    Number = pBI->pIntegerArray[pBI->ArrayLength - 1];\n    Index = 0;\n    while ((!(Number & 0x80000000)) && (Index < 32)) {\n        Number <<= 1;\n        Index++;\n    } /* End of while */\n    *Bits_Of_P = (pBI->ArrayLength*sizeof(UINT32)) - Index;\n} /* End of BigInteger_BitsOfBN */\n\n\nINT BigInteger_GetBitValue (\n    IN PBIG_INTEGER pBI,\n    IN UINT Index)\n{\n    UINT Array = 0;\n    UINT Shift = 0;\n\n    if (Index > 0) {\n        Array = (Index - 1) >> 0x5;\n        Shift = (Index - 1) & 0x1F;\n    }\n    if (Array > pBI->ArrayLength)\n        return 0;\n\n    return ((pBI->pIntegerArray[Array] >> Shift) & 0x1);\n} /* End of BigInteger_GetBitValue */\n\n\nUINT8 BigInteger_GetByteValue (\n    IN PBIG_INTEGER pBI,\n    IN UINT Index)\n{\n    UINT Array = 0;\n    UINT Shift = 0;\n\n    if (Index > 0) {\n        Array = (Index - 1) >> 0x2;\n        Shift = (Index - 1) & 0x3;\n    }\n    if ((Array > pBI->ArrayLength) || (Index > pBI->IntegerLength))\n        return 0;\n\n\n    return (UINT8) UINT32_GETBYTE(pBI->pIntegerArray[Array], Shift - 1);\n} /* End of BigInteger_GetByteValue */\n\n\nVOID BigInteger_Copy (\n    IN PBIG_INTEGER pBI_Copied,\n    OUT PBIG_INTEGER *pBI_Result)\n{\n    BigInteger_AllocSize(pBI_Result, pBI_Copied->IntegerLength);\n    NdisCopyMemory((*pBI_Result)->pIntegerArray, pBI_Copied->pIntegerArray, (sizeof(UINT32)*(*pBI_Result)->ArrayLength));\n    (*pBI_Result)->ArrayLength = pBI_Copied->ArrayLength;\n    (*pBI_Result)->IntegerLength = pBI_Copied->IntegerLength;\n    (*pBI_Result)->Signed = pBI_Copied->Signed;\n} /* End of BigInteger_Copy */\n\n\nINT BigInteger_UnsignedCompare (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand)\n{\n    INT BIArrayIndex;\n\n    if (pFirstOperand->IntegerLength > pSecondOperand->IntegerLength)\n        return 1;\n\n    if (pFirstOperand->IntegerLength < pSecondOperand->IntegerLength)\n        return -1;\n\n    if (pFirstOperand->IntegerLength == pSecondOperand->IntegerLength) {\n        for(BIArrayIndex = (pFirstOperand->ArrayLength - 1);BIArrayIndex >= 0 ; BIArrayIndex--)\n        {\n            if (pFirstOperand->pIntegerArray[BIArrayIndex] > pSecondOperand->pIntegerArray[BIArrayIndex])\n                return 1;\n            else if (pFirstOperand->pIntegerArray[BIArrayIndex] < pSecondOperand->pIntegerArray[BIArrayIndex])\n                return -1;                \n        } /* End of for */\n    } /* End of if */\n\n    return 0;    \n} /* End of BigInteger_Compare */ \n\n\nVOID BigInteger_Add (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result)\n{\n    INT CompareResult;\n    UINT32 BIArrayIndex;\n    UINT64 Sum, Carry;\n    PBIG_INTEGER pTempBI = NULL;\n\n    if  ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL)\n      || (pSecondOperand == NULL) || (pSecondOperand->pIntegerArray == NULL)) {\n        DEBUGPRINT(\"BigInteger_Add: first or second operand is NULL.\\n\");\n        return;\n    } /* End of if */\n\n    if (*pBI_Result == NULL)\n        BigInteger_Init(pBI_Result);\n\n    CompareResult = BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand);\n    if ((CompareResult == 0) & ((pFirstOperand->Signed * pSecondOperand->Signed) < 0)) {\n        BigInteger_AllocSize(pBI_Result, 1);\n        return ;\n    } /* End of if */\n\n    /*\n     *  Singed table\n     *  A + B || A > B || A < B\n     *  ------------------------\n     *  +   + ||   +   ||   +\n     *  +   - ||   +   ||   -\n     *  -   + ||   -   ||   +\n     *  -   - ||   -   ||   -\n     */\n    if ((pFirstOperand->Signed * pSecondOperand->Signed) > 0) {\n        if (pFirstOperand->IntegerLength > pSecondOperand->IntegerLength) {\n                BigInteger_AllocSize(pBI_Result, pFirstOperand->IntegerLength + 1);\n        } else { \n                BigInteger_AllocSize(pBI_Result, pSecondOperand->IntegerLength + 1);\n        } /* End of if */\n\n        Carry = 0;\n        for (BIArrayIndex=0; BIArrayIndex < (*pBI_Result)->ArrayLength; BIArrayIndex++)\n        {\n\n            Sum = 0;\n            if (BIArrayIndex < pFirstOperand->ArrayLength)\n                Sum += (UINT64) pFirstOperand->pIntegerArray[BIArrayIndex];\n\n            if (BIArrayIndex < pSecondOperand->ArrayLength)\n                Sum += (UINT64) pSecondOperand->pIntegerArray[BIArrayIndex];\n\n            Sum += Carry;\n            Carry = Sum  >> 32;\n            (*pBI_Result)->pIntegerArray[BIArrayIndex] = (UINT32) (Sum & 0xffffffffUL);\n        } /* End of for */        \n        (*pBI_Result)->Signed = pFirstOperand->Signed;\n        BigInteger_ClearHighBits(*pBI_Result);     \n    } else {\n        if  ((pFirstOperand->Signed == 1) & (pSecondOperand->Signed == -1)) {            \n            BigInteger_Copy(pSecondOperand, &pTempBI);\n            pTempBI->Signed = 1;\n            BigInteger_Sub(pFirstOperand, pTempBI, pBI_Result);\n        } else if ((pFirstOperand->Signed == -1) & (pSecondOperand->Signed == 1)) {\n            BigInteger_Copy(pFirstOperand, &pTempBI);\n            pTempBI->Signed = 1;\n            BigInteger_Sub(pSecondOperand, pTempBI, pBI_Result);\n        } /* End of if */\n    } /* End of if */    \n\n    BigInteger_Free(&pTempBI);    \n} /* End of BigInteger_Add */\n\n\nVOID BigInteger_Sub (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result)\n{\n    INT CompareResult;\n    UINT32 BIArrayIndex, Carry;\n    PBIG_INTEGER pTempBI = NULL, pTempBI2 = NULL;\n    \n    if  ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL)\n      || (pSecondOperand == NULL) || (pSecondOperand->pIntegerArray == NULL)) {\n        DEBUGPRINT(\"BigInteger_Sub: first or second operand is NULL.\\n\");\n        return;\n    } /* End of if */\n\n    if (*pBI_Result == NULL)\n        BigInteger_Init(pBI_Result);\n\n    CompareResult = BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand);\n    if ((CompareResult == 0) & ((pFirstOperand->Signed * pSecondOperand->Signed) > 0)) {\n        BigInteger_AllocSize(pBI_Result, 1);\n        return ;\n    } /* End of if */\n\n    BigInteger_Init(&pTempBI);\n    BigInteger_Init(&pTempBI2);\n\n    /*\n     *  Singed table\n     *  A - B || A > B || A < B\n     *  ------------------------\n     *  +   + ||   +   ||   -\n     *  +   - ||   +   ||   +\n     *  -   + ||   -   ||   -\n     *  -   - ||   -   ||   +\n     */\n    if ((pFirstOperand->Signed * pSecondOperand->Signed) > 0) {\n        if (CompareResult == 1) {\n            BigInteger_Copy(pFirstOperand, &pTempBI);\n            BigInteger_Copy(pSecondOperand, &pTempBI2);\n        } else if (CompareResult == -1) {\n            BigInteger_Copy(pSecondOperand, &pTempBI);\n            BigInteger_Copy(pFirstOperand, &pTempBI2);\n        } /* End of if */ \n\n        BigInteger_Copy(pTempBI, pBI_Result);    \n        Carry = 0;\n        for (BIArrayIndex=0; BIArrayIndex < (*pBI_Result)->ArrayLength; BIArrayIndex++)\n        {\n            if (BIArrayIndex < pTempBI2->ArrayLength) {\n                if ((*pBI_Result)->pIntegerArray[BIArrayIndex] >= (pTempBI2->pIntegerArray[BIArrayIndex] - Carry)) {\n                    (*pBI_Result)->pIntegerArray[BIArrayIndex] = (*pBI_Result)->pIntegerArray[BIArrayIndex] - pTempBI2->pIntegerArray[BIArrayIndex] - Carry;\n                    Carry = 0;\n                } else {\n                    (*pBI_Result)->pIntegerArray[BIArrayIndex] = 0xffffffffUL - pTempBI2->pIntegerArray[BIArrayIndex] - Carry + (*pBI_Result)->pIntegerArray[BIArrayIndex] + 1;\n                    Carry = 1;\n                } /* End of if */\n            } else {\n                if ((*pBI_Result)->pIntegerArray[BIArrayIndex] >= Carry) {\n                    (*pBI_Result)->pIntegerArray[BIArrayIndex] -= Carry;\n                    Carry = 0;\n                } else {\n                    (*pBI_Result)->pIntegerArray[BIArrayIndex] = 0xffffffffUL - Carry;\n                    Carry = 1;\n                } /* End of if */            \n            } /* End of if */\n        } /* End of for */\n\n        if  (((pFirstOperand->Signed == 1) & (pSecondOperand->Signed == 1) & (CompareResult == -1))\n          || ((pFirstOperand->Signed == -1) & (pSecondOperand->Signed == -1) & (CompareResult == 1)))\n            (*pBI_Result)->Signed = -1;\n        \n        BigInteger_ClearHighBits(*pBI_Result);        \n    } else {\n        if  ((pFirstOperand->Signed == 1) & (pSecondOperand->Signed == -1)) {\n            BigInteger_Copy(pSecondOperand, &pTempBI);\n            pTempBI->Signed = 1;\n            BigInteger_Add(pFirstOperand, pTempBI, pBI_Result);\n        } else if ((pFirstOperand->Signed == -1) & (pSecondOperand->Signed == 1)) {\n            BigInteger_Copy(pFirstOperand, &pTempBI);\n            pTempBI->Signed = 1;\n            BigInteger_Add(pTempBI, pSecondOperand, pBI_Result);\n            (*pBI_Result)->Signed = -1;\n        } /* End of if */\n    } /* End of if */ \n    \n    BigInteger_Free(&pTempBI);\n    BigInteger_Free(&pTempBI2);     \n} /* End of BigInteger_Sub */\n\n\nVOID BigInteger_Mul (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result)\n{\n\n    UINT32 BIFirstIndex, BISecondIndex;\n    UINT64 FirstValue, SecondValue, Sum, Carry;\n   \n    if  ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL)\n      || (pSecondOperand == NULL) || (pSecondOperand->pIntegerArray == NULL)) {\n        DEBUGPRINT(\"BigInteger_Mul: first or second operand is NULL.\\n\");\n        return;\n    } /* End of if */\n   \n    /* The first or second operand is zero */\n    if  (((pFirstOperand->IntegerLength  == 1) && (pFirstOperand->pIntegerArray[0]  == 0))\n       ||((pSecondOperand->IntegerLength == 1) && (pSecondOperand->pIntegerArray[0] == 0))) {\n        BigInteger_AllocSize(pBI_Result, 1);\n        goto output;\n    } /* End of if */\n\n    /* The first or second operand is one */\n    if  ((pFirstOperand->IntegerLength  == 1) && (pFirstOperand->pIntegerArray[0]  == 1)) {\n        BigInteger_Copy(pSecondOperand, pBI_Result);\n        goto output;\n    } /* End of if */\n    if  ((pSecondOperand->IntegerLength  == 1) && (pSecondOperand->pIntegerArray[0]  == 1)) {\n        BigInteger_Copy(pFirstOperand, pBI_Result);\n        goto output;\n    } /* End of if */\n\n    BigInteger_AllocSize(pBI_Result, pFirstOperand->IntegerLength + pSecondOperand->IntegerLength);\n\n    for (BIFirstIndex=0; BIFirstIndex < pFirstOperand->ArrayLength; BIFirstIndex++)\n    {\n        Carry = 0;\n        FirstValue = (UINT64) pFirstOperand->pIntegerArray[BIFirstIndex];\n        if (FirstValue == 0) {\n            continue;\n        } else {\n            for (BISecondIndex=0; BISecondIndex < pSecondOperand->ArrayLength; BISecondIndex++)\n            {\n                SecondValue = ((UINT64) pSecondOperand->pIntegerArray[BISecondIndex])*FirstValue;\n                Sum = (UINT64) ((*pBI_Result)->pIntegerArray[BIFirstIndex + BISecondIndex] + SecondValue + Carry);               \n                Carry = Sum >> 32;\n                (*pBI_Result)->pIntegerArray[BIFirstIndex + BISecondIndex] = (UINT32) (Sum & 0xffffffffUL);\n            } /* End of for */\n            while (Carry != 0) {\n                Sum = (UINT64) (*pBI_Result)->pIntegerArray[BIFirstIndex + BISecondIndex];\n                Sum += Carry;\n\n                Carry = Sum >> 32;\n                (*pBI_Result)->pIntegerArray[BIFirstIndex + BISecondIndex] = (UINT32) (Sum & 0xffffffffUL);\n                BISecondIndex++;\n            } /* End of while */\n        } /* End of if */\n    } /* End of for */\n\noutput:\n    (*pBI_Result)->Signed = pFirstOperand->Signed * pSecondOperand->Signed;\n    BigInteger_ClearHighBits(*pBI_Result);\n} /* End of BigInteger_Mul */\n\n\nVOID BigInteger_Square (\n    IN PBIG_INTEGER pBI, \n    OUT PBIG_INTEGER *pBI_Result)\n{\n    INT BIFirstIndex, BISecondIndex;\n\tUINT32 HBITS_Value, LBITS_Value, Temp1_Value, Temp2_Value, Carry32;\n\tUINT32 *Point_Of_S, *Point_Of_Result, *Point_Of_BI;\n    UINT64 Result64_1, Result64_2, Carry64, TempValue64;    \n\n    if ((pBI == NULL) || (pBI->pIntegerArray == NULL)) {\n        DEBUGPRINT(\"\\tBigInteger_Square: the operand is NULL.\\n\");\n        return;\n    } /* End of if */\n   \n    /* The operand is zero */\n    if  ((pBI->IntegerLength  == 1) && (pBI->pIntegerArray[0]  ==  0)) {\n        BigInteger_AllocSize(pBI_Result, 1);\n        goto output;\n    } /* End of if */\n\n    BigInteger_AllocSize(pBI_Result, (pBI->IntegerLength*2) + 20);\n    BigInteger_AllocSize(&pBI_S, (pBI->IntegerLength*2) + 20);\n    BigInteger_AllocSize(&pBI_O, (pBI->IntegerLength*2) + 20);\n\n    /*\n     * Input: pBI = {a_0, a_1, a_2, a_3, ..., a_n}\n     * Step1. calculate a_0^2, a_1^2, a_2^2, a_3^2 ... a_n^2\n     */\n\tPoint_Of_S = pBI_S->pIntegerArray;\n    for (BIFirstIndex=0; BIFirstIndex < pBI->ArrayLength; BIFirstIndex++)\n    {\n    \tHBITS_Value = UINT32_HBITS(pBI->pIntegerArray[BIFirstIndex]);\n\t\tLBITS_Value = UINT32_LBITS(pBI->pIntegerArray[BIFirstIndex]);\n\t\tTemp1_Value = HBITS_Value*LBITS_Value;\n\t\tTemp2_Value = (Temp1_Value & 0x7fff) << 0x11;\n\t\tPoint_Of_S[0] = (LBITS_Value*LBITS_Value) + Temp2_Value;\n\t\tPoint_Of_S[1] = (HBITS_Value*HBITS_Value) + ((Temp1_Value >> 0xf) & 0x1ffff);\n\t\tif (Point_Of_S[0] < Temp2_Value)\n\t\t\tPoint_Of_S[1] += 1;\n\n\t\tPoint_Of_S += 2;\n    } /* End of for */\n\n    /*\n     * Step2. calculate a_0*{a_1, a_2, a_3, a_4, ..., a_n}\n     */\n    Point_Of_BI = pBI->pIntegerArray;\n    Point_Of_Result = (*pBI_Result)->pIntegerArray;\n    Point_Of_Result[0] = 0;\n    TempValue64 = (UINT64) Point_Of_BI[0];\n    Point_Of_Result++;\n    Carry64 = 0;\n    for (BIFirstIndex=1; BIFirstIndex < pBI->ArrayLength; BIFirstIndex++)\n    {\n        Result64_1 =  (UINT64) Point_Of_BI[BIFirstIndex]*TempValue64;\n        Result64_1 += Carry64;              \n        Carry64 = (Result64_1 >> 32);\n        Point_Of_Result[0] = (UINT32) (Result64_1 & 0xffffffffUL);\n        Point_Of_Result++;\n    } /* End of for */\n    if (Carry64 > 0)\n        Point_Of_Result[0] = (UINT32) (Carry64 & 0xffffffffUL);\n\n    /*\n     * Step3. calculate\n     *           a_1*{a_2, a_3, a_4, ..., a_n}\n     *           a_2*{a_3, a_4, a_5, ..., a_n}\n     *           a_3*{a_4, a_5, a_6, ..., a_n}\n     *           a_4*{a_5, a_6, a_7, ..., a_n}\n     *           ...\n     *           a_n-1*{a_n}\n     */\n    Point_Of_BI = pBI->pIntegerArray;\n    for (BIFirstIndex=1; BIFirstIndex < (pBI->ArrayLength - 1); BIFirstIndex++)\n    {\n        Point_Of_Result = (*pBI_Result)->pIntegerArray;\n        Point_Of_Result += (BIFirstIndex*2) + 1;\n        TempValue64 = (UINT64) Point_Of_BI[BIFirstIndex];\n        Carry64 = 0;\n        for (BISecondIndex=(BIFirstIndex + 1); BISecondIndex < pBI->ArrayLength; BISecondIndex++)\n        {\n            Result64_1 = ((UINT64) Point_Of_Result[0]) + Carry64;\n            Result64_2 = (UINT64) Point_Of_BI[BISecondIndex]*TempValue64;            \n            Carry64 = (Result64_1 >> 32);\n            Result64_1 = (Result64_1 & 0xffffffffUL);\n            Result64_1 = Result64_1 + Result64_2;\n            Carry64 += (Result64_1 >> 32);    \n            Point_Of_Result[0] = (UINT32) (Result64_1 & 0xffffffffUL); \n            Point_Of_Result++;\n        } /* End of for */\n        if (Carry64 > 0)\n            Point_Of_Result[0] += (UINT32) (Carry64 & 0xffffffffUL);\n    } /* End of for */\n    \n    BigInteger_ClearHighBits(*pBI_Result);\n    BigInteger_Copy(*pBI_Result, &pBI_O);\n    \n    Carry32 = 0;\n\tfor (BIFirstIndex=0; BIFirstIndex < pBI_O->ArrayLength; BIFirstIndex++) {\n        pBI_O->pIntegerArray[BIFirstIndex] = (pBI_O->pIntegerArray[BIFirstIndex] << 1) | Carry32;\n        if (pBI_O->pIntegerArray[BIFirstIndex] < (*pBI_Result)->pIntegerArray[BIFirstIndex])\n            Carry32 = 1;\n        else\n            Carry32 = 0;\n    } /* End of for */\n    pBI_O->pIntegerArray[BIFirstIndex] = Carry32;\n    pBI_O->IntegerLength++;\n    pBI_O->ArrayLength++;\n    BigInteger_ClearHighBits(pBI_O);\n    \n    BigInteger_Add(pBI_O, pBI_S, pBI_Result);    \noutput:\n    (*pBI_Result)->Signed = 1;\n    BigInteger_ClearHighBits(*pBI_Result);\n} /* End of BigInteger_Square */ \n\n\nVOID BigInteger_Div (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result,\n    OUT PBIG_INTEGER *pBI_Remainder)\n{\n    INT CompareResult;\n    INT Index, MulIndex, ComputeSize;\n    UINT32 MulStart;\n    UINT AllocLength, ArrayIndex, ShiftIndex;\n    PBIG_INTEGER pTempBI = NULL, pTempBI2 = NULL, pMulBI = NULL;\n    UINT8 SecondHighByte;\n\n    if  ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL)\n      || (pSecondOperand == NULL) || (pSecondOperand->pIntegerArray == NULL)) {\n        DEBUGPRINT(\"BigInteger_Div: first or second operand is NULL.\\n\");\n        return;\n    } /* End of if */\n\n    /* The second operand is zero */\n    if ((pSecondOperand->IntegerLength == 1) && (pSecondOperand->pIntegerArray[0] == 0)) {\n        DEBUGPRINT(\"BigInteger_Div: second operand is zero.\\n\");\n        return;\n    } /* End of if */\n\n    if (*pBI_Result == NULL)\n        BigInteger_Init(pBI_Result);\n    if (*pBI_Remainder == NULL)\n        BigInteger_Init(pBI_Remainder);\n\n    /* The second operand is one */\n    if  ((pSecondOperand->IntegerLength  == 1) && (pSecondOperand->pIntegerArray[0]  == 1)) {\n        BigInteger_Copy(pFirstOperand, pBI_Result);\n        BigInteger_Bin2BI(Value_0, 1, pBI_Remainder);        \n        goto output;\n    } /* End of if */\n\n    CompareResult = BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand);\n    if (CompareResult == 0) {\n        BigInteger_Bin2BI(Value_1, 1, pBI_Result);\n        BigInteger_Bin2BI(Value_0, 1, pBI_Remainder);\n        goto output;\n    } else if (CompareResult == -1) {\n        BigInteger_Bin2BI(Value_0, 1, pBI_Result);\n        BigInteger_Copy(pFirstOperand, pBI_Remainder);\n        goto output;\n    } /* End of if */\n    BigInteger_AllocSize(pBI_Result, pFirstOperand->IntegerLength - pSecondOperand->IntegerLength + 1);\n    BigInteger_AllocSize(pBI_Remainder, pSecondOperand->IntegerLength);\n\n    AllocLength = (UINT) (pFirstOperand->IntegerLength << 1);\n    BigInteger_AllocSize(&pTempBI, AllocLength);\n    BigInteger_AllocSize(&pTempBI2, AllocLength);\n    BigInteger_AllocSize(&pMulBI, AllocLength);\n\n    BigInteger_Copy(pFirstOperand, pBI_Remainder);\n    SecondHighByte = BigInteger_GetByteValue(pSecondOperand, pSecondOperand->IntegerLength);   \n    ComputeSize = (INT) pFirstOperand->IntegerLength - pSecondOperand->IntegerLength + 1;\n    for (Index = (INT) ComputeSize;Index >= 0;Index--) {\n        if (BigInteger_UnsignedCompare(*pBI_Remainder, pSecondOperand) == -1)\n            break;        \n\n        if (((pSecondOperand->IntegerLength + Index) - (*pBI_Remainder)->IntegerLength) <= 1) {\n            BigInteger_AllocSize(&pMulBI, Index + 1);\n            ArrayIndex = 0;\n            if (Index > 0)\n                ArrayIndex = (UINT) (Index - 1) >> 2 ;\n            ShiftIndex = (Index & 0x03);\n            if (ShiftIndex == 0)\n                ShiftIndex = 4;\n            ShiftIndex--;\n            MulStart = 0;\n            MulStart = (BigInteger_GetByteValue((*pBI_Remainder), pFirstOperand->IntegerLength + Index - ComputeSize + 1) & 0xFF) << 8;\n            MulStart = MulStart | (BigInteger_GetByteValue((*pBI_Remainder), pFirstOperand->IntegerLength + Index - ComputeSize) & 0xFF);\n            if (MulStart < (UINT32) SecondHighByte)\n                continue;\n\n            MulStart = MulStart / (UINT32) SecondHighByte;\n\n            if (MulStart > 0xFF)\n                MulStart = 0x100;\n\n            for (MulIndex = (INT) MulStart;MulIndex <= 0x101;MulIndex++) { /* 0xFFFF / 0xFF = 0x101 */\n                if ((MulIndex > 0xFF) && (ShiftIndex == 3))\n                        pMulBI->pIntegerArray[ArrayIndex + 1] = 0x01;\n                pMulBI->pIntegerArray[ArrayIndex] = ((UINT) MulIndex << (8*ShiftIndex));\n                BigInteger_Mul(pSecondOperand, pMulBI , &pTempBI);\n                CompareResult = BigInteger_UnsignedCompare(*pBI_Remainder, pTempBI);\n                if (CompareResult < 1) {\n                    if (MulIndex > 1) {\n                        if (CompareResult != 0) {                            \n                            if ((MulIndex == 0x100) && (ShiftIndex == 3))\n                                   pMulBI->pIntegerArray[ArrayIndex + 1] = 0;\n                            pMulBI->pIntegerArray[ArrayIndex] = ((UINT) (MulIndex - 1) << (8*ShiftIndex));\n                        } /* End of if */\n                        \n                        BigInteger_Mul(pSecondOperand, pMulBI, &pTempBI);                        \n                        BigInteger_Sub(*pBI_Remainder, pTempBI, &pTempBI2);\n                        BigInteger_Copy(pTempBI2, pBI_Remainder);\n                        BigInteger_Add(*pBI_Result, pMulBI, &pTempBI2);\n                        BigInteger_Copy(pTempBI2, pBI_Result);\n                    } /* End of if */\n                    break;\n                } /* End of if */\n\n                if ((MulIndex >= 0x100) && (ShiftIndex == 3))\n                   pMulBI->pIntegerArray[ArrayIndex++] = 0;\n                pMulBI->pIntegerArray[ArrayIndex] = 0;\n            } /* End of for */\n        } /* End of if */\n    } /* End of for */        \n\n    BigInteger_Free(&pTempBI);\n    BigInteger_Free(&pTempBI2);\n    BigInteger_Free(&pMulBI);\noutput:\n    (*pBI_Result)->Signed = pFirstOperand->Signed * pSecondOperand->Signed;\n    (*pBI_Remainder)->Signed = pFirstOperand->Signed * pSecondOperand->Signed;\n    BigInteger_ClearHighBits(*pBI_Result);\n    BigInteger_ClearHighBits(*pBI_Remainder);    \n} /* End of BigInteger_Div */\n\n\nVOID BigInteger_Montgomery_Reduction (\n    IN PBIG_INTEGER pBI_A,\n    IN PBIG_INTEGER pBI_P,\n     IN PBIG_INTEGER pBI_R,\n    OUT PBIG_INTEGER *pBI_Result)\n{\n    UINT32 *Point_P, *Point_Result;\n    UINT32 LoopCount;\n    UINT64 Result64_1, Result64_2, Carry64, TempValue64;  \n    INT FirstLoop, SecondLoop; \n\n    BigInteger_AllocSize(pBI_Result, pBI_A->IntegerLength+ pBI_P->IntegerLength + 20);\n    BigInteger_Copy(pBI_A, pBI_Result);\n    \n    Point_P = pBI_P->pIntegerArray;\n    Point_Result = (*pBI_Result)->pIntegerArray;\n    \n    LoopCount = Bits_Of_R >> 0x5;\n    for (FirstLoop = 0;FirstLoop < LoopCount;FirstLoop++) {\n        Carry64 = 0;\n        TempValue64 = (UINT64) Point_Result[0];\n        for (SecondLoop = 0;SecondLoop < pBI_P->ArrayLength;SecondLoop++) {\n            Result64_1 = ((UINT64) Point_Result[SecondLoop]) + Carry64;\n            Result64_2 = (UINT64) Point_P[SecondLoop]*TempValue64;            \n            Carry64 = (Result64_1 >> 32);\n            Result64_1 = (Result64_1 & 0xffffffffUL);\n            Result64_1 = Result64_1 + Result64_2;            \n            Carry64 += (Result64_1 >> 32);    \n            Point_Result[SecondLoop] = (UINT32) (Result64_1 & 0xffffffffUL);            \n        } /* End of for */\n        while (Carry64 != 0) {\n          Result64_1 = ((UINT64) Point_Result[SecondLoop]) + Carry64;\n          Carry64 = Result64_1 >> 32;\n          Point_Result[SecondLoop] = (UINT32) (Result64_1 & 0xffffffffUL);            \n          SecondLoop++;\n        } /* End of while */\n        Point_Result++;\n    } /* End of for */    \n\n    for (FirstLoop = 0;FirstLoop <= LoopCount;FirstLoop++) {\n        (*pBI_Result)->pIntegerArray[FirstLoop] = (*pBI_Result)->pIntegerArray[FirstLoop + LoopCount];\n    } /* End of for */   \n    if ((*pBI_Result)->pIntegerArray[LoopCount] != 0)\n        (*pBI_Result)->ArrayLength = LoopCount + 1;\n    else\n        (*pBI_Result)->ArrayLength = LoopCount;\n\n    (*pBI_Result)->IntegerLength = (*pBI_Result)->ArrayLength*4;\n    BigInteger_ClearHighBits(*pBI_Result); \n\n    if (BigInteger_UnsignedCompare(*pBI_Result, pBI_P) >= 0) {\n        BigInteger_Sub(*pBI_Result, pBI_P, &pBI_U);\n        BigInteger_Copy(pBI_U, pBI_Result);\n    } /* End of if */\n    BigInteger_ClearHighBits(*pBI_Result); \n} /* End of BigInteger_Montgomery_Reduction */ \n\n\nVOID BigInteger_Montgomery_ExpMod (\n    IN PBIG_INTEGER pBI_G,\n    IN PBIG_INTEGER pBI_E,\n    IN PBIG_INTEGER pBI_P,\n    OUT PBIG_INTEGER *pBI_Result)\n{\n    UINT Bits_Of_P;\n    UINT32 Index, Index2, AllocLength;\n\tUINT32 Sliding_Value , Sliding_HighValue, Sliding_LowValue;\n    PBIG_INTEGER pBI_Temp1 = NULL, pBI_Temp2 = NULL;\n    PBIG_INTEGER pBI_X = NULL, pBI_R = NULL, pBI_RR = NULL, pBI_1 = NULL;\n    BIG_INTEGER *pBI_A[SLIDING_WINDOW];\n    UINT8 *pRValue = NULL;\n\n    AllocLength = (pBI_G->IntegerLength + pBI_E->IntegerLength + pBI_P->IntegerLength + 300);\n    BigInteger_AllocSize(&pBI_Temp1, AllocLength);\n    BigInteger_AllocSize(&pBI_Temp2, AllocLength);\n\n    /* Calculate the bits of P and E, the highest bit is 1 */\n    BigInteger_BitsOfBI(pBI_P, &Bits_Of_P);    \n\n    if ((pBI_G->IntegerLength == 1) && (pBI_G->pIntegerArray[0] == 0)) {\n        BigInteger_Bin2BI(Value_0, 1, pBI_Result);\n        goto memory_free;\n    } /* End of if */\n\n    if ((pBI_G->IntegerLength == 1) && (pBI_G->pIntegerArray[0] == 1)) {\n        BigInteger_Div(pBI_G, pBI_P, &pBI_Temp1, pBI_Result);\n        goto memory_free;\n    } /* End of if */\n\n    if ((pBI_E->IntegerLength == 1) && (pBI_E->pIntegerArray[0] == 1)) {\n        BigInteger_Div(pBI_G, pBI_P, &pBI_Temp1, pBI_Result);\n        goto memory_free;\n    } /* End of if */\n\n    if ((pBI_E->IntegerLength == 1) && (pBI_E->pIntegerArray[0] == 2)) {\n        BigInteger_Mul(pBI_G, pBI_G, &pBI_Temp1);\n        BigInteger_Div(pBI_Temp1, pBI_P, &pBI_Temp2, pBI_Result);\n        goto memory_free;\n    } /* End of if */\n\n    /*\n     * Main algorithm\n     */   \n    BigInteger_Init(&pBI_R);\n    BigInteger_Init(&pBI_RR);\n    BigInteger_Bin2BI(Value_1, 1, &pBI_1);\n    BigInteger_AllocSize(&pBI_X, AllocLength);\n    BigInteger_AllocSize(&pBI_U, AllocLength); /* for BigInteger_Montgomery_Reduction */\n    BigInteger_AllocSize(&pBI_S, AllocLength); /* for BigInteger_Square */\n    BigInteger_AllocSize(&pBI_O, AllocLength); /* for BigInteger_Square */\n    \n    for (Index = 0; Index < SLIDING_WINDOW; Index++) {\n        pBI_A[Index] = NULL;\n\t\tBigInteger_AllocSize(&pBI_A[Index], 193);\n    } /* End of for */\n    BigInteger_Bin2BI(WPS_DH_P_VALUE, 192, &pBI_Temp1);\n    if (NdisCmpMemory(pBI_P->pIntegerArray, pBI_Temp1->pIntegerArray, pBI_P->IntegerLength) == 0) {\n        BigInteger_Bin2BI(WPS_DH_X_VALUE, 184, &pBI_X);\n        BigInteger_Bin2BI(WPS_DH_R_VALUE, 193, &pBI_R);\n        BigInteger_Bin2BI(WPS_DH_RRModP_VALUE, 192, &pBI_RR);\n        Bits_Of_R = 1537;\n    } else {\n        if ((Bits_Of_P % 8) == 0) {\n            AllocLength = pBI_P->IntegerLength + 1;\n        } else {\n            AllocLength = pBI_P->IntegerLength;\n        } /* End of if */\n/*        pRValue = (UINT8 *) kmalloc(sizeof(UINT8)*AllocLength, GFP_ATOMIC); */\n\t\tos_alloc_mem(NULL, (UCHAR **)&pRValue, sizeof(UINT8)*AllocLength);\n\tif (pRValue == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\tgoto memory_free;\n\t}\n        NdisZeroMemory(pRValue, sizeof(UINT8)*AllocLength);\n        pRValue[0] = (UINT8) (1 << (Bits_Of_P & 0x7));\n        BigInteger_Bin2BI(pRValue, AllocLength , &pBI_R);\n\n        BigInteger_Mul(pBI_R, pBI_R, &pBI_Temp1);\n        BigInteger_Div(pBI_Temp1, pBI_P, &pBI_A[1], &pBI_RR);\t\n        \n        /* X = 1*R (mod P) */\n        BigInteger_Div(pBI_R, pBI_P, &pBI_Temp2, &pBI_X);        \n    } /* End of if */ \n\n    /* A = G*R (mod P) => A = MonMod(G, R^2 mod P) */\t\n    BigInteger_Mul(pBI_G, pBI_RR, &pBI_Temp1);\n    BigInteger_Montgomery_Reduction(pBI_Temp1, pBI_P , pBI_R, &pBI_A[1]);\n    for (Index = 2; Index < SLIDING_WINDOW; Index++) {\n        BigInteger_Mul(pBI_A[Index - 1], pBI_A[1], &pBI_Temp1);\n\t    BigInteger_Montgomery_Reduction(pBI_Temp1, pBI_P, pBI_R, &pBI_A[Index]);\n    } /* End of for */\t\n\n    for (Index = pBI_E->IntegerLength ; Index > 0 ; Index--) {\t \t\n        for (Index2 = 0; Index2 < 4 ; Index2++) {\n            BigInteger_Square(pBI_X, &pBI_Temp1);\n\t\t\tBigInteger_Montgomery_Reduction(pBI_Temp1, pBI_P, pBI_R, &pBI_X);\n\t    } /* End of for */\n\n\t\tSliding_Value = BigInteger_GetByteValue(pBI_E, Index);\n\t\tSliding_HighValue = (Sliding_Value >> 4);\n\t \tif (Sliding_HighValue != 0) {\n            BigInteger_Mul(pBI_A[Sliding_HighValue], pBI_X, &pBI_Temp1);\n\t\t\tBigInteger_Montgomery_Reduction(pBI_Temp1, pBI_P, pBI_R, &pBI_X);\n\t \t} /* End of if */\n\n        for (Index2 = 0; Index2 < 4 ; Index2++) {\n            BigInteger_Square(pBI_X, &pBI_Temp1);\n\t\t\tBigInteger_Montgomery_Reduction(pBI_Temp1, pBI_P, pBI_R, &pBI_X);\n\t    } /* End of for */\n\n\t\tSliding_LowValue = Sliding_Value & 0x0f;\n\t \tif (Sliding_LowValue != 0) {\n            BigInteger_Mul(pBI_A[Sliding_LowValue], pBI_X, &pBI_Temp1);\n\t\t\tBigInteger_Montgomery_Reduction(pBI_Temp1, pBI_P, pBI_R, &pBI_X);\n\t \t} /* End of if */\n    } /* End of for */\n    BigInteger_Montgomery_Reduction(pBI_X, pBI_P , pBI_R, pBI_Result);\n\n    BigInteger_Free(&pBI_X);\n    BigInteger_Free(&pBI_1);\n    BigInteger_Free(&pBI_U);\n    BigInteger_Free(&pBI_S);\n    BigInteger_Free(&pBI_O);\n    for(Index = 0; Index < SLIDING_WINDOW; Index++)\n\t\t\tBigInteger_Free(&pBI_A[Index]);\t\t\t\n    if (pRValue != NULL)    \n/*        kfree(pRValue); */\n\t\tos_free_mem(NULL, pRValue);\n\nmemory_free:\n    BigInteger_Free(&pBI_R);\n    BigInteger_Free(&pBI_RR);\n    BigInteger_Free(&pBI_Temp1);\n    BigInteger_Free(&pBI_Temp2);\n} /* End of BigInteger_Montgomery_ExpMod */\n\n/* End of crypt_biginteger.c */\n\n"
  },
  {
    "path": "src/common/crypt_dh.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    DH\n\n    Abstract:\n    RFC 2631: Diffie-Hellman Key Agreement Method\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/01/21      Create Diffie-Hellman\n***************************************************************************/\n\n\n#include \"crypt_dh.h\"\n#include \"crypt_biginteger.h\"\n\n\n/*\n========================================================================\nRoutine Description:\n    Diffie-Hellman public key generation\n\nArguments:\n    GValue           Array in UINT8\n    GValueLength     The length of G in bytes\n    PValue           Array in UINT8\n    PValueLength     The length of P in bytes\n    PrivateKey       Private key\n    PrivateKeyLength The length of Private key in bytes\n\nReturn Value:\n    PublicKey       Public key\n    PublicKeyLength The length of public key in bytes\n\nNote:\n    Reference to RFC2631\n    PublicKey = G^PrivateKey (mod P)\n========================================================================\n*/\nvoid DH_PublicKey_Generate (\n    IN UINT8 GValue[],\n    IN UINT GValueLength,\n    IN UINT8 PValue[],\n    IN UINT PValueLength,\n    IN UINT8 PrivateKey[],\n    IN UINT PrivateKeyLength,\n    OUT UINT8 PublicKey[],\n    INOUT UINT *PublicKeyLength)\n{\n    PBIG_INTEGER pBI_G = NULL;\n    PBIG_INTEGER pBI_P = NULL;\n    PBIG_INTEGER pBI_PrivateKey = NULL;\n    PBIG_INTEGER pBI_PublicKey = NULL;\n\n    /*   \n     * 1. Check the input parameters\n     *    - GValueLength, PValueLength and PrivateLength must be large than zero\n     *    - PublicKeyLength must be large or equal than PValueLength\n     *    - PValue must be odd\n     *\n     *    - PValue must be prime number (no implement)\n     *    - GValue must be greater than 0 but less than the PValue (no implement)\n     */\n    if (GValueLength == 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_PublicKey_Generate: G length is (%d)\\n\", GValueLength));\n        return;\n    } /* End of if */\n    if (PValueLength == 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_PublicKey_Generate: P length is (%d)\\n\", PValueLength));\n        return;\n    } /* End of if */\n    if (PrivateKeyLength == 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_PublicKey_Generate: private key length is (%d)\\n\", PrivateKeyLength));\n        return;\n    } /* End of if */\n    if (*PublicKeyLength < PValueLength) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_PublicKey_Generate: public key length(%d) must be large or equal than P length(%d)\\n\", \n            *PublicKeyLength, PValueLength));\n        return;\n    } /* End of if */\n    if (!(PValue[PValueLength - 1] & 0x1)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_PublicKey_Generate: P value must be odd\\n\"));\n        return;\n    } /* End of if */\n\n    /*   \n     * 2. Transfer parameters to BigInteger structure\n     */\n    BigInteger_Init(&pBI_G);\n    BigInteger_Init(&pBI_P);\n    BigInteger_Init(&pBI_PrivateKey);\n    BigInteger_Init(&pBI_PublicKey);\n    BigInteger_Bin2BI(GValue, GValueLength, &pBI_G);\n    BigInteger_Bin2BI(PValue, PValueLength, &pBI_P);\n    BigInteger_Bin2BI(PrivateKey, PrivateKeyLength, &pBI_PrivateKey);\n\n    /*   \n     * 3. Calculate PublicKey = G^PrivateKey (mod P)\n     *    - BigInteger Operation\n     *    - Montgomery reduction\n     */     \n    BigInteger_Montgomery_ExpMod(pBI_G, pBI_PrivateKey, pBI_P, &pBI_PublicKey);\n\n    /*   \n     * 4. Transfer BigInteger structure to char array\n     */\n    BigInteger_BI2Bin(pBI_PublicKey, PublicKey, PublicKeyLength);\n\n    BigInteger_Free(&pBI_G);\n    BigInteger_Free(&pBI_P);\n    BigInteger_Free(&pBI_PrivateKey);\n    BigInteger_Free(&pBI_PublicKey);    \n} /* End of DH_PublicKey_Generate */\n\n\n/*\n========================================================================\nRoutine Description:\n    Diffie-Hellman secret key generation\n\nArguments:\n    PublicKey        Public key\n    PublicKeyLength  The length of Public key in bytes\n    PValue           Array in UINT8\n    PValueLength     The length of P in bytes\n    PrivateKey       Private key\n    PrivateKeyLength The length of Private key in bytes\n\nReturn Value:\n    SecretKey        Secret key\n    SecretKeyLength  The length of secret key in bytes\n\nNote:\n    Reference to RFC2631\n    SecretKey = PublicKey^PrivateKey (mod P)\n========================================================================\n*/\nvoid DH_SecretKey_Generate (\n    IN UINT8 PublicKey[],\n    IN UINT PublicKeyLength,\n    IN UINT8 PValue[],\n    IN UINT PValueLength,\n    IN UINT8 PrivateKey[],\n    IN UINT PrivateKeyLength,\n    OUT UINT8 SecretKey[],\n    INOUT UINT *SecretKeyLength)\n{\n    PBIG_INTEGER pBI_P = NULL;\n    PBIG_INTEGER pBI_SecretKey = NULL;\n    PBIG_INTEGER pBI_PrivateKey = NULL;\n    PBIG_INTEGER pBI_PublicKey = NULL;\n\n    /*   \n     * 1. Check the input parameters\n     *    - PublicKeyLength, PValueLength and PrivateLength must be large than zero\n     *    - SecretKeyLength must be large or equal than PValueLength\n     *    - PValue must be odd\n     *\n     *    - PValue must be prime number (no implement)\n     */\n    if (PublicKeyLength == 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_SecretKey_Generate: public key length is (%d)\\n\", PublicKeyLength));\n        return;\n    } /* End of if */\n    if (PValueLength == 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_SecretKey_Generate: P length is (%d)\\n\", PValueLength));\n        return;\n    } /* End of if */\n    if (PrivateKeyLength == 0) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_SecretKey_Generate: private key length is (%d)\\n\", PrivateKeyLength));\n        return;\n    } /* End of if */\n    if (*SecretKeyLength < PValueLength) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_SecretKey_Generate: secret key length(%d) must be large or equal than P length(%d)\\n\", \n            *SecretKeyLength, PValueLength));\n        return;\n    } /* End of if */\n    if (!(PValue[PValueLength - 1] & 0x1)) {\n    \tDBGPRINT(RT_DEBUG_ERROR, (\"DH_SecretKey_Generate: P value must be odd\\n\"));\n        return;\n    } /* End of if */\n\n    /*   \n     * 2. Transfer parameters to BigInteger structure\n     */\n    BigInteger_Init(&pBI_P);\n    BigInteger_Init(&pBI_PrivateKey);\n    BigInteger_Init(&pBI_PublicKey);\n    BigInteger_Init(&pBI_SecretKey);\n\n    BigInteger_Bin2BI(PublicKey, PublicKeyLength, &pBI_PublicKey);\n    BigInteger_Bin2BI(PValue, PValueLength, &pBI_P);\n    BigInteger_Bin2BI(PrivateKey, PrivateKeyLength, &pBI_PrivateKey);\n\n    /*   \n     * 3. Calculate SecretKey = PublicKey^PrivateKey (mod P)\n     *    - BigInteger Operation\n     *    - Montgomery reduction\n     */\n    BigInteger_Montgomery_ExpMod(pBI_PublicKey, pBI_PrivateKey, pBI_P, &pBI_SecretKey);\n\n    /*   \n     * 4. Transfer BigInteger structure to char array\n     */\n    BigInteger_BI2Bin(pBI_SecretKey, SecretKey, SecretKeyLength);\n\n    BigInteger_Free(&pBI_P);\n    BigInteger_Free(&pBI_PrivateKey);\n    BigInteger_Free(&pBI_PublicKey);    \n    BigInteger_Free(&pBI_SecretKey);\n} /* End of DH_SecretKey_Generate */\n\n"
  },
  {
    "path": "src/common/crypt_hmac.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    HMAC\n\n    Abstract:\n    FIPS 198: The Keyed-Hash Message Authentication Code (HMAC)\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2008/11/24      Create HMAC-SHA1, HMAC-SHA256\n***************************************************************************/\n\n#include \"crypt_hmac.h\"\n\n\n#ifdef HMAC_SHA1_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    HMAC using SHA1 hash function\n\nArguments:\n    key             Secret key\n    key_len         The length of the key in bytes   \n    message         Message context\n    message_len     The length of message in bytes\n    macLen          Request the length of message authentication code\n\nReturn Value:\n    mac             Message authentication code\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_HMAC_SHA1 (\n    IN  const UINT8 Key[], \n    IN  UINT KeyLen, \n    IN  const UINT8 Message[], \n    IN  UINT MessageLen, \n    OUT UINT8 MAC[],\n    IN  UINT MACLen)    \n{\n    SHA1_CTX_STRUC sha_ctx1;\n    SHA1_CTX_STRUC sha_ctx2;\n    UINT8 K0[SHA1_BLOCK_SIZE];\n    UINT8 Digest[SHA1_DIGEST_SIZE];    \n    UINT index;\n\n    NdisZeroMemory(&sha_ctx1, sizeof(SHA1_CTX_STRUC));\n    NdisZeroMemory(&sha_ctx2, sizeof(SHA1_CTX_STRUC));    \n    /*\n     * If the length of K = B(Block size): K0 = K.\n     * If the length of K > B: hash K to obtain an L byte string, \n     * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).\n     * If the length of K < B: append zeros to the end of K to create a B-byte string K0\n     */\n    NdisZeroMemory(K0, SHA1_BLOCK_SIZE);\n    if (KeyLen <= SHA1_BLOCK_SIZE)\n        NdisMoveMemory(K0, Key, KeyLen);\n    else\n        RT_SHA1(Key, KeyLen, K0);\n    /* End of if */\n\n    /* Exclusive-Or K0 with ipad */\n    /* ipad: Inner pad; the byte x36 repeated B times. */\n    for (index = 0; index < SHA1_BLOCK_SIZE; index++)\n        K0[index] ^= 0x36;\n        /* End of for */\n\n    RT_SHA1_Init(&sha_ctx1);\n    /* H(K0^ipad) */\n    RT_SHA1_Append(&sha_ctx1, K0, sizeof(K0));\n    /* H((K0^ipad)||text) */\n    RT_SHA1_Append(&sha_ctx1, Message, MessageLen);\n    RT_SHA1_End(&sha_ctx1, Digest);\n\n    /* Exclusive-Or K0 with opad and remove ipad */\n    /* opad: Outer pad; the byte x5c repeated B times. */\n    for (index = 0; index < SHA1_BLOCK_SIZE; index++)\n        K0[index] ^= 0x36^0x5c;\n        /* End of for */\n\n    RT_SHA1_Init(&sha_ctx2);\n    /* H(K0^opad) */\n    RT_SHA1_Append(&sha_ctx2, K0, sizeof(K0));\n    /* H( (K0^opad) || H((K0^ipad)||text) ) */\n    RT_SHA1_Append(&sha_ctx2, Digest, SHA1_DIGEST_SIZE);\n    RT_SHA1_End(&sha_ctx2, Digest);\n\n    if (MACLen > SHA1_DIGEST_SIZE)\n        NdisMoveMemory(MAC, Digest, SHA1_DIGEST_SIZE);\n    else\n        NdisMoveMemory(MAC, Digest, MACLen);    \n} /* End of RT_HMAC_SHA1 */\n#endif /* HMAC_SHA1_SUPPORT */\n\n\n#ifdef HMAC_SHA256_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    HMAC using SHA256 hash function\n\nArguments:\n    key             Secret key\n    key_len         The length of the key in bytes   \n    message         Message context\n    message_len     The length of message in bytes\n    macLen          Request the length of message authentication code\n\nReturn Value:\n    mac             Message authentication code\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_HMAC_SHA256 (\n    IN  const UINT8 Key[], \n    IN  UINT KeyLen, \n    IN  const UINT8 Message[], \n    IN  UINT MessageLen, \n    OUT UINT8 MAC[],\n    IN  UINT MACLen)\n{\n    SHA256_CTX_STRUC sha_ctx1;\n    SHA256_CTX_STRUC sha_ctx2;\n    UINT8 K0[SHA256_BLOCK_SIZE];\n    UINT8 Digest[SHA256_DIGEST_SIZE];\n    UINT index;\n\n    NdisZeroMemory(&sha_ctx1, sizeof(SHA256_CTX_STRUC));\n    NdisZeroMemory(&sha_ctx2, sizeof(SHA256_CTX_STRUC));\n    /*\n     * If the length of K = B(Block size): K0 = K.\n     * If the length of K > B: hash K to obtain an L byte string, \n     * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).\n     * If the length of K < B: append zeros to the end of K to create a B-byte string K0\n     */\n    NdisZeroMemory(K0, SHA256_BLOCK_SIZE);\n    if (KeyLen <= SHA256_BLOCK_SIZE) {\n        NdisMoveMemory(K0, Key, KeyLen);\n    } else {\n        RT_SHA256(Key, KeyLen, K0);\n    }\n\n    /* Exclusive-Or K0 with ipad */\n    /* ipad: Inner pad; the byte x36 repeated B times. */\n    for (index = 0; index < SHA256_BLOCK_SIZE; index++)\n        K0[index] ^= 0x36;\n        /* End of for */\n        \n    RT_SHA256_Init(&sha_ctx1);\n    /* H(K0^ipad) */\n    RT_SHA256_Append(&sha_ctx1, K0, sizeof(K0));\n    /* H((K0^ipad)||text) */\n    RT_SHA256_Append(&sha_ctx1, Message, MessageLen);  \n    RT_SHA256_End(&sha_ctx1, Digest);\n\n    /* Exclusive-Or K0 with opad and remove ipad */\n    /* opad: Outer pad; the byte x5c repeated B times. */\n    for (index = 0; index < SHA256_BLOCK_SIZE; index++)\n        K0[index] ^= 0x36^0x5c;\n        /* End of for */\n        \n    RT_SHA256_Init(&sha_ctx2);\n    /* H(K0^opad) */\n    RT_SHA256_Append(&sha_ctx2, K0, sizeof(K0));\n    /* H( (K0^opad) || H((K0^ipad)||text) ) */\n    RT_SHA256_Append(&sha_ctx2, Digest, SHA256_DIGEST_SIZE);\n    RT_SHA256_End(&sha_ctx2, Digest);\n\n    if (MACLen > SHA256_DIGEST_SIZE)\n        NdisMoveMemory(MAC, Digest,SHA256_DIGEST_SIZE);\n    else\n        NdisMoveMemory(MAC, Digest, MACLen);\n    \n} /* End of RT_HMAC_SHA256 */\n#endif /* HMAC_SHA256_SUPPORT */\n\n\n#ifdef HMAC_MD5_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    HMAC using MD5 hash function\n\nArguments:\n    key             Secret key\n    key_len         The length of the key in bytes   \n    message         Message context\n    message_len     The length of message in bytes\n    macLen          Request the length of message authentication code\n\nReturn Value:\n    mac             Message authentication code\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_HMAC_MD5(\n    IN  const UINT8 Key[], \n    IN  UINT KeyLen, \n    IN  const UINT8 Message[], \n    IN  UINT MessageLen, \n    OUT UINT8 MAC[],\n    IN  UINT MACLen)    \n{\n    MD5_CTX_STRUC md5_ctx1;\n    MD5_CTX_STRUC md5_ctx2;\n    UINT8 K0[MD5_BLOCK_SIZE];\n    UINT8 Digest[MD5_DIGEST_SIZE];    \n    UINT index;\n\n    NdisZeroMemory(&md5_ctx1, sizeof(MD5_CTX_STRUC));\n    NdisZeroMemory(&md5_ctx2, sizeof(MD5_CTX_STRUC));\n    /*\n     * If the length of K = B(Block size): K0 = K.\n     * If the length of K > B: hash K to obtain an L byte string, \n     * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).\n     * If the length of K < B: append zeros to the end of K to create a B-byte string K0\n     */\n    NdisZeroMemory(K0, MD5_BLOCK_SIZE);\n    if (KeyLen <= MD5_BLOCK_SIZE) {\n        NdisMoveMemory(K0, Key, KeyLen);\n    } else {\n        RT_MD5(Key, KeyLen, K0);\n    }\n\n    /* Exclusive-Or K0 with ipad */\n    /* ipad: Inner pad; the byte x36 repeated B times. */\n    for (index = 0; index < MD5_BLOCK_SIZE; index++)\n        K0[index] ^= 0x36;\n        /* End of for */\n        \n    RT_MD5_Init(&md5_ctx1);\n    /* H(K0^ipad) */\n    RT_MD5_Append(&md5_ctx1, K0, sizeof(K0));\n    /* H((K0^ipad)||text) */\n    RT_MD5_Append(&md5_ctx1, Message, MessageLen);  \n    RT_MD5_End(&md5_ctx1, Digest);\n\n    /* Exclusive-Or K0 with opad and remove ipad */\n    /* opad: Outer pad; the byte x5c repeated B times. */\n    for (index = 0; index < MD5_BLOCK_SIZE; index++)\n        K0[index] ^= 0x36^0x5c;\n        /* End of for */\n        \n    RT_MD5_Init(&md5_ctx2);\n    /* H(K0^opad) */\n    RT_MD5_Append(&md5_ctx2, K0, sizeof(K0));\n    /* H( (K0^opad) || H((K0^ipad)||text) ) */\n    RT_MD5_Append(&md5_ctx2, Digest, MD5_DIGEST_SIZE);\n    RT_MD5_End(&md5_ctx2, Digest);\n\n    if (MACLen > MD5_DIGEST_SIZE)\n        NdisMoveMemory(MAC, Digest, MD5_DIGEST_SIZE);\n    else\n        NdisMoveMemory(MAC, Digest, MACLen);    \n} /* End of RT_HMAC_SHA256 */\n#endif /* HMAC_MD5_SUPPORT */\n\n\n/* End of crypt_hmac.c */\n\n"
  },
  {
    "path": "src/common/crypt_md5.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    MD5\n\n    Abstract:\n    RFC1321: The MD5 Message-Digest Algorithm\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2008/11/24      Create md5\n***************************************************************************/\n\n#include \"rt_config.h\"\n\n\n#ifdef MD5_SUPPORT\n/* \n * F, G, H and I are basic MD5 functions.\n */ \n#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))\n#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))\n#define H(x, y, z) ((x) ^ (y) ^ (z))\n#define I(x, y, z) ((y) ^ ((x) | (~z))) \n\n#define ROTL(x,n,w) ((x << n) | (x >> (w - n)))\n#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */ \n\n#define ROUND1(a, b, c, d, x, s, ac) {          \\\n    (a) += F((b),(c),(d)) + (x) + (UINT32)(ac); \\\n    (a)  = ROTL32((a),(s));                     \\\n    (a) += (b);                                 \\\n}\n#define ROUND2(a, b, c, d, x, s, ac) {          \\\n    (a) += G((b),(c),(d)) + (x) + (UINT32)(ac); \\\n    (a)  = ROTL32((a),(s));                     \\\n    (a) += (b);                                 \\\n}\n#define ROUND3(a, b, c, d, x, s, ac) {          \\\n    (a) += H((b),(c),(d)) + (x) + (UINT32)(ac); \\\n    (a)  = ROTL32((a),(s));                     \\\n    (a) += (b);                                 \\\n}\n#define ROUND4(a, b, c, d, x, s, ac) {          \\\n    (a) += I((b),(c),(d)) + (x) + (UINT32)(ac); \\\n    (a)  = ROTL32((a),(s));                     \\\n    (a) += (b);                                 \\\n}\nstatic const UINT32 MD5_DefaultHashValue[4] = {\n    0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL\n};\n#endif /* MD5_SUPPORT */\n\n\n#ifdef MD5_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    Initial Md5_CTX_STRUC\n\nArguments:\n    pMD5_CTX        Pointer to Md5_CTX_STRUC\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_MD5_Init (\n    IN  MD5_CTX_STRUC *pMD5_CTX)\n{\n    NdisMoveMemory(pMD5_CTX->HashValue, MD5_DefaultHashValue, \n        sizeof(MD5_DefaultHashValue));\n    NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);\n    pMD5_CTX->BlockLen   = 0;\n    pMD5_CTX->MessageLen = 0;  \n} /* End of RT_MD5_Init */\n\n\n/*\n========================================================================\nRoutine Description:\n    MD5 computation for one block (512 bits)\n\nArguments:\n    pMD5_CTX        Pointer to Md5_CTX_STRUC\n\nReturn Value:\n    None\n\nNote:\n    T[i] := floor(abs(sin(i + 1)) * (2 pow 32)), i is number of round\n========================================================================\n*/\nVOID RT_MD5_Hash (\n    IN  MD5_CTX_STRUC *pMD5_CTX)\n{\n    UINT32 X_i;\n    UINT32 X[16];\n    UINT32 a,b,c,d;\n   \n    /* Prepare the message schedule, {X_i} */\n    NdisMoveMemory(X, pMD5_CTX->Block, MD5_BLOCK_SIZE);\n    for (X_i = 0; X_i < 16; X_i++)\n        X[X_i] = cpu2le32(X[X_i]); /* Endian Swap */\n        /* End of for */\n    \n    /* MD5 hash computation */\n    /* Initialize the working variables */\n    a = pMD5_CTX->HashValue[0];\n    b = pMD5_CTX->HashValue[1];\n    c = pMD5_CTX->HashValue[2];\n    d = pMD5_CTX->HashValue[3];\n\n    /*\n     *  Round 1\n     *  Let [abcd k s i] denote the operation \n     *  a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)\n     */\n    ROUND1(a, b, c, d, X[ 0],  7, 0xd76aa478); /* 1 */   \n    ROUND1(d, a, b, c, X[ 1], 12, 0xe8c7b756); /* 2 */\n    ROUND1(c, d, a, b, X[ 2], 17, 0x242070db); /* 3 */\n    ROUND1(b, c, d, a, X[ 3], 22, 0xc1bdceee); /* 4 */\n    ROUND1(a, b, c, d, X[ 4],  7, 0xf57c0faf); /* 5 */    \n    ROUND1(d, a, b, c, X[ 5], 12, 0x4787c62a); /* 6 */\n    ROUND1(c, d, a, b, X[ 6], 17, 0xa8304613); /* 7 */\n    ROUND1(b, c, d, a, X[ 7], 22, 0xfd469501); /* 8 */\n    ROUND1(a, b, c, d, X[ 8],  7, 0x698098d8); /* 9 */\n    ROUND1(d, a, b, c, X[ 9], 12, 0x8b44f7af); /* 10 */\n    ROUND1(c, d, a, b, X[10], 17, 0xffff5bb1); /* 11 */\n    ROUND1(b, c, d, a, X[11], 22, 0x895cd7be); /* 12 */\n    ROUND1(a, b, c, d, X[12],  7, 0x6b901122); /* 13 */\n    ROUND1(d, a, b, c, X[13], 12, 0xfd987193); /* 14 */\n    ROUND1(c, d, a, b, X[14], 17, 0xa679438e); /* 15 */\n    ROUND1(b, c, d, a, X[15], 22, 0x49b40821); /* 16 */\n\n    /*\n     *  Round 2\n     *  Let [abcd k s i] denote the operation \n     *  a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)\n     */\n    ROUND2(a, b, c, d, X[ 1],  5, 0xf61e2562); /* 17 */\n    ROUND2(d, a, b, c, X[ 6],  9, 0xc040b340); /* 18 */\n    ROUND2(c, d, a, b, X[11], 14, 0x265e5a51); /* 19 */\n    ROUND2(b, c, d, a, X[ 0], 20, 0xe9b6c7aa); /* 20 */\n    ROUND2(a, b, c, d, X[ 5],  5, 0xd62f105d); /* 21 */\n    ROUND2(d, a, b, c, X[10],  9,  0x2441453); /* 22 */\n    ROUND2(c, d, a, b, X[15], 14, 0xd8a1e681); /* 23 */\n    ROUND2(b, c, d, a, X[ 4], 20, 0xe7d3fbc8); /* 24 */\n    ROUND2(a, b, c, d, X[ 9],  5, 0x21e1cde6); /* 25 */\n    ROUND2(d, a, b, c, X[14],  9, 0xc33707d6); /* 26 */\n    ROUND2(c, d, a, b, X[ 3], 14, 0xf4d50d87); /* 27 */ \n    ROUND2(b, c, d, a, X[ 8], 20, 0x455a14ed); /* 28 */\n    ROUND2(a, b, c, d, X[13],  5, 0xa9e3e905); /* 29 */\n    ROUND2(d, a, b, c, X[ 2],  9, 0xfcefa3f8); /* 30 */\n    ROUND2(c, d, a, b, X[ 7], 14, 0x676f02d9); /* 31 */\n    ROUND2(b, c, d, a, X[12], 20, 0x8d2a4c8a); /* 32 */ \n\n    /*\n     *  Round 3\n     *  Let [abcd k s t] denote the operation \n     *  a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)\n     */\n    ROUND3(a, b, c, d, X[ 5],  4, 0xfffa3942); /* 33 */\n    ROUND3(d, a, b, c, X[ 8], 11, 0x8771f681); /* 34 */\n    ROUND3(c, d, a, b, X[11], 16, 0x6d9d6122); /* 35 */\n    ROUND3(b, c, d, a, X[14], 23, 0xfde5380c); /* 36 */\n    ROUND3(a, b, c, d, X[ 1],  4, 0xa4beea44); /* 37 */\n    ROUND3(d, a, b, c, X[ 4], 11, 0x4bdecfa9); /* 38 */\n    ROUND3(c, d, a, b, X[ 7], 16, 0xf6bb4b60); /* 39 */\n    ROUND3(b, c, d, a, X[10], 23, 0xbebfbc70); /* 40 */\n    ROUND3(a, b, c, d, X[13],  4, 0x289b7ec6); /* 41 */\n    ROUND3(d, a, b, c, X[ 0], 11, 0xeaa127fa); /* 42 */\n    ROUND3(c, d, a, b, X[ 3], 16, 0xd4ef3085); /* 43 */\n    ROUND3(b, c, d, a, X[ 6], 23,  0x4881d05); /* 44 */\n    ROUND3(a, b, c, d, X[ 9],  4, 0xd9d4d039); /* 45 */\n    ROUND3(d, a, b, c, X[12], 11, 0xe6db99e5); /* 46 */\n    ROUND3(c, d, a, b, X[15], 16, 0x1fa27cf8); /* 47 */\n    ROUND3(b, c, d, a, X[ 2], 23, 0xc4ac5665); /* 48 */\n\n    /*\n     *  Round 4\n     *  Let [abcd k s t] denote the operation \n     *  a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s)\n     */\n    ROUND4(a, b, c, d, X[ 0],  6, 0xf4292244); /* 49 */\n    ROUND4(d, a, b, c, X[ 7], 10, 0x432aff97); /* 50 */\n    ROUND4(c, d, a, b, X[14], 15, 0xab9423a7); /* 51 */\n    ROUND4(b, c, d, a, X[ 5], 21, 0xfc93a039); /* 52 */\n    ROUND4(a, b, c, d, X[12],  6, 0x655b59c3); /* 53 */\n    ROUND4(d, a, b, c, X[ 3], 10, 0x8f0ccc92); /* 54 */\n    ROUND4(c, d, a, b, X[10], 15, 0xffeff47d); /* 55 */\n    ROUND4(b, c, d, a, X[ 1], 21, 0x85845dd1); /* 56 */\n    ROUND4(a, b, c, d, X[ 8],  6, 0x6fa87e4f); /* 57 */\n    ROUND4(d, a, b, c, X[15], 10, 0xfe2ce6e0); /* 58 */\n    ROUND4(c, d, a, b, X[ 6], 15, 0xa3014314); /* 59 */\n    ROUND4(b, c, d, a, X[13], 21, 0x4e0811a1); /* 60 */\n    ROUND4(a, b, c, d, X[ 4],  6, 0xf7537e82); /* 61 */\n    ROUND4(d, a, b, c, X[11], 10, 0xbd3af235); /* 62 */\n    ROUND4(c, d, a, b, X[ 2], 15, 0x2ad7d2bb); /* 63 */\n    ROUND4(b, c, d, a, X[ 9], 21, 0xeb86d391); /* 64 */  \n\n    /* Compute the i^th intermediate hash value H^(i) */\n    pMD5_CTX->HashValue[0] += a;\n    pMD5_CTX->HashValue[1] += b;\n    pMD5_CTX->HashValue[2] += c;\n    pMD5_CTX->HashValue[3] += d;\n\n    NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);\n    pMD5_CTX->BlockLen = 0;\n} /* End of RT_MD5_Hash */\n\n\n/*\n========================================================================\nRoutine Description:\n    The message is appended to block. If block size > 64 bytes, the MD5_Hash \nwill be called.\n\nArguments:\n    pMD5_CTX        Pointer to MD5_CTX_STRUC\n    message         Message context\n    messageLen      The length of message in bytes\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_MD5_Append (\n    IN  MD5_CTX_STRUC *pMD5_CTX, \n    IN  const UINT8 Message[], \n    IN  UINT MessageLen)\n{\n    UINT appendLen = 0;\n    UINT diffLen = 0;\n    \n    while (appendLen != MessageLen) {\n        diffLen = MessageLen - appendLen;\n        if ((pMD5_CTX->BlockLen + diffLen) < MD5_BLOCK_SIZE) {\n            NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, \n                Message + appendLen, diffLen);\n            pMD5_CTX->BlockLen += diffLen;\n            appendLen += diffLen;\n        } \n        else\n        {\n            NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, \n                Message + appendLen, MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);\n            appendLen += (MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);\n            pMD5_CTX->BlockLen = MD5_BLOCK_SIZE;\n            RT_MD5_Hash(pMD5_CTX);\n        } /* End of if */\n    } /* End of while */\n    pMD5_CTX->MessageLen += MessageLen;\n} /* End of RT_MD5_Append */\n\n\n/*\n========================================================================\nRoutine Description:\n    1. Append bit 1 to end of the message\n    2. Append the length of message in rightmost 64 bits\n    3. Transform the Hash Value to digest message\n\nArguments:\n    pMD5_CTX        Pointer to MD5_CTX_STRUC\n\nReturn Value:\n    digestMessage   Digest message\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_MD5_End (\n    IN  MD5_CTX_STRUC *pMD5_CTX, \n    OUT UINT8 DigestMessage[])\n{\n    UINT index;\n    UINT64 message_length_bits;\n\n    /* append 1 bits to end of the message */\n    NdisFillMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, 1, 0x80);\n\n    /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */\n    if (pMD5_CTX->BlockLen > 55)\n        RT_MD5_Hash(pMD5_CTX);\n    /* End of if */\n\n    /* Append the length of message in rightmost 64 bits */\n    message_length_bits = pMD5_CTX->MessageLen*8;\n    message_length_bits = cpu2le64(message_length_bits);\n    NdisMoveMemory(&pMD5_CTX->Block[56], &message_length_bits, 8);\n    RT_MD5_Hash(pMD5_CTX);\n\n    /* Return message digest, transform the UINT32 hash value to bytes */    \n    for (index = 0; index < 4;index++)\n        pMD5_CTX->HashValue[index] = cpu2le32(pMD5_CTX->HashValue[index]);\n        /* End of for */\n    NdisMoveMemory(DigestMessage, pMD5_CTX->HashValue, MD5_DIGEST_SIZE);\n} /* End of RT_MD5_End */\n\n\n/*\n========================================================================\nRoutine Description:\n    MD5 algorithm\n\nArguments:\n    message         Message context\n    messageLen      The length of message in bytes\n\nReturn Value:\n    digestMessage   Digest message\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_MD5 (\n    IN  const UINT8 Message[], \n    IN  UINT MessageLen, \n    OUT UINT8 DigestMessage[])\n{\n    MD5_CTX_STRUC md5_ctx;\n\n    NdisZeroMemory(&md5_ctx, sizeof(MD5_CTX_STRUC));\n    RT_MD5_Init(&md5_ctx);    \n    RT_MD5_Append(&md5_ctx, Message, MessageLen);\n    RT_MD5_End(&md5_ctx, DigestMessage);\n} /* End of RT_MD5 */\n\n#endif /* MD5_SUPPORT */\n\n\n/* End of crypt_md5.c */\n\n"
  },
  {
    "path": "src/common/crypt_sha2.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    SHA2\n\n    Abstract:\n    FIPS 180-2: Secure Hash Standard (SHS)\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2008/11/24      Create SHA1\n    Eddy        2008/07/23      Create SHA256\n***************************************************************************/\n\n#include \"rt_config.h\"\n\n\n/* Basic operations */\n#define SHR(x,n) (x >> n) /* SHR(x)^n, right shift n bits , x is w-bit word, 0 <= n <= w */\n#define ROTR(x,n,w) ((x >> n) | (x << (w - n))) /* ROTR(x)^n, circular right shift n bits , x is w-bit word, 0 <= n <= w */\n#define ROTL(x,n,w) ((x << n) | (x >> (w - n))) /* ROTL(x)^n, circular left shift n bits , x is w-bit word, 0 <= n <= w */\n#define ROTR32(x,n) ROTR(x,n,32) /* 32 bits word */\n#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */ \n\n/* Basic functions */\n#define Ch(x,y,z) ((x & y) ^ ((~x) & z))\n#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))\n#define Parity(x,y,z) (x ^ y ^ z)\n\n#ifdef SHA1_SUPPORT\n/* SHA1 constants */\n#define SHA1_MASK 0x0000000f\nstatic const UINT32 SHA1_K[4] = {\n    0x5a827999UL, 0x6ed9eba1UL, 0x8f1bbcdcUL, 0xca62c1d6UL\n};\nstatic const UINT32 SHA1_DefaultHashValue[5] = {\n    0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL, 0xc3d2e1f0UL\n};\n#endif /* SHA1_SUPPORT */\n\n\n#ifdef SHA256_SUPPORT\n/* SHA256 functions */\n#define Zsigma_256_0(x) (ROTR32(x,2) ^ ROTR32(x,13) ^ ROTR32(x,22))\n#define Zsigma_256_1(x) (ROTR32(x,6) ^ ROTR32(x,11) ^ ROTR32(x,25))\n#define Sigma_256_0(x)  (ROTR32(x,7) ^ ROTR32(x,18) ^ SHR(x,3))\n#define Sigma_256_1(x)  (ROTR32(x,17) ^ ROTR32(x,19) ^ SHR(x,10))\n/* SHA256 constants */\nstatic const UINT32 SHA256_K[64] = {\n    0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, \n    0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, \n    0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, \n    0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, \n    0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, \n    0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, \n    0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, \n    0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, \n    0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, \n    0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,\n    0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, \n    0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, \n    0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, \n    0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, \n    0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, \n    0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL\n};\nstatic const UINT32 SHA256_DefaultHashValue[8] = {\n    0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,\n    0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL\n};\n#endif /* SHA256_SUPPORT */\n\n\n#ifdef SHA1_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    Initial SHA1_CTX_STRUC\n\nArguments:\n    pSHA_CTX        Pointer to SHA1_CTX_STRUC\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA1_Init (\n    IN  SHA1_CTX_STRUC *pSHA_CTX)\n{\n    NdisMoveMemory(pSHA_CTX->HashValue, SHA1_DefaultHashValue, \n        sizeof(SHA1_DefaultHashValue));\n    NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);\n    pSHA_CTX->MessageLen = 0;\n    pSHA_CTX->BlockLen   = 0;\n} /* End of RT_SHA1_Init */\n\n\n/*\n========================================================================\nRoutine Description:\n    SHA1 computation for one block (512 bits)\n\nArguments:\n    pSHA_CTX        Pointer to SHA1_CTX_STRUC\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA1_Hash (\n    IN  SHA1_CTX_STRUC *pSHA_CTX)\n{\n    UINT32 W_i,t;\n    UINT32 W[80];\n    UINT32 a,b,c,d,e,T,f_t = 0;\n  \n    /* Prepare the message schedule, {W_i}, 0 < t < 15 */\n    NdisMoveMemory(W, pSHA_CTX->Block, SHA1_BLOCK_SIZE);\n    for (W_i = 0; W_i < 16; W_i++) {\n        W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */\n    } /* End of for */\n\n    for (W_i = 16; W_i < 80; W_i++) {\n        W[W_i] = ROTL32((W[W_i - 3] ^ W[W_i - 8] ^ W[W_i - 14] ^ W[W_i - 16]),1);\n    } /* End of for */\n\n        \n    /* SHA256 hash computation */\n    /* Initialize the working variables */\n    a = pSHA_CTX->HashValue[0];\n    b = pSHA_CTX->HashValue[1];\n    c = pSHA_CTX->HashValue[2];\n    d = pSHA_CTX->HashValue[3];\n    e = pSHA_CTX->HashValue[4];\n\n    /* 80 rounds */\n    for (t = 0;t < 20;t++) {\n        f_t = Ch(b,c,d);\n        T = ROTL32(a,5) + f_t + e + SHA1_K[0] + W[t];\n        e = d;\n        d = c;\n        c = ROTL32(b,30);\n        b = a;\n        a = T;\n     } /* End of for */\n    for (t = 20;t < 40;t++) {\n        f_t = Parity(b,c,d);\n        T = ROTL32(a,5) + f_t + e + SHA1_K[1] + W[t];\n        e = d;\n        d = c;\n        c = ROTL32(b,30);\n        b = a;\n        a = T;\n     } /* End of for */\n    for (t = 40;t < 60;t++) {\n        f_t = Maj(b,c,d);\n        T = ROTL32(a,5) + f_t + e + SHA1_K[2] + W[t];\n        e = d;\n        d = c;\n        c = ROTL32(b,30);\n        b = a;\n        a = T;\n     } /* End of for */\n    for (t = 60;t < 80;t++) {\n        f_t = Parity(b,c,d);\n        T = ROTL32(a,5) + f_t + e + SHA1_K[3] + W[t];\n        e = d;\n        d = c;\n        c = ROTL32(b,30);\n        b = a;\n        a = T;\n     } /* End of for */\n\n\n     /* Compute the i^th intermediate hash value H^(i) */\n     pSHA_CTX->HashValue[0] += a;\n     pSHA_CTX->HashValue[1] += b;\n     pSHA_CTX->HashValue[2] += c;\n     pSHA_CTX->HashValue[3] += d;\n     pSHA_CTX->HashValue[4] += e;\n\n    NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);\n    pSHA_CTX->BlockLen = 0;\n} /* End of RT_SHA1_Hash */\n\n\n/*\n========================================================================\nRoutine Description:\n    The message is appended to block. If block size > 64 bytes, the SHA1_Hash \nwill be called.\n\nArguments:\n    pSHA_CTX        Pointer to SHA1_CTX_STRUC\n    message         Message context\n    messageLen      The length of message in bytes\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA1_Append (\n    IN  SHA1_CTX_STRUC *pSHA_CTX, \n    IN  const UINT8 Message[], \n    IN  UINT MessageLen)\n{\n    UINT appendLen = 0;\n    UINT diffLen   = 0;\n    \n    while (appendLen != MessageLen) {\n        diffLen = MessageLen - appendLen;\n        if ((pSHA_CTX->BlockLen + diffLen) <  SHA1_BLOCK_SIZE) {\n            NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, \n                Message + appendLen, diffLen);\n            pSHA_CTX->BlockLen += diffLen;\n            appendLen += diffLen;\n        } \n        else\n        {\n            NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, \n                Message + appendLen, SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);\n            appendLen += (SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);\n            pSHA_CTX->BlockLen = SHA1_BLOCK_SIZE;\n            RT_SHA1_Hash(pSHA_CTX);\n        } /* End of if */\n    } /* End of while */\n    pSHA_CTX->MessageLen += MessageLen;\n} /* End of RT_SHA1_Append */\n\n\n/*\n========================================================================\nRoutine Description:\n    1. Append bit 1 to end of the message\n    2. Append the length of message in rightmost 64 bits\n    3. Transform the Hash Value to digest message\n\nArguments:\n    pSHA_CTX        Pointer to SHA1_CTX_STRUC\n\nReturn Value:\n    digestMessage   Digest message\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA1_End (\n    IN  SHA1_CTX_STRUC *pSHA_CTX, \n    OUT UINT8 DigestMessage[])\n{\n    UINT index;\n    UINT64 message_length_bits;\n\n    /* Append bit 1 to end of the message */\n    NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);\n\n    /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */\n    if (pSHA_CTX->BlockLen > 55)\n        RT_SHA1_Hash(pSHA_CTX);\n    /* End of if */\n\n    /* Append the length of message in rightmost 64 bits */\n    message_length_bits = pSHA_CTX->MessageLen*8;\n    message_length_bits = cpu2be64(message_length_bits);       \n    NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);\n    RT_SHA1_Hash(pSHA_CTX);\n\n    /* Return message digest, transform the UINT32 hash value to bytes */\n    for (index = 0; index < 5;index++)\n        pSHA_CTX->HashValue[index] = cpu2be32(pSHA_CTX->HashValue[index]);\n        /* End of for */\n    NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA1_DIGEST_SIZE);\n} /* End of RT_SHA1_End */\n\n\n/*\n========================================================================\nRoutine Description:\n    SHA1 algorithm\n\nArguments:\n    message         Message context\n    messageLen      The length of message in bytes\n\nReturn Value:\n    digestMessage   Digest message\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA1 (\n    IN  const UINT8 Message[], \n    IN  UINT MessageLen, \n    OUT UINT8 DigestMessage[])\n{\n\n    SHA1_CTX_STRUC sha_ctx;\n\n    NdisZeroMemory(&sha_ctx, sizeof(SHA1_CTX_STRUC));\n    RT_SHA1_Init(&sha_ctx);\n    RT_SHA1_Append(&sha_ctx, Message, MessageLen);\n    RT_SHA1_End(&sha_ctx, DigestMessage);\n} /* End of RT_SHA1 */\n#endif /* SHA1_SUPPORT */\n\n\n#ifdef SHA256_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    Initial SHA256_CTX_STRUC\n\nArguments:\n    pSHA_CTX    Pointer to SHA256_CTX_STRUC\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA256_Init (\n    IN  SHA256_CTX_STRUC *pSHA_CTX)\n{\n    NdisMoveMemory(pSHA_CTX->HashValue, SHA256_DefaultHashValue, \n        sizeof(SHA256_DefaultHashValue));\n    NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE);\n    pSHA_CTX->MessageLen = 0;\n    pSHA_CTX->BlockLen   = 0;\n} /* End of RT_SHA256_Init */\n\n\n/*\n========================================================================\nRoutine Description:\n    SHA256 computation for one block (512 bits)\n\nArguments:\n    pSHA_CTX    Pointer to SHA256_CTX_STRUC\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA256_Hash (\n    IN  SHA256_CTX_STRUC *pSHA_CTX)\n{\n    UINT32 W_i,t;\n    UINT32 W[64];\n    UINT32 a,b,c,d,e,f,g,h,T1,T2;\n    \n    /* Prepare the message schedule, {W_i}, 0 < t < 15 */\n    NdisMoveMemory(W, pSHA_CTX->Block, SHA256_BLOCK_SIZE);\n    for (W_i = 0; W_i < 16; W_i++)\n        W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */\n        /* End of for */\n \n    /* SHA256 hash computation */\n    /* Initialize the working variables */\n    a = pSHA_CTX->HashValue[0];\n    b = pSHA_CTX->HashValue[1];\n    c = pSHA_CTX->HashValue[2];\n    d = pSHA_CTX->HashValue[3];\n    e = pSHA_CTX->HashValue[4];\n    f = pSHA_CTX->HashValue[5];\n    g = pSHA_CTX->HashValue[6];\n    h = pSHA_CTX->HashValue[7];\n\n    /* 64 rounds */\n    for (t = 0;t < 64;t++) {\n        if (t > 15) /* Prepare the message schedule, {W_i}, 16 < t < 63 */\n            W[t] = Sigma_256_1(W[t-2]) + W[t-7] + Sigma_256_0(W[t-15]) + W[t-16];\n            /* End of if */\n        T1 = h + Zsigma_256_1(e) + Ch(e,f,g) + SHA256_K[t] + W[t];\n        T2 = Zsigma_256_0(a) + Maj(a,b,c);\n        h = g;\n        g = f;\n        f = e;\n        e = d + T1;\n        d = c;\n        c = b;\n        b = a;\n        a = T1 + T2;\n     } /* End of for */\n\n     /* Compute the i^th intermediate hash value H^(i) */\n     pSHA_CTX->HashValue[0] += a;\n     pSHA_CTX->HashValue[1] += b;\n     pSHA_CTX->HashValue[2] += c;\n     pSHA_CTX->HashValue[3] += d;\n     pSHA_CTX->HashValue[4] += e;\n     pSHA_CTX->HashValue[5] += f;\n     pSHA_CTX->HashValue[6] += g;\n     pSHA_CTX->HashValue[7] += h;\n\n    NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE);\n    pSHA_CTX->BlockLen = 0;\n} /* End of RT_SHA256_Hash */\n\n\n/*\n========================================================================\nRoutine Description:\n    The message is appended to block. If block size > 64 bytes, the SHA256_Hash \nwill be called.\n\nArguments:\n    pSHA_CTX    Pointer to SHA256_CTX_STRUC\n    message     Message context\n    messageLen  The length of message in bytes\n\nReturn Value:\n    None\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA256_Append (\n    IN  SHA256_CTX_STRUC *pSHA_CTX, \n    IN  const UINT8 Message[], \n    IN  UINT MessageLen)\n{\n    UINT appendLen = 0;\n    UINT diffLen   = 0;\n    \n    while (appendLen != MessageLen) {\n        diffLen = MessageLen - appendLen;\n        if ((pSHA_CTX->BlockLen + diffLen) <  SHA256_BLOCK_SIZE) {\n            NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, \n                Message + appendLen, diffLen);\n            pSHA_CTX->BlockLen += diffLen;\n            appendLen += diffLen;\n        } \n        else\n        {\n            NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, \n                Message + appendLen, SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen);\n            appendLen += (SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen);\n            pSHA_CTX->BlockLen = SHA256_BLOCK_SIZE;\n            RT_SHA256_Hash(pSHA_CTX);\n        } /* End of if */\n    } /* End of while */\n    pSHA_CTX->MessageLen += MessageLen;\n} /* End of RT_SHA256_Append */\n\n\n/*\n========================================================================\nRoutine Description:\n    1. Append bit 1 to end of the message\n    2. Append the length of message in rightmost 64 bits\n    3. Transform the Hash Value to digest message\n\nArguments:\n    pSHA_CTX        Pointer to SHA256_CTX_STRUC\n\nReturn Value:\n    digestMessage   Digest message\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA256_End (\n    IN  SHA256_CTX_STRUC *pSHA_CTX, \n    OUT UINT8 DigestMessage[])\n{\n    UINT index;\n    UINT64 message_length_bits;\n\n    /* Append bit 1 to end of the message */\n    NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);\n\n    /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */\n    if (pSHA_CTX->BlockLen > 55)\n        RT_SHA256_Hash(pSHA_CTX);\n    /* End of if */\n\n    /* Append the length of message in rightmost 64 bits */\n    message_length_bits = pSHA_CTX->MessageLen*8;\n    message_length_bits = cpu2be64(message_length_bits);       \n    NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);\n    RT_SHA256_Hash(pSHA_CTX);\n\n    /* Return message digest, transform the UINT32 hash value to bytes */\n    for (index = 0; index < 8;index++)\n        pSHA_CTX->HashValue[index] = cpu2be32(pSHA_CTX->HashValue[index]);\n        /* End of for */\n    NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA256_DIGEST_SIZE);\n} /* End of RT_SHA256_End */\n\n\n/*\n========================================================================\nRoutine Description:\n    SHA256 algorithm\n\nArguments:\n    message         Message context\n    messageLen      The length of message in bytes\n\nReturn Value:\n    digestMessage   Digest message\n\nNote:\n    None\n========================================================================\n*/\nVOID RT_SHA256 (\n    IN  const UINT8 Message[], \n    IN  UINT MessageLen, \n    OUT UINT8 DigestMessage[])\n{\n    SHA256_CTX_STRUC sha_ctx;\n\n    NdisZeroMemory(&sha_ctx, sizeof(SHA256_CTX_STRUC));\n    RT_SHA256_Init(&sha_ctx);\n    RT_SHA256_Append(&sha_ctx, Message, MessageLen);\n    RT_SHA256_End(&sha_ctx, DigestMessage);\n} /* End of RT_SHA256 */\n#endif /* SHA256_SUPPORT */\n\n\n/* End of crypt_sha2.c */\n\n"
  },
  {
    "path": "src/common/ee_efuse.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tee_efuse.c\n\n\tAbstract:\n\tMiniport generic portion header file\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifdef RTMP_EFUSE_SUPPORT\n\n#include\t\"rt_config.h\"\n\n#if defined(RT65xx) || defined(MT7601)\n/* eFuse registers */\n#define EFUSE_CTRL\t\t\t\t\t0x24\n#define EFUSE_DATA0\t\t\t\t0x28\n#define EFUSE_DATA1\t\t\t\t0x2c\n#define EFUSE_DATA2\t\t\t\t0x30\n#define EFUSE_DATA3\t\t\t\t0x34\n#else\n/* eFuse registers */\n#define EFUSE_CTRL\t\t\t\t\t0x0580\n#define EFUSE_DATA0\t\t\t\t0x0590\n#define EFUSE_DATA1\t\t\t\t0x0594\n#define EFUSE_DATA2\t\t\t\t0x0598\n#define EFUSE_DATA3\t\t\t\t0x059c\n#endif /* RT65xx */\n\n\n#define EFUSE_CTRL_3290\t\t0x24\n#define EFUSE_DATA0_3290\t\t0x28\n#define EFUSE_DATA1_3290\t\t0x2c\n#define EFUSE_DATA2_3290\t\t0x30\n#define EFUSE_DATA3_3290\t\t0x34\n\n#ifdef RT65xx\n#define EFUSE_EEPROM_DEFULT_FILE\t\"RT30xxEEPROM.bin\"\n#define EFUSE_BUFFER_PATH\t\t\t\"/var/lib/share/MT7650/RT30xxEEPROM.bin\"\n#define MAX_EEPROM_BIN_FILE_SIZE\t512\n#endif /* RT65xx */\n\n#ifdef MT7601\n#define EFUSE_EEPROM_DEFULT_FILE\t\"MT7601EEPROM.bin\"\n#define EFUSE_BUFFER_PATH\t\t\t\"/var/lib/share/MT7601/MT7601EEPROM.bin\"\n#define MAX_EEPROM_BIN_FILE_SIZE\t512\n#endif /* MT7601 */\n\n#ifdef RTMP_MAC\n#define EFUSE_EEPROM_DEFULT_FILE\t\"RT30xxEEPROM.bin\"\n#define EFUSE_BUFFER_PATH\t\t\t\"/var/lib/share/RT2870/RT30xxEEPROM.bin\"\n#define MAX_EEPROM_BIN_FILE_SIZE\t512\n#endif /* RTMP_MAC */\n\n#define EFUSE_TAG\t\t\t\t0x2fe\n\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion\t_EFUSE_CTRL_STRUC {\n\tstruct\t{\n\t\tUINT32            SEL_EFUSE:1;\n\t\tUINT32            EFSROM_KICK:1;\n\t\tUINT32            RESERVED:4;\n\t\tUINT32            EFSROM_AIN:10;\n\t\tUINT32            EFSROM_LDO_ON_TIME:2;\n\t\tUINT32            EFSROM_LDO_OFF_TIME:6;\n\t\tUINT32            EFSROM_MODE:2;\n\t\tUINT32            EFSROM_AOUT:6;   \n\t}\tfield;\n\tUINT32\t\t\tword;\n}\tEFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC;\n#else\ntypedef\tunion\t_EFUSE_CTRL_STRUC {\n\tstruct\t{\n\t\tUINT32            EFSROM_AOUT:6;\n\t\tUINT32            EFSROM_MODE:2;\n\t\tUINT32            EFSROM_LDO_OFF_TIME:6;\n\t\tUINT32            EFSROM_LDO_ON_TIME:2;\n\t\tUINT32            EFSROM_AIN:10;\n\t\tUINT32            RESERVED:4;\n\t\tUINT32            EFSROM_KICK:1;\n\t\tUINT32            SEL_EFUSE:1;\n\t}\tfield;\n\tUINT32\t\t\tword;\n}\tEFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\nstatic UCHAR eFuseReadRegisters(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tOUT\tUSHORT* pData);\n\nVOID eFuseReadPhysical( \n\tIN\tPRTMP_ADAPTER\tpAd, \n  \tIN\tPUSHORT lpInBuffer,\n  \tIN\tULONG nInBufferSize,\n  \tOUT\tPUSHORT lpOutBuffer,\n  \tIN\tULONG nOutBufferSize);\n\nstatic VOID eFusePhysicalWriteRegisters(\n\tIN\tPRTMP_ADAPTER\tpAd,\t\n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tOUT\tUSHORT* pData);\n\nstatic NTSTATUS eFuseWriteRegisters(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tIN\tUSHORT* pData);\n\nstatic VOID eFuseWritePhysical( \n\tIN\tPRTMP_ADAPTER\tpAd,\t\n  \tPUSHORT lpInBuffer,\n\tULONG nInBufferSize,\n  \tPUCHAR lpOutBuffer,\n  \tULONG nOutBufferSize);\n\n\nstatic NTSTATUS eFuseWriteRegistersFromBin(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tIN\tUSHORT* pData);\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n========================================================================\n*/\nUCHAR eFuseReadRegisters(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tOUT\tUSHORT* pData)\n{\n\tEFUSE_CTRL_STRUC\t\teFuseCtrlStruc;\n\tint\ti;\n\tUSHORT\tefuseDataOffset;\n\tUINT32\tdata;\n\tUINT32 efuse_ctrl_reg = EFUSE_CTRL;\n\t\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\tefuse_ctrl_reg = EFUSE_CTRL_3290;\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\t\n\tRTMP_IO_READ32(pAd, efuse_ctrl_reg, &eFuseCtrlStruc.word);\n\n\t/*Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.*/\n\t/*Use the eeprom logical address and covert to address to block number*/\n\teFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;\n\n\t/*Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 0.*/\n\teFuseCtrlStruc.field.EFSROM_MODE = 0;\n\n\t/*Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.*/\n\teFuseCtrlStruc.field.EFSROM_KICK = 1;\n\t\n\tNdisMoveMemory(&data, &eFuseCtrlStruc, 4);\n\tRTMP_IO_WRITE32(pAd, efuse_ctrl_reg, data);\n\n\t/*Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.*/\n\ti = 0;\n\twhile(i < 500)\n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn 0;\n\t\n\t\t/*rtmp.HwMemoryReadDword(EFUSE_CTRL, (DWORD *) &eFuseCtrlStruc, 4);*/\n\t\tRTMP_IO_READ32(pAd, efuse_ctrl_reg, &eFuseCtrlStruc.word);\n\t\tif(eFuseCtrlStruc.field.EFSROM_KICK == 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\t\n\t\tRTMPusecDelay(2);\n\t\ti++;\t\n\t}\n\n\t/*if EFSROM_AOUT is not found in physical address, write 0xffff*/\n\tif (eFuseCtrlStruc.field.EFSROM_AOUT == 0x3f)\n\t{\n\t\tfor(i=0; i<Length/2; i++)\n\t\t\t*(pData+2*i) = 0xffff;\n\t}\n\telse\n\t{\n\t\t/*Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x590-0x59C)*/\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\t\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\t\tefuseDataOffset =  EFUSE_DATA0_3290 + (Offset & 0xC);\n\t\telse\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\t\tefuseDataOffset =  EFUSE_DATA3 - (Offset & 0xC);\t\n\t\t/*data hold 4 bytes data.*/\n\t\t/*In RTMP_IO_READ32 will automatically execute 32-bytes swapping*/\n\t\tRTMP_IO_READ32(pAd, efuseDataOffset, &data);\n\t\t/*Decide the upper 2 bytes or the bottom 2 bytes.*/\n\t\t/* Little-endian\t\tS\t|\tS\tBig-endian*/\n\t\t/* addr\t3\t2\t1\t0\t|\t0\t1\t2\t3*/\n\t\t/* Ori-V\tD\tC\tB\tA\t|\tA\tB\tC\tD*/\n\t\t/*After swapping*/\n\t\t/*\t\tD\tC\tB\tA\t|\tD\tC\tB\tA*/\n\t\t/*Return 2-bytes*/\n\t\t/*The return byte statrs from S. Therefore, the little-endian will return BA, the Big-endian will return DC.*/\n\t\t/*For returning the bottom 2 bytes, the Big-endian should shift right 2-bytes.*/\n#ifdef RT_BIG_ENDIAN\n\t\tdata = data << (8*((Offset & 0x3)^0x2));\t\t  \n#else\n\t\tdata = data >> (8*(Offset & 0x3));\t\t\n#endif /* RT_BIG_ENDIAN */\n\t\t\n\t\tNdisMoveMemory(pData, &data, Length);\n\t}\n\n\treturn (UCHAR) eFuseCtrlStruc.field.EFSROM_AOUT;\n\t\n}\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n========================================================================\n*/\nVOID eFusePhysicalReadRegisters( \n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tOUT\tUSHORT* pData)\n{\n\tEFUSE_CTRL_STRUC\t\teFuseCtrlStruc;\n\tint\ti;\n\tUSHORT\tefuseDataOffset;\n\tUINT32\tdata;\n\tUINT32 efuse_ctrl_reg = EFUSE_CTRL;\n\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\tefuse_ctrl_reg = EFUSE_CTRL_3290;\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\n\tRTMP_IO_READ32(pAd, efuse_ctrl_reg, &eFuseCtrlStruc.word);\n\n\t/*Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.*/\n\teFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;\n\n\t/*Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1.*/\n\t/*Read in physical view*/\n\teFuseCtrlStruc.field.EFSROM_MODE = 1;\n\n\t/*Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.*/\n\teFuseCtrlStruc.field.EFSROM_KICK = 1;\n\n\tNdisMoveMemory(&data, &eFuseCtrlStruc, 4);\t\n\tRTMP_IO_WRITE32(pAd, efuse_ctrl_reg, data);\t\n\n\t/*Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.*/\n\ti = 0;\n\twhile(i < 500)\n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn;\n\t\t\n\t\tRTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);\t\n\t\tif(eFuseCtrlStruc.field.EFSROM_KICK == 0)\n\t\t\tbreak;\n\t\tRTMPusecDelay(2);\n\t\ti++;\t\n\t}\n\n\t/*Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590)*/\n\t/*Because the size of each EFUSE_DATA is 4 Bytes, the size of address of each is 2 bits.*/\n\t/*The previous 2 bits is the EFUSE_DATA number, the last 2 bits is used to decide which bytes*/\n\t/*Decide which EFUSE_DATA to read*/\n\t/*590:F E D C */\n\t/*594:B A 9 8 */\n\t/*598:7 6 5 4*/\n\t/*59C:3 2 1 0*/\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\tefuseDataOffset =  EFUSE_DATA0_3290 + (Offset & 0xC)  ;\n\telse\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\tefuseDataOffset =  EFUSE_DATA3 - (Offset & 0xC)  ;\t\n\n\tRTMP_IO_READ32(pAd, efuseDataOffset, &data);\n\n#ifdef RT_BIG_ENDIAN\n\t\tdata = data << (8*((Offset & 0x3)^0x2));\t\n#else\n\tdata = data >> (8*(Offset & 0x3));\n#endif /* RT_BIG_ENDIAN */\n\n\tNdisMoveMemory(pData, &data, Length);\t\n\t\n}\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n========================================================================\n*/\nVOID eFuseReadPhysical( \n\tIN\tPRTMP_ADAPTER\tpAd, \n  \tIN\tPUSHORT lpInBuffer,\n  \tIN\tULONG nInBufferSize,\n  \tOUT\tPUSHORT lpOutBuffer,\n  \tIN\tULONG nOutBufferSize  \n)\n{\n\tUSHORT* pInBuf = (USHORT*)lpInBuffer;\n\tUSHORT* pOutBuf = (USHORT*)lpOutBuffer;\n\n\tUSHORT Offset = pInBuf[0];\t\t\t\t\t/*addr*/\n\tUSHORT Length = pInBuf[1];\t\t\t\t\t/*length*/\n\tint \t\ti;\n\t\n\tfor(i=0; i<Length; i+=2)\n\t{\n\t\teFusePhysicalReadRegisters(pAd,Offset+i, 2, &pOutBuf[i/2]);\t\n\t} \t\n}\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n========================================================================\n*/\nNTSTATUS eFuseRead(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUSHORT\t\t\tpData,\n\tIN\tUSHORT\t\t\tLength)\n{\n\tNTSTATUS Status = STATUS_SUCCESS;\n\tUCHAR\tEFSROM_AOUT;\n\tint\ti;\n\t\n\tfor(i=0; i<Length; i+=2)\n\t{\n\t\tEFSROM_AOUT = eFuseReadRegisters(pAd, Offset+i, 2, &pData[i/2]);\n\t} \n\treturn Status;\n}\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n========================================================================\n*/\nstatic VOID eFusePhysicalWriteRegisters(\n\tIN\tPRTMP_ADAPTER\tpAd,\t\n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tOUT\tUSHORT* pData)\n{\n\tEFUSE_CTRL_STRUC\t\teFuseCtrlStruc;\n\tint\ti;\n\tUSHORT\tefuseDataOffset;\n\tUINT32\tdata, eFuseDataBuffer[4];\n\tUINT32 efuse_ctrl_reg = EFUSE_CTRL;\n\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\tefuse_ctrl_reg = EFUSE_CTRL_3290;\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\n\t/*Step0. Write 16-byte of data to EFUSE_DATA0-3 (0x590-0x59C), where EFUSE_DATA0 is the LSB DW, EFUSE_DATA3 is the MSB DW.*/\n\n\t/*read current values of 16-byte block\t*/\n\tRTMP_IO_READ32(pAd, efuse_ctrl_reg,  &eFuseCtrlStruc.word);\n\n\t/*Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.*/\n\teFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;\n\n\t/*Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1.*/\n\teFuseCtrlStruc.field.EFSROM_MODE = 1;\n\n\t/*Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.*/\n\teFuseCtrlStruc.field.EFSROM_KICK = 1;\n\n\tNdisMoveMemory(&data, &eFuseCtrlStruc, 4);\n\tRTMP_IO_WRITE32(pAd, efuse_ctrl_reg, data);\t\n\n\t/*Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.*/\n\ti = 0;\n\twhile(i < 500)\n\t{\t\n\t\tRTMP_IO_READ32(pAd, efuse_ctrl_reg, &eFuseCtrlStruc.word);\n\n\t\tif(eFuseCtrlStruc.field.EFSROM_KICK == 0)\n\t\t\tbreak;\n\t\tRTMPusecDelay(2);\n\t\ti++;\t\n\t}\n\n\t/*Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590)*/\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\tefuseDataOffset = EFUSE_DATA0_3290;\n\telse\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\t\tefuseDataOffset =  EFUSE_DATA3;\n\tfor(i=0; i< 4; i++)\n\t{\n\t\tRTMP_IO_READ32(pAd, efuseDataOffset, (PUINT32) &eFuseDataBuffer[i]);\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\t\tefuseDataOffset += 4;\n\t\telse\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\t\t\tefuseDataOffset -= 4;\n\t}\n\n\t/*Update the value, the offset is multiple of 2, length is 2*/\n\tefuseDataOffset = (Offset & 0xc) >> 2;\n\tdata = pData[0] & 0xffff;\n\t/*The offset should be 0x***10 or 0x***00*/\n\tif((Offset % 4) != 0)\n\t{\n\t\teFuseDataBuffer[efuseDataOffset] = (eFuseDataBuffer[efuseDataOffset] & 0xffff) | (data << 16);\n\t}\n\telse\n\t{\n\t\teFuseDataBuffer[efuseDataOffset] = (eFuseDataBuffer[efuseDataOffset] & 0xffff0000) | data;\n\t}\n\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tefuseDataOffset =  EFUSE_DATA0;\n#else\n\tefuseDataOffset =  EFUSE_DATA3;\n#endif\n\t\n\tfor(i=0; i< 4; i++)\n\t{\n\t\tRTMP_IO_WRITE32(pAd, efuseDataOffset, eFuseDataBuffer[i]);\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\tif (IS_RT3290(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\t\tefuseDataOffset += 4;\n\t\telse\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\t\t\tefuseDataOffset -= 4;\t\t\n\t}\n\n\t/*Step1. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.*/\n\t// TODO: shiang, for below line, windows driver didn't have this read, why we have ??\n\tRTMP_IO_READ32(pAd, efuse_ctrl_reg, &eFuseCtrlStruc.word);\n\n\teFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;\n\n\t/*Step2. Write EFSROM_MODE (0x580, bit7:bit6) to 3.*/\n\teFuseCtrlStruc.field.EFSROM_MODE = 3;\n\t\n\t/*Step3. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical write procedure.*/\n\teFuseCtrlStruc.field.EFSROM_KICK = 1;\n\n\tNdisMoveMemory(&data, &eFuseCtrlStruc, 4);\t\n\tRTMP_IO_WRITE32(pAd, efuse_ctrl_reg, data);\t\n\n\t/*Step4. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. Its done.*/\n\ti = 0;\n\n\twhile(i < 500)\n\t{\t\n\t\tRTMP_IO_READ32(pAd, efuse_ctrl_reg, &eFuseCtrlStruc.word);\n\n\t\tif(eFuseCtrlStruc.field.EFSROM_KICK == 0)\n\t\t\tbreak;\n\t\t\n\t\tRTMPusecDelay(2);\t\n\t\ti++;\t\n\t}\n}\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n========================================================================\n*/\nstatic NTSTATUS eFuseWriteRegisters(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tIN\tUSHORT* pData)\n{\n\tUSHORT\ti,Loop=0, StartBlock=0, EndBlock=0;\n\tUSHORT\teFuseData;\n\tUSHORT\tLogicalAddress, BlkNum = 0xffff;\n\tUCHAR\tEFSROM_AOUT;\n\n\tUSHORT addr,tmpaddr, InBuf[3], tmpOffset;\n\tUSHORT buffer[8];\n\tBOOLEAN\t\tbWriteSuccess = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegisters Offset=%x, pData=%x\\n\", Offset, *pData));\n\t/*set start block and end block number, start from tail of mapping table*/\n\tif( (pAd->chipCap.EFUSE_USAGE_MAP_END % 2) != 0)\n\t{\n\t\tStartBlock = pAd->chipCap.EFUSE_USAGE_MAP_END-1; \n\t}\n\telse\n\t{\n\t\tStartBlock = pAd->chipCap.EFUSE_USAGE_MAP_END; \n\t}\n\n\tif( (pAd->chipCap.EFUSE_USAGE_MAP_START % 2) != 0)\n\t{\n\t\tEndBlock = pAd->chipCap.EFUSE_USAGE_MAP_START-1; \n\t}\n\telse\n\t{\n\t\tEndBlock = pAd->chipCap.EFUSE_USAGE_MAP_START; \n\t}\n\t/*Step 0. find the entry in the mapping table*/\n\t/*The address of EEPROM is 2-bytes alignment.*/\n\t/*The last bit is used for alignment, so it must be 0.*/\n\ttmpOffset = Offset & 0xfffe;\n\tEFSROM_AOUT = eFuseReadRegisters(pAd, tmpOffset, 2, &eFuseData);\n\tif( EFSROM_AOUT == 0x3f)\n\t{\t/*find available logical address pointer\t*/\n\t\t/*the logical address does not exist, find an empty one*/\n\t\t/*from the first address of block 45=16*45=0x2d0 to the last address of block 47*/\n\t\t/*==>48*16-3(reserved)=2FC*/\n\t\tfor (i=StartBlock; i >= EndBlock; i-=2)\n\t\t{\n\t\t\t/*Retrive the logical block nubmer form each logical address pointer*/\n\t\t\t/*It will access two logical address pointer each time.*/\n\t\t\teFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);\n\t\t\t/*To avoid the odd byte problem, ex. We read the 21|20 bytes and if 21 is the */\n\t\t\t/* end byte. Then, the EFUSE_USAGE_MAP_END which is 21 is not equal to*/\n\t\t\t/* i which is 20. Therefore, this 21th byte could be used.*/\n\t\t\t/*Otherwise, if 20 is the stop byte, i which is 20 is equal EFUSE_USAGE_MAP_END.*/\n\t\t\t/* It means the 21th byte could not be used.*/\n\t\t\tif(( (LogicalAddress >> 8) & 0xff) == 0)\n\t\t\t{/*Not used logical address pointer*/\n\t\t\t\tif (i != pAd->chipCap.EFUSE_USAGE_MAP_END)\n\t\t\t\t{\t\t\n\t\t\t\t\tBlkNum = i-pAd->chipCap.EFUSE_USAGE_MAP_START+1;\t\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif( (LogicalAddress & 0xff) == 0)\n\t\t\t{/*Not used logical address pointer*/\n\t\t\t\tif (i != (pAd->chipCap.EFUSE_USAGE_MAP_START-1))\n\t\t\t\t{\n\t\t\t\t\tBlkNum = i-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tBlkNum = EFSROM_AOUT;\n\t}\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegisters BlkNum = %d \\n\", BlkNum));\n\n\tif(BlkNum == 0xffff)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegisters: out of free E-fuse space!!!\\n\"));\n\t\treturn FALSE;\n\t}\t\n\n\t/*Step 1. Save data of this block\twhich is pointed by the avaible logical address pointer*/\n\t/* read and save the original block data*/\n\tfor(i =0; i<8; i++)\n\t{\n\t\taddr = BlkNum * 0x10 ;\n\t\t\n\t\tInBuf[0] = addr+2*i;\n\t\tInBuf[1] = 2;\n\t\tInBuf[2] = 0x0;\t\n\t\t\n\t\teFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);\n\n\t\tbuffer[i] = InBuf[2];\n\t}\n\n\t/*Step 2. Update the data in buffer, and write the data to Efuse*/\n\tbuffer[ (Offset >> 1) % 8] = pData[0];\n\n\tdo\n\t{\tLoop++;\n\t\t/*Step 3. Write the data to Efuse*/\n\t\tif(!bWriteSuccess)\n\t\t{\n\t\t\tfor(i =0; i<8; i++)\n\t\t\t{\n\t\t\t\taddr = BlkNum * 0x10 ;\n\t\t\t\t\n\t\t\t\tInBuf[0] = addr+2*i;\n\t\t\t\tInBuf[1] = 2;\n\t\t\t\tInBuf[2] = buffer[i];\t\n\t\t\t\t\n\t\t\t\teFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2);\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\taddr = BlkNum * 0x10 ;\n\t\t\t\t\n\t\t\t\tInBuf[0] = addr+(Offset % 16);\n\t\t\t\tInBuf[1] = 2;\n\t\t\t\tInBuf[2] = pData[0];\t\n\t\t\t\t\n\t\t\t\teFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2);\t\n\t\t}\n\t\n\t\t/*Step 4. Write mapping table*/\n\t\taddr = pAd->chipCap.EFUSE_USAGE_MAP_START+BlkNum;\n\n\t\ttmpaddr = addr;\n\n\t\tif(addr % 2 != 0)\n\t\t\taddr = addr -1; \n\t\tInBuf[0] = addr;\n\t\tInBuf[1] = 2;\n\n\t\t/*convert the address from 10 to 8 bit ( bit7, 6 = parity and bit5 ~ 0 = bit9~4), and write to logical map entry*/\n\t\ttmpOffset = Offset;\n\t\ttmpOffset >>= 4;\n\t\ttmpOffset |= ((~((tmpOffset & 0x01) ^ ( tmpOffset >> 1 & 0x01) ^  (tmpOffset >> 2 & 0x01) ^  (tmpOffset >> 3 & 0x01))) << 6) & 0x40;\n\t\ttmpOffset |= ((~( (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01) ^ (tmpOffset >> 4 & 0x01) ^ ( tmpOffset >> 5 & 0x01))) << 7) & 0x80;\n\n\t\t/* write the logical address*/\n\t\tif(tmpaddr%2 != 0) \t\n\t\t\tInBuf[2] = tmpOffset<<8;\t\n\t\telse          \n\t\t\tInBuf[2] = tmpOffset;\n\n\t\teFuseWritePhysical(pAd,&InBuf[0], 6, NULL, 0);\n\n\t\t/*Step 5. Compare data if not the same, invalidate the mapping entry, then re-write the data until E-fuse is exhausted*/\n\t\tbWriteSuccess = TRUE;\n\t\tfor(i =0; i<8; i++)\n\t\t{\n\t\t\taddr = BlkNum * 0x10 ;\n\t\t\t\n\t\t\tInBuf[0] = addr+2*i;\n\t\t\tInBuf[1] = 2;\n\t\t\tInBuf[2] = 0x0;\t\n\t\t\t\n\t\t\teFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);\n\n\t\t\tif(buffer[i] != InBuf[2])\n\t\t\t{\n\t\t\t\tbWriteSuccess = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\t\t/*Step 6. invlidate mapping entry and find a free mapping entry if not succeed*/\n\t\tif (!bWriteSuccess)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Not bWriteSuccess BlkNum = %d\\n\", BlkNum));\n\n\t\t\t/* the offset of current mapping entry*/\n\t\t\taddr = pAd->chipCap.EFUSE_USAGE_MAP_START+BlkNum;\t\t\t\n\n\t\t\t/*find a new mapping entry*/\n\t\t\tBlkNum = 0xffff;\n\t\t\tfor (i=StartBlock; i >= EndBlock; i-=2)\n\t\t\t{\n\t\t\t\teFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);\n\t\t\t\tif(( (LogicalAddress >> 8) & 0xff) == 0)\n\t\t\t\t{\n\t\t\t\t\tif(i != pAd->chipCap.EFUSE_USAGE_MAP_END)\n\t\t\t\t\t{\n\t\t\t\t\t\tBlkNum = i+1-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t}\n\n\t\t\t\tif( (LogicalAddress & 0xff) == 0)\n\t\t\t\t{\n\t\t\t\t\tif(i != (pAd->chipCap.EFUSE_USAGE_MAP_START-1))\n\t\t\t\t\t{\n\t\t\t\t\t\tBlkNum = i-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Not bWriteSuccess and allocate new BlkNum = %d\\n\", BlkNum));\t\n\t\t\tif(BlkNum == 0xffff)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegisters: out of free E-fuse space!!!\\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t/*invalidate the original mapping entry if new entry is not found*/\n\t\t\ttmpaddr = addr;\n\n\t\t\tif(addr % 2 != 0)\n\t\t\t\taddr = addr -1; \n\t\t\tInBuf[0] = addr;\n\t\t\tInBuf[1] = 2;\t\t\n\t\t\t\n\t\t\teFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);\t\t\t\t\n\n\t\t\t/* write the logical address*/\n\t\t\tif(tmpaddr%2 != 0) \n\t\t\t{\n\t\t\t\t/* Invalidate the high byte*/\n\t\t\t\tfor (i=8; i<15; i++)\n\t\t\t\t{\n\t\t\t\t\tif( ( (InBuf[2] >> i) & 0x01) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tInBuf[2] |= (0x1 <<i);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t}\t\t\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* invalidate the low byte*/\n\t\t\t\tfor (i=0; i<8; i++)\n\t\t\t\t{\n\t\t\t\t\tif( ( (InBuf[2] >> i) & 0x01) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tInBuf[2] |= (0x1 <<i);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\t\t\teFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 0);\t\n\t\t}\t\n\t}\t\n\twhile (!bWriteSuccess&&Loop<2);\t\n\tif(!bWriteSuccess)\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Efsue Write Failed!!\\n\"));\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n========================================================================\n*/\nstatic VOID eFuseWritePhysical( \n\tIN\tPRTMP_ADAPTER\tpAd,\t\n  \tPUSHORT lpInBuffer,\n\tULONG nInBufferSize,\n  \tPUCHAR lpOutBuffer,\n  \tULONG nOutBufferSize  \n)\n{\n\tUSHORT* pInBuf = (USHORT*)lpInBuffer;\n\tint \t\ti;\n\t/*USHORT* pOutBuf = (USHORT*)ioBuffer;*/\n\tUSHORT Offset = pInBuf[0];\t\t\t\t\t/* addr*/\n\tUSHORT Length = pInBuf[1];\t\t\t\t\t/* length*/\n\tUSHORT* pValueX = &pInBuf[2];\t\t\t\t/* value ...\t\t*/\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWritePhysical Offset=0x%x, length=%d\\n\", Offset, Length));\n\n\t{\n\t\t/* Little-endian\t\tS\t|\tS\tBig-endian*/\n\t\t/* addr\t3\t2\t1\t0\t|\t0\t1\t2\t3*/\n\t\t/* Ori-V\tD\tC\tB\tA\t|\tA\tB\tC\tD*/\n\t\t/* After swapping*/\n\t\t/*\t\tD\tC\tB\tA\t|\tD\tC\tB\tA*/\n\t\t/* Both the little and big-endian use the same sequence to write  data.*/\n\t\t/* Therefore, we only need swap data when read the data.*/\n\t\tfor (i=0; i<Length; i+=2)\n\t\t{\n\t\t\teFusePhysicalWriteRegisters(pAd, Offset+i, 2, &pValueX[i/2]);\t\n\t\t}\t\n\t}\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n========================================================================\n*/\nNTSTATUS eFuseWrite(  \n   \tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUSHORT\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength)\n{\n\tint i;\n\tUSHORT* pValueX = (PUSHORT) pData;\t\t\t\t/*value ...\t\t*/\n\tPUSHORT OddWriteByteBuf;\n/*\tOddWriteByteBuf=(PUSHORT)kmalloc(sizeof(USHORT)*2, MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&OddWriteByteBuf, sizeof(USHORT)*2);\n\t/* The input value=3070 will be stored as following*/\n\t/* Little-endian\t\tS\t|\tS\tBig-endian*/\n\t/* addr\t\t\t1\t0\t|\t0\t1\t*/\n\t/* Ori-V\t\t\t30\t70\t|\t30\t70\t*/\n\t/* After swapping*/\n\t/*\t\t\t\t30\t70\t|\t70\t30*/\n\t/* Casting*/\n\t/*\t\t\t\t3070\t|\t7030 (x)*/\n\t/* The swapping should be removed for big-endian*/\n\tif (OddWriteByteBuf == NULL)\n\t\treturn FALSE;\n\tif((Offset%2)!=0)\n\t{\n\t\tlength+=2;\n\t\tOffset-=1;\n\t\teFuseRead(pAd,Offset,OddWriteByteBuf,2);\n\t\teFuseRead(pAd,Offset+2,(OddWriteByteBuf+1),2);\n\t\t*OddWriteByteBuf&=0x00ff;\n\t\t*OddWriteByteBuf|=((*pData)&0xff)<<8;\n\t\t*(OddWriteByteBuf+1)&=0xff00;\n\t\t*(OddWriteByteBuf+1)|=(*pData&0xff00)>>8;\n\t\tpValueX=OddWriteByteBuf;\n\t\t\n\t}\n\t\n\tfor(i=0; i<length; i+=2)\n\t{\n\t\teFuseWriteRegisters(pAd, Offset+i, 2, &pValueX[i/2]);\t\n\t}\n/*\tkfree(OddWriteByteBuf);*/\n\tos_free_mem(NULL, OddWriteByteBuf);\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n========================================================================\n*/\nINT set_eFuseGetFreeBlockCount_Proc(  \n   \tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT efusefreenum=0;\n\tif (pAd->bUseEfuse == FALSE && pAd->bFroceEEPROMBuffer == FALSE)\n\t\treturn FALSE;\n\teFuseGetFreeBlockCount(pAd,&efusefreenum);\n\tprintk(\"efuseFreeNumber is %d\\n\",efusefreenum);\n\treturn TRUE;\n}\n\n\nINT set_eFusedump_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT InBuf[3];\n\tINT i=0;\n\t\n\tif (pAd->bUseEfuse == FALSE && pAd->bFroceEEPROMBuffer == FALSE)\n\t\treturn FALSE;\n\t\n\tfor(i =0; i<pAd->chipCap.EFUSE_USAGE_MAP_END/2; i++)\n\t{\n\t\tInBuf[0] = 2*i;\n\t\tInBuf[1] = 2;\n\t\tInBuf[2] = 0x0;\t\n\t\t\n\t\teFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);\n\t\tif(i%4==0)\n\t\tprintk(\"\\nBlock %x:\",i/8);\n\t\tprintk(\"%04x \",InBuf[2]);\n\t}\n\treturn TRUE;\n}\n\n\nINT\tset_eFuseLoadFromBin_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPSTRING\t\t\t\t\tsrc;\n\tRTMP_OS_FD\t\t\t\tsrcf;\n\tRTMP_OS_FS_INFO\t\t\tosfsInfo;\n\tINT \t\t\t\t\t\tretval, memSize;\n\tPSTRING\t\t\t\t\tbuffer, memPtr;\n\tINT\t\t\t\t\t\tTotalByte= 0,ReadedByte=0,CompareBuf=1;\n\tUSHORT\t\t\t\t\t*PDATA;\n\tUSHORT\t\t\t\t\tDATA;\n\t\n\tmemSize = 128 + MAX_EEPROM_BIN_FILE_SIZE + sizeof(USHORT) * 8;\n/*\tmemPtr = kmalloc(memSize, MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(NULL, (UCHAR **)&memPtr, memSize);\n\tif (memPtr == NULL)\n\t\treturn FALSE;\n\n\tNdisZeroMemory(memPtr, memSize);\n\tsrc = memPtr; /* kmalloc(128, MEM_ALLOC_FLAG);*/\n\tbuffer = src + 128;\t\t/* kmalloc(MAX_EEPROM_BIN_FILE_SIZE, MEM_ALLOC_FLAG);*/\n\tPDATA = (USHORT*)(buffer + MAX_EEPROM_BIN_FILE_SIZE);\t/* kmalloc(sizeof(USHORT)*8,MEM_ALLOC_FLAG);*/\n\t\n \tif(strlen(arg)>0)\n\t\tNdisMoveMemory(src, arg, strlen(arg));\n\telse\n\t\tNdisMoveMemory(src, EFUSE_EEPROM_DEFULT_FILE, strlen(EFUSE_EEPROM_DEFULT_FILE));\n\tDBGPRINT(RT_DEBUG_OFF, (\"FileName=%s\\n\",src));\n\n\tRtmpOSFSInfoChange(&osfsInfo, TRUE);\n\n\tsrcf = RtmpOSFileOpen(src, O_RDONLY, 0);\n\tif (IS_FILE_OPEN_ERR(srcf)) \n\t{\n\t\tDBGPRINT_ERR((\"--> Error opening file %s\\n\", src));\n\t\tretval = FALSE;\n\t\tgoto recoverFS;\n\t}\n\telse \n\t{\n\t\t/* The object must have a read method*/\n\t\twhile(RtmpOSFileRead(srcf, &buffer[TotalByte], 1)==1)\n\t\t{\n          \t\tTotalByte++;\n\t\t\tif(TotalByte>MAX_EEPROM_BIN_FILE_SIZE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error reading file %s, file size too large[>%d]\\n\", src, MAX_EEPROM_BIN_FILE_SIZE));\n\t\t\t\tretval = FALSE;\n\t\t\t\tgoto closeFile;\n\t\t\t}\n\t\t}\n\n\t\tretval = RtmpOSFileClose(srcf);\n\t\tif (retval)\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> Error closing file %s\\n\", src));\n  \t}\n\n\t\n\tRtmpOSFSInfoChange(&osfsInfo, FALSE);\n\n\tfor(ReadedByte=0;ReadedByte<TotalByte;ReadedByte++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02X \",buffer[ReadedByte]&0xff));\n\t\tif((ReadedByte+1)%2==0)\n\t\t\tPDATA[ReadedByte/2%8]=((buffer[ReadedByte]<<8)&0xff00)|(buffer[ReadedByte-1]&0xff);\n\t\tif(ReadedByte%16==0)\n\t\t{\n\t\t\tCompareBuf=buffer[ReadedByte]&0xff;\n\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCompareBuf&=(buffer[ReadedByte]&0xff);\n\t\t\tif((ReadedByte+1)%16==0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" result=%02X,blk=%02x\\n\",CompareBuf,ReadedByte/16));\n\n\t\t\t\tif(CompareBuf!=0xff)\n\t\t\t\t\teFuseWriteRegistersFromBin(pAd,(USHORT)ReadedByte-15, 16, PDATA);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(eFuseReadRegisters(pAd,ReadedByte, 2,(PUSHORT)&DATA)!=0x3f)\n\t\t\t\t\t\teFuseWriteRegistersFromBin(pAd,(USHORT)ReadedByte-15, 16, PDATA);\n\t\t\t\t}\n\t\t\t\t/*\n\t\t\t\tfor(l=0;l<8;l++)\n\t\t\t\t\tprintk(\"%04x \",PDATA[l]);\n\t\t\t\tprintk(\"\\n\");\n\t\t\t\t*/\n\t\t\t\tNdisZeroMemory(PDATA,16);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn TRUE;\n\ncloseFile:\n\tif (srcf)\n\t\tif (RtmpOSFileClose(srcf) != 0)\n\t\t\tretval = FALSE;\n\nrecoverFS:\n\tRtmpOSFSInfoChange(&osfsInfo, FALSE);\n\t\n\n\tif (memPtr)\n/*\t\tkfree(memPtr);*/\n\t\tos_free_mem(NULL, memPtr);\n\t\n\treturn retval;\n}\n\n\nstatic NTSTATUS eFuseWriteRegistersFromBin(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tIN\tUSHORT* pData)\n{\n\tUSHORT\ti,StartBlock=0,EndBlock=0;\n\tUSHORT\teFuseData;\n\tUSHORT\tLogicalAddress, BlkNum = 0xffff;\n\tUCHAR\tEFSROM_AOUT,Loop=0;\n\tEFUSE_CTRL_STRUC\t\teFuseCtrlStruc;\n\tUSHORT\tefuseDataOffset;\n\tUINT32\tdata,tempbuffer;\n\tUSHORT addr,tmpaddr, InBuf[3], tmpOffset;\n\tUINT32 buffer[4];\n\tBOOLEAN\t\tbWriteSuccess = TRUE;\n\tBOOLEAN\t\tbNotWrite=TRUE;\n\tBOOLEAN\t\tbAllocateNewBlk=TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegistersFromBin Offset=%x, pData=%04x:%04x:%04x:%04x\\n\", Offset, *pData,*(pData+1),*(pData+2),*(pData+3)));\n\t/*set start block and end block number, start from tail of mapping table*/\n\tif( (pAd->chipCap.EFUSE_USAGE_MAP_END % 2) != 0)\n\t{\n\t\tStartBlock = pAd->chipCap.EFUSE_USAGE_MAP_END-1; \n\t}\n\telse\n\t{\n\t\tStartBlock = pAd->chipCap.EFUSE_USAGE_MAP_END; \n\t}\n\n\tif( (pAd->chipCap.EFUSE_USAGE_MAP_START % 2) != 0)\n\t{\n\t\tEndBlock = pAd->chipCap.EFUSE_USAGE_MAP_START-1; \n\t}\n\telse\n\t{\n\t\tEndBlock = pAd->chipCap.EFUSE_USAGE_MAP_START; \n\t}\n\t\n\tdo\n\t{\n\t/*Step 0. find the entry in the mapping table*/\n\t/*The address of EEPROM is 2-bytes alignment.*/\n\t/*The last bit is used for alignment, so it must be 0.*/\n\tLoop++;\n\ttmpOffset = Offset & 0xfffe;\n\tEFSROM_AOUT = eFuseReadRegisters(pAd, tmpOffset, 2, &eFuseData);\n\t\n\tif( EFSROM_AOUT == 0x3f)\n\t{\t/*find available logical address pointer\t*/\n\t\t/*the logical address does not exist, find an empty one*/\n\t\t/*from the first address of block 45=16*45=0x2d0 to the last address of block 47*/\n\t\t/*==>48*16-3(reserved)=2FC*/\n\t\tbAllocateNewBlk=TRUE;\n\t\tfor (i=StartBlock; i>=EndBlock; i-=2)\n\t\t{\n\t\t\t/*Retrive the logical block nubmer form each logical address pointer*/\n\t\t\t/*It will access two logical address pointer each time.*/\n\t\t\teFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);\n\t\t\tif(( (LogicalAddress >> 8) & 0xff) == 0)\n\t\t\t{\n\t\t\t\tif(i != pAd->chipCap.EFUSE_USAGE_MAP_END)\n\t\t\t\t{\n\t\t\t\t\tBlkNum = i+1-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tif( (LogicalAddress & 0xff) == 0)\n\t\t\t{\n\t\t\t\tif(i != (pAd->chipCap.EFUSE_USAGE_MAP_START-1))\n\t\t\t\t{\n\t\t\t\t\tBlkNum = i-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tbAllocateNewBlk=FALSE;\n\t\tBlkNum = EFSROM_AOUT;\n\t}\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegisters BlkNum = %d \\n\", BlkNum));\n\n\tif(BlkNum == 0xffff)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegisters: out of free E-fuse space!!!\\n\"));\n\t\treturn FALSE;\n\t}\t\n\t/*Step 1.1.0*/\n\t/*If the block is not existing in mapping table, create one */\n\t/*and write down the 16-bytes data to the new block*/\n\tif(bAllocateNewBlk)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Allocate New Blk\\n\"));\n\t\tefuseDataOffset =  EFUSE_DATA3;\n\t\tfor(i=0; i< 4; i++)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Allocate New Blk, Data%d=%04x%04x\\n\",3-i,pData[2*i+1],pData[2*i]));\n\t\t\ttempbuffer=((pData[2*i+1]<<16)&0xffff0000)|pData[2*i];\n\n\n\t\t\tRTMP_IO_WRITE32(pAd, efuseDataOffset,tempbuffer);\t\t\t\n\t\t\tefuseDataOffset -= 4;\t\t\n\n\t\t}\n\n\t\t/*Step1.1.1. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.*/\n\t\tRTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);\n\t\teFuseCtrlStruc.field.EFSROM_AIN = BlkNum* 0x10 ;\n\n\t\t/*Step1.1.2. Write EFSROM_MODE (0x580, bit7:bit6) to 3.*/\n\t\teFuseCtrlStruc.field.EFSROM_MODE = 3;\n\t\t\n\t\t/*Step1.1.3. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical write procedure.*/\n\t\teFuseCtrlStruc.field.EFSROM_KICK = 1;\n\n\t\tNdisMoveMemory(&data, &eFuseCtrlStruc, 4);\t\n\t\t\n\t\tRTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);\t\n\n\t\t/*Step1.1.4. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. Its done.*/\n\t\ti = 0;\n\t\twhile(i < 100)\n\t\t{\t\n\t\t\tRTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);\n\n\t\t\tif(eFuseCtrlStruc.field.EFSROM_KICK == 0)\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tRTMPusecDelay(2);\t\n\t\t\ti++;\t\n\t\t}\n\t\t\n\t}\n\telse\n\t{\t/*Step1.2.*/\n\t\t/*If the same logical number is existing, check if the writting data and the data */\n\t\t/*saving in this block are the same.*/\n\t\t/*read current values of 16-byte block\t*/\n\t\tRTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);\n\n\t\t/*Step1.2.0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.*/\n\t\teFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;\n\n\t\t/*Step1.2.1. Write EFSROM_MODE (0x580, bit7:bit6) to 1.*/\n\t\teFuseCtrlStruc.field.EFSROM_MODE = 0;\n\n\t\t/*Step1.2.2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.*/\n\t\teFuseCtrlStruc.field.EFSROM_KICK = 1;\n\n\t\tNdisMoveMemory(&data, &eFuseCtrlStruc, 4);\n\t\tRTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);\t\n\n\t\t/*Step1.2.3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.*/\n\t\ti = 0;\n\t\twhile(i < 500)\n\t\t{\t\n\t\t\tRTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);\n\n\t\t\tif(eFuseCtrlStruc.field.EFSROM_KICK == 0)\n\t\t\t\tbreak;\n\t\t\tRTMPusecDelay(2);\n\t\t\ti++;\t\n\t\t}\n\n\t\t/*Step1.2.4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590)*/\n\t\tefuseDataOffset =  EFUSE_DATA3;\t\t\n\t\tfor(i=0; i< 4; i++)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, efuseDataOffset, (PUINT32) &buffer[i]);\n\t\t\tefuseDataOffset -=  4;\t\t\n\t\t}\n\t\t/*Step1.2.5. Check if the data of efuse and the writing data are the same.*/\n\t\tfor(i =0; i<4; i++)\n\t\t{\n\t\t\ttempbuffer=((pData[2*i+1]<<16)&0xffff0000)|pData[2*i];\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"buffer[%d]=%x,pData[%d]=%x,pData[%d]=%x,tempbuffer=%x\\n\",i,buffer[i],2*i,pData[2*i],2*i+1,pData[2*i+1],tempbuffer));\n\t\t\t\n\t\t\tif(((buffer[i]&0xffff0000)==(pData[2*i+1]<<16))&&((buffer[i]&0xffff)==pData[2*i]))\n\t\t\t\tbNotWrite&=TRUE;\n\t\t\telse\n\t\t\t{\n\t\t\t\tbNotWrite&=FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(!bNotWrite)\n\t\t{\n\t\tprintk(\"The data is not the same\\n\");\n\t\t\n\t\t\tfor(i =0; i<8; i++)\n\t\t\t{\n\t\t\t\taddr = BlkNum * 0x10 ;\n\t\t\t\t\n\t\t\t\tInBuf[0] = addr+2*i;\n\t\t\t\tInBuf[1] = 2;\n\t\t\t\tInBuf[2] = pData[i];\t\n\t\t\t\t\n\t\t\t\teFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2);\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\telse\n\t\t\treturn TRUE;\n\t     }\n\t\n\n\n\t\t/*Step 2. Write mapping table*/\n\t\taddr = pAd->chipCap.EFUSE_USAGE_MAP_START+BlkNum;\n\n\t\ttmpaddr = addr;\n\n\t\tif(addr % 2 != 0)\n\t\t\taddr = addr -1; \n\t\tInBuf[0] = addr;\n\t\tInBuf[1] = 2;\n\n\t\t/*convert the address from 10 to 8 bit ( bit7, 6 = parity and bit5 ~ 0 = bit9~4), and write to logical map entry*/\n\t\ttmpOffset = Offset;\n\t\ttmpOffset >>= 4;\n\t\ttmpOffset |= ((~((tmpOffset & 0x01) ^ ( tmpOffset >> 1 & 0x01) ^  (tmpOffset >> 2 & 0x01) ^  (tmpOffset >> 3 & 0x01))) << 6) & 0x40;\n\t\ttmpOffset |= ((~( (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01) ^ (tmpOffset >> 4 & 0x01) ^ ( tmpOffset >> 5 & 0x01))) << 7) & 0x80;\n\n\t\t/* write the logical address*/\n\t\tif(tmpaddr%2 != 0) \t\n\t\t\tInBuf[2] = tmpOffset<<8;\t\n\t\telse          \n\t\t\tInBuf[2] = tmpOffset;\n\n\t\teFuseWritePhysical(pAd,&InBuf[0], 6, NULL, 0);\n\n\t\t/*Step 3. Compare data if not the same, invalidate the mapping entry, then re-write the data until E-fuse is exhausted*/\n\t\tbWriteSuccess = TRUE;\n\t\tfor(i =0; i<8; i++)\n\t\t{\n\t\t\taddr = BlkNum * 0x10 ;\n\t\t\t\n\t\t\tInBuf[0] = addr+2*i;\n\t\t\tInBuf[1] = 2;\n\t\t\tInBuf[2] = 0x0;\t\n\t\t\t\n\t\t\teFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"addr=%x, buffer[i]=%x,InBuf[2]=%x\\n\",InBuf[0],pData[i],InBuf[2]));\n\t\t\tif(pData[i] != InBuf[2])\n\t\t\t{\n\t\t\t\tbWriteSuccess = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\t\t/*Step 4. invlidate mapping entry and find a free mapping entry if not succeed*/\n\t\t\n\t\tif (!bWriteSuccess&&Loop<2)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegistersFromBin::Not bWriteSuccess BlkNum = %d\\n\", BlkNum));\n\t\t\n\t\t\t/* the offset of current mapping entry*/\n\t\t\taddr = pAd->chipCap.EFUSE_USAGE_MAP_START+BlkNum;\t\t\t\n\n\t\t\t/*find a new mapping entry*/\n\t\t\tBlkNum = 0xffff;\n\t\t\tfor (i=StartBlock; i>=EndBlock; i-=2)\n\t\t\t{\n\t\t\t\t/*Retrive the logical block nubmer form each logical address pointer*/\n\t\t\t\t/*It will access two logical address pointer each time.*/\n\t\t\t\teFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);\n\t\t\t\tif(( (LogicalAddress >> 8) & 0xff) == 0)\n\t\t\t\t{\n\t\t\t\t\tif(i !=pAd->chipCap.EFUSE_USAGE_MAP_END)\n\t\t\t\t\t{\n\t\t\t\t\t\tBlkNum = i+1-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t}\n\n\t\t\t\tif( (LogicalAddress & 0xff) == 0)\n\t\t\t\t{\n\t\t\t\t\tif(i != (pAd->chipCap.EFUSE_USAGE_MAP_START-1))\n\t\t\t\t\t{\n\t\t\t\t\t\tBlkNum = i-pAd->chipCap.EFUSE_USAGE_MAP_START;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegistersFromBin::Not bWriteSuccess new BlkNum = %d\\n\", BlkNum));\t\n\t\t\tif(BlkNum == 0xffff)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseWriteRegistersFromBin: out of free E-fuse space!!!\\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t/*invalidate the original mapping entry if new entry is not found*/\n\t\t\ttmpaddr = addr;\n\n\t\t\tif(addr % 2 != 0)\n\t\t\t\taddr = addr -1; \n\t\t\tInBuf[0] = addr;\n\t\t\tInBuf[1] = 2;\t\t\n\t\t\t\n\t\t\teFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);\t\t\t\t\n\n\t\t\t/* write the logical address*/\n\t\t\tif(tmpaddr%2 != 0) \n\t\t\t{\n\t\t\t\t/* Invalidate the high byte*/\n\t\t\t\tfor (i=8; i<15; i++)\n\t\t\t\t{\n\t\t\t\t\tif( ( (InBuf[2] >> i) & 0x01) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tInBuf[2] |= (0x1 <<i);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t}\t\t\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* invalidate the low byte*/\n\t\t\t\tfor (i=0; i<8; i++)\n\t\t\t\t{\n\t\t\t\t\tif( ( (InBuf[2] >> i) & 0x01) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tInBuf[2] |= (0x1 <<i);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\t\t\teFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 0);\t\n\t\t}\t\n\t\t\n\t}\n\twhile(!bWriteSuccess&&Loop<2);\n\n\treturn TRUE;\n}\n\n\nint rtmp_ee_efuse_read16(\n\tIN RTMP_ADAPTER *pAd, \n\tIN USHORT Offset,\n\tOUT USHORT *pValue)\n{\n\n\tif (pAd->bFroceEEPROMBuffer\n#ifdef RALINK_ATE\n\t\t\t||pAd->bEEPROMFile\n#endif /* RALINK_ATE */\n\t\t)\n\t{\n\t    DBGPRINT(RT_DEBUG_TRACE,  (\"Read from EEPROM Buffer\\n\"));\n\t    NdisMoveMemory(pValue, &(pAd->EEPROMImage[Offset]), 2);\n\t    *pValue = le2cpu16(*pValue);\n\t}\n\telse\n\t\teFuseReadRegisters(pAd, Offset, 2, pValue);\n\treturn (*pValue);\n}\n\n\nint rtmp_ee_efuse_write16(\n\tIN RTMP_ADAPTER *pAd, \n\tIN USHORT Offset, \n\tIN USHORT data)\n{\n    if (pAd->bFroceEEPROMBuffer\n#ifdef RALINK_ATE\n\t\t\t||pAd->bEEPROMFile\n#endif /* RALINK_ATE */\n\t\t)\n    {\n    \tdata = le2cpu16(data);\n        DBGPRINT(RT_DEBUG_TRACE,  (\"Write to EEPROM Buffer\\n\"));\n        NdisMoveMemory(&(pAd->EEPROMImage[Offset]), &data, 2);\n    }\n    else\n        eFuseWrite(pAd,Offset ,&data, 2);\n\treturn 0;\n}\n\n\nint RtmpEfuseSupportCheck(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tUSHORT value;\n\t\n\tif (IS_RT30xx(pAd) || IS_RT3593(pAd))\n\t{\n\t\teFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);\n\t\tpAd->EFuseTag = (value & 0xff);\n\t}\n\treturn 0;\n}\n\n\n#ifdef RALINK_ATE\nINT set_eFuseBufferModeWriteBack_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT Enable;\n\t\n\n \tif(strlen(arg)>0)\t\n\t{\n\t\tEnable= simple_strtol(arg, 0, 16);\n \t}\n\telse\n\t\treturn FALSE;\n\tif(Enable==1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"set_eFuseBufferMode_Proc:: Call WRITEEEPROMBUF\"));\t\n\t\teFuseWriteEeeppromBuf(pAd);\n\t}\n\telse\n\t\treturn FALSE;\n\treturn TRUE;\n}\n#endif /* RALINK_ATE */\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tLoad EEPROM from bin file for eFuse mode\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS         firmware image load ok\n\t\tNDIS_STATUS_FAILURE         image not found\n\n\tIRQL = PASSIVE_LEVEL\n\t\t\n\t========================================================================\n*/\nINT eFuseLoadEEPROM(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPSTRING\t\t\t\t\tsrc = NULL;\n\tINT \t\t\t\t\t\tretval;\t\t\t\n\tRTMP_OS_FD\t\t\t\tsrcf;\n\tRTMP_OS_FS_INFO\t\t\tosFSInfo;\n\n\t\n\tsrc=EFUSE_BUFFER_PATH;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"FileName=%s\\n\",src));\n\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tif (src && *src)\n\t{\n\t\tsrcf = RtmpOSFileOpen(src, O_RDONLY, 0);\n\t\tif (IS_FILE_OPEN_ERR(srcf)) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error opening %s\\n\", src));\n\t\t\treturn FALSE;\n\t\t}\n\t\telse \n\t\t{\n\n\t\t\t\tmemset(pAd->EEPROMImage, 0x00, MAX_EEPROM_BIN_FILE_SIZE);\n\t\t\t\t\n\n\t\t\tretval =RtmpOSFileRead(srcf, (PSTRING)pAd->EEPROMImage, MAX_EEPROM_BIN_FILE_SIZE);\n\t\t\tif (retval > 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\n\t\t\t\tretval = NDIS_STATUS_SUCCESS;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Read file \\\"%s\\\" failed(errCode=%d)!\\n\", src, retval));\n\n      \t\t}\n\n\n\t}\n\telse\n\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error src  or srcf is null\\n\"));\n\t\t\t\t\treturn FALSE;\n\n\t\t}\n\n\tretval=RtmpOSFileClose(srcf);\n\t\t\t\n\tif (retval)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> Error %d closing %s\\n\", -retval, src));\n\t}\n\n\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\n\treturn TRUE;\t\n}\n\nINT eFuseWriteEeeppromBuf(\n\tIN PRTMP_ADAPTER pAd)\n{\n\n\tPSTRING\t\t\t\t\tsrc = NULL;\n\tINT \t\t\t\t\t\tretval;\t\t\t\n\tRTMP_OS_FD\t\t\t\tsrcf;\n\tRTMP_OS_FS_INFO\t\t\tosFSInfo;\n\t\t\t\t\t\t\n\t\n\tsrc=EFUSE_BUFFER_PATH;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"FileName=%s\\n\",src));\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\t\n\n\n\tif (src && *src)\n\t{\n\t\tsrcf = RtmpOSFileOpen(src, O_WRONLY|O_CREAT, 0);\n\n\t\tif (IS_FILE_OPEN_ERR(srcf)) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error opening %s\\n\", src));\n\t\t\treturn FALSE;\n\t\t}\n\t\telse \n\t\t{\n\n\t\t\tRtmpOSFileWrite(srcf, (PSTRING)pAd->EEPROMImage,MAX_EEPROM_BIN_FILE_SIZE);\n\n      \t\t}\n\n\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error src  or srcf is null\\n\"));\n\t\treturn FALSE;\n\n\t}\n\n\tretval=RtmpOSFileClose(srcf);\n\t\t\t\n\tif (retval)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> Error %d closing %s\\n\", -retval, src));\n\t}\n\t\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\treturn TRUE;\t\n}\n\n\nVOID eFuseGetFreeBlockCount(IN PRTMP_ADAPTER pAd, \n\tPUINT EfuseFreeBlock)\n{\n\t\n\tUSHORT i=0, StartBlock=0, EndBlock=0;\n\tUSHORT\tLogicalAddress;\n\tUSHORT\tFirstFreeBlock = 0xffff, LastFreeBlock = 0xffff;\n\n\tif(!pAd->bUseEfuse)\n\t\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"eFuseGetFreeBlockCount Only supports efuse Mode\\n\"));\n\t\treturn ;\n\t\t}\n\t*EfuseFreeBlock = 0;\n\t/* find first free block*/\n\tif( (pAd->chipCap.EFUSE_USAGE_MAP_START % 2) != 0)\n\t{\n\t\tStartBlock = pAd->chipCap.EFUSE_USAGE_MAP_START-1; \n\t}\n\telse\n\t{\n\t\tStartBlock = pAd->chipCap.EFUSE_USAGE_MAP_START; \n\t}\n\n\tif( (pAd->chipCap.EFUSE_USAGE_MAP_END % 2) != 0)\n\t{\n\t\tEndBlock = pAd->chipCap.EFUSE_USAGE_MAP_END-1; \n\t}\n\telse\n\t{\n\t\tEndBlock = pAd->chipCap.EFUSE_USAGE_MAP_END; \n\t}\n\n\tfor (i = StartBlock; i <= EndBlock; i+=2)\n\t{\n\t\teFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);\n\t\t\n\t\tif( (LogicalAddress & 0xff) == 0)\n\t\t{\n\t\t\tif(i != (pAd->chipCap.EFUSE_USAGE_MAP_START-1))\n\t\t\t{\n\t\t\t\tFirstFreeBlock = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\n\n\t\tif(( (LogicalAddress >> 8) & 0xff) == 0)\n\t\t{\n\t\t\tif(i != pAd->chipCap.EFUSE_USAGE_MAP_END)\n\t\t\t{\n\t\t\t\tFirstFreeBlock = i+1;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\t\t\t\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseGetFreeBlockCount, FirstFreeBlock= 0x%x\\n\", FirstFreeBlock));\n\n\t/*if not find, return free block number = 0*/\n\tif(FirstFreeBlock == 0xffff)\n\t{\n\t\t*EfuseFreeBlock = 0;\n\t\treturn;\t\n\t}\n\tfor (i = EndBlock; i >= StartBlock; i-=2)\n\t{\n\t\teFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);\n\t\t\t\t\n\t\tif(( (LogicalAddress >> 8) & 0xff) == 0)\n\t\t{\n\t\t\tif(i != pAd->chipCap.EFUSE_USAGE_MAP_END)\n\t\t\t{\n\t\t\t\tLastFreeBlock = i+1;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\t\tif( (LogicalAddress & 0xff) == 0)\n\t\t{\n\t\t\tif(i != (pAd->chipCap.EFUSE_USAGE_MAP_START-1))\n\t\t\t{\n\t\t\t\tLastFreeBlock = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"eFuseGetFreeBlockCount, LastFreeBlock= 0x%x\\n\", LastFreeBlock));\n\n\t/*if not find last free block, return free block number = 0, this should not happen since we have checked first free block number previously*/\n\tif(LastFreeBlock == 0xffff)\n\t{\n\t\t*EfuseFreeBlock = 0;\n\t\treturn;\t\n\t}\n\n\t/* return total free block number, last free block number must >= first free block number*/\n\tif(LastFreeBlock < FirstFreeBlock)\n\t{\n\t\t*EfuseFreeBlock = 0;\t\n\t}\n\telse\n\t{\n\t\t*EfuseFreeBlock = LastFreeBlock - FirstFreeBlock + 1;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"eFuseGetFreeBlockCount is %d\\n\",*EfuseFreeBlock));\n}\n\n\nINT eFuse_init(RTMP_ADAPTER *pAd)\n{\n\tUINT EfuseFreeBlock=0;\n\n\t/*RT3572 means 3062/3562/3572*/\n\t/*3593 means 3593*/\n\tDBGPRINT(RT_DEBUG_ERROR, (\"NVM is Efuse and its size =%x[%x-%x] \\n\",pAd->chipCap.EFUSE_USAGE_MAP_SIZE,pAd->chipCap.EFUSE_USAGE_MAP_START,pAd->chipCap.EFUSE_USAGE_MAP_END));\n\teFuseGetFreeBlockCount(pAd, &EfuseFreeBlock);\n\t/*If the used block of efuse is less than 5. We assume the default value*/\n\t/* of this efuse is empty and change to the buffer mode in odrder to */\n\t/*bring up interfaces successfully.*/\n\t\n\t\n\tif(EfuseFreeBlock > (pAd->chipCap.EFUSE_USAGE_MAP_SIZE-5))\n\t{\n\t\tint ret;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NVM is Efuse and the information is too less to bring up interface. Force to use EEPROM Buffer Mode\\n\"));\n\t\tpAd->bFroceEEPROMBuffer = TRUE;\n\t\tret = eFuseLoadEEPROM(pAd);\n\n\t\tif ( ret == FALSE )\n\t\t{\n\t\t\tif ( pAd->chipCap.EFUSE_DEFAULT_BIN != NULL )\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pAd->EEPROMImage, pAd->chipCap.EFUSE_DEFAULT_BIN, pAd->chipCap.EFUSE_DEFAULT_BIN_SIZE);\n\t\t\t}\n\t\t}\n\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t{\n\t\t\tUINT16\tNicConfig, FrequencyOffset;\n\t\t\tUINT16\tEfuseValue;\n\n\t\t\teFuseReadRegisters(pAd, EEPROM_FREQ_OFFSET, 2, &FrequencyOffset);\n\t\t\teFuseReadRegisters(pAd, EEPROM_NIC1_OFFSET, 2, &NicConfig);\n\n\t\t\tif ( (NicConfig == 0x0) && ( FrequencyOffset != 0xFFFF ) )\n\t\t\t{\n\t\t\t\t/* Calibration Free IC, but E-Fuse is empty */\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Calibration Free IC, Load calibration data...\\n\"));\n\t\t\t\t\n\t\t\t\tpAd->EEPROMImage[EEPROM_FREQ_OFFSET] = (UCHAR)(FrequencyOffset & 0xFF);\n\n\t\t\t\teFuseReadRegisters(pAd, EEPROM_TX0_TSSI_SLOPE, 2, &EfuseValue);\n\t\t\t\t*(UINT16 *)(&pAd->EEPROMImage[EEPROM_TX0_TSSI_SLOPE]) = EfuseValue;\n\t\t\t\teFuseReadRegisters(pAd, EEPROM_TX0_TSSI_OFFSET_GROUP1, 2, &EfuseValue);\n\t\t\t\t*(UINT16 *)(&pAd->EEPROMImage[EEPROM_TX0_TSSI_OFFSET_GROUP1]) = EfuseValue;\n\t\t\t\teFuseReadRegisters(pAd, EEPROM_TX0_TSSI_OFFSET, 2, &EfuseValue);\n\t\t\t\tpAd->EEPROMImage[EEPROM_TX0_TSSI_OFFSET] = (UCHAR)(EfuseValue & 0xFF);;\n\n\t\t\t\teFuseReadRegisters(pAd, EEPROM_G_TARGET_POWER, 2, &EfuseValue);\n\t\t\t\tpAd->EEPROMImage[EEPROM_G_TARGET_POWER + 1] = (UCHAR)(EfuseValue >> 8);\n\n\t\t\t\tpAd->bCalFreeIC = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->bCalFreeIC = FALSE;\n\t\t\t}\n\t\t}\n#endif /* MT7601 */\n\n\t}\n\telse\n\t{\n\t\tpAd->bFroceEEPROMBuffer = FALSE;\n\t\tpAd->bCalFreeIC = FALSE;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"NVM is Efuse and force to use EEPROM Buffer Mode=%x\\n\",pAd->bFroceEEPROMBuffer));\n\n\t// alan debug\n\t//pAd->bFroceEEPROMBuffer = TRUE;\n\t//eFuseLoadEEPROM(pAd);\n\n\treturn 0;\n}\n\n\nINT efuse_probe(RTMP_ADAPTER *pAd)\n{\n\tUINT32 eFuseCtrl, ctrl_reg;\n\n\n\tif (WaitForAsicReady(pAd) == FALSE)\n\t\t\treturn -1;\n\t\t\n\tpAd->bUseEfuse=FALSE;\n#ifdef RT65xx\n\t// TODO: shiang-6590, find a better naming for EFUSE_CTRL_3290!!\n\tif (IS_RT65XX(pAd))\n\t\tctrl_reg = EFUSE_CTRL_3290;\n\telse\n#endif /* RT65xx */\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\tctrl_reg = EFUSE_CTRL_3290;\n\telse\n#endif /* MT7601 */\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t\tctrl_reg = EFUSE_CTRL_3290;\n\telse\n#endif /* RT3290 */\n\t\tctrl_reg = EFUSE_CTRL;\n\tRTMP_IO_READ32(pAd, ctrl_reg, &eFuseCtrl);\n\n\t//pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;\n\n\tpAd->bUseEfuse = TRUE;\n\n\treturn 0;\n}\n\n\n#ifdef RALINK_ATE\nINT Set_LoadEepromBufferFromEfuse_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PSTRING\t\t\targ)\n{\n\tUINT bEnable = simple_strtol(arg, 0, 10);\n\tUINT free_blk = 0;\n\t\n\tif (bEnable < 0)\n\t\treturn FALSE;\n\telse\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Load EEPROM buffer from efuse, and change to BIN buffer mode\\n\"));\t\n\n\t\t/* If the number of the used block is less than 5, assume the efuse is not well-calibrated, and force to use buffer mode */\n\t\teFuseGetFreeBlockCount(pAd, &free_blk);\n\t\tif (free_blk > (pAd->chipCap.EFUSE_USAGE_MAP_SIZE - 5))\n\t\t\treturn FALSE;\n\t\t\n\t\tNdisZeroMemory(pAd->EEPROMImage, MAX_EEPROM_BIN_FILE_SIZE);\n\t\teFuseRead(pAd, 0, (PUSHORT)&pAd->EEPROMImage[0], MAX_EEPROM_BIN_FILE_SIZE);\t\t\n\n\t\t/* Change to BIN eeprom buffer mode */\n\t\tpAd->bFroceEEPROMBuffer = TRUE;\n\t\t\n\t\treturn TRUE;\n\t}\n}\n#endif /* RALINK_ATE */\n\n\n#endif /* RTMP_EFUSE_SUPPORT */\n\n"
  },
  {
    "path": "src/common/ee_prom.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tee_prom.c\n\n\tAbstract:\n\tMiniport generic portion header file\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n#include\t\"rt_config.h\"\n\n\n\n/* IRQL = PASSIVE_LEVEL*/\nstatic inline VOID RaiseClock(\n    IN\tPRTMP_ADAPTER\tpAd,\n    IN  UINT32 *x)\n{\n\t*x = *x | EESK;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);\n\tRTMPusecDelay(1);\t\t\t\t/* Max frequency = 1MHz in Spec. definition */\n}\n\n/* IRQL = PASSIVE_LEVEL*/\nstatic inline VOID LowerClock(\n    IN\tPRTMP_ADAPTER\tpAd,\n    IN  UINT32 *x)\n{\n\t*x = *x & ~EESK;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);\n\tRTMPusecDelay(1);\n}\n\n/* IRQL = PASSIVE_LEVEL*/\nstatic inline USHORT ShiftInBits(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUINT32\t\tx,i;\n\tUSHORT      data=0;\n\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\n\tx &= ~( EEDO | EEDI);\n\n\tfor(i=0; i<16; i++)\n\t{\n\t\tdata = data << 1;\n\t\tRaiseClock(pAd, &x);\n\n\t\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\t\tLowerClock(pAd, &x); /*prevent read failed*/\n\t\t\n\t\tx &= ~(EEDI);\n\t\tif(x & EEDO)\n\t\t    data |= 1;\n\t}\n\n\treturn data;\n}\n\n\n/* IRQL = PASSIVE_LEVEL*/\nstatic inline VOID ShiftOutBits(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN USHORT\t\t\tdata,\n\tIN USHORT\t\t\tcount)\n{\n\tUINT32       x,mask;\n\n\tmask = 0x01 << (count - 1);\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\n\tx &= ~(EEDO | EEDI);\n\n\tdo\n\t{\n\t    x &= ~EEDI;\n\t    if(data & mask)\t\tx |= EEDI;\n\n\t    RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n\n\t    RaiseClock(pAd, &x);\n\t    LowerClock(pAd, &x);\n\n\t    mask = mask >> 1;\n\t} while(mask);\n\n\tx &= ~EEDI;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n}\n\n\n/* IRQL = PASSIVE_LEVEL*/\nstatic inline VOID EEpromCleanup(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUINT32 x;\n\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\n\tx &= ~(EECS | EEDI);\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n\n\tRaiseClock(pAd, &x);\n\tLowerClock(pAd, &x);\t\n}\n\n\nstatic inline VOID EWEN(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUINT32\tx;\n\n\t/* reset bits and set EECS*/\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\tx &= ~(EEDI | EEDO | EESK);\n\tx |= EECS;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n\n\t/* kick a pulse*/\n\tRaiseClock(pAd, &x);\n\tLowerClock(pAd, &x);\n\n\t/* output the read_opcode and six pulse in that order    */\n\tShiftOutBits(pAd, EEPROM_EWEN_OPCODE, 5);\n\tShiftOutBits(pAd, 0, 6);\n\n\tEEpromCleanup(pAd);    \n}\n\n\nstatic inline VOID EWDS(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUINT32\tx;\n\n\t/* reset bits and set EECS*/\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\tx &= ~(EEDI | EEDO | EESK);\n\tx |= EECS;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n\n\t/* kick a pulse*/\n\tRaiseClock(pAd, &x);\n\tLowerClock(pAd, &x);\n\n\t/* output the read_opcode and six pulse in that order    */\n\tShiftOutBits(pAd, EEPROM_EWDS_OPCODE, 5);\n\tShiftOutBits(pAd, 0, 6);\n\n\tEEpromCleanup(pAd);    \n}\n\n\n/* IRQL = PASSIVE_LEVEL*/\nint rtmp_ee_prom_read16(\n\tIN RTMP_ADAPTER *pAd,\n\tIN USHORT Offset,\n\tOUT USHORT *pValue)\n{\n\tUINT32 x;\n\tUSHORT data;\n\n\n\n\tOffset /= 2;\n\t/* reset bits and set EECS*/\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\tx &= ~(EEDI | EEDO | EESK);\n\tx |= EECS;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n\n\t/* patch can not access e-Fuse issue*/\n\tif (IS_RT2860(pAd))\n\t{\n\t\t/* kick a pulse*/\n\t\tRaiseClock(pAd, &x);\n\t\tLowerClock(pAd, &x);\n\t}\n\n\t/* output the read_opcode and register number in that order    */\n\tShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);\n\tShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);\n\n\t/* Now read the data (16 bits) in from the selected EEPROM word*/\n\tdata = ShiftInBits(pAd);\n\n\tEEpromCleanup(pAd);\n\n\n\t*pValue = data;\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nint rtmp_ee_prom_write16(\n    IN RTMP_ADAPTER *pAd,\n    IN USHORT Offset,\n    IN USHORT Data)\n{\n\tUINT32 x;\n\n\n\n\tOffset /= 2;\n\n\tEWEN(pAd);\n\n\t/* reset bits and set EECS*/\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\tx &= ~(EEDI | EEDO | EESK);\n\tx |= EECS;\n\tRTMP_IO_WRITE32(pAd, E2PROM_CSR, x);\n\n\t/* patch can not access e-Fuse issue*/\n\tif (IS_RT2860(pAd))\n\t{\n\t\t/* kick a pulse*/\n\t\tRaiseClock(pAd, &x);\n\t\tLowerClock(pAd, &x);\n\t}\n\t\n\t/* output the read_opcode ,register number and data in that order */\n\tShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3);\n\tShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);\n\tShiftOutBits(pAd, Data, 16);\t\t/* 16-bit access*/\n\n\t/* read DO status*/\n\tRTMP_IO_READ32(pAd, E2PROM_CSR, &x);\n\n\tEEpromCleanup(pAd);\n\n\tRTMPusecDelay(10000);\t/*delay for twp(MAX)=10ms*/\n\n\tEWDS(pAd);\n\n\tEEpromCleanup(pAd);\n\n\n\treturn NDIS_STATUS_SUCCESS;\n\t\n}\n\n\n"
  },
  {
    "path": "src/common/eeprom.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\teeprom.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n*/\n#include \"rt_config.h\"\n\n\nINT RtmpChipOpsEepromHook(RTMP_ADAPTER *pAd, INT infType)\n{\n\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\tUINT32 e2p_csr;\n\n#ifdef RTMP_FLASH_SUPPORT\n\tpChipOps->eeinit = rtmp_nv_init;\n\tpChipOps->eeread = rtmp_ee_flash_read;\n\tpChipOps->eewrite = rtmp_ee_flash_write;\n\treturn 0;\n#endif /* RTMP_FLASH_SUPPORT */\n\n#ifdef RTMP_EFUSE_SUPPORT\n\tefuse_probe(pAd);\n\tif(pAd->bUseEfuse)\n\t{\n\t\tpChipOps->eeinit = eFuse_init;\n\t\tpChipOps->eeread = rtmp_ee_efuse_read16;\n\t\tpChipOps->eewrite = rtmp_ee_efuse_write16;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"NVM is EFUSE\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Efuse Size=0x%x [Range:%x-%x] \\n\",\n\t\t\t\tpAd->chipCap.EFUSE_USAGE_MAP_SIZE,\n\t\t\t\tpAd->chipCap.EFUSE_USAGE_MAP_START,\n\t\t\t\tpAd->chipCap.EFUSE_USAGE_MAP_END));\n\n\t\treturn 0 ;\t\n\t}\n\telse\n\t{\n\t\tpAd->bFroceEEPROMBuffer = FALSE;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"NVM is EEPROM\\n\"));\n\t}\n#endif /* RTMP_EFUSE_SUPPORT */\n\t\t\t\n\tswitch(infType)\n\t{\n\n\n#ifdef RTMP_USB_SUPPORT\n\t\tcase RTMP_DEV_INF_USB:\n\t\t\tpChipOps->eeinit = NULL;\n\t\t\tpChipOps->eeread = RTUSBReadEEPROM16;\n\t\t\tpChipOps->eewrite = RTUSBWriteEEPROM16;\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"pChipOps->eeread = RTUSBReadEEPROM16\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"pChipOps->eewrite = RTUSBWriteEEPROM16\\n\"));\n\t\t\tbreak;\n#endif /* RTMP_USB_SUPPORT */\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RtmpChipOpsEepromHook() failed!\\n\"));\n\t\t\tbreak;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/common/frq_cal.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tfrq_cal.c\n\n\tAbstract:\n\t\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\n#include\t\"rt_config.h\"\n\n/*\n\tSometimes frequency will be shift we need to adjust it when\n\tthe frequencey shift.\n*/\nVOID InitFrequencyCalibrationMode(\n\tPRTMP_ADAPTER pAd,\n\tUINT8 Mode)\n{\n\tBBP_R179_STRUC BbpR179 = {{0}};\n\tBBP_R180_STRUC BbpR180 = {{0}};\n\tBBP_R182_STRUC BbpR182 = {{0}};\n\n\t// TODO: shiang-6590, fix me, I don't know which MODE0 yet for RT85592\n\tif (Mode == FREQ_CAL_INIT_MODE0)\n\t{\n\t\t/* Initialize the RX_END_STATUS (1, 5) for \"Rx OFDM/CCK frequency offset report\"*/\n\t\tBbpR179.field.DataIndex1 = 1;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, BbpR179.byte);\n\t\tBbpR180.field.DataIndex2 = 5;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R180, BbpR180.byte);\n\t\tBbpR182.field.DataArray = BBP_R57; /* Rx OFDM/CCK frequency offset report*/\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R182, BbpR182.byte);\n\t}\n\telse if (Mode == FREQ_CAL_INIT_MODE1)\n\t{\n\t\t/* Initialize the RX_END_STATUS (1, 3) for \"Rx OFDM/CCK frequency offset report\"*/\n\t\tBbpR179.field.DataIndex1 = 1;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, BbpR179.byte);\n\t\tBbpR180.field.DataIndex2 = 3;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R180, BbpR180.byte);\n\t\tBbpR182.field.DataArray = BBP_R57; /* Rx OFDM/CCK frequency offset report*/\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R182, BbpR182.byte);\n\t}\n\telse if (Mode == FREQ_CAL_INIT_MODE2)\n\t{\n\t\t/* Initialize the RX_END_STATUS (1) for \"Rx OFDM/CCK frequency offset report\"*/\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R142, 1);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R143, BBP_R57); /* Rx OFDM/CCK frequency offset report*/\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:Unknow mode = %d\\n\", __FUNCTION__, Mode));\n}\n\n\n/* Initialize the frequency calibration*/\nVOID InitFrequencyCalibration(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"---> %s\\n\", __FUNCTION__));\n\t\t\n\t\tInitFrequencyCalibrationMode(pAd, pAd->chipCap.FreqCalInitMode);\n\t\t\n\t\tStopFrequencyCalibration(pAd);\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: frequency offset in the EEPROM = %ld(0x%x)\\n\", \n\t\t\t__FUNCTION__, \n\t\t\tpAd->RfFreqOffset, pAd->RfFreqOffset));\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<--- %s\\n\", __FUNCTION__));\n\t}\n}\n\n\n/* To stop the frequency calibration algorithm*/\nVOID StopFrequencyCalibration(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"---> %s\\n\", __FUNCTION__));\n\n\t\t/* Base on the frequency offset of the EEPROM*/\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t\tpAd->FreqCalibrationCtrl.AdaptiveFreqOffset = pAd->RfFreqOffset;\t/* AdaptiveFreqOffset= RF_R12[7:0] */\n\t\telse\n#endif /* MT7601 */\n\t\tpAd->FreqCalibrationCtrl.AdaptiveFreqOffset = (0x7F & ((CHAR)(pAd->RfFreqOffset))); /* C1 value control - Crystal calibration*/\n\n\t\tpAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon = INVALID_FREQUENCY_OFFSET;\n\t\tpAd->FreqCalibrationCtrl.bSkipFirstFrequencyCalibration = TRUE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pAd->FreqCalibrationCtrl.AdaptiveFreqOffset = 0x%X\\n\", \n\t\t\t__FUNCTION__, \n\t\t\tpAd->FreqCalibrationCtrl.AdaptiveFreqOffset));\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<--- %s\\n\", __FUNCTION__));\n\t}\n}\n\n\nVOID FrequencyCalibrationMode(\n\tPRTMP_ADAPTER pAd,\n\tUINT8 Mode)\n{\n\tUCHAR RFValue = 0;\n\tUINT32 PreRFValue = 0; \n\n#ifdef MT7601\n\tif (Mode == FREQ_CAL_MODE2)\n\t{\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R12, pAd->FreqCalibrationCtrl.AdaptiveFreqOffset);\n\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R04, 0x0A);\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R05, 0x20);\n\t\trlt_rf_read(pAd, RF_BANK0, RF_R04, &RFValue);\n\t\tRFValue = ((RFValue & ~0x80) | 0x80); \t/* vcocal_en (initiate VCO calibration (reset after completion)) - It should be at the end of RF configuration. */\n\t\trlt_rf_write(pAd, RF_BANK0, RF_R04, RFValue);\n\t\tRTMPusecDelay(2000);\n\t}\n\telse\n#endif /* MT7601 */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Unknown FrqCalibration Mode\\n\")); \n}\n\n\n/* The frequency calibration algorithm*/\nVOID FrequencyCalibration(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/*BOOLEAN bUpdateRFR = FALSE;*/\n\tCHAR HighFreqTriggerPoint = 0, LowFreqTriggerPoint = 0;\n\tCHAR DecreaseFreqOffset = 0, IncreaseFreqOffset = 0;\n\t\n\t/* Frequency calibration period: */\n\t/* a) 10 seconds: Check the reported frequency offset*/\n\t/* b) 500 ms: Update the RF frequency if possible*/\n\tif ((pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration == TRUE) && \n\t     (((pAd->FreqCalibrationCtrl.bApproachFrequency == FALSE) && ((pAd->Mlme.PeriodicRound % FREQUENCY_CALIBRATION_PERIOD) == 0)) || \n\t       ((pAd->FreqCalibrationCtrl.bApproachFrequency == TRUE) && ((pAd->Mlme.PeriodicRound % (FREQUENCY_CALIBRATION_PERIOD / 20)) == 0))))\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"---> %s\\n\", __FUNCTION__));\n\n\t\tif (pAd->FreqCalibrationCtrl.bSkipFirstFrequencyCalibration == TRUE)\n\t\t{\n\t\t\tpAd->FreqCalibrationCtrl.bSkipFirstFrequencyCalibration = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: Skip cuurent frequency calibration (avoid calibrating frequency at the time the STA is just link-up)\\n\", __FUNCTION__));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon != INVALID_FREQUENCY_OFFSET)\n\t\t\t{\t\t\t\t\n\t\t\t\t/* Sync the thresholds*/\n\t\t\t\tif (pAd->FreqCalibrationCtrl.BeaconPhyMode == MODE_CCK) /* CCK*/\n\t\t\t\t{\n#ifdef MT7601\n\t\t\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\t\t{\n\t\t\t\t\tHighFreqTriggerPoint = MT7601_HIGH_FREQUENCY_TRIGGER_POINT_CCK;\n\t\t\t\t\tLowFreqTriggerPoint = MT7601_LOW_FREQUENCY_TRIGGER_POINT_CCK;\n\n\t\t\t\t\tDecreaseFreqOffset = MT7601_DECREASE_FREQUENCY_OFFSET_CCK;\n\t\t\t\t\tIncreaseFreqOffset = MT7601_INCREASE_FREQUENCY_OFFSET_CCK;\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* MT7601 */\n\t\t\t\t\t{\n\t\t\t\t\tHighFreqTriggerPoint = HIGH_FREQUENCY_TRIGGER_POINT_CCK;\n\t\t\t\t\tLowFreqTriggerPoint = LOW_FREQUENCY_TRIGGER_POINT_CCK;\n\n\t\t\t\t\tDecreaseFreqOffset = DECREASE_FREQUENCY_OFFSET_CCK;\n\t\t\t\t\tIncreaseFreqOffset = INCREASE_FREQUENCY_OFFSET_CCK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse /* OFDM*/\n\t\t\t\t{\n#ifdef MT7601\n\t\t\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:MT7601 receive OFDM beacon.\\n\", __FUNCTION__));\n\t\t\t\t\t\n\t\t\t\t\tHighFreqTriggerPoint = MT7601_HIGH_FREQUENCY_TRIGGER_POINT_OFDM20;\n\t\t\t\t\tLowFreqTriggerPoint = MT7601_LOW_FREQUENCY_TRIGGER_POINT_OFDM20;\n\n\t\t\t\t\tDecreaseFreqOffset = MT7601_DECREASE_FREQUENCY_OFFSET_OFDM20;\n\t\t\t\t\tIncreaseFreqOffset = MT7601_INCREASE_FREQUENCY_OFFSET_OFDM20;\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* MT7601 */\n\t\t\t\t\t{\n\t\t\t\t\tHighFreqTriggerPoint = HIGH_FREQUENCY_TRIGGER_POINT_OFDM;\n\t\t\t\t\tLowFreqTriggerPoint = LOW_FREQUENCY_TRIGGER_POINT_OFDM;\n\n\t\t\t\t\tDecreaseFreqOffset = DECREASE_FREQUENCY_OFFSET_OFDM;\n\t\t\t\t\tIncreaseFreqOffset = INCREASE_FREQUENCY_OFFSET_OFDM;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ((pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon >= HighFreqTriggerPoint) || \n\t\t\t\t     (pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon <= LowFreqTriggerPoint))\n\t\t\t\t{\n\t\t\t\t\tpAd->FreqCalibrationCtrl.bApproachFrequency = TRUE;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (pAd->FreqCalibrationCtrl.bApproachFrequency == TRUE)\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon <= DecreaseFreqOffset) && \n\t\t\t\t\t      (pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon >= IncreaseFreqOffset))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->FreqCalibrationCtrl.bApproachFrequency = FALSE; /* Stop approaching frquency if -10 < reported frequency offset < 10*/\n\t\t\t\t\t}\n\t\t\t\t\telse if (pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon > DecreaseFreqOffset)\n\t\t\t\t\t{\n#ifdef MT7601\n\t\t\t\t\t\tif(pAd->FreqCalibrationCtrl.AdaptiveFreqOffset > 0)\n#endif /* MT7601 */\n\t\t\t\t\t\t\tpAd->FreqCalibrationCtrl.AdaptiveFreqOffset--;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: -- frequency offset = 0x%X\\n\", __FUNCTION__, pAd->FreqCalibrationCtrl.AdaptiveFreqOffset));\n\t\t\t\t\t\tFrequencyCalibrationMode(pAd, pAd->chipCap.FreqCalMode);\n\t\t\t\t\t}\n\t\t\t\t\telse if (pAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon < IncreaseFreqOffset)\n\t\t\t\t\t{\n#ifdef MT7601\n\t\t\t\t\t\tif(pAd->FreqCalibrationCtrl.AdaptiveFreqOffset < 0xBF)\n#endif /* MT7601 */\n\t\t\t\t\t\t\tpAd->FreqCalibrationCtrl.AdaptiveFreqOffset++;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ++ frequency offset = 0x%X\\n\", __FUNCTION__, pAd->FreqCalibrationCtrl.AdaptiveFreqOffset));\n\t\t\t\t\t\tFrequencyCalibrationMode(pAd, pAd->chipCap.FreqCalMode);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: AdaptiveFreqOffset = %d, LatestFreqOffsetOverBeacon = %d, bApproachFrequency = %d\\n\", \n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpAd->FreqCalibrationCtrl.AdaptiveFreqOffset, \n\t\t\t\t\tpAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon, \n\t\t\t\t\tpAd->FreqCalibrationCtrl.bApproachFrequency));\n\t\t\t}\n\t\t}\n\t\t\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"<--- %s\\n\", __FUNCTION__));\n\t}\n}\n\n\ninline CHAR GetFrequencyOffsetField(\n\tPRTMP_ADAPTER pAd,\n\tRXWI_STRUC *pRxWI,\n\tUINT8 RxWIFrqOffsetField)\n{\n\tCHAR FreqOffset = 0;\n\t\n\tif (RxWIFrqOffsetField == RXWI_FRQ_OFFSET_FIELD0)\n\t{\n\t\tFreqOffset = (CHAR)(pRxWI->RxWISNR1);\n\t}\n\telse if (RxWIFrqOffsetField == RXWI_FRQ_OFFSET_FIELD1)\n\t{\n\t\tFreqOffset = (CHAR)(pRxWI->RxWIFOFFSET);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:Unknow Frequency Offset location(%d)\\n\", __FUNCTION__, RxWIFrqOffsetField));\n\n\treturn FreqOffset;\t\t\n}\n\n\n/* Get the frequency offset*/\nCHAR GetFrequencyOffset(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RXWI_STRUC *pRxWI)\n{\n\tCHAR FreqOffset = 0;\n\t\n\tif (pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"---> %s\\n\", __FUNCTION__));\n\n\t\tFreqOffset = GetFrequencyOffsetField(pAd, pRxWI, pAd->chipCap.RxWIFrqOffset);\n\n\t\tif ((FreqOffset < LOWERBOUND_OF_FREQUENCY_OFFSET) || \n\t\t     (FreqOffset > UPPERBOUND_OF_FREQUENCY_OFFSET))\n\t\t{\n\t\t\tFreqOffset = INVALID_FREQUENCY_OFFSET;\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: (out-of-range) FreqOffset = %d\\n\", \n\t\t\t\t__FUNCTION__, \n\t\t\t\tFreqOffset));\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: FreqOffset = %d(0x%x)\\n\", \n\t\t\t__FUNCTION__, \n\t\t\tFreqOffset, FreqOffset));\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"<--- %s\\n\", __FUNCTION__));\n\t}\n\n\treturn FreqOffset;\n}\n\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n"
  },
  {
    "path": "src/common/igmp_snoop.c",
    "content": "#ifdef IGMP_SNOOP_SUPPORT\n\n#include \"rt_config.h\"\n#include \"ipv6.h\"\n#include \"igmp_snoop.h\"\n\nUINT16 IPv6MulticastFilterExclued[] =\n{\n\tIPV6_NEXT_HEADER_ICMPV6,\t/* ICMPv6. */\n\tIPV6_NEXT_HEADER_PIM,\t\t/* PIM. */\n};\n#define IPV6_MULTICAST_FILTER_EXCLUED_SIZE  \\\n\t(sizeof(IPv6MulticastFilterExclued) / sizeof(UINT16))\n\nstatic inline void initFreeEntryList(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList)\n{\n\tint i;\n\n\tfor (i = 0; i < FREE_MEMBER_POOL_SIZE; i++)\n\t\tinsertTailList(pList, (PLIST_ENTRY)&(pMulticastFilterTable->freeMemberPool[i]));\n\n\treturn;\n}\n\nstatic inline PMEMBER_ENTRY AllocaGrpMemberEntry(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable)\n{\n\tPMEMBER_ENTRY pMemberEntry;\n\n\tRTMP_SEM_LOCK(&pMulticastFilterTable->FreeMemberPoolTabLock);\n\n\tpMemberEntry = (PMEMBER_ENTRY)removeHeadList(&pMulticastFilterTable->freeEntryList);\n\n\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->FreeMemberPoolTabLock);\n\n\treturn (PMEMBER_ENTRY)pMemberEntry;\n}\n\nstatic inline VOID FreeGrpMemberEntry(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PMEMBER_ENTRY pEntry)\n{\n\tRTMP_SEM_LOCK(&pMulticastFilterTable->FreeMemberPoolTabLock);\n\n\tinsertTailList(&pMulticastFilterTable->freeEntryList, (PLIST_ENTRY)pEntry);\n\n\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->FreeMemberPoolTabLock);\n}\n\nstatic VOID IGMPTableDisplay(\n\tIN PRTMP_ADAPTER pAd);\n\nstatic BOOLEAN isIgmpMacAddr(\n\tIN PUCHAR pMacAddr);\n\nstatic VOID InsertIgmpMember(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList,\n\tIN PUCHAR pMemberAddr);\n\nstatic VOID DeleteIgmpMember(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList,\n\tIN PUCHAR pMemberAddr);\n\nstatic VOID DeleteIgmpMemberList(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList);\n\n\n/*\n    ==========================================================================\n    Description:\n        This routine init the entire IGMP table.\n    ==========================================================================\n */\nVOID MulticastFilterTableInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMULTICAST_FILTER_TABLE *ppMulticastFilterTable)\n{\n\t/* Initialize MAC table and allocate spin lock */\n/*\t*ppMulticastFilterTable = kmalloc(sizeof(MULTICAST_FILTER_TABLE), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)ppMulticastFilterTable, sizeof(MULTICAST_FILTER_TABLE));\n\tif (*ppMulticastFilterTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s unable to alloc memory for Multicase filter table, size=%d\\n\",\n\t\t\t__FUNCTION__, sizeof(MULTICAST_FILTER_TABLE)));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(*ppMulticastFilterTable, sizeof(MULTICAST_FILTER_TABLE));\n\tNdisAllocateSpinLock(pAd, &((*ppMulticastFilterTable)->MulticastFilterTabLock));\n\n\tNdisAllocateSpinLock(pAd, &((*ppMulticastFilterTable)->FreeMemberPoolTabLock));\n\tinitList(&((*ppMulticastFilterTable)->freeEntryList));\n\tinitFreeEntryList(*ppMulticastFilterTable, &((*ppMulticastFilterTable)->freeEntryList));\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        This routine reset the entire IGMP table.\n    ==========================================================================\n */\nVOID MultiCastFilterTableReset(\n\tIN PMULTICAST_FILTER_TABLE *ppMulticastFilterTable)\n{\n\tif(*ppMulticastFilterTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Multicase filter table is not ready.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tNdisFreeSpinLock(&((*ppMulticastFilterTable)->FreeMemberPoolTabLock));\n\tNdisFreeSpinLock(&((*ppMulticastFilterTable)->MulticastFilterTabLock));\n/*\tkfree(*ppMulticastFilterTable); */\n\tos_free_mem(NULL, *ppMulticastFilterTable);\n\t*ppMulticastFilterTable = NULL;\n}\n\n/*\n    ==========================================================================\n    Description:\n        Display all entrys in IGMP table\n    ==========================================================================\n */\nstatic VOID IGMPTableDisplay(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint i;\n\tMULTICAST_FILTER_TABLE_ENTRY *pEntry = NULL;\n\tPMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable;\n\n\tif (pMulticastFilterTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s Multicase filter table is not ready.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* if FULL, return */\n\tif (pMulticastFilterTable->Size == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table empty.\\n\"));\n\t\treturn;\n\t}\n\n\t/* allocate one MAC entry */\n\tRTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\n\tfor (i = 0; i< MAX_LEN_OF_MULTICAST_FILTER_TABLE; i++)\n\t{\n\t\t/* pick up the first available vacancy */\n\t\tif (pMulticastFilterTable->Content[i].Valid == TRUE)\n\t\t{\n\t\t\tPMEMBER_ENTRY pMemberEntry = NULL;\n\t\t\tpEntry = &pMulticastFilterTable->Content[i];\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"IF(%s) entry #%d, type=%s, GrpId=(%02x:%02x:%02x:%02x:%02x:%02x) memberCnt=%d\\n\",\n\t\t\t\tRTMP_OS_NETDEV_GET_DEVNAME(pEntry->net_dev), i, (pEntry->type==0 ? \"static\":\"dynamic\"),\n\t\t\t\tPRINT_MAC(pEntry->Addr), IgmpMemberCnt(&pEntry->MemberList)));\n\n\t\t\tpMemberEntry = (PMEMBER_ENTRY)pEntry->MemberList.pHead;\n\t\t\twhile (pMemberEntry)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"member mac=(%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t\t\t\t\t\t\t\t\tPRINT_MAC(pMemberEntry->Addr)));\n\n\t\t\t\tpMemberEntry = pMemberEntry->pNext;\n\t\t\t}\n\t\t}\n\t}\n\n\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        Add and new entry into MAC table\n    ==========================================================================\n */\nBOOLEAN MulticastFilterTableInsertEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pGrpId,\n\tIN PUCHAR pMemberAddr,\n\tIN PNET_DEV dev,\n\tIN MulticastFilterEntryType type)\n{\n\tUCHAR HashIdx;\n\tint i;\n\tMULTICAST_FILTER_TABLE_ENTRY *pEntry = NULL, *pCurrEntry, *pPrevEntry;\n\tPMEMBER_ENTRY pMemberEntry;\n\tPMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable;\n\t\n\tif (pMulticastFilterTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Multicase filter table is not ready.\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\t/* if FULL, return */\n\tif (pMulticastFilterTable->Size >= MAX_LEN_OF_MULTICAST_FILTER_TABLE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Multicase filter table full. max-entries = %d\\n\",\n\t\t\t__FUNCTION__, MAX_LEN_OF_MULTICAST_FILTER_TABLE));\n\t\treturn FALSE;\n\t}\n\n\t/* check the rule is in table already or not. */\n\tif ((pEntry = MulticastFilterTableLookup(pMulticastFilterTable, pGrpId, dev)))\n\t{\n\t\t/* doesn't indicate member mac address. */\n\t\tif(pMemberAddr == NULL)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tpMemberEntry = (PMEMBER_ENTRY)pEntry->MemberList.pHead;\n\n\t\twhile (pMemberEntry)\n\t\t{\n\t\t\tif (MAC_ADDR_EQUAL(pMemberAddr, pMemberEntry->Addr))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: already in Members list.\\n\", __FUNCTION__));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tpMemberEntry = pMemberEntry->pNext;\n\t\t}\n\t}\n\n\tRTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\tdo\n\t{\n\t\tULONG Now;\n\t\t/* the multicast entry already exist but doesn't include the member yet. */\n\t\tif (pEntry != NULL && pMemberAddr != NULL)\n\t\t{\n\t\t\tInsertIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr);\n\t\t\tbreak;\n\t\t}\n\n\t\t/* allocate one MAC entry */\n\t\tfor (i = 0; i < MAX_LEN_OF_MULTICAST_FILTER_TABLE; i++)\n\t\t{\n\t\t\t/* pick up the first available vacancy */\n\t\t\tpEntry = &pMulticastFilterTable->Content[i];\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tif ((pEntry->Valid == TRUE) && (pEntry->type == MCAT_FILTER_DYNAMIC)\n\t\t\t\t&& ((Now - pEntry->lastTime) > IGMPMAC_TB_ENTRY_AGEOUT_TIME))\n\t\t\t{\n\t\t\t\tPMULTICAST_FILTER_TABLE_ENTRY pHashEntry;\n\n\t\t\t\tHashIdx = MULTICAST_ADDR_HASH_INDEX(pEntry->Addr);\n\t\t\t\tpHashEntry = pMulticastFilterTable->Hash[HashIdx];\n\n\t\t\t\tif ((pEntry->net_dev == pHashEntry->net_dev)\n\t\t\t\t\t&& MAC_ADDR_EQUAL(pEntry->Addr, pHashEntry->Addr))\n\t\t\t\t{\n\t\t\t\t\tpMulticastFilterTable->Hash[HashIdx] = pHashEntry->pNext;\n\t\t\t\t\tpMulticastFilterTable->Size --;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MCastFilterTableDeleteEntry 1 - Total= %d\\n\", pMulticastFilterTable->Size));\n\t\t\t\t} else\n\t\t\t\t{\n\t\t\t\t\twhile (pHashEntry->pNext)\n\t\t\t\t\t{\n\t\t\t\t\t\tpPrevEntry = pHashEntry;\n\t\t\t\t\t\tpHashEntry = pHashEntry->pNext;\n\t\t\t\t\t\tif ((pEntry->net_dev == pHashEntry->net_dev)\n\t\t\t\t\t\t\t&& MAC_ADDR_EQUAL(pEntry->Addr, pHashEntry->Addr))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpPrevEntry->pNext = pHashEntry->pNext;\n\t\t\t\t\t\t\tpMulticastFilterTable->Size --;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MCastFilterTableDeleteEntry 2 - Total= %d\\n\", pMulticastFilterTable->Size));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpEntry->Valid = FALSE;\n\t\t\t\tDeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList);\n\t\t\t}\n\n\t\t\tif (pEntry->Valid == FALSE)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY));\n\t\t\t\tpEntry->Valid = TRUE;\n\n\t\t\t\tCOPY_MAC_ADDR(pEntry->Addr, pGrpId);\n\t\t\t\tpEntry->net_dev = dev;\n\t\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\t\tpEntry->lastTime = Now;\n\t\t\t\tpEntry->type = type;\n\t\t\t\tinitList(&pEntry->MemberList);\n\t\t\t\tif (pMemberAddr != NULL)\n\t\t\t\t\tInsertIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr);\n\n\t\t\t\tpMulticastFilterTable->Size ++;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MulticastFilterTableInsertEntry -IF(%s) allocate entry #%d, Total= %d\\n\", RTMP_OS_NETDEV_GET_DEVNAME(dev), i, pMulticastFilterTable->Size));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* add this MAC entry into HASH table */\n\t\tif (pEntry)\n\t\t{\n\t\t\tHashIdx = MULTICAST_ADDR_HASH_INDEX(pGrpId);\n\t\t\tif (pMulticastFilterTable->Hash[HashIdx] == NULL)\n\t\t\t{\n\t\t\t\tpMulticastFilterTable->Hash[HashIdx] = pEntry;\n\t\t\t} else\n\t\t\t{\n\t\t\t\tpCurrEntry = pMulticastFilterTable->Hash[HashIdx];\n\t\t\t\twhile (pCurrEntry->pNext != NULL)\n\t\t\t\t\tpCurrEntry = pCurrEntry->pNext;\n\t\t\t\tpCurrEntry->pNext = pEntry;\n\t\t\t}\n\t\t}\n\t}while(FALSE);\n\n\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\n\treturn TRUE;\n}\n\n/*\n    ==========================================================================\n    Description:\n        Delete a specified client from MAC table\n    ==========================================================================\n */\nBOOLEAN MulticastFilterTableDeleteEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pGrpId,\n\tIN PUCHAR pMemberAddr,\n\tIN PNET_DEV dev)\n{\n\tUSHORT HashIdx;\n\tMULTICAST_FILTER_TABLE_ENTRY *pEntry, *pPrevEntry;\n\tPMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable;\n\n\tif (pMulticastFilterTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Multicase filter table is not ready.\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tRTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\n\tdo\n\t{\n\t\tHashIdx = MULTICAST_ADDR_HASH_INDEX(pGrpId);\n\t\tpPrevEntry = pEntry = pMulticastFilterTable->Hash[HashIdx];\n\n\t\twhile (pEntry && pEntry->Valid)\n\t\t{\n\t\t\tif ((pEntry->net_dev ==  dev)\n\t\t\t\t&& MAC_ADDR_EQUAL(pEntry->Addr, pGrpId))\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpPrevEntry = pEntry;\n\t\t\t\tpEntry = pEntry->pNext;\n\t\t\t}\n\t\t}\n\n\t\t/* check the rule is in table already or not. */\n\t\tif (pEntry && (pMemberAddr != NULL))\n\t\t{\n\t\t\t/*USHORT Aid = MCAST_WCID; */\n\t\t\t/*SST\tSst = SST_ASSOC; */\n\t\t\t/*UCHAR PsMode = PWR_ACTIVE, Rate; */\n\t\t\t/*if(APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate)) */\n\t\t\tDeleteIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr);\n\t\t\tif (IgmpMemberCnt(&pEntry->MemberList) > 0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (pEntry)\n\t\t{\n\t\t\tif (pEntry == pMulticastFilterTable->Hash[HashIdx])\n\t\t\t{\n\t\t\t\tpMulticastFilterTable->Hash[HashIdx] = pEntry->pNext;\n\t\t\t\tDeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList);\n\t\t\t\tNdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY));\n\t\t\t\tpMulticastFilterTable->Size --;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MCastFilterTableDeleteEntry 1 - Total= %d\\n\", pMulticastFilterTable->Size));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpPrevEntry->pNext = pEntry->pNext;\n\t\t\t\tDeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList);\n\t\t\t\tNdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY));\n\t\t\t\tpMulticastFilterTable->Size --;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MCastFilterTableDeleteEntry 2 - Total= %d\\n\", pMulticastFilterTable->Size));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: the Group doesn't exist.\\n\", __FUNCTION__));\n\t\t}\n\t} while(FALSE);\n\n\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n    \n\treturn TRUE;\n}\n\n/*\n    ==========================================================================\n    Description:\n        Look up the MAC address in the IGMP table. Return NULL if not found.\n    Return:\n        pEntry - pointer to the MAC entry; NULL is not found\n    ==========================================================================\n*/\nPMULTICAST_FILTER_TABLE_ENTRY MulticastFilterTableLookup(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PUCHAR pAddr,\n\tIN PNET_DEV dev)\n{\n\tULONG HashIdx, Now;\n\tPMULTICAST_FILTER_TABLE_ENTRY pEntry = NULL, pPrev = NULL;\n\t\n\tif (pMulticastFilterTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Multicase filter table is not ready.\\n\", __FUNCTION__));\n\t\treturn NULL;\n\t}\n\n\tRTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\n\tHashIdx = MULTICAST_ADDR_HASH_INDEX(pAddr);\n\tpEntry = pPrev = pMulticastFilterTable->Hash[HashIdx];\n\n\twhile (pEntry && pEntry->Valid)\n\t{\n\t\tif ((pEntry->net_dev ==  dev)\n\t\t\t&& MAC_ADDR_EQUAL(pEntry->Addr, pAddr))\n\t\t{\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpEntry->lastTime = Now;\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tif ((pEntry->Valid == TRUE) && (pEntry->type == MCAT_FILTER_DYNAMIC)\n\t\t\t\t&& RTMP_TIME_AFTER(Now, pEntry->lastTime+IGMPMAC_TB_ENTRY_AGEOUT_TIME))\n\t\t\t{\n\t\t\t\t/* Remove the aged entry */\n\t\t\t\tif (pEntry == pMulticastFilterTable->Hash[HashIdx])\n\t\t\t\t{\n\t\t\t\t\tpMulticastFilterTable->Hash[HashIdx] = pEntry->pNext;\n\t\t\t\t\tpPrev = pMulticastFilterTable->Hash[HashIdx];\n\t\t\t\t\tDeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList);\n\t\t\t\t\tNdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY));\n\t\t\t\t\tpMulticastFilterTable->Size --;\n\t\t\t\t\tpEntry = pPrev;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MCastFilterTableDeleteEntry 2 - Total= %d\\n\", pMulticastFilterTable->Size));\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tpPrev->pNext = pEntry->pNext;\n\t\t\t\t\tDeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList);\n\t\t\t\t\tNdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY));\n\t\t\t\t\tpMulticastFilterTable->Size --;\n\t\t\t\t\tpEntry = pPrev->pNext;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MCastFilterTableDeleteEntry 2 - Total= %d\\n\", pMulticastFilterTable->Size));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpPrev = pEntry;\n\t\t\t\tpEntry = pEntry->pNext;\n\t\t\t}\n\t\t}\n\t}\n\n\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\n\treturn pEntry;\n}\n\nVOID IGMPSnooping(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pSrcMacAddr,\n\tIN PUCHAR pIpHeader,\n\tIN PNET_DEV pDev)\n{\n\tINT i;\n\tINT IpHeaderLen;\n\tUCHAR GroupType;\n\tUINT16 numOfGroup;\n\tUCHAR IgmpVerType;\n\tPUCHAR pIgmpHeader;\n\tPUCHAR pGroup;\n\tUCHAR AuxDataLen;\n\tUINT16 numOfSources;\n\tPUCHAR pGroupIpAddr;\n\tUCHAR GroupMacAddr[6];\n\tPUCHAR pGroupMacAddr = (PUCHAR)&GroupMacAddr;\n\n\tif(isIgmpPkt(pDstMacAddr, pIpHeader))\n\t{\n\t\tIpHeaderLen = (*(pIpHeader + 2) & 0x0f) * 4;\n\t\tpIgmpHeader = pIpHeader + 2 + IpHeaderLen;\n\t\tIgmpVerType = (UCHAR)(*(pIgmpHeader));\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IGMP type=%0x\\n\", IgmpVerType));\n\n\t\tswitch(IgmpVerType)\n\t\t{\n\t\tcase IGMP_V1_MEMBERSHIP_REPORT: /* IGMP version 1 membership report. */\n\t\tcase IGMP_V2_MEMBERSHIP_REPORT: /* IGMP version 2 membership report. */\n\t\t\tpGroupIpAddr = (PUCHAR)(pIgmpHeader + 4);\n\t\t\t\tConvertMulticastIP2MAC(pGroupIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IP);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IGMP Group=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\tGroupMacAddr[0], GroupMacAddr[1], GroupMacAddr[2], GroupMacAddr[3], GroupMacAddr[4], GroupMacAddr[5]));\n\t\t\tMulticastFilterTableInsertEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev, MCAT_FILTER_DYNAMIC);\n\t\t\tbreak;\n\n\t\tcase IGMP_LEAVE_GROUP: /* IGMP version 1 and version 2 leave group. */\n\t\t\tpGroupIpAddr = (PUCHAR)(pIgmpHeader + 4);\n\t\t\t\tConvertMulticastIP2MAC(pGroupIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IP);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IGMP Group=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\tGroupMacAddr[0], GroupMacAddr[1], GroupMacAddr[2], GroupMacAddr[3], GroupMacAddr[4], GroupMacAddr[5]));\n\t\t\tMulticastFilterTableDeleteEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev);\n\t\t\tbreak;\n\n\t\tcase IGMP_V3_MEMBERSHIP_REPORT: /* IGMP version 3 membership report. */\n\t\t\tnumOfGroup = ntohs(*((UINT16 *)(pIgmpHeader + 6)));\n\t\t\tpGroup = (PUCHAR)(pIgmpHeader + 8);\n\t\t\tfor (i=0; i < numOfGroup; i++)\n\t\t\t{\n\t\t\t\tGroupType = (UCHAR)(*pGroup);\n\t\t\t\tAuxDataLen = (UCHAR)(*(pGroup + 1));\n\t\t\t\tnumOfSources = ntohs(*((UINT16 *)(pGroup + 2)));\n\t\t\t\tpGroupIpAddr = (PUCHAR)(pGroup + 4);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IGMPv3 Type=%d, ADL=%d, numOfSource=%d\\n\", \n\t\t\t\t\t\t\t\tGroupType, AuxDataLen, numOfSources));\n\t\t\t\tConvertMulticastIP2MAC(pGroupIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IP);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IGMP Group=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tGroupMacAddr[0], GroupMacAddr[1], GroupMacAddr[2], \n\t\t\t\t\tGroupMacAddr[3], GroupMacAddr[4], GroupMacAddr[5]));\n\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif ((GroupType == MODE_IS_EXCLUDE) \n\t\t\t\t\t\t|| (GroupType == CHANGE_TO_EXCLUDE_MODE) \n\t\t\t\t\t\t|| (GroupType == ALLOW_NEW_SOURCES))\n\t\t\t\t\t{\n\t\t\t\t\t\tMulticastFilterTableInsertEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev, MCAT_FILTER_DYNAMIC);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((GroupType == CHANGE_TO_INCLUDE_MODE) \n\t\t\t\t\t\t|| (GroupType == MODE_IS_INCLUDE)\n\t\t\t\t\t\t|| (GroupType == BLOCK_OLD_SOURCES))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(numOfSources == 0)\n\t\t\t\t\t\t\tMulticastFilterTableDeleteEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tMulticastFilterTableInsertEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev, MCAT_FILTER_DYNAMIC);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} while(FALSE);\n\t\t\t\tpGroup += (8 + (numOfSources * 4) + AuxDataLen);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"unknow IGMP Type=%d\\n\", IgmpVerType));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn;\n}\n\n\nstatic BOOLEAN isIgmpMacAddr(\n\tIN PUCHAR pMacAddr)\n{\n\tif((pMacAddr[0] == 0x01)\n\t\t&& (pMacAddr[1] == 0x00)\n\t\t&& (pMacAddr[2] == 0x5e))\n\t\treturn TRUE;\n\treturn FALSE;\n}\n\nBOOLEAN isIgmpPkt(\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pIpHeader)\n{\n\tUINT16 IpProtocol = ntohs(*((UINT16 *)(pIpHeader)));\n\tUCHAR IgmpProtocol;\n\n\tif(!isIgmpMacAddr(pDstMacAddr))\n\t\treturn FALSE;\n\n\tif(IpProtocol == ETH_P_IP)\n\t{\n\t\tIgmpProtocol = (UCHAR)*(pIpHeader + 11);\n\t\tif(IgmpProtocol == IGMP_PROTOCOL_DESCRIPTOR)\n\t\t\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nstatic VOID InsertIgmpMember(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList,\n\tIN PUCHAR pMemberAddr)\n{\n\tPMEMBER_ENTRY pMemberEntry;\n\n\tif(pList == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: membert list doesn't exist.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tif (pMemberAddr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: invalid member.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tif((pMemberEntry = (PMEMBER_ENTRY)AllocaGrpMemberEntry(pMulticastFilterTable)) != NULL)\n\t{\n\t\tNdisZeroMemory(pMemberEntry, sizeof(MEMBER_ENTRY));\n\t\tCOPY_MAC_ADDR(pMemberEntry->Addr, pMemberAddr);\n\t\tinsertTailList(pList, (PLIST_ENTRY)pMemberEntry);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s Member Mac=%02x:%02x:%02x:%02x:%02x:%02x\\n\", __FUNCTION__,\n\t\t\tpMemberEntry->Addr[0], pMemberEntry->Addr[1], pMemberEntry->Addr[2],\n\t\t\tpMemberEntry->Addr[3], pMemberEntry->Addr[4], pMemberEntry->Addr[5]));\n\t}\n\treturn;\n}\n\nstatic VOID DeleteIgmpMember(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList,\n\tIN PUCHAR pMemberAddr)\n{\n\tPMEMBER_ENTRY pCurEntry;\n\n\tif (pList == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: membert list doesn't exist.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tif (pList->pHead == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tif (pMemberAddr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: invalid member.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tpCurEntry = (PMEMBER_ENTRY)pList->pHead;\n\twhile (pCurEntry)\n\t{\n\t\tPMEMBER_ENTRY pCurEntryNext = pCurEntry->pNext;\n\t\tif(MAC_ADDR_EQUAL(pMemberAddr, pCurEntry->Addr))\n\t\t{\n\t\t\tdelEntryList(pList, (PLIST_ENTRY)pCurEntry);\n\t\t\tFreeGrpMemberEntry(pMulticastFilterTable, pCurEntry);\n\t\t\tbreak;\n\t\t}\n\t\tpCurEntry = pCurEntryNext;\n\t}\n\n\treturn;\n}\n\nstatic VOID DeleteIgmpMemberList(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PLIST_HEADER pList)\n{\n\tPMEMBER_ENTRY pCurEntry, pPrvEntry;\n\n\tif (pList == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: membert list doesn't exist.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tif (pList->pHead == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tpPrvEntry = pCurEntry = (PMEMBER_ENTRY)pList->pHead;\n\twhile (pCurEntry)\n\t{\n\t\tdelEntryList(pList, (PLIST_ENTRY)pCurEntry);\n\t\tpPrvEntry = pCurEntry;\n\t\tpCurEntry = pCurEntry->pNext;\n\t\tFreeGrpMemberEntry(pMulticastFilterTable, pPrvEntry);\n\t}\n\n\tinitList(pList);\n\treturn;\n}\n\n\nUCHAR IgmpMemberCnt(\n\tIN PLIST_HEADER pList)\n{\n\tif(pList == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: membert list doesn't exist.\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\n\treturn getListSize(pList);\n}\n\nVOID IgmpGroupDelMembers(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMemberAddr,\n\tIN PNET_DEV pDev)\n{\n\tINT i;\n\tMULTICAST_FILTER_TABLE_ENTRY *pEntry = NULL;\n\tPMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable;\n\n\tfor (i = 0; i < MAX_LEN_OF_MULTICAST_FILTER_TABLE; i++)\n\t{\n\t\t/* pick up the first available vacancy */\n\t\tpEntry = &pMulticastFilterTable->Content[i];\n\t\tif (pEntry->Valid == TRUE)\n\t\t{\n\t\t\tif(pMemberAddr != NULL)\n\t\t\t{\n\t\t\t\tRTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\t\t\t\tDeleteIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr);\n\t\t\t\tRTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock);\n\t\t\t}\n\n\t\t\tif((pEntry->type == MCAT_FILTER_DYNAMIC)\n\t\t\t\t&& (IgmpMemberCnt(&pEntry->MemberList) == 0))\n\t\t\t\tMulticastFilterTableDeleteEntry(pAd, pEntry->Addr, pMemberAddr, pDev);\n\t\t}\n\t}\n}\n\nINT Set_IgmpSn_Enable_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUINT Enable;\n\n\tEnable = (UINT) simple_strtol(arg, 0, 10);\n\n\tpAd->ApCfg.IgmpSnoopEnable = (BOOLEAN)(Enable == 0 ? FALSE : TRUE);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: %s\\n\", __FUNCTION__, Enable == TRUE ? \"Enable IGMP Snooping\":\"Disable IGMP Snooping\"));\n\n\treturn TRUE;\n}\n\nINT Set_IgmpSn_AddEntry_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tINT i;\n\tBOOLEAN bGroupId = 1;\n\tPSTRING value;\n\tPSTRING thisChar;\n\tUCHAR IpAddr[4];\n\tUCHAR Addr[ETH_LENGTH_OF_ADDRESS];\n\tUCHAR GroupId[ETH_LENGTH_OF_ADDRESS];\n\tPUCHAR *pAddr = (PUCHAR *)&Addr;\n\tPNET_DEV pDev;\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tifIndex = pObj->ioctl_if;\n\n\tpDev = (ifIndex == MAIN_MBSSID) ? (pAd->net_dev) : (pAd->ApCfg.MBSSID[ifIndex].MSSIDDev);\n\n\twhile ((thisChar = strsep((char **)&arg, \"-\")) != NULL)\n\t{\n\t\t/* refuse the Member if it's not a MAC address. */\n\t\tif((bGroupId == 0) && (strlen(thisChar) != 17))\n\t\t\tcontinue;\n\n\t\tif(strlen(thisChar) == 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t{\n\t\t\tfor (i=0, value = rstrtok(thisChar,\":\"); value; value = rstrtok(NULL,\":\"))\n\t\t\t{\n\t\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\t\tAtoH(value, &Addr[i++], 1);\n\t\t\t}\n\n\t\t\tif(i != 6)\n\t\t\t\treturn FALSE;  /*Invalid */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (i=0, value = rstrtok(thisChar,\".\"); value; value = rstrtok(NULL,\".\")) \n\t\t\t{\n\t\t\t\tif((strlen(value) > 0) && (strlen(value) <= 3)) \n\t\t\t\t{\n\t\t\t\t\tint ii;\n\t\t\t\t\tfor(ii=0; ii<strlen(value); ii++)\n\t\t\t\t\t\tif (!isxdigit(*(value + ii)))\n\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\t\tIpAddr[i] = (UCHAR)simple_strtol(value, NULL, 10);\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif(i != 4)\n\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\tConvertMulticastIP2MAC(IpAddr, (PUCHAR *)&pAddr, ETH_P_IP);\n\t\t}\n\n\t\tif(bGroupId == 1)\n\t\t\tCOPY_MAC_ADDR(GroupId, Addr);\n\n\t\t/* Group-Id must be a MCAST address. */\n\t\tif((bGroupId == 1) && IS_MULTICAST_MAC_ADDR(Addr))\n\t\t\tMulticastFilterTableInsertEntry(pAd, GroupId, NULL, pDev, MCAT_FILTER_STATIC);\n\t\t/* Group-Member must be a UCAST address. */\n\t\telse if ((bGroupId == 0) && !IS_MULTICAST_MAC_ADDR(Addr))\n\t\t\tMulticastFilterTableInsertEntry(pAd, GroupId, Addr, pDev, MCAT_FILTER_STATIC);\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s (%2X:%2X:%2X:%2X:%2X:%2X) is not a acceptable address.\\n\",\n\t\t\t\t__FUNCTION__, Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], Addr[5]));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tbGroupId = 0;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s (%2X:%2X:%2X:%2X:%2X:%2X)\\n\",\n\t\t\t__FUNCTION__, Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], Addr[5]));\n\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_IgmpSn_DelEntry_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tINT i, memberCnt = 0;\n\tBOOLEAN bGroupId = 1;\n\tPSTRING value;\n\tPSTRING thisChar;\n\tUCHAR IpAddr[4];\n\tUCHAR Addr[ETH_LENGTH_OF_ADDRESS];\n\tUCHAR GroupId[ETH_LENGTH_OF_ADDRESS];\n\tPUCHAR *pAddr = (PUCHAR *)&Addr;\n\tPNET_DEV pDev;\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tifIndex = pObj->ioctl_if;\n\n\tpDev = (ifIndex == MAIN_MBSSID) ? (pAd->net_dev) : (pAd->ApCfg.MBSSID[ifIndex].MSSIDDev);\n\n\twhile ((thisChar = strsep((char **)&arg, \"-\")) != NULL)\n\t{\n\t\t/* refuse the Member if it's not a MAC address. */\n\t\tif((bGroupId == 0) && (strlen(thisChar) != 17))\n\t\t\tcontinue;\n\n\t\tif(strlen(thisChar) == 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t{\n\t\t\tfor (i=0, value = rstrtok(thisChar,\":\"); value; value = rstrtok(NULL,\":\")) \n\t\t\t{\n\t\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\t\tAtoH(value, &Addr[i++], 1);\n\t\t\t}\n\n\t\t\tif(i != 6)\n\t\t\t\treturn FALSE;  /*Invalid */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (i=0, value = rstrtok(thisChar,\".\"); value; value = rstrtok(NULL,\".\")) \n\t\t\t{\n\t\t\t\tif((strlen(value) > 0) && (strlen(value) <= 3)) \n\t\t\t\t{\n\t\t\t\t\tint ii;\n\t\t\t\t\tfor(ii=0; ii<strlen(value); ii++)\n\t\t\t\t\t\tif (!isxdigit(*(value + ii)))\n\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\t\tIpAddr[i] = (UCHAR)simple_strtol(value, NULL, 10);\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif(i != 4)\n\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\tConvertMulticastIP2MAC(IpAddr, (PUCHAR *)&pAddr, ETH_P_IP);\n\t\t}\n\n\t\tif(bGroupId == 1)\n\t\t\tCOPY_MAC_ADDR(GroupId, Addr);\n\t\telse\n\t\t\tmemberCnt++;\n\n\t\tif (memberCnt > 0 )\n\t\t\tMulticastFilterTableDeleteEntry(pAd, (PUCHAR)GroupId, Addr, pDev);\n\n\t\tbGroupId = 0;\n\t}\n\n\tif(memberCnt == 0)\n\t\tMulticastFilterTableDeleteEntry(pAd, (PUCHAR)GroupId, NULL, pDev);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s (%2X:%2X:%2X:%2X:%2X:%2X)\\n\",\n\t\t__FUNCTION__, Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], Addr[5]));\n\n\treturn TRUE;\n}\n\nINT Set_IgmpSn_TabDisplay_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg)\n{\n\tIGMPTableDisplay(pAd);\n\treturn TRUE;\n}\n\nvoid rtmp_read_igmp_snoop_from_file(\n\tIN  PRTMP_ADAPTER pAd,\n\tPSTRING tmpbuf,\n\tPSTRING buffer)\n{\n\t/*IgmpSnEnable */\n\tif(RTMPGetKeyParameter(\"IgmpSnEnable\", tmpbuf, 128, buffer, TRUE))\n\t{\n\t\tif ((strncmp(tmpbuf, \"0\", 1) == 0))\n\t\t\tpAd->ApCfg.IgmpSnoopEnable = FALSE;\n\t\telse if ((strncmp(tmpbuf, \"1\", 1) == 0))\n\t\t\tpAd->ApCfg.IgmpSnoopEnable = TRUE;\n        else\n\t\t\tpAd->ApCfg.IgmpSnoopEnable = FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" IGMP Snooping Enable=%d\\n\", pAd->ApCfg.IgmpSnoopEnable));\n\t}\n}\n\nNDIS_STATUS IgmpPktInfoQuery(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pSrcBufVA,\n\tIN PNDIS_PACKET pPacket,\n\tIN UCHAR FromWhichBSSID,\n\tOUT INT *pInIgmpGroup,\n\tOUT PMULTICAST_FILTER_TABLE_ENTRY *ppGroupEntry)\n{\n\tif(IS_MULTICAST_MAC_ADDR(pSrcBufVA))\n\t{\n\t\tBOOLEAN IgmpMldPkt = FALSE;\n\t\tPUCHAR pIpHeader = pSrcBufVA + 12;\n\n\t\tif(ntohs(*((UINT16 *)(pIpHeader))) == ETH_P_IPV6)\n\t\t\tIgmpMldPkt = IPv6MulticastFilterExcluded(pSrcBufVA, pIpHeader);\n\t\telse\n\t\t\tIgmpMldPkt = isIgmpPkt(pSrcBufVA, pIpHeader);\n\n\t\tif (IgmpMldPkt)\n\t\t{\n\t\t\t*ppGroupEntry = NULL;\n\t\t\t*pInIgmpGroup = IGMP_PKT;\n\t\t}\n\t\telse if ((*ppGroupEntry = MulticastFilterTableLookup(pAd->pMulticastFilterTable, pSrcBufVA,\n\t\t\t\t\t\t\t\t\tget_netdev_from_bssid(pAd, FromWhichBSSID))) == NULL)\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\telse\n\t\t\t*pInIgmpGroup = IGMP_IN_GROUP;\n\t}\n\telse if (IS_BROADCAST_MAC_ADDR(pSrcBufVA))\n\t{\n\t\tPUCHAR pDstIpAddr = pSrcBufVA + 30; /* point to Destination of Ip address of IP header. */\n\t\tUCHAR GroupMacAddr[6];\n\t\tPUCHAR pGroupMacAddr = (PUCHAR)&GroupMacAddr;\n\n\t\tConvertMulticastIP2MAC(pDstIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IP);\n\t\tif ((*ppGroupEntry = MulticastFilterTableLookup(pAd->pMulticastFilterTable, pGroupMacAddr,\n\t\t\t\t\t\t\t\tget_netdev_from_bssid(pAd, FromWhichBSSID))) != NULL)\n\t\t{\n\t\t\t*pInIgmpGroup = IGMP_IN_GROUP;\n\t\t}\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nNDIS_STATUS IgmpPktClone(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket,\n\tIN INT IgmpPktInGroup,\n\tIN PMULTICAST_FILTER_TABLE_ENTRY pGroupEntry,\n\tIN UCHAR QueIdx,\n\tIN UINT8 UserPriority,\n\tIN PNET_DEV pNetDev)\n{\n\tPNDIS_PACKET pSkbClone = NULL;\n\tPMEMBER_ENTRY pMemberEntry = NULL;\n\tMAC_TABLE_ENTRY *pMacEntry = NULL;\n\tUSHORT Aid;\n\tSST\tSst = SST_ASSOC;\n\tUCHAR PsMode = PWR_ACTIVE;\n\tUCHAR Rate;\n\tunsigned long IrqFlags;\n\tINT MacEntryIdx;\n\tBOOLEAN bContinue;\n\tPUCHAR pMemberAddr = NULL;\n\n\tbContinue = FALSE;\n\n\tif ((IgmpPktInGroup == IGMP_IN_GROUP)\n\t\t&& (pGroupEntry == NULL))\n\t\treturn NDIS_STATUS_FAILURE;\n\n\tif (IgmpPktInGroup == IGMP_IN_GROUP)\n\t{\n\t\tpMemberEntry = (PMEMBER_ENTRY)pGroupEntry->MemberList.pHead;\n\t\tif (pMemberEntry != NULL)\n\t\t{\n\t\t\tpMemberAddr = pMemberEntry->Addr;\n\t\t\tpMacEntry = APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t\tbContinue = TRUE;\n\t\t}\n\t}\n\telse if (IgmpPktInGroup == IGMP_PKT)\n\t{\n\t\t   PUCHAR src_addr = GET_OS_PKT_DATAPTR(pPacket);\n                src_addr += 6;\n\n\t\tfor(MacEntryIdx=1; MacEntryIdx<MAX_NUMBER_OF_MAC; MacEntryIdx++)\n\t\t{\n\t\t\tpMemberAddr = pAd->MacTab.Content[MacEntryIdx].Addr;\n\t\t\tpMacEntry = APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t\tif (pMacEntry && IS_ENTRY_CLIENT(pMacEntry)\n\t\t\t\t&& get_netdev_from_bssid(pAd, pMacEntry->apidx) == pNetDev\n\t\t\t\t&& (!NdisEqualMemory(src_addr, pMacEntry->Addr, MAC_ADDR_LEN)))\n\t\t\t{\n\t\t\t\tpMemberAddr = pMacEntry->Addr;\n\t\t\t\tbContinue = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t/* check all members of the IGMP group. */\n\twhile(bContinue == TRUE)\n\t{\n\t\tif (pMacEntry && (Sst == SST_ASSOC) && (pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n\t\t{\n\t\t\tOS_PKT_CLONE(pAd, pPacket, pSkbClone, MEM_ALLOC_FLAG);\n\t\t\tif ((pSkbClone)\n\t\t\t)\n\t\t\t{\n\t\t\t\tRTMP_SET_PACKET_WCID(pSkbClone, (UCHAR)pMacEntry->Aid);\n\t\t\t\t/* Pkt type must set to PKTSRC_NDIS. */\n\t\t\t\t/* It cause of the deason that APHardTransmit() */\n\t\t\t\t/* doesn't handle PKTSRC_DRIVER pkt type in version 1.3.0.0. */\n\t\t\t\tRTMP_SET_PACKET_SOURCE(pSkbClone, PKTSRC_NDIS);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (IgmpPktInGroup == IGMP_IN_GROUP)\n\t\t\t\t{\n\t\t\t\t\tpMemberEntry = pMemberEntry->pNext;\n\t\t\t\t\tif (pMemberEntry != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tpMemberAddr = pMemberEntry->Addr;\n\t\t\t\t\t\tpMacEntry = APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t\t\t\t\tbContinue = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tbContinue = FALSE;\n\t\t\t\t}\n\t\t\t\telse if (IgmpPktInGroup == IGMP_PKT)\n\t\t\t\t{\n\t\t   \t\t\tPUCHAR src_addr = GET_OS_PKT_DATAPTR(pPacket);\n                \t\t\tsrc_addr += 6;\n\t\t\t\t\tfor(MacEntryIdx=pMacEntry->Aid + 1; MacEntryIdx<MAX_NUMBER_OF_MAC; MacEntryIdx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tpMemberAddr = pAd->MacTab.Content[MacEntryIdx].Addr;\n\t\t\t\t\t\tpMacEntry = APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t\t\t\t\tif (pMacEntry && IS_ENTRY_CLIENT(pMacEntry)\n\t\t\t\t\t\t\t&& get_netdev_from_bssid(pAd, pMacEntry->apidx) == pNetDev\n\t\t\t\t\t\t\t&& (!NdisEqualMemory(src_addr, pMacEntry->Addr, MAC_ADDR_LEN)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpMemberAddr = pMacEntry->Addr;\n\t\t\t\t\t\t\tbContinue = TRUE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (MacEntryIdx == MAX_NUMBER_OF_MAC)\n\t\t\t\t\t\tbContinue = FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbContinue = FALSE;\t\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (PsMode == PWR_SAVE)\n\t\t\t{\n\t\t\t\tAPInsertPsQueue(pAd, pSkbClone, pMacEntry, QueIdx);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* insert the pkt to TxSwQueue. */\n\t\t\t\tif (pAd->TxSwQueue[QueIdx].Number >= pAd->TxSwQMaxLen)\n\t\t\t\t{\n#ifdef BLOCK_NET_IF\n\t\t\t\t\tStopNetIfQueue(pAd, QueIdx, pSkbClone);\n#endif /* BLOCK_NET_IF */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pSkbClone, NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pSkbClone));\n\t\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\t\t\t}\n\t\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\t\tRTMP_BASetup(pAd, pMacEntry, UserPriority);\n#endif /* DOT11_N_SUPPORT */\n\t\t}\n\n\t\tif (IgmpPktInGroup == IGMP_IN_GROUP)\n\t\t{\n\t\t\tpMemberEntry = pMemberEntry->pNext;\n\t\t\tif (pMemberEntry != NULL)\n\t\t\t{\n\t\t\t\tpMemberAddr = pMemberEntry->Addr;\n\t\t\t\tpMacEntry = APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t\t\tbContinue = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t\tbContinue = FALSE;\n\t\t}\n\t\telse if (IgmpPktInGroup == IGMP_PKT)\n\t\t{\n\t\t\tfor(MacEntryIdx=pMacEntry->Aid + 1; MacEntryIdx<MAX_NUMBER_OF_MAC; MacEntryIdx++)\n\t\t\t{\n\t\t\t\tpMemberAddr = pAd->MacTab.Content[MacEntryIdx].Addr;\n\t\t\t\tpMacEntry = APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate);\n\t\t\t\tif (pMacEntry && IS_ENTRY_CLIENT(pMacEntry)\n\t\t\t\t\t&& get_netdev_from_bssid(pAd, pMacEntry->apidx) == pNetDev)\n\t\t\t\t{\n\t\t\t\t\tpMemberAddr = pMacEntry->Addr;\n\t\t\t\t\tbContinue = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (MacEntryIdx == MAX_NUMBER_OF_MAC)\n\t\t\t\tbContinue = FALSE;\n\t\t}\n\t\telse\n\t\t\tbContinue = FALSE;\t\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic inline BOOLEAN isMldMacAddr(\n\tIN PUCHAR pMacAddr)\n{\n\treturn ((pMacAddr[0] == 0x33) && (pMacAddr[1] == 0x33)) ? TRUE : FALSE;\n}\n\nstatic inline BOOLEAN IsSupportedMldMsg(\n\tIN UINT8 MsgType) \n{\n\tBOOLEAN result = FALSE;\n\tswitch(MsgType)\n\t{\n\t\tcase MLD_V1_LISTENER_REPORT:\n\t\tcase MLD_V1_LISTENER_DONE:\n\t\tcase MLD_V2_LISTERNER_REPORT:\n\t\t\tresult = TRUE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t}\n\n\treturn result;\n}\n\nBOOLEAN isMldPkt(\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pIpHeader,\n\tOUT UINT8 *pProtoType,\n\tOUT PUCHAR *pMldHeader)\n{\n\tBOOLEAN result = FALSE;\n\tUINT16 IpProtocol = ntohs(*((UINT16 *)(pIpHeader)));\n\n\tif(!isMldMacAddr(pDstMacAddr))\n\t\treturn FALSE;\n\n\tif(IpProtocol != ETH_P_IPV6)\n\t\treturn FALSE;\n\n\t/* skip protocol (2 Bytes). */\n\tpIpHeader += 2;\n\tdo\n\t{\n\t\tPRT_IPV6_HDR pIpv6Hdr = (PRT_IPV6_HDR)(pIpHeader);\n\t\tUINT8 nextProtocol = pIpv6Hdr->nextHdr;\n\t\tUINT32 offset = IPV6_HDR_LEN;\n\n\t\twhile(nextProtocol != IPV6_NEXT_HEADER_ICMPV6)\n\t\t{\n\t\t\tif(IPv6ExtHdrHandle((RT_IPV6_EXT_HDR *)(pIpHeader + offset), &nextProtocol, &offset) == FALSE)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(nextProtocol == IPV6_NEXT_HEADER_ICMPV6)\n\t\t{\n\t\t\tPRT_ICMPV6_HDR pICMPv6Hdr = (PRT_ICMPV6_HDR)(pIpHeader + offset);\n\t\t\tif (IsSupportedMldMsg(pICMPv6Hdr->type) == TRUE)\n\t\t\t{\n\t\t\t\tif (pProtoType != NULL)\n\t\t\t\t\t*pProtoType = pICMPv6Hdr->type;\n\t\t\t\tif (pMldHeader != NULL)\n\t\t\t\t\t*pMldHeader = (PUCHAR)pICMPv6Hdr;\n\t\t\t\tresult = TRUE;\n\t\t\t}\n\t\t}\n\t}while(FALSE);\n\n\treturn result;\n}\n\nBOOLEAN IPv6MulticastFilterExcluded(\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pIpHeader)\n{\n\tBOOLEAN result = FALSE;\n\tUINT16 IpProtocol = ntohs(*((UINT16 *)(pIpHeader)));\n\tINT idx;\n\tUINT8 nextProtocol;\n\n\tif(!IS_IPV6_MULTICAST_MAC_ADDR(pDstMacAddr))\n\t\treturn FALSE;\n\n\tif(IpProtocol != ETH_P_IPV6)\n\t\treturn FALSE;\n\n\t/* skip protocol (2 Bytes). */\n\tpIpHeader += 2;\n\tdo\n\t{\n\t\tPRT_IPV6_HDR pIpv6Hdr = (PRT_IPV6_HDR)(pIpHeader);\n\t\tUINT32 offset = IPV6_HDR_LEN;\n\n\t\tnextProtocol = pIpv6Hdr->nextHdr;\n\t\twhile(nextProtocol == IPV6_NEXT_HEADER_HOP_BY_HOP)\n\t\t{\n\t\t\tif(IPv6ExtHdrHandle((RT_IPV6_EXT_HDR *)(pIpHeader + offset), &nextProtocol, &offset) == FALSE)\n\t\t\t\tbreak;\n\t\t}\n\t} while(FALSE);\n\n\tfor (idx = 0; idx < IPV6_MULTICAST_FILTER_EXCLUED_SIZE; idx++)\n\t{\n\t\tif (nextProtocol == IPv6MulticastFilterExclued[idx])\n\t\t{\n\t\t\tresult = TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/*  MLD v1 messages have the following format:\n\t0                   1                   2                   3\n\t0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\t|     Type      |     Code      |          Checksum             |\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\t|     Maximum Response Delay    |          Reserved             |\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\t|                                                               |\n\t+                                                               +\n\t|                                                               |\n\t+                       Multicast Address                       +\n\t|                                                               |\n\t+                                                               +\n\t|                                                               |\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \n*/\n\n/*\tVersion 3 Membership Report Message\n\t0                   1                   2                   3       \n\t0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|  Type = 143   |    Reserved   |           Checksum            |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|           Reserved            |  Number of Group Records (M)  |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|                                                               |      \n\t.                                                               .      \n\t.               Multicast Address Record [1]                    . \n\t.                                                               .      \n\t|                                                               |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|                                                               |      \n\t.                                                               .      \n\t.               Multicast Address Record [2]                    . \n\t.                                                               .      \n\t|                                                               |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|                               .                               |      \n\t.                               .                               .      \n\t|                               .                               |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|                                                               |      \n\t.                                                               .      \n\t.               Multicast Address Record [M]                    . \n\t.                                                               .      \n\t|                                                               |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n\n\twhere each Group Record has the following internal format:      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n\t|  Record Type  |  Aux Data Len |     Number of Sources (N)     |      \n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    *                       Multicast Address                       *    \n    |                                                               |    \n    *                                                               *    \n    |                                                               |\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    *                       Source Address [1]                      *    \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    +-                                                             -+    \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    *                       Source Address [2]                      *    \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    +-                                                             -+    \n    .                               .                               .    \n    .                               .                               .    \n    .                               .                               .    \n    +-                                                             -+    \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    *                       Source Address [N]                      *    \n    |                                                               |    \n    *                                                               *    \n    |                                                               |    \n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    \n    |                                                               |    \n    .                                                               .    \n    .                         Auxiliary Data                        .    \n    .                                                               .    \n    |                                                               |    \n    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n*/\n\nVOID MLDSnooping(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pSrcMacAddr,\n\tIN PUCHAR pIpHeader,\n\tIN PNET_DEV pDev)\n{\n\tINT i;\n\tUCHAR GroupType;\n\tUINT16 numOfGroup;\n\tPUCHAR pGroup;\n\tUCHAR AuxDataLen;\n\tUINT16 numOfSources;\n\tPUCHAR pGroupIpAddr;\n\tUCHAR GroupMacAddr[6];\n\tPUCHAR pGroupMacAddr = (PUCHAR)&GroupMacAddr;\n\n\tUINT8 MldType;\n\tPUCHAR pMldHeader;\n\n\tif(isMldPkt(pDstMacAddr, pIpHeader, &MldType, &pMldHeader) == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MLD type=%0x\\n\", MldType));\n\n\t\tswitch(MldType)\n\t\t{\n\t\t\tcase MLD_V1_LISTENER_REPORT:\n\t\t\t\t/* skip Type(1 Byte), code(1 Byte), checksum(2 Bytes), Maximum Rsp Delay(2 Bytes), Reserve(2 Bytes). */\n\t\t\t\tpGroupIpAddr = (PUCHAR)(pMldHeader + 8);\n\t\t\t\tConvertMulticastIP2MAC(pGroupIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IPV6);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Group Id=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\tGroupMacAddr[0], GroupMacAddr[1], GroupMacAddr[2], GroupMacAddr[3], GroupMacAddr[4], GroupMacAddr[5]));\n\t\t\t\tMulticastFilterTableInsertEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev, MCAT_FILTER_DYNAMIC);\n\t\t\t\tbreak;\n\n\t\t\tcase MLD_V1_LISTENER_DONE:\n\t\t\t\t/* skip Type(1 Byte), code(1 Byte), checksum(2 Bytes), Maximum Rsp Delay(2 Bytes), Reserve(2 Bytes). */\n\t\t\t\tpGroupIpAddr = (PUCHAR)(pMldHeader + 8);\n\t\t\t\tConvertMulticastIP2MAC(pGroupIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IPV6);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Group Id=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\tGroupMacAddr[0], GroupMacAddr[1], GroupMacAddr[2], GroupMacAddr[3], GroupMacAddr[4], GroupMacAddr[5]));\n\t\t\t\tMulticastFilterTableDeleteEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev);\n\t\t\t\tbreak;\n\n\t\t\tcase MLD_V2_LISTERNER_REPORT: /* IGMP version 3 membership report. */\n\t\t\t\tnumOfGroup = ntohs(*((UINT16 *)(pMldHeader + 6)));\n\t\t\t\tpGroup = (PUCHAR)(pMldHeader + 8);\n\t\t\t\tfor (i=0; i < numOfGroup; i++)\n\t\t\t\t{\n\t\t\t\t\tGroupType = (UCHAR)(*pGroup);\n\t\t\t\t\tAuxDataLen = (UCHAR)(*(pGroup + 1));\n\t\t\t\t\tnumOfSources = ntohs(*((UINT16 *)(pGroup + 2)));\n\t\t\t\t\tpGroupIpAddr = (PUCHAR)(pGroup + 4);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MLDv2 Type=%d, ADL=%d, numOfSource=%d\\n\", \n\t\t\t\t\t\t\t\t\tGroupType, AuxDataLen, numOfSources));\n\t\t\t\t\tConvertMulticastIP2MAC(pGroupIpAddr, (PUCHAR *)&pGroupMacAddr, ETH_P_IPV6);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MLD Group=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\tGroupMacAddr[0], GroupMacAddr[1], GroupMacAddr[2], \n\t\t\t\t\t\t\tGroupMacAddr[3], GroupMacAddr[4], GroupMacAddr[5]));\n\n\t\t\t\t\tdo\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((GroupType == MODE_IS_EXCLUDE) \n\t\t\t\t\t\t\t|| (GroupType == CHANGE_TO_EXCLUDE_MODE) \n\t\t\t\t\t\t\t|| (GroupType == ALLOW_NEW_SOURCES))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMulticastFilterTableInsertEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev, MCAT_FILTER_DYNAMIC);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ((GroupType == CHANGE_TO_INCLUDE_MODE) \n\t\t\t\t\t\t\t|| (GroupType == MODE_IS_INCLUDE)\n\t\t\t\t\t\t\t|| (GroupType == BLOCK_OLD_SOURCES))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(numOfSources == 0)\n\t\t\t\t\t\t\t\tMulticastFilterTableDeleteEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tMulticastFilterTableInsertEntry(pAd, GroupMacAddr, pSrcMacAddr, pDev, MCAT_FILTER_DYNAMIC);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} while(FALSE);\n\t\t\t\t\t/* skip 4 Bytes (Record Type, Aux Data Len, Number of Sources) + a IPv6 address. */\n\t\t\t\t\tpGroup += (4 + IPV6_ADDR_LEN + (numOfSources * 16) + AuxDataLen);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"unknow MLD Type=%d\\n\", MldType));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn;\n}\n\n\n#endif /* IGMP_SNOOP_SUPPORT */\n"
  },
  {
    "path": "src/common/misc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2009, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tmisc.c\n\n\tAbstract:\n\n\tHandling Misc Problem\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tSean Wang\t2009-08-12\t\tCreate\n\tJohn Li\t\t2009-11-30\t\tModified\n*/\n\n#include \"rt_config.h\"\n#include \"misc.h\"\n\n\n"
  },
  {
    "path": "src/common/mlme.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tmlme.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn Chang\t2004-08-25\t\tModify from RT2500 code base\n\tJohn Chang\t2004-09-06\t\tmodified for RT2600\n*/\n\n#include \"rt_config.h\"\n#include <stdarg.h>\n\n\nUCHAR CISCO_OUI[] = {0x00, 0x40, 0x96};\nUCHAR RALINK_OUI[]  = {0x00, 0x0c, 0x43};\nUCHAR WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};\nUCHAR RSN_OUI[] = {0x00, 0x0f, 0xac};\nUCHAR WAPI_OUI[] = {0x00, 0x14, 0x72};\nUCHAR WME_INFO_ELEM[]  = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};\nUCHAR WME_PARM_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};\nUCHAR BROADCOM_OUI[]  = {0x00, 0x90, 0x4c};\nUCHAR WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04};\n#ifdef CONFIG_STA_SUPPORT\n#ifdef IWSC_SUPPORT\nUCHAR IWSC_OUI[] = {0x00, 0x50, 0xf2, 0x10};\nUCHAR IWSC_ACTION_OUI[] = {0x50, 0x6F, 0x9A, 0x10};\n#endif /* IWSC_SUPPORT */\n#ifdef DOT11_N_SUPPORT\nUCHAR PRE_N_HT_OUI[]\t= {0x00, 0x90, 0x4c};\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\nUCHAR OfdmRateToRxwiMCS[12] = {\n\t0,  0,\t0,  0,\n\t0,  1,\t2,  3,\t/* OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 */\n\t4,  5,\t6,  7,\t/* OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,7 */\n};\n\nUCHAR RxwiMCSToOfdmRate[12] = {\n\tRATE_6,  RATE_9,\tRATE_12,  RATE_18,\n\tRATE_24,  RATE_36,\tRATE_48,  RATE_54,\t/* OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 */\n\t4,  5,\t6,  7,\t/* OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,7 */\n};\n\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\nUINT32 CW_MAX_IN_BITS;\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\n\n\nextern UCHAR\t OfdmRateToRxwiMCS[];\n/* since RT61 has better RX sensibility, we have to limit TX ACK rate not to exceed our normal data TX rate.*/\n/* otherwise the WLAN peer may not be able to receive the ACK thus downgrade its data TX rate*/\nULONG BasicRateMask[12]\t\t\t\t= {0xfffff001 /* 1-Mbps */, 0xfffff003 /* 2 Mbps */, 0xfffff007 /* 5.5 */, 0xfffff00f /* 11 */,\n\t\t\t\t\t\t\t\t\t  0xfffff01f /* 6 */\t , 0xfffff03f /* 9 */\t  , 0xfffff07f /* 12 */ , 0xfffff0ff /* 18 */,\n\t\t\t\t\t\t\t\t\t  0xfffff1ff /* 24 */\t , 0xfffff3ff /* 36 */\t  , 0xfffff7ff /* 48 */ , 0xffffffff /* 54 */};\n\nUCHAR BROADCAST_ADDR[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\nUCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN]  = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\n/* e.g. RssiSafeLevelForTxRate[RATE_36]\" means if the current RSSI is greater than*/\n/*\t\tthis value, then it's quaranteed capable of operating in 36 mbps TX rate in*/\n/*\t\tclean environment.*/\n/*\t\t\t\t\t\t\t\t  TxRate: 1   2   5.5\t11\t 6\t  9    12\t18\t 24   36   48\t54\t 72  100*/\nCHAR RssiSafeLevelForTxRate[] ={  -92, -91, -90, -87, -88, -86, -85, -83, -81, -78, -72, -71, -40, -40 };\n\nUCHAR  RateIdToMbps[]\t = { 1, 2, 5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 72, 100};\nUSHORT RateIdTo500Kbps[] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 144, 200};\n\nUCHAR SsidIe = IE_SSID;\nUCHAR SupRateIe = IE_SUPP_RATES;\nUCHAR ExtRateIe = IE_EXT_SUPP_RATES;\n#ifdef DOT11_N_SUPPORT\nUCHAR HtCapIe = IE_HT_CAP;\nUCHAR AddHtInfoIe = IE_ADD_HT;\nUCHAR NewExtChanIe = IE_SECONDARY_CH_OFFSET;\nUCHAR BssCoexistIe = IE_2040_BSS_COEXIST;\nUCHAR ExtHtCapIe = IE_EXT_CAPABILITY;\n#endif /* DOT11_N_SUPPORT */\nUCHAR ExtCapIe = IE_EXT_CAPABILITY;\nUCHAR ErpIe = IE_ERP;\nUCHAR DsIe = IE_DS_PARM;\nUCHAR TimIe = IE_TIM;\nUCHAR WpaIe = IE_WPA;\nUCHAR Wpa2Ie = IE_WPA2;\nUCHAR IbssIe = IE_IBSS_PARM;\nUCHAR WapiIe = IE_WAPI;\n\nextern UCHAR\tWPA_OUI[];\n\nUCHAR\tSES_OUI[] = {0x00, 0x90, 0x4c};\n\nUCHAR\tZeroSsid[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};\n\n\nUCHAR dot11_max_sup_rate(INT SupRateLen, UCHAR *SupRate, INT ExtRateLen, UCHAR *ExtRate)\n{\n\tINT idx;\n\tUCHAR MaxSupportedRateIn500Kbps = 0;\n\t\n\t/* supported rates array may not be sorted. sort it and find the maximum rate */\n\tfor (idx = 0; idx < SupRateLen; idx++) {\n\t\tif (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f))\n\t\t\tMaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f;\n\t}\n\n\tif (ExtRateLen > 0 && ExtRate != NULL)\n\t{\n\t\tfor (idx = 0; idx < ExtRateLen; idx++) {\n\t\t\tif (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f))\n\t\t\t\tMaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f;\n\t\t}\n\t}\n\n\treturn MaxSupportedRateIn500Kbps;\n}\n\n\nUCHAR dot11_2_ra_rate(UCHAR MaxSupportedRateIn500Kbps)\n{\n\tUCHAR MaxSupportedRate;\n\t\n\tswitch (MaxSupportedRateIn500Kbps)\n\t{\n\t\tcase 108: MaxSupportedRate = RATE_54;   break;\n\t\tcase 96:  MaxSupportedRate = RATE_48;   break;\n\t\tcase 72:  MaxSupportedRate = RATE_36;   break;\n\t\tcase 48:  MaxSupportedRate = RATE_24;   break;\n\t\tcase 36:  MaxSupportedRate = RATE_18;   break;\n\t\tcase 24:  MaxSupportedRate = RATE_12;   break;\n\t\tcase 18:  MaxSupportedRate = RATE_9;    break;\n\t\tcase 12:  MaxSupportedRate = RATE_6;    break;\n\t\tcase 22:  MaxSupportedRate = RATE_11;   break;\n\t\tcase 11:  MaxSupportedRate = RATE_5_5;  break;\n\t\tcase 4:   MaxSupportedRate = RATE_2;    break;\n\t\tcase 2:   MaxSupportedRate = RATE_1;    break;\n\t\tdefault:  MaxSupportedRate = RATE_11;   break;\n\t}\n\n\treturn MaxSupportedRate;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tinitialize the MLME task and its data structure (queue, spinlock, \n\t\ttimer, state machines).\n\n\tIRQL = PASSIVE_LEVEL\n\n\tReturn:\n\t\talways return NDIS_STATUS_SUCCESS\n\n\t==========================================================================\n*/\nNDIS_STATUS MlmeInit(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tNDIS_STATUS Status = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> MLME Initialize\\n\"));\n\n\tdo \n\t{\n\t\tStatus = MlmeQueueInit(pAd, &pAd->Mlme.Queue);\n\t\tif(Status != NDIS_STATUS_SUCCESS) \n\t\t\tbreak;\n\n\t\tpAd->Mlme.bRunning = FALSE;\n\t\tNdisAllocateSpinLock(pAd, &pAd->Mlme.TaskLock);\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tBssTableInit(&pAd->ScanTab);\n\n\t\t\t/* init STA state machines*/\n\t\t\tAssocStateMachineInit(pAd, &pAd->Mlme.AssocMachine, pAd->Mlme.AssocFunc);\n\t\t\tAuthStateMachineInit(pAd, &pAd->Mlme.AuthMachine, pAd->Mlme.AuthFunc);\n\t\t\tAuthRspStateMachineInit(pAd, &pAd->Mlme.AuthRspMachine, pAd->Mlme.AuthRspFunc);\n\t\t\tSyncStateMachineInit(pAd, &pAd->Mlme.SyncMachine, pAd->Mlme.SyncFunc);\n\n#ifdef QOS_DLS_SUPPORT\n\t\t\tDlsStateMachineInit(pAd, &pAd->Mlme.DlsMachine, pAd->Mlme.DlsFunc);\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tTDLS_StateMachineInit(pAd, &pAd->Mlme.TdlsMachine, pAd->Mlme.TdlsFunc);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n#ifdef IWSC_SUPPORT\n\t\t\tIWSC_StateMachineInit(pAd, &pAd->Mlme.IWscMachine, pAd->Mlme.IWscFunc);\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\n\n\n\t\t\t/* Since we are using switch/case to implement it, the init is different from the above */\n\t\t\t/* state machine init*/\n\t\t\tMlmeCntlInit(pAd, &pAd->Mlme.CntlMachine, NULL);\n\n#ifdef PCIE_PS_SUPPORT\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))\n\t\t\t{\n\t\t\t    /* only PCIe cards need these two timers*/\n\t\t\t\tRTMPInitTimer(pAd, &pAd->Mlme.PsPollTimer, GET_TIMER_FUNCTION(PsPollWakeExec), pAd, FALSE);\n\t\t\t\tRTMPInitTimer(pAd, &pAd->Mlme.RadioOnOffTimer, GET_TIMER_FUNCTION(RadioOnExec), pAd, FALSE);\n\t\t\t}\n#endif /* PCIE_PS_SUPPORT */\n\n\t\t\tRTMPInitTimer(pAd, &pAd->Mlme.LinkDownTimer, GET_TIMER_FUNCTION(LinkDownExec), pAd, FALSE);\n\t\t\tRTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);\n\t\t\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;\n\t\t\tRTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);\n\n#ifdef RTMP_MAC_USB\n\t\t\tRTMPInitTimer(pAd, &pAd->Mlme.AutoWakeupTimer, GET_TIMER_FUNCTION(RtmpUsbStaAsicForceWakeupTimeout), pAd, FALSE);\n\t\t\tpAd->Mlme.AutoWakeupTimerRunning = FALSE;\n#endif /* RTMP_MAC_USB */\n\n\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* init AP state machines*/\n\t\t\tAPAssocStateMachineInit(pAd, &pAd->Mlme.ApAssocMachine, pAd->Mlme.ApAssocFunc);\n\t\t\tAPAuthStateMachineInit(pAd, &pAd->Mlme.ApAuthMachine, pAd->Mlme.ApAuthFunc);\n\t\t\tAPSyncStateMachineInit(pAd, &pAd->Mlme.ApSyncMachine, pAd->Mlme.ApSyncFunc);\n\n#ifdef APCLI_SUPPORT\n\t\t\t/* init apcli state machines*/\n\t\t\tASSERT(APCLI_AUTH_FUNC_SIZE == APCLI_MAX_AUTH_MSG * APCLI_MAX_AUTH_STATE);\n\t\t\tApCliAuthStateMachineInit(pAd, &pAd->Mlme.ApCliAuthMachine, pAd->Mlme.ApCliAuthFunc);\n\n\t\t\tASSERT(APCLI_ASSOC_FUNC_SIZE == APCLI_MAX_ASSOC_MSG * APCLI_MAX_ASSOC_STATE);\n\t\t\tApCliAssocStateMachineInit(pAd, &pAd->Mlme.ApCliAssocMachine, pAd->Mlme.ApCliAssocFunc);\n\n\t\t\tASSERT(APCLI_SYNC_FUNC_SIZE == APCLI_MAX_SYNC_MSG * APCLI_MAX_SYNC_STATE);\n\t\t\tApCliSyncStateMachineInit(pAd, &pAd->Mlme.ApCliSyncMachine, pAd->Mlme.ApCliSyncFunc);\n\n\t\t\tASSERT(APCLI_CTRL_FUNC_SIZE == APCLI_MAX_CTRL_MSG * APCLI_MAX_CTRL_STATE);\n\t\t\tApCliCtrlStateMachineInit(pAd, &pAd->Mlme.ApCliCtrlMachine, pAd->Mlme.ApCliCtrlFunc);\n\n#endif /* APCLI_SUPPORT */\n\t\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef WSC_INCLUDED\n\t\t/* Init Wsc state machine */\n\t\tASSERT(WSC_FUNC_SIZE == MAX_WSC_MSG * MAX_WSC_STATE);\n\t\tWscStateMachineInit(pAd, &pAd->Mlme.WscMachine, pAd->Mlme.WscFunc);\n#endif /* WSC_INCLUDED */\n\n\t\tWpaStateMachineInit(pAd, &pAd->Mlme.WpaMachine, pAd->Mlme.WpaFunc);\n\n\n\t\tActionStateMachineInit(pAd, &pAd->Mlme.ActMachine, pAd->Mlme.ActFunc);\n\n\t\t/* Init mlme periodic timer*/\n\t\tRTMPInitTimer(pAd, &pAd->Mlme.PeriodicTimer, GET_TIMER_FUNCTION(MlmePeriodicExec), pAd, TRUE);\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tpAd->Mlme.StaStayTick = 0;\n\t\tpAd->Mlme.P2pStayTick = 0;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\t/* Set mlme periodic timer*/\n\t\tRTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV);\n\n\t\t/* software-based RX Antenna diversity*/\n\t\tRTMPInitTimer(pAd, &pAd->Mlme.RxAntEvalTimer, GET_TIMER_FUNCTION(AsicRxAntEvalTimeout), pAd, FALSE);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\t/* Init APSD periodic timer*/\n\t\t\tRTMPInitTimer(pAd, &pAd->Mlme.APSDPeriodicTimer, GET_TIMER_FUNCTION(APSDPeriodicExec), pAd, TRUE);\n\t\t\tRTMPSetTimer(&pAd->Mlme.APSDPeriodicTimer, 50);\n\n\t\t\t/* Init APQuickResponseForRateUp timer.*/\n\t\t\tRTMPInitTimer(pAd, &pAd->ApCfg.ApQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(APQuickResponeForRateUpExec), pAd, FALSE);\n\t\t\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = FALSE;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t\t\t/* P2P Ctrl State Machine */\n\t\t\tASSERT(P2P_CTRL_FUNC_SIZE == P2P_CTRL_MAX_EVENTS * P2P_CTRL_MAX_STATES);\n\t\t\tP2PCtrlStateMachineInit(pAd, &pAd->P2pCfg.P2PCtrlMachine, pAd->P2pCfg.P2PCtrlFunc);\n\t\n\t\t\t/* P2P Discovery State Machine */\n\t\t\tASSERT(P2P_DISC_FUNC_SIZE == P2P_DISC_MAX_EVENTS * P2P_DISC_MAX_STATES);\n\t\t\tP2PDiscoveryStateMachineInit(pAd, &pAd->P2pCfg.P2PDiscMachine, pAd->P2pCfg.P2PDiscFunc);\n\t\n\t\t\t/* P2P Group Formation State Machine */\n\t\t\tASSERT(P2P_GO_FORM_FUNC_SIZE == P2P_GO_NEGO_MAX_EVENTS * P2P_GO_FORM_MAX_STATES);\n\t\t\tP2PGoFormationStateMachineInit(pAd, &pAd->P2pCfg.P2PGoFormMachine, pAd->P2pCfg.P2PGoFormFunc);\n\t\n\t\t\t/* P2P Action Frame State Machine */\n\t\t\tASSERT(P2P_ACTION_FUNC_SIZE == MAX_P2P_MSG * MAX_P2P_STATE);\n\t\t\tP2PStateMachineInit(pAd, &pAd->P2pCfg.P2PActionMachine, pAd->P2pCfg.P2PActionFunc);\n\t\n\t\t\t/* P2P CTWindows timer */\n\t\t\tRTMPInitTimer(pAd, &pAd->P2pCfg.P2pCTWindowTimer, GET_TIMER_FUNCTION(P2PCTWindowTimer), pAd, FALSE);\n\t\t\t/* P2P SwNOA timer */\n\t\t\tRTMPInitTimer(pAd, &pAd->P2pCfg.P2pSwNoATimer, GET_TIMER_FUNCTION(P2pSwNoATimeOut), pAd, FALSE);\n\t\t\t/* P2P Presence Absent timer */\n\t\t\tRTMPInitTimer(pAd, &pAd->P2pCfg.P2pPreAbsenTimer, GET_TIMER_FUNCTION(P2pPreAbsenTimeOut), pAd, FALSE);\n\t\t\t/* P2P WSC Timer */\n\t\t\tRTMPInitTimer(pAd, &pAd->P2pCfg.P2pWscTimer, GET_TIMER_FUNCTION(P2pWscTimeOut), pAd, FALSE);\n\t\t\t/* P2P Re-Transmit Action Frame Timer */\n\t\t\tRTMPInitTimer(pAd, &pAd->P2pCfg.P2pReSendTimer, GET_TIMER_FUNCTION(P2pReSendTimeOut), pAd, FALSE);\n\t\t\t/* P2P CLIENT Re-Connect Timer */\n\t\t\tRTMPInitTimer(pAd, &pAd->P2pCfg.P2pCliReConnectTimer, GET_TIMER_FUNCTION(P2pCliReConnectTimeOut), pAd, FALSE);\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\t/* init AP state machines */\n\t\t\t\tAPAssocStateMachineInit(pAd, &pAd->Mlme.ApAssocMachine, pAd->Mlme.ApAssocFunc);\n\t\t\t\tAPAuthStateMachineInit(pAd, &pAd->Mlme.ApAuthMachine, pAd->Mlme.ApAuthFunc);\n\t\t\t\tAPSyncStateMachineInit(pAd, &pAd->Mlme.ApSyncMachine, pAd->Mlme.ApSyncFunc);\n#ifdef APCLI_SUPPORT\n\t\t\t\t/* init apcli state machines */\n\t\t\t\tASSERT(APCLI_AUTH_FUNC_SIZE == APCLI_MAX_AUTH_MSG * APCLI_MAX_AUTH_STATE);\n\t\t\t\tApCliAuthStateMachineInit(pAd, &pAd->Mlme.ApCliAuthMachine, pAd->Mlme.ApCliAuthFunc);\n\t\n\t\t\t\tASSERT(APCLI_ASSOC_FUNC_SIZE == APCLI_MAX_ASSOC_MSG * APCLI_MAX_ASSOC_STATE);\n\t\t\t\tApCliAssocStateMachineInit(pAd, &pAd->Mlme.ApCliAssocMachine, pAd->Mlme.ApCliAssocFunc);\n\t\n\t\t\t\tASSERT(APCLI_SYNC_FUNC_SIZE == APCLI_MAX_SYNC_MSG * APCLI_MAX_SYNC_STATE);\n\t\t\t\tApCliSyncStateMachineInit(pAd, &pAd->Mlme.ApCliSyncMachine, pAd->Mlme.ApCliSyncFunc);\n\t\n\t\t\t\tASSERT(APCLI_CTRL_FUNC_SIZE == APCLI_MAX_CTRL_MSG * APCLI_MAX_CTRL_STATE);\n\t\t\t\tApCliCtrlStateMachineInit(pAd, &pAd->Mlme.ApCliCtrlMachine, pAd->Mlme.ApCliCtrlFunc);\n\t\n#endif /* APCLI_SUPPORT */\n\t\n\t\t\t\t/* Init APSD periodic timer */\n\t\t\t\tRTMPInitTimer(pAd, &pAd->Mlme.APSDPeriodicTimer, GET_TIMER_FUNCTION(APSDPeriodicExec), pAd, TRUE);\n\t\t\t\tRTMPSetTimer(&pAd->Mlme.APSDPeriodicTimer, 50);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t} while (FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- MLME Initialize\\n\"));\n\n\treturn Status;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tmain loop of the MLME\n\tPre:\n\t\tMlme has to be initialized, and there are something inside the queue\n\tNote:\n\t\tThis function is invoked from MPSetInformation and MPReceive;\n\t\tThis task guarantee only one MlmeHandler will run. \n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID MlmeHandler(RTMP_ADAPTER *pAd) \n{\n\tMLME_QUEUE_ELEM *Elem = NULL;\n#ifdef APCLI_SUPPORT\n\tSHORT apcliIfIndex;\n#endif /* APCLI_SUPPORT */\n\n\t/* Only accept MLME and Frame from peer side, no other (control/data) frame should*/\n\t/* get into this state machine*/\n\n\tNdisAcquireSpinLock(&pAd->Mlme.TaskLock);\n\tif(pAd->Mlme.bRunning) \n\t{\n\t\tNdisReleaseSpinLock(&pAd->Mlme.TaskLock);\n\t\treturn;\n\t} \n\telse \n\t{\n\t\tpAd->Mlme.bRunning = TRUE;\n\t}\n\tNdisReleaseSpinLock(&pAd->Mlme.TaskLock);\n\n\twhile (!MlmeQueueEmpty(&pAd->Mlme.Queue)) \n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MLME_RESET_IN_PROGRESS) ||\n\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) ||\n\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) ||\n\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SUSPEND))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Device Halted or Removed or MlmeRest, exit MlmeHandler! (queue num = %ld)\\n\", pAd->Mlme.Queue.Num));\n\t\t\tbreak;\n\t\t}\n\t\t\n#ifdef RALINK_ATE\t\t\t\n\t\tif(ATE_ON(pAd))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The driver is in ATE mode now in MlmeHandler\\n\"));\n\t\t\tbreak;\n\t\t}\t\n#endif /* RALINK_ATE */\n\n\t\t/*From message type, determine which state machine I should drive*/\n\t\tif (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) \n\t\t{\n#ifdef RTMP_MAC_USB\n\t\t\tif (Elem->MsgType == MT2_RESET_CONF)\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"!!! reset MLME state machine !!!\\n\"));\n\t\t\t\tMlmeRestartStateMachine(pAd);\n\t\t\t\tElem->Occupied = FALSE;\n\t\t\t\tElem->MsgLen = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* RTMP_MAC_USB */\n\n\t\t\t/* if dequeue success*/\n\t\t\tswitch (Elem->Machine) \n\t\t\t{\n\t\t\t\t/* STA state machines*/\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tcase ASSOC_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.AssocMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.AssocMachine.CurrState);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AUTH_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.AuthMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.AuthMachine.CurrState);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AUTH_RSP_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.AuthRspMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.AuthRspMachine.CurrState);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SYNC_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.SyncMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.SyncMachine.CurrState);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MLME_CNTL_STATE_MACHINE:\n\t\t\t\t\tMlmeCntlMachinePerformAction(pAd, &pAd->Mlme.CntlMachine, Elem);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WPA_PSK_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WpaPskMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.WpaPskMachine.CurrState);\n\t\t\t\t\tbreak;\t\n\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\tcase DLS_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.DlsMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.DlsMachine.CurrState);\n\t\t\t\t\tbreak;\n#endif /* QOS_DLS_SUPPORT */\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\tcase TDLS_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.TdlsMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.TdlsMachine.CurrState);\n\t\t\t\t\tbreak;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\t\t\n\n\t\t\t\tcase ACTION_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ActMachine,\n\t\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.ActMachine.CurrState);\n\t\t\t\t\tbreak;\t\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t/* AP state amchines*/\n\n\t\t\t\tcase AP_ASSOC_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApAssocMachine,\n\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.ApAssocMachine.CurrState);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AP_AUTH_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApAuthMachine, \n\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.ApAuthMachine.CurrState);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AP_SYNC_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApSyncMachine,\n\t\t\t\t\t\t\t\t\tElem, pAd->Mlme.ApSyncMachine.CurrState);\n\t\t\t\t\tbreak;\n\n#ifdef APCLI_SUPPORT\n\t\t\t\tcase APCLI_AUTH_STATE_MACHINE:\n\t\t\t\t\tapcliIfIndex = Elem->Priv;\n\t\t\t\t\tif(isValidApCliIf(apcliIfIndex))\n\t\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApCliAuthMachine, Elem,\n\t\t\t\t\t\t\t(pAd->ApCfg.ApCliTab[apcliIfIndex].AuthCurrState));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase APCLI_ASSOC_STATE_MACHINE:\n\t\t\t\t\tapcliIfIndex = Elem->Priv;\n\t\t\t\t\tif(isValidApCliIf(apcliIfIndex))\t\t\n\t\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApCliAssocMachine, Elem,\n\t\t\t\t\t\t\t(pAd->ApCfg.ApCliTab[apcliIfIndex].AssocCurrState));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase APCLI_SYNC_STATE_MACHINE:\n\t\t\t\t\tapcliIfIndex = Elem->Priv;\n\t\t\t\t\tif(isValidApCliIf(apcliIfIndex))\n\t\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApCliSyncMachine, Elem,\n\t\t\t\t\t\t\t(pAd->ApCfg.ApCliTab[apcliIfIndex].SyncCurrState));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase APCLI_CTRL_STATE_MACHINE:\n\t\t\t\t\tapcliIfIndex = Elem->Priv;\n\t\t\t\t\tif(isValidApCliIf(apcliIfIndex))\n\t\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.ApCliCtrlMachine, Elem,\n\t\t\t\t\t\t\t(pAd->ApCfg.ApCliTab[apcliIfIndex].CtrlCurrState));\n\t\t\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tcase WPA_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WpaMachine, Elem, pAd->Mlme.WpaMachine.CurrState);\n\t\t\t\t\tbreak;\n#ifdef WSC_INCLUDED\n                case WSC_STATE_MACHINE:\n\t\t\t\t\tif (pAd->pWscElme)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->WscElmeLock);\n\t\t\t\t\t\tNdisMoveMemory(pAd->pWscElme, Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->WscElmeLock);\n/*#ifdef KTHREAD_SUPPORT*/\n/*\t\t\t\t\t\tWAKE_UP(&(pAd->wscTask));*/\n/*#else*/\n/*\t\t\t\t\t\tRTMP_SEM_EVENT_UP(&(pAd->wscTask.taskSema));*/\n/*#endif*/\n\t\t\t\t\t\tRtmpOsTaskWakeUp(&(pAd->wscTask));\n\t\t\t\t\t}\n                    break;\n#ifdef IWSC_SUPPORT\n\t\t\t\tcase IWSC_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.IWscMachine, Elem, pAd->Mlme.IWscMachine.CurrState);\n                    break;\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n\n#ifdef P2P_SUPPORT\n\t\t\t\tcase P2P_CTRL_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->P2pCfg.P2PCtrlMachine, Elem,\n\t\t\t\t\t\t\tpAd->P2pCfg.CtrlCurrentState);\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_DISC_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->P2pCfg.P2PDiscMachine, Elem,\n\t\t\t\t\t\t\tpAd->P2pCfg.DiscCurrentState);\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_GO_FORM_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->P2pCfg.P2PGoFormMachine, Elem,\n\t\t\t\t\t\t\tpAd->P2pCfg.GoFormCurrentState);\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_ACTION_STATE_MACHINE:\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->P2pCfg.P2PActionMachine, Elem,\n\t\t\t\t\t\t\tpAd->P2pCfg.ActionState);\n\t\t\t\t\tbreak;\n#endif /* P2P_SUPPORT */\n\t\t\t\tdefault:\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ERROR: Illegal machine %ld in MlmeHandler()\\n\", Elem->Machine));\n\t\t\t\t\tbreak;\n\t\t\t} /* end of switch*/\n\n\t\t\t/* free MLME element*/\n\t\t\tElem->Occupied = FALSE;\n\t\t\tElem->MsgLen = 0;\n\n\t\t}\n\t\telse {\n\t\t\tDBGPRINT_ERR((\"MlmeHandler: MlmeQueue empty\\n\"));\n\t\t}\n\t}\n\n\tNdisAcquireSpinLock(&pAd->Mlme.TaskLock);\n\tpAd->Mlme.bRunning = FALSE;\n\tNdisReleaseSpinLock(&pAd->Mlme.TaskLock);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tDestructor of MLME (Destroy queue, state machine, spin lock and timer)\n\tParameters:\n\t\tAdapter - NIC Adapter pointer\n\tPost:\n\t\tThe MLME task will no longer work properly\n\n\tIRQL = PASSIVE_LEVEL\n\n\t==========================================================================\n */\nVOID MlmeHalt(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBOOLEAN \t  Cancelled;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> MlmeHalt\\n\"));\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\t/* disable BEACON generation and other BEACON related hardware timers*/\n\t\tAsicDisableSync(pAd);\n\t}\n\n\tRTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef QOS_DLS_SUPPORT\n\t\tUCHAR\t\ti;\n#endif /* QOS_DLS_SUPPORT */\n\t\t/* Cancel pending timers*/\n\t\tRTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\n\n#ifdef PCIE_PS_SUPPORT\n\t    if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)\n\t\t\t&&(pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))\n\t    {\n\t   \t    RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);\n\t\t    RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled);\n\t\t}\n#endif /* PCIE_PS_SUPPORT */\n\n#ifdef QOS_DLS_SUPPORT\n\t\tfor (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &Cancelled);\n\t\t}\n#endif /* QOS_DLS_SUPPORT */\n\t\tRTMPCancelTimer(&pAd->Mlme.LinkDownTimer, &Cancelled);\n\n#ifdef RTMP_MAC_USB\n\t\tif (pAd->Mlme.AutoWakeupTimerRunning)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Cancelled);\n\t\t\tpAd->Mlme.AutoWakeupTimerRunning = FALSE;\n\t\t}\n#endif /* RTMP_MAC_USB */\n\n#ifdef WSC_STA_SUPPORT\n\t\tif (pAd->StaCfg.WscControl.WscProfileRetryTimerRunning)\n\t\t{\n\t\t\tpAd->StaCfg.WscControl.WscProfileRetryTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.WscControl.WscProfileRetryTimer, &Cancelled);\n\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n\n\t\tif (pAd->StaCfg.StaQuickResponeForRateUpTimerRunning)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, &Cancelled);\n\t\t\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;\n\t\t}\n\t\tRTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, &Cancelled);\n#ifdef IWSC_SUPPORT\n\t\tRTMPCancelTimer(&pAd->StaCfg.IWscInfo.IWscT1Timer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->StaCfg.IWscInfo.IWscT2Timer, &Cancelled);\n#endif /* IWSC_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMPCancelTimer(&pAd->Mlme.RxAntEvalTimer, &Cancelled);\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tRTMPCancelTimer(&pAd->Mlme.APSDPeriodicTimer, &Cancelled);\n\n\t\tif (pAd->ApCfg.ApQuickResponeForRateUpTimerRunning == TRUE)\n\t\t\tRTMPCancelTimer(&pAd->ApCfg.ApQuickResponeForRateUpTimer, &Cancelled);\n\n#ifdef APCLI_SUPPORT\n\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ProbeTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, &Cancelled);\n\n#ifdef WSC_AP_SUPPORT\n\t\tif (pAd->ApCfg.ApCliTab[BSS0].WscControl.WscProfileRetryTimerRunning)\n\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[BSS0].WscControl.WscProfileRetryTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->ApCfg.ApCliTab[BSS0].WscControl.WscProfileRetryTimer, &Cancelled);\n\t\t}\n#endif /* WSC_AP_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.APScanTimer, &Cancelled);\n\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef P2P_SUPPORT\n\t\t/* P2P CTWindows timer */\n\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pCTWindowTimer, &Cancelled);\n\t\t/* P2P SwNOA timer */\n\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pSwNoATimer, &Cancelled);\n\t\t/* P2P Presence Absent timer */\n\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pPreAbsenTimer, &Cancelled);\n\n\t\tif (pAd->P2pCfg.bP2pCliReConnectTimerRunning)\n\t\t{\n\t\t\tpAd->P2pCfg.bP2pCliReConnectTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->P2pCfg.P2pCliReConnectTimer, &Cancelled);\n\t\t}\n\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->Mlme.APSDPeriodicTimer,\t&Cancelled);\n\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ProbeTimer, &Cancelled);\n\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled);\n\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, &Cancelled);\n\t\n#ifdef WSC_AP_SUPPORT\n\t\t\tif (pAd->ApCfg.ApCliTab[BSS0].WscControl.WscProfileRetryTimerRunning)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.ApCliTab[BSS0].WscControl.WscProfileRetryTimerRunning = FALSE;\n\t\t\t\tRTMPCancelTimer(&pAd->ApCfg.ApCliTab[BSS0].WscControl.WscProfileRetryTimer, &Cancelled);\n\t\t\t}\n#endif /* WSC_AP_SUPPORT */\n\t\t\tRTMPCancelTimer(&pAd->MlmeAux.APScanTimer,\t&Cancelled);\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\t\t\n#ifdef LED_CONTROL_SUPPORT\t\t\n\t\t/* Set LED*/\n\t\tRTMPSetLED(pAd, LED_HALT);\n\t\tRTMPSetSignalLED(pAd, -100);\t/* Force signal strength Led to be turned off, firmware is not done it.*/\n#ifdef RTMP_MAC_USB\n\t\t{\n\t\t\tLED_CFG_STRUC LedCfg;\n\t\t\tRTMP_IO_READ32(pAd, LED_CFG, &LedCfg.word);\n\t\t\tLedCfg.field.LedPolar = 0;\n\t\t\tLedCfg.field.RLedMode = 0;\n\t\t\tLedCfg.field.GLedMode = 0;\n\t\t\tLedCfg.field.YLedMode = 0;\n\t\t\tRTMP_IO_WRITE32(pAd, LED_CFG, LedCfg.word);\n\t\t}\n#endif /* RTMP_MAC_USB */\n#endif /* LED_CONTROL_SUPPORT */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\t\tif (pAd->WOW_Cfg.bEnable == FALSE)\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\t\t\tif (pChipOps->AsicHaltAction)\n\t\t\t\tpChipOps->AsicHaltAction(pAd);\n\t}\n\n\tRTMPusecDelay(5000);    /*  5 msec to gurantee Ant Diversity timer canceled*/\n\n\tMlmeQueueDestroy(&pAd->Mlme.Queue);\n\tNdisFreeSpinLock(&pAd->Mlme.TaskLock);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== MlmeHalt\\n\"));\n}\n\nVOID MlmeResetRalinkCounters(\n\tIN  PRTMP_ADAPTER   pAd)\n{\n\tpAd->RalinkCounters.LastOneSecRxOkDataCnt = pAd->RalinkCounters.OneSecRxOkDataCnt;\n\n#ifdef RALINK_ATE\n\tif (!ATE_ON(pAd))\n#endif /* RALINK_ATE */\n\t\t/* for performace enchanement */\n\t\tNdisZeroMemory(&pAd->RalinkCounters,\n\t\t\t\t\t\t(UINT32)&pAd->RalinkCounters.OneSecEnd -\n\t\t\t\t\t\t(UINT32)&pAd->RalinkCounters.OneSecStart);\n\n\treturn;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is executed periodically to -\n\t\t1. Decide if it's a right time to turn on PwrMgmt bit of all \n\t\t   outgoiing frames\n\t\t2. Calculate ChannelQuality based on statistics of the last\n\t\t   period, so that TX rate won't toggling very frequently between a \n\t\t   successful TX and a failed TX.\n\t\t3. If the calculated ChannelQuality indicated current connection not \n\t\t   healthy, then a ROAMing attempt is tried here.\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\n#define ADHOC_BEACON_LOST_TIME\t\t(8*OS_HZ)  /* 8 sec*/\nVOID MlmePeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tULONG\t\t\tTxTotalCnt;\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t/* update False CCA count to an array */\n\tNICUpdateRxStatusCnt1(pAd, pAd->Mlme.PeriodicRound%10);\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t/* No More 0x84 MCU CMD from v.30 FW*/\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t//printk(\"MO_Cfg.bEnable=%d \\n\", pAd->CommonCfg.MO_Cfg.bEnable);\n\tif (pAd->CommonCfg.MO_Cfg.bEnable)\n\t{\n\t\tUINT8 stage = pAd->Mlme.PeriodicRound%10;\n\n\t\tif (stage == MO_MEAS_PERIOD)\n\t\t{\n\t\t\tASIC_MEASURE_FALSE_CCA(pAd);\n\t\t\tpAd->CommonCfg.MO_Cfg.nPeriod_Cnt = 0;\n\t\t}\n\t\telse if (stage == MO_IDLE_PERIOD)\n\t\t{\n\t\t\tUINT16 Idx;\n\n\t\t\tfor (Idx = MO_MEAS_PERIOD + 1; Idx < MO_IDLE_PERIOD + 1; Idx++)\n\t\t\t\tpAd->CommonCfg.MO_Cfg.nFalseCCACnt += pAd->RalinkCounters.FalseCCACnt_100MS[Idx];\n\n\t\t\t//printk(\"%s: fales cca1 %d\\n\", __FUNCTION__, pAd->CommonCfg.MO_Cfg.nFalseCCACnt);\n\t\t\tif (pAd->CommonCfg.MO_Cfg.nFalseCCACnt > pAd->CommonCfg.MO_Cfg.nFalseCCATh)\n\t\t\t\tASIC_MITIGATE_MICROWAVE(pAd);\n\n\t\t}\n\t}\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n#ifdef INF_AMAZON_SE\n#ifdef RTMP_MAC_USB\n\tSoftwareFlowControl(pAd);\n#endif /* RTMP_MAC_USB */\n#endif /* INF_AMAZON_SE */\n\n#ifdef CONFIG_STA_SUPPORT\n\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tRTMP_MLME_PRE_SANITY_CHECK(pAd);\n\t}\n\n#ifdef RTMP_MAC_USB\n\t/* Only when count down to zero, can we go to sleep mode.*/\n\t/* Count down counter is set after link up. So within 10 seconds after link up, we never go to sleep.*/\n\t/* 10 seconds period, we can get IP, finish 802.1x authenticaion. and some critical , timing protocol.*/\n\tif (pAd->CountDowntoPsm > 0)\n\t{\n\t\tpAd->CountDowntoPsm--;\n\t}\n#endif /* RTMP_MAC_USB */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Do nothing if the driver is starting halt state.*/\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt*/\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RADIO_MEASUREMENT |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST))))\n\t\treturn;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Do nothing if monitor mode is on*/\n\t\tif (MONITOR_ON(pAd))\n\t\t\treturn;\n\n\t\tif ((pAd->Mlme.PeriodicRound & 0x1) &&\n\t\t\t(STA_TGN_WIFI_ON(pAd)) &&\n\t\t\t((pAd->MACVersion & 0xffff) == 0x0101))\n\t\t{\n\t\t\tUINT32 txop_cfg;\n\n\t\t\t/* This is the fix for wifi 11n extension channel overlapping test case.  for 2860D*/\n\t\t\tif (pAd->CommonCfg.IOTestParm.bToggle == FALSE)\n\t\t\t{\n\t\t\t\ttxop_cfg = 0x24BF;\n\t\t\t\tpAd->CommonCfg.IOTestParm.bToggle = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttxop_cfg = 0x243f;\n\t\t\t\tpAd->CommonCfg.IOTestParm.bToggle = FALSE;\n\t\t\t}\n\t\t\tRTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, txop_cfg);\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpAd->bUpdateBcnCntDone = FALSE;\n\t\n/*\tRECBATimerTimeout(SystemSpecific1,FunctionContext,SystemSpecific2,SystemSpecific3);*/\n\tpAd->Mlme.PeriodicRound ++;\n\tpAd->Mlme.GPIORound++;\n\n#ifdef RTMP_MAC_USB\n\t/* execute every 100ms, update the Tx FIFO Cnt for update Tx Rate.*/\n\tNICUpdateFifoStaCounters(pAd);\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n\tif (pAd->CommonCfg.CarrierDetect.Enable)\n\t\tCarrierDetectionPeriodicStateCtrl(pAd);\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t/*\n\t\tUse StayTicks to call MlmeDynamicTxRateSwitching\n\t*/\n\tif ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)\n#ifdef P2P_SUPPORT\n\t\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t&& (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)))\n\t{\n\t\n\t\tif (INFRA_ON(pAd) \n\t\t\t&& ((pAd->MultiChannelFlowCtl & EDCA_AC0_DEQUEUE_DISABLE) == 0))\n\t\t{\n\t\t\tpAd->Mlme.StaStayTick++;\t\t\t\n\t\t}\n\n\t\tif (P2P_CLI_ON(pAd)\n\t\t\t&& ((pAd->MultiChannelFlowCtl & HCCA_DEQUEUE_DISABLE) == 0))\n\t\t{\n\t\t\tpAd->Mlme.P2pStayTick++;\t\t\t\n\t\t}\n\n\t\tif ((pAd->P2pCfg.bStartP2pConnect == FALSE)\n#ifdef CONFIG_MULTI_CHANNEL\n && (pAd->Multi_Channel_Enable == TRUE)\n#endif /* CONFIG_MULTI_CHANNEL */\n)\n\t\t\tMlmeDynamicTxRateSwitching(pAd);\n\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\t/* by default, execute every 500ms */\n\tif ((pAd->ra_interval) && \n\t\t((pAd->Mlme.PeriodicRound % (pAd->ra_interval / 100)) == 0) && \n\t\tRTMPAutoRateSwitchCheck(pAd)/*(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED))*/\n\t)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tAPMlmeDynamicTxRateSwitching(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t/* perform dynamic tx rate switching based on past TX history*/\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif (pAd->Multi_Channel_Enable == FALSE) \n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t{\n\t\t\tif ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)\n#ifdef P2P_SUPPORT\n\t\t\t\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t&& (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)))\n\t\t\t\tMlmeDynamicTxRateSwitching(pAd);\n\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\n#ifdef DFS_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\n#ifdef RTMP_MAC_USB\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif ((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == TRUE))\n\t\t\tNewUsbTimerCB_Radar(pAd);\n\t\t}\n#endif /* RTMP_MAC_USB */\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DFS_SUPPORT */\n\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n#ifdef CONFIG_STA_SUPPORT\n\tif ((pAd->chipCap.FreqCalibrationSupport) \n#ifdef CONFIG_MULTI_CHANNEL\n&& (pAd->Multi_Channel_Enable == FALSE)\n#endif /* CONFIG_MULTI_CHANNEL */\n)\n\t{\n\t\tif ((pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration == TRUE) && \n\t\t     (INFRA_ON(pAd)))\n\t\t\t{\n\t\t\t\tFrequencyCalibration(pAd);\t\n\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\n\t/* Normal 1 second Mlme PeriodicExec.*/\n\tif (pAd->Mlme.PeriodicRound %MLME_TASK_EXEC_MULTIPLE == 0)\n\t{\n\t\tpAd->Mlme.OneSecPeriodicRound ++;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tdynamic_tune_be_tx_op(pAd, 50);\t/* change form 100 to 50 for WMM WiFi test @20070504*/\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\t\t/*ORIBATimerTimeout(pAd);*/\n\t\tNdisGetSystemUpTime(&pAd->Mlme.Now32);\n\n\t\t/* add the most up-to-date h/w raw counters into software variable, so that*/\n\t\t/* the dynamic tuning mechanism below are based on most up-to-date information*/\n\t\t/* Hint: throughput impact is very serious in the function */\n\t\tNICUpdateRawCounters(pAd);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n#ifdef RTMP_MAC_USB\n#ifndef INF_AMAZON_SE\n#ifndef CONFIG_MULTI_CHANNEL\n\t\tRTUSBWatchDog(pAd);\n#endif /* !CONFIG_MULTI_CHANNEL */\n#endif /* INF_AMAZON_SE */\n#endif /* RTMP_MAC_USB */\n\n#ifdef DOT11_N_SUPPORT\n   \t\t/* Need statistics after read counter. So put after NICUpdateRawCounters*/\n\t\tORIBATimerTimeout(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\t/*\n\t\tif (pAd->RalinkCounters.MgmtRingFullCount >= 2)\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_HW_ERR);\n\t\telse\n\t\t\tpAd->RalinkCounters.MgmtRingFullCount = 0;\n\t*/\n\n\t\t/* The time period for checking antenna is according to traffic*/\n\t\t{\n\t\t\tif (pAd->Mlme.bEnableAutoAntennaCheck)\n\t\t\t{\n\t\t\t\tTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\t\t\t\t pAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\t\t\t\t pAd->RalinkCounters.OneSecTxFailCount;\n\t\t\t\t\n\t\t\t\t/* dynamic adjust antenna evaluation period according to the traffic*/\n\t\t\t\tif (TxTotalCnt > 50)\n\t\t\t\t{\n\t\t\t\t\tif (pAd->Mlme.OneSecPeriodicRound % 10 == 0)\n\t\t\t\t\t\tAsicEvaluateRxAnt(pAd);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pAd->Mlme.OneSecPeriodicRound % 3 == 0)\n\t\t\t\t\t\tAsicEvaluateRxAnt(pAd);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#ifdef VIDEO_TURBINE_SUPPORT\n\t/*\n\t\tVideoTurbineUpdate(pAd);\n\t\tVideoTurbineDynamicTune(pAd);\n\t*/\n#endif /* VIDEO_TURBINE_SUPPORT */\n\n#ifdef VCORECAL_SUPPORT\n\t\t{\n\t\t\tif ((pAd->Mlme.OneSecPeriodicRound % 10) == 0)\n\t\t\t\tAsicVCORecalibration(pAd);\n\t\t}\n#endif /* VCORECAL_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tAPMlmePeriodicExec(pAd);\n\n\t\t\tif ((pAd->RalinkCounters.OneSecBeaconSentCnt == 0)\n\t\t\t\t&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t\t\t&& (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t\t&& ((pAd->CommonCfg.bIEEE80211H != 1)\n\t\t\t\t\t|| (pAd->Dot11_H.RDMode != RD_SILENCE_MODE))\t\t\t\t\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\t\t\t&& (isCarrierDetectExist(pAd) == FALSE)\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\t\t\t)\n\t\t\t\tpAd->macwd ++;\n\t\t\telse\n\t\t\t\tpAd->macwd = 0;\n\n\t\t\tif (pAd->macwd > 1)\n\t\t\t{\n\t\t\t\tint count = 0;\n\t\t\t\tBOOLEAN MAC_ready = FALSE;\n\t\t\t\tUINT32\tMacCsr12 = 0;\n\t\t\t\n\t\t\t\t/* Disable MAC*/\n\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);\n\t\t\t\t\n\t\t\t\t/* polling MAC status*/\n\t\t\t\twhile (count < 10)\n\t\t\t\t{\n\t\t\t\t\tRTMPusecDelay(1000); /* 1 ms*/\n\t\t\t\t\tRTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);\n\n\t\t\t\t\t/* if MAC is idle*/\n\t\t\t\t\tif ((MacCsr12 & 0x03) == 0)\t\n\t\t\t\t\t{\n\t\t\t\t\t\tMAC_ready = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\tcount ++;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (MAC_ready)\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);\n\t\t\t\t\tRTMPusecDelay(1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"Warning, MAC isn't ready \\n\"));\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xC);\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"MAC specific condition \\n\"));\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t\t\tShow_QoSLoad_Proc(pAd, NULL);\n#endif /* AP_QLOAD_SUPPORT */\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tRtmpPsActiveExtendCheck(pAd);\n#ifdef TDLS_AUTOLINK_SUPPORT\n   \t\t\t /* TDLS discovery link maintenance */\n    \t\t\tif (IS_TDLS_SUPPORT(pAd) && (pAd->StaCfg.TdlsInfo.TdlsAutoLink))\n    \t\t\t{\n\t\t\t\tTDLS_MaintainDiscoveryEntryList(pAd);\n    \t\t\t}\n#endif /* TDLS_AUTOLINK_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\tSTAMlmePeriodicExec(pAd);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n\t\tMlmeResetRalinkCounters(pAd);\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef RTMP_MAC_USB\n\t\t\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) &&\n\t\t\t\t!RTMP_TEST_FLAG(pAd, fRTMP_PS_MCU_SLEEP))\n#endif /* RTMP_MAC_USB */\n\t\t\t{\n\n\n\t\t\tUINT32\tMacReg = 0;\n\t\t\t\n\t\t\tRTMP_IO_READ32(pAd, 0x10F4, &MacReg);\n\t\t\tif (((MacReg & 0x20000000) && (MacReg & 0x80)) || ((MacReg & 0x20000000) && (MacReg & 0x20)))\n\t\t\t{\n\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);\n\t\t\t\tRTMPusecDelay(1);\n\t\t\t\tMacReg = 0;\n\t\t\t\t{\n\t\t\t\t\tMacReg = 0xc;\n\t\t\t\t}\n\n\t\t\t\tif (MacReg)\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacReg);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"Warning, MAC specific condition occurs \\n\"));\n\t\t\t}\n\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n\n#ifdef WSC_INCLUDED\n\tWSC_HDR_BTN_MR_HANDLE(pAd);\n#endif /* WSC_INCLUDED */\n\n\n#ifdef P2P_SUPPORT\n\tif (P2P_INF_ON(pAd))\n\t\tP2pPeriodicExec(SystemSpecific1, FunctionContext, SystemSpecific2, SystemSpecific3);\n#endif /* P2P_SUPPORT */\n\n\tpAd->bUpdateBcnCntDone = FALSE;\n}\n\n\n/*\n\t==========================================================================\n\tValidate SSID for connection try and rescan purpose\n\tValid SSID will have visible chars only.\n\tThe valid length is from 0 to 32.\n\tIRQL = DISPATCH_LEVEL\n\t==========================================================================\n */\nBOOLEAN MlmeValidateSSID(\n\tIN PUCHAR\tpSsid,\n\tIN UCHAR\tSsidLen)\n{\n\tint\tindex;\n\n\tif (SsidLen > MAX_LEN_OF_SSID)\n\t\treturn (FALSE);\n\n\t/* Check each character value*/\n\tfor (index = 0; index < SsidLen; index++)\n\t{\n\t\tif (pSsid[index] < 0x20)\n\t\t\treturn (FALSE);\n\t}\n\n\t/* All checked*/\n\treturn (TRUE);\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID STAMlmePeriodicExec(\n\tPRTMP_ADAPTER pAd)\n{\n\tULONG\t\t\t    TxTotalCnt;\n\tint \ti;\n\tBOOLEAN bCheckBeaconLost = TRUE;\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\t\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n\n#ifdef P2P_SUPPORT\n\tPWSC_CTRL           pWscControl;\n\n\tif (P2P_CLI_ON(pAd))\n\t{\n\t\tpWscControl = &pAd->ApCfg.ApCliTab[0].WscControl;\n\t}\n\telse\n\t{\n\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\t}\n#endif /* P2P_SUPPORT */\n\n\n\n\tRTMP_CHIP_HIGH_POWER_TUNING(pAd, &pAd->StaCfg.RssiSample);\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n    if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)    \n#endif /* WPA_SUPPLICANT_SUPPORT */        \n    {\n    \t/* WPA MIC error should block association attempt for 60 seconds*/\n\t\tif (pAd->StaCfg.bBlockAssoc && \n\t\t\tRTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastMicErrorTime + (60*OS_HZ)))\n    \t\tpAd->StaCfg.bBlockAssoc = FALSE;\n    }\n\n#ifdef RTMP_MAC_USB\n\t/* If station is idle, go to sleep*/\n\tif ( 1\n\t/*\t&& (pAd->StaCfg.PSControl.field.EnablePSinIdle == TRUE)*/\n\t\t&& (pAd->StaCfg.WindowsPowerMode > 0)\n\t\t&& (pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd)) \n\t\t&& (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE)\n\t\t&& (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n\t\t&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n#ifdef WSC_STA_SUPPORT\n\t\t&& (pAd->StaCfg.WscControl.WscState == WSC_STATE_OFF)\n#endif /* WSC_STA_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t&& (!P2P_INF_ON(pAd))\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\t\tASIC_RADIO_OFF(pAd, MLME_RADIO_OFF);\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\t\n\t\t\tif(!RTMP_Usb_AutoPM_Put_Interface(pObj->pUsb_Dev,pObj->intf))\n\t\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PSM - Issue Sleep command)\\n\"));\n\t}\n\n#endif /* RTMP_MAC_USB */\n\n\n\t\n\n\tif (ADHOC_ON(pAd))\n\t{\n\t}\n\telse\n\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (P2P_CLI_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\t;\n\t\telse\n#endif /*CONFIG_MULTI_CHANNEL*/\n    \t\t\tAsicStaBbpTuning(pAd);\n\t}\n\t\n\tTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\t pAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\t pAd->RalinkCounters.OneSecTxFailCount;\n\n#ifdef P2P_SUPPORT\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) ||\n\t\tIS_P2P_GROUP_FORMING(pAd))\n\t{\n\t\tULONG Now;  \n\t\tbCheckBeaconLost = FALSE; \n\t\tNdisGetSystemUpTime(&Now);\n\t\tpAd->StaCfg.LastBeaconRxTime = Now;\n\t}\n#endif /* P2P_SUPPORT */\n\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && \n\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))\n\t{\n\t\t/* update channel quality for Roaming/Fast-Roaming and UI LinkQuality display*/\n\t\t/* bImprovedScan True means scan is not completed */\n\t\tif (pAd->StaCfg.bImprovedScan)\n\t\t\tbCheckBeaconLost = FALSE;\n\t\t\n#ifdef P2P_SUPPORT\n\t\tif (NdisEqualMemory(ZERO_MAC_ADDR, pAd->P2pCfg.ConnectingMAC, MAC_ADDR_LEN) == FALSE)\n\t\t{\n\t\t\tUCHAR p2pindex;\n\t\t\tp2pindex = P2pGroupTabSearch(pAd, pAd->P2pCfg.ConnectingMAC);\n\t\t\tif (p2pindex != P2P_NOT_FOUND)\n\t\t\t{\n\t\t\t\tif (pAd->P2pTable.Client[p2pindex].P2pClientState > P2PSTATE_DISCOVERY_UNKNOWN)\n\t\t\t\t\tbCheckBeaconLost = FALSE;\n\t\t\t}\t\t\t\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\t\tif (bCheckBeaconLost)\n\t\t{\n\t\t\t/* The NIC may lost beacons during scaning operation.*/\n\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\tMlmeCalculateChannelQuality(pAd, pEntry, pAd->Mlme.Now32);\n\t\t}\n\t}\n\n\n\t/* must be AFTER MlmeDynamicTxRateSwitching() because it needs to know if*/\n\t/* Radio is currently in noisy environment*/\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) \n\t{\n\tAsicAdjustTxPower(pAd);\n\tRTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(pAd);\n\t}\n\n\t/*\n\t\tDriver needs to up date value of LastOneSecTotalTxCount here;\n\t\totherwise UI couldn't do scanning sometimes when STA doesn't connect to AP or peer Ad-Hoc.\n\t*/\n\tpAd->RalinkCounters.LastOneSecTotalTxCount = TxTotalCnt;\n\t\n#ifdef RT3290\n\t// TODO: shiang, what's this and how about in AP mode??\n\t// Need to enable PCIE_APP0_CLK_REQ for HT40 throughput\n\tif (IS_RT3290(pAd) && (pAd->CommonCfg.BBPCurrentBW == BW_40))\n\t{\n\t\tif ((pAd->RalinkCounters.LastOneSecTotalTxCount + pAd->RalinkCounters.LastOneSecRxOkDataCnt) >= 2000)\n\t\t{\n\t\t\tWLAN_FUN_CTRL_STRUC     WlanFunCtrl = {.word = 0};\n\t\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\n\t\t\tif ((WlanFunCtrl.field.WLAN_EN == TRUE) && (WlanFunCtrl.field.PCIE_APP0_CLK_REQ == FALSE))\n\t\t\t{\n\t\t\t\tWlanFunCtrl.field.PCIE_APP0_CLK_REQ = TRUE;\n\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\t}\n\t\t}\n\t\telse if ((pAd->RalinkCounters.LastOneSecTotalTxCount + pAd->RalinkCounters.LastOneSecRxOkDataCnt) <= 500)\n\t\t{\n\t\t\tWLAN_FUN_CTRL_STRUC     WlanFunCtrl = {.word = 0};\n\t\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\n\t\t\tif ((WlanFunCtrl.field.WLAN_EN == TRUE) && (WlanFunCtrl.field.PCIE_APP0_CLK_REQ == TRUE))\n\t\t\t{\n\t\t\t\tWlanFunCtrl.field.PCIE_APP0_CLK_REQ = FALSE;\n\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word); \n\t\t\t}\n\t\t}\n\t}\n\n\t//HWAntennaSwitch\n\tif (IS_RT3290(pAd) && \n\t\t((pAd->NicConfig3.word != 0xFFFF) && (pAd->NicConfig3.field.CoexAnt == TRUE)) && \n\t\t((pAd->Mlme.OneSecPeriodicRound % 5) == 4))\t\n\t{\n\t\tWLAN_FUN_CTRL_STRUC\tWlanFunCtrl = {.word = 0};\n\t\tULONG\t\t\t\tMacRegValue;\n\t\t\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"!!! BBP_R150 = %d, BT_EN = %d\\n\",pAd->BbpWriteLatch[BBP_R150], pAd->BtFunCtrl.field.BT_EN));\n\t\t\n\t\t//Check BT_EN\n\t\tif ((((pAd->WlanFunInfo.field.COEX_MODE&0x1E) == 0) || (pAd->BtFunCtrl.field.BT_EN == 0)) && (pAd->BbpWriteLatch[BBP_R150] != 0xc0))\n\t\t{\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) \n\t\t\t\t|| (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND)) \n\t\t\t\t|| RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\t\t\tAsicForceWakeup(pAd, DOT11POWERSAVE);\n\t\t\n\t\t\t//Enable RX antenna switch\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, 0xc0);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! EN BBP_R150 = %d\\n\",pAd->BbpWriteLatch[BBP_R150]));\n\t\t\t\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, 0xb0);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, 0x23);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R153, 0x34);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, 0x10);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R155, 0x3b);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R253, 0x05);\t\n\n\t\t\t//Disable FIX_WL_ANT_SEL\n\t\t\tRTMP_IO_READ32(pAd, COEXCFG0, &MacRegValue);\n\t\t\tMacRegValue &= ~(0x00000004);\n\t\t\tRTMP_IO_WRITE32(pAd, COEXCFG0, MacRegValue);\t\t\t\n\n\t\t\t// Fixed to Main Antenna\n\t\t\tRTMP_SEM_LOCK(&pAd->WlanEnLock);\n\t\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\t\t\tif (WlanFunCtrl.field.WLAN_EN == TRUE)\n\t\t\t{\t\t\t\n\t\t\t\tif (WlanFunCtrl.field.INV_TR_SW0)\n\t\t\t\t{\n\t\t\t\t\tWlanFunCtrl.field.INV_TR_SW0 = 0;\t\t\t\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AsicSetRxAnt, switch to main antenna\\n\"));\n\t\t\t\tpAd->WlanFunCtrl.word = WlanFunCtrl.word;\t\n\t\t\t}\n\t\t\tRTMP_SEM_UNLOCK(&pAd->WlanEnLock);\n\t\n\t\n\t\t\t//Disable SW antanna selection\n\t\t\tpAd->NicConfig2.field.AntDiversity = FALSE;\t\n\t\t}\n\t\telse if(((pAd->WlanFunInfo.field.COEX_MODE&0x1E) != 0) && (pAd->BbpWriteLatch[BBP_R150] != 0x00))\n\t\t{\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) \n\t\t\t\t|| (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND)) \n\t\t\t\t|| RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\t\t\tAsicForceWakeup(pAd, DOT11POWERSAVE);\n\t\t\n\t\t\t//Disable RX antenna switch\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, 0x00);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! DISABLE BBP_R150 = %d\\n\",pAd->BbpWriteLatch[BBP_R150]));\n\t\t\t\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, 0x00);\n\n\t\t\t//Enable FIX_WL_ANT_SEL\n\t\t\tRTMP_IO_READ32(pAd, COEXCFG0, &MacRegValue);\n\t\t\tMacRegValue |= 0x00000004;\n\t\t\tRTMP_IO_WRITE32(pAd, COEXCFG0, MacRegValue);\t\n\n\t\t\t//Enable SW antanna selection\n\t\t\tpAd->NicConfig2.word = pAd->EEPROMDefaultValue[EEPROM_NIC_CFG2_OFFSET];\n\t\t}\t\n\t}\n#endif /* RT3290 */\n\n#ifdef P2P_SUPPORT\n    /* MAC table maintenance */\n\tif ((pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0) && P2P_GO_ON(pAd))\n\t{\n\t\t/* one second timer */\n\t    P2PMacTableMaintenance(pAd);\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (pAd->CommonCfg.bHTProtect)\n\t\t{\n\t\t\t/*APUpdateCapabilityAndErpIe(pAd); */\n\t\t\tAPUpdateOperationMode(pAd);\n\t\t\tif (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)\n\t\t\t{\n\t\t\t\tAsicUpdateProtect(pAd, (USHORT)pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, pAd->MacTab.fAnyStationNonGF);\n\t\t\t}\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t}\n#endif /* P2P_SUPPORT */\n\n\t\t/* resume Improved Scanning*/\n\t\tif ((pAd->StaCfg.bImprovedScan) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) &&\n\t\t\t(pAd->Mlme.SyncMachine.CurrState == SCAN_PENDING))\n\t\t{\n\t\t\tMLME_SCAN_REQ_STRUCT       ScanReq;\n\n\t\t\tpAd->StaCfg.LastScanTime = pAd->Mlme.Now32;\n\t\t\t\n\t\t\tScanParmFill(pAd, &ScanReq, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"bImprovedScan ............. Resume for bImprovedScan, SCAN_PENDING .............. \\n\"));\n\t\t}\n\n\tif (INFRA_ON(pAd))\n\t{\t\t\n#ifdef QOS_DLS_SUPPORT\n\t\t/* Check DLS time out, then tear down those session*/\n\t\tRTMPCheckDLSTimeOut(pAd);\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n    \t/* TDLS link maintenance*/\n    \tif (IS_TDLS_SUPPORT(pAd))\n    \t{\n\t\t\tif (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0)\n\t\t\t{\n\t\t\t\tTDLS_LinkMaintenance(pAd);\n\t\t\t}\n    \t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\t/* Is PSM bit consistent with user power management policy?*/\n\t\t/* This is the only place that will set PSM bit ON.*/\n\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n\t\tMlmeCheckPsmChange(pAd, pAd->Mlme.Now32);\n\n\t\t/*\n\t\t\tWhen we are connected and do the scan progress, it's very possible we cannot receive\n\t\t\tthe beacon of the AP. So, here we simulate that we received the beacon.\n\t\t*/\n\t\tif ((bCheckBeaconLost == FALSE) && \n\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) && \n\t\t\t(RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + (1*OS_HZ))))\n\t\t{\n\t\t\tULONG BPtoJiffies;\n\t\t\tLONG timeDiff;\n\n\t\t\tBPtoJiffies = (((pAd->CommonCfg.BeaconPeriod * 1024 / 1000) * OS_HZ) / 1000);\n\t\t\ttimeDiff = (pAd->Mlme.Now32 - pAd->StaCfg.LastBeaconRxTime) / BPtoJiffies;\n\t\t\tif (timeDiff > 0) \n\t\t\t\tpAd->StaCfg.LastBeaconRxTime += (timeDiff * BPtoJiffies);\n\n\t\t\tif (RTMP_TIME_AFTER(pAd->StaCfg.LastBeaconRxTime, pAd->Mlme.Now32))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - BeaconRxTime adjust wrong(BeaconRx=0x%lx, Now=0x%lx)\\n\", \n\t\t\t\t\t\t\t\tpAd->StaCfg.LastBeaconRxTime, pAd->Mlme.Now32));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ((RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + (1*OS_HZ))) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) &&\n\t\t\t(pAd->StaCfg.bImprovedScan == FALSE) &&\n\t\t\t((TxTotalCnt + pAd->RalinkCounters.OneSecRxOkCnt) < 600)\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t&&(pAd->P2pCfg.bStartP2pConnect != TRUE)\n\t                        && (pAd->Multi_Channel_Enable == TRUE)\n#endif /*CONFIG_MULTI_CHANNEL*/\n\t\t)\n\t\t{\n\t\t\tRTMPSetAGCInitValue(pAd, BW_20);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - No BEACON. restore R66 to the low bound(%d) \\n\", (0x2E + GET_LNA_GAIN(pAd))));\n\t\t}\n\n\n#ifdef RTMP_MAC_USB\n#ifdef DOT11_N_SUPPORT\n/*for 1X1 STA pass 11n wifi wmm, need to change txop per case;*/\n/* 1x1 device for 802.11n WMM Test*/\n\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t{\n\n\t\tif ((pAd->Antenna.field.TxPath == 1)&&\n\t\t(pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && \n\t\t\t(pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)\n#ifdef RT3290\n\t\t    && (!IS_RT3290(pAd))\n#endif /* RT3290 */\n\t\t)\n\t\t{\n\t\t\tEDCA_AC_CFG_STRUC\tAc0Cfg;\n\t\t\tEDCA_AC_CFG_STRUC\tAc2Cfg;\t\t\t\t\t\t\t\t\n\t\t\tRTUSBReadMACRegister(pAd, EDCA_AC2_CFG, &Ac2Cfg.word);\t\t\t\t\t\t\t\t\t\n\t\t\tRTUSBReadMACRegister(pAd, EDCA_AC0_CFG, &Ac0Cfg.word);\n\t\t\t\t\t\t\t\t\t\n\t\t\tif ((pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VO] == 0) &&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BK] == 0) &&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] < 50) &&\t\t\t\t\t\t\t\t      \n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VI] >= 1000))\n\t\t\t{\n\t\t\t/*5.2.27/28 T7: Total throughput need to ~36Mbps*/\n\t\t\t\tif (Ac2Cfg.field.Aifsn!=0xc)\n\t\t\t\t{\n\t\t\t\t\tAc2Cfg.field.Aifsn = 0xc;\n\t\t\t\t\tRTUSBWriteMACRegister(pAd, EDCA_AC2_CFG, Ac2Cfg.word, FALSE);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( IS_RT3070(pAd) && \n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VO] == 0) &&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BK] == 0) &&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VI] == 0) &&\t\t\t\t\t\t\t\t      \n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] >= 300)&&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] <= 1500)&&\n\t\t\t(pAd->CommonCfg.IOTestParm.bRTSLongProtOn==FALSE))\n\t\t\t{\n\t\t\t\tif (Ac0Cfg.field.AcTxop!=0x07)\n\t\t\t\t{\n\t\t\t\t\tAc0Cfg.field.AcTxop = 0x07;\n\t\t\t\t\tAc0Cfg.field.Aifsn = 0xc;\n\t\t\t\t\tRTUSBWriteMACRegister(pAd, EDCA_AC0_CFG, Ac0Cfg.word, FALSE);\n\t\t\t\t}\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse if ((pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VO] == 0) &&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BK] == 0) &&\n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VI] == 0) &&\t\t\t\t\t\t\t\t      \n\t\t\t(pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] < 10))\n\t\t\t{\n\t\t\t/* restore default parameter of BE*/\n\t\t\t\tif ((Ac0Cfg.field.Aifsn!=3) ||(Ac0Cfg.field.AcTxop!=0))\n\t\t\t\t{\n\t\t\t\t\tif(Ac0Cfg.field.Aifsn!=3)\n\t\t\t\t\t\tAc0Cfg.field.Aifsn = 3;\n\t\t\t\t\tif(Ac0Cfg.field.AcTxop!=0)\n\t\t\t\t\t\tAc0Cfg.field.AcTxop = 0;\n\t\t\t\t\tRTUSBWriteMACRegister(pAd, EDCA_AC0_CFG, Ac0Cfg.word, FALSE);\n\t\t\t\t}\n\n\t\t\t/* restore default parameter of VI*/\n\t\t\t\tif (Ac2Cfg.field.Aifsn!=0x3)\n\t\t\t\t{\n\t\t\t\t\tAc2Cfg.field.Aifsn = 0x3;\n\t\t\t\t\tRTUSBWriteMACRegister(pAd, EDCA_AC2_CFG, Ac2Cfg.word, FALSE);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\t\t\t\t\t\n\t\t/* TODO: for debug only. to be removed*/\n\t\tpAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] = 0;\n\t\tpAd->RalinkCounters.OneSecOsTxCount[QID_AC_BK] = 0;\n\t\tpAd->RalinkCounters.OneSecOsTxCount[QID_AC_VI] = 0;\n\t\tpAd->RalinkCounters.OneSecOsTxCount[QID_AC_VO] = 0;\n\t\tpAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_BE] = 0;\n\t\tpAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_BK] = 0;\n\t\tpAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_VI] = 0;\n\t\tpAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_VO] = 0;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount = 0;\n\t\tpAd->RalinkCounters.OneSecTxAggregationCount = 0;\n\t\t\t\t\n\n#endif /* RTMP_MAC_USB */\n\t\t\t\t\n\n        /*if ((pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) &&*/\n        /*    (pAd->RalinkCounters.OneSecTxRetryOkCount == 0))*/\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (INFRA_ON(pAd) && (P2P_CLI_ON(pAd) | P2P_GO_ON(pAd)) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t; /* Doesn't need to send null frame in this case. */\n\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n       if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) )\n        {\n    \t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable)\n    \t\t{\n    \t\t    /* When APSD is enabled, the period changes as 20 sec*/\n    \t\t\tif ((pAd->Mlme.OneSecPeriodicRound % 20) == 8)\n    \t\t\t{\n    \t\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, pAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n    \t\t\t}\n    \t\t}\n    \t\telse\n    \t\t{\n    \t\t    /* Send out a NULL frame every 10 sec to inform AP that STA is still alive (Avoid being age out)*/\n    \t\t\tif ((pAd->Mlme.OneSecPeriodicRound % 10) == 8)\n\t\t\t{\n\n\t\t\t\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\n\t\t\t\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\tif(INFRA_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\t\t\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t\t  (pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t\t\t\t\t\t  pAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\tif( (P2P_CLI_ON(pAd)) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\t\t\tRTMPP2PSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t\t(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->Mlme.bSendNullFrameAfterWareUp = TRUE;\n\t\t\t\t}\n\t\t\t}\n    \t\t}\n        }\n\n\t\tif (CQI_IS_DEAD(pAd->Mlme.ChannelQuality)\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t&& (pWscControl->bWscTrigger == FALSE)\n\t\t\t&& (!pAd->P2pCfg.bStartP2pConnect)\n\t\t\t&& (pAd->Multi_Channel_Enable == TRUE)\n#endif /*CONFIG_MULTI_CHANNEL*/\n\t\t)\n\t\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - No BEACON. Dead CQI. Auto Recovery attempt #%ld\\n\", pAd->RalinkCounters.BadCQIAutoRecoveryCount));\n\n\t\t\tif (pAd->StaCfg.bAutoConnectByBssid)\n\t\t\t\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\t\t\t\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&\n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))\n\t\t\t\tpAd->StaCfg.bLostAp = TRUE;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\t\t\tpAd->MlmeAux.CurrReqIsFromNdis = FALSE;\n\t\t\t/* Lost AP, send disconnect & link down event*/\n\t\t\tLinkDown(pAd, FALSE);\n\t\t\t\n/* should mark this two function, because link down alse will call this function */\n\t\t\t/* RTMPPatchMacBbpBug(pAd);*/\n\t\t\tMlmeAutoReconnectLastSSID(pAd);\n\t\t}\n\t\telse if (CQI_IS_BAD(pAd->Mlme.ChannelQuality)\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t&& (pWscControl->bWscTrigger == FALSE)\n\t\t\t&& (!pAd->P2pCfg.bStartP2pConnect)\n\t\t\t&& (pAd->Multi_Channel_Enable == TRUE)\n#endif /*CONFIG_MULTI_CHANNEL*/\n\t\t)\n\t\t{\n\t\t\tpAd->RalinkCounters.BadCQIAutoRecoveryCount ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - Bad CQI. Auto Recovery attempt #%ld\\n\", pAd->RalinkCounters.BadCQIAutoRecoveryCount));\n\t\t\tMlmeAutoReconnectLastSSID(pAd);\n\t\t}\n\t\t\n\t\tif (pAd->StaCfg.bAutoRoaming)\n\t\t{\n\t\t\tBOOLEAN\trv = FALSE;\n\t\t\tCHAR\tdBmToRoam = pAd->StaCfg.dBmToRoam;\n\t\t\tCHAR \tMaxRssi = RTMPMaxRssi(pAd, \n\t\t\t\t\t\t\t\t\t\t  pAd->StaCfg.RssiSample.LastRssi0, \n\t\t\t\t\t\t\t\t\t\t  pAd->StaCfg.RssiSample.LastRssi1, \n\t\t\t\t\t\t\t\t\t\t  pAd->StaCfg.RssiSample.LastRssi2);\t\t\t\n\t\t\t\n\t\t\tif (pAd->StaCfg.bAutoConnectByBssid)\n\t\t\t\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\t\t\t\n\t\t\t/* Scanning, ignore Roaming*/\n\t\t\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&\n\t\t\t\t(pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE) &&\n\t\t\t\t(MaxRssi <= dBmToRoam))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rssi=%d, dBmToRoam=%d\\n\", MaxRssi, (CHAR)dBmToRoam));\n\n\n\t\t\t\t/* Add auto seamless roaming*/\n\t\t\t\tif (rv == FALSE)\n\t\t\t\t\trv = MlmeCheckForFastRoaming(pAd);\n\t\t\t\t\n\t\t\t\tif (rv == FALSE)\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->StaCfg.LastScanTime + 10 * OS_HZ) < pAd->Mlme.Now32)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - Roaming, No eligable entry, try new scan!\\n\"));\n\t\t\t\t\t\tpAd->StaCfg.LastScanTime = pAd->Mlme.Now32;\n\t\t\t\t\t\tMlmeAutoScan(pAd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (ADHOC_ON(pAd))\n\t{\n\n\t\t/* If all peers leave, and this STA becomes the last one in this IBSS, then change MediaState*/\n\t\t/* to DISCONNECTED. But still holding this IBSS (i.e. sending BEACON) so that other STAs can*/\n\t\t/* join later.*/\n\t\tif (/*(RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME)\n\t\t\t|| (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t\t&& */OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t{\n\n\t\t\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t\t\t{\n\t\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\n\t\t\t\tif (!IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (RTMP_TIME_AFTER(pAd->Mlme.Now32, pEntry->LastBeaconRxTime + ADHOC_BEACON_LOST_TIME)\n#ifdef IWSC_SUPPORT\n\t\t\t\t\t/*\n\t\t\t\t\t\t2011/09/05:\n\t\t\t\t\t\tBroadcom test bed doesn't broadcast beacon when Broadcom is Enrollee.\n\t\t\t\t\t*/\n\t\t\t\t\t&& (pAd->StaCfg.WscControl.bWscTrigger == FALSE)\n#endif /* IWSC_SUPPORT */\n\t\t\t\t)\n\t\t\t\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);\n\t\t\t}\n\n            if (pAd->MacTab.Size == 0)\n            {\t\t\t                \n    \t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n    \t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n            }            \n\t\t}\n\t\t\t\n\t}\n\telse /* no INFRA nor ADHOC connection*/\n\t{\n\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t\tgoto SKIP_AUTO_SCAN_CONN;\n#endif /* P2P_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif (pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS)\n\t\t\tgoto SKIP_AUTO_SCAN_CONN;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\t\tif (pAd->StaCfg.bSkipAutoScanConn &&\n\t\t\tRTMP_TIME_BEFORE(pAd->Mlme.Now32, pAd->StaCfg.LastScanTime + (30 * OS_HZ)))\n\t\t\tgoto SKIP_AUTO_SCAN_CONN;\n\t\telse\n\t\t\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n        \n\t\tif ((pAd->StaCfg.bAutoReconnect == TRUE)\n\t\t\t&& RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)\n\t\t\t&& (MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE))\n\t\t{\n\t\t\tif ((pAd->ScanTab.BssNr==0) && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tMLME_SCAN_REQ_STRUCT\t   ScanReq;\n\n\t\t\t\tif (RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastScanTime + (10 * OS_HZ))\n\t\t\t\t\t|| (pAd->StaCfg.LastScanTime == 0)\n\t\t\t\t\t|| (pAd->StaCfg.bNotFirstScan == FALSE))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"STAMlmePeriodicExec():CNTL - ScanTab.BssNr==0, start a new ACTIVE scan SSID[%s]\\n\", pAd->MlmeAux.AutoReconnectSsid));\n\t\t\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\t\n\t\t\t\t\t\tpAd->StaCfg.bNotFirstScan = TRUE;\n\t\t\t\t\tScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen, BSS_ANY, SCAN_ACTIVE);\n\t\t\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t\t\t\t\t/* Reset Missed scan number*/\n\t\t\t\t\tpAd->StaCfg.LastScanTime = pAd->Mlme.Now32;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tMlmeAutoReconnectLastSSID(pAd);\n\t\t\t}\n\t\t\telse if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n\t\t\t{\n#ifdef CARRIER_DETECTION_SUPPORT /* Roger sync Carrier*/\n\t\t\t\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->Mlme.OneSecPeriodicRound % 5) == 1)\n\t\t\t\t\t\tMlmeAutoReconnectLastSSID(pAd);\n\t\t\t\t}\n\t\t\t\telse\n#endif /* CARRIER_DETECTION_SUPPORT */ \n\t\t\t\t{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\tif(pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE)\n#endif // WPA_SUPPLICANT_SUPPORT //\n\t\t\t\t\tMlmeAutoReconnectLastSSID(pAd);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nSKIP_AUTO_SCAN_CONN:\n\n#ifdef DOT11_N_SUPPORT\n    if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap !=0) && (pAd->MacTab.fAnyBASession == FALSE)\n\t\t&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))\n\t{\n\t\tpAd->MacTab.fAnyBASession = TRUE;\n\t\tAsicUpdateProtect(pAd, HT_FORCERTSCTS,  ALLN_SETPROTECT, FALSE, FALSE);\n\t}\n\telse if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap ==0) && (pAd->MacTab.fAnyBASession == TRUE)\n\t\t&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))\n\t{\n\t\tpAd->MacTab.fAnyBASession = FALSE;\n\t\tAsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode,  ALLN_SETPROTECT, FALSE, FALSE);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef P2P_SUPPORT\n\tif (P2P_CLI_ON(pAd))\n\t{\n\t\tif (pAd->Mlme.OneSecPeriodicRound % 2 == 0)\n\t\t\tApCliIfMonitor(pAd);\n\n\t\tif (pAd->Mlme.OneSecPeriodicRound % 2 == 1)\n\t\t\tApCliIfUp(pAd);\n\n\t\t{\n\t\t\tINT loop;\n\t\t\tULONG Now32;\n\t\t\tNdisGetSystemUpTime(&Now32);\n\t\t\tfor (loop = 0; loop < MAX_APCLI_NUM; loop++)\n\t\t\t{\n\t\t\t\tPAPCLI_STRUCT pApCliEntry = &pAd->ApCfg.ApCliTab[loop];\n\t\t\t\tif ((pApCliEntry->Valid == TRUE)\n\t\t\t\t\t&& (pApCliEntry->MacTabWCID < MAX_LEN_OF_MAC_TABLE))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tWhen we are connected and do the scan progress, it's very possible we cannot receive\n\t\t\t\t\t\tthe beacon of the AP. So, here we simulate that we received the beacon.\n\t\t\t\t\t*/\n\t\t\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&\n\t\t\t\t\t\t(RTMP_TIME_AFTER(pAd->Mlme.Now32, pApCliEntry->ApCliRcvBeaconTime + (1*OS_HZ))))\n\t\t\t\t\t{\n\t\t\t\t\t\tULONG BPtoJiffies;\n\t\t\t\t\t\tLONG timeDiff;\n\n\t\t\t\t\t\tBPtoJiffies = (((pApCliEntry->ApCliBeaconPeriod * 1024 / 1000) * OS_HZ) / 1000);\n\t\t\t\t\t\ttimeDiff = (pAd->Mlme.Now32 - pApCliEntry->ApCliRcvBeaconTime) / BPtoJiffies;\n\t\t\t\t\t\tif (timeDiff > 0) \n\t\t\t\t\t\t\tpApCliEntry->ApCliRcvBeaconTime += (timeDiff * BPtoJiffies);\n\n\t\t\t\t\t\tif (RTMP_TIME_AFTER(pApCliEntry->ApCliRcvBeaconTime, pAd->Mlme.Now32))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - APCli BeaconRxTime adjust wrong(BeaconRx=0x%lx, Now=0x%lx)\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpApCliEntry->ApCliRcvBeaconTime, pAd->Mlme.Now32));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* update channel quality for Roaming and UI LinkQuality display */\n\t\t\t\t\tMlmeCalculateChannelQuality(pAd,\n\t\t\t\t\t\t&pAd->MacTab.Content[pApCliEntry->MacTabWCID], Now32);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t/* Perform 20/40 BSS COEX scan every Dot11BssWidthTriggerScanInt\t*/\n\tif ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)) && \n\t\t(pAd->CommonCfg.Dot11BssWidthTriggerScanInt != 0) && \n\t\t((pAd->Mlme.OneSecPeriodicRound % pAd->CommonCfg.Dot11BssWidthTriggerScanInt) == (pAd->CommonCfg.Dot11BssWidthTriggerScanInt-1)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - LastOneSecTotalTxCount/LastOneSecRxOkDataCnt  = %d/%d \\n\", \n\t\t\t\t\t\t\t\tpAd->RalinkCounters.LastOneSecTotalTxCount,\n\t\t\t\t\t\t\t\tpAd->RalinkCounters.LastOneSecRxOkDataCnt));\n\t\t\n\t\t/* Check last scan time at least 30 seconds from now. \t\t*/\n\t\t/* Check traffic is less than about 1.5~2Mbps.*/\n\t\t/* it might cause data lost if we enqueue scanning.*/\n\t\t/* This criteria needs to be considered*/\n\t\tif ((pAd->RalinkCounters.LastOneSecTotalTxCount < 70) && (pAd->RalinkCounters.LastOneSecRxOkDataCnt < 70))\n\t\t{\n\t\t\tMLME_SCAN_REQ_STRUCT            ScanReq;\n\t\t\t/* Fill out stuff for scan request and kick to scan*/\n\t\t\tScanParmFill(pAd, &ScanReq, ZeroSsid, 0, BSS_ANY, SCAN_2040_BSS_COEXIST);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t\t\t/* Set InfoReq = 1, So after scan , alwats sebd 20/40 Coexistence frame to AP*/\n\t\t\tpAd->CommonCfg.BSSCoexist2040.field.InfoReq = 1;\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" LastOneSecTotalTxCount/LastOneSecRxOkDataCnt  = %d/%d \\n\", \n\t\t\t\t\t\t\tpAd->RalinkCounters.LastOneSecTotalTxCount, \n\t\t\t\t\t\t\tpAd->RalinkCounters.LastOneSecRxOkDataCnt));\t\n\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\treturn;\n}\n\n/* Link down report*/\nVOID LinkDownExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tif (pAd != NULL)\n\t{\n\t\tMLME_DISASSOC_REQ_STRUCT   DisassocReq;\n\t\t\n\t\tif ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) &&\n\t\t\t(INFRA_ON(pAd)))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"LinkDownExec(): disassociate with current AP...\\n\"));\n\t\t\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);\n\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, \n\t\t\t\t\t\tsizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\n\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t\t    pAd->ExtraInfo = GENERAL_LINK_DOWN;\n\t\t}\t\n\t}\n}\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID MlmeAutoScan(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/* check CntlMachine.CurrState to avoid collision with NDIS SetOID request*/\n\tif (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - Driver auto scan\\n\"));\n\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\tOID_802_11_BSSID_LIST_SCAN, \n\t\t\t\t\tpAd->MlmeAux.AutoReconnectSsidLen, \n\t\t\t\t\tpAd->MlmeAux.AutoReconnectSsid, 0);\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n}\n\t\n/* IRQL = DISPATCH_LEVEL*/\nVOID MlmeAutoReconnectLastSSID(\n\tIN PRTMP_ADAPTER pAd)\n{\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((pAd->P2pCfg.bStartP2pConnect) && (pAd->Multi_Channel_Enable == TRUE))\n\t\treturn;\n\n\n\tif ((pAd->StaCfg.ReConnectCountDown != 0 ) && (pAd->Multi_Channel_Enable == TRUE))\n\t{\n\t\tpAd->StaCfg.ReConnectCountDown--;\n\t\treturn;\t\t\t\n\t}\t\t\n#endif /*CONFIG_MULTI_CHANNEL*/\t\n\n\n#ifdef WSC_STA_SUPPORT\n\tPWSC_CTRL           pWscControl = &pAd->StaCfg.WscControl;\n\n\tif ((pWscControl->WscConfMode != WSC_DISABLE) && \n\t\t(pWscControl->bWscTrigger) &&\n\t\t(pWscControl->WscMode == WSC_PBC_MODE) &&\n\t\t(pWscControl->WscPBCBssCount != 1))\n\t\treturn;\n\n\tif ((pWscControl->WscConfMode != WSC_DISABLE) &&\n\t\t(pWscControl->WscState >= WSC_STATE_START))\n\t{\t\t\n\t\tULONG ApIdx = 0;\n\n\t\tApIdx = WscSearchWpsApBySSID(pAd,\n\t\t\t\t\t\t\t\t\t pWscControl->WscSsid.Ssid, \n\t\t\t\t\t\t\t\t\t pWscControl->WscSsid.SsidLength,\n\t\t\t\t\t\t\t\t\t pWscControl->WscMode);\n\n\t\tif ((ApIdx != BSS_NOT_FOUND) &&\n\t\t\t(pAd->StaCfg.BssType == BSS_INFRA))\n\t\t{\n\t\t\tNdisMoveMemory(pWscControl->WscBssid, pAd->ScanTab.BssEntry[ApIdx].Bssid, MAC_ADDR_LEN);\n\t\t\tpAd->MlmeAux.Channel = pAd->ScanTab.BssEntry[ApIdx].Channel;\n\t\t}\n\n\t\tCntlWscIterate(pAd);\n\t}\n\telse\n#endif /* WSC_STA_SUPPORT */\n\tif (pAd->StaCfg.bAutoConnectByBssid)\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Driver auto reconnect to last OID_802_11_BSSID setting - %02X:%02X:%02X:%02X:%02X:%02X\\n\",\n\t\t\t\t\t\t\t\t\tPRINT_MAC(pAd->MlmeAux.Bssid)));\n\n\t\tpAd->MlmeAux.Channel = pAd->CommonCfg.Channel;\n\t\tMlmeEnqueue(pAd,\n\t\t\t MLME_CNTL_STATE_MACHINE,\n\t\t\t OID_802_11_BSSID,\n\t\t\t MAC_ADDR_LEN,\n\t\t\t pAd->MlmeAux.Bssid, 0);\n\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n\t/* check CntlMachine.CurrState to avoid collision with NDIS SetOID request*/\n\telse if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) && \n\t\t(MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE))\n\t{\n\t\tNDIS_802_11_SSID OidSsid;\n\t\tOidSsid.SsidLength = pAd->MlmeAux.AutoReconnectSsidLen;\n\t\tNdisMoveMemory(OidSsid.Ssid, pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Driver auto reconnect to last OID_802_11_SSID setting - %s, len - %d\\n\", pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen));\n\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\tOID_802_11_SSID, \n\t\t\t\t\tsizeof(NDIS_802_11_SSID), \n\t\t\t\t\t&OidSsid, 0);\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine checks if there're other APs out there capable for\n\t\troaming. Caller should call this routine only when Link up in INFRA mode\n\t\tand channel quality is below CQI_GOOD_THRESHOLD.\n\n\tIRQL = DISPATCH_LEVEL\n\n\tOutput:\n\t==========================================================================\n */\nVOID MlmeCheckForRoaming(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\tNow32)\n{\n\tUSHORT\t   i;\n\tBSS_TABLE  *pRoamTab = &pAd->MlmeAux.RoamTab;\n\tBSS_ENTRY  *pBss;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> MlmeCheckForRoaming\\n\"));\n\t/* put all roaming candidates into RoamTab, and sort in RSSI order*/\n\tBssTableInit(pRoamTab);\n\tfor (i = 0; i < pAd->ScanTab.BssNr; i++)\n\t{\n\t\tpBss = &pAd->ScanTab.BssEntry[i];\n\n\t\tif (RTMP_TIME_AFTER(Now32, pBss->LastBeaconRxTime + pAd->StaCfg.BeaconLostTime))\n\t\t\tcontinue;\t /* AP disappear*/\n\t\tif (pBss->Rssi <= RSSI_THRESHOLD_FOR_ROAMING)\n\t\t\tcontinue;\t /* RSSI too weak. forget it.*/\n\t\tif (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid))\n\t\t\tcontinue;\t /* skip current AP*/\n\t\tif (pBss->Rssi < (pAd->StaCfg.RssiSample.LastRssi0 + RSSI_DELTA))\n\t\t\tcontinue;\t /* only AP with stronger RSSI is eligible for roaming*/\n\n\t\t/* AP passing all above rules is put into roaming candidate table\t\t */\n\t\tNdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr], pBss, sizeof(BSS_ENTRY));\n\t\tpRoamTab->BssNr += 1;\n\t}\n\n\tif (pRoamTab->BssNr > 0)\n\t{\n\t\t/* check CntlMachine.CurrState to avoid collision with NDIS SetOID request*/\n\t\tif (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n\t\t{\n\t\t\tpAd->RalinkCounters.PoorCQIRoamingCount ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - Roaming attempt #%ld\\n\", pAd->RalinkCounters.PoorCQIRoamingCount));\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_MLME_ROAMING_REQ, 0, NULL, 0);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== MlmeCheckForRoaming(# of candidate= %d)\\n\",pRoamTab->BssNr));   \n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine checks if there're other APs out there capable for\n\t\troaming. Caller should call this routine only when link up in INFRA mode\n\t\tand channel quality is below CQI_GOOD_THRESHOLD.\n\n\tIRQL = DISPATCH_LEVEL\n\n\tOutput:\n\t==========================================================================\n */\nBOOLEAN MlmeCheckForFastRoaming(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUSHORT\t\ti;\n\tBSS_TABLE\t*pRoamTab = &pAd->MlmeAux.RoamTab;\n\tBSS_ENTRY\t*pBss;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> MlmeCheckForFastRoaming\\n\"));\n\t/* put all roaming candidates into RoamTab, and sort in RSSI order*/\n\tBssTableInit(pRoamTab);\n\tfor (i = 0; i < pAd->ScanTab.BssNr; i++)\n\t{\n\t\tpBss = &pAd->ScanTab.BssEntry[i];\n\n        if ((pBss->Rssi <= -50) && (pBss->Channel == pAd->CommonCfg.Channel))\n\t\t\tcontinue;\t /* RSSI too weak. forget it.*/\n\t\tif (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid))\n\t\t\tcontinue;\t /* skip current AP*/\n\t\tif (!SSID_EQUAL(pBss->Ssid, pBss->SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen))\n\t\t\tcontinue;\t /* skip different SSID*/\n        if (pBss->Rssi < (RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2) + RSSI_DELTA)) \n\t\t\tcontinue;\t /* skip AP without better RSSI*/\n\t\t\n        DBGPRINT(RT_DEBUG_TRACE, (\"LastRssi0 = %d, pBss->Rssi = %d\\n\", RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2), pBss->Rssi));\n\t\t/* AP passing all above rules is put into roaming candidate table\t\t */\n\t\tNdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr], pBss, sizeof(BSS_ENTRY));\n\t\tpRoamTab->BssNr += 1;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== MlmeCheckForFastRoaming (BssNr=%d)\\n\", pRoamTab->BssNr));\n\tif (pRoamTab->BssNr > 0)\n\t{\n\t\t/* check CntlMachine.CurrState to avoid collision with NDIS SetOID request*/\n\t\tif (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n\t\t{\n\t\t\tpAd->RalinkCounters.PoorCQIRoamingCount ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MMCHK - Roaming attempt #%ld\\n\", pAd->RalinkCounters.PoorCQIRoamingCount));\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_MLME_ROAMING_REQ, 0, NULL, 0);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is executed periodically inside MlmePeriodicExec() after \n\t\tassociation with an AP.\n\t\tIt checks if StaCfg.Psm is consistent with user policy (recorded in\n\t\tStaCfg.WindowsPowerMode). If not, enforce user policy. However, \n\t\tthere're some conditions to consider:\n\t\t1. we don't support power-saving in ADHOC mode, so Psm=PWR_ACTIVE all\n\t\t   the time when Mibss==TRUE\n\t\t2. When link up in INFRA mode, Psm should not be switch to PWR_SAVE\n\t\t   if outgoing traffic available in TxRing or MgmtRing.\n\tOutput:\n\t\t1. change pAd->StaCfg.Psm to PWR_SAVE or leave it untouched\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID MlmeCheckPsmChange(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\tNow32)\n{\n\tULONG\tPowerMode;\n\n\t/*\n\t\tcondition -\n\t\t1. Psm maybe ON only happen in INFRASTRUCTURE mode\n\t\t2. user wants either MAX_PSP or FAST_PSP\n\t\t3. but current psm is not in PWR_SAVE\n\t\t4. CNTL state machine is not doing SCANning\n\t\t5. no TX SUCCESS event for the past 1-sec period\n\t*/\n\tPowerMode = pAd->StaCfg.WindowsPowerMode;\n\n\tif (INFRA_ON(pAd) &&\n\t\t(PowerMode != Ndis802_11PowerModeCAM) &&\n\t\t(pAd->StaCfg.Psm == PWR_ACTIVE) &&\n/*\t\t(! RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))*/\n\t\t(pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)\n#ifdef PCIE_PS_SUPPORT\n\t\t&& RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)\n#endif /* PCIE_PS_SUPPORT */\n#ifdef RTMP_MAC_USB\n\t\t&&\t\t(pAd->CountDowntoPsm == 0)\n#endif /* RTMP_MAC_USB */\n\t\t /*&&\n\t\t(pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) &&\n\t\t(pAd->RalinkCounters.OneSecTxRetryOkCount == 0)*/)\n\t{\n\t\tNdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime);\n\t\tpAd->RalinkCounters.RxCountSinceLastNULL = 0;\n\t\tRTMP_SET_PSM_BIT(pAd, PWR_SAVE);\n\n\t\tif (!(pAd->StaCfg.UapsdInfo.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable))\n\t\t{\n\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE), pAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, pAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n\t\t}\n\n\t}\n}\n\n/* IRQL = PASSIVE_LEVEL*/\n/* IRQL = DISPATCH_LEVEL*/\nVOID MlmeSetPsmBit(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT psm)\n{\n#ifdef DOT11Z_TDLS_SUPPORT\n\tUSHORT PsmOld = pAd->StaCfg.Psm;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\tpAd->StaCfg.Psm = psm;\t  \n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t/* pAd->StaCfg.Psm must be updated before calling the function */\n\tTDLS_UAPSDP_PsmModeChange(pAd, PsmOld, psm);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeSetPsmBit = %d\\n\", psm));\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine calculates TxPER, RxPER of the past N-sec period. And \n\t\taccording to the calculation result, ChannelQuality is calculated here \n\t\tto decide if current AP is still doing the job. \n\n\t\tIf ChannelQuality is not good, a ROAMing attempt may be tried later.\n\tOutput:\n\t\tStaCfg.ChannelQuality - 0..100\n\n\tIRQL = DISPATCH_LEVEL\n\n\tNOTE: This routine decide channle quality based on RX CRC error ratio.\n\t\tCaller should make sure a function call to NICUpdateRawCounters(pAd)\n\t\tis performed right before this routine, so that this routine can decide\n\t\tchannel quality based on the most up-to-date information\n\t==========================================================================\n */\nVOID MlmeCalculateChannelQuality(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pMacEntry,\n\tIN ULONG Now32)\n{\n\tULONG TxOkCnt, TxCnt, TxPER, TxPRR;\n\tULONG RxCnt, RxPER;\n\tUCHAR NorRssi;\n\tCHAR  MaxRssi;\n\tRSSI_SAMPLE *pRssiSample = NULL;\n\tUINT32 OneSecTxNoRetryOkCount = 0;\n\tUINT32 OneSecTxRetryOkCount = 0;\n\tUINT32 OneSecTxFailCount = 0;\n\tUINT32 OneSecRxOkCnt = 0;\n\tUINT32 OneSecRxFcsErrCnt = 0;\n\tULONG ChannelQuality = 0;  /* 0..100, Channel Quality Indication for Roaming*/\n#ifdef CONFIG_STA_SUPPORT\n\tULONG LastBeaconRxTime = 0;\n\tULONG BeaconLostTime = pAd->StaCfg.BeaconLostTime;\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT /* Roger sync Carrier*/\n\t/* longer beacon lost time when carrier detection enabled*/\n\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t{\n\t\tBeaconLostTime = pAd->StaCfg.BeaconLostTime + (pAd->StaCfg.BeaconLostTime/2);\n\t}\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef APCLI_SUPPORT\n\t\tif (pMacEntry && IS_ENTRY_APCLI(pMacEntry) && (pMacEntry->MatchAPCLITabIdx < MAX_APCLI_NUM))\n\t\t\tLastBeaconRxTime = pAd->ApCfg.ApCliTab[pMacEntry->MatchAPCLITabIdx].ApCliRcvBeaconTime; \n\t\telse\n#endif /*APCLI_SUPPORT*/\n\t\t\tLastBeaconRxTime = pAd->StaCfg.LastBeaconRxTime;\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\t\tif (pMacEntry != NULL)\n\t\t{\n\t\t\tpRssiSample = &pMacEntry->RssiSample;\n\t\t\tOneSecTxNoRetryOkCount = pMacEntry->OneSecTxNoRetryOkCount;\n\t\t\tOneSecTxRetryOkCount = pMacEntry->OneSecTxRetryOkCount;\n\t\t\tOneSecTxFailCount = pMacEntry->OneSecTxFailCount;\n\t\t\tOneSecRxOkCnt = pAd->RalinkCounters.OneSecRxOkCnt;\n\t\t\tOneSecRxFcsErrCnt = pAd->RalinkCounters.OneSecRxFcsErrCnt;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpRssiSample = &pAd->MacTab.Content[0].RssiSample;\n\t\t\tOneSecTxNoRetryOkCount = pAd->RalinkCounters.OneSecTxNoRetryOkCount;\n\t\t\tOneSecTxRetryOkCount = pAd->RalinkCounters.OneSecTxRetryOkCount;\n\t\t\tOneSecTxFailCount = pAd->RalinkCounters.OneSecTxFailCount;\n\t\t\tOneSecRxOkCnt = pAd->RalinkCounters.OneSecRxOkCnt;\n\t\t\tOneSecRxFcsErrCnt = pAd->RalinkCounters.OneSecRxFcsErrCnt;\n\t\t}\n\n\tif (pRssiSample == NULL)\n\t\treturn;\n\tMaxRssi = RTMPMaxRssi(pAd, pRssiSample->LastRssi0,\n\t\t\t\t\t\t\t\tpRssiSample->LastRssi1,\n\t\t\t\t\t\t\t\tpRssiSample->LastRssi2);\n\n\t\n\t/*\n\t\tcalculate TX packet error ratio and TX retry ratio - if too few TX samples, \n\t\tskip TX related statistics\n\t*/\t\n\tTxOkCnt = OneSecTxNoRetryOkCount + OneSecTxRetryOkCount;\n\tTxCnt = TxOkCnt + OneSecTxFailCount;\n\tif (TxCnt < 5) \n\t{\n\t\tTxPER = 0;\n\t\tTxPRR = 0;\n\t}\n\telse \n\t{\n\t\tTxPER = (OneSecTxFailCount * 100) / TxCnt; \n\t\tTxPRR = ((TxCnt - OneSecTxNoRetryOkCount) * 100) / TxCnt;\n\t}\n\n\t\n\t/* calculate RX PER - don't take RxPER into consideration if too few sample*/\n\tRxCnt = OneSecRxOkCnt + OneSecRxFcsErrCnt;\n\tif (RxCnt < 5)\n\t\tRxPER = 0;\t\n\telse\n\t\tRxPER = (OneSecRxFcsErrCnt * 100) / RxCnt;\n\n\t\n\t/* decide ChannelQuality based on: 1)last BEACON received time, 2)last RSSI, 3)TxPER, and 4)RxPER*/\n#ifdef CONFIG_STA_SUPPORT\n\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\tINFRA_ON(pAd) && \n\t\t(OneSecTxNoRetryOkCount < 2) && /* no heavy traffic*/\n\t\tRTMP_TIME_AFTER(Now32, LastBeaconRxTime + BeaconLostTime))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BEACON lost > %ld msec with TxOkCnt=%ld -> CQI=0\\n\", BeaconLostTime * (1000 / OS_HZ) , TxOkCnt)); \n\t\tChannelQuality = 0;\n\t}\n\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t{\n\t\t/* Normalize Rssi*/\n\t\tif (MaxRssi > -40)\n\t\t\tNorRssi = 100;\n\t\telse if (MaxRssi < -90)\n\t\t\tNorRssi = 0;\n\t\telse\n\t\t\tNorRssi = (MaxRssi + 90) * 2;\n\t\t\n\t\t/* ChannelQuality = W1*RSSI + W2*TxPRR + W3*RxPER\t (RSSI 0..100), (TxPER 100..0), (RxPER 100..0)*/\n\t\tChannelQuality = (RSSI_WEIGHTING * NorRssi + \n\t\t\t\t\t\t\t\t   TX_WEIGHTING * (100 - TxPRR) + \n\t\t\t\t\t\t\t\t   RX_WEIGHTING* (100 - RxPER)) / 100;\n\t}\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (pAd->OpMode == OPMODE_STA)\n\t\tpAd->Mlme.ChannelQuality = (ChannelQuality > 100) ? 100 : ChannelQuality;\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\tif (pAd->OpMode == OPMODE_AP)\n\t{\n\t\tif (pMacEntry != NULL)\n\t\t\tpMacEntry->ChannelQuality = (ChannelQuality > 100) ? 100 : ChannelQuality;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\n}\n\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID MlmeSetTxPreamble(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT TxPreamble)\n{\n\tAUTO_RSP_CFG_STRUC csr4;\n\n\t\n\t/* Always use Long preamble before verifiation short preamble functionality works well.*/\n\t/* Todo: remove the following line if short preamble functionality works*/\n\t\n\t/*TxPreamble = Rt802_11PreambleLong;*/\n\t\n\tRTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);\n\tif (TxPreamble == Rt802_11PreambleLong)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeSetTxPreamble (= LONG PREAMBLE)\\n\"));\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); \n\t\tcsr4.field.AutoResponderPreamble = 0;\n\t}\n\telse\n\t{\n\t\t/* NOTE: 1Mbps should always use long preamble*/\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeSetTxPreamble (= SHORT PREAMBLE)\\n\"));\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);\n\t\tcsr4.field.AutoResponderPreamble = 1;\n\t}\n\n\tRTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);\n}\n\n/*\n    ==========================================================================\n    Description:\n        Update basic rate bitmap\n    ==========================================================================\n */\n \nVOID UpdateBasicRateBitmap(\n    IN  PRTMP_ADAPTER   pAdapter)\n{\n    INT  i, j;\n                  /* 1  2  5.5, 11,  6,  9, 12, 18, 24, 36, 48,  54 */\n    UCHAR rate[] = { 2, 4,  11, 22, 12, 18, 24, 36, 48, 72, 96, 108 };\n    UCHAR *sup_p = pAdapter->CommonCfg.SupRate;\n    UCHAR *ext_p = pAdapter->CommonCfg.ExtRate;\n    ULONG bitmap = pAdapter->CommonCfg.BasicRateBitmap;\n\n    /* if A mode, always use fix BasicRateBitMap */\n    /*if (pAdapter->CommonCfg.Channel == WMODE_A)*/\n\tif (pAdapter->CommonCfg.Channel > 14)\n\t{\n\t\tif (pAdapter->CommonCfg.BasicRateBitmap & 0xF)\n\t\t{\n\t\t\t/* no 11b rate in 5G band */\n\t\t\tpAdapter->CommonCfg.BasicRateBitmapOld = \\\n\t\t\t\t\t\t\t\t\t\tpAdapter->CommonCfg.BasicRateBitmap;\n\t\t\tpAdapter->CommonCfg.BasicRateBitmap &= (~0xF); /* no 11b */\n\t\t}\n\n\t\t/* force to 6,12,24M in a-band */\n\t\tpAdapter->CommonCfg.BasicRateBitmap |= 0x150; /* 6, 12, 24M */\n    }\n\telse\n\t{\n\t\t/* no need to modify in 2.4G (bg mixed) */\n\t\tpAdapter->CommonCfg.BasicRateBitmap = \\\n\t\t\t\t\t\t\t\t\t\tpAdapter->CommonCfg.BasicRateBitmapOld;\n\t}\n\n    if (pAdapter->CommonCfg.BasicRateBitmap > 4095)\n    {\n        /* (2 ^ MAX_LEN_OF_SUPPORTED_RATES) -1 */\n        return;\n    }\n\n    for(i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++)\n    {\n        sup_p[i] &= 0x7f;\n        ext_p[i] &= 0x7f;\n    }\n\n    for(i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++)\n    {\n        if (bitmap & (1 << i))\n        {\n            for(j=0; j<MAX_LEN_OF_SUPPORTED_RATES; j++)\n            {\n                if (sup_p[j] == rate[i])\n                    sup_p[j] |= 0x80;\n            }\n\n            for(j=0; j<MAX_LEN_OF_SUPPORTED_RATES; j++)\n            {\n                if (ext_p[j] == rate[i])\n                    ext_p[j] |= 0x80;\n            }\n        }\n    }\n}\n\n/*\n\tbLinkUp is to identify the inital link speed.\n\tTRUE indicates the rate update at linkup, we should not try to set the rate at 54Mbps.\n*/\nVOID MlmeUpdateTxRates(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bLinkUp,\n\tIN UCHAR apidx)\n{\n\tint i, num;\n\tUCHAR Rate = RATE_6, MaxDesire = RATE_1, MaxSupport = RATE_1;\n\tUCHAR MinSupport = RATE_54;\n\tULONG BasicRateBitmap = 0;\n\tUCHAR CurrBasicRate = RATE_1;\n\tUCHAR *pSupRate, SupRateLen, *pExtRate, ExtRateLen;\n\tHTTRANSMIT_SETTING *pHtPhy = NULL, *pMaxHtPhy = NULL, *pMinHtPhy = NULL;\n\tBOOLEAN *auto_rate_cur_p;\n\tUCHAR HtMcs = MCS_AUTO;\n\n\t/* find max desired rate*/\n\tUpdateBasicRateBitmap(pAd);\n\t\n\tnum = 0;\n\tauto_rate_cur_p = NULL;\n\tfor (i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++)\n\t{\n\t\tswitch (pAd->CommonCfg.DesireRate[i] & 0x7f)\n\t\t{\n\t\t\tcase 2:  Rate = RATE_1;   num++;   break;\n\t\t\tcase 4:  Rate = RATE_2;   num++;   break;\n\t\t\tcase 11: Rate = RATE_5_5; num++;   break;\n\t\t\tcase 22: Rate = RATE_11;  num++;   break;\n\t\t\tcase 12: Rate = RATE_6;   num++;   break;\n\t\t\tcase 18: Rate = RATE_9;   num++;   break;\n\t\t\tcase 24: Rate = RATE_12;  num++;   break;\n\t\t\tcase 36: Rate = RATE_18;  num++;   break;\n\t\t\tcase 48: Rate = RATE_24;  num++;   break;\n\t\t\tcase 72: Rate = RATE_36;  num++;   break;\n\t\t\tcase 96: Rate = RATE_48;  num++;   break;\n\t\t\tcase 108: Rate = RATE_54; num++;   break;\n\t\t\t/*default: Rate = RATE_1;   break;*/\n\t\t}\n\t\tif (MaxDesire < Rate)  MaxDesire = Rate;\n\t}\n\n/*===========================================================================*/\n/*===========================================================================*/\n\tdo\n\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\t\n\t\t\tUCHAR\tidx = apidx - MIN_NET_DEVICE_FOR_P2P_GO;\n\t\t\t\t\t\t\t\n\t\t\tpHtPhy = &pAd->ApCfg.MBSSID[idx].HTPhyMode;\t\n\t\t\tpMaxHtPhy = &pAd->ApCfg.MBSSID[idx].MaxHTPhyMode;\n\t\t\tpMinHtPhy = &pAd->ApCfg.MBSSID[idx].MinHTPhyMode;\n\n\t\t\tauto_rate_cur_p = &pAd->ApCfg.MBSSID[idx].bAutoTxRateSwitch;\t\n\t\t\tHtMcs = pAd->ApCfg.MBSSID[idx].DesiredTransmitSetting.field.MCS;\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n#ifdef APCLI_SUPPORT\t\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\t\t\t\n\t\t\tUCHAR idx = apidx - MIN_NET_DEVICE_FOR_APCLI;\n\t\t\t\n\t\t\tif (idx < MAX_APCLI_NUM)\n\t\t\t{\n\t\t\t\tpHtPhy = &pAd->ApCfg.ApCliTab[idx].HTPhyMode;\t\n\t\t\t\tpMaxHtPhy = &pAd->ApCfg.ApCliTab[idx].MaxHTPhyMode;\n\t\t\t\tpMinHtPhy = &pAd->ApCfg.ApCliTab[idx].MinHTPhyMode;\n\n\t\t\t\tauto_rate_cur_p = &pAd->ApCfg.ApCliTab[idx].bAutoTxRateSwitch;\t\n\t\t\t\tHtMcs = pAd->ApCfg.ApCliTab[idx].DesiredTransmitSetting.field.MCS;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): invalid idx(%d)\\n\", __FUNCTION__, idx));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\n\t\t\tif ((apidx < pAd->ApCfg.BssidNum) &&\n\t\t\t\t(apidx < MAX_MBSSID_NUM(pAd)) &&\n\t\t\t\t(apidx < HW_BEACON_MAX_NUM))\n\t\t\t{\t\t\t\t\t\t\t\t\n\t\t\t\tpHtPhy = &pAd->ApCfg.MBSSID[apidx].HTPhyMode;\n\t\t\t\tpMaxHtPhy = &pAd->ApCfg.MBSSID[apidx].MaxHTPhyMode;\n\t\t\t\tpMinHtPhy = &pAd->ApCfg.MBSSID[apidx].MinHTPhyMode;\n\n\t\t\t\tauto_rate_cur_p = &pAd->ApCfg.MBSSID[apidx].bAutoTxRateSwitch;\n\t\t\t\tHtMcs = pAd->ApCfg.MBSSID[apidx].DesiredTransmitSetting.field.MCS;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): invalid apidx(%d)\\n\", __FUNCTION__, apidx));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpHtPhy = &pAd->StaCfg.HTPhyMode;\n\t\t\tpMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode;\n\t\t\tpMinHtPhy = &pAd->StaCfg.MinHTPhyMode;\t\n\n\t\t\tauto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;\n\t\t\tHtMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;\n\n\t\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\tWMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B) &&\n\t\t\t\t(MaxDesire > RATE_11))\n\t\t\t{\n\t\t\t\tMaxDesire = RATE_11;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t} while(FALSE);\n\n\tpAd->CommonCfg.MaxDesiredRate = MaxDesire;\n\n\tif (pMinHtPhy == NULL)\n\t\treturn;\n\tpMinHtPhy->word = 0;\n\tpMaxHtPhy->word = 0;\n\tpHtPhy->word = 0;\n\n\t/*\n\t\tAuto rate switching is enabled only if more than one DESIRED RATES are\n\t\tspecified; otherwise disabled\n\t*/\n\tif (num <= 1)\n\t\t*auto_rate_cur_p = FALSE;\n\telse\n\t\t*auto_rate_cur_p = TRUE;\n\n\tif (HtMcs != MCS_AUTO)\n\t\t*auto_rate_cur_p = FALSE;\n\telse\n\t\t*auto_rate_cur_p = TRUE;\n\n#ifdef CONFIG_STA_SUPPORT\n\tif ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)\n#ifdef P2P_SUPPORT\n\t\t&& (apidx == MIN_NET_DEVICE_FOR_MBSSID)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\tpSupRate = &pAd->StaActive.SupRate[0];\n\t\tpExtRate = &pAd->StaActive.ExtRate[0];\n\t\tSupRateLen = pAd->StaActive.SupRateLen;\n\t\tExtRateLen = pAd->StaActive.ExtRateLen;\n\t}\n\telse\n#endif /* CONFIG_STA_SUPPORT */\t\n\t{\n\t\tpSupRate = &pAd->CommonCfg.SupRate[0];\n\t\tpExtRate = &pAd->CommonCfg.ExtRate[0];\n\t\tSupRateLen = pAd->CommonCfg.SupRateLen;\n\t\tExtRateLen = pAd->CommonCfg.ExtRateLen;\n\t}\n\n\t/* find max supported rate*/\n\tfor (i=0; i<SupRateLen; i++)\n\t{\n\t\tswitch (pSupRate[i] & 0x7f)\n\t\t{\n\t\t\tcase 2:   Rate = RATE_1;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 0;\t break;\n\t\t\tcase 4:   Rate = RATE_2;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 1;\t break;\n\t\t\tcase 11:  Rate = RATE_5_5;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 2;\t break;\n\t\t\tcase 22:  Rate = RATE_11;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 3;\t break;\n\t\t\tcase 12:  Rate = RATE_6;\t/*if (pSupRate[i] & 0x80)*/  BasicRateBitmap |= 1 << 4;  break;\n\t\t\tcase 18:  Rate = RATE_9;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 5;\t break;\n\t\t\tcase 24:  Rate = RATE_12;\t/*if (pSupRate[i] & 0x80)*/  BasicRateBitmap |= 1 << 6;  break;\n\t\t\tcase 36:  Rate = RATE_18;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 7;\t break;\n\t\t\tcase 48:  Rate = RATE_24;\t/*if (pSupRate[i] & 0x80)*/  BasicRateBitmap |= 1 << 8;  break;\n\t\t\tcase 72:  Rate = RATE_36;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 9;\t break;\n\t\t\tcase 96:  Rate = RATE_48;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 10;\t break;\n\t\t\tcase 108: Rate = RATE_54;\tif (pSupRate[i] & 0x80) BasicRateBitmap |= 1 << 11;\t break;\n\t\t\tdefault:  Rate = RATE_1;\tbreak;\n\t\t}\n\t\t\n\t\tif (MaxSupport < Rate)\n\t\t\tMaxSupport = Rate;\n\n\t\tif (MinSupport > Rate)\n\t\t\tMinSupport = Rate;\n\t}\n\t\n\tfor (i=0; i<ExtRateLen; i++)\n\t{\n\t\tswitch (pExtRate[i] & 0x7f)\n\t\t{\n\t\t\tcase 2:   Rate = RATE_1;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 0;\t break;\n\t\t\tcase 4:   Rate = RATE_2;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 1;\t break;\n\t\t\tcase 11:  Rate = RATE_5_5;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 2;\t break;\n\t\t\tcase 22:  Rate = RATE_11;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 3;\t break;\n\t\t\tcase 12:  Rate = RATE_6;\t/*if (pExtRate[i] & 0x80)*/  BasicRateBitmap |= 1 << 4;  break;\n\t\t\tcase 18:  Rate = RATE_9;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 5;\t break;\n\t\t\tcase 24:  Rate = RATE_12;\t/*if (pExtRate[i] & 0x80)*/  BasicRateBitmap |= 1 << 6;  break;\n\t\t\tcase 36:  Rate = RATE_18;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 7;\t break;\n\t\t\tcase 48:  Rate = RATE_24;\t/*if (pExtRate[i] & 0x80)*/  BasicRateBitmap |= 1 << 8;  break;\n\t\t\tcase 72:  Rate = RATE_36;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 9;\t break;\n\t\t\tcase 96:  Rate = RATE_48;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 10;\t break;\n\t\t\tcase 108: Rate = RATE_54;\tif (pExtRate[i] & 0x80) BasicRateBitmap |= 1 << 11;\t break;\n\t\t\tdefault:  Rate = RATE_1;\n\t\t\t\tbreak;\n\t\t}\n\t\tif (MaxSupport < Rate)\n\t\t\tMaxSupport = Rate;\n\n\t\tif (MinSupport > Rate)\n\t\t\tMinSupport = Rate;\n\t}\n\n\tRTMP_IO_WRITE32(pAd, LEGACY_BASIC_RATE, BasicRateBitmap);\n\t\n\tfor (i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++)\n\t{\n\t\tif (BasicRateBitmap & (0x01 << i))\n\t\t\tCurrBasicRate = (UCHAR)i;\n\t\tpAd->CommonCfg.ExpectedACKRate[i] = CurrBasicRate;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s():[MaxSupport = %d] = MaxDesire %d Mbps\\n\",\n\t\t\t\t__FUNCTION__, RateIdToMbps[MaxSupport], RateIdToMbps[MaxDesire]));\n\t/* max tx rate = min {max desire rate, max supported rate}*/\n\tif (MaxSupport < MaxDesire)\n\t\tpAd->CommonCfg.MaxTxRate = MaxSupport;\n\telse\n\t\tpAd->CommonCfg.MaxTxRate = MaxDesire;\n\n\tpAd->CommonCfg.MinTxRate = MinSupport;\n\t/*\n\t\t2003-07-31 john - 2500 doesn't have good sensitivity at high OFDM rates. to increase the success\n\t\tratio of initial DHCP packet exchange, TX rate starts from a lower rate depending\n\t\ton average RSSI\n\t\t\t1. RSSI >= -70db, start at 54 Mbps (short distance)\n\t\t\t2. -70 > RSSI >= -75, start at 24 Mbps (mid distance)\n\t\t\t3. -75 > RSSI, start at 11 Mbps (long distance)\n\t*/\n\tif (*auto_rate_cur_p)\n\t{\n\t\tshort dbm = 0;\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\tdbm = pAd->StaCfg.RssiSample.AvgRssi0 - pAd->BbpRssiToDbmDelta;\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\tdbm =0;\n#endif /* CONFIG_AP_SUPPORT */\n\t\tif (bLinkUp == TRUE)\n\t\t\tpAd->CommonCfg.TxRate = RATE_24;\n\t\telse\n\t\t\tpAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate; \n\n\t\tif (dbm < -75)\n\t\t\tpAd->CommonCfg.TxRate = RATE_11;\n\t\telse if (dbm < -70)\n\t\t\tpAd->CommonCfg.TxRate = RATE_24;\n\n\t\t/* should never exceed MaxTxRate (consider 11B-only mode)*/\n\t\tif (pAd->CommonCfg.TxRate > pAd->CommonCfg.MaxTxRate)\n\t\t\tpAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate; \n\n\t\tpAd->CommonCfg.TxRateIndex = 0;\n\n\t}\n\telse\n\t{\n\t\tpAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;\n\n\t\t/* Choose the Desire Tx MCS in CCK/OFDM mode */\n\t\tif (num > RATE_6)\n\t\t{\n\t\t\tif (HtMcs <= MCS_7)\t\t\n\t\t\t\tMaxDesire = RxwiMCSToOfdmRate[HtMcs];\n\t\t\telse\n\t\t\t\tMaxDesire = MinSupport;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (HtMcs <= MCS_3)\t\t\n\t\t\t\tMaxDesire = HtMcs;\n\t\t\telse\n\t\t\t\tMaxDesire = MinSupport;\n\t\t}\n\t\t\n\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC = pHtPhy->field.STBC;\n\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI = pHtPhy->field.ShortGI;\n\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS = pHtPhy->field.MCS;\n\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE\t= pHtPhy->field.MODE;\n\n\t}\n\n\tif (pAd->CommonCfg.TxRate <= RATE_11)\n\t{\n\t\tpMaxHtPhy->field.MODE = MODE_CCK;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpMaxHtPhy->field.MCS = pAd->CommonCfg.TxRate;\n\t\t\tpMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tpMaxHtPhy->field.MCS = MaxDesire;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\t\n#ifdef P2P_SUPPORT\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\tpMaxHtPhy->field.MCS = MaxDesire;\n#endif /* P2P_SUPPORT */\t\n\n\t}\n\telse\n\t{\n\t\tpMaxHtPhy->field.MODE = MODE_OFDM;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpMaxHtPhy->field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.TxRate];\n\t\t\tif (pAd->CommonCfg.MinTxRate >= RATE_6 && (pAd->CommonCfg.MinTxRate <= RATE_54))\n\t\t\t\tpMinHtPhy->field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MinTxRate];\n\t\t\telse\n\t\t\t\tpMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tpMaxHtPhy->field.MCS = OfdmRateToRxwiMCS[MaxDesire];\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\t\t\t\t\n\n#ifdef P2P_SUPPORT\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\tpMaxHtPhy->field.MCS = OfdmRateToRxwiMCS[MaxDesire];\n#endif /* P2P_SUPPORT */\n\t}\n\n\tpHtPhy->word = (pMaxHtPhy->word);\n\tif (bLinkUp && (pAd->OpMode == OPMODE_STA))\n\t{\n\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.word = pHtPhy->word;\n\t\tpAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word = pMaxHtPhy->word;\n\t\tpAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word = pMinHtPhy->word;\n\t}\n\telse\n\t{\n\t\tif (WMODE_CAP(pAd->CommonCfg.PhyMode, WMODE_B) &&\n\t\t\tpAd->CommonCfg.Channel <= 14)\n\t\t{\n\t\t\tpAd->CommonCfg.MlmeRate = RATE_1;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;\t\t\t\t\n\t\t\tpAd->CommonCfg.RtsRate = RATE_11;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.MlmeRate = RATE_6;\n\t\t\tpAd->CommonCfg.RtsRate = RATE_6;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t\t}\n\t\t\n\t\t/* Keep Basic Mlme Rate.*/\n\t\tpAd->MacTab.Content[MCAST_WCID].HTPhyMode.word = pAd->CommonCfg.MlmeTransmit.word;\n\t\tif (pAd->CommonCfg.MlmeTransmit.field.MODE == MODE_OFDM)\n\t\t\tpAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[RATE_24];\n\t\telse\n\t\t\tpAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS = RATE_1;\n\t\tpAd->CommonCfg.BasicMlmeRate = pAd->CommonCfg.MlmeRate;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MCAST_RATE_SPECIFIC\n\t\t{\n\t\t\t/* set default value if MCastPhyMode is not initialized */\t\n\t\t\tHTTRANSMIT_SETTING tPhyMode;\n\n\t\t\tmemset(&tPhyMode, 0, sizeof(HTTRANSMIT_SETTING));\n\t\t\tif (memcmp(&pAd->CommonCfg.MCastPhyMode, &tPhyMode, sizeof(HTTRANSMIT_SETTING)) == 0)\n\t\t\t{\n\t\t\t\tmemmove(&pAd->CommonCfg.MCastPhyMode, &pAd->MacTab.Content[MCAST_WCID].HTPhyMode,\n\t\t\t\t\t\t\tsizeof(HTTRANSMIT_SETTING));\n\t\t\t}\n\t\t}\n#endif /* MCAST_RATE_SPECIFIC */\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\" %s(): (MaxDesire=%d, MaxSupport=%d, MaxTxRate=%d, MinRate=%d, Rate Switching =%d)\\n\", \n\t\t\t\t__FUNCTION__, RateIdToMbps[MaxDesire], RateIdToMbps[MaxSupport],\n\t\t\t\tRateIdToMbps[pAd->CommonCfg.MaxTxRate],\n\t\t\t\tRateIdToMbps[pAd->CommonCfg.MinTxRate], \n\t\t\t /*OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)*/*auto_rate_cur_p));\n\tDBGPRINT(RT_DEBUG_TRACE, (\" %s(): (TxRate=%d, RtsRate=%d, BasicRateBitmap=0x%04lx)\\n\", \n\t\t\t\t__FUNCTION__, RateIdToMbps[pAd->CommonCfg.TxRate],\n\t\t\t\tRateIdToMbps[pAd->CommonCfg.RtsRate], BasicRateBitmap));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): (MlmeTransmit=0x%x, MinHTPhyMode=%x, MaxHTPhyMode=0x%x, HTPhyMode=0x%x)\\n\", \n\t\t\t\t__FUNCTION__, pAd->CommonCfg.MlmeTransmit.word,\n\t\t\t\tpAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word,\n\t\t\t\tpAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word,\n\t\t\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.word ));\n}\n\n#ifdef DOT11_N_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis function update HT Rate setting.\n\t\tInput Wcid value is valid for 2 case :\n\t\t1. it's used for Station in infra mode that copy AP rate to Mactable.\n\t\t2. OR Station \tin adhoc mode to copy peer's HT rate to Mactable. \n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID MlmeUpdateHtTxRates(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR apidx)\n{\n\tUCHAR StbcMcs;\n\tRT_HT_CAPABILITY *pRtHtCap = NULL;\n\tRT_PHY_INFO *pActiveHtPhy = NULL;\t\n\tULONG BasicMCS;\n\tRT_PHY_INFO *pDesireHtPhy = NULL;\n\tPHTTRANSMIT_SETTING pHtPhy = NULL;\n\tPHTTRANSMIT_SETTING pMaxHtPhy = NULL;\n\tPHTTRANSMIT_SETTING pMinHtPhy = NULL;\t\n\tBOOLEAN *auto_rate_cur_p;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s()===> \\n\", __FUNCTION__));\n\n\tauto_rate_cur_p = NULL;\n\n\tdo\n\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\t\t\n\t\t\tUCHAR\tidx = apidx - MIN_NET_DEVICE_FOR_P2P_GO;\n\n\t\t\tpDesireHtPhy\t= &pAd->ApCfg.MBSSID[idx].DesiredHtPhyInfo;\n\t\t\tpActiveHtPhy\t= &pAd->ApCfg.MBSSID[idx].DesiredHtPhyInfo;\n\t\t\tpHtPhy \t\t\t= &pAd->ApCfg.MBSSID[idx].HTPhyMode;\t\n\t\t\tpMaxHtPhy\t\t= &pAd->ApCfg.MBSSID[idx].MaxHTPhyMode;\n\t\t\tpMinHtPhy\t\t= &pAd->ApCfg.MBSSID[idx].MinHTPhyMode;\n\n\t\t\tauto_rate_cur_p = &pAd->ApCfg.MBSSID[idx].bAutoTxRateSwitch;\t\t\t\t\t\t\t\t\t\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef APCLI_SUPPORT\t\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\n\t\t\tUCHAR\tidx = apidx - MIN_NET_DEVICE_FOR_APCLI;\n\t\t\n\t\t\tif (idx < MAX_APCLI_NUM)\n\t\t\t{\n\t\t\t\tpDesireHtPhy\t= &pAd->ApCfg.ApCliTab[idx].DesiredHtPhyInfo;\n\t\t\t\tpActiveHtPhy\t= &pAd->ApCfg.ApCliTab[idx].DesiredHtPhyInfo;\n\t\t\t\tpHtPhy \t\t\t= &pAd->ApCfg.ApCliTab[idx].HTPhyMode;\t\n\t\t\t\tpMaxHtPhy\t\t= &pAd->ApCfg.ApCliTab[idx].MaxHTPhyMode;\n\t\t\t\tpMinHtPhy\t\t= &pAd->ApCfg.ApCliTab[idx].MinHTPhyMode;\n\n\t\t\t\tauto_rate_cur_p = &pAd->ApCfg.ApCliTab[idx].bAutoTxRateSwitch;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): invalid idx(%d)\\n\", __FUNCTION__, idx));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\n\t\t\tif ((apidx < pAd->ApCfg.BssidNum) && (apidx < HW_BEACON_MAX_NUM))\n\t\t\t{\t\t\n\t\t\t\tpDesireHtPhy\t= &pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo;\n\t\t\t\tpActiveHtPhy\t= &pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo;\n\t\t\t\tpHtPhy \t\t\t= &pAd->ApCfg.MBSSID[apidx].HTPhyMode;\t\n\t\t\t\tpMaxHtPhy\t\t= &pAd->ApCfg.MBSSID[apidx].MaxHTPhyMode;\n\t\t\t\tpMinHtPhy\t\t= &pAd->ApCfg.MBSSID[apidx].MinHTPhyMode;\n\n\t\t\t\tauto_rate_cur_p = &pAd->ApCfg.MBSSID[apidx].bAutoTxRateSwitch;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): invalid apidx(%d)\\n\", __FUNCTION__, apidx));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\t\t\n\t\t\tpDesireHtPhy\t= &pAd->StaCfg.DesiredHtPhyInfo;\n\t\t\tpActiveHtPhy\t= &pAd->StaCfg.DesiredHtPhyInfo;\n\t\t\tpHtPhy \t\t= &pAd->StaCfg.HTPhyMode;\n\t\t\tpMaxHtPhy\t= &pAd->StaCfg.MaxHTPhyMode;\n\t\t\tpMinHtPhy\t= &pAd->StaCfg.MinHTPhyMode;\t\t\n\n\t\t\tauto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;\n\t\t\tbreak;\n\t\t}\t\t\n#endif /* CONFIG_STA_SUPPORT */\n\t} while (FALSE);\n\n#ifdef CONFIG_STA_SUPPORT\t\n\tif ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)\n#ifdef P2P_SUPPORT\n\t\t&& (apidx == BSS0)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\tif (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)\n\t\t\treturn;\n\n\t\tpRtHtCap = &pAd->StaActive.SupportedHtPhy;\n\t\tpActiveHtPhy = &pAd->StaActive.SupportedPhyInfo;\n\t\tStbcMcs = (UCHAR)pAd->MlmeAux.AddHtInfo.AddHtInfo3.StbcMcs;\n\t\tBasicMCS =pAd->MlmeAux.AddHtInfo.MCSSet[0]+(pAd->MlmeAux.AddHtInfo.MCSSet[1]<<8)+(StbcMcs<<16);\n\t\tif ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC) && (pAd->Antenna.field.TxPath == 2))\n\t\t\tpMaxHtPhy->field.STBC = STBC_USE;\n\t\telse\n\t\t\tpMaxHtPhy->field.STBC = STBC_NONE;\n\t}\n\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t{\n\t\tif ((!pDesireHtPhy) || pDesireHtPhy->bHtEnable == FALSE)\n\t\t\treturn;\n\n\t\tpRtHtCap = &pAd->CommonCfg.DesiredHtPhy;\n\t\tStbcMcs = (UCHAR)pAd->CommonCfg.AddHTInfo.AddHtInfo3.StbcMcs;\n\t\tBasicMCS = pAd->CommonCfg.AddHTInfo.MCSSet[0]+(pAd->CommonCfg.AddHTInfo.MCSSet[1]<<8)+(StbcMcs<<16);\n\t\tif ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pAd->Antenna.field.TxPath >= 2))\n\t\t\tpMaxHtPhy->field.STBC = STBC_USE;\n\t\telse\n\t\t\tpMaxHtPhy->field.STBC = STBC_NONE;\n\t}\n\n\t/* Decide MAX ht rate.*/\n\tif ((pRtHtCap->GF) && (pAd->CommonCfg.DesiredHtPhy.GF))\n\t\tpMaxHtPhy->field.MODE = MODE_HTGREENFIELD;\n\telse\n\t\tpMaxHtPhy->field.MODE = MODE_HTMIX;\n\n    if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth) && (pRtHtCap->ChannelWidth))\n\t\tpMaxHtPhy->field.BW = BW_40;\n\telse\n\t\tpMaxHtPhy->field.BW = BW_20;\n\n    if (pMaxHtPhy->field.BW == BW_20)\n\t\tpMaxHtPhy->field.ShortGI = (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 & pRtHtCap->ShortGIfor20);\n\telse\n\t\tpMaxHtPhy->field.ShortGI = (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 & pRtHtCap->ShortGIfor40);\n\n\tif (pDesireHtPhy->MCSSet[4] != 0)\n\t{\n\t\tpMaxHtPhy->field.MCS = 32;\t\n\t}\n\n\tpMaxHtPhy->field.MCS = get_ht_max_mcs(pAd, &pDesireHtPhy->MCSSet[0],\n\t\t\t\t\t\t\t\t\t\t\t&pActiveHtPhy->MCSSet[0]);\n\n\t/* Copy MIN ht rate.  rt2860???*/\n\tpMinHtPhy->field.BW = BW_20;\n\tpMinHtPhy->field.MCS = 0;\n\tpMinHtPhy->field.STBC = 0;\n\tpMinHtPhy->field.ShortGI = 0;\n\t/*If STA assigns fixed rate. update to fixed here.*/\n#ifdef CONFIG_STA_SUPPORT\n\tif ( (pAd->OpMode == OPMODE_STA) && (pDesireHtPhy->MCSSet[0] != 0xff)\n#ifdef P2P_SUPPORT\n\t\t&& (apidx == BSS0)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\tCHAR i;\n\t\tUCHAR j, bitmask;\n\t\t\n\t\tif (pDesireHtPhy->MCSSet[4] != 0)\n\t\t{\n\t\t\tpMaxHtPhy->field.MCS = 32;\n\t\t\tpMinHtPhy->field.MCS = 32;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%s():<=== Use Fixed MCS = %d\\n\",__FUNCTION__, pMinHtPhy->field.MCS));\n\t\t}\n\n\t\tfor (i=23; (CHAR)i >= 0; i--)\n\t\t{\t\n\t\t\tj = i/8;\t\n\t\t\tbitmask = (1<<(i-(j*8)));\n\t\t\tif ( (pDesireHtPhy->MCSSet[j] & bitmask) && (pActiveHtPhy->MCSSet[j] & bitmask))\n\t\t\t{\n\t\t\t\tpMaxHtPhy->field.MCS = i;\n\t\t\t\tpMinHtPhy->field.MCS = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (i==0)\n\t\t\t\tbreak;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\t\n\t/* Decide ht rate*/\n\tpHtPhy->field.STBC = pMaxHtPhy->field.STBC;\n\tpHtPhy->field.BW = pMaxHtPhy->field.BW;\n\tpHtPhy->field.MODE = pMaxHtPhy->field.MODE;\n\tpHtPhy->field.MCS = pMaxHtPhy->field.MCS;\n\tpHtPhy->field.ShortGI = pMaxHtPhy->field.ShortGI;\n\n\t/* use default now. rt2860*/\n\tif (pDesireHtPhy->MCSSet[0] != 0xff)\n\t\t*auto_rate_cur_p = FALSE;\n\telse\n\t\t*auto_rate_cur_p = TRUE;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\" %s():<---.AMsduSize = %d  \\n\", __FUNCTION__, pAd->CommonCfg.DesiredHtPhy.AmsduSize ));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"TX: MCS[0] = %x (choose %d), BW = %d, ShortGI = %d, MODE = %d,  \\n\", pActiveHtPhy->MCSSet[0],pHtPhy->field.MCS,\n\t\tpHtPhy->field.BW, pHtPhy->field.ShortGI, pHtPhy->field.MODE));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s():<=== \\n\", __FUNCTION__));\n}\n\n\nVOID BATableInit(\n\tIN PRTMP_ADAPTER pAd, \n    IN BA_TABLE *Tab) \n{\n\tint i;\n\n\tTab->numAsOriginator = 0;\n\tTab->numAsRecipient = 0;\n\tTab->numDoneOriginator = 0;\n\tNdisAllocateSpinLock(pAd, &pAd->BATabLock);\n\tfor (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++) \n\t{\n\t\tTab->BARecEntry[i].REC_BA_Status = Recipient_NONE;\n\t\tNdisAllocateSpinLock(pAd, &(Tab->BARecEntry[i].RxReRingLock));\n\t}\n\tfor (i = 0; i < MAX_LEN_OF_BA_ORI_TABLE; i++) \n\t{\n\t\tTab->BAOriEntry[i].ORI_BA_Status = Originator_NONE;\n\t}\n}\n\nVOID BATableExit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tint i;\n\t\n\tfor(i=0; i<MAX_LEN_OF_BA_REC_TABLE; i++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->BATable.BARecEntry[i].RxReRingLock);\n\t}\n\tNdisFreeSpinLock(&pAd->BATabLock);\n}\n#endif /* DOT11_N_SUPPORT */\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID MlmeRadioOff(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tRTMP_MLME_RADIO_OFF(pAd);\n}\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID MlmeRadioOn(\n\tIN PRTMP_ADAPTER pAd)\n{\t\n\tRTMP_MLME_RADIO_ON(pAd);\n}\n\n/*\n===========================================================================================\n\tbss_table.c\n===========================================================================================\n*/\n\n\n/*! \\brief initialize BSS table\n *\t\\param p_tab pointer to the table\n *\t\\return none\n *\t\\pre\n *\t\\post\n\n IRQL = PASSIVE_LEVEL\n IRQL = DISPATCH_LEVEL\n  \n */\nVOID BssTableInit(BSS_TABLE *Tab) \n{\n\tint i;\n\n\tTab->BssNr = 0;\n\tTab->BssOverlapNr = 0;\n\n\tfor (i = 0; i < MAX_LEN_OF_BSS_TABLE; i++) \n\t{\n\t\tUCHAR *pOldAddr = Tab->BssEntry[i].pVarIeFromProbRsp;\n\n\t\tNdisZeroMemory(&Tab->BssEntry[i], sizeof(BSS_ENTRY));\n\n\t\tTab->BssEntry[i].Rssi = -127;\t/* initial the rssi as a minimum value */\n\t\tif (pOldAddr)\n\t\t{\n\t\t\tRTMPZeroMemory(pOldAddr, MAX_VIE_LEN);\n\t\t\tTab->BssEntry[i].pVarIeFromProbRsp = pOldAddr;\n\t\t}\n\t}\n}\n\n\n/*! \\brief search the BSS table by SSID\n *\t\\param p_tab pointer to the bss table\n *\t\\param ssid SSID string \n *\t\\return index of the table, BSS_NOT_FOUND if not in the table\n *\t\\pre\n *\t\\post\n *\t\\note search by sequential search\n\n IRQL = DISPATCH_LEVEL\n\n */\nULONG BssTableSearch(\n\tIN BSS_TABLE *Tab, \n\tIN PUCHAR\t pBssid,\n\tIN UCHAR\t Channel) \n{\n\tUCHAR i;\n\n\tfor (i = 0; i < Tab->BssNr; i++) \n\t{\n\t\t\n\t\t/*\n\t\t\tSome AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G.\n\t\t\tWe should distinguish this case.\n\t\t*/\n\t\tif ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||\n\t\t\t ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) &&\n\t\t\tMAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid)) \n\t\t{ \n\t\t\treturn i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n\nULONG BssSsidTableSearch(\n\tIN BSS_TABLE *Tab, \n\tIN PUCHAR\t pBssid,\n\tIN PUCHAR\t pSsid,\n\tIN UCHAR\t SsidLen,\n\tIN UCHAR\t Channel) \n{\n\tUCHAR i;\n\n\tfor (i = 0; i < Tab->BssNr; i++) \n\t{\n\t\t\n\t\t/* Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G.*/\n\t\t/* We should distinguish this case.*/\n\t\t/*\t\t*/\n\t\tif ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||\n\t\t\t ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) &&\n\t\t\tMAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid) &&\n\t\t\tSSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, Tab->BssEntry[i].SsidLen)) \n\t\t{ \n\t\t\treturn i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n\nULONG BssTableSearchWithSSID(\n\tIN BSS_TABLE *Tab, \n\tIN PUCHAR\t Bssid,\n\tIN PUCHAR\t pSsid,\n\tIN UCHAR\t SsidLen,\n\tIN UCHAR\t Channel)\n{\n\tUCHAR i;\n\n\tfor (i = 0; i < Tab->BssNr; i++) \n\t{\n\t\tif ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||\n\t\t\t((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) &&\n\t\t\tMAC_ADDR_EQUAL(&(Tab->BssEntry[i].Bssid), Bssid) &&\n\t\t\t(SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, Tab->BssEntry[i].SsidLen) ||\n\t\t\t(NdisEqualMemory(pSsid, ZeroSsid, SsidLen)) || \n\t\t\t(NdisEqualMemory(Tab->BssEntry[i].Ssid, ZeroSsid, Tab->BssEntry[i].SsidLen))))\n\t\t{ \n\t\t\treturn i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n\n\nULONG BssSsidTableSearchBySSID(\n\tIN BSS_TABLE *Tab,\n\tIN PUCHAR\t pSsid,\n\tIN UCHAR\t SsidLen)\n{\n\tUCHAR i;\n\n\tfor (i = 0; i < Tab->BssNr; i++) \n\t{\n\t\tif (SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, Tab->BssEntry[i].SsidLen)) \n\t\t{ \n\t\t\treturn i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID BssTableDeleteEntry(\n\tIN OUT\tBSS_TABLE *Tab, \n\tIN\t\tPUCHAR\t  pBssid,\n\tIN\t\tUCHAR\t  Channel)\n{\n\tUCHAR i, j;\n\n\tfor (i = 0; i < Tab->BssNr; i++) \n\t{\n\t\tif ((Tab->BssEntry[i].Channel == Channel) && \n\t\t\t(MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid)))\n\t\t{\n\t\t\tUCHAR *pOldAddr = NULL;\n\t\t\t\n\t\t\tfor (j = i; j < Tab->BssNr - 1; j++)\n\t\t\t{\n\t\t\t\tpOldAddr = Tab->BssEntry[j].pVarIeFromProbRsp;\n\t\t\t\tNdisMoveMemory(&(Tab->BssEntry[j]), &(Tab->BssEntry[j + 1]), sizeof(BSS_ENTRY));\n\t\t\t\tif (pOldAddr)\n\t\t\t\t{\n\t\t\t\t\tRTMPZeroMemory(pOldAddr, MAX_VIE_LEN);\n\t\t\t\t\tNdisMoveMemory(pOldAddr, \n\t\t\t\t\t\t\t\t   Tab->BssEntry[j + 1].pVarIeFromProbRsp, \n\t\t\t\t\t\t\t\t   Tab->BssEntry[j + 1].VarIeFromProbeRspLen);\n\t\t\t\t\tTab->BssEntry[j].pVarIeFromProbRsp = pOldAddr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpOldAddr = Tab->BssEntry[Tab->BssNr - 1].pVarIeFromProbRsp;\n\t\t\tNdisZeroMemory(&(Tab->BssEntry[Tab->BssNr - 1]), sizeof(BSS_ENTRY));\n\t\t\tif (pOldAddr)\n\t\t\t{\n\t\t\t\tRTMPZeroMemory(pOldAddr, MAX_VIE_LEN);\n\t\t\t\tTab->BssEntry[Tab->BssNr - 1].pVarIeFromProbRsp = pOldAddr;\n\t\t\t}\n\t\t\t\n\t\t\tTab->BssNr -= 1;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\n/*! \\brief\n *\t\\param \n *\t\\return\n *\t\\pre\n *\t\\post\n\t \n IRQL = DISPATCH_LEVEL\n \n */\nVOID BssEntrySet(\n\tIN PRTMP_ADAPTER\tpAd, \n\tOUT BSS_ENTRY *pBss, \n\tIN BCN_IE_LIST *ie_list,\n\tIN CHAR Rssi,\n\tIN USHORT LengthVIE,\t\n\tIN PNDIS_802_11_VARIABLE_IEs pVIE) \n{\n\tCOPY_MAC_ADDR(pBss->Bssid, ie_list->Bssid);\n\t/* Default Hidden SSID to be TRUE, it will be turned to FALSE after coping SSID*/\n\tpBss->Hidden = 1;\t\n\tif (ie_list->SsidLen > 0)\n\t{\n\t\t/* For hidden SSID AP, it might send beacon with SSID len equal to 0*/\n\t\t/* Or send beacon /probe response with SSID len matching real SSID length,*/\n\t\t/* but SSID is all zero. such as \"00-00-00-00\" with length 4.*/\n\t\t/* We have to prevent this case overwrite correct table*/\n\t\tif (NdisEqualMemory(ie_list->Ssid, ZeroSsid, ie_list->SsidLen) == 0)\n\t\t{\n\t\t\tNdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pBss->Ssid, ie_list->Ssid, ie_list->SsidLen);\n\t\t\tpBss->SsidLen = ie_list->SsidLen;\n\t\t\tpBss->Hidden = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* avoid  Hidden SSID form beacon to overwirite correct SSID from probe response */\n\t\tif (NdisEqualMemory(pBss->Ssid, ZeroSsid, pBss->SsidLen))\n\t\t{\n\t\t\tNdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID);\n\t\t\tpBss->SsidLen = 0;\n\t\t}\n\t}\n\t\n\tpBss->BssType = ie_list->BssType;\n\tpBss->BeaconPeriod = ie_list->BeaconPeriod;\n\tif (ie_list->BssType == BSS_INFRA) \n\t{\n\t\tif (ie_list->CfParm.bValid) \n\t\t{\n\t\t\tpBss->CfpCount = ie_list->CfParm.CfpCount;\n\t\t\tpBss->CfpPeriod = ie_list->CfParm.CfpPeriod;\n\t\t\tpBss->CfpMaxDuration = ie_list->CfParm.CfpMaxDuration;\n\t\t\tpBss->CfpDurRemaining = ie_list->CfParm.CfpDurRemaining;\n\t\t}\n\t} \n\telse \n\t{\n\t\tpBss->AtimWin = ie_list->AtimWin;\n\t}\n\n\tNdisGetSystemUpTime(&pBss->LastBeaconRxTime);\n\tpBss->CapabilityInfo = ie_list->CapabilityInfo;\n\t/* The privacy bit indicate security is ON, it maight be WEP, TKIP or AES*/\n\t/* Combine with AuthMode, they will decide the connection methods.*/\n\tpBss->Privacy = CAP_IS_PRIVACY_ON(pBss->CapabilityInfo);\n\tASSERT(ie_list->SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES);\n\tif (ie_list->SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES)\t\t\n\t\tNdisMoveMemory(pBss->SupRate, ie_list->SupRate, ie_list->SupRateLen);\n\telse\t\t\n\t\tNdisMoveMemory(pBss->SupRate, ie_list->SupRate, MAX_LEN_OF_SUPPORTED_RATES);\t\n\tpBss->SupRateLen = ie_list->SupRateLen;\n\tASSERT(ie_list->ExtRateLen <= MAX_LEN_OF_SUPPORTED_RATES);\n\tif (ie_list->ExtRateLen > MAX_LEN_OF_SUPPORTED_RATES)\n\t\tie_list->ExtRateLen = MAX_LEN_OF_SUPPORTED_RATES;\n\tNdisMoveMemory(pBss->ExtRate, ie_list->ExtRate, ie_list->ExtRateLen);\n\tpBss->NewExtChanOffset = ie_list->NewExtChannelOffset;\n\tpBss->ExtRateLen = ie_list->ExtRateLen;\n\tpBss->Channel = ie_list->Channel;\n\tpBss->CentralChannel = ie_list->Channel;\n\tpBss->Rssi = Rssi;\n\t/* Update CkipFlag. if not exists, the value is 0x0*/\n\tpBss->CkipFlag = ie_list->CkipFlag;\n\n\t/* New for microsoft Fixed IEs*/\n\tNdisMoveMemory(pBss->FixIEs.Timestamp, &ie_list->TimeStamp, 8);\n\tpBss->FixIEs.BeaconInterval = ie_list->BeaconPeriod;\n\tpBss->FixIEs.Capabilities = ie_list->CapabilityInfo;\n\n\t/* New for microsoft Variable IEs*/\n\tif (LengthVIE != 0)\n\t{\n\t\tpBss->VarIELen = LengthVIE;\n\t\tNdisMoveMemory(pBss->VarIEs, pVIE, pBss->VarIELen);\n\t}\n\telse\n\t{\n\t\tpBss->VarIELen = 0;\n\t}\n\n\tpBss->AddHtInfoLen = 0;\n\tpBss->HtCapabilityLen = 0;\n#ifdef DOT11_N_SUPPORT\n\tif (ie_list->HtCapabilityLen> 0)\n\t{\n\t\tpBss->HtCapabilityLen = ie_list->HtCapabilityLen;\n\t\tNdisMoveMemory(&pBss->HtCapability, &ie_list->HtCapability, ie_list->HtCapabilityLen);\n\t\tif (ie_list->AddHtInfoLen > 0)\n\t\t{\n\t\t\tpBss->AddHtInfoLen = ie_list->AddHtInfoLen;\n\t\t\tNdisMoveMemory(&pBss->AddHtInfo, &ie_list->AddHtInfo, ie_list->AddHtInfoLen);\n\n\t\t\tpBss->CentralChannel = get_cent_ch_by_htinfo(pAd, &ie_list->AddHtInfo,\n\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability);\n\t\t}\n\n#ifdef DOT11_VHT_AC\n\t\tif (ie_list->vht_cap_len) {\n\t\t\tNdisMoveMemory(&pBss->vht_cap_ie, &ie_list->vht_cap_ie, ie_list->vht_cap_len);\n\t\t\tpBss->vht_cap_len = ie_list->vht_cap_len;\n\t\t}\n\t\t\n\t\tif (ie_list->vht_op_len) {\n\t\t\tVHT_OP_IE *vht_op;\n\t\t\t\t\t\n\t\t\tNdisMoveMemory(&pBss->vht_op_ie, &ie_list->vht_op_ie, ie_list->vht_op_len);\n\t\t\tpBss->vht_op_len = ie_list->vht_op_len;\n\t\t\tvht_op = &ie_list->vht_op_ie;\n\t\t\tif ((vht_op->vht_op_info.ch_width > 0) &&\n\t\t\t\t(ie_list->AddHtInfo.AddHtInfo.ExtChanOffset != EXTCHA_NONE) &&\n\t\t\t\t(ie_list->HtCapability.HtCapInfo.ChannelWidth == BW_40) &&\n\t\t\t\t(pBss->CentralChannel != ie_list->AddHtInfo.ControlChan))\n\t\t\t{\n\t\t\t\tUCHAR cent_ch;\n\t\t\t\t\n\t\t\t\tcent_ch = vht_cent_ch_freq(pAd, ie_list->AddHtInfo.ControlChan);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():VHT cent_ch=%d, vht_op_info->center_freq_1=%d, Bss->CentralChannel=%d, change from CentralChannel to cent_ch!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t__FUNCTION__, cent_ch, vht_op->vht_op_info.center_freq_1, pBss->CentralChannel));\n\t\t\t\tpBss->CentralChannel = vht_op->vht_op_info.center_freq_1;\n\t\t\t}\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tBssCipherParse(pBss);\n\n\t/* new for QOS*/\n\tif (ie_list->EdcaParm.bValid)\n\t\tNdisMoveMemory(&pBss->EdcaParm, &ie_list->EdcaParm, sizeof(EDCA_PARM));\n\telse\n\t\tpBss->EdcaParm.bValid = FALSE;\n\tif (ie_list->QosCapability.bValid)\n\t\tNdisMoveMemory(&pBss->QosCapability, &ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM));\n\telse\n\t\tpBss->QosCapability.bValid = FALSE;\n\tif (ie_list->QbssLoad.bValid)\n\t\tNdisMoveMemory(&pBss->QbssLoad, &ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM));\n\telse\n\t\tpBss->QbssLoad.bValid = FALSE;\n\n\t{\n\t\tPEID_STRUCT     pEid;\n\t\tUSHORT          Length = 0;\n\n#ifdef WSC_INCLUDED\n\t\tpBss->WpsAP = 0x00;\n\t\tpBss->WscDPIDFromWpsAP = 0xFFFF;\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tNdisZeroMemory(&pBss->WpaIE.IE[0], MAX_CUSTOM_LEN);\n\t\tNdisZeroMemory(&pBss->RsnIE.IE[0], MAX_CUSTOM_LEN);\n\t\tNdisZeroMemory(&pBss->WpsIE.IE[0], MAX_CUSTOM_LEN);\n\t\tpBss->WpaIE.IELen = 0;\n\t\tpBss->RsnIE.IELen = 0;\n\t\tpBss->WpsIE.IELen = 0;\n#ifdef WAPI_SUPPORT\n\t\tNdisZeroMemory(&pBss->WapiIE.IE[0], MAX_CUSTOM_LEN);\n\t\tpBss->WapiIE.IELen = 0;\n#endif /* WAPI_SUPPORT */\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\tNdisZeroMemory(&pBss->CountryString[0], 3);\n\t\tpBss->bHasCountryIE = FALSE;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\n\t\tpEid = (PEID_STRUCT) pVIE;\n\t\twhile ((Length + 2 + (USHORT)pEid->Len) <= LengthVIE)    \n\t\t{\n#define WPS_AP\t\t0x01\n\t\t\tswitch(pEid->Eid)\n\t\t\t{\n\t\t\t\tcase IE_WPA:\n\t\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPS_OUI, 4)\n#ifdef IWSC_SUPPORT\n\t\t\t\t\t\t|| NdisEqualMemory(pEid->Octet, IWSC_OUI, 4)\n#endif /* IWSC_SUPPORT */\n\t\t\t\t\t\t)\n\t\t\t\t\t{\n#ifdef WSC_INCLUDED\n\t\t\t\t\t\tpBss->WpsAP |= WPS_AP;\n\t\t\t\t\t\tWscCheckWpsIeFromWpsAP(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t\tpEid, \n\t\t\t\t\t\t\t\t\t\t\t\t\t&pBss->WscDPIDFromWpsAP);\n#endif /* WSC_INCLUDED */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif ((pEid->Len + 2) > MAX_CUSTOM_LEN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpBss->WpsIE.IELen = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpBss->WpsIE.IELen = pEid->Len + 2;\n\t\t\t\t\t\tNdisMoveMemory(pBss->WpsIE.IE, pEid, pBss->WpsIE.IELen);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pEid->Len + 2) > MAX_CUSTOM_LEN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpBss->WpaIE.IELen = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpBss->WpaIE.IELen = pEid->Len + 2;\n\t\t\t\t\t\tNdisMoveMemory(pBss->WpaIE.IE, pEid, pBss->WpaIE.IELen);\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\tbreak;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tcase IE_RSN:\n\t\t\t\t\tif (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pEid->Len + 2) > MAX_CUSTOM_LEN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpBss->RsnIE.IELen = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpBss->RsnIE.IELen = pEid->Len + 2;\n\t\t\t\t\t\tNdisMoveMemory(pBss->RsnIE.IE, pEid, pBss->RsnIE.IELen);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n#ifdef WAPI_SUPPORT\n\t\t\t\tcase IE_WAPI:\n\t\t\t\t\tif (NdisEqualMemory(pEid->Octet + 4, WAPI_OUI, 3))\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR           idx;\n\t\t\t\t\t\tsnprintf((PSTRING) pBss->WapiIE.IE, sizeof(pBss->WapiIE.IE), \"wapi_ie=%02x%02x\", pEid->Eid, pEid->Len);\n\t\t\t\t\t\tfor (idx = 0; idx < pEid->Len; idx++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsnprintf((PSTRING) pBss->WapiIE.IE, sizeof(pBss->WapiIE.IE), \"%s%02x\", pBss->WapiIE.IE, (unsigned char)pEid->Octet[idx]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpBss->WapiIE.IELen = (pEid->Len*2) + 8; /* 2: ID(1 byte), LEN (1 byte), 8: len of \"wapi_ie=\"*/\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n#endif /* WAPI_SUPPORT */\n#ifdef EXT_BUILD_CHANNEL_LIST\t\t\t\t\t\n\t\t\t\tcase IE_COUNTRY:\t\t\t\t\t\n\t\t\t\t\tNdisMoveMemory(&pBss->CountryString[0], pEid->Octet, 3);\n\t\t\t\t\tpBss->bHasCountryIE = TRUE;\n\t\t\t\t\tbreak;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\t\t\tLength = Length + 2 + (USHORT)pEid->Len;  /* Eid[1] + Len[1]+ content[Len]*/\n\t\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t\t}\n\t}\n}\n\n\n\n/*! \n *\t\\brief insert an entry into the bss table\n *\t\\param p_tab The BSS table\n *\t\\param Bssid BSSID\n *\t\\param ssid SSID\n *\t\\param ssid_len Length of SSID\n *\t\\param bss_type\n *\t\\param beacon_period\n *\t\\param timestamp\n *\t\\param p_cf\n *\t\\param atim_win\n *\t\\param cap\n *\t\\param rates\n *\t\\param rates_len\n *\t\\param channel_idx\n *\t\\return none\n *\t\\pre\n *\t\\post\n *\t\\note If SSID is identical, the old entry will be replaced by the new one\n\t \n IRQL = DISPATCH_LEVEL\n \n */\nULONG BssTableSetEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT BSS_TABLE *Tab,\n\tIN BCN_IE_LIST *ie_list,\n\tIN CHAR Rssi,\n\tIN USHORT LengthVIE,\t\n\tIN PNDIS_802_11_VARIABLE_IEs pVIE)\n{\n\tULONG\tIdx;\n\n\n\tIdx = BssTableSearch(Tab, ie_list->Bssid, ie_list->Channel);\n\tif (Idx == BSS_NOT_FOUND) \n\t{\n\t\tif (Tab->BssNr >= MAX_LEN_OF_BSS_TABLE)\n\t    {\n\t\t\t/*\n\t\t\t\tIt may happen when BSS Table was full. \n\t\t\t\tThe desired AP will not be added into BSS Table\n\t\t\t\tIn this case, if we found the desired AP then overwrite BSS Table.\n\t\t\t*/\n\t\t\tif(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) ||\n\t\t\t\t!OPSTATUS_TEST_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t{\n\t\t\t\tif (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, ie_list->Bssid) ||\n\t\t\t\t\tSSID_EQUAL(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, ie_list->Ssid, ie_list->SsidLen)\n#ifdef APCLI_SUPPORT\n\t\t\t\t\t|| MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, ie_list->Bssid)\n\t\t\t\t\t|| SSID_EQUAL(pAd->ApCliMlmeAux.Ssid, pAd->ApCliMlmeAux.SsidLen, ie_list->Ssid, ie_list->SsidLen)\n#endif /* APCLI_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tIdx = Tab->BssOverlapNr;\n\t\t\t\t\tBssEntrySet(pAd, &Tab->BssEntry[Idx], ie_list, Rssi, LengthVIE, pVIE);\n\t\t\t\t\tTab->BssOverlapNr += 1;\n\t\t\t\t\tTab->BssOverlapNr = Tab->BssOverlapNr % MAX_LEN_OF_BSS_TABLE;\n\t\t\t\t}\n\t\t\t\treturn Idx;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn BSS_NOT_FOUND;\n\t\t\t}\n\t\t}\n\t\tIdx = Tab->BssNr;\n\t\tBssEntrySet(pAd, &Tab->BssEntry[Idx], ie_list, Rssi, LengthVIE, pVIE);\n\t\tTab->BssNr++;\n\t} \n\telse\n\t{\n\t\tBssEntrySet(pAd, &Tab->BssEntry[Idx], ie_list, Rssi, LengthVIE, pVIE);\n\t}\n\n\treturn Idx;\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\nVOID  TriEventInit(\n\tIN\tPRTMP_ADAPTER\tpAd) \n{\n\tUCHAR\t\ti;\n\n\tfor (i = 0;i < MAX_TRIGGER_EVENT;i++)\n\t\tpAd->CommonCfg.TriggerEventTab.EventA[i].bValid = FALSE;\n\t\n\tpAd->CommonCfg.TriggerEventTab.EventANo = 0;\n\tpAd->CommonCfg.TriggerEventTab.EventBCountDown = 0;\n}\n\nINT TriEventTableSetEntry(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT TRIGGER_EVENT_TAB *Tab, \n\tIN PUCHAR pBssid, \n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR\t\t\tHtCapabilityLen,\n\tIN UCHAR\t\t\tRegClass,\n\tIN UCHAR ChannelNo)\n{\n\t/* Event A, legacy AP exist.*/\n\tif (HtCapabilityLen == 0)\n\t{\n\t\tUCHAR index;\n\t\t\n\t\t/*\n\t\t\tCheck if we already set this entry in the Event Table.\n\t\t*/\n\t\tfor (index = 0; index<MAX_TRIGGER_EVENT; index++)\n\t\t{\n\t\t\tif ((Tab->EventA[index].bValid == TRUE) && \n\t\t\t\t(Tab->EventA[index].Channel == ChannelNo) && \n\t\t\t\t(Tab->EventA[index].RegClass == RegClass)\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/*\n\t\t\tIf not set, add it to the Event table\n\t\t*/\n\t\tif (Tab->EventANo < MAX_TRIGGER_EVENT)\n\t\t{\n\t\t\tRTMPMoveMemory(Tab->EventA[Tab->EventANo].BSSID, pBssid, 6);\n\t\t\tTab->EventA[Tab->EventANo].bValid = TRUE;\n\t\t\tTab->EventA[Tab->EventANo].Channel = ChannelNo;\n\t\t\tif (RegClass != 0)\n\t\t\t{\n\t\t\t\t/* Beacon has Regulatory class IE. So use beacon's*/\n\t\t\t\tTab->EventA[Tab->EventANo].RegClass = RegClass;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Use Station's Regulatory class instead.*/\n\t\t\t\t/* If no Reg Class in Beacon, set to \"unknown\"*/\n\t\t\t\t/* TODO:  Need to check if this's valid*/\n\t\t\t\tTab->EventA[Tab->EventANo].RegClass = 0; /* ????????????????? need to check*/\n\t\t\t}\n\t\t\tTab->EventANo ++;\n\t\t}\n\t}\n\telse if (pHtCapability->HtCapInfo.Forty_Mhz_Intolerant)\n\t{\n\t\t/* Event B.   My BSS beacon has Intolerant40 bit set*/\n\t\tTab->EventBCountDown = pAd->CommonCfg.Dot11BssWidthChanTranDelay;\n\t}\n\n\treturn 0;\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID BssTableSsidSort(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT BSS_TABLE *OutTab, \n\tIN\tCHAR Ssid[], \n\tIN\tUCHAR SsidLen) \n{\n\tINT i;\n#ifdef WSC_STA_SUPPORT\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n#endif /* WSC_STA_SUPPORT */\n\tBssTableInit(OutTab);\n\n\tif ((SsidLen == 0) && \n\t\t(pAd->StaCfg.bAutoConnectIfNoSSID == FALSE))\n\t\treturn;\n\n\tfor (i = 0; i < pAd->ScanTab.BssNr; i++) \n\t{\n\t\tBSS_ENTRY *pInBss = &pAd->ScanTab.BssEntry[i];\n\t\tBOOLEAN\tbIsHiddenApIncluded = FALSE;\n\t\t\n\t\tif ( ((pAd->CommonCfg.bIEEE80211H == 1) && \n\t\t\t\t(pAd->MlmeAux.Channel > 14) && \n\t\t\t\t RadarChannelCheck(pAd, pInBss->Channel))\n#ifdef CARRIER_DETECTION_SUPPORT /* Roger sync Carrier             */\n             || (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n#endif /* CARRIER_DETECTION_SUPPORT */\n            )\n\t\t{\n\t\t\tif (pInBss->Hidden)\n\t\t\t\tbIsHiddenApIncluded = TRUE;\n\t\t}            \n\n\n\t\tif ((pInBss->BssType == pAd->StaCfg.BssType) && \n\t\t\t(SSID_EQUAL(Ssid, SsidLen, pInBss->Ssid, pInBss->SsidLen) || bIsHiddenApIncluded))\n\t\t{\n\t\t\tBSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr];\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS)\n\t\t\t{\n\t\t\t\t/* copy matching BSS from InTab to OutTab*/\n\t\t\t\tNdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));\n\t\t\t\tOutTab->BssNr++;\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t\t\tif ((pWpsCtrl->WscConfMode != WSC_DISABLE) && pWpsCtrl->bWscTrigger)\n\t\t\t{\n\t\t\t\t/* copy matching BSS from InTab to OutTab*/\n\t\t\t\tNdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));\n\t\t\t\tOutTab->BssNr++;\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t\t/* If no Country IE exists no Connection will be established when IEEE80211dClientMode is strict.*/\n\t\t\tif ((pAd->StaCfg.IEEE80211dClientMode == Rt802_11_D_Strict) &&\n\t\t\t\t(pInBss->bHasCountryIE == FALSE))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"StaCfg.IEEE80211dClientMode == Rt802_11_D_Strict, but this AP doesn't have country IE.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* 2.4G/5G N only mode*/\n\t\t\tif ((pInBss->HtCapabilityLen == 0) &&\n\t\t\t\t(WMODE_HT_ONLY(pAd->CommonCfg.PhyMode)))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"STA is in N-only Mode, this AP don't have Ht capability in Beacon.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((pAd->CommonCfg.PhyMode == (WMODE_G | WMODE_GN)) &&\n\t\t\t\t((pInBss->SupRateLen + pInBss->ExtRateLen) < 12))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"STA is in GN-only Mode, this AP is in B mode.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n\n\t\t\t/* New for WPA2*/\n\t\t\t/* Check the Authmode first*/\n\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t{\n\t\t\t\t/* Check AuthMode and AuthModeAux for matching, in case AP support dual-mode*/\n\t\t\t\tif ((pAd->StaCfg.AuthMode != pInBss->AuthMode) && (pAd->StaCfg.AuthMode != pInBss->AuthModeAux))\n\t\t\t\t\t/* None matched*/\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t/* Check cipher suite, AP must have more secured cipher than station setting*/\n\t\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK))\n\t\t\t\t{\n\t\t\t\t\t/* If it's not mixed mode, we should only let BSS pass with the same encryption*/\n\t\t\t\t\tif (pInBss->WPA.bMixMode == FALSE)\n\t\t\t\t\t\tif (pAd->StaCfg.WepStatus != pInBss->WPA.GroupCipher)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t/* check group cipher*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) &&\n\t\t\t\t\t\t(pInBss->WPA.GroupCipher != Ndis802_11GroupWEP40Enabled) && \n\t\t\t\t\t\t(pInBss->WPA.GroupCipher != Ndis802_11GroupWEP104Enabled))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t/* check pairwise cipher, skip if none matched*/\n\t\t\t\t\t/* If profile set to AES, let it pass without question.*/\n\t\t\t\t\t/* If profile set to TKIP, we must find one mateched*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA.PairCipher) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA.PairCipherAux))\n\t\t\t\t\t\tcontinue;\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t\t\t{\n\t\t\t\t\t/* If it's not mixed mode, we should only let BSS pass with the same encryption*/\n\t\t\t\t\tif (pInBss->WPA2.bMixMode == FALSE)\n\t\t\t\t\t\tif (pAd->StaCfg.WepStatus != pInBss->WPA2.GroupCipher)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t/* check group cipher*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) &&\n\t\t\t\t\t\t(pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP40Enabled) && \n\t\t\t\t\t\t(pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP104Enabled))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t/* check pairwise cipher, skip if none matched*/\n\t\t\t\t\t/* If profile set to AES, let it pass without question.*/\n\t\t\t\t\t/* If profile set to TKIP, we must find one mateched*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipher) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipherAux))\n\t\t\t\t\t\tcontinue;\t\t\t\t\t\t\n\t\t\t\t}\n#ifdef WAPI_SUPPORT\n\t\t\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK))\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\t/* check cipher algorithm*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus != pInBss->WAPI.GroupCipher) || \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WAPI.PairCipher))\n\t\t\t\t\t\tcontinue;\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n#endif /* WAPI_SUPPORT */\n\t\t\t}\t\t\t\n\t\t\t/* Bss Type matched, SSID matched. */\n\t\t\t/* We will check wepstatus for qualification Bss*/\n\t\t\telse if (pAd->StaCfg.WepStatus != pInBss->WepStatus)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"StaCfg.WepStatus=%d, while pInBss->WepStatus=%d\\n\", pAd->StaCfg.WepStatus, pInBss->WepStatus));\n\t\t\t\t\n\t\t\t\t/* For the SESv2 case, we will not qualify WepStatus.*/\n\t\t\t\t\n\t\t\t\tif (!pInBss->bSES)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* Since the AP is using hidden SSID, and we are trying to connect to ANY*/\n\t\t\t/* It definitely will fail. So, skip it.*/\n\t\t\t/* CCX also require not even try to connect it!!*/\n\t\t\tif (SsidLen == 0)\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\t/* copy matching BSS from InTab to OutTab*/\n\t\t\tNdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));\n\n\t\t\tOutTab->BssNr++;\n\t\t}\n\t\telse if ((pInBss->BssType == pAd->StaCfg.BssType) && (SsidLen == 0))\n\t\t{\n\t\t\tBSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr];\n\n#ifdef WSC_STA_SUPPORT\n\t\t\tif ((pWpsCtrl->WscConfMode != WSC_DISABLE) && pWpsCtrl->bWscTrigger)\n\t\t\t{\n\t\t\t\t/* copy matching BSS from InTab to OutTab*/\n\t\t\t\tNdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));\n\t\t\t\tOutTab->BssNr++;\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* 2.4G/5G N only mode*/\n\t\t\tif ((pInBss->HtCapabilityLen == 0) &&\n\t\t\t\tWMODE_HT_ONLY(pAd->CommonCfg.PhyMode))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"STA is in N-only Mode, this AP don't have Ht capability in Beacon.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((pAd->CommonCfg.PhyMode == (WMODE_G | WMODE_GN)) &&\n\t\t\t\t((pInBss->SupRateLen + pInBss->ExtRateLen) < 12))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"STA is in GN-only Mode, this AP is in B mode.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t/* New for WPA2*/\n\t\t\t/* Check the Authmode first*/\n\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t{\n\t\t\t\t/* Check AuthMode and AuthModeAux for matching, in case AP support dual-mode*/\n\t\t\t\tif ((pAd->StaCfg.AuthMode != pInBss->AuthMode) && (pAd->StaCfg.AuthMode != pInBss->AuthModeAux))\n\t\t\t\t\t/* None matched*/\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t/* Check cipher suite, AP must have more secured cipher than station setting*/\n\t\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK))\n\t\t\t\t{\n\t\t\t\t\t/* If it's not mixed mode, we should only let BSS pass with the same encryption*/\n\t\t\t\t\tif (pInBss->WPA.bMixMode == FALSE)\n\t\t\t\t\t\tif (pAd->StaCfg.WepStatus != pInBss->WPA.GroupCipher)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t/* check group cipher*/\n\t\t\t\t\tif (pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t/* check pairwise cipher, skip if none matched*/\n\t\t\t\t\t/* If profile set to AES, let it pass without question.*/\n\t\t\t\t\t/* If profile set to TKIP, we must find one mateched*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA.PairCipher) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA.PairCipherAux))\n\t\t\t\t\t\tcontinue;\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t\t\t{\n\t\t\t\t\t/* If it's not mixed mode, we should only let BSS pass with the same encryption*/\n\t\t\t\t\tif (pInBss->WPA2.bMixMode == FALSE)\n\t\t\t\t\t\tif (pAd->StaCfg.WepStatus != pInBss->WPA2.GroupCipher)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\n\t\t\t\t\t/* check group cipher*/\n\t\t\t\t\tif (pAd->StaCfg.WepStatus < pInBss->WPA2.GroupCipher)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t/* check pairwise cipher, skip if none matched*/\n\t\t\t\t\t/* If profile set to AES, let it pass without question.*/\n\t\t\t\t\t/* If profile set to TKIP, we must find one mateched*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipher) && \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipherAux))\n\t\t\t\t\t\tcontinue;\t\t\t\t\t\t\n\t\t\t\t}\n#ifdef WAPI_SUPPORT\n\t\t\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK))\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\t/* check cipher algorithm*/\n\t\t\t\t\tif ((pAd->StaCfg.WepStatus != pInBss->WAPI.GroupCipher) || \n\t\t\t\t\t\t(pAd->StaCfg.WepStatus != pInBss->WAPI.PairCipher))\n\t\t\t\t\t\tcontinue;\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n#endif /* WAPI_SUPPORT */\t\t\t\t\n\t\t\t}\n\t\t\t/* Bss Type matched, SSID matched. */\n\t\t\t/* We will check wepstatus for qualification Bss*/\n\t\t\telse if (pAd->StaCfg.WepStatus != pInBss->WepStatus)\n\t\t\t\t\tcontinue;\n\t\t\t\n\t\t\t/* copy matching BSS from InTab to OutTab*/\n\t\t\tNdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));\n\n\t\t\tOutTab->BssNr++;\n\t\t}\n#ifdef WSC_STA_SUPPORT\t\t\n\t\telse if ((pWpsCtrl->WscConfMode != WSC_DISABLE) && \n\t\t\t\t (pWpsCtrl->bWscTrigger) &&\n\t\t\t\t MAC_ADDR_EQUAL(pWpsCtrl->WscBssid, pInBss->Bssid))\n\t\t{\n\t\t\tBSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr];\n\t\t\t\n\t\t\t/* copy matching BSS from InTab to OutTab*/\n\t\t\tNdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));\n\n\t\t\t/*\n\t\t\t\tLinksys WRT610N WPS AP will change the SSID from linksys to linksys_WPS_<four random characters> \n\t\t\t\twhen the Linksys WRT610N is in the state 'WPS Unconfigured' after set to factory default.\n\t\t\t*/\n\t\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, pInBss->Ssid, pInBss->SsidLen);\n\t\t\tpAd->MlmeAux.SsidLen = pInBss->SsidLen;\n\n\t\t\t\n\t\t\t/* Update Reconnect Ssid, that user desired to connect.*/\n\t\t\t\n\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;\n\n\t\t\tOutTab->BssNr++;\n\t\t\tcontinue;\n\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n\t\tif (OutTab->BssNr >= MAX_LEN_OF_BSS_TABLE)\n\t\t\tbreak;\n\t}\n\n\tBssTableSortByRssi(OutTab);\n}\n\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID BssTableSortByRssi(\n\tIN OUT BSS_TABLE *OutTab) \n{\n\tINT \t  i, j;\n/*\tBSS_ENTRY TmpBss;*/\n\tBSS_ENTRY *pTmpBss = NULL;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pTmpBss, sizeof(BSS_ENTRY));\n\tif (pTmpBss == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < OutTab->BssNr - 1; i++) \n\t{\n\t\tfor (j = i+1; j < OutTab->BssNr; j++) \n\t\t{\n\t\t\tif (OutTab->BssEntry[j].Rssi > OutTab->BssEntry[i].Rssi) \n\t\t\t{\n\t\t\t\tNdisMoveMemory(pTmpBss, &OutTab->BssEntry[j], sizeof(BSS_ENTRY));\n\t\t\t\tNdisMoveMemory(&OutTab->BssEntry[j], &OutTab->BssEntry[i], sizeof(BSS_ENTRY));\n\t\t\t\tNdisMoveMemory(&OutTab->BssEntry[i], pTmpBss, sizeof(BSS_ENTRY));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pTmpBss != NULL)\n\t\tos_free_mem(NULL, pTmpBss);\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nVOID BssCipherParse(\n\tIN OUT\tPBSS_ENTRY\tpBss)\n{\n\tPEID_STRUCT \t\t pEid;\n\tPUCHAR\t\t\t\tpTmp;\n\tPRSN_IE_HEADER_STRUCT\t\t\tpRsnHeader;\n\tPCIPHER_SUITE_STRUCT\t\t\tpCipher;\n\tPAKM_SUITE_STRUCT\t\t\t\tpAKM;\n\tUSHORT\t\t\t\t\t\t\tCount;\n\tINT\t\t\t\t\t\t\t\tLength;\n\tNDIS_802_11_ENCRYPTION_STATUS\tTmpCipher;\n\n\t\n\t/* WepStatus will be reset later, if AP announce TKIP or AES on the beacon frame.*/\n\t\n\tif (pBss->Privacy)\n\t{\n\t\tpBss->WepStatus \t= Ndis802_11WEPEnabled;\n\t}\n\telse\n\t{\n\t\tpBss->WepStatus \t= Ndis802_11WEPDisabled;\n\t}\n\t/* Set default to disable & open authentication before parsing variable IE*/\n\tpBss->AuthMode\t\t= Ndis802_11AuthModeOpen;\n\tpBss->AuthModeAux\t= Ndis802_11AuthModeOpen;\n\n\t/* Init WPA setting*/\n\tpBss->WPA.PairCipher\t= Ndis802_11WEPDisabled;\n\tpBss->WPA.PairCipherAux = Ndis802_11WEPDisabled;\n\tpBss->WPA.GroupCipher\t= Ndis802_11WEPDisabled;\n\tpBss->WPA.RsnCapability = 0;\n\tpBss->WPA.bMixMode\t\t= FALSE;\n\n\t/* Init WPA2 setting*/\n\tpBss->WPA2.PairCipher\t = Ndis802_11WEPDisabled;\n\tpBss->WPA2.PairCipherAux = Ndis802_11WEPDisabled;\n\tpBss->WPA2.GroupCipher\t = Ndis802_11WEPDisabled;\n\tpBss->WPA2.RsnCapability = 0;\n\tpBss->WPA2.bMixMode \t = FALSE;\n\n#ifdef WAPI_SUPPORT\n\t/* Init WAPI setting*/\n\tpBss->WAPI.PairCipher\t = Ndis802_11WEPDisabled;\n\tpBss->WAPI.PairCipherAux = Ndis802_11WEPDisabled;\n\tpBss->WAPI.GroupCipher\t = Ndis802_11WEPDisabled;\n\tpBss->WAPI.RsnCapability = 0;\n\tpBss->WAPI.bMixMode \t = FALSE;\n#endif /* WAPI_SUPPORT */\n\t\n\tLength = (INT) pBss->VarIELen;\n\n\twhile (Length > 0)\n\t{\n\t\t/* Parse cipher suite base on WPA1 & WPA2, they should be parsed differently*/\n\t\tpTmp = ((PUCHAR) pBss->VarIEs) + pBss->VarIELen - Length;\n\t\tpEid = (PEID_STRUCT) pTmp;\n\t\tswitch (pEid->Eid)\n\t\t{\n\t\t\tcase IE_WPA:\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, SES_OUI, 3) && (pEid->Len == 7))\n\t\t\t\t{\n\t\t\t\t\tpBss->bSES = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4) != 1)\n\t\t\t\t{\n\t\t\t\t\t/* if unsupported vendor specific IE*/\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t\tSkip OUI, version, and multicast suite\n\t\t\t\t\tThis part should be improved in the future when AP supported multiple cipher suite.\n\t\t\t\t\tFor now, it's OK since almost all APs have fixed cipher suite supported.\n\t\t\t\t*/\n\t\t\t\t/* pTmp = (PUCHAR) pEid->Octet;*/\n\t\t\t\tpTmp   += 11;\n\n\t\t\t\t/* \n\t\t\t\t\tCipher Suite Selectors from Spec P802.11i/D3.2 P26.\n\t\t\t\t\tValue\t   Meaning\n\t\t\t\t\t0\t\t\tNone\n\t\t\t\t\t1\t\t\tWEP-40\n\t\t\t\t\t2\t\t\tTkip\n\t\t\t\t\t3\t\t\tWRAP\n\t\t\t\t\t4\t\t\tAES\n\t\t\t\t\t5\t\t\tWEP-104\n\t\t\t\t*/\n\t\t\t\t/* Parse group cipher*/\n\t\t\t\tswitch (*pTmp)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tpBss->WPA.GroupCipher = Ndis802_11GroupWEP40Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\tpBss->WPA.GroupCipher = Ndis802_11GroupWEP104Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tpBss->WPA.GroupCipher = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tpBss->WPA.GroupCipher = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* number of unicast suite*/\n\t\t\t\tpTmp   += 1;\n\n\t\t\t\t/* skip all unicast cipher suites*/\n\t\t\t\t/*Count = *(PUSHORT) pTmp;\t\t\t\t*/\n\t\t\t\tCount = (pTmp[1]<<8) + pTmp[0];\n\t\t\t\tpTmp   += sizeof(USHORT);\n\n\t\t\t\t/* Parsing all unicast cipher suite*/\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Skip OUI*/\n\t\t\t\t\tpTmp += 3;\n\t\t\t\t\tTmpCipher = Ndis802_11WEPDisabled;\n\t\t\t\t\tswitch (*pTmp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption1Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (TmpCipher > pBss->WPA.PairCipher)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower cipher suite to PairCipherAux*/\n\t\t\t\t\t\tpBss->WPA.PairCipherAux = pBss->WPA.PairCipher;\n\t\t\t\t\t\tpBss->WPA.PairCipher\t= TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpBss->WPA.PairCipherAux = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\tpTmp++;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* 4. get AKM suite counts*/\n\t\t\t\t/*Count\t= *(PUSHORT) pTmp;*/\n\t\t\t\tCount = (pTmp[1]<<8) + pTmp[0];\n\t\t\t\tpTmp   += sizeof(USHORT);\n\t\t\t\tpTmp   += 3;\n\t\t\t\t\n\t\t\t\tswitch (*pTmp)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t/* Set AP support WPA-enterprise mode*/\n\t\t\t\t\t\tif (pBss->AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWPA;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeWPA;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t/* Set AP support WPA-PSK mode*/\n\t\t\t\t\t\tif (pBss->AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWPAPSK;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeWPAPSK;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpTmp   += 1;\n\n\t\t\t\t/* Fixed for WPA-None*/\n\t\t\t\tif (pBss->BssType == BSS_ADHOC)\n\t\t\t\t{\n\t\t\t\t\tpBss->AuthMode\t  = Ndis802_11AuthModeWPANone;\n\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeWPANone;\n\t\t\t\t\tpBss->WepStatus   = pBss->WPA.GroupCipher;\n\t\t\t\t\t/* Patched bugs for old driver*/\n\t\t\t\t\tif (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)\n\t\t\t\t\t\tpBss->WPA.PairCipherAux = pBss->WPA.GroupCipher;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tpBss->WepStatus   = pBss->WPA.PairCipher;\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t/* Check the Pair & Group, if different, turn on mixed mode flag*/\n\t\t\t\tif (pBss->WPA.GroupCipher != pBss->WPA.PairCipher)\n\t\t\t\t\tpBss->WPA.bMixMode = TRUE;\n\t\t\t\t\n\t\t\t\tbreak;\n\n\t\t\tcase IE_RSN:\n\t\t\t\tpRsnHeader = (PRSN_IE_HEADER_STRUCT) pTmp;\n\t\t\t\t\n\t\t\t\t/* 0. Version must be 1*/\n\t\t\t\tif (le2cpu16(pRsnHeader->Version) != 1)\n\t\t\t\t\tbreak;\n\t\t\t\tpTmp   += sizeof(RSN_IE_HEADER_STRUCT);\n\n\t\t\t\t/* 1. Check group cipher*/\n\t\t\t\tpCipher = (PCIPHER_SUITE_STRUCT) pTmp;\n\t\t\t\tif (!RTMPEqualMemory(pTmp, RSN_OUI, 3))\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* Parse group cipher*/\n\t\t\t\tswitch (pCipher->Type)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tpBss->WPA2.GroupCipher = Ndis802_11GroupWEP40Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\tpBss->WPA2.GroupCipher = Ndis802_11GroupWEP104Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tpBss->WPA2.GroupCipher = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tpBss->WPA2.GroupCipher = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* set to correct offset for next parsing*/\n\t\t\t\tpTmp   += sizeof(CIPHER_SUITE_STRUCT);\n\n\t\t\t\t/* 2. Get pairwise cipher counts*/\n\t\t\t\t/*Count = *(PUSHORT) pTmp;*/\n\t\t\t\tCount = (pTmp[1]<<8) + pTmp[0];\n\t\t\t\tpTmp   += sizeof(USHORT);\t\t\t\n\n\t\t\t\t/* 3. Get pairwise cipher*/\n\t\t\t\t/* Parsing all unicast cipher suite*/\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Skip OUI*/\n\t\t\t\t\tpCipher = (PCIPHER_SUITE_STRUCT) pTmp;\n\t\t\t\t\tTmpCipher = Ndis802_11WEPDisabled;\n\t\t\t\t\tswitch (pCipher->Type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption1Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (TmpCipher > pBss->WPA2.PairCipher)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower cipher suite to PairCipherAux*/\n\t\t\t\t\t\tpBss->WPA2.PairCipherAux = pBss->WPA2.PairCipher;\n\t\t\t\t\t\tpBss->WPA2.PairCipher\t = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpBss->WPA2.PairCipherAux = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\tpTmp += sizeof(CIPHER_SUITE_STRUCT);\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* 4. get AKM suite counts*/\n\t\t\t\t/*Count\t= *(PUSHORT) pTmp;*/\n\t\t\t\tCount = (pTmp[1]<<8) + pTmp[0];\n\t\t\t\tpTmp   += sizeof(USHORT);\n\n\t\t\t\t/* 5. Get AKM ciphers*/\n\t\t\t\t/* Parsing all AKM ciphers*/\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tpAKM = (PAKM_SUITE_STRUCT) pTmp;\n\t\t\t\t\tif (!RTMPEqualMemory(pTmp, RSN_OUI, 3))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tswitch (pAKM->Type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (pBss->AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWPANone;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeWPANone;\n\t\t\t\t\t\t\tbreak;                                                        \n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t/* Set AP support WPA-enterprise mode*/\n\t\t\t\t\t\t\tif (pBss->AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWPA2;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeWPA2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t/* Set AP support WPA-PSK mode*/\n\t\t\t\t\t\t\tif (pBss->AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWPA2PSK;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeWPA2PSK;\n\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif (pBss->AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeMax;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpBss->AuthModeAux = Ndis802_11AuthModeMax;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tpTmp   += sizeof(AKM_SUITE_STRUCT);\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\n\t\t\t\t/* Fixed for WPA-None*/\n\t\t\t\tif (pBss->BssType == BSS_ADHOC)\n\t\t\t\t{\n\t\t\t\t\tpBss->WPA.PairCipherAux = pBss->WPA2.PairCipherAux;\n\t\t\t\t\tpBss->WPA.GroupCipher\t= pBss->WPA2.GroupCipher;\n\t\t\t\t\tpBss->WepStatus \t\t= pBss->WPA.GroupCipher;\n\t\t\t\t\t/* Patched bugs for old driver*/\n\t\t\t\t\tif (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)\n\t\t\t\t\t\tpBss->WPA.PairCipherAux = pBss->WPA.GroupCipher;\n\t\t\t\t}\n\t\t\t\tpBss->WepStatus   = pBss->WPA2.PairCipher;\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t/* 6. Get RSN capability*/\n\t\t\t\t/*pBss->WPA2.RsnCapability = *(PUSHORT) pTmp;*/\n\t\t\t\tpBss->WPA2.RsnCapability = (pTmp[1]<<8) + pTmp[0];\n\t\t\t\tpTmp += sizeof(USHORT);\n\t\t\t\t\n\t\t\t\t/* Check the Pair & Group, if different, turn on mixed mode flag*/\n\t\t\t\tif (pBss->WPA2.GroupCipher != pBss->WPA2.PairCipher)\n\t\t\t\t\tpBss->WPA2.bMixMode = TRUE;\n\t\t\t\t\n\t\t\t\tbreak;\n#ifdef WAPI_SUPPORT\n\t\t\tcase IE_WAPI:\n\t\t\t\tpRsnHeader = (PRSN_IE_HEADER_STRUCT) pTmp;\n\n\t\t\t\t/* 0. The version number must be 1*/\n\t\t\t\tif (le2cpu16(pRsnHeader->Version) != 1)\n\t\t\t\t\tbreak;\n\t\t\t\tpTmp += sizeof(RSN_IE_HEADER_STRUCT);\n\n\t\t\t\t/* 1. Get AKM suite counts*/\n\t\t\t\tNdisMoveMemory(&Count, pTmp, sizeof(USHORT));\t\n    \t\t\tCount = cpu2le16(Count);\t\t\t\t\n\t\t\t\tpTmp += sizeof(USHORT);\n\n\t\t\t\t/* 2. Get AKM ciphers*/\n\t\t\t\tpAKM = (PAKM_SUITE_STRUCT) pTmp;\n\t\t\t\tif (!RTMPEqualMemory(pTmp, WAPI_OUI, 3))\n\t\t\t\t\tbreak;\n\n\t\t\t\tswitch (pAKM->Type)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t/* Support WAI certificate authentication*/\n\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWAICERT;\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t/* Support WAI PSK*/\n\t\t\t\t\t\tpBss->AuthMode = Ndis802_11AuthModeWAIPSK;\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpTmp += (Count * sizeof(AKM_SUITE_STRUCT));\n\n\t\t\t\t/* 3. Get pairwise cipher counts*/\n\t\t\t\tNdisMoveMemory(&Count, pTmp, sizeof(USHORT));\t\n    \t\t\tCount = cpu2le16(Count);\t\n\t\t\t\tpTmp += sizeof(USHORT);\t\t\t\n\n\t\t\t\t/* 4. Get pairwise cipher*/\n\t\t\t\t/* Parsing all unicast cipher suite*/\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t\t\tif (!RTMPEqualMemory(pTmp, WAPI_OUI, 3))\n\t\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\t\t/* Skip OUI*/\n\t\t\t\t\tpCipher = (PCIPHER_SUITE_STRUCT) pTmp;\t\t\t\t\t\n\t\t\t\t\tTmpCipher = Ndis802_11WEPDisabled;\n\t\t\t\t\tswitch (pCipher->Type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1:\t\t\t\t\t\t\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11EncryptionSMS4Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (TmpCipher > pBss->WAPI.PairCipher)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower cipher suite to PairCipherAux*/\n\t\t\t\t\t\tpBss->WAPI.PairCipherAux = pBss->WAPI.PairCipher;\n\t\t\t\t\t\tpBss->WAPI.PairCipher\t = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpBss->WAPI.PairCipherAux = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\tpTmp += sizeof(CIPHER_SUITE_STRUCT);\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* 5. Check group cipher*/\n\t\t\t\tif (!RTMPEqualMemory(pTmp, WAPI_OUI, 3))\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tpCipher = (PCIPHER_SUITE_STRUCT) pTmp;\t\t\t\t\n\t\t\t\t/* Parse group cipher*/\n\t\t\t\tswitch (pCipher->Type)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tpBss->WAPI.GroupCipher = Ndis802_11EncryptionSMS4Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* set to correct offset for next parsing*/\n\t\t\t\tpTmp += sizeof(CIPHER_SUITE_STRUCT);\n\n\t\t\t\t/* update the encryption type*/\n\t\t\t\tpBss->WepStatus = pBss->WAPI.PairCipher;\n\n\t\t\t\t/* update the WAPI capability*/\n\t\t\t\tpBss->WAPI.RsnCapability = (pTmp[1]<<8) + pTmp[0];\n\t\t\t\tpTmp += sizeof(USHORT);\n\n\t\t\t\tbreak;\n#endif /* WAPI_SUPPORT */\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tLength -= (pEid->Len + 2);\n\t}\n}\n\n/* ===========================================================================================*/\n/* mac_table.c*/\n/* ===========================================================================================*/\n\n/*! \\brief generates a random mac address value for IBSS BSSID\n *\t\\param Addr the bssid location\n *\t\\return none\n *\t\\pre\n *\t\\post\n */\nVOID MacAddrRandomBssid(\n\tIN PRTMP_ADAPTER pAd, \n\tOUT PUCHAR pAddr) \n{\n\tINT i;\n\n\tfor (i = 0; i < MAC_ADDR_LEN; i++) \n\t{\n\t\tpAddr[i] = RandomByte(pAd);\n\t}\n\n\tpAddr[0] = (pAddr[0] & 0xfe) | 0x02;  /* the first 2 bits must be 01xxxxxxxx*/\n}\n\n/*! \\brief init the management mac frame header\n *\t\\param p_hdr mac header\n *\t\\param subtype subtype of the frame\n *\t\\param p_ds destination address, don't care if it is a broadcast address\n *\t\\return none\n *\t\\pre the station has the following information in the pAd->StaCfg\n *\t - bssid\n *\t - station address\n *\t\\post\n *\t\\note this function initializes the following field\n\n IRQL = PASSIVE_LEVEL\n IRQL = DISPATCH_LEVEL\n  \n */\nVOID MgtMacHeaderInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN OUT PHEADER_802_11 pHdr80211, \n\tIN UCHAR SubType, \n\tIN UCHAR ToDs, \n\tIN PUCHAR pDA, \n#ifdef P2P_SUPPORT\n\tIN PUCHAR pSA,\n#endif /* P2P_SUPPORT */\n\tIN PUCHAR pBssid) \n{\n\tNdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));\n\t\n\tpHdr80211->FC.Type = BTYPE_MGMT;\n\tpHdr80211->FC.SubType = SubType;\n/*\tif (SubType == SUBTYPE_ACK)\t sample, no use, it will conflict with ACTION frame sub type*/\n/*\t\tpHdr80211->FC.Type = BTYPE_CNTL;*/\n\tpHdr80211->FC.ToDs = ToDs;\n\tCOPY_MAC_ADDR(pHdr80211->Addr1, pDA);\n#ifdef P2P_SUPPORT\n\t\tCOPY_MAC_ADDR(pHdr80211->Addr2, pSA);\n#else\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCOPY_MAC_ADDR(pHdr80211->Addr2, pBssid);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCOPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\tCOPY_MAC_ADDR(pHdr80211->Addr3, pBssid);\n}\n\n/* ===========================================================================================*/\n/* mem_mgmt.c*/\n/* ===========================================================================================*/\n\n/*!***************************************************************************\n * This routine build an outgoing frame, and fill all information specified \n * in argument list to the frame body. The actual frame size is the summation \n * of all arguments.\n * input params:\n *\t\tBuffer - pointer to a pre-allocated memory segment\n *\t\targs - a list of <int arg_size, arg> pairs.\n *\t\tNOTE NOTE NOTE!!!! the last argument must be NULL, otherwise this\n *\t\t\t\t\t\t   function will FAIL!!!\n * return:\n *\t\tSize of the buffer\n * usage:  \n *\t\tMakeOutgoingFrame(Buffer, output_length, 2, &fc, 2, &dur, 6, p_addr1, 6,p_addr2, END_OF_ARGS);\n\n IRQL = PASSIVE_LEVEL\n IRQL = DISPATCH_LEVEL\n  \n ****************************************************************************/\nULONG MakeOutgoingFrame(\n\tOUT UCHAR *Buffer, \n\tOUT ULONG *FrameLen, ...) \n{\n\tUCHAR   *p;\n\tint \tleng;\n\tULONG\tTotLeng;\n\tva_list Args;\n\n\t/* calculates the total length*/\n\tTotLeng = 0;\n\tva_start(Args, FrameLen);\n\tdo \n\t{\n\t\tleng = va_arg(Args, int);\n\t\tif (leng == END_OF_ARGS) \n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tp = va_arg(Args, PVOID);\n\t\tNdisMoveMemory(&Buffer[TotLeng], p, leng);\n\t\tTotLeng = TotLeng + leng;\n\t} while(TRUE);\n\n\tva_end(Args); /* clean up */\n\t*FrameLen = TotLeng;\n\treturn TotLeng;\n}\n\n/* ===========================================================================================*/\n/* mlme_queue.c*/\n/* ===========================================================================================*/\n\n/*! \\brief\tInitialize The MLME Queue, used by MLME Functions\n *\t\\param\t*Queue\t   The MLME Queue\n *\t\\return Always\t   Return NDIS_STATE_SUCCESS in this implementation\n *\t\\pre\n *\t\\post\n *\t\\note\tBecause this is done only once (at the init stage), no need to be locked\n\n IRQL = PASSIVE_LEVEL\n \n */\nNDIS_STATUS MlmeQueueInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE *Queue) \n{\n\tINT i;\n\n\tNdisAllocateSpinLock(pAd, &Queue->Lock);\n\n\tQueue->Num\t= 0;\n\tQueue->Head = 0;\n\tQueue->Tail = 0;\n\n\tfor (i = 0; i < MAX_LEN_OF_MLME_QUEUE; i++) \n\t{\n\t\tQueue->Entry[i].Occupied = FALSE;\n\t\tQueue->Entry[i].MsgLen = 0;\n\t\tNdisZeroMemory(Queue->Entry[i].Msg, MGMT_DMA_BUFFER_SIZE);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n/*! \\brief\t Enqueue a message for other threads, if they want to send messages to MLME thread\n *\t\\param\t*Queue\t  The MLME Queue\n *\t\\param\t Machine  The State Machine Id\n *\t\\param\t MsgType  The Message Type\n *\t\\param\t MsgLen   The Message length\n *\t\\param\t*Msg\t  The message pointer\n *\t\\return  TRUE if enqueue is successful, FALSE if the queue is full\n *\t\\pre\n *\t\\post\n *\t\\note\t The message has to be initialized\n\n IRQL = PASSIVE_LEVEL\n IRQL = DISPATCH_LEVEL\n  \n */\nBOOLEAN MlmeEnqueue(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN ULONG Machine, \n\tIN ULONG MsgType, \n\tIN ULONG MsgLen, \n\tIN VOID *Msg,\n\tIN ULONG Priv) \n{\n\tINT Tail;\n\tMLME_QUEUE\t*Queue = (MLME_QUEUE *)&pAd->Mlme.Queue;\n\n\t/* Do nothing if the driver is starting halt state.*/\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt*/\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn FALSE;\n\n\t/* First check the size, it MUST not exceed the mlme queue size*/\n\tif (MsgLen > MGMT_DMA_BUFFER_SIZE)\n\t{\n\t\tDBGPRINT_ERR((\"MlmeEnqueue: msg too large, size = %ld \\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\t\n\tif (MlmeQueueFull(Queue, 1)) \n\t{\n\t\treturn FALSE;\n\t}\n\n\tNdisAcquireSpinLock(&(Queue->Lock));\n\tTail = Queue->Tail;\n\tQueue->Tail++;\n\tQueue->Num++;\n\tif (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) \n\t{\n\t\tQueue->Tail = 0;\n\t}\n\t\n\tQueue->Entry[Tail].Wcid = RESERVED_WCID;\n\tQueue->Entry[Tail].Occupied = TRUE;\n\tQueue->Entry[Tail].Machine = Machine;\n\tQueue->Entry[Tail].MsgType = MsgType;\n\tQueue->Entry[Tail].MsgLen  = MsgLen;\t\n\tQueue->Entry[Tail].Priv = Priv;\n\t\n\tif (Msg != NULL)\n\t{\n\t\tNdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen);\n\t}\n\t\t\n\tNdisReleaseSpinLock(&(Queue->Lock));\n\treturn TRUE;\n}\n\n/*! \\brief\t This function is used when Recv gets a MLME message\n *\t\\param\t*Queue\t\t\t The MLME Queue\n *\t\\param\t TimeStampHigh\t The upper 32 bit of timestamp\n *\t\\param\t TimeStampLow\t The lower 32 bit of timestamp\n *\t\\param\t Rssi\t\t\t The receiving RSSI strength\n *\t\\param\t MsgLen \t\t The length of the message\n *\t\\param\t*Msg\t\t\t The message pointer\n *\t\\return  TRUE if everything ok, FALSE otherwise (like Queue Full)\n *\t\\pre\n *\t\\post\n \n IRQL = DISPATCH_LEVEL\n \n */\nBOOLEAN MlmeEnqueueForRecv(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN ULONG Wcid, \n\tIN ULONG TimeStampHigh, \n\tIN ULONG TimeStampLow,\n\tIN UCHAR Rssi0, \n\tIN UCHAR Rssi1, \n\tIN UCHAR Rssi2, \n\tIN UCHAR AntSel, \n\tIN ULONG MsgLen, \n\tIN VOID *Msg,\n\tIN UCHAR Signal,\n\tIN UCHAR OpMode)\n{\n\tINT \t\t Tail, Machine = 0xff;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)Msg;\n\tINT\t\t MsgType = 0x0;\n\tMLME_QUEUE\t*Queue = (MLME_QUEUE *)&pAd->Mlme.Queue;\n\n#ifdef RALINK_ATE\t\t\t\n\t/* Nothing to do in ATE mode */\n\tif(ATE_ON(pAd))\n\t\treturn FALSE;\n#endif /* RALINK_ATE */\n\n\t/* Do nothing if the driver is starting halt state.*/\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt*/\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\tDBGPRINT_ERR((\"MlmeEnqueueForRecv: fRTMP_ADAPTER_HALT_IN_PROGRESS\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t/* First check the size, it MUST not exceed the mlme queue size*/\n\tif (MsgLen > MGMT_DMA_BUFFER_SIZE)\n\t{\n\t\tDBGPRINT_ERR((\"MlmeEnqueueForRecv: frame too large, size = %ld \\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\n\tif (MlmeQueueFull(Queue, 0)) \n\t{\n\t\treturn FALSE;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (OpMode == OPMODE_AP)\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tif (pFrame->Hdr.FC.SubType == SUBTYPE_PROBE_REQ)\n\t\t\t\treturn FALSE;\n\t\t}\n#endif /* P2P_SUPPORT */\n#ifdef APCLI_SUPPORT\n\t\t/* Beacon must be handled by ap-sync state machine.*/\n\t\t/* Probe-rsp must be handled by apcli-sync state machine.*/\n\t\t/* Those packets don't need to check its MAC address.*/\n\t\tdo\n\t\t{\n\t\t\t/* \n\t\t\t   1. When P2P GO On and receive Probe Response, preCheckMsgTypeSubset function will \n\t\t\t      enquene Probe response to APCli sync state machine\n\t\t\t      Solution: when GO On skip preCheckMsgTypeSubset redirect to APMsgTypeSubst\n\t\t\t   2. When P2P Cli On and receive Probe Response, preCheckMsgTypeSubset function will\n\t\t\t      enquene Probe response to APCli sync state machine\n\t\t\t      Solution: handle MsgType == APCLI_MT2_PEER_PROBE_RSP on ApCli Sync state machine\n\t\t\t                when ApCli on idle state.\n\t\t\t*/\n\n\t\t\tif (!MAC_ADDR_EQUAL(pFrame->Hdr.Addr1, pAd->CurrentAddress) &&\n#ifdef P2P_SUPPORT\n\t\t\t\t!P2P_GO_ON(pAd) &&\n#endif /* P2P_SUPPORT */\n\t\t\t\tpreCheckMsgTypeSubset(pAd, pFrame, &Machine, &MsgType))\n\t\t\t\tbreak;\n\n\t\t\tif (!MAC_ADDR_EQUAL(pFrame->Hdr.Addr1, pAd->CurrentAddress) &&\n\t\t\t\t!MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, ZERO_MAC_ADDR)\n\t\t\t\t&& MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, pFrame->Hdr.Addr2))\n\t\t\t{\n\t\t\t\tif (ApCliMsgTypeSubst(pAd, pFrame, &Machine, &MsgType))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (APMsgTypeSubst(pAd, pFrame, &Machine, &MsgType))\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDBGPRINT_ERR((\"MlmeEnqueueForRecv: un-recongnized mgmt->subtype=%d, STA-%02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\t\tpFrame->Hdr.FC.SubType, PRINT_MAC(pFrame->Hdr.Addr2)));\n\t\t\treturn FALSE;\n\n\t\t} while (FALSE);\n#else\n\t\tif (!APMsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) \n\t\t{\n\t\t\tDBGPRINT_ERR((\"MlmeEnqueueForRecv: un-recongnized mgmt->subtype=%d\\n\",pFrame->Hdr.FC.SubType));\n\t\t\treturn FALSE;\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\t\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (OpMode == OPMODE_STA)\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\tif (!MsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) \n\t\t{\n\t\t\tDBGPRINT_ERR((\"MlmeEnqueueForRecv: un-recongnized mgmt->subtype=%d\\n\",pFrame->Hdr.FC.SubType));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* OK, we got all the informations, it is time to put things into queue*/\n\n\tNdisAcquireSpinLock(&(Queue->Lock));\n\tTail = Queue->Tail;\n\tQueue->Tail++;\n\tQueue->Num++;\n\tif (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) \n\t{\n\t\tQueue->Tail = 0;\n\t}\n\tQueue->Entry[Tail].Occupied = TRUE;\n\tQueue->Entry[Tail].Machine = Machine;\n\tQueue->Entry[Tail].MsgType = MsgType;\n\tQueue->Entry[Tail].MsgLen  = MsgLen;\n\tQueue->Entry[Tail].TimeStamp.u.LowPart = TimeStampLow;\n\tQueue->Entry[Tail].TimeStamp.u.HighPart = TimeStampHigh;\n\tQueue->Entry[Tail].Rssi0 = Rssi0;\n\tQueue->Entry[Tail].Rssi1 = Rssi1;\n\tQueue->Entry[Tail].Rssi2 = Rssi2;\n\tQueue->Entry[Tail].AntSel = AntSel;\n\tQueue->Entry[Tail].Signal = Signal;\n\tQueue->Entry[Tail].Wcid = (UCHAR)Wcid;\n\tQueue->Entry[Tail].OpMode = (ULONG)OpMode;\n\tQueue->Entry[Tail].Priv = 0;\n\n\tQueue->Entry[Tail].Channel = pAd->LatchRfRegs.Channel;\n\t\n\tif (Msg != NULL)\n\t{\n\t\tNdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen);\n\t}\n\n\tNdisReleaseSpinLock(&(Queue->Lock));\t\n\tRTMP_MLME_HANDLER(pAd);\n\n\treturn TRUE;\n}\n\n#ifdef WSC_INCLUDED\n/*! \\brief   Enqueue a message for other threads, if they want to send messages to MLME thread\n *  \\param  *Queue    The MLME Queue\n *  \\param   TimeStampLow    The lower 32 bit of timestamp, here we used for eventID.\n *  \\param   Machine  The State Machine Id\n *  \\param   MsgType  The Message Type\n *  \\param   MsgLen   The Message length\n *  \\param  *Msg      The message pointer\n *  \\return  TRUE if enqueue is successful, FALSE if the queue is full\n *  \\pre\n *  \\post\n *  \\note    The message has to be initialized\n */\nBOOLEAN MlmeEnqueueForWsc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN ULONG eventID,\n\tIN LONG senderID,\n\tIN ULONG Machine, \n\tIN ULONG MsgType, \n\tIN ULONG MsgLen, \n\tIN VOID *Msg) \n{\n    INT Tail;\n    /*ULONG\t\t\tIrqFlags;*/\n\tMLME_QUEUE\t*Queue = (MLME_QUEUE *)&pAd->Mlme.Queue;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> MlmeEnqueueForWsc\\n\"));\n    /* Do nothing if the driver is starting halt state.*/\n    /* This might happen when timer already been fired before cancel timer with mlmehalt*/\n    if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))\n        return FALSE;\n\n\t/* First check the size, it MUST not exceed the mlme queue size*/\n\tif (MsgLen > MGMT_DMA_BUFFER_SIZE)\n\t{\n        DBGPRINT_ERR((\"MlmeEnqueueForWsc: msg too large, size = %ld \\n\", MsgLen));\n\t\treturn FALSE;\n\t}\n\t\n    if (MlmeQueueFull(Queue, 1)) \n    {\n        \n        return FALSE;\n    }\n\n    /* OK, we got all the informations, it is time to put things into queue*/\n\tNdisAcquireSpinLock(&(Queue->Lock));\n    Tail = Queue->Tail;\n    Queue->Tail++;\n    Queue->Num++;\n    if (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) \n    {\n        Queue->Tail = 0;\n    }\n    \n    Queue->Entry[Tail].Occupied = TRUE;\n    Queue->Entry[Tail].Machine = Machine;\n    Queue->Entry[Tail].MsgType = MsgType;\n    Queue->Entry[Tail].MsgLen  = MsgLen;\n\tQueue->Entry[Tail].TimeStamp.u.LowPart = eventID;\n\tQueue->Entry[Tail].TimeStamp.u.HighPart = senderID;\n    if (Msg != NULL)\n        NdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen);\n\n    NdisReleaseSpinLock(&(Queue->Lock));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- MlmeEnqueueForWsc\\n\"));\n\t\n    return TRUE;\n}\n#endif /* WSC_INCLUDED */\n\n/*! \\brief\t Dequeue a message from the MLME Queue\n *\t\\param\t*Queue\t  The MLME Queue\n *\t\\param\t*Elem\t  The message dequeued from MLME Queue\n *\t\\return  TRUE if the Elem contains something, FALSE otherwise\n *\t\\pre\n *\t\\post\n\n IRQL = DISPATCH_LEVEL\n\n */\nBOOLEAN MlmeDequeue(\n\tIN MLME_QUEUE *Queue, \n\tOUT MLME_QUEUE_ELEM **Elem) \n{\n\tNdisAcquireSpinLock(&(Queue->Lock));\n\t*Elem = &(Queue->Entry[Queue->Head]);    \n\tQueue->Num--;\n\tQueue->Head++;\n\tif (Queue->Head == MAX_LEN_OF_MLME_QUEUE) \n\t{\n\t\tQueue->Head = 0;\n\t}\n\tNdisReleaseSpinLock(&(Queue->Lock));\n\treturn TRUE;\n}\n\n/* IRQL = DISPATCH_LEVEL*/\nVOID\tMlmeRestartStateMachine(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tBOOLEAN\t\t\t\tCancelled;\n#ifdef P2P_SUPPORT\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeRestartStateMachine \\n\"));\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef QOS_DLS_SUPPORT\n\t\tUCHAR i;\n#endif /* QOS_DLS_SUPPORT */\n\t\t/* Cancel all timer events*/\n\t\t/* Be careful to cancel new added timer*/\n\t\tRTMPCancelTimer(&pAd->MlmeAux.AssocTimer,\t  &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,   &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.DisassocTimer,  &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.AuthTimer,\t   &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer,\t   &Cancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer,\t   &Cancelled);\n\n#ifdef QOS_DLS_SUPPORT\n\t\tfor (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &Cancelled);\n\t\t}\n#endif /* QOS_DLS_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Change back to original channel in case of doing scan*/\n#ifdef P2P_SUPPORT\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\t\n\tif (!P2P_GO_ON(pAd) && (pApCliEntry->Valid == FALSE))\n#endif /* P2P_SUPPORT */\n\t{\n\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t}\n\n\t/* Resume MSDU which is turned off durning scan*/\n\tRTMPResumeMsduTransmission(pAd);\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Set all state machines back IDLE*/\n\t\tpAd->Mlme.CntlMachine.CurrState    = CNTL_IDLE;\n\t\tpAd->Mlme.AssocMachine.CurrState   = ASSOC_IDLE;\n\t\tpAd->Mlme.AuthMachine.CurrState    = AUTH_REQ_IDLE;\n\t\tpAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE;\n\t\tpAd->Mlme.SyncMachine.CurrState    = SYNC_IDLE;\n\t\tpAd->Mlme.ActMachine.CurrState    = ACT_IDLE;\n#ifdef QOS_DLS_SUPPORT\n\t\tpAd->Mlme.DlsMachine.CurrState    = DLS_IDLE;\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tpAd->Mlme.TdlsMachine.CurrState    = TDLS_IDLE;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n}\n\n/*! \\brief\ttest if the MLME Queue is empty\n *\t\\param\t*Queue\t  The MLME Queue\n *\t\\return TRUE if the Queue is empty, FALSE otherwise\n *\t\\pre\n *\t\\post\n \n IRQL = DISPATCH_LEVEL\n \n */\nBOOLEAN MlmeQueueEmpty(\n\tIN MLME_QUEUE *Queue) \n{\n\tBOOLEAN Ans;\n\n\tNdisAcquireSpinLock(&(Queue->Lock));\n\tAns = (Queue->Num == 0);\n\tNdisReleaseSpinLock(&(Queue->Lock));\n\n\treturn Ans;\n}\n\n/*! \\brief\t test if the MLME Queue is full\n *\t\\param\t *Queue \t The MLME Queue\n *\t\\return  TRUE if the Queue is empty, FALSE otherwise\n *\t\\pre\n *\t\\post\n\n IRQL = PASSIVE_LEVEL\n IRQL = DISPATCH_LEVEL\n\n */\nBOOLEAN MlmeQueueFull(\n\tIN MLME_QUEUE *Queue,\n\tIN UCHAR SendId) \n{\n\tBOOLEAN Ans;\n\n\tNdisAcquireSpinLock(&(Queue->Lock));\n\tif (SendId == 0)\n\t\tAns = ((Queue->Num >= (MAX_LEN_OF_MLME_QUEUE / 2)) || Queue->Entry[Queue->Tail].Occupied);\n\telse\n\t\tAns = (Queue->Num == MAX_LEN_OF_MLME_QUEUE);\n\tNdisReleaseSpinLock(&(Queue->Lock));\n\n\treturn Ans;\n}\n\n/*! \\brief\t The destructor of MLME Queue\n *\t\\param \n *\t\\return\n *\t\\pre\n *\t\\post\n *\t\\note\tClear Mlme Queue, Set Queue->Num to Zero.\n\n IRQL = PASSIVE_LEVEL\n \n */\nVOID MlmeQueueDestroy(\n\tIN MLME_QUEUE *pQueue) \n{\n\tNdisAcquireSpinLock(&(pQueue->Lock));\n\tpQueue->Num  = 0;\n\tpQueue->Head = 0;\n\tpQueue->Tail = 0;\n\tNdisReleaseSpinLock(&(pQueue->Lock));\n\tNdisFreeSpinLock(&(pQueue->Lock));\n}\n\n\n/*! \\brief\t To substitute the message type if the message is coming from external\n *\t\\param\tpFrame\t\t   The frame received\n *\t\\param\t*Machine\t   The state machine\n *\t\\param\t*MsgType\t   the message type for the state machine\n *\t\\return TRUE if the substitution is successful, FALSE otherwise\n *\t\\pre\n *\t\\post\n\n IRQL = DISPATCH_LEVEL\n\n */\n#ifdef CONFIG_STA_SUPPORT\nBOOLEAN MsgTypeSubst(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType) \n{\n\tUSHORT\tSeq, Alg;\n\tUCHAR\tEAPType;\n\tPUCHAR\tpData;\n\tBOOLEAN bRV = FALSE;\n#ifdef WSC_STA_SUPPORT\n\tUCHAR EAPCode;\n#endif /* WSC_STA_SUPPORT */    \n\n\t/* Pointer to start of data frames including SNAP header*/\n\tpData = (PUCHAR) pFrame + LENGTH_802_11;\n\n\t/* The only data type will pass to this function is EAPOL frame*/\n\tif (pFrame->Hdr.FC.Type == BTYPE_DATA) \n\t{\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (NdisEqualMemory(TDLS_LLC_SNAP_WITH_CATEGORY, pData, LENGTH_802_1_H + 2))\n\t\t{\n\t\t\tUCHAR\tTDLSType;\n\n\t\t\t/* ieee802.11z TDLS SNAP header*/\n\t\t\t*Machine = TDLS_STATE_MACHINE;\n\t\t\tTDLSType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 2);\n\t\t\treturn (TDLS_MsgTypeSubst(TDLSType, (INT *)MsgType));\n\t\t}\n\t\telse\n#ifdef WFD_SUPPORT\n\t\tif (NdisEqualMemory(TDLS_LLC_SNAP_WITH_WFD_CATEGORY, pData, LENGTH_802_1_H + 2))\n\t\t{\n\t\t\tUCHAR OUI[3] = {0x50, 0x6F, 0x9A};\n\t\t\t\n\t\t\t/* ieee802.11z TDLS SNAP header*/\n\t\t\tif (NdisEqualMemory(&OUI, (pData + LENGTH_802_1_H + 2), 3))\n\t\t\t{\n\t\t\t\t*Machine = TDLS_STATE_MACHINE;\n\t\t\t\t*MsgType = MT2_PEER_TDLS_TUNNELED_REQ;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* WFD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#ifdef WSC_STA_SUPPORT\n        /* check for WSC state machine first*/\n\t\tif (pAd->StaCfg.WscControl.WscState >= WSC_STATE_LINK_UP)\n        {\n            *Machine = WSC_STATE_MACHINE;\n            EAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1);\n            EAPCode = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 4);\n            \n            bRV = WscMsgTypeSubst(EAPType, EAPCode, MsgType);\n \t\t\tif (bRV)\n\t\t\t\treturn bRV;\n        }\n#endif /* WSC_STA_SUPPORT */\n\t\tif (bRV == FALSE)\n\t\t{\n\t        *Machine = WPA_STATE_MACHINE;\n\t\t\tEAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1);\n\t        return (WpaMsgTypeSubst(EAPType, (INT *) MsgType));\t\t\n\t\t}\n\t}\n\n\tswitch (pFrame->Hdr.FC.SubType) \n\t{\n\t\tcase SUBTYPE_ASSOC_REQ:\n\t\t\t*Machine = ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_ASSOC_REQ;\n\t\t\tbreak;\n\t\tcase SUBTYPE_ASSOC_RSP:\n\t\t\t*Machine = ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_ASSOC_RSP;\n\t\t\tbreak;\n\t\tcase SUBTYPE_REASSOC_REQ:\n\t\t\t*Machine = ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_REASSOC_REQ;\n\t\t\tbreak;\n\t\tcase SUBTYPE_REASSOC_RSP:\n\t\t\t*Machine = ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_REASSOC_RSP;\n\t\t\tbreak;\n\t\tcase SUBTYPE_PROBE_REQ:\n\t\t\t*Machine = SYNC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_PROBE_REQ;\n\t\t\tbreak;\n\t\tcase SUBTYPE_PROBE_RSP:\n\t\t\t*Machine = SYNC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_PROBE_RSP;\n\t\t\tbreak;\n\t\tcase SUBTYPE_BEACON:\n\t\t\t*Machine = SYNC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_BEACON;\n\t\t\tbreak;\n\t\tcase SUBTYPE_ATIM:\n\t\t\t*Machine = SYNC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_ATIM;\n\t\t\tbreak;\n\t\tcase SUBTYPE_DISASSOC:\n\t\t\t*Machine = ASSOC_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_DISASSOC_REQ;\n\t\t\tbreak;\n\t\tcase SUBTYPE_AUTH:\n\t\t\t/* get the sequence number from payload 24 Mac Header + 2 bytes algorithm*/\n\t\t\tNdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT));\n\t\t\tNdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(USHORT));\n\t\t\tif (Seq == 1 || Seq == 3) \n\t\t\t{\n\t\t\t\t*Machine = AUTH_RSP_STATE_MACHINE;\n\t\t\t\t*MsgType = MT2_PEER_AUTH_ODD;\n\t\t\t} \n\t\t\telse if (Seq == 2 || Seq == 4) \n\t\t\t{\n\t\t\t\tif (Alg == AUTH_MODE_OPEN || Alg == AUTH_MODE_KEY)\n\t\t\t\t{\n\t\t\t\t\t*Machine = AUTH_STATE_MACHINE;\n\t\t\t\t\t*MsgType = MT2_PEER_AUTH_EVEN;\n\t\t\t\t} \n\t\t\t} \n\t\t\telse \n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SUBTYPE_DEAUTH:\n\t\t\t*Machine = AUTH_RSP_STATE_MACHINE;\n\t\t\t*MsgType = MT2_PEER_DEAUTH;\n\t\t\tbreak;\n\t\tcase SUBTYPE_ACTION:\n\t\tcase SUBTYPE_ACTION_NO_ACK:\n\t\t\t*Machine = ACTION_STATE_MACHINE;\n\t\t\t/*  Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support*/\n\t\t\tif ((pFrame->Octet[0]&0x7F) > MAX_PEER_CATE_MSG) \n\t\t\t{\n\t\t\t\t*MsgType = MT2_ACT_INVALID;\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\t*MsgType = (pFrame->Octet[0]&0x7F);\n\t\t\t} \n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn FALSE;\n\t\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/* ===========================================================================================*/\n/* state_machine.c*/\n/* ===========================================================================================*/\n\n/*! \\brief Initialize the state machine.\n *\t\\param *S\t\t\tpointer to the state machine \n *\t\\param\tTrans\t\tState machine transition function\n *\t\\param\tStNr\t\tnumber of states \n *\t\\param\tMsgNr\t\tnumber of messages \n *\t\\param\tDefFunc \tdefault function, when there is invalid state/message combination \n *\t\\param\tInitState\tinitial state of the state machine \n *\t\\param\tBase\t\tStateMachine base, internal use only\n *\t\\pre p_sm should be a legal pointer\n *\t\\post\n\n IRQL = PASSIVE_LEVEL\n \n */\nVOID StateMachineInit(\n\tIN STATE_MACHINE *S, \n\tIN STATE_MACHINE_FUNC Trans[], \n\tIN ULONG StNr, \n\tIN ULONG MsgNr, \n\tIN STATE_MACHINE_FUNC DefFunc, \n\tIN ULONG InitState, \n\tIN ULONG Base) \n{\n\tULONG i, j;\n\n\t/* set number of states and messages*/\n\tS->NrState = StNr;\n\tS->NrMsg   = MsgNr;\n\tS->Base    = Base;\n\n\tS->TransFunc  = Trans;\n\n\t/* init all state transition to default function*/\n\tfor (i = 0; i < StNr; i++) \n\t{\n\t\tfor (j = 0; j < MsgNr; j++) \n\t\t{\n\t\t\tS->TransFunc[i * MsgNr + j] = DefFunc;\n\t\t}\n\t}\n\n\t/* set the starting state*/\n\tS->CurrState = InitState;\n}\n\n/*! \\brief This function fills in the function pointer into the cell in the state machine \n *\t\\param *S\tpointer to the state machine\n *\t\\param St\tstate\n *\t\\param Msg\tincoming message\n *\t\\param f\tthe function to be executed when (state, message) combination occurs at the state machine\n *\t\\pre *S should be a legal pointer to the state machine, st, msg, should be all within the range, Base should be set in the initial state\n *\t\\post\n\n IRQL = PASSIVE_LEVEL\n \n */\nVOID StateMachineSetAction(\n\tIN STATE_MACHINE *S, \n\tIN ULONG St, \n\tIN ULONG Msg, \n\tIN STATE_MACHINE_FUNC Func) \n{\n\tULONG MsgIdx;\n\n\tMsgIdx = Msg - S->Base;\n\n\tif (St < S->NrState && MsgIdx < S->NrMsg) \n\t{\n\t\t/* boundary checking before setting the action*/\n\t\tS->TransFunc[St * S->NrMsg + MsgIdx] = Func;\n\t} \n}\n\n/*! \\brief\t This function does the state transition\n *\t\\param\t *Adapter the NIC adapter pointer\n *\t\\param\t *S \t  the state machine\n *\t\\param\t *Elem\t  the message to be executed\n *\t\\return   None\n \n IRQL = DISPATCH_LEVEL\n \n */\nVOID StateMachinePerformAction(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN STATE_MACHINE *S, \n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN ULONG CurrState)\n{\n\n\tif (S->TransFunc[(CurrState) * S->NrMsg + Elem->MsgType - S->Base])\n\t\t(*(S->TransFunc[(CurrState) * S->NrMsg + Elem->MsgType - S->Base]))(pAd, Elem);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThe drop function, when machine executes this, the message is simply \n\t\tignored. This function does nothing, the message is freed in \n\t\tStateMachinePerformAction()\n\t==========================================================================\n */\nVOID Drop(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nUCHAR RandomByte(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tULONG i;\n\tUCHAR R, Result;\n\n\tR = 0;\n\n\tif (pAd->Mlme.ShiftReg == 0)\n\tNdisGetSystemUpTime((ULONG *)&pAd->Mlme.ShiftReg);\n\n\tfor (i = 0; i < 8; i++) \n\t{\n\t\tif (pAd->Mlme.ShiftReg & 0x00000001) \n\t\t{\n\t\t\tpAd->Mlme.ShiftReg = ((pAd->Mlme.ShiftReg ^ LFSR_MASK) >> 1) | 0x80000000;\n\t\t\tResult = 1;\n\t\t} \n\t\telse \n\t\t{\n\t\t\tpAd->Mlme.ShiftReg = pAd->Mlme.ShiftReg >> 1;\n\t\t\tResult = 0;\n\t\t}\n\t\tR = (R << 1) | Result;\n\t}\n\n\treturn R;\n}\n\n\nUCHAR RandomByte2(\n        IN PRTMP_ADAPTER pAd)\n{\n\tUINT32 a,b;\n\tUCHAR value, seed = 0;\n\n\t/*MAC statistic related*/\n\tRTMP_IO_READ32(pAd, RX_STA_CNT1, &a);\n\ta &= 0x0000ffff;\n\tRTMP_IO_READ32(pAd, RX_STA_CNT0, &b); \n\tb &= 0x0000ffff;\n\tvalue = (a<<16)|b;\n\n\t/*get seed by RSSI or SNR related info */\n\tseed = rtmp_bbp_get_random_seed(pAd);\n\n\treturn value ^ seed ^ RandomByte(pAd);\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tVerify the support rate for different PHY type\n\n\tArguments:\n\t\tpAd \t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\t========================================================================\n*/\nVOID RTMPCheckRates(\n\tIN PRTMP_ADAPTER pAd,\n\tINOUT UCHAR SupRate[],\n\tINOUT UCHAR *SupRateLen)\n{\n\tUCHAR\tRateIdx, i, j;\n\tUCHAR\tNewRate[12], NewRateLen;\n\t\n\tNewRateLen = 0;\n\t\n\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\tRateIdx = 4;\n\telse\n\t\tRateIdx = 12;\n\n\t/* Check for support rates exclude basic rate bit */\n\tfor (i = 0; i < *SupRateLen; i++)\n\t\tfor (j = 0; j < RateIdx; j++)\n\t\t\tif ((SupRate[i] & 0x7f) == RateIdTo500Kbps[j])\n\t\t\t\tNewRate[NewRateLen++] = SupRate[i];\n\t\t\t\n\t*SupRateLen = NewRateLen;\n\tNdisMoveMemory(SupRate, NewRate, NewRateLen);\n}\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11_N_SUPPORT\nBOOLEAN RTMPCheckChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tCentralChannel,\n\tIN UCHAR\t\tChannel)\n{\n\tUCHAR\t\tk;\n\tUCHAR\t\tUpperChannel = 0, LowerChannel = 0;\n\tUCHAR\t\tNoEffectChannelinList = 0;\n\t\n\t/* Find upper and lower channel according to 40MHz current operation. */\n\tif (CentralChannel < Channel)\n\t{\n\t\tUpperChannel = Channel;\n\t\tif (CentralChannel > 2)\n\t\t\tLowerChannel = CentralChannel - 2;\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\telse if (CentralChannel > Channel)\n\t{\n\t\tUpperChannel = CentralChannel + 2;\n\t\tLowerChannel = Channel;\n\t}\n\n\tfor (k = 0;k < pAd->ChannelListNum;k++)\n\t{\n\t\tif (pAd->ChannelList[k].Channel == UpperChannel)\n\t\t{\n\t\t\tNoEffectChannelinList ++;\n\t\t}\n\t\tif (pAd->ChannelList[k].Channel == LowerChannel)\n\t\t{\n\t\t\tNoEffectChannelinList ++;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Total Channel in Channel List = [%d]\\n\", NoEffectChannelinList));\n\tif (NoEffectChannelinList == 2)\n\t\treturn TRUE;\n\telse\n\t\treturn FALSE;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tVerify the support rate for HT phy type\n\n\tArguments:\n\t\tpAd \t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tFALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability.  (AP Mode)\n\n\tIRQL = PASSIVE_LEVEL\n\n\t========================================================================\n*/\nBOOLEAN RTMPCheckHt(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Wcid,\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN ADD_HT_INFO_IE *pAddHtInfo)\n{\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn FALSE;\n\n\t/* If use AMSDU, set flag.*/\n\tif (pAd->CommonCfg.DesiredHtPhy.AmsduEnable)\n\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_AMSDU_INUSED);\n\t/* Save Peer Capability*/\n\tif (pHtCapability->HtCapInfo.ShortGIfor20)\n\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_SGI20_CAPABLE);\n\tif (pHtCapability->HtCapInfo.ShortGIfor40)\n\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_SGI40_CAPABLE);\n\tif (pHtCapability->HtCapInfo.TxSTBC)\n\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_TxSTBC_CAPABLE);\n\tif (pHtCapability->HtCapInfo.RxSTBC)\n\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_RxSTBC_CAPABLE);\n\tif (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport)\n\t{\n\t\tCLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_RDG_CAPABLE);\n\t}\n\t\n\tif (Wcid < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tpAd->MacTab.Content[Wcid].MpduDensity = pHtCapability->HtCapParm.MpduDensity;\n\t}\n\n\t/* Will check ChannelWidth for MCSSet[4] below*/\n\tNdisZeroMemory(&pAd->MlmeAux.HtCapability.MCSSet[0], 16);\n\tpAd->MlmeAux.HtCapability.MCSSet[4] = 0x1;\n\tswitch (pAd->CommonCfg.RxStream)\n\t{\n\t\tcase 3:\n\t\t\tpAd->MlmeAux.HtCapability.MCSSet[2] = 0xff;\n\t\tcase 2:\n\t\t\tpAd->MlmeAux.HtCapability.MCSSet[1] = 0xff;\n\t\tcase 1:\n\t\tdefault:\n\t\t\tpAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;\n\t\t\tbreak;\n\t}\t\n\n\tpAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.ChannelWidth;\n\t\t\n\t/*\n\t\tIf both station and AP use 40MHz, still need to check if the 40MHZ band's legality in my country region\n\t\tIf this 40MHz wideband is not allowed in my country list, use bandwidth 20MHZ instead,\n\t*/\n\tif (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)\n\t{\n\t\tif (RTMPCheckChannel(pAd, pAd->MlmeAux.CentralChannel, pAd->MlmeAux.Channel) == FALSE)\n\t\t{\n\t\t\tpAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = BW_20;\n\t\t}\n\t}\n\t\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"RTMPCheckHt:: HtCapInfo.ChannelWidth=%d, RecomWidth=%d, DesiredHtPhy.ChannelWidth=%d, BW40MAvailForA/G=%d/%d, PhyMode=%d \\n\",\n\t\tpAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth, pAddHtInfo->AddHtInfo.RecomWidth, pAd->CommonCfg.DesiredHtPhy.ChannelWidth,\n\t\tpAd->NicConfig2.field.BW40MAvailForA, pAd->NicConfig2.field.BW40MAvailForG, pAd->CommonCfg.PhyMode));\n    \n\tpAd->MlmeAux.HtCapability.HtCapInfo.GF =  pHtCapability->HtCapInfo.GF &pAd->CommonCfg.DesiredHtPhy.GF;\n\n\t/* Send Assoc Req with my HT capability.*/\n\tpAd->MlmeAux.HtCapability.HtCapInfo.AMsduSize =  pAd->CommonCfg.DesiredHtPhy.AmsduSize;\n\tpAd->MlmeAux.HtCapability.HtCapInfo.MimoPs =  pAd->CommonCfg.DesiredHtPhy.MimoPs;\n\tpAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20 =  (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20) & (pHtCapability->HtCapInfo.ShortGIfor20);\n\tpAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40 =  (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40) & (pHtCapability->HtCapInfo.ShortGIfor40);\n\tpAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC =  (pAd->CommonCfg.DesiredHtPhy.TxSTBC)&(pHtCapability->HtCapInfo.RxSTBC);\n\tpAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC =  (pAd->CommonCfg.DesiredHtPhy.RxSTBC)&(pHtCapability->HtCapInfo.TxSTBC);\n\tpAd->MlmeAux.HtCapability.HtCapParm.MaxRAmpduFactor = pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor;\n    pAd->MlmeAux.HtCapability.HtCapParm.MpduDensity = pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity;\n\tpAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = pHtCapability->ExtHtCapInfo.PlusHTC;\n\tpAd->MacTab.Content[Wcid].HTCapability.ExtHtCapInfo.PlusHTC = pHtCapability->ExtHtCapInfo.PlusHTC;\n\tif (pAd->CommonCfg.bRdg)\n\t{\n\t\tpAd->MlmeAux.HtCapability.ExtHtCapInfo.RDGSupport = pHtCapability->ExtHtCapInfo.RDGSupport;\n        pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = 1;\n\t}\n\t\n    if (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_20)\n        pAd->MlmeAux.HtCapability.MCSSet[4] = 0x0;  /* BW20 can't transmit MCS32*/\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t    setETxBFCap(pAd, &pAd->MlmeAux.HtCapability.TxBFCap);\n#endif /* TXBF_SUPPORT */\n\n\tCOPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability);\n\treturn TRUE;\n}\n\n\n#ifdef DOT11_VHT_AC\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tVerify the support rate for HT phy type\n\n\tArguments:\n\t\tpAd \t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tFALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability.  (AP Mode)\n\n\tIRQL = PASSIVE_LEVEL\n\n\t========================================================================\n*/\nBOOLEAN RTMPCheckVht(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Wcid,\n\tIN VHT_CAP_IE *vht_cap,\n\tIN VHT_OP_IE *vht_op)\n{\n\tVHT_CAP_INFO *vht_cap_info = &vht_cap->vht_cap;\n\tMAC_TABLE_ENTRY *pEntry;\n\n\t// TODO: shiang-6590, not finish yet!!!!\n\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn FALSE;\n\n\tpEntry = &pAd->MacTab.Content[Wcid];\n\t/* Save Peer Capability*/\n\tif (vht_cap_info->sgi_80M)\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI80_CAPABLE);\n\tif (vht_cap_info->sgi_160M)\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI160_CAPABLE);\n\tif (vht_cap_info->tx_stbc)\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_VHT_TXSTBC_CAPABLE);\n\tif (vht_cap_info->rx_stbc)\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_VHT_RXSTBC_CAPABLE);\n\n\t/* Will check ChannelWidth for MCSSet[4] below */\n\tNdisZeroMemory(&pAd->MlmeAux.vht_cap.mcs_set, sizeof(VHT_MCS_SET));\n\tpAd->MlmeAux.vht_cap.mcs_set.rx_high_rate = pAd->CommonCfg.RxStream * 325;\n\tpAd->MlmeAux.vht_cap.mcs_set.tx_high_rate = pAd->CommonCfg.TxStream * 325;\n\n\t//pAd->MlmeAux.vht_cap.vht_cap.ch_width = vht_cap_info->ch_width;\n\n\n\treturn TRUE;\n}\n#endif /* DOT11_VHT_AC */\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tVerify the support rate for different PHY type\n\n\tArguments:\n\t\tpAd \t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\t========================================================================\n*/\nVOID RTMPUpdateMlmeRate(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUCHAR MinimumRate;\n\tUCHAR ProperMlmeRate; /*= RATE_54;*/\n\tUCHAR i, j, RateIdx = 12; /*1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54*/\n\tBOOLEAN\tbMatch = FALSE;\n\n\n\tswitch (pAd->CommonCfg.PhyMode) \n\t{\n\t\tcase (WMODE_B):\n\t\t\tProperMlmeRate = RATE_11;\n\t\t\tMinimumRate = RATE_1;\n\t\t\tbreak;\n\t\tcase (WMODE_B | WMODE_G):\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_B | WMODE_G | WMODE_GN | WMODE_A |WMODE_AN):\n\t\tcase (WMODE_B | WMODE_G | WMODE_GN):\n#endif /* DOT11_N_SUPPORT */\n\t\t\tif ((pAd->MlmeAux.SupRateLen == 4) &&\n\t\t\t\t(pAd->MlmeAux.ExtRateLen == 0))\n\t\t\t\t/* B only AP*/\n\t\t\t\tProperMlmeRate = RATE_11;\n\t\t\telse\n\t\t\t\tProperMlmeRate = RATE_24;\n\t\t\t\n\t\t\tif (pAd->MlmeAux.Channel <= 14)\n\t\t\t\tMinimumRate = RATE_1;\n\t\t\telse\n\t\t\t\tMinimumRate = RATE_6;\n\t\t\tbreak;\n\t\tcase (WMODE_A):\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_GN):\t/* rt2860 need to check mlmerate for 802.11n*/\n\t\tcase (WMODE_G | WMODE_GN):\n\t\tcase (WMODE_A | WMODE_G | WMODE_GN | WMODE_AN):\n\t\tcase (WMODE_A |WMODE_AN):\n\t\tcase (WMODE_AN):\t\n#endif /* DOT11_N_SUPPORT */\n\t\t\tProperMlmeRate = RATE_24;\n\t\t\tMinimumRate = RATE_6;\n\t\t\tbreak;\n\t\tcase (WMODE_A |WMODE_B | WMODE_G):\n\t\t\tProperMlmeRate = RATE_24;\n\t\t\tif (pAd->MlmeAux.Channel <= 14)\n\t\t\t   MinimumRate = RATE_1;\n\t\t\telse\n\t\t\t\tMinimumRate = RATE_6;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tProperMlmeRate = RATE_1;\n\t\t\tMinimumRate = RATE_1;\n\t\t\tbreak;\n\t}\n\n\n#ifdef DOT11_VHT_AC\n\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t{\n\t\tProperMlmeRate = RATE_11;\n\t\tMinimumRate = RATE_1;\n\t}\n\telse\n\t{\n\t\tif (WMODE_CAP(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\t{\n\t\t\tif ((pAd->MlmeAux.SupRateLen == 4) && (pAd->MlmeAux.ExtRateLen == 0))\n\t\t\t\tProperMlmeRate = RATE_11; /* B only AP */\n\t\t\telse\n\t\t\t\tProperMlmeRate = RATE_24;\n\n\t\t\tif (pAd->MlmeAux.Channel <= 14)\n\t\t\t\tMinimumRate = RATE_1;\n\t\t\telse\n\t\t\t\tMinimumRate = RATE_6;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tProperMlmeRate = RATE_24;\n\t\t\tMinimumRate = RATE_6;\n\t\t}\n\t}\n#endif /* DOT11_VHT_AC */\n\n\tfor (i = 0; i < pAd->MlmeAux.SupRateLen; i++)\n\t{\n\t\tfor (j = 0; j < RateIdx; j++)\n\t\t{\n\t\t\tif ((pAd->MlmeAux.SupRate[i] & 0x7f) == RateIdTo500Kbps[j])\n\t\t\t{\n\t\t\t\tif (j == ProperMlmeRate)\n\t\t\t\t{\n\t\t\t\t\tbMatch = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\n\t\tif (bMatch)\n\t\t\tbreak;\n\t}\n\n\tif (bMatch == FALSE)\n\t{\n\tfor (i = 0; i < pAd->MlmeAux.ExtRateLen; i++)\n\t{\n\t\tfor (j = 0; j < RateIdx; j++)\n\t\t{\n\t\t\tif ((pAd->MlmeAux.ExtRate[i] & 0x7f) == RateIdTo500Kbps[j])\n\t\t\t{\n\t\t\t\t\tif (j == ProperMlmeRate)\n\t\t\t\t\t{\n\t\t\t\t\t\tbMatch = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t}\n\t\t\n\t\t\tif (bMatch)\n\t\t\tbreak;\t\t\n\t}\n\t}\n\n\tif (bMatch == FALSE)\n\t{\n\t\tProperMlmeRate = MinimumRate;\n\t}\n\n\tpAd->CommonCfg.MlmeRate = MinimumRate;\n\tpAd->CommonCfg.RtsRate = ProperMlmeRate;\n\tif (pAd->CommonCfg.MlmeRate >= RATE_6)\n\t{\n\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM;\n\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t}\n\telse\n\t{\n\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;\n\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = pAd->CommonCfg.MlmeRate;\n\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_CCK;\n\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = pAd->CommonCfg.MlmeRate;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPUpdateMlmeRate ==>   MlmeTransmit = 0x%x  \\n\" , pAd->CommonCfg.MlmeTransmit.word));\n}\n\n\nCHAR RTMPAvgRssi(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN RSSI_SAMPLE \t\t*pRssi)\n{\n\tCHAR Rssi;\n\n\tif(pAd->Antenna.field.RxPath == 3)\n\t{\n\t\tRssi = (pRssi->AvgRssi0 + pRssi->AvgRssi1 + pRssi->AvgRssi2)/3;\n\t}\n\telse if(pAd->Antenna.field.RxPath == 2)\n\t{\n\t\tRssi = (pRssi->AvgRssi0 + pRssi->AvgRssi1)>>1;\n\t}\n\telse\n\t{\n\t\tRssi = pRssi->AvgRssi0;\n\t}\n\n\treturn Rssi;\n}\n\n\nCHAR RTMPMaxRssi(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2)\n{\n\tCHAR\tlarger = -127;\n\t\n\tif ((pAd->Antenna.field.RxPath == 1) && (Rssi0 != 0))\n\t{\n\t\tlarger = Rssi0;\n\t}\n\n\tif ((pAd->Antenna.field.RxPath >= 2) && (Rssi1 != 0))\n\t{\n\t\tlarger = max(Rssi0, Rssi1);\n\t}\n\t\n\tif ((pAd->Antenna.field.RxPath == 3) && (Rssi2 != 0))\n\t{\n\t\tlarger = max(larger, Rssi2);\n\t}\n\n\tif (larger == -127)\n\t\tlarger = 0;\n\n\treturn larger;\n}\n\n\nCHAR RTMPMinSnr(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN CHAR\t\t\t\tSnr0,\n\tIN CHAR\t\t\t\tSnr1)\n{\n\tCHAR\tsmaller = Snr0;\n\t\n\tif (pAd->Antenna.field.RxPath == 1) \n\t{\n\t\tsmaller = Snr0;\n\t}\n\n\tif ((pAd->Antenna.field.RxPath >= 2) && (Snr1 != 0))\n\t{\n\t\tsmaller = min(Snr0, Snr1);\n\t}\n \n\treturn smaller;\n}\n\n/*\n    ========================================================================\n    Routine Description:\n        Periodic evaluate antenna link status\n        \n    Arguments:\n        pAd         - Adapter pointer\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID AsicEvaluateRxAnt(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n#ifdef RTMP_MAC_USB\n#ifdef CONFIG_STA_SUPPORT\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\treturn;\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)\n\t\t|| OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) \n\t)\n\t\treturn;\n\t\n#ifdef RT3290\n\tif (IS_RT3290(pAd) && (pAd->RalinkCounters.OneSecTransmittedByteCount >= 500))\n\t\treturn;\n#endif /* RT3290 */\n\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n/*\t\t\tif (pAd->CommonCfg.bRxAntDiversity == ANT_DIVERSITY_DISABLE)*/\n\t\t\t/* for SmartBit 64-byte stream test */\n\t\t\tif (pAd->MacTab.Size > 0)\n\t\t\t\tAPAsicEvaluateRxAnt(pAd);\n\t\t\treturn;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\n\t\t\tif (pAd->StaCfg.Psm == PWR_SAVE)\n\t\t\t\treturn;\n\n\t\t\trtmp_bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)\n#ifdef P2P_SUPPORT\n\t\t\t\t || P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t\t{\n\t\t\t\tULONG\tTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\t\t\t\t\tpAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\t\t\t\t\tpAd->RalinkCounters.OneSecTxFailCount;\n\n\t\t\t\t/* dynamic adjust antenna evaluation period according to the traffic*/\n\t\t\t\tif (TxTotalCnt > 50)\n\t\t\t\t{\n\t\t\t\t\tRTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20);\n\t\t\t\t\tpAd->Mlme.bLowThroughput = FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);\n\t\t\t\t\tpAd->Mlme.bLowThroughput = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n}\n\n\n/*\n    ========================================================================\n    Routine Description:\n        After evaluation, check antenna link status\n        \n    Arguments:\n        pAd         - Adapter pointer\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID AsicRxAntEvalTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tRTMP_ADAPTER\t*pAd = (RTMP_ADAPTER *)FunctionContext;\n#ifdef CONFIG_STA_SUPPORT\n\tCHAR\t\t\tlarger = -127, rssi0, rssi1, rssi2, rssi_diff;\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST) \n\t\t|| OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) \n\t)\n\t\treturn;\n\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n/*\t\t\tif (pAd->CommonCfg.bRxAntDiversity == ANT_DIVERSITY_DISABLE)*/\n\t\t\t\tAPAsicRxAntEvalTimeout(pAd);\n\t\t\treturn;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif (pAd->StaCfg.Psm == PWR_SAVE)\n\t\t\t\treturn;\n\n\n\t\t\t/* if the traffic is low, use average rssi as the criteria*/\n\t\t\tif (pAd->Mlme.bLowThroughput == TRUE)\n\t\t\t{\n\t\t\t\trssi0 = pAd->StaCfg.RssiSample.LastRssi0;\n\t\t\t\trssi1 = pAd->StaCfg.RssiSample.LastRssi1;\n\t\t\t\trssi2 = pAd->StaCfg.RssiSample.LastRssi2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trssi0 = pAd->StaCfg.RssiSample.AvgRssi0;\n\t\t\t\trssi1 = pAd->StaCfg.RssiSample.AvgRssi1;\n\t\t\t\trssi2 = pAd->StaCfg.RssiSample.AvgRssi2;\n\t\t\t}\n\n\t\t\tif(pAd->Antenna.field.RxPath == 3)\n\t\t\t{\n\t\t\t\tlarger = max(rssi0, rssi1);\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\t\tif (pAd->CommonCfg.TxStream >= 3)\n\t\t\t\t{\n\t\t\t\t\tpAd->Mlme.RealRxPath = 3;\n\t\t\t\t}\n\t\t\t\telse\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t\tif (larger > (rssi2 + 20))\n\t\t\t\t\tpAd->Mlme.RealRxPath = 2;\n\t\t\t\telse\n\t\t\t\t\tpAd->Mlme.RealRxPath = 3;\n\t\t\t}\n\t\t\telse if(pAd->Antenna.field.RxPath == 2)\n\t\t\t{\n\t\t\t\tif (rssi0 > (rssi1 + 20))\n\t\t\t\t\tpAd->Mlme.RealRxPath = 1;\n\t\t\t\telse\n\t\t\t\t\tpAd->Mlme.RealRxPath = 2;\n\t\t\t}\n\n\t\t\trtmp_bbp_set_rxpath(pAd, pAd->Mlme.RealRxPath);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n}\n\n\nVOID APSDPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&\n\t\t!OPSTATUS_TEST_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED))\n\t\treturn;\n\n\tpAd->CommonCfg.TriggerTimerCount++;\n\n/* Driver should not send trigger frame, it should be send by application layer*/\n/*\n\tif (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable\n\t\t&& (pAd->CommonCfg.bNeedSendTriggerFrame ||\n\t\t(((pAd->CommonCfg.TriggerTimerCount%20) == 19) && (!pAd->CommonCfg.bAPSDAC_BE || !pAd->CommonCfg.bAPSDAC_BK || !pAd->CommonCfg.bAPSDAC_VI || !pAd->CommonCfg.bAPSDAC_VO))))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Sending trigger frame and enter service period when support APSD\\n\"));\n\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);\n\t\tpAd->CommonCfg.bNeedSendTriggerFrame = FALSE;\n\t\tpAd->CommonCfg.TriggerTimerCount = 0;\n\t\tpAd->CommonCfg.bInServicePeriod = TRUE;\n\t}*/\n}\n\n/*\n    ========================================================================\n    Routine Description:\n        Set/reset MAC registers according to bPiggyBack parameter\n        \n    Arguments:\n        pAd         - Adapter pointer\n        bPiggyBack  - Enable / Disable Piggy-Back\n\n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID RTMPSetPiggyBack(\n    IN PRTMP_ADAPTER    pAd,\n    IN BOOLEAN          bPiggyBack)\n{\n\tTX_LINK_CFG_STRUC  TxLinkCfg;\n    \n\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\n\tTxLinkCfg.field.TxCFAckEn = bPiggyBack;\n\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n}\n\n/*\n    ========================================================================\n    Routine Description:\n        check if this entry need to switch rate automatically\n        \n    Arguments:\n        pAd         \n        pEntry \t \t\n\n    Return Value:\n        TURE\n        FALSE\n        \n    ========================================================================\n*/\nBOOLEAN RTMPCheckEntryEnableAutoRateSwitch(\n\tIN PRTMP_ADAPTER    pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry)\t\n{\n\tBOOLEAN\t\tresult = TRUE;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\tif (pEntry)\n\t{\n\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t\tresult = pAd->ApCfg.MBSSID[pEntry->apidx].bAutoTxRateSwitch;\n#ifdef APCLI_SUPPORT\n\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\tresult = pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].bAutoTxRateSwitch;\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* only associated STA counts*/\n#ifdef P2P_SUPPORT\n\t\tif (pEntry && IS_P2P_GO_ENTRY(pEntry))\n\t\t\tresult = pAd->ApCfg.MBSSID[pEntry->apidx].bAutoTxRateSwitch;\n\t\telse if (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\tresult = pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].bAutoTxRateSwitch;\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\tif ((pEntry && IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n#ifdef QOS_DLS_SUPPORT\n\t\t\t|| (pEntry && IS_ENTRY_DLS(pEntry))\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t|| (pEntry && IS_ENTRY_TDLS(pEntry))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\tresult = pAd->StaCfg.bAutoTxRateSwitch;\n\t\t}\n\t\telse\n\t\t\tresult = FALSE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n\treturn result;\n}\n\n\nBOOLEAN RTMPAutoRateSwitchCheck(\n\tIN PRTMP_ADAPTER    pAd)\t\n{\t\t\t\n#ifdef CONFIG_AP_SUPPORT\t\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tINT\tapidx = 0;\n\t\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tif (pAd->ApCfg.MBSSID[apidx].bAutoTxRateSwitch)\n\t\t\t\treturn TRUE;\n\t\t}\t\t\t\n#ifdef APCLI_SUPPORT\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t{\n\t\t\tif (pAd->ApCfg.ApCliTab[apidx].bAutoTxRateSwitch)\n\t\t\t\treturn TRUE;\n\t\t}\t\t\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pAd->StaCfg.bAutoTxRateSwitch)\n\t\t\treturn TRUE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\treturn FALSE;\n}\n\n\n/*\n    ========================================================================\n    Routine Description:\n        check if this entry need to fix tx legacy rate\n        \n    Arguments:\n        pAd         \n        pEntry \t \t\n\n    Return Value:\n        TURE\n        FALSE\n        \n    ========================================================================\n*/\nUCHAR RTMPStaFixedTxMode(\n\tIN PRTMP_ADAPTER    pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry)\t\n{\n\tUCHAR\ttx_mode = FIXED_TXMODE_HT;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\tif (pEntry)\n\t{\n\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t\ttx_mode = (UCHAR)pAd->ApCfg.MBSSID[pEntry->apidx].DesiredTransmitSetting.field.FixedTxMode;\n#ifdef APCLI_SUPPORT\n\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\ttx_mode = (UCHAR)pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesiredTransmitSetting.field.FixedTxMode;\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\ttx_mode = (UCHAR)pAd->ApCfg.MBSSID[pEntry->apidx].DesiredTransmitSetting.field.FixedTxMode;\n\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\ttx_mode = (UCHAR)pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx].DesiredTransmitSetting.field.FixedTxMode;\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\ttx_mode = (UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn tx_mode;\n}\n\n/*\n    ========================================================================\n    Routine Description:\n        Overwrite HT Tx Mode by Fixed Legency Tx Mode, if specified.\n        \n    Arguments:\n        pAd         \n        pEntry \t \t\n\n    Return Value:\n        TURE\n        FALSE\n        \n    ========================================================================\n*/\nVOID RTMPUpdateLegacyTxSetting(\n\t\tUCHAR\t\t\t\tfixed_tx_mode,\n\t\tPMAC_TABLE_ENTRY\tpEntry)\n{\n\tHTTRANSMIT_SETTING TransmitSetting;\n\t\n\tif (fixed_tx_mode == FIXED_TXMODE_HT)\n\t\treturn;\n\t\t\t\t\t\t\t \t\t\t\t\n\tTransmitSetting.word = 0;\n\n\tTransmitSetting.field.MODE = pEntry->HTPhyMode.field.MODE;\n\tTransmitSetting.field.MCS = pEntry->HTPhyMode.field.MCS;\n\t\t\t\t\t\t\n\tif (fixed_tx_mode == FIXED_TXMODE_CCK)\n\t{\n\t\tTransmitSetting.field.MODE = MODE_CCK;\n\t\t/* CCK mode allow MCS 0~3*/\n\t\tif (TransmitSetting.field.MCS > MCS_3)\n\t\t\tTransmitSetting.field.MCS = MCS_3;\n\t}\n\telse \n\t{\n\t\tTransmitSetting.field.MODE = MODE_OFDM;\n\t\t/* OFDM mode allow MCS 0~7*/\n\t\tif (TransmitSetting.field.MCS > MCS_7)\n\t\t\tTransmitSetting.field.MCS = MCS_7;\n\t}\n\t\n\tif (pEntry->HTPhyMode.field.MODE >= TransmitSetting.field.MODE)\n\t{\n\t\tpEntry->HTPhyMode.word = TransmitSetting.word;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPUpdateLegacyTxSetting : wcid-%d, MODE=%s, MCS=%d \\n\", \n\t\t\t\tpEntry->Aid, get_phymode_str(pEntry->HTPhyMode.field.MODE), pEntry->HTPhyMode.field.MCS));\t\t\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : the fixed TxMode is invalid \\n\", __FUNCTION__));\t\n\t}\n}\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tdynamic tune BBP R66 to find a balance between sensibility and \n\t\tnoise isolation\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AsicStaBbpTuning(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR\tOrigR66Value = 0, R66;/*, R66UpperBound = 0x30, R66LowerBound = 0x30;*/\n\tCHAR\tRssi;\n\n\t/* 2860C did not support Fase CCA, therefore can't tune*/\n\tif (pAd->MACVersion == 0x28600100)\n\t\treturn;\n\n\t\n\t/* work as a STA*/\n\tif (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)  /* no R66 tuning when SCANNING*/\n\t\treturn;\n\n\tif ((pAd->OpMode == OPMODE_STA) \n\t\t&& (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)\n\t\t\t)\n\t\t&& !(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n\t\t)\n\t{\n\t\trtmp_bbp_get_agc(pAd, &OrigR66Value, RX_CHAIN_0);\n\t\tR66 = OrigR66Value;\n\t\t\n\t\tif (pAd->Antenna.field.RxPath > 1)\n\t\t\tRssi = (pAd->StaCfg.RssiSample.AvgRssi0 + pAd->StaCfg.RssiSample.AvgRssi1) >> 1;\n\t\telse\n\t\t\tRssi = pAd->StaCfg.RssiSample.AvgRssi0;\n\n\t\tRTMP_CHIP_ASIC_AGC_ADJUST(pAd, Rssi, R66);\n\n\t\t// TODO: shiang,I didn't find AsicAGCAdjust for RT30xx, so I move following code from upper #if case.\n#ifdef RT3290\n\t\t// TODO: shiang, what's the BbpWriteLatch[ ] ?????\n\t\tif (IS_RT3290(pAd))\n\t\t{\n\t\t\tif (Rssi >= -36)\n\t\t\t{\n\t\t\t\tif (pAd->BbpWriteLatch[BBP_R77] != 0x27)\n\t\t\t\t{\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x52);\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R77, 0x27);\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1C);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pAd->BbpWriteLatch[BBP_R77] != 0x58)\n\t\t\t\t{\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R77, 0x58);\n\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12);\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* RT3290 */\n\n\t}\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nVOID RTMPSetAGCInitValue(RTMP_ADAPTER *pAd, UCHAR BandWidth)\n{\n\tif (pAd->chipOps.ChipAGCInit != NULL)\n\t\tpAd->chipOps.ChipAGCInit(pAd, BandWidth);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the channel has the property.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tChanNum\t\t\t- channel number\n\tProperty\t\t- channel property, CHANNEL_PASSIVE_SCAN, etc.\n\nReturn Value:\n\tTRUE\t\t\t- YES\n\tFALSE\t\t\t- NO\n\nNote:\n========================================================================\n*/\nBOOLEAN CHAN_PropertyCheck(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT32\t\t\tChanNum,\n\tIN UCHAR\t\t\tProperty)\n{\n\tUINT32 IdChan;\n\n\n\t/* look for all registered channels */\n\tfor(IdChan=0; IdChan<pAd->ChannelListNum; IdChan++)\n\t{\n\t\tif (pAd->ChannelList[IdChan].Channel == ChanNum)\n\t\t{\n\t\t\tif ((pAd->ChannelList[IdChan].Flags & Property) == Property)\n\t\t\t\treturn TRUE;\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n\n\n"
  },
  {
    "path": "src/common/multi_channel.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tmulti_channel.c\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n \n#include \"rt_config.h\"\n\n#ifdef CONFIG_MULTI_CHANNEL\n\nUINT32 SwitchTime1, SwitchTime2, SwitchTime3, SwitchTime4, SwitchTime5, SwitchTime6, SwitchTime7, SwitchTime8;\nUINT32 TempTimeLo, TempTimeHi;\n\nextern INT Set_P2pCli_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_P2p_OpMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nVOID RtmpPrepareHwNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN BOOLEAN bQosNull,\n\tIN BOOLEAN bEOSP,\n\tIN UCHAR OldUP,\n\tIN UCHAR OpMode,\n\tIN UCHAR PwrMgmt,\n\tIN BOOLEAN bWaitACK,\n\tIN CHAR Index)\n{\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tTXWI_STRUC *pTxWI;\n\tTXINFO_STRUC *pTxInfo;\n\tPUCHAR pNullFrame;\n\tPHEADER_802_11 pNullFr;\n\tUINT32 frameLen;\n\tUINT32 totalLen;\n\tUCHAR *ptr;\n\tUINT i;\n\tUINT32 longValue;\n\tUCHAR MlmeRate;\n#ifdef P2P_SUPPORT\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n#endif /* P2P_SUPPORT */\n\n#ifdef RT_BIG_ENDIAN\n\tNDIS_STATUS    NState;\n\tPUCHAR pNullFrBuf;\n#endif /* RT_BIG_ENDIAN */\n\n\n\tNdisZeroMemory(pAd->NullFrBuf, sizeof(pAd->NullFrBuf));\n\tpTxWI = (TXWI_STRUC *)&pAd->NullFrBuf[0];\n\tpNullFrame = &pAd->NullFrBuf[TXWISize];\n\n\tpNullFr = (PHEADER_802_11) pNullFrame;\n\tframeLen = sizeof(HEADER_802_11);\n\t\n\tpNullFr->FC.Type = BTYPE_DATA;\n\tpNullFr->FC.SubType = SUBTYPE_NULL_FUNC;\n\tpNullFr->FC.ToDs = 1;\n\tpNullFr->FC.FrDs = 0;\n\n\tCOPY_MAC_ADDR(pNullFr->Addr1, pEntry->Addr);\n#ifdef P2P_SUPPORT\n\tif (IS_ENTRY_APCLI(pEntry))\n\t{\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx];\n\t\tCOPY_MAC_ADDR(pNullFr->Addr2, pApCliEntry->CurrentAddress);\n\t\tCOPY_MAC_ADDR(pNullFr->Addr3, pApCliEntry->CfgApCliBssid);\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n\t\tCOPY_MAC_ADDR(pNullFr->Addr2, pAd->CurrentAddress);\n\t\tCOPY_MAC_ADDR(pNullFr->Addr3, pAd->CommonCfg.Bssid);\n\t}\n\n\tpNullFr->FC.PwrMgmt = PwrMgmt;\n\n\tpNullFr->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, pAd->CommonCfg.TxRate, 14);\n\n\t/* sequence is increased in MlmeHardTx */\n\tpNullFr->Sequence = pAd->Sequence;\n\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ; /* next sequence  */\n\n\tif (bQosNull)\n\t{\n\t\tUCHAR *qos_p = ((UCHAR *)pNullFr) + frameLen;\n\n\t\tpNullFr->FC.SubType = SUBTYPE_QOS_NULL;\n\n\t\t/* copy QOS control bytes */\n\t\tqos_p[0] = ((bEOSP) ? (1 << 4) : 0) | OldUP;\n\t\tqos_p[1] = 0;\n\t\tframeLen += 2;\n\t} /* End of if */\n\n\tRTMPWriteTxWI(pAd, pTxWI,  FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, pEntry->Aid, frameLen,\n\t\t0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit);\n\n\tdumpTxWI(pAd, pTxWI);\n\n\tif (bWaitACK)\n\t\tpTxWI->TxWITXRPT = 1;\n\n\thex_dump(\"RtmpPrepareHwNullFrame\", pAd->NullFrBuf, TXWISize + frameLen);\n\n\ttotalLen = TXWISize + frameLen;\n\tpAd->NullFrLen = totalLen;\n\tptr = pAd->NullFrBuf;\n\n#ifdef RT_BIG_ENDIAN\n\tNState = os_alloc_mem(pAd, (PUCHAR *) &pNullFrBuf, 100);\n\tif ( NState == NDIS_STATUS_FAILURE )\n\t\treturn;\n\n\tNdisZeroMemory(pNullFrame, 100);\n\tNdisMoveMemory(pNullFrBuf, pAd->NullFrBuf, totalLen);\n\tRTMPWIEndianChange(pAd, pNullFrBuf, TYPE_TXWI);\n\tRTMPFrameEndianChange(pAd, (PUCHAR)pNullFrBuf + TXWISize, DIR_WRITE, FALSE);\n\n\tptr = pNullFrBuf;\n#endif /* RT_BIG_ENDIAN */\n\n\n\tfor (i= 0; i< totalLen; i+=4)\n\t{\n\t\tlongValue =  *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n\t\t//hex_dump(\"null frame before\",&longValue, 4);\n\n\t\tif (Index == 0)\n\t\t\tRTMP_IO_WRITE32(pAd, pAd->NullBufOffset[0] + i, longValue);\n\t\telse if (Index == 1)\n\t\t\tRTMP_IO_WRITE32(pAd, pAd->NullBufOffset[1] + i, longValue);\n\n\t\t//RTMP_IO_WRITE32(pAd, 0xB700 + i, longValue);\n\t\t//RTMP_IO_WRITE32(pAd, 0xB780 + i, longValue);\n\n\t\tptr += 4;\n\t}\n\n\n\n}\n\n\nVOID RTMPHwSendNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR TxRate,\n\tIN BOOLEAN bQosNull,\n\tIN USHORT PwrMgmt,\n\tIN CHAR Index)\n{\n\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tNDIS_STATUS    NState;\n\tPHEADER_802_11 pNullFr;\n\tUCHAR *ptr;\n\tUINT32 longValue;\n#ifdef RT_BIG_ENDIAN\n\tPUCHAR pNullFrame;\n#endif /* RT_BIG_ENDIAN */\n\tUINT32 Data=0;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - Send NULL Frame @%d Mbps...%d \\n\", __FUNCTION__, RateIdToMbps[pAd->CommonCfg.TxRate],PwrMgmt));\n\n\tpNullFr = (PHEADER_802_11)((&pAd->NullFrBuf[0]) +TXWISize);\n\n\tpNullFr->FC.PwrMgmt = PwrMgmt;\n\n\tpNullFr->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);\n\n\t/* sequence is increased in MlmeHardTx */\n\tpNullFr->Sequence = pAd->Sequence;\n\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ; /* next sequence  */\n\n\t//hex_dump(\"RtmpPrepareHwNullFrame\", pAd->NullFrBuf,  pAd->NullFrLen);\n\n\tif (Index == 0)\n\t{\n\t\tptr = pAd->NullFrBuf + TXWISize;\n\n#ifdef RT_BIG_ENDIAN\n\t\tlongValue =  (*ptr << 8) + *(ptr + 1) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n#else\n\t\tlongValue =  *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n#endif /* RT_BIG_ENDIAN */\n\t\tRTMP_IO_WRITE32(pAd, pAd->NullBufOffset[0] + TXWISize, longValue);\n\n\t\tptr = pAd->NullFrBuf + TXWISize + 20;\t// update Sequence\n\t\tlongValue =  *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n\t\tRTMP_IO_WRITE32(pAd, pAd->NullBufOffset[0] + TXWISize + 20, longValue);\n\t\t\n\t\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\t\tData &= 0xffffff1f; /* Null 2 frame buffer select bit[5:7]=0 */\n\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\t}\n\telse if (Index == 1)\n\t{\n\t\tptr = pAd->NullFrBuf + TXWISize;\n#ifdef RT_BIG_ENDIAN\n\t\tlongValue =  (*ptr << 8) + *(ptr + 1) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n#else\n\t\tlongValue =  *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n#endif /* RT_BIG_ENDIAN */\n\t\tRTMP_IO_WRITE32(pAd, pAd->NullBufOffset[1] + TXWISize, longValue);\n\n\t\tptr = pAd->NullFrBuf + TXWISize + 20;\t// update Sequence\n\t\tlongValue =  *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) + (*(ptr + 3) << 24);\n\t\tRTMP_IO_WRITE32(pAd, pAd->NullBufOffset[1] + TXWISize + 20, longValue);\n\t\t\n\t\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\t\tData &= 0xffffff1f; /* Null 2 frame buffer select bit[5:7]=1 */\n\t\tData |= 0x20; /* Null 2 frame buffer select bit[5:7]=1 */\n\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\t}\n\n\tRTMP_IO_WRITE32(pAd, PBF_CTRL, 0x04);\n\n}\n\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tSend out a NULL frame to a specified STA at a higher TX rate. The \n\t\tpurpose is to ensure the designated client is okay to received at this\n\t\trate.\n\t==========================================================================\n */\nVOID RtmpEnqueueLastNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr,\n\tIN UCHAR TxRate,\n\tIN UCHAR PID,\n\tIN UCHAR apidx,\n    IN BOOLEAN bQosNull,\n    IN BOOLEAN bEOSP,\n    IN UCHAR OldUP,\n    IN UCHAR PwrMgmt,\n\tIN UCHAR OpMode)\n{\n\tUCHAR\tNullFrame[48];\n\tULONG\tLength;\n\tPHEADER_802_11\tpHeader_802_11;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\n\tpEntry = MacTableLookup(pAd, pAddr);\n\n\tif (pEntry == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(NullFrame, 48);\n\tLength = sizeof(HEADER_802_11);\n\n\tpHeader_802_11 = (PHEADER_802_11) NullFrame;\n\t\n\tpHeader_802_11->FC.Type = BTYPE_DATA;\n\tpHeader_802_11->FC.SubType = SUBTYPE_NULL_FUNC;\n\tpHeader_802_11->FC.ToDs = 1;\n\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr1, pEntry->Addr);\n#ifdef P2P_SUPPORT\n\tif (IS_ENTRY_APCLI(pEntry))\n\t{\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx];\n\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr2, pApCliEntry->CurrentAddress);\n\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr3, pApCliEntry->CfgApCliBssid);\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress);\n\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid);\n\t}\n\n\tpHeader_802_11->FC.PwrMgmt = PwrMgmt;\n\t\n\tpHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);\n\n\t/* sequence is increased in MlmeHardTx */\n\tpHeader_802_11->Sequence = pAd->Sequence;\n\tpAd->Sequence = (pAd->Sequence+1) & MAXSEQ; /* next sequence  */\n\n\t/* Prepare QosNull function frame */\n\tif (bQosNull)\n\t{\n\t\tpHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL;\n\t\t\n\t\t/* copy QOS control bytes */\n\t\tNullFrame[Length]\t=  0;\n\t\tNullFrame[Length+1] =  0;\n\t\tLength += 2;/* if pad with 2 bytes for alignment, APSD will fail */\n\t}\n}\n\n\n\n\nVOID MCC_ChangeAction(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n\tRTMP_ADAPTER *pAd = (PRTMP_ADAPTER)FunctionContext;\n\tRtmpOsTaskWakeUp(&(pAd->MultiChannelTask));\n}\n\nVOID ConcurrentP2PConnectTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n\tint i;\n\tRTMP_ADAPTER *pAd = (PRTMP_ADAPTER)FunctionContext;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\n\tpAd->Mlme.ConcurrentP2PConnectTimerRunning = FALSE;\n\tpAd->P2pCfg.bStartP2pConnect = FALSE;\n\n\tif (pAd->P2pCfg.bStartP2pConnect)\n\t{\n\t\tP2pStopConnectThis(pAd);\n\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n\t\tpP2PCtrl->bSentProbeRSP = FALSE;\n\t\tP2pStopScan(pAd);\n\n\t\tP2pGroupTabInit(pAd);\n\t\tpP2PCtrl->GoFormCurrentState = P2P_GO_FORM_IDLE;\n\n\t\t/* Restore P2P WSC Mode / Config Method */\n\t\tpP2PCtrl->WscMode = WSC_PIN_MODE; /* PIN */\n\t\tpP2PCtrl->ConfigMethod = 0x188;\n\t\tpP2PCtrl->Dpid = DEV_PASS_ID_NOSPEC;\n\n\t\tif (P2P_CLI_ON(pAd))\n\t\t{\n\n\t\t\tSet_P2pCli_Enable_Proc(pAd, \"0\");\n\n\t\t}\n\n\t\tSet_P2p_OpMode_Proc(pAd, \"0\");\n\t\tpAd->ApCfg.ApCliTab[0].WscControl.WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\t\tpAd->ApCfg.MBSSID[0].WscControl.WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\t\tOS_WAIT(200);\n\n\t\tif (INFRA_ON(pAd))\n\t\t\tMultiChannelSwitchToRa(pAd);\n\t\t\t\n\t}\n}\n\n\n\nstatic VOID MACBuffer_Change(\n    RTMP_ADAPTER *pAd,\n    BOOLEAN\thcca_to_edca,\n    BOOLEAN\tedca_to_hcca)\n{\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tUINT i = 0;\n\tUINT32 MacValue, Data, Data2;\n\tINT ret;\n\tUINT32 MTxCycle;\n\tUINT32 TimeStamp;\n\tBOOLEAN bBlockIn2Out=FALSE;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\tINT ext_ch;\n\n//\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic2, ret);\n\tif (edca_to_hcca)\n\t\tRTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);\n\tif (hcca_to_edca)\n\t\tRTMP_OS_NETDEV_STOP_QUEUE(pApCliEntry->dev);\n//\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic2);\t\n\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET);\n\n\t/* Disable EDCA or HCCA dequeue */\n\tif (edca_to_hcca)\n\t{\n\t\t\tpAd->MultiChannelFlowCtl |= EDCA_AC0_DEQUEUE_DISABLE;// 1\n\t}\n\tif(hcca_to_edca)\n\t{\n\t\t\tpAd->MultiChannelFlowCtl |= HCCA_DEQUEUE_DISABLE;//16\n\t}\n\n\n\tRTMP_IO_READ32(pAd, WMM_CTRL, &Data);\n\n\tif(edca_to_hcca)\n\t\tData |= 0x80000000;/* bit 31 set to 1 */   /*  WMM Channel switch to EDCA2 */\n\tif(hcca_to_edca)\n\t\tData &= 0x7fffffff;/* bit 31 set to 0 */\t/*  WMM Channel switch to EDCA1 */\n\n\n\tRTMP_IO_WRITE32(pAd, WMM_CTRL, Data);\n\n\t/* Polling EDCA  or EDCA2 Out-Q until empty  */\n\n\tfor (MTxCycle = 0;; MTxCycle++)\n\t{\n\t\tif (!bBlockIn2Out)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, 0x438, &Data);\n\t\t\tif ((edca_to_hcca) && (((Data >> 16) & 0xff) == 0))\t\n\t\t\t{\t\n\t\t\t\t/* Disable EDCA1 In-Q to Out-Q */\n\t\t\t\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\t\t\t\tData &= 0xffffEfff;/* bit 12 set to 0 */ //zero modify 20120807\n\t\t\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\t\t\t\tbBlockIn2Out=TRUE;\n\t\t\t}\t\n\t\t\telse if ((hcca_to_edca) && (((Data >> 24) & 0xff) == 0))\t\n\t\t\t{\n\t\t\t\t/* Disable HCCA/EDCA2 In-Q to Out-Q */\n\t\t\t\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\t\t\t\tData &= 0xffffDfff;/* set bit 13 set to 0 */ //zero modify 20120807\n\t\t\t\t//Data |= ((1 << 10) | (1 << 11));\n\t\t\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\t\t\t\tbBlockIn2Out=TRUE;\t\t\t\t\t\n\t\t\t}\t\n\t\t\telse\n\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TXQ_STA, &Data);\n\t\t\tif ((edca_to_hcca) && (((Data >> 19) & 0x1f) == 0))\t\n\t\t\t\tbreak;\n\t\t\telse if ((hcca_to_edca) && (((Data >> 27) & 0x1f) == 0))\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\t\t\t\t\n\t}\n\t\n\tif (MTxCycle >= 2000)\n\t{\n\t\tif(edca_to_hcca)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Polling EDCA Out-Q max(%x)\\n\", Data));\n\t\tif(hcca_to_edca)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Polling HCCA Out-Q max\\n\"));\n\n\t}\n\n\tif(edca_to_hcca)\n\t\tRTMPHwSendNullFrame(pAd, \n\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t(pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t\t\t\t PWR_SAVE, 0);\n\n\tif(hcca_to_edca)\n\t\t\tRTMPHwSendNullFrame(pAd, \n\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t(pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t\t\t\tPWR_SAVE, 1);\n\n\n\tRtmpOsMsDelay(20);\n\t/* Disable all Tx Out-Q */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\tData &= 0xfffffff3;/* bit 3 and bit 2 set to 0 */ //zero modify 20120807\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\n\n\n\tif(hcca_to_edca)\n\t{\n\t\tif (pAd->StaCfg.BW == BW_40)\n\t\t{\n\t\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\t\text_ch = EXTCHA_ABOVE;\n\n\t\t\telse\n\t\t\t\text_ch = EXTCHA_BELOW;\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\text_ch = EXTCHA_NONE;\n\t\t}\n\n\t\tAsicSetChannel(pAd, pAd->CommonCfg.CentralChannel, pAd->StaCfg.BW, ext_ch, FALSE);\n\n\t}\n\n\tif(edca_to_hcca)\n\t{\n\t\tif (pAd->P2pCfg.BW == BW_40)\n\t\t{\n\t\t\tif (pAd->ApCliMlmeAux.CentralChannel > pAd->ApCliMlmeAux.Channel)\n\t\t\t\text_ch = EXTCHA_ABOVE;\n\t\t\telse\n\t\t\t\text_ch = EXTCHA_BELOW;\n\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\text_ch = EXTCHA_NONE;\n\t\t}\n\n\t\tAsicSetChannel(pAd, pAd->ApCliMlmeAux.CentralChannel, pAd->P2pCfg.BW, ext_ch, FALSE);\n\n\t}\n\n\n\n\tif(edca_to_hcca)\n\t\tRTMPHwSendNullFrame(pAd, \n\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t(pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t\t\t\t PWR_ACTIVE, 1);\n\n\tif(hcca_to_edca)\n\t\t\tRTMPHwSendNullFrame(pAd, \n\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t(pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t\t\t\tPWR_ACTIVE, 0);\n\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &SwitchTime7);\n\n\t/* Enable EDCA or EDCA2 Tx In-Q and Out-Q */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\tif(edca_to_hcca)\n\t\tData |= ((1 << 3) | (1 << 13));/* bit 3 and bit 13 set to 1 */\n\n\tif(hcca_to_edca)\n\t\tData |= ((1 << 2) | (1 << 12));/* bit 2  and bit 12 set to 1 */\n\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &SwitchTime8);\n\n\t\tif ((i == 10) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Multi Channel Switch Retry count exhausted\\n\"));\n\t\t}\n\n\t\t/* Enable EDCA or EDCA2 dequeue */\n\tif(hcca_to_edca)\n\t\tpAd->MultiChannelFlowCtl &= ~EDCA_AC0_DEQUEUE_DISABLE; // 0\n\n\tif(edca_to_hcca)\n\t\tpAd->MultiChannelFlowCtl &= ~HCCA_DEQUEUE_DISABLE; // 0\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET);\n\n//\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic2, ret);\n\n\tif(hcca_to_edca)\n\t\tRTMP_OS_NETDEV_WAKE_QUEUE(pAd->net_dev);\n\n\tif(edca_to_hcca)\n\t\tRTMP_OS_NETDEV_WAKE_QUEUE(pApCliEntry->dev);\n\n//\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic2);\t\n\n\n}\n\n\nstatic VOID ProcessEDCAToHCCA(\n    RTMP_ADAPTER *pAd) \n{\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\n\tUINT32 Data;\n\n\tif ((pApCliEntry->Valid) && INFRA_ON(pAd))\n\t{\n\t\tMACBuffer_Change(pAd,FALSE, TRUE);\n\t\tRTMPSetTimer(&pAd->Mlme.MCCTimer, pAd->Mlme.HCCAToEDCATimerValue);\n\t}\n}\n\n\nstatic VOID ProcessHCCAToEDCA(\n    PRTMP_ADAPTER pAd)\n{\n\tUINT32 MacValue;\n\tUINT32 i = 0;\n\tINT ret;\n\tBOOLEAN bBlockIn2Out=FALSE;\n\tUINT32 Data;\n\t\n\tif (P2P_INF_ON(pAd) && P2P_GO_ON(pAd))\n\t{\n\t\t;//APUpdateAllBeaconFrame(pAd);\n\t}\n\telse\n\t{\n\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\tPAPCLI_STRUCT pApCliEntry = NULL;\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0]; \n\n\t\tif ((pApCliEntry->Valid) && INFRA_ON(pAd))\n\t\t{\n\t\t\tMACBuffer_Change(pAd,TRUE, FALSE);\n\t\t\tRTMPSetTimer(&pAd->Mlme.MCCTimer, pAd->Mlme.EDCAToHCCATimerValue);\n\t\t}\n\t}\n}\n\nstatic INT MultiChannelTaskThread(\n    IN  ULONG Context)\n{\n\tRTMP_OS_TASK *pTask;\n\tRTMP_ADAPTER *pAd;\n\tINT\tStatus = 0;\n\n\tpTask = (RTMP_OS_TASK *)Context;\n\tpAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);\n\n\tif (pAd == NULL)\n\t\treturn 0;\n\n\tRtmpOSTaskCustomize(pTask);\n\n\n\twhile (pTask && !RTMP_OS_TASK_IS_KILLED(pTask))\n\t{\n\t\tif (RtmpOSTaskWait(pAd, pTask, &Status) == FALSE)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (Status != 0)\n\t\t\tbreak;\n\n\n\t\tif (INFRA_ON(pAd) && P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tif (pAd->LatchRfRegs.Channel == pAd->ApCliMlmeAux.CentralChannel)\n\t\t\t\tpAd->MultiChannelAction = HCCA_TO_EDCA;\n\t\t\telse if (pAd->LatchRfRegs.Channel == pAd->CommonCfg.CentralChannel)\n\t\t\t\tpAd->MultiChannelAction = EDCA_TO_HCCA;\n\n\t\t} \n\t\telse if (INFRA_ON(pAd))\n\t\t{\n\t\t\t// reset to default switct to ra0\n\t//\t\tMultiChannelSwitchToRa(pAd);\n\t\t} \n\t\telse if (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\t// reset to default switch to p2p0\n\t//  \t\tMultiChannelSwitchToP2P(pAd);\n\n\t\t}\n\n\t\n#ifdef RTMP_MAC_USB\t\t\n\t\t/* device had been closed */\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\tbreak;\n#endif /* RTMP_MAC_USB */\n\t\tif (pAd->MultiChannelAction == HCCA_TO_EDCA)\n\t\t\tProcessHCCAToEDCA(pAd);\n\t\telse if (pAd->MultiChannelAction == EDCA_TO_HCCA)\n\t\t\tProcessEDCAToHCCA(pAd);\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Unkown Action(=%d)\\n\", __FUNCTION__, pAd->MultiChannelAction));\n\n\n\n\t}\n\n\tif (pTask)\n\t\tRtmpOSTaskNotifyToExit(pTask);\n\t\n\treturn 0;\n}\n\nNDIS_STATUS MultiChannelThreadInit(\n\tIN  PRTMP_ADAPTER pAd)\n{\n\tNDIS_STATUS status = NDIS_STATUS_FAILURE;\n\tRTMP_OS_TASK *pTask;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s\\n\", __FUNCTION__));\n\n\tpTask = &pAd->MultiChannelTask;\n\tpAd->MultiChannelAction = 0xFF;\n\tpAd->Mlme.HCCAToEDCATimerValue = HCCA_TIMEOUT;\n\tpAd->Mlme.EDCAToHCCATimerValue = EDCA_TIMEOUT;\n\tpAd->P2pCfg.bStartP2pConnect = FALSE;\n\tpAd->MultiChannelFlowCtl = 0;\n\n\tRTMPInitTimer(pAd, &pAd->Mlme.MCCTimer, GET_TIMER_FUNCTION(MCC_ChangeAction), pAd, FALSE);\n\tRTMPInitTimer(pAd, &pAd->Mlme.ConcurrentP2PConnectTimer, GET_TIMER_FUNCTION(ConcurrentP2PConnectTimeout), pAd, FALSE);\n\n\tRTMP_OS_TASK_INIT(pTask, \"MultiChannelTask\", pAd);\n\tstatus = RtmpOSTaskAttach(pTask, MultiChannelTaskThread, (ULONG)&pAd->MultiChannelTask);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- %s, status=%d!\\n\", __FUNCTION__, status));\n\n\treturn status;\n}\n\nBOOLEAN MultiChannelThreadExit(\n\tIN  PRTMP_ADAPTER pAd)\n{\t\n\tINT ret;\n\n\tMultiChannelTimerStop(pAd);\n\t\n\tret = RtmpOSTaskKill(&pAd->MultiChannelTask);\n\tif (ret == NDIS_STATUS_FAILURE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: kill multi-channel task failed!\\n\", __FUNCTION__));\n\t}\n\treturn TRUE;\n}\n\nVOID MultiChannelTimerStop(\n\tIN  PRTMP_ADAPTER pAd)\n{\n\n\tBOOLEAN bCancelled = FALSE;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\tpAd->MultiChannelAction = 0xFF;\t\n\tRTMPCancelTimer(&pAd->Mlme.MCCTimer, &bCancelled);\n\n\tRTMP_OS_NETDEV_WAKE_QUEUE(pAd->net_dev);\n\tRTMP_OS_NETDEV_WAKE_QUEUE(pApCliEntry->dev);\n\n\tOS_WAIT(200);\n}\n\nVOID MultiChannelTimerStart(\n\tIN  PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY  *pEntry)\n{\n\n\t\tBOOLEAN\t\t\t\tbCancelled = FALSE;\n\t\t\n\t\tif (pAd->P2pCfg.bStartP2pConnect)\n\t\t{\n\t\t\tpAd->P2pCfg.bStartP2pConnect = FALSE;\n\n\t\t\tpAd->StaCfg.ReConnectCountDown = 5;\n\n\t\t\tif (pAd->Mlme.ConcurrentP2PConnectTimerRunning)\n\t\t\t{\n\t\t\t\tprintk(\"iversondebug MultiChannelTimer start3 \\n\");\n\n\t\t\t\tRTMPCancelTimer(&pAd->Mlme.ConcurrentP2PConnectTimer, &bCancelled);\n\t\t\t\tpAd->Mlme.ConcurrentP2PConnectTimerRunning = FALSE;\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tRTMPSetTimer(&pAd->Mlme.MCCTimer, 200);\n\t\t\n\t\tpAd->Mlme.P2pStayTick = 0;\n\t\tpAd->Mlme.StaStayTick = 0;\n}\n\nVOID MultiChannelSwitchToRa(\n\tIN  PRTMP_ADAPTER pAd)\n{\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\tINT ext_ch;\n\n\n//\tMACBuffer_Change(pAd,TRUE, FALSE);\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tUINT32 MacValue, Data, Data2;\n\tINT ret,i;\n\tUINT32 MTxCycle;\n\tBOOLEAN bBlockIn2Out=FALSE;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\n\tRTMP_OS_NETDEV_STOP_QUEUE(pApCliEntry->dev);\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET);\n\tpAd->MultiChannelFlowCtl |= HCCA_DEQUEUE_DISABLE;//16\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &SwitchTime1);\n\tRTMP_IO_READ32(pAd, WMM_CTRL, &Data);\n\n\tData &= 0x7fffffff;/* bit 31 set to 0 */\t/*  WMM Channel switch to EDCA1 */\n\n\tRTMP_IO_WRITE32(pAd, WMM_CTRL, Data);\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &SwitchTime2);\n\n\t/* Polling EDCA  or EDCA2 Out-Q until empty  */\n\n\tfor (MTxCycle = 0;; MTxCycle++)\n\t{\n\t\tif (!bBlockIn2Out)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, 0x438, &Data);\n\t\t\tif ((((Data >> 24) & 0xff) == 0))\t\n\t\t\t{\n\t\t\t\t/* Disable HCCA/EDCA2 In-Q to Out-Q */\n\t\t\t\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\t\t\t\tData &= 0xffffDfff;/* set bit 13 set to 0 */ //zero modify 20120807\n\t\t\t\t//Data |= ((1 << 10) | (1 << 11));\n\t\t\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\t\t\t\tbBlockIn2Out=TRUE;\t\t\t\t\t\n\t\t\t}\t\n\t\t\telse\n\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TXQ_STA, &Data);\n\t\t\tif ((((Data >> 27) & 0x1f) == 0))\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\t\t\t\t\n\t}\n\t\n\tif (MTxCycle >= 2000)\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Polling HCCA Out-Q max\\n\"));\n\n\t}\n\n\tRtmpOsMsDelay(20);\n\t/* Disable all Tx Out-Q */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\tData &= 0xfffffff3;/* bit 3 and bit 2 set to 0 */ //zero modify 20120807\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\n\n\tif (pAd->StaCfg.BW == BW_40)\n\t{\n\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\text_ch = EXTCHA_ABOVE;\n\t\telse\n\t\t\text_ch = EXTCHA_BELOW;\t\n\t}\n\telse\n\t{\n\t\text_ch = EXTCHA_NONE;\n\t}\n\n\tAsicSetChannel(pAd, pAd->CommonCfg.CentralChannel, pAd->StaCfg.BW, ext_ch, FALSE);\n\n\n\n\n\tRTMPHwSendNullFrame(pAd, \n\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t(pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\tPWR_ACTIVE, 0);\n\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &SwitchTime7);\n\n\t/* Enable EDCA or EDCA2 Tx In-Q and Out-Q */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\tData |= ((1 << 2) | (1 << 12));/* bit 2  and bit 12 set to 1 */\n\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\n\t\tif ((i == 10) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Multi Channel Switch Retry count exhausted\\n\"));\n\t\t}\n\n\t\t/* Enable EDCA or EDCA2 dequeue */\n\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET);\n\n\tpAd->MultiChannelFlowCtl = 0;\n\n\tRTMP_OS_NETDEV_WAKE_QUEUE(pAd->net_dev);\n\n}\n\nVOID MultiChannelSwitchToP2P(\n\tIN  PRTMP_ADAPTER pAd)\n{\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\tINT ext_ch;\n\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tUINT i = 0;\n\tUINT32 MacValue, Data, Data2;\n\tINT ret;\n\tUINT32 MTxCycle;\n\tBOOLEAN bBlockIn2Out=FALSE;\n\n\n\tRTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET);\n\n\t/* Disable EDCA or HCCA dequeue */\n\tpAd->MultiChannelFlowCtl |= EDCA_AC0_DEQUEUE_DISABLE;// 1\n\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &SwitchTime1);\n\n\tRTMP_IO_READ32(pAd, WMM_CTRL, &Data);\n\n\tData |= 0x80000000;/* bit 31 set to 1 */   /*  WMM Channel switch to EDCA2 */\n\n\tRTMP_IO_WRITE32(pAd, WMM_CTRL, Data);\n\n\t/* Polling EDCA  or EDCA2 Out-Q until empty  */\n\n\tfor (MTxCycle = 0;; MTxCycle++)\n\t{\n\t\tif (!bBlockIn2Out)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, 0x438, &Data);\n\t\t\tif ((((Data >> 16) & 0xff) == 0))\t\n\t\t\t{\t\n\t\t\t\t/* Disable EDCA1 In-Q to Out-Q */\n\t\t\t\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\t\t\t\tData &= 0xffffEfff;/* bit 12 set to 0 */ //zero modify 20120807\n\t\t\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\t\t\t\tbBlockIn2Out=TRUE;\n\t\t\t}\t\n\t\t\telse\n\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TXQ_STA, &Data);\n\t\t\tif ((((Data >> 19) & 0x1f) == 0))\t\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tRTMPusecDelay(50);\n\t\t}\n\t\t\t\t\t\n\t}\n\t\n\tif (MTxCycle >= 2000)\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Polling EDCA Out-Q max(%x)\\n\", Data));\n\t}\n\n\n\tRtmpOsMsDelay(20);\n\t/* Disable all Tx Out-Q */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\tData &= 0xfffffff3;/* bit 3 and bit 2 set to 0 */ //zero modify 20120807\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\n\n\tif (pAd->P2pCfg.BW == BW_40)\n\t{\n\t\tif (pAd->ApCliMlmeAux.CentralChannel > pAd->ApCliMlmeAux.Channel)\n\t\t\text_ch = EXTCHA_ABOVE;\n\t\telse\n\t\t\text_ch = EXTCHA_BELOW;\n\t\n\t}\n\telse\n\t{\n\t\text_ch = EXTCHA_NONE;\n\t}\n\n\tAsicSetChannel(pAd, pAd->ApCliMlmeAux.CentralChannel, pAd->P2pCfg.BW, ext_ch, FALSE);\n\n\n\n\n\tRTMPHwSendNullFrame(pAd, \n\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t(pAd->CommonCfg.bWmmCapable & pAd->CommonCfg.APEdcaParm.bValid),\n\t\t\t\t PWR_ACTIVE, 1);\n\n\t/* Enable EDCA or EDCA2 Tx In-Q and Out-Q */\n\tRTMP_IO_READ32(pAd, PBF_CFG, &Data);\n\tData |= ((1 << 3) | (1 << 13));/* bit 3 and bit 13 set to 1 */\n\n\n\tRTMP_IO_WRITE32(pAd, PBF_CFG, Data);\n\n\tif ((i == 10) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Multi Channel Switch Retry count exhausted\\n\"));\n\t}\n\n\t\t/* Enable EDCA or EDCA2 dequeue */\n\tpAd->MultiChannelFlowCtl = 0; // 0\n\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET);\n\n\tRTMP_OS_NETDEV_WAKE_QUEUE(pApCliEntry->dev);\n\n\n}\n\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\n"
  },
  {
    "path": "src/common/netif_block.c",
    "content": "#ifdef BLOCK_NET_IF\n\n#include \"rt_config.h\"\n#include \"netif_block.h\"\n\nstatic NETIF_ENTRY freeNetIfEntryPool[FREE_NETIF_POOL_SIZE];\nstatic LIST_HEADER freeNetIfEntryList;\n\nvoid initblockQueueTab(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint i;\n\n\tinitList(&freeNetIfEntryList);\n\tfor (i = 0; i < FREE_NETIF_POOL_SIZE; i++)\n\t\tinsertTailList(&freeNetIfEntryList, (PLIST_ENTRY)&freeNetIfEntryPool[i]);\n\n\tfor (i=0; i < NUM_OF_TX_RING; i++)\n\t\tinitList(&pAd->blockQueueTab[i].NetIfList);\n\n\treturn;\n}\n\nBOOLEAN blockNetIf(\n\tIN PBLOCK_QUEUE_ENTRY pBlockQueueEntry,\n\tIN PNET_DEV pNetDev)\n{\n\tPNETIF_ENTRY pNetIfEntry = NULL;\n\t\n\tif ((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(&freeNetIfEntryList)) != NULL)\n\t{\n\t\tRTMP_OS_NETDEV_STOP_QUEUE(pNetDev);\n\t\tpNetIfEntry->pNetDev = pNetDev;\n\t\tinsertTailList(&pBlockQueueEntry->NetIfList, (PLIST_ENTRY)pNetIfEntry);\n\n\t\tpBlockQueueEntry->SwTxQueueBlockFlag = TRUE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMP_OS_NETDEV_STOP_QUEUE(%s)\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));\n\t}\n\telse\n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\nVOID releaseNetIf(\n\tIN PBLOCK_QUEUE_ENTRY pBlockQueueEntry)\n{\n\tPNETIF_ENTRY pNetIfEntry = NULL;\n\tPLIST_HEADER pNetIfList = &pBlockQueueEntry->NetIfList;\n\n\twhile((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(pNetIfList)) !=  NULL)\n\t{\n\t\tPNET_DEV pNetDev = pNetIfEntry->pNetDev;\n\t\tRTMP_OS_NETDEV_WAKE_QUEUE(pNetDev);\n\t\tinsertTailList(&freeNetIfEntryList, (PLIST_ENTRY)pNetIfEntry);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMP_OS_NETDEV_WAKE_QUEUE(%s)\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));\n\t}\n\tpBlockQueueEntry->SwTxQueueBlockFlag = FALSE;\n\treturn;\n}\n\n\nVOID StopNetIfQueue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR QueIdx,\n\tIN PNDIS_PACKET pPacket)\n{\n\tPNET_DEV NetDev = NULL;\n\tUCHAR IfIdx = 0;\n\tBOOLEAN valid = FALSE;\n\n\n#ifdef P2P_SUPPORT\n\tif (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t{\n\t\tIfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_P2P_GO) % MAX_P2P_NUM;\n\t\tNetDev = pAd->ApCfg.MBSSID[IfIdx].MSSIDDev;\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n#ifdef APCLI_SUPPORT\n\tif (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_APCLI)\n\t{\n\t\tIfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_APCLI) % MAX_APCLI_NUM;\n\t\tNetDev = pAd->ApCfg.ApCliTab[IfIdx].dev;\n\t}\n\telse\n#endif /* APCLI_SUPPORT */\n\t{\n#ifdef MBSS_SUPPORT\n\t\tif (pAd->OpMode == OPMODE_AP)\n\t\t{\n\t\t\tIfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_MBSSID) % MAX_MBSSID_NUM(pAd);\n\t\t\tNetDev = pAd->ApCfg.MBSSID[IfIdx].MSSIDDev;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIfIdx = MAIN_MBSSID;\n\t\t\tNetDev = pAd->net_dev;\n\t\t}\n#else\n\t\tIfIdx = MAIN_MBSSID;\n\t\tNetDev = pAd->net_dev;\n#endif\n\t}\n\n\t/* WMM support 4 software queues.*/\n\t/* One software queue full doesn't mean device have no capbility to transmit packet.*/\n\t/* So disable block Net-If queue function while WMM enable.*/\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tvalid = (pAd->ApCfg.MBSSID[IfIdx].bWmmCapable == TRUE) ? FALSE : TRUE;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tvalid = (pAd->ApCfg.MBSSID[IfIdx].bWmmCapable == TRUE) ? FALSE : TRUE;\n\t\telse\n#endif /* P2P_SUPPORT */\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tvalid = (pAd->CommonCfg.bWmmCapable == TRUE) ? FALSE : TRUE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (valid)\n\t\tblockNetIf(&pAd->blockQueueTab[QueIdx], NetDev);\n\treturn;\n}\n\n#endif /* BLOCK_NET_IF */\n"
  },
  {
    "path": "src/common/p2p.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. P2P is a Task Group of WFA.\n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\tJan Lee         2009-10-05    created for Peer-to-Peer(Wifi Direct)\n*/\n#include \"rt_config.h\"\n\n/* Vendor Specific OUI for P2P defined by WFA. */\nUCHAR\tP2POUIBYTE[4] = {0x50, 0x6f, 0x9a, 0x9}; /* spec. 1.14 OUI */\nextern UCHAR ZERO_MAC_ADDR[];\nextern UCHAR\tSTA_Wsc_Pri_Dev_Type[];\n\nUCHAR\tWILDP2PSSID[7] = {'D', 'I', 'R', 'E', 'C', 'T','-'};\nUCHAR\tWILDP2PSSIDLEN = 7;\nUCHAR\tWIFIDIRECT_OUI[] = {0x50, 0x6f, 0x9a, 0x09}; /* spec. 1.14 OUI */\n/* UCHAR\tDEFAULTWPAPSKEY[8] = {0x33, 0x35, 0x33, 0x34, 0x33, 0x36, 0x31, 0x34};*/\n/* Like to key in 12345678 */\nUCHAR\tDEFAULTWPAPSKEY[8] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38};\n\n\n#ifdef CONFIG_MULTI_CHANNEL\nextern INT\tShow_StaStayTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen);\n\nextern INT\tShow_P2pStayTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPSTRING\t\t\tpBuf,\n\tIN\tULONG\t\t\tBufLen);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\nextern INT Set_P2p_OpMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nextern INT Set_AP_WscSsid_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING arg);\n\nextern INT Set_AP_WscConfMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_AP_WscConfStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_AP_WscMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_AP_WscGetConf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_AP_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_P2pCli_WscSsid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_P2pCli_Ssid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nextern INT Set_P2pCli_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCalled once when the card is being initialized.\n\t\t\n\tParameters: \n\n\tNote:\n\n\t==========================================================================\n */\n\n#include \"rt_config.h\"\n#include \"p2p.h\"\n\nVOID\tP2pCfgInit(\n\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpP2PCtrl->P2p_OpMode = P2P_CONCURRENT;\n\n\tpP2PCtrl->bKeepSlient = FALSE;\n\tpP2PCtrl->NoAIndex = MAX_P2P_GROUP_SIZE;\n\tpP2PCtrl->ListenChannel = 1;\n\tpP2PCtrl->GroupChannel = 1;\n\tpP2PCtrl->GroupOpChannel = 1;\n\tP2pSetListenIntBias(pAd, 3);\n\n\tpP2PCtrl->Manufacturer[0] = 0x20;\n\tpP2PCtrl->ManufacturerLen = 0x01;\n\tpP2PCtrl->ModelName[0] = 0x20;\n\tpP2PCtrl->ModelNameLen = 0x01;\n\tpP2PCtrl->ModelNumber[0] = 0x20;\n\tpP2PCtrl->ModelNumberLen = 0x01;\n\tpP2PCtrl->SerialNumber[0] = 0x20;\n\tpP2PCtrl->SerialNumberLen = 0x01;\n\n\tpP2PCtrl->DeviceNameLen = 10;\n\tpP2PCtrl->DeviceName[0] = 'R';\n\tpP2PCtrl->DeviceName[1] = 'a';\n\tpP2PCtrl->DeviceName[2] = 'l';\n\tpP2PCtrl->DeviceName[3] = 'i';\n\tpP2PCtrl->DeviceName[4] = 'n';\n\tpP2PCtrl->DeviceName[5] = 'k';\n\tpP2PCtrl->DeviceName[6] = '-';\n\tpP2PCtrl->DeviceName[7] = 'P';\n\tpP2PCtrl->DeviceName[8] = 0x32;\n\tpP2PCtrl->DeviceName[9] = 'P';\n\n\t/*pP2PCtrl->P2PDiscoProvState = P2P_DISABLE; */\n\tpP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE;\n\t/* Set Dpid to \"not specified\". it means, GUI doesn't set for connection yet. */\n\tpP2PCtrl->Dpid = DEV_PASS_ID_NOSPEC;\n\tpP2PCtrl->P2pManagedParm.APP2pManageability = 0xff;\n\tpP2PCtrl->P2pManagedParm.ICSStatus = ICS_STATUS_DISABLED; \n\tP2pGroupTabInit(pAd);\n\tP2pCrednTabClean(pAd);\n\tP2pScanChannelDefault(pAd);\n\tRTMPZeroMemory(pAd->P2pCfg.SSID, MAX_LEN_OF_SSID);\n\tRTMPMoveMemory(pAd->P2pCfg.SSID, WILDP2PSSID, WILDP2PSSIDLEN);\n\t/*RTMPMoveMemory(pAd->P2pCfg.Bssid, pAd->P2pCfg.CurrentAddress, MAC_ADDR_LEN); */\n\tpP2PCtrl->SSIDLen = WILDP2PSSIDLEN;\n\tpP2PCtrl->GONoASchedule.bValid = FALSE;\n\tpP2PCtrl->GONoASchedule.bInAwake = TRUE;\n\tpP2PCtrl->GONoASchedule.bWMMPSInAbsent = FALSE; /* Set to FALSE if changes state to Awake */\n\tpP2PCtrl->GONoASchedule.Token = 0;\n\tpP2PCtrl->GoIntentIdx = 0;\n\tpP2PCtrl->Rule = P2P_IS_DEVICE;\n\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\tpP2PCtrl->DefaultConfigMethod = P2P_REG_CM_DISPLAY;\n\tpP2PCtrl->bExtListen = FALSE;\n\tpP2PCtrl->bIntraBss = FALSE;\n\tpP2PCtrl->ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\tpP2PCtrl->ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\tpP2PCtrl->GONoASchedule.Count = 0;\n\tpP2PCtrl->GONoASchedule.Duration = 0;\n\tpP2PCtrl->GONoASchedule.Interval = 0;\n\tpP2PCtrl->DevDiscPeriod = P2P_SCAN_PERIOD;\n\t/* P2P WSC_IR default value */\n\tpP2PCtrl->DevInfo.Version = WSC_VERSION;\n\tpP2PCtrl->bConfiguredAP = TRUE;\n\tpP2PCtrl->DevInfo.RfBand |= WSC_RFBAND_24GHZ;\t\t\t/* 2.4G */\n\tNdisMoveMemory(&pP2PCtrl->DevInfo.PriDeviceType, &STA_Wsc_Pri_Dev_Type[0], 8);\n\t/* zero means no 2nd Device Type List*/\n\tpP2PCtrl->DevInfo.SecDevTypList[0]=0x00;\n\n\t\n\n\tpP2PCtrl->bSigmaEnabled = FALSE;\n\tpP2PCtrl->bP2pCliPmEnable = FALSE;\n\tpP2PCtrl->bLowRateQoSNULL = FALSE;\n\tpP2PCtrl->bP2pCliReConnect = FALSE;\n\tpP2PCtrl->bStopAuthRsp = TRUE;\n\tpP2PCtrl->bP2pReSendTimerRunning = FALSE;\n\tpP2PCtrl->DevDiscPeriod = P2P_SCAN_PERIOD;\n\tpP2PCtrl->bPeriodicListen = TRUE;\n\t/* Reset bConfirmByUI to its default value */\n\tpP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT;;\n\tpP2PCtrl->p2pMaxEntry = 0;\n\tpP2PCtrl->bProvAutoRsp = TRUE;\n\tpP2PCtrl->P2pProvIndex = 0xFF;\n\tpP2PCtrl->P2pProvUserNotify = 0;\n\tpP2PCtrl->pGoNegoRspOutBuffer = NULL;\n\tpP2PCtrl->bSentProbeRSP = FALSE;\n\t\n\t/*\n\t\tBit[31] : Software Based NoA implementation\n\t\tBit[23] : Opps, not use.\n\t\tBit[22] : Service Discovey, not use.\n\t\tBit[21] : Extent Listen\n\t\tBit[20] : Client Discovery\n\t\tBit[16:19] : OpChannel, not use\n\t\tBit[15] : IntraBss\n\t\tBit[12:14] : Config Method, not use.\n\t\tBit[8:11] : Default Channel, not use.\n\t\tBit[4:7] : GO Intent, not use.\n\t\tBit[3] : Invite\n\t\tBit[2] : Persistent, not use.\n\t\tBit[1] : Managed\n\t\tBit[0] : Enable, not use.\n\t */\n\tpP2PCtrl->P2pControl.word = 0x80108008;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: \\n\", __FUNCTION__));\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPeriodic Routine for P2P. \n\t\t\n\tParameters: \n\t\t \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tULONG\t\tBssIdx = BSS_NOT_FOUND;\n\n\tif ((pP2PCtrl->P2pCounter.bListen) && (pP2PCtrl->P2pCounter.ListenInterval > 0))\n\t\tpP2PCtrl->P2pCounter.ListenInterval--; /* update Listen interval */\n\n\tif (pP2PCtrl->P2pCounter.NextScanRound > 0)\n\t\tpP2PCtrl->P2pCounter.NextScanRound--; /* update Next Scan Round */\n\n\tif (pP2PCtrl->P2pCounter.CounterAftrScanButton > 0)\n\t\tpP2PCtrl->P2pCounter.CounterAftrScanButton--; /* update Device Discovery period */\n\n\tif (pP2PCtrl->P2pCounter.CounterAftrSetEvent != 0xffffffff)\n\t\tpP2PCtrl->P2pCounter.CounterAftrSetEvent++;\n\n\tif (pP2PCtrl->P2pCounter.ClientConnectedCounter > 0)\n\t\tpP2PCtrl->P2pCounter.ClientConnectedCounter--;\n\n\tif (pP2PCtrl->P2pCounter.ManageAPEnReconCounter > 0)\n\t\tpP2PCtrl->P2pCounter.ManageAPEnReconCounter--;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s : Counter100ms[%ld] CounterAftScanButton[%ld] ClientConnCnt[%ld] MngAPEnReconnCnt[%ld] DisableRetryGrpFormCnt[%ld] NextScanRound[%ld]\\n\", \n\t\t__FUNCTION__, pP2PCtrl->P2pCounter.Counter100ms, pP2PCtrl->P2pCounter.CounterAftrScanButton, pP2PCtrl->P2pCounter.ClientConnectedCounter,\n\t\tpP2PCtrl->P2pCounter.CounterAftrSetEvent, pP2PCtrl->P2pCounter.DisableRetryGrpFormCounter, pP2PCtrl->P2pCounter.NextScanRound));\n\n \t/* Scan period expired. Return to listen state. Only do once. So check value equal. */\n\tif ((pP2PCtrl->P2pCounter.bStartScan == TRUE) && (pAd->P2pCfg.P2pCounter.CounterAftrScanButton == 0))\n\t\tP2PDevDiscTimerExec(pAd, 0);\n\t/* Check whether to start a  P2P scan /search process. */\n\tif ((pP2PCtrl->P2pCounter.bListen) && (pP2PCtrl->P2pCounter.ListenInterval == 0))\n\t\tP2PListenTimerExec(pAd, 0);\n\tif ((pP2PCtrl->P2pCounter.bNextScan == TRUE) && (pP2PCtrl->P2pCounter.NextScanRound == 0))\n\t\tP2PNextScanTimerExec(pAd, 0);\n\n\tif (pAd->P2pCfg.P2pCounter.UserAccept > 0)\n\t{\n\t\tpAd->P2pCfg.P2pCounter.UserAccept--;\n\t}\n\n\tif ((pP2PCtrl->bProvAutoRsp == FALSE) && (pP2PCtrl->P2pProvIndex != P2P_NOT_FOUND) )\n\t{\n\t\tif (pP2PCtrl->P2pCounter.UserAccept == 0)\n\t\t{\n\t\t\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\t\n\t\t\tpP2PCtrl->P2pProvUserNotify = 0;\n\t\t\tpP2PCtrl->P2pProvIndex = P2P_NOT_FOUND;\n\t\t}\n\t}\n\n\t\t/* ====================================> */\n\t\t/*\tP2P connect state maintain */\n\t\tif (((pP2PCtrl->P2PConnectState == P2P_DO_GO_SCAN_BEGIN) \n\t\t\t|| (pP2PCtrl->P2PConnectState == P2P_DO_GO_NEG_DONE_CLIENT)\n\t\t\t|| (pP2PCtrl->P2PConnectState == P2P_DO_GO_SCAN_OP_BEGIN))\n\t\t\t&& (pP2PCtrl->P2pCounter.Counter100ms == pP2PCtrl->P2pCounter.NextScanRound))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P P2pPeriodicExec Scan Begin NextScanRound = %ld \\n\", pP2PCtrl->P2pCounter.NextScanRound));\n\t\t\tMlmeEnqueue(pAd, \n\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\tOID_802_11_BSSID_LIST_SCAN, \n\t\t\t\t0,\n\t\t\t\t\"\",\n\t\t\t\t0);\n\n\t\t\tMlmeHandler(pAd);\n\t\t\tpP2PCtrl->P2pCounter.Counter100ms = 0;\n\t\t\tpP2PCtrl->P2pCounter.NextScanRound = (RandomByte(pAd) % P2P_RANDOM_WPS_BASE) + 4;\n\t\t}\n\t\telse if ((pAd->P2pCfg.P2PConnectState == P2P_DO_GO_SCAN_DONE) \n\t\t\t|| (pAd->P2pCfg.P2PConnectState == P2P_DO_GO_SCAN_OP_DONE))\n\t\t{\n\t\t\t/* if(pP2PCtrl->PortSubtype != PORTSUBTYPE_P2PGO) */\n\t\t\tif (!P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2PConnectState[%s] : Do BssTableSearch\\n\", decodeP2PState(pP2PCtrl->P2PConnectState)));\n\t\t\t\t/* BssIdx = BssTableSearch(pAd, &pAd->ScanTab, pAd->P2pCfg.Bssid, pAd->StaCfg.WscControl.WscAPChannel); */\n\t\t\t\tBssIdx = BssTableSearch(&pAd->ScanTab, pAd->P2pCfg.Bssid, pAd->MlmeAux.Channel);\n\t\t\t}\n\t\t\t/* Since can't find the target AP in the list.\n\t\t\t    Go back to scan state again to scan the target AP. */\n\t\t\tif (BssIdx == BSS_NOT_FOUND) \n\t\t\t{\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_GO_SCAN_BEGIN;\n\t\t\t\tpP2PCtrl->P2pCounter.Counter100ms = 0;\n\t\t\t\tpP2PCtrl->P2pCounter.NextScanRound = 10;\t/* start scan after 1 s */\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CNTL - Nr= %d. Channel = %d. BSSID not found.  %02x:%02x:%02x:%02x:%02x:%02x.\\n\", pAd->ScanTab.BssNr, pAd->MlmeAux.Channel /*pAd->StaCfg.WscControl.WscAPChannel*/, PRINT_MAC(pP2PCtrl->Bssid)));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CNTL - BSSID not found.\tGoback to %s  \\n\", decodeP2PState(pP2PCtrl->P2PConnectState)));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (pAd->ScanTab.BssEntry[BssIdx].SsidLen < 9)\n\t\t\t{\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_GO_SCAN_BEGIN;\n\t\t\t\tpP2PCtrl->P2pCounter.Counter100ms = 0;\n\t\t\t\tpP2PCtrl->P2pCounter.NextScanRound = 5;\t/* start scan after 500ms */\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CNTL -Nr= %d. Channel = %d.\tSSID is  %c%c%c%c%c%c \\n\", pAd->ScanTab.BssNr, pAd->MlmeAux.Channel /*pAd->StaCfg.WscControl.WscAPChannel*/, pAd->P2pCfg.SSID[0], pAd->P2pCfg.Bssid[1],pAd->P2pCfg.SSID[2],pAd->P2pCfg.SSID[3],pAd->P2pCfg.SSID[4],pAd->P2pCfg.SSID[5]));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CNTL -\tGoback to %s  \\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t/* Now copy the scanned SSID to my CommonCfg.Ssid */\n \t\t\tRTMPMoveMemory(pP2PCtrl->PortCfg.Ssid, pAd->ScanTab.BssEntry[BssIdx].Ssid,32);\n\t\t\tpP2PCtrl->PortCfg.SsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen;\n \t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P P2pPeriodicExec P2P_DO_GO_SCAN_DONE. Find BssIdx = %ld\\n\", BssIdx));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Change P2PConnectState[%s -> %s]\\n\", decodeP2PState(pP2PCtrl->P2PConnectState), decodeP2PState(P2P_DO_WPS_ENROLLEE)));\n\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_WPS_ENROLLEE;\n\t\t}\n\t\t/* <<==================================== */\n\t\tP2pGroupMaintain(pAd);\n\t\t\t\n\t\t/* P2P_ANY_IN_FORMATION_AS_GO means I am AutoGO. AutoGo also need to do scan. So don't return here. */\n\t\tif (IS_P2P_CONNECTING(pAd) && (pP2PCtrl->P2PConnectState != P2P_ANY_IN_FORMATION_AS_GO))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t/* <<==================================== */\n\t\t\n\t\t/* Maintain listen state when in Concurrent mode. STA+P2P\n\t\t    check if need to resume NoA Schedule. */\n}\n\nBOOLEAN P2pResetNoATimer(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tULONG\tDiffTimeInus)\n{\n\tULONG\tGPDiff;\n\t/*ULONG\tValue;*/\n\tBOOLEAN\tbrc = FALSE;\n\n\t/*\n\t\tSoftware based timer means don't use GP interrupt to get precise timer calculation. \n\t\tSo need to check time offset caused by software timer.\n\t */\n\tif (IS_SW_NOA_TIMER(pAd))\n\t{\n\t\tGPDiff = (DiffTimeInus>>10) & 0xffff;\n\t\tif (GPDiff > 0)\n\t\t{\n\t\t\tGPDiff++;\n\t\t\tRTMPSetTimer(&pAd->P2pCfg.P2pSwNoATimer, GPDiff);\n\t\t\t/* Increase timer tick counter. */\n\t\t\tpAd->P2pCfg.GONoASchedule.SwTimerTickCounter++;\n\t\t\tbrc = TRUE;\n\t\t\t/* Will go to awake later. Set a pre-enter-absence timer that the time out is smaller the GPDiff. */\n\t\t\tif (pAd->P2pCfg.GONoASchedule.bInAwake == FALSE)\n\t\t\t{\n\t\t\t\tif (GPDiff > 10)\n\t\t\t\t{\n\t\t\t\t\tRTMPSetTimer(&pAd->P2pCfg.P2pPreAbsenTimer, (GPDiff - 10));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tbrc = P2pSetGP(pAd, DiffTimeInus);\n\t}\n\treturn brc;\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tStart P2P Search State\n\t\t\n\tParameters: \n\t\t \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pScan(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tBOOLEAN Cancelled;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\t/* Stop Scan and resume */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\t\tpAd->MlmeAux.Channel = 0;\n\t\tScanNextChannel(pAd, OPMODE_STA);\n\t}\n\n\tP2pGotoIdle(pAd);\n\tP2pGroupTabInit(pAd);\n\tP2PInitDevDiscTimer(pAd, 0);\n\tP2PInitNextScanTimer(pAd, 0);\t\n\t/* Set P2P Device Discovery Timer */\n\tP2PSetDevDiscTimer(pAd, 0);\n\tP2PSetNextScanTimer(pAd, 10);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tStop connect command to connect with current MAC becuase the connect process already bagan.\n\t\t\n\tParameters: \n\t\t \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pStopConnectThis(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tRTMPZeroMemory(&pAd->P2pCfg.ConnectingMAC[0], MAC_ADDR_LEN);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSet parameter stop P2P Search State when P2P has started Group Formation.\n\t\t\n\tParameters: \n\t\t \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pStopScan(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tBOOLEAN Cancelled;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- P2P - P2pStopScan @channel = %d.\\n\", pAd->MlmeAux.Channel));\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\t/* Stop Scan and resume */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\t\tpAd->MlmeAux.Channel = 0;\n\t\tScanNextChannel(pAd, OPMODE_STA);\n\t}\n\n\t/* Set scan channel to Last one to stop Scan Phase. Because SCannextchannel will use channel to judge if it should stop scan. */\n\tP2PInitDevDiscTimer(pAd, 0);\n\tP2PInitListenTimer(pAd, 0);\n\tP2PInitNextScanTimer(pAd, 0);\n\tP2pGotoIdle(pAd);\n\t/* update P2P Ctrl State Machine status. */\n\tMlmeEnqueue(pAd, P2P_CTRL_STATE_MACHINE, P2P_CTRL_DISC_CANL_EVT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"----> P2P - P2pStopScan @channel = %d.\\n\", pAd->MlmeAux.Channel));\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\t Goto Idle state. Update necessary parameters.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGotoIdle(\n\tIN PRTMP_ADAPTER pAd) \n{\n\t/* pAd->P2pCfg.P2PDiscoProvState = P2P_ENABLE_LISTEN_ONLY; */\n\tpAd->P2pCfg.P2pCounter.Counter100ms = 0;\n\t/* Set a randon period to start next Listen State. */\n\t/* pAd->P2pCfg.P2pCounter.NextScanRound = (RandomByte(pAd) % P2P_RANDOM_BASE) + P2P_RANDOM_BIAS; */\n\n\tpAd->P2pCfg.CtrlCurrentState = P2P_CTRL_IDLE;\n\tpAd->P2pCfg.DiscCurrentState = P2P_DISC_IDLE;\n\tpAd->P2pCfg.GoFormCurrentState = P2P_GO_FORM_IDLE;\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\t Goto Scan/Search state. Update necessary parameters.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGotoScan(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\t/* Reset 100ms Counter to zero. */\n\tpAd->P2pCfg.P2pCounter.Counter100ms = 0;\n\t/* Set a short time to start next search State for the 1st time. */\n\tpAd->P2pCfg.P2pCounter.NextScanRound = 5;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGotoScan!  Set pP2PCtrl->NextScanRound = %ld Here!!!\\n\", pP2PCtrl->P2pCounter.NextScanRound));\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tWhen I am GO, start a P2P NoA schedule.\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pGOStartNoA(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tULONG\tValue;\n\tULONG\tTimeTillTbtt;\n\tULONG\ttemp;\n\t\n\tpAd->P2pCfg.GONoASchedule.Token++;\n\tpAd->P2pCfg.GONoASchedule.bValid = TRUE;\n\t\t\t/* Start Time */\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW1, &pAd->P2pCfg.GONoASchedule.TsfHighByte);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGOStartNoA parameter.!!!!HighByte = %lx \\n\", pAd->P2pCfg.GONoASchedule.TsfHighByte));\n\tRTMP_IO_READ32(pAd, TBTT_TIMER, &TimeTillTbtt);\n\tTimeTillTbtt = TimeTillTbtt&0x1ffff;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"   .!!!!TimeTillTbtt =  %ld  \\n\", TimeTillTbtt));\n\t\n\tRTMP_IO_READ32(pAd, TSF_TIMER_DW0, &Value);\n\tDBGPRINT(RT_DEBUG_TRACE,(\"   .!!!!Current Tsf LSB = = %ld \\n\",  Value));\n\ttemp = TimeTillTbtt*64+Value;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"   .!!!!Tsf LSB + TimeTillTbtt= %ld \\n\", temp));\n\t/* Wait five beacon 0x7d00 for 5 beacon interval.  0x6400 is set to 25%*beacon interval */\n\tpAd->P2pCfg.GONoASchedule.StartTime = Value + TimeTillTbtt*64 + 512000 + 25600;\n\tpAd->P2pCfg.GONoASchedule.NextTargetTimePoint = Value + TimeTillTbtt*64 + 512000 + 25600 + pAd->P2pCfg.GONoASchedule.Duration;\n\tpAd->P2pCfg.GONoASchedule.ThreToWrapAround = pAd->P2pCfg.GONoASchedule.StartTime + 0x7fffffff;\n\tP2pSetGP(pAd, (TimeTillTbtt*64 + 512000 + 25600));\n\ttemp = Value + TimeTillTbtt*64 + 0x7D000 + 0x6400;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"   .!!!!Expect Starttime= %ld. ThreToWrapAround = %ld. \\n\", temp, pAd->P2pCfg.GONoASchedule.ThreToWrapAround));\n\ttemp = temp - Value;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"   .!!!!more = %ld  to start time \\n\", temp));\n\tpAd->P2pCfg.GONoASchedule.bInAwake = TRUE;\n\n}\n\nVOID\t P2pStopNoA(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY\tpMacClient)\n{\n\tULONG\tValue;\n\tBOOLEAN\tCancelled;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pStopNoA.!!!! \\n\"));\n\t\n\tRTMPCancelTimer(&pAd->P2pCfg.P2pPreAbsenTimer, &Cancelled);\n\tpAd->P2pCfg.bKeepSlient = FALSE;\n\tpAd->P2pCfg.bPreKeepSlient = FALSE;\n\tif (pMacClient != NULL)\n\t{\n\t\tpMacClient->P2pInfo.NoADesc[0].Count = 0xf3;\n\t\tpMacClient->P2pInfo.NoADesc[0].bValid = FALSE;\n\t\tpMacClient->P2pInfo.NoADesc[0].bInAwake = TRUE;\n\t\t/*\n\t\t\tTry set Token to a value that has smallest chane the same as the Next Token GO will use.\n\t\t\tSo decrease 1\n\t\t */\n\t\tpMacClient->P2pInfo.NoADesc[0].Token--;\n\t}\n\tRTMPCancelTimer(&pAd->P2pCfg.P2pSwNoATimer, &Cancelled);\n\tpAd->P2pCfg.GONoASchedule.bValid = FALSE;\n\tpAd->P2pCfg.GONoASchedule.bInAwake = TRUE;\n\tpAd->P2pCfg.GONoASchedule.bWMMPSInAbsent = FALSE; /* Set to FALSE if changes state to Awake */\n\t/* If need not resume NoA. Can reset all parameters. */\n\tif (pAd->P2pCfg.GONoASchedule.bNeedResumeNoA == FALSE)\n\t{\n\t\tpAd->P2pCfg.GONoASchedule.Count = 1;\n\t\tpAd->P2pCfg.GONoASchedule.Duration = 0xc800;\n\t\tpAd->P2pCfg.GONoASchedule.Interval = 0x19000;\n\t}\n\n\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\tValue &= (0xfffffffd);\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\tpAd->P2pCfg.GONoASchedule.SwTimerTickCounter = 0;\n\n\t/* Set to false again. */\n\tpAd->P2pCfg.bPreKeepSlient = FALSE;\n\n}\n\nVOID\t P2pStartOpPS(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->P2pCfg.GONoASchedule.bValid == TRUE)\n\t\tP2pStopNoA(pAd, NULL);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2P : !! P2pStartOpPS \\n\"));\n\tpAd->P2pCfg.CTWindows = 0x8a;\n\t/* Wait next beacon period to really start queue packet. */\n\tpAd->P2pCfg.bKeepSlient = FALSE;\n\n}\n\nVOID\t P2pStopOpPS(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->P2pCfg.GONoASchedule.bValid == FALSE)\n\t\tpAd->P2pCfg.bKeepSlient = FALSE;\n\n\tif (P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT))\n\t\tpAd->P2pCfg.bFirstTimeCancelOpps = TRUE;\n\tpAd->P2pCfg.CTWindows = 0;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tWhen I am P2P Client , Handle NoA Attribute.\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pPreAbsenTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tpAd->P2pCfg.bPreKeepSlient = TRUE;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tWhen I am P2P Client , Handle NoA Attribute.\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pSwNoATimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tP2pGPTimeOutHandle(pAd);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tWhen I am P2P GO / Client , Handle P2P session execute WSC in 30secs.\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pWscTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tBOOLEAN\t\tCancelled;\n\tPRT_P2P_CONFIG \tpP2pCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  P2P Execute WSC has expire %dsecs, Stop it!\\n\", __FUNCTION__, (P2P_WSC_TIMER/1000)));\n\tRTMPCancelTimer(&pP2pCtrl->P2pWscTimer, &Cancelled);\n\n\tif (P2P_CLI_ON(pAd))\n\t{\n#ifdef RTMP_MAC_USB\n\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_SET_P2P_LINK_DOWN, NULL, 0);\t\n#endif /* RTMP_MAC_USB */\n\t}\n\telse if (P2P_GO_ON(pAd))\n\t{\n\t\tUINT32 i, p2pEntryCnt=0;\n\t\tMAC_TABLE_ENTRY *pEntry;\n\t\tPWSC_CTRL\t\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\n\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\tif (IS_P2P_GO_ENTRY(pEntry) && (pEntry->WpaState == AS_PTKINITDONE))\n\t\t\t\tp2pEntryCnt++;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pWscTimeOut - Total= %d. p2pEntry = %d.\\n\", pAd->MacTab.Size, p2pEntryCnt));\n\n\t\tif ((p2pEntryCnt == 0) && (pAd->flg_p2p_OpStatusFlags == P2P_GO_UP))\n#ifdef RTMP_MAC_USB\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_SET_P2P_LINK_DOWN, NULL, 0);\t\n#endif /* RTMP_MAC_USB */\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  not P2P GO / CLI on !!\\n\", __FUNCTION__));\n}\n\nVOID P2pReSendTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tPRT_P2P_CLIENT_ENTRY pP2pEntry = NULL;\n\tBOOLEAN\t\t\tCancelled;\n\tPRT_P2P_CONFIG\tpP2pCtrl = &pAd->P2pCfg;\n\tUCHAR\t\t\tBBPValue = 0;\n\tUCHAR\t\t\tp2pindex = P2P_NOT_FOUND;\n\tULONG\t\t\tFrameLen;\n\tUSHORT\t\t\tConfigMthd;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Send to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t__FUNCTION__, PRINT_MAC(pP2pCtrl->ConnectingMAC)));\n\tpP2pCtrl->bP2pReSendTimerRunning = FALSE;\n\tRTMPCancelTimer(&pP2pCtrl->P2pReSendTimer, &Cancelled);\n\n\tp2pindex = P2pGroupTabSearch(pAd, pP2pCtrl->ConnectingMAC);\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\t\tpP2pEntry->ReTransmitCnt++;\n\n\t\tif (pP2pEntry->ReTransmitCnt >= 10)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ReTransmitCnt limit! stop connect this p2p device!\\n\"));\n\t\t\tP2pStopConnectThis(pAd);\n\t\t}\n\n\t\tpP2pEntry->GeneralToken++;\n\t\tswitch(pP2pEntry->P2pClientState)\n\t\t{\n\t\t\tcase P2PSTATE_SENT_PROVISION_REQ:\n\t\t\t\tif (pP2pCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Re-Send PROVISION REQ. KEYPAD\\n\"));\n\t\t\t\t\tConfigMthd = WSC_CONFMET_KEYPAD;\n\t\t\t\t}\n\t\t\t\telse if (pP2pCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Re-Send PROVISION REQ. DISPLAY\\n\"));\n\t\t\t\t\tConfigMthd = WSC_CONFMET_DISPLAY;\n\t\t\t\t}\n\t\t\t\telse if (pP2pCtrl->ConfigMethod == WSC_CONFMET_PBC)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Re-Send PROVISION REQ. PBC\\n\"));\n\t\t\t\t\tConfigMthd = WSC_CONFMET_PBC;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Re-Send PROVISION REQ. wrong Config Method(%d)\\n\", \n\t\t\t\t\t\t\tpP2pCtrl->ConfigMethod));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tP2PSendProvisionReq(pAd, ConfigMthd, pP2pEntry->GeneralToken, pP2pEntry->addr, &FrameLen);\n\t\t\t\tbreak;\n\t\t\tcase P2PSTATE_SENT_GO_NEG_REQ:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Re-Send GO NEGO REQ.\\n\"));\n\t\t\t\tP2pStartGroupForm(pAd, pP2pCtrl->ConnectingMAC, p2pindex);\n\t\t\t\tbreak;\n\t\t\tcase P2PSTATE_SENT_PROVISION_RSP:\n\t\t\t\tif ( pP2pCtrl->bProvAutoRsp == TRUE )\n\t\t\t\t\tbreak;\n\n\t\t\t\tif ( pP2pCtrl->P2pProvUserNotify == 1 )\n\t\t\t\t{\n\t\t\t\t\tif ( pP2pEntry->ReTransmitCnt < 9 )\n\t\t\t\t\t{\t\n\t\t\t\t\t\tP2PSendProvisionRsp(pAd, pP2pCtrl->P2pProvConfigMethod, pP2pCtrl->P2pProvToken, pP2pCtrl->ConnectingMAC, &FrameLen);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpP2pCtrl->P2pProvUserNotify = 0;\n\t\t\t\t\t\tpP2pCtrl->P2pProvIndex = P2P_NOT_FOUND;\n\t\t\t\t\t\tpP2pCtrl->P2pProvUserNotify = FALSE;\n\t\t\t\t\t\tpAd->P2pCfg.P2pCounter.UserAccept = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ( pP2pEntry->ReTransmitCnt < 2 )\n\t\t\t\t\t\tP2PSendProvisionRsp(pAd, 0, pP2pCtrl->P2pProvToken, pP2pCtrl->ConnectingMAC, &FrameLen);\n\t\t\t\t\telse\n\t\t\t\t\t\tpP2pCtrl->P2pProvUserNotify = 0;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ReSendTimeout execute with unknown state - %s\\n\", decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t}\n\t}\n}\n\nVOID P2pCliReConnectTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tPRT_P2P_CLIENT_ENTRY pP2pEntry = NULL;\n\tBOOLEAN\t\t\tCancelled;\n\tPRT_P2P_CONFIG\tpP2pCtrl = &pAd->P2pCfg;\n\tUCHAR\t\t\tBBPValue = 0;\n\tUCHAR\t\t\tp2pindex = P2P_NOT_FOUND;\n\tULONG\t\t\tFrameLen;\n\tUSHORT\t\t\tConfigMthd;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Send to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t__FUNCTION__, PRINT_MAC(pP2pCtrl->ConnectingMAC)));\n\tpP2pCtrl->bP2pCliReConnectTimerRunning = FALSE;\n\tRTMPCancelTimer(&pP2pCtrl->P2pCliReConnectTimer, &Cancelled);\n\n\t/* Tear Down the P2P Connection */\n\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tWhen I am P2P Client , Handle NoA Attribute.\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nBOOLEAN P2pHandleNoAAttri(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY\tpMacClient,\n\tIN PUCHAR pData) \n{\n\tPP2P_NOA_DESC\tpNoADesc;\n\tULONG\t\tValue, GPDiff;\n\tUCHAR\t\tindex;\n\tULONG\t\tNoALen;\n\tULONG\t\tStartTime;\n\t\n\tif (pMacClient == NULL)\n\t\treturn FALSE;\n\n\tif ((*pData == SUBID_P2P_NOA))\n\t{\n\t\tNoALen = *(pData+1);\n\t\tif (NoALen == 2)\n\t\t{\n\t\t\tpMacClient->P2pInfo.CTWindow = *(pData+4); \n\t\t\tif (pMacClient->P2pInfo.NoADesc[0].bValid == TRUE)\n\t\t\t\tP2pStopNoA(pAd, pMacClient);\n\t\t\t/*\n\t\t\t\tCopy my GO's CTWindow to P2Pcfg.CTWindow parameters, \n\t\t\t\tThen As Client, I don't need to search for Client when I want to use CTWindow Value.\n\t\t\t */\n\t\t\tpAd->P2pCfg.CTWindows = *(pData+4); \n\t\t\treturn TRUE;\n\t\t}\n\t\t\t\n\t\tindex = *(pData+3);\n\t\tpMacClient->P2pInfo.CTWindow = *(pData+4);\n\t\t/* \n\t\t\tCopy GO's CTWindow to P2Pcfg.CTWindow parameters, \n\t\t\tThen As Client, I don't need to search for Client when I want to use CTWindow Value.\n\t\t */\n\t\tpAd->P2pCfg.CTWindows = *(pData+4); \n\t\tpNoADesc = (PP2P_NOA_DESC)(pData+5);\n\t\tpMacClient->P2pInfo.NoADesc[0].Count = pNoADesc->Count;\n\t\tpMacClient->P2pInfo.NoADesc[0].Duration = *(PUINT32)&pNoADesc->Duration[0];\n\t\tpMacClient->P2pInfo.NoADesc[0].Interval = *(PUINT32)&pNoADesc->Interval[0];\n\t\tpMacClient->P2pInfo.NoADesc[0].StartTime = *(PUINT32)&pNoADesc->StartTime[0];\n\t\tStartTime = *(PUINT32)&pNoADesc->StartTime[0];\n\t\n\t\tif (pMacClient->P2pInfo.NoADesc[0].Token == index)\n\t\t{\n\t\t\t/* The same NoA. Doesn't need to set this NoA again. */\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2P : !!!NEW NOA Here =[%d, %d] Count = %d. Duration =  %ld \\n\", pMacClient->P2pInfo.NoADesc[0].Token, index, pNoADesc->Count, pMacClient->P2pInfo.NoADesc[0].Duration));\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2P : !!!NEW NOA Here =  CTWindow =  %x \\n\", pMacClient->P2pInfo.CTWindow));\n\t\tpMacClient->P2pInfo.NoADesc[0].Token = index;\n\t\t/*RTMP_IO_FORCE_READ32(pAd, TSF_TIMER_DW0, &Value); */\n\t\tValue = pAd->P2pCfg.GONoASchedule.LastBeaconTimeStamp;\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Interval = %ld. StartTime = %ld. TSF timer Register = %ld\\n\", pMacClient->P2pInfo.NoADesc[0].Interval, pMacClient->P2pInfo.NoADesc[0].StartTime, Value));\n\t\tif ((pMacClient->P2pInfo.NoADesc[0].Duration <= 0x40) || (pMacClient->P2pInfo.NoADesc[0].Interval <= 0x40))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!!!!Interval or Duration too small. ignore.  = %lx return 1\\n\", Value));\n\t\t\treturn FALSE;\n\t\t}\n\t\telse if ((pMacClient->P2pInfo.NoADesc[0].Duration >= pMacClient->P2pInfo.NoADesc[0].Interval)\n\t\t\t&& (pMacClient->P2pInfo.NoADesc[0].Count > 1))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!!!!Duration > Inveral.  return 2\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\t/* if Start time point is in the future. */\n\t\tpAd->P2pCfg.GONoASchedule.CurrentTargetTimePoint = pMacClient->P2pInfo.NoADesc[0].StartTime;\n\t\tif (Value < StartTime)\n\t\t{\n\t\t\tGPDiff = pMacClient->P2pInfo.NoADesc[0].StartTime - Value;\n\t\t\tpMacClient->P2pInfo.NoADesc[0].NextTargetTimePoint = pMacClient->P2pInfo.NoADesc[0].StartTime + pMacClient->P2pInfo.NoADesc[0].Duration;\n\t\t\tpAd->P2pCfg.GONoASchedule.OngoingAwakeTime = pMacClient->P2pInfo.NoADesc[0].NextTargetTimePoint;\n\t\t\tpAd->P2pCfg.GONoASchedule.NextTimePointForWMMPSCounting = pMacClient->P2pInfo.NoADesc[0].StartTime;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"!!!!! GPDiff = %ld = 0x%lx. NextTargetTimePoint = %ld\\n\", GPDiff, GPDiff, pMacClient->P2pInfo.NoADesc[0].NextTargetTimePoint));\n\t\t\t/* try to set General Timer. */\n\t\t\tpAd->P2pCfg.GONoASchedule.LastBeaconTimeStamp += GPDiff;\n\t\t\tif (P2pResetNoATimer(pAd, GPDiff))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"!!!!!Start NoA 1  GPDiff = %ld \\n\", GPDiff));\n\t\t\t\tpMacClient->P2pInfo.NoADesc[0].bValid = TRUE;\n\t\t\t\tpMacClient->P2pInfo.NoADesc[0].bInAwake = TRUE;\n\t\t\t\tpMacClient->P2pInfo.NoADesc[0].Token = index;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t\t/* else if Start time point is in the past. */\n\t\telse if (Value >= StartTime)\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tStartTime += pMacClient->P2pInfo.NoADesc[0].Interval;\n\t\t\t\tif ((StartTime > Value) && ((StartTime-Value) > 0x80))\n\t\t\t\t{\n\t\t\t\t\tGPDiff = StartTime - Value;\n\t\t\t\t\tpMacClient->P2pInfo.NoADesc[0].NextTargetTimePoint = StartTime /*+ pMacClient->P2pInfo.NoADesc[0].Interval*/ - pMacClient->P2pInfo.NoADesc[0].Duration;\n\t\t\t\t\tpAd->P2pCfg.GONoASchedule.OngoingAwakeTime = pMacClient->P2pInfo.NoADesc[0].NextTargetTimePoint;\n\t\t\t\t\tpAd->P2pCfg.GONoASchedule.LastBeaconTimeStamp += GPDiff;\n\t\t\t\t\tif (P2pResetNoATimer(pAd, GPDiff))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"!!!!!Start NoA 2  GPDiff = %ld\\n\", GPDiff));\n\t\t\t\t\t\tpMacClient->P2pInfo.NoADesc[0].bValid = TRUE;\n\t\t\t\t\t\tpMacClient->P2pInfo.NoADesc[0].bInAwake = TRUE;\n\t\t\t\t\t\tpMacClient->P2pInfo.NoADesc[0].Token = index;\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}while(TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Start time in before ..!!Check \\n\"));\n\t\t}\n\t}\n\treturn FALSE;\n\n}\n\nBOOLEAN \tP2pSetGP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tULONG\tDiffTimeInus)\n{\n\tULONG\tGPDiff;\n\tULONG\tValue;\n\t\n\tGPDiff = (DiffTimeInus/64) & 0xffff;\n\tif (GPDiff > 0)\n\t{\n\t\tGPDiff = GPDiff<<16;\n\t\tRTMP_IO_WRITE32(pAd, INT_TIMER_CFG, GPDiff);\n\t\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\t\tValue |= 0x2;\n\t\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nBOOLEAN\tP2pAdjustSwNoATimer(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\t\tCurrentTimeStamp, \n\tIN ULONG\t\tNextTimePoint) \n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tULONG\tAwakeDuration, NewStartTime;\n\tUCHAR\t\tFakeNoAAttribute[32];\n\t\n\tRTMPZeroMemory(FakeNoAAttribute, 32);\n\tAwakeDuration = pP2PCtrl->GONoASchedule.Interval - pP2PCtrl->GONoASchedule.Duration;\n\tif (CurrentTimeStamp < pP2PCtrl->GONoASchedule.CurrentTargetTimePoint)\n\t{\n\t\t/* If offset is more than 1/4 of duration. */\n\t\tif ((pP2PCtrl->GONoASchedule.OngoingAwakeTime) >= (AwakeDuration>> 2))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pAdjustSwNoATimer HERE HERE!!!! \\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"OngoingAwakeTime = %ld. CurrentTimeStamp = %ld.!!!! \\n\", pP2PCtrl->GONoASchedule.OngoingAwakeTime, CurrentTimeStamp));\n\t\t\tP2pStopNoA(pAd, &pAd->MacTab.Content[pP2PCtrl->MyGOwcid]);\n\t\t\tFakeNoAAttribute[0] = SUBID_P2P_NOA;\n\t\t\tNewStartTime = pP2PCtrl->GONoASchedule.StartTime + (pP2PCtrl->GONoASchedule.SwTimerTickCounter - 1)*(pP2PCtrl->GONoASchedule.Interval);\n\t\t\tP2PMakeFakeNoATlv(pAd, NewStartTime, &FakeNoAAttribute[0]);\n\t\t\tpAd->MacTab.Content[pP2PCtrl->MyGOwcid].P2pInfo.NoADesc[0].Token--;\n\t\t\tP2pHandleNoAAttri(pAd, &pAd->MacTab.Content[pP2PCtrl->MyGOwcid], &FakeNoAAttribute[0]);\n\t\t}\n\t\t/* Update expected next Current Target Time Point with NextTimePoint */\n\t\tpP2PCtrl->GONoASchedule.CurrentTargetTimePoint = NextTimePoint;\n\t\t/* Can immediately dequeue packet because peer already in awake period. */\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\t/* Update expected next Current Target Time Point with NextTimePoint */\n\t\tpP2PCtrl->GONoASchedule.CurrentTargetTimePoint = NextTimePoint;\n\t\treturn FALSE;\t\n\t}\n}\n\nVOID P2pGPTimeOutHandle(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tMAC_TABLE_ENTRY *pEntry;\n\tULONG\t\tMacValue;\n\tULONG\t\tValue;\n\tULONG\t\tGPDiff;\n\tULONG\t\tNextDiff;\n\tULONG\t\t\t SavedNextTargetTimePoint;\n\n\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\tValue &= 0xfffffffd;\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\t/* GO operating or Autonomous GO */\n\tif (P2P_GO_ON(pAd))\n\t{\n\t\tif (pP2PCtrl->GONoASchedule.bValid == TRUE)\n\t\t{\n\t\t\tif ((pP2PCtrl->GONoASchedule.Count > 0) && (pP2PCtrl->GONoASchedule.Count < 255))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tSometimes go to awake, sometime go to silence. Two state counts One count down.\n\t\t\t\t\tso only minus Count when I change from Sleep to Awake\n\t\t\t\t */\n\t\t\t\tif (pP2PCtrl->GONoASchedule.bInAwake == FALSE)\n\t\t\t\t\tpP2PCtrl->GONoASchedule.Count--;\n\t\t\t}\n\t\t\tif (pP2PCtrl->GONoASchedule.Count == 0)\n\t\t\t{\n\t\t\t\tP2pStopNoA(pAd, NULL);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGPTimeOutHandle.!!StopGP.\treturn.1 \\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\t\n\t\t\tif (pP2PCtrl->GONoASchedule.bInAwake == TRUE)\n\t\t\t\tNextDiff = pP2PCtrl->GONoASchedule.Duration;\n\t\t\telse\n\t\t\t\tNextDiff = pP2PCtrl->GONoASchedule.Interval - pP2PCtrl->GONoASchedule.Duration;\n\t\t\t\t\t\n\t\t\t/* Prepare next time. */\n\t\t\t/*RTMP_IO_FORCE_READ32(pAd, TSF_TIMER_DW0, &Value); */\n\t\t\tValue = pAd->P2pCfg.GONoASchedule.LastBeaconTimeStamp;\n\n\t\t\t/* Check whether we should to renew the NoA because at least 2^31 us should update once according to spec. */\n\t\t\tif (pP2PCtrl->GONoASchedule.ThreToWrapAround > pP2PCtrl->GONoASchedule.StartTime)\n\t\t\t{\n\t\t\t\tif (Value > pP2PCtrl->GONoASchedule.ThreToWrapAround)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->GONoASchedule.bNeedResumeNoA = TRUE;\n\t\t\t\t\tP2pStopNoA(pAd, NULL);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGPTimeOutHandle.!!StopGP.\treturn.3. will resume.\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((Value > pP2PCtrl->GONoASchedule.ThreToWrapAround) && (Value < pP2PCtrl->GONoASchedule.StartTime))\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->GONoASchedule.bNeedResumeNoA = TRUE;\n\t\t\t\t\tP2pStopNoA(pAd, NULL);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGPTimeOutHandle.!!StopGP.\treturn.4. will resume. \\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSavedNextTargetTimePoint = pP2PCtrl->GONoASchedule.NextTargetTimePoint;\n\t\t\tif (Value <= pP2PCtrl->GONoASchedule.NextTargetTimePoint)\n\t\t\t{\n\t\t\t\tGPDiff = pP2PCtrl->GONoASchedule.NextTargetTimePoint - Value;\n\t\t\t\tpP2PCtrl->GONoASchedule.NextTimePointForWMMPSCounting = pP2PCtrl->GONoASchedule.NextTargetTimePoint;\n\t\t\t\tpP2PCtrl->GONoASchedule.NextTargetTimePoint += NextDiff;\n\t\t\t\tP2pResetNoATimer(pAd, GPDiff);\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\" NextTargetTimePoint = %ld. \\n\", pAd->P2pCfg.GONoASchedule.NextTargetTimePoint));\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"  Value = %ld.\tGPDiff = %ld.\\n\", Value, GPDiff));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* driver restart NoA due to our GP timer's delay. */\n\t\t\t\tif (pP2PCtrl->GONoASchedule.Count == 255)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->GONoASchedule.bNeedResumeNoA = TRUE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\" Prepare resume NoA. \\n\"));\n\t\t\t\t}\n\t\t\t\tP2pStopNoA(pAd, NULL);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"3 NextTargetTimePoint = %ld. \\n\", pP2PCtrl->GONoASchedule.NextTargetTimePoint));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\" 3 Value = %ld= 0x%lx NextDiff = %ld.\\n\", Value, Value, NextDiff));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"3 P2pGPTimeOutHandle.!!StopGP.  return.2 \\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (pP2PCtrl->GONoASchedule.bInAwake == TRUE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\" ----------------------->>> NoA  Go to SLEEP \\n\"));\t\t\n\t\t\t\tpP2PCtrl->GONoASchedule.bWMMPSInAbsent = TRUE; /* Set to FALSE if changes state to absent */\n\t\t\t\tpP2PCtrl->bKeepSlient = TRUE;\n\t\t\t\tpP2PCtrl->bPreKeepSlient = TRUE;\n\t\t\t\tpP2PCtrl->GONoASchedule.bInAwake = FALSE; \n\t\t\t\t/* roughly check that if duration > 100ms, we should call Pause beacon. */\n\t\t\t\tif (pP2PCtrl->GONoASchedule.Duration >= 0x19000)\n\t\t\t\t{\n\t\t\t\t\tP2pPauseBssSync(pAd);\n\t\t\t\t}\n\t\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\" NoA\tWake UP ----------------------->>> \\n\"));\n\t\t\t\tpP2PCtrl->GONoASchedule.bInAwake = TRUE;\n\t\t\t\tpP2PCtrl->GONoASchedule.bWMMPSInAbsent = FALSE; /* Set to FALSE if changes state to Awake */\n\t\t\t\tpP2PCtrl->bKeepSlient = FALSE;\t\n\t\t\t\tpP2PCtrl->bPreKeepSlient = FALSE;\n\t\t\t\tif (pP2PCtrl->GONoASchedule.Duration >= 0x19000)\n\t\t\t\t{\n\t\t\t\t\tP2pResumeBssSync(pAd);\n\t\t\t\t}\n\t\t\t\tif (IS_SW_NOA_TIMER(pAd)\n\t\t\t\t\t&& (pP2PCtrl->GONoASchedule.Count > 100))\n\t\t\t\t{\n\t\t\t\t\tif (TRUE == P2pAdjustSwNoATimer(pAd, Value, SavedNextTargetTimePoint))\n\t\t\t\t\t{\n\t\t\t\t\t\t/*DBGPRINT(RT_DEBUG_TRACE,(\"SwBasedNoA : Dequeue here. %d\\n\", pAd->TxSwNoAMgmtQueue.Number));*/\n\t\t\t\t\t\t/*RTMPDeQueueNoAMgmtPacket(pAd);*/\n\t\t\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*RTMPDeQueueNoAMgmtPacket(pAd);*/\n\t\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t}\n\telse if (P2P_CLI_ON(pAd))\n\t{\n\t\tif (pP2PCtrl->NoAIndex >= MAX_LEN_OF_MAC_TABLE)\n\t\t\treturn;\n\t\n\t\tif (pP2PCtrl->NoAIndex != pP2PCtrl->MyGOwcid)\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGPTimeOutHandle. !bug, please check driver %d. \\n\", pP2PCtrl->NoAIndex));\n\t\t\t\t\n\t\tpEntry = &pAd->MacTab.Content[pP2PCtrl->NoAIndex];\n\t\tif (pEntry->P2pInfo.NoADesc[0].bValid == TRUE)\n\t\t{\n\t\t\tif ((pEntry->P2pInfo.NoADesc[0].Count > 0) && (pEntry->P2pInfo.NoADesc[0].Count < 255))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tSometimes go to awake, sometime go to silence. Two state counts One count down.\n\t\t\t\t\tso only minus Count when I change from Sleep to Awake\n\t\t\t\t */\n\t\t\t\tif (pEntry->P2pInfo.NoADesc[0].bInAwake == FALSE)\n\t\t\t\t\tpEntry->P2pInfo.NoADesc[0].Count--;\n\t\t\t}\n\t\t\tif (pEntry->P2pInfo.NoADesc[0].Count == 0)\n\t\t\t{\n\t\t\t\tP2pStopNoA(pAd, pEntry);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGPTimeOutHandle. Count down to zero!!StopGP.  return.1 \\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t/* To enter absence period, stop transmission a little bit earlier to leave HW to clean the queue. */\n\t\t\tif (pEntry->P2pInfo.NoADesc[0].bInAwake == FALSE)\n\t\t\t\tNextDiff = pEntry->P2pInfo.NoADesc[0].Duration - 0x200;\n\t\t\telse\n\t\t\t\tNextDiff = pEntry->P2pInfo.NoADesc[0].Interval - pEntry->P2pInfo.NoADesc[0].Duration + 0x200;\n\n\t\t\t/* Prepare next time. */\n\t\t\tMacValue = 0x333;\n\t\t\t/*RTMP_IO_READ32(pAd, TSF_TIMER_DW0, &MacValue); */\n\t\t\tMacValue = pAd->P2pCfg.GONoASchedule.LastBeaconTimeStamp;\n\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"2 Tsf\tTimer  = %ld= 0x%lx\t NextTargetTimePoint = %ld.\\n\", MacValue,  MacValue,pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint));\n\t\t\tSavedNextTargetTimePoint = pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint;\n\t\t\tif (MacValue <= pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint)\n\t\t\t{\n\t\t\t\tGPDiff = pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint - MacValue;\n\t\t\t\tpAd->P2pCfg.GONoASchedule.NextTimePointForWMMPSCounting = pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint;\n\t\t\t\tpEntry->P2pInfo.NoADesc[0].NextTimePointForWMMPSCounting = pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint;\n\t\t\t\tpEntry->P2pInfo.NoADesc[0].NextTargetTimePoint += NextDiff;\n\t\t\t\tP2pResetNoATimer(pAd, GPDiff);\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"3\tContinue next NOA NextTargetTimePoint = %lx. \\n\", pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint));\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"3\tValue = %lx.  NextDiff = %lx.\\n\", MacValue, NextDiff));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tP2pStopNoA(pAd, pEntry);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"4  NOA NextTargetTimePoint = %ld. \\n\", pEntry->P2pInfo.NoADesc[0].NextTargetTimePoint));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"4  Value = %ld = 0x%lx.  NextDiff = %ld.\\n\", MacValue,  MacValue, NextDiff));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\t\t\n\t\t\tif (pEntry->P2pInfo.NoADesc[0].bInAwake == TRUE)\n\t\t\t{\n\t\t\t\tpEntry->P2pInfo.NoADesc[0].bInAwake = FALSE;\n\t\t\t\tpP2PCtrl->bKeepSlient = TRUE;\n\t\t\t\tpP2PCtrl->bPreKeepSlient = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Enter Absence now ======> %d\\n\", pP2PCtrl->bKeepSlient));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpEntry->P2pInfo.NoADesc[0].bInAwake = TRUE;\n\t\t\t\tpP2PCtrl->bKeepSlient = FALSE;\n\t\t\t\tpP2PCtrl->bPreKeepSlient = FALSE;\n\t\t\t\tif (IS_SW_NOA_TIMER(pAd)\n\t\t\t\t\t&& (pP2PCtrl->GONoASchedule.Count > 100))\n\t\t\t\t{\n\t\t\t\t\tif (TRUE == P2pAdjustSwNoATimer(pAd, Value, SavedNextTargetTimePoint))\n\t\t\t\t\t{\n\t\t\t\t\t\t/*DBGPRINT(RT_DEBUG_TRACE,(\"SwBasedNoA : Dequeue here. %d\\n\", pAd->TxSwNoAMgmtQueue.Number));*/\n\t\t\t\t\t\t/*RTMPDeQueueNoAMgmtPacket(pAd);*/\n\t\t\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*RTMPDeQueueNoAMgmtPacket(pAd);*/\n\t\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Enter Awake now ======= %d\\n\", pAd->P2pCfg.bKeepSlient));\n\t\n\t\t\t}\n\t\n\t\t}\n\t\t\t\t\t\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID P2pPauseBssSync(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/*BCN_TIME_CFG_STRUC csr;*/\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->P2pPauseBssSync  %s\\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\tAsicDisableSync(pAd);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID P2pResumeBssSync(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/*BCN_TIME_CFG_STRUC csr;*/\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->P2pResumeBssSync  %s\\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\tAsicEnableP2PGoSync(pAd);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tOppPS CTWindows timer. \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PCTWindowTimer(\n\tIN PVOID\tSystemSpecific1, \n\tIN PVOID\tFunctionContext, \n\tIN PVOID\tSystemSpecific2, \n\tIN PVOID\tSystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd = (RTMP_ADAPTER *)FunctionContext;\n\tPRT_P2P_CONFIG pP2pCtrl = &pAd->P2pCfg;\n\n\tif (P2P_TEST_BIT(pP2pCtrl->CTWindows, P2P_OPPS_BIT))\n\t\tpP2pCtrl->bKeepSlient = TRUE;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tBefore reinvoke a persistent group, copy persistent parameter to pAd->P2pCfg.. \n\t\t\n\tParameters: \n\t\tPerstindex : the index for entry in Persistent Table.\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pCopyPerstParmToCfg(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tPerstindex)\n{\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tGet Random SSID \"DIRECT-xx\" \n\t\t\n\tParameters: \n\t\tpSSID : output SSID\n\t\tpSSIDLen : Length of pSSID\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGetRandomSSID(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PSTRING pSSID,\n\tOUT PUCHAR pSSIDLen)\n{\n\tUCHAR tmp[52];\n\tUCHAR i;\n\t//gen a-z , A-Z tmp array!\n\tfor(i=0 ; i < 26 ; i++)\n\t{\n\t\ttmp[i]='a'+i;\n\t\ttmp[i+26]='A'+i;\n\t}\n\t\n\tNdisMoveMemory(pSSID, \"DIRECT-\", 7);\n\tpSSID[7] = tmp[RandomByte(pAd)%52];\n\tpSSID[8] = tmp[RandomByte(pAd)%52];\n\tNdisMoveMemory((pSSID + 9), pAd->P2pCfg.DeviceName, pAd->P2pCfg.DeviceNameLen);\n\t(*pSSIDLen) = 9 + pAd->P2pCfg.DeviceNameLen;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pSetListenIntBias(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tBias)\n{\n\tpAd->P2pCfg.P2pCounter.ListenIntervalBias = Bias;\n\tif (INFRA_ON(pAd))\n\t\tpAd->P2pCfg.P2pCounter.ListenIntervalBias = 1;\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that decide my Rule as GO or Client? \n\t\tAnd then do necessary setting : update channel, Bssid, SSID etc.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pSetRule(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tIndex,\n\tIN PUCHAR\t\tPeerBssid,\n\tIN UCHAR\t\tPeerGOIntentAttri,\n\tIN UCHAR\t\tChannel)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[Index];\n\tUCHAR\t\tRealIntent;\n\tUSHORT\t\tPeerWscMethod;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\" P2pSetRule - Channel = %d. GoIntent = %x\\n\", Channel, PeerGOIntentAttri));\n\tRealIntent = PeerGOIntentAttri>>1;\n\tif (RealIntent > pP2PCtrl->GoIntentIdx)\n\t{\n\t\tpP2pEntry->Rule = P2P_IS_GO;\n\t\tpP2pEntry->GoIntent = RealIntent;\n\t\t/* Use peer addr as bssid */\n\t\tRTMPMoveMemory(pP2PCtrl->PortCfg.Bssid, PeerBssid, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pP2PCtrl->Bssid, PeerBssid, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pP2PCtrl->SSID, pP2pEntry->Ssid, 32);\n\t\tpP2PCtrl->SSIDLen = pP2pEntry->SsidLen;\n\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\n\t\t/*\n\t\t\tThe Operating Channel attribute may be present in the P2P IE.\n\t\t\tIf Channel is 0, use self configuration.\n\t\t*/\n\t\tif (Channel != 0)\n\t\tpP2PCtrl->GroupOpChannel = Channel;\n\t\telse\t\t\t\n\t\t\tpP2PCtrl->GroupOpChannel = pP2PCtrl->GroupChannel;\n\t\t\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (INFRA_ON(pAd) && (!pAd->P2pCfg.bStartP2pConnect) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tpAd->P2pCfg.bStartP2pConnect=TRUE;\n\t\t\tRTMPSetTimer(&pAd->Mlme.ConcurrentP2PConnectTimer, (1000*15));\n\t\t\tpAd->Mlme.ConcurrentP2PConnectTimerRunning = TRUE;\n\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\t\n\t\t/* Update My WPS Mode. */\n\t\tP2P_SetWscRule(pAd, Index, &PeerWscMethod);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - I become Internal Enrollee!!    Enrollee. !! GOGOGO\\n\"));\n\t}\n\telse if (RealIntent < pP2PCtrl->GoIntentIdx)\n\t{\n\t\tpP2pEntry->Rule = P2P_IS_CLIENT;\n\t\tpP2pEntry->GoIntent = RealIntent;\n\t\t/* Use my addr as bssid */\n\t\tRTMPMoveMemory(pP2PCtrl->Bssid, pP2PCtrl->CurrentAddress, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pP2PCtrl->PortCfg.Bssid, pP2PCtrl->CurrentAddress, MAC_ADDR_LEN);\n\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_GO;\n\t\tpP2PCtrl->GroupOpChannel = pP2PCtrl->GroupChannel;\n\n\t\t/* Update My WPS Config Method. */\n\t\tP2P_SetWscRule(pAd, Index, &PeerWscMethod);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - MyIntent = %d, PeerIntent = %d\\n\", pP2PCtrl->GoIntentIdx, RealIntent));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - I become Internal REGISTRA!!    REGISTRA. !! GOGOGO\\n\"));\n\t}\n\telse if (((PeerGOIntentAttri&1) == 1) && (RealIntent == pP2PCtrl->GoIntentIdx))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pSetRule Peer Tie Breaker bit is On.  %x \\n\", RealIntent));\n\t\tpP2pEntry->Rule = P2P_IS_GO;\n\t\tpP2pEntry->GoIntent = RealIntent;\n\t\t/* Use peer addr as bssid */\n\t\tRTMPMoveMemory(pP2PCtrl->PortCfg.Bssid, PeerBssid, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pP2PCtrl->Bssid, PeerBssid, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pP2PCtrl->SSID, pP2pEntry->Ssid, 32);\n\t\tpP2PCtrl->SSIDLen = pP2pEntry->SsidLen;\n\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t/*\n\t\t\tThe Operating Channel attribute may be present in the P2P IE.\n\t\t\tIf Channel is 0, use self configuration.\n\t\t*/\n\t\tif (Channel != 0)\n\t\tpP2PCtrl->GroupOpChannel = Channel;\n\t\telse\t\t\t\n\t\t\tpP2PCtrl->GroupOpChannel = pP2PCtrl->GroupChannel;\n\t\t\n\t\t/* Update My WPS Config Method. */\n\t\tP2P_SetWscRule(pAd, Index, &PeerWscMethod);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - I become Internal Enrollee!!    Enrollee. !! GOGOGO\\n\"));\n\t}\n\telse if (((PeerGOIntentAttri & 0x1) == 0) && (RealIntent == pP2PCtrl->GoIntentIdx))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pSetRule Peer Tie Breaker bit is Off.  %x \\n\", RealIntent));\n\t\tpP2pEntry->Rule = P2P_IS_CLIENT;\n\t\tpP2pEntry->GoIntent = RealIntent;\n\t\t/* Use my addr as bssid */\n\t\tRTMPMoveMemory(pP2PCtrl->Bssid, pP2PCtrl->CurrentAddress, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pP2PCtrl->PortCfg.Bssid, pP2PCtrl->CurrentAddress, MAC_ADDR_LEN);\n\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_GO;\n\t\tpP2PCtrl->GroupOpChannel = pP2PCtrl->GroupChannel;\n\n\t\t/* Update My WPS Config Method. */\n\t\tP2P_SetWscRule(pAd, Index, &PeerWscMethod);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - I become Internal REGISTRA!!    REGISTRA. !! GOGOGO\\n\"));\n\t}\n\n    /* Fix reply GO-Neg-Confirm too late (over 100ms) issue, change the following debug level to TRACE */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pSetRule pPort Bssid = %02x %02x %02x %02x %02x %02x  \\n\",  pP2PCtrl->PortCfg.Bssid[0], pP2PCtrl->PortCfg.Bssid[1],pP2PCtrl->PortCfg.Bssid[2],pP2PCtrl->PortCfg.Bssid[3],pP2PCtrl->PortCfg.Bssid[4],pP2PCtrl->PortCfg.Bssid[5]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"GroupOpChannel =  %d  \\n\",pP2PCtrl->GroupOpChannel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\" P2pSetRule - pP2pEntry->Rule = %s. \\n\", decodeMyRule(pP2pEntry->Rule)));\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tStart Provisionint process.  Send out Provision Discovery Request frame.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pProvision(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr)\n{\n\tUCHAR\t\tp2pindex, Channel;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pProvision = %02x:%02x:%02x:%02x:%02x:%02x.  \\n\",  PRINT_MAC(Addr)));\n\tp2pindex = P2pGroupTabSearch(pAd, Addr);\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Start P2pProvision = %02x:%02x:%02x:%02x:%02x:%02x.  \\n\",  PRINT_MAC(Addr)));\n\t\tpAd->P2pTable.Client[p2pindex].GeneralToken++;\n\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_PROVISION_COMMAND;\n\n\t\t/* Stop Scan and switch to peer's Listen Channel. */\n\t\tP2pStopScan(pAd);\n\t\tChannel = pAd->P2pTable.Client[p2pindex].ListenChannel;\n\t\tAsicSwitchChannel(pAd, Channel, FALSE);\n\t\tAsicLockChannel(pAd, Channel);\n\t\tpAd->P2pCfg.DiscCurrentState = P2P_DISC_SEARCH;\n\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.Client[p2pindex].addr);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tConnect to Addr. Include all \"Connect\" cenario. GO_nego, invite, etc. Addr might be P2P GO, or a P2P Device.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pConnect(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR\tChannel, p2pIdx;\n\n\t/* Stop Scan and switch to peer's Listen Channel. */\n\tP2pStopScan(pAd);\n\tp2pIdx = P2pGroupTabSearch(pAd, pAd->P2pCfg.ConnectingMAC);\n\tif (p2pIdx >= MAX_P2P_GROUP_SIZE)\n\t\treturn FALSE;\n\n\tChannel = pAd->P2pTable.Client[p2pIdx].ListenChannel;\n\tif (Channel == 0)\n\t\tChannel = 1;\n\tAsicSwitchChannel(pAd, Channel, FALSE);\n\tAsicLockChannel(pAd, Channel);\n\tpAd->P2pCfg.DiscCurrentState = P2P_DISC_SEARCH;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pConnect =  \\n\"));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x.  \\n\",  PRINT_MAC(pAd->P2pCfg.ConnectingMAC)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"ListenChannel =  %d\\n\", Channel));\n\n\treturn TRUE;\n}\n\nVOID P2pConnectPrepare(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tAddr,\n\tIN UINT32 ConnType)\n{\n\tUCHAR\tChannel, p2pindex;\n\n\tp2pindex = P2pGroupTabSearch(pAd, Addr);\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (INFRA_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tpAd->P2pCfg.bStartP2pConnect=TRUE;\n\n\t\t\tRTMPSetTimer(&pAd->Mlme.ConcurrentP2PConnectTimer, (1000*15));\n\t\t\tpAd->Mlme.ConcurrentP2PConnectTimerRunning = TRUE;\n\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\tpAd->P2pCfg.bConfirmByUI = TRUE;\n\t\t/* Stop Scan and switch to peer's Listen Channel. */\n\t\tP2pStopScan(pAd);\n\t\tOS_WAIT(200);\n\n\t\tpAd->P2pCfg.bPeriodicListen = FALSE;\n\n\t\tif ((pAd->P2pTable.Client[p2pindex].P2pClientState == P2PSTATE_DISCOVERY_GO))\n\t\t\tChannel = pAd->P2pTable.Client[p2pindex].OpChannel;\n\t\telse\n\t\t\tChannel = pAd->P2pTable.Client[p2pindex].ListenChannel;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && \n\t\t\t\t\t(INFRA_ON(pAd))\n\t\t\t\t\t&&(pAd->CommonCfg.Channel == pAd->LatchRfRegs.Channel ||\n\t\t\t\t\tpAd->CommonCfg.CentralChannel == pAd->LatchRfRegs.Channel))\n\t\t\t\t{\n\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\t  PWR_SAVE);\n\t\t\t\t\tOS_WAIT(200);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pConnectPrepare():Send PWA NullData frame to notify the associated AP!\\n\"));\n\t\t\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\tif (INFRA_ON(pAd) || P2P_GO_ON(pAd))\n\t\t{\n\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t\t\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\t}\n\n\t\tAsicSwitchChannel(pAd, Channel, FALSE);\n\t\tAsicLockChannel(pAd, Channel);\n\n\t\t/* Copy pEntry MAC Address in ConnectinfMAC. */\n\t\tpAd->P2pCfg.ConnectingIndex = 0;\n\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.Client[p2pindex].addr);\n\n\t\t/* Set Connecting Timer for Periodic Timer use. */\n\t\tpAd->P2pTable.Client[p2pindex].StateCount = 0;\n\t\tpAd->P2pTable.Client[p2pindex].bValid = TRUE;\n\n\t\t/* Set pEntry Client Status. */\n\t\tif ((pAd->P2pTable.Client[p2pindex].P2pClientState == P2PSTATE_DISCOVERY_GO))\n\t\t{\n\t\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.Client[p2pindex].bssid);\n\t\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_PROVISION_COMMAND;\n\t\t}\n\t\telse\n\t\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = ConnType;\n\t\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P Connect Command Type =  %s\\n\", decodeP2PClientState(ConnType)));\n\t\tP2PPrintP2PEntry(pAd, p2pindex);\n\t\n\t\t/* Change Discovery State Machine State. */\n\t\tpAd->P2pCfg.DiscCurrentState = P2P_DISC_SEARCH;\n\t\tpAd->P2pCfg.GoFormCurrentState = P2P_GO_FORM_IDLE;\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tReady to connect to Addr. Include all \"Connect\" cenario. GO_nego, invite, etc. Addr might be P2P GO, or a P2P Device.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pConnectAfterScan(\n\tIN PRTMP_ADAPTER pAd, \n\tIN BOOLEAN\tbBeacon,\n\tIN UCHAR\t\tidx)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tBOOLEAN\tbrc = TRUE;\n\tUCHAR\t\tindex;/*, i; */\n\tUCHAR\t\tGrpIndex = idx;\n\tBOOLEAN\t\tbAction = FALSE;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAfterScan   %d. %s \\n\", pAd->P2pTable.Client[idx].P2pClientState, decodeP2PClientState(pAd->P2pTable.Client[idx].P2pClientState)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\" GroupOpChannel  = %d  \\n\", pP2PCtrl->GroupOpChannel));\n\n\tif (GrpIndex >= MAX_P2P_GROUP_SIZE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pConnectAfterScan Check - Reach Device Limit. return.  \\n\"));\n\t\treturn FALSE;\n\t}\n\t\n\t/*\n\t\tpeer is a P2P GO.\n\t\tPeer is a P2P Device. Need to have Go Nego procedure first.\n\t\tOr can reinvoke a persistent\n\t*/\n\tif (pAd->P2pTable.Client[GrpIndex].P2pClientState == P2PSTATE_DISCOVERY)\n\t{\n\t\t/* Decide connect method when I am in Connect_Idle state. This means I am a P2P Device. */\n\t\tif (P2P_CLI_ON(pAd) || (P2P_GO_ON(pAd)))\n\t\t{\n\t\t\t/* Invite Case 1 */\n\t\t\tpAd->P2pTable.Client[GrpIndex].P2pClientState = P2PSTATE_INVITE_COMMAND;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2pConnectAfterScan -  Use Invite %d.\\n\", GrpIndex));\n\t\t\tbAction = TRUE;\n\t\t}\n\t\telse if (IS_P2P_CONNECT_IDLE(pAd))\n\t\t{\n\t\t\tindex = P2pPerstTabSearch(pAd, pAd->P2pTable.Client[GrpIndex].addr, \n\t\t\t\t\t\t\t\t\t\tpAd->P2pTable.Client[GrpIndex].bssid, \n\t\t\t\t\t\t\t\t\t\tpAd->P2pTable.Client[GrpIndex].InterfaceAddr);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAfterScan - Perst index %d.  \\n\", index));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAfterScan - EnablePresistent %d.  \\n\", \n\t\t\t\t\tpP2PCtrl->P2pControl.field.EnablePresistent));\n\t\t\tif ((index < MAX_P2P_TABLE_SIZE) && IS_PERSISTENT_ON(pAd))\n\t\t\t{\n\t\t\t\t/* Invite Case 3: */\n\t\t\t\tpAd->P2pTable.Client[GrpIndex].P2pClientState = P2PSTATE_INVITE_COMMAND;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAfterScan -  Use reinvoke Invite %d.  \\n\", index));\n\t\t\t\tbAction = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2pConnectAfterScan -  Start From Group Forming   \\n\"));\n\n\t\t\t\t/* Start Scan and Then go to Group Forming process. */\n\t\t\t\tpAd->P2pTable.Client[idx].P2pClientState = P2PSTATE_CONNECT_COMMAND;\n\t\t\t\tbAction = TRUE;\n\t\t\t}\n\t\t}\n\t\tif (bAction == TRUE)\n\t\t{\n\t\t\t/* Now only support connect to ONE. So set ConnectingIndex to MAX_P2P_GROUP_SIZE to stop connect further MAC. */\n\t\t\tP2pConnectAction(pAd, bBeacon, idx);\n\t\t}\n\t}\n\telse if ((pAd->P2pTable.Client[GrpIndex].P2pClientState == P2PSTATE_DISCOVERY_GO))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" case 1  = peer is go  \\n\"));\n\t\tP2pStopConnectThis(pAd);\n\t\tbrc = P2pConnectP2pGo(pAd, GrpIndex);\n\t}\n\t/* peer is a P2P client in a P2P Group. */\n\telse if ((pAd->P2pTable.Client[GrpIndex].P2pClientState == P2PSTATE_DISCOVERY_CLIENT))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" case 2  = peer is client  \\n\"));\n\t\tP2pStopConnectThis(pAd);\n\t\tP2pConnectP2pClient(pAd,GrpIndex);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2pConnectAfterScan - Peer state %s \\n\", \n\t\t\t\tdecodeP2PClientState(pAd->P2pTable.Client[GrpIndex].P2pClientState)));\n\n\treturn brc;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPrepare to connect to Connecting MAC. ConnectingMAC might contain several MAC address that I can connect to One after one.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pConnectAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN BOOLEAN\tbBeacon,\n\tIN UCHAR\t\tindex)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tBOOLEAN\t\tbresult = FALSE;\n\tUCHAR\t\tperstindex;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAction   %d. %s \\n\", pAd->P2pTable.Client[index].P2pClientState, decodeP2PClientState(pAd->P2pTable.Client[index].P2pClientState)));\n\n\tif (bBeacon == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAction   from bBeacon \\n\"));\n\t\t/* Check If ever have a command to connect to this peer. */\n\t\tif (pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_CONNECT_COMMAND\n\t\t\t||(pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_INVITE_COMMAND))\n\t\t{\n\t\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\tP2pGoNegoDone(pAd, &pAd->P2pTable.Client[index]);\n\t\t}\n\t\telse if (pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_GO_DISCO_COMMAND)\n\t\t{\n\t\t\tbresult = P2pClientDiscovery(pAd, pAd->P2pTable.Client[index].addr, index);\n\t\t}\n\t}\n\telse\n\t{\t\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pConnectAction  not from bBeacon \\n\"));\n\t\tif ((pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_CONNECT_COMMAND)\n\t\t\t|| (pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_INVITE_COMMAND))\n\t\t{\n\t\t\t/* The check sequence must be the same as in where we set P2PSTATE_INVITE_COMMAND in P2PConnect() */\n\t\t\tif ((P2P_GO_ON(pAd)) || (P2P_CLI_ON(pAd)))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"  case 1 \\n\"));\n\t\t\t\t/* Invite Case 1 : I am Auto GO to invite a P2P Device or when I am P2P Client */\n\t\t\t\tbresult = P2pInvite(pAd, pAd->P2pTable.Client[index].addr, MAX_P2P_TABLE_SIZE, index);\n\t\t\t}\n\t\t\telse if (pAd->P2pTable.Client[index].Rule == P2P_IS_GO)\n\t\t\t{\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"  case 2 \\n\"));\n\t\t\t\t/* directly associate to  GO. */\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\t\tP2pGoNegoDone(pAd, &pAd->P2pTable.Client[index]);\n\t\t\t}\n\t\t\telse if (IS_P2P_CONNECT_IDLE(pAd))\n\t\t\t{\n\t\t\t\tUCHAR Channel;\n\t\t\t\tP2P_CMD_STRUCT\tP2pCmd;\n\t\t\t\tUCHAR ClientState = pAd->P2pTable.Client[index].P2pClientState;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"  case 3 \\n\"));\n\t\t\t\t/* since I am idle,  */\n\t\t\t\tperstindex = P2pPerstTabSearch(pAd, pAd->P2pTable.Client[index].addr, \n\t\t\t\t\t\t\t\t\t\t\t\tpAd->P2pTable.Client[index].bssid, \n\t\t\t\t\t\t\t\t\t\t\t\tpAd->P2pTable.Client[index].InterfaceAddr);\n\t\t\t\tif ((perstindex < MAX_P2P_TABLE_SIZE) && (IS_PERSISTENT_ON(pAd)))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tI have credential, my persistent is enabled, peer 's persistent is enabled.  \n\t\t\t\t\t\tSo use Reinvoke method to start P2P group.\n\t\t\t\t\t\tStop Scan and switch to peer's Listen Channel.\n\t\t\t\t\t*/\n\t\t\t\t\tP2pStopScan(pAd);\t\t\n\t\t\t\t\tChannel = pAd->P2pTable.Client[index].ListenChannel;\n\t\t\t\t\tAsicSwitchChannel(pAd, Channel, FALSE);\n\t\t\t\t\tAsicLockChannel(pAd, Channel);\n\n\t\t\t\t\tClientState = P2PSTATE_INVITE_COMMAND;\n\t\t\t\t\tpAd->P2pCfg.P2PConnectState = P2P_CONNECT_IDLE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tClientState = P2PSTATE_CONNECT_COMMAND;\t\t\n\t\t\t\t}\n\t\t\t\tCOPY_MAC_ADDR(&P2pCmd.Addr[0], pAd->P2pTable.Client[index].addr);\n\t\t\t\tP2pCmd.Idx = index;\t\t\t\n\t\t\t\tMlmeEnqueue(pAd, P2P_GO_FORM_STATE_MACHINE, P2P_START_COMMUNICATE_CMD_EVT, sizeof(P2P_CMD_STRUCT), &P2pCmd, ClientState);\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"  case 4 ?????? \\n\"));\n\t\t\tif (bresult == TRUE)\n\t\t\t{\n\t\t\t\t/* do nothing */\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\tpP2PCtrl->P2pCounter.GoScanBeginCounter100ms = 0;\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tConnect to Addr. Addr is already in a P2P Group.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pConnectP2pClient(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tGrpIndex)\n{\n\tBOOLEAN\t\tbGoToScan = FALSE;\n\tUCHAR\t\tGoP2pIndex;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pConnect to P2pClient====>.  \\n\"));\n\t\n\t/* Decide connect method when I am in COnnect_Idle state. This means I am a P2P Device. */\n\tif (IS_P2P_CONNECT_IDLE(pAd))\n\t{\n\t\tGoP2pIndex = pAd->P2pTable.Client[GrpIndex].MyGOIndex;\n\t\tif ((pAd->P2pTable.Client[GrpIndex].DevCapability & DEVCAP_CLIENT_DISCOVER) == 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Client Not support Discoverability  %x \\n\", pAd->P2pTable.Client[GrpIndex].DevCapability));\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Client CAN Support Discoverability  %x \\n\", pAd->P2pTable.Client[GrpIndex].DevCapability));\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Client DevCapability  %x. GoP2pIndex = %d. \\n\", pAd->P2pTable.Client[GrpIndex].DevCapability, GoP2pIndex));\n\t\tif ((GoP2pIndex < MAX_P2P_GROUP_SIZE) && (pAd->P2pTable.Client[GoP2pIndex].P2pClientState == P2PSTATE_DISCOVERY_GO))\n\t\t{\n\t\t\tpAd->P2pTable.Client[GrpIndex].P2pClientState = P2PSTATE_CLIENT_DISCO_COMMAND;\n\t\t\tpAd->P2pTable.Client[GoP2pIndex].P2pClientState = P2PSTATE_GO_DISCO_COMMAND;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2P  GrpIndex  %d . GoP2pIndex = %d\\n\", GrpIndex, GoP2pIndex));\n\t\t\tbGoToScan = TRUE;\t\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2pConnectIdle - peer device's state %s \\n\", decodeP2PClientState(pAd->P2pTable.Client[GrpIndex].P2pClientState)));\n\t}\n\n\tif (bGoToScan == TRUE)\n\t{\n\t\tP2pSetListenIntBias(pAd, 12);\n\t\tpAd->P2pCfg.P2pCounter.CounterAftrScanButton = 0;\n\t\tP2pGotoScan(pAd);\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tConnect to Addr. Addr is already in a P2P Group.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pConnectP2pGo(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tidx)\n{\n\tBOOLEAN\tbrc = FALSE;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pConnectP2pGo.  %s\\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->P2pCfg.Dpid = %d \\n\", pAd->P2pCfg.Dpid));\n\t/* Decide connect method when I am in COnnect_Idle state. This means I am a P2P Device. */\n\tif (P2P_GO_ON(pAd))\n\t\treturn brc;\n\n\tif (pAd->P2pCfg.P2PConnectState == P2P_CONNECT_IDLE)\n\t{\n\t\tpAd->P2pTable.Client[idx].P2pClientState = P2PSTATE_PROVISION_COMMAND;\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2p : Use Provision first before connecting to GO with Bssid   %x.  %x. %x.  %x. %x.  %x. \\n\", pAd->P2pTable.Client[idx].bssid[0], pAd->P2pTable.Client[idx].bssid[1],pAd->P2pTable.Client[idx].bssid[2],pAd->P2pTable.Client[idx].bssid[3],pAd->P2pTable.Client[idx].bssid[4],pAd->P2pTable.Client[idx].bssid[5]));\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2p : its GroupCapability= %x.  DevCapability= %x. \\n\", pAd->P2pTable.Client[idx].GroupCapability, pAd->P2pTable.Client[idx].DevCapability));\n\t\tbrc = TRUE;\n\t}\n\telse if (P2P_CLI_ON(pAd))\n\t{\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"invalid P2pConnectP2pGo command when %s \\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\n\treturn brc;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tTry to connect to a P2P Client.  So Use Client discovery first. CLient Discvoery frame is \n\t\tforwarded by the help of GO.  \n\t\t\n\tParameters: \n\t\tP2pTabIdx is GO's index in P2P table.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pClientDiscovery(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR \t\tGoP2pTabIdx)\n{\n\tUCHAR\t\tClientP2PIndex = P2P_NOT_FOUND;\n\tUCHAR\t\ti;\n\tULONG\t\tTotalFrameLen;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pClientDiscovery  %d\\n\", GoP2pTabIdx));\n\tif (GoP2pTabIdx >= MAX_P2P_GROUP_SIZE)\n\t\treturn FALSE;\n\n\t/* Search what is the P2P client that I was about to ask it's existence. */\n\tfor (i = 0; i < MAX_P2P_GROUP_SIZE;i++)\n\t{\n\t\tif (pAd->P2pTable.Client[i].P2pClientState == P2PSTATE_CLIENT_DISCO_COMMAND)\n\t\t\tClientP2PIndex = i;\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pClientDiscovery.  ClientP2PIndex= %d\\n\", ClientP2PIndex));\n\tif (ClientP2PIndex == P2P_NOT_FOUND)\n\t\treturn FALSE;\n\n\tP2PSendDevDisReq(pAd, pAd->P2pTable.Client[GoP2pTabIdx].addr, pAd->P2pTable.Client[GoP2pTabIdx].addr, pAd->P2pTable.Client[ClientP2PIndex].addr, &TotalFrameLen);\n\tif (TotalFrameLen > 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pClientDiscovery. ClientP2PIndex = %d\\n\", ClientP2PIndex));\n\t\treturn TRUE;\n\t}\n\telse\t\n\t\treturn FALSE;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tInvite can be used for reinvoke persistent entry or just to connect to an P2P client. So \n\t\tHas 2 index for those choices. Only one is used.  \n\t\tinvitation procedure is  an optional procedure used for the following :\n\t\t1. A P2P group owner inviting a P2P Device to become a P2P Client in its P2P Group.\n\t\t2. A P2P client invitin another P2P Device to join the P2P Group of which the P2P Client is a member \n\t\tbecause it wished to use some service of the P2P Device.\n\t\t3. Requesting to invoke a Persistent P2P Group for which both P2P Devices have previouslt been provisioned.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pInviteAsRule(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tMyRule,\n\tIN UCHAR \t\tP2pTabIdx)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tRT_P2P_CLIENT_ENTRY\t*pClient;\n\tULONG\t\tFrameLen;\n\n\t/* Reflash this flag on the next Invitation or DPID setting. */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pInviteAsRule MyRule = %d. P2pTabIdx= %d \\n\",  MyRule, P2pTabIdx));\n\tpClient = &pAd->P2pTable.Client[P2pTabIdx];\n\tP2PMakeInviteReq(pAd, MyRule, 0, pClient->addr, pP2PCtrl->CurrentAddress, &FrameLen);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pInviteAsRule FrameLen = %ld.  \\n\", FrameLen));\n\tif (FrameLen > 0)\n\t\treturn TRUE;\n\n\treturn FALSE;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tInvite can be used for reinvoke persistent entry or just to connect to an P2P client. So \n\t\tHas 2 index for those choices. Only one is used.  \n\t\tinvitation procedure is  an optional procedure used for the following :\n\t\t1. A P2P group owner inviting a P2P Device to become a P2P Client in its P2P Group.\n\t\t2. A P2P client invitin another P2P Device to join the P2P Group of which the P2P Client is a member \n\t\tbecause it wished to use some service of the P2P Device.\n\t\t3. Requesting to invoke a Persistent P2P Group for which both P2P Devices have previouslt been provisioned.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pInvite(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR\t\tPersistentTabIdx, \n\tIN UCHAR \t\tP2pTabIdx)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tRT_P2P_PERSISTENT_ENTRY *pEntry;\n\tRT_P2P_CLIENT_ENTRY\t*pClient;\n/*\tUCHAR\t\tindex; */\n\tULONG\t\tFrameLen;\n\tBOOLEAN\t\tbrc = FALSE;\n\t\n\t/* Get one index that is valid to use during invitation procedure. */\n\tif (PersistentTabIdx < MAX_P2P_TABLE_SIZE)\n\t{\n\t\t/* those who can save to persistent table must also support persistent . So can use invite procedure now. */\n\t\tpEntry = &pAd->P2pTable.PerstEntry[PersistentTabIdx];\n\t\tif (P2pTabIdx < MAX_P2P_GROUP_SIZE)\n\t\t{\n\t\t\tpAd->P2pCfg.PhraseKeyLen = (UCHAR)pEntry->Profile.KeyLength;\n\t\t\tRTMPMoveMemory(pAd->P2pCfg.PhraseKey, pEntry->Profile.Key, pEntry->Profile.KeyLength);\n\t\t\tpClient = &pAd->P2pTable.Client[P2pTabIdx];\n\t\t\tRTMPMoveMemory(pAd->P2pCfg.SSID, pEntry->Profile.SSID.Ssid, 32);\n\t\t\tpP2PCtrl->SSIDLen = (UCHAR)pEntry->Profile.SSID.SsidLength;\n\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, pEntry->Profile.SSID.Ssid, pP2PCtrl->SSIDLen);\n\n\t\t\tif (pEntry->MyRule == P2P_IS_CLIENT)\n\t\t\t{\n\t\t\t\tpClient->Rule = P2P_IS_GO;\n\t\t\t\tpClient->P2pClientState = P2PSTATE_GO_WPS;\n\t\t\t\tRTMPMoveMemory(pAd->P2pCfg.Bssid, pEntry->Addr, MAC_ADDR_LEN);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpClient->Rule = P2P_IS_CLIENT;\n\t\t\t\tpClient->P2pClientState = P2PSTATE_CLIENT_WPS;\n\t\t\t\tRTMPMoveMemory(pAd->P2pCfg.Bssid, pAd->CurrentAddress, MAC_ADDR_LEN);\n\t\t\t}\n\t\t\tP2PMakeInviteReq(pAd, pEntry->MyRule, P2P_INVITE_FLAG_REINVOKE, pEntry->Addr, pP2PCtrl->CurrentAddress, &FrameLen);\n\t\t\tif (FrameLen > 0)\n\t\t\t{\n\t\t\t\tbrc = TRUE;\n\t\t\t\tpClient->P2pClientState = P2PSTATE_SENT_INVITE_REQ;\n\t\t\t}\n\t\t}\n\t}\n\telse if (P2pTabIdx < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tif ((pAd->P2pTable.Client[P2pTabIdx].DevCapability & DEVCAP_INVITE) == DEVCAP_INVITE)\n\t\t{\n\t\t\t/*if (pP2PCtrl->PortSubtype == PORTSUBTYPE_P2PGO) */\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\tbrc = P2pInviteAsRule(pAd, P2P_IS_GO, P2pTabIdx);\n\t\t\t}\n\t\t\telse if (P2P_CLI_ON(pAd))\n\t\t\t\tbrc = P2pInviteAsRule(pAd, P2P_IS_CLIENT, P2pTabIdx);\n\t\t\t\t\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Peer doesn't support Invite. DevCapability = %x \\n\", pAd->P2pTable.Client[P2pTabIdx].DevCapability));\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"invalid P2pInvite command. %d %d \\n\",  PersistentTabIdx, P2pTabIdx));\n\n\treturn  brc;\n\n}\n\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tStart Group Formation Process.   will send out Go Negociation Request frame.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pStartGroupForm(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR\t\tidx)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR        pOutBuffer = NULL;\n\tULONG         FrameLen = 0;\n\t\n\t/* Insert this candidate to p2p client table. */\n\tif (idx < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tif ((pAd->P2pTable.Client[idx].P2pClientState == P2PSTATE_CONNECT_COMMAND)|| \n\t\t(pAd->P2pTable.Client[idx].P2pClientState == P2PSTATE_DISCOVERY) || \n\t\t(pAd->P2pTable.Client[idx].P2pClientState == P2PSTATE_SENT_GO_NEG_REQ))\n\t\t{\n\t\t\t/* Reset Scan Counter to Zero . So Won't do Scan too sooon because group forming is started. */\n\t\t\tpAd->P2pCfg.P2pCounter.Counter100ms = 0;\n\t\t\tif (IS_EXT_LISTEN_ON(pAd))\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\t\t\tpAd->P2pCfg.ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Start GroupForm .  \\n\", __FUNCTION__));\n\t\t\t\t/* allocate and send out ProbeRsp frame */\n\t\t\t\tNStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  /* Get an unused nonpaged memory */\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\t\treturn FALSE;\n\t\t\t\tpAd->P2pTable.Client[idx].P2pClientState = P2PSTATE_SENT_GO_NEG_REQ;\n\t\t\t\tpAd->P2pTable.Client[idx].StateCount = 0;\n\t\t\t\tpAd->P2pTable.Client[idx].bValid = FALSE;\n\n\n\t\t\t\t/* Set as Client temporarily. Later when I get the GO Rsp, will update this based on correct Intent. */\n\t\t\t\tP2PMakeGoNegoReq(pAd, idx, Addr, pOutBuffer, &FrameLen);\n\t\t\t\tpP2PCtrl->bP2pReSendTimerRunning = TRUE;\n\t\t\t\tRTMPSetTimer(&pP2PCtrl->P2pReSendTimer, P2P_TRANSMIT_TIMER);\n\t\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Make GO Negociation Req FrameLen  = %ld. \\n\", FrameLen));\t\n\t\t\t}\t\n\t\t\t/* Once dwell in a listen and start group formation process, should stop scan right away. */\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCheck if the addr is in my MAC wish list if any.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2PDeviceMatch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN PUCHAR\tDeviceName,\n\tIN ULONG\t\tDeviceNameLen)\n{\n\tUCHAR\ti;\n\tUCHAR\t*ptr;\n\t\n\tptr = &pAd->P2pCfg.ConnectingMAC[0];\n\treturn TRUE;\n\t\n\tif (NdisEqualMemory(Addr, ZERO_MAC_ADDR, 6))\n\t\treturn FALSE;\n\n\t/* If didn't assign MAC connecting wish list, allow all and return TRUE. */\n\tif (NdisEqualMemory(pAd->P2pCfg.ConnectingMAC, ZERO_MAC_ADDR, 6))\n\t\treturn TRUE;\n\n\tfor (i = 0;i<MAX_P2P_GROUP_SIZE;i++)\n\t{\n\t\tif (NdisEqualMemory(Addr, ptr, 6))\n\t\t\treturn TRUE;\n\t\t\n\t\tptr += MAC_ADDR_LEN;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2p : P2PDevice Not Match from %02x:%02x:%02x:%02x:%02x:%02x.. = %s \\n\", PRINT_MAC(Addr), decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\treturn FALSE;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSet WPS related parameters\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pSetWps(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN PRT_P2P_CLIENT_ENTRY pP2pEntry)\n{ \n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tBOOLEAN bChangeInitBW = FALSE;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tMAC_TABLE_ENTRY\t    \t\t\t*pEntry = NULL;\n\tint i;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: ==> P2P Connect State = %d.     %s.\\n\", \n\t\t\t\t__FUNCTION__, pP2PCtrl->P2PConnectState, decodeP2PState(pP2PCtrl->P2PConnectState)));\t\n\n#ifdef HE_BD_SUPPORT\n            /* Store Assoc info */\n            if (pP2PCtrl->Rule == P2P_IS_GO)\n            {\n                        if( pP2PCtrl->AssocList.maclist_count < 3)\n                        {\n                                    BOOLEAN is_found = FALSE;\n                                    int j;\n                                    for ( j = 0 ; j < pP2PCtrl->AssocList.maclist_count ; j ++ )\n                                                if ( NdisEqualMemory(&pP2PCtrl->AssocList.device_name[j].ssid , pP2pEntry->DeviceName, 32) )\n                                                            is_found = TRUE;\n\n                                    if ( ! is_found )\n                                    {\n                                                int i = pP2PCtrl->AssocList.maclist_count;\n                                                DBGPRINT(RT_DEBUG_TRACE,(\"pP2PCtrl->AssocList.maclist_count = %d\\n\", pP2PCtrl->AssocList.maclist_count));\n                                                DBGPRINT(RT_DEBUG_TRACE,(\"pP2pEntry->InterfaceAddr = %02X:%02X:%02X:%02X:%02X:%02X\\n\", PRINT_MAC(pP2pEntry->InterfaceAddr)));\n                                                DBGPRINT(RT_DEBUG_TRACE,(\"pP2pEntry->addr = %02X:%02X:%02X:%02X:%02X:%02X\\n\", PRINT_MAC(pP2pEntry->addr)));\n                                                DBGPRINT(RT_DEBUG_TRACE,(\"pP2pEntry->bssid = %02X:%02X:%02X:%02X:%02X:%02X\\n\", PRINT_MAC(pP2pEntry->bssid)));\n                                                DBGPRINT(RT_DEBUG_TRACE,(\"pP2pEntry->DeviceName = %s\\n\", pP2pEntry->DeviceName));\n\t\t\t\tNdisMoveMemory(&pP2PCtrl->AssocList.device_type[i].dev_type, &pP2pEntry->PrimaryDevType, 8);\n                                               NdisMoveMemory(&pP2PCtrl->AssocList.maclist[i].octet, &pP2pEntry->InterfaceAddr, MAC_ADDR_LEN);\n                                                NdisZeroMemory(&pP2PCtrl->AssocList.device_name[i].ssid, 33);\n                                                pP2PCtrl->AssocList.is_p2p[i] = TRUE;\n                                                NdisMoveMemory(&pP2PCtrl->AssocList.device_name[i].ssid, &pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen);\n                                                pP2PCtrl->AssocList.maclist_count++;\n                                    }\n                        }\n            }\n            else\n            {\n\t\tNdisMoveMemory(&pP2PCtrl->AssocList.device_type[0].dev_type, &pP2pEntry->PrimaryDevType, 8);\n                        NdisMoveMemory(&pP2PCtrl->AssocList.maclist[0].octet, &pP2pEntry->InterfaceAddr, MAC_ADDR_LEN);\n                        NdisZeroMemory(&pP2PCtrl->AssocList.device_name[0].ssid, 33);\n                        //NdisMoveMemory(&pP2PCtrl->AssocList.maclist[0].octet, &pP2PCtrl->SSID, pP2PCtrl->SSIDLen);\n                       NdisMoveMemory(&pP2PCtrl->AssocList.device_name[0].ssid, &pP2PCtrl->SSID, pP2PCtrl->SSIDLen);\n                        pP2PCtrl->AssocList.maclist_count = 1;\n            }\n\n#endif /* HE_BD_SUPPORT */\n\n\n\tP2pStopConnectThis(pAd); /* clean Connecting MAC Address. */\n\tP2pStopScan(pAd);\n\tpObj->ioctl_if_type = INT_P2P;\n\t//pP2PCtrl->bConfirmByUI = FALSE;\n\tif ((pP2PCtrl->Rule == P2P_IS_GO) && (P2P_GO_ON(pAd)))\n\t{\n\t\tPWSC_CTRL pWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\n\t\t/* Set Channel. */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"(%d, %d)\\n\", pAd->LatchRfRegs.Channel != pP2PCtrl->GroupChannel));\n\t\tif (pAd->LatchRfRegs.Channel != pP2PCtrl->GroupChannel)\n\t\t\tbChangeInitBW = TRUE;\n\t\telse\n\t\t{\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\n\t\t\tif (!INFRA_ON(pAd)&& !P2P_GO_ON(pAd) && (pApCliEntry->Valid == FALSE))\n\t\t\t\tbChangeInitBW = TRUE;\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (INFRA_ON(pAd) || P2P_GO_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->CommonCfg.BBPCurrentBW == BW_40) && (pAd->LatchRfRegs.Channel != pAd->CommonCfg.CentralChannel))\n\t\t\t\t\t\tbChangeInitBW = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (bChangeInitBW == TRUE)\n\t\t{\n\t\t\tUCHAR rf_channel;\n\n\t\t\t// TODO: shiang-6590, check this for P2P + STA concurrnet mode!!\n\t\t\tif (!INFRA_ON(pAd))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.Channel = pP2PCtrl->GroupOpChannel;\n\t\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n\t\t\t\t\t&& pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\t\t\t\tN_SetCenCh(pAd, pAd->CommonCfg.Channel);\n\t\t\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((pAd->CommonCfg.Channel != pAd->CommonCfg.CentralChannel) && (pAd->CommonCfg.BBPCurrentBW == BW_40))\n\t\t\t\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\t\t\telse\n\t\t\t\t\trf_channel = pAd->CommonCfg.Channel;\n\t\t\t}\n\n\n\t\t\t// TODO: shiang-6590, check this for BW setting here!!\n\t\t\tif (rf_channel != pAd->CommonCfg.Channel)\n\t\t\t\trtmp_bbp_set_bw(pAd, BW_40);\n\t\t\telse\n\t\t\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\t\t\n\t\t\tAsicSwitchChannel(pAd, rf_channel, FALSE);\n\t\t\tAsicLockChannel(pAd, rf_channel);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Rule = %s. OpChannel = %d. CentralChannel = %d\\n\", \n\t\t\t\t\t__FUNCTION__, decodeMyRule(pP2PCtrl->Rule), pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"      SSID[%d] = %s.    BSSID = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\t\t\tpP2PCtrl->SSIDLen, pP2PCtrl->SSID, PRINT_MAC(pP2PCtrl->CurrentAddress)));\n\t\tpP2PCtrl->P2pCapability[1] |= GRPCAP_OWNER;\n\t\t/* P2P GO up. */\n\t\tif (pWscControl->WscConfStatus == WSC_SCSTATE_CONFIGURED)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P_FIXED_MODE && WSC_SCSTATE_CONFIGURED\\n\"));\n\t\t\tAsicBBPAdjust(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\tSet_P2p_OpMode_Proc(pAd, \"1\");\n\t\t}\n\n\t\t/* GO WPS trigger. */\n\t\tif (pP2PCtrl->WscMode == WSC_PIN_MODE)\n\t\t{\n\t\t\tif (pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t{\n\t\t\t\tSet_AP_WscConfMode_Proc(pAd, \"5\"); /* Registrar / Enrollee  */\n\t\t\t\tSet_AP_WscMode_Proc(pAd, \"1\"); /* PIN  */\n\t\t\t\t/* note 2011-10-12 : only AutoGO need WscPinCode command */\n\t\t\t\t/*\n\t\t\t\t\tTo use ConfirmByUI flag to block WPS operation,\n\t\t\t\t\tonce UI/wpa_supplicant ready, it will call P2pConnectPrepare to toggle ConfirmByUI\n\t\t\t\t*/\n\t\t\t\tif (pP2PCtrl->bSigmaEnabled == TRUE || pAd->P2pCfg.bConfirmByUI == TRUE) {\n\t\t\t\t\tif ((!(pAd->flg_p2p_OpStatusFlags & P2P_FIXED_MODE)) ||\n\t\t\t\t\t\t(pP2PCtrl->bSigmaEnabled == TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tSet_AP_WscPinCode_Proc(pAd, pP2PCtrl->PinCode);\n\t\t\t\t\t\tOS_WAIT(700);\n\t\t\t\t\t}\n\t\t\t\t\tSet_AP_WscGetConf_Proc(pAd, \"1\");\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_CONFMET_KEYPAD, bConfirmByUI == TRUE, do further WSC operation!!\\n\", __func__));\n\t\t\t\t\t/* Reset bConfirmByUI to its default value */\n\t\t\t\t\tpP2PCtrl->bConfirmByUI =  CONFIRM_BY_UI_DEFAULT;\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_CONFMET_KEYPAD, bConfirmByUI == FALSE, wait for Upper layer Trigger WSC operation!!\\n\", __func__));\t\n\t\t\t}\n\t\t\telse if (pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\t{\n\t\t\t\tSet_AP_WscConfMode_Proc(pAd, \"5\"); /* Registrar / Enrollee */\n\t\t\tSet_AP_WscMode_Proc(pAd, \"1\"); /* PIN */\n\t\t\tOS_WAIT(700);\n\t\t\tSet_AP_WscGetConf_Proc(pAd, \"1\");\n\t\t}\n\t\t}\n\t\telse if (pP2PCtrl->WscMode == WSC_PBC_MODE)\n\t\t{\n\t\t\tSet_AP_WscConfMode_Proc(pAd, \"5\"); /* Registrar / Enrollee */\n\t\t\tSet_AP_WscMode_Proc(pAd, \"2\"); /* PBC */\n\t\t\t/*\n\t\t\t\tTo use ConfirmByUI flag to block WPS operation,\n\t\t\t\tonce UI/wpa_supplicant ready, it will call P2pConnectPrepare to toggle ConfirmByUI\n\t\t\t*/\n\t\t\tif (pAd->P2pCfg.bConfirmByUI == TRUE) {\n\t\t\t\tOS_WAIT(700);\n\t\t\t\tSet_AP_WscGetConf_Proc(pAd, \"1\");\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_PBC_MODE, bConfirmByUI == TRUE, do further WSC operation!!\\n\", __func__));\n\t\t\t\t/* Reset bConfirmByUI to its default value */\n\t\t\t\tpP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_PBC_MODE, bConfirmByUI == FALSE, wait for Upper layer Trigger WSC operation!!\\n\", __func__));\t\n\t\t}\n\t\tRTMPSetTimer(&pAd->P2pCfg.P2pWscTimer, P2P_WSC_TIMER);\n\n\t}\n\telse if ((pP2PCtrl->Rule == P2P_IS_CLIENT) && (P2P_CLI_ON(pAd)))\n\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (!INFRA_ON(pAd))\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = pP2PCtrl->GroupOpChannel;\n\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: !INFRA_ON Rule = %s. OpChannel = %d. CentralChannel = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, decodeMyRule(pP2PCtrl->Rule), pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" \t SSID[%d] = %s.    BSSID = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\t\t\t\tpP2PCtrl->SSIDLen, pP2PCtrl->SSID, PRINT_MAC(pP2PCtrl->Bssid)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->ApCliMlmeAux.Channel = pP2PCtrl->GroupOpChannel;\n\t\t\t/*N_SetCenCh(pAd); */\n\t\t\tAsicSwitchChannel(pAd, pAd->ApCliMlmeAux.Channel , FALSE);\n\t\t\tAsicLockChannel(pAd, pAd->ApCliMlmeAux.Channel );\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: INFRA_ON Rule = %s. OpChannel = %d. CentralChannel = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, decodeMyRule(pP2PCtrl->Rule), pAd->ApCliMlmeAux.Channel , pAd->ApCliMlmeAux.CentralChannel));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" \t SSID[%d] = %s.    BSSID = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\t\t\t\tpP2PCtrl->SSIDLen, pP2PCtrl->SSID, PRINT_MAC(pP2PCtrl->Bssid)));\n\t\t}\n#else\n\n\t\t/* Set Channel. */\n\t\tpAd->CommonCfg.Channel = pP2PCtrl->GroupOpChannel;\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Rule = %s. OpChannel = %d. CentralChannel = %d\\n\", \n\t\t\t\t\t__FUNCTION__, decodeMyRule(pP2PCtrl->Rule), pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" \t SSID[%d] = %s.    BSSID = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\t\t\tpP2PCtrl->SSIDLen, pP2PCtrl->SSID, PRINT_MAC(pP2PCtrl->Bssid)));\n\n#endif /*CONFIG_MULTI_CHANNEL*/\n\t\t/* P2P CLIENT up. */\n\t\tSet_P2p_OpMode_Proc(pAd, \"2\");\n\t\t/* P2P AP-Client Enable. */\n\t\tSet_P2pCli_Enable_Proc(pAd, \"1\");\n\n\t\t/* CLIENT WPS trigger. */\n\t\tif (pP2PCtrl->WscMode == WSC_PIN_MODE)\n\t\t{\n\t\t\tif (pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t{\n\t\t\t\tSet_AP_WscConfMode_Proc(pAd, \"1\"); /* Enrollee */\n\t\t\t\tSet_AP_WscMode_Proc(pAd, \"1\"); /* PIN */\n\t\t\t\tSet_P2pCli_WscSsid_Proc(pAd, &pP2PCtrl->SSID[0]);\n\t\t\t\t/* Need Enter PIN Code and trigger WPS. */\n\n\t\t\t\t/*\n\t\t\t\t\tTo use ConfirmByUI flag to block WPS operation,\n\t\t\t\t\tonce UI/wpa_supplicant ready, it will call P2pConnectPrepare to toggle ConfirmByUI\n\t\t\t\t*/\n\t\t\t\tif (pP2PCtrl->bSigmaEnabled == TRUE || pAd->P2pCfg.bConfirmByUI == TRUE) {\n\t\t\t\t\tSet_AP_WscPinCode_Proc(pAd, pP2PCtrl->PinCode);\n\t\t\t\t\tOS_WAIT(700);\n\t\t\t\t\tSet_AP_WscGetConf_Proc(pAd, \"1\");\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_CONFMET_KEYPAD, bConfirmByUI == TRUE, do further WSC operation!!\\n\", __func__));\n\t\t\t\t\t/* Reset bConfirmByUI to its default value */\n\t\t\t\t\tpP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT;\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_CONFMET_KEYPAD, bConfirmByUI == FALSE, wait for Upper layer Trigger WSC operation!!\\n\", __func__));\t\n\t\t\t}\n\t\t\telse if (pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\t{\n\t\t\tSet_AP_WscConfMode_Proc(pAd, \"1\"); /* Enrollee */\n\t\t\tSet_AP_WscMode_Proc(pAd, \"1\"); /* PIN */\n\t\t\tSet_P2pCli_Ssid_Proc(pAd, &pP2PCtrl->SSID[0]);\n\t\t\tSet_AP_WscGetConf_Proc(pAd, \"1\");\n\t\t}\n\t\t\t/*COPY_MAC_ADDR(pAd->ApCfg.ApCliTab[0].CfgApCliBssid, pP2PCtrl->Bssid);*/\n\t\t}\n\t\telse if (pP2PCtrl->WscMode == WSC_PBC_MODE)\n\t\t{\n\t\t\tSet_AP_WscConfMode_Proc(pAd, \"1\"); /* Enrollee */\n\t\t\tSet_AP_WscMode_Proc(pAd, \"2\"); /* PBC */\n\t\t\tSet_P2pCli_WscSsid_Proc(pAd, &pP2PCtrl->SSID[0]);\n\t\t\t/*\n\t\t\t\tTo use ConfirmByUI flag to block WPS operation,\n\t\t\t\tonce UI/wpa_supplicant ready, it will call P2pConnectPrepare to toggle ConfirmByUI\n\t\t\t*/\n\t\t\tif (pAd->P2pCfg.bConfirmByUI == TRUE) {\n\t\t\t\tOS_WAIT(700);\n\t\t\tSet_AP_WscGetConf_Proc(pAd, \"1\");\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_PBC_MODE, bConfirmByUI == TRUE, do further WSC operation!!\\n\", __func__));\n\t\t\t\t/* Reset bConfirmByUI to its default value */\n\t\t\t\tpP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WSC_PBC_MODE, bConfirmByUI == FALSE, wait for Upper layer Trigger WSC operation!!\\n\", __func__));\n\t\t}\n\n\t\tRTMPSetTimer(&pAd->P2pCfg.P2pWscTimer, P2P_WSC_TIMER);\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCall this function after a successful Go negociation. will do coreessponding action as  GO or Client.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGoNegoDone(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PRT_P2P_CLIENT_ENTRY pP2pEntry) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\n\tif (pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO)\n\t{\n\t\t/* Set MyRule in P2P GroupFormat */\n\t\tpP2PCtrl->Rule = P2P_IS_GO;\n\t\tpAd->flg_p2p_OpStatusFlags |= P2P_GO_UP;\n\t\tP2pSetWps(pAd, pP2pEntry);\n\t}\n\telse if (pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_CLIENT)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->P2pCfg.Dpid = %s \\n\", decodeDpid(pP2PCtrl->Dpid)));\n\t\t/* Set MyRule in P2P GroupFormat */\n\t\tpP2PCtrl->Rule = P2P_IS_CLIENT;\n\t\tpAd->flg_p2p_OpStatusFlags = P2P_CLI_UP;\n\n\t\t/* If WPS not triggered, don't so WPS AP now. Wait until P2PPRofile called */\n\t\tif (pP2PCtrl->Dpid != DEV_PASS_ID_NOSPEC)\n\t\t{\n\t\t\t/* Update Per client state */\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GO_WPS;\n\t\t\t/* Update Global State. Prepare to scan for GO beacon. So as to connect using WPS. */\n\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_GO_SCAN_BEGIN;\n\t\t\tpP2PCtrl->P2pCounter.Counter100ms = 0;\n\t\t\t/* When Counter100ms reaches NextScanRound in P2P_DO_GO_NEG_DONE_CLIENT State, */\n\t\t\t/* Will start a site survey again. Because P2P GO start beacon after Go Negociation. */\n\t\t\tpP2PCtrl->P2pCounter.NextScanRound = 20 + pP2pEntry->ConfigTimeOut * 10;\n\t\t\t/*pAd->StaCfg.WscControl.WscAPChannel = pP2PCtrl->GroupOpChannel; */\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGoNegoDone. NextScanRound= %ld\\n\", pP2PCtrl->P2pCounter.NextScanRound));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2 WscMode = %lx     \\n\", pP2PCtrl->WscMode));\n\t\t\t/* Start WPS. */\n\t\t\tP2pSetWps(pAd, pP2pEntry);\n\n\t\t}\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGoNegoDone-  invalid p2pstate = %s\\n\", decodeP2PState(pP2PCtrl->P2PConnectState)));\n\t\t\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCall this function after a successful WPS provisioning.  do coreessponding action as  GO or Client.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pWpsDone(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tpAddr)\n{\n\n}\n\nVOID P2pLinkDown(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT32 type)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPOS_COOKIE\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tINT if_type = pObj->ioctl_if_type;\n\tUCHAR           BBPValue = 0;\n\n\n/*\n\tAndroid except below format for P2P-GROUP-REMOVE event\n\n   \tP2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED\n\n\tsince it need client or GO role content,\n\tso moving send event to here,\n\tto make if (P2P_GO_ON(pAd))/if (P2P_CLI_ON(pAd)) function still work before P2P_GoStop function.\n*/\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\tif (type == P2P_CONNECT_FAIL)\n\t\ttype = RT_P2P_CONNECT_FAIL;\n\telse if (type == P2P_DISCONNECTED)\n\t\ttype = RT_P2P_DISCONNECTED;\n\tP2pSendWirelessEvent(pAd, type, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: ==> P2P Connect State = %d. \t%s.\\n\", __FUNCTION__, pP2PCtrl->P2PConnectState, decodeP2PState(pP2PCtrl->P2PConnectState)));\t\n\n\tP2pStopConnectThis(pAd); /* clean Connecting MAC Address. */\n\n \tpP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE;\n/*\n\tpP2PCtrl->CtrlCurrentState = P2P_CTRL_IDLE;\n\tpP2PCtrl->DiscCurrentState = P2P_DISC_LISTEN;\n\tpP2PCtrl->GoFormCurrentState = P2P_GO_FORM_IDLE;\n*/\n \tP2pStopScan(pAd);\n\tP2pGroupTabInit(pAd);\n\tpP2PCtrl->GoFormCurrentState = P2P_GO_FORM_IDLE;\n\n\t/* Restore P2P WSC Mode / Config Method */\n\tpP2PCtrl->WscMode = WSC_PIN_MODE; /* PIN */\n\tpP2PCtrl->ConfigMethod = 0x188;\n\tpP2PCtrl->Dpid = DEV_PASS_ID_NOSPEC;\n\t/*MlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);*/\n\t/* Set bConfirmByUI to default */\n\tpP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT;\n\n\tpObj->ioctl_if_type = INT_P2P;\n\n#ifdef WIFI_P2P_CONCURRENT_FAST_SCAN\n\t/* reset to not doing improved scan when both STA & P2P are LinkDown */\n    if (!INFRA_ON(pAd))\n\t    pAd->StaCfg.bImprovedScan = FALSE;\n#endif\n\n\tif (P2P_CLI_ON(pAd))\n\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tpAd->P2pCfg.bStartP2pConnect = FALSE;\n\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\tSet_P2pCli_Enable_Proc(pAd, \"0\");\n\t}\n\tif (P2P_GO_ON(pAd))\n\t{\n\t\tPWSC_CTRL\t\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t}\n\n\tSet_P2p_OpMode_Proc(pAd, \"0\");\n\tpObj->ioctl_if_type = if_type;\n\tpAd->ApCfg.ApCliTab[0].WscControl.WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\tpAd->ApCfg.MBSSID[0].WscControl.WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\n\tP2pGetRandomSSID(pAd, pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, &(pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen));\n\tpAd->P2pCfg.SSIDLen = pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen;\n\tNdisMoveMemory(pAd->P2pCfg.SSID, pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, pAd->P2pCfg.SSIDLen);\n\t\n\t/* Set Channel. */\n\tif ((INFRA_ON(pAd)) && (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40))\n\t{\n\t}\n\telse\n\t{\n\t\tBOOLEAN bDisableMAC = FALSE;\n\t\tUINT32\tData = 0, macStatus;\n\t\tUINT32 MTxCycle;\n\n\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\n\t\tif (!INFRA_ON(pAd))\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = pP2PCtrl->ListenChannel;\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;\n\t\t\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\t}\n\t\t\n\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_20)\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);\n\t}\n\n\tif (IS_PERSISTENT_ON(pAd) && pP2PCtrl->bP2pCliReConnect)\n\t{\n\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.PerstEntry[0].Addr);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P CLIENT Re-Connect to %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\tPRINT_MAC(pAd->P2pCfg.ConnectingMAC)));\n\t}\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\tif (type == P2P_CONNECT_FAIL)\n\t\ttype = RT_P2P_CONNECT_FAIL;\n\telse if (type == P2P_DISCONNECTED)\n\t\ttype = RT_P2P_DISCONNECTED;\n\tP2pSendWirelessEvent(pAd, type, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tStart autonomous GO function/\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pStartAutoGo(\n\tIN PRTMP_ADAPTER pAd) \n{\n\n}\n\nVOID P2pEnable(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tRTMPMoveMemory(pP2PCtrl->SSID, WILDP2PSSID, WILDP2PSSIDLEN);\n\n\tpP2PCtrl->P2pCapability[0] =\t0;\n\tpP2PCtrl->P2pCapability[1] =\t0;\n\n\tif (IS_PERSISTENT_ON(pAd))\n\t{\n\t\tpAd->P2pCfg.P2pCapability[1] |= GRPCAP_PERSISTENT;\n\t\tpAd->P2pCfg.P2pCapability[1] |= GRPCAP_PERSISTENT_RECONNECT;\n\t\tpAd->P2pCfg.P2pCapability[0] |= DEVCAP_INVITE;\n\t\tpAd->P2pCfg.ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\tpAd->P2pCfg.ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t}\n\telse\n\t{\n\t\t/* When Persistent is disabled, I won't support extended listening, so set to Zero. */\n\t\tpAd->P2pCfg.ExtListenInterval = 0;\n\t\tpAd->P2pCfg.ExtListenPeriod = 0;\n\t}\n\n\t/* P2P Device Capability */\n\tpP2PCtrl->P2pCapability[0] |= DEVCAP_INVITE;\n\n\tif (pP2PCtrl->P2p_OpMode == P2P_CONCURRENT)\n\t{\n\t\tpP2PCtrl->P2pCapability[1] |= GRPCAP_CROSS_CONNECT;\n\t\tpP2PCtrl->P2pCapability[0] |= DEVCAP_CLIENT_CONCURRENT;\n\t}\n\n\n\tif (IS_INTRA_BSS_ON(pAd))\n\t{\n\t\tpP2PCtrl->P2pCapability[1] |= GRPCAP_INTRA_BSS;\n\t}\n\n\t{\n\t\tpP2PCtrl->ConfigMethod = 0x188;\n\t\tpAd->StaCfg.WscControl.RegData.SelfInfo.ConfigMethods = 0x188;\n\t\tpAd->StaCfg.WscControl.RegData.SelfInfo.DevPwdId = 0x188;\n\t}\n\n\tpP2PCtrl->ConfigTimeout[0] = 4;\n\tpP2PCtrl->ConfigTimeout[1] = 30;\n\n\t/* Construct AP RSN_IE.  */\n\tRTMPMakeRSNIE(pAd, Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled, 0 /*apidx*/);\n\n\tP2pStopNoA(pAd, NULL);\n\tpAd->P2pCfg.CTWindows = 0;\n\tP2pScanChannelDefault(pAd);\n\tpP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE;\n\tP2pGotoIdle(pAd);\n\n\t/*AsicSetBssid(pAd, pP2PCtrl->CurrentAddress);  */\n\t{\n\t\tULONG\tAddr4;\n\t\tUINT32\tregValue;\n\t\tPUCHAR pP2PBssid = &pAd->CurrentAddress[0];\n\n\t\tAddr4 = (ULONG)(pP2PBssid[0])\t\t | \n\t\t\t\t(ULONG)(pP2PBssid[1] << 8)\t| \n\t\t\t\t(ULONG)(pP2PBssid[2] << 16) |\n\t\t\t\t(ULONG)(pP2PBssid[3] << 24);\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4);\n\n#ifdef HDR_TRANS_SUPPORT\n\t\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW0, Addr4);\n#endif /* HDR_TRANS_SUPPORT */\n\n\t\tAddr4 = 0;\n\n\t\t/* always one BSSID in STA mode */\n\t\tAddr4 = (ULONG)(pP2PBssid[4]) | (ULONG)(pP2PBssid[5] << 8);\n\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4);\n\n\t\tRTMP_IO_READ32(pAd, MAC_BSSID_DW1, &regValue);\n\t\tregValue &= 0x0000FFFF;\n\n\t\tif ((pAd->CurrentAddress[5] % 2 != 0)\n#ifdef P2P_ODD_MAC_ADJUST\n\t\t\t\t&& FALSE\n#endif /* P2P_ODD_MAC_ADJUST */\n\t\t\t)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The 2-BSSID mode is enabled, the BSSID byte5 MUST be the multiple of 2\\n\"));\n\t\t\n\t\tregValue |= (1 << 16);\n\t\t/*\tset as 0/1 bit-21 of MAC_BSSID_DW1(offset: 0x1014) \n\t\t\tto disable/enable the new MAC address assignment.  */\n\t\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\t\tregValue |= (1 << 21);\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, regValue);\n\t\n\n#ifdef HDR_TRANS_SUPPORT\n\t\t/*\n\t\t\tpoint WCID MAC table to 0x1800\n\t\t\tThis is for debug.\n\t\t\tBut HDR_TRANS doesn't work if you remove it.\n\t\t\tCheck after IC formal release.\n\t\t*/\n\t\tregValue |= 0x18000000;\n\t\tRTMP_IO_WRITE32(pAd, HT_MAC_BSSID_DW1, regValue);\n#endif /* HDR_TRANS_SUPPORT */\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\"!4 OpStatusFlags = %lx. CentralChannel = %d. Channel\t= %d. !!! \\n\", pAd->CommonCfg.OpStatusFlags,pAd->CommonCfg.CentralChannel,pAd->CommonCfg.Channel));\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tModify P2P's listen channel when in Concurrent Operation to get better performance. \n\t\tCan be called from LinkUp and LinkDown;\n\t\t\n\tParameters: \n\t\t \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pScanChannelDefault(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/* Default listen channel is based on spec, using Social channels 1, 6, 11. */\n\tpAd->P2pCfg.P2pProprietary.ListenChanel[0] = 1;\n\tpAd->P2pCfg.P2pProprietary.ListenChanel[1] = 6;\n\tpAd->P2pCfg.P2pProprietary.ListenChanel[2] = 11;\n\tpAd->P2pCfg.P2pProprietary.ListenChanelIndex = 0;\n\tpAd->P2pCfg.P2pProprietary.ListenChanelCount = 3;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s <=== count = %d, Channels are %d, %d,%d separately   \\n\", \n\t\t__FUNCTION__, pAd->P2pCfg.P2pProprietary.ListenChanelCount, pAd->P2pCfg.P2pProprietary.ListenChanel[0], pAd->P2pCfg.P2pProprietary.ListenChanel[1], pAd->P2pCfg.P2pProprietary.ListenChanel[2]));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tIf.\n\n\tArguments:\n\t\t    - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tFALSE - None of channel in ChannelList Match any channel in pAd->ChannelList[] array\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t========================================================================\n\n*/\nBOOLEAN P2pCheckChannelList(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpChannelList)\n{\n\tUCHAR\t\ti, k;\n\tUCHAR\t\tNumOfDismatch = 0;\n\t\n\t/* Check if new (control) channel is in our channellist which we currently agree to operate in. */\n\tfor (k = 0;k < MAX_NUM_OF_CHANNELS;k++)\n\t{\n\t\tif (*(pChannelList + k) == 0)\n\t\t\tbreak;\n\t\t\n\t\tfor (i = 0;i < pAd->ChannelListNum;i++)\n\t\t{\n\t\t\tif (pAd->ChannelList[i].Channel == *(pChannelList + k))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ( i == pAd->ChannelListNum)\n\t\t\tNumOfDismatch++;\t\t\t\n\t}\n\n\tif ((NumOfDismatch == k) && (k != 0))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - no common channel = %d...\\n\", *pChannelList));\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine check whether we need to check this frame's transmission result. Success ? or Retry fail?.\n\t\tIf found retry fail, we may need to resend this frame again. \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pAckRequiredCheck(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PP2P_PUBLIC_FRAME\tpFrame,\n\tOUT \t\tUCHAR\t*TempPid)\n{\n\t\tUCHAR\t\t\t\tEAPHEAD[8] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8e};\n\t\tPUCHAR\t\tpDest;\n\t\tPFRAME_P2P_ACTION\t\tpP2pActFrame;\n\t\tPUCHAR pP2pOUI = (PUCHAR) pFrame;\n\n\t\tpP2pOUI += (sizeof(HEADER_802_11) + 2);\n\t\n\t\tpP2pActFrame = (PFRAME_P2P_ACTION)pFrame;\n\t\t/* check Go Neg Confirm Frame. */\n\t\tif ((pFrame->Subtype == GO_NEGOCIATION_CONFIRM) && \n\t\t\t(NdisEqualMemory(pP2pOUI, P2POUIBYTE, 4)) && \n\t\t\t(pFrame->Action == ACTION_WIFI_DIRECT) && \n\t\t\t(pFrame->Category == CATEGORY_PUBLIC))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pAckRequiredCheck --> This is a Confirm Frame. Pid = RequireACK !!!\\n\"));\n\t\t\t*TempPid = 0x7; /* PID_REQUIRE_ACK */\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* check Intivation Response. */\n\t\tif ((pFrame->Subtype == P2P_INVITE_RSP) && \n\t\t\t(NdisEqualMemory(pP2pOUI, P2POUIBYTE, 4)) && \n\t\t\t(pFrame->Action == ACTION_WIFI_DIRECT) && \n\t\t\t(pFrame->Category == CATEGORY_PUBLIC))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pAckRequiredCheck --> This is a Invite Rsp Frame. Pid = RequireACK !!!\\n\"));\n\t\t\t*TempPid = 0x7; /* PID_REQUIRE_ACK */\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ((pP2pActFrame->Category == 0x7F/*MT2_ACT_VENDOR*/) \n\t\t\t&& (pP2pActFrame->OUISubType == P2PACT_GO_DISCOVER_REQ) \n\t\t\t&& (pP2pActFrame->OUIType == 0x9))\t\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pAckRequiredCheck --> This is a GO Discoverbility. Pid = RequireACK !!!\\n\"));\n\t\t\t*TempPid = 0x7; /* PID_REQUIRE_ACK */\n\t\t\treturn;\n\t\t}\n\t\t/* As Go, need to check EAP fail's ACK */\n\t\tif ((IS_P2P_REGISTRA(pAd)) && (pFrame->p80211Header.FC.Type == BTYPE_DATA))\n\t\t{\n\t\t\tpDest = &pFrame->Category;\n\t\t\tif (NdisEqualMemory(EAPHEAD, pDest, 8))\n\t\t\t{\n\t\t\t\tpDest += 8;\n\t\t\t\tif ((*pDest == EAPOL_VER) && (*(pDest+1) == EAPPacket) && (*(pDest + 3) == EAP_CODE_FAIL))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pAckRequiredCheck --> This is a EAP FailFrame.\tPid = RequireACK!!!\\n\"));\n\t\t\t\t\t*TempPid = 0x7; /* PID_REQUIRE_ACK */\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t}\n\n}\n\nBOOLEAN IsP2pFirstMacSmaller(\n\tIN PUCHAR\t\tFirststaddr,\n\tIN PUCHAR\t\tSecondAddr)\n{\n\tUCHAR\t\ti;\n\tfor (i=0 ; i< 6;i++)\n\t{\n\t\tif (*(Firststaddr+i) > *(SecondAddr+i))\n\t\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tInitial Listen interval for Listen Timer\n\tReturn:\n\t\tVOID\n\tNOTE:\n\t==========================================================================\n*/\nVOID\tP2PInitListenTimer(\n\tIN PRTMP_ADAPTER\tpAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---- %s\\n\", __FUNCTION__));\n\tpP2PCtrl->P2pCounter.bListen = FALSE;\n\tpP2PCtrl->P2pCounter.ListenInterval = 0;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tSet Listen interval for Listen Timer\n\tReturn:\n\t\tVOID\n\tNOTE:\n\t==========================================================================\n*/\nVOID\tP2PSetListenTimer(\n\tIN PRTMP_ADAPTER\tpAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tif ((pP2PCtrl->P2pCounter.bStartScan == TRUE) && (pP2PCtrl->P2pCounter.bListen == FALSE))\n\t{\n\t\t/* update Discovery State Machine state. */\n\t\tif (pP2PCtrl->P2pCounter.bStartScan)\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_LISTEN_CMD_EVT, 0, NULL, 0);\n\t}\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tListen State Timer Handler \n\tReturn:\n\t\tVOID\n\tNOTE:\n\t==========================================================================\n*/\nVOID\tP2PListenTimerExec(\n\tIN PRTMP_ADAPTER\tpAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tpP2PCtrl->P2pCounter.bListen = FALSE;\n\n\tif (pP2PCtrl->P2pCounter.bStartScan == TRUE)\n\t{\n\t/* Listen interval has expired, go to Search state. */\n\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_SEARCH_CMD_EVT, 0, NULL, 0);\n}\n\telse\n\t{\n\t\t/* Listen interval has expired, go to IDLE state. */\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);\n\n\t\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\tpAd->MlmeAux.AutoReconnectSsidLen = (UCHAR)pAd->CommonCfg.SsidLen;\n\t}\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tInitial Next Scan Round for Scan Timer\n\tReturn:\n\t\tVOID\n\tNOTE:\n\t==========================================================================\n*/\nVOID\tP2PInitNextScanTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---- %s\\n\", __FUNCTION__));\n\tpP2PCtrl->P2pCounter.bNextScan = FALSE;\n\tpP2PCtrl->P2pCounter.NextScanRound = 0xffffffff;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tSet Next Scan Round for Scan Timer\n\tReturn:\n\t\tVOID\n\tNOTE:\n\t==========================================================================\n*/\nVOID\tP2PSetNextScanTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tif ((pP2PCtrl->P2pCounter.bStartScan == TRUE) && (pP2PCtrl->P2pCounter.bNextScan == FALSE))\n\t{\n\t\tpP2PCtrl->P2pCounter.bNextScan = TRUE;\n\t\tif (value)\n\t\t\tpP2PCtrl->P2pCounter.NextScanRound = value;\n\t\telse\n\t\t\tpP2PCtrl->P2pCounter.NextScanRound = (RandomByte(pAd) % P2P_RANDOM_BASE) + P2P_RANDOM_BIAS;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: NextScanRound - %ld\\n\", __FUNCTION__, pP2PCtrl->P2pCounter.NextScanRound));\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tNext Scan Round Timer Handler \n\tReturn:\n\t\tVOID\n\tNOTE:\n\t==========================================================================\n*/\nVOID\tP2PNextScanTimerExec(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tpP2PCtrl->P2pCounter.bNextScan = FALSE;\n\tMlmeEnqueue(pAd, P2P_CTRL_STATE_MACHINE, P2P_CTRL_DISC_EVT, 0, NULL, 0);\n}\n\nVOID\tP2PInitDevDiscTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tpP2PCtrl->P2pCounter.bStartScan = FALSE;\n\tpP2PCtrl->P2pCounter.CounterAftrScanButton = 0xffffffff;\n}\n\nVOID\tP2PSetDevDiscTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tif (pP2PCtrl->P2pCounter.bStartScan == FALSE)\n\t{\n\t\tpP2PCtrl->P2pCounter.bStartScan = TRUE;\n\t\tpP2PCtrl->P2pCounter.CounterAftrScanButton = pP2PCtrl->DevDiscPeriod;\n\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t\tpP2PCtrl->P2pCounter.CounterAftrScanButton = 200;\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: CounterAftrScanButton = %lu.\\n\", __FUNCTION__, pP2PCtrl->P2pCounter.CounterAftrScanButton));\n\t}\n}\n\nVOID\tP2PDevDiscTimerExec(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tpP2PCtrl->P2pCounter.bStartScan = FALSE;\n\tMlmeEnqueue(pAd, P2P_CTRL_STATE_MACHINE, P2P_CTRL_DISC_DONE_EVT, 0, NULL, 1);\n}\n\nVOID P2P_SetWscRule(\n\tIN PRTMP_ADAPTER pAd,\n\tUCHAR\tindex,\n\tPUSHORT PeerWscMethod)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[index];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Peer Dpid = %s.    My Dpid = %s.\\n\", __FUNCTION__, decodeDpid(pP2pEntry->Dpid), decodeDpid(pP2PCtrl->Dpid)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Peer Config Method = %s.    My Config Method = %s.\\n\", __FUNCTION__, decodeConfigMethod(pP2pEntry->ConfigMethod), decodeConfigMethod(pP2PCtrl->ConfigMethod)));\n\n\tif (pP2PCtrl->Dpid == DEV_PASS_ID_NOSPEC)\n\t{\n\t\tif ((pP2pEntry->ConfigMethod == WSC_CONFMET_KEYPAD) || (pP2pEntry->Dpid == DEV_PASS_ID_USER))\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_DISPLAY;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_REG;\n\t\t\t*PeerWscMethod = WSC_CONFMET_KEYPAD;\n\t\t}\n\t\telse if ((pP2pEntry->ConfigMethod == WSC_CONFMET_DISPLAY) || (pP2pEntry->Dpid == DEV_PASS_ID_REG))\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_KEYPAD;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_USER;\n\t\t\t*PeerWscMethod = WSC_CONFMET_DISPLAY;\n\t\t}\n#ifdef HE_BD_SUPPORT    //select PBC, if config_method not only one case and PBC is one of the config_method\n\t\telse if (((pP2pEntry->ConfigMethod & WSC_CONFMET_PBC) == WSC_CONFMET_PBC) || (pP2pEntry->Dpid == DEV_PASS_ID_PBC))\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PBC_MODE;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_PBC;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_PBC;\n\t\t\t*PeerWscMethod = WSC_CONFMET_PBC;\n\t\t}\n#else\n\t\telse if ((pP2pEntry->ConfigMethod == WSC_CONFMET_PBC) || (pP2pEntry->Dpid == DEV_PASS_ID_PBC))\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PBC_MODE;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_PBC;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_PBC;\n\t\t\t*PeerWscMethod = WSC_CONFMET_PBC;\n\t\t}\n#endif\t\t\n\t\telse\n\t\t{\n\t\t\tif ((pP2pEntry->Rule == P2P_IS_CLIENT) && (pP2PCtrl->Rule == P2P_IS_GO))\n\t\t\t{\n\t\t\t\t/* I'm Registrar and Enter PIN. */\n\t\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_KEYPAD;\n\t\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_USER;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* I'm Enrollee and Use Default Config Method. */\n\t\t\t\tif (pP2PCtrl->DefaultConfigMethod == P2P_REG_CM_DISPLAY)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_DISPLAY;\n\t\t\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_REG;\n\t\t\t\t\t*PeerWscMethod = WSC_CONFMET_KEYPAD;\n\t\t\t\t}\n\t\t\t\telse if (pP2PCtrl->DefaultConfigMethod == P2P_REG_CM_KEYPAD)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_KEYPAD;\n\t\t\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_USER;\n\t\t\t\t\t*PeerWscMethod = WSC_CONFMET_DISPLAY;\n\t\t\t\t}\n\t\t\t\telse if (pP2PCtrl->DefaultConfigMethod == P2P_REG_CM_PBC)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->WscMode = WSC_PBC_MODE;\n\t\t\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_PBC;\n\t\t\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_PBC;\n\t\t\t\t\t*PeerWscMethod = WSC_CONFMET_PBC;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"My P2P Wsc Configuration:\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscMode = %d.    WscConfigMethod = %s.    WscDpid = %s.\\n\", pP2PCtrl->WscMode, decodeConfigMethod(pP2PCtrl->ConfigMethod), decodeDpid(pP2PCtrl->Dpid)));\n\tif (pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t{\n\t\t/*\n\t\t\tAlthough driver uses different structure for P2P GO and P2P CLI but PIN shall be the same.\n\t\t*/\n\t\tpAd->ApCfg.MBSSID[0].WscControl.WscEnrolleePinCode = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode;\n\t\tpAd->ApCfg.MBSSID[0].WscControl.WscEnrolleePinCodeLen = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCodeLen;\n\t\t\n\t\t/* Woody 1: Show PIN Code */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *************************************************\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *                                               *\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *       PIN Code = %08u                     *\\n\", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *                                               *\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *************************************************\\n\"));\n\t\t{\n/*\n\t\t\t\t\tRtmpOSWrielessEventSendExt(pAd->net_dev, RT_WLAN_EVENT_SHOWPIN, -1, pP2pEntry->addr,\n\t\t\t\t\t\tNULL, 0, 0);\n*/\n\t}\n\t}\n\telse if (pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t{\n\t\t/* Woody 2: Enter PIN Code */\n\t\t{\n/*\n\t\t\t\t\tRtmpOSWrielessEventSendExt(pAd->net_dev, RT_WLAN_EVENT_PIN, -1, pP2pEntry->addr,\n\t\t\t\t\t\tNULL, 0, 0);\n*/\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Peer P2P Wsc Configuration:\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscMode = %d.    WscConfigMethod = %s.    WscDpid = %s.\\n\", pP2pEntry->WscMode, decodeConfigMethod(pP2pEntry->ConfigMethod), decodeDpid(pP2pEntry->Dpid)));\t\n\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdecode Dpid \n\tReturn:\n\t\tState string\n\tNOTE:\n\t==========================================================================\n*/\n PSTRING decodeDpid (USHORT dpid)\n{\n\tPSTRING retval = \"                                 \";\n\tswitch (dpid) \n\t{\n\t\tcase DEV_PASS_ID_PIN:\t\t\t\tretval = \"DEV_PASS_ID_PIN    \";\t\t\t\t\tbreak;\n\t\tcase DEV_PASS_ID_USER:\t\t\t\tretval = \"DEV_PASS_ID_USER_SPECIFIED\";\t\t\tbreak;\n\t\tcase DEV_PASS_ID_REG:\t\t\t\tretval = \"DEV_PASS_ID_REGISTRA_SPECIFIED\";\t\tbreak;\n\t\tcase DEV_PASS_ID_PBC:\t\t\t\tretval = \"DEV_PASS_ID_PBC\";\t\t\t\t\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\tretval = \"***UNKNOWN dpid***\";\n\t}\n\treturn(retval);\n\n}\n/* \n\t==========================================================================\n\tDescription:\n\t\tdecode ConfigMethod\n\tReturn:\n\t\tState string\n\tNOTE:\n\t==========================================================================\n*/\nPSTRING ddecodeConfigMethod (USHORT ConfigMethos)\n{\n\tPSTRING retval = \"                                 \";\n\tULONG\t\tmm[4], i;\n\tmm[0] = 0;\n\tmm[1] = 0;\n\tmm[2] = 0;\n\tmm[3] = 0;\n\tif ((ConfigMethos & WSC_CONFMET_LABEL) != 0)\n\t\tmm[0] = 1;\n\tif ((ConfigMethos & WSC_CONFMET_DISPLAY) != 0)\n\t\tmm[1] = 1;\n\tif ((ConfigMethos & WSC_CONFMET_KEYPAD) != 0)\n\t\tmm[2] = 1;\n\tif ((ConfigMethos & WSC_CONFMET_PBC) != 0)\n\t\tmm[3] = 1;\n\tfor ( i = 0;i < 4;i++)\n\t{\n\t}\n\treturn (retval);\n}\n\nPSTRING decodeMyRule (USHORT Rule)\n{\n\tPSTRING retval = \"                                                  \";\n\tswitch (Rule) \n\t{\n\t\tcase P2P_IS_CLIENT:\t\t\t\t\t\tretval = \"I am P2P Client\";\t\t\t\tbreak;\n\t\tcase P2P_IS_GO:\t\t\t\t\t\t\tretval = \"I am P2P GO\";\t\t\t\t\tbreak;\n\t\tcase P2P_IS_DEVICE:\t\t\t\t\t\tretval = \"I am P2P Device\";\t\t\t\tbreak;\n\t\tcase P2P_IS_CLIENT_IN_GROUP:\t\t\t\tretval = \"I am P2P Client in Group\";\t\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\tretval = \"***  Unknown Rule ***\";\n\t}\n\treturn(retval);\n}\n\nPSTRING decodeConfigMethod (USHORT ConfigMethos)\n{\n\tPSTRING retval = \"                                                  \";\n\tswitch (ConfigMethos) \n\t{\n\t\tcase WSC_CONFMET_LABEL:\t\t\t\tretval = \"LABEL  LABEL \";\t\tbreak;\n\t\tcase WSC_CONFMET_DISPLAY:\t\t\t\tretval = \"DISPLAY  DISPLAY\";\tbreak;\n\t\tcase WSC_CONFMET_KEYPAD:\t\t\t\tretval = \"KEYPAD  KEYPAD\";\t\tbreak;\n\t\tcase WSC_CONFMET_PBC:\t\t\t\t\tretval = \"PBC   PBC\";\t\t\tbreak;\n\t\tcase WSC_CONFMET_DISPLAY | WSC_CONFMET_KEYPAD:\t\tretval = \"DISPLAY  KEYPAD\";\t\tbreak;\n\t\tcase WSC_CONFMET_DISPLAY | WSC_CONFMET_PBC:\t\tretval = \"DISPLAY  PBC\";\t\tbreak;\n\t\tcase WSC_CONFMET_KEYPAD | WSC_CONFMET_PBC:\t\tretval = \"KEYPAD  PBC\";\t\t\tbreak;\n\t\tcase WSC_CONFMET_DISPLAY | WSC_CONFMET_KEYPAD | WSC_CONFMET_PBC:\tretval = \"DISPLAY  KEYPAD  PBC\";\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\tretval = \"***Multiple ConfigMethod***\";\n\t}\n\treturn(retval);\n}\n\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdecode P2P state\n\tReturn:\n\t\tState string\n\tNOTE:\n\t==========================================================================\n*/\n PSTRING decodeP2PState (UCHAR P2pState)\n{\n\tPSTRING retval = \"                                                                       \";\n\tswitch (P2pState) {\n\t\tcase P2P_CONNECT_IDLE:\t\t\t\t\tretval = \"P2P_CONNECT_IDLE\";\t\t\t\tbreak;\n\t\tcase P2P_ANY_IN_FORMATION_AS_CLIENT:\tretval = \"GroupForming as Client\";\t\t\tbreak;\n\t\tcase P2P_ANY_IN_FORMATION_AS_GO:\t\tretval = \"P2P_ANY_IN_FORMATION_AS_GO\";\tbreak;\n\t\tcase P2P_DO_GO_NEG_DONE_CLIENT:\t\tretval = \"P2P_DO_GO_NEG_DONE_CLIENT\";\t\tbreak;\n\t\tcase P2P_DO_GO_SCAN_BEGIN:\t\t\t\tretval = \"P2P_DO_GO_SCAN_BEGIN\";\t\t\tbreak;\n\t\tcase P2P_DO_GO_SCAN_DONE:\t\t\t\tretval = \"P2P_DO_GO_SCAN_DONE\";\t\t\tbreak;\n\t\tcase P2P_WPS_REGISTRA:\t\t\t\t\tretval = \"P2P_WPS_REGISTRA\";\t\t\t\tbreak;\n\t\tcase P2P_DO_WPS_ENROLLEE:\t\t\t\tretval = \"P2P_DO_WPS_ENROLLEE\";\t\t\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\tretval = \"***UNKNOWN state***\";\n\t}\n\treturn(retval);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdecode P2P client state\n\tReturn:\n\t\tState string\n\tNOTE:\n\t==========================================================================\n*/\n PSTRING decodeP2PClientState (P2P_CLIENT_STATE P2pClientState)\n{\n    PSTRING retval = \"                                                                        \";\n    switch (P2pClientState) {\n\t\tcase P2PSTATE_NONE:\t\t\t\t\t\t\tretval = \"P2PSTATE_NONE\";\t\t\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_DISCOVERY:\t\t\t\t\tretval = \"P2PSTATE_DISCOVERY\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_DISCOVERY_CLIENT:\t\t\t\tretval = \"P2PSTATE_DISCOVERY_CLIENT\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_DISCOVERY_GO:\t\t\t\tretval = \"P2PSTATE_DISCOVERY_GO\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_DISCO_COMMAND:\t\tretval = \"P2PSTATE_CLIENT_DISCO_COMMAND\";\t\tbreak;\n\t\tcase P2PSTATE_GO_DISCO_COMMAND:\t             retval = \"P2PSTATE_GO_DISCO_COMMAND\";\t\t\tbreak;\n\t\tcase P2PSTATE_PROVISION_COMMAND:\t             retval = \"P2PSTATE_PROVISION_COMMAND\";\t\t\tbreak;\n\t\tcase P2PSTATE_SERVICE_DISCOVER_INIT_COMMAND:\t\tretval = \"P2PSTATE_SERVICE_DISCOVER_INIT_COMMAND\";\t\tbreak;\n\t\tcase P2PSTATE_SERVICE_COMEBACK_COMMAND:\t\tretval = \"P2PSTATE_SERVICE_COMEBACK_COMMAND\";\tbreak;\n\t\tcase P2PSTATE_INVITE_COMMAND:\t\t\t\tretval = \"P2PSTATE_INVITE_COMMAND\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_CONNECT_COMMAND:\t\t\tretval = \"P2PSTATE_CONNECT_COMMAND\";\t\t\tbreak;\n\t\tcase P2PSTATE_SENT_INVITE_REQ:\t\t\t\tretval = \"P2PSTATE_SENT_INVITE_REQ\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_SENT_GO_NEG_REQ:\t\t\t\tretval = \"P2PSTATE_SENT_GO_NEG_REQ\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_WAIT_GO_COMFIRM:\t\t\t\tretval = \"P2PSTATE_WAIT_GO_COMFIRM\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_WAIT_GO_COMFIRM_ACK:\t\tretval = \"P2PSTATE_WAIT_GO_COMFIRM_ACK\";\t\t\tbreak;\n\t\tcase P2PSTATE_GO_COMFIRM_ACK_SUCCESS:\t\tretval = \"P2PSTATE_GO_COMFIRM_ACK_SUCCESS\";\t\tbreak;\n\t\tcase P2PSTATE_WAIT_GO_DISCO_ACK:\t\t\tretval = \"P2PSTATE_WAIT_GO_DISCO_ACK\";\t\t\tbreak;\n\t\tcase P2PSTATE_WAIT_GO_DISCO_ACK_SUCCESS:\tretval = \"P2PSTATE_WAIT_GO_DISCO_ACK_SUCCESS\";\tbreak;\n\t\tcase P2PSTATE_GO_WPS:\t\t\t\t\t\tretval = \"P2PSTATE_GO_WPS\";\t\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_GO_AUTH:\t\t\t\t\t\tretval = \"P2PSTATE_GO_AUTH\";\t\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_GO_ASSOC:\t\t\t\t\tretval = \"P2PSTATE_GO_ASSOC\";\t\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_WPS:\t\t\t\t\tretval = \"P2PSTATE_CLIENT_WPS\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_WPS_DONE:\t\t\t\tretval = \"P2PSTATE_CLIENT_WPS_DONE\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_AUTH:\t\t\t\t\tretval = \"P2PSTATE_CLIENT_AUTH\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_ASSOC:\t\t\t\t\tretval = \"P2PSTATE_CLIENT_ASSOC\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_OPERATING:\t\t\t\tretval = \"P2PSTATE_CLIENT_OPERATING\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_ABSENCE:\t\t\t\tretval = \"P2PSTATE_CLIENT_ABSENCE\";\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_SCAN:\t\t\t\t\tretval = \"P2PSTATE_CLIENT_SCAN\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_CLIENT_FIND:\t\t\t\t\tretval = \"P2PSTATE_CLIENT_FIND\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_GO_OPERATING:\t\t\t\t\tretval = \"P2PSTATE_GO_OPERATING\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_GO_ABSENCE:\t\t\t\t\tretval = \"P2PSTATE_GO_ABSENCE\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_GO_SCAN:\t\t\t\t\t\tretval = \"P2PSTATE_GO_SCAN\";\t\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_GO_FIND:\t\t\t\t\t\tretval = \"P2PSTATE_GO_FIND\";\t\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_NONP2P_WPS:\t\t\t\t\tretval = \"P2PSTATE_NONP2P_WPS\";\t\t\t\t\tbreak;\n\t\tcase P2PSTATE_NONP2P_PSK:\t\t\t\t\tretval = \"P2PSTATE_NONP2P_PSK\";\t\t\t\t\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\t\tretval = \"***UNKNOWN state***\";\n    }\n    return(retval);\n\n}\n\nPSTRING decodeCtrlState (UCHAR State)\n{\n\tPSTRING retval = \"                                                  \";\n\tswitch (State) \n\t{\n\t\tcase P2P_CTRL_IDLE:\t\t\t\t\t\t\tretval = \"P2P_CTRL_IDLE\";\t\t\t\t\tbreak;\n\t\tcase P2P_CTRL_DISCOVERY:\t\t\t\t\tretval = \"P2P_CTRL_DISCOVERY\";\t\t\t\tbreak;\n\t\tcase P2P_CTRL_GROUP_FORMATION:\t\t\t\tretval = \"P2P_CTRL_GROUP_FORMATION\";\t\tbreak;\n\t\tcase P2P_CTRL_DONE:\t\t\t\t\t\t\tretval = \"P2P_CTRL_DONE\";\t\t\t\t\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\t\tretval = \"***Unknown CTRL State***\";\n\t}\n\treturn(retval);\n}\n\nPSTRING decodeDiscoveryState (UCHAR State)\n{\n\tPSTRING retval = \"                                                  \";\n\tswitch (State) \n\t{\n\t\tcase P2P_DISC_IDLE:\t\t\t\t\t\t\tretval = \"P2P_DISC_IDLE\";\t\t\t\t\tbreak;\n\t\tcase P2P_DISC_SCAN:\t\t\t\t\t\t\tretval = \"P2P_DISC_SCAN\";\t\t\t\t\tbreak;\n\t\tcase P2P_DISC_LISTEN:\t\t\t\t\t\tretval = \"P2P_DISC_LISTEN\";\t\t\t\tbreak;\n\t\tcase P2P_DISC_SEARCH:\t\t\t\t\t\tretval = \"P2P_DISC_SEARCH\";\t\t\t\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\t\tretval = \"***Unknown Device Discovery State***\";\n\t}\n\treturn(retval);\n}\n\nPSTRING decodeGroupFormationState (UCHAR State)\n{\n\tPSTRING retval = \"                                                  \";\n\tswitch (State) \n\t{\n\t\tcase P2P_GO_FORM_IDLE:\t\t\t\t\t\tretval = \"P2P_GO_FORM_IDLE\";\t\t\t\tbreak;\n\t\tcase P2P_WAIT_GO_FORM_RSP:\t\t\t\t\tretval = \"P2P_WAIT_GO_FORM_RSP\";\t\t\tbreak;\n\t\tcase P2P_WAIT_GO_FORM_CONF:\t\t\t\tretval = \"P2P_WAIT_GO_FORM_CONF\";\t\tbreak;\n\t\tcase P2P_GO_FORM_DONE:\t\t\t\t\t\tretval = \"P2P_GO_FORM_DONE\";\t\t\t\tbreak;\n\t\tcase P2P_GO_FORM_PROV:\t\t\t\t\t\tretval = \"P2P_GO_FORM_PROV\";\t\t\t\tbreak;\n\t\tcase P2P_GO_FORM_INVITE:\t\t\t\t\tretval = \"P2P_GO_FORM_INVITE\";\t\t\t\tbreak;\n\t\tcase P2P_WAIT_GO_FORM_INVITE_RSP:\t\t\tretval = \"P2P_WAIT_GO_FORM_INVITE_RSP\";\tbreak;\n\t\tdefault:\t\t\t\t\t\t\t\t\t\tretval = \"***Unknown Group Formation State***\";\n\t}\n\treturn(retval);\n}\n\nVOID decodeDeviceCap (UCHAR State)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"                         DeviceCapability = %x.\\n\", State));\n\tif (State & DEVCAP_SD)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [0] bServiceDiscovery\\n\"));\n\tif (State & DEVCAP_CLIENT_DISCOVER)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [1] bP2PClientDiscoverability\\n\"));\n\tif (State & DEVCAP_CLIENT_CONCURRENT)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [2] bConcurrentOperation\\n\"));\n\tif (State & DEVCAP_INFRA_MANAGED)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [3] bP2PInfrastructureManaged\\n\"));\n\tif (State & DEVCAP_DEVICE_LIMIT)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [4] bP2PDeviceLimit\\n\"));\n\tif (State & DEVCAP_INVITE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [5] bP2PInvitationProcedure\\n\"));\n}\n\nVOID decodeGroupCap (UCHAR State)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"                         GroupCapability = %x.\\n\", State));\n\tif (State & GRPCAP_OWNER)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [0] bP2PGroupOwner\\n\"));\n\tif (State & GRPCAP_PERSISTENT)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [1] bPersistentP2PGroup\\n\"));\n\tif (State & GRPCAP_LIMIT)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [2] bP2PGroupLimit\\n\"));\n\tif (State & GRPCAP_INTRA_BSS)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [3] bIntra-BssDistribution\\n\"));\n\tif (State & GRPCAP_CROSS_CONNECT)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [4] bCrossConnection\\n\"));\n\tif (State & GRPCAP_PERSISTENT_RECONNECT)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [5] bPersistentReconnect\\n\"));\n\tif (State & GRPCAP_GROUP_FORMING)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                             [6] bGroupFormation\\n\"));\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdebug print function for P2P.\n\tReturn:\n\n\tNOTE:\n\t\t \n\t==========================================================================\n*/\nVOID P2PPrintMac(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\tmacindex)\n{\n\tMAC_TABLE_ENTRY *pEntry;\n\t \n\tDBGPRINT(RT_DEBUG_TRACE, (\" ====================================================>P2PPrintMac i = %d,   \\n\", macindex));\n\tpEntry = &pAd->MacTab.Content[macindex];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!! ,  HTMode = %x, WepStatus = %d, AuthMode = %d. \\n\", pEntry->HTPhyMode.word, pEntry->WepStatus, pEntry->AuthMode));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ValidAsCLI = %d. ClientStatusFlags = %lx, \\n\", IS_ENTRY_CLIENT(pEntry), pEntry->ClientStatusFlags));\n#ifdef RELEASE_EXLCUDE\n\t\t/* MAC_TABLE_ENTRY don't have P2pInfo, skip this. */\n#endif /* RELEASE_EXCLUDE */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"devaddr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pEntry->Addr)));\n#ifdef RELEASE_EXLCUDE\n\t/* MAC_TABLE_ENTRY don't have P2pInfo, skip this. */\n#endif /* RELEASE_EXCLUDE */\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdebug print function for P2P Table entry.\n\tReturn:\n\n\tNOTE:\n\t\t \n\t==========================================================================\n*/\nVOID P2PPrintP2PEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tp2pindex)\n{\n\tPRT_P2P_CLIENT_ENTRY pClient = NULL;\n\n\n\tif (p2pindex >= MAX_P2P_GROUP_SIZE)\n\t\treturn;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: p2p Entry idx = %d\\n\", __FUNCTION__, p2pindex));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====================================================>\\n\"));\n\tpClient = &pAd->P2pTable.Client[p2pindex];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pClientState = %s  \\n\", decodeP2PClientState(pClient->P2pClientState)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ConfigMethod = %x.    %s \\n\", pClient->ConfigMethod, decodeConfigMethod(pClient->ConfigMethod)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Opchannel = %d.    Listenchannel = %d.\\n\", pClient->OpChannel, pClient->ListenChannel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MyGOIndex = %d. rule = %s.\\n\", pClient->MyGOIndex, decodeMyRule(pClient->Rule)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pClient->addr)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"bssid =   %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pClient->bssid)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"interface addr =   %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pClient->InterfaceAddr)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"DeviceType = %02x %02x %02x %02x %02x %02x %02x %02x\\n\", pClient->PrimaryDevType[0], pClient->PrimaryDevType[1], pClient->PrimaryDevType[2],pClient->PrimaryDevType[3],pClient->PrimaryDevType[4],pClient->PrimaryDevType[5],pClient->PrimaryDevType[6],pClient->PrimaryDevType[7]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"NumSecondaryType = %x.    RegClass = %x.    ConfigTimeOut = %x. \\n\", pClient->NumSecondaryType, pClient->RegClass, pClient->ConfigTimeOut));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"DeviceName[%ld] = %s\\n\", pClient->DeviceNameLen, pAd->P2pTable.Client[p2pindex].DeviceName));\n\tdecodeDeviceCap(pClient->DevCapability);\n\tdecodeGroupCap(pClient->GroupCapability);\n#ifdef WFD_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WFD Device = %d.\\n\", pClient->WfdEntryInfo.bWfdClient));\n\tif (pClient->WfdEntryInfo.bWfdClient)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DeviceType = %d.    RTSP_Port = %d.    MaxThroughput=%d.\\n\", \n\t\t\t\tpClient->WfdEntryInfo.wfd_devive_type, pClient->WfdEntryInfo.rtsp_port, pClient->WfdEntryInfo.max_throughput));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SessionAvail = %d.    PC = %d\\n\", \n\t\t\t\tpClient->WfdEntryInfo.session_avail, pClient->WfdEntryInfo.wfd_PC));\n\t}\n#endif /* WFD_SUPPORT */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<====================================================\\n\\n\"));\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdebug print function for P2P Persistent Table entry.\n\tReturn:\n\n\tNOTE:\n\t\t \n\t==========================================================================\n*/\nVOID P2PPrintP2PPerstEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tp2pindex)\n{\n\tRT_P2P_PERSISTENT_ENTRY *pClient;\n\n\tif (p2pindex >= MAX_P2P_TABLE_SIZE)\n\t\treturn;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\" P2PPrintP2PPerstEntry i = %d,   \\n\", p2pindex));\n\tpClient = &pAd->P2pTable.PerstEntry[p2pindex];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\",  PRINT_MAC(pClient->Addr)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Key = %x %x %x %x %x %x %x %x\\n\", pClient->Profile.Key[0], pClient->Profile.Key[1], pClient->Profile.Key[2],pClient->Profile.Key[3],pClient->Profile.Key[4],pClient->Profile.Key[5],pClient->Profile.Key[6],pClient->Profile.Key[7]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacAddr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pClient->Profile.MacAddr)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Ssid %d = DIRECT-%c%c%c%c%c%c\\n\", pClient->Profile.SSID.SsidLength,pClient->Profile.SSID.Ssid[7], pClient->Profile.SSID.Ssid[8], pClient->Profile.SSID.Ssid[9],pClient->Profile.SSID.Ssid[10],pClient->Profile.SSID.Ssid[11],pClient->Profile.SSID.Ssid[12]));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MyRule = %x, bValid = %x,    \\n\", pClient->MyRule, pClient->bValid));\n\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tdebug print function for P2P.\n\tReturn:\n\n\tNOTE:\n\t\t \n\t==========================================================================\n*/\n\nVOID P2P_GoStartUp(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN INT         \tbssidx)\n{\n\tUINT32 rx_filter_flag;\n\tINT idx;\n\tULONG\t\toffset;\n#ifdef INF_AMAZON_SE\n\tULONG i;\n#endif /* INF_AMAZON_SE */\n\tBOOLEAN\t\tbWmmCapable = FALSE;\n\tBOOLEAN\t\tTxPreamble, SpectrumMgmt = FALSE;\n\tUCHAR\t\tBBPR1 = 0, BBPR3 = 0;\n\tUINT32\t\tValue = 0;\n#ifdef DOT1X_SUPPORT\n/*\tBOOLEAN\t\tbDot1xReload = FALSE; */\n#endif /* DOT1X_SUPPORT */\n\tBOOLEAN Cancelled;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> P2P_GoStartUp\\n\"));\n\n\t/*RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); */\n\t/*pAd->MlmeAux.Channel = 0; */\n\t/*ScanNextChannel(pAd, OPMODE_STA); */\n\n\n\tpAd->P2pCfg.P2pCapability[1] |= GRPCAP_OWNER;\n\tpAd->StaCfg.bAutoReconnect = FALSE;\n\tpAd->ApCfg.MBSSID[0].UapsdInfo.bAPSDCapable = TRUE;\n\tpAd->P2pCfg.bSentProbeRSP = TRUE;\n\t/*pAd->P2pCfg.DiscCurrentState = P2P_DISC_LISTEN;*/\n\n\t/* Stop Scan. */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\tpAd->MlmeAux.Channel = 0;\n\tScanNextChannel(pAd, OPMODE_STA);\n\t}\n\n\trx_filter_flag = APNORMAL;\n\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);     /* enable RX of DMA block */\n\n\tpAd->ApCfg.BssidNum = 1;\n\tpAd->MacTab.MsduLifeTime = 20; /* default 5 seconds */\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE;\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].StationKeepAliveTime = 3;\n\n\t/*OPSTATUS_SET_FLAG(pAd, fOP_STATUS_P2P_GO); */\n\tpAd->flg_p2p_OpStatusFlags |= P2P_GO_UP;\n\tpAd->P2pCfg.GroupOpChannel = pAd->P2pCfg.GroupChannel;\n\tif (!INFRA_ON(pAd))\n\t\tpAd->CommonCfg.Channel = pAd->P2pCfg.GroupChannel;\n\tpAd->P2pCfg.Rule = P2P_IS_GO;\n\n#ifdef INF_AMAZON_SE\n\tfor (i = 0; i < NUM_OF_TX_RING; i++)\n\t{\n\t\tpAd->BulkOutDataSizeLimit[i]=24576;\n\t}\n#endif /* INF_AMAZON_SE  */\n\t\t\n\tAsicDisableSync(pAd);\n\n\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = (WMODE_A | WMODE_AN);\n\t\telse\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = (WMODE_B | WMODE_G | WMODE_GN);\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = WMODE_A;\n\t\telse\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = (WMODE_B | WMODE_G);\n\t}\n\n\tTxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1);\n\n\t{\n\t\tPMULTISSID_STRUCT\tpMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n\n\t\tif ((pMbss->SsidLen <= 0) || (pMbss->SsidLen > MAX_LEN_OF_SSID))\n\t\t{\n\t\t\tNdisMoveMemory(pMbss->Ssid, \"P2P_Linux_AP\", 12);\n\t\t\tpMbss->SsidLen = 12;\t\t\t\n\t\t}\n\n\t\tif (pMbss->bWmmCapable)\n\t\t{\n        \tbWmmCapable = TRUE;\n\t\t}\n\t\t\n\t\t/* GO always use WPA2PSK / AES */\n\t\tpMbss->AuthMode = Ndis802_11AuthModeWPA2PSK;\n \t\tpMbss->WepStatus = Ndis802_11Encryption3Enabled;\n\t\tpMbss->WscSecurityMode = WPA2PSKAES;\n\t\tpMbss->GroupKeyWepStatus = pMbss->WepStatus;\n\t\tpMbss->CapabilityInfo =\n\t\t\tCAP_GENERATE(1, 0, (pMbss->WepStatus != Ndis802_11EncryptionDisabled), TxPreamble, pAd->CommonCfg.bUseShortSlotTime, SpectrumMgmt);\n\n#ifdef UAPSD_SUPPORT\n\t\tif (pAd->ApCfg.MBSSID[0].UapsdInfo.bAPSDCapable == TRUE)\n\t\t{\n\t\t\t/* QAPs set the APSD subfield to 1 within the Capability Information\n\t\t\t   field when the MIB attribute dot11APSDOptionImplemented is true\n\t\t\t   and set it to 0 otherwise. STAs always set this subfield to 0. */\n            pMbss->CapabilityInfo |= 0x0800;\n        } /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t\t/* decide the mixed WPA cipher combination */\n\t\tif (pMbss->WepStatus == Ndis802_11Encryption4Enabled)\n\t\t{\n\t\t\tswitch ((UCHAR)pMbss->AuthMode)\n\t\t\t{\n\t\t\t\t/* WPA mode */\n\t\t\t\tcase Ndis802_11AuthModeWPA:\n\t\t\t\tcase Ndis802_11AuthModeWPAPSK:\n\t\t\t\t\tpMbss->WpaMixPairCipher = WPA_TKIPAES_WPA2_NONE;\n\t\t\t\t\tbreak;\t\n\n\t\t\t\t/* WPA2 mode */\n\t\t\t\tcase Ndis802_11AuthModeWPA2:\n\t\t\t\tcase Ndis802_11AuthModeWPA2PSK:\n\t\t\t\t\tpMbss->WpaMixPairCipher = WPA_NONE_WPA2_TKIPAES;\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* WPA and WPA2 both mode */\n\t\t\t\tcase Ndis802_11AuthModeWPA1WPA2:\n\t\t\t\tcase Ndis802_11AuthModeWPA1PSKWPA2PSK:\t\n\n\t\t\t\t\t/* In WPA-WPA2 and TKIP-AES mixed mode, it shall use the maximum  */\n\t\t\t\t\t/* cipher capability unless users assign the desired setting. */\n\t\t\t\t\tif (pMbss->WpaMixPairCipher == MIX_CIPHER_NOTUSE || \n\t\t\t\t\t\tpMbss->WpaMixPairCipher == WPA_TKIPAES_WPA2_NONE || \n\t\t\t\t\t\tpMbss->WpaMixPairCipher == WPA_NONE_WPA2_TKIPAES)\n\t\t\t\t\t\tpMbss->WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tbreak;\t\t\t\t\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t}\n\t\telse\n\t\tpMbss->WpaMixPairCipher = MIX_CIPHER_NOTUSE;\n\n\t\t/* Generate the corresponding RSNIE */\n\t\tRTMPMakeRSNIE(pAd, pMbss->AuthMode, pMbss->WepStatus, MAIN_MBSSID + MIN_NET_DEVICE_FOR_P2P_GO);\n\n#ifdef WSC_V2_SUPPORT\n\t\tif (pMbss->WscControl.WscV2Info.bEnableWpsV2)\n\t\t{\n\t\t\t/*\n\t\t\t\tWPS V2 doesn't support WEP and WPA/WPAPSK-TKIP.\n\t\t\t*/\n\t\t\tif ((pMbss->WepStatus == Ndis802_11WEPEnabled) || (pMbss->WepStatus == Ndis802_11Encryption2Enabled))\n\t\t\t\tWscOnOff(pAd, MAIN_MBSSID | MIN_NET_DEVICE_FOR_P2P_GO, TRUE);\n\t\t\telse\n\t\t\t\tWscOnOff(pAd, MAIN_MBSSID | MIN_NET_DEVICE_FOR_P2P_GO, FALSE);\n\t\t}\n#endif /* WSC_V2_SUPPORT */\n\t}\n\n\tif (INFRA_ON(pAd) && (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40) && \n\t\t(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA != pAd->StaActive.SupportedHtPhy.ExtChanOffset))\n\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA = pAd->StaActive.SupportedHtPhy.ExtChanOffset;\n\n\tN_ChannelCheck(pAd);\n\n#ifdef DOT11_N_SUPPORT\n\tRTMPSetPhyMode(pAd,  pAd->CommonCfg.PhyMode);\n\tP2P_GoSetCommonHT(pAd);\t\n#endif /* DOT11_N_SUPPORT */\n\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && (pAd->Antenna.field.TxPath == 2))\n\t\t\trtmp_bbp_set_txdac(pAd, 2);\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\trtmp_bbp_set_txdac(pAd, 0);\n\t}\n\n\t/* Receiver Antenna selection, write to BBP R3(bit4:3) */\n\trtmp_bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);\n\t\n\tif(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t{\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) || bWmmCapable)\n\t{\n\t\t/* EDCA parameters used for AP's own transmission */\n\t\t\tpAd->CommonCfg.APEdcaParm.bValid = TRUE;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;\n\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;\n\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;\n\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;\n\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;\n\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[0]  = 0;\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[1]  = 0;\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[2]  = 94;\t/*96; */\n\t\t\tpAd->CommonCfg.APEdcaParm.Txop[3]  = 47;\t/*48; */\n\t\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n\n\t\t/* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */\n\t\t\tpAd->ApCfg.BssEdcaParm.bValid = TRUE;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[0] = 3;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[1] = 7;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[2] = 2;\n\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[3] = 2;\n\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[0] = 4;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[1] = 4;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[2] = 3;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[3] = 2;\n\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[0] = 10;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[1] = 10;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[2] = 4;\n\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[3] = 3;\n\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[0]  = 0;\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[1]  = 0;\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[2]  = 94;\t/*96; */\n\t\t\tpAd->ApCfg.BssEdcaParm.Txop[3]  = 47;\t/*48; */\n\t\t}\n\telse\n\t\tAsicSetEdcaParm(pAd, NULL);\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tif (!WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\t/* Patch UI */\n\t\tpAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = BW_20;\n\t}\n\n\t/* init */\n\tif (pAd->CommonCfg.bRdg)\n\t{\t\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\tAsicEnableRDG(pAd);\n\t}\n\telse\t\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\tAsicDisableRDG(pAd);\n\t}\t\n#endif /* DOT11_N_SUPPORT */\n\n\tAsicSetBssid(pAd, pAd->CurrentAddress); \n\tAsicSetMcastWC(pAd);\n\n\t/* In AP mode,  First WCID Table in ASIC will never be used. To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. */\n\t/* p.s ASIC use all 0xff as termination of WCID table search. */\n\tRTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);\n\tRTMP_IO_WRITE32(pAd, MAC_WCID_BASE+4, 0x0);\n\n\t/* reset WCID table */\n\tfor (idx=2; idx<255; idx++)\n\t{\n\t\toffset = MAC_WCID_BASE + (idx * HW_WCID_ENTRY_SIZE);\t\n\t\tRTMP_IO_WRITE32(pAd, offset, 0x0);\n\t\tRTMP_IO_WRITE32(pAd, offset+4, 0x0);\n\t}\n\n\tpAd->MacTab.Content[0].Addr[0] = 0x01;\n\tpAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM;\n\tpAd->MacTab.Content[0].HTPhyMode.field.MCS = 3;\n\t/*pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;*/\n\tpAd->P2PChannel = pAd->CommonCfg.Channel;\n\n\tAsicBBPAdjust(pAd);\n\n\t/* Clear BG-Protection flag */\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\tpAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t\tN_SetCenCh(pAd, pAd->CommonCfg.Channel);\n\n\tAsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);\n\tAsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);\n\n\tMlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble);\t\n\tMlmeUpdateTxRates(pAd, FALSE, MIN_NET_DEVICE_FOR_P2P_GO);\n#ifdef DOT11_N_SUPPORT\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\tMlmeUpdateHtTxRates(pAd, MIN_NET_DEVICE_FOR_P2P_GO);\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Disable Protection first. */\n\tif (!INFRA_ON(pAd))\n\t\tAsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);\n\n\tAPUpdateCapabilityAndErpIe(pAd);\n#ifdef DOT11_N_SUPPORT\n\tAPUpdateOperationMode(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Set LED */\n\tRTMPSetLED(pAd, LED_LINK_UP);\n#endif /* LED_CONTROL_SUPPORT */\n\n\t/* Initialize security variable per entry, \n\t\t1. \tpairwise key table, re-set all WCID entry as NO-security mode.\n\t\t2.\taccess control port status\n\t*/\n\tfor (idx=2; idx<MAX_LEN_OF_MAC_TABLE; idx++)\n\t{\n\t\tpAd->MacTab.Content[idx].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\tAsicRemovePairwiseKeyEntry(pAd, (UCHAR)idx);\n\t}\n\n\t{\n\t\tUSHORT\t\tWcid = 0;\t\n\t\tPMULTISSID_STRUCT\tpMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n\n\t\tpMbss->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t\tif (IS_WPA_CAPABILITY(pMbss->AuthMode))\n\t\t{   \n\t\t\tpMbss->DefaultKeyId = 1;\n\t\t}\n\n\t\t/* Get a specific WCID to record this MBSS key attribute */\n\t\tGET_GroupKey_WCID(pAd, Wcid, MAIN_MBSSID);\n\n\t\t/* When WEP, TKIP or AES is enabled, set group key info to Asic */\n\t\tif (pMbss->WepStatus == Ndis802_11WEPEnabled)\n\t\t{\n    \t\t\tUCHAR\tCipherAlg;\n\t\t\tUCHAR\tidx_len;\n\n\t\t\tfor (idx=0; idx < SHARE_KEY_NUM; idx++)\n\t\t\t{\n\t\t\t\tCipherAlg = pAd->SharedKey[MAIN_MBSSID + 1][idx].CipherAlg;\n\n\t\t\t\tif (pAd->SharedKey[MAIN_MBSSID + 1][idx].KeyLen > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Set key material to Asic */\n    \t\t\t\t\tAsicAddSharedKeyEntry(pAd, MAIN_MBSSID + 1, idx, &pAd->SharedKey[MAIN_MBSSID + 1][idx]);\t\n\t\t\n\t\t\t\t\tif (idx == pMbss->DefaultKeyId)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Generate 3-bytes IV randomly for software encryption using */\t\t\t\t\t\t\n\t\t\t\t    \tfor(idx_len = 0; idx_len < LEN_WEP_TSC; idx_len++)\n\t\t\t\t\t\t\tpAd->SharedKey[MAIN_MBSSID + 1][idx].TxTsc[idx_len] = RandomByte(pAd);   \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t/* Update WCID attribute table and IVEIV table */\n\t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\tMAIN_MBSSID + 1, \n\t\t\t\t\t\t\t\t\t\t\t\tidx, \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tCipherAlg,\n\t\t\t\t\t\t\t\t\t\t\t\tWcid, \n\t\t\t\t\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n    \t}\n\t\telse if ((pMbss->WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t\t (pMbss->WepStatus == Ndis802_11Encryption3Enabled) ||\n\t\t\t\t (pMbss->WepStatus == Ndis802_11Encryption4Enabled))\n\t\t{\n\t\t\t/* Generate GMK and GNonce randomly per MBSS */\n\t\t\tGenRandom(pAd, pMbss->Bssid, pMbss->GMK);\n\t\t\tGenRandom(pAd, pMbss->Bssid, pMbss->GNonce);\t\t\n\n\t\t\t/* Derive GTK per BSSID */\n\t\t\tWpaDeriveGTK(pMbss->GMK, \n\t\t\t\t\t\t(UCHAR*)pMbss->GNonce, \n\t\t\t\t\t\tpMbss->Bssid, \n\t\t\t\t\t\tpMbss->GTK, \n\t\t\t\t\t\tLEN_TKIP_GTK);\n\n\t\t\t/* Install Shared key */\n\t\t\tWPAInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\tpMbss->GroupKeyWepStatus, \n\t\t\t\t\t\t\t\tMAIN_MBSSID + 1, \n\t\t\t\t\t\t\t\tpMbss->DefaultKeyId, \n\t\t\t\t\t\t\t\tWcid,\n\t\t\t\t\t\t\t\tTRUE,\n\t\t\t\t\t\t\t\tpMbss->GTK,\n\t\t\t\t\t\t\t\tLEN_TKIP_GTK);\n\n\t\t}\n#ifdef WAPI_SUPPORT\n\t\telse if (pMbss->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\t{\t\n\t\t\tINT\tcnt;\n\t\t\n\t\t\t/* Initial the related variables */\n\t\t\tpMbss->DefaultKeyId = 0;\n\t\t\tNdisMoveMemory(pMbss->key_announce_flag, AE_BCAST_PN, LEN_WAPI_TSC);\n\t\t\tif (IS_HW_WAPI_SUPPORT(pAd))\n\t\t\t\tpMbss->sw_wpi_encrypt = FALSE;\t\t\t\t\t\n\t\t\telse\n\t\t\t\tpMbss->sw_wpi_encrypt = TRUE;\n\n\t\t\t/* Generate NMK randomly */\n\t\t\tfor (cnt = 0; cnt < LEN_WAPI_NMK; cnt++)\n\t\t\t\tpMbss->NMK[cnt] = RandomByte(pAd);\n\t\t\t\n\t\t\t/* Count GTK for this BSSID */\n\t\t\tRTMPDeriveWapiGTK(pMbss->NMK, pMbss->GTK);\n\n\t\t\t/* Install Shared key */\n\t\t\tWAPIInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\t pMbss->GroupKeyWepStatus, \n\t\t\t\t\t\t\t\t MAIN_MBSSID + 1, \n\t\t\t\t\t\t\t\t pMbss->DefaultKeyId, \n\t\t\t\t\t\t\t\t Wcid,\n\t\t\t\t\t\t\t\t pMbss->GTK);\n\t\t\t\n\t\t}\n#endif /* WAPI_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\n\t\t/* Send singal to daemon to indicate driver had restarted */\n\t\tif ((pMbss->AuthMode == Ndis802_11AuthModeWPA) || (pMbss->AuthMode == Ndis802_11AuthModeWPA2)\n        \t\t|| (pMbss->AuthMode == Ndis802_11AuthModeWPA1WPA2) || (pMbss->IEEE8021X == TRUE))\n\t\t{\n\t\t\t;/*bDot1xReload = TRUE; */\n    \t}\n#endif /* DOT1X_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"### BSS(%d) AuthMode(%d)=%s, WepStatus(%d)=%s , AccessControlList.Policy=%ld\\n\", MAIN_MBSSID + 1, pMbss->AuthMode, GetAuthMode(pMbss->AuthMode), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  pMbss->WepStatus, GetEncryptType(pMbss->WepStatus), pMbss->AccessControlList.Policy));\n\n#ifdef DOT1X_SUPPORT\n\t/* Send internal command to DOT1X daemon for reloading configuration */\n/*\n\tif (bDot1xReload)\n\t\tDOT1X_InternalCmdAction(pAd, NULL, DOT1X_RELOAD_CONFIG);\n*/\n#endif /* DOT1X_SUPPORT */\n\n\t/* Disable Protection first. */\n\t/*AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE); */\n#ifdef PIGGYBACK_SUPPORT\n\tRTMPSetPiggyBack(pAd, pAd->CommonCfg.bPiggyBackCapable);\n#endif /* PIGGYBACK_SUPPORT */\n\n\tApLogEvent(pAd, pAd->CurrentAddress, EVENT_RESET_ACCESS_POINT);\n\n#if defined(WSC_AP_SUPPORT) || defined(WSC_STA_SUPPORT)\n\t\t{\n\t\t\tPWSC_CTRL pWscControl;\n\t\t\tUCHAR zeros16[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n\t\t\t\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Generate UUID for apidx(%d)\\n\", MAIN_MBSSID));\n\t\t\tif (NdisEqualMemory(&pWscControl->Wsc_Uuid_E[0], zeros16, UUID_LEN_HEX))\n\t\t\t\tWscGenerateUUID(pAd, &pWscControl->Wsc_Uuid_E[0], &pWscControl->Wsc_Uuid_Str[0], MIN_NET_DEVICE_FOR_P2P_GO, FALSE);\n\t\t\tWscInit(pAd, FALSE, MIN_NET_DEVICE_FOR_P2P_GO);\n\t\t}\n#endif /* defined(WSC_AP_SUPPORT) || defined(WSC_STA_SUPPORT) */\n\t}\n\n\tOPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\n\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\n#ifdef RTMP_MAC_USB\n\tRTUSBBssBeaconInit(pAd);\n#endif /* RTMP_MAC_USB */\n\n\t/*pAd->Dot11_H.RDMode = RD_NORMAL_MODE;*/\n\t/*AsicEnableP2PGoSync(pAd); */\n\n\t/* start sending BEACON out */\n\tAPMakeAllBssBeacon(pAd);\n\tAPUpdateAllBeaconFrame(pAd);\n\n\t/*AsicEnableP2PGoSync(pAd); */\n\n\t{\n\t\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\t\tAsicEnableP2PGoSync(pAd);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT\n#ifdef A_BAND_SUPPORT\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t{\n\t\t\tif ((pAd->CommonCfg.CarrierDetect.Enable == 0)\n\t\t\t\t&& ((pAd->CommonCfg.RDDurRegion == JAP)\n\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W53)\n\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W56)))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = 1;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* A_BAND_SUPPORT */\t\t\n\t\t{\n\t\t\tif (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40)\n\t\t\t{\n\t\t\t\tif ((pAd->CommonCfg.CarrierDetect.Enable == 0)\n\t\t\t\t\t\t&& ((pAd->CommonCfg.RDDurRegion == JAP)\n\t\t\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W53)\n\t\t\t\t\t\t\t|| (pAd->CommonCfg.RDDurRegion == JAP_W56)))\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.CarrierDetect.Enable = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\t{\n\t\t\t/* trun on Carrier-Detection.*/\n\t\t\tCarrierDetectionStart(pAd);\n\t\t}\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n#ifdef WAPI_SUPPORT\n\tRTMPStartWapiRekeyTimerAction(pAd, NULL);\n#endif /* WAPI_SUPPORT */\n\n\t/* Pre-tbtt interrupt setting. */\n\tAsicSetPreTbttInt(pAd, TRUE);\n\n\t/* Set group re-key timer if necessary.  \n\t   It must be processed after clear flag \"fRTMP_ADAPTER_HALT_IN_PROGRESS\" */\n\tWPA_APSetGroupRekeyAction(pAd);\n\n\n#ifdef IDS_SUPPORT\n\t/* Start IDS timer */\n\tif (pAd->ApCfg.IdsEnable)\n\t{\n#ifdef SYSTEM_LOG_SUPPORT\t\n\t\tif (pAd->CommonCfg.bWirelessEvent == FALSE)\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"!!! WARNING !!! The WirelessEvent parameter doesn't be enabled \\n\"));\n#endif /* SYSTEM_LOG_SUPPORT */\n\t\t\n\t\tRTMPIdsStart(pAd);\n\t}\n#endif /* IDS_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\t/*\n\t  * Support multiple BulkIn IRP,\n\t  * the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.\n\t  */\n\t{\n\t\tUCHAR num_idx;\n\n\t\tfor(num_idx=0; num_idx < pAd->CommonCfg.NumOfBulkInIRP; num_idx++)\n\t\t{\n\t\t\tRTUSBBulkReceive(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBulkReceive!\\n\" ));\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\n\n\n\t/* Start respons Auth Req. */\n\tpAd->P2pCfg.bStopAuthRsp = FALSE;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== P2P_GoStartUp\\n\"));\n}\n\nVOID P2P_GoStop(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBOOLEAN     Cancelled;\n\tUINT32\t\tValue;\n\tINT\t\t\tapidx;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> P2P_GoStop\\n\"));\n\n\tpAd->P2pCfg.P2pCapability[1] &= ~(GRPCAP_OWNER);\n\n\tpAd->flg_p2p_OpStatusFlags &= P2P_FIXED_MODE;\n\n\tpAd->P2pCfg.Rule = P2P_IS_DEVICE;\n\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = FALSE;\n\tAPMakeAllBssBeacon(pAd);\n\tAPUpdateAllBeaconFrame(pAd);\n\n#ifdef DFS_SUPPORT\n\tNewRadarDetectionStop(pAd);\n#endif /* DFS_SUPPORT */\n\n\n\n\tP2PMacTableReset(pAd);\n\n\t/* Disable pre-tbtt interrupt */\n\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\tValue &=0xe;\n\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\n\tif (!INFRA_ON(pAd))\n\t{\n\t\t/* Disable piggyback */\n\t\tRTMPSetPiggyBack(pAd, FALSE);\n\n   \t\tAsicUpdateProtect(pAd, 0,  (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);\n\n\t}\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\t/*RTMP_ASIC_INTERRUPT_DISABLE(pAd); */\n\t\tAsicDisableSync(pAd);\n\n#ifdef LED_CONTROL_SUPPORT\n\t\t/* Set LED */\n\t\tRTMPSetLED(pAd, LED_LINK_DOWN);\n#endif /* LED_CONTROL_SUPPORT */\n\t}\n\n#ifdef RTMP_MAC_USB\n\t/* For RT2870, we need to clear the beacon sync buffer. */\n\tRTUSBBssBeaconExit(pAd);\n#endif /* RTMP_MAC_USB */\n\n\n\tfor (apidx = 0; apidx < MAX_MBSSID_NUM(pAd); apidx++)\n\t{\n\t\tif (pAd->ApCfg.MBSSID[apidx].REKEYTimerRunning == TRUE)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx].REKEYTimer, &Cancelled);\n\t\t\tpAd->ApCfg.MBSSID[apidx].REKEYTimerRunning = FALSE;\n\t\t}\n\t}\n\n\tif (pAd->ApCfg.CMTimerRunning == TRUE)\n\t{\n\t\tRTMPCancelTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled);\n\t\tpAd->ApCfg.CMTimerRunning = FALSE;\n\t}\n\t\n#ifdef WAPI_SUPPORT\n\tRTMPCancelWapiRekeyTimerAction(pAd, NULL);\n#endif /* WAPI_SUPPORT */\n\t\n\t/*\n\t * Cancel the Timer, to make sure the timer was not queued.\n\t */\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\n#ifdef IDS_SUPPORT\n\t/* if necessary, cancel IDS timer */\n\tRTMPIdsStop(pAd);\n#endif /* IDS_SUPPORT */\n\n\n\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== P2P_GoStop\\n\"));\n}\n\nVOID P2P_CliStartUp(\n\tIN PRTMP_ADAPTER \tpAd)\n{\n\tUCHAR ifIndex;\n\tPAPCLI_STRUCT pApCliEntry;\n\n\t/* Reset is in progress, stop immediately */\n\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||\n\t\t RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) ||\n\t\t !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n\t\treturn;\n\n\t/* sanity check whether the interface is initialized. */\n\tif (pAd->flg_apcli_init != TRUE)\n\t\treturn;\n\n\tpAd->P2pCfg.P2pCapability[1] &= ~(GRPCAP_OWNER);\n\tpAd->flg_p2p_OpStatusFlags = P2P_CLI_UP;\n\tpAd->P2pCfg.Rule = P2P_IS_CLIENT;\n\tpAd->StaCfg.bAutoReconnect = FALSE;\n\tAsicSetBssid(pAd, pAd->CurrentAddress); \n\tAsicSetMcastWC(pAd);\n\n\tfor(ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++)\n\t{\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\t\tif (pAd->CommonCfg.Channel != 0)\n\t\t\tpAd->P2PChannel = pAd->CommonCfg.Channel;\n\t\telse\n\t\t\tpAd->P2PChannel  = FirstChannel(pAd);\n\t\t\n\t\tif (APCLI_IF_UP_CHECK(pAd, ifIndex) \n\t\t\t&& (pApCliEntry->Enable == TRUE)\n\t\t\t&& (pApCliEntry->Valid == FALSE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCli interface[%d] startup.\\n\", __FUNCTION__, ifIndex));\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ, 0, NULL, ifIndex);\n\t\t}\n\t}\n\n\tOPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\n\treturn;\n}\n\nVOID P2P_CliStop(\n\tIN PRTMP_ADAPTER \tpAd)\n{\n\tUCHAR ifIndex;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===>\\n\", __FUNCTION__));\n\n\t/*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_P2P_CLI); */\n\tpAd->flg_p2p_OpStatusFlags = P2P_DISABLE;\n\tpAd->P2pCfg.Rule = P2P_IS_DEVICE;\n\tfor (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++)\n\t{\n\t\t/* send disconnect-req to sta State Machine. */\n\t\tif (pAd->ApCfg.ApCliTab[ifIndex].Enable)\n\t\t{\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCli interface[%d] startdown.\\n\", __FUNCTION__, ifIndex));\n\t\t}\n\t}\n\t\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is called by APMlmePeriodicExec() every second to check if\n\t\t1. any associated client in PSM. If yes, then TX MCAST/BCAST should be\n\t\t   out in DTIM only\n\t\t2. any client being idle for too long and should be aged-out from MAC table\n\t\t3. garbage collect PSQ\n\t==========================================================================\n*/\nVOID P2PMacTableMaintenance(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tint         i, FirstWcid;\n#ifdef DOT11_N_SUPPORT\n\tULONG MinimumAMPDUSize = pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor; /*Default set minimum AMPDU Size to 2, i.e. 32K */\n\tBOOLEAN\tbRdgActive;\n#endif /* DOT11_N_SUPPORT */\n\tUINT\tfAnyStationPortSecured[MAX_MBSSID_NUM(pAd)];\n \tUINT \tbss_index;\n\tMAC_TABLE *pMacTable;\n\n\tFirstWcid = 2;\n\n\tfor (bss_index = BSS0; bss_index < MAX_MBSSID_NUM(pAd); bss_index++)\n\t\tfAnyStationPortSecured[bss_index] = 0;\n\n\tpMacTable = &pAd->MacTab;\n\tpMacTable->fAnyStationInPsm = FALSE;\n\tpMacTable->fAnyStationBadAtheros = FALSE;\n\tpMacTable->fAnyTxOPForceDisable = FALSE;\n\tpMacTable->fAllStationAsRalink = TRUE;\n#ifdef DOT11_N_SUPPORT\n\tpMacTable->fAnyStationNonGF = FALSE;\n\tpMacTable->fAnyStation20Only = FALSE;\n\tpMacTable->fAnyStationIsLegacy = FALSE;\n\tpMacTable->fAnyStationMIMOPSDynamic = FALSE;\n#ifdef GREENAP_SUPPORT\n\t//Support Green AP\n\tpMacTable->fAnyStationIsHT=FALSE;\n#endif /* GREENAP_SUPPORT */\n\n#ifdef DOT11N_DRAFT3\n\tpMacTable->fAnyStaFortyIntolerant = FALSE;\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\tpMacTable->fAnyWapiStation = FALSE;\n#endif /* WAPI_SUPPORT */\n\n\tfor (i = FirstWcid; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t{\n\t\tMAC_TABLE_ENTRY *pEntry = &pMacTable->Content[i];\n\n\t\tBOOLEAN bDisconnectSta = FALSE;\n\n\t\tif (!IS_ENTRY_CLIENT(pEntry))\n\t\t\tcontinue;\n\n\t\tif (pEntry->NoDataIdleCount == 0)\n\t\t\tpEntry->StationKeepAliveCount = 0;\n\n\t\tpEntry->NoDataIdleCount ++;  \n\t\tpEntry->StaConnectTime ++;\n\n\t\t/* 0. STA failed to complete association should be removed to save MAC table space. */\n\t\tif ((pEntry->Sst != SST_ASSOC) && (pEntry->NoDataIdleCount >= pEntry->AssocDeadLine))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x:%02x:%02x:%02x:%02x:%02x fail to complete ASSOC in %d sec\\n\",\n\t\t\t\t\tpEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2],pEntry->Addr[3],\n\t\t\t\t\tpEntry->Addr[4],pEntry->Addr[5],MAC_TABLE_ASSOC_TIMEOUT));\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* 1. check if there's any associated STA in power-save mode. this affects outgoing */\n\t\t/*    MCAST/BCAST frames should be stored in PSQ till DtimCount=0 */\n\t\tif (pEntry->PsMode == PWR_SAVE)\n\t\t\tpMacTable->fAnyStationInPsm = TRUE;\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (pEntry->MmpsMode == MMPS_DYNAMIC)\n\t\t{\n\t\t\tpMacTable->fAnyStationMIMOPSDynamic = TRUE;\n\t\t}\n\n\t\tif (pEntry->MaxHTPhyMode.field.BW == BW_20)\n\t\t\tpMacTable->fAnyStation20Only = TRUE;\n\n\t\tif (pEntry->MaxHTPhyMode.field.MODE != MODE_HTGREENFIELD)\n\t\t\tpMacTable->fAnyStationNonGF = TRUE;\n\n\t\tif ((pEntry->MaxHTPhyMode.field.MODE == MODE_OFDM) || (pEntry->MaxHTPhyMode.field.MODE == MODE_CCK))\n\t\t{\n\t\t\tpMacTable->fAnyStationIsLegacy = TRUE;\n\t\t}\n#ifdef GREENAP_SUPPORT\n\t\telse\n\t\t{\n\t\t\tpMacTable->fAnyStationIsHT=TRUE;\n\t\t}\n#endif /* GREENAP_SUPPORT */\n\n#ifdef DOT11N_DRAFT3\n\t\tif (pEntry->bForty_Mhz_Intolerant)\n\t\t\tpMacTable->fAnyStaFortyIntolerant = TRUE;\n#endif /* DOT11N_DRAFT3 */\n\n\t\t/* Get minimum AMPDU size from STA\t */\n\t\tif (MinimumAMPDUSize > pEntry->MaxRAmpduFactor) \n\t\t{\n\t\t\tMinimumAMPDUSize = pEntry->MaxRAmpduFactor;\t\t\t\t\t\t\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\n\t\tif (pEntry->bIAmBadAtheros)\n\t\t{\n\t\t\tpMacTable->fAnyStationBadAtheros = TRUE;\n\n\t\t\tif (!INFRA_ON(pAd))\n\t\t\t{\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tif (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)\n\t\t\t\t\tAsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, FALSE, pMacTable->fAnyStationNonGF);\n#endif /* DOT11_N_SUPPORT */\n\n#ifndef DOT11N_SS3_SUPPORT\n\t\t\t\tif (pEntry->WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t\t{\n\t\t\t\t\tpMacTable->fAnyTxOPForceDisable = TRUE;\n\t\t\t\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t}\n\t\t}\n\n\t\t/* detect the station alive status */\n\t\t/* detect the station alive status */\n\n\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].StationKeepAliveTime = 3;\n\t\tif ((pAd->ApCfg.MBSSID[pEntry->apidx].StationKeepAliveTime > 0) &&\n\t\t\t(pEntry->NoDataIdleCount >= pAd->ApCfg.MBSSID[pEntry->apidx].StationKeepAliveTime))\n\t\t{\n\t\t\tMULTISSID_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\n\t\t\t/*\n\t\t\t\tIf no any data success between ap and the station for\n\t\t\t\tStationKeepAliveTime, try to detect whether the station is\n\t\t\t\tstill alive.\n\n\t\t\t\tNote: Just only keepalive station function, no disassociation\n\t\t\t\tfunction if too many no response.\n\t\t\t*/\n\n\t\t\t/*\n\t\t\t\tFor example as below:\n\n\t\t\t\t1. Station in ACTIVE mode,\n\n\t\t        ......\n\t\t        sam> tx ok!\n\t\t        sam> count = 1!\t ==> 1 second after the Null Frame is acked\n\t\t        sam> count = 2!\t ==> 2 second after the Null Frame is acked\n\t\t        sam> count = 3!\n\t\t        sam> count = 4!\n\t\t        sam> count = 5!\n\t\t        sam> count = 6!\n\t\t        sam> count = 7!\n\t\t        sam> count = 8!\n\t\t        sam> count = 9!\n\t\t        sam> count = 10!\n\t\t        sam> count = 11!\n\t\t        sam> count = 12!\n\t\t        sam> count = 13!\n\t\t        sam> count = 14!\n\t\t        sam> count = 15! ==> 15 second after the Null Frame is acked\n\t\t        sam> tx ok!      ==> (KeepAlive Mechanism) send a Null Frame to\n\t\t\t\t\t\t\t\t\t\tdetect the STA life status\n\t\t        sam> count = 1!  ==> 1 second after the Null Frame is acked\n\t\t        sam> count = 2!\n\t\t        sam> count = 3!\n\t\t        sam> count = 4!\n\t\t        ......\n\n\t\t\t\tIf the station acknowledges the QoS Null Frame,\n\t\t\t\tthe NoDataIdleCount will be reset to 0.\n\n\n\t\t\t\t2. Station in legacy PS mode,\n\n\t\t\t\tWe will set TIM bit after 15 seconds, the station will send a\n\t\t\t\tPS-Poll frame and we will send a QoS Null frame to it.\n\t\t\t\tIf the station acknowledges the QoS Null Frame, the\n\t\t\t\tNoDataIdleCount will be reset to 0.\n\n\n\t\t\t\t3. Station in legacy UAPSD mode,\n\n\t\t\t\tCurrently we dont support the keep alive mechanism.\n\t\t\t\tSo if your station is in UAPSD mode, the station will be\n\t\t\t\tkicked out after 300 seconds.\n\n\t\t\t\tNote: the rate of QoS Null frame can not be 1M of 2.4GHz or\n\t\t\t\t6M of 5GHz, or no any statistics count will occur.\n\t\t\t*/\n\n\t\t\tif (pEntry->StationKeepAliveCount++ == 0)\n\t\t\t{\n#ifdef P2P_SUPPORT\n\t\t\t\t/* Modify for P2P test plan 6.1.11 /6.1.12, enqueue null frame will influence the test item */\n\t\t\t\tif (pAd->P2pCfg.bSigmaEnabled == FALSE)\n\t\t\t\t{\n#endif /* P2P_SUPPORT */\n\t\t\t\tif (pEntry->PsMode == PWR_SAVE)\n\t\t\t\t{\n\t\t\t\t\t/* use TIM bit to detect the PS station */\n\t\t\t\t\tWLAN_MR_TIM_BIT_SET(pAd, pEntry->apidx, pEntry->Aid);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t\t\t\n\t\t\t\t\t/* use Null or QoS Null to detect the ACTIVE station */\n\t\t\t\t\tBOOLEAN bQosNull = FALSE;\n\t\n\t\t\t\t\tif (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\t\tbQosNull = TRUE;\n\t\t            \t\tApEnqueueNullFrame(pAd, pEntry->Addr, pEntry->CurrTxRate,\n\t    \t                           pEntry->Aid, pEntry->apidx, bQosNull, TRUE, 0);\n\t\t\t\t}\n#ifdef P2P_SUPPORT\n\t\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pEntry->StationKeepAliveCount >= pMbss->StationKeepAliveTime)\n\t\t\t\t\tpEntry->StationKeepAliveCount = 0;\n\t\t\t}\n\t\t}\n\n\t\t/* 2. delete those MAC entry that has been idle for a long time */\n\t\tif (pEntry->NoDataIdleCount >= pEntry->StaIdleTimeout)\n\t\t{\n\t\t\tbDisconnectSta = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"ageout %02x:%02x:%02x:%02x:%02x:%02x after %d-sec silence\\n\",\n\t\t\t\t\tpEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2],pEntry->Addr[3],\n\t\t\t\t\tpEntry->Addr[4],pEntry->Addr[5],pEntry->StaIdleTimeout));\n\t\t\tApLogEvent(pAd, pEntry->Addr, EVENT_AGED_OUT);\n\t\t}\n\t\telse if (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck)\n\t\t{\n\t\t\t/*\n\t\t\t\tAP have no way to know that the PwrSaving STA is leaving or not.\n\t\t\t\tSo do not disconnect for PwrSaving STA.\n\t\t\t*/\n\t\t\tif (pEntry->PsMode != PWR_SAVE)\n\t\t\t{\n\t\t\t\tbDisconnectSta = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"STA-%02x:%02x:%02x:%02x:%02x:%02x had left\\n\",\n\t\t\t\t\tpEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2],pEntry->Addr[3],\n\t\t\t\t\tpEntry->Addr[4],pEntry->Addr[5]));\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tif (bDisconnectSta)\n\t\t{\n\t\t\t/* send wireless event - for ageout  */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, pEntry->Addr, 0, 0); \n\n\t\t\tif (pEntry->Sst == SST_ASSOC)\n\t\t\t{\n\t\t\t\tPUCHAR      pOutBuffer = NULL;\n\t\t\t\tNDIS_STATUS NStatus;\n\t\t\t\tULONG       FrameLen = 0;\n\t\t\t\tHEADER_802_11 DeAuthHdr;\n\t\t\t\tUSHORT      Reason;\n\n\t\t\t\t/*  send out a DISASSOC request frame */\n\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tReason = REASON_DEAUTH_STA_LEAVING;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"Send DEAUTH - Reason = %d frame  TO %02x:%02x:%02x:%02x:%02x:%02x. \\n\",Reason, PRINT_MAC(pEntry->Addr)));\n\t\t\t\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].Bssid);\t\t\t\t\n\t\t    \tMakeOutgoingFrame(pOutBuffer,            &FrameLen, \n\t\t    \t                  sizeof(HEADER_802_11), &DeAuthHdr, \n\t\t    \t                  2,                     &Reason, \n\t\t    \t                  END_OF_ARGS);\t\t\t\t\n\t\t    \tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t    \tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t}\n\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* 3. garbage collect the PsQueue if the STA has being idle for a while */\n\t\tif (pEntry->PsQueue.Head)\n\t\t{\n\t\t\tpEntry->PsQIdleCount ++;  \n\t\t\tif (pEntry->PsQIdleCount > 2) \n\t\t\t{\n\t\t\t\tNdisAcquireSpinLock(&pAd->irq_lock);\n\t\t\t\tAPCleanupPsQueue(pAd, &pEntry->PsQueue);\n\t\t\t\tNdisReleaseSpinLock(&pAd->irq_lock);\n\t\t\t\tpEntry->PsQIdleCount = 0;\n\t\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pEntry->apidx, pEntry->Aid);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpEntry->PsQIdleCount = 0;\n\t\n#ifdef UAPSD_SUPPORT\n        UAPSD_QueueMaintenance(pAd, pEntry);\n#endif /* UAPSD_SUPPORT */\n\n\t\t/* check if this STA is Ralink-chipset  */\n\t\tif (!CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET))\n\t\t\tpMacTable->fAllStationAsRalink = FALSE;\n\n\t\t/* Check if the port is secured */\n\t\tif (pEntry->PortSecured == WPA_802_1X_PORT_SECURED)\n\t\t\tfAnyStationPortSecured[pEntry->apidx]++;\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\tif ((pEntry->BSS2040CoexistenceMgmtSupport) \n\t\t\t&& (pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_NOTIFY)\n\t\t\t&& (pAd->CommonCfg.bBssCoexEnable == TRUE)\n\t\t)\n\t\t{\n\t\t\tSendNotifyBWActionFrame(pAd, pEntry->Aid, pEntry->apidx);\n\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n#ifdef WAPI_SUPPORT\n\t\tif (pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n\t\t\tpMacTable->fAnyWapiStation = TRUE;\n#endif /* WAPI_SUPPORT */\n\n\t}\n\n\t/* Update the state of port per MBSS */\n\tfor (bss_index = BSS0; bss_index < MAX_MBSSID_NUM(pAd); bss_index++)\n\t{\n\t\tif (fAnyStationPortSecured[bss_index] > 0)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[bss_index].PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t}\n\t\telse\n\t\t\tpAd->ApCfg.MBSSID[bss_index].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t}\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif (pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_NOTIFY)\n\t\tpAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_INFO_NOTIFY);\n#endif /* DOT11N_DRAFT3 */\n\n\t/* If all associated STAs are Ralink-chipset, AP shall enable RDG. */\n\tif (pAd->CommonCfg.bRdg && pMacTable->fAllStationAsRalink)\n\t{\n\t\tbRdgActive = TRUE;\n\t}\n\telse\n\t{\n\t\tbRdgActive = FALSE;\n\t}\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tif(pAd->MacTab.fAnyStationIsHT==FALSE\n\t\t\t&& pAd->ApCfg.bGreenAPEnable == TRUE)\n\t\t{\n\t\t\t\tif (pAd->ApCfg.GreenAPLevel!=GREENAP_ONLY_11BG_STAS)\n\t\t\t\t{\n\t\t\t\t\tRTMP_CHIP_ENABLE_AP_MIMOPS(pAd, FALSE);\n\t\t\t\t\tpAd->ApCfg.GreenAPLevel=GREENAP_ONLY_11BG_STAS;\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->ApCfg.GreenAPLevel!=GREENAP_11BGN_STAS)\n\t\t\t{\n\t\t\t\tRTMP_CHIP_DISABLE_AP_MIMOPS(pAd);\n\t\t\t\tpAd->ApCfg.GreenAPLevel=GREENAP_11BGN_STAS;\n\t\t\t}\n\t\t}\n\t}\n#endif /* GREENAP_SUPPORT */\n\n\tif (bRdgActive != RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE))\n\t{\n\t\tif (bRdgActive)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\tAsicEnableRDG(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\tAsicDisableRDG(pAd);\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n\tif (!INFRA_ON(pAd))\n\t{\n\t\tif ((pMacTable->fAnyStationBadAtheros == FALSE) && (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == TRUE))\n\t\t{\n\t\t\tAsicUpdateProtect(pAd, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, pMacTable->fAnyStationNonGF);\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t/* \n\t *\t4. garbage collect pAd->MacTab.McastPsQueue if backlogged MCAST/BCAST frames\n\t *    stale in queue. Since MCAST/BCAST frames always been sent out whenever \n\t *    DtimCount==0, the only case to let them stale is surprise removal of the NIC,\n\t *    so that ASIC-based Tbcn interrupt stops and DtimCount dead.\n\t */\n\tif (pMacTable->McastPsQueue.Head)\n\t{\n\t\tUINT bss_index;\n\n\t\tpMacTable->PsQIdleCount ++;\n\t\tif (pMacTable->PsQIdleCount > 1)\n\t\t{\n\n\t\t\t/*NdisAcquireSpinLock(&pAd->MacTabLock); */\n\t\t\tAPCleanupPsQueue(pAd, &pMacTable->McastPsQueue);\n\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\tpMacTable->PsQIdleCount = 0;\n\n\t\t        /* sanity check */\n\t\t\tif (pAd->ApCfg.BssidNum > MAX_MBSSID_NUM(pAd))\n\t\t\t\tpAd->ApCfg.BssidNum = MAX_MBSSID_NUM(pAd);\n\t\t        /* End of if */\n\t        \n\t\t        /* clear MCAST/BCAST backlog bit for all BSS */\n\t\t\tfor(bss_index=BSS0; bss_index<pAd->ApCfg.BssidNum; bss_index++)\n\t\t\t\tWLAN_MR_TIM_BCMC_CLEAR(bss_index);\n\t\t        /* End of for */\n\t\t}\n\t}\n\telse\n\t\tpMacTable->PsQIdleCount = 0;\n}\n\nVOID AsicEnableP2PGoSync(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tBCN_TIME_CFG_STRUC csr;\n\n\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);\n\n\t\n\t/* start sending BEACON */\n\tcsr.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; /* ASIC register in units of 1/16 TU */\n\tcsr.field.bTsfTicking = 1;\n\tcsr.field.TsfSyncMode = 3; /* sync TSF in IBSS mode */\n\tcsr.field.bTBTTEnable = 1;\n\tcsr.field.bBeaconGen = 1;\n\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);\n}\n\nVOID MgtMacP2PHeaderInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN OUT PHEADER_802_11 pHdr80211, \n\tIN UCHAR SubType, \n\tIN UCHAR ToDs, \n\tIN PUCHAR pDA, \n\tIN PUCHAR pBssid) \n{\n\tNdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));\n\t\n\tpHdr80211->FC.Type = BTYPE_MGMT;\n\tpHdr80211->FC.SubType = SubType;\n\tpHdr80211->FC.ToDs = ToDs;\n\tCOPY_MAC_ADDR(pHdr80211->Addr1, pDA);\n\tCOPY_MAC_ADDR(pHdr80211->Addr2, pBssid);\n\tCOPY_MAC_ADDR(pHdr80211->Addr3, pBssid);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine reset the entire MAC table. All packets pending in\n\t\tthe power-saving queues are freed here.\n\t==========================================================================\n */\nVOID P2PMacTableReset(\n\tIN  PRTMP_ADAPTER  pAd)\n{\n\tint         i, FirstWcid;\n\tBOOLEAN     Cancelled;    \n#ifdef CONFIG_AP_SUPPORT\n\tPUCHAR      pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG       FrameLen = 0;\n\tHEADER_802_11 DeAuthHdr;\n\tUSHORT      Reason;\n    UCHAR       apidx = MAIN_MBSSID;\n#endif /* CONFIG_AP_SUPPORT */\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTableReset\\n\"));\n\t/*NdisAcquireSpinLock(&pAd->MacTabLock); */\n\n\n\tFirstWcid = 2;\n\n\tfor (i = FirstWcid; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t{\n\t   \t\t/* Delete a entry via WCID */\n\n\t\t\t/*MacTableDeleteEntry(pAd, i, pAd->MacTab.Content[i].Addr); */\n\t\t\tRTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n    \t\t\tRTMPCancelTimer(&pEntry->WPA_Authenticator.MsgRetryTimer, &Cancelled);\n            }\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n            pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif ((pAd->OpMode == OPMODE_AP) || IS_P2P_GO_ENTRY(pEntry))\n\t\t\t{\n\t\t\t\t/* Before reset MacTable, send disassociation packet to client. */\n\t\t\t\tif (pEntry->Sst == SST_ASSOC)\n\t\t\t\t{\n\t\t\t\t\t/*  send out a De-authentication request frame */\n\t\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tReason = REASON_NO_LONGER_VALID;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"Send DEAUTH - Reason = %d frame tO %02x:%02x:%02x:%02x:%02x:%02x \\n\",\n\t\t\t\t\t\t\t\t\t\t\t\tReason, PRINT_MAC(pAd->MacTab.Content[i].Addr)));\n\n\t\t\t\t\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->HdrAddr1,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\t\tpEntry->HdrAddr2,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\t\tpEntry->HdrAddr3);\n\t\t\t    \tMakeOutgoingFrame(pOutBuffer,            &FrameLen,\n\t\t\t    \t                  sizeof(HEADER_802_11), &DeAuthHdr,\n\t\t\t    \t                  2,                     &Reason,\n\t\t\t    \t                  END_OF_ARGS);\n\n\t\t\t    \tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t    \tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t\t\tRTMPusecDelay(5000);\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\t/* Delete a entry via WCID */\n\t\t\tMacTableDeleteEntry(pAd, i, pEntry->Addr);\n\t\t}\n\t\tNdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t{\n\t\tfor (apidx = MAIN_MBSSID; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n#ifdef WSC_AP_SUPPORT\n\t\t\tPWSC_CTRL   pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tBOOLEAN Cancelled;\n\t\t\t\n\t    \tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t    \tpWscControl->EapolTimerRunning = FALSE;\n\t\t\tNdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN);\n\t    \tpWscControl->EapMsgRunning = FALSE;\n#endif /* WSC_AP_SUPPORT */\n\t\t\tpAd->ApCfg.MBSSID[apidx].StaCount = 0; \n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"McastPsQueue.Number %ld...\\n\",pAd->MacTab.McastPsQueue.Number));\n\t\tif (pAd->MacTab.McastPsQueue.Number > 0)\n\t\t\tAPCleanupPsQueue(pAd, &pAd->MacTab.McastPsQueue);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"2McastPsQueue.Number %ld...\\n\",pAd->MacTab.McastPsQueue.Number));\n\n\t\t/*NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE)); */\n\t\tInitializeQueueHeader(&pAd->MacTab.McastPsQueue);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\treturn;\n}\n\nVOID P2PChannelInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tifIndex)\n{\n\tif(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tADD_HTINFO\tRootApHtInfo, HtInfo;\n\n\t\tHtInfo = pAd->CommonCfg.AddHTInfo.AddHtInfo;\n\t\tRootApHtInfo = pAd->ApCliMlmeAux.AddHtInfo.AddHtInfo;\n\n\t\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) &&\n\t\t\t(RootApHtInfo.RecomWidth) &&\n\t\t\t(RootApHtInfo.ExtChanOffset != HtInfo.ExtChanOffset))\n\t\t{\t\t\t\n\t\t\tif (RootApHtInfo.ExtChanOffset == EXTCHA_ABOVE)\n\t\t\t\tSet_HtExtcha_Proc(pAd, \"1\");\n\t\t\telse\n\t\t\t\tSet_HtExtcha_Proc(pAd, \"0\");\n\t\t}\n\n\t\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\t}\n\t}\n}\n\nVOID\tP2PCfgInit(\n\tIN\tPRTMP_ADAPTER pAd)\n{\n\tUCHAR apcliIdx, apidx = MAIN_MBSSID;\n\n\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11EncryptionDisabled;\n\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = Ndis802_11EncryptionDisabled;\n\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 0;\n\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = MIX_CIPHER_NOTUSE;\n\n#ifdef DOT1X_SUPPORT\n\tpAd->ApCfg.MBSSID[apidx].IEEE8021X = FALSE;\n\tpAd->ApCfg.MBSSID[apidx].PreAuth = FALSE;\n\n\t/* PMK cache setting */\n\tpAd->ApCfg.MBSSID[apidx].PMKCachePeriod = (10 * 60 * OS_HZ); /* unit : tick(default: 10 minute) */\n\tNdisZeroMemory(&pAd->ApCfg.MBSSID[apidx].PMKIDCache, sizeof(NDIS_AP_802_11_PMKID));\n\n\t/* dot1x related per BSS */\n\tpAd->ApCfg.MBSSID[apidx].radius_srv_num = 0;\n\tpAd->ApCfg.MBSSID[apidx].NasIdLen = 0;\n#endif /* DOT1X_SUPPORT */\n\n\t/* VLAN related */\n\tpAd->ApCfg.MBSSID[apidx].VLAN_VID = 0;\n\n\t/* Default MCS as AUTO */\n\tpAd->ApCfg.MBSSID[apidx].bAutoTxRateSwitch = TRUE;\n\tpAd->ApCfg.MBSSID[apidx].DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\n\t/* Default is zero. It means no limit. */\n\tpAd->ApCfg.MBSSID[apidx].MaxStaNum = 0;\n\tpAd->ApCfg.MBSSID[apidx].StaCount = 0;\n\t\t\t\n#ifdef P2P_SUPPORT\n#ifdef APCLI_SUPPORT\n\tfor(apcliIdx = 0; apcliIdx < MAX_APCLI_NUM; apcliIdx++)\n\t{\n\t\tpAd->ApCfg.ApCliTab[apcliIdx].AuthMode = Ndis802_11AuthModeOpen;\n\t\tpAd->ApCfg.ApCliTab[apcliIdx].WepStatus = Ndis802_11WEPDisabled;\n\t}\n#endif /* APCLI_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\tfor(apcliIdx = 0; apcliIdx < WLAN_MAX_NUM_OF_TIM; apcliIdx++)\n\t\tpAd->ApCfg.MBSSID[apidx].TimBitmaps[apcliIdx] = 0;\n\n\tP2pGotoIdle(pAd);\n\n\t/* P2P CLI/GO also update ApCfg.RssiSample for AsicAdjustTxPower() caculation*/\n\tpAd->ApCfg.RssiSample.AvgRssi0 = -127;\n\tpAd->ApCfg.RssiSample.AvgRssi1 = -127;\n\tpAd->ApCfg.RssiSample.AvgRssi2 = -127;\n\t\n}\n\nVOID P2PInitChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32\tData = 0, macStatus;\n\tUINT32 MTxCycle, MRxCycle;\n\tUCHAR rf_channel, rf_bw;\n\tINT ext_ch;\n\n\n\n\t//Disable MAC Tx/Rx\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Data);\n\tData &= (~0x0C);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Data);\n\n\t// Check MAC Tx/Rx idle\n\tfor (MTxCycle = 0; MTxCycle < 10000; MTxCycle++)\n\t{\n\t\tRTMP_IO_READ32(pAd, MAC_STATUS_CFG, &macStatus);\n\t\tif (macStatus & 0x3)\n\t\t\tRTMPusecDelay(50);\n\t\telse\n\t\t\tbreak;\n\t}\n\n\tpAd->CommonCfg.CentralChannel = pAd->ApCliMlmeAux.CentralChannel;\n\tpAd->CommonCfg.Channel = pAd->ApCliMlmeAux.Channel;\n#ifdef DOT11_N_SUPPORT\n\t/* Change to AP channel */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"CentralChannel = %d, Channel %d, BW = %d\\n\",\n\t\t\tpAd->CommonCfg.CentralChannel, pAd->CommonCfg.Channel,\n\t\t\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.ChannelWidth));\n\n\tif ( (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) &&\n\t\t(pAd->ApCliMlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))\n\t{\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_ABOVE;\n\t}\n\telse if ( (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) &&\n\t\t\t(pAd->ApCliMlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))\n\t{\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_BELOW;\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\trf_channel = pAd->CommonCfg.Channel;\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t}\n\n\tAsicSetChannel(pAd, rf_channel, rf_bw, ext_ch, FALSE);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():BW_%s, CtrlChannel=%d, CentralChannel=%d \\n\",\n\t\t\t\t__FUNCTION__, (rf_bw == BW_40 ? \"40\" : \"20\"),\n\t\t\t\tpAd->CommonCfg.Channel,\n\t\t\t\tpAd->CommonCfg.CentralChannel));\n\n\t/* Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission */\n\trtmp_bbp_get_agc(pAd, &pAd->BbpTuning.R66CurrentValue, RX_CHAIN_0);\n\n\t//Enable MAC Tx/Rx\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Data);\n\tData |= 0x0C;\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Data);\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tVerify the support rate for different PHY type\n\n\tArguments:\n\t\tpAd \t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\t========================================================================\n*/\n// TODO: shiang-6590, modify this cause it's really a duplication of \"ApCliUpdateMlmeRate()\" in ap/ap_apcli.c\nVOID P2PUpdateMlmeRate(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\tMinimumRate;\n\tUCHAR\tProperMlmeRate; /*= RATE_54; */\n\tUCHAR\ti, j, RateIdx = 12; /* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */\n\tBOOLEAN\tbMatch = FALSE;\n\n\tswitch (pAd->CommonCfg.PhyMode) \n\t{\n\t\tcase WMODE_B:\n\t\t\tProperMlmeRate = RATE_11;\n\t\t\tMinimumRate = RATE_1;\n\t\t\tbreak;\n\t\tcase (WMODE_B | WMODE_G):\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_B | WMODE_A | WMODE_G | WMODE_GN | WMODE_AN):\n\t\tcase (WMODE_B | WMODE_G | WMODE_GN):\n#endif /* DOT11_N_SUPPORT */\n\t\t\tif ((pAd->ApCliMlmeAux.SupRateLen == 4) &&\n\t\t\t\t(pAd->ApCliMlmeAux.ExtRateLen == 0))\n\t\t\t\t/* B only AP */\n\t\t\t\tProperMlmeRate = RATE_11;\n\t\t\telse\n\t\t\t\tProperMlmeRate = RATE_24;\n\t\t\t\n\t\t\tif (pAd->ApCliMlmeAux.Channel <= 14)\n\t\t\tMinimumRate = RATE_1;\n\t\t\telse\n\t\t\t\tMinimumRate = RATE_6;\n\t\t\tbreak;\n\t\tcase (WMODE_A):\n#ifdef DOT11_N_SUPPORT\n\t\tcase (WMODE_GN):\t/* rt2860 need to check mlmerate for 802.11n */\n\t\tcase (WMODE_G | WMODE_GN):\n\t\tcase (WMODE_A | WMODE_G | WMODE_AN | WMODE_GN):\n\t\tcase (WMODE_A | WMODE_AN):\n\t\tcase (WMODE_AN):\t\n#endif /* DOT11_N_SUPPORT */\n\t\t\tProperMlmeRate = RATE_24;\n\t\t\tMinimumRate = RATE_6;\n\t\t\tbreak;\n\t\tcase (WMODE_A | WMODE_B | WMODE_G):\n\t\t\tProperMlmeRate = RATE_24;\n\t\t\tif (pAd->ApCliMlmeAux.Channel <= 14)\n\t\t\t   MinimumRate = RATE_1;\n\t\t\telse\n\t\t\t\tMinimumRate = RATE_6;\n\t\t\tbreak;\n\t\tdefault: /* error */\n\t\t\tProperMlmeRate = RATE_1;\n\t\t\tMinimumRate = RATE_1;\n\t\t\tbreak;\n\t}\n\n\tfor (i = 0; i < pAd->ApCliMlmeAux.SupRateLen; i++)\n\t{\n\t\tfor (j = 0; j < RateIdx; j++)\n\t\t{\n\t\t\tif ((pAd->ApCliMlmeAux.SupRate[i] & 0x7f) == RateIdTo500Kbps[j])\n\t\t\t{\n\t\t\t\tif (j == ProperMlmeRate)\n\t\t\t\t{\n\t\t\t\t\tbMatch = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\n\t\tif (bMatch)\n\t\t\tbreak;\n\t}\n\n\tif (bMatch == FALSE)\n\t{\n\t\tfor (i = 0; i < pAd->ApCliMlmeAux.ExtRateLen; i++)\n\t\t{\n\t\t\tfor (j = 0; j < RateIdx; j++)\n\t\t\t{\n\t\t\t\tif ((pAd->ApCliMlmeAux.ExtRate[i] & 0x7f) == RateIdTo500Kbps[j])\n\t\t\t\t{\n\t\t\t\t\tif (j == ProperMlmeRate)\n\t\t\t\t\t{\n\t\t\t\t\t\tbMatch = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t\n\t\t\tif (bMatch)\n\t\t\tbreak;\t\t\n\t\t}\n\t}\n\n\tif (bMatch == FALSE)\n\t{\n\t\tProperMlmeRate = MinimumRate;\n\t}\n\n\tif(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t{\t\n\t\tpAd->CommonCfg.MlmeRate = MinimumRate;\n\t\tpAd->CommonCfg.RtsRate = ProperMlmeRate;\n\t\tif (pAd->CommonCfg.MlmeRate >= RATE_6)\n\t\t{\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM;\n\t\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;\n\t\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = pAd->CommonCfg.MlmeRate;\n\t\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_CCK;\n\t\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = pAd->CommonCfg.MlmeRate;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPUpdateMlmeRate ==>   MlmeTransmit = 0x%x  \\n\" , pAd->CommonCfg.MlmeTransmit.word));\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tShutdown AP and free AP specific resources\n\t==========================================================================\n */\nVOID P2PAPShutdown(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"---> P2PAPShutdown\\n\"));\n\n\n\tMlmeRadioOff(pAd);\n\n#ifdef IGMP_SNOOP_SUPPORT\n\tMultiCastFilterTableReset(&pAd->pMulticastFilterTable);\n#endif /* IGMP_SNOOP_SUPPORT */\n\n\tNdisFreeSpinLock(&pAd->MacTabLock);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--- P2PAPShutdown\\n\"));\n}\n\nVOID P2PUserCfgInit(\n\tIN\tPRTMP_ADAPTER pAd)\n{\n\tUINT i, j;\n\n\t/* Set MBSS Default Configurations */\n\tpAd->ApCfg.BssidNum = MAX_MBSSID_NUM(pAd);\n\tfor(j = BSS0; j < pAd->ApCfg.BssidNum; j++)\n\t{\n\t\tpAd->ApCfg.MBSSID[j].AuthMode = Ndis802_11AuthModeOpen;\n\t\tpAd->ApCfg.MBSSID[j].WepStatus = Ndis802_11EncryptionDisabled;\n\t\tpAd->ApCfg.MBSSID[j].GroupKeyWepStatus = Ndis802_11EncryptionDisabled;\n\t\tpAd->ApCfg.MBSSID[j].DefaultKeyId = 0;\n\t\tpAd->ApCfg.MBSSID[j].WpaMixPairCipher = MIX_CIPHER_NOTUSE;\n\n#ifdef DOT1X_SUPPORT\n\t\tpAd->ApCfg.MBSSID[j].IEEE8021X = FALSE;\n\t\tpAd->ApCfg.MBSSID[j].PreAuth = FALSE;\n\n\t\t/* PMK cache setting */\n\t\tpAd->ApCfg.MBSSID[j].PMKCachePeriod = (10 * 60 * OS_HZ); /* unit : tick(default: 10 minute) */\n\t\tNdisZeroMemory(&pAd->ApCfg.MBSSID[j].PMKIDCache, sizeof(NDIS_AP_802_11_PMKID));\n\n\t\t/* dot1x related per BSS */\n\t\tpAd->ApCfg.MBSSID[j].radius_srv_num = 0;\n\t\tpAd->ApCfg.MBSSID[j].NasIdLen = 0;\n#endif /* DOT1X_SUPPORT */\n\n\t\t/* VLAN related */\n\t\tpAd->ApCfg.MBSSID[j].VLAN_VID = 0;\n\n\t\t/* Default MCS as AUTO */\n\t\tpAd->ApCfg.MBSSID[j].bAutoTxRateSwitch = TRUE;\n\t\tpAd->ApCfg.MBSSID[j].DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\n\t\t/* Default is zero. It means no limit. */\n\t\tpAd->ApCfg.MBSSID[j].MaxStaNum = 0;\n\t\tpAd->ApCfg.MBSSID[j].StaCount = 0;\n\t\n#ifdef WSC_AP_SUPPORT\n\t\t{\n\t\t\tPWSC_CTRL pWscControl;\n\t\t\tINT idx;\n#ifdef WSC_V2_SUPPORT\n\t\t\tPWSC_V2_INFO\tpWscV2Info;\n#endif /* WSC_V2_SUPPORT */\n\t\t\t/*\n\t\t\t\tWscControl cannot be zero here, because WscControl timers are initial in MLME Initialize \n\t\t\t\tand MLME Initialize is called before UserCfgInit.\n\t\t\t*/\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[j].WscControl;\n\t\t\tNdisZeroMemory(&pWscControl->RegData, sizeof(WSC_REG_DATA));\n\t\t\tNdisZeroMemory(&pAd->CommonCfg.WscStaPbcProbeInfo, sizeof(WSC_STA_PBC_PROBE_INFO));\n\t\t\tpWscControl->WscMode = 1;\n\t\t\tpWscControl->WscConfStatus = 1;\n\t\t\tpWscControl->WscConfigMethods= 0x0184;\n\t\t\tpWscControl->RegData.ReComputePke = 1;\n\t\t\tpWscControl->lastId = 1;\n\t\t\t/*pWscControl->EntryIfIdx = (MIN_NET_DEVICE_FOR_MBSSID | j); */\n\t\t\tpWscControl->pAd = pAd;\n\t\t\tpWscControl->WscRejectSamePinFromEnrollee = FALSE;\n\t\t\tpAd->CommonCfg.WscPBCOverlap = FALSE;\n\t\t\tpWscControl->WscConfMode = 0;\n\t\t\tpWscControl->WscStatus = 0;\n\t\t\tpWscControl->WscState = 0;\n\t\t\tpWscControl->WscPinCode = 0;\n\t\t\tpWscControl->WscLastPinFromEnrollee = 0;\n\t\t\tpWscControl->WscEnrollee4digitPinCode = FALSE;\n\t\t\tpWscControl->WscEnrolleePinCode = 0;\n\t\t\tpWscControl->WscSelReg = 0;\n\t\t\tpWscControl->WscUseUPnP = 0;\n\t\t\tpWscControl->bWCNTest = FALSE;\n\t\t\tpWscControl->WscKeyASCII = 0; /* default, 0 (64 Hex) */\n\n\t\t\t/*\n\t\t\t\tEnrollee 192 random bytes for DH key generation\n\t\t\t*/\n\t\t\tfor (idx = 0; idx < 192; idx++)\n\t\t\t\tpWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd);\n\n\t\t\t/* Enrollee Nonce, first generate and save to Wsc Control Block */\n\t\t\tfor (idx = 0; idx < 16; idx++)\n\t\t\t{\n\t\t\t\tpWscControl->RegData.SelfNonce[idx] = RandomByte(pAd);\n\t\t\t}\n\t\t\tNdisZeroMemory(&pWscControl->WscDefaultSsid, sizeof(NDIS_802_11_SSID));\n\t\t\tNdisZeroMemory(&pWscControl->Wsc_Uuid_Str[0], UUID_LEN_STR);\n\t\t\tNdisZeroMemory(&pWscControl->Wsc_Uuid_E[0], UUID_LEN_HEX);\n\t\t\tpWscControl->bCheckMultiByte = FALSE;\n\n#ifdef WSC_V2_SUPPORT\n\t\t\tpWscV2Info = &pWscControl->WscV2Info;\n\t\t\tpWscV2Info->bWpsEnable = TRUE;\n\t\t\tpWscV2Info->ExtraTlv.TlvLen = 0;\n\t\t\tpWscV2Info->ExtraTlv.TlvTag = 0;\n\t\t\tpWscV2Info->ExtraTlv.pTlvData = NULL;\n\t\t\tpWscV2Info->ExtraTlv.TlvType = TLV_ASCII;\n\t\t\tpWscV2Info->bEnableWpsV2 = TRUE;\n#endif /* WSC_V2_SUPPORT */\n\t\t}\n#endif /* WSC_AP_SUPPORT */\n\n\n\t\tfor(i = 0; i < WLAN_MAX_NUM_OF_TIM; i++)\n\t\t\tpAd->ApCfg.MBSSID[j].TimBitmaps[i] = 0;\n\t}\n\n\tpAd->ApCfg.DtimCount  = 0;\n\tpAd->ApCfg.DtimPeriod = DEFAULT_DTIM_PERIOD;\n\n\tpAd->ApCfg.ErpIeContent = 0;\n\n\tpAd->ApCfg.StaIdleTimeout = MAC_TABLE_AGEOUT_TIME;\n\n#ifdef IDS_SUPPORT\n\t/* Default disable IDS threshold and reset all IDS counters */\n\tpAd->ApCfg.IdsEnable = FALSE;\n\tpAd->ApCfg.AuthFloodThreshold = 0;\n\tpAd->ApCfg.AssocReqFloodThreshold = 0;\n\tpAd->ApCfg.ReassocReqFloodThreshold = 0;\n\tpAd->ApCfg.ProbeReqFloodThreshold = 0;\n\tpAd->ApCfg.DisassocFloodThreshold = 0;\n\tpAd->ApCfg.DeauthFloodThreshold = 0;\n\tpAd->ApCfg.EapReqFloodThreshold = 0;\n\tRTMPClearAllIdsCounter(pAd);\n#endif /* IDS_SUPPORT */\n\n#ifdef WSC_INCLUDED\n\tpAd->WriteWscCfgToDatFile = 0xFF;\n\tpAd->WriteWscCfgToAr9DatFile = FALSE;\n#ifdef CONFIG_AP_SUPPORT\n\tpAd->bWscDriverAutoUpdateCfg = TRUE;\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n\tfor(j = 0; j < MAX_APCLI_NUM; j++) \n\t{\n\t\tpAd->ApCfg.ApCliTab[j].AuthMode = Ndis802_11AuthModeOpen;\n\t\tpAd->ApCfg.ApCliTab[j].WepStatus = Ndis802_11WEPDisabled;\n\t\tpAd->ApCfg.ApCliTab[j].bAutoTxRateSwitch = TRUE;\n\t\tpAd->ApCfg.ApCliTab[j].DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\t}\n\n\t{\n\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\t\tpP2PCtrl->P2p_OpMode = P2P_CONCURRENT;\n\n\t\tpP2PCtrl->bKeepSlient = FALSE;\n\t\tpP2PCtrl->NoAIndex = MAX_P2P_GROUP_SIZE;\n/*\t\tpP2PCtrl->PortNumber = 0; */\n\t\tpP2PCtrl->ListenChannel = 1;\n\t\tpP2PCtrl->GroupChannel = 11;\n\t\tpP2PCtrl->GroupOpChannel = 11;\n\t\tP2pSetListenIntBias(pAd, 3);\n\t\tpP2PCtrl->DeviceNameLen = 10;\n\t\tpP2PCtrl->DeviceName[0] = 'R';\n\t\tpP2PCtrl->DeviceName[1] = 'a';\n\t\tpP2PCtrl->DeviceName[2] = 'l';\n\t\tpP2PCtrl->DeviceName[3] = 'i';\n\t\tpP2PCtrl->DeviceName[4] = 'n';\n\t\tpP2PCtrl->DeviceName[5] = 'k';\n\t\tpP2PCtrl->DeviceName[6] = '-';\n\t\tpP2PCtrl->DeviceName[7] = 'P';\n\t\tpP2PCtrl->DeviceName[8] = 0x32;\n\t\tpP2PCtrl->DeviceName[9] = 'P';\n\n/*\t\tpP2PCtrl->P2PDiscoProvState = P2P_DISABLE; */\n\t\tpP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE;\n\t\t/* Set Dpid to \"not specified\". it means, GUI doesn't set for connection yet. */\n\t\tpP2PCtrl->Dpid = DEV_PASS_ID_NOSPEC;\n\t\tpP2PCtrl->P2pManagedParm.APP2pManageability = 0xff;\n\t\tpP2PCtrl->P2pManagedParm.ICSStatus = ICS_STATUS_DISABLED; \n\t\tP2pGroupTabInit(pAd);\n\t\tP2pCrednTabClean(pAd);\n\t\tP2pScanChannelDefault(pAd);\n\t\tRTMPMoveMemory(pAd->P2pCfg.SSID, WILDP2PSSID, WILDP2PSSIDLEN);\n/*\t\tRTMPMoveMemory(pAd->P2pCfg.Bssid, pAd->P2pCfg.CurrentAddress, MAC_ADDR_LEN); */\n\t\tpP2PCtrl->SSIDLen = WILDP2PSSIDLEN;\n\t\tpP2PCtrl->GONoASchedule.bValid = FALSE;\n\t\tpP2PCtrl->GONoASchedule.bInAwake = TRUE;\n\t\tpP2PCtrl->GONoASchedule.bWMMPSInAbsent = FALSE; /* Set to FALSE if changes state to Awake */\n\t\tpP2PCtrl->GONoASchedule.Token = 0;\n\t\tpP2PCtrl->GoIntentIdx = 0;\n\t\tpP2PCtrl->Rule = P2P_IS_DEVICE;\n\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\tpP2PCtrl->DefaultConfigMethod = P2P_REG_CM_DISPLAY;\n\t\tpP2PCtrl->bExtListen = FALSE;\n\t\tpP2PCtrl->bIntraBss = FALSE;\n\t\tpP2PCtrl->ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\tpP2PCtrl->ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t\tpP2PCtrl->GONoASchedule.Count = 0;\n\t\tpP2PCtrl->GONoASchedule.Duration = 0;\n\t\tpP2PCtrl->GONoASchedule.Interval = 0;\n\t}\n}\n\nVOID P2pInit(\n\tIN PRTMP_ADAPTER \t\t\t\tpAd,\n\tIN RTMP_OS_NETDEV_OP_HOOK\t\t*pNetDevOps)\n{\n\tPNET_DEV\tnew_dev_p;\n\tAPCLI_STRUCT\t*pApCliEntry;\n\n\t/* sanity check to avoid redundant virtual interfaces are created */\n\tif (pAd->flg_p2p_init != FALSE)\n\t\treturn;\n\t/* End of if */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s --->\\n\", __FUNCTION__));\n\n\t/* init */\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = NULL;\n\tpAd->ApCfg.ApCliTab[MAIN_MBSSID].dev = NULL;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID];\n\n    /* create virtual network interface */\n\t{\n\t\tUINT32 MC_RowID = 0, IoctlIF = 0;\n\t\tnew_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_P2P, MAIN_MBSSID, sizeof(PRTMP_ADAPTER), INF_P2P_DEV_NAME);\n\n\t\tif (new_dev_p == NULL)\n\t\t{\n\t\t\t/* allocation fail, exit */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Allocate network device fail (MBSS)...\\n\"));\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Register P2P IF (%s)\\n\", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p)));\n\t\t}\n\n\t\tRTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd);\n\n\n\t\tpNetDevOps->priv_flags = INT_P2P;\t\t\t/* We are virtual interface */\n\t\tpNetDevOps->needProtcted = TRUE;\n\n\t\t/* Init MAC address of virtual network interface */\n\t\tCOPY_MAC_ADDR(pAd->P2PCurrentAddress, pAd->CurrentAddress);\n\t\t/* \t\n\t\t\tRefer to HW definition - \n\t\t\t\t\t\tBit1 of MAC address Byte0 is local administration bit \n\t\t\t\t\t\tand should be set to 1 in extended multiple BSSIDs'\n\t\t\t\t\t\tBit3~ of MAC address Byte0 is extended multiple BSSID index.\n\t\t*/\n\t\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\t\tpAd->P2PCurrentAddress[0] += 2; \n\t\telse\n\t\t{\n#ifdef P2P_ODD_MAC_ADJUST\n\t\t\tif (pAd->P2PCurrentAddress[5] & 0x01 == 0x01)\n\t\t\t\tpAd->P2PCurrentAddress[5] -= 1;\n\t\t\telse\n#endif /* P2P_ODD_MAC_ADJUST */\n\t\tpAd->P2PCurrentAddress[5] += FIRST_MBSSID;\n\t\t}\n\t\tNdisMoveMemory(&pNetDevOps->devAddr[0], &pAd->P2PCurrentAddress[0], MAC_ADDR_LEN);\n\t\t\n\t\t/* backup our virtual network interface */\n\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = new_dev_p;\n\t\tCOPY_MAC_ADDR(pAd->ApCfg.MBSSID[MAIN_MBSSID].Bssid, pAd->P2PCurrentAddress);\n\n\t\tpApCliEntry->dev = new_dev_p;\n\t\tCOPY_MAC_ADDR(pApCliEntry->CurrentAddress, pAd->P2PCurrentAddress);\n\n\t\tCOPY_MAC_ADDR(pAd->P2pCfg.CurrentAddress, pAd->P2PCurrentAddress);\n\t\tpAd->p2p_dev = new_dev_p;\n\t\t\n\t\t/* register this device to OS */\n\t\tRtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps);\n\t}\n\n\tpAd->CommonCfg.BeaconPeriod = 100;\n\tpAd->ApCfg.DtimPeriod = 1;\n\tpAd->CommonCfg.DisableOLBCDetect = 0;\n\n\tP2pGetRandomSSID(pAd, pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, &(pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen));\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].AuthMode = Ndis802_11AuthModeOpen;\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].WepStatus = Ndis802_11EncryptionDisabled;\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].DesiredTransmitSetting.field.MCS = pAd->StaCfg.DesiredTransmitSetting.field.MCS;\n\n\tif ((pAd->CommonCfg.bWmmCapable) || WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bWmmCapable = TRUE;\n\n\t/*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_P2P_GO); */\n\t/*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_P2P_CLI); */\n\n\tpAd->flg_p2p_init = TRUE;\n\tpAd->ApCfg.ApCliTab[MAIN_MBSSID].AuthMode = Ndis802_11AuthModeOpen;\n\tpAd->ApCfg.ApCliTab[MAIN_MBSSID].WepStatus = Ndis802_11WEPDisabled;\n\tpAd->ApCfg.ApCliTab[MAIN_MBSSID].DesiredTransmitSetting.field.MCS = pAd->StaCfg.DesiredTransmitSetting.field.MCS;\n\tRTMPSetIndividualHT(pAd, MIN_NET_DEVICE_FOR_APCLI);\n\tpAd->flg_apcli_init = TRUE;\n\n\tpAd->flg_p2p_OpStatusFlags = P2P_DISABLE;\n\n\tWscGenerateUUID(pAd, &pAd->P2pCfg.Wsc_Uuid_E[0], &pAd->P2pCfg.Wsc_Uuid_Str[0], 0, FALSE);\n\tNdisMoveMemory(&pAd->P2pCfg.DevInfo.Uuid[0], &pAd->P2pCfg.Wsc_Uuid_E[0], UUID_LEN_HEX);\n}\n\nINT P2P_OpenPre(\n\tIN\tPNET_DEV\t\t\t\t\tpDev)\n{\n\tPRTMP_ADAPTER pAd;\n\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\tif (ADHOC_ON(pAd))\n\t\treturn -1;\n\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = FALSE;\n\treturn 0;\n}\n\nINT P2P_OpenPost(\n\tIN\tPNET_DEV\t\t\t\t\tpDev)\n{\n\tPRTMP_ADAPTER pAd;\n\tPMULTISSID_STRUCT\tpMbss;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\n\tif (ADHOC_ON(pAd))\n\t\treturn -1;\n\t\n\tpMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n\t/* re-copy the MAC to virtual interface to avoid these MAC = all zero, \n\t\twhen re-open the ra0,\n\t\ti.e. ifconfig ra0 down, ifconfig ra0 up, ifconfig ra0 down, ifconfig up ... */\n\t\n\tCOPY_MAC_ADDR(pMbss->Bssid, pAd->CurrentAddress);\n\t\n\t/*\t\n\t\tRefer to HW definition - \n\t\t\t\t\tBit1 of MAC address Byte0 is local administration bit \n\t\t\t\t\tand should be set to 1 in extended multiple BSSIDs'\n\t\t\t\t\tBit3~ of MAC address Byte0 is extended multiple BSSID index.\n\t*/\n\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\tpMbss->Bssid[MAIN_MBSSID] += 2; \t\n\telse\n\t{\n#ifdef P2P_ODD_MAC_ADJUST\n\t\tif ((pMbss->Bssid[5] & 0x01) == 0x01)\n\t\t\tpMbss->Bssid[5] -= 1;\n\t\telse\n#endif /* P2P_ODD_MAC_ADJUST */\n\tpMbss->Bssid[5] += FIRST_MBSSID;\n\t}\n\tif (pMbss->MSSIDDev != NULL)\n\t{\n\t\tNdisMoveMemory(RTMP_OS_NETDEV_GET_PHYADDR(pMbss->MSSIDDev), \n\t\t\t\t\t\t\tpMbss->Bssid,\n\t\t\t\t\t\t\tMAC_ADDR_LEN);\n\t}\n\n\tP2PCfgInit(pAd);\n\t/*P2P_GoStartUp(pAd, MAIN_MBSSID); */\n\t/*P2P_CliStartUp(pAd); */\n\t\n\t/* P2P Enable */\n\tP2pEnable(pAd);\n\n\tNdisAllocateSpinLock(pAd, &pAd->P2pTableSemLock);\n#ifdef RTMP_MAC_USB\n\tRTMPInitTimer(pAd, &pAd->CommonCfg.BeaconUpdateTimer, GET_TIMER_FUNCTION(BeaconUpdateExec), pAd, TRUE);\n#endif /* RTMP_MAC_USB */\n\n\treturn 0;\n}\n\nINT P2P_Close(\n\tIN\tPNET_DEV\t\t\t\t\tpDev)\n{\n\tPRTMP_ADAPTER pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\n\tif (P2P_CLI_ON(pAd))\n\t\tP2P_CliStop(pAd);\n\telse if (P2P_GO_ON(pAd))\n\t\tP2P_GoStop(pAd);\n\n\tP2pGroupTabDisconnect(pAd, FALSE);\n\t{\n\t\tUINT32 Value;\n\t\t/* Disable pre-tbtt interrupt */\n\t\tRTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n\t\tValue &=0xe;\n\t\tRTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\t}\n\n\t/*update beacon Sync */\n\t/*if rausb0 is up => stop beacon */\n\t/*if rausb0 is down => we will call AsicDisableSync() in usb_rtusb_close_device() */\n\tif (INFRA_ON(pAd))\n\t\tAsicEnableBssSync(pAd);\n\telse if (ADHOC_ON(pAd))\n\t\tAsicEnableIbssSync(pAd);\n\telse\n\t\tAsicDisableSync(pAd);\n\n\tNdisFreeSpinLock(&pAd->P2pTableSemLock);\n\treturn 0;\n}\n\nVOID P2P_Remove(\n\tIN PRTMP_ADAPTER\t\t\t\tpAd)\n{\n\tMULTISSID_STRUCT *pMbss;\n\n\n\tRtmpOSNetDevProtect(1);\n\tif (pAd->p2p_dev)\n\t{\n\t\tRtmpOSNetDevDetach(pAd->p2p_dev);\n\t\tRtmpOSNetDevProtect(0);\n\t\tRtmpOSNetDevFree(pAd->p2p_dev);\n\n\t\tRtmpOSNetDevProtect(1);\n\t\t/* clear it as NULL to prevent latter access error */\n\t\tpAd->p2p_dev = NULL;\n\t\tpAd->flg_p2p_init = FALSE;\n\n\t\tpMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n\t\tpMbss->MSSIDDev = NULL;\n\n\t\tpAd->ApCfg.ApCliTab[MAIN_MBSSID].dev = NULL;\n\t\tpAd->flg_apcli_init = FALSE;\n\t}\n\tRtmpOSNetDevProtect(0);\n\n\t\n} /* End of P2P_Remove */\n\nint P2P_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc)\n{\n\tPRTMP_ADAPTER pAd;\n\tPAPCLI_STRUCT pApCli;\n\t\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(pDev);\n\tASSERT(pAd);\n\t\n#ifdef RALINK_ATE\n\t\tif (ATE_ON(pAd))\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE);\n\t\t\treturn 0;\n\t\t}\n#endif /* RALINK_ATE */\n\t\tif ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||\n\t\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\t\t\t||\n\t\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)))\n\t\t{\n\t\t\t/* wlan is scanning/disabled/reset */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE);\n\t\t\t/*printk(\"1. P2P_VirtualIF_PacketSend @@@@@\\n\"); */\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tif(!(RTMP_OS_NETDEV_STATE_RUNNING(pDev)))\n\t\t{\n\t\t\t/* the interface is down */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE);\n\t\t\t/*printk(\"2. P2P_VirtualIF_PacketSend @@@@@\\n\"); */\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tif (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tpApCli = (PAPCLI_STRUCT)&pAd->ApCfg.ApCliTab;\n\t\n\t\t\tif (pApCli[MAIN_MBSSID].Valid != TRUE)\n\t\t\t{\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE);\n\t\t\t\t/*printk(\"3. P2P_VirtualIF_PacketSend @@@@@\\n\"); */\n\t\t\t\treturn 0;\n\t\t\t}\n\t\n\t\t\t/* find the device in our ApCli list */\n\t\t\tif (pApCli[MAIN_MBSSID].dev == pDev)\n\t\t\t{\n\t\t\t\t/* ya! find it */\n\t\t\t\tpAd->RalinkCounters.PendingNdisPacketCount ++;\n\t\t\t\t/*NdisZeroMemory((PUCHAR)&(RTPKT_TO_OSPKT(pPktSrc))->cb[CB_OFF], 15);*/\n\t\t\t\tNdisZeroMemory((PUCHAR)(GET_OS_PKT_CB(pPktSrc) + CB_OFF), 15);\n\t\t\t\tRTMP_SET_PACKET_SOURCE(pPktSrc, PKTSRC_NDIS);\n\t\t\t\tRTMP_SET_PACKET_MOREDATA(pPktSrc, FALSE);\n\t\t\t\tRTMP_SET_PACKET_NET_DEVICE_APCLI(pPktSrc, MAIN_MBSSID);\n\t\t\t\tSET_OS_PKT_NETDEV(pPktSrc, pAd->net_dev);\n\t\t\t\tRTMP_SET_PACKET_OPMODE(pPktSrc, OPMODE_AP);\n\t\n\t\n\t\t\t\t/* transmit the packet */\n\t\t\t\t/*return rt28xx_packet_xmit(RTPKT_TO_OSPKT(skb_p)); */\n\t\t\t\treturn Func(RTPKT_TO_OSPKT(pPktSrc));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*printk(\"4. P2P_VirtualIF_PacketSend @@@@@\\n\"); */\n\t\t\t/* find the device in our p2p list */\n\t\t\tif (pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev == pDev)\n\t\t\t{\n\t\t\t\t/* ya! find it */\n\t\t\t\tpAd->RalinkCounters.PendingNdisPacketCount ++;\n\t\t\t\t/*NdisZeroMemory((PUCHAR)&(RTPKT_TO_OSPKT(pPktSrc))->cb[CB_OFF], 15);*/\n\t\t\t\tNdisZeroMemory((PUCHAR)(GET_OS_PKT_CB(pPktSrc) + CB_OFF), 15);\n\t\t\t\tRTMP_SET_PACKET_SOURCE(pPktSrc, PKTSRC_NDIS);\n\t\t\t\tRTMP_SET_PACKET_MOREDATA(pPktSrc, FALSE);\n\t\t\t\tRTMP_SET_PACKET_NET_DEVICE_P2P(pPktSrc, MAIN_MBSSID);\n\t\t\t\tSET_OS_PKT_NETDEV(pPktSrc, pAd->net_dev);\n\t\t\t\tRTMP_SET_PACKET_OPMODE(pPktSrc, OPMODE_AP);\n\t\n\t\n\t\t\t\t/* transmit the packet */\n\t\t\t\t/*return rt28xx_packet_xmit(RTPKT_TO_OSPKT(skb_p));*/\n\t\t\t\treturn Func(RTPKT_TO_OSPKT(pPktSrc));\n\t\t\t}\n\t\t}\n\t\n\t\tRELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE);\n\t\n\t\treturn 0;\n}\n\nINT\tP2P_GoSetCommonHT(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tOID_SET_HT_PHYMODE\tSetHT;\n\t\n\tif (!WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\t/* Clear previous HT information */\n\t\tRTMPDisableDesiredHtInfo(pAd);\n\t\treturn FALSE;\n\t}\n\n\tSetHT.PhyMode = (RT_802_11_PHY_MODE)pAd->CommonCfg.PhyMode;\n\tSetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath);\n\tSetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;\n\tSetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;\n\tSetHT.MCS = MCS_AUTO;\n\tSetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;\n\tSetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;\n\tSetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI; \n\n\tif (INFRA_ON(pAd))\n\t{\n\t\tif (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40)\n\t\t\tSetHT.ExtOffset = (UCHAR)pAd->StaActive.SupportedHtPhy.ExtChanOffset;\n\t}\n\n\tRTMPSetHT(pAd, &SetHT);\n\n\treturn TRUE;\n}\n\nINT P2PGetEntryCnt(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\n\tif (P2P_CLI_ON(pAd))\n\t{\n\t\treturn 1;\n\t}\n\telse if (P2P_GO_ON(pAd))\n\t{\n\t\tUINT32 i, p2pEntryCnt=0;\n\t\tMAC_TABLE_ENTRY *pEntry;\n\t\tUCHAR           AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t{\n\t\t\t\tif ( !NdisEqualMemory(AllZero, pEntry->Addr, MAC_ADDR_LEN)) {\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pEntry->Addr)));\n\t\t\t\t\tp2pEntryCnt++;\n\t\t\t\t} \n\t\t\t}\n\t\t}\n\n\t\treturn p2pEntryCnt;\n\t}\n\n}\n\n"
  },
  {
    "path": "src/common/p2p_action.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. P2P is a Task Group of WFA.\n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\tJan Lee         2010-05-21    created for Peer-to-Peer Action frame(Wifi Direct)\n*/\n#include \"rt_config.h\"\nextern UCHAR\tP2POUIBYTE[];\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tP2P state machine init. P2P state machine starts to function after P2P group is formed. the main task is support power save\n\t\tmechanism.\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2PStateMachineInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tSTATE_MACHINE *Sm, \n\tOUT STATE_MACHINE_FUNC Trans[]) \n{\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, (ULONG)MAX_P2P_STATE, \n\t\t(ULONG)MAX_P2P_MSG, (STATE_MACHINE_FUNC)Drop, P2P_IDLE_STATE, P2P_IDLE_STATE);\n\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_NOA, (STATE_MACHINE_FUNC)MlmeP2pNoaAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_PRESENCE_REQ, (STATE_MACHINE_FUNC)MlmeP2pPresReqAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_PRESENCE_RSP, (STATE_MACHINE_FUNC)MlmeP2pPresRspAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_GO_DIS_REQ, (STATE_MACHINE_FUNC)MlmeP2pGoDiscoverAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_GAS_INT_REQ, (STATE_MACHINE_FUNC)MlmeGASIntialReqAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_GAS_INT_RSP, (STATE_MACHINE_FUNC)MlmeGASIntialRspAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_GAS_CB_REQ, (STATE_MACHINE_FUNC)MlmeGASComebackReqAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_MLME_P2P_GAS_CB_RSP, (STATE_MACHINE_FUNC)MlmeGASComebackRspAction);\n\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_PEER_P2P_NOA, (STATE_MACHINE_FUNC)PeerP2pNoaAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_PEER_P2P_PRESENCE_REQ, (STATE_MACHINE_FUNC)PeerP2pPresReqAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_PEER_P2P_PRESENCE_RSP, (STATE_MACHINE_FUNC)PeerP2pPresRspAction);\n\tStateMachineSetAction(Sm, P2P_IDLE_STATE, MT2_PEER_P2P_GO_DIS_REQ, (STATE_MACHINE_FUNC)PeerP2pGoDiscoverAction);\n\n\t/* init all P2P ctrl state. */\n\tpAd->P2pCfg.ActionState = P2P_IDLE_STATE;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSupport WiFi Direct Certification test for P2P Client to send Presence Request Test Case..\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pSendServiceReqCmd(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR\t p2pindex)\n{\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSupport WiFi Direct Certification test for P2P Client to send Presence Request Test Case..\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pSendPresenceReqCmd(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t p2pindex) \n{\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tP2P Action frame differs only in InBuffer. Others are all common to all ACtion Subtype\n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID MlmeP2pCommonAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tOUISubType,\n\tIN UCHAR\t\tToken,\n\tIN PUCHAR\t\tpInBuffer,\n\tIN UCHAR\t\tInBufferLen,\n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tPMLME_P2P_ACTION_STRUCT \t  pGoReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg;\n\tPUCHAR\t\t   pOutBuffer = NULL;\n\tNDIS_STATUS \tNStatus;\n\tULONG\t\tFrameLen = 0;\n\tFRAME_P2P_ACTION\t\tFrame;\n\tULONG\t\tTmpLen;\n\tUCHAR\t\ti;\n\tPUCHAR\t\tpDest;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\treturn;\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\" TO= %x %x %x %x %x %x  \\n\",  PRINT_MAC(pGoReq->Addr)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\" Bssid= %x %x %x %x %x %x  \\n\",\tPRINT_MAC(pP2PCtrl->CurrentAddress)));\n\n\tActHeaderInit(pAd, &Frame.Hdr, pGoReq->Addr, pP2PCtrl->CurrentAddress, pP2PCtrl->CurrentAddress);\n\tFrame.Category = MT2_ACT_VENDOR; /* 0x7F */\n\tRTMPMoveMemory(&Frame.OUI[0], P2POUIBYTE, 4);\n\tFrame.OUISubType = OUISubType;\n\tFrame.Token = Token;\n\t/* No Element */\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t\t\tsizeof(FRAME_P2P_ACTION),\t&Frame,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tif ((InBufferLen > 0) && (pInBuffer != NULL))\n\t{\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\t\t\t\t&TmpLen,\n\t\t\t\t\t\t\tInBufferLen,\tpInBuffer,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tpDest = (PUCHAR)&Frame;\n\tfor (i = 0; i <FrameLen; )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\": %x %x %x %x %x %x %x %x %x \\n\", *(pDest+i), *(pDest+i+1), *(pDest+i+2), \n\t\t*(pDest+i+3), *(pDest+i+4), *(pDest+i+5), *(pDest+i+6), *(pDest+i+7), *(pDest+i+8)));\n\t\ti = i + 9;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Common P2P ACT request.\t FrameLen = %ld.  \\n\", FrameLen));\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSend Publiac action frame. But with ACtion is GAS_INITIAL_REQ (11).\n\t\t802.11u. 7.4.7.10\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID MlmeGASIntialReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\tPMLME_P2P_ACTION_STRUCT       pReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg;\n\tPHEADER_802_11\tpHeader;\n\tPUCHAR\tpAdProtocolElem;\n\tPUCHAR\tpQueryReq;\n\tPUCHAR\t\tpOutBuffer;\n\tULONG\t\tFrameLen = 0;\n\tPUCHAR\t\tpDest;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR pServLen = NULL, pQueryLen = NULL, pTotalQueryLen = NULL;\n\tUSHORT ServLen = 0, QueryLen = 0, TotalQueryLen = 0;\n\tINT i, iSubId;\n\tUCHAR\tAnqpQueryInfoId[2] = {0xdd, 0xdd};\n\tULONG tmpValue = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeGASIntialReqAction.Token = %d\\n\", pAd->P2pCfg.Token));\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: TO %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\t__FUNCTION__, PRINT_MAC(pReq->Addr)));\n\t\n\tpHeader = (PHEADER_802_11)pOutBuffer;\n\tActHeaderInit(pAd, pHeader,  pReq->Addr, pP2PCtrl->CurrentAddress, pReq->Addr);\n\tFrameLen += sizeof(HEADER_802_11);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Use Token = %d. \\n\", pP2PCtrl->Token));\n\n\tpDest = pOutBuffer + sizeof(HEADER_802_11);\n\t/* Category */\n\t*pDest = CATEGORY_PUBLIC;\n\t/* Action */\n\t*(pDest + 1) = ACTION_GAS_INITIAL_REQ;\n\t/* Dialog Token */\n\t*(pDest + 2) = pP2PCtrl->Token;\n\n\tpDest += 3;\n\tFrameLen += 3;\n\t/* Advertisement Protocol Information Element */\n\t/* Element ID */\n\t*pDest = IE_ADVERTISEMENT_PROTO;\n\t/* Length */\n\t*(pDest + 1) = 2;\n\t/* Advertisement Protocol Tuple */\n\t/* Query Response Length Limit(7b) + PAME-BI(1b) */\n\t*(pDest+2) = 0;\n\t/* Advertisement Protocol ID */\n\t*(pDest + 3) = ACCESS_NETWORK_QUERY_PROTOCOL; /* ANQP */\n\tpDest += 4;\n\tFrameLen += 4;\n\t/* Query Request Length */\n\tpTotalQueryLen = pDest;\n\tpDest += 2;\n\tFrameLen += 2;\n\t/* ANQP Query Request */\n\t/* Info ID (56797) */\n\tRTMPMoveMemory(pDest, AnqpQueryInfoId, 2);\n\t/* Length */\n\tpQueryLen = (pDest + 2);\n\t/* Vendor Specific OUI for P2P defined by WFA. */\n\tRTMPMoveMemory(pDest + 4, P2POUIBYTE, 4);\n\tpDest += 8;\n\tFrameLen += 8;\n\t/* Service Update Indicator */\n\t*pDest = 0;\n\t*(pDest + 1) = 0;\n\t/* Length */\n\tpDest += 2;\n\tFrameLen += 2;\n#ifdef WFD_SUPPORT\n\tif (pAd->StaCfg.WfdCfg.bWfdEnable)\n\t{\n\tfor (i = 0; i < WFD_DEVICE_TYPE_END; i++)\n\t{\n\t\tServLen = 0;\n\t\tpServLen = pDest;\n\t\tpDest += 2;\n\t\tFrameLen += 2;\n\n\t\t/* Service Protocol Type */\n\t\t*pDest = SERVICE_PROTOCOL_TYPE_WFD; /* WiFi-Display */\n\t\tpDest += 1;\n\t\t\n\t\t/* Service Transaction ID */\n\t\t*pDest = 0;\n\t\tpDest += 1;\n\n\t\t/* Requested Device Role, add for WFD Spec. D1.38 and above */\n\t\tswitch (i)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\t*pDest = WFD_SOURCE;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\t*pDest = WFD_PRIMARY_SINK;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t*pDest = WFD_SECONDARY_SINK;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t*pDest = WFD_SOURCE_PRIMARY_SINK;\n\t\t\t\tbreak;\n\t\t}\n\t\tpDest += 1;\n\n\t\tFrameLen += 3;\n\t\tServLen += 3; /* Including Requested Device Role */\n\n\t\t/* List of WFD Subelement IDs */\n\t\tfor (iSubId = 0; iSubId < SUBID_WFD_END; iSubId++)\n\t\t{\n\t\t\tif (pAd->StaCfg.WfdCfg.WfdSerDiscCapable & (0x01 << iSubId))\n\t\t\t{\n\t\t\t\t*pDest = iSubId;\n\t\t\t\tFrameLen += 1;\n\t\t\t\tServLen += 1;\n\t\t\t\tpDest += 1;\n\t\t\t}\n\t\t}\n\t\ttmpValue = cpu2le16(ServLen);\n\t\tRTMPMoveMemory(pServLen, &tmpValue, 2);\n\t\tQueryLen += ServLen + 2;\n\t\t}\n\t}\n#endif /* WFD_SUPPORT */\n\tQueryLen += 6;\n\ttmpValue = cpu2le16(QueryLen);\n\tRTMPMoveMemory(pQueryLen, &tmpValue, 2);\n\tTotalQueryLen = QueryLen + 4;\n\ttmpValue = cpu2le16(TotalQueryLen);\n\tRTMPMoveMemory(pTotalQueryLen, &tmpValue, 2);\n\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSend Publiac action frame. But with ACtion is GAS_INITIAL_RSP (12).\n\t\t802.11u. 7.4.7.10\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID MlmeGASIntialRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\tPMLME_P2P_ACTION_STRUCT       pReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg;\n\tPHEADER_802_11\tpHeader;\n\tPUCHAR\tpAdProtocolElem;\n\tPUCHAR\tpQueryRsp;\n\tPUCHAR\t\tpOutBuffer;\n\tULONG\t\tFrameLen = 0;\n\tPUCHAR\t\tpDest;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR pServLen = NULL, pQueryLen = NULL, pTotalQueryLen = NULL;\n\tUSHORT ServLen = 0, QueryLen = 0, TotalQueryLen = 0;\n\tPRT_P2P_CLIENT_ENTRY\tpP2pEntry = NULL;\n\tUCHAR\tAnqpQueryInfoId[2] = {0xdd, 0xdd};\t\n\tUINT32 TempLen = 0;\n\tULONG tmpValue = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeGASIntialRspAction. \\n\"));\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tpP2pEntry = &pAd->P2pTable.Client[pReq->TabIndex];\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeGASIntialRspAction.  TO %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\tPRINT_MAC(pReq->Addr)));\n\t\n\tpHeader = (PHEADER_802_11)pOutBuffer;\n\tActHeaderInit(pAd, pHeader,  pReq->Addr, pAd->P2PCurrentAddress, pAd->P2PCurrentAddress);\n\tFrameLen = sizeof(HEADER_802_11);\n\n\tpDest = pOutBuffer + sizeof(HEADER_802_11);\n\t/* Category */\n\t*pDest = CATEGORY_PUBLIC;\n\t/* Action */\n\t*(pDest+1) = ACTION_GAS_INITIAL_RSP;\n\t/* Dialog Token */\n\t*(pDest+2) = pP2pEntry->DialogToken;\n\t/* Status Code */\n\t*(pDest+3) = 0;\n\t*(pDest+4) = 0;\n\t/* GAS Comeback Delay */\n\t*(pDest+5) = 0;\n\t*(pDest+6) = 0;\n\tpDest += 7;\n\tFrameLen += 7;\n\n\t/* Advertisement Protocol information element */\n\t/* Element ID */\n\t*pDest = IE_ADVERTISEMENT_PROTO;\n\t/* Length */\n\t*(pDest+1) = 2;\n\t/* Advertisement Protocol Tuple  */\n\t/* Query Response Length Limit(7b) + PAME-BI(1b) */\n\t*(pDest+2) = 0;\n\t/* Advertisement Protol ID */\n\t*(pDest + 3) = ACCESS_NETWORK_QUERY_PROTOCOL; /* ANQP */\n\tFrameLen += 4;\n\tpDest += 4;\n\n\t/* Query Request Length */\n\tpTotalQueryLen = pDest;\n\tFrameLen += 2;\n\tpDest += 2;\n\t/* ANQP Query Response */\n\t/* Info ID (56797) */\n\tRTMPMoveMemory(pDest, AnqpQueryInfoId, 2);\n\t/* Length */\n\tpQueryLen = (pDest + 2);\n\t/* Vendor Specific OUI for P2P defined by WFA. */\n\tRTMPMoveMemory(pDest + 4, P2POUIBYTE, 4);\n\tpDest += 8;\n\tFrameLen += 8;\n\t/* Service Update Indicator */\n\t*pDest = 0;\n\t*(pDest + 1) = 0;\n\t/* Length */\n\tpServLen = (pDest + 2);\n\t/* Service Protocol Type */\n\t*(pDest + 4) = SERVICE_PROTOCOL_TYPE_WFD; /* WiFi-Display */\n\t/* Service Transaction ID */\n\t*(pDest + 5) = pAd->P2pCfg.ServiceTransac;\n\t/* Status Code */\n\t*(pDest + 6) = 0;\n\n\tpDest += 7;\n\tFrameLen += 7;\n#ifdef WFD_SUPPORT\n\tif (pAd->StaCfg.WfdCfg.bWfdEnable)\n\t{\n\t/* Response Data */\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_device_info_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_DEVICE_INFO, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_associate_bssid_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ASSOCIATED_BSSID, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_audio_format_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_AUDIO_FORMATS, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_video_format_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_VIDEO_FORMATS, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_3d_video_format_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_3D_VIDEO_FORMATS, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_content_proctection)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_CONTENT_PROTECTION, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_couple_sink_info_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_COUPLED_SINK_INFO, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_extent_capability_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_EXTENDED_CAP, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_local_ip_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_LOCAL_IP_ADDR, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_session_info_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_SESSION_INFO, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\tif (pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_alternate_mac_addr_ie)\n\t{\n\t\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ALTERNATE_MAC_ADDR, NULL, pDest, ACTION_GAS_INITIAL_RSP);\n\t\tFrameLen += TempLen;\n\t\tServLen += TempLen;\n\t\tpDest += TempLen;\n\t}\n\t}\n#endif /* WFD_SUPPORT */\n\n\t//ServLen += 2;\n\tServLen += 3; /* Including Status Code */\n\ttmpValue = cpu2le16(ServLen);\n\tRTMPMoveMemory(pServLen, &tmpValue, 2);\n\tQueryLen = ServLen + 8;\n\ttmpValue = cpu2le16(QueryLen);\n\tRTMPMoveMemory(pQueryLen, &tmpValue, 2);\n\tTotalQueryLen = QueryLen + 4;\n\ttmpValue = cpu2le16(TotalQueryLen);\n\tRTMPMoveMemory(pTotalQueryLen, &tmpValue, 2);\n\t\t\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSend Publiac action frame. But with ACtion is GAS_INITIAL_REQ (11).\n\t\t802.11u. 7.4.7.10\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID MlmeGASComebackReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSend Publiac action frame. But with ACtion is GAS_INITIAL_REQ (11).\n\t\t802.11u. 7.4.7.10\n\n\tParameters: \n\tNote:\n\t\n\t==========================================================================\n */\nVOID MlmeGASComebackRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n}\n\nVOID MlmeP2pNoaAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\n}\n\nVOID MlmeP2pPresReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n}\n\nVOID MlmeP2pPresRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\t\tNoAAttribute[36];\n\tUCHAR\t\tp2pindex;\n\tPMLME_P2P_ACTION_STRUCT \t  pGoReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg;\n\tUCHAR\t\t\tP2pIEFixed[6] = {0xdd, 0x04, 0x00, 0x50, 0xf2, 0x09};\t\n\tUCHAR\t\t\tIndex = 0;\n\n\tRTMPMoveMemory(&P2pIEFixed[2], P2POUIBYTE, 4);\n\tp2pindex = pGoReq->TabIndex;\n\t/* If AP's index exists, it also means I am connected.\tSimilar to sanity check. */\n\tif (p2pindex < MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\t/* Add the header of P2P IE */\n\t\tRTMPMoveMemory(&NoAAttribute[0], &P2pIEFixed, 6);\n\t\tIndex += 6;\n\n\t\tNoAAttribute[Index] = SUBID_P2P_STATUS;\n\t\tNoAAttribute[Index+1] = 1;\n\t\tNoAAttribute[Index+2] = 0;\n\n\t\t/* Count Field is also called Type. type = 1 means preferred. type = 2 means max limit. */\n\t\tif ((pAd->MacTab.Content[p2pindex].P2pInfo.NoADesc[0].Count > 2) || (pAd->MacTab.Content[p2pindex].P2pInfo.NoADesc[0].Count == 0))\n\t\t{\n\t\t\tNoAAttribute[Index+3] = P2PSTATUS_INVALID_PARM; /* index */\n\t\t\tMlmeP2pCommonAction(pAd, P2PACT_PERSENCE_RSP, pAd->MacTab.Content[p2pindex].P2pInfo.NoAToken, &NoAAttribute[0], 3+6, Elem);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P- Presence Response sent with error. \\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* update NoA to Go  */\n\t\t\tpAd->P2pCfg.GONoASchedule.Duration = pAd->MacTab.Content[p2pindex].P2pInfo.NoADesc[0].Duration;\n\t\t\tpAd->P2pCfg.GONoASchedule.Interval = pAd->MacTab.Content[p2pindex].P2pInfo.NoADesc[0].Interval;\n\t\t\tpAd->P2pCfg.GONoASchedule.Count = 255;\n\t\t\n\t\t\tNoAAttribute[Index+3] = P2PSTATUS_SUCCESS;\t/* index */\n\t\t\tNoAAttribute[Index+4] = SUBID_P2P_NOA;\n\t\t\tNoAAttribute[Index+5] = 15;\n\t\t\tNoAAttribute[Index+6] = 0;\n\t\t\tNoAAttribute[Index+7] = pAd->MacTab.Content[p2pindex].P2pInfo.NoAToken; /* NoAToken should save the token from client's presence request. */\n\t\t\tNoAAttribute[Index+8] = pAd->P2pCfg.CTWindows;\t/* CTWindows */\n\t\t\tNoAAttribute[Index+9] = pAd->P2pCfg.GONoASchedule.Count;\t/* Count */\n\t\t\t/* TO DO : sync with windows if necessary */\n\t\t\t/*P2pGOStartNoA(pAd); */\n\t\t\t/* Duration */\n\t\t\tRTMPMoveMemory(&NoAAttribute[Index+10], &pAd->P2pCfg.GONoASchedule.Duration, 4);\n\t\t\t/* Interval */\n\t\t\tRTMPMoveMemory(&NoAAttribute[Index+14], &pAd->P2pCfg.GONoASchedule.Interval, 4);\n\t\t\tRTMPMoveMemory(&NoAAttribute[Index+18], &pAd->P2pCfg.GONoASchedule.StartTime, 4);\n\t\t\t/* Update IE length */\n\t\t\tNoAAttribute[1] += 22; \n\t\t\tMlmeP2pCommonAction(pAd, P2PACT_PERSENCE_RSP, pAd->MacTab.Content[p2pindex].P2pInfo.NoAToken, &NoAAttribute[0], 22+6, Elem);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P- Presence Response sent. \\n\"));\n\n\t\t\t/* Trigger to update GO's beacon */\n\t\t\tpAd->P2pCfg.GONoASchedule.bValid = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MlmeP2pPresRspAction: Update NoA Schedual on GO!\\n\"));\n\t\t}\n\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: index = %d out of range.\\n\", __FUNCTION__, p2pindex));\n\n}\n\nVOID MlmeP2pGoDiscoverAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPMLME_P2P_ACTION_STRUCT       pGoReq = (PMLME_P2P_ACTION_STRUCT) Elem->Msg;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P- GO DISCOVERY request. \\n\"));\n\tMlmeP2pCommonAction(pAd, P2PACT_GO_DISCOVER_REQ, 0, NULL, 0, Elem);\n\t\n\tif (pGoReq->TabIndex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\t/* when used in MlmeP2pGoDiscoverAction, WcidIndex */\n\t\tpAd->P2pTable.Client[pGoReq->TabIndex].P2pClientState = P2PSTATE_WAIT_GO_DISCO_ACK;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P- Client State %s  \\n\", decodeP2PClientState(pAd->P2pTable.Client[pGoReq->TabIndex].P2pClientState)));\n\t}\n\n}\n\nVOID PeerP2pNoaAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPP2P_ACTION_FRAME\tpFrame = (PP2P_ACTION_FRAME)Elem->Msg;\n\tPMAC_TABLE_ENTRY\t\tpClient;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"PeerP2pNoaAction  %s. \\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"Category = %d. Subtype = %d. Token = %d.\\n\", pFrame->Category, pFrame->Subtype, pFrame->Token));\n\tif (!P2P_CLI_ON(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"PeerP2pNoaAction return %s. \\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\t\treturn;\n\t}\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"PeerP2pNoaAction Elem->Wcid %d.  return.\\n\",  Elem->Wcid));\n\t\treturn;\n\t}\n\n\tpClient = &pAd->MacTab.Content[Elem->Wcid];\n\tpAd->P2pCfg.NoAIndex = Elem->Wcid;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"PeerP2pNoaAction Current  NoAToken = %d. \\n\",  pClient->P2pInfo.NoAToken));\n\tif (pFrame->Token != pClient->P2pInfo.NoAToken)\n\t{\n\t\tif ((RTMPEqualMemory(&pFrame->Octet[0], P2POUIBYTE, 4)) && (pFrame->Octet[4] == SUBID_P2P_NOA))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"PeerP2pNoaAction  CTWindow = %d. \\n\", pFrame->Octet[8]));\n\t\t\tpClient->P2pInfo.CTWindow = pFrame->Octet[8]; \n\t\t\tP2pHandleNoAAttri(pAd, pClient, &pFrame->Octet[0]);\n\t\t}\n\t}\n\t\n}\n\nVOID PeerP2pPresReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tMLME_P2P_ACTION_STRUCT\tP2PActReq;\t\n\tMAC_TABLE_ENTRY\t\t*pEntry;\n\tPFRAME_P2P_ACTION\t\tpFrame;\n\tPP2P_NOA_DESC\tpNoADesc;\t\n\t\n\tpFrame = (PFRAME_P2P_ACTION)Elem->Msg;\n\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"PeerP2pPresReqAction. unknown Elem->Wcid  = %d \\n\", Elem->Wcid ));\n\t}\n\t\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"PeerP2pPresReqAction. Send back to Elem->Wcid  = %d \\n\", Elem->Wcid ));\n\t\t\n\tpEntry = &pAd->MacTab.Content[Elem->Wcid];\n\n\tpNoADesc = (PP2P_NOA_DESC)(&Elem->Msg[11 + sizeof(FRAME_P2P_ACTION)]);\n\tpEntry->P2pInfo.NoADesc[0].Count = pNoADesc->Count;\n\tpEntry->P2pInfo.NoADesc[0].Duration = *(PUINT32)&pNoADesc->Duration[0];\n\tpEntry->P2pInfo.NoADesc[0].Interval = *(PUINT32)&pNoADesc->Interval[0];\n\tpEntry->P2pInfo.NoADesc[0].StartTime = *(PUINT32)&pNoADesc->StartTime[0];\n\tDBGPRINT(RT_DEBUG_ERROR,(\" pP2pEntry->NoADesc[0].Count = %d, \\n\", pEntry->P2pInfo.NoADesc[0].Count));\n\tDBGPRINT(RT_DEBUG_ERROR,(\" pP2pEntry->NoADesc[0].Duration = %ld, \\n\", pEntry->P2pInfo.NoADesc[0].Duration));\n\tDBGPRINT(RT_DEBUG_ERROR,(\" pP2pEntry->NoADesc[0].Interval = %ld, \\n\", pEntry->P2pInfo.NoADesc[0].Interval));\n\tDBGPRINT(RT_DEBUG_ERROR,(\" pP2pEntry->NoADesc[0].StartTime = %ld, \\n\", pEntry->P2pInfo.NoADesc[0].StartTime));\n\tDBGPRINT(RT_DEBUG_ERROR,(\"pFrame->Token  = %d \\n\", pFrame->Token));\n\n\tpEntry->P2pInfo.NoAToken = pFrame->Token;\n/*\tpP2pEntry->NoADesc[0].Duration = Elem->Msg; */\n\tNdisZeroMemory(&P2PActReq, sizeof(P2PActReq));\n\tCOPY_MAC_ADDR(P2PActReq.Addr, pEntry->Addr);\n\tP2PActReq.TabIndex = Elem->Wcid;\n\tMlmeEnqueue(pAd, P2P_ACTION_STATE_MACHINE, MT2_MLME_P2P_PRESENCE_RSP, sizeof(MLME_P2P_ACTION_STRUCT), (PVOID)&P2PActReq, 0);\n\tMlmeHandler(pAd);\n\n}\n\n\nVOID PeerP2pPresRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerP2pPresRspAction.\\n\"));\n}\n\nVOID PeerP2pGoDiscoverAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\t\ti;\n\tPUCHAR\t\tpDest;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"PeerP2pGoDiscoverAction.\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE,(\"bKeepSlient = %d.\\n\", pAd->P2pCfg.bKeepSlient));\n\tpDest = &Elem->Msg[0];\n\tfor (i = 0; i <Elem->MsgLen; )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\": %x %x %x %x %x %x %x %x %x \\n\", *(pDest+i), *(pDest+i+1), *(pDest+i+2), \n\t\t*(pDest+i+3), *(pDest+i+4), *(pDest+i+5), *(pDest+i+6), *(pDest+i+7), *(pDest+i+8)));\n\t\ti = i + 9;\n\t}\n}\n\n\n"
  },
  {
    "path": "src/common/p2p_cfg.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tap_cfg.c\n\n    Abstract:\n    IOCTL related subroutines\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n*/\n\n#ifdef WFD_SUPPORT\n#ifdef OS_ABL_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n#include <linux/version.h>\n#include <net/cfg80211.h>\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* OS_ABL_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n#include \"rt_config.h\"\n#ifdef WFD_SUPPORT\n#ifdef OS_ABL_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n#include \"cfg80211.h\"\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* OS_ABL_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n#define A_BAND_REGION_0\t\t\t\t0\n#define A_BAND_REGION_1\t\t\t\t1\n#define A_BAND_REGION_2\t\t\t\t2\n#define A_BAND_REGION_3\t\t\t\t3\n#define A_BAND_REGION_4\t\t\t\t4\n#define A_BAND_REGION_5\t\t\t\t5\n#define A_BAND_REGION_6\t\t\t\t6\n#define A_BAND_REGION_7\t\t\t\t7\n#define A_BAND_REGION_8\t\t\t\t8\n#define A_BAND_REGION_9\t\t\t\t9\n#define A_BAND_REGION_10\t\t\t10\n\n#define G_BAND_REGION_0\t\t\t\t0\n#define G_BAND_REGION_1\t\t\t\t1\n#define G_BAND_REGION_2\t\t\t\t2\n#define G_BAND_REGION_3\t\t\t\t3\n#define G_BAND_REGION_4\t\t\t\t4\n#define G_BAND_REGION_5\t\t\t\t5\n#define G_BAND_REGION_6\t\t\t\t6\n\nCOUNTRY_CODE_TO_COUNTRY_REGION allCountry[] = {\n\t/* {Country Number, ISO Name, Country Name, Support 11A, 11A Country Region, Support 11G, 11G Country Region} */\n\t{0,\t\t\"DB\",\t\"Debug\",\t\t\t\tTRUE,\tA_BAND_REGION_7,\tTRUE,\tG_BAND_REGION_5},\n\t{8,\t\t\"AL\",\t\"ALBANIA\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{12,\t\"DZ\",\t\"ALGERIA\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{32,\t\"AR\",\t\"ARGENTINA\",\t\t\tTRUE,\tA_BAND_REGION_3,\tTRUE,\tG_BAND_REGION_1},\n\t{51,\t\"AM\",\t\"ARMENIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{36,\t\"AU\",\t\"AUSTRALIA\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{40,\t\"AT\",\t\"AUSTRIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{31,\t\"AZ\",\t\"AZERBAIJAN\",\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{48,\t\"BH\",\t\"BAHRAIN\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{112,\t\"BY\",\t\"BELARUS\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{56,\t\"BE\",\t\"BELGIUM\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{84,\t\"BZ\",\t\"BELIZE\",\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{68,\t\"BO\",\t\"BOLIVIA\",\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{76,\t\"BR\",\t\"BRAZIL\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{96,\t\"BN\",\t\"BRUNEI DARUSSALAM\",\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{100,\t\"BG\",\t\"BULGARIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{124,\t\"CA\",\t\"CANADA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{152,\t\"CL\",\t\"CHILE\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{156,\t\"CN\",\t\"CHINA\",\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{170,\t\"CO\",\t\"COLOMBIA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{188,\t\"CR\",\t\"COSTA RICA\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{191,\t\"HR\",\t\"CROATIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{196,\t\"CY\",\t\"CYPRUS\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{203,\t\"CZ\",\t\"CZECH REPUBLIC\",\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{208,\t\"DK\",\t\"DENMARK\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{214,\t\"DO\",\t\"DOMINICAN REPUBLIC\",\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{218,\t\"EC\",\t\"ECUADOR\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{818,\t\"EG\",\t\"EGYPT\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{222,\t\"SV\",\t\"EL SALVADOR\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{233,\t\"EE\",\t\"ESTONIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{246,\t\"FI\",\t\"FINLAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{250,\t\"FR\",\t\"FRANCE\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{268,\t\"GE\",\t\"GEORGIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{276,\t\"DE\",\t\"GERMANY\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{300,\t\"GR\",\t\"GREECE\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{320,\t\"GT\",\t\"GUATEMALA\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{340,\t\"HN\",\t\"HONDURAS\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{344,\t\"HK\",\t\"HONG KONG\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{348,\t\"HU\",\t\"HUNGARY\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{352,\t\"IS\",\t\"ICELAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{356,\t\"IN\",\t\"INDIA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{360,\t\"ID\",\t\"INDONESIA\",\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{364,\t\"IR\",\t\"IRAN\",\t\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{372,\t\"IE\",\t\"IRELAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{376,\t\"IL\",\t\"ISRAEL\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{380,\t\"IT\",\t\"ITALY\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{392,\t\"JP\",\t\"JAPAN\",\t\t\t\tTRUE,\tA_BAND_REGION_9,\tTRUE,\tG_BAND_REGION_1},\n\t{400,\t\"JO\",\t\"JORDAN\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{398,\t\"KZ\",\t\"KAZAKHSTAN\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{408,\t\"KP\",\t\"KOREA DEMOCRATIC PEOPLE'S REPUBLIC OF\",TRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{410,\t\"KR\",\t\"KOREA REPUBLIC OF\",\tTRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{414,\t\"KW\",\t\"KUWAIT\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{428,\t\"LV\",\t\"LATVIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{422,\t\"LB\",\t\"LEBANON\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{438,\t\"LI\",\t\"LIECHTENSTEIN\",\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{440,\t\"LT\",\t\"LITHUANIA\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{442,\t\"LU\",\t\"LUXEMBOURG\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{446,\t\"MO\",\t\"MACAU\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{807,\t\"MK\",\t\"MACEDONIA\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{458,\t\"MY\",\t\"MALAYSIA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{484,\t\"MX\",\t\"MEXICO\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{492,\t\"MC\",\t\"MONACO\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{504,\t\"MA\",\t\"MOROCCO\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{528,\t\"NL\",\t\"NETHERLANDS\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{554,\t\"NZ\",\t\"NEW ZEALAND\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{578,\t\"NO\",\t\"NORWAY\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{512,\t\"OM\",\t\"OMAN\",\t\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{586,\t\"PK\",\t\"PAKISTAN\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{591,\t\"PA\",\t\"PANAMA\",\t\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{604,\t\"PE\",\t\"PERU\",\t\t\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{608,\t\"PH\",\t\"PHILIPPINES\",\t\t\tTRUE,\tA_BAND_REGION_4,\tTRUE,\tG_BAND_REGION_1},\n\t{616,\t\"PL\",\t\"POLAND\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{620,\t\"PT\",\t\"PORTUGAL\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{630,\t\"PR\",\t\"PUERTO RICO\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{634,\t\"QA\",\t\"QATAR\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{642,\t\"RO\",\t\"ROMANIA\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{643,\t\"RU\",\t\"RUSSIA FEDERATION\",\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{682,\t\"SA\",\t\"SAUDI ARABIA\",\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{702,\t\"SG\",\t\"SINGAPORE\",\t\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{703,\t\"SK\",\t\"SLOVAKIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{705,\t\"SI\",\t\"SLOVENIA\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{710,\t\"ZA\",\t\"SOUTH AFRICA\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{724,\t\"ES\",\t\"SPAIN\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{752,\t\"SE\",\t\"SWEDEN\",\t\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{756,\t\"CH\",\t\"SWITZERLAND\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{760,\t\"SY\",\t\"SYRIAN ARAB REPUBLIC\",\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{158,\t\"TW\",\t\"TAIWAN\",\t\t\t\tTRUE,\tA_BAND_REGION_3,\tTRUE,\tG_BAND_REGION_0},\n\t{764,\t\"TH\",\t\"THAILAND\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{780,\t\"TT\",\t\"TRINIDAD AND TOBAGO\",\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{788,\t\"TN\",\t\"TUNISIA\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{792,\t\"TR\",\t\"TURKEY\",\t\t\t\tTRUE,\tA_BAND_REGION_2,\tTRUE,\tG_BAND_REGION_1},\n\t{804,\t\"UA\",\t\"UKRAINE\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{784,\t\"AE\",\t\"UNITED ARAB EMIRATES\",\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{826,\t\"GB\",\t\"UNITED KINGDOM\",\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_1},\n\t{840,\t\"US\",\t\"UNITED STATES\",\t\tTRUE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_0},\n\t{858,\t\"UY\",\t\"URUGUAY\",\t\t\t\tTRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{860,\t\"UZ\",\t\"UZBEKISTAN\",\t\t\tTRUE,\tA_BAND_REGION_1,\tTRUE,\tG_BAND_REGION_0},\n\t{862,\t\"VE\",\t\"VENEZUELA\",\t\t\tTRUE,\tA_BAND_REGION_5,\tTRUE,\tG_BAND_REGION_1},\n\t{704,\t\"VN\",\t\"VIET NAM\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{887,\t\"YE\",\t\"YEMEN\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{716,\t\"ZW\",\t\"ZIMBABWE\",\t\t\t\tFALSE,\tA_BAND_REGION_0,\tTRUE,\tG_BAND_REGION_1},\n\t{999,\t\"\",\t\"\",\t0,\t0,\t0,\t0}\n};\n\n#define NUM_OF_COUNTRIES\t(sizeof(allCountry)/sizeof(COUNTRY_CODE_TO_COUNTRY_REGION))\n\n\nINT Set_CountryString_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_CountryCode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_ChGeography_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\nINT Set_AP_SSID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_TxRate_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n\nINT\tSet_OLBCDetection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_MaxStaNum_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_IdleTimeout_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef IAPP_SUPPORT\nINT\tSet_IappPID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* IAPP_SUPPORT */\n\nINT Set_AP_AuthMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_EncrypType_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_WpaMixPairCipher_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_RekeyInterval_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_RekeyMethod_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_PMKCachePeriod_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_DefaultKeyID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key1_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key2_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key3_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_Key4_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AP_WPAPSK_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT\tSet_BeaconPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DtimPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_NoForwarding_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_NoForwardingBTNSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HideSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_VLANID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_VLANPriority_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AccessPolicy_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tSet_ACLAddEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ACLDelEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ACLShowAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ACLClearAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadioOn_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_SiteSurvey_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_AutoChannelSel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BADecline_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_StaCount_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_StaSecurityInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\t\nINT\tShow_DriverInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT11_N_SUPPORT\nINT\tShow_BaTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DOT11_N_SUPPORT */\n\nINT\tShow_Sat_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tShow_Sat_Reset_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_MATTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT1X_SUPPORT\nVOID RTMPIoctlQueryRadiusConf(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nINT\tSet_IEEE8021X_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_PreAuth_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RADIUS_Server_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RADIUS_Port_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RADIUS_Key_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DOT1X_SUPPORT */\n\nINT\tSet_DisConnectSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DisConnectAllSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n#ifdef APCLI_SUPPORT\nINT Set_ApCli_Enable_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Ssid_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Bssid_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_DefaultKeyID_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_WPAPSK_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key1_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key2_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key3_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_Key4_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_ApCli_TxMode_Proc(IN PRTMP_ADAPTER pAd, IN  PSTRING arg);\nINT Set_ApCli_TxMcs_Proc(IN PRTMP_ADAPTER pAd, IN  PSTRING arg);\n\n#ifdef WSC_AP_SUPPORT\nINT Set_AP_WscSsid_Proc(IN PRTMP_ADAPTER\tpAd, IN\tPSTRING arg);\n#endif /* WSC_AP_SUPPORT */\n#endif /* APCLI_SUPPORT */\n#ifdef UAPSD_SUPPORT\nINT Set_UAPSD_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* UAPSD_SUPPORT */\n\n#ifdef WSC_AP_SUPPORT\nINT\tSet_WscStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nVOID RTMPIoctlWscProfile(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlWscPINCode(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlWscStatus(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlGetWscDynInfo(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlGetWscRegsDynInfo(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nBOOLEAN WscCheckEnrolleeNonceFromUpnp(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\tpData,\n\tIN  USHORT\t\t\tLength,\n\tIN  PWSC_CTRL       pWscControl);\n\nUCHAR\tWscRxMsgTypeFromUpnp(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PSTRING\t\t\t\tpData,\n\tIN\tUSHORT\t\t\t\tLength);\n\nINT\t    WscGetConfForUpnp(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl);\n\nINT\tSet_AP_WscConfMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_WscConfStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_WscMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_WscGetConf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AP_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_AP_WscSecurityMode_Proc(    \n\tIN  PRTMP_ADAPTER   pAdapter,     \n\tIN  PSTRING         arg);\n\nINT Set_AP_WscMultiByteCheck_Proc(    \n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PSTRING         arg);\n\n\nINT\tSet_WscVersion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef WSC_V2_SUPPORT\nINT\tSet_WscV2Support_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscVersion2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscExtraTlvTag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscExtraTlvType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscExtraTlvData_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscSetupLock_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscFragment_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscFragmentSize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* WSC_V2_SUPPORT */\n\n#endif /* WSC_AP_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MCAST_RATE_SPECIFIC\nINT Set_McastPhyMode(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Set_McastMcs(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\nINT Show_McastRate(IN PRTMP_ADAPTER\tpAd, IN PSTRING arg);\n#endif /* MCAST_RATE_SPECIFIC */\n\n#ifdef DOT11N_DRAFT3\nINT Set_OBSSScanParam_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg);\n#endif /* DOT11N_DRAFT3 */\n\nINT Set_EntryLifeCheck_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING\t\t\targ);\n\n#ifdef AP_QLOAD_SUPPORT\nINT\tSet_QloadClr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n/* QLOAD ALARM */\nINT\tSet_QloadAlarmTimeThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg);\n\nINT\tSet_QloadAlarmNumThreshold_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tArg);\n#endif /* AP_QLOAD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\nINT\tSet_MemDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef CONFIG_AP_SUPPORT\nINT\tSet_PowerSaveLifeTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\nINT Set_P2p_OpMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Enable_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Ssid_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Bssid_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_AuthMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_EncrypType_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_DefaultKeyID_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_WPAPSK_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Key1_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Key2_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Key3_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_Key4_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_P2pCli_TxMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN  PSTRING arg);\n\nINT Set_P2pCli_TxMcs_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN  PSTRING arg);\n\t\n#ifdef WSC_AP_SUPPORT\nINT Set_P2pCli_WscSsid_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING arg);\n#endif /* WSC_AP_SUPPORT */\n\nINT Set_P2P_ProvAccept_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\nINT Set_P2p_WscManufacturer_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING arg);\n\nINT Set_P2p_WscModelName_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING arg);\n\nINT Set_P2p_WscModelNumber_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING arg);\n\nINT Set_P2p_WscSerialNumber_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING arg);\n#endif /* P2P_SUPPORT */\nstatic struct {\n\tPSTRING name;\n\tINT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);\n} *PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = {\n\t{\"SSID\",\t\t\t\t\t\tSet_AP_SSID_Proc},\n\t{\"Channel\",\t\t\t\t\tSet_Channel_Proc},\n\t{\"AuthMode\",\t\t\t\t\tSet_AP_AuthMode_Proc},\n\t{\"EncrypType\",\t\t\t\tSet_AP_EncrypType_Proc},\n\t{\"WpaMixPairCipher\", \t\t\tSet_AP_WpaMixPairCipher_Proc},\n\t{\"RekeyInterval\",\t\t\t\tSet_AP_RekeyInterval_Proc},\n\t{\"RekeyMethod\", \t\t\t\tSet_AP_RekeyMethod_Proc}, \n\t{\"DefaultKeyID\",\t\t\t\tSet_AP_DefaultKeyID_Proc},\n\t{\"WPAPSK\",\t\t\t\t\tSet_AP_WPAPSK_Proc},\n\t{\"ResetCounter\",\t\t\t\tSet_ResetStatCounter_Proc},\n\t{\"MaxStaNum\",\t\t\t\t\tSet_AP_MaxStaNum_Proc},\n#ifdef DBG\t\n\t{\"Debug\",\t\t\t\t\tSet_Debug_Proc},\n#endif /* DBG */\n\n\t{\"CountryString\",\t\t\t\tSet_CountryString_Proc},\n\t{\"CountryCode\",\t\t\t\tSet_CountryCode_Proc},\n\t{\"NoForwarding\",\t\t\t\tSet_NoForwarding_Proc},\n\t\n#ifdef WSC_AP_SUPPORT\n\t{\"WscConfMode\",\t\t\t\tSet_AP_WscConfMode_Proc},\n\t{\"WscConfStatus\",\t\t\t\tSet_AP_WscConfStatus_Proc},\n\t{\"WscMode\",\t\t\t\t\tSet_AP_WscMode_Proc},\n\t{\"WscStatus\",\t\t\t\t\tSet_WscStatus_Proc},\n\t{\"WscGetConf\",\t\t\t\tSet_AP_WscGetConf_Proc},\n\t{\"WscPinCode\",\t\t\t\tSet_AP_WscPinCode_Proc},\n\t{\"WscStop\",                     \t\tSet_WscStop_Proc},\n\t{\"WscGenPinCode\",               \t\tSet_WscGenPinCode_Proc},\n\t{\"WscVendorPinCode\",            Set_WscVendorPinCode_Proc},\n\t{\"WscSecurityMode\",\t\t\t\tSet_AP_WscSecurityMode_Proc},\n\t{\"WscMultiByteCheck\",\t\t\tSet_AP_WscMultiByteCheck_Proc},\n\t{\"WscVersion\", \t\t\t\t\tSet_WscVersion_Proc},\n#ifdef WSC_V2_SUPPORT\n\t{\"WscV2Support\", \t\t\t\tSet_WscV2Support_Proc},\n\t{\"WscVersion2\", \t\t\t\tSet_WscVersion2_Proc},\n\t{\"WscExtraTlvTag\", \t\t\t\tSet_WscExtraTlvTag_Proc},\n\t{\"WscExtraTlvType\",\t\t\t\tSet_WscExtraTlvType_Proc},\n\t{\"WscExtraTlvData\", \t\t\tSet_WscExtraTlvData_Proc},\n\t{\"WscSetupLock\", \t\t\t\tSet_WscSetupLock_Proc},\n\t{\"WscFragment\",\t\t\t\t\tSet_WscFragment_Proc},\n\t{\"WscFragmentSize\", \t\t\tSet_WscFragmentSize_Proc},\n#endif /* WSC_V2_SUPPORT */\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t{\"P2pCliEnable\",\t\t\t\tSet_P2pCli_Enable_Proc},\n\t{\"P2pCliSsid\",\t\t\t\t\tSet_P2pCli_Ssid_Proc},\n\t{\"P2pCliBssid\",\t\t\t\tSet_P2pCli_Bssid_Proc},\n\t{\"P2pCliAuthMode\",\t\t\t\tSet_P2pCli_AuthMode_Proc},\n\t{\"P2pCliEncrypType\",\t\t\tSet_P2pCli_EncrypType_Proc},\n\t{\"P2pCliDefaultKeyID\",\t\t\tSet_P2pCli_DefaultKeyID_Proc},\t\n\t{\"P2pCliWPAPSK\",\t\t\t\tSet_P2pCli_WPAPSK_Proc},\n\t{\"P2pCliKey1\",\t\t\t\t\tSet_P2pCli_Key1_Proc},\n\t{\"P2pCliKey2\",\t\t\t\t\tSet_P2pCli_Key2_Proc},\n\t{\"P2pCliKey3\",\t\t\t\t\tSet_P2pCli_Key3_Proc},\n\t{\"P2pCliKey4\",\t\t\t\t\tSet_P2pCli_Key4_Proc},\n\t{\"P2pCliTxMode\",\t\t\t\tSet_P2pCli_TxMode_Proc},\n\t{\"P2pCliTxMcs\",\t\t\t\tSet_P2pCli_TxMcs_Proc},\t\n#ifdef WSC_AP_SUPPORT\t\n\t{\"P2pCliWscSsid\",\t\t\t\tSet_P2pCli_WscSsid_Proc},\n#endif /* WSC_AP_SUPPORT */\n\t{\"P2pOpMode\",\t\t\t\tSet_P2p_OpMode_Proc},\n\t{\"p2pEnable\",\t\t\t\t\t\tSet_P2P_Enable},\n\t{\"p2pLisCh\",\t\t\t\t\t\tSet_P2P_Listen_Channel},\n\t{\"p2pOpCh\", \t\t\t\t\tSet_P2P_Operation_Channel},\n\t{\"p2pGoInt\",\t\t\t\t\t\tSet_P2P_GO_Intent},\n\t{\"p2pWscManufacturer\",              Set_P2p_WscManufacturer_Proc},\n\t{\"p2pWscModelNumber\",              Set_P2p_WscModelNumber_Proc},\n\t{\"p2pWscSerialNumber\",              Set_P2p_WscSerialNumber_Proc},\n\t{\"p2pWscModelName\",              Set_P2p_WscModelName_Proc},\n\t{\"p2pDevName\",\t\t\t\t\tSet_P2P_Device_Name},\n\t{\"p2pWscMode\",\t\t\t\t\tSet_P2P_WSC_Mode},\n\t{\"p2pWscConf\",\t\t\t\t\tSet_P2P_WSC_ConfMethod},\n\t{\"p2pScan\", \t\t\t\t\tSet_P2P_Scan},\n\t{\"p2pInv\",\t\t\t\t\t\tSet_P2P_Invite_Proc},\n\t{\"p2pDevDisc\",\t\t\t\t\tSet_P2P_Device_Discoverability_Proc},\n\t{\"p2pLink\", \t\t\t\t\tSet_P2P_Connect_GoIndex_Proc},\n\t{\"p2pConnDevAddr\", \t\t\t\t\tSet_P2P_Connect_Dev_Addr_Proc},\n\t{\"p2pCfg\",\t\t\t\t\t\tSet_P2P_Print_Cfg},\n\t{\"p2pTab\",\t\t\t\t\t\tSet_P2P_Print_GroupTable_Proc},\n\t{\"p2pProv\", \t\t\t\t\tSet_P2P_Provision_Proc},\n\t{\"p2pStat\", \t\t\t\t\tSet_P2P_State_Proc},\n\t{\"p2pReset\", \t\t\t\t\tSet_P2P_Reset_Proc},\n\t{\"p2pPerTab\",\t\t\t\t\t\tSet_P2P_Print_PersistentTable_Proc},\n\t{\"p2pDefConfMthd\", \t\t\t\t\tSet_P2P_Default_Config_Method_Proc},\n\t{\"p2pLinkDown\", \t\t\t\t\tSet_P2P_Link_Down_Proc},\n\t{\"p2pSigmaEnable\", \t\t\t\t\tSet_P2P_Sigma_Enable_Proc},\n\t{\"p2pQoSLegacyRate\", \t\t\t\t\tSet_P2P_QoS_NULL_Legacy_Rate_Proc},\n\t{\"p2pClientPmEnable\", \t\t\t\t\tSet_P2P_CLIENT_PM_Enable_Proc},\n\t{\"p2pEnterPIN\", \t\t\t\t\tSet_P2P_Enter_WSC_PIN_Proc},\n\t{\"p2pPerEnable\", \t\t\t\t\tSet_P2P_Persistent_Enable_Proc},\n\t{\"p2pDevDiscEnable\", \t\t\t\t\tSet_P2P_Dev_Discoverability_Enable_Proc},\n\t{\"p2pProvAccept\", \t\t\t\t\tSet_P2P_ProvAccept_Proc},\n\t{\"p2pProvByAddr\", \t\t\t\t\tSet_P2P_ProvisionByAddr_Proc},\n\t{\"p2pDelDevByAddr\",\t\t\t\t\tSet_P2P_DelDevByAddr_Proc},\n\t{\"p2pDevDiscPeriod\", \t\t\t\tSet_P2P_DevDiscPeriod_Proc},\n\t{\"p2pPriDeviceType\", \t\t\t\tSet_P2P_PriDeviceType_Proc},\n\t{\"p2p2ndDevTypeList\", \t\t\t\tSet_P2P_SecDevTypeList_Proc},\n\t{\"p2pCancel\", \t\t\t\t\t\tSet_P2P_Cancel_Proc},\n\t{\"p2pConfirmByUI\", \t\t\t\t\tSet_P2P_ConfirmByUI_Proc},\n\t{\"p2pDiscoverable\", \t\t\t\t\tSet_P2P_Discoverable_Proc},\n\t{\"p2pSerDiscEnable\", \t\t\t\t\t\tSet_P2P_Service_Discovery_Proc},\n\t{\"p2pSerDiscCapable\", \t\t\t\t\t\tSet_P2P_Service_Discovery_Capable_Proc},\n\t{\"p2pSendSerDiscInit\", \t\t\t\t\t\tSet_P2P_Send_Service_Discovery_Init_Proc},\n\t{\"p2pSendSerDiscCmb\", \t\t\t\t\t\tSet_P2P_Send_Service_Discovery_Comeback_Proc},\n\t{\"p2pCleanTable\", \t\t\t\tSet_P2P_DelPerstTable_Proc},\n#endif /* P2P_SUPPORT */\n\t{NULL,}\n};\n\n\nstatic struct {\n\tPSTRING name;\n\tINT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);\n} *PRTMP_PRIVATE_SHOW_PROC, RTMP_PRIVATE_SHOW_SUPPORT_PROC[] = {\n\t{\"stainfo\",\t\t\tShow_MacTable_Proc},\n\t{\"stacountinfo\",\t\t\tShow_StaCount_Proc},\n\t{\"stasecinfo\", \t\t\tShow_StaSecurityInfo_Proc},\t\n\t{\"descinfo\",\t\t\tShow_DescInfo_Proc},\n\t{\"driverinfo\", \t\t\tShow_DriverInfo_Proc},\n#ifdef DOT11_N_SUPPORT\n\t{\"bainfo\",\t\t\t\tShow_BaTable_Proc},\n#endif /* DOT11_N_SUPPORT */\n\t{\"stat\",\t\t\t\tShow_Sat_Proc}, \n#ifdef MAT_SUPPORT\n\t{\"matinfo\",\t\t\tShow_MATTable_Proc},\n#endif /* MAT_SUPPORT */\n\n#ifdef WSC_AP_SUPPORT\n\t{\"WscPeerList\", \t\tWscApShowPeerList},\n#endif /* WSC_AP_SUPPORT */\n\t{NULL,}\n};\n\n\nINT RTMPAPPrivIoctlSet(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)\n{\n\tPSTRING this_char;\n\tPSTRING value;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n\twhile ((this_char = strsep((char **)&pIoctlCmdStr->u.data.pointer, \",\")) != NULL) \n\t{\n\t\tif (!*this_char)\n\t\t\t continue;\n\n\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t*value++ = 0;\n\n\t\tif (!value \n#ifdef WSC_AP_SUPPORT                        \n            && (\n                 (strcmp(this_char, \"WscStop\") != 0) &&\n                 (strcmp(this_char, \"WscGenPinCode\")!= 0)\n               )\n#endif /* WSC_AP_SUPPORT */\n            )\n\t\t\tcontinue;  \t\t\t\t\t\t\t\n\n\t\tfor (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)\n\t\t{\n\t\t\tif (!strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name)) \n\t\t\t{\n\t\t\t\tif(!PRTMP_PRIVATE_SET_PROC->set_proc(pAd, value))\n\t\t\t\t{   /*FALSE:Set private failed then return Invalid argument */\n\t\t\t\t\tStatus = -EINVAL;\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif (strcmp(this_char, \"P2pOpMode\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\t\t\t\tpAd->flg_p2p_OpStatusFlags |= P2P_FIXED_MODE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpAd->flg_p2p_OpStatusFlags &= (~P2P_FIXED_MODE);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;  /*Exit for loop. */\n\t\t\t}\n\t\t}\n\n\t\tif(PRTMP_PRIVATE_SET_PROC->name == NULL)\n\t\t{  /*Not found argument */\n\t\t\tStatus = -EINVAL;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::(iwpriv) Command not Support [%s=%s]\\n\", this_char, value));\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\treturn Status;\n}\n\n\nINT RTMPAPPrivIoctlShow(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)\n{\n\tPSTRING this_char;\n\tPSTRING value = NULL;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\t\n\twhile ((this_char = strsep((char **)&pIoctlCmdStr->u.data.pointer, \",\")) != NULL) \n\t{\n\t\tif (!*this_char)\n\t\t\tcontinue;\n\n\t\tfor (PRTMP_PRIVATE_SHOW_PROC = RTMP_PRIVATE_SHOW_SUPPORT_PROC; PRTMP_PRIVATE_SHOW_PROC->name; PRTMP_PRIVATE_SHOW_PROC++)\n\t\t{\n\t\t\tif (!strcmp(this_char, PRTMP_PRIVATE_SHOW_PROC->name)) \n\t\t\t{\t\t\t\t\t\t\n\t\t\t\tif(!PRTMP_PRIVATE_SHOW_PROC->set_proc(pAd, value))\n\t\t\t\t{   /*FALSE:Set private failed then return Invalid argument */\n\t\t\t\t\tStatus = -EINVAL;\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;  /*Exit for loop. */\n\t\t\t}\n\t\t}\n\n\t\tif(PRTMP_PRIVATE_SHOW_PROC->name == NULL)\n\t\t{  /*Not found argument */\n\t\t\tStatus = -EINVAL;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::(iwpriv) Command not Support [%s=%s]\\n\", this_char, value));\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\treturn Status;\n\t\n}\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\nINT RTMPAPPrivIoctlAR9Show(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)\n{\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n\t\tif(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_mac_table\"))\n\t\t{\n\t\t\tRTMPAR9IoctlGetMacTable(pAd,pIoctlCmdStr);\n\t\t}\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_stat2\"))\n\t\t{\n\t\t\tRTMPIoctlGetSTAT2(pAd,pIoctlCmdStr);\n\t\t}\t\t\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_radio_dyn_info\"))\n\t\t{\n\t\t\tRTMPIoctlGetRadioDynInfo(pAd,pIoctlCmdStr);\n\t\t}\n#ifdef WSC_AP_SUPPORT\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_wsc_profile\"))\n\t\t{\n\t\t\tRTMPAR9IoctlWscProfile(pAd,pIoctlCmdStr);\t\t\n\t\t}\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_wsc_pincode\"))\n\t\t{\n\t\t\tRTMPIoctlWscPINCode(pAd,pIoctlCmdStr);\n\t\t}\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_wsc_status\"))\n\t\t{\n\t\t\tRTMPIoctlWscStatus(pAd,pIoctlCmdStr);\n\t\t}\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_wps_dyn_info\"))\n\t\t{\n\t\t\tRTMPIoctlGetWscDynInfo(pAd,pIoctlCmdStr);\n\t\t}\n\t\telse if(!strcmp(pIoctlCmdStr->u.data.pointer, \"get_wps_regs_dyn_info\"))\n\t\t{\n\t\t\tRTMPIoctlGetWscRegsDynInfo(pAd,pIoctlCmdStr);\n\t\t}\n#endif\n\treturn Status;\n}\n#endif /*AR9_MAPI_SUPPORT*/\n#endif/*AR9_INF*/\n\nINT RTMPAPSetInformation(\n\tIN RTMP_ADAPTER *pAd,\n\tINOUT RTMP_IOCTL_INPUT_STRUCT *rq,\n\tIN INT cmd)\n{\n\tRTMP_IOCTL_INPUT_STRUCT *wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;\n\tUCHAR Addr[MAC_ADDR_LEN];\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n#ifdef SNMP_SUPPORT\t\n\t/*snmp */\n    UINT\t\t\t\t\t\tKeyIdx = 0;\n    PNDIS_AP_802_11_KEY\t\t\tpKey = NULL;\n\tTX_RTY_CFG_STRUC\t\t\ttx_rty_cfg;\n\tULONG\t\t\t\t\t\tShortRetryLimit, LongRetryLimit;\n\tUCHAR\t\t\t\t\t\tctmp;\n#endif /* SNMP_SUPPORT */\n\n\t\n#ifdef HOSTAPD_SUPPORT\n \tNDIS_802_11_WEP_STATUS              WepStatus;\n \tNDIS_802_11_AUTHENTICATION_MODE     AuthMode = Ndis802_11AuthModeMax;\n\tNDIS_802_11_SSID                    Ssid;\n\tMAC_TABLE_ENTRY\t\t\t\t\t\t*pEntry;\n\tstruct ieee80211req_mlme\t\t\tmlme;\n\n\tstruct ieee80211req_key\t\t\t\tKey;\n\tstruct ieee80211req_del_key\t\t\tdelkey;\n\tULONG\t\t\t\t\t\t\t\tKeyIdx;\n\tUINT8\t\tWcid;\n\tPMULTISSID_STRUCT\tpMbss ;\n\tWSC_LV_INFO            WscIEBeacon;\n   \tWSC_LV_INFO            WscIEProbeResp;\n\tint i;\n#endif /*HOSTAPD_SUPPORT*/\n\n\t\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tswitch(cmd & 0x7FFF)\n    {\n#ifdef P2P_SUPPORT\n\n\t\tcase OID_802_11_P2P_MODE:\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_MODE \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR OpMode=1;\n\t\t\t\tStatus = copy_from_user(&OpMode, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (OpMode == OPMODE_AP)\n\t\t\t\t{\n\t\t\t\t\tif (P2P_CLI_ON(pAd))\n\t\t\t\t\t\tP2P_CliStop(pAd);\n\n\t\t\t\t\tif ((!P2P_GO_ON(pAd)) || (P2P_GO_ON(pAd)))\n\t\t\t\t\t{\n\t\t\t\t\t\tP2PCfgInit(pAd);\n\t\t\t\t\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (OpMode == OPMODE_APSTA)\n\t\t\t\t{\n\t\t\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\t\t\tP2P_GoStop(pAd);\n\n\t\t\t\t\tif ((!P2P_CLI_ON(pAd)) || (P2P_CLI_ON(pAd)))\n\t\t\t\t\t{\n\t\t\t\t\t\tP2PCfgInit(pAd);\n\t\t\t\t\t\tP2P_CliStartUp(pAd);\n\t\t\t\t\t\tAsicEnableBssSync(pAd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (P2P_CLI_ON(pAd))\n\t\t\t\t\t\tP2P_CliStop(pAd);\n\t\t\t\t\telse if (P2P_GO_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tP2P_GoStop(pAd);\n\t\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t\t\tAsicEnableBssSync(pAd);\n\t\t\t\t\t}\n\t\t\t\t\tP2PCfgInit(pAd);\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2p_OpMode_Proc::(OpMode = %d)\\n\", pObj->ioctl_if, OpMode));\n\n\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n/*\n\t\tcase OID_802_11_P2P_CLEAN_TABLE:\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_CLEAN_TABLE \\n\"));\n\t\t\t{\n\t\t\t\tP2pGroupTabInit(pAd);\n\t\t\t}\n\t\t\tbreak;\n*/\n\n\t\tcase OID_802_11_P2P_SSID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_SSID \\n\"));\n\t\t\tif (wrq->u.data.length > 32)\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR Ssid[MAX_LEN_OF_SSID] = {0};\n\n\t\t\t\tNdisZeroMemory(Ssid, sizeof(Ssid));\n\t\t\t\tStatus = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_SSID Ssid=%s\\n\",Ssid));\n\t\t\t\t{\n\t\t\t\t\tSet_AP_SSID_Proc(pAd, Ssid);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: SSID = %s.\\n\", __FUNCTION__, Ssid));\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_DEVICE_NAME:\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_DEVICE_NAME \\n\"));\n\t\t\tif (wrq->u.data.length > 32)\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR DeviceName[MAX_LEN_OF_SSID + 1] = {0};\n\n\t\t\t\tNdisZeroMemory(DeviceName, sizeof(DeviceName));\n\t\t\t\tStatus = copy_from_user(&DeviceName, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_DEVICE_NAME DeviceName=%s\\n\",DeviceName));\n\t\t\t\t{\n\n\t\t\t\t\tpAd->P2pCfg.DeviceNameLen = wrq->u.data.length;\n\t\t\t\t\tNdisZeroMemory(pAd->P2pCfg.DeviceName, 32);\n\t\t\t\t\tNdisMoveMemory(pAd->P2pCfg.DeviceName, DeviceName, pAd->P2pCfg.DeviceNameLen);\n\t\t\t\t\tP2pGetRandomSSID(pAd, pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, &(pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Device Name = %s.\\n\", __FUNCTION__, pAd->P2pCfg.DeviceName));\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_LISTEN_CHANNEL:\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_LISTEN_CHANNEL \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR listen_ch;\n\t\t\t\tStatus = copy_from_user(&listen_ch, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\t/* check if this channel is valid */\n\t\t\t\tif (ChannelSanity(pAd, listen_ch) == TRUE)\n\t\t\t\t{\n\t\t\t\t\tpAd->P2pCfg.ListenChannel = listen_ch;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Listen Channel out of range, using default.\\n\"));\n\t\t\t\t\tpAd->P2pCfg.ListenChannel = 1;\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Listen Channel = %d.\\n\", __FUNCTION__, pAd->P2pCfg.ListenChannel));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_OPERATION_CHANNEL:\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_OPERATION_CHANNEL \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR op_ch;\n\t\t\t\tStatus = copy_from_user(&op_ch, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\t\t/* check if this channel is valid */\n\t\t\t\t\tif (ChannelSanity(pAd, op_ch) == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->P2pCfg.GroupChannel = op_ch;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Opertation Channel out of range, using default.\\n\"));\n\t\t\t\t\t\tpAd->P2pCfg.GroupChannel = 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Op Channel = %d.\\n\", __FUNCTION__, pAd->P2pCfg.GroupChannel));\n\t\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_GO_INT:\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_GO_INT \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR intent;\n\t\t\t\tStatus = copy_from_user(&intent, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\t\t/* check if this channel is valid */\n\t\t\t\n\t\t\t\tif (intent <= 15)\n\t\t\t\t\tpAd->P2pCfg.GoIntentIdx = intent;\t\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"GO Intent out of range 0 ~ 15, using default.\\n\"));\n\t\t\t\t\tpAd->P2pCfg.GoIntentIdx = 0;\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: GO Intent = %d.\\n\", __FUNCTION__, pAd->P2pCfg.GoIntentIdx));\n\t\t\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_SCAN:\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_SCAN \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\n\t\t\t\tUCHAR ScanType;\n\t\t\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\t\tStatus = copy_from_user(&ScanType, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Scan type is %d\\n\", ScanType));\n\n\t\t\t\tswitch(ScanType)\n\t\t\t\t{\n\t\t\t\t\tcase P2P_STOP_SCAN:\n\t\t\t\t\t\t/* Stop scan and stop to response peer P2P scanning */\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n#else\n\t\t\t\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\t\t\t\t\tpP2PCtrl->bSentProbeRSP = FALSE;\n\t\t\t\t\tP2pStopScan(pAd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_SCANNING:\n\t\t\t\t\t\t/* Do P2P scanning */\n\t\t\t\t\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n\t\t\t\t\t\tpP2PCtrl->bSentProbeRSP = TRUE;\n\t\t\t\t\t\tP2pGroupTabInit(pAd);\n\t\t\t\t\t\tP2pScan(pAd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase P2P_STOP_SCAN_AND_LISTEN:\n\t\t\t\t\t\t/* Stop scan and lock at Listen Channel to response peer P2P scanning */\n\t\t\t\t\t\tpAd->P2pCfg.bSentProbeRSP = TRUE;\n\t\t\t\t\t\tP2pStopScan(pAd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Incorrect scan type:%d\\n\", ScanType));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\t\t\t\n\n\t\tcase OID_P2P_WSC_PIN_CODE:\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_P2P_WSC_PIN_CODE wrq->u.data.length=%d\\n\",wrq->u.data.length));\n            if (wrq->u.data.length != 8) /* PIN Code Length is 8 */\n                Status = -EINVAL;\n            else\n            {\n                CHAR PinCode[9] = {0};\n                Status = copy_from_user(&PinCode[0], wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == 0)\n                {\n\t\t\t\t\tif (Set_WscVendorPinCode_Proc(pAd, (PSTRING) &PinCode[0]) == FALSE)\n\t\t\t\t\t\tStatus = -EINVAL;\n                }\n            }\n            break;\n\n\t\tcase OID_802_11_P2P_WscMode:\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_WscMode \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR p2pWscMode;\n\t\t\t\tStatus = copy_from_user(&p2pWscMode, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\t\t/* check if this channel is valid */\n\t\t\t\n\t\t\t\tif (p2pWscMode <= 2 && p2pWscMode >= 1)\n\t\t\t\t\tpAd->P2pCfg.WscMode= p2pWscMode;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscMode is invalid, using default.\\n\"));\n\t\t\t\t\tpAd->P2pCfg.WscMode = WSC_PIN_MODE; /* PIN */\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WscMode = %s.\\n\", __FUNCTION__, (p2pWscMode == 1) ? \"PIN\" : \"PBC\"));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_WscConf:\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_WscConf \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR method;\n\t\t\t\tStatus = copy_from_user(&method, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (pAd->P2pCfg.WscMode == WSC_PIN_MODE)\n\t\t\t\t{\n\t\t\t\t\tif (method == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Display PIN */\n\t\t\t\t\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_REG;\n\t\t\t\t\t\tpAd->P2pCfg.ConfigMethod =  WSC_CONFMET_DISPLAY;\n\n\t\t\t\t\t}\n\t\t\t\t\telse if (method == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Enter PIN */\n\t\t\t\t\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_USER;\n\t\t\t\t\t\tpAd->P2pCfg.ConfigMethod =  WSC_CONFMET_KEYPAD;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (pAd->P2pCfg.WscMode == WSC_PBC_MODE)\n\t\t\t\t{\n\t\t\t\t\tif (method == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_PBC;\n\t\t\t\t\t\tpAd->P2pCfg.ConfigMethod = WSC_CONFMET_PBC;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Config Method = %s.\\n\", __FUNCTION__, decodeConfigMethod(pAd->P2pCfg.ConfigMethod)));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_Link:\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_Link \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\n\t\t\t\tUCHAR p2pindex;\n\t\t\t\tPUCHAR\tpAddr;\n\t\t\t\tStatus = copy_from_user(&p2pindex, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: TabIdx[%d]\\n\", __FUNCTION__, p2pindex));\n\t\t\t\tif (p2pindex < pAd->P2pTable.ClientNumber)\n\t\t\t\t{\n\t\t\t\t\t/*P2PPrintP2PEntry(pAd, P2pTabIdx); */\n\t\t\t\t\t/*pAd->P2pCfg.ConnectingIndex = 0; */\n\t\t\t\t\t/*if (pAd->P2pTable.Client[P2pTabIdx].P2pClientState == P2PSTATE_DISCOVERY) */\n\t\t\t\t\t/*\tpAd->P2pTable.Client[P2pTabIdx].P2pClientState = P2PSTATE_CONNECT_COMMAND; */\n\t\t\t\t\t/*COPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.Client[P2pTabIdx].addr); */\n\t\t\t\t\t/*pAd->P2pTable.Client[P2pTabIdx].StateCount = 10; */\n\t\t\t\t\t/*pAd->P2pTable.Client[P2pTabIdx].bValid = TRUE; */\n\t\t\t\t\t/*P2pConnect(pAd); */\n\t\t\t\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\t\t\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_CONNECT_COMMAND);\n\t\t\t    }\n\t\t\t    else\n\t\t\t        DBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_RESET:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_P2P_RESET \\n\"));\n\t\t\tSet_P2P_Reset_Proc(pAd, \"1\");\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_SIGMA_ENABLE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_SIGMA_ENABLE \\n\"));\n\t\t\tSet_P2P_Sigma_Enable_Proc(pAd, \"1\");\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_CONNECT_ADDR:\n\t\t{\n\t\t\tUCHAR\tAddr[18] = {0};\n\t\t\tStatus = copy_from_user(&Addr, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_CONNECT_ADDR \\n\"));\n\t\t\tSet_P2P_Connect_Dev_Addr_Proc(pAd, &Addr);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_INVITE:\n\t\t{\n\t\t\tUCHAR\tAddr[18] = {0};\n\t\t\tStatus = copy_from_user(&Addr, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_INVITE \\n\"));\n\t\t\tSet_P2P_Send_Invite_Proc(pAd, &Addr);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_DELETE_PERSISTENT_TABLE:\n            \t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_DELETE_PERSISTENT_TABLE \\n\"));\n            \t\t\tSet_P2P_DelPerstTable_Proc(pAd, \"1\");\n\t\t\tbreak;\n            \n    \t\tcase OID_802_11_P2P_PERSISTENT_TABLE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_PERSISTENT_TABLE \\n\"));\n\t\t\tif (wrq->u.data.length != (sizeof(RT_P2P_PERSISTENT_ENTRY)*MAX_P2P_TABLE_SIZE))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tif (copy_from_user(&pAd->P2pTable.PerstEntry, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUCHAR j;\n\t\t\t\t\tpAd->P2pTable.PerstNumber = 0;\t\t\t\t\t\n\t\t\t\t\tfor (j = 0; j < MAX_P2P_TABLE_SIZE; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->P2pTable.PerstEntry[j].bValid)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->P2pTable.PerstNumber++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n        case OID_802_11_P2P_PERSISTENT_ENABLE:\n            {\n                if (wrq->u.data.length > sizeof(INT32))\n                    Status  = -EINVAL;\n                else\n                {\n                    INT32 EnablePersistent = 0;\n                \n                    Status = copy_from_user(&EnablePersistent, wrq->u.data.pointer, wrq->u.data.length);\n                    if (Status == NDIS_STATUS_SUCCESS)\n                    {\n                        if (EnablePersistent <= 0)\n                            Set_P2P_Persistent_Enable_Proc(pAd, \"0\");\n                        else\n                            Set_P2P_Persistent_Enable_Proc(pAd, \"1\");\n                        DBGPRINT(RT_DEBUG_TRACE, (\"%s:: OID_802_11_P2P_PERSISTENT_ENABLE = %d.\\n\", __FUNCTION__, EnablePersistent));\n                        \n                    }\n                    else\n                        DBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_PERSISTENT_ENABLE error!!\\n\"));\n                }\n            }\n            break;\n            \n\t\tcase OID_802_11_P2P_ENTER_PIN:\n\t\t\t{\n\t\t\t\tUCHAR\tPIN[10] = {0};\n\t\t\t\tStatus = copy_from_user(&PIN, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_ENTER_PIN , pin = %s \\n\", PIN));\n\t\t\t\tSet_P2P_Enter_WSC_PIN_Proc(pAd, &PIN);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_TRIGGER_WSC:\n\t\t\t{\n\t\t\t\t//Set_P2P_ConfirmByUI_Proc(pAd, \"1\");//We need to make ConfirmByUI to true, to make the further operation go ahead.\n\t\t\t\tUCHAR wsc_trigger[2] = {0};\n\t\t\t\tStatus = copy_from_user(&wsc_trigger, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"##### Set::OID_802_11_P2P_TRIGGER_WSC \\n\"));\n\t\t\t\tSet_AP_WscGetConf_Proc(pAd, &wsc_trigger);\n\t\t\t\t//Set_P2P_ConfirmByUI_Proc(pAd, \"0\");//Disable it here. to block the next opration.\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_WSC_CONF_MODE:\n\t\t\t{\n\t\t\t\tUCHAR wsc_conf_mode[2] = {0};\n\t\t\t\tStatus = copy_from_user(&wsc_conf_mode, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"##### Set::OID_802_11_P2P_WSC_CONF_MODE = %s \\n\", decodeConfigMethod(wsc_conf_mode)));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"##### Set::OID_802_11_P2P_WSC_CONF_MODE = %s \\n\", wsc_conf_mode));\n\t\t\t\tSet_AP_WscConfMode_Proc(pAd, &wsc_conf_mode);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_WSC_MODE:\n\t\t\t{\n\t\t\t\tUCHAR wsc_mode[2] = {0};\n\t\t\t\tStatus = copy_from_user(&wsc_mode, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"##### Set::OID_802_11_P2P_WSC_MODE = %s \\n\", wsc_mode));\n\t\t\t\tSet_AP_WscMode_Proc(pAd, &wsc_mode);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_PIN_CODE:\n\t\t\t{\n\t\t\t\tUCHAR\tPIN[10] = {0};\n\t\t\t\tStatus = copy_from_user(&PIN, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_PIN_CODE, pin = %s \\n\", PIN));\n\t\t\t\tSet_AP_WscPinCode_Proc(pAd, &PIN);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_PROVISION:\n\t\t\t{\n\t\t\t\tUCHAR p2pindex;\n\t\t\t\tPUCHAR pAddr;\n\t\t\t\tStatus = copy_from_user(&p2pindex, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_PROVISION(%d)\\n\", p2pindex));\n\t\t\t\tif (p2pindex < pAd->P2pTable.ClientNumber)\n\t\t\t\t{\n\t\t\t\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\t\t\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_PROVISION_COMMAND);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_P2P_PROVISION out of range!\\n\"));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_PROVISION_MAC:\n\t\t{\n\t\t\tUCHAR\tAddr[18] = {0};\n\t\t\tStatus = copy_from_user(&Addr, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_CONNECT_ADDR \\n\"));\n\t\t\tSet_P2P_Provision_Dev_Addr_Proc(pAd, &Addr);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_PASSPHRASE:\n\t\t\t{\n\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\t\t\t\tINT retval;\n\t\t\t\tUCHAR pass_phrase[65];\n\n\t\t\t\tNdisZeroMemory(&pass_phrase, sizeof(pass_phrase));\n\t\t\t\tStatus = copy_from_user(&pass_phrase, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_P2P_PASSPHRASE(%s)\\n\", pass_phrase));\n\t\t\t\tretval = Set_AP_WPAPSK_Proc(pAd, pass_phrase);\n\n\t\t\t\t//pMBSSStruct = &pAd->ApCfg.MBSSID[0];\n\t\t\t\t//retval = RT_CfgSetWPAPSKKey(pAd, &pass_phrase, strlen(&pass_phrase), (PUCHAR)pMBSSStruct->Ssid, pMBSSStruct->SsidLen, pMBSSStruct->PMK);\n\t\t\t\tif (retval == FALSE)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P PassPhrase Generate Fail\\n\"));\n\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_LINK_DOWN:\n\t\t\t{\n\t\t\t\tCHAR conn_stat;\n\t\t\t\tStatus = copy_from_user(&conn_stat, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif( conn_stat == 1)\n\t\t\t\t\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n\t\t\t\telse\n\t\t\t\t\tP2pLinkDown(pAd, P2P_CONNECT_FAIL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_PRI_DEVICE_TYPE:\n\t\t\t{\n\t\t\t\tUCHAR pri_dev_type[8];\n\t\t\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\t\tif ( wrq->u.data.length == 8 )\n\t\t\t\t\tStatus = copy_from_user(&pri_dev_type, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif ( Status == 0 )\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tNdisMoveMemory(pP2PCtrl->DevInfo.PriDeviceType, pri_dev_type, 8);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::OID_802_11_P2P_PRI_DEVICE_TYPE = %02X%02X-%02X%02X%02X%02X-%02X%02X.\\n\", __FUNCTION__, \n\t\t\t\t\t\tpP2PCtrl->DevInfo.PriDeviceType[0], pP2PCtrl->DevInfo.PriDeviceType[1],\n\t\t\t\t\t\tpP2PCtrl->DevInfo.PriDeviceType[2], pP2PCtrl->DevInfo.PriDeviceType[3],\n\t\t\t\t\t\tpP2PCtrl->DevInfo.PriDeviceType[4], pP2PCtrl->DevInfo.PriDeviceType[5],\n\t\t\t\t\t\tpP2PCtrl->DevInfo.PriDeviceType[6], pP2PCtrl->DevInfo.PriDeviceType[7]));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_DEL_CLIENT:\n\t\t{\n\t\t\tchar macstr[32];\n\t\t\tmemset(macstr, 0, sizeof(macstr));\n\t\t\tif (wrq->u.data.length < sizeof(macstr))\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(macstr, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::OID_802_11_P2P_DEL_CLIENT(macstr=%s)\\n\", __FUNCTION__, macstr));\n\t\t\t\t\tSet_P2P_DelDevByAddr_Proc(pAd, macstr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n#ifdef WFD_SUPPORT\n\t\t/*\n\t\t * Enable/Disable driver WFD functionality\n\t\t * Value:\n\t\t * \t0:\tDisable \t\n\t\t * \t1:\tEnable\t\t\n\t\t*/\n\t\tcase OID_802_11_WFD_ENABLE:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(BOOLEAN))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN bEnable;\n\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&bEnable, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif (bEnable == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.bWfdEnable= TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Enable WFD Support!\\n\", __FUNCTION__));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.bWfdEnable= FALSE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Disable WFD Support!\\n\", __FUNCTION__));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_ENABLE error!!\\n\"));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n#ifdef RT_CFG80211_SUPPORT\n\t\t/*\n\t\t * Enable/Disable insert WFD IE to management frames from wpa_supplicant\n\t\t * Value:\n\t\t *\t0:\tDisable \t\n\t\t *\t1:\tEnable\t\t\n\t\t*/\n\t\tcase OID_802_11_WFD_IE_INSERT:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(BOOLEAN))\n\t\t\t\tStatus\t= -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN bEnable;\n\t\t\t\tCFG80211_CB *pCfg80211_CB = NULL;\n\n\t\t\t\tpAd->StaCfg.WfdCfg.bSuppInsertWfdIe = FALSE;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\t\t\tif (pAd->pCfg80211_CB != NULL)\n\t\t\t\t{\n\t\t\t\t\tpCfg80211_CB = (CFG80211_CB *)pAd->pCfg80211_CB;\n\t\t\t\t\tif (pCfg80211_CB->pCfg80211_Wdev != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pCfg80211_CB->pCfg80211_Wdev->wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_CLIENT)) ||\n\t\t\t\t\t\t\t(pCfg80211_CB->pCfg80211_Wdev->wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_GO)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tStatus = copy_from_user(&bEnable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (bEnable == TRUE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.WfdCfg.bSuppInsertWfdIe = TRUE;\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.WfdCfg.bWfdEnable= TRUE;\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Enable Insert WFD IE Support for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Disable Insert WFD IE Support for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_IE_INSERT error!!\\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Interface mode not support Insert WFD IE for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: pCfg80211_CB->pCfg80211_Wdev is NULL. Not Support Insert WFD IE for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n#endif\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: pAd->pCfg80211_CB is NULL. Not Support Insert WFD IE for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n#endif /* RT_CFG80211_SUPPORT */\n\n\t\t/*\n\t\t * Set WFD device type\n\t\t * Value:\n\t\t * \t0:\tWFD Source\t\t\n\t\t * \t1:\tWFD Primary Sink\n\t\t * \t2:\tWFD Secondary Sink\t\t\n\t\t * \t3:\tWFD Source/Primary Sink\n\t\t*/\n\t\tcase OID_802_11_WFD_DEVICE_TYPE:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(UCHAR))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR DeviceType;\n\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&DeviceType, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif (DeviceType <= WFD_SOURCE_PRIMARY_SINK)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.DeviceType = DeviceType;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: WFD Device Type = %d.\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.DeviceType));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: RTSP Port out of range.\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_DEVICE_TYPE error!!\\n\"));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\t/* \n\t\t * Set WFD device to support couple source/sink or not.\n\t\t * Value:\n\t\t * \t0:\tWFD device not support couple sink/source\t\t\n\t\t * \t1:\tWFD device support couple sink/source\n\t\t */\n\t\tcase OID_802_11_WFD_SOURCE_COUPLED:\n\t\tcase OID_802_11_WFD_SINK_COUPLED:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(UCHAR))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR Coupled;\n\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&Coupled, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif ((Coupled == WFD_COUPLED_NOT_SUPPORT) \n\t\t\t\t\t\t|| (Coupled == WFD_COUPLED_SUPPORT))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->StaCfg.WfdCfg.DeviceType == WFD_SOURCE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.WfdCfg.SourceCoupled = Coupled;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((pAd->StaCfg.WfdCfg.DeviceType == WFD_PRIMARY_SINK) ||\n\t\t\t\t\t\t\t\t(pAd->StaCfg.WfdCfg.DeviceType == WFD_SECONDARY_SINK))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.WfdCfg.SinkCoupled = Coupled;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (pAd->StaCfg.WfdCfg.DeviceType == WFD_SOURCE_PRIMARY_SINK)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.WfdCfg.SourceCoupled = Coupled;\n\t\t\t\t\t\t\tpAd->StaCfg.WfdCfg.SinkCoupled = Coupled;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: WFD SOURCE / SINK COUPLED = %d / %d.\\n\", \n\t\t\t\t\t\t\t\t__FUNCTION__, pAd->StaCfg.WfdCfg.SourceCoupled, pAd->StaCfg.WfdCfg.SinkCoupled));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WFD SOURCE / SINK COUPLED out of range.\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_SOURCE/SINK_COUPLED error!!\\n\"));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\t\n\n\t\t/* \n\t\t * Set available for WFD session or not.\n\t\t * Value:\n\t\t * \t0:\tNot available for WFD Session\t\t\n\t\t * \t1:\tAvailable for WFD Session\n\t\t*/\n\t\tcase OID_802_11_WFD_SESSION_AVAILABLE:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(UCHAR))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR SessionAvail;\n\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&SessionAvail, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif ((SessionAvail == WFD_SESSION_NOT_AVAILABLE)\n\t\t\t\t\t\t|| (SessionAvail == WFD_SESSION_AVAILABLE))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.SessionAvail = SessionAvail;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: WFD SESSION AVAILABLE = %d.\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.SessionAvail));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WFD SESSION AVAILABLE out of range.\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_SESSION_AVAILABLE error!!\\n\"));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\t/* \n\t\t * Set TCP port at which the WFD device listens for RTSP messages.\n\t\t * Value: \n\t\t * \t0~65535 (Default 7236)\n\t\t*/\n\t\tcase OID_802_11_WFD_RTSP_PORT:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(INT32))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tINT32 RtspPort;\n\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&RtspPort, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif (RtspPort < 0 || 65535 < RtspPort)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.RtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: RTSP Port out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.RtspPort));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.RtspPort = RtspPort;\n\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: WFD RTSP PORT = %d.\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.RtspPort));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_RTSP_PORT error!!\\n\"));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\t/* \n\t\t * Set Maximum average throughput capability of the WFD Device represented in multiples of 1Mbps.\n\t\t * Value: \n\t\t * \t1~65535 Mbps\n\t\t*/\n\t\tcase OID_802_11_WFD_MAX_THROUGHPUT:\n\t\t{\n\t\t\tif (wrq->u.data.length > sizeof(INT32))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tINT32 MaxThroughput;\n\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&MaxThroughput, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tif (MaxThroughput <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.MaxThroughput = WFD_MAX_THROUGHPUT_DEFAULT;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Max Throughput out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.MaxThroughput));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.MaxThroughput = MaxThroughput;\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: WFD MAX THROUGHPUT = %d.\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.MaxThroughput));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_MAX_THROUGHPUT error!!\\n\"));\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\t/* \n \t\t * Set Content Protect capability of the WFD Device\n\t\t * \t0:\tNot supported\t\t\n\t\t * \t1:\tSupported\n\t\t */\n        case OID_802_11_WFD_CONTENT_PROTECT:\n        {\n            if (wrq->u.data.length > sizeof(INT32))\n                Status  = -EINVAL;\n            else\n            {\n                INT32 ContentProtect = 0;\n\n                Status = copy_from_user(&ContentProtect, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == NDIS_STATUS_SUCCESS)\n                {\n                    if (ContentProtect < 0)\n                    {\n                        pAd->StaCfg.WfdCfg.CP= WFD_CONTENT_PROTECT_DEFAULT;\n                        DBGPRINT(RT_DEBUG_ERROR, (\"%s:: Content Protect out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.CP));\n                    }\n                    else\n                        pAd->StaCfg.WfdCfg.CP = ContentProtect;\n\n                    DBGPRINT(RT_DEBUG_TRACE, (\"%s:: WFD CONTENT PROTECT = %d.\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.CP));\n                }\n                else\n                    DBGPRINT(RT_DEBUG_ERROR, (\"Set::OID_802_11_WFD_CONTENT_PROTECT error!!\\n\"));\n            }\n        }\n        break;\n#endif /* WFD_SUPPORT */\n\n#endif /* P2P_SUPPORT */\n\n    \tcase OID_802_11_DEAUTHENTICATION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DEAUTHENTICATION\\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{                \t\t\t\t\t\t\t\t\n\t\t\t\tMAC_TABLE_ENTRY \t\t*pEntry = NULL;\n\t\t\t\tMLME_DEAUTH_REQ_STRUCT  *pInfo;\n\t\t\t\tMLME_QUEUE_ELEM \t\t*Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); */\n\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\tif (Elem)\n\t\t\t\t{\n\t\t\t\t\tpInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;\n\t\t\t\t\tStatus = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\t\tif ((pEntry = MacTableLookup(pAd, pInfo->Addr)) != NULL)\n\t\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\t\tElem->Wcid = pEntry->Aid;\n\t\t\t\t\t\tMlmeEnqueue(pAd, AP_AUTH_STATE_MACHINE, APMT2_MLME_DEAUTH_REQ,\n\t\t\t\t\t\t\t\t\t\tsizeof(MLME_DEAUTH_REQ_STRUCT), Elem, 0);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\\n\", pInfo->Reason));\n\t\t\t\t\t}\n/*\t\t\t\t\tkfree(Elem); */\n\t\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n#ifdef IAPP_SUPPORT\n    \tcase RT_SET_IAPP_PID:\n\t\t\t{\n\t\t\t\tunsigned long IappPid;\n\t\t\t\tif (copy_from_user(&IappPid, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n    \t\t\telse\n    \t\t\t{\n\t\t\t\t\tRTMP_GET_OS_PID(pObj->IappPid, IappPid);\n\t\t\t\t\tpObj->IappPid_nr = IappPid;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_SET_APD_PID::(IappPid=%lu(0x%x))\\n\", IappPid, pObj->IappPid));\n\t\t\t\t}\n    \t\t}\n\t\t\tbreak;\n#endif /* IAPP_SUPPORT */\n\n    \tcase RT_SET_APD_PID:\n\t\t\t{\n\t\t\t\tunsigned long apd_pid;\n\t\t\t\tif (copy_from_user(&apd_pid, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n    \t\t\telse\n    \t\t\t{\n\t\t\t\t\tRTMP_GET_OS_PID(pObj->apd_pid, apd_pid);\n\t\t\t\t\tpObj->apd_pid_nr = apd_pid;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_SET_APD_PID::(ApdPid=%lu(0x%x))\\n\", apd_pid, pObj->apd_pid));\n\t\t\t\t}\n    \t\t}\n\t\t\tbreak;\n\t\tcase RT_SET_DEL_MAC_ENTRY:\n    \t\tif (copy_from_user(Addr, wrq->u.data.pointer, wrq->u.data.length))\n\t\t{\n\t\t\t\tStatus = -EFAULT; \t\n\t\t}\n    \t\telse\n    \t\t{\n\t\t\tUCHAR HashIdx;\n\t\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_SET_DEL_MAC_ENTRY::(%02x:%02x:%02x:%02x:%02x:%02x)\\n\", Addr[0],Addr[1],Addr[2],Addr[3],Addr[4],Addr[5]));\n\n\t\t\tHashIdx = MAC_ADDR_HASH_INDEX(Addr);\n\t\t\tpEntry = pAd->MacTab.Hash[HashIdx];\n\t\t\t\n\t\t\tif (pEntry)\n\t\t\t{\n\t\t\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);\n/*\t\t\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, Addr); */\n\t\t\t}\n    \t\t}\n\t\t\tbreak;\n#ifdef WSC_AP_SUPPORT\n\t\tcase RT_OID_WSC_SET_SELECTED_REGISTRAR:\n\t\t\t{\t\n\t\t\t\tPUCHAR      upnpInfo;\n\t\t\t\tUCHAR\t    apidx = pObj->ioctl_if;\n\t\t\t\t\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n#endif /*HOSTAPD_SUPPORT*/\n\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WSC::RT_OID_WSC_SET_SELECTED_REGISTRAR, wrq->u.data.length=%d!\\n\", wrq->u.data.length));\n/*\t\t\t\tupnpInfo = kmalloc(wrq->u.data.length, GFP_KERNEL); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&upnpInfo, wrq->u.data.length);\n\t\t\t\tif(upnpInfo)\n\t\t\t\t{\n\t\t\t\t\tint len, Status;\n\t\t\t\t\t\n\t\t\t\t\tStatus = copy_from_user(upnpInfo, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tif (Status == NDIS_STATUS_SUCCESS)\n\t\t\t\t\t{\n\t\t\t\t\t\tlen = wrq->u.data.length;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode & WSC_PROXY))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tWscSelectedRegistrar(pAd, upnpInfo, len, apidx);\n\t\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimerRunning == TRUE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tBOOLEAN Cancelled;\n\t\t\t\t\t\t\t\tRTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimer, &Cancelled);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/* 2mins time-out timer */\n\t\t\t\t\t\t\tRTMPSetTimer(&pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimerRunning = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n/*\t\t\t\t\tkfree(upnpInfo); */\n\t\t\t\t\tos_free_mem(NULL, upnpInfo);\n\t\t\t\t} \n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t}\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\t\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RT_OID_WSC_EAPMSG:\n\t\t\t{\n\t\t\t\tRTMP_WSC_U2KMSG_HDR *msgHdr = NULL;\n\t\t\t\tPUCHAR pUPnPMsg = NULL;\n\t\t\t\tUINT msgLen = 0, Machine = 0, msgType = 0;\n\t\t\t\tint retVal, senderID = 0;\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\tUCHAR\t    apidx = pObj->ioctl_if;\n\n\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n#endif /*HOSTAPD_SUPPORT*/\n\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WSC::RT_OID_WSC_EAPMSG, wrq->u.data.length=%d, ioctl_if=%d\\n\", wrq->u.data.length, pObj->ioctl_if));\n\t\t\t\n\t\t\t\tmsgLen = wrq->u.data.length;\t\t\t\t\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pUPnPMsg, msgLen);\n/*\t\t\t\tif((pUPnPMsg = kmalloc(msgLen, GFP_KERNEL)) == NULL) */\n\t\t\t\tif (pUPnPMsg == NULL)\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tint HeaderLen;\n\t\t\t\t\tPSTRING pWpsMsg;\n\t\t\t\t\tUINT WpsMsgLen;\n\t\t\t\t\tPWSC_CTRL pWscControl;\n\t\t\t\t\tBOOLEAN\tbGetDeviceInfo = FALSE;\n\n\t\t\t\t\tNdisZeroMemory(pUPnPMsg, msgLen);\n\t\t\t\t\tretVal = copy_from_user(pUPnPMsg, wrq->u.data.pointer, msgLen);\n\n\t\t\t\t\tmsgHdr = (RTMP_WSC_U2KMSG_HDR *)pUPnPMsg;\n\t\t\t\t\tsenderID = get_unaligned((INT32 *)(&msgHdr->Addr2[0]));\n\t\t\t\t\t/*senderID = *((int *)&msgHdr->Addr2); */\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_EAPMSG++++++++\\n\\n\"));\n\t\t\t\t\thex_dump(\"MAC::\", &msgHdr->Addr3[0], MAC_ADDR_LEN);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_EAPMSG++++++++\\n\\n\"));\t\t\t\t\t\n\n\t\t\t\t\tHeaderLen = LENGTH_802_11 + LENGTH_802_1_H + sizeof(IEEE8021X_FRAME) + sizeof(EAP_FRAME);\n\t\t\t\t\tpWpsMsg = (PSTRING) &pUPnPMsg[HeaderLen];\n\t\t\t\t\tWpsMsgLen = msgLen - HeaderLen;\n\n\t\t\t\t\t/*assign the STATE_MACHINE type */\n\t\t\t\t\tMachine = WSC_STATE_MACHINE;\n\t\t\t\t\tmsgType = WSC_EAPOL_UPNP_MSG;\n\n\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;\n\t\t\t\t\t/* If AP is unconfigured, WPS state machine will be triggered after received M2. */\n\t\t\t\t\tif ((pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\t\t&& (pWscControl->WscV2Info.bWpsEnable || (pWscControl->WscV2Info.bEnableWpsV2 == FALSE))\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (strstr(pWpsMsg, \"SimpleConfig\") &&\n\t\t\t\t\t\t\t!pWscControl->EapMsgRunning &&\n\t\t\t\t\t\t\t!pWscControl->WscUPnPNodeInfo.bUPnPInProgress)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* GetDeviceInfo */\n\t\t\t\t\t\t\tWscInit(pAd, FALSE, pObj->ioctl_if & MIN_NET_DEVICE_FOR_P2P_GO);\n\t\t\t\t\t\t\t/* trigger wsc re-generate public key */\n\t\t\t\t\t\t\tpWscControl->RegData.ReComputePke = 1;\n\t\t\t\t\t\t\tbGetDeviceInfo = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (WscRxMsgTypeFromUpnp(pAd, pWpsMsg, WpsMsgLen) == WSC_MSG_M2 &&\n\t\t\t\t\t\t\t\t!pWscControl->EapMsgRunning &&\n\t\t\t\t\t\t\t\t!pWscControl->WscUPnPNodeInfo.bUPnPInProgress)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Check Enrollee Nonce of M2 */\n\t\t\t\t\t\t\tif (WscCheckEnrolleeNonceFromUpnp(pAd, pWpsMsg, WpsMsgLen, pWscControl))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tWscGetConfWithoutTrigger(pAd, pWscControl, TRUE);\n\t\t\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_SENT_M1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t\tretVal = MlmeEnqueueForWsc(pAd, msgHdr->envID, senderID, Machine, msgType, msgLen, pUPnPMsg);\n\t\t\t\t\tif((retVal == FALSE) && (msgHdr->envID != 0))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeEnqueuForWsc return False and envID=0x%x!\\n\", msgHdr->envID));\n\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t}\n\n\t\t\t\t\tos_free_mem(NULL, pUPnPMsg);\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_EAPMSG finished!\\n\"));\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\t\t}\n#endif /*HOSTAPD_SUPPORT*/\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_WSC_READ_UFD_FILE:\n\t\t\tif (wrq->u.data.length > 0)\n\t\t\t{\n\t\t\t\tSTRING\t\t*pWscUfdFileName = NULL;\n\t\t\t\tUCHAR \t\tapIdx = pObj->ioctl_if;\n\t\t\t\tPWSC_CTRL\tpWscCtrl = &pAd->ApCfg.MBSSID[apIdx].WscControl;\n/*\t\t\t\tpWscUfdFileName = (PSTRING)kmalloc(wrq->u.data.length+1, MEM_ALLOC_FLAG); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pWscUfdFileName, wrq->u.data.length+1);\n\t\t\t\tif (pWscUfdFileName)\n\t\t\t\t{\n\t\t\t\t\tRTMPZeroMemory(pWscUfdFileName, wrq->u.data.length+1);\n\t\t\t\t\tif (copy_from_user(pWscUfdFileName, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_READ_UFD_FILE (WscUfdFileName=%s)\\n\", pWscUfdFileName));\n\t\t\t\t\t\tif (pWscCtrl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (WscReadProfileFromUfdFile(pAd, apIdx, pWscUfdFileName))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpWscCtrl->WscConfStatus = WSC_SCSTATE_CONFIGURED;\n\t\t\t\t\t\t\t\tAPStop(pAd);\n\t\t\t\t\t\t\t\tAPStartUp(pAd);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_READ_UFD_FILE: AP is configured.\\n\"));\n\t\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n/*\t\t\t\t\tkfree(pWscUfdFileName); */\n\t\t\t\t\tos_free_mem(NULL, pWscUfdFileName);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus = -ENOMEM;\n\t\t\t}\n\t\t\telse\n\t\t\t\tStatus = -EINVAL;\n\t\t\tbreak;\n\t\t\t\n\t\tcase RT_OID_WSC_WRITE_UFD_FILE:\n\t\t\tif (wrq->u.data.length > 0)\n\t\t\t{\n\t\t\t\tSTRING\t\t*pWscUfdFileName = NULL;\n\t\t\t\tUCHAR \t\tapIdx = pObj->ioctl_if;\n\t\t\t\tPWSC_CTRL\tpWscCtrl = &pAd->ApCfg.MBSSID[apIdx].WscControl;\n/*\t\t\t\tpWscUfdFileName = (PSTRING)kmalloc(wrq->u.data.length+1, MEM_ALLOC_FLAG); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pWscUfdFileName, wrq->u.data.length+1);\n\t\t\t\tif (pWscUfdFileName)\n\t\t\t\t{\n\t\t\t\t\tRTMPZeroMemory(pWscUfdFileName, wrq->u.data.length+1);\n\t\t\t\t\tif (copy_from_user(pWscUfdFileName, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_WRITE_UFD_FILE (WscUfdFileName=%s)\\n\", pWscUfdFileName));\n\t\t\t\t\t\tif (pWscCtrl->WscConfStatus == WSC_SCSTATE_CONFIGURED)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tWscWriteProfileToUfdFile(pAd, apIdx, pWscUfdFileName);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_WRITE_UFD_FILE: AP is un-configured.\\n\"));\n\t\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n/*\t\t\t\t\tkfree(pWscUfdFileName); */\n\t\t\t\t\tos_free_mem(NULL, pWscUfdFileName);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus = -ENOMEM;\n\t\t\t}\n\t\t\telse\n\t\t\t\tStatus = -EINVAL;\n\t\t\tbreak;\n\n\t\tcase RT_OID_WSC_UUID:\n\t\t\tif (wrq->u.data.length == (UUID_LEN_STR-1))\n\t\t\t{\n\t\t\t\tUCHAR \t\tapIdx = pObj->ioctl_if;\n\t\t\t\tpAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_Str[0] = '\\0';\n\t\t\t\tStatus = copy_from_user(&pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_Str[0],\n\t\t\t\t\t\t\t\t\t\twrq->u.data.pointer, \n\t\t\t\t\t\t\t\t\t\twrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"UUID ASCII string: %s\\n\", \n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_Str));\n\t\t\t}\n\t\t\telse if (wrq->u.data.length == UUID_LEN_HEX)\n\t\t\t{\n\t\t\t\tUCHAR \t\tapIdx = pObj->ioctl_if, ii;\t\t\t\t\n\t\t\t\tStatus = copy_from_user(&pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_E[0],\n\t\t\t\t\t\t\t\t\t\twrq->u.data.pointer, \n\t\t\t\t\t\t\t\t\t\twrq->u.data.length);\n\n\t\t\t\tfor (ii=0; ii< 16; ii++)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x\", (pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_E[ii] & 0xff)));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tStatus = -EINVAL;\n\t\t\tbreak;\n#endif /* WSC_AP_SUPPORT */\n\n\n#ifdef SNMP_SUPPORT\n\t\tcase OID_802_11_SHORTRETRYLIMIT:\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\t\ttx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SHORTRETRYLIMIT (tx_rty_cfg.field.ShortRetryLimit=%d, ShortRetryLimit=%ld)\\n\", tx_rty_cfg.field.ShortRtyLimit, ShortRetryLimit));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_LONGRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_LONGRETRYLIMIT \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\t\ttx_rty_cfg.field.LongRtyLimit = LongRetryLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_LONGRETRYLIMIT (tx_rty_cfg.field.LongRetryLimit= %d,LongRetryLimit=%ld)\\n\", tx_rty_cfg.field.LongRtyLimit, LongRetryLimit));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYVALUE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE\\n\"));\n/*\t\t\tpKey = kmalloc(wrq->u.data.length, GFP_KERNEL); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length);\n\t\t\tif (pKey == NULL)\n\t\t\t{\n\t\t\t\tStatus= -EINVAL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tStatus = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t/*pKey = &WepKey; */\n\t\t\t\n\t\t\tif ( pKey->Length != wrq->u.data.length)\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\\n\"));\n\t\t\t}\n\t\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"pKey->KeyIndex =%d, pKey->KeyLength=%d\\n\", pKey->KeyIndex, pKey->KeyLength));\n\n\t\t\t/* it is a shared key */\n\t\t\tif (KeyIdx > 4)\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t\t{\n\t\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t}\n\t\t\t\t/*RestartAPIsRequired = TRUE; */\n\t\t\t}\n\t\t\tos_free_mem(NULL, pKey);\n\t\t\tbreak;\n\n\n\t\tcase OID_802_11_WEPDEFAULTKEYID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYID \\n\"));\n\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t\tStatus = copy_from_user(&pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\tbreak;\n\n\n\t\tcase OID_802_11_CURRENTCHANNEL:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_CURRENTCHANNEL \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tSTRING\tChStr[5] = {0};\n\t\t\t\tStatus = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tsnprintf(ChStr, sizeof(ChStr), \"%d\", ctmp);\n\t\t\t\tSet_Channel_Proc(pAd, ChStr);\n\t\t\t}\n\t\t\tbreak;\n#endif /* SNMP_SUPPORT */\n\n\n#ifdef WAPI_SUPPORT\n\t\tcase OID_802_11_WAPI_PID:\n\t\t\t{\n\t\t\t\tunsigned long wapi_pid;\n    \t\t\tif (copy_from_user(&wapi_pid, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n    \t\t\telse\n    \t\t\t{\n\t\t\t\t\tRTMP_GET_OS_PID(pObj->wapi_pid, wapi_pid);\n\t\t\t\t\tpObj->wapi_pid_nr = wapi_pid;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OID_802_11_WAPI_PID::(WapiPid=%lu(0x%x))\\n\", wapi_pid, pObj->wapi_pid));\n\t\t\t\t}\n    \t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_PORT_SECURE_STATE:\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_PORT_SECURE_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\n\t\t\t\tMAC_TABLE_ENTRY \t\t*pEntry = NULL;\n\t\t\t\tWAPI_PORT_SECURE_STRUCT  wapi_port;\n\n\t\t\t\tStatus = copy_from_user(&wapi_port, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == NDIS_STATUS_SUCCESS)\n                {\n\t\t\t\t\tif ((pEntry = MacTableLookup(pAd, wapi_port.Addr)) != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (wapi_port.state)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase WAPI_PORT_SECURED:\n\t\t\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\t\t\t\t\t\t\tbreak;\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_PORT_SECURE_STATE (state=%d)\\n\", wapi_port.state));\n\t\t\t\t}\t\t\t\t\n            }\n\t\t\tbreak;\n\t\t\t\n\t\tcase OID_802_11_UCAST_KEY_INFO:\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_UCAST_KEY_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\n\t\t\t\tMAC_TABLE_ENTRY \t\t*pEntry = NULL;\n\t\t\t\tWAPI_UCAST_KEY_STRUCT   wapi_ukey;\n\n\t\t\t\tStatus = copy_from_user(&wapi_ukey, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == NDIS_STATUS_SUCCESS)\n                {\n\t\t\t\t\tif ((pEntry = MacTableLookup(pAd, wapi_ukey.Addr)) != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->usk_id = wapi_ukey.key_id;\n\t\t\t\t\t\tNdisMoveMemory(pEntry->PTK, wapi_ukey.PTK, 64);\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t/* Install pairwise key */\n\t\t\t\t\t\tWAPIInstallPairwiseKey(pAd, pEntry, TRUE);\n\n\t\t\t\t\t\t/* Start or re-start USK rekey mechanism, if necessary. */\n\t\t\t\t\t\tRTMPCancelWapiRekeyTimerAction(pAd, pEntry);\n\t\t\t\t\t\tRTMPStartWapiRekeyTimerAction(pAd, pEntry);\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_UCAST_KEY_INFO complete\\n\"));\n\t\t\t\t\thex_dump(\"WAPI UCAST KEY\", pEntry->PTK, 64);\n\t\t\t\t}\t\t\t\t\n            }\n\t\t\tbreak;\t\n\t\t\t\n#endif /* WAPI_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\n\t\tcase OID_802_DOT1X_PMKID_CACHE:\n\t\t\tRTMPIoctlAddPMKIDCache(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_RADIUS_DATA:\n\t\t\tRTMPIoctlRadiusData(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_WPA_KEY:\n\t\t\tRTMPIoctlAddWPAKey(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_STATIC_WEP_COPY:\n\t\t\tRTMPIoctlStaticWepCopy(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase OID_802_DOT1X_IDLE_TIMEOUT:\n\t\t\tRTMPIoctlSetIdleTimeout(pAd, wrq);\n\t\t\tbreak;\n#endif /* DOT1X_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n        case OID_802_11_AUTHENTICATION_MODE:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE)) \n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);\n                if (AuthMode > Ndis802_11AuthModeMax)\n                {\n                    Status  = -EINVAL;\n                    break;\n                }\n                else\n                {\n                    if (pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode != AuthMode)\n                    {\n                        /* Config has changed */\n                        pAd->bConfigChanged = TRUE;\n                    }\n                    pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode = AuthMode;\n                }\n                pAd->ApCfg.MBSSID[pObj->ioctl_if].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_AUTHENTICATION_MODE (=%d) \\n\",pAd->ApCfg.MBSSID[0].AuthMode));\n            }\n\t\tAPStop(pAd);\n\t\tAPStartUp(pAd);\n            break;\n\n        case OID_802_11_WEP_STATUS:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS)) \n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);\n                /* Since TKIP, AES, WEP are all supported. It should not have any invalid setting */\n                if (WepStatus <= Ndis802_11GroupWEP104Enabled)\n                {\n                    if (pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus != WepStatus)\n                    {\n                        /* Config has changed */\n                        pAd->bConfigChanged = TRUE;\n                    }\n                    pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus     = WepStatus;\n\n                    if (pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus == Ndis802_11Encryption4Enabled){\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t}\n\t\t\t\t\telse{\n                    \tpAd->ApCfg.MBSSID[pObj->ioctl_if].GroupKeyWepStatus = WepStatus;\n                    }\n                }\n                else\n                {\n                    Status  = -EINVAL;\n                    break;\n                }\n\t\t\tAPStop(pAd);\n\t\t\tAPStartUp(pAd);\n                \tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEP_STATUS (=%d)\\n\",WepStatus));\n            }\n            break;\n\t\t\t\n        case OID_802_11_SSID:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))\n                Status = -EINVAL;\n            else\n            {\n            \t\tPSTRING pSsidString = NULL;\n                \tStatus = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);\n\n                \tif (Ssid.SsidLength > MAX_LEN_OF_SSID)\n                    \t\tStatus = -EINVAL;\n                \telse\n                \t{\n                \t\tif (Ssid.SsidLength == 0)\n\t\t    \t\t{\n                \t\t\tStatus = -EINVAL;\n\t\t    \t\t}\n\t\t\t\telse\n                    \t\t{\n\t                \t\t//pSsidString = (PSTRING)kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG);\n\t\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\t\t\tif (pSsidString)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\t\t\t\tNdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength);\n\t\t\t\t\t\tNdisZeroMemory((PCHAR)pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid,MAX_LEN_OF_SSID);\n\t\t\t\t\t\tstrcpy((PCHAR)pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid,pSsidString);\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen=strlen(pSsidString);\n\t\t\t\t\t\tos_free_mem(pAd, pSsidString);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tStatus = -ENOMEM;\n                    }\n                }\n            }\n            break;\n\n\n\tcase HOSTAPD_OID_SET_802_1X:/*pure 1x is enabled. */\n\t\t\tSet_IEEE8021X_Proc(pAd,\"1\");\n\t\t\tbreak;\n\n\tcase HOSTAPD_OID_SET_KEY:\n\t\t\tStatus  = -EINVAL;\n\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\t\tUINT apidx = pObj->ioctl_if;\n\t\t\tif(wrq->u.data.length != sizeof(struct ieee80211req_key) || !wrq->u.data.pointer)\n\t\t\t\tbreak;\n\t\t\tStatus = copy_from_user(&Key, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tpEntry = MacTableLookup(pAd, Key.ik_macaddr);\n\n\n\t\t\tif((Key.ik_type == CIPHER_WEP64) ||(Key.ik_type == CIPHER_WEP128))/*dynamic wep with 1x */\n\t\t\t{\n\t\t\t\tif (pEntry)/*pairwise key */\n\t\t\t\t{\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = Key.ik_keylen;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, Key.ik_keydata, Key.ik_keylen);\n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = Key.ik_type;\n\t\t\t\t\tKeyIdx=pAd->ApCfg.MBSSID[pEntry->apidx].DefaultKeyId;\n                                  AsicAddPairwiseKeyEntry(\n                                      pAd, \n                                      (UCHAR)pEntry->Aid, \n                                      &pEntry->PairwiseKey);\n\n\t\t\t\t\tRTMPAddWcidAttributeEntry(\n\t\t\t\t\t\tpAd, \n\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\tKeyIdx, /* The value may be not zero */\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\tpEntry);\n\t\t\t\t}\n\t\t\t\telse/*group key */\n\t\t\t\t{\n\t\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tKeyIdx = Key.ik_keyix& 0x0fff;\n\t\t\t\t\t/* it is a shared key */\n\t\t\t\t\tif (KeyIdx < 4)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].KeyLen = (UCHAR) Key.ik_keylen;\n\t\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][KeyIdx].Key, &Key.ik_keydata, Key.ik_keylen);\n\t\t\t\t\t\tif (Key.ik_keyix & 0x8000)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\t\t\t\tpMbss->DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/*pMbss->DefaultKeyId=1; */\n\t\t\t\t\t\t\n\t\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].CipherAlg = Key.ik_type;\n\t\t\t\t\t\tAsicAddSharedKeyEntry(\n\t\t\t\t\t\t\tpAd,\n\t\t\t\t\t\t\tapidx,\n\t\t\t\t\t\t\tKeyIdx,\n\t\t\t\t\t\t  \t&pAd->SharedKey[apidx][KeyIdx]\n\t\t\t\t\t\t  \t);\n\n\t\t\t\t\t\tRTMPAddWcidAttributeEntry(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg,\n\t\t\t\t\t\t\tNULL);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry)\n\t\t\t{\n\t\t\t\tKeyIdx = Key.ik_keyix& 0x0fff;\n\t\t\t\tif (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t{\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = LEN_TK;\n\t\t\t\t\tNdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keydata, Key.ik_keylen);\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keylen);\n\t\t\t\t}\n\n\t\t\t\tif(pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t{\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = LEN_TK;\n\t\t\t\t\tNdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keydata, OFFSET_OF_PTK_TK);\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keylen);\n\t\t\t\t}\n\n\n    \t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_NONE;\n    \t\t\t\tif (pEntry->WepStatus == Ndis802_11Encryption2Enabled)\n        \t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;\n    \t\t\t\telse if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)\n        \t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_AES;\n\t\t\t\t\n\t\t\t\tpEntry->PairwiseKey.CipherAlg = Key.ik_type;\n\t\t\t\t \n                            AsicAddPairwiseKeyEntry(\n                                pAd, \n                                (UCHAR)pEntry->Aid, \n                                &pEntry->PairwiseKey);\t\n\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t(UINT8)KeyIdx, \t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\tpEntry->Aid,\n\t\t\t\t\tPAIRWISEKEYTABLE);\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\tKeyIdx = Key.ik_keyix& 0x0fff;\n\t\t\t\t\n\t\t\t\t/*if (Key.ik_keyix & 0x8000) */\n\t\t\t\t{\n\t\t\t\t\tpMbss->DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t}\n\n\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t{\n\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen= LEN_TK;\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key, Key.ik_keydata, 16);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].RxMic, (Key.ik_keydata+16+8), 8);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxMic, (Key.ik_keydata+16), 8);\n\t\t\t\t}\n\n\t\t\t\tif(pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t{\n\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen= LEN_TK;\t\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key, Key.ik_keydata, 16);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].RxMic, (Key.ik_keydata+16+8), 8);\n\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxMic, (Key.ik_keydata+16), 8);\n\t\t\t\t}\n\n    \t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg  = CIPHER_NONE;\n    \t\t\t\tif (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption2Enabled)\n        \t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_TKIP;\n    \t\t\t\telse if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption3Enabled)\n        \t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_AES;\n\n\t\t\t\thex_dump(\"Key.ik_keydata,\", (unsigned char*) Key.ik_keydata, 32);\n\n\t\t\t\tAsicAddSharedKeyEntry(\n\t\t\t\t\tpAd,\n\t\t\t\t\tapidx,\n\t\t\t\t\tpMbss->DefaultKeyId,\n\t\t\t\t\t&pAd->SharedKey[apidx][pMbss->DefaultKeyId]\n\t\t\t\t\t);\n\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, apidx,(UINT8)KeyIdx, \n\t\t\t\t\t\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg, Wcid, SHAREDKEYTABLE);\n\t\t\t\t\n\t\t\t\t/*RTMPAddWcidAttributeEntry(\n\t\t\t\tpAd, \n\t\t\t\tapidx,\n\t\t\t\tpMbss->DefaultKeyId, \n\t\t\t\tpAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg,\n\t\t\t\tNULL);*/\n\t\t\t}\n\t\t\tbreak;\n\n\n\t\tcase HOSTAPD_OID_DEL_KEY:\n\n\t\t\tStatus  = -EINVAL;\n\t\t\tif(wrq->u.data.length != sizeof(struct ieee80211req_del_key) || !wrq->u.data.pointer)\n\t\t\t\tbreak;\n\t\t\tStatus = copy_from_user(&delkey, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tpEntry = MacTableLookup(pAd, delkey.idk_macaddr);\n\t\t\tif (pEntry){\n\t\t\t\t/* clear the previous Pairwise key table */\n\t\t\t\tif(pEntry->Aid != 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));\n\t\t\t\t\tAsicRemovePairwiseKeyEntry(pAd,(UCHAR)pEntry->Aid);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if((delkey.idk_macaddr == NULL) && (delkey.idk_keyix < 4))\n\t\t\t\t/* remove group key */\n\t\t\t\tAsicRemoveSharedKeyEntry(pAd, pEntry->apidx, delkey.idk_keyix);\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_SET_STA_AUTHORIZED:/*for portsecured flag. */\n\n\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t{\n\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tpEntry = MacTableLookup(pAd, mlme.im_macaddr);\n\t\t\t\tif (!pEntry){\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tswitch (mlme.im_op)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase IEEE80211_MLME_AUTHORIZE:\n\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t\t\t\tpEntry->WpaState = AS_PTKINITDONE;/*wpa state machine is not in use. */\n\t\t\t\t\t\t\t/*pAd->StaCfg.PortSecured= WPA_802_1X_PORT_SECURED; */\n\t\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase IEEE80211_MLME_UNAUTHORIZE:\n\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_STATIC_WEP_COPY:\n\t\t\t\n\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t{\n\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tpEntry = MacTableLookup(pAd, mlme.im_macaddr);\n\t\t\t\tif (!pEntry)\n\t\t\t\t{\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*Status  = -EINVAL; */\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X != TRUE) \n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (pEntry->WepStatus != Ndis802_11Encryption1Enabled) \n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tKeyIdx=pMbss->DefaultKeyId;\n\t\t\t\t\tpEntry->AuthMode=pAd->ApCfg.MBSSID[apidx].AuthMode;\n\t\t\t\t\tpEntry->PairwiseKey.KeyLen = pAd->SharedKey[apidx][KeyIdx].KeyLen;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[apidx][KeyIdx].Key, pAd->SharedKey[apidx][KeyIdx].KeyLen);\n\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n\t\t\t\t\t\n                  \t\t\tAsicAddPairwiseKeyEntry(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\t(UCHAR)pEntry->Aid, \n\t\t\t\t\t\t\t&pEntry->PairwiseKey);\n\t\t\t\t\t\t\t\n\t\t\t\t\tRTMPAddWcidAttributeEntry(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\tKeyIdx, /* The value may be not zero */\n\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\tpEntry);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_SET_STA_DEAUTH:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::HOSTAPD_OID_SET_STA_DEAUTH\\n\"));\n\t\t\tMLME_DEAUTH_REQ_STRUCT  *pInfo;\n\t\t\tMLME_QUEUE_ELEM \t\t*Elem; /* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif(Elem)\n\t\t\t{\n\t\t\t\tpInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;\n\n\t\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t\t{\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tNdisMoveMemory(pInfo->Addr, mlme.im_macaddr, MAC_ADDR_LEN);\n\t\t\t\t\tif ((pEntry = MacTableLookup(pAd, pInfo->Addr)) != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tpInfo->Reason = mlme.im_reason;\n\t\t\t\t\t\tElem->Wcid = pEntry->Aid;\n\t\t\t\t\t\tMlmeEnqueue(pAd, AP_AUTH_STATE_MACHINE, APMT2_MLME_DEAUTH_REQ, sizeof(MLME_DEAUTH_REQ_STRUCT), Elem,0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tos_free_mem(NULL, Elem);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_SET_STA_DISASSOC:/*hostapd request to disassoc the station. */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::HOSTAPD_OID_SET_STA_DISASSOC\\n\"));\n\t\t\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\t\t\tif (wrq->u.data.length != sizeof(struct ieee80211req_mlme))\n\t\t\t{\n\t\t\t\tStatus  = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tNdisMoveMemory(DisassocReq.Addr, mlme.im_macaddr, MAC_ADDR_LEN);\n\t\t\t\tDisassocReq.Reason = mlme.im_reason;\n\t\t\t\tMlmeEnqueue(pAd, AP_ASSOC_STATE_MACHINE, APMT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq,0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_HOSTAPD_SUPPORT:/*notify the driver to support hostapd. */\n\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN hostapd_enable;\n\t\t\t\tint v;\n\n\t\t\t\tStatus = copy_from_user(&hostapd_enable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].Hostapd = hostapd_enable;\n\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\n\t\t\t\tfor (v=0;v<MAX_MBSSID_NUM(pAd);v++)\n\t\t\t\t{\n\t\t\t\t       if (pAd->ApCfg.MBSSID[v].Hostapd == TRUE)\n\t\t\t\t\t   \tprintk(\"ApCfg->MBSSID[%d].Hostapd == TURE\\n\",v);\n\t\t\t\t\telse\n\t\t\t\t\t   \tprintk(\"ApCfg->MBSSID[%d].Hostapd == FALSE\\n\",v);\n\t\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[v];\n\t\t\t\t\tpMBSSStruct->WPAREKEY.ReKeyInterval = 0;\n\t\t\t\t\tpMBSSStruct->WPAREKEY.ReKeyMethod = DISABLE_REKEY;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HOSTAPD_OID_COUNTERMEASURES:/*report txtsc to hostapd. */\n\t\t\t\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n\t\t\t\tStatus  = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN countermeasures_enable;\n\t\t\t\tStatus = copy_from_user(&countermeasures_enable, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif(countermeasures_enable)\n\t\t\t\t{\n\n    \t\t\t\t\t\t{\n        \t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Receive CM Attack Twice within 60 seconds ====>>> \\n\"));\n        \n\t\t\t\t\t\t\t/* send wireless event - for counter measures */\n\t\t\t\t\t\t\tpAd->ApCfg.CMTimerRunning = FALSE;\n\n\t\t\t\t\t\t        for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t\t        {\n\t\t\t\t\t\t        \tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\t\t            /* happened twice within 60 sec,  AP SENDS disaccociate all associated STAs.  All STA's transition to State 2 */\n\t\t\t\t\t\t            if (IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\t            {\n\t\t\t\t\t\t                MlmeDeAuthAction(pAd, &pAd->MacTab.Content[i], REASON_MIC_FAILURE,FALSE);\n\t\t\t\t\t\t            }\n\t\t\t\t\t\t        }\n\t        \n\t\t\t\t\t\t        /* Further,  ban all Class 3 DATA transportation for  a period 0f 60 sec */\n\t\t\t\t\t\t        /* disallow new association , too */\n\t\t\t\t\t\t        pAd->ApCfg.BANClass3Data = TRUE;        \n\n\t\t\t\t\t\t    }\n\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{        \n    \t\t\t\t\t    pAd->ApCfg.BANClass3Data = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\tcase HOSTAPD_OID_SET_WPS_BEACON_IE:/*pure 1x is enabled. */\n\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"HOSTAPD_OID_SET_WPS_BEACON_IE\\n\"));\n\t\t\t\tif (wrq->u.data.length != sizeof(WSC_LV_INFO))\n\t\t\t\t{\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE;\n\t\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\t\t\t\t\tNdisZeroMemory(&WscIEBeacon,sizeof(WSC_LV_INFO));\n\t\t\t\t\tStatus = copy_from_user(&WscIEBeacon, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tNdisMoveMemory(pMBSSStruct->WscIEBeacon.Value,WscIEBeacon.Value, WscIEBeacon.ValueLen);\n\t\t\t\t\tpMBSSStruct->WscIEBeacon.ValueLen=WscIEBeacon.ValueLen;\n\t\t\t\t\tAPUpdateBeaconFrame(pAd, apidx);\t\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\tbreak;\n\n\tcase HOSTAPD_OID_SET_WPS_PROBE_RESP_IE:/*pure 1x is enabled. */\n\n\t\t\t\tapidx = pObj->ioctl_if;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"HOSTAPD_OID_SET_WPS_PROBE_RESP_IE\\n\"));\n\t\t\t\tif (wrq->u.data.length != sizeof(WSC_LV_INFO))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"HOSTAPD_OID_SET_WPS_PROBE_RESP_IE failed\\n\"));\n\t\t\t\t\tStatus  = -EINVAL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE;\n\t\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\t\t\t\t\tNdisZeroMemory(&WscIEProbeResp,sizeof(WSC_LV_INFO));\n\t\t\t\t\tStatus = copy_from_user(&WscIEProbeResp, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[apidx];\n\t\t\t\t\tNdisMoveMemory(pMBSSStruct->WscIEProbeResp.Value,WscIEProbeResp.Value, WscIEProbeResp.ValueLen);\n\t\t\t\t\tpMBSSStruct->WscIEProbeResp.ValueLen=WscIEProbeResp.ValueLen;\n\t\t\t\t\tAPUpdateBeaconFrame(pAd, apidx);\n\t\t\t\t}\n\t\t\tbreak;\n#endif /*HOSTAPD_SUPPORT*/\n\n\n   \t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::unknown IOCTL's subcmd = 0x%08x\\n\", cmd));\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n    }\n\t\n\n\treturn Status;\n}\n\n\nINT RTMPAPQueryInformation(\n\tIN\tPRTMP_ADAPTER       pAd,\n\tIN\tOUT\tRTMP_IOCTL_INPUT_STRUCT    *rq,\n\tIN\tINT                 cmd)\n{\n\tRTMP_IOCTL_INPUT_STRUCT\t*wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;\n    INT\tStatus = NDIS_STATUS_SUCCESS;\n    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n    STRING\tdriverVersion[8];\n\n#if defined(DBG) || defined(WSC_AP_SUPPORT)\n\tUCHAR\tapidx = pObj->ioctl_if;\n#endif\n#ifdef WSC_AP_SUPPORT\n\tUINT\tWscPinCode = 0;\n\tPWSC_PROFILE\tpProfile;\n\tPWSC_CTRL\t\tpWscControl;\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef SNMP_SUPPORT\t\n\t/*for snmp */\n\tULONG ulInfo;\n\tDefaultKeyIdxValue\t\t\t*pKeyIdxValue;\n\tINT\t\t\t\t\t\t\tvalueLen;\n\tTX_RTY_CFG_STRUC\t\t\ttx_rty_cfg;\n\tULONG\t\t\t\t\t\tShortRetryLimit, LongRetryLimit;\n\tUCHAR\t\t\t\t\t\tsnmp_tmp[64];\n#endif /* SNMP_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n\tstruct default_group_key\t\t\tgroup_key;\n\tstruct ieee80211req_key\t\t\tik;\n\tunsigned char\t\t\t\t\t\t*p;\n\tMAC_TABLE_ENTRY\t\t\t\t*pEntry=(MAC_TABLE_ENTRY *)NULL;\n\tstruct ieee80211req_wpaie\t\t\twpaie;\n\tPMULTISSID_STRUCT\tpMbss ;\n#endif /*HOSTAPD_SUPPORT*/\n\n\tNDIS_802_11_STATISTICS\t*pStatistics;\n\tULONG ulInfo;\n\n\n#ifdef P2P_SUPPORT\n\t/*RT_P2P_UI_TABLE UI_table;*/\n\tPRT_P2P_UI_TABLE pUI_table;\n\tPRT_P2P_TABLE\t\t\tpP2pTable;\n\tPRT_P2P_CLIENT_ENTRY   pPAdCli, pUICli;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_PERSISTENT_ENTRY pP2PPersistent = NULL;\n\tUCHAR tmp[24];\n\tUCHAR i;\n#endif /* P2P_SUPPORT */\n\n\n    switch(cmd)\n    {\n#ifdef P2P_SUPPORT\n\t\tcase OID_802_11_P2P_Connected_MAC:\t\t\t\n\t\t\twrq->u.data.length = MAC_ADDR_LEN;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.ConnectingMAC, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_Connected_MAC\\n\"));\n\t\t\tbreak;\n\t\t\t\n\t\tcase OID_802_11_P2P_MODE:\t\t\t\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.Rule, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%d, Rule=%d)\\n\", sizeof(char), pAd->P2pCfg.Rule));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_DEVICE_NAME:\t\t\t\n\t\t\twrq->u.data.length = pAd->P2pCfg.DeviceNameLen;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.DeviceName, pAd->P2pCfg.DeviceNameLen);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_DEVICE_NAME (Len=%ld, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen, pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_LISTEN_CHANNEL:\t\t\t\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.ListenChannel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_LISTEN_CHANNEL (Len=%d, Listen_Ch=%d)\\n\", sizeof(char),pAd->P2pCfg.ListenChannel));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_OPERATION_CHANNEL:\t\t\t\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.GroupChannel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_OPERATION_CHANNEL (Len=%d, Op_Ch=%d)\\n\", sizeof(char),pAd->P2pCfg.GroupOpChannel));\n\t\t\tbreak;\n\n\n\t\tcase OID_802_11_P2P_DEV_ADDR:\t\t\t\n\t\t\twrq->u.data.length = 6;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.CurrentAddress, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_DEV_ADDR (Len=%d, Addr=%02x:%02x:%02x:%02x:%02x:%02x)\\n\", wrq->u.data.length, PRINT_MAC(pAd->P2pCfg.CurrentAddress)));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_CTRL_STATUS:\t\t\t\n\t\t\twrq->u.data.length = 24;\n\t\t\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tNdisZeroMemory(tmp, 24);\n\t\t\tsprintf(tmp,\"%s\",decodeCtrlState(pP2PCtrl->CtrlCurrentState));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmp, 24);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%ld, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_DISC_STATUS:\t\t\t\n\t\t\twrq->u.data.length = 24;\n\t\t\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tNdisZeroMemory(tmp, 24);\n\t\t\tsprintf(tmp,\"%s\",decodeDiscoveryState(pP2PCtrl->DiscCurrentState));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmp, 24);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%ld, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_GOFORM_STATUS:\t\t\t\n\t\t\twrq->u.data.length = 24;\n\t\t\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tNdisZeroMemory(tmp, 24);\n\t\t\tsprintf(tmp,\"%s\",decodeGroupFormationState(pP2PCtrl->GoFormCurrentState));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmp, 24);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%ld, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\t\t\t\n\t\tcase OID_802_11_P2P_SCAN_LIST:\t\t\t\n\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pUI_table, sizeof(RT_P2P_UI_TABLE));\n\t\t\tpP2pTable = &pAd->P2pTable;\n\t\t\tif (pUI_table)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pUI_table, sizeof(RT_P2P_UI_TABLE));\n\t\t\t\tpUI_table->ClientNumber = pAd->P2pTable.ClientNumber;\n\t\t\t\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t\t\t\t{\n\t\t\t\t\tpPAdCli = &pP2pTable->Client[i];\n\t\t\t\t\tpUICli = &pUI_table->Client[i];\n\t \t\t\t\tNdisMoveMemory(pUICli, pPAdCli, sizeof(RT_P2P_CLIENT_ENTRY));\n\t\t\t\t}\n\t\t\t\twrq->u.data.length = sizeof(RT_P2P_UI_TABLE);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pUI_table, sizeof(RT_P2P_UI_TABLE));\n\t\t\t\tos_free_mem(NULL, pUI_table);\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_SCAN_LIST (Len=%d)\\n\", sizeof(RT_P2P_UI_TABLE)));\n\t\t\tbreak;\n\t\t\t\n\t\tcase OID_P2P_WSC_PIN_CODE:\n\t\t\twrq->u.data.length = sizeof(UINT);\n\t\t\tWscPinCode = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode;\n\t\t\t\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_PIN_CODE (=%d)\\n\", WscPinCode));\n\t\t\tbreak;\n\n\t\t/*\n\t\t * Query WFD P2P connection status\n\t\t * Value:\n\t\t * \t0: P2P connecting or no link\n\t\t * \t1: P2P Go\n\t\t * \t2: P2P Client\n\t\t * \t5: WFD session not avalible\n\t\t*/\n\t\tcase OID_802_11_P2P_CONNECT_STATUS:\n\t\t{\n\t\t\tUCHAR stat = CONNECTING_OR_NO_LINK;\n\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\tUINT32 i;\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry) && (pEntry->WpaState == AS_PTKINITDONE))\n\t\t\t\t\t{\n\t\t\t\t\t\tstat = P2P_GO;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (P2P_CLI_ON(pAd))\n\t\t\t\t{\n\t\t\t\tUINT32 i;\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\n\t\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[0].WscControl;\n\t\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t{\n\t\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\tif (IS_P2P_CLI_ENTRY(pEntry) && (pEntry->WpaState == AS_PTKINITDONE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\tstat = P2P_CLIENT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} \n\t\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\t(pAd->StaCfg.WfdCfg.PeerSessionAvail == WFD_SESSION_NOT_AVAILABLE))\n\t\t\t{\n\t\t\t\tstat = WFD_SESSION_UNAVALIBLE;\n\t\t\t\tpAd->StaCfg.WfdCfg.PeerSessionAvail = WFD_SESSION_AVAILABLE;\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &stat, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_CONNECT_STATUS (=%d)\\n\", stat));\n\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_PEER_GROUP_ID:\n\t\t{\n\t\t\tUCHAR GroupId[128] = {0};\n\t\t\twrq->u.data.length = sizeof(GroupId);\n\n\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\tprintk(\"OID_802_11_P2P_PEER_GROUP_ID bssid: %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2PCtrl->CurrentAddress));\n\t\t\t\tprintk(\"OID_802_11_P2P_PEER_GROUP_ID ssid: %s\\n\", pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid);\n\t\t\t\tsprintf(GroupId, \"%02x:%02x:%02x:%02x:%02x:%02x %s\", pP2PCtrl->CurrentAddress[0], pP2PCtrl->CurrentAddress[1], pP2PCtrl->CurrentAddress[2],\n\t\t\t\t\tpP2PCtrl->CurrentAddress[3], pP2PCtrl->CurrentAddress[4], pP2PCtrl->CurrentAddress[5], pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid);\n\t\t\t}\n\t\t\tif (P2P_CLI_ON(pAd))\n\t\t\t{\n\t\t\t\tprintk(\"OID_802_11_P2P_PEER_GROUP_ID bssid: %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2PCtrl->Bssid));\n\t\t\t\tprintk(\"OID_802_11_P2P_PEER_GROUP_ID ssid: %s\\n\", pP2PCtrl->SSID);\n\t\t\t\tsprintf(GroupId, \"%02x:%02x:%02x:%02x:%02x:%02x %s\", pP2PCtrl->Bssid[0], pP2PCtrl->Bssid[1], pP2PCtrl->Bssid[2],\n\t\t\t\t\tpP2PCtrl->Bssid[3], pP2PCtrl->Bssid[4], pP2PCtrl->Bssid[5], pP2PCtrl->SSID);\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"GROUP ID :: %s\\n\", GroupId));\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &GroupId, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_PEER_GROUP_ID (=%s)\\n\", GroupId));\n\t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_P2P_GO_INT:\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.GoIntentIdx, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_GO_INT (GoIntentIdx=%d)\\n\", pAd->P2pCfg.GoIntentIdx));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_SSID:\n\t\t\tif (wrq->u.data.length >= pAd->P2pCfg.SSIDLen)\n\t\t\t{\n\t\t\t\twrq->u.data.length = pAd->P2pCfg.SSIDLen;\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.SSID, wrq->u.data.length);\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_SSID (SSIDLen=%d)\\n\", pAd->P2pCfg.SSIDLen));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_PASSPHRASE:\n\t\t\t{\n\t\t\t\tMULTISSID_STRUCT *pMBSSStruct;\n\t\t\t\tpMBSSStruct = &pAd->ApCfg.MBSSID[0];\n\t\t\t\twrq->u.data.length = pMBSSStruct->WscControl.WpaPskLen;\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pMBSSStruct->WscControl.WpaPsk, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_PASSPHRASE(%s)\\n\", pMBSSStruct->WscControl.WpaPsk));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_ASSOCIATE_TAB:\n#ifdef HE_BD_SUPPORT\n\t\t\t{\n\t\t\t\tP2P_STA_ASSOC_LIST AssocList;\n\t\t\t\tINT\t\t\tp2pIdx;\n\n\t\t\t\tUCHAR p2pindex = P2P_NOT_FOUND;\n\t\t\t\tRTMPZeroMemory(&AssocList, sizeof(P2P_STA_ASSOC_LIST));\n\t\t\t\tif (P2P_CLI_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(&AssocList, &pP2PCtrl->AssocList, sizeof(P2P_STA_ASSOC_LIST));\n\t\t\t\t\tAssocList.maclist_count = 1;\n\t\t\t\t\tAssocList.is_p2p[0] = 1;\n\n\t\t\t\t\tAssocList.rssi[0] = (pAd->ApCfg.RssiSample.AvgRssi0 - pAd->BbpRssiToDbmDelta);\n#ifdef WFD_SUPPORT\n\t\t\t\t\tp2pIdx = P2pGroupTabSearch(pAd, AssocList.maclist[0].octet);\n\t\t\t\t\tAssocList.is_wfd[0] = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.bWfdClient;\n\n\t\t\t\t\tif (pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.bWfdClient)\n\t\t\t\t\t{\n\t\t\t\t\t\tAssocList.rtsp_port[0] = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.rtsp_port;\n\t\t\t\t\t}\n\n#endif /* CONFIG_WFD */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rule = %s.  Bssid = %0x2:%02x:%0x2:%02x:%0x2:%02x\\n\", \n\t\t\t\t\t\t\t\tdecodeMyRule(pP2PCtrl->Rule), PRINT_MAC(pP2PCtrl->Bssid)));\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"addr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\",\n\t\t\t\t\t\t\tAssocList.maclist[0].octet[0], AssocList.maclist[0].octet[1],\n\t\t\t\t\t\t\tAssocList.maclist[0].octet[2], AssocList.maclist[0].octet[3],\n\t\t\t\t\t\t\tAssocList.maclist[0].octet[4], AssocList.maclist[0].octet[5]));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"name = %s.\\n\", AssocList.device_name[0].ssid));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"type = %d.\\n\", AssocList.device_type[0].dev_type));\n\n\t\t\t\t}\n\t\t\t\telse if (P2P_GO_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tUINT32 i, p2pEntryCnt=0;\n\t\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\t\tPWSC_CTRL\t\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\t\t\t\t\t/* Alan_LG */\n\t\t\t\t\tUCHAR           AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t\t\t\t\tNdisMoveMemory(&AssocList, &pP2PCtrl->AssocList, sizeof(P2P_STA_ASSOC_LIST));\n\t\t\t\t\t/* Alan_LG */\n\t\t\t\t\tif ( pP2PCtrl->AssocList.maclist_count != 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ( (!NdisEqualMemory(AllZero, pP2PCtrl->AssocList.maclist[p2pEntryCnt].octet, MAC_ADDR_LEN)) &&\n\t\t\t\t\t\t\t\t\t(pP2PCtrl->AssocList.device_name[p2pEntryCnt].ssid[0] != 0 )) \n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tNdisMoveMemory(&AssocList.maclist[p2pEntryCnt].octet , &pEntry->Addr, MAC_ADDR_LEN);\n\t\t\t\t\t\t\t\t\tAssocList.rssi[p2pEntryCnt] = pEntry->RssiSample.AvgRssi0;\n\t\t\t\t\t\t\t\t\tAssocList.is_p2p[p2pEntryCnt] = 1;\n#ifdef WFD_SUPPORT\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tAssocList.is_wfd[p2pEntryCnt] = pEntry->bWfdClient;\n\t\t\t\t\t\t\t\t\tAssocList.is_wfd[p2pEntryCnt] = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.bWfdClient;\n\t\t\t\t\t\t\t\t\tif (pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.bWfdClient)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tAssocList.rtsp_port[p2pEntryCnt] = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.rtsp_port;\n\t\t\t\t\t\t\t\t\t}\n\n#endif /* CONFIG_WFD */\n\t\t\t\t\t\t\t\t\tp2pEntryCnt++;\n\t\t\t\t\t\t\t\t} \n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"1. %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pEntry->Addr)));\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\t\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t\t\t\t&& (pEntry->Sst == SST_ASSOC))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (p2pEntryCnt < 3 )\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"2. %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pEntry->Addr)));\n\t\t\t\t\t\t\t\t\tNdisMoveMemory(&AssocList.maclist[p2pEntryCnt].octet , &pEntry->Addr, MAC_ADDR_LEN);\n\t\t\t\t\t\t\t\t\tAssocList.is_p2p[p2pEntryCnt] = FALSE;\n\t\t\t\t\t\t\t\t\tAssocList.rssi[p2pEntryCnt] = pEntry->RssiSample.AvgRssi0;\n#ifdef WFD_SUPPORT\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\tAssocList.is_wfd[p2pEntryCnt] = pEntry->bWfdClient;\n\t\t\t\t\t\t\t\t\tp2pIdx = P2pGroupTabSearch(pAd, AssocList.maclist[p2pEntryCnt].octet);\n\t\t\t\t\t\t\t\t\tif (pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.bWfdClient)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tAssocList.rtsp_port[p2pEntryCnt] = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.rtsp_port;\n\t\t\t\t\t\t\t\t\t}\n\n#endif /* CONFIG_WFD */\n\t\t\t\t\t\t\t\t\tp2pEntryCnt++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tAssocList.maclist_count = p2pEntryCnt;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tAssocList.maclist_count = 0;\n\t\t\t\twrq->u.data.length = sizeof(AssocList);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_ASSOCIATE_TAB(Len = %d).\\n\", sizeof(AssocList)));\n\t\t\t\tif (copy_to_user(wrq->u.data.pointer, &AssocList, wrq->u.data.length))\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\n\n#endif /* HE_BD_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_PERSISTENT_TABLE:\n\t\t\tif (wrq->u.data.length != (sizeof(RT_P2P_PERSISTENT_ENTRY)*MAX_P2P_TABLE_SIZE))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: OID_802_11_P2P_PERSISTENT_TABLE size not match (sent=%d, required=%d)\\n\",\n\t\t\t\twrq->u.data.length, sizeof(RT_P2P_PERSISTENT_ENTRY)*MAX_P2P_TABLE_SIZE));\n\t\t\t\tStatus = -EFAULT;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pP2PPersistent, sizeof(RT_P2P_PERSISTENT_ENTRY)*MAX_P2P_TABLE_SIZE);\n\t\t\tif (pP2PPersistent)\n\t\t\t{\n\t\t\t\tUINT idx = 0;\n\t\t\t\tPUCHAR pPtr;\n\t\t\t\tPRT_P2P_TABLE P2pTab = &pAd->P2pTable;\n\t\t\t\t\n\t\t\t\twrq->u.data.length = sizeof(RT_P2P_PERSISTENT_ENTRY)*MAX_P2P_TABLE_SIZE;\n\t\t\t\tNdisZeroMemory(pP2PPersistent, wrq->u.data.length);\n\t\t\t\tpPtr = pP2PPersistent;\n\t\t\t\tfor (idx = 0; idx < MAX_P2P_TABLE_SIZE; idx++)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pPtr, &P2pTab->PerstEntry[idx], sizeof(RT_P2P_PERSISTENT_ENTRY));\n\t\t\t\t\tpPtr += sizeof(RT_P2P_PERSISTENT_ENTRY);\n\t\t\t\t}\n\t\t\t\tif (copy_to_user(wrq->u.data.pointer, pP2PPersistent, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t\tos_free_mem(NULL, pP2PPersistent);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_PERSISTENT_TABLE (=%d)\\n\", wrq->u.data.length));\n\t\t\t}\n\t\t\tbreak;\n#ifdef WFD_SUPPORT\n\t\tcase OID_802_11_WFD_PEER_RTSP_PORT:\n\t\t\t{\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\tUSHORT RtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\tUCHAR P2pIdx = P2P_NOT_FOUND;\n\t\t\t\twrq->u.data.length = sizeof(RtspPort);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\ti = -1;\n\t\t\t\tif (pAd->StaCfg.TdlsInfo.bTDLSCapable && pAd->StaCfg.WfdCfg.PC == WFD_PC_TDLS)\n\t\t\t\t{\n\t\t\t\t\tPRT_802_11_TDLS pTDLS = NULL;\n\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - TDLS peer rtsp port get...\\n\", __FUNCTION__));\n\t\t\t\t\tfor (i = MAX_NUM_OF_TDLS_ENTRY - 1; i >= 0; i--)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status == TDLS_MODE_CONNECTED))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[i];\n\t\t\t\t\t\t\tRtspPort = pTDLS->WfdEntryInfo.rtsp_port;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\\n\", i, PRINT_MAC(pTDLS->MacAddr)));\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSP_PORT = %d.\\n\", pTDLS->WfdEntryInfo.rtsp_port));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tif ((RtspPort == 0) && (pTDLS != NULL))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS peer rtsp port is zero, search P2P Entry!\\n\", RtspPort));\n\t\t\t\t\n\t\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pTDLS->MacAddr);\n\t\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRtspPort = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port; \n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\\n\", P2pIdx, PRINT_MAC(pTDLS->MacAddr)));\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSP_PORT = %d.\\n\", pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port));\n\t\t\t\t\t\t\tif (RtspPort == 0)\n\t\t\t\t\t\t\t\tRtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"OID_802_11_P2P_PEER_RTSP_PORT::P2P not found, use default RTSP port\\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (i < 0)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - P2P peer rtsp port get...\\n\", __FUNCTION__));\n\t\t\t\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry) || IS_P2P_CLI_ENTRY(pEntry))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr);\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\\n\", pEntry->P2pInfo.p2pIndex, PRINT_MAC(pEntry->Addr)));\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSP_PORT = %d.\\n\", pAd->P2pTable.Client[pEntry->P2pInfo.p2pIndex].WfdEntryInfo.rtsp_port));\n\t\t\t\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t\t\t\t\tRtspPort = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port;\t\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tRtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"OID_802_11_P2P_PEER_RTSP_PORT::P2P not found, use default RTSP port\\n\"));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (pEntry->P2pInfo.p2pIndex < MAX_P2P_GROUP_SIZE)\n\t\t\t\t\t\t\t\t\tP2PPrintP2PEntry(pAd, pEntry->P2pInfo.p2pIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OID_802_11_P2P_PEER_RTSP_PORT bssid: %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pP2PCtrl->CurrentAddress)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (copy_to_user(wrq->u.data.pointer, &RtspPort, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WFD_PEER_RTSP_PORT (=%d)\\n\", RtspPort));\n\t\t\t}\n\t\t\tbreak;\n\n\t\t/*\n\t\t * Query discovered MAC address list of WFD devices (used by WFD sigma tool)\n\t\t * Value:\n\t\t * \tMAC address list (max. number: 7)\n\t\t*/\n\t\tcase OID_802_11_WFD_DEV_LIST:\n\t\t\t{\n\t\t\t\tCHAR DevList[128];\n\t\t\t\tpP2pTable = &pAd->P2pTable;\n\t\t\t\tINT\tListNum = 0;\n\t\t\t\tINT\tListLen = 0;\n\n\t\t\t\tRTMPZeroMemory(DevList, sizeof(DevList));\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\tif (pAd->StaCfg.TdlsInfo.bTDLSCapable && pAd->StaCfg.WfdCfg.PC == WFD_PC_TDLS)\n\t\t\t\t{\n\t\t\t\t\tPRT_802_11_TDLS pTDLS = NULL;\n\n\t\t\t\t\tfor (i = MAX_NUM_OF_TDLS_ENTRY - 1; i >= 0; i--)\n\t\t\t\t\t{\n\t\t\t\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[i];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (pTDLS->Valid)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ListNum > 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t*(DevList + ListLen) = 0x20;\n\t\t\t\t\t\t\t\tListLen += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tsprintf(DevList + ListLen, \"%02x:%02x:%02x:%02x:%02x:%02x\", pTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2],\n\t\t\t\t\t\t\tpTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5]);\n\n\t\t\t\t\t\t\tListLen += 17;\n\t\t\t\t\t\t\tListNum++;\n\t\t\t\t\t\t\tif (ListNum >= 7)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t\t\t\t{\n\t\t\t\t\tif (ListNum >= 7)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (ListNum > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t*(DevList + ListLen) = 0x20;\n\t\t\t\t\t\tListLen += 1;\n\t\t\t\t\t}\n\t\t\t\t\tsprintf(DevList + ListLen, \"%02x:%02x:%02x:%02x:%02x:%02x\", pP2pTable->Client[i].addr[0], pP2pTable->Client[i].addr[1], pP2pTable->Client[i].addr[2],\n\t\t\t\t\tpP2pTable->Client[i].addr[3], pP2pTable->Client[i].addr[4], pP2pTable->Client[i].addr[5]);\n\t\t\t\t\t\n\t\t\t\t\tListLen += 17;\n\t\t\t\t\tListNum++;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twrq->u.data.length = sizeof(DevList);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, DevList, sizeof(DevList));\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WFD_DEV_LIST (Len=%d)\\n\", sizeof(DevList)));\n\t\t\t}\n\t\t\tbreak;\n#endif /* WFD_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t\tcase RT_OID_VERSION_INFO:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_VERSION_INFO \\n\"));\n\t\t\twrq->u.data.length = 8*sizeof(CHAR);\n\t\t\tsnprintf(&driverVersion[0], sizeof(driverVersion), \"%s\", AP_DRIVER_VERSION);\n\t\t\tdriverVersion[7] = '\\0';\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &driverVersion, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_NETWORK_TYPES_SUPPORTED:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_NETWORK_TYPES_SUPPORTED \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->RfIcType, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT; \t\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef IAPP_SUPPORT\n\t\tcase RT_QUERY_SIGNAL_CONTEXT:\n\t\t{\n\t\t\tBOOLEAN FlgIs11rSup = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_QUERY_SIGNAL_CONTEXT \\n\"));\n\n\n\t\t\tif (FlgIs11rSup == FALSE)\n\t\t\t{\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t}\n\t\t}\n\t\t\tbreak;\n\n\n#endif /* IAPP_SUPPORT */\n\n\n#ifdef WSC_AP_SUPPORT\n\t\tcase RT_OID_WSC_QUERY_STATUS:\n\t\t{\n\t\t\tINT WscStatus;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_QUERY_STATUS \\n\"));\n#ifdef APCLI_SUPPORT\n\t\t\tif (pObj->ioctl_if_type == INT_APCLI)\n\t\t\t{\n\t\t\t\tINT ApCliIdx = pObj->ioctl_if;\n\t\t\t\tAPCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);\n\t\t\t\tWscStatus = pAd->ApCfg.ApCliTab[ApCliIdx].WscControl.WscStatus;\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t    if (pObj->ioctl_if_type == INT_P2P)\n\t\t    {\n\t\t    \tif (P2P_CLI_ON(pAd))\n\t\t    \t{\n\t\t\t\tINT ApCliIdx = pObj->ioctl_if;\n\t\t\t\tAPCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);\n\t\t\t\tWscStatus = pAd->ApCfg.ApCliTab[ApCliIdx].WscControl.WscStatus;\n\t\t    \t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\tWscStatus = pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus;\n\t\t\t\t}\n\t\t        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n\t\t    }\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\t{\n\t\t\t\tWscStatus = pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus;\n\t\t\t}\n\n\t\t\twrq->u.data.length = sizeof(INT);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &WscStatus, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase RT_OID_WSC_PIN_CODE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_PIN_CODE \\n\"));\n\t\t\twrq->u.data.length = sizeof(UINT);\n\t\t\t/*WscPinCode = GenerateWpsPinCode(pAd, FALSE, apidx); */\n#ifdef P2P_SUPPORT\n\t\t    if (pObj->ioctl_if_type == INT_P2P)\n\t\t    {\n\t\t\t\t{\n\t\t\t    \tif (P2P_CLI_ON(pAd))\n\t\t\t    \t{\n\t\t\t\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t\t    \t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n\t\t    }\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\n\t\t\tWscPinCode = pWscControl->WscEnrolleePinCode;\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n#ifdef APCLI_SUPPORT\n        case RT_OID_APCLI_WSC_PIN_CODE:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_APCLI_WSC_PIN_CODE \\n\"));\n\t\t\twrq->u.data.length = sizeof(UINT);\n\t\t\t/*WscPinCode = GenerateWpsPinCode(pAd, TRUE, apidx); */\n\t\t\tWscPinCode = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode;\n\t\t\t\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n            break;\n#endif /* APCLI_SUPPORT */\n\t\tcase RT_OID_WSC_UUID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_QUERY_UUID \\n\"));\n\t\t\twrq->u.data.length = UUID_LEN_STR;\n#ifdef P2P_SUPPORT\n\t\t    if (pObj->ioctl_if_type == INT_P2P)\n\t\t    {\n\t\t    \tif (P2P_CLI_ON(pAd))\n\t\t    \t{\n\t\t\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t    \t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\t}\n\t\t        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n\t\t    }\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pWscControl->Wsc_Uuid_Str[0], UUID_LEN_STR))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RT_OID_WSC_MAC_ADDRESS:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_MAC_ADDRESS \\n\"));\n\t\t\twrq->u.data.length = MAC_ADDR_LEN;\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pAd->ApCfg.MBSSID[apidx].Bssid, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RT_OID_WSC_CONFIG_STATUS:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_CONFIG_STATUS \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING \\n\"));\n\n\t\t\tif (pAd->ApCfg.MBSSID[apidx].WscControl.WscState > WSC_STATE_WAIT_M2)\n\t\t\t{\n\t\t\t\twrq->u.data.length = sizeof(WSC_PEER_DEV_INFO);\n\t\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscPeerInfo, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_WSC_QUERY_PROFILE:\n\t\t\twrq->u.data.length = sizeof(WSC_PROFILE);\n/*\t\t\tpProfile = kmalloc(sizeof(WSC_PROFILE), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pProfile, sizeof(WSC_PROFILE));\n\t\t\tif (pProfile == NULL)\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_802_11_WSC_QUERY_PROFILE fail!\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n#ifdef P2P_SUPPORT\n\t\t    if (pObj->ioctl_if_type == INT_P2P)\n\t\t    {\n\t\t    \tif (P2P_CLI_ON(pAd))\n\t\t    \t{\n\t\t\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t    \t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\t}\n\t\t        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n\t\t    }\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\n\t\t\tRTMPZeroMemory(pProfile, sizeof(WSC_PROFILE));\n\t\t\tNdisMoveMemory(pProfile, &pWscControl->WscProfile, sizeof(WSC_PROFILE));\n            if ((pProfile->Profile[0].AuthType == WSC_AUTHTYPE_OPEN) && (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_NONE))\n            {\n                pProfile->Profile[0].KeyLength = 0;\n                NdisZeroMemory(pProfile->Profile[0].Key, 64);\n            }\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pProfile, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\t\t\t\n\n/*\t\t\tkfree(pProfile); */\n\t\t\tos_free_mem(NULL, pProfile);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WSC_QUERY_PROFILE \\n\"));\n\t\t\tbreak;\n#ifdef WSC_V2_SUPPORT\n\t\tcase RT_OID_WSC_V2_SUPPORT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_V2_SUPPORT (=%d)\\n\", pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2));\n\t\t\twrq->u.data.length = sizeof(BOOLEAN);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RT_OID_WSC_FRAGMENT_SIZE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_FRAGMENT_SIZE (=%d)\\n\", pAd->ApCfg.MBSSID[apidx].WscControl.WscFragSize));\n\t\t\twrq->u.data.length = sizeof(USHORT);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscFragSize, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n#endif /* WSC_V2_SUPPORT */\n#endif /* WSC_AP_SUPPORT */\n#ifdef LLTD_SUPPORT\n\n        case RT_OID_GET_LLTD_ASSO_TABLE:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::Get LLTD association table\\n\"));\n            if ((wrq->u.data.pointer == NULL) || (apidx != MAIN_MBSSID))\n            {\n                Status = -EFAULT;\n            }\n            else\n            {\n                INT\t\t\t\t\t\t    i;\n                RT_LLTD_ASSOICATION_TABLE\tAssocTab;\n\n            \tAssocTab.Num = 0;\n            \tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n            \t{\n            \t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC))\n            \t\t{\n            \t\t\tCOPY_MAC_ADDR(AssocTab.Entry[AssocTab.Num].Addr, &pAd->MacTab.Content[i].Addr);\n                        AssocTab.Entry[AssocTab.Num].phyMode = pAd->CommonCfg.PhyMode;\n                        AssocTab.Entry[AssocTab.Num].MOR = RateIdToMbps[pAd->ApCfg.MBSSID[apidx].MaxTxRate] * 2;\n            \t\t\tAssocTab.Num += 1;\n            \t\t}\n            \t}            \n                wrq->u.data.length = sizeof(RT_LLTD_ASSOICATION_TABLE);\n            \tif (copy_to_user(wrq->u.data.pointer, &AssocTab, wrq->u.data.length))\n            \t{\n            \t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n                    Status = -EFAULT;\n            \t}\n                DBGPRINT(RT_DEBUG_TRACE, (\"AssocTab.Num = %d \\n\", AssocTab.Num));\n            }\n            break;\n#ifdef APCLI_SUPPORT\n\t\tcase RT_OID_GET_REPEATER_AP_LINEAGE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Not Support : Get repeater AP lineage.\\n\"));\n\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n#endif /* LLTD_SUPPORT */\n#ifdef DOT1X_SUPPORT\n\t\tcase OID_802_DOT1X_CONFIGURATION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::Get Radius setting(%d)\\n\", sizeof(DOT1X_CMM_CONF)));\n\t\t\t\tRTMPIoctlQueryRadiusConf(pAd, wrq);\t\n\t\t\tbreak;\n#endif /* DOT1X_SUPPORT */\t\t\t\n#ifdef SNMP_SUPPORT\n\t\tcase RT_OID_802_11_MAC_ADDRESS:\n            wrq->u.data.length = MAC_ADDR_LEN;\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTUREROUI:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTUREROUI \\n\"));\n\t\t\twrq->u.data.length = ManufacturerOUI_LEN;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTURERNAME:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTURERNAME \\n\"));\n\t\t\twrq->u.data.length = strlen(ManufacturerNAME);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_RESOURCETYPEIDNAME:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_RESOURCETYPEIDNAME \\n\"));\n\t\t\twrq->u.data.length = strlen(ResourceTypeIdName);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \\n\"));\n\t\t\tulInfo = 1; /* 1 is support wep else 2 is not support. */\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_POWERMANAGEMENTMODE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_POWERMANAGEMENTMODE \\n\"));\n\t\t\tulInfo = 1; /* 1 is power active else 2 is power save. */\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYVALUE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WEPDEFAULTKEYVALUE \\n\"));\n\t\t\t/*KeyIdxValue.KeyIdx = pAd->PortCfg.MBSSID[pObj->ioctl_if].DefaultKeyId; */\n\t\t\tpKeyIdxValue = wrq->u.data.pointer;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"KeyIdxValue.KeyIdx = %d, \\n\",pKeyIdxValue->KeyIdx));\n\n\t\t\tvalueLen = pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen;\n\t\t\tNdisMoveMemory(pKeyIdxValue->Value,\n\t\t\t\t\t\t   &pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].Key,\n\t\t\t\t\t\t   valueLen);\n\t\t\tpKeyIdxValue->Value[valueLen]='\\0';\n\n\t\t\twrq->u.data.length = sizeof(DefaultKeyIdxValue);\n\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \\n\", pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.length, pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen,\n\t\t\tpAd->SharedKey[pObj->ioctl_if][0].Key[0],\n\t\t\tpAd->SharedKey[pObj->ioctl_if][1].Key[0],\n\t\t\tpAd->SharedKey[pObj->ioctl_if][2].Key[0],\n\t\t\tpAd->SharedKey[pObj->ioctl_if][3].Key[0]));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WEPDEFAULTKEYID \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DefaultKeyId =%d \\n\", pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId));\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_WEPKEYMAPPINGLENGTH:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer,\n\t\t\t\t\t\t\t\t\t&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen,\n\t\t\t\t\t\t\t\t\twrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_SHORTRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_SHORTRETRYLIMIT \\n\"));\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\tShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ShortRetryLimit =%ld,  tx_rty_cfg.field.ShortRetryLimit=%d\\n\", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_LONGRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_LONGRETRYLIMIT \\n\"));\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\tLongRetryLimit = tx_rty_cfg.field.LongRtyLimit;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"LongRetryLimit =%ld,  tx_rty_cfg.field.LongRtyLimit=%d\\n\", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);\n\t\t\tbreak;\n\t\t\t\n\t\tcase RT_OID_802_11_PRODUCTID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PRODUCTID \\n\"));\n\t\t\n#ifdef RTMP_MAC_USB\n\t\t\tsnprintf((PSTRING)snmp_tmp, sizeof(snmp_tmp), \"%04x %04x\\n\", \n\t\t\t\t\t\tRtmpOsGetUsbDevVendorID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev),\n\t\t\t\t\t\tRtmpOsGetUsbDevProductID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev));\n#endif /* RTMP_MAC_USB */\n\t\t\twrq->u.data.length = strlen((PSTRING) snmp_tmp);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, snmp_tmp, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTUREID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTUREID \\n\"));\n\t\t\twrq->u.data.length = strlen(ManufacturerNAME);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_CURRENTCHANNEL:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_CURRENTCHANNEL \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"sizeof UCHAR=%d, channel=%d \\n\", sizeof(UCHAR), pAd->CommonCfg.Channel));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\t\t\tbreak;\n#endif /* SNMP_SUPPORT */\n\n        case OID_802_11_STATISTICS:\n\t\tos_alloc_mem(pAd, (UCHAR **)&pStatistics, sizeof(NDIS_802_11_STATISTICS));\n            if (pStatistics)\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_STATISTICS \\n\"));\n                /* add the most up-to-date h/w raw counters into software counters */\n\t\t\t    NICUpdateRawCounters(pAd);\n                \n\t\t  pStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;\n                pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;\n                pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart;\n                pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;\n                pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart;\n                pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart;\n                pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart;\n                pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart;\n                pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart;\n                pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;\n                pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;\n#ifdef DBG\t\n                pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount;\n#else\n                pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart;\n                pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100;\n#endif\n\t\t\tpStatistics->TransmittedFrameCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;\n\t\t\tpStatistics->WEPUndecryptableCount.QuadPart = pAd->WlanCounters.WEPUndecryptableCount.QuadPart;\n                wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);\n                Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);\n/*                kfree(pStatistics); */\n\t\t\t\tos_free_mem(NULL, pStatistics);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_STATISTICS(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n\n\tcase RT_OID_802_11_PER_BSS_STATISTICS:\n\t\t{\n\t\t\tPMBSS_STATISTICS pMbssStat;\n\t\t\tINT apidx = pObj->ioctl_if;\n\t\t\tPMULTISSID_STRUCT\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\n\t\t\tos_alloc_mem(pAd, (UCHAR * *) &pMbssStat, sizeof(MBSS_STATISTICS));\n\t\t\tNdisZeroMemory(pMbssStat, sizeof(MBSS_STATISTICS));\n\n\t\t\tpMbssStat->TransmittedByteCount = pMbss->TransmittedByteCount;\n\t\t\tpMbssStat->ReceivedByteCount =  pMbss->ReceivedByteCount;\n\t\t\tpMbssStat->TxCount =  pMbss->TxCount;\n                        pMbssStat->RxCount =  pMbss->RxCount;\n\t\t\tpMbssStat->RxErrorCount =  pMbss->RxErrorCount;\n\t\t\tpMbssStat->RxDropCount =  pMbss->RxDropCount;\n\t\t\tpMbssStat->TxErrorCount =  pMbss->TxErrorCount;\n\t\t\tpMbssStat->TxDropCount =  pMbss->TxDropCount;\n\t\t\tpMbssStat->ucPktsTx =  pMbss->ucPktsTx;\n\t\t\tpMbssStat->ucPktsRx =  pMbss->ucPktsRx;\n\t\t\tpMbssStat->mcPktsTx =  pMbss->mcPktsTx;\n\t\t\tpMbssStat->mcPktsRx =  pMbss->mcPktsRx;\n\t\t\tpMbssStat->bcPktsTx=  pMbss->bcPktsTx;\n\t\t\tpMbssStat->bcPktsRx=  pMbss->bcPktsRx;\n\t\t\twrq->u.data.length = sizeof(MBSS_STATISTICS);\n\t\t\tcopy_to_user(wrq->u.data.pointer, pMbssStat, wrq->u.data.length);\n\t\t\tos_free_mem(pAd, pMbssStat);\t\t\t\n\t\t}\n\t\tbreak;\n\t\t\t\n\n#ifdef DOT11_N_SUPPORT\n#ifdef TXBF_SUPPORT\n\t\tcase RT_OID_802_11_QUERY_TXBF_TABLE:\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t{\n\t\t\t\tINT i;\n\t\t\t\tRT_802_11_TXBF_TABLE MacTab;\n\n\t\t\t\tMacTab.Num = 0;\n\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC))\n\t\t\t\t\t{\n\t\t\t\t\t\tmemcpy(&MacTab.Entry[MacTab.Num], &pAd->MacTab.Content[i].TxBFCounters, sizeof(RT_COUNTER_TXBF));\n\t\t\t\t\t\tMacTab.Num++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twrq->u.data.length = sizeof(RT_802_11_TXBF_TABLE);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_TXBF_TABLE(chip not support)\\n\"));\n\t\t\t\tStatus= -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef WAPI_SUPPORT\n\t\tcase OID_802_11_MCAST_TXIV:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MCAST_TXIV \\n\"));\n\t\t\tStatus  = -EINVAL;\n\t\t\tbreak;\t\t\t\n\t\tcase OID_802_11_WAPI_CONFIGURATION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::Get WAPI Configuration(%d)\\n\", sizeof(WAPI_CONF)));\n\t\t\tRTMPIoctlQueryWapiConf(pAd, wrq);\t\n\t\t\tbreak;\t\t\t\n\t\tcase OID_802_11_WAPI_IE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WAPI_IE\\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_WIE_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tWAPI_WIE_STRUCT   \twapi_ie;\n\t\t\t\tMAC_TABLE_ENTRY\t\t*pWapiEntry;\n\n\t\t\t\tNdisZeroMemory(&wapi_ie, sizeof(WAPI_WIE_STRUCT));\n\t\t\t\tNdisMoveMemory(wapi_ie.addr, wrq->u.data.pointer, MAC_ADDR_LEN);\n\t\t\t\t\t\n\t\t\t\tpWapiEntry = MacTableLookup(pAd, wapi_ie.addr);\n\t\t\t\t\t\t\n\t\t\t\tif (pWapiEntry && IS_ENTRY_CLIENT(pWapiEntry) && (pWapiEntry->RSNIE_Len > 0))\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\twapi_ie.wie_len = pWapiEntry->RSNIE_Len;\n\t\t\t\t\tNdisMoveMemory(wapi_ie.wie, pWapiEntry->RSN_IE, pWapiEntry->RSNIE_Len);\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\tif (copy_to_user(wrq->u.data.pointer, &wapi_ie, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t\t\t\t}\t\t\t\t\t\t\t\t\n            }\n\t\t\tbreak;\t\t\n\n\t\tcase OID_802_11_MCAST_KEY_INFO:\n\t\t\t{\n\t\t\t\tPMULTISSID_STRUCT pMbss;\n\t\t\t\tWAPI_MCAST_KEY_STRUCT   wapi_mkey;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_MCAST_KEY_INFO\\n\"));\n\t\t\t\t\t\t\t\n\t\t\t\tpMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];\t\t\t\t\t\n\t\t\t\tNdisZeroMemory(&wapi_mkey, sizeof(WAPI_MCAST_KEY_STRUCT));\n\n\t\t\t\tif (pMbss->sw_wpi_encrypt)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tNdisMoveMemory(wapi_mkey.m_tx_iv, \n\t\t\t\t\t\t\t\t   pAd->SharedKey[pObj->ioctl_if][pMbss->DefaultKeyId].TxTsc,\n\t\t\t\t\t\t\t\t   LEN_WAPI_TSC);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tINT\tm_wcid;\t\n\t\t\t\t\n\t\t\t\t\tGET_GroupKey_WCID(pAd, m_wcid, apidx);\n\t\t\t\t\tRTMPGetWapiTxTscFromAsic(pAd, m_wcid, wapi_mkey.m_tx_iv);\n\t\t\t\t}\t\t\t\t\n\t\t\t\twapi_mkey.key_id = pMbss->DefaultKeyId;\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tNdisMoveMemory(wapi_mkey.key_announce, pMbss->key_announce_flag, LEN_WAPI_TSC);\n\t\t\t\tNdisMoveMemory(wapi_mkey.NMK, pMbss->NMK, 16);\n\n\t\t\t\twrq->u.data.length = sizeof(WAPI_MCAST_KEY_STRUCT);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &wapi_mkey, wrq->u.data.length);\n\t\t\t}\n\t\t\tbreak;\t\t\n\t\t\t\n#endif /* WAPI_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n\n\t\tcase HOSTAPD_OID_GETWPAIE:/*report wpa ie of the new station to hostapd. */\n\t\t\t\n\t\t\tif (wrq->u.data.length != sizeof(wpaie))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse if (copy_from_user(&wpaie, wrq->u.data.pointer, IEEE80211_ADDR_LEN))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpEntry = MacTableLookup(pAd, wpaie.wpa_macaddr);\n\t\t\t\tif (!pEntry){\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisZeroMemory(wpaie.rsn_ie,sizeof(wpaie.rsn_ie));\n\t\t\t\t/* For WPA1, RSN_IE=221 */\n\t\t\t\tif ((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) \n\t\t\t\t\t||(pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t\t\t|| (pEntry->AuthMode == Ndis802_11AuthModeWPA1WPA2) ||(pEntry->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tint ielen = pEntry->RSNIE_Len;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pEntry->RSNIE_Len=%d\\n\",pEntry->RSNIE_Len));\n\t\t\t\t\tif (ielen > sizeof(wpaie.rsn_ie))\n\t\t\t\t\t\tielen = sizeof(wpaie.rsn_ie)-1;\n\t\t\t\t\tp = wpaie.rsn_ie;\n\t\t\t\t\thex_dump(\"HOSTAPD_OID_GETWPAIE woody==>pEntry->RSN_IE\", (unsigned char*)pEntry->RSN_IE,ielen);\n\t\t\t\t\tNdisMoveMemory(p, pEntry->RSN_IE, ielen);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(copy_to_user(wrq->u.data.pointer, &wpaie, sizeof(wpaie)))\n\t\t\t\tStatus = -EFAULT;\n\t\t\tbreak;\n\n\t\t\t\n\t\tcase HOSTAPD_OID_GET_SEQ:/*report txtsc to hostapd. */\n\n\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\tif (wrq->u.data.length != sizeof(ik))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse if (copy_from_user(&ik, wrq->u.data.pointer, IEEE80211_ADDR_LEN))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&ik.ik_keytsc, sizeof(ik.ik_keytsc));\n\t\t\t\tp = (unsigned char *)&ik.ik_keytsc;\n\t\t\t\tNdisMoveMemory(p+2, pAd->SharedKey[apidx][ pMbss->DefaultKeyId].TxTsc, 6);\n\t\t\t\tif(copy_to_user(wrq->u.data.pointer, &ik, sizeof(ik)))\n\t\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\t\n\t\tcase HOSTAPD_OID_GET_1X_GROUP_KEY:/*report default group key to hostapd. */\n\n\t\t\tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\t\tif (wrq->u.data.length != sizeof(group_key))\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen!=0 && pAd->SharedKey[apidx][ pMbss->DefaultKeyId].Key!=NULL)\n\t\t\t\t{\n\t\t\t\t\tgroup_key.ik_keyix = pMbss->DefaultKeyId;\n\t\t\t\t\tgroup_key.ik_keylen = pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen;\n\t\t\t\t\tNdisMoveMemory(group_key.ik_keydata, pAd->SharedKey[apidx][ pMbss->DefaultKeyId].Key,pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen);\n\t\t\t\t\tif(copy_to_user(wrq->u.data.pointer, &group_key, sizeof(group_key)))\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n#endif/*HOSTAPD_SUPPORT*/\n\n#ifdef APCLI_SUPPORT\n\t\tcase OID_GEN_MEDIA_CONNECT_STATUS:\n\t\t\t{\n\t\t\t\tULONG ApCliIdx = pObj->ioctl_if;\n\n\t\t\t\tNDIS_MEDIA_STATE MediaState;\n\t\t\t\tPMAC_TABLE_ENTRY pEntry;\n\t\t\t\tPAPCLI_STRUCT pApCliEntry;\n\n\t\t\t\tif ((pObj->ioctl_if_type != INT_APCLI)\n#ifdef P2P_SUPPORT\n\t\t\t\t\t&& (pObj->ioctl_if_type != INT_P2P)\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tStatus = -EOPNOTSUPP;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tAPCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);\n\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ApCliIdx];\n\t\t\t\t\tpEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; \n\n\t\t\t\t\tif (!IS_ENTRY_APCLI(pEntry)\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t&& !IS_ENTRY_P2PCLI(pEntry)\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\tMediaState = NdisMediaStateDisconnected;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pAd->ApCfg.ApCliTab[ApCliIdx].Valid == TRUE)\n\t\t\t\t\t\t\t&& (pEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n\t\t\t\t\t\t\tMediaState = NdisMediaStateConnected;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tMediaState = NdisMediaStateDisconnected;\n\t\t\t\t\t}\n\n\t\t\t\t\twrq->u.data.length = sizeof(NDIS_MEDIA_STATE);\n\t\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n\n\n\n   \t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::unknown IOCTL's subcmd = 0x%08x, apidx=%d\\n\", cmd, apidx));\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n    }\n\n\treturn Status;\n}\n\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Country Code.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_CountryCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tif(strlen(arg) == 2)\n\t{\n\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, arg, 2);\n\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\t}\n\telse\n\t{\n\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\tpAd->CommonCfg.bCountryFlag = FALSE;\n\t}\t\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryCode_Proc::(bCountryFlag=%d, CountryCode=%s)\\n\", pAd->CommonCfg.bCountryFlag, pAd->CommonCfg.CountryCode));\n\n\treturn TRUE;\n}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_ChGeography_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG Geography;\n\t\t\n\tGeography = simple_strtol(arg, 0, 10);\n\tif (Geography <= BOTH)\n\t\tpAd->CommonCfg.Geography = Geography;\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ChannelGeography_Proc::(wrong setting. 0: Out-door, 1: in-door, 2: both)\\n\"));\n\n\tpAd->CommonCfg.CountryCode[2] =\n\t\t(pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_ChannelGeography_Proc:: Geography = %s\\n\", pAd->CommonCfg.Geography == ODOR ? \"out-door\" : (pAd->CommonCfg.Geography == IDOR ? \"in-door\" : \"both\")));\n\t\n\t/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */\n\t/* it's no longer necessary since APStartUp will rebuild channel again. */\n\t/*BuildChannelListEx(pAd); */\n\n\treturn TRUE;\t\t\t\n}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\n/*\n    ==========================================================================\n    Description:\n        Set Country String.\n        This command will not work, if the field of CountryRegion in eeprom is programmed.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_CountryString_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT   index = 0;\n\tINT   success = TRUE;\n\tSTRING  name_buffer[40] = {0};\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\treturn -EOPNOTSUPP;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\tif(strlen(arg) <= 38)\n\t{\n\t\tif (strlen(arg) < 4)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::Parameter of CountryString are too short !\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\tfor (index = 0; index < strlen(arg); index++)\n\t\t{\n\t\t\tif ((arg[index] >= 'a') && (arg[index] <= 'z'))\n\t\t\t\targ[index] = toupper(arg[index]);\n\t\t}\n\n\t\tfor (index = 0; index < NUM_OF_COUNTRIES; index++)\n\t\t{\n\t\t\tNdisZeroMemory(name_buffer, 40);\n\t\t\tsnprintf(name_buffer, sizeof(name_buffer), \"\\\"%s\\\"\", (PSTRING) allCountry[index].pCountryName);\n\n\t\t\tif (strncmp((PSTRING) allCountry[index].pCountryName, arg, strlen(arg)) == 0)\n\t\t\t\tbreak;\n\t\t\telse if (strncmp(name_buffer, arg, strlen(arg)) == 0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (index == NUM_OF_COUNTRIES)\n\t\t\tsuccess = FALSE;\n\t}\n\telse\n\t{\n\t\tsuccess = FALSE;\n\t}\t\t\t\n\n\tif (success == TRUE)\n\t{\n\t\tif (WMODE_CAP_2G(pAd->CommonCfg.PhyMode))\n\t\t{\n\t\t\tif (pAd->CommonCfg.CountryRegionForABand & 0x80)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::parameter of CountryRegion in eeprom is programmed \\n\"));\n\t\t\t\tsuccess = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (allCountry[index].SupportGBand == TRUE)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\t\t\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, allCountry[index].IsoName, 2);\n\t\t\t\t\tpAd->CommonCfg.CountryCode[2] = ' ';\n\n\t\t\t\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\n\t\t\t\t\tpAd->CommonCfg.CountryRegion = (UCHAR) allCountry[index].RegDomainNum11G;\n\n\t\t\t\t\t/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */\n\t\t\t\t\t/* it's no longer necessary since APStartUp will rebuild channel again. */\n\t\t\t\t\t/*BuildChannelList(pAd); */\n\n\t\t\t\t\tsuccess = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The Country are not Support G Band Channel\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t\t{\n\t\t\tif (pAd->CommonCfg.CountryRegion & 0x80)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::parameter of CountryRegion in eeprom is programmed \\n\"));\n\t\t\t\tsuccess = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (allCountry[index].SupportABand == TRUE)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pAd->CommonCfg.CountryCode, 3);\n\t\t\t\t\tNdisMoveMemory(pAd->CommonCfg.CountryCode, allCountry[index].IsoName, 2);\n\t\t\t\t\tpAd->CommonCfg.CountryCode[2] = ' ';\n\n\t\t\t\t\tpAd->CommonCfg.bCountryFlag = TRUE;\n\n\t\t\t\t\tpAd->CommonCfg.CountryRegionForABand = (UCHAR) allCountry[index].RegDomainNum11A;\n\n\t\t\t\t\t/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */\n\t\t\t\t\t/* it's no longer necessary since APStartUp will rebuild channel again. */\n\t\t\t\t\t/*BuildChannelList(pAd); */\n\n\t\t\t\t\tsuccess = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tsuccess = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The Country are not Support A Band Channel\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tsuccess = FALSE;\n\t}\n\n\tif (success == TRUE)\n\t{\n\t\t/* if set country string, driver needs to be reset */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_CountryString_Proc::(CountryString=%s CountryRegin=%d CountryCode=%s)\\n\", \n\t\t\t\t\t\t\tallCountry[index].pCountryName, pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryCode));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_CountryString_Proc::Parameters out of range\\n\"));\n\t}\n\n\treturn success;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set SSID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_SSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT   success = FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAdapter->OS_Cookie;\n\tMULTISSID_STRUCT *pMBSSStruct;\n\n\tif(strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tpMBSSStruct = &pAdapter->ApCfg.MBSSID[pObj->ioctl_if];\n\t\tNdisZeroMemory(pMBSSStruct->Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pMBSSStruct->Ssid, arg, strlen(arg));\n\t\tpMBSSStruct->SsidLen = (UCHAR)strlen(arg);\n\t\tsuccess = TRUE;\n\n\n#ifdef P2P_SUPPORT\n\t\tif (pObj->ioctl_if_type == INT_P2P)\n\t\t{\n\t\t\tRT_CfgSetWPAPSKKey( pAdapter, \n\t\t\t\t\t\t\t\tpAdapter->P2pCfg.PhraseKey, \n\t\t\t\t\t\t\t\tpAdapter->P2pCfg.PhraseKeyLen, \n\t\t\t\t\t\t\t\t(PUCHAR)pMBSSStruct->Ssid, \n\t\t\t\t\t\t\t\tpMBSSStruct->SsidLen, \n\t\t\t\t\t\t\t\tpMBSSStruct->PMK);\n\t\t\t\n\t\t\tNdisZeroMemory(pAdapter->P2pCfg.SSID, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pAdapter->P2pCfg.SSID, arg, strlen(arg));\n\t\t\tpAdapter->P2pCfg.SSIDLen = (UCHAR)strlen(arg);\n\t\t\t\n\t\t\tif (P2P_GO_ON(pAdapter))\n\t\t\t{\n\t\t\t\tP2P_GoStop(pAdapter);\n\t\t\t\tP2P_GoStartUp(pAdapter, MAIN_MBSSID);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_SSID_Proc::(Len=%d,Ssid=%s)\\n\", pObj->ioctl_if,\n\t\t\t\t\tpMBSSStruct->SsidLen, pMBSSStruct->Ssid));\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\t/* If in detection mode, need to stop detect first. */\n\t\t\tif (pAdapter->CommonCfg.bIEEE80211H == FALSE)\n\t\t\t{\n\t\t\t\tAPStop(pAdapter);\n\t\t\t\tAPStartUp(pAdapter);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* each mode has different restart method */\n\t\t\t\tif (pAdapter->Dot11_H.RDMode == RD_SILENCE_MODE)\n\t\t\t\t{\n\t\t\t\t\tAPStop(pAdapter);\n\t\t\t\t\tAPStartUp(pAdapter);\n\t\t\t\t}\n\t\t\t\telse if (pAdapter->Dot11_H.RDMode == RD_SWITCHING_MODE)\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\telse if (pAdapter->Dot11_H.RDMode == RD_NORMAL_MODE)\n\t\t\t\t{\n\t\t\t\t\tAPStop(pAdapter);\n\t\t\t\t\tAPStartUp(pAdapter);\n\t\t\t\t\tAsicEnableBssSync(pAdapter);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_SSID_Proc::(Len=%d,Ssid=%s)\\n\", pObj->ioctl_if,\n\t\t\t\tpAdapter->ApCfg.MBSSID[pObj->ioctl_if].SsidLen, pAdapter->ApCfg.MBSSID[pObj->ioctl_if].Ssid));\n\t\t}\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\treturn success;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set TxRate\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_TxRate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tNdisZeroMemory(pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRates, MAX_LEN_OF_SUPPORTED_RATES);\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex = simple_strtol(arg, 0, 10);\n\t/* todo RTMPBuildDesireRate(pAd, pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex); */\n\t\n\t/*todo MlmeUpdateTxRates(pAd); */\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Beacon Period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_BeaconPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT BeaconPeriod;\n\tINT   success = FALSE;\n\n\tBeaconPeriod = (USHORT) simple_strtol(arg, 0, 10);\n\tif((BeaconPeriod >= 20) && (BeaconPeriod < 1024))\n\t{\n\t\tpAd->CommonCfg.BeaconPeriod = BeaconPeriod;\n\t\tsuccess = TRUE;\n\n#ifdef AP_QLOAD_SUPPORT\n\t\t/* re-calculate QloadBusyTimeThreshold */\n\t\tQBSS_LoadAlarmReset(pAd);\n#endif /* AP_QLOAD_SUPPORT */\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_BeaconPeriod_Proc::(BeaconPeriod=%d)\\n\", pAd->CommonCfg.BeaconPeriod));\n\n\treturn success;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Dtim Period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_DtimPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT DtimPeriod;\n\tINT   success = FALSE;\n\n\tDtimPeriod = (USHORT) simple_strtol(arg, 0, 10);\n\tif((DtimPeriod >= 1) && (DtimPeriod <= 255))\n\t{\n\t\tpAd->ApCfg.DtimPeriod = DtimPeriod;\n\t\tsuccess = TRUE;\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_DtimPeriod_Proc::(DtimPeriod=%d)\\n\", pAd->ApCfg.DtimPeriod));\n\n\treturn success;\n}\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Disable/enable OLBC detection manually\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_OLBCDetection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tswitch (simple_strtol(arg, 0, 10))\n\t{\n\t\tcase 0: /*enable OLBC detect */\n\t\t\tpAd->CommonCfg.DisableOLBCDetect = 0;\n\t\t\tbreak;\n\t\tcase 1: /*disable OLBC detect */\n\t\t\tpAd->CommonCfg.DisableOLBCDetect = 1;\n\t\t\tbreak;\n\t\tdefault:  /*Invalid argument */\n\t\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\n#ifdef WMM_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set WmmCapable Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\tbWmmCapable;\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tbWmmCapable = simple_strtol(arg, 0, 10);\n\n\tif (bWmmCapable == 1)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable = TRUE;\n\telse if (bWmmCapable == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapableOrg = \\\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable;\n\t\n#ifdef RTL865X_FAST_PATH\t\n\tif (!isFastPathCapable(pAd)) {\n\t\trtlairgo_fast_tx_unregister();\n\t\trtl865x_extDev_unregisterUcastTxDev(pAd->net_dev);\t\t\n\t}\n#endif\n\n#ifdef DOT11_N_SUPPORT\n\t/*Sync with the HT relate info. In N mode, we should re-enable it */\n\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WmmCapable_Proc::(bWmmCapable=%d)\\n\", \n\t\tpObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapable));\n\n\treturn TRUE;\n}\n#endif /* WMM_SUPPORT */\n\n\nINT\tSet_AP_MaxStaNum_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tINT\t\t\tapidx = pObj->ioctl_if;\n\n\treturn ApCfg_Set_MaxStaNum_Proc(pAd, apidx, arg);\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set session idle timeout\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_IdleTimeout_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\treturn ApCfg_Set_IdleTimeout_Proc(pAd, arg);\n}\n/* \n    ==========================================================================\n    Description:\n        Set No Forwarding Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_NoForwarding_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG NoForwarding;\n\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tNoForwarding = simple_strtol(arg, 0, 10);\n\n\tif (NoForwarding == 1)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = TRUE;\n\telse if (NoForwarding == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_NoForwarding_Proc::(NoForwarding=%ld)\\n\", \n\t\tpObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set No Forwarding between each SSID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_NoForwardingBTNSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG NoForwarding;\n\n\tNoForwarding = simple_strtol(arg, 0, 10);\n\n\tif (NoForwarding == 1)\n\t\tpAd->ApCfg.IsolateInterStaTrafficBTNBSSID = TRUE;\n\telse if (NoForwarding == 0)\n\t\tpAd->ApCfg.IsolateInterStaTrafficBTNBSSID = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_NoForwardingBTNSSID_Proc::(NoForwarding=%ld)\\n\", pAd->ApCfg.IsolateInterStaTrafficBTNBSSID));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Hide SSID Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_HideSSID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN bHideSsid;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tbHideSsid = simple_strtol(arg, 0, 10);\n\n\tif (bHideSsid == 1)\n\t\tbHideSsid = TRUE;\n\telse if (bHideSsid == 0)\n\t\tbHideSsid = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid != bHideSsid)\n\t{\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid = bHideSsid;\n\t}\n\n#ifdef WSC_V2_SUPPORT\n\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.bEnableWpsV2)\n\t\tWscOnOff(pAd, pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid);\n#endif /* WSC_V2_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_HideSSID_Proc::(HideSSID=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set VLAN's ID field\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_VLANID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_VID = simple_strtol(arg, 0, 10);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_VLANID_Proc::(VLAN_VID=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_VID));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set VLAN's priority field\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_VLANPriority_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_Priority = simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_VLANPriority_Proc::(VLAN_Priority=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].VLAN_Priority));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG       i;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\n\tif (apidx >= pAd->ApCfg.BssidNum)\n\t\treturn FALSE;  \n\n\t/* Set Authentication mode */\n\tApCfg_Set_AuthMode_Proc(pAd, apidx, arg);\n\n\t/* reset the portSecure for all entries */\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))\n\t\t{\n\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t}\n\t}\n\n\t/* reset the PortSecure this BSS */\n\tpAd->ApCfg.MBSSID[apidx].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t/* Default key index is always 2 in WPA mode */\t\n\tif(pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 1;\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Encryption Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_EncrypType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\t\n\tif ((strcmp(arg, \"NONE\") == 0) || (strcmp(arg, \"none\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPDisabled;\n\telse if ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPEnabled;\n\telse if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption2Enabled;\n\telse if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption3Enabled;\n\telse if ((strcmp(arg, \"TKIPAES\") == 0) || (strcmp(arg, \"tkipaes\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption4Enabled;\n#ifdef WAPI_SUPPORT\n\telse if ((strcmp(arg, \"SMS4\") == 0) || (strcmp(arg, \"sms4\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11EncryptionSMS4Enabled;\n#endif /* WAPI_SUPPORT */\t\t\n\telse\n\t\treturn FALSE;\n\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus >= Ndis802_11Encryption2Enabled)\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 1;\n\n\t/* decide the group key encryption type */\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\t\n\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = Ndis802_11Encryption2Enabled;\t\t\n\telse\n\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus = pAd->ApCfg.MBSSID[apidx].WepStatus;\n\n\t/* move to ap.c::APStartUp to process */\n    /*RTMPMakeRSNIE(pAd, pAd->ApCfg.MBSSID[apidx].AuthMode, pAd->ApCfg.MBSSID[apidx].WepStatus, apidx); */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_EncrypType_Proc::(EncrypType=%d)\\n\", apidx, pAd->ApCfg.MBSSID[apidx].WepStatus));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA pairwise mix-cipher combination\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_WpaMixPairCipher_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\n\t/*\n\t\tIn WPA-WPA2 mix mode, it provides a more flexible cipher combination. \n\t\t-\tWPA-AES and WPA2-TKIP\n\t\t-\tWPA-AES and WPA2-TKIPAES\n\t\t-\tWPA-TKIP and WPA2-AES\n\t\t-\tWPA-TKIP and WPA2-TKIPAES\n\t\t-\tWPA-TKIPAES and WPA2-AES\n\t\t-\tWPA-TKIPAES and WPA2-TKIP\n\t\t-\tWPA-TKIPAES and WPA2-TKIPAES (default)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t */\t\t\t\t\t\t\t\t\t\n\tif ((strncmp(arg, \"WPA_AES_WPA2_TKIPAES\", 20) == 0) || (strncmp(arg, \"wpa_aes_wpa2_tkipaes\", 20) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_AES_WPA2_TKIPAES;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\telse if ((strncmp(arg, \"WPA_AES_WPA2_TKIP\", 17) == 0) || (strncmp(arg, \"wpa_aes_wpa2_tkip\", 17) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_AES_WPA2_TKIP;\t\t\t\t\t\t\t\t \t\t\t\t\t\t\n\telse if ((strncmp(arg, \"WPA_TKIP_WPA2_AES\", 17) == 0) || (strncmp(arg, \"wpa_tkip_wpa2_aes\", 17) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIP_WPA2_AES;\t\t\t\t\t\t\t\t\n\telse if ((strncmp(arg, \"WPA_TKIP_WPA2_TKIPAES\", 21) == 0) || (strncmp(arg, \"wpa_tkip_wpa2_tkipaes\", 21) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIP_WPA2_TKIPAES;\n\telse if ((strncmp(arg, \"WPA_TKIPAES_WPA2_AES\", 20) == 0) || (strncmp(arg, \"wpa_tkipaes_wpa2_aes\", 20) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIPAES_WPA2_AES;\n\telse if ((strncmp(arg, \"WPA_TKIPAES_WPA2_TKIPAES\", 24) == 0) || (strncmp(arg, \"wpa_tkipaes_wpa2_tkipaes\", 24) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;\n\telse if ((strncmp(arg, \"WPA_TKIPAES_WPA2_TKIP\", 21) == 0) || (strncmp(arg, \"wpa_tkipaes_wpa2_tkip\", 21) == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIP;\n\telse\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_WpaMixPairCipher_Proc=0x%02x\\n\", apidx, pAd->ApCfg.MBSSID[apidx].WpaMixPairCipher));\n\t\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA rekey interval value\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_RekeyInterval_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\tINT32\tval;\n\n\tval = simple_strtol(arg, 0, 10);\n\n\tif((val >= 10) && (val < MAX_REKEY_INTER))\n\t\tpAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval = val;\n\telse /*Default */\n\t\tpAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval = 3600;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_RekeyInterval_Proc=%ld\\n\", \n\t\t\t\t\t\t\t\tapidx, pAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA rekey method\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_RekeyMethod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\tPRT_WPA_REKEY\tpInfo = &pAd->ApCfg.MBSSID[apidx].WPAREKEY;\n\t\n\tif ((strcmp(arg, \"TIME\") == 0) || (strcmp(arg, \"time\") == 0))\n\t\tpInfo->ReKeyMethod = TIME_REKEY;\n\telse if ((strcmp(arg, \"PKT\") == 0) || (strcmp(arg, \"pkt\") == 0))\n\t\tpInfo->ReKeyMethod = PKT_REKEY;\n\telse if ((strcmp(arg, \"DISABLE\") == 0) || (strcmp(arg, \"disable\") == 0))\n\t\tpInfo->ReKeyMethod = DISABLE_REKEY;\n\telse\n\t\tpInfo->ReKeyMethod = DISABLE_REKEY;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_RekeyMethod_Proc=%ld\\n\", \n\t\t\t\t\t\t\t\tapidx, pInfo->ReKeyMethod));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set PMK-cache period\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_PMKCachePeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tapidx = pObj->ioctl_if;\n\tUINT32 val = simple_strtol(arg, 0, 10);\n\n\tpAd->ApCfg.MBSSID[apidx].PMKCachePeriod = val * 60 * OS_HZ;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) Set_AP_PMKCachePeriod_Proc=%ld\\n\", \n\t\t\t\t\t\t\t\t\tapidx, pAd->ApCfg.MBSSID[apidx].PMKCachePeriod));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Default Key ID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_DefaultKeyID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG KeyIdx;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tapidx = pObj->ioctl_if;\n\n\n\tKeyIdx = simple_strtol(arg, 0, 10);\n\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\\n\", apidx, pAd->ApCfg.MBSSID[apidx].DefaultKeyId));\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY1\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][0];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 0);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 0, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key1_Proc::(Key1=%s) success!\\n\", apidx, arg));\n\t}\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY2\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][1];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 1);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 1, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key2_Proc::(Key2=%s) success!\\n\", apidx, arg));\n\t}\n\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY3\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][2];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 2);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 2, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key3_Proc::(Key3=%s) success!\\n\", apidx, arg));\n\t}\n\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY4\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_Key4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tPOS_COOKIE pObj;\n\tUCHAR\tapidx;\n\tCIPHER_KEY\t*pSharedKey;\n\tINT\t\tretVal;\t\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx = pObj->ioctl_if;\n\tpSharedKey = &pAd->SharedKey[apidx][3];\n\tretVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, 3);\n\tif (retVal == TRUE)\n\t{\t\t\n\t\t/* Set keys (into ASIC) */\n\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t;   /* not support */\n\t\telse    /* Old WEP stuff */\n\t\t{\n\t\t\tAsicAddSharedKeyEntry(pAd, apidx, 3, pSharedKey);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_Key4_Proc::(Key4=%s) success!\\n\", apidx, arg));\n\t}\n\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Access ctrol policy\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AccessPolicy_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tswitch (simple_strtol(arg, 0, 10))\n\t{\n\t\tcase 0: /*Disable */\n\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 0;\n\t\t\tbreak;\n\t\tcase 1: /* Allow All, and ACL is positive. */\n\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 1;\n\t\t\tbreak;\n\t\tcase 2: /* Reject All, and ACL is negative. */\n\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 2;\n\t\t\tbreak;\n\t\tdefault: /*Invalid argument */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_AccessPolicy_Proc::Invalid argument (=%s)\\n\", arg));\t\t\n\t\t\treturn FALSE;\n\t}\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_AccessPolicy_Proc::(AccessPolicy=%ld)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy));\n\n\treturn TRUE;\t\n}\n\n\n/* Replaced by Set_ACLAddEntry_Proc() and Set_ACLClearAll_Proc() */\n\n/* \n    ==========================================================================\n    Description:\n        Add one entry or several entries(if allowed to)\n        \tinto Access control mac table list\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLAddEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tmacAddr[MAC_ADDR_LEN];\n/*\tRT_802_11_ACL\t\t\tacl; */\n\tRT_802_11_ACL\t\t\t*pacl = NULL;\n\tPSTRING\t\t\t\t\tthis_char;\n\tPSTRING\t\t\t\t\tvalue;\n\tINT\t\t\t\t\t\ti, j;\n\tBOOLEAN\t\t\t\t\tisDuplicate=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif (pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num >= (MAX_NUM_OF_ACL_LIST - 1))\n    {\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The AccessControlList is full, and no more entry can join the list!\\n\"));\t\t\n\t\treturn FALSE;\n\t}\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL));\n\tif (pacl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tNdisZeroMemory(pacl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(pacl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\n\twhile ((this_char = strsep((char **)&arg, \";\")) != NULL)\n\t{\n\t\tif (*this_char == '\\0')\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"An unnecessary delimiter entered!\\n\"));\n\t\t\tcontinue;\n\t\t}\n\t\tif (strlen(this_char) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address length!\\n\"));\n\t\t\tcontinue;\n\t\t}\n        for (i=0, value = rstrtok(this_char,\":\"); value; value = rstrtok(NULL,\":\")) \n\t\t{\n\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address format or octet!\\n\"));\n\t\t\t\t/* Do not use \"continue\" to replace \"break\" */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tAtoH(value, &macAddr[i++], 1);\n\t\t}\n\n\t\tif (i != MAC_ADDR_LEN)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Check if this entry is duplicate. */\n\t\tisDuplicate = FALSE;\n\t\tfor (j=0; j<pacl->Num; j++)\n\t\t{\n\t\t\tif (memcmp(pacl->Entry[j].Addr, &macAddr, 6) == 0)\n\t\t\t{\n\t\t\t\tisDuplicate = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"You have added an entry before :\\n\"));\n\t        \tDBGPRINT(RT_DEBUG_WARN, (\"The duplicate entry is %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t\t}\n\t\t}\n\n\t\tif (!isDuplicate)\n\t\t{\n\t\t\tNdisMoveMemory(pacl->Entry[pacl->Num++].Addr, &macAddr, MAC_ADDR_LEN);\n\t\t}\n\n\t\tif (pacl->Num == MAX_NUM_OF_ACL_LIST)\n\t    {\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"The AccessControlList is full, and no more entry can join the list!\\n\"));\n        \tDBGPRINT(RT_DEBUG_WARN, (\"The last entry of ACL is %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tASSERT(pacl->Num < MAX_NUM_OF_ACL_LIST);\n\n\tNdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, pacl, sizeof(RT_802_11_ACL));\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::%s(Policy=%ld, Entry#=%ld)\\n\",\n\t\t__FUNCTION__ , pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));\n\n#ifdef DBG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"=============== Entry ===============\\n\"));\n\tfor (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)\n\t{\n\t\tprintk(\"Entry #%02d: \", i+1);\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t   printk(\"%02X \", pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]);\n\t\tprintk(\"\\n\");\n\t}\n#endif\n\n\tif (pacl != NULL)\n\t\tos_free_mem(NULL, pacl);\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Delete one entry or several entries(if allowed to)\n        \tfrom Access control mac table list\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLDelEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tmacAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\tnullAddr[MAC_ADDR_LEN];\n\tRT_802_11_ACL\t\t\tacl;\n\tPSTRING\t\t\t\t\tthis_char;\n\tPSTRING\t\t\t\t\tvalue;\n\tINT\t\t\t\t\t\ti, j;\n\tBOOLEAN\t\t\t\t\tisFound=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tNdisZeroMemory(&acl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&acl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\tNdisZeroMemory(nullAddr, MAC_ADDR_LEN);\n\t\n\twhile ((this_char = strsep((char **)&arg, \";\")) != NULL)\n\t{\n\t\tif (*this_char == '\\0')\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"An unnecessary delimiter entered!\\n\"));\n\t\t\tcontinue;\n\t\t}\n\t\tif (strlen(this_char) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address length!\\n\"));\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (i=0, value = rstrtok(this_char,\":\"); value; value = rstrtok(NULL,\":\")) \n\t\t{\n\t\t\tif ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"illegal MAC address format or octet!\\n\"));\n\t\t\t\t/* Do not use \"continue\" to replace \"break\" */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tAtoH(value, &macAddr[i++], 1);\n\t\t}\n\n\t\tif (i != MAC_ADDR_LEN)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Check if this entry existed. */\n\t\tisFound = FALSE;\n\t\tfor (j=0; j<acl.Num; j++)\n\t\t{\n\t\t\tif (memcmp(acl.Entry[j].Addr, &macAddr, MAC_ADDR_LEN) == 0)\n\t\t\t{\n\t\t\t\tisFound = TRUE;\n\t\t\t\tNdisZeroMemory(acl.Entry[j].Addr, MAC_ADDR_LEN);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The entry %02x:%02x:%02x:%02x:%02x:%02x founded will be deleted!\\n\",\n\t        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t\t}\n\t\t}\n\n\t\tif (!isFound)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The entry %02x:%02x:%02x:%02x:%02x:%02x is not in the list!\\n\",\n        \t\tmacAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));\n\t\t}\n\t}\n\t\n\tNdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = acl.Policy;\n\tASSERT(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num == 0);\n\ti = 0;\n\n\tfor (j=0; j<acl.Num; j++)\n\t{\n\t\tif (memcmp(acl.Entry[j].Addr, &nullAddr, MAC_ADDR_LEN) == 0)\n\t\t{\n\t\t\tcontinue;\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i++]), acl.Entry[j].Addr, MAC_ADDR_LEN);\n\t\t}\n\t}\n\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num = i;\n\tASSERT(acl.Num >= pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num);\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::%s(Policy=%ld, Entry#=%ld)\\n\",\n\t\t__FUNCTION__ , pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));\n\n#ifdef DBG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"=============== Entry ===============\\n\"));\n\tfor (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)\n\t{\n\t\tprintk(\"Entry #%02d: \", i+1);\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t   printk(\"%02X \", pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]);\n\t\tprintk(\"\\n\");\n\t}\n#endif\n\treturn TRUE;\n}\n\n\n/* for ACL policy message */\n#define ACL_POLICY_TYPE_NUM\t3\nchar const *pACL_PolicyMessage[ACL_POLICY_TYPE_NUM] = {   \t\n\t\"the Access Control feature is disabled\",\t\t\t\t\t\t/* 0 : Disable */\n\t\"only the following entries are allowed to join this BSS\",\t\t\t/* 1 : Allow */\n\t\"all the following entries are rejected to join this BSS\",\t\t\t/* 2 : Reject */\n};\n\n\n/* \n    ==========================================================================\n    Description:\n        Dump all the entries in the Access control \n        \tmac table list of a specified BSS\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLShowAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tRT_802_11_ACL\t\t\tacl;\n\tBOOLEAN\t\t\t\t\tbDumpAll=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tINT\t\t\t\t\t\ti, j;\n\t\n\tbDumpAll = simple_strtol(arg, 0, 10);\n\n\tif (bDumpAll == 1)\n\t{\n\t\tbDumpAll = TRUE;\n\t}\n\telse if (bDumpAll == 0)\n\t{\n\t\tbDumpAll = FALSE;\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Your input is 0!\\n\"));\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List will not be dumped!\\n\"));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;  /* Invalid argument */\n\t}\n\n\tNdisZeroMemory(&acl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&acl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\n\t/* Check if the list is already empty. */\n\tif (acl.Num == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List is empty!\\n\"));\n\t\treturn TRUE;\n\t}\n\n\tASSERT(((bDumpAll == 1) && (acl.Num > 0)));\n\n\t/* Show the corresponding policy first. */\n\tprintk(\"=============== Access Control Policy ===============\\n\");\n\tprintk(\"Policy is %ld : \", acl.Policy);\n\tprintk(\"%s\\n\", pACL_PolicyMessage[acl.Policy]);\n\n\t/* Dump the entry in the list one by one */\n\tprintk(\"===============  Access Control List  ===============\\n\");\n\tfor (i=0; i<acl.Num; i++)\n\t{\n\t\tprintk(\"Entry #%02d: \", i+1);\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t   printk(\"%02X \", acl.Entry[i].Addr[j]);\n\t\tprintk(\"\\n\");\n\t}\n\t\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Clear all the entries in the Access control \n        \tmac table list of a specified BSS\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ACLClearAll_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n/*\tRT_802_11_ACL\t\t\tacl; */\n\tRT_802_11_ACL\t\t\t*pacl = NULL;\n\tBOOLEAN\t\t\t\t\tbClearAll=FALSE;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tbClearAll = simple_strtol(arg, 0, 10);\n\n\tif (bClearAll == 1)\n\t{\n\t\tbClearAll = TRUE;\n\t}\n\telse if (bClearAll == 0)\n\t{\n\t\tbClearAll = FALSE;\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Your input is 0!\\n\"));\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List will be kept unchanged!\\n\"));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\treturn FALSE;  /* Invalid argument */\n\t}\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL));\n\tif (pacl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tNdisZeroMemory(pacl, sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(pacl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));\n\t\n\t/* Check if the list is already empty. */\n\tif (pacl->Num == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The Access Control List is empty!\\n\"));\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"No need to clear the Access Control List!\\n\"));\n\t\treturn TRUE;\n\t}\n\n\tASSERT(((bClearAll == 1) && (pacl->Num > 0)));\n\n\t/* Clear the entry in the list one by one */\n\t/* Keep the corresponding policy unchanged. */\n\tdo\n\t{\n\t\tNdisZeroMemory(pacl->Entry[pacl->Num - 1].Addr, MAC_ADDR_LEN);\n\t\tpacl->Num -= 1;\n\t}while (pacl->Num > 0);\n\t\n\tASSERT(pacl->Num == 0);\n\n\tNdisZeroMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), sizeof(RT_802_11_ACL));\n\tNdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), pacl, sizeof(RT_802_11_ACL));\n\n\t/* check if the change in ACL affects any existent association */\n\tApUpdateAccessControlList(pAd, pObj->ioctl_if);\n\n\tif (pacl != NULL)\n\t\tos_free_mem(NULL, pacl);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::%s(Policy=%ld, Entry#=%ld)\\n\",\n\t\t__FUNCTION__, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));\n\n\treturn TRUE;\n}\n\n#ifdef DBG\nstatic void _rtmp_hexdump(int level, const char *title, const UINT8 *buf,\n\t\t\t size_t len, int show)\n{\n\tsize_t i;\n\tif (level < RTDebugLevel)\n\t\treturn;\n\tprintk(\"%s - hexdump(len=%lu):\", title, (unsigned long) len);\n\tif (show) {\n\t\tfor (i = 0; i < len; i++)\n\t\t\tprintk(\" %02x\", buf[i]);\n\t} else {\n\t\tprintk(\" [REMOVED]\");\n\t}\n\tprintk(\"\\n\");\n}\n\nvoid rtmp_hexdump(int level, const char *title, const UINT8 *buf, size_t len)\n{\n\t_rtmp_hexdump(level, title, buf, len, 1);\n}\n#endif\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 WPA pre-shared key string\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_AP_WPAPSK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tapidx = pObj->ioctl_if;\n\tINT\tretval;\n\tMULTISSID_STRUCT *pMBSSStruct;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WPAPSK_Proc::(WPAPSK=%s)\\n\", arg));\n\n\tpMBSSStruct = &pAd->ApCfg.MBSSID[apidx];\n\tretval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pMBSSStruct->Ssid, pMBSSStruct->SsidLen, pMBSSStruct->PMK);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\n#ifdef WSC_AP_SUPPORT\n    NdisZeroMemory(pMBSSStruct->WscControl.WpaPsk, 64);\n    pMBSSStruct->WscControl.WpaPskLen = 0;\n    pMBSSStruct->WscControl.WpaPskLen = strlen(arg);\n\tif (P2P_GO_ON(pAd))\n\tpMBSSStruct->WscControl.WscConfStatus = WSC_SCSTATE_CONFIGURED;\n    NdisMoveMemory(pMBSSStruct->WscControl.WpaPsk, arg, pMBSSStruct->WscControl.WpaPskLen);    \n#endif /* WSC_AP_SUPPORT */    \n\n#ifdef P2P_SUPPORT\n\tif (pObj->ioctl_if_type == INT_P2P)\n\t{\n\t\tPRT_P2P_CONFIG pP2pCfg = &pAd->P2pCfg;\n\t\tNdisZeroMemory(pP2pCfg->PhraseKey, 64);\n\t\tpP2pCfg->PhraseKeyLen = 0;\n\t\tpP2pCfg->PhraseKeyLen = strlen(arg);\n\t\tNdisMoveMemory(pP2pCfg->PhraseKey, arg, pP2pCfg->PhraseKeyLen);\n\t}\n#endif /* P2P_SUPPORT */\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Reset statistics counter\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 \n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\n\nINT\tSet_RadioOn_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR radio;\n\n\tradio = simple_strtol(arg, 0, 10);\n\n\tif (radio)\n\t{\n\t\tMlmeRadioOn(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>Set_RadioOn_Proc (ON)\\n\"));\n\t}\n\telse\n\t{\n\t\tMlmeRadioOff(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>Set_RadioOn_Proc (OFF)\\n\"));\n\t}\n\t\n\treturn TRUE;\n}\n\n#ifdef AP_SCAN_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Issue a site survey command to driver\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set site_survey\n    ==========================================================================\n*/\n\n/* \n    ==========================================================================\n    Description:\n        Issue a Auto-Channel Selection command to driver\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n    \n    Note:\n        Usage: \n               1.) iwpriv ra0 set AutoChannelSel=1\n                   Ues the number of AP to choose\n               2.) iwpriv ra0 set AutoChannelSel=2\n                   Ues the False CCA count to choose\n    ==========================================================================\n*/\nINT Set_AutoChannelSel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\targ)\n{\n\tNDIS_802_11_SSID Ssid;\n\n\n\tNdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n\tif (strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tif (strlen(arg) != 0)\n\t\t{\n\t\t\tNdisMoveMemory(Ssid.Ssid, arg, strlen(arg));\n\t\t\tSsid.SsidLength = strlen(arg);\n\t\t}\n\t\telse   /*ANY ssid */\n\t\t{\n\t\t\tSsid.SsidLength = 0; \n\t\t\tmemcpy(Ssid.Ssid, \"\", 0);\n\t\t}\n\t}\n\tif (strcmp(arg,\"1\") == 0)\n\t\tpAd->ApCfg.AutoChannelAlg = ChannelAlgApCnt;\n\telse if (strcmp(arg,\"2\") == 0)\n\t\tpAd->ApCfg.AutoChannelAlg = ChannelAlgCCA;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set_AutoChannelSel_Proc Alg isn't defined\\n\"));\n\t\treturn FALSE;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_AutoChannelSel_Proc Alg=%d \\n\", pAd->ApCfg.AutoChannelAlg));\n\tif (Ssid.SsidLength == 0)\n\t\tApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, TRUE);\n\telse\n\t\tApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, TRUE);\n    \n    return TRUE;\n\n}\n\n#endif /* AP_SCAN_SUPPORT */\n\nINT Show_DriverInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    printk(\"Driver version: %s\\n\", AP_DRIVER_VERSION);\n    \n    return TRUE;\n}\n\n\nINT\tShow_StaCount_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i;/*, QueIdx=0; */\n    \tUINT32 RegValue;\n\t\n\tprintk(\"\\n\");\n\tRTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue);\n\tprintk(\"BackOff Slot      : %s slot time, BKOFF_SLOT_CFG(0x1104) = 0x%08x\\n\", \n\t\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED) ? \"short\" : \"long\",\n \t\t\tRegValue);\n\n#ifdef DOT11_N_SUPPORT\n\tprintk(\"HT Operating Mode : %d\\n\", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode);\n\tprintk(\"\\n\");\n#endif /* DOT11_N_SUPPORT */\n\t\n\tprintk(\"\\n%-19s%-4s%-12s%-12s%-12s%-12s\\n\",\n\t\t   \"MAC\", \"AID\",\"TxPackets\",\"RxPackets\",\"TxBytes\",\"RxBytes\");\n\t\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))\n\t\t\t&& (pEntry->Sst == SST_ASSOC))\n\t\t{\n\t\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\", (int)pEntry->Aid);\n\t\t\tprintk(\"%-12ld\",(ULONG)pEntry->TxPackets.QuadPart);\n\t\t\tprintk(\"%-12ld\", (ULONG)pEntry->RxPackets.QuadPart);\n\t\t\tprintk(\"%-12ld\", (ULONG)pEntry->TxBytes);\n\t\t\tprintk(\"%-12ld\", (ULONG)pEntry->RxBytes);\n\t\t\tprintk(\"\\n\");\n\t\t}\n\t} \n\n\treturn TRUE;\n}\n\nINT\tShow_StaSecurityInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i;\n\tUCHAR\tapidx;\n    \t\n\tprintk(\"\\n\");\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tprintk(\" BSS(%d) AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s, WPAMixPairCipher(0x%02X)\\n\", \n\t\t\t\t\t\t\tapidx, \n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode, \n\t\t\t\t\t\t\tGetAuthMode(pAd->ApCfg.MBSSID[apidx].AuthMode), \n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus, \n\t\t\t\t\t\t\tGetEncryptType(pAd->ApCfg.MBSSID[apidx].WepStatus), \n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus, \n\t\t\t\t\t\t\tGetEncryptType(pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus),\n\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WpaMixPairCipher);\t\t\n\t}\n\tprintk(\"\\n\");\n\t\n\tprintk(\"\\n%-19s%-4s%-4s%-15s%-12s\\n\",\n\t\t   \"MAC\", \"AID\", \"BSS\", \"Auth\", \"Encrypt\");\n\t\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry) && pEntry->Sst == SST_ASSOC)\n\t\t{\n\t\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\", (int)pEntry->Aid);\n\t\t\tprintk(\"%-4d\", (int)pEntry->apidx);\n\t\t\tprintk(\"%-15s\", GetAuthMode(pEntry->AuthMode));\n\t\t\tprintk(\"%-12s\", GetEncryptType(pEntry->WepStatus));\t\t\t\t\t\t\n\t\t\tprintk(\"\\n\");\n\t\t}\n\t} \n\n\treturn TRUE;\n}\n\n\n#ifdef DOT11_N_SUPPORT\nINT\tShow_BaTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT i, j;\n\tBA_ORI_ENTRY *pOriBAEntry;\n\tBA_REC_ENTRY *pRecBAEntry;\n\tSTRING\t\t tmpBuf[6];\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_NONE(pEntry))\n\t\t\tcontinue;\n\n\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))\n\t\t\t&& (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t\tstrcpy(tmpBuf, \"ApCli\");\n\t\telse if (IS_ENTRY_WDS(pEntry))\n\t\t\tstrcpy(tmpBuf, \"WDS\");\n\t\telse if (IS_ENTRY_MESH(pEntry))\n\t\t\tstrcpy(tmpBuf, \"Mesh\");\n\t\telse\n\t\t\tstrcpy(tmpBuf, \"STA\");\n\t\n\t\tprintk(\"%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (%s) -\\n\",\n\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid, tmpBuf);\n\t\t\n\t\tprintk(\"[Recipient]\\n\");\n\t\tfor (j=0; j < NUM_OF_TID; j++)\n\t\t{\n\t\t\tif (pEntry->BARecWcidArray[j] != 0)\n\t\t\t{\n\t\t\t\tpRecBAEntry =&pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]];\n\t\t\t\tprintk(\"TID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\\n\", j, pRecBAEntry->BAWinSize, pRecBAEntry->LastIndSeq, pRecBAEntry->list.qlen);\n\t\t\t}\n\t\t}\n\t\tprintk(\"\\n\");\n\n\t\tprintk(\"[Originator]\\n\");\n\t\tfor (j=0; j < NUM_OF_TID; j++)\n\t\t{\n\t\t\tif (pEntry->BAOriWcidArray[j] != 0)\n\t\t\t{\n\t\t\t\tpOriBAEntry =&pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]];\n\t\t\t\tprintk(\"TID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\\n\", j, pOriBAEntry->BAWinSize, pOriBAEntry->Sequence, pEntry->TxSeq[j]);\n\t\t\t}\n\t\t}\n\t\tprintk(\"\\n\\n\");\n\t}\n\n\treturn TRUE;\n}\n#endif /* DOT11_N_SUPPORT */\n\n\n\n\nINT\tShow_Sat_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t/* Sanity check for calculation of sucessful count */\n\n\tprintk(\"TransmittedFragmentCount = %d\\n\", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart);\n\tprintk(\"MulticastTransmittedFrameCount = %d\\n\", pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart);\n\tprintk(\"FailedCount = %d\\n\", pAd->WlanCounters.FailedCount.u.LowPart);\n\tprintk(\"RetryCount = %d\\n\", pAd->WlanCounters.RetryCount.u.LowPart);\n\tprintk(\"MultipleRetryCount = %d\\n\", pAd->WlanCounters.MultipleRetryCount.u.LowPart);\n\tprintk(\"RTSSuccessCount = %d\\n\", pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n\tprintk(\"RTSFailureCount = %d\\n\", pAd->WlanCounters.RTSFailureCount.u.LowPart);\n\tprintk(\"ACKFailureCount = %d\\n\", pAd->WlanCounters.ACKFailureCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\tprintk(\"ReceivedFragmentCount = %d\\n\", pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);\n\tprintk(\"MulticastReceivedFrameCount = %d\\n\", pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart);\n#ifdef DBG \t\t\n\tprintk(\"RealFcsErrCount = %d\\n\", pAd->RalinkCounters.RealFcsErrCount.u.LowPart);\n#else\n\tprintk(\"FCSErrorCount = %d\\n\", pAd->WlanCounters.FCSErrorCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount.LowPart = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100);\n#endif\n\tprintk(\"TransmittedFrameCount = %d\\n\", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart);\n\tprintk(\"WEPUndecryptableCount = %d\\n\", pAd->WlanCounters.WEPUndecryptableCount.u.LowPart);\n\n#ifdef DOT11_N_SUPPORT\n\tprintk(\"\\n===Some 11n statistics variables: \\n\");\n\t/* Some 11n statistics variables */\n\tprintk(\"TransmittedAMSDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart);\n\tprintk(\"TransmittedOctetsInAMSDU = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart);\n\tprintk(\"ReceivedAMSDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.ReceivedAMSDUCount.u.LowPart);\t\n\tprintk(\"ReceivedOctesInAMSDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.ReceivedOctesInAMSDUCount.QuadPart);\t\n\tprintk(\"TransmittedAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart);\n\tprintk(\"TransmittedMPDUsInAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart);\n\tprintk(\"TransmittedOctetsInAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.u.LowPart);\n\tprintk(\"MPDUInReceivedAMPDUCount = %ld\\n\", (ULONG)pAd->RalinkCounters.MPDUInReceivedAMPDUCount.u.LowPart);\n#ifdef DOT11N_DRAFT3\n\tprintk(\"fAnyStaFortyIntolerant=%d\\n\", pAd->MacTab.fAnyStaFortyIntolerant);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n{\n\tint apidx;\n\t\t\n\tfor (apidx=0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tprintk(\"-- IF-ra%d -- \\n\", apidx);\n\t\tprintk(\"Packets Received = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].RxCount);\n\t\tprintk(\"Packets Sent = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].TxCount);\n\t\tprintk(\"Bytes Received = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].ReceivedByteCount);\n\t\tprintk(\"Byte Sent = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].TransmittedByteCount);\n\t\tprintk(\"Error Packets Received = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].RxErrorCount);\n\t\tprintk(\"Drop Received Packets = %ld\\n\", (ULONG)pAd->ApCfg.MBSSID[apidx].RxDropCount);\n\t\t\n#ifdef WSC_INCLUDED\n\t\tif (pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE)\n\t\t{\n\t\t\tWSC_CTRL *pWscCtrl;\n\n\t\t\tpWscCtrl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tprintk(\"WscInfo:\\n\"\n\t\t\t\t\t\"\\tWscConfMode=%d\\n\"\n\t\t\t\t\t\"\\tWscMode=%s\\n\"\n\t\t\t\t\t\"\\tWscConfStatus=%d\\n\"\n\t\t\t\t\t\"\\tWscPinCode=%d\\n\"\n\t\t\t\t\t\"\\tWscState=0x%x\\n\"\n\t\t\t\t\t\"\\tWscStatus=0x%x\\n\",\n\t\t\t\t\tpWscCtrl->WscConfMode, \n\t\t\t\t\t((pWscCtrl->WscMode == WSC_PIN_MODE) ? \"PIN\" : \"PBC\"),\n\t\t\t\t\tpWscCtrl->WscConfStatus, pWscCtrl->WscEnrolleePinCode, \n\t\t\t\t\tpWscCtrl->WscState, pWscCtrl->WscStatus);\t\n\t\t}\n#endif /* WSC_INCLUDED */\n\n\t\tprintk(\"-- IF-ra%d end -- \\n\", apidx);\n\t}\n}\n\n{\n\tint i, j, k, maxMcs = MAX_MCS_SET - 1;\n\tPMAC_TABLE_ENTRY pEntry;\n\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\n\t\t\tprintk(\"\\n%02X:%02X:%02X:%02X:%02X:%02X - \",\n\t\t\t\t   pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\t   pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\\n\", (int)pEntry->Aid);\n\n\t\t\tfor (j=maxMcs; j>=0; j--)\n\t\t\t{\n\t\t\t\tif ((pEntry->TXMCSExpected[j] != 0) || (pEntry->TXMCSFailed[j] !=0))\n\t\t\t\t{\n\t\t\t\t\tprintk(\"MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\\n\",\n\t\t\t\t\t\t   j, pEntry->TXMCSExpected[j], pEntry->TXMCSSuccessful[j], \n\t\t\t\t\t\t   pEntry->TXMCSExpected[j] ? (100*pEntry->TXMCSSuccessful[j])/pEntry->TXMCSExpected[j] : 0,\n\t\t\t\t\t\t   pEntry->TXMCSFailed[j]);\n\t\t\t\t\tfor(k=maxMcs; k>=0; k--)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEntry->TXMCSAutoFallBack[j][k] != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprintk(\"\\t\\t\\tAutoMCS[%02d]: %u (%d%%)\\n\", k, pEntry->TXMCSAutoFallBack[j][k],\n\t\t\t\t\t\t\t\t   (100*pEntry->TXMCSAutoFallBack[j][k])/pEntry->TXMCSExpected[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n#ifdef DOT11_N_SUPPORT\n{\n\tTX_NAG_AGG_CNT_STRUC\tTxAggCnt;\n\tTX_AGG_CNT0_STRUC\tTxAggCnt0;\n\tTX_AGG_CNT1_STRUC\tTxAggCnt1;\n\tTX_AGG_CNT2_STRUC\tTxAggCnt2;\n\tTX_AGG_CNT3_STRUC\tTxAggCnt3;\t\n\tUINT32\t\t\t\ttotalCount;\n\t\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);\n\n\ttotalCount = TxAggCnt.field.NonAggTxCount + TxAggCnt.field.AggTxCount;\n\tprintk(\"Tx_Agg_Cnt->NonAggTxCount=%d!,  AggTxCount=%d!\\n\", TxAggCnt.field.NonAggTxCount, TxAggCnt.field.AggTxCount);\n\tprintk(\"\\tTx_Agg_Cnt 1 MPDU=%d(%d%%)!\\n\", TxAggCnt0.field.AggSize1Count, TxAggCnt0.field.AggSize1Count ? (TxAggCnt0.field.AggSize1Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 2 MPDU=%d(%d%%)!\\n\", TxAggCnt0.field.AggSize2Count, TxAggCnt0.field.AggSize2Count ? (TxAggCnt0.field.AggSize2Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 3 MPDU=%d(%d%%)!\\n\", TxAggCnt1.field.AggSize3Count, TxAggCnt1.field.AggSize3Count ? (TxAggCnt1.field.AggSize3Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 4 MPDU=%d(%d%%)!\\n\", TxAggCnt1.field.AggSize4Count, TxAggCnt1.field.AggSize4Count ? (TxAggCnt1.field.AggSize4Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 5 MPDU=%d(%d%%)!\\n\", TxAggCnt2.field.AggSize5Count, TxAggCnt2.field.AggSize5Count ? (TxAggCnt2.field.AggSize5Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 6 MPDU=%d(%d%%)!\\n\", TxAggCnt2.field.AggSize6Count, TxAggCnt2.field.AggSize6Count ? (TxAggCnt2.field.AggSize6Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 7 MPDU=%d(%d%%)!\\n\", TxAggCnt3.field.AggSize7Count, TxAggCnt3.field.AggSize7Count ? (TxAggCnt3.field.AggSize7Count * 100 / totalCount) : 0);\n\tprintk(\"\\tTx_Agg_Cnt 8 MPDU=%d(%d%%)!\\n\", TxAggCnt3.field.AggSize8Count, (TxAggCnt3.field.AggSize8Count ? (TxAggCnt3.field.AggSize8Count * 100 / totalCount) : 0));\n\tprintk(\"====================\\n\");\n\t\n}\n#endif /* DOT11_N_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n\nINT\tShow_Sat_Reset_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t/* Sanity check for calculation of sucessful count */\n\n\tprintk(\"TransmittedFragmentCount = %d\\n\", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart);\n\tprintk(\"MulticastTransmittedFrameCount = %d\\n\", pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart);\n\tprintk(\"FailedCount = %d\\n\", pAd->WlanCounters.FailedCount.u.LowPart);\n\tprintk(\"RetryCount = %d\\n\", pAd->WlanCounters.RetryCount.u.LowPart);\n\tprintk(\"MultipleRetryCount = %d\\n\", pAd->WlanCounters.MultipleRetryCount.u.LowPart);\n\tprintk(\"RTSSuccessCount = %d\\n\", pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n\tprintk(\"RTSFailureCount = %d\\n\", pAd->WlanCounters.RTSFailureCount.u.LowPart);\n\tprintk(\"ACKFailureCount = %d\\n\", pAd->WlanCounters.ACKFailureCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\tprintk(\"ReceivedFragmentCount = %d\\n\", pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);\n\tprintk(\"MulticastReceivedFrameCount = %d\\n\", pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart);\n#ifdef DBG \t\t\n\tprintk(\"RealFcsErrCount = %d\\n\", pAd->RalinkCounters.RealFcsErrCount.u.LowPart);\n#else\n\tprintk(\"FCSErrorCount = %d\\n\", pAd->WlanCounters.FCSErrorCount.u.LowPart);\n\tprintk(\"FrameDuplicateCount.LowPart = %d\\n\", pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100);\n#endif\n\tprintk(\"TransmittedFrameCount = %d\\n\", pAd->WlanCounters.TransmittedFrameCount.u.LowPart);\n\tprintk(\"WEPUndecryptableCount = %d\\n\", pAd->WlanCounters.WEPUndecryptableCount.u.LowPart);\n\n\tpAd->WlanCounters.TransmittedFragmentCount.u.LowPart = 0;\n\tpAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart = 0;\n\tpAd->WlanCounters.FailedCount.u.LowPart = 0;\n\tpAd->WlanCounters.RetryCount.u.LowPart = 0;\n\tpAd->WlanCounters.MultipleRetryCount.u.LowPart = 0;\n\tpAd->WlanCounters.RTSSuccessCount.u.LowPart = 0;\n\tpAd->WlanCounters.RTSFailureCount.u.LowPart = 0;\n\tpAd->WlanCounters.ACKFailureCount.u.LowPart = 0;\n\tpAd->WlanCounters.FrameDuplicateCount.u.LowPart = 0;\n\tpAd->WlanCounters.ReceivedFragmentCount.u.LowPart = 0;\n\tpAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart = 0;\n#ifdef DBG \t\t\n\tpAd->RalinkCounters.RealFcsErrCount.u.LowPart = 0;\n#else\n\tpAd->WlanCounters.FCSErrorCount.u.LowPart = 0;\n\tpAd->WlanCounters.FrameDuplicateCount.u.LowPart = 0;\n#endif\n\tpAd->WlanCounters.TransmittedFrameCount.u.LowPart = 0;\n\tpAd->WlanCounters.WEPUndecryptableCount.u.LowPart = 0;\n\n\n{\n\tint i, j, k;\n\tPMAC_TABLE_ENTRY pEntry;\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\n\t\t\tprintk(\"\\n%02X:%02X:%02X:%02X:%02X:%02X - \",\n\t\t\t\t   pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\t   pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tprintk(\"%-4d\\n\", (int)pEntry->Aid);\n\n\t\t\tfor (j=15; j>=0; j--)\n\t\t\t{\n\t\t\t\tif ((pEntry->TXMCSExpected[j] != 0) || (pEntry->TXMCSFailed[j] !=0))\n\t\t\t\t{\n\t\t\t\t\tprintk(\"MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\\n\",\n\t\t\t\t\t\t   j, pEntry->TXMCSExpected[j], pEntry->TXMCSSuccessful[j], \n\t\t\t\t\t\t   pEntry->TXMCSExpected[j] ? (100*pEntry->TXMCSSuccessful[j])/pEntry->TXMCSExpected[j] : 0,\n\t\t\t\t\t\t   pEntry->TXMCSFailed[j]\n\t\t\t\t\t\t   );\n\t\t\t\t\tfor(k=15; k>=0; k--)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEntry->TXMCSAutoFallBack[j][k] != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprintk(\"\\t\\t\\tAutoMCS[%02d]: %u (%d%%)\\n\", k, pEntry->TXMCSAutoFallBack[j][k],\n\t\t\t\t\t\t\t\t   (100*pEntry->TXMCSAutoFallBack[j][k])/pEntry->TXMCSExpected[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (j=0; j<16; j++)\n\t\t{\n\t\t\tpEntry->TXMCSExpected[j] = 0;\n\t\t\tpEntry->TXMCSSuccessful[j] = 0;\n\t\t\tpEntry->TXMCSFailed[j] = 0;\n\t\t\tfor(k=15; k>=0; k--)\n\t\t\t{\n\t\t\t\tpEntry->TXMCSAutoFallBack[j][k] = 0;\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef DOT11_N_SUPPORT\n{\n\tTX_NAG_AGG_CNT_STRUC\tTxAggCnt;\n\tTX_AGG_CNT0_STRUC\tTxAggCnt0;\n\tTX_AGG_CNT1_STRUC\tTxAggCnt1;\n\tTX_AGG_CNT2_STRUC\tTxAggCnt2;\n\tTX_AGG_CNT3_STRUC\tTxAggCnt3;\t\n\tUINT32\t\t\t\ttotalCount, ratio1, ratio2, ratio3, ratio4, ratio5, ratio6, ratio7, ratio8;\n\t\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);\n\n\ttotalCount = TxAggCnt.field.NonAggTxCount + TxAggCnt.field.AggTxCount;\n\tratio1 = TxAggCnt0.field.AggSize1Count ? (TxAggCnt0.field.AggSize1Count * 100 / totalCount) : 0;\n\tratio2 = TxAggCnt0.field.AggSize2Count ? (TxAggCnt0.field.AggSize2Count * 100 / totalCount) : 0;\n\tratio3 = TxAggCnt1.field.AggSize3Count ? (TxAggCnt1.field.AggSize3Count * 100 / totalCount) : 0;\n\tratio4 = TxAggCnt1.field.AggSize4Count ? (TxAggCnt1.field.AggSize4Count * 100 / totalCount) : 0;\n\tratio5 = TxAggCnt2.field.AggSize5Count ? (TxAggCnt2.field.AggSize5Count * 100 / totalCount) : 0;\n\tratio6 = TxAggCnt2.field.AggSize6Count ? (TxAggCnt2.field.AggSize6Count * 100 / totalCount) : 0;\n\tratio7 = TxAggCnt3.field.AggSize7Count ? (TxAggCnt3.field.AggSize7Count * 100 / totalCount) : 0;\n\tratio8 = TxAggCnt3.field.AggSize8Count ? (TxAggCnt3.field.AggSize8Count * 100 / totalCount) : 0;\n\n\tprintk(\"Tx_Agg_Cnt->NonAggTxCount=%d!,  AggTxCount=%d!\\n\", TxAggCnt.field.NonAggTxCount, TxAggCnt.field.AggTxCount);\n\tprintk(\"\\tTx_Agg_Cnt 1 MPDU=%d(%d%%)!\\n\", TxAggCnt0.field.AggSize1Count, ratio1);\n\tprintk(\"\\tTx_Agg_Cnt 2 MPDU=%d(%d%%)!\\n\", TxAggCnt0.field.AggSize2Count, ratio2);\n\tprintk(\"\\tTx_Agg_Cnt 3 MPDU=%d(%d%%)!\\n\", TxAggCnt1.field.AggSize3Count, ratio3);\n\tprintk(\"\\tTx_Agg_Cnt 4 MPDU=%d(%d%%)!\\n\", TxAggCnt1.field.AggSize4Count, ratio4);\n\tprintk(\"\\tTx_Agg_Cnt 5 MPDU=%d(%d%%)!\\n\", TxAggCnt2.field.AggSize5Count, ratio5);\n\tprintk(\"\\tTx_Agg_Cnt 6 MPDU=%d(%d%%)!\\n\", TxAggCnt2.field.AggSize6Count, ratio6);\n\tprintk(\"\\tTx_Agg_Cnt 7 MPDU=%d(%d%%)!\\n\", TxAggCnt3.field.AggSize7Count, ratio7);\n\tprintk(\"\\tTx_Agg_Cnt 8 MPDU=%d(%d%%)!\\n\", TxAggCnt3.field.AggSize8Count, ratio8);\n\tprintk(\"\\tRatio: 1(%d%%), 2(%d%%), 3(%d%%), 4(%d%%), 5(%d%%), 6(%d%%), 7(%d%%), 8(%d%%)!\\n\",\n\t\t\tratio1+ratio2+ratio3+ratio4+ratio5+ratio6+ratio7+ratio8,\n\t\t\tratio2+ratio3+ratio4+ratio5+ratio6+ratio7+ratio8,\n\t\t\tratio3+ratio4+ratio5+ratio6+ratio7+ratio8,\n\t\t\tratio4+ratio5+ratio6+ratio7+ratio8,\n\t\t\tratio5+ratio6+ratio7+ratio8,\n\t\t\tratio6+ratio7+ratio8,\n\t\t\tratio7+ratio8,\n\t\t\tratio8);\n\tprintk(\"====================\\n\");\n\t\n}\n#endif /* DOT11_N_SUPPORT */\n\n}\n\n\n\treturn TRUE;\n}\n\n\n#ifdef MAT_SUPPORT\nINT\tShow_MATTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\textern VOID dumpIPMacTb(MAT_STRUCT *pMatCfg, int index);\n\textern NDIS_STATUS dumpSesMacTb(MAT_STRUCT *pMatCfg, int hashIdx);\n\textern NDIS_STATUS dumpUidMacTb(MAT_STRUCT *pMatCfg, int hashIdx);\n\textern NDIS_STATUS dumpIPv6MacTb(MAT_STRUCT *pMatCfg, int hashIdx);\n\n\tdumpIPMacTb(&pAd->MatCfg, -1);\n\tdumpSesMacTb(&pAd->MatCfg, -1);\n\tdumpUidMacTb(&pAd->MatCfg, -1);\n\tdumpIPv6MacTb(&pAd->MatCfg, -1);\n\n\tprintk(\"Default BroadCast Address=%02x:%02x:%02x:%02x:%02x:%02x!\\n\", BROADCAST_ADDR[0], BROADCAST_ADDR[1],\n\t\t\tBROADCAST_ADDR[2], BROADCAST_ADDR[3], BROADCAST_ADDR[4], BROADCAST_ADDR[5]);\n\treturn TRUE;\n}\n#endif /* MAT_SUPPORT */\n\n\n#ifdef DOT1X_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        It only shall be queried by 802.1x daemon for querying radius configuration.        \n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlQueryRadiusConf(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tUCHAR\tapidx, srv_idx, keyidx, KeyLen = 0;\n\tUCHAR\t*mpool;\n\tPDOT1X_CMM_CONF\tpConf;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlQueryRadiusConf==>\\n\"));\n\t\n\t/* Allocate memory */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, sizeof(DOT1X_CMM_CONF));\t\n    if (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s: out of resource!!!\\n\", __FUNCTION__));\n        return;\n    }\n\tNdisZeroMemory(mpool, sizeof(DOT1X_CMM_CONF));\n\n\tpConf = (PDOT1X_CMM_CONF)mpool;\n\n\t/* get MBSS number */\n\tpConf->mbss_num = pAd->ApCfg.BssidNum;\n\n\t/* get own ip address */\n\tpConf->own_ip_addr = pAd->ApCfg.own_ip_addr;\n\n\t/* get retry interval */\n\tpConf->retry_interval = pAd->ApCfg.retry_interval;\n\n\t/* get session timeout interval */\n\tpConf->session_timeout_interval = pAd->ApCfg.session_timeout_interval;\n\n\t/* Get the quiet interval */\n\tpConf->quiet_interval = pAd->ApCfg.quiet_interval;\n\n\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tPMULTISSID_STRUCT \tpMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\tPDOT1X_BSS_INFO  \tp1xBssInfo = &pConf->Dot1xBssInfo[apidx];\n\t\n\t\tp1xBssInfo->radius_srv_num = pMbss->radius_srv_num;\n\t\n\t\t/* prepare radius ip, port and key */\n\t\tfor (srv_idx = 0; srv_idx < pMbss->radius_srv_num; srv_idx++)\n\t\t{\n\t\t\tif (pMbss->radius_srv_info[srv_idx].radius_ip != 0)\n\t\t\t{\n\t\t\t\tp1xBssInfo->radius_srv_info[srv_idx].radius_ip = pMbss->radius_srv_info[srv_idx].radius_ip;\n\t\t\t\tp1xBssInfo->radius_srv_info[srv_idx].radius_port = pMbss->radius_srv_info[srv_idx].radius_port;\n\t\t\t\tp1xBssInfo->radius_srv_info[srv_idx].radius_key_len = pMbss->radius_srv_info[srv_idx].radius_key_len;\n\t\t\t\tif (pMbss->radius_srv_info[srv_idx].radius_key_len > 0)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(p1xBssInfo->radius_srv_info[srv_idx].radius_key, \n\t\t\t\t\t\t\t\t\tpMbss->radius_srv_info[srv_idx].radius_key, \n\t\t\t\t\t\t\t\t\tpMbss->radius_srv_info[srv_idx].radius_key_len);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tp1xBssInfo->ieee8021xWEP = (pMbss->IEEE8021X) ? 1 : 0;\n\t\t\n\t\tif (p1xBssInfo->ieee8021xWEP)\n\t\t{\n\t\t\t/* Default Key index, length and material */\n\t\t\tkeyidx = pMbss->DefaultKeyId;\n\t\t\tp1xBssInfo->key_index = keyidx;\n\n\t\t\t/* Determine if the key is valid. */\n\t\t\tKeyLen = pAd->SharedKey[apidx][keyidx].KeyLen;\n\t\t\tif (KeyLen == 5 || KeyLen == 13)\n\t\t\t{\n\t\t\t\tp1xBssInfo->key_length = KeyLen;\n\t\t\t\tNdisMoveMemory(p1xBssInfo->key_material, pAd->SharedKey[apidx][keyidx].Key, KeyLen);\n\t\t\t}\n\t\t}\n\n\t\t/* Get NAS-ID per BSS */\n\t\tif (pMbss->NasIdLen > 0)\n\t\t{\n\t\t\tp1xBssInfo->nasId_len = pMbss->NasIdLen;\n\t\t\tNdisMoveMemory(p1xBssInfo->nasId, pMbss->NasId, pMbss->NasIdLen);\n\t\t}\n\n\t\t/* get EAPifname */\n\t\tif (pAd->ApCfg.EAPifname_len[apidx] > 0)\n\t\t{\n\t\t\tpConf->EAPifname_len[apidx] = pAd->ApCfg.EAPifname_len[apidx];\n\t\t\tNdisMoveMemory(pConf->EAPifname[apidx], pAd->ApCfg.EAPifname[apidx], pAd->ApCfg.EAPifname_len[apidx]);\n\t\t}\t\n\n\t\t/* get PreAuthifname */\n\t\tif (pAd->ApCfg.PreAuthifname_len[apidx] > 0)\n\t\t{\n\t\t\tpConf->PreAuthifname_len[apidx] = pAd->ApCfg.PreAuthifname_len[apidx];\n\t\t\tNdisMoveMemory(pConf->PreAuthifname[apidx], pAd->ApCfg.PreAuthifname[apidx], pAd->ApCfg.PreAuthifname_len[apidx]);\n\t\t}\t\n\n\t}\n\t\t\t\t\n\twrq->u.data.length = sizeof(DOT1X_CMM_CONF);\n\tif (copy_to_user(wrq->u.data.pointer, pConf, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n\tos_free_mem(NULL, mpool);\n\t\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlRadiusData(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif ((pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode == Ndis802_11AuthModeWPA) \n    \t|| (pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode == Ndis802_11AuthModeWPA2)\n    \t|| (pAd->ApCfg.MBSSID[pObj->ioctl_if].AuthMode == Ndis802_11AuthModeWPA1WPA2) \n    \t|| (pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X == TRUE))\n    \tWpaSend(pAd, (PUCHAR)wrq->u.data.pointer, wrq->u.data.length);\n}\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlAddWPAKey(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tNDIS_AP_802_11_KEY \t*pKey;\n\tULONG\t\t\t\tKeyIdx;\n\tMAC_TABLE_ENTRY  \t*pEntry;\n\tUCHAR\t\t\t\tapidx;\n\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tapidx =\t(UCHAR) pObj->ioctl_if;\n\t\t\n\n\tpKey = (PNDIS_AP_802_11_KEY) wrq->u.data.pointer;\n\n\tif (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t{\n\t\tif ((pKey->KeyLength == 32) || (pKey->KeyLength == 64))\n\t\t{\n\t\t\tif ((pEntry = MacTableLookup(pAd, pKey->addr)) != NULL)\n\t\t\t{\n\t\t\t\tINT\tk_offset = 0;\n\t\t\t\n\t\t\n\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].PMK, pKey->KeyMaterial + k_offset, 32);\t\t\t\t\n    \t        DBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Add PMK=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x....\\n\", apidx,\n            \tpAd->ApCfg.MBSSID[apidx].PMK[0],pAd->ApCfg.MBSSID[apidx].PMK[1],pAd->ApCfg.MBSSID[apidx].PMK[2],pAd->ApCfg.MBSSID[apidx].PMK[3],\n            \tpAd->ApCfg.MBSSID[apidx].PMK[4],pAd->ApCfg.MBSSID[apidx].PMK[5],pAd->ApCfg.MBSSID[apidx].PMK[6],pAd->ApCfg.MBSSID[apidx].PMK[7]));\n\t\t\t}\n\t\t}\n\t}\n\telse\t/* Old WEP stuff */\n\t{\n\t\tUCHAR\tCipherAlg;\n    \tPUCHAR\tKey;\n\n\t\tif(pKey->KeyLength > 16)\n\t\t\treturn;\n\t\t\n\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\n\t\tif (KeyIdx < 4)\n\t\t{\n\t\t\t/* it is a shared key */\n\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t{\n\t\t\t\tUINT8\tWcid;\n\t\t\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Set Group Key\\n\", apidx));\n\n\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = (UCHAR) KeyIdx;\t\t\t\t\t\t\t\t\n                     \n\t\t\t\t/* set key material and key length */\n\t\t\t\tif (pKey->KeyLength > 16)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Key length too long %d\\n\", apidx, pKey->KeyLength));\n\t\t\t\t\tpKey->KeyLength = 16;\n\t\t\t\t}\n\t\t\t\tpAd->SharedKey[apidx][KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(pAd->SharedKey[apidx][KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\n\t\t\t\t/* Set Ciper type */\n\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].CipherAlg = CIPHER_WEP64;\n\t\t\t\telse\n\t\t\t\t\tpAd->SharedKey[apidx][KeyIdx].CipherAlg = CIPHER_WEP128;\n\t\t\t\n    \t\t\tCipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n    \t\t\tKey = pAd->SharedKey[apidx][KeyIdx].Key;\n\n\t\t\t\t/* Set Group key material to Asic */\n\t\t\t\tAsicAddSharedKeyEntry(pAd, apidx, (UINT8)KeyIdx, &pAd->SharedKey[apidx][KeyIdx]);\n\t\t\n\t\t\t\t/* Get a specific WCID to record this MBSS key attribute */\n\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, apidx);\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, apidx,(UINT8)KeyIdx, \n\t\t\t\t\t\t\t\t\tCipherAlg, Wcid, SHAREDKEYTABLE);\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse\t/* For Pairwise key setting */\n\t\t\t{\n\t\t\t\tpEntry = MacTableLookup(pAd, pKey->addr);\n\n\t\t\t\tif (pEntry)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlAddWPAKey-IF(ra%d) : Set Pair-wise Key\\n\", apidx));\n\t\t\n\t\t\t\t\t/* set key material and key length */\n \t\t\t\t\tpEntry->PairwiseKey.KeyLen = (UCHAR)pKey->KeyLength;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\t\n\t\t\t\t\t/* set Cipher type */\n\t\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t\n\t\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\t\tAsicAddPairwiseKeyEntry(\n\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t(UCHAR)pEntry->Aid,\n                \t\t&pEntry->PairwiseKey);\n\n\t\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\t\t\t\t(UINT8)KeyIdx, \t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\tpEntry->Aid,\n\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlAddPMKIDCache(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tUCHAR\t\t\t\tapidx;\n\tNDIS_AP_802_11_KEY \t*pKey;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tapidx =\t(UCHAR) pObj->ioctl_if;\n\n\tpKey = (PNDIS_AP_802_11_KEY) wrq->u.data.pointer;\n    \n    if (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA2)\n\t{\n\t\tif(pKey->KeyLength == 32)\n\t\t{\n\t\t\tUCHAR\tdigest[80], PMK_key[20], macaddr[MAC_ADDR_LEN];\n\t\t\t\n\t\t\t/* Calculate PMKID */\n\t\t\tNdisMoveMemory(&PMK_key[0], \"PMK Name\", 8);\n\t\t\tNdisMoveMemory(&PMK_key[8], pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN);\n\t\t\tNdisMoveMemory(&PMK_key[14], pKey->addr, MAC_ADDR_LEN);\n\t\t\tRT_HMAC_SHA1(pKey->KeyMaterial, PMK_LEN, PMK_key, 20, digest, SHA1_DIGEST_SIZE);\n\n\t\t\tNdisMoveMemory(macaddr, pKey->addr, MAC_ADDR_LEN);\n\t\t\tRTMPAddPMKIDCache(pAd, apidx, macaddr, digest, pKey->KeyMaterial);\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPA2(pre-auth):(%02x:%02x:%02x:%02x:%02x:%02x)Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\tpKey->addr[0],pKey->addr[1],pKey->addr[2],pKey->addr[3],pKey->addr[4],pKey->addr[5],digest[0],digest[1],digest[2],digest[3],digest[4],digest[5]));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PMK =%02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\\n\",pKey->KeyMaterial[0],pKey->KeyMaterial[1],\n\t\t\t\tpKey->KeyMaterial[2],pKey->KeyMaterial[3],pKey->KeyMaterial[4],pKey->KeyMaterial[5],pKey->KeyMaterial[6],pKey->KeyMaterial[7]));\n\t\t}\n\t\telse\n            DBGPRINT(RT_DEBUG_ERROR, (\"Set::RT_OID_802_11_WPA2_ADD_PMKID_CACHE ERROR or is wep key \\n\"));\n\t}\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"<== RTMPIoctlAddPMKIDCache\\n\"));\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlStaticWepCopy(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tMAC_TABLE_ENTRY  *pEntry;\n\tUCHAR\tMacAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\tapidx;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\tapidx =\t(UCHAR) pObj->ioctl_if;\n\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlStaticWepCopy-IF(ra%d)\\n\", apidx));\n\n    if (wrq->u.data.length != sizeof(MacAddr))\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"RTMPIoctlStaticWepCopy: the length isn't match (%d)\\n\", wrq->u.data.length));\n        return;\n    }\n    else\n    {\n    \tUINT32 len;\n\t\t\n        len = copy_from_user(&MacAddr, wrq->u.data.pointer, wrq->u.data.length);    \n        pEntry = MacTableLookup(pAd, MacAddr);\n        if (!pEntry)\n        {\n            DBGPRINT(RT_DEBUG_ERROR, (\"RTMPIoctlStaticWepCopy: the mac address isn't match\\n\"));\n            return;\n        }\n        else\n        {\n            UCHAR\tKeyIdx;\n            \n            KeyIdx = pAd->ApCfg.MBSSID[apidx].DefaultKeyId;\n            \n            /*need to copy the default shared-key to pairwise key table for this entry in 802.1x mode */\n\t\t\tif (pAd->SharedKey[apidx][KeyIdx].KeyLen == 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: Can not get Default shared-key (index-%d)\\n\", KeyIdx));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n        \t{\n            \tpEntry->PairwiseKey.KeyLen = pAd->SharedKey[apidx][KeyIdx].KeyLen;\n            \tNdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[apidx][KeyIdx].Key, pEntry->PairwiseKey.KeyLen);\n            \tpEntry->PairwiseKey.CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;\n\n\t\t\t\t/* Add Pair-wise key to Asic */\n            \tAsicAddPairwiseKeyEntry(\n                \t\tpAd, \n                \t\t(UCHAR)pEntry->Aid,\n                \t\t&pEntry->PairwiseKey);\n\n\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\tpEntry->apidx, \n\t\t\t\t\t\t\t\t\t\t(UINT8)KeyIdx, \n                \t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\tpEntry->Aid, \n\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n        \t}\n\t\t\t\n        }\n\t}\n    return;\n}\n\n/* \n    ==========================================================================\n    Description:\n        UI should not call this function, it only used by 802.1x daemon\n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlSetIdleTimeout(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tMAC_TABLE_ENTRY  \t\t*pEntry;\t\n\tPDOT1X_IDLE_TIMEOUT\t\tpIdleTime;\n\t\t\n\tif (wrq->u.data.length != sizeof(DOT1X_IDLE_TIMEOUT))\n\t{\n        DBGPRINT(RT_DEBUG_ERROR, (\"%s : the length is mis-match\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpIdleTime = (PDOT1X_IDLE_TIMEOUT)wrq->u.data.pointer;\n\n\tif ((pEntry = MacTableLookup(pAd, pIdleTime->StaAddr)) == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"%s : the entry is empty\\n\", __FUNCTION__));\n        return;\n    }\n\telse\n\t{\n\t\tpEntry->NoDataIdleCount = 0;\n\t\tpEntry->StaIdleTimeout = pIdleTime->idle_timeout;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : Update Idle-Timeout(%d) from dot1x daemon\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__, pEntry->StaIdleTimeout));\n\t}\n\t\n\treturn;\n}\n#endif /* DOT1X_SUPPORT */\n\n#ifdef DBG\n/* \n    ==========================================================================\n    Description:\n        Read / Write BBP\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 bbp               ==> read all BBP\n               2.) iwpriv ra0 bbp 1             ==> read BBP where RegID=1\n               3.) iwpriv ra0 bbp 1=10\t\t    ==> write BBP R1=0x10\n    ==========================================================================\n*/\nVOID RTMPAPIoctlBBP(\n\tIN RTMP_ADAPTER *pAdapter,\n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tUCHAR\t\t\t\tregBBP = 0;\n\tPSTRING\t\t\t\tmpool, msg; /*msg[2048]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tINT\t\t\t\t\tbbpId;\n\tLONG\t\t\t\tbbpValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllBBP = FALSE, bAllowDump, bCopyMsg;\n\tINT\t\t\t\t\targLen, Status;\n\n\n\n/*\tmpool = (PSTRING)kmalloc(sizeof(CHAR)*(MAX_BBP_MSG_SIZE+256+12), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(MAX_BBP_MSG_SIZE+256+12));\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(mpool, MAX_BBP_MSG_SIZE+256+12);\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+MAX_BBP_MSG_SIZE+3) & (ULONG)~0x03);\n\n\tbAllowDump = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NODUMPMSG) == RTPRIV_IOCTL_FLAG_NODUMPMSG) ? FALSE : TRUE;\n\tbCopyMsg = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NOSPACE) == RTPRIV_IOCTL_FLAG_NOSPACE) ? FALSE : TRUE;\n\targLen = strlen((char *)(wrq->u.data.pointer));\n\n\n\tif (argLen > 1)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (argLen > 255) ? 255 : argLen);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\t\t\t\tif (sscanf(this_char, \"%d\", &(bbpId)) == 1)\n\t\t\t\t{\n\t\t\t\t\tif (bbpId <= pAdapter->chipCap.MaxNumOfBbpId)\n\t\t\t\t\t{\n#ifdef RALINK_ATE\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tIn RT2860 ATE mode, we do not load 8051 firmware.\n\t\t\t\t\t\t\tWe must access BBP directly.\n\t\t\t\t\t\t\tFor RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tif (ATE_ON(pAdapter))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\t/* Sync with QA for comparation */\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"%03d = %02X\\n\", bbpId, regBBP);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t\t\t\t/* the command bbp shall read BBP register directly for dubug. */\n\t\t\t\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02x]:%02X  \", bbpId, bbpId, regBBP);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /*Write */\n\t\t\t\tif ((sscanf(this_char, \"%d\", &(bbpId)) == 1) && (sscanf(value, \"%lx\", &(bbpValue)) == 1))\n\t\t\t\t{\n\t\t\t\t\tif (bbpId <= pAdapter->chipCap.MaxNumOfBbpId)\n\t\t\t\t\t{\n#ifdef RALINK_ATE\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tIn RT2860 ATE mode, we do not load 8051 firmware.\n\t\t\t\t\t\t\tWe must access BBP directly.\n\t\t\t\t\t\t\tFor RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tif (ATE_ON(pAdapter))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue);\n\n\t\t\t\t\t\t\t/*Read it back for showing */\n\t\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\t/* Sync with QA for comparation */\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"%03d = %02X\\n\", bbpId, regBBP);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t\t\t\t/* the command bbp shall read/write BBP register directly for dubug. */\n\t\t\t\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tBBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue);\n\t\t\t\t\t\t\t/*Read it back for showing */\n\t\t\t\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02X]:%02X\\n\", bbpId, bbpId, regBBP);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\t\n\t\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\tbIsPrintAllBBP = TRUE;\n\n\tif (bIsPrintAllBBP)\n\t{\n\t\tmemset(msg, 0x00, MAX_BBP_MSG_SIZE);\n\t\tsprintf(msg, \"\\n\");\n\t\tfor (bbpId = 0; bbpId <= pAdapter->chipCap.MaxNumOfBbpId; bbpId++)\n\t\t{\n#ifdef RALINK_ATE\n\t\t\t/*\n\t\t\t\tIn RT2860 ATE mode, we do not load 8051 firmware.\n\t\t\t\tWe must access BBP directly.\n\t\t\t\tFor RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.\n\t\t\t*/\n\t\t\tif (ATE_ON(pAdapter))\n\t\t\t{\n\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\t/* Sync with QA for comparation */\n\t\t\t\tsprintf(msg+strlen(msg), \"%03d = %02X\\n\", bbpId, regBBP);\n\t\t\t}\n\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\t{\n\t\t\t\t/* according to Andy, Gary, David require. */\n\t\t\t\t/* the command bbp shall read/write BBP register directly for dubug. */\n\t\t\t\tBBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);\n\t\t\t\tsprintf(msg+strlen(msg), \"R%02d[0x%02X]:%02X    \", bbpId, bbpId, regBBP);\n\t\t\t\tif (bbpId%5 == 4)\n\t\t\t\t\tsprintf(msg+strlen(msg), \"\\n\");\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t}\n\n\tif (bCopyMsg)\n\t{\n\t\t/* Copy the information into the user buffer */\n\t\twrq->u.data.length = strlen(msg);\n\t\tStatus = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\t}\n\n\tif (!bAllowDump)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"strlen(msg)=%d\\n\", (UINT32)strlen(msg)));\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\\n\", msg));\n\t}\n\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n\tif (!bAllowDump)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlBBP\\n\\n\"));\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Read / Write MAC\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 mac 0        ==> read MAC where Addr=0x0\n               2.) iwpriv ra0 mac 0=12     ==> write MAC where Addr=0x0, value=12\n    ==========================================================================\n*/\nVOID RTMPAPIoctlMAC(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\tj = 0, k = 0;\n\tPSTRING\t\t\t\tmpool, msg; /*msg[1024]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tUINT32\t\t\t\tmacAddr = 0;\n\tUCHAR\t\t\t\ttemp[16];\n\tSTRING\t\t\t\ttemp2[16];\n\tUINT32\t\t\t\tmacValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllMAC = FALSE, bFromUI;\n\n\n/*\tmpool = (PSTRING)kmalloc(sizeof(CHAR)*(4096+256+12), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(4096+256+12));\n\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tbFromUI = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_UI) == RTPRIV_IOCTL_FLAG_UI) ? TRUE : FALSE;\n\t\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+4096+3) & (ULONG)~0x03);\n\n\tmemset(msg, 0x00, 4096);\n\tmemset(arg, 0x00, 256);\t\n\tif ((wrq->u.data.length > 1) /*No parameters. */\n\t\t)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\t\t\t\t/* Sanity check */\n\t\t\t\tif(strlen(this_char) > 4)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\t/* Mac Addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\tif(strlen(this_char) == 4)\n\t\t\t\t{\n\t\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\t\tmacAddr = *temp*256 + temp[1];\t\t\t\t\t\n\t\t\t\t\tif (macAddr < 0xFFFF)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMP_IO_READ32(pAdapter, macAddr, &macValue);\n\t\t\t\t\t\tif (!bFromUI)\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacAddr=0x%x, MacValue=0x%x\\n\", macAddr, macValue));\n\t\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%08x]:%08x  \", macAddr , macValue);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /*Write */\n\t\t\t\tNdisMoveMemory(&temp2, value, strlen(value));\n\t\t\t\ttemp2[strlen(value)] = '\\0';\n\n\t\t\t\t/* Sanity check */\n\t\t\t\tif((strlen(this_char) > 4) || strlen(temp2) > 8)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\tj = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(temp2[j] > 'f' || temp2[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\t/*MAC Addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\t/*MAC value */\n\t\t\t\tk = j = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\ttemp2[8-k+j] = temp2[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 8)\n\t\t\t\t\ttemp2[7-k++]='0';\n\t\t\t\ttemp2[8]='\\0';\n\n\t\t\t\t{\n\t\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\t\tmacAddr = *temp*256 + temp[1];\n\n\t\t\t\t\tAtoH(temp2, temp, 4);\n\t\t\t\t\tmacValue = *temp*256*256*256 + temp[1]*256*256 + temp[2]*256 + temp[3];\n\n\t\t\t\t\t/* debug mode */\n\t\t\t\t\tif (macAddr == (HW_DEBUG_SETTING_BASE + 4))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* 0x2bf4: byte0 non-zero: enable R66 tuning, 0: disable R66 tuning */\n                        if (macValue & 0x000000ff) \n                        {\n                            pAdapter->BbpTuning.bEnable = TRUE;\n                            DBGPRINT(RT_DEBUG_TRACE, (\"turn on R17 tuning\\n\"));\n                        }\n                        else\n                        {\n                            UCHAR R66;\n                            pAdapter->BbpTuning.bEnable = FALSE;\n                            R66 = 0x26 + GET_LNA_GAIN(pAdapter);\n                            /* todo rtmp_bbp_set_agc(pAd, R66, RX_CHAIN_ALL); */\n\t\t\t\tif (!bFromUI)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"turn off R66 tuning, restore to 0x%02x\\n\", R66));\n                        }\n\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t    if (!bFromUI)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacAddr=%02x, MacValue=0x%x\\n\", macAddr, macValue));\n\t\t\t\t\t\n\t\t\t\t\tRTMP_IO_WRITE32(pAdapter, macAddr, macValue);\n\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%08x]:%08x  \", macAddr, macValue);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tUINT32 IdMac, mac_s = 0x1000;\n\n#if defined(RT65xx) || defined (MT7601)\n\t\tif (IS_RT65XX(pAdapter) || IS_MT7601(pAdapter))\n\t\t\tmac_s = 0x0;\n#endif /* defined(RT65xx) || defined (MT7601) */\n\t\tfor(IdMac = mac_s; IdMac < 0x1700; IdMac += 4)\n\t\t{\n\t\t\tif ((IdMac & 0x0f) == 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n0x%04x: \", IdMac));\n\t\t\t}\n\n\t\t\tRTMP_IO_READ32(pAdapter, IdMac, &macValue);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%08x \", macValue));\n\t\t}\n\n\t\tbIsPrintAllMAC = TRUE;\n\t}\n\n\t\n\tif(strlen(msg) == 1)\n\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\t\n#ifdef LINUX\n\t/* Copy the information into the user buffer */\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t}\n#endif /* LINUX */\n\n\n\n\ndone:\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n\tif (!bFromUI)\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlMAC\\n\\n\"));\n}\n\n\n#endif /*#ifdef DBG */\n\n/* \n    ==========================================================================\n    Description:\n        Read / Write E2PROM\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 e2p 0     \t==> read E2PROM where Addr=0x0\n               2.) iwpriv ra0 e2p 0=1234    ==> write E2PROM where Addr=0x0, value=1234\n    ==========================================================================\n*/\nVOID RTMPAPIoctlE2PROM(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\tj = 0, k = 0;\n\tPSTRING\t\t\t\tmpool, msg;/*msg[1024]; */\n\tPSTRING\t\t\t\targ; /*arg[255]; */\n\tPSTRING\t\t\t\tptr;\n\tUSHORT\t\t\t\teepAddr = 0;\n\tUCHAR\t\t\t\ttemp[16];\n\tSTRING\t\t\t\ttemp2[16];\n\tUSHORT\t\t\t\teepValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllE2PROM = FALSE;\n\n/*\tmpool = (PSTRING)kmalloc(sizeof(CHAR)*(4096+256+12), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(4096+256+12));\n\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+4096+3) & (ULONG)~0x03);\n\n\n\tmemset(msg, 0x00, 4096);\n\tmemset(arg, 0x00, 256);\t\t\n\tif ((wrq->u.data.length > 1) /*No parameters. */\n\t\t)\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t\t/*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\t\tif (!*this_char)\n\t\t\t\tcontinue;\n\n\t\t\tif ((value = strchr(this_char, '=')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif (!value || !*value)\n\t\t\t{ /*Read */\n\n\t\t\t\t/* Sanity check */\n\t\t\t\tif(strlen(this_char) > 4)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\t/* E2PROM addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\tif(strlen(this_char) == 4)\n\t\t\t\t{\n\t\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\t\teepAddr = *temp*256 + temp[1];\t\t\t\t\t\n\t\t\t\t\tif (eepAddr < 0xFFFF)\n\t\t\t\t\t{\n\t\t\t\t\t\tRT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);\n\t\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%04X]:0x%04X  \", eepAddr , eepValue);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{ /*Write */\n\t\t\t\tNdisMoveMemory(&temp2, value, strlen(value));\n\t\t\t\ttemp2[strlen(value)] = '\\0';\n\n\t\t\t\t/* Sanity check */\n\t\t\t\tif((strlen(this_char) > 4) || strlen(temp2) > 8)\n\t\t\t\t\tbreak;\n\n\t\t\t\tj = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\t\t\t\tj = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tif(temp2[j] > 'f' || temp2[j] < '0')\n\t\t\t\t\t\tgoto done; /*return; */\n\t\t\t\t}\n\n\t\t\t\t/*MAC Addr */\n\t\t\t\tk = j = strlen(this_char);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t\t}\n\n\t\t\t\twhile(k < 4)\n\t\t\t\t\tthis_char[3-k++]='0';\n\t\t\t\tthis_char[4]='\\0';\n\n\t\t\t\t/*MAC value */\n\t\t\t\tk = j = strlen(temp2);\n\t\t\t\twhile(j-- > 0)\n\t\t\t\t{\n\t\t\t\t\ttemp2[4-k+j] = temp2[j];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(k < 4)\n\t\t\t\t\ttemp2[3-k++]='0';\n\t\t\t\ttemp2[4]='\\0';\n\n\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\teepAddr = *temp*256 + temp[1];\n\n\t\t\t\tAtoH(temp2, temp, 2);\n\t\t\t\teepValue = *temp*256 + temp[1];\n\n\t\t\t\tRT28xx_EEPROM_WRITE16(pAdapter, eepAddr, eepValue);\n\t\t\t\tsprintf(msg+strlen(msg), \"[0x%02X]:%02X  \", eepAddr, eepValue);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tbIsPrintAllE2PROM = TRUE;\n\t}\n\n\tif (bIsPrintAllE2PROM)\n\t{\n\t\tsprintf(msg, \"\\n\");\n\t\t\n\t\t/* E2PROM Registers */\n\t\tfor (eepAddr = 0x00; eepAddr < 0x200; eepAddr += 2)\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);\n\t\t\tsprintf(msg+strlen(msg), \"[0x%04X]:%04X  \", eepAddr , eepValue);\n\t\t\tif ((eepAddr & 0x7) == 0x7)\n\t\t\t\tsprintf(msg+strlen(msg), \"\\n\");\n\t\t}\n\t}\n\n\tif(strlen(msg) == 1)\n\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\n\t/* Copy the information into the user buffer */\n\n\tAP_E2PROM_IOCTL_PostCtrl(wrq, msg);\n\ndone:\t\n/*\tkfree(mpool); */\n\tos_free_mem(NULL, mpool);\n    if (wrq->u.data.flags != RT_OID_802_11_HARDWARE_REGISTER)\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlE2PROM\\n\"));\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Read statistics counter\nArguments:\n    pAdapter                    Pointer to our adapter\n    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 stat 0     \t==> Read statistics counter\n    ==========================================================================\n*/\nVOID RTMPIoctlStatistics(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tINT\t\t\t\t\tStatus;\n\tPSTRING             msg;\n#ifdef WSC_AP_SUPPORT\n    UCHAR               idx = 0;\n#endif /* WSC_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\tPOS_COOKIE  \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* P2P_SUPPORT */\n\n/*\tmsg = (PSTRING)kmalloc(sizeof(CHAR)*(2048), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));\n\tif (msg == NULL) {\n\t\treturn;\n\t}\n\n\n    memset(msg, 0x00, 1600);\n    sprintf(msg, \"\\n\");\n\n#ifdef RALINK_ATE\n\tif(ATE_ON(pAd))\n\t{\n\t    sprintf(msg+strlen(msg), \"Tx success                    = %ld\\n\", (ULONG)pAd->ate.TxDoneCount);\n\t    /*sprintf(msg+strlen(msg), \"Tx success without retry        = %ld\\n\", (ULONG)pAd->ate.TxDoneCount); */\n\t}\n\telse\n#endif /* RALINK_ATE */\n\t{\n    sprintf(msg+strlen(msg), \"Tx success                        = %ld\\n\", (ULONG)pAd->WlanCounters.TransmittedFragmentCount.u.LowPart);\n    /*sprintf(msg+strlen(msg), \"Tx success without retry        = %ld\\n\", (ULONG)pAd->WlanCounters.TransmittedFragmentCount.u.LowPart - (ULONG)pAd->WlanCounters.RetryCount.u.LowPart); */\n\t}\n    sprintf(msg+strlen(msg), \"Tx retry count                  = %ld\\n\", (ULONG)pAd->WlanCounters.RetryCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"Tx fail to Rcv ACK after retry  = %ld\\n\", (ULONG)pAd->WlanCounters.FailedCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"RTS Success Rcv CTS             = %ld\\n\", (ULONG)pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"RTS Fail Rcv CTS                = %ld\\n\", (ULONG)pAd->WlanCounters.RTSFailureCount.u.LowPart);\n\n    sprintf(msg+strlen(msg), \"Rx success                      = %ld\\n\", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart);\n    sprintf(msg+strlen(msg), \"Rx with CRC                     = %ld\\n\", (ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart);\n    sprintf(msg+strlen(msg), \"Rx drop due to out of resource  = %ld\\n\", (ULONG)pAd->Counters8023.RxNoBuffer);\n    sprintf(msg+strlen(msg), \"Rx duplicate frame              = %ld\\n\", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\n    sprintf(msg+strlen(msg), \"False CCA (one second)          = %ld\\n\", (ULONG)pAd->RalinkCounters.OneSecFalseCCACnt);\n\n#ifdef RALINK_ATE\n\tif(ATE_ON(pAd))\n\t{\n\t\tif (pAd->ate.RxAntennaSel == 0)\n\t\t{\n    \t\tsprintf(msg+strlen(msg), \"RSSI-A                          = %ld\\n\", (LONG)(pAd->ate.LastRssi0 - pAd->BbpRssiToDbmDelta));\n\t\t\tsprintf(msg+strlen(msg), \"RSSI-B (if available)           = %ld\\n\", (LONG)(pAd->ate.LastRssi1 - pAd->BbpRssiToDbmDelta));\n\t\t\tsprintf(msg+strlen(msg), \"RSSI-C (if available)           = %ld\\n\\n\", (LONG)(pAd->ate.LastRssi2 - pAd->BbpRssiToDbmDelta));\n\t\t}\n\t\telse\n\t\t{\n    \t\tsprintf(msg+strlen(msg), \"RSSI                            = %ld\\n\", (LONG)(pAd->ate.LastRssi0 - pAd->BbpRssiToDbmDelta));\n\t\t}\n\t}\n\telse\n#endif /* RALINK_ATE */\n\t{\n    \tsprintf(msg+strlen(msg), \"RSSI-A                          = %ld\\n\", (LONG)(pAd->ApCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta));\n\t\tsprintf(msg+strlen(msg), \"RSSI-B (if available)           = %ld\\n\", (LONG)(pAd->ApCfg.RssiSample.LastRssi1 - pAd->BbpRssiToDbmDelta));\n\t\tsprintf(msg+strlen(msg), \"RSSI-C (if available)           = %ld\\n\\n\", (LONG)(pAd->ApCfg.RssiSample.LastRssi2 - pAd->BbpRssiToDbmDelta));\n\t}\n\n#ifdef WSC_AP_SUPPORT\n\tsprintf(msg+strlen(msg), \"WPS Information:\\n\");\n#ifdef P2P_SUPPORT\n\tif (pObj->ioctl_if_type == INT_P2P)\n\t{\n\t\tif (pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCodeLen == 8)\n\t\t\tsprintf(msg+strlen(msg), \"P2P Client PinCode               %08u\\n\", \n\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);\n\t\telse\n\t\t\tsprintf(msg+strlen(msg), \"P2P Client PinCode               %04u\\n\", \n\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);\n\t\tsprintf(msg+strlen(msg), \"P2P Client WPS Profile Count     = %d\\n\", \n\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[0].WscControl.WscProfile.ProfileCnt);\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n\t\tfor (idx = 0; idx < pAd->ApCfg.BssidNum; idx++)\n\t\t{\n\t\t\t/* display pin code */\n\t\t\tif (pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCodeLen == 8)\n\t\t\t\tsprintf(msg+strlen(msg), \"Enrollee PinCode(ra%d)           %08u\\n\", idx, pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCode);\n\t\t\telse\n\t\t\t\tsprintf(msg+strlen(msg), \"Enrollee PinCode(ra%d)           %04u\\n\", idx, pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCode);\n\t\t}\n\t}\n#ifdef APCLI_SUPPORT\n    sprintf(msg+strlen(msg), \"\\n\");\n\tif (pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCodeLen == 8)\n\t\tsprintf(msg+strlen(msg), \"Enrollee PinCode(ApCli0)        %08u\\n\", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);\n\telse\n\t\tsprintf(msg+strlen(msg), \"Enrollee PinCode(ApCli0)        %04u\\n\", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);\n    sprintf(msg+strlen(msg), \"Ap Client WPS Profile Count     = %d\\n\", pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.ProfileCnt);\n    for (idx = 0; idx < pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.ProfileCnt ; idx++)\n    {\n        PWSC_CREDENTIAL pCredential = &pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.Profile[idx];\n        sprintf(msg+strlen(msg), \"Profile[%d]:\\n\", idx);        \n        sprintf(msg+strlen(msg), \"SSID                            = %s\\n\", pCredential->SSID.Ssid);\n        sprintf(msg+strlen(msg), \"AuthType                        = %s\\n\", WscGetAuthTypeStr(pCredential->AuthType));\n        sprintf(msg+strlen(msg), \"EncrypType                      = %s\\n\", WscGetEncryTypeStr(pCredential->EncrType)); \n        sprintf(msg+strlen(msg), \"KeyIndex                        = %d\\n\", pCredential->KeyIndex);\n        if (pCredential->KeyLength != 0)\n        {\n            sprintf(msg+strlen(msg), \"Key                             = %s\\n\", pCredential->Key);\n        }\n    }\n    sprintf(msg+strlen(msg), \"\\n\");\n#endif /* APCLI_SUPPORT */\n#endif /* WSC_AP_SUPPORT */\n\tsprintf(msg+strlen(msg), \"P2P Information:\\n\");\n\tsprintf(msg+strlen(msg), \"My Rule                         = %s\\n\", decodeMyRule(pAd->P2pCfg.Rule));\n\tsprintf(msg+strlen(msg), \"Listen Channel                  = %d\\n\", pAd->P2pCfg.ListenChannel);\n\tsprintf(msg+strlen(msg), \"WPS Config Method               = %s\\n\", decodeConfigMethod(pAd->P2pCfg.ConfigMethod));\n\tsprintf(msg+strlen(msg), \"Peer PinCode                    = %c%c%c%c%c%c%c%c\\n\", pAd->P2pCfg.PinCode[0], pAd->P2pCfg.PinCode[1], pAd->P2pCfg.PinCode[2], pAd->P2pCfg.PinCode[3],\n\t\t\t\tpAd->P2pCfg.PinCode[4], pAd->P2pCfg.PinCode[5], pAd->P2pCfg.PinCode[6], pAd->P2pCfg.PinCode[7]);\n\n    /* Copy the information into the user buffer */\n    wrq->u.data.length = strlen(msg);\n    Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\n\tos_free_mem(NULL, msg);\n/*\tkfree(msg); */\n    DBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlStatistics\\n\"));\n}\n\n\n#ifdef DOT11_N_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Get Block ACK Table\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage:\n        \t\t1.) iwpriv ra0 get_ba_table\n        \t\t3.) UI needs to prepare at least 4096bytes to get the results\n    ==========================================================================\n*/\nVOID RTMPIoctlQueryBaTable(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\t/*char *msg; */\n\tUCHAR\tTotalEntry, i, j, index;\n\tQUERYBA_TABLE\t\t*BAT;\n\n\tBAT = vmalloc(sizeof(QUERYBA_TABLE));\n\n\tRTMPZeroMemory(BAT, sizeof(QUERYBA_TABLE));\n\n\tTotalEntry = pAd->MacTab.Size;\n\tindex = 0;\n\tfor (i=0; ((i < MAX_LEN_OF_MAC_TABLE) && (TotalEntry > 0)); i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->TXBAbitmap))\n\t\t{\n\t\t\tNdisMoveMemory(BAT->BAOriEntry[index].MACAddr, pEntry->Addr, 6);\n\t\t\tfor (j=0;j<8;j++)\n\t\t\t{\n\t\t\t\tif (pEntry->BAOriWcidArray[j] != 0)\n\t\t\t\t\tBAT->BAOriEntry[index].BufSize[j] = pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]].BAWinSize;\n\t\t\t\telse\n\t\t\t\t\tBAT->BAOriEntry[index].BufSize[j] = 0;\n\t\t\t}\n\n\t\t\tTotalEntry--;\n\t\t\tindex++;\n\t\t\tBAT->OriNum++;\n\t\t}\n\t}\n\n\tTotalEntry = pAd->MacTab.Size;\n\tindex = 0;\n\tfor (i=0; ((i < MAX_LEN_OF_MAC_TABLE) && (TotalEntry > 0)); i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->RXBAbitmap))\n\t\t{\n\t\t\tNdisMoveMemory(BAT->BARecEntry[index].MACAddr, pEntry->Addr, 6);\n\t\t\tBAT->BARecEntry[index].BaBitmap = (UCHAR)pEntry->RXBAbitmap;\n\t\t\tfor (j = 0; j < 8; j++)\n\t\t\t{\n\t\t\t\tif (pEntry->BARecWcidArray[j] != 0)\n\t\t\t\t\tBAT->BARecEntry[index].BufSize[j] = pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]].BAWinSize;\n\t\t\t\telse\n\t\t\t\t\tBAT->BARecEntry[index].BufSize[j] = 0;\n\t\t\t}\n\n\t\t\tTotalEntry--;\n\t\t\tindex++;\n\t\t\tBAT->RecNum++;\n\t\t}\n\t}\n\n\twrq->u.data.length = sizeof(QUERYBA_TABLE);\n\n\tif (copy_to_user(wrq->u.data.pointer, BAT, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n\tvfree(BAT);\n\n}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\nINT Set_ApCli_Enable_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tUINT Enable;\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tEnable = simple_strtol(arg, 0, 16);\n\n\tpAd->ApCfg.ApCliTab[ifIndex].Enable = (Enable > 0) ? TRUE : FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_Enable_Proc::(enable = %d)\\n\", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].Enable));\n\t\n\tApCliIfDown(pAd);\n\n\treturn TRUE;\n}\n\nINT Set_ApCli_Ssid_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn;\n\tINT success = FALSE;\n\t/*UCHAR keyMaterial[40]; */\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tif(strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t/* bring apcli interface down first */\n\t\tif(apcliEn == TRUE )\n\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;\n\t\t\tApCliIfDown(pAd);\n\t\t}\n\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);\n\t\tsuccess = TRUE;\n\n\t\t/* Upadte PMK and restart WPAPSK state machine for ApCli link */\n\t\tif (((pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t(pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK)) && \n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PSKLen > 0)\n\t\t{\n\t\t\tRT_CfgSetWPAPSKKey(pAd, (PSTRING)pAd->ApCfg.ApCliTab[ifIndex].PSK, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PSKLen,\n\t\t\t\t\t\t\t\t\t(PUCHAR)pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PMK);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_Ssid_Proc::(Len=%d,Ssid=%s)\\n\", ifIndex,\n\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid));\n\n\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\treturn success;\n}\n\n\nINT Set_ApCli_Bssid_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tINT i;\n\tPSTRING value;\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn;\n\tPOS_COOKIE pObj;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t/* bring apcli interface down first */\n\tif(apcliEn == TRUE )\n\t{\n\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;\n\t\tApCliIfDown(pAd);\n\t}\n\n\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN);\n\n\tif(strlen(arg) == 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t{\n\t\tfor (i=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\"), i++) \n\t\t{\n\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t\treturn FALSE;  /*Invalid */\n\n\t\t\tAtoH(value, &pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[i], 1);\n\t\t}\n\n\t\tif(i != 6)\n\t\t\treturn FALSE;  /*Invalid */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ApCli_Bssid_Proc (%2X:%2X:%2X:%2X:%2X:%2X)\\n\",\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[0],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[1],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[2],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[3],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[4],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[5]));\n\n\tpAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set ApCli-IF Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG       i;\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\tifIndex;\n\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tif ((strcmp(arg, \"WEPAUTO\") == 0) || (strcmp(arg, \"wepauto\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeAutoSwitch;\n\telse if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeShared;\n\telse if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPAPSK;\n\telse if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0) || (strcmp(arg, \"WPAPSKWPA2PSK\") == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA2PSK;\n\telse\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeOpen;\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))\n\t\t{\n\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t}\n\t}\n\t\t\n    RTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].AuthMode, pAd->ApCfg.ApCliTab[ifIndex].WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\n\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId  = 0;\n\n\tif(pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA)\n\t\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = 1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_AuthMode_Proc::(AuthMode=%d)\\n\", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].AuthMode));\t\t\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set ApCli-IF Encryption Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_EncrypType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\tifIndex;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled; \n\tif ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n    {\n\t\tif (pApCliEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11WEPEnabled;\t\t\t\t  \n\t}\n\telse if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n\t{\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption2Enabled;                       \n    }\n\telse if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0) || (strcmp(arg, \"TKIPAES\") == 0))\n\t{\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption3Enabled;                            \n\t}    \n\telse\n\t{\n\t\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled;                 \n\t}\n\n\tpApCliEntry->PairCipher     = pApCliEntry->WepStatus;\n\tpApCliEntry->GroupCipher    = pApCliEntry->WepStatus;\n\tpApCliEntry->bMixCipher\t\t= FALSE;\n\n\tif (pApCliEntry->WepStatus >= Ndis802_11Encryption2Enabled)\n\t\tpApCliEntry->DefaultKeyId = 1;\n\n\tRTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_EncrypType_Proc::(EncrypType=%d)\\n\", ifIndex, pApCliEntry->WepStatus));\n\n\treturn TRUE;\n}\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Default Key ID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_DefaultKeyID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG \t\t\tKeyIdx;\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tKeyIdx = simple_strtol(arg, 0, 10);\n\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\tpApCliEntry->DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\\n\", ifIndex, pApCliEntry->DefaultKeyId));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key for ApCli link\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 WPA pre-shared key string\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_WPAPSK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ifIndex;\n\tPOS_COOKIE pObj;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\tINT retval;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_ApCli_WPAPSK_Proc::(WPAPSK=%s)\\n\", arg));\n\n\tretval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pApCliEntry->PMK);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\t\n\tNdisMoveMemory(pApCliEntry->PSK, arg, strlen(arg));\n\tpApCliEntry->PSKLen = strlen(arg);\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY1 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\t\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[0], 0);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key1_Proc::(Key1=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n\t\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY2 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[1], 1);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key2_Proc::(Key2=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY3 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[2], 2);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key3_Proc::(Key3=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY4 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_ApCli_Key4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[3], 3);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_ApCli_Key4_Proc::(Key4=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\nINT Set_ApCli_TxMode_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\t\n\tPOS_COOKIE \t\tpObj;\t\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode = \n\t\t\t\t\t\t\t\tRT_CfgSetFixedTxPhyMode(arg);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_TxMode_Proc = %d\\n\", ifIndex,\n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode));\n\n\treturn TRUE;\n}\n\nINT Set_ApCli_TxMcs_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tPOS_COOKIE \t\tpObj;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->DesiredTransmitSetting.field.MCS = \n\t\t\tRT_CfgSetTxMCSProc(arg, &pApCliEntry->bAutoTxRateSwitch);\n\n\tif (pApCliEntry->DesiredTransmitSetting.field.MCS == MCS_AUTO)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_TxMcs_Proc = AUTO\\n\", ifIndex));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(apcli%d) Set_ApCli_TxMcs_Proc = %d\\n\", ifIndex, \n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.MCS));\n\t}\t\n\n\treturn TRUE;\n}\n\n#ifdef WSC_AP_SUPPORT\nINT Set_AP_WscSsid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    POS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t\t\tifIndex = pObj->ioctl_if;\n\tPWSC_CTRL\t    pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl;\n\n    if (pObj->ioctl_if_type != INT_APCLI)\n\t\treturn FALSE;\n    \n\tNdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));\n\n\tif( (strlen(arg) > 0) && (strlen(arg) <= MAX_LEN_OF_SSID))\n    {\n\t\tNdisMoveMemory(pWscControl->WscSsid.Ssid, arg, strlen(arg));\n\t\tpWscControl->WscSsid.SsidLength = strlen(arg);\n\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscSsid_Proc:: (Select SsidLen=%d,Ssid=%s)\\n\", \n\t\t\t\tpWscControl->WscSsid.SsidLength, pWscControl->WscSsid.Ssid));\n\t}\n\telse\n\t\treturn FALSE;\t/*Invalid argument */\n\n\treturn TRUE;\t\n\n}\n#endif /* WSC_AP_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n\n#ifdef WSC_AP_SUPPORT\nINT\t Set_AP_WscConfMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT         ConfModeIdx;\n\t/*INT         IsAPConfigured; */\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t    apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];\n    BOOLEAN     bFromApCli = FALSE;\n    PWSC_CTRL   pWscControl;\n\n\tConfModeIdx = simple_strtol(arg, 0, 10);\n\n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        bFromApCli = TRUE;\n        pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscConfMode_Proc:: This command is from apcli interface now.\\n\", apidx));\n    }\n    else\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n    if (pObj->ioctl_if_type == INT_P2P)\n    {\n\t\tif (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tbFromApCli = TRUE;\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbFromApCli = FALSE;\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t}\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n    }\n    else\n#endif /* P2P_SUPPORT */\n    {\n        bFromApCli = FALSE;\n        pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscConfMode_Proc:: This command is from ra interface now.\\n\", apidx));\n    }\n        \n    pWscControl->bWscTrigger = FALSE;\n    if ((ConfModeIdx & WSC_ENROLLEE_PROXY_REGISTRAR) == WSC_DISABLE)\n    {\n        pWscControl->WscConfMode = WSC_DISABLE;\n\t\tpWscControl->WscStatus = STATUS_WSC_NOTUSED;\n        if (bFromApCli)\n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscConfMode_Proc:: WPS is disabled.\\n\", apidx));\n        }\n        else\n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscConfMode_Proc:: WPS is disabled.\\n\", apidx));\n            /* Clear WPS IE in Beacon and ProbeResp */\n            pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen = 0;\n        \tpAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen = 0;\n\t\t\tAPUpdateBeaconFrame(pAd, apidx);\n        }        \n    }\n    else\n    {\n#ifdef APCLI_SUPPORT\n        if (bFromApCli)\n        {\n            if (ConfModeIdx == WSC_ENROLLEE)\n            {\n                pWscControl->WscConfMode = WSC_ENROLLEE;\n                WscInit(pAd, TRUE, apidx);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscConfMode_Proc:: Ap Client only supports Enrollee mode.(ConfModeIdx=%d)\\n\", apidx, ConfModeIdx));\n                return FALSE;\n            }\n        }\n        else\n#endif /* APCLI_SUPPORT */\n        {\n        \tpWscControl->WscConfMode = (ConfModeIdx & WSC_ENROLLEE_PROXY_REGISTRAR);\n            WscInit(pAd, FALSE, apidx | MIN_NET_DEVICE_FOR_P2P_GO);\n        }\n        pWscControl->WscStatus = STATUS_WSC_IDLE;\n    }\n\n#ifdef APCLI_SUPPORT\n    if (bFromApCli)\n    {\n        memcpy(mac_addr, &pAd->ApCfg.ApCliTab[apidx].CurrentAddress[0], MAC_ADDR_LEN);\n    }\n    else\n#endif /* APCLI_SUPPORT */        \n    {\n        memcpy(mac_addr, &pAd->ApCfg.MBSSID[apidx].Bssid[0], MAC_ADDR_LEN);\n    }\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscConfMode_Proc::(WscConfMode(0~7)=%d)\\n\", \n                            mac_addr[0], \n                            mac_addr[1], \n                            mac_addr[2], \n                            mac_addr[3], \n                            mac_addr[4], \n                            mac_addr[5], \n                            pWscControl->WscConfMode));\n\treturn TRUE;\n}\n\nINT\tSet_AP_WscConfStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR       IsAPConfigured = 0;\n\tINT         IsSelectedRegistrar;\n\tUSHORT      WscMode;\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t    apidx = pObj->ioctl_if;\n\n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscConfStatus_Proc:: Ap Client doesn't need this command.\\n\", apidx));\n        return FALSE;\n    }\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\tif ((pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bWpsEnable == FALSE) && \n\t\t(pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2))\n\t{\n\t\tpAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen = 0;\n       \tpAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen = 0;\n\t\treturn FALSE;\n\t}\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n    if (pObj->ioctl_if_type == INT_P2P)\n    {\n    \tif (P2P_CLI_ON(pAd))\n    \t{\n    \t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfStatus_Proc:: P2P Client doesn't need this command.\\n\", apidx));\n\t\t\treturn FALSE;\n    \t}\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscConfStatus_Proc:: This command is from p2p interface now.\\n\", apidx));\n    }\n#endif /* P2P_SUPPORT */\n\n\tIsAPConfigured = (UCHAR)simple_strtol(arg, 0, 10);\n\tIsSelectedRegistrar = pAd->ApCfg.MBSSID[apidx].WscControl.WscSelReg;\n    if (pAd->ApCfg.MBSSID[apidx].WscControl.WscMode == 1)\n\t\tWscMode = DEV_PASS_ID_PIN;\n\telse\n\t\tWscMode = DEV_PASS_ID_PBC;\n\n\tif ((IsAPConfigured  > 0) && (IsAPConfigured  <= 2))\n    {   \n        pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus = IsAPConfigured;\n        /* Change SC State of WPS IE in Beacon and ProbeResp */\n        WscBuildBeaconIE(pAd, IsAPConfigured, IsSelectedRegistrar, WscMode, 0, apidx, NULL, 0, AP_MODE);\n    \tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, IsSelectedRegistrar, WscMode, 0, apidx | MIN_NET_DEVICE_FOR_P2P_GO, NULL, 0, AP_MODE);\n\t\tAPUpdateBeaconFrame(pAd, apidx);\n    }\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscConfStatus_Proc:: Set failed!!(WscConfStatus=%s), WscConfStatus is 1 or 2 \\n\", apidx, arg));\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscConfStatus_Proc:: WscConfStatus is not changed (%d) \\n\", apidx, pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscConfStatus_Proc::(WscConfStatus=%d)\\n\", \n                               pAd->ApCfg.MBSSID[apidx].Bssid[0],\n                               pAd->ApCfg.MBSSID[apidx].Bssid[1],\n                               pAd->ApCfg.MBSSID[apidx].Bssid[2],\n                               pAd->ApCfg.MBSSID[apidx].Bssid[3],\n                               pAd->ApCfg.MBSSID[apidx].Bssid[4],\n                               pAd->ApCfg.MBSSID[apidx].Bssid[5],\n                               pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus));\n\n\treturn TRUE;\n}\n\nINT\tSet_AP_WscMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT         WscMode;\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t    apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];\n    PWSC_CTRL   pWscControl;\n    BOOLEAN     bFromApCli = FALSE;\n    \n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n    \n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        bFromApCli = TRUE;\n        pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscMode_Proc:: This command is from apcli interface now.\\n\", apidx));\n    }\n    else\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n    if (pObj->ioctl_if_type == INT_P2P)\n    {\n    \tif (P2P_CLI_ON(pAd))\n    \t{\n\t\t\tbFromApCli = TRUE;\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n    \t}\n\t\telse\n\t\t{\n\t\t\tbFromApCli = FALSE;\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t}\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n    }\n    else\n#endif /* P2P_SUPPORT */\n    {\n        bFromApCli = FALSE;\n        pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscMode_Proc:: This command is from ra interface now.\\n\", apidx));\n    }\n\n\tWscMode = simple_strtol(arg, 0, 10);\n    \n    if ((WscMode  > 0) && (WscMode  <= 2))\n    {\n        pWscControl->WscMode = WscMode;\n        if (WscMode == WSC_PBC_MODE)\n        {\n\t        WscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);\n        }\n    }\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscMode_Proc:: Set failed!!(Set_WscMode_Proc=%s), WscConfStatus is 1 or 2 \\n\", arg));\n        DBGPRINT(RT_DEBUG_TRACE, (\"Set_WscMode_Proc:: WscMode is not changed (%d) \\n\", pWscControl->WscMode));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\n\n#ifdef APCLI_SUPPORT\n    if (bFromApCli)\n    {\n        memcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, MAC_ADDR_LEN);\n    }\n    else\n#endif /* APCLI_SUPPORT */        \n    {\n        memcpy(mac_addr, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN);\n    }\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscMode_Proc::(WscMode=%d)\\n\", \n                                mac_addr[0],\n                                mac_addr[1],\n                                mac_addr[2],\n                                mac_addr[3],\n                                mac_addr[4],\n                                mac_addr[5],\n                                pWscControl->WscMode));\n\n\treturn TRUE;\n}\n\nINT\tSet_WscStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t    apidx = pObj->ioctl_if;\n    \n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscStatus_Proc::(WscStatus=%d)\\n\", apidx, pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus));\n\treturn TRUE;\n}\n\n#define WSC_GET_CONF_MODE_EAP\t1\n#define WSC_GET_CONF_MODE_UPNP\t2\nINT\tSet_AP_WscGetConf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT                 WscMode, wscGetConfMode = 0;\n\tINT                 IsAPConfigured;\n\tPWSC_CTRL           pWscControl;\n\tPWSC_UPNP_NODE_INFO pWscUPnPNodeInfo;\n    INT\t                idx;\n    POS_COOKIE          pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t            apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];\n    BOOLEAN             bFromApCli = FALSE;\n#ifdef APCLI_SUPPORT\n\tBOOLEAN \t\t\tapcliEn = pAd->ApCfg.ApCliTab[apidx].Enable;\n#endif /* APCLI_SUPPORT */\n#ifdef WSC_V2_SUPPORT\n\tPWSC_V2_INFO\t\tpWscV2Info = NULL;\n#endif /* WSC_V2_SUPPORT */\n#ifdef WSC_LED_SUPPORT\n\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n    \tif (apcliEn == FALSE)\n    \t{\n    \t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscMode_Proc:: ApCli is disabled.\\n\", apidx));\n    \t\treturn FALSE;\n    \t}\n        bFromApCli = TRUE;\n\t\tapidx &= (~MIN_NET_DEVICE_FOR_APCLI);\n        pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscMode_Proc:: This command is from apcli interface now.\\n\", apidx));\n    }\n    else\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n    if (pObj->ioctl_if_type == INT_P2P)\n    {\n    \tif (P2P_CLI_ON(pAd))\n    \t{\n        \tbFromApCli = TRUE;\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n    \t}\n\t\telse\n\t\t{\n\t\t\tbFromApCli = FALSE;\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t}\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_AP_WscGetConf_Proc:: This command is from p2p interface now.\\n\", apidx & 0x0F));\n    }\n    else\n#endif /* P2P_SUPPORT */\n    {\n        bFromApCli = FALSE;\n        pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscMode_Proc:: This command is from ra interface now.\\n\", apidx));\n    }\n\n\tNdisZeroMemory(mac_addr, MAC_ADDR_LEN);\n#ifdef WSC_V2_SUPPORT\n\tpWscV2Info = &pWscControl->WscV2Info;\n#endif /* WSC_V2_SUPPORT */\n\twscGetConfMode = simple_strtol(arg, 0, 10);\n\n    IsAPConfigured = pWscControl->WscConfStatus;\n    pWscUPnPNodeInfo = &pWscControl->WscUPnPNodeInfo;\n\n    if ((pWscControl->WscConfMode == WSC_DISABLE)\n#ifdef WSC_V2_SUPPORT\n\t\t|| ((pWscV2Info->bWpsEnable) == FALSE && (pWscV2Info->bEnableWpsV2))\n#endif /* WSC_V2_SUPPORT */\n\t\t)\n    {\n        pWscControl->bWscTrigger = FALSE;\n        DBGPRINT(RT_DEBUG_TRACE, (\"Set_WscGetConf_Proc: WPS is disabled.\\n\"));\n\t\treturn FALSE;\n    }\n\n\tWscStop(pAd, bFromApCli, pWscControl);\n    \n\t/* trigger wsc re-generate public key */\n    pWscControl->RegData.ReComputePke = 1;\n\n\tif (pWscControl->WscMode == 1)\n\t\tWscMode = DEV_PASS_ID_PIN;\n\telse\n\t{\n\t\tWscMode = DEV_PASS_ID_PBC;\n\t}\n\tWscInitRegistrarPair(pAd, pWscControl, apidx);\n    /* Enrollee 192 random bytes for DH key generation */\n\tfor (idx = 0; idx < 192; idx++)\n\t\tpWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd);\n    \n#ifdef APCLI_SUPPORT\n\tif (bFromApCli)\n    {\n    \t/* bring apcli interface down first */\n\t\tpAd->ApCfg.ApCliTab[apidx].Enable = FALSE;\n\t\tApCliIfDown(pAd);\n\t\t\t\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr,\n\t                       pAd->ApCfg.ApCliTab[apidx].CurrentAddress, \n\t                       6);\n\t        \n        pAd->ApCfg.ApCliTab[apidx].Enable = apcliEn;\n\t\tNdisMoveMemory(mac_addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, MAC_ADDR_LEN);\n    }\n\telse\n#endif /* APCLI_SUPPORT */\n\t{\n\t\tINT WscDpid;\n#ifdef P2P_SUPPORT\n\t\t/* As become P2P GO, update the DPID in Beacon and Probe Rsp. */\n\t\tif (pAd->P2pCfg.Dpid != DEV_PASS_ID_NOSPEC)\n\t\t\tWscDpid = pAd->P2pCfg.Dpid;\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tWscDpid = WscMode;\n\n\t\tWscBuildBeaconIE(pAd, IsAPConfigured, TRUE, WscDpid, pWscControl->WscConfigMethods, apidx, NULL, 0, AP_MODE);\n\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, TRUE, WscDpid, pWscControl->WscConfigMethods, (apidx | MIN_NET_DEVICE_FOR_P2P_GO), NULL, 0, AP_MODE);\n\t\tAPUpdateBeaconFrame(pAd, apidx);\n\t\tNdisMoveMemory(mac_addr, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN);\n\t}\n\n\t{\n\t    /* 2mins time-out timer */\n\t    RTMPSetTimer(&pWscControl->Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);\n\t    pWscControl->Wsc2MinsTimerRunning = TRUE;\n\t    pWscControl->WscStatus = STATUS_WSC_LINK_UP;\n\t\tpWscControl->bWscTrigger = TRUE;\n\t}\n\tpWscControl->bWscAutoTigeer = FALSE;\n\n    if (!bFromApCli)\n    {\n    \tWscAssignEntryMAC(pAd, pWscControl);\n\t\tWscSendUPnPConfReqMsg(pAd, pWscControl->EntryIfIdx, \n\t    \t\t\t\t\t\t\t(PUCHAR)pAd->ApCfg.MBSSID[pWscControl->EntryIfIdx].Ssid, \n\t    \t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].Bssid, 3, 0, AP_MODE);\n    }\n\n#ifdef WSC_LED_SUPPORT\n\t\tWPSLEDStatus = LED_WPS_IN_PROCESS;\n\t\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscGetConf_Proc trigger WSC state machine, wscGetConfMode=%d\\n\", \n                                mac_addr[0],\n                                mac_addr[1],\n                                mac_addr[2],\n                                mac_addr[3],\n                                mac_addr[4],\n                                mac_addr[5],\n                                wscGetConfMode));\n\n\treturn TRUE;\n}\n\nINT\tSet_AP_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT        PinCode = 0;\n\tBOOLEAN     validatePin, bFromApCli = FALSE;\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR       apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];\n    PWSC_CTRL   pWscControl;\n#define IsZero(c) ('0' == (c) ? TRUE:FALSE)\n\tPinCode = simple_strtol(arg, 0, 10); /* When PinCode is 03571361, return value is 3571361. */\n\n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        bFromApCli = TRUE;\n        pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscPinCode_Proc:: This command is from apcli interface now.\\n\", apidx));\n    }\n    else\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n    if (pObj->ioctl_if_type == INT_P2P)\n    {\n\t\t\tbFromApCli = FALSE;\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_WscMode_Proc:: This command is from p2p interface now.\\n\", apidx));\n    }\n#endif /* P2P_SUPPORT */\n    \n\tif (strlen(arg) == 4)\n\t\tvalidatePin = TRUE;\n\telse\n\tvalidatePin = ValidateChecksum(PinCode);\n\n\tif ( validatePin )\n\t{\n\t    if (pWscControl->WscRejectSamePinFromEnrollee && \n            (PinCode == pWscControl->WscLastPinFromEnrollee))\n        {\n            DBGPRINT(RT_DEBUG_TRACE, (\"PIN authentication or communication error occurs!!\\n\"\n                                      \"Registrar does NOT accept the same PIN again!(PIN:%s)\\n\", arg));\n            return FALSE;\n        }\n        else\n        {\n    \t\tpWscControl->WscPinCode = PinCode;\n            pWscControl->WscLastPinFromEnrollee = pWscControl->WscPinCode;\n            pWscControl->WscRejectSamePinFromEnrollee = FALSE;\n            /* PIN Code */\n\t\t\tif (strlen(arg) == 4)\n\t\t\t{\n\t\t\t\tpWscControl->WscPinCodeLen = 4;\n\t\t\t\tpWscControl->RegData.PinCodeLen = 4;\n\t\t\t\tNdisMoveMemory(pWscControl->RegData.PIN, arg, 4);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWscControl->WscPinCodeLen = 8;\n\n            if (IsZero(*arg))\n\t\t\t\t{\n\t\t\t\t\tpWscControl->RegData.PinCodeLen = 8;\n                NdisMoveMemory(pWscControl->RegData.PIN, arg, 8);\n\t\t\t\t}\n            else\n    \t        WscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);\n        }        \n\t}\n#ifdef P2P_SUPPORT\n\t    if (pObj->ioctl_if_type == INT_P2P)\n\t    {\n\t    \tPWSC_CTRL   pP2pCliWscCtrl;\n\t\t\tpP2pCliWscCtrl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t\tpP2pCliWscCtrl->WscPinCodeLen = pWscControl->WscPinCodeLen;\n\t\t\tpP2pCliWscCtrl->WscPinCode = pWscControl->WscPinCode;\n\t\t\tWscGetRegDataPIN(pAd, pP2pCliWscCtrl->WscPinCode, pP2pCliWscCtrl);\n\t    }\n#endif /* P2P_SUPPORT */\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set failed!!(Set_WscPinCode_Proc=%s), PinCode Checksum invalid \\n\", arg));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\n\n#ifdef APCLI_SUPPORT\n    if (bFromApCli)\n    {\n        memcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, MAC_ADDR_LEN);\n    }\n    else\n#endif /* APCLI_SUPPORT */        \n    {\n        memcpy(mac_addr, pAd->ApCfg.MBSSID[apidx].Bssid, MAC_ADDR_LEN);\n    }\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscPinCode_Proc::(PinCode=%d)\\n\", \n                                mac_addr[0],\n                                mac_addr[1],\n                                mac_addr[2],\n                                mac_addr[3],\n                                mac_addr[4],\n                                mac_addr[5],\n                                pWscControl->WscPinCode));\n\n\treturn TRUE;\n}\n\nINT\tSet_WscOOB_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    char        *pTempSsid = NULL;\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR       apidx = pObj->ioctl_if;\n    \n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscPinCode_Proc:: Ap Client doesn't need this command.\\n\", apidx));\n        return FALSE;\n    }\n#endif /* APCLI_SUPPORT */\n\n    Set_AP_WscConfStatus_Proc(pAd, \"1\");\n    Set_AP_AuthMode_Proc(pAd, \"WPAPSK\");\n    Set_AP_EncrypType_Proc(pAd, \"TKIP\");\n    pTempSsid = vmalloc(33);\n    if (pTempSsid)\n    {\n        memset(pTempSsid, 0, 33);\n        snprintf(pTempSsid, 33,\"RalinkInitialAP%02X%02X%02X\", pAd->ApCfg.MBSSID[apidx].Bssid[3],\n                                                          pAd->ApCfg.MBSSID[apidx].Bssid[4],\n                                                          pAd->ApCfg.MBSSID[apidx].Bssid[5]);\n        Set_AP_SSID_Proc(pAd, pTempSsid);\n        vfree(pTempSsid);\n    }\n\tSet_AP_WPAPSK_Proc(pAd, \"RalinkInitialAPxx1234\");\n    \n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscOOB_Proc\\n\", apidx));\n\treturn TRUE;\n}\n\nINT\tSet_WscStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t    apidx = pObj->ioctl_if;\n    PWSC_CTRL   pWscControl;\n    BOOLEAN     bFromApCli = FALSE;\n    \n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn FALSE;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n    \n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        bFromApCli = TRUE;\n        pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscStop_Proc:: This command is from apcli interface now.\\n\", apidx));\n    }\n    else\n#endif /* APCLI_SUPPORT */\n    {\n        bFromApCli = FALSE;\n        pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscStop_Proc:: This command is from ra interface now.\\n\", apidx));\n    }\n\n#ifdef APCLI_SUPPORT\n    if (bFromApCli)\n    {\n\t    WscStop(pAd, TRUE, pWscControl);\n\t\tpWscControl->WscConfMode = WSC_DISABLE;\n    }\n    else\n#endif /* APCLI_SUPPORT */\n    {\n        INT\t IsAPConfigured = pWscControl->WscConfStatus;\n        WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, apidx, NULL, 0, AP_MODE);\n\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, apidx | MIN_NET_DEVICE_FOR_P2P_GO, NULL, 0, AP_MODE);\n\t\tAPUpdateBeaconFrame(pAd, apidx);\n        WscStop(pAd, FALSE, pWscControl);\n    }\n\n    pWscControl->bWscTrigger = FALSE;\n    DBGPRINT(RT_DEBUG_TRACE, (\"<===== Set_WscStop_Proc\"));\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Get WSC Profile\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage:\n        \t\t1.) iwpriv ra0 get_wsc_profile\n        \t\t3.) UI needs to prepare at least 4096bytes to get the results\n    ==========================================================================\n*/\nVOID RTMPIoctlWscProfile(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tWSC_CONFIGURED_VALUE Profile;\n\tPSTRING msg;\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\n#ifdef HOSTAPD_SUPPORT\n\tif (pAd->ApCfg.MBSSID[apidx].Hostapd == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\treturn;\n\t}\n#endif /*HOSTAPD_SUPPORT*/\n\n\n\tmemset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE));\n\tProfile.WscConfigured = pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus;\n\tNdisZeroMemory(Profile.WscSsid, 32 + 1);\n\tNdisMoveMemory(Profile.WscSsid, pAd->ApCfg.MBSSID[apidx].Ssid, \n\t\t\t\t\t\t\t\t    pAd->ApCfg.MBSSID[apidx].SsidLen);\n\tProfile.WscSsid[pAd->ApCfg.MBSSID[apidx].SsidLen] = '\\0';\n\tif (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\tProfile.WscAuthMode = WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK;\n\telse\n\t\tProfile.WscAuthMode = WscGetAuthType(pAd->ApCfg.MBSSID[apidx].AuthMode);\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\n\t\tProfile.WscEncrypType = WSC_ENCRTYPE_TKIP |WSC_ENCRTYPE_AES;\n\telse\n\t\tProfile.WscEncrypType = WscGetEncryType(pAd->ApCfg.MBSSID[apidx].WepStatus);\n\tNdisZeroMemory(Profile.WscWPAKey, 64 + 1);\n\n\tif (Profile.WscEncrypType == 2)\n\t{\n\t\tProfile.DefaultKeyIdx = pAd->ApCfg.MBSSID[apidx].DefaultKeyId + 1;\n\t\t{\n\t\t\tint i;\n\t\t\tfor (i=0; i<pAd->SharedKey[apidx][pAd->ApCfg.MBSSID[apidx].DefaultKeyId].KeyLen; i++)\n\t\t\t{\n\t\t\t\tsnprintf((PSTRING) Profile.WscWPAKey, sizeof(Profile.WscWPAKey),\n\t\t\t\t\t\t\"%s%02x\", Profile.WscWPAKey,\n\t\t\t\t\t\t\t\t\tpAd->SharedKey[apidx][pAd->ApCfg.MBSSID[apidx].DefaultKeyId].Key[i]);\n\t\t\t}\n\t\t\tProfile.WscWPAKey[(pAd->SharedKey[apidx][pAd->ApCfg.MBSSID[apidx].DefaultKeyId].KeyLen)*2] = '\\0';\n\t\t}\n\t}\n\telse if (Profile.WscEncrypType >= 4)\n\t{\n\t\tProfile.DefaultKeyIdx = 2;\n\t\tNdisMoveMemory(Profile.WscWPAKey, pAd->ApCfg.MBSSID[apidx].WscControl.WpaPsk, \n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen);\n\t\tProfile.WscWPAKey[pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen] = '\\0';\n\t}\n\telse\n\t{\n\t\tProfile.DefaultKeyIdx = 1;\n\t}\n\t\n\twrq->u.data.length = sizeof(Profile);\n\n\tif (copy_to_user(wrq->u.data.pointer, &Profile, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n/*\tmsg = (PSTRING)kmalloc(sizeof(CHAR)*(2048), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));\n\tif (msg == NULL) {\n\t\treturn;\n\t}\n\n\tmemset(msg, 0x00, 2048);\n\tsprintf(msg,\"%s\",\"\\n\");\n\n\tif (Profile.WscEncrypType == 1)\n\t{\n\t\tsprintf(msg+strlen(msg),\"%-12s%-33s%-12s%-12s\\n\", \"Configured\", \"SSID\", \"AuthMode\", \"EncrypType\");\n\t}\n\telse if (Profile.WscEncrypType == 2)\n\t{\n\t\tsprintf(msg+strlen(msg),\"%-12s%-33s%-12s%-12s%-13s%-26s\\n\", \"Configured\", \"SSID\", \"AuthMode\", \"EncrypType\", \"DefaultKeyID\", \"Key\");\n\t}\n\telse\n\t{\n\t\tsprintf(msg+strlen(msg),\"%-12s%-33s%-12s%-12s%-64s\\n\", \"Configured\", \"SSID\", \"AuthMode\", \"EncrypType\", \"Key\");\n\t}\n\n\tif (Profile.WscConfigured == 1)\n\t\tsprintf(msg+strlen(msg),\"%-12s\", \"No\");\n\telse\n\t\tsprintf(msg+strlen(msg),\"%-12s\", \"Yes\");\n\tsprintf(msg+strlen(msg), \"%-33s\", Profile.WscSsid);\n\tif (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\tsprintf(msg+strlen(msg), \"%-12s\", \"WPAPSKWPA2PSK\");\n\telse\n\t\tsprintf(msg+strlen(msg), \"%-12s\", WscGetAuthTypeStr(Profile.WscAuthMode));\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\n\t\tsprintf(msg+strlen(msg), \"%-12s\", \"TKIPAES\");\n\telse\n\t\tsprintf(msg+strlen(msg), \"%-12s\", WscGetEncryTypeStr(Profile.WscEncrypType));\n\n\tif (Profile.WscEncrypType == 1)\n\t{\n\t\tsprintf(msg+strlen(msg), \"%s\\n\", \"\");\n\t}\n\telse if (Profile.WscEncrypType == 2)\n\t{\n\t\tsprintf(msg+strlen(msg), \"%-13d\",Profile.DefaultKeyIdx);\n\t\tsprintf(msg+strlen(msg), \"%-26s\\n\",Profile.WscWPAKey);\n\t}\n\telse if (Profile.WscEncrypType >= 4)\n\t{\n\t    sprintf(msg+strlen(msg), \"%-64s\\n\",Profile.WscWPAKey);\n\t}\n#ifdef INF_AR9\n\twrq->u.data.length = strlen(msg);\n\tcopy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n#endif/* INF_AR9 */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\", msg));\n/*\tkfree(msg); */\n\tos_free_mem(NULL, msg);\n}\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\n\n/* \n    ==========================================================================\n    Description:\n        Get WSC Profile\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage:\n        \t\t1.) iwpriv ra0 ar9_show get_wsc_profile\n        \t\t3.) UI needs to prepare at least 4096bytes to get the results\n    ==========================================================================\n*/\nVOID RTMPAR9IoctlWscProfile(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tWSC_CONFIGURED_VALUE Profile;\n\tPSTRING msg;\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\n\tmemset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE));\n\tProfile.WscConfigured = pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus;\n\tNdisZeroMemory(Profile.WscSsid, 32 + 1);\n\tNdisMoveMemory(Profile.WscSsid, pAd->ApCfg.MBSSID[apidx].Ssid, \n\t\t\t\t\t\t\t\t    pAd->ApCfg.MBSSID[apidx].SsidLen);\n\tProfile.WscSsid[pAd->ApCfg.MBSSID[apidx].SsidLen] = '\\0';\n\tif (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\tProfile.WscAuthMode = WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK;\n\telse\n\t\tProfile.WscAuthMode = WscGetAuthType(pAd->ApCfg.MBSSID[apidx].AuthMode);\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\n\t\tProfile.WscEncrypType = WSC_ENCRTYPE_TKIP |WSC_ENCRTYPE_AES;\n\telse\n\t\tProfile.WscEncrypType = WscGetEncryType(pAd->ApCfg.MBSSID[apidx].WepStatus);\n\tNdisZeroMemory(Profile.WscWPAKey, 64 + 1);\n\n\tif (Profile.WscEncrypType == 2)\n\t{\n\t\tProfile.DefaultKeyIdx = pAd->ApCfg.MBSSID[apidx].DefaultKeyId + 1;\n\t\t{\n\t\t\tint i;\n\t\t\tfor (i=0; i<pAd->SharedKey[apidx][pAd->ApCfg.MBSSID[apidx].DefaultKeyId].KeyLen; i++)\n\t\t\t{\n\t\t\t\tsnprintf((PSTRING) Profile.WscWPAKey, sizeof(Profile.WscWPAKey),\n\t\t\t\t\t\t\"%s%02x\", Profile.WscWPAKey,\n\t\t\t\t\t\t\t\t\tpAd->SharedKey[apidx][pAd->ApCfg.MBSSID[apidx].DefaultKeyId].Key[i]);\n\t\t\t}\n\t\t\tProfile.WscWPAKey[(pAd->SharedKey[apidx][pAd->ApCfg.MBSSID[apidx].DefaultKeyId].KeyLen)*2] = '\\0';\n\t\t}\n\t}\n\telse if (Profile.WscEncrypType >= 4)\n\t{\n\t\tProfile.DefaultKeyIdx = 2;\n\t\tNdisMoveMemory(Profile.WscWPAKey, pAd->ApCfg.MBSSID[apidx].WscControl.WpaPsk, \n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen);\n\t\tProfile.WscWPAKey[pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen] = '\\0';\n\t}\n\telse\n\t{\n\t\tProfile.DefaultKeyIdx = 1;\n\t}\n\n\n/*\tmsg = (PSTRING)kmalloc(sizeof(CHAR)*(2048), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));\n\tif (msg == NULL) {\n\t\treturn;\n\t}\n\n\tmemset(msg, 0x00, 2048);\n\tsprintf(msg,\"%s\",\"\\n\");\n\n\tif (Profile.WscEncrypType == 1)\n\t{\n\t\tsprintf(msg+strlen(msg),\"%-12s%-33s%-12s%-12s\\n\", \"Configured\", \"SSID\", \"AuthMode\", \"EncrypType\");\n\t}\n\telse if (Profile.WscEncrypType == 2)\n\t{\n\t\tsprintf(msg+strlen(msg),\"%-12s%-33s%-12s%-12s%-13s%-26s\\n\", \"Configured\", \"SSID\", \"AuthMode\", \"EncrypType\", \"DefaultKeyID\", \"Key\");\n\t}\n\telse\n\t{\n\t\tsprintf(msg+strlen(msg),\"%-12s%-33s%-12s%-12s%-64s\\n\", \"Configured\", \"SSID\", \"AuthMode\", \"EncrypType\", \"Key\");\n\t}\n\n\tif (Profile.WscConfigured == 1)\n\t\tsprintf(msg+strlen(msg),\"%-12s\", \"No\");\n\telse\n\t\tsprintf(msg+strlen(msg),\"%-12s\", \"Yes\");\n\tsprintf(msg+strlen(msg), \"%-33s\", Profile.WscSsid);\n\tif (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)\n\t\tsprintf(msg+strlen(msg), \"%-12s\", \"WPAPSKWPA2PSK\");\n\telse\n\t\tsprintf(msg+strlen(msg), \"%-12s\", WscGetAuthTypeStr(Profile.WscAuthMode));\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption4Enabled)\n\t\tsprintf(msg+strlen(msg), \"%-12s\", \"TKIPAES\");\n\telse\n\t\tsprintf(msg+strlen(msg), \"%-12s\", WscGetEncryTypeStr(Profile.WscEncrypType));\n\n\tif (Profile.WscEncrypType == 1)\n\t{\n\t\tsprintf(msg+strlen(msg), \"%s\\n\", \"\");\n\t}\n\telse if (Profile.WscEncrypType == 2)\n\t{\n\t\tsprintf(msg+strlen(msg), \"%-13d\",Profile.DefaultKeyIdx);\n\t\tsprintf(msg+strlen(msg), \"%-26s\\n\",Profile.WscWPAKey);\n\t}\n\telse if (Profile.WscEncrypType >= 4)\n\t{\n\t    sprintf(msg+strlen(msg), \"%-64s\\n\",Profile.WscWPAKey);\n\t}\n\n\twrq->u.data.length = strlen(msg);\n\tcopy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\", msg));\n\t}\n/*\tkfree(msg); */\n\tos_free_mem(NULL, msg);\n}\n\nVOID RTMPIoctlWscPINCode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING msg;\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tUCHAR        tempPIN[9]={0};\n\n/*\tmsg = (PSTRING)kmalloc(sizeof(CHAR)*(128), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(128));\n\tif (msg == NULL) {\n\t\treturn;\n\t}\n\n\tmemset(msg, 0x00, 128);\n\tsprintf(msg,\"%s\",\"\\n\");\n\tsprintf(msg+strlen(msg),\"WSC_PINCode=\");\n\tif(pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCode)\n\t{\n\t\tif (pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCodeLen == 8)\n\t\t\tsprintf((PSTRING) tempPIN, \"%08u\", pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCode);\n\t\telse\n\t\t\tsprintf((PSTRING) tempPIN, \"%04u\", pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCode);\n\t\tsprintf(msg,\"%s%s\\n\",msg,tempPIN);\n\t}\n\twrq->u.data.length = strlen(msg);\n\tcopy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\", msg));\n\t}\n/*\tkfree(msg); */\n\tos_free_mem(NULL, msg);\n}\n\nVOID RTMPIoctlWscStatus(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING msg;\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\n/*\tmsg = (PSTRING)kmalloc(sizeof(CHAR)*(128), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(128));\n\tif (msg == NULL) {\n\t\treturn;\n\t}\n\n\tmemset(msg, 0x00, 128);\n\tsprintf(msg,\"%s\",\"\\n\");\n\tsprintf(msg+strlen(msg),\"WSC_Status=\");\n\tsprintf(msg,\"%s%d\\n\",msg,pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus);\n\twrq->u.data.length = strlen(msg);\n\tcopy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\", msg));\n\t}\n/*\tkfree(msg); */\n\tos_free_mem(NULL, msg);\n}\n\nVOID RTMPIoctlGetWscDynInfo(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tchar *msg;\n\tPMULTISSID_STRUCT\tpMbss;\n\tINT apidx,configstate;\n\n\n/*\tmsg = kmalloc(sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)));\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tmemset(msg, 0 ,pAd->ApCfg.BssidNum*(14*128));\n\tsprintf(msg,\"%s\",\"\\n\");\n\t\n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tpMbss=&pAd->ApCfg.MBSSID[apidx];\n\n\t\tif(pMbss->WscControl.WscConfStatus == WSC_SCSTATE_UNCONFIGURED)\n\t\t\tconfigstate = 0;\n\t\telse\n\t\t\tconfigstate = 1;\n\t\t\n\t\tsprintf(msg+strlen(msg),\"ra%d\\n\",apidx);\n\t\tsprintf(msg+strlen(msg),\"UUID = %s\\n\",(pMbss->WscControl.Wsc_Uuid_Str));\n\t\tsprintf(msg+strlen(msg),\"wpsVersion = 0x%x\\n\",WSC_VERSION);\n\t\tsprintf(msg+strlen(msg),\"setuoLockedState = %d\\n\",0);\n\t\tsprintf(msg+strlen(msg),\"configstate = %d\\n\",configstate);\n\t\tsprintf(msg+strlen(msg),\"lastConfigError = %d\\n\",0);\n\t\t\n\t}\n\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\", msg));\n\t}\n\n/*\tkfree(msg); */\n\tos_free_mem(NULL, msg);\n}\n\nVOID RTMPIoctlGetWscRegsDynInfo(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tchar *msg;\n\tPMULTISSID_STRUCT\tpMbss;\n\tINT apidx;\n\n\n/*\tmsg = kmalloc(sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)), MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)));\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc memory failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tmemset(msg, 0 ,pAd->ApCfg.BssidNum*(14*128));\n\tsprintf(msg,\"%s\",\"\\n\");\n\t\n\tfor (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)\n\t{\n\t\tpMbss=&pAd->ApCfg.MBSSID[apidx];\n\t\tsprintf(msg+strlen(msg),\"ra%d\\n\",apidx);\n\t\tsprintf(msg+strlen(msg),\"UUID_R = %s\\n\",(pMbss->WscControl.RegData.PeerInfo.Uuid));\t\n\t}\n\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s\", msg));\n\t}\n\n/*\tkfree(msg); */\n\tos_free_mem(NULL, msg);\n}\n#endif /*AR9_MAPI_SUPPORT*/\n#endif/* INF_AR9 */\nBOOLEAN WscCheckEnrolleeNonceFromUpnp(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\tpData,\n\tIN  USHORT\t\t\tLength,\n\tIN  PWSC_CTRL       pWscControl) \n{\n\tUSHORT\tWscType, WscLen;\n    USHORT  WscId = WSC_ID_ENROLLEE_NONCE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"check Enrollee Nonce\\n\"));\n   \n    /* We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n        char ZeroNonce[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n        \n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n        \n\t\tif (WscType == WscId)\n\t\t{\n\t\t\tif (RTMPCompareMemory(pWscControl->RegData.SelfNonce, pData, 16) == 0)\n\t\t\t{\n\t\t\t    DBGPRINT(RT_DEBUG_TRACE, (\"Nonce match!!\\n\"));\n                DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscCheckNonce\\n\"));\n\t\t\t\treturn TRUE;\n\t\t\t}\n            else if (NdisEqualMemory(pData, ZeroNonce, 16))\n            {\n                /* Intel external registrar will send WSC_NACK with enrollee nonce */\n                /* \"10 1A 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\" */\n                /* when AP is configured and user selects not to configure AP. */\n                DBGPRINT(RT_DEBUG_TRACE, (\"Zero Enrollee Nonce!!\\n\"));\n                DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscCheckNonce\\n\"));\n                return TRUE;\n            }\n\t\t}\n        \n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Nonce mismatch!!\\n\"));\n    return FALSE;\n}\n\nUCHAR\tWscRxMsgTypeFromUpnp(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PSTRING\t\t\t\tpData,\n\tIN\tUSHORT\t\t\t\tLength) \n{\n\t\n\tUSHORT WscType, WscLen;\n    \n    {   /* Eap-Esp(Messages) */\n        /* the first TLV item in EAP Messages must be WSC_IE_VERSION */\n        NdisMoveMemory(&WscType, pData, 2);\n        if (ntohs(WscType) != WSC_ID_VERSION)\n            goto out;\n\n        /* Not Wsc Start, We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */\n\t\twhile (Length > 4)\n\t\t{\n\t\t\t/* arm-cpu has packet alignment issue, it's better to use memcpy to retrieve data */\n\t\t\tNdisMoveMemory(&WscType, pData, 2);\n\t\t\tNdisMoveMemory(&WscLen,  pData + 2, 2);\n\t\t\tWscLen = ntohs(WscLen);\n\t\t\tif (ntohs(WscType) == WSC_ID_MSG_TYPE)\n\t\t\t{\n\t\t\t\treturn(*(pData + 4));\t/* Found the message type */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpData  += (WscLen + 4);\n\t\t\t\tLength -= (WscLen + 4);\n\t\t\t}\n\t\t}\n    }\n\nout:\n\treturn  WSC_MSG_UNKNOWN;\n}\n\nVOID RTMPIoctlSetWSCOOB(\n\tIN PRTMP_ADAPTER pAd)\n{\n    char        *pTempSsid = NULL;\n    POS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR       apidx = pObj->ioctl_if;\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscPinCode_Proc:: Ap Client doesn't need this command.\\n\", apidx));\n        return;\n    }\n#endif /* APCLI_SUPPORT */\n\n    Set_AP_WscConfStatus_Proc(pAd, \"1\");\n    Set_AP_AuthMode_Proc(pAd, \"WPAPSK\");\n    Set_AP_EncrypType_Proc(pAd, \"TKIP\");\n    pTempSsid = vmalloc(33);\n    if (pTempSsid)\n    {\n        memset(pTempSsid, 0, 33);\n        snprintf(pTempSsid, 33, \"RalinkInitialAP%02X%02X%02X\", pAd->ApCfg.MBSSID[apidx].Bssid[3],\n                                                          pAd->ApCfg.MBSSID[apidx].Bssid[4],\n                                                          pAd->ApCfg.MBSSID[apidx].Bssid[5]);\n        Set_AP_SSID_Proc(pAd, pTempSsid);\n        vfree(pTempSsid);\n    }\n\tSet_AP_WPAPSK_Proc(pAd, \"RalinkInitialAPxx1234\");\n    \n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscOOB_Proc\\n\", apidx));\n\treturn;\n}\n\n/*     \n\t==========================================================================    \n\tDescription:       \t\n\tSet Wsc Security Mode        \n\t0 : WPA2PSK AES         \n\t1 : WPA2PSK TKIP         \n\t2 : WPAPSK AES        \n\t3 : WPAPSK TKIP\n\tReturn:        \n\tTRUE if all parameters are OK, FALSE otherwise    \n\t==========================================================================\n*/\nINT\tSet_AP_WscSecurityMode_Proc(\t\n\tIN\tPRTMP_ADAPTER\tpAd, \t\n\tIN\tPSTRING\t\t\targ)\n{\t\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\t\n\tUCHAR\t\tapidx = pObj->ioctl_if;\t\n\t\n\tif (strcmp(arg, \"0\") == 0)\t\t\n\t\tpAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPA2PSKAES;\t\n\telse if (strcmp(arg, \"1\") == 0)\t\t\n\t\tpAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPA2PSKTKIP;\t\n\telse if (strcmp(arg, \"2\") == 0)\t\t\n\t\tpAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPAPSKAES;\t\n\telse if (strcmp(arg, \"3\") == 0)\t\t\n\t\tpAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPAPSKTKIP;\t\n\telse\t\t\n\t\treturn FALSE;\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscSecurityMode_Proc::(WscSecurityMode=%d)\\n\", \n\t\tapidx, pAd->ApCfg.MBSSID[apidx].WscSecurityMode ));\t\n\t\n\treturn TRUE;\n}\n\nINT Set_AP_WscMultiByteCheck_Proc(    \n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PSTRING         arg)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\t\n\tUCHAR\t\t\tapidx = pObj->ioctl_if;\t\n\tBOOLEAN\t\t\tbEnable = FALSE;\n\tPWSC_CTRL\t\tpWpsCtrl = NULL;\n\tBOOLEAN     \tbFromApCli = FALSE;\n\n#ifdef APCLI_SUPPORT\n    if (pObj->ioctl_if_type == INT_APCLI)\n    {\n        bFromApCli = TRUE;\n        pWpsCtrl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(apcli%d) Set_WscConfMode_Proc:: This command is from apcli interface now.\\n\", apidx));\n    }\n    else\n#endif /* APCLI_SUPPORT */\n    {\n        bFromApCli = FALSE;\n        pWpsCtrl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n        DBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_WscConfMode_Proc:: This command is from ra interface now.\\n\", apidx));\n    }\n\n\tif (strcmp(arg, \"0\") == 0)\t\t\n\t\tbEnable = FALSE;\n\telse if (strcmp(arg, \"1\") == 0)\t\t\n\t\tbEnable = TRUE;\n\telse\t\t\n\t\treturn FALSE;\t\n\n\tif (pWpsCtrl->bCheckMultiByte != bEnable)\n\t{\n\t\tpWpsCtrl->bCheckMultiByte = bEnable;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_AP_WscMultiByteCheck_Proc::(bCheckMultiByte=%d)\\n\", \n\t\tapidx, pWpsCtrl->bCheckMultiByte));\n\t\n\treturn TRUE;\n}\n\nINT\tSet_WscVersion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tversion = (UCHAR)simple_strtol(arg, 0, 16);\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscVersion_Proc::(version=%x)\\n\",version));\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.RegData.SelfInfo.Version = version;\n\treturn TRUE;\n}\n\n#ifdef WSC_V2_SUPPORT\nINT\tSet_WscFragment_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tbool_flag = (UCHAR)simple_strtol(arg, 0, 16);\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscFragment_Proc::(bool_flag=%d)\\n\",bool_flag));\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.bWscFragment = bool_flag;\n\treturn TRUE;\n}\n\nINT\tSet_WscFragmentSize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUSHORT\t\tWscFragSize = (USHORT)simple_strtol(arg, 0, 10);\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscFragmentSize_Proc::(WscFragSize=%d)\\n\", WscFragSize));\n\tif ((WscFragSize >=128) && (WscFragSize <=300))\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscFragSize = WscFragSize;\n\treturn TRUE;\n}\n\nINT\tSet_WscSetupLock_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tbEnable = (UCHAR)simple_strtol(arg, 0, 10);\n\tPWSC_CTRL\tpWscControl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;\n\n\tif (bEnable == 0)\n\t\tpWscControl->bSetupLock = FALSE;\n\telse\n\t\tpWscControl->bSetupLock = TRUE;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscSetupLock_Proc::(bSetupLock=%d)\\n\",\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.bSetupLock));\n\treturn TRUE;\n}\n\nINT\tSet_WscV2Support_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\tbEnable = (UCHAR)simple_strtol(arg, 0, 10);\n\tPWSC_CTRL\tpWscControl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;\n\tINT \t\tIsAPConfigured = pWscControl->WscConfStatus;\t\t\n\n\tif (bEnable == 0)\n\t\tpWscControl->WscV2Info.bEnableWpsV2 = FALSE;\n\telse\n\t\tpWscControl->WscV2Info.bEnableWpsV2 = TRUE;\n\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/*\n\t\t\tWPS V2 doesn't support WEP and WPA/WPAPSK-TKIP.\n\t\t*/\n\t\tif ((pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus == Ndis802_11WEPEnabled) || \n\t\t\t(pAd->ApCfg.MBSSID[pObj->ioctl_if].WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t(pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid))\n\t\t\tWscOnOff(pAd, pObj->ioctl_if | MIN_NET_DEVICE_FOR_P2P_GO, TRUE);\n\t\telse\n\t\t\tWscOnOff(pAd, pObj->ioctl_if | MIN_NET_DEVICE_FOR_P2P_GO, FALSE);\n\t\tAPUpdateBeaconFrame(pAd, pObj->ioctl_if);\n\t}\n\telse\n\t{\n\t\tWscInit(pAd, FALSE, (pObj->ioctl_if | MIN_NET_DEVICE_FOR_P2P_GO));\n\t}\t\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscV2Support_Proc::(bEnableWpsV2=%d)\\n\",\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.bEnableWpsV2));\n\treturn TRUE;\n}\n\nINT\tSet_WscVersion2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\tversion = (UCHAR)simple_strtol(arg, 0, 16);\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscVersion2_Proc::(version=%x)\\n\",version));\n\tif (version >= 0x20)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.RegData.SelfInfo.Version2 = version;\n\telse\n\t\treturn FALSE;\n\treturn TRUE;\n}\n\nINT\tSet_WscExtraTlvTag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUSHORT\t\tnew_tag = (USHORT)simple_strtol(arg, 0, 16);\n\t\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.ExtraTlv.TlvTag = new_tag;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscExtraTlvTag_Proc::(new_tag=0x%04X)\\n\",new_tag));\n\treturn TRUE;\n}\n\nINT\tSet_WscExtraTlvType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\ttype = (UCHAR)simple_strtol(arg, 0, 10);\n\t\n\tpAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.ExtraTlv.TlvType = type;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscExtraTlvType_Proc::(type=%d)\\n\",type));\n\treturn TRUE;\n}\n\nINT\tSet_WscExtraTlvData_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUINT\t\t\tDataLen = (UINT)strlen(arg);\n\tPWSC_TLV\t\tpWscTLV = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.ExtraTlv;\n\tINT\t\t\t\ti;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscExtraTlvData_Proc::(DataLen = %d)\\n\", DataLen));\n\n\tif ((DataLen != 0) && (pWscTLV->TlvType == TLV_HEX))\n\t{\n\t\tfor(i=0; i < DataLen; i++)\n\t\t{\n\t\t\tif( !isxdigit(*(arg+i)) )\n\t\t\t\treturn FALSE;  /*Not Hex value; */\n\t\t}\n\t}\n\t\n\tif (pWscTLV->pTlvData)\n\t{\n\t\tos_free_mem(NULL, pWscTLV->pTlvData);\n\t\tpWscTLV->pTlvData = NULL;\n\t}\n\n\tif (DataLen == 0)\n\t\treturn TRUE;\t\t\n\n\tpWscTLV->TlvLen = 0;\n\tos_alloc_mem(NULL, &pWscTLV->pTlvData, DataLen);\n\tif (pWscTLV->pTlvData)\n\t{\n\t\tif (pWscTLV->TlvType == TLV_ASCII)\n\t\t{\n\t\t\tNdisMoveMemory(pWscTLV->pTlvData, arg, DataLen);\n\t\t\tpWscTLV->TlvLen = DataLen;\n\t\t}\n\t\telse\n\t\t{\t\t\t\t\n\t\t\tpWscTLV->TlvLen = DataLen/2;\n\t\t\tAtoH(arg, pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t}\n\t\treturn TRUE;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscExtraTlvData_Proc::os_alloc_mem fail\\n\"));\n\n\treturn FALSE;\n}\n#endif /* WSC_V2_SUPPORT */\n#endif /* WSC_AP_SUPPORT */\n\n\n\n#ifdef IAPP_SUPPORT\nINT\tSet_IappPID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tunsigned long IappPid;\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tIappPid = simple_strtol(arg, 0, 10);\n\tRTMP_GET_OS_PID(pObj->IappPid, IappPid);\n\tpObj->IappPid_nr = IappPid;\n\n/*\tDBGPRINT(RT_DEBUG_TRACE, (\"pObj->IappPid = %d\", GET_PID_NUMBER(pObj->IappPid))); */\n\treturn TRUE;\n}\n#endif /* IAPP_SUPPORT */\n\n\nINT\tSet_DisConnectSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tmacAddr[MAC_ADDR_LEN];\n\tPSTRING\t\t\t\t\tvalue;\n\tINT\t\t\t\t\t\ti;\n\tUCHAR HashIdx;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\tif(strlen(arg) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\treturn FALSE;\n\n\tfor (i=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n\t{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  /*Invalid */\n\n\t\tAtoH(value, &macAddr[i++], 1);\n\t}\n\n\tHashIdx = MAC_ADDR_HASH_INDEX(macAddr);\n\tpEntry = pAd->MacTab.Hash[HashIdx];\n\n\tif (pEntry)\n\t{\n\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);\n/*\t\tMacTableDeleteEntry(pAd, pEntry->Aid, Addr); */\n\t}\n\n\treturn TRUE;\n}\n\nINT\tSet_DisConnectAllSta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tMacTableReset(pAd);\n\n\treturn TRUE;\n}\n\n\n#ifdef DOT1X_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set IEEE8021X.\n        This parameter is 1 when 802.1x-wep turn on, otherwise 0\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_IEEE8021X_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    ULONG ieee8021x;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tieee8021x = simple_strtol(arg, 0, 10);\n\n\tif (ieee8021x == 1)\n        pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X = TRUE;\n\telse if (ieee8021x == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_IEEE8021X_Proc::(IEEE8021X=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].IEEE8021X));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set pre-authentication enable or disable when WPA/WPA2 turn on\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_PreAuth_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    ULONG PreAuth;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tPreAuth = simple_strtol(arg, 0, 10);\n\n\tif (PreAuth == 1)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth = TRUE;\n\telse if (PreAuth == 0)\n\t\tpAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_PreAuth_Proc::(PreAuth=%d)\\n\", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth));\n\n\treturn TRUE;\n}\n\nINT\tSet_OwnIPAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32\t\tip_addr;\n\n\tif (rtinet_aton(arg, &ip_addr))\n \t{\n        pAd->ApCfg.own_ip_addr = ip_addr;  \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"own_ip_addr=%s(%x)\\n\", arg, pAd->ApCfg.own_ip_addr));\n\t}\t \n\treturn TRUE;\n}\n\nINT\tSet_EAPIfName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT\t\t\ti;\n\tPSTRING\t\tmacptr;\t\n\n\tfor (i=0, macptr = rstrtok(arg,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t{\n\t\tif (strlen(macptr) > 0)\n\t\t{\n\t\t\tpAd->ApCfg.EAPifname_len[i] = strlen(macptr); \n\t\t\tNdisMoveMemory(pAd->ApCfg.EAPifname[i], macptr, strlen(macptr));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NO.%d EAPifname=%s, len=%d\\n\", i, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.EAPifname[i], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.EAPifname_len[i]));\n\t\t}\n\t}\n\treturn TRUE;\n}\n\nINT\tSet_PreAuthIfName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT\t\t\ti;\n\tPSTRING\t\tmacptr;\t\n\n\tfor (i=0, macptr = rstrtok(arg,\";\"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,\";\"), i++) \n\t{\n\t\tif (strlen(macptr) > 0)\n\t\t{\n\t\t\tpAd->ApCfg.PreAuthifname_len[i] = strlen(macptr); \n\t\t\tNdisMoveMemory(pAd->ApCfg.PreAuthifname[i], macptr, strlen(macptr));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NO.%d PreAuthifname=%s, len=%d\\n\", i,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.PreAuthifname[i], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.PreAuthifname_len[i]));\n\t\t}\n\t}\n\treturn TRUE;\n\n}\n\nINT\tSet_RADIUS_Server_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tPSTRING\t\tmacptr;\t\n\tINT\t\t\tcount;\n\tUINT32\t\tip_addr;\n\tINT\t\t\tsrv_cnt = 0;\n\n\tfor (count = 0, macptr = rstrtok(arg,\";\"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,\";\"), count++) \n\t{\n\t\tif (rtinet_aton(macptr, &ip_addr))\n\t\t{\n\t\t\tPRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];\n\t\t\n\t\t\tpSrvInfo->radius_ip = ip_addr;\n\t\t\tsrv_cnt++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_ip(seq-%d)=%s(%x)\\n\", \n\t\t\t\t\t\t\t\t\t\tapidx, srv_cnt, macptr, \n\t\t\t\t\t\t\t\t\t\tpSrvInfo->radius_ip));\t\t\t\n\t\t}\t    \n\t}\n\n\tif (srv_cnt > 0)\n\t\tpAd->ApCfg.MBSSID[apidx].radius_srv_num = srv_cnt;\n\n\treturn TRUE;\n}\n\nINT\tSet_RADIUS_Port_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tPSTRING\t\tmacptr;\t\n\tINT\t\t\tcount;\n\tINT\t\t\tsrv_cnt = 0;\n\n\tfor (count = 0, macptr = rstrtok(arg,\";\"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,\";\"), count++) \n\t{\t  \n\t\tif (srv_cnt < pAd->ApCfg.MBSSID[apidx].radius_srv_num)\n\t\t{\t\t\n\t\t\tPRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];\n\t\t\t\n        \tpSrvInfo->radius_port = (UINT32) simple_strtol(macptr, 0, 10); \n\t\t\tsrv_cnt ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_port(seq-%d)=%d\\n\", \n\t\t\t\t\t\t\t\t\t  apidx, srv_cnt, pSrvInfo->radius_port));\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nINT\tSet_RADIUS_Key_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t    apidx = pObj->ioctl_if;\n\tPSTRING\t\tmacptr;\t\n\tINT\t\t\tcount;\n\tINT\t\t\tsrv_cnt = 0;\n\n\tfor (count = 0, macptr = rstrtok(arg,\";\"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,\";\"), count++) \n\t{\t  \n\t\tif (strlen(macptr) > 0 && srv_cnt < pAd->ApCfg.MBSSID[apidx].radius_srv_num)\n\t\t{\t\t\n\t\t\tPRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];\n\n\t\t\tpSrvInfo->radius_key_len = strlen(macptr); \n\t\t\tNdisMoveMemory(pSrvInfo->radius_key, macptr, pSrvInfo->radius_key_len);\t\n\t\t\tsrv_cnt ++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d), radius_key(seq-%d)=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\tapidx, srv_cnt,\n\t\t\t\t\t\t\t\t\t\tpSrvInfo->radius_key, \n\t\t\t\t\t\t\t\t\t\tpSrvInfo->radius_key_len));\t\t\t\n\t\t}\n\t}\t\t\t\t\n\treturn TRUE;\n}\n#endif /* DOT1X_SUPPORT */\n\n#ifdef UAPSD_SUPPORT\nINT Set_UAPSD_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tif (simple_strtol(arg, 0, 10) != 0)\n\t\tpAd->ApCfg.MBSSID[0].UapsdInfo.bAPSDCapable = TRUE;\n\telse\n\t\tpAd->ApCfg.MBSSID[0].UapsdInfo.bAPSDCapable = FALSE;\n\n\treturn TRUE;\n}\n#endif /* UAPSD_SUPPORT */\n\n\n\n#ifdef MCAST_RATE_SPECIFIC\nINT Set_McastPhyMode(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUCHAR PhyMode = simple_strtol(arg, 0, 10);\n\n\tpAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\tswitch (PhyMode)\n\t{\n\t\tcase MCAST_DISABLE: /* disable */\n\t\t\tNdisMoveMemory(&pAd->CommonCfg.MCastPhyMode, &pAd->MacTab.Content[MCAST_WCID].HTPhyMode, sizeof(HTTRANSMIT_SETTING));\n\t\t\tbreak;\n\n\t\tcase MCAST_CCK:\t/* CCK */\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_CCK;\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.BW =  BW_20;\n\t\t\tbreak;\n\n\t\tcase MCAST_OFDM:\t/* OFDM */\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_OFDM;\n\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\tcase MCAST_HTMIX:\t/* HTMIX */\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MODE = MODE_HTMIX;\n\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\tdefault:\n\t\t\tprintk(\"unknow Muticast PhyMode %d.\\n\", PhyMode);\n\t\t\tprintk(\"0:Disable 1:CCK, 2:OFDM, 3:HTMIX.\\n\");\n\t\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_McastMcs(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUCHAR Mcs = simple_strtol(arg, 0, 10);\n\n\tif (Mcs > 15)\n\t\tprintk(\"Mcs must in range of 0 to 15\\n\");\n\n\tswitch(pAd->CommonCfg.MCastPhyMode.field.MODE)\n\t{\n\t\tcase MODE_CCK:\n\t\t\tif ((Mcs <= 3) || (Mcs >= 8 && Mcs <= 11))\n\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\telse\n\t\t\t\tprintk(\"MCS must in range of 0 ~ 3 and 8 ~ 11 for CCK Mode.\\n\");\n\t\t\tbreak;\n\n\t\tcase MODE_OFDM:\n\t\t\tif (Mcs > 7)\n\t\t\t\tprintk(\"MCS must in range from 0 to 7 for CCK Mode.\\n\");\n\t\t\telse\n\t\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tpAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;\n\t\t\tbreak;\n\t}\n\n\treturn TRUE;\n}\n\nINT Show_McastRate(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tprintk(\"Mcast PhyMode =%d\\n\", pAd->CommonCfg.MCastPhyMode.field.MODE);\n\tprintk(\"Mcast Mcs =%d\\n\", pAd->CommonCfg.MCastPhyMode.field.MCS);\n\treturn TRUE;\n}\n#endif /* MCAST_RATE_SPECIFIC */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\nINT Set_OBSSScanParam_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING\t\t\targ)\n{\n\t\n\tINT ObssScanValue;\n\tUINT Idx;\n\tPSTRING thisChar;\n\t\n\tIdx = 0;\n\twhile ((thisChar = strsep((char **)&arg, \"-\")) != NULL)\n\t{\n\t\tObssScanValue = (INT) simple_strtol(thisChar, 0, 10);\n\t\tswitch (Idx)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tif (ObssScanValue < 5 || ObssScanValue > 1000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanPassiveDwell(%d), should in range 5~1000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = ObssScanValue;\t/* Unit : TU. 5~1000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanPassiveDwell=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tif (ObssScanValue < 10 || ObssScanValue > 1000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanActiveDwell(%d), should in range 10~1000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = ObssScanValue;\t/* Unit : TU. 10~1000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanActiveDwell=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = ObssScanValue;\t/* Unit : Second */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthTriggerScanInt=%d\\n\", ObssScanValue));\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tif (ObssScanValue < 200 || ObssScanValue > 10000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel(%d), should in range 200~10000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = ObssScanValue;\t/* Unit : TU. 200~10000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tif (ObssScanValue < 20 || ObssScanValue > 10000)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid OBSSScanParam for Dot11OBssScanActiveTotalPerChannel(%d), should in range 20~10000\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = ObssScanValue;\t/* Unit : TU. 20~10000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11OBssScanActiveTotalPerChannel=%d\\n\", ObssScanValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = ObssScanValue;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\\n\", ObssScanValue));\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = ObssScanValue;\t/* Unit : percentage */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\\n\", ObssScanValue));\n\t\t\t\tbreak;\n\t\t}\n\t\tIdx++;\n\t}\n\n\tif (Idx != 7)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Wrong OBSSScanParamtetrs format in ioctl cmd!!!!! Use default value\\n\"));\n\t\t\n\t\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell;\t/* Unit : TU. 5~1000 */\n\t\tpAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell;\t/* Unit : TU. 10~1000 */\n\t\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval;\t/* Unit : Second */\n\t\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel;\t/* Unit : TU. 200~10000 */\n\t\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel;\t/* Unit : TU. 20~10000 */\n\t\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;\n\t\tpAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold;\t/* Unit : percentage */\n\t}\n\tpAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"OBSSScanParam for Dot11BssWidthChanTranDelay=%ld\\n\", pAd->CommonCfg.Dot11BssWidthChanTranDelay));\n\t\n\treturn TRUE;\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\nINT Set_EntryLifeCheck_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING\t\t\targ)\n{\n\tULONG LifeCheckCnt = (ULONG) simple_strtol(arg, 0, 10);\n\n\tif (LifeCheckCnt <= 65535)\n\t\tpAd->ApCfg.EntryLifeCheck = LifeCheckCnt;\n\telse\n\t\tprintk(\"LifeCheckCnt must in range of 0 to 65535\\n\");\n\n\tprintk(\"EntryLifeCheck Cnt = %ld.\\n\", pAd->ApCfg.EntryLifeCheck);\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tApCfg_Set_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tINT\t\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ)\n{\n\tif ((strcmp(arg, \"WEPAUTO\") == 0) || (strcmp(arg, \"wepauto\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeAutoSwitch;\n\telse if ((strcmp(arg, \"OPEN\") == 0) || (strcmp(arg, \"open\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\telse if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeShared;\n\telse if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPAPSK;\n\telse if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA2PSK;\n\telse if ((strcmp(arg, \"WPAPSKWPA2PSK\") == 0) || (strcmp(arg, \"wpapskwpa2psk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA1PSKWPA2PSK;\n#ifdef DOT1X_SUPPORT\n\telse if ((strcmp(arg, \"WPA\") == 0) || (strcmp(arg, \"wpa\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA;\n\telse if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"wpa2\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA2;\n\telse if ((strcmp(arg, \"WPA1WPA2\") == 0) || (strcmp(arg, \"wpa1wpa2\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA1WPA2;\n#endif /* DOT1X_SUPPORT */\n#ifdef WAPI_SUPPORT\n\telse if ((strcmp(arg, \"WAICERT\") == 0) || (strcmp(arg, \"waicert\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWAICERT;\n\telse if ((strcmp(arg, \"WAIPSK\") == 0) || (strcmp(arg, \"waipsk\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWAIPSK;\n#endif /* WAPI_SUPPORT */\t\n\telse\n\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;  \n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d)::AuthMode=%d\\n\", apidx, pAd->ApCfg.MBSSID[apidx].AuthMode));\t\t\n\n\treturn TRUE;\n}\n\nINT\tApCfg_Set_MaxStaNum_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN INT\t\t\t\tapidx,\n\tIN PSTRING \t\t\targ)\n{\n\tpAd->ApCfg.MBSSID[apidx].MaxStaNum = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) %s::(MaxStaNum=%d)\\n\", \n\t\t\t\t\tapidx, __FUNCTION__, pAd->ApCfg.MBSSID[apidx].MaxStaNum));\n\treturn TRUE;\n}\n\nINT\tApCfg_Set_IdleTimeout_Proc(\n\tIN PRTMP_ADAPTER \tpAd, \n\tIN PSTRING \t\t\targ)\n{\n\tLONG idle_time;\n\n\tidle_time = simple_strtol(arg, 0, 10);\n\n\tif (idle_time < MAC_TABLE_MIN_AGEOUT_TIME)\n\t\tpAd->ApCfg.StaIdleTimeout = MAC_TABLE_MIN_AGEOUT_TIME;\n\telse\n\t\tpAd->ApCfg.StaIdleTimeout = idle_time;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : IdleTimeout=%d\\n\", __FUNCTION__, pAd->ApCfg.StaIdleTimeout));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_MemDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef VENDOR_FEATURE2_SUPPORT\n\tprintk(\"Number of Packet Allocated = %lu\\n\", OS_NumOfPktAlloc);\n\tprintk(\"Number of Packet Freed = %lu\\n\", OS_NumOfPktFree);\n\tprintk(\"Offset of Packet Allocated/Freed = %lu\\n\", OS_NumOfPktAlloc - OS_NumOfPktFree);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\treturn TRUE;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tSet power save life time.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tSet_PowerSaveLifeTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->MacTab.MsduLifeTime = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set new life time = %d\\n\", pAd->MacTab.MsduLifeTime));\n\treturn TRUE;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef MBSS_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tShow MBSS information.\n\nArguments:\n\tpAd\t\t\t\t\t- WLAN control block pointer\n\tArg\t\t\t\t\t- Input arguments\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT\tShow_MbssInfo_Display_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32 IdBss;\n\tUCHAR PhyMode;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\\tBSS Idx\\t\\tPhy Mode\\n\"));\n\n\tfor(IdBss=0; IdBss<=pAd->ApCfg.BssidNum; IdBss++)\n\t{\n\t\tif (IdBss == 0)\n\t\t{\n\t\t\tPhyMode = pAd->CommonCfg.PhyMode;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\tMAX\\t\\t\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPhyMode = pAd->ApCfg.MBSSID[IdBss-1].PhyMode;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\t%d\\t\\t\", IdBss-1));\n\t\t}\n\n\t\tswitch(PhyMode)\n\t\t{\n\t\t\tcase PHY_11BG_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BG Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11B:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"B Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11A:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"A Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11ABG_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ABG Mixed ==> BG Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11G:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"G Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11ABGN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ABGN Mixed ==> BGN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11N_2_4G:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2.4G N Only\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11GN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"GN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11AN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11BGN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BGN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11AGN_MIXED:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AGN Mixed\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase PHY_11N_5G:\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"5G N Only\\n\"));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\"));\n\n\treturn TRUE;\n}\n#endif /* MBSS_SUPPORT */\n\n\n#ifdef HOSTAPD_SUPPORT\nVOID RtmpHostapdSecuritySet(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrqin)\n{\n\tif(wrqin->u.data.length > 20 && MAX_LEN_OF_RSNIE > wrqin->u.data.length && wrqin->u.data.pointer)\n\t{\n\t\tUCHAR RSNIE_Len[2];\n\t\tUCHAR RSNIe[2];\n\t\tint offset_next_ie=0;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ioctl SIOCSIWGENIE pAd->IoctlIF=%d\\n\",apidx));\n\n\t\tRSNIe[0]=*(UINT8 *)wrqin->u.data.pointer;\n\t\tif(IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0] )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IE %02x != 0x30/0xdd\\n\",RSNIe[0]));\n\t\t\tStatus = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t\tRSNIE_Len[0]=*((UINT8 *)wrqin->u.data.pointer + 1);\n\t\tif(wrqin->u.data.length != RSNIE_Len[0]+2)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IE use WPA1 WPA2\\n\"));\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], MAX_LEN_OF_RSNIE);\n\t\t\tRSNIe[1]=*(UINT8 *)wrqin->u.data.pointer;\n\t\t\tRSNIE_Len[1]=*((UINT8 *)wrqin->u.data.pointer + 1);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,( \"IE1 %02x %02x\\n\",RSNIe[1],RSNIE_Len[1]));\n\t\t\tpAd->ApCfg.MBSSID[apidx].RSNIE_Len[1] = RSNIE_Len[1];\n\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], (UCHAR *)(wrqin->u.data.pointer)+2, RSNIE_Len[1]);\n\t\t\toffset_next_ie=RSNIE_Len[1]+2;\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IE use only %02x\\n\",RSNIe[0]));\n\n\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], MAX_LEN_OF_RSNIE);\n\t\tRSNIe[0]=*(((UINT8 *)wrqin->u.data.pointer)+offset_next_ie);\n\t\tRSNIE_Len[0]=*(((UINT8 *)wrqin->u.data.pointer) + offset_next_ie + 1);\n\t\tif(IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0] )\n\t\t{\n\t\t\tStatus = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t\tpAd->ApCfg.MBSSID[apidx].RSNIE_Len[0] = RSNIE_Len[0];\n\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], ((UCHAR *)(wrqin->u.data.pointer))+2+offset_next_ie, RSNIE_Len[0]);\n\t\tAPMakeAllBssBeacon(pAd);\n\t\tAPUpdateAllBeaconFrame(pAd);\n\t}\n}\n#endif /* HOSTAPD_SUPPORT */\n\n\n/*\n========================================================================\nRoutine Description:\n\tDriver Ioctl for AP.\n\nArguments:\n\tpAdSrc\t\t\t- WLAN control block pointer\n\twrq\t\t\t\t- the IOCTL parameters\n\tcmd\t\t\t\t- the command ID\n\tsubcmd\t\t\t- the sub-command ID\n\tpData\t\t\t- the IOCTL private data pointer\n\tData\t\t\t- the IOCTL private data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\t- IOCTL OK\n\tOtherwise\t\t\t- IOCTL fail\n\nNote:\n========================================================================\n*/\nINT RTMP_AP_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPOS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n\n\tswitch(cmd)\n\t{\n\t\tcase CMD_RTPRIV_IOCTL_SET:\n\t\t\tStatus = RTMPAPPrivIoctlSet(pAd, wrq);\n\t\t\tbreak;\n\n\t\tcase CMD_RT_PRIV_IOCTL:\n\t\t\tif (subcmd & OID_GET_SET_TOGGLE)\n\t\t\t\tStatus = RTMPAPSetInformation(pAd, wrq,  (INT)subcmd);\n\t\t\telse\n\t\t\t{\n#ifdef LLTD_SUPPORT\n\t\t\t\tif (subcmd == RT_OID_GET_PHY_MODE)\n\t\t\t\t{\n\t\t\t\t\tif(pData != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tUINT modetmp = 0;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::Get phy mode (%02X) \\n\", pAd->CommonCfg.PhyMode));\n\t\t\t\t\t\tmodetmp = (UINT) pAd->CommonCfg.PhyMode;\n\t\t\t\t\t\twrq->u.data.length = 1;\n\t\t\t\t\t\t/**(ULONG *)pData = (ULONG)pAd->CommonCfg.PhyMode; */\n\t\t\t\t\t\tif (copy_to_user(pData, &modetmp, wrq->u.data.length))\n\t\t\t\t\t\t\tStatus = -EFAULT;\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t\telse\n#endif /* LLTD_SUPPORT */\n\t\t\t\t\tStatus = RTMPAPQueryInformation(pAd, wrq, (INT)subcmd);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SHOW:\n\t\t\tStatus = RTMPAPPrivIoctlShow(pAd, wrq);\n\t\t\tbreak;\n\n#ifdef WSC_AP_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_SET_WSCOOB:\n\t\t\tRTMPIoctlSetWSCOOB(pAd);\n\t\t    break;\n#endif/*WSC_AP_SUPPORT*/\n\n\t\tcase CMD_RTPRIV_IOCTL_GET_MAC_TABLE:\n\t\t\tRTMPIoctlGetMacTable(pAd,wrq);\n\t\t    break;\n\n#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)\n\t\tcase CMD_RTPRIV_IOCTL_GSITESURVEY:\n\t\t\tRTMPIoctlGetSiteSurvey(pAd,wrq);\n\t\t\tbreak;\n#endif /* AP_SCAN_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_STATISTICS:\n\t\t\tRTMPIoctlStatistics(pAd, wrq);\n\t\t\tbreak;\n\n#ifdef WSC_AP_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_WSC_PROFILE:\n\t\t    RTMPIoctlWscProfile(pAd, wrq);\n\t\t    break;\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_QUERY_BATABLE:\n\t\t    RTMPIoctlQueryBaTable(pAd, wrq);\n\t\t    break;\n#endif /* DOT11_N_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_E2P:\n\t\t\tRTMPAPIoctlE2PROM(pAd, wrq);\n\t\t\tbreak;\n\n#ifdef DBG\n\t\tcase CMD_RTPRIV_IOCTL_BBP:\n\t\t\tRTMPAPIoctlBBP(pAd, wrq);\n\t\t\tbreak;\n\t\t\t\n\t\tcase CMD_RTPRIV_IOCTL_MAC:\n\t\t\tRTMPAPIoctlMAC(pAd, wrq);\n\t\t\tbreak;\n            \n#endif /* DBG */\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_GET_AR9_SHOW:\n\t\t\tStatus = RTMPAPPrivIoctlAR9Show(pAd, wrq);\n\t\t\tbreak;\n#endif /*AR9_MAPI_SUPPORT*/\n#endif/* INF_AR9 */\n\n\t\tcase CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT:\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR:\n            if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd))\n    \t\t\tNdisCopyMemory((PSTRING) wrq->u.name, (PSTRING) pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid, 6);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID:\n\t\t{\n\t\t\tRT_CMD_AP_IOCTL_SSID *pSSID = (RT_CMD_AP_IOCTL_SSID *)pData;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (pSSID->priv_flags == INT_APCLI)\n\t\t\t{\n\t\t\t\tif (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE)\n\t\t\t\t{\n\t\t\t\t\tpSSID->length = pAd->ApCfg.ApCliTab[pObj->ioctl_if].SsidLen;\n\t\t\t\t\tpSSID->pSsidStr = (char *)&pAd->ApCfg.ApCliTab[pObj->ioctl_if].Ssid;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpSSID->length = 0;\n\t\t\t\t\tpSSID->pSsidStr = NULL;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tif (P2P_CLI_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tpSSID->length = pAd->ApCliMlmeAux.SsidLen;\n\t\t\t\t\tpSSID->pSsidStr = (char *)pAd->ApCliMlmeAux.Ssid;\n\t\t\t\t}\n\t\t\t\telse if (P2P_GO_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tpSSID->length = pAd->ApCfg.MBSSID[pSSID->apidx].SsidLen;\n\t\t\t\t\tpSSID->pSsidStr = (char *)pAd->ApCfg.MBSSID[pSSID->apidx].Ssid;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpSSID->length = 0;\n\t\t\t\t\tpSSID->pSsidStr = NULL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n#ifdef MBSS_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_BEACON_UPDATE:\n\t\t\tAPMakeAllBssBeacon(pAd);\n\t\t\tAPUpdateAllBeaconFrame(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_OPEN:\n\t\t\tif (MBSS_Open(pData) != 0)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_CLOSE:\n\t\t\tMBSS_Close(pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_INIT:\n\t\t\tMBSS_Init(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MBSS_REMOVE:\n\t\t\tMBSS_Remove(pAd);\n\t\t\tbreak;\n#endif /* MBSS_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_WSC_INIT:\n\t\t{\n#ifdef APCLI_SUPPORT\n#ifdef WSC_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\t\tPWSC_V2_INFO\tpWscV2Info;\n#endif /* WSC_V2_SUPPORT */\n\t\t\tAPCLI_STRUCT *pApCliEntry = (APCLI_STRUCT *)pData;\n\t\t\tWscGenerateUUID(pAd, &pApCliEntry->WscControl.Wsc_Uuid_E[0],\n\t\t\t\t\t\t&pApCliEntry->WscControl.Wsc_Uuid_Str[0], 0, FALSE);\n\t\t\tpApCliEntry->WscControl.bWscFragment = FALSE;\n\t\t\tpApCliEntry->WscControl.WscFragSize = 128;\n\t\t\tpApCliEntry->WscControl.WscRxBufLen = 0;\n\t\t\tpApCliEntry->WscControl.pWscRxBuf = NULL;\n\t\t\tos_alloc_mem(pAd, &pApCliEntry->WscControl.pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tif (pApCliEntry->WscControl.pWscRxBuf)\n\t\t\t\tNdisZeroMemory(pApCliEntry->WscControl.pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tpApCliEntry->WscControl.WscTxBufLen = 0;\n\t\t\tpApCliEntry->WscControl.pWscTxBuf = NULL;\n\t\t\tos_alloc_mem(pAd, &pApCliEntry->WscControl.pWscTxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tif (pApCliEntry->WscControl.pWscTxBuf)\n\t\t\t\tNdisZeroMemory(pApCliEntry->WscControl.pWscTxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tinitList(&pApCliEntry->WscControl.WscPeerList);\n\t\t\tNdisAllocateSpinLock(pAd, &pApCliEntry->WscControl.WscPeerListSemLock);\n\t\t\tpApCliEntry->WscControl.PinAttackCount = 0;\n\t\t\tpApCliEntry->WscControl.bSetupLock = FALSE;\n#ifdef WSC_V2_SUPPORT\n\t\t\tpWscV2Info = &pApCliEntry->WscControl.WscV2Info;\n\t\t\tpWscV2Info->bWpsEnable = TRUE;\n\t\t\tpWscV2Info->ExtraTlv.TlvLen = 0;\n\t\t\tpWscV2Info->ExtraTlv.TlvTag = 0;\n\t\t\tpWscV2Info->ExtraTlv.pTlvData = NULL;\n\t\t\tpWscV2Info->ExtraTlv.TlvType = TLV_ASCII;\n\t\t\tpWscV2Info->bEnableWpsV2 = TRUE;\n#endif /* WSC_V2_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\t\t\tWscInit(pAd, TRUE, Data);\n#endif /* WSC_AP_SUPPORT */\n\t\t}\n\t\t\tbreak;\n\n#ifdef APCLI_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_APC_UP:\n\t\t\tApCliIfUp(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_DISCONNECT:\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, Data);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\tbreak;\n\t\tcase CMD_RTPRIV_IOCTL_APC_OPEN:\n\t\t\tif (ApCli_Open(pAd, pData) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_CLOSE:\n\t\t\tif (ApCli_Close(pAd, pData) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_APC_REMOVE:\n\t\t\tApCli_Remove(pAd);\n\t\t\tbreak;\n#endif /* APCLI_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_MAIN_OPEN:\n\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_PREPARE:\n\t\t{\n\t\t\tRT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pData;\n\t\t\tpConfig->Status = RTMP_AP_IoctlPrepare(pAd, pData);\n\t\t\tif (pConfig->Status != 0)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWAP:\n\t\t{\n\t\t\tUCHAR *pBssidDest = (UCHAR *)pData;\n\t\t\tPCHAR pBssidStr;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (Data == INT_APCLI)\n\t\t\t{\n\t\t\t\tif (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE)\n\t\t\t\t\tpBssidStr = (PCHAR)&APCLI_ROOT_BSSID_GET(pAd, pAd->ApCfg.ApCliTab[pObj->ioctl_if].MacTabWCID);\n\t\t\t\telse\n\t\t\t\t\tpBssidStr = NULL;\n\t\t\t}\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tpBssidStr = (PCHAR) &pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid[0];\n\t\t\t}\n\n\t\t\tif (pBssidStr != NULL)\n\t\t\t{\n\t\t\t\tmemcpy(pBssidDest, pBssidStr, ETH_ALEN);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t\t\t\tpBssidStr[0],pBssidStr[1],pBssidStr[2], pBssidStr[3],pBssidStr[4],pBssidStr[5]));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmemset(pBssidDest, 0, ETH_ALEN);\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:\n\t\t/* handle for SIOCGIWRATEQ */\n\t\t{\n\t\t\tRT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData;\n\t\t\tHTTRANSMIT_SETTING HtPhyMode;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (pRate->priv_flags == INT_APCLI)\n\t\t\t\tHtPhyMode = pAd->ApCfg.ApCliTab[pObj->ioctl_if].HTPhyMode;\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tHtPhyMode = pAd->ApCfg.MBSSID[pObj->ioctl_if].HTPhyMode;\n\n#ifdef MBSS_SUPPORT\n\t\t\t\t/* reset phy mode for MBSS */\n\t\t\t\tMBSS_PHY_MODE_RESET(pObj->ioctl_if, HtPhyMode);\n#endif /* MBSS_SUPPORT */\n\t\t\t}\n\t\t\tRtmpDrvMaxRateGet(pAd, HtPhyMode.field.MODE, HtPhyMode.field.ShortGI,\n\t\t\t\t\t\t\tHtPhyMode.field.BW, HtPhyMode.field.MCS,\n\t\t\t\t\t\t\t(UINT32 *)&pRate->BitRate);\n\t\t}\n\t\t\tbreak;\n\n#ifdef HOSTAPD_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:\n\t\t\tRtmpHostapdSecuritySet(pAd, wrq);\n\t\t\tbreak;\n#endif /* HOSTAPD_SUPPORT */\n\n\t\tdefault:\n\t\t\tStatus = RTMP_COM_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data);\n\t\t\tbreak;\n\t}\n\n\treturn Status;\n}\n\n#ifdef P2P_SUPPORT\nINT Set_P2p_OpMode_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tUINT OpMode;\n\tPOS_COOKIE pObj;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\t\n\tOpMode = simple_strtol(arg, 0, 16);\n\n\t\n\tif (OpMode == OPMODE_AP)\n\t{\n\t\tif (P2P_CLI_ON(pAd))\n\t\t\tP2P_CliStop(pAd);\n\n\t\tif ((!P2P_GO_ON(pAd)) || (P2P_GO_ON(pAd)))\n\t\t{\n\t\t\tP2PCfgInit(pAd);\n\t\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t\t}\n\t}\n\telse if (OpMode == OPMODE_APSTA)\n\t{\n\t\tif (P2P_GO_ON(pAd))\n\t\t\tP2P_GoStop(pAd);\n\n\t\tif ((!P2P_CLI_ON(pAd)) || (P2P_CLI_ON(pAd)))\n\t\t{\n\t\t\tP2PCfgInit(pAd);\n\t\t\tP2P_CliStartUp(pAd);\n\t\t\tAsicEnableBssSync(pAd);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (P2P_CLI_ON(pAd))\n\t\t\tP2P_CliStop(pAd);\n\t\telse if (P2P_GO_ON(pAd))\n\t\t{\n\t\t\tP2P_GoStop(pAd);\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t\tAsicEnableBssSync(pAd);\n\t\t}\n\t\tP2PCfgInit(pAd);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2p_OpMode_Proc::(OpMode = %d)\\n\", pObj->ioctl_if, OpMode));\n\n\treturn TRUE;\n}\n\nINT Set_P2pCli_Enable_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tUINT Enable;\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tEnable = simple_strtol(arg, 0, 16);\n\n\tpAd->ApCfg.ApCliTab[ifIndex].Enable = (Enable > 0) ? TRUE : FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2pCli_Enable_Proc::(enable = %d)\\n\", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].Enable));\n\t\n\tApCliIfDown(pAd);\n\n\treturn TRUE;\n}\n\n\nINT Set_P2pCli_Ssid_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn;\n\tINT success = FALSE;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tif(strlen(arg) <= MAX_LEN_OF_SSID)\n\t{\n\t\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t\t/* bring apcli interface down first */\n\t\tif(apcliEn == TRUE )\n\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;\n\t\t\tApCliIfDown(pAd);\n\t\t}\n\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);\n\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, arg, strlen(arg));\n\t\tpAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength = (UCHAR)strlen(arg);\n\n\t\tsuccess = TRUE;\n\n\t\t/* Upadte PMK and restart WPAPSK state machine for ApCli link */\n\t\tif (((pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t(pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK)) && \n\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PSKLen > 0)\n\t\t{\n\t\t\tRT_CfgSetWPAPSKKey(pAd, (PSTRING)pAd->ApCfg.ApCliTab[ifIndex].PSK, pAd->ApCfg.ApCliTab[ifIndex].PSKLen, \n\t\t\t\t\t\t\t\t\t(PUCHAR)pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].PMK);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2pCli_Ssid_Proc::(Len=%d,Ssid=%s)\\n\", ifIndex,\n\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid));\n\n\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;\n\t}\n\telse\n\t\tsuccess = FALSE;\n\n\treturn success;\n}\n\n\nINT Set_P2pCli_Bssid_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tINT i;\n\tPSTRING value;\n\tUCHAR ifIndex;\n\tBOOLEAN apcliEn;\n\tPOS_COOKIE pObj;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\t\n\tapcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;\n\n\t/* bring apcli interface down first */\n\tif(apcliEn == TRUE )\n\t{\n\t\tpAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;\n\t\tApCliIfDown(pAd);\n\t}\n\n\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN);\n\n\tif(strlen(arg) == 17)  /* Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t{\n\t\tfor (i=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\"), i++) \n\t\t{\n\t\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\t\treturn FALSE;  /* Invalid */\n\n\t\t\tAtoH(value, &pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[i], 1);\n\t\t}\n\n\t\tif(i != 6)\n\t\t\treturn FALSE;  /* Invalid */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_P2pCli_Bssid_Proc (%2X:%2X:%2X:%2X:%2X:%2X)\\n\",\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[0],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[1],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[2],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[3],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[4],\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[5]));\n\n\t\tNdisMoveMemory(pAd->P2pCfg.Bssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN);\n\n\n\tpAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set ApCli-IF Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG       i;\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\tifIndex;\n\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tif ((strncmp(arg, \"WEPAUTO\", 7) == 0) || (strncmp(arg, \"wepauto\", 7) == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeAutoSwitch;\n\telse if ((strncmp(arg, \"SHARED\", 6) == 0) || (strncmp(arg, \"shared\", 6) == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeShared;\n\telse if ((strncmp(arg, \"WPAPSK\", 6) == 0) || (strncmp(arg, \"wpapsk\", 6) == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPAPSK;\n\telse if ((strncmp(arg, \"WPA2PSK\", 7) == 0) || (strncmp(arg, \"wpa2psk\", 7) == 0))\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA2PSK;\n\telse\n\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeOpen;\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tif (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))\n\t\t{\n\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t}\n\t}\n\t\t\n    RTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].AuthMode, pAd->ApCfg.ApCliTab[ifIndex].WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\n\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId  = 0;\n\n\tif(pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA)\n\t\tpAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = 1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_AuthMode_Proc::(AuthMode=%d)\\n\", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].AuthMode));\t\t\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set ApCli-IF Encryption Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_EncrypType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\tifIndex;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled; \n\tif ((strncmp(arg, \"WEP\", 3) == 0) || (strncmp(arg, \"wep\", 3) == 0))\n    {\n\t\tif (pApCliEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11WEPEnabled;\t\t\t\t  \n\t}\n\telse if ((strncmp(arg, \"TKIP\", 4) == 0) || (strncmp(arg, \"tkip\", 4) == 0))\n\t{\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption2Enabled;                       \n    }\n\telse if ((strncmp(arg, \"AES\", 3) == 0) || (strncmp(arg, \"aes\", 3) == 0))\n\t{\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpApCliEntry->WepStatus = Ndis802_11Encryption3Enabled;                            \n\t}    \n\telse\n\t{\n\t\tpApCliEntry->WepStatus = Ndis802_11WEPDisabled;                 \n\t}\n\n\tpApCliEntry->PairCipher     = pApCliEntry->WepStatus;\n\tpApCliEntry->GroupCipher    = pApCliEntry->WepStatus;\n\tpApCliEntry->bMixCipher\t\t= FALSE;\n\n\tif (pApCliEntry->WepStatus >= Ndis802_11Encryption2Enabled)\n\t\tpApCliEntry->DefaultKeyId = 1;\n\n\tRTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_EncrypType_Proc::(EncrypType=%d)\\n\", ifIndex, pApCliEntry->WepStatus));\n\n\treturn TRUE;\n}\n\n\n\n/* \n    ==========================================================================\n    Description:\n        Set Default Key ID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_DefaultKeyID_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tULONG \t\t\tKeyIdx;\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tKeyIdx = simple_strtol(arg, 0, 10);\n\tif((KeyIdx >= 1 ) && (KeyIdx <= 4))\n\t\tpApCliEntry->DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n\telse\n\t\treturn FALSE;  /* Invalid argument  */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\\n\", ifIndex, pApCliEntry->DefaultKeyId));\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key for ApCli link\n\n    Arguments:\n        pAdapter            Pointer to our adapter\n        arg                 WPA pre-shared key string\n\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_WPAPSK_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR ifIndex;\n\tPOS_COOKIE pObj;\n\tPAPCLI_STRUCT   pApCliEntry = NULL;\n\tINT retval;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_WPAPSK_Proc::(WPAPSK=%s)\\n\", ifIndex, arg));\n\n\tretval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pApCliEntry->PMK);\n\tif (retval == FALSE)\n\t\treturn FALSE;\n\t\n\tNdisMoveMemory(pApCliEntry->PSK, arg, strlen(arg));\n\tpApCliEntry->PSKLen = strlen(arg);\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY1 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_Key1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\t\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[0], 0);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_Key1_Proc::(Key1=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n\t\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY2 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_Key2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[1], 1);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_Key2_Proc::(Key2=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY3 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_Key3_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[2], 2);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_Key3_Proc::(Key3=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY4 for ApCli-IF\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_P2pCli_Key4_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\tUCHAR\t\t\tifIndex;\n\tINT\t\t\t\tretVal;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tretVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[3], 3);\n\tif(retVal == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(p2p%d) Set_P2pCli_Key4_Proc::(Key4=%s) success!\\n\", ifIndex, arg));\n\t\n\treturn retVal;\n}\n\nINT Set_P2pCli_TxMode_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\t\n\tPOS_COOKIE \t\tpObj;\t\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode = \n\t\t\t\t\t\t\t\tRT_CfgSetFixedTxPhyMode(arg);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2pCli_TxMode_Proc = %d\\n\", ifIndex,\n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.FixedTxMode));\n\n\treturn TRUE;\n}\n\nINT Set_P2pCli_TxMcs_Proc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PSTRING arg)\n{\n\tPOS_COOKIE \t\tpObj;\n\tUCHAR \t\t\tifIndex;\n\tPAPCLI_STRUCT\tpApCliEntry = NULL;\n\t\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tifIndex = pObj->ioctl_if;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->DesiredTransmitSetting.field.MCS = \n\t\t\tRT_CfgSetTxMCSProc(arg, &pApCliEntry->bAutoTxRateSwitch);\n\n\tif (pApCliEntry->DesiredTransmitSetting.field.MCS == MCS_AUTO)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2pCli_TxMcs_Proc = AUTO\\n\", ifIndex));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2pCli_TxMcs_Proc = %d\\n\", ifIndex, \n\t\t\t\t\t\t\t\t\tpApCliEntry->DesiredTransmitSetting.field.MCS));\n\t}\t\n\n\treturn TRUE;\n}\n\n#ifdef WSC_AP_SUPPORT\nINT Set_P2pCli_WscSsid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    POS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n    UCHAR\t\t\tifIndex = pObj->ioctl_if;\n\tPWSC_CTRL\t    pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl;\n\n    if (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n    \n\tNdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));\n\n\tif ( (strlen(arg) > 0) && (strlen(arg) <= MAX_LEN_OF_SSID))\n\t{\n\t\tNdisMoveMemory(pWscControl->WscSsid.Ssid, arg, strlen(arg));\n\t\tpWscControl->WscSsid.SsidLength = strlen(arg);\n\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));\n\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(p2p%d) Set_P2pCli_WscSsid_Proc:: (Select SsidLen=%d,Ssid=%s)\\n\", ifIndex, \n\t\t\t\tpWscControl->WscSsid.SsidLength, pWscControl->WscSsid.Ssid));\n\t}\n\telse\n\t\treturn FALSE;\t/* Invalid argument  */\n\n\treturn TRUE;\t\n\n}\n#endif /* WSC_AP_SUPPORT */\n\n\nINT Set_P2P_ProvAccept_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry;\n\tULONG\tFrameLen;\n\tUCHAR\tp2pindex;\n\tUINT bAccept;\n\tUSHORT\tPeerWscMethod;\n\n\tbAccept = simple_strtol(arg, 0, 10);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_P2P_ProvAccept_Proc = %d\\n\", bAccept ));\n\n\tif ( pP2PCtrl->bProvAutoRsp == TRUE )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pP2PCtrl->bProvAutoRsp == TRUE\\n\" ));\n\t\treturn TRUE;\n\t}\n\n\tp2pindex = pP2PCtrl->P2pProvIndex;\n\tif (p2pindex == P2P_NOT_FOUND )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P_NOT_FOUND\\n\" ));\n\t\treturn TRUE;\n\t}\n\telse\n\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\n\tpP2pEntry->P2pClientState = P2PSTATE_SENT_PROVISION_RSP;\n\n\tif (bAccept)\n\t{\n\t\t/* Update My WPS Configuration. */\n\t\tP2P_SetWscRule(pAd, p2pindex, &PeerWscMethod);\n\t\t/* Update Sigma.ConfigMethod after finished provision procedure. */\n\t\tP2P_SET_FLAG(&pAd->P2pTable.Client[p2pindex], P2PFLAG_PROVISIONED);\n\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\tpP2PCtrl->P2pProvUserNotify = 1;\n\t\tP2PSendProvisionRsp(pAd, pP2PCtrl->P2pProvConfigMethod, pP2PCtrl->P2pProvToken, pP2PCtrl->ConnectingMAC, &FrameLen);\n\t\tif (P2P_GO_ON(pAd))\n\t\t\tP2pSetWps(pAd, pP2pEntry);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Accept Provision Req ==>ConfigMethod = %s \\n\", decodeConfigMethod(pP2PCtrl->P2pProvConfigMethod)));\n\t\t\n\t}\n\telse\n\t{\n\t\tpP2PCtrl->P2pProvIndex = P2P_NOT_FOUND;\n\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\tpAd->P2pCfg.P2pCounter.UserAccept = 0;\n\t\tpP2PCtrl->P2pProvUserNotify = 2;\n\t\tP2PSendProvisionRsp(pAd, 0, pP2PCtrl->P2pProvToken, pP2PCtrl->ConnectingMAC, &FrameLen);\n\t}\n\treturn TRUE;\n}\n\nINT Set_P2p_WscManufacturer_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\t\tifIndex = pObj->ioctl_if;\n\tPRT_P2P_CONFIG\tpP2PCtrl;\n\t\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tpP2PCtrl = &pAd->P2pCfg;\n\n\tif ( (strlen(arg) > 0) && (strlen(arg) <= WSC_MANUFACTURE_LEN))\n\t{\n\t\tNdisMoveMemory(pP2PCtrl->Manufacturer, arg, strlen(arg));\n\t\tpP2PCtrl->ManufacturerLen = strlen(arg);\n\t}\n\telse\n\t\treturn FALSE;\t/* Invalid argument  */\n\n\treturn TRUE;\t\n}\n\nINT Set_P2p_WscModelName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\t\tifIndex = pObj->ioctl_if;\n\tPRT_P2P_CONFIG\tpP2PCtrl;\n\t\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tpP2PCtrl = &pAd->P2pCfg;\n    \n\tif ( (strlen(arg) > 0) && (strlen(arg) <= WSC_MODELNAME_LEN))\n\t{\n\t\tNdisMoveMemory(pP2PCtrl->ModelName, arg, strlen(arg));\n\t\tpP2PCtrl->ModelNameLen = strlen(arg);\n\t}\n\telse\n\t\treturn FALSE;\t/* Invalid argument  */\n\n\treturn TRUE;\t\n}\n\nINT Set_P2p_WscModelNumber_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\t\tifIndex = pObj->ioctl_if;\n\tPRT_P2P_CONFIG\tpP2PCtrl;\n\t\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tpP2PCtrl = &pAd->P2pCfg;\n    \n\tif ( (strlen(arg) > 0) && (strlen(arg) <= WSC_MODELNUNBER_LEN))\n\t{\n\t\tNdisMoveMemory(pP2PCtrl->ModelNumber, arg, strlen(arg));\n\t\tpP2PCtrl->ModelNumberLen = strlen(arg);\n\t}\n\telse\n\t\treturn FALSE;\t/* Invalid argument  */\n\n\treturn TRUE;\t\n}\nINT Set_P2p_WscSerialNumber_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE \t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tUCHAR\t\t\tifIndex = pObj->ioctl_if;\n\tPRT_P2P_CONFIG\tpP2PCtrl;\n\t\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tpP2PCtrl = &pAd->P2pCfg;\n    \n\tif ( (strlen(arg) > 0) && (strlen(arg) <= WSC_SERIALNUNBER_LEN))\n\t{\n\t\tNdisMoveMemory(pP2PCtrl->SerialNumber, arg, strlen(arg));\n\t\tpP2PCtrl->SerialNumberLen =  strlen(arg);\n\t}\n\telse\n\t\treturn FALSE;\t/* Invalid argument  */\n\n\treturn TRUE;\t\n}\n\n#endif /* P2P_SUPPORT */\n"
  },
  {
    "path": "src/common/p2p_ctrl.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p_ctrl.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. P2P is a Task Group of WFA.\n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\n*/\n#include \"rt_config.h\"\n\nstatic VOID P2PCtrlDiscoveryAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PCtrlDiscoveryCancelAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PCtrlDiscoveryDoneAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PCtrlGroupFormationAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PCtrlGroupFormationDoneAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThe mesh control state machine, \n\tParameters:\n\t\tSm - pointer to the state machine\n\tNote:\n\t\tthe state machine looks like the following\n\t==========================================================================\n */\n\t\n #ifdef RELEAE_EXCLUDE\n/*\n\t\t\t\t\t\t\tScan command\t\t\tP2P Periodic\t\t\t\tP2P Scan\t\t\t\t\t\t\tCntlOidScanProc \t\t\tMlmeCntlMachinePerformAction\t\t\t\t\t\t  P2P Periodic\n\tP2P_ENABLE_LISTEN_ONLY ---------------> P2P_IDLE -----------> P2P_SEARCH ---------> P2P_SEARCH_COMMAND ---------------> P2P_SEARCH ---------------------------> P2P_SEARCH_COMPLETE -----------> P2P_IDLE\n\tMeshCtrlJoinAction : \n\t\t. Init Bss Table\n\t\t. Init Mesh Channel\n\t\t. enqueue SYNC_STATE_MACHINE with MT2_MLME_SCAN_REQ\n\tScanNextChannel :\n\t\t. scan done, enequeue MESH_CTRL_STATE_MACHINE with APMT2_MLME_SCAN_FINISH\n\n\tP2PCtrlJoinAction\n\t\t. Init P2P Table\n\t\t. Init random timer\n\t\t. enqueeue SYNC_STATE_MACHINE with MT2_MLME_SCAN_REQ\n\tScanNextChannel :\n\t\t. scan done, enequeue P2P_CTRL_STATE_MACHINE with P2P_SCAN_FINISH\n\tP2PCtrlFinishDiscoveryAction :\n\t\t. Init ScanNextRound\n\t\t. change in P2P_IDLE\n*/\n\t\n/*\n\n\tP2P_CTRL_IDLE : do not scan / search / listen.\n\t\t\t\t\tp2p interface up then in IDLE state, or after change as P2P Client / P2P GO in IDLE state.\n\tP2P_CTRL_DISCOVERY : do scan / search / listen in an period.\n\t\t\t\t\tUse P2PDiscMachine do such things and after times up, P2PDiscMachine and P2PCtrlMachine in IDLE state.\n\t\t\t\t\tIf we have Device Name / Device Address and WSC config method, P2PPeriodicExec should MlmeEnqueue\n\t\t\t\t\tP2P_CTRL_GROUP_FORMATION in P2PCtrlMachine.\n\tP2P_CTRL_GROUP_FORMATION : do Group Negotiation and Provision.\n\t\t\t\t\tUse P2PGoFormMachine do such things in ConfigTimeout periodic.\n\tP2P_CTRL_DONE : Group Formation has finish , interface will up as AP or STA code.\n\t\t\t\t\tAfter AsicKey write done, can change to IDLE state.\n\n*/\n#endif /* RELEASE_EXCLUDE */\n\t \nVOID P2PCtrlStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, (ULONG)P2P_CTRL_MAX_STATES,\n\t\t(ULONG)P2P_CTRL_MAX_EVENTS, (STATE_MACHINE_FUNC)Drop, P2P_CTRL_IDLE, P2P_CTRL_IDLE);\n\n\t/* P2P_CTRL_IDLE state */\n\tStateMachineSetAction(Sm, P2P_CTRL_IDLE, P2P_CTRL_DISC_EVT, (STATE_MACHINE_FUNC)P2PCtrlDiscoveryAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_IDLE, P2P_CTRL_GO_NEGO_EVT, (STATE_MACHINE_FUNC)P2PCtrlGroupFormationAction);\n\n\t/* P2P_CTRL_DISCOVERY state */\n\tStateMachineSetAction(Sm, P2P_CTRL_DISCOVERY, P2P_CTRL_DISC_EVT, (STATE_MACHINE_FUNC)P2PCtrlDiscoveryAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_DISCOVERY, P2P_CTRL_DISC_CANL_EVT, (STATE_MACHINE_FUNC)P2PCtrlDiscoveryCancelAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_DISCOVERY, P2P_CTRL_DISC_DONE_EVT, (STATE_MACHINE_FUNC)P2PCtrlDiscoveryDoneAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_DISCOVERY, P2P_CTRL_GO_NEGO_EVT, (STATE_MACHINE_FUNC)P2PCtrlGroupFormationAction);\n\n\t/* P2P_CTRL_GROUP_FORMATION state */\n\tStateMachineSetAction(Sm, P2P_CTRL_GROUP_FORMATION, P2P_CTRL_GO_NEGO_EVT, (STATE_MACHINE_FUNC)P2PCtrlGroupFormationAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_GROUP_FORMATION, P2P_CTRL_GO_NEGO_CANL_EVT, (STATE_MACHINE_FUNC)P2PCtrlGroupFormationDoneAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_GROUP_FORMATION, P2P_CTRL_DISC_CANL_EVT, (STATE_MACHINE_FUNC)P2PCtrlDiscoveryDoneAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_GROUP_FORMATION, P2P_CTRL_GO_NEGO_DONE_EVT, (STATE_MACHINE_FUNC)P2PCtrlGroupFormationDoneAction);\n\tStateMachineSetAction(Sm, P2P_CTRL_GROUP_FORMATION, P2P_CTRL_DISC_EVT, (STATE_MACHINE_FUNC)P2PCtrlDiscoveryAction);\n\n\t/* P2P_CTRL_DONE state */\n\t/*StateMachineSetAction(Sm, P2P_CTRL_DONE, Event, (STATE_MACHINE_FUNC)Action); */\n\n\t/* init all P2P ctrl state. */\n\tpAd->P2pCfg.CtrlCurrentState = P2P_CTRL_IDLE;\n\n\treturn;\n}\n\n/* Ctrl Action */\nstatic VOID P2PCtrlDiscoveryAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_CTRL_STATE *pCurrState = &(pAd->P2pCfg.CtrlCurrentState);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: \\n\", __FUNCTION__));\n\n\tif (P2P_GO_ON(pAd))\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_LISTEN_CMD_EVT, 0, NULL, 0);\n\telse\n\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_SCAN_CMD_EVT, 0, NULL, 0);\n\n\t*pCurrState = P2P_CTRL_DISCOVERY;\n}\n\nstatic VOID P2PCtrlDiscoveryCancelAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_CTRL_STATE *pCurrState = &(pAd->P2pCfg.CtrlCurrentState);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::\\n\", __FUNCTION__));\n\t/* update Discovery State Machine state. */\n\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);\n\tMlmeHandler(pAd);\n\n\t*pCurrState = P2P_CTRL_IDLE;\n}\n\nstatic VOID P2PCtrlDiscoveryDoneAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\t/*PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;*/\n\tP2P_CTRL_STATE *pCurrState = &(pAd->P2pCfg.CtrlCurrentState);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::  P2P Device Discovery Finished, found total %d p2p devices.\\n\", __FUNCTION__, pAd->P2pTable.ClientNumber));\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\tBOOLEAN bCancelled;\n\t\t/* Stop Scan and resume */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &bCancelled);\n\t\tpAd->MlmeAux.Channel = 0;\n\t\tScanNextChannel(pAd, OPMODE_STA);\n\t}\n\n\tP2PInitDevDiscTimer(pAd, 0);\n\tP2PInitListenTimer(pAd, 0);\n\tP2PInitNextScanTimer(pAd, 0);\n\t/* update Discovery State Machine state. */\n\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);\n\t*pCurrState = P2P_CTRL_IDLE;\n}\n\nstatic VOID P2PCtrlGroupFormationAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_CTRL_STATE *pCurrState = &(pAd->P2pCfg.CtrlCurrentState);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::\\n\", __FUNCTION__));\n\t*pCurrState = P2P_CTRL_GROUP_FORMATION;\n}\n\nstatic VOID P2PCtrlGroupFormationDoneAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\t/*PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;*/\n\tP2P_CTRL_STATE *pCurrState = &(pAd->P2pCfg.CtrlCurrentState);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\t/*pAd->StaCfg.bAutoReconnect = TRUE;*/\n\tDBGPRINT(RT_DEBUG_ERROR, (\"auto re-conect to GO[%s]\\n\", pAd->MlmeAux.Ssid));\n\n\t*pCurrState = P2P_CTRL_DONE;\n}\n\n\n"
  },
  {
    "path": "src/common/p2p_dbg.c",
    "content": "#ifdef P2P_SUPPORT\n\n\n#include \"rt_config.h\"\n\nextern UCHAR\tWILDP2PSSID[];\nextern UCHAR\tWILDP2PSSIDLEN;\n\n#ifdef WFD_SUPPORT\nUCHAR\tdefault_wfd_device_info[SUBID_WFD_DEVICE_INFO_LEN] = {0x0};\nUCHAR\tdefault_wfd_audio_format[SUBID_WFD_AUDIO_FORMATS_LEN] = {0x0};\nUCHAR\tdefault_wfd_video_format[SUBID_WFD_VIDEO_FORMATS_LEN] = {0x0};\nUCHAR\tdefault_wfd_3d_video_format[SUBID_WFD_3D_VIDEO_FORMATS_LEN] = {0x0};\nUCHAR\tdefault_wfd_content_proctection[SUBID_WFD_CONTENT_PROTECTION_LEN] = {0x0};\nUCHAR\tdefault_wfd_couple_sink_info[SUBID_WFD_COUPLED_SINK_INFO_LEN] = {0x0};\nUCHAR\tdefault_wfd_extended_capability[SUBID_WFD_EXTENDED_CAP_LEN] = {0x0};\nUCHAR\tdefault_wfd_local_ip_address[SUBID_WFD_LOCAL_IP_ADDR_LEN] = {0x0};\n#endif /* WFD_SUPPORT */\n\nextern INT Set_AP_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Print_Cfg(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (P2P_INF_ON(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P Device Config :\\n\"));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"=====================================================================\\n\"));\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Device Name[%ld] = %s.\\n\", pP2PCtrl->DeviceNameLen, pP2PCtrl->DeviceName));\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Device Addr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pP2PCtrl->CurrentAddress)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"OpChannel = %d.        Listen Channel = %d. \\n\", pP2PCtrl->GroupChannel, pP2PCtrl->ListenChannel));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"My Go Intent = %d.\\n\", pP2PCtrl->GoIntentIdx));\n\t\t/*DBGPRINT(RT_DEBUG_ERROR, (\"WscMode = %s.        ConfigMethod = %s.\\n\", (pP2PCtrl->WscMode == 1) ? \"PIN\" : \"PBC\", decodeConfigMethod(pP2PCtrl->ConfigMethod))); */\n\t\tif (pP2PCtrl->WscMode == 1)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscMode = PIN.\\n\"));\n\t\telse if (pP2PCtrl->WscMode == 2)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscMode = PBC.\\n\"));\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscMode = ***Unknown***.\\n\"));\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscConfigMethod = %s.\\n\", decodeConfigMethod(pP2PCtrl->ConfigMethod)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscDpid = %s.\\n\", decodeDpid(pP2PCtrl->Dpid)));\n\t\tif (pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"My Self PIN Code = %08u\\n\", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode));\n\t\telse if (pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t{\n\t\t\tUINT PinCode = simple_strtol(pP2PCtrl->PinCode, 0, 10);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Peer PIN Code = %08u\\n\", PinCode));\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SSID[%d] = %s.\\n\", pP2PCtrl->SSIDLen, pP2PCtrl->SSID));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NoA_Count = %d.        NoA_Duration = %ld.        NoA_Interval = %ld.        StartTime = %ld.\\n\", \n\t\t\t\t\t\t\t\t\tpP2PCtrl->GONoASchedule.Count, pP2PCtrl->GONoASchedule.Duration, pP2PCtrl->GONoASchedule.Interval, pP2PCtrl->GONoASchedule.StartTime));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ExtListenPeriod = %d.        ExtListenInterval = %d.\\n\", pP2PCtrl->ExtListenPeriod, pP2PCtrl->ExtListenInterval));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Intra-Bss = %d.        \\n\", pP2PCtrl->bIntraBss));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ConenctMAC = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pP2PCtrl->ConnectingMAC)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"p2pControl = %08x.    Persistent = %s. Invite = %s.    ClientDiscovery = %s.    IntraBss = %s.    ExtListen = %s.\\n\", pP2PCtrl->P2pControl.word, (IS_PERSISTENT_ON(pAd))? \"ON\" : \"OFF\", (IS_INVITE_ON(pAd))? \"ON\" : \"OFF\",\n\t\t\t\t\t(IS_CLIENT_DISCOVERY_ON(pAd))? \"ON\" : \"OFF\", (IS_INTRA_BSS_ON(pAd))? \"ON\" : \"OFF\", (IS_EXT_LISTEN_ON(pAd))? \"ON\" : \"OFF\"));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         Opps = %s.    SwNoATimer = %s.    ServiceDiscovery = %d.\\n\", (IS_OPPS_ON(pAd))? \"ON\" : \"OFF\", (IS_SW_NOA_TIMER(pAd))? \"ON\" : \"OFF\", pP2PCtrl->P2pControl.field.ServiceDiscovery));\n#ifdef WFD_SUPPORT\n\t\tif (pAd->StaCfg.WfdCfg.bWfdEnable)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WFD_DeviceType = %d.  SourceCoupled = %d.  SinkCoupled = %d\\n\", \n\t\t\t\t\tpAd->StaCfg.WfdCfg.DeviceType, pAd->StaCfg.WfdCfg.SourceCoupled, pAd->StaCfg.WfdCfg.SinkCoupled));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WFD_RTSP_PORT = %d.  WFD_MAX_THROUGHPUT = %d.\\n\", \n\t\t\t\t\tpAd->StaCfg.WfdCfg.RtspPort, pAd->StaCfg.WfdCfg.MaxThroughput));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WFD_SessionAvail = %d.  WSD = %d.  PC = %d.  CP = %d.  TimeSync = %d.\\n\", \n\t\t\t\t\tpAd->StaCfg.WfdCfg.SessionAvail, pAd->StaCfg.WfdCfg.WSD, pAd->StaCfg.WfdCfg.PC, pAd->StaCfg.WfdCfg.CP, pAd->StaCfg.WfdCfg.TimeSync));\n\t\t}\n#endif /* WFD_SUPPORT */\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Enable(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUINT32 enable = 0;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tenable = (UCHAR) simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Enable = %d.\\n\", __FUNCTION__, enable));\n\treturn TRUE;\n}\n\nINT Set_P2P_Listen_Channel(\n\t\tIN\tPRTMP_ADAPTER\tpAd, \n\t\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUINT32 channel;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tchannel = (UCHAR) simple_strtol(arg, 0, 10);\n\t/* check if this channel is valid */\n\tif (ChannelSanity(pAd, channel) == TRUE)\n\t{\n\t\tpAd->P2pCfg.ListenChannel = channel;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Listen Channel out of range, using default.\\n\"));\n\t\tpAd->P2pCfg.ListenChannel = 1;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Listen Channel = %d.\\n\", __FUNCTION__, pAd->P2pCfg.ListenChannel));\n\treturn TRUE;\n}\n\nINT Set_P2P_Operation_Channel(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUINT32 channel;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tchannel = (UCHAR) simple_strtol(arg, 0, 10);\n\t/* check if this channel is valid */\n\tif (ChannelSanity(pAd, channel) == TRUE)\n\t{\n\t\tpAd->P2pCfg.GroupChannel = channel;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Opertation Channel out of range, using default.\\n\"));\n\t\tpAd->P2pCfg.GroupChannel = 1;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Op Channel = %d.\\n\", __FUNCTION__, pAd->P2pCfg.GroupChannel));\n\treturn TRUE;\n}\n\n\nINT Set_P2P_GO_Intent(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUINT32\tintent;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tintent = simple_strtol(arg, 0, 10);\n\tif (intent <= 15)\n\t\tpAd->P2pCfg.GoIntentIdx = intent;\t\t\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"GO Intent out of range 0 ~ 15, using default.\\n\"));\n\t\tpAd->P2pCfg.GoIntentIdx = 0;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: GO Intent = %d.\\n\", __FUNCTION__, pAd->P2pCfg.GoIntentIdx));\n\treturn TRUE;\n}\n\n\nINT Set_P2P_Device_Name(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (strlen(arg) <= 32)\n\t{\n\t\tpAd->P2pCfg.DeviceNameLen = (UCHAR) strlen(arg);\n\t\tNdisZeroMemory(pAd->P2pCfg.DeviceName, 32);\n\t\tNdisMoveMemory(pAd->P2pCfg.DeviceName, arg, pAd->P2pCfg.DeviceNameLen);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set P2P Device Name - %s\", pAd->P2pCfg.DeviceName));\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Device Name = %s.\\n\", __FUNCTION__, pAd->P2pCfg.DeviceName));\n\treturn TRUE;\n}\n\nINT Set_P2P_WSC_Mode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tint wscMode;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\twscMode = simple_strtol(arg, 0, 10);\n\tif (wscMode <= 2 && wscMode >= 1)\n\t\tpAd->P2pCfg.WscMode= wscMode;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscMode is invalid, using default and accept wsc method from peer's provision request action frame.\\n\"));\n\t\tpAd->P2pCfg.WscMode = WSC_PIN_MODE; /* PIN */\n\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_NOSPEC;\n\t\tpAd->P2pCfg.ConfigMethod = (WSC_CONFMET_PBC | WSC_CONFMET_KEYPAD | WSC_CONFMET_DISPLAY);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: WscMode = %s.\\n\", __FUNCTION__, (wscMode == 1) ? \"PIN\" : \"PBC\"));\n\treturn TRUE;\n}\n\nINT Set_P2P_WSC_ConfMethod(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tint method;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tmethod = simple_strtol(arg, 0, 10);\n\n\tif (pAd->P2pCfg.WscMode == WSC_PIN_MODE)\n\t{\n\t\tif (method == 1)\n\t\t{\n\t\t\t/* Display PIN */\n\t\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_REG;\n\t\t\tpAd->P2pCfg.ConfigMethod =  WSC_CONFMET_DISPLAY;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *************************************************\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *                                               *\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *       PIN Code = %08u                     *\\n\", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *                                               *\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    *************************************************\\n\"));\n\n\t\t}\n\t\telse if (method == 2)\n\t\t{\n\t\t\t/* Enter PIN */\n\t\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_USER;\n\t\t\tpAd->P2pCfg.ConfigMethod =  WSC_CONFMET_KEYPAD;\n\t\t}\n\t}\n\telse if (pAd->P2pCfg.WscMode == WSC_PBC_MODE)\n\t{\n\t\tif (method == 3)\n\t\t{\n\t\t\tpAd->P2pCfg.Dpid = DEV_PASS_ID_PBC;\n\t\t\tpAd->P2pCfg.ConfigMethod = WSC_CONFMET_PBC;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Config Method = %s.\\n\", __FUNCTION__, decodeConfigMethod(pAd->P2pCfg.ConfigMethod)));\n\treturn TRUE;\n}\n\nINT Set_P2P_NoA_Count(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tpAd->P2pCfg.GONoASchedule.Count = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: NoA Count = %d\\n\", __FUNCTION__, pAd->P2pCfg.GONoASchedule.Count));\n\treturn TRUE;\n}\n\nINT Set_P2P_NoA_Duration(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tpAd->P2pCfg.GONoASchedule.Duration = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: NoA Duration = %ld\\n\", __FUNCTION__, pAd->P2pCfg.GONoASchedule.Duration));\n\treturn TRUE;\n}\n\nINT Set_P2P_NoA_Interval(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tpAd->P2pCfg.GONoASchedule.Interval = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: NoA Interval = %ld\\n\", __FUNCTION__, pAd->P2pCfg.GONoASchedule.Interval));\n\treturn TRUE;\n}\n\nINT Set_P2P_Extend_Listen(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR ExtListen;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tExtListen = simple_strtol(arg, 0, 10);\n\tif (ExtListen)\n\t\tpAd->P2pCfg.bExtListen = TRUE;\n\telse\n\t\tpAd->P2pCfg.bExtListen = FALSE;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Exted Listen = %d\\n\", __FUNCTION__, pAd->P2pCfg.bExtListen));\n\treturn TRUE;\n}\n\nINT Set_P2P_Extend_Listen_Periodic(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tpAd->P2pCfg.ExtListenPeriod = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Extend Listen Interval = %d\\n\", __FUNCTION__, pAd->P2pCfg.ExtListenPeriod));\n\treturn TRUE;\n}\n\nINT Set_P2P_Extend_Listen_Interval(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tpAd->P2pCfg.ExtListenInterval = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Extend Listen Interval = %d\\n\", __FUNCTION__, pAd->P2pCfg.ExtListenInterval));\n\treturn TRUE;\n}\n\nINT Set_P2P_Intra_Bss(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR IntraBss;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tIntraBss = simple_strtol(arg, 0, 10);\n\tif (IntraBss)\n\t\tpAd->P2pCfg.bIntraBss = TRUE;\n\telse\n\t\tpAd->P2pCfg.bIntraBss = FALSE;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: IntraBss = %d\\n\", __FUNCTION__, pAd->P2pCfg.bIntraBss));\n\treturn TRUE;\n}\n\nINT Set_P2P_Scan(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tint ScanType;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tScanType = simple_strtol(arg, 0, 10);\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\n\tswitch(ScanType)\n\t{\n\t\tcase P2P_STOP_SCAN:\n\t\t\t/* Stop scan and stop to response peer P2P scanning */\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n#else\n\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\t\tpP2PCtrl->bSentProbeRSP = FALSE;\n\t\tP2pStopScan(pAd);\n\t\t\tbreak;\n\t\tcase P2P_SCANNING:\n\t\t\t/* Do P2P scanning */\n\t\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n\t\t\tpP2PCtrl->bSentProbeRSP = TRUE;\n\t\t\tP2pGroupTabInit(pAd);\n\t\t\tP2pScan(pAd);\n\t\t\tbreak;\n\t\tcase P2P_STOP_SCAN_AND_LISTEN:\n\t\t\t/* Stop scan and lock at Listen Channel to response peer P2P scanning */\n\t\t\tpAd->P2pCfg.bSentProbeRSP = TRUE;\n\t\t\tP2pStopScan(pAd);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Incorrect scan type:%d\\n\", ScanType));\n\t}\n\treturn TRUE;\n}\n\nINT Set_P2P_Print_GroupTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tint i, j;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tRTMP_SEM_LOCK(&pAd->P2pTableSemLock);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2pTable ClientNum = %d\\n\", __FUNCTION__, pAd->P2pTable.ClientNumber));\n\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t{\n\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[i];\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table.Client[%d]: DeviceName[%d][%s]\\n\", i, pP2pEntry->DeviceNameLen, pP2pEntry->DeviceName));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         Addr[%02x:%02x:%02x:%02x:%02x:%02x]\\n\", PRINT_MAC(pP2pEntry->addr)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         BSSID[%02x:%02x:%02x:%02x:%02x:%02x]\\n\", PRINT_MAC(pP2pEntry->bssid)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         InterfaceAddr[%02x:%02x:%02x:%02x:%02x:%02x]\\n\", PRINT_MAC(pP2pEntry->InterfaceAddr)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         SSID[\"));\n\t\tfor (j=0; j<pP2pEntry->SsidLen;j++)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%c \", pP2pEntry->Ssid[j]));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"]\\n\"));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         OpChannel = %d.        ListenChannel = %d.\\n\", pP2pEntry->OpChannel, pP2pEntry->ListenChannel));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         P2pClientState = %s.        MyGOIndex = %d.\\n\", decodeP2PClientState(pP2pEntry->P2pClientState), pP2pEntry->MyGOIndex));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         Dpid = %s.        Rule = %s.\\n\", decodeDpid(pP2pEntry->Dpid), decodeMyRule(pP2pEntry->Rule)));\n\n\t\tif (pP2pEntry->WscMode == 1)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         WscMode = PIN.        PIN = %02x %02x %02x %02x %02x %02x %02x %02x.\\n\", \n\t\t\t\t\tpP2pEntry->PIN[0], pP2pEntry->PIN[1], pP2pEntry->PIN[2], pP2pEntry->PIN[3], \n\t\t\t\t\tpP2pEntry->PIN[4], pP2pEntry->PIN[5], pP2pEntry->PIN[6], pP2pEntry->PIN[7]));\n\t\telse if (pAd->P2pTable.Client[i].WscMode == 2)\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         WscMode = PBC.\\n\"));\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         WscMode = ***Unknown***.\\n\"));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         CfgMethod = %s.        GoIntent = %d.\\n\", decodeConfigMethod(pAd->P2pTable.Client[i].ConfigMethod), pAd->P2pTable.Client[i].GoIntent));\n\t\tdecodeDeviceCap(pP2pEntry->DevCapability);\n\t\tdecodeGroupCap(pP2pEntry->GroupCapability);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         Rssi = %d.\\n\", pP2pEntry->Rssi));\n#ifdef WFD_SUPPORT\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         WFD = %d.\\n\", pP2pEntry->WfdEntryInfo.bWfdClient));\n\t\tif (pP2pEntry->WfdEntryInfo.bWfdClient)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         DeviceType = %d. RTSP_Port = %d. MaxThroughput=%d.\\n\", \n\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_devive_type, pP2pEntry->WfdEntryInfo.rtsp_port, pP2pEntry->WfdEntryInfo.max_throughput));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         SessionAvail = %d. PC = %d\\n\", \n\t\t\t\t\tpP2pEntry->WfdEntryInfo.session_avail, pP2pEntry->WfdEntryInfo.wfd_PC));\n\t\t\thex_dump(\"device_info::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_device_info_ie, 6);\n\t\t\thex_dump(\"associate bssid::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_associate_bssid_ie, 6);\n\t\t\thex_dump(\"audio format::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_audio_format_ie, 15);\n\t\t\thex_dump(\"video format::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_video_format_ie, 21);\n\t\t\thex_dump(\"3d video format::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_3d_video_format_ie, 13);\n\t\t\thex_dump(\"content protection::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_content_proctection, 1);\n\t\t\thex_dump(\"couple sink::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_couple_sink_info_ie, 1);\n\t\t\thex_dump(\"extentded capability::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_extent_capability_ie, 2);\n\t\t\thex_dump(\"alternate mac address::\", pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_alternate_mac_addr_ie, SUBID_WFD_ALTERNATE_MAC_ADDR_LEN);\n\t\t}\n#endif /* WFD_SUPPORT */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\"));\n    }\n\n\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\treturn TRUE;\n}\n\nINT Set_P2P_Print_PersistentTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tint i;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2pTable ClientNum = %d\\n\", __FUNCTION__, pAd->P2pTable.PerstNumber));\n\tfor (i=0; i < pAd->P2pTable.PerstNumber; i++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table.PerstEntry[%d]: Rule = %s\\n\", i, decodeMyRule(pAd->P2pTable.PerstEntry[i].MyRule)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         DevAddr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pAd->P2pTable.PerstEntry[i].Addr)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         SSID[%d] = %s.\\n\", pAd->P2pTable.PerstEntry[i].Profile.SSID.SsidLength, pAd->P2pTable.PerstEntry[i].Profile.SSID.Ssid));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         MACAddr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pAd->P2pTable.PerstEntry[i].Profile.MacAddr)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                         Key[%d] = %02x %02x %02x %02x  %02x %02x %02x %02x.\\n\", pAd->P2pTable.PerstEntry[i].Profile.KeyIndex, pAd->P2pTable.PerstEntry[i].Profile.Key[0], pAd->P2pTable.PerstEntry[i].Profile.Key[1],\n\t\t\t\t\t\t\t\tpAd->P2pTable.PerstEntry[i].Profile.Key[2], pAd->P2pTable.PerstEntry[i].Profile.Key[3], pAd->P2pTable.PerstEntry[i].Profile.Key[4], pAd->P2pTable.PerstEntry[i].Profile.Key[5],\n\t\t\t\t\t\t\t\tpAd->P2pTable.PerstEntry[i].Profile.Key[6], pAd->P2pTable.PerstEntry[i].Profile.Key[7]));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"                                  %02x %02x %02x %02x  %02x %02x %02x %02x.\\n\", pAd->P2pTable.PerstEntry[i].Profile.Key[8], pAd->P2pTable.PerstEntry[i].Profile.Key[9],\n\t\t\t\t\t\t\t\tpAd->P2pTable.PerstEntry[i].Profile.Key[10], pAd->P2pTable.PerstEntry[i].Profile.Key[11], pAd->P2pTable.PerstEntry[i].Profile.Key[12], pAd->P2pTable.PerstEntry[i].Profile.Key[13],\n\t\t\t\t\t\t\t\tpAd->P2pTable.PerstEntry[i].Profile.Key[14], pAd->P2pTable.PerstEntry[i].Profile.Key[15]));\n\t}\n\treturn TRUE;\n}\n\nINT Set_P2P_Provision_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR p2pindex;\n\tPUCHAR\tpAddr;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tp2pindex = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: TabIdx[%d]\\n\", __FUNCTION__, p2pindex));\n\tif (p2pindex < pAd->P2pTable.ClientNumber)\n\t{\n/*\t\tP2PPrintP2PEntry(pAd, P2pTabIdx); */\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n/*\t\tpAd->P2pTable.Client[P2pTabIdx].StateCount = 10; */\n/*\t\tpAd->P2pTable.Client[P2pTabIdx].bValid = TRUE; */\n/*\t\tP2pProvision(pAd, pAddr); */\n\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_PROVISION_COMMAND);\n    }\n    else\n        DBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n\n}\n\nINT Set_P2P_Invite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex;\n\tPUCHAR\tpAddr;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tp2pindex = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: TabIdx[%d]\\n\", __FUNCTION__, p2pindex));\n\n\tif (p2pindex < pAd->P2pTable.ClientNumber)\n\t{\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_INVITE_COMMAND);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Device_Discoverability_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex;\n\tUCHAR\t\tMyGOIdx;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tp2pindex = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: TabIdx[%d]\\n\", __FUNCTION__, p2pindex));\n\tP2PPrintP2PEntry(pAd, p2pindex);\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tMyGOIdx = pAd->P2pTable.Client[p2pindex].MyGOIndex;\n\t\tif (MyGOIdx != P2P_NOT_FOUND)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Start P2P Device Discoverability = %02x:%02x:%02x:%02x:%02x:%02x.\t\\n\",  PRINT_MAC(pAd->P2pTable.Client[p2pindex].addr)));\n\t\t\tpAd->P2pTable.Client[p2pindex].GeneralToken++;\n\t\t\t\tpAd->P2pTable.Client[MyGOIdx].P2pClientState = P2PSTATE_GO_DISCO_COMMAND;\n\t\t\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_CLIENT_DISCO_COMMAND;\n\t\t\tP2pSetListenIntBias(pAd, 12);\n\t\t}\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Connect_GoIndex_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex;\n\tPUCHAR\tpAddr;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tp2pindex = simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: TabIdx[%d]\\n\", __FUNCTION__, p2pindex));\n\n\n\tif (p2pindex < pAd->P2pTable.ClientNumber)\n\t{\n\t\t/*\n\t\tP2PPrintP2PEntry(pAd, P2pTabIdx);\n\t\tpAd->P2pCfg.ConnectingIndex = 0;\n\t\tif (pAd->P2pTable.Client[P2pTabIdx].P2pClientState == P2PSTATE_DISCOVERY)\n\t\t\tpAd->P2pTable.Client[P2pTabIdx].P2pClientState = P2PSTATE_CONNECT_COMMAND;\n\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.Client[P2pTabIdx].addr);\n\t\tpAd->P2pTable.Client[P2pTabIdx].StateCount = 10;\n\t\tpAd->P2pTable.Client[P2pTabIdx].bValid = TRUE;\n\t\tP2pConnect(pAd);\n\t\t */\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_CONNECT_COMMAND);\n    }\n    else\n        DBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n}\n\n\nINT Set_P2P_Connect_Dev_Addr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex = P2P_NOT_FOUND;\n\tPUCHAR\tpAddr;\n\tUCHAR ConnAddr[6];\n\tUINT32\ti;\n\textern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];\n\textern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN];\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Connect to DevAddr[%s]\\n\", __FUNCTION__, arg));\n\n\n\t/*\n\t\tIf the input is the zero mac address, it means use our default(from EEPROM) MAC address as out-going \n\t\t   MAC address.\n\t\tIf the input is the broadcast MAC address, it means use the source MAC of first packet forwarded by\n\t\t   our device as the out-going MAC address.\n\t\tIf the input is any other specific valid MAC address, use it as the out-going MAC address.\n\t*/\n\n\tNdisMoveMemory(&ConnAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN);\n\tif (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(ConnAddr)));\n\t\n\tif (MAC_ADDR_EQUAL(ConnAddr, ZERO_MAC_ADDR))\n\t{\n\t\tP2pLinkDown(pAd, P2P_CONNECT_FAIL);\n\t\treturn TRUE;\n\t}\n\n\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t{\n\t\tif (MAC_ADDR_EQUAL(pAd->P2pTable.Client[i].addr, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].bssid, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].InterfaceAddr, ConnAddr))\n\t\t{\n\t\t\tp2pindex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ((p2pindex < pAd->P2pTable.ClientNumber) && (p2pindex != P2P_NOT_FOUND))\n\t{\n#ifdef WFD_SUPPORT\n\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t(pAd->P2pTable.Client[p2pindex].WfdEntryInfo.bWfdClient) &&\n\t\t\t(pAd->P2pTable.Client[p2pindex].WfdEntryInfo.session_avail == WFD_SESSION_NOT_AVAILABLE))\n\t\t{\n\t\t\tpAd->StaCfg.WfdCfg.PeerSessionAvail = WFD_SESSION_NOT_AVAILABLE;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Session Avail is turn off!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_CONNECT_COMMAND);\n    }\n    else\n        DBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Send_Invite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR ConnAddr[6];\n\textern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Send invite to DevAddr[%s]\\n\", __FUNCTION__, arg));\n\n\t/*\n\t\tIf the input is the zero mac address, it means use our default(from EEPROM) MAC address as out-going \n\t\t   MAC address.\n\t\tIf the input is the broadcast MAC address, it means use the source MAC of first packet forwarded by\n\t\t   our device as the out-going MAC address.\n\t\tIf the input is any other specific valid MAC address, use it as the out-going MAC address.\n\t*/\n\n\tNdisMoveMemory(&ConnAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN);\n\tif (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(ConnAddr)));\n\n\tP2pConnectPrepare(pAd, ConnAddr, P2PSTATE_INVITE_COMMAND);\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Provision_Dev_Addr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex = P2P_NOT_FOUND;\n\tPUCHAR\tpAddr;\n\tUCHAR ConnAddr[6];\n\tUINT32\ti;\n\tUINT16 retry_cnt = 0;\n\textern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];\n\textern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN];\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Connect to DevAddr[%s]\\n\", __FUNCTION__, arg));\n\n\n\t/*\n\t\tIf the input is the zero mac address, it means use our default(from EEPROM) MAC address as out-going \n\t\t   MAC address.\n\t\tIf the input is the broadcast MAC address, it means use the source MAC of first packet forwarded by\n\t\t   our device as the out-going MAC address.\n\t\tIf the input is any other specific valid MAC address, use it as the out-going MAC address.\n\t*/\n\n\tif( pAd->P2pTable.ClientNumber == 0)\n\t{\n\t\tDBGPRINT( RT_DEBUG_ERROR, (\"P2P Table is Empty! Scan First!\\n\"));\n\t\tP2pScan(pAd);\n\t\tOS_WAIT(2000);\n\t}\n\n\tNdisMoveMemory(&ConnAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN);\n\tif (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(ConnAddr)));\n\t\n\tif (MAC_ADDR_EQUAL(ConnAddr, ZERO_MAC_ADDR))\n\t{\n\t\tP2pLinkDown(pAd, P2P_CONNECT_FAIL);\n\t\treturn TRUE;\n\t}\n\nretry:\n\t\n\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t{\n\t\tif (MAC_ADDR_EQUAL(pAd->P2pTable.Client[i].addr, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].bssid, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].InterfaceAddr, ConnAddr))\n\t\t{\n\t\t\tp2pindex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"pAd->P2pTable.ClientNumber = %d, p2pindex = %d\\n\", pAd->P2pTable.ClientNumber, p2pindex));\n\tif ((p2pindex < pAd->P2pTable.ClientNumber) && (p2pindex != P2P_NOT_FOUND))\n\t{\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_PROVISION_COMMAND);\n\t}\n\telse\n\t{\n\t\tretry_cnt ++;\n\t\tif ( retry_cnt < 5 )\n\t\t{\n\t\t\tOS_WAIT(2000);\n\t\t\tgoto retry;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tP2pSendWirelessEvent(pAd, RT_P2P_CONNECT_FAIL, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_P2P_State_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P Current State\\n\"));\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"=====================================================================\\n\"));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"My Rule = %s\\n\", decodeMyRule(pP2PCtrl->Rule)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"p2p_OpStatus = %04x\\n\", pAd->flg_p2p_OpStatusFlags));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"CTRL Machine State = %s.\\n\", decodeCtrlState(pP2PCtrl->CtrlCurrentState)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"DISC Machine State = %s.\\n\", decodeDiscoveryState(pP2PCtrl->DiscCurrentState)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"GO_FORM Machine State = %s.\\n\", decodeGroupFormationState(pP2PCtrl->GoFormCurrentState)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"AutoReconn = %d\\n\", pAd->StaCfg.bAutoReconnect));\n\t/*DBGPRINT(RT_DEBUG_ERROR, (\"P2PDiscoProvState = %s\\n\", decodeP2PState(pP2PCtrl->P2PDiscoProvState))); */\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2PConnectState = %s\\n\", decodeP2PState(pP2PCtrl->P2PConnectState)));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Reset_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t/*UINT32 DiscPerd = 0;*/\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (P2P_CLI_ON(pAd))\n\t\tP2P_CliStop(pAd);\n\telse if (P2P_GO_ON(pAd))\n\t{\n\t\tP2P_GoStop(pAd);\n\t\tif (INFRA_ON(pAd))\n\t\t\tAsicEnableBssSync(pAd);\n\t}\n\tP2PCfgInit(pAd);\n\tP2pGroupTabInit(pAd);\n\tpP2PCtrl->Rule = P2P_IS_DEVICE;\n\tpAd->flg_p2p_OpStatusFlags = P2P_DISABLE;\n\tpP2PCtrl->ConfigMethod = 0x188;\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl.WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\tpP2PCtrl->GoFormCurrentState = P2P_GO_FORM_IDLE;\n\tpP2PCtrl->DiscCurrentState = P2P_DISC_IDLE;\n\tpP2PCtrl->CtrlCurrentState = P2P_CTRL_IDLE;\n\tNdisZeroMemory(&pP2PCtrl->P2pCounter, sizeof(P2P_COUNTER_STRUCT));\t\n\tP2pSetListenIntBias(pAd, 3);\n\tRTMPZeroMemory(pAd->P2pCfg.SSID, MAX_LEN_OF_SSID);\n\tRTMPMoveMemory(pAd->P2pCfg.SSID, WILDP2PSSID, WILDP2PSSIDLEN);\n\tpP2PCtrl->SSIDLen = WILDP2PSSIDLEN;\n\t/* Set Dpid to \"not specified\". it means, GUI doesn't set for connection yet. */\n\tpP2PCtrl->Dpid = DEV_PASS_ID_NOSPEC;\n\tRTMPZeroMemory(pAd->P2pCfg.ConnectingMAC, MAC_ADDR_LEN);\n\treturn TRUE;\n}\n\nINT Set_P2P_Default_Config_Method_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tUINT32 ConfigMethod = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tConfigMethod = simple_strtol(arg, 0, 10);\n\tif ((ConfigMethod >= 1) && (ConfigMethod <= 3))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Default Config Method is %d.\\n\", __FUNCTION__, ConfigMethod));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    1: DISPLAY.    2: KEYPAD.    3. PBC\\n\"));\n\t\tpP2PCtrl->DefaultConfigMethod = ConfigMethod;\n\t}\n\treturn TRUE;\n}\n\nINT Set_P2P_Link_Down_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tPOS_COOKIE\t\t\tpObj;\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n\treturn TRUE;\n}\n\nINT Set_P2P_Sigma_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tUINT32 SigmaEnabled = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tSigmaEnabled = simple_strtol(arg, 0, 10);\n\tpP2PCtrl->bSigmaEnabled = ((SigmaEnabled == 0) ? FALSE : TRUE);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Sigma Enable = %d.\\n\", __FUNCTION__, pP2PCtrl->bSigmaEnabled));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_QoS_NULL_Legacy_Rate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tUINT32 QoSNull = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tQoSNull = simple_strtol(arg, 0, 10);\n\tpP2PCtrl->bLowRateQoSNULL = ((QoSNull == 0) ? FALSE : TRUE);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P QoS NULL using Legacy Rate Enable = %d.\\n\", __FUNCTION__, pP2PCtrl->bLowRateQoSNULL));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_CLIENT_PM_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tUINT32 P2pClientPm = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tP2pClientPm = simple_strtol(arg, 0, 10);\n\tpP2PCtrl->bP2pCliPmEnable= ((P2pClientPm == 0) ? FALSE : TRUE);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P CLIENT PM Enable = %d.\\n\", __FUNCTION__, pP2PCtrl->bP2pCliPmEnable));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Enter_WSC_PIN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif ((strlen(arg) != 4) && (strlen(arg) != 8))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Reject this PIN (%s.)\\n\", __FUNCTION__, arg));\n\t\treturn 0;\n\t}\n\n\tNdisZeroMemory(&pP2PCtrl->PinCode[0], sizeof(pP2PCtrl->PinCode));\n\tRTMPMoveMemory(&pP2PCtrl->PinCode[0], arg, strlen(arg));\n\tSet_AP_WscPinCode_Proc(pAd, arg);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Enter Peer PIN Code = %s.\\n\", __FUNCTION__, pP2PCtrl->PinCode));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Persistent_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tUINT32 PersistentEnabled = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tPersistentEnabled = simple_strtol(arg, 0, 10);\n\tpP2PCtrl->P2pControl.field.EnablePresistent = PersistentEnabled;\n\tif ( PersistentEnabled == TRUE )\n\t{ \n\t\tpP2PCtrl->P2pCapability[1] |= GRPCAP_PERSISTENT;\n\t\tpP2PCtrl->P2pCapability[1] |= GRPCAP_PERSISTENT_RECONNECT;\n\t\tpP2PCtrl->ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\tpP2PCtrl->ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t}\n\telse\n\t{\n\t\tpP2PCtrl->P2pCapability[1] &= 0xDD; /* Set GRPCAP_PERSISTENT and GRPCAP_PERSISTENT_RECONNECT bits to 0 */\n\t\tpP2PCtrl->ExtListenInterval = 0;\n\t\tpP2PCtrl->ExtListenPeriod = 0;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Persistent Enable = %d.\\n\", __FUNCTION__, pP2PCtrl->P2pControl.field.EnablePresistent));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Dev_Discoverability_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n\n{\n\tUINT32 DevDiscoverEnabled = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDevDiscoverEnabled = simple_strtol(arg, 0, 10);\n\tpP2PCtrl->P2pControl.field.ClientDiscovery = DevDiscoverEnabled;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Device Discoverability Enable = %d.\\n\", __FUNCTION__, pP2PCtrl->P2pControl.field.ClientDiscovery));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_ProvisionByAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR p2pindex = 0;\n\tUCHAR ConnAddr[6] = {0};\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(ConnAddr)));\n\n\tp2pindex = P2pGroupTabSearch(pAd, ConnAddr);\n\n\tif (p2pindex < pAd->P2pTable.ClientNumber)\n    {\n\t\tP2pConnectPrepare(pAd, ConnAddr, P2PSTATE_PROVISION_COMMAND);\n    }\n    else\n        DBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n\n}\n\nINT Set_P2P_Service_Discovery_Proc(\n\t\tIN\tPRTMP_ADAPTER\tpAd, \n\t\tIN\tPSTRING \t\targ)\t\n{\n\tUINT32 ServiceDiscoverEnabled = 0;\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n#ifdef WFD_SUPPORT\n\tPRT_WFD_CONFIG\tpWFDCtrl = &pAd->StaCfg.WfdCfg;\n#endif /* WFD_SUPPORT */\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tServiceDiscoverEnabled = simple_strtol(arg, 0, 10);\n\tpP2PCtrl->P2pControl.field.ServiceDiscovery = ServiceDiscoverEnabled;\n#ifdef WFD_SUPPORT\n\tpWFDCtrl->WSD = ServiceDiscoverEnabled;\n#endif /* WFD_SUPPORT */\n\tif (ServiceDiscoverEnabled == TRUE)\n\t\tpP2PCtrl->P2pCapability[0] |= DEVCAP_SD;\n\telse\n\t\tpP2PCtrl->P2pCapability[0] &= ~(DEVCAP_SD);\n\n#ifdef WFD_SUPPORT\n\t/* Service Discovery Info. */\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_device_info_ie, \n\t\t\t\t&default_wfd_device_info, SUBID_WFD_DEVICE_INFO_LEN);\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_audio_format_ie, \n\t\t\t\t&default_wfd_audio_format, SUBID_WFD_AUDIO_FORMATS_LEN);\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_video_format_ie, \n\t\t\t\t&default_wfd_video_format, SUBID_WFD_VIDEO_FORMATS_LEN);\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_3d_video_format_ie, \n\t\t\t\t&default_wfd_3d_video_format, SUBID_WFD_3D_VIDEO_FORMATS_LEN);\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_content_proctection, \n\t\t\t\t&default_wfd_content_proctection, SUBID_WFD_CONTENT_PROTECTION_LEN);\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_couple_sink_info_ie, \n\t\t\t\t&default_wfd_couple_sink_info, SUBID_WFD_COUPLED_SINK_INFO_LEN);\n\tRTMPMoveMemory(pWFDCtrl->wfd_serv_disc_query_info.wfd_extent_capability_ie, \n\t\t\t\t&default_wfd_extended_capability, SUBID_WFD_EXTENDED_CAP_LEN);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WFD Service Discoverability Enable = %d.\\n\", __FUNCTION__, pP2PCtrl->P2pControl.field.ServiceDiscovery));\n#endif /* WFD_SUPPORT */\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Service_Discovery_Capable_Proc(\n\t\tIN\tPRTMP_ADAPTER\tpAd, \n\t\tIN\tPSTRING \t\targ)\n{\n\tUINT32 ServiceDiscoverCapable = 0;\n\tPOS_COOKIE\t\t\tpObj;\n//\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n#ifdef WFD_SUPPORT\n\tPRT_WFD_CONFIG\tpWFDCtrl = &pAd->StaCfg.WfdCfg;\n#endif /* WFD_SUPPORT */\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n#ifdef WFD_SUPPORT\n\tServiceDiscoverCapable = simple_strtol(arg, 0, 10);\n\tpWFDCtrl->WfdSerDiscCapable = ServiceDiscoverCapable;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  WFD Service Discovery Capability [%08x]\\n\", __FUNCTION__, ServiceDiscoverCapable));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"        DeviceInfo = %d.  AssociateBssid = %d. AudioFormat = %d.  VideoFormat = %d.\\n\"\n\t\t\t\t\t\t\t\t\"        3D_VideoFormat = %d.  ContentProtection = %d.  CoupleSinkInfo = %d.  ExtendedCapability = %d\\n\"\n\t\t\t\t\t\t\t\t\"        LocalIP = %d. SessionInfo = %d. AlternateMacAddress = %d.\\n\", \n\t\t\t(ServiceDiscoverCapable & 0x1), (ServiceDiscoverCapable & (0x1 << 1)), (ServiceDiscoverCapable & (0x1 << 2)), (ServiceDiscoverCapable & (0x1 << 3)),\n\t\t\t(ServiceDiscoverCapable & (0x1 << 4)), (ServiceDiscoverCapable & (0x1 << 5)), (ServiceDiscoverCapable & (0x1 << 6)), (ServiceDiscoverCapable & (0x1 << 7)),\n\t\t\t(ServiceDiscoverCapable & (0x1 << 8)), (ServiceDiscoverCapable & (0x1 << 9)), (ServiceDiscoverCapable & (0x1 << 10))));\n#endif /* WFD_SUPPORT */\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Send_Service_Discovery_Init_Proc(\n\t\tIN\tPRTMP_ADAPTER\tpAd, \n\t\tIN\tPSTRING \t\targ)\t\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex = P2P_NOT_FOUND;\n\tPUCHAR\tpAddr;\n\tUCHAR ConnAddr[6];\n\tUINT32\ti;\n\textern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Send Service Discovery to DevAddr[%s]\\n\", __FUNCTION__, arg));\n\n\tNdisMoveMemory(&ConnAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN);\n\tif (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(ConnAddr)));\n\t\n\tif (MAC_ADDR_EQUAL(ConnAddr, ZERO_MAC_ADDR))\n\t{\n\t\tP2pLinkDown(pAd, RT_P2P_DISCONNECTED);\n\t\treturn TRUE;\n\t}\n\n\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t{\n\t\tif (MAC_ADDR_EQUAL(pAd->P2pTable.Client[i].addr, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].bssid, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].InterfaceAddr, ConnAddr))\n\t\t{\n\t\t\tp2pindex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ((p2pindex < pAd->P2pTable.ClientNumber) && (p2pindex != P2P_NOT_FOUND))\n\t{\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_SERVICE_DISCOVER_INIT_COMMAND);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n}\n\nINT Set_P2P_Send_Service_Discovery_Comeback_Proc(\n\t\tIN\tPRTMP_ADAPTER\tpAd, \n\t\tIN\tPSTRING \t\targ)\t\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tUCHAR\t\tp2pindex = P2P_NOT_FOUND;\n\tPUCHAR\tpAddr;\n\tUCHAR ConnAddr[6];\n\tUINT32\ti;\n\textern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Send Service Discovery to DevAddr[%s]\\n\", __FUNCTION__, arg));\n\n\tNdisMoveMemory(&ConnAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN);\n\tif (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(ConnAddr)));\n\t\n\tif (MAC_ADDR_EQUAL(ConnAddr, ZERO_MAC_ADDR))\n\t{\n\t\tP2pLinkDown(pAd, RT_P2P_DISCONNECTED);\n\t\treturn TRUE;\n\t}\n\n\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t{\n\t\tif (MAC_ADDR_EQUAL(pAd->P2pTable.Client[i].addr, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].bssid, ConnAddr) ||\n\t\t\tMAC_ADDR_EQUAL(pAd->P2pTable.Client[i].InterfaceAddr, ConnAddr))\n\t\t{\n\t\t\tp2pindex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ((p2pindex < pAd->P2pTable.ClientNumber) && (p2pindex != P2P_NOT_FOUND))\n\t{\n\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr[0];\n\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_SERVICE_COMEBACK_COMMAND);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Table Idx out of range!\\n\"));\n\n\treturn TRUE;\n}\nINT Set_P2P_DelDevByAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE pObj;\n\tUCHAR DevAddr[6] = {0};\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (rtstrmactohex(arg, (PSTRING) &DevAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\\n\",\t__FUNCTION__, PRINT_MAC(DevAddr)));\n\n\tpEntry = MacTableLookup(pAd, DevAddr);\n\n\tif (pEntry)\n\t{\n\t\tPUCHAR\t\tpOutBuffer = NULL;\t\t\n\t\tULONG\t\tFrameLen = 0;\n\t\tUSHORT \t\tReason = REASON_NO_LONGER_VALID;\n\t\tHEADER_802_11 DeAuthHdr;\n\t\t\n\t\tMlmeAllocateMemory(pAd, &pOutBuffer);\n\n\t\tif (pOutBuffer)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"Send DEAUTH - Reason = %d frame tO %02x:%02x:%02x:%02x:%02x:%02x \\n\",\n\t\t\t\t\t\t\t\t\t\tReason, PRINT_MAC(DevAddr)));\n\n\t\t\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, \n\t\t\t\t\t\t\t\tpEntry->HdrAddr1,\n\t\t\t\t\t\t\t\tpEntry->HdrAddr2,\n\t\t\t\t\t\t\t\tpEntry->HdrAddr3);\n\t    \tMakeOutgoingFrame(pOutBuffer,            &FrameLen,\n\t    \t                  sizeof(HEADER_802_11), &DeAuthHdr,\n\t    \t                  2,                     &Reason,\n\t    \t                  END_OF_ARGS);\n\n\t    \tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t    \tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\tP2pGroupTabDelete(pAd, P2P_NOT_FOUND, DevAddr);\n\t\t}\n\t}\n\t\n\treturn TRUE;\n\n}\n\nINT Set_P2P_DevDiscPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tpP2PCtrl->DevDiscPeriod = (UINT32)simple_strtol(arg, 0, 10);\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P Device Discovery Period = %lu.\\n\", __FUNCTION__, pP2PCtrl->DevDiscPeriod));\n\treturn TRUE;\n}\n\nINT Set_P2P_PriDeviceType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tif (strlen(arg) != 16)\n\t\treturn FALSE;\n\n\tAtoH(arg, pP2PCtrl->DevInfo.PriDeviceType, 8);\n\t\n\thex_dump(\"Set_P2P_PriDeviceType_Proc:: PriDeviceType\", pP2PCtrl->DevInfo.PriDeviceType, 8);\n\treturn TRUE;\n}\n\n/*\n\tUsage Example:\n\tReference P2P Spec. v1.1 Table 29 , Device Info attribute format.\n\t1). 01 = length , 0007 == > Category ID (Display), 0050F204 ==>WFA OUI, 0001 ==> Sub Category ID\n\tiwpriv p2p0 set p2p2ndDevTypeList=0100070050F2040001\n\t\n\t2). 02 = length , 0007 == > Category ID (Display), 0050F204 ==>WFA OUI, 0001 ==> Sub Category ID ;  0007 == > Category ID (Display), 0050F204 ==>WFA OUI, 0002 ==> Sub Category ID ;\n\tiwpriv p2p0 set p2p2ndDevTypeList=0200070050F204000100070050F2040002\n\n\t3). clean up 2nd Device Type List \n\tiwpriv p2p0 set p2p2ndDevTypeList=\t\n*/\n\nINT Set_P2P_SecDevTypeList_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\tpObj;\n\tUCHAR len=0;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tlen = strlen(arg);\n\n\tif (len == 0) //reset to zero\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: reset 2nd Device Type List!\\n\", __FUNCTION__));\n\t\tpP2PCtrl->DevInfo.SecDevTypList[0]=0x00; /* length is zero, so no don't need following 8 bytes*/\n\t}\n\telse if((len >= (9*2))) /* 9 = 1 (length) + 8 (Category ID + WFA OUI + Sub-Category ID */\n\t{\n\t\tif ((len % (8*2))==2)\n\t\t\t\n\t\t{\n\t\t\tUCHAR tpylen=0;\n\t\t\tAtoH(arg, (PUCHAR)&tpylen, 1);\n\t\t\tAtoH(arg, pP2PCtrl->DevInfo.SecDevTypList, (tpylen*8)+1);\n\t\t\thex_dump(\"Set_P2P_SecDevTypeList_Proc : p2p2ndDevTypList\",pP2PCtrl->DevInfo.SecDevTypList, (tpylen*8)+1);\n\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: arg length incorrect\\n\", __FUNCTION__));\t\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: arg length is not enough!\\n\", __FUNCTION__));\t\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_P2P_DelPerstTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n    \tP2pPerstTabClean(pAd);\n}\n\n\nINT Set_P2P_Cancel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPWSC_CTRL pWscControl = NULL;\n\tINT val = (INT)simple_strtol(arg, 0, 10);\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn FALSE;\n\n\tif (val == 1)\n\t{\n\t\tpP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE;\n\t\tif (!MAC_ADDR_EQUAL(&ZERO_MAC_ADDR[0], &pP2PCtrl->ConnectingMAC[0]))\n\t\t{\n\t\t\tUCHAR p2pindex;\n\t\n\t\t\tp2pindex = P2pGroupTabSearch(pAd, pP2PCtrl->ConnectingMAC);\n\t\t\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t\t\t{\n\t\t\t\tif (pAd->P2pTable.Client[p2pindex].Rule == P2P_IS_GO)\n\t\t\t\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY_GO;\n\t\t\t\telse\n\t\t\t\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY;\n\t\t\t\tpAd->P2pTable.Client[p2pindex].StateCount = 0;\n\t\t\t}\n\t\t\tNdisZeroMemory(pP2PCtrl->ConnectingMAC, MAC_ADDR_LEN);\n\t\t}\n\n\t\tif (P2P_GO_ON(pAd))\n\t\t{\n\t\t\tUINT32 i, p2pEntryCnt=0;\n\t\t\tMAC_TABLE_ENTRY\t*pEntry;\n\t\t\tINT\t IsAPConfigured;\n\t\t\t\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl;\n\t\t\tIsAPConfigured = pWscControl->WscConfStatus;\n\t\t\tif (pWscControl->bWscTrigger)\n\t\t\t{\n\t\t\t\tWscStop(pAd, FALSE, pWscControl);\n\t\t\t\tpWscControl->WscPinCode = 0;\n\t\t\t\tWscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, MAIN_MBSSID, NULL, 0, AP_MODE);\n\t\t\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, (MAIN_MBSSID | MIN_NET_DEVICE_FOR_P2P_GO), NULL, 0, AP_MODE);\n\t\t\t\tAPUpdateBeaconFrame(pAd, pObj->ioctl_if);\n\t\t\t}\n\n\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t{\n\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry) && (pEntry->WpaState == AS_PTKINITDONE))\n\t\t\t\t\tp2pEntryCnt++;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Total= %d. p2pEntry = %d.\\n\", __FUNCTION__, pAd->MacTab.Size, p2pEntryCnt));\n\t\t\tif ((p2pEntryCnt == 0) && (pAd->flg_p2p_OpStatusFlags == P2P_GO_UP))\n\t\t\t{\n#ifdef RTMP_MAC_USB\n\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_SET_P2P_LINK_DOWN, NULL, 0);\t\n#endif /* RTMP_MAC_USB */\n\t\t\t}\n\t    }\n\t\telse if (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl;\n\t\t\tpWscControl->WscPinCode = 0;\n\t\t\tif (pWscControl->bWscTrigger)\n\t\t\t\tWscStop(pAd, TRUE, pWscControl);\n\t\t\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n\t\t}\n\t\tP2pStopScan(pAd);\n\t\tpP2PCtrl->bPeriodicListen = TRUE;\n\t\t/* Reset bConfirmByUI to its default value */\n\t\tpP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT;\n\n\t\tif (INFRA_ON(pAd) || P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tINT ch;\n\n\t\t\t// TODO: shiang-6590, why we set bw as 40 when BBPCurrentBW == BW_40??\n\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t\t\t{\n\t\t\t\trtmp_bbp_set_bw(pAd, BW_40);\n\n\t\t\t\tch = pAd->CommonCfg.CentralChannel;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tch = pAd->CommonCfg.Channel;\n\t\t\t}\n\n\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);\n\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Cancel P2P action\\n\", __FUNCTION__));\n\treturn TRUE;\n}\n\nINT Set_P2P_ConfirmByUI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t\tpP2PCtrl->bConfirmByUI = FALSE;\n\telse\n\t\tpP2PCtrl->bConfirmByUI = TRUE;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: bConfirmByUI = %d\\n\", __FUNCTION__, pP2PCtrl->bConfirmByUI));\n\treturn TRUE;\n}\n\nINT Set_P2P_Discoverable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPOS_COOKIE\t\t\tpObj;\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tif (pObj->ioctl_if_type != INT_P2P)\n\t\treturn 0;\n\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t\tpP2PCtrl->bSentProbeRSP = FALSE;\n\telse\n\t\tpP2PCtrl->bSentProbeRSP = TRUE;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: bSentProbeRSP = %d\\n\", __FUNCTION__, pP2PCtrl->bSentProbeRSP));\n\treturn TRUE;\n}\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/common/p2p_disc_mng.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p_ctrl.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. P2P is a Task Group of WFA.\n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\n*/\n#include \"rt_config.h\"\n\n\nstatic VOID P2PDiscScanAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PDiscListenAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PDiscSearchAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID P2PDiscCanlAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThe mesh control state machine, \n\tParameters:\n\t\tSm - pointer to the state machine\n\tNote:\n\t\tthe state machine looks like the following\n\t==========================================================================\n */\n\t\n #ifdef RELEAE_EXCLUDE\n/*\n\t\t\t\t\t\t\tScan command\t\t\tP2P Periodic\t\t\t\tP2P Scan\t\t\t\t\t\t\tCntlOidScanProc \t\t\tMlmeCntlMachinePerformAction\t\t\t\t\t\t  P2P Periodic\n\tP2P_ENABLE_LISTEN_ONLY ---------------> P2P_IDLE -----------> P2P_SEARCH ---------> P2P_SEARCH_COMMAND ---------------> P2P_SEARCH ---------------------------> P2P_SEARCH_COMPLETE -----------> P2P_IDLE\n\tMeshCtrlJoinAction : \n\t\t. Init Bss Table\n\t\t. Init Mesh Channel\n\t\t. enqueue SYNC_STATE_MACHINE with MT2_MLME_SCAN_REQ\n\tScanNextChannel :\n\t\t. scan done, enequeue MESH_CTRL_STATE_MACHINE with APMT2_MLME_SCAN_FINISH\n\n\tP2PCtrlJoinAction\n\t\t. Init P2P Table\n\t\t. Init random timer\n\t\t. enqueeue SYNC_STATE_MACHINE with MT2_MLME_SCAN_REQ\n\tScanNextChannel :\n\t\t. scan done, enequeue P2P_CTRL_STATE_MACHINE with P2P_SCAN_FINISH\n\tP2PCtrlFinishDiscoveryAction :\n\t\t. Init ScanNextRound\n\t\t. change in P2P_IDLE\n*/\n\t\n/*\n\n\tP2P_CTRL_IDLE : do not scan / search / listen.\n\t\t\t\t\tp2p interface up then in IDLE state, or after change as P2P Client / P2P GO in IDLE state.\n\tP2P_CTRL_DISCOVERY : do scan / search / listen in an period.\n\t\t\t\t\tUse P2PDiscMachine do such things and after times up, P2PDiscMachine and P2PCtrlMachine in IDLE state.\n\t\t\t\t\tIf we have Device Name / Device Address and WSC config method, P2PPeriodicExec should MlmeEnqueue\n\t\t\t\t\tP2P_CTRL_GROUP_FORMATION in P2PCtrlMachine.\n\tP2P_CTRL_GROUP_FORMATION : do Group Negotiation and Provision.\n\t\t\t\t\tUse P2PGoFormMachine do such things in ConfigTimeout periodic.\n\tP2P_CTRL_DONE : Group Formation has finish , interface will up as AP or STA code.\n\t\t\t\t\tAfter AsicKey write done, can change to IDLE state.\n\n*/\n#endif /* RELEASE_EXCLUDE */\nVOID P2PDiscoveryStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, (ULONG)P2P_DISC_MAX_STATES,\n\t\t(ULONG)P2P_DISC_MAX_EVENTS, (STATE_MACHINE_FUNC)Drop, P2P_DISC_IDLE, P2P_DISC_IDLE);\n\n\t/* P2P_DISC_IDLE state */\n\tStateMachineSetAction(Sm, P2P_DISC_IDLE, P2P_DISC_SCAN_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscScanAction);\n\tStateMachineSetAction(Sm, P2P_DISC_IDLE, P2P_DISC_LISTEN_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscListenAction);\n\tStateMachineSetAction(Sm, P2P_DISC_IDLE, P2P_DISC_PEER_PROB_REQ, (STATE_MACHINE_FUNC)PeerP2pProbeReq);\n\tStateMachineSetAction(Sm, P2P_DISC_IDLE, P2P_DISC_PEER_PROB_RSP, (STATE_MACHINE_FUNC)PeerP2pBeaconProbeRspAtScan);\n\n\t/* P2P_DISC_SCAN state */\n\tStateMachineSetAction(Sm, P2P_DISC_SCAN, P2P_DISC_LISTEN_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscListenAction);\n\tStateMachineSetAction(Sm, P2P_DISC_SCAN, P2P_DISC_CANL_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscCanlAction);\n\tStateMachineSetAction(Sm, P2P_DISC_SCAN, P2P_DISC_PEER_PROB_RSP, (STATE_MACHINE_FUNC)PeerP2pBeaconProbeRspAtScan);\n\n\t/* P2P_DISC_LISTEN state */\n\tStateMachineSetAction(Sm, P2P_DISC_LISTEN, P2P_DISC_SEARCH_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscSearchAction);\n\tStateMachineSetAction(Sm, P2P_DISC_LISTEN, P2P_DISC_CANL_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscCanlAction);\n\tStateMachineSetAction(Sm, P2P_DISC_LISTEN, P2P_DISC_PEER_PROB_REQ, (STATE_MACHINE_FUNC)PeerP2pProbeReq);\n\tStateMachineSetAction(Sm, P2P_DISC_LISTEN, P2P_DISC_SCAN_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscScanAction);\n\n\t/* P2P_DISC_SEARCH state */\n\tStateMachineSetAction(Sm, P2P_DISC_SEARCH, P2P_DISC_LISTEN_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscListenAction);\n\tStateMachineSetAction(Sm, P2P_DISC_SEARCH, P2P_DISC_CANL_CMD_EVT, (STATE_MACHINE_FUNC)P2PDiscCanlAction);\n\tStateMachineSetAction(Sm, P2P_DISC_SEARCH, P2P_DISC_PEER_PROB_RSP, (STATE_MACHINE_FUNC)PeerP2pBeaconProbeRspAtScan);\n\n\t/* init Device Discovery Timer */\n\tP2PInitDevDiscTimer(pAd, 0);\n\tP2PInitNextScanTimer(pAd, 0);\n\tP2PInitListenTimer(pAd, 0);\n\n\t/* init all P2P ctrl state. */\n\tpAd->P2pCfg.DiscCurrentState = P2P_DISC_IDLE;\n\n\treturn;\n}\n\n/* Device Discovery Action */\nstatic VOID P2PDiscScanAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tMLME_SCAN_REQ_STRUCT ScanReq;\n\tBOOLEAN Cancelled;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::\\n\", __FUNCTION__));\n\t/* If I just finish group formation as GO. don't do scan . If I am auto GO, I should support P2P scan too. So check GoIntentIdx != 16. */\n\tif ((pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO) && (pP2PCtrl->GoIntentIdx <= 15))\n\t{\n\t\tpP2PCtrl->P2pCounter.Counter100ms = 0;\n\t}\n\n\t/* Stop Scan and resume */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\t/*pAd->StaCfg.bSkipAutoScanConn = TRUE;*/\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\t\tpAd->MlmeAux.Channel = 0;\n\t\tScanNextChannel(pAd, OPMODE_STA);\t\t\n\t}\n\n\n\t/* Scan Type is SCAN_P2P for SYNC State Machine */\n\tScanParmFill(pAd, &ScanReq, \"\", 0, BSS_ANY, SCAN_P2P);\n\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, \n\t\tsizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t*pCurrState = P2P_DISC_SCAN;\n/*\tpAd->StaCfg.bSkipAutoScanConn = FALSE;*/\n}\t\n\nstatic VOID P2PDiscCanlAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\t\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tUCHAR channel = pP2PCtrl->ListenChannel;\n\tUCHAR p2pindex;\n\tBOOLEAN bGoBack = TRUE;\n\n\t/*\n\t\tGo back to working channel\n\t*/\n\tif (INFRA_ON(pAd) || (pAd->flg_p2p_OpStatusFlags != P2P_DISABLE))\n\t{\n\t\tif ((pAd->CommonCfg.Channel != pAd->CommonCfg.CentralChannel) && (pAd->CommonCfg.BBPCurrentBW == BW_40))\n\t\t\tchannel = pAd->CommonCfg.CentralChannel;\n\t\telse\n\t\t\tchannel = pAd->CommonCfg.Channel;\n\t}\n\n\tp2pindex = P2pGroupTabSearch(pAd, pAd->P2pCfg.ConnectingMAC);\n\tif (p2pindex != P2P_NOT_FOUND)\n\t{\n\t\tif (pAd->P2pTable.Client[p2pindex].P2pClientState > P2PSTATE_DISCOVERY_UNKNOWN)\n\t\t\tbGoBack = FALSE;\n\t}\n\n\tif (bGoBack && (channel != pAd->LatchRfRegs.Channel))\n\t{\n\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t\t\trtmp_bbp_set_bw(pAd, BW_40);\n\n\t\tAsicSwitchChannel(pAd, channel, FALSE);\n\t\tAsicLockChannel(pAd, channel);\t\t\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2PDiscCanlAction - Restore to channel %d\\n\",channel));\n\t}\n\t\t\n\t*pCurrState = P2P_DISC_IDLE;\n}\t\n\nstatic VOID P2PDiscScanCanlAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\t/*PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;*/\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: The Device Discovery time has expired, stop!!\\n\", __FUNCTION__));\n\t*pCurrState = P2P_DISC_LISTEN;\n}\n\nstatic VOID P2PDiscListenAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\n\tif (pP2PCtrl->P2pCounter.bStartScan == TRUE)\n\t\tpP2PCtrl->P2pCounter.ListenInterval = (RandomByte(pAd) % 3) + pP2PCtrl->P2pCounter.ListenIntervalBias; /* 1~3 */\n\telse\n\t\tpP2PCtrl->P2pCounter.ListenInterval = 5;\n\n\t/* ExtListenInterval is in ms. So /100 */\n\tif (IS_P2P_SUPPORT_EXT_LISTEN(pAd))\n\t\tpP2PCtrl->P2pCounter.ListenInterval = pP2PCtrl->ExtListenPeriod/100;\n\n\tif (pAd->LatchRfRegs.Channel != pP2PCtrl->ListenChannel)\n\t{\n\t\t/* Let BBP register at 20MHz */\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\n\t\tAsicSwitchChannel(pAd, pP2PCtrl->ListenChannel, FALSE);\n\t\tAsicLockChannel(pAd, pP2PCtrl->ListenChannel);\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Listen interval - %d\\n\", __FUNCTION__, pP2PCtrl->P2pCounter.ListenInterval));\n\n\tpP2PCtrl->P2pCounter.bListen = TRUE;\n\t*pCurrState = P2P_DISC_LISTEN;\n}\n\nstatic VOID P2PDiscListenCanlAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\t/*PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;*/\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: The Device Discovery time has expired, stop!!\\n\", __FUNCTION__));\n\t*pCurrState = P2P_DISC_LISTEN;\n}\n\nstatic VOID P2PDiscSearchAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tMLME_SCAN_REQ_STRUCT ScanReq;\n\n\tif (pP2PCtrl->P2pCounter.bStartScan)\n\t{\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s::\\n\", __FUNCTION__));\n\tScanParmFill(pAd, &ScanReq, \"\", 0, BSS_ANY, SCAN_P2P_SEARCH);\n\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, \n\t\tsizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t*pCurrState = P2P_DISC_SEARCH;\n}\t\n}\t\n\nstatic VOID P2PDiscSearchCanlAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: The Device Discovery time has expired, stop!!\\n\", __FUNCTION__));\n\t*pCurrState = P2P_DISC_LISTEN;\n}\n"
  },
  {
    "path": "src/common/p2p_inf.c",
    "content": "/*\n *************************************************************************** \n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p_inf.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\n*/\n#define RTMP_MODULE_OS\n\n#ifdef P2P_SUPPORT\n\n/*#include \"rt_config.h\" */\n/*#include \"p2p_inf.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n\n/*\n========================================================================\nRoutine Description:\n    Initialize Multi-BSS function.\n\nArguments:\n    pAd\t\t\t\tpoints to our adapter\n    pDevMain\t\tpoints to the main BSS network interface\n\nReturn Value:\n    None\n\nNote:\n\t1. Only create and initialize virtual network interfaces.\n\t2. No main network interface here.\n========================================================================\n*/\nVOID RTMP_P2P_Init(\n\tIN VOID \t\t*pAd,\n\tIN PNET_DEV\t\tmain_dev_p)\n{\n\t/*PNET_DEV pDevNew; */\n\t/*INT status;*/\n\tRTMP_OS_NETDEV_OP_HOOK\tnetDevHook;\n\t/*APCLI_STRUCT\t*pApCliEntry; */\n\t\t\t\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s --->\\n\", __FUNCTION__));\n\n\t\t/* init operation functions and flags */\n\t\tNdisZeroMemory(&netDevHook, sizeof(netDevHook));\n\t\tnetDevHook.open = P2P_VirtualIF_Open;\t/* device opem hook point */\n\t\tnetDevHook.stop = P2P_VirtualIF_Close;\t/* device close hook point */\n\t\tnetDevHook.xmit = P2P_VirtualIF_PacketSend;\t/* hard transmit hook point */\n\t\tnetDevHook.ioctl = P2P_VirtualIF_Ioctl;\t/* ioctl hook point */\n\n#if WIRELESS_EXT >= 12\n\t\tnetDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def;\n#endif /* WIRELESS_EXT >= 12 */\n\t\tRTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_INIT,\n\t\t\t\t\t\t\t0, &netDevHook, 0);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s <---\\n\", __FUNCTION__));\n\n}\n\n/*\n========================================================================\nRoutine Description:\n    Open a virtual network interface.\n\nArguments:\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: open successfully\n    otherwise: open fail\n\nNote:\n========================================================================\n*/\nINT P2P_VirtualIF_Open(\n\tIN PNET_DEV\t\tdev_p)\n{\n\tVOID *pAd;\n\t/*PMULTISSID_STRUCT\tpMbss; */\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===> %s\\n\", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));\n\n\tif (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_OPEN_PRE, 0,\n\t\t\t\t\t\t\tdev_p, 0) != NDIS_STATUS_SUCCESS)\n\t\treturn -1;\n\n\tif (VIRTUAL_IF_UP(pAd) != 0)\n\t\treturn -1;\n\n\t/* increase MODULE use count */\n\tRT_MOD_INC_USE_COUNT();\n\n\tRTMP_OS_NETDEV_START_QUEUE(dev_p);\n\n\tif (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_OPEN_POST, 0,\n\t\t\t\t\t\t\tdev_p, 0) != NDIS_STATUS_SUCCESS)\n\t\treturn -1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: <=== %s\\n\", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));\n\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Close a virtual network interface.\n\nArguments:\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: close successfully\n    otherwise: close fail\n\nNote:\n========================================================================\n*/\nINT P2P_VirtualIF_Close(\n\tIN\tPNET_DEV\tdev_p)\n{\n\tVOID *pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ===> %s\\n\", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));\n\n\t/* stop p2p. */\n\tRTMP_OS_NETDEV_STOP_QUEUE(dev_p);\n\n\tRTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_CLOSE, 0, dev_p, 0);\n\n\tVIRTUAL_IF_DOWN(pAd);\n\n\tRT_MOD_DEC_USE_COUNT();\n\n\treturn 0;\n} \n\n\n/*\n========================================================================\nRoutine Description:\n    Send a packet to WLAN.\n\nArguments:\n    skb_p           points to our adapter\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: transmit successfully\n    otherwise: transmit fail\n\nNote:\n========================================================================\n*/\nINT P2P_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET \tskb_p, \n\tIN PNET_DEV\t\t\tdev_p)\n{\n\t/*PRTMP_ADAPTER pAd; */\n\t/*PAPCLI_STRUCT pApCli; */\n\n\t\n\tMEM_DBG_PKT_ALLOC_INC(skb_p);\n\n\tif(!(RTMP_OS_NETDEV_STATE_RUNNING(dev_p)))\n\t{\n\t\t/* the interface is down */\n\t\tRELEASE_NDIS_PACKET(NULL, skb_p, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n\n\treturn P2P_PacketSend(skb_p, dev_p, rt28xx_packet_xmit);\n\n}\n\n\nVOID RTMP_P2P_Remove(\n\tIN VOID \t*pAd)\n{\n\n\tRTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_P2P_REMOVE, 0, NULL, 0);\n\n\t\t\n}\n\n/*\n========================================================================\nRoutine Description:\n    IOCTL to WLAN.\n\nArguments:\n    dev_p           which WLAN network interface\n    rq_p            command information\n    cmd             command ID\n\nReturn Value:\n    0: IOCTL successfully\n    otherwise: IOCTL fail\n\nNote:\n    SIOCETHTOOL     8946    New drivers use this ETHTOOL interface to\n                            report link failure activity.\n========================================================================\n*/\nINT P2P_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tdev_p, \n\tIN OUT VOID \t*rq_p, \n\tIN INT \t\t\t\t\tcmd)\n{\n/*\n\tRTMP_ADAPTER *pAd;\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t\treturn -ENETDOWN;\n*/\n\t\treturn rt28xx_ioctl(dev_p, rq_p, cmd);\n\n}\n\n\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/common/p2p_nego_mng.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p_ctrl.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. P2P is a Task Group of WFA.\n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\n*/\n#include \"rt_config.h\"\n\n\n/* Group Formation Action */\n\nVOID P2pPeerGoNegoReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pPeerGoNegoRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pPeerGoNegoConfirmAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\n\nVOID P2pPeerProvisionReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pPeerProvisionRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\n\nVOID P2pPeerDeviceDiscRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pPeerInvitesReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pPeerInvitesRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pStartCommunicateAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendProvisionCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendInviteCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendDevDiscCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendServDiscCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendStartGroupFormCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pPeerDevDiscoverReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendPassedAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID InvalidP2PGoNegoState(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic p2p_cmd_handler rt_p2p_handler[] =\n{\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_NONE, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_DISCOVERY, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_DISCOVERY_GO, */\n\t(p2p_cmd_handler) NULL, \t\t\t\t\t\t\t\t\t/* P2PSTATE_DISCOVERY_CLIENT, */\n\t(p2p_cmd_handler) NULL, \t\t\t\t\t\t\t\t\t/* P2PSTATE_DISCOVERY_UNKNOWN, */\n\t(p2p_cmd_handler) NULL, \t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_DISCO_COMMAND, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_WAIT_GO_DISCO_ACK, */\n\t(p2p_cmd_handler) NULL, \t\t\t\t\t\t\t\t\t/* P2PSTATE_WAIT_GO_DISCO_ACK_SUCCESS, */\n\t(p2p_cmd_handler) P2pSendDevDiscCmd, \t\t\t\t\t/* P2PSTATE_GO_DISCO_COMMAND, */\n\t(p2p_cmd_handler) P2pSendInviteCmd,\t\t\t\t\t\t/* P2PSTATE_INVITE_COMMAND, */\n\t(p2p_cmd_handler) P2pSendStartGroupFormCmd,\t\t\t\t/* P2PSTATE_CONNECT_COMMAND, */\n\t(p2p_cmd_handler) P2pSendProvisionCmd,\t\t\t\t\t/* P2PSTATE_PROVISION_COMMAND, */\n\t(p2p_cmd_handler) P2pSendServDiscCmd,\t\t\t\t\t/* P2PSTATE_SERVICE_DISCO_COMMAND, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_SERVICE_COMEBACK_COMMAND, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_SENT_INVITE_REQ, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_SENT_PROVISION_REQ, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_SENT_PROVISION_RSP, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_WAIT_REVOKEINVITE_RSP_ACK, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_REVOKEINVITE_RSP_ACK_SUCCESS, */\t\t\n\t(p2p_cmd_handler) P2pSendStartGroupFormCmd,\t\t\t\t/* P2PSTATE_SENT_GO_NEG_REQ, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GOT_GO_RSP_INFO_UNAVAI, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_WAIT_GO_COMFIRM, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_WAIT_GO_COMFIRM_ACK, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GOT_GO_COMFIRM, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_COMFIRM_ACK_SUCCESS, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_REINVOKEINVITE_TILLCONFIGTIME, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_DONE, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_WPS, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_AUTH, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_ASSOC, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_WPS, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_WPS_DONE, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_AUTH, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_ASSOC, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_OPERATING, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_ABSENCE, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_SCAN, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_CLIENT_FIND, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_OPERATING, */\t\t\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_ABSENCE, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_SCAN, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_GO_FIND, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_NONP2P_PSK, */\n\t(p2p_cmd_handler) NULL,\t\t\t\t\t\t\t\t\t/* P2PSTATE_NONP2P_WPS, */\n};\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThe mesh control state machine, \n\tParameters:\n\t\tSm - pointer to the state machine\n\tNote:\n\t\tthe state machine looks like the following\n\t==========================================================================\n */\nVOID P2PGoFormationStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, (ULONG)P2P_GO_FORM_MAX_STATES,\n\t\t(ULONG)P2P_GO_NEGO_MAX_EVENTS, (STATE_MACHINE_FUNC)Drop, P2P_GO_FORM_IDLE, P2P_GO_FORM_IDLE);\n\n\t/* P2P_GO_FORM_IDLE state */\n\t/*StateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_GO_NEGO_REQ_CMD_EVT, (STATE_MACHINE_FUNC)P2PStartGroupFormsAction); */\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_PEER_GO_NEGO_REQ_EVT, (STATE_MACHINE_FUNC)P2pPeerGoNegoReqAction);\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_PEER_GO_NEGO_RSP_EVT, (STATE_MACHINE_FUNC)P2pPeerGoNegoRspAction); \n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_PEER_GO_NEGO_PROV_REQ_EVT, (STATE_MACHINE_FUNC)P2pPeerProvisionReqAction);\n\t/*StateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_GO_NEGO_PROV_REQ_CMD_EVT, (STATE_MACHINE_FUNC)P2pProvisionReqAction); */\n\t/*StateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_DEV_DISC_REQ_CMD_EVT, (STATE_MACHINE_FUNC)P2pDeviceDiscReqAction); */\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_PEER_INVITE_REQ_EVT, (STATE_MACHINE_FUNC)P2pPeerInvitesReqAction);\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_START_COMMUNICATE_CMD_EVT, (STATE_MACHINE_FUNC)P2pStartCommunicateAction);\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_PEER_DEV_DISC_REQ_EVT, (STATE_MACHINE_FUNC)P2pPeerDevDiscoverReqAction);\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_SEND_PASSED_CMD_EVT, (STATE_MACHINE_FUNC)P2pSendPassedAction);\n\tStateMachineSetAction(Sm, P2P_GO_FORM_IDLE, P2P_PEER_GO_NEGO_PROV_RSP_EVT, (STATE_MACHINE_FUNC)P2pPeerProvisionRspAction);\n\n\t/* P2P_WAIT_GO_FORM_RSP state */\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_RSP, P2P_PEER_GO_NEGO_RSP_EVT, (STATE_MACHINE_FUNC)P2pPeerGoNegoRspAction);\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_RSP, P2P_START_COMMUNICATE_CMD_EVT, (STATE_MACHINE_FUNC)InvalidP2PGoNegoState);\n\n\t/* P2P_WAIT_GO_FORM_CONF state */\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_CONF, P2P_PEER_GO_NEGO_CONFIRM_EVT, (STATE_MACHINE_FUNC)P2pPeerGoNegoConfirmAction);\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_CONF, P2P_SEND_PASSED_CMD_EVT, (STATE_MACHINE_FUNC)P2pSendPassedAction);\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_CONF, P2P_PEER_GO_NEGO_REQ_EVT, (STATE_MACHINE_FUNC)P2pPeerGoNegoReqAction); // carella : 2011-06-13.\n\n\t/* P2P_GO_FORM_PROV state */\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_PROV_RSP, P2P_PEER_GO_NEGO_PROV_RSP_EVT, (STATE_MACHINE_FUNC)P2pPeerProvisionRspAction);\n\n\t/* P2P_GO_FORM_DEV_DISC state */\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_DEV_DISC_RSP, P2P_PEER_DEV_DISC_RSP_EVT, (STATE_MACHINE_FUNC)P2pPeerDeviceDiscRspAction);\n\n\t/* P2P_WAIT_GO_FORM_INVITE_RSP state */\n\tStateMachineSetAction(Sm, P2P_WAIT_GO_FORM_INVITE_RSP, P2P_PEER_INVITE_RSP_EVT, (STATE_MACHINE_FUNC)P2pPeerInvitesRspAction);\n\n\t/* init all P2P ctrl state. */\n\tpAd->P2pCfg.GoFormCurrentState = P2P_GO_FORM_IDLE;\n\n\treturn;\n}\n\t\n/* Group Formation Acrtion */\n\t\nVOID P2pPeerGoNegoReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE && pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_CONF )\n\t\treturn;\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tINT\t\t\tP2PEntryCnt;\n\t\n\tif (P2P_GO_ON(pAd))\n\t{\n\t\tP2PEntryCnt = P2PGetEntryCnt(pAd);\n\t\tif ( (pP2PCtrl->p2pMaxEntry!= 0 ) && (P2PEntryCnt >= pP2PCtrl->p2pMaxEntry) )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pPeerGoNegoReqAction ==>P2PGetEntryCnt = %d\\n\", P2PEntryCnt));\n\t\t\t*pCurrState = P2P_GO_FORM_IDLE;\n\t\t\treturn;\n\t\t}\n\t}\n\tif ( pP2PCtrl->bProvAutoRsp == FALSE )\n\t{\n\t\tBOOLEAN \tCancelled;\n\n\t\tif (pP2PCtrl->bP2pReSendTimerRunning)\n\t\t{\n\t\t\tpP2PCtrl->bP2pReSendTimerRunning = FALSE;\n\t\t\tpAd->P2pTable.Client[pP2PCtrl->P2pProvIndex].ReTransmitCnt = 0;\n\t\t\tRTMPCancelTimer(&pP2PCtrl->P2pReSendTimer, &Cancelled);\n\t\t}\n\t\t\n\t\tpP2PCtrl->P2pProvIndex = P2P_NOT_FOUND;\n\t\tpP2PCtrl->P2pProvUserNotify = FALSE;\n\t\tpAd->P2pCfg.P2pCounter.UserAccept = 0;\n\t}\n\n\t/*\n\t\tSkip auto scan conn in STAMlmePeriodicExec\n\t*/\n\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\tP2pReceGoNegoReqAction(pAd, Elem);\n\t\n\t*pCurrState = P2P_WAIT_GO_FORM_CONF;\n}\n\nVOID P2pPeerGoNegoRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE && pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_RSP )\n\t\treturn;\n\t\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\t*pCurrState = P2P_GO_FORM_IDLE;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tP2pReceGoNegoRspAction(pAd, Elem);\n\n}\n\nVOID P2pPeerGoNegoConfirmAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_CONF)\n\t\treturn;\n\n\tP2pReceGoNegoConfirmAction(pAd, Elem);\n\t/*\n\t\tDO NOT skip auto scan conn in STAMlmePeriodicExec\n\t*/\n\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\n\nVOID P2pPeerProvisionReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE)\n\t\treturn;\n\n\t/*\n\t\tSkip auto scan conn in STAMlmePeriodicExec\n\t*/\n\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\t\n\tP2pReceProvisionReqAction(pAd, Elem);\n\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\nVOID P2pPeerProvisionRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_PROV_RSP && pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE)\n\n\t\treturn;\n\n\tP2pReceProvisionRspAction(pAd, Elem);\n\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);\n\n\t/*\n\t\tDO NOT skip auto scan conn in STAMlmePeriodicExec\n\t*/\n\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\n\nVOID P2pPeerDeviceDiscRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\t\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_DEV_DISC_RSP)\n\t\treturn;\n\n\tP2pReceDevDisRspAction(pAd, Elem);\n\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\nVOID P2pPeerInvitesReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE )\n\n\t\treturn;\t\n\n\t/*\n\t\tSkip auto scan conn in STAMlmePeriodicExec\n\t*/\n\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\tP2pReceInviteReqAction(pAd, Elem);\n\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\nVOID P2pPeerInvitesRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_WAIT_GO_FORM_INVITE_RSP)\n\t\treturn;\t\n\n\tP2pReceInviteRspAction(pAd, Elem);\n\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);\n\n\t/*\n\t\tDO NOT skip auto scan conn in STAMlmePeriodicExec\n\t*/\n\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\nVOID P2pPeerDevDiscoverReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\n\tif (pAd->P2pCfg.GoFormCurrentState != P2P_GO_FORM_IDLE)\n\t\treturn;\t\n\n\tP2pReceDevDisReqAction(pAd, Elem);\n\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\nVOID InvalidP2PGoNegoState(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\nVOID P2pStartCommunicateAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tp2p_cmd_handler p2p_handler;\n\n\tp2p_handler = rt_p2p_handler[Elem->Priv];\n\tif (p2p_handler)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: CMD_ID = %ld\\n\", __FUNCTION__, Elem->Priv));\n\t\tp2p_handler(pAd, Elem);\n\t}\n}\n\nVOID P2pSendProvisionCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\tPP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg;\n\tUCHAR p2pIdx;\n\tULONG\tFrameLen;\n\tUSHORT PeerWscMethod;\n\tUCHAR Addr[6] = {0};\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2pCmd->Addr)));\n\tp2pIdx = P2pGroupTabSearch(pAd, pP2pCmd->Addr);\n\tP2PPrintP2PEntry(pAd, p2pIdx);\n\n\tif (p2pIdx == P2P_NOT_FOUND)\n\t\treturn;\n\n\tif (pAd->P2pTable.Client[p2pIdx].Rule == P2P_IS_GO)\n\t\tRTMPMoveMemory(&Addr, pAd->P2pTable.Client[p2pIdx].bssid, sizeof(Addr));\n\telse\n\t\tRTMPMoveMemory(&Addr, pAd->P2pTable.Client[p2pIdx].addr, sizeof(Addr));\n\t\n\tif (pAd->P2pCfg.Dpid != DEV_PASS_ID_NOSPEC)\n\t{\n\t\tif ((pAd->P2pCfg.Dpid == DEV_PASS_ID_USER) && ((pAd->P2pTable.Client[p2pIdx].ConfigMethod & WSC_CONFMET_DISPLAY) != 0))\n\t\t{\n\t\t\tpAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\t\tP2PSendProvisionReq(pAd, WSC_CONFMET_DISPLAY, pAd->P2pTable.Client[p2pIdx].GeneralToken, pAd->P2pTable.Client[p2pIdx].addr, &FrameLen);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Request : CONFIG_METHOD_DISPLAY\t\\n\"));\n\t\t}\n\t\telse if ((pAd->P2pCfg.Dpid == DEV_PASS_ID_PBC) && ((pAd->P2pTable.Client[p2pIdx].ConfigMethod & WSC_CONFMET_PBC) != 0))\n\t\t{\n\t\t\tpAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\t\tP2PSendProvisionReq(pAd, WSC_CONFMET_PBC, pAd->P2pTable.Client[p2pIdx].GeneralToken, pAd->P2pTable.Client[p2pIdx].addr, &FrameLen);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Request : CONFIG_METHOD_PUSHBUTTON  \\n\"));\n\t\t}\n\t\telse if ((pAd->P2pCfg.Dpid == DEV_PASS_ID_REG) && ((pAd->P2pTable.Client[p2pIdx].ConfigMethod&WSC_CONFMET_KEYPAD) != 0))\n\t\t{\n\t\t\tpAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\t\tP2PSendProvisionReq(pAd, WSC_CONFMET_KEYPAD, pAd->P2pTable.Client[p2pIdx].GeneralToken, pAd->P2pTable.Client[p2pIdx].addr, &FrameLen);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Request : CONFIG_METHOD_KEYPAD  \\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\t\tif (pAd->P2pCfg.ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\t\tP2PSendProvisionReq(pAd, WSC_CONFMET_KEYPAD, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen);\n\t\t\telse if (pAd->P2pCfg.ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t\tP2PSendProvisionReq(pAd, WSC_CONFMET_DISPLAY, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen);\n\t\t\telse\n\t\t\t\tP2PSendProvisionReq(pAd, WSC_CONFMET_PBC, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen);\n\t\t}\n\t}\n\telse\n\t{\n\t\tP2P_SetWscRule(pAd, pP2pCmd->Idx, &PeerWscMethod);\n\t\tpAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\tP2PSendProvisionReq(pAd, PeerWscMethod, pAd->P2pTable.Client[p2pIdx].GeneralToken, pAd->P2pTable.Client[p2pIdx].addr, &FrameLen);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Request : CONFIG_METHOD_KEYPAD  \\n\"));\n\t}\n\n\t*pCurrState = P2P_WAIT_GO_FORM_PROV_RSP;\n}\n\n\nVOID P2pSendInviteCmd(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\tPP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg;\n\tUCHAR perstindex, p2pIndex;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2pCmd->Addr)));\n\n\tp2pIndex = pP2pCmd->Idx;\n\tif (pP2PCtrl->Rule == P2P_IS_GO)\n\t{\n\t\t/* Invite Case 1 : I am Auto GO to invite a P2P Device or when I am P2P Client */\n\t\tP2pInvite(pAd, pP2pCmd->Addr, MAX_P2P_TABLE_SIZE, p2pIndex);\n\t}\n\telse if (IS_P2P_CONNECT_IDLE(pAd))\n\t{\n\t\t/* since I am idle,  */\n\t\tperstindex = P2pPerstTabSearch(pAd, pAd->P2pTable.Client[p2pIndex].addr, pAd->P2pTable.Client[p2pIndex].bssid, pAd->P2pTable.Client[p2pIndex].InterfaceAddr);\n\t\tif ((perstindex < MAX_P2P_TABLE_SIZE) && (IS_PERSISTENT_ON(pAd)))\n\t\t{\n\t\t\t/*\n\t\t\t\tI have credential, my persistent is enabled, peer 's persistent is enabled.\t\n\t\t\t\tSo use Reinvoke method to start P2P group.\n\t\t\t */\n\t\t\tP2pInvite(pAd, pAd->P2pTable.Client[p2pIndex].addr, perstindex, p2pIndex);\n\t\t\tpAd->P2pCfg.P2PConnectState = P2P_INVITE;\n\t\t}\n\t}\n\n\t*pCurrState = P2P_WAIT_GO_FORM_INVITE_RSP;\n}\n\nVOID P2pSendDevDiscCmd(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\tPP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg;\n\tUCHAR p2pIdx;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2pCmd->Addr)));\n\tp2pIdx = P2pGroupTabSearch(pAd, pP2pCmd->Addr);\n\tP2PPrintP2PEntry(pAd, p2pIdx);\n\n\tif (p2pIdx == P2P_NOT_FOUND)\n\t\treturn;\n\n\tP2pClientDiscovery(pAd, pAd->P2pTable.Client[p2pIdx].addr, p2pIdx);\n\t*pCurrState = P2P_WAIT_GO_FORM_DEV_DISC_RSP;\n}\n\nVOID P2pSendServDiscCmd(\n\t\tIN PRTMP_ADAPTER pAd,\n\t\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\tPP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg;\n\tUCHAR p2pIdx;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2pCmd->Addr)));\n\tp2pIdx = P2pGroupTabSearch(pAd, pP2pCmd->Addr);\n\tP2PPrintP2PEntry(pAd, p2pIdx);\n\n\tif (p2pIdx == P2P_NOT_FOUND)\n\t\treturn;\n\n\tP2pSendServiceReqCmd(pAd, pAd->P2pTable.Client[p2pIdx].addr, p2pIdx);\n\tpAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_DISCOVERY;\n\t*pCurrState = P2P_WAIT_GO_FORM_SRV_DISC_RSP;\n}\n\nVOID P2pSendStartGroupFormCmd(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\tPP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg;\n\tUSHORT PeerWscMethod;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2pCmd->Addr)));\n\tP2PPrintP2PEntry(pAd, pP2pCmd->Idx);\n\t*pCurrState = P2P_WAIT_GO_FORM_RSP;\n\tif (pP2PCtrl->Dpid == DEV_PASS_ID_NOSPEC)\n\t\tP2P_SetWscRule(pAd, pP2pCmd->Idx, &PeerWscMethod);\n\tP2pStartGroupForm(pAd, pAd->P2pTable.Client[pP2pCmd->Idx].addr, pP2pCmd->Idx);\n}\n\nVOID P2pSendPassedAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tP2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState);\n\tPP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg;\n\tUCHAR index = pP2pCmd->Idx;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::\\n\", __FUNCTION__));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Addr = %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pP2pCmd->Addr)));\n\n\tP2pConnectPrepare(pAd, pP2pCmd->Addr, P2PSTATE_CONNECT_COMMAND);\n\t*pCurrState = P2P_GO_FORM_IDLE;\n}\n\n"
  },
  {
    "path": "src/common/p2p_packet.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p_packet.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. P2P is a Task Group of WFA. this file contains all functions that handles p2p packets \n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\tJan Lee         2010-03-08    created for Peer-to-Peer(Wifi Direct)\n*/\n#include \"rt_config.h\"\n\nextern UCHAR\tOutMsgBuf[];\t\t/* buffer to create message contents */\nextern UCHAR\tWILDP2PSSID[];\nextern UCHAR\tWILDP2PSSIDLEN;\nextern UCHAR\tWIFIDIRECT_OUI[];\nextern UCHAR\tP2POUIBYTE[];\nextern UCHAR ZERO_MAC_ADDR[];\nextern UCHAR WPS_OUI[];\nextern UCHAR\tSTA_Wsc_Pri_Dev_Type[];\nextern UCHAR\tAP_Wsc_Pri_Dev_Type[];\n\n#ifdef WFD_SUPPORT\nextern UCHAR\tWIFIDISPLAY_OUI[];\n#endif /* WFD_SUPPORT */\n\nextern INT Set_P2p_OpMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nextern INT Set_P2pCli_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPubliac action frame. But with ACtion is GAS_INITIAL_REQ (11).\n\t\t802.11u. 7.4.7.10\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID PeerGASIntialReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\tUCHAR\tp2pindex;\n\tUCHAR\tAddr2[6];\n\tPFRAME_802_11\tpFrame;\n\tPRT_P2P_CLIENT_ENTRY\tpP2pEntry;\n\tMLME_P2P_ACTION_STRUCT\tP2PActReq;\n\tUINT\tServiceDiscQueryLen = 0;\n\tPUCHAR ServiceDiscQuery = NULL;\n\t\n\tpFrame = (PFRAME_802_11)Elem->Msg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pPeer  GASIntialReqAction = %d, \\n\", Elem->MsgLen));\n\tCOPY_MAC_ADDR(Addr2, pFrame->Hdr.Addr2);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"From Addr2 = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(Addr2)));\n#ifdef WFD_SUPPORT\n\tos_alloc_mem(pAd, &ServiceDiscQuery, MAX_VIE_LEN);\n\n\tif (ServiceDiscQuery == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Allocate memory size(=1024) failed\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n#endif /* WFD_SUPPORT */\n\n\n\tp2pindex = P2pGroupTabSearch(pAd, Addr2);\n\tif (p2pindex == P2P_NOT_FOUND)\n\t{\n\t\tp2pindex = P2pGroupTabInsert(pAd, Addr2, P2PSTATE_DISCOVERY, NULL, 0, 0, 0);\n\t}\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\n#ifdef WFD_SUPPORT\n\t\tRTMPZeroMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info, sizeof(WFD_SERV_DISC_QUERY_INFO));\n#endif /* WFD_SUPPORT */\n\t\thex_dump(\"----> P2PParseServiceDiscoReq\", Elem->Msg, Elem->MsgLen);\n\t\tP2PParseServiceDiscoReq(pAd, pFrame, &pP2pEntry->DialogToken, &pAd->P2pCfg.ServiceTransac, ServiceDiscQuery, &ServiceDiscQueryLen);\n\n#ifdef WFD_SUPPORT\n\t\t/* Query All WFD Service */\n\t\tif (ServiceDiscQueryLen == 3)\n\t\t{\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_device_info_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_associate_bssid_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_audio_format_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_video_format_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_3d_video_format_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_content_proctection = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_couple_sink_info_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_extent_capability_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_local_ip_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_session_info_ie = TRUE;\n\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_alternate_mac_addr_ie = TRUE;\n\t\t}\n\t\tif ((ServiceDiscQueryLen > 3))\n\t\t{\n\t\t\tPUCHAR\t\tpWfdEid = NULL;\n\t\t\tINT\t\t\tiLen;\n\n\t\t\thex_dump(\"P2PParseServiceDiscoReq:: Query\", ServiceDiscQuery, (ServiceDiscQueryLen - 3));\n\t\t\tpWfdEid = ServiceDiscQuery;\n\n\t\t\tfor (iLen = ServiceDiscQueryLen - 3; iLen > 0; iLen--)\n\t\t\t{\n\t\t\t\tswitch (*pWfdEid)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tcase SUBID_WFD_DEVICE_INFO:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_device_info_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_DEVICE_INFO\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_ASSOCIATED_BSSID:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_associate_bssid_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_ASSOCIATED_BSSID\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_AUDIO_FORMATS:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_audio_format_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_AUDIO_FORMATS\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_VIDEO_FORMATS:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_video_format_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_VIDEO_FORMATS\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_3D_VIDEO_FORMATS:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_3d_video_format_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_3D_VIDEO_FORMATS\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_CONTENT_PROTECTION:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_content_proctection = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_CONTENT_PROTECTION\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_COUPLED_SINK_INFO:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_couple_sink_info_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_COUPLED_SINK_INFO\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_EXTENDED_CAP:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_extent_capability_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_EXTENDED_CAP\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_LOCAL_IP_ADDR:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_local_ip_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_LOCAL_IP_ADDR\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_SESSION_INFO:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_session_info_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_SESSION_INFO\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_ALTERNATE_MAC_ADDR:\n\t\t\t\t\t\tpP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.bWfd_alternate_mac_addr_ie = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_ALTERNATE_MAC_ADDR\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" SUBID_WFD_ unknown\tEid = %x \\n\", *pWfdEid));\n\t\t\t\t\t\t//hex_dump(\"WfdParseSubElement::\", Msg, MsgLen);\n\t\t\t\t\t\tbreak;\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tpWfdEid++;\n\t\t\t}\n\n\t\t}\n\t\t\n\t\tos_free_mem(pAd, ServiceDiscQuery);\n#endif /* WFD_SUPPORT */\n\t\n\t\tNdisZeroMemory(&P2PActReq, sizeof(P2PActReq));\n\t\tCOPY_MAC_ADDR(P2PActReq.Addr, pP2pEntry->addr);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" = %02x:%02x:%02x:%02x:%02x:%02x.\\n\",  PRINT_MAC(P2PActReq.Addr)));\n\n\t\tP2PActReq.TabIndex = p2pindex;\n\t\tMlmeEnqueue(pAd, P2P_ACTION_STATE_MACHINE, MT2_MLME_P2P_GAS_INT_RSP, sizeof(MLME_P2P_ACTION_STRUCT), (PVOID)&P2PActReq, 0);\n\t\tMlmeHandler(pAd);\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPubliac action frame. But with ACtion is GAS_INITIAL_RSP (12).\n\t\t802.11u. 7.4.7.11\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID PeerGASIntialRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\tUCHAR\tp2pindex;\n\tUCHAR\tAddr2[6];\n\tUCHAR\tStatusCode;\n\tUSHORT\tComeBackDelay;\n\tPUCHAR\tpAdProtocolElem;\n\tPUCHAR\tpQueryRsp;\n\tULONG\ti;\n\tPUCHAR\tpDest;\n\tPRT_P2P_CLIENT_ENTRY\tpP2pEntry;\n\tPFRAME_802_11\tpFrame;\n\tUINT\tServiceDiscQueryLen = 0;\n\tPUCHAR ServiceDiscQuery = NULL;\n\t\n\tpFrame = (PFRAME_802_11)Elem->Msg;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pPeer  PeerGASIntialRspAction = %d.\\n\", Elem->MsgLen));\n#ifdef WFD_SUPPORT\n\t\tos_alloc_mem(pAd, &ServiceDiscQuery, MAX_VIE_LEN);\n\t\n\t\tif (ServiceDiscQuery == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Allocate memory size(=1024) failed\\n\", __FUNCTION__));\n\t\t\treturn;\n\t\t}\n#endif /* WFD_SUPPORT */\n\tCOPY_MAC_ADDR(Addr2, pFrame->Hdr.Addr2);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"From Addr2 = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(Addr2)));\n\tpDest = &Elem->Msg[0];\n\thex_dump(\"PeerGASIntialRspAction\", Elem->Msg, Elem->MsgLen);\n\n\tp2pindex = P2pGroupTabSearch(pAd, Addr2);\n\tif (p2pindex == P2P_NOT_FOUND)\n\t{\n\t\tp2pindex = P2pGroupTabInsert(pAd, Addr2, P2PSTATE_DISCOVERY, NULL, 0, 0, 0);\n\t}\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n#ifdef WFD_SUPPORT\n\t\tRTMPZeroMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info, sizeof(WFD_SERV_DISC_QUERY_INFO));\n#endif /* WFD_SUPPORT */\n\t\thex_dump(\"----> P2PParseServiceDiscoReq\", Elem->Msg, Elem->MsgLen);\n\t\tP2PParseServiceDiscoRsp(pAd, pP2pEntry, p2pindex, pFrame, &pAd->P2pCfg.ServiceTransac, ServiceDiscQuery, &ServiceDiscQueryLen);\n\n#ifdef WFD_SUPPORT\n\t\tif ((ServiceDiscQueryLen > 3))\n\t\t{\n\t\t\tPP2PEID_STRUCT pWfdEid;\n\t\t\tPEID_STRUCT pEid;\n\t\t\tPUCHAR\t\tpWfdIe = NULL;\n\t\t\tULONG\t\tAccuWfdIELen = 0, AccuIeLen = 0, Length = 0, AttriLen = 0;\n\n\t\t\thex_dump(\"P2PParseServiceDiscoRsp:: Query\", ServiceDiscQuery, (ServiceDiscQueryLen - 3));\n\t\t\tpWfdIe = pWfdEid = (PP2PEID_STRUCT) ServiceDiscQuery;\n\t\t\tprintk(\"WfdEid = %d.  WfdEid_Len = %02x %02x.\\n\", pWfdEid->Eid, pWfdEid->Len[0], pWfdEid->Len[1]);\n\t\t\tAttriLen = pWfdEid->Len[1] + (pWfdEid->Len[0] << 8);\n\t\t\tprintk(\"AttriLen = %d.\tSerDiscQueryLen = %d.\\n\", AttriLen, ServiceDiscQueryLen);\n\t\t\twhile (AttriLen <= (ServiceDiscQueryLen - 2))\n\t\t\t{\n\t\t\t\tAttriLen = pWfdEid->Len[1] + (pWfdEid->Len[0] << 8);\n\t\t\t\tprintk(\"  AttriLen = %d.\\n\", AttriLen);\n\t\t\t\tLength = 0;\n\n\t\t\t\tprintk(\"Eid = %d. Length = %d.\\n\", pWfdEid->Eid, Length);\n\t\t\t\tswitch (pWfdEid->Eid)\n\t\t\t\t{\n\t\t\t\t\tcase SUBID_WFD_DEVICE_INFO:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_DEVICE_INFO(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_DEVICE_INFO\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_device_info_ie, pWfdEid->Octet, SUBID_WFD_DEVICE_INFO_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_ASSOCIATED_BSSID:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_ASSOCIATED_BSSID(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_ASSOCIATED_BSSID\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_associate_bssid_ie, pWfdEid->Octet, SUBID_WFD_ASSOCIATED_BSSID_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_AUDIO_FORMATS:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_AUDIO_FORMATS(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_AUDIO_FORMATS\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_audio_format_ie, pWfdEid->Octet, SUBID_WFD_AUDIO_FORMATS_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_VIDEO_FORMATS:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_VIDEO_FORMATS(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_VIDEO_FORMATS\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_video_format_ie, pWfdEid->Octet, SUBID_WFD_VIDEO_FORMATS_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_3D_VIDEO_FORMATS:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_3D_VIDEO_FORMATS(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_3D_VIDEO_FORMATS\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_3d_video_format_ie, pWfdEid->Octet, SUBID_WFD_3D_VIDEO_FORMATS_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_CONTENT_PROTECTION:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_CONTENT_PROTECTION(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_CONTENT_PROTECTION\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_content_proctection, pWfdEid->Octet, SUBID_WFD_CONTENT_PROTECTION_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_COUPLED_SINK_INFO:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_COUPLED_SINK_INFO(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_COUPLED_SINK_INFO\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_couple_sink_info_ie, pWfdEid->Octet, SUBID_WFD_COUPLED_SINK_INFO_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_EXTENDED_CAP:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_EXTENDED_CAP(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_EXTENDED_CAP\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_extent_capability_ie, pWfdEid->Octet, SUBID_WFD_EXTENDED_CAP_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_LOCAL_IP_ADDR:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_LOCAL_IP_ADDR(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_LOCAL_IP_ADDR\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_local_ip_ie, pWfdEid->Octet, SUBID_WFD_LOCAL_IP_ADDR_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_SESSION_INFO:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_SESSION_INFO(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_SESSION_INFO\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_WFD_ALTERNATE_MAC_ADDR:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::SUBID_WFD_ALTERNATE_MAC_ADDR(%d)\\n\", __FUNCTION__, AttriLen));\n\t\t\t\t\t\thex_dump(\"SUBID_WFD_ALTERNATE_MAC_ADDR\", pWfdEid->Octet, AttriLen);\n\t\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->WfdEntryInfo.wfd_serv_disc_query_info.wfd_alternate_mac_addr_ie, pWfdEid->Octet, SUBID_WFD_ALTERNATE_MAC_ADDR_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" SUBID_WFD_ unknown\tEid = %x \\n\", pWfdEid->Eid));\n\t\t\t\t\t\t//hex_dump(\"WfdParseSubElement::\", Msg, MsgLen);\n\t\t\t\t\t\tbreak;\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[2] + content[Len] */\n\t\t\t\tif (Length >= ServiceDiscQueryLen - 2)\n\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\tpWfdEid = (PP2PEID_STRUCT)((UCHAR*)pWfdEid + 3 + AttriLen);\n\t\t\t\tAttriLen = pWfdEid->Len[1] + (pWfdEid->Len[0] << 8);\n\t\t\t}\n\t\t}\n\t\t\n\t\tos_free_mem(pAd, ServiceDiscQuery);\n#endif /* WFD_SUPPORT */\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPubliac action frame. But with ACtion is GAS_COMEBACK_REQ (11).\n\t\t802.11u. 7.4.7.10\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID PeerGASComebackReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\tUCHAR\tp2pindex;\n\tUCHAR\tAddr2[6];\n\tULONG\ti;\n\tPUCHAR\tpDest;\n\tPRT_P2P_CLIENT_ENTRY\tpP2pEntry;\n\tPFRAME_802_11\tpFrame;\n\tMLME_P2P_ACTION_STRUCT\tP2PActReq;\t\n\n\tpFrame = (PFRAME_802_11)Elem->Msg;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"p2p  PeerGASComebackReqAction = %d, \\n\", Elem->MsgLen));\n\n\tCOPY_MAC_ADDR(Addr2, pFrame->Hdr.Addr2);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"From Addr2 = %02x:%02x:%02x:%02x:%02x:%02x  \\n\", PRINT_MAC(Addr2)));\n\tp2pindex = P2pGroupTabSearch(pAd, Addr2);\n\tif (p2pindex == P2P_NOT_FOUND)\n\t{\n\t\tp2pindex = P2pGroupTabInsert(pAd, Addr2, P2PSTATE_DISCOVERY, NULL, 0, 0, 0);\n\t}\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\t\t\n\t\tif (TRUE == P2PParseComebackReq(pAd, pFrame, &pP2pEntry->DialogToken))\n\t\t{\n\t\t\tNdisZeroMemory(&P2PActReq, sizeof(P2PActReq));\n\t\t\tCOPY_MAC_ADDR(P2PActReq.Addr, pP2pEntry->addr);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" = %02x:%02x:%02x:%02x:%02x:%02x  \\n\",  PRINT_MAC(P2PActReq.Addr)));\n\t\t\t\n\t\t\tP2PActReq.TabIndex = p2pindex;\n\t\t\tMlmeEnqueue(pAd, P2P_ACTION_STATE_MACHINE, MT2_MLME_P2P_GAS_CB_RSP, sizeof(MLME_P2P_ACTION_STRUCT), (PVOID)&P2PActReq, 0);\n\t\t\tMlmeHandler(pAd);\n\t\t}\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPubliac action frame. But with ACtion is GAS_COMEBACK_Rsp(11).\n\t\t802.11u. 7.4.7.10\n\t\t\n\tParameters: \n\tNote:\n\n\t==========================================================================\n */\nVOID PeerGASComebackRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPFRAME_802_11\tpFrame;\n\tUCHAR\tp2pindex;\n\tUCHAR\tAddr2[6];\n\tPRT_P2P_CLIENT_ENTRY\tpP2pEntry;\n\t\n\tpFrame = (PFRAME_802_11)Elem->Msg;\n\tCOPY_MAC_ADDR(Addr2, pFrame->Hdr.Addr2);\n\tp2pindex = P2pGroupTabSearch(pAd, Addr2);\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"p2p  PeerGASComebackRspAction = %d, \\n\", Elem->MsgLen));\n\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\t\t\n\t\tif (TRUE == P2PParseComebackRsp(pAd, pP2pEntry, pFrame, &pAd->P2pCfg.ServiceTransac))\n\t\t\tpAd->P2pCfg.p2pidxForServiceCbReq = p2pindex;\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P Service Discovery Request.\n\t\t\n\tParameters: \n\t\treturn : TRUE if .... We don't support Service discovery yet. So no rule now. Always TRUE first.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2PParseServiceDiscoReq(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PFRAME_802_11 \tpFrame, \n\tOUT UCHAR\t\t*DialogToken, \n\tOUT UCHAR\t\t*ServiceTransaction, \n\tOUT PUCHAR\tpServiceDiscQuery,\n\tOUT UINT\t*ServiceDiscQueryLen)\n{\n\tPUCHAR\t\tpData;\n\tLONG\t\tRemainQueryLen;\n\tINT\ti;\n\n\tpData = pFrame->Octet;\n\tdo \n\t{\n\t\tif (*pData != CATEGORY_PUBLIC)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"GASIntialReq = Not Public action. Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif (*(pData+1) != ACTION_GAS_INITIAL_REQ)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"GASIntialReq = Not GAS Initial Req. Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\t/* The Dialog Token field is copied from the corresponding GAS Initial Request frame */\n\t\t*DialogToken = *(pData + 2);\n\t\t\n\t\tpData += 3;\n\t\tif (*pData != 0x6c)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"GASIntialReq = wrong Advertisement protocol information element Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tpData += 4;\n\t\tpData += 2;\n\t\tif (*pData != 0xdd)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"GASIntialReq = wrong   Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tRemainQueryLen = cpu2le16(*((PUSHORT)pData + 2)) - 6;\n\n\t\tif (!RTMPEqualMemory((pData + 4), P2POUIBYTE, 4))\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"GASIntialReq = wrong OUI Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n#ifdef WFD_SUPPORT\n\t\tpData += 10;\n\t\tfor (i = 0; i < WFD_DEVICE_TYPE_END; i++)\n\t\t{\n\t\t\tif (RemainQueryLen > 0)\n\t\t\t{\n\t\t\t\t*ServiceDiscQueryLen = cpu2le16(*((PUSHORT)pData));\n\t\t\t\tif (*ServiceDiscQueryLen > 3)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query Service Discovery Len = %d. QueryType = %d.\\n\", *ServiceDiscQueryLen, *(pData + 2)));\n\t\t\t\t\t*ServiceTransaction = *(pData + 3);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ServiceTransac is %d. \\n\", *ServiceTransaction));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Requested Device Role is 0x%02x. \\n\", *(pData + 4)));\n\t\t\t\t\tif (pAd->StaCfg.WfdCfg.DeviceType == *(pData + 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"My Device Type is 0x%02x. \\n\", *(pData + 4)));\n\t\t\t\t\t\tif ((*ServiceDiscQueryLen - 3))\n\t\t\t\t\t\t\tRTMPMoveMemory(pServiceDiscQuery, (pData + 5), (*ServiceDiscQueryLen - 3)); /* Query Len = Query Type(1) + TransactionID(1) + Requested Device Role(1) + QueryData(?) */\n\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpData += *ServiceDiscQueryLen + 2; \n\t\t\t\tRemainQueryLen -= *ServiceDiscQueryLen + 2;\n\t\t\t}\n\t\t\telse\n\t\t\tbreak;\n\t\t}\n#endif /* WFD_SUPPORT */\n\t}while(FALSE);\n\n\t return TRUE;\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P Service Discovery Response.\n\t\t\n\tParameters: \n\t\treturn : TRUE if .... We don't support Service discovery yet. So no rule now. Always TRUE first.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2PParseServiceDiscoRsp(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PRT_P2P_CLIENT_ENTRY\tpP2pEntry,\n\tIN UCHAR\t\tpP2pidx,\n\tIN PFRAME_802_11 \tpFrame, \n\tOUT UCHAR\t\t*ServiceTransaction, \n\tOUT PUCHAR\tpServiceDiscQuery,\n\tOUT UINT\t*ServiceDiscQueryLen)\n{\n\tPUCHAR\t\tpData;\n\n\tpData = pFrame->Octet;\n\tdo \n\t{\n\t\tif (*pData != CATEGORY_PUBLIC)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"P2PParseServiceDiscoRsp = Not Public action. Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif (*(pData+1) != ACTION_GAS_INITIAL_RSP)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"P2PParseServiceDiscoRsp = Not GAS Initial RSP. Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\tif (*(PUSHORT)(pData+3) != 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"P2PParseServiceDiscoRsp = Status is 0x%x.  Return \\n\", *(PUSHORT)(pData+3)));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif (*(PUSHORT)(pData+5) != 0)\n\t\t{\n\t\t}\n\t\tpData += 7;\n\t\t\n\t\tif (*pData != 0x6c)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseServiceDiscoRsp = wrong Advertisement protocol information element Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tpData += 4;\n\t\tpData += 2;\n\t\tif (*pData != 0xdd)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseServiceDiscoRsp = wrong   Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif (!RTMPEqualMemory((pData + 4), P2POUIBYTE, 4))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseServiceDiscoRsp = wrong OUI Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t*ServiceDiscQueryLen = cpu2le16(*((PUSHORT)(pData + 10)));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Query Service Discovery Len = %d. QueryType = %d.\\n\", *ServiceDiscQueryLen, *(pData + 12)));\n\t\t*ServiceTransaction = *(pData+13);\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ServiceTransac = %d. \\n\", *ServiceTransaction));\n\t\tif ((*ServiceDiscQueryLen - 3))\n\t\t\tRTMPMoveMemory(pServiceDiscQuery, (pData + 15), (*ServiceDiscQueryLen - 3)); /* Query Len = Query Type(1) + TransactionID(1) + StatusCode(1) + QueryData(?) */\n\t}while(FALSE);\n\n\t return TRUE;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P Service Comeback Request.\n\t\t\n\tParameters: \n\t\treturn : TRUE if .... We don't support Service discovery yet. So no rule now. Always TRUE first.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2PParseComebackReq(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PFRAME_802_11 \tpFrame, \n\tOUT UCHAR\t\t*DialogToken) \n{\n\tPUCHAR\t\tpData;\n\n\tpData = pFrame->Octet;\n\tdo \n\t{\n\t\tif (*pData != CATEGORY_PUBLIC)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseComebackReq = Not Public action. Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif (*(pData+1) != ACTION_GAS_COMEBACK_REQ)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseComebackReq = Not GAS_COMEBACK_REQ Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\t/* The Dialog Token field is copied from the corresponding GAS Initial Request frame */\n\t\t*DialogToken = *(pData + 2);\n\t}while(FALSE);\n\n\t return TRUE;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P Service Comeback Response.\n\t\t\n\tParameters: \n\t\treturn : TRUE if .... We don't support Service discovery yet. So no rule now. Always TRUE first.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2PParseComebackRsp(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PRT_P2P_CLIENT_ENTRY pP2pEntry,\n\tIN PFRAME_802_11 \tpFrame, \n\tIN UCHAR\t\t*ServiceTransaction) \n{\n\tPUCHAR\t\tpData;\n\n\tpData = pFrame->Octet;\n\tdo \n\t{\n\t\tif (*pData != CATEGORY_PUBLIC)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseComebackRsp = Not Public action. Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif (*(pData+1) != ACTION_GAS_COMEBACK_RSP)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseComebackRsp = Not GAS_COMEBACK_REQ Return \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t// +2 : Token\n\t\t// +3, +4 : Status\n\t\t// +5 : More Frag\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseComebackRsp = More Frag = %d. \\n\", *(pData+5)));\n\t\tif ((*(pData+5) &0x80) == 0x80 )\n\t\t{\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_SERVICE_COMEBACK_COMMAND;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2PParseComebackRsp = More Frag set to one. \\n\"));\n\t\t\t\n\t\t\t return TRUE;\n\t\t}\n\t\t// +6 +7  : Comeback Delay\n\t\t// +8  : ADvertisement Potocol IE\n\t\t// +9 +10 : Query Response Len\n\t\t\n\t\treturn FALSE;\n\t\t\n\t}while(FALSE);\n\n\t}\n\n/*\t\n\t==========================================================================\n\n\tDescription: \n\t\tReceive Public Action frame that set to  verdor specific and with OUI type = WFA P2P\n\t==========================================================================\n */\nVOID P2PPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tDBGPRINT(RT_DEBUG_ERROR, (\"!!!!! Should not in here !!!!!\\n\"));\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tMake a P2P Fake NoA Attribute to trigger myself to restart NoA. The Start time is changed. Duration and Interval and Count\n\t\tis the same as GO's beacon\n\t\t\n\tParameters: \n\t\t StartTime : A new Start time.\n\t\t pOutBuffer : pointer to buffer that should put data to.\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeFakeNoATlv(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\t StartTime,\n\tIN PUCHAR\t\tpOutBuffer)\n{\n\tPUCHAR\t\tpDest;\n\t\t\n\tpDest = pOutBuffer;\n\n\t*(pDest) = SUBID_P2P_NOA;\n\t/* Length is 13*n + 2 = 15 when n = 1 */\n\t*(pDest+1) = 15;\n\t/* Lenght 2nd byte */\n\t*(pDest+2) = 0;\n\t/* Index. */\n\t*(pDest+3) = pAd->P2pCfg.GONoASchedule.Token;\n\t/* CT Windows and OppPS parm. Don't turn on both. So Set CTWindows = 0 */\n\t*(pDest+4) = 0;\n\t/* Count.  Test Plan set to 255. */\n\t*(pDest+5) = pAd->P2pCfg.GONoASchedule.Count;\n\t/* Duration */\n\tRTMPMoveMemory((pDest+6), &pAd->P2pCfg.GONoASchedule.Duration, 4);\n\t/* Interval */\n\tRTMPMoveMemory((pDest+10), &pAd->P2pCfg.GONoASchedule.Interval, 4);\n\tRTMPMoveMemory((pDest+14), &StartTime, 4);\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tInsert P2P subelement P2P Group Info format in Probe Response. it contains device information of \n\t\tP2P Clients that are members of my P2P group.  \n\t\t\n\tParameters: \n\t\t pInBuffer : pointer to data that contains data to put in\n\t\t pOutBuffer : pointer to buffer that should put data to.\n\tNote:\n\t\t \n\t==========================================================================\n */\nULONG InsertP2PGroupInfoTlv(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tpOutBuffer)\n{\n\tPUCHAR\tpDest, pContent;\n\tUCHAR\tLength;\n\tUCHAR\ti;\n\tUCHAR\tNoOfClient = 0;\n\tP2P_CLIENT_INFO_DESC\t\tClientInfo;\n\tRT_P2P_CLIENT_ENTRY\t*pClient;\n\tUCHAR\t\tZeroType[P2P_DEVICE_TYPE_LEN];\n\tUCHAR\t\tDevCapability;\n\tUSHORT config_method = 0;\n\t\n\tpDest = pOutBuffer;\n\tRTMPZeroMemory(pDest, 255);\n\tRTMPZeroMemory(ZeroType, P2P_DEVICE_TYPE_LEN);\n\t*pDest = SUBID_P2P_GROUP_INFO;\n\t*(pDest + 2) = 0; \t\t/* Set length to 0 first.  Need to update to real length in the end of this function. */\n\tpContent = pDest + 3;\t/* pContent points to payload. */\n\tLength = 0;\n\n\tfor (i = 0;i < MAX_P2P_GROUP_SIZE;i++)\n\t{\n\t\tpClient = &pAd->P2pTable.Client[i];\n\n\t\t/* if (IS_P2P_PEER_CLIENT_OP(pClient)) */\n\t\tif (pClient->P2pClientState == P2PSTATE_CLIENT_WPS_DONE)\n\t\t{\n\t\t\tNoOfClient++;\n\t\t\tRTMPZeroMemory(&ClientInfo, sizeof(ClientInfo));\n\t\t\tRTMPMoveMemory(ClientInfo.DevAddr, pClient->addr, MAC_ADDR_LEN);\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"  -- InsertP2PGroupInfoTlv( ) (Mac  %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pClient->addr)));\n\t\t\tRTMPMoveMemory(ClientInfo.InterfaceAddr, pClient->InterfaceAddr, MAC_ADDR_LEN);\n\t\t\tDevCapability = pClient->DevCapability;\n\t\t\tif (P2P_TEST_FLAG(pClient, P2PFLAG_DEVICE_DISCOVERABLE))\n\t\t\t\tDevCapability |= DEVCAP_CLIENT_DISCOVER;\n\t\t\t\n\t\t\tClientInfo.Capability = DevCapability;\n\t\t\tconfig_method = cpu2be16(pClient->ConfigMethod);\n\t\t\tRTMPMoveMemory(ClientInfo.ConfigMethod, &config_method, 2);\n\t\t\tRTMPMoveMemory(ClientInfo.PrimaryDevType, pClient->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\tClientInfo.NumSecondaryType = pClient->NumSecondaryType;\n\t\t\t/* JANTEMP   set to zero first. will add soon. */\n\t\t\tClientInfo.NumSecondaryType = 0;\n\t\t\tRTMPMoveMemory(ClientInfo.PrimaryDevType, pClient->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\tClientInfo.Length = SIZE_OF_FIXED_CLIENT_INFO_DESC - 1 + pClient->DeviceNameLen + 4;\n\t\t\tRTMPMoveMemory(pContent, &ClientInfo, SIZE_OF_FIXED_CLIENT_INFO_DESC);\n\t\t\tpContent += SIZE_OF_FIXED_CLIENT_INFO_DESC;\n\t\t\t/* Length is accumulated length for this attirbute. */\n\t\t\tLength += SIZE_OF_FIXED_CLIENT_INFO_DESC;\n\t\t\t/* Insert WPS Device Name TLV */\n\t\t\t*((PUSHORT) pContent) = cpu2be16(WSC_ID_DEVICE_NAME);\n\t\t\t*((PUSHORT) (pContent + 2)) = cpu2be16(pClient->DeviceNameLen);\t\n\t\t\tRTMPMoveMemory(pContent + 4, pClient->DeviceName, pClient->DeviceNameLen);\n\t\t\tLength += (UCHAR)pClient->DeviceNameLen + 4;\n\t\t\tpContent += (pClient->DeviceNameLen + 4);\n\t\t\t/* Assign this client info descriptor's length. Length is accumulated length. so can't use Length. */\n\t\t\t/*if (!RTMPEqualMemory(pClient->SecondaryDevType, &ZeroType, P2P_DEVICE_TYPE_LEN))\n\t\t\t{\n\t\t\t\t// JANTEMP. force to support add only one secondary device type first. will improve later.\n\t\t\t\t*pContent = 1;\n\t\t\t\tRTMPMoveMemory(pContent+1, pClient->SecondaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\t\tLength += (1+P2P_DEVICE_TYPE_LEN);\n\t\t\t\tClientInfo.Length += (1+P2P_DEVICE_TYPE_LEN);\n\t\t\t}*/\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\" ----- InsertP2PGroupInfoTlv(%d) (Total Len now = %d) DevNameLen = %ld.\\n\", i, Length, pClient->DeviceNameLen));\n\t\t}\n\t}\n\n\t/* Because the length field doesn't count itself. So when update Attribute length, need to add number of client descriptor. */\n\t//Length += NoOfClient;\n\n\t*(pDest + 1) = Length;\t\t/* Set to real length */\n\n\treturn (Length + 3);\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tUsed to insert P2P subelement TLV format.\n\t\t\n\tParameters: \n\t\t pInBuffer : pointer to data that contains data to put in\n\t\t pOutBuffer : pointer to buffer that should put data to.\n\tNote:\n\t\t \n\t==========================================================================\n */\nULONG InsertP2PSubelmtTlv(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t\tSubId,\n\tIN PUCHAR\t\tpInBuffer,\n\tIN PUCHAR\t\tpOutBuffer)\n{\n\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\tPUCHAR\tpDest;\n\t\tULONG\tLength;\n\n\t\tpDest = pOutBuffer;\n\t\tRTMPZeroMemory(pDest, 255);\n\t\t*pDest = SubId;\n\t\tpDest += 1;\n\t\tLength = 0;\n\t\tswitch(SubId)\n\t\t{\n\t\t\tcase SUBID_P2P_INVITE_FLAG:\n\t\t\t\t*pDest = 1;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\t*(pDest + 2) = *pInBuffer;\n\t\t\t\t\n\t\t\t\tLength = 4;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_STATUS:\t/* 0 */\n\t\t\t\t*pDest = 1;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\t*(pDest + 2) = *pInBuffer;\n\t\t\t\t\n\t\t\t\tLength = 4;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_MINOR_REASON:\t/* 0 */\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_CAP: \t/* 2 */\n\t\t\t\t*pDest = 2;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\tRTMPMoveMemory(pDest + 2, pInBuffer, 2);\n\t\t\t\tLength = 5;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_DEVICE_ID:\t/* 3 this is Device Address! */\n\t\t\tcase SUBID_P2P_GROUP_BSSID: /* 6 group Bssid */\n\t\t\tcase SUBID_P2P_INTERFACE_ADDR:\t/* 9 */\n\t\t\t\t*pDest = 6;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\tRTMPMoveMemory(pDest + 2, pInBuffer, MAC_ADDR_LEN);\n\t\t\t\t/* DEvice Type */\n\t\t\t\t/*RTMPMoveMemory(pDest + 7, pAd->CurrentAddress, 8); */\n\n\t\t\t\tLength = 9;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_OWNER_INTENT:\t/* 4 */\n\t\t\t\t*pDest = 1;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\t*(pDest + 2) = *pInBuffer;\n\t\t\t\tLength = 4;\n\t\t\t\tbreak;\n\t\n\t\t\tcase SUBID_P2P_CONFIG_TIMEOUT:\t/* 5 */\n\t\t\t\t*pDest = 2;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\tRTMPMoveMemory(pDest + 2, pInBuffer, 2);\n\t\t\t\tLength = 5;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_CHANNEL_LIST:\t/* 11 */\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\t*(pDest + 2) = pAd->CommonCfg.CountryCode[0];\n\t\t\t\t*(pDest + 3) = pAd->CommonCfg.CountryCode[1];\n\t\t\t\t*(pDest + 4) = 0x04;\n\t\t\t\tInsertP2pChannelList(pAd, *pInBuffer, &Length, (pDest + 5));\n\t\t\t\t*pDest = Length + 3;\n\t\t\t\tLength += 6;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_OP_CHANNEL:\n\t\t\tcase SUBID_P2P_LISTEN_CHANNEL:\t/* 6 */\n\t\t\t\t*pDest = 5;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\t/*Annex J. 802.11ERVmb_D3/0.pdf */\n\t\t\t\t*(pDest + 2) = pAd->CommonCfg.CountryCode[0];\n\t\t\t\t*(pDest + 3) = pAd->CommonCfg.CountryCode[1];\n\t\t\t\t*(pDest + 4) = 0x04;\n\t\t\t\t*(pDest + 5) = ChannelToClass(*pInBuffer, 1/*COUNTRY_USA*/);\n\t\t\t\t*(pDest + 6) = *pInBuffer;\n\t\t\t\tLength = 8;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_EXT_LISTEN_TIMING:\t/* 8 */\n\t\t\t\t*pDest = 4;\n\t\t\t\t*(pDest + 1) = 0;\n\t\t\t\t*((PUSHORT) (pDest + 2)) = (P2P_EXT_LISTEN_PERIOD);\n\t\t\t\t*((PUSHORT) (pDest + 4)) = (P2P_EXT_LISTEN_INTERVAL);\n\t\t\t\tLength = 7;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_MANAGEABILITY:\t/* 10 */\n\t\t\t\tbreak;\t\n\t\t\tcase SUBID_P2P_NOA: /* 12 */\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_DEVICE_INFO: /* 13 */\n\t\t\t\t*pDest = 17 + pP2PCtrl->DeviceNameLen + 4 + (8*pP2PCtrl->DevInfo.SecDevTypList[0]);\n\t\t\t\t*(pDest + 1) = 0;\n\n\t\t\t\tRTMPMoveMemory(pDest + 2, pInBuffer, MAC_ADDR_LEN);\n\t\t\t\t/* DEvice Type */\n\t\t\t\t*((PUSHORT) (pDest + 8)) = cpu2be16(pP2PCtrl->ConfigMethod);\n\t\t\t\tRTMPMoveMemory(pDest + 10, &pP2PCtrl->DevInfo.PriDeviceType[0], 8);\n\n\t\t\t\t{\n\t\t\t\t\t*(pDest + 18) = pP2PCtrl->DevInfo.SecDevTypList[0];\n\t\t\t\t\tNdisMoveMemory((pDest + 19), &pP2PCtrl->DevInfo.SecDevTypList[1], (8*(pP2PCtrl->DevInfo.SecDevTypList[0])));\n\t\t\t\t\tpDest += (19 + (8*pP2PCtrl->DevInfo.SecDevTypList[0]));\n\t\t\t\t}\n\n\t\t\t\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_DEVICE_NAME);\n\t\t\t\t*((PUSHORT) (pDest + 2)) = cpu2be16(pP2PCtrl->DeviceNameLen);\n\t\t\t\tRTMPMoveMemory(pDest + 4, &pP2PCtrl->DeviceName[0], pP2PCtrl->DeviceNameLen);\n\n\t\t\t\tLength = 20+ (8*(pP2PCtrl->DevInfo.SecDevTypList[0])) + pP2PCtrl->DeviceNameLen + 4;\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_GROUP_INFO:\t/* 14 */\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_GROUP_ID:\t/* 15 */\n\t\t\t\tRTMPMoveMemory(pDest, &pInBuffer[0], (pInBuffer[0] + 2));\n\t\t\t\tLength = 1 + (pInBuffer[0] + 2);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" -----Insert SUBID_P2P_GROUP_ID (Len = %ld) \\n\", Length));\n\t\t\t\tbreak;\n\t\t\tcase SUBID_P2P_INTERFACE:\t/* 16 */\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t*pDest = 0;\n\t\t\t\tLength = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\treturn Length;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tUsed to insert P2P Channel list attribute.\n\t\t\n\tParameters: \n\t\tChannelListLen : output for total length.\n\t\t pDest : pointer to buffer that should put data to.\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID InsertP2pChannelList(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t OpChannel, \n\tOUT ULONG\t *ChannelListLen, \n\tOUT PUCHAR \tpDest)\n{\n\tUCHAR\t\ti, pos;\n\tUCHAR\t\tLastRegClass = 0xff, CurRegClass;\n\tPUCHAR\t\tpLastLenPos;\n\tUCHAR\t\tLastNum = 0;\n\n\tpLastLenPos = pDest + 1;\n\tpos = 2;\n\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t{\n\t\tCurRegClass = ChannelToClass(pAd->ChannelList[i].Channel, 1);\n\t\t/* 0. Decide current regulatory class. 11y */\n\t\t/* Insert RegClass if necessary */\n\t\tif (LastRegClass == 0xff)\n\t\t{\n\t\t\t/* case 0 : initilize */\n\t\t\tLastRegClass = CurRegClass;\n\t\t\t*(pDest) = CurRegClass;\n\t\t}\n\t\telse if ((CurRegClass != LastRegClass) && (LastRegClass != 0xff))\n\t\t{\n\t\t\t/* case 1 : change regulatory class */\n\t\t\t*(pDest + pos) = CurRegClass;\n\t\t\t*pLastLenPos = LastNum;\n\t\t\t\n\t\t\tLastNum = 0;\n\t\t\tLastRegClass = CurRegClass;\n\t\t\tpLastLenPos = pDest + pos + 1;\n\t\t\tpos = pos + 2;\n\t\t}\n\t\t\t\n\t\t/* Insert  */\n\t\t*(pDest + pos) = pAd->ChannelList[i].Channel;\n\t\tLastNum++;\n\t\tpos++;\n\n\t\t/* Last item. Update Num. */\n\t\tif (i == pAd->ChannelListNum -1)\n\t\t{\n\t\t\t*pLastLenPos = LastNum;\n\t\t}\n\t}\n\n\t*ChannelListLen = pos;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Channel List ==> output length is %ld \\n\", __FUNCTION__, *ChannelListLen));\n\tfor (i = 0; i <*ChannelListLen; )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\": %x %x %x %x %x %x %x %x %x \\n\", *(pDest+i), *(pDest+i+1), *(pDest+i+2), \n\t\t*(pDest+i+3), *(pDest+i+4), *(pDest+i+5), *(pDest+i+6), *(pDest+i+7), *(pDest+i+8)));\n\t\ti = i + 9;\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P subelement content to fill into the correct output buffer\n\t\t\n\tParameters: \n\t\treturn : TRUE if the pSearchAddr is in GroupInfoAttribute.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pParseGroupInfoAttribute(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR P2pindex, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen) \n{\n\tPEID_STRUCT   pEid;\n\tULONG\t\t\t\tLength = 0;\n\tLONG\t\tGroupInfoLen;\n\tUCHAR\t\ti;\n\tUCHAR\t\tidx;\n\tPUCHAR\t\tpData;\n\tUCHAR\t\tThisDescLen;\n\tBOOLEAN\t\tbrc = TRUE;\n\tP2P_CLIENT_INFO_DESC\t*pClient;\n\tUSHORT \t\t\tWscType, WscLen;\n\tULONG\t\t\tLeftLength;\n\tPP2PEID_STRUCT\tpP2pEid;\n\tULONG\t\t\tAttriLen;\n\tUCHAR\t\t\tSmallerP2Pidx;\n\tBOOLEAN\tbSendP2pEvent = FALSE;\n\n\tpEid = (PEID_STRUCT) Msg;\n\n\tLength = 0;\n\tLeftLength = MsgLen; \n\tpEid = (PEID_STRUCT)Msg;\n\twhile ((ULONG)(pEid->Len + 2) <= LeftLength)\n\t{\n\t\t/* might contains P2P IE and WPS IE.  So use if else if enough for locate  P2P IE. */\n\t\t/* To check Octet[1] is because Ralink add one byte itself for P2P IE. So the IE content shift one byte afterward. */\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDIRECT_OUI, 4))\n\t\t{\n\t\t\t/* To check Octet[5] for first P2PEid */\n\t\t\t/* is because Ralink add one byte itself for P2P IE. So the IE content shift one byte afterward. */\n\t\t\tpP2pEid = (PP2PEID_STRUCT) &pEid->Octet[4];\n\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\tLength = 0;\n\t\t\twhile ((Length + 3 + AttriLen) <= pEid->Len)    \n\t\t\t{\n\t\t\t\tswitch(pP2pEid->Eid)\n\t\t\t\t{\n\t\t\t\t\tcase SUBID_P2P_GROUP_INFO:\n\t\t\t\t\t\tGroupInfoLen = AttriLen;\n\t\t\t\t\t\tpData = &pP2pEid->Octet[0];\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SUBID_P2P_GROUP_INFO - Go index=%d\\n\",  P2pindex));\n\t\t\t\t\t\twhile(GroupInfoLen > 0)\n\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\tpClient = (P2P_CLIENT_INFO_DESC*)pData;\n\t\t\t\t\t\t\tThisDescLen = pClient->Length;\n\t\t\t\t\t\t\tif ((ThisDescLen < 23) || (ThisDescLen > GroupInfoLen))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Error parsing P2P IE group info attribute. This Client -%d/%ld\\n\", ThisDescLen, GroupInfoLen));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tidx = P2pGroupTabSearch(pAd, pClient->DevAddr);\n\t\t\t\t\t\t\tif ((idx < MAX_P2P_GROUP_SIZE) \n\t\t\t\t\t\t\t\t&& (pAd->P2pTable.Client[idx].P2pClientState != P2PSTATE_DISCOVERY_CLIENT)\n\t\t\t\t\t\t\t\t&& (pAd->P2pTable.Client[idx].P2pClientState != P2PSTATE_CLIENT_DISCO_COMMAND))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* P2P topology changed. Reset the P2P Table and rescan. */\n\t\t\t\t\t\t\t\tif (idx > P2pindex)\n\t\t\t\t\t\t\t\t\tSmallerP2Pidx = P2pindex + 1;\t/* don't delete GO */\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tSmallerP2Pidx = idx;\t\t/* this method also delete GO. :(\t  */\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!P2P topology changed[P2pClientState = %d] when parsing P2P IE group info attribute. Delete from index : %d\\n\", pAd->P2pTable.Client[idx].P2pClientState, SmallerP2Pidx ));\n\t\t\t\t\t\t\t\t/*P2PPrintP2PEntry(pAd, idx); */\n\t\t\t\t\t\t\t\tfor (i = (SmallerP2Pidx); i < MAX_P2P_GROUP_SIZE;i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif ((pAd->P2pTable.Client[i].P2pClientState == P2PSTATE_PROVISION_COMMAND)\n\t\t\t\t\t\t\t\t\t\t|| (pAd->P2pTable.Client[i].P2pClientState == P2PSTATE_CONNECT_COMMAND)\n\t\t\t\t\t\t\t\t\t\t|| (pAd->P2pTable.Client[i].P2pClientState > P2PSTATE_DISCOVERY_CLIENT))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!break right away because we have another connect command to continue. update topology is not so important to do right now.\\n\" ));\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tP2pGroupTabDelete(pAd, i, pAd->P2pTable.Client[i].addr);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/* Don't update this now. */\n\t\t\t\t\t\t\t\t\tif (pAd->P2pTable.ClientNumber == SmallerP2Pidx)\n\t\t\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/*  because we check idx in following code,  */\n\t\t\t\t\t\t\t\t/* So need to Search again after topology changed */\n\t\t\t\t\t\t\t\tidx = P2pGroupTabSearch(pAd, pClient->DevAddr);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ((idx == P2P_NOT_FOUND) && ( pAd->P2pTable.ClientNumber < (MAX_P2P_GROUP_SIZE - 1))\n\t\t\t\t\t\t\t\t&& (!RTMPEqualMemory(pClient->DevAddr, pAd->P2pCfg.CurrentAddress, MAC_ADDR_LEN)))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tidx = P2pGroupTabInsert(pAd, pClient->DevAddr, P2PSTATE_DISCOVERY_CLIENT, NULL, 0, 0, 0);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Insert a P2P Client to P2P table [%d]  .\\n\", idx));\n\t\t\t\t\t\t\t\t/* Insert a P2P Client followi ng the GO that we received. Need to delete ALL following client that is already in P2P table. */\n\t\t\t\t\t\t\t\t/* Because the number of client that is in the p2p group might be changed. */\n\t\t\t\t\t\t\t\tbSendP2pEvent = TRUE;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (idx < MAX_P2P_GROUP_SIZE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].DevCapability = pClient->Capability;\n\t\t\t\t\t\t\t\t/* Don't update state when it's in P2PSTATE_CLIENT_DISCO_COMMAND */\n\t\t\t\t\t\t\t\tif (pAd->P2pTable.Client[idx].P2pClientState != P2PSTATE_CLIENT_DISCO_COMMAND)\n\t\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].P2pClientState = P2PSTATE_DISCOVERY_CLIENT;\n\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].ConfigMethod = *((PUSHORT) pClient->ConfigMethod);\n\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].ConfigMethod = be2cpu16(pAd->P2pTable.Client[idx].ConfigMethod);\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pAd->P2pTable.Client[idx].PrimaryDevType, pClient->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].NumSecondaryType = pClient->NumSecondaryType;\n\t\t\t\t\t\t\t\tWscType = cpu2be16(*((PUSHORT) &pClient->Octet[pClient->NumSecondaryType*P2P_DEVICE_TYPE_LEN]));\n\t\t\t\t\t\t\t\tWscLen  = cpu2be16(*((PUSHORT) (&pClient->Octet[2 + pClient->NumSecondaryType*P2P_DEVICE_TYPE_LEN])));\n\t\t\t\t\t\t\t\tRTMPMoveMemory(&pAd->P2pTable.Client[idx].DeviceName[0], &pClient->Octet[4+(pClient->NumSecondaryType*P2P_DEVICE_TYPE_LEN)], 32);\n\t\t\t\t\t\t\t\tif (WscLen <= 32)\n\t\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].DeviceNameLen = WscLen;\n\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].MyGOIndex = P2pindex;\n\t\t\t\t\t\t\t\tpAd->P2pTable.Client[idx].DeviceName[pAd->P2pTable.Client[idx].DeviceNameLen] = 0x0;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\t\t\t\t\tif (bSendP2pEvent)\n\t\t\t\t\t\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_DEVICE_FIND, &pAd->P2pTable.Client[idx], NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t\t\t\t\t\tif (pAd->P2pCfg.ConnectingIndex < MAX_P2P_GROUP_SIZE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (RTMPEqualMemory(pAd->P2pTable.Client[idx].addr, &pAd->P2pCfg.ConnectingMAC[0], MAC_ADDR_LEN))\n\t\t\t\t\t\t\t\t\t\tP2pConnectAfterScan(pAd, FALSE, idx);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tGroupInfoLen -= (ThisDescLen + 1);\n\t\t\t\t\t\t\tpData += (ThisDescLen + 1);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[1]+ content[Len] */\n\t\t\t\tpP2pEid = (PP2PEID_STRUCT)((UCHAR*)pP2pEid + 3 + AttriLen);        \n\t\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\t}\n\t\t\t/* We already get what we want. so break. */\n\t\t\tbreak;\n\t\t}\n\t\tLeftLength = LeftLength - pEid->Len - 2;\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t}\n\treturn brc;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P NoA subelement content to make appropriate action for NoA schedule.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pParseNoASubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN UCHAR  wcidindex,\n\tIN UINT32 Sequence)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tULONG\t\t\t\tLength = 0;\n\tPP2PEID_STRUCT\tpP2pEid;\n\tULONG\t\t\tAttriLen;\n\tULONG\t\t\tLeftLength;\n\tPEID_STRUCT \tpEid;\n\tBOOLEAN \t\tbrc;\n\tBOOLEAN \t\tbNoAAttriExist = FALSE;\n\tPUCHAR pPtrEid = NULL;\n\t\t\n\t/* Intel sends multiple P2P IE... So I can't give each input a default value.. */\n\tif (MsgLen == 0)\n\t\treturn;\n\t\n\tLeftLength = MsgLen; \n\tpEid = (PEID_STRUCT)Msg;\n\twhile ((ULONG)(pEid->Len + 2) <= LeftLength)\n\t{\n\t\t/* might contains P2P IE and WPS IE.  So use if else if enough for locate  P2P IE. */\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDIRECT_OUI, 4))\n\t\t{\n\t\t\t/* Get Request content capability */\n\t\t\tpP2pEid = (PP2PEID_STRUCT) &pEid->Octet[4];\n\t\t\tpPtrEid = (PUCHAR) pP2pEid;\n\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\tLength = 0;\n\t\t\twhile ((Length + 3 + AttriLen) <= pEid->Len)\t\n\t\t\t{\n\t\t\t\tswitch(pP2pEid->Eid)\n\t\t\t\t{\n\t\t\t\t\tcase SUBID_P2P_NOA:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPUCHAR pData = &pEid->Octet[0];\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"Get NoA Attr: %x %x %x %x %x %x %x %x %x \\n\", *(pData+0), *(pData+1), *(pData+2), \n\t\t\t\t\t\t\t\t\t\t\t\t\t*(pData+3), *(pData+4), *(pData+5), *(pData+6), *(pData+7), *(pData+8)));\n\t\t\t\t\t\t\tbNoAAttriExist = TRUE;\n\t\t\t\t\t\t\tbrc = P2pHandleNoAAttri(pAd, &pAd->MacTab.Content[wcidindex], pPtrEid);\n\t\t\t\t\t\t\t/* Got a NoA Attribute from this p2pindex. In fact, This should be GO. */\n\t\t\t\t\t\t\tif (brc == TRUE)\n\t\t\t\t\t\t\t\tpP2PCtrl->NoAIndex = wcidindex;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[1]+ content[Len] */\n\t\t\t\tpP2pEid = (PP2PEID_STRUCT)((UCHAR*)pP2pEid + 3 + AttriLen);\n\t\t\t\tpPtrEid = (PUCHAR) pP2pEid;\n\t\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\t}\t\n\t\t}\n\t\tLeftLength = LeftLength - pEid->Len - 2;\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t}\n\n\tif (bNoAAttriExist == FALSE)\n\t{\n\t\tif (P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Beacon and no NoA Attribute! \\n\"));\n\t\t\tP2pStopOpPS(pAd);\n\t\t}\n\t\tif ((pAd->MacTab.Content[wcidindex].P2pInfo.NoADesc[0].bValid == TRUE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Beacon and no NoA Attribute!Stop active NoA [%d]\\n\", Sequence));\n\t\t\tP2pStopNoA(pAd, &pAd->MacTab.Content[wcidindex]);\n\t\t}\n\t}\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P NoA subelement content to make appropriate action for NoA schedule.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pParseExtListenSubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT USHORT *ExtListenPeriod,\n\tOUT USHORT *ExtListenInterval) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tULONG\t\t\t\tLength = 0;\n\tPP2PEID_STRUCT\tpP2pEid;\n\tULONG\t\t\tAttriLen;\n\t/*UCHAR\t\t\toffset; */\n\tULONG\t\t\tLeftLength;\n\tPEID_STRUCT\t\tpEid;\n\tUSHORT\t\t\tExtTime;\n\t/*BOOLEAN\t\t\tbrc; */\n\t/*PUCHAR\t\t\tpData; */\n\t\n\t/* Intel sends multiple P2P IE... So I can't give each input a default value.. */\n\tif (MsgLen == 0)\n\t\treturn;\n\n\tLeftLength = MsgLen; \n\tpEid = (PEID_STRUCT)Msg;\n\twhile ((ULONG)(pEid->Len + 2) <= LeftLength)\n\t{\n\t\t/* might contains P2P IE and WPS IE.  So use if else if enough for locate  P2P IE. */\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDIRECT_OUI, 4))\n\t\t{\n\t\t\t/* Get Request content capability */\n\t\t\tpP2pEid = (PP2PEID_STRUCT) &pEid->Octet[4];\n\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\tLength = 0;\n\t\t\twhile ((Length + 3 + AttriLen) <= pEid->Len)    \n\t\t\t{\n\t\t\t\tswitch(pP2pEid->Eid)\n\t\t\t\t{\n\t\t\t\t\tcase SUBID_P2P_EXT_LISTEN_TIMING:\n\t\t\t\t\t\tif (AttriLen == 4)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tExtTime = *(PUSHORT)&pP2pEid->Octet[0];\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"  - (Ext Listen Period %x = %d)  \\n\", ExtTime, ExtTime));\n\t\t\t\t\t\t\tif (ExtTime > 0)\n\t\t\t\t\t\t\t\tpP2PCtrl->ExtListenPeriod = ExtTime;\n\t\t\t\t\t\t\tExtTime = *(PUSHORT)&pP2pEid->Octet[2];\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"  - (Ext Listen Interval  %x = %d)  \\n\", ExtTime, ExtTime));\n\t\t\t\t\t\t\tif (ExtTime > 0)\n\t\t\t\t\t\t\t\tpP2PCtrl->ExtListenInterval = ExtTime;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[1]+ content[Len] */\n\t\t\t\tpP2pEid = (PP2PEID_STRUCT)((UCHAR*)pP2pEid + 3 + AttriLen);        \n\t\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\t}\n\n\t\t}\n\t\tLeftLength = LeftLength - pEid->Len - 2;\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P subelement content to fill into the correct output buffer\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pParseManageSubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT UCHAR *pChannel,\n\tOUT UCHAR *pNumOfP2pOtherAttribute,\n\tOUT UCHAR *pTotalNumOfP2pAttribute,\n\tOUT UCHAR *pMamageablity,\n\tOUT UCHAR *pMinorReason)\n{\n\tPP2PEID_STRUCT\tpP2pEid;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength;\n\tULONG\t\t\tAttriLen;\n\tULONG\t\t\tLeftLength;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pParseManageSubElmt  MsgLen = %ld.  \\n\", MsgLen));\n\tif (pNumOfP2pOtherAttribute != NULL)\n\t\t*pNumOfP2pOtherAttribute = 0;\n\t\n\tif (pTotalNumOfP2pAttribute != NULL)\n\t\t*pTotalNumOfP2pAttribute = 0;\n\n\tLeftLength = MsgLen; \n\tpEid = (PEID_STRUCT)Msg;\n\twhile ((ULONG)(pEid->Len + 2) <= LeftLength)\n\t{\n\t\tif (pEid->Eid == IE_CHANNEL_USAGE)\n\t\t{\n\t\t\t*pChannel = pEid->Octet[2];\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IE_CHANNEL_USAGE  = %x %x %x %x [ch=]%x.  \\n\", pEid->Eid, pEid->Len, pEid->Octet[0], pEid->Octet[1], pEid->Octet[2]));\n\t\t}\n\t\t/* might contains P2P IE and WPS IE.  So use if else if enough for locate  P2P IE. */\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDIRECT_OUI, 4))\n\t\t{\n\t\t\t/* Get Request content capability */\n\t\t\tpP2pEid = (PP2PEID_STRUCT) &pEid->Octet[4];\n\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\tLength = 0;\n\t\t\twhile ((Length + 3 + AttriLen) <= pEid->Len)    \n\t\t\t{\n\t\t\t\tswitch(pP2pEid->Eid)\n\t\t\t\t{\n\t\t\t\t\tcase SUBID_P2P_MINOR_REASON:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC -  Has P2P SUBID_P2P_MINOR_REASON IE Minor Reason = %d.\\n\", pP2pEid->Octet[0]));\n\t\t\t\t\t\tif (pTotalNumOfP2pAttribute != NULL)\n\t\t\t\t\t\t\t*pTotalNumOfP2pAttribute = *pTotalNumOfP2pAttribute+1;\n\t\t\t\t\t\tif (pNumOfP2pOtherAttribute != NULL)\n\t\t\t\t\t\t\t*pNumOfP2pOtherAttribute = *pNumOfP2pOtherAttribute+1;\n\t\t\t\t\t\tif (pMinorReason != NULL)\n\t\t\t\t\t\t\t*pMinorReason = pP2pEid->Octet[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SUBID_P2P_MANAGEABILITY:\n\t\t\t\t\t\tif (pTotalNumOfP2pAttribute != NULL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*pTotalNumOfP2pAttribute = *pTotalNumOfP2pAttribute+1;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC -Ap Has P2P Manageability IE . Total P2P IE count is %d \\n\", *pTotalNumOfP2pAttribute));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pMamageablity != NULL)\n\t\t\t\t\t\t\t*pMamageablity = pP2pEid->Octet[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif (pTotalNumOfP2pAttribute != NULL)\n\t\t\t\t\t\t\t\t*pTotalNumOfP2pAttribute = *pTotalNumOfP2pAttribute+1;\n\t\t\t\t\t\t\tif (pNumOfP2pOtherAttribute != NULL)\n\t\t\t\t\t\t\t\t*pNumOfP2pOtherAttribute = *pNumOfP2pOtherAttribute+1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[1]+ content[Len] */\n\t\t\t\tpP2pEid = (PP2PEID_STRUCT)((UCHAR*)pP2pEid + 3 + AttriLen);        \n\t\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\t\t\t}\n\n\t\t}\n\t\tLeftLength = LeftLength - pEid->Len - 2;\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tParse P2P subelement content to fill into the correct output buffer. May contain multiple P2P IE and WPS IE.\n\t\tSo need while loop to find all IE.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pParseSubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN BOOLEAN  bBeacon, \n\tOUT USHORT *pDpid,\n\tOUT UCHAR *pGroupCap,\n\tOUT UCHAR *pDeviceCap,\n\tOUT UCHAR *pDeviceName,\n\tOUT UCHAR *pDeviceNameLen,\n\tOUT UCHAR *pDevAddr,\n\tOUT UCHAR *pInterFAddr,\n\tOUT UCHAR *pBssidAddr,\n\tOUT UCHAR *pSsidLen,\n\tOUT UCHAR *pSsid,\n\tOUT USHORT *pConfigMethod,\n\tOUT USHORT *pWpsConfigMethod,\n\tOUT UCHAR *pDevType,\n\tOUT UCHAR *pListenChannel,\n\tOUT UCHAR *pOpChannel,\n\tOUT UCHAR *pChannelList,\n\tOUT UCHAR *pIntent,\n\tOUT UCHAR *pStatusCode,\n\tOUT UCHAR *pInviteFlag,\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT VOID *pPrivate)\n{\n\tULONG\t\t\t\tLength = 0;\n\tPP2PEID_STRUCT\tpP2pEid;\n\tULONG\t\t\tAttriLen;\n\tUSHORT \t\t\tWscType, WscLen;\n\tUCHAR\t\t\toffset;\n\tPEID_STRUCT\t\tpEid;\n\tUCHAR\t\t\tChannelListLeft = MAX_NUM_OF_CHANNELS;\n\t/*USHORT\t\t\tExtTime; */\n\tULONG\t\t\tAccuP2PIELen;\n\tULONG\t\t\tAccuIeLen = 0;\n\t\n\t//for Beacon lost on SCC debug!\n\tULONG ChannelAttriLen = 0;\n\tULONG NumOfChannel = 0;\n\tUCHAR Choffset =0;\n\t\n\t/* Intel sends multiple P2P IE... So I can't give each input a default value.. */\n\tif (MsgLen == 0)\n\t\treturn;\n\n\tpEid = (PEID_STRUCT)Msg;\n\tAccuIeLen = pEid->Len + 2; /* 2: Tag (1 octet) + Len (1 octet) */\n\tif (RTMPEqualMemory(&pEid->Octet[1], WIFIDIRECT_OUI, 4))\n\t{\n\t\t/*\n\t\t\tIn this case, length is 2 bytes.\n\t\t*/\n\t\tAccuIeLen = pEid->Len + pEid->Octet[0]*256 + 3; /* 3: Tag (1 octet) + Len (2 octet) */\n\t}\n\n\twhile ((ULONG)(AccuIeLen) <= MsgLen)\n\t{\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WPS_OUI, 4))\n\t\t{\n\t\t\t/*PUCHAR pWscEid = &pEid->Eid;*/\n\t\t\tif (bBeacon == TRUE)\n\t\t\t\tP2PParseWPSIE(&pEid->Octet, (pEid->Len + 2), pDpid, pWpsConfigMethod, pDeviceName, pDeviceNameLen);\n\t\t\telse\n\t\t\t\tP2PParseWPSIE(&pEid->Octet, (pEid->Len + 2), pDpid, pWpsConfigMethod, NULL, NULL);\n\t\t}\n\t\t/* might contains P2P IE and WPS IE.  So use if else if enough for locate  P2P IE. */\n\t\telse if ((RTMPEqualMemory(&pEid->Octet[0], WIFIDIRECT_OUI, 4))\n\t\t\t||(RTMPEqualMemory(&pEid->Octet[1], WIFIDIRECT_OUI, 4)))\n\t\t{\n\t\t\t/* Get Request content capability */\n\t\t\tif (RTMPEqualMemory(&pEid->Octet[1], WIFIDIRECT_OUI, 4))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tIn this case, length is 2 bytes.\n\t\t\t\t*/\n\t\t\t\tpP2pEid = (PP2PEID_STRUCT) &pEid->Octet[5];\n\t\t\t\tAccuP2PIELen = pEid->Len + pEid->Octet[0]*256;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpP2pEid = (PP2PEID_STRUCT) &pEid->Octet[4];\n\t\t\t\tAccuP2PIELen = pEid->Len;\n\t\t\t}\n\t\t\t/*\n\t\t\t\tThe value of AccuP2PIELen shall reduce the length of OUI (4).\n\t\t\t*/\n\t\t\tAccuP2PIELen -= 4; \n\n\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] *8;\n\n\t\t\tLength = 0;\n\n\t\t\t\twhile ((Length + 3 + AttriLen) <= AccuP2PIELen)    \n\t\t\t\t{\n\t\t\t\t\tswitch(pP2pEid->Eid)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tcase SUBID_P2P_EXT_LISTEN_TIMING:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_INVITE_FLAG:\n\t\t\t\t\t\t\tif (pInviteFlag != NULL)\n\t\t\t\t\t\t\t\t*pInviteFlag = pP2pEid->Octet[0];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_MANAGEABILITY:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_CAP:\n\t\t\t\t\t\t\t*pGroupCap = pP2pEid->Octet[1]; \n\t\t\t\t\t\t\t*pDeviceCap = pP2pEid->Octet[0]; \n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_OWNER_INTENT:\n\t\t\t\t\t\t\tif (pIntent != NULL)\n\t\t\t\t\t\t\t\t*pIntent = pP2pEid->Octet[0];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_CHANNEL_LIST:\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SUBID_P2P_CHANNEL_LIST - ( Len %d %d)= %x %x %x %x %x %x..\\n\",  pP2pEid->Len[0], pP2pEid->Len[1], pP2pEid->Octet[0],pP2pEid->Octet[1],pP2pEid->Octet[2],pP2pEid->Octet[3],pP2pEid->Octet[4],pP2pEid->Octet[5]));\n\t\t\t\t\t\t\tif (pChannelList != NULL && (AttriLen -3 > 0))  /* reduce Country String 3 bytes*/\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tChannelAttriLen = AttriLen;\n\t\t\t\t\t\t\t\tChannelAttriLen -= 3; /* reduce Country String 3 bytes*/\n\t\t\t\t\t\t\t\tChoffset +=3;\n\n\t\t\t\t\t\t\t\twhile(ChannelAttriLen > 0 && (ChannelListLeft - NumOfChannel)> 0  && NumOfChannel  < 20)\n\t\t\t\t\t\t\t\t{                                                       \n\t\t\t\t\t\t\t\t\tChoffset +=1; /* skip operating class(1) */\n\t\t\t\t\t\t\t\t\tNumOfChannel = pP2pEid->Octet[Choffset];\n\t\t\t\t\t\t\t\t\tRTMPMoveMemory(pChannelList, &pP2pEid->Octet[Choffset+1], NumOfChannel); /* copy n channels*/\n\t\t\t\t\t\t\t\t\tpChannelList += NumOfChannel;\n\n\t\t\t\t\t\t\t\t\tChoffset +=1; /* Num of channels(1) */\n\t\t\t\t\t\t\t\t\tChoffset += NumOfChannel ; /* Channel Lis(n) */\n\n\t\t\t\t\t\t\t\t\tChannelListLeft -=NumOfChannel;\n\t\t\t\t\t\t\t\t\tChannelAttriLen -=(2+NumOfChannel); /* operating class(1) + Num of channels(1) + Channel Lis(n) */\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_OP_CHANNEL:\n\t\t\t\t\t\t\tif (pOpChannel != NULL)\n\t\t\t\t\t\t\t\t*pOpChannel = pP2pEid->Octet[4];\t/* Octet[1] is regulatory  */\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_LISTEN_CHANNEL:\n\t\t\t\t\t\t\tif (pListenChannel != NULL)\n\t\t\t\t\t\t\t\t*pListenChannel = pP2pEid->Octet[4];\t/* Octet[1] is regulatory  */\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_GROUP_BSSID:\t/* 6 group Bssid */\n\t\t\t\t\t\t\tif (pBssidAddr != NULL)\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pBssidAddr, &pP2pEid->Octet[0], MAC_ADDR_LEN);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_INTERFACE_ADDR:\t/* 9 */\n\t\t\t\t\t\t\tif (pInterFAddr != NULL)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pInterFAddr, &pP2pEid->Octet[0], MAC_ADDR_LEN);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_DEVICE_ID:\n\t\t\t\t\t\t\t/* Beacon has this field. */\n\t\t\t\t\t\t\tif (pDevAddr != NULL)\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pDevAddr, &pP2pEid->Octet[0], MAC_ADDR_LEN);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_GROUP_ID:\n\t\t\t\t\t\t\tif ((pSsid != NULL) && (pP2pEid->Len[0]) > 6 && (pP2pEid->Len[0] <= 38))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pSsid, &pP2pEid->Octet[6], (pP2pEid->Len[0] - 6));\n\t\t\t\t\t\t\t\tif (pSsidLen != NULL)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t*pSsidLen = pP2pEid->Len[0] - 6;\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\" SUBID_P2P_GROUP_ID - SSID ( Len %d)= %c %c %c %c %c %c %c %c %c.. \\n\",  *pSsidLen, pSsid[0], pSsid[1],pSsid[2],pSsid[3],pSsid[4],pSsid[5],pSsid[6],pSsid[7],pSsid[8]));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_DEVICE_INFO:\n\t\t\t\t\t\t\tif (pDevAddr != NULL)\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pDevAddr, &pP2pEid->Octet[0], MAC_ADDR_LEN);\n\t\t\t\t\t\t\tif (pConfigMethod != NULL)\n\t\t\t\t\t\t\t\t*pConfigMethod = be2cpu16(*(PUSHORT)&pP2pEid->Octet[6]);\n\t\t\t\t\t\t\tif (pDevType != NULL)\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pDevType, &pP2pEid->Octet[8], 8);\n\t\t\t\t\t\t\t/* Count the DeviceName offset. */\n\t\t\t\t\t\t\toffset = 17 + pP2pEid->Octet[16] * 8;\n\t\t\t\t\t\t\tWscType = cpu2be16(*((PUSHORT) &pP2pEid->Octet[offset]));\n\t\t\t\t\t\t\tWscLen  = cpu2be16(*((PUSHORT) (&pP2pEid->Octet[offset+2])));\n\t\t\t\t\t\t\tif ((WscType == WSC_ID_DEVICE_NAME) && (WscLen <= 32))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((pDeviceName != NULL))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t*pDeviceNameLen = (UCHAR)WscLen;\n\t\t\t\t\t\t\t\t\tRTMPMoveMemory(pDeviceName, &pP2pEid->Octet[21 + pP2pEid->Octet[16]*8], WscLen);\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SUBID_P2P_DEVICE_INFO Device Name= %c %c %c %c %c %c \\n\",  pDeviceName[0], pDeviceName[1],pDeviceName[2],pDeviceName[3],pDeviceName[4],pDeviceName[5]));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_STATUS:\n\t\t\t\t\t\t\tif (pStatusCode != NULL)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t*pStatusCode = pP2pEid->Octet[0];\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\" SUBID_P2P_STATUS    Eid = %x \\n\", *pStatusCode));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_GROUP_INFO:\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_NOA:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SUBID_P2P_CONFIG_TIMEOUT:\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" SUBID_P2P_ unknown  Eid = %x \\n\", pP2pEid->Eid));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[1]+ content[Len] */\n\t\t\t\t\tif (Length >= AccuP2PIELen)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tpP2pEid = (PP2PEID_STRUCT)((UCHAR*)pP2pEid + 3 + AttriLen);        \n\t\t\t\t\tAttriLen = pP2pEid->Len[0] + pP2pEid->Len[1] * 256;\n\t\t\t\t}\n\n\t\t}\n#ifdef WFD_SUPPORT\n\t\telse if ((\n/* Due to Intel p2p WiDi need to get rtsp port by ioctl, so leverage the WFD code base structure*/\n\t\t\t(pAd->StaCfg.WfdCfg.bWfdEnable)) &&\n\t\t\tNdisEqualMemory(pEid->Octet, WIFIDISPLAY_OUI, 4) && (pEid->Len >= 4))\n\t\t{\n\t\t\t//hex_dump(\"WFD_IE\", &pEid->Eid, pEid->Len +2);\n\t\t\tif (pWfdSubelement && pWfdSubelementLen)\n\t\t\t{\n\t\t\t\tRTMPMoveMemory(pWfdSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t*pWfdSubelementLen = pEid->Len + 2;\n\t\t\t}\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\t/* already reach the last IE. Stop finding next Eid. */\n\t\tif (AccuIeLen >= MsgLen)\n\t\t\tbreak;\n\n\t\t/* Forward buffer to next pEid */\n\t\tif (RTMPEqualMemory(&pEid->Octet[1], WIFIDIRECT_OUI, 4))\n\t\t{\n\t\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + (pEid->Len + pEid->Octet[0]*256 + 3));    \n\t\t\t/* We already accumul ate all P2P IE. don't need to search next P2P IE */\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + pEid->Len + 2);    \n\t\t}\n\t\t\n\t\t/* Since we get the next pEid,  */\n\t\t/* Predict the accumulated IeLen after adding the next pEid's length.\t */\n\t\t/* The accumulated IeLen is for checking length. */\n\t\tif (RTMPEqualMemory(&pEid->Octet[1], WIFIDIRECT_OUI, 4))\n\t\t{\n\t\t\tAccuIeLen += (pEid->Len + pEid->Octet[0]*256 + 3);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAccuIeLen += (pEid->Len + 2);\n\t\t}\n\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Go Negociation Confirm packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceGoNegoConfirmAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUCHAR\t\tDevType[8] = {0}, DevAddr[6] = {0}, IfAddr[6] = {0};\n\tUCHAR \t\tChannel, OpChannel = 0, Intent, index, Ssid[32];\n\tUCHAR\t\tGroupCap, DeviceCap, DeviceNameLen;\n \t/*ULONG\t\tFrameLen; */\n \t/*ULONG\t\tTempLen; */\n\tUCHAR\t\tStatusCode, SsidLen = 0;\n\t/*PEID_STRUCT\tpEid; */\n\t/*ULONG\t\tLeftLength; */\n\tUSHORT\t\tDpid, ConfigMethod;\n\tUCHAR       AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Recieve Confirm Confirm Confirm. -> From %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pFrame->p80211Header.Addr2)));\n\n\t/* Get Request content capability */\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen + 7 - sizeof(P2P_PUBLIC_FRAME)), \n\t\tFALSE, &Dpid, &GroupCap, &DeviceCap, NULL, &DeviceNameLen, DevAddr, IfAddr, NULL, \n\t\t&SsidLen, (PUCHAR)&Ssid, &ConfigMethod, NULL, DevType, &Channel, &OpChannel, NULL, &Intent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\t/* confirm doesn't attach device addr in subelement. So copy from SA. */\n\tRTMPMoveMemory(DevAddr, pFrame->p80211Header.Addr2, MAC_ADDR_LEN);\n\tDBGPRINT(RT_DEBUG_ERROR, (\" DevAddr = %02x:%02x:%02x:%02x:%02x:%02x.  \\n\",  PRINT_MAC(DevAddr)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\" OpChannel = %d.   \\n\",  OpChannel));\n\t\n\t/* Check StatusCode. */\n\tif (StatusCode != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Ignore Go Negociation Confirm Status Code not Success. \\n\"));\n\t\treturn;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Recieve Confirm Confirm Confirm Success. \\n\"));\n\n\n \t/* Check Peer is in the valid state to receive Go Negociation Response. */\n\tindex = P2pGroupTabSearch(pAd, DevAddr);\n\tif (index == P2P_NOT_FOUND)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Ignore Go Negociation Confirm from Unknown device. \\n\"));\n\t\tP2PPrintP2PEntry(pAd, 0);\n\t\treturn;\n\t}\n\telse \n\t{\n\t\t/* Existing peer stay in another state. Doesn't need respond the Go Negociation Request. */\n\t\tif ((pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO) && (pAd->P2pTable.Client[index].P2pClientState != P2PSTATE_WAIT_GO_COMFIRM))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Existing peer stay in another state. = %d. return.\\n\", pAd->P2pTable.Client[index].P2pClientState));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (index < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[index];\n\t\tif (!NdisEqualMemory(AllZero, IfAddr, MAC_ADDR_LEN))\n\t\t\tRTMPMoveMemory(pP2pEntry->InterfaceAddr, IfAddr, MAC_ADDR_LEN);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" pP2pEntry[%d]->rule = %s. GoIntent = %d. My intent is %d. \\n\",  index, decodeMyRule(pP2pEntry->Rule), pP2pEntry->GoIntent, pP2PCtrl->GoIntentIdx));\n\t\t/*DBGPRINT(RT_DEBUG_ERROR, (\"---->P2P pP2PCtrl->SsidLength = %d. [%x %x %x..]\\n\", pP2PCtrl->SSIDLen, \n\t\t\t\t\t\t\t\tpP2PCtrl->SSID[0], pP2PCtrl->SSID[1], pP2PCtrl->SSID[2]));*/\n\t\tif (SsidLen > 0)\n\t\t{\n\t\t\tRTMPMoveMemory(pP2pEntry->Ssid, Ssid, 32);\n\t\t\tpP2pEntry->SsidLen = SsidLen;\n\t\t}\n\n\t\tif (pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_CLIENT)\n\t\t{\t\n\t\t\tint i;\n\t\t\t/* I become Client */\n\t\t\tpP2pEntry->Rule = P2P_IS_GO;\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GO_WPS;\n\t\t\tpP2PCtrl->GroupChannel = OpChannel;\n\t\t\tpP2PCtrl->GroupOpChannel = OpChannel;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - I become ENROLLEE!GOGO Go's SsidLen = %d.!!\\n\", pP2pEntry->SsidLen));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - I become ENROLLEE!GOGO Go's Ssid[%d] = \", pP2pEntry->SsidLen));\t\n\t\t\tfor (i=0; i<pP2pEntry->SsidLen; i++)\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%c \", pP2pEntry->Ssid[i]));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - I become ENROLLEE!!GOGO Go's Bssid = %02x:%02x:%02x:%02x:%02x:%02x!!\\n\", PRINT_MAC(pP2PCtrl->Bssid)));\n\t\t\tRTMPZeroMemory(pP2PCtrl->SSID, 32);\n\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, pP2pEntry->Ssid, pP2pEntry->SsidLen);\n\t\t\tpP2PCtrl->SSIDLen = pP2pEntry->SsidLen;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - I become ENROLLEE!!GOGO Go's SSID[%d] = %s!!\\n\", pP2PCtrl->SSIDLen, pP2PCtrl->SSID));\n\t\t\tP2pGoNegoDone(pAd, pP2pEntry);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* I become GO */\n\t\t\tpP2pEntry->Rule = P2P_IS_CLIENT;\n\t\t\tpP2PCtrl->GroupOpChannel = pP2PCtrl->GroupChannel;\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GOT_GO_COMFIRM;\n\t\t\tP2pGoNegoDone(pAd,  pP2pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - I become Internal REGISTRA!!    REGISTRA. !! GOGOGO\\n\"));\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_CONNECTED, pP2pEntry, pP2PCtrl->CurrentAddress);//to inform UI, Group Started and as GO.\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t}\n\n\t}\n\n}\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Go Negociation Response packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceGoNegoRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)&Elem->Msg[0];\n\tUCHAR\t\tDevType[8], Ssid[32], DevAddr[6], IfAddr[6] = {0}, Channel = 0, OpChannel = 0, Intent, index;\n\tUCHAR\t\tGroupCap, DeviceCap, DeviceName[32];\n\tUCHAR\t\tSsidLen = 0, DeviceNameLen = 0;\n\tPRT_P2P_CLIENT_ENTRY pP2pEntry;\n\tUCHAR\t\tStatusCode = 8;\n\tUCHAR\t\tTempIntent;\n\tUSHORT\t\tDpid, ConfigMethod;\n\tBOOLEAN\t\tCancelled;\n\tUCHAR       AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -  GOGOGO Recieve Response.Response MsgLen = %ld.\\n\", Elem->MsgLen));\n\tif (pP2PCtrl->bP2pReSendTimerRunning)\n\t{\n\t\tpP2PCtrl->bP2pReSendTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pP2PCtrl->P2pReSendTimer, &Cancelled);\n\t}\n\t/* Get Request content capability */\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8),  \n\t\tFALSE, &Dpid, &GroupCap, &DeviceCap, DeviceName, &DeviceNameLen, \n\t\tDevAddr, IfAddr, NULL, &SsidLen, Ssid, &ConfigMethod, NULL, DevType, \n\t\t&Channel, &OpChannel, NULL, &TempIntent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\n\tIntent = TempIntent >>1;\n\tDBGPRINT(RT_DEBUG_TRACE, (\" Dev Addr = %02x:%02x:%02x:%02x:%02x:%02x. Intent = %d. My Intent = %d. \\n\",  PRINT_MAC(DevAddr), Intent, pP2PCtrl->GoIntentIdx));\n\tDBGPRINT(RT_DEBUG_TRACE, (\" interface addr = %02x:%02x:%02x:%02x:%02x:%02x  \\n\",  PRINT_MAC(IfAddr)));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P -StatusCode = %d. PeerIntent = %d . OpChannel = %d. My Intent = %d.\\n\", StatusCode, Intent, OpChannel, pP2PCtrl->GoIntentIdx));\n\t\n\t/* Check StatusCode. */\n\tif (StatusCode == P2PSTATUS_BOTH_INTENT15)\n\t{\n\t\tpP2PCtrl->P2pCounter.DisableRetryGrpFormCounter = 1200;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - Receive Status Code that both Go Intent Value is 15.  = %x \\n\", StatusCode));\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tP2pSendWirelessEvent(pAd, RT_P2P_GO_NEGO_FAIL_INTENT, NULL, DevAddr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\tP2pLinkDown(pAd, P2P_CONNECT_FAIL);\n\t\treturn;\n\t}\n\telse if ((StatusCode == P2PSTATUS_REJECT_BY_USER) || (StatusCode == P2PSTATUS_PASSED))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -Go Negociation Response Status Code PASSED or being rejected  = %d \\n\", StatusCode));\n\t\tindex = P2pGroupTabSearch(pAd, DevAddr);\n\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t{\n\t\t\tpAd->P2pTable.Client[index].ReTransmitCnt = 0;\n\t\t\t/* since peer return that info unknown, then stop resend GO Negociation Req. */\n\t\t\t/* doesn't need to prepare for retry GO Nego REQ. */\n\t\t\t/*pAd->P2pTable.Client[index].P2pClientState = P2PSTATE_DISCOVERY; */\n\t\t\t/* Test Plan 5.1.22 */\n\t\t\tP2pStopConnectThis(pAd);\n\t\t\t/* Reset Peer State as Default. */\n\t\t\tpAd->P2pTable.Client[index].P2pClientState = P2PSTATE_DISCOVERY_CLIENT;\n\t\t\t/* Turn Back to My Listen Channel. */\n\t\t\tP2pStopScan(pAd);\n\t\t\t/* Back to LISTEN State. */\n\t\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_CANL_CMD_EVT, 0, NULL, 0);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P -  = %s \\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\t\t}\n\n\t\tChannel = pAd->P2pCfg.ListenChannel;\n\t\tAsicSwitchChannel(pAd, Channel, FALSE);\n\t\tAsicLockChannel(pAd, Channel);\n\n\t\treturn;\n\t}\n\telse if (StatusCode != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Ignore Go Negociation Response Status Code not Success.  = %d \\n\", StatusCode));\n\t\treturn;\n\t}\n\n \t/* Check Peer is in the valid state to receive Go Negociation Response. */\n\tindex = P2pGroupTabSearch(pAd, DevAddr);\n\tif (index == P2P_NOT_FOUND)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Ignore Go Negociation Response from Unknown device. \\n\"));\n\t\treturn;\n\t}\n\telse \n\t{\n\n\t}\n\n\tif (index < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\tpP2pEntry->ConfigMethod = ConfigMethod;\n\t\t/* Check peer capability */\n\t\tpP2pEntry->ListenChannel = Channel;\n\t\tif (OpChannel != 0)\n\t\tpP2pEntry->OpChannel = OpChannel;\n\t\tpP2pEntry->GoIntent = Intent;\n\t\tpP2pEntry->StateCount = 0;\n\t\tpP2pEntry->bValid = FALSE;\n\t\tpP2pEntry->Dpid = Dpid;\n\t\tif (!NdisEqualMemory(AllZero, IfAddr, MAC_ADDR_LEN))\n\t\tRTMPMoveMemory(pP2pEntry->InterfaceAddr, IfAddr, MAC_ADDR_LEN);\n\n\t\tif (SsidLen > 0)\n\t\t{\n\t\t\tRTMPMoveMemory(pP2pEntry->Ssid, Ssid, SsidLen);\n\t\t\tpP2pEntry->SsidLen = SsidLen;\n\t\t}\n\t\tP2PPrintP2PEntry(pAd, index);\n\t\t/* If this peer is provistioned, dpid should follows spec's assignment on page 33 */\n\t\tif (P2P_TEST_FLAG(pP2pEntry, P2PFLAG_PROVISIONED))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P provisioned -dpid= %x. ConfigMethod = %s.\\n\", Dpid, decodeConfigMethod(pP2pEntry->ConfigMethod)));\n\t\t\tswitch(pP2pEntry->ConfigMethod)\n\t\t\t{\n\t\t\t\tcase WSC_CONFMET_DISPLAY:\n\t\t\t\t\tif ((Dpid != DEV_PASS_ID_REG) && (Dpid != DEV_PASS_ID_PIN))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -1 Ignore Go Negociation Response with wrong dpid \\n\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase WSC_CONFMET_KEYPAD:\n\t\t\t\t\tif (Dpid != DEV_PASS_ID_USER)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -3 Ignore Go Negociation Response with wrong dpid \\n\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tP2pSetRule(pAd, index, IfAddr, TempIntent, OpChannel);\n\t\t\n\t\tif ((pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO) && (pAd->P2pTable.Client[index].P2pClientState != P2PSTATE_SENT_GO_NEG_REQ))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -  Existing peer stay in another state. = %d. \\n\", pAd->P2pTable.Client[index].P2pClientState));\n\t\t\treturn;\n\t\t}\n\t\tP2PSendGoNegoConfirm(pAd, pFrame->Token, index, pP2pEntry->addr);\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Go Negociation Request packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceGoNegoReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\t\tUCHAR\t\tDevType[8] = {0}, DevAddr[6] = {0}, BssidAddr[6] = {0};\n\t\tUCHAR\t\tChannel, OpChannel, Intent, index, StatusCode;\n\t\tUCHAR\t\tGroupCap, DeviceCap, DeviceName[32], DeviceNameLen;\n\t\tULONG\t\tFrameLen;\n\t\tULONG\t\tTempLen;\n\t\tUCHAR\t\tSsidLen = 0;\n\t\tRT_P2P_CLIENT_ENTRY *pP2pEntry;\n\t\tNDIS_STATUS   NStatus;\n\t\tPUCHAR\t\t\tpOutBuffer = NULL;\n\t\tPUCHAR\t\tpDest;\n\t\t/* \n\t\t\tmake Go Nego Rsp Status as PASSED at first.\n\t\t\t\n\t\t\tWhat if UI/wpa_supplicant is involved, \n\t\t\tsend GO Nego Resp wiht Status = 1, \n\t\t\tand inform Upper layer, Go Nego Req is coming!\n\n\t\t\tif all operation is from iwpriv instead of UI.\n\t\t\twe shall type \n\n\t\t\tiwpriv p2p0 set p2pConfirmByUI=1 to unlock the condition, \n\t\t\tit will make RspStatus could become P2PSTATUS_SUCCESS.\n\t\t\t\n\t\t*/\n\t\tUCHAR\t\tRspStatus = P2PSTATUS_PASSED;\n\t\tUCHAR\t\tTempIntent;\n\t\t/*PUCHAR\t\tpP2pIE; */\n\t\tUSHORT\t\tDpid, SentDpid, ConfigMethod;\n\t\tBOOLEAN\t\tbSendEvent = FALSE;\n\t\tUCHAR       AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\t\tBOOLEAN\t\tCancelled;\n\t\n#ifdef WFD_SUPPORT\n\t\tULONG\tWfdSubelementLen = 0;\n\t\tPUCHAR\tWfdSubelement = NULL;\n#endif /* WFD_SUPPORT */\n\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"GOGOGOGO P2P - receive Go Neg Request. MsgLen = %ld \\n\", Elem->MsgLen));\n#ifdef WFD_SUPPORT\n\t\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\t\tif (WfdSubelement == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\treturn;\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\tRTMPZeroMemory(&DeviceName[0], 32);\n\t\tpP2pEntry = NULL;\n\t\tif (IS_P2P_DEVICE_DISCOVERING(pAd))\n\t\tP2pStopScan(pAd);\n\t\t/* Get Request content capability */\n\t\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8),\n\t\t\tFALSE, &Dpid, &GroupCap, &DeviceCap, DeviceName, &DeviceNameLen, DevAddr, \n\t\t\tBssidAddr, NULL, &SsidLen, NULL, &ConfigMethod, NULL, DevType, \n\t\t\t&Channel, &OpChannel, NULL, &TempIntent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\t\t&WfdSubelementLen, WfdSubelement,\n#endif /* WFD_SUPPORT */\n\t\t\tNULL);\n\n\t\tIntent = TempIntent >>1;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    DevAddr in P2P IE = %02x %02x %02x %02x %02x %02x  \\n\",  PRINT_MAC(DevAddr)));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    Addr2 = %02x %02x %02x %02x %02x %02x  \\n\",  PRINT_MAC(pFrame->p80211Header.Addr2)));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    its bssid = %02x %02x %02x %02x %02x %02x  \\n\",  PRINT_MAC(BssidAddr)));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"    Dpid = %x ,%s \\n\", Dpid, decodeDpid(Dpid)));\n\t\n\t\tindex = P2pGroupTabSearch(pAd, DevAddr);\n\n\t\tif ((index != P2P_NOT_FOUND) && (pP2PCtrl->bP2pReSendTimerRunning))\n\t\t{\n\t\t\tpP2PCtrl->bP2pReSendTimerRunning = FALSE;\n\t\t\tpAd->P2pTable.Client[index].ReTransmitCnt = 0;\n\t\t\tRTMPCancelTimer(&pP2PCtrl->P2pReSendTimer, &Cancelled);\n\t\t}\n \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P -Peer[%d] Intent = %x . OpChannel = %x. My Intent = %x. TempIntent = %x\\n\", index, Intent, Channel, pP2PCtrl->GoIntentIdx, TempIntent));\n\t\tif (index == P2P_NOT_FOUND)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P -1  insert\\n\"));\n\t\t\tindex = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_DISCOVERY, NULL, 0, DeviceCap, GroupCap);\n\t\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t\t{\n\t\t\t\tpP2PCtrl->PopUpIndex = index;\n\t\t\t\tRTMPMoveMemory(pAd->P2pTable.Client[index].DeviceName, DeviceName, 32);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"From a unknown peer. Pop up setting windows. %d\\n\", pP2PCtrl->PopUpIndex));\n\t\t\t\tpAd->P2pTable.Client[index].DeviceNameLen = DeviceNameLen;\n\t\t\t\tpAd->P2pTable.Client[index].DeviceName[pAd->P2pTable.Client[index].DeviceNameLen] = 0x0;\n\n\t\t\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\t\t\tpP2pEntry->ConfigMethod = ConfigMethod;\n\t\t\t}\n\t\t\tbSendEvent = TRUE;\n\t\t}\n\t\t\n\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t{\n\t\t\tif ((pP2PCtrl->bConfirmByUI)\n\t\t\t\t|| (pAd->P2pCfg.bSigmaEnabled == TRUE))\n\t\t\t{\n\t\t\t\tRspStatus = P2PSTATUS_SUCCESS;\n\t\t\t}\n\n\t\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\t\tpP2pEntry->ConfigMethod = ConfigMethod;\n\t\t\tif (!NdisEqualMemory(AllZero, BssidAddr, MAC_ADDR_LEN))\n\t\t\t\tRTMPMoveMemory(pP2pEntry->InterfaceAddr, BssidAddr, MAC_ADDR_LEN);\n#ifdef WFD_SUPPORT\n\t\t\tif (WfdSubelementLen)\n\t\t\t{\n\t\t\t\t/*Note: In order to enhance the compatibility. We do not update the session_avail bit\n\t\t\t\t\tcarried in GO-Nego-Req, as some devices will clear this bit during GO-Nego phase.\n\t\t\t\t\tSo we backup its original value, and then set it back.\n\t\t\t\t*/\n\t\t\t\tUCHAR session_avail_backup=pP2pEntry->WfdEntryInfo.session_avail;\n\t\t\t\tWfdParseSubElmt(pAd, \n\t\t\t\t\t\t\t\t&pP2pEntry->WfdEntryInfo,\n\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\tWfdSubelementLen);\n\t\t\t\tpP2pEntry->WfdEntryInfo.session_avail=session_avail_backup;\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\t\tP2PPrintP2PEntry(pAd, index);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"My P2P Dpid = %x.    State = %s. \\n\", pP2PCtrl->Dpid, decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\tif (IS_P2P_PEER_CLIENT_OP(pP2pEntry) || IS_P2P_PEER_WPAPSK(pP2pEntry) || IS_P2P_PEER_PROVISIONING(pP2pEntry))\n\t\t\t{\n\t\t\t\t/* Receive Go Neg Req when this peer's state is operating or doing provisioning. Delete this peer. */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - Existing peer  state is %d. %s,.\tDelete it.\\n\", pP2pEntry->P2pClientState, decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\n\t\t\t\tgoto CleanUp;\n\t\t\t}\n\t\t\tif (pP2pEntry->P2pClientState > P2PSTATE_GO_DONE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - Existing peer  state is %d . %s,. return.\\n\", pP2pEntry->P2pClientState, decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\tgoto CleanUp;\n\t\t\t}\n\t\t\telse if (pP2pEntry->P2pClientState == P2PSTATE_SENT_GO_NEG_REQ)\n\t\t\t{\n\t\t\t\tif (IsP2pFirstMacSmaller(pP2pEntry->addr, pP2PCtrl->CurrentAddress))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - Dual GO Req. Existing peer  state is %s. \\n\", decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\t\tgoto CleanUp;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\t/* I am GO . Don't need go through GO NEgo process. So return fail. */\n\t\t\t\tRspStatus = P2PSTATUS_INVALID_PARM;\n\t\t\t}\n\t\t\telse if (pP2PCtrl->Dpid == DEV_PASS_ID_NOSPEC)\n\t\t\t{\n\t\t\t\t/* Test Plan 5.1.21 */\n\t\t\t\tRspStatus = P2PSTATUS_PASSED;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tgoto CleanUp;\n\t\t\t\t\n\t\t/* Ban Request from the same GoIntent index. */\n\t\tif ((Intent == pP2PCtrl->GoIntentIdx) && (Intent == 15))\n\t\t{\n\t\t\tRspStatus = P2PSTATUS_BOTH_INTENT15;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2pReceGoNegoReqAction -Receive a peer that has the same Go Intent index as mine. \\n\"));\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_GO_NEGO_FAIL_INTENT, NULL, DevAddr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t}\t\n\t\t\t\n\t\t/* allocate and send out ProbeRsp frame */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" MlmeAllocateMemory\tfail -  . \\n\"));\n\t\t\tgoto CleanUp;\n\t\t}\n\t\n\t\tpDest = pOutBuffer;\n\t\tif (RspStatus == P2PSTATUS_SUCCESS)\n\t\t{\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_WAIT_GO_COMFIRM;\n\t\t\tpP2pEntry->StateCount = 0;\n\t\t\tpP2pEntry->bValid = FALSE;\n\t\t\tpP2pEntry->Dpid = Dpid;\n\t\t\tP2pSetRule(pAd, index, BssidAddr, TempIntent, OpChannel);\n\t\t\t/* If I am Go, Use my channel to set in the Go Nego Rsp. */\n\t\t\tif (pP2pEntry->Rule == P2P_IS_CLIENT)\n\t\t\t\tOpChannel = pP2PCtrl->GroupChannel;\n\t\t\t/* Change beacon content */\n\t\t\tpP2PCtrl->P2pCapability[1] |= (GRPCAP_GROUP_FORMING);\n\t\t\tP2pUpdateBssBeacon(pAd, pP2PCtrl->P2pCapability, NULL);\n\t\t}\n\t\t\t\t\n\t\t/*SentDpid = DEV_PASS_ID_PIN; */\n\t\tif (P2P_TEST_FLAG(pP2pEntry, P2PFLAG_PROVISIONED))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -\tGo Negociation Responce to provisioned\t\\n\"));\n\t\t\tif (pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\t\tSentDpid = DEV_PASS_ID_REG;\n\t\t\telse if (pP2PCtrl->ConfigMethod == WSC_CONFMET_LABEL)\n\t\t\t\tSentDpid = DEV_PASS_ID_PIN;\n\t\t\telse if  (pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t{\n\t\t\t\tif (pP2PCtrl->bSigmaEnabled == FALSE)\n\t\t\t\t\tRspStatus = P2PSTATUS_PASSED;\n\t\t\t\tSentDpid = DEV_PASS_ID_USER;\n\t\t\t}\n\t\t\telse if (pP2PCtrl->ConfigMethod == WSC_CONFMET_PBC)\n\t\t\t\tSentDpid = DEV_PASS_ID_PBC;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (Dpid == DEV_PASS_ID_PIN)\n\t\t\t\tSentDpid = DEV_PASS_ID_USER;\n\t\t\telse if (Dpid == DEV_PASS_ID_USER)\n\t\t\t\tSentDpid = DEV_PASS_ID_PIN;\n\t\t\telse if  (Dpid == DEV_PASS_ID_REG)\n\t\t\t{\n\t\t\t\tif (pP2PCtrl->bSigmaEnabled == FALSE)\n\t\t\t\t\tRspStatus = P2PSTATUS_PASSED;\n\t\t\t\tSentDpid = DEV_PASS_ID_USER;\n\t\t\t}\n\t\t\telse if (Dpid == DEV_PASS_ID_PBC)\n\t\t\t\tSentDpid = DEV_PASS_ID_PBC;\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Peer Go Nego Req DPID = %x\\n\", Dpid));\n\t\t}\n\n\t\t/* Save  peer capability */\n\t\tpP2pEntry->ListenChannel = Channel;\n\t\tpP2pEntry->OpChannel = OpChannel;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tif (bSendEvent)\n\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_DEVICE_FIND, &pAd->P2pTable.Client[index], pFrame->p80211Header.Addr2);\n\t\tP2pSendWirelessEvent(pAd, RT_P2P_RECV_GO_NEGO_REQ, &pAd->P2pTable.Client[index], pFrame->p80211Header.Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t/*P2P_SetWscRule(pAd, SentDpid); */\n\t\tSentDpid = pP2PCtrl->Dpid;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - ReceDpid = %x. SentDpid %x \\n\", (Dpid), (SentDpid)));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - ReceDpid = %s. SentDpid %s \\n\", decodeDpid(Dpid), decodeDpid(SentDpid)));\n\t\tP2PMakeGoNegoRsp(pAd, DevAddr, SentDpid, pFrame->Token, TempIntent, OpChannel, RspStatus, pOutBuffer, &TempLen);\n\t\tFrameLen = TempLen;\n\t\tpDest += TempLen;\n\t\t/* : copy req to rsp first. */\n\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - Make Go Negociation Responce Length = %ld.RspStatus = %d \\n\", FrameLen, RspStatus));\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\n\t\tif (RspStatus == P2PSTATUS_PASSED)\n\t\t{\n\t\t\tP2P_CMD_STRUCT\tP2pCmd;\n\n\t\t\tpP2pEntry->Dpid = Dpid;\n\t\t\tP2pSetRule(pAd, index, BssidAddr, TempIntent, OpChannel);\n\t\t\t/*UCHAR ClientState = pAd->P2pTable.Client[index].P2pClientState;*/\n\t\t\tCOPY_MAC_ADDR(&P2pCmd.Addr[0], pAd->P2pTable.Client[index].addr);\n\t\t\tP2pCmd.Idx = index;\n\t\t\t//if (pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\tif (pP2PCtrl->ConfigMethod != WSC_CONFMET_KEYPAD)\n\t\t\tMlmeEnqueue(pAd, P2P_GO_FORM_STATE_MACHINE, P2P_SEND_PASSED_CMD_EVT, sizeof(P2P_CMD_STRUCT), &P2pCmd, 0);\n#ifdef HE_BD_SUPPORT\n\t\t\tif (pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t{\n\t\t\t\tpP2PCtrl->bConfirmByUI = false; // If Keypad, still need UI confirm to run connection sequence.\n\t\t\t}\n#endif\t\n\t\t}\n\n\t\t/*P2PPrintP2PEntry(pAd, index); */\n\t\t/* else ignore this Go Negociation Request because P2P table reach maximum. */\nCleanUp:\n#ifdef WFD_SUPPORT\n\tif (WfdSubelement)\n\t\tos_free_mem(pAd, WfdSubelement);\n#endif /* WFD_SUPPORT */\n\treturn;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Client Discovery Request Public Action Frame packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR DevDiscCnt = 0;\nVOID P2pReceDevDisReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUCHAR\t\tdevAddr[6], BssidAddr[6], OpChannel, StatusCode;\n\tUCHAR\t\tGroupCap, DeviceCap, DeviceNameLen;\n\tUCHAR\t\tSsidLen;\n\tUCHAR\t\tp2pClientIndex;\n\tRT_P2P_CLIENT_ENTRY \t*pEntry = NULL;\n\tMAC_TABLE_ENTRY *pMacEntry = NULL;\n\tULONG\t\t\tTotalFrameLen;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2pReceDevDisReqAction = %ld\\n\", Elem->MsgLen));\n\n\t/* stop scan and lock at Listen Channel. */\n\tif ((!P2P_GO_ON(pAd)) && (!P2P_CLI_ON(pAd)))\n\t{\n\t\tP2pStopScan(pAd);\n\t\tAsicSwitchChannel(pAd, pAd->P2pCfg.ListenChannel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->P2pCfg.ListenChannel);\n\t}\n\n\t/* Get Request content capability */\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8), \n\t\tFALSE, NULL, &GroupCap, &DeviceCap, NULL, &DeviceNameLen, devAddr, NULL, \n\t\tBssidAddr, &SsidLen, NULL, NULL, NULL, NULL, NULL, &OpChannel, NULL, NULL, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\n\t/* Use TX to decide who is sending. */\n\tp2pClientIndex = P2pGroupTabSearch(pAd, devAddr);\n\tif (p2pClientIndex < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpEntry = &pAd->P2pTable.Client[p2pClientIndex];\n\t\tpMacEntry = MacTableLookup(pAd, pEntry->InterfaceAddr);\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - ask for p2p client[%d] = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", p2pClientIndex, PRINT_MAC(devAddr)));\n\n\tif (((pMacEntry != NULL) && (pEntry != NULL)\n\t\t&& (pEntry->P2pClientState == P2PSTATE_CLIENT_WPS_DONE)))\n\t{\n\t\tMLME_P2P_ACTION_STRUCT\tP2PActReq;\t\n\n\n\t\tNdisZeroMemory(&P2PActReq, sizeof(P2PActReq));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"to interface Addr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\",  \n\t\t\t\t\tPRINT_MAC(pEntry->InterfaceAddr)));\n\t\tCOPY_MAC_ADDR(P2PActReq.Addr, pEntry->InterfaceAddr);\n\t\tP2PActReq.TabIndex = p2pClientIndex;\n\t\tMlmeEnqueue(pAd, P2P_ACTION_STATE_MACHINE, MT2_MLME_P2P_GO_DIS_REQ, sizeof(MLME_P2P_ACTION_STRUCT), (PVOID)&P2PActReq, 0);\n\t\tMlmeHandler(pAd);\n\t\tDevDiscCnt++;\n\n\t\t/* Device Discvoery  Response is delayed until I get the GO Discovery Request Frame's Ack. */\n\t\t/* Assume always success.  Send back response. */\n\t\tRTMPMoveMemory(&pAd->P2pCfg.LatestP2pPublicFrame, pFrame, sizeof(P2P_SAVED_PUBLIC_FRAME));\n\t\tOS_WAIT(500);\n\t\tP2PSendDevDisRsp(pAd, P2PSTATUS_SUCCESS, pAd->P2pCfg.LatestP2pPublicFrame.Token, pAd->P2pCfg.LatestP2pPublicFrame.p80211Header.Addr2, &TotalFrameLen);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: P2P -can't find p2p client .Status fail\\n\", __FUNCTION__));\n\t\tP2PSendDevDisRsp(pAd, P2PSTATUS_IMCOMPA_PARM, pFrame->Token, pFrame->p80211Header.Addr2, &TotalFrameLen);\n\t}\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Client Discovery Response Public Action Frame packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceDevDisRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUCHAR\t\tDevType[8], DevAddr[6], BssidAddr[6], Channel, OpChannel, index, StatusCode;\n\tUCHAR\t\tGroupCap, DeviceCap, DeviceNameLen, TempIntent;\n\tUCHAR\t\tSsidLen = 0;\n\tRT_P2P_CLIENT_ENTRY *pP2pEntry;\n\tUSHORT\t\tDpid, ConfigMethod;\n\tUCHAR\t\tClientP2PIndex = P2P_NOT_FOUND, i;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"GOGO  P2P - P2pReceDevDisRspAction MsgLen = %ld \", Elem->MsgLen));\n\n\tpP2pEntry = NULL;\n\n\tindex = P2pGroupTabSearch(pAd, pFrame->p80211Header.Addr2);\n\tif (index == P2P_NOT_FOUND)\n\t\treturn;\n\n\tpP2pEntry = &pAd->P2pTable.Client[index];\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceDevDisRspAction %s.\\n \", decodeP2PClientState(pP2pEntry->P2pClientState)));\n\tif (pP2pEntry->P2pClientState != P2PSTATE_GO_DISCO_COMMAND)\n\t\treturn;\n\t/* Change State back to P2PSTATE_DISCOVERY_GO */\n\t/* Because P2PSTATE_GO_DISCO_COMMAND is from P2PSTATE_DISCOVERY_GO */\n\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY_GO;\n\t/* Get Request content capability */\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8),\n\t\tFALSE, &Dpid, &GroupCap, &DeviceCap, NULL, &DeviceNameLen, DevAddr, \n\t\tBssidAddr, NULL, &SsidLen, NULL, &ConfigMethod, NULL, DevType, \n\t\t&Channel, &OpChannel, NULL, &TempIntent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\n\tif (StatusCode == P2PSTATUS_SUCCESS)\n\t{\n\t\tfor (i = index; i < MAX_P2P_GROUP_SIZE;i++)\n\t\t{\n\t\t\tif (pAd->P2pTable.Client[i].P2pClientState == P2PSTATE_CLIENT_DISCO_COMMAND)\n\t\t\t\tClientP2PIndex = i;\n\t\t}\n\t\tif (ClientP2PIndex == P2P_NOT_FOUND)\n\t\t\treturn;\n\n\t\tpAd->P2pTable.Client[ClientP2PIndex].P2pClientState = P2PSTATE_CONNECT_COMMAND;\n\t\tP2pStartGroupForm(pAd, pAd->P2pTable.Client[ClientP2PIndex].addr, ClientP2PIndex);\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Invitation Request Action Frame packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceInviteReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUCHAR\t\tDevType[8], Ssid[32], DevAddr[6], BssidAddr[6], InfAddr[6], OpChannel, index, StatusCode;\n\tUCHAR\t\tGroupCap, DeviceCap, DeviceNameLen;\n \tULONG\t\tFrameLen;\n\tUCHAR\t\tChannelList[MAX_NUM_OF_CHANNELS];\n\tUCHAR\t\tSsidLen, p2pindex;\n\t/*RT_P2P_CLIENT_ENTRY *pP2pEntry;*/\n\tUCHAR\t\tRspStatus = P2PSTATUS_INVALID_PARM;\n\tUCHAR\t\tMyRule = P2P_IS_GO;\n\tUSHORT\t\tConfigMethod;\n\tUCHAR\t\tInviteFlag;\n\tBOOLEAN\t\tbReinvoke = FALSE;\n\tINT\t\t\tP2PEntryCnt;\n\n\tRTMPZeroMemory(ChannelList, MAX_NUM_OF_CHANNELS);\n\tRTMPZeroMemory(Ssid, MAX_LEN_OF_SSID);\n\t/* Get Request content capability */\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8), \n\t\tFALSE, NULL, &GroupCap, &DeviceCap, NULL, &DeviceNameLen, DevAddr, InfAddr, \n\t\tBssidAddr, &SsidLen, Ssid, &ConfigMethod, NULL, DevType, \n\t\tNULL, &OpChannel, ChannelList, NULL, &StatusCode, &InviteFlag,\n#ifdef WFD_SUPPORT\n\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceInviteReqAction ==>InviteFlag = %d.  %s \\n\", \n\t\t\t\tInviteFlag, decodeP2PState(pP2PCtrl->P2PConnectState)));\n\n\t/* Use TX to decide who is sending. */\n\tRTMPMoveMemory(DevAddr, pFrame->p80211Header.Addr2, MAC_ADDR_LEN);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"OpChannel = %d.    \\n\",  OpChannel));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"BssidAddr = %02x:%02x:%02x:%02x:%02x:%02x  \\n\",  PRINT_MAC(BssidAddr)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"DevAddr = %02x:%02x:%02x:%02x:%02x:%02x  \\n\",  PRINT_MAC(DevAddr)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"Ssid[%d] = %s.  \\n\",  SsidLen, Ssid));\n\tp2pindex = P2pGroupTabSearch(pAd, DevAddr);\n\t{\n\t\tp2pindex = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_DISCOVERY_GO, Ssid, SsidLen, DeviceCap, GroupCap);\n\t}\n\tindex = P2pPerstTabSearch(pAd, DevAddr, BssidAddr, InfAddr);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"perst index = %d. p2pindex = %d. \\n\", index, p2pindex));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"My Dpid = %d.    Dpid = %s.\\n\", pP2PCtrl->Dpid, decodeDpid(pP2PCtrl->Dpid)));\n\tP2PPrintP2PEntry(pAd, p2pindex);\n\n\tif (p2pindex == P2P_NOT_FOUND)\n\t\treturn;\n\n        if (P2P_GO_ON(pAd))\n\t{\n\t\tP2PEntryCnt = P2PGetEntryCnt(pAd);\n\t\tif ( (pP2PCtrl->p2pMaxEntry!= 0 ) && (P2PEntryCnt >= pP2PCtrl->p2pMaxEntry) )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceInviteReqAction ==>P2PGetEntryCnt = %d\\n\", P2PEntryCnt));\n\t\t\tRspStatus = P2PSTATUS_UNABLE;\n\t\t\tP2PMakeInviteRsp(pAd, MyRule, pFrame->Token, pFrame->p80211Header.Addr2, pP2PCtrl->CurrentAddress, &OpChannel, &RspStatus, &FrameLen);\n\t\t\treturn;\n\t\t}\n\t}\n\tif ((index < MAX_P2P_TABLE_SIZE) && ((InviteFlag & P2P_INVITE_FLAG_REINVOKE) == P2P_INVITE_FLAG_REINVOKE))\n\t\tbReinvoke = TRUE;\n\n\t/* case 1: Reinvoke case: */\n\t/* If I have credential and both enable persistent.  */\n\tif (bReinvoke == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite: reinvoke.  \\n\"));\n\t\tP2pCheckInviteReq(pAd, (pAd->P2pTable.PerstEntry[index].MyRule == P2P_IS_GO), index, ChannelList, BssidAddr, OpChannel, Ssid, SsidLen, &RspStatus);\n\t\tif (RspStatus == P2PSTATUS_SUCCESS)\n\t\t{\n\t\t\t/* Find peer,. So set Status = success. */\n\t\t\tif (pAd->P2pTable.PerstEntry[index].MyRule == P2P_IS_GO)\n\t\t\t{\n\t\t\t\tOpChannel = pP2PCtrl->GroupChannel;\n\t\t\t\tpP2PCtrl->GroupOpChannel = OpChannel;\n\t\t\t\t/* pAd->StaCfg.WscControl.WscAPChannel = OpChannel; */\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite: Decide to use OpChannel = %d for group \\n\", OpChannel));\n\t\t\t\tp2pindex = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_CLIENT_WPS, Ssid, SsidLen, DeviceCap, GroupCap);\n\t\t\t\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t\t\t\t{\n\t\t\t\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_WAIT_REVOKEINVITE_RSP_ACK;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite: reach my limit. Send back RspStatus = %d.  \\n\", RspStatus));\n\t\t\t\t\tRspStatus = P2PSTATUS_LIMIT;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tMyRule = P2P_IS_CLIENT;\n\t\t\t\tpP2PCtrl->GroupChannel = OpChannel;\n\t\t\t\tpP2PCtrl->GroupOpChannel = OpChannel;\n\t\t\t\t/*P2pCopyPerstParmToCfg(pAd, index); */\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite: Reinvoke as client for group \\n\"));\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\t\t/* Update the Client state and SSID. */\n\t\t\t\tP2pGroupTabInsert(pAd, DevAddr, P2PSTATE_GO_WPS, Ssid, SsidLen, DeviceCap, GroupCap);\n\t\t\t\t/*P2pGoNegoDone(pAd, pAd->PortList[pAd->P2pCfg.PortNumber], &pAd->P2pTable.Client[index]); */\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_WPS_ENROLLEE;\n\t\t\t\t/*P2pWpsDone(pAd, DevAddr); */\n\t\t\t\tCOPY_MAC_ADDR(pAd->ApCfg.ApCliTab[0].CfgApCliBssid, pP2PCtrl->Bssid);\n\t\t\t}\n\t\t}\n\t}\n\t/* case 2: abNormal invitation cases:...\n\t */\n\telse if ((InviteFlag & P2P_INVITE_FLAG_REINVOKE) == P2P_INVITE_FLAG_REINVOKE)\n\t{\n\t\t/* Peer ask me to reinvoke. But I can't find my record. Send back error code. */\n\t\tRspStatus = P2PSTATUS_UNKNOWN_GROUP;\n\t\t/*\n\t\t\tIn this case, we need to do P2P GO formation with that P2P peer again.\n\t\t\tTherefore we need to update P2pClientState and Rule here for preventing wrong action in P2pReceProvisionReqAction.\n\t\t*/\n\t\tpAd->P2pTable.Client[p2pindex].Rule = P2P_IS_DEVICE;\n\t\tpAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite:  Can't find Credential.    \\n\"));\n\t}\n\t/* case 3: Normal invitation cases:\n\t */  \n\telse\n\t{\n\t\tif (RTMPEqualMemory(BssidAddr, ZERO_MAC_ADDR, MAC_ADDR_LEN))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite Req carry allzero Bssid, \\n\"));\n\t\t}\n\t\telse if (IS_P2P_CONNECT_IDLE(pAd) || (pAd->P2pCfg.P2PConnectState == P2P_INVITE))\n\t\t{\n\t\t\tP2pCheckInviteReqFromExisting(pAd, ChannelList, DevAddr, OpChannel, Ssid, SsidLen, &RspStatus);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invite: Got invitation from P2P Client . RspStatus = %d \\n\", RspStatus));\n\t\t\tif (RspStatus == P2PSTATUS_SUCCESS)\n\t\t\t{\n\t\t\t\tRTMPZeroMemory(pP2PCtrl->SSID, MAX_LEN_OF_SSID);\n\t\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, Ssid, SsidLen);\n\t\t\t\tRTMPZeroMemory(pAd->P2pTable.Client[p2pindex].Ssid, MAX_LEN_OF_SSID);\n\t\t\t\tRTMPMoveMemory(pAd->P2pTable.Client[p2pindex].Ssid, Ssid, SsidLen);\n\t\t\t\tpAd->P2pTable.Client[p2pindex].SsidLen = SsidLen;\n\t\t\t\tCOPY_MAC_ADDR(pP2PCtrl->Bssid, BssidAddr);\n\t\t\t\tCOPY_MAC_ADDR(pAd->P2pTable.Client[p2pindex].bssid, BssidAddr);\n\t\t\t\tCOPY_MAC_ADDR(pAd->P2pTable.Client[p2pindex].InterfaceAddr, BssidAddr);\n\t\t\t\tpP2PCtrl->SSIDLen = SsidLen;\n\t\t\t\tpP2PCtrl->GroupOpChannel = OpChannel;\n\t\t\t\tpAd->P2pTable.Client[p2pindex].OpChannel = OpChannel;\n\t\t\t\tpAd->P2pTable.Client[p2pindex].ConfigMethod = ConfigMethod;\n\t\t\t\tMyRule = P2P_IS_CLIENT;\n\t\t\t}\n\t\t}\n\t}\n\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\tP2pSendWirelessEvent(pAd, RT_P2P_RECV_INVITE_REQ, &pAd->P2pTable.Client[p2pindex], pFrame->p80211Header.Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2p Send Invite Rsp RspStatus = %d.  \\n\", RspStatus));\n\tP2PMakeInviteRsp(pAd, MyRule, pFrame->Token, pFrame->p80211Header.Addr2, pP2PCtrl->CurrentAddress, &OpChannel, &RspStatus, &FrameLen);\n\n\t/* Start Provision */\n\tif (((bReinvoke == FALSE) && (MyRule == P2P_IS_CLIENT)) && \n\t\t((RspStatus == P2PSTATUS_SUCCESS) || ((RspStatus == P2PSTATUS_UNKNOWN_GROUP))))\n\t{\n\t\tP2pConnectPrepare(pAd, DevAddr, P2PSTATE_PROVISION_COMMAND);\n\t}\n\telse if ((bReinvoke == TRUE) && (RspStatus == P2PSTATUS_SUCCESS))\n\t{\n\t\tPWSC_CTRL           pWscControl;\n\t\tif (MyRule == P2P_IS_CLIENT)\n\t\t{\n\t\t\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\t\tpObj->ioctl_if_type = INT_P2P;\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[0].WscControl;\n\n\n\t\t\t/* P2P CLIENT up. */\n\t\t\tSet_P2p_OpMode_Proc(pAd, \"2\");\n\n\t\t\tOS_WAIT(500);\n\n\t\t\tpObj->ioctl_if_type = INT_APCLI;\n\t\t\tNdisMoveMemory(pP2PCtrl->Bssid, pAd->P2pTable.PerstEntry[index].Addr, MAC_ADDR_LEN);\n\t\t\tWscWriteConfToApCliCfg(pAd,\n\t\t\t\t\t\t\tpWscControl,\n\t\t\t\t\t\t\t&pAd->P2pTable.PerstEntry[index].Profile,\n\t\t\t\t\t\t\tTRUE);\n\t\t\tpObj->ioctl_if_type = INT_P2P;\n\n\t\t\tif ((pAd->CommonCfg.Channel != OpChannel) && (!INFRA_ON(pAd)))\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.Channel = OpChannel;\n\t\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\t\t}\n\t\t\t/* P2P AP-Client Enable. */\n\t\t\tSet_P2pCli_Enable_Proc(pAd, \"1\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!P2P_GO_ON(pAd) && !P2P_CLI_ON(pAd))\n\t\t\t{\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\n\t\t\t\tWscWriteConfToPortCfg(pAd,\n\t\t\t\t\t\t\t\t  pWscControl,\n\t\t\t\t\t\t\t\t  &pAd->P2pTable.PerstEntry[index].Profile,\n\t\t\t\t\t\t\t\t  TRUE);\n\t\t\t\tP2P_GoStop(pAd);\n\t\t\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving Invitation Response Action Frame packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceInviteRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUCHAR\t\tDevType[8], devAddr[6], BssidAddr[6] = {0}, OpChannel, index, StatusCode;\n\tUCHAR\t\tGroupCap, DeviceCap, DeviceNameLen;\n\tUSHORT\t\tConfigMethod;\n\tUCHAR\t\tSsidLen, ChannelList[MAX_NUM_OF_CHANNELS];\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry = NULL;\n\tPWSC_CTRL           pWscControl;\n\n\tRTMPZeroMemory(ChannelList, MAX_NUM_OF_CHANNELS);\n\tRTMPZeroMemory(BssidAddr, MAC_ADDR_LEN);\n\t/* Get Request content capability */\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8), \n\t\tFALSE, NULL, &GroupCap, &DeviceCap, NULL, &DeviceNameLen, devAddr, NULL, \n\t\tBssidAddr, &SsidLen, NULL, &ConfigMethod, NULL, DevType, \n\t\tNULL, &OpChannel, ChannelList, NULL, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pReceInviteRspAction ==> \\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TA = %02x:%02x:%02x:%02x:%02x:%02x  \\n\",  \n\t\t\t\tPRINT_MAC(pFrame->p80211Header.Addr2)));\n\t\n\tif ((StatusCode == P2PSTATUS_SUCCESS) || (StatusCode == P2PSTATUS_PASSED))\n\t{\n\t\tindex = P2pPerstTabSearch(pAd, pFrame->p80211Header.Addr2, NULL, NULL);\n\t\tif ((index < MAX_P2P_TABLE_SIZE)\n\t\t\t&& (IS_PERSISTENT_ON(pAd)))\n\t\t{\n\t\t\t/* this is a persistent connection. */\n\t\t\tpP2PCtrl->ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\t\tpP2PCtrl->ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t\t\t/* Find peer,. So set Status = success. */\n\t\t\tif (pAd->P2pTable.PerstEntry[index].MyRule == P2P_IS_GO)\n\t\t\t{\n\t\t\t\tOpChannel = pP2PCtrl->GroupChannel;\n\t\t\t\tpP2PCtrl->GroupOpChannel = OpChannel;\n\t\t\t\tP2pCopyPerstParmToCfg(pAd, index);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Decide to use OpChannel = %d for group \\n\", OpChannel));\n\t\t\t\tP2pGroupTabInsert(pAd, pFrame->p80211Header.Addr2, P2PSTATE_CLIENT_WPS, NULL, SsidLen, 0, 0);\n\t\t\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\n\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\t\t\t\t\n\t\t\t\tWscWriteConfToPortCfg(pAd,\n\t\t\t\t\t\t\t\t  pWscControl,\n\t\t\t\t\t\t\t\t  &pAd->P2pTable.PerstEntry[index].Profile,\n\t\t\t\t\t\t\t\t  TRUE);\n\t\t\t\tP2P_GoStop(pAd);\n\t\t\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\t\t\tpObj->ioctl_if_type = INT_P2P;\n\t\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[0].WscControl;\n\n\t\t\t\tpP2PCtrl->GroupChannel = OpChannel;\n\t\t\t\tpP2PCtrl->GroupOpChannel = OpChannel;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Reinvoke as client for group. OpChannel= %d\\n\", OpChannel));\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_WPS_ENROLLEE;\n\t\t\t\t/* Add some delay to connect GO */\n\t\t\t\tP2pGroupTabInsert(pAd, pFrame->p80211Header.Addr2, P2PSTATE_REINVOKEINVITE_TILLCONFIGTIME, NULL, SsidLen, 0, 0);\n\n\t\t\t\t/* P2P CLIENT up. */\n\t\t\t\tSet_P2p_OpMode_Proc(pAd, \"2\");\n\n\t\t\t\tOS_WAIT(500);\n\n\t\t\t\tpObj->ioctl_if_type = INT_APCLI;\n\t\t\t\tWscWriteConfToApCliCfg(pAd,\n\t\t\t\t\t\t\t\tpWscControl,\n\t\t\t\t\t\t\t\t&pAd->P2pTable.PerstEntry[index].Profile,\n\t\t\t\t\t\t\t\tTRUE);\n\t\t\t\tpObj->ioctl_if_type = INT_P2P;\n\n\t\t\t\t/* P2P AP-Client Enable. */\n\t\t\t\tSet_P2pCli_Enable_Proc(pAd, \"1\");\n\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tindex = P2pGroupTabSearch(pAd, pFrame->p80211Header.Addr2);\n\t\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t\t{\n\t\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GOT_GO_COMFIRM;\n\t\t\t\t\tP2pSetWps(pAd, pP2pEntry);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceInviteRspAction Success.  I am GO. \\n\"));\n\t\t\t\t}\n\t\t\t\telse if (P2P_CLI_ON(pAd))\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceInviteRspAction Success.  I am client. \\n\"));\n\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving provistion request Action Frame packet.\n\t\tthe Element field contains a single WPS IE.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceProvisionReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry = NULL;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUSHORT\t\tWpsConfigMethod;\n\tULONG\t\tFrameLen;\n\tUCHAR\t\tp2pindex;\n\tUCHAR\t\tGroupCap, DeviceCap, DevAddr[MAC_ADDR_LEN], BssidAddr[MAC_ADDR_LEN], OpChannel;\n\tUCHAR\t\tSsid[32], SsidLen;\n\tUCHAR\t\tDeviceName[32], DeviceNameLen;\n\tUCHAR\t\tDevType[8];\n\tUSHORT\t\tPeerWscMethod;\n\tBOOLEAN\t\tbSendEvent = FALSE;\n\tINT\t\t\tP2PEntryCnt;\n#ifdef WFD_SUPPORT\n\tULONG\tWfdSubelementLen = 0;\n\tPUCHAR\tWfdSubelement = NULL;\n#endif /* WFD_SUPPORT */\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pRece Provision ReqAction ==> \\n\"));\n#ifdef WFD_SUPPORT\n\t\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\t\tif (WfdSubelement == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\treturn;\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\tif (IS_P2P_DEVICE_DISCOVERING(pAd))\n\t\tP2pStopScan(pAd);\n\tRTMPZeroMemory(&DeviceName, 32);\n\tP2pParseSubElmt(pAd, &pFrame->ElementID, (Elem->MsgLen - LENGTH_802_11 - 8), \n\t\tFALSE, NULL, &GroupCap, &DeviceCap, DeviceName, &DeviceNameLen, DevAddr, NULL, \n\t\tBssidAddr, &SsidLen, Ssid, NULL, &WpsConfigMethod, DevType, \n\t\tNULL, &OpChannel, NULL, NULL, NULL, NULL,\n#ifdef WFD_SUPPORT\n\t\t&WfdSubelementLen, WfdSubelement,\n#endif /* WFD_SUPPORT */\n\t\tNULL);\n\nif (P2P_GO_ON(pAd))\n\t{\n\t\tP2PEntryCnt = P2PGetEntryCnt(pAd);\n\t\tif ( (pP2PCtrl->p2pMaxEntry!= 0 ) && (P2PEntryCnt >= pP2PCtrl->p2pMaxEntry) )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pRece Provision ReqAction ==>P2PGetEntryCnt = %d\\n\", P2PEntryCnt));\n\t\t\tP2PSendProvisionRsp(pAd, 0, pFrame->Token, pFrame->p80211Header.Addr2, &FrameLen);\n\t\t\treturn;\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pRece Provision ReqAction ==>ConfigMethod = %x %s\\n\", WpsConfigMethod, decodeConfigMethod(WpsConfigMethod)));\n\n\t/*\n\t\tPatch for other vendor that might send multiple config... IN spec, the config method in Provision\n\t\tDiscovery req should carry config method that indicate SINGLE method.\n\t*/\n\tif (WpsConfigMethod == WSC_CONFMET_PBC\n\t\t&& (pP2PCtrl->Dpid == DEV_PASS_ID_PBC))\n\t{\t\n\t\t/* Correct. Keep going. */\n\t}\n\telse if (WpsConfigMethod == WSC_CONFMET_DISPLAY\n\t\t&& (pP2PCtrl->Dpid == DEV_PASS_ID_REG))\n\t{\n\t\t/* Correct. Keep going. */\n\t}\n\telse if (WpsConfigMethod == WSC_CONFMET_KEYPAD\n\t\t&& (pP2PCtrl->Dpid == DEV_PASS_ID_USER))\n\t{\n\t\t/* Correct. Keep going. */\n\t}\n\telse if (WpsConfigMethod == WSC_CONFMET_LABEL\n\t\t&& (pP2PCtrl->Dpid == DEV_PASS_ID_USER))\n\t{\n\t\t/* Correct. Keep going. */\n\t}\n\telse\n\t{\n\t\tif (WpsConfigMethod == WSC_CONFMET_PBC)\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PBC_MODE;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_PBC;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_PBC;\n\t\t}\n\t\telse if (WpsConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_REG;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_DISPLAY;\n\t\t}\n\t\telse if (WpsConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t{\n\t\t\tpP2PCtrl->WscMode = WSC_PIN_MODE;\n\t\t\tpP2PCtrl->Dpid = DEV_PASS_ID_USER;\n\t\t\tpP2PCtrl->ConfigMethod = WSC_CONFMET_KEYPAD;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pRece Provision ReqAction ==> Ignore this provision request here\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/* I only support those 4 method. */\n\tif ( (WpsConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t|| (WpsConfigMethod == WSC_CONFMET_PBC) \n\t\t|| (WpsConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t|| (WpsConfigMethod == 0x188))\n\t{\n\t\tp2pindex = P2pGroupTabSearch(pAd, pFrame->p80211Header.Addr2);\n\t\tif (p2pindex >= MAX_P2P_GROUP_SIZE)\n\t\t{\n\t\t\tif ((GroupCap & GRPCAP_OWNER) == GRPCAP_OWNER)\n\t\t\t{\n\t\t\t\tp2pindex = P2pGroupTabInsert(pAd, pFrame->p80211Header.Addr2, P2PSTATE_DISCOVERY_GO, NULL, 0, DeviceCap, GroupCap);\n\t\t\t\tRTMPZeroMemory(pP2PCtrl->SSID, MAX_LEN_OF_SSID);\n\t\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, Ssid, SsidLen);\n\t\t\t\tRTMPZeroMemory(pAd->P2pTable.Client[p2pindex].Ssid, MAX_LEN_OF_SSID);\n\t\t\t\tRTMPMoveMemory(pAd->P2pTable.Client[p2pindex].Ssid, Ssid, SsidLen);\n\t\t\t\tCOPY_MAC_ADDR(pP2PCtrl->Bssid, BssidAddr);\n\t\t\t\tCOPY_MAC_ADDR(pAd->P2pTable.Client[p2pindex].bssid, DevAddr);\n\t\t\t\tCOPY_MAC_ADDR(pAd->P2pTable.Client[p2pindex].InterfaceAddr, DevAddr);\n\t\t\t\tpAd->P2pTable.Client[p2pindex].SsidLen = SsidLen;\n\t\t\t\tpP2PCtrl->SSIDLen = SsidLen;\n\t\t\t}\n\t\t\telse\n\t\t\tp2pindex = P2pGroupTabInsert(pAd, pFrame->p80211Header.Addr2, P2PSTATE_DISCOVERY, NULL, 0, DeviceCap, GroupCap);\n\t\t\tbSendEvent = TRUE;\n\t\t}\n\t\tif (p2pindex < MAX_P2P_GROUP_SIZE)\n\t\t{\n\t\t\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\t\t\tif (DeviceNameLen != 0)\n\t\t\t{\n\t\t\t\tRTMPMoveMemory(&pAd->P2pTable.Client[p2pindex].DeviceName[0], DeviceName, 32);\n\t\t\t\tpAd->P2pTable.Client[p2pindex].DeviceNameLen = DeviceNameLen;\n\t\t\t\tpAd->P2pTable.Client[p2pindex].DeviceName[pAd->P2pTable.Client[p2pindex].DeviceNameLen] = 0x0;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Update My Config Method to  %s (%d)\\n\", decodeConfigMethod(pP2PCtrl->ConfigMethod ), pP2PCtrl->ConfigMethod));\t\t\t\n\t\t\tif (WpsConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t\t{\n\t\t\t\tpP2pEntry->ConfigMethod = WSC_CONFMET_DISPLAY;\n\t\t\t\tpP2pEntry->Dpid = DEV_PASS_ID_REG;\n\t\t\t}\n\t\t\telse if (WpsConfigMethod == WSC_CONFMET_PBC)\n\t\t\t{\n\t\t\t\tpP2pEntry->ConfigMethod = WSC_CONFMET_PBC;\n\t\t\t\tpP2pEntry->Dpid = DEV_PASS_ID_PBC;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpP2pEntry->ConfigMethod = WSC_CONFMET_KEYPAD;\n\t\t\t\tpP2pEntry->Dpid = DEV_PASS_ID_USER;\n\t\t\t}\n\n\t\t\tif ( pP2PCtrl->bProvAutoRsp == TRUE)\n\t\t\t{\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_RECV_PROV_REQ, &pAd->P2pTable.Client[p2pindex], pFrame->p80211Header.Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t\t/* Update My WPS Configuration. */\n\t\t\t\tP2P_SetWscRule(pAd, p2pindex, &PeerWscMethod);\n\t\t\t\t/* Update Sigma.ConfigMethod after finished provision procedure. */\n\t\t\t\tP2P_SET_FLAG(&pAd->P2pTable.Client[p2pindex], P2PFLAG_PROVISIONED);\n\t\t\t\tP2PSendProvisionRsp(pAd, WpsConfigMethod, pFrame->Token, pFrame->p80211Header.Addr2, &FrameLen);\n\t\t\t\tif ((P2P_GO_ON(pAd))\n\t\t\t\t\t)\n\t\t\t\t\tP2pSetWps(pAd, pP2pEntry);\n\t\t\t\telse if ((pP2pEntry->Rule == P2P_IS_GO)\n\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GO_WPS;\n\t\t\t\t\tRTMPMoveMemory(pP2PCtrl->Bssid, pAd->P2pTable.Client[p2pindex].bssid, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPMoveMemory(pAd->P2pCfg.Bssid, pP2pEntry->bssid, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPZeroMemory(pP2PCtrl->SSID, 32);\n\t\t\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, pP2pEntry->Ssid, pP2pEntry->SsidLen);\n\t\t\t\t\tpP2PCtrl->SSIDLen = pP2pEntry->SsidLen;\n\t\t\t\t\tpP2PCtrl->GroupOpChannel = pP2pEntry->OpChannel;\n\t\t\t\t\tP2pGoNegoDone(pAd, pP2pEntry);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\t\t\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pP2pEntry->addr);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Accept Provision Req ==>ConfigMethod = %s \\n\", decodeConfigMethod(WpsConfigMethod)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( pP2PCtrl->P2pProvIndex== P2P_NOT_FOUND )\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->P2pProvConfigMethod = WpsConfigMethod;\n\t\t\t\t\tpP2PCtrl->P2pProvToken = pFrame->Token;\n\t\t\t\t\tRTMPMoveMemory(pP2PCtrl->ConnectingMAC, pFrame->p80211Header.Addr2, MAC_ADDR_LEN);\n\t\t\t\t\tpP2PCtrl->P2pCounter.UserAccept = 300;\n\t\t\t\t\tpP2PCtrl->P2pProvIndex = p2pindex;\n\t\t\t\t\tpP2PCtrl->P2pProvUserNotify = FALSE;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_RECV_PROV_REQ, &pAd->P2pTable.Client[p2pindex], pFrame->p80211Header.Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_SENT_PROVISION_REQ;\n\t\t\t\t\tCOPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pP2pEntry->addr);\n\t\t\t\t}\n\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\tif (WfdSubelementLen > 0)\n\t\t\t{\n\t\t\t\tWfdParseSubElmt(pAd,\n\t\t\t\t\t\t\t\t&pP2pEntry->WfdEntryInfo,\n\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\tWfdSubelementLen);\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t}\n\t}\n\telse\n\t\t/* send null to indicate failure */\n\t\tP2PSendProvisionRsp(pAd, 0, pFrame->Token, pFrame->p80211Header.Addr2, &FrameLen);\n\n#ifdef WFD_SUPPORT\n\tif (WfdSubelement)\n\t\tos_free_mem(pAd, WfdSubelement);\n#endif /* WFD_SUPPORT */\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine that is called when receiving provistion request Action Frame packet.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceProvisionRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)Elem->Msg;\n\tUSHORT\t\tConfigMethod = 0, PeerWscMethod;\n\t/*ULONG\t\tFrameLen; */\n\tUCHAR\t\tp2pindex = 0xff;\n\t/*PEID_STRUCT         pEid;*/\n\tPUCHAR Ptr = (PUCHAR) pFrame;\n\tPUCHAR pAddr = NULL;\n\tBOOLEAN \tCancelled;\n\n\n\tp2pindex = P2pGroupTabSearch(pAd, pFrame->p80211Header.Addr2);\n\tif (p2pindex >= MAX_P2P_GROUP_SIZE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceProvisionRspAction from unknown device ==> \\n\"));\n\t\treturn;\n\t}\n\n\tif (pP2PCtrl->bP2pReSendTimerRunning)\n\t{\n\t\tpP2PCtrl->bP2pReSendTimerRunning = FALSE;\n\t\tpAd->P2pTable.Client[p2pindex].ReTransmitCnt = 0;\n\t\tRTMPCancelTimer(&pP2PCtrl->P2pReSendTimer, &Cancelled);\n\t}\n\tif (pAd->P2pCfg.GoFormCurrentState == P2P_WAIT_GO_FORM_PROV_RSP)\n\t\tpAd->P2pCfg.GoFormCurrentState = P2P_GO_FORM_IDLE;\n\tP2pStopConnectThis(pAd);\n\tpP2pEntry = &pAd->P2pTable.Client[p2pindex];\n\tpP2pEntry->bValid = FALSE;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pReceProvisionRspAction from P2P_Tab[%d] = %02x:%02x:%02x:%02x:%02x:%02x ==> \\n\", p2pindex, PRINT_MAC(pP2pEntry->addr)));\n\t/* point to OUI2 */\n\tPtr += (sizeof(HEADER_802_11) + 2 + 4 + 4); /* Category + Action + OUI + OUIType + SubType + Token + ElementID + Length */\n\tif (RTMPEqualMemory(Ptr, WPS_OUI, 4))\n\t{\n\t\t/* point to Element ID */\n\t\t/*Ptr -= 2;*/\n\t\tP2PParseWPSIE(Ptr, (pFrame->Length +2), NULL, &ConfigMethod, NULL, NULL);\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pRece Provision RspAction ==>ConfigMethod = %04x. %s.\\n\", ConfigMethod, decodeConfigMethod(ConfigMethod)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->P2pCfg.Dpid = %d. %s.\\n\", pAd->P2pCfg.Dpid, decodeDpid(pAd->P2pCfg.Dpid)));\n\t/* Set Event to GUI to display PIN digit. */\n\tif (ConfigMethod == WSC_CONFMET_KEYPAD)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pKeSetEvent 13. Show PIN now\\n\"));\n\t}\n\n\tif (pP2pEntry->P2pClientState == P2PSTATE_SENT_PROVISION_REQ)\n\t{\n\t\tif (pP2pEntry->Rule == P2P_IS_GO)\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY_GO;\n\t\telse\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY;\n\t}\n\n\t/* p.s spec said null indicates failure. So check ConfigMethod to decide if should go on following actions. */\n\tif ((ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t|| (ConfigMethod == WSC_CONFMET_KEYPAD)\n\t\t|| (ConfigMethod == WSC_CONFMET_PBC))\n\t{\n\t\tBOOLEAN bAutoGroupFormation = FALSE;\n\t\tP2P_SET_FLAG(&pAd->P2pTable.Client[p2pindex], P2PFLAG_PROVISIONED);\n\t\tif (pP2pEntry->ConfigMethod == 0)\n\t\t\tbAutoGroupFormation = TRUE;\n\t\tpP2pEntry->ConfigMethod = ConfigMethod;\n\t\tP2P_SetWscRule(pAd, p2pindex, &PeerWscMethod);\n\n\n\t\t/* Peer use Label or Display. If peer is alreayd GO, I alreayd have WPS information to connect */\n\t\t/* So doesn't need to pop up a setting windows. */\n\t\tif ((ConfigMethod == WSC_CONFMET_DISPLAY)\n\t\t\t&& (pP2pEntry->Rule != P2P_IS_GO))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Need setting first. Pop up setting windows. %d\\n\", pAd->P2pCfg.PopUpIndex));\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Peer %d ConfigMethod = %s \\n\", p2pindex, decodeConfigMethod(ConfigMethod)));\n\t\tif (pP2pEntry->Rule == P2P_IS_GO)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Decide to Join P2p group? when I am %s \\n\", decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\t\t\tif (pAd->P2pCfg.P2PConnectState == P2P_CONNECT_IDLE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2p :connecting to GO with Bssid   %02x:%02x:%02x:%02x:%02x:%02x. \\n\", PRINT_MAC(pAd->P2pTable.Client[p2pindex].bssid)));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2p : its GroupCapability= %x.  DevCapability= %x. \\n\", pAd->P2pTable.Client[p2pindex].GroupCapability, pAd->P2pTable.Client[p2pindex].DevCapability));\n\t\t\t\tpP2PCtrl->P2PConnectState = P2P_ANY_IN_FORMATION_AS_CLIENT;\n\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GO_WPS;\n\t\t\t\tRTMPMoveMemory(pP2PCtrl->Bssid, pAd->P2pTable.Client[p2pindex].bssid, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(pAd->P2pCfg.Bssid, pP2pEntry->bssid, MAC_ADDR_LEN);\n\t\t\t\tRTMPZeroMemory(pP2PCtrl->SSID, 32);\n\t\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, pP2pEntry->Ssid, pP2pEntry->SsidLen);\n\t\t\t\tpP2PCtrl->SSIDLen = pP2pEntry->SsidLen;\n\t\t\t\tpP2PCtrl->GroupOpChannel = pP2pEntry->OpChannel;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Peer %d pP2pEntry->OpChannel = %d \\n\", p2pindex, pP2pEntry->OpChannel));\n\t\t\t\tP2pGoNegoDone(pAd, pP2pEntry);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\t/* Set MyRule in P2P GroupFormat */\n\t\t\t\tP2pSetWps(pAd, pP2pEntry);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - I am Internal REGISTRA!!    REGISTRA. !! GOGOGO\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((pP2PCtrl->ConfigMethod == WSC_CONFMET_KEYPAD) || \n\t\t\t\t\t((pP2PCtrl->ConfigMethod == WSC_CONFMET_DISPLAY) && bAutoGroupFormation == FALSE))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: recv Provision Rsp. Condif Method = %04x.\\n\", __FUNCTION__, ConfigMethod));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* After Provision Success, start connect command */\n\t\t\t\t\tpAddr = &pAd->P2pTable.Client[p2pindex].addr;\n\t\t\t\t\tP2pConnectPrepare(pAd, pAddr, P2PSTATE_CONNECT_COMMAND);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tP2pSendWirelessEvent(pAd, RT_P2P_RECV_PROV_RSP, &pAd->P2pTable.Client[p2pindex], pFrame->p80211Header.Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\t}\n\telse\n\t{\n\t\tpP2pEntry->ConfigMethod = 0;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tP2pSendWirelessEvent(pAd, RT_P2P_RECV_PROV_RSP, &pAd->P2pTable.Client[p2pindex], pFrame->p80211Header.Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t}\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine send additional Probe Request when being in P2P Search State..\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pSendProbeReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Channel)\n{\n\tPUCHAR\t\tpOutBuffer;\n\tULONG\t\tFrameLen;\n\tNDIS_STATUS   NStatus;\n\tMLME_QUEUE_ELEM \t\t*Elem;\n\t\n\tos_alloc_mem(pAd, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));\n\tif (Elem)\n\t{\n\t\t/* allocate and send out ProbeRsp frame */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tos_free_mem(NULL, Elem);\n\t\t\treturn;\n\t\t}\n\n\t\tP2PMakeProbe(pAd, Elem, Channel, SUBTYPE_PROBE_REQ, pOutBuffer, &FrameLen);\n\t\tif (FrameLen > 0)\n\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t}\n\tos_free_mem(NULL, Elem);\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine send Go Negociation Confirm packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PSendGoNegoConfirm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t\tToken,\n\tIN UCHAR\t\t\tidx,\n\tIN PUCHAR\t\tAddr1)\n{\n\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\tULONG\t\tFrameLen;\n\t\tULONG\t\tTempLen;\n\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry;\n\t\tNDIS_STATUS   NStatus;\n\t\tPUCHAR\t\t\tpOutBuffer = NULL, pDest;\n\t\tUCHAR\t\tChannel, StatusCode;\n\t\tPP2P_PUBLIC_FRAME\tpFrame;\n\t\tULONG\t\tP2pLen = 0;\n\t\t\n\t\t\n\t\t/* allocate and send out ProbeRsp frame */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\treturn;\n\t\n\t\tpP2pEntry = &pAd->P2pTable.Client[idx];\n\t\tpDest = pOutBuffer;\n\t\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\t\tP2PMakeGoNegoConfirm(pAd, Addr1, Token, pDest, &TempLen);\n\t\tFrameLen = TempLen;\n\t\tpDest += TempLen;\n\t\tP2pLen = 4;\n\t\tStatusCode = 0;\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_STATUS, &StatusCode, pDest);\n\t\tpDest += TempLen;\n\t\tFrameLen += TempLen;\n\t\tP2pLen +=TempLen;\n\t\t/* :  .\n\t\t */\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CAP, pP2PCtrl->P2pCapability, pDest);\n\t\tFrameLen += TempLen;\n\t\tpDest += TempLen;\n\t\tP2pLen +=TempLen;\n\t\t/* If I am Go, Use my channel to set in the Go Nego Rsp. */\n\t\tif (pP2pEntry->Rule == P2P_IS_CLIENT)\n\t\t{\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t\tChannel = pAd->CommonCfg.Channel;\n\t\t\telse\n\t\t\t\tChannel = pP2PCtrl->GroupChannel;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P - I become Internal REGISTRA!!\t  REGISTRA. !! GOGOGO\\n\", __FUNCTION__));\n\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &Channel, pDest);\n\t\t\tFrameLen += TempLen;\n\t\t\tpDest += TempLen;\n\t\t\tP2pLen +=TempLen;\n\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CHANNEL_LIST, &Channel, pDest);\n\t\t\tFrameLen += TempLen;\n\t\t\tpDest += TempLen;\n\t\t\tP2pLen +=TempLen;\n\t\t\t/* Shall include Group ID if I am GO */\n\t\t\t/*NdisMoveMemory(pP2PCtrl->SSID, \"DIRECT-qq\", 9); */\n\t\t\t/*pP2PCtrl->SSIDLen = 9; */\n\t\t\tRTMPMoveMemory(pP2PCtrl->SSID, &pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen);\n\t\t\tpP2PCtrl->SSIDLen = pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen;\n\t\t\t{\n\t\t\t\tUCHAR tmpGroupID[40]; // 2 (Length) + 6 (MAC Address ) + 32 (SSID)\n\t\t\t\ttmpGroupID[0] = 6 + pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen;\n\t\t\t\ttmpGroupID[1] = 0;\n\t\t\t\tRTMPMoveMemory(&tmpGroupID[2], pP2PCtrl->CurrentAddress, 6);\n\t\t\t\tRTMPMoveMemory(&tmpGroupID[8], &pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen);\n\t\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_ID, &tmpGroupID, pDest);\n\t\t\t}\n\t\t\tFrameLen += TempLen;\n\t\t\tpDest += TempLen;\n\t\t\tP2pLen +=TempLen;\n\t\t\t\n\t\t\tpP2PCtrl->Rule = P2P_IS_GO;\n\t\t\tpAd->flg_p2p_OpStatusFlags = P2P_GO_UP;\t\t\t\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* update GO's SSID */\n\t\t\tRTMPZeroMemory(pP2PCtrl->SSID, 32);\n                        RTMPMoveMemory(pP2PCtrl->SSID, pP2pEntry->Ssid, pP2pEntry->SsidLen);\n                        pP2PCtrl->SSIDLen = pP2pEntry->SsidLen;\n\t\t\tChannel = pP2pEntry->OpChannel;\n\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &Channel, pDest);\n\t\t\tFrameLen += TempLen;\n\t\t\tpDest += TempLen;\n\t\t\tP2pLen +=TempLen;\n\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CHANNEL_LIST, &Channel, pDest);\n\t\t\tFrameLen += TempLen;\n\t\t\tpDest += TempLen;\n\t\t\tP2pLen +=TempLen;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: P2P - I become ENROLLEE!!\tENROLLEE.!!\\n\", __FUNCTION__));\n/*\n\t\t\t*pDest = SUBID_P2P_CHANNEL_LIST;\n\t\t\tpDest++;\n\t\t\t*pDest = 6;\n\t\t\t*(pDest + 1) = 0;\n\t\t\t//country string . Two ASCII +\tone more byte\n\t\t\t*(pDest + 2) = 0x55;\n\t\t\t*(pDest + 3) = 0x53;\n\t\t\t*(pDest + 4) = 0x20;\n\t\t\t*(pDest + 5) = 3;\n\t\t\tif (Channel  <= 11)\n\t\t\t{\n\t\t\t\t*(pDest + 5) = 12;\n\t\t\t}\n\t\t\telse if (Channel  <= 48)\n\t\t\t{\n\t\t\t\t*(pDest + 5) = 1;\n\t\t\t}\t\t\t\n\t\t\telse if (Channel  <= 64)\n\t\t\t{\n\t\t\t\t*(pDest + 5) = 2;\n\t\t\t}\n\t\t\telse if (Channel  <= 140)\n\t\t\t{\n\t\t\t\t*(pDest + 5) = 4;\n\t\t\t}\n\t\t\telse if (Channel  == 165)\n\t\t\t{\n\t\t\t\t*(pDest + 5) = 5;\n\t\t\t}\n\t\t\t*(pDest + 6) = 1;\n\t\t\t*(pDest + 7) = Channel;\n\t\t\tP2pLen += 9;\n\t\t\tFrameLen += 9;\n\t\t\tpDest += 9;\n\t\n\t\t\t// Insert Channel List Attribute.\n\t\t\t*pDest = SUBID_P2P_CHANNEL_LIST;\n\t\t\tpDest++;\n\t\t\t*pDest = 6;\n\t\t\t*(pDest + 1) = 0;\n*/\t\n\t\t\tpP2PCtrl->Rule = P2P_IS_CLIENT;\n\t\t\tpAd->flg_p2p_OpStatusFlags = P2P_CLI_UP;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s:: P2P - Opchannel is %d \\n\", __FUNCTION__, Channel));\n\t\n\t\tpFrame->Length = (UCHAR)P2pLen;\n\n#ifdef WFD_SUPPORT\n\t\t{\n\t\t\tULONG\tWfdIeBitmap;\n\t\t\t\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &TempLen);\n\t\t\tpDest += TempLen;\n\t\t\tFrameLen += TempLen;\n\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\n\t\tpP2pEntry->P2pClientState = P2PSTATE_WAIT_GO_COMFIRM_ACK;\n\t\t/* PFP2P */\n\t\tpP2pEntry->StateCount = 0;\n\t\tpP2pEntry->bValid = FALSE;\n\t\t/*P2pSetWps(pAd, pPort); */\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\t/* Note: Send event will take long time, so we send event only after GO-Neg-Confirm is \n\t\t\tsent out.\n\t\t*/\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tif (pP2pEntry->Rule == P2P_IS_CLIENT)\n\t\t{\n\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_CONNECTED, pP2pEntry, pP2PCtrl->CurrentAddress);\n\t\t\t//to inform UI, Group Started and as GO.\n\t\t}\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\t\t/*\n\t\t\tWait here for waiting this GO Nego Confirm is sent out;\n\t\t\totherwise this GO Nego Confirm will be sent out in operation channel.\n\t\t\tP2pSetWps will do AsicSwitchChannel to operation channel.\n\t\t*/\n\t\tOS_WAIT(50);\n\t\t/* Start WPS. */\n\t\tP2pSetWps(pAd, pP2pEntry);\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make  Device Discovery Request Action Frame Packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PSendDevDisReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tBssid,\n\tIN PUCHAR\t\tClientAddr1,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame;\n\tULONG\tP2pIeLen = 0;\n\tPUCHAR\t\t\tpDest;\n\tULONG\tLength;\n\tPUCHAR        \tpOutBuffer = NULL;\n\tNDIS_STATUS   NStatus;\n\tUCHAR\t\ti;\n\tPUCHAR Ptr = NULL;\n\n\t*pTotalFrameLen = 0;\n\t/* allocate and send out ProbeRsp frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tpDest = pOutBuffer;\n\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPtr = (PUCHAR) pFrame;\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Bssid);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P - P2PSendDevDisReq  TO %02x:%02x:%02x:%02x:%02x:%02x. \\n\", PRINT_MAC(Addr1)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P - P2PSendDevDisReq  Bssid %02x:%02x:%02x:%02x:%02x:%02x. \\n\", PRINT_MAC(Bssid)));\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = P2P_DEV_DIS_REQ;\n\n\tpP2PCtrl->Token++;\n\tpFrame->Token = pP2PCtrl->Token;\n\t\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tP2pIeLen = 4;\n\t*pTotalFrameLen = 38;\n\t\n\tpDest = &pFrame->Octet[0];\n\t/* attach subelementID = 3. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_ID, ClientAddr1, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\n\tpFrame->Length = (UCHAR)P2pIeLen;\n\tpDest = (PUCHAR)pOutBuffer;\n\tfor (i = 0; i <*pTotalFrameLen; )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\": %x %x %x %x %x %x %x %x %x \\n\", *(pDest+i), *(pDest+i+1), *(pDest+i+2), \n\t\t*(pDest+i+3), *(pDest+i+4), *(pDest+i+5), *(pDest+i+6), *(pDest+i+7), *(pDest+i+8)));\n\t\ti = i + 9;\n\t}\n\tMiniportMMRequest(pAd, 0, pOutBuffer, *pTotalFrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P - P2PSendDevice Discovery Req  . TO %02x:%02x:%02x:%02x:%02x:%02x.  *pTotalFrameLen = %ld. \\n\", PRINT_MAC(Addr1), *pTotalFrameLen));\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make  Device Discovery Response Action Frame Packet .\n\t\tSend by GO. So Bssid is my GO addr\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PSendDevDisRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR \t\tRspStatus,\n\tIN UCHAR \t\t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame;\n\tULONG\tP2pIeLen = 0;\n\tPUCHAR\t\t\tpDest;\n\tULONG\tLength;\n\tPUCHAR        \tpOutBuffer = NULL;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR Ptr = NULL;\n\n\t*pTotalFrameLen = 0;\n\t/* allocate and send out ProbeRsp frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tpDest = pOutBuffer;\n\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPtr = (PUCHAR) pFrame;\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, pP2PCtrl->CurrentAddress);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2PSendDevDisRsp TO %02x:%02x:%02x:%02x:%02x:%02x. \\n\", PRINT_MAC(Addr1)));\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = P2P_DEV_DIS_RSP;\n\n\tpFrame->Token = Token;\n\t\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tP2pIeLen = 4;\n\t*pTotalFrameLen = 38;\n\t\n\tpDest = &pFrame->Octet[0];\n\t/* attach subelementID = 3. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_STATUS, &RspStatus, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\n\tpFrame->Length = (UCHAR)P2pIeLen;\n\tMiniportMMRequest(pAd, 0, pOutBuffer, *pTotalFrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2PSendDevice Discovery Response. TO %02x:%02x:%02x:%02x:%02x:%02x.   \\n\", PRINT_MAC(Addr1)));\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make Invitiation Response Action Frame Packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PSendProvisionReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT \t\tConfigMethod,\n\tIN UCHAR \t\t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame;\n\tULONG\tWpsIeLen = 0;\n\tPUCHAR\t\t\tpDest;\n\tPUCHAR\t\t\tpP2PIeLenDest;\n\tULONG\tLength;\n\tPUCHAR        \tpOutBuffer = NULL;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR Ptr = NULL;\n\n\tUCHAR index;\n\tPRT_P2P_CLIENT_ENTRY pP2pEntry;\n\t*pTotalFrameLen = 0;\n\t/* allocate and send out ProbeRsp frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2PMakeProvisionReq  . TO %02x:%02x:%02x:%02x:%02x:%02x.  ConfigMethod = %s \\n\", PRINT_MAC(Addr1), decodeConfigMethod(ConfigMethod)));\n\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPtr = (PUCHAR) pFrame;\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Addr1);\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = P2P_PROVISION_REQ;\n\tpFrame->Token = Token;\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), WPS_OUI, 4);*/\n\tRTMPMoveMemory(Ptr, WPS_OUI, 4);\n\tWpsIeLen = 4;\n\t*pTotalFrameLen = 38;\n\tpDest = pFrame->Octet;\n\t/* attach config method . */\n\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_CONFIG_METHODS);\n\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0002);\n\t*((PUSHORT) (pDest + 4)) = cpu2be16(ConfigMethod);\t\t/* Label, Display, PBC */\n\tpDest += 6;\n\tWpsIeLen   += 6;\n\t*pTotalFrameLen += 6;\n\tpFrame->Length = (UCHAR)WpsIeLen;\n\n\t/* Insert P2P IE===> */\n\t*pDest = IE_VENDOR_SPECIFIC;\n\tpP2PIeLenDest = (pDest+1);\n\tRTMPMoveMemory(pDest+2, P2POUIBYTE, 4);\n\tWpsIeLen = 4;\n\tpDest += 6;\n\t*pTotalFrameLen += 6;\n\n\t/* attach capability\t */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CAP,  pP2PCtrl->P2pCapability, pDest);\n\tpDest += Length;\n\tWpsIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 13. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_INFO,  pP2PCtrl->CurrentAddress, pDest);\n\tpDest += Length;\n\tWpsIeLen += Length;\n\t*pP2PIeLenDest = (UCHAR)WpsIeLen;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID = 15 */\n\tindex = P2pGroupTabSearch(pAd, Addr1);\n\tif (index != P2P_NOT_FOUND)\n\t{\n\t\tUCHAR tmpGroupID[40]; // 2 (Length) + 6 (MAC Address ) + 32 (SSID)\t\n\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P - P2PMakeProvisionReq   MyRule=%s, PeerRule=%d \\n\", decodeMyRule(pP2PCtrl->Rule), pP2pEntry->Rule));\n\t\tif (pP2pEntry->Rule == P2P_IS_GO) // peer is GO\n\t\t{\n            tmpGroupID[0] = 6 + pP2pEntry->SsidLen;\n            tmpGroupID[1] = 0;\n\t\t\tRTMPMoveMemory(&tmpGroupID[2], pP2pEntry->addr, 6);\n            RTMPMoveMemory(&tmpGroupID[8], &pP2pEntry->Ssid[0], pP2pEntry->SsidLen);\n\t\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_ID, &tmpGroupID, pDest);\n\t\t}else if (P2P_GO_ON(pAd)) //I'm GO\n\t\t{\n\t\t\ttmpGroupID[0] = 6 + pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen;\n\t\t\ttmpGroupID[1] = 0;\n\t\t\tRTMPMoveMemory(&tmpGroupID[2], pP2PCtrl->CurrentAddress, 6);\n\t\t\tRTMPMoveMemory(&tmpGroupID[8], &pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen);\n\t\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_ID, &tmpGroupID, pDest);\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLength =0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tLength =0;\t\n\t}\n\tpDest += Length;\n\tWpsIeLen += Length;\n\t*pP2PIeLenDest = (UCHAR)WpsIeLen;\n\t*pTotalFrameLen += Length;\n\t\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &Length);\n\t\tpDest += Length;\n\t\t*pTotalFrameLen   += Length;\n\t}\n#endif /* WFD_SUPPORT */\n\n\n\t\n\tpP2PCtrl->bP2pReSendTimerRunning = TRUE;\n\tRTMPSetTimer(&pP2PCtrl->P2pReSendTimer, P2P_TRANSMIT_TIMER);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, *pTotalFrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n}\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make Invitiation Response Action Frame Packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PSendProvisionRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT \t\tConfigMethod,\n\tIN UCHAR \t\t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame;\n\tUCHAR\tWpsIeLen = 0;\n\tPUCHAR\t\t\tpDest;\n\t//ULONG\tLength;\n\tPUCHAR        \tpOutBuffer = NULL;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR Ptr = NULL;\n\n\t*pTotalFrameLen = 0;\n\t/* allocate and send out ProbeRsp frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2PMakeProvisionRsp  . TO %02x:%02x:%02x:%02x:%02x:%02x.  ConfigMethod = %x(%s) \\n\", PRINT_MAC(Addr1), ConfigMethod, decodeConfigMethod(ConfigMethod)));\n\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPtr = (PUCHAR) pFrame;\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Addr1);\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4); */\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = P2P_PROVISION_RSP;\n\tpFrame->Token = Token;\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), WPS_OUI, 4); */\n\tRTMPMoveMemory(Ptr, WPS_OUI, 4);\n\tWpsIeLen = 4;\n\t*pTotalFrameLen = 38;\n\tpDest = pFrame->Octet;\n\tif (ConfigMethod > 0)\n\t{\n\t\t/* attach wsc version */\n\t\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_VERSION);\n\t\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0001);\n\t\t*(pDest + 4) = WSC_VERSION;\t/* TODO: WPS2.0 ?? */\n\t\tpDest += 5;\n\t\tWpsIeLen   += 5;\n\t\t*pTotalFrameLen += 5;\n\t\t\n\t\t/* attach config method . */\n\t\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_CONFIG_METHODS);\n\t\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0002);\n\t\t*((PUSHORT) (pDest + 4)) = cpu2be16(ConfigMethod);\t\t/* Label, Display, PBC */\n\t\tpDest += 6;\n\t\tWpsIeLen   += 6;\n\t\t*pTotalFrameLen += 6;\n\t}\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeLen = 0, WfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &WfdIeLen);\n\t\tpDest += WfdIeLen;\n\t\t*pTotalFrameLen   += WfdIeLen;\n\t}\n#endif /* WFD_SUPPORT */\n\n\tpFrame->Length = WpsIeLen;\n\tpP2PCtrl->bP2pReSendTimerRunning = TRUE;\n\tRTMPSetTimer(&pP2PCtrl->P2pReSendTimer, /*P2P_TRANSMIT_TIMER*/ 1000);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, *pTotalFrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine prepares Go Negociation Confirm packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeGoNegoConfirm(\n\tIN PRTMP_ADAPTER pAd,\n \tIN PUCHAR\t\tAddr1,\n\tIN UCHAR\t\t\tToken,\n\tIN PUCHAR\t\tpOutBuffer,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\t/*PUCHAR\t\t\tpDest; */\n\t/*ULONG\tLength; */\n\tPUCHAR Ptr = (PUCHAR) pFrame;\n\n\tActHeaderInit(pAd, (PHEADER_802_11)pOutBuffer, Addr1, pP2PCtrl->CurrentAddress, pP2PCtrl->PortCfg.Bssid);\n\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4); */\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = GO_NEGOCIATION_CONFIRM;\n\tpFrame->Token = Token;\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->Octet), P2POUIBYTE, 4); */\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\n\t*pTotalFrameLen = 38;\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make Go Negociation Response packet .\n\t\t\n\tParameters:\n\t\tTempIntent is directly from Go Req. Still need to parse this.\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeGoNegoRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tAddr1,\n\tIN USHORT\t\t\tSentDpid,\n\tIN UCHAR\t\t\tToken,\n\tIN UCHAR\t\t\tTempIntent,\n\tIN UCHAR\t\t\tChannel,\n\tIN UCHAR\t\t\tStatus,\n\tIN PUCHAR\t\tpOutBuffer,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPUCHAR\t\t\tpDest;\n\tULONG\tLength;\n\t/*UCHAR\tP2PCap[2]; */\n\tULONG\tP2pIeLen = 0;\n\tUCHAR\tRealIntent;\n\tUCHAR\t\t\tWscIEFixed[] = {0xdd, 0x0f, 0x00, 0x50, 0xf2, 0x04};\t/* length will modify later */\n\tPUCHAR Ptr = (PUCHAR) pFrame;\n\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Addr1);\n\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* pointer to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr +=4;\n\t/* OUISubtype */\n\tpFrame->Subtype = GO_NEGOCIATION_RSP;\n\tpFrame->Token = Token;\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->Octet), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tP2pIeLen = 4;\n\t*pTotalFrameLen = sizeof(P2P_PUBLIC_FRAME) - 1;\n\tpDest = pFrame->Octet;\n\t\n\t/* Start attach subelement. */\n\t/* attach subelementID= 0. */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: P2P - Status %d \\n\", __FUNCTION__, Status));\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_STATUS, &Status, pDest);\n\tpDest += Length;\n \tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 2. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CAP,  pP2PCtrl->P2pCapability, pDest);\n\tpDest += Length;\n \tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t\n\t/* attach subelementID= 4. */\n\tRealIntent = TempIntent>>1;\n\tRealIntent = (pP2PCtrl->GoIntentIdx << 1) + ((TempIntent & 0x1) == 1 ? 0 : 1);\n\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OWNER_INTENT, &RealIntent, pDest);\n\tpDest += Length;\n \tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 4. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CONFIG_TIMEOUT, &pP2PCtrl->ConfigTimeout[0], pDest);\n\tpDest += Length;\n \tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 17. */\n\tif (INFRA_ON(pAd))\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pAd->CommonCfg.Channel, pDest);\n\telse\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pP2PCtrl->GroupChannel, pDest);\n\tpDest += Length;\n \tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach subelementID= 9. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_INTERFACE_ADDR, pP2PCtrl->CurrentAddress, pDest);\n\tpDest += Length;\n \tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach channel List= 11. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CHANNEL_LIST, &pP2PCtrl->GroupChannel, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach subelementID= 13. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_INFO, pP2PCtrl->CurrentAddress, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\n\t/*  attach subelementID= 15. */\n\tif (pP2PCtrl->P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO)\n\t{\n\t\tUCHAR tmpGroupID[40]; // 2 (Length) + 6 (MAC Address ) + 32 (SSID)\n\t\ttmpGroupID[0] = 6 + pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen;\n\t\ttmpGroupID[1] = 0;\n\t\tRTMPMoveMemory(&tmpGroupID[2], pP2PCtrl->CurrentAddress, 6);\n\t\tRTMPMoveMemory(&tmpGroupID[8], &pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen);\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_ID, &tmpGroupID, pDest);\n\t\tpDest += Length;\n\t\tP2pIeLen += Length;\n\t\t*pTotalFrameLen += Length;\n\t}\n\n\tpFrame->Length = (UCHAR)P2pIeLen;\n\t/* 0. WSC fixed IE */\n\tRTMPMoveMemory(pDest, &WscIEFixed[0], 6);\n\tpDest += 6;\n\t*pTotalFrameLen += 6;\n\t/* 1. Version */\n\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_VERSION);\n\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0001);\n\t*(pDest + 4) = WSC_VERSION;\n\tpDest += 5;\n\t*pTotalFrameLen   += 5;\n\t/* 9. Device password ID. According to Table.1 in P2P Spec. */\n\n\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_DEVICE_PWD_ID);\n\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0002);\n\t*((PUSHORT) (pDest + 4)) = cpu2be16(SentDpid);\n\tpDest += 6;\n\t*pTotalFrameLen   += 6;\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &Length);\n\t\tpDest += Length;\n\t\t*pTotalFrameLen += Length;\n\t}\n#endif /* WFD_SUPPORT */\n\n\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make Go Negociation Request packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeGoNegoReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t\tindex,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tpOutBuffer,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPUCHAR\t\t\tpDest;\n\tULONG\tLength;\n\tULONG\tP2pIeLen = 0;\n\tUCHAR\tFilledIntent;\n\tUCHAR\tRandomB;\n\tUCHAR\t\t\tWscIEFixed[] = {0xdd, 0x0f, 0x00, 0x50, 0xf2, 0x04};\t/* length will modify later */\n\tPUCHAR\t\tpWscIeLen;\n\t/*UCHAR\t\tChannelList; */\n\tUSHORT\t\tSentDpid;\n\tPUCHAR Ptr = (PUCHAR) pFrame;\n\n\tif (index >= MAX_P2P_GROUP_SIZE)\n\t{\n\t\treturn;\n\t}\n\t*pTotalFrameLen = 0;\n\tRTMPMoveMemory(pP2PCtrl->PortCfg.Bssid, Addr1, 6);\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Addr1);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\" %s - P2PMakeGoNegoReq  TO %02x:%02x:%02x:%02x:%02x:%02x. \\n\", __FUNCTION__, Addr1[0], Addr1[1], Addr1[2],Addr1[3],Addr1[4],Addr1[5]));\n\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = GO_NEGOCIATION_REQ;\n\tpFrame->Token = 1;\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tP2pIeLen = 4;\n\t*pTotalFrameLen = 38;\n\tpDest = pFrame->Octet;\n\t\n\t/* Start attach subelement. */\n\t/* attach subelementID= 2. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CAP, pP2PCtrl->P2pCapability, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach subelementID= 4. */\n\tFilledIntent = pP2PCtrl->GoIntentIdx<<1;\n\tRandomB = RandomByte(pAd);\n\t/* If Intent is not 15, set tie breaker bit to 1 randomly. */\n\tif (((RandomB %2) == 0) && (pP2PCtrl->GoIntentIdx != 15))\n\t\tFilledIntent |= 1;\n\t\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OWNER_INTENT, &FilledIntent, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach subelementID= 7. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CONFIG_TIMEOUT, &pP2PCtrl->ConfigTimeout[0], pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_LISTEN_CHANNEL, &pP2PCtrl->ListenChannel, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t\n\t/*  attach subelementID= 9. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_INTERFACE_ADDR, pP2PCtrl->CurrentAddress, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach channel List= 11. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CHANNEL_LIST, &pP2PCtrl->GroupChannel, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/*  attach subelementID= 13. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_INFO, pP2PCtrl->CurrentAddress, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\n\t/*  attach subelementID= 17. */\n\tif (INFRA_ON(pAd))\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pAd->CommonCfg.Channel, pDest);\n\telse\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pP2PCtrl->GroupChannel, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\n\tif (IS_P2P_SUPPORT_EXT_LISTEN(pAd))\n\t{\n\t\t/*  attach subelementID= 17. */\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_EXT_LISTEN_TIMING, NULL, pDest);\n\t\tpDest += Length;\n\t\tP2pIeLen += Length;\n\t\t*pTotalFrameLen += Length;\n\t}\n\n\tpFrame->Length = (UCHAR)P2pIeLen;\n\n\t/* 0. WSC fixed IE */\n\n\tRTMPMoveMemory(pDest, &WscIEFixed[0], 6);\n\tpWscIeLen = pDest + 1;\n\tpDest += 6;\n\t*pTotalFrameLen += 6;\n\t*pWscIeLen = 4;\n\t/* 1. Version */\n\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_VERSION);\n\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0001);\n\t*(pDest + 4) = WSC_VERSION;\n\tpDest += 5;\n\t*pTotalFrameLen   += 5;\n\t*pWscIeLen += 5;\n\t\t/* 9. Device password ID */\n\t*((PUSHORT) pDest) = cpu2be16(WSC_ID_DEVICE_PWD_ID);\n\t*((PUSHORT) (pDest + 2)) = cpu2be16(0x0002);\n\tSentDpid = pP2PCtrl->Dpid;\n/* The Dpid have been updated when receiving provision request or response frame */\n\t*((PUSHORT) (pDest + 4)) = cpu2be16(SentDpid);\n\tpDest += 6;\n\t*pTotalFrameLen   += 6;\n\t*pWscIeLen += 6;\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &Length);\n\t\tpDest += Length;\n\t\t*pTotalFrameLen   += Length;\n\t}\n#endif /* WFD_SUPPORT */\n\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make Invitiation Request Action Frame Packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeInviteReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR \t\tMyRule,\n\tIN UCHAR \t\tInviteFlag,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tBssid,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame;\n\tULONG\tP2pIeLen = 0;\n\tPUCHAR\t\t\tpDest;\n\tULONG\tLength;\n\tPUCHAR        \tpOutBuffer = NULL;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR Ptr = NULL;\n\n\t*pTotalFrameLen = 0;\n\t/* allocate and send out ProbeRsp frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPtr = (PUCHAR) pFrame;\n\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Bssid);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2PMakeInviteReq  TO %02x:%02x:%02x:%02x:%02x:%02x. \\n\", PRINT_MAC(Addr1)));\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = P2P_INVITE_REQ;\n\n\tpP2PCtrl->Token++;\n\tpFrame->Token = pP2PCtrl->Token;\n\t\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tP2pIeLen = 4;\n\t*pTotalFrameLen = 38;\n\tpDest = pFrame->Octet;\n\t/* attach subelementID= 5. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CONFIG_TIMEOUT, &pP2PCtrl->ConfigTimeout[0], pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 11. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_INVITE_FLAG, &InviteFlag, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 17. */\n\tif (MyRule == P2P_IS_GO)\n\t{\n\t\tif (INFRA_ON(pAd))\n\t\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pAd->CommonCfg.Channel, pDest);\n\t\telse\n\t\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pP2PCtrl->GroupOpChannel, pDest);\n\t\tpDest += Length;\n\t\tP2pIeLen += Length;\n\t\t*pTotalFrameLen += Length;\n\t}\n\t/* attach subelementID= 7. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_BSSID, &pP2PCtrl->CurrentAddress[0], pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 11. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CHANNEL_LIST, &pP2PCtrl->GroupOpChannel, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 11. */\n\t{\n\t\tUCHAR tmpGroupID[40]; // 2 (Length) + 6 (MAC Address ) + 32 (SSID)\n\t\ttmpGroupID[0] = 6 + pP2PCtrl->SSIDLen;\n\t\ttmpGroupID[1] = 0;\n\t\tRTMPMoveMemory(&tmpGroupID[2], pP2PCtrl->CurrentAddress, 6);\n\t\tRTMPMoveMemory(&tmpGroupID[8], &pP2PCtrl->SSID[0], pP2PCtrl->SSIDLen);\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_ID, &tmpGroupID, pDest);\n\t}\n\t\t\t\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 11. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_INFO, pP2PCtrl->CurrentAddress, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\n\n\tpFrame->Length = (UCHAR)P2pIeLen;\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &Length);\n\t\tpDest += Length;\n\t\t*pTotalFrameLen   += Length;\n\t}\n#endif /* WFD_SUPPORT */\n\n\t\n\tMiniportMMRequest(pAd, 0, pOutBuffer, *pTotalFrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThe routine make Invitiation Response Action Frame Packet .\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeInviteRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR \t\tMyRule,\n\tIN UCHAR \t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tBssid,\n\tIN PUCHAR\t\tOpChannel,\n\tIN PUCHAR\t\tStatus,\n\tOUT PULONG\t\tpTotalFrameLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPP2P_PUBLIC_FRAME\tpFrame;\n\tULONG\tP2pIeLen = 0;\n\tPUCHAR\t\t\tpDest;\n\tULONG\tLength;\n\tPUCHAR        \tpOutBuffer = NULL;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR Ptr = NULL;\n\n\t*pTotalFrameLen = 0;\n\t/* allocate and send out ProbeRsp frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tpFrame = (PP2P_PUBLIC_FRAME)pOutBuffer;\n\tPtr = (PUCHAR) pFrame;\n\tif (MyRule == P2P_IS_CLIENT)\n\t\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Addr1);\n\telse\n\t\tActHeaderInit(pAd, &pFrame->p80211Header, Addr1, pP2PCtrl->CurrentAddress, Bssid);\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - P2PMakeInviteRsp MyRule = %s. TO %02x:%02x:%02x:%02x:%02x:%02x. \\n\", decodeMyRule(MyRule), PRINT_MAC(Addr1)));\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P - Bssid %02x:%02x:%02x:%02x:%02x:%02x. \\n\", PRINT_MAC(Bssid)));\n\tpFrame->Category = CATEGORY_PUBLIC;\n\tpFrame->Action = ACTION_WIFI_DIRECT;\n\t/* point to OUI */\n\tPtr += (sizeof(HEADER_802_11) + 2);\n\t/*RTMPMoveMemory((pFrame->OUI), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tPtr += 4;\n\t/* OUISubtype */\n\tpFrame->Subtype = P2P_INVITE_RSP;\n\tpFrame->Token = Token;\n\tpFrame->ElementID = IE_VENDOR_SPECIFIC;\n\t/* point to OUI2 */\n\tPtr += 4;\n\t/*RTMPMoveMemory((pFrame->OUI2), P2POUIBYTE, 4);*/\n\tRTMPMoveMemory(Ptr, P2POUIBYTE, 4);\n\tP2pIeLen = 4;\n\t*pTotalFrameLen = 38;\n\tpDest = pFrame->Octet;\n\t/* attach subelementID= 0. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_STATUS, Status, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 5. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CONFIG_TIMEOUT, &pP2PCtrl->ConfigTimeout[0], pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t*pTotalFrameLen += Length;\n\t/* attach subelementID= 17. */\n\tif ((MyRule == P2P_IS_GO) && (*Status == P2PSTATUS_SUCCESS))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - OpChannel =  %d \\n\", pP2PCtrl->GroupChannel));\n\t\tif (INFRA_ON(pAd))\n\t\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, &pAd->CommonCfg.Channel, pDest);\n\t\telse\n\t\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, OpChannel, pDest);\n\t\tpDest += Length;\n\t\tP2pIeLen += Length;\n\t\t*pTotalFrameLen += Length;\n\t}\n\t/* attach subelementID= 7. */\n\tif ((MyRule == P2P_IS_GO) && (*Status == P2PSTATUS_SUCCESS))\n\t{\n\t\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_GROUP_BSSID, Bssid, pDest);\n\t\tpDest += Length;\n\t\tP2pIeLen += Length;\n\t\t*pTotalFrameLen += Length;\n\t}\n\t/* attach subelementID= 7. */\n\tLength = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CHANNEL_LIST, OpChannel, pDest);\n\tpDest += Length;\n\tP2pIeLen += Length;\n\t/* attach subelementID= 17. */\n\t*pTotalFrameLen += Length;\n\tpFrame->Length = (UCHAR)P2pIeLen;\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pDest, &Length);\n\t\tpDest += Length;\n\t\t*pTotalFrameLen   += Length;\n\t}\n#endif /* WFD_SUPPORT */\n\n\n\tMiniportMMRequest(pAd, 0, pOutBuffer, *pTotalFrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n}\n\n\t\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSanity check of the Probe Request frame when operating as a P2P Device. \n\t\tCan be called from both as AP's state machine or as STA( that is doing P2P search)'s state machine\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN PeerP2pProbeReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement, \n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT ULONG *WpsIELen, \n\tOUT PUCHAR pWpsIE) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPFRAME_802_11\t\tpFrame;\n\tPEID_STRUCT \t\t\tpEid;\n\tULONG\t\t\t\tLength = 0;\n\tBOOLEAN \t\t\tbrc = FALSE;\n\tUCHAR\t\t\tRateLen;\n#ifdef WFD_SUPPORT\n\t*pWfdSubelementLen = 0;\n#endif /* WFD_SUPPORT */\n\t\t\n\tpFrame = (PFRAME_802_11)Msg;\n\tLength += LENGTH_802_11;\n\t\n\t*P2PSubelementLen = 0;\n\t*WpsIELen = 0;\n\t*pSsidLen = 0;\n\t*Peerip = 0;\n\tRateLen = 0;\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\n\tpEid = (PEID_STRUCT) pFrame->Octet;\n\n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= MsgLen)\t  \n\t{\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_EXT_SUPP_RATES:\n\t\t\t\t/* concatenate all extended rates to Rates[] and RateLen */\n\t\t\t\tRateLen = (RateLen) + pEid->Len;\n\t\t\t\tbreak;\n\t\t\tcase IE_SUPP_RATES:\n\t\t\t\tRateLen = (RateLen) + pEid->Len;\n\t\t\t\tbreak;\n\t\t\tcase IE_SSID:\n\t\t\t\tif(pEid->Len <= MAX_LEN_OF_SSID)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(Ssid, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pSsidLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t/* Check the OUI version, filter out non-standard usage */\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPS_OUI, 4) && (pEid->Len > 4))\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(pWpsIE, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t*WpsIELen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, P2POUIBYTE, 4) && (pEid->Len > 4))\n\t\t\t\t{\n\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t*P2PSubelementLen = pEid->Len+2;\n\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+2)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 111 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__ ,((*P2PSubelementLen) + (pEid->Len+2))));\n\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\" !FIND!!!!!!===>P2P - PeerP2pProbeReq P2P IE Len = %ld.   %s\\n\", *P2PSubelementLen, decodeP2PState(pP2PCtrl->P2PConnectState)));\n\t\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\t\telse if ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\t\tNdisEqualMemory(pEid->Octet, WIFIDISPLAY_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\t//hex_dump(\"WFD_IE\", &pEid->Eid, pEid->Len +2);\n\t\t\t\t\tRTMPMoveMemory(pWfdSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t*pWfdSubelementLen = pEid->Len + 2;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" !FIND!!!!!!===>WFD - PeerP2pProbeReq WFD IE Len = %ld.\\n\", *pWfdSubelementLen));\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\n#ifdef WFD_SUPPORT\n#endif /* WFD_SUPPORT */\n\t\t\t\tbreak;\n\t\t}\n\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len] */\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t\n\t}\n\n\t/* Doesn't parse probe request that only support 11b. So return FALSE. */\n\tif (RateLen <= 4)\n\t{\n\t\tbrc = FALSE;\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"Ignore Probe Request that is 11b-only.\\n\"));\n\t}\n\t/* Check P2P's Probe Response validatity. */\n\tif (*P2PSubelementLen <= 4)\n\t{\n\t\tbrc = FALSE;\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"Ignore Probe Request that doesn't have P2P IE.\\n\"));\n\t}\n\n\treturn brc;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSanity check of the Probe Response frame when operating as a P2P Device. \n\t\tOnly called from STA's state machine that is in scanning.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN PeerP2pBeaconSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement) \n{\n\tPFRAME_802_11\t\tpFrame;\n\tPEID_STRUCT         pEid;\n\tULONG\t\t\t\tLength = 0;\n\tBOOLEAN\t\t\t\tbrc = FALSE;\n\tPUCHAR\t\t\t\tPtr;\n\tBOOLEAN\t\t\t\tbFirstP2pOUI = TRUE;\n\t\n\tpFrame = (PFRAME_802_11)Msg;\n\tLength += LENGTH_802_11;\n\n\t*P2PSubelementLen = 0;\n\t*pSsidLen = 0;\n\t*Peerip = 0;\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\n\tPtr = pFrame->Octet;\n\n\t/* get timestamp from payload and advance the pointer */\n\tPtr += TIMESTAMP_LEN;\n\tLength += TIMESTAMP_LEN;\n\n\t/* get beacon interval from payload and advance the pointer */\n\tPtr += 2;\n\tLength += 2;\n\n\t/* get capability info from payload and advance the pointer */\n\tPtr += 2;\n\tLength += 2;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= MsgLen)    \n\t{\n\t\tswitch(pEid->Eid)\n\t\t{\t\t\t\n\t\t\tcase IE_SSID:\n\t\t\t\tif(pEid->Len <= MAX_LEN_OF_SSID)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(Ssid, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pSsidLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t/* Check the OUI version, filter out non-standard usage */\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPS_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t\t*P2PSubelementLen = pEid->Len +2;\n\t\t\t\t\t}\n\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+2)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 111 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__, ((*P2PSubelementLen) + (pEid->Len+2))));\n\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (NdisEqualMemory(pEid->Octet, P2POUIBYTE, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tIf this is the first P2P OUI. Then also append P2P OUI. \n\t\t\t\t\t\tBeacon 's P2P attribute doesn't exceed 256 bytes. So not use acumulcated form.\n\t\t\t\t\t */\n\t\t\t\t\tif (bFirstP2pOUI == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t\t\t*P2PSubelementLen = (pEid->Len +2);\n\t\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+2)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 222 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__, ((*P2PSubelementLen) + (pEid->Len+2))));\n\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbFirstP2pOUI = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tIf this is not the first P2P OUI. Then don't append P2P OUI.\n\t\t\t\t\t\t\tbecause our parse function doesn't need so many P2P OUI.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ((*P2PSubelementLen > 0) && (pEid->Len > 4))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+2)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 333 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__, ((*P2PSubelementLen) + (pEid->Len+2))));\n\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len] */\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t\n\t}\n\treturn brc;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSanity check of the Probe Response frame when operating as a P2P Device. \n\t\tOnly called from STA's state machine that is in scanning.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\n#ifndef WFD_SUPPORT\nBOOLEAN PeerP2pProbeRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT UCHAR *pChannel,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement) \n#else\nBOOLEAN PeerP2pProbeRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT UCHAR *pChannel,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement,\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement)\n#endif /* WFD_SUPPORT */\n{\n\tPFRAME_802_11\t\tpFrame;\n\tPEID_STRUCT         pEid;\n\tULONG\t\t\t\tLength = 0;\n\tBOOLEAN\t\t\t\tbrc = FALSE;\n\tPUCHAR\t\t\t\tPtr;\n\tBOOLEAN\t\t\t\tbFirstP2pOUI = TRUE;\n\tBOOLEAN\t\t\t\tbLastIsP2pOUI = FALSE;\n\tPUCHAR\t\t\t\tpP2PIeConLen = NULL;\t/* pointer to 2 bytes to indicate Contenated length of all P2P IE */\n\tULONG\t\t\t\tP2PIeConLen = 0; \t/*  Contenated length of all P2P IE */\n\tULONG\t\t\tidx;\n\n\tpFrame = (PFRAME_802_11)Msg;\n\tLength = LENGTH_802_11;\n\n\t*P2PSubelementLen = 0;\n#ifdef WFD_SUPPORT\n\t*pWfdSubelementLen = 0;\n#endif /* WFD_SUPPORT */\n\t*pSsidLen = 0;\n\t*Peerip = 0;\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\t\n\tPtr = pFrame->Octet;\n\n\t/* get timestamp from payload and advance the pointer */\n\tPtr += TIMESTAMP_LEN;\n\tLength += TIMESTAMP_LEN;\n\n\t/* get beacon interval from payload and advance the pointer */\n\tPtr += 2;\n\tLength += 2;\n\n\t/* get capability info from payload and advance the pointer */\n\tPtr += 2;\n\tLength += 2;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= MsgLen)    \n\t{\n\t\tswitch(pEid->Eid)\n\t\t{\t\t\t\n\t\t\tcase IE_SSID:\n\t\t\t\tbLastIsP2pOUI = FALSE;\n\t\t\t\tif(pEid->Len <= MAX_LEN_OF_SSID)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(Ssid, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pSsidLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IE_DS_PARM:\n\t\t\t\tif(pEid->Len == 1)\n\t\t\t\t*pChannel = *pEid->Octet;\n\t\t\t\tbreak;\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\tbLastIsP2pOUI = FALSE;\n\t\t\t\t/* Check the OUI version, filter out non-standard usage */\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPS_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t\t*P2PSubelementLen = pEid->Len +2;\n\t\t\t\t\t}\n\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+2)) <= MAX_VIE_LEN) //added boundary checking\n\t\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t}\n\t\t\t\t\t\telse // reach the boundary\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 111 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__, ((*P2PSubelementLen) + (pEid->Len+2))));\n\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (NdisEqualMemory(pEid->Octet, P2POUIBYTE, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\tbLastIsP2pOUI = TRUE;\n\t\t\t\t\t/* If this is the first P2P OUI. Then also append P2P OUI. */\n\t\t\t\t\tif (bFirstP2pOUI == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Althought this is first P2P IE. */\n\t\t\t\t\t\t/* still need to Check *P2PSubelementLen, because *P2PSubelementLen also includes WPS IE. */\n\t\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, 2);\n\t\t\t\t\t\t\t*(pP2pSubelement + 2) = 0;\n\t\t\t\t\t\t\t/* Make one more byte for P2P accumulated length. */\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + 3, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t\t\tpP2PIeConLen = pP2pSubelement + *P2PSubelementLen + 1;\n\t\t\t\t\t\t\t*P2PSubelementLen = (pEid->Len + 3);\n\t\t\t\t\t\t\tP2PIeConLen = pEid->Len;\t/* Real P2P IE length is Len. */\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC -1-1 P2PIeConLen  = %ld\\n\", P2PIeConLen));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+3)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, 2);\n\t\t\t\t\t\t\t*(pP2pSubelement + *P2PSubelementLen + 2) = 0;\n\t\t\t\t\t\t\t/* Make one more byte for P2P accumulated length. */\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen + 3, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t\t\tpP2PIeConLen = pP2pSubelement + *P2PSubelementLen + 1;\n\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+3);\n\t\t\t\t\t\t\t/* bFirstP2pOUI is TURE. So use =   */\n\t\t\t\t\t\t\tP2PIeConLen = pEid->Len;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\" -1-2 P2PIeConLen  = %ld\\n\", P2PIeConLen));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 222 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__, ((*P2PSubelementLen) + (pEid->Len+3))));\n\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbFirstP2pOUI = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (bLastIsP2pOUI == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* If this is not the first P2P OUI. Then don't append P2P OUI. */\n\t\t\t\t\t\t/* because our parse function doesn't need so many P2P OUI. */\n\t\t\t\t\t\tif ((*P2PSubelementLen > 0) && (pEid->Len > 4))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len-4)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Octet[4], pEid->Len-4);\n\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len-4);\n\t\t\t\t\t\t\tP2PIeConLen += (pEid->Len - 4);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 333 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__, ((*P2PSubelementLen) + (pEid->Len-4))));\n\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\t\telse if ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\t\tNdisEqualMemory(pEid->Octet, WIFIDISPLAY_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\t//hex_dump(\"WFD_IE\", &pEid->Eid, pEid->Len +2);\n\t\t\t\t\tRTMPMoveMemory(pWfdSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t*pWfdSubelementLen = pEid->Len + 2;\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\t\tbreak;\n\t\t\tdefault : \n\t\t\t\tbLastIsP2pOUI = FALSE;\n\t\t\t\tbreak;\n\n\t\t}\n\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len] */\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t\n\t}\n\n\tif ((P2PIeConLen != 0) && (pP2PIeConLen != NULL))\n\t{\n\t\t*pP2PIeConLen = (UCHAR)(P2PIeConLen%256);\n\t\t*(pP2PIeConLen+1) = (UCHAR)(P2PIeConLen/256);\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"  - 3 P2PIeConLen  = %ld. /256 = %ld. *P2PSubelementLen = %ld \\n\", P2PIeConLen, (P2PIeConLen/256), *P2PSubelementLen));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"  -  %x %x \\n\", *pP2PIeConLen,  *(pP2PIeConLen+1) ));\n\t\tfor (idx = 0; idx < (*P2PSubelementLen);)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO, (\"%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-\", \n\t\t\t\t*(pP2pSubelement+idx), *(pP2pSubelement+idx+1), *(pP2pSubelement+idx+2), *(pP2pSubelement+idx+3)\n\t\t\t\t,*(pP2pSubelement+idx+4) ,*(pP2pSubelement+idx+5) ,*(pP2pSubelement+idx+6),*(pP2pSubelement+idx+7)\n\t\t\t\t,*(pP2pSubelement+idx+8),*(pP2pSubelement+idx+9),*(pP2pSubelement+idx+10),*(pP2pSubelement+idx+11)));\n\t\t\t\n\t\t\t idx = idx + 12;\n\t\t}\n\t\t\n\t}\n\treturn brc;\n}\n\nVOID P2pPeerBeaconAtJoinAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN PUCHAR\t\tBssid) \n{\n\t/*PRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;*/\n\tUCHAR\t\tP2pManageability = 0xff;\n\tUCHAR\t\tNumOfOtherP2pAttri = 1;\n\tUCHAR\t\tChannel = 1;\n\tUCHAR\t\tTotalNumOfP2pAttribute = 1;\n\n\tif (Elem->MsgLen <= (LENGTH_802_11 + 12))\n\t\treturn;\n\t\n\tP2pParseManageSubElmt(pAd, \n\t\t\t\t\t\t&Elem->Msg[LENGTH_802_11 + 12], \n\t\t\t\t\t\t(Elem->MsgLen - LENGTH_802_11 - 12), \n\t\t&Channel,\n\t\t&NumOfOtherP2pAttri,\n\t\t&TotalNumOfP2pAttribute,\n\t\t\t\t\t\t&P2pManageability,\n\t\t\t\t\t\tNULL);\n\t\n\tDBGPRINT(RT_DEBUG_INFO, (\"P2pParseManageSubElmt  TotalNumOfP2pAttribute = %d.  \\n\", TotalNumOfP2pAttribute));\n\t/* If this AP carries Managed Attribute. Update to our ManageAPBSsid */\n\tif (P2pManageability != 0xff)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC - Receive desired BEACON with valid P2pManageability= %x\\n\", P2pManageability));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC -NumOfOtherP2pAttri %d . Channel = %d. \\n\", NumOfOtherP2pAttri, Channel));\n\t\tRTMPMoveMemory(pAd->P2pCfg.P2pManagedParm.ManageAPBSsid, Bssid, MAC_ADDR_LEN);\n\n\t\t/* Reset Minor Reason when connecting to Managed AP. */\n\t\tpAd->P2pCfg.P2pManagedParm.APP2pMinorReason = 0;\n\t\tpAd->P2pCfg.P2pManagedParm.APUsageChannel = Channel ;\n\t\t/* If this is the latest managed AP that I connected to. but this AP turn off the managed function. */\n\t/* I should clear my record. */\n\t\n\t/* If this is a manged AP. update to the ManageAPBSsid. */\n\t\tif ((P2P_TEST_BIT(P2pManageability, P2PMANAGED_ENABLE_BIT)) && (NumOfOtherP2pAttri == 0))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC -I am connecting to a Managed AP. Save this Bssid. %x %x %x \\n\", Bssid[3],Bssid[4],Bssid[5]));\n\t\t}\n\t\n\t\tpAd->P2pCfg.P2pManagedParm.APP2pManageability = P2pManageability;\n\t}\n\tpAd->P2pCfg.P2pManagedParm.TotalNumOfP2pAttribute = TotalNumOfP2pAttribute;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC - BEACON P2pManageability= %x. TotalNumOfP2pAttribute = %d. OtherP2pAttri = %d\\n\", P2pManageability, TotalNumOfP2pAttribute, NumOfOtherP2pAttri));\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tProcessing the Probe Response frame when operating as a P2P Device. \n\t\tOnly called from STA's state machine that is in scanning.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID PeerP2pBeaconProbeRspAtScan(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n/*\tIN USHORT CapabilityInfo, */\n/*\tIN UCHAR\tWorkingChannel) */\n{\n\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = NULL;\n\t\tBOOLEAN \tbBeacon = FALSE;\n\t\tBOOLEAN \tbresult;\n\t\tBOOLEAN\t\tbChangeState = FALSE;\n\t\tULONG\tP2PSubelementLen;\n\t\tPUCHAR\tP2pSubelement = NULL;\n\t\tUCHAR\tindex;/*, perstindex; */\n\t\tUCHAR\tAddr2[6], SsidLen;\n\t\tUCHAR\tSsid[32];\n\t\tULONG\t\tPeerip;\n\t\tUCHAR\t\tDevType[8], DevAddr[6], Channel = 0, OpChannel = 0, Intent;\n\t\tUCHAR\t\tGroupCap, DeviceCap, StatusCode;\n\t\tUSHORT\t\tDpid;\n\t\tUCHAR\tDsChannel = 0;\t\t\n\t\tPHEADER_802_11\tpHeader;\n\t\tUSHORT\t\tConfigMethod = 0xffff;\n\t\tUCHAR\t\tDeviceNameLen = 0, DeviceName[32];\n\t\tUCHAR\t\tSavedP2PTableNum;\n\t\tP2P_CMD_STRUCT\tP2pCmd;\n\t\tBOOLEAN bSendP2pEvent = FALSE;\n#ifdef WFD_SUPPORT\n\t\tULONG\tWfdSubelementLen = 0;\n\t\tPUCHAR\tWfdSubelement = NULL;\n#endif /* WFD_SUPPORT */\n\t\t\n\t\t/* If there is already BSS or IBSS and only one port, no need to parse Probe response for P2P discovery feature */\n\t\t/* INFRA on includes case that I am P2P client. in this case, doesn't need to parse P2P IE in Probe Response either?? */\n\t/*\tif ((INFRA_ON(pAd) || ADHOC_ON(pAd)) && (pAd->OpMode == OPMODE_STA))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"1 PeerP2pBeaconProbeRspAtScan:: %s \\n\", decodeP2PState(pP2PCtrl->P2PDiscoProvState)));\n\t\t\treturn;\n\t\t}\n\t*/\n\n\t\t/* Init P2pSubelement */\n\t\tos_alloc_mem(pAd, &P2pSubelement, MAX_VIE_LEN);\n\n\t\tif (P2pSubelement == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\tgoto CleanUp;\n\t\t}\n\t\tRTMPZeroMemory(&DeviceName[0], 32);\n\n#ifdef WFD_SUPPORT\n\t\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\n\t\tif (WfdSubelement == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\tgoto CleanUp;\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\t/* P2P Device's probe response doesn't set ess bit on.  */\n\t\tpHeader = (PHEADER_802_11)&Elem->Msg[0];\n\t\t/* In P2P spec, the P2P IE in probe response and beacon are different.  */\n\t\t/* So set a boolean to check if this is a beacon frame. */\n\t\tif (pHeader->FC.SubType == SUBTYPE_BEACON)\n\t\t\tbBeacon = TRUE;\n\n\t\t/* Intel put P2P IE into two separate IE */\n\t\t/* Sanity check */\n#ifndef WFD_SUPPORT\n\t\tif (PeerP2pProbeRspSanity(pAd, \n\t\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\t\tAddr2, \n\t\t\t\t\t\t\t\t\tSsid, \n\t\t\t\t\t\t\t\t\t&SsidLen, \n\t\t\t\t\t\t\t\t\t&Peerip,\n\t\t\t\t\t\t\t\t\t&DsChannel,\n\t\t\t\t\t\t\t\t\t&P2PSubelementLen,\n\t\t\t\t\t\t\t\t\tP2pSubelement))\n#else\n\t\tif (PeerP2pProbeRspSanity(pAd, \n\t\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\t\tAddr2, \n\t\t\t\t\t\t\t\t\tSsid, \n\t\t\t\t\t\t\t\t\t&SsidLen, \n\t\t\t\t\t\t\t\t\t&Peerip,\n\t\t\t\t\t\t\t\t\t&DsChannel,\n\t\t\t\t\t\t\t\t\t&P2PSubelementLen,\n\t\t\t\t\t\t\t\t\tP2pSubelement,\n\t\t\t\t\t\t\t\t\t&WfdSubelementLen,\n\t\t\t\t\t\t\t\t\tWfdSubelement))\n#endif /* WFD_SUPPORT */\n\t\t{\n\t\t\tCHAR Rssi;\n\t\t\t/* Check P2P's Probe Response validatity. */\n\t\t\tif (!(NdisEqualMemory(Ssid, &WILDP2PSSID[0], WILDP2PSSIDLEN)))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"PeerP2pBeaconProbeRspAtScan: Len = %ld.: \\n\", P2PSubelementLen));\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"= %02x:%02x:%02x:%02x:%02x:%02x\t\\n\",  PRINT_MAC(Addr2)));\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"= %c %c %c %c %c %c%c \\n\",  Ssid[0], Ssid[1],Ssid[2],Ssid[3],Ssid[4],Ssid[5],Ssid[6]));\n\t\t\t\tgoto CleanUp;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"!! %s = %02x:%02x:%02x:%02x:%02x:%02x!!\\n\",  __FUNCTION__, PRINT_MAC(Addr2)));\n\t\t\tRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n\t\t\t/* Step 1:\tParse P2P attribute */\n\t\t\t/* If this peer is provisioned, don't update Config */\n\t\t\tif (bBeacon == FALSE)\n\t\t\t{\n\t\t\t\tP2pParseSubElmt(pAd, (PVOID)P2pSubelement, P2PSubelementLen, \n\t\t\t\t\tbBeacon, &Dpid, &GroupCap, &DeviceCap, DeviceName, &DeviceNameLen, \n\t\t\t\t\tDevAddr, NULL, NULL, NULL, NULL, &ConfigMethod, NULL, DevType, \n\t\t\t\t\t&Channel, &OpChannel, NULL, &Intent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\t\t\t\tNULL, NULL,/*&WfdSubelementLen, WfdSubelement,*/\n#endif /* WFD_SUPPORT */\n\t\t\t\t\tNULL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tP2pParseSubElmt(pAd, (PVOID)P2pSubelement, P2PSubelementLen, \n\t\t\t\t\tbBeacon, &Dpid, &GroupCap, &DeviceCap, DeviceName, &DeviceNameLen, \n\t\t\t\t\tDevAddr, NULL, NULL, NULL, NULL, NULL, NULL, DevType, \n\t\t\t\t\t&Channel, &OpChannel, NULL, &Intent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\t\t\t\tNULL, NULL,/*&WfdSubelementLen, WfdSubelement,*/\n#endif /* WFD_SUPPORT */\n\t\t\t\t\t\tNULL);\n\t\t\t}\n\n\t\t\t/* Step 3:\t Insert. */\n\t\t\tSavedP2PTableNum = pAd->P2pTable.ClientNumber;\n\t\t\tindex = P2pGroupTabSearch(pAd, DevAddr);\n\t\t\tif (index == P2P_NOT_FOUND)\n\t\t\t{\n\t\t\t\t/* Because only Probe Response carrys group info,  */\n\t\t\t\t/* If we use Probe Response to add to my P2P table structure. If this is beacon  */\n\t\t\t\t/* and in social channels. return. */\n\t\t\t\tif (bBeacon == TRUE)\n\t\t\t\t\tgoto CleanUp;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2 New From Addr2 = %02x:%02x:%02x:%02x:%02x:%02x. bBeacon = %d . GroupCap = %x \\n\",\tPRINT_MAC(Addr2), bBeacon, GroupCap));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2 New From DevAddr = %02x:%02x:%02x:%02x:%02x:%02x. bBeacon = %d . GroupCap = %x \\n\",  PRINT_MAC(DevAddr), bBeacon, GroupCap));\n\t\t\t\tif ((bBeacon == TRUE) || ((GroupCap&GRPCAP_OWNER) == GRPCAP_OWNER))\n\t\t\t\t{\n\t\t\t\t\tindex = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_DISCOVERY_GO, Ssid, SsidLen, DeviceCap, GroupCap);\n\n\t\t\t\t}\n\t\t\t\t/* P2P client can't send probe response. So the probe response must be from P2P device. */\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tindex = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_DISCOVERY, Ssid, SsidLen, DeviceCap, GroupCap);\n\t\t\t\t}\n\t\t\t\tbSendP2pEvent = TRUE;\n\t\t\t}\n\n\t\t\t/* No matter the index is from existing table, or newly added, always update Ssid Information If this peer is not connected. */\n\t\t\t/* Step 4:\t Update table. */\n\t\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t\t{\n\t\t\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s:: got ProbeResp.index = %d. statue = %s\\n\", __FUNCTION__, index, decodeP2PClientState(pAd->P2pTable.Client[index].P2pClientState)));\n\t\t\t\tpP2pEntry->DevCapability = DeviceCap;\n\t\t\t\tpP2pEntry->GroupCapability = GroupCap;\n\t\t\t\tpP2pEntry->Rssi = Rssi;\n\n\n\t\t\t\t/* Update Rule according to latest Probe Response or Beacon that I received. */\n\t\t\t\tif ((bBeacon == TRUE) && \n\t\t\t\t\t((pP2pEntry->P2pClientState == P2PSTATE_DISCOVERY_CLIENT) || (pP2pEntry->P2pClientState == P2PSTATE_DISCOVERY)))\n\t\t\t\t{\n\t\t\t\t\t\t/* If total P2P device number > 10, don't want keep update topology if topology change. */\n\t\t\t\t\t\tif ((pAd->P2pTable.ClientNumber < 10)\n\t\t\t\t\t\t\t|| (((pAd->P2pTable.ClientNumber%4) == 3)&&(pAd->P2pTable.ClientNumber >= 10)))\n\t\t\t\t\t\tbChangeState = TRUE;\n\t\t\t\t\t\tpP2pEntry->Rule = P2P_IS_GO;\n\t\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY_GO;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"3 From DevAddr = %02x:%02x:%02x:%02x:%02x:%02x.\tChange rule to GO GroupCap = %x \\n\",  PRINT_MAC(DevAddr), GroupCap));\n\t\t\t\t}\n\t\t\t\telse if ((pP2pEntry->P2pClientState == P2PSTATE_DISCOVERY_GO)\n\t\t\t\t\t&& ((GroupCap&GRPCAP_OWNER) != GRPCAP_OWNER))\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->P2pTable.ClientNumber < 10)\n\t\t\t\t\t\t|| (((pAd->P2pTable.ClientNumber % 4) == 3) && (pAd->P2pTable.ClientNumber >= 10)))\n\t\t\t\t\tbChangeState = TRUE;\n\t\t\t\t\tpP2pEntry->Rule = P2P_IS_CLIENT;\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"4 From DevAddr = %02x:%02x:%02x:%02x:%02x:%02x.\tChange rule to Device. GroupCap = %x \\n\",  PRINT_MAC(DevAddr), GroupCap));\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t/* If peer is provisioned, don't update. We treat him only support this provisioned configmethod. */\n\t\t\t\tif (!P2P_TEST_FLAG(pP2pEntry, P2PFLAG_PROVISIONED) && (ConfigMethod != 0xffff))\n\t\t\t\t\tpP2pEntry->ConfigMethod = ConfigMethod;\n\n\t\t\t\t/* Always Update Device Name */\n\t\t\t\tif (DeviceNameLen != 0)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(&pP2pEntry->DeviceName[0], DeviceName, 32);\n\t\t\t\t\tpP2pEntry->DeviceNameLen = DeviceNameLen;\n\t\t\t\t\tpP2pEntry->DeviceName[pP2pEntry->DeviceNameLen] = 0x0;\n\t\t\t\t}\n\n\t\t\t\t/* If this is beacon. It must use correct opchannel, ssid, interface addr, and SSID. So update. */\n\t\t\t\t/* Step 4 - 1:\t Update table according to this is beacon or probe response. Beacon and probe response carries */\n\t\t\t\t/* different attribute.  */\n\t\t\t\tif (bBeacon == TRUE)\n\t\t\t\t{\n\t\t\t\t\tpP2pEntry->Rule = P2P_IS_GO;\n\t\t\t\t\tRTMPMoveMemory(pP2pEntry->Ssid, Ssid, 32);\n\t\t\t\t\tpP2pEntry->SsidLen = SsidLen;\n\t\t\t\t\tRTMPMoveMemory(pP2pEntry->bssid, Addr2, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPMoveMemory(pP2pEntry->InterfaceAddr, Addr2, MAC_ADDR_LEN);\n\t\t\t\t\tpP2pEntry->OpChannel = Elem->Priv; /* WorkingChannel; */\n\t\t\t\t\t/* The peer is GO. So set its state to GO_WPS directly. No need for Group forming procedure. */\n\t\t\t\t\t/* Search this beacon's group info, and insert its client to my p2p table too. */\n\t\t\t\t\tif ((GroupCap & GRPCAP_OWNER) != GRPCAP_OWNER)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Print for debug. */\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2p : One P2P device[%d] send out Beacon. But group owner %x bit not set ? \\n\", index, GroupCap));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* Make it more readable to use \"else if\". Group info only appears in Probe Response. */\n\t\t\t\telse if (bBeacon == FALSE)\n\t\t\t\t{\n\t\t\t\t\t/* If this is GO. */\t\t\t\n\t\t\t\t\tif ((GroupCap & GRPCAP_OWNER) == GRPCAP_OWNER)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* The peer is GO. So set its state to GO_WPS directly. No need for Group forming procedure. */\n\t\t\t\t\t\tpP2pEntry->Rule = P2P_IS_GO;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Not GO anymore, update State. */\n\t\t\t\t\t\tif (IS_P2P_PEER_DISCOVERY(pP2pEntry))\n\t\t\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_DISCOVERY;\n\t\t\t\t\t\tpP2pEntry->Rule = P2P_IS_CLIENT;\n\t\t\t\t\t}\n\t\t\t\t\t/* P2P PrimaryDevType only appears in Probe Response. not in beacon. */\n\t\t\t\t\tRTMPMoveMemory(pP2pEntry->PrimaryDevType, DevType, 8);\n\t\t\t\t\t/* Can I just set this channel that I got Probe response as listent channel?? */\n\t\t\t\t\tif (Elem->Priv)\n\t\t\t\t\t\tpP2pEntry->ListenChannel = Elem->Priv;\n\t\t\t\t\tbresult = P2pParseGroupInfoAttribute(pAd, index, P2pSubelement, P2PSubelementLen);\n\t\t\t\t\tif (bresult == FALSE)\n\t\t\t\t\t\tgoto CleanUp;\n\t\t\t\t}\n\n#ifdef WFD_SUPPORT\n\t\t\t\tif (WfdSubelementLen > 0)\n\t\t\t\t{\n\t\t\t\t\tWfdParseSubElmt(pAd, \n\t\t\t\t\t\t\t\t\t&pP2pEntry->WfdEntryInfo,\n\t\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\t\tWfdSubelementLen);\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tif (bSendP2pEvent)\n\t\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_DEVICE_FIND, pP2pEntry, Addr2);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t\t/* Step 5: Take Some action when the peer is  */\n\t\t\t\t/* Decide to connect? or Provision ? or Service discovery ? */\n\t\t\t\tif ((pP2pEntry->P2pClientState <= P2PSTATE_GO_DONE))\n\t\t\t\t{\n\t\t\t\t\tif ((DeviceCap & DEVCAP_INVITE) == DEVCAP_INVITE)\n\t\t\t\t\t\tP2P_SET_FLAG(pP2pEntry, P2PFLAG_INVITE_ENABLED);\n\n\t\t\t\t\tif (pP2pEntry->P2pClientState != P2PSTATE_DISCOVERY)\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR ClientState = pP2pEntry->P2pClientState;\n\t\t\t\t\t\tCOPY_MAC_ADDR(&P2pCmd.Addr[0], pP2pEntry->addr);\n\t\t\t\t\t\tP2pCmd.Idx = index;\n\t\t\t\t\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\t\t\t\t\t/*P2pCmd.ConfigMethod = pAd->P2pTable.Client[index].ConfigMethod; */\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"P2p : DevAddr[%02x:%02x:%02x:%02x:%02x:%02x] State = %s.\\n\", \n\t\t\t\t\t\t\t\tPRINT_MAC(DevAddr), decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"P2p : GrpCap=%x. DevCap=%x. ConfigMethod= %x.\\n\", \n\t\t\t\t\t\t\t\tGroupCap, DeviceCap, pP2pEntry->ConfigMethod));\n\n\t\t\t\t\t\tMlmeEnqueue(pAd, P2P_GO_FORM_STATE_MACHINE, P2P_START_COMMUNICATE_CMD_EVT, sizeof(P2P_CMD_STRUCT), &P2pCmd, ClientState);\n\t\t\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t\t\t\tgoto CleanUp;\n\t\t\t\t\t}\n\t\t\t\t\tif (pAd->P2pCfg.ConnectingIndex < MAX_P2P_GROUP_SIZE)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (MAC_ADDR_EQUAL(pAd->P2pTable.Client[index].addr, &pAd->P2pCfg.ConnectingMAC[0]))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"    From : %02x:%02x:%02x:%02x:%02x:%02x, state = %s\\n\", PRINT_MAC(Addr2), decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"    P2PTab[%d] Addr : %02x:%02x:%02x:%02x:%02x:%02x\\n\", index, PRINT_MAC(pP2pEntry->addr)));\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"    ConenctIdx = %d, Addr : %02x:%02x:%02x:%02x:%02x:%02x\\n\", pAd->P2pCfg.ConnectingIndex, PRINT_MAC(pAd->P2pCfg.ConnectingMAC)));\n\n\t\t\t\t\t\t\tP2pConnectAfterScan(pAd, bBeacon, index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\nCleanUp:\n\t\tif (P2pSubelement)\n\t\t\tos_free_mem(pAd, P2pSubelement);\n#ifdef WFD_SUPPORT\n\t\tif (WfdSubelement)\n\t\t\tos_free_mem(pAd, WfdSubelement);\n#endif /* WFD_SUPPORT */\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tProcessing the Beacon frame when operating as a P2P client. \n\t\tOnly called from STA's state machine that is in idle.\n\t\tthis function can support NoA and show Ralink IP.\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID PeerP2pBeacon(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tpAddr2,\n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN LARGE_INTEGER   TimeStamp) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\tAddr2[6], SsidLen;\n\tUCHAR\tSsid[32];\n\tULONG\t\tPeerip;\n\tULONG\tP2PSubelementLen;\n\tPUCHAR\tP2pSubelement = NULL;\n\tPFRAME_802_11\t\tpFrame;\n\t/*UCHAR\tbitmap;*/\n\tPMAC_TABLE_ENTRY pMacEntry = NULL;\n\n\tpFrame = (PFRAME_802_11)Elem->Msg;\n\t/* Only check beacon . */\n\tif (pFrame->Hdr.FC.SubType == SUBTYPE_PROBE_RSP)\n\t\treturn;\n\n\tif (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn;\n\n\tpMacEntry = &pAd->MacTab.Content[Elem->Wcid];\n\tif (!(IS_P2P_CLI_ENTRY(pMacEntry) && IS_ENTRY_APCLI(pMacEntry)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"1 PeerP2pBeaconProbeRspAtScan failed :  wcid = %d. not ValidAsP2P. Bug!please check. \\n\", Elem->Wcid));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"pMacEntry Addr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pMacEntry->Addr)));\n\t\treturn;\n\t}\n\n\tif ((pMacEntry->WpaState != AS_PTKINITDONE))\n\t\treturn;\n\n\t/* Init P2pSubelement */\n\tos_alloc_mem(pAd, &P2pSubelement, MAX_VIE_LEN);\n\tif (P2pSubelement == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"3 PeerP2pBeaconProbeRspAtScan::1Allocate memory size(=1024) failed\\n\"));\n\t\tgoto CleanUp;\n\t}\n\t\n\tif (PeerP2pBeaconSanity(pAd, \n\t\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\t\tAddr2, \n\t\t\t\t\t\t\t\t\tSsid, \n\t\t\t\t\t\t\t\t\t&SsidLen, \n\t\t\t\t\t\t\t\t\t&Peerip,\n\t\t\t\t\t\t\t\t\t&P2PSubelementLen,\n\t\t\t\t\t\t\t\t\tP2pSubelement))\n\t{\n\t\t/* Parse the power managemenr parameters in here. */\n\t\tpP2PCtrl->GONoASchedule.LastBeaconTimeStamp = TimeStamp.u.LowPart;\n\t\tP2pParseNoASubElmt(pAd, P2pSubelement, P2PSubelementLen, Elem->Wcid, pFrame->Hdr.Sequence);\n\t\t/* Since we get beacon, check if GO enable and OppPS. */\n\t\tif (P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT))\n\t\t{\n\t\t\tpAd->P2pCfg.bKeepSlient = FALSE;\n\t\t\t/* TO DO : sync with windows if necessary */\n\t\t\t/*RTMPDeQueueNoAMgmtPacket(pAd);*/\n\n\t\t\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\tif (((pAd->P2pCfg.CTWindows&0x7f) > 0) && ((pAd->P2pCfg.CTWindows&0x7f) < 80))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::  set P2P CTWindows timer.\\n\", __FUNCTION__));\n\t\t\t\tRTMPSetTimer(&pAd->P2pCfg.P2pCTWindowTimer, (pAd->P2pCfg.CTWindows&0x7f));\n\t\t\t}\n\t\t}\n\t}\n\t\nCleanUp:\n\tif (P2pSubelement)\n\t\tos_free_mem(NULL, P2pSubelement);\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tProcessing the Beacon frame when operating as a P2P client. \n\t\tOnly called from STA's state machine that is in idle.\n\t\t\n\tParameters:\n\t\t*pPeerip : Go's ip.\n\t\t*pMemberip : Other member's ip that is in the same P2P Group.\n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN PeerBeaconParseRalinkIE( \n\t\tIN PRTMP_ADAPTER pAd, \n\t\tIN VOID *Msg, \n\t\tIN ULONG MsgLen, \n\t\tOUT RALINKIP_IE\t\t\t\t*pRalinkIE,\n\t\tOUT RALINKMBRIP_ELEM\t\t\t\t*pMemberip,\n\t\tOUT ULONG *pPeerip)\n{\n\t\tPFRAME_802_11\t\tpFrame;\n\t\tPEID_STRUCT \t\tpEid;\n\t\tULONG\t\t\t\tLength = 0;\n\t\tBOOLEAN \t\t\tbrc = FALSE;\n\t\tPUCHAR\t\t\t\tPtr;\n\t\n\t\tpFrame = (PFRAME_802_11)Msg;\n\t\tLength += LENGTH_802_11;\n\t\n\t\t*pPeerip = 0;\n\t\tNdisZeroMemory(pRalinkIE, sizeof(RALINKIP_IE));\n\t\tNdisZeroMemory(pMemberip, sizeof(RALINKMBRIP_ELEM));\n\t\t\n\t\tPtr = pFrame->Octet;\n\t\n\t\t/* get timestamp from payload and advance the pointer */\n\t\tPtr += TIMESTAMP_LEN;\n\t\tLength += TIMESTAMP_LEN;\n\t\n\t\t/* get beacon interval from payload and advance the pointer */\n\t\tPtr += 2;\n\t\tLength += 2;\n\t\n\t\t/* get capability info from payload and advance the pointer */\n\t\tPtr += 2;\n\t\tLength += 2;\n\t\n\t\tpEid = (PEID_STRUCT) Ptr;\n\n\t\t/* get variable fields from payload and advance the pointer */\n\t\twhile ((Length + 2 + pEid->Len) <= MsgLen)\t  \n\t\t{\n\t\t\tswitch(pEid->Eid)\n\t\t\t{\t\n\t\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t\tif (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 5))\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pRalinkIE, &pEid->Eid, sizeof(RALINKIP_IE));\n\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 8))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEid->Octet[3] == RALINKOUIMODE_IPRSP)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*pPeerip = *(PULONG)&pEid->Octet[4];\n\t\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Beacon broadcast's other peer's ip in Probe rsp. */\n\t\t\t\t\t\tif (pEid->Octet[3] == RALINKOUIMODE_MBRIPRSP)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pMemberip, &pEid->Octet[4], sizeof(RALINKMBRIP_ELEM));\n\t\t\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\n\t\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len] */\n\t\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t\t}\n\t\n\t\n\treturn brc;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tProcessing Probe Request frame when operating as a P2P Device. \n\t\tCan be called from both as AP's state machine or as STA( that is doing P2P search)'s state machine\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID PeerP2pProbeReq(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n/*\tIN BOOLEAN\tbSendRsp)  */\n{\n\t\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t\tULONG\t\t\tP2PSubelementLen, WpsIELen;\n\t\tUCHAR\t\t\t*P2pSubelement;\n\t\tUCHAR\t\t\t*WpsIE;\n\t\tNDIS_STATUS   NStatus;\n\t\tPUCHAR\t\t  pOutBuffer = NULL;\n\t\tULONG\t\t  FrameLen = 0;\n\t\tUCHAR\t\t   Addr2[MAC_ADDR_LEN];\n\t\tUCHAR\t\t\tSsid[MAX_LEN_OF_SSID], SsidLen;\n\t\tUCHAR\t\tindex, perstindex;\n\t\t/*BOOLEAN \tbNewlyAdd = FALSE; */\n\t\tULONG\t\tPeerip;\n\t\t/*RALINKIP_IE \tRalinkIp;*/\n\t\tBOOLEAN \tbresult = FALSE;\n\t\tUCHAR\t\tGroupCap, DeviceCap, DevAddr[MAC_ADDR_LEN], StatusCode;\n\t\tBOOLEAN\t\tbSendRsp = TRUE;\n\t\tUCHAR\t\tChannel = Elem->Priv;\t\n\n#ifdef WFD_SUPPORT\n\t\tULONG\tWfdSubelementLen = 0;\n\t\tPUCHAR\tWfdSubelement = NULL;\n#endif /* WFD_SUPPORT */\n\n\t\t/* When I am a P2P Client , can't send probe response. */\n\t\tif (P2P_CLI_ON(pAd))\n\t\t\treturn;\n\n\t\tif ( pP2PCtrl->bSentProbeRSP != TRUE )\n\t\t\treturn;\n\n\t\t/* When I am not in listen channel , can't send probe response. */\n\t\tif (Channel != pAd->P2pCfg.ListenChannel)\n\t\t{\n\t\t\tbSendRsp = FALSE;\n\t\t\tif (P2P_GO_ON(pAd) && (Channel == pAd->P2pCfg.GroupOpChannel))\n\t\t\t\tbSendRsp = TRUE;\t\t\t\n\t\t}\n\n\t\tP2pSubelement = NULL;\n\t\tWpsIE = NULL;\n\n\t\tos_alloc_mem(pAd, &P2pSubelement, MAX_VIE_LEN);\n\t\tos_alloc_mem(pAd, &WpsIE, MAX_VIE_LEN);\n\n\t\tif ((P2pSubelement == NULL) || (WpsIE == NULL))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\tgoto CleanUp;\n\t\t}\n\n#ifdef WFD_SUPPORT\n\t\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\t\tif (WfdSubelement == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\tgoto CleanUp;\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\tif (PeerP2pProbeReqSanity(pAd, \n\t\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\t\tAddr2, \n\t\t\t\t\t\t\t\t\tSsid, \n\t\t\t\t\t\t\t\t\t&SsidLen, \n\t\t\t\t\t\t\t\t\t&Peerip,\n\t\t\t\t\t\t\t\t\t&P2PSubelementLen,\n\t\t\t\t\t\t\t\t\tP2pSubelement,\n#ifdef WFD_SUPPORT\n\t\t\t\t\t\t\t\t\t&WfdSubelementLen,\n\t\t\t\t\t\t\t\t\tWfdSubelement,\n#endif /* WFD_SUPPORT */\n\t\t\t\t\t\t\t\t\t&WpsIELen,\n\t\t\t\t\t\t\t\t\tWpsIE))\n\t\t{\n\t\t\tif (FALSE == P2PDeviceMatch(pAd, Addr2, NULL, 0))\n\t\t\t\tgoto CleanUp;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Peer Probe Req from %02x %02x %02x %02x %02x %02x\t\\n\", PRINT_MAC(Addr2)));\n\t\t\tindex = P2pGroupTabSearch(pAd, Addr2);\n\t\t\t\n//QQ TBD, p2p widi need insert p2p entry in probe req. due to p2p0 only in listen state\n\t\n\t\t\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s / %s\\n\", \n\t\t\t\t\tdecodeP2PClientState(pAd->P2pTable.Client[index].P2pClientState), decodeP2PState(pAd->P2pCfg.P2PConnectState)));\n\t\t\t\tif ((pAd->P2pTable.Client[index].P2pClientState > P2PSTATE_DISCOVERY_UNKNOWN) || \n\t\t\t\t\t(pAd->P2pCfg.P2PConnectState != P2P_CONNECT_IDLE))\n\t\t\t\t\tbSendRsp = TRUE;\n\t\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%d) P2P Peer Probe Req from %02x %02x %02x %02x %02x %02x\t\\n\", \n\t\t\t\t\t\t\t\tbSendRsp, PRINT_MAC(Addr2)));\t\n\t\n\t\t\tif (bSendRsp == TRUE)\n\t\t\t{\t\t\t\t\n\t\t\t\t/* allocate and send out ProbeRsp frame */\n\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\t\tgoto CleanUp;\n\t\n\t\n\t\t\t\tP2PMakeProbe(pAd, Elem, Channel, SUBTYPE_PROBE_RSP, pOutBuffer, &FrameLen);\n\n\n\t\t\t\tif (FrameLen > 0)\n\t\t\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"Got P2P Peer %d Probe Req . Send probe response back  len=%ld \\n\", index, FrameLen));\n\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t}\n\t\t\t/* Check already in table ? */\n\t\t\t/* If currently there is no activated P2P profile, we can still check if there is matching peer that is */\n\t\t\t/* in Persistent table send probe response.  If there is one, maybe we can try to connect to it. */\n\t\n\t\t\tif (index < MAX_P2P_GROUP_SIZE)\n\t\t\t{\n\t\t\t\tP2pParseSubElmt(pAd, P2pSubelement, P2PSubelementLen, \n\t\t\t\t\tFALSE, NULL, &pAd->P2pTable.Client[index].GroupCapability, &pAd->P2pTable.Client[index].DevCapability, NULL, NULL, DevAddr,\n\t\t\t\t\tNULL, NULL, &SsidLen, Ssid, NULL, NULL, pAd->P2pTable.Client[index].PrimaryDevType,\n\t\t\t\t\t&pAd->P2pTable.Client[index].ListenChannel, &pAd->P2pTable.Client[index].OpChannel, NULL, &pAd->P2pTable.Client[index].GoIntent, &StatusCode, NULL,\n#ifdef WFD_SUPPORT\n\t\t\t\t\tNULL, NULL,\n#endif /* WFD_SUPPORT */\t\t\t\t\t\n\t\t\t\t\tNULL);\n\n\t\t\t\t\n#ifdef WFD_SUPPORT\n\t\t\t\tif (WfdSubelementLen > 0)\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tWfdParseSubElmt(pAd, \n\t\t\t\t\t\t\t\t\t&pAd->P2pTable.Client[index].WfdEntryInfo,\n\t\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\t\tWfdSubelementLen);\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\t\tif (pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_CONNECT_COMMAND)\n\t\t\t\t{\n\t\t\t\t\tP2P_CMD_STRUCT\tP2pCmd;\n\t\t\t\t\tUCHAR ClientState = pAd->P2pTable.Client[index].P2pClientState;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<< %s: Start Group Form!\\n\", __FUNCTION__));\n\t\t\t\t\tCOPY_MAC_ADDR(&P2pCmd.Addr[0], pAd->P2pTable.Client[index].addr);\n\t\t\t\t\tP2pCmd.Idx = index;\n\t\t\t\t\t/*P2pStartGroupForm(pAd, pAd->P2pTable.Client[index].addr, index); */\n\t\t\t\t}\n\t\t\t\telse if (pAd->P2pTable.Client[index].P2pClientState == P2PSTATE_INVITE_COMMAND)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<< %s: Invite!\\n\", __FUNCTION__));\n\n\t\t\t\t\tif (IS_P2P_CONNECT_IDLE(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tperstindex = P2pPerstTabSearch(pAd, pAd->P2pTable.Client[index].addr, pAd->P2pTable.Client[index].bssid, pAd->P2pTable.Client[index].InterfaceAddr);\n\t\t\t\t\t\tbresult = P2pInvite(pAd, pAd->P2pTable.Client[index].addr, perstindex, index);\n\t\t\t\t\t}\n\t\t\t\t\telse if (P2P_GO_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Invite Case 1 */\n\t\t\t\t\t\tbresult = P2pInvite(pAd, pAd->P2pTable.Client[index].addr, MAX_P2P_TABLE_SIZE, index);\n\t\n\t\t\t\t\t}\n\t\t\t\t\telse if (P2P_CLI_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Invite Case 1 */\n\t\t\t\t\t\tbresult = P2pInvite(pAd, pAd->P2pTable.Client[index].addr, MAX_P2P_TABLE_SIZE, index);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (bresult == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tP2pStopScan(pAd);\n\t\t\t\t\t\tpP2PCtrl->P2PConnectState = P2P_INVITE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t}\n\tCleanUp:\n\t\n\t\tif (P2pSubelement)\n\t\t\tos_free_mem(NULL, P2pSubelement);\n\t\tif (WpsIE)\n\t\t\tos_free_mem(NULL, WpsIE);\n#ifdef WFD_SUPPORT\n\t\tif (WfdSubelement)\n\t\t\tos_free_mem(pAd, WfdSubelement);\n#endif /* WFD_SUPPORT */\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCall this function when receiving WPS EAP Nack frame. Most of time is because incorrect PIN.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pReceiveEapNack(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tPMLME_QUEUE_ELEM\tpElem)\n{\n}\n\n\nVOID P2pMakeProbeRspWSCIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPULONG\t\t\tpIeLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\t\t\tWscIEFixed[] = {0xdd, 0x0e, 0x00, 0x50, 0xf2, 0x04};\t/* length will modify later */\n\n\t\n\tULONG\t\t\tLen;\n\tPUCHAR\t\t\tpData;\n\tPWSC_DEV_INFO\tpDevInfo;\t\n\tINT templen;\n\n\t/* Role play, Enrollee or Registrar */\n\tpDevInfo = &pP2PCtrl->DevInfo;\n\n\tpData = pOutBuf;\n\tLen = 0;\n\t*pIeLen = 0;\n\n\t/* 0. WSC fixed IE */\n\tRTMPMoveMemory(pData, &WscIEFixed[0], 6);\n\tpData += 6;\n\tLen += 6;\n\t\t\t\n\t/* 1. Version */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_VERSION);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\t*(pData + 4) = pDevInfo->Version;\n\tpData += 5;\n\tLen   += 5;\n\t/* 2. Wi-Fi Protected Setup State */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_SC_STATE);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\t*(pData + 4) = (pAd->P2pCfg.bConfiguredAP ? WSC_SCSTATE_CONFIGURED : WSC_SCSTATE_UNCONFIGURED);\n\tpData += 5;\n\tLen   += 5;\n\n\n\n\t/* 3. Response Type WSC_ID_RESP_TYPE */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_RESP_TYPE);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\tif (P2P_GO_ON(pAd))\n\t\t*(pData + 4) = WSC_MSGTYPE_AP_WLAN_MGR;\n\telse\n\t\t*(pData + 4) = WSC_MSGTYPE_ENROLLEE_INFO_ONLY;\n\tpData += 5;\n\tLen   += 5;\n\n\t/* 4. UUID-E */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_UUID_E);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0010);\t\n\tNdisMoveMemory((pData + 4), pDevInfo->Uuid, 16);\n\tpData += 20;\n\tLen   += 20;\n\n\t// 5. Manufacture\n\ttemplen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData, pAd->P2pCfg.Manufacturer, pAd->P2pCfg.ManufacturerLen);\n\tpData += templen;\n\tLen   +=  templen;\n\n\t/* We don't support full length manufacture, model name, model name and model serial  */\n\t/* because it shall overflow. (> 255 bytes) */\n\t/* 6. Model Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pAd->P2pCfg.ModelName, pAd->P2pCfg.ModelNameLen);\n\tpData += templen;\n\tLen   +=  templen;\n\t\t\n\t/* 7. Model Number */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pAd->P2pCfg.ModelNumber, pAd->P2pCfg.ModelNumberLen);\n\tpData += templen;\n\tLen   +=  templen;\n\t\t\n\t/* 8. Serial Number */\n\ttemplen = AppendWSCTLV(WSC_ID_SERIAL_NUM, pData, pAd->P2pCfg.SerialNumber, pAd->P2pCfg.SerialNumberLen);\n\tpData += templen;\n\tLen   +=  templen;\n\n\t/* 9. Primary device type */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_PRIM_DEV_TYPE);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0008);\t\n\tNdisMoveMemory((pData + 4), pDevInfo->PriDeviceType, 8);\n\tpData += 12;\n\tLen   += 12;\n\n\t/* 10. Primary device name */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_DEVICE_NAME);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(pAd->P2pCfg.DeviceNameLen); \n\tNdisMoveMemory((pData + 4), pAd->P2pCfg.DeviceName, pAd->P2pCfg.DeviceNameLen);\n\tpData += pAd->P2pCfg.DeviceNameLen + 4;\n\tLen   += pAd->P2pCfg.DeviceNameLen + 4;\n\n\t/* 11. Config Method */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_CONFIG_METHODS);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0002);\n\t*((PUSHORT) (pData + 4)) = cpu2be16(0x0188);\n\n\tpData += 6;\n\tLen   += 6;\n\n\t/* The WPS IE shall contain the attributes required for an AP/Registrar as described in 7.2.5 of [6]\n\t */\n\t{\n\t\t/* 12. RF band, shall change based on current channel */\n\t\t*((PUSHORT) pData) = cpu2be16(WSC_ID_RF_BAND);\n\t\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\t\t*(pData + 4) = pDevInfo->RfBand;\n\t\tpData += 5;\n\t\tLen   += 5;\n\n\t\t/* 13. DPID shall be a required attribute if Credentials are available and ready for immediate use. */\n\t\tif (pAd->P2pCfg.Dpid  != DEV_PASS_ID_NOSPEC)\n\t\t{\n\t\t\t/* Device Password ID */\n\t\t\t*((PUSHORT) pData) = cpu2be16(WSC_ID_DEVICE_PWD_ID);\n\t\t\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0002);\n\t\t\t*((PUSHORT) (pData + 4)) = cpu2be16(pAd->P2pCfg.Dpid);\n\t\t\tpData += 6;\n\t\t\tLen   += 6;\n\t\t}\n\n\t\t/* When PBC has triggered, done or connected with timeout, */\n\t\t/* we must change the value of SelReg. */\n#ifdef CONFIG_AP_SUPPORT\n\t\tif ((pAd->ApCfg.MBSSID[BSS0].WscControl.WscSelReg) && (pAd->P2pCfg.Dpid == DEV_PASS_ID_PBC))\n\t\t{\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\t/* 14. Selected Registrar */\n\t\t\t\t*((PUSHORT) pData) = cpu2be16(WSC_ID_SEL_REGISTRAR);\n\t\t\t\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\t\t\t\t*(pData + 4) = pAd->ApCfg.MBSSID[BSS0].WscControl.WscSelReg; /* AP */\n\t\t\t\tpData += 5;\n\t\t\t\tLen   += 5;\n\n\t\t\t\t/* Device Password ID (append it above) */\t\t\t\t\n\t\t\t\t/* 15. Selected Registrar Config Methods */\n\t\t\t\t*((PUSHORT) pData) = cpu2be16(WSC_ID_SEL_REG_CFG_METHODS);\n\t\t\t\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0002);\n\t\t\t\t*((PUSHORT) (pData + 4)) = cpu2be16(0x18c); /* Support All : PBC, Keypad, Label, Display */\n\t\t\t\tpData += 6;\n\t\t\t\tLen   += 6;\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"P2pMakeProbeRspWSCIE: SelReg=1 \\n\"));\n\t\t\t}\n\t\t}\t\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n\t/* update the total length in vendor specific IE */\n\t*(pOutBuf+1) = Len - 2;\n\n\t/* fill in output buffer */\n\t*pIeLen = Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tMake WSC IE for the ProbeReq frame for P2P Spec requirement\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpOutBuf\t\t- all of WSC IE field \n\t\tpIeLen\t\t- length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tNone\n\t\t\n\t========================================================================\n*/\nVOID P2pMakeProbeReqIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\t\t\tWscIEFixed[] = {0xdd, 0x0e, 0x00, 0x50, 0xf2, 0x04};\t/* length will modify later */\n\tUCHAR\t\t\tLen;\n\tPUCHAR\t\t\tpData;\n\tPWSC_REG_DATA\tpReg;\n\tPWSC_DEV_INFO\tpDevInfo;\n\tUCHAR\t\t\tOutMsgBuf[512];\n\n\n\tpReg = (PWSC_REG_DATA) &pAd->StaCfg.WscControl.RegData;\n\n\t/* Role play, Enrollee or Registrar */\n\tpDevInfo = (PWSC_DEV_INFO) &pReg->SelfInfo;\n\n\tpData = (PUCHAR) &OutMsgBuf[0];\n\tLen = 0;\n\t*pIeLen = 0;\n\t\n\t/* 0. WSC fixed IE */\n\tRTMPMoveMemory(pData, &WscIEFixed[0], 6);\n\tpData += 6;\n\tLen += 6;\n\t\t\t\t\n\t/* 1. Version */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_VERSION);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\t*(pData + 4) = pDevInfo->Version;\n\tpData += 5;\n\tLen   += 5;\n\n\t/* 2. Request Type */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_REQ_TYPE);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0001);\n\t*(pData + 4) = ((pAd->StaCfg.WscControl.WscConfMode == WSC_REGISTRAR) ? WSC_MSGTYPE_AP_WLAN_MGR : WSC_MSGTYPE_ENROLLEE_OPEN_8021X );\n\tpData += 5;\n\tLen   += 5;\n\n\t/* 3. Config method */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_CONFIG_METHODS);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0002);\n\t*((PUSHORT) (pData + 4)) = cpu2be16(0x188);/* Keypad, Display, PBC */\n\tpData += 6;\n\tLen   += 6;\n\n\t/* 4. UUID-(E or R) */\n\t*((PUSHORT) pData) = ((pAd->StaCfg.WscControl.WscConfMode == WSC_REGISTRAR) ? cpu2be16(WSC_ID_UUID_R) : cpu2be16(WSC_ID_UUID_E));\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0010);\t\n\tNdisMoveMemory((pData + 4), pDevInfo->Uuid, 16);\n\tpData += 20;\n\tLen   += 20;\n\n\t/* 5. Primary device type */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_PRIM_DEV_TYPE);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0008);\t\n\tNdisMoveMemory((pData + 4), pP2PCtrl->DevInfo.PriDeviceType, 8);\n\tpData += 12;\n\tLen   += 12;\n\n\t/* 6. Primary device name */\n\t*((PUSHORT) pData) = cpu2be16(WSC_ID_DEVICE_NAME);\n\t*((PUSHORT) (pData + 2)) = cpu2be16(pP2PCtrl->DeviceNameLen);\n\tNdisMoveMemory((pData + 4), pP2PCtrl->DeviceName, pP2PCtrl->DeviceNameLen);\n\tpData += (pP2PCtrl->DeviceNameLen + 4);\n\tLen   += (pP2PCtrl->DeviceNameLen + 4);\t\t\t\t\n\n\t/* 13. DPID shall be a required attribute if Credentials are available and ready for immediate use. */\n\t{\n\t\tUSHORT Dpid = 0x188;\n\t\t/* Device Password ID */\n\t\t*((PUSHORT) pData) = cpu2be16(WSC_ID_DEVICE_PWD_ID);\n\t\t*((PUSHORT) (pData + 2)) = cpu2be16(0x0002);\n\t\t*((PUSHORT) (pData + 4)) = cpu2be16(Dpid);\n\t\tpData += 6;\n\t\tLen   += 6;\n\t}\n\n\t/* update the total length in vendor specific IE */\n\tOutMsgBuf[1] = Len - 2;\n\n\t/* fill in output buffer */\n\t*pIeLen = Len;\n\tNdisMoveMemory(pOutBuf, &OutMsgBuf[0], *pIeLen);\n\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tPrepare Probe reqeust or response frame when opeartin as P2P DEvice.\n\t\t\n\tParameters: \n\t\tpDest : buffer to put frame content.\n\t\tpFrameLen : frame length.\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PMakeProbe(\n\tIN PRTMP_ADAPTER pAd,  \n\tIN MLME_QUEUE_ELEM *Elem, \n\tIN UCHAR\t\tDsChannel,\n\tIN USHORT\tSubType,\n\tOUT PUCHAR pDest,\n\tOUT\tULONG *pFrameLen) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPUCHAR\t\tpOutBuffer = pDest;\n\tUCHAR\t\tAddr2[6];\n\tPHEADER_802_11\tpHeader;\n\tHEADER_802_11 ProbeRspHdr;\n\tUCHAR   RSNIe=IE_WPA2;/*, RSNIe2=IE_WPA2, RSN_Len=22; */\n\tUCHAR       tmpSupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR       tmpExtRateLen;\n\tLARGE_INTEGER FakeTimestamp;\n\tUCHAR\t\tDsLen = 1, SsidLen = 0;\n\tULONG\t\tTmpLen;\n\tULONG\t\tFrameLen = 0;\n\t/*UCHAR   \tErpIeLen = 1; */\n\t/*UCHAR\t\t\tP2pIEFixed[6] = {0xdd, 0x08, 0x00, 0x50, 0xf2, 0x09}; */\t/* length will modify later */\n\tUSHORT\t\tCapabilityInfo;\n\tUCHAR\t\tSupRateLen;\n\tPUCHAR\tptr;\n \n\tpHeader = (PHEADER_802_11) &Elem->Msg[0];\n\tRTMPMoveMemory(Addr2, pHeader->Addr2, 6);\n\n\tif (SubType== SUBTYPE_PROBE_RSP)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC - P2PMakeProbeRsp. Addr2 = %02x:%02x:%02x:%02x:%02x:%02x...\\n\", PRINT_MAC(Addr2)));\n\t\tMgtMacHeaderInit(pAd,&ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpP2PCtrl->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tpP2PCtrl->CurrentAddress);\n\t}\n\telse\n\t\tMgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpP2PCtrl->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tBROADCAST_ADDR);\n\n\tNdisMoveMemory(tmpSupRate,pAd->CommonCfg.SupRate,pAd->CommonCfg.SupRateLen);\n\ttmpExtRateLen = pAd->CommonCfg.ExtRateLen;\n\n\t/* P2P device's probe response need to set both ess and ibss bit to zero. */\n\tCapabilityInfo = CAP_GENERATE(0, 0, 1, 0, 0, 0);\n\tif (P2P_GO_ON(pAd))\n\t\tCapabilityInfo = CAP_GENERATE(1, 0, 1, 0, 0, 0);\n\t\t\n\ttmpSupRate[0]  = 0x8C;    /* 6 mbps, in units of 0.5 Mbps, basic rate */\n\ttmpSupRate[1]  = 0x12;    /* 9 mbps, in units of 0.5 Mbps */\n\ttmpSupRate[2]  = 0x98;    /* 12 mbps, in units of 0.5 Mbps, basic rate */\n\ttmpSupRate[3]  = 0x24;    /* 18 mbps, in units of 0.5 Mbps */\n\ttmpSupRate[4]  = 0xb0;    /* 24 mbps, in units of 0.5 Mbps, basic rate */\n\ttmpSupRate[5]  = 0x48;    /* 36 mbps, in units of 0.5 Mbps */\n\ttmpSupRate[6]  = 0x60;    /* 48 mbps, in units of 0.5 Mbps */\n\ttmpSupRate[7]  = 0x6c;    /* 54 mbps, in units of 0.5 Mbps */\n\tSupRateLen  = 8;\n\ttmpExtRateLen = pAd->CommonCfg.ExtRateLen;\n\n\tif (DsChannel == 0)\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SYNC - P2PMakeProbeRsp. DsChannel = is 0 !!!!!\\n\"));\n\t\t\n\tif (SubType == SUBTYPE_PROBE_RSP)\n\t{\n\t\tSsidLen = WILDP2PSSIDLEN;\n\t\tif (P2P_GO_ON(pAd))\n\t\t\tSsidLen = pP2PCtrl->SSIDLen; \n\t\t\n\t\tMakeOutgoingFrame(pOutBuffer,                 &FrameLen, \n\t\t\t\t\t\t  sizeof(HEADER_802_11),      &ProbeRspHdr, \n\t\t\t\t\t\t  TIMESTAMP_LEN,              &FakeTimestamp,\n\t\t\t\t\t\t  2,                          &pAd->CommonCfg.BeaconPeriod,\n\t\t\t\t\t\t  2,                          &CapabilityInfo,\n\t\t\t\t\t\t  1,                          &SsidIe, \n\t\t\t\t\t\t  1,                          &SsidLen, \n\t\t\t\t\t\t  SsidLen,     pP2PCtrl->SSID,\n\t\t\t\t\t\t  1,                          &SupRateIe, \n\t\t\t\t\t\t  1,                          &SupRateLen,\n\t\t\t\t\t\t  SupRateLen,  \t\ttmpSupRate, \n\t\t\t\t\t\t  END_OF_ARGS);\n\t}\n\telse\n\t{\n\t\tSsidLen = WILDP2PSSIDLEN;\n\t\tMakeOutgoingFrame(pOutBuffer,                 &FrameLen, \n\t\t\t\t\t\t  sizeof(HEADER_802_11),      &ProbeRspHdr, \n\t\t\t\t\t\t  1,                          &SsidIe, \n\t\t\t\t\t\t  1,                          &SsidLen, \n\t\t\t\t\t\t  SsidLen,     &WILDP2PSSID[0],\n\t\t\t\t\t\t  1,                          &SupRateIe, \n\t\t\t\t\t\t  1,                          &SupRateLen,\n\t\t\t\t\t\t  SupRateLen,  \t\ttmpSupRate, \n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t}\n\t\n\tif ((DsChannel > 0) && (DsChannel <= 14))\n\t{\n\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,      &TmpLen, \n\t\t\t\t\t\t  1,                        &DsIe,\n\t\t\t\t\t\t  1,                        &DsLen,\n\t\t\t\t\t\t  1,                        &DsChannel,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\t\n\t/* Add this IE after I already become GO. */\n\tif (tmpExtRateLen && (P2P_GO_ON(pAd)))\n\t{\n\t}\n\n\t/* Msut append RSN_IE because P2P uses WPA2PSK.  */\n\t{\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\t\t\t&TmpLen,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t\t&RSNIe,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t\t&pAd->StaCfg.RSNIE_Len,\n\t\t\t\t\t\t\tpAd->StaCfg.RSNIE_Len,\t\t\tpAd->StaCfg.RSN_IE,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\tFrameLen += TmpLen;\n\t}\n\n/*\t\t\t\n\n\t\t// add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back\n\t\tif (pAd->CommonCfg.bAggregationCapable)\n\t\t{\n\t\t\tif ((pAd->CommonCfg.bPiggyBackCapable))\n\t\t\t{\n\t\t\t\tUCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x07, 0x00, 0x00, 0x00};\n\t\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,       &TmpLen,\n\t\t\t\t\t\t\t\t  9,                         RalinkSpecificIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x05, 0x00, 0x00, 0x00}; \n\t\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,       &TmpLen,\n\t\t\t\t\t\t\t\t  9,                         RalinkSpecificIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06, 0x00, 0x00, 0x00}; \n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,\t\t &TmpLen,\n\t\t\t\t\t\t\t  9,\t\t\t\t\t\t RalinkSpecificIe,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\n\t\tif ((pP2PCtrl->P2pPhyMode != P2P_PHYMODE_LEGACY_ONLY))\n\t\t{\t\t\t\n\t\t\tUCHAR\tHtLen, AddHtLen, NewExtLen;\n\t\t\tADD_HT_INFO_IE\t\tAddHTInfo;\t// Useful as AP.\n\n\t\t\tHT_CAPABILITY_IE HtCapability;\n\t\t\tNdisMoveMemory(&HtCapability, &pAd->ApCfg.HtCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\tif (pAd->Antenna.field.RxPath > 1)\n\t\t\t{\n\t\t\t\tHtCapability.MCSSet[1] = 0xff;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tHtCapability.MCSSet[1] = 0x00;\n\t\t\t}\n\n\t\t\tHtLen = sizeof(pAd->ApCfg.HtCapability);\n\t\t\tAddHtLen = sizeof(pAd->ApCfg.AddHTInfoIe);\n\t\t\tNewExtLen = 1;\n\n\t\t\tNdisMoveMemory(&AddHTInfo, &pAd->ApCfg.AddHTInfoIe, sizeof(ADD_HT_INFO_IE));\n\n\t\t\t//New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,\n\t\t\t\t\t\t\t  1,                                &HtCapIe,\n\t\t\t\t\t\t\t  1,                                &HtLen,\n\t\t\t\t\t\t\t sizeof(HT_CAPABILITY_IE),          &HtCapability, \n\t\t\t\t\t\t\t  1,                                &AddHtInfoIe,\n\t\t\t\t\t\t\t  1,                                &AddHtLen,\n\t\t\t\t\t\t\t sizeof(ADD_HT_INFO_IE),          \t&AddHTInfo, \n\t\t\t\t\t\t\t  1,                                &NewExtChanIe,\n\t\t\t\t\t\t\t  1,                                &NewExtLen,\n\t\t\t\t\t\t\t sizeof(NEW_EXT_CHAN_IE),          \t&pAd->CommonCfg.NewExtChanOffset, \n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\t*/\t\n\t/* New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame */\n\n\tP2pMakeProbeRspWSCIE(pAd, pOutBuffer + FrameLen, &TmpLen);\n\tFrameLen += TmpLen;\n\n\tptr = pOutBuffer + FrameLen;\n\tP2pMakeP2pIE(pAd, (UCHAR)SubType, ptr, &TmpLen);\n\tFrameLen += TmpLen;\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeBitmap;\n\t\t\n\t\tptr = pOutBuffer + FrameLen;\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tif (SubType == SUBTYPE_PROBE_RSP)\n\t\t\tWfdIeBitmap |= (0x1 << SUBID_WFD_SESSION_INFO) | (0x1 << SUBID_WFD_ALTERNATE_MAC_ADDR);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &TmpLen);\n\t\tFrameLen += TmpLen;\n\t}\n#endif /* WFD_SUPPORT */\n\n\t*pFrameLen = FrameLen;\n\t\t\t\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tMake P2P IE.\n\t\t\n\tParameters: \n\t\treutrn IE lenght and buffer.\n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pMakeP2pIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN \tUCHAR\t\t\tPacketType,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPULONG\t\t\tpIeLen)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\t\t\tP2pIEFixed[6] = {0xdd, 0x0e, 0x00, 0x50, 0xf2, 0x09};\t/* length will modify later */\n\tULONG\t\t\tLen;\n\tPUCHAR\t\t\tpData;\n\tULONG\t\t\tTempLen;\n\tUCHAR\t\t\tStatus;\n\t/*UCHAR\t\t\tMaganed; */\n\tUCHAR\t\t\t\tP2pCapability[2];\n\tPUCHAR\t\t\tpBuf;\n\n\tRTMPMoveMemory(&P2pIEFixed[2], P2POUIBYTE, 4);\t\n\tpData = pOutBuf;\n\tLen = 0;\n\t*pIeLen = 0;\n\t/* 0. P2P fixed IE */\n\tRTMPMoveMemory(pData, &P2pIEFixed[0], 6);\n\tpData += 6;\n\tLen += 6;\n\n\tP2pCapability[0] = pAd->P2pCfg.P2pCapability[0];\n\tP2pCapability[1] = pAd->P2pCfg.P2pCapability[1];\n\n\t/* :  .\n\t */\n\tif (PacketType == SUBTYPE_ASSOC_RSP)\n\t{\n\t\tStatus = P2PSTATUS_SUCCESS;\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_STATUS, &Status, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\n\t\tif (IS_P2P_SUPPORT_EXT_LISTEN(pAd))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2pMakeP2pIE (PacketType = %d)  insert SUBID_P2P_EXT_LISTEN_TIMING  .\\n\", PacketType));\n\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_EXT_LISTEN_TIMING, NULL, pData);\n\t\t\tLen += TempLen;\n\t\t\tpData += TempLen;\n\t\t}\n\n\t\t/* this is managed infra STA connect to Infra AP. So Add P2P Interface. then this's all. return here. */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- P2pMakeP2pIE For managed STA. (Len = %ld) \\n\", Len));\n\t\t*(pOutBuf+1) = (Len-2);\n\t\t*pIeLen = Len;\n\t\treturn;\n\t}\n\n\t/* Conenct to Managed AP. */\n\tif ((pP2PCtrl->P2pManagedParm.TotalNumOfP2pAttribute > 0) &&\n\t\t(PacketType == SUBTYPE_ASSOC_REQ))\n\t{\n\t\t/* Always support Managed when connecting using Assoc Req. */\n\t\tP2pCapability[0] |= DEVCAP_INFRA_MANAGED;\n\t\t/* If the cross connect is enabled, check whether we need to turn off it because Managed AP Asks us to do so. */\n\t\t/* If already turned off, no need to check. */\n\t\tif ((!P2P_TEST_BIT(P2pCapability[1], GRPCAP_CROSS_CONNECT))\n\t\t\t&& RTMPEqualMemory(pP2PCtrl->Bssid, pAd->P2pCfg.P2pManagedParm.ManageAPBSsid, MAC_ADDR_LEN))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->P2pCfg.P2pManagedParm.APP2pManageability = %x \\n\",\tpAd->P2pCfg.P2pManagedParm.APP2pManageability));\n\t\t\t/* If This is the 1st Managed AP that I just want to connect to, but now I don't turn off the cross connect bit yet. */\n\t\t\t/* I have to turn off this bit when connecting to this AP. */\n\t\t\tif ((pAd->P2pCfg.P2pManagedParm.APP2pManageability != 0xff)\n\t\t\t\t&& (P2P_TEST_BIT(pAd->P2pCfg.P2pManagedParm.APP2pManageability, P2PMANAGED_ENABLE_BIT))\n\t\t\t\t&& (!P2P_TEST_BIT(pAd->P2pCfg.P2pManagedParm.APP2pManageability, P2PMANAGED_ICS_ENABLE_BIT)))\n\t\t\t{\n\t\t\t\tP2pCapability[1] &= (~GRPCAP_CROSS_CONNECT);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Turn off Corss Conenct bit in Assoc Req. %x \\n\",  (~GRPCAP_CROSS_CONNECT)));\n\t\t\t}\n\t\t}\n\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CAP, P2pCapability, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_INTERFACE, pP2PCtrl->CurrentAddress, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t\t/* this is managed infra STA connect to Infra AP. So Add P2P Interface. then this's all. return here. */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"<-----P2pMakeP2pIE For managed STA. (Len = %ld PacketType = %d.) \\n\", Len, PacketType));\n\t\t*(pOutBuf+1) = (Len-2);\n\t\t*pIeLen = Len;\n\t\treturn;\n\t}\n\n\tif (IS_CLIENT_DISCOVERY_ON(pAd))\n\t{\n\t\tP2pCapability[0] |= DEVCAP_CLIENT_DISCOVER;\n\t}\n\n\tif (PacketType == SUBTYPE_PROBE_REQ)\n\t{\n\t\t/* Probe Request Group Capability bit is reserved. (TestPlan 4.1.1) */\n\t\tP2pCapability[1] = 0;\n\t}\n\n\tpBuf = &P2pCapability[0];\n\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_CAP, pBuf, pData);\n\tLen += TempLen;\n\tpData += TempLen;\n\n\t/*if ((PortSubtype == PORTSUBTYPE_P2PClient)  */\n\tif ((pP2PCtrl->Rule == P2P_IS_CLIENT) || (pP2PCtrl->Rule == P2P_IS_DEVICE)\n\t\t|| (PacketType == SUBTYPE_PROBE_REQ))\n\t{\n\t\t/* Doesn't need to specify who I am searching for. So delete */\n\t}\n\telse\n\t{\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_ID, pP2PCtrl->CurrentAddress, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t}\n\tif (PacketType == SUBTYPE_PROBE_REQ)\n\t{\n\t\tif (INFRA_ON(pAd))\n\t\t\tpBuf = &pAd->CommonCfg.Channel;\n\t\telse\n\t\t\tpBuf = &pP2PCtrl->ListenChannel;\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_LISTEN_CHANNEL, pBuf, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\n\t\t/*if (pP2PCtrl->PortSubtype == PORTSUBTYPE_P2PGO) */\n\t\tif (pP2PCtrl->Rule == P2P_IS_GO)\n\t\t{\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t\tpBuf = &pAd->CommonCfg.Channel;\n\t\t\telse\n\t\t\t\tpBuf = &pP2PCtrl->GroupChannel;\n\t\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_OP_CHANNEL, pBuf, pData);\n\t\t\tLen += TempLen;\n\t\t\tpData += TempLen;\n\t\t}\n\n\t}\n\tif ((PacketType == SUBTYPE_PROBE_RSP) || (PacketType == SUBTYPE_ASSOC_REQ) || (PacketType == SUBTYPE_REASSOC_REQ))\n\t{\n\t\tif (PacketType == SUBTYPE_ASSOC_REQ)\n\t\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"\tP2pMakeP2pIE (PacketType = %d)\tinsert SUBID_P2P_DEVICE_INFO. DeviceNameLen = %ld.\\n\", PacketType, pAd->P2pCfg.DeviceNameLen));\n\t\t}\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_DEVICE_INFO, pP2PCtrl->CurrentAddress, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t}\n\n\tif (((PacketType == SUBTYPE_PROBE_RSP) || (PacketType == SUBTYPE_PROBE_REQ)  || (PacketType == SUBTYPE_ASSOC_RSP)) \n\t\t&& (IS_EXT_LISTEN_ON(pAd)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"P2pMakeP2pIE (PacketType = %d)  insert SUBID_P2P_EXT_LISTEN_TIMING  .\\n\", PacketType));\n\t\tTempLen = InsertP2PSubelmtTlv(pAd, SUBID_P2P_EXT_LISTEN_TIMING, NULL, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t}\n\n\tif (P2P_GO_ON(pAd) && (PacketType == SUBTYPE_PROBE_RSP))\n\t{\n\t\t/* If I am GO, must insert Group Info in my probe response to Probe Request that has P2P IE. */\n\t\tTempLen = InsertP2PGroupInfoTlv(pAd, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t}\n\n\t/* The NoA has its own P2P IE. So NoA Attribute lenght doesn't count here. */\n\t*(pOutBuf+1) = (Len-2);\n\n\tif (P2P_GO_ON(pAd) && (pAd->P2pCfg.GONoASchedule.bValid == TRUE))\n\t{\n\t\tTempLen = P2pUpdateNoAProbeRsp(pAd, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t}\n\telse if (P2P_GO_ON(pAd) && (P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT)))\n\t{\n\t\tTempLen = P2pUpdateNoAProbeRsp(pAd, pData);\n\t\tLen += TempLen;\n\t\tpData += TempLen;\n\t}\n \n\tDBGPRINT(RT_DEBUG_INFO, (\"<----- P2pMakeP2pIE (Len = %ld) \\n\", Len));\n\t*pIeLen = Len;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tProcessing WSC IE and put to OUTPUT buffer.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2PParseWPSIE(\n\tIN PUCHAR\tpWpsData,\n\tIN USHORT\t\tWpsLen,\n\tOUT PUSHORT\tDpid,\n\tOUT PUSHORT\tConfigMethod,\n\tOUT PUCHAR\tDeviceName,\n\tOUT UCHAR\t*DeviceNameLen)\n{\n\tUSHORT\t\t\t\tLength;\n\tPUCHAR\t\t\t\tpData;\n\tUSHORT\t\t\t\tWscType, WscLen;\n\n\tif (pWpsData == NULL)\n\t\treturn;\n\t\n\tif (DeviceNameLen !=NULL)\n\t\t*DeviceNameLen = 0;\n\tpData = pWpsData+4; /*pWpsData+6;*/\n\tLength = WpsLen - 6;\n\n\tif (pData == NULL)\n\t\treturn;\n\t\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWscType = cpu2be16(*((PUSHORT) pData));\n\t\tWscLen  = cpu2be16(*((PUSHORT) (pData + 2)));\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M1 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_DEVICE_NAME:\t\t/* 1 */\n\t\t\t\tif (DeviceName !=NULL)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(DeviceName, pData, 32);\n\t\t\t\t\tif (DeviceNameLen !=NULL)\n\t\t\t\t\t\t*DeviceNameLen = (UCHAR)WscLen;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"%s :  DeviceName = %c%c%c%c%c ...\\n\", __FUNCTION__, DeviceName[0], DeviceName[1], DeviceName[2],DeviceName[3],DeviceName[4]));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase WSC_ID_DEVICE_PWD_ID:\t\t/* 1 */\n\t\t\t\tif (Dpid !=NULL)\n\t\t\t\t{\n\t\t\t\t\t*Dpid = be2cpu16(*((USHORT *) pData));\n\t\t\t\t\t/**Dpid = *((PUSHORT) pData); */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"%s :  Dpid = %s  .\\n\", __FUNCTION__, decodeDpid(*Dpid)));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase WSC_ID_CONFIG_METHODS:\t\t/* 1 */\n\t\t\t\tif (ConfigMethod !=NULL)\n\t\t\t\t{\n\t\t\t\t\t*ConfigMethod = be2cpu16(*((PUSHORT) pData));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\" Config = %x  ..\\n\", *ConfigMethod));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"WscRecvMessageM1 --> Unknown IE 0x%04x\\n\", WscType));\t    */\n\t\t\t\tbreak;\t\t\t\t\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\t\n\n}\n\t\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tGo PeerDisassocReq Action.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID GoPeerDisassocReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tAddr2)\n{\n\t/* Set to a temporary state.  If thie device connect within 25 seconds. he may use WPS to connect. */\n\tP2pGroupTabDelete(pAd, P2P_NOT_FOUND, Addr2);\n\n\t/* Don't Stop GO immediately. Give some time for this client to reconnect with 13 seconds.  */\n\t/* when StopGo timer expired,  */\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tUpdate P2P beacon frame for P2P IE Group Info Attribute.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nULONG P2pUpdateGroupBeacon(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\tStartPosition) \n{\n\n\treturn 0;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tUpdate P2P beacon frame for P2P IE NoA Attribute. When I am GO.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nULONG P2pUpdateNoABeacon(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR apidx,\n/*\tIN ULONG\tStartPosition) */\n\tIN PUCHAR\tpDest)\n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\t/*PUCHAR\t\tpDest;*/\n\tUCHAR\t\t\tP2PIEFixed[] = {0xdd, 0x16, 0x00, 0x50, 0xf2, 0x09};\t/* length will modify later */\n\t/*UCHAR\t\ti;*/\n\t/*PUCHAR\tptr;*/\n\n\tRTMPMoveMemory(&P2PIEFixed[2], P2POUIBYTE, 4);\n\tDBGPRINT(RT_DEBUG_INFO, (\"<---- %s\\n\", __FUNCTION__));\n\tif (pP2PCtrl->GONoASchedule.bValid == TRUE)\n\t{\n\t\t/*pDest = &pAd->BeaconBuf[StartPosition];*/\n\t\t/*PUCHAR        pDest = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;*/\n\t\t/* Always support attach one NoA.. So.. length is fixed to 0x16. :)   */\n\t\tRTMPMoveMemory(pDest, P2PIEFixed, 6);\n\n\t\t*(pDest+6) = SUBID_P2P_NOA;\n\t\t/* Length is 13*n + 2 = 15 when n = 1 */\n\t\t*(pDest+7) = 15;\n\t\t/* Lenght 2nd byte */\n\t\t*(pDest+8) = 0;\n\t\t/* Index. */\n\t\t*(pDest+9) = pP2PCtrl->GONoASchedule.Token;\n\t\t/* CT Windows and OppPS parm */\n\t\t*(pDest+10) = pP2PCtrl->CTWindows;\n\t\t/* Count.  Test Plan set to 255. */\n\t\t*(pDest+11) = pP2PCtrl->GONoASchedule.Count;\n\t\t/* Duration */\n\t\tRTMPMoveMemory((pDest+12), &pP2PCtrl->GONoASchedule.Duration, 4);\n\t\t/* Interval */\n\t\tRTMPMoveMemory((pDest+16), &pP2PCtrl->GONoASchedule.Interval, 4);\n\t\tRTMPMoveMemory((pDest+20), &pP2PCtrl->GONoASchedule.StartTime, 4);\n\t\tpAd->GOBeaconBufNoALen = 24; \n\t}\n\telse\n\t{\n\t}\n\tDBGPRINT(RT_DEBUG_INFO, (\"----> %s\\n\", __FUNCTION__));\n\n\treturn pAd->GOBeaconBufNoALen;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tUpdate P2P beacon frame for P2P IE NoA Attribute. When I am GO.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nULONG P2pUpdateNoAProbeRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpInbuffer) \n{\n\tPUCHAR\t\tpDest;\n\tUCHAR\t\t\tP2PIEFixed[6] = {0xdd, 0x16, 0x00, 0x50, 0xf2, 0x09};\t/* length will modify later */\n\t/*UCHAR\t\ti; */\n\t/*PUCHAR\tptr; */\n\t\n\tRTMPMoveMemory(&P2PIEFixed[2], P2POUIBYTE, 4);\n\t\n\tif (pAd->P2pCfg.GONoASchedule.bValid == TRUE)\n\t{\n\t\tpDest = pInbuffer;\n\t\t/* Always support attach one NoA.. So.. length is fixed to 0x16. :)   */\n\t\tRTMPMoveMemory(pDest, P2PIEFixed, 6);\n\n\t\t*(pDest+6) = SUBID_P2P_NOA;\n\t\t/* Length is 13*n + 2 = 15 when n = 1 */\n\t\t*(pDest+7) = 15;\n\t\t/* Lenght 2nd byte */\n\t\t*(pDest+8) = 0;\n\t\t/* Index. */\n\t\t*(pDest+9) = pAd->P2pCfg.GONoASchedule.Token;\n\t\t/* CT Windows and OppPS parm. Don't turn on both. So Set CTWindows = 0 */\n\t\t*(pDest+10) = 0;\n\t\t/* Count.  Test Plan set to 255. */\n\t\t*(pDest+11) = pAd->P2pCfg.GONoASchedule.Count;\n\t\t/* Duration */\n\t\tRTMPMoveMemory((pDest+12), &pAd->P2pCfg.GONoASchedule.Duration, 4);\n\t\t/* Interval */\n\t\tRTMPMoveMemory((pDest+16), &pAd->P2pCfg.GONoASchedule.Interval, 4);\n\t\tRTMPMoveMemory((pDest+20), &pAd->P2pCfg.GONoASchedule.StartTime, 4);\n\n\t\treturn 24;\n\t}\n\telse if (P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT))\n\t{\n\t\tP2PIEFixed[1] = 0x9;\n\t\tpDest = pInbuffer;\n\t\tRTMPMoveMemory(pDest, P2PIEFixed, 6);\n\t\t*(pDest+6) = SUBID_P2P_NOA;\n\t\t/* Length is 13*n + 2 = 15 when n = 1 */\n\t\t*(pDest+7) = 2;\n\t\t/* Lenght 2nd byte */\n\t\t*(pDest+8) = 0;\n\t\t/* Index. */\n\t\t*(pDest+9) = pAd->P2pCfg.GONoASchedule.Token;\n\t\t/* CT Windows and OppPS parm */\n\t\t*(pDest+10) = pAd->P2pCfg.CTWindows;\n\t\treturn 11;\n\t}\n\telse\n\t{\n\t\treturn 0;\n\t}\n\t\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tUpdate P2P beacon frame and save to  BeaconBuf[].\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pUpdateBssBeacon(\n\tIN PRTMP_ADAPTER pAd,\n\tIN  PUCHAR\t pCapability,\n\tIN  PUCHAR\tpIpReqP2ptabindex) \n{\n}\n\nVOID GOUpdateBeaconFrame(\n\tIN PRTMP_ADAPTER pAd)\n{\n\n}\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tMake P2P beacon frame and save to  BeaconBuf[]\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pMakeBssBeacon(\n\tIN PRTMP_ADAPTER pAd)\n{\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCheck REinvoke's invitation Request frame .\n\n\tArguments:\n\t\t    - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tFALSE - None of channel in ChannelList Match any channel in pAd->ChannelList[] array\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t========================================================================\n\n*/\nVOID P2pCheckInviteReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN\t\tbIAmGO,\n\tIN UCHAR\t\tindex,\n\tIN PUCHAR\tChannelList,\n\tIN PUCHAR\tBssidAddr,\n\tIN UCHAR\t\tOpChannel,\n\tIN PUCHAR\tSsid,\n\tIN UCHAR\tSsidLen,\n\tIN UCHAR\t*pRspStatus)\n{\n\tUCHAR\t\ti;\n\t*pRspStatus = P2PSTATUS_SUCCESS;\n\t/* Check if have Common Channels. */\n\tif (FALSE == P2pCheckChannelList(pAd, ChannelList))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - no common channel = %d...\\n\", *ChannelList));\n\t\t*pRspStatus = P2PSTATUS_NO_CHANNEL;\n\t\treturn;\n\t}\n\t/* Invite Req from a CLient doesn't includes group_bssid in the request. So doesn't need check. */\n\t/* Check Bssid is correct. */\n\tif (!RTMPEqualMemory(BssidAddr, pAd->P2pTable.PerstEntry[index].Addr, MAC_ADDR_LEN)\n\t\t&& (bIAmGO == FALSE))\n\t{\n\t\t*pRspStatus = P2PSTATUS_INVALID_PARM;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - MAc addr invalid  .\\n\"));\n\t\treturn;\n\t}\n\n\t/* invite Req from Owner include OpChannel. from Client, doesn't include. */\n\tif (bIAmGO == FALSE)\n\t{\n\t\t/* Check Oopchannel is correct. */\n\t\tfor (i = 0;i < pAd->ChannelListNum;i++)\n\t\t{\n\t\t\tif (pAd->ChannelList[i].Channel == OpChannel)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ( i == pAd->ChannelListNum)\n\t\t{\n\t\t\t*pRspStatus = P2PSTATUS_NO_CHANNEL;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - 2 P2PSTATUS_NO_CHANNEL  .\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\t/* Check SSID is correct. */\n\tif ((SsidLen > 0) && (!RTMPEqualMemory(pAd->P2pTable.PerstEntry[index].Profile.SSID.Ssid, Ssid, SsidLen)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Ssid1[%d] = %s.  \\n\",  SsidLen, Ssid));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Ssid2[%d] = %s.  \\n\",  pAd->P2pTable.PerstEntry[index].Profile.SSID.SsidLength, pAd->P2pTable.PerstEntry[index].Profile.SSID.Ssid));\n\t\t*pRspStatus = P2PSTATUS_INVALID_PARM;\n\t\treturn;\n\t}\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCheck REinvoke's invitation Request frame .\n\n\tArguments:\n\t\t    - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tFALSE - None of channel in ChannelList Match any channel in pAd->ChannelList[] array\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t========================================================================\n\n*/\nVOID P2pCheckInviteReqFromExisting(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tChannelList,\n\tIN PUCHAR\tBssidAddr,\n\tIN UCHAR\t\tOpChannel,\n\tIN PUCHAR\tSsid,\n\tIN UCHAR\tSsidLen,\n\tIN UCHAR\t*pRspStatus)\n{\n\tUCHAR\t\ti;\n\t*pRspStatus = P2PSTATUS_SUCCESS;\n\t/* Check if have Common Channels. */\n\tif (FALSE == P2pCheckChannelList(pAd, ChannelList))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - no common channel. Channel list is : %d...\\n\", ChannelList[0]));\n\t\t*pRspStatus = P2PSTATUS_NO_CHANNEL;\n\t\treturn;\n\t}\n\n\t/* invite Req from Owner include OpChannel. from Client, doesn't include. */\n\tif (OpChannel != 0)\n\t{\n\t\t/* Check Oopchannel is correct. */\n\t\tfor (i = 0;i < pAd->ChannelListNum;i++)\n\t\t{\n\t\t\tif (pAd->ChannelList[i].Channel == OpChannel)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ( i == pAd->ChannelListNum)\n\t\t{\n\t\t\t*pRspStatus = P2PSTATUS_NO_CHANNEL;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - No channel = %d...\\n\", OpChannel));\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/* Check SSID is correct. */\n\tif ((SsidLen == 0))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Ssidlen Zero = %d...\\n\", SsidLen));\n\t\t*pRspStatus = P2PSTATUS_INVALID_PARM;\n\t\treturn;\n\t}\n\n}\n\nUCHAR ChannelToClass(\n\tIN UCHAR\t\tChannel,\n\tIN UCHAR\t\tCountry)\n{\n\tUCHAR\t\tReturnClass = 1;\n\tif (Country == 1/*COUNTRY_USA*/)\n\t{\n\t\t/* 0. Decide current regulatory class. P802.11REVmb_D3.0.pdf. TableJ-4 */\n\t\tif (Channel <= 11)\n\t\t{\n\t\t\tReturnClass = 81;\n\t\t}\n\t\telse if (Channel <= 48)\n\t\t{\n\t\t\tReturnClass = 115;\t/* Atheros suggest to use 1 2010-May */\n\t\t}\t\t\t\n\t\telse if (Channel <= 64)\n\t\t{\n\t\t\tReturnClass = 118;\n\t\t}\n\t\telse if (Channel  <= 140)\n\t\t{\n\t\t\tReturnClass = 121;\n\t\t}\n\t\telse if ((Channel  == 165) || (Channel  == 169))\n\t\t{\n\t\t\tReturnClass = 125;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* 3  when channels are 149.153. 157. 161 */\n\t\t\tReturnClass = 124;\n\t\t}\n\t}\n\treturn ReturnClass;\n}\n\n"
  },
  {
    "path": "src/common/p2p_table.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p.c\n\n\tAbstract:\n\tPeer to peer is also called Wifi Direct. This function handles P2P table management. also include persistent table that saves credential.\n\n\tRevision History:\n\tWho              When               What\n\t--------    ----------    ----------------------------------------------\n\tJan Lee         2010-05-21    created for Peer-to-Peer Action frame(Wifi Direct)\n*/\n#include \"rt_config.h\"\n\nextern UCHAR\tZeroSsid[];\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tGUI needs to update whole Persistent table to driver after reload of driver. \n\t\t\n\tParameters: \n\t\tS - pointer to the association state machine\n\tNote:\n\t\tThe state machine looks like the following as name implies its function\n\t==========================================================================\n */\nVOID P2pSetPerstTable(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PVOID pInformationBuffer) \n{\n\tPOID_P2P_PERSISTENT_TABLE\t\tpP2pPerstTab;\n\tUCHAR\t\ti;\n\t\n\tpP2pPerstTab = (POID_P2P_PERSISTENT_TABLE)pInformationBuffer;\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pSetPerstTable   Num = %d \\n\", pP2pPerstTab->PerstNumber));\n\tpAd->P2pTable.PerstNumber = pP2pPerstTab->PerstNumber;\n\t\n\tif (pAd->P2pTable.PerstNumber == 0)\n\t{\n\t\tfor (i = 0; i < MAX_P2P_TABLE_SIZE;i++)\n\t\t{\n\t\t\tpAd->P2pTable.PerstEntry[i].bValid = FALSE;\n\t\t}\n\t}\n\t\n\tfor (i = 0; i < 1; i++)\n\t{\n\t\tRTMPMoveMemory(&pAd->P2pTable.PerstEntry[i], &pP2pPerstTab->PerstEntry[i], sizeof(RT_P2P_PERSISTENT_ENTRY));\n\t\tP2PPrintP2PPerstEntry(pAd, i );\n\t}\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tThis is a periodic routine that check P2P Group Table's Status. One importatn task is to check if some frame\n\t\tthat need transmission result is success or retry fail.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGroupMaintain(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\t\ti;\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry;\n\tULONG\t\tData;\n\t/*UCHAR\t\tValue;*/\n\t/*BCN_TIME_CFG_STRUC csr;*/\n\tBOOLEAN\t\tbAllPsm = TRUE;\n\n\tif (pP2PCtrl->GONoASchedule.bValid == TRUE)\n\t{\n\t\t/* Disable OppPS when NoA is ON. */\n\t\tP2pStopOpPS(pAd);\n\t\tRTMP_IO_READ32(pAd, TSF_TIMER_DW1, &Data);\n\t\tif (Data != pP2PCtrl->GONoASchedule.TsfHighByte)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGroupMaintain. Tsf MSB changed to %ld from %ld.  restart NoA . \\n\",Data, pP2PCtrl->GONoASchedule.TsfHighByte ));\n\t\t\t/* I want to resume the NoA */\n\t\t\tpP2PCtrl->GONoASchedule.bNeedResumeNoA = TRUE;\n\t\t\tP2pStopNoA(pAd, NULL);\n\t\t\t/* Ok. Now resume it. */\n\t\t\tpP2PCtrl->GONoASchedule.bNeedResumeNoA = FALSE;\n\t\t\tP2pGOStartNoA(pAd);\n\t\t}\n\n\t}\n\telse if ((P2P_GO_ON(pAd)) && (pP2PCtrl->GONoASchedule.bValid == FALSE)\n\t\t&& (IS_OPPS_ON(pAd)))\n\t{\n\t\t/* Since NoA is OFF, consider to enable OppPS. */\n\t\tfor (i = 0; i < MAX_LEN_OF_MAC_TABLE;i++)\n\t\t{\n\t\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\n\t\t\tif (IS_ENTRY_CLIENT(pEntry)\n\t\t\t\t&& (pEntry->PsMode == PWR_ACTIVE))\n\t\t\t{\n\t\t\t\tbAllPsm = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ((bAllPsm == TRUE) && (pAd->MacTab.Size > 0))\n\t\t{\n\t\t\t/* bit 7 is OppPS bit. set 1 to enable. bit [0:6] is in unit TU. */\n\t\t\tif (IS_OPPS_ON(pAd))\n\t\t\t{\n\t\t\t\tP2pStartOpPS(pAd);\n\t\t\t\tpP2PCtrl->CTWindows = 0x8a;\n\t\t\t}\n\t\t\t/* case 2 to turn on CTWindows.  Not decide the case 2 rule yet. 2010-June */\n\t\t\telse if (0)\n\t\t\t{\n\t\t\t\tpP2PCtrl->CTWindows = 0x8a;\n\t\t\t}\n\t\t}\n\t\telse if (P2P_TEST_BIT(pAd->P2pCfg.CTWindows, P2P_OPPS_BIT))\n\t\t{\n\t\t\tP2pStopOpPS(pAd);\n\t\t}\n\t}\n\n\tif (pP2PCtrl->p2pidxForServiceCbReq < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tif (pAd->P2pTable.Client[pAd->P2pCfg.p2pidxForServiceCbReq].ConfigTimeOut > 0)\n\t\t\tpAd->P2pTable.Client[pAd->P2pCfg.p2pidxForServiceCbReq].ConfigTimeOut--;\n\t\tif (pAd->P2pTable.Client[pAd->P2pCfg.p2pidxForServiceCbReq].P2pClientState == P2PSTATE_SERVICE_COMEBACK_COMMAND\n\t\t\t&& (pAd->P2pTable.Client[pAd->P2pCfg.p2pidxForServiceCbReq].ConfigTimeOut == 0))\n\t\t{\n\t\t\t/*P2pSendComebackReq(pAd, pAd->P2pCfg.p2pidxForServiceCbReq, pAd->P2pTable.Client[pAd->P2pCfg.p2pidxForServiceCbReq].addr); */\n\t\t\tpP2PCtrl->p2pidxForServiceCbReq = MAX_P2P_GROUP_SIZE;\n\t\t}\n\t}\n\n\tif (IS_PERSISTENT_ON(pAd) \n\t\t&& (!P2P_GO_ON(pAd))\n\t\t&& (!P2P_CLI_ON(pAd)))\n\t{\n\t\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t\t{\t\t\n\t\t\tpP2pEntry = &pAd->P2pTable.Client[i];\n\t\t\t/* Add some delay to connect to Persistent GO. Because some GO like broadcom need configuration time to start GO. */\n\t\t\tif ((pP2pEntry->P2pClientState == P2PSTATE_REINVOKEINVITE_TILLCONFIGTIME))\n\t\t\t{\n\t\t\t\tif (pP2pEntry->ConfigTimeOut > 0)\n\t\t\t\t\tpP2pEntry->ConfigTimeOut--;\n\t\t\t\tif (pP2pEntry->ConfigTimeOut == 0)\n\t\t\t\t{\n\t\t\t\t\tpP2PCtrl->P2PConnectState = P2P_DO_WPS_ENROLLEE;\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GO_WPS;\n\t\t\t\t\tP2pWpsDone(pAd, pP2pEntry->addr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (P2P_GO_ON(pAd))\n\t{\n\t\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t\t{\t\t\n\t\t\tpP2pEntry = &pAd->P2pTable.Client[i];\n\t\t\tif (pP2pEntry->P2pClientState == P2PSTATE_WAIT_GO_DISCO_ACK_SUCCESS)\n\t\t\t{\n\t\t\t\tULONG\t\tTotalFrameLen;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2P  P2PSTATE_WAIT_GO_DISCO_ACK_SUCCESS \\n\"));\n\n\t\t\t\tP2PSendDevDisRsp(pAd, P2PSTATUS_SUCCESS, pAd->P2pCfg.LatestP2pPublicFrame.Token, pAd->P2pCfg.LatestP2pPublicFrame.p80211Header.Addr2, &TotalFrameLen);\n\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_CLIENT_OPERATING;\n\t\t\t}\n\t\t\telse if ((pP2pEntry->P2pClientState == P2PSTATE_PROVISION_COMMAND) || (pP2pEntry->P2pClientState == P2PSTATE_INVITE_COMMAND))\n\t\t\t{\n\t\t\t\tif (pP2pEntry->StateCount > 0)\n\t\t\t\t{\n\t\t\t\t\t/*DBGPRINT(RT_DEBUG_ERROR, (\"pEntry[%d] StateCount = %d\\n\", i, pP2pEntry->StateCount)); */\n\t\t\t\t\tpP2pEntry->StateCount--;\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ((pP2pEntry->StateCount == 0) && (pP2pEntry->bValid))\n\t\t\t\t{\n\t\t\t\t\tif (pP2pEntry->ReTransmitCnt >= 20)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: ReTransmit Probe Req. limit! stop connect this p2p device!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__));\n\t\t\t\t\t\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n\t\t\t\t\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\t\t\t\t}\n\t\t\t\t\tpP2pEntry->ReTransmitCnt++;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Table : idx=%d Send Probe Req. \\n\", i));\n\t\t\t\t\tP2pSendProbeReq(pAd, pP2pEntry->ListenChannel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\t}\n\t/* time out case. */\n\telse if ((pP2PCtrl->P2PConnectState ==  P2P_DO_GO_SCAN_BEGIN)\n\t\t&& (pP2PCtrl->P2pCounter.GoScanBeginCounter100ms > 1200 /*GOSCANBEGINCOUNTER_MAX*/))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P_DO_GO_SCAN_BEGIN Timeout. BAck to idle. \\n\"));\n\t\tpP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE;\n\t\t}\n\telse if ((pAd->flg_p2p_OpStatusFlags == 0) &&\n\t\t\t(!MAC_ADDR_EQUAL(&ZERO_MAC_ADDR, &pP2PCtrl->ConnectingMAC)))\n\t{\n\t\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t\t{\t\t\n\t\t\tpP2pEntry = &pAd->P2pTable.Client[i];\n\t\t\tif (pP2pEntry->P2pClientState == P2PSTATE_NONE)\n\t\t\t\tcontinue;\n\t\t\tif ((pP2pEntry->P2pClientState >= P2PSTATE_SENT_GO_NEG_REQ) && \n\t\t\t\t(pP2pEntry->P2pClientState <= P2PSTATE_WAIT_GO_COMFIRM_ACK))\n\t\t\t{\n\t\t\t\tif (pP2pEntry->StateCount > 0)\n\t\t\t\t{\n\t\t\t\t\t/*DBGPRINT(RT_DEBUG_ERROR, (\"pEntry[%d] StateCount = %d\\n\", i, pP2pEntry->StateCount)); */\n\t\t\t\t\tpP2pEntry->StateCount--;\n\t\t\t\t}\n\t\t\t\tif ((pP2pEntry->StateCount == 0) && ((pP2pEntry->bValid)))\n\t\t\t\t{\n\t\t\t\t\tif (pP2pEntry->ReTransmitCnt >= 20)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: [%s] ReTransmit Probe Req. limit! stop connect this p2p device!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\t\t\tP2pStopConnectThis(pAd);\n\t\t\t\t\t\tP2P_WSC_CONF_MTHD_DEFAULT(pAd);\n\t\t\t\t\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\t\t\t\t}\n\t\t\t\t\t/*pP2pEntry->P2pClientState = P2PSTATE_CONNECT_COMMAND; */\n\t\t\t\t\t/*pP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE; */\n\t\t\t\t\t/*pP2PCtrl->P2pCounter.Counter100ms = 0; */\n\t\t\t\t\tpP2pEntry->StateCount = 50;\n\t\t\t\t\tpP2pEntry->ReTransmitCnt++;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P Table : idx=%d Go Nego Req Retry. \\n\", i));\n\t\t\t\t\tP2pSendProbeReq(pAd, pP2pEntry->ListenChannel);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse if (pP2pEntry->P2pClientState == P2PSTATE_GO_COMFIRM_ACK_SUCCESS)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P Table : idx=%d Get Confirm Ask Success.  p2pState = %d.\\n\", i, pP2PCtrl->P2PConnectState));\n\t\t\t\t/* Don't leet ClientState keep in P2PSTATE_GO_COMFIRM_ACK_SUCCESS, */\n\t\t\t\t/* Or will keep calling P2pGoNegoDone(). */\n\t\t\t\t/* ClientState will be updated when GO receiving AuthReq. */\n\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_GOT_GO_COMFIRM;\n\t\t\t\tP2pGoNegoDone(pAd, pP2pEntry);\n\t\t\t}\n\t\t\telse if (pP2pEntry->P2pClientState== P2PSTATE_REVOKEINVITE_RSP_ACK_SUCCESS)\n\t\t\t{\n\t\t\t\t/* Only when I am GO . I need to check the response ack success or not. */\n\t\t\t\t/* doesn't check rule.  start GO right away. */\n\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_CLIENT_WPS;\n\t\t\t\tP2pStartAutoGo(pAd);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"P2P Table : idx=%d Get Invite Rsp Ask Success.  p2pState = %d.\\n\", i, pP2PCtrl->P2PConnectState));\n\n\t\t\t\tpAd->StaCfg.WscControl.WscState = WSC_STATE_OFF;\n\t\t\t\t/* this is not Auto GO by command from GUI. So set the intent index to != 16 */\n\t\t\t\tpAd->P2pCfg.GoIntentIdx = 15;\n\t\t\t}\n\t\t\telse if ((pP2pEntry->P2pClientState == P2PSTATE_CONNECT_COMMAND) || (pP2pEntry->P2pClientState == P2PSTATE_PROVISION_COMMAND) || (pP2pEntry->P2pClientState == P2PSTATE_INVITE_COMMAND))\n\t\t\t{\n\t\t\t\tif (pP2pEntry->StateCount > 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"pEntry[%d] State = %s.  StateCount = %d\\n\", i, decodeP2PClientState(pP2pEntry->P2pClientState), pP2pEntry->StateCount));\n\t\t\t\t\tpP2pEntry->StateCount--;\n\t\t\t\t}\n\n\t\t\t\tif ((pP2pEntry->StateCount == 0) && (pP2pEntry->bValid))\n\t\t\t\t{\n\t\t\t\t\tif (pP2pEntry->ReTransmitCnt >= 20)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: [%s] ReTransmit Probe Req. limit! stop connect this p2p device!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\t\t\tP2pStopConnectThis(pAd);\n\t\t\t\t\t\tP2P_WSC_CONF_MTHD_DEFAULT(pAd);\n\t\t\t\t\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tpP2pEntry->StateCount = 3;\n\t\t\t\t\tpP2pEntry->ReTransmitCnt++;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Table : idx=%d Send Probe Req. \\n\", i));\n\t\t\t\t\tP2pSendProbeReq(pAd, pP2pEntry->ListenChannel);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse if ((pP2pEntry->P2pClientState == P2PSTATE_DISCOVERY_GO) && (MAC_ADDR_EQUAL(pP2PCtrl->ConnectingMAC, pP2pEntry->addr)))\n\t\t\t{\n\t\t\t\tif (pP2pEntry->StateCount > 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"pEntry[%d] State = %s.  StateCount = %d\\n\", i, decodeP2PClientState(pP2pEntry->P2pClientState), pP2pEntry->StateCount));\n\t\t\t\t\tpP2pEntry->StateCount--;\n\t\t\t\t}\n\n\t\t\t\tif ((pP2pEntry->StateCount == 0) && (pP2pEntry->bValid))\n\t\t\t\t{\n\t\t\t\t\tif (pP2pEntry->ReTransmitCnt >= 20)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: [%s] ReTransmit Probe Req. limit! stop connect this p2p device!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, decodeP2PClientState(pP2pEntry->P2pClientState)));\n\t\t\t\t\t\tP2pStopConnectThis(pAd);\n\t\t\t\t\t\tP2P_WSC_CONF_MTHD_DEFAULT(pAd);\n\t\t\t\t\t\tpP2pEntry->ReTransmitCnt = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_PROVISION_COMMAND;\n\t\t\t\t\tpP2pEntry->StateCount =0;\n\t\t\t\t\tpP2pEntry->ReTransmitCnt++;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Table : idx=%d Send Probe Req. \\n\", i));\n\t\t\t\t\tP2pSendProbeReq(pAd, pP2pEntry->ListenChannel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCopy P2P Table's information to Mac Table when the P2P Device is in my group.\n\t\t\n\tParameters: \n\tNote:\n\t==========================================================================\n */\nVOID P2pCopyMacTabtoP2PTab(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tP2pindex,\n\tIN UCHAR\t\tMacindex)\n{\n\tMAC_TABLE_ENTRY  *pEntry;\n\tRT_P2P_CLIENT_ENTRY\t*pP2pEntry;\n\t\n\tif ((P2pindex >= MAX_P2P_GROUP_SIZE) || (Macindex >= MAX_LEN_OF_MAC_TABLE))\n\t\treturn;\n\n\tpEntry = &pAd->MacTab.Content[Macindex];\n\tpP2pEntry = &pAd->P2pTable.Client[P2pindex];\n\tpP2pEntry->CTWindow= pEntry->P2pInfo.CTWindow;\n\tpP2pEntry->P2pClientState = pEntry->P2pInfo.P2pClientState;\n\tpP2pEntry->P2pFlag = pEntry->P2pInfo.P2pFlag;\n\tpP2pEntry->NoAToken = pEntry->P2pInfo.NoAToken;\n\tpP2pEntry->GeneralToken = pEntry->P2pInfo.GeneralToken;\n\n\tpP2pEntry->DevCapability = pEntry->P2pInfo.DevCapability;\n\tpP2pEntry->GroupCapability = pEntry->P2pInfo.GroupCapability;\n\tpP2pEntry->NumSecondaryType = pEntry->P2pInfo.NumSecondaryType;\t\n\tpP2pEntry->DeviceNameLen = pEntry->P2pInfo.DeviceNameLen;\n\tpP2pEntry->ConfigMethod = pEntry->P2pInfo.ConfigMethod;\n\t\n\tRTMPMoveMemory(pP2pEntry->addr, pEntry->P2pInfo.DevAddr, MAC_ADDR_LEN);\n\tRTMPMoveMemory(pP2pEntry->InterfaceAddr, pEntry->P2pInfo.InterfaceAddr, MAC_ADDR_LEN);\n\t/* Save the bssid with interface address. */\n\tRTMPMoveMemory(pP2pEntry->bssid, pEntry->P2pInfo.InterfaceAddr, MAC_ADDR_LEN);\n\tRTMPMoveMemory(pP2pEntry->PrimaryDevType, pEntry->P2pInfo.PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\tRTMPMoveMemory(pP2pEntry->DeviceName, pEntry->P2pInfo.DeviceName, 32);\n\tRTMPMoveMemory(pP2pEntry->SecondaryDevType, pEntry->P2pInfo.SecondaryDevType, P2P_DEVICE_TYPE_LEN);\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tCopy P2P Table's information to Mac Table when the P2P Device is in my group.\n\t\t\n\tParameters: \n\tNote:\n\t==========================================================================\n */\nVOID P2pCopyP2PTabtoMacTab(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tP2pindex,\n\tIN UCHAR\t\tMacindex)\n{\n\tMAC_TABLE_ENTRY  *pEntry;\n\tRT_P2P_CLIENT_ENTRY\t*pP2pEntry;\n\n\tif ((P2pindex >= MAX_P2P_GROUP_SIZE) || (Macindex >= MAX_LEN_OF_MAC_TABLE))\n\t\treturn;\n\n\tpEntry = &pAd->MacTab.Content[Macindex];\n\tpP2pEntry = &pAd->P2pTable.Client[P2pindex];\n\tpEntry->P2pInfo.CTWindow = pP2pEntry->CTWindow;\n\tpEntry->P2pInfo.P2pClientState = pP2pEntry->P2pClientState;\n\tpEntry->P2pInfo.P2pFlag = pP2pEntry->P2pFlag;\n\tpEntry->P2pInfo.NoAToken = pP2pEntry->NoAToken;\n\tpEntry->P2pInfo.GeneralToken = pP2pEntry->GeneralToken;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTab Add = %s. \\n\", decodeP2PClientState(pEntry->P2pInfo.P2pClientState)));\n\tpEntry->P2pInfo.ConfigMethod = pP2pEntry->ConfigMethod;\n\n\tpEntry->P2pInfo.DevCapability = pP2pEntry->DevCapability;\n\tpEntry->P2pInfo.GroupCapability = pP2pEntry->GroupCapability;\n\tpEntry->P2pInfo.NumSecondaryType = pP2pEntry->NumSecondaryType;\t\n\tpEntry->P2pInfo.DeviceNameLen = pP2pEntry->DeviceNameLen;\n\t\n\tRTMPMoveMemory(pEntry->P2pInfo.DevAddr, pP2pEntry->addr, MAC_ADDR_LEN);\n\tRTMPMoveMemory(pEntry->P2pInfo.InterfaceAddr, pP2pEntry->InterfaceAddr, MAC_ADDR_LEN);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTab InterfaceAddr = %x %x %x %x %x %x . \\n\", PRINT_MAC(pP2pEntry->InterfaceAddr)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTab DevAddr = %x %x %x  %x %x %x. \\n\", PRINT_MAC(pP2pEntry->addr)));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTab  DeviceNameLen = %ld . \\n\", pEntry->P2pInfo.DeviceNameLen));\n\tRTMPMoveMemory(pEntry->P2pInfo.PrimaryDevType, pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\tRTMPMoveMemory(pEntry->P2pInfo.DeviceName, pP2pEntry->DeviceName, 32);\n\tRTMPMoveMemory(pEntry->P2pInfo.SecondaryDevType, pP2pEntry->SecondaryDevType, P2P_DEVICE_TYPE_LEN);\n\tP2PPrintMac(pAd, Macindex);\n}\n\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tInit P2P Group Table.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGroupTabInit(\n\tIN PRTMP_ADAPTER pAd) \n{\n\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\t\ti;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGroupTabInit .  \\n\"));\n\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t{\t\t\n\t\tTab->Client[i].P2pClientState = P2PSTATE_NONE;\n\t\tTab->Client[i].Rule = P2P_IS_CLIENT;\n\t\tTab->Client[i].DevCapability = 0;\n\t\tTab->Client[i].GroupCapability = 0;\n\t\tRTMPZeroMemory(Tab->Client[i].addr, MAC_ADDR_LEN);\n\t\tRTMPZeroMemory(Tab->Client[i].bssid, MAC_ADDR_LEN);\n\t\tRTMPZeroMemory(Tab->Client[i].InterfaceAddr, MAC_ADDR_LEN);\n\t\tRTMPZeroMemory(Tab->Client[i].Ssid, MAX_LEN_OF_SSID);\n\t\tRTMPZeroMemory(Tab->Client[i].PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\tRTMPZeroMemory(Tab->Client[i].SecondaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\tRTMPZeroMemory(Tab->Client[i].DeviceName, P2P_DEVICE_NAME_LEN);\n\t\tTab->Client[i].DeviceNameLen = 0;\n\t\tTab->Client[i].SsidLen = 0;\n\t\tTab->Client[i].GoIntent = 0;\n\t\tTab->Client[i].OpChannel = 0;\n\t\tTab->Client[i].ListenChannel = 0;\n\t\tTab->Client[i].ConfigMethod = 0;\n\t\tTab->Client[i].P2pClientState = P2PSTATE_NONE;\n\t\tTab->Client[i].StateCount = 0;\n\t\tTab->Client[i].bValid = FALSE;\n\t\tTab->Client[i].ReTransmitCnt = 0;\n#ifdef WFD_SUPPORT\n        /* WFD */\n\tRTMPZeroMemory(&Tab->Client[i].WfdEntryInfo, sizeof(WFD_ENTRY_INFO));\n\tTab->Client[i].WfdEntryInfo.session_avail = WFD_SESSION_AVAILABLE;\n#endif /* WFD_SUPPORT */\n\t}\n\tTab->ClientNumber = 0;\n\treturn;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tClean P2P Group Table. If necessary, Send Disassociation\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pGroupTabDisconnect(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN bSendDeAuth) \n{\n\tPRT_P2P_CONFIG\tpP2PCtrl = &pAd->P2pCfg;\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry;\n\tUCHAR\t\ti;\n\t/*ULONG\t\tBytesRead, BytesNeeded; */\n\t/*MLME_QUEUE_ELEM\tMsgElem;*/\n\tMLME_QUEUE_ELEM\t*pMsgElem = NULL;\n\t/*MLME_DISASSOC_REQ_STRUCT DisReq;*/\n\tMLME_DEAUTH_REQ_STRUCT      DeAuthReq;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGroupTab  Disconnect All==> \\n\"));\n\t/*pMsgElem = &MsgElem;*/\n\tif (bSendDeAuth && P2P_CLI_ON(pAd))\n\t{\n\t\tos_alloc_mem(pAd, (UCHAR **)&pMsgElem, sizeof(MLME_QUEUE_ELEM));\n\n\t\tCOPY_MAC_ADDR(DeAuthReq.Addr, pP2PCtrl->PortCfg.Bssid);\n\t\tDeAuthReq.Reason = REASON_DEAUTH_STA_LEAVING;\n\t\tpMsgElem->MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT);\n\t\tNdisMoveMemory(pMsgElem->Msg, &DeAuthReq, sizeof(MLME_DEAUTH_REQ_STRUCT));\n\t\tMlmeDeauthReqAction(pAd, pMsgElem);\n\t\tos_free_mem(NULL, pMsgElem);\n\n\t\treturn;\t\t\n\t}\n\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t{\t\t\n\t\tpP2pEntry = &pAd->P2pTable.Client[i];\n\t\tif (pP2pEntry->P2pClientState >= P2PSTATE_CLIENT_OPERATING)\n\t\t{\n\t\n\t\t\t/* this Client is operating, need to send Disassociate frame disconnect. */\n\t\t\t/*Send dis_assoc & de_auth */\n\t\t\t/*\n\t\t\tCOPY_MAC_ADDR(&DisReq.Addr, pP2pEntry->addr);\n\t\t\tDisReq.Reason =  REASON_DISASSOC_STA_LEAVING;\n\t\t\tpMsgElem->Machine = ASSOC_STATE_MACHINE;\n\t\t\tpMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;\n\t\t\tpMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);\n\t\t\tpMsgElem->PortNum = pAd->PortList[pAd->P2pCfg.PortNumber]->PortNumber;\n\t\t\tNdisMoveMemory(pMsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));\n\n\t\t\tMlmeDisassocReqAction(pAd, pMsgElem);\n\t\t\t*/\n\t\t\tif (bSendDeAuth)\n\t\t\t{\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pMsgElem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\n\t\t\tCOPY_MAC_ADDR(DeAuthReq.Addr, pP2pEntry->addr);\n\t\t\tDeAuthReq.Reason = REASON_DEAUTH_STA_LEAVING;\n\t\t\tpMsgElem->MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT);\n\t\t\tNdisMoveMemory(pMsgElem->Msg, &DeAuthReq, sizeof(MLME_DEAUTH_REQ_STRUCT));\n\t\t\tMlmeDeauthReqAction(pAd, pMsgElem);\n\t\t\tos_free_mem(NULL, pMsgElem);\n\t\t\t}\n\t\t\t/* Delete this peer from table. */\n\t\t\tpP2pEntry->P2pClientState = P2PSTATE_NONE;\n\t\t\tRTMPZeroMemory(pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\tRTMPZeroMemory(pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\tRTMPZeroMemory(pP2pEntry->SecondaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\tRTMPZeroMemory(pP2pEntry->DeviceName, 32);\n\t\t\tpP2pEntry->NumSecondaryType = 0;\n\t\t\tpP2pEntry->DeviceNameLen = 0;\n\n\t\t\tRTMPZeroMemory(pP2pEntry->Ssid, 32);\n\t\t\tpP2pEntry->SsidLen = 0;\n\t\t\tpP2pEntry->GoIntent = 0;\n\t\t\tif (pAd->P2pTable.ClientNumber > 0)\n\t\t\t\tpAd->P2pTable.ClientNumber--;\n\t\t}\n\t}\n\n\treturn;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tinsert a peer to P2P Group Table. Because this Peer contains P2P IE and P2P Wildwork SSID to indicate that it support P2P\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR P2pGroupTabInsert(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr,\n\tIN P2P_CLIENT_STATE\tState,\n\tIN CHAR Ssid[], \n\tIN UCHAR SsidLen,\n\tIN UCHAR DevCap,\n\tIN UCHAR GrpCap)\n{\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\t\ti;\n\t\n\tRTMP_SEM_LOCK(&pAd->P2pTableSemLock);\n\t\n\tif (NdisEqualMemory(ZeroSsid, Addr, 6))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"P2pGroupTabInsert . Addr all zero Error. \\n\"));\n\t\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\t\treturn P2P_NOT_FOUND;\n\t}\n\tif ((Addr[0] & 0x1) == 0x1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"P2pGroupTabInsert . Insert mcast Addr Error. \\n\"));\n\t\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\t\treturn P2P_NOT_FOUND;\n\t}\n\t\n\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t{\t\t\n\t\t/* This peer already exist, so only update state. */\n\t\tif ((Tab->Client[i].P2pClientState != P2PSTATE_NONE) \n\t\t\t&& (RTMPEqualMemory(Tab->Client[i].addr, Addr, MAC_ADDR_LEN)))\n\t\t{\n\t\t\tif (State != P2PSTATE_NONE)\n\t\t\tTab->Client[i].P2pClientState = State;\n\t\t\tif ((SsidLen > 0) && (Ssid != NULL))\n\t\t\t\tRTMPMoveMemory(Tab->Client[i].Ssid, Ssid, 32);\n\t\t\tTab->Client[i].SsidLen = SsidLen;\n\n\t\t\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\t\t\treturn i;\n\t\t}\n\t\telse if (Tab->Client[i].P2pClientState == P2PSTATE_NONE)\n\t\t{\n\t\t\tTab->ClientNumber++;\n\t\t\tRTMPMoveMemory(Tab->Client[i].addr, Addr, 6);\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    P2pGroupTabInsert[%d] . Arrd[%02x:%02x:%02x:%02x:%02x:%02x] Update State = %s \\n\", i, Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], Addr[5], decodeP2PClientState(State)));\n\t\t\tTab->Client[i].P2pClientState = State;\n\t\t\tif ((SsidLen > 0) && (Ssid != NULL))\n\t\t\t\tRTMPMoveMemory(Tab->Client[i].Ssid, Ssid, 32);\n\t\t\tTab->Client[i].SsidLen = SsidLen;\n\t\t\tpAd->P2pTable.Client[i].Dbm = 0;\n\t\t\tpAd->P2pTable.Client[i].GoIntent = 0;\n\t\t\tpAd->P2pTable.Client[i].MyGOIndex = 0xff;\n\t\t\tpAd->P2pTable.Client[i].Peerip = 0;\n\t\t\tpAd->P2pTable.Client[i].ConfigTimeOut = 0;\n\t\t\tpAd->P2pTable.Client[i].OpChannel = 0;\n\t\t\tpAd->P2pTable.Client[i].ListenChannel = 0;\n\t\t\tpAd->P2pTable.Client[i].GeneralToken = RandomByte(pAd);\n\t\t\tpAd->P2pTable.Client[i].DevCapability = DevCap;\n\t\t\tpAd->P2pTable.Client[i].GroupCapability = GrpCap;\n\t\t\tpAd->P2pTable.Client[i].ReTransmitCnt = 0;\n\n\t\t\tif ((pAd->P2pTable.Client[i].GeneralToken == 0)\n\t\t\t\t || (pAd->P2pTable.Client[i].GeneralToken > 245))\n\t\t\t\t pAd->P2pTable.Client[i].GeneralToken = 6;\n\t\t\tpAd->P2pTable.Client[i].Dpid = DEV_PASS_ID_NOSPEC;\n\t\t\tpAd->P2pTable.Client[i].P2pFlag = 0;\n\t\t\tif (State == P2PSTATE_DISCOVERY_GO)\n\t\t\t\tpAd->P2pTable.Client[i].Rule = P2P_IS_GO;\n\t\t\telse\n\t\t\t\tpAd->P2pTable.Client[i].Rule = P2P_IS_CLIENT;\n\n\t\t\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\t\t\treturn i;\n\t\t}\n\t}\n\n\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\treturn P2P_NOT_FOUND;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tDelete a peer in P2P Group Table.  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR P2pGroupTabDelete(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR    p2pindex, \n\tIN PUCHAR    Addr) \n{\n\tUCHAR\tindex = 0xff;\n\tPRT_P2P_CLIENT_ENTRY\t\tpP2pEntry;\n\n\tRTMP_SEM_LOCK(&pAd->P2pTableSemLock);\n\n\tif ((p2pindex >= MAX_P2P_GROUP_SIZE) && (Addr != NULL))\n\t\tindex = P2pGroupTabSearch(pAd, Addr);\n\telse\n\t\tindex = p2pindex;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pGroupTabDelete . index = %d. \\n\", index));\n\tif (index < MAX_P2P_GROUP_SIZE)\n\t{\n\t\tpP2pEntry = &pAd->P2pTable.Client[index];\n\t\t/* Before connected, there is WPS provisioning process. */\n\t\t/* So maybe receive disassoc frame. but we can't delete p2p client entry . */\n\t\t/* So need to check P2pClientState is connected, then we can delete the entry. */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pGroupTabDelete  index %d.  search addr[3~5] is %x %x %x\\n\", index, Addr[3],Addr[4],Addr[5]));\n\t\t\n\t\tRTMPZeroMemory(pP2pEntry->addr, MAC_ADDR_LEN);\n\t\tRTMPZeroMemory(pP2pEntry->bssid, MAC_ADDR_LEN);\n\t\tRTMPZeroMemory(pP2pEntry->InterfaceAddr, MAC_ADDR_LEN);\n\t\t/* Assign a strange address first. */\n\t\tpP2pEntry->addr[3] = 0x55;\n\t\tpP2pEntry->bssid[3] = 0x55;\n\t\tpP2pEntry->InterfaceAddr[3] = 0x55;\n\t\tRTMPZeroMemory(pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\tRTMPZeroMemory(pP2pEntry->SecondaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\tRTMPZeroMemory(pP2pEntry->DeviceName, P2P_DEVICE_NAME_LEN);\n\t\tpP2pEntry->NumSecondaryType = 0;\n\t\tpP2pEntry->DeviceNameLen = 0;\n\t\tpP2pEntry->ConfigMethod = 0;\n\t\tpP2pEntry->OpChannel = 0;\n\t\tpP2pEntry->ListenChannel = 0;\n\t\tpP2pEntry->Dpid = DEV_PASS_ID_NOSPEC;\n\t\tpP2pEntry->MyGOIndex = 0xff;\n\t\tpP2pEntry->Peerip = 0;\n\t\tpP2pEntry->ConfigTimeOut = 0;\n\t\tpP2pEntry->Rule = P2P_IS_CLIENT;\n\n\t\tRTMPZeroMemory(pP2pEntry->Ssid, MAX_LEN_OF_SSID);\n\t\tpP2pEntry->SsidLen = 0;\n\t\tpP2pEntry->GoIntent = 0;\n\t\tif ((pAd->P2pTable.ClientNumber > 0) && (pP2pEntry->P2pClientState != P2PSTATE_NONE))\n\t\t\tpAd->P2pTable.ClientNumber--;\n\t\t\n\t\tpP2pEntry->P2pClientState = P2PSTATE_NONE;\n\t}\n\n\tRTMP_SEM_UNLOCK(&pAd->P2pTableSemLock);\n\t\n\treturn index;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSearch a peer in P2P Group Table by the same MAc Addr..  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR P2pGroupTabSearch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr) \n{\n\tUCHAR\ti;\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\tindex = P2P_NOT_FOUND;\n\tUCHAR           Allff[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tUCHAR           AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t/* find addr can't be 1. multicast, 2. all zero, 3. all 0xff */\n\tif ((Addr[0] & 0x1) == 0x1)\n\t\treturn index;\n\t\n\tif (NdisEqualMemory(Allff, Addr, MAC_ADDR_LEN))\n\t\treturn index;\n\n\tif (NdisEqualMemory(AllZero, Addr, MAC_ADDR_LEN))\n\t\treturn index;\n\n\tif (NdisEqualMemory(ZeroSsid, Addr, MAC_ADDR_LEN))\n\t\treturn index;\n\n\tfor (i = 0; i < MAX_P2P_GROUP_SIZE; i++)\n\t{\t\t\n\t\t/* If addr format is all zero or all 0xff or multicast, return before. So doesn't need to  */\n\t\t/* check invalid match here. */\n\t\tif (((NdisEqualMemory(Tab->Client[i].bssid, Addr, 6)) \n\t\t\t|| (NdisEqualMemory(Tab->Client[i].InterfaceAddr, Addr, 6))\n\t\t\t|| (NdisEqualMemory(Tab->Client[i].addr, Addr, 6)))\n\t\t\t&& (Tab->Client[i].P2pClientState > P2PSTATE_NONE))\n\t\t\tindex = i;\n\t}\n\n\treturn index;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tClean  in P2P Persistent Table.  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pPerstTabClean(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPRT_P2P_PERSISTENT_ENTRY\t\tpP2pPerstEntry;\n\tUCHAR\t\ti;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pPerstTabClean .  \\n\"));\n\n\tfor (i = 0; i < MAX_P2P_TABLE_SIZE; i++)\n\t{\t\t\n\t\tpP2pPerstEntry = &pAd->P2pTable.PerstEntry[i];\n\t\tRTMPZeroMemory(pP2pPerstEntry, sizeof(RT_P2P_PERSISTENT_ENTRY));\n\t\tpP2pPerstEntry->bValid = FALSE;\n\t}\n\tpAd->P2pTable.PerstNumber = 0;\n\treturn;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tInsert a peer into P2P Persistent Table.  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR P2pPerstTabInsert(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpAddr,\n\tIN PWSC_CREDENTIAL pProfile) \n{\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\t\ti, j;\n\tUCHAR\t\tindex = 0;\n\tWSC_CREDENTIAL\t*pPerstProfile;\n\t\n\tindex = P2pPerstTabSearch(pAd, pAddr, NULL, NULL);\n\t/* Doesn't have this entry. Add a new one. */\n\tif (index == P2P_NOT_FOUND)\n\t{\n\t\tfor (i = 0; i < MAX_P2P_TABLE_SIZE; i++)\n\t\t{\t\t\n\t\t\tif (Tab->PerstEntry[i].bValid == FALSE)\n\t\t\t{\n\t\t\t\tTab->PerstEntry[i].bValid = TRUE;\n\t\t\t\tTab->PerstNumber++;\n\t\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\t\tTab->PerstEntry[i].MyRule = P2P_IS_GO;\n\t\t\t\telse\n\t\t\t\t\tTab->PerstEntry[i].MyRule = P2P_IS_CLIENT;\n\t\t\t\t\n\t\t\t\tRTMPMoveMemory(Tab->PerstEntry[i].Addr, pAddr, MAC_ADDR_LEN);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::Registra MacAddr = %x %x %x %x %x %x \\n\",Tab->PerstEntry[i].Addr[0], Tab->PerstEntry[i].Addr[1], Tab->PerstEntry[i].Addr[2],Tab->PerstEntry[i].Addr[3],Tab->PerstEntry[i].Addr[4],Tab->PerstEntry[i].Addr[5]));\n\t\t\t\tRTMPMoveMemory(&Tab->PerstEntry[i].Profile, pProfile, sizeof(WSC_CREDENTIAL));\n\t\t\t\tpPerstProfile = &Tab->PerstEntry[i].Profile;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::SsidLen = %d\\n\",pPerstProfile->SSID.SsidLength));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::Ssid = %s.\\n\", pPerstProfile->SSID.Ssid));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::MacAddr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pPerstProfile->MacAddr)));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::AuthType = 0x%x. EncrType = %d\\n\",pPerstProfile->AuthType,pPerstProfile->EncrType));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::KeyIndex = %d\\n\",pPerstProfile->KeyIndex));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::KeyLength = %d\\n\",pPerstProfile->KeyLength));\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::Key ==>\\n\"));\n\t\t\t\tfor (j=0;j<16;)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"  0x%x 0x%x 0x%x 0x%x\\n\",\n\t\t\t\t\t\tpPerstProfile->Key[j], pPerstProfile->Key[j+1], pPerstProfile->Key[j+2],pPerstProfile->Key[j+3]));\n\t\t\t\t\tj = j+4;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::<===Key =\\n\"));\n\t\t\t\t/*DBGPRINT(RT_DEBUG_ERROR, (\"Perst::MacAddr = %x %x %x %x %x %x\\n\",pProfile->MacAddr[0], pProfile->MacAddr[1], pProfile->MacAddr[2],pProfile->MacAddr[3],pProfile->MacAddr[4],pProfile->MacAddr[5]));*/\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -P2pPerstTabInsert to index = %x. Rule = %s.\\n\", i, decodeMyRule(Tab->PerstEntry[i].MyRule)));\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\telse if (index < MAX_P2P_TABLE_SIZE)\n\t{\n\n\t\ti = index;\n\t\tTab->PerstEntry[i].bValid = TRUE;\n\t\tif (P2P_GO_ON(pAd))\n\t\t\tTab->PerstEntry[i].MyRule = P2P_IS_GO;\n\t\telse\n\t\t\tTab->PerstEntry[i].MyRule = P2P_IS_CLIENT;\n\t\tRTMPMoveMemory(Tab->PerstEntry[i].Addr, pAddr, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(&Tab->PerstEntry[i].Profile, pProfile, sizeof(WSC_CREDENTIAL));\n\t\tpPerstProfile = &Tab->PerstEntry[i].Profile;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::SsidLen = %d\\n\",pPerstProfile->SSID.SsidLength));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::Ssid = %c%c%c%c%c%c%c \\n\",\n\t\t\tpPerstProfile->SSID.Ssid[0],\n\t\t\tpPerstProfile->SSID.Ssid[1],\n\t\t\tpPerstProfile->SSID.Ssid[2],\n\t\t\tpPerstProfile->SSID.Ssid[3],\n\t\t\tpPerstProfile->SSID.Ssid[4],\n\t\t\tpPerstProfile->SSID.Ssid[5],\n\t\t\tpPerstProfile->SSID.Ssid[6]));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::AuthType = 0x%x. EncrType = %d\\n\",pPerstProfile->AuthType,pPerstProfile->EncrType));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::KeyIndex = %d\\n\",pPerstProfile->KeyIndex));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::KeyLength = %d\\n\",pPerstProfile->KeyLength));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::Key ==>\\n\"));\n\t\tfor (j=0;j<16;)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"  0x%x  0x%x 0x%x 0x%x\\n\",\n\t\t\t\tpPerstProfile->Key[j], pPerstProfile->Key[j+1], pPerstProfile->Key[j+2],pPerstProfile->Key[j+3]));\n\t\t\tj = j+4;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::<===Key =\\n\"));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Perst::MacAddr = %x %x %x %x %x %x\\n\",\n\t\t\tpPerstProfile->MacAddr[0], \n\t\t\tpPerstProfile->MacAddr[1], \n\t\t\tpPerstProfile->MacAddr[2],\n\t\t\tpPerstProfile->MacAddr[3],\n\t\t\tpPerstProfile->MacAddr[4],\n\t\t\tpPerstProfile->MacAddr[5]));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P -P2pPerstTabInsert update to index = %x.\\n\", i));\n\t\treturn i;\n\t}\n\tDBGPRINT(RT_DEBUG_ERROR, (\"P2P -P2pPerstTabInsert . PerstNumber = %d.\\n\", Tab->PerstNumber));\n\treturn index;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tDelete an entry  in P2P Persistent Table.  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR P2pPerstTabDelete(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t*pMacList) \n{\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\t\ti;\n\t\n\tfor (i = 0; i < MAX_P2P_TABLE_SIZE; i++)\n\t{\t\t\n\t\tif (Tab->PerstEntry[i].bValid == TRUE)\n\t\t{\n\t\t\tif (NdisEqualMemory(Tab->PerstEntry[i].Addr, pMacList, 6))\n\t\t\t{\n\t\t\t\tRTMPZeroMemory(&Tab->PerstEntry[i], sizeof(RT_P2P_PERSISTENT_ENTRY));\n\t\t\t\tTab->PerstEntry[i].bValid = FALSE;\n\n\t\t\t\tif (Tab->PerstNumber > 0)\n\t\t\t\t{\n\t\t\t\t\tTab->PerstNumber--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Persistent table count error. \\n\"));\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - Delete a Persistent Entry .Table Number = %d. \\n\",  Tab->PerstNumber));\n\t\t\t}\n\t\t\t\t\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn 0xff;\n\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSEarch an entry  in P2P Persistent Table.  All parameters must the same.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nUCHAR P2pPerstTabSearch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr,\n\tIN PUCHAR    Bssid,\n\tIN PUCHAR    InfAddr) \n{\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tUCHAR\ti;\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\tindex = P2P_NOT_FOUND;\n\tUCHAR           Allff[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tUCHAR           AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\tif (Addr && ((Addr[0] & 0x1) == 0x1))\n\t\treturn index;\n\t\n\tif (Addr && NdisEqualMemory(Allff, Addr, MAC_ADDR_LEN))\n\t\treturn index;\n\n\tif (Addr && NdisEqualMemory(AllZero, Addr, MAC_ADDR_LEN))\n\t\treturn index;\n\n\tfor (i = 0; i < MAX_P2P_TABLE_SIZE; i++)\n\t{\t\t\n\t\tif ((Tab->PerstEntry[i].bValid == TRUE) &&\n\t\t\t((Addr && NdisEqualMemory(&Tab->PerstEntry[i].Addr, Addr, MAC_ADDR_LEN)) ||\n\t\t\t (Bssid && NdisEqualMemory(&Tab->PerstEntry[i].Addr, Bssid, MAC_ADDR_LEN)) ||\n\t\t\t (InfAddr && NdisEqualMemory(&Tab->PerstEntry[i].Addr, InfAddr, MAC_ADDR_LEN)))\n\t\t\t)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" P2P - i = %d. \\n\", i));\n\t\t\tindex = i;\n\t\t}\n\t}\n\t\n\treturn index;\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tClean  in P2P Persistent Table.  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pCrednTabClean(\n\tIN PRTMP_ADAPTER pAd) \n{\n\n\tUCHAR\t\ti;\n\tRT_GO_CREDENTIAL_ENTRY\t*pCrednEntry;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"P2pCrednTabClean .  \\n\"));\n\n\tfor (i = 0; i < 2/*MAX_P2P_SAVECREDN_SIZE*/; i++)\n\t{\t\t\n\t\tpCrednEntry = &pAd->P2pTable.TempCredential[i];\n\t\tRTMPZeroMemory(pCrednEntry, sizeof(RT_GO_CREDENTIAL_ENTRY));\n\t\tpCrednEntry->bValid = FALSE;\n\t}\n\treturn;\n}\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tInsert a peer into P2P Persistent Table.  \n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nVOID P2pCrednTabInsert(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpAddr,\n\tIN WSC_CREDENTIAL\t*pProfile) \n{\n\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tUCHAR\t\ti = 0;\n\tUCHAR\t\tindex;\n\tBOOLEAN\t\t\tbExist;\n\n\tbExist = P2pCrednEntrySearch(pAd, pAddr, &index);\n\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - P2pCrednTabInsert \\n\"));\n\tif (bExist == FALSE)\n\t{\n\t\ti = (RandomByte(pAd))%2;\n\t\tif (i >= 2/*MAX_P2P_SAVECREDN_SIZE*/)\n\t\t\ti = 0;\n\n\t\tfor ( i = 0; i < 2/*MAX_P2P_SAVECREDN_SIZE*/;i++)\n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - P2pCrednTabInsert NEW\\n\"));\n\t\t\t\tTab->TempCredential[i].bValid = TRUE;\n\t\t\t\tRTMPMoveMemory(&Tab->TempCredential[i].Profile, pProfile, sizeof(WSC_CREDENTIAL));\n\t\t\t\tRTMPMoveMemory(&Tab->TempCredential[i].InterAddr, pAddr, MAC_ADDR_LEN);\n\t\t}\n\t}\n\telse if (index < 2/*MAX_P2P_SAVECREDN_SIZE*/)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - P2pCrednTabInsert Update Existing\\n\"));\n\t\tTab->TempCredential[index].bValid = TRUE;\n\t\tRTMPMoveMemory(&Tab->TempCredential[index].Profile, pProfile, sizeof(WSC_CREDENTIAL));\n\t\tRTMPMoveMemory(&Tab->TempCredential[index].InterAddr, pAddr, MAC_ADDR_LEN);\n\t}\n}\n\n/*\t\n\t==========================================================================\n\tDescription: \n\t\tSEarch an entry  in P2P Persistent Table.  All parameters must the same.\n\t\t\n\tParameters: \n\tNote:\n\t\t \n\t==========================================================================\n */\nBOOLEAN P2pCrednEntrySearch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr,\n\tIN PUCHAR\tResultIndex) \n{\n\n\tUCHAR\ti;\n\tPRT_P2P_TABLE\tTab = &pAd->P2pTable;\n\tBOOLEAN\t\tbFind = FALSE;\n\tUCHAR           Allff[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tUCHAR           AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\tif ((Addr[0] & 0x1) == 0x1)\n\t\treturn bFind;\n\t\n\tif (NdisEqualMemory(Allff, Addr, MAC_ADDR_LEN))\n\t\treturn bFind;\n\n\tif (NdisEqualMemory(AllZero, Addr, MAC_ADDR_LEN))\n\t\treturn bFind;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\" P2P - P2pCrednEntrySearch \\n\"));\n\tfor (i = 0; i < 2/*MAX_P2P_SAVECREDN_SIZE*/; i++)\n\t{\t\t\n\t\tif ((Tab->TempCredential[i].bValid == TRUE) \n\t\t\t&& NdisEqualMemory(&Tab->TempCredential[i].InterAddr, Addr, MAC_ADDR_LEN))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" Find Credential Entry - i = %d. \\n\", i));\n\t\t\tbFind = TRUE;\n\t\t\t*ResultIndex = i;\n\t\t}\n\t}\n\t\n\treturn bFind;\n}\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\nVOID P2pSendWirelessEvent(\n\tIN \tPRTMP_ADAPTER pAd,\n\tIN\tINT MsgType,\n\tIN\tPRT_P2P_CLIENT_ENTRY pP2pEntry,\n\tIN\tPUCHAR Addr)\n{\n\tRT_P2P_DEV_FOUND\tp2p_dev_info;\n\tRT_P2P_GROUP_INFO\tp2p_group_info;\n\tRT_P2P_PROV_DISC_RESP p2p_prov_disc_rsp;\n\tRT_P2P_GO_NEG_REQ_RX p2p_go_neg_req_rx;\n\tRT_P2P_AP_STA_CONNECTED_REPORT p2p_ap_sta_connected;\n\tUCHAR p2pIdx = P2P_NOT_FOUND;\n\tRT_P2P_ALL_INFO p2p_all_info;\n\n\tUINT32 rtsp_port = 0;\n\n\n\tif (pAd->P2pCfg.bSigmaEnabled == TRUE)\n\t\treturn;\n\n\tswitch (MsgType)\n\t{\n\t\tcase RT_P2P_DEVICE_FIND:\n\t\t/* Android Event format */\n\n\t\t/* P2P-DEVICE-FOUND fa:7b:7a:42:02:13 p2p_dev_addr=fa:7b:7a:42:02:13 pri_dev_type=1-0050F204-1\n\t\tname='p2p-TEST1' config_methods=0x188 dev_capab=0x27 group_capab=0x0 */\n\t\t\tRTMPZeroMemory(&p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\t\t\tif (Addr)\n\t\t\t\tRTMPMoveMemory(p2p_all_info.addr, Addr, MAC_ADDR_LEN);\n\t\t\tRTMPMoveMemory(p2p_all_info.dev_addr, pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\tRTMPMoveMemory(p2p_all_info.dev_name, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen);\n\t\t\tRTMPMoveMemory(p2p_all_info.pri_dev_type, pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\tp2p_all_info.config_methods = pP2pEntry->ConfigMethod;\n\t\t\tp2p_all_info.dev_capab = pP2pEntry->DevCapability;\n\t\t\tp2p_all_info.group_capab = pP2pEntry->GroupCapability;\n\t\t\tp2p_all_info.rssi = pP2pEntry->Rssi;\n\t\t\tp2p_all_info.supp_config_methods = pP2pEntry->ConfigMethod;//provision req will need.\n\t\t\t//p2p_all_info.ClientFlag;//cannot know the content at this stage.\n\t\t\tp2p_all_info.dev_passwd_id = pP2pEntry->Dpid;\n\t\t\t//p2p_all_info.Rule;//cannot decide rule content at this stage.\n\t\t\t//p2p_all_info.Bssid[MAC_ADDR_LEN];\n\t\t\t//p2p_all_info.Ssid[32];\n\t\t\tRTMPMoveMemory(p2p_all_info.peer, p2p_all_info.addr, MAC_ADDR_LEN);\n\t\t\t//p2p_all_info.WpaPsk[64];//we cannot decide wpapsk information at this stage.\n\t\t\tp2p_all_info.P2PChannel = pAd->CommonCfg.Channel;\n#if defined (WFD_SUPPORT) && defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t\t\t/* For HE event */\n\t\t\tp2p_all_info.bWfdClient = pP2pEntry->WfdEntryInfo.bWfdClient;\n\t\t\tif (pP2pEntry->WfdEntryInfo.bWfdClient)\n\t\t\t{\n\t\t\t\tp2p_all_info.wfd_devive_type = pP2pEntry->WfdEntryInfo.wfd_devive_type;\n\t\t\t\tp2p_all_info.source_coupled = pP2pEntry->WfdEntryInfo.source_coupled;\n\t\t\t\tp2p_all_info.session_avail = pP2pEntry->WfdEntryInfo.session_avail;\n\t\t\t\tp2p_all_info.sink_coupled = pP2pEntry->WfdEntryInfo.sink_coupled;\n\t\t\t\tp2p_all_info.wfd_service_discovery = pP2pEntry->WfdEntryInfo.wfd_service_discovery;\n\t\t\t\tp2p_all_info.wfd_PC = pP2pEntry->WfdEntryInfo.wfd_PC;\n\t\t\t\tp2p_all_info.wfd_CP = pP2pEntry->WfdEntryInfo.wfd_CP;\n\t\t\t\tp2p_all_info.wfd_time_sync = pP2pEntry->WfdEntryInfo.wfd_time_sync;\n\t\t\t\tp2p_all_info.rtsp_port = pP2pEntry->WfdEntryInfo.rtsp_port;\n\t\t\t\tp2p_all_info.max_throughput = pP2pEntry->WfdEntryInfo.max_throughput;\n\t\t\t\tRTMPMoveMemory(p2p_all_info.assoc_addr, pP2pEntry->WfdEntryInfo.assoc_addr, MAC_ADDR_LEN);\n\t\t\t\tp2p_all_info.coupled_sink_status.CoupledStat = pP2pEntry->WfdEntryInfo.coupled_sink_status.CoupledStat;\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_DEVICE_FIND, NULL, &p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\t\t\tbreak;\n\n\t\tcase RT_P2P_RECV_PROV_REQ:\n\t\t\t/* all P2P-PROV-DISC-REQ event format as below */\n\n\t\t\t/* P2P-PROV-DISC-SHOW-PIN 42:fc:89:e1:e2:27 44490607 p2p_dev_addr=42:fc:89:e1:e2:27\n\t\t\tpri_dev_type=1-0050F204-1 name='p2p-TEST2' config_methods=0x188 dev_capab=0x27\n\t\t\tgroup_capab=0x0 */\n\t\t\t/* P2P-PROV-DISC-PBC-REQ 42:fc:89:e1:e2:27 p2p_dev_addr=42:fc:89:e1:e2:27\n\t\t\tpri_dev_type=1-0050F204-1 name='p2p-TEST2' config_methods=0x188 dev_capab=0x27\n\t\t\tgroup_capab=0x0 */\n\t\t\t/* P2P-PROV-DISC-ENTER-PIN 42:fc:89:e1:e2:27 p2p_dev_addr=42:fc:89:e1:e2:27\n\t\t\tpri_dev_type=1-0050F204-1 name='p2p-TEST2' config_methods=0x188 dev_capab=0x27\n\t\t\tgroup_capab=0x0 */\n\t\t\t{\n\t\t\t\tPRT_P2P_CONFIG pP2pCtrl = &pAd->P2pCfg;\n\t\t\t\tRTMPZeroMemory(&p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\n\t\t\t\tif (Addr)\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.addr, Addr, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(p2p_all_info.dev_addr, pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(p2p_all_info.dev_name, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen);\n\t\t\t\tp2p_all_info.config_methods = pP2pCtrl->ConfigMethod;//we shall report my_config_method to upper layer.\n\t\t\t\tRTMPMoveMemory(p2p_all_info.pri_dev_type, pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\t\tp2p_all_info.dev_capab = pP2pEntry->DevCapability;\n\t\t\t\tp2p_all_info.group_capab = pP2pEntry->GroupCapability;\n\t\t\t\tp2p_all_info.rssi = pP2pEntry->Rssi;\n\t\t\t\tp2p_all_info.supp_config_methods = pP2pEntry->ConfigMethod;//provision req will need.\n\t\t\t\t//p2p_all_info.ClientFlag;//cannot know the content at this stage.\n\t\t\t\tp2p_all_info.dev_passwd_id = pP2pEntry->Dpid;\n\t\t\t\t//p2p_all_info.Rule;//cannot decide rule content at this stage.\n\t\t\t\t//p2p_all_info.Bssid[MAC_ADDR_LEN];\n\t\t\t\t//p2p_all_info.Ssid[32];\n\t\t\t\tRTMPMoveMemory(p2p_all_info.peer, p2p_all_info.addr, MAC_ADDR_LEN);\n\t\t\t\t//p2p_all_info.WpaPsk[64];//we cannot decide wpapsk information at this stage.\n\t\t\t\tp2p_all_info.P2PChannel = pAd->CommonCfg.Channel;\n#if defined (WFD_SUPPORT) && defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t\t\t\t/* For HE event */\n\t\t\t\tp2p_all_info.bWfdClient = pP2pEntry->WfdEntryInfo.bWfdClient;\n\t\t\t\tif (pP2pEntry->WfdEntryInfo.bWfdClient)\n\t\t\t\t{\n\t\t\t\t\tp2p_all_info.wfd_devive_type = pP2pEntry->WfdEntryInfo.wfd_devive_type;\n\t\t\t\t\tp2p_all_info.source_coupled = pP2pEntry->WfdEntryInfo.source_coupled;\n\t\t\t\t\tp2p_all_info.session_avail = pP2pEntry->WfdEntryInfo.session_avail;\n\t\t\t\t\tp2p_all_info.sink_coupled = pP2pEntry->WfdEntryInfo.sink_coupled;\n\t\t\t\t\tp2p_all_info.wfd_service_discovery = pP2pEntry->WfdEntryInfo.wfd_service_discovery;\n\t\t\t\t\tp2p_all_info.wfd_PC = pP2pEntry->WfdEntryInfo.wfd_PC;\n\t\t\t\t\tp2p_all_info.wfd_CP = pP2pEntry->WfdEntryInfo.wfd_CP;\n\t\t\t\t\tp2p_all_info.wfd_time_sync = pP2pEntry->WfdEntryInfo.wfd_time_sync;\n\t\t\t\t\tp2p_all_info.rtsp_port = pP2pEntry->WfdEntryInfo.rtsp_port;\n\t\t\t\t\tp2p_all_info.max_throughput = pP2pEntry->WfdEntryInfo.max_throughput;\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.assoc_addr, pP2pEntry->WfdEntryInfo.assoc_addr, MAC_ADDR_LEN);\n\t\t\t\t\tp2p_all_info.coupled_sink_status.CoupledStat = pP2pEntry->WfdEntryInfo.coupled_sink_status.CoupledStat;\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_RECV_PROV_REQ, NULL, &p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_P2P_RECV_PROV_RSP:\n\t\t\tRTMPMoveMemory(p2p_prov_disc_rsp.peer, pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\tp2p_prov_disc_rsp.config_methods = pP2pEntry->ConfigMethod;\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_RECV_PROV_RSP, NULL, &p2p_prov_disc_rsp, sizeof(RT_P2P_PROV_DISC_RESP));\n\t\t\tbreak;\n\n\t\tcase RT_P2P_RECV_INVITE_REQ:\n\t\t\t{\n\t\t\t\tPRT_P2P_CONFIG pP2pCtrl = &pAd->P2pCfg;\n\t\t\t\tRTMPZeroMemory(&p2p_dev_info, sizeof(RT_P2P_DEV_FOUND));\n\t\t\t\tprintk(\"RT_P2P_RECV_INVITE_REQ\\n\");\n\t\t\t\tif (Addr)\n\t\t\t\t\tRTMPMoveMemory(p2p_dev_info.addr, Addr, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(p2p_dev_info.dev_addr, pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(p2p_dev_info.dev_name, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen);\n\t\t\t\tRTMPMoveMemory(p2p_dev_info.pri_dev_type, pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\t\tp2p_prov_disc_rsp.config_methods = pP2pEntry->ConfigMethod;\n\t\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_RECV_INVITE_REQ, NULL, &p2p_dev_info, sizeof(RT_P2P_DEV_FOUND));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_P2P_RECV_GO_NEGO_REQ:\n\t\t\t{\n\t\t\t\t\t\t\tRTMPZeroMemory(&p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\n\t\t\t\tif (Addr)\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.addr, Addr, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(p2p_all_info.dev_addr, pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\t\tRTMPMoveMemory(p2p_all_info.dev_name, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen);\n\t\t\t\tp2p_all_info.config_methods = pP2pEntry->ConfigMethod;\n\t\t\t\tRTMPMoveMemory(p2p_all_info.pri_dev_type, pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN);\n\t\t\t\tp2p_all_info.dev_capab = pP2pEntry->DevCapability;\n\t\t\t\tp2p_all_info.group_capab = pP2pEntry->GroupCapability;\n\t\t\t\tp2p_all_info.rssi = pP2pEntry->Rssi;\n\t\t\t\tp2p_all_info.supp_config_methods = pP2pEntry->ConfigMethod;//provision req will need.\n\t\t\t\t//p2p_all_info.ClientFlag;//cannot know the content at this stage.\n\t\t\t\tp2p_all_info.dev_passwd_id = pP2pEntry->Dpid;\n\t\t\t\t//p2p_all_info.Rule;//cannot decide rule content at this stage.\n\t\t\t\t//p2p_all_info.Bssid[MAC_ADDR_LEN];\n\t\t\t\t//p2p_all_info.Ssid[32];\n\t\t\t\tRTMPMoveMemory(p2p_all_info.peer, p2p_all_info.addr, MAC_ADDR_LEN);\n\t\t\t\t//p2p_all_info.WpaPsk[64];//we cannot decide wpapsk information at this stage.\n\t\t\t\tp2p_all_info.P2PChannel = pAd->CommonCfg.Channel;\n#if defined (WFD_SUPPORT) && defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t\t\t\t/* For HE event */\n\t\t\t\tp2p_all_info.bWfdClient = pP2pEntry->WfdEntryInfo.bWfdClient;\n\t\t\t\tif (pP2pEntry->WfdEntryInfo.bWfdClient)\n\t\t\t\t{\n\t\t\t\t\tp2p_all_info.wfd_devive_type = pP2pEntry->WfdEntryInfo.wfd_devive_type;\n\t\t\t\t\tp2p_all_info.source_coupled = pP2pEntry->WfdEntryInfo.source_coupled;\n\t\t\t\t\tp2p_all_info.session_avail = pP2pEntry->WfdEntryInfo.session_avail;\n\t\t\t\t\tp2p_all_info.sink_coupled = pP2pEntry->WfdEntryInfo.sink_coupled;\n\t\t\t\t\tp2p_all_info.wfd_service_discovery = pP2pEntry->WfdEntryInfo.wfd_service_discovery;\n\t\t\t\t\tp2p_all_info.wfd_PC = pP2pEntry->WfdEntryInfo.wfd_PC;\n\t\t\t\t\tp2p_all_info.wfd_CP = pP2pEntry->WfdEntryInfo.wfd_CP;\n\t\t\t\t\tp2p_all_info.wfd_time_sync = pP2pEntry->WfdEntryInfo.wfd_time_sync;\n\t\t\t\t\tp2p_all_info.rtsp_port = pP2pEntry->WfdEntryInfo.rtsp_port;\n\t\t\t\t\tp2p_all_info.max_throughput = pP2pEntry->WfdEntryInfo.max_throughput;\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.assoc_addr, pP2pEntry->WfdEntryInfo.assoc_addr, MAC_ADDR_LEN);\n\t\t\t\t\tp2p_all_info.coupled_sink_status.CoupledStat = pP2pEntry->WfdEntryInfo.coupled_sink_status.CoupledStat;\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_RECV_GO_NEGO_REQ, NULL, &p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\t\t\t\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_P2P_GO_NEG_COMPLETED:\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_GO_NEG_COMPLETED, NULL, NULL, 0);\n\t\t\tbreak;\n\n\t\tcase RT_P2P_WPS_COMPLETED:\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_WPS_COMPLETED, NULL, NULL, 0);\n\t\t\tbreak;\n\n\t\tcase RT_P2P_CONNECTED:\n\t\t\t/*\n\t\t\t\tAndroid expect the below format in P2P Group OK.\n\n\t\t\t\tP2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid=\"DIRECT-W8\" freq=2437\n     \t\t\t\t[psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc | passphrase=\"fKG4jMe3\"]\n\t\t\t\tgo_dev_addr=fa:7b:7a:42:02:13\n\t\t\t*/\n\t\t\t{\n\t\t\t\tPWSC_CTRL\tpWScControl;\n\t\t\t\tRTMPZeroMemory(&p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\n\t\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tpWScControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\t\t\t\t\tp2p_all_info.Rule = 1;\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.Bssid, pAd->P2PCurrentAddress, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.Ssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].Ssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].SsidLen);\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.peer, pP2pEntry->addr, MAC_ADDR_LEN);\n\t\t\t\t //   RTMPMoveMemory(p2p_all_info.peer, Addr, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.WpaPsk, pWScControl->WpaPsk, 64);\n\t\t\t\t\tp2p_all_info.P2PChannel = pAd->CommonCfg.Channel;\n#if defined (WFD_SUPPORT) && defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t\t\t\t\t/* For HE event */\n\t\t\t\t\tp2p_all_info.bWfdClient = pP2pEntry->WfdEntryInfo.bWfdClient;\n\t\t\t\t\tif (pP2pEntry->WfdEntryInfo.bWfdClient)\n\t\t\t\t\t{\n\t\t\t\t\t\tp2p_all_info.wfd_devive_type = pP2pEntry->WfdEntryInfo.wfd_devive_type;\n\t\t\t\t\t\tp2p_all_info.source_coupled = pP2pEntry->WfdEntryInfo.source_coupled;\n\t\t\t\t\t\tp2p_all_info.session_avail = pP2pEntry->WfdEntryInfo.session_avail;\n\t\t\t\t\t\tp2p_all_info.sink_coupled = pP2pEntry->WfdEntryInfo.sink_coupled;\n\t\t\t\t\t\tp2p_all_info.wfd_service_discovery = pP2pEntry->WfdEntryInfo.wfd_service_discovery;\n\t\t\t\t\t\tp2p_all_info.wfd_PC = pP2pEntry->WfdEntryInfo.wfd_PC;\n\t\t\t\t\t\tp2p_all_info.wfd_CP = pP2pEntry->WfdEntryInfo.wfd_CP;\n\t\t\t\t\t\tp2p_all_info.wfd_time_sync = pP2pEntry->WfdEntryInfo.wfd_time_sync;\n\t\t\t\t\t\tp2p_all_info.rtsp_port = pP2pEntry->WfdEntryInfo.rtsp_port;\n\t\t\t\t\t\tp2p_all_info.max_throughput = pP2pEntry->WfdEntryInfo.max_throughput;\n\t\t\t\t\t\tRTMPMoveMemory(p2p_all_info.assoc_addr, pP2pEntry->WfdEntryInfo.assoc_addr, MAC_ADDR_LEN);\n\t\t\t\t\t\tp2p_all_info.coupled_sink_status.CoupledStat = pP2pEntry->WfdEntryInfo.coupled_sink_status.CoupledStat;\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::RTSP Port: %d, device_type: %d\\n\", __FUNCTION__, p2p_all_info.rtsp_port, p2p_all_info.wfd_devive_type));\n#endif /* WFD_SUPPORT */\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpWScControl = &pAd->ApCfg.ApCliTab[0].WscControl;\n\t\t\t\t\tp2p_all_info.Rule = 2;\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.Bssid, pAd->P2pCfg.Bssid, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.Ssid, pAd->P2pCfg.SSID, pAd->P2pCfg.SSIDLen);\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.peer, Addr, MAC_ADDR_LEN);\n\t\t\t\t\tRTMPMoveMemory(p2p_all_info.WpaPsk, pWScControl->WpaPsk, 64);\n\t\t\t\t\tp2p_all_info.P2PChannel = pAd->CommonCfg.Channel;\n#if defined (WFD_SUPPORT) && defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t\t\t\t\t/* For HE event */\n\t\t\t\t\tp2pIdx = P2pGroupTabSearch(pAd, Addr);\n\t\t\t\t\tif (p2pIdx < MAX_P2P_GROUP_SIZE) {\n                                                pP2pEntry = &pAd->P2pTable.Client[p2pIdx];\n\t\t\t\t\t\tp2p_all_info.bWfdClient = pP2pEntry->WfdEntryInfo.bWfdClient;\n\t\t\t\t\t\tif (pP2pEntry->WfdEntryInfo.bWfdClient)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tp2p_all_info.wfd_devive_type = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.wfd_devive_type;\n\t\t\t\t\t\t\tp2p_all_info.source_coupled = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.source_coupled;\n\t\t\t\t\t\t\tp2p_all_info.session_avail = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.session_avail;\n\t\t\t\t\t\t\tp2p_all_info.sink_coupled = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.sink_coupled;\n\t\t\t\t\t\t\tp2p_all_info.wfd_service_discovery = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.wfd_service_discovery;\n\t\t\t\t\t\t\tp2p_all_info.wfd_PC = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.wfd_PC;\n\t\t\t\t\t\t\tp2p_all_info.wfd_CP = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.wfd_CP;\n\t\t\t\t\t\t\tp2p_all_info.wfd_time_sync = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.wfd_time_sync;\n\t\t\t\t\t\t\tp2p_all_info.rtsp_port = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.rtsp_port;\n\t\t\t\t\t\t\tp2p_all_info.max_throughput = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.max_throughput;\n\t\t\t\t\t\t\tRTMPMoveMemory(p2p_all_info.assoc_addr, pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.assoc_addr, MAC_ADDR_LEN);\n\t\t\t\t\t\t\tp2p_all_info.coupled_sink_status.CoupledStat = pAd->P2pTable.Client[p2pIdx].WfdEntryInfo.coupled_sink_status.CoupledStat;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::RTSP Port: %d, device_type: %d\\n\", __FUNCTION__, p2p_all_info.rtsp_port, p2p_all_info.wfd_devive_type));\n#endif /* WFD_SUPPORT */\n\t\t\t\t}\n\t\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_CONNECTED, NULL, &p2p_all_info, sizeof(RT_P2P_ALL_INFO));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_P2P_DISCONNECTED:\n\t\t\t/*\n\t\t\t\tAndroid except below format for P2P-GROUP-REMOVE event\n\n   \t\t\t\tP2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED\n\t\t\t*/\n\t\t\tRTMPZeroMemory(&p2p_group_info, sizeof(RT_P2P_GROUP_INFO));\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\tp2p_group_info.Rule = 1;\n\t\t\telse\n\t\t\t\tp2p_group_info.Rule = 2;\n\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_DISCONNECTED, NULL, NULL, 0);\n\t\t\tbreak;\n\n\t\tcase RT_P2P_CONNECT_FAIL:\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_CONNECT_FAIL, NULL, NULL, 0);\n\t\t\tbreak;\n\n\t\tcase RT_P2P_LEGACY_CONNECTED:\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_LEGACY_CONNECTED, NULL, Addr, MAC_ADDR_LEN);\n\t\t\tbreak;\n\n\t\tcase RT_P2P_LEGACY_DISCONNECTED:\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_LEGACY_DISCONNECTED, NULL, Addr, MAC_ADDR_LEN);\n\t\t\tbreak;\n\n\t\tcase RT_P2P_AP_STA_CONNECTED:\n\t\t\t/*\n\t\t\t\tCarter: for now, I make all event format in Android 4.1 format.\n\n\t\t\t\tAndroid format as below when we are GO, and there is clinet/legacy station connected.\n\n\t\t\t\tin Android 4.0,\n\t\t\t\tAP-STA-CONNECTED 42:fc:89:a8:96:09\n\t\t\t\tin Android 4.1,\n\t\t\t\tAP-STA-CONNECTED 42:fc:89:a8:96:09 dev_addr=02:90:4c:a0:92:54\n\t\t\t*/\n\t\t\tRTMPZeroMemory(&p2p_ap_sta_connected, sizeof(RT_P2P_AP_STA_CONNECTED_REPORT));\n\n\t\t\tif (pP2pEntry != NULL) {\n\t\t\t\tRTMPMoveMemory(p2p_ap_sta_connected.dev_addr, Addr, MAC_ADDR_LEN);\n\t\t\t\tp2p_ap_sta_connected.ClientFlag = 1;\n\t\t\t}\n\n\t\t\tRTMPMoveMemory(p2p_ap_sta_connected.addr, Addr, MAC_ADDR_LEN);\n\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_AP_STA_CONNECTED, NULL, &p2p_ap_sta_connected, sizeof(RT_P2P_AP_STA_CONNECTED_REPORT));\n\t\t\tbreak;\n\n\t\tcase RT_P2P_AP_STA_DISCONNECTED:\n\t\t\t/*\n\t\t\t\tCarter: for now, I make the event format could fit in Android 4.1 format.\n\n\t\t\t\tAndroid format as below when we are GO, and there is clinet/legacy station connected.\n\n\t\t\t\tin Android 4.0,\n\t\t\t\tAP-STA-DISCONNECTED 42:fc:89:a8:96:09\n\t\t\t\tin Android 4.1,\n\t\t\t\tAP-STA-DISCONNECTED 42:fc:89:a8:96:09 dev_addr=02:90:4c:a0:92:54\n\t\t\t*/\n\t\t\tRTMPZeroMemory(&p2p_ap_sta_connected, sizeof(RT_P2P_AP_STA_CONNECTED_REPORT));\n\n\t\t\tif (pP2pEntry != NULL) {\n\t\t\t\tRTMPMoveMemory(p2p_ap_sta_connected.dev_addr, Addr, MAC_ADDR_LEN);\n\t\t\t\tp2p_ap_sta_connected.ClientFlag = 1;\n\t\t\t}\n\n\t\t\tRTMPMoveMemory(p2p_ap_sta_connected.addr, Addr, MAC_ADDR_LEN);\n\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_AP_STA_DISCONNECTED, NULL, &p2p_ap_sta_connected, sizeof(RT_P2P_AP_STA_CONNECTED_REPORT));\n\t\t\tbreak;\n\t\tcase RT_P2P_GO_NEGO_FAIL_INTENT:\n\t\t\tRtmpOSWrielessEventSend(pAd->p2p_dev, RT_WLAN_EVENT_CUSTOM, RT_P2P_GO_NEGO_FAIL_INTENT, NULL, Addr, MAC_ADDR_LEN);\n\t\t\tbreak;\n\t}\n}\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\n"
  },
  {
    "path": "src/common/ps.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n    Abstract:\n\n\tAll related POWER SAVE function body.\n\n***************************************************************************/\n\n#include \"rt_config.h\"\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tThis routine is used to do insert packet into power-saveing queue.\n\t\n\tArguments:\n\t\tpAd: Pointer to our adapter\n\t\tpPacket: Pointer to send packet\n\t\tpMacEntry: portint to entry of MacTab. the pMacEntry store attribute of client (STA).\n\t\tQueIdx: Priority queue idex.\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS:If succes to queue the packet into TxSwQueue.\n\t\tNDIS_STATUS_FAILURE: If failed to do en-queue.\n========================================================================\n*/\nNDIS_STATUS RtmpInsertPsQueue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket,\n\tIN MAC_TABLE_ENTRY *pMacEntry,\n\tIN UCHAR QueIdx)\n{\n\tULONG IrqFlags;\n#ifdef UAPSD_SUPPORT\n\t/* put the U-APSD packet to its U-APSD queue by AC ID */\n\tUINT32 ac_id = QueIdx - QID_AC_BE; /* should be >= 0 */\n\n\n\tif (UAPSD_MR_IS_UAPSD_AC(pMacEntry, ac_id))\n\t{\n\t\tUAPSD_PacketEnqueue(pAd, pMacEntry, pPacket, ac_id);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tTDLS_UAPSDP_TrafficIndSend(pAd, pMacEntry->Addr);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t}\n\telse\n#endif /* UAPSD_SUPPORT */\n\t{\n\t\tif (pMacEntry->PsQueue.Number >= MAX_PACKETS_IN_PS_QUEUE)\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\t\t\t\n\t\t\treturn NDIS_STATUS_FAILURE;\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"legacy ps> queue a packet!\\n\"));\n\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\tInsertTailQueue(&pMacEntry->PsQueue, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\t}\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* mark corresponding TIM bit in outgoing BEACON frame */\n#ifdef UAPSD_SUPPORT\n\tif (UAPSD_MR_IS_NOT_TIM_BIT_NEEDED_HANDLED(pMacEntry, QueIdx))\n\t{\n\t\t/* 1. the station is UAPSD station;\n\t\t2. one of AC is non-UAPSD (legacy) AC;\n\t\t3. the destinated AC of the packet is UAPSD AC. */\n\t\t/* So we can not set TIM bit due to one of AC is legacy AC */\n\t}\n\telse\n#endif /* UAPSD_SUPPORT */\n\t{\n\t\tWLAN_MR_TIM_BIT_SET(pAd, pMacEntry->apidx, pMacEntry->Aid);\n\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine is used to clean up a specified power-saving queue. It's\n\t\tused whenever a wireless client is deleted.\n\t==========================================================================\n */\nVOID RtmpCleanupPsQueue(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PQUEUE_HEADER   pQueue)\n{\n\tPQUEUE_ENTRY pEntry;\n\tPNDIS_PACKET pPacket;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RtmpCleanupPsQueue (0x%08lx)...\\n\", (ULONG)pQueue));\n\n\twhile (pQueue->Head)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"RtmpCleanupPsQueue %ld...\\n\",pQueue->Number));\n\n\t\tpEntry = RemoveHeadQueue(pQueue);\n\t\t/*pPacket = CONTAINING_RECORD(pEntry, NDIS_PACKET, MiniportReservedEx); */\n\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pEntry);\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RtmpCleanupPsQueue pkt = %lx...\\n\", (ULONG)pPacket));\n\t}\n}\n\n\n/*\n  ========================================================================\n  Description:\n\tThis routine frees all packets in PSQ that's destined to a specific DA.\n\tBCAST/MCAST in DTIMCount=0 case is also handled here, just like a PS-POLL \n\tis received from a WSTA which has MAC address FF:FF:FF:FF:FF:FF\n  ========================================================================\n*/\nVOID RtmpHandleRxPsPoll(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpAddr,\n\tIN\tUSHORT\t\t\tAid,\n    IN\tBOOLEAN\t\t\tisActive)\n{ \n\tPQUEUE_ENTRY\t  pEntry;\n\tPMAC_TABLE_ENTRY  pMacEntry;\n\tunsigned long\t\tIrqFlags;\n\n\t/*DBGPRINT(RT_DEBUG_TRACE,(\"rcv PS-POLL (AID=%d) from %02x:%02x:%02x:%02x:%02x:%02x\\n\", */\n\t/*\t  Aid, pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5])); */\n\n\tpMacEntry = &pAd->MacTab.Content[Aid];\n\tif (RTMPEqualMemory(pMacEntry->Addr, pAddr, MAC_ADDR_LEN))\n\t{\n\t\t/*\n\t\t\tSta is change to Power Active stat.\n\t\t\tReset ContinueTxFailCnt\n\t\t*/\n\t\tpMacEntry->ContinueTxFailCnt = 0;\n\n#ifdef UAPSD_SUPPORT\n\t\tif (UAPSD_MR_IS_ALL_AC_UAPSD(isActive, pMacEntry))\n\t\t{\n\t\t\t/*\n\t\t\t\tIEEE802.11e spec.\n\t\t\t\t11.2.1.7 Receive operation for STAs in PS mode during the CP\n\t\t\t\tWhen a non-AP QSTA that is using U-APSD and has all ACs\n\t\t\t\tdelivery-enabled detects that the bit corresponding to its AID\n\t\t\t\tis set in the TIM, the non-AP QSTA shall issue a trigger frame\n\t\t\t\tor a PS-Poll frame to retrieve the buffered MSDU or management\n\t\t\t\tframes.\n\n\t\t\t\tWMM Spec. v1.1a 070601\n\t\t\t\t3.6.2\tU-APSD STA Operation\n\t\t\t\t3.6.2.3\tIn case one or more ACs are not\n\t\t\t\tdelivery-enabled ACs, the WMM STA may retrieve MSDUs and\n\t\t\t\tMMPDUs belonging to those ACs by sending PS-Polls to the WMM AP.\n\t\t\t\tIn case all ACs are delivery enabled ACs, WMM STA should only\n\t\t\t\tuse trigger frames to retrieve MSDUs and MMPDUs belonging to\n\t\t\t\tthose ACs, and it should not send PS-Poll frames.\n\n\t\t\t\tDifferent definitions in IEEE802.11e and WMM spec.\n\t\t\t\tBut we follow the WiFi WMM Spec.\n\t\t\t*/\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"All AC are UAPSD, can not use PS-Poll\\n\"));\n\t\t\treturn; /* all AC are U-APSD, can not use PS-Poll */\n\t\t} /* End of if */\n#endif /* UAPSD_SUPPORT */\n\n\t\t/*NdisAcquireSpinLock(&pAd->MacTabLock); */\n\t\t/*NdisAcquireSpinLock(&pAd->TxSwQueueLock); */\n\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\tif (isActive == FALSE)\n\t\t{\n\t\t\tif (pMacEntry->PsQueue.Head)\n\t\t\t{\n#ifdef UAPSD_SUPPORT\n\t\t\t\tUINT32 NumOfOldPsPkt;\n\t\t\t\tNumOfOldPsPkt = pAd->TxSwQueue[QID_AC_BE].Number;\n#endif /* UAPSD_SUPPORT */\n\n\t\t\t\tpEntry = RemoveHeadQueue(&pMacEntry->PsQueue);\n\t\t\t\tif ( pMacEntry->PsQueue.Number >=1 )\n\t\t\t\t\tRTMP_SET_PACKET_MOREDATA(RTPKT_TO_OSPKT(pEntry), TRUE);\n\t\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QID_AC_BE], pEntry);\n\n#ifdef UAPSD_SUPPORT\n\t\t\t\t/* we need to call RTMPDeQueuePacket() immediately as below */\n\t\t\t\tif (NumOfOldPsPkt != pAd->TxSwQueue[QID_AC_BE].Number)\n\t\t\t\t{\n\t\t\t\t\tif (RTMP_GET_PACKET_DHCP(RTPKT_TO_OSPKT(pEntry)) ||\n\t\t\t\t\t\tRTMP_GET_PACKET_EAPOL(RTPKT_TO_OSPKT(pEntry)) ||\n\t\t\t\t\t\tRTMP_GET_PACKET_WAI(RTPKT_TO_OSPKT(pEntry)))\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tThese packets will use 1M/6M rate to send.\n\t\t\t\t\t\t\tIf you use 1M(2.4G)/6M(5G) to send, no statistics\n\t\t\t\t\t\t\tcount in NICUpdateFifoStaCounters().\n\n\t\t\t\t\t\t\tSo we can not count it for UAPSD; Or the SP will\n\t\t\t\t\t\t\tnot closed until timeout.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\t;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tUAPSD_MR_MIX_PS_POLL_RCV(pAd, pMacEntry);\n\t\t\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tor transmit a (QoS) Null Frame;\n\n\t\t\t\t\tIn addtion, in Station Keep Alive mechanism, we need to\n\t\t\t\t\tsend a QoS Null frame to detect the station live status.\n\t\t\t\t*/\n\t\t\t\tBOOLEAN bQosNull = FALSE;\n\n\t\t\t\tif (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))\n\t\t\t\t\tbQosNull = TRUE;\n\n\t\t\t\tRtmpEnqueueNullFrame(pAd, pMacEntry->Addr, pMacEntry->CurrTxRate,\n\t\t\t\t\t\t\t\t\t\tAid, pMacEntry->apidx, bQosNull, TRUE, 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n#ifdef UAPSD_SUPPORT\n\t\t\t/* deliver all queued UAPSD packets */\n\t\t\tUAPSD_AllPacketDeliver(pAd, pMacEntry);\n\n\t\t\t/* end the SP if exists */\n\t\t\tUAPSD_MR_ENTRY_RESET(pAd, pMacEntry);\n#endif /* UAPSD_SUPPORT */\n\n\t\t\twhile(pMacEntry->PsQueue.Head)\n\t\t\t{\n/*\t\t\t\tif (pAd->TxSwQueue[QID_AC_BE].Number <= */\n/*                    (pAd->PortCfg.TxQueueSize + (MAX_PACKETS_IN_PS_QUEUE>>1))) */\n\t\t\t\t{\n\t\t\t\t\tpEntry = RemoveHeadQueue(&pMacEntry->PsQueue);\n\t\t\t\t\tInsertTailQueueAc(pAd, pMacEntry, &pAd->TxSwQueue[QID_AC_BE], pEntry);\n\t\t\t\t}\n/*                else */\n/*\t\t\t\t\tbreak; */\n\t\t\t\t/* End of if */\n\t\t\t} /* End of while */\n\t\t} /* End of if */\n\n\t\t/*NdisReleaseSpinLock(&pAd->TxSwQueueLock); */\n\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock); */\n\n\t\tif ((Aid > 0) && (Aid < MAX_LEN_OF_MAC_TABLE) &&\n\t\t\t(pMacEntry->PsQueue.Number == 0))\n\t\t{\n\t\t\t/* clear corresponding TIM bit because no any PS packet */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pMacEntry->apidx, Aid);\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tpMacEntry->PsQIdleCount = 0;\n\t\t}\n\n\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\n\t\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\t\t/* TODO: 2004-12-27 it's not a good idea to handle \"More Data\" bit here. because the */\n\t\t/* RTMPDeQueue process doesn't guarantee to de-queue the desired MSDU from the corresponding */\n\t\t/* TxSwQueue/PsQueue when QOS in-used. We should consider \"HardTransmt\" this MPDU */\n\t\t/* using MGMT queue or things like that. */\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"rcv PS-POLL (AID=%d not match) from %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t  Aid, pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5]));\n\n\t}\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tUpdate the station current power save mode. Calling this routine also\n\t\tprove the specified client is still alive. Otherwise AP will age-out\n\t\tthis client once IdleCount exceeds a threshold.\n\t==========================================================================\n */\nBOOLEAN RtmpPsIndicate(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pAddr, \n\tIN ULONG Wcid, \n\tIN UCHAR Psm) \n{\n\tMAC_TABLE_ENTRY *pEntry;\n    UCHAR old_psmode;\n\n\tif (Wcid >= MAX_LEN_OF_MAC_TABLE)\n\t{\n\t\treturn PWR_ACTIVE;\t\n\t}\n\n\tpEntry = &pAd->MacTab.Content[Wcid];\n\told_psmode = pEntry->PsMode;\n/*\tif (pEntry) */\n\t{\n\t\t/*\n\t\t\tChange power save mode first because we will call\n\t\t\tRTMPDeQueuePacket() in RtmpHandleRxPsPoll().\n\n\t\t\tOr when Psm = PWR_ACTIVE, we will not do Aggregation in\n\t\t\tRTMPDeQueuePacket().\n\t\t*/\n\t\tpEntry->NoDataIdleCount = 0;\n\t\tpEntry->PsMode = Psm;\n\n\t\tif ((old_psmode == PWR_ACTIVE) && (Psm == PWR_SAVE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"RtmpPsIndicate - %02x:%02x:%02x:%02x:%02x:%02x sleep!\\n\",\n\t\t\t\t\tpAddr[0],pAddr[1],pAddr[2],pAddr[3],pAddr[4],pAddr[5]));\n\t\t}\n\n\t\tif ((old_psmode == PWR_SAVE) && (Psm == PWR_ACTIVE))\n\t\t{\n\t\t\t/* TODO: For RT2870, how to handle about the BA when STA in PS mode???? */\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"RtmpPsIndicate - %02x:%02x:%02x:%02x:%02x:%02x wakes up, \"\n\t\t\t\t\t\"act like rx PS-POLL\\n\",\n\t\t\t\t\tpAddr[0],pAddr[1],pAddr[2],pAddr[3],pAddr[4],pAddr[5]));\n\n\t\t\t/* sleep station awakes, move all pending frames from PSQ to TXQ if any */\n\t\t\tRtmpHandleRxPsPoll(pAd, pAddr, pEntry->Aid, TRUE);\n\t\t}\n\n\t\t/* move to above section */\n/*\t\tpEntry->NoDataIdleCount = 0; */\n/*\t\tpEntry->PsMode = Psm; */\n\t} \n/*\telse */\n/*\t{ */\n\t\t/* not in table, try to learn it ???? why bother? */\n/*\t} */\n\treturn old_psmode;\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    Check if PM of any packet is set.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n    TRUE\tcan set\n\tFALSE\tcan not set\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpPktPmBitCheck(\n    IN  PRTMP_ADAPTER       pAd)\n{\n\tBOOLEAN FlgCanPmBitSet = TRUE;\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t/* check TDLS condition */\n\tif (pAd->StaCfg.TdlsInfo.TdlsFlgIsKeepingActiveCountDown == TRUE)\n\t\tFlgCanPmBitSet = FALSE;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\tif (FlgCanPmBitSet == TRUE)\n\t\treturn (pAd->StaCfg.Psm == PWR_SAVE);\n\n\treturn FALSE;\n}\n\n\nVOID RtmpPsActiveExtendCheck(\n\tIN PRTMP_ADAPTER\t\tpAd)\n{\n\t/* count down the TDLS active counter */\n#ifdef DOT11Z_TDLS_SUPPORT\n\tif (pAd->StaCfg.TdlsInfo.TdlsPowerSaveActiveCountDown > 0)\n\t{\n\t\tpAd->StaCfg.TdlsInfo.TdlsPowerSaveActiveCountDown --;\n\n\t\tif (pAd->StaCfg.TdlsInfo.TdlsPowerSaveActiveCountDown == 0)\n\t\t{\n\t\t\t/* recover our power save state */\n\t\t\tTDLS_RECOVER_POWER_SAVE(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS PS> Recover PS mode!\\n\"));\n\t\t}\n\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n}\n\n\nVOID RtmpPsModeChange(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN UINT32\t\t\t\tPsMode)\n{\n\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t{\n\t\t/* reset ps mode */\n\t\tif (PsMode == Ndis802_11PowerModeMAX_PSP)\n\t\t{\n\t\t\t// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()\n\t\t\t// to exclude certain situations.\n\t\t\t//\t   MlmeSetPsm(pAd, PWR_SAVE);\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;\n\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;\n\t\t\tpAd->StaCfg.DefaultListenCount = 5;\n\t\t}\t\t\t\t\t\t\t\n\t\telse if (PsMode == Ndis802_11PowerModeFast_PSP)\n\t\t{\n\t\t\t// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()\n\t\t\t// to exclude certain situations.\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;\n\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;\n\t\t\tpAd->StaCfg.DefaultListenCount = 3;\n\t\t}\n\t\telse if (PsMode == Ndis802_11PowerModeLegacy_PSP)\n\t\t{\n\t\t\t// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()\n\t\t\t// to exclude certain situations.\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;\n\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tpAd->StaCfg.DefaultListenCount = 1;\n#else\n\t\t\tpAd->StaCfg.DefaultListenCount = 3;\n#endif // DOT11Z_TDLS_SUPPORT //\n\t\t}\n\t\telse\n\t\t{ //Default Ndis802_11PowerModeCAM\n\t\t\t// clear PSM bit immediately\n\t\t\tRTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\t\t\tif (pAd->StaCfg.bWindowsACCAMEnable == FALSE)\n\t\t\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;\n\t\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;\n\t\t}\n\n\t\t/* change ps mode */\n\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, FALSE);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PSMode=%ld\\n\", pAd->StaCfg.WindowsPowerMode));\n\t}\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n"
  },
  {
    "path": "src/common/rt_channel.c",
    "content": "/*\n\n*/\n#include \"rt_config.h\"\n\n\nCH_FREQ_MAP CH_HZ_ID_MAP[]=\n\t\t{\n\t\t\t{1, 2412},\n\t\t\t{2, 2417},\n\t\t\t{3, 2422},\n\t\t\t{4, 2427},\n\t\t\t{5, 2432},\n\t\t\t{6, 2437},\n\t\t\t{7, 2442},\n\t\t\t{8, 2447},\n\t\t\t{9, 2452},\n\t\t\t{10, 2457},\n\t\t\t{11, 2462},\n\t\t\t{12, 2467},\n\t\t\t{13, 2472},\n\t\t\t{14, 2484},\n\n\t\t\t/*  UNII */\n\t\t\t{36, 5180},\n\t\t\t{40, 5200},\n\t\t\t{44, 5220},\n\t\t\t{48, 5240},\n\t\t\t{52, 5260},\n\t\t\t{56, 5280},\n\t\t\t{60, 5300},\n\t\t\t{64, 5320},\n\t\t\t{149, 5745},\n\t\t\t{153, 5765},\n\t\t\t{157, 5785},\n\t\t\t{161, 5805},\n\t\t\t{165, 5825},\n\t\t\t{167, 5835},\n\t\t\t{169, 5845},\n\t\t\t{171, 5855},\n\t\t\t{173, 5865},\n\t\t\t\t\t\t\n\t\t\t/* HiperLAN2 */\n\t\t\t{100, 5500},\n\t\t\t{104, 5520},\n\t\t\t{108, 5540},\n\t\t\t{112, 5560},\n\t\t\t{116, 5580},\n\t\t\t{120, 5600},\n\t\t\t{124, 5620},\n\t\t\t{128, 5640},\n\t\t\t{132, 5660},\n\t\t\t{136, 5680},\n\t\t\t{140, 5700},\n\t\t\t\t\t\t\n\t\t\t/* Japan MMAC */\n\t\t\t{34, 5170},\n\t\t\t{38, 5190},\n\t\t\t{42, 5210},\n\t\t\t{46, 5230},\n\t\t\t\t\t\n\t\t\t/*  Japan */\n\t\t\t{184, 4920},\n\t\t\t{188, 4940},\n\t\t\t{192, 4960},\n\t\t\t{196, 4980},\n\t\t\t\n\t\t\t{208, 5040},\t/* Japan, means J08 */\n\t\t\t{212, 5060},\t/* Japan, means J12 */   \n\t\t\t{216, 5080},\t/* Japan, means J16 */\n};\n\nINT\tCH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP)/sizeof(CH_FREQ_MAP));\n\nCH_DESC Country_Region0_ChDesc_2GHZ[] =\n{\n\t{1, 11, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region1_ChDesc_2GHZ[] =\n{\n\t{1, 13, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region2_ChDesc_2GHZ[] =\n{\n\t{10, 2, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region3_ChDesc_2GHZ[] =\n{\n\t{10, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region4_ChDesc_2GHZ[] =\n{\n\t{14, 1, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region5_ChDesc_2GHZ[] =\n{\n\t{1, 14, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region6_ChDesc_2GHZ[] =\n{\n\t{3, 7, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region7_ChDesc_2GHZ[] =\n{\n\t{5, 9, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region31_ChDesc_2GHZ[] =\n{\n\t{1, 11, CHANNEL_DEFAULT_PROP},\n\t{12, 3, CHANNEL_PASSIVE_SCAN},\n\t{}\n};\n\nCH_DESC Country_Region32_ChDesc_2GHZ[] =\n{\n\t{1, 11, CHANNEL_DEFAULT_PROP},\n\t{12, 2, CHANNEL_PASSIVE_SCAN},\t\n\t{}\n};\n\nCH_DESC Country_Region33_ChDesc_2GHZ[] =\n{\n\t{1, 14, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCOUNTRY_REGION_CH_DESC Country_Region_ChDesc_2GHZ[] =\n{\n\t{REGION_0_BG_BAND, Country_Region0_ChDesc_2GHZ},\n\t{REGION_1_BG_BAND, Country_Region1_ChDesc_2GHZ},\n\t{REGION_2_BG_BAND, Country_Region2_ChDesc_2GHZ},\n\t{REGION_3_BG_BAND, Country_Region3_ChDesc_2GHZ},\n\t{REGION_4_BG_BAND, Country_Region4_ChDesc_2GHZ},\n\t{REGION_5_BG_BAND, Country_Region5_ChDesc_2GHZ},\n\t{REGION_6_BG_BAND, Country_Region6_ChDesc_2GHZ},\n\t{REGION_7_BG_BAND, Country_Region7_ChDesc_2GHZ},\n\t{REGION_31_BG_BAND, Country_Region31_ChDesc_2GHZ},\n\t{REGION_32_BG_BAND, Country_Region32_ChDesc_2GHZ},\n\t{REGION_33_BG_BAND, Country_Region33_ChDesc_2GHZ},\n\t{}\n};\n\nUINT16 const Country_Region_GroupNum_2GHZ = sizeof(Country_Region_ChDesc_2GHZ) / sizeof(COUNTRY_REGION_CH_DESC);\n\nCH_DESC Country_Region0_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{149, 5, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region1_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 11, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region2_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{}\t\n};\n\nCH_DESC Country_Region3_ChDesc_5GHZ[] =\n{\n\t{52, 4, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region4_ChDesc_5GHZ[] =\n{\n\t{149, 5, CHANNEL_DEFAULT_PROP},\n\t{}\n};\nCH_DESC Country_Region5_ChDesc_5GHZ[] =\n{\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region6_ChDesc_5GHZ[] =\n{\n\t{36, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region7_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 11, CHANNEL_DEFAULT_PROP},\n\t{149, 7, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region8_ChDesc_5GHZ[] =\n{\n\t{52, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region9_ChDesc_5GHZ[] =\n{\n\t{36, 8 , CHANNEL_DEFAULT_PROP},\n\t{100, 5, CHANNEL_DEFAULT_PROP},\n\t{132, 3, CHANNEL_DEFAULT_PROP},\n\t{149, 5, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region10_ChDesc_5GHZ[] =\n{\n\t{36,4, CHANNEL_DEFAULT_PROP},\n\t{149, 5, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region11_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 6, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\t\t\n};\n\nCH_DESC Country_Region12_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 11, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region13_ChDesc_5GHZ[] =\n{\n\t{52, 4, CHANNEL_DEFAULT_PROP},\n\t{100, 11, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\t\n};\n\nCH_DESC Country_Region14_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 5, CHANNEL_DEFAULT_PROP},\n\t{136, 2, CHANNEL_DEFAULT_PROP},\n\t{149, 5, CHANNEL_DEFAULT_PROP},\n\t{}\t\n};\n\nCH_DESC Country_Region15_ChDesc_5GHZ[] =\n{\n\t{149, 7, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region16_ChDesc_5GHZ[] =\n{\n\t{52, 4, CHANNEL_DEFAULT_PROP},\n\t{149, 5, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region17_ChDesc_5GHZ[] =\n{\n\t{36, 4, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region18_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 5, CHANNEL_DEFAULT_PROP},\n\t{132, 3, CHANNEL_DEFAULT_PROP},\n\t{}\t\n};\n\nCH_DESC Country_Region19_ChDesc_5GHZ[] =\n{\n\t{56, 3, CHANNEL_DEFAULT_PROP},\n\t{100, 11, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\n};\n\nCH_DESC Country_Region20_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 7, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\t\t\n};\n\nCH_DESC Country_Region21_ChDesc_5GHZ[] =\n{\n\t{36, 8, CHANNEL_DEFAULT_PROP},\n\t{100, 11, CHANNEL_DEFAULT_PROP},\n\t{149, 4, CHANNEL_DEFAULT_PROP},\n\t{}\t\t\n};\n\n\nCOUNTRY_REGION_CH_DESC Country_Region_ChDesc_5GHZ[] =\n{\n\t{REGION_0_A_BAND, Country_Region0_ChDesc_5GHZ},\n\t{REGION_1_A_BAND, Country_Region1_ChDesc_5GHZ},\n\t{REGION_2_A_BAND, Country_Region2_ChDesc_5GHZ},\n\t{REGION_3_A_BAND, Country_Region3_ChDesc_5GHZ},\n\t{REGION_4_A_BAND, Country_Region4_ChDesc_5GHZ},\n\t{REGION_5_A_BAND, Country_Region5_ChDesc_5GHZ},\n\t{REGION_6_A_BAND, Country_Region6_ChDesc_5GHZ},\n\t{REGION_7_A_BAND, Country_Region7_ChDesc_5GHZ},\n\t{REGION_8_A_BAND, Country_Region8_ChDesc_5GHZ},\n\t{REGION_9_A_BAND, Country_Region9_ChDesc_5GHZ},\n\t{REGION_10_A_BAND, Country_Region10_ChDesc_5GHZ},\n\t{REGION_11_A_BAND, Country_Region11_ChDesc_5GHZ},\n\t{REGION_12_A_BAND, Country_Region12_ChDesc_5GHZ},\n\t{REGION_13_A_BAND, Country_Region13_ChDesc_5GHZ},\n\t{REGION_14_A_BAND, Country_Region14_ChDesc_5GHZ},\n\t{REGION_15_A_BAND, Country_Region15_ChDesc_5GHZ},\n\t{REGION_16_A_BAND, Country_Region16_ChDesc_5GHZ},\n\t{REGION_17_A_BAND, Country_Region17_ChDesc_5GHZ},\n\t{REGION_18_A_BAND, Country_Region18_ChDesc_5GHZ},\n\t{REGION_19_A_BAND, Country_Region19_ChDesc_5GHZ},\n\t{REGION_20_A_BAND, Country_Region20_ChDesc_5GHZ},\n\t{REGION_21_A_BAND, Country_Region21_ChDesc_5GHZ},\n\t{}\n};\n\nUINT16 const Country_Region_GroupNum_5GHZ = sizeof(Country_Region_ChDesc_5GHZ) / sizeof(COUNTRY_REGION_CH_DESC);\n\nUINT16 TotalChNum(PCH_DESC pChDesc)\n{\n\tUINT16 TotalChNum = 0;\n\t\n\twhile(pChDesc->FirstChannel)\n\t{\n\t\tTotalChNum += pChDesc->NumOfCh;\n\t\tpChDesc++;\n\t}\n\t\n\treturn TotalChNum;\n}\n\nUCHAR GetChannel_5GHZ(PCH_DESC pChDesc, UCHAR index)\n{\n\twhile (pChDesc->FirstChannel)\n\t{\n\t\tif (index < pChDesc->NumOfCh)\n\t\t\treturn pChDesc->FirstChannel + index * 4;\n\t\telse\n\t\t{\n\t\t\tindex -= pChDesc->NumOfCh;\n\t\t\tpChDesc++;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nUCHAR GetChannel_2GHZ(PCH_DESC pChDesc, UCHAR index)\n{\n\n\twhile (pChDesc->FirstChannel)\n\t{\n\t\tif (index < pChDesc->NumOfCh)\n\t\t\treturn pChDesc->FirstChannel + index;\n\t\telse\n\t\t{\n\t\t\tindex -= pChDesc->NumOfCh;\n\t\t\tpChDesc++;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nUCHAR GetChannelFlag(PCH_DESC pChDesc, UCHAR index)\n{\n\n\twhile (pChDesc->FirstChannel)\n\t{\n\t\tif (index < pChDesc->NumOfCh)\n\t\t\treturn pChDesc->ChannelProp;\n\t\telse\n\t\t{\n\t\t\tindex -= pChDesc->NumOfCh;\n\t\t\tpChDesc++;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\n/*Albania*/\nCH_DESP Country_AL_ChDesp[] =\n{\n\t{ 1, 13, 20, BOTH, FALSE},  \t/*2402~2482MHz, Ch 1~13, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Algeria*/\nCH_DESP Country_DZ_ChDesp[] =\n{\n\t{ 1, 13, 20, BOTH, FALSE},  \t/*2402~2482MHz, Ch 1~13, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Argentina*/\t\t\nCH_DESP Country_AR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13, Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Armenia*/\t\nCH_DESP Country_AM_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 18, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 18, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Aruba*/\t\nCH_DESP Country_AW_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Australia*/\t\nCH_DESP Country_AU_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Austria*/\t\nCH_DESP Country_AT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Azerbaijan*/\t\nCH_DESP Country_AZ_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 18, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 18, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Bahrain*/\t\nCH_DESP Country_BH_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 20, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Bangladesh*/\t\nCH_DESP Country_BD_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Barbados*/\t\nCH_DESP Country_BB_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Belarus*/\t\nCH_DESP Country_BY_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Belgium*/\t\nCH_DESP Country_BE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Belize*/\t\nCH_DESP Country_BZ_ChDesp[] =\n{\n\t{ 1,   13, 30, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Bolivia*/\t\nCH_DESP Country_BO_ChDesp[] =\n{\n\t{ 1,   13, 30, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Bosnia and Herzegovina*/\t\nCH_DESP Country_BA_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Brazil*/\t\nCH_DESP Country_BR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Brunei Darussalam*/\t\nCH_DESP Country_BN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Bulgaria*/\t\nCH_DESP Country_BG_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   2, 23, BOTH, TRUE}, \t/*5250~5290MHz, Ch 52~56, Max BW: 40 */\n\t{ 100, 11, 30, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Cambodia*/\t\nCH_DESP Country_KH_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Canada*/\t\nCH_DESP Country_CA_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */ \n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Chile*/\t\nCH_DESP Country_CL_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 20, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*China*/\t\t\nCH_DESP Country_CN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Colombia*/\t\t\nCH_DESP Country_CO_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Costa Rica*/\t\t\nCH_DESP Country_CR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Croatia*/\t\t\nCH_DESP Country_HR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Cyprus*/\t\t\nCH_DESP Country_CY_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */ \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Czech Republic*/\t\t\nCH_DESP Country_CZ_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2400~2483.5MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, IDOR, FALSE},\t/*5150~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5350MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5470~5725MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Denmark*/\t\t\nCH_DESP Country_DK_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Dominican Republic*/\t\t\nCH_DESP Country_DO_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Ecuador*/\t\t\nCH_DESP Country_EC_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Egypt*/\t\t\nCH_DESP Country_EG_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*El Salvador*/\t\t\nCH_DESP Country_SV_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Estonia*/\t\t\nCH_DESP Country_EE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Finland*/\t\t\nCH_DESP Country_FI_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*France*/\t\t\nCH_DESP Country_FR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Georgia*/\t\t\nCH_DESP Country_GE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 18, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 18, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Germany*/\t\t\nCH_DESP Country_DE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2400~2483.5MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5150~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5350MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5470~5725MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Greece*/\t\t\nCH_DESP Country_GR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Greenland*/\t\t\nCH_DESP Country_GL_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Grenada*/\t\t\nCH_DESP Country_GD_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Guam*/\t\t\nCH_DESP Country_GU_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Guatemala*/\t\t\nCH_DESP Country_GT_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Haiti*/\t\t\nCH_DESP Country_HT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Honduras*/\t\t\nCH_DESP Country_HN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Hong Kong*/\t\t\nCH_DESP Country_HK_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Hungary*/\t\t\nCH_DESP Country_HU_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,  Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Iceland*/\t\t\nCH_DESP Country_IS_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*India*/\t\t\nCH_DESP Country_IN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 20, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Indonesia*/\t\t\nCH_DESP Country_ID_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Iran, Islamic Republic of*/\t\t\nCH_DESP Country_IR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Ireland*/\t\t\nCH_DESP Country_IE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Israel*/\t\t\nCH_DESP Country_IL_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, IDOR, FALSE},\t/*5150~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, IDOR, TRUE}, \t/*5250~5350MHz, Ch 52~64, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Italy*/\t\t\nCH_DESP Country_IT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Jamaica*/\t\t\nCH_DESP Country_JM_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Japan*/\t\t\nCH_DESP Country_JP_ChDesp[] =\n{\n\t{ 1,    14, 20, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 20 */\n\t\t   \t\t\t/*2457~2482MHz, Ch10~13,  Max BW: 20 */\n\t\t   \t\t\t/*2474~2494MHz, Ch14,  \t  Max BW: 20, No OFDM */\t\t\n\t{  36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{  52,   4, 20, IDOR, TRUE},\t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100,  11, 23, BOTH, TRUE},\t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Jordan*/\t\t\nCH_DESP Country_JO_ChDesp[] =\n{\n\t{ 1,  13, 20, BOTH, FALSE}, \t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,  4, 18, BOTH, FALSE}, \t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Kazakhstan*/\t\t\nCH_DESP Country_KZ_ChDesp[] =\n{\n\t{ 1,  13, 20, BOTH, FALSE}, \t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Kenya*/\t\t\nCH_DESP Country_KE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Korea, Democratic People's Republic of*/\t\t\nCH_DESP Country_KP_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, TRUE}, \t/*5160~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 36,   8, 20, BOTH, FALSE},\t/*5170~5330MHz, Ch 36~64, Max BW: 40 */\n\t{ 100,  7, 30, BOTH, TRUE}, \t/*5490~5630MHz, Ch 100~124, Max BW: 40 */\n\t{ 149,  4, 30, BOTH, FALSE},\t/*5735~5815MHz, Ch 149~161, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Korea, Republic of*/\t\t\nCH_DESP Country_KR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 20 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 100,  7, 30, BOTH, TRUE}, \t/*5490~5630MHz, Ch 100~124, Max BW: 40 */\n\t{ 149,  4, 30, BOTH, FALSE},\t/*5735~5815MHz, Ch 149~161, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Kuwait*/\t\t\nCH_DESP Country_KW_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Latvia*/\t\t\nCH_DESP Country_LV_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Lebanon*/\t\t\nCH_DESP Country_LB_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Liechtenstein*/\t\t\nCH_DESP Country_LI_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Lithuania*/\t\t\nCH_DESP Country_LT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Luxembourg*/\t\t\nCH_DESP Country_LU_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Macao*/\t\t\nCH_DESP Country_MO_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Macedonia, Republic of*/\t\t\nCH_DESP Country_MK_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Malaysia*/\t\t\nCH_DESP Country_MY_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 52,   4, 30, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Malta*/\t\t\nCH_DESP Country_MT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Mexico*/\t\t\nCH_DESP Country_MX_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Monaco*/\t\t\nCH_DESP Country_MC_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 18, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 18, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Morocco*/\t\t\nCH_DESP Country_MA_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Nepal*/\t\t\nCH_DESP Country_NP_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Netherlands*/\t\t\nCH_DESP Country_NL_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Netherlands Antilles*/\nCH_DESP Country_AN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*New Zealand*/\nCH_DESP Country_NZ_ChDesp[] =\n{\n\t{ 1,   13, 30, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Norway*/\t\nCH_DESP Country_NO_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Oman*/\t\t\nCH_DESP Country_OM_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Pakistan*/\t\t\nCH_DESP Country_PK_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Panama*/\t\t\nCH_DESP Country_PA_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Papua New Guinea*/\t\t\nCH_DESP Country_PG_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Peru*/\t\t\nCH_DESP Country_PE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Philippines*/\t\t\nCH_DESP Country_PH_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Poland*/\t\t\nCH_DESP Country_PL_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Portuga*/\t\t\nCH_DESP Country_PT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Puerto Rico*/\t\t\nCH_DESP Country_PR_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Qatar*/\t\t\nCH_DESP Country_QA_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Romania*/\t\t\nCH_DESP Country_RO_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Russian Federation*/\t\t\nCH_DESP Country_RU_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Saint Barth'elemy*/\t\t\nCH_DESP Country_BL_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 18, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 18, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Saudi Arabia*/\t\t\nCH_DESP Country_SA_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 23, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 23, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Singapore*/\t\t\nCH_DESP Country_SG_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 149,  5, 20, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Slovakia*/\t\t\nCH_DESP Country_SK_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Slovenia*/\t\t\nCH_DESP Country_SI_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*South Africa*/\t\t\nCH_DESP Country_ZA_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Spain*/\t\t\nCH_DESP Country_ES_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Sri Lanka*/\t\t\nCH_DESP Country_LK_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 20 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 20 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Sweden*/\t\t\nCH_DESP Country_SE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Switzerland*/\t\t\nCH_DESP Country_CH_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Syrian Arab Republic*/\t\t\nCH_DESP Country_SY_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Taiwan*/\t\t\nCH_DESP Country_TW_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 56,   3, 17, IDOR, TRUE}, \t/*5270~5330MHz, Ch 56~64, Max BW: 40 */\n\t{ 149,  4, 30, BOTH, FALSE},\t/*5735~5815MHz, Ch 149~161, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Thailand*/\t\t\nCH_DESP Country_TH_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Trinidad and Tobago*/\t\t\nCH_DESP Country_TT_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE},    \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Tunisia*/\t\t\nCH_DESP Country_TN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Turkey*/\t\t\nCH_DESP Country_TR_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 20 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 20 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Ukraine*/\t\t\nCH_DESP Country_UA_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*United Arab Emirates*/\t\t\nCH_DESP Country_AE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*United Kingdom*/\t\t\nCH_DESP Country_GB_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */  \n\t{ 52,   4, 20, IDOR, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */  \n\t{ 100, 11, 27, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*United States*/\t\t\nCH_DESP Country_US_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, IDOR, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100,  5, 20, BOTH, TRUE}, \t/*5490~5600MHz, Ch 100~116, Max BW: 40 */\n\t{ 132,  3, 20, BOTH, TRUE}, \t/*5650~5710MHz, Ch 132~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\t\t\n/*Uruguay*/\t\t\nCH_DESP Country_UY_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\t\t\n/*Uzbekistan*/\t\t\nCH_DESP Country_UZ_ChDesp[] =\n{\n\t{ 1,   11, 27, BOTH, FALSE},\t/*2402~2472MHz, Ch 1~11,   Max BW: 40 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\n\t{ 100, 11, 20, BOTH, TRUE}, \t/*5490~5710MHz, Ch 100~140, Max BW: 40 */\n\t{ 149,  5, 30, BOTH, FALSE},\t/*5735~5835MHz, Ch 149~165, Max BW: 40 */\t\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Venezuela*/\t\t\nCH_DESP Country_VE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 149,  4, 23, BOTH, FALSE},\t/*5735~5815MHz, Ch 149~161, Max BW: 40 */\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Viet Nam*/\t\t\nCH_DESP Country_VN_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 36,   4, 20, BOTH, FALSE},\t/*5170~5250MHz, Ch 36~48, Max BW: 40 */\n\t{ 52,   4, 20, BOTH, TRUE}, \t/*5250~5330MHz, Ch 52~64, Max BW: 40 */\t\t\n\t{ 0},               \t    \t/* end*/\n};\n/*Yemen*/\t\t\nCH_DESP Country_YE_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n/*Zimbabwe*/\t\t\nCH_DESP Country_ZW_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/*2402~2482MHz, Ch 1~13,   Max BW: 40 */\n\t{ 0},               \t    \t/* end*/\n};\n\n/* Group Region */\n/*Europe*/\t\t\nCH_DESP Country_EU_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/* 2.4 G, ch 1~13 */\n\t{ 36,   4, 17, BOTH, FALSE},\t/* 5G band 1, ch 36~48*/\n\t{ 0},               \t    \t/* end*/\n};\n/*North America*/\t\t\nCH_DESP Country_NA_ChDesp[] =\n{\n\t{ 1,   11,\t27, BOTH, FALSE},\t/* 2.4 G, ch 1~11*/  \n\t{ 36,   4,\t17, IDOR, FALSE},\t/* 5G band 1, ch 36~48*/  \n\t{ 149,\t5, 30, BOTH, FALSE},\t/* 5G band 4, ch 149~165*/\n\t{ 0},               \t    \t/* end*/\n};\n/*World Wide*/\t\t\nCH_DESP Country_WO_ChDesp[] =\n{\n\t{ 1,   13, 20, BOTH, FALSE},\t/* 2.4 G, ch 1~13*/\n\t{ 36,   4, 17, BOTH, FALSE},\t/* 5G band 1, ch 36~48*/\n\t{ 149,\t5, 22, BOTH, FALSE},\t/* 5G band 4, ch 149~165*/\n\t{ 0},               \t    \t/* end*/\n};\n\nCH_REGION ChRegion[] =\n{\n\t{\"AL\", CE, Country_AL_ChDesp}, /* Albania */\n\t{\"DZ\", CE, Country_DZ_ChDesp}, /* Algeria */\n\t{\"AR\", CE, Country_AR_ChDesp}, /* Argentina */\n\t{\"AM\", CE, Country_AM_ChDesp}, /* Armenia */\n\t{\"AW\", CE, Country_AW_ChDesp}, /* Aruba */\n\t{\"AU\", CE, Country_AU_ChDesp}, /* Australia */\n\t{\"AT\", CE, Country_AT_ChDesp}, /* Austria */\n\t{\"AZ\", CE, Country_AZ_ChDesp}, /* Azerbaijan */\n\t{\"BH\", CE, Country_BH_ChDesp}, /* Bahrain */\n\t{\"BD\", CE, Country_BD_ChDesp}, /* Bangladesh */\n\t{\"BB\", CE, Country_BB_ChDesp}, /* Barbados */\n\t{\"BY\", CE, Country_BY_ChDesp}, /* Belarus */\n\t{\"BE\", CE, Country_BE_ChDesp}, /* Belgium */\n\t{\"BZ\", CE, Country_BZ_ChDesp}, /* Belize */\n\t{\"BO\", CE, Country_BO_ChDesp}, /* Bolivia */\n\t{\"BA\", CE, Country_BA_ChDesp}, /* Bosnia and Herzegovina */\n\t{\"BR\", CE, Country_BR_ChDesp}, /* Brazil */\n\t{\"BN\", CE, Country_BN_ChDesp}, /* Brunei Darussalam */\n\t{\"BG\", CE, Country_BG_ChDesp}, /* Bulgaria */\n\t{\"KH\", CE, Country_KH_ChDesp}, /* Cambodia */\n\t{\"CA\", FCC,Country_CA_ChDesp}, /* Canada */\n\t{\"CL\", CE, Country_CL_ChDesp}, /* Chile */\n\t{\"CN\", CE, Country_CN_ChDesp}, /* China */\n\t{\"CO\", CE, Country_CO_ChDesp}, /* Colombia */\n\t{\"CR\", CE, Country_CR_ChDesp}, /* Costa Rica */\n\t{\"HR\", CE, Country_HR_ChDesp}, /* Croatia */\n\t{\"CY\", CE, Country_CY_ChDesp}, /* Cyprus */\n\t{\"CZ\", CE, Country_CZ_ChDesp}, /* Czech Republic */\n\t{\"DK\", CE, Country_DK_ChDesp}, /* Denmark */\n\t{\"DO\", CE, Country_DO_ChDesp}, /* Dominican Republic */\n\t{\"EC\", CE, Country_EC_ChDesp}, /* Ecuador */\n\t{\"EG\", CE, Country_EG_ChDesp}, /* Egypt */\n\t{\"SV\", CE, Country_SV_ChDesp}, /* El Salvador */\n\t{\"EE\", CE, Country_EE_ChDesp}, /* Estonia */\n\t{\"FI\", CE, Country_FI_ChDesp}, /* Finland */\n\t{\"FR\", CE, Country_FR_ChDesp}, /* France */\n\t{\"GE\", CE, Country_GE_ChDesp}, /* Georgia */\n\t{\"DE\", CE, Country_DE_ChDesp}, /* Germany */\n\t{\"GR\", CE, Country_GR_ChDesp}, /* Greece */\n\t{\"GL\", CE, Country_GL_ChDesp}, /* Greenland */\n\t{\"GD\", CE, Country_GD_ChDesp}, /* Grenada */\n\t{\"GU\", CE, Country_GU_ChDesp}, /* Guam */\n\t{\"GT\", CE, Country_GT_ChDesp}, /* Guatemala */\n\t{\"HT\", CE, Country_HT_ChDesp}, /* Haiti */\n\t{\"HN\", CE, Country_HN_ChDesp}, /* Honduras */\n\t{\"HK\", CE, Country_HK_ChDesp}, /* Hong Kong */\n\t{\"HU\", CE, Country_HU_ChDesp}, /* Hungary */\n\t{\"IS\", CE, Country_IS_ChDesp}, /* Iceland */\n\t{\"IN\", CE, Country_IN_ChDesp}, /* India */\n\t{\"ID\", CE, Country_ID_ChDesp}, /* Indonesia */\n\t{\"IR\", CE, Country_IR_ChDesp}, /* Iran, Islamic Republic of */\n\t{\"IE\", CE, Country_IE_ChDesp}, /* Ireland */\n\t{\"IL\", CE, Country_IL_ChDesp}, /* Israel */\n\t{\"IT\", CE, Country_IT_ChDesp}, /* Italy */\n\t{\"JM\", CE, Country_JM_ChDesp}, /* Jamaica */\n\t{\"JP\", JAP,Country_JP_ChDesp}, /* Japan */\t\t\n\t{\"JO\", CE, Country_JO_ChDesp}, /* Jordan */\t\n\t{\"KZ\", CE, Country_KZ_ChDesp}, /* Kazakhstan */\t\t\t\n\t{\"KE\", CE, Country_KE_ChDesp}, /* Kenya */\t\n\t{\"KP\", CE, Country_KP_ChDesp}, /* Korea, Democratic People's Republic of */\n\t{\"KR\", CE, Country_KR_ChDesp}, /* Korea, Republic of */\t\t\t\n\t{\"KW\", CE, Country_KW_ChDesp}, /* Kuwait */\t\t\t\n\t{\"LV\", CE, Country_LV_ChDesp}, /* Latvia */\t\t\t\n\t{\"LB\", CE, Country_LB_ChDesp}, /* Lebanon */\t\t\t\n\t{\"LI\", CE, Country_LI_ChDesp}, /* Liechtenstein */\t\t\t\n\t{\"LT\", CE, Country_LT_ChDesp}, /* Lithuania */\t\t\t\n\t{\"LU\", CE, Country_LU_ChDesp}, /* Luxembourg */\t\t\t\n\t{\"MO\", CE, Country_MO_ChDesp}, /* Macao */\t\t\t\n\t{\"MK\", CE, Country_MK_ChDesp}, /* Macedonia, Republic of */\t\t\t\n\t{\"MY\", CE, Country_MY_ChDesp}, /* Malaysia */\t\t\t\n\t{\"MT\", CE, Country_MT_ChDesp}, /* Malta */\t\t\t\n\t{\"MX\", CE, Country_MX_ChDesp}, /* Mexico */\t\t\t\n\t{\"MC\", CE, Country_MC_ChDesp}, /* Monaco */\t\t\t\n\t{\"MA\", CE, Country_MA_ChDesp}, /* Morocco */\t\t\t\n\t{\"NP\", CE, Country_NP_ChDesp}, /* Nepal */\t\t\t\n\t{\"NL\", CE, Country_NL_ChDesp}, /* Netherlands */\t\t\t\n\t{\"AN\", CE, Country_AN_ChDesp}, /* Netherlands Antilles */\t\t\t\n\t{\"NZ\", CE, Country_NZ_ChDesp}, /* New Zealand */\t\t\t\n\t{\"NO\", CE, Country_NO_ChDesp}, /* Norway */\t\t\t\n\t{\"OM\", CE, Country_OM_ChDesp}, /* Oman */\t\t\n\t{\"PK\", CE, Country_PK_ChDesp}, /* Pakistan */\t\t\n\t{\"PA\", CE, Country_PA_ChDesp}, /* Panama */\t\n\t{\"PG\", CE, Country_PG_ChDesp}, /* Papua New Guinea */\t\n\t{\"PE\", CE, Country_PE_ChDesp}, /* Peru */\t\t\t\n\t{\"PH\", CE, Country_PH_ChDesp}, /* Philippines */\t\t\n\t{\"PL\", CE, Country_PL_ChDesp}, /* Poland */\t\t\t\n\t{\"PT\", CE, Country_PT_ChDesp}, /* Portuga l*/\t\t\t\n\t{\"PR\", CE, Country_PR_ChDesp}, /* Puerto Rico */\t\t\t\n\t{\"QA\", CE, Country_QA_ChDesp}, /* Qatar */\t\t\t\n\t{\"RO\", CE, Country_RO_ChDesp}, /* Romania */\t\t\t\n\t{\"RU\", CE, Country_RU_ChDesp}, /* Russian Federation */\t\t\t\n\t{\"BL\", CE, Country_BL_ChDesp}, /* Saint Barth'elemy */\t\t\t\n\t{\"SA\", CE, Country_SA_ChDesp}, /* Saudi Arabia */\t\t\t\n\t{\"SG\", CE, Country_SG_ChDesp}, /* Singapore */\t\t\t\n\t{\"SK\", CE, Country_SK_ChDesp}, /* Slovakia */\t\t\t\n\t{\"SI\", CE, Country_SI_ChDesp}, /* Slovenia */\t\t\t\t\t\n\t{\"ZA\", CE, Country_ZA_ChDesp}, /* South Africa */\t\t\t\t\t\n\t{\"ES\", CE, Country_ES_ChDesp}, /* Spain */\t\t\t\t\n\t{\"LK\", CE, Country_LK_ChDesp}, /* Sri Lanka */\t\t\t\t\n\t{\"SE\", CE, Country_SE_ChDesp}, /* Sweden */\t\t\t\t\t\n\t{\"CH\", CE, Country_CH_ChDesp}, /* Switzerland */\t\t\t\t\t\n\t{\"SY\", CE, Country_SY_ChDesp}, /* Syrian Arab Republic */\t\t\t\t\t\n\t{\"TW\", FCC,Country_TW_ChDesp}, /* Taiwan */\t\t\t\n\t{\"TH\", CE, Country_TH_ChDesp}, /* Thailand */\t\t\t\t\t\n\t{\"TT\", CE, Country_TT_ChDesp}, /* Trinidad and Tobago */\t\t\t\n\t{\"TN\", CE, Country_TN_ChDesp}, /* Tunisia */\t\t\t\t\n\t{\"TR\", CE, Country_TR_ChDesp}, /* Turkey */\t\t\t\t\t\n\t{\"UA\", CE, Country_UA_ChDesp}, /* Ukraine */\t\t\t\t\t\n\t{\"AE\", CE, Country_AE_ChDesp}, /* United Arab Emirates */\t\t\t\t\t\n\t{\"GB\", CE, Country_GB_ChDesp}, /* United Kingdom */\t\t\t\n\t{\"US\", FCC,Country_US_ChDesp}, /* United States */\t\t\t\n\t{\"UY\", CE, Country_UY_ChDesp}, /* Uruguay */\t\t\t\t\t\n\t{\"UZ\", CE, Country_UZ_ChDesp}, /* Uzbekistan */\t\t\t\t\n\t{\"VE\", CE, Country_VE_ChDesp}, /* Venezuela */\t\t\t\t\n\t{\"VN\", CE, Country_VN_ChDesp}, /* Viet Nam */\t\t\t\t\t\n\t{\"YE\", CE, Country_YE_ChDesp}, /* Yemen */\t\t\t\t\t\n\t{\"ZW\", CE, Country_ZW_ChDesp}, /* Zimbabwe */\t\n\t{\"EU\", CE, Country_EU_ChDesp}, /* Europe */\n\t{\"NA\", FCC,Country_NA_ChDesp}, /* North America */\n\t{\"WO\", CE, Country_WO_ChDesp}, /* World Wide */\n\t{\"\"  , 0,  NULL}\t     , /* End */\t\n};\n\nstatic PCH_REGION GetChRegion(\n\tIN PUCHAR CntryCode)\n{\n\tINT loop = 0;\n\tPCH_REGION pChRegion = NULL;\n\n\twhile (strcmp((PSTRING) ChRegion[loop].CountReg, \"\") != 0)\n\t{\n\t\tif (strncmp((PSTRING) ChRegion[loop].CountReg, (PSTRING) CntryCode, 2) == 0)\n\t\t{\n\t\t\tpChRegion = &ChRegion[loop];\n\t\t\tbreak;\n\t\t}\n\t\tloop++;\n\t}\n\n\t/* Default: use WO*/\n\tif (pChRegion == NULL)\n\t\tpChRegion = GetChRegion(\"WO\");\n\n\treturn pChRegion;\n}\n\nstatic VOID ChBandCheck(\n\tIN UCHAR PhyMode,\n\tOUT PUCHAR pChType)\n{\n\t*pChType = 0;\n\tif (WMODE_CAP_5G(PhyMode))\n\t\t*pChType |= BAND_5G;\n\tif (WMODE_CAP_2G(PhyMode))\n\t\t*pChType |= BAND_24G;\n\n\tif (*pChType == 0)\n\t\t*pChType = BAND_24G;\n}\n\nstatic UCHAR FillChList(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PCH_DESP pChDesp,\n\tIN UCHAR Offset, \n\tIN UCHAR increment,\n\tIN UCHAR regulatoryDomain)\n{\n\tINT i, j, l;\n\tUCHAR channel;\n\n\tj = Offset;\n\tfor (i = 0; i < pChDesp->NumOfCh; i++)\n\t{\n\t\tchannel = pChDesp->FirstChannel + i * increment;\n\t\tif (!strncmp((PSTRING) pAd->CommonCfg.CountryCode, \"JP\", 2))\n        {\n            /* for JP, ch14 can only be used when PhyMode is \"B only\" */\n            if ( (channel==14) && \n\t\t\t(!WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B)))\n            {\n                    pChDesp->NumOfCh--;\n                    break;\n            }\n        }\n/*New FCC spec restrict the used channel under DFS */\n#ifdef CONFIG_AP_SUPPORT\t\n\t\tif ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t(pAd->CommonCfg.RDDurRegion == FCC) &&\n\t\t\t(pAd->Dot11_H.bDFSIndoor == 1))\n\t\t{\n\t\t\tif (RESTRICTION_BAND_1(pAd))\n\t\t\t\tcontinue;\n\t\t}\n\t\telse if ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t\t (pAd->CommonCfg.RDDurRegion == FCC) &&\n\t\t\t\t (pAd->Dot11_H.bDFSIndoor == 0))\n\t\t{\n\t\t\tif ((channel >= 100) && (channel <= 140))\n\t\t\t\tcontinue;\n\t\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\t\tfor (l=0; l<MAX_NUM_OF_CHANNELS; l++)\n\t\t{\n\t\t\tif (channel == pAd->TxPower[l].Channel)\n\t\t\t{\n\t\t\t\tpAd->ChannelList[j].Power = pAd->TxPower[l].Power;\n\t\t\t\tpAd->ChannelList[j].Power2 = pAd->TxPower[l].Power2;\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\t\t\tpAd->ChannelList[j].Power3 = pAd->TxPower[l].Power3;\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (l == MAX_NUM_OF_CHANNELS)\n\t\t\tcontinue;\n\n\t\tpAd->ChannelList[j].Channel = pChDesp->FirstChannel + i * increment;\n\t\tpAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr;\n\t\tpAd->ChannelList[j].DfsReq = pChDesp->DfsReq;\n\t\tpAd->ChannelList[j].RegulatoryDomain = regulatoryDomain;\n#ifdef DOT11_N_SUPPORT\n\t\tif (N_ChannelGroupCheck(pAd, pAd->ChannelList[j].Channel))\n\t\t\tpAd->ChannelList[j].Flags |= CHANNEL_40M_CAP;\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef RT_CFG80211_SUPPORT\n\t\tCFG80211OS_ChanInfoInit(\n\t\t\t\t\tpAd->pCfg80211_CB,\n\t\t\t\t\tj,\n\t\t\t\t\tpAd->ChannelList[j].Channel,\n\t\t\t\t\tpAd->ChannelList[j].MaxTxPwr,\n\t\t\t\t\tWMODE_CAP_N(pAd->CommonCfg.PhyMode),\n\t\t\t\t\t(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20));\n#endif /* RT_CFG80211_SUPPORT */\n\n\t\tj++;\n\t}\n\tpAd->ChannelListNum = j;\n\n\treturn j;\n}\n\n\nstatic inline VOID CreateChList(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PCH_REGION pChRegion,\n\tIN UCHAR Geography)\n{\n\tINT i;\n\tUCHAR offset = 0;\n\tPCH_DESP pChDesp;\n\tUCHAR ChType;\n\tUCHAR increment;\n\tUCHAR regulatoryDomain;\n\n\tif (pChRegion == NULL)\n\t\treturn;\n\n\tChBandCheck(pAd->CommonCfg.PhyMode, &ChType);\n\t\n\tif (pAd->CommonCfg.pChDesp != NULL)\n\t   pChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\telse\n\t   pChDesp = pChRegion->pChDesp;\n\t   \n\tfor (i = 0; pChDesp[i].FirstChannel != 0; i++)\n\t{\n\t\tif (pChDesp[i].FirstChannel == 0)\n\t\t\tbreak;\n\n\t\tif (ChType == BAND_5G)\n\t\t{\n\t\t\tif (pChDesp[i].FirstChannel <= 14)\n\t\t\t\tcontinue;\n\t\t}\n\t\telse if (ChType == BAND_24G)\n\t\t{\n\t\t\tif (pChDesp[i].FirstChannel > 14)\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tif ((pChDesp[i].Geography == BOTH)\n\t\t\t\t|| (Geography == BOTH)\n\t\t\t\t|| (pChDesp[i].Geography == Geography))\n        {\n\t\t\tif (pChDesp[i].FirstChannel > 14)\n                increment = 4;\n            else\n                increment = 1;\n\t\t\tif (pAd->CommonCfg.DfsType != MAX_RD_REGION)\n\t\t\t\tregulatoryDomain = pAd->CommonCfg.DfsType;\n\t\t\telse\n\t\t\t\tregulatoryDomain = pChRegion->DfsType;\n\t\t\toffset = FillChList(pAd, &pChDesp[i], offset, increment, regulatoryDomain);\n        }\n\t}\n}\n\n\nVOID BuildChannelListEx(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPCH_REGION pChReg;\n\n\tpChReg = GetChRegion(pAd->CommonCfg.CountryCode);\n\tCreateChList(pAd, pChReg, pAd->CommonCfg.Geography);\n}\n\nVOID BuildBeaconChList(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pBuf,\n\tOUT\tPULONG pBufLen)\n{\n\tINT i;\n\tULONG TmpLen;\n\tPCH_REGION pChRegion;\n\tPCH_DESP pChDesp;\n\tUCHAR ChType;\n\n\tpChRegion = GetChRegion(pAd->CommonCfg.CountryCode);\n\n\tif (pChRegion == NULL)\n\t\treturn;\n\n\tChBandCheck(pAd->CommonCfg.PhyMode, &ChType);\n\t*pBufLen = 0;\n\n\tif (pAd->CommonCfg.pChDesp != NULL)\n\t\tpChDesp = (PCH_DESP) pAd->CommonCfg.pChDesp;\n\telse\n\t\tpChDesp = pChRegion->pChDesp;\n\n\tfor (i=0; pChRegion->pChDesp[i].FirstChannel != 0; i++)\n\t{\n\t\tif (pChDesp[i].FirstChannel == 0)\n\t\t\tbreak;\n\n\t\tif (ChType == BAND_5G)\n\t\t{\n\t\t\tif (pChDesp[i].FirstChannel <= 14)\n\t\t\t\tcontinue;\n\t\t}\n\t\telse if (ChType == BAND_24G)\n\t\t{\n\t\t\tif (pChDesp[i].FirstChannel > 14)\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tif ((pChDesp[i].Geography == BOTH) ||\n\t\t\t(pChDesp[i].Geography == pAd->CommonCfg.Geography))\n\t\t{\n\t\t\tMakeOutgoingFrame(pBuf + *pBufLen,\t\t&TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&pChDesp[i].FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&pChDesp[i].NumOfCh,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&pChDesp[i].MaxTxPwr,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pBufLen += TmpLen;\n\t\t}\n\t}\n}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef DOT11_N_SUPPORT\nstatic BOOLEAN IsValidChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR channel)\n\n{\n\tINT i;\n\n\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->ChannelList[i].Channel == channel)\n\t\t\tbreak;\n\t}\n\n\tif (i == pAd->ChannelListNum)\n\t\treturn FALSE;\n\telse\n\t\treturn TRUE;\n}\n\nstatic UCHAR GetExtCh(\n\tIN UCHAR Channel,\n\tIN UCHAR Direction)\n{\n\tCHAR ExtCh;\n\n\tif (Direction == EXTCHA_ABOVE)\n\t\tExtCh = Channel + 4;\n\telse\n\t\tExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;\n\n\treturn ExtCh;\n}\n\nBOOLEAN N_ChannelGroupCheck(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Channel)\n{\n\tBOOLEAN\tRetVal = FALSE;\n\t\n\tif (Channel > 14)\n\t{\n\t\tif ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel == 60) || (Channel == 100) || (Channel == 108) ||\n\t\t    (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157))\n\t\t{\n\t\t\tRetVal = TRUE;\n\t\t}\n\t\telse if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) ||\n\t\t\t\t(Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel == 153) || (Channel == 161))\n\t\t{\n\t\t\tRetVal = TRUE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tdo\n\t\t{\n\t\t\tUCHAR ExtCh;\n\n\t\t\tif (Channel == 14)\n\t\t\t{\n\t\t\t\tRetVal = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tExtCh = GetExtCh(Channel, EXTCHA_ABOVE);\n\t\t\tif (IsValidChannel(pAd, ExtCh))\n\t\t\t\tRetVal = TRUE;\n\t\t\telse\n\t\t\t{\n\t\t\t\tExtCh = GetExtCh(Channel, EXTCHA_BELOW);\n\t\t\t\tif (IsValidChannel(pAd, ExtCh))\n\t\t\t\tRetVal = TRUE;\n\t\t\t}\n\t\t} while(FALSE);\n\t}\n\n\treturn RetVal;\n}\n\n\nVOID N_ChannelCheck(RTMP_ADAPTER *pAd)\n{\n\tINT idx;\n\tUCHAR Channel = pAd->CommonCfg.Channel;\n\tstatic const UCHAR wfa_ht_ch_ext[] = {\n\t\t\t36, EXTCHA_ABOVE, 40, EXTCHA_BELOW,\n\t\t\t44, EXTCHA_ABOVE, 48, EXTCHA_BELOW,\n\t\t\t52, EXTCHA_ABOVE, 56, EXTCHA_BELOW,\n\t\t\t60, EXTCHA_ABOVE, 64, EXTCHA_BELOW,\n\t\t\t100, EXTCHA_ABOVE, 104, EXTCHA_BELOW,\n\t\t\t108, EXTCHA_ABOVE, 112, EXTCHA_BELOW,\n\t\t\t116, EXTCHA_ABOVE, 120, EXTCHA_BELOW,\n\t\t\t124, EXTCHA_ABOVE, 128, EXTCHA_BELOW,\n\t\t\t132, EXTCHA_ABOVE, 136, EXTCHA_BELOW,\n\t\t\t149, EXTCHA_ABOVE, 153, EXTCHA_BELOW, \n\t\t\t157, EXTCHA_ABOVE, 161, EXTCHA_BELOW,\n\t\t\t0, 0};\n\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\t(pAd->CommonCfg.RegTransmitSetting.field.BW  == BW_40))\n\t{\n\t\tif (Channel > 14)\n\t\t{\n\t\t\tidx = 0;\n\t\t\twhile(wfa_ht_ch_ext[idx] != 0) {\n\t\t\t\tif (wfa_ht_ch_ext[idx] == Channel) {\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA = wfa_ht_ch_ext[idx + 1];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tidx += 2;\n\t\t\t};\n\t\t\tif (wfa_ht_ch_ext[idx] == 0)\n\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tUCHAR ExtCh;\n\t\t\t\tUCHAR Dir = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;\n\t\t\t\tExtCh = GetExtCh(Channel, Dir);\n\t\t\t\tif (IsValidChannel(pAd, ExtCh))\n\t\t\t\t\tbreak;\n\n\t\t\t\tDir = (Dir == EXTCHA_ABOVE) ? EXTCHA_BELOW : EXTCHA_ABOVE;\n\t\t\t\tExtCh = GetExtCh(Channel, Dir);\n\t\t\t\tif (IsValidChannel(pAd, ExtCh))\n\t\t\t\t{\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA = Dir;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;\n\t\t\t} while(FALSE);\n\n\t\t\tif (Channel == 14)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;\n\t\t\t\t/*pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE; We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT()*/\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nUCHAR N_SetCenCh(RTMP_ADAPTER *pAd, UCHAR prim_ch)\n{\n\tif (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)\n\t{\n\t\tif (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t\tpAd->CommonCfg.CentralChannel = prim_ch + 2;\n\t\telse\n\t\t{\n\t\t\tif (prim_ch == 14)\n\t\t\t\tpAd->CommonCfg.CentralChannel = prim_ch - 1;\n\t\t\telse\n\t\t\t\tpAd->CommonCfg.CentralChannel = prim_ch - 2;\n\t\t}\n\t}\n\telse\n\t\tpAd->CommonCfg.CentralChannel = prim_ch;\n\n\treturn pAd->CommonCfg.CentralChannel;\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nUINT8 GetCuntryMaxTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT8 channel)\n{\n\tint i;\n\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->ChannelList[i].Channel == channel)\n\t\t\tbreak;\n\t}\n\n\tif (i == pAd->ChannelListNum)\n\t\treturn 0xff;\n#ifdef SINGLE_SKU\n\tif (pAd->CommonCfg.bSKUMode == TRUE)\n\t{\n\t\tUINT deltaTxStreamPwr = 0;\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && (pAd->CommonCfg.TxStream == 2))\n\t\t\tdeltaTxStreamPwr = 3; /* If 2Tx case, antenna gain will increase 3dBm*/\n#endif /* DOT11_N_SUPPORT */\n\n\t\tif (pAd->ChannelList[i].RegulatoryDomain == FCC)\n\t\t{\n\t\t\t/* FCC should maintain 20/40 Bandwidth, and without antenna gain */\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) &&\n\t\t\t\t(channel == 1 || channel == 11))\n\t\t\t\treturn (pAd->ChannelList[i].MaxTxPwr - pAd->CommonCfg.BandedgeDelta - deltaTxStreamPwr);\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\treturn (pAd->ChannelList[i].MaxTxPwr - deltaTxStreamPwr);\n\t\t}\n\t\telse if (pAd->ChannelList[i].RegulatoryDomain == CE)\n\t\t{\n\t\t\treturn (pAd->ChannelList[i].MaxTxPwr - pAd->CommonCfg.AntGain - deltaTxStreamPwr);\n\t\t}\n\t\telse\n\t\t\treturn 0xff;\n\t}\n\telse\n#endif /* SINGLE_SKU */\n\t\treturn pAd->ChannelList[i].MaxTxPwr;\n}\n\n\n/* for OS_ABL */\nVOID RTMP_MapChannelID2KHZ(\n\tIN UCHAR Ch,\n\tOUT UINT32 *pFreq)\n{\n\tint chIdx;\n\tfor (chIdx = 0; chIdx < CH_HZ_ID_MAP_NUM; chIdx++)\n\t{\n\t\tif ((Ch) == CH_HZ_ID_MAP[chIdx].channel)\n\t\t{\n\t\t\t(*pFreq) = CH_HZ_ID_MAP[chIdx].freqKHz * 1000;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (chIdx == CH_HZ_ID_MAP_NUM)\n\t\t(*pFreq) = 2412000;\n}\n\n/* for OS_ABL */\nVOID RTMP_MapKHZ2ChannelID(\n\tIN ULONG Freq,\n\tOUT INT *pCh)\n{\n\tint chIdx;\n\tfor (chIdx = 0; chIdx < CH_HZ_ID_MAP_NUM; chIdx++)\n\t{\n\t\tif ((Freq) == CH_HZ_ID_MAP[chIdx].freqKHz)\n\t\t{\n\t\t\t(*pCh) = CH_HZ_ID_MAP[chIdx].channel;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (chIdx == CH_HZ_ID_MAP_NUM)\n\t\t(*pCh) = 1;\n}\n\n"
  },
  {
    "path": "src/common/rt_os_util.c",
    "content": "/****************************************************************************\n\n    Module Name:\n    rt_os_util.c\n \n    Abstract:\n\tAll functions provided from UTIL module are put here (OS independent).\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#define RTMP_MODULE_OS\n#define RTMP_MODULE_OS_UTIL\n\n/*#include \"rt_config.h\"\n*/\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rtmp_osabl.h\"\n\n\nUINT32 RalinkRate[256] =\n\t{2,  4, 11, 22, 12, 18,   24,  36, 48, 72, 96, 108, 109, 110, 111, 112,\n\t13, 26,   39,  52,  78, 104, 117, 130, 26,  52,  78, 104, 156, 208, 234, 260,\n\t39, 78,  117, 156, 234, 312, 351, 390,\n\t27, 54,   81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,\n\t81, 162, 243, 324, 486, 648, 729, 810,\n\t14, 29,   43,  57,  87, 115, 130, 144, 29, 59,   87, 115, 173, 230, 260, 288,\n\t43, 87,  130, 173, 260, 317, 390, 433,\n\t30, 60,   90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,\n\t90, 180, 270, 360, 540, 720, 810, 900,\n\t0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,\n\t20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,\n\t40,41,42,43,44,45,46,47}; /* 3*3\n*/\n\nVOID RtmpDrvMaxRateGet(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n/*\tIN\tPHTTRANSMIT_SETTING\t\tpHtPhyMode,\n*/\n\tIN\tUINT8\t\t\t\t\tMODE,\n\tIN\tUINT8\t\t\t\t\tShortGI,\n\tIN\tUINT8\t\t\t\t\tBW,\n\tIN\tUINT8\t\t\t\t\tMCS,\n\tOUT\tUINT32\t\t\t\t\t*pRate)\n{\n\tint rate_index = 0;\n\n#ifdef DOT11_N_SUPPORT\n\tif (MODE >= MODE_HTMIX)\n\t{\n\t/*                \trate_index = 16 + ((UCHAR)pHtPhyMode->field.BW *16) + ((UCHAR)pHtPhyMode->field.ShortGI *32) + ((UCHAR)pHtPhyMode->field.MCS);\n*/\n\t\trate_index = 16 + ((UCHAR)BW *24) + ((UCHAR)ShortGI *48) + ((UCHAR)MCS);\n\t}\n\telse \n#endif /* DOT11_N_SUPPORT */\n\t\tif (MODE == MODE_OFDM)\n\t\t\trate_index = (UCHAR)(MCS) + 4;\n\t\telse \n\t\t\trate_index = (UCHAR)(MCS);\n\n\tif (rate_index < 0)\n\t\trate_index = 0;\n\n\tif (rate_index > 255)\n\t\trate_index = 255;\n    \n\t*pRate = RalinkRate[rate_index] * 500000;\n}\n\n\nchar *rtstrchr(const char * s, int c)\n{\n    for(; *s != (char) c; ++s)\n        if (*s == '\\0')\n            return NULL;\n    return (char *) s;\n}\n\n\nVOID RtmpMeshDown(\n\tIN VOID *pDrvCtrlBK,\n\tIN BOOLEAN WaitFlag,\n\tIN BOOLEAN\t (*RtmpMeshLinkCheck)(IN VOID *pAd))\n{\n}\n\n\n\n\t\nBOOLEAN RtmpOsCmdDisplayLenCheck(\n\tIN UINT32 LenSrc,\n\tIN UINT32 Offset)\n{\n\tif (LenSrc > (IW_PRIV_SIZE_MASK - Offset))\n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\n\n#if defined(WPA_SUPPLICANT_SUPPORT) || defined(APCLI_WPA_SUPPLICANT_SUPPORT)\nVOID WpaSendMicFailureToWpaSupplicant(\n\tIN PNET_DEV pNetDev,\n\tIN BOOLEAN bUnicast)\n{    \n\tchar custom[IW_CUSTOM_MAX] = {0};\n    \n\tsnprintf(custom, sizeof(custom), \"MLME-MICHAELMICFAILURE.indication\");\n\tif(bUnicast)\n\t\tsprintf(custom, \"%s unicast\", custom);\n\n\tRtmpOSWrielessEventSend(pNetDev, RT_WLAN_EVENT_CUSTOM, -1, NULL, (PUCHAR)custom, strlen(custom));\n\t\n\treturn;\n}\n#endif /* defined(WPA_SUPPLICANT_SUPPORT) || defined(APCLI_WPA_SUPPLICANT_SUPPORT) */\n\n\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\nint wext_notify_event_assoc(\n\tIN PNET_DEV pNetDev,\n\tIN UCHAR *ReqVarIEs,\n\tIN UINT32 ReqVarIELen)\n{\n\tchar custom[IW_CUSTOM_MAX] = {0};\n\n#if WIRELESS_EXT > 17\n\tif (ReqVarIELen <= IW_CUSTOM_MAX)\n\t{\n\t\tNdisMoveMemory(custom, ReqVarIEs, ReqVarIELen);\n\t\tRtmpOSWrielessEventSend(pNetDev, RT_WLAN_EVENT_ASSOC_REQ_IE, -1, NULL,\n\t\t\t\t\t\t\t\t(UCHAR *)custom, ReqVarIELen);\n\t}\n\telse\n\t    DBGPRINT(RT_DEBUG_TRACE, (\"pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\\n\"));\n#else\n\tint len;\n\n\tlen = (ReqVarIELen*2) + 17;\n\tif (len <= IW_CUSTOM_MAX)\n\t{\n\t\tUCHAR   idx;\n\t\tsnprintf(custom, sizeof(custom), \"ASSOCINFO(ReqIEs=\");\n\t\tfor (idx=0; idx<ReqVarIELen; idx++)\n\t\t        sprintf(custom, \"%s%02x\", custom, ReqVarIEs[idx]);\n\t\tRtmpOSWrielessEventSend(pNetDev, RT_WLAN_EVENT_CUSTOM, -1, NULL, custom, len);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"len(%d) > MAX_CUSTOM_LEN\\n\", len));\n#endif\n\n\treturn 0;\n\t\n}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\nVOID SendAssocIEsToWpaSupplicant( \n\tIN PNET_DEV pNetDev,\n\tIN UCHAR *ReqVarIEs,\n\tIN UINT32 ReqVarIELen)\n{\n\tSTRING custom[IW_CUSTOM_MAX] = {0};\n\n\tif ((ReqVarIELen + 17) <= IW_CUSTOM_MAX)\n\t{\n\t\tsnprintf(custom, sizeof(custom), \"ASSOCINFO_ReqIEs=\");\n\t\tNdisMoveMemory(custom+17, ReqVarIEs, ReqVarIELen);\n\t\tRtmpOSWrielessEventSend(pNetDev, RT_WLAN_EVENT_CUSTOM, RT_REQIE_EVENT_FLAG, NULL, (PUCHAR)custom, ReqVarIELen + 17);\n\n\t\tRtmpOSWrielessEventSend(pNetDev, RT_WLAN_EVENT_CUSTOM, RT_ASSOCINFO_EVENT_FLAG, NULL, NULL, 0);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->StaCfg.ReqVarIELen + 17 > MAX_CUSTOM_LEN\\n\"));\n\n\treturn;\n}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\nINT32  RtPrivIoctlSetVal(VOID)\n{\n    return (INT32)RTPRIV_IOCTL_SET;\n}\n\n\n#ifdef RTMP_USB_SUPPORT\nPVOID RtmpInitCompletion(VOID)\n{\n\tstruct completion *comp = NULL;\n\tos_alloc_mem(NULL, (UCHAR **)&comp, sizeof(struct completion));\n\tinit_completion(comp);\n\treturn (PVOID)comp;\n}\n\n\nULONG RtmpWaitForCompletionTimeout(VOID *Completion, ULONG Expire)\n{\n\treturn wait_for_completion_timeout((struct completion *)Completion, Expire);\n}\n\n\nVOID RtmpComplete(VOID *Completion)\n{\n\tcomplete((struct completion *)Completion);\n}\n#endif /* RTMP_USB_SUPPORT */\n\nULONG RtmpMsecsToJiffies(UINT32 msecs)\n{\n\treturn msecs_to_jiffies(msecs);\n}\n\n\n"
  },
  {
    "path": "src/common/rt_rf.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt_rf.c\n\n\tAbstract:\n\tRalink Wireless driver RF related functions\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n#include \"rt_config.h\"\n\n\n\n"
  },
  {
    "path": "src/common/rtmp_init.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_init.c\n\n\tAbstract:\n\tMiniport generic portion header file\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n#include\t\"rt_config.h\"\n\n#ifdef OS_ABL_FUNC_SUPPORT\n/* Os utility link: printk, scanf */\nRTMP_OS_ABL_OPS RaOsOps, *pRaOsOps = &RaOsOps;\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n#define RT3090A_DEFAULT_INTERNAL_LNA_GAIN\t0x0A\nUCHAR NUM_BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};\n#ifdef DBG\nchar*   CipherName[] = {\"none\",\"wep64\",\"wep128\",\"TKIP\",\"AES\",\"CKIP64\",\"CKIP128\",\"CKIP152\",\"SMS4\"};\n#endif\n\n\n/* \n\tASIC register initialization sets\n*/\nRTMP_REG_PAIR MACRegTable[] = {\n#ifndef MT7601\n#if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)\n\t{BCN_OFFSET0,\t\t\t0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */\n\t{BCN_OFFSET1,\t\t\t0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */\n#elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)\n\t{BCN_OFFSET0,\t\t\t0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */\n\t{BCN_OFFSET1,\t\t\t0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */\n#endif /* HW_BEACON_OFFSET */\n#endif /* MT7601 */\n\n\t{LEGACY_BASIC_RATE,\t\t0x0000013f}, /*  Basic rate set bitmap*/\n\t{HT_BASIC_RATE,\t\t0x00008003}, /* Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI.*/\n\t{MAC_SYS_CTRL,\t\t0x00}, /* 0x1004, , default Disable RX*/\n\t{RX_FILTR_CFG,\t\t0x17f97}, /*0x1400  , RX filter control,  */\n\t{BKOFF_SLOT_CFG,\t0x209}, /* default set short slot time, CC_DELAY_TIME should be 2\t */\n\t/*{TX_SW_CFG0,\t\t0x40a06},  Gary,2006-08-23 */\n\t{TX_SW_CFG0,\t\t0x0}, \t\t/* Gary,2008-05-21 for CWC test */\n\t{TX_SW_CFG1,\t\t0x80606}, /* Gary,2006-08-23 */\n\t{TX_LINK_CFG,\t\t0x1020},\t\t/* Gary,2006-08-23 */\n\t/*{TX_TIMEOUT_CFG,\t0x00182090},\t CCK has some problem. So increase timieout value. 2006-10-09 MArvek RT*/\n\t{TX_TIMEOUT_CFG,\t0x000a2090},\t/* CCK has some problem. So increase timieout value. 2006-10-09 MArvek RT , Modify for 2860E ,2007-08-01*/\n\t{MAX_LEN_CFG,\t\tMAX_AGGREGATION_SIZE | 0x00001000},\t/* 0x3018, MAX frame length. Max PSDU = 16kbytes.*/\n#ifndef MT7601\n\t{LED_CFG,\t\t0x7f031e46}, /* Gary, 2006-08-23*/\n#endif /* MT7601 */\n\n#ifdef RLT_MAC\n\n#ifdef MT7601\n#ifdef CONFIG_MULTI_CHANNEL\n\t{TX_MAX_PCNT,\t\t0x1f1f1f1f/*0x1fbf1f1f */},\n#else\n\t{TX_MAX_PCNT,\t\t0x1fbf1f1f},\n#endif /* CONFIG_MULTI_CHANNEL */\n\t{RX_MAX_PCNT,\t\t0x9f},\n#else\n\t{TX_MAX_PCNT,\t\t0xbfbf3f1f},\n\t{RX_MAX_PCNT,\t\t0x9f},\n#endif\n\n// TODO: shiang-6590, need set this in FPGA mode\n#ifdef RTMP_MAC_USB\n#endif /* RTMP_MAC_USB */\n#else\n#ifdef INF_AMAZON_SE\n\t{PBF_MAX_PCNT,\t\t\t0x1F3F6F6F}, \t/*iverson modify for usb issue, 2008/09/19*/\n\t\t\t\t\t\t\t\t\t\t\t/* 6F + 6F < total page count FE*/\n\t\t\t\t\t\t\t\t\t\t\t/* so that RX doesn't occupy TX's buffer space when WMM congestion.*/\n#else\n\t{PBF_MAX_PCNT,\t\t\t0x1F3FBF9F}, \t/*0x1F3f7f9f},\t\tJan, 2006/04/20*/\n#endif /* INF_AMAZON_SE */\n#endif /* RLT_MAC */\n\n\t/*{TX_RTY_CFG,\t\t\t0x6bb80408},\t Jan, 2006/11/16*/\n/* WMM_ACM_SUPPORT*/\n/*\t{TX_RTY_CFG,\t\t\t0x6bb80101},\t sample*/\n\t{TX_RTY_CFG,\t\t\t0x47d01f0f},\t/* Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03*/\n\t\n\t{AUTO_RSP_CFG,\t\t\t0x00000013},\t/* Initial Auto_Responder, because QA will turn off Auto-Responder*/\n\t{CCK_PROT_CFG,\t\t\t0x05740003 /*0x01740003*/},\t/* Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. */\n\t{OFDM_PROT_CFG,\t\t\t0x05740003 /*0x01740003*/},\t/* Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. */\n#ifdef RTMP_MAC_USB\n#ifndef MT7601\n\t{PBF_CFG, \t\t\t\t0xf40006}, \t\t/* Only enable Queue 2*/\n\t{WPDMA_GLO_CFG,\t\t\t0x00000030},\t\t// MT7601U not support WPDMA\n#endif /* MT7601 */\n\t{MM40_PROT_CFG,\t\t\t0x3F44084},\t\t/* Initial Auto_Responder, because QA will turn off Auto-Responder*/\n#endif /* RTMP_MAC_USB */\n\t{GF20_PROT_CFG,\t\t\t0x01744004},    /* set 19:18 --> Short NAV for MIMO PS*/\n\t{GF40_PROT_CFG,\t\t\t0x03F44084},    \n\t{MM20_PROT_CFG,\t\t\t0x01744004},    \n\t{TXOP_CTRL_CFG,\t\t\t0x0000583f, /*0x0000243f*/ /*0x000024bf*/},\t/*Extension channel backoff.*/\n\t{TX_RTS_CFG,\t\t\t0x01092b20},\t\t// enable RTS fall back\n\n\t{EXP_ACK_TIME,\t\t\t0x002400ca},\t/* default value */\n\t{TXOP_HLDR_ET, \t\t\t0x00000002},\n\n\t/* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us\n\t\tis too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0\n\t\tand beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping\n\t\twill always lost. So we change the SIFS of CCK from 10us to 16us. */\n\t{XIFS_TIME_CFG,\t\t\t0x33a41010},\n#if defined(RT65xx) || defined(MT7601)\n\t{PWR_PIN_CFG,\t\t\t0x00000000},\n#else\n\t{PWR_PIN_CFG,\t\t\t0x00000003},\t/* patch for 2880-E*/\n#endif /* defined(RT65xx) || defined(MT7601) */\n};\n\n#ifdef CONFIG_AP_SUPPORT\nRTMP_REG_PAIR\tAPMACRegTable[] =\t{\n\t{WMM_AIFSN_CFG,\t\t0x00001173},\n\t{WMM_CWMIN_CFG,\t0x00002344},\n\t{WMM_CWMAX_CFG,\t0x000034a6},\n\t{WMM_TXOP0_CFG,\t\t0x00100020},\n\t{WMM_TXOP1_CFG,\t\t0x002F0038},\n\t{TBTT_SYNC_CFG,\t\t0x00012000},\n#ifdef STREAM_MODE_SUPPORT\n\t{TX_CHAIN_ADDR0_L,\t0xFFFFFFFF},\t/* Broadcast frames are in stream mode*/\n\t{TX_CHAIN_ADDR0_H,\t0x3FFFF},\n#endif /* STREAM_MODE_SUPPORT */\n};\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nRTMP_REG_PAIR\tSTAMACRegTable[] =\t{\n\t{WMM_AIFSN_CFG,\t\t0x00002273},\n\t{WMM_CWMIN_CFG,\t0x00002344},\n\t{WMM_CWMAX_CFG,\t0x000034aa},\n};\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#define\tNUM_MAC_REG_PARMS\t\t(sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR))\n#ifdef CONFIG_AP_SUPPORT\n#define\tNUM_AP_MAC_REG_PARMS\t(sizeof(APMACRegTable) / sizeof(RTMP_REG_PAIR))\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#define\tNUM_STA_MAC_REG_PARMS\t(sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR))\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/*\n\tUse the global variable is not a good solution.\n\tBut we can not put it to pAd and use the lock in pAd of RALINK_TIMER_STRUCT;\n\tOr when the structure is cleared, we maybe get NULL for pAd and can not lock.\n\tMaybe we can put pAd in RTMPSetTimer/ RTMPModTimer/ RTMPCancelTimer.\n*/\nNDIS_SPIN_LOCK TimerSemLock;\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tAllocate RTMP_ADAPTER data block and do some initialization\n\n\tArguments:\n\t\tAdapter\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS\n\t\tNDIS_STATUS_FAILURE\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS\tRTMPAllocAdapterBlock(\n\tIN  PVOID\thandle,\n\tOUT\tVOID\t**ppAdapter)\n{\n\tPRTMP_ADAPTER\tpAd = NULL;\n\tNDIS_STATUS\t\tStatus;\n\tINT \t\t\tindex;\n\tUCHAR\t\t\t*pBeaconBuf = NULL;\n\n\n#ifdef OS_ABL_FUNC_SUPPORT\n\t/* must put the function before any print message */\n\t/* init OS utilities provided from UTIL module */\n\tRtmpOsOpsInit(&RaOsOps);\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> RTMPAllocAdapterBlock\\n\"));\n\n\t/* init UTIL module */\n\tRtmpUtilInit();\n\n\t*ppAdapter = NULL;\n\n\tdo\n\t{\n\t\t/* Allocate RTMP_ADAPTER memory block*/\n/*\t\tpBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);*/\n\t\tos_alloc_mem(NULL, (UCHAR **)&pBeaconBuf, MAX_BEACON_SIZE);\n\t\tif (pBeaconBuf == NULL)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\tDBGPRINT_ERR((\"Failed to allocate memory - BeaconBuf!\\n\"));\n\t\t\tbreak;\n\t\t}\n\t\tNdisZeroMemory(pBeaconBuf, MAX_BEACON_SIZE);\n\n\t\tStatus = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd, sizeof(RTMP_ADAPTER));\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"Failed to allocate memory - ADAPTER\\n\"));\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* init resource list (must be after pAd allocation) */\n\t\t\tinitList(&pAd->RscTimerMemList);\n\t\t\tinitList(&pAd->RscTaskMemList);\n\t\t\tinitList(&pAd->RscLockMemList);\n\t\t\tinitList(&pAd->RscTaskletMemList);\n\t\t\tinitList(&pAd->RscSemMemList);\n\t\t\tinitList(&pAd->RscAtomicMemList);\n\n\t\t\tinitList(&pAd->RscTimerCreateList);\n\n\t\t\tpAd->OS_Cookie = handle;\n#ifdef WORKQUEUE_BH\n\t\t\t((POS_COOKIE)(handle))->pAd_va = pAd;\n#endif /* WORKQUEUE_BH */\n\t\t}\n\t\tpAd->BeaconBuf = pBeaconBuf;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\\n=== pAd = %p, size = %d ===\\n\\n\", pAd, (UINT32)sizeof(RTMP_ADAPTER)));\n\n\t\tif (RtmpOsStatsAlloc(&pAd->stats, &pAd->iw_stats) == FALSE)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Init spin locks*/\n\t\tNdisAllocateSpinLock(pAd, &pAd->MgmtRingLock);\n\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\n\t\tfor (index =0 ; index < NUM_OF_TX_RING; index++)\n\t\t{\n\t\t\tNdisAllocateSpinLock(pAd, &pAd->TxSwQueueLock[index]);\n\t\t\tNdisAllocateSpinLock(pAd, &pAd->DeQueueLock[index]);\n\t\t\tpAd->DeQueueRunning[index] = FALSE;\n\t\t}\n\n#ifdef RESOURCE_PRE_ALLOC\n\t\t/* \n\t\t\tmove this function from rt28xx_init() to here. now this function only allocate memory and\n\t\t\tleave the initialization job to RTMPInitTxRxRingMemory() which called in rt28xx_init().\n\t\t*/\n\t\tStatus = RTMPAllocTxRxRingMemory(pAd);\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"Failed to allocate memory - TxRxRing\\n\"));\n\t\t\tbreak;\n\t\t}\n#endif /* RESOURCE_PRE_ALLOC */\n\n\t\tNdisAllocateSpinLock(pAd, &pAd->irq_lock);\n\n\n\t\tNdisAllocateSpinLock(pAd, &TimerSemLock);\n\n\n\n#ifdef RALINK_ATE\n#ifdef RTMP_MAC_USB\n\t\tRTMP_OS_ATMOIC_INIT(&pAd->BulkOutRemained, &pAd->RscAtomicMemList);\n\t\tRTMP_OS_ATMOIC_INIT(&pAd->BulkInRemained, &pAd->RscAtomicMemList);\n#endif /* RTMP_MAC_USB */\n#endif /* RALINK_ATE */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef UAPSD_SUPPORT\n/*        UAPSD_Init(pAd);  move to rt28xx_init*/\n#endif /* UAPSD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t/* assign function pointers*/\n#ifdef MAT_SUPPORT\n\t\t/* init function pointers, used in OS_ABL */\n/*\t\tRTMP_MATOpsInit(pAd);  move to rt28xx_init*/\n#endif /* MAT_SUPPORT */\n\t} while (FALSE);\n\n\tif ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))\n/*\t\tkfree(pBeaconBuf);*/\n\t\tos_free_mem(NULL, pBeaconBuf);\n\n\tif ((Status != NDIS_STATUS_SUCCESS) && (pAd != NULL))\n\t{\n\t\tif (pAd->stats != NULL)\n\t\t\tos_free_mem(NULL, pAd->stats);\n\n\t\tif (pAd->iw_stats != NULL)\n\t\t\tos_free_mem(NULL, pAd->iw_stats);\n\t}\n\n\tif (pAd != NULL) /* compile warning: avoid use NULL pointer when pAd == NULL */\n\t\t*ppAdapter = (VOID *)pAd;\n\n\n\t/*\n\t\tInit ProbeRespIE Table\n\t*/\n\tfor (index = 0; index < MAX_LEN_OF_BSS_TABLE; index++) \n\t{\n\t\tif (os_alloc_mem(pAd,&pAd->ProbeRespIE[index].pIe, MAX_VIE_LEN) == NDIS_STATUS_SUCCESS)\n\t\t\tRTMPZeroMemory(pAd->ProbeRespIE[index].pIe, MAX_VIE_LEN);\n\t\telse\n\t\t\tpAd->ProbeRespIE[index].pIe = NULL;\n\t}\t\n\n\tDBGPRINT_S(Status, (\"<-- RTMPAllocAdapterBlock, Status=%x\\n\", Status));\n\treturn Status;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRead initial parameters from EEPROM\n\t\t\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID NICReadEEPROMParameters(RTMP_ADAPTER *pAd, PSTRING mac_addr)\n{\n\tUSHORT i, value, value2;\n\tEEPROM_TX_PWR_STRUC Power;\n\tEEPROM_VERSION_STRUC Version;\n\tEEPROM_ANTENNA_STRUC Antenna;\n\tEEPROM_NIC_CONFIG2_STRUC NicConfig2;\n\tUSHORT  Addr01,Addr23,Addr45 ;\n\tMAC_DW0_STRUC csr2;\n\tMAC_DW1_STRUC csr3;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICReadEEPROMParameters\\n\"));\t\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t\tRT3290_eeprom_access_grant(pAd, TRUE);\n#endif /* RT3290 */\n\n\tif (pAd->chipOps.eeinit)\n\t{\n\t\tpAd->chipOps.eeinit(pAd);\n#ifdef RTMP_EFUSE_SUPPORT\n#ifdef RALINK_ATE\n\t\tif(!pAd->bFroceEEPROMBuffer && pAd->bEEPROMFile)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"--> NICReadEEPROMParameters::(Efuse)Load to EEPROM Buffer Mode\\n\"));\t\n\t\t\teFuseLoadEEPROM(pAd);\n\t\t}\n#endif /* RALINK_ATE */\n#endif /* RTMP_EFUSE_SUPPORT */\n\t}\n\n\t/* Read MAC setting from EEPROM and record as permanent MAC address */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Initialize MAC Address from E2PROM \\n\"));\n\n\tRT28xx_EEPROM_READ16(pAd, 0x04, Addr01);\n\tRT28xx_EEPROM_READ16(pAd, 0x06, Addr23);\n\tRT28xx_EEPROM_READ16(pAd, 0x08, Addr45);\n\n\tpAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);\n\tpAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);\n\tpAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);\n\tpAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);\n\tpAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);\n\tpAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);\n\n\t/*more conveninet to test mbssid, so ap's bssid &0xf1*/\n\tif (pAd->PermanentAddress[0] == 0xff)\n\t\tpAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;\n\t\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\tPRINT_MAC(pAd->PermanentAddress)));\n\n\t/* Assign the actually working MAC Address */\n\tif (pAd->bLocalAdminMAC)\n\t{\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Use the MAC address what is assigned from Configuration file(.dat). \\n\"));\n\t}\n\telse if (mac_addr && \n\t\t\t strlen((PSTRING)mac_addr) == 17 &&\n\t\t\t (strcmp(mac_addr, \"00:00:00:00:00:00\") != 0))\n\t{\n\t\tINT j;\n\t\tPSTRING\tmacptr;\n\n\t\tmacptr = (PSTRING) mac_addr;\n\t\tfor (j=0; j<MAC_ADDR_LEN; j++)\n\t\t{\n\t\t\tAtoH(macptr, &pAd->CurrentAddress[j], 1);\n\t\t\tmacptr=macptr+3;\n\t\t}\t\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Use the MAC address what is assigned from Moudle Parameter. \\n\"));\n\t}\n\telse\n\t{\n\t\tCOPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Use the MAC address what is assigned from EEPROM. \\n\"));\n\t}\n\n\t/* Set the current MAC to ASIC */\t\n\tcsr2.field.Byte0 = pAd->CurrentAddress[0];\n\tcsr2.field.Byte1 = pAd->CurrentAddress[1];\n\tcsr2.field.Byte2 = pAd->CurrentAddress[2];\n\tcsr2.field.Byte3 = pAd->CurrentAddress[3];\n\tRTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);\n\tcsr3.word = 0;\n\tcsr3.field.Byte4 = pAd->CurrentAddress[4];\n#ifdef P2P_SUPPORT\n#ifdef P2P_ODD_MAC_ADJUST\n\tif ((pAd->CurrentAddress[5] & 0x01) == 0x01)\n\t{\n\t\tcsr3.field.Byte5 = pAd->CurrentAddress[5] - 1;\n\t\t/* p2p supporting need to use 2 mac addresses. And regarding the p2p odd mac adjust rule.\n\t\t** sta's mac should be E2P mac and p2p's mac should be \"E2P mac -1\" if original mac is odd value.\n\t\t** so in order to let MAC chip be able to recv pakcet from 2 those mac address,\n\t\t** MAC_ADDR should be original mac - 1.\n\t\t**\n\t\t** ex. E2P mac is 00:0c:43:00:00:03.\n\t\t** in the case, STA MAC will be 00:0c:43:00:03 and p2p MAC will be 00:0c:43:00:00:02\n\t\t** then the MAC_ADDR of MAC should be 00:0c:43:00:00:02\n\t\t** so need to set 2 MAC support for the case.\n\t\t*/\n\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, (1<<16));\n\t}\n\telse\n#endif /* P2P_ODD_MAC_ADJUST */\n#endif /* P2P_SUPPORT */\n\t{\n\t\tcsr3.field.Byte5 = pAd->CurrentAddress[5];\n\t\tcsr3.field.U2MeMask = 0xff;\n\t}\n\tRTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);\n\n#ifdef HDR_TRANS_SUPPORT\n\tRTMP_IO_WRITE32(pAd, HT_MAC_ADDR_DW0, csr2.word);\n\tcsr3.word &= 0xff00ffff;\n\tcsr3.word |= 0x00410000;\t\t\t\t// HW test code\n\tRTMP_IO_WRITE32(pAd, HT_MAC_ADDR_DW1, csr3.word);\n#endif /* HDR_TRANS_SUPPORT */\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE,(\"Current MAC: =%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tPRINT_MAC(pAd->CurrentAddress)));\n\n\t/* if E2PROM version mismatch with driver's expectation, then skip*/\n\t/* all subsequent E2RPOM retieval and set a system error bit to notify GUI*/\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);\n\tpAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"E2PROM: Version = %d, FAE release #%d\\n\", Version.field.Version, Version.field.FaeReleaseNumber));\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tif (Version.field.Version > MT7601_VALID_EEPROM_VERSION)\n\t\t{\n\t\t\tDBGPRINT_ERR((\"MT7601 E2PROM: WRONG VERSION 0x%x, should be %d\\n\",Version.field.Version, MT7601_VALID_EEPROM_VERSION));\n\t\t}\n\n\t}\n\telse\n#endif /* MT7601 */\n\tif (Version.field.Version > VALID_EEPROM_VERSION)\n\t{\n\t\tDBGPRINT_ERR((\"E2PROM: WRONG VERSION 0x%x, should be %d\\n\",Version.field.Version, VALID_EEPROM_VERSION));\n\t}\n\n\t/* Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd*/\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);\n\tpAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] = value;\n\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);\n\tpAd->EEPROMDefaultValue[EEPROM_NIC_CFG2_OFFSET] = value;\n\n\t/* if not return early. cause fail at emulation.*/\n\t/* Init the channel number for TX channel power*/\n#ifdef RT8592\n\tif (IS_RT8592(pAd))\n\t\tRT85592_ReadChannelPwr(pAd);\n\telse\n#endif /* RT8592 */\n#ifdef RT65xx\n\tif (IS_RT6590(pAd))\n\t\tRT6590_ReadChannelPwr(pAd);\n\telse\n#endif /* RT65xx */\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\tMT7601_ReadChannelPwr(pAd);\n\telse\n#endif /* MT7601 */\n\t\tRTMPReadChannelPwr(pAd);\n\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_COUNTRY_REGION, value);\t/* Country Region*/\n\t\tpAd->EEPROMDefaultValue[EEPROM_COUNTRY_REG_OFFSET] = value;\n\t}\n\n#if defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290)\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_NIC3_OFFSET, value);\n\tpAd->EEPROMDefaultValue[EEPROM_NIC_CFG3_OFFSET] = value;\n\tpAd->NicConfig3.word = pAd->EEPROMDefaultValue[EEPROM_NIC_CFG3_OFFSET];\n#endif /* defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290) */\n\n// TODO: check this after receive TC6008 EEPROM format\n#if !defined(RT65xx) && !defined(MT7601) \n\tfor(i = 0; i < 8; i++)\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);\n\t\tpAd->EEPROMDefaultValue[i+EEPROM_BBP_ARRAY_OFFSET] = value;\n\t}\n#endif /* !defined(RT65xx) && !defined(MT7601) */\n\n\t/* We have to parse NIC configuration 0 at here.*/\n\t/* If TSSI did not have preloaded value, it should reset the TxAutoAgc to false*/\n\t/* Therefore, we have to read TxAutoAgc control beforehand.*/\n\t/* Read Tx AGC control bit*/\n\tAntenna.word = pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET];\n\n#ifdef RT65xx\n\tif (IS_RT8592(pAd)) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"RT85592: Antenna.RfIcType=%d, TxPath=%d, RxPath=%d\\n\",\n\t\t\t\t\tAntenna.field.RfIcType, Antenna.field.TxPath, Antenna.field.RxPath));\n\t\t// TODO: fix me!!\n\t\tAntenna.word = 0;\n\t\tAntenna.field.BoardType = 0;\n\t\tAntenna.field.RfIcType = 0xf;\n\t\tAntenna.field.TxPath = 2;\n\t\tAntenna.field.RxPath = 2;\n\t}\n\telse if (IS_RT65XX(pAd)) {\n\t\t// TODO: shiang-6590, now we force the ant as 1*1, remove it after EEPROM is ready!\n\t\tAntenna.word = 0;\n\t\tAntenna.field.BoardType = 0;\n\t\tAntenna.field.RfIcType = 0xf;\n\t\tAntenna.field.TxPath = 1;\n\t\tAntenna.field.RxPath = 1;\n\t}\n#endif /* RT65xx */\n\n\t/* must be put here, because RTMP_CHIP_ANTENNA_INFO_DEFAULT_RESET() will clear *\n\t * EPROM 0x34~3 */\n#ifdef TXRX_SW_ANTDIV_SUPPORT\n\t/* EEPROM 0x34[15:12] = 0xF is invalid, 0x2~0x3 is TX/RX SW AntDiv */\n\tif (((Antenna.word & 0xFF00) != 0xFF00) && (Antenna.word & 0x2000))  \n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \n\t\tpAd->chipCap.bTxRxSwAntDiv = TRUE;\t\t/* for GPIO switch */\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\x1b[mAntenna word %X/%d, AntDiv %d\\x1b[m\\n\", \n\t\t\t\t\tAntenna.word, Antenna.field.BoardType, pAd->NicConfig2.field.AntDiversity));\n\t}\n#endif /* TXRX_SW_ANTDIV_SUPPORT */\n\n\n\t// TODO: shiang, why we only check oxff00??\n\tif ((Antenna.word & 0xFF00) == 0xFF00)\n/*\tif (Antenna.word == 0xFFFF)*/\n\t\tRTMP_CHIP_ANTENNA_INFO_DEFAULT_RESET(pAd, &Antenna);\n\n\t/* Choose the desired Tx&Rx stream.*/\n\tif ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))\n\t\tpAd->CommonCfg.TxStream = Antenna.field.TxPath;\n\n\tif ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))\n\t{\n\t\tpAd->CommonCfg.RxStream = Antenna.field.RxPath;\n\n\t\tif ((pAd->MACVersion != RALINK_3883_VERSION) &&\n\t\t\t(pAd->MACVersion != RALINK_2883_VERSION) &&\n\t\t\t(pAd->CommonCfg.RxStream > 2))\n\t\t{\n\t\t\t/* only 2 Rx streams for RT2860 series*/\n\t\t\tpAd->CommonCfg.RxStream = 2;\n\t\t}\n\t}\n\n\t/* EEPROM offset 0x36 - NIC Configuration 1 */\n\tNicConfig2.word = pAd->EEPROMDefaultValue[EEPROM_NIC_CFG2_OFFSET];\n\n#ifdef WSC_INCLUDED\n\t/* WSC hardware push button function 0811 */\n\t//if ((pAd->MACVersion == 0x28600100) || (pAd->MACVersion == 0x28700100))\n\t\tWSC_HDR_BTN_MR_HDR_SUPPORT_SET(pAd, NicConfig2.field.EnableWPSPBC);\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tif (NicConfig2.word == 0xffff)\n\t\t\tNicConfig2.word = 0;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\t\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif ((NicConfig2.word & 0x00ff) == 0xff)\n\t\t\tNicConfig2.word &= 0xff00;\n\n\t\tif ((NicConfig2.word >> 8) == 0xff)\n\t\t\tNicConfig2.word &= 0x00ff;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (NicConfig2.field.DynamicTxAgcControl == 1)\n\t\tpAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;\n\telse\n\t\tpAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;\n\t\n\t\n\t/* Save value for future using */\n\tpAd->NicConfig2.word = NicConfig2.word;\n\t\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"NICReadEEPROMParameters: RxPath = %d, TxPath = %d\\n\", Antenna.field.RxPath, Antenna.field.TxPath));\n\n\t/* Save the antenna for future use*/\n\tpAd->Antenna.word = Antenna.word;\n\n\t/* Set the RfICType here, then we can initialize RFIC related operation callbacks*/\n\tpAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;\n\n\tpAd->RfIcType = (UCHAR) Antenna.field.RfIcType;\n\n#ifdef RT65xx\n\t// TODO: shiang-6590, currently we don't have eeprom value, so directly force to set it as 0xff\n\tif (IS_RT8592(pAd)) {\n\t\tpAd->Mlme.RealRxPath = 2;\n\t\tpAd->RfIcType = RFIC_UNKNOWN;\n\t}\n\telse\t if (IS_RT65XX(pAd)) {\n\t\tpAd->Mlme.RealRxPath = 1;\n\t\tpAd->RfIcType = RFIC_UNKNOWN;\n\t}\n#endif /* RT65xx */\n\n\t/* check if the chip supports 5G band */\n\tif (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t{\n\t\tif (!RFIC_IS_5G_BAND(pAd))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s():Err! chip not support 5G band %d!\\n\",\n\t\t\t\t\t\t__FUNCTION__, pAd->RfIcType));\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* change to bgn mode */\n\t\t\tSet_WirelessMode_Proc(pAd, \"9\");\n#else\n\t\t\t/* change to bg mode */\n\t\t\tSet_WirelessMode_Proc(pAd, \"0\");\n#endif /* DOT11_N_SUPPORT */\n\t\t\tpAd->RFICType = RFIC_24GHZ;\n\t\t}\n\t\tpAd->RFICType = RFIC_24GHZ | RFIC_5GHZ;\n\t}\n\telse\n\t\tpAd->RFICType = RFIC_24GHZ;\n\n\tRTMP_NET_DEV_NICKNAME_INIT(pAd);\n\n#ifdef RT65xx\n\tif (IS_RT6590(pAd))\n\t{\n\t\t; // TODO: wait TC6008 EEPROM format\n\t}\n\telse\n#endif /* RT65xx */\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\t; // move to MT7601_InitDesiredTSSITable\n\t}\n\telse\n#endif /* MT7601 */\n\t/* Read TSSI reference and TSSI boundary for temperature compensation. This is ugly*/\n\t/* 0. 11b/g*/\n\t{\n\t\t/* these are tempature reference value (0x00 ~ 0xFE)\n\t\t   ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0\n\t\t   TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +\n\t\t   TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND1, Power.word);\n\t\t\tpAd->TssiMinusBoundaryG[4] = Power.field.Byte0;\n\t\t\tpAd->TssiMinusBoundaryG[3] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND2, Power.word);\n\t\t\tpAd->TssiMinusBoundaryG[2] = Power.field.Byte0;\n\t\t\tpAd->TssiMinusBoundaryG[1] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND3, Power.word);\n\t\t\tpAd->TssiRefG   = Power.field.Byte0; /* reference value [0] */\n\t\t\tpAd->TssiPlusBoundaryG[1] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND4, Power.word);\n\t\t\tpAd->TssiPlusBoundaryG[2] = Power.field.Byte0;\n\t\t\tpAd->TssiPlusBoundaryG[3] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND5, Power.word);\n\t\t\tpAd->TssiPlusBoundaryG[4] = Power.field.Byte0;\n\t\t\tpAd->TxAgcStepG = Power.field.Byte1;    \n\t\t\tpAd->TxAgcCompensateG = 0;\n\t\t\tpAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;\n\t\t\tpAd->TssiPlusBoundaryG[0]  = pAd->TssiRefG;\n\n\t\t\t/* Disable TxAgc if the based value is not right*/\n\t\t\tif (pAd->TssiRefG == 0xff)\n\t\t\t\tpAd->bAutoTxAgcG = FALSE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\\n\",\n\t\t\tpAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],\n\t\t\tpAd->TssiRefG,\n\t\t\tpAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],\n\t\t\tpAd->TxAgcStepG, pAd->bAutoTxAgcG));\n\t}\t\n\n#ifdef RT65xx\n\tif (IS_RT6590(pAd))\n\t{\n\t\t; // TODO: wait TC6008 EEPROM format\n\t}\n\telse\n#endif /* RT65xx */\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\t; // MT7601 not support A Band\n\t}\n\telse\n#endif /* MT7601 */\n\t/* 1. 11a*/\n\t{\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND1, Power.word);\n\t\t\tpAd->TssiMinusBoundaryA[4] = Power.field.Byte0;\n\t\t\tpAd->TssiMinusBoundaryA[3] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND2, Power.word);\n\t\t\tpAd->TssiMinusBoundaryA[2] = Power.field.Byte0;\n\t\t\tpAd->TssiMinusBoundaryA[1] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND3, Power.word);\n\t\t\tpAd->TssiRefA = Power.field.Byte0;\n\t\t\tpAd->TssiPlusBoundaryA[1] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND4, Power.word);\n\t\t\tpAd->TssiPlusBoundaryA[2] = Power.field.Byte0;\n\t\t\tpAd->TssiPlusBoundaryA[3] = Power.field.Byte1;\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND5, Power.word);\n\t\t\tpAd->TssiPlusBoundaryA[4] = Power.field.Byte0;\n\t\t\tpAd->TxAgcStepA = Power.field.Byte1;    \n\t\t\tpAd->TxAgcCompensateA = 0;\n\t\t\tpAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;\n\t\t\tpAd->TssiPlusBoundaryA[0]  = pAd->TssiRefA;\n\n\t\t\t/* Disable TxAgc if the based value is not right*/\n\t\t\tif (pAd->TssiRefA == 0xff)\n\t\t\t\tpAd->bAutoTxAgcA = FALSE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\\n\",\n\t\t\tpAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],\n\t\t\tpAd->TssiRefA,\n\t\t\tpAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],\n\t\t\tpAd->TxAgcStepA, pAd->bAutoTxAgcA));\n\t}\t\n\tpAd->BbpRssiToDbmDelta = 0x0;\n\t\n\t/* Read frequency offset setting for RF*/\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);\n\n\tif ((value & 0x00FF) != 0x00FF)\n\t\tpAd->RfFreqOffset = (ULONG) (value & 0x00FF);\n\telse\n\t\tpAd->RfFreqOffset = 0;\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET_COMPERSATION, value);\n\t\tvalue = (value >> 8) & 0xFF;\n\t\tif ( value != 0xFF )\n\t\t{\n\t\t\tif ( value & 0x80 )\n\t\t\t\tpAd->RfFreqOffset -= (value & 0x7F);\n\t\t\telse\n\t\t\t\tpAd->RfFreqOffset += value;\n\t\t}\n\t\t\n\t}\n#endif /* MT7601 */\n\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"E2PROM: RF FreqOffset=0x%lx \\n\", pAd->RfFreqOffset));\n\n\t/*CountryRegion byte offset (38h)*/\n\t{\n\t\tvalue = pAd->EEPROMDefaultValue[EEPROM_COUNTRY_REG_OFFSET] >> 8;\t\t/* 2.4G band*/\n\t\tvalue2 = pAd->EEPROMDefaultValue[EEPROM_COUNTRY_REG_OFFSET] & 0x00FF;\t/* 5G band*/\n\t}\n\t\n\tif ((value <= REGION_MAXIMUM_BG_BAND) || (value == REGION_32_BG_BAND) || (value == REGION_33_BG_BAND))\n\t{\n\t\tpAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;\n\t}\n\n\tif (value2 <= REGION_MAXIMUM_A_BAND)\n\t{\n\t\tpAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;\n\t}\n\t\n\t/* Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.*/\n\t/* The valid value are (-10 ~ 10) */\n\t/* */\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);\n\t\tpAd->BGRssiOffset[0] = value & 0x00ff;\n\t\tpAd->BGRssiOffset[1] = (value >> 8);\n\t}\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\t; // MT7601 not support BGRssiOffset[2]\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);\n/*\t\tif (IS_RT2860(pAd))  RT2860 supports 3 Rx and the 2.4 GHz RSSI #2 offset is in the EEPROM 0x48*/\n\t\t\tpAd->BGRssiOffset[2] = value & 0x00ff;\n\t\tpAd->ALNAGain1 = (value >> 8);\n\t}\n\n#ifdef RT65xx\n\tif (IS_RT6590(pAd))\n\t{\n\t\t/*\n\t\t\tMT7650 E1 doesn't support external LNA.\n\t\t\t2012/04/12\n\t\t*/\n\t\t; // TODO: wait TC6008 EEPROM format\n\t}\n\telse\n#endif /* RT65xx */\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);\n\t\tpAd->BLNAGain = value & 0x00ff;\n\t\tpAd->ALNAGain0 = (value >> 8);\n\t}\n\t\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\t;\t// MT7601 not support A Band\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);\n\t\tpAd->ARssiOffset[0] = value & 0x00ff;\n\t\tpAd->ARssiOffset[1] = (value >> 8);\n\t}\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\t;\t// MT7601 not support A Band\n\t}\n\telse\n#endif /* MT7601 */\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);\n\t\tpAd->ARssiOffset[2] = value & 0x00ff;\n\t\tpAd->ALNAGain2 = (value >> 8);\n\t}\n\n\n\tif (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))\n\t\tpAd->ALNAGain1 = pAd->ALNAGain0;\n\tif (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))\n\t\tpAd->ALNAGain2 = pAd->ALNAGain0;\n\n\t/* Validate 11a/b/g RSSI 0/1/2 offset.*/\n\tfor (i =0 ; i < 3; i++)\n\t{\n\t\tif ((pAd->BGRssiOffset[i] < -10) || (pAd->BGRssiOffset[i] > 10))\n\t\t\tpAd->BGRssiOffset[i] = 0;\n\n\t\tif ((pAd->ARssiOffset[i] < -10) || (pAd->ARssiOffset[i] > 10))\n\t\t\tpAd->ARssiOffset[i] = 0;\n\t}\n\n\t\n#ifdef LED_CONTROL_SUPPORT\n\t/* LED Setting */\n\tRTMPGetLEDSetting(pAd);\n#endif /* LED_CONTROL_SUPPORT */\n\t\t\n\t\tRTMPReadTxPwrPerRate(pAd);\n\n#ifdef SINGLE_SKU\n\t{\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR, pAd->CommonCfg.DefineMaxTxPwr);\n\t}\n\n\t/*\n\t\tSome dongle has old EEPROM value, use ModuleTxpower for saving correct value fo DefineMaxTxPwr.\n\t\tModuleTxpower will override DefineMaxTxPwr (value from EEPROM) if ModuleTxpower is not zero.\n\t*/\n\tif (pAd->CommonCfg.ModuleTxpower > 0) \n\t\tpAd->CommonCfg.DefineMaxTxPwr = pAd->CommonCfg.ModuleTxpower;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TX Power set for SINGLE SKU MODE is : 0x%04x \\n\", pAd->CommonCfg.DefineMaxTxPwr));\n\t\n\tpAd->CommonCfg.bSKUMode = FALSE;\n\tif ((pAd->CommonCfg.DefineMaxTxPwr & 0xFF) <= 0x50)\n\t{\n\t\tif (IS_RT3883(pAd))\n\t\t\tpAd->CommonCfg.bSKUMode = TRUE;\n\t\telse if ((pAd->CommonCfg.AntGain > 0) && (pAd->CommonCfg.BandedgeDelta >= 0))\n\t\t\tpAd->CommonCfg.bSKUMode = TRUE;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Single SKU Mode is %s\\n\", \n\t\t\t\tpAd->CommonCfg.bSKUMode ? \"Enable\" : \"Disable\"));\n#endif /* SINGLE_SKU */\n\n#ifdef SINGLE_SKU_V2\n\tInitSkuRateDiffTable(pAd);\n#endif /* SINGLE_SKU_V2 */\n\n\n#ifdef RTMP_INTERNAL_TX_ALC\n#ifdef RT65xx\n\tif (IS_RT6590(pAd))\n\t{\n\t\t; // TODO: wait TC6008 EEPROM format\n\t}\n\telse\n#endif /* RT65xx */\n\t{\n\t\t/*\n\t\t\tInternal Tx ALC support is starting from RT3370 / RT3390, which combine PA / LNA in single chip.\n\t\t\tThe old chipset don't have this, add new feature flag RTMP_INTERNAL_TX_ALC.\n\t\t*/\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);\n\t\tif (value == 0xFFFF) /*EEPROM is empty*/\n\t\t   \tpAd->TxPowerCtrl.bInternalTxALC = FALSE;\n\t\telse if (value & 1<<13) \n\t\t   \tpAd->TxPowerCtrl.bInternalTxALC = TRUE;\n\t\telse \n\t\t   \tpAd->TxPowerCtrl.bInternalTxALC = FALSE;\n\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TXALC> bInternalTxALC = %d\\n\", pAd->TxPowerCtrl.bInternalTxALC));\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t\tRT3290_eeprom_access_grant(pAd, FALSE);\n#endif /* RT3290 */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pAd->Antenna.field.BoardType = %d, IS_MINI_CARD(pAd) = %d, IS_RT5390U(pAd) = %d\\n\", \n\t\t__FUNCTION__,\n\t\tpAd->Antenna.field.BoardType,\n\t\tIS_MINI_CARD(pAd),\n\t\tIS_RT5390U(pAd)));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICReadEEPROMParameters\\n\"));\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tSet default value from EEPROM\n\t\t\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tNICInitAsicFromEEPROM(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tUINT32 data = 0;\n#endif /* CONFIG_STA_SUPPORT */\n\tUSHORT i;\n#ifdef RALINK_ATE\n\tUSHORT value;\n#endif /* RALINK_ATE */\n\tEEPROM_NIC_CONFIG2_STRUC NicConfig2;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitAsicFromEEPROM\\n\"));\n\n#if !defined(RT65xx) && !defined(MT7601)\n\tfor(i = EEPROM_BBP_ARRAY_OFFSET; i < NUM_EEPROM_BBP_PARMS; i++)\n\t{\n\t\tUCHAR BbpRegIdx, BbpValue;\n\t\n\t\tif ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))\n\t\t{\n\t\t\tBbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);\n\t\t\tBbpValue  = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);\n\t\t}\n\t}\n#endif /* #if !defined(RT65xx) && !defined(MT7601) */\n\n\tNicConfig2.word = pAd->NicConfig2.word;\n\n\t/* finally set primary ant */\n\tAntCfgInit(pAd);\n\n\tRTMP_CHIP_ASIC_INIT_TEMPERATURE_COMPENSATION(pAd);\n\n\tif (pAd->chipOps.AsicRfInit)\n\t\tpAd->chipOps.AsicRfInit(pAd);\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Read Hardware controlled Radio state enable bit*/\n\t\tif (NicConfig2.field.HardwareRadioControl == 1)\n\t\t{\n\t\t\tBOOLEAN radioOff = FALSE;\n\t\t\tpAd->StaCfg.bHardwareRadio = TRUE;\n\n#ifdef RT3290\n\t\t\tif (IS_RT3290(pAd))\n\t\t\t{\n\t\t\t\t// Read GPIO pin0 as Hardware controlled radio state\n\t\t\t\tRTMP_IO_FORCE_READ32(pAd, WLAN_FUN_CTRL, &data);\n\t\t\t\tif ((data & 0x100) == 0)\n\t\t\t\t\tradioOff = TRUE;\n\t\t\t}\n\t\t\telse\n#endif /* RT3290 */\n\t\t\t{\n\t\t\t\t/* Read GPIO pin2 as Hardware controlled radio state*/\n\t\t\t\tRTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);\n\t\t\t\tif ((data & 0x04) == 0)\n\t\t\t\t\tradioOff = TRUE;\n\t\t\t}\n\n\t\t\tif (radioOff)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.bHwRadio = FALSE;\n\t\t\t\tpAd->StaCfg.bRadio = FALSE;\n/*\t\t\t\tRTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);*/\n\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpAd->StaCfg.bHardwareRadio = FALSE;\n\n#ifdef LED_CONTROL_SUPPORT\n\t\tif (pAd->StaCfg.bRadio == FALSE)\n\t\t{\n\t\t\tRTMPSetLED(pAd, LED_RADIO_OFF);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMPSetLED(pAd, LED_RADIO_ON);\n\t\t}\n#endif /* LED_CONTROL_SUPPORT */\n\n\t}\n#ifdef PCIE_PS_SUPPORT\n#if defined(RT3090) || defined(RT3592) || defined(RT3390) || defined(RT3593) || defined(RT5390) || defined(RT5392) || defined(RT5592) || defined(RT3290)\n\t\tif (IS_RT3090(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd) \n\t\t\t|| IS_RT3593(pAd) || IS_RT5390(pAd) || IS_RT5392(pAd)\n\t\t\t|| IS_RT5592(pAd) || IS_RT3290(pAd))\n\t\t{\n\t\t\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\t\t\tif (pChipOps->AsicReverseRfFromSleepMode)\n\t\t\t\tpChipOps->AsicReverseRfFromSleepMode(pAd, TRUE);\n\t\t}\n\t\t/* 3090 MCU Wakeup command needs more time to be stable. */\n\t\t/* Before stable, don't issue other MCU command to prevent from firmware error.*/\n\t\tif ((((IS_RT3090(pAd)|| IS_RT3572(pAd) ||IS_RT3390(pAd) \n\t\t\t|| IS_RT3593(pAd) || IS_RT5390(pAd) || IS_RT5392(pAd)) \n\t\t\t  && IS_VERSION_AFTER_F(pAd)) || IS_RT5592(pAd) || IS_RT3290(pAd))\n\t\t\t&& (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) \n\t\t\t&& (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%s::%d,release Mcu Lock\\n\",__FUNCTION__,__LINE__));\n\t\t\tRTMP_SEM_LOCK(&pAd->McuCmdLock);\n\t\t\tpAd->brt30xxBanMcuCmd = FALSE;\n\t\t\tRTMP_SEM_UNLOCK(&pAd->McuCmdLock);\n\t\t}\n#endif /* defined(RT3090) || defined(RT3592) || defined(RT3390) || defined(RT3593) || defined(RT5390) || defined(RT5392) */\n#endif /* PCIE_PS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef RTMP_MAC_USB\n\t\tif (IS_RT30xx(pAd)|| IS_RT3572(pAd))\n\t\t{\n\t\t\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\t\t\tif (pChipOps->AsicReverseRfFromSleepMode)\n\t\t\t\tpChipOps->AsicReverseRfFromSleepMode(pAd, TRUE);\n\t\t}\n#endif /* RTMP_MAC_USB */\n\t/* Turn off patching for cardbus controller*/\n\tif (NicConfig2.field.CardbusAcceleration == 1)\n\t{\n/*\t\tpAd->bTest1 = TRUE;*/\n\t}\n\n\tif (NicConfig2.field.DynamicTxAgcControl == 1)\n\t\tpAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;\n\telse\n\t\tpAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\t/*\n\t    Internal Tx ALC support is starting from RT3370 / RT3390, which combine PA / LNA in single chip.\n\t    The old chipset don't have this, add new feature flag RTMP_INTERNAL_TX_ALC.\n\t */\n\n\t/* Internal Tx ALC */\n\tif (((NicConfig2.field.DynamicTxAgcControl == 1) && \n            (NicConfig2.field.bInternalTxALC == 1)) ||\n            ((!IS_RT3390(pAd)) && (!IS_RT3350(pAd)) &&\n            (!IS_RT3352(pAd)) && (!IS_RT5350(pAd)) && (!IS_RT5390(pAd)) && (!IS_RT3290(pAd)) && (!IS_MT7601(pAd))))\n\t{\n\t\t/*\n\t\t\tIf both DynamicTxAgcControl and bInternalTxALC are enabled,\n\t\t\tit is a wrong configuration.\n\t\t\tIf the chipset does not support Internal TX ALC, we shall disable it.\n\t\t*/\n\t\t\tpAd->TxPowerCtrl.bInternalTxALC = FALSE;\n\t}\n\telse\n\t{\n\t\tif (NicConfig2.field.bInternalTxALC == 1)\n\t\t{\n\t\t\tpAd->TxPowerCtrl.bInternalTxALC = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->TxPowerCtrl.bInternalTxALC = FALSE;\n\t\t}\n\t}\n\n\t\n\t/* Old 5390 NIC always disables the internal ALC */\n\t\n\tif (pAd->MACVersion == 0x53900501)\n\t{\n\t\tpAd->TxPowerCtrl.bInternalTxALC = FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pAd->TxPowerCtrl.bInternalTxALC = %d\\n\", \n\t\t__FUNCTION__, \n\t\tpAd->TxPowerCtrl.bInternalTxALC));\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#ifdef RALINK_ATE\n\tRT28xx_EEPROM_READ16(pAd, EEPROM_TSSI_GAIN_AND_ATTENUATION, value);\n\tvalue = (value & 0x00FF);\t\n\t\n\tif (IS_RT5390(pAd))\n\t{\n\t\tpAd->TssiGain = 0x02;\t /* RT5390 uses 2 as TSSI gain/attenuation default value */\n\t}\n\telse\n\t{\n\t\tpAd->TssiGain = 0x03; /* RT5392 uses 3 as TSSI gain/attenuation default value */\n\t}\t\n\t\n\tif ((value != 0x00) && (value != 0xFF))\n\t{\n\t\tpAd->TssiGain =  (UCHAR) (value & 0x000F);\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: EEPROM_TSSI_GAIN_AND_ATTENUATION = 0x%X, pAd->TssiGain=0x%x\\n\", \n\t\t\t\t__FUNCTION__, \n\t\t\t\tvalue, \n\t\t\t\tpAd->TssiGain));\n#endif // RALINK_ATE //\n\n\trtmp_bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Handle the difference when 1T*/\n\t\t{\n\t\t\tif(pAd->Antenna.field.TxPath == 1)\n\t\t\t\trtmp_bbp_set_txdac(pAd, 0);\n\t\t\telse\n\t\t\t\trtmp_bbp_set_txdac(pAd, 2);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Use Hw Radio Control Pin=%d; if used Pin=%d;\\n\", \n\t\t\t\t\tpAd->StaCfg.bHardwareRadio, pAd->StaCfg.bHardwareRadio));\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMP_EEPROM_ASIC_INIT(pAd);\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\t\t/*\n\t\t\tOnly for RT3593, RT5390 (Maybe add other chip in the future)\n\t\t\tSometimes the frequency will be shift, we need to adjust it.\n\t\t*/\n\t\tif (pAd->StaCfg.AdaptiveFreq == TRUE) /*Todo: iwpriv and profile support.*/\n\t\tpAd->FreqCalibrationCtrl.bEnableFrequencyCalibration = TRUE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration = %d\\n\", \n\t\t\t__FUNCTION__, \n\t\t\tpAd->FreqCalibrationCtrl.bEnableFrequencyCalibration));\n\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TxPath = %d, RxPath = %d, RFIC=%d\\n\", \n\t\t\t\tpAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath, pAd->RfIcType));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitAsicFromEEPROM\\n\"));\n}\n\n\n#ifdef DBG\nVOID dump_pdma_reg(RTMP_ADAPTER *pAd)\n{\n\t\n\n}\n#endif /* DBG */\n\n\n\n\nVOID AsicInitBcnBuf(IN RTMP_ADAPTER *pAd)\n{\n\tint idx;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\t\n\t\n\tfor (idx = 0; idx < pChipCap->BcnMaxHwNum; idx++)\n\t\tpAd->BeaconOffset[idx] = pChipCap->BcnBase[idx];\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"< Beacon Information: >\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tFlgIsSupSpecBcnBuf = %s\\n\", pChipCap->FlgIsSupSpecBcnBuf ? \"TRUE\" : \"FALSE\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tBcnMaxHwNum = %d\\n\", pChipCap->BcnMaxHwNum));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tBcnMaxNum = %d\\n\", pChipCap->BcnMaxNum));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tBcnMaxHwSize = 0x%x\\n\", pChipCap->BcnMaxHwSize));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tWcidHwRsvNum = %d\\n\", pChipCap->WcidHwRsvNum));\n\tfor (idx = 0; idx < pChipCap->BcnMaxHwNum; idx++) {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t\\tBcnBase[%d] = 0x%x, pAd->BeaconOffset[%d]=0x%x\\n\",\n\t\t\t\t\tidx, pChipCap->BcnBase[idx], idx, pAd->BeaconOffset[idx]));\n\t}\n\n\n#ifdef RLT_MAC\n\t{\n\t\tRTMP_REG_PAIR bcn_mac_reg_tb[] = {\n\t\t\t{BCN_OFFSET0, 0x18100800},\n\t\t\t{BCN_OFFSET1, 0x38302820},\n\t\t\t{BCN_OFFSET2, 0x58504840},\n\t\t\t{BCN_OFFSET3, 0x78706860},\n\t\t};\n\t\tfor (idx = 0; idx < 4; idx ++)\n\t\t{\n\t\t\tRTMP_IO_WRITE32(pAd, (USHORT)bcn_mac_reg_tb[idx].Register, \n\t\t\t\t\t\t\t\t\tbcn_mac_reg_tb[idx].Value);\n\t\t}\n\t}\n#endif /* RLT_MAC */\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tInitialize NIC hardware\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nNDIS_STATUS\tNICInitializeAdapter(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN   BOOLEAN    bHardReset)\n{\n\tNDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\n\tWPDMA_GLO_CFG_STRUC\tGloCfg;\n\tULONG j=0;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitializeAdapter\\n\"));\n\t\n\t/* Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits */\nretry:\n\n\tif (AsicWaitPDMAIdle(pAd, 100, 1000) != TRUE) {\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t\n\n\t/* Initialze ASIC for TX & Rx operation*/\n\tif (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\treturn NDIS_STATUS_FAILURE;\n\n\t\tif (pAd->chipOps.loadFirmware)\n\t\t{\n\t\t\tif (j++ == 0)\n\t\t\t{\n\t\t\t\tNICLoadFirmware(pAd);\n\t\t\t\tgoto retry;\n\t\t\t}\n\t\t}\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitializeAdapter\\n\"));\n\treturn Status;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tInitialize ASIC\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nNDIS_STATUS\tNICInitializeAsic(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  BOOLEAN\t\tbHardReset)\n{\n\tULONG\t\t\tIndex = 0;\n\tUINT32\t\t\tMACValue = 0;\n#ifdef RTMP_MAC_USB\n\tUINT32\t\t\tCounter = 0;\n\tUSB_DMA_CFG_STRUC UsbCfg;\n#endif /* RTMP_MAC_USB */\n\tUSHORT\t\t\tKeyIdx;\n\n#ifdef RLT_MAC\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n#endif\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> NICInitializeAsic\\n\"));\n\n\n\n#ifdef RTMP_MAC_USB\n\t/* Make sure MAC gets ready after NICLoadFirmware().*/\n\t\n\tIndex = 0;\n\t\n\t/*To avoid hang-on issue when interface up in kernel 2.4, */\n\t/*we use a local variable \"MacCsr0\" instead of using \"pAd->MACVersion\" directly.*/\n\tif (WaitForAsicReady(pAd) != TRUE)\n\t\t\treturn NDIS_STATUS_FAILURE;\n\n\t// TODO: shiang, how about the value setting of pAd->MACVersion?? Original it assigned here\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():MACVersion[Ver:Rev=0x%08x]\\n\",\n\t\t\t__FUNCTION__, pAd->MACVersion));\n\n\n\tif ( !IS_MT7601(pAd) )\n\t{\n\t/* turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.*/\n\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MACValue);\n\tMACValue &= (~0x2000);\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MACValue);\n\t}\n\t\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);\n\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);\n\n#ifdef RTMP_MAC\n\tRTUSBVenderReset(pAd);\n#endif\n\tRTMPusecDelay(1000); \n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);\n#endif /* RTMP_MAC_USB */\n\n#ifdef RTMP_MAC_USB\n\tUsbCfg.word = 0;\n\t\n\t/* USB1.1 do not use bulk in aggregation */\n\tif (pAd->BulkInMaxPacketSize == 512)\n\t\tUsbCfg.field.RxBulkAggEn = 1;\n\n\t/* for last packet, PBF might use more than limited, so minus 2 to prevent from error */\n\t\tUsbCfg.field.RxBulkAggLmt = (MAX_RXBULK_SIZE /1024)-3;\n\tUsbCfg.field.RxBulkAggTOut = 0x80; \n\n\tUsbCfg.field.RxBulkEn = 1;\n\tUsbCfg.field.TxBulkEn = 1;\n\t\n\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word);\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tUsbCfg.field.UDMA_RX_WL_DROP = 1;\n\t\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word);\n\t\n\t\tUsbCfg.field.UDMA_RX_WL_DROP = 0;\n\t\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word);\n\n\t}\n\t\n#endif /* MT7601 */\n\n#ifdef RLT_MAC\n\t/* Select Q2 to receive command response */\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\tAndesFunSetOP(pAd, Q_SELECT, pChipCap->CmdRspRxRing);\n\tRTUSBBulkCmdRspEventReceive(pAd);\n\n\tRTUSBBulkReceive(pAd);\n#endif /* RLT_MAC */\n#endif /* RTMP_MAC_USB */\n\n#if defined(RTMP_MAC_USB) && defined(RLT_MAC)\n\n\tAndesRandomWritePair(pAd, MACRegTable, NUM_MAC_REG_PARMS);\n#else\n\n\t/* Initialize MAC register to default value*/\n\tfor(Index=0; Index<NUM_MAC_REG_PARMS; Index++)\n\t{\n\t\tRTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);\n\t}\n#endif /* defined(RTMP_MAC_USB) && defined(RLT_MAC) */\n\n\tAsicInitBcnBuf(pAd);\n\n\t/* re-set specific MAC registers for individual chip */\n\tif (pAd->chipOps.AsicMacInit != NULL)\n\t\tpAd->chipOps.AsicMacInit(pAd);\n\n\t\n\t/* Before program BBP, we need to wait BBP/RF get wake up.*/\n\tIndex = 0;\n\tdo\n\t{\n\t\tRTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MACValue);\n\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\n\t\t\treturn NDIS_STATUS_FAILURE;\n\n\t\tif ((MACValue & 0x03) == 0)\t/* if BB.RF is stable*/\n\t\t\tbreak;\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Check MAC_STATUS_CFG  = Busy = %x\\n\", MACValue));\n\t\tRTMPusecDelay(1000);\n\t} while (Index++ < 100);\n\n\n#ifdef RTMP_MAC_USB\n\tif ( !IS_MT7601(pAd) )\n\t{\n\t/* The commands to firmware should be after these commands, these commands will init firmware*/\n\t/* PCI and USB are not the same because PCI driver needs to wait for PCI bus ready*/\n\t\tRTUSBWriteMACRegister(pAd, H2M_BBP_AGENT, 0, FALSE); /* initialize BBP R/W access agent. */\n\t\tRTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0, FALSE);\n\t\tRTUSBWriteMACRegister(pAd, H2M_INT_SRC, 0, FALSE);\n\t\tAsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00, FALSE); /* reset rf by MCU supported by new firmware */\n\t}\n#endif /* RTMP_MAC_USB */\n\n\t/* Wait to be stable.*/\n\tRTMPusecDelay(1000);\n\tpAd->LastMCUCmd = 0x72;\n\n\tNICInitBBP(pAd);\n\t\n\n\tif ((IS_RT3883(pAd)) || IS_RT65XX(pAd) || IS_MT7601(pAd) ||\n\t\t((pAd->MACVersion >= RALINK_2880E_VERSION) &&\n\t\t(pAd->MACVersion < RALINK_3070_VERSION))) /* 3*3*/\n\t{\n\t\t/* enlarge MAX_LEN_CFG*/\n\t\tUINT32 csr;\n\t\tRTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);\n#if defined(RT2883) || defined(RT3883) || defined(RT3593) || defined(RT65xx) || defined(MT7601)\n\t\tif (IS_RT2883(pAd) || IS_RT3883(pAd) || IS_RT3593(pAd) || IS_RT65XX(pAd) || IS_MT7601(pAd)) \n\t\t{\n\t\t\tcsr |= 0x3fff;\n\t\t}\n\t\telse\n#endif /* defined(RT2883) || defined(RT3883) || defined(RT3593) */\n\t\t{\n\t\t\tcsr &= 0xFFF;\n\t\t\tcsr |= 0x2000;\n\t\t}\n\t\tRTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);\n\t}\n\n#ifdef RTMP_MAC_USB\n#ifdef RLT_MAC\n\t{\n\tUINT32 MACValue[128 * 2];\n\n\tfor (Index = 0; Index < 128 * 2; Index+=2)\n\t{\n\t\tMACValue[Index] = 0xffffffff;\n\t\tMACValue[Index + 1] = 0x00ffffff;\n\t}\n\n\tAndesBurstWrite(pAd, MAC_WCID_BASE, MACValue, 128 * 2);\n\n\t}\n#else\n\t{\n\tUCHAR\tMAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};\n\n\t/*Initialize WCID table*/\n\tfor(Index =0 ;Index < 254;Index++)\n\t{\n\t\tRTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8, FALSE);\n\t}\n\t}\n\n#endif /* RLT_MAC */\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* Add radio off control*/\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pAd->StaCfg.bRadio == FALSE)\n\t\t{\n/*\t\t\tRTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);*/\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set Radio Off\\n\"));\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\t\n\n\t/* Clear raw counters*/\n\tNicResetRawCounters(pAd);\n\t\n\t/* ASIC will keep garbage value after boot*/\n\t/* Clear all shared key table when initial*/\n\t/* This routine can be ignored in radio-ON/OFF operation. */\n\tif (bHardReset)\n\t{\n#if defined(RTMP_MAC_USB) && defined(RLT_MAC)\n\t\t{\n\t\t\tUINT32 MACValue[4];\n\n\t\t\tfor (Index = 0; Index < 4; Index++)\n\t\t\t\tMACValue[Index] = 0;\n\n\t\t\tAndesBurstWrite(pAd, SHARED_KEY_MODE_BASE, MACValue, 4);\n\t\t}\n\n\t\t/* Clear all pairwise key table when initial*/\n\t\t{\n\t\t\tUINT32 MACValue[256];\n\n\t\t\tfor (Index = 0; Index < 256; Index++)\n\t\t\t\tMACValue[Index] = 1;\n\n\t\t\tAndesBurstWrite(pAd, MAC_WCID_ATTRIBUTE_BASE, MACValue, 256);\n\t\t}\n#else\n\n\t\tprintk(\"SHARED_KEY_MODE_BASE = %x\\n\", SHARED_KEY_MODE_BASE);\n\t\tprintk(\"MAC_WCID_ATTRIBUTE_BASE = %x\\n\", MAC_WCID_ATTRIBUTE_BASE);\n\t\tfor (KeyIdx = 0; KeyIdx < 4; KeyIdx++)\n\t\t{\n\t\t\tRTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);\n\t\t}\n\n\t\t/* Clear all pairwise key table when initial*/\n\t\tfor (KeyIdx = 0; KeyIdx < 256; KeyIdx++)\n\t\t{\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);\n\t\t}\n#endif /* defined(RTMP_MAC_USB) && defined(RLT_MAC) */\n\t}\n\n\t/* assert HOST ready bit*/\n/*  RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0);  2004-09-14 asked by Mark*/\n/*  RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4);*/\n\n\t/* It isn't necessary to clear this space when not hard reset. */\n\tif (bHardReset == TRUE)\n\t{\n\t\t/* clear all on-chip BEACON frame space */\n#ifdef CONFIG_AP_SUPPORT\n\t\tINT\ti, apidx;\n\t\tfor (apidx = 0; apidx < HW_BEACON_MAX_COUNT(pAd); apidx++)\n\t\t{\n\t\t\tif (pAd->BeaconOffset[apidx] > 0) {\n\t\t\t\t// TODO: shiang-6590, if we didn't define MBSS_SUPPORT, the pAd->BeaconOffset[x] may set as 0 when chipCap.BcnMaxHwNum != HW_BEACON_MAX_COUNT\n\t\t\t\tfor (i = 0; i < HW_BEACON_OFFSET; i+=4)\n\t\t\t\t\tRTMP_CHIP_UPDATE_BEACON(pAd, pAd->BeaconOffset[apidx] + i, 0x00, 4); \n\t\t\t}\n#ifdef RTMP_MAC_USB\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t\t\tif (pAd->CommonCfg.pBeaconSync)\n\t\t\t\t\tpAd->CommonCfg.pBeaconSync->BeaconBitMap &= (~(BEACON_BITMAP_MASK & (1 << apidx)));\n\t\t\t}\n#endif /* RTMP_MAC_USB */\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\t\n#ifdef RTMP_MAC_USB\n\tAsicDisableSync(pAd);\n\n\t/* Clear raw counters*/\n\tNicResetRawCounters(pAd);\n\n\t/* Default PCI clock cycle per ms is different as default setting, which is based on PCI.*/\n\tRTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);\n\tCounter&=0xffffff00;\n\tCounter|=0x000001e;\n\tRTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.*/\n\t\tif ((pAd->MACVersion&0xffff) != 0x0101)\n\t\t\tRTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t{\n\t\tUINT32 coex_val;\n\t\t//halt wlan tx when bt_rx_busy asserted\n\t\tRTMP_IO_READ32(pAd, COEXCFG2, &coex_val);\n\t\tcoex_val |= 0x100;\n\t\tRTMP_IO_WRITE32(pAd, COEXCFG2, coex_val);\n\t}\n#endif /* RT3290 */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- NICInitializeAsic\\n\"));\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n\n\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID NICUpdateFifoStaCounters(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tTX_STA_FIFO_STRUC\tStaFifo;\n\tMAC_TABLE_ENTRY\t\t*pEntry = NULL;\n\tUINT32\t\t\t\ti = 0;\n\tUCHAR\t\t\t\tpid = 0, wcid = 0;\n\tINT32\t\t\t\treTry;\n\tUCHAR\t\t\t\tsuccMCS;\n\n#ifdef RALINK_ATE\t\t\n\t/* Nothing to do in ATE mode */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n#ifdef RTMP_MAC_USB\n#ifdef CONFIG_STA_SUPPORT\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\treturn;\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef RT65xx\n\t// TODO: shiang-6590, for 8592 now we have tx-status report packet from hardware!!\n\tif (IS_RT65XX(pAd))\n\t\treturn;\n#endif /* RT65xx */\n\n\n\t\tdo\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);\n\n\t\t\tif (StaFifo.field.bValid == 0)\n\t\t\t\tbreak;\n\t\t\n\t\t\twcid = (UCHAR)StaFifo.field.wcid;\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFIFO) {\n\t\t\tdbQueueEnqueue(0x73, (UCHAR *)(&StaFifo.word));\n\t\t}\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/* ignore NoACK and MGMT frame use 0xFF as WCID */\n\t\t\tif ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))\n\t\t\t{\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* PID store Tx MCS Rate */\n\t\t\tpid = (UCHAR)StaFifo.field.PidType;\n\n\t\t\tpEntry = &pAd->MacTab.Content[wcid];\n\n\t\t\tpEntry->DebugFIFOCount++;\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef TXBF_SUPPORT\n\t\t\t/* Update BF statistics*/\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t{\n\t\t\t\tint succMCS = (StaFifo.field.SuccessRate & 0x7F);\n\t\t\t\tint origMCS = pid;\n\n\t\t\t\tif (succMCS==32)\n\t\t\t\t\torigMCS = 32;\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\t\tif (succMCS>origMCS && pEntry->HTCapability.MCSSet[2]==0xff)\n\t\t\t\t\torigMCS += 16;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t\t\tif (succMCS>origMCS)\n\t\t\t\t\torigMCS = succMCS+1;\n\n\t\t\t\t/* MCS16 falls back to MCS8*/\n\t\t\t\tif (origMCS>=16 && succMCS<=8)\n\t\t\t\t\tsuccMCS += 8;\n\n\t\t\t\t/* MCS8 falls back to 0 */\n\t\t\t\tif (origMCS >= 8 && succMCS == 0)\n\t\t\t\t\tsuccMCS += 7;\n\n\t\t\t\treTry = origMCS-succMCS;\n\n\t\t\t\tif (StaFifo.field.eTxBF) {\n\t\t\t\t\tif (StaFifo.field.TxSuccess)\n\t\t\t\t\t\tpEntry->TxBFCounters.ETxSuccessCount++;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->TxBFCounters.ETxFailCount++;\n\t\t\t\t\tpEntry->TxBFCounters.ETxRetryCount += reTry;\n\t\t\t\t}\n\t\t\t\telse if (StaFifo.field.iTxBF) {\n\t\t\t\t\tif (StaFifo.field.TxSuccess)\n\t\t\t\t\t\tpEntry->TxBFCounters.ITxSuccessCount++;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->TxBFCounters.ITxFailCount++;\n\t\t\t\t\tpEntry->TxBFCounters.ITxRetryCount += reTry;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (StaFifo.field.TxSuccess)\n\t\t\t\t\t\tpEntry->TxBFCounters.TxSuccessCount++;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->TxBFCounters.TxFailCount++;\n\t\t\t\t\tpEntry->TxBFCounters.TxRetryCount += reTry;\n\t\t\t\t}\n\t\t\t}\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef UAPSD_SUPPORT\n\t\t\tUAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);\n#endif /* UAPSD_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t\t\tcontinue;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tif (!StaFifo.field.TxSuccess)\n\t\t\t{\n\t\t\t\tpEntry->FIFOCount++;\n\t\t\t\tpEntry->OneSecTxFailCount++;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\tif (pEntry->FIFOCount >= 1)\n\t\t\t\t{\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"#\"));\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\tpEntry->NoBADataCountDown = 64;\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(IS_ENTRY_TDLS(pEntry))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry->TdlsTxFailCount++;\n\t\t\t\t\t\t\tif (pEntry->TdlsTxFailCount >= 15)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"TDLS: TxFail >= 15 LinkTearDown !!!\\n\"));\n\t\t\t\t\t\t\t\tTDLS_TearDownPeerLink(pAd, pEntry->Addr, FALSE);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\t\t/* Update the continuous transmission counter.*/\n\t\t\t\t\tpEntry->ContinueTxFailCnt++;\n\n\t\t\t\t\tif(pEntry->PsMode == PWR_ACTIVE)\n\t\t\t\t\t{\n#ifdef DOT11_N_SUPPORT\t\t\t\t\t\n\t\t\t\t\t\tint tid;\n\t\t\t\t\t\tfor (tid=0; tid<NUM_OF_TID; tid++)\n\t\t\t\t\t\t\tBAOriSessionTearDown(pAd, pEntry->Aid,  tid, FALSE, FALSE);\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t\t\t}\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tif ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))\n\t\t\t\t{\n\t\t\t\t\tpEntry->NoBADataCountDown--;\n\t\t\t\t\tif (pEntry->NoBADataCountDown==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"@\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tpEntry->FIFOCount = 0;\n\t\t\t\tpEntry->OneSecTxNoRetryOkCount++;\n\n\n\t\t\t\t/* update NoDataIdleCount when sucessful send packet to STA.*/\n\t\t\t\tpEntry->NoDataIdleCount = 0;\n\t\t\t\tpEntry->ContinueTxFailCnt = 0;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\tif(IS_ENTRY_TDLS(pEntry))\n\t\t\t\t\t\tpEntry->TdlsTxFailCount = 0;\n\t\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t}\n\n\t\t\tsuccMCS = StaFifo.field.SuccessRate & 0x7F;\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tif (pEntry->HTCapability.MCSSet[2] == 0xff)\n\t\t\t{\n\t\t\t\tif (succMCS > pid)\n\t\t\t\t\tpid = pid + 16;\n\t\t\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t\tif (StaFifo.field.TxSuccess)\n\t\t\t{\n\t\t\t\tpEntry->TXMCSExpected[pid]++;\n\t\t\t\tif (pid == succMCS)\n\t\t\t\t\tpEntry->TXMCSSuccessful[pid]++;\n\t\t\t\telse \n\t\t\t\t\tpEntry->TXMCSAutoFallBack[pid][succMCS]++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpEntry->TXMCSFailed[pid]++;\n\t\t\t}\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tif (pid >= 16 && succMCS <= 8)\n\t\t\t\tsuccMCS += (2 - (succMCS >> 3)) * 7;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t\treTry = pid - succMCS;\n\n\t\t\tif (reTry > 0)\n\t\t\t{\n\t\t\t\t/* MCS8 falls back to 0 */\n\t\t\t\tif (pid>=8 && succMCS==0)\n\t\t\t\t\treTry -= 7;\n\t\t\t\telse if ((pid >= 12) && succMCS <=7)\n\t\t\t\t\treTry -= 4;\n\n\t\t\t\tpEntry->OneSecTxRetryOkCount += reTry;\n\t\t\t}\n\n\t\t\ti++;\t/* ASIC store 16 stack*/\n\t\t} while ( i < (TX_RING_SIZE<<1) );\n\n}\n\n\n#ifdef FIFO_EXT_SUPPORT\nBOOLEAN NicGetMacFifoTxCnt(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry)\n{\n\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t{\n\t\tWCID_TX_CNT_STRUC wcidTxCnt;\n\t\tUINT32 regAddr;\n\t\t\n\t\tregAddr = WCID_TX_CNT_0 + (pEntry->Aid - 1) * 4;\n\t\tRTMP_IO_READ32(pAd, regAddr, &wcidTxCnt.word);\n\n\t\tpEntry->fifoTxSucCnt += wcidTxCnt.field.succCnt;\n\t\tpEntry->fifoTxRtyCnt += wcidTxCnt.field.reTryCnt;\n\t}\n\n\treturn TRUE;\n}\n\n\nVOID AsicFifoExtSet(IN RTMP_ADAPTER *pAd)\n{\n\tif (pAd->chipCap.FlgHwFifoExtCap)\n\t{\n\t\tRTMP_IO_WRITE32(pAd, WCID_MAPPING_0, 0x04030201);\n\t\tRTMP_IO_WRITE32(pAd, WCID_MAPPING_1, 0x08070605);\n\t}\n}\n\n\nVOID AsicFifoExtEntryClean(\n\tIN RTMP_ADAPTER * pAd, \n\tIN MAC_TABLE_ENTRY *pEntry)\n{\n\tWCID_TX_CNT_STRUC wcidTxCnt;\n\tUINT32 regAddr;\n\t\t\t\n\tif (pAd->chipCap.FlgHwFifoExtCap)\n\t{\n\t\t/* We clean the fifo info when MCS is 0 and Aid is from 1~8 */\n\t\tif (pEntry->Aid >=1  && pEntry->Aid <= 8)\n\t\t{\t\t\n\t\t\tregAddr = WCID_TX_CNT_0 + (pEntry->Aid - 1) * 4;\n\t\t\tRTMP_IO_READ32(pAd, regAddr, &wcidTxCnt.word);\n\t\t}\n\t}\n}\n#endif /* FIFO_EXT_SUPPORT */\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRead Tx statistic raw counters from hardware registers and record to\n\t\trelated software variables for later on query\n\n\tArguments:\n\t\tpAd\t\t\t\t\tPointer to our adapter\n\t\tpStaTxCnt0\t\t\tPointer to record \"TX_STA_CNT0\" (0x170c)\n\t\tpStaTxCnt1\t\t\tPointer to record \"TX_STA_CNT1\" (0x1710)\n\n\tReturn Value:\n\t\tNone\n\n\t========================================================================\n*/\nVOID NicGetTxRawCounters(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_STA_CNT0_STRUC *pStaTxCnt0,\n\tIN TX_STA_CNT1_STRUC *pStaTxCnt1)\n{\n\n\tRTMP_IO_READ32(pAd, TX_STA_CNT0, &pStaTxCnt0->word);\n\tRTMP_IO_READ32(pAd, TX_STA_CNT1, &pStaTxCnt1->word);\n\n\tpAd->bUpdateBcnCntDone = TRUE;\t/* not appear in Rory's code */\n\tpAd->RalinkCounters.OneSecBeaconSentCnt += pStaTxCnt0->field.TxBeaconCount;\n\tpAd->RalinkCounters.OneSecTxRetryOkCount += pStaTxCnt1->field.TxRetransmit;\n\tpAd->RalinkCounters.OneSecTxNoRetryOkCount += pStaTxCnt1->field.TxSuccess;\n\tpAd->RalinkCounters.OneSecTxFailCount += pStaTxCnt0->field.TxFailCount;\n\n#ifdef STATS_COUNT_SUPPORT\n\tpAd->WlanCounters.TransmittedFragmentCount.u.LowPart += pStaTxCnt1->field.TxSuccess;\n\tpAd->WlanCounters.RetryCount.u.LowPart += pStaTxCnt1->field.TxRetransmit;\n\tpAd->WlanCounters.FailedCount.u.LowPart += pStaTxCnt0->field.TxFailCount;\n#endif /* STATS_COUNT_SUPPORT */\n\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tClean all Tx/Rx statistic raw counters from hardware registers\n\n\tArguments:\n\t\tpAd\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\t========================================================================\n*/\nVOID NicResetRawCounters(RTMP_ADAPTER *pAd)\n{\n\tUINT32 Counter;\n\t\n\tRTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);\n\tRTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);\n\tRTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);\n\tRTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);\n\tRTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);\n\tRTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRead statistical counters from hardware registers and record them\n\t\tin software variables for later on query\n\n\tArguments:\n\t\tpAd\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t========================================================================\n*/\nVOID NICUpdateRawCounters(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32\tOldValue;/*, Value2;*/\n\t/*ULONG\tPageSum, OneSecTransmitCount;*/\n\t/*ULONG\tTxErrorRatio, Retry, Fail;*/\n\tRX_STA_CNT0_STRUC\t RxStaCnt0;\n\tRX_STA_CNT1_STRUC   RxStaCnt1;\n\tRX_STA_CNT2_STRUC   RxStaCnt2;\n\tTX_STA_CNT0_STRUC \t TxStaCnt0;\n\tTX_STA_CNT1_STRUC\t StaTx1;\n\tTX_STA_CNT2_STRUC\t StaTx2;\n#ifdef STATS_COUNT_SUPPORT\n\tTX_NAG_AGG_CNT_STRUC\tTxAggCnt;\n\tTX_AGG_CNT0_STRUC\tTxAggCnt0;\n\tTX_AGG_CNT1_STRUC\tTxAggCnt1;\n\tTX_AGG_CNT2_STRUC\tTxAggCnt2;\n\tTX_AGG_CNT3_STRUC\tTxAggCnt3;\n\tTX_AGG_CNT4_STRUC\tTxAggCnt4;\n\tTX_AGG_CNT5_STRUC\tTxAggCnt5;\n\tTX_AGG_CNT6_STRUC\tTxAggCnt6;\n\tTX_AGG_CNT7_STRUC\tTxAggCnt7;\n#endif /* STATS_COUNT_SUPPORT */\n\tCOUNTER_RALINK\t\t*pRalinkCounters;\n\n\n\tpRalinkCounters = &pAd->RalinkCounters;\n#ifdef RTMP_MAC_USB\n#ifdef STATS_COUNT_SUPPORT\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\treturn;\n\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_PS_MCU_SLEEP))\n\t\treturn;\n#endif /* STATS_COUNT_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n\n\tRTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);\n\tRTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef CARRIER_DETECTION_SUPPORT\n\tif ((pAd->CommonCfg.CarrierDetect.Enable == FALSE) || (pAd->OpMode == OPMODE_STA))\n#endif /* CARRIER_DETECTION_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t{\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t    /* Update RX PLCP error counter*/\n\t    pAd->PrivateInfo.PhyRxErrCnt += NICSumPLCPErrCnt(pAd); /* get PLCP error count per sec */\n\t\t/* Update False CCA counter*/\n\t\tpAd->RalinkCounters.OneSecFalseCCACnt += NICSumFalseCCACnt(pAd); /* get FalseCCA count per sec */\n\t\tpAd->RalinkCounters.FalseCCACnt += pAd->RalinkCounters.OneSecFalseCCACnt;\n#else\n\t\tRTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);\n\t    /* Update RX PLCP error counter*/\n\t    pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;\n\t\t/* Update False CCA counter*/\n\t\tpAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;\n\t\tpAd->RalinkCounters.FalseCCACnt += RxStaCnt1.field.FalseCca;\n\t\t\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\t}\n\n#ifdef STATS_COUNT_SUPPORT\n\t/* Update FCS counters*/\n\tOldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;\n\tpAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); /* >> 7);*/\n\tif (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)\n\t\tpAd->WlanCounters.FCSErrorCount.u.HighPart++;\n#endif /* STATS_COUNT_SUPPORT */\n\n\t/* Add FCS error count to private counters*/\n\tpRalinkCounters->OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;\n\tOldValue = pRalinkCounters->RealFcsErrCount.u.LowPart;\n\tpRalinkCounters->RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;\n\tif (pRalinkCounters->RealFcsErrCount.u.LowPart < OldValue)\n\t\tpRalinkCounters->RealFcsErrCount.u.HighPart++;\n\n\t/* Update Duplicate Rcv check*/\n\tpRalinkCounters->DuplicateRcv += RxStaCnt2.field.RxDupliCount;\n#ifdef STATS_COUNT_SUPPORT\n\tpAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;\n#endif /* STATS_COUNT_SUPPORT */\n\t/* Update RX Overflow counter*/\n\tpAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);\n\t\n\t/*pAd->RalinkCounters.RxCount = 0;*/\n#ifdef RTMP_MAC_USB\n\tif (pRalinkCounters->RxCount != pAd->watchDogRxCnt)\n\t{\n\t\tpAd->watchDogRxCnt = pRalinkCounters->RxCount;\n\t\tpAd->watchDogRxOverFlowCnt = 0;\n\t}\n\telse\n\t{\n\t\tif (RxStaCnt2.field.RxFifoOverflowCount)\n\t\t\tpAd->watchDogRxOverFlowCnt++;\n\t\telse\n\t\t\tpAd->watchDogRxOverFlowCnt = 0;\n\t}\n#endif /* RTMP_MAC_USB */\n\n\t\n\t/*if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) || */\n\t/*\t(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1)))*/\n\tif (!pAd->bUpdateBcnCntDone)\n\t{\n\t\t/* Update BEACON sent count*/\n\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\t\tRTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);\n\t}\n\n\n\t/*if (pAd->bStaFifoTest == TRUE)*/\n#ifdef STATS_COUNT_SUPPORT\n\t{\n\t\tRTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);\n\tRTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);\n\t\tRTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);\n\t\tRTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);\n\t\tRTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);\n\t\tRTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);\n\t\tpRalinkCounters->TxAggCount += TxAggCnt.field.AggTxCount;\n\t\tpRalinkCounters->TxNonAggCount += TxAggCnt.field.NonAggTxCount;\n\t\tpRalinkCounters->TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;\n\t\tpRalinkCounters->TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;\n\t\t\n\t\tpRalinkCounters->TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;\n\t\tpRalinkCounters->TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;\n\t\tpRalinkCounters->TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;\n\t\tpRalinkCounters->TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;\n\t\n\t\tpRalinkCounters->TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;\n\t\tpRalinkCounters->TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;\n\t\tpRalinkCounters->TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;\n\t\tpRalinkCounters->TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;\n\n\t\tpRalinkCounters->TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;\n\t\tpRalinkCounters->TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;\n\t\tpRalinkCounters->TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;\n\t\tpRalinkCounters->TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;\n\n\t\tpRalinkCounters->TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;\n\t\tpRalinkCounters->TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;\n\n\t\t/* Calculate the transmitted A-MPDU count*/\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count >> 1);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count >> 2);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count >> 3);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);\n\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);\n\t\tpRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count >> 4);\t\n\t}\n#endif /* STATS_COUNT_SUPPORT */\t\t\t\n\n#ifdef DBG_DIAGNOSE\n\t{\n\t\tRtmpDiagStruct\t*pDiag;\n\t\tUCHAR\t\t\tArrayCurIdx, i;\n\t\t\n\t\tpDiag = &pAd->DiagStruct;\n\t\tArrayCurIdx = pDiag->ArrayCurIdx;\n\t\t\n\t\tif (pDiag->inited == 0)\n\t\t{\n\t\t\tNdisZeroMemory(pDiag, sizeof(struct _RtmpDiagStrcut_));\n\t\t\tpDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0;\n\t\t\tpDiag->inited = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Tx*/\n\t\t\tpDiag->TxFailCnt[ArrayCurIdx] = TxStaCnt0.field.TxFailCount;\n\t\t\tpDiag->TxAggCnt[ArrayCurIdx] = TxAggCnt.field.AggTxCount;\n\t\t\tpDiag->TxNonAggCnt[ArrayCurIdx] = TxAggCnt.field.NonAggTxCount;\n\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][0] = TxAggCnt0.field.AggSize1Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][1] = TxAggCnt0.field.AggSize2Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][2] = TxAggCnt1.field.AggSize3Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][3] = TxAggCnt1.field.AggSize4Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][4] = TxAggCnt2.field.AggSize5Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][5] = TxAggCnt2.field.AggSize6Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][6] = TxAggCnt3.field.AggSize7Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][7] = TxAggCnt3.field.AggSize8Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][8] = TxAggCnt4.field.AggSize9Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][9] = TxAggCnt4.field.AggSize10Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][10] = TxAggCnt5.field.AggSize11Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][11] = TxAggCnt5.field.AggSize12Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][12] = TxAggCnt6.field.AggSize13Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][13] = TxAggCnt6.field.AggSize14Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][14] = TxAggCnt7.field.AggSize15Count;\n\t\t\tpDiag->TxAMPDUCnt[ArrayCurIdx][15] = TxAggCnt7.field.AggSize16Count;\n\n\t\t\tpDiag->RxCrcErrCnt[ArrayCurIdx] = RxStaCnt0.field.CrcErr;\n\t\t\t\n\t\t\tINC_RING_INDEX(pDiag->ArrayCurIdx,  DIAGNOSE_TIME);\n\t\t\tArrayCurIdx = pDiag->ArrayCurIdx;\n\t\t\tfor (i =0; i < 9; i++)\n\t\t\t{\n\t\t\t\tpDiag->TxDescCnt[ArrayCurIdx][i]= 0;\n\t\t\t\tpDiag->TxSWQueCnt[ArrayCurIdx][i] =0;\n\t\t\t\tpDiag->TxMcsCnt[ArrayCurIdx][i] = 0;\n\t\t\t\tpDiag->RxMcsCnt[ArrayCurIdx][i] = 0;\n\t\t\t}\n\t\t\tpDiag->TxDataCnt[ArrayCurIdx] = 0;\n\t\t\tpDiag->TxFailCnt[ArrayCurIdx] = 0;\n\t\t\tpDiag->RxDataCnt[ArrayCurIdx] = 0;\n\t\t\tpDiag->RxCrcErrCnt[ArrayCurIdx]  = 0;\n/*\t\t\tfor (i = 9; i < 16; i++)*/\n\t\t\tfor (i = 9; i < 24; i++) /* 3*3*/\n\t\t\t{\n\t\t\t\tpDiag->TxDescCnt[ArrayCurIdx][i] = 0;\n\t\t\t\tpDiag->TxMcsCnt[ArrayCurIdx][i] = 0;\n\t\t\t\tpDiag->RxMcsCnt[ArrayCurIdx][i] = 0;\n}\n\n\t\t\tif (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx)\n\t\t\t\tINC_RING_INDEX(pDiag->ArrayStartIdx,  DIAGNOSE_TIME);\n\t\t}\n\t\t\n\t}\n#endif /* DBG_DIAGNOSE */\n\n\n}\n\nNDIS_STATUS NICLoadFirmware(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNDIS_STATUS\t status = NDIS_STATUS_SUCCESS;\n\n\tif (pAd->chipOps.loadFirmware)\n\t\tstatus = pAd->chipOps.loadFirmware(pAd);\n\treturn status;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\terase 8051 firmware image in MAC ASIC\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tIRQL = PASSIVE_LEVEL\n\t\t\n\t========================================================================\n*/\nVOID NICEraseFirmware(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif (pAd->chipOps.eraseFirmware)\n\t\tpAd->chipOps.eraseFirmware(pAd);\n\t\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCompare two memory block\n\n\tArguments:\n\t\tpSrc1\t\tPointer to first memory address\n\t\tpSrc2\t\tPointer to second memory address\n\t\t\n\tReturn Value:\n\t\t0:\t\t\tmemory is equal\n\t\t1:\t\t\tpSrc1 memory is larger\n\t\t2:\t\t\tpSrc2 memory is larger\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nULONG\tRTMPCompareMemory(\n\tIN\tPVOID\tpSrc1,\n\tIN\tPVOID\tpSrc2,\n\tIN\tULONG\tLength)\n{\n\tPUCHAR\tpMem1;\n\tPUCHAR\tpMem2;\n\tULONG\tIndex = 0;\n\n\tpMem1 = (PUCHAR) pSrc1;\n\tpMem2 = (PUCHAR) pSrc2;\n\n\tfor (Index = 0; Index < Length; Index++)\n\t{\n\t\tif (pMem1[Index] > pMem2[Index])\n\t\t\treturn (1);\n\t\telse if (pMem1[Index] < pMem2[Index])\n\t\t\treturn (2);\n\t}\n\n\t/* Equal*/\n\treturn (0);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tZero out memory block\n\n\tArguments:\n\t\tpSrc1\t\tPointer to memory address\n\t\tLength\t\tSize\n\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPZeroMemory(\n\tIN\tPVOID\tpSrc,\n\tIN\tULONG\tLength)\n{\n\tPUCHAR\tpMem;\n\tULONG\tIndex = 0;\n\n\tpMem = (PUCHAR) pSrc;\n\n\tfor (Index = 0; Index < Length; Index++)\n\t{\n\t\tpMem[Index] = 0x00;\n\t}\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCopy data from memory block 1 to memory block 2\n\n\tArguments:\n\t\tpDest\t\tPointer to destination memory address\n\t\tpSrc\t\tPointer to source memory address\n\t\tLength\t\tCopy size\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPMoveMemory(\n\tOUT\tPVOID\tpDest,\n\tIN\tPVOID\tpSrc,\n\tIN\tULONG\tLength)\n{\n\tPUCHAR\tpMem1;\n\tPUCHAR\tpMem2;\n\tUINT\tIndex;\n\n\tASSERT((Length==0) || (pDest && pSrc));\n\n\tpMem1 = (PUCHAR) pDest;\n\tpMem2 = (PUCHAR) pSrc;\n\n\tfor (Index = 0; Index < Length; Index++)\n\t{\n\t\tpMem1[Index] = pMem2[Index];\n\t}\n}\n\nVOID UserCfgExit(\n\tIN RTMP_ADAPTER *pAd)\n{\n#ifdef DOT11_N_SUPPORT\n\tBATableExit(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\n\tNdisFreeSpinLock(&pAd->MacTabLock);\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tInitialize port configuration structure\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID UserCfgInit(RTMP_ADAPTER *pAd)\n{\n\tUINT i;\n#ifdef CONFIG_AP_SUPPORT\n\tUINT j;\n#endif /* CONFIG_AP_SUPPORT */\n/*\tEDCA_PARM DefaultEdcaParm;*/\n    UINT key_index, bss_index;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> UserCfgInit\\n\"));    \n\t \n\tpAd->IndicateMediaState = NdisMediaStateDisconnected; \n\t\n\t/*  part I. intialize common configuration*/\n\tpAd->CommonCfg.BasicRateBitmap = 0xF;\n\tpAd->CommonCfg.BasicRateBitmapOld = 0xF;\n#ifdef CONFIG_MULTI_CHANNEL\n\tpAd->Multi_Channel_Enable = FALSE;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef RTMP_MAC_USB\n\tpAd->BulkOutReq = 0;\n\t\n\tpAd->BulkOutComplete = 0;\n\tpAd->BulkOutCompleteOther = 0;\n\tpAd->BulkOutCompleteCancel = 0;\n\tpAd->BulkInReq = 0;\n\tpAd->BulkInComplete = 0;\n\tpAd->BulkInCompleteFail = 0;\n\n\t/*pAd->QuickTimerP = 100;*/\n\t/*pAd->TurnAggrBulkInCount = 0;*/\n\tpAd->bUsbTxBulkAggre = 0;\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* init as unsed value to ensure driver will set to MCU once.*/\n\tpAd->LedCntl.LedIndicatorStrength = 0xFF;\n#endif /* LED_CONTROL_SUPPORT */\n\n\tpAd->CommonCfg.MaxPktOneTxBulk = 2;\n\tpAd->CommonCfg.TxBulkFactor = 1;\n\tpAd->CommonCfg.RxBulkFactor =1;\n\n\tpAd->CommonCfg.TxPower = 100; /*mW*/\n\n\tNdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));\n#ifdef CONFIG_STA_SUPPORT\n\tpAd->CountDowntoPsm = 0;\n\tpAd->StaCfg.Connectinfoflag = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n\n#endif /* RTMP_MAC_USB */\n\n\tfor(key_index=0; key_index<SHARE_KEY_NUM; key_index++)\n\t{\n\t\tfor(bss_index = 0; bss_index < MAX_MBSSID_NUM(pAd) + MAX_P2P_NUM; bss_index++)\n\t\t{\n\t\t\tpAd->SharedKey[bss_index][key_index].KeyLen = 0;\n\t\t\tpAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;\n\t\t}\n\t}\n\n\tpAd->bLocalAdminMAC = FALSE;\n\tpAd->EepromAccess = FALSE;\n\t\n\tpAd->Antenna.word = 0; \n\tpAd->CommonCfg.BBPCurrentBW = BW_20;\n\n\n\tpAd->bAutoTxAgcA = FALSE;\t\t\t/* Default is OFF*/\n\tpAd->bAutoTxAgcG = FALSE;\t\t\t/* Default is OFF*/\n\t\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)\n\tpAd->TxPowerCtrl.bInternalTxALC = FALSE; /* Off by default */\n\tpAd->TxPowerCtrl.idxTxPowerTable = 0;\n\tpAd->TxPowerCtrl.idxTxPowerTable2 = 0;\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n\tpAd->TxPowerCtrl.LookupTableIndex = 0;\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\n\tpAd->RfIcType = RFIC_2820;\n\n\t/* Init timer for reset complete event*/\n\tpAd->CommonCfg.CentralChannel = 1;\n\tpAd->bForcePrintTX = FALSE;\n\tpAd->bForcePrintRX = FALSE;\n\tpAd->bStaFifoTest = FALSE;\n\tpAd->bProtectionTest = FALSE;\n\tpAd->bHCCATest = FALSE;\n\tpAd->bGenOneHCCA = FALSE;\n\tpAd->CommonCfg.Dsifs = 10;      /* in units of usec */\n\tpAd->CommonCfg.TxPower = 100; /* mW*/\n\tpAd->CommonCfg.TxPowerPercentage = 0xffffffff; /* AUTO*/\n\tpAd->CommonCfg.TxPowerDefault = 0xffffffff; /* AUTO*/\n\tpAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; /* use Long preamble on TX by defaut*/\n\tpAd->CommonCfg.bUseZeroToDisableFragment = FALSE;\n\tpAd->CommonCfg.RtsThreshold = 2347;\n\tpAd->CommonCfg.FragmentThreshold = 2346;\n\tpAd->CommonCfg.UseBGProtection = 0;    /* 0: AUTO*/\n\tpAd->CommonCfg.bEnableTxBurst = TRUE; /* 0;    \t*/\n\tpAd->CommonCfg.PhyMode = 0xff;     /* unknown*/\n\tpAd->CommonCfg.SavedPhyMode = pAd->CommonCfg.PhyMode;\n\t\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef AP_SCAN_SUPPORT\n\tpAd->ApCfg.ACSCheckTime = 0;\n#endif /* AP_SCAN_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\tpAd->CommonCfg.CarrierDetect.delta = CARRIER_DETECT_DELTA;\n\tpAd->CommonCfg.CarrierDetect.div_flag = CARRIER_DETECT_DIV_FLAG;\n\tpAd->CommonCfg.CarrierDetect.criteria = CARRIER_DETECT_CRITIRIA;\n\tpAd->CommonCfg.CarrierDetect.threshold = CARRIER_DETECT_THRESHOLD;\n\tpAd->CommonCfg.CarrierDetect.recheck1 = CARRIER_DETECT_RECHECK_TIME;\n\tpAd->CommonCfg.CarrierDetect.CarrierGoneThreshold = CARRIER_GONE_TRESHOLD;\n\tpAd->CommonCfg.CarrierDetect.VGA_Mask = CARRIER_DETECT_DEFAULT_MASK;\n\tpAd->CommonCfg.CarrierDetect.Packet_End_Mask = CARRIER_DETECT_DEFAULT_MASK;\n\tpAd->CommonCfg.CarrierDetect.Rx_PE_Mask = CARRIER_DETECT_DEFAULT_MASK;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DFS_SUPPORT\n\tpAd->CommonCfg.RadarDetect.bDfsInit = FALSE;\n#endif /* DFS_SUPPORT */\n\n\tpAd->Dot11_H.ChMovingTime = 65;\n\n#ifdef UAPSD_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\n{\n\tUINT32 IdMbss;\n\n\tfor(IdMbss=0; IdMbss<HW_BEACON_MAX_NUM; IdMbss++)\n\t\tUAPSD_INFO_INIT(&pAd->ApCfg.MBSSID[IdMbss].UapsdInfo);\n}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tpAd->StaCfg.UapsdInfo.bAPSDCapable = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\tpAd->CommonCfg.bNeedSendTriggerFrame = FALSE;\n\tpAd->CommonCfg.TriggerTimerCount = 0;\n\tpAd->CommonCfg.bAPSDForcePowerSave = FALSE;\n\t/*pAd->CommonCfg.bCountryFlag = FALSE;*/\n\tpAd->CommonCfg.TxStream = 0;\n\tpAd->CommonCfg.RxStream = 0;\n\n\tNdisZeroMemory(&pAd->BeaconTxWI, TXWISize);\n\n#ifdef DOT11_N_SUPPORT\n\tNdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));\n\tpAd->HTCEnable = FALSE;\n\tpAd->bBroadComHT = FALSE;\n\tpAd->CommonCfg.bRdg = FALSE;\n\t\n#ifdef DOT11N_DRAFT3\n\tpAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell;\t/* Unit : TU. 5~1000*/\n\tpAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell;\t/* Unit : TU. 10~1000*/\n\tpAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval;\t/* Unit : Second\t*/\n\tpAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel;\t/* Unit : TU. 200~10000*/\n\tpAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel;\t/* Unit : TU. 20~10000*/\n\tpAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;\n\tpAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold;\t/* Unit : percentage*/\n\tpAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);\n\n\tpAd->CommonCfg.bBssCoexEnable = TRUE; /* by default, we enable this feature, you can disable it via the profile or ioctl command*/\n\tpAd->CommonCfg.BssCoexApCntThr = 0;\n\tpAd->CommonCfg.Bss2040NeedFallBack = 0;\n#endif  /* DOT11N_DRAFT3 */\n\n\tNdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));\n\tpAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;\n\tpAd->CommonCfg.BACapability.field.MpduDensity = 0;\n\tpAd->CommonCfg.BACapability.field.Policy = IMMED_BA;\n\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; /*32;*/\n\tpAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; /*32;*/\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--> UserCfgInit. BACapability = 0x%x\\n\", pAd->CommonCfg.BACapability.word));    \n\n\tpAd->CommonCfg.BACapability.field.AutoBA = FALSE;\t\n\tBATableInit(pAd, &pAd->BATable);\n\n\tpAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;\n\tpAd->CommonCfg.bHTProtect = 1;\n\tpAd->CommonCfg.bMIMOPSEnable = TRUE;\n#ifdef GREENAP_SUPPORT\n\tpAd->ApCfg.bGreenAPEnable=FALSE;\n\tpAd->ApCfg.bGreenAPActive = FALSE;\n\tpAd->ApCfg.GreenAPLevel= GREENAP_WITHOUT_ANY_STAS_CONNECT;\n#endif /* GREENAP_SUPPORT */\n\tpAd->CommonCfg.bBADecline = FALSE;\n\tpAd->CommonCfg.bDisableReordering = FALSE;\n\n\tif (pAd->MACVersion == 0x28720200)\n\t\tpAd->CommonCfg.TxBASize = 13; /*by Jerry recommend*/\n\telse\n\t\tpAd->CommonCfg.TxBASize = 7;\n\n\tpAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;\n#endif /* DOT11_N_SUPPORT */\n\n\t/*pAd->CommonCfg.HTPhyMode.field.BW = BW_20;*/\n\t/*pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;*/\n\t/*pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;*/\n\t/*pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;*/\n\tpAd->CommonCfg.TxRate = RATE_6;\n\t\n\tpAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;\n\tpAd->CommonCfg.MlmeTransmit.field.BW = BW_20;\n\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\n\tpAd->CommonCfg.BeaconPeriod = 100;     /* in mSec*/\n\n#ifdef STREAM_MODE_SUPPORT\n\tif (pAd->chipCap.FlgHwStreamMode)\n\t{\n\t\tpAd->CommonCfg.StreamMode = 3;\n\t\tpAd->CommonCfg.StreamModeMCS = 0x0B0B;\n\t}\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\tpAd->CommonCfg.ETxBfNoncompress = 0;\n\tpAd->CommonCfg.ETxBfIncapable = 0;\n#endif /* TXBF_SUPPORT */\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tpAd->CommonCfg.lowTrafficThrd = 2;\n\tpAd->CommonCfg.TrainUpRule = 2; // 1;\n\tpAd->CommonCfg.TrainUpRuleRSSI = -70; // 0;\n\tpAd->CommonCfg.TrainUpLowThrd = 90;\n\tpAd->CommonCfg.TrainUpHighThrd = 110;\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n\n\n#ifdef CFO_TRACK\n#endif /* CFO_TRACK */\n\n#ifdef DBG_CTRL_SUPPORT\n\tpAd->CommonCfg.DebugFlags = 0;\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\tpAd->CommonCfg.wapi_usk_rekey_method = REKEY_METHOD_DISABLE;\n\tpAd->CommonCfg.wapi_msk_rekey_method = REKEY_METHOD_DISABLE;\n\tpAd->CommonCfg.wapi_msk_rekey_cnt = 0;\n#endif /* WAPI_SUPPORT */\n\n#ifdef MCAST_RATE_SPECIFIC\n\tpAd->CommonCfg.MCastPhyMode.word\n\t= pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word;\n#endif /* MCAST_RATE_SPECIFIC */\n\n\t/* WFA policy - disallow TH rate in WEP or TKIP cipher */\n\tpAd->CommonCfg.HT_DisallowTKIP = TRUE;\n\n\t/* Frequency for rate adaptation */\n\tpAd->ra_interval = DEF_RA_TIME_INTRVAL;\n\tpAd->ra_fast_interval = DEF_QUICK_RA_TIME_INTERVAL;\n\n#ifdef AGS_SUPPORT\n\tif (pAd->rateAlg == RATE_ALG_AGS)\n\t\tpAd->ra_fast_interval = AGS_QUICK_RA_TIME_INTERVAL;\n#endif /* AGS_SUPPORT */\n\n\t/* Tx Sw queue length setting */\n\tpAd->TxSwQMaxLen = MAX_PACKETS_IN_QUEUE;\n\t\n\tpAd->CommonCfg.bRalinkBurstMode = FALSE;\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* part II. intialize STA specific configuration*/\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tRX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);\n\t\tRX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);\n\t\tRX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);\n\t\tRX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);\n\n\t\tpAd->StaCfg.Psm = PWR_ACTIVE;\n\n\t\tpAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;\n\t\tpAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;\n\t\tpAd->StaCfg.bMixCipher = FALSE;\t\n\t\tpAd->StaCfg.DefaultKeyId = 0;\n\n\t\t/* 802.1x port control*/\n\t\tpAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\tpAd->StaCfg.LastMicErrorTime = 0;\n\t\tpAd->StaCfg.MicErrCnt        = 0;\n\t\tpAd->StaCfg.bBlockAssoc      = FALSE;\n\t\tpAd->StaCfg.WpaState         = SS_NOTUSE;\n\n\t\tpAd->CommonCfg.NdisRadioStateOff = FALSE;\t\t/* New to support microsoft disable radio with OID command*/\n\n\t\tpAd->StaCfg.RssiTrigger = 0;\n\t\tNdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));\n\t\tpAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;\n\t\tpAd->StaCfg.AtimWin = 0;\n\t\tpAd->StaCfg.DefaultListenCount = 3;/*default listen count;*/\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tpAd->StaCfg.DefaultListenCount = 1;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\tpAd->StaCfg.BssType = BSS_INFRA;  /* BSS_INFRA or BSS_ADHOC or BSS_MONITOR*/\n\t\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);\n\n\t\tpAd->StaCfg.bAutoTxRateSwitch = TRUE;\n\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\t\tpAd->StaCfg.bAutoConnectIfNoSSID = FALSE;\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\t\tpAd->StaCfg.AdaptiveFreq = TRUE; /* Todo: iwpriv and profile support. */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\t}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tpAd->StaCfg.IEEE80211dClientMode = Rt802_11_D_None;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* global variables mXXXX used in MAC protocol state machines*/\n\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);\n\n\t/* PHY specification*/\n\tpAd->CommonCfg.PhyMode = (WMODE_B | WMODE_G);\t\t/* default PHY mode*/\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);  /* CCK use LONG preamble*/\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* user desired power mode*/\n\t\tpAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;\n\t\tpAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;\n\t\tpAd->StaCfg.bWindowsACCAMEnable = FALSE;\n\n\t\tpAd->StaCfg.bHwRadio  = TRUE; /* Default Hardware Radio status is On*/\n\t\tpAd->StaCfg.bSwRadio  = TRUE; /* Default Software Radio status is On*/\n\t\tpAd->StaCfg.bRadio    = TRUE; /* bHwRadio && bSwRadio*/\n\t\tpAd->StaCfg.bHardwareRadio = FALSE;\t\t/* Default is OFF*/\n\t\tpAd->StaCfg.bShowHiddenSSID = FALSE;\t\t/* Default no show*/\n\n\t\t/* Nitro mode control*/\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n#else\n\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\t\tpAd->StaCfg.LastScanTime = 0;\n\t\t\n\t\tNdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);\n#ifdef PROFILE_STORE\n\t\tpAd->bWriteDat = FALSE;\n#endif /* PROFILE_STORE */\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tpAd->StaCfg.IEEE8021X = FALSE;\n\t\tpAd->StaCfg.IEEE8021x_required_keys = FALSE;\n\t\tpAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;\n\t\tpAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\tpAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;\n#ifdef PROFILE_STORE\n\t\tpAd->bWriteDat = TRUE;\n#endif /* PROFILE_STORE */\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\t\tpAd->StaCfg.bLostAp = FALSE;\n\t\tpAd->StaCfg.pWpsProbeReqIe = NULL;\n\t\tpAd->StaCfg.WpsProbeReqIeLen = 0;\n\t\tpAd->StaCfg.pWpaAssocIe = NULL;\n\t\tpAd->StaCfg.WpaAssocIeLen = 0;\n\t\tpAd->StaCfg.WpaSupplicantScanCount = 0;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t\t{\n\t\t\tINT\t\t\t\t\tidx;\n\t\t\tPWSC_CTRL \t\t\tpWscControl;\n#ifdef WSC_V2_SUPPORT\n\t\t\tPWSC_V2_INFO\tpWscV2Info;\n#endif /* WSC_V2_SUPPORT */\n\n\t\t\t/*\n\t\t\t\tWscControl cannot be zero here, because WscControl timers are initial in MLME Initialize \n\t\t\t\tand MLME Initialize is called before UserCfgInit.\n\n\t\t\t*/\n\t\t\tpWscControl = &pAd->StaCfg.WscControl;\n\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\t\t\tpWscControl->WscMode = WSC_PIN_MODE;\n\t\t\tpWscControl->WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n#ifdef WSC_V2_SUPPORT\n\t\t\tpWscControl->WscConfigMethods= 0x238C;\n#else\n\t\t\tpWscControl->WscConfigMethods= 0x008C;\n#endif /* WSC_V2_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\tpWscControl->WscConfigMethods |= 0x0100;\n#endif /* P2P_SUPPORT */\n\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\t\tpWscControl->WscStatus = STATUS_WSC_NOTUSED;\n\t\t\tpWscControl->WscPinCode = 0;\n\t\t\tpWscControl->WscLastPinFromEnrollee = 0;\n\t\t\tpWscControl->WscEnrollee4digitPinCode = FALSE;\n\t\t\tpWscControl->WscEnrolleePinCode = 0;\n\t\t\tpWscControl->WscSelReg = 0;\n\t\t\tNdisZeroMemory(&pAd->StaCfg.WscControl.RegData, sizeof(WSC_REG_DATA));\n\t\t\tNdisZeroMemory(&pWscControl->WscProfile, sizeof(WSC_PROFILE));\n\t\t\tpWscControl->WscUseUPnP = 0;\n\t\t\tpWscControl->WscEnAssociateIE = TRUE;\n\t\t\tpWscControl->WscEnProbeReqIE = TRUE;\n\t\t\tpWscControl->RegData.ReComputePke = 1;\n\t\t\tpWscControl->lastId = 1;\n\t\t\tpWscControl->EntryIfIdx = BSS0;\n\t\t\tpWscControl->pAd = pAd;\n\t\t\tpWscControl->WscDriverAutoConnect = 0x02;\n\t\t\tpAd->WriteWscCfgToDatFile = 0xFF;\n\t\t\tpWscControl->WscRejectSamePinFromEnrollee = FALSE;\n\t\t\tpWscControl->WpsApBand = PREFERRED_WPS_AP_PHY_TYPE_AUTO_SELECTION;\n\t\t\tpWscControl->bCheckMultiByte = FALSE;\n\t\t\tpWscControl->bWscAutoTigeer = FALSE;\n\t\t\t/* Enrollee Nonce, first generate and save to Wsc Control Block*/\n\t\t\tfor (idx = 0; idx < 16; idx++)\n\t\t\t{\n\t\t\t\tpWscControl->RegData.SelfNonce[idx] = RandomByte(pAd);\n\t\t\t}\n\t\t\tpWscControl->WscRxBufLen = 0;\n\t\t\tpWscControl->pWscRxBuf = NULL;\n\t\t\tos_alloc_mem(pAd, &pWscControl->pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tif (pWscControl->pWscRxBuf)\n\t\t\t\tNdisZeroMemory(pWscControl->pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tpWscControl->WscTxBufLen = 0;\n\t\t\tpWscControl->pWscTxBuf = NULL;\n\t\t\tos_alloc_mem(pAd, &pWscControl->pWscTxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tif (pWscControl->pWscTxBuf)\n\t\t\t\tNdisZeroMemory(pWscControl->pWscTxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\tpWscControl->bWscFragment = FALSE;\n\t\t\tpWscControl->WscFragSize = 128;\n\t\t\tinitList(&pWscControl->WscPeerList);\n\t\t\tNdisAllocateSpinLock(pAd, &pWscControl->WscPeerListSemLock);\n\n#ifdef WSC_V2_SUPPORT\n\t\t\tpWscV2Info = &pWscControl->WscV2Info;\n\t\t\tpWscV2Info->bWpsEnable = TRUE;\n\t\t\tpWscV2Info->ExtraTlv.TlvLen = 0;\n\t\t\tpWscV2Info->ExtraTlv.TlvTag = 0;\n\t\t\tpWscV2Info->ExtraTlv.pTlvData = NULL;\n\t\t\tpWscV2Info->ExtraTlv.TlvType = TLV_ASCII;\n\t\t\tpWscV2Info->bEnableWpsV2 = TRUE;\n\t\t\tpWscV2Info->bForceSetAP = FALSE;\n#endif /* WSC_V2_SUPPORT */\n\n\t\t}\n#ifdef IWSC_SUPPORT\n\t\tIWSC_Init(pAd);\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\t\tNdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);\n\n\n\t\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\t\tpAd->StaCfg.BeaconLostTime = BEACON_LOST_TIME;\n\t\tNdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);    \n\t\tpAd->StaCfg.WpaPassPhraseLen = 0;\n\t\tpAd->StaCfg.bAutoRoaming = FALSE;\n\t\tpAd->StaCfg.bForceTxBurst = FALSE;\n\t\tpAd->StaCfg.bNotFirstScan = FALSE;\n\t\tpAd->StaCfg.bImprovedScan = FALSE;\n#ifdef DOT11_N_SUPPORT\n\t\tpAd->StaCfg.bAdhocN = TRUE;\n#endif /* DOT11_N_SUPPORT */\n\t\tpAd->StaCfg.bFastConnect = FALSE;\n\t\tpAd->StaCfg.bAdhocCreator = FALSE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Default for extra information is not valid*/\n\tpAd->ExtraInfo = EXTRA_INFO_CLEAR;\n\t\n\t/* Default Config change flag*/\n\tpAd->bConfigChanged = FALSE;\n\n\t/* */\n\t/* part III. AP configurations*/\n\t\n#ifdef CONFIG_AP_SUPPORT\n#ifndef P2P_APCLI_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_APCLI_SUPPORT */\n\t{\n\t\t/* Set MBSS Default Configurations*/\n\t\tpAd->ApCfg.BssidNum = MAX_MBSSID_NUM(pAd);\n\t\tfor(j = BSS0; j < pAd->ApCfg.BssidNum; j++)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[j].AuthMode = Ndis802_11AuthModeOpen;\n\t\t\tpAd->ApCfg.MBSSID[j].WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\tpAd->ApCfg.MBSSID[j].GroupKeyWepStatus = Ndis802_11EncryptionDisabled;\n\t\t\tpAd->ApCfg.MBSSID[j].DefaultKeyId = 0;\n\t\t\tpAd->ApCfg.MBSSID[j].WpaMixPairCipher = MIX_CIPHER_NOTUSE;\n\t\t\tpAd->ApCfg.MBSSID[j].RekeyCountDown = 0;\t/* it's used for WPA rekey */\n\n#ifdef DOT1X_SUPPORT\n\t\t\tpAd->ApCfg.MBSSID[j].IEEE8021X = FALSE;\n\t\t\tpAd->ApCfg.MBSSID[j].PreAuth = FALSE;\n\n\t\t\t/* PMK cache setting*/\n\t\t\tpAd->ApCfg.MBSSID[j].PMKCachePeriod = (10 * 60 * OS_HZ); /* unit : tick(default: 10 minute)*/\n\t\t\tNdisZeroMemory(&pAd->ApCfg.MBSSID[j].PMKIDCache, sizeof(NDIS_AP_802_11_PMKID));\n\n\t\t\t/* dot1x related per BSS */\n\t\t\tpAd->ApCfg.MBSSID[j].radius_srv_num = 0;\n\t\t\tpAd->ApCfg.MBSSID[j].NasIdLen = 0;\n#endif /* DOT1X_SUPPORT */\n\n\t\t\t/* VLAN related */\n        \t\tpAd->ApCfg.MBSSID[j].VLAN_VID = 0;\n\n\t\t\t/* Default MCS as AUTO*/\n\t\t\tpAd->ApCfg.MBSSID[j].bAutoTxRateSwitch = TRUE;\n\t\t\tpAd->ApCfg.MBSSID[j].DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\n\t\t\t/* Default is zero. It means no limit.*/\n\t\t\tpAd->ApCfg.MBSSID[j].MaxStaNum = 0;\n\t\t\tpAd->ApCfg.MBSSID[j].StaCount = 0;\n\t\t\t\n#ifdef WSC_AP_SUPPORT\n\t\t\tpAd->ApCfg.MBSSID[j].WscSecurityMode = 0xff;\n\t\t\t{\n\t\t\t\tPWSC_CTRL pWscControl;\n\t\t\t\tINT idx;\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tPWSC_V2_INFO\tpWscV2Info;\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t/*\n\t\t\t\t\tWscControl cannot be zero here, because WscControl timers are initial in MLME Initialize \n\t\t\t\t\tand MLME Initialize is called before UserCfgInit.\n\n\t\t\t\t*/\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[j].WscControl;\n\t\t\t\tNdisZeroMemory(&pWscControl->RegData, sizeof(WSC_REG_DATA));\n\t\t\t\tNdisZeroMemory(&pAd->CommonCfg.WscStaPbcProbeInfo, sizeof(WSC_STA_PBC_PROBE_INFO));\n\t\t\t\tpWscControl->WscMode = 1;\n\t\t\t\tpWscControl->WscConfStatus = 1;\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tpWscControl->WscConfigMethods= 0x238C;\n#else\n\t\t\t\tpWscControl->WscConfigMethods= 0x0084;\n#endif /* WSC_V2_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\t\tpWscControl->WscConfigMethods |= 0x0108;\n#endif /* P2P_SUPPORT */\n\t\t\t\tpWscControl->RegData.ReComputePke = 1;\n\t\t\t\tpWscControl->lastId = 1;\n\t\t\t\t/* pWscControl->EntryIfIdx = (MIN_NET_DEVICE_FOR_MBSSID | j); */\n\t\t\t\tpWscControl->pAd = pAd;\n\t\t\t\tpWscControl->WscRejectSamePinFromEnrollee = FALSE;\n\t\t\t\tpAd->CommonCfg.WscPBCOverlap = FALSE;\n#ifdef P2P_SUPPORT\n\t\t\t\t/*\n\t\t\t\t\tSet defaule value of WscConfMode to be (WSC_REGISTRAR | WSC_ENROLLEE) for WiFi P2P.\n\t\t\t\t*/\n\t\t\t\tpWscControl->WscConfMode = (WSC_REGISTRAR | WSC_ENROLLEE);\n#else /* P2P_SUPPORT */\n\t\t\t\tpWscControl->WscConfMode = 0;\n#endif /* !P2P_SUPPORT */\n\t\t\t\tpWscControl->WscStatus = 0;\n\t\t\t\tpWscControl->WscState = 0;\n\t\t\t\tpWscControl->WscPinCode = 0;\n\t\t\t\tpWscControl->WscLastPinFromEnrollee = 0;\n\t\t\t\tpWscControl->WscEnrollee4digitPinCode = FALSE;\n\t\t\t\tpWscControl->WscEnrolleePinCode = 0;\n\t\t\t\tpWscControl->WscSelReg = 0;\n\t\t\t\tpWscControl->WscUseUPnP = 0;\n\t\t\t\tpWscControl->bWCNTest = FALSE;\n\t\t\t\tpWscControl->WscKeyASCII = 0; /* default, 0 (64 Hex) */\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t\tEnrollee 192 random bytes for DH key generation\n\t\t\t\t*/\n\t\t\t\tfor (idx = 0; idx < 192; idx++)\n\t\t\t\t\tpWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd);\n\n\t\t\t\t/* Enrollee Nonce, first generate and save to Wsc Control Block*/\n\t\t\t\tfor (idx = 0; idx < 16; idx++)\n\t\t\t\t{\n\t\t\t\t\tpWscControl->RegData.SelfNonce[idx] = RandomByte(pAd);\n\t\t\t\t}\n\t\t\t\tNdisZeroMemory(&pWscControl->WscDefaultSsid, sizeof(NDIS_802_11_SSID));\n\t\t\t\tNdisZeroMemory(&pWscControl->Wsc_Uuid_Str[0], UUID_LEN_STR);\n\t\t\t\tNdisZeroMemory(&pWscControl->Wsc_Uuid_E[0], UUID_LEN_HEX);\n\t\t\t\tpWscControl->bCheckMultiByte = FALSE;\n\t\t\t\tpWscControl->bWscAutoTigeer = FALSE;\n\t\t\t\tpWscControl->bWscFragment = FALSE;\n\t\t\t\tpWscControl->WscFragSize = 128;\n\t\t\t\tpWscControl->WscRxBufLen = 0;\n\t\t\t\tpWscControl->pWscRxBuf = NULL;\n\t\t\t\tos_alloc_mem(pAd, &pWscControl->pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\tif (pWscControl->pWscRxBuf)\n\t\t\t\t\tNdisZeroMemory(pWscControl->pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\tpWscControl->WscTxBufLen = 0;\n\t\t\t\tpWscControl->pWscTxBuf = NULL;\n\t\t\t\tos_alloc_mem(pAd, &pWscControl->pWscTxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\tif (pWscControl->pWscTxBuf)\n\t\t\t\t\tNdisZeroMemory(pWscControl->pWscTxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\tinitList(&pWscControl->WscPeerList);\n\t\t\t\tNdisAllocateSpinLock(pAd, &pWscControl->WscPeerListSemLock);\n\t\t\t\tpWscControl->PinAttackCount = 0;\n\t\t\t\tpWscControl->bSetupLock = FALSE;\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tpWscV2Info = &pWscControl->WscV2Info;\n\t\t\t\tpWscV2Info->bWpsEnable = TRUE;\n\t\t\t\tpWscV2Info->ExtraTlv.TlvLen = 0;\n\t\t\t\tpWscV2Info->ExtraTlv.TlvTag = 0;\n\t\t\t\tpWscV2Info->ExtraTlv.pTlvData = NULL;\n\t\t\t\tpWscV2Info->ExtraTlv.TlvType = TLV_ASCII;\n\t\t\t\tpWscV2Info->bEnableWpsV2 = TRUE;\n\t\t\t\tpWscControl->SetupLockTime = WSC_WPS_AP_SETUP_LOCK_TIME;\n\t\t\t\tpWscControl->MaxPinAttack = WSC_WPS_AP_MAX_PIN_ATTACK;\n#endif /* WSC_V2_SUPPORT */\n\n\t\t\t}\n#endif /* WSC_AP_SUPPORT */\n\n\n\t\t\tfor(i = 0; i < WLAN_MAX_NUM_OF_TIM; i++)\n\t        \t\tpAd->ApCfg.MBSSID[j].TimBitmaps[i] = 0;\n\t\t}\n\t\tpAd->ApCfg.DtimCount  = 0;\n\t\tpAd->ApCfg.DtimPeriod = DEFAULT_DTIM_PERIOD;\n\n\t\tpAd->ApCfg.ErpIeContent = 0;\n\n\t\tpAd->ApCfg.StaIdleTimeout = MAC_TABLE_AGEOUT_TIME;\n\n#ifdef IDS_SUPPORT\n\t\t/* Default disable IDS threshold and reset all IDS counters*/\n\t\tpAd->ApCfg.IdsEnable = FALSE;\n\t\tpAd->ApCfg.AuthFloodThreshold = 0;\n\t\tpAd->ApCfg.AssocReqFloodThreshold = 0;\n\t\tpAd->ApCfg.ReassocReqFloodThreshold = 0;\n\t\tpAd->ApCfg.ProbeReqFloodThreshold = 0;\n\t\tpAd->ApCfg.DisassocFloodThreshold = 0;\n\t\tpAd->ApCfg.DeauthFloodThreshold = 0;\n\t\tpAd->ApCfg.EapReqFloodThreshold = 0;\n\t\tRTMPClearAllIdsCounter(pAd);\n#endif /* IDS_SUPPORT */\n\n\n#ifdef WSC_INCLUDED\n\t\tpAd->WriteWscCfgToDatFile = 0xFF;\n\t\tpAd->WriteWscCfgToAr9DatFile = FALSE;\n#ifdef CONFIG_AP_SUPPORT\n\t\tpAd->bWscDriverAutoUpdateCfg = TRUE;\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n#ifdef APCLI_SUPPORT\n\t\tpAd->ApCfg.FlgApCliIsUapsdInfoUpdated = FALSE;\n\n\t\tfor(j = 0; j < MAX_APCLI_NUM; j++) \n\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[j].AuthMode = Ndis802_11AuthModeOpen;\n\t\t\tpAd->ApCfg.ApCliTab[j].WepStatus = Ndis802_11WEPDisabled;\n\t\t\tpAd->ApCfg.ApCliTab[j].bAutoTxRateSwitch = TRUE;\n\t\t\tpAd->ApCfg.ApCliTab[j].DesiredTransmitSetting.field.MCS = MCS_AUTO;\n\t\t\tpAd->ApCfg.ApCliTab[j].UapsdInfo.bAPSDCapable = FALSE;\n\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n\t\t\tpAd->ApCfg.ApCliTab[j].IEEE8021X=FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[j].IEEE8021x_required_keys=FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[j].bRSN_IE_FromWpaSupplicant=FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[j].bLostAp=FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[j].bScanReqIsFromWebUI=FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[j].bConfigChanged=FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[j].DesireSharedKeyId=0;\n\t\t\tpAd->ApCfg.ApCliTab[j].WpaSupplicantUP=WPA_SUPPLICANT_DISABLE;\n\t\t\tpAd->ApCfg.ApCliTab[j].WpaSupplicantScanCount=0;\n\t\t\tpAd->ApCfg.ApCliTab[j].pWpsProbeReqIe=NULL;\n\t\t\tpAd->ApCfg.ApCliTab[j].WpsProbeReqIeLen=0;\n\t\t\tpAd->ApCfg.ApCliTab[j].pWpaAssocIe=NULL;\n\t\t\tpAd->ApCfg.ApCliTab[j].WpaAssocIeLen=0;\n\t\t\tpAd->ApCfg.ApCliTab[j].SavedPMKNum=0;\n\t\t\tRTMPZeroMemory(pAd->ApCfg.ApCliTab[j].SavedPMK, (PMKID_NO * sizeof(BSSID_INFO)));\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t\tpAd->ApCfg.EntryClientCount = 0;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef IP_ASSEMBLY\n\tif (pAd->OpMode == OPMODE_STA)\n\t{\n\t\tpAd->StaCfg.bFragFlag = TRUE;\n\t}\n#endif /* IP_ASSEMBLY */\n\n\t/* part IV. others*/\n\t\n\t/* dynamic BBP R66:sensibity tuning to overcome background noise*/\n\tpAd->BbpTuning.bEnable                = TRUE;  \n\tpAd->BbpTuning.FalseCcaLowerThreshold = 100;\n\tpAd->BbpTuning.FalseCcaUpperThreshold = 512;\n\tpAd->BbpTuning.R66Delta               = 4;\n\tpAd->Mlme.bEnableAutoAntennaCheck = TRUE;\n\t\n\t\n\t/* Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.*/\n\t/* if not initial this value, the default value will be 0.*/\n\t\n\tpAd->BbpTuning.R66CurrentValue = 0x38;\n\n\tpAd->Bbp94 = BBPR94_DEFAULT;\n\tpAd->BbpForCCK = FALSE;\n\t\n\t/* Default is FALSE for test bit 1*/\n\t/*pAd->bTest1 = FALSE;*/\n\t\n\t/* initialize MAC table and allocate spin lock*/\n\tNdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));\n\tInitializeQueueHeader(&pAd->MacTab.McastPsQueue);\n\tNdisAllocateSpinLock(pAd, &pAd->MacTabLock);\n\n\t/*RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE);*/\n\t/*RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV);*/\n\n\n\tpAd->CommonCfg.bWiFiTest = FALSE;\n\n#ifdef CONFIG_AP_SUPPORT\n\tpAd->ApCfg.EntryLifeCheck = MAC_ENTRY_LIFE_CHECK_CNT;\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PCIE_PS_SUPPORT\n\tRTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tpAd->StaCfg.TdlsInfo.bTDLSCapable = FALSE;\n\t\tpAd->StaCfg.TdlsInfo.TdlsChSwitchSupp = TRUE;\n\t\tpAd->StaCfg.TdlsInfo.TdlsPsmSupp = FALSE;\n\t\tpAd->StaCfg.TdlsInfo.TdlsKeyLifeTime = TDLS_LEY_LIFETIME;\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\tinitList(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList);\n\t\tNdisAllocateSpinLock(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\tinitList(&pAd->StaCfg.TdlsInfo.TdlsBlackList);\n\t\tNdisAllocateSpinLock(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\n\t\tpAd->StaCfg.TdlsInfo.TdlsAutoSetupRssiThreshold = TDLS_AUTO_SETUP_RSSI_THRESHOLD;\n\t\tpAd->StaCfg.TdlsInfo.TdlsAutoTeardownRssiThreshold = TDLS_AUTO_TEARDOWN_RSSI_THRESHOLD;\n\t\tpAd->StaCfg.TdlsInfo.TdlsRssiMeasurementPeriod = TDLS_RSSI_MEASUREMENT_PERIOD;\n\t\tpAd->StaCfg.TdlsInfo.TdlsDisabledPeriodByTeardown = TDLS_DISABLE_PERIOD_BY_TEARDOWN;\n\t\tpAd->StaCfg.TdlsInfo.TdlsAutoDiscoveryPeriod = TDLS_AUTO_DISCOVERY_PERIOD;\n#endif /* TDLS_AUTOLINK_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpAd->RxAnt.Pair1PrimaryRxAnt = 0;\n\tpAd->RxAnt.Pair1SecondaryRxAnt = 1;\n\n\t\tpAd->RxAnt.EvaluatePeriod = 0;\n\t\tpAd->RxAnt.RcvPktNumWhenEvaluate = 0;\n#ifdef CONFIG_STA_SUPPORT\n\t\tpAd->RxAnt.Pair1AvgRssi[0] = pAd->RxAnt.Pair1AvgRssi[1] = 0;\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tpAd->RxAnt.Pair1AvgRssiGroup1[0] = pAd->RxAnt.Pair1AvgRssiGroup1[1] = 0;\n\t\tpAd->RxAnt.Pair1AvgRssiGroup2[0] = pAd->RxAnt.Pair1AvgRssiGroup2[1] = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef TXRX_SW_ANTDIV_SUPPORT\n\t\tpAd->chipCap.bTxRxSwAntDiv = FALSE;\n#endif /* TXRX_SW_ANTDIV_SUPPORT */\n\n\n#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT)\n\tfor (i = 0; i < MAX_LEN_OF_BSS_TABLE; i++) \n\t{\n\t\tPBSS_ENTRY\tpBssEntry = &pAd->ScanTab.BssEntry[i];\n\t\t\n\t\tif (pAd->ProbeRespIE[i].pIe)\n\t\t\tpBssEntry->pVarIeFromProbRsp = pAd->ProbeRespIE[i].pIe;\n\t\telse\n\t\t\tpBssEntry->pVarIeFromProbRsp = NULL;\n\t}\n#endif /* defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) */\n\n\n#ifdef WSC_INCLUDED\n\tNdisZeroMemory(&pAd->CommonCfg.WscStaPbcProbeInfo, sizeof(WSC_STA_PBC_PROBE_INFO));\n\tpAd->CommonCfg.WscPBCOverlap = FALSE;\n#endif /* WSC_INCLUDED */\n\n\n#ifdef P2P_SUPPORT\n\tP2pCfgInit(pAd);\n#endif /* P2P_SUPPORT */\n\n#ifdef WFD_SUPPORT\n\tWfdCfgInit(pAd);\n#endif /* WFD_SUPPORT */\n\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tpAd->WOW_Cfg.bEnable = FALSE;\t\n\tpAd->WOW_Cfg.bWOWFirmware = FALSE;\t/* load normal firmware */\n\tpAd->WOW_Cfg.bInBand = TRUE;\t\t/* use in-band signal */\n\tpAd->WOW_Cfg.nSelectedGPIO = 1;\n\tpAd->WOW_Cfg.nDelay = 3; /* (3+1)*3 = 12 sec */\n\tpAd->WOW_Cfg.nHoldTime = 1; /* 1*10 = 10 ms */\n\tDBGPRINT(RT_DEBUG_OFF, (\"WOW Enable %d, WOWFirmware %d\\n\", pAd->WOW_Cfg.bEnable, pAd->WOW_Cfg.bWOWFirmware));\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n\t/* 802.11H and DFS related params*/\n\tpAd->Dot11_H.CSCount = 0;\n\tpAd->Dot11_H.CSPeriod = 10;\n\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\tpAd->Dot11_H.bDFSIndoor = 1;\n\n\n#ifdef FPGA_MODE\n\tpAd->fpga_on = 0x0;\n\tpAd->tx_kick_cnt = 0;\n\tpAd->data_phy = 0;\n\tpAd->data_mcs = 0;\n\tpAd->data_bw = 0;\n\tpAd->data_gi = 0;\n#endif /* FPGA_MODE */\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tif (pAd->OpMode == OPMODE_AP)\n\t\tpAd->CommonCfg.MO_Cfg.bEnable = TRUE;\n\telse\n\t\tpAd->CommonCfg.MO_Cfg.bEnable = FALSE;\n\tpAd->CommonCfg.MO_Cfg.nFalseCCATh = MO_FALSE_CCA_TH;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<-- UserCfgInit\\n\"));\n}\n\n/* IRQL = PASSIVE_LEVEL*/\nUCHAR BtoH(STRING ch)\n{\n\tif (ch >= '0' && ch <= '9') return (ch - '0');        /* Handle numerals*/\n\tif (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA);  /* Handle capitol hex digits*/\n\tif (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA);  /* Handle small hex digits*/\n\treturn(255);\n}\n\n\n/*  FUNCTION: AtoH(char *, UCHAR *, int)*/\n\n/*  PURPOSE:  Converts ascii string to network order hex*/\n\n/*  PARAMETERS:*/\n/*    src    - pointer to input ascii string*/\n/*    dest   - pointer to output hex*/\n/*    destlen - size of dest*/\n\n/*  COMMENTS:*/\n\n/*    2 ascii bytes make a hex byte so must put 1st ascii byte of pair*/\n/*    into upper nibble and 2nd ascii byte of pair into lower nibble.*/\n\n/* IRQL = PASSIVE_LEVEL*/\n\nvoid AtoH(PSTRING src, PUCHAR dest, int destlen)\n{\n\tPSTRING srcptr;\n\tPUCHAR destTemp;\n\n\tsrcptr = src;\t\n\tdestTemp = (PUCHAR) dest; \n\n\twhile(destlen--)\n\t{\n\t\t*destTemp = BtoH(*srcptr++) << 4;    /* Put 1st ascii byte in upper nibble.*/\n\t\t*destTemp += BtoH(*srcptr++);      /* Add 2nd ascii byte to above.*/\n\t\tdestTemp++;\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAdd a timer to the timer list.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpRsc\t\t\t- the OS resource\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID\tRTMP_TimerListAdd(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd,\n\tIN\tVOID\t\t\t\t\t*pRsc)\n{\n\tLIST_HEADER *pRscList = &pAd->RscTimerCreateList;\n\tLIST_RESOURCE_OBJ_ENTRY *pObj;\n\n\n\t/* try to find old entry */\n\tpObj = (LIST_RESOURCE_OBJ_ENTRY *)(pRscList->pHead);\n\twhile(1)\n\t{\n\t\tif (pObj == NULL)\n\t\t\tbreak;\n\t\tif ((ULONG)(pObj->pRscObj) == (ULONG)pRsc)\n\t\t\treturn; /* exists */\n\t\tpObj = pObj->pNext;\n\t}\n\n\t/* allocate a timer record entry */\n\tos_alloc_mem(NULL, (UCHAR **)&(pObj), sizeof(LIST_RESOURCE_OBJ_ENTRY));\n\tif (pObj == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: alloc timer obj fail!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tpObj->pRscObj = pRsc;\n\t\tinsertTailList(pRscList, (LIST_ENTRY *)pObj);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: add timer obj %lx!\\n\", __FUNCTION__, (ULONG)pRsc));\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCancel all timers in the timer list.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID\tRTMP_TimerListRelease(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd)\n{\n\tLIST_HEADER *pRscList = &pAd->RscTimerCreateList;\n\tLIST_RESOURCE_OBJ_ENTRY *pObj, *pObjOld;\n\tBOOLEAN Cancel;\n\n\n\t/* try to find old entry */\n\tpObj = (LIST_RESOURCE_OBJ_ENTRY *)(pRscList->pHead);\n\twhile(1)\n\t{\n\t\tif (pObj == NULL)\n\t\t\tbreak;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Cancel timer obj %lx!\\n\", __FUNCTION__, (ULONG)(pObj->pRscObj)));\n\t\tRTMPReleaseTimer(pObj->pRscObj, &Cancel);\n\t\tpObjOld = pObj;\n\t\tpObj = pObj->pNext;\n\t\tos_free_mem(NULL, pObjOld);\n\t}\n\n\t/* reset TimerList */\n\tinitList(&pAd->RscTimerCreateList);\n}\n\n\nVOID RTMP_AllTimerListRelease(RTMP_ADAPTER *pAd)\n{\n   LIST_HEADER *pRscList = &pAd->RscTimerCreateList;\n   LIST_RESOURCE_OBJ_ENTRY *pObj, *pObjOld;\n   BOOLEAN Cancel;\n\n   /* try to find old entry */\n   pObj = (LIST_RESOURCE_OBJ_ENTRY *)(pRscList->pHead);\n   while(1)\n   {\n           if (pObj == NULL)\n                   break;\n           DBGPRINT(RT_DEBUG_TRACE, (\"%s: Cancel timer obj %lx!\\n\", __FUNCTION__, (ULONG)(pObj->pRscObj)));\n           pObjOld = pObj;\n           pObj = pObj->pNext;\n           RTMPReleaseTimer(pObjOld->pRscObj, &Cancel);\n           os_free_mem(NULL, pObjOld);\n   }\n\n   /* reset TimerList */\n   initList(&pAd->RscTimerCreateList);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tInit timer objects\n\n\tArguments:\n\t\tpAd\t\t\tPointer to our adapter\n\t\tpTimer\t\t\t\tTimer structure\n\t\tpTimerFunc\t\t\tFunction to execute when timer expired\n\t\tRepeat\t\t\t\tTure for period timer\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPInitTimer(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd,\n\tIN\tPRALINK_TIMER_STRUCT\tpTimer,\n\tIN\tPVOID\t\t\t\t\tpTimerFunc,\n\tIN\tPVOID\t\t\t\t\tpData,\n\tIN\tBOOLEAN\t\t\t\t\tRepeat)\n{\n\tRTMP_SEM_LOCK(&TimerSemLock);\n\n\tRTMP_TimerListAdd(pAd, pTimer);\n\n\t\n\t/* Set Valid to TRUE for later used.*/\n\t/* It will crash if we cancel a timer or set a timer */\n\t/* that we haven't initialize before.*/\n\t/* */\n\tpTimer->Valid      = TRUE;\n\t\n\tpTimer->PeriodicType = Repeat;\n\tpTimer->State      = FALSE;\n\tpTimer->cookie = (ULONG) pData;\n\tpTimer->pAd = pAd;\n\n\tRTMP_OS_Init_Timer(pAd, &pTimer->TimerObj,\tpTimerFunc, (PVOID) pTimer, &pAd->RscTimerMemList);\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"%s: %lx\\n\",__FUNCTION__, (ULONG)pTimer));\n\n\tRTMP_SEM_UNLOCK(&TimerSemLock);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tInit timer objects\n\n\tArguments:\n\t\tpTimer\t\t\t\tTimer structure\n\t\tValue\t\t\t\tTimer value in milliseconds\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\tTo use this routine, must call RTMPInitTimer before.\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPSetTimer(\n\tIN\tPRALINK_TIMER_STRUCT\tpTimer,\n\tIN\tULONG\t\t\t\t\tValue)\n{\n\tRTMP_SEM_LOCK(&TimerSemLock);\n\n\tif (pTimer->Valid)\n\t{\n\t\tRTMP_ADAPTER *pAd;\n\t\t\n\t\tpAd = (RTMP_ADAPTER *)pTimer->pAd;\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t{\n\t\t\tDBGPRINT_ERR((\"RTMPSetTimer failed, Halt in Progress!\\n\"));\n\t\t\tRTMP_SEM_UNLOCK(&TimerSemLock);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tpTimer->TimerValue = Value;\n\t\tpTimer->State      = FALSE;\n\t\tif (pTimer->PeriodicType == TRUE)\n\t\t{\n\t\t\tpTimer->Repeat = TRUE;\n\t\t\tRTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpTimer->Repeat = FALSE;\n\t\t\tRTMP_OS_Add_Timer(&pTimer->TimerObj, Value);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"%s: %lx\\n\",__FUNCTION__, (ULONG)pTimer));\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"RTMPSetTimer failed, Timer hasn't been initialize!\\n\"));\n\t}\n\tRTMP_SEM_UNLOCK(&TimerSemLock);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tInit timer objects\n\n\tArguments:\n\t\tpTimer\t\t\t\tTimer structure\n\t\tValue\t\t\t\tTimer value in milliseconds\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\tTo use this routine, must call RTMPInitTimer before.\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPModTimer(\n\tIN\tPRALINK_TIMER_STRUCT\tpTimer,\n\tIN\tULONG\t\t\t\t\tValue)\n{\n\tBOOLEAN\tCancel;\n\n\n\tRTMP_SEM_LOCK(&TimerSemLock);\n\n\tif (pTimer->Valid)\n\t{\n\t\tpTimer->TimerValue = Value;\n\t\tpTimer->State      = FALSE;\n\t\tif (pTimer->PeriodicType == TRUE)\n\t\t{\n\t\t\tRTMP_SEM_UNLOCK(&TimerSemLock);\n\t\t\tRTMPCancelTimer(pTimer, &Cancel);\n\t\t\tRTMPSetTimer(pTimer, Value);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);\n\t\t\tRTMP_SEM_UNLOCK(&TimerSemLock);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%s: %lx\\n\",__FUNCTION__, (ULONG)pTimer));\n\t}\n\telse\n\t{\n\t\tDBGPRINT_ERR((\"RTMPModTimer failed, Timer hasn't been initialize!\\n\"));\n\t\tRTMP_SEM_UNLOCK(&TimerSemLock);\n\t}\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCancel timer objects\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t1.) To use this routine, must call RTMPInitTimer before.\n\t\t2.) Reset NIC to initial state AS IS system boot up time.\n\t\t\n\t========================================================================\n*/\nVOID\tRTMPCancelTimer(\n\tIN\tPRALINK_TIMER_STRUCT\tpTimer,\n\tOUT\tBOOLEAN\t\t\t\t\t*pCancelled)\n{\n\tRTMP_SEM_LOCK(&TimerSemLock);\n\n\tif (pTimer->Valid)\n\t{\n\t\tif (pTimer->State == FALSE)\n\t\t\tpTimer->Repeat = FALSE;\n\t\t\n\t\tRTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);\n\t\t\n\t\tif (*pCancelled == TRUE)\n\t\t\tpTimer->State = TRUE;\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\t\t/* We need to go-through the TimerQ to findout this timer handler and remove it if */\n\t\t/*\t\tit's still waiting for execution.*/\n\t\tRtmpTimerQRemove(pTimer->pAd, pTimer);\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"%s: %lx\\n\",__FUNCTION__, (ULONG)pTimer));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"RTMPCancelTimer failed, Timer hasn't been initialize!\\n\"));\n\t}\n\n\tRTMP_SEM_UNLOCK(&TimerSemLock);\n}\n\n\nVOID\tRTMPReleaseTimer(\n\tIN\tPRALINK_TIMER_STRUCT\tpTimer,\n\tOUT\tBOOLEAN\t\t\t\t\t*pCancelled)\n{\n\tRTMP_SEM_LOCK(&TimerSemLock);\n\n\tif (pTimer->Valid)\n\t{\n\t\tif (pTimer->State == FALSE)\n\t\t\tpTimer->Repeat = FALSE;\n\t\t\n\t\tRTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);\n\t\t\n\t\tif (*pCancelled == TRUE)\n\t\t\tpTimer->State = TRUE;\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\t\t/* We need to go-through the TimerQ to findout this timer handler and remove it if */\n\t\t/*\t\tit's still waiting for execution.*/\n\t\tRtmpTimerQRemove(pTimer->pAd, pTimer);\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\n\t\t/* release timer */\n\t\tRTMP_OS_Release_Timer(&pTimer->TimerObj);\n\n\t\tpTimer->Valid = FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"%s: %lx\\n\",__FUNCTION__, (ULONG)pTimer));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"RTMPReleasefailed, Timer hasn't been initialize!\\n\"));\n\t}\n\n\tRTMP_SEM_UNLOCK(&TimerSemLock);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tEnable RX \n\n\tArguments:\n\t\tpAd\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL <= DISPATCH_LEVEL\n\t\n\tNote:\n\t\tBefore Enable RX, make sure you have enabled Interrupt.\n\t========================================================================\n*/\nVOID RTMPEnableRxTx(\n\tIN PRTMP_ADAPTER\tpAd)\n{\n\tUINT32 rx_filter_flag;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==> RTMPEnableRxTx\\n\"));\n\n\tRT28XXDMAEnable(pAd);\n\n\t/* enable RX of MAC block*/\n\tif (pAd->OpMode == OPMODE_AP)\n\t{\n\t\trx_filter_flag = APNORMAL;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef IDS_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif (pAd->ApCfg.IdsEnable)\n\t\t\t\trx_filter_flag &= (~0x4);\t/* Don't drop those not-U2M frames*/\n\t\t}\n#endif /* IDS_SUPPORT */\t\t\t\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);     /* enable RX of DMA block*/\n\t}\n#ifdef CONFIG_STA_SUPPORT\n\telse\n\t{\n#ifdef XLINK_SUPPORT\n\t\tif (pAd->StaCfg.PSPXlink)\n\t\t\trx_filter_flag = PSPXLINK;\n\t\telse\n#endif /* XLINK_SUPPORT */\t\n\t\t\trx_filter_flag = STANORMAL;     /* Staion not drop control frame will fail WiFi Certification.*/\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\t{\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);\n//+++Add by shiang for debug for pbf_loopback\n\t\t\t//RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x2c);\n//---Add by shiang for debug\n//+++Add by shiang for debug invalid RxWI->WCID \n#ifdef RT8592\n#endif /* RT8592 */\n//---Add by shiang for  debug invalid RxWI->WCID \n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<== RTMPEnableRxTx\\n\"));\t\n}\n\n\nvoid CfgInitHook(PRTMP_ADAPTER pAd)\n{\n\t/*pAd->bBroadComHT = TRUE;*/\n}\n\n\nstatic INT RtmpChipOpsRegister(\n\tIN RTMP_ADAPTER *pAd,\n\tIN INT\t\t\tinfType)\n{\n\tRTMP_CHIP_OP\t*pChipOps = &pAd->chipOps;\n\tint status;\n\t\n\tmemset(pChipOps, 0, sizeof(RTMP_CHIP_OP));\n\n\tRtmpChipOpsHook(pAd);\n\n\t/* MCU related */\n\tChipOpsMCUHook(pAd, pAd->chipCap.MCUType);\n\n\t/* set eeprom related hook functions */\n\tstatus = RtmpChipOpsEepromHook(pAd, infType);\n\n\treturn status;\n}\n\n\n#ifdef RTMP_MAC_USB\nBOOLEAN PairEP(RTMP_ADAPTER *pAd, UINT8 EP, UINT8 Index, UINT8 InOut)\n{\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tif (Index == 0 && InOut == 0)\n\t{\n\t\tpChipCap->CommandBulkOutAddr = EP;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Endpoint(%x) is for In-band Command\\n\", EP));\n\t\treturn TRUE;\n\t}\n\t\n\tif (Index > 0 && Index < 5 && InOut == 0)\n\t{\n\t\tpChipCap->WMM0ACBulkOutAddr[Index - 1] = EP; \n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Endpoint(%x) is for WMM0 AC%d\\n\", EP, Index - 1));\n\t\treturn TRUE;\n\t}\n\t\n\tif (Index == 5 && InOut == 0)\n\t{\n\t\tpChipCap->WMM1ACBulkOutAddr = EP;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Endpoint(%x) is for WMM1 AC0\\n\", EP));\n\t\treturn TRUE;\n\t}\n\n\tif (Index == 0 && InOut == 1)\n\t{\n\t\tpChipCap->DataBulkInAddr = EP;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Endpoint(%x) is for Data-In\\n\", EP));\n\t\treturn TRUE;\n\t}\n\n\n\tif (Index == 1 && InOut == 1)\n\t{\n\t\tpChipCap->CommandRspBulkInAddr = EP;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Endpoint(%x) is for Command Rsp\\n\", EP));\n\t\treturn TRUE;\n\t}\n\t\t\t\t\n\treturn FALSE;\n}\n#endif /* RTMP_MAC_USB */\n\n\nINT RtmpRaDevCtrlInit(VOID *pAdSrc, RTMP_INF_TYPE infType)\n{\n\tRTMP_ADAPTER *pAd = (PRTMP_ADAPTER)pAdSrc;\n\tUINT8 i;\n\n\t/* Assign the interface type. We need use it when do register/EEPROM access.*/\n\tpAd->infType = infType;\n\n#ifdef CONFIG_STA_SUPPORT\n\tpAd->OpMode = OPMODE_STA;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"STA Driver version-%s\\n\", STA_DRIVER_VERSION));\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tpAd->OpMode = OPMODE_AP;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AP Driver version-%s\\n\", AP_DRIVER_VERSION));\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tpAd->OpMode = OPMODE_STA;\n#endif /* P2P_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\tRTMP_SEM_EVENT_INIT(&(pAd->UsbVendorReq_semaphore), &pAd->RscSemMemList);\n\tRTMP_SEM_EVENT_INIT(&(pAd->reg_atomic), &pAd->RscSemMemList);\n\tRTMP_SEM_EVENT_INIT(&(pAd->hw_atomic), &pAd->RscSemMemList);\n\tos_alloc_mem(pAd, (PUCHAR *)&pAd->UsbVendorReqBuf, MAX_PARAM_BUFFER_SIZE - 1);\n\tif (pAd->UsbVendorReqBuf == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Allocate vendor request temp buffer failed!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t\n#endif /* RTMP_MAC_USB */\n\n\tRtmpChipOpsRegister(pAd, infType);\n\n#ifdef RTMP_MAC_USB\n\tfor (i = 0; i < 6; i++)\n\t{\n\t\tif (!PairEP(pAd, pAd->BulkOutEpAddr[i], i, 0))\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid bulk out ep(%x)\\n\", pAd->BulkOutEpAddr[i]));\n\t}\n\n\tfor (i = 0; i < 2; i++)\n\t{\n\t\tif (!PairEP(pAd, pAd->BulkInEpAddr[i], i, 1))\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Invalid bulk in ep(%x)\\n\", pAd->BulkInEpAddr[i]));\n\t}\n\n#endif\n\n#ifdef MULTIPLE_CARD_SUPPORT\n{\n\textern BOOLEAN RTMP_CardInfoRead(PRTMP_ADAPTER pAd);\n\n\t/* find its profile path*/\n\tpAd->MC_RowID = -1; /* use default profile path*/\n\tRTMP_CardInfoRead(pAd);\n\n\tif (pAd->MC_RowID == -1)\n#ifdef CONFIG_AP_SUPPORT\n\t\tstrcpy(pAd->MC_FileName, AP_PROFILE_PATH);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tstrcpy(pAd->MC_FileName, STA_PROFILE_PATH);\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MC> ROW = %d, PATH = %s\\n\", pAd->MC_RowID, pAd->MC_FileName));\n}\n#endif /* MULTIPLE_CARD_SUPPORT */\n\n#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT)\n\tif (pAd->chipCap.asic_caps | fASIC_CAP_CSO)\n\t\tRTMP_SET_MORE_FLAG(pAd, fASIC_CAP_CSO);\n#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT) */\n\treturn 0;\n}\n\n\nBOOLEAN RtmpRaDevCtrlExit(IN VOID *pAdSrc)\n{\n\tPRTMP_ADAPTER\tpAd = (PRTMP_ADAPTER)pAdSrc;\n\tINT index;\n\t\n#ifdef MULTIPLE_CARD_SUPPORT\nextern UINT8  MC_CardUsed[MAX_NUM_OF_MULTIPLE_CARD];\n\n\tif ((pAd->MC_RowID >= 0) && (pAd->MC_RowID <= MAX_NUM_OF_MULTIPLE_CARD))\n\t\tMC_CardUsed[pAd->MC_RowID] = 0; /* not clear MAC address*/\n#endif /* MULTIPLE_CARD_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CREDENTIAL_STORE\n\t\tNdisFreeSpinLock(&pAd->StaCtIf.Lock);\n#endif /* CREDENTIAL_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n#ifdef RTMP_MAC_USB\n\tRTMP_SEM_EVENT_DESTORY(&(pAd->UsbVendorReq_semaphore));\n\tRTMP_SEM_EVENT_DESTORY(&(pAd->reg_atomic));\n\tRTMP_SEM_EVENT_DESTORY(&(pAd->hw_atomic));\n\n\n\tif (pAd->UsbVendorReqBuf)\n\t\tos_free_mem(pAd, pAd->UsbVendorReqBuf);\n#endif /* RTMP_MAC_USB */\n\n\t/*\n\t\tFree ProbeRespIE Table\n\t*/\n\tfor (index = 0; index < MAX_LEN_OF_BSS_TABLE; index++) \n\t{\n\t\tif (pAd->ProbeRespIE[index].pIe)\n\t\t\tos_free_mem(pAd, pAd->ProbeRespIE[index].pIe);\n\t}\n\n#ifdef RESOURCE_PRE_ALLOC\n\tRTMPFreeTxRxRingMemory(pAd);\n#endif /* RESOURCE_PRE_ALLOC */\n\n#ifdef RT65xx\n\tif (IS_RT6590(pAd) && (pAd->WlanFunCtrl.field.WLAN_EN == 1))\n\t{\t\n\t\tral_wlan_chip_onoff(pAd, FALSE, FALSE);\n\t}\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd) && (pAd->WlanFunCtrl.field.WLAN_EN == 1) )\n\t{\t\n\t\tMT7601_WLAN_ChipOnOff(pAd, FALSE, FALSE);\n\t}\n#endif /* MT7601 */\n\n\tRTMPFreeAdapter(pAd);\n\n\treturn TRUE;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\nVOID RTMP_11N_D3_TimerInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tRTMPInitTimer(pAd, &pAd->CommonCfg.Bss2040CoexistTimer, GET_TIMER_FUNCTION(Bss2040CoexistTimeOut), pAd, FALSE);\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef VENDOR_FEATURE3_SUPPORT\nVOID RTMP_IO_WRITE32(\n\tPRTMP_ADAPTER pAd,\n\tUINT32 Offset,\n\tUINT32 Value)\n{\n\t_RTMP_IO_WRITE32(pAd, Offset, Value);\n}\n\nVOID RTMP_BBP_IO_READ8_BY_REG_ID(\n\tPRTMP_ADAPTER pAd,\n\tUINT32 Offset,\n\tUINT8 *pValue)\n{\n#ifdef RT8592\n\tif (IS_RT8592(pAd))\n\t\treturn;\n#endif /* RT8592 */\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t\treturn;\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\treturn;\n#endif /* MT7601 */\n\t_RTMP_BBP_IO_READ8_BY_REG_ID(pAd, Offset, pValue);\n}\n\nVOID RTMP_BBP_IO_READ8(\n\tPRTMP_ADAPTER pAd,\n\tUCHAR Offset,\n\tUINT8 *pValue,\n\tBOOLEAN FlgValidMCR)\n{\n#ifdef RT8592\n\tif (IS_RT8592(pAd))\n\t\treturn;\n#endif /* RT8592 */\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t\treturn;\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\treturn;\n#endif /* MT7601 */\n\n\t_RTMP_BBP_IO_READ8(pAd, Offset, pValue, FlgValidMCR);\n}\n\nVOID RTMP_BBP_IO_WRITE8_BY_REG_ID(\n\tPRTMP_ADAPTER pAd,\n\tUINT32 Offset,\n\tUINT8 Value)\n{\n#ifdef RT8592\n\tif (IS_RT8592(pAd))\n\t\treturn;\n#endif /* RT8592 */\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t\treturn;\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\treturn;\n#endif /* MT7601 */\n\n\t_RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, Offset, Value);\n}\n\nVOID RTMP_BBP_IO_WRITE8(\n\tPRTMP_ADAPTER pAd,\n\tUCHAR Offset,\n\tUINT8 Value,\n\tBOOLEAN FlgValidMCR)\n{\n#ifdef RT8592\n\tif (IS_RT8592(pAd))\n\t\treturn;\n#endif /* RT8592 */\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t\treturn;\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t\treturn;\n#endif /* MT7601 */\n\n\t_RTMP_BBP_IO_WRITE8(pAd, Offset, Value, FlgValidMCR);\n}\n#endif /* VENDOR_FEATURE3_SUPPORT */\n\n\n\nVOID AntCfgInit(\nIN  PRTMP_ADAPTER   pAd)\n{\n\n\t\n#ifdef TXRX_SW_ANTDIV_SUPPORT\n\t/* EEPROM 0x34[15:12] = 0xF is invalid, 0x2~0x3 is TX/RX SW AntDiv */\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s: bTxRxSwAntDiv %d\\n\", __FUNCTION__, pAd->chipCap.bTxRxSwAntDiv));\n\tif (pAd->chipCap.bTxRxSwAntDiv)  \n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Antenna word %X/%d, AntDiv %d\\n\", \n\t\t\t\t\tpAd->Antenna.word, pAd->Antenna.field.BoardType, pAd->NicConfig2.field.AntDiversity));\n\t}\n#endif /* TXRX_SW_ANTDIV_SUPPORT */\n\n\t{\n\t\tif (pAd->NicConfig2.field.AntOpt== 1) /* ant selected by efuse */\n\t\t{\t\n\t\t\tif (pAd->NicConfig2.field.AntDiversity == 0) /* main */\n\t\t\t{\n\t\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt = 0;\n\t\t\t\tpAd->RxAnt.Pair1SecondaryRxAnt = 1;\n\t\t\t}\n\t\t\telse/* aux */\n\t\t\t{\n\t\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt = 1;\n\t\t\t\tpAd->RxAnt.Pair1SecondaryRxAnt = 0;\n\t\t\t}\n\t\t}\n\t\telse if (pAd->NicConfig2.field.AntDiversity == 0) /* Ant div off: default ant is main */\n\t\t{\n\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt = 0;\n\t\t\tpAd->RxAnt.Pair1SecondaryRxAnt = 1;\n\t\t}\n\t\telse if (pAd->NicConfig2.field.AntDiversity == 1)/* Ant div on */\n\t\t{/* eeprom on, but sw ant div support is not enabled: default ant is main */\n\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt = 0;\n\t\t\tpAd->RxAnt.Pair1SecondaryRxAnt = 1;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s: primary/secondary ant %d/%d\\n\", \n\t\t\t\t\t__FUNCTION__,\n\t\t\t\t\tpAd->RxAnt.Pair1PrimaryRxAnt,\n\t\t\t\t\tpAd->RxAnt.Pair1SecondaryRxAnt));\n}\n\n#ifdef MICROWAVE_OVEN_SUPPORT\nVOID NICUpdateRxStatusCnt1(\nIN  PRTMP_ADAPTER   pAd,\nIN  UCHAR\tIdx)\n{\n\tRX_STA_CNT1_STRUC   RxStaCnt1;\n\n\tRTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);\n\n\tif (Idx < MLME_TASK_EXEC_MULTIPLE)\n\t{\n\t\tpAd->RalinkCounters.FalseCCACnt_100MS[Idx] = RxStaCnt1.field.FalseCca;\n\t\tpAd->RalinkCounters.PLCPErrCnt_100MS[Idx] = RxStaCnt1.field.PlcpErr;\n\t}\n}\n\nUINT32 NICSumFalseCCACnt(\nIN  PRTMP_ADAPTER   pAd)\n{\n\tUCHAR Idx;\n\tUINT32 FalseCCACnt = 0;\n\n\tfor (Idx = 0; Idx < MLME_TASK_EXEC_MULTIPLE; Idx++)\n\t\tFalseCCACnt += pAd->RalinkCounters.FalseCCACnt_100MS[Idx];\n\n\treturn FalseCCACnt;\n}\n\nUINT32 NICSumPLCPErrCnt(\nIN  PRTMP_ADAPTER   pAd)\n{\n\tUCHAR Idx;\n\tUINT32 PLCPErrCnt = 0;\n\n\tfor (Idx = 0; Idx < MLME_TASK_EXEC_MULTIPLE; Idx++)\n\t\tPLCPErrCnt += pAd->RalinkCounters.PLCPErrCnt_100MS[Idx];\n\n\treturn PLCPErrCnt;\n}\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n"
  },
  {
    "path": "src/common/rtmp_init_inf.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_init_inf.c\n\n\tAbstract:\n\tMiniport generic portion header file\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n#include\t\"rt_config.h\"\n\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PROFILE_STORE\nNDIS_STATUS WriteDatThread(RTMP_ADAPTER *pAd);\n#endif /* PROFILE_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef LINUX\n#ifdef OS_ABL_FUNC_SUPPORT\n/* Utilities provided from NET module */\nRTMP_NET_ABL_OPS RtmpDrvNetOps, *pRtmpDrvNetOps = &RtmpDrvNetOps;\nRTMP_PCI_CONFIG RtmpPciConfig, *pRtmpPciConfig = &RtmpPciConfig;\nRTMP_USB_CONFIG RtmpUsbConfig, *pRtmpUsbConfig = &RtmpUsbConfig;\n\nVOID RtmpDrvOpsInit(\n\tOUT VOID *pDrvOpsOrg,\n\tINOUT VOID *pDrvNetOpsOrg,\n\tIN RTMP_PCI_CONFIG *pPciConfig,\n\tIN RTMP_USB_CONFIG *pUsbConfig)\n{\n\tRTMP_DRV_ABL_OPS *pDrvOps = (RTMP_DRV_ABL_OPS *)pDrvOpsOrg;\n#ifdef RTMP_USB_SUPPORT\n\tRTMP_NET_ABL_OPS *pDrvNetOps = (RTMP_NET_ABL_OPS *)pDrvNetOpsOrg;\n#endif /* RTMP_USB_SUPPORT */\n\n\n\t/* init PCI/USB configuration in different OS */\n\tif (pPciConfig != NULL)\n\t\tRtmpPciConfig = *pPciConfig;\n\n\tif (pUsbConfig != NULL)\n\t\tRtmpUsbConfig = *pUsbConfig;\n\n\t/* init operators provided from us (DRIVER module) */\n\tpDrvOps->RTMPAllocAdapterBlock = RTMPAllocAdapterBlock;\n\tpDrvOps->RTMPFreeAdapter = RTMPFreeAdapter;\n\n\tpDrvOps->RtmpRaDevCtrlExit = RtmpRaDevCtrlExit;\n\tpDrvOps->RtmpRaDevCtrlInit = RtmpRaDevCtrlInit;\n\n\tpDrvOps->RTMPSendPackets = RTMPSendPackets;\n#ifdef MBSS_SUPPORT\n\tpDrvOps->MBSS_PacketSend = MBSS_PacketSend;\n#endif /* MBSS_SUPPORT */\n#ifdef APCLI_SUPPORT\n\tpDrvOps->APC_PacketSend = APC_PacketSend;\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n\tpDrvOps->P2P_PacketSend = P2P_PacketSend;\n#endif /* P2P_SUPPORT */\n\n\tpDrvOps->RTMP_COM_IoctlHandle = RTMP_COM_IoctlHandle;\n#ifdef CONFIG_AP_SUPPORT\n\tpDrvOps->RTMP_AP_IoctlHandle = RTMP_AP_IoctlHandle;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tpDrvOps->RTMP_STA_IoctlHandle = RTMP_STA_IoctlHandle;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpDrvOps->RTMPDrvOpen = RTMPDrvOpen;\n\tpDrvOps->RTMPDrvClose = RTMPDrvClose;\n\tpDrvOps->RTMPInfClose = RTMPInfClose;\n\tpDrvOps->rt28xx_init = rt28xx_init;\n\n\t/* init operators provided from us and netif module */\n#ifdef RTMP_USB_SUPPORT\n\t*pRtmpDrvNetOps = *pDrvNetOps;\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkOutDataPacketComplete = RTUSBBulkOutDataPacketComplete;\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkOutMLMEPacketComplete = RTUSBBulkOutMLMEPacketComplete;\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkOutNullFrameComplete = RTUSBBulkOutNullFrameComplete;\n#ifdef CONFIG_MULTI_CHANNEL\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkOutHCCANullFrameComplete = RTUSBBulkOutHCCANullFrameComplete;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n/*\tpRtmpDrvNetOps->RtmpDrvUsbBulkOutRTSFrameComplete = RTUSBBulkOutRTSFrameComplete;*/\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkOutPsPollComplete = RTUSBBulkOutPsPollComplete;\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkRxComplete = RTUSBBulkRxComplete;\n\tpRtmpDrvNetOps->RtmpDrvUsbBulkCmdRspEventComplete = RTUSBBulkCmdRspEventComplete;\n\t*pDrvNetOps = *pRtmpDrvNetOps;\n#endif /* RTMP_USB_SUPPORT */\n}\n\nRTMP_BUILD_DRV_OPS_FUNCTION_BODY\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n#endif /* LINUX */\n\n\nint rt28xx_init(VOID *pAdSrc, PSTRING pDefaultMac, PSTRING pHostName)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc;\n\tUINT index;\n\tNDIS_STATUS Status;\n\t\n\tif (pAd == NULL)\n\t\treturn FALSE;\n\n// TODO: shiang-6590, fix me, we need a better place for this function call\n#ifdef RT6570\n\tif (pAd->WlanFunCtrl.field.WLAN_EN == 0)\n\t\tral_wlan_chip_onoff(pAd, TRUE, FALSE);\n#endif /* RT6570 */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd) && (pAd->WlanFunCtrl.field.WLAN_EN == 0))\n\t\tMT7601_WLAN_ChipOnOff(pAd, TRUE, FALSE);\n#endif /* MT7601U */\n//---\n\n#ifdef RT3290\n\tDBGPRINT(RT_DEBUG_OFF, (\"MACVersion=0x%x\\n\", pAd->MACVersion));\n\tif (IS_RT3290(pAd))\n\t{\n\t\tUINT32 MacRegValue;\n\t\tOSCCTL_STRUC osCtrl = {.word = 0};\n\t\tCMB_CTRL_STRUC cmbCtrl = {.word = 0};\n\t\tWLAN_FUN_CTRL_STRUC WlanFunCtrl = {.word = 0};\n\t\t\t\n\t\tRTMPEnableWlan(pAd, TRUE, TRUE);\n\n\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\t\tif (WlanFunCtrl.field.WLAN_EN == TRUE)\n\t\t{\n\t\t\tWlanFunCtrl.field.PCIE_APP0_CLK_REQ = TRUE;\n\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t}\n\t\t\t\n\t\t//Enable ROSC_EN first then CAL_REQ\n\t\tRTMP_IO_READ32(pAd, OSCCTL, &osCtrl.word);\n\t\tosCtrl.field.ROSC_EN = TRUE; /* HW force */\n\t\tRTMP_IO_WRITE32(pAd, OSCCTL, osCtrl.word);\t\n\t\t\n\t\tosCtrl.field.ROSC_EN = TRUE; /* HW force */\n\t\tosCtrl.field.CAL_REQ = TRUE;\n\t\tosCtrl.field.REF_CYCLE = 0x27;\n\t\tRTMP_IO_WRITE32(pAd, OSCCTL, osCtrl.word);\n\n\t\tRTMP_IO_READ32(pAd, CMB_CTRL, &cmbCtrl.word);\n\t\tpAd->CmbCtrl.word = cmbCtrl.word;\n\n\t\t/* Overwrite default Coex Parameter */\n\t\tRTMP_IO_READ32(pAd, COEXCFG0, &MacRegValue);\n\t\tMacRegValue &= ~(0xFF000000);\n\t\tMacRegValue |= 0x5E000000;\n\t\tRTMP_IO_WRITE32(pAd, COEXCFG0, MacRegValue);\n\t}\n\n\tif (IS_RT3290LE(pAd))\n\t{\n\t\tPLL_CTRL_STRUC PllCtrl;\n\t\tRTMP_IO_READ32(pAd, PLL_CTRL, &PllCtrl.word);\n\t\tPllCtrl.field.VCO_FIXED_CURRENT_CONTROL = 0x1;\t\t\t\n\t\tRTMP_IO_WRITE32(pAd, PLL_CTRL, PllCtrl.word);\n\t}\n#endif /* RT3290 */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PCIE_PS_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t    \t/* If dirver doesn't wake up firmware here,*/\n\t    \t/* NICLoadFirmware will hang forever when interface is up again.*/\n\t    \tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&\n\t        \tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))\n\t    \t{\n\t        \tAUTO_WAKEUP_STRUC AutoWakeupCfg;\n\t\t\t\tAsicForceWakeup(pAd, TRUE);\n\t        \tAutoWakeupCfg.word = 0;\n\t\t    \tRTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);\n\t        \tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);\n\t    \t}\n\t}\n#endif /* PCIE_PS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* reset Adapter flags*/\n\tRTMP_CLEAR_FLAGS(pAd);\n\n\t/* Init BssTab & ChannelInfo tabbles for auto channel select.*/\n#ifdef CONFIG_AP_SUPPORT\t\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tAutoChBssTableInit(pAd);\n\t\tChannelInfoInit(pAd);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t/* Allocate BA Reordering memory*/\n\tif (ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM) != TRUE)\t\t\n\t\tgoto err1;\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Make sure MAC gets ready.*/\n\tindex = 0;\n\tif (WaitForAsicReady(pAd) != TRUE)\n\t\tgoto err1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MAC[Ver:Rev=0x%08x]\\n\", pAd->MACVersion));\n\n\n\tif (MAX_LEN_OF_MAC_TABLE > MAX_AVAILABLE_CLIENT_WCID(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MAX_LEN_OF_MAC_TABLE can not be larger than MAX_AVAILABLE_CLIENT_WCID!!!!\\n\"));\n\t\tgoto err1;\n\t}\n\n\n\t/* Disable DMA*/\n\tRT28XXDMADisable(pAd);\n\n#ifdef RLT_MAC\n\t/* Initialze MCU control before load fw */\n\tMCUCtrlInit(pAd);\n#endif /* RLT_MAC */\n\n\t/* Load MCU firmware*/\n\tStatus = NICLoadFirmware(pAd);\n\t\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"NICLoadFirmware failed, Status[=0x%08x]\\n\", Status));\n\t\tgoto err1;\n\t}\n\n\t/* Disable interrupts here which is as soon as possible*/\n\t/* This statement should never be true. We might consider to remove it later*/\n\n#ifdef RESOURCE_PRE_ALLOC\n\tStatus = RTMPInitTxRxRingMemory(pAd);\n#else\n\tStatus = RTMPAllocTxRxRingMemory(pAd);\n#endif /* RESOURCE_PRE_ALLOC */\n\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"RTMPAllocTxRxMemory failed, Status[=0x%08x]\\n\", Status));\n\t\tgoto err2;\n\t}\n\n#ifdef WLAN_SKB_RECYCLE\n    skb_queue_head_init(&pAd->rx0_recycle);\n#endif /* WLAN_SKB_RECYCLE */\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);\n\n\t/* initialize MLME*/\n\tStatus = RtmpMgmtTaskInit(pAd);\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t\tgoto err3;\n\n\tStatus = MlmeInit(pAd);\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"MlmeInit failed, Status[=0x%08x]\\n\", Status));\n\t\tgoto err4;\n\t}\n\n#ifdef RMTP_RBUS_SUPPORT\n#ifdef VIDEO_TURBINE_SUPPORT\n\tVideoConfigInit(pAd);\n#endif /* VIDEO_TURBINE_SUPPORT */\n#endif /* RMTP_RBUS_SUPPORT */\n\n\t/* Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default*/\n\tUserCfgInit(pAd);\n\n\n\tStatus = RtmpNetTaskInit(pAd);\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t\tgoto err5;\n\n\tCfgInitHook(pAd);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAPInitialize(pAd);\n#endif /* CONFIG_AP_SUPPORT */\t\n\n#ifdef BLOCK_NET_IF\n\tinitblockQueueTab(pAd);\n#endif /* BLOCK_NET_IF */\n\n\tStatus = MeasureReqTabInit(pAd);\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"MeasureReqTabInit failed, Status[=0x%08x]\\n\",Status));\n\t\tgoto err6;\t\n\t}\n\tStatus = TpcReqTabInit(pAd);\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"TpcReqTabInit failed, Status[=0x%08x]\\n\",Status));\n\t\tgoto err6;\t\n\t}\n\n\t/* Init the hardware, we need to init asic before read registry, otherwise mac register will be reset*/\n\t\n\tStatus = NICInitializeAdapter(pAd, TRUE);\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"NICInitializeAdapter failed, Status[=0x%08x]\\n\", Status));\n\t\tif (Status != NDIS_STATUS_SUCCESS)\n\t\tgoto err6;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* Read parameters from Config File */\n\t/* unknown, it will be updated in NICReadEEPROMParameters */\n\tpAd->RfIcType = RFIC_UNKNOWN;\n\tStatus = RTMPReadParametersHook(pAd);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CREDENTIAL_STORE\n\tRecoverConnectInfo(pAd);\n#endif /* CREDENTIAL_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"1. Phy Mode = %d\\n\", pAd->CommonCfg.PhyMode));\n\tif (Status != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT_ERR((\"RTMPReadParametersHook failed, Status[=0x%08x]\\n\",Status));\n\t\tgoto err6;\n\t}\n\n#ifdef RTMP_MAC_USB\n\tpAd->CommonCfg.bMultipleIRP = FALSE;\n\n\tif (pAd->CommonCfg.bMultipleIRP)\n\t\tpAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE;\n\telse\n\t\tpAd->CommonCfg.NumOfBulkInIRP = 1;\n#endif /* RTMP_MAC_USB */\n\n#ifdef DOT11_N_SUPPORT\n   \t/*Init Ba Capability parameters.*/\n/*\tRT28XX_BA_INIT(pAd);*/\n\tpAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;\n\tpAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;\n\tpAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;\n\tpAd->CommonCfg.DesiredHtPhy.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;\n\t/* UPdata to HT IE*/\n\tpAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;\n\tpAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;\n\tpAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;\n#endif /* DOT11_N_SUPPORT */\n\n\t/* after reading Registry, we now know if in AP mode or STA mode*/\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"2. Phy Mode = %d\\n\", pAd->CommonCfg.PhyMode));\n\n\t/* We should read EEPROM for all cases.  rt2860b*/\n\tNICReadEEPROMParameters(pAd, (PSTRING)pDefaultMac);\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"3. Phy Mode = %d\\n\", pAd->CommonCfg.PhyMode));\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Send LED Setting to MCU */\n\tRTMPInitLEDMode(pAd);\t\n#endif /* LED_CONTROL_SUPPORT */\n\n\tNICInitAsicFromEEPROM(pAd); /* rt2860b */\n\n#ifdef RALINK_ATE\n\tif (ATEInit(pAd) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): ATE initialization failed !\\n\", __FUNCTION__));\n\t\tgoto err6;\n\t}\n#endif /* RALINK_ATE */\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n#ifdef CONFIG_STA_SUPPORT\n\t/* Initialize the frequency calibration*/\n\tif (pAd->chipCap.FreqCalibrationSupport)\n\t\tFrequencyCalibration(pAd);\t\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n#ifdef RTMP_INTERNAL_TX_ALC\n\t/* Initialize the desired TSSI table*/\n\tRTMP_CHIP_ASIC_TSSI_TABLE_INIT(pAd);\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n\t/* Temperature compensation, initialize the lookup table */\n\tDBGPRINT(RT_DEBUG_OFF, (\"bAutoTxAgcG = %d\\n\", pAd->bAutoTxAgcG));\n\n\tif (pAd->chipCap.bTempCompTxALC && pAd->bAutoTxAgcG)\n\t\tInitLookupTable(pAd);\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n#ifdef CONFIG_STA_SUPPORT\n\tif (pAd->chipCap.FreqCalibrationSupport)\n\t\tInitFrequencyCalibration(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\t/* Set PHY to appropriate mode*/\n\tRTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode);\n\n\t/* No valid channels.*/\n\tif (pAd->ChannelListNum == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Wrong configuration. No valid channel found. Check \\\"ContryCode\\\" and \\\"ChannelGeography\\\" setting.\\n\"));\n\t\tgoto err6;\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tDBGPRINT(RT_DEBUG_OFF, (\"MCS Set = %02x %02x %02x %02x %02x\\n\", pAd->CommonCfg.HtCapability.MCSSet[0],\n           pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2],\n           pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4]));\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef AP_QLOAD_SUPPORT\n\t\tQBSS_LoadInit(pAd);\n#endif /* AP_QLOAD_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* APInitialize(pAd);*/\n\n#ifdef IKANOS_VX_1X0\n\tVR_IKANOS_FP_Init(pAd->ApCfg.BssidNum, pAd->PermanentAddress);\n#endif /* IKANOS_VX_1X0 */\n\n#ifdef RTMP_MAC_USB\n\tAsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02, FALSE);\n\tRTMPusecDelay(10000);\n#endif /* RTMP_MAC_USB */\n\n#ifdef RALINK_ATE\n#endif /* RALINK_ATE */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\n\t/* Initialize RF register to default value*/\n\t\n\tif (pAd->OpMode == OPMODE_AP)\n\t{\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/*\n\t\tSome modules init must be called before APStartUp().\n\t\tOr APStartUp() will make up beacon content and call\n\t\tother modules API to get some information to fill.\n\t*/\n\n\n\n\tif (pAd && (Status != NDIS_STATUS_SUCCESS))\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t\t{\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);\n\t\t}\n\t}\n\telse if (pAd)\n\t{\n\t\t/* Microsoft HCT require driver send a disconnect event after driver initialization.*/\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED);\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NDIS_STATUS_MEDIA_DISCONNECT Event B!\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif (pAd->ApCfg.bAutoChannelAtBootup || (pAd->CommonCfg.Channel == 0))\n\t\t\t{\t\n\t\t\t\t/* Enable Interrupt first due to we need to scan channel to receive beacons.*/\n\t\t\t\tRTMP_IRQ_ENABLE(pAd);\n#ifdef RTMP_MAC_USB\n\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);\n\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);\n\n\t\t\t\t\n\t\t\t\t/* Support multiple BulkIn IRP,*/\n\t\t\t\t/* the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.*/\n\t\t\t\t\n\t\t\t\tfor(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++)\n\t\t\t\t{\n\t\t\t\t\tRTUSBBulkReceive(pAd);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBulkReceive!\\n\" ));\n\t\t\t\t}\n\n#endif /* RTMP_MAC_USB */\n\t\t\t\t/* Now Enable RxTx*/\n\t\t\t\tRTMPEnableRxTx(pAd);\n\t\t\t\t//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP);\n\n\t\t\t\t/* Let BBP register at 20MHz to do scan */\n\t\t\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n\n\t\t\t\t/* Now we can receive the beacon and do the listen beacon*/\n\t\t\t\t/* use default BW to select channel*/\n\t\t\t\tpAd->CommonCfg.Channel = AP_AUTO_CH_SEL(pAd, pAd->ApCfg.AutoChannelAlg);\n\t\t\t\tpAd->ApCfg.bAutoChannelAtBootup = FALSE;\n\t\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* If WMODE_CAP_N(phymode) and BW=40 check extension channel, after select channel  */\n\t\t\tN_ChannelCheck(pAd);\n\n#ifdef DOT11N_DRAFT3\n        \t\t/* \n         \t\t\tWe only do this Overlapping BSS Scan when system up, for the \n\t\t\t\tother situation of channel changing, we depends on station's \n\t\t\t\treport to adjust ourself.\n\t\t\t*/\n\t\t\tif (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Disable 20/40 BSSCoex Channel Scan(BssCoex=%d, 40MHzIntolerant=%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.bBssCoexEnable, \n\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.bForty_Mhz_Intolerant));\n\t\t\t}\n\t\t\telse if(pAd->CommonCfg.bBssCoexEnable == TRUE)\n\t\t\t{\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Enable 20/40 BSSCoex Channel Scan(BssCoex=%d)\\n\", \n\t\t\t\t\t\t\tpAd->CommonCfg.bBssCoexEnable));\n\t\t\t\tAPOverlappingBSSScan(pAd);\n\t\t\t}\n\n\t\t\tRTMP_11N_D3_TimerInit(pAd);\n/*\t\t\tRTMPInitTimer(pAd, &pAd->CommonCfg.Bss2040CoexistTimer, GET_TIMER_FUNCTION(Bss2040CoexistTimeOut), pAd, FALSE);*/\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tAPStartUp(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Main bssid = %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\t\t\t\t\tPRINT_MAC(pAd->ApCfg.MBSSID[BSS0].Bssid)));\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);\n\n\t\t\n\t\t/* Support multiple BulkIn IRP,*/\n\t\t/* the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.*/\n\t\tfor(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++)\n\t\t{\n\t\t\tRTUSBBulkReceive(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBulkReceive!\\n\" ));\n\t\t}\n#endif /* RTMP_MAC_USB */\n\t}/* end of else*/\n\n\t/* Set up the Mac address*/\n#ifdef CONFIG_AP_SUPPORT\n#ifndef P2P_APCLI_SUPPORT\n\tRtmpOSNetDevAddrSet(pAd->OpMode, pAd->net_dev, &pAd->CurrentAddress[0], NULL);\n#endif /* P2P_APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tRtmpOSNetDevAddrSet(pAd->OpMode, pAd->net_dev, &pAd->CurrentAddress[0], (PUCHAR)(pAd->StaCfg.dev_name));\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Various AP function init*/\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n#ifdef MBSS_SUPPORT\n\t\t/* the function can not be moved to RT2860_probe() even register_netdev()\n\t\t   is changed as register_netdevice().\n\t\t   Or in some PC, kernel will panic (Fedora 4) */\n/*\t\tRT28xx_MBSS_Init(pAd, pAd->net_dev);  os abl move to rt_main_dev.c*/\n#endif /* MBSS_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\n/*\t\tRT28xx_ApCli_Init(pAd, pAd->net_dev);*/\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef UAPSD_SUPPORT\n        UAPSD_Init(pAd);\n#endif /* UAPSD_SUPPORT */\n\n\t/* assign function pointers*/\n#ifdef MAT_SUPPORT\n\t/* init function pointers, used in OS_ABL */\n\tRTMP_MATOpsInit(pAd);\n#endif /* MAT_SUPPORT */\n\n\n\n#ifdef P2P_SUPPORT\n/*\t\tRTMP_P2P_Init(pAd, pAd->net_dev); */\n#endif /* P2P_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef MAT_SUPPORT\n\t\tMATEngineInit(pAd);\n#endif /* MAT_SUPPORT */\n\n#ifdef CLIENT_WDS\n\t\tCliWds_ProxyTabInit(pAd);\n#endif /* CLIENT_WDS */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tTDLS_Table_Init(pAd);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t/* send wireless event to wpa_supplicant for infroming interface up.*/\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, RT_INTERFACE_UP, NULL, NULL, 0);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* auto-fall back settings */\n#ifdef RANGE_EXTEND\n\tRTMP_IO_WRITE32(pAd, HT_FBK_CFG1, 0xedcba980);\n#endif // RANGE_EXTEND //\n#ifdef DOT11N_SS3_SUPPORT\n\tif (pAd->CommonCfg.TxStream >= 3)\n\t{\n\t\tRTMP_IO_WRITE32(pAd, TX_FBK_CFG_3S_0, 0x12111008);\n\t\tRTMP_IO_WRITE32(pAd, TX_FBK_CFG_3S_1, 0x16151413);\n\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n\tRtmpStreamModeInit(pAd);\n#endif /* STREAM_MODE_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef TXBF_SUPPORT\n\tif (pAd->CommonCfg.ITxBfTimeout)\n\t{\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R179, 0x02);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R180, 0);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R182, pAd->CommonCfg.ITxBfTimeout & 0xFF);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R180, 1);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R182, (pAd->CommonCfg.ITxBfTimeout>>8) & 0xFF);\n\t}\n\n\tif (pAd->CommonCfg.ETxBfTimeout)\n\t{\n\t\tRTMP_IO_WRITE32(pAd, TX_TXBF_CFG_3, pAd->CommonCfg.ETxBfTimeout);\n\t}\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t{\n\t\tWLAN_FUN_CTRL_STRUC     WlanFunCtrl = {.word = 0};\n\t\tRTMP_MAC_PWRSV_EN(pAd, TRUE, TRUE);\t\n\t\t//\n\t\t// Too much time for reading efuse(enter/exit L1), and our device will hang up\n\t\t// Enable L1\n\t\t//\n\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\t\tif (WlanFunCtrl.field.WLAN_EN == TRUE)\n\t\t{\n\t\t\tWlanFunCtrl.field.PCIE_APP0_CLK_REQ = FALSE;\n\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t}\n\t}\n#endif /* RT3290 */\n\n\tDBGPRINT_S(Status, (\"<==== rt28xx_init, Status=%x\\n\", Status));\n\n\treturn TRUE;\n\n/*err7:\n\tAPStop(pAd);*/\nerr6:\n\n#ifdef IGMP_SNOOP_SUPPORT\n\tMultiCastFilterTableReset(&pAd->pMulticastFilterTable);\n#endif /* IGMP_SNOOP_SUPPORT */\n\n\tMeasureReqTabExit(pAd);\n\tTpcReqTabExit(pAd);\nerr5:\t\n\tRtmpNetTaskExit(pAd);\n\tUserCfgExit(pAd);\nerr4:\t\n\tMlmeHalt(pAd);\n\t//RTMP_TimerListRelease(pAd);\n\tRTMP_AllTimerListRelease(pAd);\nerr3:\t\n\tRtmpMgmtTaskExit(pAd);\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\tNdisFreeSpinLock(&pAd->TimerQLock);\n#endif /* RTMP_TIMER_TASK_SUPPORT */\nerr2:\n#ifdef RESOURCE_PRE_ALLOC\n\tRTMPResetTxRxRingMemory(pAd);\n#else\n\tRTMPFreeTxRxRingMemory(pAd);\n#endif /* RESOURCE_PRE_ALLOC */\n\nerr1:\n\n#ifdef RLT_MAC\n\tMCUCtrlExit(pAd);\n#endif /* RLT_MAC */\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* Free BssTab & ChannelInfo tabbles.*/\n\tAutoChBssTableDestroy(pAd);\n\tChannelInfoDestroy(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t\tRTMPEnableWlan(pAd, FALSE, FALSE);\n#endif /* RT3290 */\n\n#ifdef DOT11_N_SUPPORT\n\tif(pAd->mpdu_blk_pool.mem)\n\t\tos_free_mem(pAd, pAd->mpdu_blk_pool.mem); /* free BA pool*/\n#endif /* DOT11_N_SUPPORT */\n\n\t/* shall not set priv to NULL here because the priv didn't been free yet.*/\n\t/*net_dev->priv = 0;*/\n#ifdef INF_AMAZON_SE\nerr0:\n#endif /* INF_AMAZON_SE */\n#ifdef ST\nerr0:\n#endif /* ST */\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! rt28xx init fail !!!\\n\"));\n\treturn FALSE;\n}\n\n\nVOID RTMPDrvOpen(\n\tIN VOID\t\t\t*pAdSrc)\n{\n\tPRTMP_ADAPTER\tpAd = (PRTMP_ADAPTER)pAdSrc;\n\n\tRTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP);\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef FPGA_MODE\n#ifdef CUSTOMER_DEMO\n\tset_fpga_mode(pAd, \"6\");\n#endif /* CUSTOMER_DEMO */\n#endif /* FPGA_MODE */\n\n\t/* Enable Interrupt*/\n\tRTMP_IRQ_ENABLE(pAd);\n\n\t/* Now Enable RxTx*/\n\tRTMPEnableRxTx(pAd);\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP);\n\n\t{\n\tUINT32 reg = 0;\n\tRTMP_IO_READ32(pAd, 0x1300, &reg);  /* clear garbage interrupts*/\n\tprintk(\"0x1300 = %08x\\n\", reg);\n\t}\n\n\t{\n/*\tu32 reg;*/\n/*\tUINT8  byte;*/\n/*\tu16 tmp;*/\n\n/*\tRTMP_IO_READ32(pAd, XIFS_TIME_CFG, &reg);*/\n\n/*\ttmp = 0x0805;*/\n/*\treg  = (reg & 0xffff0000) | tmp;*/\n/*\tRTMP_IO_WRITE32(pAd, XIFS_TIME_CFG, reg);*/\n\n\t}\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PCIE_PS_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n        RTMPInitPCIeLinkCtrlValue(pAd);\n#endif /* PCIE_PS_SUPPORT */\n\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef BG_FT_SUPPORT\n\tBG_FTPH_Init();\n#endif /* BG_FT_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n//+++Add by shiang for debug\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s(1):Check if PDMA is idle!\\n\", __FUNCTION__));\n\tAsicWaitPDMAIdle(pAd, 5, 10);\n//---Add by shiang for debug\n\n#ifdef CONFIG_STA_SUPPORT\n\t/*\n\t\tTo reduce connection time, \n\t\tdo auto reconnect here instead of waiting STAMlmePeriodicExec to do auto reconnect.\n\t*/\n\tif (pAd->OpMode == OPMODE_STA)\n\t\tMlmeAutoReconnectLastSSID(pAd);\n#endif /* CONFIG_STA_SUPPORT */\n//+++Add by shiang for debug\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s(2):Check if PDMA is idle!\\n\", __FUNCTION__));\n\tAsicWaitPDMAIdle(pAd, 5, 10);\n//---Add by shiang for debug\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#ifdef CONFIG_AP_SUPPORT\n\tif ((pAd->OpMode == OPMODE_AP)\n#ifdef P2P_SUPPORT\n\t\t/* P2P will use ApCfg.MBSSID and ApCfg.ApCliTab also. */\n\t\t|| TRUE\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\tINT index;\n\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t{\n#ifdef HOSTAPD_SUPPORT\n\t\t\tif (pAd->ApCfg.MBSSID[index].Hostapd == TRUE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPS is control by hostapd now.\\n\"));\n\t\t\t}\n\t\t\telse\n#endif /*HOSTAPD_SUPPORT*/\n\t\t\t{\n\t\t\t\tPWSC_CTRL pWscControl;\n\t\t\t\tUCHAR zeros16[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n\t\t\t\t\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[index].WscControl;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Generate UUID for apidx(%d)\\n\", index));\n\t\t\t\tif (NdisEqualMemory(&pWscControl->Wsc_Uuid_E[0], zeros16, UUID_LEN_HEX))\n\t\t\t\t\tWscGenerateUUID(pAd, &pWscControl->Wsc_Uuid_E[0], &pWscControl->Wsc_Uuid_Str[0], index, FALSE);\n\t\t\t\tWscInit(pAd, FALSE, index);\n\t\t\t}\n\t\t}\n\n#ifdef APCLI_SUPPORT\n\t\tfor(index = 0; index < MAX_APCLI_NUM; index++)\n\t\t{\n\t\t\tPWSC_CTRL pWpsCtrl = &pAd->ApCfg.ApCliTab[index].WscControl;\n\t\t\t\n\t\t\tpWpsCtrl->pAd = pAd;        \n\t\t\tNdisZeroMemory(pWpsCtrl->EntryAddr, MAC_ADDR_LEN);\n\t\t\tpWpsCtrl->WscConfigMethods= 0x018C;\n\t\t\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WSC_INIT, 0, (VOID *)&pAd->ApCfg.ApCliTab[index], index);\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tPWSC_CTRL pWscControl = &pAd->StaCfg.WscControl;\n\t\t\n\t\tWscGenerateUUID(pAd, &pWscControl->Wsc_Uuid_E[0], &pWscControl->Wsc_Uuid_Str[0], 0, FALSE);\n\t\tWscInit(pAd, FALSE, BSS0);\n#ifdef WSC_V2_SUPPORT\n\t\tWscInitRegistrarPair(pAd, &pAd->StaCfg.WscControl, BSS0);\n#endif /* WSC_V2_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* WSC hardware push button function 0811 */\n\tWSC_HDR_BTN_Init(pAd);\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tMultiChannelThreadInit(pAd);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n}\n\n\nVOID RTMPDrvClose(\n\tIN VOID\t\t\t\t*pAdSrc,\n\tIN VOID\t\t\t\t*net_dev)\n{\n\tPRTMP_ADAPTER\tpAd = (PRTMP_ADAPTER)pAdSrc;\n\tBOOLEAN \t\tCancelled;\n\tUINT32\t\t\ti = 0;\n\n\n\tCancelled = FALSE;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CREDENTIAL_STORE\n\t\tif (pAd->IndicateMediaState == NdisMediaStateConnected)\n\t\t{\t\n\t\t\tStoreConnectInfo(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_SEM_LOCK(&pAd->StaCtIf.Lock);\n\t\t\tpAd->StaCtIf.Changeable = FALSE;\n\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCtIf.Lock);\n\t\t}\n#endif /* CREDENTIAL_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef BG_FT_SUPPORT\n\tBG_FTPH_Remove();\n#endif /* BG_FT_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef PCIE_PS_SUPPORT\n\t\tRTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_CLOSE);\n#endif /* PCIE_PS_SUPPORT */\n\n\t\t/* If dirver doesn't wake up firmware here,*/\n\t\t/* NICLoadFirmware will hang forever when interface is up again.*/\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n        {      \n\t\t    AsicForceWakeup(pAd, TRUE);\n        }\n\n#ifdef RTMP_MAC_USB\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);\n#endif /* RTMP_MAC_USB */\n\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#if ((defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)) && defined(WOW_IFDOWN_SUPPORT)\n\tif (pAd->WOW_Cfg.bEnable == FALSE)\n#endif /* ((defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)) && defined(WOW_IFDOWN_SUPPORT) */\n\t{\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tif (pAd->CommonCfg.pChDesp != NULL)\n\t\tos_free_mem(NULL, pAd->CommonCfg.pChDesp);\n\tpAd->CommonCfg.pChDesp = NULL;\n\tpAd->CommonCfg.DfsType = MAX_RD_REGION;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\tpAd->CommonCfg.bCountryFlag = FALSE;\n\n\n\n\n\tfor (i = 0 ; i < NUM_OF_TX_RING; i++)\n\t{\n\t\twhile (pAd->DeQueueRunning[i] == TRUE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Waiting for TxQueue[%d] done..........\\n\", i));\n\t\t\tRTMPusecDelay(1000);\n\t\t}\n\t}\n\t\n#ifdef RTMP_MAC_USB\n\tRtmpOsUsbEmptyUrbCheck(&pAd->wait, &pAd->BulkInLock, &pAd->PendingRx);\n\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_AP_SUPPORT\n\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef RTMP_MAC_USB\n\t\tRTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);\n#endif /* RTMP_MAC_USB */\n\n#ifdef DOT11N_DRAFT3\n\t\tif (pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_TIMER_FIRED)\n\t\t{\n\t\t\tRTMPCancelTimer(&pAd->CommonCfg.Bss2040CoexistTimer, &Cancelled);\n\t\t\tpAd->CommonCfg.Bss2040CoexistFlag  = 0;\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n\n\t\t/* PeriodicTimer already been canceled by MlmeHalt() API.*/\n\t\t/*RTMPCancelTimer(&pAd->PeriodicTimer,\t&Cancelled);*/\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* Stop Mlme state machine*/\n\tMlmeHalt(pAd);\n\t\n\t/* Close net tasklets*/\n\tRtmpNetTaskExit(pAd);\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tMacTableReset(pAd);\n#ifdef MAT_SUPPORT\n\t\tMATEngineExit(pAd);\n#endif /* MAT_SUPPORT */\n#if ((defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)) && defined(WOW_IFDOWN_SUPPORT)\n\t\tif (pAd->WOW_Cfg.bEnable == TRUE)\n\t\t\tASIC_WOW_ENABLE(pAd);\n\t\telse\n#endif /* ((defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)) && defined(WOW_IFDOWN_SUPPORT) */\n\t\t\tMlmeRadioOff(pAd);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef MAT_SUPPORT\n\t\tMATEngineExit(pAd);\n#endif /* MAT_SUPPORT */\n\n#ifdef CLIENT_WDS\n\t\tCliWds_ProxyTabDestory(pAd);\n#endif /* CLIENT_WDS */\n\t\t/* Shutdown Access Point function, release all related resources */\n\t\tAPShutdown(pAd);\n\n/*#ifdef AUTO_CH_SELECT_ENHANCE*/\n\t\t/* Free BssTab & ChannelInfo tabbles.*/\n/*\t\tAutoChBssTableDestroy(pAd); */\n/*\t\tChannelInfoDestroy(pAd); */\n/*#endif  AUTO_CH_SELECT_ENHANCE */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\tMeasureReqTabExit(pAd);\n\tTpcReqTabExit(pAd);\n\n#ifdef LED_CONTROL_SUPPORT\n\tRTMPExitLEDMode(pAd);\n#endif // LED_CONTROL_SUPPORT\n\n\t/* Close kernel threads*/\n\tRtmpMgmtTaskExit(pAd);\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\t/* must after RtmpMgmtTaskExit(); Or pAd->pChannelInfo will be NULL */\n\t\t/* Free BssTab & ChannelInfo tabbles.*/\n\t\tAutoChBssTableDestroy(pAd);\n\t\tChannelInfoDestroy(pAd);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef RLT_MAC\n\tMCUCtrlExit(pAd);\n#endif /* RLT_MAC */\n\n\t/* Free IRQ*/\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);\n\t}\n\n#ifdef SINGLE_SKU_V2\n\t{\n\t\tCH_POWER *ch, *ch_temp;\n\t\tDlListForEachSafe(ch, ch_temp, &pAd->SingleSkuPwrList, CH_POWER, List)\n\t\t{\n\t\t\tDlListDel(&ch->List);\n\t\t\tos_free_mem(NULL, ch->Channel);\n\t\t\tos_free_mem(NULL, ch);\n\t\t}\n\t}\n#endif /* SINGLE_SKU_V2 */\n\n\t/* Free Ring or USB buffers*/\n#ifdef RESOURCE_PRE_ALLOC\n\tRTMPResetTxRxRingMemory(pAd);\n#else\n\t/* Free Ring or USB buffers*/\n\tRTMPFreeTxRxRingMemory(pAd);\n#endif /* RESOURCE_PRE_ALLOC */\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\n#ifdef WLAN_SKB_RECYCLE\n\tskb_queue_purge(&pAd->rx0_recycle);\n#endif /* WLAN_SKB_RECYCLE */\n\n#ifdef DOT11_N_SUPPORT\n\t/* Free BA reorder resource*/\n\tba_reordering_resource_release(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\tUserCfgExit(pAd); /* must after ba_reordering_resource_release */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP);\n\n/*+++Modify by woody to solve the bulk fail+++*/\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tTDLS_Table_Destory(pAd);\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\tTDLS_ClearEntryList(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList);\n\t\tNdisFreeSpinLock(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\tTDLS_ClearEntryList(&pAd->StaCfg.TdlsInfo.TdlsBlackList);\n\t\tNdisFreeSpinLock(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n#endif /* TDLS_AUTOLINK_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* clear MAC table */\n\t/* TODO: do not clear spin lock, such as fLastChangeAccordingMfbLock */\n\tNdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));\n\n\t/* release all timers */\n\tRTMPusecDelay(2000);\n\t//RTMP_TimerListRelease(pAd);\n\tRTMP_AllTimerListRelease(pAd);\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tMultiChannelThreadExit(pAd);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\tNdisFreeSpinLock(&pAd->TimerQLock);\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n}\n\n\nVOID RTMPInfClose(\n\tIN VOID\t\t\t\t*pAdSrc)\n{\n\tPRTMP_ADAPTER\tpAd = (PRTMP_ADAPTER)pAdSrc;\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = FALSE;\n\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\t/* kick out all STAs behind the bss.*/\n\t\tMbssKickOutStas(pAd, MAIN_MBSSID, REASON_DISASSOC_INACTIVE);\n\t}\n\n\tAPMakeAllBssBeacon(pAd);\n\tAPUpdateAllBeaconFrame(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef PROFILE_STORE\n\t\tWriteDatThread(pAd);\n\t\tRTMPusecDelay(1000);\n#endif /* PROFILE_STORE */\n#ifdef QOS_DLS_SUPPORT\n\t\t/* send DLS-TEAR_DOWN message, */\n\t\tif (pAd->CommonCfg.bDLSCapable)\n\t\t{\n\t\t\tUCHAR i;\n\n\t\t\t/* tear down local dls table entry*/\n\t\t\tfor (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++)\n\t\t\t{\n\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))\n\t\t\t\t{\n\t\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status\t= DLS_NONE;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid\t= FALSE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* tear down peer dls table entry*/\n\t\t\tfor (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++)\n\t\t\t{\n\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))\n\t\t\t\t{\n\t\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid\t= FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n#endif /* QOS_DLS_SUPPORT */\n\n\t\tif (INFRA_ON(pAd) &&\n#if ((defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)) && defined(WOW_IFDOWN_SUPPORT)\n\t/* In WOW state, can't issue disassociation reqeust */\n\t\t\tpAd->WOW_Cfg.bEnable == FALSE &&\n#endif /* ((defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)) && defined(WOW_IFDOWN_SUPPORT) */\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t{\n\t\t\tMLME_DISASSOC_REQ_STRUCT\tDisReq;\n\t\t\tMLME_QUEUE_ELEM *MsgElem;/* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/\n    \n\t\t\tos_alloc_mem(NULL, (UCHAR **)&MsgElem, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif (MsgElem)\n\t\t\t{\n\t\t\tCOPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid);\n\t\t\tDisReq.Reason =  REASON_DEAUTH_STA_LEAVING;\n\n\t\t\tMsgElem->Machine = ASSOC_STATE_MACHINE;\n\t\t\tMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;\n\t\t\tMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);\n\t\t\tNdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));\n\n\t\t\t/* Prevent to connect AP again in STAMlmePeriodicExec*/\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;\n\t\t\tMlmeDisassocReqAction(pAd, MsgElem);\n/*\t\t\tkfree(MsgElem);*/\n\t\t\tos_free_mem(NULL, MsgElem);\n\t\t\t}\n\t\t\t\n\t\t\tRTMPusecDelay(1000);\n\t\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t/* send wireless event to wpa_supplicant for infroming interface down.*/\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, RT_INTERFACE_DOWN, NULL, NULL, 0);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\t\tif (pAd->StaCfg.pWpsProbeReqIe)\n\t\t{\n/*\t\t\tkfree(pAd->StaCfg.pWpsProbeReqIe);*/\n\t\t\tos_free_mem(NULL, pAd->StaCfg.pWpsProbeReqIe);\n\t\t\tpAd->StaCfg.pWpsProbeReqIe = NULL;\n\t\t\tpAd->StaCfg.WpsProbeReqIeLen = 0;\n\t\t}\n\n\t\tif (pAd->StaCfg.pWpaAssocIe)\n\t\t{\n/*\t\t\tkfree(pAd->StaCfg.pWpaAssocIe);*/\n\t\t\tos_free_mem(NULL, pAd->StaCfg.pWpaAssocIe);\n\t\t\tpAd->StaCfg.pWpaAssocIe = NULL;\n\t\t\tpAd->StaCfg.WpaAssocIeLen = 0;\n\t\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n}\n\n\n\n\nPNET_DEV RtmpPhyNetDevMainCreate(\n\tIN VOID\t\t\t\t*pAdSrc)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPNET_DEV pDevNew;\n\tUINT32 MC_RowID = 0, IoctlIF = 0;\n\n\n\tpAd = pAd;\n\n#ifdef MULTIPLE_CARD_SUPPORT\n\tMC_RowID = pAd->MC_RowID;\n#endif /* MULTIPLE_CARD_SUPPORT */\n#ifdef HOSTAPD_SUPPORT\n\tIoctlIF = pAd->IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n\n\tpDevNew = RtmpOSNetDevCreate((INT32)MC_RowID, (UINT32 *)&IoctlIF,\n\t\t\t\t\tINT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME);\n\n#ifdef HOSTAPD_SUPPORT\n\tpAd->IoctlIF = IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n\n\treturn pDevNew;\n}\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PROFILE_STORE\nstatic void\tWriteConfToDatFile(\n    IN  PRTMP_ADAPTER pAd)\n{\n\tchar\t*cfgData = 0;\n\tPSTRING\t\t\tfileName = NULL;\n\tRTMP_OS_FD\t\tfile_r, file_w;\n\tRTMP_OS_FS_INFO\t\tosFSInfo;\n\tLONG\t\t\trv, fileLen = 0;\n\tchar\t\t\t*offset = 0;\n\tPSTRING\t\t\tpTempStr = 0;\n//\tINT\t\t\t\ttempStrLen = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WriteConfToDatFile\\n\"));\n\n\t\tfileName = STA_PROFILE_PATH;\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tfile_r = RtmpOSFileOpen(fileName, O_RDONLY, 0);\n\tif (IS_FILE_OPEN_ERR(file_r)) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"-->1) %s: Error opening file %s\\n\", __FUNCTION__, fileName));\n\t\treturn;\n\t}\n\telse \n\t{\n\t\tchar tempStr[64] = {0};\n\t\twhile((rv = RtmpOSFileRead(file_r, tempStr, 64)) > 0)\n\t\t{\n\t\t\tfileLen += rv;\n\t\t}\n\t\tos_alloc_mem(NULL, (UCHAR **)&cfgData, fileLen);\n\t\tif (cfgData == NULL)\n\t\t{\n\t\t\tRtmpOSFileClose(file_r);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CfgData kmalloc fail. (fileLen = %ld)\\n\", fileLen));\n\t\t\tgoto out;\n\t\t}\n\t\tNdisZeroMemory(cfgData, fileLen);\n\t\tRtmpOSFileSeek(file_r, 0);\n\t\trv = RtmpOSFileRead(file_r, (PSTRING)cfgData, fileLen);\n\t\tRtmpOSFileClose(file_r);\n\t\tif (rv != fileLen)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CfgData kmalloc fail, fileLen = %ld\\n\", fileLen));\n\t\t\tgoto ReadErr;\n\t\t}\n\t}\n\n\tfile_w = RtmpOSFileOpen(fileName, O_WRONLY|O_TRUNC, 0);\n\tif (IS_FILE_OPEN_ERR(file_w)) \n\t{\n\t\tgoto WriteFileOpenErr;\n\t}\n\telse \n\t{\n\t\toffset = (PCHAR) rtstrstr((PSTRING) cfgData, \"Default\\n\");\n\t\toffset += strlen(\"Default\\n\");\n\t\tRtmpOSFileWrite(file_w, (PSTRING)cfgData, (int)(offset-cfgData));\n\t\tos_alloc_mem(NULL, (UCHAR **)&pTempStr, 512);\n\t\tif (!pTempStr)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pTempStr kmalloc fail. (512)\\n\"));\n\t\t\tRtmpOSFileClose(file_w);\n\t\t\tgoto WriteErr;\n\t\t}\n\t\t\t\n\t\tfor (;;)\n\t\t{\n\t\t\tint i = 0;\n\t\t\tPSTRING ptr;\n\n\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\tptr = (PSTRING) offset;\n\t\t\twhile(*ptr && *ptr != '\\n')\n\t\t\t{\n\t\t\t\tpTempStr[i++] = *ptr++;\n\t\t\t}\n\t\t\tpTempStr[i] = 0x00;\n\t\t\tif ((size_t)(offset - cfgData) < fileLen)\n\t\t\t{\n\t\t\t\toffset += strlen(pTempStr) + 1;\n\t\t\t\tif (strncmp(pTempStr, \"SSID=\", strlen(\"SSID=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tNdisMoveMemory(pTempStr, \"SSID=\", strlen(\"SSID=\"));\n\t\t\t\t\tNdisMoveMemory(pTempStr + 5, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\t\t\t}\n\t\t\t\telse if (strncmp(pTempStr, \"AuthMode=\", strlen(\"AuthMode=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=OPEN\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=SHARED\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=WEPAUTO\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=WPAPSK\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=WPA2PSK\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=WPA\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=WPA2\");\n\t\t\t\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n\t\t\t\t\t\tsprintf(pTempStr, \"AuthMode=WPANONE\");\n\t\t\t\t}\n\t\t\t\telse if (strncmp(pTempStr, \"EncrypType=\", strlen(\"EncrypType=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tif (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled)\n\t\t\t\t\t\tsprintf(pTempStr, \"EncrypType=NONE\");\n\t\t\t\t\telse if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)\n\t\t\t\t\t\tsprintf(pTempStr, \"EncrypType=WEP\");\n\t\t\t\t\telse if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t\t\tsprintf(pTempStr, \"EncrypType=TKIP\");\n\t\t\t\t\telse if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t\t\tsprintf(pTempStr, \"EncrypType=AES\");\n\t\t\t\t}\n\t\t\t\tRtmpOSFileWrite(file_w, pTempStr, strlen(pTempStr));\n\t\t\t\tRtmpOSFileWrite(file_w, \"\\n\", 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tRtmpOSFileClose(file_w);\n\t}\n\nWriteErr:   \n\tif (pTempStr)\n/*\t\tkfree(pTempStr); */\n\t\tos_free_mem(NULL, pTempStr);\nReadErr:\nWriteFileOpenErr:    \n\tif (cfgData)\n/*\t\tkfree(cfgData); */\n\t\tos_free_mem(NULL, cfgData);\nout:\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WriteConfToDatFile\\n\"));\n\treturn;\n}\n\n\nINT write_dat_file_thread (\n    IN ULONG Context)\n{\n\tRTMP_OS_TASK *pTask;\n\tRTMP_ADAPTER *pAd;\n\t//int \tStatus = 0;\n\n\tpTask = (RTMP_OS_TASK *)Context;\n\n\tif (pTask == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pTask is NULL\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\t\n\tpAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);\n\n\tif (pAd == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pAd is NULL\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\n\tRtmpOSTaskCustomize(pTask);\n\n\t/* Update ssid, auth mode and encr type to DAT file */\n\tWriteConfToDatFile(pAd);\n\t\n\t\tRtmpOSTaskNotifyToExit(pTask);\n\t\n\treturn 0;\n}\n\nNDIS_STATUS WriteDatThread(\n\tIN  RTMP_ADAPTER *pAd)\n{\n\tNDIS_STATUS status = NDIS_STATUS_FAILURE;\n\tRTMP_OS_TASK *pTask;\n\n\tif (pAd->bWriteDat == FALSE)\n\t\treturn 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-->WriteDatThreadInit()\\n\"));\n\n\tpTask = &pAd->WriteDatTask;\n\n\tRTMP_OS_TASK_INIT(pTask, \"RtmpWriteDatTask\", pAd);\n\tstatus = RtmpOSTaskAttach(pTask, write_dat_file_thread, (ULONG)&pAd->WriteDatTask);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--WriteDatThreadInit(), status=%d!\\n\", status));\n\n\treturn status;\n}\n#endif /* PROFILE_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\n"
  },
  {
    "path": "src/common/rtmp_timer.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2008, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source code is an unpublished work and\tthe\n * use of a copyright notice does not imply\totherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering,\tdecoding, reverse engineering or in any\n * way altering the\tsource code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    rtmp_timer.c\n\n    Abstract:\n    task for timer handling\n\n    Revision History:\n    Who         When            What\n    --------    ----------      ----------------------------------------------\n    Name          Date            Modification logs\n    Shiang Tu\t08-28-2008   init version\n    \n*/\n\n#include \"rt_config.h\"\n\n\nBUILD_TIMER_FUNCTION(MlmePeriodicExec);\n/*BUILD_TIMER_FUNCTION(MlmeRssiReportExec);*/\nBUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);\nBUILD_TIMER_FUNCTION(APSDPeriodicExec);\nBUILD_TIMER_FUNCTION(EnqueueStartForPSKExec);\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\nBUILD_TIMER_FUNCTION(Adhoc_WpaRetryExec);\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n#ifdef CONFIG_MULTI_CHANNEL\nBUILD_TIMER_FUNCTION(MCC_ChangeAction);\nBUILD_TIMER_FUNCTION(ConcurrentP2PConnectTimeout);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n#ifdef RTMP_MAC_USB\nBUILD_TIMER_FUNCTION(BeaconUpdateExec);\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_AP_SUPPORT\nextern VOID APDetectOverlappingExec(\n\t\t\t\tIN PVOID SystemSpecific1, \n\t\t\t\tIN PVOID FunctionContext, \n\t\t\t\tIN PVOID SystemSpecific2, \n\t\t\t\tIN PVOID SystemSpecific3);\n\nBUILD_TIMER_FUNCTION(APDetectOverlappingExec);\n\n#ifdef DOT11N_DRAFT3\nBUILD_TIMER_FUNCTION(Bss2040CoexistTimeOut);\n#endif /* DOT11N_DRAFT3 */\n\nBUILD_TIMER_FUNCTION(GREKEYPeriodicExec);\nBUILD_TIMER_FUNCTION(CMTimerExec);\nBUILD_TIMER_FUNCTION(WPARetryExec);\n#ifdef AP_SCAN_SUPPORT\nBUILD_TIMER_FUNCTION(APScanTimeout);\n#endif /* AP_SCAN_SUPPORT */\nBUILD_TIMER_FUNCTION(APQuickResponeForRateUpExec);\n#ifdef IDS_SUPPORT\nBUILD_TIMER_FUNCTION(RTMPIdsPeriodicExec);\n#endif /* IDS_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nBUILD_TIMER_FUNCTION(BeaconTimeout);\nBUILD_TIMER_FUNCTION(ScanTimeout);\nBUILD_TIMER_FUNCTION(AuthTimeout);\nBUILD_TIMER_FUNCTION(AssocTimeout);\nBUILD_TIMER_FUNCTION(ReassocTimeout);\nBUILD_TIMER_FUNCTION(DisassocTimeout);\nBUILD_TIMER_FUNCTION(LinkDownExec);\nBUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);\nBUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);\n#ifdef PCIE_PS_SUPPORT\nBUILD_TIMER_FUNCTION(PsPollWakeExec);\nBUILD_TIMER_FUNCTION(RadioOnExec);\n#endif /* PCIE_PS_SUPPORT */\n#ifdef QOS_DLS_SUPPORT\nBUILD_TIMER_FUNCTION(DlsTimeoutAction);\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\nBUILD_TIMER_FUNCTION(TDLS_TimeoutAction);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n#ifdef RTMP_MAC_USB\nBUILD_TIMER_FUNCTION(RtmpUsbStaAsicForceWakeupTimeout);\n#endif /* RTMP_MAC_USB */\n\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef WSC_INCLUDED\nBUILD_TIMER_FUNCTION(WscEAPOLTimeOutAction);\nBUILD_TIMER_FUNCTION(Wsc2MinsTimeOutAction);\nBUILD_TIMER_FUNCTION(WscUPnPMsgTimeOutAction);\nBUILD_TIMER_FUNCTION(WscM2DTimeOutAction);\n\nBUILD_TIMER_FUNCTION(WscPBCTimeOutAction);\nBUILD_TIMER_FUNCTION(WscScanTimeOutAction);\nBUILD_TIMER_FUNCTION(WscProfileRetryTimeout);\n#ifdef WSC_LED_SUPPORT\nBUILD_TIMER_FUNCTION(WscLEDTimer);\nBUILD_TIMER_FUNCTION(WscSkipTurnOffLEDTimer);\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nBUILD_TIMER_FUNCTION(WscUpdatePortCfgTimeout);\n#ifdef WSC_V2_SUPPORT\nBUILD_TIMER_FUNCTION(WscSetupLockTimeout);\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef IWSC_SUPPORT\nBUILD_TIMER_FUNCTION(IWSC_T1TimerAction);\nBUILD_TIMER_FUNCTION(IWSC_T2TimerAction);\nBUILD_TIMER_FUNCTION(IWSC_EntryTimerAction);\nBUILD_TIMER_FUNCTION(IWSC_DevQueryAction);\n#endif /* IWSC_SUPPORT */\n\n#endif /* WSC_INCLUDED */\n\n\n\n#ifdef TXBF_SUPPORT\nBUILD_TIMER_FUNCTION(eTxBfProbeTimerExec);\n#endif /* TXBF_SUPPORT */\n\n#ifdef P2P_SUPPORT\nBUILD_TIMER_FUNCTION(P2PCTWindowTimer);\nBUILD_TIMER_FUNCTION(P2pSwNoATimeOut);\nBUILD_TIMER_FUNCTION(P2pPreAbsenTimeOut);\nBUILD_TIMER_FUNCTION(P2pWscTimeOut);\nBUILD_TIMER_FUNCTION(P2pReSendTimeOut);\nBUILD_TIMER_FUNCTION(P2pCliReConnectTimeOut);\n#endif /* P2P_SUPPORT */\n\n#ifdef RALINK_ATE\nBUILD_TIMER_FUNCTION(ATEPeriodicExec);\n#endif /* RALINK_ATE */\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\nstatic void RtmpTimerQHandle(RTMP_ADAPTER *pAd)\n{\n/*#ifndef KTHREAD_SUPPORT*/\n\tint status;\n/*#endif*/\n\tRALINK_TIMER_STRUCT\t*pTimer;\n\tRTMP_TIMER_TASK_ENTRY\t*pEntry;\n\tunsigned long\tirqFlag;\n\tRTMP_OS_TASK *pTask;\n\n\n\tpTask = &pAd->timerTask;\n\twhile(!RTMP_OS_TASK_IS_KILLED(pTask))\n\t{\n\t\tpTimer = NULL;\n\n\t\tif (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pAd->TimerQ.status == RTMP_TASK_STAT_STOPED)\n\t\t\tbreak;\n\t\t\n\t\t/* event happened.*/\n\t\twhile(pAd->TimerQ.pQHead)\n\t\t{\n\t\t\tRTMP_INT_LOCK(&pAd->TimerQLock, irqFlag);\n\t\t\tpEntry = pAd->TimerQ.pQHead;\n\t\t\tif (pEntry)\n\t\t\t{\n\t\t\t\tpTimer = pEntry->pRaTimer;\n\n\t\t\t\t/* update pQHead*/\n\t\t\t\tpAd->TimerQ.pQHead = pEntry->pNext;\n\t\t\t\tif (pEntry == pAd->TimerQ.pQTail)\n\t\t\t\t\tpAd->TimerQ.pQTail = NULL;\n\t\t\t\n\t\t\t\t/* return this queue entry to timerQFreeList.*/\n\t\t\t\tpEntry->pNext = pAd->TimerQ.pQPollFreeList;\n\t\t\t\tpAd->TimerQ.pQPollFreeList = pEntry;\n\t\t\t}\n\t\t\tRTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlag);\n\n\t\t\tif (pTimer)\n\t\t\t{\n\t\t\t\tif ((pTimer->handle != NULL) && (!pAd->PM_FlgSuspend))\n\t\t\t\t\tpTimer->handle(NULL, (PVOID) pTimer->cookie, NULL, pTimer);\n\t\t\t\tif ((pTimer->Repeat) && (pTimer->State == FALSE))\n\t\t\t\t\tRTMP_OS_Add_Timer(&pTimer->TimerObj, pTimer->TimerValue);\n\t\t\t}\n\t\t}\n\t\t\n/*#ifndef KTHREAD_SUPPORT*/\n\t\tif (status != 0)\n\t\t{\n\t\t\tpAd->TimerQ.status = RTMP_TASK_STAT_STOPED;\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t\t\tbreak;\n\t\t}\n/*#endif*/\n\t}\n}\n\n\nINT RtmpTimerQThread(\n\tIN ULONG Context)\n{\n\tRTMP_OS_TASK\t*pTask;\n\tPRTMP_ADAPTER\tpAd = NULL;\n\n\n\tpTask = (RTMP_OS_TASK *)Context;\n\tpAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);\n\n\tif (pAd == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,( \"%s:: pAd is NULL!\\n\",__FUNCTION__));\n\t\treturn 0;\n\t}\t\n\n\tRtmpOSTaskCustomize(pTask);\n\n\tRtmpTimerQHandle(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE,( \"<---%s\\n\",__FUNCTION__));\n\t/* notify the exit routine that we're actually exiting now \n\t *\n\t * complete()/wait_for_completion() is similar to up()/down(),\n\t * except that complete() is safe in the case where the structure\n\t * is getting deleted in a parallel mode of execution (i.e. just\n\t * after the down() -- that's necessary for the thread-shutdown\n\t * case.\n\t *\n\t * complete_and_exit() goes even further than this -- it is safe in\n\t * the case that the thread of the caller is going away (not just\n\t * the structure) -- this is necessary for the module-remove case.\n\t * This is important in preemption kernels, which transfer the flow\n\t * of execution immediately upon a complete().\n\t */\n\tRtmpOSTaskNotifyToExit(pTask);\n\t\n\treturn 0;\n\n}\n\n\nRTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RALINK_TIMER_STRUCT *pTimer)\n{\n\tRTMP_TIMER_TASK_ENTRY *pQNode = NULL, *pQTail;\n\tunsigned long irqFlags;\n\tRTMP_OS_TASK\t*pTask = &pAd->timerTask;\n\n\tRTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);\n\tif (pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)\n\t{\n\t\tif(pAd->TimerQ.pQPollFreeList)\n\t\t{\n\t\t\tpQNode = pAd->TimerQ.pQPollFreeList;\n\t\t\tpAd->TimerQ.pQPollFreeList = pQNode->pNext;\n\n\t\t\tpQNode->pRaTimer = pTimer;\n\t\t\tpQNode->pNext = NULL;\n\n\t\t\tpQTail = pAd->TimerQ.pQTail;\n\t\t\tif (pAd->TimerQ.pQTail != NULL)\n\t\t\t\tpQTail->pNext = pQNode;\n\t\t\tpAd->TimerQ.pQTail = pQNode;\n\t\t\tif (pAd->TimerQ.pQHead == NULL)\n\t\t\t\tpAd->TimerQ.pQHead = pQNode;\n\t\t}\n\t}\n\tRTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);\n\n\tif (pQNode)\n\t{\n\t\tRTMP_OS_TASK_WAKE_UP(pTask);\n\t}\n\n\treturn pQNode;\n}\n\n\nBOOLEAN RtmpTimerQRemove(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RALINK_TIMER_STRUCT *pTimer)\n{\n\tRTMP_TIMER_TASK_ENTRY *pNode, *pPrev = NULL;\n\tunsigned long irqFlags;\n\n\tRTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);\n\tif (pAd->TimerQ.status >= RTMP_TASK_STAT_INITED)\n\t{\n\t\tpNode = pAd->TimerQ.pQHead;\n\t\twhile (pNode)\n\t\t{\n\t\t\tif (pNode->pRaTimer == pTimer)\n\t\t\t\tbreak;\n\t\t\tpPrev = pNode;\n\t\t\tpNode = pNode->pNext;\n\t\t}\n\n\t\t/* Now move it to freeList queue.*/\n\t\tif (pNode)\n\t\t{\t\n\t\t\tif (pNode == pAd->TimerQ.pQHead)\n\t\t\t\tpAd->TimerQ.pQHead = pNode->pNext;\n\t\t\tif (pNode == pAd->TimerQ.pQTail)\n\t\t\t\tpAd->TimerQ.pQTail = pPrev;\n\t\t\tif (pPrev != NULL)\n\t\t\t\tpPrev->pNext = pNode->pNext;\n\t\t\t\n\t\t\t/* return this queue entry to timerQFreeList.*/\n\t\t\tpNode->pNext = pAd->TimerQ.pQPollFreeList;\n\t\t\tpAd->TimerQ.pQPollFreeList = pNode;\n\t\t}\n\t}\n\tRTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);\n\t\t\t\n\treturn TRUE;\n}\n\n\nvoid RtmpTimerQExit(RTMP_ADAPTER *pAd)\n{\n\tRTMP_TIMER_TASK_ENTRY *pTimerQ;\n\tunsigned long irqFlags;\n\t\n\tRTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);\n\twhile (pAd->TimerQ.pQHead)\n\t{\n\t\tpTimerQ = pAd->TimerQ.pQHead;\n\t\tpAd->TimerQ.pQHead = pTimerQ->pNext;\n\t\t/* remove the timeQ*/\n\t}\n\tpAd->TimerQ.pQPollFreeList = NULL;\n\tos_free_mem(pAd, pAd->TimerQ.pTimerQPoll);\n\tpAd->TimerQ.pQTail = NULL;\n\tpAd->TimerQ.pQHead = NULL;\n/*#ifndef KTHREAD_SUPPORT*/\n\tpAd->TimerQ.status = RTMP_TASK_STAT_STOPED;\n/*#endif*/\n\tRTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);\n/*\tNdisFreeSpinLock(&pAd->TimerQLock); */\n}\n\n\nvoid RtmpTimerQInit(RTMP_ADAPTER *pAd)\n{\n\tint \ti;\n\tRTMP_TIMER_TASK_ENTRY *pQNode, *pEntry;\n\tunsigned long irqFlags;\n\t\n\tNdisAllocateSpinLock(pAd, &pAd->TimerQLock);\n\t\n\tNdisZeroMemory(&pAd->TimerQ, sizeof(pAd->TimerQ));\n\n\tos_alloc_mem(pAd, &pAd->TimerQ.pTimerQPoll, sizeof(RTMP_TIMER_TASK_ENTRY) * TIMER_QUEUE_SIZE_MAX);\n\tif (pAd->TimerQ.pTimerQPoll)\n\t{\n\t\tpEntry = NULL;\n\t\tpQNode = (RTMP_TIMER_TASK_ENTRY *)pAd->TimerQ.pTimerQPoll;\n\t\tNdisZeroMemory(pAd->TimerQ.pTimerQPoll, sizeof(RTMP_TIMER_TASK_ENTRY) * TIMER_QUEUE_SIZE_MAX);\n\n\t\tRTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);\n\t\tfor (i = 0 ;i <TIMER_QUEUE_SIZE_MAX; i++)\n\t\t{\n\t\t\tpQNode->pNext = pEntry;\n\t\t\tpEntry = pQNode;\n\t\t\tpQNode++;\n\t\t}\n\t\tpAd->TimerQ.pQPollFreeList = pEntry;\n\t\tpAd->TimerQ.pQHead = NULL;\n\t\tpAd->TimerQ.pQTail = NULL;\n\t\tpAd->TimerQ.status = RTMP_TASK_STAT_INITED;\n\t\tRTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);\n\t}\n}\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\n"
  },
  {
    "path": "src/common/rtusb_bulk.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtusb_bulk.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\tWhat\n\t--------\t----------\t----------------------------------------------\n\tName\t\tDate\t\tModification logs\n\tPaul Lin\t06-25-2004\tcreated\n\t\n*/\n\n#ifdef RTMP_MAC_USB\n\n\n#include\t\"rt_config.h\"\n/* Match total 6 bulkout endpoint to corresponding queue.*/\n\n#ifdef CONFIG_MULTI_CHANNEL\nUCHAR \tEpToQueue[6]={FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_HCCA, FIFO_MGMT};\n#else\nUCHAR\tEpToQueue[6]={FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_MGMT};\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\n\n#ifdef INF_AMAZON_SE\t\nUINT16 MaxBulkOutsSizeLimit[5][4] =\n{\n\t/* Priority high -> low*/\n\t{ 24576, 2048, 2048, 2048 },\t/* 0 AC\t*/\n\t{ 24576, 2048, 2048, 2048 },\t/* 1 AC\t */\n\t{ 24576, 2048, 2048, 2048 }, \t/* 2 ACs*/\n\t{ 24576, 6144, 2048, 2048 }, \t/* 3 ACs*/\n\t{ 24576, 6144, 4096, 2048 }\t\t/* 4 ACs*/\n};\n\n\nVOID SoftwareFlowControl(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tBOOLEAN ResetBulkOutSize=FALSE;\n\tUCHAR i=0,RunningQueueNo=0,QueIdx=0,HighWorkingAcCount=0;\n\tUINT PacketsInQueueSize=0;\n\tUCHAR Priority[]={1,0,2,3};\n\t\n\tfor (i=0;i<NUM_OF_TX_RING;i++)\n\t{\n\n\t\tif (pAd->TxContext[i].CurWritePosition>=pAd->TxContext[i].ENextBulkOutPosition)\n\t\t{\n\t\t\tPacketsInQueueSize=pAd->TxContext[i].CurWritePosition-pAd->TxContext[i].ENextBulkOutPosition;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tPacketsInQueueSize=MAX_TXBULK_SIZE-pAd->TxContext[i].ENextBulkOutPosition+pAd->TxContext[i].CurWritePosition;\n\t\t}\t\t\n\n\t\tif (pAd->BulkOutDataSizeCount[i]>20480 || PacketsInQueueSize>6144)\n\t\t{\n\t\t\tRunningQueueNo++;\n\t\t\tpAd->BulkOutDataFlag[i]=TRUE;\n\t\t}\n\t\telse\n\t\t\tpAd->BulkOutDataFlag[i]=FALSE;\n\n\t\tpAd->BulkOutDataSizeCount[i]=0;\n\t}\n\n\tif (RunningQueueNo>pAd->LastRunningQueueNo)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"SoftwareFlowControl  reset %d > %d \\n\",RunningQueueNo,pAd->LastRunningQueueNo));\n\t\t\n\t\tResetBulkOutSize=TRUE;\n\t\t pAd->RunningQueueNoCount=0;\n\t\t pAd->LastRunningQueueNo=RunningQueueNo;\n\t}\n\telse if (RunningQueueNo==pAd->LastRunningQueueNo)\n\t{\npAd->RunningQueueNoCount=0;\n\t}\n\telse if (RunningQueueNo<pAd->LastRunningQueueNo)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"SoftwareFlowControl  reset %d < %d \\n\",RunningQueueNo,pAd->LastRunningQueueNo));\n\t\tpAd->RunningQueueNoCount++;\n\t\tif (pAd->RunningQueueNoCount>=6)\n\t\t{\n\t\t\tResetBulkOutSize=TRUE;\n\t\t\tpAd->RunningQueueNoCount=0;\n\t\t\tpAd->LastRunningQueueNo=RunningQueueNo;\n\t\t}\n\t}\n\n\tif (ResetBulkOutSize==TRUE)\n\t{\n\t\tfor (QueIdx=0;QueIdx<NUM_OF_TX_RING;QueIdx++)\n\t\t{\n\t\t\tHighWorkingAcCount=0;\n\t\t\tfor (i=0;i<NUM_OF_TX_RING;i++)\n\t\t\t{\n\t\t\t\tif (QueIdx==i)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (pAd->BulkOutDataFlag[i]==TRUE && Priority[i]>Priority[QueIdx])\n\t\t\t\t\t\tHighWorkingAcCount++;\n\t\t\t\t\n\t\t\t}\n\t\t\tpAd->BulkOutDataSizeLimit[QueIdx]=MaxBulkOutsSizeLimit[RunningQueueNo][HighWorkingAcCount];\n\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Reset bulkout size AC0(BE):%7d AC1(BK):%7d AC2(VI):%7d AC3(VO):%7d %d\\n\",pAd->BulkOutDataSizeLimit[0]\n\t\t\t,pAd->BulkOutDataSizeLimit[1]\n\t\t\t,pAd->BulkOutDataSizeLimit[2]\n\t\t\t,pAd->BulkOutDataSizeLimit[3]\n\t\t\t,RunningQueueNo));\t\t\t\n\t}\n}\n#endif /* INF_AMAZON_SE */\n\n\nVOID\tRTUSBInitTxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPTX_CONTEXT\t\tpTxContext,\n\tIN\tUCHAR\t\t\tBulkOutPipeId,\n\tIN\tusb_complete_t\tFunc)\n{\n\tPURB\t\t\t\tpUrb;\n\tPUCHAR\t\t\t\tpSrc = NULL;\n\tPOS_COOKIE\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tpUrb = pTxContext->pUrb;\n\tASSERT(pUrb);\n\n\t/* Store BulkOut PipeId*/\n\tpTxContext->BulkOutPipeId = BulkOutPipeId;\n\n\tif (pTxContext->bAggregatible)\n\t{\n\t\tpSrc = &pTxContext->TransferBuffer->Aggregation[2];\n\n\t\t/*Initialize a tx bulk urb*/\n\t\tRTUSB_FILL_TX_BULK_URB(pUrb,\n\t\t\t\t\t\tpObj->pUsb_Dev,\n\t\t\t\t\t\tpChipCap->WMM0ACBulkOutAddr[BulkOutPipeId],\n\t\t\t\t\t\tpSrc,\n\t\t\t\t\t\tpTxContext->BulkOutSize,\n\t\t\t\t\t\tFunc,\n\t\t\t\t\t\tpTxContext,\n\t\t\t\t\t\t(pTxContext->data_dma + TX_BUFFER_NORMSIZE + 2));\n\t}\n\telse\n\t{\n\t\tpSrc = (PUCHAR) pTxContext->TransferBuffer->field.WirelessPacket;\n\n\t\t/*Initialize a tx bulk urb*/\n\t\tif (BulkOutPipeId == MGMTPIPEIDX) //Use EP9\n\t\t{\n\t\t\tRTUSB_FILL_TX_BULK_URB(pUrb,\n\t\t\t\t\tpObj->pUsb_Dev,\n\t\t\t\t\tpChipCap->CommandBulkOutAddr,\n\t\t\t\t\tpSrc,\n\t\t\t\t\tpTxContext->BulkOutSize,\n\t\t\t\t\tFunc,\n\t\t\t\t\tpTxContext,\n\t\t\t\t\tpTxContext->data_dma);\n\n\t\t}\n\t\telse\n\t\t{\n\t\tRTUSB_FILL_TX_BULK_URB(pUrb,\n\t\t\t\t\t\tpObj->pUsb_Dev,\n\t\t\t\t\t\tpChipCap->WMM0ACBulkOutAddr[BulkOutPipeId],\n\t\t\t\t\t\tpSrc,\n\t\t\t\t\t\tpTxContext->BulkOutSize,\n\t\t\t\t\t\tFunc,\n\t\t\t\t\t\tpTxContext,\n\t\t\t\t\t\tpTxContext->data_dma);\n\t\t}\n\t}\n}\n\nVOID\tRTUSBInitHTTxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPHT_TX_CONTEXT\tpTxContext,\n\tIN\tUCHAR\t\t\tBulkOutPipeId,\n\tIN\tULONG\t\t\tBulkOutSize,\n\tIN\tusb_complete_t\tFunc)\n{\n\tPURB\t\t\t\tpUrb;\n\tPUCHAR\t\t\t\tpSrc = NULL;\n\tPOS_COOKIE\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tpUrb = pTxContext->pUrb;\n\tASSERT(pUrb);\n\n\t/* Store BulkOut PipeId*/\n\tpTxContext->BulkOutPipeId = BulkOutPipeId;\n\n\tpSrc = &pTxContext->TransferBuffer->field.WirelessPacket[pTxContext->NextBulkOutPosition];\n\n\t/*Initialize a tx bulk urb*/\n\tif (BulkOutPipeId == 4) //Use EP9\n\t{\n\n\t\tRTUSB_FILL_HTTX_BULK_URB(pUrb,\n\t\t\t\t\t\tpObj->pUsb_Dev,\n\t\t\t\t\t\tpChipCap->WMM1ACBulkOutAddr,\n\t\t\t\t\t\tpSrc,\n\t\t\t\t\t\tBulkOutSize,\n\t\t\t\t\t\tFunc,\n\t\t\t\t\t\tpTxContext,\n\t\t\t\t\t\t(pTxContext->data_dma + pTxContext->NextBulkOutPosition));\n\t}\n\telse\n\t{\n\tRTUSB_FILL_HTTX_BULK_URB(pUrb,\n\t\t\t\t\t\tpObj->pUsb_Dev,\n\t\t\t\t\t\tpChipCap->WMM0ACBulkOutAddr[BulkOutPipeId],\n\t\t\t\t\t\tpSrc,\n\t\t\t\t\t\tBulkOutSize,\n\t\t\t\t\t\tFunc,\n\t\t\t\t\t\tpTxContext,\n\t\t\t\t\t\t(pTxContext->data_dma + pTxContext->NextBulkOutPosition));\n\t}\n}\n\nVOID\tRTUSBInitRxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPRX_CONTEXT\t\tpRxContext)\n{\n\tPURB\t\t\t\tpUrb;\n\tPOS_COOKIE\t\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tULONG\t\t\t\tRX_bulk_size;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tpUrb = pRxContext->pUrb;\n\tASSERT(pUrb);\n\t\n\tif ( pAd->BulkInMaxPacketSize == 64)\n\t\tRX_bulk_size = 4096;\n\telse\n\t\tRX_bulk_size = MAX_RXBULK_SIZE;\n\t\t\n\n\t/*Initialize a rx bulk urb*/\n\tRTUSB_FILL_RX_BULK_URB(pUrb,\n\t\t\t\t\tpObj->pUsb_Dev,\n\t\t\t\t\tpChipCap->DataBulkInAddr,\n\t\t\t\t\t&(pRxContext->TransferBuffer[pAd->NextRxBulkInPosition]),\n\t\t\t\t\tRX_bulk_size - (pAd->NextRxBulkInPosition),\n\t\t\t\t\tRtmpUsbBulkRxComplete,\n\t\t\t\t\t(void *)pRxContext,\n\t\t\t\t\t(pRxContext->data_dma + pAd->NextRxBulkInPosition));\n}\n\n\nVOID RTUSBInitCmdRspEventDesc(\n\tPRTMP_ADAPTER pAd,\n\tPCMD_RSP_CONTEXT pCmdRspEventContext)\n{\n\tPURB pUrb = pCmdRspEventContext->pUrb;\n\tPOS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\t \n\t//printk(\"%s, Bulk In add = 0x%x\\n\", __FUNCTION__, pAd->BulkInEpAddr[1]);\n\t/* Initialize command response event URB */\n\tRTUSB_FILL_RX_BULK_URB(pUrb,\n\t\t\t\t\t\t   pObj->pUsb_Dev,\n\t\t\t\t\t\t   pChipCap->CommandRspBulkInAddr,\n\t\t\t\t\t\t   pCmdRspEventContext->CmdRspBuffer,\n\t\t\t\t\t\t   CMD_RSP_BULK_SIZE,\n\t\t\t\t\t\t   RTUSBBulkCmdRspEventComplete,\n\t\t\t\t\t\t   (void *)pCmdRspEventContext,\n\t\t\t\t\t\t   pCmdRspEventContext->data_dma);\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n\t========================================================================\n*/\n\n#define BULK_OUT_LOCK(pLock, IrqFlags)\t\\\n\t\tif(1 /*!(in_interrupt() & 0xffff0000)*/)\t\\\n\t\t\tRTMP_IRQ_LOCK((pLock), IrqFlags);\n\t\t\n#define BULK_OUT_UNLOCK(pLock, IrqFlags)\t\\\n\t\tif(1 /*!(in_interrupt() & 0xffff0000)*/)\t\\\n\t\t\tRTMP_IRQ_UNLOCK((pLock), IrqFlags);\n\n\nVOID\tRTUSBBulkOutDataPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBulkOutPipeId,\n\tIN\tUCHAR\t\t\tIndex)\n{\n\n\tPHT_TX_CONTEXT\tpHTTXContext;\n\tPURB\t\t\tpUrb;\n\tint\t\t\t\tret = 0;\n\tTXINFO_STRUC *pTxInfo, *pLastTxInfo = NULL;\n\tTXWI_STRUC *pTxWI;\n\tULONG\t\t\tTmpBulkEndPos, ThisBulkSize;\n\tunsigned long\tIrqFlags = 0, IrqFlags2 = 0;\n\tPUCHAR\t\t\tpWirelessPkt, pAppendant;\n\n#ifdef USB_BULK_BUF_ALIGMENT\n\tBOOLEAN\t\t\tbLasAlignmentsectiontRound = FALSE;\n#else\n\tBOOLEAN\t\t\tbTxQLastRound = FALSE;\n\tUCHAR\t\t\tallzero[4]= {0x0,0x0,0x0,0x0};\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\n\n\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\tif ((pAd->BulkOutPending[BulkOutPipeId] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))\n\t{\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\treturn;\n\t}\n\tpAd->BulkOutPending[BulkOutPipeId] = TRUE;\n\t\n\tif (((!OPSTATUS_TEST_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) &&\n\t\t( !OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)))\n#ifdef P2P_SUPPORT\n\t\t\t&& !(P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\treturn;\n\t}\n\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\n\n\tpHTTXContext = &(pAd->TxContext[BulkOutPipeId]);\n\n\tBULK_OUT_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);\n\tif ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition)\n#ifdef USB_BULK_BUF_ALIGMENT\n\t\t|| ((pHTTXContext->CurWriteRealPos > pHTTXContext->CurWritePosition) &&(pHTTXContext->NextBulkIdx == pHTTXContext->CurWriteIdx) )\n#else\n\t\t|| ((pHTTXContext->ENextBulkOutPosition-8) == pHTTXContext->CurWritePosition)\n#endif /* USB_BULK_BUF_ALIGMENT */\n\t\t)  /* druing writing. */\n\t{\n\t\tBULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);\n\t\t\n\t\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\t\t\n\t\t/* Clear Data flag*/\n\t\tRTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId));\n\t\tRTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\t\t\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\treturn;\n\t}\n\n\t/* Clear Data flag*/\n\tRTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId));\n\tRTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\n\t/*DBGPRINT(RT_DEBUG_TRACE,(\"BulkOut-B:I=0x%lx, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\\n\", in_interrupt(), */\n\t/*\t\t\t\t\t\t\tpHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition, */\n\t/*\t\t\t\t\t\t\tpHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));*/\n\tpHTTXContext->NextBulkOutPosition = pHTTXContext->ENextBulkOutPosition;\t\n\tThisBulkSize = 0;\n\tTmpBulkEndPos = pHTTXContext->NextBulkOutPosition;\n\tpWirelessPkt = &pHTTXContext->TransferBuffer->field.WirelessPacket[0];\n\n#ifndef USB_BULK_BUF_ALIGMENT\t\n\tif ((pHTTXContext->bCopySavePad == TRUE))\n\t{\n\t\tif (RTMPEqualMemory(pHTTXContext->SavedPad, allzero,4))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"e1, allzero : %x  %x  %x  %x  %x  %x  %x  %x \\n\",\n\t\t\t\tpHTTXContext->SavedPad[0], pHTTXContext->SavedPad[1], pHTTXContext->SavedPad[2],pHTTXContext->SavedPad[3]\n\t\t\t\t,pHTTXContext->SavedPad[4], pHTTXContext->SavedPad[5], pHTTXContext->SavedPad[6],pHTTXContext->SavedPad[7]));\n\t\t}\n\t\tNdisMoveMemory(&pWirelessPkt[TmpBulkEndPos], pHTTXContext->SavedPad, 8);\n\t\tpHTTXContext->bCopySavePad = FALSE;\n\t\tif (pAd->bForcePrintTX == TRUE)\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"RTUSBBulkOutDataPacket --> COPY PAD. CurWrite = %ld, NextBulk = %ld.   ENextBulk = %ld.\\n\",   pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition));\n\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\n\tdo\n\t{\n\t\tpTxInfo = (TXINFO_STRUC *)&pWirelessPkt[TmpBulkEndPos];\n\t\tpTxWI = (TXWI_STRUC *)&pWirelessPkt[TmpBulkEndPos + TXINFO_SIZE];\n\t\n\t\tif (pAd->bForcePrintTX == TRUE)\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBBulkOutDataPacket AMPDU = %d.\\n\",   pTxWI->TxWIAMPDU));\n\t\t\n\t\t/* add by Iverson, limit BulkOut size to 4k to pass WMM b mode 2T1R test items*/\n\t\t/*if ((ThisBulkSize != 0)  && (pTxWI->AMPDU == 0))*/\n\t\tif ((ThisBulkSize != 0) && (pTxWI->TxWIPHYMODE == MODE_CCK))\n\t\t{\n#ifdef INF_AMAZON_SE\n\t\t\t/*Iverson Add for AMAZON USB (RT2070 &&  RT3070) to pass WMM A2-T4 ~ A2-T10*/\n\t\t\tif(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))\n\t\t\t{\n\t\t\t\t/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate*/\n\t\t\t\tif(pTxWI->PacketId == 6)\n                \t\t{\n\t\t                \tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\t\t\tbreak;\n                \t\t}\n\t\t\t\telse if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&pAd->BulkOutDataSizeLimit[BulkOutPipeId]) == pAd->BulkOutDataSizeLimit[BulkOutPipeId]))\n\t\t\t\t{\t\n\t\t\t/*printk(\"===Bulkout size limit :%d ===\\n\",MaxBulkOutSize);*/\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE,(\"b mode BulkOutPipeId %d  pAd->BulkOutDataSizeLimit[BulkOutPipeId] %d  \\n\",BulkOutPipeId,pAd->BulkOutDataSizeLimit[BulkOutPipeId]));*/\n\t\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x1000) == 0x1000))\n\t\t\t{\n\t\t\t\t/* Limit BulkOut size to about 4k bytes.*/\n\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\t\tbreak;\n\t\t\t}\n#endif /* INF_AMAZON_SE */\n#ifndef INF_AMAZON_SE\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\t\tif (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x1000) == 0x1000))\n\t\t\t{\n\t\t\t\t/* Limit BulkOut size to about 4k bytes.*/\n\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\t\tbreak;\n\t\t\t}\n#else\n\t\t\tif (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000))\n\t\t\t{\n\t\t\t\t/* Limit BulkOut size to about 24k bytes.*/\n\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\n\t\t\t\t/*\n\t\t\t\t\twhen bulk size is > 6000, it mean that this is the lasttround at this alignmnet section.\n\t\t\t\t*/\n\t\t\t\tbLasAlignmentsectiontRound = TRUE;\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\n#endif /* USB_BULK_BUF_ALIGMENT */\n#endif /* INF_AMAZON_SE */\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\t\telse if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0) ) /*|| ( (ThisBulkSize != 0)  && (pTxWI->AMPDU == 0))*/)\n\t\t\t{\n\t\t\t\t/* For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size. */\n\t\t\t\t/* For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04.*/\n\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\t\tbreak;\n\t\t\t}\n#else\n\t\t\telse if (((pAd->BulkOutMaxPacketSize < 512) && (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000)) ))\n\t\t\t{\n\t\t\t\t/* Limit BulkOut size to about 24k bytes.*/\n\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\n\t\t\t\t/*\n\t\t\t\t\twhen bulk size is > 6000, it mean that this is the lasttround at this alignmnet section.\n\t\t\t\t*/\n\t\t\t\tbLasAlignmentsectiontRound = TRUE;\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\t}\n\t\t/* end Iverson*/\n\t\telse\n\t\t{\n\n\n#ifdef RT65xx\n\t\tif (((ThisBulkSize&0xfffe0000) != 0) || ((ThisBulkSize&0x10000) == 0x10000))\n#else\n\t\tif (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000))\n#endif /* RT65xx */\n\t\t{\t/* Limit BulkOut size to about 24k bytes.*/\n\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n#ifdef USB_BULK_BUF_ALIGMENT\n\t\t\t\t/*\n\t\t\t\t\twhen bulk size is > 0x6000, it mean that this is the lasttround at this alignmnet section.\n\t\t\t\t*/\n\t\t\t\tbLasAlignmentsectiontRound = TRUE;\n/*\t\t\t\tprintk(\"data bulk out bLasAlignmentsectiontRound \\n\");*/\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\t\tbreak;\n\t\t}\n#ifdef INF_AMAZON_SE\n\t\telse if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&pAd->BulkOutDataSizeLimit[BulkOutPipeId]) == pAd->BulkOutDataSizeLimit[BulkOutPipeId]))\n\t\t{\t\n\t\t\t/*printk(\"===Bulkout size limit :%d ===\\n\",ThisBulkSize);*/\n\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\tbreak;\n\t\t}\n#endif /* INF_AMAZON_SE */\n#ifndef USB_BULK_BUF_ALIGMENT\n\t\telse if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0) ) /*|| ( (ThisBulkSize != 0)  && (pTxWI->AMPDU == 0))*/)\n\t\t{\t/* For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size. */\n\t\t\t/* For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04.*/\n\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\tbreak;\n\t\t}\n#else\n\t\t\telse if (((pAd->BulkOutMaxPacketSize < 512) && (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000)) ))\n\t\t\t{\n\t\t\t\t/* Limit BulkOut size to about 24k bytes.*/\n\t\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\n\t\t\t\t/*\n\t\t\t\t\twhen bulk size is > 6000, it mean that this is the lasttround at this alignmnet section.\n\t\t\t\t*/\n\t\t\t\tbLasAlignmentsectiontRound = TRUE;\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\n\n\t\t}\n\t\t\n\t\tif (TmpBulkEndPos == pHTTXContext->CurWritePosition)\n\t\t{\n\t\t\tpHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;\n\t\t\tbreak;\n\t\t}\n\n#ifndef CONFIG_MULTI_CHANNEL\n\t\tif (pTxInfo->TxInfoQSEL != FIFO_EDCA)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): ====> pTxInfo->QueueSel(%d)!= FIFO_EDCA!!!!\\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, pTxInfo->TxInfoQSEL));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\tCWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\\n\", \n\t\t\t\t\t\t\t\t\t\tpHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, \n\t\t\t\t\t\t\t\t\t\tpHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));\n\t\t\thex_dump(\"Wrong QSel Pkt:\", (PUCHAR)&pWirelessPkt[TmpBulkEndPos], (pHTTXContext->CurWritePosition - pHTTXContext->NextBulkOutPosition));\n\t\t}\n#endif /* !CONFIG_MULTI_CHANNEL */\t\t\n\t\t\n\t\tif (pTxInfo->TxInfoPktLen <= 8)\n\t\t{\n\t\t\tBULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR /*RT_DEBUG_TRACE*/,(\"e2, TxInfoPktLen==0, Size=%ld, bCSPad=%d, CWPos=%ld, NBPos=%ld, CWRPos=%ld!\\n\", \n\t\t\t\t\tpHTTXContext->BulkOutSize, pHTTXContext->bCopySavePad, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->CurWriteRealPos));\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR /*RT_DEBUG_TRACE*/,(\"%x  %x  %x  %x  %x  %x  %x  %x \\n\",\n\t\t\t\t\tpHTTXContext->SavedPad[0], pHTTXContext->SavedPad[1], pHTTXContext->SavedPad[2],pHTTXContext->SavedPad[3]\n\t\t\t\t\t,pHTTXContext->SavedPad[4], pHTTXContext->SavedPad[5], pHTTXContext->SavedPad[6],pHTTXContext->SavedPad[7]));\n\t\t\t}\n\t\t\tpAd->bForcePrintTX = TRUE;\n\t\t\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\t\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\t\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\t\t/*DBGPRINT(RT_DEBUG_LOUD,(\"Out:pTxInfo->TxInfoPktLen=%d!\\n\", pTxInfo->TxInfoPktLen));*/\n\t\t\treturn;\n\t\t}\n\n\t\t\t/* Increase Total transmit byte counter*/\n\t\tpAd->RalinkCounters.OneSecTransmittedByteCount +=  pTxWI->TxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.TransmittedByteCount +=  pTxWI->TxWIMPDUByteCnt;\n\t\n\t\tpLastTxInfo = pTxInfo;\n\t\t\n\t\t/* Make sure we use EDCA QUEUE.  */\n#ifndef CONFIG_MULTI_CHANNEL\n\t\tpTxInfo->TxInfoQSEL = FIFO_EDCA;\n#endif /* !CONFIG_MULTI_CHANNEL */\n\t\tThisBulkSize += (pTxInfo->TxInfoPktLen+4);\n\t\tTmpBulkEndPos += (pTxInfo->TxInfoPktLen+4);\n\t\t\n\t\tif (TmpBulkEndPos != pHTTXContext->CurWritePosition)\n\t\t\tpTxInfo->TxInfoUDMANextVld = 1;\n\n#ifdef USB_BULK_BUF_ALIGMENT\t\t\n/*\n\t\tthis is for frag packet , because it will finish this section \n\t\twhen ((((pHTTXContext->CurWritePosition + 3906)& 0x00007fff) & 0xffff6000) == 0x00006000)\t\n*/\n\t\tif (pTxInfo->bFragLasAlignmentsectiontRound == 1)\n\t\t{\n\t\t\tbLasAlignmentsectiontRound = TRUE;\n\t\t\tbreak;\n\t\t}\n#else\t\t\n\t\tif (pTxInfo->TxInfoSwLstRnd == 1)\n\t\t{\n\t\t\tif (pHTTXContext->CurWritePosition == 8)\n\t\t\t\tpTxInfo->TxInfoUDMANextVld = 0;\n\t\t\tpTxInfo->TxInfoSwLstRnd = 0;\n\t\t\t\n\t\t\tbTxQLastRound = TRUE;\n\t\t\tpHTTXContext->ENextBulkOutPosition = 8;\n\t\t\t\n\t#ifdef RT_BIG_ENDIAN\n\t\t\tRTMPDescriptorEndianChange((PUCHAR)pTxInfo, TYPE_TXINFO);\n\t\t\tRTMPWIEndianChange(pAd, (PUCHAR)pTxWI, TYPE_TXWI);\n\t#endif /* RT_BIG_ENDIAN */\n\t\n\t\t\tbreak;\n\t\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\t\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPDescriptorEndianChange((PUCHAR)pTxInfo, TYPE_TXINFO);\n\t\tRTMPWIEndianChange(pAd, (PUCHAR)pTxWI, TYPE_TXWI);\n#endif /* RT_BIG_ENDIAN */\n\n\t}while (TRUE);\n\n\t/* adjust the pTxInfo->TxInfoUDMANextVld value of last pTxInfo.*/\n\tif (pLastTxInfo)\n\t{\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPDescriptorEndianChange((PUCHAR)pLastTxInfo, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n\t\tpLastTxInfo->TxInfoUDMANextVld = 0;\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPDescriptorEndianChange((PUCHAR)pLastTxInfo, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n\t}\n\n\t/* \n\t\tWe need to copy SavedPad when following condition matched!\n\t\t\t1. Not the last round of the TxQueue and\n\t\t\t2. any match of following cases:\n\t\t\t\t(1). The End Position of this bulk out is reach to the Currenct Write position and \n\t\t\t\t\t\tthe TxInfo and related header already write to the CurWritePosition.\n\t\t\t   \t\t=>(ENextBulkOutPosition == CurWritePosition) && (CurWriteRealPos > CurWritePosition)\n\t\t\n\t\t\t\t(2). The EndPosition of the bulk out is not reach to the Current Write Position.\n\t\t\t\t\t=>(ENextBulkOutPosition != CurWritePosition)\n\t*/\n#ifndef USB_BULK_BUF_ALIGMENT\n\tif ((bTxQLastRound == FALSE) &&\n\t\t (((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) && (pHTTXContext->CurWriteRealPos > pHTTXContext->CurWritePosition)) ||\n\t\t  (pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition))\n\t\t)\n\t{\n\t\tNdisMoveMemory(pHTTXContext->SavedPad, &pWirelessPkt[pHTTXContext->ENextBulkOutPosition], 8);\n\t\tpHTTXContext->bCopySavePad = TRUE;\n\t\tif (RTMPEqualMemory(pHTTXContext->SavedPad, allzero,4))\n\t\t{\t\n\t\t\tPUCHAR\tpBuf = &pHTTXContext->SavedPad[0];\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"WARNING-Zero-3:%02x%02x%02x%02x%02x%02x%02x%02x,CWPos=%ld, CWRPos=%ld, bCW=%d, NBPos=%ld, TBPos=%ld, TBSize=%ld\\n\",\n\t\t\t\tpBuf[0], pBuf[1], pBuf[2],pBuf[3],pBuf[4], pBuf[5], pBuf[6],pBuf[7], pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos,\n\t\t\t\tpHTTXContext->bCurWriting, pHTTXContext->NextBulkOutPosition, TmpBulkEndPos, ThisBulkSize));\n\t\t\t\n\t\t\tpBuf = &pWirelessPkt[pHTTXContext->CurWritePosition];\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"\\tCWPos=%02x%02x%02x%02x%02x%02x%02x%02x\\n\", pBuf[0], pBuf[1], pBuf[2],pBuf[3],pBuf[4], pBuf[5], pBuf[6],pBuf[7]));\n\t\t}\n\t\t/*DBGPRINT(RT_DEBUG_LOUD,(\"ENPos==CWPos=%ld, CWRPos=%ld, bCSPad=%d!\\n\", pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->bCopySavePad));*/\n\t}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\tif (pAd->bForcePrintTX == TRUE)\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"BulkOut-A:Size=%ld, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\\n\", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));\n\t/*DBGPRINT(RT_DEBUG_LOUD,(\"BulkOut-A:Size=%ld, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, bLRound=%d!\\n\", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad, bTxQLastRound));*/\n\t\n\t\t/* USB DMA engine requires to pad extra 4 bytes. This pad doesn't count into real bulkoutsize.*/\n\tpAppendant = &pWirelessPkt[TmpBulkEndPos];\n\tNdisZeroMemory(pAppendant, 8);\n\t\tThisBulkSize += 4;\n\t\tpHTTXContext->LastOne = TRUE;\n\n\tpHTTXContext->BulkOutSize = ThisBulkSize;\n#ifdef USB_BULK_BUF_ALIGMENT\n\t/*\n\t\tif it is the last alignment section round,that we just need to add nextbulkindex, \n\t\totherwise we both need to add  nextbulkindex and CurWriteIdx\n\t\t(because when alignment section round happened, the CurWriteIdx is added at function writing resource.)\n\t*/\t\n\tif(bLasAlignmentsectiontRound == TRUE)\n\t{\n\t\t\tpHTTXContext->ENextBulkOutPosition = ((CUR_WRITE_IDX_INC(pHTTXContext->NextBulkIdx, BUF_ALIGMENT_RINGSIZE)) * 0x8000);\n\t}\n\telse\n\t{\t\n\t\t\tpHTTXContext->ENextBulkOutPosition = ((CUR_WRITE_IDX_INC(pHTTXContext->NextBulkIdx, BUF_ALIGMENT_RINGSIZE)) * 0x8000);\n\t\t\tpHTTXContext->CurWritePosition = ((CUR_WRITE_IDX_INC(pHTTXContext->CurWriteIdx, BUF_ALIGMENT_RINGSIZE)) * 0x8000);\n\t }\n\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\t\n\tpAd->watchDogTxPendingCnt[BulkOutPipeId] = 1;\n\tBULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);\n\t\n\t/* Init Tx context descriptor*/\n\tRTUSBInitHTTxDesc(pAd, pHTTXContext, BulkOutPipeId, ThisBulkSize, (usb_complete_t)RtmpUsbBulkOutDataPacketComplete);\n\t\n\tpUrb = pHTTXContext->pUrb;\n\tif((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTUSBBulkOutDataPacket: Submit Tx URB failed %d\\n\", ret));\n\t\t\n\t\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\t\tpAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;\n\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\n\t\treturn;\n\t}\n\n\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\tpHTTXContext->IRPPending = TRUE;\n\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\tpAd->BulkOutReq++;\n\n}\n\n\nUSBHST_STATUS RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tPHT_TX_CONTEXT\tpHTTXContext;\n\tPRTMP_ADAPTER\tpAd;\n\tPOS_COOKIE \t\tpObj;\n\tUCHAR\t\t\tBulkOutPipeId;\n\t\n\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB);\n\tpAd \t\t\t= pHTTXContext->pAd;\n\tpObj \t\t\t= (POS_COOKIE) pAd->OS_Cookie;\n\n\t/* Store BulkOut PipeId*/\n\tBulkOutPipeId\t= pHTTXContext->BulkOutPipeId;\n\tpAd->BulkOutDataOneSecCount++;\n\n\tswitch (BulkOutPipeId)\n\t{\n\t\tcase EDCA_AC0_PIPE:\n#ifdef RALINK_ATE\n\t\t\t\tif (!ATE_ON(pAd))\n\t\t\t\t{\n#endif /* RALINK_ATE */\n\t\t\t\t\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->ac0_dma_done_task, (unsigned long)pURB);\n\t\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->ac0_dma_done_task);\n#ifdef RALINK_ATE\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->ate_ac0_dma_done_task, (unsigned long)pURB);\n\t\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->ate_ac0_dma_done_task);\n\t\t\t\t}\n#endif /* RALINK_ATE */\n\t\t\t\t\n\t\t\t\tbreak;\n\t\tcase EDCA_AC1_PIPE:\n\t\t\t\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->ac1_dma_done_task, (unsigned long)pURB);\n\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->ac1_dma_done_task);\n\t\t\t\tbreak;\n\t\tcase EDCA_AC2_PIPE:\n\t\t\t\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->ac2_dma_done_task, (unsigned long)pURB);\n\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->ac2_dma_done_task);\n\t\t\t\tbreak;\n\t\tcase EDCA_AC3_PIPE:\n\t\t\t\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->ac3_dma_done_task, (unsigned long)pURB);\n\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->ac3_dma_done_task);\n\t\t\t\tbreak;\n\t\tcase HCCA_PIPE:\n\t\t\t\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->hcca_dma_done_task, (unsigned long)pURB);\n\t\t\t\tRTMP_OS_TASKLET_SCHE(&pObj->hcca_dma_done_task);\n\t\t\t\tbreak;\n\t}\n\n\t\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote: NULL frame use BulkOutPipeId = 0\n\t\n\t========================================================================\n*/\nVOID\tRTUSBBulkOutNullFrame(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPTX_CONTEXT\t\tpNullContext = &(pAd->NullContext[0]);\n\tPURB\t\t\tpUrb;\n\tint\t\t\t\tret = 0;\n\tunsigned long\tIrqFlags;\n\t\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);\n\tif ((pAd->BulkOutPending[0] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\treturn;\n\t}\n\tpAd->BulkOutPending[0] = TRUE;\n\tpAd->watchDogTxPendingCnt[0] = 1;\n\tpNullContext->IRPPending = TRUE;\n\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\n\t/* Increase Total transmit byte counter*/\n\tpAd->RalinkCounters.TransmittedByteCount +=  pNullContext->BulkOutSize;\n\t\n\t\n\t/* Clear Null frame bulk flag*/\n\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPDescriptorEndianChange((PUCHAR)pNullContext->TransferBuffer, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n\n\t/* Init Tx context descriptor*/\n\tRTUSBInitTxDesc(pAd, pNullContext, 0, (usb_complete_t)RtmpUsbBulkOutNullFrameComplete);\n\n\tpUrb = pNullContext->pUrb;\n\tif((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\tpAd->BulkOutPending[0] = FALSE;\n\t\tpAd->watchDogTxPendingCnt[0] = 0;\n\t\tpNullContext->IRPPending = FALSE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTUSBBulkOutNullFrame: Submit Tx URB failed %d\\n\", ret));\n\t\treturn;\n\t}\t\n\t\n}\n\n/* NULL frame use BulkOutPipeId = 0*/\nUSBHST_STATUS RTUSBBulkOutNullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPTX_CONTEXT\t\t\tpNullContext;\n\tNTSTATUS\t\t\tStatus;\n\tPOS_COOKIE\t\t\tpObj;\n\n\t\n\tpNullContext\t= (PTX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB);\n\tpAd \t\t\t= pNullContext->pAd;\n\tStatus \t\t\t= RTMP_OS_USB_STATUS_GET(pURB); /*->rtusb_urb_status;*/\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->null_frame_complete_task, (unsigned long)pURB);\n\tRTMP_OS_TASKLET_SCHE(&pObj->null_frame_complete_task);\n\n}\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\nUSBHST_STATUS RTUSBBulkOutHCCANullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPTX_CONTEXT\t\t\tpNullContext;\n\tNTSTATUS\t\t\tStatus;\n\tPOS_COOKIE\t\t\tpObj;\n\t\n\tpNullContext\t= (PTX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB);\n\tpAd \t\t\t= pNullContext->pAd;\n\tStatus \t\t\t= RTMP_OS_USB_STATUS_GET(pURB); /*->rtusb_urb_status;*/\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->hcca_null_frame_complete_task, (unsigned long)pURB);\n\tRTMP_OS_TASKLET_SCHE(&pObj->hcca_null_frame_complete_task);\n\n}\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote: MLME use BulkOutPipeId = 0\n\t\n\t========================================================================\n*/\nVOID\tRTUSBBulkOutMLMEPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tIndex)\n{\n\tPTX_CONTEXT\t\tpMLMEContext;\n\tPURB\t\t\tpUrb;\n\tint\t\t\t\tret = 0;\n\tunsigned long\tIrqFlags;\n\t\t\n\tpMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa;\n\tpUrb = pMLMEContext->pUrb;\n\n\tif ((pAd->MgmtRing.TxSwFreeIdx >= MGMT_RING_SIZE) ||\n\t\t(pMLMEContext->InUse == FALSE) ||\n\t\t(pMLMEContext->bWaitingBulkOut == FALSE))\n\t{\n\t\t\n\t\t\n\t\t/* Clear MLME bulk flag*/\n\t\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);\n\t\t\n\t\treturn;\n\t}\n\n\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\tif ((pAd->BulkOutPending[MGMTPIPEIDX] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\t\treturn;\n\t}\n\n\tpAd->BulkOutPending[MGMTPIPEIDX] = TRUE;\n\tpAd->watchDogTxPendingCnt[MGMTPIPEIDX] = 1;\n\tpMLMEContext->IRPPending = TRUE;\n\tpMLMEContext->bWaitingBulkOut = FALSE;\n\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\t\n\t/* Increase Total transmit byte counter*/\n\tpAd->RalinkCounters.TransmittedByteCount +=  pMLMEContext->BulkOutSize;\n\n\t/* Clear MLME bulk flag*/\n\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPDescriptorEndianChange((PUCHAR)pMLMEContext->TransferBuffer, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n\n\t/* Init Tx context descriptor*/\n\tRTUSBInitTxDesc(pAd, pMLMEContext, MGMTPIPEIDX, (usb_complete_t)RtmpUsbBulkOutMLMEPacketComplete);\n\n\tRTUSB_URB_DMA_MAPPING(pUrb);\n\n\tpUrb = pMLMEContext->pUrb;\n\tif((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTUSBBulkOutMLMEPacket: Submit MLME URB failed %d\\n\", ret));\n\t\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\t\tpAd->BulkOutPending[MGMTPIPEIDX] = FALSE;\n\t\tpAd->watchDogTxPendingCnt[MGMTPIPEIDX] = 0;\n\t\tpMLMEContext->IRPPending = FALSE;\n\t\tpMLMEContext->bWaitingBulkOut = TRUE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\t\t\n\t\treturn;\n\t}\n}\n\n\nUSBHST_STATUS RTUSBBulkOutMLMEPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tPTX_CONTEXT\t\t\tpMLMEContext;\n\tPRTMP_ADAPTER\t\tpAd;\n\tNTSTATUS\t\t\tStatus;\n\tPOS_COOKIE \t\t\tpObj;\n\tint\t\t\t\t\tindex;\n\t\n\tpMLMEContext\t= (PTX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB); \n\tpAd \t\t\t= pMLMEContext->pAd;\n\tpObj \t\t\t= (POS_COOKIE)pAd->OS_Cookie;\n\tStatus\t\t\t= RTMP_OS_USB_STATUS_GET(pURB);\n\tindex \t\t\t= pMLMEContext->SelfIdx;\n\n\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->mgmt_dma_done_task, (unsigned long)pURB);\n\tRTMP_OS_TASKLET_SCHE(&pObj->mgmt_dma_done_task);\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote: PsPoll use BulkOutPipeId = 0\n\t\n\t========================================================================\n*/\nVOID\tRTUSBBulkOutPsPoll(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPTX_CONTEXT\t\tpPsPollContext = &(pAd->PsPollContext);\n\tPURB\t\t\tpUrb;\n\tint\t\t\t\tret = 0;\n\tunsigned long\tIrqFlags;\n\t\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);\n\tif ((pAd->BulkOutPending[0] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\treturn;\n\t}\n\tpAd->BulkOutPending[0] = TRUE;\n\tpAd->watchDogTxPendingCnt[0] = 1;\n\tpPsPollContext->IRPPending = TRUE;\n\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\n\t\n\t/* Clear PS-Poll bulk flag*/\n\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL);\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPDescriptorEndianChange((PUCHAR)pPsPollContext->TransferBuffer, TYPE_TXINFO);\n#endif /* RT_BIG_ENDIAN */\n\n\t/* Init Tx context descriptor*/\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\tRTUSBInitTxDesc(pAd, pPsPollContext, 0, (usb_complete_t)RtmpUsbBulkOutPsPollComplete);\n\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\tRTUSBInitTxDesc(pAd, pPsPollContext, MGMTPIPEIDX, (usb_complete_t)RtmpUsbBulkOutPsPollComplete);\n\t\n\tpUrb = pPsPollContext->pUrb;\n\tif((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\tpAd->BulkOutPending[0] = FALSE;\n\t\tpAd->watchDogTxPendingCnt[0] = 0;\n\t\tpPsPollContext->IRPPending = FALSE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTUSBBulkOutPsPoll: Submit Tx URB failed %d\\n\", ret));\n\t\treturn;\n\t}\n\t\t\n}\n\n/* PS-Poll frame use BulkOutPipeId = 0*/\nUSBHST_STATUS RTUSBBulkOutPsPollComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPTX_CONTEXT\t\t\tpPsPollContext;\n\tNTSTATUS\t\t\tStatus;\n\tPOS_COOKIE\t\t\tpObj;\n\t\n\t\n\tpPsPollContext= (PTX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB);\n\tpAd = pPsPollContext->pAd;\n\tStatus = RTMP_OS_USB_STATUS_GET(pURB);\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->pspoll_frame_complete_task, (unsigned long)pURB);\n\tRTMP_OS_TASKLET_SCHE(&pObj->pspoll_frame_complete_task);\n\n}\n\n\nVOID DoBulkIn(IN RTMP_ADAPTER *pAd)\n{\t\n\tPRX_CONTEXT\t\tpRxContext;\n\tPURB\t\t\tpUrb;\n\tint\t\t\t\tret = 0;\n\tunsigned long\tIrqFlags;\n\t\n\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\tpRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);\n\tif ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE))\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t\treturn;\n\t}\n\tpRxContext->InUse = TRUE;\n\tpRxContext->IRPPending = TRUE;\n\tpAd->PendingRx++;\n\tpAd->BulkInReq++;\n\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\n\t/* Init Rx context descriptor*/\n\tNdisZeroMemory(pRxContext->TransferBuffer, pRxContext->BulkInOffset);\n\tRTUSBInitRxDesc(pAd, pRxContext);\n\n\tpUrb = pRxContext->pUrb;\n\tif ((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t{\t/* fail*/\n\t\n\t\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\t\tpRxContext->InUse = FALSE;\n\t\tpRxContext->IRPPending = FALSE;\n\t\tpAd->PendingRx--;\n\t\tpAd->BulkInReq--;\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTUSBBulkReceive: Submit Rx URB failed %d\\n\", ret));\n\t}\n\telse\n\t{\t/* success*/\n\t\tASSERT((pRxContext->InUse == pRxContext->IRPPending));\n\t}\n}\n\n\nVOID BulkInCmdRspEvent(RTMP_ADAPTER *pAd)\n{\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\tPURB pURB;\n\tint ret = 0;\n\tunsigned long\tIrqFlags;\n\n\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\tif ( (pCmdRspEventContext->Readable == TRUE) || (pCmdRspEventContext->InUse == TRUE))\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\t\treturn;\n\t}\n\tpCmdRspEventContext->InUse = TRUE;\n\tpCmdRspEventContext->IRPPending = TRUE;\n\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\n\tRTUSBInitCmdRspEventDesc(pAd, pCmdRspEventContext);\n\tpURB = pCmdRspEventContext->pUrb;\n\n\tif ((ret = RTUSB_SUBMIT_URB(pURB)) != 0)\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\t\tpCmdRspEventContext->InUse = FALSE;\n\t\tpCmdRspEventContext->IRPPending = FALSE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s success\\n\", __FUNCTION__));\n\t}\n\n} \n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\tUSB_RxPacket initializes a URB and uses the Rx IRP to submit it\n\tto USB. It checks if an Rx Descriptor is available and passes the\n\tthe coresponding buffer to be filled. If no descriptor is available\n\tfails the request. When setting the completion routine we pass our\n\tAdapter Object as Context.\n\t\t\n\tArguments:\n\t\t\n\tReturn Value:\n\t\tTRUE\t\t\tfound matched tuple cache\n\t\tFALSE\t\t\tno matched found\n\n\tNote:\n\t\n\t========================================================================\n*/\n#define fRTMP_ADAPTER_NEED_STOP_RX\t\t\\\n\t\t(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS |\t\\\n\t\t fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \\\n\t\t fRTMP_ADAPTER_REMOVE_IN_PROGRESS | fRTMP_ADAPTER_BULKIN_RESET)\n\t\t \n#define fRTMP_ADAPTER_NEED_STOP_HANDLE_RX\t\\\n\t\t(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS |\t\\\n\t\t fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \\\n\t\t fRTMP_ADAPTER_REMOVE_IN_PROGRESS)\n\t\t \nVOID\tRTUSBBulkReceive(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPRX_CONTEXT\t\tpRxContext;\n\tunsigned long\tIrqFlags;\n\n\n\t/* sanity check */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_HANDLE_RX) \n\t\t\t\t\t&& !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE))\n\t\treturn;\n\n\twhile(1)\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\t\tpRxContext = &(pAd->RxContext[pAd->NextRxBulkInReadIndex]);\n\t\tif (((pRxContext->InUse == FALSE) && (pRxContext->Readable == TRUE)) &&\n\t\t\t(pRxContext->bRxHandling == FALSE))\n\t\t{\n\t\t\tpRxContext->bRxHandling = TRUE;\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\n\t\t\t/* read RxContext, Since not */\n#ifdef P2P_SUPPORT\n\t\t\tRxDoneInterruptHandle(pAd);\n#else\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tAPRxDoneInterruptHandle(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tSTARxDoneInterruptHandle(pAd, TRUE);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* P2P_SUPPORT */\n\n\t\t\t/* Finish to handle this bulkIn buffer.*/\n\t\t\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\t\t\tpRxContext->BulkInOffset = 0;\n\t\t\tpRxContext->Readable = FALSE;\n\t\t\tpRxContext->bRxHandling = FALSE;\n\t\t\tpAd->ReadPosition = 0;\n\t\t\tpAd->TransferBufferLength = 0;\n\t\t\tINC_RING_INDEX(pAd->NextRxBulkInReadIndex, RX_RING_SIZE);\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t\n\t\t} \n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_RX) \n\t\t\t\t\t\t&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE)))))\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\t\treturn;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tDoBulkIn(pAd);\n\t}\n\t\n}\n\n#ifdef RLT_MAC\nVOID RTUSBBulkCmdRspEventReceive(PRTMP_ADAPTER pAd)\n{\n\tunsigned long\tIrqFlags;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\n\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\tif ((pCmdRspEventContext->InUse) == FALSE && (pCmdRspEventContext->Readable == TRUE))\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\t\tCmdRspEventHandle(pAd);\n\n\t\t\n\t\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\t\tpCmdRspEventContext->Readable = FALSE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\t}\n\telse\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\t}\n\n\tif ( !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) )\n\tBulkInCmdRspEvent(pAd);\n}\n#endif /* RTL_MAC */\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tThis routine process Rx Irp and call rx complete function.\n\t\t\n\tArguments:\n\t\tDeviceObject\tPointer to the device object for next lower\n\t\t\t\t\t\tdevice. DeviceObject passed in here belongs to\n\t\t\t\t\t\tthe next lower driver in the stack because we\n\t\t\t\t\t\twere invoked via IoCallDriver in USB_RxPacket\n\t\t\t\t\t\tAND it is not OUR device object\n\t  Irp\t\t\t\tPtr to completed IRP\n\t  Context\t\t\tPtr to our Adapter object (context specified\n\t\t\t\t\t\tin IoSetCompletionRoutine\n\t\t\n\tReturn Value:\n\t\tAlways returns STATUS_MORE_PROCESSING_REQUIRED\n\n\tNote:\n\t\tAlways returns STATUS_MORE_PROCESSING_REQUIRED\n\t========================================================================\n*/\nUSBHST_STATUS RTUSBBulkRxComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\t/* use a receive tasklet to handle received packets;*/\n\t/* or sometimes hardware IRQ will be disabled here, so we can not*/\n\t/* use spin_lock_bh()/spin_unlock_bh() after IRQ is disabled. :<*/\n\tPRX_CONTEXT\t\tpRxContext;\n\tPRTMP_ADAPTER\tpAd;\n\tPOS_COOKIE \t\tpObj;\n\n\tpRxContext\t= (PRX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB);\n\tpAd \t\t= pRxContext->pAd;\n\tpObj \t\t= (POS_COOKIE) pAd->OS_Cookie;\n\n\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->rx_done_task, (unsigned long)pURB);\n\tRTMP_OS_TASKLET_SCHE(&pObj->rx_done_task);\n\t\n}\n\n//void RTUSBBulkCmdRspEventComplete(purbb_t pURB)\nUSBHST_STATUS RTUSBBulkCmdRspEventComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\n\tPRX_CONTEXT\t\tpCmdRspEventContext;\n\tPRTMP_ADAPTER\tpAd;\n\tPOS_COOKIE \t\tpObj;\n\n\tpCmdRspEventContext\t= (PRX_CONTEXT)RTMP_OS_USB_CONTEXT_GET(pURB);\n\tpAd = pCmdRspEventContext->pAd;\n\tpObj = (POS_COOKIE)pAd->OS_Cookie;\n\n\tRTMP_NET_TASK_DATA_ASSIGN(&pObj->cmd_rsp_event_task, (unsigned long)pURB);\n\tRTMP_OS_TASKLET_SCHE(&pObj->cmd_rsp_event_task);\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTUSBKickBulkOut(\n\tIN\tPRTMP_ADAPTER pAd)\n{\n\t/* BulkIn Reset will reset whole USB PHY. So we need to make sure fRTMP_ADAPTER_BULKIN_RESET not flaged.*/\n\tif (!RTMP_TEST_FLAG(pAd ,fRTMP_ADAPTER_NEED_STOP_TX)\n#ifdef RALINK_ATE\t\t\t\n\t\t&& !(ATE_ON(pAd))\n#endif /* RALINK_ATE */\n\t\t)\n\t{\n\n\t\t/* 2. PS-Poll frame is next*/\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL))\n\t\t{\n\t\t\tRTUSBBulkOutPsPoll(pAd);\n\t\t}\n\n\t\t/* 5. Mlme frame is next*/\n\t\telse if ((RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME)) ||\n\t\t\t\t (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE))\n\t\t{\n\t\t\tRTUSBBulkOutMLMEPacket(pAd, pAd->MgmtRing.TxDmaIdx);\n\t\t}\n\n\t\t/* 6. Data frame normal is next*/\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL))\n\t\t{\n\t\t\tif (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || \n\t\t\t\t(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n#ifdef P2P_SUPPORT\n\t\t\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t))\n\t\t\t{\n\t\t\t\tRTUSBBulkOutDataPacket(pAd, EDCA_AC0_PIPE, pAd->NextBulkOutIndex[EDCA_AC0_PIPE]);\n\t\t\t}\n\t\t}\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2))\n\t\t{\t\t\n\t\t\tif (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || \n\t\t\t\t(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n#ifdef P2P_SUPPORT\n\t\t\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t))\n\t\t\t{\n\t\t\t\tRTUSBBulkOutDataPacket(pAd, EDCA_AC1_PIPE, pAd->NextBulkOutIndex[EDCA_AC1_PIPE]);\n\t\t\t}\n\t\t}\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3))\n\t\t{\n\t\t\tif (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || \n\t\t\t\t(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n#ifdef P2P_SUPPORT\n\t\t\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t))\n\t\t\t{\n\t\t\t\tRTUSBBulkOutDataPacket(pAd, EDCA_AC2_PIPE, pAd->NextBulkOutIndex[EDCA_AC2_PIPE]);\n\t\t\t}\n\t\t}\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4))\n\t\t{\n\t\t\tif (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || \n\t\t\t\t(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t\t))\n\t\t\t{\n\t\t\t\tRTUSBBulkOutDataPacket(pAd, EDCA_AC3_PIPE, pAd->NextBulkOutIndex[EDCA_AC3_PIPE]);\n\t\t\t}\n\t\t}\n#ifdef CONFIG_MULTI_CHANNEL\t\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_HCCA))\n\t\t{\n\t\t\tif (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || \n\t\t\t\t(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n\t\t\t\t))\n\t\t\t{\n\t\t\t\tRTUSBBulkOutDataPacket(pAd, HCCA_PIPE, pAd->NextBulkOutIndex[HCCA_PIPE]);\n\t\t\t}\n\t\t}\t\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\t/* 7. Null frame is the last*/\n\t\telse if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL))\n\t\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif (INFRA_ON(pAd) && (pAd->CommonCfg.Channel == pAd->LatchRfRegs.Channel ||\n\t\t\t\tpAd->CommonCfg.CentralChannel== pAd->LatchRfRegs.Channel ))\n#else\n\t\t\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t{\n\t\t\t\tRTUSBBulkOutNullFrame(pAd);\n\t\t\t}\n\t\t}\n#ifdef CONFIG_MULTI_CHANNEL\t\n\t\telse if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL_HCCA))\n\t\t{\n\t\t\tif (INFRA_ON(pAd) && (pAd->CommonCfg.Channel == pAd->LatchRfRegs.Channel ||\n\t\t\t\tpAd->CommonCfg.CentralChannel== pAd->LatchRfRegs.Channel ))\n\t\t\t\tRTUSBBulkOutNullFrame(pAd);\n\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\n\t\t/* 8. No data avaliable*/\n\t\telse\n\t\t{\n\t\t\t\n\t\t}\n\t}\n#ifdef RALINK_ATE\t\t\t\n\telse if((ATE_ON(pAd)) &&\n\t\t\t!RTMP_TEST_FLAG(pAd , fRTMP_ADAPTER_NEED_STOP_TX))\n\t{\n\t\tif (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE))\n\t\t{\n\t\t\tATE_RTUSBBulkOutDataPacket(pAd, EDCA_AC0_PIPE);\n\t\t}\n\t}\t\n#endif /* RALINK_ATE */\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\tCall from Reset action after BulkOut failed. \n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTUSBCleanUpDataBulkOutQueue(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR\t\t\tIdx;\t\t\t\n\tPHT_TX_CONTEXT\tpTxContext;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->CleanUpDataBulkOutQueue\\n\"));\n\n\tfor (Idx = 0; Idx < 4; Idx++)\n\t{\n\t\tpTxContext = &pAd->TxContext[Idx];\n\t\t\n\t\tpTxContext->CurWritePosition = pTxContext->NextBulkOutPosition;\n\t\tpTxContext->LastOne = FALSE;\n\t\tNdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);\n\t\tpAd->BulkOutPending[Idx] = FALSE;\n\t\tNdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---CleanUpDataBulkOutQueue\\n\"));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTUSBCleanUpMLMEBulkOutQueue(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"--->CleanUpMLMEBulkOutQueue\\n\"));\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---CleanUpMLMEBulkOutQueue\\n\"));\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTUSBCancelPendingIRPs(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tRTUSBCancelPendingBulkInIRP(pAd);\n\tRTUSBCancelPendingBulkOutIRP(pAd);\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTUSBCancelPendingBulkInIRP(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPRX_CONTEXT\t\tpRxContext;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext = &pAd->CmdRspEventContext;\n\tUINT\t\t\ti;\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"--->RTUSBCancelPendingBulkInIRP\\n\"));\n\tfor ( i = 0; i < (RX_RING_SIZE); i++)\n\t{\n\t\tpRxContext = &(pAd->RxContext[i]);\n\t\tif(pRxContext->IRPPending == TRUE)\n\t\t{\n\t\t\tRTUSB_UNLINK_URB(pRxContext->pUrb);\n\t\t\tpRxContext->IRPPending = FALSE;\n\t\t\tpRxContext->InUse = FALSE;\n\t\t\t/*NdisInterlockedDecrement(&pAd->PendingRx);*/\n\t\t\t/*pAd->PendingRx--;*/\n\t\t}\n\t}\n\n\tif (pCmdRspEventContext->IRPPending == TRUE)\n\t{\n\t\tprintk(\"unlink cmd rsp urb\\n\");\n\t\tRTUSB_UNLINK_URB(pCmdRspEventContext->pUrb);\n\t\tpCmdRspEventContext->IRPPending = FALSE;\n\t\tpCmdRspEventContext->InUse = FALSE;\n\t}\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"<---RTUSBCancelPendingBulkInIRP\\n\"));\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTUSBCancelPendingBulkOutIRP(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tPTX_CONTEXT\t\t\tpMLMEContext;\n\tPTX_CONTEXT\t\t\tpNullContext;\n\tPTX_CONTEXT\t\t\tpPsPollContext;\n\tUINT\t\t\t\ti, Idx;\n/*\tunsigned int \t\tIrqFlags;*/\n/*\tNDIS_SPIN_LOCK\t\t*pLock;*/\n/*\tBOOLEAN\t\t\t\t*pPending;*/\n\t\n\n/*\tpLock = &pAd->BulkOutLock[MGMTPIPEIDX];*/\n/*\tpPending = &pAd->BulkOutPending[MGMTPIPEIDX];*/\n\n\tfor (Idx = 0; Idx < 4; Idx++)\n\t{\n\t\tpHTTXContext = &(pAd->TxContext[Idx]);\n\n\t\tif (pHTTXContext->IRPPending == TRUE)\n\t\t{\n\n\t\t\t/* Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself*/\n\t\t\t/* remove it from the HeadPendingSendList and NULL out HeadPendingSendList*/\n\t\t\t/*\twhen the last IRP on the list has been\tcancelled; that's how we exit this loop*/\n\t\t\t\n\n\t\t\tRTUSB_UNLINK_URB(pHTTXContext->pUrb);\n\n\t\t\t/* Sleep 200 microseconds to give cancellation time to work*/\n\t\t\tRTMPusecDelay(200);\n\t\t}\n\n#ifdef RALINK_ATE\n\t\tpHTTXContext->bCopySavePad = 0;\n\t\tpHTTXContext->CurWritePosition = 0;\n\t\tpHTTXContext->CurWriteRealPos = 0;\n\t\tpHTTXContext->bCurWriting = FALSE;\n\t\tpHTTXContext->NextBulkOutPosition = 0;\n\t\tpHTTXContext->ENextBulkOutPosition = 0;\n#endif /* RALINK_ATE */\n\t\tpAd->BulkOutPending[Idx] = FALSE;\n\t}\n\n\t/*RTMP_IRQ_LOCK(pLock, IrqFlags);*/\n\tfor (i = 0; i < MGMT_RING_SIZE; i++)\n\t{\n\t\tpMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;\n\t\tif(pMLMEContext && (pMLMEContext->IRPPending == TRUE))\n\t\t{\n\n\t\t\t/* Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself*/\n\t\t\t/* remove it from the HeadPendingSendList and NULL out HeadPendingSendList*/\n\t\t\t/*\twhen the last IRP on the list has been\tcancelled; that's how we exit this loop*/\n\t\t\t\n\n\t\t\tRTUSB_UNLINK_URB(pMLMEContext->pUrb);\n\t\t\tpMLMEContext->IRPPending = FALSE;\n\t\t\t\n\t\t\t/* Sleep 200 microsecs to give cancellation time to work*/\n\t\t\tRTMPusecDelay(200);\n\t\t}\n\t}\n\tpAd->BulkOutPending[MGMTPIPEIDX] = FALSE;\n\t/*RTMP_IRQ_UNLOCK(pLock, IrqFlags);*/\n\n\tpNullContext = &(pAd->NullContext);\n\tif (pNullContext->IRPPending == TRUE)\n\t\tRTUSB_UNLINK_URB(pNullContext->pUrb);\n\n\tpPsPollContext = &(pAd->PsPollContext);\n\tif (pPsPollContext->IRPPending == TRUE)\n\t\tRTUSB_UNLINK_URB(pPsPollContext->pUrb);\n\n\tfor (Idx = 0; Idx < 4; Idx++)\n\t{\n\t\tNdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);\n\t\tpAd->BulkOutPending[Idx] = FALSE;\n\t\tNdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);\n\t}\n}\n\n#endif /* RTMP_MAC_USB */\n"
  },
  {
    "path": "src/common/rtusb_data.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2005, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtusb_data.c\n\n\tAbstract:\n\tRalink USB driver Tx/Rx functions.\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n\tJan            03-25-2006    created\n\n*/\n\n\n"
  },
  {
    "path": "src/common/rtusb_dev_id.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    rtusb_dev_id.c\n\n    Abstract:\n\n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n */\n\n#define RTMP_MODULE_OS\n\n/*#include \"rt_config.h\"*/\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n\n/* module table */\nUSB_DEVICE_ID rtusb_dev_id[] = {\n#ifdef RT6570\n\t{USB_DEVICE(0x148f,0x6570)}, /* Ralink 6570 */\n#endif /* RT6570 */\n\t{USB_DEVICE(0x148f, 0x7650)}, /* MT7650 */\n#ifdef MT7601U\n\t{USB_DEVICE(0x148f,0x6370)}, /* Ralink 6370 */\n\t{USB_DEVICE(0x2955,0x1001)}, /* xiaodu wifi */\n\t{USB_DEVICE(0x148f,0x7601)}, /* MT 6370 */\n\t{USB_DEVICE(0x148f,0x760b)}, /* 360 wifi 2 */\n\t{USB_DEVICE(0x2717,0x4106)}, /* XiaoMi wifi */\n#endif /* MT7601U */\n\t{ }/* Terminating entry */\n};\n\nINT const rtusb_usb_id_len = sizeof(rtusb_dev_id) / sizeof(USB_DEVICE_ID);\nMODULE_DEVICE_TABLE(usb, rtusb_dev_id);\n"
  },
  {
    "path": "src/common/rtusb_io.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n \tModule Name:\n\trtusb_io.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n\tPaul Lin    06-25-2004  created\n*/\n\n#ifdef RTMP_MAC_USB\n\n\n#include\t\"rt_config.h\"\n\n#define MAX_VENDOR_REQ_RETRY_COUNT  10\n\n/*\n\t========================================================================\n\n\tRoutine Description: NIC initialization complete\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\n\nstatic NTSTATUS\tRTUSBFirmwareRun(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tNTSTATUS\tStatus;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t0x01,\n\t\t0x8,\n\t\t0,\n\t\tNULL,\n\t\t0);\n\n\treturn Status;\n}\n\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Get current firmware operation mode (Return Value)\n\n\tArguments:\n\n\tReturn Value:\n\t\t0 or 1 = Downloaded by host driver\n\t\tothers = Driver doesn't download firmware\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBFirmwareOpmode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPULONG\t\t\tpValue)\n{\n\tNTSTATUS\tStatus;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\t(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),\n\t\tDEVICE_VENDOR_REQUEST_IN,\n\t\t0x1,\n\t\t0x11,\n\t\t0,\n\t\tpValue,\n\t\t4);\n\treturn Status;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Write Firmware to NIC.\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS RTUSBFirmwareWrite(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tpFwImage,\n\tIN ULONG\t\tFwLen)\n{\n\tUINT32\t\tMacReg;\n\tNTSTATUS \tStatus;\n/*\tULONG \t\ti;*/\n\tUSHORT\t\twriteLen;\n\t/*ULONG\t\tFMode = 0;*/\n\n\n\tStatus = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg);\n\n\n\t/* write firmware */\n\twriteLen = FwLen;\n#ifdef USB_FIRMWARE_MULTIBYTE_WRITE\n\tDBGPRINT(RT_DEBUG_TRACE, (\"USB_FIRMWARE_MULTIBYTE_WRITE defined! Write_Bytes = %d\\n\", MULTIWRITE_BYTES));\n\tRTUSBMultiWrite_nBytes(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen, MULTIWRITE_BYTES);\n#else\n\tDBGPRINT(RT_DEBUG_TRACE, (\"USB_FIRMWARE_MULTIBYTE_WRITE not defined!\\n\"));\n\tRTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen, FALSE);\n#endif\n\tStatus = RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff, FALSE);\n\tStatus = RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff, FALSE);\n\n\t/* change 8051 from ROM to RAM */\n\tStatus = RTUSBFirmwareRun(pAd);\n\n\n\treturn Status;\n}\n\n\nNTSTATUS\tRTUSBVenderReset(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tNTSTATUS\tStatus;\n\n\tpAd->VendorResetFlag = TRUE;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t0x01,\n\t\t0x1,\n\t\t0,\n\t\tNULL,\n\t\t0);\n\n\tpAd->VendorResetFlag = FALSE;\n\n\treturn Status;\n}\n/*\n\t========================================================================\n\n\tRoutine Description: Read various length data from RT2573\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBMultiRead(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength)\n{\n\tNTSTATUS\tStatus;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\t(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),\n\t\tDEVICE_VENDOR_REQUEST_IN,\n\t\t0x7,\n\t\t0,\n\t\tOffset,\n\t\tpData,\n\t\tlength);\n\n\treturn Status;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Write various length data to RT USB Wifi device, the maxima length should not large than 65535 bytes.\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\t\tUse this funciton carefully cause it may not stable in some special USB host controllers.\n\n\t========================================================================\n*/\nNTSTATUS RTUSBMultiWrite_nBytes(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength,\n\tIN\tUSHORT\t\t\tbatchLen)\n{\n\tNTSTATUS Status = STATUS_SUCCESS;\n\tUSHORT index = Offset, actLen = batchLen, leftLen = length;\n\tPUCHAR pSrc = pData;\n\n\n\tdo\n\t{\n\t\tactLen = (actLen > batchLen ? batchLen : actLen);\n\t\tStatus = RTUSB_VendorRequest(\n\t\t\tpAd,\n\t\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t\t0x6,\n\t\t\t0,\n\t\t\tindex,\n\t\t\tpSrc,\n\t\t\tactLen);\n\n\t\tif (Status != STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"VendrCmdMultiWrite_nBytes failed!\\n\"));\n\t\t\tbreak;\n\t\t}\n\n\t\tindex += actLen;\n\t\tleftLen -= actLen;\n\t\tpSrc = pSrc + actLen;\n\t}while(leftLen > 0);\n\n\treturn Status;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Write various length data to RT2573\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBMultiWrite_OneByte(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData)\n{\n\tNTSTATUS\tStatus;\n\n\t/* TODO: In 2870, use this funciton carefully cause it's not stable.*/\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t0x6,\n\t\t0,\n\t\tOffset,\n\t\tpData,\n\t\t1);\n\n\treturn Status;\n}\n\nNTSTATUS\tRTUSBMultiWrite(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength,\n\tIN\tBOOLEAN\t\t\tbWriteHigh)\n{\n\tNTSTATUS\tStatus;\n\n\n\tUSHORT          index = 0,Value;\n\tPUCHAR          pSrc = pData;\n\tUSHORT          resude = 0;\n\n\tresude = length % 2;\n\tlength  += resude;\n\tdo\n\t{\n\t\t\tValue =(USHORT)( *pSrc  | (*(pSrc + 1) << 8));\n\t\tStatus = RTUSBSingleWrite(pAd,Offset + index, Value, bWriteHigh);\n            index +=2;\n            length -= 2;\n            pSrc = pSrc + 2;\n        }while(length > 0);\n\n\treturn Status;\n}\n\n\nNTSTATUS RTUSBSingleWrite(\n\tIN \tRTMP_ADAPTER \t*pAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tUSHORT\t\t\tValue,\n\tIN\tBOOLEAN\t\t\tWriteHigh)\n{\n\tNTSTATUS\tStatus;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t(WriteHigh == TRUE) ? 0x10 : 0x2,\n\t\tValue,\n\t\tOffset,\n\t\tNULL,\n\t\t0);\n\n\treturn Status;\n\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Read 32-bit MAC register\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBReadMACRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUINT32\t\t\tpValue)\n{\n\tNTSTATUS\tStatus = 0;\n\tUINT32\t\tlocalVal;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\t(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),\n\t\tDEVICE_VENDOR_REQUEST_IN,\n\t\t0x7,\n\t\t0,\n\t\tOffset,\n\t\t&localVal,\n\t\t4);\n\n\t*pValue = le2cpu32(localVal);\n\n\n\tif (Status != 0)\n\t\t*pValue = 0xffffffff;\n\n\treturn Status;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Write 32-bit MAC register\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBWriteMACRegister(\n\tIN RTMP_ADAPTER *pAd,\n\tIN USHORT Offset,\n\tIN UINT32 Value,\n\tIN BOOLEAN bWriteHigh)\n{\n\tNTSTATUS Status;\n\tUINT32 localVal;\n\n\tlocalVal = Value;\n\tStatus = RTUSBSingleWrite(pAd, Offset, (USHORT)(localVal & 0xffff), bWriteHigh);\n\tStatus = RTUSBSingleWrite(pAd, Offset + 2, (USHORT)((localVal & 0xffff0000) >> 16), bWriteHigh);\n\n\treturn Status;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Read 8-bit BBP register via firmware\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBReadBBPRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tId,\n\tIN\tPUCHAR\t\t\tpValue)\n{\n\tBBP_CSR_CFG_STRUC\tBbpCsr;\n\tint i, k, ret;\n\n\n\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, ret);\n\tif (ret != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\tfor (i=0; i<MAX_BUSY_COUNT; i++)\n\t{\n\t\tRTUSBReadMACRegister(pAd, H2M_BBP_AGENT, &BbpCsr.word);\n\t\tif (BbpCsr.field.Busy == BUSY)\n\t\t\tcontinue;\n\n\t\tBbpCsr.word = 0;\n\t\tBbpCsr.field.fRead = 1;\n\t\tBbpCsr.field.BBP_RW_MODE = 1;\n\t\tBbpCsr.field.Busy = 1;\n\t\tBbpCsr.field.RegNum = Id;\n\t\tRTUSBWriteMACRegister(pAd, H2M_BBP_AGENT, BbpCsr.word, FALSE);\n\t\tAsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0, TRUE);\n\t\tfor (k=0; k<MAX_BUSY_COUNT; k++)\n\t\t{\n\t\t\tRTUSBReadMACRegister(pAd, H2M_BBP_AGENT, &BbpCsr.word);\n\t\t\tif (BbpCsr.field.Busy == IDLE)\n\t\t\t\tbreak;\n\t\t}\n\t\tif ((BbpCsr.field.Busy == IDLE) &&\n\t\t\t(BbpCsr.field.RegNum == Id))\n\t\t{\n\t\t\t*pValue = (UCHAR)BbpCsr.field.Value;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t\n\tif (BbpCsr.field.Busy == BUSY)\n\t{\n\t\tDBGPRINT_ERR((\"BBP read R%d=0x%x fail\\n\", Id, BbpCsr.word));\n\t\t*pValue = pAd->BbpWriteLatch[Id];\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\treturn STATUS_SUCCESS;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Write 8-bit BBP register via firmware\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS RTUSBWriteBBPRegister(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Id,\n\tIN UCHAR Value)\n{\n\tBBP_CSR_CFG_STRUC BbpCsr;\n\tint BusyCnt;\n\tint ret;\n\n\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, ret);\n\tif (ret != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\tfor (BusyCnt=0; BusyCnt<MAX_BUSY_COUNT; BusyCnt++)\n\t{\n\t\tRTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word);\n\t\tif (BbpCsr.field.Busy == BUSY)\n\t\t\tcontinue;\n\t\tBbpCsr.word = 0;\n\t\tBbpCsr.field.fRead = 0;\n\t\tBbpCsr.field.BBP_RW_MODE = 1;\n\t\tBbpCsr.field.Busy = 1;\n\t\tBbpCsr.field.Value = Value;\n\t\tBbpCsr.field.RegNum = Id;\n\t\tRTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);\n\t\tAsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0, TRUE);\n\t\tpAd->BbpWriteLatch[Id] = Value;\n\t\tbreak;\n\t}\n\n\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t\n\tif (BusyCnt == MAX_BUSY_COUNT)\n\t{\n\t\tDBGPRINT_ERR((\"BBP write R%d=0x%x fail\\n\", Id, BbpCsr.word));\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\treturn STATUS_SUCCESS;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description: Write RF register through MAC\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS\tRTUSBWriteRFRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUINT32\t\t\tValue)\n{\n\tRF_CSR_CFG0_STRUC PhyCsr4;\n\tUINT\t\t\ti = 0;\n\tNTSTATUS\t\tstatus;\n\n\tNdisZeroMemory(&PhyCsr4, sizeof(RF_CSR_CFG0_STRUC));\n\n\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, status);\n\tif (status != 0) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", status));\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n\tstatus = STATUS_UNSUCCESSFUL;\n\tdo\n\t{\n\t\tstatus = RTUSBReadMACRegister(pAd, RF_CSR_CFG0, &PhyCsr4.word);\n\t\tif (status >= 0)\n\t\t{\n\t\tif (!(PhyCsr4.field.Busy))\n\t\t\tbreak;\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTUSBWriteRFRegister(RF_CSR_CFG0):retry count=%d!\\n\", i));\n\t\ti++;\n\t}\n\twhile ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));\n\n\tif ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Retry count exhausted or device removed!!!\\n\"));\n\t\tgoto done;\n\t}\n\n\tRTUSBWriteMACRegister(pAd, RF_CSR_CFG0, Value, FALSE);\n\tstatus = STATUS_SUCCESS;\n\ndone:\n\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t\n\treturn status;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS RTUSBReadEEPROM(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength)\n{\n\tNTSTATUS\tStatus = STATUS_SUCCESS;\n\n\t\tStatus = RTUSB_VendorRequest(\n\t\t\tpAd,\n\t\t\t(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),\n\t\t\tDEVICE_VENDOR_REQUEST_IN,\n\t\t\t0x9,\n\t\t\t0,\n\t\t\tOffset,\n\t\t\tpData,\n\t\t\tlength);\n\n\treturn Status;\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS RTUSBWriteEEPROM(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength)\n{\n\tNTSTATUS\tStatus = STATUS_SUCCESS;\n\tUSHORT Value;\n\n\tStatus = RTUSB_VendorRequest(\n\t\t\t\tpAd,\n\t\t\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t0x8,\n\t\t\t\t0,\n\t\t\t\tOffset,\n\t\t\t\tpData,\n\t\t\t\tlength);\n\n\treturn Status;\n}\n\n\nNTSTATUS RTUSBReadEEPROM16(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\toffset,\n\tOUT\tPUSHORT\t\t\tpData)\n{\n\tNTSTATUS status;\n\tUSHORT  localData;\n\n\tstatus = RTUSBReadEEPROM(pAd, offset, (PUCHAR)(&localData), 2);\n\tif (status == STATUS_SUCCESS)\n\t\t*pData = le2cpu16(localData);\n\n\treturn status;\n\n}\n\nNTSTATUS RTUSBWriteEEPROM16(\n\tIN RTMP_ADAPTER *pAd,\n\tIN USHORT offset,\n\tIN USHORT value)\n{\n\tUSHORT tmpVal;\n\n\ttmpVal = cpu2le16(value);\n\treturn RTUSBWriteEEPROM(pAd, offset, (PUCHAR)&(tmpVal), 2);\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nVOID RTUSBPutToSleep(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUINT32\t\tvalue;\n\n\t/* Timeout 0x40 x 50us*/\n\tvalue = (SLEEPCID<<16)+(OWNERMCU<<24)+ (0x40<<8)+1;\n\tRTUSBWriteMACRegister(pAd, 0x7010, value, FALSE);\n\tRTUSBWriteMACRegister(pAd, 0x404, 0x30, FALSE);\n\t/*RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\t\t\t*/\n\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Sleep Mailbox testvalue %x\\n\", value));\n\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS RTUSBWakeUp(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tNTSTATUS\tStatus;\n\n\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t0x01,\n\t\t0x09,\n\t\t0,\n\t\tNULL,\n\t\t0);\n\n\treturn Status;\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL =\n\n\tNote:\n\n\t========================================================================\n*/\nNDIS_STATUS\tRTUSBEnqueueCmdFromNdis(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tNDIS_OID\t\tOid,\n\tIN\tBOOLEAN\t\t\tSetInformation,\n\tIN\tPVOID\t\t\tpInformationBuffer,\n\tIN\tUINT32\t\t\tInformationBufferLength)\n{\n\tNDIS_STATUS\tstatus;\n\tPCmdQElmt\tcmdqelmt = NULL;\n\tRTMP_OS_TASK\t*pTask = &pAd->cmdQTask;\n\n\n\tRTMP_OS_TASK_LEGALITY(pTask)\n\t\t;\n\telse\n\t\treturn (NDIS_STATUS_RESOURCES);\n\n\tstatus = os_alloc_mem(pAd, (PUCHAR *)(&cmdqelmt), sizeof(CmdQElmt));\n\tif ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))\n\t\treturn (NDIS_STATUS_RESOURCES);\n\n\t\tcmdqelmt->buffer = NULL;\n\t\tif (pInformationBuffer != NULL)\n\t\t{\n\t\t\tstatus = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength);\n\t\t\tif ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))\n\t\t\t{\n/*\t\t\t\tkfree(cmdqelmt);*/\n\t\t\t\tos_free_mem(NULL, cmdqelmt);\n\t\t\t\treturn (NDIS_STATUS_RESOURCES);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);\n\t\t\t\tcmdqelmt->bufferlength = InformationBufferLength;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tcmdqelmt->bufferlength = 0;\n\n\tcmdqelmt->command = Oid;\n\tcmdqelmt->CmdFromNdis = TRUE;\n\tif (SetInformation == TRUE)\n\t\tcmdqelmt->SetOperation = TRUE;\n\telse\n\t\tcmdqelmt->SetOperation = FALSE;\n\n\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\tif (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)\n\t{\n\t\tEnqueueCmd((&pAd->CmdQ), cmdqelmt);\n\t\tstatus = NDIS_STATUS_SUCCESS;\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_FAILURE;\n\t}\n\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\n\tif (status == NDIS_STATUS_FAILURE)\n\t{\n\t\tif (cmdqelmt->buffer)\n\t\t\tos_free_mem(pAd, cmdqelmt->buffer);\n\t\tos_free_mem(pAd, cmdqelmt);\n\t}\n\telse\n\tRTCMDUp(&pAd->cmdQTask);\n\n\n    return(NDIS_STATUS_SUCCESS);\n}\n\n\n/*\n    ========================================================================\n \tRoutine Description:\n\t\tRTUSB_VendorRequest - Builds a ralink specific request, sends it off to USB endpoint zero and waits for completion\n\n\tArguments:\n\t\t@pAd:\n\t  \t@TransferFlags:\n\t  \t@RequestType: USB message request type value\n\t  \t@Request: USB message request value\n\t  \t@Value: USB message value\n\t  \t@Index: USB message index value\n\t  \t@TransferBuffer: USB data to be sent\n\t  \t@TransferBufferLength: Lengths in bytes of the data to be sent\n\n\tContext: ! in atomic context\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS\n\t\tNDIS_STATUS_FAILURE\n\n\tNote:\n\t\tThis function sends a simple control message to endpoint zero\n\t\tand waits for the message to complete, or CONTROL_TIMEOUT_JIFFIES timeout.\n\t\tBecause it is synchronous transfer, so don't use this function within an atomic context,\n\t\totherwise system will hang, do be careful.\n\n\t\tTransferBuffer may located in stack region which may not in DMA'able region in some embedded platforms,\n\t\tso need to copy TransferBuffer to UsbVendorReqBuf allocated by kmalloc to do DMA transfer.\n\t\tUse UsbVendorReq_semaphore to protect this region which may be accessed by multi task.\n\t\tNormally, coherent issue is resloved by low-level HC driver, so do not flush this zone by RTUSB_VendorRequest.\n\n\t========================================================================\n*/\nNTSTATUS    RTUSB_VendorRequest(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUINT32\t\t\tTransferFlags,\n\tIN\tUCHAR\t\t\tRequestType,\n\tIN\tUCHAR\t\t\tRequest,\n\tIN\tUSHORT\t\t\tValue,\n\tIN\tUSHORT\t\t\tIndex,\n\tIN\tPVOID\t\t\tTransferBuffer,\n\tIN\tUINT32\t\t\tTransferBufferLength)\n{\n\tint\t\t\t\tRET = 0;\n\tPOS_COOKIE\t\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tif(in_interrupt())\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BUG: RTUSB_VendorRequest is called from invalid context\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SUSPEND))\n\t{\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_ERROR, (\"WIFI device has been disconnected\\n\"));*/\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\telse if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MCU has entered sleep mode\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\telse\n\t{\n\n\t\tint RetryCount = 0; /* RTUSB_CONTROL_MSG retry counts*/\n\t\tASSERT(TransferBufferLength <MAX_PARAM_BUFFER_SIZE);\n\n\t\tRTMP_SEM_EVENT_WAIT(&(pAd->UsbVendorReq_semaphore), RET);\n\t\tif (RET != 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"UsbVendorReq_semaphore get failed\\n\"));\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\n\t\tif ((TransferBufferLength > 0) && (RequestType == DEVICE_VENDOR_REQUEST_OUT))\n\t\t\tNdisMoveMemory(pAd->UsbVendorReqBuf, TransferBuffer, TransferBufferLength);\n\n\t\tdo {\n\t\t\t\tRTUSB_CONTROL_MSG(pObj->pUsb_Dev, 0, Request, RequestType, Value, Index, pAd->UsbVendorReqBuf, TransferBufferLength, CONTROL_TIMEOUT_JIFFIES, RET);\n\t\t\t\t\n\t\t\tif (RET < 0 && !pAd->VendorResetFlag) {\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"#\\n\"));\n\t\t\t\tif (RET == RTMP_USB_CONTROL_MSG_ENODEV)\n\t\t\t\t{\n\t\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tRetryCount++;\n\t\t\t\tRTMPusecDelay(5000); /* wait for 5ms*/\n\t\t\t}\n\t\t} while((RET < 0 && !pAd->VendorResetFlag) && (RetryCount < MAX_VENDOR_REQ_RETRY_COUNT));\n\n\t  \tif ( (!(RET < 0)) && (TransferBufferLength > 0) && (RequestType == DEVICE_VENDOR_REQUEST_IN))\n\t\t\tNdisMoveMemory(TransferBuffer, pAd->UsbVendorReqBuf, TransferBufferLength);\n\n\t  \tRTMP_SEM_EVENT_UP(&(pAd->UsbVendorReq_semaphore));\n\n        \tif (RET < 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTUSB_VendorRequest failed(%d),TxFlags=0x%x, ReqType=%s, Req=0x%x, Idx=0x%x,pAd->Flags=0x%lx\\n\",\n\t\t\t\t\t\tRET, TransferFlags, (RequestType == DEVICE_VENDOR_REQUEST_OUT ? \"OUT\" : \"IN\"), Request, Index, pAd->Flags));\n\t\t\tif (Request == 0x2)\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\tRequest Value=0x%04x!\\n\", Value));\n\n\t\t\tif ((!TransferBuffer) && (TransferBufferLength > 0))\n\t\t\t\thex_dump(\"Failed TransferBuffer value\", TransferBuffer, TransferBufferLength);\n\n\t\t\tif (RET == RTMP_USB_CONTROL_MSG_ENODEV)\n\t\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\n\t\t}\n\n\t}\n\n\tif (RET < 0)\n\t\treturn NDIS_STATUS_FAILURE;\n\telse\n\t\treturn NDIS_STATUS_SUCCESS;\n\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t  Creates an IRP to submite an IOCTL_INTERNAL_USB_RESET_PORT\n\t  synchronously. Callers of this function must be running at\n\t  PASSIVE LEVEL.\n\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\n\t========================================================================\n*/\nNTSTATUS RTUSB_ResetDevice(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tNTSTATUS\t\tStatus = TRUE;\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"--->USB_ResetDevice\\n\"));\n\t/*RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);*/\n\treturn Status;\n}\n\n\nNTSTATUS CheckGPIOHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\n#ifdef RALINK_ATE\n\t\tif (ATE_ON(pAd))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The driver is in ATE mode now\\n\"));\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t}\n#endif /* RALINK_ATE */\n\n#ifdef CONFIG_STA_SUPPORT\n\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tUINT32 data;\n\t\t\t/* Read GPIO pin2 as Hardware controlled radio state*/\n\n\t\t\tRTUSBReadMACRegister( pAd, GPIO_CTRL_CFG, &data);\n\n\t\t\tif (data & 0x04)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.bHwRadio = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->StaCfg.bHwRadio = FALSE;\n\t\t\t}\n\n\t\t\tif (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))\n\t\t\t{\n\t\t\t\tpAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);\n\t\t\t\tif (pAd->StaCfg.bRadio == TRUE)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"!!! Radio On !!!\\n\"));\n\n\t\t\t\t\tMlmeRadioOn(pAd);\n\t\t\t\t\t/* Update extra information                                                                                                             */\n\t\t\t\t\tpAd->ExtraInfo = EXTRA_INFO_CLEAR;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"!!! Radio Off !!!\\n\"));\n\n\t\t\t\t\tMlmeRadioOff(pAd);\n\t\t\t\t\t/* Update extra information                                                                                                             */\n\t\t\t\t\tpAd->ExtraInfo = HW_RADIO_OFF;\n\t\t\t\t}\n\t\t\t}\n\t\t} /* end IF_DEV_CONFIG_OPMODE_ON_STA*/\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS ResetBulkOutHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\n\tINT32 MACValue = 0;\n\tUCHAR Index = 0;\n\tint ret=0;\n\tPHT_TX_CONTEXT\tpHTTXContext;\n/*\tRTMP_TX_RING *pTxRing;*/\n\tunsigned long IrqFlags;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"CMDTHREAD_RESET_BULK_OUT(ResetPipeid=0x%0x)===>\\n\", pAd->bulkResetPipeid));\n\n\t/* All transfers must be aborted or cancelled before attempting to reset the pipe.\t\t\t\t\t\t*/\n\t/*RTUSBCancelPendingBulkOutIRP(pAd);*/\n\t/* Wait 10ms to let previous packet that are already in HW FIFO to clear. by MAXLEE 12-25-2007*/\n\tdo\n\t{\n\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\tbreak;\n\n\t\tRTUSBReadMACRegister(pAd, TXRXQ_PCNT, &MACValue);\n\t\tif ((MACValue & 0xf00000/*0x800000*/) == 0)\n\t\t\tbreak;\n\n\t\tIndex++;\n\t\tRTMPusecDelay(10000);\n\t}while(Index < 100);\n\n\tRTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue);\n\n\t/* 2nd, to prevent Read Register error, we check the validity.*/\n\tif ((MACValue & 0xc00000) == 0)\n\t\tRTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue);\n\n\t/* 3rd, to prevent Read Register error, we check the validity.*/\n\tif ((MACValue & 0xc00000) == 0)\n\t\tRTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue);\n\n\tMACValue |= 0x80000;\n\tRTUSBWriteMACRegister(pAd, USB_DMA_CFG, MACValue, FALSE);\n\n\t/* Wait 1ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007*/\n\tRTMPusecDelay(1000);\n\n\tMACValue &= (~0x80000);\n\tRTUSBWriteMACRegister(pAd, USB_DMA_CFG, MACValue, FALSE);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tSet 0x2a0 bit19. Clear USB DMA TX path\\n\"));\n\n\t/* Wait 5ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007*/\n\t/*RTMPusecDelay(5000);*/\n\n\tif ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\n\t\tif (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */)\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);\n\n\t\tRTUSBKickBulkOut(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tTX MGMT RECOVER Done!\\n\"));\n\t}\n\telse\n\t{\n\t\tpHTTXContext = &(pAd->TxContext[pAd->bulkResetPipeid]);\n\n\t\t/*NdisAcquireSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);*/\n\t\tRTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\t\tif ( pAd->BulkOutPending[pAd->bulkResetPipeid] == FALSE)\n\t\t{\n\t\t\tpAd->BulkOutPending[pAd->bulkResetPipeid] = TRUE;\n\t\t\tpHTTXContext->IRPPending = TRUE;\n\t\t\tpAd->watchDogTxPendingCnt[pAd->bulkResetPipeid] = 1;\n\n\t\t\t/* no matter what, clean the flag*/\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\n\t\t\t/*NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);*/\n\t\t\tRTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\n#ifdef RALINK_ATE\n\t\t\tif (ATE_ON(pAd))\n\t\t\t\tret = ATEResetBulkOut(pAd);\n\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\t{\n\t\t\t\tRTUSBInitHTTxDesc(pAd, pHTTXContext, pAd->bulkResetPipeid,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpHTTXContext->BulkOutSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\tRtmpUsbBulkOutDataPacketComplete);\n\n\t\t\t\tif ((ret = RTUSB_SUBMIT_URB(pHTTXContext->pUrb))!=0)\n\t\t\t\t{\n\t\t\t\t\t\tRTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\t\t\t\t\t\tpAd->BulkOutPending[pAd->bulkResetPipeid] = FALSE;\n\t\t\t\t\t\tpHTTXContext->IRPPending = FALSE;\n\t\t\t\t\t\tpAd->watchDogTxPendingCnt[pAd->bulkResetPipeid] = 0;\n\t\t\t\t\t\tRTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CMDTHREAD_RESET_BULK_OUT:Submit Tx URB failed %d\\n\", ret));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t\tRTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\tCMDTHREAD_RESET_BULK_OUT: TxContext[%d]:CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, pending=%d!\\n\",\n\t\t\t\t\t\t\t\t\t\t\tpAd->bulkResetPipeid, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition,\n\t\t\t\t\t\t\t\t\t\t\tpHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad,\n\t\t\t\t\t\t\t\t\t\t\tpAd->BulkOutPending[pAd->bulkResetPipeid]));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\t\\tBulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\\n\",\n\t\t\t\t\t\t\t\t\t\t\tpAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther));\n\n\t\t\t\t\t\tRTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tCMDTHREAD_RESET_BULK_OUT: Submit Tx DATA URB for failed BulkReq(0x%lx) Done, status=%d!\\n\",\n\t\t\t\t\t\t\t\t\t\t\tpAd->bulkResetReq[pAd->bulkResetPipeid],\n\t\t\t\t\t\t\t\t\t\t\tRTMP_USB_URB_STATUS_GET(pHTTXContext->pUrb)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);*/\n\t\t\t/*RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);*/\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CmdThread : TX DATA RECOVER FAIL for BulkReq(0x%lx) because BulkOutPending[%d] is TRUE!\\n\",\n\t\t\t\t\t\t\t\tpAd->bulkResetReq[pAd->bulkResetPipeid], pAd->bulkResetPipeid));\n\n\t\t\tif (pAd->bulkResetPipeid == 0)\n\t\t\t{\n\t\t\t\tUCHAR\tpendingContext = 0;\n\t\t\t\tPHT_TX_CONTEXT pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[pAd->bulkResetPipeid ]);\n\t\t\t\tPTX_CONTEXT pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa);\n\t\t\t\tPTX_CONTEXT pNULLContext = (PTX_CONTEXT)(&pAd->PsPollContext);\n\t\t\t\tPTX_CONTEXT pPsPollContext = (PTX_CONTEXT)(&pAd->NullContext[0]);\n\n\t\t\t\tif (pHTTXContext->IRPPending)\n\t\t\t\t\tpendingContext |= 1;\n\t\t\t\telse if (pMLMEContext->IRPPending)\n\t\t\t\t\tpendingContext |= 2;\n\t\t\t\telse if (pNULLContext->IRPPending)\n\t\t\t\t\tpendingContext |= 4;\n\t\t\t\telse if (pPsPollContext->IRPPending)\n\t\t\t\t\tpendingContext |= 8;\n\t\t\t\telse\n\t\t\t\t\tpendingContext = 0;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\tTX Occupied by %d!\\n\", pendingContext));\n\t\t\t}\n\n\t\t\t/* no matter what, clean the flag*/\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\n\t\t\tRTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);\n\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << pAd->bulkResetPipeid));\n\t\t}\n\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t/*RTUSBKickBulkOut(pAd);*/\n\t}\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"CmdThread : CMDTHREAD_RESET_BULK_OUT<===\\n\"));\n\treturn NDIS_STATUS_SUCCESS;\n\n\n}\n\n\n/* All transfers must be aborted or cancelled before attempting to reset the pipe.*/\nstatic NTSTATUS ResetBulkInHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tUINT32 MACValue;\n\tNTSTATUS ntStatus;\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"CmdThread : CMDTHREAD_RESET_BULK_IN === >\\n\"));\n\n#ifdef CONFIG_STA_SUPPORT\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t{\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\tATEResetBulkIn(pAd);\n\telse\n#endif /* RALINK_ATE */\n\t{\n\t\t/*while ((atomic_read(&pAd->PendingRx) > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) */\n\t\tif((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"BulkIn IRP Pending!!!\\n\"));\n\t\t\tRTUSBCancelPendingBulkInIRP(pAd);\n\t\t\tRTMPusecDelay(100000);\n\t\t\tpAd->PendingRx = 0;\n\t\t}\n\t}\n\n\t/* Wait 10ms before reading register.*/\n\tRTMPusecDelay(10000);\n\tntStatus = RTUSBReadMACRegister(pAd, MAC_CSR0, &MACValue);\n\n\t/* It must be removed. Or ATE will have no RX success. */ \n\tif ((NT_SUCCESS(ntStatus) == TRUE) &&\n\t\t\t\t(!(RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))))\n\t{\n\t\tUCHAR\ti;\n\n\t\tif (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\n\t\tpAd->NextRxBulkInPosition = pAd->RxContext[pAd->NextRxBulkInIndex].BulkInOffset;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BULK_IN_RESET: NBIIdx=0x%x,NBIRIdx=0x%x, BIRPos=0x%lx. BIReq=x%lx, BIComplete=0x%lx, BICFail0x%lx\\n\",\n\t\t\t\t\tpAd->NextRxBulkInIndex,  pAd->NextRxBulkInReadIndex, pAd->NextRxBulkInPosition, pAd->BulkInReq, pAd->BulkInComplete, pAd->BulkInCompleteFail));\n\n\t\tfor (i = 0; i < RX_RING_SIZE; i++)\n\t\t{\n \t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\tRxContext[%d]: IRPPending=%d, InUse=%d, Readable=%d!\\n\"\n\t\t\t\t\t\t\t, i, pAd->RxContext[i].IRPPending, pAd->RxContext[i].InUse, pAd->RxContext[i].Readable));\n\t\t}\n\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);\n\n\t\tfor (i = 0; i < pAd->CommonCfg.NumOfBulkInIRP; i++)\n\t\t{\n\t\t\t/*RTUSBBulkReceive(pAd);*/\n\t\t\tPRX_CONTEXT\t\tpRxContext;\n\t\t\tPURB\t\t\tpUrb;\n\t\t\tint\t\t\t\tret = 0;\n\t\t\tunsigned long\tIrqFlags;\n\n\t\t\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\t\t\tpRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);\n\n\t\t\tif ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE))\n\t\t\t{\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t\t}\n\n\t\t\tpRxContext->InUse = TRUE;\n\t\t\tpRxContext->IRPPending = TRUE;\n\t\t\tpAd->PendingRx++;\n\t\t\tpAd->BulkInReq++;\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\n\t\t\t/* Init Rx context descriptor*/\n\t\t\tRTUSBInitRxDesc(pAd, pRxContext);\n\t\t\tpUrb = pRxContext->pUrb;\n\t\t\tif ((ret = RTUSB_SUBMIT_URB(pUrb))!=0)\n\t\t\t{\t/* fail*/\n\t\t\t\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\t\t\t\tpRxContext->InUse = FALSE;\n\t\t\t\tpRxContext->IRPPending = FALSE;\n\t\t\t\tpAd->PendingRx--;\n\t\t\t\tpAd->BulkInReq--;\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CMDTHREAD_RESET_BULK_IN: Submit Rx URB failed(%d), status=%d\\n\", ret, RTMP_USB_URB_STATUS_GET(pUrb)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\t/* success*/\n\t\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\\n\", */\n\t\t\t\t/*\t\t\t\t\t\t\tpAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex));*/\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"CMDTHREAD_RESET_BULK_IN: Submit Rx URB Done, status=%d!\\n\", RTMP_USB_URB_STATUS_GET(pUrb)));\n\t\t\t\tASSERT((pRxContext->InUse == pRxContext->IRPPending));\n\t\t\t}\n\t\t}\n\n\t}\n\telse\n\t{\n\t\t/* Card must be removed*/\n\t\tif (NT_SUCCESS(ntStatus) != TRUE)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"CMDTHREAD_RESET_BULK_IN: Read Register Failed!Card must be removed!!\\n\\n\"));\n\t\t}\n\t\telse\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"CMDTHREAD_RESET_BULK_IN: Cannot do bulk in because flags(0x%lx) on !\\n\", pAd->Flags));\n\t}\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"CmdThread : CMDTHREAD_RESET_BULK_IN <===\\n\"));\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS SetAsicWcidHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRT_SET_ASIC_WCID\tSetAsicWcid;\n\tUSHORT\t\toffset;\n\tUINT32\t\tMACValue, MACRValue = 0;\n\tSetAsicWcid = *((PRT_SET_ASIC_WCID)(CMDQelmt->buffer));\n\n\tif (SetAsicWcid.WCID >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\toffset = MAC_WCID_BASE + ((UCHAR)SetAsicWcid.WCID)*HW_WCID_ENTRY_SIZE;\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = %ld, SetTid  = %lx, DeleteTid = %lx.\\n\",\n\t\t\t\t\t\tSetAsicWcid.WCID, SetAsicWcid.SetTid, SetAsicWcid.DeleteTid));\n\n\tMACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[3]<<24)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[2]<<16)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[1]<<8)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[0]);\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"1-MACValue= %x,\\n\", MACValue));\n\tRTUSBWriteMACRegister(pAd, offset, MACValue, FALSE);\n\t/* Read bitmask*/\n\tRTUSBReadMACRegister(pAd, offset+4, &MACRValue);\n\tif ( SetAsicWcid.DeleteTid != 0xffffffff)\n\t\tMACRValue &= (~SetAsicWcid.DeleteTid);\n\tif (SetAsicWcid.SetTid != 0xffffffff)\n\t\tMACRValue |= (SetAsicWcid.SetTid);\n\n\tMACRValue &= 0xffff0000;\n\tMACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[5]<<8)+pAd->MacTab.Content[SetAsicWcid.WCID].Addr[4];\n\tMACValue |= MACRValue;\n\tRTUSBWriteMACRegister(pAd, offset+4, MACValue, FALSE);\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"2-MACValue= %x,\\n\", MACValue));\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS DelAsicWcidHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRT_SET_ASIC_WCID SetAsicWcid;\n\tSetAsicWcid = *((PRT_SET_ASIC_WCID)(CMDQelmt->buffer));\n        \n\tif (SetAsicWcid.WCID >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn NDIS_STATUS_FAILURE;\n        \n        AsicDelWcidTab(pAd, (UCHAR)SetAsicWcid.WCID);\n\n        return NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS SetWcidSecInfoHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_ASIC_WCID_SEC_INFO pInfo;\n\n\tpInfo = (PRT_ASIC_WCID_SEC_INFO)CMDQelmt->buffer;\n\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\t\t pInfo->BssIdx,\n\t\t\t\t\t\t\t pInfo->KeyIdx,\n\t\t\t\t\t\t\t pInfo->CipherAlg,\n\t\t\t\t\t\t\t pInfo->Wcid,\n\t\t\t\t\t\t\t pInfo->KeyTabFlag);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS SetAsicWcidIVEIVHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_ASIC_WCID_IVEIV_ENTRY pInfo;\n\n\tpInfo = (PRT_ASIC_WCID_IVEIV_ENTRY)CMDQelmt->buffer;\n\tAsicUpdateWCIDIVEIV(pAd,\n\t\t\t\t\t\t  pInfo->Wcid,\n\t\t\t\t\t\t  pInfo->Iv,\n\t\t\t\t\t\t  pInfo->Eiv);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS SetAsicWcidAttrHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_ASIC_WCID_ATTR_ENTRY pInfo;\n\n\tpInfo = (PRT_ASIC_WCID_ATTR_ENTRY)CMDQelmt->buffer;\n\tAsicUpdateWcidAttributeEntry(pAd,\n\t\t\t\t\t\t\t\t  pInfo->BssIdx,\n\t\t\t\t\t\t\t\t  pInfo->KeyIdx,\n\t\t\t\t\t\t\t\t  pInfo->CipherAlg,\n\t\t\t\t\t\t\t\t  pInfo->Wcid,\n\t\t\t\t\t\t\t\t  pInfo->KeyTabFlag);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS SETAsicSharedKeyHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_ASIC_SHARED_KEY pInfo;\n\n\tpInfo = (PRT_ASIC_SHARED_KEY)CMDQelmt->buffer;\n\tAsicAddSharedKeyEntry(pAd,\n\t\t\t\t\t\t       pInfo->BssIndex,\n\t\t\t\t\t\t\tpInfo->KeyIdx,\n\t\t\t\t\t\t\t&pInfo->CipherKey);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS SetAsicPairwiseKeyHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_ASIC_PAIRWISE_KEY pInfo;\n\n\tpInfo = (PRT_ASIC_PAIRWISE_KEY)CMDQelmt->buffer;\n\tAsicAddPairwiseKeyEntry(pAd,\n\t\t\t\t\t\t\t pInfo->WCID,\n\t\t\t\t\t\t\t &pInfo->CipherKey);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n#ifdef CONFIG_STA_SUPPORT\nstatic NTSTATUS SetPortSecuredHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tSTA_PORT_SECURED(pAd);\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nstatic NTSTATUS RemovePairwiseKeyHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tUCHAR Wcid = *((PUCHAR)(CMDQelmt->buffer));\n\n\tAsicRemovePairwiseKeyEntry(pAd, Wcid);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS SetClientMACEntryHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_SET_ASIC_WCID pInfo;\n\n\tpInfo = (PRT_SET_ASIC_WCID)CMDQelmt->buffer;\n\tAsicUpdateRxWCIDTable(pAd, pInfo->WCID, pInfo->Addr);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS UpdateProtectHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tPRT_ASIC_PROTECT_INFO pAsicProtectInfo;\n\n\tpAsicProtectInfo = (PRT_ASIC_PROTECT_INFO)CMDQelmt->buffer;\n\tAsicUpdateProtect(pAd, pAsicProtectInfo->OperationMode, pAsicProtectInfo->SetMask,\n\t\t\t\t\t\t\tpAsicProtectInfo->bDisableBGProtect, pAsicProtectInfo->bNonGFExist);\n\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\nstatic NTSTATUS APUpdateCapabilityAndErpieHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tAPUpdateCapabilityAndErpIe(pAd);\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\nstatic NTSTATUS _802_11_CounterMeasureHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tMAC_TABLE_ENTRY *pEntry;\n\n\t\tpEntry = (MAC_TABLE_ENTRY *)CMDQelmt->buffer;\n\t\tHandleCounterMeasure(pAd, pEntry);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nstatic NTSTATUS SetPSMBitHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tUSHORT *pPsm = (USHORT *)CMDQelmt->buffer;\n\t\tMlmeSetPsmBit(pAd, *pPsm);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS ForceWakeUpHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tAsicForceWakeup(pAd, TRUE);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS ForceSleepAutoWakeupHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tUSHORT  TbttNumToNextWakeUp;\n\tUSHORT  NextDtim = pAd->StaCfg.DtimPeriod;\n\tULONG   Now;\n\n\tNdisGetSystemUpTime(&Now);\n\tNextDtim -= (USHORT)(Now - pAd->StaCfg.LastBeaconRxTime)/pAd->CommonCfg.BeaconPeriod;\n\n\tTbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount;\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim))\n\t\tTbttNumToNextWakeUp = NextDtim;\n\n\tRTMP_SET_PSM_BIT(pAd, PWR_SAVE);\n\n\t/* if WMM-APSD is failed, try to disable following line*/\n\tAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nNTSTATUS QkeriodicExecutHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tStaQuickResponeForRateUpExec(NULL, pAd, NULL, NULL);\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* CONFIG_STA_SUPPORT*/\n\n\n#ifdef CONFIG_AP_SUPPORT\nstatic NTSTATUS APEnableTXBurstHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tEDCA_AC_CFG_STRUC Ac0Cfg;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CmdThread::CMDTHREAD_AP_ENABLE_TX_BURST  \\n\"));\n\n\t\tRTUSBReadMACRegister(pAd, EDCA_AC0_CFG, &Ac0Cfg.word);\n\t\tAc0Cfg.field.AcTxop = 0x20;\n\t\tRTUSBWriteMACRegister(pAd, EDCA_AC0_CFG, Ac0Cfg.word, FALSE);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS APDisableTXBurstHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tEDCA_AC_CFG_STRUC Ac0Cfg;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CmdThread::CMDTHREAD_AP_DISABLE_TX_BURST  \\n\"));\n\n\t\tRTUSBReadMACRegister(pAd, EDCA_AC0_CFG, &Ac0Cfg.word);\n\t\tAc0Cfg.field.AcTxop = 0x0;\n\t\tRTUSBWriteMACRegister(pAd, EDCA_AC0_CFG, Ac0Cfg.word, FALSE);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS APAdjustEXPAckTimeHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CmdThread::CMDTHREAD_AP_ADJUST_EXP_ACK_TIME  \\n\"));\n\t\tRTUSBWriteMACRegister(pAd, EXP_ACK_TIME, 0x005400ca, FALSE);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nstatic NTSTATUS APRecoverEXPAckTimeHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CmdThread::CMDTHREAD_AP_RECOVER_EXP_ACK_TIME  \\n\"));\n\t\tRTUSBWriteMACRegister(pAd, EXP_ACK_TIME, 0x002400ca, FALSE);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef LED_CONTROL_SUPPORT\nstatic NTSTATUS SetLEDStatusHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tUCHAR LEDStatus = *((PUCHAR)(CMDQelmt->buffer));\n\n\tRTMPSetLEDStatus(pAd, LEDStatus);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: CMDTHREAD_SET_LED_STATUS (LEDStatus = %d)\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, LEDStatus));\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* LED_CONTROL_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n/*WPS LED MODE 10*/\nstatic NTSTATUS LEDWPSMode10Hdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tUINT WPSLedMode10 = *((PUINT)(CMDQelmt->buffer));\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"WPS LED mode 10::ON or Flash or OFF : %x\\n\", WPSLedMode10));\n\n\tswitch(WPSLedMode10)\n\t{\n\t\tcase LINK_STATUS_WPS_MODE10_TURN_ON:\n\t\t\tRTMPSetLEDStatus(pAd, LED_WPS_MODE10_TURN_ON);\n\t\t\tbreak;\n\t\tcase LINK_STATUS_WPS_MODE10_FLASH:\n\t\t\tRTMPSetLEDStatus(pAd,LED_WPS_MODE10_FLASH);\n\t\t\tbreak;\n\t\tcase LINK_STATUS_WPS_MODE10_TURN_OFF:\n\t\t\tRTMPSetLEDStatus(pAd, LED_WPS_MODE10_TURN_OFF);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"WPS LED mode 10:: No this status %d!!!\\n\", WPSLedMode10));\n\t\t\tbreak;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n\n#ifdef CONFIG_AP_SUPPORT\nstatic NTSTATUS ChannelRescanHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"cmd> Re-scan channel! \\n\"));\n\n\tpAd->CommonCfg.Channel = AP_AUTO_CH_SEL(pAd, TRUE);\n#ifdef DOT11_N_SUPPORT\n\t/* If WMODE_CAP_N(phymode) and BW=40 check extension channel, after select channel  */\n\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"cmd> Switch to %d! \\n\", pAd->CommonCfg.Channel));\n\tAPStop(pAd);\n\tAPStartUp(pAd);\n\n#ifdef AP_QLOAD_SUPPORT\n\tQBSS_LoadAlarmResume(pAd);\n#endif /* AP_QLOAD_SUPPORT */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* CONFIG_AP_SUPPORT*/\n\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\nstatic NTSTATUS RegHintHdlr (IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRT_CFG80211_CRDA_REG_HINT(pAd, CMDQelmt->buffer, CMDQelmt->bufferlength);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS RegHint11DHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRT_CFG80211_CRDA_REG_HINT11D(pAd, CMDQelmt->buffer, CMDQelmt->bufferlength);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS RT_Mac80211_ScanEnd(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRT_CFG80211_SCAN_END(pAd, FALSE);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic NTSTATUS RT_Mac80211_ConnResultInfom(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRT_CFG80211_CONN_RESULT_INFORM(pAd,\n\t\t\t\t\t\t\t\tpAd->MlmeAux.Bssid,\n\t\t\t\t\t\t\t\tCMDQelmt->buffer, CMDQelmt->bufferlength,\n\t\t\t\t\t\t\t\tCMDQelmt->buffer, CMDQelmt->bufferlength,\n\t\t\t\t\t\t\t\t1);\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\n#ifdef P2P_SUPPORT\nstatic NTSTATUS SetP2pLinkDown(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* P2P_SUPPORT */\n\n\n#ifdef STREAM_MODE_SUPPORT\nstatic NTSTATUS UpdateTXChainAddress(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tAsicUpdateTxChainAddress(pAd, CMDQelmt->buffer);\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef RLT_MAC\nextern CMD_RSP_HANDLER CmdRspHandlerTable[];\n\nstatic NTSTATUS CmdRspEventCallback(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)\n{\n\tRXFCE_INFO_CMD *pFceInfo = CMDQelmt->buffer;\n\n\t(*CmdRspHandlerTable[pFceInfo->evt_type])(pAd, CMDQelmt->buffer + sizeof(*pFceInfo));\n\t\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif /* RLT_MAC */\n\ntypedef NTSTATUS (*CMDHdlr)(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt);\n\nstatic CMDHdlr CMDHdlrTable[] = {\n\tResetBulkOutHdlr,\t\t\t\t/* CMDTHREAD_RESET_BULK_OUT*/\n\tResetBulkInHdlr,\t\t\t\t\t/* CMDTHREAD_RESET_BULK_IN*/\n\tCheckGPIOHdlr,\t\t\t\t\t/* CMDTHREAD_CHECK_GPIO\t*/\n\tSetAsicWcidHdlr,\t\t\t\t\t/* CMDTHREAD_SET_ASIC_WCID*/\n\tDelAsicWcidHdlr,\t\t\t\t\t/* CMDTHREAD_DEL_ASIC_WCID*/\n\tSetClientMACEntryHdlr,\t\t\t/* CMDTHREAD_SET_CLIENT_MAC_ENTRY*/\n\n#ifdef CONFIG_STA_SUPPORT\n\tSetPSMBitHdlr,\t\t\t\t\t/* CMDTHREAD_SET_PSM_BIT*/\n\tForceWakeUpHdlr,\t\t\t\t/* CMDTHREAD_FORCE_WAKE_UP*/\n\tForceSleepAutoWakeupHdlr,\t\t/* CMDTHREAD_FORCE_SLEEP_AUTO_WAKEUP*/\n\tQkeriodicExecutHdlr,\t\t\t\t/* CMDTHREAD_QKERIODIC_EXECUT*/\n#else\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL,\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tAPUpdateCapabilityAndErpieHdlr,\t/* CMDTHREAD_AP_UPDATE_CAPABILITY_AND_ERPIE*/\n\tAPEnableTXBurstHdlr,\t\t\t/* CMDTHREAD_AP_ENABLE_TX_BURST*/\n\tAPDisableTXBurstHdlr,\t\t\t/* CMDTHREAD_AP_DISABLE_TX_BURST*/\n\tAPAdjustEXPAckTimeHdlr,\t\t/* CMDTHREAD_AP_ADJUST_EXP_ACK_TIME*/\n\tAPRecoverEXPAckTimeHdlr,\t\t/* CMDTHREAD_AP_RECOVER_EXP_ACK_TIME*/\n\tChannelRescanHdlr,\t\t\t\t/* CMDTHREAD_CHAN_RESCAN*/\n#else\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL,\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n\tSetLEDStatusHdlr,\t\t\t/* CMDTHREAD_SET_LED_STATUS*/\n#else\n    NULL,\n#endif /* LED_CONTROL_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n\tLEDWPSMode10Hdlr,\t\t\t\t/* CMDTHREAD_LED_WPS_MODE10*/\n#else\n\tNULL,\n#endif /* WSC_LED_SUPPORT */\n\n#else\n\tNULL,\n#endif /* WSC_INCLUDED */\n\n\t/* Security related */\n\tSetWcidSecInfoHdlr,\t\t\t\t/* CMDTHREAD_SET_WCID_SEC_INFO*/\n\tSetAsicWcidIVEIVHdlr,\t\t\t/* CMDTHREAD_SET_ASIC_WCID_IVEIV*/\n\tSetAsicWcidAttrHdlr,\t\t\t\t/* CMDTHREAD_SET_ASIC_WCID_ATTR*/\n\tSETAsicSharedKeyHdlr,\t\t\t/* CMDTHREAD_SET_ASIC_SHARED_KEY*/\n\tSetAsicPairwiseKeyHdlr,\t\t\t/* CMDTHREAD_SET_ASIC_PAIRWISE_KEY*/\n\tRemovePairwiseKeyHdlr,\t\t\t/* CMDTHREAD_REMOVE_PAIRWISE_KEY*/\n\n#ifdef CONFIG_STA_SUPPORT\n\tSetPortSecuredHdlr,\t\t\t\t/* CMDTHREAD_SET_PORT_SECURED*/\n#else\n\tNULL,\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t_802_11_CounterMeasureHdlr,\t/* CMDTHREAD_802_11_COUNTER_MEASURE*/\n#else\n\tNULL,\n#endif /* CONFIG_AP_SUPPORT */\n\n\tUpdateProtectHdlr,\t\t\t\t/* CMDTHREAD_UPDATE_PROTECT*/\n\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n\tRegHintHdlr,\n\tRegHint11DHdlr,\n\tRT_Mac80211_ScanEnd,\n\tRT_Mac80211_ConnResultInfom,\n#else\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL,\n#endif /* RT_CFG80211_SUPPORT */\n\n#else\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL,\n#endif /* LINUX */\n\n#ifdef P2P_SUPPORT\n\tSetP2pLinkDown,\t\t\t/* CMDTHREAD_SET_P2P_LINK_DOWN */\n#else\n\tNULL,\n#endif /* P2P_SUPPORT */\n\n\tNULL,\n\n#ifdef STREAM_MODE_SUPPORT\n\tUpdateTXChainAddress, /* CMDTHREAD_UPDATE_TX_CHAIN_ADDRESS */\n#else\n\tNULL,\n#endif\n\n#ifdef RLT_MAC\n\tCmdRspEventCallback, /* CMDTHREAD_RESPONSE_EVENT_CALLBACK */\n#endif /* RLT_MAC */\n};\n\n\nstatic inline BOOLEAN ValidCMD(IN PCmdQElmt CMDQelmt)\n{\n\tSHORT CMDIndex = CMDQelmt->command - CMDTHREAD_FIRST_CMD_ID;\n\tUSHORT CMDHdlrTableLength= sizeof(CMDHdlrTable) / sizeof(CMDHdlr);\n\n\tif ( (CMDIndex >= 0) && (CMDIndex < CMDHdlrTableLength))\n\t{\n\t\tif (CMDHdlrTable[CMDIndex] > 0)\n\t\t\treturn TRUE;\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"No corresponding CMDHdlr for this CMD(%x)\\n\",  CMDQelmt->command));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CMD(%x) is out of boundary\\n\", CMDQelmt->command));\n\t\treturn FALSE;\n\t}\n}\n\n\nVOID CMDHandler(\n    IN PRTMP_ADAPTER pAd)\n{\n\tPCmdQElmt\t\tcmdqelmt;\n\tNDIS_STATUS\t\tNdisStatus = NDIS_STATUS_SUCCESS;\n\tNTSTATUS\t\tntStatus;\n/*\tunsigned long\tIrqFlags;*/\n\n\twhile (pAd && pAd->CmdQ.size > 0)\n\t{\n\t\tNdisStatus = NDIS_STATUS_SUCCESS;\n\n\t\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\t\tRTThreadDequeueCmd(&pAd->CmdQ, &cmdqelmt);\n\t\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\n\t\tif (cmdqelmt == NULL)\n\t\t\tbreak;\n\n\n\t\tif(!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)))\n\t\t{\n\t\t\tif(ValidCMD(cmdqelmt))\n\t\t\t\tntStatus = (*CMDHdlrTable[cmdqelmt->command - CMDTHREAD_FIRST_CMD_ID])(pAd, cmdqelmt);\n\t\t}\n\n\t\tif (cmdqelmt->CmdFromNdis == TRUE)\n\t\t{\n\t\t\tif (cmdqelmt->buffer != NULL)\n\t\t\t\tos_free_mem(pAd, cmdqelmt->buffer);\n\t\t\tos_free_mem(pAd, cmdqelmt);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((cmdqelmt->buffer != NULL) && (cmdqelmt->bufferlength != 0))\n\t\t\t\tos_free_mem(pAd, cmdqelmt->buffer);\n\t\t\tos_free_mem(pAd, cmdqelmt);\n\t\t}\n\t}\t/* end of while */\n}\n\n\nVOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)\n{\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tint \t\t\t\t\tidx;\n\tULONG\t\t\t\tirqFlags;\n\tPURB\t\t   \t\tpUrb;\n\tBOOLEAN\t\t\t\tneedDumpSeq = FALSE;\n\tUINT32          \tMACValue;\n\n\treturn;\n\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn;\n\n#ifdef CONFIG_STA_SUPPORT\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\treturn;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tidx = 0;\n\tRTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);\n\tif ((MACValue & 0xff) !=0 )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\\n\", MACValue));\n\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012);\n\t\twhile((MACValue &0xff) != 0 && (idx++ < 10))\n\t\t{\n\t\t        RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);\n\t\t        RTMPusecDelay(1);\n\t\t}\n\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);\n\t}\n\n\tidx = 0;\n\tif ((MACValue & 0xff00) !=0 )\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TX QUEUE 1 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\\n\", MACValue));\n\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, 0xf4000a);\n\t\twhile((MACValue &0xff00) != 0 && (idx++ < 10))\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);\n\t\t\tRTMPusecDelay(1);\n\t\t}\n\t\tRTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);\n\t}\n\n\n\tif (pAd->watchDogRxOverFlowCnt >= 2)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\\n\"));\n\t\tif ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_BULKIN_RESET |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST))))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\\n\"));\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);\n\t\t\tneedDumpSeq = TRUE;\n\t\t}\n\t\tpAd->watchDogRxOverFlowCnt = 0;\n\t}\n\n\n\tfor (idx = 0; idx < NUM_OF_TX_RING; idx++)\n\t{\n\t\tpUrb = NULL;\n\n\t\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags);\n/*\t\tif ((pAd->BulkOutPending[idx] == TRUE) && pAd->watchDogTxPendingCnt)*/\n\t\tif (pAd->BulkOutPending[idx] == TRUE)\n\t\t{\n\t\t\tpAd->watchDogTxPendingCnt[idx]++;\n\n\t\t\tif ((pAd->watchDogTxPendingCnt[idx] > 2) &&\n\t\t\t\t (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t\t\t)\n\t\t\t{\n\t\t\t\t/* FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it!*/\n\t\t\t\tpHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[idx]);\n\t\t\t\tif (pHTTXContext->IRPPending)\n\t\t\t\t{\t/* Check TxContext.*/\n\t\t\t\t\tpUrb = pHTTXContext->pUrb;\n\t\t\t\t}\n\t\t\t\telse if (idx == MGMTPIPEIDX)\n\t\t\t\t{\n\t\t\t\t\tPTX_CONTEXT pMLMEContext, pNULLContext, pPsPollContext;\n\n\t\t\t\t\t/*Check MgmtContext.*/\n\t\t\t\t\tpMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa);\n\t\t\t\t\tpPsPollContext = (PTX_CONTEXT)(&pAd->PsPollContext);\n\t\t\t\t\tpNULLContext = (PTX_CONTEXT)(&pAd->NullContext[0]);\n\n\t\t\t\t\tif (pMLMEContext->IRPPending)\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(pMLMEContext->IRPPending);\n\t\t\t\t\t\tpUrb = pMLMEContext->pUrb;\n\t\t\t\t\t}\n\t\t\t\t\telse if (pNULLContext->IRPPending)\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(pNULLContext->IRPPending);\n\t\t\t\t\t\tpUrb = pNULLContext->pUrb;\n\t\t\t\t\t}\n\t\t\t\t\telse if (pPsPollContext->IRPPending)\n\t\t\t\t\t{\n\t\t\t\t\t\tASSERT(pPsPollContext->IRPPending);\n\t\t\t\t\t\tpUrb = pPsPollContext->pUrb;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\\n\", idx));\n\t\t\t\tif (pUrb)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Unlink the pending URB!\\n\"));\n\t\t\t\t\t/* unlink it now*/\n\t\t\t\t\tRTUSB_UNLINK_URB(pUrb);\n\t\t\t\t\t/* Sleep 200 microseconds to give cancellation time to work*/\n\t\t\t\t\tRTMPusecDelay(200);\n\t\t\t\t\tneedDumpSeq = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);\n\t\t}\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\t/* For Sigma debug, dump the ba_reordering sequence.*/\n\tif((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0))\n\t{\n\t\tUSHORT\t\t\t\tIdx;\n\t\tPBA_REC_ENTRY\t\tpBAEntry = NULL;\n\t\tUCHAR\t\t\t\tcount = 0;\n\t\tstruct reordering_mpdu *mpdu_blk;\n\n\t\tIdx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0];\n\n\t\tpBAEntry = &pAd->BATable.BARecEntry[Idx];\n\t\tif((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NICUpdateRawCounters():The Queueing pkt in reordering buffer:\\n\"));\n\t\t\tNdisAcquireSpinLock(&pBAEntry->RxReRingLock);\n\t\t\tmpdu_blk = pBAEntry->list.next;\n\t\t\twhile (mpdu_blk)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\t%d:Seq-%d, bAMSDU-%d!\\n\", count, mpdu_blk->Sequence, mpdu_blk->bAMSDU));\n\t\t\t\tmpdu_blk = mpdu_blk->next;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\npBAEntry->LastIndSeq=%d!\\n\", pBAEntry->LastIndSeq));\n\t\t\tNdisReleaseSpinLock(&pBAEntry->RxReRingLock);\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n}\n\n#endif /* RTMP_MAC_USB */\n"
  },
  {
    "path": "src/common/scan.c",
    "content": "/*\n\n*/\n\n#include \"rt_config.h\"\n\n#ifdef P2P_SUPPORT\nextern UCHAR\tWILDP2PSSID[];\nextern UCHAR\tWILDP2PSSIDLEN;\n#endif /* P2P_SUPPORT */\n\n#ifdef SCAN_SUPPORT\nstatic INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tUSHORT Status;\n#endif /* CONFIG_STA_SUPPORT */\n\tINT bw, ch;\n\t\t\n\tif (pAd->CommonCfg.BBPCurrentBW != pAd->hw_cfg.bbp_bw)\n\t{\t\n\t\trtmp_bbp_set_bw(pAd, pAd->hw_cfg.bbp_bw);\n\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);\n\n\t\tch = pAd->CommonCfg.CentralChannel;\n\t}\n\telse\n\t{\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\tch = pAd->CommonCfg.Channel;\n\n\t}\n\n\tswitch(pAd->CommonCfg.BBPCurrentBW)\n\t{\n\t\tcase BW_80:\n\t\t\tbw = 80;\n\t\t\tbreak;\n\t\tcase BW_40:\n\t\t\tbw = 40;\n\t\t\tbreak;\n\t\tcase BW_10:\n\t\t\tbw = 10;\n\t\t\tbreak;\n\t\tcase BW_20:\n\t\tdefault:\n\t\t\tbw =20;\n\t\t\tbreak;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - End of SCAN, restore to %dMHz channel %d, Total BSS[%02d]\\n\",\n\t\t\t\tbw, ch, pAd->ScanTab.BssNr));\n\t\t\n#ifdef CONFIG_STA_SUPPORT\n\tif (OpMode == OPMODE_STA)\n\t{\n\t\t/*\n\t\tIf all peer Ad-hoc clients leave, driver would do LinkDown and LinkUp.\n\t\tIn LinkUp, CommonCfg.Ssid would copy SSID from MlmeAux. \n\t\tTo prevent SSID is zero or wrong in Beacon, need to recover MlmeAux.SSID here.\n\t\t*/\n\t\tif (ADHOC_ON(pAd))\n\t\t{\n\t\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\t\tpAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;\n\t\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\t}\n\n\n\t\t/*\n\t\tTo prevent data lost.\n\t\tSend an NULL data with turned PSM bit on to current associated AP before SCAN progress.\n\t\tNow, we need to send an NULL data with turned PSM bit off to AP, when scan progress done \n\t\t*/\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))\n\t\t{\n\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\tpAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s -- Send null frame\\n\", __FUNCTION__));\n\t\t}\n\n\t\t/* keep the latest scan channel, could be 0 for scan complete, or other channel*/\n\t\tpAd->StaCfg.LastScanChannel = pAd->MlmeAux.Channel;\n\n\t\tpAd->StaCfg.ScanChannelCnt = 0;\n\n\t\t/* Suspend scanning and Resume TxData for Fast Scanning*/\n\t\tif ((pAd->MlmeAux.Channel != 0) &&\n\t\t(pAd->StaCfg.bImprovedScan))\t/* it is scan pending*/\n\t\t{\n\t\t\tpAd->Mlme.SyncMachine.CurrState = SCAN_PENDING;\n\t\t\tStatus = MLME_SUCCESS;\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"bFastRoamingScan ~~~ Get back to send data ~~~\\n\"));\n\n\t\t\tRTMPResumeMsduTransmission(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->StaCfg.BssNr = pAd->ScanTab.BssNr;\n\t\t\tpAd->StaCfg.bImprovedScan = FALSE;\n\n\t\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\t\tStatus = MLME_SUCCESS;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_SCAN_END, NULL, 0);\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (OpMode == OPMODE_AP)\n\t{\n#ifdef P2P_APCLI_SUPPORT\n\t\t/* P2P CLIENT in WSC Scan or Re-Connect scanning. */\n\t\tif (P2P_CLI_ON(pAd) && (ApScanRunning(pAd) == TRUE))\n\t\t{\n\t\t\t/*MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, 0);*/\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::  Scan Done! reset APCLI CTRL State Machine!\\n\", __FUNCTION__));\n\t\t\tpAd->ApCfg.ApCliTab[0].CtrlCurrState = APCLI_CTRL_DISCONNECTED;\n\t\t}\n#endif /* P2P_APCLI_SUPPORT */\n\n\t\tpAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;\n\t\tRTMPResumeMsduTransmission(pAd);\n\n\t\t/* iwpriv set auto channel selection*/\n\t\t/* scanned all channels*/\n\t\tif (pAd->ApCfg.bAutoChannelAtBootup==TRUE)\n\t\t{\n\t\t\tpAd->CommonCfg.Channel = SelectBestChannel(pAd, pAd->ApCfg.AutoChannelAlg);\n\t\t\tpAd->ApCfg.bAutoChannelAtBootup = FALSE;\n#ifdef DOT11_N_SUPPORT\n\t\t\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\t\tAPStop(pAd);\n\t\t\tAPStartUp(pAd);\n\t\t}\n\n\t\tif (!((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == TRUE)))\n\t\t\tAsicEnableBssSync(pAd);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\treturn TRUE;\n}\n\n\n\nstatic INT scan_active(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType)\n{\n\tUCHAR *frm_buf = NULL;\n\tHEADER_802_11 Hdr80211;\n\tULONG FrameLen = 0;\n\tUCHAR SsidLen = 0;\n#ifdef CONFIG_STA_SUPPORT\n\tUSHORT Status;\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\tif (MlmeAllocateMemory(pAd, &frm_buf) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - ScanNextChannel() allocate memory fail\\n\"));\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (OpMode == OPMODE_STA)\n\t\t{\n\t\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\t\tStatus = MLME_FAIL_NO_RESOURCE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (OpMode == OPMODE_AP)\n\t\t\tpAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;\n#endif /* CONFIG_AP_SUPPORT */\n\t\treturn FALSE;\n\t}\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif (ScanType == SCAN_2040_BSS_COEXIST)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC - SCAN_2040_BSS_COEXIST !! Prepare to send Probe Request\\n\"));\n\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\n\t/* There is no need to send broadcast probe request if active scan is in effect.*/\n\tSsidLen = 0;\n\tif ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE)\n#ifdef WSC_STA_SUPPORT\n\t\t|| ((ScanType == SCAN_WSC_ACTIVE) && (OpMode == OPMODE_STA))\n#endif /* WSC_STA_SUPPORT */\n\t\t)\n\t\tSsidLen = pAd->MlmeAux.SsidLen;\n\n#ifdef P2P_SUPPORT\n\tif ((pAd->MlmeAux.ScanType == SCAN_P2P) || (pAd->MlmeAux.ScanType == SCAN_P2P_SEARCH)\n#ifdef P2P_APCLI_SUPPORT\n\t\t || ((pAd->MlmeAux.ScanType == SCAN_WSC_ACTIVE) && (OpMode == OPMODE_AP) && (P2P_CLI_ON(pAd)))\n#endif /* P2P_APCLI_SUPPORT */\n\t)\n\t{\n\t\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\t\tUCHAR\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\t\tUCHAR\t\tSupRateLen = 0;\n\n\t\tSsidLen = WILDP2PSSIDLEN; /* Use Wildword SSID */\n\t\tSupRate[0]\t= 0x8C;    /* 6 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[1]\t= 0x12;    /* 9 mbps, in units of 0.5 Mbps */\n\t\tSupRate[2]\t= 0x98;    /* 12 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[3]\t= 0x24;    /* 18 mbps, in units of 0.5 Mbps */\n\t\tSupRate[4]\t= 0xb0;    /* 24 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[5]\t= 0x48;    /* 36 mbps, in units of 0.5 Mbps */\n\t\tSupRate[6]\t= 0x60;    /* 48 mbps, in units of 0.5 Mbps */\n\t\tSupRate[7]\t= 0x6c;    /* 54 mbps, in units of 0.5 Mbps */\n\t\tSupRateLen\t= 8;\n\t\t/* P2P scan must use P2P mac address. */\n\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR,\n\t\t\t\t\t\t\tpP2PCtrl->CurrentAddress,\n\t\t\t\t\t\t\tBROADCAST_ADDR);\n\n\t\tMakeOutgoingFrame(frm_buf,\t\t\t\t&FrameLen,\n\t\t\t\t\t\t\tsizeof(HEADER_802_11),\t&Hdr80211,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t&SsidIe,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t&SsidLen,\n\t\t\t\t\t\t\tSsidLen,\t\t\t\t\t&WILDP2PSSID[0],\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t&SupRateIe,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t&SupRateLen,\n\t\t\t\t\t\t\tSupRateLen, \t\t\tSupRate, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t/*IF_DEV_CONFIG_OPMODE_ON_AP(pAd) */\n\t\tif (OpMode == OPMODE_AP)\n\t\t{\n\t\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[0].Bssid);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t/*IF_DEV_CONFIG_OPMODE_ON_STA(pAd) */\n\t\tif (OpMode == OPMODE_STA)\n\t\t{\n\t\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tBROADCAST_ADDR);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tMakeOutgoingFrame(frm_buf,               &FrameLen,\n\t\t\t\t\t\t  sizeof(HEADER_802_11),    &Hdr80211,\n\t\t\t\t\t\t  1,                        &SsidIe,\n\t\t\t\t\t\t  1,                        &SsidLen,\n\t\t\t\t\t\t  SsidLen,\t\t\t        pAd->MlmeAux.Ssid,\n\t\t\t\t\t\t  1,                        &SupRateIe,\n\t\t\t\t\t\t  1,                        &pAd->CommonCfg.SupRateLen,\n\t\t\t\t\t\t  pAd->CommonCfg.SupRateLen,  pAd->CommonCfg.SupRate, \n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\tif (pAd->CommonCfg.ExtRateLen)\n\t\t{\n\t\t\tULONG Tmp;\n\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,            &Tmp,\n\t\t\t\t\t\t\t  1,                                &ExtRateIe,\n\t\t\t\t\t\t\t  1,                                &pAd->CommonCfg.ExtRateLen,\n\t\t\t\t\t\t\t  pAd->CommonCfg.ExtRateLen,          pAd->CommonCfg.ExtRate, \n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += Tmp;\n\t\t}\n\t}\n#ifdef DOT11_N_SUPPORT\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tULONG\tTmp;\n\t\tUCHAR\tHtLen;\n\t\tUCHAR\tBROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};\n#ifdef RT_BIG_ENDIAN\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n#endif\n\t\tif (pAd->bBroadComHT == TRUE)\n\t\t{\n\t\t\tHtLen = pAd->MlmeAux.HtCapabilityLen + 4;\n#ifdef RT_BIG_ENDIAN\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);\n\t\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t{\n\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t}\n#else\t\t\t\t\n\t\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,          &Tmp,\n\t\t\t\t\t\t\t1,                                &WpaIe,\n\t\t\t\t\t\t\t1,                                &HtLen,\n\t\t\t\t\t\t\t4,                                &BROADCOM[0],\n\t\t\t\t\t\t\tpAd->MlmeAux.HtCapabilityLen,     &HtCapabilityTmp, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n#else\n\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,          &Tmp,\n\t\t\t\t\t\t\t1,                                &WpaIe,\n\t\t\t\t\t\t\t1,                                &HtLen,\n\t\t\t\t\t\t\t4,                                &BROADCOM[0],\n\t\t\t\t\t\t\tpAd->MlmeAux.HtCapabilityLen,     &pAd->MlmeAux.HtCapability, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n#endif /* RT_BIG_ENDIAN */\n\t\t}\n\t\telse\t\t\t\t\n\t\t{\n\t\t\tHtLen = sizeof(HT_CAPABILITY_IE);\n#ifdef RT_BIG_ENDIAN\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, SIZE_HT_CAP_IE);\n\t\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n#ifdef UNALIGNMENT_SUPPORT\n\t\t\t{\n\t\t\t\tEXT_HT_CAP_INFO extHtCapInfo;\n\n\t\t\t\tNdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO));\n\t\t\t\t*(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo));\n\t\t\t\tNdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO));\t\t\n\t\t\t}\n#else\t\t\t\t\n\t\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n#endif /* UNALIGNMENT_SUPPORT */\n\n\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,          &Tmp,\n\t\t\t\t\t\t\t1,                                &HtCapIe,\n\t\t\t\t\t\t\t1,                                &HtLen,\n\t\t\t\t\t\t\tHtLen,                            &HtCapabilityTmp, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n#else\n\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,          &Tmp,\n\t\t\t\t\t\t\t1,                                &HtCapIe,\n\t\t\t\t\t\t\t1,                                &HtLen,\n\t\t\t\t\t\t\tHtLen,                            &pAd->CommonCfg.HtCapability, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n#endif /* RT_BIG_ENDIAN */\n\t\t}\n\t\tFrameLen += Tmp;\n\n#ifdef DOT11N_DRAFT3\n\t\tif ((pAd->MlmeAux.Channel <= 14) && (pAd->CommonCfg.bBssCoexEnable == TRUE))\n\t\t{\n\t\t\tULONG Tmp;\n\t\t\tHtLen = 1;\n\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,            &Tmp,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t&ExtHtCapIe,\n\t\t\t\t\t\t\t  1,\t\t\t\t\t&HtLen,\n\t\t\t\t\t\t\t  1,          \t\t\t&pAd->CommonCfg.BSSCoexist2040.word, \n\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\tFrameLen += Tmp;\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t(pAd->MlmeAux.Channel > 14)) {\t\t\n\t\tFrameLen += build_vht_ies(pAd, (UCHAR *)(frm_buf + FrameLen), SUBTYPE_PROBE_REQ);\n\t}\n#endif /* DOT11_VHT_AC */\n\n#ifdef WSC_STA_SUPPORT\n\tif (OpMode == OPMODE_STA)\n\t{\n\t\tBOOLEAN bHasWscIe = FALSE;\n\t\t/* \n\t\t\tAppend WSC information in probe request if WSC state is running\n\t\t*/\n\t\tif ((pAd->StaCfg.WscControl.WscEnProbeReqIE) && \n\t\t\t(pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t(pAd->StaCfg.WscControl.bWscTrigger == TRUE))\n\t\t\tbHasWscIe = TRUE;\n#ifdef WSC_V2_SUPPORT\n\t\telse if ((pAd->StaCfg.WscControl.WscEnProbeReqIE) && \n\t\t\t(pAd->StaCfg.WscControl.WscV2Info.bEnableWpsV2))\n\t\t\tbHasWscIe = TRUE;\n#endif /* WSC_V2_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t/* \n\t\tP2pMakeProbeReqIE will build WSC IE for P2P, \n\t\tit is not good to append normal WSC IE into P2P probe request frame here.\n\t*/\n\tif ((pAd->MlmeAux.ScanType == SCAN_P2P) || (pAd->MlmeAux.ScanType == SCAN_P2P_SEARCH) ||\n\t\t((pAd->MlmeAux.ScanType == SCAN_WSC_ACTIVE) && (OpMode == OPMODE_AP) && (P2P_CLI_ON(pAd))))\n\t\tbHasWscIe = FALSE;\n#endif /* P2P_SUPPORT */\n\n\t\tif (bHasWscIe)\n\t\t{\n\t\t\tUCHAR *pWscBuf = NULL, WscIeLen = 0;\n\t\t\tULONG WscTmpLen = 0;\n\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pWscBuf, 512);\n\t\t\tif (pWscBuf != NULL)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pWscBuf, 512);\n\t\t\t\tWscBuildProbeReqIE(pAd, STA_MODE, pWscBuf, &WscIeLen);\n\n\t\t\t\tMakeOutgoingFrame(frm_buf + FrameLen,              &WscTmpLen,\n\t\t\t\t\t\t\t\tWscIeLen,                             pWscBuf,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t\t\tFrameLen += WscTmpLen;\n\t\t\t\tos_free_mem(NULL, pWscBuf);\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s:: WscBuf Allocate failed!\\n\", __FUNCTION__));\n\t\t}\n\t}\n\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tif ((OpMode == OPMODE_STA) &&\n\t\t(pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&\n\t\t(pAd->StaCfg.WpsProbeReqIeLen != 0))\n\t{\n\t\tULONG \t\tWpsTmpLen = 0;\n\t\t\n\t\tMakeOutgoingFrame(frm_buf + FrameLen,              &WpsTmpLen,\n\t\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen,\tpAd->StaCfg.pWpsProbeReqIe,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\tFrameLen += WpsTmpLen;\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif ((pAd->MlmeAux.ScanType == SCAN_P2P) || (pAd->MlmeAux.ScanType == SCAN_P2P_SEARCH)\n#ifdef P2P_APCLI_SUPPORT\n\t\t|| ((pAd->MlmeAux.ScanType == SCAN_WSC_ACTIVE) && (OpMode == OPMODE_AP) && (P2P_CLI_ON(pAd)))\n#endif /* P2P_APCLI_SUPPORT */\n\t)\n\t{\n\t\tULONG P2PIeLen;\n\t\tUCHAR tmp_len;\n\t\tPUCHAR ptr;\n\t\tptr = frm_buf + FrameLen;\n\t\tP2pMakeProbeReqIE(pAd, ptr, &tmp_len);\n\t\tFrameLen += tmp_len;\n\t\t\n\t\t/* Put P2P IE to the last. */\n\t\tptr = frm_buf + FrameLen;\n\t\tP2pMakeP2pIE(pAd, SUBTYPE_PROBE_REQ, ptr, &P2PIeLen);\n\n\t\tFrameLen += P2PIeLen;\n#ifdef WFD_SUPPORT\n\t\t{\n\t\t\tULONG\tWfdIeBitmap;\n\t\t\t\n\t\t\tptr = frm_buf + FrameLen;\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &P2PIeLen);\n\t\t\tFrameLen += P2PIeLen;\n\t\t}\n#endif /* WFD_SUPPORT */\n\t}\n#ifdef WFD_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n\telse if (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t{\n\t\tULONG\tWfdIeLen, WfdIeBitmap;\n\t\tPUCHAR\tptr;\n\t\t\n\t\tptr = frm_buf + FrameLen;\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &WfdIeLen);\n\t\tFrameLen += WfdIeLen;\n\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n#endif /* P2P_SUPPORT */\n\n\tMiniportMMRequest(pAd, 0, frm_buf, FrameLen);\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (OpMode == OPMODE_STA)\n\t{\n\t\t/*\n\t\t\tTo prevent data lost.\n\t\t\tSend an NULL data with turned PSM bit on to current associated AP when SCAN in the channel where\n\t\t\tassociated AP located.\n\t\t*/\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && \n\t\t\t(INFRA_ON(pAd)) &&\n\t\t\t(pAd->CommonCfg.Channel == pAd->MlmeAux.Channel))\n\t\t{\n\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t  PWR_SAVE);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ScanNextChannel():Send PWA NullData frame to notify the associated AP!\\n\"));\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tMlmeFreeMemory(pAd, frm_buf);\n\n\treturn TRUE;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tScan next channel\n\t==========================================================================\n */\nVOID ScanNextChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR OpMode) \n{\n\tUCHAR ScanType = pAd->MlmeAux.ScanType;\n\tUINT ScanTimeIn5gChannel = SHORT_CHANNEL_TIME;\n\tBOOLEAN ScanPending = FALSE;\n\tRALINK_TIMER_STRUCT *sc_timer;\n\tUINT stay_time = 0;\n\tUCHAR ImprovedScan_MaxScanChannelCnt;\n\t\t\t\n\n#ifdef RALINK_ATE\n\t/* Nothing to do in ATE mode. */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (MONITOR_ON(pAd))\n\t\t\treturn;\n\t}\n\n#ifdef WIFI_P2P_CONCURRENT_FAST_SCAN\n\tImprovedScan_MaxScanChannelCnt = 3;\n#else\n\tImprovedScan_MaxScanChannelCnt = 7;\n#endif /* WIFI_P2P_CONCURRENT_FAST_SCAN */\n\tScanPending = ((pAd->StaCfg.bImprovedScan) && (pAd->StaCfg.ScanChannelCnt>=ImprovedScan_MaxScanChannelCnt));\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\tif ((pAd->MlmeAux.Channel == 0) || ScanPending) \n\t{\n\t\tscan_ch_restore(pAd, OpMode);\n\t} \n#ifdef RTMP_MAC_USB\n#ifdef CONFIG_STA_SUPPORT\n\telse if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) &&\n\t\t(OpMode == OPMODE_STA))\n\t{\n\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\tMlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);\n\t}\t\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\telse \n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (OpMode == OPMODE_STA)\n\t\t{\n\t\t\t/* BBP and RF are not accessible in PS mode, we has to wake them up first*/\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n\t\t\t\tAsicForceWakeup(pAd, TRUE);\n\n\t\t\t/* leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON*/\n\t\t\tif (pAd->StaCfg.Psm == PWR_SAVE)\n\t\t\t\tRTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tAsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE);\n\t\tAsicLockChannel(pAd, pAd->MlmeAux.Channel);\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (OpMode == OPMODE_STA)\n\t\t{\n\t\t\tBOOLEAN bScanPassive = FALSE;\n\t\t\tif (pAd->MlmeAux.Channel > 14)\n\t\t\t{\n\t\t\t\tif ((pAd->CommonCfg.bIEEE80211H == 1)\n\t\t\t\t\t&& RadarChannelCheck(pAd, pAd->MlmeAux.Channel))\n\t\t\t\t\tbScanPassive = TRUE;\n\t\t\t}\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\t\tif (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n\t\t\t\tbScanPassive = TRUE;\n#endif /* CARRIER_DETECTION_SUPPORT */ \n\n\t\t\tif (bScanPassive)\n\t\t\t{\n\t\t\t\tScanType = SCAN_PASSIVE;\n\t\t\t\tScanTimeIn5gChannel = MIN_CHANNEL_TIME;\n\t\t\t}\n\t\t}\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/* Check if channel if passive scan under current regulatory domain */\n\t\tif (CHAN_PropertyCheck(pAd, pAd->MlmeAux.Channel, CHANNEL_PASSIVE_SCAN) == TRUE)\n\t\t\tScanType = SCAN_PASSIVE;\n\n\n\t\tif (OpMode == OPMODE_AP)\n\t\t\tsc_timer = &pAd->MlmeAux.APScanTimer;\n\t\telse\n\t\t\tsc_timer = &pAd->MlmeAux.ScanTimer;\n\t\t\t\n\t\t/* We need to shorten active scan time in order for WZC connect issue */\n\t\t/* Chnage the channel scan time for CISCO stuff based on its IAPP announcement */\n\t\tif (ScanType == FAST_SCAN_ACTIVE)\n\t\t\tstay_time = FAST_ACTIVE_SCAN_TIME;\n\t\telse /* must be SCAN_PASSIVE or SCAN_ACTIVE*/\n\t\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tpAd->StaCfg.ScanChannelCnt++;\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif ((OpMode == OPMODE_AP) && (pAd->ApCfg.bAutoChannelAtBootup))\n\t\t\t\tstay_time = AUTO_CHANNEL_SEL_TIMEOUT;\n\t\t\telse\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tif (WMODE_CAP_2G(pAd->CommonCfg.PhyMode) &&\n\t\t\t\tWMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t\t\t{\n\t\t\t\tif (pAd->MlmeAux.Channel > 14)\n\t\t\t\t\tstay_time = ScanTimeIn5gChannel;\n\t\t\t\telse\n\t\t\t\t\tstay_time = MIN_CHANNEL_TIME;\n\t\t\t}\n#ifdef WIFI_P2P_CONCURRENT_FAST_SCAN\n            /* If this is not PASSIVE scan && Fast scan is enabled, we shorten the chanenl dwell time */\n            else if (ScanType != SCAN_PASSIVE && pAd->StaCfg.bImprovedScan)\n                stay_time = FAST_ACTIVE_SCAN_TIME;\n#endif /* WIFI_P2P_CONCURRENT_FAST_SCAN */\n\t\t\telse\n\t\t\t\tstay_time = MAX_CHANNEL_TIME;\n\t\t}\n\t\t\t\t\n\t\tRTMPSetTimer(sc_timer, stay_time);\n\t\t\t\n\t\tif (SCAN_MODE_ACT(ScanType))\n\t\t{\n\t\t\tif (scan_active(pAd, OpMode, ScanType) == FALSE)\n\t\t\t\treturn;\n\t\t}\n\n\t\t/* For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse*/\n\t\t\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (OpMode == OPMODE_STA)\n\t\t\tpAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (OpMode == OPMODE_AP)\n\t\t\tpAd->Mlme.ApSyncMachine.CurrState = AP_SCAN_LISTEN;\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n}\n\n\nBOOLEAN ScanRunning(\n\t\tIN PRTMP_ADAPTER pAd)\n{\n\tBOOLEAN\trv = FALSE;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\trv = ((pAd->Mlme.ApSyncMachine.CurrState == AP_SCAN_LISTEN) ? TRUE : FALSE);\n\n\t\tif (rv == FALSE)\n\t\t{\n\t\t\tif ((pAd->Mlme.SyncMachine.CurrState == SCAN_LISTEN) || (pAd->Mlme.SyncMachine.CurrState == SCAN_PENDING))\n\t\t\t\trv = TRUE;\n\t\t}\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif ((pAd->Mlme.SyncMachine.CurrState == SCAN_LISTEN) || (pAd->Mlme.SyncMachine.CurrState == SCAN_PENDING))\n\t\t\t\trv = TRUE;\n\t\t}\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef AP_SCAN_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\trv = ((pAd->Mlme.ApSyncMachine.CurrState == AP_SCAN_LISTEN) ? TRUE : FALSE);\n#endif /* AP_SCAN_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn rv;\n}\n\n#endif /* SCAN_SUPPORT */\n\n"
  },
  {
    "path": "src/common/spectrum.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\taction.c\n \n    Abstract:\n    Handle association related requests either from WSTA or from local MLME\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n\tFonchi Wu    2008\t  \t   created for 802.11h\n */\n\n#include \"rt_config.h\"\n#include \"action.h\"\n\n\n/* The regulatory information in the USA (US) */\nDOT11_REGULATORY_INFORMATION USARegulatoryInfo[] = \n{\n/*  \"regulatory class\"  \"number of channels\"  \"Max Tx Pwr\"  \"channel list\" */\n    {0,\t                {0,                   0,           {0}}}, /* Invlid entry*/\n    {1,                 {4,                   16,           {36, 40, 44, 48}}}, \n    {2,                 {4,                   23,           {52, 56, 60, 64}}}, \n    {3,                 {4,                   29,           {149, 153, 157, 161}}}, \n    {4,                 {11,                  23,           {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}}, \n    {5,                 {5,                   30,           {149, 153, 157, 161, 165}}}, \n    {6,                 {10,                  14,           {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}}, \n    {7,                 {10,                  27,           {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}}, \n    {8,                 {5,                   17,           {11, 13, 15, 17, 19}}}, \n    {9,                 {5,                   30,           {11, 13, 15, 17, 19}}}, \n    {10,                {2,                   20,           {21, 25}}}, \n    {11,                {2,                   33,            {21, 25}}}, \n    {12,                {11,                  30,            {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}}\n};\n#define USA_REGULATORY_INFO_SIZE (sizeof(USARegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION))\n\n\n/* The regulatory information in Europe */\nDOT11_REGULATORY_INFORMATION EuropeRegulatoryInfo[] = \n{\n/*  \"regulatory class\"  \"number of channels\"  \"Max Tx Pwr\"  \"channel list\" */\n    {0,                 {0,                   0,           {0}}}, /* Invalid entry*/\n    {1,                 {4,                   20,           {36, 40, 44, 48}}}, \n    {2,                 {4,                   20,           {52, 56, 60, 64}}}, \n    {3,                 {11,                  30,           {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}}, \n    {4,                 {13,                  20,           {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}}\n};\n#define EU_REGULATORY_INFO_SIZE (sizeof(EuropeRegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION))\n\n\n/* The regulatory information in Japan */\nDOT11_REGULATORY_INFORMATION JapanRegulatoryInfo[] = \n{\n/*  \"regulatory class\"  \"number of channels\"  \"Max Tx Pwr\"  \"channel list\" */\n    {0,                 {0,                   0,           {0}}}, /* Invalid entry*/\n    {1,                 {4,                   22,           {34, 38, 42, 46}}}, \n    {2,                 {3,                   24,           {8, 12, 16}}}, \n    {3,                 {3,                   24,           {8, 12, 16}}}, \n    {4,                 {3,                   24,           {8, 12, 16}}}, \n    {5,                 {3,                   24,           {8, 12, 16}}}, \n    {6,                 {3,                   22,           {8, 12, 16}}}, \n    {7,                 {4,                   24,           {184, 188, 192, 196}}}, \n    {8,                 {4,                   24,           {184, 188, 192, 196}}}, \n    {9,                 {4,                   24,           {184, 188, 192, 196}}}, \n    {10,                {4,                   24,           {184, 188, 192, 196}}}, \n    {11,                {4,                   22,           {184, 188, 192, 196}}}, \n    {12,                {4,                   24,           {7, 8, 9, 11}}}, \n    {13,                {4,                   24,           {7, 8, 9, 11}}}, \n    {14,                {4,                   24,           {7, 8, 9, 11}}}, \n    {15,                {4,                   24,           {7, 8, 9, 11}}}, \n    {16,                {6,                   24,           {183, 184, 185, 187, 188, 189}}}, \n    {17,                {6,                   24,           {183, 184, 185, 187, 188, 189}}}, \n    {18,                {6,                   24,           {183, 184, 185, 187, 188, 189}}}, \n    {19,                {6,                   24,           {183, 184, 185, 187, 188, 189}}}, \n    {20,                {6,                   17,           {183, 184, 185, 187, 188, 189}}}, \n    {21,                {6,                   24,           {6, 7, 8, 9, 10, 11}}}, \n    {22,                {6,                   24,           {6, 7, 8, 9, 10, 11}}}, \n    {23,                {6,                   24,           {6, 7, 8, 9, 10, 11}}}, \n    {24,                {6,                   24,           {6, 7, 8, 9, 10, 11}}}, \n    {25,                {8,                   24,           {182, 183, 184, 185, 186, 187, 188, 189}}}, \n    {26,                {8,                   24,           {182, 183, 184, 185, 186, 187, 188, 189}}}, \n    {27,                {8,                   24,           {182, 183, 184, 185, 186, 187, 188, 189}}}, \n    {28,                {8,                   24,           {182, 183, 184, 185, 186, 187, 188, 189}}}, \n    {29,                {8,                   17,           {182, 183, 184, 185, 186, 187, 188, 189}}}, \n    {30,                {13,                  23,           {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}}, \n    {31,                {1,                   23,           {14}}}, \n    {32,                {4,                   22,           {52, 56, 60, 64}}}\n};\n#define JP_REGULATORY_INFO_SIZE (sizeof(JapanRegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION))\n\n\nUINT8 GetRegulatoryMaxTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT8 channel)\n{\n\tULONG RegulatoryClassLoop, ChIdx;\n\tUINT8 RegulatoryClass;\n\tUINT8 MaxRegulatoryClassNum;\n\tPDOT11_REGULATORY_INFORMATION pRegulatoryClass;\n\tPSTRING pCountry = (PSTRING)(pAd->CommonCfg.CountryCode);\n\n\n\tif (strncmp(pCountry, \"US\", 2) == 0)\n\t{\n\t\tMaxRegulatoryClassNum = USA_REGULATORY_INFO_SIZE;\n\t\tpRegulatoryClass = &USARegulatoryInfo[0];\n\t}\n\telse if (strncmp(pCountry, \"JP\", 2) == 0)\n\t{\n\t\tMaxRegulatoryClassNum = JP_REGULATORY_INFO_SIZE;\n\t\tpRegulatoryClass = &JapanRegulatoryInfo[0];\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Unknow Country (%s)\\n\",\n\t\t\t\t\t__FUNCTION__, pCountry));\n\t\treturn 0xff;\n\t}\n\n\tfor (RegulatoryClassLoop = 0;\n\t\t\tRegulatoryClassLoop<MAX_NUM_OF_REGULATORY_CLASS;\n\t\t\tRegulatoryClassLoop++)\n\t{\n\t\tPDOT11_CHANNEL_SET pChannelSet;\n\n\t\tRegulatoryClass = pAd->CommonCfg.RegulatoryClass[RegulatoryClassLoop];\n\t\tif (RegulatoryClass >= MaxRegulatoryClassNum)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: %c%c Unknow Requlatory class (%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, pCountry[0], pCountry[1], RegulatoryClass));\n\t\t\treturn 0xff;\n\t\t}\n\t\tpChannelSet = &pRegulatoryClass[RegulatoryClass].ChannelSet;\n\t\tfor (ChIdx=0; ChIdx<pChannelSet->NumberOfChannels; ChIdx++)\n\t\t{\n\t\t\tif (channel == pChannelSet->ChannelList[ChIdx])\n\t\t\t\treturn pChannelSet->MaxTxPwr;\n\t\t\n\t\t}\n\t\tif (ChIdx == pChannelSet->NumberOfChannels)\n\t\t\treturn 0xff;\n\t}\n\n\treturn 0xff;\n}\n\ntypedef struct __TX_PWR_CFG\n{\n\tUINT8 Mode;\n\tUINT8 MCS;\n\tUINT16 req;\n\tUINT8 shift;\n\tUINT32 BitMask;\n} TX_PWR_CFG;\n\n/* Note: the size of TxPwrCfg is too large, do not put it to function */\nTX_PWR_CFG TxPwrCfg[] = {\n\t{MODE_CCK, 0, 0, 4, 0x000000f0},\n\t{MODE_CCK, 1, 0, 0, 0x0000000f},\n\t{MODE_CCK, 2, 0, 12, 0x0000f000},\n\t{MODE_CCK, 3, 0, 8, 0x00000f00},\n\n\t{MODE_OFDM, 0, 0, 20, 0x00f00000},\n\t{MODE_OFDM, 1, 0, 16, 0x000f0000},\n\t{MODE_OFDM, 2, 0, 28, 0xf0000000},\n\t{MODE_OFDM, 3, 0, 24, 0x0f000000},\n\t{MODE_OFDM, 4, 1, 4, 0x000000f0},\n\t{MODE_OFDM, 5, 1, 0, 0x0000000f},\n\t{MODE_OFDM, 6, 1, 12, 0x0000f000},\n\t{MODE_OFDM, 7, 1, 8, 0x00000f00}\n#ifdef DOT11_N_SUPPORT\n\t,{MODE_HTMIX, 0, 1, 20, 0x00f00000},\n\t{MODE_HTMIX, 1, 1, 16, 0x000f0000},\n\t{MODE_HTMIX, 2, 1, 28, 0xf0000000},\n\t{MODE_HTMIX, 3, 1, 24, 0x0f000000},\n\t{MODE_HTMIX, 4, 2, 4, 0x000000f0},\n\t{MODE_HTMIX, 5, 2, 0, 0x0000000f},\n\t{MODE_HTMIX, 6, 2, 12, 0x0000f000},\n\t{MODE_HTMIX, 7, 2, 8, 0x00000f00},\n\t{MODE_HTMIX, 8, 2, 20, 0x00f00000},\n\t{MODE_HTMIX, 9, 2, 16, 0x000f0000},\n\t{MODE_HTMIX, 10, 2, 28, 0xf0000000},\n\t{MODE_HTMIX, 11, 2, 24, 0x0f000000},\n\t{MODE_HTMIX, 12, 3, 4, 0x000000f0},\n\t{MODE_HTMIX, 13, 3, 0, 0x0000000f},\n\t{MODE_HTMIX, 14, 3, 12, 0x0000f000},\n\t{MODE_HTMIX, 15, 3, 8, 0x00000f00}\n#endif /* DOT11_N_SUPPORT */\n};\n#define MAX_TXPWR_TAB_SIZE (sizeof(TxPwrCfg) / sizeof(TX_PWR_CFG))\n\nCHAR RTMP_GetTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN HTTRANSMIT_SETTING HTTxMode)\n{\n\tUINT32 Value;\n\tINT Idx;\n\tUINT8 PhyMode;\n\tCHAR CurTxPwr;\n\tUINT8 TxPwrRef = 0;\n\tCHAR DaltaPwr;\n\tULONG TxPwr[5];\n\n\n#ifdef SINGLE_SKU\n\tCurTxPwr = pAd->CommonCfg.DefineMaxTxPwr;\n#else\n\tCurTxPwr = 19;\n#endif /* SINGLE_SKU */\n\n\t/* check Tx Power setting from UI. */\n\tif (pAd->CommonCfg.TxPowerPercentage > 90)\n\t\t;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 60)  /* reduce Pwr for 1 dB. */\n\t\tCurTxPwr -= 1;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 30)  /* reduce Pwr for 3 dB. */\n\t\tCurTxPwr -= 3;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 15)  /* reduce Pwr for 6 dB. */\n\t\tCurTxPwr -= 6;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 9)   /* reduce Pwr for 9 dB. */\n\t\tCurTxPwr -= 9;\n\telse                                           /* reduce Pwr for 12 dB. */\n\t\tCurTxPwr -= 12;\n\n\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t{\n\t\tif (pAd->CommonCfg.CentralChannel > 14)\n\t\t{\n\t\t\tTxPwr[0] = pAd->Tx40MPwrCfgABand[0];\n\t\t\tTxPwr[1] = pAd->Tx40MPwrCfgABand[1];\n\t\t\tTxPwr[2] = pAd->Tx40MPwrCfgABand[2];\n\t\t\tTxPwr[3] = pAd->Tx40MPwrCfgABand[3];\n\t\t\tTxPwr[4] = pAd->Tx40MPwrCfgABand[4];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxPwr[0] = pAd->Tx40MPwrCfgGBand[0];\n\t\t\tTxPwr[1] = pAd->Tx40MPwrCfgGBand[1];\n\t\t\tTxPwr[2] = pAd->Tx40MPwrCfgGBand[2];\n\t\t\tTxPwr[3] = pAd->Tx40MPwrCfgGBand[3];\n\t\t\tTxPwr[4] = pAd->Tx40MPwrCfgGBand[4];\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t{\n\t\t\tTxPwr[0] = pAd->Tx20MPwrCfgABand[0];\n\t\t\tTxPwr[1] = pAd->Tx20MPwrCfgABand[1];\n\t\t\tTxPwr[2] = pAd->Tx20MPwrCfgABand[2];\n\t\t\tTxPwr[3] = pAd->Tx20MPwrCfgABand[3];\n\t\t\tTxPwr[4] = pAd->Tx20MPwrCfgABand[4];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxPwr[0] = pAd->Tx20MPwrCfgGBand[0];\n\t\t\tTxPwr[1] = pAd->Tx20MPwrCfgGBand[1];\n\t\t\tTxPwr[2] = pAd->Tx20MPwrCfgGBand[2];\n\t\t\tTxPwr[3] = pAd->Tx20MPwrCfgGBand[3];\n\t\t\tTxPwr[4] = pAd->Tx20MPwrCfgGBand[4];\n\t\t}\n\t}\n\n\n\tswitch(HTTxMode.field.MODE)\n\t{\n\t\tcase MODE_CCK:\n\t\tcase MODE_OFDM:\n\t\t\tValue = TxPwr[1];\n\t\t\tTxPwrRef = (Value & 0x00000f00) >> 8;\n\t\t\t\n\t\t\tbreak;\n\n#ifdef DOT11_N_SUPPORT\n\t\tcase MODE_HTMIX:\n\t\tcase MODE_HTGREENFIELD:\n\t\t\tif (pAd->CommonCfg.TxStream == 1)\n\t\t\t{\n\t\t\t\tValue = TxPwr[2];\n\t\t\t\tTxPwrRef = (Value & 0x00000f00) >> 8;\n\t\t\t}\n\t\t\telse if (pAd->CommonCfg.TxStream == 2)\n\t\t\t{\n\t\t\t\tValue = TxPwr[3];\n\t\t\t\tTxPwrRef = (Value & 0x00000f00) >> 8;\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t}\n\n\tPhyMode =\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t(HTTxMode.field.MODE == MODE_HTGREENFIELD)\n\t\t\t\t? MODE_HTMIX :\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tHTTxMode.field.MODE;\n\n\tfor (Idx = 0; Idx < MAX_TXPWR_TAB_SIZE; Idx++)\n\t{\n\t\tif ((TxPwrCfg[Idx].Mode == PhyMode)\n\t\t\t&& (TxPwrCfg[Idx].MCS == HTTxMode.field.MCS))\n\t\t{\n\t\t\tValue = TxPwr[TxPwrCfg[Idx].req];\n\t\t\tDaltaPwr = TxPwrRef - (CHAR)((Value & TxPwrCfg[Idx].BitMask)\n\t\t\t\t\t\t\t\t\t\t\t>> TxPwrCfg[Idx].shift);\n\t\t\tCurTxPwr -= DaltaPwr;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn CurTxPwr;\n}\n\n\nNDIS_STATUS\tMeasureReqTabInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\n\n\tNdisAllocateSpinLock(pAd, &pAd->CommonCfg.MeasureReqTabLock);\n\n/*\tpAd->CommonCfg.pMeasureReqTab = kmalloc(sizeof(MEASURE_REQ_TAB), GFP_ATOMIC);*/\n\tos_alloc_mem(pAd, (UCHAR **)&(pAd->CommonCfg.pMeasureReqTab), sizeof(MEASURE_REQ_TAB));\n\tif (pAd->CommonCfg.pMeasureReqTab)\n\t\tNdisZeroMemory(pAd->CommonCfg.pMeasureReqTab, sizeof(MEASURE_REQ_TAB));\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Fail to alloc memory for pAd->CommonCfg.pMeasureReqTab.\\n\", __FUNCTION__));\n\t\tStatus = NDIS_STATUS_FAILURE;\n\t}\n\n\treturn Status;\n}\n\nVOID MeasureReqTabExit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNdisFreeSpinLock(&pAd->CommonCfg.MeasureReqTabLock);\n\n\tif (pAd->CommonCfg.pMeasureReqTab)\n/*\t\tkfree(pAd->CommonCfg.pMeasureReqTab);*/\n\t\tos_free_mem(NULL, pAd->CommonCfg.pMeasureReqTab);\n\tpAd->CommonCfg.pMeasureReqTab = NULL;\n\n\treturn;\n}\n\nPMEASURE_REQ_ENTRY MeasureReqLookUp(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken)\n{\n\tUINT HashIdx;\n\tPMEASURE_REQ_TAB pTab = pAd->CommonCfg.pMeasureReqTab;\n\tPMEASURE_REQ_ENTRY pEntry = NULL;\n\tPMEASURE_REQ_ENTRY pPrevEntry = NULL;\n\n\tif (pTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pMeasureReqTab doesn't exist.\\n\", __FUNCTION__));\n\t\treturn NULL;\n\t}\n\n\tRTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock);\n\n\tHashIdx = MQ_DIALOGTOKEN_HASH_INDEX(DialogToken);\n\tpEntry = pTab->Hash[HashIdx];\n\n\twhile (pEntry)\n\t{\n\t\tif (pEntry->DialogToken == DialogToken) \n\t\t\tbreak;\n\t\telse\n\t\t{\n\t\t\tpPrevEntry = pEntry;\n\t\t\tpEntry = pEntry->pNext;\n\t\t}\n\t}\n\n\tRTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock);\n\t\n\treturn pEntry;\n}\n\nPMEASURE_REQ_ENTRY MeasureReqInsert(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken)\n{\n\tINT i;\n\tULONG HashIdx;\n\tPMEASURE_REQ_TAB pTab = pAd->CommonCfg.pMeasureReqTab;\n\tPMEASURE_REQ_ENTRY pEntry = NULL, pCurrEntry;\n\tULONG Now;\n\n\tif(pTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pMeasureReqTab doesn't exist.\\n\", __FUNCTION__));\n\t\treturn NULL;\n\t}\n\n\tpEntry = MeasureReqLookUp(pAd, DialogToken);\n\tif (pEntry == NULL)\n\t{\n\t\tRTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock);\n\t\tfor (i = 0; i < MAX_MEASURE_REQ_TAB_SIZE; i++)\n\t\t{\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpEntry = &pTab->Content[i];\n \n\t\t\tif ((pEntry->Valid == TRUE)\n\t\t\t\t&& RTMP_TIME_AFTER((unsigned long)Now, (unsigned long)(pEntry->lastTime + MQ_REQ_AGE_OUT)))\n\t\t\t{\n\t\t\t\tPMEASURE_REQ_ENTRY pPrevEntry = NULL;\n\t\t\t\tULONG HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken);\n\t\t\t\tPMEASURE_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx];\n\n\t\t\t\t/* update Hash list*/\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (pProbeEntry == pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pPrevEntry == NULL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpTab->Hash[HashIdx] = pEntry->pNext;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpPrevEntry->pNext = pEntry->pNext;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tpPrevEntry = pProbeEntry;\n\t\t\t\t\tpProbeEntry = pProbeEntry->pNext;\n\t\t\t\t} while (pProbeEntry);\n\n\t\t\t\tNdisZeroMemory(pEntry, sizeof(MEASURE_REQ_ENTRY));\n\t\t\t\tpTab->Size--;\n\n\t\t\t\tbreak;\n\t\t\t}\n \n\t\t\tif (pEntry->Valid == FALSE)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (i < MAX_MEASURE_REQ_TAB_SIZE)\n\t\t{\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpEntry->lastTime = Now;\n\t\t\tpEntry->Valid = TRUE;\n\t\t\tpEntry->DialogToken = DialogToken;\n\t\t\tpTab->Size++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEntry = NULL;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pMeasureReqTab tab full.\\n\", __FUNCTION__));\n\t\t}\n\n\t\t/* add this Neighbor entry into HASH table*/\n\t\tif (pEntry)\n\t\t{\n\t\t\tHashIdx = MQ_DIALOGTOKEN_HASH_INDEX(DialogToken);\n\t\t\tif (pTab->Hash[HashIdx] == NULL)\n\t\t\t{\n\t\t\t\tpTab->Hash[HashIdx] = pEntry;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCurrEntry = pTab->Hash[HashIdx];\n\t\t\t\twhile (pCurrEntry->pNext != NULL)\n\t\t\t\t\tpCurrEntry = pCurrEntry->pNext;\n\t\t\t\tpCurrEntry->pNext = pEntry;\n\t\t\t}\n\t\t}\n\n\t\tRTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock);\n\t} \n\n\treturn pEntry;\n}\n\nVOID MeasureReqDelete(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken)\n{\n\tPMEASURE_REQ_TAB pTab = pAd->CommonCfg.pMeasureReqTab;\n\tPMEASURE_REQ_ENTRY pEntry = NULL;\n\n\tif(pTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pMeasureReqTab doesn't exist.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* if empty, return*/\n\tif (pTab->Size == 0) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pMeasureReqTab empty.\\n\"));\n\t\treturn;\n\t}\n\n\tpEntry = MeasureReqLookUp(pAd, DialogToken);\n\tif (pEntry != NULL)\n\t{\n\t\tPMEASURE_REQ_ENTRY pPrevEntry = NULL;\n\t\tULONG HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken);\n\t\tPMEASURE_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx];\n\n\t\tRTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock);\n\t\t/* update Hash list*/\n\t\tdo\n\t\t{\n\t\t\tif (pProbeEntry == pEntry)\n\t\t\t{\n\t\t\t\tif (pPrevEntry == NULL)\n\t\t\t\t{\n\t\t\t\t\tpTab->Hash[HashIdx] = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpPrevEntry->pNext = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpPrevEntry = pProbeEntry;\n\t\t\tpProbeEntry = pProbeEntry->pNext;\n\t\t} while (pProbeEntry);\n\n\t\tNdisZeroMemory(pEntry, sizeof(MEASURE_REQ_ENTRY));\n\t\tpTab->Size--;\n\n\t\tRTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock);\n\t}\n\n\treturn;\n}\n\nNDIS_STATUS\tTpcReqTabInit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNDIS_STATUS     Status = NDIS_STATUS_SUCCESS;\n\n\tNdisAllocateSpinLock(pAd, &pAd->CommonCfg.TpcReqTabLock);\n\n/*\tpAd->CommonCfg.pTpcReqTab = kmalloc(sizeof(TPC_REQ_TAB), GFP_ATOMIC);*/\n\tos_alloc_mem(pAd, (UCHAR **)&(pAd->CommonCfg.pTpcReqTab), sizeof(TPC_REQ_TAB));\n\tif (pAd->CommonCfg.pTpcReqTab)\n\t\tNdisZeroMemory(pAd->CommonCfg.pTpcReqTab, sizeof(TPC_REQ_TAB));\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Fail to alloc memory for pAd->CommonCfg.pTpcReqTab.\\n\", __FUNCTION__));\n\t\tStatus = NDIS_STATUS_FAILURE;\n\t}\n\n\treturn Status;\n}\n\nVOID TpcReqTabExit(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNdisFreeSpinLock(&pAd->CommonCfg.TpcReqTabLock);\n\n\tif (pAd->CommonCfg.pTpcReqTab)\n/*\t\tkfree(pAd->CommonCfg.pTpcReqTab);*/\n\t\tos_free_mem(NULL, pAd->CommonCfg.pTpcReqTab);\n\tpAd->CommonCfg.pTpcReqTab = NULL;\n\n\treturn;\n}\n\nstatic PTPC_REQ_ENTRY TpcReqLookUp(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken)\n{\n\tUINT HashIdx;\n\tPTPC_REQ_TAB pTab = pAd->CommonCfg.pTpcReqTab;\n\tPTPC_REQ_ENTRY pEntry = NULL;\n\tPTPC_REQ_ENTRY pPrevEntry = NULL;\n\n\tif (pTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pTpcReqTab doesn't exist.\\n\", __FUNCTION__));\n\t\treturn NULL;\n\t}\n\n\tRTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock);\n\n\tHashIdx = TPC_DIALOGTOKEN_HASH_INDEX(DialogToken);\n\tpEntry = pTab->Hash[HashIdx];\n\n\twhile (pEntry)\n\t{\n\t\tif (pEntry->DialogToken == DialogToken) \n\t\t\tbreak;\n\t\telse\n\t\t{\n\t\t\tpPrevEntry = pEntry;\n\t\t\tpEntry = pEntry->pNext;\n\t\t}\n\t}\n\n\tRTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock);\n\t\n\treturn pEntry;\n}\n\n\nstatic PTPC_REQ_ENTRY TpcReqInsert(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken)\n{\n\tINT i;\n\tULONG HashIdx;\n\tPTPC_REQ_TAB pTab = pAd->CommonCfg.pTpcReqTab;\n\tPTPC_REQ_ENTRY pEntry = NULL, pCurrEntry;\n\tULONG Now;\n\n\tif(pTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pTpcReqTab doesn't exist.\\n\", __FUNCTION__));\n\t\treturn NULL;\n\t}\n\n\tpEntry = TpcReqLookUp(pAd, DialogToken);\n\tif (pEntry == NULL)\n\t{\n\t\tRTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock);\n\t\tfor (i = 0; i < MAX_TPC_REQ_TAB_SIZE; i++)\n\t\t{\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpEntry = &pTab->Content[i];\n \n\t\t\tif ((pEntry->Valid == TRUE)\n\t\t\t\t&& RTMP_TIME_AFTER((unsigned long)Now, (unsigned long)(pEntry->lastTime + TPC_REQ_AGE_OUT)))\n\t\t\t{\n\t\t\t\tPTPC_REQ_ENTRY pPrevEntry = NULL;\n\t\t\t\tULONG HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken);\n\t\t\t\tPTPC_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx];\n\n\t\t\t\t/* update Hash list*/\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (pProbeEntry == pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pPrevEntry == NULL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpTab->Hash[HashIdx] = pEntry->pNext;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpPrevEntry->pNext = pEntry->pNext;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tpPrevEntry = pProbeEntry;\n\t\t\t\t\tpProbeEntry = pProbeEntry->pNext;\n\t\t\t\t} while (pProbeEntry);\n\n\t\t\t\tNdisZeroMemory(pEntry, sizeof(TPC_REQ_ENTRY));\n\t\t\t\tpTab->Size--;\n\n\t\t\t\tbreak;\n\t\t\t}\n \n\t\t\tif (pEntry->Valid == FALSE)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (i < MAX_TPC_REQ_TAB_SIZE)\n\t\t{\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpEntry->lastTime = Now;\n\t\t\tpEntry->Valid = TRUE;\n\t\t\tpEntry->DialogToken = DialogToken;\n\t\t\tpTab->Size++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEntry = NULL;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pTpcReqTab tab full.\\n\", __FUNCTION__));\n\t\t}\n\n\t\t/* add this Neighbor entry into HASH table*/\n\t\tif (pEntry)\n\t\t{\n\t\t\tHashIdx = TPC_DIALOGTOKEN_HASH_INDEX(DialogToken);\n\t\t\tif (pTab->Hash[HashIdx] == NULL)\n\t\t\t{\n\t\t\t\tpTab->Hash[HashIdx] = pEntry;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCurrEntry = pTab->Hash[HashIdx];\n\t\t\t\twhile (pCurrEntry->pNext != NULL)\n\t\t\t\t\tpCurrEntry = pCurrEntry->pNext;\n\t\t\t\tpCurrEntry->pNext = pEntry;\n\t\t\t}\n\t\t}\n\n\t\tRTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock);\n\t} \n\n\treturn pEntry;\n}\n\nstatic VOID TpcReqDelete(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken)\n{\n\tPTPC_REQ_TAB pTab = pAd->CommonCfg.pTpcReqTab;\n\tPTPC_REQ_ENTRY pEntry = NULL;\n\n\tif(pTab == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pTpcReqTab doesn't exist.\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* if empty, return*/\n\tif (pTab->Size == 0) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pTpcReqTab empty.\\n\"));\n\t\treturn;\n\t}\n\n\tpEntry = TpcReqLookUp(pAd, DialogToken);\n\tif (pEntry != NULL)\n\t{\n\t\tPTPC_REQ_ENTRY pPrevEntry = NULL;\n\t\tULONG HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken);\n\t\tPTPC_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx];\n\n\t\tRTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock);\n\t\t/* update Hash list*/\n\t\tdo\n\t\t{\n\t\t\tif (pProbeEntry == pEntry)\n\t\t\t{\n\t\t\t\tif (pPrevEntry == NULL)\n\t\t\t\t{\n\t\t\t\t\tpTab->Hash[HashIdx] = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpPrevEntry->pNext = pEntry->pNext;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpPrevEntry = pProbeEntry;\n\t\t\tpProbeEntry = pProbeEntry->pNext;\n\t\t} while (pProbeEntry);\n\n\t\tNdisZeroMemory(pEntry, sizeof(TPC_REQ_ENTRY));\n\t\tpTab->Size--;\n\n\t\tRTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock);\n\t}\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tGet Current TimeS tamp.\n\t\t\n\tParametrs:\n\t\n\tReturn\t: Current Time Stamp.\n\t==========================================================================\n */\nstatic UINT64 GetCurrentTimeStamp(\n\tIN PRTMP_ADAPTER pAd)\n{\n\t/* get current time stamp.*/\n\treturn 0;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tGet Current Transmit Power.\n\t\t\n\tParametrs:\n\t\n\tReturn\t: Current Time Stamp.\n\t==========================================================================\n */\nstatic UINT8 GetCurTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT8 Wcid)\n{\n\treturn 16; /* 16 dBm */\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tGet Current Transmit Power.\n\t\t\n\tParametrs:\n\t\n\tReturn\t: Current Time Stamp.\n\t==========================================================================\n */\nVOID InsertChannelRepIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN PSTRING pCountry,\n\tIN UINT8 RegulatoryClass)\n{\n\tULONG TempLen;\n\tUINT8 Len;\n\tUINT8 IEId = IE_AP_CHANNEL_REPORT;\n\tPUCHAR pChListPtr = NULL;\n\tPDOT11_CHANNEL_SET pChannelSet = NULL;\n\n\tLen = 1;\n\tif (strncmp(pCountry, \"US\", 2) == 0)\n\t{\n\t\tif (RegulatoryClass >= USA_REGULATORY_INFO_SIZE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: USA Unknow Requlatory class (%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, RegulatoryClass));\n\t\t\treturn;\n\t\t}\n\t\tpChannelSet = &USARegulatoryInfo[RegulatoryClass].ChannelSet;\n\t}\n\telse if (strncmp(pCountry, \"JP\", 2) == 0)\n\t{\n\t\tif (RegulatoryClass >= JP_REGULATORY_INFO_SIZE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: JP Unknow Requlatory class (%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, RegulatoryClass));\n\t\t\treturn;\n\t\t}\n\n\t\tpChannelSet = &JapanRegulatoryInfo[RegulatoryClass].ChannelSet;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Unknow Country (%s)\\n\",\n\t\t\t\t\t__FUNCTION__, pCountry));\n\t\treturn;\n\t}\n\n\t/* no match channel set. */\n\tif (pChannelSet == NULL)\n\t\treturn;\n\n\t/* empty channel set. */\n\tif (pChannelSet->NumberOfChannels == 0)\n\t\treturn;\n\n\tLen += pChannelSet->NumberOfChannels;\n\tpChListPtr = pChannelSet->ChannelList;\n\n\tif (Len > 1)\n\t{\n\t\tMakeOutgoingFrame(pFrameBuf,\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&IEId,\n\t\t\t\t\t\t1,\t\t\t\t&Len,\n\t\t\t\t\t\t1,\t\t\t\t&RegulatoryClass,\n\t\t\t\t\t\tLen -1,\t\t\tpChListPtr,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInsert Dialog Token into frame.\n\t\t\n\tParametrs:\n\t\t1. frame buffer pointer.\n\t\t2. frame length.\n\t\t3. Dialog token.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID InsertDialogToken(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 DialogToken)\n{\n\tULONG TempLen;\n\tMakeOutgoingFrame(pFrameBuf,\t&TempLen,\n\t\t\t\t\t1,\t\t\t\t&DialogToken,\n\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInsert TPC Request IE into frame.\n\t\t\n\tParametrs:\n\t\t1. frame buffer pointer.\n\t\t2. frame length.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\n static VOID InsertTpcReqIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen)\n{\n\tULONG TempLen;\n\tUINT8 Len = 0;\n\tUINT8 ElementID = IE_TPC_REQUEST;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&ElementID,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&Len,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInsert TPC Report IE into frame.\n\t\t\n\tParametrs:\n\t\t1. frame buffer pointer.\n\t\t2. frame length.\n\t\t3. Transmit Power.\n\t\t4. Link Margin.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID InsertTpcReportIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 TxPwr,\n\tIN UINT8 LinkMargin)\n{\n\tULONG TempLen;\n\tUINT8 Len = sizeof(TPC_REPORT_INFO);\n\tUINT8 ElementID = IE_TPC_REPORT;\n\tTPC_REPORT_INFO TpcReportIE;\n\n\tTpcReportIE.TxPwr = TxPwr;\n\tTpcReportIE.LinkMargin = LinkMargin;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&ElementID,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&Len,\n\t\t\t\t\t\tLen,\t\t\t\t\t\t&TpcReportIE,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInsert Measure Request IE into frame.\n\t\t\n\tParametrs:\n\t\t1. frame buffer pointer.\n\t\t2. frame length.\n\t\t3. Measure Token.\n\t\t4. Measure Request Mode.\n\t\t5. Measure Request Type.\n\t\t6. Measure Channel.\n\t\t7. Measure Start time.\n\t\t8. Measure Duration.\n\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID InsertMeasureReqIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 Len,\n\tIN PMEASURE_REQ_INFO pMeasureReqIE)\n{\n\tULONG TempLen;\n\tUINT8 ElementID = IE_MEASUREMENT_REQUEST;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&ElementID,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&Len,\n\t\t\t\t\t\tsizeof(MEASURE_REQ_INFO),\tpMeasureReqIE,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tInsert Measure Report IE into frame.\n\t\t\n\tParametrs:\n\t\t1. frame buffer pointer.\n\t\t2. frame length.\n\t\t3. Measure Token.\n\t\t4. Measure Request Mode.\n\t\t5. Measure Request Type.\n\t\t6. Length of Report Infomation \n\t\t7. Pointer of Report Infomation Buffer.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID InsertMeasureReportIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN PMEASURE_REPORT_INFO pMeasureReportIE,\n\tIN UINT8 ReportLnfoLen,\n\tIN PUINT8 pReportInfo)\n{\n\tULONG TempLen;\n\tUINT8 Len;\n\tUINT8 ElementID = IE_MEASUREMENT_REPORT;\n\n\tLen = sizeof(MEASURE_REPORT_INFO) + ReportLnfoLen;\n\t\t\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&ElementID,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&Len,\n\t\t\t\t\t\tLen,\t\t\t\t\t\tpMeasureReportIE,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\tif ((ReportLnfoLen > 0) && (pReportInfo != NULL))\n\t{\n\t\tMakeOutgoingFrame(pFrameBuf + *pFrameLen,\t\t&TempLen,\n\t\t\t\t\t\t\tReportLnfoLen,\t\t\t\tpReportInfo,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare Measurement request action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID MakeMeasurementReqFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pOutBuffer,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 TotalLen,\n\tIN UINT8 Category,\n\tIN UINT8 Action,\n\tIN UINT8 MeasureToken, \n\tIN UINT8 MeasureReqMode,\n\tIN UINT8 MeasureReqType,\n\tIN UINT16 NumOfRepetitions)\n{\n\tULONG TempLen;\n\tMEASURE_REQ_INFO MeasureReqIE;\n\n\tInsertActField(pAd, (pOutBuffer + *pFrameLen), pFrameLen, Category, Action);\n\n\t/* fill Dialog Token*/\n\tInsertDialogToken(pAd, (pOutBuffer + *pFrameLen), pFrameLen, MeasureToken);\n\n\t/* fill Number of repetitions. */\n\tif (Category == CATEGORY_RM)\n\t{\n\t\tMakeOutgoingFrame((pOutBuffer+*pFrameLen),\t&TempLen,\n\t\t\t\t\t\t2,\t\t\t\t\t\t\t&NumOfRepetitions,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen += TempLen;\n\t}\n\n\t/* prepare Measurement IE.*/\n\tNdisZeroMemory(&MeasureReqIE, sizeof(MEASURE_REQ_INFO));\n\tMeasureReqIE.Token = MeasureToken;\n\tMeasureReqIE.ReqMode.word = MeasureReqMode;\n\tMeasureReqIE.ReqType = MeasureReqType;\n\tInsertMeasureReqIE(pAd, (pOutBuffer+*pFrameLen), pFrameLen,\n\t\tTotalLen, &MeasureReqIE);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare Measurement report action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID EnqueueMeasurementRep(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA,\n\tIN UINT8 DialogToken,\n\tIN UINT8 MeasureToken, \n\tIN UINT8 MeasureReqMode,\n\tIN UINT8 MeasureReqType,\n\tIN UINT8 ReportInfoLen,\n\tIN PUINT8 pReportInfo)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen;\n\tHEADER_802_11 ActHdr;\n\tMEASURE_REPORT_INFO MeasureRepIE;\n\n\t/* build action frame header.*/\n\tMgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->CurrentAddress);\n\n\tNStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() allocate memory failed \\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));\n\tFrameLen = sizeof(HEADER_802_11);\n\n\tInsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_MRP);\n\n\t/* fill Dialog Token*/\n\tInsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);\n\n\t/* prepare Measurement IE.*/\n\tNdisZeroMemory(&MeasureRepIE, sizeof(MEASURE_REPORT_INFO));\n\tMeasureRepIE.Token = MeasureToken;\n\tMeasureRepIE.ReportMode = MeasureReqMode;\n\tMeasureRepIE.ReportType = MeasureReqType;\n\tInsertMeasureReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, &MeasureRepIE, ReportInfoLen, pReportInfo);\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\treturn;\t\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare TPC Request action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID EnqueueTPCReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA,\n\tIN UCHAR DialogToken)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen;\n\n\tHEADER_802_11 ActHdr;\n\n\t/* build action frame header.*/\n\tMgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->CurrentAddress);\n\n\tNStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() allocate memory failed \\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));\n\tFrameLen = sizeof(HEADER_802_11);\n\n\tInsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_TPCRQ);\n\n\t/* fill Dialog Token*/\n\tInsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);\n\n\t/* Insert TPC Request IE.*/\n\tInsertTpcReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare TPC Report action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID EnqueueTPCRep(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA,\n\tIN UINT8 DialogToken,\n\tIN UINT8 TxPwr,\n\tIN UINT8 LinkMargin)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen;\n\n\tHEADER_802_11 ActHdr;\n\n\t/* build action frame header.*/\n\tMgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->CurrentAddress);\n\n\tNStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() allocate memory failed \\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));\n\tFrameLen = sizeof(HEADER_802_11);\n\n\tInsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_TPCRP);\n\n\t/* fill Dialog Token*/\n\tInsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);\n\n\t/* Insert TPC Request IE.*/\n\tInsertTpcReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, TxPwr, LinkMargin);\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\treturn;\n}\n\n\nstatic BOOLEAN DfsRequirementCheck(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT8 Channel)\n{\n\tBOOLEAN Result = FALSE;\n\tINT i;\n\n\tdo\n\t{\n\t\t/* check DFS procedure is running.*/\n\t\t/* make sure DFS procedure won't start twice.*/\n\t\tif (pAd->Dot11_H.RDMode != RD_NORMAL_MODE)\n\t\t{\n\t\t\tResult = FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\t/* check the new channel carried from Channel Switch Announcemnet is valid.*/\n\t\tfor (i=0; i<pAd->ChannelListNum; i++)\n\t\t{\n\t\t\tif ((Channel == pAd->ChannelList[i].Channel)\n\t\t\t\t&&(pAd->ChannelList[i].RemainingTimeForUse == 0))\n\t\t\t{\n\t\t\t\t/* found radar signal in the channel. the channel can't use at least for 30 minutes.*/\n\t\t\t\tpAd->ChannelList[i].RemainingTimeForUse = 1800;/*30 min = 1800 sec*/\n\t\t\t\tResult = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while(FALSE);\n\n\treturn Result;\n}\n\nVOID NotifyChSwAnnToPeerAPs(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pRA,\n\tIN PUCHAR pTA,\n\tIN UINT8 ChSwMode,\n\tIN UINT8 Channel)\n{\n}\n\nstatic VOID StartDFSProcedure(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Channel,\n\tIN UINT8 ChSwMode)\n{\n\t/* start DFS procedure*/\n\tpAd->CommonCfg.Channel = Channel;\n#ifdef DOT11_N_SUPPORT\n\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\tpAd->Dot11_H.RDMode = RD_SWITCHING_MODE;\n\tpAd->Dot11_H.CSCount = 0;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tChannel Switch Announcement action frame sanity check.\n\t\t\n\tParametrs:\n\t\t1. MLME message containing the received frame\n\t\t2. message length.\n\t\t3. Channel switch announcement infomation buffer.\n\t\t\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\n\n/*\n  Channel Switch Announcement IE.\n  +----+-----+-----------+------------+-----------+\n  | ID | Len |Ch Sw Mode | New Ch Num | Ch Sw Cnt |\n  +----+-----+-----------+------------+-----------+\n    1    1        1           1            1      \n*/\nstatic BOOLEAN PeerChSwAnnSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *pMsg,\n\tIN ULONG MsgLen,\n\tOUT PCH_SW_ANN_INFO pChSwAnnInfo)\n{\n\tPFRAME_802_11 Fr = (PFRAME_802_11)pMsg;\n\tPUCHAR pFramePtr = Fr->Octet;\n\tBOOLEAN result = FALSE;\n\tPEID_STRUCT eid_ptr;\n\n\t/* skip 802.11 header.*/\n\tMsgLen -= sizeof(HEADER_802_11);\n\n\t/* skip category and action code.*/\n\tpFramePtr += 2;\n\tMsgLen -= 2;\n\n\tif (pChSwAnnInfo == NULL)\n\t\treturn result;\n\n\teid_ptr = (PEID_STRUCT)pFramePtr;\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_CHANNEL_SWITCH_ANNOUNCEMENT:\n\t\t\t\tNdisMoveMemory(&pChSwAnnInfo->ChSwMode, eid_ptr->Octet, 1);\n\t\t\t\tNdisMoveMemory(&pChSwAnnInfo->Channel, eid_ptr->Octet + 1, 1);\n\t\t\t\tNdisMoveMemory(&pChSwAnnInfo->ChSwCnt, eid_ptr->Octet + 2, 1);\n\t\t\t\t\n\t\t\t\tresult = TRUE;\n                break;\n            \n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);        \n\t}\n\n\treturn result;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tMeasurement request action frame sanity check.\n\t\t\n\tParametrs:\n\t\t1. MLME message containing the received frame\n\t\t2. message length.\n\t\t3. Measurement request infomation buffer.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic BOOLEAN PeerMeasureReqSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *pMsg,\n\tIN ULONG MsgLen,\n\tOUT PUINT8 pDialogToken,\n\tOUT PMEASURE_REQ_INFO pMeasureReqInfo,\n\tOUT PMEASURE_REQ pMeasureReq)\n{\n\tPFRAME_802_11 Fr = (PFRAME_802_11)pMsg;\n\tPUCHAR pFramePtr = Fr->Octet;\n\tBOOLEAN result = FALSE;\n\tPEID_STRUCT eid_ptr;\n\tPUCHAR ptr;\n\tUINT64 MeasureStartTime;\n\tUINT16 MeasureDuration;\n\n\t/* skip 802.11 header.*/\n\tMsgLen -= sizeof(HEADER_802_11);\n\n\t/* skip category and action code.*/\n\tpFramePtr += 2;\n\tMsgLen -= 2;\n\n\tif (pMeasureReqInfo == NULL)\n\t\treturn result;\n\n\tNdisMoveMemory(pDialogToken, pFramePtr, 1);\n\tpFramePtr += 1;\n\tMsgLen -= 1;\n\n\teid_ptr = (PEID_STRUCT)pFramePtr;\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_MEASUREMENT_REQUEST:\n\t\t\t\tNdisMoveMemory(&pMeasureReqInfo->Token, eid_ptr->Octet, 1);\n\t\t\t\tNdisMoveMemory(&pMeasureReqInfo->ReqMode.word, eid_ptr->Octet + 1, 1);\n\t\t\t\tNdisMoveMemory(&pMeasureReqInfo->ReqType, eid_ptr->Octet + 2, 1);\n\t\t\t\tptr = (PUCHAR)(eid_ptr->Octet + 3);\n\t\t\t\tNdisMoveMemory(&pMeasureReq->ChNum, ptr, 1);\n\t\t\t\tNdisMoveMemory(&MeasureStartTime, ptr + 1, 8);\n\t\t\t\tpMeasureReq->MeasureStartTime = SWAP64(MeasureStartTime);\n\t\t\t\tNdisMoveMemory(&MeasureDuration, ptr + 9, 2);\n\t\t\t\tpMeasureReq->MeasureDuration = SWAP16(MeasureDuration);\n\t\t\t\t\n\t\t\t\tresult = TRUE;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);\n\t}\n\n\treturn result;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tMeasurement report action frame sanity check.\n\t\t\n\tParametrs:\n\t\t1. MLME message containing the received frame\n\t\t2. message length.\n\t\t3. Measurement report infomation buffer.\n\t\t4. basic report infomation buffer.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\n\n/*\n  Measurement Report IE.\n  +----+-----+-------+-------------+--------------+----------------+\n  | ID | Len | Token | Report Mode | Measure Type | Measure Report |\n  +----+-----+-------+-------------+--------------+----------------+\n    1     1      1          1             1            variable\n\n  Basic Report.\n  +--------+------------+----------+-----+\n  | Ch Num | Start Time | Duration | Map |\n  +--------+------------+----------+-----+\n      1          8           2        1\n\n  Map Field Bit Format.\n  +-----+---------------+---------------------+-------+------------+----------+\n  | Bss | OFDM Preamble | Unidentified signal | Radar | Unmeasured | Reserved |\n  +-----+---------------+---------------------+-------+------------+----------+\n     0          1                  2              3         4          5-7\n*/\nstatic BOOLEAN PeerMeasureReportSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *pMsg,\n\tIN ULONG MsgLen,\n\tOUT PUINT8 pDialogToken,\n\tOUT PMEASURE_REPORT_INFO pMeasureReportInfo,\n\tOUT PUINT8 pReportBuf)\n{\n\tPFRAME_802_11 Fr = (PFRAME_802_11)pMsg;\n\tPUCHAR pFramePtr = Fr->Octet;\n\tBOOLEAN result = FALSE;\n\tPEID_STRUCT eid_ptr;\n\tPUCHAR ptr;\n\n\t/* skip 802.11 header.*/\n\tMsgLen -= sizeof(HEADER_802_11);\n\n\t/* skip category and action code.*/\n\tpFramePtr += 2;\n\tMsgLen -= 2;\n\n\tif (pMeasureReportInfo == NULL)\n\t\treturn result;\n\n\tNdisMoveMemory(pDialogToken, pFramePtr, 1);\n\tpFramePtr += 1;\n\tMsgLen -= 1;\n\n\teid_ptr = (PEID_STRUCT)pFramePtr;\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_MEASUREMENT_REPORT:\n\t\t\t\tNdisMoveMemory(&pMeasureReportInfo->Token, eid_ptr->Octet, 1);\n\t\t\t\tNdisMoveMemory(&pMeasureReportInfo->ReportMode, eid_ptr->Octet + 1, 1);\n\t\t\t\tNdisMoveMemory(&pMeasureReportInfo->ReportType, eid_ptr->Octet + 2, 1);\n\t\t\t\tif (pMeasureReportInfo->ReportType == RM_BASIC)\n\t\t\t\t{\n\t\t\t\t\tPMEASURE_BASIC_REPORT pReport = (PMEASURE_BASIC_REPORT)pReportBuf;\n\t\t\t\t\tptr = (PUCHAR)(eid_ptr->Octet + 3);\n\t\t\t\t\tNdisMoveMemory(&pReport->ChNum, ptr, 1);\n\t\t\t\t\tNdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);\n\t\t\t\t\tNdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);\n\t\t\t\t\tNdisMoveMemory(&pReport->Map, ptr + 11, 1);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if (pMeasureReportInfo->ReportType == RM_CCA)\n\t\t\t\t{\n\t\t\t\t\tPMEASURE_CCA_REPORT pReport = (PMEASURE_CCA_REPORT)pReportBuf;\n\t\t\t\t\tptr = (PUCHAR)(eid_ptr->Octet + 3);\n\t\t\t\t\tNdisMoveMemory(&pReport->ChNum, ptr, 1);\n\t\t\t\t\tNdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);\n\t\t\t\t\tNdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);\n\t\t\t\t\tNdisMoveMemory(&pReport->CCA_Busy_Fraction, ptr + 11, 1);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if (pMeasureReportInfo->ReportType == RM_RPI_HISTOGRAM)\n\t\t\t\t{\n\t\t\t\t\tPMEASURE_RPI_REPORT pReport = (PMEASURE_RPI_REPORT)pReportBuf;\n\t\t\t\t\tptr = (PUCHAR)(eid_ptr->Octet + 3);\n\t\t\t\t\tNdisMoveMemory(&pReport->ChNum, ptr, 1);\n\t\t\t\t\tNdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);\n\t\t\t\t\tNdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);\n\t\t\t\t\tNdisMoveMemory(&pReport->RPI_Density, ptr + 11, 8);\n\t\t\t\t}\n\t\t\t\tresult = TRUE;\n                break;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);\n\t}\n\n\treturn result;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tTPC Request action frame sanity check.\n\t\t\n\tParametrs:\n\t\t1. MLME message containing the received frame\n\t\t2. message length.\n\t\t3. Dialog Token.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic BOOLEAN PeerTpcReqSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *pMsg,\n\tIN ULONG MsgLen,\n\tOUT PUINT8 pDialogToken)\n{\n\tPFRAME_802_11 Fr = (PFRAME_802_11)pMsg;\n\tPUCHAR pFramePtr = Fr->Octet;\n\tBOOLEAN result = FALSE;\n\tPEID_STRUCT eid_ptr;\n\n\tMsgLen -= sizeof(HEADER_802_11);\n\n\t/* skip category and action code.*/\n\tpFramePtr += 2;\n\tMsgLen -= 2;\n\n\tif (pDialogToken == NULL)\n\t\treturn result;\n\n\tNdisMoveMemory(pDialogToken, pFramePtr, 1);\n\tpFramePtr += 1;\n\tMsgLen -= 1;\n\n\teid_ptr = (PEID_STRUCT)pFramePtr;\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_TPC_REQUEST:\n\t\t\t\tresult = TRUE;\n                break;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);\n\t}\n\n\treturn result;\t\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tTPC Report action frame sanity check.\n\t\t\n\tParametrs:\n\t\t1. MLME message containing the received frame\n\t\t2. message length.\n\t\t3. Dialog Token.\n\t\t4. TPC Report IE.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic BOOLEAN PeerTpcRepSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *pMsg,\n\tIN ULONG MsgLen,\n\tOUT PUINT8 pDialogToken,\n\tOUT PTPC_REPORT_INFO pTpcRepInfo)\n{\n\tPFRAME_802_11 Fr = (PFRAME_802_11)pMsg;\n\tPUCHAR pFramePtr = Fr->Octet;\n\tBOOLEAN result = FALSE;\n\tPEID_STRUCT eid_ptr;\n\n\tMsgLen -= sizeof(HEADER_802_11);\n\n\t/* skip category and action code.*/\n\tpFramePtr += 2;\n\tMsgLen -= 2;\n\n\tif (pDialogToken == NULL)\n\t\treturn result;\n\n\tNdisMoveMemory(pDialogToken, pFramePtr, 1);\n\tpFramePtr += 1;\n\tMsgLen -= 1;\n\n\teid_ptr = (PEID_STRUCT)pFramePtr;\n\twhile (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))\n\t{\n\t\tswitch(eid_ptr->Eid)\n\t\t{\n\t\t\tcase IE_TPC_REPORT:\n\t\t\t\tNdisMoveMemory(&pTpcRepInfo->TxPwr, eid_ptr->Octet, 1);\n\t\t\t\tNdisMoveMemory(&pTpcRepInfo->LinkMargin, eid_ptr->Octet + 1, 1);\n\t\t\t\tresult = TRUE;\n                break;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);\n\t}\n\n\treturn result;\t\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tChannel Switch Announcement action frame handler.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID PeerChSwAnnAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tCH_SW_ANN_INFO ChSwAnnInfo;\n\tPFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg;\n#ifdef CONFIG_STA_SUPPORT\n\tUCHAR index = 0, Channel = 0, NewChannel = 0;\n\tULONG Bssidx = 0;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tNdisZeroMemory(&ChSwAnnInfo, sizeof(CH_SW_ANN_INFO));\n\tif (! PeerChSwAnnSanity(pAd, Elem->Msg, Elem->MsgLen, &ChSwAnnInfo))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Invalid Channel Switch Action Frame.\\n\"));\n\t\treturn;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* ChSwAnn need check.*/\n\tif ((pAd->OpMode == OPMODE_AP) &&\n\t\t(DfsRequirementCheck(pAd, ChSwAnnInfo.Channel) == TRUE))\n\t{\n\t\tNotifyChSwAnnToPeerAPs(pAd, pFr->Hdr.Addr1, pFr->Hdr.Addr2, ChSwAnnInfo.ChSwMode, ChSwAnnInfo.Channel);\n\t\tStartDFSProcedure(pAd, ChSwAnnInfo.Channel, ChSwAnnInfo.ChSwMode);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (pAd->OpMode == OPMODE_STA)\n\t{\n\t\tBssidx = BssTableSearch(&pAd->ScanTab, pFr->Hdr.Addr3, pAd->CommonCfg.Channel);\n\t\tif (Bssidx == BSS_NOT_FOUND)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerChSwAnnAction - Bssidx is not found\\n\"));\n\t\t\treturn;  \n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n****Bssidx is %d, Channel = %d\\n\", index, pAd->ScanTab.BssEntry[Bssidx].Channel));\n\t\thex_dump(\"SSID\",pAd->ScanTab.BssEntry[Bssidx].Bssid ,6);\n\n\t\tChannel = pAd->CommonCfg.Channel;\n\t\tNewChannel = ChSwAnnInfo.Channel;\n\n\t\tif ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel))\n\t\t{\n\t\t\t/* Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection).*/\n\t\t\t/* In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results.*/\n\t\t\tAsicSwitchChannel(pAd, 1, FALSE);\n\t\t\tAsicLockChannel(pAd, 1);\n\t\t\tLinkDown(pAd, FALSE);\n\t\t\tMlmeQueueInit(pAd, &pAd->Mlme.Queue);\n\t\t    RTMPusecDelay(1000000);\t\t/* use delay to prevent STA do reassoc*/\n\t\t\t\t\t\n\t\t\t/* channel sanity check*/\n\t\t\tfor (index = 0 ; index < pAd->ChannelListNum; index++)\n\t\t\t{\n\t\t\t\tif (pAd->ChannelList[index].Channel == NewChannel)\n\t\t\t\t{\n\t\t\t\t\tpAd->ScanTab.BssEntry[Bssidx].Channel = NewChannel;\n\t\t\t\t\tpAd->CommonCfg.Channel = NewChannel;\n\t\t\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"&&&&&&&&&&&&&&&&PeerChSwAnnAction - STA receive channel switch announcement IE (New Channel =%d)\\n\", NewChannel));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (index >= pAd->ChannelListNum)\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"&&&&&&&&&&&&&&&&&&&&&&&&&&PeerChSwAnnAction(can not find New Channel=%d in ChannelList[%d]\\n\", pAd->CommonCfg.Channel, pAd->ChannelListNum));\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tMeasurement Request action frame handler.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID PeerMeasureReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg;\n\tUINT8 DialogToken;\n\tMEASURE_REQ_INFO MeasureReqInfo;\n\tMEASURE_REQ\tMeasureReq;\n\tMEASURE_REPORT_MODE ReportMode;\n\n\tif(PeerMeasureReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReqInfo, &MeasureReq))\n\t{\n\t\tReportMode.word = 0;\n\t\tReportMode.field.Incapable = 1;\n\t\tEnqueueMeasurementRep(pAd, pFr->Hdr.Addr2, DialogToken, MeasureReqInfo.Token, ReportMode.word, MeasureReqInfo.ReqType, 0, NULL);\n\t}\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tMeasurement Report action frame handler.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID PeerMeasureReportAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tMEASURE_REPORT_INFO MeasureReportInfo;\n\tPFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg;\n\tUINT8 DialogToken;\n\tPUINT8 pMeasureReportInfo;\n\n/*\tif (pAd->CommonCfg.bIEEE80211H != TRUE)*/\n/*\t\treturn;*/\n\n\tos_alloc_mem(pAd, (UCHAR **)&pMeasureReportInfo, sizeof(MEASURE_RPI_REPORT));\n/*\tif ((pMeasureReportInfo = kmalloc(sizeof(MEASURE_RPI_REPORT), GFP_ATOMIC)) == NULL)*/\n\tif (pMeasureReportInfo == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s unable to alloc memory for measure report buffer (size=%d).\\n\", __FUNCTION__, sizeof(MEASURE_RPI_REPORT)));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(&MeasureReportInfo, sizeof(MEASURE_REPORT_INFO));\n\tNdisZeroMemory(pMeasureReportInfo, sizeof(MEASURE_RPI_REPORT));\n\tif (PeerMeasureReportSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReportInfo, pMeasureReportInfo))\n\t{\n\t\tdo {\n\t\t\tPMEASURE_REQ_ENTRY pEntry = NULL;\n\n\t\t\t/* Not a autonomous measure report.*/\n\t\t\t/* check the dialog token field. drop it if the dialog token doesn't match.*/\n\t\t\tif ((DialogToken != 0)\n\t\t\t\t&& ((pEntry = MeasureReqLookUp(pAd, DialogToken)) == NULL))\n\t\t\t\tbreak;\n\n\t\t\tif (pEntry != NULL)\n\t\t\t\tMeasureReqDelete(pAd, pEntry->DialogToken);\n\n\t\t\tif (MeasureReportInfo.ReportType == RM_BASIC)\n\t\t\t{\n\t\t\t\tPMEASURE_BASIC_REPORT pBasicReport = (PMEASURE_BASIC_REPORT)pMeasureReportInfo;\n\t\t\t\tif ((pBasicReport->Map.field.Radar)\n\t\t\t\t\t&& (DfsRequirementCheck(pAd, pBasicReport->ChNum) == TRUE))\n\t\t\t\t{\n\t\t\t\t\tNotifyChSwAnnToPeerAPs(pAd, pFr->Hdr.Addr1, pFr->Hdr.Addr2, 1, pBasicReport->ChNum);\n\t\t\t\t\tStartDFSProcedure(pAd, pBasicReport->ChNum, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t} while (FALSE);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Invalid Measurement Report Frame.\\n\"));\n\n/*\tkfree(pMeasureReportInfo);*/\n\tos_free_mem(NULL, pMeasureReportInfo);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tTPC Request action frame handler.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID PeerTpcReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg;\n\tPUCHAR pFramePtr = pFr->Octet;\n\tUINT8 DialogToken;\n\tUINT8 TxPwr = GetCurTxPwr(pAd, Elem->Wcid);\n\tUINT8 LinkMargin = 0;\n\tCHAR RealRssi;\n\n\t/* link margin: Ratio of the received signal power to the minimum desired by the station (STA). The*/\n\t/*\t\t\t\tSTA may incorporate rate information and channel conditions, including interference, into its computation*/\n\t/*\t\t\t\tof link margin.*/\n\n\tRealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n\t/* skip Category and action code.*/\n\tpFramePtr += 2;\n\n\t/* Dialog token.*/\n\tNdisMoveMemory(&DialogToken, pFramePtr, 1);\n\n\tLinkMargin = (RealRssi / MIN_RCV_PWR);\n\tif (PeerTpcReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken))\n\t\tEnqueueTPCRep(pAd, pFr->Hdr.Addr2, DialogToken, TxPwr, LinkMargin);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tTPC Report action frame handler.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nstatic VOID PeerTpcRepAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUINT8 DialogToken;\n\tTPC_REPORT_INFO TpcRepInfo;\n\tPTPC_REQ_ENTRY pEntry = NULL;\n\n\tNdisZeroMemory(&TpcRepInfo, sizeof(TPC_REPORT_INFO));\n\tif (PeerTpcRepSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &TpcRepInfo))\n\t{\n\t\tif ((pEntry = TpcReqLookUp(pAd, DialogToken)) != NULL)\n\t\t{\n\t\t\tTpcReqDelete(pAd, pEntry->DialogToken);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: DialogToken=%x, TxPwr=%d, LinkMargin=%d\\n\",\n\t\t\t\t__FUNCTION__, DialogToken, TpcRepInfo.TxPwr, TpcRepInfo.LinkMargin));\n\t\t}\n\t}\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tSpectrun action frames Handler such as channel switch annoucement,\n\t\tmeasurement report, measurement request actions frames.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID PeerSpectrumAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\n\tUCHAR\tAction = Elem->Msg[LENGTH_802_11+1];\n\n\tif (pAd->CommonCfg.bIEEE80211H != TRUE)\n\t\treturn;\n\n\tswitch(Action)\n\t{\n\t\tcase SPEC_MRQ:\n\t\t\t/* current rt2860 unable do such measure specified in Measurement Request.*/\n\t\t\t/* reject all measurement request.*/\n\t\t\tPeerMeasureReqAction(pAd, Elem);\n\t\t\tbreak;\n\n\t\tcase SPEC_MRP:\n\t\t\tPeerMeasureReportAction(pAd, Elem);\n\t\t\tbreak;\n\n\t\tcase SPEC_TPCRQ:\n\t\t\tPeerTpcReqAction(pAd, Elem);\n\t\t\tbreak;\n\n\t\tcase SPEC_TPCRP:\n\t\t\tPeerTpcRepAction(pAd, Elem);\n\t\t\tbreak;\n\n\t\tcase SPEC_CHANNEL_SWITCH:\n\n#ifdef DOT11N_DRAFT3\n\t\t\t{\n\t\t\t\tSEC_CHA_OFFSET_IE\tSecondary;\n\t\t\t\tCHA_SWITCH_ANNOUNCE_IE\tChannelSwitch;\n\n\t\t\t\t/* 802.11h only has Channel Switch Announcement IE. */\n\t\t\t\tRTMPMoveMemory(&ChannelSwitch, &Elem->Msg[LENGTH_802_11+4], sizeof (CHA_SWITCH_ANNOUNCE_IE));\n\t\t\t\t\t\n\t\t\t\t/* 802.11n D3.03 adds secondary channel offset element in the end.*/\n\t\t\t\tif (Elem->MsgLen ==  (LENGTH_802_11 + 2 + sizeof (CHA_SWITCH_ANNOUNCE_IE) + sizeof (SEC_CHA_OFFSET_IE)))\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(&Secondary, &Elem->Msg[LENGTH_802_11+9], sizeof (SEC_CHA_OFFSET_IE));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSecondary.SecondaryChannelOffset = 0;\n\t\t\t\t}\n\n\t\t\t\tif ((Elem->Msg[LENGTH_802_11+2] == IE_CHANNEL_SWITCH_ANNOUNCEMENT) && (Elem->Msg[LENGTH_802_11+3] == 3))\n\t\t\t\t{\n\t\t\t\t\tChannelSwitchAction(pAd, Elem->Wcid, ChannelSwitch.NewChannel, Secondary.SecondaryChannelOffset);\n\t\t\t\t}\n\t\t\t}\n#endif /* DOT11N_DRAFT3 */\n\n\t\t\tPeerChSwAnnAction(pAd, Elem);\n\t\t\tbreak;\n\t}\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\t\n\tParametrs:\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nINT Set_MeasureReq_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT Aid = 1;\n\tUINT ArgIdx;\n\tPSTRING thisChar;\n\n\tMEASURE_REQ_MODE MeasureReqMode;\n\tUINT8 MeasureReqToken = RandomByte(pAd);\n\tUINT8 MeasureReqType = RM_BASIC;\n\tUINT8 MeasureCh = 1;\n\tUINT64 MeasureStartTime = GetCurrentTimeStamp(pAd);\n\tMEASURE_REQ MeasureReq;\n\tUINT8 TotalLen;\n\n\tHEADER_802_11 ActHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen;\n\n\tNStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);  /*Get an unused nonpaged memory*/\n\tif(NStatus != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s() allocate memory failed \\n\", __FUNCTION__));\n\t\tgoto END_OF_MEASURE_REQ;\n\t}\n\n\tArgIdx = 1;\n\twhile ((thisChar = strsep((char **)&arg, \"-\")) != NULL)\n\t{\n\t\tswitch(ArgIdx)\n\t\t{\n\t\t\tcase 1:\t/* Aid.*/\n\t\t\t\tAid = (UINT8) simple_strtol(thisChar, 0, 16);\n\t\t\t\tbreak;\n\n\t\t\tcase 2: /* Measurement Request Type.*/\n\t\t\t\tMeasureReqType = simple_strtol(thisChar, 0, 16);\n\t\t\t\tif (MeasureReqType > 3)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: unknow MeasureReqType(%d)\\n\", __FUNCTION__, MeasureReqType));\n\t\t\t\t\tgoto END_OF_MEASURE_REQ;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3: /* Measurement channel.*/\n\t\t\t\tMeasureCh = (UINT8) simple_strtol(thisChar, 0, 16);\n\t\t\t\tbreak;\n\t\t}\n\t\tArgIdx++;\n\t}\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Aid = %d, MeasureReqType=%d MeasureCh=%d\\n\", __FUNCTION__, Aid, MeasureReqType, MeasureCh));\n\tif (!VALID_WCID(Aid))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: unknow sta of Aid(%d)\\n\", __FUNCTION__, Aid));\n\t\tgoto END_OF_MEASURE_REQ;\n\t}\n\n\tMeasureReqMode.word = 0;\n\tMeasureReqMode.field.Enable = 1;\n\n\tMeasureReqInsert(pAd, MeasureReqToken);\n\n\t/* build action frame header.*/\n\tMgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pAd->MacTab.Content[Aid].Addr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->CurrentAddress);\n\n\tNdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));\n\tFrameLen = sizeof(HEADER_802_11);\n\n\tTotalLen = sizeof(MEASURE_REQ_INFO) + sizeof(MEASURE_REQ);\n\n\tMakeMeasurementReqFrame(pAd, pOutBuffer, &FrameLen,\n\t\tsizeof(MEASURE_REQ_INFO), CATEGORY_RM, RM_BASIC,\n\t\tMeasureReqToken, MeasureReqMode.word,\n\t\tMeasureReqType, 1);\n\n\tMeasureReq.ChNum = MeasureCh;\n\tMeasureReq.MeasureStartTime = cpu2le64(MeasureStartTime);\n\tMeasureReq.MeasureDuration = cpu2le16(2000);\n\n\t{\n\t\tULONG TempLen;\n\t\tMakeOutgoingFrame(\tpOutBuffer+FrameLen,\t&TempLen,\n\t\t\t\t\t\t\tsizeof(MEASURE_REQ),\t&MeasureReq,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\tFrameLen += TempLen;\n\t}\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, (UINT)FrameLen);\n\nEND_OF_MEASURE_REQ:\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\treturn TRUE;\n}\n\nINT Set_TpcReq_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT Aid;\n\n\tUINT8 TpcReqToken = RandomByte(pAd);\n\n\tAid = (UINT) simple_strtol(arg, 0, 16);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::Aid = %d\\n\", __FUNCTION__, Aid));\n\tif (!VALID_WCID(Aid))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: unknow sta of Aid(%d)\\n\", __FUNCTION__, Aid));\n\t\treturn TRUE;\n\t}\n\n\tTpcReqInsert(pAd, TpcReqToken);\n\n\tEnqueueTPCReq(pAd, pAd->MacTab.Content[Aid].Addr, TpcReqToken);\n\n\treturn TRUE;\n}\n\n#ifdef CONFIG_AP_SUPPORT\nINT Set_PwrConstraint(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\ntypedef struct __PWR_CONSTRAIN_CFG\n{\n\tCHAR Attenuation;\n\tULONG TxPowerPercentage;\t\n} PWR_CONSTRAIN_CFG;\n\n\tPWR_CONSTRAIN_CFG PwrConstrainTab[] =\n\t{\n\t\t{0, 100},\n\t\t{1, 70},\n\t\t{4, 50},\n\t\t{6, 20},\n\t\t{10, 10},\n\t\t{13, 5}\n\t};\n#define PWR_CONSTRAION_TAB_SIZE \\\n\t(sizeof(PwrConstrainTab)/sizeof(PWR_CONSTRAIN_CFG))\n\n\tINT Idx;\n\tLONG Value;\n\tCHAR MaxTxPwr;\n\tCHAR CurTxPwr;\n\tCHAR DaltaPwr;\n\n\tValue = (UINT) simple_strtol(arg, 0, 10);\n\tMaxTxPwr = GetRegulatoryMaxTxPwr(pAd, pAd->CommonCfg.Channel) - (CHAR)Value;\n\tCurTxPwr = RTMP_GetTxPwr(pAd, pAd->MacTab.Content[0].HTPhyMode);\n\tDaltaPwr = CurTxPwr - MaxTxPwr;\n\n\tif (pAd->CommonCfg.TxPowerPercentage > 90)\n\t\t;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 60)\t/* reduce Pwr for 1 dB. */\n\t\tDaltaPwr += 1;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 30)\t/* reduce Pwr for 3 dB. */\n\t\tDaltaPwr += 3;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 15)\t/* reduce Pwr for 6 dB. */\n\t\tDaltaPwr += 6;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 9)\t/* reduce Pwr for 9 dB. */\n\t\tDaltaPwr += 9;\n\telse\t\t\t\t\t\t\t\t\t\t\t/* reduce Pwr for 12 dB. */\n\t\tDaltaPwr += 12;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"MaxTxPwr=%d, CurTxPwr=%d, DaltaPwr=%d\\n\",\n\t\t\t\tMaxTxPwr, CurTxPwr, DaltaPwr));\n\n\tfor (Idx = 0; Idx < PWR_CONSTRAION_TAB_SIZE; Idx++)\n\t{\n\t\tif (DaltaPwr < PwrConstrainTab[Idx].Attenuation)\n\t\t{\n\t\t\tpAd->CommonCfg.PwrConstraint = Value;\n\t\t\tpAd->CommonCfg.TxPowerPercentage =\n\t\t\t\t\tPwrConstrainTab[Idx].TxPowerPercentage;\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (Idx == PWR_CONSTRAION_TAB_SIZE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, \\\n\t\t\t(\"Power constraint value be in range from 0 to 13dB\\n\"));\n\t}\n\n\n\treturn TRUE;\n}\n\n\nstatic PDOT11_REGULATORY_INFORMATION GetRugClassRegion(\n\tIN PSTRING pCountryCode,\n\tIN UINT8 RugClass)\n{\n\tPDOT11_REGULATORY_INFORMATION pRugClass;\n\n\tpRugClass = NULL;\n\tdo\n\t{\n\t\tif (strncmp(pCountryCode, \"US\", 2) == 0)\n\t\t{\n\t\t\tif (RugClass >= USA_REGULATORY_INFO_SIZE)\n\t\t\t\tbreak;\n\t\t\tpRugClass = &USARegulatoryInfo[RugClass];\n\t\t}\n\n\t\tif (strncmp(pCountryCode, \"JP\", 2) == 0)\n\t\t{\n\t\t\tif (RugClass >= JP_REGULATORY_INFO_SIZE)\n\t\t\t\tbreak;\n\t\t\tpRugClass = &JapanRegulatoryInfo[RugClass];\n\n\t\t}\n\t} while (FALSE);\n\n\treturn pRugClass;\n}\n\nVOID RguClass_BuildBcnChList(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pBuf,\n\tOUT\tPULONG pBufLen)\n{\n\tINT loop;\n\tULONG TmpLen;\n\tPDOT11_REGULATORY_INFORMATION pRguClassRegion;\n\tPDOT11_CHANNEL_SET pChList;\n\n\tfor (loop = 0 ;loop < MAX_NUM_OF_REGULATORY_CLASS; loop++)\n\t{\n\t\tif (pAd->CommonCfg.RegulatoryClass[loop] == 0)\n\t\t\tbreak;\n\n\t\tpRguClassRegion = GetRugClassRegion(\n\t\t\t\t\t\t\t(PSTRING)pAd->CommonCfg.CountryCode,\n\t\t\t\t\t\t\tpAd->CommonCfg.RegulatoryClass[loop]);\n\n\t\tpChList = &pRguClassRegion->ChannelSet;\n\n\t\tif (pRguClassRegion == NULL)\n\t\t\treturn;\n\n\t\tMakeOutgoingFrame(pBuf + *pBufLen,\t\t&TmpLen,\n\t\t\t\t\t\t\t1,                 \t&pChList->ChannelList[0],\n\t\t\t\t\t\t\t1,                 \t&pChList->NumberOfChannels,\n\t\t\t\t\t\t\t1,                 \t&pChList->MaxTxPwr,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pBufLen += TmpLen;\n\t}\n\n\treturn;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n"
  },
  {
    "path": "src/common/txpower.c",
    "content": "/*\n\n*/\n\n#include \"rt_config.h\"\n\n\n#define MDSM_NORMAL_TX_POWER\t\t\t\t\t\t\t0x00\n#define MDSM_DROP_TX_POWER_BY_6dBm\t\t\t\t\t\t0x01\n#define MDSM_DROP_TX_POWER_BY_12dBm\t\t\t\t\t0x02\n#define MDSM_ADD_TX_POWER_BY_6dBm\t\t\t\t\t\t0x03\n#define MDSM_BBP_R1_STATIC_TX_POWER_CONTROL_MASK\t\t0x03\n\nVOID AsicGetTxPowerOffset(RTMP_ADAPTER *pAd, ULONG *TxPwr)\n{\n\tCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC CfgOfTxPwrCtrlOverMAC;\n\tDBGPRINT(RT_DEBUG_INFO, (\"-->AsicGetTxPowerOffset\\n\"));\n\n\tNdisZeroMemory(&CfgOfTxPwrCtrlOverMAC, sizeof(CfgOfTxPwrCtrlOverMAC));\n\n\tCfgOfTxPwrCtrlOverMAC.NumOfEntries = 5; /* MAC 0x1314, 0x1318, 0x131C, 0x1320 and 1324 */\n\n#ifdef DOT11_VHT_AC\n\tif (pAd->CommonCfg.BBPCurrentBW == BW_80 &&\n\t\tpAd->CommonCfg.Channel > 14)\n\t{\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0;\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx80MPwrCfgABand[0];\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1;\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx80MPwrCfgABand[1];\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2;\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx80MPwrCfgABand[2];\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3;\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx80MPwrCfgABand[3];\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4;\n\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx80MPwrCfgABand[4];\n\t}\n\telse\n#endif /* DOT11_VHT_AC */\n\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t{\n\t\tif (pAd->CommonCfg.CentralChannel > 14)\n\t\t{\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx40MPwrCfgABand[0];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx40MPwrCfgABand[1];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx40MPwrCfgABand[2];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx40MPwrCfgABand[3];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx40MPwrCfgABand[4];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx40MPwrCfgGBand[0];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx40MPwrCfgGBand[1];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx40MPwrCfgGBand[2];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx40MPwrCfgGBand[3];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx40MPwrCfgGBand[4];\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.CentralChannel > 14)\n\t\t{\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx20MPwrCfgABand[0];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx20MPwrCfgABand[1];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx20MPwrCfgABand[2];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx20MPwrCfgABand[3];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx20MPwrCfgABand[4];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx20MPwrCfgGBand[0];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx20MPwrCfgGBand[1];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx20MPwrCfgGBand[2];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx20MPwrCfgGBand[3];\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4;\n\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx20MPwrCfgGBand[4];\n\t\t}\n\t}\n\n\tNdisCopyMemory(TxPwr, (UCHAR *)&CfgOfTxPwrCtrlOverMAC, sizeof(CfgOfTxPwrCtrlOverMAC));\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<--AsicGetTxPowerOffset\\n\"));\n}\n\n\nVOID AsicGetAutoAgcOffsetForExternalTxAlc(\n\tIN PRTMP_ADAPTER \t\t\tpAd,\n\tIN PCHAR \t\t\t\t\tpDeltaPwr,\n\tIN PCHAR \t\t\t\t\tpTotalDeltaPwr,\n\tIN PCHAR \t\t\t\t\tpAgcCompensate,\n\tIN PCHAR \t\t\t\t\tpDeltaPowerByBbpR1)\n{\n\tBBP_R49_STRUC\tBbpR49;\n\tBOOLEAN\t\t\tbAutoTxAgc = FALSE;\n\tUCHAR\t\t\tTssiRef, *pTssiMinusBoundary, *pTssiPlusBoundary, TxAgcStep, idx;\n\tPCHAR\t\t\tpTxAgcCompensate = NULL;\n\tCHAR    \t\t\tDeltaPwr = 0;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"-->%s\\n\", __FUNCTION__));\n\n\tBbpR49.byte = 0;\n\n\t/* TX power compensation for temperature variation based on TSSI. Try every 4 second */\n\tif (pAd->Mlme.OneSecPeriodicRound % 4 == 0)\n\t{\n\t\tif (pAd->CommonCfg.Channel <= 14)\n\t\t{\n\t\t\t/* bg channel */\n\t\t\tbAutoTxAgc = pAd->bAutoTxAgcG;\n\t\t\tTssiRef = pAd->TssiRefG;\n\t\t\tpTssiMinusBoundary = &pAd->TssiMinusBoundaryG[0];\n\t\t\tpTssiPlusBoundary = &pAd->TssiPlusBoundaryG[0];\n\t\t\tTxAgcStep = pAd->TxAgcStepG;\n\t\t\tpTxAgcCompensate = &pAd->TxAgcCompensateG;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* a channel */\n\t\t\tbAutoTxAgc = pAd->bAutoTxAgcA;\n\t\t\tTssiRef = pAd->TssiRefA;\n\t\t\tpTssiMinusBoundary = &pAd->TssiMinusBoundaryA[0];\n\t\t\tpTssiPlusBoundary = &pAd->TssiPlusBoundaryA[0];\n\t\t\tTxAgcStep = pAd->TxAgcStepA;\n\t\t\tpTxAgcCompensate = &pAd->TxAgcCompensateA;\n\t\t}\n\n\t\tif (bAutoTxAgc)\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49.byte);\n\n\t\t\t/* TSSI representation */\n\t\t\tif (IS_RT3071(pAd) || IS_RT3390(pAd) || IS_RT3090A(pAd) || IS_RT3572(pAd)) /* 5-bits */\n\t\t\t{\n\t\t\t\tBbpR49.byte = (BbpR49.byte & 0x1F);\n\t\t\t}\n\t\t\t\t\n\t\t\t/* (p) TssiPlusBoundaryG[0] = 0 = (m) TssiMinusBoundaryG[0] */\n\t\t\t/* compensate: +4     +3   +2   +1    0   -1   -2   -3   -4 * steps */\n\t\t\t/* step value is defined in pAd->TxAgcStepG for tx power value */\n\n\t\t\t/* [4]+1+[4]   p4     p3   p2   p1   o1   m1   m2   m3   m4 */\n\t\t\t/* ex:         0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0\n\t\t\t    above value are examined in mass factory production */\n\t\t\t/*             [4]    [3]  [2]  [1]  [0]  [1]  [2]  [3]  [4] */\n\n\t\t\t/* plus (+) is 0x00 ~ 0x45, minus (-) is 0xa0 ~ 0xf0 */\n\t\t\t/* if value is between p1 ~ o1 or o1 ~ s1, no need to adjust tx power */\n\t\t\t/* if value is 0xa5, tx power will be -= TxAgcStep*(2-1) */\n\n\t\t\tif (BbpR49.byte > pTssiMinusBoundary[1])\n\t\t\t{\n\t\t\t\t/* Reading is larger than the reference value */\n\t\t\t\t/* Check for how large we need to decrease the Tx power */\n\t\t\t\tfor (idx = 1; idx < 5; idx++)\n\t\t\t\t{\n\t\t\t\t\tif (BbpR49.byte <= pTssiMinusBoundary[idx])  /* Found the range */\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* The index is the step we should decrease, idx = 0 means there is nothing to compensate */\n\n\t\t\t\t*pTxAgcCompensate = -(TxAgcStep * (idx-1));\t\t\t\n\t\t\t\tDeltaPwr += (*pTxAgcCompensate);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"-- Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = -%d\\n\",\n\t\t\t\t\t                BbpR49.byte, TssiRef, TxAgcStep, idx-1));                    \n\t\t\t}\n\t\t\telse if (BbpR49.byte < pTssiPlusBoundary[1])\n\t\t\t{\n\t\t\t\t/* Reading is smaller than the reference value */\n\t\t\t\t/* Check for how large we need to increase the Tx power */\n\t\t\t\tfor (idx = 1; idx < 5; idx++)\n\t\t\t\t{\n\t\t\t\t\tif (BbpR49.byte >= pTssiPlusBoundary[idx])   /* Found the range*/\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* The index is the step we should increase, idx = 0 means there is nothing to compensate */\n\t\t\t\t*pTxAgcCompensate = TxAgcStep * (idx-1);\n\t\t\t\tDeltaPwr += (*pTxAgcCompensate);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"++ Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\\n\",\n\t\t\t\t                \tBbpR49.byte, TssiRef, TxAgcStep, idx-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*pTxAgcCompensate = 0;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"   Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\\n\",\n\t\t\t\t                \tBbpR49.byte, TssiRef, TxAgcStep, 0));\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.Channel <= 14)\n\t\t{\n\t\t\tbAutoTxAgc = pAd->bAutoTxAgcG;\n\t\t\tpTxAgcCompensate = &pAd->TxAgcCompensateG;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbAutoTxAgc = pAd->bAutoTxAgcA;\n\t\t\tpTxAgcCompensate = &pAd->TxAgcCompensateA;\n\t\t}\n\n\t\tif (bAutoTxAgc)\n\t\t\tDeltaPwr += (*pTxAgcCompensate);\n\t}\n\n\n\t*pDeltaPwr = DeltaPwr;\n\t*pAgcCompensate = *pTxAgcCompensate;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<--%s\\n\", __FUNCTION__));\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tGives CCK TX rate 2 more dB TX power.\n\t\tThis routine works only in LINK UP in INFRASTRUCTURE mode.\n\n\t\tcalculate desired Tx power in RF R3.Tx0~5,\tshould consider -\n\t\t0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment)\n\t\t1. TxPowerPercentage\n\t\t2. auto calibration based on TSSI feedback\n\t\t3. extra 2 db for CCK\n\t\t4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP\n\n\tNOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment),\n\t\tit should be called AFTER MlmeDynamicTxRatSwitching()\n\t==========================================================================\n */\n\nVOID AsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tINT\t\t\ti, j;\n\tCHAR \t\tValue;\n\tCHAR\t\tRssi = -127;\n\tCHAR\t\tDeltaPwr = 0;\n\tCHAR\t\tTxAgcCompensate = 0;\n\tCHAR\t\tDeltaPowerByBbpR1 = 0; \n\tCHAR\t\tTotalDeltaPower = 0; /* (non-positive number) including the transmit power controlled by the MAC and the BBP R1 */\n\tCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC CfgOfTxPwrCtrlOverMAC = {0};\t\n#ifdef SINGLE_SKU\n\tCHAR\t\tTotalDeltaPowerOri = 0;\n\tUCHAR\t\tSingleSKUBbpR1Offset = 0;\n\tULONG\t\tSingleSKUTotalDeltaPwr[MAX_TXPOWER_ARRAY_SIZE] = {0};\n#endif /* SINGLE_SKU */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t\treturn;\n\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) || \n\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\treturn;\n\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif(INFRA_ON(pAd))\n\t\t{\n\t\t\tRssi = RTMPMaxRssi(pAd, \n\t\t\t\t\t\t   pAd->StaCfg.RssiSample.AvgRssi0, \n\t\t\t\t\t\t   pAd->StaCfg.RssiSample.AvgRssi1, \n\t\t\t\t\t\t   pAd->StaCfg.RssiSample.AvgRssi2);\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Get Tx rate offset table which from EEPROM 0xDEh ~ 0xEFh */\n\tRTMP_CHIP_ASIC_TX_POWER_OFFSET_GET(pAd, (PULONG)&CfgOfTxPwrCtrlOverMAC);\n\t/* Get temperature compensation delta power value */\n\tRTMP_CHIP_ASIC_AUTO_AGC_OFFSET_GET(\n\t\tpAd, &DeltaPwr, &TotalDeltaPower, &TxAgcCompensate, &DeltaPowerByBbpR1);\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s: DeltaPwr=%d, TotalDeltaPower=%d, TxAgcCompensate=%d, DeltaPowerByBbpR1=%d\\n\",\n\t\t\t__FUNCTION__,\n\t\t\tDeltaPwr,\n\t\t\tTotalDeltaPower,\n\t\t\tTxAgcCompensate,\n\t\t\tDeltaPowerByBbpR1));\n\t\t\n\t/* Get delta power based on the percentage specified from UI */\n\t//AsicPercentageDeltaPower(pAd, Rssi, &DeltaPwr,&DeltaPowerByBbpR1);\n\n\t/* The transmit power controlled by the BBP */\n\tTotalDeltaPower += DeltaPowerByBbpR1; \n\t/* The transmit power controlled by the MAC */\n\tTotalDeltaPower += DeltaPwr; \t\n\n#ifdef SINGLE_SKU\n\tif (pAd->CommonCfg.bSKUMode == TRUE)\n\t{\n\t\t/* Re calculate delta power while enabling Single SKU */\n\t\tGetSingleSkuDeltaPower(pAd, &TotalDeltaPower, (PULONG)&SingleSKUTotalDeltaPwr, &SingleSKUBbpR1Offset);\n\t\n\t\tTotalDeltaPowerOri = TotalDeltaPower;\n\t}\n\telse\n#endif /* SINGLE_SKU */\n\t{\n\t\tAsicCompensatePowerViaBBP(pAd, &TotalDeltaPower);\n\t}\t\t\t\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t\treturn;\n#endif /* MT7601 */\n\n\t/* Power will be updated each 4 sec. */\n\tif (pAd->Mlme.OneSecPeriodicRound % 4 == 0)\n\t{\n/*****************************************************************************/\n\t\t/* Set new Tx power for different Tx rates */\n\t\tfor (i=0; i < CfgOfTxPwrCtrlOverMAC.NumOfEntries; i++)\n\t\t{\n\t\t\tTX_POWER_CONTROL_OVER_MAC_ENTRY *pTxPwrEntry;\n\t\t\tULONG reg_val;\n\n\t\t\tpTxPwrEntry = &CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i];\n\t\t\treg_val = pTxPwrEntry->RegisterValue;\n\t\t\tif (reg_val != 0xffffffff)\n\t\t\t{\t\n\t\t\t\tfor (j=0; j<8; j++)\n\t\t\t\t{\n\t\t\t\t\tCHAR _upbound, _lowbound, t_pwr;\n\t\t\t\t\tBOOLEAN _bValid;\n\n\t\t\t\t\t_lowbound = 0;\n\t\t\t\t\t_bValid = TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tValue = (CHAR)((reg_val >> j*4) & 0x0F);\n#ifdef SINGLE_SKU\n\t\t\t\t\tif (pAd->CommonCfg.bSKUMode == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tTotalDeltaPower = SingleSKUBbpR1Offset + TotalDeltaPowerOri - (CHAR)((SingleSKUTotalDeltaPwr[i] >> j*4) & 0x0F);\t\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: BbpR1Offset(%d) + TX ALC(%d) - SingleSKU[%d/%d](%d) = TotalDeltaPower(%d)\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, SingleSKUBbpR1Offset,\n\t\t\t\t\t\t\tTotalDeltaPowerOri, i, j,\n\t\t\t\t\t\t\t(CHAR)((SingleSKUTotalDeltaPwr[i] >> j*4) & 0x0F),\n\t\t\t\t\t\t\tTotalDeltaPower));\n\t\t\t\t\t}\n#endif /* SINGLE_SKU */\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)\n\t\t\t\t\t/* The upper bounds of MAC 0x1314 ~ 0x1324 are variable */\n\t\t\t\t\tif ((pAd->TxPowerCtrl.bInternalTxALC == TRUE)^(pAd->chipCap.bTempCompTxALC == TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (0x1314 + (i * 4))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 0x1314: \n\t\t\t\t\t\t\t\t_upbound = 0xe;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x1318: \n\t\t\t\t\t\t\t\t_upbound = (j <= 3) ? 0xc : 0xe;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x131C: \n\t\t\t\t\t\t\t\t_upbound = ((j == 0) || (j == 2) || (j == 3)) ? 0xc : 0xe;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x1320: \n\t\t\t\t\t\t\t\t_upbound = (j == 1) ? 0xe : 0xc;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x1324: \n\t\t\t\t\t\t\t\t_upbound = 0xc;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault: \n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* do nothing */\n\t\t\t\t\t\t\t\t_bValid = FALSE;\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Unknown register = 0x%x\\n\", __FUNCTION__, (0x1314 + (i * 4))));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\t\t\t\t\t\t_upbound = 0xc;\n\n\t\t\t\t\tif (_bValid)\n\t\t\t\t\t{\n\t\t\t\t\t\tt_pwr = Value + TotalDeltaPower;\n\t\t\t\t\t\tif (t_pwr < _lowbound)\n\t\t\t\t\t\t\tValue = _lowbound;\n\t\t\t\t\t\telse if (t_pwr > _upbound)\n\t\t\t\t\t\t\tValue = _upbound;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tValue = t_pwr;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Fill new value into the corresponding MAC offset */\n\t\t\t\t\treg_val  = (reg_val & ~(0x0000000F << j*4)) | (Value << j*4);\n\t\t\t\t}\n\n\t\t\t\tpTxPwrEntry->RegisterValue = reg_val;\n\t\t\t\tRTMP_IO_WRITE32(pAd, pTxPwrEntry->MACRegisterOffset, pTxPwrEntry->RegisterValue);\n\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Extra set MAC registers to compensate Tx power if any */\n\t\tRTMP_CHIP_ASIC_EXTRA_POWER_OVER_MAC(pAd);\n\t}\n\n}\n\n\n#ifdef SINGLE_SKU\nVOID GetSingleSkuDeltaPower(\n\tIN \t\tPRTMP_ADAPTER \tpAd,\n\tIN \t\tPCHAR \t\t\tpTotalDeltaPower,\n\tINOUT \tPULONG\t\t\tpSingleSKUTotalDeltaPwr,\n\tINOUT  \tPUCHAR              \tpSingleSKUBbpR1Offset) \n{\n\tINT\t\ti, j;\n\tCHAR\tValue;\n\tCHAR \tMinValue = 127;\n\tUCHAR\tBbpR1 = 0;\n\tUCHAR  \tTxPwrInEEPROM = 0xFF, CountryTxPwr = 0xFF, criterion;\n\tUCHAR   \tAdjustMaxTxPwr[(MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS * 8)]; \n\tCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC CfgOfTxPwrCtrlOverMAC = {0};\n\t\n\t/* Get TX rate offset table which from EEPROM 0xDEh ~ 0xEFh */\n\tRTMP_CHIP_ASIC_TX_POWER_OFFSET_GET(pAd, (PULONG)&CfgOfTxPwrCtrlOverMAC);\n\t\t\n\t/* Handle regulatory max. TX power constraint */\n\tif (pAd->CommonCfg.Channel > 14) \n\t{\n\t\tTxPwrInEEPROM = ((pAd->CommonCfg.DefineMaxTxPwr & 0xFF00) >> 8); /* 5G band */\n\t}\n\telse \n\t{\n\t\tTxPwrInEEPROM = (pAd->CommonCfg.DefineMaxTxPwr & 0x00FF); /* 2.4G band */\n\t}\n\n\tCountryTxPwr = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel); \n\n\t/* Use OFDM 6M as the criterion */\n\tcriterion = (UCHAR)((CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue & 0x000F0000) >> 16);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: criterion=%d, TxPwrInEEPROM=%d, CountryTxPwr=%d\\n\", \n\t\t__FUNCTION__, criterion, TxPwrInEEPROM, CountryTxPwr));\n\n\t/* Adjust max. TX power according to the relationship of TX power in EEPROM */\n\tfor (i=0; i<CfgOfTxPwrCtrlOverMAC.NumOfEntries; i++)\n\t{\n\t\tif (i == 0)\n\t\t{\n\t\t\tfor (j=0; j<8; j++)\n\t\t\t{\n\t\t\t\tValue = (CHAR)((CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].RegisterValue >> j*4) & 0x0F); \n\n\t\t\t\tif (j < 4)\n\t\t\t\t{\n\t\t\t\t\tAdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion) + 4; /* CCK has 4dBm larger than OFDM */\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tAdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion);\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: offset = 0x%04X, i/j=%d/%d, (Default)Value=%d, %d\\n\", \n\t\t\t\t\t__FUNCTION__,\n\t\t\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].MACRegisterOffset,\n\t\t\t\t\ti, \n\t\t\t\t\tj, \n\t\t\t\t\tValue, \n\t\t\t\t\tAdjustMaxTxPwr[i*8+j]));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (j=0; j<8; j++)\n\t\t\t{\n\t\t\t\tValue = (CHAR)((CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].RegisterValue >> j*4) & 0x0F);\n\n\t\t\t\tAdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: offset = 0x%04X, i/j=%d/%d, (Default)Value=%d, %d\\n\", \n\t\t\t\t\t__FUNCTION__,\n\t\t\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].MACRegisterOffset, \n\t\t\t\t\ti, \n\t\t\t\t\tj, \n\t\t\t\t\tValue, \n\t\t\t\t\tAdjustMaxTxPwr[i*8+j]));\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Adjust TX power according to the relationship */\n\tfor (i=0; i<CfgOfTxPwrCtrlOverMAC.NumOfEntries; i++)\n\t{\n\t\tif (CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].RegisterValue != 0xffffffff)\n\t\t{\n\t\t\tfor (j=0; j<8; j++)\n\t\t\t{\n\t\t\t\tValue = (CHAR)((CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].RegisterValue >> j*4) & 0x0F);\n\n\t\t\t\t/* The TX power is larger than the regulatory, the power should be restrained */\n\t\t\t\tif (AdjustMaxTxPwr[i*8+j] > CountryTxPwr)\n\t\t\t\t{\n\t\t\t\t\tValue = (AdjustMaxTxPwr[i*8+j] - CountryTxPwr);\n\t\t\t\t\t\n\t\t\t\t\tif (Value > 0xF)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* The output power is larger than Country Regulatory over 15dBm, the origianl design has overflow case */\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s: Value overflow - %d\\n\", __FUNCTION__, Value));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t*(pSingleSKUTotalDeltaPwr+i) = (*(pSingleSKUTotalDeltaPwr+i) & ~(0x0000000F << j*4)) | (Value << j*4);\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: offset = 0x%04X, i/j=%d/%d, (Exceed)Value=%d, %d\\n\", \n\t\t\t\t\t\t__FUNCTION__,\n\t\t\t\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].MACRegisterOffset, \n\t\t\t\t\t\ti, \n\t\t\t\t\t\tj, \n\t\t\t\t\t\tValue, \n\t\t\t\t\t\tAdjustMaxTxPwr[i*8+j]));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: offset = 0x%04X, i/j=%d/%d, Value=%d, %d, no change\\n\",\n\t\t\t\t\t\t__FUNCTION__,\n\t\t\t\t\t\tCfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].MACRegisterOffset, \n\t\t\t\t\t\ti, \n\t\t\t\t\t\tj, \n\t\t\t\t\t\tValue, \n\t\t\t\t\t\tAdjustMaxTxPwr[i*8+j]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Calculate the min. TX power */\n\tfor(i=0; i<CfgOfTxPwrCtrlOverMAC.NumOfEntries; i++)\n\t{\n\t\tif (CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].RegisterValue != 0xffffffff)\n\t\t{\n\t\t\tfor (j=0; j<8; j++)\n\t\t\t{\n\t\t\t\tCHAR PwrChange;\n\t\t\t\t/* \n\t\t\t\t   After Single SKU, each data rate offset power value is saved in TotalDeltaPwr[].\n\t\t\t\t   PwrChange will add SingleSKUDeltaPwr and TotalDeltaPwr[] for each data rate to calculate\n\t\t\t\t   the final adjust output power value which is saved in MAC Reg. and BBP_R1.\n\t\t\t\t*/\n\t\t\t\t\n\t\t\t\t/*   \n\t\t\t\t   Value / TxPwr[] is get from eeprom 0xDEh ~ 0xEFh and increase or decrease the  \n\t\t\t\t   20/40 Bandwidth Delta Value in eeprom 0x50h. \n\t\t\t\t*/\n\t\t\t\tValue = (CHAR)((CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[i].RegisterValue >> j*4) & 0x0F); /* 0 ~ 15 */\n\n\t\t\t\t/* Fix the corner case of Single SKU read eeprom offset 0xF0h ~ 0xFEh which for BBP Instruction configuration */\n\t\t\t\tif (Value == 0xF)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/* Value_offset is current Pwr comapre with Country Regulation and need adjust delta value */\n\t\t\t\tPwrChange = (CHAR)((*(pSingleSKUTotalDeltaPwr+i) >> j*4) & 0x0F); /* 0 ~ 15 */\n\t\t\t\tPwrChange -= *pTotalDeltaPower;\n\n\t\t\t\tValue -= PwrChange;\n\t\t\t\t\n\t\t\t\tif (MinValue > Value)\n\t\t\t\t\tMinValue = Value;\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpR1);\n\t/* Depend on the min. TX power to adjust and prevent the value of MAC_TX_PWR_CFG less than 0 */\n\tif ((MinValue < 0) && (MinValue >= -6))\n\t{\n\t\tBbpR1 |= MDSM_DROP_TX_POWER_BY_6dBm;\n\t\t*pSingleSKUBbpR1Offset = 6;\n\t}\n\telse if ((MinValue < -6)&&(MinValue >= -12))\n\t{\n\t\tBbpR1 |= MDSM_DROP_TX_POWER_BY_12dBm;\n\t\t*pSingleSKUBbpR1Offset = 12;\n\t}\n\telse if (MinValue < -12)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s: ASIC limit..\\n\", __FUNCTION__));\n\t\tBbpR1 |= MDSM_DROP_TX_POWER_BY_12dBm;\n\t\t*pSingleSKUBbpR1Offset = 12;\n\t}\n\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpR1);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: <After BBP R1> TotalDeltaPower = %d dBm, BbpR1 = 0x%02X \\n\", __FUNCTION__, *pTotalDeltaPower, BbpR1));\n}\n#endif /* SINGLE_SKU */\n\n\nVOID AsicPercentageDeltaPower(\n\tIN \t\tPRTMP_ADAPTER \t\tpAd,\n\tIN\t\tCHAR\t\t\t\tRssi,\n\tINOUT\tPCHAR\t\t\t\tpDeltaPwr,\n\tINOUT\tPCHAR\t\t\t\tpDeltaPowerByBbpR1) \n{\n\t/* \n\t\tCalculate delta power based on the percentage specified from UI.\n\t\tE2PROM setting is calibrated for maximum TX power (i.e. 100%).\n\t\tWe lower TX power here according to the percentage specified from UI.\n\t*/\n\t\n\tif (pAd->CommonCfg.TxPowerPercentage >= 100) /* AUTO TX POWER control */\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((pAd->OpMode == OPMODE_STA)\n#ifdef P2P_SUPPORT\n\t\t\t&& (!P2P_GO_ON(pAd))\n#endif /* P2P_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* To patch high power issue with some APs, like Belkin N1.*/\n\t\t\tif (Rssi > -35)\n\t\t\t{\n\t\t\t\t*pDeltaPwr -= 12;\n\t\t\t}\n\t\t\telse if (Rssi > -40)\n\t\t\t{\n\t\t\t\t*pDeltaPwr -= 6;\n\t\t\t}\n\t\t\telse\n\t\t\t\t;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\telse if (pAd->CommonCfg.TxPowerPercentage > 90) /* 91 ~ 100% & AUTO, treat as 100% in terms of mW */\n\t\t;\n\telse if (pAd->CommonCfg.TxPowerPercentage > 60) /* 61 ~ 90%, treat as 75% in terms of mW\t\t DeltaPwr -= 1; */\n\t{\n\t\t*pDeltaPwr -= 1;\n\t}\n\telse if (pAd->CommonCfg.TxPowerPercentage > 30) /* 31 ~ 60%, treat as 50% in terms of mW\t\t DeltaPwr -= 3; */\n\t{\n\t\t*pDeltaPwr -= 3;\n\t}\n\telse if (pAd->CommonCfg.TxPowerPercentage > 15) /* 16 ~ 30%, treat as 25% in terms of mW\t\t DeltaPwr -= 6; */\n\t{\n\t\t*pDeltaPowerByBbpR1 -= 6; /* -6 dBm */\n\t}\n\telse if (pAd->CommonCfg.TxPowerPercentage > 9) /* 10 ~ 15%, treat as 12.5% in terms of mW\t\t DeltaPwr -= 9; */\n\t{\n\t\t*pDeltaPowerByBbpR1 -= 6; /* -6 dBm */\n\t\t*pDeltaPwr -= 3;\n\t}\n\telse /* 0 ~ 9 %, treat as MIN(~3%) in terms of mW\t\t DeltaPwr -= 12; */\n\t{\n\t\t*pDeltaPowerByBbpR1 -= 12; /* -12 dBm */\n\t}\n}\n\n\nVOID AsicCompensatePowerViaBBP(\n\tIN \t\tPRTMP_ADAPTER \t\tpAd,\n\tINOUT\tPCHAR\t\t\t\tpTotalDeltaPower) \n{\n\tUCHAR mdsm_drop_pwr;\n\t\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s: <Before BBP R1> TotalDeltaPower = %d dBm\\n\", __FUNCTION__, *pTotalDeltaPower));\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\treturn;\n\t}\n#endif /* MT7601 */\n\n\tif (*pTotalDeltaPower <= -12)\n\t{\n\t\t*pTotalDeltaPower += 12;\n\t\tmdsm_drop_pwr = MDSM_DROP_TX_POWER_BY_12dBm;\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: Drop the transmit power by 12 dBm (BBP R1)\\n\", __FUNCTION__));\n\t}\n\telse if ((*pTotalDeltaPower <= -6) && (*pTotalDeltaPower > -12))\n\t{\n\t\t*pTotalDeltaPower += 6;\n\t\tmdsm_drop_pwr = MDSM_DROP_TX_POWER_BY_6dBm;\n\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: Drop the transmit power by 6 dBm (BBP R1)\\n\", __FUNCTION__));\n\t}\n\telse\n\t{\n\t\t/* Control the the transmit power by using the MAC only */\n\t\tmdsm_drop_pwr = MDSM_NORMAL_TX_POWER;\n\t}\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t{\n\t\tUINT32 bbp_val = 0;\n\n\t\tRTMP_BBP_IO_READ32(pAd, TXBE_R4, &bbp_val);\n\t\tbbp_val &= (~0x3);\n\t\tbbp_val |= mdsm_drop_pwr;\n\t\tRTMP_BBP_IO_WRITE32(pAd, TXBE_R4, bbp_val);\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: <After TXBE_R4> TotalDeltaPower = %d dBm, TXBE_R4 = 0x%0x\\n\", __FUNCTION__, *pTotalDeltaPower, bbp_val));\n\t}\n\telse\n#endif /* RT65xx */\n\t{\n\t\tUCHAR\tBbpR1 = 0;\n\t\n\t\t/* The BBP R1 controls the transmit power for all rates */\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpR1);\n\t\tBbpR1 &= ~MDSM_BBP_R1_STATIC_TX_POWER_CONTROL_MASK;\t\n\t\tBbpR1 |= mdsm_drop_pwr;\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpR1);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: <After BBP R1> TotalDeltaPower = %d dBm, BbpR1 = 0x%02X \\n\", __FUNCTION__, *pTotalDeltaPower, BbpR1));\n\t}\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRead initial Tx power per MCS and BW from EEPROM\n\t\t\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPReadTxPwrPerRate(RTMP_ADAPTER *pAd)\n{\n\tULONG\t\tdata, Adata, Gdata;\n\tUSHORT\t\ti, value, value2;\n\tUSHORT\t\tvalue_1, value_2, value_3, value_4;\n\tINT\t\t\tApwrdelta, Gpwrdelta;\n\tUCHAR\t\tt1,t2,t3,t4;\n\tBOOLEAN\t\tbApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;\n\n\n\n\n#ifdef RT8592\n\tif (IS_RT8592(pAd)) {\n\t\tRT85592ReadTxPwrPerRate(pAd);\n\t\treturn;\n\t}\n#endif /* RT8592 */\n\n#ifdef RT65xx\n\tif (IS_RT6590(pAd)) {\n\t\tRT6590ReadTxPwrPerRate(pAd);\n\t\treturn;\n\t}\n#endif /* RT65xx */\n\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd)) {\n\t\tMT7601_ReadTxPwrPerRate(pAd);\n\t\treturn;\n\t}\n#endif /* MT7601 */\n\n\t/* For default one, go here!! */\n\t{\t\n\t\t\n\t\t/* Get power delta for 20MHz and 40MHz.*/\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Txpower per Rate\\n\"));\n\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);\n\t\tApwrdelta = 0;\n\t\tGpwrdelta = 0;\n\n\t\tif ((value2 & 0xff) != 0xff)\n\t\t{\n\t\t\tif ((value2 & 0x80))\n\t\t\t\tGpwrdelta = (value2&0xf);\n\t\t\t\n\t\t\tif ((value2 & 0x40))\n\t\t\t\tbGpwrdeltaMinus = FALSE;\n\t\t\telse\n\t\t\t\tbGpwrdeltaMinus = TRUE;\n\t\t}\n\t\tif ((value2 & 0xff00) != 0xff00)\n\t\t{\n\t\t\tif ((value2 & 0x8000))\n\t\t\t\tApwrdelta = ((value2&0xf00)>>8);\n\n\t\t\tif ((value2 & 0x4000))\n\t\t\t\tbApwrdeltaMinus = FALSE;\n\t\t\telse\n\t\t\t\tbApwrdeltaMinus = TRUE;\n\t\t}\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Gpwrdelta = %x, Apwrdelta = %x .\\n\", Gpwrdelta, Apwrdelta));\n\n\t\t\n\t\t/* Get Txpower per MCS for 20MHz in 2.4G.*/\n\t\t\n\t\tfor (i=0; i<5; i++)\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);\n\t\t\tdata = value;\n\n\t\t\t/* use value_1 ~ value_4 for code size reduce */\n\t\t\tvalue_1 = value&0xf;\n\t\t\tvalue_2 = (value&0xf0)>>4;\n\t\t\tvalue_3 = (value&0xf00)>>8;\n\t\t\tvalue_4 = (value&0xf000)>>12;\n\n\t\t\tif (bApwrdeltaMinus == FALSE)\n\t\t\t{\n\t\t\t\tt1 = value_1+(Apwrdelta);\n\t\t\t\tif (t1 > 0xf)\n\t\t\t\t\tt1 = 0xf;\n\t\t\t\tt2 = value_2+(Apwrdelta);\n\t\t\t\tif (t2 > 0xf)\n\t\t\t\t\tt2 = 0xf;\n\t\t\t\tt3 = value_3+(Apwrdelta);\n\t\t\t\tif (t3 > 0xf)\n\t\t\t\t\tt3 = 0xf;\n\t\t\t\tt4 = value_4+(Apwrdelta);\n\t\t\t\tif (t4 > 0xf)\n\t\t\t\t\tt4 = 0xf;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (value_1 > Apwrdelta)\n\t\t\t\t\tt1 = value_1-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt1 = 0;\n\t\t\t\tif (value_2 > Apwrdelta)\n\t\t\t\t\tt2 = value_2-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt2 = 0;\n\t\t\t\tif (value_3 > Apwrdelta)\n\t\t\t\t\tt3 = value_3-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt3 = 0;\n\t\t\t\tif (value_4 > Apwrdelta)\n\t\t\t\t\tt4 = value_4-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt4 = 0;\n\t\t\t}\t\t\t\t\n\t\t\tAdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);\n\t\t\tif (bGpwrdeltaMinus == FALSE)\n\t\t\t{\n\t\t\t\tt1 = value_1+(Gpwrdelta);\n\t\t\t\tif (t1 > 0xf)\n\t\t\t\t\tt1 = 0xf;\n\t\t\t\tt2 = value_2+(Gpwrdelta);\n\t\t\t\tif (t2 > 0xf)\n\t\t\t\t\tt2 = 0xf;\n\t\t\t\tt3 = value_3+(Gpwrdelta);\n\t\t\t\tif (t3 > 0xf)\n\t\t\t\t\tt3 = 0xf;\n\t\t\t\tt4 = value_4+(Gpwrdelta);\n\t\t\t\tif (t4 > 0xf)\n\t\t\t\t\tt4 = 0xf;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (value_1 > Gpwrdelta)\n\t\t\t\t\tt1 = value_1-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt1 = 0;\n\t\t\t\tif (value_2 > Gpwrdelta)\n\t\t\t\t\tt2 = value_2-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt2 = 0;\n\t\t\t\tif (value_3 > Gpwrdelta)\n\t\t\t\t\tt3 = value_3-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt3 = 0;\n\t\t\t\tif (value_4 > Gpwrdelta)\n\t\t\t\t\tt4 = value_4-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt4 = 0;\n\t\t\t}\t\t\t\t\n\t\t\tGdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);\n\t\t\t\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);\n\n\t\t\t/* use value_1 ~ value_4 for code size reduce */\n\t\t\tvalue_1 = value&0xf;\n\t\t\tvalue_2 = (value&0xf0)>>4;\n\t\t\tvalue_3 = (value&0xf00)>>8;\n\t\t\tvalue_4 = (value&0xf000)>>12;\n\n\t\t\tif (bApwrdeltaMinus == FALSE)\n\t\t\t{\n\t\t\t\tt1 = value_1+(Apwrdelta);\n\t\t\t\tif (t1 > 0xf)\n\t\t\t\t\tt1 = 0xf;\n\t\t\t\tt2 = value_2+(Apwrdelta);\n\t\t\t\tif (t2 > 0xf)\n\t\t\t\t\tt2 = 0xf;\n\t\t\t\tt3 = value_3+(Apwrdelta);\n\t\t\t\tif (t3 > 0xf)\n\t\t\t\t\tt3 = 0xf;\n\t\t\t\tt4 = value_4+(Apwrdelta);\n\t\t\t\tif (t4 > 0xf)\n\t\t\t\t\tt4 = 0xf;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (value_1 > Apwrdelta)\n\t\t\t\t\tt1 = value_1-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt1 = 0;\n\t\t\t\tif (value_2 > Apwrdelta)\n\t\t\t\t\tt2 = value_2-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt2 = 0;\n\t\t\t\tif (value_3 > Apwrdelta)\n\t\t\t\t\tt3 = value_3-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt3 = 0;\n\t\t\t\tif (value_4 > Apwrdelta)\n\t\t\t\t\tt4 = value_4-(Apwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt4 = 0;\n\t\t\t}\t\t\t\t\n\t\t\tAdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));\n\t\t\tif (bGpwrdeltaMinus == FALSE)\n\t\t\t{\n\t\t\t\tt1 = value_1+(Gpwrdelta);\n\t\t\t\tif (t1 > 0xf)\n\t\t\t\t\tt1 = 0xf;\n\t\t\t\tt2 = value_2+(Gpwrdelta);\n\t\t\t\tif (t2 > 0xf)\n\t\t\t\t\tt2 = 0xf;\n\t\t\t\tt3 = value_3+(Gpwrdelta);\n\t\t\t\tif (t3 > 0xf)\n\t\t\t\t\tt3 = 0xf;\n\t\t\t\tt4 = value_4+(Gpwrdelta);\n\t\t\t\tif (t4 > 0xf)\n\t\t\t\t\tt4 = 0xf;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (value_1 > Gpwrdelta)\n\t\t\t\t\tt1 = value_1-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt1 = 0;\n\t\t\t\tif (value_2 > Gpwrdelta)\n\t\t\t\t\tt2 = value_2-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt2 = 0;\n\t\t\t\tif (value_3 > Gpwrdelta)\n\t\t\t\t\tt3 = value_3-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt3 = 0;\n\t\t\t\tif (value_4 > Gpwrdelta)\n\t\t\t\t\tt4 = value_4-(Gpwrdelta);\n\t\t\t\telse\n\t\t\t\t\tt4 = 0;\n\t\t\t}\t\t\t\t\n\t\t\tGdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));\n\t\t\tdata |= (value<<16);\n\n\t\t\t/* For 20M/40M Power Delta issue */\t\t\n\t\t\tpAd->Tx20MPwrCfgABand[i] = data;\n\t\t\tpAd->Tx20MPwrCfgGBand[i] = data;\n\t\t\tpAd->Tx40MPwrCfgABand[i] = Adata;\n\t\t\tpAd->Tx40MPwrCfgGBand[i] = Gdata;\n\t\t\t\n\t\t\tif (data != 0xffffffff)\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"20MHz BW, 2.4G band-%lx,  Adata = %lx,  Gdata = %lx \\n\", data, Adata, Gdata));\n\t\t}\n\t}\n\n\t/* Extra set MAC registers to compensate Tx power if any */\n\tRTMP_CHIP_ASIC_EXTRA_POWER_OVER_MAC(pAd);\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tRead initial channel power parameters from EEPROM\n\t\t\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = PASSIVE_LEVEL\n\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPReadChannelPwr(RTMP_ADAPTER *pAd)\n{\n\tUINT32\t\t\t\t\ti, choffset;\n\tEEPROM_TX_PWR_STRUC\t    Power;\n\tEEPROM_TX_PWR_STRUC\t    Power2;\n\n\t/* Read Tx power value for all channels*/\n\t/* Value from 1 - 0x7f. Default value is 24.*/\n\t/* Power value : 2.4G 0x00 (0) ~ 0x1F (31)*/\n\t/*             : 5.5G 0xF9 (-7) ~ 0x0F (15)*/\n\n\t/* 0. 11b/g, ch1 - ch 14*/\n\tfor (i = 0; i < 7; i++)\n\t{\n\n\t\t{ /* Default routine. RT3070 and RT3370 run here. */\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word);\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word);\n\t\t\tpAd->TxPower[i * 2].Channel = i * 2 + 1;\n\t\t\tpAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;\n\n\t\t\tpAd->TxPower[i * 2].Power = Power.field.Byte0;\n\t\t\tif(!IS_RT3390(pAd))  // 3370 has different Tx power range\n\t\t\t{\n\t\t\tif ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))\n\t\t\t\tpAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;\n\t\t\t}\t\t\t\t\n\n\t\t\tpAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;\n\t\t\tif(!IS_RT3390(pAd)) // 3370 has different Tx power range\n\t\t\t{\n\t\t\tif ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))\n\t\t\t\tpAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;\n\t\t\t}\t\t\t\t\n\n\t\t\tif ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))\n\t\t\t\tpAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;\n\t\t\telse\n\t\t\t\tpAd->TxPower[i * 2].Power2 = Power2.field.Byte0;\n\n\t\t\tif ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))\n\t\t\t\tpAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;\n\t\t\telse\n\t\t\t\tpAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;\n\t\t}\n\t}\n\t\n\n\t{\n\t\tif (IS_RT5592(pAd))\n\t\t\treturn;\n\t\t\n\t\t/* 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz)*/\n\t\t/* 1.1 Fill up channel*/\n\t\tchoffset = 14;\n\t\tfor (i = 0; i < 4; i++)\n\t\t{\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Channel\t= 36 + i * 8 + 0;\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Power2\t= DEFAULT_RF_TX_POWER;\n\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Channel\t= 36 + i * 8 + 2;\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Power2\t= DEFAULT_RF_TX_POWER;\n\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Channel\t= 36 + i * 8 + 4;\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Power2\t= DEFAULT_RF_TX_POWER;\n\t\t}\n\n\t\t/* 1.2 Fill up power*/\n\t\tfor (i = 0; i < 6; i++)\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word);\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word);\n\n\t\t\tif ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;\n\n\t\t\tif ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;\t\t\t\n\n\t\t\tif ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;\n\n\t\t\tif ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;\t\t\t\n\t\t}\n\t\t\n\t\t/* 2. HipperLAN 2 100, 102 ,104; 108, 110, 112; 116, 118, 120; 124, 126, 128; 132, 134, 136; 140 (including central frequency in BW 40MHz)*/\n\t\t/* 2.1 Fill up channel*/\n\t\tchoffset = 14 + 12;\n\t\tfor (i = 0; i < 5; i++)\n\t\t{\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Channel\t= 100 + i * 8 + 0;\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Power2\t= DEFAULT_RF_TX_POWER;\n\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Channel\t= 100 + i * 8 + 2;\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Power2\t= DEFAULT_RF_TX_POWER;\n\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Channel\t= 100 + i * 8 + 4;\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Power2\t= DEFAULT_RF_TX_POWER;\n\t\t}\n\t\tpAd->TxPower[3 * 5 + choffset + 0].Channel\t\t= 140;\n\t\tpAd->TxPower[3 * 5 + choffset + 0].Power\t\t= DEFAULT_RF_TX_POWER;\n\t\tpAd->TxPower[3 * 5 + choffset + 0].Power2\t\t= DEFAULT_RF_TX_POWER;\n\n\t\t/* 2.2 Fill up power*/\n\t\tfor (i = 0; i < 8; i++)\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);\n\n\t\t\tif ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;\n\n\t\t\tif ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;\t\t\t\n\n\t\t\tif ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;\n\n\t\t\tif ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;\t\t\t\n\t\t}\n\n\t\t/* 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165, 167, 169; 171, 173 (including central frequency in BW 40MHz)*/\n\t\t/* 3.1 Fill up channel*/\n\t\tchoffset = 14 + 12 + 16;\n\t\t/*for (i = 0; i < 2; i++)*/\n\t\tfor (i = 0; i < 3; i++)\n\t\t{\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Channel\t= 149 + i * 8 + 0;\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 0].Power2\t= DEFAULT_RF_TX_POWER;\n\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Channel\t= 149 + i * 8 + 2;\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 1].Power2\t= DEFAULT_RF_TX_POWER;\n\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Channel\t= 149 + i * 8 + 4;\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Power\t= DEFAULT_RF_TX_POWER;\n\t\t\tpAd->TxPower[3 * i + choffset + 2].Power2\t= DEFAULT_RF_TX_POWER;\n\t\t}\n\t\tpAd->TxPower[3 * 3 + choffset + 0].Channel\t\t= 171;\n\t\tpAd->TxPower[3 * 3 + choffset + 0].Power\t\t= DEFAULT_RF_TX_POWER;\n\t\tpAd->TxPower[3 * 3 + choffset + 0].Power2\t\t= DEFAULT_RF_TX_POWER;\n\n\t\tpAd->TxPower[3 * 3 + choffset + 1].Channel\t\t= 173;\n\t\tpAd->TxPower[3 * 3 + choffset + 1].Power\t\t= DEFAULT_RF_TX_POWER;\n\t\tpAd->TxPower[3 * 3 + choffset + 1].Power2\t\t= DEFAULT_RF_TX_POWER;\n\n\t\t/* 3.2 Fill up power*/\n\t\t/*for (i = 0; i < 4; i++)*/\n\t\tfor (i = 0; i < 6; i++)\n\t\t{\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);\n\t\t\tRT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);\n\n\t\t\tif ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;\n\n\t\t\tif ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;\t\t\t\n\n\t\t\tif ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;\n\n\t\t\tif ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))\n\t\t\t\tpAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;\t\t\t\n\t\t}\n\t}\n\n\n\t/* 4. Print and Debug*/\n\t/*choffset = 14 + 12 + 16 + 7;*/\n\tchoffset = 14 + 12 + 16 + 11;\n\t\n\n}\n\n"
  },
  {
    "path": "src/common/uapsd.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n    Abstract:\n\n\tAll related WMM UAPSD function body.\n\n\tTwo EOSP sent mechanism:\n\t1. Use DMA Done to do the check.\n\t\ta. safe but not accuracy, because maybe all packets are still in hardware\n\t\t\tDMA, not yet be sent to air, but DMA Done are all 1\n\t\tb. in USB chip, the data completion does not mean a packet is sent, it\n\t\t\tmeans a block of data is sent, so we need to use another method to\n\t\t\tknow how many packets are sent in the data completion function\n\n\t2. Use TX Statistics to do the check.\n\t\ta. unsafe but accuracy, because too many traffic are sent before TX Done\n\t\t\tInterrupt occurs and the statistics count will be overwrited.\n\t\tb. management frames will not be counted\n\t\tc. frames using 1Mbps (CCK) will no be counted\n\t\td. legacy ps frame sent after a PS-Poll frame is also be counted, we\n\t\t\tneed to handle the mix mode case: some AC are legacy PS and some AC\n\t\t\tare UAPSD\n\t\te. in USB chip, only one statistics counter for all station entries;\n\t\t\tso only use DMA Done mechanism in USB device; but in PCI chip,\n\t\t\tone statistics counter for each station entries.\n\n\tAll ACs have two UAPSD modes:\n\t1. Delivery-enabled\n\t\tmeaningful mode for AC in AP\n\n\t2. Trigger-enabled\n\t\tmeaningful mode for AC in STA\n\n\tOnly WMM ACM is used, we need to discriminate between Delivery-enabled and\n\tTrigger-enabled AC, or all AC are Delivery/Trigger-enabled or not\n\tDelivery/Trigger-enabled.\n\n***************************************************************************/\n\n#define MODULE_WMM_UAPSD\n#include \"rt_config.h\"\n\n#ifdef UAPSD_SUPPORT\n#include \"uapsd.h\"\n\n/*#define UAPSD_DEBUG */\n\n/* used to enable or disable UAPSD power save queue maintain mechanism */\nUCHAR gUAPSD_FlgNotQueueMaintain;\n\n#ifdef UAPSD_DEBUG\nUINT32 gUAPSD_SP_CloseAbnormalNum;\n#endif /* UAPSD_DEBUG */\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n/* all unit: us */\n\nUCHAR  gUAPSD_TimingFlag;\nUINT32 gUAPSD_TimingIndexUapsd;\nUINT32 gUAPSD_TimingLoopIndex;\n\n/* ISR start timestamp */\nUINT64 gUAPSD_TimingIsr[UAPSD_TIMING_RECORD_MAX];\n\n/* Tasklet start timestamp */\nUINT64 gUAPSD_TimingTasklet[UAPSD_TIMING_RECORD_MAX];\n\nUINT64 gUAPSD_TimingTrgRcv[UAPSD_TIMING_RECORD_MAX];\nUINT64 gUAPSD_TimingMov2Tx[UAPSD_TIMING_RECORD_MAX];\nUINT64 gUAPSD_TimingTx2Air[UAPSD_TIMING_RECORD_MAX];\n\nUINT32 gUAPSD_TimingSumIsr2Tasklet;\nUINT32 gUAPSD_TimingSumTrig2Txqueue;\nUINT32 gUAPSD_TimingSumTxqueue2Air;\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\n\n#ifdef VENDOR_FEATURE3_SUPPORT\nstatic VOID UAPSD_InsertTailQueueAc(\n\tIN\tRTMP_ADAPTER\t*pAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tQUEUE_HEADER\t*pQueueHeader,\n\tIN\tQUEUE_ENTRY\t\t*pQueueEntry);\n#endif /* VENDOR_FEATURE3_SUPPORT */\n\n\n\n\n/*\n========================================================================\nRoutine Description:\n    UAPSD Module Init.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_Init(\n\tIN\tPRTMP_ADAPTER\t\tpAd)\n{\n    /* allocate a lock resource for SMP environment */\n\tNdisAllocateSpinLock(pAd, &pAd->UAPSDEOSPLock);\n\n#ifdef UAPSD_DEBUG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> allocate a spinlock!\\n\"));\n#endif /* UAPSD_DEBUG */\n\n#ifdef UAPSD_DEBUG\n\tgUAPSD_SP_CloseAbnormalNum = 0;\n#endif /* UAPSD_DEBUG */\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n\tgUAPSD_TimingFlag = 0; /* default: DISABLE */\n\tgUAPSD_TimingIndexUapsd = 0;\n\tgUAPSD_TimingLoopIndex = 0;\n\n\n\tgUAPSD_TimingSumIsr2Tasklet = 0;\n\tgUAPSD_TimingSumTrig2Txqueue = 0;\n\tgUAPSD_TimingSumTxqueue2Air = 0;\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    UAPSD Module Release.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_Release(\n    IN  PRTMP_ADAPTER       pAd)\n{\n    /* free the lock resource for SMP environment */\n    NdisFreeSpinLock(&pAd->UAPSDEOSPLock);\n\n#ifdef UAPSD_DEBUG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> release a spinlock!\\n\"));\n#endif /* UAPSD_DEBUG */\n} /* End of UAPSD_Release */\n\n/*\n========================================================================\nRoutine Description:\n    Check if ASIC can enter sleep mode. Not software sleep.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID RtmpAsicSleepHandle(\n    IN  PRTMP_ADAPTER       pAd)\n{\n\tBOOLEAN FlgCanAsicSleep = TRUE;\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t/* check TDLS condition */\n\t\tFlgCanAsicSleep = TDLS_UAPSDP_AsicCanSleep(pAd);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* finally, check if we can sleep */\n\tif (FlgCanAsicSleep == TRUE)\n\t{\n\t\t/* just mark the flag to FALSE and wait PeerBeacon() to sleep */\n\t\t\tASIC_PS_CAN_SLEEP(pAd);\n\t}\n#endif // CONFIG_STA_SUPPORT //\n} /* End of RtmpAsicSleepHandle */\n\n\n\n/*\n========================================================================\nRoutine Description:\n    Close current Service Period.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpEntry\t\t\tClose the SP of the entry\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_SP_Close(\n    IN  PRTMP_ADAPTER       pAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry)\n{\n\tif ((pEntry != NULL) && (pEntry->PsMode == PWR_SAVE))\n\t{\n\t\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n\t\tif (pEntry->bAPSDFlagSPStart != 0)\n\t\t{\n\t\t\t/* SP is started for the station */\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> [3] close SP!\\n\"));\n#endif /* UAPSD_DEBUG */\n\n\t\t\tif (pEntry->pUAPSDEOSPFrame != NULL)\n\t        {\n\t\t\t\t/*\n\t\t\t\t\tSP will be closed, should not have EOSP frame\n\t\t\t\t\tif exists, release it\n\t\t\t\t*/\n#ifdef UAPSD_DEBUG\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> [3] Free EOSP (UP = %d)!\\n\",\n\t\t\t\t\t\tRTMP_GET_PACKET_UP(\n\t\t\t\t\t\t\tQUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame))));\n#endif /* UAPSD_DEBUG */\n\n\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t\t\tQUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame),\n\t                                NDIS_STATUS_FAILURE);\n\t\t\t\tpEntry->pUAPSDEOSPFrame = NULL;\n\t        } /* End of if */\n\n\t\t\t/* re-init SP related parameters */\n\t\t\tpEntry->UAPSDTxNum = 0;\n\t\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\t\tpEntry->bAPSDFlagLegacySent = 0;\n\t\t\tUAPSD_SP_END(pAd, pEntry);\n\n#ifdef RTMP_MAC_USB\n\t\t\tpEntry->UAPSDTagOffset[QID_AC_BE] = 0;\n\t\t\tpEntry->UAPSDTagOffset[QID_AC_BK] = 0;\n\t\t\tpEntry->UAPSDTagOffset[QID_AC_VI] = 0;\n\t\t\tpEntry->UAPSDTagOffset[QID_AC_VO] = 0;\n#endif /* RTMP_MAC_USB */\n\t    } /* End of if */\n\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t} /* End of if */\n} /* End of UAPSD_SP_Close */\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the SP for entry is closed.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpEntry\t\t\tthe peer entry\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nBOOLEAN UAPSD_SP_IsClosed(\n    IN  PRTMP_ADAPTER       pAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry)\n{\n\tBOOLEAN FlgIsSpClosed = TRUE;\n\n\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\tif ((pEntry != NULL) && (pEntry->PsMode == PWR_SAVE))\n\t{\n\t\tif (pEntry->bAPSDFlagSPStart != 0)\n\t\t\tFlgIsSpClosed = FALSE;\n\t}\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\n\treturn FlgIsSpClosed;\n}\n\n/*\n========================================================================\nRoutine Description:\n    Deliver all queued packets.\n\nArguments:\n\tpAd            Pointer to our adapter\n\t*pEntry        STATION\n\nReturn Value:\n    None\n\nNote:\n\tSMP protection by caller for packet enqueue.\n========================================================================\n*/\nVOID UAPSD_AllPacketDeliver(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry)\n{\n\tQUEUE_HEADER *pQueApsd;\n\tPQUEUE_ENTRY pQueEntry;\n\tUCHAR QueIdList[WMM_NUM_OF_AC] = { QID_AC_BE, QID_AC_BK,\n                                         QID_AC_VI, QID_AC_VO };\n\tINT32 IdAc, QueId; /* must be signed, can not be unsigned */\n\n\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n    /* check if the EOSP frame is yet transmitted out */\n\tif (pEntry->pUAPSDEOSPFrame != NULL)\n    {\n        /* queue the EOSP frame to SW queue to be transmitted */\n\t\tQueId = RTMP_GET_PACKET_UAPSD_QUE_ID(\n\t\t\t\t\t\t\tQUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame));\n\n\t\tif (QueId > QID_AC_VO)\n        {\n            /* should not be here, only for sanity */\n\t\t\tQueId = QID_AC_BE;\n        } /* End of if */\n\n\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry, &pAd->TxSwQueue[QueId],\n\t\t\t\t\t\tpEntry->pUAPSDEOSPFrame);\n\n\t\tpEntry->pUAPSDEOSPFrame = NULL;\n\t\tpEntry->UAPSDTxNum = 0;\n    } /* End of if */\n\n    /* deliver ALL U-APSD packets from AC3 to AC0 (AC0 to AC3 is also ok) */\n\tfor(IdAc=(WMM_NUM_OF_AC-1); IdAc>=0; IdAc--)\n    {\n\t\tpQueApsd = &(pEntry->UAPSDQueue[IdAc]);\n\t\tQueId = QueIdList[IdAc];\n\n\t\twhile(pQueApsd->Head)\n        {\n\t\t\tpQueEntry = RemoveHeadQueue(pQueApsd);\n\t\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry, &pAd->TxSwQueue[QueId], pQueEntry);\n        } /* End of while */\n    } /* End of for */\n\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n} /* End of UAPSD_AllPacketDeliver */\n\n\n/*\n========================================================================\nRoutine Description:\n    Parse the UAPSD field in WMM element in (re)association request frame.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tSTATION\n\t*pElm\t\t\tQoS information field\n\tFlgApsdCapable\tTRUE: Support UAPSD\n\nReturn Value:\n    None\n\nNote:\n\tNo protection is needed.\n\n\t1. Association -> TSPEC:\n\t\tuse static UAPSD settings in Association\n\t\tupdate UAPSD settings in TSPEC\n\n\t2. Association -> TSPEC(11r) -> Reassociation:\n\t\tupdate UAPSD settings in TSPEC\n\t\tbackup static UAPSD settings in Reassociation\n\n\t3. Association -> Reassociation:\n\t\tupdate UAPSD settings in TSPEC\n\t\tbackup static UAPSD settings in Reassociation\n========================================================================\n*/\nVOID UAPSD_AssocParse(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tIN\tUCHAR\t\t\t\t*pElm,\n\tIN\tBOOLEAN\t\t\t\tFlgApsdCapable)\n{\n\tPQBSS_STA_INFO_PARM  pQosInfo;\n\tUCHAR UAPSD[4];\n\tUINT32 IdApsd;\n\n\n    /* check if the station enables UAPSD function */\n\tif ((pEntry) && (FlgApsdCapable == TRUE))\n    {\n        /* backup its UAPSD parameters */\n\t\tpQosInfo = (PQBSS_STA_INFO_PARM) pElm;\n\n\n\t\tUAPSD[QID_AC_BE] = pQosInfo->UAPSD_AC_BE;\n\t\tUAPSD[QID_AC_BK] = pQosInfo->UAPSD_AC_BK;\n\t\tUAPSD[QID_AC_VI] = pQosInfo->UAPSD_AC_VI;\n\t\tUAPSD[QID_AC_VO] = pQosInfo->UAPSD_AC_VO;\n\n\t\tpEntry->MaxSPLength = pQosInfo->MaxSPLength;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"apsd> UAPSD %d %d %d %d!\\n\",\n\t\t\t\t\tpQosInfo->UAPSD_AC_BE, pQosInfo->UAPSD_AC_BK,\n\t\t\t\t\tpQosInfo->UAPSD_AC_VI, pQosInfo->UAPSD_AC_VO));\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"apsd> MaxSPLength = %d\\n\", pEntry->MaxSPLength));\n\n\t\t/* use static UAPSD setting of association request frame */\n\t\tfor(IdApsd=0; IdApsd<4; IdApsd++)\n\t\t{\n\t\t\tpEntry->bAPSDCapablePerAC[IdApsd] = UAPSD[IdApsd];\n\t\t\tpEntry->bAPSDDeliverEnabledPerAC[IdApsd] = UAPSD[IdApsd];\n\n\t\t} /* End of for */\n\n\t\tif ((pEntry->bAPSDCapablePerAC[QID_AC_BE] == 0) &&\n\t\t\t(pEntry->bAPSDCapablePerAC[QID_AC_BK] == 0) &&\n\t\t\t(pEntry->bAPSDCapablePerAC[QID_AC_VI] == 0) &&\n\t\t\t(pEntry->bAPSDCapablePerAC[QID_AC_VO] == 0))\n        {\n\t\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_APSD_CAPABLE);\n        }\n        else\n        {\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_APSD_CAPABLE);\n        } /* End of if */\n\n\t\tif ((pEntry->bAPSDCapablePerAC[QID_AC_BE] == 1) &&\n\t\t\t(pEntry->bAPSDCapablePerAC[QID_AC_BK] == 1) &&\n\t\t\t(pEntry->bAPSDCapablePerAC[QID_AC_VI] == 1) &&\n\t\t\t(pEntry->bAPSDCapablePerAC[QID_AC_VO] == 1))\n        {\n            /* all AC are U-APSD */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"apsd> all AC are UAPSD\\n\"));\n\t\t\tpEntry->bAPSDAllAC = 1;\n        }\n        else\n        {\n            /* at least one AC is not U-APSD */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"apsd> at least one AC is not UAPSD %d %d %d %d\\n\",\n\t\t\t\t\tpEntry->bAPSDCapablePerAC[QID_AC_BE],\n\t\t\t\t\tpEntry->bAPSDCapablePerAC[QID_AC_BK],\n\t\t\t\t\tpEntry->bAPSDCapablePerAC[QID_AC_VI],\n\t\t\t\t\tpEntry->bAPSDCapablePerAC[QID_AC_VO]));\n\t\t\tpEntry->bAPSDAllAC = 0;\n        } /* End of if */\n\n\t\tpEntry->VirtualTimeout = 0;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"apsd> MaxSPLength = %d\\n\", pEntry->MaxSPLength));\n    } /* End of if */\n} /* End of UAPSD_AssocParse */\n\n\n/*\n========================================================================\nRoutine Description:\n    Enqueue a UAPSD packet.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tSTATION\n\tpPacket\t\t\tUAPSD dnlink packet\n\tIdAc\t\t\tUAPSD AC ID (0 ~ 3)\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_PacketEnqueue(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tIN\tPNDIS_PACKET\t\tpPacket,\n\tIN\tUINT32\t\t\t\tIdAc)\n{\n\t/*\n\t\t1. the STATION is UAPSD STATION;\n\t\t2. AC ID is legal;\n\t\t3. the AC is UAPSD AC.\n\t\tso we queue the packet to its UAPSD queue\n\t*/\n\n\t/* [0] ~ [3], QueIdx base is QID_AC_BE */\n\tQUEUE_HEADER *pQueUapsd;\n\n\n\t/* check if current queued UAPSD packet number is too much */\n\tif (pEntry == NULL)\n\t{\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> pEntry == NULL!\\n\"));\n\t\treturn;\n\t} /* End of if */\n\n\tpQueUapsd = &(pEntry->UAPSDQueue[IdAc]);\n\n\tif (pQueUapsd->Number >= MAX_PACKETS_IN_UAPSD_QUEUE)\n    \t{\n\t        /* too much queued pkts, free (discard) the tx packet */\n\t        DBGPRINT(RT_DEBUG_TRACE,\n                 (\"uapsd> many(%ld) WCID(%d) AC(%d)\\n\",\n\t\t\t\tpQueUapsd->Number,\n\t\t\t\tRTMP_GET_PACKET_WCID(pPacket),\n\t\t\t\tIdAc));\n\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t}\n\telse\n\t{\n        \t/* queue the tx packet to the U-APSD queue of the AC */\n\t\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\t\tInsertTailQueue(pQueUapsd, PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\n#ifdef UAPSD_DEBUG\n\t\tif (RTMP_GET_PACKET_MGMT_PKT(pPacket) == 1)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ps> mgmt to uapsd queue...\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"ps> data (0x%08lx) (AC%d) to uapsd queue (num of pkt = %ld)...\\n\",\n\t\t\t\t\t(ULONG)pPacket, IdAc,\n\t\t\t\t\tpQueUapsd->Number));\n\t\t} /* End of if */\n#endif /* UAPSD_DEBUG */\n\t} /* End of if */\n} /* End of UAPSD_PacketEnqueue */\n\n\n\n/*\n========================================================================\nRoutine Description:\n    Maintenance our UAPSD PS queue.  Release all queued packet if timeout.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tSTATION\n\nReturn Value:\n    None\n\nNote:\n\tIf in RT2870, pEntry can not be removed during UAPSD_QueueMaintenance()\n========================================================================\n*/\nVOID UAPSD_QueueMaintenance(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry)\n{\n\tQUEUE_HEADER *pQue;\n\tUINT32 IdAc;\n\tBOOLEAN FlgUapsdPkt, FlgEospPkt;\n#ifdef RTMP_MAC_USB\n\tULONG IrqFlags;\n#endif /* RTMP_MAC_USB */\n\n\n\t/* sanity check */\n\tif (gUAPSD_FlgNotQueueMaintain)\n\t\treturn;\n\t/* End of if */\n\n\tif (pEntry->PsMode != PWR_SAVE)\n\t\treturn; /* UAPSD packet only for power-save STA, not active STA */\n\t/* End of if */\n\n    /* init */\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n\tpQue = pEntry->UAPSDQueue;\n\tFlgUapsdPkt = 0;\n\tFlgEospPkt = 0;\n\n    /* check if more than one U-APSD packets exists */\n\tfor(IdAc=0; IdAc<WMM_NUM_OF_AC; IdAc++)\n    {\n\t\tif (pQue[IdAc].Head != NULL)\n        {\n\t\t\t/*\n\t\t\t\tAt least one U-APSD packets exists so we need to check if\n\t\t\t\tqueued U-APSD packets are timeout.\n\t\t\t*/\n\t\t\tFlgUapsdPkt = 1;\n            break;\n        } /* End of if */\n    } /* End of for */\n\n\tif (pEntry->pUAPSDEOSPFrame != NULL)\n\t\tFlgEospPkt = 1;\n\t/* End of if */\n\n    /* check if any queued UAPSD packet exists */\n\tif (FlgUapsdPkt || FlgEospPkt)\n    {\n#ifdef RTMP_MAC_USB\n\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n#endif /* RTMP_MAC_USB */\n\n\t\tpEntry->UAPSDQIdleCount ++;\n\n\t\tif (pEntry->UAPSDQIdleCount > pAd->MacTab.MsduLifeTime)\n        {\n\t\t\tif (FlgUapsdPkt)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t(\"uapsd> UAPSD queue timeout! clean all queued frames...\\n\"));\n\t\t\t} /* End of if */\n\n\t\t\tif (FlgEospPkt)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t(\"uapsd> UAPSD EOSP timeout! clean the EOSP frame!\\n\"));\n\t\t\t} /* End of if */\n\n            /* UAPSDQIdleCount will be 0 after trigger frame is received */\n\n            /* clear all U-APSD packets */\n\t\t\tif (FlgUapsdPkt)\n\t\t\t{\n\t\t\t\tfor(IdAc=0; IdAc<WMM_NUM_OF_AC; IdAc++)\n\t\t\t\t\tRtmpCleanupPsQueue(pAd, &pQue[IdAc]);\n\t            /* End of for */\n\t\t\t} /* End of if */\n\n            /* free the EOSP frame */\n\t\t\tpEntry->UAPSDTxNum = 0;\n\n\t\t\tif (pEntry->pUAPSDEOSPFrame != NULL)\n            {\n\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t\tQUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame),\n                                    NDIS_STATUS_FAILURE);\n\t\t\t\tpEntry->pUAPSDEOSPFrame = NULL;\n            } /* End of if */\n\n\t\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\t\tpEntry->bAPSDFlagLegacySent = 0;\n\t\t\tUAPSD_SP_END(pAd, pEntry);\n\n            /* clear idle counter */\n\t\t\tpEntry->UAPSDQIdleCount = 0;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t/* check TIM bit */\n\t\t\tif (pEntry->PsQueue.Number == 0)\n\t\t\t{\n\t\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pEntry->apidx, pEntry->Aid);\n\t\t\t} /* End of if */\n#endif /* CONFIG_AP_SUPPORT */\n        } /* End of if */\n\n#ifdef RTMP_MAC_USB\n\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n#endif /* RTMP_MAC_USB */\n    }\n    else\n\t{\n\t\t/* clear idle counter */\n\t\tpEntry->UAPSDQIdleCount = 0;\n\t} /* End of if (FlgUapsdPkt) */\n\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\n\t/* virtual timeout handle */\n\tRTMP_PS_VIRTUAL_TIMEOUT_HANDLE(pEntry);\n} /* End of UAPSD_QueueMaintenance */\n\n\n/*\n========================================================================\nRoutine Description:\n    Close SP in Tx Done, not Tx DMA Done.\n\nArguments:\n\tpAd            Pointer to our adapter\n\tpEntry\t\t\tdestination entry\n\tFlgSuccess\t\t0:tx success, 1:tx fail\n\nReturn Value:\n    None\n\nNote:\n\tFor RT28xx series, for packetID=0 or multicast frame, no statistics\n\tcount can be got, ex: ARP response or DHCP packets, we will use\n\tlow rate to set (CCK, MCS=0=packetID).\n\tSo SP will not be close until UAPSD_EPT_SP_INT timeout.\n\n\tSo if the tx rate is 1Mbps for a entry, we will use DMA done, not\n\tuse UAPSD_SP_AUE_Handle().\n========================================================================\n*/\nVOID UAPSD_SP_AUE_Handle(\n\tIN RTMP_ADAPTER\t\t*pAd,\n    IN MAC_TABLE_ENTRY\t*pEntry,\n\tIN UCHAR\t\t\tFlgSuccess)\n{\n#ifdef UAPSD_SP_ACCURATE\n\tUSHORT QueId;\n\n\n\tif (pEntry == NULL)\n\t\treturn;\n\t/* End of if */\n\n\tif (pEntry->PsMode == PWR_ACTIVE)\n\t{\n#ifdef UAPSD_DEBUG\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> aux: Station actives! Close SP!\\n\"));\n#endif /* UAPSD_DEBUG */\n\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\tUAPSD_SP_END(pAd, pEntry);\n\t\treturn;\n\t} /* End of if */\n\n\tif (pEntry->PsMode == PWR_SAVE)\n\t{\n\t\tBOOLEAN FlgEosp;\n\n\n\t\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n\t\tif (pEntry->bAPSDFlagSpRoughUse != 0)\n\t\t{\n\t\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t\t\treturn; /* use DMA mechanism, not statistics count mechanism */\n\t\t} /* End of if */\n\n#ifdef UAPSD_DEBUG\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> aux: Tx Num = %d\\n\", pEntry->UAPSDTxNum));\n#endif /* UAPSD_DEBUG */\n\n\t\tFlgEosp = FALSE;\n\n\t\tif (pEntry->bAPSDFlagSPStart == 0)\n\t\t{\n\t\t\t/*\n\t\t\t\tWhen SP is not started, all packets are from legacy PS queue.\n\t\t\t\tOne downlink packet for one PS-Poll packet.\n\t\t\t*/\n\t\t\tpEntry->bAPSDFlagLegacySent = 0;\n\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> legacy PS packet is sent!\\n\"));\n#endif /* UAPSD_DEBUG */\n\t\t}\n\t\telse\n\t\t{\n#ifdef UAPSD_TIMING_RECORD_FUNC\n\t\t\tUAPSD_TIMING_RECORD(pAd, UAPSD_TIMING_RECORD_TX2AIR);\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\t\t} /* End of if */\n\n\t\t/* record current time */\n\t\tUAPSD_TIME_GET(pAd, pEntry->UAPSDTimeStampLast);\n\n        /* Note: UAPSDTxNum does NOT include the EOSP packet */\n\t\tif (pEntry->UAPSDTxNum > 0)\n        {\n            /* some UAPSD packets are not yet transmitted */\n\n\t\t\tif (pEntry->UAPSDTxNum == 1)\n            {\n                /* this is the last UAPSD packet */\n\t\t\t\tif (pEntry->pUAPSDEOSPFrame != NULL)\n                {\n                    /* transmit the EOSP frame */\n\t\t\t\t\tPNDIS_PACKET pPkt;\n\n\n#ifdef UAPSD_DEBUG\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> aux: send EOSP frame...\\n\"));\n#endif /* UAPSD_DEBUG */\n\n\t\t\t\t\tpPkt = QUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame);\n\t\t\t\t\tQueId = RTMP_GET_PACKET_UAPSD_QUE_ID(pPkt);\n\n\t\t\t\t\tif (QueId > QID_AC_VO)\n                    {\n                        /* should not be here, only for sanity */\n\t\t\t\t\t\tQueId = QID_AC_BE;\n                    } /* End of if */\n\n\t\t\t\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry, &pAd->TxSwQueue[QueId],\n\t\t\t\t\t\t\t\t\tpEntry->pUAPSDEOSPFrame);\n\n\t\t\t\t\tpEntry->pUAPSDEOSPFrame = NULL;\n\t\t\t\t\tFlgEosp = TRUE;\n                } /* End of if */\n            } /* End of if */\n\n            /* a UAPSD frame is transmitted so decrease the counter */\n\t\t\tpEntry->UAPSDTxNum --;\n\n\t\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\n\t\t\t/* maybe transmit the EOSP frame */\n\t\t\tif (FlgEosp == TRUE)\n\t\t\t{\n\t\t\t\tPOS_COOKIE pCookie;\n\n\t\t\t\tpCookie = (POS_COOKIE) pAd->OS_Cookie;\n\n\t\t\t\t/*\n\t\t\t\t\tToo many functions call NICUpdateFifoStaCounters() and\n\t\t\t\t\tNICUpdateFifoStaCounters() will call UAPSD_SP_AUE_Handle(),\n\t\t\t\t\tif we call RTMPDeQueuePacket() here, double-IRQ LOCK will\n\t\t\t\t\toccur. so we need to activate a tasklet to send EOSP frame.\n\n\t\t\t\t\tex: RTMPDeQueuePacket() --> RTMPFreeTXDUponTxDmaDone() -->\n\t\t\t\t\t\tNICUpdateFifoStaCounters() --> UAPSD_SP_AUE_Handle() -->\n\t\t\t\t\t\tRTMPDeQueuePacket() ERROR! or\n\n\t\t\t\t\t\tRTMPHandleTxRingDmaDoneInterrupt() -->\n\t\t\t\t\t\tRTMP_IRQ_LOCK() -->\n\t\t\t\t\t\tRTMPFreeTXDUponTxDmaDone() -->\n\t\t\t\t\t\tNICUpdateFifoStaCounters() -->\n\t\t\t\t\t\tUAPSD_SP_AUE_Handle() -->\n\t\t\t\t\t\tRTMPDeQueuePacket() -->\n\t\t\t\t\t\tDEQUEUE_LOCK() -->\n\t\t\t\t\t\tRTMP_IRQ_LOCK() ERROR!\n\t\t\t\t\t\t*/\n\t\t\t\tRTMP_OS_TASKLET_SCHE(&pCookie->uapsd_eosp_sent_task);\n\t\t\t}\n\t\t\t/* must return here; Or double unlock UAPSDEOSPLock */\n\t\t\treturn;\n        }\n        else\n        {\n            /* UAPSDTxNum == 0 so the packet is the EOSP packet */\n\n\t\t\tif (pAd->bAPSDFlagSPSuspend == 1)\n\t\t\t{\n#ifdef UAPSD_DEBUG\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> aux: SP is suspend, keep SP if exists!\\n\"));\n#endif /* UAPSD_DEBUG */\n\n\t\t\t\t/* keep SP, not to close SP */\n\t\t\t\tpEntry->bAPSDFlagEOSPOK = 1;\n\t\t\t}\n\n\t\t\tif ((pEntry->bAPSDFlagSPStart != 0) &&\n\t\t\t\t(pAd->bAPSDFlagSPSuspend == 0))\n            {\n\t\t\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\t\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\t\t\tUAPSD_SP_END(pAd, pEntry);\n\n#ifdef UAPSD_DEBUG\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> aux: close a SP.\\n\\n\\n\"));\n#endif /* UAPSD_DEBUG */\n            }\n        } \n\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t}\n#endif /* UAPSD_SP_ACCURATE */\n}\n\n\n\n/*\n========================================================================\nRoutine Description:\n    Close current Service Period.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\nReturn Value:\n    None\n\nNote:\n    When we receive EOSP frame tx done interrupt and a uplink packet\n    from the station simultaneously, we will regard it as a new trigger\n    frame because the packet is received when EOSP frame tx done interrupt.\n\n    We can not sure the uplink packet is sent after old SP or in the old SP.\n    So we must close the old SP in receive done ISR to avoid the problem.\n========================================================================\n*/\nVOID UAPSD_SP_CloseInRVDone(\n\tIN\tPRTMP_ADAPTER\t\tpAd)\n{\n\tUINT32 IdEntry;\n\tint\t\tFirstWcid = 0;\n\n\n\tif (pAd->MacTab.fAnyStationInPsm == FALSE)\n\t\treturn; /* no any station is in power save mode */\n\t/* End of if */\n\n#ifdef P2P_SUPPORT\n\tFirstWcid = 2;\n#endif /* P2P_SUPPORT */\n\n    /* check for all CLIENT's UAPSD Service Period */\n\tfor(IdEntry = FirstWcid; IdEntry < MAX_LEN_OF_MAC_TABLE; IdEntry++)\n    {\n\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[IdEntry];\n\n\n\t\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n        /* check if SP is started and EOSP is transmitted ok */\n\t\tif ((pEntry->bAPSDFlagSPStart != 0) &&\n\t\t\t(pEntry->bAPSDFlagEOSPOK != 0))\n        {\n\t\t\t/*\n\t\t\t\t1. SP is started;\n\t\t\t\t2. EOSP frame is sent ok.\n\t\t\t*/\n\n\t\t\t/*\n\t\t\t\tWe close current SP for the STATION so we can receive new\n\t\t\t\ttrigger frame from the STATION again.\n\t\t\t*/\n\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"uapsd> close SP in UAPSD_SP_CloseInRVDone()!\\n\\n\\n\"));\n#endif /* UAPSD_DEBUG */\n\n\t\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\t\tpEntry->bAPSDFlagLegacySent = 0;\n\t\t\tUAPSD_SP_END(pAd, pEntry);\n        } /* End of if */\n\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n    } /* End of for */\n} /* End of UAPSD_SP_CloseInRVDone */\n\n\n\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n/*\n========================================================================\nRoutine Description:\n\tEnable/Disable Timing Record Function.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tFlag\t\t\t1 (Enable) or 0 (Disable)\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID UAPSD_TimingRecordCtrl(\n\tIN\tUINT32\t\t\t\tFlag)\n{\n\tif (gUAPSD_TimingFlag == UAPSD_TIMING_CTRL_SUSPEND)\n\t\treturn;\n\t/* End of if */\n\n\tgUAPSD_TimingFlag = Flag;\n} /* End of UAPSD_TimingRecordCtrl */\n\n\n/*\n========================================================================\nRoutine Description:\n\tRecord some timings.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tType\t\t\tThe timing is for what type\n\nReturn Value:\n\tNone\n\nNote:\n\tUAPSD_TIMING_RECORD_ISR\n\tUAPSD_TIMING_RECORD_TASKLET\n\tUAPSD_TIMING_RECORD_TRG_RCV\n\tUAPSD_TIMING_RECORD_MOVE2TX\n\tUAPSD_TIMING_RECORD_TX2AIR\n========================================================================\n*/\nVOID UAPSD_TimingRecord(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tUINT32\t\t\t\tType)\n{\n\tUINT32 Index;\n\n\tif (gUAPSD_TimingFlag == UAPSD_TIMING_CTRL_STOP)\n\t\treturn;\n\t/* End of if */\n\n\tif ((gUAPSD_TimingFlag == UAPSD_TIMING_CTRL_SUSPEND) &&\n\t\t(Type != UAPSD_TIMING_RECORD_TX2AIR))\n\t{\n\t\treturn;\n\t} /* End of if */\n\n\tIndex = gUAPSD_TimingIndexUapsd;\n\n\tswitch(Type)\n\t{\n\t\tcase UAPSD_TIMING_RECORD_ISR:\n\t\t\t/* start to record the timing */\n\t\t\tUAPSD_TIMESTAMP_GET(pAd, gUAPSD_TimingIsr[Index]);\n\t\t\tbreak;\n\n\t\tcase UAPSD_TIMING_RECORD_TASKLET:\n\t\t\tUAPSD_TIMESTAMP_GET(pAd, gUAPSD_TimingTasklet[Index]);\n\t\t\tbreak;\n\n\t\tcase UAPSD_TIMING_RECORD_TRG_RCV:\n\t\t\tif (gUAPSD_TimingLoopIndex == 0)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tThe trigger frame is the first received frame.\n\t\t\t\t\tThe received time will be the time recorded in ISR.\n\t\t\t\t*/\n\t\t\t\tgUAPSD_TimingTrgRcv[Index] = gUAPSD_TimingIsr[Index];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tSome packets are handled before the trigger frame so\n\t\t\t\t\twe record next one.\n\t\t\t\t*/\n\t\t\t\tUAPSD_TIMING_RECORD_STOP();\n\t\t\t} /* End of if */\n\t\t\tbreak;\n\n\t\tcase UAPSD_TIMING_RECORD_MOVE2TX:\n\t\t\tUAPSD_TIMESTAMP_GET(pAd, gUAPSD_TimingMov2Tx[Index]);\n\n\t\t\t/* prepare to wait for tx done */\n\t\t\tUAPSD_TimingRecordCtrl(UAPSD_TIMING_CTRL_SUSPEND);\n\t\t\tbreak;\n\n\t\tcase UAPSD_TIMING_RECORD_TX2AIR:\n\t\t\tUAPSD_TIMESTAMP_GET(pAd, gUAPSD_TimingTx2Air[Index]);\n\n\t\t\t/* sum the delay */\n\t\t\tgUAPSD_TimingSumIsr2Tasklet += \\\n\t\t\t\t(UINT32)(gUAPSD_TimingTasklet[Index] - gUAPSD_TimingIsr[Index]);\n\t\t\tgUAPSD_TimingSumTrig2Txqueue += \\\n\t\t\t\t(UINT32)(gUAPSD_TimingMov2Tx[Index] - gUAPSD_TimingTrgRcv[Index]);\n\t\t\tgUAPSD_TimingSumTxqueue2Air += \\\n\t\t\t\t(UINT32)(gUAPSD_TimingTx2Air[Index] - gUAPSD_TimingMov2Tx[Index]);\n\n\t\t\t/* display average delay */\n\t\t\tif ((Index % UAPSD_TIMING_RECORD_DISPLAY_TIMES) == 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> Isr2Tasklet=%d, Trig2Queue=%d, Queue2Air=%d micro seconds\\n\",\n\t\t\t\t\t\tgUAPSD_TimingSumIsr2Tasklet/\n\t\t\t\t\t\t\t\t\t\t\tUAPSD_TIMING_RECORD_DISPLAY_TIMES,\n\t\t\t\t\t\tgUAPSD_TimingSumTrig2Txqueue/\n\t\t\t\t\t\t\t\t\t\t\tUAPSD_TIMING_RECORD_DISPLAY_TIMES,\n\t\t\t\t\t\tgUAPSD_TimingSumTxqueue2Air/\n\t\t\t\t\t\t\t\t\t\t\tUAPSD_TIMING_RECORD_DISPLAY_TIMES));\n\t\t\t\tgUAPSD_TimingSumIsr2Tasklet = 0;\n\t\t\t\tgUAPSD_TimingSumTrig2Txqueue = 0;\n\t\t\t\tgUAPSD_TimingSumTxqueue2Air = 0;\n\t\t\t} /* End of if */\n\n\t\t\t/* ok, a record is finished; prepare to record the next one */\n\t\t\tgUAPSD_TimingIndexUapsd ++;\n\n\t\t\tif (gUAPSD_TimingIndexUapsd >= UAPSD_TIMING_RECORD_MAX)\n\t\t\t\tgUAPSD_TimingIndexUapsd = 0;\n\t\t\t/* End of if */\n\n\t\t\t/* stop the record */\n\t\t\tgUAPSD_TimingFlag = UAPSD_TIMING_CTRL_STOP;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"sam> Isr->Tasklet:%d, Trig->TxQueue:%d, TxQueue->TxDone:%d\\n\",\n\t\t\t\t(UINT32)(gUAPSD_TimingTasklet[Index] - gUAPSD_TimingIsr[Index]),\n\t\t\t\t(UINT32)(gUAPSD_TimingMov2Tx[Index] - gUAPSD_TimingTrgRcv[Index]),\n\t\t\t\t(UINT32)(gUAPSD_TimingTx2Air[Index] - gUAPSD_TimingMov2Tx[Index])));\n\t\t\tbreak;\n\t} /* End of switch */\n} /* End of UAPSD_TimingRecord */\n\n\n/*\n========================================================================\nRoutine Description:\n\tRecord the loop index for received packet handle.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tLoopIndex\t\tThe RxProcessed in APRxDoneInterruptHandle()\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID UAPSD_TimeingRecordLoopIndex(\n\tIN\tUINT32\t\t\t\tLoopIndex)\n{\n\tgUAPSD_TimingLoopIndex = LoopIndex;\n} /* End of UAPSD_TimeingRecordLoopIndex */\n\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\n\n/*\n========================================================================\nRoutine Description:\n    Handle PS-Poll Frame.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tthe source STATION\n\nReturn Value:\n    TRUE\t\t\tHandle OK\n\tFALSE\t\t\tHandle FAIL\n\nNote:\n========================================================================\n*/\nBOOLEAN UAPSD_PsPollHandle(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry)\n{\n\tQUEUE_HEADER\t*pAcPsQue;\n\tQUEUE_HEADER\t*pAcSwQue;\n\tPQUEUE_ENTRY\tpQuedEntry;\n\tPNDIS_PACKET\tpQuedPkt;\n\tUINT32\tAcQueId;\n    /*\n\t\tAC ID          = VO > VI > BK > BE\n\t\tso we need to change BE & BK\n\t\t=> AC priority = VO > VI > BE > BK\n\t*/\n\tUINT32\tAcPriority[WMM_NUM_OF_AC] = { 1, 0, 2, 3 };\n\tUCHAR\tQueIdList[WMM_NUM_OF_AC] = { QID_AC_BE, QID_AC_BK,\n                                            QID_AC_VI, QID_AC_VO };\n\tBOOLEAN\tFlgQueEmpty;\n\tINT32\tIdAc; /* must be signed, can not use unsigned */\n\tUINT32\tAid, QueId;\n\n\n\t/* sanity check */\n\tif (pEntry == NULL)\n\t\treturn FALSE; /* fatal error */\n\t/* End of if */\n\n\t/* init */\n\tFlgQueEmpty = TRUE;\n\tpAcSwQue = NULL;\n\tpQuedPkt = NULL;\n\n\t/* sanity check */\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n\tif (pEntry->bAPSDAllAC == 0)\n\t{\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t\treturn FALSE; /* not all AC are delivery-enabled */\n\t} /* End of if */\n\n\tif (pEntry->bAPSDFlagSPStart != 0)\n\t{\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t\treturn FALSE; /* its service period is not yet ended */\n\t} /* End of if */\n\n\t/* from highest priority AC3 --> AC2 --> AC0 --> lowest priority AC1 */\n\tfor (IdAc=(WMM_NUM_OF_AC-1); IdAc>=0; IdAc--)\n\t{\n\t\tAcQueId = AcPriority[IdAc];\n\n\t\t/*\n\t\t\tNOTE: get U-APSD queue pointer here to speed up, do NOT use\n\t\t\tpEntry->UAPSDQueue[AcQueId] throughout codes because\n\t\t\tcompiler will compile it to many assembly codes.\n\t\t*/\n\t\tpAcPsQue = &pEntry->UAPSDQueue[AcQueId];\n\n\t\t/* check if any U-APSD packet is queued for the AC */\n\t\tif (pAcPsQue->Head == NULL)\n\t\t\tcontinue;\n\t\t/* End of if */\n\n\t\t/* at least one U-APSD packet exists here */\n\n\t\t/* put U-APSD packets to the AC software queue */\n\t\tif ((pAcPsQue->Head != NULL) && (pQuedPkt == NULL))\n\t\t{\n\t\t\t/* get AC software queue */\n\t\t\tQueId = QueIdList[AcQueId];\n\t\t\tpAcSwQue = &pAd->TxSwQueue[QueId];\n\n\t\t\t/* get the U-APSD packet */\n\t\t\tpQuedEntry = RemoveHeadQueue(pAcPsQue);\n\t\t\tpQuedPkt = QUEUE_ENTRY_TO_PACKET(pQuedEntry);\n\n\t\t\tif (pQuedPkt != NULL)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tWMM Specification V1.1 3.6.1.7\n                       The More Data bit (b13) of the directed MSDU or MMPDU\n                       associated with delivery-enabled ACs and destined for\n                       that WMM STA indicates that more frames are buffered for\n\t\t\t\t\tthe delivery-enabled ACs.\n\t\t\t\t*/\n\t\t\t\tRTMP_SET_PACKET_MOREDATA(pQuedPkt, TRUE);\n\n\t\t\t\t/* set U-APSD flag & its software queue ID */\n\t\t\t\tRTMP_SET_PACKET_UAPSD(pQuedPkt, TRUE, QueId);\n\t\t\t} /* End of if */\n\t\t} /* End of while */\n\n\t\tif (pAcPsQue->Head != NULL)\n\t\t{\n\t\t\t/* still have packets in queue */\n\t\t\tFlgQueEmpty = FALSE;\n\t\t\tbreak;\n\t\t} /* End of if */\n\t} /* End of for */\n\n\tif (pQuedPkt != NULL)\n\t{\n\t\tif (FlgQueEmpty == TRUE)\n\t\t{\n\t\t\t/*\n\t\t\t\tNo any more queued U-APSD packet so clear More Data bit of\n\t\t\t\tthe last frame.\n\t\t\t*/\n\t\t\tRTMP_SET_PACKET_MOREDATA(pQuedPkt, FALSE);\n\t\t} /* End of if */\n\n\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry, pAcSwQue, pQuedPkt);\n\t} /* End of if */\n\n\t/* clear corresponding TIM bit */\n\n\t/* get its AID for the station */\n\tAid = pEntry->Aid;\n\n\tif ((pEntry->bAPSDAllAC == 1) && (FlgQueEmpty == TRUE))\n\t{\n\t\t/* all AC are U-APSD and no any U-APSD packet is queued, set TIM */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t/* clear TIM bit */\n\t\tif ((Aid > 0) && (Aid < MAX_LEN_OF_MAC_TABLE))\n\t\t{\n\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pEntry->apidx, Aid);\n\t\t} /* End of if */\n#endif /* CONFIG_AP_SUPPORT */\n\t} /* End of if */\n\n\t/* reset idle timeout here whenever a trigger frame is received */\n\tpEntry->UAPSDQIdleCount = 0;\n\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\n\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\treturn TRUE;\n}\n\n/*\n========================================================================\nRoutine Description:\n    Get the queue status for delivery-enabled AC.\n\nArguments:\n\tpAd\t\t\t\t\tPointer to our adapter\n\tpEntry\t\t\t\tthe peer entry\n\tpFlgIsAnyPktForBK\tTRUE: At lease a BK packet is queued\n\tpFlgIsAnyPktForBE\tTRUE: At lease a BE packet is queued\n\tpFlgIsAnyPktForVI\tTRUE: At lease a VI packet is queued\n\tpFlgIsAnyPktForVO\tTRUE: At lease a VO packet is queued\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_QueueStatusGet(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tOUT\tBOOLEAN\t\t\t\t*pFlgIsAnyPktForBK,\n\tOUT BOOLEAN\t\t\t\t*pFlgIsAnyPktForBE,\n\tOUT BOOLEAN\t\t\t\t*pFlgIsAnyPktForVI,\n\tOUT BOOLEAN\t\t\t\t*pFlgIsAnyPktForVO)\n{\n\t/* init */\n\t*pFlgIsAnyPktForBK = FALSE;\n\t*pFlgIsAnyPktForBE = FALSE;\n\t*pFlgIsAnyPktForVI = FALSE;\n\t*pFlgIsAnyPktForVO = FALSE;\n\n\t/* sanity check */\n\tif (pEntry == NULL)\n\t\treturn;\n\n\t/* get queue status */\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\tif (pEntry->UAPSDQueue[QID_AC_BK].Head != NULL)\n\t\t*pFlgIsAnyPktForBK = TRUE;\n\tif (pEntry->UAPSDQueue[QID_AC_BE].Head != NULL)\n\t\t*pFlgIsAnyPktForBE = TRUE;\n\tif (pEntry->UAPSDQueue[QID_AC_VI].Head != NULL)\n\t\t*pFlgIsAnyPktForVI = TRUE;\n\tif (pEntry->UAPSDQueue[QID_AC_VO].Head != NULL)\n\t\t*pFlgIsAnyPktForVO = TRUE;\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n}\n\n/*\n========================================================================\nRoutine Description:\n    Handle UAPSD Trigger Frame.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tthe source STATION\n\tUpOfFrame\t\tthe UP of the trigger frame\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_TriggerFrameHandle(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tIN\tUCHAR\t\t\t\tUpOfFrame)\n{\n\tQUEUE_HEADER\t*pAcPsQue;\n\tQUEUE_HEADER\t*pAcSwQue, *pLastAcSwQue;\n\tPQUEUE_ENTRY\tpQuedEntry;\n\tPNDIS_PACKET\tpQuedPkt;\n\n\tUINT32\tAcQueId;\n\tUINT32\tTxPktNum, SpMaxLen;\n    /*\n\t\tAC ID          = VO > VI > BK > BE\n\t\tso we need to change BE & BK\n\t\t=> AC priority = VO > VI > BE > BK\n\t*/\n\tUINT32\tAcPriority[WMM_NUM_OF_AC] = { 1, 0, 2, 3 };\n\t/* 0: deliver all U-APSD packets */\n\tUINT32\tSpLenMap[WMM_NUM_OF_AC] = { 0, 2, 4, 6 };\n\tUCHAR\tQueIdList[WMM_NUM_OF_AC] = { QID_AC_BE, QID_AC_BK,\n                                            QID_AC_VI, QID_AC_VO };\n\tBOOLEAN\tFlgQueEmpty;\n\tBOOLEAN\tFlgNullSnd;\n\tBOOLEAN\tFlgMgmtFrame;\n\tUINT32\tAid, QueId;\n\tINT32\tIdAc; /* must be signed, can not use unsigned */\n/*\tULONG    FlgIrq; */\n\n#ifdef UAPSD_SP_ACCURATE\n\tULONG\tTimeNow;\n#endif /* UAPSD_SP_ACCURATE */\n\n\n\t/* sanity check for Service Period of the STATION */\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n#ifdef UAPSD_DEBUG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\nuapsd> bAPSDFlagLegacySent = %d!\\n\",\n\t\t\tpEntry->bAPSDFlagLegacySent));\n#endif /* UAPSD_DEBUG */\n\n\tif (pEntry->bAPSDFlagSPStart != 0)\n\t{\n\t\t/*\n\t\t\treset ContinueTxFailCnt\n\t\t*/\n\t\tpEntry->ContinueTxFailCnt = 0;\n\n\t\t/*\n\t\t\tWMM Specification V1.1 3.6.1.5\n               A Trigger Frame received by the WMM AP from a WMM STA that\n               already has an USP underway shall not trigger the start of a new\n\t\t\tUSP.\n\t\t*/\n\n\t\t/*\n\t\t\tCurrent SP for the STATION is not yet ended so the packet is\n\t\t\tnormal DATA packet.\n\t\t*/\n\n#ifdef UAPSD_DEBUG\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> sorry! SP is not yet closed!\\n\"));\n#endif /* UAPSD_DEBUG */\n\n#ifdef UAPSD_SP_ACCURATE\n\t\t/*\n\t\t\tThe interval between the data frame from QSTA and last confirmed\n\t\t\tpacket from QAP in UAPSD_SP_AUE_Handle() is too large so maybe\n\t\t\twe suffer the worse case.\n\n\t\t\tCurrently, if we send any packet with 1Mbps in 2.4GHz and 6Mbps\n\t\t\tin 5GHz, no any statistics count for the packet so the SP can\n\t\t\tnot be closed.\n\t\t*/\n\t\tUAPSD_TIME_GET(pAd, TimeNow);\n\n\t\tif ((TimeNow - pEntry->UAPSDTimeStampLast) >= UAPSD_EPT_SP_INT)\n\t\t{\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> SP period is too large so SP is closed first!\"\n\t\t\t\t\t\t\" (%lu %lu %lu)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\n\",\n\t\t\t\t\t\tTimeNow, pEntry->UAPSDTimeStampLast,\n\t\t\t\t\t\t(TimeNow - pEntry->UAPSDTimeStampLast)));\n\n\t\t\tgUAPSD_SP_CloseAbnormalNum ++;\n#endif /* UAPSD_DEBUG */\n\n\t\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t\t\tUAPSD_SP_Close(pAd, pEntry);\n\t\t\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\t\t}\n\t\telse\n\t\t{\n#endif /* UAPSD_SP_ACCURATE */\n\n\t\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n            return;\n\n#ifdef UAPSD_SP_ACCURATE\n\t\t}\n#endif /* UAPSD_SP_ACCURATE */\n\t}\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n\tUAPSD_TIMING_RECORD(pAd, UAPSD_TIMING_RECORD_TRG_RCV);\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\n#ifdef UAPSD_DEBUG\n\tif (pEntry->pUAPSDEOSPFrame != NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> EOSP is not NULL!\\n\"));\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t\treturn;\n\t}\n#endif /* UAPSD_DEBUG */\n\n\tif (pEntry->MaxSPLength >= 4)\n\t{\n\t\t/* fatal error, should be 0 ~ 3 so reset it to 0 */\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"uapsd> MaxSPLength >= 4 (%d)!\\n\", pEntry->MaxSPLength));\n\t\tpEntry->MaxSPLength = 0;\n\t}\n\n\n#ifdef UAPSD_SP_ACCURATE\n\t/* mark the start time for the SP */\n\tUAPSD_TIME_GET(pAd, pEntry->UAPSDTimeStampLast);\n\n\n\t/* check if current rate of the entry is 1Mbps (2.4GHz) or 6Mbps (5GHz) */\n\n#ifdef RTMP_MAC_USB\n\t/* always use rough mechanism */\n\tpEntry->bAPSDFlagSpRoughUse = 1;\n#endif /* RTMP_MAC_USB */\n#else\n\n\tpEntry->bAPSDFlagSpRoughUse = 1;\n#endif /* UAPSD_SP_ACCURATE */\n\n\n\t/* sanity Check for UAPSD condition */\n\tif (UpOfFrame >= 8)\n\t\tUpOfFrame = 1; /* shout not be here */\n\n\t/* get the AC ID of incoming packet */\n\tAcQueId = MapUserPriorityToAccessCategory[UpOfFrame];\n\n\t/* check whether the AC is trigger-enabled AC */\n\tif (pEntry->bAPSDCapablePerAC[AcQueId] == 0)\n\t{\n\t\t/*\n\t\t\tWMM Specification V1.1 Page 4\n               Trigger Frame: A QoS Data or QoS Null frame from a WMM STA in\n               Power Save Mode associated with an AC the WMM STA has configured\n               to be a trigger-enabled AC.\n\n               A QoS Data or QoS Null frame that indicates transition to/from\n               Power Save Mode is not considered to be a Trigger Frame and the\n\t\t\tAP shall not respond with a QoS Null frame.\n\t\t*/\n\n\t\t/*\n\t\t\tERROR! the AC does not belong to a trigger-enabled AC or\n\t\t\tthe ACM of the AC is set.\n\t\t*/\n\t\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\t\treturn;\n\t}\n\n\n\t/* enqueue U-APSD packets to AC software queues */\n\n\t/*\n\t\tProtect TxSwQueue0 & McastPsQueue because use them in\n\t\tinterrupt context.\n\t*/\n/*\tRTMP_IRQ_LOCK(FlgIrq); */\n\n\t/* init */\n\tFlgQueEmpty = TRUE;\n\tTxPktNum = 0;\n\tSpMaxLen = SpLenMap[pEntry->MaxSPLength];\n\tpAcSwQue = NULL;\n\tpLastAcSwQue = NULL;\n\tpQuedPkt = NULL;\n\tFlgMgmtFrame = 0;\n\n\t/* from highest priority AC3 --> AC2 --> AC0 --> lowest priority AC1 */\n\tfor (IdAc=(WMM_NUM_OF_AC-1); IdAc>=0; IdAc--)\n\t{\n\t\tAcQueId = AcPriority[IdAc];\n\n\t\t/* check if the AC is delivery-enable AC */\n\t\tif (pEntry->bAPSDDeliverEnabledPerAC[AcQueId] == 0)\n\t\t\tcontinue;\n\n\t\t/*\n\t\t\tNOTE: get U-APSD queue pointer here to speed up, do NOT use\n\t\t\tpEntry->UAPSDQueue[AcQueId] throughout codes because\n\t\t\tcompiler will compile it to many assembly codes.\n\t\t*/\n\t\tpAcPsQue = &pEntry->UAPSDQueue[AcQueId];\n\n\t\t/* check if any U-APSD packet is queued for the AC */\n\t\tif (pAcPsQue->Head == NULL)\n\t\t\tcontinue;\n\n\t\t/* at least one U-APSD packet exists here */\n\n\t\t/* get AC software queue */\n\t\tQueId = QueIdList[AcQueId];\n\t\tpAcSwQue = &pAd->TxSwQueue[QueId];\n\n\t\t/* put U-APSD packets to the AC software queue */\n\t\twhile(pAcPsQue->Head)\n\t\t{\n\t\t\t/* check if Max SP Length != 0 */\n\t\t\tif (SpMaxLen != 0)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tWMM Specification V1.1 3.6.1.7\n                       At each USP for a WMM STA, the WMM AP shall attempt to\n                       transmit at least one MSDU or MMPDU, but no more than the\n                       value encoded in the Max SP Length field in the QoS Info\n                       Field of a WMM Information Element from delivery-enabled\n\t\t\t\t\tACs, that are destined for the WMM STA.\n\t\t\t\t*/\n\t\t\t\tif (TxPktNum >= SpMaxLen)\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tSome queued U-APSD packets still exists so we will\n\t\t\t\t\t\tnot clear MoreData bit of the packet.\n\t\t\t\t\t*/\n\t\t\t\t\tFlgQueEmpty = FALSE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* count U-APSD packet number */\n\t\t\tTxPktNum ++;\n\n\t\t\t/* queue last U-APSD packet */\n\t\t\tif (pQuedPkt != NULL)\n\t\t\t{\n\t\t\t\t/* enqueue U-APSD packet to transmission software queue */\n\n\t\t\t\t/*\n\t\t\t\t\tWMM Specification V1.1 3.6.1.7\n                       Each buffered frame shall be delivered using the access\n\t\t\t\t\tparameters of its AC.\n\t\t\t\t*/\n\t\t\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry, pLastAcSwQue, pQuedPkt);\n\t\t\t}\n\n\t\t\t/* get the U-APSD packet */\n\t\t\tpQuedEntry = RemoveHeadQueue(pAcPsQue);\n\t\t\tpQuedPkt = QUEUE_ENTRY_TO_PACKET(pQuedEntry);\n\n\t\t\tif (pQuedPkt != NULL)\n\t\t\t{\n\t\t\t\tif (RTMP_GET_PACKET_MGMT_PKT(pQuedPkt) == 1)\n\t\t\t\t\tFlgMgmtFrame = 1;\n\n\t\t\t\t/*\n\t\t\t\t\tWMM Specification V1.1 3.6.1.7\n                       The More Data bit (b13) of the directed MSDU or MMPDU\n                       associated with delivery-enabled ACs and destined for\n                       that WMM STA indicates that more frames are buffered for\n\t\t\t\t\tthe delivery-enabled ACs.\n\t\t\t\t*/\n\t\t\t\tRTMP_SET_PACKET_MOREDATA(pQuedPkt, TRUE);\n\n\t\t\t\t/* set U-APSD flag & its software queue ID */\n\t\t\t\tRTMP_SET_PACKET_UAPSD(pQuedPkt, TRUE, QueId);\n\t\t\t}\n\n\t\t\t/* backup its software queue pointer */\n\t\t\tpLastAcSwQue = pAcSwQue;\n\t\t}\n\n\t\tif (FlgQueEmpty == FALSE)\n\t\t{\n\t\t\t/* FlgQueEmpty will be FALSE only when TxPktNum >= SpMaxLen */\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/*\n\t\tFor any mamagement UAPSD frame, we use DMA to do SP check\n\t\tbecause no any FIFO statistics for management frame.\n\t*/\n\tif (FlgMgmtFrame)\n\t\tpEntry->bAPSDFlagSpRoughUse = 1;\n\n\t/*\n\t\tNo need to protect EOSP handle code because we will be here\n\t\tonly when last SP is ended.\n\t*/\n\tFlgNullSnd = FALSE;\n\n\tif (TxPktNum >= 1)\n\t{\n\t\tif (FlgQueEmpty == TRUE)\n\t\t{\n\t\t\t/*\n\t\t\t\tNo any more queued U-APSD packet so clear More Data bit of\n\t\t\t\tthe last frame.\n\t\t\t*/\n\t\t\tRTMP_SET_PACKET_MOREDATA(pQuedPkt, FALSE);\n\t\t}\n\t}\n\n\t//pEntry->bAPSDFlagSPStart = 1; /* set the SP start flag */\n\tUAPSD_SP_START(pAd, pEntry); /* set the SP start flag */\n\tpEntry->bAPSDFlagEOSPOK = 0;\n\n#ifdef UAPSD_DEBUG\n{\n\tULONG DebugTimeNow;\n\n\tUAPSD_TIME_GET(pAd, DebugTimeNow);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> start a SP (Tx Num = %d) (Rough SP = %d) \"\n\t\t\t\"(Has Any Mgmt = %d) (Abnormal = %d) (Time = %lu)\\n\",\n\t\t\tTxPktNum, pEntry->bAPSDFlagSpRoughUse, FlgMgmtFrame,\n\t\t\tgUAPSD_SP_CloseAbnormalNum, DebugTimeNow));\n}\n#endif /* UAPSD_DEBUG */\n\n\tif (TxPktNum <= 1)\n\t{\n\t\t/* if no data needs to tx, respond with QosNull for the trigger frame */\n\t\tpEntry->pUAPSDEOSPFrame = NULL;\n\t\tpEntry->UAPSDTxNum = 0;\n\n\t\tif (TxPktNum <= 0)\n\t\t{\n\t\t\tFlgNullSnd = TRUE;\n\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"uapsd> No data, send a Qos-Null frame with ESOP bit on and \"\n\t\t\t\t\t  \"UP=%d to end USP\\n\", UpOfFrame));\n#endif /* RELEASE_EXCLUDE */\n\t\t}\n\t\telse\n        {\n\t\t\t/* only one packet so send it directly */\n\t\t\tRTMP_SET_PACKET_EOSP(pQuedPkt, TRUE);\n\t\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry, pLastAcSwQue, pQuedPkt);\n\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"uapsd> Only one packet with UP = %d\\n\",\n\t\t\t\t\tRTMP_GET_PACKET_UP(pQuedPkt)));\n#endif /* RELEASE_EXCLUDE */\n\t\t} /* End of if */\n\n\t\t/*\n\t\t\tWe will send the QoS Null frame below and we will hande the\n\t\t\tQoS Null tx done in RTMPFreeTXDUponTxDmaDone().\n\t\t*/\n\t}\n\telse\n\t{\n\t\t/* more than two U-APSD packets */\n\n\t\t/*\n\t\t\tNOTE: EOSP bit != !MoreData bit because Max SP Length,\n\t\t\twe can not use MoreData bit to decide EOSP bit.\n\t\t*/\n\n\t\t/*\n\t\t\tBackup the EOSP frame and\n\t\t\twe will transmit the EOSP frame in RTMPFreeTXDUponTxDmaDone().\n\t\t*/\n\t\tRTMP_SET_PACKET_EOSP(pQuedPkt, TRUE);\n\n\t\tpEntry->pUAPSDEOSPFrame = (PQUEUE_ENTRY)pQuedPkt;\n\t\tpEntry->UAPSDTxNum = TxPktNum-1; /* skip the EOSP frame */\n\t}\n\n#ifdef UAPSD_DEBUG\n\tif ((pEntry->pUAPSDEOSPFrame != NULL) &&\n\t\t(RTMP_GET_PACKET_MGMT_PKT(pEntry->pUAPSDEOSPFrame) == 1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> The EOSP frame is a management frame.\\n\"));\n\t}\n#endif /* UAPSD_DEBUG */\n\n\n#ifdef UAPSD_SP_ACCURATE\n\t/* count for legacy PS packet */\n\n\t/*\n\t\tNote: A worse case for mix mode (UAPSD + legacy PS):\n\t\t\tPS-Poll --> legacy ps packet --> trigger frame --> QoS Null frame\n\t\t\t(QSTA)\t\t(QAP)\t\t\t\t (QSTA)\t\t\t   (QAP)\n\n\t\twhere statistics handler is NICUpdateFifoStaCounters().\n\n\t\tIf we receive the trigger frame before the legacy ps packet is sent to\n\t\tthe air, when we call statistics handler in tx done, it maybe the\n\t\tlegacy ps statistics, not the QoS Null frame statistics, so we will\n\t\tdo UAPSD counting fail.\n\n\t\tWe need to count the legacy PS here if it is not yet sent to the air.\n\t*/\n\n\t/*\n\t\tNote: in addition, only one legacy PS need to count because one legacy\n\t\tpacket for one PS-Poll packet; if we receive a trigger frame from a\n\t\tstation, it means that only one legacy ps packet is possible not sent\n\t\tto the air, it is impossible more than 2 legacy packets are not yet\n\t\tsent to the air.\n\t*/\n\n\tif ((pEntry->bAPSDFlagSpRoughUse == 0) &&\n\t\t(pEntry->bAPSDFlagLegacySent != 0))\n\t{\n\t\tpEntry->UAPSDTxNum ++;\n\n#ifdef UAPSD_DEBUG\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> A legacy PS is sent! UAPSDTxNum = %d\\n\",\n\t\t\t\tpEntry->UAPSDTxNum));\n#endif /* UAPSD_DEBUG */\n\t}\n#endif /* UAPSD_SP_ACCURATE */\n\n\n\t/* clear corresponding TIM bit */\n\n\t/* get its AID for the station */\n\tAid = pEntry->Aid;\n\n\tif ((pEntry->bAPSDAllAC == 1) && (FlgQueEmpty == 1))\n\t{\n\t\t/* all AC are U-APSD and no any U-APSD packet is queued, set TIM */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t/* clear TIM bit */\n\t\tif ((Aid > 0) && (Aid < MAX_LEN_OF_MAC_TABLE))\n\t\t{\n\t\t\tWLAN_MR_TIM_BIT_CLEAR(pAd, pEntry->apidx, Aid);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t}\n\n\t/* reset idle timeout here whenever a trigger frame is received */\n\tpEntry->UAPSDQIdleCount = 0;\n\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n\n\n\t/* check if NULL Frame is needed to be transmitted */\n\n\t/* it will be crashed, when spin locked in kernel 2.6 */\n\tif (FlgNullSnd)\n\t{\n\t\t/* bQosNull = bEOSP = TRUE = 1 */\n\n\t\t/*\n\t\t\tUse management queue to tx QoS Null frame to avoid delay so\n\t\t\tus_of_frame is not used.\n\t\t*/\n\t\tRtmpEnqueueNullFrame(pAd, pEntry->Addr, pEntry->CurrTxRate,\n\t\t\t\t\t\t\tAid, pEntry->apidx, TRUE, TRUE, UpOfFrame);\n\n#ifdef UAPSD_DEBUG\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> end a SP by a QoS Null frame!\\n\"));\n#endif /* UAPSD_DEBUG */\n\t}\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n\tUAPSD_TIMING_RECORD(pAd, UAPSD_TIMING_RECORD_MOVE2TX);\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\n\t/* Dequeue outgoing frames from TxSwQueue0..3 queue and process it */\n\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n}\n\n\n#ifdef RTMP_MAC_USB\n/*\n========================================================================\nRoutine Description:\n    Tag current offset of the AC in USB URB tx buffer.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pPkt\t\t\tthe tx packet\n    Wcid\t\t\tdestination entry id\n\tPktOffset\t\tUSB tx buffer offset\n\nReturn Value:\n    None\n\nNote:\n\tOnly for RT2870.\n========================================================================\n*/\nVOID UAPSD_TagFrame(\n\tIN\tRTMP_ADAPTER\t\t*pAd,\n\tIN\tNDIS_PACKET\t\t\t*pPkt,\n\tIN\tUCHAR\t\t\t\tWcid,\n\tIN\tUINT32\t\t\t\tPktOffset)\n{\n\tMAC_TABLE_ENTRY *pEntry;\n\tUCHAR AcQueId;\n\n\n\tif ((Wcid == MCAST_WCID) || (Wcid >= MAX_LEN_OF_MAC_TABLE))\n\t\treturn; /* the frame is broadcast/multicast frame */\n\t/* End of if */\n\n\tpEntry = &pAd->MacTab.Content[Wcid];\n\n\tif (pEntry->bAPSDFlagSPStart == 0)\n\t\treturn; /* SP is not started */\n\t/* End of if */\n\n#ifdef UAPSD_DEBUG\n\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> prepare to tag the frame...\\n\"));\n#endif /* UAPSD_DEBUG */\n\n\tif (RTMP_GET_PACKET_UAPSD_Flag(pPkt) == TRUE)\n\t{\n\t\t/* mark the latest USB tx buffer offset for the priority */\n\t\tAcQueId = RTMP_GET_PACKET_UAPSD_QUE_ID(pPkt);\n\t\tpEntry->UAPSDTagOffset[AcQueId] = PktOffset;\n\n#ifdef UAPSD_DEBUG\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> tag offset = %d\\n\", PktOffset));\n#endif /* UAPSD_DEBUG */\n\t} /* End of if */\n} /* End of UAPSD_TagFrame */\n\n\n/*\n========================================================================\nRoutine Description:\n    Check if UAPSD packets are tx ok.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tAcQueId\t\t\tTX completion for the AC (0 ~ 3)\n\tbulkStartPos\n\tbulkEnPos\n\nReturn Value:\n    None\n\nNote:\n\tOnly for RT2870.\n========================================================================\n*/\nVOID UAPSD_UnTagFrame(\n\tIN\tRTMP_ADAPTER\t*pAd,\n\tIN\tUCHAR\t\t\tAcQueId,\n\tIN\tUINT32\t\t\tbulkStartPos,\n\tIN\tUINT32\t\t\tbulkEnPos)\n{\n\tMAC_TABLE_ENTRY *pEntry;\n\tUINT32 IdEntry;\n\tUINT32 TxPktTagOffset;\n\tUINT16 QueId;\n\tint\t\tFirstWcid = 1;\n\n\n#ifdef P2P_SUPPORT\n\tFirstWcid = 2;\n#endif /* P2P_SUPPORT */\n\tRTMP_SEM_LOCK(&pAd->UAPSDEOSPLock);\n\n\t/* loop for all entries to check whether we need to close their SP */\n\tfor(IdEntry = FirstWcid; IdEntry < MAX_LEN_OF_MAC_TABLE; IdEntry++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[IdEntry];\n\n\t\tif ((IS_ENTRY_CLIENT(pEntry)\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t|| IS_ENTRY_TDLS(pEntry)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t)\n\t\t\t && (pEntry->bAPSDFlagSPStart == 1) &&\n\t\t\t(pEntry->UAPSDTagOffset[AcQueId] != 0))\n\t\t{\n#ifdef UAPSD_DEBUG\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"uapsd> bulkStartPos = %d\\n\", bulkStartPos));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"uapsd> bulkEnPos = %d\\n\", bulkEnPos));\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"uapsd> record offset = %d\\n\", pEntry->UAPSDTagOffset[AcQueId]));\n#endif /* UAPSD_DEBUG */\n\n\t\t\t/*\n\t\t\t\t1. tx tag is in [bulkStartPos, bulkEnPos];\n\t\t\t\t2. when bulkEnPos < bulkStartPos\n\t\t\t*/\n\t\t\tTxPktTagOffset = pEntry->UAPSDTagOffset[AcQueId];\n\n\t\t\tif (((TxPktTagOffset >= bulkStartPos) &&\n\t\t\t\t\t(TxPktTagOffset <= bulkEnPos)) ||\n\t\t\t\t((bulkEnPos < bulkStartPos) &&\n\t\t\t\t\t(TxPktTagOffset >= bulkStartPos)) ||\n\t\t\t\t((bulkEnPos < bulkStartPos) &&\n\t\t\t\t\t(TxPktTagOffset <= bulkEnPos)))\n\t\t\t{\n\t\t\t\t/* ok, some UAPSD frames of the AC are transmitted */\n\t\t\t\tpEntry->UAPSDTagOffset[AcQueId] = 0;\n\n\t\t\t\tif (pEntry->UAPSDTxNum == 0)\n\t\t\t\t{\n\t\t\t\t\t/* ok, all UAPSD frames are transmitted */\n\t\t\t\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\t\t\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\t\t\t\tUAPSD_SP_END(pAd, pEntry);\n\n\t\t\t\t\tif (pEntry->pUAPSDEOSPFrame != NULL)\n\t\t            {\n\t\t\t\t\t\t/* should not be here */\n\t\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t\tQUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame),\n\t\t                                    NDIS_STATUS_FAILURE);\n\t\t\t\t\t\tpEntry->pUAPSDEOSPFrame = NULL;\n\t\t            } /* End of if */\n\n#ifdef UAPSD_DEBUG\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"uapsd> [1] close SP (%d)!\\n\", AcQueId));\n#endif /* UAPSD_DEBUG */\n\t\t\t\t\tcontinue; /* check next station */\n\t\t\t\t} /* End of if */\n\n\t\t\t\tif ((pEntry->UAPSDTagOffset[QID_AC_BE] == 0) &&\n\t\t\t\t\t(pEntry->UAPSDTagOffset[QID_AC_BK] == 0) &&\n\t\t\t\t\t(pEntry->UAPSDTagOffset[QID_AC_VI] == 0) &&\n\t\t\t\t\t(pEntry->UAPSDTagOffset[QID_AC_VO] == 0))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tOK, UAPSD frames of all AC for the entry are transmitted\n\t\t\t\t\t\texcept the EOSP frame.\n\t\t\t\t\t*/\n\n\t\t\t\t\tif (pEntry->pUAPSDEOSPFrame != NULL)\n\t                {\n\t                    /* transmit the EOSP frame */\n\t\t\t\t\t\tPNDIS_PACKET pPkt;\n\n\t\t\t\t\t\tpPkt = QUEUE_ENTRY_TO_PACKET(pEntry->pUAPSDEOSPFrame);\n\t\t\t\t\t\tQueId = RTMP_GET_PACKET_UAPSD_QUE_ID(pPkt);\n\n\t\t\t\t\t\tif (QueId > QID_AC_VO)\n\t                    {\n\t                        /* should not be here, only for sanity */\n\t\t\t\t\t\t\tQueId = QID_AC_BE;\n\t                    } /* End of if */\n\n#ifdef UAPSD_DEBUG\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"uapsd> enqueue the EOSP frame...\\n\"));\n#endif /* UAPSD_DEBUG */\n\n\t\t\t\t\t\tUAPSD_INSERT_QUEUE_AC(pAd, pEntry,\n\t\t\t\t\t\t\t\t\t\t&pAd->TxSwQueue[QueId],\n\t\t\t\t\t\t\t\t\t\tpEntry->pUAPSDEOSPFrame);\n\n\t\t\t\t\t\tpEntry->pUAPSDEOSPFrame = NULL;\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tThe EOSP frame will be put into ASIC to tx\n\t\t\t\t\t\t\tin RTMPHandleTxRingDmaDoneInterrupt(),\n\t\t\t\t\t\t\tnot the function.\n\t\t\t\t\t\t*/\n\n\t\t\t\t\t\t/* de-queue packet here to speed up EOSP frame response */\n\t\t\t\t\t\tprintk(\"%s:: ----> RTMPDeQueuePacket\\n\", __FUNCTION__);\n\t\t\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* only when 1 data frame with EOSP = 1 is transmitted */\n\t\t\t\t\t\t//pEntry->bAPSDFlagSPStart = 0;\n\t\t\t\t\t\tpEntry->bAPSDFlagEOSPOK = 0;\n\t\t\t\t\t\tUAPSD_SP_END(pAd, pEntry);\n\n#ifdef UAPSD_DEBUG\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"uapsd> [2] close SP (%d)!\\n\", AcQueId));\n#endif /* UAPSD_DEBUG */\n\t\t\t\t\t} /* End of if */\n\n\t\t\t\t\t/* no any EOSP frames are queued and prepare to close the SP */\n\t\t\t\t\tpEntry->UAPSDTxNum = 0;\n\t\t\t\t} /* End of if */\n\t\t\t} /* End of if */\n\t\t} /* End of if */\n\t} /* End of for */\n\n\tRTMP_SEM_UNLOCK(&pAd->UAPSDEOSPLock);\n} /* End of UAPSD_UnTagFrame */\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef VENDOR_FEATURE3_SUPPORT\n/*\n========================================================================\nRoutine Description:\n    Queue packet to a AC software queue.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpEntry\t\t\tThe station\n\tpQueueHeader\tThe software queue header of the AC\n\tbulkEnPos\t\tThe packet entry\n\nReturn Value:\n    None\n\nNote:\n\tOnly for code size reduce purpose.\n========================================================================\n*/\nstatic VOID UAPSD_InsertTailQueueAc(\n\tIN\tRTMP_ADAPTER\t*pAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tQUEUE_HEADER\t*pQueueHeader,\n\tIN\tQUEUE_ENTRY\t\t*pQueueEntry)\n{\n\tInsertTailQueueAc(pAd, pEntry, pQueueHeader, pQueueEntry);\n} /* End of InsertTailQueueAc */\n#endif /* VENDOR_FEATURE3_SUPPORT */\n\n#endif /* UAPSD_SUPPORT */\n\n"
  },
  {
    "path": "src/common/vht.c",
    "content": "/*\n\n*/\n\n#include \"rt_config.h\"\n\n\n/*\n\tIEEE 802.11AC D2.0 sec 22.3.14\n\tChannelization, Table 22-21\n\n\tA VHT channel is specified by the four PLME MIB fields\n\t(Fields to specify VHT channels).\n\n\tdot11CurrentChannelBandwidth:\n\t\tChannel bandwidth. Possible values are \n\t\t\tcbw20, cbw40, cbw80, cbw160 and cbw80p80.\n\tdot11CurrentChannelCenterFrequencyIndex1:\n\t\tIn 20 MHz, 40 MHz, 80 MHz and 160 MHz channels, denotes the channel\n\t\t\tcenter frequency.\n\t\tIn 80+80 MHz channels, denotes the center frequency of the frequency \n\t\t\tsegment 1, which is the frequency segment containing the primary\n\t\t\tchannel..\n\t\tValid range = 1, K, 200.\n\tdot11CurrentChannelCenterFrequencyIndex2:\n\t\tIn 80+80 MHz channels, denotes the center frequency of the frequency\n\t\t\tsegment 2, which is the frequency segment that does not contain the\n\t\t\tprimary channel.\n\t\t\tValid range = 1, K, 200.\n\t\tUndefined for 20 MHz, 40 MHz, 80 MHz and 160 MHz channels.\n\tdot11CurrentPrimaryChannel:\n\t\tDenotes the location of the primary 20 MHz channel.\n\t\tValid range = 1, K, 200.\n\n\n\tFormula:\n\t A channel center frequency of 5.000 GHz shall be indicated by \n\t \tdot11ChannelStartingFactor = 8000, and\n\t\tdot11CurrentPrimaryChannel = 200.\n\n\t Channel starting frequency\n\t \t= dot11ChannelStartingFactor  0500 kHz.\n\t \n\tChannel center frequency [MHz]\n\t\t= Channel starting frequency + 5 * dot11CurrentChannelCenterFrequencyIndex\n\n\tPrimary 20 MHz channel center frequency [MHz]\n\t\t= Channel starting frequency + 5 * dot11CurrentPrimaryChannel\n\n\tex:  a channel specified by:\n\t\tdot11CurrentChannelBandwidth = 80 MHz\n\t\tdot11CurrentChannelCenterFrequencyIndex1 = 42\n\t\tdot11CurrentPrimaryChannel = 36\n\t\t\n\t\t=>is an 80 MHz channel with a center frequency of 5210 MHz and \n\t\t\tthe primary 20 MHz channel centered at 5180 MHz.\n\n*/\nstruct vht_ch_layout{\n\tUCHAR ch_low_bnd;\n\tUCHAR ch_up_bnd;\n\tUCHAR cent_freq_idx;\n};\n\nstatic struct vht_ch_layout vht_ch_80M[]={\n\t{36, 48, 42},\n\t{52, 64, 58},\n\t{100,112, 106},\n\t{116, 128, 122},\n\t{132, 144, 138},\n\t{149, 161, 155},\n\t{0, 0 ,0},\n};\n\n\n\n\nVOID dump_vht_cap(RTMP_ADAPTER *pAd, VHT_CAP_IE *vht_ie)\n{\n\tVHT_CAP_INFO *vht_cap = &vht_ie->vht_cap;\n\tVHT_MCS_SET *vht_mcs = &vht_ie->mcs_set;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Dump VHT_CAP IE\\n\"));\t\n\thex_dump(\"VHT CAP IE Raw Data\", (UCHAR *)vht_ie, sizeof(VHT_CAP_IE));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"VHT Capabilities Info Field\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMaximum MPDU Length=%d\\n\", vht_cap->max_mpdu_len));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tSupported Channel Width=%d\\n\", vht_cap->ch_width));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRxLDPC=%d\\n\", vht_cap->rx_ldpc));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tShortGI_80M=%d\\n\", vht_cap->sgi_80M));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tShortGI_160M=%d\\n\", vht_cap->sgi_160M));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTxSTBC=%d\\n\", vht_cap->tx_stbc));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRxSTBC=%d\\n\", vht_cap->rx_stbc));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tSU BeamformerCap=%d\\n\", vht_cap->bfer_cap_su));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tSU BeamformeeCap=%d\\n\", vht_cap->bfee_cap_su));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tCompressedSteeringNumOfBeamformerAnt=%d\\n\", vht_cap->cmp_st_num_bfer));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tNumber of Sounding Dimensions=%d\\n\", vht_cap->num_snd_dimension));\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMU BeamformerCap=%d\\n\", vht_cap->bfer_cap_mu));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMU BeamformeeCap=%d\\n\", vht_cap->bfee_cap_mu));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tVHT TXOP PS=%d\\n\", vht_cap->vht_txop_ps));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\t+HTC-VHT Capable=%d\\n\", vht_cap->htc_vht_cap));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tMaximum A-MPDU Length Exponent=%d\\n\", vht_cap->max_ampdu_exp));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tVHT LinkAdaptation Capable=%d\\n\", vht_cap->vht_link_adapt));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"VHT Supported MCS Set Field\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRx Highest SupDataRate=%d\\n\", vht_mcs->rx_high_rate));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRxMCS Map_1SS=%d\\n\", vht_mcs->rx_mcs_map.mcs_ss1));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRxMCS Map_2SS=%d\\n\", vht_mcs->rx_mcs_map.mcs_ss2));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTx Highest SupDataRate=%d\\n\", vht_mcs->tx_high_rate));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTxMCS Map_1SS=%d\\n\", vht_mcs->tx_mcs_map.mcs_ss1));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tTxMCS Map_2SS=%d\\n\", vht_mcs->tx_mcs_map.mcs_ss2));\n}\n\n\nVOID dump_vht_op(RTMP_ADAPTER *pAd, VHT_OP_IE *vht_ie)\n{\n\tVHT_OP_INFO *vht_op = &vht_ie->vht_op_info;\n\tVHT_MCS_MAP *vht_mcs = &vht_ie->basic_mcs_set;\n\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"Dump VHT_OP IE\\n\"));\t\n\thex_dump(\"VHT OP IE Raw Data\", (UCHAR *)vht_ie, sizeof(VHT_OP_IE));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"VHT Operation Info Field\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tChannelWidth=%d\\n\", vht_op->ch_width));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tChannelCenterFrequency Seg 1=%d\\n\", vht_op->center_freq_1));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tChannelCenterFrequency Seg 1=%d\\n\", vht_op->center_freq_2));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"VHT Basic MCS Set Field\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRxMCS Map_1SS=%d\\n\", vht_mcs->mcs_ss1));\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\tRxMCS Map_2SS=%d\\n\", vht_mcs->mcs_ss2));\n}\n\n\n/*\n\tCurrently we only consider about VHT 80MHz!\n*/\nUCHAR vht_cent_ch_freq(RTMP_ADAPTER *pAd, UCHAR prim_ch)\n{\n\tINT idx = 0;\n\n\n\tif (pAd->CommonCfg.vht_bw < VHT_BW_80 || prim_ch < 36)\n\t{\n\t\tpAd->CommonCfg.vht_cent_ch = 0;\n\t\tpAd->CommonCfg.vht_cent_ch2 = 0;\n\t\treturn prim_ch;\n\t}\n\n\twhile (vht_ch_80M[idx].ch_up_bnd != 0)\n\t{\n\t\tif (prim_ch >= vht_ch_80M[idx].ch_low_bnd &&\n\t\t\tprim_ch <= vht_ch_80M[idx].ch_up_bnd)\n\t\t{\n\t\t\tpAd->CommonCfg.vht_cent_ch = vht_ch_80M[idx].cent_freq_idx;\n\t\t\treturn vht_ch_80M[idx].cent_freq_idx;\n\t\t}\n\t\tidx++;\n\t}\n\n\treturn prim_ch;\n}\n\n\nINT vht_mode_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, VHT_CAP_IE *cap, VHT_OP_IE *op)\n{\n\tpEntry->MaxHTPhyMode.field.MODE = MODE_VHT;\n\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;\n\tpAd->MacTab.fAnyStationNonGF = TRUE;\n\n\tif (op->vht_op_info.ch_width >= 1 && pEntry->MaxHTPhyMode.field.BW == BW_40)\n\t{\n\t\tpEntry->MaxHTPhyMode.field.BW= BW_80;\n\t\tpEntry->MaxHTPhyMode.field.ShortGI = (cap->vht_cap.sgi_80M);\n\t\tpEntry->MaxHTPhyMode.field.STBC = (cap->vht_cap.rx_stbc > 1 ? 1 : 0);\n\t}\n\t\t\t\t\n\treturn TRUE;\n}\n\n\nINT get_vht_op_ch_width(RTMP_ADAPTER *pAd)\n{\n\t\n\treturn TRUE;\n}\n\n\n/********************************************************************\n\tProcedures for 802.11 AC Information elements\n********************************************************************/\n/*\n\tDefined in IEEE 802.11AC\n\n\tAppeared in Beacon, ProbResp frames\n*/\nINT build_quiet_channel(RTMP_ADAPTER *pAd, UCHAR *buf)\n{\n\tINT len = 0;\n\n\n\treturn len;\n}\n\n\n/*\n\tDefined in IEEE 802.11AC\n\n\tAppeared in Beacon, ProbResp frames\n*/\nINT build_ext_bss_load(RTMP_ADAPTER *pAd, UCHAR *buf)\n{\n\tINT len = 0;\n\n\n\treturn len;\n}\n\n\n/*\n\tDefined in IEEE 802.11AC\n\n\tAppeared in Beacon, ProbResp frames\n*/\nINT build_ext_pwr_constraint(RTMP_ADAPTER *pAd, UCHAR *buf)\n{\n\tINT len = 0;\n\n\n\treturn len;\n}\n\n\n/*\n\tDefined in IEEE 802.11AC\n\n\tAppeared in Beacon, ProbResp frames\n*/\nINT build_vht_pwr_envelope(RTMP_ADAPTER *pAd, UCHAR *buf)\n{\n\tINT len = 0;\n\n\t\n\treturn len;\n}\n\n\n/*\n\tDefined in IEEE 802.11AC\n\n\tAppeared in Beacon, (Re)AssocResp, ProbResp frames\n*/\t\nINT build_vht_op_ie(RTMP_ADAPTER *pAd, UCHAR *buf)\n{\n\tVHT_OP_IE vht_op;\n\n\tNdisZeroMemory((UCHAR *)&vht_op, sizeof(VHT_OP_IE));\n\tvht_op.vht_op_info.ch_width = (pAd->CommonCfg.vht_bw == VHT_BW_80 ? 1: 0);\n\tswitch (vht_op.vht_op_info.ch_width)\n\t{\n\t\tcase 0:\n\t\t\tvht_op.vht_op_info.center_freq_1 = 0;\n\t\t\tvht_op.vht_op_info.center_freq_2 = 0;\n\t\t\tbreak;\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tvht_op.vht_op_info.center_freq_1 = pAd->CommonCfg.vht_cent_ch;\n\t\t\tvht_op.vht_op_info.center_freq_2 = 0;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tvht_op.vht_op_info.center_freq_1 = pAd->CommonCfg.vht_cent_ch;\n\t\t\tvht_op.vht_op_info.center_freq_2 = pAd->CommonCfg.vht_cent_ch2;\n\t\t\tbreak;\n\t}\n\n\tvht_op.basic_mcs_set.mcs_ss1 = 3;\n\tvht_op.basic_mcs_set.mcs_ss2 = 3;\n\tvht_op.basic_mcs_set.mcs_ss3 = 3;\n\tvht_op.basic_mcs_set.mcs_ss4 = 3;\n\tvht_op.basic_mcs_set.mcs_ss5 = 3;\n\tvht_op.basic_mcs_set.mcs_ss6 = 3;\n\tvht_op.basic_mcs_set.mcs_ss7 = 3;\n\tvht_op.basic_mcs_set.mcs_ss8 = 3;\n\tswitch  (pAd->CommonCfg.RxStream)\n\t{\n\t\tcase 2:\n\t\t\tvht_op.basic_mcs_set.mcs_ss2 = 0;\n\t\tcase 1:\n\t\t\tvht_op.basic_mcs_set.mcs_ss1 = 0;\n\t\t\tbreak;\t\t\t\n\t}\n\n\tNdisMoveMemory((UCHAR *)buf, (UCHAR *)&vht_op, sizeof(VHT_OP_IE));\n\t\n\treturn sizeof(VHT_OP_IE);\n}\n\n\n/*\n\tDefined in IEEE 802.11AC\n\n\tAppeared in Beacon, (Re)AssocReq, (Re)AssocResp, ProbReq/Resp frames\n*/\nINT build_vht_cap_ie(RTMP_ADAPTER *pAd, UCHAR *buf)\n{\n\tVHT_CAP_IE vht_cap_ie;\n\n\tNdisZeroMemory((UCHAR *)&vht_cap_ie,  sizeof(VHT_CAP_IE));\n\tvht_cap_ie.vht_cap.max_mpdu_len = 0; // TODO: Ask Jerry about hardware limitation.\n\tvht_cap_ie.vht_cap.ch_width = 0; /* not support 160 or 80 + 80 MHz */\n\tvht_cap_ie.vht_cap.sgi_80M = 1;\n\tvht_cap_ie.vht_cap.htc_vht_cap = 1;\n\tvht_cap_ie.vht_cap.max_ampdu_exp = 3; // TODO: Ask Jerry about the hardware limitation, currently set as 64K\n\tvht_cap_ie.vht_cap.tx_stbc = 1;\n\tvht_cap_ie.vht_cap.rx_stbc = 2; // TODO: is it depends on the number of our antennas?\n\tvht_cap_ie.vht_cap.tx_ant_consistency = 1;\n\tvht_cap_ie.vht_cap.rx_ant_consistency = 1;\n\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss3 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss4 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss5 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss6 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss7 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss8 = VHT_MCS_CAP_NA;\n\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss3 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss4 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss5 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss6 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss7 = VHT_MCS_CAP_NA;\n\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss8 = VHT_MCS_CAP_NA;\n\n\n\tswitch  (pAd->CommonCfg.RxStream)\n\t{\n\t\tcase 1:\n\t\t\tvht_cap_ie.mcs_set.rx_high_rate = 292;\n\t\t\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tvht_cap_ie.mcs_set.rx_high_rate = 585;\n\t\t\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7;\n\t\t\tvht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 = VHT_MCS_CAP_7;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tvht_cap_ie.mcs_set.rx_high_rate = 0;\n\t\t\tbreak;\n\t}\n\n\tswitch (pAd->CommonCfg.TxStream)\n\t{\n\t\tcase 1:\n\t\t\tvht_cap_ie.mcs_set.tx_high_rate = 292;\n\t\t\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tvht_cap_ie.mcs_set.tx_high_rate = 585;\n\t\t\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7;\n\t\t\tvht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 = VHT_MCS_CAP_7;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tvht_cap_ie.mcs_set.tx_high_rate = 0;\n\t\t\tbreak;\n\t}\n\n\tNdisMoveMemory(buf, (UCHAR *)&vht_cap_ie, sizeof(VHT_CAP_IE));\n\n\treturn sizeof(VHT_CAP_IE);\n}\n\n\nINT build_vht_ies(RTMP_ADAPTER *pAd, UCHAR *buf, UCHAR frm)\n{\n\tINT len = 0;\n\tEID_STRUCT eid_hdr;\n\n\n\teid_hdr.Eid = IE_VHT_CAP;\n\teid_hdr.Len = sizeof(VHT_CAP_IE);\n\tNdisMoveMemory(buf, (UCHAR *)&eid_hdr, 2);\n\tlen = 2;\n\n\tlen += build_vht_cap_ie(pAd, (UCHAR *)(buf + len));\n\tif (frm == SUBTYPE_BEACON || frm == SUBTYPE_PROBE_RSP ||\n\t\tfrm == SUBTYPE_ASSOC_RSP || frm == SUBTYPE_REASSOC_RSP)\n\t{\n\t\teid_hdr.Eid = IE_VHT_OP;\n\t\teid_hdr.Len = sizeof(VHT_OP_IE);\n\t\tNdisMoveMemory((UCHAR *)(buf + len), (UCHAR *)&eid_hdr, 2);\n\t\tlen +=2;\n\n\t\tlen += build_vht_op_ie(pAd, (UCHAR *)(buf + len));\n\t}\n\t\n\treturn len;\n}\n\n"
  },
  {
    "path": "src/common/wapi.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twapi.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tAlbert\t\t2008-4-3      \tSupoort WAPI protocol\n*/\n/*#include <linux/stdio.h> */\n/*#include <linux/stdlib.h> */\n/*#include <linux/string.h> */\n/*#include <linux/time.h> */\n\n#ifdef WAPI_SUPPORT\n\n#include \"rt_config.h\"\n\n/* WAPI AKM OUI */\nUCHAR   OUI_WAI_CERT_AKM[4]   \t= {0x00, 0x14, 0x72, 0x01};\nUCHAR   OUI_WAI_PSK_AKM[4]   \t= {0x00, 0x14, 0x72, 0x02};\n\n/* WAPI CIPHER OUI */\nUCHAR\tOUI_WPI_CIPHER_SMS4[4] = {0x00, 0x14, 0x72, 0x01};\n\nUCHAR\tWAPI_TYPE[] = {0x88, 0xb4};\n\n/* IV default value */\nUCHAR \tAE_BCAST_PN[LEN_WAPI_TSC] = {0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,\n\t\t\t\t\t\t\t\t\t 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c};\nUCHAR \tASUE_UCAST_PN[LEN_WAPI_TSC] = {0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,\n\t\t\t\t\t\t\t\t\t   0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c};\nUCHAR \tAE_UCAST_PN[LEN_WAPI_TSC] = {0x37, 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,\n\t\t\t\t\t\t\t\t\t 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c};\n\nBUILD_TIMER_FUNCTION(RTMPWapiUskRekeyPeriodicExec);\nBUILD_TIMER_FUNCTION(RTMPWapiMskRekeyPeriodicExec);\n\nstatic void kd_hmac_sha256(\t\n    unsigned char \t*key, \n    unsigned int \tkey_len,\n    unsigned char \t*text, \n\tunsigned int \ttext_len,\n    unsigned char \t*output, \n    unsigned int \toutput_len)\n{\n\tint i;\n\n\tfor (i = 0; output_len/SHA256_DIGEST_SIZE; i++, output_len -= SHA256_DIGEST_SIZE)\n\t{\n\t\tRT_HMAC_SHA256(key, key_len, text, text_len, &output[i*SHA256_DIGEST_SIZE], SHA256_DIGEST_SIZE);\n\t\ttext = &output[i*SHA256_DIGEST_SIZE];\n\t\ttext_len = SHA256_DIGEST_SIZE;\n\t}\n\n\tif (output_len > 0)\n\t\tRT_HMAC_SHA256(key, key_len, text, text_len, &output[i*SHA256_DIGEST_SIZE], output_len);\n\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WAPI IE in RSN-IE. \n\t\tIt only shall be called by RTMPMakeRSNIE. \n\n\tArguments:\t\t\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n  \t\tAuthMode\t-\tindicate the authentication mode \n    \tWepStatus\t-\tindicate the encryption type\n\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID RTMPInsertWapiIe(\t\n\tIN\tUINT\t\t\tAuthMode,\n\tIN\tUINT\t\t\tWepStatus,\n\tOUT\tPUCHAR\t\t\tpWIe,\n\tOUT\tUCHAR\t\t\t*w_len)\n{\t\t\t\n\tWAPIIE\t*pWapiHdr = (WAPIIE*)pWIe;\n\tWAPIIE_UCAST *pWIE_ucast;\n\tWAPIIE_MCAST *pWIE_mcast;\n\n\t*w_len = 0;\n\n\t/* Assign the verson as 1 */\n\tpWapiHdr->version = 1;\n\n\t/* Set the AKM count and suite */\n\tpWapiHdr->acount = 1;\n\tswitch (AuthMode)\n\t{\n\t\tcase Ndis802_11AuthModeWAICERT:\n\t\t\tNdisMoveMemory(pWapiHdr->auth[0].oui, OUI_WAI_CERT_AKM, 4);\n\t\t\tbreak;\n\n\t\tcase Ndis802_11AuthModeWAIPSK:\n\t\t\tNdisMoveMemory(pWapiHdr->auth[0].oui, OUI_WAI_PSK_AKM, 4);\n\t\t\tbreak;\n\t}\n\n\t/* swap for big-endian platform */\n\tpWapiHdr->version = cpu2le16(pWapiHdr->version);\n\tpWapiHdr->acount = cpu2le16(pWapiHdr->acount);\n\t\n\t/* update current length */\n\t(*w_len) += sizeof(WAPIIE);\t\n\n\t/* Set the unicast cipher and count */\n\tpWIE_ucast = (WAPIIE_UCAST*)(pWIe + (*w_len));\n\tpWIE_ucast->ucount = 1;\n\tNdisMoveMemory(pWIE_ucast->ucast[0].oui, OUI_WPI_CIPHER_SMS4, 4);\n\n\t/* swap for big-endian platform */\n\tpWIE_ucast->ucount = cpu2le16(pWIE_ucast->ucount);\n\n\t/* update current length */\n\t(*w_len) += sizeof(WAPIIE_UCAST);\n\n\t/* Set the multicast cipher and capability */\n\tpWIE_mcast = (WAPIIE_MCAST*)(pWIe + (*w_len));\n\tNdisMoveMemory(pWIE_mcast->mcast, OUI_WPI_CIPHER_SMS4, 4);\n\tpWIE_mcast->capability = 0;\t/* Todo AlbertY - support pre-authentication */\n\n\t/* update current length */\n\t(*w_len) += sizeof(WAPIIE_MCAST);\n\n}\n\n/*\n    ==========================================================================\n    Description:\n\t\tCheck whether the received frame is WAPI frame.\n\n\tArguments:\n\t\tpAd\t\t\t\t-\tpointer to our pAdapter context\t\t\t\n\t\tpData\t\t\t-\tthe received frame\n\t\tDataByteCount \t-\tthe received frame's length\t\t\t\t\n       \n    Return:\n         TRUE \t\t\t-\tThis frame is WAPI frame\n         FALSE \t\t\t-\totherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPCheckWAIframe(\n    IN PUCHAR           pData,\n    IN ULONG            DataByteCount)\n{\n    if(DataByteCount < (LENGTH_802_1_H + LENGTH_WAI_H))\n        return FALSE;\n\n\n\t/* Skip LLC header */\n    if (NdisEqualMemory(SNAP_802_1H, pData, 6)) \n    {\n        pData += 6;\n    }\n\t/* Skip 2-bytes EAPoL type */\n    if (NdisEqualMemory(WAPI_TYPE, pData, 2)) \n    {\n    \tDBGPRINT(RT_DEBUG_TRACE, (\"--> Receive a WAI frame \\n\"));\n        pData += 2;         \n    }\n    else    \n        return FALSE;\n\t\n    return TRUE;\n}\n\n\n/*\n    ==========================================================================\n    Description:\n\t\tCheck whether the cipher is SMS4.\n\n\tArguments:\n\t\tpAd\t\t\t\t-\tpointer to our pAdapter context\t\t\t\n\t\tapidx\t\t\t-\tinterface index\t\t\t\t\n       \n    Return:\n         TRUE \t\t\t-\tThe cipher is SMS4\n         FALSE \t\t\t-\totherwise\n    ==========================================================================\n*/\nBOOLEAN RTMPIsWapiCipher(\n    IN PRTMP_ADAPTER    pAd,\n    IN UCHAR           \tapidx)\n{\n\tNDIS_802_11_ENCRYPTION_STATUS\tcipher_mode = Ndis802_11EncryptionDisabled;\n\n\t/* Currently, WAPI only support MBSS */\n\tif (apidx >= MAX_MBSSID_NUM(pAd) + MAX_P2P_NUM)\n\t\treturn FALSE;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tif (apidx < MAX_MBSSID_NUM(pAd))\n\t\t\tcipher_mode = pAd->ApCfg.MBSSID[apidx].WepStatus;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tcipher_mode = pAd->StaCfg.WepStatus;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (cipher_mode == Ndis802_11EncryptionSMS4Enabled)\n\t\treturn TRUE;\n\t\n    return FALSE;\n}\n\n/*\n    ==========================================================================\n    Description:\n\t\tInsert the WPI-SMS4 IV header\n\n\t\t+-------+------+-------------+\n\t\t| KeyId | resv | sequence PN |\n\t\t+-------+------+-------------+\n\n\tArguments:\n\t\t\n    Return:\n         \n    ==========================================================================\n*/\nVOID RTMPConstructWPIIVHdr(\n\tIN\tUCHAR\t\t\tkey_id,\n\tIN\tUCHAR\t\t\t*tx_iv,\n\tOUT UCHAR \t\t\t*iv_hdr)\n{\n\tiv_hdr[0] = key_id;\n\tiv_hdr[1] = 0x00;\n\n\tNdisMoveMemory(&iv_hdr[2], tx_iv, LEN_WAPI_TSC);\n}\n\nVOID RTMPDeriveWapiGTK(\n\tIN\tPUCHAR\t\t\tnmk,\n\tOUT\tPUCHAR\t\t\tgtk_ptr)\n{\n\tconst char group_context[100] = \"multicast or station key expansion for station unicast and multicast and broadcast\";\t\t\n\n\tNdisZeroMemory(gtk_ptr, 32);\n\tkd_hmac_sha256(nmk, \n\t\t\t\t   16, \n\t\t\t\t   (UCHAR *)group_context, \n\t\t\t\t   strlen(group_context), \n\t\t\t\t   gtk_ptr,\n\t\t\t\t   32);\t\n}\n\nVOID RT_SMS4_TEST(\n\tIN UINT8\t\t\ttest)\n{\n\tCIPHER_KEY\t\tCipherKey;\n\tUINT16\t\t\tdata_len;\n\tUINT8\t\t\trcvd_data[50];\n\tUINT8 mac_hdr_qos[] = {0x88, 0x42, 0x00, 0x00, 0x08, 0xda, 0x75, 0x84, \n\t\t\t\t\t\t0xd0, 0xcc, 0x27, 0xe8, 0x72, 0xaa, 0x2c, 0xb9, \n\t\t\t\t\t\t0x6b, 0xbb, 0xea, 0x35, 0xa4, 0x20, 0x1e, 0xd2, \n\t\t\t\t\t\t0xcf, 0x14};\n\t\n\tUINT8 payload_qos[] = {0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t\t   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t\t   0x00};\n\tUINT8 pn[] = \t {0x98, 0xba, 0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, \n\t\t\t\t\t  0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89};\n\tUINT8 key[] = {0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe,\n\t\t\t\t   0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01,\n\t\t\t\t   0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01,\n\t\t\t\t   0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe};\n\t\t\n\tRTMPSoftEncryptSMS4(mac_hdr_qos, \n\t\t\t\t\t\tpayload_qos, \n\t\t\t\t\t\t1, \n\t\t\t\t\t\t1, \n\t\t\t\t\t\tkey, \n\t\t\t\t\t\tpn);\n\n\thex_dump(\"encrypted payload\", payload_qos, 17);\n\n\tNdisZeroMemory(&CipherKey, sizeof(CIPHER_KEY));\n\tNdisMoveMemory(CipherKey.Key, key, 16);\n\tNdisMoveMemory(CipherKey.TxMic, &key[16], 8);\n\tNdisMoveMemory(CipherKey.RxMic, &key[24], 8);\t\n\tCipherKey.KeyLen = 16;\n\n\n\tNdisZeroMemory(rcvd_data, 50);\n\trcvd_data[0] = 1;\n\tdata_len = 2;\n\tNdisMoveMemory(&rcvd_data[data_len], pn, 16);\n\tdata_len += 16;\n\tNdisMoveMemory(&rcvd_data[data_len], payload_qos, 17);\n\tdata_len += 17;\n\n\n\tif (RTMPSoftDecryptSMS4(mac_hdr_qos, \n\t\t\t\t\t\t\tFALSE, \n\t\t\t\t\t\t\t&CipherKey, \n\t\t\t\t\t\t\trcvd_data, \n\t\t\t\t\t\t\t&data_len) == 0)\n\t\thex_dump(\"decrypted payload\", rcvd_data, data_len);\n\telse\n\t\tprintk(\"decrypted fail\\n\");\n}\n\n/*\n    ========================================================================\n\n    Routine Description:\n        In kernel mode read parameters from file\n\n    Arguments:\n        src                     the location of the file.\n        dest                        put the parameters to the destination.\n        Length                  size to read.\n\n    Return Value:\n        None\n\n    Note:\n\n    ========================================================================\n*/\nvoid rtmp_read_wapi_parms_from_file(\n\t\tIN  PRTMP_ADAPTER pAd, \n\t\tPSTRING tmpbuf, \n\t\tPSTRING buffer)\n{\t\n\tUINT32\t\t\t\t\tip_addr;\n#ifdef CONFIG_AP_SUPPORT\t\n\tINT\t\t\t\t\t\tapidx = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\tSTRING\t\ttok_str[32];\n\tINT idx;\n\n\tPCOMMON_WAPI_INFO pInfo = &pAd->CommonCfg.comm_wapi_info;\n\t\n\t/* wapi interface name */\n\tif (RTMPGetKeyParameter(\"Wapiifname\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tif (strlen(tmpbuf) > 0)\n\t\t{\n\t\t\tNdisMoveMemory(pInfo->wapi_ifname, tmpbuf, strlen(tmpbuf));\n\t\t\tpInfo->wapi_ifname_len = strlen(tmpbuf); \n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Wapiifname=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->wapi_ifname, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->wapi_ifname_len));\n\t\t}\n\t}\n\t\n\n\t/* WapiAsCertPath */\n\tif (RTMPGetKeyParameter(\"WapiAsCertPath\", tmpbuf, 128, buffer, TRUE))\n\t{\n\t\tif (strlen(tmpbuf) > 0)\n\t\t{\n\t\t\tNdisMoveMemory(pInfo->as_cert_path[0], tmpbuf, strlen(tmpbuf));\n\t\t\tpInfo->as_cert_path_len[0] = strlen(tmpbuf);\n\t\t\tpInfo->as_cert_no = 1;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiAsCertPath=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->as_cert_path[0], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->as_cert_path_len[0]));\n\t\t}\n\t}\n\n\t/* WapiAsCertPath2 ~ WapiAsCertPath10 */\n\tfor (idx = 1; idx < MAX_ID_NO; idx++)\n\t{\n\t\tsprintf(tok_str, \"WapiAsCertPath%d\", idx + 1);\n\n\t\tif (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, TRUE))\n\t\t{\n\t\t\tif (strlen(tmpbuf) > 0)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pInfo->as_cert_path[idx], tmpbuf, strlen(tmpbuf));\n\t\t\t\tpInfo->as_cert_path_len[idx] = strlen(tmpbuf);\n\t\t\t\tpInfo->as_cert_no++;\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiAsCertPath%d=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tidx+1, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->as_cert_path[idx], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->as_cert_path_len[idx]));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* WapiCaCertPath */\n\tif (RTMPGetKeyParameter(\"WapiCaCertPath\", tmpbuf, 128, buffer, TRUE))\n\t{\n\t\tif (strlen(tmpbuf) > 0)\n\t\t{\n\t\t\tNdisMoveMemory(pInfo->ca_cert_path, tmpbuf, strlen(tmpbuf));\n\t\t\tpInfo->ca_cert_path_len = strlen(tmpbuf); \n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiCaCertPath=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->ca_cert_path, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->ca_cert_path_len));\n\t\t}\n\t}\n\n\t/* WapiUserCertPath */\n\tif (RTMPGetKeyParameter(\"WapiUserCertPath\", tmpbuf, 128, buffer, TRUE))\n\t{\n\t\tif (strlen(tmpbuf) > 0)\n\t\t{\n\t\t\tNdisMoveMemory(pInfo->user_cert_path, tmpbuf, strlen(tmpbuf));\n\t\t\tpInfo->user_cert_path_len = strlen(tmpbuf); \n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiUserCertPath=%s, len=%d\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->user_cert_path, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpInfo->user_cert_path_len));\n\t\t}\n\t}\n\n\t/* WapiAsIpAddr */\n\tif (RTMPGetKeyParameter(\"WapiAsIpAddr\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tif (rtinet_aton(tmpbuf, &ip_addr))\n     \t{\n            pInfo->wapi_as_ip = ip_addr;  \n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiAsIpAddr=%s(%x)\\n\", tmpbuf, pInfo->wapi_as_ip));\n\t\t}\t    \n\t}\n\n\t/* WapiAsPort */\n\tif (RTMPGetKeyParameter(\"WapiAsPort\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tpInfo->wapi_as_port = simple_strtol(tmpbuf, 0, 10); \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiAsPort=%d\\n\", pInfo->wapi_as_port));\t\t\t   \n\t}\n\n\t/* WapiUskRekeyMethod */\n\tif (RTMPGetKeyParameter(\"WapiUskRekeyMethod\", tmpbuf, 32, buffer, TRUE))\n\t{\t\t\n\t\tif ((strcmp(tmpbuf, \"TIME\") == 0) || (strcmp(tmpbuf, \"time\") == 0))\n\t\t\tpAd->CommonCfg.wapi_usk_rekey_method = REKEY_METHOD_TIME;\n\t\telse if ((strcmp(tmpbuf, \"PKT\") == 0) || (strcmp(tmpbuf, \"pkt\") == 0))\n\t\t\tpAd->CommonCfg.wapi_usk_rekey_method = REKEY_METHOD_PKT;\n\t\telse\n\t\t\tpAd->CommonCfg.wapi_usk_rekey_method = REKEY_METHOD_DISABLE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiUskRekeyMethod=%d\\n\", pAd->CommonCfg.wapi_usk_rekey_method));\t\t\t   \n\t}\n\n\t/* WapiUskRekeyThreshold */\n\tif (RTMPGetKeyParameter(\"WapiUskRekeyThreshold\", tmpbuf, 32, buffer, TRUE))\n\t{\t\t\t\n\t\tpAd->CommonCfg.wapi_usk_rekey_threshold = simple_strtol(tmpbuf, 0, 10); \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiUskRekeyThreshold=%d\\n\", pAd->CommonCfg.wapi_usk_rekey_threshold));\t\t\t   \n\t}\n\n\t/* WapiMskRekeyMethod */\n\tif (RTMPGetKeyParameter(\"WapiMskRekeyMethod\", tmpbuf, 32, buffer, TRUE))\n\t{\t\t\n\t\tif ((strcmp(tmpbuf, \"TIME\") == 0) || (strcmp(tmpbuf, \"time\") == 0))\n\t\t\tpAd->CommonCfg.wapi_msk_rekey_method = REKEY_METHOD_TIME;\n\t\telse if ((strcmp(tmpbuf, \"PKT\") == 0) || (strcmp(tmpbuf, \"pkt\") == 0))\n\t\t\tpAd->CommonCfg.wapi_msk_rekey_method = REKEY_METHOD_PKT;\n\t\telse\n\t\t\tpAd->CommonCfg.wapi_msk_rekey_method = REKEY_METHOD_DISABLE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiMskRekeyMethod=%d\\n\", pAd->CommonCfg.wapi_msk_rekey_method));\t\t\t   \n\t}\n\n\t/* WapiMskRekeyThreshold */\n\tif (RTMPGetKeyParameter(\"WapiMskRekeyThreshold\", tmpbuf, 32, buffer, TRUE))\n\t{\n\t\tpAd->CommonCfg.wapi_msk_rekey_threshold = simple_strtol(tmpbuf, 0, 10); \n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiMskRekeyThreshold=%d\\n\", pAd->CommonCfg.wapi_msk_rekey_threshold));\t\t\t   \n\t}\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\t\t\t\t\t\t\n\t\tSTRING tok_str[16];\n\n\t\t/* WapiPskX */\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tsnprintf(tok_str, sizeof(tok_str), \"WapiPsk%d\", apidx + 1);\n\t\t\t\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].WAPIPassPhrase, 64);\n\t\t\tpAd->ApCfg.MBSSID[apidx].WAPIPassPhraseLen = 0;\n\t\t\tif(RTMPGetKeyParameter(tok_str, tmpbuf, 65, buffer, FALSE))\n\t\t\t{\t\t\t\t\t\t\t\t    \n\t\t\t    if (strlen(tmpbuf) >= 8 && strlen(tmpbuf) <= 64)\n\t\t\t    {                                    \n\t\t\t        NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].WAPIPassPhrase, tmpbuf, strlen(tmpbuf));\n\t\t\t        pAd->ApCfg.MBSSID[apidx].WAPIPassPhraseLen = strlen(tmpbuf);\n   \t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) WapiPsk=(%s), len=%d\\n\", apidx, tmpbuf, strlen(tmpbuf)));\t\t\t\t\t\t\n\t\t\t    }\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) The length of WAPI PSKPassPhrase is invalid(len=%d). \\n\", apidx, strlen(tmpbuf)));\n\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\t\t\t\t\t\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* WapiPsk */\n\t\tif (RTMPGetKeyParameter(\"WapiPsk\", tmpbuf, 512, buffer, FALSE))\n\t\t{\t\t\t\t\t\t\t\t\t\t\t                 \t\t\t\t\t\t\t\t\t\t\n\t\t    NdisZeroMemory(pAd->StaCfg.WAPIPassPhrase, 64);\n\t\t    pAd->StaCfg.WAPIPassPhraseLen = 0;\n\t\t    if (strlen(tmpbuf) >= 8 && strlen(tmpbuf) <= 64)\n\t\t    {                                    \n\t\t        NdisMoveMemory(pAd->StaCfg.WAPIPassPhrase, tmpbuf, strlen(tmpbuf));\n\t\t        pAd->StaCfg.WAPIPassPhraseLen = strlen(tmpbuf);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiPsk=(%s), len=%d\\n\", tmpbuf, strlen(tmpbuf)));\t\t\t\t\t\t\n\t\t    }\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\t\t\t{\n\t\t\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n\t\t\t\t\tpAd->StaCfg.WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The length of WAPI PSKPassPhrase is invalid(len=%d). \\n\", strlen(tmpbuf)));\n\t\t\t}\t\t\t      \t\t\t\t\t\t \n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t/* WapiPskType */\n\tif (RTMPGetKeyParameter(\"WapiPskType\", tmpbuf, 32, buffer, TRUE))\n\t{\t\t\n\t\tINT\terr;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tPSTRING macptr;\n\t\t\t\n\t\t\tfor (apidx = 0, macptr = rstrtok(tmpbuf,\";\"); macptr; macptr = rstrtok(NULL,\";\"), apidx++)\n\t\t    {\n\t\t\t\terr = 0;\n\t\t\t\n\t\t\t\tif (apidx >= pAd->ApCfg.BssidNum)\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* HEX */\n\t\t\t\tif(simple_strtol(macptr, 0, 10) == 0)\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WapiPskType = HEX_MODE;\n\t\t\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WAPIPassPhraseLen % 2 != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\terr = 1;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"I/F(ra%d) The WAPI-PSK key length MUST be even in Hex mode\\n\", apidx));\t\t\t\t\t\t\n\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t/* ASCII */\n\t\t\t\telse\t\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WapiPskType = ASCII_MODE;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (err)\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"I/F(ra%d) WapiPskType=%s\\n\", apidx, (pAd->ApCfg.MBSSID[apidx].WapiPskType == HEX_MODE) ? \"HEX\" : \"ASCII\"));\n\t\t    }\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\terr = 0;\n\t\t\n\t\t\t/* HEX */\n\t\t\tif(simple_strtol(tmpbuf, 0, 10) == 0)  \n\t\t\t{\n\t\t\t\tpAd->StaCfg.WapiPskType = HEX_MODE;\n\t\n\t\t\t\tif (pAd->StaCfg.WAPIPassPhraseLen % 2 != 0)\n\t\t\t\t{\n\t\t\t\t\terr = 1;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"The WAPI-PSK key length MUST be even in Hex mode\\n\"));\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* ASCII */\n\t\t\telse \n\t\t\t{\n\t\t\t\tpAd->StaCfg.WapiPskType = ASCII_MODE;\n\t\t\t}\n\n\t\t\tif (err)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n\t\t\t\tpAd->StaCfg.WepStatus = Ndis802_11EncryptionDisabled;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WapiPskType=%s\\n\", (pAd->StaCfg.WapiPskType == HEX_MODE) ? \"HEX\" : \"ASCII\"));\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\n\t}\n\n\t/* Sanity check - USK rekey parameter */\n\tif (pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_DISABLE || \n\t\tpAd->CommonCfg.wapi_usk_rekey_threshold == 0)\n\t{\n\t\tpAd->CommonCfg.wapi_usk_rekey_method = REKEY_METHOD_DISABLE;\n\t\tpAd->CommonCfg.wapi_usk_rekey_threshold = 0;\n\t}\n\n\t/* Sanity check - MSK rekey parameter */\n\tif (pAd->CommonCfg.wapi_msk_rekey_method == REKEY_METHOD_DISABLE || \n\t\tpAd->CommonCfg.wapi_msk_rekey_threshold == 0)\n\t{\n\t\tpAd->CommonCfg.wapi_msk_rekey_method = REKEY_METHOD_DISABLE;\n\t\tpAd->CommonCfg.wapi_msk_rekey_threshold = 0;\n\t}\n\n}\n\n/* \n    ==========================================================================\n    Description:\n        It only shall be queried by wapi daemon for querying the related \n        configuration. This routine process the WAPI configuration for per BSS.\n        \n\t==========================================================================\n*/\nstatic VOID RTMPQueryWapiConfPerBss(\n\tIN \tPRTMP_ADAPTER \tpAd,\n\tIN\tPWAPI_CONF\t\twapi_conf_ptr,\n\tIN\tUCHAR\t\t\tapidx)\n{\n\tPMBSS_WAPI_INFO pConf = &wapi_conf_ptr->mbss_wapi_info[apidx];\t\t\n \n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tPMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[apidx];\n\t\n\t\tif (pMbss->MSSIDDev != NULL)\n\t\t{\n\t\t\tPNET_DEV dev = pMbss->MSSIDDev;\n\t\t\t\n\t\t\tNdisMoveMemory(pConf->ifname, RtmpOsGetNetDevName(dev), strlen(RtmpOsGetNetDevName(dev)));\n\t\t\tpConf->ifname_len = strlen(RtmpOsGetNetDevName(dev));\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSTRING    slot_name[IFNAMSIZ];\n\n\t\t\tsnprintf(slot_name, sizeof(slot_name), \"ra%d\", apidx);\n\t\t\tNdisMoveMemory(pConf->ifname, slot_name, strlen(slot_name));\n\t\t\tpConf->ifname_len = strlen(slot_name);\t\t\t\t\t\n\t\t}\n\n\t\t/* Decide the authentication mode */\n\t\tif (pMbss->AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t\tpConf->auth_mode = WAPI_AUTH_CERT;\n\t\telse if (pMbss->AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\t\tpConf->auth_mode = WAPI_AUTH_PSK;\n\t\telse\n\t\t\tpConf->auth_mode = WAPI_AUTH_DISABLE;\n\n\t\t/* Fill in WAI pre-shared key */\n\t\tif (pMbss->WAPIPassPhraseLen > 0)\n\t\t{\n\t\t\tif (pMbss->WapiPskType == HEX_MODE)\n\t\t\t{\n\t\t\t\tpConf->psk_len = pMbss->WAPIPassPhraseLen / 2;\n\t\t\t\tAtoH((PSTRING) pMbss->WAPIPassPhrase, (PUCHAR) pConf->psk, pConf->psk_len);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpConf->psk_len = pMbss->WAPIPassPhraseLen; \n\t\t\t\tNdisMoveMemory(pConf->psk, pMbss->WAPIPassPhrase, pConf->psk_len);\n\t\t\t}\n\t\t}\n\n\t\t/* Fill in WIE */\n\t\tif (pMbss->RSNIE_Len[0] > 0)\n\t\t{\n\t\t\tpConf->wie_len = pMbss->RSNIE_Len[0] + 2; \n\n\t\t\tpConf->wie[0] = IE_WAPI;\n\t\t\tpConf->wie[1] = pMbss->RSNIE_Len[0];\n\t\t\tNdisMoveMemory(&pConf->wie[2], pMbss->RSN_IE[0], pMbss->RSNIE_Len[0]);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tNdisMoveMemory(pConf->ifname, pAd->StaCfg.dev_name, strlen((PSTRING) pAd->StaCfg.dev_name));\n\t\tpConf->ifname_len = strlen((PSTRING) pAd->StaCfg.dev_name);\n\n\t\t/* Decide the authentication mode */\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t\tpConf->auth_mode = WAPI_AUTH_CERT;\n\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\t\tpConf->auth_mode = WAPI_AUTH_PSK;\n\t\telse\n\t\t\tpConf->auth_mode = WAPI_AUTH_DISABLE;\n\n\t\t/* Fill in WAI pre-shared key */\n\t\tif (pAd->StaCfg.WAPIPassPhraseLen > 0)\n\t\t{\n\t\t\tif (pAd->StaCfg.WapiPskType == HEX_MODE)\n\t\t\t{\n\t\t\t\tpConf->psk_len = pAd->StaCfg.WAPIPassPhraseLen / 2;\n\t\t\t\tAtoH((PSTRING) pAd->StaCfg.WAPIPassPhrase, (PUCHAR) pConf->psk, pConf->psk_len);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpConf->psk_len = pAd->StaCfg.WAPIPassPhraseLen; \n\t\t\t\tNdisMoveMemory(pConf->psk, pAd->StaCfg.WAPIPassPhrase, pConf->psk_len);\n\t\t\t}\n\t\t}\n\n\t\tRTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);\n\t\t/* Fill in WIE */\n\t\tif (pAd->StaCfg.RSNIE_Len > 0)\n\t\t{\n\t\t\tpConf->wie_len = pAd->StaCfg.RSNIE_Len + 2; \n\t\t\t\n\t\t\tpConf->wie[0] = IE_WAPI;\n\t\t\tpConf->wie[1] = pAd->StaCfg.RSNIE_Len;\n\t\t\tNdisMoveMemory(&pConf->wie[2], pAd->StaCfg.RSN_IE, pAd->StaCfg.RSNIE_Len);\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        It only shall be queried by wapi daemon for querying the related \n        configuration.        \n\tArguments:\n\t    pAd\t\tPointer to our adapter\n\t    wrq\t\tPointer to the ioctl argument\n    ==========================================================================\n*/\nVOID RTMPIoctlQueryWapiConf(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tUCHAR\t\tapidx;\t\n\tUCHAR\t\t*buf = NULL;\n\tPWAPI_CONF\tpConf;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPIoctlQueryWapiConf==>\\n\"));\n\n\t/* Allocate memory for WAPI configuration */\n\tos_alloc_mem(NULL, (PUCHAR *)&buf, sizeof(WAPI_CONF));\n\n\tif (buf == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: allocate memory fail\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tpConf = (PWAPI_CONF)buf;\n\t\n\tNdisZeroMemory((PUCHAR)pConf, sizeof(WAPI_CONF));\n\t\n\t/* get MBSS number */\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tpConf->mbss_num = pAd->ApCfg.BssidNum;\t\t\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tpConf->mbss_num = 1;\t\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\t/* Set common configuration */\n\tNdisMoveMemory(&pConf->comm_wapi_info, &pAd->CommonCfg.comm_wapi_info, sizeof(COMMON_WAPI_INFO));\n\n\tfor (apidx = 0; apidx < pConf->mbss_num; apidx++)\n\t{\n\t\tRTMPQueryWapiConfPerBss(pAd, pConf, apidx);\t\t\t\t\n\t}\n\t\t\t\t\n\twrq->u.data.length = sizeof(WAPI_CONF);\n\tif (copy_to_user(wrq->u.data.pointer, pConf, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t}\n\n\tos_free_mem(NULL, buf);\n}\n\n/*\n    ==========================================================================\n    Description:\n        Timer execution function for periodically updating WAPI key.\n    Return:\n    ==========================================================================\n*/  \nVOID RTMPWapiUskRekeyPeriodicExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    UINT32          \ttmp_cnt = 0;    \n    PMAC_TABLE_ENTRY \tpEntry = (PMAC_TABLE_ENTRY)FunctionContext;\n\tPRTMP_ADAPTER \t\tpAd = (PRTMP_ADAPTER)pEntry->pAd;\n\t\n\t\n    if (pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_TIME)\n    {\n\t\ttmp_cnt = (++pEntry->wapi_usk_rekey_cnt);\n    }\n\telse if (pAd->CommonCfg.wapi_usk_rekey_method == REKEY_METHOD_PKT)\n\t{\n\t\t/* the unit is 1K packets */\n\t\ttmp_cnt = pEntry->wapi_usk_rekey_cnt/1000;\n\t}\n\telse\n\t\treturn;\n\n\t/* Trigger rekey procedure */\n\tif (tmp_cnt > pAd->CommonCfg.wapi_usk_rekey_threshold)\n\t{\t\t\n\t\tpEntry->wapi_usk_rekey_cnt = 0;\n\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t   \t\t\t\t   pEntry->AuthMode,\n\t\t\t   \t\t\t\t   pEntry->apidx,\n\t\t\t   \t\t\t\t   pEntry->Addr,\n\t\t\t   \t\t\t\t   WAI_MLME_UPDATE_USK);\n\t}\n\t\t\t\t         \n}\n\n\n/*\n    ==========================================================================\n    Description:\n        Timer execution function for periodically updating WAPI key.\n    Return:\n    ==========================================================================\n*/  \nVOID RTMPWapiMskRekeyPeriodicExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    UINT            i;\n    UINT32          tmp_cnt = 0;    \n    PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER)FunctionContext;\n\n\n\t/* if no any WAPI STA associated, don't do anything. */\n\tif (pAd->MacTab.fAnyWapiStation == FALSE)\n\t\treturn;\n\n\t/* increase counter for TIME method */\n    if (pAd->CommonCfg.wapi_msk_rekey_method == REKEY_METHOD_TIME)\n    {\n\t\ttmp_cnt = (++pAd->CommonCfg.wapi_msk_rekey_cnt);\n    }\n\telse if (pAd->CommonCfg.wapi_msk_rekey_method == REKEY_METHOD_PKT)\n\t{\n\t\t/* the unit is 1K packets */\n\t\ttmp_cnt = pAd->CommonCfg.wapi_msk_rekey_cnt/1000;\n\t}\n\telse\n\t\treturn;\t\n\n\tif (tmp_cnt > pAd->CommonCfg.wapi_msk_rekey_threshold)\n\t{\n\t\tpAd->CommonCfg.wapi_msk_rekey_cnt = 0;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tINT apidx = 0;\n    \t\tUINT cnt;\n\t\t\t\n\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t{\t\t\t\t\n\t\t\t\tUINT m_wcid;\n\t\t\t\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = pAd->ApCfg.MBSSID[apidx].DefaultKeyId == 0 ? 1 : 0;\n\t\t\t\tinc_iv_byte(pAd->ApCfg.MBSSID[apidx].key_announce_flag, LEN_WAPI_TSC, 1);\n\n\t\t\t\t/* Generate NMK randomly */\n\t\t\t\tfor (cnt = 0; cnt < 16; cnt++)\n\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].NMK[cnt] = RandomByte(pAd);\n\t\t\t\n\t\t\t\tRTMPDeriveWapiGTK(pAd->ApCfg.MBSSID[apidx].NMK, pAd->ApCfg.MBSSID[apidx].GTK);\t\t\t\t\n\n\t\t\t\tGET_GroupKey_WCID(pAd, m_wcid, apidx);\n\t\t\t\t/* Install Shared key */\n\t\t\t\tWAPIInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\t\t pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus, \n\t\t\t\t\t\t\t\t\t apidx, \n\t\t\t\t\t\t\t\t\t pAd->ApCfg.MBSSID[apidx].DefaultKeyId, \n\t\t\t\t\t\t\t\t\t m_wcid,\n\t\t\t\t\t\t\t\t\t pAd->ApCfg.MBSSID[apidx].GTK);\n\t\t\t}\t\t\t\t\t\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\t\t\t\n\t\t\t/* Todo for Adhoc mode */\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\n\t\t\n\t\tfor (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t\t{\n\t\t\tMAC_TABLE_ENTRY  *pEntry;\n\n\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\tif (IS_ENTRY_CLIENT(pEntry) && \n\t\t\t\t(pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled) &&\n\t\t\t\t(pEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n\t\t\t{\n\t\t\t\tWAPI_InternalCmdAction(pAd, \n\t\t\t\t   \t\t\t\t   \t   pEntry->AuthMode,\n\t\t\t   \t\t\t\t\t\t   pEntry->apidx,\n\t\t\t   \t\t\t\t\t\t   pEntry->Addr,\n\t\t\t   \t\t\t\t\t\t   WAI_MLME_UPDATE_MSK);\n\t\t\t}\n\t\t}\n\t}\n   \t\t\n}\n\n\nVOID RTMPInitWapiRekeyTimerAction(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry)\n{\n\tif (pEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\" RTMPInitWapiRekeyTimerAction : WAPI USK rekey timer (wcid-%d) \\n\", pEntry->Aid));\n\t\tRTMPInitTimer(pAd, &pEntry->WapiUskRekeyTimer, GET_TIMER_FUNCTION(RTMPWapiUskRekeyPeriodicExec), pEntry, TRUE);\n\t\tpEntry->WapiUskRekeyTimerRunning = FALSE;\n\t}\n\telse\n\t{\n\t\tRTMPInitTimer(pAd, &pAd->CommonCfg.WapiMskRekeyTimer, GET_TIMER_FUNCTION(RTMPWapiMskRekeyPeriodicExec), pAd, TRUE);\n\t\tpAd->CommonCfg.WapiMskRekeyTimerRunning = FALSE;\n\t}\n}\n\nVOID RTMPStartWapiRekeyTimerAction(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY pEntry)\n{\t\n\tif (pEntry)\n\t{\n\t\tif ((pAd->CommonCfg.wapi_usk_rekey_method != REKEY_METHOD_DISABLE) && \n\t\t\t(pAd->CommonCfg.wapi_usk_rekey_threshold > 0))\n\t\t{\n\t\t\t/* Regularly check the timer */\n\t\t\tif (pEntry->WapiUskRekeyTimerRunning == FALSE)\n\t\t\t{\n\t\t\t\tRTMPSetTimer(&pEntry->WapiUskRekeyTimer, WAPI_KEY_UPDATE_EXEC_INTV);\n\n\t\t\t\tpEntry->WapiUskRekeyTimerRunning = TRUE;\n\t\t\t\tpEntry->wapi_usk_rekey_cnt = 0;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" RTMPStartWapiRekeyTimerAction : WAPI USK rekey timer is started (%d) \\n\", pAd->CommonCfg.wapi_usk_rekey_threshold));\n\t\t\t}\t\t\t\t\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pAd->CommonCfg.wapi_msk_rekey_method != REKEY_METHOD_DISABLE) && \n\t\t\t(pAd->CommonCfg.wapi_msk_rekey_threshold > 0))\n\t\t{\n\t\t\t/* Regularly check the timer */\n\t\t\tif (pAd->CommonCfg.WapiMskRekeyTimerRunning == FALSE)\n\t\t\t{\n\t\t\t\tRTMPSetTimer(&pAd->CommonCfg.WapiMskRekeyTimer, WAPI_KEY_UPDATE_EXEC_INTV);\n\n\t\t\t\tpAd->CommonCfg.WapiMskRekeyTimerRunning = TRUE;\n\t\t\t\tpAd->CommonCfg.wapi_msk_rekey_cnt = 0;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" RTMPStartWapiRekeyTimerAction : WAPI MSK rekey timer is started \\n\"));\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nVOID RTMPCancelWapiRekeyTimerAction(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY pEntry)\n{\t\n\tif(pEntry)\n\t{\n\t\tif (pEntry->WapiUskRekeyTimerRunning == TRUE)\n\t\t{\n\t\t\tBOOLEAN\tCancelled;\n\n\t\t\tRTMPCancelTimer(&pEntry->WapiUskRekeyTimer, &Cancelled);\n\t\t\tpEntry->wapi_usk_rekey_cnt = 0;\n\t\t\tpEntry->WapiUskRekeyTimerRunning = FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.WapiMskRekeyTimerRunning == TRUE)\n\t\t{\n\t\t\tBOOLEAN\tCancelled;\n\n\t\t\tRTMPCancelTimer(&pAd->CommonCfg.WapiMskRekeyTimer, &Cancelled);\n\t\t\tpAd->CommonCfg.wapi_msk_rekey_cnt = 0;\n\t\t\tpAd->CommonCfg.WapiMskRekeyTimerRunning = FALSE;\n\t\t}\n\t}\n\t\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tPrepare a L2 frame to wapi daemon to trigger WAPI state machine\n\n\tArguments:\t\t\n\t\tpAd\t\t\t-\tpointer to our pAdapter context\t\n  \t\t\t\t\n\tReturn Value:\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nBOOLEAN WAPI_InternalCmdAction(\n\t\tIN  PRTMP_ADAPTER\t\tpAd,\n\t\tIN\tUCHAR\t\t\t\tAuthMode,\n\t\tIN\tUCHAR\t\t\t\tapidx,\n\t\tIN\tPUCHAR\t\t\t\tpAddr,\n\t\tIN\tUCHAR\t\t\t\tflag)\n{\t\t\t\t\t\t\t\t\t\t\t\t   \n    if ((AuthMode == Ndis802_11AuthModeWAICERT) || \n\t\t(AuthMode == Ndis802_11AuthModeWAIPSK))\n\t{\t\t\t\t\n\t\tUCHAR\t\t\tWAPI_IE[] = {0x88, 0xb4};\n\t\tUINT8\t\t\tframe_len = LENGTH_802_3 + 12; /* 12 indicates the WAPI internal command length */\n\t\tUCHAR\t\t\tFrameBuf[frame_len];\n\t\tUINT8\t\t\toffset = 0;\n\t\t\n\t\t/* Init the frame buffer */\n\t\tNdisZeroMemory(FrameBuf, frame_len);\n\t\t\n\t\t/* Prepare the 802.3 header */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tMAKE_802_3_HEADER(FrameBuf, pAd->ApCfg.MBSSID[apidx].Bssid, pAddr, WAPI_IE); \n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\t\t\t\n\t\t\tMAKE_802_3_HEADER(FrameBuf, pAd->CurrentAddress, pAddr, WAPI_IE); \n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\t\t\n\t\toffset += LENGTH_802_3;\n\n\t\t/* Prepare the specific WAPI header */\n\t\tNdisMoveMemory(&FrameBuf[offset], RALINK_OUI, 3);\n\t\toffset += 3;\n\n\t\t/* Set the state of this command */\n\t\tFrameBuf[offset] = flag;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Trigger WAPI for this sta(%02x:%02x:%02x:%02x:%02x:%02x)\\n\", PRINT_MAC(pAddr)));\n\n\t\t/* Report to upper layer */\n\t\tif (RTMP_L2_FRAME_TX_ACTION(pAd, apidx, FrameBuf, frame_len) == FALSE)\n\t\t\treturn FALSE;\t\n\n\t}\t\n\n\treturn TRUE;\n}\t\n\n\nVOID RTMPGetWapiTxTscFromAsic(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUINT\t\t\tWcid,\n\tOUT\tUCHAR\t\t\t*tx_tsc)\n{\n\tUSHORT\t\t\toffset;\t\n\tint\t\t\t\ti;\n\n\tif (IS_HW_WAPI_SUPPORT(pAd))\n\t{\n\t\tNdisZeroMemory(tx_tsc, LEN_WAPI_TSC);\n\t\n\t\t/* Read IVEIV from Asic */\n\t\toffset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);\t\t\t\t\n\t\tfor (i=0 ; i < HW_IVEIV_ENTRY_SIZE; i++)\n\t\t\tRTMP_IO_READ8(pAd, offset+i, &tx_tsc[i]); \n\n\t\t/* Read WAPI PM from Asic */\n\t\toffset = WAPI_PN_TABLE_BASE + (Wcid * WAPI_PN_ENTRY_SIZE);\n\t\tfor (i=0 ; i < WAPI_PN_ENTRY_SIZE; i++)\n\t\t\tRTMP_IO_READ8(pAd, offset+i, &tx_tsc[HW_IVEIV_ENTRY_SIZE + i]); \n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : WCID(%d) \", __FUNCTION__, Wcid));\t\t\t\n\t\thex_dump(\"TxTsc\", tx_tsc, LEN_WAPI_TSC);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s : Not support HW_WAPI_PN_TABLE\\n\", \n\t\t\t\t\t\t\t\t\t__FUNCTION__));\n\t}\t\n\t\n}\n\n\nVOID WAPIInstallPairwiseKey(\n\tPRTMP_ADAPTER\t\tpAd,\n\tPMAC_TABLE_ENTRY\tpEntry,\n\tBOOLEAN\t\t\t\tbAE)\n{\t\n\tPCIPHER_KEY\tpKey;\n\n\tpKey = &pEntry->PairwiseKey;\n    NdisZeroMemory(pKey, sizeof(CIPHER_KEY));   \n\n\t/* Assign the pairwise cipher algorithm\t*/\n    if (pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled)\n        pKey->CipherAlg = CIPHER_SMS4;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : fails (wcid-%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, pEntry->Aid));\t\n\t\treturn;\n\t}\t\n\n\t/* Prepare pair-wise key material */\n   \tpKey->KeyLen = LEN_TK;\n    NdisMoveMemory(pKey->Key, &pEntry->PTK[0], 16);\n\tNdisMoveMemory(pKey->TxMic, &pEntry->PTK[16], 8);\n\tNdisMoveMemory(pKey->RxMic, &pEntry->PTK[24], 8);\t\t\t\n\n\t/* Initial TSC for unicast */\n\tif (bAE)\n\t\tNdisMoveMemory(pKey->TxTsc, AE_UCAST_PN, LEN_WAPI_TSC);\n\telse\n\t\tNdisMoveMemory(pKey->TxTsc, ASUE_UCAST_PN, LEN_WAPI_TSC);\n\tNdisZeroMemory(pKey->RxTsc, LEN_WAPI_TSC);\n\n\t/* HW_WAPI is supported in RT3883 or later */\n\tif (IS_HW_WAPI_SUPPORT(pAd))\n\t{\n\t\tUINT32\tCONST_WAPI_PN = 0x5C365C36;\n\t\n\t\t/* Set unicast packet's PN to Asic. */\n\t\tif (bAE)\n\t\t\tAsicUpdateWCIDIVEIV(pAd, pEntry->Aid, CONST_WAPI_PN + 1, CONST_WAPI_PN);\n\t\telse\n\t\t\tAsicUpdateWCIDIVEIV(pAd, pEntry->Aid, CONST_WAPI_PN, CONST_WAPI_PN);\t\t\t\t\n\t\tAsicUpdateWAPIPN(pAd, pEntry->Aid, CONST_WAPI_PN, CONST_WAPI_PN);\n\n\t\t/* Add Pair-wise key to Asic */\n\t    AsicAddPairwiseKeyEntry(\n\t        pAd, \n\t        (UCHAR)pEntry->Aid, \n\t        &pEntry->PairwiseKey);\n\n\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\tAsicUpdateWcidAttributeEntry(\n\t\t\tpAd, \n\t\t\tpEntry->apidx, \n\t\t\tpEntry->usk_id, \n\t\t\tpEntry->PairwiseKey.CipherAlg,\n\t\t\t(UCHAR)pEntry->Aid,\n\t\t\tPAIRWISEKEYTABLE);        \n\t}\n\t\n}\n\n\nVOID WAPIInstallSharedKey(\n\tPRTMP_ADAPTER\t\tpAd,\n\tUINT8\t\t\t\tGroupCipher,\n\tUINT8\t\t\t\tBssIdx,\n\tUINT8\t\t\t\tKeyIdx,\n\tUINT8\t\t\t\tWcid,\n\tPUINT8\t\t\t\tpGtk)\n{\n\tUINT32\t\t\tCONST_WAPI_PN = 0x5C365C36;\n\tPCIPHER_KEY \tpSharedKey;\n\t\n\tif (BssIdx >= MAX_MBSSID_NUM(pAd) + MAX_P2P_NUM)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The BSS-index(%d) is out of range for MBSSID link. \\n\", \n\t\t\t\t\t\t\t\t\t__FUNCTION__, BssIdx));\t\n\t\treturn;\n\t}\n\n\tpSharedKey = &pAd->SharedKey[BssIdx][KeyIdx];\n\tNdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY));\n\t\n\tif (GroupCipher == Ndis802_11EncryptionSMS4Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_SMS4;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : fails (IF/ra%d) \\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, BssIdx));\t\n\t\treturn;\n\t}\n\t\t\t\n\t/* Assign key material into SW key table */\n\tpSharedKey->KeyLen = LEN_TK;\n\tNdisMoveMemory(pSharedKey->Key, pGtk, LEN_TK);\n\tNdisMoveMemory(pSharedKey->TxMic, pGtk + 16, LEN_TKIP_MIC);\n\tNdisMoveMemory(pSharedKey->RxMic, pGtk + 24, LEN_TKIP_MIC);            \n\n\t/* Initial TSC for B/Mcast */\n\tNdisMoveMemory(pSharedKey->TxTsc, AE_BCAST_PN, LEN_WAPI_TSC);\n\tNdisZeroMemory(pSharedKey->RxTsc, LEN_WAPI_TSC);\t\t\n\n\t/* HW_WAPI is supported in RT3883 or later */\n\tif (IS_HW_WAPI_SUPPORT(pAd))\n\t{\t\t\t\n\t\t/* Install Group Key to MAC ASIC */\n\t    AsicAddSharedKeyEntry(\n\t\t\t\t\tpAd, \n\t\t\t\t\tBssIdx, \n\t\t\t\t\tKeyIdx, \n\t\t\t\t\tpSharedKey);\n\n\t\t/* When Wcid isn't zero, it means that this is a Authenticator Role. \n\t\t   Only Authenticator entity needs to set HW IE/EIV table (0x6000),\n\t\t   WAPI PN table (0x7800)\n\t\t   and WCID attribute table (0x6800) for group key. */\n\t\tif (Wcid != 0)\n\t\t{\n\t\t\t/* Set 16-bytes PN to Asic. */\n\t\t\tAsicUpdateWCIDIVEIV(pAd, Wcid, CONST_WAPI_PN, CONST_WAPI_PN);\n\t\t\tAsicUpdateWAPIPN(pAd, Wcid, CONST_WAPI_PN, CONST_WAPI_PN);\n\n\t\t\t/* update Group key information to ASIC */\n\t\t\tAsicUpdateWcidAttributeEntry(\n\t\t\t\tpAd, \n\t\t\t\tBssIdx, \n\t\t\t\tKeyIdx, \n\t\t\t\tpSharedKey->CipherAlg,\n\t\t\t\tWcid,\n\t\t\t\tSHAREDKEYTABLE);        \n\t\t}\n\t}\n}\n\n#endif /* WAPI_SUPPORT */\n\n"
  },
  {
    "path": "src/common/wfd.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/  \n\n\n#ifdef WFD_SUPPORT\n\n#ifdef OS_ABL_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n#include <linux/version.h>\n#include <net/cfg80211.h>\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* OS_ABL_SUPPORT */\n\n#include \"rt_config.h\"\n#include \"wfd_cmm.h\"\n#ifdef OS_ABL_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n#include \"cfg80211.h\"\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* OS_ABL_SUPPORT */\n\nUCHAR WIFIDISPLAY_OUI[] = {0x50, 0x6f, 0x9a, 0x0a};\n\nINT Set_WfdEnable_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tBOOLEAN bEnable;\n\n\tbEnable = simple_strtol(arg, 0, 10);\n\n\tif (bEnable == TRUE)\n\t{\n\t\tpAd->StaCfg.WfdCfg.bWfdEnable = TRUE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Enable WFD Support!\\n\", __FUNCTION__));\n\t}\n\telse\n\t{\n\t\tpAd->StaCfg.WfdCfg.bWfdEnable = FALSE;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Disable WFD Support!\\n\", __FUNCTION__));\n\t}\n\n\treturn TRUE;\n}\n\n#ifdef RT_CFG80211_SUPPORT\nINT Set_WfdInsertIe_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tBOOLEAN bEnable;\n\tCFG80211_CB *pCfg80211_CB = NULL;\n\n\tpAd->StaCfg.WfdCfg.bSuppInsertWfdIe = FALSE;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\tif (pAd->pCfg80211_CB != NULL)\n\t{\n\t\tpCfg80211_CB = (CFG80211_CB *)pAd->pCfg80211_CB;\n\t\tif (pCfg80211_CB->pCfg80211_Wdev != NULL)\n\t\t{\n\t\t\tif ((pCfg80211_CB->pCfg80211_Wdev->wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_CLIENT)) ||\n\t\t\t\t(pCfg80211_CB->pCfg80211_Wdev->wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_GO)))\n\t\t\t{\n\t\t\t\tbEnable = simple_strtol(arg, 0, 10);\n\t\t\t\t\n\t\t\t\tif (bEnable == TRUE)\n\t\t\t\t{\n\t\t\t\t\tpAd->StaCfg.WfdCfg.bSuppInsertWfdIe = TRUE;\n\t\t\t\t\tpAd->StaCfg.WfdCfg.bWfdEnable = TRUE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Enable Insert WFD IE Support for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Disable Insert WFD IE Support for wpa_supplicant!\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Interface mode not support Insert WFD IE for wpa_supplicant!\\n\", __FUNCTION__));\n\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: pCfg80211_CB->pCfg80211_Wdev is NULL. Not Support Insert WFD IE for wpa_supplicant!\\n\", __FUNCTION__));\n\n\t}\n\telse\n#endif\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: pAd->pCfg80211_CB is NULL. Not Support Insert WFD IE for wpa_supplicant!\\n\", __FUNCTION__));\n\n\treturn TRUE;\n}\n#endif /* RT_CFG80211_SUPPORT */\n\nINT Set_WfdDeviceType_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tUCHAR DeviceType;\n\n\tDeviceType = simple_strtol(arg, 0, 10);\n\n\tif (DeviceType <= WFD_SOURCE_PRIMARY_SINK)\n\t{\n\t\tpAd->StaCfg.WfdCfg.DeviceType = DeviceType;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Device Type Not Support!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Device Type = %d\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.DeviceType));\n\n\treturn TRUE;\n}\n\n\nINT Set_WfdCouple_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tUCHAR coupled;\n\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t\tcoupled = WFD_COUPLED_NOT_SUPPORT;\n\telse if (simple_strtol(arg, 0, 10) == 1)\n\t\tcoupled = WFD_COUPLED_SUPPORT;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Coupled out of range!!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tswitch (pAd->StaCfg.WfdCfg.DeviceType)\n\t{\n\t\tcase WFD_SOURCE:\n\t\t\tpAd->StaCfg.WfdCfg.SourceCoupled = coupled;\n\t\t\tbreak;\n\t\tcase WFD_PRIMARY_SINK:\n\t\tcase WFD_SECONDARY_SINK:\n\t\t\tpAd->StaCfg.WfdCfg.SinkCoupled = coupled;\n\t\t\tbreak;\n\t\tcase WFD_SOURCE_PRIMARY_SINK:\n\t\t\tpAd->StaCfg.WfdCfg.SourceCoupled = coupled;\n\t\t\tpAd->StaCfg.WfdCfg.SinkCoupled = coupled;\n\t\t\tbreak;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Device Type = %d, Source Coupled = %d, Sink Coupled = %d\\n\", __FUNCTION__, \n\t\tpAd->StaCfg.WfdCfg.DeviceType, pAd->StaCfg.WfdCfg.SourceCoupled, pAd->StaCfg.WfdCfg.SinkCoupled));\n\n\treturn TRUE;\n}\n\nINT Set_WfdSessionAvailable_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t\tpAd->StaCfg.WfdCfg.SessionAvail= WFD_SESSION_NOT_AVAILABLE;\n\telse if (simple_strtol(arg, 0, 10) == 1)\n\t\tpAd->StaCfg.WfdCfg.SessionAvail = WFD_SESSION_AVAILABLE;\n\telse\n\t{\n\t\tpAd->StaCfg.WfdCfg.SessionAvail = WFD_SESSION_NOT_AVAILABLE;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Session Available out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.SessionAvail));\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Session Available = %d\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.SessionAvail));\n\t\n\treturn TRUE;\n}\n\nINT Set_WfdCP_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t\tpAd->StaCfg.WfdCfg.CP = WFD_CP_NOT_SUPPORT;\n\telse if (simple_strtol(arg, 0, 10) == 1)\n\t\tpAd->StaCfg.WfdCfg.CP = WFD_CP_HDCP20;\n\telse\n\t{\n\t\tpAd->StaCfg.WfdCfg.CP = WFD_CP_NOT_SUPPORT;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Content Protection out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.CP));\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Content Protection = %d\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.CP));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_WfdRtspPort_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tINT32 RtspPort;\n\t\n\tRtspPort = simple_strtol(arg, 0, 10);\n\t\n\tif ((RtspPort < 0) || (65535 < RtspPort))\n\t{\n\t\tpAd->StaCfg.WfdCfg.RtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: RTSP Port out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.RtspPort));\n\t}\n\telse\n\t\tpAd->StaCfg.WfdCfg.RtspPort = RtspPort;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: RTSP Port = %d\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.RtspPort));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_WfdMaxThroughput_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tINT32 Throughput;\n\t\n\tThroughput = simple_strtol(arg, 0, 10);\n\n\tif ((Throughput <= 0)|| (65535 < Throughput))\n\t{\n\t\tpAd->StaCfg.WfdCfg.MaxThroughput = WFD_MAX_THROUGHPUT_DEFAULT;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Max Throughput out of range, using default\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.MaxThroughput));\n\t}\n\telse\n\t\tpAd->StaCfg.WfdCfg.MaxThroughput = Throughput;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: Max Throughput = %d\\n\", __FUNCTION__, pAd->StaCfg.WfdCfg.MaxThroughput));\n\n\treturn TRUE;\n}\n\nINT Set_WfdLocalIp_Proc(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPRT_WFD_CONFIG pWFDCtrl = &pAd->StaCfg.WfdCfg;\n\tUINT32 ip_addr;\n\n\trtinet_aton(arg, &ip_addr);\n\tprintk(\"IP = %04x\\n\", ip_addr);\n\tpWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie[0] = WFD_LOCAL_IP_ADDR_VERSION_IPV4;\n\tRTMPMoveMemory(&pWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie[1], &ip_addr, sizeof(UINT32));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: local IP Address = %d.%d.%d.%d\\n\", __FUNCTION__,\n\t\t\tpWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie[1], \n\t\t\tpWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie[2],\n\t\t\tpWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie[3],\n\t\t\tpWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie[4]));\n\n\treturn TRUE;\n}\n\nINT Set_PeerRtspPort_Proc(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPSTRING \t\targ)\n{\n\tPRT_WFD_CONFIG pWFDCtrl = &pAd->StaCfg.WfdCfg;\n\tUINT32 ip_addr;\n\n\tMAC_TABLE_ENTRY *pEntry;\n\tUSHORT RtspPort = WFD_RTSP_DEFAULT_PORT;\n\tUCHAR P2pIdx = P2P_NOT_FOUND;\n\tPRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg;\n\tINT i;\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\ti = -1;\n\tif (pAd->StaCfg.TdlsInfo.bTDLSCapable && pAd->StaCfg.WfdCfg.PC == WFD_PC_TDLS)\n\t{\n\t\tPRT_802_11_TDLS pTDLS = NULL;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - TDLS peer rtsp port get...\\n\", __FUNCTION__));\n\t\tfor (i = MAX_NUM_OF_TDLS_ENTRY - 1; i >= 0; i--)\n\t\t{\n\t\t\tif ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status == TDLS_MODE_CONNECTED))\n\t\t\t{\n\t\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[i];\n\t\t\t\tRtspPort = pTDLS->WfdEntryInfo.rtsp_port;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\\n\", i, PRINT_MAC(pTDLS->MacAddr)));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSP_PORT = %d.\\n\", pTDLS->WfdEntryInfo.rtsp_port));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ((RtspPort == 0) && (pTDLS != NULL))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS peer rtsp port is zero, search P2P Entry!\\n\", RtspPort));\n\n\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pTDLS->MacAddr);\n\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t{\n\t\t\t\tRtspPort = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port; \n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\\n\", P2pIdx, PRINT_MAC(pTDLS->MacAddr)));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSP_PORT = %d.\\n\", pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port));\n\t\t\t\tif (RtspPort == 0)\n\t\t\t\t\tRtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"OID_802_11_P2P_PEER_RTSP_PORT::P2P not found, use default RTSP port\\n\"));\n\t\t\t}\n\t\t}\n\t}\n\tif (i < 0)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - P2P peer rtsp port get...\\n\", __FUNCTION__));\n\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t{\n\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry) || IS_P2P_CLI_ENTRY(pEntry))\n\t\t\t\t{\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\\n\", pEntry->P2pInfo.p2pIndex, PRINT_MAC(pEntry->Addr)));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTSP_PORT = %d.\\n\", pAd->P2pTable.Client[pEntry->P2pInfo.p2pIndex].WfdEntryInfo.rtsp_port));\n\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t\tRtspPort = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port;\t\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tRtspPort = WFD_RTSP_DEFAULT_PORT;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"OID_802_11_P2P_PEER_RTSP_PORT::P2P not found, use default RTSP port\\n\"));\n\t\t\t\t\t}\n\t\t\t\t\tif (pEntry->P2pInfo.p2pIndex < MAX_P2P_GROUP_SIZE)\n\t\t\t\t\t\tP2PPrintP2PEntry(pAd, pEntry->P2pInfo.p2pIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OID_802_11_P2P_PEER_RTSP_PORT bssid: %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pP2PCtrl->CurrentAddress)));\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_PEER_RTSP_PORT (=%d)\\n\", RtspPort));\n\n\treturn TRUE;\n}\n\n\nVOID WfdMakeWfdIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN \tULONG\t\t\tWfdIeBitmap,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPULONG\t\t\tpIeLen)\n{\n\tPRT_WFD_CONFIG\tpWFDCtrl = &pAd->StaCfg.WfdCfg;\n\tUCHAR\t\t\tWfdIEFixed[6] = {0xdd, 0x0c, 0x50, 0x6f, 0x9a, 0x0a};\t /* Length will be modified later */\n\tPUCHAR\t\t\tpData, pBuf;\n\tULONG\t\t\tTempLen;\n\tULONG\t\t\tLen = 0;\n\tINT \t\t\tindex, i = 0;\n\n\tpData = pOutBuf;\n\t*pIeLen = 0;\n\n\tif (!pWFDCtrl->bWfdEnable)\n\t\treturn;\n\n\tRTMPMoveMemory(pData, &WfdIEFixed[0], 6);\n\tpData += 6;\n\tLen += 6;\n\n\tfor (index = 0; index < SUBID_WFD_END; index++)\n\t{\n\t\tif (WfdIeBitmap & (0x1 << index))\n\t\t{\n\t\t\t/* To append to WFD Subelement */\n\t\t\tTempLen = 0;\n\t\t\tTempLen = InsertWfdSubelmtTlv(pAd, index, NULL, pData, ACTION_WIFI_DIRECT);\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s(%d) ---->\\n\", __FUNCTION__, TempLen));\n\t\t\tfor (i=0; i<TempLen; i++)\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%02x \", *(pData+i)));\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"\\n\"));\n\t\t\t\n\t\t\tLen += TempLen;\n\t\t\tpData += TempLen;\n\t\t}\n\n\t}\n\n\t*(pOutBuf+1) = (Len-2);\n\t*pIeLen = Len;\n\t\n\treturn;\n}\n\n\nULONG InsertWfdSubelmtTlv(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR\t\t\tSubId,\n\tIN PUCHAR\t\t\tpInBuffer,\n\tIN PUCHAR\t\t\tpOutBuffer,\n\tIN UINT\t\t\t\tAction)\n{\n\tPRT_WFD_CONFIG\tpWFDCtrl = &pAd->StaCfg.WfdCfg;\n\tPUCHAR\tpDest;\n\tULONG\tLength, tmpValue = 0;\n\tUSHORT\tEidLen = 0;\n\n\tpDest = pOutBuffer;\n\tRTMPZeroMemory(pDest, 255);\n\t*pDest = SubId;\n\tpDest += 1;\n\tLength = 0;\n\n\tswitch (SubId)\n\t{\n\t\tcase SUBID_WFD_DEVICE_INFO:\n\t\t{\n\t\t\tWFD_DEVICE_INFO DevInfo;\n\t\t\tPUSHORT pDevInfo = &DevInfo;\n\n\t\t\tRTMPZeroMemory(&DevInfo, sizeof(WFD_DEVICE_INFO));\n\n\t\t\tEidLen = SUBID_WFD_DEVICE_INFO_LEN;\n\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\tDevInfo.DeviceType = pWFDCtrl->DeviceType;\n\t\t\tDevInfo.SourceCoupled = pWFDCtrl->SourceCoupled;\n\t\t\tDevInfo.SinkCoupled = pWFDCtrl->SinkCoupled;\n\t\t\tDevInfo.SessionAvail = pWFDCtrl->SessionAvail;\n\t\t\tDevInfo.WSD = pWFDCtrl->WSD;\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))\n\t\t\t\tDevInfo.PC = pWFDCtrl->PC;\n\t\t\telse\n\t\t\t\tDevInfo.PC = WFD_PC_P2P;\n\t\t\tDevInfo.CP = pWFDCtrl->CP;\n\t\t\tDevInfo.TimeSync = pWFDCtrl->TimeSync;\n\t\t\t/* RTMPMoveMemory(pDest + 1, &DevInfo, sizeof(WFD_DEVICE_INFO)); */\n\t\t\ttmpValue = cpu2be16(*pDevInfo);\n\t\t\tRTMPMoveMemory((pDest + 2), &tmpValue, 2);\n\t\t\ttmpValue = cpu2be16(pWFDCtrl->RtspPort);\n\t\t\tRTMPMoveMemory((pDest + 4), &tmpValue, 2);\n\t\t\ttmpValue = cpu2be16(pWFDCtrl->MaxThroughput);\n\t\t\tRTMPMoveMemory((pDest + 6), &tmpValue, 2);\n\t\t\tLength = 9;\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_ASSOCIATED_BSSID:\n\t\t{\n\t\t\tUCHAR AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_ASSOCIATED_BSSID_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t\tif (!NdisEqualMemory(AllZero, pAd->CommonCfg.Bssid, MAC_ADDR_LEN) &&\n\t\t\t\t\t(Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(pDest + 2, pAd->CommonCfg.Bssid, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!NdisEqualMemory(AllZero, pAd->CommonCfg.Bssid, MAC_ADDR_LEN))\n\t\t\t\t{\n\t\t\t\t\tEidLen = SUBID_WFD_ASSOCIATED_BSSID_LEN;\n\t\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\t\tRTMPMoveMemory(pDest + 2, pAd->CommonCfg.Bssid, MAC_ADDR_LEN);\n\t\t\t\t\tLength = EidLen + 3;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_AUDIO_FORMATS:\n\t\t{\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_AUDIO_FORMATS_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_VIDEO_FORMATS:\n\t\t{\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_VIDEO_FORMATS_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_3D_VIDEO_FORMATS:\n\t\t{\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_3D_VIDEO_FORMATS_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_CONTENT_PROTECTION:\n\t\t{\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_CONTENT_PROTECTION_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_COUPLED_SINK_INFO:\n\t\t{\n//\t\t\tif ((pWFDCtrl->DeviceType != WFD_SOURCE ) && (pWFDCtrl->SinkCoupled == WFD_COUPLED_SUPPORT))\n\t\t\t{\n\t\t\t\tWFD_COUPLED_SINK_INFO SinkInfo;\n\n\t\t\t\tRTMPZeroMemory(&SinkInfo, sizeof(WFD_COUPLED_SINK_INFO));\n\t\t\t\tEidLen = SUBID_WFD_COUPLED_SINK_INFO_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tSinkInfo.CoupledStat = pWFDCtrl->CoupledSinkStatus.CoupledStat;\n\t\t\t\tRTMPMoveMemory(pDest + 2, &SinkInfo, sizeof(WFD_COUPLED_SINK_INFO));\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_EXTENDED_CAP:\n\t\t{\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_EXTENDED_CAP_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_LOCAL_IP_ADDR:\n\t\t{\n\t\t\tif ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_LOCAL_IP_ADDR_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_LOCAL_IP_ADDR_LEN;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tRTMPMoveMemory(pDest + 2, &pWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie, SUBID_WFD_LOCAL_IP_ADDR_LEN);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_SESSION_INFO:\n\t\t{\n\t\t\tINT i = 0, NumOfDev = 0; \n\t\t\tUCHAR P2pIdx = P2P_NOT_FOUND;\n\t\t\tPRT_P2P_TABLE Tab = &pAd->P2pTable;\n\n\t\t\tif (P2P_GO_ON(pAd)\n#ifdef RT_CFG80211_SUPPORT\n\t\t\t\t|| (pWFDCtrl->bSuppGoOn)\n#endif /* RT_CFG80211_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr);\n\n\t\t\t\t\tif ((P2pIdx < MAX_P2P_GROUP_SIZE) && (Tab->Client[P2pIdx].WfdEntryInfo.bWfdClient == TRUE))\n\t\t\t\t\t\tNumOfDev++;\n\t\t\t\t}\n\n\t\t\t\tEidLen = 24*NumOfDev;\n\t\t\t\ttmpValue = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest, &tmpValue, 2);\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s:: NumOfDev = %d, Len = %d\\n\", __FUNCTION__, NumOfDev, *pDest));\n\n\t\t\t\tpDest+=2;\n\t\t\t\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr);\n\n\t\t\t\t\tif ((P2pIdx < MAX_P2P_GROUP_SIZE) && (Tab->Client[P2pIdx].WfdEntryInfo.bWfdClient == TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tINT j = 0;\n\t\t\t\t\t\tWFD_SESSION_INFO SessionInfo;\n\n\t\t\t\t\t\tRTMPZeroMemory(&SessionInfo, sizeof(WFD_SESSION_INFO));\n\n\t\t\t\t\t\tSessionInfo.Length = 23;\n\t\t\t\t\t\tRTMPMoveMemory(&SessionInfo.DeviceAddr[0], &pAd->P2pTable.Client[P2pIdx].addr[0], MAC_ADDR_LEN);\n\t\t\t\t\t\tRTMPMoveMemory(&SessionInfo.Bssid[0], &pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.assoc_addr[0], MAC_ADDR_LEN);\n\t\t\t\t\t\t/*  Below is the WFD Device Information */\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.DeviceType = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_devive_type;\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.SourceCoupled = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.source_coupled;\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.SinkCoupled = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.sink_coupled;\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.SessionAvail = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.session_avail;\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.WSD = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_service_discovery;\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.PC = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_PC;\n\t\t\t\t\t\tSessionInfo.WfdDevInfo.TimeSync = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_time_sync;\n\t\t\t\t\t\tSessionInfo.MaxThroughput = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.max_throughput;\n\t\t\t\t\t\tSessionInfo.CoupledSinkInfo = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.coupled_sink_status;\n\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t\tSo far we cannot know the address of coupled devices, \n\t\t\t\t\t\t   \tthe coupled address will be filled \"0\" until WiFi Display spec. is ready for this part. \n\t\t\t\t\t\t*/\n\t\t\t\t\t\tRTMPMoveMemory(&SessionInfo.CoupledPeerAddr[0], &pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.coupled_peer_addr[0], MAC_ADDR_LEN);\n\t\t\t\t\t\tRTMPMoveMemory(pDest, &SessionInfo, sizeof(WFD_SESSION_INFO));\n\n\t\t\t\t\t\tfor (j = 0; j < 24; j++)\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%02x \", *(pDest+j)));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"\\n\"));\n\n\t\t\t\t\t\tpDest += 24;\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\n\n\t\t\t\tLength = 24*NumOfDev + 3;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SUBID_WFD_ALTERNATE_MAC_ADDR:\n\t\t{\n\t\t\tUCHAR AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t\t\tif (!NdisEqualMemory(AllZero, pAd->CurrentAddress, MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\tEidLen = SUBID_WFD_ALTERNATE_MAC_ADDR_LEN;\n\t\t\t\t*((PUSHORT) (pDest)) = cpu2be16(EidLen);\n\t\t\t\tRTMPMoveMemory(pDest + 2, pAd->CurrentAddress, MAC_ADDR_LEN);\n\t\t\t\tLength = EidLen + 3;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\t*pDest = 0;\n\t\t\tLength = 0;\n\t\t\tbreak;\n\t}\n\n\treturn Length;\n}\n\nVOID WfdParseSubElmt(\n\tIN PRTMP_ADAPTER \tpAd, \n\tIN PWFD_ENTRY_INFO\tpWfdEntryInfo,\n\tIN VOID \t\t\t*Msg, \n\tIN ULONG \t\t\tMsgLen)\n{\n\tPWFD_COUPLED_SINK_INFO pSinkInfo;\n\tPWFD_DEVICE_INFO pWfd_info;\n\tWFD_DEVICE_INFO DevInfo;\n\tPP2PEID_STRUCT pWfdEid;\n\tPEID_STRUCT\tpEid;\n\tPUCHAR \t\tpWfdIe = NULL;\n\tULONG\t\tAccuWfdIELen;\n\tULONG\t\tAccuIeLen = 0;\n\tULONG\t\tLength = 0;\n\tULONG\t\tAttriLen;\n\tUCHAR\t\toffset;\n\tBOOLEAN\t\tbTdlsEntry = FALSE;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"%s ----->\\n\", __FUNCTION__));\n\n//QQ TBD, p2p widi need to parse rtsp port!\n\t{\n\t\tif ((!pAd->StaCfg.WfdCfg.bWfdEnable) || (MsgLen == 0))\n\t\t\treturn;\n\t}\n\n//\thex_dump(\"WfdParseSubElmt::\", Msg, MsgLen);\n\tpEid = (PEID_STRUCT)Msg;\n\tAccuIeLen = pEid->Len + 2;\n//\tprintk(\"MsgLen = %d. AccuIeLen = %d.\\n\", MsgLen, AccuIeLen);\n\twhile ((ULONG)(AccuIeLen) <= MsgLen)\n\t{\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDISPLAY_OUI, 4))\n\t\t{\n\t\t\t/* Get Request content capability */\n\t\t\tpWfdIe = pWfdEid = (PP2PEID_STRUCT) &pEid->Octet[4];\n\t\t\tAccuWfdIELen = pEid->Len;\n//\t\t\tprintk(\"AccuWfdIeLen = %d. EidLen = %04x\\n\", AccuWfdIELen, pEid->Len);\n\t\t\t/* The value of AccuP2PIELen shall reduce the length of OUI (4) */\n\t\t\tAccuWfdIELen -= 4;\n\t\t\t\n\t\t\tAttriLen = pWfdEid->Len[1] + (pWfdEid->Len[0] << 8);\n\t\t\tLength = 0;\n//\t\t\tprintk(\"AttriLen = %d.  WfdEid = %d.  WfdEidLen = %x %x\\n\", AttriLen, pWfdEid->Eid, pWfdEid->Len[1], pWfdEid->Len[0]);\n\t\t\tpWfdEntryInfo->bWfdClient = TRUE; /* Set the P2P client as the WFD device */\n\n//\t\t\twhile (Length <=(Length + 3 + AttriLen) <= AccuWfdIELen)\n\t\t\twhile (Length <= AccuWfdIELen)\n\t\t\t{\n//\t\t\t\tprintk(\">> Eid = %d.\\n\", pWfdEid->Eid);\n\t\t\t\tswitch (pWfdEid->Eid)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tcase SUBID_WFD_DEVICE_INFO:\n\t\t\t\t\t{\n\t\t\t\t\t\tpWfd_info = &(pWfdEid->Octet[0]);\n\t\t\t\t\t\tRTMPMoveMemory(&DevInfo, pWfdIe, sizeof(WFD_DEVICE_INFO));\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_device_info_ie, pWfdEid->Octet, SUBID_WFD_DEVICE_INFO_LEN);\n\t\t\t\t\t\tcpu2le16(&DevInfo);\n\n\t\t\t\t\t\tpWfdEntryInfo->wfd_devive_type = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 0) & 0x3);\n\t\t\t\t\t\tpWfdEntryInfo->source_coupled = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 2) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->sink_coupled = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 3) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->session_avail = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 4) & 0x3);\n\t\t\t\t\t\tpWfdEntryInfo->wfd_service_discovery = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 6) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->wfd_PC = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 7) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->wfd_CP = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 8) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->wfd_time_sync = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 9) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->sink_audio_unsupport = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 10) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->source_audio_only= ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 11) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->tdls_persistent_group = ((be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[0]))) >> 12) & 0x1);\n\t\t\t\t\t\tpWfdEntryInfo->rtsp_port = be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[2])));\n\t\t\t\t\t\tpWfdEntryInfo->max_throughput = be2cpu16(get_unaligned((PUSHORT)(&pWfdEid->Octet[4])));\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_DEVICE_INFO\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_ASSOCIATED_BSSID:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_associate_bssid_ie, pWfdEid->Octet, SUBID_WFD_ASSOCIATED_BSSID_LEN);\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->assoc_addr, pWfdEid->Octet, MAC_ADDR_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_ASSOCIATED_BSSID\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_AUDIO_FORMATS:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_audio_format_ie, pWfdEid->Octet, SUBID_WFD_AUDIO_FORMATS_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_AUDIO_FORMATS\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_VIDEO_FORMATS:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_video_format_ie, pWfdEid->Octet, SUBID_WFD_VIDEO_FORMATS_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_VIDEO_FORMATS\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_3D_VIDEO_FORMATS:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_3d_video_format_ie, pWfdEid->Octet, SUBID_WFD_3D_VIDEO_FORMATS_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_3D_VIDEO_FORMATS\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_CONTENT_PROTECTION:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_content_proctection, pWfdEid->Octet, SUBID_WFD_CONTENT_PROTECTION_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_CONTENT_PROTECTION\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_COUPLED_SINK_INFO:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_couple_sink_info_ie, pWfdEid->Octet, SUBID_WFD_COUPLED_SINK_INFO_LEN);\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->coupled_sink_status, pWfdEid->Octet, SUBID_WFD_COUPLED_SINK_INFO_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_COUPLED_SINK_INFO\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_EXTENDED_CAP:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_extent_capability_ie, &pWfdEid->Octet, SUBID_WFD_EXTENDED_CAP_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_EXTENDED_CAP\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_LOCAL_IP_ADDR:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_local_ip_ie, &pWfdEid->Octet, SUBID_WFD_LOCAL_IP_ADDR_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_LOCAL_IP_ADDR\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_SESSION_INFO:\n\t\t\t\t\t{\n\t\t\t\t\t\t/* TODO : allocate memory to store the parsed WFD device tables */\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_session_info_ie, &pWfdEid->Octet, SUBID_WFD_DEVICE_INFO_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_SESSION_INFO\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SUBID_WFD_ALTERNATE_MAC_ADDR:\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&pWfdEntryInfo->wfd_serv_disc_query_info.wfd_alternate_mac_addr_ie, &pWfdEid->Octet, SUBID_WFD_ALTERNATE_MAC_ADDR_LEN);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s::SUBID_WFD_ALTERNATE_MAC_ADDR\\n\", __FUNCTION__));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" SUBID_WFD_ unknown  Eid = %x \\n\", pWfdEid->Eid));\n\t\t\t\t\t\thex_dump(\"WfdParseSubElement::\", Msg, MsgLen);\n\t\t\t\t\t\tbreak;\t\t\t\t\t\t\n\t\t\t\t}\n//\t\t\t\tprintk(\"<< Length = %d. AttriLen = %d. AccuWfdIELen = %d.\\n\", Length, AttriLen, AccuWfdIELen);\n\t\t\t\tLength = Length + 3 + AttriLen;  /* Eid[1] + Len[2] + content[Len] */\n//\t\t\t\tprintk(\">> Length = %d. AttriLen = %d. AccuWfdIELen = %d.\\n\", Length, AttriLen, AccuWfdIELen);\n\t\t\t\tif (Length >= AccuWfdIELen)\n\t\t\t\t\tbreak;\n\n\t\t\t\tpWfdEid = (PP2PEID_STRUCT)((UCHAR*)pWfdEid + 3 + AttriLen);\n\t\t\t\tAttriLen = pWfdEid->Len[1] + (pWfdEid->Len[0] << 8);\n\t\t\t}\n\n\t\t}\n\t\t/* Already reach the final IE and stop finding next Eid. */\n\t\tif (AccuIeLen >= MsgLen)\n\t\t\tbreak;\n\n\t\t/* Forward buffer to next pEid */\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDISPLAY_OUI, 4))\n\t\t{\n\t\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + pEid->Len + 2);    \n\t\t}\n\t\t\n\t\t/* \n\t\t\tSince we get the next pEid, \n\t\t   \tPredict the accumulated IeLen after adding the next pEid's length.\n\t\t   \tThe accumulated IeLen is for checking length.\n\t\t*/\n\t\tif (RTMPEqualMemory(&pEid->Octet[0], WIFIDISPLAY_OUI, 4))\n\t\t{\n\t\t\tAccuIeLen += (pEid->Len + 2);\n\t\t}\n\t}\n\treturn;\n}\n\nVOID\tWfdCfgInit(\n\n\tIN PRTMP_ADAPTER pAd) \n{\n\tPRT_WFD_CONFIG\tpWfdcfg = &pAd->StaCfg.WfdCfg;\n\n\tRTMPZeroMemory(&pAd->StaCfg.WfdCfg, sizeof(RT_WFD_CONFIG));\t\n\tpWfdcfg->bWfdEnable = TRUE;\n#ifdef RT_CFG80211_SUPPORT\n\tpWfdcfg->bSuppInsertWfdIe = FALSE;\n\tpWfdcfg->bSuppGoOn = FALSE;\n#endif /* RT_CFG80211_SUPPORT */\n\tpWfdcfg->DeviceType = WFD_PRIMARY_SINK;\n\tpWfdcfg->SessionAvail = WFD_SESSION_AVAILABLE;\n\tpWfdcfg->PeerSessionAvail = WFD_SESSION_AVAILABLE;\n\tpWfdcfg->PeerPC = WFD_PC_TDLS;\n\tpWfdcfg->TdlsSecurity = WFD_TDLS_STRONG_SECURITY;\n\tpWfdcfg->RtspPort = WFD_RTSP_DEFAULT_PORT;\n}\n#endif /* WFD_SUPPORT */\n"
  },
  {
    "path": "src/common/wsc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twsc.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tPaul Lin\t06-08-08\t\tInitial\n\tSnowpin Lee 06-09-12        Do modifications and Add APIs for AP\n\tSnowpin Lee 07-04-19        Do modifications and Add APIs for STA\n\tSnowpin Lee 07-05-17        Do modifications and Add APIs for AP Client\n*/\n\n#include    \"rt_config.h\"\n\n#ifdef WSC_INCLUDED\n#include    \"wsc_tlv.h\"\n/*#ifdef LINUX */\n/*#include <net/iw_handler.h> */\n/*#endif*/\n\n#define WSC_UPNP_MSG_TIMEOUT\t\t\t(150 * OS_HZ)\n#define RTMP_WSC_NLMSG_SIGNATURE_LEN\t8\n#define MAX_WEPKEYNAME_LEN \t\t\t\t20\n#define MAX_WEPKEYTYPE_LEN\t\t\t\t20\n\n#ifndef PF_NOFREEZE\n#define PF_NOFREEZE  0\n#endif\n\nchar WSC_MSG_SIGNATURE[]={\"RAWSCMSG\"};\n\nextern UCHAR   WPS_OUI[];\nextern UCHAR\tRALINK_OUI[];\n\n#ifdef IWSC_SUPPORT\nextern UCHAR\tIWSC_OUI[];\n#endif // IWSC_SUPPORT //\n\n#if defined(__ECOS) && defined(BRANCH_ADV)\nextern int CFG_set(int id, void *val);\nextern int CFG_str2id(char * var);\nextern int CFG_commit(int id);\n#else\n#define CFG_set(a, b)   {}\n#define CFG_str2id(a)   {}\n#define CFG_commit(a)   {}\n#endif /*__ECOS && BRANCH_ADV */\n\nUINT8 WPS_DH_G_VALUE[1] = {0x02};\nUINT8 WPS_DH_P_VALUE[192] = \n{\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n    0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n    0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n    0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n    0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n    0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n    0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n    0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n    0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n    0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n    0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n    0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n    0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n    0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n    0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n    0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,\n    0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,\n    0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n    0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,\n    0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,\n    0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n    0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,\n    0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n};\n\n/* General used field */\nUCHAR\tSTA_Wsc_Pri_Dev_Type[8] = {0x00, 0x01, 0x00, 0x50, 0xf2, 0x04, 0x00, 0x01};\n\n#ifdef CONFIG_AP_SUPPORT\nUCHAR\tAP_Wsc_Pri_Dev_Type[8] = {0x00, 0x06, 0x00, 0x50, 0xf2, 0x04, 0x00, 0x01};\n\nVOID    WscDelWPARetryTimer(\n    IN  PRTMP_ADAPTER pAd);\n\n#ifdef APCLI_SUPPORT\n\nVOID \tWscApCliLinkDown(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl);\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\nBOOLEAN WscCheckNonce(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  BOOLEAN         bFlag,\n\tIN  PWSC_CTRL       pWscControl);\n\nVOID    WscEapActionDisabled(\n    IN  PRTMP_ADAPTER       pAdapter,\n    IN  PWSC_CTRL           pWscControl);\n\nVOID    WscGetConfigErrFromNack(\n    IN  PRTMP_ADAPTER       pAdapter,\n    IN\tMLME_QUEUE_ELEM\t    *pElem,\n    OUT USHORT\t\t\t\t*pConfigError);\n\nINT\t    WscSetAuthMode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  UCHAR\t\t\tCurOpMode,\n\tIN  UCHAR\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ);\n\nINT\t    WscSetEncrypType(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  UCHAR\t\t\tCurOpMode,\n\tIN  UCHAR\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ);\n\nVOID WscSendNACK(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl);\n\nstatic INT wsc_write_dat_file_thread(IN ULONG data);\n\n#ifdef CONFIG_STA_SUPPORT\nVOID WscLinkDown(\n\tIN\tPRTMP_ADAPTER\tpAd);\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID\tWscDelListEntryByMAC(\n\tPLIST_HEADER\t\tpWscEnList,\n\tIN  PUCHAR\t\t\tpMacAddr);\n\nNDIS_802_11_AUTHENTICATION_MODE   WscGetAuthMode(\n    IN  USHORT authFlag);\n\nNDIS_802_11_WEP_STATUS   WscGetWepStatus(\n    IN  USHORT encryFlag);\n\n/*\n\tStandard UUID generation procedure. The UUID format generated by this function is base on UUID std. version 1.\n\tIt's a 16 bytes, one-time global unique number. and can show in string format like this:\n\t\t\t550e8400-e29b-41d4-a716-446655440000 \n\t\t\t\n\tThe format of uuid is:\n\t\tuuid                        = <time_low> \"-\"\n\t\t                              <time_mid> \"-\"\n\t\t                              <time_high_and_version> \"-\"\n\t\t                              <clock_seq_high_and_reserved>\n\t    \t                          <clock_seq_low> \"-\"\n\t\t                              <node>\n\t\ttime_low                    = 4*<hex_octet>\n\t\ttime_mid                    = 2*<hex_octet>\n\t\ttime_high_and_version       = 2*<hex_octet>\n\t\tclock_seq_high_and_reserved = <hex_octet>\n\t\tclock_seq_low               = <hex_octet>\n\t\tnode                        = 6*<hex_octet>\n\t\thex_octet                   = <hex_digit> <hex_digit>\n\t\thex_digit                   = \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\"\n\t\t                              |\"a\"|\"b\"|\"c\"|\"d\"|\"e\"|\"f\"\n\t\t                              |\"A\"|\"B\"|\"C\"|\"D\"|\"E\"|\"F\"\n\tNote:\n\t\tActually, to IOT with JumpStart, we fix the first 10 bytes of UUID string!!!!\n*/\nINT WscGenerateUUID(\n\tRTMP_ADAPTER\t*pAd, \n\tUCHAR \t\t\t*uuidHexStr, \n\tUCHAR \t\t\t*uuidAscStr, \n\tint \t\t\tapIdx,\n\tBOOLEAN\t\t\tbUseCurrentTime)\n{\n\t\n\tWSC_UUID_T uuid_t;\n\tunsigned long long uuid_time;\n\tint i;\n\tUINT16 clkSeq;\n\tchar uuidTmpStr[UUID_LEN_STR+2];\t\n\t\n\t\n\t/* Get the current time. */\n\tif (bUseCurrentTime)\n\t{\n\t\tNdisGetSystemUpTime((ULONG *)&uuid_time);\n\t}\n\telse\n\t\tuuid_time = 2860; /*xtime.tv_sec; \t// Well, we fix this to make JumpStart  happy! */\n\tuuid_time *= 10000000;\n\tuuid_time += 0x01b21dd213814000LL;\n\t\n\n\t\n\tuuid_t.timeLow = (UINT32)uuid_time & 0xFFFFFFFF;\n\tuuid_t.timeMid = (UINT16)((uuid_time >>32) & 0xFFFF);\n\tuuid_t.timeHi_Version = (UINT16)((uuid_time >> 48) & 0x0FFF);\n\tuuid_t.timeHi_Version |= (1 << 12);\n\n\t/* Get the clock sequence. */\n\tclkSeq = (UINT16)(0x0601/*jiffies*/ & 0xFFFF);\t\t/* Again, we fix this to make JumpStart happy! */\n\n\tuuid_t.clockSeqLow = clkSeq & 0xFF;\n\tuuid_t.clockSeqHi_Var = (clkSeq & 0x3F00) >> 8;\n\tuuid_t.clockSeqHi_Var |= 0x80;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\t/* copy the Mac address as the value of node */\n\t\tNdisMoveMemory(&uuid_t.node[0], &pAd->ApCfg.MBSSID[apIdx].Bssid[0], sizeof(uuid_t.node));\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\t/* copy the Mac address as the value of node */\n\t\tif (apIdx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\tNdisMoveMemory(&uuid_t.node[0], &pAd->ApCfg.MBSSID[MAIN_MBSSID].Bssid[0], sizeof(uuid_t.node));\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\tNdisMoveMemory(&uuid_t.node[0], &pAd->CurrentAddress[0], sizeof(uuid_t.node));\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Create the UUID ASCII string. */\n\tmemset(uuidTmpStr, 0, sizeof(uuidTmpStr));\n\tsnprintf(uuidTmpStr, sizeof(uuidTmpStr), \"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\", \n\t\t\t(unsigned int)uuid_t.timeLow, uuid_t.timeMid, uuid_t.timeHi_Version, uuid_t.clockSeqHi_Var, uuid_t.clockSeqLow, \n\t\t\tuuid_t.node[0], uuid_t.node[1], uuid_t.node[2], uuid_t.node[3], uuid_t.node[4], uuid_t.node[5]);\n\tif (strlen(uuidTmpStr) > UUID_LEN_STR)\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR:UUID String size too large!\\n\"));\n\tstrncpy((PSTRING)uuidAscStr, uuidTmpStr, UUID_LEN_STR);\n\n\t/* Create the UUID Hex format number */\n\tuuid_t.timeLow = cpu2be32(uuid_t.timeLow);\n\tNdisMoveMemory(&uuidHexStr[0], &uuid_t.timeLow, 4);\n\tuuid_t.timeMid = cpu2be16(uuid_t.timeMid);\n\tNdisMoveMemory(&uuidHexStr[4], &uuid_t.timeMid, 2);\n\tuuid_t.timeHi_Version = cpu2be16(uuid_t.timeHi_Version);\n\tNdisMoveMemory(&uuidHexStr[6], &uuid_t.timeHi_Version, 2);\n\tNdisMoveMemory(&uuidHexStr[8], &uuid_t.clockSeqHi_Var, 1);\n\tNdisMoveMemory(&uuidHexStr[9], &uuid_t.clockSeqLow, 1);\n\tNdisMoveMemory(&uuidHexStr[10], &uuid_t.node[0], 6);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"The UUID Hex string is:\"));\n\tfor (i=0; i< 16; i++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x\", (uuidHexStr[i] & 0xff)));\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"The UUID ASCII string is:%s!\\n\", uuidAscStr));\n\treturn 0;\n}\n\nVOID\tWscInitCommonTimers(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN  PWSC_CTRL\t\tpWscControl)\n{\n\tWSC_TIMER_INIT(pAdapter, pWscControl, &pWscControl->EapolTimer, pWscControl->EapolTimerRunning, WscEAPOLTimeOutAction);\n\tWSC_TIMER_INIT(pAdapter, pWscControl, &pWscControl->Wsc2MinsTimer, pWscControl->Wsc2MinsTimerRunning, Wsc2MinsTimeOutAction);\n\tWSC_TIMER_INIT(pAdapter, pWscControl, &pWscControl->WscUPnPNodeInfo.UPnPMsgTimer, pWscControl->WscUPnPNodeInfo.bUPnPMsgTimerRunning, WscUPnPMsgTimeOutAction);\n\tpWscControl->WscUPnPNodeInfo.bUPnPMsgTimerPending = FALSE;\n\tWSC_TIMER_INIT(pAdapter, pWscControl, &pWscControl->M2DTimer, pWscControl->bM2DTimerRunning, WscM2DTimeOutAction);\n\n#ifdef WSC_LED_SUPPORT\n\tWSC_TIMER_INIT(pAdapter, pWscControl, &pWscControl->WscLEDTimer, pWscControl->WscLEDTimerRunning, WscLEDTimer);\n\tWSC_TIMER_INIT(pAdapter, pWscControl, &pWscControl->WscSkipTurnOffLEDTimer, pWscControl->WscSkipTurnOffLEDTimerRunning, WscSkipTurnOffLEDTimer);\n#endif /* WSC_LED_SUPPORT */\n}\n\nVOID\tWscInitClientTimers(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN  PWSC_CTRL\t\tpWScControl)\n{\n\tWSC_TIMER_INIT(pAdapter, pWScControl, &pWScControl->WscPBCTimer, pWScControl->WscPBCTimerRunning, WscPBCTimeOutAction);\n\tWSC_TIMER_INIT(pAdapter, pWScControl, &pWScControl->WscScanTimer, pWScControl->WscScanTimerRunning, WscScanTimeOutAction);\n\tWSC_TIMER_INIT(pAdapter, pWScControl, &pWScControl->WscProfileRetryTimer, pWScControl->WscProfileRetryTimerRunning, WscProfileRetryTimeout);  /* add by johnli, fix WPS test plan 5.1.1 */\n}\n\n/*  \n\t==========================================================================\n\tDescription: \n\t\twps state machine init, including state transition and timer init\n\tParameters: \n\t\tS - pointer to the association state machine\n\t==========================================================================\n */\nVOID    WscStateMachineInit(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tSTATE_MACHINE\t\t*S, \n\tOUT\tSTATE_MACHINE_FUNC\tTrans[])\t\n{\n\tPWSC_CTRL\tpWScControl;\n\tStateMachineInit(S,\t(STATE_MACHINE_FUNC*)Trans, MAX_WSC_STATE, MAX_WSC_MSG, (STATE_MACHINE_FUNC)Drop, WSC_IDLE, WSC_MACHINE_BASE);\n\tStateMachineSetAction(S, WSC_IDLE, WSC_EAPOL_START_MSG, (STATE_MACHINE_FUNC)WscEAPOLStartAction);\n\tStateMachineSetAction(S, WSC_IDLE, WSC_EAPOL_PACKET_MSG, (STATE_MACHINE_FUNC)WscEAPAction);\n\tStateMachineSetAction(S, WSC_IDLE, WSC_EAPOL_UPNP_MSG, (STATE_MACHINE_FUNC)WscEAPAction);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tUCHAR         apidx;\n\n\t\tfor (apidx = 0; apidx < MAX_MBSSID_NUM(pAd); apidx++)\n\t\t{\n\t\t\tpWScControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tpWScControl->EntryIfIdx= (MIN_NET_DEVICE_FOR_MBSSID | apidx);\n\t\t\tWscInitCommonTimers(pAd, pWScControl);\n\t\t\tpWScControl->WscUpdatePortCfgTimerRunning = FALSE;\n\t\t\tWSC_TIMER_INIT(pAd, pWScControl, &pWScControl->WscUpdatePortCfgTimer, pWScControl->WscUpdatePortCfgTimerRunning, WscUpdatePortCfgTimeout);\n#ifdef WSC_V2_SUPPORT\t\n\t\t\tWSC_TIMER_INIT(pAd, pWScControl, &pWScControl->WscSetupLockTimer, pWScControl->WscSetupLockTimerRunning, WscSetupLockTimeout);\n#endif /* WSC_V2_SUPPORT */\n\t\t}\n\n#ifdef APCLI_SUPPORT\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t{\n\t\t\tpWScControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\t\tpWScControl->EntryIfIdx= (MIN_NET_DEVICE_FOR_APCLI | apidx);\n\t\t\tWscInitCommonTimers(pAd, pWScControl);\n\t\t\tWscInitClientTimers(pAd, pWScControl);\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tpWScControl = &pAd->StaCfg.WscControl;\n\t\tpWScControl->EntryIfIdx = BSS0;\n\n\t\tWscInitCommonTimers(pAd, pWScControl);\n\t\tWscInitClientTimers(pAd, pWScControl);\n\t\t\n#ifdef P2P_SUPPORT\n\t\tpWScControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl;\n\t\tpWScControl->EntryIfIdx = MIN_NET_DEVICE_FOR_P2P_GO;\n\t\tWscInitCommonTimers(pAd, pWScControl);\n\t\tpWScControl->WscUpdatePortCfgTimerRunning = FALSE;\n\t\tWSC_TIMER_INIT(pAd, pWScControl, &pWScControl->WscUpdatePortCfgTimer, pWScControl->WscUpdatePortCfgTimerRunning, WscUpdatePortCfgTimeout);\n\n\t\tpWScControl = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].WscControl;\n\t\tpWScControl->EntryIfIdx = MIN_NET_DEVICE_FOR_P2P_CLI;\n\t\tWscInitCommonTimers(pAd, pWScControl);\n\t\tWscInitClientTimers(pAd, pWScControl);\n#endif /* P2P_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n}\n\nvoid WscM2DTimeOutAction(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n\t/* For each state, we didn't care about the retry issue, we just send control message\n\t\tto notify the UPnP deamon that some error happened in STATE MACHINE.\n\t*/\n\tPWSC_CTRL pWscControl = (PWSC_CTRL)FunctionContext;\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pWscControl->pAd;\n\tWSC_UPNP_NODE_INFO\t*pWscNodeInfo;\n#ifdef CONFIG_AP_SUPPORT\n\tMAC_TABLE_ENTRY\t\t*pEntry = NULL;\n/*\tUCHAR\t\t        apidx = MAIN_MBSSID; */\n#endif /* CONFIG_AP_SUPPORT */    \n\tBOOLEAN             Cancelled;\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t\tpEntry = MacTableLookup(pAd, pWscControl->EntryAddr);\n#endif /* CONFIG_AP_SUPPORT */\n\tpWscNodeInfo = &pWscControl->WscUPnPNodeInfo;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"UPnP StateMachine TimeOut(State=%d!)\\n\", pWscControl->WscState));\n\n\tif(\n#ifdef CONFIG_AP_SUPPORT\n\t\t(((pEntry == NULL) || (pWscNodeInfo->registrarID != 0)) &&  (CurOpMode == AP_MODE)) ||\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t((pWscNodeInfo->registrarID != 0) &&  (CurOpMode == STA_MODE)) ||\n#endif /* CONFIG_STA_SUPPORT */\n\t\t(0))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():pEntry maybe gone or already received M2 Packet!\\n\", __FUNCTION__));\n\t\tgoto done;\n\t}\n\t\n\tif (pWscControl->M2DACKBalance != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): waiting for M2DACK balance, extend the time!\\n\", __FUNCTION__));\n\t\t/* Waiting for M2DACK balance. */\n\t\tRTMPModTimer(&pWscControl->M2DTimer, WSC_EAP_ID_TIME_OUT);\n\t\tpWscControl->M2DACKBalance = 0;\n\t\tgoto done;\n\t}\n\telse\n\t{\t\n\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t\tpWscControl->EapolTimerRunning = FALSE;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): send EAP-Fail to wireless Station!\\n\", __FUNCTION__));\n\t\t\t/* Send EAPFail to Wireless Station and reset the status of Wsc. */\n\t\t\tWscSendEapFail(pAd, pWscControl, TRUE);\n\t\t\t/*pEntry->bWscCapable = FALSE; */\n\t\t\tif (pEntry != NULL)\n\t\t\t\tpEntry->Receive_EapolStart_EapRspId = 0;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\tpWscControl->EapMsgRunning = FALSE;\n\t\tpWscControl->WscState = WSC_STATE_OFF;\n    }\n\t\ndone:\n\tpWscControl->bM2DTimerRunning = FALSE;\n\tpWscControl->M2DACKBalance = 0;\n\tpWscNodeInfo->registrarID = 0;\n\t\t\n\t\n}\n\n\nVOID WscUPnPMsgTimeOutAction(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n\tPWSC_CTRL pWscControl = (PWSC_CTRL)FunctionContext;\n\tPRTMP_ADAPTER pAd;\n\tWSC_UPNP_NODE_INFO\t*pWscNodeInfo;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscUPnPMsgTimeOutAction\\n\"));\n\n\t/*It shouldn't happened! */\n\tif (!pWscControl)\n\t\treturn;\n\t\n\tpAd = (PRTMP_ADAPTER)pWscControl->pAd;\n\tpWscNodeInfo = &pWscControl->WscUPnPNodeInfo;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"UPnP StateMachine TimeOut(State=%d!)\\n\", pWscControl->WscState));\n\n    if (pWscNodeInfo->bUPnPMsgTimerPending)\n    {\n#define WSC_UPNP_TIMER_PENDIND_WAIT\t2000\n\n        RTMPModTimer(&pWscNodeInfo->UPnPMsgTimer, WSC_UPNP_TIMER_PENDIND_WAIT);\n        DBGPRINT(RT_DEBUG_TRACE, (\"UPnPMsgTimer Pending......\\n\"));\n\t} \n\telse\n\t{\n\t\tint dataLen;\n\t\tUCHAR *pWscData;\n\n\t\tos_alloc_mem(NULL, (UCHAR **)&pWscData, WSC_MAX_DATA_LEN);\n/*\t\tif( (pWscData = kmalloc(WSC_MAX_DATA_LEN, GFP_ATOMIC)) != NULL) */\n\t\tif (pWscData != NULL)\n\t\t{\n\t\t\tmemset(pWscData, 0, WSC_MAX_DATA_LEN);\n\t\t\tdataLen = BuildMessageNACK(pAd, pWscControl, pWscData);\n\t\t\tWscSendUPnPMessage(pAd, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_NORMAL, \n\t\t\t\t\t\t\t\t\tpWscData, dataLen, 0, 0, &pAd->CurrentAddress[0], AP_MODE);\n/*\t\t\tkfree(pWscData); */\n\t\t\tos_free_mem(NULL, pWscData);\n\t\t}\n\t\n\t\tpWscNodeInfo->bUPnPInProgress = FALSE;\n\t\tpWscNodeInfo->bUPnPMsgTimerPending = FALSE;\n\t\tpWscNodeInfo->bUPnPMsgTimerRunning = FALSE;\n\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\tpWscControl->WscStatus = STATUS_WSC_FAIL;\n\t\t\n\t\tRTMPSendWirelessEvent(pAd, IW_WSC_STATUS_FAIL, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n    }\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscUPnPMsgTimeOutAction\\n\"));\n\t\t\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis function processes EapolStart packets from wps stations\n\t\tor enqueued by self.\n\n\tReturn:\n\t\tNone\n\t==========================================================================\n*/\nVOID WscEAPOLStartAction(\n    IN PRTMP_ADAPTER    pAd, \n    IN MLME_QUEUE_ELEM  *Elem) \n{\n    MAC_TABLE_ENTRY     *pEntry;\n\tPWSC_CTRL\t\t\tpWpsCtrl = NULL;\n\tPHEADER_802_11      pHeader;\n\tPWSC_PEER_ENTRY\t\tpWscPeer = NULL;\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"-----> WscEAPOLStartAction\\n\"));\n\t\n\tpHeader = (PHEADER_802_11)Elem->Msg;\n\tpEntry = MacTableLookup(pAd, pHeader->Addr2);\n\n\t/* Cannot find this wps station in MacTable of WPS AP. */\n    if (pEntry == NULL)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"pEntry is NULL.\\n\"));\n        DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPOLStartAction\\n\"));\n        return;\n    }\n    \n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (Elem->OpMode != OPMODE_STA)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t\tpWpsCtrl = &pAd->ApCfg.MBSSID[pEntry->apidx].WscControl;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n#ifdef IWSC_SUPPORT\n\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t(IWSC_PeerEapolStart(pAd, pEntry) == FALSE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rejected by IWSC SM. Ignore EAPOL-Start.\\n\"));\n\t\t\treturn;\n\t\t}\n#endif // IWSC_SUPPORT //\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pWpsCtrl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pWpsCtrl == NULL!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tRTMP_SEM_LOCK(&pWpsCtrl->WscPeerListSemLock);\n\tWscInsertPeerEntryByMAC(&pWpsCtrl->WscPeerList, pEntry->Addr);\t\n\tRTMP_SEM_UNLOCK(&pWpsCtrl->WscPeerListSemLock);\n\t\n\tWscMaintainPeerList(pAd, pWpsCtrl);\n\n\t/*\n\t\tCheck this STA is first one or not\n\t*/\n\tif (pWpsCtrl->WscPeerList.size != 0)\n\t{\n\t\tpWscPeer = (PWSC_PEER_ENTRY)pWpsCtrl->WscPeerList.pHead;\n\t\tif (NdisEqualMemory(pEntry->Addr, pWscPeer->mac_addr, MAC_ADDR_LEN) == FALSE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"This is not first WSC peer, ignore this EAPOL_Start!\\n\"));\n\t\t\thex_dump(\"pEntry->Addr\", pEntry->Addr, MAC_ADDR_LEN);\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\tWscApShowPeerList(pAd, NULL);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\tWscStaShowPeerList(pAd, NULL);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPOLStartAction\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\t\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd) && (pWpsCtrl->bWscTrigger == FALSE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Ignore this EAPOL_Start!\\n\"));\n\t\treturn;\n\t}\n#endif /* P2P_SUPPORT */\n\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscState = %d\\n\", pWpsCtrl->WscState));\n    if ((pEntry->Receive_EapolStart_EapRspId == 0) ||\n\t\t(pWpsCtrl->WscState <= WSC_STATE_WAIT_REQ_ID))\n    {\n    \t/* Receive the first EapolStart packet of this wps station. */\n        pEntry->Receive_EapolStart_EapRspId |= WSC_ENTRY_GET_EAPOL_START;\n\t\t\n        DBGPRINT(RT_DEBUG_TRACE, (\"WscEAPOLStartAction - receive EAPOL-Start from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n                                 pEntry->Addr[0],\n                                 pEntry->Addr[1],\n                                 pEntry->Addr[2],\n                                 pEntry->Addr[3],\n                                 pEntry->Addr[4],\n                                 pEntry->Addr[5]));\n\t\t\t\n\t\t/* EapolStart packet is sent by station means this station wants to do wps process with AP. */\n\t\tpWpsCtrl->EapMsgRunning = TRUE;\n\t\t/* Update EntryAddr again */\n\t\tNdisMoveMemory(pWpsCtrl->EntryAddr, pEntry->Addr, MAC_ADDR_LEN);\n\n\t\tif (pEntry->bWscCapable == FALSE)\n\t\t\tpEntry->bWscCapable = TRUE;\n        DBGPRINT(RT_DEBUG_TRACE, (\"WscEAPOLStartAction(ra%d) - send EAP-Req(Id) to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n                                 pEntry->apidx,\n                                 pEntry->Addr[0],\n                                 pEntry->Addr[1],\n                                 pEntry->Addr[2],\n                                 pEntry->Addr[3],\n                                 pEntry->Addr[4],\n                                 pEntry->Addr[5]));\n\t\t\n\t\t/* Send EAP-Request/Id to station */\n        WscSendEapReqId(pAd, pEntry, CurOpMode);\n        if (!pWpsCtrl->EapolTimerRunning)\n        {\n            pWpsCtrl->EapolTimerRunning = TRUE;\n\t\t\t/* Set WPS_EAP Messages timeout function. */\n            RTMPSetTimer(&pWpsCtrl->EapolTimer, WSC_EAP_ID_TIME_OUT);\n        }\n    } \n    else\n        DBGPRINT(RT_DEBUG_TRACE, (\"Ignore EAPOL-Start.\\n\"));\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPOLStartAction\\n\"));\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis is state machine function when receiving EAP packets \n\t\twhich is WPS Registration Protocol.\n\n\t\tThere are two roles at our AP, as an \n\t\t1. Enrollee\t\t\n\t\t2. Internal Registrar\n\t\t3. Proxy\n\n\t\tThere are two roles at our Station, as an \n\t\t1. Enrollee\t\t\n\t\t2. External Registrar\n\n\t\tRunning Scenarios:\n\t\t-----------------------------------------------------------------\n\t\t1a. Adding an AP as an Enrollee to a station as an External Registrar (EAP)\n\t\t\t[External Registrar]<----EAP--->[Enrollee_AP]\n\t\t-----------------------------------------------------------------\n\t\t2a. Adding a station as an Enrollee to an AP with built-in Registrar (EAP)\t\n\t\t\t[Registrar_AP]<----EAP--->[Enrollee_STA]\n\t\t-----------------------------------------------------------------\n\t\t3a. Adding an Enrollee with External Registrar (UPnP/EAP)\t\n\t\t\t[External Registrar]<----UPnP--->[Proxy_AP]<---EAP--->[Enrollee_STA]  \n\t\t-----------------------------------------------------------------\n\n\tReturn:\n\t\tNone\n\t==========================================================================\n*/\nVOID WscEAPAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem) \n{\t\t\n\tUCHAR\t\tMsgType;\n\tBOOLEAN\t\tbUPnPMsg, Cancelled;\n\tMAC_TABLE_ENTRY\t*pEntry = NULL;\n\tUCHAR\t\tMacAddr[MAC_ADDR_LEN] = {0};\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\tapidx = MAIN_MBSSID;\n#endif /* CONFIG_AP_SUPPORT */\n\tPWSC_CTRL\t\t\t\tpWscControl = NULL;\n\tPWSC_UPNP_NODE_INFO\tpWscUPnPNodeInfo = NULL;\n\tUCHAR\t\tCurOpMode = 0xFF;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscEAPAction\\n\"));\n\n\t/* The first 6 bytes in Elem->Msg is the MAC address of wps peer. */\n\tmemmove(MacAddr, Elem->Msg, MAC_ADDR_LEN);\n\tmemmove(Elem->Msg, Elem->Msg+6, Elem->MsgLen);\n\n#ifdef DBG\n    hex_dump(\"(WscEAPAction)Elem->MsgLen\", Elem->Msg, Elem->MsgLen);\n#endif /* DBG */\n\n\tMsgType = WscRxMsgType(pAdapter, Elem);\n\tbUPnPMsg = Elem->MsgType == WSC_EAPOL_UPNP_MSG ? TRUE : FALSE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: Addr: %02x:%02x:%02x:%02x:%02x:%02x, MsgType: 0x%02X, bUPnPMsg: %s\\n\",\n\t\t\t\tPRINT_MAC(MacAddr), MsgType, bUPnPMsg ? \"TRUE\" : \"FALSE\"));\n\n\tif (!bUPnPMsg)\n\t\tpEntry = MacTableLookup(pAdapter, MacAddr);\n\t\t\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (Elem->OpMode != OPMODE_STA)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (!bUPnPMsg)\n\t\t{\n\t\t\tif (pEntry)\n\t\t\t{\n\t\t\t\tif (IS_ENTRY_CLIENT(pEntry) && pEntry->apidx >= pAdapter->ApCfg.BssidNum)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: Unknow apidex(=%d).\\n\", pEntry->apidx));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPAction\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tapidx = pEntry->apidx;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: apidex=%d.\\n\", pEntry->apidx));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: pEntry is NULL.\\n\"));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPAction\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n#ifdef APCLI_SUPPORT\n\t\t\t/* for ap-client packets */\n\t\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t\tpWscControl = &pAdapter->ApCfg.ApCliTab[apidx].WscControl;\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t\tpWscControl = &pAdapter->ApCfg.MBSSID[apidx].WscControl;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint i;\n\t\t\tfor (i = 0 ; i < MAX_MBSSID_NUM(pAdapter); i++)\n\t\t\t{\n\t\t\t\tif(NdisEqualMemory(pAdapter->ApCfg.MBSSID[i].Bssid, MacAddr, MAC_ADDR_LEN))\n\t\t\t\t{\n\t\t\t\t\tapidx = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl = &pAdapter->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tpWscUPnPNodeInfo = &pAdapter->ApCfg.MBSSID[apidx].WscControl.WscUPnPNodeInfo;\n\t\t\tpWscUPnPNodeInfo->bUPnPMsgTimerPending = TRUE;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tpWscControl = &pAdapter->StaCfg.WscControl;\n\t\tpWscUPnPNodeInfo = &pWscControl->WscUPnPNodeInfo;\n\t\tpWscUPnPNodeInfo->bUPnPMsgTimerPending = TRUE;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pWscControl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pWscControl == NULL!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t{\n\t\tif ((MsgType == WSC_MSG_EAP_REG_RSP_ID) || (MsgType == WSC_MSG_EAP_ENR_RSP_ID))\n\t\t{\n\t\t\tif (((pEntry->Receive_EapolStart_EapRspId & WSC_ENTRY_GET_EAP_RSP_ID) == WSC_ENTRY_GET_EAP_RSP_ID)\n\t\t\t\t&& (pWscControl->WscState > WSC_STATE_WAIT_M1))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: Already receive EAP_RSP(Identitry) from this STA, ignore it.\\n\"));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPAction\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpEntry->Receive_EapolStart_EapRspId |= WSC_ENTRY_GET_EAP_RSP_ID;\n\t\t}\n\t}\n\t\n\tpWscControl->EapolTimerPending = TRUE;\n\t\n#ifdef WSC_V2_SUPPORT\t\n\tif (MsgType == WSC_MSG_EAP_FRAG_ACK)\n\t{\n\t\tWscSendEapFragData(pAdapter, pWscControl, pEntry);\n\t\treturn;\n\t}\n\telse\n#endif /* WSC_V2_SUPPORT */\n\tif (MsgType == WSC_MSG_EAP_REG_RSP_ID)\n\t{\n\t\t/* Receive EAP-Response/Id from external registrar, so the role of AP is enrollee. */\n\t\tif (((pWscControl->WscConfMode & WSC_ENROLLEE) != 0) ||\n\t\t\t(((pWscControl->WscConfMode & WSC_PROXY) != 0) && bUPnPMsg))\n\t\t{\n\t\t\tpWscControl->WscActionMode= WSC_ENROLLEE;\n\t\t\tpWscControl->WscUseUPnP = bUPnPMsg ? 1 : 0;\n\t\t\tMsgType = WSC_MSG_EAP_RSP_ID;\n\t\t\tWscEapEnrolleeAction(pAdapter, Elem, WSC_MSG_EAP_RSP_ID, pEntry, pWscControl);\n\t\t}\n\t}\n\telse if (MsgType == WSC_MSG_EAP_ENR_RSP_ID)\n\t{\n\t\t/* Receive EAP-Response/Id from wps enrollee station, so the role of AP is Registrar or Proxy. */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: Rx Identity\\n\"));\n\t\tpWscControl->WscActionMode = WSC_REGISTRAR;\n\t\tif (bUPnPMsg)\n\t\t{\n\t\t\t/* Receive enrollee identity from UPnP */\n\t\t}\n\t\telse\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t/* Receive enrollee identity from EAP */\n\t\t\tif ((pWscControl->WscMode == WSC_PBC_MODE)\n#ifdef P2P_SUPPORT\n\t\t\t\t/*\n\t\t\t\t\tP2P doesn't need to check PBC overlapping.\n\t\t\t\t*/\n\t\t\t\t&& (pWscControl->EntryIfIdx < MIN_NET_DEVICE_FOR_P2P_GO)\n#endif /* P2P_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tSome WPS PBC Station select AP from UI directly; doesn't do PBC scan.\n\t\t\t\t\tNeed to check DPID from STA again here.\n\t\t\t\t*/\n\t\t\t\tWscPBC_DPID_FromSTA(pAdapter, pWscControl->EntryAddr);\n\t\t\t\tWscPBCSessionOverlapCheck(pAdapter);\n\t\t\t\tif ((pAdapter->CommonCfg.WscStaPbcProbeInfo.WscPBCStaProbeCount == 1) &&\n\t\t\t\t\t!NdisEqualMemory(pAdapter->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN) &&\n\t\t\t\t\t(NdisEqualMemory(pAdapter->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[0], &pWscControl->EntryAddr[0], 6) == FALSE))\n\t\t\t\t{\n\t\t\t\t\tpAdapter->CommonCfg.WscPBCOverlap = TRUE;\n\t\t\t\t}\n\t\t\t\tif (pAdapter->CommonCfg.WscPBCOverlap)\n\t\t\t\t{\n\t\t\t\t\thex_dump(\"EntryAddr\", pWscControl->EntryAddr, 6);\n\t\t\t\t\thex_dump(\"StaMacAddr0\", pAdapter->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[0], 6);\n\t\t\t\t\thex_dump(\"StaMacAddr1\", pAdapter->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[1], 6);\n\t\t\t\t\thex_dump(\"StaMacAddr2\", pAdapter->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[2], 6);\n\t\t\t\t\thex_dump(\"StaMacAddr3\", pAdapter->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[3], 6);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ((pWscControl->WscMode == WSC_PBC_MODE) &&\n\t\t\t\t(pAdapter->CommonCfg.WscPBCOverlap == TRUE))\n\t\t\t{\n\t\t\t\t/* PBC session overlap */\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_PBC_SESSION_OVERLAP;\n\t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_PBC_SESSION_OVERLAP, NULL, (pWscControl->EntryIfIdx & 0x0F), 0); \n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEAPAction: PBC Session Overlap!\\n\"));\n\t\t\t}\n\t\t\telse \n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tif ((pWscControl->WscConfMode & WSC_PROXY_REGISTRAR) != 0)\n\t\t\t{\n\t\t\t\t/* Notify UPnP daemon before send Eap-Req(wsc-start) */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: pEntry->Addr=%02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\t\t\t__FUNCTION__, PRINT_MAC(pEntry->Addr)));\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t{\n\t\t\t\tWscSendUPnPConfReqMsg(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\t(PUCHAR)pAdapter->ApCfg.MBSSID[pEntry->apidx].Ssid, pEntry->Addr, 2, 0, CurOpMode);\n\t\t\t\t/* Reset the UPnP timer and status. */\n\t\t\t\tif (pWscControl->bM2DTimerRunning == TRUE)\n\t\t\t\t{\n\t\t\t\t\tRTMPCancelTimer(&pWscControl->M2DTimer, &Cancelled);\n\t\t\t\t\tpWscControl->bM2DTimerRunning = FALSE;\n\t\t\t\t}\n\t\t\t\tpWscControl->WscUPnPNodeInfo.registrarID = 0;\n\t\t\t\tpWscControl->M2DACKBalance = 0;\n\t\t\t\tWscDelWPARetryTimer(pAdapter);\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tpWscControl->EapMsgRunning = TRUE;\n\t\t\t\t/* Change the state to next one */\n\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M1;\n\t\t\t\t/* send EAP WSC_START */\n\t\t\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t{\n\t\t\t\t\tpWscControl->bWscLastOne = TRUE;\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_START, NULL, 0, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t\t\telse\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tif (ADHOC_ON(pAdapter) && (pWscControl->WscConfMode == WSC_REGISTRAR))\n\t\t\t\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_START, NULL, 0, pWscControl, STA_MODE, EAP_CODE_REQ);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_START, NULL, 0, pWscControl, STA_MODE, EAP_CODE_RSP);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (MsgType == WSC_MSG_EAP_REQ_ID)\n\t{\n\t\t/* Receive EAP_Req/Identity from WPS AP or WCN */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive EAP_Req/Identity from WPS AP or WCN\\n\"));\n\t\tif (bUPnPMsg && (pWscControl->WscConfMode == WSC_ENROLLEE))\n\t\t{\n\t\t\tpWscControl->WscActionMode = WSC_ENROLLEE;\n\t\t\tpWscControl->WscUseUPnP = 1;\n\t\t\tWscEapEnrolleeAction(pAdapter, Elem, WSC_MSG_EAP_REQ_START, pEntry, pWscControl);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Receive EAP_Req/Identity from WPS AP */\n\t\t\tif (pEntry != NULL)\n\t\t\t\tWscSendEapRspId(pAdapter, pEntry, pWscControl); \n\t\t}\n        \n\t\tif (!bUPnPMsg)\n\t\t{\n\t\t\tif ((pWscControl->WscState < WSC_STATE_WAIT_M1) ||\n\t\t\t\t(pWscControl->WscState > WSC_STATE_WAIT_ACK))\n\t\t\t{\n\t\t\t\tif (pWscControl->WscConfMode == WSC_REGISTRAR)\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M1;\n\t\t\t\telse\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_WSC_START;\n\t\t\t}\n\t\t}\n\t}\n\telse if (MsgType == WSC_MSG_EAP_REQ_START)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive EAP_Req(Wsc_Start) from WPS AP\\n\"));\n\n\t\t/* Receive EAP_Req(Wsc_Start) from WPS AP */\n\t\tif (pWscControl->WscConfMode == WSC_ENROLLEE)\n\t\t{\n\t\t\tpWscControl->WscActionMode = WSC_ENROLLEE;\n\t\t\tpWscControl->WscUseUPnP = bUPnPMsg ? 1 : 0;\n\t\t\tWscEapEnrolleeAction(pAdapter, Elem, WSC_MSG_EAP_REQ_START, pEntry, pWscControl);\n\n\t\t\tif (!pWscControl->EapolTimerRunning)\n\t\t\t{\n\t\t\t\tpWscControl->EapolTimerRunning = TRUE;\n\t\t\t\tRTMPSetTimer(&pWscControl->EapolTimer, WSC_EAP_ID_TIME_OUT);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Ignore EAP_Req(Wsc_Start) from WPS AP\\n\"));\n\t}\n\telse if (MsgType == WSC_MSG_EAP_FAIL)\n\t{\n\t\t/* Receive EAP_Fail from WPS AP */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive EAP_Fail from WPS AP\\n\"));\n\n\t\tif (pWscControl->WscState >= WSC_STATE_WAIT_EAPFAIL)\n\t\t{\n\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n#ifdef P2P_SUPPORT\n\t\t\t\tif (pWscControl->WscStatus == STATUS_WSC_CONFIGURED)\n\t\t\t\t\tpAdapter->P2pCfg.WscState = WSC_STATE_CONFIGURED;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tP2pSendWirelessEvent(pAdapter, RT_P2P_WPS_COMPLETED, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n#endif /* P2P_SUPPORT */\n\t\t\t\t/* Bring apcli interface down first */\n\t\t\t\tif(pEntry && IS_ENTRY_APCLI(pEntry) && pAdapter->ApCfg.ApCliTab[BSS0].Enable == TRUE )\n\t\t\t\t{\n#ifdef P2P_SUPPORT\n\t\t\t\t\tUCHAR P2pIdx = P2pGroupTabSearch(pAdapter, pEntry->Addr);\n#endif /* P2P_SUPPORT */\n\t\t\t\t\tpAdapter->ApCfg.ApCliTab[pEntry->apidx].Enable = FALSE;\n\t\t\t\t\tApCliIfDown(pAdapter);\n#ifdef P2P_SUPPORT\n\t\t\t\t\tif ((P2pIdx != P2P_NOT_FOUND) \n\t\t\t\t\t\t&& P2P_CLI_ON(pAdapter)\n\t\t\t\t\t\t&& ((pWscControl->WscStatus == STATUS_WSC_ERROR_DEV_PWD_AUTH_FAIL) || (pWscControl->WscStatus == STATUS_WSC_FAIL)))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAdapter->P2pTable.Client[P2pIdx].P2pClientState = P2PSTATE_DISCOVERY;\n\t\t\t\t\t\tP2pLinkDown(pAdapter, P2P_CONNECT_FAIL);\n\t\t\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\t\t\tpAdapter->ApCfg.ApCliTab[pEntry->apidx].Enable = TRUE;\n\t\t\t\t}\n\t\t\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT            \n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\n#ifdef IWSC_SUPPORT\n\t\t\tif ((pAdapter->OpMode == OPMODE_STA) &&\n\t\t\t\t(pAdapter->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\t(pAdapter->StaCfg.WscControl.WscConfMode == WSC_ENROLLEE))\n\t\t\t\tpAdapter->StaCfg.IWscInfo.bReStart = TRUE;\n#endif /* IWSC_SUPPORT */\n\t\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\t\t\t\tWscLinkDown(pAdapter);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\t\telse if (pWscControl->WscState == WSC_STATE_RX_M2D)\n\t\t{\n\t\t\t/* Wait M2; */\n#ifdef IWSC_SUPPORT\n\t\t\t/*\n\t\t\t\tWe need to send EAPOL_Start again to trigger WPS process\n\t\t\t*/\n\t\t\tif (pAdapter->StaCfg.BssType == BSS_ADHOC)\n\t\t\t{\n\t\t\t\tpWscControl->WscState = WSC_STATE_LINK_UP;\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_LINK_UP;\n\t\t\t\tWscSendEapolStart(pAdapter, pWscControl->WscPeerMAC, STA_MODE);\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t}\n\t\telse if ((pWscControl->WscState <= WSC_STATE_WAIT_REQ_ID) && \n\t\t\t\t (pWscControl->WscState != WSC_STATE_FAIL))\n\t\t{\n\t\t\t/* Ignore. D-Link DIR-628 AP sometimes would send EAP_Fail to station after Link UP first then send EAP_Req/Identity. */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpWscControl->WscStatus = STATUS_WSC_FAIL;\t\n\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_FAIL, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\n#ifdef IWSC_SUPPORT\n\t\t\tif ((pAdapter->OpMode == OPMODE_STA) &&\n\t\t\t\t(pAdapter->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\t(pAdapter->StaCfg.WscControl.WscConfMode == WSC_ENROLLEE))\n\t\t\t\tpAdapter->StaCfg.IWscInfo.bReStart = TRUE;\n#endif /* IWSC_SUPPORT */\n\n\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\t\t\t/* Change the state to next one */\n\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\t\t\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\n\t\t\t\tWscLinkDown(pAdapter);\n\t\t\t\t\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\t}\n\telse if (MsgType == WSC_MSG_M1)\n\t{\n\t\tUINT32 rv = 0;\n\t\t/*\n\t\t\tIf Buffalo WPS STA doesn't receive M2D from AP, Buffalo WPS STA will stop to do WPS.\n\t\t\tTherefore we need to receive M1 and send M2D without trigger.\n\t\t*/\n\t\tif ((pWscControl->WscConfMode & WSC_REGISTRAR) != 0)\n\t\t{\n\t\t\tpWscControl->WscActionMode = WSC_REGISTRAR;\n\t\t\t/* If Message is from EAP, but UPnP Registrar is in progress now, ignore EAP_M1 */\n\t\t\tif (!bUPnPMsg && pWscControl->WscUPnPNodeInfo.bUPnPInProgress)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"UPnP Registrar is working now, ignore EAP M1.\\n\"));\n\t\t\t\tgoto out;\n\t\t\t}\n\t\t\telse\n\t\t\t\tWscEapRegistrarAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t\trv = 1;\n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (((pWscControl->WscConfMode & WSC_PROXY) != 0) && (!bUPnPMsg) && (CurOpMode == AP_MODE))\n\t\t{\n\t\t\tif ((pWscControl->bWscTrigger\n\t\t\t\t )\n\t\t\t\t&& (pWscControl->WscState >= WSC_STATE_WAIT_M3))\n\t\t\t\t;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWscControl->WscActionMode = WSC_PROXY;\n\t\t\t\tWscEapApProxyAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t\t}\n\t\t}\n\t\telse if ((!pWscControl->bWscTrigger) && ((pWscControl->WscConfMode & WSC_PROXY) == 0) && (pAdapter->OpMode == OPMODE_AP))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscTrigger is FALSE, ignore EAP M1.\\n\"));\n\t\t\tgoto out;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\telse\n\t\t{\n\t\t\tif ((rv == 0) && (CurOpMode == STA_MODE))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(Line:%d)Ignore EAP M1.\\n\", __LINE__));\n\t\t\t\tgoto out;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\telse if (MsgType == WSC_MSG_M3 ||\n             MsgType == WSC_MSG_M5 ||\n             MsgType == WSC_MSG_M7 ||\n             MsgType == WSC_MSG_WSC_DONE)\n\t{\n        BOOLEAN bNonceMatch = WscCheckNonce(pAdapter, Elem, TRUE, pWscControl);\n\t\tif (((pWscControl->WscConfMode & WSC_REGISTRAR) != 0) &&\n\t\t\t(pWscControl->bWscTrigger \n\t\t\t ) &&\n              bNonceMatch)\n\t\t{\n\t\t\t/* If Message is from EAP, but UPnP Registrar is in progress now, ignore EAP Messages */\n\t\t\tif (!bUPnPMsg && pWscControl->WscUPnPNodeInfo.bUPnPInProgress)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"UPnP Registrar is working now, ignore EAP Messages.\\n\"));\n\t\t\t\tgoto out;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWscControl->WscActionMode = WSC_REGISTRAR;\n\t\t\t\tWscEapRegistrarAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t\t}\n\t\t}\n#ifdef CONFIG_AP_SUPPORT        \n\t\telse if (((pWscControl->WscConfMode & WSC_PROXY) != 0) && (!bUPnPMsg) && (CurOpMode == AP_MODE))\n\t\t{\n\t\t\tpWscControl->WscActionMode = WSC_PROXY;\n\t\t\tWscEapApProxyAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */        \n\t}\n\telse if (MsgType == WSC_MSG_M2 ||\n\t\t\tMsgType == WSC_MSG_M2D ||\n\t\t\tMsgType == WSC_MSG_M4 ||\n\t\t\tMsgType == WSC_MSG_M6 ||\n\t\t\tMsgType == WSC_MSG_M8)\n\t{\n        BOOLEAN bNonceMatch = WscCheckNonce(pAdapter, Elem, FALSE, pWscControl);\n\t\tBOOLEAN bGoWPS = FALSE;\n\n\t\tif ((CurOpMode == AP_MODE) ||\n\t\t\t((CurOpMode == STA_MODE) && \n\t\t\t (pWscControl->bWscTrigger\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t  )))\n\t\t\tbGoWPS = TRUE;\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\tif ((CurOpMode == AP_MODE) &&\n\t\t\t((pWscControl->WscV2Info.bWpsEnable == FALSE) && (pWscControl->WscV2Info.bEnableWpsV2)))\n\t\t\tbGoWPS = FALSE;\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\n\t\tif (((pWscControl->WscConfMode & WSC_ENROLLEE) != 0) &&              \n\t\t\tbGoWPS &&\n\t\t\tbNonceMatch)\t\t\n\t\t{\n\t\t\tpWscControl->WscActionMode = WSC_ENROLLEE;\n\t\t\tpWscControl->WscUseUPnP = bUPnPMsg ? 1 : 0;\n\t\t\tif (MsgType == WSC_MSG_M2)\n\t\t\t{\n\t\t\t\tBOOLEAN\tbReadOwnPIN = TRUE;\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t/* WPS Enrollee AP only supports PIN without trigger */\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t{\n\t\t\t\t\tif (pWscControl->bWscTrigger == FALSE)\n\t\t\t\t{\n\t\t\t\t\tpWscControl->WscMode = 1;\n\t\t\t\t\tWscGetConfWithoutTrigger(pAdapter, pWscControl, FALSE);\n\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tWscBuildBeaconIE(pAdapter, \n\t\t\t\t\t\t\t\t\t\tpWscControl->WscConfStatus, \n\t\t\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\t\t\tpWscControl->WscMode, \n\t\t\t\t\t\t\t\t\t\tpWscControl->WscConfigMethods, \n\t\t\t\t\t\t\t\t\t\t(pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t\t\t\t\t0, \n\t\t\t\t\t\t\t\t\t\tAP_MODE);\n\t\t\t\t\t\tWscBuildProbeRespIE(pAdapter, \n\t\t\t\t\t\t\t\t\t\tWSC_MSGTYPE_AP_WLAN_MGR, \n\t\t\t\t\t\t\t\t\t\tpWscControl->WscConfStatus, \n\t\t\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\t\t\tpWscControl->WscMode, \n\t\t\t\t\t\t\t\t\t\tpWscControl->WscConfigMethods, \n\t\t\t\t\t\t\t\t\t\tpWscControl->EntryIfIdx, \n\t\t\t\t\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t\t\t\t\t0, \n\t\t\t\t\t\t\t\t\t\tAP_MODE);\n\t\t\t\t\t\tAPUpdateBeaconFrame(pAdapter, pWscControl->EntryIfIdx & 0x0F);\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t\t\t\tif (P2P_CLI_ON(pAdapter) && (pWscControl->EntryIfIdx != BSS0))\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, MacAddr);\n\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t{\n\t\t\t\t\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAdapter->P2pTable.Client[P2pIdx];\n\n\t\t\t\t\t\tif (pP2pEntry && (pAdapter->P2pCfg.ConfigMethod == WSC_CONFMET_KEYPAD))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tI am KeyPad. We cannot use ConfigMethod or DPID to check peer's capability.\n\t\t\t\t\t\t\t\tSome P2P device is display but the value of ConfigMethod will be 0x0188 and  (ex. Samsung GALAXYSII).\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tbReadOwnPIN = FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* P2P_SUPPORT */\n#ifdef IWSC_SUPPORT\n\t\t\t\tif (pAdapter->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\t\tbReadOwnPIN = FALSE;\n#endif /* IWSC_SUPPORT */\n\n\t\t\t\tif (bReadOwnPIN)\n\t\t\t\t{\n\t\t\t\t\tpWscControl->WscPinCodeLen = pWscControl->WscEnrolleePinCodeLen;\n\t\t\t\t\tWscGetRegDataPIN(pAdapter, pWscControl->WscEnrolleePinCode, pWscControl);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%d) WscEnrolleePinCode: %08u\\n\", bReadOwnPIN, pWscControl->WscEnrolleePinCode));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscPinCode: %08u\\n\", pWscControl->WscPinCode));\n\t\t\t}\n\t\t\t/* If Message is from EAP, but UPnP Registrar is in progress now, ignore EAP Messages */\n\t\t\tif (!bUPnPMsg && pWscControl->WscUPnPNodeInfo.bUPnPInProgress)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"UPnP Registrar is working now, ignore EAP Messages.\\n\"));\n\t\t\t\tgoto out;\n\t\t\t}\n\t\t\telse\n\t\t\t\tWscEapEnrolleeAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t}\n#ifdef CONFIG_AP_SUPPORT        \n\t\telse if (((pWscControl->WscConfMode & WSC_PROXY) != 0) && (bUPnPMsg) && (CurOpMode == AP_MODE))\n\t\t{\n\t\t\tpWscControl->WscActionMode = WSC_PROXY;\n\t\t\tWscEapApProxyAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */        \n\t}\n\telse if (MsgType == WSC_MSG_WSC_ACK)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscState: %d\\n\", pWscControl->WscState));\n\t\tif (((pWscControl->WscConfMode & WSC_REGISTRAR) != 0) && \n\t\t\tpWscControl->WscState <= WSC_STATE_SENT_M2D)\n\t\t{\n\t\t\tif (WscCheckNonce(pAdapter, Elem, TRUE, pWscControl))\n\t\t\t{\n\t\t\t\tif (pWscControl->M2DACKBalance > 0)\n\t\t\t\t\tpWscControl->M2DACKBalance--;\n\t\t\t\tpWscControl->WscState = WSC_STATE_INIT;\n\t\t\t\tpWscControl->EapMsgRunning = FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (((pWscControl->WscConfMode & WSC_ENROLLEE) != 0) && \n\t\t\t\tWscCheckNonce(pAdapter, Elem, FALSE, pWscControl))\n\t\t\t{\n\t\t\t\tpWscControl->WscActionMode = WSC_ENROLLEE;\n\t\t\t\tpWscControl->WscUseUPnP = bUPnPMsg ? 1 : 0;\n\t\t\t\tWscEapEnrolleeAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t\t}\n#ifdef CONFIG_AP_SUPPORT            \n\t\t\telse if (((pWscControl->WscConfMode & WSC_PROXY) != 0) && (CurOpMode == AP_MODE))\n\t\t\t{\n\t\t\t\tpWscControl->WscActionMode = WSC_PROXY;\n\t\t\t\tWscEapApProxyAction(pAdapter, Elem, MsgType, pEntry, pWscControl);\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t}\n\t}\n\telse if (MsgType == WSC_MSG_WSC_NACK)\n\t{\n\t\tBOOLEAN bReSetWscIE = FALSE;\n\t\tif (bUPnPMsg && (pWscControl->WscState == WSC_STATE_WAIT_M8) &&\n\t\t\t(pWscControl->WscConfStatus == WSC_SCSTATE_CONFIGURED))\n\t\t{\n\t\t\t// Some external sta will send NACK when AP is configured.\n\t\t\t// bWscTrigger should be set FALSE, otherwise Proxy will send NACK to enrollee.\n\t\t\tpWscControl->bWscTrigger = FALSE;\n\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\tbReSetWscIE = TRUE;\n\t\t}\n\t\tif (!bUPnPMsg &&\n\t\t\t(WscCheckNonce(pAdapter, Elem, FALSE, pWscControl) || WscCheckNonce(pAdapter, Elem, TRUE, pWscControl)))\n\t\t{\n\t\t\tUSHORT config_error = 0;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive NACK from WPS client.\\n\"));\n\t\t\tWscGetConfigErrFromNack(pAdapter, Elem, &config_error);\n\t\t\t/*\n\t\t\tIf a PIN authentication or communication error occurs, \n\t\t\tthe Registrar MUST warn the user and MUST NOT automatically reuse the PIN. \n\t\t\tFurthermore, if the Registrar detects this situation and prompts the user for a new PIN from the Enrollee device, \n\t\t\tit MUST NOT accept the same PIN again without warning the user of a potential attack.\n\t\t\t*/\n\t\t\tif ((pWscControl->WscState >= WSC_STATE_WAIT_M5) && (config_error != WSC_ERROR_SETUP_LOCKED))\n\t\t\t{\n\t\t\t\tpWscControl->WscRejectSamePinFromEnrollee = TRUE;\n\t\t\t\tpWscControl->WscPinCode = 0;\n\n\t\t\t\tif (pWscControl->WscState < WSC_STATE_WAIT_M8)\n\t\t\t\t{\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_FAIL;\n\t\t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_FAIL, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t\tbReSetWscIE = TRUE;\n\t\t\t\t}\n\t\t\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif ((pWscControl->WscState == WSC_STATE_OFF)\n\t\t\t\t&& (CurOpMode == AP_MODE)\n\t\t\t\t&& (pWscControl->RegData.SelfInfo.ConfigError != WSC_ERROR_NO_ERROR))\n\t\t\t{\n\t\t\t\tbReSetWscIE = TRUE;\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\tif ((pWscControl->WscState == WSC_STATE_WAIT_M8) &&\n\t\t\t\t(pWscControl->WscConfStatus == WSC_SCSTATE_CONFIGURED))\n\t\t\t{\n\t\t\t\t/* Some external sta will send NACK when AP is configured. */\n\t\t\t\t/* bWscTrigger should be set FALSE, otherwise Proxy will send NACK to enrollee. */\n\t\t\t\tpWscControl->bWscTrigger = FALSE;\n\t\t\t\tbReSetWscIE = TRUE;\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\t\tpWscControl->WscRejectSamePinFromEnrollee = FALSE;\n\t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_SUCCESS, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n#ifdef P2P_SUPPORT\n\t\t\t\t/*RTMPCancelTimer(&pAdapter->P2pCfg.P2pWscTimer, &Cancelled);*/\n\t\t\t\tif (P2P_GO_ON(pAdapter) && pWscControl->EntryIfIdx != BSS0)\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, MacAddr);\n\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t{\n\t\t\t\t\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAdapter->P2pTable.Client[P2pIdx];\n\t\t\t\t\t\t// Update p2p Entry's state.\n\t\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_CLIENT_WPS_DONE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// default set extended listening to zero for each connection. If this is persistent, will set it.\n\t\t\t\tpAdapter->P2pCfg.ExtListenInterval = 0;\n\t\t\t\tpAdapter->P2pCfg.ExtListenPeriod = 0;\n\t\t\t\tif (IS_PERSISTENT_ON(pAdapter) && (pEntry->bP2pClient == TRUE))\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, pEntry->Addr);\n\n\t\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P GO.\\n\"));\n\t\t\t\t\telse if (IS_P2P_CLI_ENTRY(pEntry))\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P CLIENT.\\n\"));\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P NONE.\\n\"));\n\n\t\t\t\t\tif ((P2pIdx != P2P_NOT_FOUND) && (IS_P2P_GO_ENTRY(pEntry) || IS_P2P_CLI_ENTRY(pEntry)))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pWPSDone- Save to persistent entry. GrpCap= %x \\n\", pAdapter->P2pTable.Client[P2pIdx].GroupCapability));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"3. P2pWPSDone-\tSet Extended timing !!!!!!!\\n\"));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    ======== Profile :: Cnt = %d ========\\n\", pWscControl->WscProfile.ProfileCnt));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    SSID[%d] = %s.\\n\", pWscControl->WscProfile.Profile[0].SSID.SsidLength, pWscControl->WscProfile.Profile[0].SSID.Ssid));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    AuthType = %d.    EncrType = %d.\\n\", pWscControl->WscProfile.Profile[0].AuthType, pWscControl->WscProfile.Profile[0].EncrType));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    MAC = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pWscControl->WscProfile.Profile[0].MacAddr)));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    KeyLen = %d.    KeyIdx = %d.\\n\", pWscControl->WscProfile.Profile[0].KeyLength, pWscControl->WscProfile.Profile[0].KeyIndex));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    Key :: %02x %02x %02x %02x  %02x %02x %02x %02x\\n\", pWscControl->WscProfile.Profile[0].Key[0], pWscControl->WscProfile.Profile[0].Key[1], pWscControl->WscProfile.Profile[0].Key[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpWscControl->WscProfile.Profile[0].Key[3], pWscControl->WscProfile.Profile[0].Key[4], pWscControl->WscProfile.Profile[0].Key[5], pWscControl->WscProfile.Profile[0].Key[6], pWscControl->WscProfile.Profile[0].Key[7]));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"             %02x %02x %02x %02x  %02x %02x %02x %02x\\n\", pWscControl->WscProfile.Profile[0].Key[8], pWscControl->WscProfile.Profile[0].Key[9], pWscControl->WscProfile.Profile[0].Key[10],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpWscControl->WscProfile.Profile[0].Key[11], pWscControl->WscProfile.Profile[0].Key[12], pWscControl->WscProfile.Profile[0].Key[13], pWscControl->WscProfile.Profile[0].Key[14], pWscControl->WscProfile.Profile[0].Key[15]));\n\n\t\t\t\t\t\tP2pPerstTabInsert(pAdapter, pEntry->Addr, &pWscControl->WscProfile.Profile[0]);\n\t\t\t\t\t\t// this is a persistent connection.\n\t\t\t\t\t\tpAdapter->P2pCfg.ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\t\t\t\t\tpAdapter->P2pCfg.ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif //P2P_SUPPORT //\n\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\t\telse if ((CurOpMode == AP_MODE) &&\n\t\t\t\t\t(pWscControl->WscState == WSC_STATE_WAIT_DONE) &&\n\t\t\t\t\t(pWscControl->WscConfStatus == WSC_SCSTATE_CONFIGURED) &&\n\t\t\t\t\t(pAdapter->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled))\n\t\t\t{\n\t\t\t\tbReSetWscIE = TRUE;\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_FAIL;\n\t\t\t}\n\n\t\t\tif ((CurOpMode == AP_MODE) && bReSetWscIE)\n\t\t\t{\n\t\t\t\tWscBuildBeaconIE(pAdapter, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, CurOpMode);\n\t\t\t\tWscBuildProbeRespIE(pAdapter, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, pWscControl->EntryIfIdx, NULL, 0, CurOpMode);\n\t\t\t\tAPUpdateBeaconFrame(pAdapter, pWscControl->EntryIfIdx & 0x0F);\n\t\t\t\tif (pWscControl->Wsc2MinsTimerRunning)\n\t\t\t\t{\n\t\t\t\t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n\t\t\t\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\t\t\t\t}\n\t\t\t\tif (pWscControl->bWscTrigger)\n\t\t\t\t\tpWscControl->bWscTrigger = FALSE;\n\t\t\t}\n#endif // CONFIG_AP_SUPPORT //\n\n\t\t\tif ((CurOpMode == AP_MODE)\n\t\t\t\t|| ((ADHOC_ON(pAdapter)) && (pWscControl->WscConfMode == WSC_REGISTRAR))\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tWscSendEapFail(pAdapter, pWscControl, TRUE);\n\t\t\t\tpWscControl->WscState = WSC_STATE_FAIL;\n\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\t\telse if ((CurOpMode == STA_MODE) && INFRA_ON(pAdapter))\n\t\t\t{\n\t\t\t\tWscEapActionDisabled(pAdapter, pWscControl);\n\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_DISCONN;\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\n\t\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\t\t\t\n\t\t\tpWscControl->EapolTimerRunning = FALSE;\n\t\t\tpWscControl->RegData.ReComputePke = 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Unsupported Msg Type (%02X)\\n\", MsgType));\n\t\tgoto out;\n\t}\n\n\tif (bUPnPMsg)\n\t{\n\t\t/* Messages from UPnP */\n\t\tif (pWscUPnPNodeInfo->bUPnPMsgTimerRunning)\n\t\t\tRTMPModTimer(&pWscUPnPNodeInfo->UPnPMsgTimer, WSC_UPNP_MSG_TIME_OUT);\n\t}\n\telse\n\t{\n\t\tif ((pWscControl->EapMsgRunning == TRUE) && \n\t\t\t(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\t   fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t\t{\n\t\t\t/* Messages from EAP */\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t\tpWscControl->EapolTimerRunning = TRUE;\n\t\t}\n\t}\n\t\n\tif (bUPnPMsg && pWscControl->EapolTimerRunning)\n\t{   \n#ifdef CONFIG_AP_SUPPORT\t\n\t\tif ((pWscControl->WscActionMode == WSC_PROXY) && (CurOpMode == AP_MODE))\n\t\t{\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\telse\n#endif /* CONFIG_AP_SUPPORT */            \n\t\t{\n\t\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t\t\tpWscControl->EapolTimerRunning = FALSE;\n\t\t}\n\t}\n\nout:\n\tif (bUPnPMsg)\n\t\tpWscUPnPNodeInfo->bUPnPMsgTimerPending = FALSE;\n\t\n\tpWscControl->EapolTimerPending = FALSE;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPAction\\n\"));\n}\n\n/*\n\t============================================================================\n\tEnrollee\t\t\tEnrollee\t\t\tEnrollee\t\n\t============================================================================\t\n*/\nVOID WscEapEnrolleeAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  UCHAR\t        MsgType,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl)\n{\n    INT     DataLen = 0, rv = 0, DH_Len = 0;\n\tUCHAR   OpCode, bssIdx;\n    PUCHAR  WscData = NULL;\n    BOOLEAN bUPnPMsg, bUPnPStatus = FALSE, Cancelled;\n\tWSC_UPNP_NODE_INFO *pWscUPnPInfo = &pWscControl->WscUPnPNodeInfo;\n\tUINT\tMaxWscDataLen = WSC_MAX_DATA_LEN;\n\tUCHAR\tCurOpMode = 0xFF;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction Enter!\\n\"));\n\n\tbUPnPMsg = Elem->MsgType == WSC_EAPOL_UPNP_MSG ? TRUE : FALSE;\n\tOpCode = bUPnPMsg ? WSC_OPCODE_UPNP_MASK : 0;\n\tbssIdx = 0;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (Elem->OpMode != OPMODE_STA)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\t/* Early check. */\n\t\tif ((pWscControl->WscActionMode != WSC_ENROLLEE) ||\n\t\t\t(pWscControl->WscUseUPnP && pEntry) ||\n\t\t\t((pWscControl->WscUseUPnP == 0) && (!pEntry)))\n\t\t{\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EarlyCheckFailed: pWscControl->WscActionMode=%d, Configured=%d, WscUseUPnP=%d, pEntry=%p!\\n\", \n\t\t\t\t\t\tpWscControl->WscActionMode, pWscControl->WscConfStatus, pWscControl->WscUseUPnP, pEntry));\n\t\t\tgoto Fail;\n\t\t}\n\t\tbssIdx = (pWscControl->EntryIfIdx & 0x0F);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MsgType=0x%x, WscState=%d, bUPnPMsg=%d!\\n\", MsgType, pWscControl->WscState, bUPnPMsg));\n\n\tif (bUPnPMsg)\n\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\tif ((MsgType == WSC_MSG_EAP_RSP_ID) && (CurOpMode == AP_MODE))\n\t\t{\n\t\t\t/* let it pass */\n\t\t} else\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((MsgType ==WSC_MSG_EAP_REQ_START) &&  (CurOpMode == STA_MODE))\n\t\t{\n\t\t\t/*let it pass */\n\t\t} else \n\t#endif /* CONFIG_STA_SUPPORT */\n\t\tif(MsgType ==WSC_MSG_M2 && pWscUPnPInfo->bUPnPInProgress == FALSE)\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\t\tMAC_TABLE_ENTRY *tempEntry;\n\t\t\t\t\ttempEntry = MacTableLookup(pAdapter, &pWscControl->EntryAddr[0]);\n\t\t\t\t\tif (tempEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((tempEntry->Receive_EapolStart_EapRspId & WSC_ENTRY_GET_EAP_RSP_ID) == WSC_ENTRY_GET_EAP_RSP_ID)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgoto Done;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t/* else cannot find the pEntry, so we need to handle this msg. */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tpWscUPnPInfo->bUPnPInProgress = TRUE;\n\t\t\t/* Set the WscState as \"WSC_STATE_WAIT_RESP_ID\" because UPnP start from this state. */\n\t\t\t/* pWscControl->WscState = WSC_STATE_WAIT_RESP_ID; */\n\t\t\tRTMPSetTimer(&pWscUPnPInfo->UPnPMsgTimer, WSC_UPNP_MSG_TIME_OUT);\n\t\t\tpWscUPnPInfo->bUPnPMsgTimerRunning = TRUE;\n\t\t}\n\t\telse \n\t\t{\n\t\t\t/* For other messages, we must make sure pWscUPnPInfo->bUPnPInProgress== TRUE */\n\t\t\tif (pWscUPnPInfo->bUPnPInProgress == FALSE)\n\t\t\t{\n\t\t\t\tgoto Done;\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef WSC_V2_SUPPORT \n\tMaxWscDataLen = MaxWscDataLen + (UINT)pWscControl->WscV2Info.ExtraTlv.TlvLen;\n#endif /* WSC_V2_SUPPORT */\n\tos_alloc_mem(NULL, (UCHAR **)&WscData, MaxWscDataLen);\n/*\tif( (WscData = kmalloc(WSC_MAX_DATA_LEN, GFP_ATOMIC)) == NULL) */\n\tif (WscData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscData Allocate failed!\\n\"));\n\t\tgoto Fail;\n\t}\n\tNdisZeroMemory(WscData, MaxWscDataLen);\n\n\tswitch (MsgType)\n\t{\n\t\tcase WSC_MSG_EAP_RSP_ID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx Identity\\n\"));\n\t\tcase WSC_MSG_EAP_REQ_START:\n\t\t\tif (MsgType == WSC_MSG_EAP_REQ_START)\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx Wsc_Start\\n\"));\n\t\t\t\n\t\t\tif (pWscControl->RegData.ReComputePke == 1)\n\t\t\t{\n\t\t\t\tINT idx;\n                DH_Len = sizeof(pWscControl->RegData.Pke);\n\t\t\t\t/* Enrollee 192 random bytes for DH key generation */\n\t\t\t\tfor (idx = 0; idx < 192; idx++)\n\t\t\t\t\tpWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAdapter);\n            \tRT_DH_PublicKey_Generate (\n                    WPS_DH_G_VALUE, sizeof(WPS_DH_G_VALUE),\n            \t    WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE),\n            \t    pWscControl->RegData.EnrolleeRandom, sizeof(pWscControl->RegData.EnrolleeRandom),\n            \t    pWscControl->RegData.Pke, (UINT *) &DH_Len);\n\t\t\t\t\n\t\t\t\tpWscControl->RegData.ReComputePke = 0;\n\t\t\t}\n\n\t\t\tOpCode |= WSC_OPCODE_MSG;\n            \n\t\t\tDataLen = BuildMessageM1(pAdapter, pWscControl, WscData);\n\t\t\tif(!bUPnPMsg)\n\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t{\n\t\t\t\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\tWscDelWPARetryTimer(pAdapter);\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tpWscControl->EapMsgRunning = TRUE;\n                pWscControl->WscStatus = STATUS_WSC_EAP_M1_SENT;\n\t\t\t}\n            else\n                /* Sometime out-of-band registrars (ex: Vista) get M1 for collecting information of device. */\n                pWscControl->WscStatus = STATUS_WSC_IDLE;\n            \n\t\t\t/* Change the state to next one */\n\t\t\tif (pWscControl->WscState < WSC_STATE_SENT_M1)\n\t\t        pWscControl->WscState = WSC_STATE_SENT_M1;\n\n\t\t \t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M1, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\tbreak;\n\t\t\t\n\t\tcase WSC_MSG_M2:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx M2\\n\"));\n            \n\t\t\t/* Receive M2, if we are at WSC_STATE_WAIT_M2 start, process it immediately */\n\t\t\tif (pWscControl->WscState == WSC_STATE_SENT_M1 ||\n\t\t\t\tpWscControl->WscState == WSC_STATE_RX_M2D)\n\t\t\t{\n\t\t\t\t\t/* Process M2 */\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M2_RECEIVED;\n\n\t\t\t\t\tNdisMoveMemory(pWscControl->RegData.PeerInfo.MacAddr, pWscControl->EntryAddr, 6);\n\t\t\t\t\tif ((rv = ProcessMessageM2(pAdapter, pWscControl, Elem->Msg, Elem->MsgLen, (pWscControl->EntryIfIdx & 0x0F), &pWscControl->RegData)))\n\t\t\t\t\t{\n\t\t\t\t\t\t\tgoto Fail;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\t\tif ((CurOpMode == AP_MODE) && pWscControl->bSetupLock)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trv = WSC_ERROR_SETUP_LOCKED;\n\t\t\t\t\t\t\tgoto Fail;\n\t\t\t\t\t\t}\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\t\t\t\t\t\t\n\t\t\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n\t\t\t\t\t\tDataLen = BuildMessageM3(pAdapter, pWscControl, WscData);\n\t\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M3_SENT;\n\n\t\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M4;\n\t\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M3, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase WSC_MSG_M2D:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx M2D\\n\"));\n            \n\t\t\t/* Receive M2D, if we are at WSC_STATE_WAIT_M2 start, process it immediately */\n\t\t\tif (pWscControl->WscState == WSC_STATE_SENT_M1 ||\n\t\t\t\tpWscControl->WscState == WSC_STATE_RX_M2D)\n\t\t\t{\n\t\t\t\tif ((rv = ProcessMessageM2D(pAdapter, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t\tgoto Fail;\n\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M2D_RECEIVED;\n\t\t\t\t\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t{\n\t\t\t\t\t/* For VISTA SP1 internal registrar test */\n\t\t\t\t\tOpCode |= WSC_OPCODE_NACK;\n\t\t\t\t\tpWscControl->RegData.SelfInfo.ConfigError = WSC_ERROR_NO_ERROR;\n\t\t\t\t\tDataLen = BuildMessageNACK(pAdapter, pWscControl, WscData);\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_NACK, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* When external registrar is Marvell station, */\n\t\t\t\t\t/* wps station sends NACK may confuse or reset Marvell wps state machine. */\n\t\t\t\t\tOpCode |= WSC_OPCODE_ACK;\n\t\t\t\t\tDataLen = BuildMessageACK(pAdapter, pWscControl, WscData);\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_ACK, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t}\n\n\t\t\t\t/* Change the state to next one */\n\t\t\t\tpWscControl->WscState = WSC_STATE_RX_M2D;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase WSC_MSG_M4: \n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx M4\\n\"));\n\n\t\t\t/* Receive M4, if we are at WSC_STATE_WAIT_M4 start, process it immediately */\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M4)\n\t\t\t{       \n\t\t\t\t/* Process M4 */\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M4_RECEIVED;\n\t\t\t\tif ((rv = ProcessMessageM4(pAdapter, pWscControl, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\tWscCheckPinAttackCount(pAdapter, pWscControl);\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t\tgoto Fail;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n\t\t\t\t\tDataLen = BuildMessageM5(pAdapter, pWscControl, WscData);\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M5_SENT;\n\n\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M6;\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M5, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase WSC_MSG_M6:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx M6\\n\"));\n\n\t\t\t/* Receive M6, if we are at WSC_STATE_WAIT_M6 start, process it immediately */\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M6)\n\t\t\t{      \n\t\t\t\t/* Process M6 */\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M6_RECEIVED;\n\t\t\t\tif ((rv=ProcessMessageM6(pAdapter, pWscControl, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\tWscCheckPinAttackCount(pAdapter, pWscControl);\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t\tgoto Fail;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n\n\t\t\t\t\tDataLen = BuildMessageM7(pAdapter, pWscControl, WscData);\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M7_SENT;\n\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M8;\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M7, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t\t/*\n\t\t\t\t\t\tComplete WPS with this STA. Delete it from WscPeerList for others STA to do WSC with AP\n\t\t\t\t\t*/\n\t\t\t\t\tif (pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock);\n\t\t\t\t\t\tWscDelListEntryByMAC(&pWscControl->WscPeerList, pEntry->Addr);\n\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase WSC_MSG_M8:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx M8\\n\"));\n\n\t\t\t/* Receive M8, if we are at WSC_STATE_WAIT_M6 start, process it immediately */\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M8)\n\t\t\t{\n\t\t\t\t/* Process M8 */\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M8_RECEIVED;\n\t\t\t\tif ((rv=ProcessMessageM8(pAdapter, Elem->Msg, Elem->MsgLen, pWscControl)))\n\t\t\t\t\tgoto Fail;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOpCode |= WSC_OPCODE_DONE;\n\t\t\t\t\tDataLen = BuildMessageDONE(pAdapter, pWscControl, WscData);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Change the state to next one */\n#ifdef APCLI_SUPPORT\n\t\t\t\t\t\t/* Ap Client only supports Inband(EAP)-Enrollee. */\n\t\t\t\t\t\tif (!bUPnPMsg && pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_EAPFAIL;\n\t\t\t\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_ACK;\n\n\t\t\t\t\t\tpWscControl->RegData.ReComputePke = 0;\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_EAPFAIL;\n\t\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_RSP_DONE_SENT;\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_DONE, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\t\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tcase WSC_MSG_WSC_ACK:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Rx ACK\\n\"));\n            \n\t\t\t/* Receive ACK */\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_ACK)\n\t\t\t{\n\t\t\t\t/* Process ACK */\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_RAP_RSP_ACK;\n\t\t\t\t/* Send out EAP-Fail */\n\t\t\t\tWscSendEapFail(pAdapter, pWscControl, FALSE);\n\t\t\t\tpWscControl->WscState = WSC_STATE_CONFIGURED;                \n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n#ifdef P2P_SUPPORT\n\t\t\t\tpAdapter->P2pCfg.WscState = WSC_STATE_CONFIGURED;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tP2pSendWirelessEvent(pAdapter, RT_P2P_WPS_COMPLETED, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n#endif /* P2P_SUPPORT */\n\t\t\t}\n\t\t\tbreak;\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : Unsupported Msg Type\\n\"));\n\t\t\tbreak;\n\t}\n\t\n\tif (bUPnPMsg)\n\t{\n\t\tif ((MsgType == WSC_MSG_M8) && (pWscControl->WscState == WSC_STATE_WAIT_ACK))\n\t\t{\n\t\t\tpWscControl->EapMsgRunning = FALSE;\n\t\t\tpWscControl->WscState = WSC_STATE_CONFIGURED;\n\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n#ifdef P2P_SUPPORT\n\t\t\tpAdapter->P2pCfg.WscState = WSC_STATE_CONFIGURED;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\tP2pSendWirelessEvent(pAdapter, RT_P2P_WPS_COMPLETED, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n#endif /* P2P_SUPPORT */\n\t\t\tif(pWscUPnPInfo->bUPnPMsgTimerRunning == TRUE)\n\t\t\t{\n\t\t\t\tRTMPCancelTimer(&pWscUPnPInfo->UPnPMsgTimer, &Cancelled);\n\t\t\t\tpWscUPnPInfo->bUPnPMsgTimerRunning = FALSE;\n\t\t\t}\n\t\t\tpWscUPnPInfo->bUPnPInProgress = FALSE;\n\t\t\tpWscUPnPInfo->registrarID = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (((MsgType == WSC_MSG_WSC_ACK) && (pWscControl->WscState == WSC_STATE_CONFIGURED)) ||\n\t\t\t((MsgType == WSC_MSG_M8) && (pWscControl->WscState == WSC_STATE_WAIT_ACK)))\n\t\t{\n\t\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t\t\tpWscControl->EapolTimerRunning = FALSE;\n\t\t\tpWscControl->EapMsgRunning = FALSE;\n\t\t\t/*NdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN); */\n\t\t}\n\t}\n\t\n\tif(OpCode > WSC_OPCODE_UPNP_MASK)\n\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), WSC_OPCODE_UPNP_DATA, \n\t\t\t\t\t\t\t\t\t\t\tWSC_UPNP_DATA_SUB_NORMAL, WscData, DataLen, \n\t\t\t\t\t\t\t\t\t\t\tElem->TimeStamp.u.LowPart, Elem->TimeStamp.u.HighPart, \n\t\t\t\t\t\t\t\t\t\t\t&pAdapter->CurrentAddress[0], CurOpMode);\n\telse if(OpCode > 0 && OpCode < WSC_OPCODE_UPNP_MASK)\n\t{   \n\t\tif (pWscControl->WscState != WSC_STATE_CONFIGURED)\n\t\t{\n#ifdef WSC_V2_SUPPORT\n\t\t\tpWscControl->WscTxBufLen = 0;\n\t\t\tpWscControl->pWscCurBufIdx = NULL;\n\t\t\tpWscControl->bWscLastOne = TRUE;\t\t\t\n\t\t\tif (pWscControl->bWscFragment && (DataLen > pWscControl->WscFragSize))\t\t\t\n\t\t\t{\n\t\t\t\tASSERT(DataLen < MGMT_DMA_BUFFER_SIZE);\n\t\t\t\tNdisMoveMemory(pWscControl->pWscTxBuf, WscData, DataLen);\n\t\t\t\tpWscControl->WscTxBufLen = DataLen;\n\t\t\t\tNdisZeroMemory(WscData, DataLen);\n\t\t\t\tpWscControl->bWscLastOne = FALSE;\n\t\t\t\tpWscControl->bWscFirstOne = TRUE;\n\t\t\t\tNdisMoveMemory(WscData, pWscControl->pWscTxBuf, pWscControl->WscFragSize);\n\t\t\t\tDataLen = pWscControl->WscFragSize;\n\t\t\t\tpWscControl->WscTxBufLen -= pWscControl->WscFragSize;\n\t\t\t\tpWscControl->pWscCurBufIdx = (pWscControl->pWscTxBuf + pWscControl->WscFragSize);\n\t\t\t}\n#endif /* WSC_V2_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\tWscSendMessage(pAdapter, OpCode, WscData, DataLen, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\t\t\telse\n\t\t\t\t\tWscSendMessage(pAdapter, OpCode, WscData, DataLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\tWscSendMessage(pAdapter, OpCode, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_RSP);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n\t}\n\telse\n\t\tbUPnPStatus = TRUE;\n\t\nFail:\n    DBGPRINT(RT_DEBUG_TRACE, (\"WscEapEnrolleeAction : rv = %d\\n\", rv));\n    if (rv)\n    {          \n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n    \tif ((CurOpMode == AP_MODE) && pWscControl->bSetupLock)\n\t\t\trv = WSC_ERROR_SETUP_LOCKED;\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n    \tif (rv <= WSC_ERROR_DEV_PWD_AUTH_FAIL)\n\t\t\tpWscControl->RegData.SelfInfo.ConfigError = rv;\n\t\telse if ((rv == WSC_ERROR_HASH_FAIL) || (rv == WSC_ERROR_HMAC_FAIL))\n\t\t\tpWscControl->RegData.SelfInfo.ConfigError = WSC_ERROR_DECRYPT_CRC_FAIL;\n\t\t\t\n        switch(rv)\n        {\n            case WSC_ERROR_DEV_PWD_AUTH_FAIL:\n                pWscControl->WscStatus = STATUS_WSC_ERROR_DEV_PWD_AUTH_FAIL;\n                break;\n            default:\n                pWscControl->WscStatus = STATUS_WSC_FAIL;\n                break;\n        }\n\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_FAIL, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\tif (bUPnPMsg)\n\t\t{\n\t\t\tif (pWscUPnPInfo->bUPnPMsgTimerRunning == TRUE)\n\t\t\t{\n\t\t\t\tRTMPCancelTimer(&pWscUPnPInfo->UPnPMsgTimer, &Cancelled);\n\t\t\t\tpWscUPnPInfo->bUPnPMsgTimerRunning = FALSE;\n\t\t\t}\n\t\t\tpWscUPnPInfo->bUPnPInProgress = FALSE;\n\t\t}\n\t\telse\n\t\t\tWscSendNACK(pAdapter, pEntry, pWscControl);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n#ifdef P2P_SUPPORT\n\t\t\tif (P2P_CLI_ON(pAdapter))\n\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_DISCONN;\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n\t       \tpWscControl->WscState = WSC_STATE_WAIT_DISCONN;\n\t\t\tif (pWscControl->WscSsid.SsidLength)\n\t\t\t{\n\t\t\t\tpAdapter->MlmeAux.AutoReconnectSsidLen = pWscControl->WscSsid.SsidLength;\n\t\t\t\tNdisZeroMemory(&pAdapter->MlmeAux.AutoReconnectSsid[0], MAX_LEN_OF_SSID);\n\t\t\t\tNdisMoveMemory(&pAdapter->MlmeAux.AutoReconnectSsid[0], \n\t\t\t\t\t\t\t   &pWscControl->WscSsid.Ssid[0], \n\t\t\t\t\t\t\t   pWscControl->WscSsid.SsidLength);\n\t\t\t}\n\t\t\telse\n\t\t\t\tpAdapter->MlmeAux.AutoReconnectSsidLen = 0;\n \t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/*NdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN); */\n        /*pWscControl->WscMode = 1; */\n\n        bUPnPStatus = FALSE;\n    }\n\nDone:\n\tif(WscData)\n\t\tos_free_mem(NULL, WscData);\n\tif(bUPnPMsg && (bUPnPStatus == FALSE))\n\t\tWscUPnPErrHandle(pAdapter, pWscControl, Elem->TimeStamp.u.LowPart);\n\t\t\n\trv = 0;\n\n#ifdef CONFIG_AP_SUPPORT\n\tif  (CurOpMode == AP_MODE)\n\t{\n\t\tif (((bUPnPMsg || (pEntry && IS_ENTRY_CLIENT(pEntry))) \n\t\t\t && (pWscControl->WscState == WSC_STATE_CONFIGURED || pWscControl->WscState == WSC_STATE_WAIT_ACK)) \n#ifdef APCLI_SUPPORT        \n\t\t\t||((!bUPnPMsg && pEntry && IS_ENTRY_APCLI(pEntry)) && (pWscControl->WscState == WSC_STATE_WAIT_EAPFAIL || pWscControl->WscState == WSC_STATE_CONFIGURED))\n#endif /* APCLI_SUPPORT */        \n\t\t)\n\t\t{\n\t\t\trv = 1;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif ((pWscControl->WscState == WSC_STATE_WAIT_EAPFAIL) ||\n\t\t\t(pWscControl->WscState == WSC_STATE_CONFIGURED))\n\t\t{\n    \t\trv = 1;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (rv == 1)\n\t{\n#ifdef WSC_LED_SUPPORT\n\t\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\n\t\tpWscControl->bWscTrigger = FALSE;\n        pWscControl->RegData.ReComputePke = 1;\n\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t\tif (pWscControl->Wsc2MinsTimerRunning)\n\t\t{\n\t\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n\t\t}\n#ifdef IWSC_SUPPORT\n\t\tif ((pAdapter->OpMode == OPMODE_STA) && (pAdapter->StaCfg.BssType == BSS_ADHOC))\n\t\t{\n\t\t\tpAdapter->StaCfg.IWscInfo.bReStart = TRUE;\n\t\t\tif (pAdapter->StaCfg.IWscInfo.bIWscT1TimerRunning)\n\t\t\t{\n\t\t\t\tpAdapter->StaCfg.IWscInfo.bIWscT1TimerRunning = FALSE;\n\t\t\t\tRTMPCancelTimer(&pAdapter->StaCfg.IWscInfo.IWscT1Timer, &Cancelled);\n\t\t\t}\n\t\t\tpAdapter->StaCfg.IWscInfo.bIWscDevQueryReqTimerRunning = TRUE;\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\tif ((pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t|| (pWscControl->bWCNTest == TRUE)\n#ifdef WSC_V2_SUPPORT\n\t\t\t|| (pWscControl->WscV2Info.bEnableWpsV2 && ((CurOpMode == AP_MODE) && !pWscControl->bSetupLock))\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\tpWscControl->WscConfStatus = WSC_SCSTATE_CONFIGURED;\n\t\t\tpWscControl->WscMode = 1;\n\t   \t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_SUCCESS, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\n\n#ifdef P2P_SUPPORT\n\t\t\t/*RTMPCancelTimer(&pAdapter->P2pCfg.P2pWscTimer, &Cancelled);*/\n\t\t\tif (P2P_GO_ON(pAdapter) && (pWscControl->EntryIfIdx != BSS0) && pEntry)\n\t\t\t{\n\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, pEntry->Addr);\n\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t{\n\t\t\t\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAdapter->P2pTable.Client[P2pIdx];\n\t\t\t\t\t// Update p2p Entry's state.\n\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_CLIENT_WPS_DONE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// default set extended listening to zero for each connection. If this is persistent, will set it.\n\t\t\tpAdapter->P2pCfg.ExtListenInterval = 0;\n\t\t\tpAdapter->P2pCfg.ExtListenPeriod = 0;\n\t\t\tif (IS_PERSISTENT_ON(pAdapter) && pEntry && (pEntry->bP2pClient == TRUE))\n\t\t\t{\n\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, pEntry->Addr);\n\n\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P GO.\\n\"));\n\t\t\t\telse if (IS_P2P_CLI_ENTRY(pEntry))\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P CLIENT.\\n\"));\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P NONE.\\n\"));\n\n\t\t\t\tif ((P2pIdx != P2P_NOT_FOUND) && (IS_P2P_GO_ENTRY(pEntry) || IS_P2P_CLI_ENTRY(pEntry)))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pWPSDone- Save to persistent entry. GrpCap= %x \\n\", pAdapter->P2pTable.Client[P2pIdx].GroupCapability));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"2. P2pWPSDone-\tSet Extended timing !!!!!!!\\n\"));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    ======== Profile :: Cnt = %d ========\\n\", pWscControl->WscProfile.ProfileCnt));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    SSID[%d] = %s.\\n\", pWscControl->WscProfile.Profile[0].SSID.SsidLength, pWscControl->WscProfile.Profile[0].SSID.Ssid));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    AuthType = %d.\t EncrType = %d.\\n\", pWscControl->WscProfile.Profile[0].AuthType, pWscControl->WscProfile.Profile[0].EncrType));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    MAC = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pWscControl->WscProfile.Profile[0].MacAddr)));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    KeyLen = %d.    KeyIdx = %d.\\n\", pWscControl->WscProfile.Profile[0].KeyLength, pWscControl->WscProfile.Profile[0].KeyIndex));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    Key :: %02x %02x %02x %02x  %02x %02x %02x %02x\\n\", pWscControl->WscProfile.Profile[0].Key[0], pWscControl->WscProfile.Profile[0].Key[1], pWscControl->WscProfile.Profile[0].Key[2],\n\t\t\t\t\t\t\t\t\t\t\t\tpWscControl->WscProfile.Profile[0].Key[3], pWscControl->WscProfile.Profile[0].Key[4], pWscControl->WscProfile.Profile[0].Key[5], pWscControl->WscProfile.Profile[0].Key[6], pWscControl->WscProfile.Profile[0].Key[7]));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" \t\t\t%02x %02x %02x %02x  %02x %02x %02x %02x\\n\", pWscControl->WscProfile.Profile[0].Key[8], pWscControl->WscProfile.Profile[0].Key[9], pWscControl->WscProfile.Profile[0].Key[10],\n\t\t\t\t\t\t\t\t\t\t\t\tpWscControl->WscProfile.Profile[0].Key[11], pWscControl->WscProfile.Profile[0].Key[12], pWscControl->WscProfile.Profile[0].Key[13], pWscControl->WscProfile.Profile[0].Key[14], pWscControl->WscProfile.Profile[0].Key[15]));\n\n\t\t\t\t\tP2pPerstTabInsert(pAdapter, pEntry->Addr, &pWscControl->WscProfile.Profile[0]);\n\t\t\t\t\t// this is a persistent connection.\n\t\t\t\t\tpAdapter->P2pCfg.ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\t\t\t\tpAdapter->P2pCfg.ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t\t\t\t}\n\t\t\t}\n#endif //P2P_SUPPORT //\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\tpWscControl->RegData.SelfInfo.ScState = pWscControl->WscConfStatus;\n#ifdef APCLI_SUPPORT\n\t\t\t\tif (!bUPnPMsg && pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t\t{\n\t\t\t\t\tPOS_COOKIE \tpObj = (POS_COOKIE) pAdapter->OS_Cookie;\n\t\t\t\t\tINT\t\t\told_if_type = pObj->ioctl_if_type;\n\t\t\t\t\tpObj->ioctl_if_type = INT_APCLI;\n\t\t\t\t\tWscWriteConfToApCliCfg(pAdapter, pWscControl, &pWscControl->WscProfile.Profile[0], TRUE);\n\t\t\t\t\tpObj->ioctl_if_type = old_if_type;\n/*#ifdef KTHREAD_SUPPORT */\n/*\t\t\t\t\tWAKE_UP(&(pAdapter->wscTask)); */\n/*#else */\n/*\t\t\t\t\tRTMP_SEM_EVENT_UP(&(pAdapter->wscTask.taskSema)); */\n/*#endif */\n\t\t\t\t\tRtmpOsTaskWakeUp(&(pAdapter->wscTask));\n\t\t\t\t}\n\t\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tRTMPSetTimer(&pWscControl->WscUpdatePortCfgTimer, 1000);\n\t\t\t\t\tpWscControl->WscUpdatePortCfgTimerRunning = TRUE;\n\t\t\t\t}\n\n\t\t\t\tif (bUPnPMsg || (pEntry && IS_ENTRY_CLIENT(pEntry)))\n\t\t\t\t{\n\t\t\t\t\tWscBuildBeaconIE(pAdapter, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, CurOpMode);\n\t\t\t\t\tWscBuildProbeRespIE(pAdapter, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, CurOpMode);\n\t\t\t\t\tAPUpdateBeaconFrame(pAdapter, pWscControl->EntryIfIdx & 0x0F);\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\n\t\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\t\t\t\tif (bUPnPMsg)\n\t\t\t\t{\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\t\t\t\tWscLinkDown(pAdapter);\n\t\t\t\t}\n\t\t\t\tif (pWscControl->WscDriverAutoConnect != 0)\n\t\t\t\t{\n\t\t\t\t\tpAdapter->StaCfg.bAutoConnectByBssid = TRUE;\n\t\t\t\t\tpWscControl->WscProfile.ApplyProfileIdx = 0;  /* add by johnli, fix WPS test plan 5.1.1 */\n\t\t\t\t\t{\n\t\t\t\t\t\tWscWriteConfToPortCfg(pAdapter, pWscControl, &pWscControl->WscProfile.Profile[0], TRUE);\n\t\t\t\t\t\tpAdapter->WriteWscCfgToDatFile = (pWscControl->EntryIfIdx & 0x0F);\n\t/*#ifdef KTHREAD_SUPPORT */\n\t/*\t\t\t\t\tWAKE_UP(&(pAdapter->wscTask)); */\n\t/*#else */\n\t/*\t\t\t\t\tRTMP_SEM_EVENT_UP(&(pAdapter->wscTask.taskSema)); */\n\t/*#endif */\n\t\t\t\t\t\tRtmpOsTaskWakeUp(&(pAdapter->wscTask));\n\t\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\tif ((pAdapter->StaCfg.BssType == BSS_ADHOC)&&\n\t\t\t\t\t(pAdapter->StaCfg.IWscInfo.bIWscDevQueryReqTimerRunning == FALSE))\n\t\t\t\t{\n\t\t\t\t\tpAdapter->StaCfg.IWscInfo.bIWscDevQueryReqTimerRunning = TRUE;\n\t\t\t\t\tRTMPSetTimer(&pAdapter->StaCfg.IWscInfo.IWscDevQueryTimer, 200);\n\t\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t}\n#ifdef WSC_LED_SUPPORT\n\t\t/* The protocol is finished. */\n\t\tWPSLEDStatus = LED_WPS_SUCCESS;\n\t\tRTMPSetLED(pAdapter, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\t}\n}\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n\t============================================================================\n\tProxy\t\t\tProxy\t\t\tProxy\t\t\t\n\t============================================================================\t\n*/\t\nVOID WscEapApProxyAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  UCHAR\t        MsgType,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl)\n{\n\tPUCHAR  WscData = NULL;\n\tBOOLEAN sendToUPnP = FALSE, bUPnPStatus = FALSE, Cancelled;\n\tint reqID = 0;\n    WSC_UPNP_NODE_INFO *pWscUPnPInfo = &pWscControl->WscUPnPNodeInfo;\n\tUINT\tMaxWscDataLen = WSC_MAX_DATA_LEN;\n\t\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction Enter!\\n\"));\n\n\tif (Elem->MsgType == WSC_EAPOL_UPNP_MSG)\n\t{\t\n\t\treqID = Elem->TimeStamp.u.LowPart;\n\t\tif(reqID > 0)\n\t\t\tsendToUPnP = TRUE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction():pEntry=%p, ElemMsgType=%ld, MsgType=%d!\\n\", pEntry, Elem->MsgType, MsgType));\n \n\tif ((pWscControl->WscActionMode != WSC_PROXY) || \n\t   ((Elem->MsgType == WSC_EAPOL_PACKET_MSG) && (pEntry == NULL)))\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EarlyCheckFailed: gWscActionMode=%d, pEntry=%p!\\n\", pWscControl->WscActionMode, pEntry));\n\t\tgoto Fail;\n\t}\n\n#ifdef WSC_V2_SUPPORT \n\tMaxWscDataLen = MaxWscDataLen + (UINT)pWscControl->WscV2Info.ExtraTlv.TlvLen;\n#endif /* WSC_V2_SUPPORT */\n\tos_alloc_mem(NULL, (UCHAR **)&WscData, MaxWscDataLen);\n/*\tif ((WscData = kmalloc(WSC_MAX_DATA_LEN, GFP_ATOMIC)) == NULL) */\n\tif (WscData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscData Allocate failed!\\n\"));\n\t\tgoto Fail;\n\t}\n\tNdisZeroMemory(WscData, MaxWscDataLen);\n\n    /* Base on state doing the Msg, State change diagram */\n    if (Elem->MsgType == WSC_EAPOL_UPNP_MSG)\n    {\t/* WSC message send from UPnP. */\n\t\tswitch (MsgType)\n\t\t{\n\t\t\tcase WSC_MSG_M2:\n\t\t\tcase WSC_MSG_M4:\n\t\t\tcase WSC_MSG_M6:\n\t\t\tcase WSC_MSG_M8:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction: Rx WscMsg(%d) from UPnP, eventID=0x%x!\\n\", MsgType, reqID));\n\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_MSG, Elem->Msg, Elem->MsgLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\n\t\t\t\t/*Notify the UPnP daemon which remote registar is negotiating with enrollee. */\n\t\t\t\tif (MsgType == WSC_MSG_M2)\n\t\t\t\t{\n\t\t\t\t\tpWscUPnPInfo->registrarID = Elem->TimeStamp.u.HighPart;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():registrarID=0x%x!\\n\", __FUNCTION__, pWscUPnPInfo->registrarID));\n\t\t\t\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_MGMT, WSC_UPNP_MGMT_SUB_REG_SELECT, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(PUCHAR)(&pWscUPnPInfo->registrarID), sizeof(UINT), 0, 0, NULL, AP_MODE);\n\t\t\t\t\t\n\t\t\t\t\t/*Reset the UPnP timer and status. */\n\t\t\t\t\tif (pWscControl->bM2DTimerRunning == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPCancelTimer(&pWscControl->M2DTimer, &Cancelled);\n\t\t\t\t\t\tpWscControl->bM2DTimerRunning = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\tpWscControl->M2DACKBalance = 0;\n\t\t\t\t\tpWscUPnPInfo->registrarID = 0;\n\t\t\t\t}\n\t\t\t\tif (MsgType == WSC_MSG_M8)\n\t\t\t\t{\n\t\t\t\t\tWscBuildBeaconIE(pAdapter, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, AP_MODE);\n\t\t\t\t\tWscBuildProbeRespIE(pAdapter, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, pWscControl->EntryIfIdx, NULL, 0, AP_MODE);\n\t\t\t\t\tAPUpdateBeaconFrame(pAdapter, pWscControl->EntryIfIdx & 0x0F);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_MSG_M2D:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction: Rx WscMsg M2D(%d) from UPnP, eventID=0x%x!\\n\", MsgType, reqID));\n\n\t\t\t\t/*If it's send by UPnP Action, response ok directly to remote UPnP Control Point! */\n\t\t\t\tif (reqID > 0)\n\t\t\t\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_ACK, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t0, 0, reqID, 0, NULL, AP_MODE);\n\n\t\t\t\t/*Send M2D to wireless station. */\n\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_MSG, Elem->Msg, Elem->MsgLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t\tpWscControl->M2DACKBalance++;\n\t\t\t\tif ((pWscUPnPInfo->registrarID == 0) && (pWscControl->bM2DTimerRunning == FALSE))\n\t\t\t\t{\n\t\t\t\t\t/* Add M2D timer used to trigger the EAPFail Packet! */\n\t\t\t\t\tRTMPSetTimer(&pWscControl->M2DTimer, WSC_UPNP_M2D_TIME_OUT);\n\t\t\t\t\tpWscControl->bM2DTimerRunning = TRUE;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_MSG_WSC_NACK:\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Recv WscMsg(%d) from UPnP, request EventID=%d! drop it!\\n\", MsgType, reqID));\n\t\t\t\tbreak;\n\t\t}\n    }\n\telse\t\n\t{\t/*WSC msg send from EAP. */\n\t\tswitch (MsgType)\n\t\t{\n\t        case WSC_MSG_M1:\n\t\t\tcase WSC_MSG_M3:\n\t\t\tcase WSC_MSG_M5:\n\t\t\tcase WSC_MSG_M7:\n\t            DBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction: Rx WscMsg(%d) from EAP\\n\", MsgType));\n\t\t\t\t/*This msg send to event-based external registrar */\n\t\t\t\tif (MsgType == WSC_MSG_M1)\n                {            \n\t\t\t\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_TO_ALL, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tElem->Msg, Elem->MsgLen, 0, 0, &pWscControl->EntryAddr[0], AP_MODE);\n                    pWscControl->WscState = WSC_STATE_SENT_M1;\n                }\n\t\t\t\telse\n\t\t\t\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_TO_ALL, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tElem->Msg, Elem->MsgLen, 0, pWscUPnPInfo->registrarID, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t&pWscControl->EntryAddr[0], AP_MODE);\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_MSG_WSC_ACK:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction: Rx WSC_ACK from EAP\\n\"));\n\n\t\t\t\t/* The M2D must appeared before the ACK, so we just need sub it when (pWscUPnPInfo->M2DACKBalance > 0) */\n\t\t\t\tif (pWscControl->M2DACKBalance > 0)\n\t\t\t\t\tpWscControl->M2DACKBalance--;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_MSG_WSC_DONE:\n\t            DBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction: Rx WSC_DONE from EAP\\n\"));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapApProxyAction: send WSC_DONE to UPnP Registrar!\\n\"));\n\t\t\t\t/*Send msg to event-based external registrar */\n\t\t\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_TO_ONE, \n\t\t\t\t\t\t\t\t\t\t\t\t\tElem->Msg, Elem->MsgLen, 0, \n\t\t\t\t\t\t\t\t\t\t\t\t\tpWscUPnPInfo->registrarID, &pWscControl->EntryAddr[0], AP_MODE);\n\n\t\t\t\t/*Send EAPFail to wireless station to finish the whole process. */\n\t\t\t\tWscSendEapFail(pAdapter, pWscControl, FALSE);\n                \n                RTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n                pWscControl->EapolTimerRunning = FALSE;\n\n                pEntry->bWscCapable = FALSE;\n                pWscControl->EapMsgRunning = FALSE;\n                NdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN);\n\n                if (pWscControl->Wsc2MinsTimerRunning)\n            \t{\n            \t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n            \t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n            \t}\t\t\t\n\t            break;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Recv WSC Msg(%d) from EAP , it's impossible, drop it!\\n\", MsgType));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\nFail:\n\tif (WscData)\n\t\tos_free_mem(NULL, WscData);\n\tif (sendToUPnP && (bUPnPStatus == FALSE))\n    {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Need to send UPnP but bUPnPStatus is false!MsgType=%d, regID=0x%x!\\n\", MsgType, reqID));\n\t\tWscUPnPErrHandle(pAdapter, pWscControl, reqID);\n\t}\n\t\t\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n/*\n\t============================================================================\n\tRegistrar\t\t\tRegistrar\t\t\tRegistrar\t\t\t\n\t============================================================================\t\n*/\t\nVOID WscEapRegistrarAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  UCHAR\t        MsgType,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl)\n{\n\tINT     DataLen = 0, rv = 0;\n\tUCHAR   OpCode = 0;\n\tUCHAR   *WscData = NULL;    \n\tBOOLEAN bUPnPMsg, bUPnPStatus = FALSE, Cancelled;\n\tWSC_UPNP_NODE_INFO *pWscUPnPInfo = &pWscControl->WscUPnPNodeInfo;\n\tUINT\tMaxWscDataLen = WSC_MAX_DATA_LEN;\n\tUCHAR\tCurOpMode = 0xFF;\n#ifdef P2P_SUPPORT\n\t\tBOOLEAN bReadOwnPIN = FALSE;\n#endif /* P2P_SUPPORT */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction Enter!\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\t\tCurOpMode = AP_MODE;\n#endif // CONFIG_AP_SUPPORT //\n\t\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\t\tif (Elem->OpMode != OPMODE_STA)\n\t\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n\tbUPnPMsg = Elem->MsgType == WSC_EAPOL_UPNP_MSG ? TRUE : FALSE;\n\n\tif(bUPnPMsg)\n\t{\n\t\tif(MsgType == WSC_MSG_M1)\n\t\t{\t/* It's a M1 message, we may need to initialize our state machine. */\n\t\t\tif ((pWscControl->WscActionMode == WSC_REGISTRAR) \n\t\t\t\t&& (pWscControl->EntryIfIdx == WSC_INIT_ENTRY_APIDX)\n\t\t\t\t&& (pWscControl->WscState < WSC_STATE_WAIT_M1)\n\t\t\t\t&& (pWscUPnPInfo->bUPnPInProgress == FALSE))\n\t\t\t{\n\t\t\t\tpWscUPnPInfo->bUPnPInProgress = TRUE;\n\t\t\t\t/*Set the WscState as \"WSC_STATE_WAIT_RESP_ID\" because UPnP start from this state. */\n\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M1;\n\t\t\t\tRTMPSetTimer(&pWscUPnPInfo->UPnPMsgTimer, WSC_UPNP_MSG_TIME_OUT);\n\t\t\t\tpWscUPnPInfo->bUPnPMsgTimerRunning = TRUE;\n\t\t\t}\n\t\t}\n\t\tOpCode = WSC_OPCODE_UPNP_MASK;\n\t\t\n\t} else {\n\t    if (pWscControl->EapolTimerRunning)\n\t\tpWscControl->EapolTimerRunning = FALSE;\n\n\t}\n\n#ifdef WSC_V2_SUPPORT \n\tMaxWscDataLen = MaxWscDataLen + (UINT)pWscControl->WscV2Info.ExtraTlv.TlvLen;\n#endif /* WSC_V2_SUPPORT */\n\tos_alloc_mem(NULL, (UCHAR **)&WscData, MaxWscDataLen);\n/*\tif( (WscData = kmalloc(WSC_MAX_DATA_LEN, GFP_ATOMIC)) == NULL) */\n\tif (WscData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscData Allocate failed!\\n\"));\n\t\tgoto Fail;\n\t}\n\tNdisZeroMemory(WscData, MaxWscDataLen);\n\t\n\t/* Base on state doing the Msg, State change diagram */\n\tswitch (MsgType)\n\t{\n\t\tcase WSC_MSG_M1:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : Rx M1\\n\"));\n            \n\t\t\t/* Receive M1, if we are at WSC_STATE_WAIT_M1 start, process it immediately */\n\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M1_RECEIVED;\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M1)\n\t\t\t{\n\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n\n\t\t\t\t/* Process M1 */\n\t\t\t\tif ((rv=ProcessMessageM1(pAdapter, pWscControl, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t\tgoto Fail;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN\tbSendM2D = TRUE;\n#ifdef P2P_SUPPORT\n\t\t\t\t\t/*\n\t\t\t\t\t\tIf own UI is limited UI, we need to use own PIN not PIN of Enrollee.\n\t\t\t\t\t*/\n\t\t\t\t\tif (P2P_GO_ON(pAdapter) && (pWscControl->EntryIfIdx != BSS0))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pAdapter->P2pCfg.ConfigMethod & WSC_CONFMET_KEYPAD) == 0)\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbReadOwnPIN = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\tif (bReadOwnPIN)\n\t\t\t\t\t{\n\t\t\t\t\t\tpWscControl->WscPinCodeLen = pWscControl->WscEnrolleePinCodeLen;\n\t\t\t\t\t\tWscGetRegDataPIN(pAdapter, pWscControl->WscEnrolleePinCode, pWscControl);\n\t\t\t\t\t}\n#endif /* P2P_SUPPORT */\n\n\n\t\t\t\t\tif (pWscControl->bWscTrigger && (!pWscControl->bWscAutoTigeer))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (((pWscControl->WscMode == WSC_PBC_MODE) || (pWscControl->WscMode == WSC_SMPBC_MODE))\n\t\t\t\t\t\t\t|| (pWscControl->WscMode == WSC_PIN_MODE && pWscControl->WscPinCode != 0))\n\t\t\t\t\t\t\tbSendM2D = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (bSendM2D)\n\t\t\t\t\t{\n\t\t\t\t\t\tDataLen = BuildMessageM2D(pAdapter, pWscControl, WscData);\n\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_SENT_M2D;\n\t\t\t\t\t\tpWscControl->M2DACKBalance++;\n\t\t\t\t\t\tif (pWscControl->bM2DTimerRunning == FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Add M2D timer used to trigger the EAPFail Packet!\n\t\t\t\t\t\t\tRTMPSetTimer(&pWscControl->M2DTimer, WSC_UPNP_M2D_TIME_OUT);\n\t\t\t\t\t\t\tpWscControl->bM2DTimerRunning = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M2_SENT;\n\t\t\t\t\t\tDataLen = BuildMessageM2(pAdapter, pWscControl, WscData);\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M3;\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif ((CurOpMode == STA_MODE) && INFRA_ON(pAdapter))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!bUPnPMsg)\n\t\t\t\t\t\t\t\tpWscControl->WscConfStatus = pWscControl->bConfiguredAP ? WSC_SCSTATE_UNCONFIGURED : WSC_SCSTATE_CONFIGURED;\n\t\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M2, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase WSC_MSG_M3:\n\t\t\t/* Receive M3 */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : Rx M3\\n\"));\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M3)\n\t\t\t{\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M3_RECEIVED;\n\n\t\t\t\tif((rv = ProcessMessageM3(pAdapter, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t\tgoto Fail;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n\t\t\t\t\tDataLen = BuildMessageM4(pAdapter, pWscControl, WscData);\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M4_SENT;\n\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M5;\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M4, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase WSC_MSG_M5:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : Rx M5\\n\"));\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M5)\n\t\t\t{\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M5_RECEIVED;\n\n\t\t\t\tif ((rv=ProcessMessageM5(pAdapter, pWscControl, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t\tgoto Fail;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n\t\t\t\t\tDataLen = BuildMessageM6(pAdapter, pWscControl, WscData);\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M6_SENT;\n\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_M7;\n\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M6, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase WSC_MSG_M7:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : Rx M7\\n\"));\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_M7)\n\t\t\t{\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M7_RECEIVED;\n\t\t\t\tif ((rv=ProcessMessageM7(pAdapter, pWscControl, Elem->Msg, Elem->MsgLen, &pWscControl->RegData)))\n\t\t\t\t\tgoto Fail;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (\n#ifdef CONFIG_AP_SUPPORT                        \n\t\t\t\t\t\t(CurOpMode == AP_MODE) || \n#endif /* CONFIG_AP_SUPPORT */   \n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\t((CurOpMode == STA_MODE) && ((pWscControl->bConfiguredAP == FALSE)\n#ifdef WSC_V2_SUPPORT\n                            /* \n                            \tCheck AP is v2 or v1, Check WscV2 Enabled or not\n                            */\n\t\t\t\t\t\t\t|| (pWscControl->WscV2Info.bForceSetAP \n\t\t\t\t\t\t\t\t&& pWscControl->WscV2Info.bEnableWpsV2 \n\t\t\t\t\t\t\t\t&& (pWscControl->RegData.PeerInfo.Version2!= 0))\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t\t)) ||\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\t\t(0))\n\t\t\t\t\t{\n\t\t\t\t\t\tOpCode |= WSC_OPCODE_MSG;\n#ifdef IWSC_SUPPORT\n\t\t\t\t\t\tif ((pAdapter->OpMode == OPMODE_STA) && (pAdapter->StaCfg.BssType == BSS_ADHOC))\n\t\t\t\t\t\t\tpWscControl->WscConfStatus = WSC_SCSTATE_CONFIGURED;\n#endif /* IWSC_SUPPORT */\n\t\t\t\t\t\tDataLen = BuildMessageM8(pAdapter, pWscControl, WscData);\n\t\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_M8_SENT;\n\t\t\t\t\t\t/* Change the state to next one */\n\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_DONE;\n\t\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_M8, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\n\t\t\t\t\t\tif (pWscControl->WscV2Info.bEnableWpsV2 && (CurOpMode == AP_MODE))\n\t\t\t\t\t\t\tWscAddEntryToAclList(pAdapter, pEntry->apidx, pEntry->Addr);\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t1. Complete WPS with this STA. Delete it from WscPeerList for others STA to do WSC with AP\n\t\t\t\t\t\t\t2. Some WPS STA will send dis-assoc close to WSC_DONE \n\t\t\t\t\t\t\t   then AP will miss WSC_DONE from STA; hence we need to call WscDelListEntryByMAC here.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tif (pEntry && (CurOpMode == AP_MODE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock);\n\t\t\t\t\t\t\tWscDelListEntryByMAC(&pWscControl->WscPeerList, pEntry->Addr);\n\t\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\telse if ((CurOpMode == STA_MODE) && \n\t\t\t\t\t\t(pWscControl->bConfiguredAP == TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Some WPS AP expects to receive WSC_NACK when AP is configured */\n\t\t\t\t\t\tOpCode |= WSC_OPCODE_NACK;\n\t\t\t\t\t\tDataLen = BuildMessageNACK(pAdapter, pWscControl, WscData);\n\t\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\t\t\t\tpWscControl->WscState = WSC_STATE_CONFIGURED;\n\t\t\t\t\t\tpWscControl->EapMsgRunning = FALSE;\n\t\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_NACK, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase WSC_MSG_WSC_DONE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : Rx DONE\\n\"));\n\t\t\tif (pWscControl->WscState == WSC_STATE_WAIT_DONE)\n\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t{\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_EAP_RAP_RSP_DONE_SENT;\n\t\t\t\t\t/* Send EAP-Fail */\n\t\t\t\t\tWscSendEapFail(pAdapter, pWscControl, FALSE);\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n#ifdef P2P_SUPPORT\n\t\t\t\t\tif (P2P_GO_ON(pAdapter) && \n\t\t\t\t\t\t(pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED) &&\n\t\t\t\t\t\t(pWscControl == &pAdapter->ApCfg.MBSSID[MAIN_MBSSID].WscControl))\n\t\t\t\t\t\tpAdapter->P2pCfg.bStopAuthRsp = TRUE;\n#endif /* P2P_SUPPORT */\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t{\n\t\t\t\t\tif ((CurOpMode == STA_MODE) && ADHOC_ON(pAdapter))\n\t\t\t\t\t{\n\t\t\t\t\t\tWscSendEapFail(pAdapter, pWscControl, FALSE);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOpCode |= WSC_OPCODE_ACK;\n\t\t\t\t\t\tDataLen = BuildMessageACK(pAdapter, pWscControl, WscData);\n\t\t \t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_SEND_ACK, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\t\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\t\tif ((pAdapter->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\t\t\t(pWscControl->WscMode == WSC_SMPBC_MODE))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAdapter->StaCfg.IWscInfo.IWscSmpbcAcceptCount--;\n\t\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (pEntry && pEntry->bIWscSmpbcAccept)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry->bIWscSmpbcAccept = FALSE;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tWscDelListEntryByMAC(&pWscControl->WscPeerList, pEntry->Addr);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpAdapter->StaCfg.IWscInfo.SmpbcEnrolleeCount++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* IWSC_SUPPORT */\n\t\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\tpWscControl->WscState = WSC_STATE_CONFIGURED;\n\t\t\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_SUCCESS, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n#ifdef P2P_SUPPORT\n\t\t\t\t/*RTMPCancelTimer(&pAdapter->P2pCfg.P2pWscTimer, &Cancelled);*/\n\t\t\t\tif (P2P_GO_ON(pAdapter) && pEntry && pWscControl->EntryIfIdx != BSS0)\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, pEntry->Addr);\n\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t{\n\t\t\t\t\t\tPRT_P2P_CLIENT_ENTRY pP2pEntry = &pAdapter->P2pTable.Client[P2pIdx];\n\t\t\t\t\t\t// Update p2p Entry's state.\n\t\t\t\t\t\tpP2pEntry->P2pClientState = P2PSTATE_CLIENT_WPS_DONE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// default set extended listening to zero for each connection. If this is persistent, will set it.\n\t\t\t\tpAdapter->P2pCfg.ExtListenInterval = 0;\n\t\t\t\tpAdapter->P2pCfg.ExtListenPeriod = 0;\n\t\t\t\tpAdapter->P2pCfg.WscState = WSC_STATE_CONFIGURED;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\tP2pSendWirelessEvent(pAdapter, RT_P2P_WPS_COMPLETED, NULL, NULL);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t\tif (IS_PERSISTENT_ON(pAdapter) && pEntry && (pEntry->bP2pClient == TRUE))\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAdapter, pEntry->Addr);\n\n\t\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P GO.\\n\"));\n\t\t\t\t\telse if (IS_P2P_CLI_ENTRY(pEntry))\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P CLIENT.\\n\"));\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pEntry is P2P NONE[%d].\\n\", pEntry->EntryType));\n\n\t\t\t\t\tif ((P2pIdx != P2P_NOT_FOUND) && (IS_P2P_GO_ENTRY(pEntry) || IS_P2P_CLI_ENTRY(pEntry)))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"P2pWPSDone- Save to persistent entry. GrpCap= %x \\n\", pAdapter->P2pTable.Client[P2pIdx].GroupCapability));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"1. P2pWPSDone-\tSet Extended timing !!!!!!!\\n\"));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    ======== Profile :: Cnt = %d ========\\n\", pWscControl->WscProfile.ProfileCnt));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    SSID[%d] = %s.\\n\", pWscControl->WscProfile.Profile[0].SSID.SsidLength, pWscControl->WscProfile.Profile[0].SSID.Ssid));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    AuthType = %x.    EncrType = %x.\\n\", pWscControl->WscProfile.Profile[0].AuthType, pWscControl->WscProfile.Profile[0].EncrType));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    MAC = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", PRINT_MAC(pWscControl->WscProfile.Profile[0].MacAddr)));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    KeyLen = %d.    KeyIdx = %d.\\n\", pWscControl->WscProfile.Profile[0].KeyLength, pWscControl->WscProfile.Profile[0].KeyIndex));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"    Key :: %02x %02x %02x %02x  %02x %02x %02x %02x\\n\", pWscControl->WscProfile.Profile[0].Key[0], pWscControl->WscProfile.Profile[0].Key[1], pWscControl->WscProfile.Profile[0].Key[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpWscControl->WscProfile.Profile[0].Key[3], pWscControl->WscProfile.Profile[0].Key[4], pWscControl->WscProfile.Profile[0].Key[5], pWscControl->WscProfile.Profile[0].Key[6], pWscControl->WscProfile.Profile[0].Key[7]));\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"             %02x %02x %02x %02x  %02x %02x %02x %02x\\n\", pWscControl->WscProfile.Profile[0].Key[8], pWscControl->WscProfile.Profile[0].Key[9], pWscControl->WscProfile.Profile[0].Key[10],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpWscControl->WscProfile.Profile[0].Key[11], pWscControl->WscProfile.Profile[0].Key[12], pWscControl->WscProfile.Profile[0].Key[13], pWscControl->WscProfile.Profile[0].Key[14], pWscControl->WscProfile.Profile[0].Key[15]));\n\t\t\t\t\n\t\t\t\t\t\tP2pPerstTabInsert(pAdapter, pEntry->Addr, &pWscControl->WscProfile.Profile[0]);\n\t\t\t\t\t\t// this is a persistent connection.\n\t\t\t\t\t\tpAdapter->P2pCfg.ExtListenInterval = P2P_EXT_LISTEN_INTERVAL;\n\t\t\t\t\t\tpAdapter->P2pCfg.ExtListenPeriod = P2P_EXT_LISTEN_PERIOD;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif //P2P_SUPPORT //\t\n\t\t\t\tpWscControl->EapMsgRunning = FALSE;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : Unsupported Msg Type\\n\"));\n\t\t\tif (WscData)\n\t\t\t\tos_free_mem(NULL, WscData);\n\t\t\treturn;\n\t}\n\n\tif(OpCode > WSC_OPCODE_UPNP_MASK)\n\t\tbUPnPStatus = WscSendUPnPMessage(pAdapter, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_NORMAL, \n\t\t\t\t\t\t\t\t\t\t\tWscData, DataLen, \n\t\t\t\t\t\t\t\t\t\t\tElem->TimeStamp.u.LowPart, Elem->TimeStamp.u.HighPart, &pWscControl->EntryAddr[0], CurOpMode);\n\telse if(OpCode > 0 && OpCode < WSC_OPCODE_UPNP_MASK)\n\t{\n#ifdef WSC_V2_SUPPORT\n\t\tpWscControl->WscTxBufLen = 0;\n\t\tpWscControl->pWscCurBufIdx = NULL;\n\t\tpWscControl->bWscLastOne = TRUE;\n\t\tif (pWscControl->bWscFragment && (DataLen > pWscControl->WscFragSize))\t\t\t\n\t\t{\n\t\t\tASSERT(DataLen < MGMT_DMA_BUFFER_SIZE);\n\t\t\tNdisMoveMemory(pWscControl->pWscTxBuf, WscData, DataLen);\n\t\t\tpWscControl->WscTxBufLen = DataLen;\n\t\t\tNdisZeroMemory(WscData, DataLen);\n\t\t\tpWscControl->bWscLastOne = FALSE;\n\t\t\tpWscControl->bWscFirstOne = TRUE;\n\t\t\tNdisMoveMemory(WscData, pWscControl->pWscTxBuf, pWscControl->WscFragSize);\n\t\t\tDataLen = pWscControl->WscFragSize;\n\t\t\tpWscControl->WscTxBufLen -= pWscControl->WscFragSize;\n\t\t\tpWscControl->pWscCurBufIdx = (pWscControl->pWscTxBuf + pWscControl->WscFragSize);\n\t\t}\n#endif /* WSC_V2_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tif (pWscControl->WscState != WSC_STATE_CONFIGURED)\n\t\t\t\tWscSendMessage(pAdapter, OpCode, WscData, DataLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n\t\t\tif (ADHOC_ON(pAdapter))\n\t\t\t\tWscSendMessage(pAdapter, OpCode, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_REQ);\n\t\t\telse\n\t\t\t\tWscSendMessage(pAdapter, OpCode, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_RSP);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t    \n\t}\n\telse\n\t\tbUPnPStatus = TRUE;\n\n\tif(bUPnPMsg)\n\t{\n\t\tif(pWscControl->WscState == WSC_STATE_SENT_M2D)\n\t\t{\t/*After M2D, reset the status of State Machine. */\n\t\t\tpWscControl->WscState = WSC_STATE_WAIT_UPNP_START;\n\t\t\tpWscUPnPInfo->bUPnPInProgress = FALSE;\n\t\t}\n\t}\nFail:\n    DBGPRINT(RT_DEBUG_TRACE, (\"WscEapRegistrarAction : rv = %d\\n\", rv));\n    if (rv)\n    {        \n    \tif (rv <= WSC_ERROR_DEV_PWD_AUTH_FAIL)\n    \t{\n\t\t\tpWscControl->RegData.SelfInfo.ConfigError = rv;\n    \t}\n\t\telse if ((rv == WSC_ERROR_HASH_FAIL) || (rv == WSC_ERROR_HMAC_FAIL))\n\t\t\tpWscControl->RegData.SelfInfo.ConfigError = WSC_ERROR_DECRYPT_CRC_FAIL;\n\t\t\n        switch(rv)\n        {\n            case WSC_ERROR_HASH_FAIL:\n                pWscControl->WscStatus = STATUS_WSC_ERROR_HASH_FAIL;\n                break;\n            case WSC_ERROR_HMAC_FAIL:\n                pWscControl->WscStatus = STATUS_WSC_ERROR_HMAC_FAIL;\n                break;\n            default:\n                pWscControl->WscStatus = STATUS_WSC_FAIL;\n                break;\n        }        \n\t\tRTMPSendWirelessEvent(pAdapter, IW_WSC_STATUS_FAIL, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n        if (bUPnPMsg)\n        {\n\t\t\tif (pWscUPnPInfo->bUPnPMsgTimerRunning == TRUE)\n\t\t\t{\n            \tRTMPCancelTimer(&pWscUPnPInfo->UPnPMsgTimer, &Cancelled);\n\t            pWscUPnPInfo->bUPnPMsgTimerRunning = FALSE;\n\t\t\t}\n\t\t\tpWscUPnPInfo->bUPnPInProgress = FALSE;\n        }\n\t\telse\n        {\n            DataLen = BuildMessageNACK(pAdapter, pWscControl, WscData);            \n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\tpEntry->bWscCapable = FALSE;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\n\t\t\t\tif (ADHOC_ON(pAdapter))\n\t\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_REQ);\n\t\t\t\telse\n\t\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_RSP);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t\tpWscControl->EapolTimerRunning = FALSE;\n\t}\n        /*\n           If a PIN authentication or communication error occurs after sending message M6, \n           the Registrar MUST warn the user and MUST NOT automatically reuse the PIN. \n           Furthermore, if the Registrar detects this situation and prompts the user for a new PIN from the Enrollee device, \n           it MUST NOT accept the same PIN again without warning the user of a potential attack.\n        */\n        if (pWscControl->WscState >= WSC_STATE_WAIT_M7)\n        {\n            pWscControl->WscRejectSamePinFromEnrollee = TRUE;\n            pWscControl->WscPinCode = 0;\n        }\n        pWscControl->WscState = WSC_STATE_OFF;\n        pWscControl->WscStatus = STATUS_WSC_IDLE;\n\t\t/*NdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN); */\n        /*pWscControl->WscMode = 1; */\n        bUPnPStatus = FALSE;\n    }\n\n\tif(WscData)\n\t\tos_free_mem(NULL, WscData);\n\t\n\tif(bUPnPMsg && (bUPnPStatus == FALSE))\n\t\tWscUPnPErrHandle(pAdapter, pWscControl, Elem->TimeStamp.u.LowPart);\n\n\tif (pWscControl->WscState == WSC_STATE_CONFIGURED)\n\t{\n#ifdef WSC_LED_SUPPORT\n\t\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\n\t\tpWscControl->bWscTrigger = FALSE;\n#ifdef IWSC_SUPPORT\n\t\tif ((pAdapter->OpMode == OPMODE_STA) &&\n\t\t\t(pAdapter->StaCfg.BssType == BSS_ADHOC))\n\t\t{\t\t\t\n\t\t\tif (pAdapter->StaCfg.IWscInfo.bSinglePIN)\n\t\t\t{\n\t\t\t\tpAdapter->StaCfg.IWscInfo.bDoNotStop = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpAdapter->StaCfg.IWscInfo.bDoNotStop = FALSE;\n\t\t\tRTMP_SEM_LOCK(&pWscControl->WscConfiguredPeerListSemLock);\n\t\t\tWscInsertPeerEntryByMAC(&pWscControl->WscConfiguredPeerList, pWscControl->WscPeerMAC);\n\t\t\tRTMP_SEM_UNLOCK(&pWscControl->WscConfiguredPeerListSemLock);\n\t\t\tNdisZeroMemory(pWscControl->WscPeerMAC, MAC_ADDR_LEN); // We need to clear here for 4-way handshaking\n\t\t\tMlmeEnqueue(pAdapter, IWSC_STATE_MACHINE, IWSC_MT2_MLME_STOP, 0, NULL, 0);\n\t\t\tRTMP_MLME_HANDLER(pAdapter);\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\tif (pWscControl->Wsc2MinsTimerRunning)\n\t\t{\n\t\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n\t\t}\n\t\tif (bUPnPMsg)\n\t\t{\n\t\t\tif (pWscUPnPInfo->bUPnPMsgTimerRunning == TRUE)\n\t\t\t{\tRTMPCancelTimer(&pWscUPnPInfo->UPnPMsgTimer, &Cancelled);\n\t\t\t\tpWscUPnPInfo->bUPnPMsgTimerRunning = FALSE;\n\t\t\t}\n\t\t\tpWscUPnPInfo->bUPnPInProgress = FALSE;\n\t\t\tpWscUPnPInfo->registrarID = 0;\n\t\t}\n#ifdef CONFIG_AP_SUPPORT        \n\t\telse\n\t\t{\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\tWscBuildBeaconIE(pAdapter, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, pEntry->apidx, NULL, 0, CurOpMode);\n\t\t\t\tWscBuildProbeRespIE(pAdapter, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, pWscControl->EntryIfIdx, NULL, 0, CurOpMode);\n\t\t\t\tAPUpdateBeaconFrame(pAdapter, pEntry->apidx);\n\n\t\t\t}\n\t\t}\n\t\tNdisZeroMemory(&pAdapter->CommonCfg.WscStaPbcProbeInfo, sizeof(WSC_STA_PBC_PROBE_INFO));\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n#ifdef IWSC_SUPPORT\n\t\t\tif (pAdapter->StaCfg.IWscInfo.bDoNotStop == FALSE)\n#endif /* IWSC_SUPPORT */\n\t\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\n\t\t\tif (pAdapter->StaCfg.BssType == BSS_INFRA)\n\t\t\t\tpWscControl->WscState = WSC_STATE_WAIT_EAPFAIL;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\tif (INFRA_ON(pAdapter) ||\n\t\t\t (\n\t\t\t\t(pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED) &&\n\t\t\t\t((CurOpMode == AP_MODE) || (ADHOC_ON(pAdapter)))\n\t\t\t  )\n\t\t\t)\n\t\t{\n\t\t\tpWscControl->WscConfStatus = WSC_SCSTATE_CONFIGURED;\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tUse ApplyProfileIdx to inform WscUpdatePortCfgTimer AP acts registrar.\n\t\t\t\t\t*/\n\t\t\t\t\tpWscControl->WscProfile.ApplyProfileIdx |= 0x8000;\n\t\t\t\t\tRTMPSetTimer(&pWscControl->WscUpdatePortCfgTimer, 1000);\n\t\t\t\t\tpWscControl->WscUpdatePortCfgTimerRunning = TRUE;\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\n\t\t\t\tpAdapter->StaCfg.bAutoConnectByBssid = TRUE;\n\t\t\t\tif ((pWscControl->bConfiguredAP) \n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\t/* \n\t\t\t\t\t\tCheck AP is v2 or v1, Check WscV2 Enabled or not\n\t\t\t\t\t*/\n\t\t\t\t\t&& !(pWscControl->WscV2Info.bForceSetAP \n\t\t\t\t\t\t&& pWscControl->WscV2Info.bEnableWpsV2 \n\t\t\t\t\t\t&& (pWscControl->RegData.PeerInfo.Version2!= 0))\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t\tRTMPMoveMemory(&pWscControl->WscProfile, &pWscControl->WscM7Profile, sizeof(pWscControl->WscM7Profile));\n\n\t\t\t\tWscWriteConfToPortCfg(pAdapter, pWscControl, &pWscControl->WscProfile.Profile[0], TRUE);\n\t\t\t\t\n\t\t\t\t{\n/*#ifdef KTHREAD_SUPPORT */\n\t/*\t\t\t\tWAKE_UP(&(pAdapter->wscTask)); */\n\t/*#else */\n\t/*\t\t\t\tRTMP_SEM_EVENT_UP(&(pAdapter->wscTask.taskSema)); */\n\t/*#endif */\n\t\t\t\t\tRtmpOsTaskWakeUp(&(pAdapter->wscTask));\n\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\tif (pAdapter->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\t{\n\t\t\t\t\tif (pAdapter->StaCfg.IWscInfo.bDoNotStop == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tWscBuildBeaconIE(pAdapter, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, BSS0, NULL, 0, STA_MODE);\n\t\t\t\t\t\tWscBuildProbeRespIE(pAdapter, WSC_MSGTYPE_REGISTRAR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, BSS0, NULL, 0, STA_MODE);\n\t\t\t\t\t}\n\t\t\t\t\tpAdapter->StaCfg.IWscInfo.bReStart = TRUE;\n\t\t\t\t\tWscLinkDown(pAdapter);\n\t\t\t\t\tif (pAdapter->StaCfg.IWscInfo.bIWscDevQueryReqTimerRunning == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAdapter->StaCfg.IWscInfo.bIWscDevQueryReqTimerRunning = TRUE;\n\t\t\t\t\t\tRTMPSetTimer(&pAdapter->StaCfg.IWscInfo.IWscDevQueryTimer, 200);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n#endif /* IWSC_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t}\n#ifdef WSC_LED_SUPPORT\n\t\t/* The protocol is finished. */\n\t\tWPSLEDStatus = LED_WPS_SUCCESS;\n\t\tRTMPSetLED(pAdapter, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n#ifdef IWSC_SUPPORT\n\t\tif (pAdapter->StaCfg.IWscInfo.bDoNotStop == FALSE)\n#endif /* IWSC_SUPPORT */\n\t\t{\n\t\t\tpWscControl->WscPinCode = 0;\n\t\t\tpWscControl->WscMode = 1;\n\t\t}\n\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t\tpWscControl->EapolTimerRunning = FALSE;\n\n#ifdef IWSC_SUPPORT\n\t\t/*\n\t\t\tSome peer doesn't stop beacon and send de-auth, it will cause 4-way failed when our MAC is higher than peer.\n\t\t\tAfter WPS process complete, delete entry here for adding entry to table again for 4-way handshaking.\n\t\t*/\n\t\tif (pEntry && (pAdapter->StaCfg.BssType == BSS_ADHOC))\n\t\t\tMacTableDeleteEntry(pAdapter, pEntry->Aid, pEntry->Addr);\n#endif /* IWSC_SUPPORT */\n\t\treturn;\n\t}\t\n}\n\nVOID WscTimeOutProcess(\n    IN  PRTMP_ADAPTER       pAd,\n    IN  PMAC_TABLE_ENTRY    pEntry,\n    IN  INT                 nWscState,\n    IN  PWSC_CTRL           pWscControl)\n{\n    INT         WscMode;\n\tUCHAR\tCurOpMode = 0xFF;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif // CONFIG_AP_SUPPORT //\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n    if (nWscState == WSC_STATE_WAIT_ACK)\n        pWscControl->WscState = WSC_STATE_CONFIGURED;\n    else if (nWscState == WSC_STATE_WAIT_RESP_ID)\n        pWscControl->WscState = WSC_STATE_OFF;\n    else if (nWscState == WSC_STATE_RX_M2D)\n    {\n        pWscControl->WscState = WSC_STATE_FAIL;\n        \n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t\t\t{\n\t\t\t\tWscSendEapFail(pAd, pWscControl, TRUE);\n\t\t\t}\n#ifdef APCLI_SUPPORT\n\t\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\t{\n\t\t\t\tWscApCliLinkDown(pAd, pWscControl);\n\t\t\t}\n#endif /* APCLI_SUPPORT */\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */        \n\n\t\tpWscControl->EapolTimerRunning = FALSE;\n\t\tpWscControl->WscRetryCount = 0;\n        \n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n\t\t\tWscLinkDown(pAd);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n        return;\n    }\n    else if (nWscState == WSC_STATE_WAIT_EAPFAIL)\n    {\n        pWscControl->WscState = WSC_STATE_OFF;\n\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n        pWscControl->WscConfMode = WSC_DISABLE;\n    }\n    else\n    {\n#ifdef CONFIG_AP_SUPPORT    \n        if ((pWscControl->WscActionMode == WSC_PROXY) && (pAd->OpMode == OPMODE_AP))\n        {\n    \t\tpWscControl->WscState = WSC_STATE_OFF;\n        }\n    \telse\n#endif /* CONFIG_AP_SUPPORT */            \n    \t\tpWscControl->WscState = WSC_STATE_FAIL;\n    }  \n\n\tif (nWscState == WSC_STATE_WAIT_M8)\n\t\tpWscControl->bWscTrigger = FALSE;\n    pWscControl->WscRetryCount = 0;\n\tNdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN);\n    pWscControl->EapolTimerRunning = FALSE;\n    if (pWscControl->WscMode == 1)\n\t\tWscMode = DEV_PASS_ID_PIN;\n\telse\n\t\tWscMode = DEV_PASS_ID_PBC;\n    \n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif ((pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED) &&\n\t\t\t((nWscState == WSC_STATE_WAIT_DONE) || (nWscState == WSC_STATE_WAIT_ACK)))\n\t\t{\n\t\t\tpWscControl->bWscTrigger = FALSE;\n\t\t\tpWscControl->WscConfStatus = WSC_SCSTATE_CONFIGURED;\n\t\t\t\tWscBuildBeaconIE(pAd, pWscControl->WscConfStatus, FALSE, WscMode, pWscControl->WscConfigMethods, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, CurOpMode);\n\t\t\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, pWscControl->WscConfStatus, FALSE, WscMode, pWscControl->WscConfigMethods, pWscControl->EntryIfIdx, NULL, 0, CurOpMode);\n\t\t\t\tpAd->WriteWscCfgToDatFile = pWscControl->EntryIfIdx;\n\t\t\t\tWscWriteConfToPortCfg(pAd, \n\t\t\t\t\t\t\t\t\tpWscControl,\n\t\t\t\t\t\t\t\t\t&pWscControl->WscProfile.Profile[0],\n\t\t\t\t\t\t\t\t\tFALSE);\n#ifdef P2P_SUPPORT\n\t\t\tif (pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t{\n\t\t\t\tP2P_GoStop(pAd);\n\t\t\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t\t\t}\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\t{\n\t\t\t\tAPStop(pAd);\n\t\t\t\tAPStartUp(pAd);\n\t\t\t}\n\n/*#ifdef KTHREAD_SUPPORT */\n/*\t\t\t\tWAKE_UP(&(pAd->wscTask)); */\n/*#else */\n/*\t\t\t\tRTMP_SEM_EVENT_UP(&(pAd->wscTask.taskSema)); */\n/*#endif */\n\t\t\t\tRtmpOsTaskWakeUp(&(pAd->wscTask));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t\t\t{\n\t\t\t\tpEntry->bWscCapable = FALSE;\n\t\t\t\tWscSendEapFail(pAd, pWscControl, TRUE);\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\tWscBuildBeaconIE(pAd, pWscControl->WscConfStatus, FALSE, WscMode, pWscControl->WscConfigMethods, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, CurOpMode);\n\t\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, pWscControl->WscConfStatus, FALSE, WscMode, pWscControl->WscConfigMethods, pWscControl->EntryIfIdx, NULL, 0, CurOpMode);\n\t\t}\n#ifdef APCLI_SUPPORT\n\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t{\n\t\t\tWscApCliLinkDown(pAd, pWscControl);\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tWscLinkDown(pAd);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"WscTimeOutProcess\\n\"));\n}\n\nVOID WscEAPOLTimeOutAction(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n    PUCHAR              WscData = NULL;\n    PMAC_TABLE_ENTRY    pEntry = NULL;\n    PWSC_CTRL           pWscControl = NULL;\n\tPRTMP_ADAPTER pAd = NULL;\n\tUINT\t\t\t\tMaxWscDataLen = WSC_MAX_DATA_LEN;\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"-----> WscEAPOLTimeOutAction\\n\"));\n        \n    if (FunctionContext == 0)\n    {\n        return;\n    }\n    else\n    {\n        pWscControl = (PWSC_CTRL)FunctionContext;\n\t\tpAd = (PRTMP_ADAPTER)pWscControl->pAd;\n\t\tif (pAd == NULL)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tpEntry = MacTableLookup(pWscControl->pAd, pWscControl->EntryAddr);\n    }\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif // CONFIG_AP_SUPPORT //\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n\tif ((CurOpMode == AP_MODE) || ADHOC_ON(pAd))\n\t{\n\t\tif (pEntry == NULL)\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t/*\n    \t\t\tSome WPS Client will send dis-assoc close to WSC_DONE. \n    \t\t\tIf AP misses WSC_DONE, WPS Client still sends dis-assoc to AP.\n    \t\t\tAP driver needs to check wsc_state here for considering WPS process with this client is completed.\n    \t\t*/\n\t\t\tif ((CurOpMode == AP_MODE) && \n\t\t\t\t((pWscControl->WscState == WSC_STATE_WAIT_DONE) || (pWscControl->WscState == WSC_STATE_WAIT_ACK)))\n\t\t\t{\n\t\t\t\tpWscControl->WscStatus = STATUS_WSC_CONFIGURED;\n\t\t\t\tpWscControl->bWscTrigger = FALSE;\t\t\t\t\n\t\t\t\tif (pWscControl->Wsc2MinsTimerRunning)\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN Cancelled;\n\t\t\t\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\t\t\t\t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n\t\t\t\t}\t\t\t\t\n\t\t\t\tWscTimeOutProcess(pAd, NULL, pWscControl->WscState, pWscControl);\n\t\t\t}\t\t\t\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef IWSC_SUPPORT\n#ifdef CONFIG_STA_SUPPORT            \n\t\t\t\n\t\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t\t(pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\t(pAd->StaCfg.WscControl.WscConfMode == WSC_ENROLLEE))\n\t\t\t\tpAd->StaCfg.IWscInfo.bReStart = TRUE;\n\t\t\t\n#endif // CONFIG_STA_SUPPORT //\n#endif // IWSC_SUPPORT //\n\t\t\tpWscControl->EapolTimerRunning = FALSE;\n\t\t\tNdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"sta is left.\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPOLTimeOutAction\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\n    if (!pWscControl->EapolTimerRunning)\n    {\n        pWscControl->WscRetryCount = 0;\n        goto out;\n    }\n    \n    if (pWscControl->EapolTimerPending)\n    {\n        RTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n        DBGPRINT(RT_DEBUG_TRACE, (\"EapolTimer Pending......\\n\"));\n        DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPOLTimeOutAction\\n\"));\n        return;\n    }\n\n#ifdef WSC_V2_SUPPORT\n\tMaxWscDataLen = MaxWscDataLen + (UINT)pWscControl->WscV2Info.ExtraTlv.TlvLen;\n#endif /* WSC_V2_SUPPORT */\n\tos_alloc_mem(NULL, (UCHAR **)&WscData, MaxWscDataLen);\n/*    if ((WscData = kmalloc(WSC_MAX_DATA_LEN, GFP_ATOMIC))!= NULL) */\n    if (WscData != NULL)\n        NdisZeroMemory(WscData, WSC_MAX_DATA_LEN);\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry) && (pWscControl->WscState <= WSC_STATE_CONFIGURED) && (pWscControl->WscActionMode != WSC_PROXY))\n\t\t{\n\t\t\t/* A timer in the AP should cause to be disconnected after 5 seconds if a */\n\t\t\t/* valid EAP-Rsp/Identity indicating WPS is not received. */\n\t\t\t/* << from WPS EAPoL and RSN handling.doc >> */\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_RESP_ID, pWscControl);\n\n\t\t\t/* If do disassocation here, it will affect connection of non-WPS clients. */\n\t\t\tgoto out;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscState = %d\\n\", pWscControl->WscState));\n    switch(pWscControl->WscState)\n    {\n        case WSC_STATE_WAIT_REQ_ID:\n\t\t\t/* For IWSC case, keep sending EAPOL_START until 2 mins timeout */\n\t\t\tif ((pWscControl->WscRetryCount >= 2)\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t&& (pAd->StaCfg.BssType == BSS_INFRA)\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t)\n\t\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_REQ_ID, pWscControl);\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWscControl->WscRetryCount++;\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif ((pAd->StaCfg.BssType == BSS_INFRA) && (CurOpMode == STA_MODE))\n\t\t\t\t\tWscSendEapolStart(pAd, pAd->CommonCfg.Bssid, CurOpMode);\n\t\t\t\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\tWscSendEapolStart(pAd, pEntry->Addr, CurOpMode);\n\t\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t\t}\n            break;\n        case WSC_STATE_WAIT_WSC_START:\n\t\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t    \tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_WSC_START, pWscControl);\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWscControl->WscRetryCount++;\n\t\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t\t}\n            break;\n        case WSC_STATE_WAIT_M1:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M1, pWscControl);\n\t\telse\n\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_START, NULL, 0, pWscControl, AP_MODE, EAP_CODE_REQ);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t{\n\t\t\t\t\t/*WscSendMessage(pWscControl->pAd, WSC_OPCODE_START, NULL, 0, pWscControl, STA_MODE, EAP_CODE_REQ); */\n\t\t\t\t\tWscSendEapRspId(pAd, pEntry, pWscControl);\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\tpWscControl->WscRetryCount++;\n\t\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t\t}\n            \tbreak;\n\t\tcase WSC_STATE_SENT_M1:\n\t\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M2, pWscControl);\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pWscControl->WscActionMode == WSC_ENROLLEE)\n\t\t\t\t{\n\t\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t\t\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, STA_MODE, EAP_CODE_RSP);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n\tcase WSC_STATE_RX_M2D:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_RX_M2D, pWscControl);\n\t\telse\n\t\t{\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n        case WSC_STATE_WAIT_PIN:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_PIN, pWscControl);\n\t\telse\n\t\t{\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"No PIN CODE, cannot send M2 out!\\n\"));\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n\tcase WSC_STATE_WAIT_M3:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M3, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_REGISTRAR)\n\t\t\t{\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ADHOC_ON(pAd))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t   EAP_CODE_REQ);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n        case WSC_STATE_WAIT_M4:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M4, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_ENROLLEE)\n\t\t\t{\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t\t\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, STA_MODE, EAP_CODE_RSP);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n\tcase WSC_STATE_WAIT_M5:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M5, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_REGISTRAR)\n\t\t\t{         \n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ADHOC_ON(pAd))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_REQ);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n        case WSC_STATE_WAIT_M6:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M6, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_ENROLLEE)\n\t\t\t{\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t\t\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, STA_MODE, EAP_CODE_RSP);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n        case WSC_STATE_WAIT_M7:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M7, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_REGISTRAR)\n\t\t\t{\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ADHOC_ON(pAd))\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_REQ);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n        case WSC_STATE_WAIT_M8:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_M8, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_ENROLLEE)\n\t\t\t{\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\t\t\t\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, STA_MODE, EAP_CODE_RSP);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n\tcase WSC_STATE_WAIT_DONE:\n\t\tif (pWscControl->WscRetryCount >= 2)\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_DONE, pWscControl);\n\t\telse\n\t\t{\n\t\t\tif (pWscControl->WscActionMode == WSC_REGISTRAR)\n\t\t\t{\n\t\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, WSC_OPCODE_MSG, pWscControl->RegData.LastTx.Data, pWscControl->RegData.LastTx.Length, pWscControl, AP_MODE, EAP_CODE_REQ);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ADHOC_ON(pAd))\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_REQ);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tWscSendMessage(pWscControl->pAd, \n\t\t\t\t\t\t\t\t\t\t\t   WSC_OPCODE_MSG, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Data, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl->RegData.LastTx.Length, \n\t\t\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t\t\t   STA_MODE, \n\t\t\t\t\t\t\t\t\t\t\t   EAP_CODE_RSP);\n\t\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\tpWscControl->WscRetryCount++;\n\t\t\tRTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_MSG_TIME_OUT);\n\t\t}\n\t\tbreak;\n#ifdef CONFIG_AP_SUPPORT\n\t\t/* Only AP_Enrollee needs to wait EAP_ACK */\n\t\tcase WSC_STATE_WAIT_ACK:\n\t\t\tWscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_ACK, pWscControl);\n\t\t\tbreak;\n#endif /* CONFIG_AP_SUPPORT */\n        case WSC_STATE_WAIT_EAPFAIL:\n            /* Wait 2 seconds */\n            if (pWscControl->WscRetryCount >= 1)\n                WscTimeOutProcess(pWscControl->pAd, pEntry, WSC_STATE_WAIT_EAPFAIL, pWscControl);\n            else\n            {\n                RTMPModTimer(&pWscControl->EapolTimer, WSC_EAP_EAP_FAIL_TIME_OUT);\n                pWscControl->WscRetryCount++;\n\t\t\t}\n            break;\n        default:\n            break;\n    }\n\nout:\n    if (WscData)\n\t\tos_free_mem(NULL, WscData);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscEAPOLTimeOutAction\\n\"));\n}\n\nVOID Wsc2MinsTimeOutAction(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n\tPWSC_CTRL       pWscControl = (PWSC_CTRL)FunctionContext;\n\tPRTMP_ADAPTER \tpAd = NULL;\n#ifdef CONFIG_AP_SUPPORT\n\tINT\tIsAPConfigured = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\tBOOLEAN         Cancelled;\n\tUCHAR\t\t\tCurOpMode = 0xFF;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> Wsc2MinsTimeOutAction\\n\"));\n\tif (pWscControl != NULL)\n\t{\n\t\tpAd =  (PRTMP_ADAPTER)pWscControl->pAd;\n\n\t\tif (pAd == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd is NULL!\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- Wsc2MinsTimeOutAction\\n\"));\n\t\t\treturn;\n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\t\t\t\tif (pWscControl->EntryIfIdx != BSS0)\n\t\t\t\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Wsc2MinsTimerRunning is %s\\n\", \n\t\tpWscControl->Wsc2MinsTimerRunning ? \"TRUE, reset WscState to WSC_STATE_OFF\":\"FALSE\"));\n\n#ifdef WSC_LED_SUPPORT\n\t\t/* 120 seconds WPS walk time expiration. */\n\t\tpWscControl->bWPSWalkTimeExpiration = TRUE;\n#endif /* WSC_LED_SUPPORT */\n\n\t\tif (pWscControl->Wsc2MinsTimerRunning)\n\t\t{\n\t\t\tpWscControl->bWscTrigger = FALSE;\n\t\t\tpWscControl->EapolTimerRunning = FALSE;\n\t\t\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\tIsAPConfigured = pWscControl->WscConfStatus;\n\t\t\t\tif ((pWscControl->EntryIfIdx & 0x0F) < pAd->ApCfg.BssidNum)\n\t\t\t\t{\n\t\t\t\t\tWscBuildBeaconIE(pWscControl->pAd, IsAPConfigured, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, CurOpMode);\n\t\t\t\t\tWscBuildProbeRespIE(pWscControl->pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, pWscControl->EntryIfIdx, NULL, 0, CurOpMode);\n\t\t\t\t\tAPUpdateBeaconFrame(pWscControl->pAd, pWscControl->EntryIfIdx & 0x0F);\n\t\t\t\t}\n\t\t\t\tif ((pWscControl->WscConfMode & WSC_PROXY) == 0)\n\t\t\t\t{   /* Proxy mechanism is disabled */\n\t\t\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\tpWscControl->WscMode = 1;\n\t\t\tpWscControl->WscRetryCount = 0;\n\t\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\n\t\t\tpWscControl->WscSelReg = 0;\n\t\t\tpWscControl->WscStatus = STATUS_WSC_IDLE; \n\n\t\t\tRTMPSendWirelessEvent(pAd, IW_WSC_2MINS_TIMEOUT, NULL, (pWscControl->EntryIfIdx & 0x0F), 0);\n\n\t\t\tif (pWscControl->WscScanTimerRunning)\n\t\t\t{\n\t\t\t\tpWscControl->WscScanTimerRunning = FALSE;\n\t\t\t\tRTMPCancelTimer(&pWscControl->WscScanTimer, &Cancelled);\n\t\t\t}\n\t\t\tif (pWscControl->WscPBCTimerRunning)\n\t\t\t{\n\t\t\t\tpWscControl->WscPBCTimerRunning = FALSE;\n\t\t\t\tRTMPCancelTimer(&pWscControl->WscPBCTimer, &Cancelled);\n\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\t\t\t\t\n\t\t\t\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\t\t\t\tRTMPZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);\n\t\t\t\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;\n\t\t\t\tRTMPMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\t\t\tif (INFRA_ON(pAd) || \n\t\t\t\t\t(pWscControl->WscConfMode == WSC_ENROLLEE))\n\t\t\t\t\tWscLinkDown(pAd);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tAsicDisableSync(pAd);\n\t\t\t\t\tWscBuildBeaconIE(pAd, pWscControl->WscConfStatus, FALSE, 0, 0, BSS0, NULL, 0, CurOpMode);\n\t\t\t\t\tWscBuildProbeRespIE(pAd,\n\t\t\t\t\t\tWSC_MSGTYPE_REGISTRAR,\n\t\t\t\t\t\tpWscControl->WscConfStatus,\n\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t0,\n\t\t\t\t\t\tCurOpMode);\n\t\t\t\t\tMakeIbssBeacon(pAd);\n\t\t\t\t\tAsicEnableIbssSync(pAd);\n\t\t\t\t}\n\t\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\t\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\t\t\n\t\t}\n\n#ifdef WSC_LED_SUPPORT\n\t\t/* if link is up, there shall be nothing wrong */\n\t\t/* perhaps we will set another flag to do it */\n\t\tif ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) && \n\t\t\t(pWscControl->WscState == WSC_STATE_OFF) &&\n\t\t\t(pWscControl->WscStatus == STATUS_WSC_CONFIGURED))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscConnectTimeout --> Connection OK\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUCHAR WPSLEDStatus;\n\t\t\t\n\t\t\tpWscControl->WscStatus = STATUS_WSC_FAIL; \n\t\t\tpWscControl->WscState = WSC_STATE_OFF;\n\n\t\t\t/* WPS LED mode 7, 8, 11 or 12. */\n\t\t\tif ((LED_MODE(pAd) == WPS_LED_MODE_7) || \n\t\t\t\t(LED_MODE(pAd) == WPS_LED_MODE_8) || \n\t\t\t\t(LED_MODE(pAd) == WPS_LED_MODE_11) || \n\t\t\t    (LED_MODE(pAd) == WPS_LED_MODE_12))\n\t\t\t{\n\t\t\t\tpWscControl->bSkipWPSTurnOffLED = FALSE;\n\t\t\t\t\n\t\t\t\t/* Turn off the WPS LED modoe due to the maximum WPS processing time is expired (120 seconds). */\n\t\t\t\tWPSLEDStatus = LED_WPS_TURN_LED_OFF;\n\t\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n\t\t\t}\n\t\t\telse if ((LED_MODE(pAd) == WPS_LED_MODE_9) /* WPS LED mode 9. */\n\t\t\t\t\t)\n\t\t\t{\t\n\t\t\t\tif (pWscControl->WscMode == WSC_PIN_MODE) /* PIN method. */\n\t\t\t\t{\n\t\t\t\t\t/* The NIC using PIN method fails to finish the WPS handshaking within 120 seconds. */\n\t\t\t\t\tWPSLEDStatus = LED_WPS_ERROR;\n\t\t\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n\t\t\t\t\t/* Turn off the WPS LED after 15 seconds. */\n\t\t\t\t\tRTMPSetTimer(&pWscControl->WscLEDTimer, WSC_WPS_FAIL_LED_PATTERN_TIMEOUT);\n\n\t\t\t\t\t/* The Ralink UI would make RT_OID_DISCONNECT_REQUEST request while it receive STATUS_WSC_EAP_FAILED. */\n\t\t\t\t\t/* Allow the NIC to turn off the WPS LED after WSC_WPS_SKIP_TURN_OFF_LED_TIMEOUT seconds. */\n\t\t\t\t\tpWscControl->bSkipWPSTurnOffLED = TRUE;\n\t\t\t\t\tRTMPSetTimer(&pWscControl->WscSkipTurnOffLEDTimer, WSC_WPS_SKIP_TURN_OFF_LED_TIMEOUT);\n\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: The NIC using PIN method fails to finish the WPS handshaking within 120 seconds.\\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\telse if (pWscControl->WscMode == WSC_PBC_MODE) /* PBC method. */\n\t\t\t\t{\n\t\t\t\t\tswitch (pWscControl->WscLastWarningLEDMode) /* Based on last WPS warning LED mode. */\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\tcase LED_WPS_ERROR:\n\t\t\t\t\t\tcase LED_WPS_SESSION_OVERLAP_DETECTED:\n\t\t\t\t\t\t\t/* Failed to find any partner. */\n\t\t\t\t\t\t\tWPSLEDStatus = LED_WPS_ERROR;\n\t\t\t\t\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n\n\t\t\t\t\t\t\t/* Turn off the WPS LED after 15 seconds. */\n\t\t\t\t\t\t\tRTMPSetTimer(&pWscControl->WscLEDTimer, WSC_WPS_FAIL_LED_PATTERN_TIMEOUT);\n\n\t\t\t\t\t\t\t/* The Ralink UI would make RT_OID_DISCONNECT_REQUEST request while it receive STATUS_WSC_EAP_FAILED. */\n\t\t\t\t\t\t\t/* Allow the NIC to turn off the WPS LED after WSC_WPS_SKIP_TURN_OFF_LED_TIMEOUT seconds. */\n\t\t\t\t\t\t\tpWscControl->bSkipWPSTurnOffLED = TRUE;\n\t\t\t\t\t\t\tRTMPSetTimer(&pWscControl->WscSkipTurnOffLEDTimer, WSC_WPS_SKIP_TURN_OFF_LED_TIMEOUT);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Last WPS LED status is LED_WPS_ERROR.\\n\", __FUNCTION__));\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t/* do nothing. */\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* do nothing. */\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* do nothing. */\n\t\t\t}\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscConnectTimeout --> Fail to connect\\n\"));\n\t\t}\n#endif /* WSC_LED_SUPPORT */\n\t}\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- Wsc2MinsTimeOutAction\\n\"));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tClassify EAP message type for enrolee\n\n\tArguments:\n\t\tpAd         - NIC Adapter pointer\n\t\tElem\t\t- The EAP packet\n\t\t\n\tReturn Value:\n\t\tReceived EAP message type\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nUCHAR\tWscRxMsgType(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tPMLME_QUEUE_ELEM\tpElem) \n{\n\tUSHORT\t\t\t\tLength;\n\tPUCHAR\t\t\t\tpData;\n\tUSHORT\t\t\t\tWscType, WscLen;\n    STRING\t            id_data[] = {\"hello\"};\n    STRING\t            fail_data[] = {\"EAP_FAIL\"};\n    STRING\t            wsc_start[] = {\"WSC_START\"};\n#ifdef WSC_V2_SUPPORT\n\tSTRING\t\twsc_frag_ack[] = \"WSC_FRAG_ACK\";\n#endif /* WSC_V2_SUPPORT */\n    STRING               regIdentity[] = {\"WFA-SimpleConfig-Registrar\"};\n    STRING               enrIdentity[] = {\"WFA-SimpleConfig-Enrollee\"};\n\n    if (pElem->Msg[0] == 'W' && pElem->Msg[1] == 'F' && pElem->Msg[2] == 'A')\n    {\n        /* Eap-Rsp(Identity) */\n\t\tif (memcmp(regIdentity, pElem->Msg, strlen(regIdentity)) == 0)\n\t\t\treturn  WSC_MSG_EAP_REG_RSP_ID;\n        else if (memcmp(enrIdentity, pElem->Msg, strlen(enrIdentity)) == 0)\n\t\t\treturn  WSC_MSG_EAP_ENR_RSP_ID;\n    }\n    else if (NdisEqualMemory(id_data, pElem->Msg, pElem->MsgLen))\n    {\n        /* Eap-Req/Identity(hello) */\n\t\treturn  WSC_MSG_EAP_REQ_ID;\n    }\n    else if (NdisEqualMemory(fail_data, pElem->Msg, pElem->MsgLen))\n    {\n        /* Eap-Fail */\n\t\treturn  WSC_MSG_EAP_FAIL;\n    }\n    else if (NdisEqualMemory(wsc_start, pElem->Msg, pElem->MsgLen))\n    {\n        /* Eap-Req(Wsc_Start) */\n        return WSC_MSG_EAP_REQ_START;\n    }\n#ifdef WSC_V2_SUPPORT\n\telse if (NdisEqualMemory(wsc_frag_ack, pElem->Msg, pElem->MsgLen))\n    {\n        /* WSC FRAG ACK */\n        return WSC_MSG_EAP_FRAG_ACK;\n    }\n#endif /* WSC_V2_SUPPORT */\n    else\n    {   /* Eap-Esp(Messages) */\n        pData = pElem->Msg;\n        Length = (USHORT)pElem->MsgLen;\n\n        /* the first TLV item in EAP Messages must be WSC_IE_VERSION */\n        NdisMoveMemory(&WscType, pData, 2);\n        if (ntohs(WscType) != WSC_ID_VERSION)\n            goto out;\n\n        /* Not Wsc Start, We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */\n\t\twhile (Length > 4)\n\t\t{\n\t\t\t/* arm-cpu has packet alignment issue, it's better to use memcpy to retrieve data */\n\t\t\tNdisMoveMemory(&WscType, pData, 2);\n\t\t\tNdisMoveMemory(&WscLen,  pData + 2, 2);\n\t\t\tWscLen = ntohs(WscLen);\n\t\t\tif (ntohs(WscType) == WSC_ID_MSG_TYPE)\n\t\t\t{\n\t\t\t\treturn(*(pData + 4));\t/* Found the message type */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpData  += (WscLen + 4);\n\t\t\t\tLength -= (WscLen + 4);\n\t\t\t}\n\t\t}\n    }\n\nout:\n\treturn  WSC_MSG_UNKNOWN;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tClassify WSC message type\n\n\tArguments:\n\t\tEAPType\t\tValue of EAP message type\n\t\tMsgType\t\tInternal Message definition for MLME state machine\n\t\t\n\tReturn Value:\n\t\tTRUE\t\tFound appropriate message type\n\t\tFALSE\t\tNo appropriate message type\n\t\n\tNote:\n\t\tAll these constants are defined in wsc.h\n\t\tFor supplicant, there is only EAPOL Key message avaliable\n\t\t\n\t========================================================================\n*/\nBOOLEAN\tWscMsgTypeSubst(\n\tIN\tUCHAR\tEAPType,\n\tIN\tUCHAR\tEAPCode,\n\tOUT\tINT\t\t*MsgType)\t\n{\n\tswitch (EAPType)\n\t{\n\t\tcase EAPPacket:\n\t\t\t*MsgType = WSC_EAPOL_PACKET_MSG;\n\t\t\tbreak;\n        case EAPOLStart:\n            *MsgType = WSC_EAPOL_START_MSG;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscMsgTypeSubst : unsupported EAP Type(%d); \\n\", EAPType));\n\t\t\treturn FALSE;\t\t\n\t}\t\n\n\treturn TRUE;\n}\n\nVOID\tWscInitRegistrarPair(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN  UCHAR\t\t\t\tapidx)\n{\t\n\tUCHAR CurOpMode = 0xff;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscInitRegistrarPair\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t{\n\t\tCurOpMode = AP_MODE;\n\t\tapidx = MAIN_MBSSID;\n\t}\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n\tpWscControl->WscActionMode = 0;\n\n\t/* 1. Version */\n\t/*pWscControl->RegData.SelfInfo.Version = WSC_VERSION; */\n\n\t/* 2. UUID Enrollee, last 6 bytes use MAC */\n\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.Uuid[0], &pWscControl->Wsc_Uuid_E[0], UUID_LEN_HEX);\n\n\t/* 3. MAC address */\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (apidx >= HW_BEACON_MAX_NUM)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t(\"%s: apidx >= HW_BEACON_MAX_NUM!\\n\", __FUNCTION__));\n\t\t\tapidx = 0;\n\t\t}\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr, pAdapter->ApCfg.MBSSID[apidx].Bssid, 6);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\t\n\tif (CurOpMode == STA_MODE)\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr, pAdapter->CurrentAddress, 6);\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* 4. Device Name */\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (!RTMP_TEST_FLAG(pWscControl, 0x04))\n\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.DeviceName, AP_WSC_DEVICE_NAME, sizeof(AP_WSC_DEVICE_NAME));\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\tif (!RTMP_TEST_FLAG(pWscControl, 0x04))\n\t\t{\n\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.DeviceName, STA_WSC_DEVICE_NAME, sizeof(STA_WSC_DEVICE_NAME));\n\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\t/* 5. Manufacture woody */\n\tif (!RTMP_TEST_FLAG(pWscControl, 0x01))\n\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.Manufacturer, WSC_MANUFACTURE, sizeof(WSC_MANUFACTURE));\n\n\t/* 6. Model Name */\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (!RTMP_TEST_FLAG(pWscControl, 0x02))\n\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.ModelName, AP_WSC_MODEL_NAME, sizeof(AP_WSC_MODEL_NAME));\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (!RTMP_TEST_FLAG(pWscControl, 0x02))\n\t\t{\n\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.ModelName, STA_WSC_MODEL_NAME, sizeof(STA_WSC_MODEL_NAME));\n\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\t/* 7. Model Number */\n\n\tif (!RTMP_TEST_FLAG(pWscControl, 0x08))\n\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.ModelNumber, WSC_MODEL_NUMBER, sizeof(WSC_MODEL_NUMBER));\n\t\n\t/* 8. Serial Number */\n\tif (!RTMP_TEST_FLAG(pWscControl, 0x10))\t\n\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.SerialNumber, WSC_MODEL_SERIAL, sizeof(WSC_MODEL_SERIAL));\n\t\n\t/* 9. Authentication Type Flags */\n\t/* Open(=1), WPAPSK(=2),Shared(=4), WPA2PSK(=20),WPA(=8),WPA2(=10) */\n\t/* (0x01 | 0x02 | 0x04 | 0x20 | 0x08 | 0x10) = 0x3F */\n\t/* WCN vista logo will check this flags. */\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t\t/*\n\t\t\tAuthTypeFlags only needs to include Open and WPA2PSK in WSC 2.0.\n\t\t*/\n\t\tpWscControl->RegData.SelfInfo.AuthTypeFlags = cpu2be16(0x0021);\n\telse\t\n#endif /* WSC_V2_SUPPORT */\n\tpWscControl->RegData.SelfInfo.AuthTypeFlags = cpu2be16(0x003F);\n\t\n\t/* 10. Encryption Type Flags */\n\t/* None(=1), WEP(=2), TKIP(=4), AES(=8) */\n\t/* (0x01 | 0x02 | 0x04 | 0x08) = 0x0F */\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t\t/*\n\t\t\tEncrTypeFlags only needs to include None and AES in WSC 2.0.\n\t\t*/\n\t\tpWscControl->RegData.SelfInfo.EncrTypeFlags = cpu2be16(0x0009);\n\telse\t\n#endif /* WSC_V2_SUPPORT */\n\tpWscControl->RegData.SelfInfo.EncrTypeFlags  = cpu2be16(0x000F);\n\t\n\t/* 11. Connection Type Flag */\n\tpWscControl->RegData.SelfInfo.ConnTypeFlags = 0x01;\t\t\t\t\t/* ESS */\n\n\t/* 12. Associate state */\n\tpWscControl->RegData.SelfInfo.AssocState = cpu2be16(0x0000);\t\t/* Not associated */\n\n\t/* 13. Configure Error */\n\tpWscControl->RegData.SelfInfo.ConfigError = cpu2be16(0x0000);\t\t/* No error */\n\n\t/* 14. OS Version */\n\tpWscControl->RegData.SelfInfo.OsVersion = cpu2be32(0x80000000);\t\t/* first bit must be 1 */\n\t\n\t/* 15. RF Band */\n\t/* Some WPS AP would check RfBand value in M1, ex. D-Link DIR-628 */\n\tpWscControl->RegData.SelfInfo.RfBand = 0x00;\n\tif (WMODE_CAP_5G(pAdapter->CommonCfg.PhyMode))\n\t\tpWscControl->RegData.SelfInfo.RfBand |= WSC_RFBAND_50GHZ;\t\t\t/* 5.0G */\n\n\tif (WMODE_CAP_2G(pAdapter->CommonCfg.PhyMode))\n\t\tpWscControl->RegData.SelfInfo.RfBand |= WSC_RFBAND_24GHZ;\t\t\t/* 2.4G */\n\n\t/* 16. Config Method */\n\tpWscControl->RegData.SelfInfo.ConfigMethods = cpu2be16(pWscControl->WscConfigMethods);\n\t/*pWscControl->RegData.EnrolleeInfo.ConfigMethods = cpu2be16(WSC_CONFIG_METHODS);\t\t// Label, Display, PBC */\n\t/*pWscControl->RegData.EnrolleeInfo.ConfigMethods = cpu2be16(0x0084);\t\t// Label, Display, PBC */\n\n\t/* 17. Simple Config State */\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t\tpWscControl->RegData.SelfInfo.ScState = pWscControl->WscConfStatus;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tpWscControl->RegData.SelfInfo.ScState = 0x01;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* 18. Device Password ID */\n\tif (pWscControl->WscMode == WSC_PIN_MODE)\n\t{\n#ifdef IWSC_SUPPORT\n\t\tif ((pAdapter->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t(pAdapter->StaCfg.IWscInfo.bLimitedUI == FALSE))\n\t\t{\n\t\t\tpWscControl->RegData.SelfInfo.DevPwdId = cpu2be16(DEV_PASS_ID_REG);\t\t/* PIN mode */\n\t\t}\n\t\telse\n#endif /* IWSC_SUPPORT */\n\t\tpWscControl->RegData.SelfInfo.DevPwdId = cpu2be16(DEV_PASS_ID_PIN);\t\t/* PIN mode */\n\t}\n#ifdef IWSC_SUPPORT\n\telse if (pWscControl->WscMode == WSC_SMPBC_MODE)\n\t{\n\t\tpWscControl->RegData.SelfInfo.DevPwdId = cpu2be16(DEV_PASS_ID_SMPBC);\t// SMPBC mode\n\t}\n#endif // IWSC_SUPPORT //\n\telse\n\t{\n\t\tpWscControl->RegData.SelfInfo.DevPwdId = cpu2be16(DEV_PASS_ID_PBC);\t\t/* PBC */\n\t}\n\n\t/* 19. SSID */\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.Ssid, pAdapter->ApCfg.MBSSID[apidx].Ssid, pAdapter->ApCfg.MBSSID[apidx].SsidLen);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.Ssid, pAdapter->CommonCfg.Ssid, pAdapter->CommonCfg.SsidLen);\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* 20. Primary Device Type */\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (pWscControl->EntryIfIdx >= MIN_NET_DEVICE_FOR_P2P_CLI)\n\t\t{\n\t\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.PriDeviceType, pAdapter->P2pCfg.DevInfo.PriDeviceType, 8);\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\tif (pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_APCLI)\n\t\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.PriDeviceType, &STA_Wsc_Pri_Dev_Type[0], 8);\n\t\telse\n\t\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.PriDeviceType, &AP_Wsc_Pri_Dev_Type[0], 8);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tNdisMoveMemory(&pWscControl->RegData.SelfInfo.PriDeviceType, &STA_Wsc_Pri_Dev_Type[0], 8);\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscInitRegistrarPair\\n\"));\t\n}\n\nVOID\tWscSendEapReqId(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPMAC_TABLE_ENTRY\tpEntry,\n\tIN  UCHAR\t\t\t\tCurOpMode)\n{\n\tUCHAR               Header802_3[14];\n\tUSHORT\t\t\t\tLength;\n\tIEEE8021X_FRAME\t\tIeee_8021x;\n\tEAP_FRAME\t\t\tEapFrame;\n\tUCHAR\t\t\t\t*pOutBuffer = NULL;\n\tULONG\t\t\t\tFrameLen = 0;\n    UCHAR\t\t\t\tData[] = \"hello\";\n    UCHAR\t\t\t\tId;\n\tPWSC_CTRL\t\t\tpWpsCtrl = NULL;\n\t\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\t\n\t/* 1. Send EAP-Rsp Id */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscSendEapReqId\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tpWpsCtrl = &pAd->ApCfg.MBSSID[pEntry->apidx].WscControl;\n\t\tMAKE_802_3_HEADER(Header802_3, \n\t\t\t\t\t\t  &pEntry->Addr[0], \n\t\t\t\t\t\t  &pAd->ApCfg.MBSSID[pEntry->apidx].Bssid[0], \n\t\t\t\t\t\t  EAPOL);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\t\tMAKE_802_3_HEADER(Header802_3, \n\t\t\t\t\t\t  &pEntry->Addr[0], \n\t\t\t\t\t\t  &pAd->CurrentAddress[0], \n\t\t\t\t\t\t  EAPOL);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pWpsCtrl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pWpsCtrl == NULL!\\n\"));\n\t\treturn;\n\t}\n\n\t/* Length, -1 NULL pointer of string */\n\tLength = sizeof(EAP_FRAME) + sizeof(Data) - 1;\n\t\n\t/* Zero 802.1x body */\n\tNdisZeroMemory(&Ieee_8021x, sizeof(Ieee_8021x));\n\tIeee_8021x.Version = EAPOL_VER;\n\tIeee_8021x.Type    = EAPPacket;\n\tIeee_8021x.Length  = cpu2be16(Length);\n\n\t/* Zero EAP frame */\n\tNdisZeroMemory(&EapFrame, sizeof(EapFrame));\n    /* RFC 3748 Ch 4.1: recommended to initalize Identifier with a\n\t * random number */\n\tId = RandomByte(pAd);\n    if (Id == pWpsCtrl->lastId)\n        Id += 1;\n\tEapFrame.Code   = EAP_CODE_REQ;\n\tEapFrame.Id     = Id;\n\tEapFrame.Length = cpu2be16(Length);\n\tEapFrame.Type   = EAP_TYPE_ID;\n    pWpsCtrl->lastId = Id;\n\t\n    /* Out buffer for transmitting EAP-Req(Identity) */\n/*    pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n    if(pOutBuffer == NULL)\n        return;\n\n\tFrameLen = 0;\n\t\n\t/* Make\t Transmitting frame */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t\t   sizeof(IEEE8021X_FRAME), &Ieee_8021x,\n\t\t\t\t\t   sizeof(EapFrame), &EapFrame, \n\t\t\t\t\t   (sizeof(Data) - 1), Data,\n\t\tEND_OF_ARGS);\n\n\t/* Copy frame to Tx ring */\n\tRTMPToWirelessSta(pAd, pEntry, Header802_3, sizeof(Header802_3), (PUCHAR)pOutBuffer, FrameLen, TRUE);\n\n\tpWpsCtrl->WscRetryCount = 0;\n\tif (pOutBuffer)\n/*\t\tkfree(pOutBuffer); */\n\t\tos_free_mem(NULL, pOutBuffer);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscSendEapReqId\\n\"));\t\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tSend EAPoL-Start packet to AP.\n\n\tArguments:\n\t\tpAd         - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after link up\n\t\t1. Change the correct parameters\n\t\t2. Send EAPOL - START\n\t\t\n\t========================================================================\n*/\nVOID    WscSendEapolStart(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN  PUCHAR          pBssid,\n\tIN  UCHAR\t\t\tCurOpMode)\n{\n\tIEEE8021X_FRAME\t\tPacket;\n\tUCHAR               Header802_3[14];\n\tMAC_TABLE_ENTRY     *pEntry;\n\t\n\tpEntry = MacTableLookup(pAdapter, pBssid);\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (pAdapter->StaCfg.WscControl.WscState >= WSC_STATE_WAIT_WSC_START)\n\t\t\treturn;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscSendEapolStart\\n\"));\n\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\n\t/* 1. Change the authentication to open and encryption to none if necessary. */\n\n\t/* init 802.3 header and Fill Packet */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tMAKE_802_3_HEADER(Header802_3, \n\t\t\t\t\t\t  pBssid,\n\t\t\t\t\t\t  &pAdapter->ApCfg.ApCliTab[0].CurrentAddress[0], \n\t\t\t\t\t\t  EAPOL);\n\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tMAKE_802_3_HEADER(Header802_3, pBssid, &pAdapter->CurrentAddress[0], EAPOL);\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\t/* Zero message 2 body */\n\tNdisZeroMemory(&Packet, sizeof(Packet));\n\tPacket.Version = EAPOL_VER;\n\tPacket.Type    = EAPOLStart;\n\tPacket.Length  = cpu2be16(0);\n\t\n\tif (pEntry)\n\t\tRTMPToWirelessSta(pAdapter, pEntry, Header802_3, sizeof(Header802_3), (PUCHAR)&Packet, 4, TRUE);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\t/* Update WSC status */\n\t\tpAdapter->ApCfg.ApCliTab[0].WscControl.WscStatus = STATUS_WSC_EAPOL_START_SENT;\n\t\tpAdapter->ApCfg.ApCliTab[0].WscControl.WscState = WSC_STATE_WAIT_REQ_ID;\n\t\tif (!pAdapter->ApCfg.ApCliTab[0].WscControl.EapolTimerRunning)\n\t\t{\n\t\t\tpAdapter->ApCfg.ApCliTab[0].WscControl.EapolTimerRunning = TRUE;\n\t\t\tRTMPSetTimer(&pAdapter->ApCfg.ApCliTab[0].WscControl.EapolTimer, WSC_EAPOL_START_TIME_OUT);\n\t\t}\n\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\t/* Update WSC status */\n\t\tpAdapter->StaCfg.WscControl.WscStatus = STATUS_WSC_EAPOL_START_SENT;\n\t\tpAdapter->StaCfg.WscControl.WscState = WSC_STATE_WAIT_REQ_ID;\n\t\tif (!pAdapter->StaCfg.WscControl.EapolTimerRunning)\n\t\t{\n\t\t\tpAdapter->StaCfg.WscControl.EapolTimerRunning = TRUE;\n\t\t\tRTMPSetTimer(&pAdapter->StaCfg.WscControl.EapolTimer, 2000);\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */    \n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscSendEapolStart\\n\"));\n}\n\nVOID\tWscSendEapRspId(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PMAC_TABLE_ENTRY    pEntry,\n\tIN  PWSC_CTRL           pWscControl)\n{\n\tUCHAR               Header802_3[14];\n\tUSHORT\t\t\t\tLength = 0;\n\tIEEE8021X_FRAME\t\tIeee_8021x;\n\tEAP_FRAME\t\t\tEapFrame;\n\tUCHAR\t\t\t\t*pOutBuffer = NULL;\n\tULONG\t\t\t\tFrameLen = 0;\n    UCHAR               regIdentity[] = \"WFA-SimpleConfig-Registrar-1-0\";\n    UCHAR               enrIdentity[] = \"WFA-SimpleConfig-Enrollee-1-0\";\n\tUCHAR\t\t\t\tCurOpMode = 0xff;\n\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\n\t/* 1. Send EAP-Rsp Id */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscSendEapRspId\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tMAKE_802_3_HEADER(Header802_3, \n\t\t\t\t\t\t  &pEntry->Addr[0],\n\t\t\t\t\t\t  &pAdapter->ApCfg.ApCliTab[0].CurrentAddress[0], \n\t\t\t\t\t\t  EAPOL);\n\t\tLength = sizeof(EAP_FRAME) + sizeof(enrIdentity) - 1;\n\t\tpWscControl->WscConfMode = WSC_ENROLLEE; /* Ap Client only support Enrollee now. 20070518 */\n\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT    \n\tif (CurOpMode == STA_MODE)\n\t{\n\t\t/* init 802.3 header and Fill Packet */\n\t\tif (INFRA_ON(pAdapter))\n\t\t{\n\t\t\tMAKE_802_3_HEADER(Header802_3, &pAdapter->CommonCfg.Bssid[0], &pAdapter->CurrentAddress[0], EAPOL);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMAKE_802_3_HEADER(Header802_3, &pWscControl->WscPeerMAC[0], &pAdapter->CurrentAddress[0], EAPOL);\n\t\t}\n\t\t\n\t\t/* Length, -1 NULL pointer of string */\n\t\tif (pWscControl->WscConfMode == WSC_ENROLLEE)\t\n\t\t\tLength = sizeof(EAP_FRAME) + sizeof(enrIdentity) - 1;\n\t\telse if (pWscControl->WscConfMode == WSC_REGISTRAR)\n\t\t\tLength = sizeof(EAP_FRAME) + sizeof(regIdentity) - 1;\n\t}\n\n#endif /* CONFIG_STA_SUPPORT */\n   \t\n\t/* Zero 802.1x body */\n\tNdisZeroMemory(&Ieee_8021x, sizeof(Ieee_8021x));\n\tIeee_8021x.Version = EAPOL_VER;\n\tIeee_8021x.Type    = EAPPacket;\n\tIeee_8021x.Length  = cpu2be16(Length);\n\n\t/* Zero EAP frame */\n\tNdisZeroMemory(&EapFrame, sizeof(EapFrame));\n\tEapFrame.Code   = EAP_CODE_RSP;\n\tEapFrame.Id     = pWscControl->lastId;\n\tEapFrame.Length = cpu2be16(Length);\n\tEapFrame.Type   = EAP_TYPE_ID;\n\n    /* Out buffer for transmitting EAP-Req(Identity) */\n/*    pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n    if(pOutBuffer == NULL)\n        return;\n\n\tFrameLen = 0;\n\n    if (pWscControl->WscConfMode == WSC_REGISTRAR)\n    {\n    \t/* Make\t Transmitting frame */\n    \tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n    \t\tsizeof(IEEE8021X_FRAME), &Ieee_8021x,\n    \t\tsizeof(EapFrame), &EapFrame, \n    \t\t(sizeof(regIdentity) - 1), regIdentity,\n    \t\tEND_OF_ARGS);\n    }\n    else if (pWscControl->WscConfMode == WSC_ENROLLEE)\n    {\n#ifdef IWSC_SUPPORT\n\t\tif (pAdapter->StaCfg.BssType == BSS_ADHOC)\n\t\t\tpWscControl->WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n#endif /* IWSC_SUPPORT */\n        /* Make\t Transmitting frame */\n    \tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n    \t\tsizeof(IEEE8021X_FRAME), &Ieee_8021x,\n    \t\tsizeof(EapFrame), &EapFrame, \n    \t\t(sizeof(enrIdentity) - 1), enrIdentity,\n    \t\tEND_OF_ARGS);\n    }\n    else\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"WscConfMode(%d) is not WSC_REGISTRAR nor WSC_ENROLLEE.\\n\", pWscControl->WscConfMode));\t\n        goto out;\n    }\n\n\t/* Copy frame to Tx ring */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tRTMPToWirelessSta(pAdapter, pEntry, Header802_3, sizeof(Header802_3), (PUCHAR)pOutBuffer, FrameLen, TRUE);\n\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\t\n\tif (CurOpMode == STA_MODE)\n\t\tRTMPToWirelessSta((PRTMP_ADAPTER)pWscControl->pAd, &pAdapter->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\t\tHeader802_3, LENGTH_802_3, (PUCHAR)pOutBuffer, FrameLen, TRUE);\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpWscControl->WscRetryCount = 0;\n    if (!pWscControl->EapolTimerRunning)\n    {\n        pWscControl->EapolTimerRunning = TRUE;\n        RTMPSetTimer(&pWscControl->EapolTimer, WSC_EAP_ID_TIME_OUT);\n    }\nout:\n\tif (pOutBuffer)\n/* \t   kfree(pOutBuffer); */\n\t\tos_free_mem(NULL, pOutBuffer);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscSendEapRspId\\n\"));\t\n}\n\nVOID WscUPnPErrHandle(\n\tIN PRTMP_ADAPTER pAd,\n\tIN  PWSC_CTRL\tpWscControl,\n\tIN UINT eventID)\n{\n\tint dataLen;\n\tUCHAR *pWscData;\n\tUCHAR\tCurOpMode;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Into WscUPnPErrHandle, send WSC_OPCODE_UPNP_CTRL with eventID=0x%x!\\n\", eventID));\n\n#ifdef P2P_SUPPORT\n\treturn;\n#endif /* P2P_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n\tos_alloc_mem(NULL, (UCHAR **)&pWscData, WSC_MAX_DATA_LEN);\n\tif (pWscData != NULL)\n\t{\n\t\tNdisZeroMemory(pWscData, WSC_MAX_DATA_LEN);\n\t\n\t\tdataLen = BuildMessageNACK(pAd, pWscControl, pWscData);\n\t\tWscSendUPnPMessage(pAd, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_DATA, WSC_UPNP_DATA_SUB_NORMAL, \n\t\t\t\t\t\t\t\tpWscData, dataLen, eventID, 0, NULL, CurOpMode);\n\t\n\t\tos_free_mem(NULL, pWscData);\n\t} \n\telse \n\t{\n\t\tWscSendUPnPMessage(pAd, (pWscControl->EntryIfIdx & 0x0F), \n\t\t\t\t\t\t\t\tWSC_OPCODE_UPNP_CTRL, 0, NULL, 0, eventID, 0, NULL, CurOpMode);\n\t}\n}\n\n/*\n\tFormat of iwcustom msg WSC clientJoin message:\n\t\t1. SSID which station want to probe(32 bytes):\n\t\t\t<SSID string>\n\t\t\t*If the length if SSID string is small than 32 bytes, fill 0x0 for remaining bytes.\n\t\t2. sender MAC address(6 bytes):\n\t\t3. Status:\n\t\t\tSet as 1 means change APStatus as 1. \n\t\t\tSet as 2 means change STAStatus as 1.\n\t\t\tSet as 3 means trigger msg.\n\t\t\t\t\t\t\t\t\n\t\t\t32         6        1 \n\t\t+----------+--------+------+\n\t\t|SSIDString| SrcMAC |Status|\n*/\nint WscSendUPnPConfReqMsg(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR apIdx,\n\tIN PUCHAR ssidStr,\n\tIN PUCHAR macAddr,\n\tIN INT\t  Status,\n\tIN UINT   eventID,\n\tIN UCHAR  CurOpMode)\n{\n\tUCHAR pData[39] = {0};\n\t\n#ifdef P2P_SUPPORT\n\tif (apIdx >= MIN_NET_DEVICE_FOR_P2P_CLI)\n\t\treturn 0;\n#endif /* P2P_SUPPORT */\n\n\tstrncpy((PSTRING) pData, (PSTRING)ssidStr, strlen((PSTRING) ssidStr));\n\tNdisMoveMemory(&pData[32], macAddr, MAC_ADDR_LEN);\n\tpData[38] = Status;\n\tWscSendUPnPMessage(pAd, apIdx, WSC_OPCODE_UPNP_MGMT, WSC_UPNP_MGMT_SUB_CONFIG_REQ, \n\t\t\t\t\t\t\t&pData[0], 39, eventID, 0, NULL, CurOpMode);\n\n\treturn 0;\n}\n\n\t\n/*\n\tNETLINK tunnel msg format send to WSCUPnP handler in user space:\n\t1. Signature of following string(Not include the quote, 8 bytes)\n\t\t\t\"RAWSCMSG\"\n\t2. eID: eventID (4 bytes)\n\t\t\tthe ID of this message(4 bytes)\n\t3. aID: ackID (4 bytes)\n\t\t\tmeans that which event ID this mesage was response to.\n\t4. TL:  Message Total Length (4 bytes) \n\t\t\tTotal length of this message.\n\t5. F:   Flag (2 bytes)\n\t\t\tused to notify some specific character of this msg segment.\n\t\t\t\tBit 1: fragment\n\t\t\t\t\tset as 1 if netlink layer have more segment of this Msg need to send.\n\t\t\t\tBit 2~15: reserve, should set as 0 now.\n\t5. SL:  Segment Length(2 bytes)\n\t\t\tmsg actual length in this segment, The SL may not equal the \"TL\" field if \"F\" ==1\n\t6. devMac: device mac address(6 bytes)\n\t\t\tIndicate the netdevice which this msg belong. For the wscd in user space will \n\t\t\tdepends this address dispatch the msg to correct UPnP Device instance to handle it.\n\t7. \"WSC_MSG\" info:\n\n                 8                 4       4       4      2    2        6      variable length(MAXIMUM=232)\n\t+------------+----+----+----+--+--+------+------------------------+\n\t|  Signature       |eID  |aID  | TL   | F | SL|devMac| WSC_MSG                          |\n\n*/\nint WscSendUPnPMessage(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN UCHAR\t\t\tdevIfIdx,\n\tIN USHORT\t\t\tmsgType,\n\tIN USHORT\t\t\tmsgSubType,\n\tIN PUCHAR\t\t\tpData,\n\tIN INT\t\t\t\tdataLen,\n\tIN UINT\t\t\t\teventID,\n\tIN UINT\t\t\t\ttoIPAddr,\n\tIN PUCHAR\t\t\tpMACAddr,\n\tIN UCHAR\t\t\tCurOpMode)\n{\n/*\tunion iwreq_data wrqu; */\n\tRTMP_WSC_NLMSG_HDR *pNLMsgHdr;\n\tRTMP_WSC_MSG_HDR *pWscMsgHdr;\n\t\n\tUCHAR hdrBuf[42]; /*RTMP_WSC_NLMSG_HDR_LEN + RTMP_WSC_MSG_HDR_LEN */\n\tint totalLen, leftLen, copyLen;\n\tPUCHAR pBuf = NULL, pBufPtr = NULL, pPos = NULL;\n\tPUCHAR\tpDevAddr = NULL;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\tbssIdx = devIfIdx;\n#endif /* CONFIG_AP_SUPPORT */\n\tULONG Now;\n\n#ifdef P2P_SUPPORT\n\tif (devIfIdx >= MIN_NET_DEVICE_FOR_P2P_CLI)\n\t\treturn 0;\n#endif /* P2P_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscSendUPnPMessage\\n\"));\n\n\tif ((msgType & WSC_OPCODE_UPNP_MASK) != WSC_OPCODE_UPNP_MASK)\n\t\treturn FALSE;\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (devIfIdx & MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\n\t\t\tbssIdx &= (~MIN_NET_DEVICE_FOR_APCLI);\n\t\t\tif (bssIdx >= MAX_APCLI_NUM)\n\t\t\t\treturn FALSE;\n\t\t\tpDevAddr = &pAd->ApCfg.ApCliTab[bssIdx].CurrentAddress[0];\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\tpDevAddr = &pAd->ApCfg.MBSSID[bssIdx].Bssid[0];\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tpDevAddr = &pAd->CurrentAddress[0];\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pDevAddr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pDevAddr == NULL!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t/*Prepare the NLMsg header */\n\tmemset(hdrBuf, 0, sizeof(hdrBuf));\n\tpNLMsgHdr = (RTMP_WSC_NLMSG_HDR *)hdrBuf;\n\tmemcpy(pNLMsgHdr, WSC_MSG_SIGNATURE, RTMP_WSC_NLMSG_SIGNATURE_LEN);\n\n\tNdisGetSystemUpTime(&Now);\n\tpNLMsgHdr->envID = Now;\n\tpNLMsgHdr->ackID = eventID;\n\tpNLMsgHdr->msgLen = dataLen + RTMP_WSC_MSG_HDR_LEN;\n\n\t/* \n\t\tIn order to support multiple wscd, we need this new field to notify \n\t\tthe wscd which interface this msg send from.\n\t*/\n\tNdisMoveMemory(&pNLMsgHdr->devAddr[0],  pDevAddr, MAC_ADDR_LEN);\n\n\t/*Prepare the WscMsg header */\n\tpWscMsgHdr = (RTMP_WSC_MSG_HDR *)(hdrBuf + sizeof(RTMP_WSC_NLMSG_HDR));\n\tswitch(msgType)\n\t{\n\t\tcase WSC_OPCODE_UPNP_DATA:\n\t\t\t\tpWscMsgHdr->msgType = WSC_OPCODE_UPNP_DATA;\n\t\t\t\tbreak;\n\t\tcase WSC_OPCODE_UPNP_MGMT:\n\t\t\t\tpWscMsgHdr->msgType = WSC_OPCODE_UPNP_MGMT;\n\t\t\t\tbreak;\n\t\tcase WSC_OPCODE_UPNP_CTRL:\n\t\t\t\tpWscMsgHdr->msgType = WSC_OPCODE_UPNP_CTRL;\n\t\t\t\tbreak;\n\t\tdefault:\n\t\t\t\treturn FALSE;\n\t}\n\tpWscMsgHdr->msgSubType = msgSubType;\n\tpWscMsgHdr->ipAddr = toIPAddr;\n\tpWscMsgHdr->msgLen = dataLen;\n\t\n\tif ((pWscMsgHdr->msgType == WSC_OPCODE_UPNP_DATA) && \n\t\t(eventID == 0) &&\n\t\t(pMACAddr != NULL) && \n\t\t(NdisEqualMemory(pMACAddr, ZERO_MAC_ADDR, MAC_ADDR_LEN) == FALSE))\n\t{\n\t\tpWscMsgHdr->msgSubType |= WSC_UPNP_DATA_SUB_INCLUDE_MAC;\n\t\tpNLMsgHdr->msgLen += MAC_ADDR_LEN;\n\t\tpWscMsgHdr->msgLen += MAC_ADDR_LEN;\n\t}\n\t\n\t/*Allocate memory and copy the msg. */\n\ttotalLen = leftLen = pNLMsgHdr->msgLen;\n\tpPos = pData;\n\tos_alloc_mem(NULL, (UCHAR **)&pBuf, IWEVCUSTOM_MSG_MAX_LEN);\n/*\tif((pBuf = kmalloc(IWEVCUSTOM_MSG_MAX_LEN, GFP_ATOMIC)) != NULL) */\n\tif (pBuf != NULL)\n\t{\n\t\tint firstSeg = 1;\n\t\n\t\twhile(leftLen)\n\t\t{\n\t\t\t/*Prepare the payload */\n\t\t\tmemset(pBuf, 0, IWEVCUSTOM_MSG_MAX_LEN);\n\n\t\t\tpNLMsgHdr->segLen = (leftLen > IWEVCUSTOM_PAYLOD_MAX_LEN ? IWEVCUSTOM_PAYLOD_MAX_LEN : leftLen);\n\t\t\tleftLen -= pNLMsgHdr->segLen;\n\t\t\tpNLMsgHdr->flags = (leftLen > 0 ? 1 : 0);\n\n\t\t\tmemcpy(pBuf, pNLMsgHdr, RTMP_WSC_NLMSG_HDR_LEN);\n\t\t\tpBufPtr = &pBuf[RTMP_WSC_NLMSG_HDR_LEN];\n\n\t\t\tif(firstSeg){\n\t\t\t\tmemcpy(pBufPtr, pWscMsgHdr, RTMP_WSC_MSG_HDR_LEN);\n\t\t\t\tpBufPtr += RTMP_WSC_MSG_HDR_LEN;\n\t\t\t\tcopyLen = (pNLMsgHdr->segLen - RTMP_WSC_MSG_HDR_LEN);\n\t\t\t\tif ((pWscMsgHdr->msgSubType & WSC_UPNP_DATA_SUB_INCLUDE_MAC) == WSC_UPNP_DATA_SUB_INCLUDE_MAC)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pBufPtr, pMACAddr, MAC_ADDR_LEN);\n\t\t\t\t\tpBufPtr += MAC_ADDR_LEN;\n\t\t\t\t\tcopyLen -= MAC_ADDR_LEN;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(pBufPtr, pPos, copyLen);\n\t\t\t\tpPos += copyLen;\n\t\t\t\tfirstSeg = 0;\n\t\t\t} else {\n\t\t\t\tNdisMoveMemory(pBufPtr, pPos, pNLMsgHdr->segLen);\n\t\t\t\tpPos += pNLMsgHdr->segLen;\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\t/*Send WSC Msg to wscd, msg length = pNLMsgHdr->segLen + sizeof(RTMP_WSC_NLMSG_HDR) */\n\t\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, RT_WSC_UPNP_EVENT_FLAG, NULL, pBuf, pNLMsgHdr->segLen + sizeof(RTMP_WSC_NLMSG_HDR));\n\t\t}\n\t\t\n/*\t\tkfree(pBuf); */\n\t\tos_free_mem(NULL, pBuf);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscSendUPnPMessage\\n\"));\n\treturn TRUE;\n}\n\n\nVOID\tWscSendMessage(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter, \n\tIN  UCHAR               OpCode,\n\tIN  PUCHAR\t\t\t\tpData,\n\tIN  INT\t\t\t\t\tLen,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN  UCHAR               OpMode,\n\tIN  UCHAR               EapType)\n{\n\t/* Inb-EAP Message */\n\tUCHAR               Header802_3[14];\n\tUSHORT\t\t\t\tLength, MsgLen;\n\tIEEE8021X_FRAME\t\tIeee_8021x;\n\tEAP_FRAME\t\t\tEapFrame;\n\tWSC_FRAME\t\t\tWscFrame;\n\tUCHAR\t\t\t\t*pOutBuffer = NULL;\n\tULONG\t\t\t\tFrameLen = 0;\n\tMAC_TABLE_ENTRY     *pEntry;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\t\tbssIdx = (pWscControl->EntryIfIdx & 0x0F);\n#endif /* CONFIG_AP_SUPPORT */\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n    \n\tif ((Len <= 0) && (OpCode != WSC_OPCODE_START) && (OpCode != WSC_OPCODE_FRAG_ACK))\n\t\treturn;\n\n\t/* Send message */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscSendMessage\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t        if (OpMode == AP_MODE)\n\t        {\n\t\t\t\tMAKE_802_3_HEADER(Header802_3, &pWscControl->EntryAddr[0], &pAdapter->ApCfg.MBSSID[bssIdx].Bssid[0], EAPOL);\n\t        }\n#ifdef APCLI_SUPPORT\n\t        else if (OpMode == AP_CLIENT_MODE)\n\t        {\n\t\t\t\tMAKE_802_3_HEADER(Header802_3, &pWscControl->EntryAddr[0], &pAdapter->ApCfg.ApCliTab[0].CurrentAddress[0], EAPOL);\n\t        }\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t        if (OpMode == STA_MODE)\n\t        {\n\t        \tif (INFRA_ON(pAdapter))\n\t        \t{\n\t\t\t\t\tMAKE_802_3_HEADER(Header802_3, &pAdapter->CommonCfg.Bssid[0], &pAdapter->CurrentAddress[0], EAPOL);\n\t        \t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tMAKE_802_3_HEADER(Header802_3, &pWscControl->EntryAddr[0], &pAdapter->CurrentAddress[0], EAPOL);\n\t\t\t\t}\n\t        }\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n    \t/* Length = EAP + WSC_Frame + Payload */\n    \tLength = sizeof(EAP_FRAME) + sizeof(WSC_FRAME) + Len;\n    \t\n\t\tif (pWscControl->bWscFragment && (pWscControl->bWscFirstOne))\n\t\t{\n\t\t\tLength += 2;\n\t\t\tMsgLen = pWscControl->WscTxBufLen + Len;\n\t\t\tMsgLen = htons(MsgLen);\n\t\t}\n\n    \t/* Zero 802.1x body */\n    \tNdisZeroMemory(&Ieee_8021x, sizeof(Ieee_8021x));\n    \tIeee_8021x.Version = EAPOL_VER;\n    \tIeee_8021x.Type    = EAPPacket;\n    \tIeee_8021x.Length  = cpu2be16(Length);\n\n    \t/* Zero EAP frame */\n    \tNdisZeroMemory(&EapFrame, sizeof(EapFrame));\n\n        if (EapType == EAP_CODE_REQ)\n        {\n        \tEapFrame.Code   = EAP_CODE_REQ;\n        \tEapFrame.Id     = ++(pWscControl->lastId);\n        }\n        else\n        {\n            EapFrame.Code   = EAP_CODE_RSP;\n            EapFrame.Id     = pWscControl->lastId; /* same as eap_req id */\n        }\n\n    \tEapFrame.Length = cpu2be16(Length);\n    \tEapFrame.Type   = EAP_TYPE_WSC;\n\n    \t/* Zero WSC Frame */\n    \tNdisZeroMemory(&WscFrame, sizeof(WscFrame));\n    \tWscFrame.SMI[0] = 0x00;\n    \tWscFrame.SMI[1] = 0x37;\n    \tWscFrame.SMI[2] = 0x2A;\n    \tWscFrame.VendorType = cpu2be32(WSC_VENDOR_TYPE);\n    \tWscFrame.OpCode = OpCode;\n    \tWscFrame.Flags  = 0x00;\n\t\tif (pWscControl->bWscFragment && (pWscControl->bWscLastOne == FALSE))\n\t\t\tWscFrame.Flags  |= WSC_MSG_FLAG_MF;\n\n\t\tif (pWscControl->bWscFragment && (pWscControl->bWscFirstOne))\n\t\t{\n\t\t\tWscFrame.Flags  |= WSC_MSG_FLAG_LF;\n\t\t}\n\n        /* Out buffer for transmitting message */\n\tos_alloc_mem(NULL, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n    if(pOutBuffer == NULL)\n            return;\n\n    \tFrameLen = 0;\n    \t\n    \t/* Make\t Transmitting frame */\n    \tif (pData && (Len > 0))\n    \t{\n    \t\tif (pWscControl->bWscFragment && (pWscControl->bWscFirstOne))\n    \t\t{\n    \t\t\tUCHAR\tLF_Len = 2;\n\t\t\t\tULONG\tTmpLen = 0;\n\n\t\t\t\tpWscControl->bWscFirstOne = FALSE;\n    \t\t\tMakeOutgoingFrame(pOutBuffer, &TmpLen,\n\t    \t\t\t\t\t\tsizeof(IEEE8021X_FRAME), &Ieee_8021x,\n\t    \t\t\t\t\t\tsizeof(EapFrame), &EapFrame, \n\t    \t\t\t\t\t\tsizeof(WscFrame), &WscFrame,\n\t    \t\t\t\t\t\tLF_Len, &MsgLen,\n\t        \t\t\t\t\tEND_OF_ARGS);\n\t\t\t\t\n\t\t\t\tFrameLen += TmpLen;\n\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen,\n\t\t    \t\t\t\t\t\tLen, pData,\n\t\t        \t\t\t\t\tEND_OF_ARGS);\n\n\t\t\t\tFrameLen += TmpLen;\n    \t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t    \t\t\t\t\t\tsizeof(IEEE8021X_FRAME), &Ieee_8021x,\n\t\t    \t\t\t\t\t\tsizeof(EapFrame), &EapFrame, \n\t\t    \t\t\t\t\t\tsizeof(WscFrame), &WscFrame,\n\t\t    \t\t\t\t\t\tLen, pData,\n\t\t        \t\t\t\t\tEND_OF_ARGS);\n\t\t\t}\n    \t}\n        else\n            MakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t\t\t\tsizeof(IEEE8021X_FRAME), &Ieee_8021x,\n\t\t\t\t\t\t\tsizeof(EapFrame), &EapFrame, \n\t\t\t\t\t\t\tsizeof(WscFrame), &WscFrame, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t/* Copy frame to Tx ring */\n\tpEntry = MacTableLookup(pAdapter, &pWscControl->EntryAddr[0]);\n\n\tif (pEntry)\n\t\tRTMPToWirelessSta(pAdapter, pEntry, Header802_3, sizeof(Header802_3), (PUCHAR)pOutBuffer, FrameLen, TRUE);\n\telse\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"pEntry is NULL\\n\"));\n    \t\n\tif (pOutBuffer)\n\t\tos_free_mem(NULL, pOutBuffer);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscSendMessage\\n\"));\t\n}\n\nVOID WscBuildBeaconIE(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUCHAR b_configured,\n\tIN\tBOOLEAN b_selRegistrar,\n\tIN\tUSHORT devPwdId,\n\tIN\tUSHORT selRegCfgMethods,\n\tIN  UCHAR apidx,\n\tIN  UCHAR *pAuthorizedMACs,\n\tIN  UCHAR AuthorizedMACsLen,\n\tIN  UCHAR\tCurOpMode)\n{\n\tWSC_IE_HEADER \tieHdr;\n/*\tUCHAR \t\t\tData[256]; */\n\tUCHAR \t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n    USHORT          tempVal = 0;\n\tPWSC_CTRL\t\tpWpsCtrl = NULL;\n\tPWSC_REG_DATA\tpReg = NULL;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 256);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t\tpWpsCtrl = &pAd->ApCfg.MBSSID[apidx & 0x0F].WscControl;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpReg = &pWpsCtrl->RegData;\n \n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscBuildBeaconIE\\n\"));\n\t/* WSC IE HEader */\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; ieHdr.oui[1] = 0x50; ieHdr.oui[2] = 0xF2; \n#ifdef IWSC_SUPPORT\n\tif ((CurOpMode == STA_MODE) && \n\t\t(pAd->StaCfg.BssType == BSS_ADHOC))\n\t\tieHdr.oui[3] = 0x10;\n\telse\n#endif /* IWSC_SUPPORT */\n\tieHdr.oui[3] = 0x04;\n\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Simple Config State */\n\ttemplen = AppendWSCTLV(WSC_ID_SC_STATE, pData, (UINT8 *)&b_configured, 0);\n\tpData += templen;\n\tLen   += templen;\n\t\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\tif ((CurOpMode == AP_MODE) && pWpsCtrl->bSetupLock)\n\t{\n\t\t// AP Setup Lock\n\t\ttemplen = AppendWSCTLV(WSC_ID_AP_SETUP_LOCKED, pData, (UINT8 *)&pWpsCtrl->bSetupLock, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\t}\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif ( b_selRegistrar )\n\t{\n\t\t/* 3.Selected Registrar */\n\t\ttemplen = AppendWSCTLV(WSC_ID_SEL_REGISTRAR, pData, (UINT8 *)&b_selRegistrar, 0);\n    \tpData += templen;\n    \tLen   += templen;\n\n\t\t/*4. Device Password ID */\n\t\ttempVal = htons(devPwdId);\n\t\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_PWD_ID, pData, (UINT8 *)&tempVal, 0);\n    \tpData += templen;\n    \tLen   += templen;\n\n\t\t/* 5. Selected Registrar Config Methods */\n\t\ttempVal = selRegCfgMethods;\n#ifdef IWSC_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n\t\t\tif (pAd->StaCfg.WscControl.WscMode == WSC_PIN_MODE)\n\t\t\t{\n\t\t\t\ttempVal &= 0x200F;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttempVal &= 0x02F0;\n\t\t\t}\n\t\t\tif (pAd->StaCfg.IWscInfo.bLimitedUI)\n\t\t\t{\n\t\t\t\ttempVal &= (~WSC_CONFMET_KEYPAD);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttempVal |= WSC_CONFMET_KEYPAD;\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\ttempVal = htons(tempVal);\n\t\ttemplen = AppendWSCTLV(WSC_ID_SEL_REG_CFG_METHODS, pData, (UINT8 *)&tempVal, 0);\n    \tpData += templen;\n    \tLen   += templen;\n\t}\n\n\t/* 6. UUID last 6 bytes use MAC */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_E, pData, &pWpsCtrl->Wsc_Uuid_E[0], 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 7. RF Bands */\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t\t\ttempVal = 2;\n\t\telse\n\t\t\ttempVal = 1;\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\ttempVal = 2;\n\t\telse\n\t\t\ttempVal = 1;\n\t}\n\n#ifdef RT_BIG_ENDIAN\n\ttempVal =SWAP16(tempVal);\n#endif /* RT_BIG_ENDIAN */\n\ttemplen = AppendWSCTLV(WSC_ID_RF_BAND, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef IWSC_SUPPORT\n\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t(CurOpMode == STA_MODE))\n\t{\n\t\tUCHAR respType;\n\t\t\t\n\t\t// Connection Type Flag ESS\n\t\ttemplen = AppendWSCTLV(WSC_ID_CONN_TYPE, pData, (UINT8 *)&pReg->SelfInfo.ConnTypeFlags, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\n#ifdef IWSC_TEST_SUPPORT\n\t\t/*\n\t\t\tThis modification is for Broadcom test bed.\n\t\t\tBroadcom test bed use same buffer to record IWSC IE from Beacon and Probe Response.\n\t\t\tBut the content of IWSC IE in Beacon is different from Probe Response.\n\t\t*/\n\t\tif ((pWpsCtrl->WscMode == WSC_SMPBC_MODE) &&\n\t\t\t(pWpsCtrl->WscConfMode == WSC_REGISTRAR))\n\t\t{\n\t\t\tBOOLEAN bEntryAcceptable = FALSE;\n\t\t\tBOOLEAN bRegistrationReady = TRUE;\n\t\t\tPIWSC_INFO pIWscInfo = NULL;\n\t\t\t\n\t\t\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\t\t\tif (pIWscInfo->bIWscEntryTimerRunning)\n\t\t\t\tbEntryAcceptable = TRUE;\n\n\t\t\t/* Entry Acceptable (only for IBSS) */\n\t\t\ttemplen = AppendWSCTLV(WSC_ID_ENTRY_ACCEPTABLE, pData, (UINT8 *)&bEntryAcceptable, 0);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\n\t\t\tif (pWpsCtrl->EapMsgRunning)\n\t\t\t\tbRegistrationReady = FALSE;\n\t\t\t\n\t\t\t/* Registration Ready (only for IBSS) */\n\t\t\ttemplen = AppendWSCTLV(WSC_ID_REGISTRATON_READY, pData, (UINT8 *)&bRegistrationReady, 0);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n#endif /* IWSC_TEST_SUPPORT */\t\t\n\t\t/* IWSC IP Address Configuration */\n\t\ttempVal = htons(pAd->StaCfg.IWscInfo.IpConfMethod);\n\t\ttemplen = AppendWSCTLV(WSC_ID_IP_ADDR_CONF_METHOD, pData, (UINT8 *)&tempVal, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\t\t\t\n#ifdef IWSC_TEST_SUPPORT\n\t\t/*\n\t\t\tThis modification is for Broadcom test bed.\n\t\t\tBroadcom test bed use same buffer to record IWSC IE from Beacon and Probe Response.\n\t\t\tBut the content of IWSC IE in Beacon is different from Probe Response.\n\t\t*/\n\n\t\t/* Response Type WSC_ID_RESP_TYPE */\n\t\tif (pAd->StaCfg.WscControl.WscConfMode == WSC_REGISTRAR)\n\t\t\trespType = WSC_MSGTYPE_REGISTRAR;\n\t\telse\n\t\t\trespType = WSC_MSGTYPE_ENROLLEE_OPEN_8021X;\t\t\t\n\t\ttemplen = AppendWSCTLV(WSC_ID_RESP_TYPE, pData, (UINT8 *)&respType, 0);\n\t   \tpData += templen;\n\t   \tLen   += templen;\n#endif /* IWSC_TEST_SUPPORT */\t\t\n\n\t}\n#endif /* IWSC_SUPPORT */\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWpsCtrl->WscV2Info.bEnableWpsV2)\n\t{\n\t\tPWSC_TLV pWscTLV = &pWpsCtrl->WscV2Info.ExtraTlv;\n\t\tWscGenV2Msg(pWpsCtrl, \n\t\t\t\t\tb_selRegistrar, \n\t\t\t\t\tpAuthorizedMACs, \n\t\t\t\t\tAuthorizedMACsLen, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\n#ifdef P2P_SUPPORT\n\t// 12. Primary Device Type\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t// 13. Device Name\n\tNdisZeroMemory(pData, 32 + 4);\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, &pAd->P2pCfg.DeviceName, pAd->P2pCfg.DeviceNameLen);\n\tpData += templen;\n\tLen   += templen;\n#endif /* P2P_SUPPORT */\n\n\tieHdr.length = ieHdr.length + Len;\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tmemcpy(pAd->ApCfg.MBSSID[apidx].WscIEBeacon.Value, &ieHdr, sizeof(WSC_IE_HEADER));\n\t\tmemcpy(pAd->ApCfg.MBSSID[apidx].WscIEBeacon.Value + sizeof(WSC_IE_HEADER), Data, Len);\n\t\tpAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen = sizeof(WSC_IE_HEADER) + Len;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tmemcpy(pAd->StaCfg.WpsIEBeacon.Value, &ieHdr, sizeof(WSC_IE_HEADER));\n\t\tmemcpy(pAd->StaCfg.WpsIEBeacon.Value + sizeof(WSC_IE_HEADER), Data, Len);\n\t\tpAd->StaCfg.WpsIEBeacon.ValueLen = sizeof(WSC_IE_HEADER) + Len;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscBuildBeaconIE\\n\"));\n}\n\nVOID WscBuildProbeRespIE(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUCHAR respType,\n\tIN\tUCHAR scState,\n\tIN\tBOOLEAN b_selRegistrar,\n\tIN\tUSHORT devPwdId,\n\tIN\tUSHORT selRegCfgMethods,\n\tIN  UCHAR apidx,\n\tIN  UCHAR *pAuthorizedMACs,\n\tIN  INT   AuthorizedMACsLen,\n\tIN  UCHAR\tCurOpMode)\n{\n\tWSC_IE_HEADER \tieHdr;\n/*\tUCHAR \t\t\tData[512]; */\n\tUCHAR\t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n\tUSHORT\t\t\ttempVal = 0;\n\tPWSC_CTRL\t\tpWpsCtrl = NULL;\n    PWSC_REG_DATA\tpReg = NULL;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 512);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t\tpWpsCtrl = &pAd->ApCfg.MBSSID[apidx & 0x0F].WscControl;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpReg = &pWpsCtrl->RegData;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscBuildProbeRespIE, apidx = %x\\n\", apidx));\n\n\t/* WSC IE Header */\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; ieHdr.oui[1] = 0x50; ieHdr.oui[2] = 0xF2; \n#ifdef IWSC_SUPPORT\n\tif ((CurOpMode == STA_MODE) &&\n\t\t(pAd->StaCfg.BssType == BSS_ADHOC))\n\t\tieHdr.oui[3] = 0x10;\n\telse\n#endif /* IWSC_SUPPORT */\n\tieHdr.oui[3] = 0x04;\n\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Simple Config State */\n\ttemplen = AppendWSCTLV(WSC_ID_SC_STATE, pData, (UINT8 *)&scState, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\tif ((CurOpMode == AP_MODE) && pWpsCtrl->bSetupLock)\n\t{\n\t\t// AP Setup Lock\n\t\ttemplen = AppendWSCTLV(WSC_ID_AP_SETUP_LOCKED, pData, (UINT8 *)&pWpsCtrl->bSetupLock, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\t}\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\tif ( b_selRegistrar )\n\t{\n\t\t/* 3. Selected Registrar */\n\t\ttemplen = AppendWSCTLV(WSC_ID_SEL_REGISTRAR, pData, (UINT8 *)&b_selRegistrar, 0);\n    \tpData += templen;\n    \tLen   += templen;\n\n\t\t/* 4. Device Password ID */\n\t\ttempVal = htons(devPwdId);\n\t\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_PWD_ID, pData, (UINT8 *)&tempVal, 0);\n    \tpData += templen;\n    \tLen   += templen;\n\n\t\t/* 5. Selected Registrar Config Methods */\n#ifdef IWSC_SUPPORT\n\t\tif ((CurOpMode == STA_MODE) && \n\t\t\t(pAd->StaCfg.IWscInfo.bSelRegStart == FALSE))\n\t\t{\n\t\t\tif (pWpsCtrl->WscMode == WSC_PIN_MODE)\n\t\t\t{\n\t\t\t\tselRegCfgMethods &= 0x200F;\n\t\t\t\tif (pAd->StaCfg.IWscInfo.bLimitedUI)\n\t\t\t\t{\n\t\t\t\t\tselRegCfgMethods &= (~WSC_CONFMET_KEYPAD);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tselRegCfgMethods |= WSC_CONFMET_KEYPAD;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tselRegCfgMethods &= 0x02F0;\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\ttempVal = htons(selRegCfgMethods);\n\t\ttemplen = AppendWSCTLV(WSC_ID_SEL_REG_CFG_METHODS, pData, (UINT8 *)&tempVal, 0);\n    \tpData += templen;\n    \tLen   += templen;\n\n#ifdef IWSC_SUPPORT\n\t\tif ((CurOpMode == STA_MODE) && pAd->StaCfg.IWscInfo.bSelRegStart)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, pAd->StaCfg.IWscInfo.RegMacAddr, 0);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t\tpAd->StaCfg.IWscInfo.bSelRegStart = FALSE;\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t}\n\n\t/* 6. Response Type WSC_ID_RESP_TYPE */\n\ttemplen = AppendWSCTLV(WSC_ID_RESP_TYPE, pData, (UINT8 *)&respType, 0);\n   \tpData += templen;\n   \tLen   += templen;\n\n\t/* 7. UUID last 6 bytes use MAC */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_E, pData, &pWpsCtrl->Wsc_Uuid_E[0], 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 8. Manufacturer */\n\tNdisZeroMemory(pData, 64 + 4);\n    templen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData,  pReg->SelfInfo.Manufacturer, strlen((PSTRING) pReg->SelfInfo.Manufacturer));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 9. Model Name */\n\tNdisZeroMemory(pData, 32 + 4);\n    templen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pReg->SelfInfo.ModelName, strlen((PSTRING) pReg->SelfInfo.ModelName));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 10. Model Number */\n\tNdisZeroMemory(pData, 32 + 4);\n    templen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pReg->SelfInfo.ModelNumber, strlen((PSTRING) pReg->SelfInfo.ModelNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 11. Serial Number */\n\tNdisZeroMemory(pData, 32 + 4);\n    templen = AppendWSCTLV(WSC_ID_SERIAL_NUM, pData, pReg->SelfInfo.SerialNumber, strlen((PSTRING) pReg->SelfInfo.SerialNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 12. Primary Device Type */\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 13. Device Name */\n\tNdisZeroMemory(pData, 32 + 4);\n    templen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, pReg->SelfInfo.DeviceName, strlen((PSTRING) pReg->SelfInfo.DeviceName));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 14. Config Methods */\n\t/*tempVal = htons(0x008a); */\n\t/*tempVal = htons(0x0084); */\n#ifdef P2P_SUPPORT\n\t/*\n\t\tSome P2P Device will check this config method for PBC. (ex. Samsung GALAXYSII)\n\t\tIf this config method doesn't include PBC, some P2P Device doesn't send provision request if we are P2P GO.\n\t*/\n\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t{\n\t\tif (pAd->P2pCfg.bSigmaEnabled) \n\t\t\ttempVal = pWpsCtrl->WscConfigMethods & 0xff7f;/* patch p2p sigma 4.2.2 (Version 5.0) */\n\t\telse\n\t\ttempVal = pWpsCtrl->WscConfigMethods;\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n\t\t/*\n\t\t\tWSC 1.0 WCN logo testing will check the value of config method in probe response and M1.\n\t\t\tConfig method shall be identical in probe response and M1.\n\t\t*/\n#ifdef WSC_V2_SUPPORT\n\t\tif (pWpsCtrl->WscV2Info.bEnableWpsV2)\n\ttempVal = pWpsCtrl->WscConfigMethods & 0xF97F;\n\t\telse\n#endif /* WSC_V2_SUPPORT */\n\t\t\ttempVal = pWpsCtrl->WscConfigMethods & 0x00FF;\n\t}\n\n\ttempVal = htons(tempVal);\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_METHODS, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\n\t/* 15. RF Bands */\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t\t\ttempVal = 2;\n\t\telse\n\t\t\ttempVal = 1;\n\t}\n\telse\n\t{\n\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\ttempVal = 2;\n\t\telse\n\t\t\ttempVal = 1;\n\t}\n#ifdef RT_BIG_ENDIAN\n\ttempVal =SWAP16(tempVal);\n#endif /* RT_BIG_ENDIAN */\n    templen = AppendWSCTLV(WSC_ID_RF_BAND, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n     \n#ifdef IWSC_SUPPORT\n\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t(CurOpMode == STA_MODE))\n\t{\n\t\t/* Connection Type Flag ESS */\n\t\ttemplen = AppendWSCTLV(WSC_ID_CONN_TYPE, pData, (UINT8 *)&pReg->SelfInfo.ConnTypeFlags, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\n\t\tif ((pWpsCtrl->WscMode == WSC_SMPBC_MODE) &&\n\t\t\t(pWpsCtrl->WscConfMode == WSC_REGISTRAR))\n\t\t{\n\t\t\tBOOLEAN bEntryAcceptable = FALSE;\n\t\t\tBOOLEAN bRegistrationReady = TRUE;\n\t\t\tPIWSC_INFO pIWscInfo = NULL;\n\t\t\t\n\t\t\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\t\t\tif (pIWscInfo->bIWscEntryTimerRunning)\n\t\t\t\tbEntryAcceptable = TRUE;\n\n\t\t\t/* Entry Acceptable (only for IBSS) */\n\t\t\ttemplen = AppendWSCTLV(WSC_ID_ENTRY_ACCEPTABLE, pData, (UINT8 *)&bEntryAcceptable, 0);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\n\t\t\tif (pWpsCtrl->EapMsgRunning)\n\t\t\t\tbRegistrationReady = FALSE;\n\t\t\t\n\t\t\t/* Registration Ready (only for IBSS) */\n\t\t\ttemplen = AppendWSCTLV(WSC_ID_REGISTRATON_READY, pData, (UINT8 *)&bRegistrationReady, 0);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\n\t\t/* IWSC IP Address Configuration */\n\t\ttempVal = htons(pAd->StaCfg.IWscInfo.IpConfMethod);\n\t\ttemplen = AppendWSCTLV(WSC_ID_IP_ADDR_CONF_METHOD, pData, (UINT8 *)&tempVal, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\t}\n#endif /* IWSC_SUPPORT */\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWpsCtrl->WscV2Info.bEnableWpsV2)\n\t{\n\t\tPWSC_TLV pWscTLV = &pWpsCtrl->WscV2Info.ExtraTlv;\n\t\tWscGenV2Msg(pWpsCtrl, \n\t\t\t\t\tb_selRegistrar, \n\t\t\t\t\tpAuthorizedMACs, \n\t\t\t\t\tAuthorizedMACsLen, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\n\tif (Len > 251)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Len is overflow!\\n\"));\n\t}\n     \n\tieHdr.length = ieHdr.length + Len;\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tmemcpy(pAd->ApCfg.MBSSID[apidx & 0xF].WscIEProbeResp.Value, &ieHdr, sizeof(WSC_IE_HEADER));\n\t\tmemcpy(pAd->ApCfg.MBSSID[apidx & 0xF].WscIEProbeResp.Value + sizeof(WSC_IE_HEADER), Data, Len);\n\t\tpAd->ApCfg.MBSSID[apidx & 0xF].WscIEProbeResp.ValueLen = sizeof(WSC_IE_HEADER) + Len;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tmemcpy(pAd->StaCfg.WpsIEProbeResp.Value, &ieHdr, sizeof(WSC_IE_HEADER));\n\t\tmemcpy(pAd->StaCfg.WpsIEProbeResp.Value + sizeof(WSC_IE_HEADER), Data, Len);\n\t\tpAd->StaCfg.WpsIEProbeResp.ValueLen = sizeof(WSC_IE_HEADER) + Len;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscBuildProbeRespIE\\n\"));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tAp send EAP-Fail to station\n\n\tArguments:\n\t\tpAd    - NIC Adapter pointer\n\t\tId\t\t\t- ID between EAP-Req and EAP-Rsp pair\n\t\tpEntry\t\t- The Station Entry information\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\t========================================================================\n*/\nVOID\tWscSendEapFail(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN  BOOLEAN\t\t\t\tbSendDeAuth)\n{\n\tUCHAR               Header802_3[14];\n\tUSHORT\t\t\t\tLength;\n\tIEEE8021X_FRAME\t\tIeee_8021x;\n\tEAP_FRAME\t\t\tEapFrame;\n\tUCHAR\t\t\t\t*pOutBuffer = NULL;\n\tULONG\t\t\t\tFrameLen = 0;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\t\tapidx = (pWscControl->EntryIfIdx & 0x0F);\n#endif /* CONFIG_AP_SUPPORT */\n\tMAC_TABLE_ENTRY     *pEntry;\t\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\t\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\t\n\t/* 1. Send EAP-Rsp Id */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscSendEapFail\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\tMAKE_802_3_HEADER(Header802_3, \n\t\t\t\t\t  &pWscControl->EntryAddr[0], \n\t\t\t\t\t  &pAd->ApCfg.MBSSID[apidx].Bssid[0],\n\t\t\t\t\t  EAPOL);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tMAKE_802_3_HEADER(Header802_3, \n\t\t\t\t\t\t  &pWscControl->EntryAddr[0],\n\t\t\t\t\t\t  &pAd->CurrentAddress[0], \n\t\t\t\t\t\t  EAPOL);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* Length, -1 type size, Eap-Fail doesn't need Type item */\n\tLength = sizeof(EAP_FRAME) - sizeof(UCHAR);\n\t\n\t/* Zero 802.1x body */\n\tNdisZeroMemory(&Ieee_8021x, sizeof(Ieee_8021x));\n\tIeee_8021x.Version = EAPOL_VER;\n\tIeee_8021x.Type    = EAPPacket;\n\tIeee_8021x.Length  = cpu2be16(Length);\n\n\t/* Zero EAP frame */\n\tNdisZeroMemory(&EapFrame, sizeof(EapFrame));\n\tEapFrame.Code   = EAP_CODE_FAIL;\n\tEapFrame.Id     = pWscControl->lastId;\n\tEapFrame.Length = cpu2be16(Length);\n\t\n    /* Out buffer for transmitting EAP-Req(Identity) */\n/*    pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&pOutBuffer, MAX_LEN_OF_MLME_BUFFER);\n    if(pOutBuffer == NULL)\n        return;\n\n\tFrameLen = 0;\n\t\n\t/* Make\t Transmitting frame */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t\t  sizeof(IEEE8021X_FRAME), &Ieee_8021x,\n\t\t\t\t\t  sizeof(EapFrame)-1, &EapFrame, END_OF_ARGS);\n\n\tpEntry = MacTableLookup(pAd, &pWscControl->EntryAddr[0]);\n\t/* Copy frame to Tx ring */\n\tRTMPToWirelessSta(pAd, pEntry, Header802_3, sizeof(Header802_3), (PUCHAR)pOutBuffer, FrameLen, TRUE);\n\n\n\tif (pOutBuffer)\n/*\t\tkfree(pOutBuffer); */\n\t\tos_free_mem(NULL, pOutBuffer);\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (pEntry && bSendDeAuth && (CurOpMode == AP_MODE))\n\t{\n\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DEAUTH_STA_LEAVING, TRUE);\t\t\n\t}\n\tif (pEntry == NULL)\n\t{\n\t\t/*\n\t\t\tIf STA dis-connect un-normally, reset EntryAddr here.\n\t\t*/\n\t\tNdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscSendEapFail\\n\"));\t\n}\n\n#ifdef CONFIG_AP_SUPPORT\nVOID WscBuildAssocRespIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  UCHAR \t\t\tApIdx,\n\tIN  UCHAR\t\t\tReason,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen)\n{\n\tWSC_IE_HEADER \tieHdr;\n/*\tUCHAR \t\t\tData[512] = {0}; */\n\tUCHAR \t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n\tUINT8\t\t\ttempVal = 0;\n    PWSC_REG_DATA\tpReg = (PWSC_REG_DATA) &pAd->ApCfg.MBSSID[ApIdx].WscControl.RegData;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscBuildAssocRespIE\\n\"));\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 512);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tData[0] = 0;\n\n\t/* WSC IE Header */\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; ieHdr.oui[1] = 0x50;\n    ieHdr.oui[2] = 0xF2; ieHdr.oui[3] = 0x04;\n\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Request Type */\n\ttempVal = WSC_MSGTYPE_AP_WLAN_MGR;\n\ttemplen = AppendWSCTLV(WSC_ID_RESP_TYPE, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pAd->ApCfg.MBSSID[ApIdx].WscControl.WscV2Info.bEnableWpsV2)\n\t{\n\t\tWscGenV2Msg(&pAd->ApCfg.MBSSID[ApIdx].WscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n     \n\tieHdr.length = ieHdr.length + Len;\n\tNdisMoveMemory(pOutBuf, &ieHdr, sizeof(WSC_IE_HEADER));\n\tNdisMoveMemory(pOutBuf + sizeof(WSC_IE_HEADER), Data, Len);\n\t*pIeLen = sizeof(WSC_IE_HEADER) + Len;\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscBuildAssocRespIE\\n\"));\n}\n\n\nVOID WscSelectedRegistrar(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\tpReginfo,\n\tIN\tUINT\tLength,\n\tIN  UCHAR\tapidx)\n{\n\tPUCHAR\tpData;\n\tINT\t\tIsAPConfigured;\n\tUCHAR   wsc_version, wsc_sel_reg = 0;\n\tUSHORT\twsc_dev_pass_id = 0, wsc_sel_reg_conf_mthd = 0;\n\tUSHORT\tWscType, WscLen;\n\tPUCHAR\tpAuthorizedMACs = NULL;\n\tUCHAR\tAuthorizedMACsLen = 0;\n\tPWSC_CTRL\tpWscCtrl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\n\tpData = (PUCHAR)pReginfo;\n\n\tif (Length < 4)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSelectedRegistrar --> Unknown IE \\n\"));\n\t\treturn;\n\t}\n\t\n\thex_dump(\"WscSelectedRegistrar - Reginfo\", pReginfo, Length);\n\twhile (Length > 4)\n\t{\n\t    /* arm-cpu has packet alignment issue, it's better to use memcpy to retrieve data */\n\t\tNdisMoveMemory(&WscType, pData, 2);\n\t\tNdisMoveMemory(&WscLen,  pData + 2, 2);\n\t\tWscLen = ntohs(WscLen);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\t\tswitch (ntohs(WscType))\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\twsc_version = *pData;\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_SEL_REGISTRAR:\n\t\t\t\twsc_sel_reg = *pData;\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_DEVICE_PWD_ID:\n\t\t\t\tNdisMoveMemory(&wsc_dev_pass_id, pData, sizeof(USHORT));\n\t\t\t\twsc_dev_pass_id = be2cpu16(wsc_dev_pass_id);\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_SEL_REG_CFG_METHODS:\n\t\t\t\tNdisMoveMemory(&wsc_sel_reg_conf_mthd, pData, sizeof(USHORT));\n\t\t\t\twsc_sel_reg_conf_mthd = be2cpu16(wsc_sel_reg_conf_mthd);\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_VENDOR_EXT:\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tif (pWscCtrl->WscV2Info.bEnableWpsV2 && (WscLen > 0))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tFind WFA_EXT_ID_AUTHORIZEDMACS\n\t\t\t\t\t*/\n\t\t\t\t\tos_alloc_mem(NULL, &pAuthorizedMACs, WscLen);\n\t\t\t\t\tif (pAuthorizedMACs)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pAuthorizedMACs, WscLen);\n\t\t\t\t\t\tWscParseV2SubItem(WFA_EXT_ID_AUTHORIZEDMACS, pData, WscLen, pAuthorizedMACs, &AuthorizedMACsLen);\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSelectedRegistrar --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\n\tIsAPConfigured = pWscCtrl->WscConfStatus;\n\n\tif (wsc_sel_reg == 0x01)\n\t{\n\t\tpWscCtrl->WscSelReg = 1;\n\t\tWscBuildBeaconIE(pAd, WSC_SCSTATE_CONFIGURED, TRUE, wsc_dev_pass_id, wsc_sel_reg_conf_mthd, apidx, pAuthorizedMACs, AuthorizedMACsLen, AP_MODE);\n\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, TRUE, wsc_dev_pass_id, wsc_sel_reg_conf_mthd, pWscCtrl->EntryIfIdx, pAuthorizedMACs, AuthorizedMACsLen, AP_MODE);\t\t\n#ifdef WSC_V2_SUPPORT\n\t\thex_dump(\"WscSelectedRegistrar - AuthorizedMACs::\", pAuthorizedMACs, AuthorizedMACsLen);\n\t\tif ((AuthorizedMACsLen == 6) && \n\t\t\t(NdisEqualMemory(pAuthorizedMACs, BROADCAST_ADDR, MAC_ADDR_LEN) == FALSE) &&\n\t\t\t(NdisEqualMemory(pAuthorizedMACs, ZERO_MAC_ADDR, MAC_ADDR_LEN) == FALSE) &&\n\t\t\t(pWscCtrl->WscState <= WSC_STATE_WAIT_M3))\n\t\t{\n\t\t\tPWSC_PEER_ENTRY\tpWscPeer = NULL;\n\t\t\tNdisMoveMemory(pWscCtrl->EntryAddr, pAuthorizedMACs, MAC_ADDR_LEN);\n\t\t\tRTMP_SEM_LOCK(&pWscCtrl->WscPeerListSemLock);\n\t\t\tWscClearPeerList(&pWscCtrl->WscPeerList);\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pWscPeer, sizeof(WSC_PEER_ENTRY));\n\t\t\tif (pWscPeer)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pWscPeer, sizeof(WSC_PEER_ENTRY));\n\t\t\t\tNdisMoveMemory(pWscPeer->mac_addr, pAuthorizedMACs, MAC_ADDR_LEN);\n\t\t\t\tNdisGetSystemUpTime(&pWscPeer->receive_time);\n\t\t\t\tinsertTailList(&pWscCtrl->WscPeerList, \n\t\t\t\t\t\t\t\t(PLIST_ENTRY)pWscPeer);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSelectedRegistrar --> Add this MAC to WscPeerList\\n\"));\n\t\t\t}\n\t\t\tASSERT(pWscPeer != NULL);\n\t\t\tRTMP_SEM_UNLOCK(&pWscCtrl->WscPeerListSemLock);\n\t\t}\n#endif /* WSC_V2_SUPPORT */\n\t}\n\telse\n\t{\n\t\tpWscCtrl->WscSelReg = 0;\n\t\tWscBuildBeaconIE(pAd, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, apidx, NULL, 0, AP_MODE);\n\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, pWscCtrl->EntryIfIdx, NULL, 0, AP_MODE);\n\t}\n\tAPUpdateBeaconFrame(pAd, apidx);\n\n#ifdef WSC_V2_SUPPORT\n\tif (pAuthorizedMACs)\n\t\tos_free_mem(NULL, pAuthorizedMACs);\n#endif /* WSC_V2_SUPPORT */\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tMake WSC IE for the ProbeReq frame\n\n\tArguments:\n\t\tpAd    - NIC Adapter pointer\n\t\tpOutBuf\t\t- all of WSC IE field \n\t\tpIeLen\t\t- length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tNone\n\t\t\n\t========================================================================\n*/\nVOID WscBuildProbeReqIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  UCHAR\t\t\tCurOpMode,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen)\n{\n/*\tUCHAR\t\t\tWscIEFixed[] = {0xdd, 0x0e, 0x00, 0x50, 0xf2, 0x04};\t// length will modify later */\n\tWSC_IE_HEADER \tieHdr;\n/*\tUCHAR\t\t\tOutMsgBuf[512];\t\t// buffer to create message contents */\n\tUCHAR\t\t\t*OutMsgBuf = NULL;\t\t/* buffer to create message contents */\n\tINT\t\t\t\tLen =0, templen = 0;\n\tPUCHAR\t\t\tpData;\n\tUSHORT          tempVal = 0;\n\tPWSC_REG_DATA\tpReg = (PWSC_REG_DATA) &pAd->StaCfg.WscControl.RegData;\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"-----> WscBuildProbeReqIE\\n\"));\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&OutMsgBuf, 512);\n\tif (OutMsgBuf == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* WSC IE Header */\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; ieHdr.oui[1] = 0x50; ieHdr.oui[2] = 0xF2; \n#ifdef IWSC_SUPPORT\n\tif ((CurOpMode == STA_MODE) && (pAd->StaCfg.BssType == BSS_ADHOC))\n\t\tieHdr.oui[3] = 0x10;\n\telse\n#endif // IWSC_SUPPORT //\t\n\tieHdr.oui[3] = 0x04;\n\n\tpData = (PUCHAR) &OutMsgBuf[0];\n\tLen = 0;\n\t\t\t\t\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Request Type */\n\tif (pAd->StaCfg.WscControl.WscConfMode == WSC_REGISTRAR)\n\t\ttempVal = WSC_MSGTYPE_REGISTRAR;\n\telse if (pAd->StaCfg.WscControl.WscConfMode == WSC_ENROLLEE)\n\t\ttempVal = WSC_MSGTYPE_ENROLLEE_OPEN_8021X;\n\telse\n\t\ttempVal = WSC_MSGTYPE_ENROLLEE_INFO_ONLY;\n    templen = AppendWSCTLV(WSC_ID_REQ_TYPE, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Config method */\n#ifdef WSC_V2_SUPPORT\n\tif (pAd->StaCfg.WscControl.WscV2Info.bEnableWpsV2)\n\t{\n\t\t\ttempVal = pAd->StaCfg.WscControl.WscConfigMethods;\n\t}\n\telse\n#endif /* WSC_V2_SUPPORT */\n\t{\n\t\ttempVal = (pAd->StaCfg.WscControl.WscConfigMethods & 0x00FF);\n\t}\n\n#ifdef IWSC_SUPPORT\n\tif ((CurOpMode == STA_MODE) && \n\t\t(pAd->StaCfg.BssType == BSS_ADHOC))\n\t{\n\t\tif (pAd->StaCfg.IWscInfo.bLimitedUI)\n\t\t{\n\t\t\ttempVal &= (~WSC_CONFMET_KEYPAD);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttempVal |= WSC_CONFMET_KEYPAD;\n\t\t}\n\t}\n#endif /* IWSC_SUPPORT */\n\t\n\ttempVal = cpu2be16(tempVal);\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_METHODS, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. UUID */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_E, pData, pReg->SelfInfo.Uuid, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 5. Primary device type */\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 6. RF band, shall change based on current channel */\n    templen = AppendWSCTLV(WSC_ID_RF_BAND, pData, &pReg->SelfInfo.RfBand, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 7. Associate state */\n\ttempVal = pReg->SelfInfo.AssocState;\n\ttemplen = AppendWSCTLV(WSC_ID_ASSOC_STATE, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\t\t\t\t\n\t/* 8. Config error */\n\ttempVal = pReg->SelfInfo.ConfigError;\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_ERROR, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 9. Device password ID */\n\ttempVal = pReg->SelfInfo.DevPwdId;\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_PWD_ID, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef IWSC_SUPPORT\n\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t(CurOpMode == STA_MODE))\n\t{\n\t\t/* Connection Type Flag ESS */\n\t\ttemplen = AppendWSCTLV(WSC_ID_CONN_TYPE, pData, (UINT8 *)&pReg->SelfInfo.ConnTypeFlags, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\n\t\t/* Connection Type Flag ESS */\n\t\ttempVal = htons(pAd->StaCfg.IWscInfo.IpMethod);\n\t\ttemplen = AppendWSCTLV(WSC_ID_IP_ADDR_CONF_METHOD, pData, (UINT8 *)&tempVal, 0);\n\t\tpData += templen;\n\t\tLen   += templen;\n\t}\n#endif /* IWSC_SUPPORT */\n\n#ifdef WSC_V2_SUPPORT\n\tif (pAd->StaCfg.WscControl.WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* 10. Manufacturer */\n\t\tNdisZeroMemory(pData, 64 + 4);\n\t\ttemplen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData,  pReg->SelfInfo.Manufacturer, strlen((PSTRING) pReg->SelfInfo.Manufacturer));\n\t\tpData += templen;\n\t\tLen   += templen;\n\n\t\t/* 11. Model Name */\n\t\tNdisZeroMemory(pData, 32 + 4);\n\t\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pReg->SelfInfo.ModelName, strlen((PSTRING) pReg->SelfInfo.ModelName));\n\t\tpData += templen;\n\t\tLen   += templen;\n\n\t\t/* 12. Model Number */\n\t\tNdisZeroMemory(pData, 32 + 4);\n\t\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pReg->SelfInfo.ModelNumber, strlen((PSTRING) pReg->SelfInfo.ModelNumber));\n\t\tpData += templen;\n\t\tLen   += templen;\n\n\t\t/* 13. Device Name */\n\t\tNdisZeroMemory(pData, 32 + 4);\n\t\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, pReg->SelfInfo.DeviceName, strlen((PSTRING) pReg->SelfInfo.DeviceName));\n\t\tpData += templen;\n\t\tLen   += templen;\n\n\t\t/* Version2 */\n\t\tWscGenV2Msg(&pAd->StaCfg.WscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\n\tieHdr.length = ieHdr.length + Len;\n\tRTMPMoveMemory(pOutBuf, &ieHdr, sizeof(WSC_IE_HEADER));\n\tRTMPMoveMemory(pOutBuf + sizeof(WSC_IE_HEADER), OutMsgBuf, Len);\n\t*pIeLen = sizeof(WSC_IE_HEADER) + Len;\n\n\tif (OutMsgBuf != NULL)\n\t\tos_free_mem(NULL, OutMsgBuf);\n\n\tDBGPRINT(RT_DEBUG_INFO, (\"<----- WscBuildProbeReqIE\\n\"));\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tMake WSC IE for the AssocReq frame\n\n\tArguments:\n\t\tpAd    - NIC Adapter pointer\n\t\tpOutBuf\t\t- all of WSC IE field \n\t\tpIeLen\t\t- length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tNone\n\t\t\n\t========================================================================\n*/\nVOID WscBuildAssocReqIE(\n\t/*IN\tPRTMP_ADAPTER\tpAd,*/\n\tIN  PWSC_CTRL\tpWscControl,\n\tOUT\tPUCHAR\t\tpOutBuf,\n\tOUT\tPUCHAR\t\tpIeLen)\n{\n\tWSC_IE_HEADER \tieHdr;\n/*\tUCHAR \t\t\tData[512]; */\n\tUCHAR\t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n\tUINT8\t\t\ttempVal = 0;\n\tPWSC_REG_DATA\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\n\tif (pWscControl == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscBuildAssocReqIE: pWscControl is NULL\\n\"));\n\t\treturn;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscBuildAssocReqIE\\n\"));\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 512);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* WSC IE Header */\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; ieHdr.oui[1] = 0x50;\n    ieHdr.oui[2] = 0xF2; ieHdr.oui[3] = 0x04;\n\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Request Type */\n\tif (pWscControl->WscConfMode == WSC_ENROLLEE)\n\t\ttempVal = WSC_MSGTYPE_ENROLLEE_INFO_ONLY;\n\telse\n\t\ttempVal = WSC_MSGTYPE_REGISTRAR;\n\ttemplen = AppendWSCTLV(WSC_ID_REQ_TYPE, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t\n\tieHdr.length = ieHdr.length + Len;\n\tRTMPMoveMemory(pOutBuf, &ieHdr, sizeof(WSC_IE_HEADER));\n\tRTMPMoveMemory(pOutBuf + sizeof(WSC_IE_HEADER), Data, Len);\n\t*pIeLen = sizeof(WSC_IE_HEADER) + Len;\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscBuildAssocReqIE\\n\"));\n}\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID WscProfileRetryTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER    *pAdapter = NULL;\n\tPWSC_CTRL\t\tpWscControl = (PWSC_CTRL)FunctionContext;\t\n\tBOOLEAN\t\t\tbReConnect = TRUE;\n\tUCHAR\t\t\tCurOpMode = 0xFF;\n\n\tif (pWscControl == NULL)\n\t\treturn;\n\n\tpAdapter = pWscControl->pAd;\n\n\tif (pAdapter != NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscProfileRetryTimeout:: WSC profile retry timeout index: %d\\n\", pWscControl->WscProfile.ApplyProfileIdx));\t\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\t\tif (pWscControl->EntryIfIdx != BSS0)\n\t\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\t\tCurOpMode = AP_MODE;\n\n#ifdef APCLI_SUPPORT\n\t\tif( (CurOpMode == AP_MODE) \n\t\t\t&& (pAdapter->ApCfg.ApCliTab[BSS0].CtrlCurrState == APCLI_CTRL_CONNECTED)\n\t\t\t&& (pAdapter->ApCfg.ApCliTab[BSS0].SsidLen != 0))\n\t\t{\n\t\t\tINT i;\n\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t{\n\t\t\t\tPMAC_TABLE_ENTRY pEntry = &pAdapter->MacTab.Content[i];\n\n\t\t\t\tif ( IS_ENTRY_APCLI(pEntry) &&\n\t\t\t\t\t(pEntry->Sst == SST_ASSOC) &&\n\t\t\t\t\t(pEntry->PortSecured == WPA_802_1X_PORT_SECURED))\n\t\t\t\t\t{\n\t\t\t\t\t\tbReConnect = FALSE;\n\t\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tif ((CurOpMode == STA_MODE) && INFRA_ON(pAdapter) && (pAdapter->IndicateMediaState == NdisMediaStateConnected))\n\t\t{\n\t\t\tpWscControl->WscProfileRetryTimerRunning = FALSE;\n\t\t\tbReConnect = FALSE;\n\t\t}\n\t\t\n\t\tif (bReConnect)\n\t\t{\n\t\t\tif (pWscControl->WscProfile.ApplyProfileIdx < pWscControl->WscProfile.ProfileCnt-1)\n\t\t\t\tpWscControl->WscProfile.ApplyProfileIdx++;\n\t\t\telse\n\t\t\t\tpWscControl->WscProfile.ApplyProfileIdx = 0;\n\n#ifdef APCLI_SUPPORT\n\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t{\n\t\t\t\tBOOLEAN apcliEn;\n\t\t\t\tWscWriteConfToApCliCfg(pAdapter, \n\t\t\t\t\t\t\t\t\t   pWscControl, \n\t\t\t\t\t\t\t\t\t   &pWscControl->WscProfile.Profile[pWscControl->WscProfile.ApplyProfileIdx],\n\t\t\t\t\t\t\t\t\t   TRUE);\n\n\t\t\t\tapcliEn = pAdapter->ApCfg.ApCliTab[BSS0].Enable;\n\n\t\t\t\t/* bring apcli interface down first */\n\t\t\t\tif(apcliEn == TRUE )\n\t\t\t\t{\n\t\t\t\t\tpAdapter->ApCfg.ApCliTab[BSS0].Enable = FALSE;\n\t\t\t\t\tApCliIfDown(pAdapter);\n\t\t\t\t\tpAdapter->ApCfg.ApCliTab[BSS0].Enable = TRUE;\n\t\t\t\t}\n\t\t\t}\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t{\n\t\t\t\tWscWriteConfToPortCfg(pAdapter,\n\t\t\t\t\t\t\t\t\t  pWscControl,\n\t\t\t\t\t\t\t\t\t  &pWscControl->WscProfile.Profile[pWscControl->WscProfile.ApplyProfileIdx],\n\t\t\t\t\t\t\t\t\t  TRUE);\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tpAdapter->WriteWscCfgToDatFile = (pWscControl->EntryIfIdx & 0x0F);\n/*#ifdef KTHREAD_SUPPORT */\n/*\t\t\tWAKE_UP(&(pAdapter->wscTask)); */\n/*#else */\n/*\t\t\tRTMP_SEM_EVENT_UP(&(pAdapter->wscTask.taskSema)); */\n/*#endif */\n\t\t\tRtmpOsTaskWakeUp(&(pAdapter->wscTask));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscProfileRetryTimeout:: WSC profile retry index: %d\\n\", pWscControl->WscProfile.ApplyProfileIdx));\n\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\tpAdapter->StaCfg.bAutoConnectByBssid = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n}\n\nVOID WscPBCTimeOutAction(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n\tPWSC_CTRL       pWscControl = (PWSC_CTRL)FunctionContext;\n\tRTMP_ADAPTER    *pAd = NULL;\n    BOOLEAN         Cancelled;\n\n    DBGPRINT(RT_DEBUG_OFF, (\"-----> WscPBCTimeOutAction\\n\"));\n\n\tif (pWscControl != NULL)\n\t\tpAd = pWscControl->pAd;\n\n\tif (pAd != NULL)\n\t{\n\t\n\t    if (pWscControl->WscPBCTimerRunning)\n\t    {\n\t        pWscControl->WscPBCTimerRunning = FALSE;\n\t        RTMPCancelTimer(&pWscControl->WscPBCTimer, &Cancelled);\n\t    }\n\n\t\tWscPBCExec(pAd, FALSE, pWscControl);\n\t\t\n\t\t/* call Mlme handler to execute it */\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n    DBGPRINT(RT_DEBUG_OFF, (\"<----- WscPBCTimeOutAction\\n\"));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tExec scan after scan timer expiration \n\n\tArguments:\n\t\tFunctionContext\t\tNIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID WscScanTimeOutAction(\n    IN PVOID SystemSpecific1,\n    IN PVOID FunctionContext,\n    IN PVOID SystemSpecific2,\n    IN PVOID SystemSpecific3)\n{\n    RTMP_ADAPTER    *pAd = NULL;\n\tPWSC_CTRL       pWscControl = (PWSC_CTRL)FunctionContext;\n\n\t\tif (pWscControl == NULL)\n\t\t\treturn;\n\t\t\n\tpAd = pWscControl->pAd;\n\n\tif (pAd != NULL)\n\t{\n\t\t/* call to execute the scan actions */\n\t\tWscScanExec(pAd, pWscControl);\n\n\t\t/* register 10 second timer for PBC or PIN connection execution */\n\t\tif (pWscControl->WscMode == WSC_PBC_MODE)\n\t\t{\n\t\t    /* Prevent infinite loop if conncet time out didn't stop the repeat scan */\n\t\t\tif (pWscControl->WscState != WSC_STATE_OFF)\n\t        {      \n\t\t\t    RTMPSetTimer(&pWscControl->WscPBCTimer, 10000);\n\t            pWscControl->WscPBCTimerRunning = TRUE;\n\t        }\n\t\t}\n\t\telse if (pWscControl->WscMode == WSC_PIN_MODE)\n\t\t{\n\t        /* Prevent infinite loop if conncet time out didn't stop the repeat scan */\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"!!! WscScanTimeOutAction !!!\\n\"));\n\t    \n\t\t/* call Mlme handler to execute it */\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n}\n\nBOOLEAN ValidateChecksum(\n\tIN UINT PIN)\n{\n\tUINT accum = 0;\n\n\taccum += 3 * ((PIN / 10000000) % 10); \n\taccum += 1 * ((PIN / 1000000) % 10); \n\taccum += 3 * ((PIN / 100000) % 10); \n\taccum += 1 * ((PIN / 10000) % 10); \n\taccum += 3 * ((PIN / 1000) % 10); \n\taccum += 1 * ((PIN / 100) % 10); \n\taccum += 3 * ((PIN / 10) % 10); \n\taccum += 1 * ((PIN / 1) % 10); \n\t\n    return (0 == (accum % 10));\n} /* ValidateChecksum */\n\n/*\n\tGenerate 4-digit random number, ex:1234\n*/\nUINT WscRandomGen4digitPinCode(\n\t\t\t\t\t\t\t IN  PRTMP_ADAPTER   pAd)\n{\n\tUINT    iPin;\n\n\tiPin = RandomByte2(pAd) * 256 * 256 + RandomByte2(pAd) * 256 + RandomByte2(pAd);\n\tiPin = iPin % 10000;\n\n\treturn iPin;\n}\n\nUINT WscRandomGeneratePinCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tapidx)\n{\n\tUINT \tiPin;\n\tUINT\tchecksum;\n\n\tiPin = RandomByte(pAd) * 256 * 256 + RandomByte(pAd) * 256 + RandomByte(pAd);\n\n\tiPin = iPin % 10000000;\n\t\n\n\tchecksum = ComputeChecksum( iPin );\n\tiPin = iPin*10 + checksum;\n\n\treturn iPin;\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\nVOID  WscInformFromWPA(\n    IN  PMAC_TABLE_ENTRY    pEntry)\n{\n    /* WPA_STATE_MACHINE informs this Entry is already WPA_802_1X_PORT_SECURED. */\n    RTMP_ADAPTER\t*pAd = (PRTMP_ADAPTER)pEntry->pAd;\n    BOOLEAN         Cancelled;\n\n    if (pEntry->apidx >= pAd->ApCfg.BssidNum)\n        return;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"-----> WscInformFromWPA\\n\"));\n    \n    if (MAC_ADDR_EQUAL(pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr))\n    {\n        NdisZeroMemory(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, MAC_ADDR_LEN);\n        RTMPCancelTimer(&pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EapolTimer, &Cancelled);\n        pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EapolTimerRunning = FALSE;\n        pEntry->bWscCapable = FALSE;\n        pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscState = WSC_STATE_CONFIGURED;\n\n        DBGPRINT(RT_DEBUG_TRACE, (\"Reset EntryIfIdx to %d\\n\", WSC_INIT_ENTRY_APIDX));\n    }\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscInformFromWPA\\n\"));\n}\n\nVOID WscDelWPARetryTimer(\n    IN  PRTMP_ADAPTER pAd)\n{\n    PMAC_TABLE_ENTRY    pEntry;\n    UCHAR\t\t\t\tapidx = MAIN_MBSSID;\n    BOOLEAN             Cancelled;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscDelWPARetryTimer\\n\"));\n    \n    pEntry = MacTableLookup(pAd, pAd->ApCfg.MBSSID[apidx].WscControl.EntryAddr);\n    \n    if (pEntry)\n    {\n        RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n        pEntry->WpaState = AS_NOTUSE;\n    }\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscDelWPARetryTimer\\n\"));\n}\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID WscStop(\n\tIN\tPRTMP_ADAPTER\tpAd,\n#ifdef CONFIG_AP_SUPPORT\n    IN  BOOLEAN         bFromApCli,\n#endif /* CONFIG_AP_SUPPORT */\n\tIN  PWSC_CTRL       pWscControl)\n{\n\tPWSC_UPNP_NODE_INFO pWscUPnPInfo;\n    BOOLEAN Cancelled;\n#ifdef WSC_LED_SUPPORT\n\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\t\n\tMAC_TABLE_ENTRY  *pEntry;\n\tUCHAR\tapidx = (pWscControl->EntryIfIdx & 0x0F);\n#endif /* CONFIG_AP_SUPPORT */\n\tUCHAR\tCurOpMode = 0xff;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tpWscControl->bConfiguredAP = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpWscUPnPInfo = &pWscControl->WscUPnPNodeInfo;\n\t\n\tif(pWscUPnPInfo->bUPnPMsgTimerRunning == TRUE)\n\t{\n\t\tpWscUPnPInfo->bUPnPMsgTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscUPnPInfo->UPnPMsgTimer, &Cancelled);\n\t\tpWscUPnPInfo->bUPnPMsgTimerPending = FALSE;\n\t}\n\tif(pWscControl->bM2DTimerRunning)\n\t{\n\t\tpWscControl->bM2DTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->M2DTimer, &Cancelled);\n\t}\n\t\n    pWscUPnPInfo->bUPnPInProgress = FALSE;\n    pWscControl->M2DACKBalance = 0;\n\tpWscUPnPInfo->registrarID = 0;\n\n\tif (pWscControl->Wsc2MinsTimerRunning)\n\t{\n\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n\t}\n\n\tif (pWscControl->WscUpdatePortCfgTimerRunning)\n\t{\n\t\tpWscControl->WscUpdatePortCfgTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscUpdatePortCfgTimer, &Cancelled);\n\t}\n\n\tRTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\tpWscControl->EapolTimerRunning = FALSE;\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscSetupLockTimerRunning)\n\t{\n\t\tpWscControl->WscSetupLockTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscSetupLockTimer, &Cancelled);\n\t}\n#endif /* WSC_V2_SUPPORT */\t\n\tif ((pWscControl->EntryIfIdx & 0x0F)< pAd->ApCfg.BssidNum)\n\t{\n\t    pEntry = MacTableLookup(pAd, pWscControl->EntryAddr);\n        \n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tif (pEntry && !bFromApCli) \n\t\t\t{\n\t\t\t\tpEntry->bWscCapable = FALSE;\n\t\t\t}\n\t\t}        \n\t}\n#endif /* CONFIG_AP_SUPPORT */\n    NdisZeroMemory(pWscControl->EntryAddr, MAC_ADDR_LEN);\n\n\tpWscControl->WscSelReg = 0;\n\tif ( (pWscControl->WscStatus == STATUS_WSC_CONFIGURED) ||\n         (pWscControl->WscStatus == STATUS_WSC_FAIL) ||\n         (pWscControl->WscStatus == STATUS_WSC_PBC_TOO_MANY_AP))\n         ;\n    else\n\t\tpWscControl->WscStatus = STATUS_WSC_NOTUSED;\n\tpWscControl->WscState = WSC_STATE_OFF;\n\tpWscControl->lastId = 1;\n\tpWscControl->EapMsgRunning = FALSE;\n\tpWscControl->EapolTimerPending = FALSE;\n\tpWscControl->bWscTrigger = FALSE;\n\n\tif (pWscControl->WscScanTimerRunning)\n\t{\n\t\tpWscControl->WscScanTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscScanTimer, &Cancelled);\n\t}\n\n\tif (pWscControl->WscPBCTimerRunning)\n\t{\n\t\tpWscControl->WscPBCTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscPBCTimer, &Cancelled);\n\t}\n\t\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\t\t\n\t\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;\n\t\tNdisZeroMemory(&pAd->MlmeAux.AutoReconnectSsid[0], MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(&pAd->MlmeAux.AutoReconnectSsid[0], &pAd->MlmeAux.Ssid[0], pAd->MlmeAux.SsidLen);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef WSC_LED_SUPPORT\n\tif (pWscControl->WscLEDTimerRunning)\n\t{\n\t\tpWscControl->WscLEDTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscLEDTimer, &Cancelled);\n\t}\n\tif (pWscControl->WscSkipTurnOffLEDTimerRunning)\n\t{\n\t\tpWscControl->WscSkipTurnOffLEDTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscSkipTurnOffLEDTimer, &Cancelled);\n\t}\n\t/* Reset the WPS walk time. */\n\tpWscControl->bWPSWalkTimeExpiration = FALSE;\n\tWPSLEDStatus = LED_WPS_TURN_LED_OFF;\n\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (!bFromApCli)\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen = 0;\n\t\t\tpAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen = 0;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n}\n\nVOID WscInit(\n\tIN\tPRTMP_ADAPTER\tpAd,\n    IN  BOOLEAN         bFromApCli,\n\tIN  UCHAR       \tBssIndex)\n{\n\tIN  PWSC_CTRL       pWscControl = NULL;\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\tUCHAR\t\tCurOpMode = AP_MODE;\n\n#ifdef CONFIG_AP_SUPPORT\t\n\tINT IsAPConfigured;\n\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (bFromApCli)\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[BssIndex & 0x0F].WscControl;\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[BssIndex & 0x0F].WscControl;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (BssIndex >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\n\t\t\tpWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl;\n\t\t}\n\t\telse if (bFromApCli)\n\t\t{\n\t\t\tpWscControl = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].WscControl;\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tpWscControl = &pAd->StaCfg.WscControl;\n\t\t\tCurOpMode = STA_MODE;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pWscControl == NULL)\n\t\treturn;\n\n\tif (pWscControl->WscEnrolleePinCode == 0)\n\t{\n\t\tif (pWscControl->WscEnrollee4digitPinCode)\n\t\t{\n\t\t\tpWscControl->WscEnrolleePinCodeLen = 4;\n\t\t\tpWscControl->WscEnrolleePinCode = WscRandomGen4digitPinCode(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpWscControl->WscEnrolleePinCode = GenerateWpsPinCode(pAd, bFromApCli, BssIndex);\n\t\t\tpWscControl->WscEnrolleePinCodeLen = 8;\n\t\t}\n\t}\n\tpWscControl->RegData.SelfInfo.Version = WSC_VERSION;\n#ifdef WSC_V2_SUPPORT\n\tpWscControl->RegData.SelfInfo.Version2 = WSC_V2_VERSION;\n#endif /* WSC_V2_SUPPORT */\n\n\tpWscControl->bWscLastOne = FALSE;\n\tpWscControl->bWscFirstOne = FALSE;\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpWscControl->WscStatus = STATUS_WSC_IDLE;\n#ifdef CONFIG_AP_SUPPORT\n\tif (((CurOpMode == AP_MODE) && \n\t\t(pWscControl->WscConfMode == WSC_DISABLE))\n#ifdef WSC_V2_SUPPORT\n\t\t|| ((pWscControl->WscV2Info.bWpsEnable == FALSE) && pWscControl->WscV2Info.bEnableWpsV2)\n#endif /* WSC_V2_SUPPORT */\n\t\t)\n\t{\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (!bFromApCli)\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[BssIndex & 0x0F].WscIEBeacon.ValueLen = 0;\n\t\t\t\tpAd->ApCfg.MBSSID[BssIndex & 0x0F].WscIEProbeResp.ValueLen = 0;\n\t\t\t}\n\t\t}\n\t}\n\telse\n#endif /* CONFIG_AP_SUPPORT */\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (pWscControl->WscConfMode == WSC_DISABLE)\n\t\t{\n\t\t\tif (BssIndex >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t{\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].WscIEBeacon.ValueLen = 0;\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].WscIEProbeResp.ValueLen = 0;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\t\tWscInitRegistrarPair(pAd, pWscControl, BssIndex);\t\t\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (!bFromApCli)\n#endif /* APCLI_SUPPORT */\n\t\t\t{\n\t\t\t\tIsAPConfigured = pWscControl->WscConfStatus;\n\t\t\t\tWscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, (BssIndex & 0x0F), NULL, 0, AP_MODE);\n\t\t\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, BssIndex, NULL, 0, AP_MODE);\n\t\t\t\tAPUpdateBeaconFrame(pAd, pWscControl->EntryIfIdx & 0x0F);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */        \n\t}\n}\n\nUSHORT WscGetAuthType(\n    IN NDIS_802_11_AUTHENTICATION_MODE authType)\n{\n\tswitch(authType)\n\t{\n\t\tcase Ndis802_11AuthModeOpen:\n\t\t\treturn WSC_AUTHTYPE_OPEN;\n\t\tcase Ndis802_11AuthModeWPAPSK:\n\t\t\treturn WSC_AUTHTYPE_WPAPSK;\n\t\tcase Ndis802_11AuthModeShared:\n\t\t\treturn WSC_AUTHTYPE_SHARED;\n\t\tcase Ndis802_11AuthModeWPANone:\n\t\t\treturn WSC_AUTHTYPE_WPANONE;\n\t\tcase Ndis802_11AuthModeWPA:\n\t\t\treturn WSC_AUTHTYPE_WPA;\n\t\tcase Ndis802_11AuthModeWPA1WPA2:\n\t\t\treturn (WSC_AUTHTYPE_WPA | WSC_AUTHTYPE_WPA2);\n\t\tcase Ndis802_11AuthModeWPA2:\n\t\t\treturn WSC_AUTHTYPE_WPA2;\n\t\tcase Ndis802_11AuthModeWPA1PSKWPA2PSK:\n\t\t\treturn (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK);\n\t\tcase Ndis802_11AuthModeWPA2PSK:\n\t\t\treturn WSC_AUTHTYPE_WPA2PSK;\n\t\tdefault:\n\t\t\treturn WSC_AUTHTYPE_OPEN;\n\t}\n}\n\nUSHORT WscGetEncryType(\n    IN NDIS_802_11_WEP_STATUS encryType)\n{\n\tswitch(encryType)\n\t{\n\t\tcase Ndis802_11WEPDisabled:\n\t\t\treturn WSC_ENCRTYPE_NONE;\n\t\tcase Ndis802_11WEPEnabled:\n\t\t\treturn WSC_ENCRTYPE_WEP;\n\t\tcase Ndis802_11Encryption2Enabled:\n\t\t\treturn WSC_ENCRTYPE_TKIP;\n\t\tcase Ndis802_11Encryption4Enabled:\n\t\t\treturn (WSC_ENCRTYPE_AES | WSC_ENCRTYPE_TKIP);\n\t\t default:\n\t\tcase Ndis802_11Encryption3Enabled:\n\t\t\treturn WSC_ENCRTYPE_AES;\n\t}\n}\n\nPSTRING   WscGetAuthTypeStr(\n    IN  USHORT authFlag)\n{\n\tswitch(authFlag)\n\t{\n\t\tcase WSC_AUTHTYPE_OPEN:\n\t\t\treturn \"OPEN\";\n\t\tcase WSC_AUTHTYPE_WPAPSK:\n\t\t\treturn \"WPAPSK\";\n\t\tcase WSC_AUTHTYPE_SHARED:\n\t\t\treturn \"SHARED\";\n\t\tcase WSC_AUTHTYPE_WPANONE:\n\t\t\treturn \"WPANONE\";\n\t\tcase WSC_AUTHTYPE_WPA:\n\t\t\treturn \"WPA\";\n\t\tcase WSC_AUTHTYPE_WPA2:\n\t\t\treturn \"WPA2\";\n\t\tdefault:\n\t\tcase (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK):\n\t\t\treturn \"WPAPSKWPA2PSK\";\n\t\tcase WSC_AUTHTYPE_WPA2PSK:\n\t\t\treturn \"WPA2PSK\";\n\t\tcase (WSC_AUTHTYPE_OPEN | WSC_AUTHTYPE_SHARED):\n\t\t\treturn \"WEPAUTO\";\n\t}\n}\n\nPSTRING   WscGetEncryTypeStr(\n    IN  USHORT encryFlag)\n{\n\tswitch(encryFlag)\n\t{\n\t\tcase WSC_ENCRTYPE_NONE:\n\t\t\treturn \"NONE\";\n\t\tcase WSC_ENCRTYPE_WEP:\n\t\t\treturn \"WEP\";\n\t\tcase WSC_ENCRTYPE_TKIP:\n\t\t\treturn \"TKIP\";\n\t\tdefault:\n\t\tcase (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES):\n\t\t\treturn \"TKIPAES\";\n\t\tcase WSC_ENCRTYPE_AES:\n\t\t\treturn \"AES\";\n\t}\n}\n\nNDIS_802_11_AUTHENTICATION_MODE   WscGetAuthMode(\n    IN  USHORT authFlag)\n{\n\tswitch(authFlag)\n\t{\n\t\tcase WSC_AUTHTYPE_OPEN:\n\t\t\treturn Ndis802_11AuthModeOpen;\n\t\tcase WSC_AUTHTYPE_WPAPSK:\n\t\t\treturn Ndis802_11AuthModeWPAPSK;\n\t\tcase WSC_AUTHTYPE_SHARED:\n\t\t\treturn Ndis802_11AuthModeShared;\n\t\tcase WSC_AUTHTYPE_WPANONE:\n\t\t\treturn Ndis802_11AuthModeWPANone;\n\t\tcase WSC_AUTHTYPE_WPA:\n\t\t\treturn Ndis802_11AuthModeWPA;\n\t\tcase WSC_AUTHTYPE_WPA2:\n\t\t\treturn Ndis802_11AuthModeWPA2;\n\t\tdefault:\n\t\tcase (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK):\n\t\t\treturn Ndis802_11AuthModeWPA1PSKWPA2PSK;\n\t\tcase WSC_AUTHTYPE_WPA2PSK:\n\t\t\treturn Ndis802_11AuthModeWPA2PSK;\n\t}\n}\n\nNDIS_802_11_WEP_STATUS   WscGetWepStatus(\n    IN  USHORT encryFlag)\n{\n\tswitch(encryFlag)\n\t{\n\t\tcase WSC_ENCRTYPE_NONE:\n\t\t\treturn Ndis802_11WEPDisabled;\n\t\tcase WSC_ENCRTYPE_WEP:\n\t\t\treturn Ndis802_11WEPEnabled;\n\t\tcase WSC_ENCRTYPE_TKIP:\n\t\t\treturn Ndis802_11Encryption2Enabled;\n\t\tdefault:\n\t\tcase (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES):\n\t\t\treturn Ndis802_11Encryption4Enabled;\n\t\tcase WSC_ENCRTYPE_AES:\n\t\t\treturn Ndis802_11Encryption3Enabled;\n\t}\n}\n\nvoid    WscWriteConfToPortCfg(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PWSC_CTRL       pWscControl,\n    IN  PWSC_CREDENTIAL pCredential,    \n    IN  BOOLEAN         bEnrollee)\n{\n\tUCHAR               CurApIdx = MAIN_MBSSID;\n\tUCHAR\tCurOpMode = AP_MODE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscWriteConfToPortCfg\\n\"));\n    \n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pWscControl->EntryIfIdx == BSS0)\n\t\tCurOpMode = STA_MODE;\n\t}\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tCurApIdx = (pWscControl->EntryIfIdx & 0x0F);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (bEnrollee || (CurOpMode == AP_MODE))\n\t{\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[CurApIdx].Ssid, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[CurApIdx].Ssid, pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n\t\t\tpAd->ApCfg.MBSSID[CurApIdx].SsidLen = pCredential->SSID.SsidLength;\n#ifdef P2P_SUPPORT\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pAd->P2pCfg.SSID, MAX_LEN_OF_SSID);\n\t\t\t\tpAd->P2pCfg.SSIDLen = pCredential->SSID.SsidLength;\n\t\t\t\tNdisMoveMemory(pAd->P2pCfg.SSID, pCredential->SSID.Ssid, pAd->P2pCfg.SSIDLen);\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen = pCredential->SSID.SsidLength;\n\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);\n\t\t\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pCredential->SSID.Ssid, pAd->MlmeAux.AutoReconnectSsidLen);\n\t\t\tpAd->MlmeAux.SsidLen = pCredential->SSID.SsidLength;\n\t\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);\n\t\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, pCredential->SSID.Ssid, pAd->MlmeAux.SsidLen);\n\t\t\tif (!NdisEqualMemory(pCredential->MacAddr, pAd->CurrentAddress, MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);\n\t\t\t\tNdisMoveMemory(pAd->MlmeAux.Bssid, pCredential->MacAddr, MAC_ADDR_LEN);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ra%d - AuthType: %u, EncrType: %u\\n\", CurApIdx, pCredential->AuthType, pCredential->EncrType));\n\t\tif (pCredential->AuthType & (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK | WSC_AUTHTYPE_WPANONE))\n\t\t{\n\t\t\tif (!(pCredential->EncrType & (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES)))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AuthType is WPAPSK or WPA2PAK.\\n\"\n                                         \"Get illegal EncrType(%d) from External Registrar, set EncrType to TKIP\\n\", \n                                          pCredential->EncrType));\n\t\t\t\tpCredential->EncrType = WSC_ENCRTYPE_TKIP;\n\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\tpAd->StaCfg.WpaState = SS_START;\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_V2_SUPPORT\n\t\t\tif ((CurOpMode == AP_MODE) && (pWscControl->WscV2Info.bEnableWpsV2))\n\t\t\t{\n\t\t\t\tif (pCredential->AuthType == WSC_AUTHTYPE_WPAPSK)\n\t\t\t\t\tpCredential->AuthType = (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK);\n\t\t\t\tif (pCredential->EncrType == WSC_ENCRTYPE_TKIP)\n\t\t\t\t\tpCredential->EncrType = (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES);\n\t\t\t}\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t}\n\t\tWscSetAuthMode(pAd, CurOpMode, CurApIdx, WscGetAuthTypeStr(pCredential->AuthType));\n\t\tWscSetEncrypType(pAd, CurOpMode, CurApIdx, WscGetEncryTypeStr(pCredential->EncrType));\n\t\tif (pCredential->EncrType != WSC_ENCRTYPE_NONE)\n\t\t{\n\t\t\tif (pCredential->EncrType & (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES))\n\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\tpAd->ApCfg.MBSSID[CurApIdx].DefaultKeyId = 1;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\tpAd->StaCfg.DefaultKeyId = 0;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\tif (pCredential->KeyLength >= 8 && pCredential->KeyLength <= 64)\n\t\t\t\t{\n\t\t\t\t\tUCHAR  *pPMKBuf = NULL, *pSSIDStr = NULL;\n\t\t\t\t\tINT\t\tssidLen = 0;\n\t\t\t\t\t\n\t\t\t\t\tpWscControl->WpaPskLen = pCredential->KeyLength;\n\t\t\t\t\tRTMPZeroMemory(pWscControl->WpaPsk, 64);\n\t\t\t\t\tRTMPMoveMemory(pWscControl->WpaPsk, pCredential->Key, pWscControl->WpaPskLen);\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpPMKBuf = pAd->ApCfg.MBSSID[CurApIdx].PMK;\n\t\t\t\t\t\tpSSIDStr = (PUCHAR)pAd->ApCfg.MBSSID[CurApIdx].Ssid;\n\t\t\t\t\t\tssidLen = pAd->ApCfg.MBSSID[CurApIdx].SsidLen;\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);\n\t\t\t\t\t\tRTMPMoveMemory(pAd->StaCfg.WpaPassPhrase, pCredential->Key, pWscControl->WpaPskLen);\n\t\t\t\t\t\tpAd->StaCfg.WpaPassPhraseLen = pCredential->KeyLength;\n\t\t\t\t\t\tpPMKBuf = pAd->StaCfg.PMK;\n\t\t\t\t\t\tpSSIDStr = (PUCHAR)pCredential->SSID.Ssid;\n\t\t\t\t\t\tssidLen = pCredential->SSID.SsidLength;\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\tRT_CfgSetWPAPSKKey(pAd, pCredential->Key, pWscControl->WpaPskLen, pSSIDStr, ssidLen, pPMKBuf);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WpaPskLen = %d\\n\", pWscControl->WpaPskLen));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpWscControl->WpaPskLen = 0;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WPAPSK: Invalid Key Length (%d)\\n\", pCredential->KeyLength));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pCredential->EncrType == WSC_ENCRTYPE_WEP)\n\t\t\t{\n\t\t\t\tUCHAR   WepKeyId = 0;\n\t\t\t\tUSHORT  WepKeyLen = pCredential->KeyLength;\n\n\t\t\t\tif ((pCredential->KeyIndex >= 1) && (pCredential->KeyIndex <= 4))\n\t\t\t\t{\n\t\t\t\t\tWepKeyId = (pCredential->KeyIndex - 1); /* KeyIndex = 1 ~ 4 */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[CurApIdx].DefaultKeyId = WepKeyId;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT                \n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\tpAd->StaCfg.DefaultKeyId = WepKeyId;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\t\t /* 5 or 13 ASCII characters */\n\t\t\t\t\t/* 10 or 26 Hex characters */\n\t\t\t\t\tif (WepKeyLen == 5 || WepKeyLen == 13 || WepKeyLen == 10 || WepKeyLen == 26)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (WepKeyLen == 5 || WepKeyLen == 13)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->SharedKey[CurApIdx][WepKeyId].KeyLen = (UCHAR)WepKeyLen;\n\t\t\t\t\t\t\tmemcpy(pAd->SharedKey[CurApIdx][WepKeyId].Key, \n\t\t\t\t\t\t\t\tpCredential->Key, \n\t\t\t\t\t\t\t\tWepKeyLen);\n\t\t\t\t\t\t\tif (WepKeyLen == 5)\n\t\t\t\t\t\t\t\tpAd->SharedKey[CurApIdx][WepKeyId].CipherAlg = CIPHER_WEP64;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpAd->SharedKey[CurApIdx][WepKeyId].CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->SharedKey[CurApIdx][WepKeyId].KeyLen = (UCHAR)(WepKeyLen/2);\n\t\t\t\t\t\t\tAtoH((PSTRING) pCredential->Key, pAd->SharedKey[CurApIdx][WepKeyId].Key, WepKeyLen/2);\n\t\t\t\t\t\t\tif (WepKeyLen == 10)\n\t\t\t\t\t\t\t\tpAd->SharedKey[CurApIdx][WepKeyId].CipherAlg = CIPHER_WEP64;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpAd->SharedKey[CurApIdx][WepKeyId].CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WEP: Invalid Key Length (%d)\\n\", pCredential->KeyLength));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Unsupport default key index (%d)\\n\", WepKeyId));\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[CurApIdx].DefaultKeyId = 0;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\tpAd->StaCfg.DefaultKeyId = 0;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t}\n\telse\n\t{\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[CurApIdx].DefaultKeyId = 1;\n\t\t\tWscSetAuthMode(pAd, CurOpMode, CurApIdx, \"WPAPSKWPA2PSK\");\n\t\t\tWscSetEncrypType(pAd, CurOpMode, CurApIdx, \"TKIPAES\");\n\t\t\tpWscControl->WpaPskLen = (INT)pCredential->KeyLength;\n\t\t\tNdisZeroMemory(pWscControl->WpaPsk, 64);\n\t\t\tNdisMoveMemory(pWscControl->WpaPsk, pCredential->Key, pWscControl->WpaPskLen);\n\t\t\t/* Copy SSID */\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[CurApIdx].Ssid, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[CurApIdx].Ssid, pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n\t\t\tpAd->ApCfg.MBSSID[CurApIdx].SsidLen = pCredential->SSID.SsidLength;\n\t\t\t/*\n\t\t\t\tHex Key \n\t\t\t*/\n\t\t\tif(pWscControl->WscKeyASCII == 0)\n\t\t\t{\n\t\t\t\tAtoH((PSTRING) pWscControl->WpaPsk, pAd->ApCfg.MBSSID[CurApIdx].PMK, 32);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR       keyMaterial[40] = {0};\n\t\t\t\t\n\t\t\t\tRtmpPasswordHash((PSTRING)pWscControl->WpaPsk,\n\t\t\t\t\t\t\t (PUCHAR) pAd->ApCfg.MBSSID[CurApIdx].Ssid, \n\t\t\t\t\t\t\t pAd->ApCfg.MBSSID[CurApIdx].SsidLen, \n\t\t\t\t\t\t\t keyMaterial);\n\t\t\t\tNdisMoveMemory(pAd->ApCfg.MBSSID[CurApIdx].PMK, keyMaterial, 32);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\t\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\t/*\n\t\t\tAtheros WPS Testbed AP will put A-Band BSSID in credential of M7.\n\t\t\tTo prevent 2.4G only STA would fail to re-connect by BSSID, set profile retry timer here.\n\t\t*/\n\t\tif ((pAd->StaCfg.BssType == BSS_INFRA) &&\n\t\t\t(pWscControl->WscDriverAutoConnect == 2) &&\n\t\t\t(pWscControl->WscProfile.ProfileCnt >= 1))\n\t\t{\n\t\t\tpWscControl->WscProfileRetryTimerRunning = TRUE;\n\t\t\tRTMPSetTimer(&pWscControl->WscProfileRetryTimer, WSC_PROFILE_RETRY_TIME_OUT);\n\t\t}\n\t\t\n#ifdef IWSC_SUPPORT\n\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) && \n\t\t\t(pAd->StaCfg.IWscInfo.RegDepth != 0) &&\n\t\t\t(pAd->StaCfg.IWscInfo.AvaSubMaskListCount != 0))\n\t\t{\n\t\t\tif ((pCredential->AvaIpv4SubmaskList[0] == 0) &&\n\t\t\t\t(pCredential->AvaIpv4SubmaskList[1] == 0) &&\n\t\t\t\t(pCredential->AvaIpv4SubmaskList[2] == 0))\n\t\t\t\tpAd->StaCfg.IWscInfo.AvaSubMaskListCount = 0;\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- ra%d - WscWriteConfToPortCfg\\n\", CurApIdx));\n}\n\n\nVOID\tWscWriteSsidToDatFile(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PSTRING\t\t \tpTempStr,\n\tIN\tBOOLEAN\t\t\tbNewFormat,\n\tIN  UCHAR\t\t\tCurOpMode)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\tapidx;\n#endif /* CONFIG_AP_SUPPORT */\n\tINT\t\toffset = 0;\n\n\tif (bNewFormat == FALSE)\n\t{\t\t\n\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t{\n\t\t\t\tif (apidx == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pTempStr, \"SSID=\", strlen(\"SSID=\"));\n\t\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\t\tNdisMoveMemory(pTempStr + offset, \";\", 1);\n\t\t\t\t\toffset += 1;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(pTempStr + offset, pAd->ApCfg.MBSSID[apidx].Ssid, pAd->ApCfg.MBSSID[apidx].SsidLen);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (CurOpMode == STA_MODE)\n\t\t{\n\t\t\tUINT profile_idx = pAd->StaCfg.WscControl.WscProfile.ApplyProfileIdx;\n\t\t\tPWSC_CREDENTIAL pCredential = &pAd->StaCfg.WscControl.WscProfile.Profile[profile_idx];\n\t\t\tNdisMoveMemory(pTempStr, \"SSID=\", strlen(\"SSID=\"));\n\t\t\toffset = strlen(pTempStr);\n\t\t\tNdisMoveMemory(pTempStr + offset, pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n#ifdef CONFIG_AP_SUPPORT\n\telse\n\t{\n\t\tSTRING\titem_str[10] = {0};\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tsnprintf(item_str, sizeof(item_str), \"SSID%d\", (apidx + 1));\n\t\t\tif (rtstrstr(pTempStr, item_str))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\tNdisMoveMemory(pTempStr, item_str, strlen(item_str));\n\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\tNdisMoveMemory(pTempStr + offset, \"=\", 1);\n\t\t\t\toffset += 1;\n\t\t\t\tNdisMoveMemory(pTempStr + offset, pAd->ApCfg.MBSSID[apidx].Ssid, pAd->ApCfg.MBSSID[apidx].SsidLen);\n\t\t\t}\n\t\t\tNdisZeroMemory(item_str, 10);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n}\n\n\nVOID\tWscWriteWpaPskToDatFile(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PSTRING\t\t \tpTempStr,\n\tIN\tBOOLEAN\t\t\tbNewFormat)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR\t\t\tapidx;\n#endif /* CONFIG_AP_SUPPORT */\n\tPWSC_CTRL\t\tpWscControl;\n\tINT\t\t\t\toffset = 0;\n\n\tif (bNewFormat == FALSE)\n\t{\t\t\n\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t{\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\tif (apidx == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pTempStr, \"WPAPSK=\", strlen(\"WPAPSK=\"));\n\t\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\t\tNdisMoveMemory(pTempStr + offset, \";\", 1);\n\t\t\t\t\toffset += 1;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(pTempStr + offset, pWscControl->WpaPsk, pWscControl->WpaPskLen);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tpWscControl = &pAd->StaCfg.WscControl;\n\t\t\tNdisMoveMemory(pTempStr, \"WPAPSK=\", strlen(\"WPAPSK=\"));\n\t\t\tif (pWscControl->WpaPskLen)\n\t\t\t{\n\t\t\t\toffset = strlen(pTempStr);\t\t\t\t\n\t\t\t\tNdisMoveMemory(pTempStr + offset, pWscControl->WpaPsk, pWscControl->WpaPskLen);\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n#ifdef CONFIG_AP_SUPPORT\n\telse\n\t{\n\t\tSTRING\titem_str[10] = {0};\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n\t\t\tsnprintf(item_str, sizeof(item_str), \"WPAPSK%d\", (apidx + 1));\n\t\t\tif (rtstrstr(pTempStr, item_str))\n\t\t\t{\n\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\tNdisMoveMemory(pTempStr, item_str, strlen(item_str));\n\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\tNdisMoveMemory(pTempStr + offset, \"=\", 1);\n\t\t\t\toffset += 1;\n\t\t\t\tNdisMoveMemory(pTempStr + offset, pWscControl->WpaPsk, pWscControl->WpaPskLen);\n\t\t\t}\n\t\t\tNdisZeroMemory(item_str, 10);\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n}\n\nBOOLEAN WscCheckNonce(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*pElem,\n\tIN  BOOLEAN         bFlag,\n\tIN  PWSC_CTRL       pWscControl) \n{\n    USHORT\t\t\t\tLength;\n\tPUCHAR\t\t\t\tpData;\n\tUSHORT\t\t\t\tWscType, WscLen, WscId;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"-----> WscCheckNonce\\n\"));\n    \n    if (bFlag)\n    {\n        /* check Registrar Nonce */\n        WscId = WSC_ID_REGISTRAR_NONCE;\n        DBGPRINT(RT_DEBUG_TRACE, (\"check Registrar Nonce\\n\"));\n    }\n    else\n    {\n        /* check Enrollee Nonce */\n        WscId = WSC_ID_ENROLLEE_NONCE;\n        DBGPRINT(RT_DEBUG_TRACE, (\"check Enrollee Nonce\\n\"));\n    }\n    \n    pData = pElem->Msg;\n    Length = pElem->MsgLen;\n\n    /* We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n        char ZeroNonce[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n        \n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n        \n\t\tif (WscType == WscId)\n\t\t{\n\t\t\tif (RTMPCompareMemory(pWscControl->RegData.SelfNonce, pData, 16) == 0)\n\t\t\t{\n\t\t\t    DBGPRINT(RT_DEBUG_TRACE, (\"Nonce match!!\\n\"));\n                DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscCheckNonce\\n\"));\n\t\t\t\treturn TRUE;\n\t\t\t}\n            else if (NdisEqualMemory(pData, ZeroNonce, 16))\n            {\n                /* Intel external registrar will send WSC_NACK with enrollee nonce */\n                /* \"10 1A 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\" */\n                /* when AP is configured and user selects not to configure AP. */\n                DBGPRINT(RT_DEBUG_TRACE, (\"Zero Enrollee Nonce!!\\n\"));\n                DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscCheckNonce\\n\"));\n                return TRUE;\n            }\n\t\t}\n        \n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Nonce mismatch!!\\n\"));\n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscCheckNonce\\n\"));\n    return FALSE;\n}\n\nVOID    WscGetRegDataPIN(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  UINT            PinCode,\n    IN  PWSC_CTRL       pWscControl)\n{\n\tUCHAR\ttempPIN[9] = {0};\n\n    if ((pWscControl->WscMode == WSC_PBC_MODE) ||\n\t\t(pWscControl->WscMode == WSC_SMPBC_MODE))\n        pWscControl->WscPinCode = 0;\n    else\n        pWscControl->WscPinCode = PinCode;\n\n    memset(pWscControl->RegData.PIN, 0, 8);\n\n\tif (pWscControl->WscPinCode == 0)\n\t{\n\t\tsnprintf((PSTRING) tempPIN, sizeof(tempPIN), \"00000000\");\n\t\tmemcpy(pWscControl->RegData.PIN, tempPIN, 8);\n\t\tpWscControl->RegData.PinCodeLen = 8;\n\t}\n\telse\n\t{\n\t\tif ( pWscControl->WscPinCodeLen == 4)\n\t\t{\n\t\t\tUCHAR\ttemp4PIN[5] = {0};\n\t\t\tsnprintf((PSTRING) temp4PIN, sizeof(temp4PIN), \"%04u\", pWscControl->WscPinCode);\n\t\t\tmemcpy(pWscControl->RegData.PIN, temp4PIN, 4);\n\t\t\tpWscControl->RegData.PinCodeLen = 4;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsnprintf((PSTRING) tempPIN, sizeof(tempPIN), \"%08u\", pWscControl->WscPinCode);\n\t\t\tmemcpy(pWscControl->RegData.PIN, tempPIN, 8);\n\t\t\tpWscControl->RegData.PinCodeLen = 8;\n\t\t}\n\t}\n\thex_dump(\"WscGetRegDataPIN - PIN\", pWscControl->RegData.PIN, 8);\n}\n\nVOID    WscEapActionDisabled(\n    IN  PRTMP_ADAPTER       pAdapter,\n    IN  PWSC_CTRL           pWscControl)\n{\n\tINT     DataLen = 0;\n\tUCHAR   *WscData = NULL;\n\t/*BOOLEAN Cancelled;*/\n\n\tos_alloc_mem(NULL, &WscData, 256);\n\n\tif (WscData == NULL)\n\t\treturn;\n\t\n\tDataLen = BuildMessageNACK(pAdapter, pWscControl, WscData);\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t{\n\t\tif (pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_APCLI)\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\telse\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t{\n\t\tif (ADHOC_ON(pAdapter) && (pWscControl->WscConfMode & WSC_REGISTRAR))\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_REQ);\n\t\telse\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, WscData, DataLen, pWscControl, STA_MODE, EAP_CODE_RSP);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (WscData)\n\t\tos_free_mem(NULL, WscData);\n\t\n\t/* RTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled); */\n\t/* pWscControl->EapolTimerRunning = FALSE; */\n}\n\nVOID    WscGetConfigErrFromNack(\n    IN  PRTMP_ADAPTER       pAdapter,\n    IN\tMLME_QUEUE_ELEM\t    *pElem,\n    OUT USHORT\t\t\t\t*pConfigError)\n{\n    USHORT\t\t\t\tLength = 0;\n\tPUCHAR\t\t\t\tpData;\n\tUSHORT\t\t\t\tWscType, WscLen, ConfigError = 0;\n\n    pData = pElem->Msg;\n    Length = pElem->MsgLen;\n    \n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n        \n\t\tif (WscType == WSC_ID_CONFIG_ERROR)\n\t\t{\n\t\t\tNdisMoveMemory(&ConfigError, pData, sizeof(USHORT));\n\t\t    DBGPRINT(RT_DEBUG_TRACE, (\"WSC_ID_CONFIG_ERROR: %d\\n\", ntohs(ConfigError)));\n\t\t\t*pConfigError = ntohs(ConfigError);\n\t\t\treturn;\n\t\t}\n        \n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n    DBGPRINT(RT_DEBUG_TRACE, (\"WSC_ID_CONFIG_ERROR is missing\\n\"));\n}\n\nINT\tWscSetAuthMode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  UCHAR\t\t\tCurOpMode,\n\tIN  UCHAR\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tUINT32\ti;\n\n\t\tif ((strcmp(arg, \"WEPAUTO\") == 0) || (strcmp(arg, \"wepauto\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeAutoSwitch;\n\t\telse if ((strcmp(arg, \"OPEN\") == 0) || (strcmp(arg, \"open\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\t\telse if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeShared;\n\t\telse if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPAPSK;\n\t\telse if ((strcmp(arg, \"WPA\") == 0) || (strcmp(arg, \"wpa\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA;\n\t\telse if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA2PSK;\n\t\telse if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"wpa2\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA2;\n\t\telse if ((strcmp(arg, \"WPA1WPA2\") == 0) || (strcmp(arg, \"wpa1wpa2\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA1WPA2;\n\t\telse if ((strcmp(arg, \"WPAPSKWPA2PSK\") == 0) || (strcmp(arg, \"wpapskwpa2psk\") == 0))\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeWPA1PSKWPA2PSK;\n\t\telse\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[apidx].AuthMode = Ndis802_11AuthModeOpen;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Unknow AuthMode (%s), set AuthMode to OPEN\\n\", __FUNCTION__, arg));\n\t\t}\n\n\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t{\n\t\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))\n\t\t\t{\n\t\t\t\tpAd->MacTab.Content[i].PortSecured  = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t}\n\t\t}\n\t\tpAd->ApCfg.MBSSID[apidx].PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t/*RTMPMakeRSNIE(pAd, pAd->ApCfg.MBSSID[apidx].AuthMode, pAd->ApCfg.MBSSID[apidx].WepStatus, apidx); */\n\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId  = 0;\n\n\t\tif(pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 0;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) %s::(AuthMode=%d)\\n\", apidx, __FUNCTION__, pAd->ApCfg.MBSSID[apidx].AuthMode));    \n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (strcmp(arg, \"WEPAUTO\") == 0)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;\n\t\telse if (strcmp(arg, \"OPEN\") == 0)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n\t\telse if (strcmp(arg, \"SHARED\") == 0)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;\n\t\telse if (strcmp(arg, \"WPAPSK\") == 0)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;\n\t\telse if (strcmp(arg, \"WPANONE\") == 0)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;\n\t\telse if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"WPAPSKWPA2PSK\") == 0))\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;    \n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\telse if (strcmp(arg, \"WPA\") == 0)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;    \n\t\telse if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"WPA1WPA2\") == 0))\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\telse\n\t\t\treturn FALSE;  \n\n\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK))\n\t\t{\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;\n\t\t}\n\n\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSetAuthMode::(AuthMode=%d)\\n\", pAd->StaCfg.AuthMode));\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\nINT\tWscSetEncrypType(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  UCHAR\t\t\tCurOpMode,\n\tIN  UCHAR\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\n\tif ((strcmp(arg, \"NONE\") == 0) || (strcmp(arg, \"none\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPDisabled;\n\telse if ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPEnabled;\n\telse if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption2Enabled;\n\telse if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption3Enabled;\n\telse if ((strcmp(arg, \"TKIPAES\") == 0) || (strcmp(arg, \"tkipaes\") == 0))\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11Encryption4Enabled;\n\telse\n    \t{\n\t\tpAd->ApCfg.MBSSID[apidx].WepStatus = Ndis802_11WEPDisabled;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Unknow EncrypType (%s), set EncrypType to NONE\\n\", __FUNCTION__, arg));\n\t}\n\n\tif (pAd->ApCfg.MBSSID[apidx].WepStatus >= Ndis802_11Encryption2Enabled)\n\t\tpAd->ApCfg.MBSSID[apidx].DefaultKeyId = 0;\n\n\t/*RTMPMakeRSNIE(pAd, pAd->ApCfg.MBSSID[apidx].AuthMode, pAd->ApCfg.MBSSID[apidx].WepStatus, apidx); */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) %s::(EncrypType=%d)\\n\", apidx, __FUNCTION__, pAd->ApCfg.MBSSID[apidx].WepStatus));\n\n\treturn TRUE;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (strcmp(arg, \"NONE\") == 0)\n\t\t{\n\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t\treturn TRUE;    /* do nothing */\n            \n\t\t\tpAd->StaCfg.WepStatus     = Ndis802_11WEPDisabled;\n\t\t\tpAd->StaCfg.PairCipher    = Ndis802_11WEPDisabled;\n\t\t\tpAd->StaCfg.GroupCipher   = Ndis802_11WEPDisabled;\n\t\t}\n\t\telse if (strcmp(arg, \"WEP\") == 0)\n\t\t{\n\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t\treturn TRUE;    /* do nothing */\n\n\t\t\tpAd->StaCfg.WepStatus     = Ndis802_11WEPEnabled;\n\t\t\tpAd->StaCfg.PairCipher    = Ndis802_11WEPEnabled;\n\t\t\tpAd->StaCfg.GroupCipher   = Ndis802_11WEPEnabled;\n\t\t}\n\t\telse if (strcmp(arg, \"TKIP\") == 0)\n\t\t{\n\t\t\tif (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\treturn TRUE;    /* do nothing */\n\n\t\t\tpAd->StaCfg.WepStatus     = Ndis802_11Encryption2Enabled;\n\t\t\tpAd->StaCfg.PairCipher    = Ndis802_11Encryption2Enabled;\n\t\t\tpAd->StaCfg.GroupCipher   = Ndis802_11Encryption2Enabled;\n\t\t}\n\t\telse if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"TKIPAES\") == 0))\n\t\t{\n\t\t\tif (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n\t\t\treturn TRUE;    /* do nothing */\n\n\t\t\tpAd->StaCfg.WepStatus     = Ndis802_11Encryption3Enabled;\n\t\t\tpAd->StaCfg.PairCipher    = Ndis802_11Encryption3Enabled;\n\t\t\tpAd->StaCfg.GroupCipher   = Ndis802_11Encryption3Enabled;\n\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSetEncrypType::(EncrypType=%d)\\n\", pAd->StaCfg.WepStatus));\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n#ifdef CONFIG_STA_SUPPORT\nUSHORT WscGetAuthTypeFromStr(\n    IN  PSTRING          arg)\n{\n    if ((strcmp(arg, \"OPEN\") == 0) || (strcmp(arg, \"open\") == 0))\n        return WSC_AUTHTYPE_OPEN;\n    else if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n        return WSC_AUTHTYPE_SHARED;\n    else if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n        return WSC_AUTHTYPE_WPAPSK;\n    else if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0))\n        return WSC_AUTHTYPE_WPA2PSK;\n#ifdef WPA_SUPPLICANT_SUPPORT\n    else if ((strcmp(arg, \"WPA\") == 0) || (strcmp(arg, \"wpa\") == 0))\n        return WSC_AUTHTYPE_WPA;\n    else if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"wpa2\") == 0))\n        return WSC_AUTHTYPE_WPA2;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n    else\n        return 0;\n}\n\nUSHORT WscGetEncrypTypeFromStr(\n    IN  PSTRING          arg)\n{\n    if ((strcmp(arg, \"NONE\") == 0) || (strcmp(arg, \"none\") == 0))\n        return WSC_ENCRTYPE_NONE;\n    else if ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n        return WSC_ENCRTYPE_WEP;\n    else if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n        return WSC_ENCRTYPE_TKIP;\n    else if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0))\n        return WSC_ENCRTYPE_AES;\n    else\n        return 0;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tPush PBC from HW/SW Buttton\n\n\tArguments:\n\t\tpAd    - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\n\nVOID\tWscPushPBCAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL   \tpWscControl)\n{\n\tBOOLEAN\t\tCancelled;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscPushPBCAction\\n\"));\n\n\t/* 0. PBC mode, disregard the SSID information, we have to get the current AP list */\n\t/*    and check the beacon for Push buttoned AP. */\n\n\t/* 1. Cancel old timer to prevent use push continuously */\n\tif (pWscControl->Wsc2MinsTimerRunning)\n\t{\n\t\tpWscControl->Wsc2MinsTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->Wsc2MinsTimer, &Cancelled);\n\t}\n\tif (pWscControl->WscScanTimerRunning)\n\t{\n\t\tpWscControl->WscScanTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscScanTimer, &Cancelled);\n\t}\n\tif (pWscControl->WscPBCTimerRunning)\n\t{\n\t\tpWscControl->WscPBCTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscPBCTimer, &Cancelled);\n\t}\n\t\n\t/* Set WSC state to WSC_STATE_INIT */\n\tpWscControl->WscState = WSC_STATE_START;\n\tpWscControl->WscStatus = STATUS_WSC_SCAN_AP;\n\n\t/* Init Registrar pair structures */\n\tWscInitRegistrarPair(pAd, pWscControl, BSS0);\n\n\t/* For PBC, the PIN is all '0' */\n\tWscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);\n \t\t\t\t\n\t/* 2. Set 2 min timout routine */\n\tRTMPSetTimer(&pWscControl->Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);\n\tpWscControl->Wsc2MinsTimerRunning = TRUE;\n\tpWscControl->bWscTrigger = TRUE;\t/* start work */\n\n\n\t/* 3. Call WscScan subroutine */\n\tWscScanExec(pAd, pWscControl);\n\n\t/* 4. Set 10 second timer to invoke PBC connection actions. */\n\tRTMPSetTimer(&pWscControl->WscPBCTimer, 10000);\n\tpWscControl->WscPBCTimerRunning = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscPushPBCAction\\n\"));\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tDoing an active scan with empty SSID, the scanened list will\n\t\tbe processed in PBCexec or PINexec routines\n\n\tArguments:\n\t\tpAd         - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID\tWscScanExec(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL   \tpWscControl) \n{\n#ifdef WSC_LED_SUPPORT\n\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\n\t/* Prevent infinite loop if conncet time out didn't stop the repeat scan */\n\tif ((pWscControl->WscStatus == STATUS_WSC_FAIL) ||\n\t\t(pWscControl->WscState == WSC_STATE_OFF))\n\t\treturn;\n\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"!!! WscScanExec !!!\\n\"));\n\n\tpWscControl->WscStatus = STATUS_WSC_SCAN_AP;\n\n#ifdef WSC_LED_SUPPORT\n\t/* The protocol is connecting to a partner. */\n\tWPSLEDStatus = LED_WPS_IN_PROCESS;\n\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef APCLI_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE);\n\t}\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tpAd->StaCfg.bNotFirstScan = TRUE;\n\t\tStaSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tDoing PBC conenction verification, it will check current BSS list\n\t\tand find the correct number of PBC AP. If only 1 exists, it will\n\t\tstart to make connection. Otherwise, it will set a scan timer\n\t\tto perform another scan for next PBC connection execution.\n\n\tArguments:\n\t\tpAd         - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nBOOLEAN\tWscPBCExec(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  BOOLEAN\t\t\tbFromM2,\n\tIN  PWSC_CTRL       pWscControl)\n{\n#ifdef WSC_LED_SUPPORT\n\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\tUCHAR CurOpMode = AP_MODE;\n\n\tif (pWscControl == NULL)\n\t\treturn FALSE;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pWscControl->EntryIfIdx == BSS0)\n\t\t\tCurOpMode = STA_MODE;\n\t}\n#endif // CONFIG_STA_SUPPORT //\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"-----> WscPBCExec !!!\\n\"));\n\t\n\t/* 1. Search the qualified SSID from current SSID list */\n\tWscPBCBssTableSort(pAd, pWscControl);\n\t\t\t\t\n\t/* 2. Check the qualified AP for connection, if more than 1 AP avaliable, report error. */\n\tif (pWscControl->WscPBCBssCount != 1)\n\t{\n\t\t/* Set WSC state to WSC_FAIL */\n\t\tpWscControl->WscState = WSC_STATE_FAIL;\n\t\tif (pWscControl->WscPBCBssCount== 0)\n\t\t{\n\t\t\tpWscControl->WscStatus = STATUS_WSC_PBC_NO_AP;\n#ifdef WSC_LED_SUPPORT\n\t\t\t/* Failed to find any partner. */\n\t\t\tWPSLEDStatus = LED_WPS_ERROR;\n\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n#ifdef CONFIG_WIFI_LED_SUPPORT\n\t\t\t\tif (LED_MODE(pAd) == WPS_LED_MODE_SHARE)\n\t\t\t\t\tRTMPSetTimer(&pWscControl->WscLEDTimer, WSC_WPS_FAIL_WIFI_LED_TIMEOUT);\n#endif /* CONFIG_WIFI_LED_SUPPORT */\n\n#endif /* WSC_LED_SUPPORT */\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"WscPBCExec --> AP list is %d, wait for next time\\n\", \n\t\t\t\t\t\t\tpWscControl->WscPBCBssCount));\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t/*\n\t\t\t\tP2P PBC CLI doesn't need to check PBC overlapping, \n\t\t\t\tso we don't need to consider P2P case here.\n\t\t\t*/\n\t\t\tif (pAd->StaCfg.BssType == BSS_INFRA)\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t{\n\t\t\t\t/* 2.1. Set 1 second timer to invoke another scan */\n\t\t\t\tRTMPSetTimer(&pWscControl->WscScanTimer, 1000);\n\t\t\t\tpWscControl->WscScanTimerRunning = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpWscControl->WscStatus = STATUS_WSC_PBC_TOO_MANY_AP;\t\t\t\n\t\t\tRTMPSendWirelessEvent(pAd, IW_WSC_PBC_SESSION_OVERLAP, NULL, BSS0, 0); \n\n#ifdef WSC_LED_SUPPORT\n\t\t\tif (LED_MODE(pAd) == WPS_LED_MODE_9) /* WPS LED mode 9. */\n\t\t\t{\n\t\t\t\t/* In case of the WPS LED mode 9, the UI would abort the connection attempt by making the RT_OID_802_11_WSC_SET_WPS_STATE_MACHINE_TERMINATION request. */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Skip the WPS session overlap detected LED indication.\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\telse /* Other LED mode. */\n\t\t\t{\n\t\t\t/* Session overlap detected. */\n\t\t\tWPSLEDStatus = LED_WPS_SESSION_OVERLAP_DETECTED;\n\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n\n\n\t\t\t}\n#endif /* WSC_LED_SUPPORT */\n\n\t\t\t/*\n\t\t\t\t20101210 - According to the response from WFA:\n\t\t\t\tThe station shall not continue scanning waiting for only one registrar to appear\n\t\t\t*/\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscPBCExec --> AP list is %d, stop WPS process!\\n\", \n\t\t\t\t\t\tpWscControl->WscPBCBssCount));\n\n\t\t\tWscStop(pAd, \n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tFALSE,\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t\tpWscControl);\n\t\t\tpWscControl->WscConfMode = WSC_DISABLE;\n\t\t\tRTMPZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;\n\t\t\tRTMPMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\t}\n\n\t\t/* 2.2 We have to quit for now */\n\t\treturn FALSE;\n\t}\n\n\tif (bFromM2)\n\t\treturn TRUE;\n\n\n\t/* 3. Now we got the intend AP, Set the WSC state and enqueue the SSID connection command */\n\tpAd->MlmeAux.CurrReqIsFromNdis = FALSE; \n#ifdef CONFIG_STA_SUPPORT\n\tif (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t{\n\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"!!! WscPBCExec --> MLME busy, reset MLME state machine !!!\\n\"));\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\n#ifdef CONFIG_STA_SUPPORT\n\t/* 4. Set WSC state to WSC_STATE_START */\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tpWscControl->WscState = WSC_STATE_START;\n\t\tpWscControl->WscStatus = STATUS_WSC_START_ASSOC;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef WSC_LED_SUPPORT\n\t/* The protocol is connecting to a partner. */\n\tWPSLEDStatus = LED_WPS_IN_PROCESS;\n\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef APCLI_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tSTRING\tChStr[5] = {0};\n\n\t\tNdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr,\n\t                   pAd->ApCfg.ApCliTab[BSS0].CurrentAddress, \n\t                   MAC_ADDR_LEN);\n\n\t\tsnprintf(ChStr, sizeof(ChStr), \"%d\", pAd->MlmeAux.Channel);\n\t\tSet_Channel_Proc(pAd, ChStr);\n\t\t\n\t    /* bring apcli interface down first */\n\t\tif(pAd->ApCfg.ApCliTab[BSS0].Enable == TRUE)\n\t\t{\n\t\t\tpAd->ApCfg.ApCliTab[BSS0].Enable = FALSE;\n\t\t\tApCliIfDown(pAd);\n\t\t}\n\t    pAd->ApCfg.ApCliTab[BSS0].Enable = TRUE;\n\t}\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* Enqueue BSSID connection command */\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\t{\n\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\tOID_802_11_BSSID, \n\t\t\t\t\tsizeof(NDIS_802_11_MAC_ADDRESS),\n\t\t\t\t\t\t(VOID *)&pWscControl->WscBssid[0], 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\tMLME_CNTL_STATE_MACHINE,\n\t\t\t\tOID_802_11_SSID,\n\t\t\t\tsizeof(NDIS_802_11_SSID),\n\t\t\t\t(VOID *)&pAd->StaCfg.WscControl.WscSsid, 0);\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"<----- WscPBCExec !!!\\n\"));\n\treturn TRUE;\n}\n\nBOOLEAN WscBssWpsIESearchForPBC(\n\tPRTMP_ADAPTER\t\tpAd,\n\tPWSC_CTRL\t\t\tpWscControl,\t\n\tPBSS_ENTRY\t\t\tpInBss,\n\tUUID_BSSID_CH_INFO\tApUuidBssid[],\n\tINT\t\t\t\t\tVarIeLen,\n\tPUCHAR\t\t\t\tpVar)\n{\n\tINT\t\t\t\t\tj = 0, Len = 0, idx = 0;\n\tBOOLEAN\t\t\t\tbFound, bSameAP, bSelReg;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tPBEACON_EID_STRUCT\tpEid;\n\tUSHORT\t\t\t\tDevicePasswordID;\n\tPWSC_IE\t\t\t\tpWscIE;\n\tUUID_BSSID_CH_INFO\tTmpInfo;\n\tUCHAR\t\t\t\tzeros16[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n#ifdef IWSC_SUPPORT\n\tUINT8\t\t\t\tRspType = 0;\n\tBOOLEAN\t\t\t\tbEntryAcceptable = FALSE;\n#endif // IWSC_SUPPORT //\n\n\tpData   = pVar;\n\tbFound  = FALSE;\n\tbSameAP = FALSE;\n\tbSelReg = FALSE;\n\tLen = VarIeLen;\n\tNdisZeroMemory(&TmpInfo, sizeof(UUID_BSSID_CH_INFO));\n\t\twhile ((Len > 0) && (bFound == FALSE))\n\t\t{\n\t\t\tpEid = (PBEACON_EID_STRUCT) pData;\n\t\t\t\n\t\t\t/* No match, skip the Eid and move forward, IE_WFA_WSC = 0xdd */\n\t\t\tif (pEid->Eid != IE_WFA_WSC)\n\t\t\t{\n\t\t\t\t/* Set the offset and look for next IE */\n\t\t\t\tpData += (pEid->Len + 2);\n\t\t\t\tLen   -= (pEid->Len + 2);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Found IE with 0xdd */\n\t\t\t\t/* check for WSC OUI -- 00 50 f2 04 */\n\t\t\tif ((NdisEqualMemory(pEid->Octet, WPS_OUI, 4) == FALSE)\n#ifdef IWSC_SUPPORT\n\t\t\t\t&& (NdisEqualMemory(pEid->Octet, IWSC_OUI, 4) == FALSE)\n#endif // IWSC_SUPPORT //\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t/* Set the offset and look for next IE */\n\t\t\t\t\tpData += (pEid->Len + 2);\n\t\t\t\t\tLen   -= (pEid->Len + 2);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t/* 3. Found\tAP with WSC IE in beacons, skip 6 bytes = 1 + 1 + 4 */\n\t\t\tpData += 6;\n\t\t\tLen   -= 6;\n\n\t\t\t/* 4. Start to look the PBC type within WSC VarIE */\n\t\t\twhile (Len > 0)\n\t\t\t{\n\t\t\t\t/* Check for WSC IEs */\n\t\t\t\tpWscIE = (PWSC_IE) pData;\n\n\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_SEL_REGISTRAR)\n\t\t\t\t{\n\t\t\t\thex_dump(\"SelReg:\", pData, 5);\n\t\t\t\tbSelReg = pWscIE->Data[0];\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"bSelReg = %d\\n\", bSelReg));\n\t\t\t}\n\n#ifdef IWSC_SUPPORT\n\t\t\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t\t\t(pAd->StaCfg.BssType == BSS_ADHOC))\n\t\t\t\t{\n\t\t\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_RESP_TYPE)\n\t\t\t\t\t{\n\t\t\t\t\t\tRspType = pWscIE->Data[0];\n\t\t\t\t\t\tif (RspType < WSC_MSGTYPE_REGISTRAR)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbFound = FALSE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tTmpInfo.RspType = RspType;\n\t\t\t\t\t}\n\t\t\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_MAC_ADDR)\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR mac_addr[MAC_ADDR_LEN];\n\t\t\t\t\t\tRTMPMoveMemory(mac_addr, (pData+4), MAC_ADDR_LEN);\n\t\t\t\t\t\tif (NdisCmpMemory(pInBss->MacAddr, mac_addr, MAC_ADDR_LEN))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbFound = FALSE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_ENTRY_ACCEPTABLE)\n\t\t\t\t\t{\n\t\t\t\t\t\thex_dump(\"EntryAcceptable:\", pData, 5);\n\t\t\t\t\t\tbEntryAcceptable = pWscIE->Data[0];\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"bEntryAcceptable = %d\\n\", bEntryAcceptable));\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* IWSC_SUPPORT */\n\n\t\t\t\t/* Check for device password ID, PBC = 0x0004, SMPBC = 0x0006 */\n\t\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_DEVICE_PWD_ID)\n\t\t\t\t{\n\t\t\t\t\t/* Found device password ID */\n#ifdef WINBOND\n\t\t\t\t\t/*The Winbond's platform will fail to retrive 2-bytes data, if use the original */\n\t\t\t\t\t/*be2cpu16<-- */\n\t\t\t\t\tDevicePasswordID = WINBON_GET16((PUCHAR)&pWscIE->Data[0]);\n#else\n\t\t\t\t\tDevicePasswordID = be2cpu16(get_unaligned((USHORT *)&pWscIE->Data[0]));\n\t\t\t\t\t/*DevicePasswordID = be2cpu16(*((USHORT *) &pWscIE->Data[0])); */\n#endif /* WINBOND */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscPBCBssTableSort : DevicePasswordID = 0x%04x\\n\", DevicePasswordID));\n\t\t\t\t\tif (((pWscControl->WscMode == WSC_PBC_MODE) && (DevicePasswordID == DEV_PASS_ID_PBC)) ||\n\t\t\t\t\t\t((pWscControl->WscMode == WSC_SMPBC_MODE) && (DevicePasswordID == DEV_PASS_ID_SMPBC)))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Found matching PBC AP in current list, add it into table and add the count */\n\t\t\t\t\t\tbFound = TRUE;\n\t\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DPID=PBC Found --> \\n\"));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"#  Bssid %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\tpInBss->Bssid[0], pInBss->Bssid[1], pInBss->Bssid[2], pInBss->Bssid[3], pInBss->Bssid[4], pInBss->Bssid[5]));\n\n\t\t\t\t\t\tif (pInBss->Channel > 14)\n\t\t\t\t\t\t\tTmpInfo.Band = WSC_RFBAND_50GHZ;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tTmpInfo.Band = WSC_RFBAND_24GHZ;\n\n\t\t\t\t\t\tRTMPMoveMemory(&TmpInfo.Bssid[0], &pInBss->Bssid[0], MAC_ADDR_LEN);\n\t\t\t\t\t\tTmpInfo.Channel = pInBss->Channel;\n\t\t\t\t\t\tRTMPZeroMemory(&TmpInfo.Ssid[0], MAX_LEN_OF_SSID);\n\t\t\t\t\t\tRTMPMoveMemory(&TmpInfo.Ssid[0], &pInBss->Ssid[0], pInBss->SsidLen);\n\t\t\t\t\t\tTmpInfo.SsidLen = pInBss->SsidLen;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* UUID_E is optional for beacons, but mandatory for probe-request */\n\t\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_UUID_E)\n\t\t\t\t{\n\t\t\t\t\t/* Avoid error UUID-E storage from PIN mode */\n\t\t\t\t\tRTMPMoveMemory(&TmpInfo.Uuid[0], (UCHAR *)(pData+4), 16);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Set the offset and look for PBC information */\n\t\t\t\t/* Since Type and Length are both short type, we need to offset 4, not 2 */\n\t\t\t\tpData += (be2cpu16(pWscIE->Length) + 4);\n\t\t\t\tLen   -= (be2cpu16(pWscIE->Length) + 4);\n\t\t\t}\n\t\t\t\n#ifdef IWSC_SUPPORT\n\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) && \n\t\t\t(pWscControl->WscMode == WSC_SMPBC_MODE) &&\n\t\t\t(bEntryAcceptable == FALSE) && bFound)\n\t\t{\n\t\t\tbFound = FALSE;\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t\n\t\tif ((bFound == TRUE) && (bSelReg == TRUE))\n\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\tif (pWscControl->WscPBCBssCount == 8)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (pWscControl->WscPBCBssCount > 0)\n\t\t\t\t{\n\t\t\t\t\tfor (j = 0; j < pWscControl->WscPBCBssCount; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (RTMPCompareMemory(&ApUuidBssid[j].Uuid[0], &TmpInfo.Uuid[0], 16) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (RTMPCompareMemory(&TmpInfo.Uuid[0], zeros16, 16) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\tSame UUID, indicate concurrent AP\n\t\t\t\t\t\t\t\t \tWe can indicate 1 AP only.\n\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\tbSameAP = TRUE;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (RTMPCompareMemory(&TmpInfo.Uuid[0], zeros16, 16) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (ApUuidBssid[j].Band != TmpInfo.Band)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (RTMPCompareMemory(&ApUuidBssid[j].Bssid[0], &TmpInfo.Bssid[0], 5) == 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\tZero UUID at different band, and first 5bytes of two BSSIDs are the same.\n\t\t\t\t\t\t\t\t\t\t\tIndicate concurrent AP, we can indicate 1 AP only.\n\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\tbSameAP = TRUE;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((RTMPCompareMemory(&TmpInfo.Uuid[0], zeros16, 16) == 0) ||\n\t\t\t\t\t\t\t\t (RTMPCompareMemory(&ApUuidBssid[j].Uuid[0], zeros16, 16) == 0))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((RTMPCompareMemory(&ApUuidBssid[j].Bssid[0], &TmpInfo.Bssid[0], 5) == 0) &&\n\t\t\t\t\t\t\t\t(ApUuidBssid[j].Band != TmpInfo.Band))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tINT tmpDiff = (INT)(ApUuidBssid[j].Bssid[5] - TmpInfo.Bssid[5]);\n\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\tZero UUID and Non-zero UUID at different band, and two BSSIDs are very close.\n\t\t\t\t\t\t\t\t\tIndicate concurrent AP, we can indicate 1 AP only.\n\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\tif ((tmpDiff <= 4) || \n\t\t\t\t\t\t\t\t\t(tmpDiff >= -4))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tbSameAP = TRUE;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (bSameAP)\n\t\t\t\t{\n\t\t\t\t\tif ((pWscControl->WpsApBand == PREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST) &&\n\t\t\t\t\t\t(TmpInfo.Band == WSC_RFBAND_24GHZ) &&\n\t\t\t\t\t\t(ApUuidBssid[j].Band != TmpInfo.Band))\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[j].Bssid[0]), &TmpInfo.Bssid[0], MAC_ADDR_LEN);\n\t\t\t\t\t\tRTMPZeroMemory(&(ApUuidBssid[j].Ssid[0]), MAX_LEN_OF_SSID);\n\t\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[j].Ssid[0]), &TmpInfo.Ssid[0], TmpInfo.SsidLen);\n\t\t\t\t\t\tApUuidBssid[j].SsidLen = TmpInfo.SsidLen;\n\t\t\t\t\t\tApUuidBssid[j].Channel = TmpInfo.Channel;\n\t\t\t\t\t}\n\t\t\t\t\telse if ((pWscControl->WpsApBand == PREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST) &&\n\t\t\t\t\t\t\t (TmpInfo.Band == WSC_RFBAND_50GHZ) &&\n\t\t\t\t\t\t\t (ApUuidBssid[j].Band != TmpInfo.Band))\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[j].Bssid[0]), &TmpInfo.Bssid[0], MAC_ADDR_LEN);\n\t\t\t\t\t\tRTMPZeroMemory(&(ApUuidBssid[j].Ssid[0]), MAX_LEN_OF_SSID);\n\t\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[j].Ssid[0]), &TmpInfo.Ssid[0], TmpInfo.SsidLen);\n\t\t\t\t\t\tApUuidBssid[j].SsidLen = TmpInfo.SsidLen;\n\t\t\t\t\t\tApUuidBssid[j].Channel = TmpInfo.Channel;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (bSameAP == FALSE)\n\t\t\t\t{\n\t\t\t\t\tUCHAR index = pWscControl->WscPBCBssCount;\n\t\t\t\t\t\n\t\t\t\t\t/* Store UUID */\n\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[index].Uuid[0]), &TmpInfo.Uuid[0], 16);\n\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[index].Bssid[0]), &pInBss->Bssid[0], MAC_ADDR_LEN);\n\t\t\t\t\tRTMPZeroMemory(&(ApUuidBssid[index].Ssid[0]), MAX_LEN_OF_SSID);\n\t\t\t\t\tRTMPMoveMemory(&(ApUuidBssid[index].Ssid[0]), &pInBss->Ssid[0], pInBss->SsidLen);\n\t\t\t\t\tApUuidBssid[index].SsidLen = pInBss->SsidLen;\n\t\t\t\t\tApUuidBssid[index].Channel = pInBss->Channel;\n\t\t\t\t\tif (ApUuidBssid[index].Channel > 14)\n\t\t\t\t\t\tApUuidBssid[index].Band = WSC_RFBAND_50GHZ;\n\t\t\t\t\telse\n\t\t\t\t\t\tApUuidBssid[index].Band = WSC_RFBAND_24GHZ;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"UUID-E= \"));\n\t\t\t\t\tfor(idx=0; idx<16; idx++)\n\t\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"%02x  \", ApUuidBssid[index].Uuid[idx]));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"\\n\"));\n\n\t\t\t\t\tpWscControl->WscPBCBssCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\treturn (bFound && bSelReg);\n}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tFind WSC PBC activated AP list\n\n\tArguments:\n\t\tpAd         - NIC Adapter pointer\n\t\tOutTab\t\t- Qualified AP BSS table\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tAll these constants are defined in wsc.h\n\t\t\n\t========================================================================\n*/\nVOID WscPBCBssTableSort(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl)\n{\n\tINT\t\t\t\t\ti;\n\tPBSS_ENTRY\t\t\tpInBss;\t\t\n/*\tUUID_BSSID_CH_INFO\tApUuidBssid[8]; */\n\tUUID_BSSID_CH_INFO\t*ApUuidBssid = NULL;\n\tBOOLEAN\t\t\t\trv = FALSE;\n\tUCHAR\t\t\t\tCurOpMode = AP_MODE;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pWscControl->EntryIfIdx == BSS0)\n\t\t\tCurOpMode = STA_MODE;\n\t}\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef APCLI_SUPPORT\nif (CurOpMode == AP_MODE)\n\tpWscControl = &pAd->ApCfg.ApCliTab[BSS0].WscControl;\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nif (CurOpMode == STA_MODE)\n\tpWscControl = &pAd->StaCfg.WscControl;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (pWscControl == NULL)\n\t\treturn;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&ApUuidBssid, sizeof(UUID_BSSID_CH_INFO)*8);\n\tif (ApUuidBssid == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(&ApUuidBssid[0], sizeof(UUID_BSSID_CH_INFO));\n\tpWscControl->WscPBCBssCount = 0;\n\tfor (i = 0; i < pAd->ScanTab.BssNr; i++) \n\t{\n\t\t/* BSS entry for VarIE processing */\n\t\tpInBss  = (PBSS_ENTRY) &pAd->ScanTab.BssEntry[i];\t\t\n\n\t\t/* 1. Check VarIE length */\n\t\tif (pInBss->VarIELen == 0)\n\t\t\tcontinue;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((CurOpMode == STA_MODE) && (pInBss->BssType != pAd->StaCfg.BssType))\n\t\t\tcontinue;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/* 2. Search for WSC IE - 0xdd xx 00 50 f2 04 */\n\t\trv = WscBssWpsIESearchForPBC(pAd, \n\t\t\t\t\t\t\t\t\tpWscControl,\n\t\t\t\t\t\t\t\t\tpInBss,\n\t\t\t\t\t\t\t\t\tApUuidBssid,\n\t\t\t\t\t\t\t\t\tpInBss->VarIELen,\n\t\t\t\t\t\t\t\t\tpInBss->VarIEs);\n\t\tif (rv == FALSE)\n\t\t{\n\t\t\tWscBssWpsIESearchForPBC(pAd, \n\t\t\t\t\t\t\t\t\tpWscControl,\n\t\t\t\t\t\t\t\t\tpInBss,\n\t\t\t\t\t\t\t\t\tApUuidBssid,\n\t\t\t\t\t\t\t\t\tpInBss->VarIeFromProbeRspLen,\n\t\t\t\t\t\t\t\t\tpInBss->pVarIeFromProbRsp);\n\t\t}\n\t}\n\n\tif (pWscControl->WscPBCBssCount == 1)\n\t{\n\t\tRTMPZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));\n\t\tRTMPMoveMemory(pWscControl->WscSsid.Ssid, ApUuidBssid[0].Ssid, ApUuidBssid[0].SsidLen);\n\t\tpWscControl->WscSsid.SsidLength = ApUuidBssid[0].SsidLen;\n\t\tRTMPZeroMemory(pWscControl->WscBssid, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pWscControl->WscBssid, ApUuidBssid[0].Bssid, MAC_ADDR_LEN);\n#ifdef CONFIG_STA_SUPPORT\n\t\tRTMPZeroMemory(pWscControl->WscPeerMAC, MAC_ADDR_LEN);\n\t\tRTMPMoveMemory(pWscControl->WscPeerMAC, ApUuidBssid[0].MacAddr, MAC_ADDR_LEN);\n#endif /* CONFIG_STA_SUPPORT */\n\t\tpAd->MlmeAux.Channel = ApUuidBssid[0].Channel;\n\n#ifdef APCLI_SUPPORT\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[BSS0].CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[BSS0].CfgSsid, ApUuidBssid[0].Ssid, ApUuidBssid[0].SsidLen);\n\t\tpAd->ApCfg.ApCliTab[BSS0].CfgSsidLen = (UCHAR)ApUuidBssid[0].SsidLen;\n\t\t}\n#endif /* APCLI_SUPPORT */\n\n\t}\n\n\tif (ApUuidBssid != NULL)\n\t\tos_free_mem(NULL, ApUuidBssid);\n\n#ifdef IWSC_SUPPORT\n\tif (pWscControl->WscMode == WSC_SMPBC_MODE)\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"WscPBCBssTableSort : Total %d SMPBC Registrar Found\\n\", pWscControl->WscPBCBssCount));\n\telse\n#endif /* IWSC_SUPPORT */\n\tDBGPRINT(RT_DEBUG_OFF, (\"WscPBCBssTableSort : Total %d PBC Registrar Found\\n\", pWscControl->WscPBCBssCount));\n}\n\nVOID\tWscGenRandomKey(\n\tIN  \tPRTMP_ADAPTER\tpAd,\n\tIN  \tPWSC_CTRL       pWscControl,\n\tINOUT\tPUCHAR\t\t\tpKey,\n\tINOUT\tPUSHORT\t\t\tpKeyLen)\n{\n\tUCHAR   tempRandomByte = 0;\n\tUCHAR   idx = 0;\n\tUCHAR   keylen = 0;\t \n\tUCHAR   retry = 0;\n\t\n\tNdisZeroMemory(pKey, 64);\n\n\t/*\n\t\tHex Key 64 digital\n\t*/\n\tif(pWscControl->WscKeyASCII == 0)\n\t{ \t\t\n\t\tUCHAR\ttmpStrB[3];\n\t\tfor (idx = 0; idx < 32; idx++)\n\t\t{\n\t\t\tNdisZeroMemory(&tmpStrB[0], sizeof(tmpStrB));\n\t\t\ttempRandomByte = RandomByte(pAd);\n\t\t\tsnprintf((PSTRING) &tmpStrB[0], 3, \"%02x\", tempRandomByte);\n\t\t\tNdisMoveMemory(pKey+(idx*2), &tmpStrB[0], 2);\n\t\t}\n\t\t*pKeyLen = 64;\n\t}\n\telse\n\t{\n\t\t/*\n\t\t\tASCII Key, random length \n\t\t*/\n\t\tif(pWscControl->WscKeyASCII == 1)\n\t\t{\n\t\t\tdo{\n\t\t\t\tkeylen = RandomByte(pAd);\n\t\t\t\tkeylen = keylen % 64;\n\t\t\t\tif(retry++ > 20)\n\t\t\t\t\tkeylen = 8;\n\t\t\t}while(keylen < 8);\n\t\t}\n\t\telse\n\t\t\tkeylen = pWscControl->WscKeyASCII;\n\n\t\t/*\n\t\t\tGenerate printable ASCII (decimal 33 to 126) \n\t\t*/\n\t\tfor(idx = 0; idx < keylen; idx++) \n\t\t{\n\t\t\ttempRandomByte = RandomByte(pAd)%94+33;\n\t\t\t*(pKey+idx) = tempRandomByte;\n\t\t}\n\t\t*pKeyLen = keylen;\n\t}\n}\n\nVOID\tWscCreateProfileFromCfg(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR               OpMode,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT PWSC_PROFILE        pWscProfile)\n{\n    UCHAR\t        apidx = (pWscControl->EntryIfIdx & 0x0F);\n    USHORT          authType = 0, encyType = 0;\n    UCHAR           WepKeyId = 0;\n    PWSC_CREDENTIAL pCredential = NULL;\n\tUCHAR\t\t\tCurOpMode = AP_MODE;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tif (pWscControl->EntryIfIdx == BSS0)\n\t\t\tCurOpMode = STA_MODE;\n\t}\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif ((OpMode & 0x0F) == AP_MODE)\n\t\t{\n\t\t\t/*\n\t\t\t\tAP needs to choose the STA's authType and encyType in two cases. \t\t \n\t\t\t\t1. AP is unconfigurated (authType and encyType will be updated to mixed mode by WscWriteConfToPortCfg() )\t\t \n\t\t\t\t2. AP's authType is mixed mode, we should choose the suitable authType and encyType to STA\t\t \n\t\t\t\tSTA's authType and encyType depend on WscSecurityMode flag \n\t\t\t*/\t\t\n\t\t\t\n\t\t\tif (((pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED ) || \n\t\t\t\t (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)) &&\n\t\t\t\t (OpMode & REGISTRAR_ACTION))\n\t\t\t{\t\t\t\n\t\t\t\tswitch (pAd->ApCfg.MBSSID[apidx].WscSecurityMode)\t\t\t\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tcase WPAPSKTKIP:\t\t\t\t\t\n\t\t\t\t\t\tauthType = WSC_AUTHTYPE_WPAPSK;\t\t\t\t\t\n\t\t\t\t\t\tencyType = WSC_ENCRTYPE_TKIP;\t\t\t\t\n\t\t\t\t\t\tbreak;\t\t\t\t\n\t\t\t\t\tcase WPAPSKAES:\t\t\t\t\t\n\t\t\t\t\t\tauthType = WSC_AUTHTYPE_WPAPSK;\t\t\t\t\t\n\t\t\t\t\t\tencyType = WSC_ENCRTYPE_AES;\t\t\t\t\n\t\t\t\t\t\tbreak;\t\t\t\t\n\t\t\t\t\tcase WPA2PSKTKIP:\t\t\t\t\t\n\t\t\t\t\t\tauthType = WSC_AUTHTYPE_WPA2PSK;\t\t\t\t\t\n\t\t\t\t\t\tencyType = WSC_ENCRTYPE_TKIP;\t\t\t\t\n\t\t\t\t\t\tbreak;\t\t\t\t\n\t\t\t\t\tcase WPA2PSKAES:\t\t\t\t\t\n\t\t\t\t\t\tauthType = WSC_AUTHTYPE_WPA2PSK;\t\t\t\t\t\n\t\t\t\t\t\tencyType = WSC_ENCRTYPE_AES;\t\t\t\t\n\t\t\t\t\t\tbreak;\t\t\t\t\n\t\t\t\t\tdefault:\t\t\t\t\t\n\t\t\t\t\t\tauthType = (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK);\n\t\t\t\t\t\tencyType = (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES);\n\t\t\t\t\t\tbreak;\t\t\t\n\t\t\t\t}\t\t\n\n\t\t\t\tif (pWscControl->WscConfStatus == WSC_SCSTATE_CONFIGURED)\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tAlthough AuthMode is mixed mode, cipher maybe not mixed mode.\n\t\t\t\t\t\tWe need to correct cipher here.\n\t\t\t\t\t*/\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\t\t\tencyType = WSC_ENCRTYPE_TKIP;\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11Encryption3Enabled)\n\t\t\t\t\t\tencyType = WSC_ENCRTYPE_AES;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauthType = WscGetAuthType(pAd->ApCfg.MBSSID[apidx].AuthMode);\n\t\t\t\tencyType = WscGetEncryType(pAd->ApCfg.MBSSID[apidx].WepStatus);\n\t\t\t}\n\t\t\tWepKeyId = pAd->ApCfg.MBSSID[apidx].DefaultKeyId;\n\t\t}\n#ifdef APCLI_SUPPORT    \n\t\telse if (OpMode == AP_CLIENT_MODE)\n\t\t{\n\t\t\tapidx = apidx & 0x0F;\n\t\t\tauthType = WscGetAuthType(pAd->ApCfg.ApCliTab[apidx].AuthMode);\n\t\t\tencyType = WscGetEncryType(pAd->ApCfg.ApCliTab[apidx].WepStatus);\n\t\t\tWepKeyId = pAd->ApCfg.ApCliTab[apidx].DefaultKeyId;\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tauthType = WscGetAuthType(pAd->StaCfg.AuthMode);\n\t\tencyType = WscGetEncryType(pAd->StaCfg.WepStatus);\n\t\tWepKeyId = pAd->StaCfg.DefaultKeyId;\n\t}\n#endif /* CONFIG_STA_SUPPORT */    \n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscGetDefaultProfileForM8\\n\"));\n\n\tpCredential = &pWscProfile->Profile[0]; /*Only support one credential now. 20070515 */\n\tNdisZeroMemory(pCredential, sizeof(WSC_CREDENTIAL));\n\tpWscProfile->ProfileCnt = 1;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: pWscControl->WscConfStatus  = %d, OpMode = %d\\n\",\n\t\t\t__FUNCTION__, pWscControl->WscConfStatus, OpMode));\n\n\t/* NewKey, NewKeyIndex for M8 */\n\tif ((WSC_SCSTATE_UNCONFIGURED == pWscControl->WscConfStatus) &&\n\t\t((((OpMode & 0x0F) == AP_MODE)\n#ifdef CONFIG_STA_SUPPORT\n\t\t  || (((OpMode & 0x0F) == STA_MODE) && (pAd->StaCfg.BssType == BSS_ADHOC))\n#endif /* CONFIG_STA_SUPPORT */\n\t\t  ) && (OpMode & REGISTRAR_ACTION)))\n\t{\n\t\tpCredential->KeyIndex = 1;\n\t\tif ((OpMode & 0x0F) == STA_MODE)\n\t\t{\n#ifdef IWSC_TEST_SUPPORT\n\t\t\tif (pAd->StaCfg.IWscInfo.IWscDefaultSecurity == 1)\n\t\t\t{\n\t\t\t\tauthType = WSC_AUTHTYPE_OPEN;\n\t\t\t\tencyType = WSC_ENCRTYPE_NONE;\n\t\t\t\tpCredential->KeyLength = 0;\n\t\t\t\tNdisZeroMemory(pCredential->Key, 64);\n\t\t\t}\n\t\t\telse if (pAd->StaCfg.IWscInfo.IWscDefaultSecurity == 2)\n\t\t\t{\n\t\t\t\tUCHAR\tidx;\n\t\t\t\tCHAR\ttempRandomByte;\n\t\t\t\tauthType = WSC_AUTHTYPE_OPEN;\n\t\t\t\tencyType = WSC_ENCRTYPE_WEP;\n\t\t\t\tfor(idx = 0; idx < 13; idx++)\n\t\t\t\t{\n\t\t\t\t\ttempRandomByte = RandomByte(pAd)%94+33;\n\t\t\t\t\tsprintf((PSTRING) pCredential->Key+idx, \"%c\", tempRandomByte);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tpCredential->KeyLength = 13;\n\t\t\t}\n\t\t\telse\n#endif // IWSC_TEST_SUPPORT //\n\t\t\t{\n\t\t\t\tWscGenRandomKey(pAd, pWscControl, pCredential->Key, &pCredential->KeyLength);\n\t\t\t\tauthType = WSC_AUTHTYPE_WPA2PSK;\n\t\t\t\tencyType = WSC_ENCRTYPE_AES;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tWscGenRandomKey(pAd, pWscControl, pCredential->Key, &pCredential->KeyLength);\n\t}\n    else\n\t{\n\t\tpCredential->KeyIndex = 1;\n\t\tpCredential->KeyLength = 0;\n\t\tNdisZeroMemory(pCredential->Key, 64);\n\t\tswitch (encyType)\n\t\t{\n\t\t\tcase WSC_ENCRTYPE_NONE:\n\t\t\t\tbreak;\n\t\t\tcase WSC_ENCRTYPE_WEP:\n\t\t\t\tpCredential->KeyIndex = (WepKeyId + 1);\n\t\t\t\tif (((OpMode & 0x0F) == AP_MODE || (OpMode & 0x0F) == STA_MODE) && pAd->SharedKey[apidx][WepKeyId].KeyLen)\n\t\t\t\t{\n\t\t\t\t\tINT i;\n\t\t\t\t\tfor (i=0; i<pAd->SharedKey[apidx][WepKeyId].KeyLen; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tsnprintf((PSTRING) pCredential->Key, 64, \"%s%02x\", pCredential->Key, pAd->SharedKey[apidx][WepKeyId].Key[i]);\n\t\t\t\t\t}\n\t\t\t\t\tpCredential->KeyLength = pAd->SharedKey[apidx][WepKeyId].KeyLen*2;\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\t\t\t\telse if ((OpMode == AP_CLIENT_MODE) && (pAd->ApCfg.ApCliTab[apidx].SharedKey[WepKeyId].KeyLen) && \n\t\t\t\t\t\t\t\t\t\t\t\t(CurOpMode == AP_MODE))\n\t\t\t\t{\n\t\t\t\t\tINT i;\n\t\t\t\t\tfor (i=0; i<pAd->ApCfg.ApCliTab[apidx].SharedKey[WepKeyId].KeyLen; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tsnprintf((PSTRING) pCredential->Key, 64, \"%s%02x\", pCredential->Key, pAd->ApCfg.ApCliTab[apidx].SharedKey[WepKeyId].Key[i]);\n\t\t\t\t\t}\n\t\t\t\t\tpCredential->KeyLength = pAd->SharedKey[apidx][WepKeyId].KeyLen*2;\n\t\t\t\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tbreak;\n\t\t\tcase WSC_ENCRTYPE_TKIP:\n\t\t\tcase WSC_ENCRTYPE_AES:\n\t\t\tcase (WSC_ENCRTYPE_AES | WSC_ENCRTYPE_TKIP):\n\t\t\t\tpCredential->KeyLength = pWscControl->WpaPskLen;\n\t\t\t\tmemcpy(pCredential->Key, \n\t\t\t\tpWscControl->WpaPsk, \n\t\t\t\tpWscControl->WpaPskLen);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCredential->AuthType = authType;\n\tpCredential->EncrType = encyType;\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif ((OpMode & 0x0F) == AP_MODE)\n\t\t{\n\t\t\tNdisMoveMemory(pCredential->MacAddr, pAd->ApCfg.MBSSID[apidx].Bssid, 6);\n\t\t\tif ((pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED) &&\n\t\t\t\t(pWscControl->WscDefaultSsid.SsidLength > 0) &&\n\t\t\t\t(pWscControl->WscDefaultSsid.SsidLength < 33))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pCredential->SSID.Ssid, pWscControl->WscDefaultSsid.Ssid, pWscControl->WscDefaultSsid.SsidLength);\n\t\t\t\tpCredential->SSID.SsidLength = pWscControl->WscDefaultSsid.SsidLength;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pCredential->SSID.Ssid, pAd->ApCfg.MBSSID[apidx].Ssid, pAd->ApCfg.MBSSID[apidx].SsidLen);\n\t\t\t\tpCredential->SSID.SsidLength = pAd->ApCfg.MBSSID[apidx].SsidLen;\n\t\t\t}\n\t\t}\n#ifdef APCLI_SUPPORT    \n\t\telse if (OpMode == AP_CLIENT_MODE)\n\t\t{\n\t\t\tNdisMoveMemory(pCredential->MacAddr, APCLI_ROOT_BSSID_GET(pAd, pAd->ApCfg.ApCliTab[apidx].MacTabWCID), 6);\n\t\t\tNdisMoveMemory(pCredential->SSID.Ssid, pAd->ApCfg.ApCliTab[apidx].Ssid, pAd->ApCfg.ApCliTab[apidx].SsidLen);\n\t\t\tpCredential->SSID.SsidLength = pAd->ApCfg.ApCliTab[apidx].SsidLen;\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\t\tNdisMoveMemory(pCredential->MacAddr, pAd->CommonCfg.Bssid, 6);\n\t\telse\n\t\t\tNdisMoveMemory(pCredential->MacAddr, pAd->CurrentAddress, 6);\n\t\tNdisMoveMemory(pCredential->SSID.Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\tpCredential->SSID.SsidLength = pAd->CommonCfg.SsidLen;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n    \n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2 && (OpMode & REGISTRAR_ACTION))\n\t\tNdisMoveMemory(pCredential->MacAddr, pWscControl->EntryAddr, 6);\n#endif /* WSC_V2_SUPPORT */\n    \n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscCreateProfileFromCfg\\n\"));\n\n}\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\nvoid    WscWriteConfToApCliCfg(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PWSC_CTRL       pWscControl,\n    IN  PWSC_CREDENTIAL pCredential,\n    IN  BOOLEAN         bEnrollee)\n{\n\tUCHAR\t\t\tCurApIdx = BSS0;\n\tAPCLI_STRUCT\t*pApCliTab;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscWriteConfToApCliCfg\\n\"));\n    \n\tCurApIdx = (pWscControl->EntryIfIdx & 0x0F);\n\t{\n\t\tpApCliTab = &pAd->ApCfg.ApCliTab[CurApIdx];\n\t\t\n\t\tNdisZeroMemory(pApCliTab->Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pApCliTab->Ssid, pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n\t\tpApCliTab->SsidLen = pCredential->SSID.SsidLength;\n\n\t\tNdisZeroMemory(pApCliTab->CfgSsid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pApCliTab->CfgSsid, pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n\t\tpApCliTab->CfgSsidLen = pCredential->SSID.SsidLength;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AuthType: %d, EncrType: %d\\n\", pCredential->AuthType, pCredential->EncrType));\n\t\tif ((pCredential->AuthType == WSC_AUTHTYPE_WPAPSK) || \n\t\t\t(pCredential->AuthType == WSC_AUTHTYPE_WPA2PSK))\n\t\t{\n\t\t\tif ((pCredential->EncrType != WSC_ENCRTYPE_TKIP) && (pCredential->EncrType != WSC_ENCRTYPE_AES))\n\t\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AuthType is WPAPSK or WPA2PAK.\\n\"\n\t\t\t                         \"Get illegal EncrType(%d) from External Registrar, set EncrType to TKIP\\n\", \n\t\t\t                          pCredential->EncrType));\n\t\t\tpCredential->EncrType = WSC_ENCRTYPE_TKIP;\n\t\t\t}\n\t\t}\n\t        Set_ApCli_AuthMode_Proc(pAd, WscGetAuthTypeStr(pCredential->AuthType));\n       \t Set_ApCli_EncrypType_Proc(pAd, WscGetEncryTypeStr(pCredential->EncrType));\n\t\t \n\t\tif (pCredential->EncrType != WSC_ENCRTYPE_NONE)\n\t\t{\n\t\t\t\tif (pCredential->EncrType & (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES))\n\t            {\n\t                pApCliTab->DefaultKeyId = 0;\n\n\t                if (pCredential->KeyLength >= 8 && pCredential->KeyLength <= 64)\n\t                {\n\t                    pWscControl->WpaPskLen = (INT) pCredential->KeyLength;\n\t\t\t\t\t\t\tNdisZeroMemory(pWscControl->WpaPsk, 64);\n\t\t\t\t\t\t\tNdisMoveMemory(pWscControl->WpaPsk, pCredential->Key, pWscControl->WpaPskLen);\n\t\t\t\t\t\t\tRT_CfgSetWPAPSKKey(pAd, (PSTRING) pCredential->Key, pWscControl->WpaPskLen, \n\t\t\t\t\t\t\t\t\t\t(PUCHAR)pApCliTab->Ssid, pApCliTab->SsidLen, \n\t\t\t\t\t\t\t\t\t\tpApCliTab->PMK);\n\t                    DBGPRINT(RT_DEBUG_TRACE, (\"WpaPskLen = %d\\n\", pWscControl->WpaPskLen));\n\t                }\n\t                else\n\t                {\n\t                    pWscControl->WpaPskLen = 0;\n\t                    DBGPRINT(RT_DEBUG_TRACE, (\"WPAPSK: Invalid Key Length (%d)\\n\", pCredential->KeyLength));\n\t                }\n\t            }\n\t            else if (pCredential->EncrType == WSC_ENCRTYPE_WEP)\n\t            {\n\t\t\t\tCHAR   WepKeyId = 0;\n\t\t\t\tUSHORT  WepKeyLen = pCredential->KeyLength;\n\t\t\t\t\n\t\t\t\tWepKeyId = (pCredential->KeyIndex - 1); /* KeyIndex = 1 ~ 4 */\n\t\t\t\tif ((WepKeyId >= 0) && (WepKeyId <=3))\n\t\t\t\t{\n\t\t\t\t\tpApCliTab->DefaultKeyId = WepKeyId;\n\n\t\t\t\t\t/* 5 or 13 ASCII characters */\n\t\t\t\t\t/* 10 or 26 Hex characters */\n\t\t\t\t\tif (WepKeyLen == 5 || WepKeyLen == 13 || WepKeyLen == 10 || WepKeyLen == 26)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (WepKeyLen == 5 || WepKeyLen == 13)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpApCliTab->SharedKey[WepKeyId].KeyLen = WepKeyLen;\n\t\t\t\t\t\t\tmemcpy(pApCliTab->SharedKey[WepKeyId].Key, \n\t\t\t\t\t\t\t\t\tpCredential->Key,WepKeyLen);\n\t\t\t\t\t\t\tif (WepKeyLen == 5)\n\t\t\t\t\t\t\t\tpApCliTab->SharedKey[WepKeyId].CipherAlg = CIPHER_WEP64;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpApCliTab->SharedKey[WepKeyId].CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpApCliTab->SharedKey[WepKeyId].KeyLen = (UCHAR) WepKeyLen/2;\n\t\t\t\t\t\t\t\tAtoH((PSTRING) pCredential->Key, pApCliTab->SharedKey[WepKeyId].Key, WepKeyLen/2);\n\t\t\t\t\t\t\t\tif (WepKeyLen == 10)\n\t\t\t\t\t\t\t\t\tpApCliTab->SharedKey[WepKeyId].CipherAlg = CIPHER_WEP64;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tpApCliTab->SharedKey[WepKeyId].CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WEP: Invalid Key Length (%d)\\n\", pCredential->KeyLength));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Unsupport default key index (%d), use key Index 1.\\n\", WepKeyId));\n\t\t\t\t\tpApCliTab->DefaultKeyId = WepKeyId = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pWscControl->WscProfile.ProfileCnt > 1)\n\t{\n\t\tpWscControl->WscProfileRetryTimerRunning = TRUE;\n\t\tRTMPSetTimer(&pWscControl->WscProfileRetryTimer, WSC_PROFILE_RETRY_TIME_OUT);\n\t}\n\n#ifdef P2P_SUPPORT\n\tif (P2P_CLI_ON(pAd))\n\t{\n\t\tNdisZeroMemory(pAd->P2pCfg.SSID, MAX_LEN_OF_SSID);\n\t\tpAd->P2pCfg.SSIDLen = pCredential->SSID.SsidLength;\n\t\tNdisMoveMemory(pAd->P2pCfg.SSID, pCredential->SSID.Ssid, pAd->P2pCfg.SSIDLen);\n\t}\n#endif /* P2P_SUPPORT */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<----- WscWriteConfToApCliCfg\\n\"));\n}\n\nVOID \tWscApCliLinkDown(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl)\n{\n\tUCHAR\tapidx = (pWscControl->EntryIfIdx & 0x0F);\n\tUCHAR\tmac_addr[MAC_ADDR_LEN];\n    BOOLEAN apcliEn = pAd->ApCfg.ApCliTab[apidx].Enable;\t\n\n\tNdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr,\n                   pAd->ApCfg.ApCliTab[apidx].CurrentAddress, \n                   6);\n    \n    /* bring apcli interface down first */\n\tif(apcliEn == TRUE )\n\t{\n\t\tpAd->ApCfg.ApCliTab[apidx].Enable = FALSE;\n\t\tApCliIfDown(pAd);\n\t}\n    pAd->ApCfg.ApCliTab[apidx].Enable = apcliEn;\n\tmemcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].CurrentAddress, MAC_ADDR_LEN);\n\tpWscControl->WscStatus = STATUS_WSC_LINK_UP;\n\tpWscControl->bWscTrigger = TRUE;\n}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID   WpsSmProcess(\n    IN PRTMP_ADAPTER        pAd,\n    IN MLME_QUEUE_ELEM \t   *Elem)\n{\n    int                 HeaderLen = LENGTH_802_11 + LENGTH_802_1_H + sizeof(IEEE8021X_FRAME) + sizeof(EAP_FRAME);\n    PHEADER_802_11      pHeader;\n\tPMAC_TABLE_ENTRY    pEntry = NULL;\n\tint                 apidx = MAIN_MBSSID;\n\tPWSC_CTRL\t\t\tpWpsCtrl = NULL;\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tCurOpMode = AP_MODE;\n\t}\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tCurOpMode = STA_MODE;\n\t}\n#ifdef P2P_SUPPORT\n\tif (Elem->OpMode == OPMODE_AP)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif // CONFIG_STA_SUPPORT //\n\n\tif (CurOpMode == 0xFF)\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Unkown OpMode (CurOpMode=0x%02x)\\n\", CurOpMode));\n\t\treturn;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CurOpMode=0x%02x\\n\", CurOpMode));\n\t\n    pHeader = (PHEADER_802_11)Elem->Msg;\n    \n    if (Elem->MsgType == WSC_EAPOL_PACKET_MSG)\n    {\n\t\tif ((pEntry = MacTableLookup(pAd, pHeader->Addr2)))\n            apidx = pEntry->apidx;\n    }\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif (pEntry && IS_ENTRY_APCLI(pEntry))\n\t\t\tpWpsCtrl = &pAd->ApCfg.ApCliTab[apidx].WscControl;\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\tpWpsCtrl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tif((Elem->MsgType == WSC_EAPOL_UPNP_MSG) && (Elem->MsgLen > HeaderLen))\n\t{\t/*The WSC msg from UPnP daemon */\n\t\tPUCHAR\t\tpData;\n\t\tUCHAR \t\tMacAddr[MAC_ADDR_LEN]= {0};\n\t\t\n        /* Skip the (802.11 + 802.1h + 802.1x + EAP) header */\n    \tpData = (PUCHAR) &Elem->Msg[HeaderLen];\n        Elem->MsgLen -= HeaderLen;\n\t\t/* The Addr1 of UPnP-Msg used to indicate the MAC address of the AP interface. Now always be ra0. */\n\t\tNdisMoveMemory(MacAddr, pHeader->Addr1, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(Elem->Msg, MacAddr, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(Elem->Msg+6, pData, Elem->MsgLen);\n\t\t\n\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t}\n\telse if (Elem->MsgType == WSC_EAPOL_START_MSG)\n\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\telse if (pEntry && (Elem->MsgType == WSC_EAPOL_PACKET_MSG))\n    {   /* WSC_STATE_MACHINE can service only one station at one time */\n        PSTRING\t\tpData;\n        PEAP_FRAME  pEapFrame;\n        /* Skip the EAP LLC header */\n    \tpData = (PSTRING) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];\n        pEapFrame = (PEAP_FRAME)(pData + sizeof(IEEE8021X_FRAME));\n    \tpData += sizeof(IEEE8021X_FRAME) + sizeof(EAP_FRAME);\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  EAPOL Packet.  Code = %d.    Type = %d\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, pEapFrame->Code, pEapFrame->Type));\n\t\tif (pEapFrame->Code == EAP_CODE_FAIL)\n        { /* EAP-Fail */\n            STRING\tfail_data[] = \"EAP_FAIL\";\n\t\t\tNdisMoveMemory(Elem->Msg, pHeader->Addr2, MAC_ADDR_LEN);\n            NdisMoveMemory(Elem->Msg+MAC_ADDR_LEN, fail_data, strlen(fail_data));\n            Elem->MsgLen = strlen(fail_data);\n\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\treturn;\n        }\n        else if ((pEapFrame->Code == EAP_CODE_REQ) && (pEapFrame->Type == EAP_TYPE_ID))\n        { /* EAP-Req (Identity) */\n            STRING\tid_data[] = \"hello\";\n\n\t\t\tpWpsCtrl->lastId = pEapFrame->Id;\n\t\t\tNdisMoveMemory(Elem->Msg, pHeader->Addr2, MAC_ADDR_LEN);\n            NdisMoveMemory(Elem->Msg+MAC_ADDR_LEN, id_data, strlen(id_data));\n            Elem->MsgLen = strlen(id_data);\n\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\treturn;\n        }\n        else if ((pEapFrame->Code == EAP_CODE_REQ) && (pEapFrame->Type == EAP_TYPE_WSC))\n        { /* EAP-Req (Messages) */\n            if (Elem->MsgLen <= HeaderLen)\n            {\n                DBGPRINT(RT_DEBUG_ERROR, (\"Elem->MsgLen(%ld) <= HeaderLen(%d) !!\\n\", Elem->MsgLen, HeaderLen));\n                return;\n            }\n\n\t\t\tpWpsCtrl->lastId = pEapFrame->Id;\n            Elem->MsgLen -= (LENGTH_802_11 + LENGTH_802_1_H + sizeof(IEEE8021X_FRAME) + sizeof(EAP_FRAME));\n            if (WscCheckWSCHeader((PUCHAR)pData))\n            {\n                PWSC_FRAME\t\t\tpWsc = (PWSC_FRAME) pData;\n\n\t\t\t\tNdisMoveMemory(Elem->Msg, pHeader->Addr2, MAC_ADDR_LEN);\n \t\t\t\tif (pWsc->OpCode == WSC_OPCODE_FRAG_ACK)\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tSend rest WSC frag data\n\t\t\t\t\t*/\n\t\t\t\t\tSTRING\twsc_frag_ack[] = \"WSC_FRAG_ACK\";\n\n                    NdisMoveMemory(Elem->Msg+MAC_ADDR_LEN, wsc_frag_ack, strlen(wsc_frag_ack));\n                    Elem->MsgLen = strlen(wsc_frag_ack);\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\t\t}\n                else if (pWsc->OpCode == WSC_OPCODE_START)\n                {\n                    STRING\twsc_start[] = \"WSC_START\";\n\n                    NdisMoveMemory(Elem->Msg+MAC_ADDR_LEN, wsc_start, strlen(wsc_start));\n                    Elem->MsgLen = strlen(wsc_start);\n \t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n                }\n                else\n                {\n                \tif (pWsc->Flags & WSC_MSG_FLAG_LF)\n                \t{\n\t\t\t\t\t\tpData += (sizeof(WSC_FRAME) + 2);\n\t\t\t\t\t\tElem->MsgLen -= (sizeof(WSC_FRAME) + 2);\n                \t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n                    \tpData += sizeof(WSC_FRAME);\n                    \tElem->MsgLen -= sizeof(WSC_FRAME);\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((pWpsCtrl->WscRxBufLen + Elem->MsgLen) < (MGMT_DMA_BUFFER_SIZE-6))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory((pWpsCtrl->pWscRxBuf + pWpsCtrl->WscRxBufLen), pData, Elem->MsgLen);\n\t\t\t\t\t\tpWpsCtrl->WscRxBufLen += Elem->MsgLen;\n\t\t\t\t\t}\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\tif (pWsc->Flags & WSC_MSG_FLAG_MF)\n\t\t\t\t\t\tWscSendEapFragAck(pAd, pWpsCtrl, pEntry);\n\t\t\t\t\telse\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t{\n                    \tNdisMoveMemory(Elem->Msg+MAC_ADDR_LEN, pWpsCtrl->pWscRxBuf, pWpsCtrl->WscRxBufLen);\n\t\t\t\t\t\tElem->MsgLen = pWpsCtrl->WscRxBufLen;\n\t\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\t\t\t\tpWpsCtrl->WscRxBufLen = 0;\n\t\t\t\t\t\tNdisZeroMemory(pWpsCtrl->pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\t\t}\n                }\n\t\t\t\treturn;\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"ERROR: WscCheckWSCHeader() return FALSE!\\n\"));\n                return;\n            }\n        }\n\t\t\n        if (Elem->MsgLen <= HeaderLen)\n        {\n            DBGPRINT(RT_DEBUG_ERROR, (\"Elem->MsgLen(%ld) <= HeaderLen(%d) !!\\n\", Elem->MsgLen, HeaderLen));\n            return;\n        }\n        \n        Elem->MsgLen -= (LENGTH_802_11 + LENGTH_802_1_H + sizeof(IEEE8021X_FRAME) + sizeof(EAP_FRAME));\n        NdisMoveMemory(Elem->Msg, pHeader->Addr2, MAC_ADDR_LEN);\n        if (IS_ENTRY_CLIENT(pEntry) &&\n            (pEapFrame->Code == EAP_CODE_RSP) && \n            (pEapFrame->Type == EAP_TYPE_ID))\n        { \n            if (strstr(pData, \"SimpleConfig\"))\n            {\n            \t/* EAP-Rsp (Identity) */\n            \tNdisMoveMemory(Elem->Msg+6, pData, Elem->MsgLen);\n\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\t\treturn;\n            }\n            else\n            {\n                BOOLEAN Cancelled;\n                DBGPRINT(RT_DEBUG_TRACE, (\"RTMPCancelTimer EapolTimer!!\\n\"));\n\t\t\t\tNdisZeroMemory(pWpsCtrl->EntryAddr, MAC_ADDR_LEN);\n                pWpsCtrl->EapolTimerRunning = FALSE;\n                RTMPCancelTimer(&pWpsCtrl->EapolTimer, &Cancelled);\n                return;\n            }\n        }\n        else\n        {\n            if (WscCheckWSCHeader((PUCHAR) pData))\n            {\n\t\t\t\t/* EAP-Rsp (Messages) */\n\t\t\t\tPWSC_FRAME\t\t\tpWsc = (PWSC_FRAME) pData;\n\t\t\t\tif (pWsc->OpCode == WSC_OPCODE_FRAG_ACK)\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tSend rest frag data\n\t\t\t\t\t*/\n\t\t\t\t\tSTRING\twsc_frag_ack[] = \"WSC_FRAG_ACK\";\n                    NdisMoveMemory(Elem->Msg+MAC_ADDR_LEN, wsc_frag_ack, strlen(wsc_frag_ack));\n                    Elem->MsgLen = strlen(wsc_frag_ack);\n\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pWsc->Flags & WSC_MSG_FLAG_LF)\n\t\t\t\t\t{\n\t\t\t\t\t\tpData += (sizeof(WSC_FRAME) + 2);\n\t\t\t\t\t\tElem->MsgLen -= (sizeof(WSC_FRAME) + 2);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpData += sizeof(WSC_FRAME);\n\t\t\t\t\t\tElem->MsgLen -= sizeof(WSC_FRAME);\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((pWpsCtrl->WscRxBufLen + Elem->MsgLen) < (MGMT_DMA_BUFFER_SIZE-6))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory((pWpsCtrl->pWscRxBuf + pWpsCtrl->WscRxBufLen), pData, Elem->MsgLen);\n\t\t\t\t\t\tpWpsCtrl->WscRxBufLen += Elem->MsgLen;\n\t\t\t\t\t}\n#ifdef WSC_V2_SUPPORT\n\t\t\t\t\tif (pWsc->Flags & WSC_MSG_FLAG_MF)\n\t\t\t\t\t\tWscSendEapFragAck(pAd, pWpsCtrl, pEntry);\n\t\t\t\t\telse\n#endif /* WSC_V2_SUPPORT */\n\t\t\t\t\t{\n\t\t\t\t\t\t//NdisMoveMemory(Elem->Msg+6, pData, Elem->MsgLen);\n\t\t\t\t\t\tNdisMoveMemory(Elem->Msg+6, pWpsCtrl->pWscRxBuf, pWpsCtrl->WscRxBufLen);\n\t\t\t\t\t\tElem->MsgLen = pWpsCtrl->WscRxBufLen;\n\t\t\t\t\t\tStateMachinePerformAction(pAd, &pAd->Mlme.WscMachine, Elem, pAd->Mlme.WscMachine.CurrState);\n\t\t\t\t\t\tpWpsCtrl->WscRxBufLen = 0;\n\t\t\t\t\t\tNdisZeroMemory(pWpsCtrl->pWscRxBuf, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"ERROR: WscCheckWSCHeader() return FALSE!\\n\"));\n                return;\n            }\n        }\n    }\n    else\n        DBGPRINT(RT_DEBUG_WARN, (\"Unknow Message Type (=%lu)\\n\", Elem->MsgType));\n}\n\n#ifdef CONFIG_AP_SUPPORT\nINT\tWscGetConfWithoutTrigger(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl,\n\tIN  BOOLEAN         bFromUPnP)\n{\n\tINT                 WscMode;\n\tINT                 IsAPConfigured;\n\tPWSC_UPNP_NODE_INFO pWscUPnPNodeInfo;\n\tUCHAR\t\tapIdx;\n\n#ifdef LINUX\n#endif /* LINUX */\n\n\n\t/* TODO: Is it possible ApCli call this fucntion?? */\n\tapIdx = (pWscControl->EntryIfIdx & 0x0F);\n\n    IsAPConfigured = pWscControl->WscConfStatus;\n    pWscUPnPNodeInfo = &pWscControl->WscUPnPNodeInfo;\n\n    if (pWscControl->WscConfMode == WSC_DISABLE)\n    {\n        pWscControl->bWscTrigger = FALSE;\n        DBGPRINT(RT_DEBUG_TRACE, (\"WscGetConfForUpnp:: WPS is disabled.\\n\"));\n\t\treturn FALSE;\n    }\n\n    if (bFromUPnP)\n        WscStop(pAd, FALSE, pWscControl);\n    \n\tif (pWscControl->WscMode == 1)\n\t\tWscMode = DEV_PASS_ID_PIN;\n\telse\n\t\tWscMode = DEV_PASS_ID_PBC;\n    \n\tWscBuildBeaconIE(pAd, IsAPConfigured, TRUE, WscMode, pWscControl->WscConfigMethods, (pWscControl->EntryIfIdx & 0x0F), NULL, 0, AP_MODE);\n\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, TRUE, WscMode, pWscControl->WscConfigMethods, pWscControl->EntryIfIdx, NULL, 0, AP_MODE);\n\tAPUpdateBeaconFrame(pAd, pWscControl->EntryIfIdx & 0x0F);\n\n    /* 2mins time-out timer */\n    RTMPSetTimer(&pWscControl->Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);\n    pWscControl->Wsc2MinsTimerRunning = TRUE;\n    pWscControl->WscStatus = STATUS_WSC_LINK_UP;\n    if (bFromUPnP)\n\t\tWscSendUPnPConfReqMsg(pAd, apIdx, (PUCHAR)pAd->ApCfg.MBSSID[apIdx].Ssid, \n\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[apIdx].Bssid, 3, 0, AP_MODE);\n\n    pWscControl->bWscTrigger = TRUE;\n\tpWscControl->bWscAutoTigeer = TRUE;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: trigger WSC state machine\\n\", __FUNCTION__));\n\n\treturn TRUE;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID WscSendNACK(\n    IN\tPRTMP_ADAPTER\tpAdapter,\n    IN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl)\n{\n    INT     DataLen = 0;\n    PUCHAR  pWscData = NULL;\n    BOOLEAN Cancelled;\n\tUCHAR CurOpMode = AP_MODE;\n\n#ifdef CONFIG_STA_SUPPORT\n\tif ((pAdapter->OpMode == OPMODE_STA)\n\t\t&& (pWscControl->EntryIfIdx == BSS0))\n\t\tCurOpMode = STA_MODE;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tos_alloc_mem(NULL, (UCHAR **)&pWscData, WSC_MAX_DATA_LEN);\n\tif (pWscData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSendNACK:: WscData Allocate failed!\\n\"));\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(pWscData, WSC_MAX_DATA_LEN);\n    DataLen = BuildMessageNACK(pAdapter, pWscControl, pWscData);            \n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n    {\n        if (pEntry && \n\t\t\t(IS_ENTRY_APCLI(pEntry)\n#ifdef P2P_SUPPORT\n\t\t\t|| (P2P_CLI_ON(pAdapter))\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t\t)\n            WscSendMessage(pAdapter, WSC_OPCODE_NACK, pWscData, DataLen, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n        else\n            WscSendMessage(pAdapter, WSC_OPCODE_NACK, pWscData, DataLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n    }\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tif (ADHOC_ON(pAdapter) && (pWscControl->WscConfMode & WSC_REGISTRAR))\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, pWscData, DataLen, pWscControl, STA_MODE, EAP_CODE_REQ);\n\t\telse\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_NACK, pWscData, DataLen, pWscControl, STA_MODE, EAP_CODE_RSP);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n    RTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n    pWscControl->EapolTimerRunning = FALSE;\n    pWscControl->RegData.ReComputePke = 1;\n\n\tif (pWscData)\n\t\tos_free_mem(NULL, pWscData);\n}\n\n#ifdef WSC_INCLUDED\nVOID WscCheckWpsIeFromWpsAP(\n    IN  PRTMP_ADAPTER \tpAd, \n    IN  PEID_STRUCT\t\tpEid,\n    OUT PUSHORT\t\t\tpDPIDFromAP)\n{\n\tPUCHAR\t\t\t\tpData;\n\tSHORT\t\t\t\tLen = 0;\n\tPWSC_IE\t\t\t\tpWscIE;\n\tUSHORT\t\t\t\tDevicePasswordID;\n\t\t\n\tif (NdisEqualMemory(pEid->Octet, WPS_OUI, 4)\n#ifdef IWSC_SUPPORT\n\t\t|| NdisEqualMemory(pEid->Octet, IWSC_OUI, 4)\n#endif // IWSC_SUPPORT //\n\t\t)\n\t{\n\t\tpData = (PUCHAR) pEid->Octet + 4;\n\t\tLen = (SHORT)(pEid->Len - 4);\n\n\t\twhile (Len > 0)\n\t\t{\n\t\t\tWSC_IE\tWscIE;\n\t\t\tNdisMoveMemory(&WscIE, pData, sizeof(WSC_IE));\n\t\t\t/* Check for WSC IEs */\n\t\t\tpWscIE = &WscIE;\n\t\t\t\n\t\t\t/* Check for device password ID, PIN = 0x0000, PBC = 0x0004 */\n\t\t\tif (pDPIDFromAP && be2cpu16(pWscIE->Type) == WSC_ID_DEVICE_PWD_ID)\n\t\t\t{\n\t\t\t\t/* Found device password ID */\n\t\t\t\tNdisMoveMemory(&DevicePasswordID, pData + 4, sizeof(DevicePasswordID));\n\t\t\t\tDevicePasswordID = be2cpu16(DevicePasswordID);\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"WscCheckWpsIeFromWpsAP : DevicePasswordID = 0x%04x\\n\", DevicePasswordID));\n\t\t\t\tif (DevicePasswordID == DEV_PASS_ID_PIN)\n\t\t\t\t{\n\t\t\t\t\t/* PIN */\n\t\t\t\t\t*pDPIDFromAP = DEV_PASS_ID_PIN;\n\t\t\t\t}\n\t\t\t\telse if (DevicePasswordID == DEV_PASS_ID_PBC)\n\t\t\t\t{\n\t\t\t\t\t/* PBC */\n\t\t\t\t\t*pDPIDFromAP = DEV_PASS_ID_PBC;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\n\t\t\t/* Set the offset and look for PBC information */\n\t\t\t/* Since Type and Length are both short type, we need to offset 4, not 2 */\n\t\t\tpData += (be2cpu16(pWscIE->Length) + 4);\n\t\t\tLen   -= (be2cpu16(pWscIE->Length) + 4);\n\t\t}\n\t}\n\n    return;\n}\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_STA_SUPPORT\nVOID WscLinkDown(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tif (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t{\n\t\tMLME_DISASSOC_REQ_STRUCT   DisassocReq;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscLinkDown(): Disassociate with current WPS AP...\\n\"));\n\t\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);\n\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, \n\t\t\t\t\tsizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\tpAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n\t\n\tif (pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE)\n\t{\t\t\n#ifdef WSC_LED_SUPPORT\n\t\tUCHAR WPSLEDStatus;\n\n\t\t/* The protocol is connecting to a partner. */\n\t\tWPSLEDStatus = LED_WPS_IN_PROCESS;\n\t\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef IWSC_SUPPORT\n\t\t/*\n\t\t\tWe need to send EAPOL_Start again to trigger WPS process\n\t\t*/\n\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t{\n\t\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = FALSE;\n\t\t\tpAd->StaCfg.WscControl.WscState = WSC_STATE_LINK_UP;\n\t\t\tpAd->StaCfg.WscControl.WscStatus = STATUS_WSC_LINK_UP;\n\t\t\tWscSendEapolStart(pAd, pAd->StaCfg.WscControl.WscPeerMAC, STA_MODE);\n\t\t}\n\t\telse\n#endif /* IWSC_SUPPORT */\n\t\tpAd->StaCfg.WscControl.WscState = WSC_STATE_START;\n\t}\n\telse\n\t{\n\n\t\tpAd->bConfigChanged = TRUE;\n\t\tpAd->StaCfg.WscControl.bWscTrigger = FALSE;\n\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\t{\n\t\t\tBssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);\n\t\t\tpAd->MlmeAux.SsidBssTab.BssNr = 0;\n\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\t\tOID_802_11_BSSID,\n\t\t\t\t\t\tMAC_ADDR_LEN,\n\t\t\t\t\t\tpAd->MlmeAux.Bssid, 0);\n\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t} \n#ifdef IWSC_SUPPORT\n\t\telse /* BSS_ADHOC */\n\t\t{\n\t\t\tNDIS_802_11_SSID\tSsid;\n\t\t\tif (pAd->StaCfg.IWscInfo.bReStart)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.bNotFirstScan = FALSE;\n\t\t\t\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\t\t\t\tpAd->StaCfg.IWscInfo.bReStart = FALSE;\n\t\t\t\tpAd->StaCfg.IWscInfo.bDoNotChangeBSSID = TRUE;\n\n\t\t\t\tLinkDown(pAd, FALSE);\n\t\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t            pAd->ExtraInfo = GENERAL_LINK_DOWN;\n\n\t\t\t\tif (pAd->StaCfg.WscControl.WscStatus != STATUS_WSC_CONFIGURED)\n\t\t\t\t{\n\t\t\t\t\tSsid.SsidLength = pAd->CommonCfg.SsidLen;\n\t\t\t\t\tNdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);\n\t\t\t\t\tNdisMoveMemory(Ssid.Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSsid.SsidLength = pAd->MlmeAux.SsidLen;\n\t\t\t\t\tNdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);\n\t\t\t\t\tNdisMoveMemory(Ssid.Ssid, pAd->MlmeAux.Ssid, Ssid.SsidLength);\n\t\t\t\t}\n\t\t\t\tMlmeEnqueue(pAd, \n\t                    MLME_CNTL_STATE_MACHINE, \n\t                    OID_802_11_SSID,\n\t                    sizeof(NDIS_802_11_SSID),\n\t                    (VOID *)&Ssid, 0);\t\t\t\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t}\t\t\n\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_MLME_STOP, 0, NULL, 0);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t}\n\tpAd->StaCfg.WscControl.RegData.ReComputePke = 1;\n}\n\nULONG WscSearchWpsApBySSID(\n\tIN PRTMP_ADAPTER\tpAd,\t\n\tIN PUCHAR\t \t\tpSsid,\n\tIN UCHAR\t \t\tSsidLen,\n\tIN INT\t\t \t\tWscMode)\n{\n\tUCHAR \t\ti;\n\tUSHORT\t\tDesiredDPID;\n\tBSS_ENTRY \t*pBss;\n\tPWSC_CTRL\tpWscControl = &pAd->StaCfg.WscControl;\n\n\tif (WscMode == WSC_PBC_MODE)\n\t\tDesiredDPID = DEV_PASS_ID_PBC;\n\telse\n\t\tDesiredDPID = DEV_PASS_ID_PIN;\n\n\tfor (i = 0; i < pAd->ScanTab.BssNr; i++) \n\t{\n\t\tpBss = &pAd->ScanTab.BssEntry[i];\n\t\tif (SSID_EQUAL(pSsid, SsidLen, pBss->Ssid, pBss->SsidLen) &&\n\t\t\tpBss->WpsAP &&\n\t\t\t((pBss->WscDPIDFromWpsAP == DesiredDPID) || (DesiredDPID == DEV_PASS_ID_PIN)))\n\t\t{\n\t\t\tif ((pWscControl->WpsApBand == PREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST) &&\n\t\t\t\t(pBss->Channel <= 14))\n\t\t\t\tcontinue;\n\t\t\telse if ((pWscControl->WpsApBand == PREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST) &&\n\t\t\t\t\t (pBss->Channel > 14))\n\t\t\t\tcontinue;\n\t\t\telse\n\t\t\t\treturn (ULONG)i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID WscPBCSessionOverlapCheck(\n\tIN  PRTMP_ADAPTER \tpAd)\n{\n\tULONG\tnow;\n\tPWSC_STA_PBC_PROBE_INFO\tpWscStaPbcProbeInfo = &pAd->CommonCfg.WscStaPbcProbeInfo;\n\t\n\tpAd->CommonCfg.WscPBCOverlap = FALSE;\n\tif (pWscStaPbcProbeInfo->WscPBCStaProbeCount > 1)\n\t{\n\t\tUCHAR  i;\n\t\t\n\t\tfor (i = 0; i < MAX_PBC_STA_TABLE_SIZE; i++)\n\t\t{\n\t\t\tNdisGetSystemUpTime(&now);\n\t\t\tif (pWscStaPbcProbeInfo->Valid[i] && \n\t\t\t\tRTMP_TIME_AFTER(now, pWscStaPbcProbeInfo->ReciveTime[i] + 120*OS_HZ))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&(pWscStaPbcProbeInfo->StaMacAddr[i][0]), MAC_ADDR_LEN);\n\t\t\t\tpWscStaPbcProbeInfo->ReciveTime[i] = 0;\n\t\t\t\tpWscStaPbcProbeInfo->Valid[i] = FALSE;\n\t\t\t\tpWscStaPbcProbeInfo->WscPBCStaProbeCount--;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (pWscStaPbcProbeInfo->WscPBCStaProbeCount > 1)\n\t\t\tpAd->CommonCfg.WscPBCOverlap = TRUE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscPBCSessionOverlapCheck : WscPBCStaProbeCount = %d\\n\", \n\t\t\t\tpWscStaPbcProbeInfo->WscPBCStaProbeCount));\n\treturn;\n}\n\nVOID WscPBC_DPID_FromSTA(\n\tIN  PRTMP_ADAPTER\t\tpAd,\t\n\tIN\tPUCHAR\t\t\t\tpMacAddr)\n{\n\tINT\t\tIndex = 0;\n\tUCHAR\ttab_idx;\n\tBOOLEAN bAddEntry = FALSE;\n\tULONG\tnow;\n\tPWSC_STA_PBC_PROBE_INFO\tpWscStaPbcProbeInfo = &pAd->CommonCfg.WscStaPbcProbeInfo;\n\n\tNdisGetSystemUpTime(&now);\n\tif (pWscStaPbcProbeInfo->WscPBCStaProbeCount == 0)\n\t\tbAddEntry = TRUE;\n\telse\n\t{\n\t\tfor (tab_idx = 0; tab_idx < MAX_PBC_STA_TABLE_SIZE; tab_idx++)\n\t\t{\n\t\t\tif (NdisEqualMemory(pMacAddr, pWscStaPbcProbeInfo->StaMacAddr[tab_idx], MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\tpWscStaPbcProbeInfo->ReciveTime[tab_idx] = now;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (tab_idx = 0; tab_idx < MAX_PBC_STA_TABLE_SIZE; tab_idx++)\n\t\t{\n\t\t\tif (RTMP_TIME_AFTER(now, pWscStaPbcProbeInfo->ReciveTime[tab_idx] + 120*OS_HZ) || \n\t\t\t\tNdisEqualMemory(pWscStaPbcProbeInfo->StaMacAddr[tab_idx], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\tif (pWscStaPbcProbeInfo->Valid[tab_idx] == FALSE)\n\t\t\t\t{\n\t\t\t\t\tIndex = tab_idx;\n\t\t\t\t\tbAddEntry = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpWscStaPbcProbeInfo->ReciveTime[tab_idx] = now;\n\t\t\t\t\tNdisMoveMemory(pWscStaPbcProbeInfo->StaMacAddr[tab_idx], pMacAddr, MAC_ADDR_LEN);\n\t\t\t\t\treturn;\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bAddEntry)\n\t{\n\t\tpWscStaPbcProbeInfo->WscPBCStaProbeCount++;\n\t\tpWscStaPbcProbeInfo->ReciveTime[Index] = now;\n\t\tpWscStaPbcProbeInfo->Valid[Index] = TRUE;\n\t\tNdisMoveMemory(pWscStaPbcProbeInfo->StaMacAddr[Index], pMacAddr, MAC_ADDR_LEN);\n\t}\n}\n\nvoid    WscWriteConfToDatFile(\n    IN  PRTMP_ADAPTER \tpAd,\n    IN  UCHAR\t\t\tCurOpMode)\n{\n\tchar\t*cfgData = 0;\n\tPSTRING\t\t\tfileName = NULL;\n\tRTMP_OS_FD\t\tfile_r, file_w;\n\tRTMP_OS_FS_INFO\t\tosFSInfo;\n\tLONG\t\t\trv, fileLen = 0;\n\tchar\t\t\t*offset = 0;\n\tPSTRING\t\t\tpTempStr = 0;\n#ifdef CONFIG_AP_SUPPORT\n\tINT\t\t\t\tindex = 0;\n\tUCHAR\t\t\tapidx = (pAd->WriteWscCfgToDatFile & 0x0F);\n#endif /* CONFIG_AP_SUPPORT */\n\tPWSC_CTRL\t\tpWscControl = NULL;\n\tPWSC_CREDENTIAL\tpCredentail = NULL;\n\tSTRING\t\t\tWepKeyName[MAX_WEPKEYNAME_LEN] = {0};\n\tSTRING\t\t\tWepKeyFormatName[MAX_WEPKEYNAME_LEN] = {0};\n\tINT\t\t\t\ttempStrLen = 0;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscWriteConfToDatFile(CurOpMode = %d)\\n\", CurOpMode));\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tif (apidx > pAd->ApCfg.BssidNum)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscWriteConfToDatFile (wrong apidx = %d)\\n\", apidx));\n\t\t\treturn;\n\t\t}\n\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tfileName = AP_PROFILE_PATH;\n\n\t\tsnprintf((PSTRING) WepKeyName, sizeof(WepKeyName), \"Key%dStr%d=\", pAd->ApCfg.MBSSID[apidx].DefaultKeyId+1, apidx+1);\n\t\tsnprintf((PSTRING) WepKeyFormatName, sizeof(WepKeyFormatName), \"Key%dType=\", pAd->ApCfg.MBSSID[apidx].DefaultKeyId+1);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t{\n\t\tpWscControl = &pAd->StaCfg.WscControl;\n\t\t\tfileName = STA_PROFILE_PATH;\n\n\t\tsnprintf(WepKeyName, sizeof(WepKeyName), \"Key%dStr=\", pAd->StaCfg.DefaultKeyId+1);\n\t\tsnprintf(WepKeyFormatName, sizeof(WepKeyFormatName), \"Key%dType=\", pAd->StaCfg.DefaultKeyId+1);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tfile_r = RtmpOSFileOpen(fileName, O_RDONLY, 0);\n\tif (IS_FILE_OPEN_ERR(file_r)) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"-->1) %s: Error opening file %s\\n\", __FUNCTION__, fileName));\n\t\treturn;\n\t}\n\telse \n\t{\n\t\tchar tempStr[64] = {0};\n\t\twhile((rv = RtmpOSFileRead(file_r, tempStr, 64)) > 0)\n\t\t{\n\t\t\tfileLen += rv;\n\t\t}\n\t\tos_alloc_mem(NULL, (UCHAR **)&cfgData, fileLen);\n\t\tif (cfgData == NULL)\n\t\t{\n\t\t\tRtmpOSFileClose(file_r);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CfgData kmalloc fail. (fileLen = %ld)\\n\", fileLen));\n\t\t\tgoto out;\n\t\t}\n\t\tNdisZeroMemory(cfgData, fileLen);\n\t\tRtmpOSFileSeek(file_r, 0);\n\t\trv = RtmpOSFileRead(file_r, (PSTRING)cfgData, fileLen);\n\t\tRtmpOSFileClose(file_r);\n\t\tif (rv != fileLen)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CfgData kmalloc fail, fileLen = %ld\\n\", fileLen));\n\t\t\tgoto ReadErr;\n\t\t}\n\t}\n\n\tfile_w = RtmpOSFileOpen(fileName, O_WRONLY|O_TRUNC, 0);\n\tif (IS_FILE_OPEN_ERR(file_w)) \n\t{\n\t\tgoto WriteFileOpenErr;\n\t}\n\telse \n\t{\n\t\toffset = (PCHAR) rtstrstr((PSTRING) cfgData, \"Default\\n\");\n\t\toffset += strlen(\"Default\\n\");\n\t\tRtmpOSFileWrite(file_w, (PSTRING)cfgData, (int)(offset-cfgData));\n\t\tos_alloc_mem(NULL, (UCHAR **)&pTempStr, 512);\n\t\tif (!pTempStr)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pTempStr kmalloc fail. (512)\\n\"));\n\t\t\tRtmpOSFileClose(file_w);\n\t\t\tgoto WriteErr;\n\t\t}\n\t\t\t\n\t\tfor (;;)\n\t\t{\n\t\t\tint i = 0;\n\t\t\tPSTRING ptr;\n\t\t\tBOOLEAN\tbNewFormat = TRUE;\n\n\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\tptr = (PSTRING) offset;\n\t\t\twhile(*ptr && *ptr != '\\n')\n\t\t\t{\n\t\t\t\tpTempStr[i++] = *ptr++;\n\t\t\t}\n\t\t\tpTempStr[i] = 0x00;\n\t\t\tif ((size_t)(offset - cfgData) < fileLen)\n\t\t\t{\n\t\t\t\toffset += strlen(pTempStr) + 1;\n\t\t\t\tif ((strncmp(pTempStr, \"SSID=\", strlen(\"SSID=\")) == 0) || \n\t\t\t\t\tstrncmp(pTempStr, \"SSID1=\", strlen(\"SSID1=\")) == 0 ||\n\t\t\t\t\tstrncmp(pTempStr, \"SSID2=\", strlen(\"SSID2=\")) == 0 ||\n\t\t\t\t\tstrncmp(pTempStr, \"SSID3=\", strlen(\"SSID3=\")) == 0 ||\n\t\t\t\t\tstrncmp(pTempStr, \"SSID4=\", strlen(\"SSID4=\")) == 0\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tif (rtstrstr(pTempStr, \"SSID=\"))\n\t\t\t\t\t\tbNewFormat = FALSE;\n\n\t\t\t\t\tWscWriteSsidToDatFile(pAd, pTempStr, bNewFormat, CurOpMode);\n\t\t\t\t}\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\telse if (strncmp(pTempStr, \"NetworkType=\", strlen(\"NetworkType=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\t\t\t\t\t\n\t\t\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"NetworkType=Adhoc\");\n\t\t\t\t\telse\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"NetworkType=Infra\");\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\telse if (strncmp(pTempStr, \"AuthMode=\", strlen(\"AuthMode=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tsnprintf(pTempStr, 512, \"AuthMode=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[index].SsidLen)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%s\", pTempStr, RTMPGetRalinkAuthModeStr(pAd->ApCfg.MBSSID[index].AuthMode));\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%s\", pTempStr, RTMPGetRalinkAuthModeStr(pAd->ApCfg.MBSSID[index].AuthMode));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tUSHORT auth_flag = WscGetAuthType(pAd->StaCfg.AuthMode);\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%s\", pTempStr, WscGetAuthTypeStr(auth_flag));\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\telse if (strncmp(pTempStr, \"EncrypType=\", strlen(\"EncrypType=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tsnprintf(pTempStr, 512, \"EncrypType=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%s\", pTempStr, RTMPGetRalinkEncryModeStr(pAd->ApCfg.MBSSID[index].WepStatus));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%s\", pTempStr, RTMPGetRalinkEncryModeStr(pAd->ApCfg.MBSSID[index].WepStatus));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tUSHORT encrypt_flag = WscGetEncryType(pAd->StaCfg.WepStatus);\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%s\", pTempStr, WscGetEncryTypeStr(encrypt_flag));\n\t\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}    \n\t\t\t\telse if ((strncmp(pTempStr, \"WPAPSK=\", strlen(\"WPAPSK=\")) == 0) || \n\t\t\t\t\t\t(strncmp(pTempStr, \"WPAPSK1=\", strlen(\"WPAPSK1=\")) == 0) ||\n\t\t\t\t\t\t(strncmp(pTempStr, \"WPAPSK2=\", strlen(\"WPAPSK2=\")) == 0) ||\n\t\t\t\t\t\t(strncmp(pTempStr, \"WPAPSK3=\", strlen(\"WPAPSK3=\")) == 0) ||\n\t\t\t\t\t\t(strncmp(pTempStr, \"WPAPSK4=\", strlen(\"WPAPSK4=\")) == 0))\n\t\t\t\t{\n\t\t\t\t\t\tbNewFormat = TRUE;\n\t\t\t\t\t\tif (strstr(pTempStr, \"WPAPSK=\"))                            \n\t\t\t\t\t\t\tbNewFormat = FALSE;\n\t\t\t\t\t\tWscWriteWpaPskToDatFile(pAd, pTempStr, bNewFormat);\n\t\t\t\t}\n\t\t\t\telse if (strncmp(pTempStr, \"WscConfMode=\", strlen(\"WscConfMode=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"WscConfMode=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[index].WscControl;\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pWscControl->WscConfMode);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%d\", pTempStr, pWscControl->WscConfMode);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pWscControl->WscConfMode);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t\telse if (strncmp(pTempStr, \"WscConfStatus=\", strlen(\"WscConfStatus=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"WscConfStatus=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[index].WscControl;\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pWscControl->WscConfStatus);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%d\", pTempStr, pWscControl->WscConfStatus);\n\t\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pWscControl->WscConfStatus);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n\t\t\t\telse if (strncmp(pTempStr, \"DefaultKeyID=\", strlen(\"DefaultKeyID=\")) == 0)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tsnprintf(pTempStr, 512, \"DefaultKeyID=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pAd->ApCfg.MBSSID[index].DefaultKeyId+1);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%d\", pTempStr, pAd->ApCfg.MBSSID[index].DefaultKeyId+1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pAd->StaCfg.DefaultKeyId+1);\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\telse if ((strncmp(pTempStr, WepKeyFormatName, strlen(WepKeyFormatName)) == 0) &&\n\t\t\t\t\t\t (CurOpMode == AP_MODE))\n\t\t\t\t{\n\t\t\t\t\tpCredentail = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0];\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled)\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR idx = 0, KeyType[4] = {0};\n                        PSTRING ptr2, temp_ptr;\n\t\t\t\t\t\t\n\t\t\t\t\t\tptr2 = rtstrstr(pTempStr, \"=\");\n\t\t\t\t\t\ttemp_ptr = pTempStr;\n\t\t\t\t\t\tpTempStr = ptr2+1;\n\t\t\t\t\t\tKeyType[0] = (UCHAR)(*pTempStr - 0x30);\n\t\t\t\t\t\tfor (idx = 1; idx < 4; idx++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tptr2 = rtstrstr(pTempStr, \";\");\n\t\t\t\t\t\t\tif (ptr2 == NULL)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tpTempStr = ptr2+1;\n\t\t\t\t\t\t\tif ((pTempStr != NULL) ||\n\t\t\t\t\t\t\t\t(*pTempStr == '0') ||\n\t\t\t\t\t\t\t\t(*pTempStr == '1'))\n\t\t\t\t\t\t\t\tKeyType[idx] = (UCHAR)(*pTempStr - 0x30);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpTempStr = temp_ptr;\t\t\t\n\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\tNdisMoveMemory(pTempStr, WepKeyFormatName, strlen(WepKeyFormatName));\n\t\t\t\t\t\tfor (idx = 0; idx < pAd->ApCfg.BssidNum; idx++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (idx == apidx)  \n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s0\", pTempStr);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, KeyType[idx]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (apidx < (pAd->ApCfg.BssidNum - 1))\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;\", pTempStr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((strncmp(pTempStr, WepKeyName, strlen(WepKeyName)) == 0) &&\n\t\t\t\t\t\t (CurOpMode == AP_MODE))\n\t\t\t\t{\n\t\t\t\t\tpCredentail = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0];\n\t\t\t\t\tif (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\tNdisMoveMemory(pTempStr, WepKeyName, strlen(WepKeyName));\n\t\t\t\t\t\ttempStrLen = strlen(pTempStr);\n\t\t\t\t\t\tif (pCredentail->KeyLength)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((pCredentail->KeyLength == 5) ||\n\t\t\t\t\t\t\t\t(pCredentail->KeyLength == 13))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint jjj=0;\n\t\t\t\t\t\t\t\tfor (jjj=0; jjj<pCredentail->KeyLength; jjj++)\n\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%02x\", pTempStr, pCredentail->Key[jjj]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((pCredentail->KeyLength == 10) ||\n\t\t\t\t\t\t\t\t(pCredentail->KeyLength == 26))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + tempStrLen, pCredentail->Key, pCredentail->KeyLength);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\telse if (rtstrstr(pTempStr, (PSTRING) WepKeyFormatName) &&  (CurOpMode == STA_MODE))\n\t\t\t\t{\n\t\t\t\t\tpCredentail = &pWscControl->WscProfile.Profile[pWscControl->WscProfile.ApplyProfileIdx];\n\t\t\t\t\tif (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)                           \n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s0\", WepKeyFormatName); /* Hex */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (rtstrstr(pTempStr, (PSTRING) WepKeyName) &&  (CurOpMode == STA_MODE))\n\t\t\t\t{\n\t\t\t\t\t\tpCredentail = &pWscControl->WscProfile.Profile[pWscControl->WscProfile.ApplyProfileIdx];\n\t\t\t\t\tif (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)                           \n\t\t\t\t\t{\n\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\tNdisMoveMemory(pTempStr, WepKeyName, strlen(WepKeyName));\n\t\t\t\t\t\ttempStrLen = strlen(pTempStr);\n\t\t\t\t\t\tif (pCredentail->KeyLength)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((pCredentail->KeyLength == 5) ||\n\t\t\t\t\t\t\t\t(pCredentail->KeyLength == 13))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint jjj=0;\n\t\t\t\t\t\t\t\tfor (jjj=0; jjj<pCredentail->KeyLength; jjj++)\n\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%02x\", pTempStr, pCredentail->Key[jjj]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((pCredentail->KeyLength == 10) ||\n\t\t\t\t\t\t\t\t(pCredentail->KeyLength == 26))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + tempStrLen, pCredentail->Key, pCredentail->KeyLength);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\tRtmpOSFileWrite(file_w, pTempStr, strlen(pTempStr));\n\t\t\t\tRtmpOSFileWrite(file_w, \"\\n\", 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tRtmpOSFileClose(file_w);\n\t}\n\nWriteErr:   \n\tif (pTempStr)\n/*\t\tkfree(pTempStr); */\n\t\tos_free_mem(NULL, pTempStr);\nReadErr:\nWriteFileOpenErr:    \n\tif (cfgData)\n/*\t\tkfree(cfgData); */\n\t\tos_free_mem(NULL, cfgData);\nout:\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscWriteConfToDatFile\\n\"));\n\treturn;\n}\n\n#ifdef CONFIG_AP_SUPPORT\nvoid    WscWriteConfToAR9File(\n    IN  PRTMP_ADAPTER \tpAd,\n    IN  UCHAR\t\t\tCurOpMode)\n{\n\tPSTRING\t\t\tfileName = NULL;\n\tRTMP_OS_FD\t\tfile_w;\n\tRTMP_OS_FS_INFO\t\tosFSInfo;\n\tINT\t\t\toffset = 0;\n\tINT\t\t\tdatoffset = 0;\n\tPSTRING\t\t\tpTempStr = 0;\n\tPSTRING\t\t\tpDatStr = 0;\n#ifdef CONFIG_AP_SUPPORT\n\tINT\t\t\t\tindex = 0;\n\tUCHAR\t\t\tapidx = MAIN_MBSSID;\n#endif /* CONFIG_AP_SUPPORT */\n\tPWSC_CTRL\t\tpWscControl = NULL;\n\tPWSC_CREDENTIAL\tpCredentail = NULL;\n\tSTRING\t\t\tWepKeyName[MAX_WEPKEYNAME_LEN] = {0};\n\tSTRING\t\t\tWepKeyFormatName[MAX_WEPKEYTYPE_LEN] = {0};\n\tINT\t\t\t\ttempStrLen = 0;\n\tSTRING\titem_str[10] = {0};\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WscWriteConfToAR9File\\n\"));\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\tfileName = \"/var/wps_profile.dat\";\n\n\t\tsnprintf((PSTRING) WepKeyName, sizeof(WepKeyName), \"Key%dStr1=\", pAd->ApCfg.MBSSID[MAIN_MBSSID].DefaultKeyId+1);\n\t\tsnprintf((PSTRING) WepKeyFormatName, sizeof(WepKeyFormatName), \"Key%dType=\", pAd->ApCfg.MBSSID[MAIN_MBSSID].DefaultKeyId+1);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\tfile_w = RtmpOSFileOpen(fileName, O_WRONLY|O_CREAT, 0);\n\tif (IS_FILE_OPEN_ERR(file_w)) \n\t{\n\t\tgoto WriteFileOpenErr;\n\t}\n\telse \n\t{\n\t\tos_alloc_mem(NULL, (UCHAR **)&pTempStr, 512);\n\t\tif (!pTempStr)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pTempStr kmalloc fail. (512)\\n\"));\n\t\t\tRtmpOSFileClose(file_w);\n\t\t\tgoto WriteErr;\n\t\t}\n\t\tos_alloc_mem(NULL, (UCHAR **)&pDatStr, 4096);\n\t\tif (!pDatStr)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pDatStr kmalloc fail. (4096)\\n\"));\n\t\t\tRtmpOSFileClose(file_w);\n\t\t\tgoto WriteErr;\n\t\t}\n\t\t\t\n\t\t/*for (;;) */\n\t\t{\n\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\tNdisZeroMemory(pDatStr, 4096);\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(item_str, 10);\n\t\t\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tsnprintf(item_str, sizeof(item_str), \"SSID%d\", (apidx + 1));\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNdisMoveMemory(pTempStr, item_str, strlen(item_str));\n\t\t\t\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + offset, \"=\", 1);\n\t\t\t\t\t\t\toffset += 1;\n\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + offset, pAd->ApCfg.MBSSID[apidx].Ssid, pAd->ApCfg.MBSSID[apidx].SsidLen);\n\t\t\t\t\t\t\toffset += pAd->ApCfg.MBSSID[apidx].SsidLen;\n\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + offset, \"\\n\", 1);\n\t\t\t\t\t\t\toffset += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tNdisZeroMemory(item_str, 10);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(pDatStr,pTempStr,offset);\n\t\t\t\tdatoffset += offset;\n\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\toffset=0;\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tsnprintf(pTempStr, 512, \"AuthMode=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[index].SsidLen)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%s\", pTempStr, RTMPGetRalinkAuthModeStr(pAd->ApCfg.MBSSID[index].AuthMode));\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%s\", pTempStr, RTMPGetRalinkAuthModeStr(pAd->ApCfg.MBSSID[index].AuthMode));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\toffset=0;\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tsnprintf(pTempStr, 512, \"EncrypType=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%s\", pTempStr, RTMPGetRalinkEncryModeStr(pAd->ApCfg.MBSSID[index].WepStatus));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%s\", pTempStr, RTMPGetRalinkEncryModeStr(pAd->ApCfg.MBSSID[index].WepStatus));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t}    \n\n\t\t\t\t{\n\t\t\t\t\toffset=0;\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tNdisZeroMemory(item_str, 10);\n\t\t\t\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsnprintf(item_str, sizeof(item_str), \"WPAPSK%d\", (apidx + 1));\n\t\t\t\t\t\t\t/*if (rtstrstr(pTempStr, item_str)) */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr, item_str, strlen(item_str));\n\t\t\t\t\t\t\t\toffset = strlen(pTempStr);\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + offset, \"=\", 1);\n\t\t\t\t\t\t\t\toffset += 1;\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + offset, pWscControl->WpaPsk, pWscControl->WpaPskLen);\n\t\t\t\t\t\t\t\toffset += pWscControl->WpaPskLen;\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + offset, \"\\n\", 1);\n\t\t\t\t\t\t\t\toffset += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tNdisZeroMemory(item_str, 10);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\t\toffset=0;\n\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"WscConfMode=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[index].WscControl;\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pWscControl->WscConfMode);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%d\", pTempStr, pWscControl->WscConfMode);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\tdatoffset += offset;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\t\toffset=0;\n\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"WscConfStatus=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[index].WscControl;\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pWscControl->WscConfStatus);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%d\", pTempStr, pWscControl->WscConfStatus);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\tdatoffset += offset;\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\toffset=0;\n\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\tsnprintf(pTempStr, 512, \"DefaultKeyID=\");\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 0; index < pAd->ApCfg.BssidNum; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpWscControl = &pAd->ApCfg.MBSSID[index].WscControl;\n\t\t\t\t\t\t\tif (index == 0)\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s%d\", pTempStr, pAd->ApCfg.MBSSID[apidx].DefaultKeyId+1);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;%d\", pTempStr, pAd->ApCfg.MBSSID[apidx].DefaultKeyId+1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t\t}\n\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t}\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\tif (CurOpMode == AP_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (index = 1; index <= 4; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsnprintf(WepKeyFormatName, sizeof(WepKeyFormatName), \"Key%dType=\", index);\n\t\t\t\t\t\t\t/*if (rtstrstr(pTempStr, WepKeyFormatName)) */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\t\t\toffset=0;\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr, WepKeyFormatName, strlen(WepKeyFormatName));\n\t\t\t\t\t\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (pAd->ApCfg.MBSSID[MAIN_MBSSID].WepStatus == Ndis802_11WEPEnabled)  \n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpCredentail = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0];\n\t\t\t\t\t\t\t\t\t\tif ((pCredentail->KeyLength == 5) ||\n\t\t\t\t\t\t\t\t\t\t\t(pCredentail->KeyLength == 13))\n\t\t\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s1\", pTempStr); /* ASCII */\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s0\", pTempStr); /* Hex */\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (apidx < (pAd->ApCfg.BssidNum - 1))\n\t\t\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s;\", pTempStr);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsnprintf(WepKeyName, sizeof(WepKeyName), \"Key%dStr=\", index);\n\t\t\t\t\t\t\t/*if (rtstrstr(pTempStr, WepKeyName)) */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\t\t\toffset=0;\n\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr, WepKeyName, strlen(WepKeyName));\n\t\t\t\t\t\t\t\ttempStrLen = strlen(pTempStr);\n\t\t\t\t\t\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpCredentail = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0];\n\t\t\t\t\t\t\t\t\tif (pCredentail->KeyLength)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + tempStrLen, pCredentail->Key, pCredentail->KeyLength);\n\t\t\t\t\t\t\t\t\t\ttempStrLen = strlen(pTempStr);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (apidx < (pAd->ApCfg.BssidNum - 1))\n\t\t\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + tempStrLen, \";\", 1);\n\t\t\t\t\t\t\t\t\ttempStrLen += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsnprintf(pTempStr, 512, \"%s\\n\", pTempStr);\n\t\t\t\t\t\t\t\toffset=strlen(pTempStr);\n\t\t\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tsnprintf(WepKeyName, sizeof(WepKeyName), \"Key%dStr%d=\", index, (apidx + 1));\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif ((pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tNdisZeroMemory(pTempStr, 512);\n\t\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr, WepKeyName, strlen(WepKeyName));\n\t\t\t\t\t\t\t\t\ttempStrLen = strlen(pTempStr);\n\t\t\t\t\t\t\t\t\tpCredentail = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0];\n\t\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + tempStrLen, pCredentail->Key, pCredentail->KeyLength);\n\t\t\t\t\t\t\t\t\tNdisMoveMemory(pTempStr + tempStrLen+pCredentail->KeyLength, \"\\n\", 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\toffset=tempStrLen+pCredentail->KeyLength+1;\n\t\t\t\t\t\t\t\tNdisMoveMemory(pDatStr+datoffset,pTempStr,offset);\n\t\t\t\t\t\t\t\tdatoffset += offset;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tRtmpOSFileWrite(file_w, pDatStr, datoffset);\n\t\t\t\t/*RtmpOSFileWrite(file_w, \"\\n\", 1); */\n\t\t\t}\n\t\t}\n\t\tRtmpOSFileClose(file_w);\n\t}\n\nWriteErr:   \n\tif (pTempStr)\n/*\t\tkfree(pTempStr); */\n\t\tos_free_mem(NULL, pTempStr);\n\tif (pDatStr)\n/*\t\tkfree(pDatStr); */\n\t\tos_free_mem(NULL, pDatStr);\n\nWriteFileOpenErr:    \n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WscWriteConfToAR9File\\n\"));\n\treturn;\n}\n#endif/*CONFIG_AP_SUPPORT*/\n\nstatic INT wsc_write_dat_file_thread (\n    IN ULONG Context)\n{\n\tRTMP_OS_TASK *pTask;\n\tRTMP_ADAPTER *pAd;\n\tint \tStatus = 0;\n\n\tpTask = (RTMP_OS_TASK *)Context;\n\tpAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);\n\n\tif (pAd == NULL)\n\t\treturn 0;\n\n\tRtmpOSTaskCustomize(pTask);\n\n\twhile (pTask && !RTMP_OS_TASK_IS_KILLED(pTask))\n\t{\n\t\tRTMPusecDelay(2000);\n\n\t\tif (RtmpOSTaskWait(pAd, pTask, &Status) == FALSE)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (Status != 0)\n\t\t\tbreak;\n\n#ifdef RTMP_MAC_USB\t\t\n\t\t/* device had been closed */\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\tbreak;\n#endif /* RTMP_MAC_USB */\n\n\t\tif (pAd->pWscElme && (pAd->pWscElme->MsgLen != 0))\n\t\t{\n\t\t\tMLME_QUEUE_ELEM\t*pElme;\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pElme, sizeof(MLME_QUEUE_ELEM));\n\t\t\tif (pElme)\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pElme, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\tRTMP_SEM_LOCK(&pAd->WscElmeLock);\n\t\t\t\tNdisMoveMemory(pElme, pAd->pWscElme, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\tpAd->pWscElme->MsgLen = 0;\n\t\t\t\tNdisZeroMemory(pAd->pWscElme->Msg, MGMT_DMA_BUFFER_SIZE);\n\t\t\t\tRTMP_SEM_UNLOCK(&pAd->WscElmeLock);\n\t\t\t\tWpsSmProcess(pAd, pElme);\n\t\t\t\tos_free_mem(NULL, pElme);\n\t\t\t}\n\t\t}\n\n\t\tif (pAd->WriteWscCfgToDatFile != 0xFF)\n\t\t{\n\t\t\tUCHAR\tCurOpMode = AP_MODE;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\tCurOpMode = STA_MODE;\n\t\t\tif (pAd->WriteWscCfgToDatFile != BSS0)\n\t\t\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tWscWriteConfToDatFile(pAd, CurOpMode);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\n\t\t\tWscWriteConfToAR9File(pAd, CurOpMode);\n#endif /*AR9_MAPI_SUPPORT*/\n#endif /* INF_AR9 */\n#endif/*CONFIG_AP_SUPPORT*/\n\t\t\tpAd->WriteWscCfgToDatFile = 0xFF;\n\t\t}\n\t}\n\n\tif (pTask)\n\t\tRtmpOSTaskNotifyToExit(pTask);\n\t\n\treturn 0;\n}\n\n\n/*\n  * This kernel thread init in the probe fucntion, so we should kill it when do remove module.\n  */\nBOOLEAN WscThreadExit(RTMP_ADAPTER *pAd)\n{\t\n\tINT ret;\n\t\n\t/* \n\t\tThis kernel thread init in the probe fucntion, so kill it when do remove module. \n\t*/\n\tret = RtmpOSTaskKill(&pAd->wscTask);\n\tif (ret == NDIS_STATUS_FAILURE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"kill wsc task failed!\\n\"));\n\t}\n\t\n\tif (pAd->pHmacData)\n\t{\n\t\tos_free_mem(NULL, pAd->pHmacData);\n\t\tpAd->pHmacData = NULL;\n\t}\n\tif (pAd->pWscElme)\n\t{\n\t\tos_free_mem(NULL, pAd->pWscElme);\n\t\tpAd->pWscElme = NULL;\n\t}\n\tNdisFreeSpinLock(&pAd->WscElmeLock);\n#ifdef CONFIG_AP_SUPPORT\n\tif ((pAd->OpMode == OPMODE_AP)\n#ifdef P2P_SUPPORT\n\t\t/* P2P will use ApCfg.MBSSID and ApCfg.ApCliTab also. */\n\t\t|| TRUE\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\tINT ap_idx;\n\t\tUCHAR MaxBssidNum = MAX_MBSSID_NUM(pAd);\n\n\t\tfor (ap_idx = 0; ap_idx < MaxBssidNum; ap_idx++)\n\t\t{\n\t\t\tPWSC_CTRL\tpWpsCtrl = &pAd->ApCfg.MBSSID[ap_idx].WscControl;\n\t\t\tWscStop(pAd, FALSE, pWpsCtrl);\n\t\t\tpWpsCtrl->WscRxBufLen = 0;\n\t\t\tif (pWpsCtrl->pWscRxBuf)\n\t\t\t{\n\t\t\t\tos_free_mem(pAd, pWpsCtrl->pWscRxBuf);\n\t\t\t\tpWpsCtrl->pWscRxBuf = NULL;\n\t\t\t}\n\t\t\tpWpsCtrl->WscTxBufLen = 0;\n\t\t\tif (pWpsCtrl->pWscTxBuf)\n\t\t\t{\n\t\t\t\tos_free_mem(pAd, pWpsCtrl->pWscTxBuf);\n\t\t\t\tpWpsCtrl->pWscTxBuf = NULL;\n\t\t\t}\n#ifdef WSC_V2_SUPPORT\n\t\t\tif (pWpsCtrl->WscV2Info.ExtraTlv.pTlvData)\n\t\t\t{\n\t\t\t\tos_free_mem(NULL, pWpsCtrl->WscV2Info.ExtraTlv.pTlvData);\n\t\t\t\tpWpsCtrl->WscV2Info.ExtraTlv.pTlvData = NULL;\n\t\t\t}\n#endif // WSC_V2_SUPPORT //\n\t\t\tWscClearPeerList(&pWpsCtrl->WscPeerList);\n\t\t\tNdisFreeSpinLock(&pWpsCtrl->WscPeerListSemLock);\n\t\t}\t\t\n#ifdef APCLI_SUPPORT\n\t\t{\n\t\t\tINT index;\n\t\t\tWscStop(pAd, TRUE, &pAd->ApCfg.ApCliTab[BSS0].WscControl);\n\n\t\t\tfor(index = 0; index < MAX_APCLI_NUM; index++)\n\t\t\t{\n\t\t\t\tPWSC_CTRL       pWpsCtrl = &pAd->ApCfg.ApCliTab[index].WscControl;\n\n\t\t\t\tpWpsCtrl->WscTxBufLen = 0;\n\t\t\t\tif (pWpsCtrl->pWscTxBuf)\n\t\t\t\t\tos_free_mem(pAd, pWpsCtrl->pWscTxBuf);\n\t\t\t\tpWpsCtrl->WscRxBufLen = 0;\n\t\t\t\tif (pWpsCtrl->pWscRxBuf)\n\t\t\t\t\tos_free_mem(pAd, pWpsCtrl->pWscRxBuf);\n\t\t\t\tWscClearPeerList(&pWpsCtrl->WscPeerList);\n\t\t\t\tNdisFreeSpinLock(&pWpsCtrl->WscPeerListSemLock);\n\t\t\t}\n\t\t}\n#endif // APCLI_SUPPORT //\n\t}\t\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tWscStop(pAd,\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tFALSE,\n#endif // CONFIG_AP_SUPPORT //\n\t\t\t\t&pAd->StaCfg.WscControl);\n\t\tpAd->StaCfg.WscControl.WscRxBufLen = 0;\n\t\tif (pAd->StaCfg.WscControl.pWscRxBuf)\n\t\t{\n\t\t\tos_free_mem(pAd, pAd->StaCfg.WscControl.pWscRxBuf);\n\t\t\tpAd->StaCfg.WscControl.pWscRxBuf = NULL;\n\t\t}\n\t\tpAd->StaCfg.WscControl.WscTxBufLen = 0;\n\t\tif (pAd->StaCfg.WscControl.pWscTxBuf)\n\t\t{\n\t\t\tos_free_mem(pAd, pAd->StaCfg.WscControl.pWscTxBuf);\n\t\t\tpAd->StaCfg.WscControl.pWscTxBuf = NULL;\n\t\t}\n\t\tWscClearPeerList(&pAd->StaCfg.WscControl.WscPeerList);\n\t\tNdisFreeSpinLock(&pAd->StaCfg.WscControl.WscPeerListSemLock);\n\n#ifdef IWSC_SUPPORT\n\t\tWscClearPeerList(&pAd->StaCfg.WscControl.WscConfiguredPeerList);\n\t\tNdisFreeSpinLock(&pAd->StaCfg.WscControl.WscConfiguredPeerListSemLock);\n#endif /* IWSC_SUPPORT */\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* WSC hardware push button function 0811 */\n\tWSC_HDR_BTN_Stop(pAd);\t\n\treturn TRUE;\n}\n\n\n/*\n  * This kernel thread init in the probe function.\n  */\nNDIS_STATUS WscThreadInit(RTMP_ADAPTER *pAd)\n{\n\tNDIS_STATUS status = NDIS_STATUS_FAILURE;\n\tRTMP_OS_TASK *pTask;\n\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-->WscThreadInit()\\n\"));\n\n\tpTask = &pAd->wscTask;\n\n\n\tRTMP_OS_TASK_INIT(pTask, \"RtmpWscTask\", pAd);\n\tstatus = RtmpOSTaskAttach(pTask, wsc_write_dat_file_thread, (ULONG)&pAd->wscTask);\n\tif (status == NDIS_STATUS_SUCCESS)\n\t{\n\t\tos_alloc_mem(NULL, &pAd->pHmacData, sizeof(CHAR)*(2048));\n\t\tif (pAd->pHmacData == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Wsc HmacData memory alloc failed!\\n\"));\n\t\t\tstatus = FALSE;\n\t\t}\n\t\tNdisAllocateSpinLock(pAd, &pAd->WscElmeLock);\n\t\tos_alloc_mem(NULL, (UCHAR **)&pAd->pWscElme, sizeof(MLME_QUEUE_ELEM));\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--WscThreadInit(), status=%d!\\n\", status));\n\n\treturn status;\n}\n\n\n/* WSC hardware push button function 0811 */\n/*\n========================================================================\nRoutine Description:\n\tInitialize the PUSH PUTTION Check Module.\n\nArguments:\n\tad_p\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID WSC_HDR_BTN_Init(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tpAd->CommonCfg.WscHdrPshBtnCheckCount = 0;\n} /* End of WSC_HDR_BTN_Init */\n\n\n/*\n========================================================================\nRoutine Description:\n\tStop the PUSH PUTTION Check Module.\n\nArguments:\n\tad_p\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID WSC_HDR_BTN_Stop(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tpAd->CommonCfg.WscHdrPshBtnCheckCount = 0;\n} /* End of WSC_HDR_BTN_Stop */\n\n\n/*\n========================================================================\nRoutine Description:\n\tStart the PUSH PUTTION Check thread.\n\nArguments:\n\t*Context\t\t- WLAN control block pointer\n\nReturn Value:\n\t0\t\t\t- terminate the thread successfully\n\nNote:\n========================================================================\n*/\n#if 0 //def WSC_AP_SUPPORT\nextern INT\tSet_AP_WscMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPUCHAR\t\t\targ);\nextern INT\tSet_AP_WscGetConf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPUCHAR\t\t\targ);\n#endif /* CONFIG_AP_SUPPORT */\n\n/*#ifdef CONFIG_STA_SUPPORT */\n\nVOID WSC_HDR_BTN_CheckHandler(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n \tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tBOOLEAN flg_pressed;\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd))\n\t{\n\t\tMT7601_WSC_HDR_BTN_MR_PRESS_FLG_GET(pAd, flg_pressed);\n\t}\n\telse\n#endif /* MT7601 */\n\tWSC_HDR_BTN_MR_PRESS_FLG_GET(pAd, flg_pressed);\n\n\tif (flg_pressed)\n\t{\n\t\t/* the button is pressed */\n\t\tif (pAd->CommonCfg.WscHdrPshBtnCheckCount == WSC_HDR_BTN_CONT_TIMES)\n\t\t{\n\t\t\t/* we only handle once until the button is released */\n\t\t\tpAd->CommonCfg.WscHdrPshBtnCheckCount = 0;\n\n\t\t\t/* execute WSC PBC function */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"wsc> execute WSC PBC...\\n\"));\n\n#if 0 //def WSC_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t\t\tpObj->ioctl_if = 0;\n\t\t\t\tSet_AP_WscMode_Proc(pAd, (PUCHAR)\"2\"); /* 2: PBC */\n\t\t\t\tSet_AP_WscGetConf_Proc(pAd, (PUCHAR)\"1\"); /* 1: Trigger */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tpObj->ioctl_if = 0;\n\t\t\t\tSet_WscConfMode_Proc(pAd, (PUCHAR)\"1\"); /* 1:  */\n\t\t\t\tSet_WscMode_Proc(pAd, (PUCHAR)\"2\"); /* 2: PBC */\n\t\t\t\tSet_WscGetConf_Proc(pAd, (PUCHAR)\"1\"); /* 1: Trigger */\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\treturn;\n\t\t}\n\n\t\tpAd->CommonCfg.WscHdrPshBtnCheckCount ++;\n\t}\n\telse\n\t{\n\t\t/* the button is released */\n\t\tpAd->CommonCfg.WscHdrPshBtnCheckCount = 0;\t\t\n\t}\n}\n\n#ifdef WSC_LED_SUPPORT\n/* */\n/* Support WPS LED mode (mode 7, mode 8 and mode 9). */\n/* Ref: User Feedback (page 80, WPS specification 1.0) */\n/* */\nBOOLEAN WscSupportWPSLEDMode(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif ((LED_MODE(pAd) == WPS_LED_MODE_7) || \n\t    (LED_MODE(pAd) == WPS_LED_MODE_8) || \n\t    (LED_MODE(pAd) == WPS_LED_MODE_9) || \n\t    (LED_MODE(pAd) == WPS_LED_MODE_11) ||\n\t    (LED_MODE(pAd) == WPS_LED_MODE_12)\n#ifdef CONFIG_WIFI_LED_SUPPORT\n\t\t||(LED_MODE(pAd) == WPS_LED_MODE_SHARE)\n#endif /* CONFIG_WIFI_LED_SUPPORT */\n\t\t)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Support WPS LED mode (The WPS LED mode = %d).\\n\", \n\t\t\t__FUNCTION__, LED_MODE(pAd)));\n\t\treturn TRUE; /* Support WPS LED mode. */\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Not support WPS LED mode (The WPS LED mode = %d).\\n\", \n\t\t\t__FUNCTION__, LED_MODE(pAd)));\n\t\treturn FALSE; /* Not support WPS LED mode. */\n\t}\n}\n\nBOOLEAN WscSupportWPSLEDMode10(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tif ((LED_MODE(pAd) == WPS_LED_MODE_10)){\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Support WPS LED mode (The WPS LED mode = %d).\\n\", \n\t\t\t__FUNCTION__, LED_MODE(pAd)));\t\n\t\treturn TRUE; /*Support WPS LED mode 10. */\n\t} \n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Not support WPS LED mode (The WPS LED mode = %d).\\n\", \n\t\t\t__FUNCTION__, LED_MODE(pAd)));\n\t\treturn FALSE; /* Not support WPS LED mode 10. */\n\t}\n}\n\n/* */\n/* Whether the WPS AP has security setting or not. */\n/* Note that this function is valid only after the WPS handshaking. */\n/* */\nBOOLEAN WscAPHasSecuritySetting(\n\tIN PRTMP_ADAPTER pAdapter,\n\tIN PWSC_CTRL     pWscControl)\n{\n\tBOOLEAN bAPHasSecuritySetting = FALSE;\n\tUCHAR\tcurrentIdx = MAIN_MBSSID;\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tcurrentIdx = (pWscControl->EntryIfIdx & 0x0F);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tcurrentIdx = pWscControl->WscProfile.ApplyProfileIdx;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tswitch (pWscControl->WscProfile.Profile[currentIdx].EncrType)\n\t{\n\t\tcase WSC_ENCRTYPE_NONE:\n\t\t{\n\t\t\tbAPHasSecuritySetting = FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase WSC_ENCRTYPE_WEP:\n\t\tcase WSC_ENCRTYPE_TKIP:\n\t\tcase (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES):\n\t\tcase WSC_ENCRTYPE_AES:\n\t\t{\n\t\t\tbAPHasSecuritySetting = TRUE;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Incorrect encryption types (%d)\\n\", \n\t\t\t\t__FUNCTION__, pWscControl->WscProfile.Profile[currentIdx].EncrType));\n\t\t\tASSERT(FALSE);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: WSC Entryption Type = %d\\n\", \n\t\t__FUNCTION__, pWscControl->WscProfile.Profile[currentIdx].EncrType));\n\n\treturn bAPHasSecuritySetting;\n}\n\n\n/* */\n/* After the NIC connects with a WPS AP or not, */\n/* the WscLEDTimer timer controls the LED behavior according to LED mode. */\n/* */\nVOID WscLEDTimer(\n\tIN PVOID\tSystemSpecific1, \n\tIN PVOID\tFunctionContext, \n\tIN PVOID\tSystemSpecific2, \n\tIN PVOID\tSystemSpecific3) \n{\n\tPWSC_CTRL pWscControl = (PWSC_CTRL)FunctionContext;\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pWscControl->pAd;\n\tUCHAR WPSLEDStatus = 0;\n\n\t/* WPS LED mode 7, 8, 11 and 12. */\n\tif ((LED_MODE(pAd) == WPS_LED_MODE_7) || \n\t    (LED_MODE(pAd) == WPS_LED_MODE_8) || \n\t    (LED_MODE(pAd) == WPS_LED_MODE_11) ||\n\t    (LED_MODE(pAd) == WPS_LED_MODE_12))\n\t{\n\t\tWPSLEDStatus = LED_WPS_TURN_LED_OFF;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Turn off the WPS successful LED pattern.\\n\", __FUNCTION__));\n\t}\n\telse if ((LED_MODE(pAd) == WPS_LED_MODE_9) /* WPS LED mode 9. */\n#ifdef CONFIG_WIFI_LED_SUPPORT\n\t\t\t|| (LED_MODE(pAd) == WPS_LED_MODE_SHARE)\n#endif /* CONFIG_WIFI_LED_SUPPORT */\n\t\t\t)\n\t{\n\t\tswitch (pWscControl->WscLEDMode) /* Last WPS LED state. */\n\t\t{\n\n\n\t\t\t/* Turn off the blue LED after 300 seconds. */\n\t\t\tcase LED_WPS_SUCCESS:\n\t\t\t\tWPSLEDStatus = LED_WPS_TURN_LED_OFF;\n\n\t\t\t\t/* Turn on/off the WPS success LED according to AP's encryption algorithm after one second. */\n\t\t\t\tRTMPSetTimer(&pWscControl->WscLEDTimer, WSC_WPS_TURN_OFF_LED_TIMEOUT);\n\t\t\t\tpWscControl->WscLEDTimerRunning = TRUE;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: LED_WPS_SUCCESS => LED_WPS_TURN_LED_OFF\\n\", __FUNCTION__));\n\t\t\t\tbreak;\n\n\t\t\t/* After turn off the blue LED for one second. */\n\t\t\t/* AP uses an encryption algorithm: */\n\t\t\t/* a) YES: Turn on the blue LED. */\n\t\t\t/* b) NO: Turn off the blue LED. */\n\t\t\tcase LED_WPS_TURN_LED_OFF:\n\t\t\t\tif ((pWscControl->WscState == WSC_STATE_OFF) && \n\t\t\t\t     (pWscControl->WscStatus == STATUS_WSC_CONFIGURED))\n\t\t\t\t{\n\t\t\t\t\tif (WscAPHasSecuritySetting(pAd, pWscControl) == TRUE) /* The NIC connects with an AP using an encryption algorithm. */\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Turn WPS success LED. */\n\t\t\t\t\t\tWPSLEDStatus = LED_WPS_TURN_ON_BLUE_LED;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: LED_WPS_TURN_LED_OFF => LED_WPS_TURN_ON_BLUE_LED\\n\", __FUNCTION__));\n\t\t\t\t\t}\n\t\t\t\t\telse /* The NIC connects with an AP using OPEN-NONE. */\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Turn off the WPS LED. */\n\t\t\t\t\t\tWPSLEDStatus = LED_WPS_TURN_LED_OFF;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: LED_WPS_TURN_LED_OFF => LED_WPS_TURN_LED_OFF\\n\", __FUNCTION__));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t/* Turn off the amber LED after 15 seconds. */\n\t\t\tcase LED_WPS_ERROR:\n\t\t\t\t\tWPSLEDStatus = LED_WPS_TURN_LED_OFF; /* Turn off the WPS LED. */\n\t\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: LED_WPS_ERROR/LED_WPS_SESSION_OVERLAP_DETECTED => LED_WPS_TURN_LED_OFF\\n\", __FUNCTION__));\n\t\t\t\tbreak;\n\t\t\t/* Turn off the amber LED after ~3 seconds. */\n\t\t\tcase LED_WPS_SESSION_OVERLAP_DETECTED:\n\t\t\t\t\tWPSLEDStatus = LED_WPS_TURN_LED_OFF; /* Turn off the WPS LED. */\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: LED_WPS_SESSION_OVERLAP_DETECTED => LED_WPS_TURN_LED_OFF\\n\", __FUNCTION__));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t/* do nothing. */\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (WPSLEDStatus)\n\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n\t}\n\telse\n\t{\n\t\t/* do nothing. */\n\t}\t\n}\n\n\nVOID WscSkipTurnOffLEDTimer(\n\tIN PVOID\tSystemSpecific1, \n\tIN PVOID\tFunctionContext, \n\tIN PVOID\tSystemSpecific2, \n\tIN PVOID\tSystemSpecific3) \n{\n\tPWSC_CTRL pWscControl = (PWSC_CTRL)FunctionContext;\n\n\t/* Allow the NIC to turn off the WPS LED again. */\n\tpWscControl->bSkipWPSTurnOffLED = FALSE;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: Allow the NIC to turn off the WPS LED again.\\n\", __FUNCTION__));\n}\n\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nVOID WscUpdatePortCfgTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tPWSC_CTRL \t\tpWscControl = (PWSC_CTRL)FunctionContext;\n\tPRTMP_ADAPTER \tpAd = NULL;\n\tBOOLEAN\t\t\t/* bRestart = TRUE,*/ bEnrollee = TRUE;\n\tPWSC_CREDENTIAL\t\tpCredential = NULL;\n\tPMULTISSID_STRUCT\tpMbss = NULL;\n\n\tif (pWscControl == NULL)\n\t\treturn;\n\n\tpCredential = (PWSC_CREDENTIAL) &pWscControl->WscProfile.Profile[0];\n\tpAd = (PRTMP_ADAPTER)pWscControl->pAd;\n\n\tif (pAd == NULL)\n\t\treturn;\n\t\n\tpMbss = &pAd->ApCfg.MBSSID[pWscControl->EntryIfIdx & 0x0F];\n\tif (WscGetAuthMode(pCredential->AuthType) == pMbss->AuthMode &&\n\t\tWscGetWepStatus(pCredential->EncrType) == pMbss->WepStatus &&\n\t\tNdisEqualMemory(pMbss->Ssid, pCredential->SSID.Ssid, pMbss->SsidLen) &&\n\t\tNdisEqualMemory(pWscControl->WpaPsk, pCredential->Key, pCredential->KeyLength))\n\t{\n\t\treturn;\n\t}\n\n\tif (pWscControl->WscProfile.ApplyProfileIdx & 0x8000)\n\t\tbEnrollee = FALSE;\n\tWscWriteConfToPortCfg(pAd,\n\t\t\t\t\t\t  pWscControl,\n\t\t\t\t\t\t  &pWscControl->WscProfile.Profile[0],\n\t\t\t\t\t\t  bEnrollee);\n\tpWscControl->WscProfile.ApplyProfileIdx &= 0x7FFF;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_P2P_GO)\n\t{\n\t\tP2P_GoStop(pAd);\n\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n\t\tpAd->WriteWscCfgToDatFile = (pWscControl->EntryIfIdx & 0x0F);\n\t\tAPStop(pAd);\n\t\tAPStartUp(pAd);\n\t}\n\n/*#ifdef KTHREAD_SUPPORT */\n/*\tWAKE_UP(&(pAd->wscTask)); */\n/*#else */\n/*\tRTMP_SEM_EVENT_UP(&(pAd->wscTask.taskSema)); */\n/*#endif */\n\tRtmpOsTaskWakeUp(&(pAd->wscTask));\n\n\treturn;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID WscCheckPeerDPID(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PFRAME_802_11 \tFr,\n\tIN  PUCHAR\t\t\teid_data,\n\tIN  INT\t\t\t\teid_len)\n{\t\n\tWSC_IE\t\t*pWscIE;\n\tPUCHAR\t\tpData = NULL;\n\tINT\t\t\tLen = 0;\n\tUSHORT\t\tDevicePasswordID;\n\tPWSC_CTRL\tpWscCtrl = NULL;\n\n\tpData = eid_data + 4;\n\tLen = eid_len - 4;\n\twhile (Len > 0)\n\t{\n\t\tWSC_IE\tWscIE;\n\t\tNdisMoveMemory(&WscIE, pData, sizeof(WSC_IE));\n\t\t/* Check for WSC IEs*/\n\t\tpWscIE = &WscIE;\n\n\t\t/* Check for device password ID, PBC = 0x0004*/\n\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_DEVICE_PWD_ID)\n\t\t{\n\t\t\t/* Found device password ID*/\n\t\t\tNdisMoveMemory(&DevicePasswordID, pData + 4, sizeof(DevicePasswordID));\n\t\t\tDevicePasswordID = be2cpu16(DevicePasswordID);\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s : DevicePasswordID = 0x%04x\\n\", __FUNCTION__, DevicePasswordID));\n\t\t\tif (DevicePasswordID == DEV_PASS_ID_PBC)\t/* Check for PBC value*/\n\t\t\t{\n\t\t\t\tWscPBC_DPID_FromSTA(pAd, Fr->Hdr.Addr2);\n\t\t\t\thex_dump(\"PBC STA:\", Fr->Hdr.Addr2, MAC_ADDR_LEN);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\t\t\t}\n\t\t\telse if (DevicePasswordID == DEV_PASS_ID_PIN)\n\t\t\t{\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif ((pAd->OpMode == OPMODE_AP)\n#ifdef P2P_SUPPORT\n\t\t\t\t\t|| P2P_GO_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tUCHAR\tap_idx = 0;\n\t\t\t\t\tfor (ap_idx = 0; ap_idx < pAd->ApCfg.BssidNum; ap_idx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (NdisEqualMemory(Fr->Hdr.Addr1, pAd->ApCfg.MBSSID[ap_idx].Bssid, MAC_ADDR_LEN))\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ap_idx >= pAd->ApCfg.BssidNum)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tpWscCtrl = &pAd->ApCfg.MBSSID[ap_idx].WscControl;\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\t\t/*\n\t\t\t\t\tWSC 2.0 STA will send probe request with WPS IE anyway.\n\t\t\t\t\tDo NOT add this STA to WscPeerList after AP is triggered to do PBC.\n\t\t\t\t*/\n\t\t\t\tif (pWscCtrl && \n\t\t\t\t\t(!pWscCtrl->bWscTrigger || (pWscCtrl->WscMode != WSC_PBC_MODE)))\n\t\t\t\t{\n\t\t\t\t\tRTMP_SEM_LOCK(&pWscCtrl->WscPeerListSemLock);\n\t\t\t\t\tWscInsertPeerEntryByMAC(&pWscCtrl->WscPeerList, Fr->Hdr.Addr2);\n\t\t\t\t\tRTMP_SEM_UNLOCK(&pWscCtrl->WscPeerListSemLock);\n\t\t\t\t}\n\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\telse if (DevicePasswordID == DEV_PASS_ID_SMPBC)\n\t\t\t{\n\t\t\t\tIWSC_AddSmpbcEnrollee(pAd, Fr->Hdr.Addr2);\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\n\t\t\tbreak;\n\t\t}\n\t\t\n#ifdef IWSC_SUPPORT\n\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t{\n\t\t\tpWscCtrl = &pAd->StaCfg.WscControl;\n\n\t\t\tif ((be2cpu16(pWscIE->Type) == WSC_ID_CONFIG_METHODS) &&\n\t\t\t\t(pWscCtrl->WscConfMode == WSC_REGISTRAR) &&\n\t\t\t\t(pWscCtrl->bWscTrigger == TRUE))\n\t\t\t{\n\t\t\t\tUSHORT PeerConfigMethod = 0;\n\t\t\t\tPWSC_PEER_ENTRY pWscPeerEntry = NULL;\n\t\t\t\tRTMP_SEM_LOCK(&pWscCtrl->WscConfiguredPeerListSemLock);\n\t\t\t\tpWscPeerEntry = WscFindPeerEntry(&pWscCtrl->WscConfiguredPeerList, Fr->Hdr.Addr2);\n\t\t\t\tif (pWscPeerEntry == NULL)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(&PeerConfigMethod, pData + 4, sizeof(PeerConfigMethod));\n\t\t\t\t\tPeerConfigMethod = be2cpu16(PeerConfigMethod);\n\t\t\t\t\tif (pWscCtrl->WscMode == WSC_PIN_MODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pWscCtrl->WscPeerMAC, Fr->Hdr.Addr2, MAC_ADDR_LEN);\n\t\t\t\t\t\tNdisMoveMemory(pWscCtrl->EntryAddr, Fr->Hdr.Addr2, MAC_ADDR_LEN);\n\t\t\t\t\t}\n\t\t\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_PEER_PROBE_REQ, sizeof(USHORT), &PeerConfigMethod, 0);\n\t\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerProbeReqSanity : Add this peer: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\tPRINT_MAC(Fr->Hdr.Addr2)));\t\n\t\t\t\t}\n\t\t\t\tRTMP_SEM_UNLOCK(&pWscCtrl->WscConfiguredPeerListSemLock);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerProbeReqSanity : PeerConfigMethod = 0x%04x\\n\", PeerConfigMethod));\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t\n\t\t/* Set the offset and look for PBC information*/\n\t\t/* Since Type and Length are both short type, we need to offset 4, not 2*/\n\t\tpData += (be2cpu16(pWscIE->Length) + 4);\n\t\tLen   -= (be2cpu16(pWscIE->Length) + 4);\n\t}\n}\n\nVOID\tWscClearPeerList(\n\tIN  PLIST_HEADER\tpWscEnList)\n{\n\tPLIST_ENTRY\t\tpEntry = NULL;\n\n\tpEntry = pWscEnList->pHead;\n\n\twhile (pEntry != NULL)\n\t{\t\t\n\t\tremoveHeadList(pWscEnList);\n\t\tos_free_mem(NULL, pEntry);\n\t\tpEntry = pWscEnList->pHead;\n\t}\n\t\n\treturn;\n}\n\nPWSC_PEER_ENTRY\tWscFindPeerEntry(\n\tPLIST_HEADER\t\tpWscEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr)\n{\n\tPWSC_PEER_ENTRY \tpPeerEntry = NULL;\n\tPLIST_ENTRY\t\t\tpListEntry = NULL;\n\n\tpListEntry = pWscEnList->pHead;\n\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\twhile (pPeerEntry != NULL)\n\t{\n\t\tif (NdisEqualMemory(pPeerEntry->mac_addr, pMacAddr, MAC_ADDR_LEN))\n\t\t\treturn pPeerEntry;\n\t\tpListEntry = pListEntry->pNext;\n\t\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\t}\n\t\n\treturn NULL;\n}\n\nVOID\tWscInsertPeerEntryByMAC(\n\tPLIST_HEADER\t\tpWscEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr)\n{\n\tPWSC_PEER_ENTRY\t\tpWscPeer = NULL;\n\n\tpWscPeer = WscFindPeerEntry(pWscEnList, pMacAddr);\n\tif (pWscPeer)\n\t{\n\t\tNdisGetSystemUpTime(&pWscPeer->receive_time);\n\t}\n\telse\n\t{\n\t\tos_alloc_mem(NULL, (UCHAR **)&pWscPeer, sizeof(WSC_PEER_ENTRY));\n\t\tif (pWscPeer)\n\t\t{\n\t\t\tNdisZeroMemory(pWscPeer, sizeof(WSC_PEER_ENTRY));\n\t\t\tpWscPeer->pNext = NULL;\n\t\t\tNdisMoveMemory(pWscPeer->mac_addr, pMacAddr, MAC_ADDR_LEN);\n\t\t\tNdisGetSystemUpTime(&pWscPeer->receive_time);\n\t\t\tinsertTailList(pWscEnList, (PLIST_ENTRY)pWscPeer);\n\t\t}\n\t\tASSERT(pWscPeer != NULL);\n\t}\n}\n\n#ifdef CONFIG_AP_SUPPORT\nINT WscApShowPeerList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\tApIdx = 0;\n\tPWSC_CTRL \t\t\tpWscControl = NULL;\n\tPWSC_PEER_ENTRY \tpPeerEntry = NULL;\n\tPLIST_ENTRY\t\t\tpListEntry = NULL;\n\tPLIST_HEADER\t\tpWscEnList = NULL;\n\n\tfor (ApIdx = 0; ApIdx < pAd->ApCfg.BssidNum; ApIdx++)\n\t{\n\t\tpWscControl = &pAd->ApCfg.MBSSID[ApIdx].WscControl;\n\t\tpWscEnList = &pWscControl->WscPeerList;\n\n\t\tif (pWscEnList->size != 0)\n\t\t{\n\t\t\tWscMaintainPeerList(pAd, pWscControl);\n\t\t\tRTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock);\n\t\t\tpListEntry = pWscEnList->pHead;\n\t\t\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\t\t\twhile (pPeerEntry != NULL)\n\t\t\t{\n\t\t\t\tprintk(\"MAC:%02x:%02x:%02x:%02x:%02x:%02x\\tReveive Time:%lu\\n\", \t\t\t\t\t\n\t\t\t\t\t\t\tpPeerEntry->mac_addr[0],\n\t\t\t\t\t\t\tpPeerEntry->mac_addr[1],\n\t\t\t\t\t\t\tpPeerEntry->mac_addr[2],\n\t\t\t\t\t\t\tpPeerEntry->mac_addr[3],\n\t\t\t\t\t\t\tpPeerEntry->mac_addr[4],\n\t\t\t\t\t\t\tpPeerEntry->mac_addr[5],\n\t\t\t\t\t\t\tpPeerEntry->receive_time);\n\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t\t\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\t\t\t}\n\t\t\tRTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock);\n\t\t}\n\t\tprintk(\"\\n\");\n\t}\n\t\n\treturn TRUE;\n}\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nINT WscStaShowPeerList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL \t\t\tpWscControl = NULL;\n\tPWSC_PEER_ENTRY \tpPeerEntry = NULL;\n\tPLIST_ENTRY\t\t\tpListEntry = NULL;\n\tPLIST_HEADER\t\tpWscEnList = NULL;\n\n\tpWscControl = &pAd->StaCfg.WscControl;\n\tpWscEnList = &pWscControl->WscPeerList;\n\n\tRTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock);\n\tif (pWscEnList->size != 0)\n\t{\n\t\tRTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock);\n\t\tWscMaintainPeerList(pAd, pWscControl);\n\t\tRTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock);\n\t\tpListEntry = pWscEnList->pHead;\n\t\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\t\twhile (pPeerEntry != NULL)\n\t\t{\n\t\t\tprintk(\"MAC:%02x:%02x:%02x:%02x:%02x:%02x\\tReveive Time:%lu\\n\", \t\t\t\t\t\n\t\t\t\t\t\tpPeerEntry->mac_addr[0],\n\t\t\t\t\t\tpPeerEntry->mac_addr[1],\n\t\t\t\t\t\tpPeerEntry->mac_addr[2],\n\t\t\t\t\t\tpPeerEntry->mac_addr[3],\n\t\t\t\t\t\tpPeerEntry->mac_addr[4],\n\t\t\t\t\t\tpPeerEntry->mac_addr[5],\n\t\t\t\t\t\tpPeerEntry->receive_time);\n\t\t\tpListEntry = pListEntry->pNext;\n\t\t\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\t\t}\n\t}\n\tRTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock);\n\tprintk(\"\\n\");\n\t\n\treturn TRUE;\n}\n#endif // CONFIG_STA_SUPPORT //\n\nVOID\tWscMaintainPeerList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL\t\tpWpsCtrl)\n{\n\tPWSC_PEER_ENTRY \tpPeerEntry = NULL;\n\tPLIST_ENTRY\t\t\tpListEntry = NULL, pTempListEntry = NULL;\n\tPLIST_HEADER\t\tpWscEnList = NULL;\n\tULONG\t\t\t\tnow_time = 0;\n\n\tRTMP_SEM_LOCK(&pWpsCtrl->WscPeerListSemLock);\n\tpWscEnList = &pWpsCtrl->WscPeerList;\n\n\n\tNdisGetSystemUpTime(&now_time);\n\tpListEntry = pWscEnList->pHead;\n\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\n\twhile (pPeerEntry != NULL)\n\t{\n\t\tif (RTMP_TIME_AFTER(now_time, pPeerEntry->receive_time + (30 * OS_HZ)))\n\t\t{\n\t\t\tpTempListEntry = pListEntry->pNext;\n\t\t\tdelEntryList(pWscEnList, pListEntry);\n\t\t\tos_free_mem(pAd, pPeerEntry);\n\t\t\tpListEntry = pTempListEntry;\n\t\t}\n\t\telse\n\t\t\tpListEntry = pListEntry->pNext;\n\t\tpPeerEntry = (PWSC_PEER_ENTRY)pListEntry;\n\t}\n\t\n\tRTMP_SEM_UNLOCK(&pWpsCtrl->WscPeerListSemLock);\n\treturn;\n}\n\nVOID\tWscDelListEntryByMAC(\n\tPLIST_HEADER\t\tpWscEnList,\n\tIN  PUCHAR\t\t\tpMacAddr)\n{\n\tPLIST_ENTRY\tpListEntry = NULL;\n\tpListEntry = (PLIST_ENTRY)WscFindPeerEntry(pWscEnList, pMacAddr);\n\tif (pListEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscDelListEntryByMAC : pMacAddr = %02X:%02X:%02X:%02X:%02X:%02X\\n\", PRINT_MAC(pMacAddr)));\n\t\tdelEntryList(pWscEnList, pListEntry);\t\t\n\t\tos_free_mem(NULL, pListEntry);\n\t}\n}\n\nVOID\tWscAssignEntryMAC(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL\t\tpWpsCtrl)\n{\n\tPWSC_PEER_ENTRY pPeerEntry = NULL;\n\n\tWscMaintainPeerList(pAd, pWpsCtrl);\n\n\tRTMP_SEM_LOCK(&pWpsCtrl->WscPeerListSemLock);\n\tpPeerEntry = (PWSC_PEER_ENTRY)pWpsCtrl->WscPeerList.pHead;\n\n\tNdisZeroMemory(pWpsCtrl->EntryAddr, MAC_ADDR_LEN);\n\tif (pPeerEntry)\n\t{\n\t\tNdisMoveMemory(pWpsCtrl->EntryAddr, pPeerEntry->mac_addr, MAC_ADDR_LEN);\n\t}\n\tRTMP_SEM_UNLOCK(&pWpsCtrl->WscPeerListSemLock);\n}\n\n\n/*\n\tGet WSC IE data from WSC Peer by Tag.\n*/\nBOOLEAN WscGetDataFromPeerByTag(\n    IN  PRTMP_ADAPTER \tpAd, \n    IN  PUCHAR\t\t\tpIeData,\n    IN  INT\t\t\t\tIeDataLen,\n    IN  USHORT\t\t\tWscTag,\n    OUT PUCHAR\t\t\tpWscBuf,\n    OUT PUSHORT\t\t\tpWscBufLen)\n{\n\tPUCHAR\t\t\t\tpData = pIeData;\n\tINT\t\t\t\t\tLen = 0;\n\tUSHORT\t\t\t\tDataLen = 0;\n\tPWSC_IE\t\t\t\tpWscIE;\n\n\tLen = IeDataLen;\n\n\twhile (Len > 0)\n\t{\n\t\tWSC_IE\tWscIE;\n\t\tNdisMoveMemory(&WscIE, pData, sizeof(WSC_IE));\n\t\t// Check for WSC IEs\n\t\tpWscIE = &WscIE;\n\t\t\n\t\tif (be2cpu16(pWscIE->Type) == WscTag)\n\t\t{\n\t\t\tDataLen = be2cpu16(pWscIE->Length);\n\t\t\tif (pWscBufLen)\n\t\t\t\t*pWscBufLen = DataLen;\n\t\t\tNdisMoveMemory(pWscBuf, pData + 4, DataLen);\n\t\t\treturn TRUE;\n\t\t}\n\t\t\n\t\t// Set the offset and look for next WSC Tag information\n\t\t// Since Type and Length are both short type, we need to offset 4, not 2\n\t\tpData += (be2cpu16(pWscIE->Length) + 4);\n\t\tLen   -= (be2cpu16(pWscIE->Length) + 4);\n\t}\n\n    return FALSE;\n}\n\n#endif /* WSC_INCLUDED */\n\n"
  },
  {
    "path": "src/common/wsc_tlv.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twsc.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tPaul Lin\t06-08-08\t\tInitial\n\tJuemingChen 06-10-30        Do modifications and Add APIs for AP\n*/\n\n#include \"rt_config.h\"\n\n#ifdef WSC_INCLUDED\n#include \"wsc_tlv.h\"\n\nstatic UCHAR\tWsc_Personal_String[] =  \"Wi-Fi Easy and Secure Key Derivation\";\n\n#define IV_ENCR_DATA_LEN_512 512\n#define IV_ENCR_DATA_LEN_144 144\n\n#define WSC_TLV_ENT(TLV_PARA) (0x00ff & TLV_PARA)\n#define WSC_TLV_BYTE1(TLV_PARA) (0x000f & TLV_PARA)\n#define WSC_TLV_BYTE2(TLV_PARA) (0x000f & (TLV_PARA >> 4))\n\n/* Global reusable buffer */\nstatic WSC_TLV_0B wsc_tlv_0b[]=\n{\n\t{/*0,*/0},\n\t/*AP Channel*/\t\t\t\t\t\t{/*0x1001,*/ 2},\t\t\t\t/* WSC_ID_AP_CHANNEL */\n\t/*Association State*/\t\t\t\t{/*0x1002,*/ 2},\t\t\t\t/* WSC_ID_ASSOC_STATE */\n\t/*Authentication Type*/\t\t\t\t{/*0x1003,*/ 2},\t\t\t\t/* WSC_ID_AUTH_TYPE */\n\t/*Authentication Type Flags*/\t\t{/*0x1004,*/ 2},\t\t\t\t/* WSC_ID_AUTH_TYPE_FLAGS */\n\t/*Authenticator*/\t\t\t\t\t{/*0x1005,*/ 8},\t\t\t\t/* WSC_ID_AUTHENTICATOR */\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t/*Config Methods*/\t\t\t\t\t{/*0x1008,*/ 2},\t\t\t\t/* WSC_ID_CONFIG_METHODS */\n\t/*Configuration Error*/\t\t\t\t{/*0x1009,*/ 2},\t\t\t\t/* WSC_ID_CONFIG_ERROR */\n\t/*Confirmation URL4*/\t\t\t\t{/*0x100A,*/ 0x40}, /* <= 64B\tWSC_ID_CONF_URL4 */\n\t/*Confirmation URL6*/\t\t\t\t{/*0x100B,*/ 0x4C}, /* <= 76B\tWSC_ID_CONF_URL6 */\n\t/*Connection Type*/\t\t\t\t\t{/*0x100C,*/ 1},\t\t\t\t/* WSC_ID_CONN_TYPE */\n\t/*Connection Type Flags*/\t\t\t{/*0x100D,*/ 1},\t\t\t\t/* WSC_ID_CONN_TYPE_FLAGS */\n\t/*Credential*/\t\t\t\t\t\t{/*0x100E,*/ 0xff},\t\t\t\t/* WSC_ID_CREDENTIAL */\n\t/*Encryption Type*/\t\t\t\t\t{/*0x100F,*/ 2},\t\t\t\t/* WSC_ID_ENCR_TYPE */\n\t/*Encryption Type Flags*/\t\t\t{/*0x1010,*/ 2},\t\t\t\t/* WSC_ID_ENCR_TYPE_FLAGS */\n\t/*Device Name*/\t\t\t\t\t\t{/*0x1011,*/ 0x20}, /* <= 32B\tWSC_ID_DEVICE_NAME */\n\t/*Device Password ID*/\t\t\t\t{/*0x1012,*/ 2},\t\t\t\t/* WSC_ID_DEVICE_PWD_ID */\n\t{/*0,*/0},\n\t/*E-Hash1*/\t\t\t\t\t\t\t{/*0x1014,*/ 32},\t\t\t\t/* WSC_ID_E_HASH1 */\n\t/*E-Hash2*/\t\t\t\t\t\t\t{/*0x1015,*/ 32},\t\t\t\t/* WSC_ID_E_HASH2 */\n\t/*E-SNonce1*/\t\t\t\t\t\t{/*0x1016,*/ 16},\t\t\t\t/* WSC_ID_E_SNONCE1 */\n\t/*E-SNonce2*/\t\t\t\t\t\t{/*0x1017,*/ 16},\t\t\t\t/* WSC_ID_E_SNONCE2 */\n\t/*Encrypted Settings*/\t\t\t\t{/*0x1018,*/ 0xff},\t \t\t    /* WSC_ID_ENCR_SETTINGS */\n\t{/*0,*/0},\n\t/*Enrollee Nonce*/\t\t\t\t\t{/*0x101A,*/ 16},\t\t\t\t/* WSC_ID_ENROLLEE_NONCE */\n\t/*Feature_ID*/\t\t\t\t\t\t{/*0x101B,*/ 4},\t\t\t\t/* WSC_ID_FEATURE_ID */\n\t/*Identity*/\t\t\t\t\t\t{/*0x101C,*/ 0x50}, /* <= 80B\tWSC_ID_IDENTITY */\n\t{/*0,*/0},\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/* WSC_ID_IDENTITY_PROOF */\n\t/*Key Wrap Authenticator*/\t\t\t{/*0x101E,*/ 8},\t\t\t\t/* WSC_ID_KEY_WRAP_AUTH */\n\t/*Key Identifier*/\t\t\t\t\t{/*0x101F,*/ 16},\t\t\t\t/* WSC_ID_KEY_IDENTIFIER */\n\t/*MAC Address*/\t\t\t\t\t\t{/*0x1020,*/ 6},\t\t\t\t/* WSC_ID_MAC_ADDR */\n\t/*Manufacturer*/\t\t\t\t\t{/*0x1021,*/ 0x40}, /* <= 64B\tWSC_ID_MANUFACTURER */\n\t/*Message Type*/\t\t\t\t\t{/*0x1022,*/ 1},\t\t\t\t/* WSC_ID_MSG_TYPE */\n\t/*Model Name*/\t\t\t\t\t\t{/*0x1023,*/ 0x20}, /* <= 32B\tWSC_ID_MODEL_NAME */\n\t/*Model Number*/\t\t\t\t\t{/*0x1024,*/ 0x20}, /* <= 32B\tWSC_ID_MODEL_NUMBER */\n\t{/*0,*/0},\n\t/*Network Index*/\t\t\t\t\t{/*0x1026,*/ 1},\t\t\t\t/* WSC_ID_NW_INDEX */\n\n\t/* \n\t\tWindows 7 WCN test only accept Len of Network Key item in credentail is zero \n\t\twhen auth type of AP is OPEN/NONE \n    */\n\t/*Network Key*/\t\t\t\t\t\t{/*0x1027,*/ 0}, \t/* <= 64B\tWSC_ID_NW_KEY */\n\t\n\t/*Network Key Index*/\t\t\t\t{/*0x1028,*/ 1},\t\t\t\t/* WSC_ID_NW_KEY_INDEX */\n\t/*New Device Name*/\t\t\t\t\t{/*0x1029,*/ 0x20}, /* <= 32B\tWSC_ID_NEW_DEVICE_NAME */\n\t/*New Password*/\t\t\t\t\t{/*0x102A,*/ 0x40}, /* <= 64B\tWSC_ID_NEW_PWD */\n\t{/*0,*/0},\n\t/*OOB Device Password*/\t\t\t\t{/*0x102C,*/ 0x3A}, /* <= 58B\tWSC_ID_OOB_DEV_PWD */\n\t/*OS Version*/\t\t\t\t\t\t{/*0x102D,*/ 4},\t\t\t\t/* WSC_ID_OS_VERSION */\n\t{/*0,*/0},\n\t/*Power Level*/\t\t\t\t\t\t{/*0x102F,*/ 1},\t\t\t\t/* WSC_ID_POWER_LEVEL */\n\t/*PSK Current*/\t\t\t\t\t\t{/*0x1030,*/ 1},\t\t\t\t/* WSC_ID_PSK_CURRENT */\n\t/*PSK Max*/\t\t\t\t\t\t\t{/*0x1031,*/ 1},\t\t\t\t/* WSC_ID_PSK_MAX */\n\t/*Public Key*/\t\t\t\t\t\t{/*0x1032,*/ 192},\t\t\t\t/* WSC_ID_PUBLIC_KEY */\n\t/*Radio Enabled*/\t\t\t\t\t{/*0x1033,*/ 1},\t\t\t\t/* WSC_ID_RADIO_ENABLED */\n\t/*Reboot*/\t\t\t\t\t\t\t{/*0x1034,*/ 1},\t\t\t\t/* WSC_ID_REBOOT */\n\t/*Registrar Current*/\t\t\t\t{/*0x1035,*/ 1},\t\t\t\t/* WSC_ID_REGISTRAR_CURRENT */\n\t/*Registrar Established*/\t\t\t{/*0x1036,*/ 1},\t\t\t\t/* WSC_ID_REGISTRAR_ESTBLSHD */\n\t{/*0,*/0},\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/* WSC_ID_REGISTRAR_LIST */\n\t/*Registrar Max*/\t\t\t\t\t{/*0x1038,*/ 1},\t\t\t\t/* WSC_ID_REGISTRAR_MAX */\n\t/*Registrar Nonce*/\t\t\t\t\t{/*0x1039,*/ 16},\t\t\t\t/* WSC_ID_REGISTRAR_NONCE */\n\t/*Request Type*/\t\t\t\t\t{/*0x103A,*/ 1},\t\t\t\t/* WSC_ID_REQ_TYPE */\n\t/*Response Type*/\t\t\t\t\t{/*0x103B,*/ 1},\t\t\t\t/* WSC_ID_RESP_TYPE */\n\t/*RF Bands*/\t\t\t\t\t\t{/*0x103C,*/ 1},\t\t\t\t/* WSC_ID_RF_BAND */\n\t/*R-Hash1*/\t\t\t\t\t\t\t{/*0x103D,*/ 32},\t\t\t\t/* WSC_ID_R_HASH1 */\n\t/*R-Hash2*/\t\t\t\t\t\t\t{/*0x103E,*/ 32},\t\t\t\t/* WSC_ID_R_HASH2 */\n\t/*R-SNonce1*/\t\t\t\t\t\t{/*0x103F,*/ 16},\t\t\t\t/* WSC_ID_R_SNONCE1 */\n\t/*R-SNonce2*/\t\t\t\t\t\t{/*0x1040,*/ 16},\t\t\t\t/* WSC_ID_R_SNONCE2 */\n\t/*Selected Registrar*/\t\t\t\t{/*0x1041,*/ 1},\t\t\t\t/* WSC_ID_SEL_REGISTRAR */\n\t/*Serial Number*/\t\t\t\t\t{/*0x1042,*/ 0x20}, /* <= 32B\tWSC_ID_SERIAL_NUM */\n\t{/*0,*/0},\n\t/*Simple Config State*/\t\t\t\t{/*0x1044,*/ 1},\t\t\t\t/* WSC_ID_SC_STATE */\n\t/*SSID*/\t\t\t\t\t\t\t{/*0x1045,*/ 0x20}, /* <= 32B\tWSC_ID_SSID */\n\t/*Total Networks*/\t\t\t\t\t{/*0x1046,*/ 1},\t\t\t\t/* WSC_ID_TOT_NETWORKS */\n\t/*UUID-E*/\t\t\t\t\t\t\t{/*0x1047,*/ 16},\t\t\t\t/* WSC_ID_UUID_E */\n\t/*UUID-R*/\t\t\t\t\t\t\t{/*0x1048,*/ 16},\t\t\t\t/* WSC_ID_UUID_R */\n\t/*WPS Vendor Extension*/\t\t\t{/*0x1049,*/ 0x400},\t\t\t/* WSC_ID_VENDOR_EXT */\n\t/*Version*/\t\t\t\t\t\t\t{/*0x104A,*/ 1},\t\t\t\t/* WSC_ID_VERSION */\n\t/*X.509 Certificate Request*/\t\t{/*0x104B,*/ 0xff},\t\t\t\t/* WSC_ID_X509_CERT_REQ */\n\t/*X.509 Certificate*/\t\t\t\t{/*0x104C,*/ 0xff},\t\t\t\t/* WSC_ID_X509_CERT */\n\t/*EAP Identity*/\t\t\t\t\t{/*0x104D,*/ 0x40}, /* <= 64B\tWSC_ID_EAP_IDENTITY */\n\t/*Message Counter*/\t\t\t\t\t{/*0x104E,*/ 8},\t\t\t\t/* WSC_ID_MSG_COUNTER */\n\t/*Public Key Hash*/\t\t\t\t\t{/*0x104F,*/ 20},\t\t\t\t/* WSC_ID_PUBKEY_HASH */\n\t/*Rekey Key*/\t\t\t\t\t\t{/*0x1050,*/ 32},\t\t\t\t/* WSC_ID_REKEY_KEY */\n\t/*Key Lifetime*/\t\t\t\t\t{/*0x1051,*/ 4},\t\t\t\t/* WSC_ID_KEY_LIFETIME */\n\t/*Permitted Config Methods*/\t\t{/*0x1052,*/ 2},\t\t\t\t/* WSC_ID_PERM_CFG_METHODS */\n\t/*Selected Registrar Config Method*/{/*0x1053,*/ 2},\t\t\t\t/* WSC_ID_SEL_REG_CFG_METHODS */\n\t/*Primary Device Type*/\t\t\t\t{/*0x1054,*/ 8},\t\t\t\t/* WSC_ID_PRIM_DEV_TYPE */\n\t{/*0,*/0},\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/* WSC_ID_SEC_DEV_TYPE_LIST */\n\t/*Portable Device*/\t\t\t\t\t{/*0x1056,*/ 1},\t\t\t\t/* WSC_ID_PORTABLE_DEVICE */\n\t/*AP Setup Locked*/\t\t\t\t\t{/*0x1057,*/ 1},\t\t\t\t/* WSC_ID_AP_SETUP_LOCKED */\n\t{/*0,*/0},\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/* WSC_ID_APP_LIST */\n\t/*EAP Type*/\t\t\t\t\t\t{/*0x1059,*/ 0x08}, /* <= 8B\tWSC_ID_EAP_TYPE */\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t/*Initialization Vector*/\t\t\t{/*0x1060,*/ 32},\t\t\t\t/* WSC_ID_INIT_VECTOR */\n\t/*Key Provided Automatically*/\t\t{/*0x1061,*/ 1},\t\t\t\t/* WSC_ID_KEY_PROVIDED_AUTO */\n\t/*802.1X Enabled*/\t\t\t\t\t{/*0x1062,*/ 1},\t\t\t\t/* WSC_ID_8021X_ENABLED */\n#ifdef IWSC_SUPPORT\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0},\n\t{/*0,*/0}, //A\n\t{/*0,*/0}, //B\n\t{/*0,*/0}, //C\n\t/*Entry Acceptable (only for IBSS)*/  {/*0x106D,*/ 1},\t\t\t\t//WSC_ID_ENTRY_ACCEPTABLE\n\t/*Registration Ready (only for IBSS)*/{/*0x106E,*/ 1},\t\t\t\t//WSC_ID_REGISTRATON_READY\n\t/*Registrar IPv4 Address (only for IBSS)*/{/*0x106F,*/ 4},\t\t\t//WSC_ID_REGISTRAR_IPV4\n\t/*IPv4 Subnet Mask (only for IBSS)*/{/*0x1070,*/ 4},\t\t\t\t//WSC_ID_IPV4_SUBMASK\n\t/*Enrollee IPv4 Address (only for IBSS)*/{/*0x1071,*/ 4},\t\t\t//WSC_ID_ENROLLEE_IPV4\n\t/*Available IPv4 Submask List (only for IBSS)*/{/*0x1072,*/ 0},\t//WSC_ID_IPV4_SUBMASK_LIST\t(N*4B)\n\t/*IP Address Configuration Methods (only for IBSS)*/{/*0x1073,*/ 2},//WSC_ID_IP_ADDR_CONF_METHOD\n#endif // IWSC_SUPPORT //\n\t/*<Reserved for WFA> 0x106F V 0x1FFF*/\n\t/*<Unavailable> 0x000 V 0x0FFF,0x2000 V 0xFFFF*/\n};\n\nextern UINT8 WPS_DH_G_VALUE[1];\nextern UINT8 WPS_DH_P_VALUE[192];\n\nint AppendWSCTLV(USHORT index, OUT UCHAR * obuf, IN UCHAR * ibuf, IN USHORT varlen)\n{\n\tUSHORT len, dataLen, tag = cpu2be16(index);\n\n\t/*\n\t\tThe max len of WPS Vendor Extension is 1024B\n\t*/\n    dataLen = ( varlen != (USHORT)0 ) ? varlen : wsc_tlv_0b[WSC_TLV_ENT(index)].len;\n\n\tNdisMoveMemory(obuf, &tag, 2);\n    len = cpu2be16(dataLen);\n\tmemcpy(obuf + 2, &len, 2);\n\tif (dataLen != 0)\n\t\tmemcpy(obuf + 4, ibuf, dataLen);\n\treturn (dataLen + 4);\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess elements encryption settings\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t1. Recv M4 M5 M6 M7\n\t\t\n\t========================================================================\n*/\nstatic VOID\tWscParseEncrSettings(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter, \n\tIN\tPUCHAR\t\t\t\tpPlainData,\n\tIN\tINT\t\t\t\t\tPlainLength,\n\tIN  PWSC_CTRL           pWscControl)\n{\n#ifdef CONFIG_STA_SUPPORT\n    /* Point to  M7 Profile */\n\tPWSC_PROFILE        pProfile = (PWSC_PROFILE) &pAdapter->StaCfg.WscControl.WscM7Profile;\n    UCHAR               *pTmp;\n    USHORT              Idx = 0, tmpVal = 0;\n#endif /* CONFIG_STA_SUPPORT */\n\tUSHORT\tWscType, WscLen, HmacLen;\n\tPUCHAR\tpData;\n\tUCHAR\tHmac[8], Temp[32];\n    PWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\n\tHmacLen = (USHORT)(PlainLength - 12);\n\tpData  = pPlainData;\n\n\t/* Start to process WSC IEs */\n\twhile (PlainLength > 4)\n\t{\n\t\tWSC_IE\tTLV_Encr;\n\t\tmemcpy((UINT8 *)&TLV_Encr, pData, 4);\n\t\tWscType = be2cpu16(TLV_Encr.Type);\n\t\tWscLen  = be2cpu16(TLV_Encr.Length);\n\t\tpData  += 4;\n\t\tPlainLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_E_SNONCE1:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tNdisMoveMemory(pReg->Es1, pData, WscLen);\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_E_SNONCE2:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tNdisMoveMemory(pReg->Es2, pData, WscLen);\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_R_SNONCE1:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tNdisMoveMemory(pReg->Rs1, pData, WscLen);\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_R_SNONCE2:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tNdisMoveMemory(pReg->Rs2, pData, WscLen);\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_KEY_WRAP_AUTH:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tbreak;\n\n#ifdef CONFIG_STA_SUPPORT\n            /* */\n\t\t\t/* Parse AP Settings in M7 if the peer is configured AP. */\n\t\t\t/* */\n\t\t\tcase WSC_ID_SSID:\n\t\t\t\t/* Find the exact length of SSID without null terminator */\n\t\t\t\tpTmp = pData;\n\t\t\t\tfor (Idx = 0; Idx < WscLen; Idx++)\n\t\t\t\t{\n\t\t\t\t\tif (*(pTmp++) == 0x0)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpProfile->Profile[0].SSID.SsidLength = Idx;\n\t\t\t\tRTMPMoveMemory(pProfile->Profile[0].SSID.Ssid, pData, pProfile->Profile[0].SSID.SsidLength);\n\t\t\t\t/* Svae the total number, always get the first profile */\n\t\t\t\tpProfile->ProfileCnt = 1;\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_MAC_ADDR:\n\t\t\t\tif (!MAC_ADDR_EQUAL(pData, pAdapter->StaCfg.WscControl.RegData.SelfInfo.MacAddr))\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscParseEncrSettings --> Enrollee macAddr not match\\n\"));\n\t\t\t\tRTMPMoveMemory(pProfile->Profile[0].MacAddr, pData, 6);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\tcase WSC_ID_AUTH_TYPE:\n\t\t\t\ttmpVal = get_unaligned((PUSHORT) pData);\n\t\t\t\tpProfile->Profile[0].AuthType = cpu2be16(tmpVal);/*cpu2be16(*((PUSHORT) pData)); */\n\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_TYPE:\n\t\t\t\ttmpVal = get_unaligned((PUSHORT) pData);\n\t\t\t\tpProfile->Profile[0].EncrType = cpu2be16(tmpVal);/*cpu2be16(*((PUSHORT) pData)); */\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_NW_KEY_INDEX:\n                /* Netork Key Index: 1 ~ 4 */\n\t\t\t\tpProfile->Profile[0].KeyIndex = (*pData);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase WSC_ID_NW_KEY:\n\t\t\t\tif (WscLen == 0)\n\t\t\t\t\tbreak;\n\t\t\t\tpProfile->Profile[0].KeyLength = WscLen;\n\t\t\t\tRTMPMoveMemory(pProfile->Profile[0].Key, pData, pProfile->Profile[0].KeyLength);\n\t\t\t\tbreak;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscParseEncrSettings --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tPlainLength -= WscLen;\n\t}\n\t/* Validate HMAC, reuse KDK buffer */\n    RT_HMAC_SHA256(pReg->AuthKey, 32, pPlainData, HmacLen, Temp, SHA256_DIGEST_SIZE);\n\t\n\tif (RTMPEqualMemory(Hmac, Temp, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"WscParseEncrSettings --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Temp[0])), (UINT)cpu2be32(*((PUINT) &Temp[4]))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t}\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess credentials within AP encryption settings\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\t1. Recv M8\n\t\t\n\t========================================================================\n*/\nstatic BOOLEAN\tWscProcessCredential(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter, \n\tIN\tPUCHAR\t\t\t\tpPlainData,\n\tIN\tINT\t\t\t\t\tPlainLength,\n\tIN  PWSC_CTRL           pWscControl)\n{\n\tUSHORT\t\t\tWscType, WscLen, Cnt = 0, CurrentIdx=0, Idx, tmpVal = 0;\n\tPUCHAR\t\t\tpData, pTmp;\n\tPWSC_PROFILE\tpProfile;\n#ifdef WSC_V2_SUPPORT\n\tBOOLEAN\t\t\tbReject = FALSE;\n#endif /* WSC_V2_SUPPORT */\n#ifdef IWSC_SUPPORT\n\tUINT32\t\t\tIPv4Addr = 0, IPv4SubMask = 0;\n\tPIWSC_INFO\t\tpIWscInfo = &pAdapter->StaCfg.IWscInfo;\n#endif /* IWSC_SUPPORT */\n\n\tpData  = pPlainData;\n\n\t/* Cleanup Old contents */\n\tNdisZeroMemory(&pWscControl->WscProfile, sizeof(WSC_PROFILE));\n\t\n\tpProfile = (PWSC_PROFILE) &pWscControl->WscProfile;\n\t/*CurrentIdx = pWscControl->EntryIfIdx; */\n\t\n\t/* Init Profile number */\n\tCnt = 0;\n\t\n\thex_dump(\"WscProcessCredential - PlainData\", pPlainData, PlainLength);\n\t/* Start to process WSC IEs within credential */\n\twhile (PlainLength > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tPlainLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_NW_INDEX:\n\t\t\t\t/* A new profile, add the cnt and save to database */\n\t\t\t\tCurrentIdx = Cnt;\t/* since the index start from 0, we have to minus 1 */\n\t\t\t\tCnt++;\t\t\t\t\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_SSID:\n\t\t\t\t/* Find the exact length of SSID without null terminator */\n\t\t\t\tpTmp = pData;\n\t\t\t\tfor (Idx = 0; Idx < WscLen; Idx++)\n\t\t\t\t{\n\t\t\t\t\tif (*(pTmp++) == 0x0)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpProfile->Profile[CurrentIdx].SSID.SsidLength = Idx;\n\t\t\t\tif (RTMPCheckStrPrintAble((CHAR *)pData, Idx) || (pWscControl->bCheckMultiByte == FALSE))\n\t\t\t\t\tNdisMoveMemory(pProfile->Profile[CurrentIdx].SSID.Ssid, pData, pProfile->Profile[CurrentIdx].SSID.SsidLength);\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\tcase WSC_ID_AUTH_TYPE:\n\t\t\t\ttmpVal = get_unaligned((PUSHORT) pData);\n\t\t\t\tpProfile->Profile[CurrentIdx].AuthType = cpu2be16(tmpVal); /*cpu2be16(*((PUSHORT) pData));//(UINT8 *)&pReg->RegistrarInfo.AuthTypeFlags */\n\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_TYPE:\n\t\t\t\ttmpVal = get_unaligned((PUSHORT) pData);\n\t\t\t\tpProfile->Profile[CurrentIdx].EncrType = cpu2be16(tmpVal);/*cpu2be16(*((PUSHORT) pData));//(UINT8 *)&pReg->RegistrarInfo.EncrTypeFlags */\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_NW_KEY_INDEX:\n                /* Netork Key Index: 1 ~ 4 */\n\t\t\t\tpProfile->Profile[CurrentIdx].KeyIndex = (*pData);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_NW_KEY:\n\t\t\t\tif (WscLen == 0)\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tif (RTMPCheckStrPrintAble((CHAR *)pData, WscLen) || (pWscControl->bCheckMultiByte == FALSE))\n\t\t\t\t{\n\t\t\t\t\tpProfile->Profile[CurrentIdx].KeyLength = WscLen;\n\t\t\t\t\tNdisMoveMemory(pProfile->Profile[CurrentIdx].Key, pData, pProfile->Profile[CurrentIdx].KeyLength);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MAC_ADDR:\n\t\t\t\t/*\n\t\t\t\t\tSome AP (ex. Buffalo WHR-G300N WPS AP) would change BSSID during WPS processing.\n\t\t\t\t\tSTA shall not change MacAddr of credential form AP.\n\t\t\t\t*/\n\t\t\t\tRTMPMoveMemory(pProfile->Profile[CurrentIdx].MacAddr, pData, MAC_ADDR_LEN);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_KEY_WRAP_AUTH:\n\t\t\t\t/* Not used here, since we already verify it at decryption */\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_CREDENTIAL:\n\t\t\t\t/* Credential IE, The WscLen include all length within profile, we need to modify it */\n\t\t\t\t/* to be able to parse all profile fields */\n\t\t\t\tWscLen = 0;\n\t\t\t\tbreak;\n\n#ifdef IWSC_SUPPORT\n\t\t\tcase WSC_ID_IP_ADDR_CONF_METHOD:\n\t\t\t\ttmpVal = get_unaligned((PUSHORT) pData);\n\t\t\t\tpProfile->Profile[CurrentIdx].IpConfigMethod = be2cpu16(tmpVal);\n\t\t\t\tbreak;\n\t\t\tcase WSC_ID_REGISTRAR_IPV4:\n\t\t\t\tIPv4Addr = get_unaligned((PUINT32) pData);\n\t\t\t\tpProfile->Profile[CurrentIdx].RegIpv4Addr = be2cpu32(IPv4Addr);\n\t\t\t\tif (CurrentIdx == 0)\n\t\t\t\t\tpIWscInfo->RegIpv4Addr = pProfile->Profile[CurrentIdx].RegIpv4Addr;\n\t\t\t\tpIWscInfo->RegDepth = 1;\n\t\t\t\tpIWscInfo->IpDevCount = 0;\n\t\t\t\tbreak;\n\t\t\tcase WSC_ID_IPV4_SUBMASK:\n\t\t\t\tIPv4SubMask = get_unaligned((PUINT32) pData);\n\t\t\t\tpProfile->Profile[CurrentIdx].Ipv4SubMask = be2cpu32(IPv4SubMask);\n\t\t\t\tif (pProfile->Profile[CurrentIdx].Ipv4SubMask!= IWSC_DEFAULT_IPV4_SUBMASK)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscProcessCredential --> different IPv4 subnet mask (=0x%08x)\\n\", \n\t\t\t\t\t\t\t\tpProfile->Profile[CurrentIdx].Ipv4SubMask));\n\t\t\t\tbreak;\n\t\t\tcase WSC_ID_ENROLLEE_IPV4:\n\t\t\t\tIPv4Addr = get_unaligned((PUINT32) pData);\n\t\t\t\tpProfile->Profile[CurrentIdx].EnrIpv4Addr = be2cpu32(IPv4Addr);\n\t\t\t\tif (CurrentIdx == 0)\n\t\t\t\t\tpIWscInfo->SelfIpv4Addr = pProfile->Profile[CurrentIdx].EnrIpv4Addr;\n\t\t\t\tbreak;\n\t\t\tcase WSC_ID_IPV4_SUBMASK_LIST:\n\t\t\t\tNdisZeroMemory(&pProfile->Profile[CurrentIdx].AvaIpv4SubmaskList[0], sizeof(pProfile->Profile[CurrentIdx].AvaIpv4SubmaskList));\n\t\t\t\tif ((WscLen == 0) || \t\t\t\t\t\n\t\t\t\t\t(WscLen == 4) ||\n\t\t\t\t\t((WscLen%4) != 0))\n\t\t\t\t{\n\t\t\t\t\tpIWscInfo->AvaSubMaskListCount = 0;\n\t\t\t\t\tpIWscInfo->bAssignWscIPv4 = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscProcessCredential --> WscLen = %d, set AvaSubMaskListCount to be 0\\n\", WscLen));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUINT8 i = 0, AvaSubMaskListCount;\n\n\t\t\t\t\tAvaSubMaskListCount = (UINT8)((WscLen/4) - 1);\n\t\t\t\t\tfor (i = 0; i < AvaSubMaskListCount; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tpProfile->Profile[CurrentIdx].AvaIpv4SubmaskList[i] = be2cpu32(get_unaligned((PUINT32) (pData + i + 1)));\n\t\t\t\t\t}\n\n\t\t\t\t\tpIWscInfo->bAssignWscIPv4 = TRUE;\n\t\t\t\t\tif (CurrentIdx == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tpIWscInfo->CurrentIpRange = be2cpu32(get_unaligned((PUINT32) pData));\n\t\t\t\t\t\tpIWscInfo->AvaSubMaskListCount = (UINT8)AvaSubMaskListCount;\n\t\t\t\t\t\tNdisZeroMemory(pIWscInfo->AvaSubMaskList, sizeof(pIWscInfo->AvaSubMaskList));\n\t\t\t\t\t\tNdisMoveMemory( &pIWscInfo->AvaSubMaskList[0], \n\t\t\t\t\t\t\t\t\t\t&pProfile->Profile[CurrentIdx].AvaIpv4SubmaskList[0], \n\t\t\t\t\t\t\t\t\t\tsizeof(pIWscInfo->AvaSubMaskList));\n\t\t\t\t\t}\n\t\t\t\t\tpProfile->Profile[CurrentIdx].AvaIpv4SubmaskList[AvaSubMaskListCount] = pIWscInfo->CurrentIpRange;\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif /* IWSC_SUPPORT */\n\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscProcessCredential --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tPlainLength -= WscLen;\n\t}\n\n\t/* Svae the total number */\n\tpProfile->ProfileCnt = (UINT)Cnt;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/*\n\t\t\tCheck all credentials\n\t\t*/\n\t\tfor (Idx = 0; Idx < pProfile->ProfileCnt; Idx++)\n\t\t{\n\t\t\tPWSC_CREDENTIAL pCredential = &pProfile->Profile[Idx];\n\t\t\t/*if ((pCredential->EncrType != WSC_ENCRTYPE_WEP) && (pCredential->EncrType != WSC_ENCRTYPE_TKIP)) */\n\t\t\tif (pCredential->EncrType == WSC_ENCRTYPE_WEP)\n\t\t\t{\n\t\t\t\tbReject = TRUE;\n\t\t\t\t/* Cleanup contents */\n\t\t\t\tNdisZeroMemory(&pWscControl->WscProfile, sizeof(WSC_PROFILE));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (bReject)\n\t\t\treturn FALSE;\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscProcessCredential --> %d profile retrieved from credential\\n\", Cnt));\n\treturn TRUE;\n}\n\n/* return 0  to success ,1 to failed */\nint WscDeriveKey (\n    unsigned char *kdk, unsigned int kdk_len, \n    unsigned char *prsnlString, unsigned int str_len,\n    unsigned char *key, unsigned int keyBits )\n{\n    unsigned int i = 0, iterations = 0;\n    unsigned char input[64], output[128];\n    unsigned char hmac[32];\n    unsigned int temp;\n\n    iterations = ((keyBits/8) + 32 - 1)/32;\n\n    /*Prepare the input buffer. During the iterations, we need only replace the */\n    /*value of i at the start of the buffer. */\n    temp = cpu2be32(i);\n    memcpy(input, &temp, 4);\n    memcpy(input+4, prsnlString, str_len);\n    \n    temp = cpu2be32(keyBits);\n    memcpy(input+4+str_len, &temp, 4);\n\n    for(i = 0; i < iterations; i++)\n    {\n        /*Set the current value of i at the start of the input buffer */\n        temp = cpu2be32(i+1); /*i should start at 1 */\n        memcpy(input,&temp,4);\n        RT_HMAC_SHA256(kdk, kdk_len, input, 4+str_len+4, hmac, SHA256_DIGEST_SIZE);\n        memcpy(output+i*32, hmac, 32);\n    }\n\n    /*Sanity check */\n    if(keyBits/8 > (32*iterations))\n    {\n        \n        return 1; /*failed */\n    }\n\n    memcpy(key, output, 80);\n    \n    return 0; /*success */\n    \n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M1 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx EAP-Req(ID)\n\t\t1. Change the correct parameters\n\t\t2. Build M1\n\t\t\n\t========================================================================\n*/\nint BuildMessageM1(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[1];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\tINT\t\t\t\t\tidx;\n\tUSHORT\t\t\t\tConfigError = 0, ConfigMethods = 0;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n    \n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M1 */\n\tTB[0] = WSC_ID_MESSAGE_M1;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. UUID_E, last 6 bytes use MAC */\n\t/*templen = AppendWSCTLV(WSC_ID_UUID_E, pData, pReg->EnrolleeInfo.Uuid, 0); */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_E, pData, &pWscControl->Wsc_Uuid_E[0], 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. MAC address */\n\ttemplen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, pReg->SelfInfo.MacAddr, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Enrollee Nonce, first generate and save to Wsc Control Block */\n\tfor (idx = 0; idx < 16; idx++)\n\t{\n\t\tpReg->SelfNonce[idx] = RandomByte(pAdapter);\n\t\tpReg->EnrolleeNonce[idx] = pReg->SelfNonce[idx];\n\t}\n\t/* 5. Enrollee Nonce, first generate and save to Wsc Control Block */\n\tNdisMoveMemory(pReg->EnrolleeNonce, pReg->SelfNonce, 16);\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->SelfNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 6. Public Key, 192 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_PUBLIC_KEY, pData, pReg->Pke, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 7. Authentication Type Flags */\n\ttemplen = AppendWSCTLV(WSC_ID_AUTH_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.AuthTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/* 8. Encryption Type Flags */\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.EncrTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/* 9. Connection Type Flag ESS */\n\ttemplen = AppendWSCTLV(WSC_ID_CONN_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.ConnTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/*10. Config Method */\n\t/*pReg->SelfInfo.ConfigMethods = cpu2be16(pWscControl->WscConfigMethods);*/\n\tConfigMethods = pWscControl->WscConfigMethods;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/*\n\t\t\tAP MUST NOT support using PBC to add an external Registrar \n\t\t*/\n\t\tif (CurOpMode == AP_MODE)\n\t\t{\n\t\t\tConfigMethods = (pWscControl->WscConfigMethods & 0x200F);\n\t\t}\n#ifdef IWSC_SUPPORT\n\t\tif ((CurOpMode == STA_MODE) && \n\t\t\t(pAdapter->StaCfg.BssType == BSS_ADHOC))\n\t\t\t{\n\t\t\t\tif (pAdapter->StaCfg.IWscInfo.bLimitedUI)\n\t\t\t\t{\n\t\t\t\t\tConfigMethods &= (~WSC_CONFMET_KEYPAD);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tConfigMethods |= WSC_CONFMET_KEYPAD;\n\t\t\t\t}\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t}\n\t\telse\n#endif /* WSC_V2_SUPPORT */\n\t{\n\t\t/*\n\t\t\tWSC 1.0 WCN logo testing has AP PBC Enrollee testing item.\n\t\t\tWe cannot remove PBC capability here.\n\t\t*/\n\t\tConfigMethods = (pWscControl->WscConfigMethods & 0x00FF);\n\t}\n\n\tConfigMethods = cpu2be16(ConfigMethods);\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_METHODS, pData, (UINT8 *)&ConfigMethods, 0);\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/*11. Simple Config State (Not Configured) */\n\tif (CurOpMode == AP_MODE)\n\t\tpReg->SelfInfo.ScState = pWscControl->WscConfStatus;\n\ttemplen = AppendWSCTLV(WSC_ID_SC_STATE, pData, (UINT8 *)&pReg->SelfInfo.ScState, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/*12. Manufacture */\n\ttemplen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData, pReg->SelfInfo.Manufacturer, strlen((PSTRING) pReg->SelfInfo.Manufacturer));\n\tpData += templen;\n\tLen   += templen;\n\n\t/*13. Model Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pReg->SelfInfo.ModelName, strlen((PSTRING) pReg->SelfInfo.ModelName));\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/*14. Model Number */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pReg->SelfInfo.ModelNumber, strlen((PSTRING) pReg->SelfInfo.ModelNumber));\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/*15. Serial Number */\n\ttemplen = AppendWSCTLV(WSC_ID_SERIAL_NUM, pData, pReg->SelfInfo.SerialNumber, strlen((PSTRING) pReg->SelfInfo.SerialNumber));\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/*16. Primary Device Type */\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/*17. Device Name */\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, pReg->SelfInfo.DeviceName, strlen((PSTRING) pReg->SelfInfo.DeviceName));\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/*18. RF Band */\n\ttemplen = AppendWSCTLV(WSC_ID_RF_BAND, pData, (UINT8 *)&pReg->SelfInfo.RfBand, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/*19. Associate state (Not associated) */\n\ttemplen = AppendWSCTLV(WSC_ID_ASSOC_STATE, pData, (UINT8 *)&pReg->SelfInfo.AssocState, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/*20. Device Password ID */\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_PWD_ID, pData, (UINT8 *)&pReg->SelfInfo.DevPwdId, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/*21. Configure Error */\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_ERROR, pData, (UINT8 *)&ConfigError, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/*22. OS Version Not associated) */\n\ttemplen = AppendWSCTLV(WSC_ID_OS_VERSION, pData, (UINT8 *)&pReg->SelfInfo.OsVersion, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\n\n#ifdef WSC_V2_SUPPORT\n\t/* Extra attribute that is not defined in WSC Sepc. */\n\tif (pWscControl->WscV2Info.bEnableWpsV2 && pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t{\n\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\tpData += templen;\n\t\tLen   += templen;\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n    /* Fixed WCN vista logo 2 registrar test item issue. */\n    /* Also prevent that WCN GetDeviceInfo disturbs EAP processing. */\n\tif (pWscControl->WscUPnPNodeInfo.bUPnPMsgTimerRunning ||\n        (pWscControl->WscUseUPnP && pWscControl->EapMsgRunning))\n         ;\n    else\n    {\n        /* Copy the content to Regdata for lasttx information */\n    \tpReg->LastTx.Length = Len;\n    \tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n    }\n\t\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM1.\\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M2 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M1\n\t\t1. Change the correct parameters\n\t\t2. Build M2\n\t\t\n\t========================================================================\n*/\nint BuildMessageM2(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[1];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf, pAuth;\n    PWSC_REG_DATA\t\tpReg;\n\tUCHAR\t\t\t\tDHKey[32], KDK[32], KdkInput[38], KdfKey[80];\n\tINT\t\t\t\t\tDH_Len;\n\tINT\t\t\t\t    HmacLen = 0;\n\tINT\t\t\t\t\tidx;\n\tUSHORT\t\t\t\tConfigMethods;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\n   \tDH_Len = sizeof(pReg->SecretKey);\n\tRT_DH_SecretKey_Generate (\n\t    pReg->Pke, sizeof(pReg->Pke),\n\t    WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE),\n\t    pReg->EnrolleeRandom,  sizeof(pReg->EnrolleeRandom),\n\t    pReg->SecretKey, (UINT *) &DH_Len);\n\tRT_SHA256(&pReg->SecretKey[0], 192, &DHKey[0]);\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M2 */\n\tTB[0] = WSC_ID_MESSAGE_M2;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* fixed config Windows 7 issue */\n\t/* Enrollee Nonce, first generate and save to Wsc Control Block */\n\tfor (idx = 0; idx < 16; idx++)\n\t{\n\t\tpReg->SelfNonce[idx] = RandomByte(pAdapter);\n        pReg->RegistrarNonce[idx] = pReg->SelfNonce[idx];\n\t}\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* UUID, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_R, pData, pReg->SelfInfo.Uuid, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Publikc Key */\n\ttemplen = AppendWSCTLV(WSC_ID_PUBLIC_KEY, pData, pReg->Pkr, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Authentication Type Flags */\n\ttemplen = AppendWSCTLV(WSC_ID_AUTH_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.AuthTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Encrypt Type */\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.EncrTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Connection Type */\n\ttemplen = AppendWSCTLV(WSC_ID_CONN_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.ConnTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Config Method */\n\tConfigMethods = pWscControl->WscConfigMethods;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\tif (pWscControl->WscMode == WSC_PIN_MODE)\n\t\t{\n\t\t\tConfigMethods = (pWscControl->WscConfigMethods & 0x200F);\n#ifdef IWSC_SUPPORT\n\t\t\tif (pAdapter->StaCfg.BssType == BSS_ADHOC)\n\t\t\t{\n\t\t\t\tif (pAdapter->StaCfg.IWscInfo.bLimitedUI)\n\t\t\t\t{\n\t\t\t\t\tConfigMethods &= (~WSC_CONFMET_KEYPAD);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tConfigMethods |= WSC_CONFMET_KEYPAD;\n\t\t\t\t}\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tConfigMethods = (pWscControl->WscConfigMethods & 0x02F0);\n\t\t}\n\t}\n\telse\n\t{\n\t\tConfigMethods = (pWscControl->WscConfigMethods & 0x00FF);\n\t}\n#endif /* WSC_V2_SUPPORT */\n\tConfigMethods = cpu2be16(ConfigMethods);\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_METHODS, pData, (UINT8 *)&ConfigMethods, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Manufacture Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData, pReg->SelfInfo.Manufacturer, strlen((PSTRING) pReg->SelfInfo.Manufacturer));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Model Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pReg->SelfInfo.ModelName, strlen((PSTRING) pReg->SelfInfo.ModelName));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Model Number */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pReg->SelfInfo.ModelNumber, strlen((PSTRING) pReg->SelfInfo.ModelNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Serial Number */\n\ttemplen = AppendWSCTLV(WSC_ID_SERIAL_NUM, pData, pReg->SelfInfo.SerialNumber, strlen((PSTRING) pReg->SelfInfo.SerialNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Prime Device Type */\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Device Name */\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, pReg->SelfInfo.DeviceName, strlen((PSTRING) pReg->SelfInfo.DeviceName));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* RF Band */\n\ttemplen = AppendWSCTLV(WSC_ID_RF_BAND, pData, (UINT8 *)&pReg->SelfInfo.RfBand, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Assoc State */\n\ttemplen = AppendWSCTLV(WSC_ID_ASSOC_STATE, pData, (UINT8 *)&pReg->SelfInfo.AssocState, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Config Error */\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_ERROR, pData, (UINT8 *)&pReg->SelfInfo.ConfigError, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Device Password ID */\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_PWD_ID, pData, (UINT8 *)&pReg->SelfInfo.DevPwdId, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* OS Version */\n\ttemplen = AppendWSCTLV(WSC_ID_OS_VERSION, pData, (UINT8 *)&pReg->SelfInfo.OsVersion, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/* Create KDK input data */\n\tNdisMoveMemory(&KdkInput[0], &pReg->EnrolleeNonce[0], 16);\n\tNdisMoveMemory(&KdkInput[16], &pReg->PeerInfo.MacAddr[0], 6);\n\tNdisMoveMemory(&KdkInput[22], pReg->RegistrarNonce, 16);\n\t\n\t/* Generate the KDK */\n\tRT_HMAC_SHA256(DHKey, 32,  KdkInput, 38, KDK, SHA256_DIGEST_SIZE);\n\t\n\t/* KDF */\n\tWscDeriveKey(KDK, 32, Wsc_Personal_String, (sizeof(Wsc_Personal_String) - 1), KdfKey, 640);\n\n\t/* Assign Key from KDF */\n\tNdisMoveMemory(pReg->AuthKey, &KdfKey[0], 32);\n\tNdisMoveMemory(pReg->KeyWrapKey, &KdfKey[32], 16);\n\tNdisMoveMemory(pReg->Emsk, &KdfKey[48], 32);\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\t/* 22. Hmac */\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, KDK, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM2.\\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M2D Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M1 process Error\n\t\t1. Change the correct parameters\n\t\t2. Build M2D\n\t\t\n\t========================================================================\n*/\nint BuildMessageM2D(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[1];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M2D */\n\tTB[0] = WSC_ID_MESSAGE_M2D;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->SelfNonce, 0);\n\t/*templen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0); */\n\tpData += templen;\n\tLen   += templen;\n\n\t/* UUID, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_R, pData, pReg->SelfInfo.Uuid, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\n\t/* 7. Authentication Type Flags */\n\ttemplen = AppendWSCTLV(WSC_ID_AUTH_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.AuthTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Encrypt Type */\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.EncrTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Connection Type */\n\ttemplen = AppendWSCTLV(WSC_ID_CONN_TYPE_FLAGS, pData, (UINT8 *)&pReg->SelfInfo.ConnTypeFlags, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Config Methods */\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_METHODS, pData, (UINT8 *)&pReg->SelfInfo.ConfigMethods, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Manufacturer Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData, pReg->SelfInfo.Manufacturer, strlen((PSTRING) pReg->SelfInfo.Manufacturer));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Model Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pReg->SelfInfo.ModelName, strlen((PSTRING) pReg->SelfInfo.ModelName));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Model Number */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pReg->SelfInfo.ModelNumber, strlen((PSTRING) pReg->SelfInfo.ModelNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Serial Number */\n\ttemplen = AppendWSCTLV(WSC_ID_SERIAL_NUM, pData, pReg->SelfInfo.SerialNumber, strlen((PSTRING) pReg->SelfInfo.SerialNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Prime Device Type */\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Device Name */\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, pReg->SelfInfo.DeviceName, strlen((PSTRING) pReg->SelfInfo.DeviceName));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* RF Band */\n\ttemplen = AppendWSCTLV(WSC_ID_RF_BAND, pData, (UINT8 *)&pReg->SelfInfo.RfBand, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Assoc State */\n\ttemplen = AppendWSCTLV(WSC_ID_ASSOC_STATE, pData, (UINT8 *)&pReg->SelfInfo.AssocState, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Config Error */\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_ERROR, pData, (UINT8 *)&pReg->SelfInfo.ConfigError, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* OS Version */\n\ttemplen = AppendWSCTLV(WSC_ID_OS_VERSION, pData, (UINT8 *)&pReg->SelfInfo.OsVersion, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\t\n\n    pWscControl->WscRetryCount = 0;\n    DBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM2D.\\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M3 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M2\n\t\t1. Change the correct parameters\n\t\t2. Build M3\n\t\t\n\t========================================================================\n*/\nint BuildMessageM3(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[32];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf, pAuth;\n\tPWSC_REG_DATA\t\tpReg = NULL;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\t*pHash=NULL;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\t\n/*\tpHash = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&pHash, 512);\n\tif(NULL == pHash)\n\t\treturn Len;\n\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M3 */\n\tTB[0] = WSC_ID_MESSAGE_M3;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. E-Hash1 */\n\t/* */\n\t/* Generate PSK1 */\n\tif (pReg->PinCodeLen == 4)\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, pReg->PIN, 2, TB, SHA256_DIGEST_SIZE);\n\telse\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, pReg->PIN, 4, TB, SHA256_DIGEST_SIZE);\n\n\t/* Copy first 16 bytes to PSK1 */\n\tNdisMoveMemory(pReg->Psk1, TB, 16);\n\n\t/* Create input for E-Hash1 */\n\tNdisMoveMemory(pHash, pReg->Es1, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk1, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate E-Hash1 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, pReg->EHash1, SHA256_DIGEST_SIZE);\n\t\n\ttemplen = AppendWSCTLV(WSC_ID_E_HASH1, pData, pReg->EHash1, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 5. E-Hash2 */\n\t/* */\n\t/* Generate PSK2 */\n\tif (pReg->PinCodeLen == 4)\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, &pReg->PIN[2], 2, TB, SHA256_DIGEST_SIZE);\n\telse\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, &pReg->PIN[4], 4, TB, SHA256_DIGEST_SIZE);\n\n\t/* Copy first 16 bytes to PSK2 */\n\tNdisMoveMemory(pReg->Psk2, TB, 16);\n\t\t\n\t/* Create input for E-Hash2 */\n\tNdisMoveMemory(pHash, pReg->Es2, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk2, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate E-Hash2 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, pReg->EHash2, SHA256_DIGEST_SIZE);\n\t\n\ttemplen = AppendWSCTLV(WSC_ID_E_HASH2, pData, pReg->EHash2, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/*\n\t\tGenerate authenticator\n\t\tCombine last TX & RX message contents and validate the HMAC\n\t*/\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, TB, SHA256_DIGEST_SIZE);\n    }\n\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\n\tif(NULL != pHash)\n/*\t\tkfree(pHash); */\n\t\tos_free_mem(NULL, pHash);\n\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM3 : \\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M4 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M3\n\t\t1. Change the correct parameters\n\t\t2. Build M4\n\t\t\n\t========================================================================\n*/\nint BuildMessageM4(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[32];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf, pAuth;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tKDK[32];\n\tUCHAR\t\t\t\tPlain[128]; /*, IV_EncrData[144];//IV len 16,EncrData len 128 */\n\tUCHAR\t\t\t\t*IV_EncrData = NULL;/*IV len 16,EncrData len 128 */\n\tINT\t\t\t\t\tPlainLen = 0, EncrLen;\n\tUCHAR\t\t\t\t*pHash=NULL;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\t\n/*\tpHash = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&pHash, 512);\n\tif(NULL == pHash)\n\t\treturn Len;\n\n\tos_alloc_mem(NULL, (UCHAR **)&IV_EncrData, IV_ENCR_DATA_LEN_144);\n\tif (IV_EncrData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M4 */\n\tTB[0] = WSC_ID_MESSAGE_M4;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. R-Hash1 */\n\t/* */\n\t/* Generate PSK1 */\n\tif (pReg->PinCodeLen == 4)\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, pReg->PIN, 2, TB, SHA256_DIGEST_SIZE);\n\telse\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, pReg->PIN, 4, TB, SHA256_DIGEST_SIZE);\n\n\t/* Copy first 16 bytes to PSK1 */\n\tNdisMoveMemory(pReg->Psk1, TB, 16);\n\n\t/* Create input for R-Hash1 */\n\tNdisMoveMemory(pHash, pReg->Es1, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk1, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate R-Hash1 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, pReg->RHash1, SHA256_DIGEST_SIZE);\n\t\n\ttemplen = AppendWSCTLV(WSC_ID_R_HASH1, pData, pReg->RHash1, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 5. R-Hash2 */\n\t/* */\n\t/* Generate PSK2 */\n\tif (pReg->PinCodeLen == 4)\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, &pReg->PIN[2], 2, TB, SHA256_DIGEST_SIZE);\n\telse\n\t\tRT_HMAC_SHA256(pReg->AuthKey, 32, &pReg->PIN[4], 4, TB, SHA256_DIGEST_SIZE);\n\n\t/* Copy first 16 bytes to PSK2 */\n\tNdisMoveMemory(pReg->Psk2, TB, 16);\n\t\t\n\t/* Create input for R-Hash2 */\n\tNdisMoveMemory(pHash, pReg->Es2, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk2, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate R-Hash2 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, pReg->RHash2, SHA256_DIGEST_SIZE);\n\t\n\ttemplen = AppendWSCTLV(WSC_ID_R_HASH2, pData, pReg->RHash2, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 6a. Encrypted R-S1 */\n\t/*    Prepare plain text */\n\tPlainLen += AppendWSCTLV(WSC_ID_R_SNONCE1, &Plain[0], pReg->Es1, 0);\n\n\t/* Generate HMAC */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, &Plain[0], PlainLen, TB, SHA256_DIGEST_SIZE);\n\tPlainLen += AppendWSCTLV(WSC_ID_KEY_WRAP_AUTH, &Plain[PlainLen], TB, 0);\n\n\t/* 6b. Encrypted Settings */\n\t/* Encrypt data */\n    EncrLen = IV_ENCR_DATA_LEN_144 - 16;\n    AES_CBC_Encrypt(Plain, PlainLen,pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),&IV_EncrData[0], 16, (UINT8 *) &IV_EncrData[16], (UINT *) &EncrLen);\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_SETTINGS, pData, &IV_EncrData[0], 16 + EncrLen);/*IVLen + EncrLen */\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/*\n\t\tCombine last TX & RX message contents and validate the HMAC\n\t\tWe have to exclude last 12 bytes from last receive since it's authenticator value\n\t*/\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, KDK, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\nLabelErr:\n\tif(NULL != pHash)\n/*\t\tkfree(pHash); */\n\t\tos_free_mem(NULL, pHash);\n\n    pWscControl->WscRetryCount = 0;\n\n\tif (IV_EncrData != NULL)\n\t\tos_free_mem(NULL, IV_EncrData);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM4 : \\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M5 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M4\n\t\t1. Change the correct parameters\n\t\t2. Build M5\n\t\t\n\t========================================================================\n*/\nint BuildMessageM5(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[32];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\tPUCHAR\t\t\t\tpAuth;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tPlain[128]; /*, IV_EncrData[144];//IV len 16,EncrData len 128 */\n\tUCHAR\t\t\t\t*IV_EncrData = NULL;/*IV len 16,EncrData len 128 */\n\tINT\t\t\t\t\tPlainLen=0, EncrLen;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_EncrData, IV_ENCR_DATA_LEN_144);\n\tif (IV_EncrData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M5 */\n\tTB[0] = WSC_ID_MESSAGE_M5;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4a. Encrypted E-S1 */\n\t/*    Prepare plain text */\n\tPlainLen += AppendWSCTLV(WSC_ID_E_SNONCE1, &Plain[0], pReg->Es1, 0);\n\n\t/* Generate HMAC */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, &Plain[0], PlainLen, TB, SHA256_DIGEST_SIZE);\n\tPlainLen += AppendWSCTLV(WSC_ID_KEY_WRAP_AUTH, &Plain[PlainLen], TB, 0);\n\n\t/* 4b. Encrypted Settings */\n\t/* Encrypt data */\n    EncrLen = IV_ENCR_DATA_LEN_144 - 16;\n    AES_CBC_Encrypt(Plain, PlainLen,pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),&IV_EncrData[0], 16, (UINT8 *) &IV_EncrData[16], (UINT *) &EncrLen);\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_SETTINGS, pData, &IV_EncrData[0], 16 + EncrLen);/*IVLen + EncrLen */\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/*\n\t\tGenerate authenticator\n\t\tCombine last TX & RX message contents and validate the HMAC\n\t*/\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, TB, SHA256_DIGEST_SIZE);\n    }\n\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\n    pWscControl->WscRetryCount = 0;\n\n\tif (IV_EncrData != NULL)\n\t\tos_free_mem(NULL, IV_EncrData);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM5 : \\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M6 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M5\n\t\t1. Change the correct parameters\n\t\t2. Build M6\n\t\t\n\t========================================================================\n*/\nint BuildMessageM6(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[32];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf, pAuth;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tKDK[32];\n\tUCHAR\t\t\t\tPlain[128]; /*, IV_EncrData[144];//IV len 16,EncrData len 128 */\n\tUCHAR\t\t\t\t*IV_EncrData = NULL;/*IV len 16,EncrData len 128 */\n\tINT\t\t\t\t\tPlainLen = 0, EncrLen;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_EncrData, 144);\n\tif (IV_EncrData == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M6 */\n\tTB[0] = WSC_ID_MESSAGE_M6;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4a. Encrypted R-S2 */\n\t/*    Prepare plain text */\n\tPlainLen += AppendWSCTLV(WSC_ID_R_SNONCE2, &Plain[0], pReg->Es2, 0);\n\n\t/* Generate HMAC */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, &Plain[0], PlainLen, TB, SHA256_DIGEST_SIZE);\n\tPlainLen += AppendWSCTLV(WSC_ID_KEY_WRAP_AUTH, &Plain[PlainLen], TB, 0);\n\n\t/* 4b. Encrypted Settings */\n\t/* Encrypt data */\n    EncrLen = IV_ENCR_DATA_LEN_144 - 16;\n    AES_CBC_Encrypt(Plain, PlainLen,pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),&IV_EncrData[0], 16, (UINT8 *) &IV_EncrData[16], (UINT *) &EncrLen);\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_SETTINGS, pData, &IV_EncrData[0], 16 + EncrLen);/*IVLen + EncrLen */\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/*\n\t\tCombine last TX & RX message contents and validate the HMAC\n\t\tWe have to exclude last 12 bytes from last receive since it's authenticator value\n\t*/\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, KDK, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\n    pWscControl->WscRetryCount = 0;\n\n\tif (IV_EncrData != NULL)\n\t\tos_free_mem(NULL, IV_EncrData);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM6 : \\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M7 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M6\n\t\t1. Change the correct parameters\n\t\t2. Build M7\n\t\t\n\t========================================================================\n*/\nint BuildMessageM7(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[32];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf, pAuth;\n    PWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tPlain[256], *IV_EncrData=NULL;/*IV len 16 ,EncrData len */\n\tINT\t\t\t\t\tPlainLen=0, EncrLen;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n/*\tIV_EncrData = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_EncrData, IV_ENCR_DATA_LEN_512);\n\tif(NULL == IV_EncrData)\n\t\treturn 0;\n\n#ifdef CONFIG_AP_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M7 */\n\tTB[0] = WSC_ID_MESSAGE_M7;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4a. Encrypted E-S2 */\n\t/*    Prepare plain text */\n\tPlainLen += AppendWSCTLV(WSC_ID_E_SNONCE2, &Plain[0], pReg->Es2, 0);\n\n    /* Marvell WPS AP doesn't accept STA includes profile in M7. 20070604 */\n    if ((CurOpMode == AP_MODE) &&\n\t\t(pWscControl->EntryIfIdx < MIN_NET_DEVICE_FOR_APCLI))\n    {\n        USHORT  authType;\n        USHORT  encyType;\n        PWSC_CREDENTIAL pCredential = &pWscControl->WscProfile.Profile[0];\n            WscCreateProfileFromCfg(pAdapter, ENROLLEE_ACTION | AP_MODE, pWscControl, &pWscControl->WscProfile);\n\t\t\t\n\t\tauthType = pCredential->AuthType;\n\t\tencyType = pCredential->EncrType;\n\t\t/*\n\t\t\tSome Win7 WSC 1.0 STA has problem to receive mixed authType and encyType.\n\t\t\tWe need to check STA is WSC 1.0 or WSC 2.0 here.\n\t\t\tIf STA is WSC 1.0, re-assign authType and encyType.\n\t\t*/\n\t\tif (pWscControl->RegData.PeerInfo.Version2 == 0)\n\t\t{\n\t\t\tif (authType == (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK))\n\t\t\t\tauthType = WSC_AUTHTYPE_WPA2PSK;\n\t\t\tif (encyType == (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES))\n\t\t\t\tencyType = WSC_ENCRTYPE_AES;\n\t\t}\n        authType = cpu2be16(authType);\n        encyType = cpu2be16(encyType);\n        PlainLen += AppendWSCTLV(WSC_ID_SSID, &Plain[PlainLen], pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n    \tPlainLen += AppendWSCTLV(WSC_ID_MAC_ADDR, &Plain[PlainLen], pCredential->MacAddr, 0);\n    \tPlainLen += AppendWSCTLV(WSC_ID_AUTH_TYPE, &Plain[PlainLen], (UINT8 *)&authType, 0);\n    \tPlainLen += AppendWSCTLV(WSC_ID_ENCR_TYPE, &Plain[PlainLen], (UINT8 *)&encyType, 0);\n    \tPlainLen += AppendWSCTLV(WSC_ID_NW_KEY_INDEX, &Plain[PlainLen], &pCredential->KeyIndex, 0);\n    \tPlainLen += AppendWSCTLV(WSC_ID_NW_KEY, &Plain[PlainLen], pCredential->Key, pCredential->KeyLength);\n    }\n\n\t/* Generate HMAC */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, &Plain[0], PlainLen, TB, SHA256_DIGEST_SIZE);\n\tPlainLen += AppendWSCTLV(WSC_ID_KEY_WRAP_AUTH, &Plain[PlainLen], TB, 0);\n\n\t/* 4b. Encrypted Settings */\n\t/* Encrypt data */\n    EncrLen = IV_ENCR_DATA_LEN_512 - 16;\n    AES_CBC_Encrypt(Plain, PlainLen,pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),&IV_EncrData[0], 16, (UINT8 *) &IV_EncrData[16], (UINT *) &EncrLen);\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_SETTINGS, pData, IV_EncrData, 16 + EncrLen);/*IVLen + EncrLen */\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/*\n\t\tGenerate authenticator\n\t\tCombine last TX & RX message contents and validate the HMAC\n\t*/\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, TB, SHA256_DIGEST_SIZE);\n    }\n\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Copy the content to Regdata for lasttx information */\n\tpReg->LastTx.Length = Len;\n\tNdisMoveMemory(pReg->LastTx.Data, pbuf, Len);\n\t\n\tif(NULL != IV_EncrData)\n/*\t\tkfree(IV_EncrData); */\n\t\tos_free_mem(NULL, IV_EncrData);\n\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM7 : \\n\"));\n\treturn Len;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tBuild WSC M8 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after M7\n\t\t1. Change the correct parameters\n\t\t2. Build M8\n\t\t\n\t========================================================================\n*/\nint BuildMessageM8(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n/*\tUCHAR\t\t\t\tTB[256]; */\n\tUCHAR\t\t\t\t*TB = NULL;\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf, pAuth;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tKDK[32];\n\tUCHAR\t\t\t\t/* Plain[300], */ *IV_EncrData=NULL;/*IV len 16 ,EncrData len */\n\tUCHAR\t\t\t\t*Plain = NULL;\n\tINT\t\t\t\t\tCerLen = 0, PlainLen = 0, EncrLen;\n    PWSC_CREDENTIAL     pCredential = NULL;\n    USHORT              AuthType = 0;\n    USHORT              EncrType = 0;\n#ifdef CONFIG_AP_SUPPORT\n    UCHAR               apidx = (pWscControl->EntryIfIdx & 0x0F);\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n/*\tIV_EncrData = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_EncrData, IV_ENCR_DATA_LEN_512);\n\tif(NULL == IV_EncrData)\n\t\treturn 0;\n\n\tos_alloc_mem(NULL, (UCHAR **)&TB, 256);\n\tif (TB == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\tos_alloc_mem(NULL, (UCHAR **)&Plain, 300);\n\tif (Plain == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, M8 */\n\tTB[0] = WSC_ID_MESSAGE_M8;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef CONFIG_AP_SUPPORT\n\tif (CurOpMode == AP_MODE)\n\t{\n\t\tWscCreateProfileFromCfg(pAdapter, REGISTRAR_ACTION | AP_MODE, pWscControl, &pWscControl->WscProfile);\n\t\tpCredential = &pAdapter->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0];\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (CurOpMode == STA_MODE)\n\t {\n\t\tif (pAdapter->StaCfg.WscControl.WscProfile.ProfileCnt == 0 || \n\t\t\t(pAdapter->StaCfg.WscControl.bConfiguredAP \n#ifdef WSC_V2_SUPPORT\n\t\t\t/* \n\t\t\t\tCheck AP is v2 or v1, Check WscV2 Enabled or not\n\t\t\t*/\n\t\t\t&& !(pWscControl->WscV2Info.bForceSetAP \n\t\t\t\t&& pWscControl->WscV2Info.bEnableWpsV2 \n\t\t\t\t&& (pWscControl->RegData.PeerInfo.Version2!= 0))\n#endif /* WSC_V2_SUPPORT */\n\t\t\t ))\n\t\t\tWscCreateProfileFromCfg(pAdapter, STA_MODE, pWscControl, &pWscControl->WscProfile);\n\n\t\tpCredential = &pAdapter->StaCfg.WscControl.WscProfile.Profile[0];\n\t\tNdisMoveMemory(pCredential->MacAddr, pAdapter->MlmeAux.Bssid, 6);\n\t}\t\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* 4a. Encrypted R-S1 */\n\tCerLen += AppendWSCTLV(WSC_ID_NW_INDEX, &TB[0], (PUCHAR)\"1\", 0);\n\n\tif (pCredential == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pWscControl == NULL!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\n\tAuthType = pCredential->AuthType;\n\tEncrType = pCredential->EncrType;\n\t/*\n\t\tSome Win7 WSC 1.0 STA has problem to receive mixed authType and encyType.\n\t\tWe need to check STA is WSC 1.0 or WSC 2.0 here.\n\t\tIf STA is WSC 1.0, re-assign authType and encyType.\n\t*/\n\tif (pWscControl->RegData.PeerInfo.Version2 == 0)\n\t{\n\t\tif (AuthType == (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK))\n\t\t\tAuthType = WSC_AUTHTYPE_WPA2PSK;\n\t\tif (EncrType == (WSC_ENCRTYPE_TKIP | WSC_ENCRTYPE_AES))\n\t\t\tEncrType = WSC_ENCRTYPE_AES;\n\t}\n\n    AuthType = cpu2be16(AuthType);\n    EncrType = cpu2be16(EncrType);\n    CerLen += AppendWSCTLV(WSC_ID_SSID, &TB[CerLen], pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n\tCerLen += AppendWSCTLV(WSC_ID_AUTH_TYPE, &TB[CerLen], (UINT8 *)&AuthType, 0);\n\tCerLen += AppendWSCTLV(WSC_ID_ENCR_TYPE, &TB[CerLen], (UINT8 *)&EncrType, 0);\n\tCerLen += AppendWSCTLV(WSC_ID_NW_KEY_INDEX, &TB[CerLen], &pCredential->KeyIndex, 0);\n\tCerLen += AppendWSCTLV(WSC_ID_NW_KEY, &TB[CerLen], pCredential->Key, pCredential->KeyLength);\n\tCerLen += AppendWSCTLV(WSC_ID_MAC_ADDR, &TB[CerLen], pCredential->MacAddr, 0);\n\n\t/*    Prepare plain text */\n#ifdef CONFIG_STA_SUPPORT\n\tif ((CurOpMode == STA_MODE) && (pAdapter->StaCfg.BssType == BSS_INFRA))\n\t {\n\t\t/* If Enrollee is AP, CREDENTIAL isn't needed in M8. */\n\t\tPlainLen = CerLen;\n\t\tNdisMoveMemory(Plain, TB, CerLen);\n\t }\n\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t if ((CurOpMode == AP_MODE)\n#ifdef CONFIG_STA_SUPPORT\n\t \t || ((CurOpMode == STA_MODE) && (pAdapter->StaCfg.BssType == BSS_ADHOC))\n#endif /* CONFIG_STA_SUPPORT */\n\t \t)\n\t {\n#ifdef IWSC_SUPPORT\n\t\tUSHORT tmpVal = 0;\n\t\tUINT32 tmpUint32 = 0;\n#endif /* IWSC_SUPPORT */\n\t \t/* Reguired attribute item in M8 if Enrollee is STA. */\n\t\tPlainLen += AppendWSCTLV(WSC_ID_CREDENTIAL, &Plain[0], TB, CerLen);\n#ifdef IWSC_SUPPORT\n\t\t// TODO: Need to check the total length, we need to alarm if total length exceeds the size of Plain. snowpin 2011/05/16\n\n\t\tif (IWSC_IpContentForCredential(pAdapter))\n\t\t{\n\t\t\tPIWSC_INFO\tpIWscInfo = &pAdapter->StaCfg.IWscInfo;\n\t\t\tUINT32 *pIpv4SubMaskList = NULL;\n\t\t\tUSHORT Ipv4SubMaskListSize = 0;\n\n\t\t\tif (pIWscInfo->AvaSubMaskListCount != 0)\n\t\t\t{\n\t\t\t\tIpv4SubMaskListSize = sizeof(UINT32)*pIWscInfo->AvaSubMaskListCount;\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **) &pIpv4SubMaskList, Ipv4SubMaskListSize);\n\t\t\t\tif (pIWscInfo->AvaSubMaskListCount == 3)\n\t\t\t\t{\n\t\t\t\t\t*pIpv4SubMaskList = cpu2be32(pIWscInfo->AvaSubMaskList[0]);\n\t\t\t\t\t*(pIpv4SubMaskList+1) = cpu2be32(pIWscInfo->AvaSubMaskList[1]);\n\t\t\t\t\t*(pIpv4SubMaskList+2) = cpu2be32(pIWscInfo->AvaSubMaskList[2]);\n\t\t\t\t}\n\t\t\t\telse if (pIWscInfo->AvaSubMaskListCount == 2)\n\t\t\t\t{\n\t\t\t\t\t*pIpv4SubMaskList = cpu2be32(pIWscInfo->AvaSubMaskList[0]);\n\t\t\t\t\t*(pIpv4SubMaskList+1) = cpu2be32(pIWscInfo->AvaSubMaskList[1]);\n\t\t\t\t}\n\t\t\t\telse if (pIWscInfo->AvaSubMaskListCount == 1)\n\t\t\t\t\t*pIpv4SubMaskList = cpu2be32(pIWscInfo->AvaSubMaskList[0]);\n\t\t\t\tpIWscInfo->AvaSubMaskListCount--;\n\t\t\t}\n\t\t\t\n\t\t\ttmpVal = cpu2be16(pIWscInfo->IpMethod);\n\t\t\tPlainLen += AppendWSCTLV(WSC_ID_IP_ADDR_CONF_METHOD, \n\t\t\t\t\t\t\t\t\t&Plain[PlainLen], \n\t\t\t\t\t\t\t\t\t&tmpVal, 0);\n\n\t\t\tpCredential->RegIpv4Addr = pIWscInfo->SelfIpv4Addr;\n\t\t\ttmpUint32 = cpu2be32(pIWscInfo->SelfIpv4Addr);\n\t\t\tPlainLen += AppendWSCTLV(WSC_ID_REGISTRAR_IPV4, \n\t\t\t\t\t\t\t\t\t&Plain[PlainLen], \n\t\t\t\t\t\t\t\t\t(UCHAR *)&tmpUint32, 0);\n\n\t\t\ttmpUint32 = cpu2be32(pIWscInfo->Ipv4SubMask);\n\t\t\tPlainLen += AppendWSCTLV(WSC_ID_IPV4_SUBMASK, \n\t\t\t\t\t\t\t\t\t&Plain[PlainLen], \n\t\t\t\t\t\t\t\t\t(UCHAR *)&tmpUint32, 0);\n\n\t\t\tpCredential->EnrIpv4Addr = pIWscInfo->PeerIpv4Addr;\n\t\t\ttmpUint32 = cpu2be32(pIWscInfo->PeerIpv4Addr);\n\t\t\tPlainLen += AppendWSCTLV(WSC_ID_ENROLLEE_IPV4, \n\t\t\t\t\t\t\t\t\t&Plain[PlainLen], \n\t\t\t\t\t\t\t\t\t(UCHAR *)&tmpUint32, 0);\n\n\t\t\tif (pIpv4SubMaskList \n#ifdef IWSC_TEST_SUPPORT\n\t\t\t\t&& (pIWscInfo->bEmptySubmaskList == FALSE)\n#endif /* IWSC_TEST_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tPlainLen += AppendWSCTLV(WSC_ID_IPV4_SUBMASK_LIST, \n\t\t\t\t\t\t\t\t\t\t&Plain[PlainLen], \n\t\t\t\t\t\t\t\t\t\t(UCHAR *)pIpv4SubMaskList, Ipv4SubMaskListSize);\n\t\t\t}\n\t\t\t\n\t\t\tif (pIpv4SubMaskList)\n\t\t\t\tos_free_mem(NULL, pIpv4SubMaskList);\n\t\t}\n#endif // IWSC_SUPPORT //\n\t }\n\n\t/* Generate HMAC */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, &Plain[0], PlainLen, TB, SHA256_DIGEST_SIZE);\n\tPlainLen += AppendWSCTLV(WSC_ID_KEY_WRAP_AUTH, &Plain[PlainLen], TB, 0);\n\n\t/* 4b. Encrypted Settings */\n\t/* Encrypt data */\n    EncrLen = IV_ENCR_DATA_LEN_512 - 16;    \n    AES_CBC_Encrypt(Plain, PlainLen,pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),&IV_EncrData[0], 16, (UINT8 *) &IV_EncrData[16], (UINT *) &EncrLen);\n\ttemplen = AppendWSCTLV(WSC_ID_ENCR_SETTINGS, pData, IV_EncrData, 16 + EncrLen);/*IVLen + EncrLen */\n\tpData += templen;\n\tLen   += templen;\n\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n\t/*\n\t\tCombine last TX & RX message contents and validate the HMAC\n\t\tWe have to exclude last 12 bytes from last receive since it's authenticator value\n\t*/\n\tHmacLen = Len + pReg->LastRx.Length;\n    if (pAdapter->pHmacData)\n    {\n    \tpAuth = (PUCHAR) pAdapter->pHmacData;\n\tNdisMoveMemory(pAuth, pReg->LastRx.Data, pReg->LastRx.Length);\n\tpAuth += pReg->LastRx.Length;\n\tNdisMoveMemory(pAuth, pbuf, Len);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\n\ttemplen = AppendWSCTLV(WSC_ID_AUTHENTICATOR, pData, KDK, 0);\n\tpData += templen;\n\tLen   += templen;\n\nLabelErr:\n\tif(NULL != IV_EncrData)\n/*\t\tkfree(IV_EncrData); */\n\t\tos_free_mem(NULL, IV_EncrData);\n\n    pWscControl->WscRetryCount = 0;\n\n\tif (TB != NULL)\n\t\tos_free_mem(NULL, TB);\n\tif (Plain != NULL)\n\t\tos_free_mem(NULL, Plain);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageM8 : \\n\"));\n\treturn Len;\n}\n\nint BuildMessageDONE(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[1];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, WSC DONE */\n\tTB[0] = WSC_MSG_WSC_DONE;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageDONE : \\n\"));\n\treturn Len;\n}\n\nint BuildMessageACK(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[1];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, WSC ACK */\n\tTB[0] = WSC_MSG_WSC_ACK;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageACK : \\n\"));\n\treturn Len;\n}\n\nint BuildMessageNACK(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf)\n{\n\tUCHAR\t\t\t\tTB[2];\n\tINT\t\t\t\t\tLen = 0, templen = 0;\n\tPUCHAR\t\t\t\tpData = (PUCHAR)pbuf;\n\tPWSC_REG_DATA\t\tpReg = (PWSC_REG_DATA) &pWscControl->RegData;\n    USHORT              ConfigError = htons(pReg->SelfInfo.ConfigError);\n#ifdef WSC_V2_SUPPORT\n\tPWSC_TLV\t\t\tpWscTLV = &pWscControl->WscV2Info.ExtraTlv;\n#endif /* WSC_V2_SUPPORT */\n\n\t/* 1. Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 2. Message Type, WSC NACK */\n\tTB[0] = WSC_ID_MESSAGE_NACK;\n\ttemplen = AppendWSCTLV(WSC_ID_MSG_TYPE, pData, TB, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 3. Enrollee Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_ENROLLEE_NONCE, pData, pReg->EnrolleeNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 4. Registrar Nonce, 16 bytes */\n\ttemplen = AppendWSCTLV(WSC_ID_REGISTRAR_NONCE, pData, pReg->RegistrarNonce, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* 5. Error */\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_ERROR, pData, (UINT8 *)&ConfigError, 0);\n\tpData += templen;\n\tLen   += templen;\n\n#ifdef WSC_V2_SUPPORT\n\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t{\n\t\t/* Version2 */\n\t\tWscGenV2Msg(pWscControl, \n\t\t\t\t\tFALSE, \n\t\t\t\t\tNULL, \n\t\t\t\t\t0, \n\t\t\t\t\t&pData, \n\t\t\t\t\t&Len);\n\t\t\n\t\t/* Extra attribute that is not defined in WSC Sepc. */\n\t\tif (pWscTLV->pTlvData && pWscTLV->TlvLen)\n\t\t{\n\t\t\ttemplen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen);\n\t\t\tpData += templen;\n\t\t\tLen   += templen;\n\t\t}\n\t}\n#endif /* WSC_V2_SUPPORT */\n\n    pWscControl->WscRetryCount = 0;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildMessageNACK : \\n\"));\n\treturn Len;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M1 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M1\n\t\t1. Change the correct parameters\n\t\t2. Process M1\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM1(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR, DH_Len = 0, idx;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUSHORT\t\t\t\tWscType, WscLen, FieldCheck[7]={0,0,0,0,0,0,0};\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n#ifdef CONFIG_AP_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpReg->PeerInfo.Version2 = 0;\n\n    DH_Len = sizeof(pReg->Pkr);\n\t/* Enrollee 192 random bytes for DH key generation */\n\tfor (idx = 0; idx < 192; idx++)\n\t\tpWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAdapter);\n\n\tRT_DH_PublicKey_Generate (\n        WPS_DH_G_VALUE, sizeof(WPS_DH_G_VALUE),\n\t    WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE),\n\t    pWscControl->RegData.EnrolleeRandom, sizeof(pWscControl->RegData.EnrolleeRandom),\n\t    pReg->Pkr, (UINT *) &DH_Len);\n\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_UUID_E))] |= (1 << WSC_TLV_BYTE1(WSC_ID_UUID_E));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MAC_ADDR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MAC_ADDR));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PUBLIC_KEY))] |= (1 << WSC_TLV_BYTE1(WSC_ID_PUBLIC_KEY));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTH_TYPE_FLAGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTH_TYPE_FLAGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_TYPE_FLAGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_TYPE_FLAGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONN_TYPE_FLAGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_CONN_TYPE_FLAGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_METHODS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_METHODS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_SC_STATE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_SC_STATE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MANUFACTURER))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MANUFACTURER));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NAME))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NAME));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NUMBER))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NUMBER));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_SERIAL_NUM))] |= (1 << WSC_TLV_BYTE1(WSC_ID_SERIAL_NUM));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PRIM_DEV_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_PRIM_DEV_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_NAME))] |= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_NAME));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_RF_BAND))] |= (1 << WSC_TLV_BYTE1(WSC_ID_RF_BAND));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ASSOC_STATE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ASSOC_STATE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_ERROR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_ERROR));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_PWD_ID))] |= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_PWD_ID));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_OS_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_OS_VERSION));\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\t\t\n\tNdisZeroMemory(&pWscControl->WscPeerInfo, sizeof(WSC_PEER_DEV_INFO));\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M1 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M1 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_UUID_E:\n\t\t\t\tNdisMoveMemory(pReg->PeerInfo.Uuid, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_UUID_E))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_UUID_E));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MAC_ADDR:\n\t\t\t\tNdisMoveMemory(pReg->PeerInfo.MacAddr, pData, WscLen);\n\t\t\t\tNdisMoveMemory(pWscControl->WscPeerInfo.WscPeerMAC, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MAC_ADDR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MAC_ADDR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENROLLEE_NONCE:\n\t\t\t\tNdisMoveMemory(pReg->EnrolleeNonce, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_PUBLIC_KEY:\n\t\t\t\t/* Get Enrollee Public Key */\n\t\t\t\tNdisMoveMemory(pReg->Pke, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PUBLIC_KEY))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_PUBLIC_KEY));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTH_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.AuthTypeFlags = *((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTH_TYPE_FLAGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTH_TYPE_FLAGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.EncrTypeFlags = *((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_TYPE_FLAGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_TYPE_FLAGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONN_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.ConnTypeFlags = *pData;\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONN_TYPE_FLAGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_CONN_TYPE_FLAGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONFIG_METHODS:\n\t\t\t\tpReg->PeerInfo.ConfigMethods = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_METHODS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_METHODS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_SC_STATE:\n\t\t\t\tpReg->PeerInfo.ScState = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (CurOpMode == STA_MODE)\n\t\t\t\t{\n\t\t\t\t\t/* Don't overwrite the credential of M7 received from AP when this flag is TRUE in registrar mode! */\n\t\t\t\t\tpWscControl->bConfiguredAP = (pReg->PeerInfo.ScState == WSC_SCSTATE_CONFIGURED) ? TRUE:FALSE;\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_SC_STATE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_SC_STATE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MANUFACTURER:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.Manufacturer, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerManufacturer, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MANUFACTURER))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MANUFACTURER));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MODEL_NAME:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.ModelName, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerModelName, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NAME))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NAME));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MODEL_NUMBER:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.ModelNumber, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerModelNumber, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NUMBER))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NUMBER));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_SERIAL_NUM:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.SerialNumber, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerSerialNumber, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_SERIAL_NUM))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_SERIAL_NUM));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_PRIM_DEV_TYPE:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.PriDeviceType, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PRIM_DEV_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_PRIM_DEV_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_DEVICE_NAME:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.DeviceName, pData, WscLen);\n\t\t\t\tNdisMoveMemory(pWscControl->WscPeerInfo.WscPeerDeviceName, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_NAME))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_NAME));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_RF_BAND:\n\t\t\t\tpReg->PeerInfo.RfBand = *pData;\n\t\t\t\t/*if() ret = WSC_ERROR_CHAN24_NOT_SUPP; */\n\t\t\t\t/*if() ret = WSC_ERROR_CHAN50_NOT_SUPP; */\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_RF_BAND))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_RF_BAND));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ASSOC_STATE:\n\t\t\t\tpReg->PeerInfo.AssocState = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ASSOC_STATE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ASSOC_STATE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONFIG_ERROR:\n\t\t\t\tpReg->PeerInfo.ConfigError = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_ERROR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_ERROR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_DEVICE_PWD_ID:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"   WPS Registrar DPID %04x\\n\",pReg->SelfInfo.DevPwdId));\n\t\t\t\tif(WSC_DEVICEPWDID_DEFAULT == get_unaligned((PUSHORT) pData))/**(PUSHORT) pData) */\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx WPS           DPID PIN\\n\"));\n\t\t\t\t\tpWscControl->RegData.SelfInfo.DevPwdId = cpu2be16(DEV_PASS_ID_PIN);\n\t\t\t\t}\n\t\t\t\telse if(WSC_DEVICEPWDID_PUSH_BTN == get_unaligned((PUSHORT) pData))/**(PUSHORT) pData) */\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx WPS           DPID PBC\\n\"));\n\t\t\t\t\tpWscControl->RegData.SelfInfo.DevPwdId = cpu2be16(DEV_PASS_ID_PBC);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx WPS           DPID unsupport\\n\"));\n\t\t\t\t}\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_PWD_ID))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_PWD_ID));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_OS_VERSION:\n\t\t\t\tpReg->PeerInfo.OsVersion = get_unalignedlong((PULONG) pData);/**((PULONG) pData); */\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_OS_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_OS_VERSION));\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_VENDOR_EXT:\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t\t\t\t{\n\t\t\t\t\tUCHAR tmp_data_len = 0;\n\t\t\t\t\tWscParseV2SubItem(WFA_EXT_ID_VERSION2, pData, WscLen, &pReg->PeerInfo.Version2, &tmp_data_len);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM1 --> Version2 = %x\\n\", pReg->PeerInfo.Version2));\n\t\t\t\t}\n#endif // WSC_V2_SUPPORT //\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM1 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\t\t\t\t\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\t\t\t\t\t\n\n\tif( FieldCheck[0] || FieldCheck[1] || FieldCheck[2] || FieldCheck[3] || FieldCheck[4] || FieldCheck[5] || FieldCheck[6] )\n\t\tret = WSC_ERROR_WANTING_FIELD;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM1 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M2 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M2\n\t\t1. Change the correct parameters\n\t\t2. Process M2\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM2(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN  PWSC_CTRL\t\tpWscControl,\n\tIN\tVOID \t\t\t*precv,\n\tIN\tINT \t\t\tLength,\n\tIN  UCHAR\t\t\tapidx,\n\tOUT\tPWSC_REG_DATA \tpReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32];\n\tUCHAR\t\t\t\tDHKey[32], KdkInput[38], KdfKey[80];\n\tINT\t\t\t\t\tDH_Len;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUSHORT\t\t\t\tWscType, WscLen, FieldCheck[7]={0,0,0,0,0,0,0};\n\tMAC_TABLE_ENTRY\t\t*pEntry = NULL;\n\tUCHAR\t\t\t\tCurOpMode = 0xFF;\n\n#ifdef CONFIG_AP_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t\tCurOpMode = AP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n    IF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tCurOpMode = STA_MODE;\n#ifdef P2P_SUPPORT\n\tif (pWscControl->EntryIfIdx != BSS0)\n\t\tCurOpMode = AP_MODE;\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\n\tpReg->PeerInfo.Version2 = 0;\n\t\n\tRTMPZeroMemory(KDK, 32);\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_REGISTRAR_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_REGISTRAR_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_UUID_R))] |= (1 << WSC_TLV_BYTE1(WSC_ID_UUID_R));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PUBLIC_KEY))] |= (1 << WSC_TLV_BYTE1(WSC_ID_PUBLIC_KEY));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTH_TYPE_FLAGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTH_TYPE_FLAGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_TYPE_FLAGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_TYPE_FLAGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONN_TYPE_FLAGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_CONN_TYPE_FLAGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_METHODS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_METHODS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MANUFACTURER))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MANUFACTURER));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NAME))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NAME));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NUMBER))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NUMBER));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_SERIAL_NUM))] |= (1 << WSC_TLV_BYTE1(WSC_ID_SERIAL_NUM));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PRIM_DEV_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_PRIM_DEV_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_NAME))] |= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_NAME));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_RF_BAND))] |= (1 << WSC_TLV_BYTE1(WSC_ID_RF_BAND));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ASSOC_STATE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ASSOC_STATE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_ERROR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_ERROR));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_PWD_ID))] |= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_PWD_ID));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_OS_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_OS_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\t\n\t\tpEntry = MacTableLookup(pAdapter, pReg->PeerInfo.MacAddr);\n\n\tNdisZeroMemory(&pWscControl->WscPeerInfo, sizeof(WSC_PEER_DEV_INFO));\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M2 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENROLLEE_NONCE:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->SelfNonce, pData, WscLen) != 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M2 Compare enrollee nonce mismatched \\n\"));\n\t\t\t\t}\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_REGISTRAR_NONCE:\n\t\t\t\tNdisMoveMemory(pReg->RegistrarNonce, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_REGISTRAR_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_REGISTRAR_NONCE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_UUID_R:\n\t\t\t\tNdisMoveMemory(pReg->PeerInfo.Uuid, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_UUID_R))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_UUID_R));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_PUBLIC_KEY:\n\t\t\t\t/* Get Registrar Public Key */\n\t\t\t\tNdisMoveMemory(&pReg->Pkr, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PUBLIC_KEY))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_PUBLIC_KEY));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTH_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.AuthTypeFlags = get_unaligned((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTH_TYPE_FLAGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTH_TYPE_FLAGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.EncrTypeFlags = get_unaligned((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_TYPE_FLAGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_TYPE_FLAGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONN_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.ConnTypeFlags = *pData;\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONN_TYPE_FLAGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_CONN_TYPE_FLAGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONFIG_METHODS:\n\t\t\t\tpReg->PeerInfo.ConfigMethods = get_unaligned((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_METHODS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_METHODS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MANUFACTURER:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.Manufacturer, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerManufacturer, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MANUFACTURER))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MANUFACTURER));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MODEL_NAME:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.ModelName, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerModelName, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NAME))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NAME));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MODEL_NUMBER:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.ModelNumber, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerModelNumber, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MODEL_NUMBER))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MODEL_NUMBER));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_SERIAL_NUM:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.SerialNumber, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerSerialNumber, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_SERIAL_NUM))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_SERIAL_NUM));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_PRIM_DEV_TYPE:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.PriDeviceType, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_PRIM_DEV_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_PRIM_DEV_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_DEVICE_NAME:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.DeviceName, pData, WscLen);\n\t\t\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerDeviceName, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_NAME))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_NAME));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_RF_BAND:\n\t\t\t\tpReg->PeerInfo.RfBand = *pData;\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_RF_BAND))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_RF_BAND));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ASSOC_STATE:\n\t\t\t\tpReg->PeerInfo.AssocState = get_unaligned((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ASSOC_STATE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ASSOC_STATE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONFIG_ERROR:\n\t\t\t\tpReg->PeerInfo.ConfigError = get_unaligned((PUSHORT) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_CONFIG_ERROR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_CONFIG_ERROR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_DEVICE_PWD_ID:\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_DEVICE_PWD_ID))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_DEVICE_PWD_ID));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_OS_VERSION:\n\t\t\t\tpReg->PeerInfo.OsVersion = get_unalignedlong((PULONG) pData);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_OS_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_OS_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_VENDOR_EXT:\n#ifdef WSC_V2_SUPPORT\n\t\t\t\tif (pWscControl->WscV2Info.bEnableWpsV2)\n\t\t\t\t{\n\t\t\t\t\tUCHAR tmp_data_len = 0;\n\t\t\t\t\tWscParseV2SubItem(WFA_EXT_ID_VERSION2, pData, WscLen, &pReg->PeerInfo.Version2, &tmp_data_len);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM2 --> Version2 = %x\\n\", pReg->PeerInfo.Version2));\n\t\t\t\t}\n#endif // WSC_V2_SUPPORT //\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM2 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\t\t\t\t\n\t\t}\n\n\t\tNdisMoveMemory(&pWscControl->WscPeerInfo.WscPeerMAC, &pWscControl->RegData.PeerInfo.MacAddr, 6);\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\t\t\t\t\t\n\n\n    DH_Len = sizeof(pReg->SecretKey);\n   \tRT_DH_SecretKey_Generate (\n   \t    pReg->Pkr, sizeof(pReg->Pkr),\n   \t    WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE),\n   \t    pReg->EnrolleeRandom,  sizeof(pReg->EnrolleeRandom),\n   \t    pReg->SecretKey, (UINT *) &DH_Len);\n\n\t/* Compute the DHKey based on the DH secret */\n\tRT_SHA256(&pReg->SecretKey[0], 192, &DHKey[0]);\n\n\t/* Create KDK input data */\n\tNdisMoveMemory(&KdkInput[0], pReg->SelfNonce, 16);\n\t\t\n\tNdisMoveMemory(&KdkInput[16], pReg->SelfInfo.MacAddr, 6);\n\t\t\n\tNdisMoveMemory(&KdkInput[22], pReg->RegistrarNonce, 16);\n\t\n\t/* Generate the KDK */\n\tRT_HMAC_SHA256(DHKey, 32,  KdkInput, 38, KDK, SHA256_DIGEST_SIZE);\t\t\t\t\n\t\n\t/* KDF */\n\tWscDeriveKey(KDK, 32, Wsc_Personal_String, (sizeof(Wsc_Personal_String) - 1), KdfKey, 640);\n\n\t/* Assign Key from KDF */\n\tNdisMoveMemory(pReg->AuthKey, &KdfKey[0], 32);\n\tNdisMoveMemory(pReg->KeyWrapKey, &KdfKey[32], 16);\n\tNdisMoveMemory(pReg->Emsk, &KdfKey[48], 32);\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData + pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\t\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM2 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\n\tif( FieldCheck[0] || FieldCheck[1] || FieldCheck[2] || FieldCheck[3] || FieldCheck[4] || FieldCheck[5] || FieldCheck[6] )\n\t\tret = WSC_ERROR_WANTING_FIELD;\n\t\n/* out : */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM2 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M2D Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- rewrite buffer\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M2D\n\t\t1. Change the correct parameters\n\t\t2. Process M2D\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM2D(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUSHORT\t\t\t\tWscType, WscLen;\n\t\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M2D != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENROLLEE_NONCE:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->EnrolleeNonce, pData, WscLen) != 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M2 Compare enrollee nonce mismatched \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_REGISTRAR_NONCE:\n\t\t\t\tNdisMoveMemory(pReg->RegistrarNonce, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_UUID_R:\n\t\t\t\tNdisMoveMemory(pReg->PeerInfo.Uuid, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_PUBLIC_KEY:\n\t\t\t\t/* There shall be no Public transmitted in M2D */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM2D --> Receive WSC_ID_PUBLIC_KEY!! werid!\\n\"));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTH_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.AuthTypeFlags = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.EncrTypeFlags = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONN_TYPE_FLAGS:\n\t\t\t\tpReg->PeerInfo.ConnTypeFlags = *pData;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONFIG_METHODS:\n\t\t\t\tpReg->PeerInfo.ConfigMethods = be2cpu16(get_unaligned((PUSHORT) pData));/*be2cpu16(*((PUSHORT) pData)); */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MANUFACTURER:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.Manufacturer, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MODEL_NAME:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.ModelName, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MODEL_NUMBER:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.ModelNumber, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_SERIAL_NUM:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.SerialNumber, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_PRIM_DEV_TYPE:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.PriDeviceType, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_DEVICE_NAME:\n\t\t\t\tNdisMoveMemory(&pReg->PeerInfo.DeviceName, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_RF_BAND:\n\t\t\t\tpReg->PeerInfo.RfBand = *pData;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ASSOC_STATE:\n\t\t\t\tpReg->PeerInfo.AssocState = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_CONFIG_ERROR:\n\t\t\t\tpReg->PeerInfo.ConfigError = get_unaligned((PUSHORT) pData);/**((PUSHORT) pData); */\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_DEVICE_PWD_ID:\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_OS_VERSION:\n\t\t\t\tpReg->PeerInfo.OsVersion = get_unalignedlong((PULONG)pData);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\t/* No authenticator in M2D */\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM2D --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\t\t\t\t\t\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM2D : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M3 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M3\n\t\t1. Change the correct parameters\n\t\t2. Process M3\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM3(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32];\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUSHORT\t\t\t\tWscType, WscLen, FieldCheck[7]={0,0,0,0,0,0,0};\n\t\n\tRTMPZeroMemory(KDK, 32);\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_REGISTRAR_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_REGISTRAR_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_E_HASH1))] |= (1 << WSC_TLV_BYTE1(WSC_ID_E_HASH1));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_E_HASH2))] |= (1 << WSC_TLV_BYTE1(WSC_ID_E_HASH2));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M3 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M3 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_REGISTRAR_NONCE:\n\t\t\t\t/* for verification with our Registrar nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->RegistrarNonce, pData, WscLen) != 0)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M3 Compare Registrar nonce mismatched \\n\"));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_REGISTRAR_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_REGISTRAR_NONCE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_E_HASH1:\n\t\t\t\tNdisMoveMemory(&pReg->EHash1[0], pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_E_HASH1))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_E_HASH1));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_E_HASH2:\n\t\t\t\tNdisMoveMemory(&pReg->EHash2[0], pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_E_HASH2))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_E_HASH2));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM3 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\t\t\t\t\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData + pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\t\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM3 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\n\tif( FieldCheck[0] || FieldCheck[1] || FieldCheck[2] || FieldCheck[3] || FieldCheck[4] || FieldCheck[5] || FieldCheck[6] )\n\t\tret = WSC_ERROR_WANTING_FIELD;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM3 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M4 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M4\n\t\t1. Change the correct parameters\n\t\t2. Process M4\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM4(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32], RHash[32];\n\tINT\t\t\t\t\tEncrLen;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUCHAR\t\t\t\t*IV_DecrData=NULL;/*IV len 16 ,DecrData len */\n\tUCHAR\t\t\t\t*pHash=NULL;/*Reuse IV_DecrData memory */\n\tUSHORT\t\t\t\tWscType, WscLen, FieldCheck[7]={0,0,0,0,0,0,0};\n\t\n\tRTMPZeroMemory(KDK, 32);\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_R_HASH1))] |= (1 << WSC_TLV_BYTE1(WSC_ID_R_HASH1));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_R_HASH2))] |= (1 << WSC_TLV_BYTE1(WSC_ID_R_HASH2));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_SETTINGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_SETTINGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\n/*\tIV_DecrData = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_DecrData, 512);\n\tif(NULL == IV_DecrData)\n\t{\n\t\tret = WSC_ERROR_CAN_NOT_ALLOCMEM;\n\t\treturn ret;\n\t}\n\tpHash = IV_DecrData;\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\t\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M4 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENROLLEE_NONCE:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->EnrolleeNonce, pData, WscLen) != 0)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M4 Compare enrollee nonce mismatched \\n\"));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_R_HASH1:\n\t\t\t\tNdisMoveMemory(&pReg->RHash1, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_R_HASH1))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_R_HASH1));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_R_HASH2:\n\t\t\t\tNdisMoveMemory(&pReg->RHash2, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_R_HASH2))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_R_HASH2));\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_ENCR_SETTINGS:\n\t\t\t\t/* There shall have smoe kind of length check */\n\t\t\t\tif (WscLen <= 16)\n\t\t\t\t\tbreak;\n\t\t\t\tif (WscLen > 512)\n\t\t\t\t{\n\t\t\t\t\t/* ApEncrSetting is not enough */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApEncrSettings array size is not enough, require %d\\n\", WscLen));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(IV_DecrData, pData, WscLen);\n                EncrLen = sizeof(pReg->ApEncrSettings);\n                AES_CBC_Decrypt(IV_DecrData + 16, (WscLen - 16),pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),IV_DecrData, 16, (UINT8 *) pReg->ApEncrSettings, (UINT *) &EncrLen);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"M4 ApEncrSettings len = %d\\n \", EncrLen));\n\n\t\t\t\t/* Parse encryption settings */\n\t\t\t\tWscParseEncrSettings(pAdapter, pReg->ApEncrSettings, EncrLen, pWscControl);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_SETTINGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_SETTINGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM4 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\n\t/* Verify R-Hash1 */\n\t/* Create input for R-Hash1 */\n\tNdisMoveMemory(pHash, pReg->Rs1, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk1, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate R-Hash1 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, RHash, SHA256_DIGEST_SIZE);\n\t\n\tif (RTMPCompareMemory(pReg->RHash1, RHash, 32) != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM4 --> RHash1 not matched\\n\"));\n\t\tret = WSC_ERROR_DEV_PWD_AUTH_FAIL;\n\t\tgoto out;\n\t}\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData + pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\t\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM4 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\t\n\tif( FieldCheck[0] || FieldCheck[1] || FieldCheck[2] || FieldCheck[3] || FieldCheck[4] || FieldCheck[5] || FieldCheck[6] )\n\t\tret = WSC_ERROR_WANTING_FIELD;\nout :\n\tif(NULL != IV_DecrData)\n/*\t\tkfree(IV_DecrData); */\n\t\tos_free_mem(NULL, IV_DecrData);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM4 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M5 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M5\n\t\t1. Change the correct parameters\n\t\t2. Process M5\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM5(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32], EHash[32];\n\tINT\t\t\t\t\tEncrLen;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUCHAR\t\t\t\t*IV_DecrData=NULL;/*IV len 16 ,DecrData len */\n\tUCHAR\t\t\t\t*pHash=NULL;/*Reuse IV_DecrData memory */\n\tUSHORT\t\t\t\tWscType, WscLen, FieldCheck[7]={0,0,0,0,0,0,0};\n\t\n\tRTMPZeroMemory(KDK, 32);\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_REGISTRAR_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_REGISTRAR_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_SETTINGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_SETTINGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\n/*\tIV_DecrData = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_DecrData, 512);\n\tif(NULL == IV_DecrData)\n\t{\n\t\tret = WSC_ERROR_CAN_NOT_ALLOCMEM;\n\t\treturn ret;\n\t}\n\tpHash = IV_DecrData;\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M5 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_REGISTRAR_NONCE:\n\t\t\t\t/* for verification with our Registrar nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->RegistrarNonce, pData, WscLen) != 0)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M5 Compare Registrar nonce mismatched \\n\"));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_REGISTRAR_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_REGISTRAR_NONCE));\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_ENCR_SETTINGS:\n\t\t\t\t/* There shall have smoe kind of length check */\n\t\t\t\tif (WscLen <= 16)\n\t\t\t\t\tbreak;\n\t\t\t\tif (WscLen > 512)\n\t\t\t\t{\n\t\t\t\t\t/* ApEncrSetting is not enough */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApEncrSettings array size is not enough, require %d\\n\", WscLen));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(IV_DecrData, pData, WscLen);\n                EncrLen = sizeof(pReg->ApEncrSettings);\n                AES_CBC_Decrypt(IV_DecrData + 16, (WscLen - 16),pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),IV_DecrData, 16, (UINT8 *) pReg->ApEncrSettings, (UINT *) &EncrLen);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"M5 ApEncrSettings len = %d\\n \", EncrLen));\n\n\t\t\t\t/* Parse encryption settings */\n\t\t\t\tWscParseEncrSettings(pAdapter, pReg->ApEncrSettings, EncrLen, pWscControl);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_SETTINGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_SETTINGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM4 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData + pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n    }\n\n\t/* Verify E-Hash1 */\n\t/* Create input for E-Hash1 */\n\tNdisMoveMemory(pHash, pReg->Es1, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk1, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate E-Hash1 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, EHash, SHA256_DIGEST_SIZE);\n\t\n\tif (RTMPCompareMemory(pReg->EHash1, EHash, 32) != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM5 --> EHash1 not matched\\n\"));\n\t\tpReg->SelfInfo.ConfigError = WSC_ERROR_HASH_FAIL;\n\t\tret = WSC_ERROR_HASH_FAIL;\n\t\tgoto out;\n\t}\n\t\n    if (pAdapter->pHmacData)\n\t/* Validate HMAC, reuse KDK buffer */\n\t    RT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n\t\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM5 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\tif( FieldCheck[0] || FieldCheck[1] || FieldCheck[2] || FieldCheck[3] || FieldCheck[4] || FieldCheck[5] || FieldCheck[6] )\n\t\tret = WSC_ERROR_WANTING_FIELD;\nout :\n\tif(NULL != IV_DecrData)\n/*\t\tkfree(IV_DecrData); */\n\t\tos_free_mem(NULL, IV_DecrData);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM5 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M6 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M6\n\t\t1. Change the correct parameters\n\t\t2. Process M6\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM6(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32], RHash[32];\n\tINT\t\t\t\t\tEncrLen;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUCHAR\t\t\t\t*IV_DecrData=NULL;/*IV len 16 ,DecrData len */\n\tUCHAR\t\t\t\t*pHash=NULL;/*Reuse IV_DecrData memory */\n\tUSHORT\t\t\t\tWscType, WscLen, FieldCheck[7]={0,0,0,0,0,0,0};\n\t\n\tRTMPZeroMemory(KDK, 32);\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] |= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_SETTINGS))] |= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_SETTINGS));\n\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] |= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\n/*\tIV_DecrData = kmalloc(512, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_DecrData, 512);\n\tif(NULL == IV_DecrData)\n\t{\n\t\tret = WSC_ERROR_CAN_NOT_ALLOCMEM;\n\t\treturn ret;\n\t}\n\tpHash = IV_DecrData;\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = cpu2be16(TLV_Recv.Type);\n\t\tWscLen  = cpu2be16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_VERSION))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_VERSION));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M6 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_MSG_TYPE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_MSG_TYPE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENROLLEE_NONCE:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->EnrolleeNonce, pData, WscLen) != 0)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M6 Compare enrollee nonce mismatched \\n\"));\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENROLLEE_NONCE))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENROLLEE_NONCE));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_SETTINGS:\n\t\t\t\t/* There shall have smoe kind of length check */\n\t\t\t\tif (WscLen <= 16)\n\t\t\t\t\tbreak;\n\t\t\t\tif (WscLen > 512)\n\t\t\t\t{\n\t\t\t\t\t/* ApEncrSetting is not enough */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApEncrSettings array size is not enough, require %d\\n\", WscLen));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(IV_DecrData, pData, WscLen);\n                EncrLen = sizeof(pReg->ApEncrSettings);\n                AES_CBC_Decrypt(IV_DecrData + 16, (WscLen - 16),pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),IV_DecrData, 16, (UINT8 *) pReg->ApEncrSettings, (UINT *) &EncrLen); \n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"M6 ApEncrSettings len = %d\\n \", EncrLen));\n\n\t\t\t\t/* Parse encryption settings */\n\t\t\t\tWscParseEncrSettings(pAdapter, pReg->ApEncrSettings, EncrLen, pWscControl);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_ENCR_SETTINGS))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_ENCR_SETTINGS));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tFieldCheck[(WSC_TLV_BYTE2(WSC_ID_AUTHENTICATOR))] ^= (1 << WSC_TLV_BYTE1(WSC_ID_AUTHENTICATOR));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM6 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\n\t/* Verify R-Hash2 */\n\t/* Create input for R-Hash1 */\n\tNdisMoveMemory(pHash, pReg->Rs2, 16);\n\tNdisMoveMemory(pHash + 16, pReg->Psk2, 16);\n\tNdisMoveMemory(pHash + 32, pReg->Pke, 192);\n\tNdisMoveMemory(pHash + 224, pReg->Pkr, 192);\n\t\n\t/* Generate R-Hash2 */\n\tRT_HMAC_SHA256(pReg->AuthKey, 32, pHash, 416, RHash, SHA256_DIGEST_SIZE);\n\t\n\tif (RTMPCompareMemory(pReg->RHash2, RHash, 32) != 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM6 --> RHash2 not matched\\n\"));\n        ret = WSC_ERROR_DEV_PWD_AUTH_FAIL;\t\t\n        goto out;\n\t}\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData+ pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\t\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM6 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\t\n\tif( FieldCheck[0] || FieldCheck[1] || FieldCheck[2] || FieldCheck[3] || FieldCheck[4] || FieldCheck[5] || FieldCheck[6] )\n\t\tret = WSC_ERROR_WANTING_FIELD;\nout:\n\tif(NULL != IV_DecrData)\n/*\t\tkfree(IV_DecrData); */\n\t\tos_free_mem(NULL, IV_DecrData);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM6 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M7 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M7\n\t\t1. Change the correct parameters\n\t\t2. Process M7\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM7(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32];\n\tINT\t\t\t\t\tEncrLen;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUSHORT\t\t\t\tWscType, WscLen;\n\tUCHAR\t\t\t\t*IV_DecrData=NULL;/*IV len 16 ,DecrData len */\n\n\tRTMPZeroMemory(KDK, 32);\n/*\tIV_DecrData = kmalloc(1024, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_DecrData, 1024);\n\tif(NULL == IV_DecrData)\n\t{\n\t\tret = WSC_ERROR_CAN_NOT_ALLOCMEM;\n\t\treturn ret;\n\t}\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M2 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M7 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_REGISTRAR_NONCE:\n\t\t\t\t/* for verification with our Registrar nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->RegistrarNonce, pData, WscLen) != 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M5 Compare Registrar nonce mismatched \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase WSC_ID_ENCR_SETTINGS:\n\t\t\t\t/* There shall have smoe kind of length check */\n\t\t\t\tif (WscLen <= 16)\n\t\t\t\t\tbreak;\n\t\t\t\tif (WscLen > 1024)\n\t\t\t\t{\n\t\t\t\t\t/* ApEncrSetting is not enough */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApEncrSettings array size is not enough, require %d\\n\", WscLen));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(IV_DecrData, pData, WscLen);\n                EncrLen = sizeof(pReg->ApEncrSettings);\n                AES_CBC_Decrypt(IV_DecrData + 16, (WscLen - 16),pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),IV_DecrData, 16, (UINT8 *) pReg->ApEncrSettings, (UINT *) &EncrLen);                 \n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"M7 ApEncrSettings len = %d\\n \", EncrLen));\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\t\t\t{\n\t\t\t\t\t/* Cleanup Old M7 Profile contents */\n\t\t\t\t\tRTMPZeroMemory(&pAdapter->StaCfg.WscControl.WscM7Profile, sizeof(WSC_PROFILE));\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t\t/* Parse encryption settings */\n\t\t\t\tWscParseEncrSettings(pAdapter, pReg->ApEncrSettings, EncrLen, pWscControl);\n\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM7 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData + pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM7 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\n\tif(NULL != IV_DecrData)\n/*\t\tkfree(IV_DecrData); */\n\t\tos_free_mem(NULL, IV_DecrData);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM7 : \\n\"));\n\treturn ret;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess WSC M8 Message\n\n\tArguments:\n\t\tpAdapter    - NIC Adapter pointer\n\t\tpbuf\t\t- recv buffer\n\t\tLength\t\t- recv Length\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after Rx M8\n\t\t1. Change the correct parameters\n\t\t2. Process M8\n\t\t\n\t========================================================================\n*/\nint ProcessMessageM8(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tIN  PWSC_CTRL       pWscControl)\n{\n\tint\t\t\t\t\tret = WSC_ERROR_NO_ERROR;\n\tINT\t\t\t\t    HmacLen;\n\tUCHAR\t\t\t\tHmac[8] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, KDK[32];\n\tINT\t\t\t\t\tEncrLen;\n\tPUCHAR\t\t\t\tpData = NULL;\n\tUSHORT\t\t\t\tWscType, WscLen;\n\tUCHAR\t\t\t\t*IV_DecrData=NULL;/*IV len 16 ,DecrData len */\n\tPWSC_REG_DATA       pReg = &pWscControl->RegData;\n\t\n\tRTMPZeroMemory(KDK, 32);\n/*\tIV_DecrData = kmalloc(1024, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(NULL, (UCHAR **)&IV_DecrData, 1024);\n\tif(NULL == IV_DecrData)\n\t{\n\t\tret = WSC_ERROR_CAN_NOT_ALLOCMEM;\n\t\treturn ret;\n\t}\n\t/* Copy the content to Regdata for lastRx information */\n\t/* Length must include authenticator IE size */\n\tpReg->LastRx.Length = Length;\t\t\n\tNdisMoveMemory(pReg->LastRx.Data, precv, Length);\n\tpData = pReg->LastRx.Data;\n\n\t/* Start to process WSC IEs */\n\twhile (Length > 4)\n\t{\n\t\tWSC_IE\tTLV_Recv;\n\t\tmemcpy((UINT8 *)&TLV_Recv, pData, 4);\n\t\tWscType = be2cpu16(TLV_Recv.Type);\n\t\tWscLen  = be2cpu16(TLV_Recv.Length);\n\t\tpData  += 4;\n\t\tLength -= 4;\n\n\t\t/* Parse M8 WSC type and store to RegData structure */\n\t\tswitch (WscType)\n\t\t{\n\t\t\tcase WSC_ID_VERSION:\n\t\t\t\tif(pReg->SelfInfo.Version != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Version mismatched %02x\\n\",*pData));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_MSG_TYPE:\n\t\t\t\tif(WSC_ID_MESSAGE_M8 != *pData)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Rx WPS Message Type mismatched %02x\\n\",*pData));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENROLLEE_NONCE:\n\t\t\t\t/* for verification with our enrollee nonce */\n\t\t\t\tif (RTMPCompareMemory(pReg->EnrolleeNonce, pData, WscLen) != 0)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Rx M8 Compare enrollee nonce mismatched \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_ENCR_SETTINGS:\n\t\t\t\t/* There shall have smoe kind of length check */\n\t\t\t\tif (WscLen <= 16)\n\t\t\t\t\tbreak;\n\t\t\t\tif (WscLen > 1024)\n\t\t\t\t{\n\t\t\t\t\t/* ApEncrSetting is not enough */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApEncrSettings array size is not enough, require %d\\n\", WscLen));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tNdisMoveMemory(IV_DecrData, pData, WscLen);\n                EncrLen = sizeof(pReg->ApEncrSettings);\n                AES_CBC_Decrypt(IV_DecrData + 16, (WscLen - 16),pReg->KeyWrapKey,sizeof(pReg->KeyWrapKey),IV_DecrData, 16, (UINT8 *) pReg->ApEncrSettings, (UINT *) &EncrLen);                 \n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"M8 ApEncrSettings len = %d\\n \", EncrLen));\n\n\t\t\t\t/* Parse encryption settings */\n\t\t\t\tif (WscProcessCredential(pAdapter, pReg->ApEncrSettings, EncrLen, pWscControl) == FALSE)\n\t\t\t\t{\n\t\t\t\t\tif(NULL != IV_DecrData)\n\t\t\t\t\t\tos_free_mem(NULL, IV_DecrData);\n\t\t\t\t\treturn WSC_ERROR_SETUP_LOCKED;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase WSC_ID_AUTHENTICATOR:\n\t\t\t\tNdisMoveMemory(Hmac, pData, WscLen);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM8 --> Unknown IE 0x%04x\\n\", WscType));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* Offset to net WSC Ie */\n\t\tpData  += WscLen;\n\t\tLength -= WscLen;\n\t}\n\t\n\t/* Combine last TX & RX message contents and validate the HMAC */\n\t/* We have to exclude last 12 bytes from last receive since it's authenticator value */\n\tHmacLen = pReg->LastTx.Length + pReg->LastRx.Length - 12;\n    if (pAdapter->pHmacData)\n    {\n    \tNdisMoveMemory(pAdapter->pHmacData, pReg->LastTx.Data, pReg->LastTx.Length);\n    \tNdisMoveMemory(pAdapter->pHmacData + pReg->LastTx.Length, pReg->LastRx.Data, pReg->LastRx.Length - 12);\n\n\t/* Validate HMAC, reuse KDK buffer */\n    \tRT_HMAC_SHA256(pReg->AuthKey, 32, pAdapter->pHmacData, HmacLen, KDK, SHA256_DIGEST_SIZE);\n    }\n\tif (RTMPEqualMemory(Hmac, KDK, 8) != 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ProcessMessageM8 --> HMAC not match\\n\"));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MD --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) KDK)), (UINT)cpu2be32(*((PUINT)(KDK + 4)))));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"calculated --> 0x%08x-%08x\\n\", (UINT)cpu2be32(*((PUINT) &Hmac[0])), (UINT)cpu2be32(*((PUINT) &Hmac[4]))));\n\t\tret = WSC_ERROR_HMAC_FAIL;\n\t}\n\t\n\tif(NULL != IV_DecrData)\n/*\t\tkfree(IV_DecrData); */\n\t\tos_free_mem(NULL, IV_DecrData);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ProcessMessageM8 : \\n\"));\n\treturn ret;\n}\n\n#endif /* WSC_INCLUDED */\n\n"
  },
  {
    "path": "src/common/wsc_ufd.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twsc_ufd.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n*/\n\n#include \"rt_config.h\"\n\n#ifdef WSC_INCLUDED\n\nstatic const STRING *XML_DECLARE_START = \"<?xml\";\nstatic const STRING *XML_DECLARE_END = \"?>\";\nstatic const STRING *XML_SSID_START = \"<ssid\";\nstatic const STRING *XML_SSID_END = \"</ssid>\";\nstatic const STRING *XML_AUTH_START = \"<authentication>\";\nstatic const STRING *XML_AUTH_END = \"</authentication>\";\nstatic const STRING *XML_ENCR_START = \"<encryption>\";\nstatic const STRING *XML_ENCR_END = \"</encryption>\";\nstatic const STRING *XML_KEY_START = \"<networkKey\";\nstatic const STRING *XML_KEY_END = \"</networkKey>\";\nstatic const STRING *XML_KEY_INDEX_START = \"<keyIndex>\";\nstatic const STRING *XML_KEY_INDEX_END = \"</keyIndex>\";\n\nstatic const STRING *XML_GUID_MARK = \"CFG_GUID\";\nstatic const STRING *XML_AP_GUID_MARK = \"CFG_AP_GUID\";\nstatic const STRING *XML_SSID_MARK = \"CFG_SSID\";\nstatic const STRING *XML_AUTH_MARK = \"CFG_AUTH\";\nstatic const STRING *XML_ENCR_MARK = \"CFG_ENCR\";\nstatic const STRING *XML_KEY_MARK = \"CFG_KEY\";\n\nstatic const STRING *XML_TEMPLATE =\n\"<?xml version=\\\"1.0\\\"?>\\n\"\n\"<wirelessProfile>\\n\"\n\"\t<config>\\n\"\n\"\t\t<configId>CFG_GUID\"\n\"</configId>\\n\"\n\"\t\t<configAuthorId>CFG_AP_GUID\"\n\"</configAuthorId>\\n\"\n\"\t\t<configAuthor>Ralink WPS AP</configAuthor>\\n\"\n\"\t</config>\\n\"\n\"\t<ssid xml:space=\\\"preserve\\\">CFG_SSID\"\n\"</ssid>\\n\"\n\"\t<connectionType>ESS</connectionType>\\n\"\n\"\t<channel2Dot4>0</channel2Dot4>\\n\"\n\"\t<channel5Dot0>0</channel5Dot0>\\n\"\n\"\t<primaryProfile>\\n\"\n\"\t\t<authentication>CFG_AUTH\"\n\"</authentication>\\n\"\n\"\t\t<encryption>CFG_ENCR\"\n\"</encryption>\\n\"\n\"\t\t<networkKey xml:space=\\\"preserve\\\">CFG_KEY\"\n\"</networkKey>\\n\"\n\"\t\t<keyProvidedAutomatically>0</keyProvidedAutomatically>\\n\"\n\"\t\t<ieee802Dot1xEnabled>0</ieee802Dot1xEnabled>\\n\"\n\"\t</primaryProfile>\\n\"\n\"</wirelessProfile>\\n\";\n\n\nstatic struct {\n\tPSTRING auth_str;\n\tUSHORT\tauth_type;\n} *PWSC_UFD_AUTH_TYPE, WSC_UFD_AUTH_TYPE[] = {\n\t{\"open\", \tWSC_AUTHTYPE_OPEN},\n\t{\"shared\",\tWSC_AUTHTYPE_SHARED},\n\t{\"WPA\",\t\tWSC_AUTHTYPE_WPA},\n\t{\"WPA2\",\tWSC_AUTHTYPE_WPA2},\n\t{\"WPAPSK\",\tWSC_AUTHTYPE_WPAPSK},\n\t{\"WPA2PSK\",\tWSC_AUTHTYPE_WPA2PSK},\n\t{NULL,}\n};\n\n\nstatic struct {\n\tPSTRING encr_str;\n\tUSHORT\tencr_type;\n} *PWSC_UFD_ENCR_TYPE, WSC_UFD_ENCR_TYPE[] = {\n\t{\"none\", \tWSC_ENCRTYPE_NONE},\n\t{\"WEP\",\t\tWSC_ENCRTYPE_WEP},\n\t{\"TKIP\",\tWSC_ENCRTYPE_TKIP},\n\t{\"AES\",\t\tWSC_ENCRTYPE_AES},\n\t{NULL,}\n};\n\n\nBOOLEAN\tWscPassXmlDeclare(\n\tINOUT STRING **pXmlData)\n{\n\tSTRING\t*ptr;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"======> WscPassXmlDeclare\\n\"));\n\t\n\tptr = rtstrstr(*pXmlData, (PSTRING)XML_DECLARE_START);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscPassXmlDeclare: missing XML Declare <?xml\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tptr = rtstrstr(*pXmlData, (PSTRING)XML_DECLARE_END);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"XML syntax error: missing XML Declare ?>\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t(*pXmlData) = ptr + strlen(XML_DECLARE_END);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<====== WscPassXmlDeclare\\n\"));\n\n\treturn TRUE;\n}\n\n\nBOOLEAN WscGetXmlSSID(\n\tIN\tSTRING\t\t\t\t*pXmlData,\n\tOUT\tNDIS_802_11_SSID\t*pSsid)\n{\n\tSTRING\t*ptr, *pBuffer = pXmlData;\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_SSID_START);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlSSID: missing <ssid\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpBuffer = ptr + strlen(XML_SSID_START);\n\t\n\tptr = rtstrstr(pBuffer, \">\");\n\tif (ptr)\n\t{\n\t\tpBuffer = ptr + 1;\n\t}\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_SSID_END);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlSSID: missing </ssid>\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpSsid->SsidLength = (UINT)(ptr - pBuffer);\n\tRTMPZeroMemory(pSsid->Ssid, NDIS_802_11_LENGTH_SSID);\n\tif ((pSsid->SsidLength > 0) && (pSsid->SsidLength < 33))\n\t{\n\t\tRTMPMoveMemory(pSsid->Ssid, pBuffer, pSsid->SsidLength);\n\t}\n\telse\n\t{\n\t\tpSsid->SsidLength = 0;\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\nBOOLEAN WscGetXmlAuth(\n\tIN\tSTRING\t*pXmlData,\n\tOUT USHORT\t*pAuthType)\n{\n\tSTRING\t*ptr, *pBuffer = pXmlData;\n\tSTRING\tAuthStr[10] = {0};\n\tUINT\tAuthStrLen = 0;\n\n\t*pAuthType = 0;\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_AUTH_START);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlAuth: missing %s\\n\", XML_AUTH_START));\n\t\treturn FALSE;\n\t}\n\n\tpBuffer = ptr + strlen(XML_AUTH_START);\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_AUTH_END);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlAuth: missing %s\\n\", XML_AUTH_END));\n\t\treturn FALSE;\n\t}\n\n\tAuthStrLen = (UINT)(ptr - pBuffer);\n\tif ((AuthStrLen > 0) && (AuthStrLen <= 10))\n\t{\n\t\tRTMPMoveMemory(AuthStr, pBuffer, AuthStrLen);\n\n\t\tfor (PWSC_UFD_AUTH_TYPE = WSC_UFD_AUTH_TYPE; PWSC_UFD_AUTH_TYPE->auth_str; PWSC_UFD_AUTH_TYPE++)\n\t\t{\n\t\t\tif (strcmp(AuthStr, PWSC_UFD_AUTH_TYPE->auth_str) == 0)\n\t\t\t{\n\t\t\t\t*pAuthType = PWSC_UFD_AUTH_TYPE->auth_type;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\n\nBOOLEAN WscGetXmlEncr(\n\tIN\tSTRING\t*pXmlData,\n\tOUT USHORT\t*pEncrType)\n{\n\tSTRING\t*ptr, *pBuffer = pXmlData;\n\tSTRING\tEncrStr[10] = {0};\n\tUINT\tEncrStrLen = 0;\n\n\t*pEncrType = 0;\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_ENCR_START);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlEncr: missing %s\\n\", XML_ENCR_START));\n\t\treturn FALSE;\n\t}\n\n\tpBuffer = ptr + strlen(XML_ENCR_START);\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_ENCR_END);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlEncr: missing %s\\n\", XML_ENCR_END));\n\t\treturn FALSE;\n\t}\n\n\tEncrStrLen = (UINT)(ptr - pBuffer);\n\tif ((EncrStrLen > 0) && (EncrStrLen <= 10))\n\t{\n\t\tRTMPMoveMemory(EncrStr, pBuffer, EncrStrLen);\n\n\t\tfor (PWSC_UFD_ENCR_TYPE = WSC_UFD_ENCR_TYPE; PWSC_UFD_ENCR_TYPE->encr_str; PWSC_UFD_ENCR_TYPE++)\n\t\t{\n\t\t\tif (strcmp(EncrStr, PWSC_UFD_ENCR_TYPE->encr_str) == 0)\n\t\t\t{\n\t\t\t\t*pEncrType = PWSC_UFD_ENCR_TYPE->encr_type;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn FALSE;\n}\n\n\nBOOLEAN WscGetXmlKey(\n\tIN\tSTRING\t*pXmlData,\n\tOUT UCHAR\t*pKey,\n\tOUT USHORT\t*pKeyLen)\n{\n\tSTRING\t*ptr, *pBuffer = pXmlData;\n\tUINT\tKeyLen = 0;\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_START);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlKey: missing %s\\n\", XML_KEY_START));\n\t\treturn FALSE;\n\t}\n\n\tpBuffer = ptr + strlen(XML_KEY_START);\n\t\n\tptr = rtstrstr(pBuffer, \">\");\n\tif (ptr)\n\t{\n\t\tpBuffer = ptr + 1;\n\t}\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_END);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlKey: missing %s\\n\", XML_KEY_END));\n\t\treturn FALSE;\n\t}\n\n\tKeyLen = (UINT)(ptr - pBuffer);\n\tif ((KeyLen >= 8) && (KeyLen <= 64))\n\t{\n\t\tRTMPMoveMemory(pKey, pBuffer, KeyLen);\n\t\t*pKeyLen = KeyLen;\n\t}\n\telse\n\t{\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\nBOOLEAN WscGetXmlKeyIndex(\n\tIN\tSTRING\t*pXmlData,\n\tOUT UCHAR\t*pKeyIndex)\n{\n\tSTRING\t*ptr, *pBuffer = pXmlData;\n\n\t*pKeyIndex = 1;\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_INDEX_START);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlKeyIndex: missing %s\\n\", XML_KEY_INDEX_START));\n\t\treturn FALSE;\n\t}\n\n\tpBuffer = ptr + strlen(XML_KEY_INDEX_START);\n\n\tptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_INDEX_END);\n\tif (ptr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscGetXmlKeyIndex: missing %s\\n\", XML_KEY_INDEX_END));\n\t\treturn FALSE;\n\t}\n\n\t*pKeyIndex = *(--ptr) - 0x30;\n\t\n\treturn TRUE;\n}\n\n\n\nBOOLEAN\tWscReadProfileFromUfdFile(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR ApIdx,\n\tIN PSTRING pUfdFileName)\n{\n\tPWSC_CREDENTIAL     pCredential = &pAd->ApCfg.MBSSID[ApIdx].WscControl.WscProfile.Profile[0];\n\tRTMP_OS_FS_INFO\t\tosFSInfo;\n\tRTMP_OS_FD\t\t\tfile_r;\n\tssize_t\t\t\t\trv, fileLen = 0;\n\tPSTRING\t\t\t\tpXmlData = NULL;\n\tBOOLEAN\t\t\t\tRV = TRUE;\n\n\tif (pUfdFileName == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s: pUfdFileName is NULL\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tfile_r = RtmpOSFileOpen(pUfdFileName, O_RDONLY, 0);\n\tif (IS_FILE_OPEN_ERR(file_r)) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s: Error opening file %s\\n\", __FUNCTION__, pUfdFileName));\n\t\treturn FALSE;\n\t}\n\telse \n\t{\n\t\tchar tempStr[64] = {0};\n\t\twhile((rv = RtmpOSFileRead(file_r, tempStr, 64)) > 0)\n\t\t{\n\t\t\tfileLen += rv;\n\t\t}\n\t\tos_alloc_mem(pAd, (UCHAR **)&pXmlData, fileLen+1);\n\t\tif (pXmlData == NULL)\n\t\t{\n\t\t\tRtmpOSFileClose(file_r);\n\t\t\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pXmlData kmalloc fail. (fileLen = %d)\\n\", fileLen));\n\t\t\treturn FALSE;\n\t\t}\n\t\tRTMPZeroMemory(pXmlData, fileLen+1);\n\t\tRtmpOSFileSeek(file_r, 0);\n\t\trv = RtmpOSFileRead(file_r, (PSTRING)pXmlData, fileLen);\n\t\tRtmpOSFileClose(file_r);\n\t\tif (rv != fileLen)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RtmpOSFileRead fail, fileLen = %d\\n\", fileLen));\n\t\t\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\t\t\tgoto ReadErr;\n\t\t}\n\t}\n\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscReadProfileFromUfdFile\\n\"));\n\tif (WscPassXmlDeclare(&pXmlData))\n\t{\n\t\tif (WscGetXmlSSID(pXmlData, &pCredential->SSID))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SSID = %s(%d)\\n\", pCredential->SSID.Ssid, pCredential->SSID.SsidLength));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRV = FALSE;\n\t\t\tgoto FreeXmlData;\n\t\t}\n\n\t\tif (WscGetXmlAuth(pXmlData, &pCredential->AuthType))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Credential.AuthType = 0x%04x\\n\", pCredential->AuthType));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRV = FALSE;\n\t\t\tgoto FreeXmlData;\n\t\t}\n\n\t\tif (WscGetXmlEncr(pXmlData, &pCredential->EncrType))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Credential.EncrType = 0x%04x\\n\", pCredential->EncrType));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRV = FALSE;\n\t\t\tgoto FreeXmlData;\n\t\t}\n\n\t\tpCredential->KeyLength = 0;\n\t\tRTMPZeroMemory(pCredential->Key, 64);\n\t\tif (WscGetXmlKey(pXmlData, pCredential->Key, &pCredential->KeyLength))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Credential.Key = %s (%d)\\n\", pCredential->Key, pCredential->KeyLength));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRV = FALSE;\n\t\t\tgoto FreeXmlData;\n\t\t}\n\n\t\t/*\n\t\t\tIf we cannot find keyIndex in .wfc file, use default value 1.\n\t\t*/\n\t\tif (WscGetXmlKeyIndex(pXmlData, &pCredential->KeyIndex))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pCredential->KeyIndex = %d\\n\", pCredential->KeyIndex));\n\t\t}\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscReadProfileFromUfdFile OK\\n\"));\n\n\t\tWscWriteConfToPortCfg(pAd, \n\t\t\t\t\t\t\t  &pAd->ApCfg.MBSSID[ApIdx].WscControl, \n\t\t\t\t\t\t\t  &pAd->ApCfg.MBSSID[ApIdx].WscControl.WscProfile.Profile[0], TRUE);\n\n\t\tpAd->WriteWscCfgToDatFile = ApIdx;\n\n\t\tRtmpOsTaskWakeUp(&(pAd->wscTask));\n\nFreeXmlData:\n\t\tif (pXmlData)\n\t\t\tos_free_mem(NULL, pXmlData);\n\n\t\treturn RV;\n\t}\n\nReadErr:\n\tif (pXmlData)\n\t\tos_free_mem(NULL, pXmlData);\n\treturn FALSE;\n}\n\n\nBOOLEAN\tWscWriteProfileToUfdFile(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR               ApIdx,\n\tIN  PSTRING\t\t\t\tpUfdFileName)\n{\n\tPWSC_CTRL           pWscControl = &pAd->ApCfg.MBSSID[ApIdx].WscControl;\n\tPWSC_CREDENTIAL     pCredential = &pWscControl->WscProfile.Profile[0];\n\tRTMP_OS_FS_INFO\t\tosFSInfo;\n\tRTMP_OS_FD\t\t\tfile_w;\n\tPSTRING\t\t\t\toffset, pXmlTemplate = (PSTRING)XML_TEMPLATE;\n\tBOOLEAN\t\t\t\tbFound = FALSE, bRtn = TRUE;\n\tUCHAR\t\t\t\tGuid[UUID_LEN_HEX];\n\tUCHAR\t\t\t\tGuid_Str[UUID_LEN_STR];\n\n\tif (pUfdFileName == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s: pUfdFileName is NULL\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tfile_w = RtmpOSFileOpen(pUfdFileName, O_WRONLY|O_TRUNC|O_CREAT, 0);\n\tif (IS_FILE_OPEN_ERR(file_w)) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s: Error opening file %s\\n\", __FUNCTION__, pUfdFileName));\n\t\treturn FALSE;\n\t}\n\telse \n\t{\n\t\tWscCreateProfileFromCfg(pAd, AP_MODE, pWscControl, &pWscControl->WscProfile);\n\n\t\tWscGenerateUUID(pAd, &Guid[0], &Guid_Str[0], ApIdx, TRUE);\n\n\t\tif ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_GUID_MARK)) != NULL)\n\t\t{\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate));\t\t\t\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)&Guid_Str[0], (int)UUID_LEN_STR);\n\t\t\tpXmlTemplate = offset + strlen(XML_GUID_MARK);\n\t\t}\n\t\t\n\t\tif ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_AP_GUID_MARK)) != NULL)\n\t\t{\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate));\t\t\t\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)&pWscControl->Wsc_Uuid_Str[0], (int)UUID_LEN_STR);\n\t\t\tpXmlTemplate = offset + strlen(XML_AP_GUID_MARK);\n\t\t}\n\t\tif ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_SSID_MARK)) != NULL)\n\t\t{\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate));\t\t\t\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)&pCredential->SSID.Ssid[0], (int)pCredential->SSID.SsidLength);\n\t\t\tpXmlTemplate = offset + strlen(XML_SSID_MARK);\n\t\t}\n\t\tif ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_AUTH_MARK)) != NULL)\n\t\t{\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate));\t\t\t\n\t\t\tfor (PWSC_UFD_AUTH_TYPE = WSC_UFD_AUTH_TYPE; PWSC_UFD_AUTH_TYPE->auth_str; PWSC_UFD_AUTH_TYPE++)\n\t\t\t{\n\t\t\t\tif (PWSC_UFD_AUTH_TYPE->auth_type == pCredential->AuthType)\n\t\t\t\t{\n\t\t\t\t\tRtmpOSFileWrite(file_w, \n\t\t\t\t\t\t\t\t\t(PSTRING)PWSC_UFD_AUTH_TYPE->auth_str, \n\t\t\t\t\t\t\t\t\t(int)strlen(PWSC_UFD_AUTH_TYPE->auth_str));\n\t\t\t\t\tbFound = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpXmlTemplate = offset + strlen(XML_AUTH_MARK);\n\t\t\tif (bFound == FALSE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s: Unknow Auth Type(=%x)\\n\", __FUNCTION__, pCredential->AuthType));\n\t\t\t\tbRtn = FALSE;\n\t\t\t\tgoto out;\n\t\t\t}\n\t\t}\n\t\tif ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_ENCR_MARK)) != NULL)\n\t\t{\n\t\t\tbFound = FALSE;\n\t\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate));\t\t\t\n\t\t\tfor (PWSC_UFD_ENCR_TYPE = WSC_UFD_ENCR_TYPE; PWSC_UFD_ENCR_TYPE->encr_str; PWSC_UFD_ENCR_TYPE++)\n\t\t\t{\n\t\t\t\tif (PWSC_UFD_ENCR_TYPE->encr_type == pCredential->EncrType)\n\t\t\t\t{\n\t\t\t\t\tRtmpOSFileWrite(file_w, \n\t\t\t\t\t\t\t\t\t(PSTRING)PWSC_UFD_ENCR_TYPE->encr_str, \n\t\t\t\t\t\t\t\t\t(int)strlen(PWSC_UFD_ENCR_TYPE->encr_str));\n\t\t\t\t\tbFound = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpXmlTemplate = offset + strlen(XML_ENCR_MARK);\n\t\t\tif (bFound == FALSE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--> %s: Unknow Encr Type(=%x)\\n\", __FUNCTION__, pCredential->EncrType));\n\t\t\t\tbRtn = FALSE;\n\t\t\t\tgoto out;\n\t\t\t}\n\t\t}\n\t\tif ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_KEY_MARK)) != NULL)\n\t\t{\n\t\t\tif (pCredential->EncrType != WSC_ENCRTYPE_NONE)\n\t\t\t{\n\t\t\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate));\n\t\t\t\tRtmpOSFileWrite(file_w,\n\t\t\t\t\t\t\t\t(PSTRING)pCredential->Key,\n\t\t\t\t\t\t\t\t(int)pCredential->KeyLength);\n\t\t\t\tpXmlTemplate = offset + strlen(XML_KEY_MARK);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRtmpOSFileWrite(file_w, (PSTRING)XML_ENCR_END, (int)strlen(XML_ENCR_END));\n\t\t\t\tRtmpOSFileWrite(file_w, (PSTRING)\"\\n\", (int)1);\n\t\t\t\tpXmlTemplate = offset + strlen(XML_KEY_MARK) + strlen(XML_KEY_END) + 1; /* 1: '\\n' */\n\t\t\t}\t\t\t\n\t\t}\n\t\tRtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)strlen(pXmlTemplate));\n\t}\n\nout:\n\tRtmpOSFileClose(file_w);\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\t\n\treturn bRtn;\n}\n\n\n#endif /* WSC_INCLUDED */\n"
  },
  {
    "path": "src/common/wsc_v2.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twsc_v2.c\n*/\n\n#include    \"rt_config.h\"\n\n#ifdef WSC_V2_SUPPORT\n#include    \"wsc_tlv.h\"\n\nBOOLEAN\tWscAppendV2SubItem(\n\tIN\tUCHAR\t\t\tSubID,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUCHAR\t\t\tDataLen,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpOutBufLen);\n\n#ifdef CONFIG_AP_SUPPORT\nVOID \tWscOnOff(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  INT\t\t\t\tApIdx,\n\tIN  BOOLEAN\t\t\tbOff)\n{\n\tPWSC_V2_INFO\tpWpsV2Info = &pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscControl.WscV2Info;\n\tif (bOff)\n\t{\n\t\t/*\n\t\t\tAP must not support WEP in WPS V2\n\t\t*/\n\t\tpWpsV2Info->bWpsEnable = FALSE;\n\t\tpAd->ApCfg.MBSSID[ApIdx & 0x0F].WscIEBeacon.ValueLen = 0;\n\t\tpAd->ApCfg.MBSSID[ApIdx & 0x0F].WscIEProbeResp.ValueLen = 0;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscOnOff - OFF.\\n\"));\n\t}\n\telse\n\t{\n\t\tpWpsV2Info->bWpsEnable = TRUE;\n\t\tif (pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscControl.WscConfMode != WSC_DISABLE)\n\t\t{\n\t\t\tINT IsAPConfigured;\n\t\t\tIsAPConfigured = pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscControl.WscConfStatus;\n\t\t\tWscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, (ApIdx & 0x0F), NULL, 0, AP_MODE);\n\t\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, ApIdx, NULL, 0, AP_MODE);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WscOnOff - ON.\\n\"));\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscOnOff - bWpsEnable = %d\\n\", pWpsV2Info->bWpsEnable));\n}\n\nVOID\tWscAddEntryToAclList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tINT\t\t\t\tApIdx,\n\tIN  PUCHAR\t\t\tpMacAddr)\n{\n\tPRT_802_11_ACL\tpACL = NULL;\n\tINT\t\t\t\ti;\n\tBOOLEAN\t\t\tbFound = FALSE;\n\t\n\tpACL = &pAd->ApCfg.MBSSID[ApIdx].AccessControlList;\n\n\tif ((pACL->Policy == 0) ||\n\t\t(pACL->Policy == 2))\n\t\treturn;\n\t\n\tif (pACL->Num >= (MAX_NUM_OF_ACL_LIST - 1))\n    {\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"The AccessControlList is full, and no more entry can join the list!\\n\"));\t\t\n\t\treturn;\n\t}\n\n\tfor (i=0; i<pACL->Num; i++)\n\t{\n\t\tif (NdisEqualMemory(pACL->Entry[i].Addr, pMacAddr, MAC_ADDR_LEN))\n\t\t\tbFound = TRUE;\n\t}\n\tif (bFound == FALSE)\n\t{\n\t\tNdisMoveMemory(pACL->Entry[i].Addr, pMacAddr, MAC_ADDR_LEN);\n\t\tpACL->Num++;\n\t}\n}\n\nVOID WscSetupLockTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tPWSC_CTRL \t\tpWscControl = (PWSC_CTRL)FunctionContext;\n\tPRTMP_ADAPTER \tpAd = NULL;\n\n\tif (pWscControl == NULL)\n\t\treturn;\n\n\tpAd = (PRTMP_ADAPTER)pWscControl->pAd;\n\n\tif (pAd == NULL)\n\t\treturn;\n\n\tpWscControl->bSetupLock = FALSE;\n\tpWscControl->WscSetupLockTimerRunning = FALSE;\n\n\t\tWscBuildBeaconIE(pAd,\n\t\t\t\t\t\t pWscControl->WscConfStatus,\n\t\t\t\t\t\t FALSE,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t (pWscControl->EntryIfIdx & 0xF),\n\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t AP_MODE);\n\t\tWscBuildProbeRespIE(pAd,\n\t\t\t\t\t\t\tWSC_MSGTYPE_AP_WLAN_MGR,\n\t\t\t\t\t\t\tpWscControl->WscConfStatus,\n\t\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tpWscControl->EntryIfIdx,\n\t\t\t\t\t\t\tNULL,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tAP_MODE);\n\n\tAPUpdateBeaconFrame(pAd, pWscControl->EntryIfIdx & 0x0F);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WscSetupLockTimeout!\\n\"));\n\n\treturn;\n}\n\n\nVOID\tWscCheckPinAttackCount(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL\t\tpWscControl)\n{\n\tBOOLEAN\tbCancelled;\n\n\tif ((pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_APCLI)\n#ifdef P2P_SUPPORT\n\t\t|| (pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_P2P_CLI)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t{\n\t\t/*\n\t\t\tAPCLI and P2P CLI don't need to do PIN attack checking.\n\t\t*/\n\t\treturn;\n\t}\n\t\n\t/*\n\t\tIf a static PIN is used, \n\t\tthe AP must track multiple failed attempts to authenticate an external Registrar and then enter a lock-down state \n\t\t(This state is signified by setting the attribute AP Setup Locked to TRUE).  \n\t\tAfter at most 10 failed, consecutive attempts, with no time limitation, from any number of external Registrars, \n\t\tthe AP shall revert to a locked down state, and the AP shall remain in the locked down state indefinitely \n\t\t(i.e., until the user intervenes to unlock AP's  PIN for use by external Registrars)\n\t*/\n\tpWscControl->PinAttackCount++;\n\tif (pWscControl->PinAttackCount >= pWscControl->MaxPinAttack)\n\t{\t\t\n\t\tpWscControl->bSetupLock = TRUE;\n\t\tif (pWscControl->WscSetupLockTimerRunning)\n\t\t{\n\t\t\tRTMPCancelTimer(&pWscControl->WscSetupLockTimer, &bCancelled);\n\t\t\tpWscControl->WscSetupLockTimerRunning = FALSE;\n\t\t}\n\n\t\tif (pWscControl->PinAttackCount < WSC_LOCK_FOREVER_PIN_ATTACK)\n\t\t{\n\t\t\tpWscControl->WscSetupLockTimerRunning = TRUE;\n\t\t\tRTMPSetTimer(&pWscControl->WscSetupLockTimer, pWscControl->SetupLockTime*60*1000);\n\t\t}\n\t\tpWscControl->PinAttackCount = 0;\n\n\t\t\tWscBuildBeaconIE(pAd, \n\t\t\t\t\t\t\t pWscControl->WscConfStatus, \n\t\t\t\t\t\t\t FALSE,\n\t\t\t\t\t\t\t 0,\n\t\t\t\t\t\t\t 0,\n\t\t\t\t\t\t\t (pWscControl->EntryIfIdx & 0xF),\n\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t 0,\n\t\t\t\t\t\t\t AP_MODE);\n\t\t\tWscBuildProbeRespIE(pAd,\n\t\t\t\t\t\t\t\tWSC_MSGTYPE_AP_WLAN_MGR,\n\t\t\t\t\t\t\t\tpWscControl->WscConfStatus,\n\t\t\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tpWscControl->EntryIfIdx,\n\t\t\t\t\t\t\t\tNULL,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tAP_MODE);\n\t\t\n\t\tAPUpdateBeaconFrame(pAd, pWscControl->EntryIfIdx & 0x0F);\n\t}\n}\n\n#endif /* CONFIG_AP_SUPPORT */\n\n/*\n\tVendor ID: 0x00372A\n\tSubelements ID (one-octet)\n\t\tVersion2\t\t\t\t0x00\n\t\tAuthorizedMACs\t\t\t0x01\n\t\tNetwork Key Shareable\t0x02\n\t\tRequest to Enroll\t\t0x03\n\t\tSettings Delay Time\t\t0x04\n\t\tReserved for future use\t0x05 to 0xFF\n\tLength (one-octet) - number of octets in the payload of this subelment\n\t\tVersion2\t\t\t\t1B\n\t\tAuthorizedMACs\t\t\t<=30B\n\t\tNetwork Key Shareable\tBool\n\t\tRequest to Enroll\t\tBool\n\t\tSettings Delay Time\t\t1B\n*/\nBOOLEAN\tWscGenV2Msg(\n\tIN  PWSC_CTRL\t\tpWpsCtrl,\n\tIN  BOOLEAN\t\t\tbSelRegistrar,\n\tIN\tPUCHAR\t\t\tpAuthorizedMACs,\n\tIN  INT   \t\t\tAuthorizedMACsLen,\n\tOUT\tUCHAR\t\t\t**pOutBuf,\n\tOUT\tINT\t\t\t\t*pOutBufLen)\n{\n\tPUCHAR\t\t\tpWscV2Msg = NULL;\n\tUSHORT\t\t\tWscV2MsgLen = 0;\n\tPWSC_REG_DATA\tpReg = &pWpsCtrl->RegData;\n\tINT\t\t\t\ttemplen = 0;\n\t\t\n\tos_alloc_mem(NULL, (UCHAR **)&pWscV2Msg, 128);\n\tif (pWscV2Msg)\n\t{\n\t\tUCHAR TmpLen = 0;\n\t\tpWscV2Msg[0] = 0x00;\n\t\tpWscV2Msg[1] = 0x37;\n\t\tpWscV2Msg[2] = 0x2A;\n\n\t\t/* Version2 */\n\t\tWscAppendV2SubItem(WFA_EXT_ID_VERSION2, &pReg->SelfInfo.Version2, 1, pWscV2Msg+3, &TmpLen);\n\t\tWscV2MsgLen += (3 + (USHORT)TmpLen);\n\n\t\tif (bSelRegistrar)\n\t\t{\n\t\t\t/* \n\t\t\t\tAuthorized MACs \n\t\t\t\tRegistrars (both internal and external) shall add the AuthorizedMACs subelement, \n\t\t\t\tthis applies to all Configuration Methods, including PIN, PBC and NFC.\n\t\t\t*/\n\t\t\tif (pAuthorizedMACs)\n\t\t\t{\n\t\t\t\tWscAppendV2SubItem(\tWFA_EXT_ID_AUTHORIZEDMACS, \n\t\t\t\t\t\t\t\t\tpAuthorizedMACs, \n\t\t\t\t\t\t\t\t\tAuthorizedMACsLen, \n\t\t\t\t\t\t\t\t\tpWscV2Msg+WscV2MsgLen, \n\t\t\t\t\t\t\t\t\t&TmpLen\t);\n\t\t\t\tWscV2MsgLen += (USHORT)TmpLen;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWscAppendV2SubItem(\tWFA_EXT_ID_AUTHORIZEDMACS, \n\t\t\t\t\t\t\t\t\tBROADCAST_ADDR, \n\t\t\t\t\t\t\t\t\tMAC_ADDR_LEN, \n\t\t\t\t\t\t\t\t\tpWscV2Msg+WscV2MsgLen, \n\t\t\t\t\t\t\t\t\t&TmpLen\t);\n\t\t\t\tWscV2MsgLen += (USHORT)TmpLen;\n\t\t\t}\n\t\t}\n\n\t\ttemplen = AppendWSCTLV(WSC_ID_VENDOR_EXT, (*pOutBuf), (UINT8 *)pWscV2Msg, WscV2MsgLen);\n\t\t(*pOutBuf) += templen;\n\t\t(*pOutBufLen)   += templen;\n\n\t\tos_free_mem(NULL, pWscV2Msg);\n\t\t\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nBOOLEAN\tWscAppendV2SubItem(\n\tIN\tUCHAR\t\t\tSubID,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUCHAR\t\t\tDataLen,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpOutBufLen)\n{\n\tPUCHAR\tpBuf = NULL;\n\tos_alloc_mem(NULL, &pBuf, DataLen + 10);\n\tif (pBuf)\n\t{\n\t\tpBuf[0] = SubID;\n\t\tpBuf[1] = DataLen;\n\t\tNdisMoveMemory(pBuf+2, pData, DataLen);\n\t\t*pOutBufLen = (DataLen + 2);\n\t\tNdisMoveMemory(pOutBuf, pBuf, *pOutBufLen);\n\t\tos_free_mem(NULL, pBuf);\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nBOOLEAN\tWscParseV2SubItem(\n\tIN\tUCHAR\t\t\tSubID,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tDataLen,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpOutBufLen)\n{\n\tPEID_STRUCT   pEid;\n\tUSHORT\t\t  Length = 0;\n\tpEid = (PEID_STRUCT) (pData + 3);\n\thex_dump(\"WscParseV2SubItem - pData\", (pData+3), DataLen-3);\n\twhile ((Length + 2 + pEid->Len) <= (DataLen-3))\n    {\n    \tif (pEid->Eid == SubID)\n        {\n\t\t\t*pOutBufLen = pEid->Len;\n\t\t\tNdisMoveMemory(pOutBuf, &pEid->Octet[0], pEid->Len);\n\t\t\treturn TRUE;\n    \t}\n    \tLength = Length + 2 + pEid->Len; \n        pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);\n\t}\n\treturn FALSE;\n}\n\nVOID\tWscSendEapFragAck(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL\t\t\tpWscControl,\n\tIN\tPMAC_TABLE_ENTRY\tpEntry)\n{\n\tif (pEntry == NULL)\n\t{\n\t\tASSERT(pEntry!=NULL);\n\t\treturn;\n\t}\n\tif (IS_ENTRY_CLIENT(pEntry))\n\t{\n\t\tpWscControl->bWscLastOne = TRUE;\n\t\tif (pAdapter->OpMode == OPMODE_AP)\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_FRAG_ACK, NULL, 0, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t\telse\n\t\t{\t\t\t\t\t\t\n\t\t\tif (ADHOC_ON(pAdapter) && (pWscControl->WscConfMode == WSC_REGISTRAR))\n\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_FRAG_ACK, NULL, 0, pWscControl, STA_MODE, EAP_CODE_REQ);\n\t\t\telse\n\t\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_FRAG_ACK, NULL, 0, pWscControl, STA_MODE, EAP_CODE_RSP);\n\t\t}\n\t}\n\telse if (IS_ENTRY_APCLI(pEntry))\n\t\tWscSendMessage(pAdapter, WSC_OPCODE_FRAG_ACK, NULL, 0, pWscControl, AP_CLIENT_MODE, EAP_CODE_REQ);\n}\n\nVOID\tWscSendEapFragData(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL\t\t\tpWscControl,\n\tIN\tPMAC_TABLE_ENTRY\tpEntry)\n{\n\tINT \tDataLen = 0;\n\tPUCHAR\tpData = NULL;\n\t\n\tif (pEntry == NULL)\n\t{\n\t\tASSERT(pEntry!=NULL);\n\t\treturn;\n\t}\n\n\tpData = pWscControl->pWscCurBufIdx;\n\tpWscControl->bWscLastOne = TRUE;\n\tif (pWscControl->WscTxBufLen > pWscControl->WscFragSize)\n\t{\n\t\tpWscControl->bWscLastOne = FALSE;\n\t\tDataLen = pWscControl->WscFragSize;\n\t\tpWscControl->WscTxBufLen -= pWscControl->WscFragSize;\n\t\tpWscControl->pWscCurBufIdx = (pWscControl->pWscCurBufIdx + pWscControl->WscFragSize);\n\t}\n\telse\n\t{\n\t\tDataLen = pWscControl->WscTxBufLen;\n\t\tpWscControl->pWscCurBufIdx = NULL;\n\t\tpWscControl->WscTxBufLen = 0;\n\t}\n\t\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAdapter)\n\t{\n\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_MSG, pData, DataLen, pWscControl, AP_CLIENT_MODE, EAP_CODE_RSP);\n\t\telse\n\t\t\tWscSendMessage(pAdapter, WSC_OPCODE_MSG, pData, DataLen, pWscControl, AP_MODE, EAP_CODE_REQ);\n\t}\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAdapter)\n\t\tWscSendMessage(pAdapter, WSC_OPCODE_MSG, pData, DataLen, pWscControl, STA_MODE, EAP_CODE_RSP);\n#endif // CONFIG_STA_SUPPORT //\n}\n\n#endif /* WSC_V2_SUPPORT */\n\n"
  },
  {
    "path": "src/include/action.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\taironet.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n\tPaul Lin\t04-06-15\t\tInitial\n*/\n\n#ifndef\t__ACTION_H__\n#define\t__ACTION_H__\n\ntypedef struct GNU_PACKED __HT_INFO_OCTET {\n#ifdef RT_BIG_ENDIAN\n\tUCHAR Reserved:5;\n\tUCHAR STA_Channel_Width:1;\n\tUCHAR Forty_MHz_Intolerant:1;\n\tUCHAR Request:1;\n#else\n\tUCHAR Request:1;\n\tUCHAR Forty_MHz_Intolerant:1;\n\tUCHAR STA_Channel_Width:1;\n\tUCHAR Reserved:5;\n#endif\n} HT_INFORMATION_OCTET;\n\ntypedef struct GNU_PACKED __FRAME_HT_INFO {\n\tHEADER_802_11 Hdr;\n\tUCHAR Category;\n\tUCHAR Action;\n\tHT_INFORMATION_OCTET HT_Info;\n} FRAME_HT_INFO, *PFRAME_HT_INFO;\n\n#endif /* __ACTION_H__ */\n"
  },
  {
    "path": "src/include/ags.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/  \n    \n/****************************************************************************\n\n\tAbstract:\n\n\tAll AGS (Adaptive Group Switching) Related Structure & Definition\n\n***************************************************************************/ \n    \n#ifndef __AGS_H__\n#define __AGS_H__\n\n\nextern UCHAR AGS1x1HTRateTable[];\nextern UCHAR AGS2x2HTRateTable[];\nextern UCHAR AGS3x3HTRateTable[];\n#ifdef DOT11_VHT_AC\nextern UCHAR Ags1x1VhtRateTable[];\nextern UCHAR Ags2x2VhtRateTable[];\n#endif /* DOT11_VHT_AC */\n\n#define AGS_TX_QUALITY_WORST_BOUND       8\n#define AGS_QUICK_RA_TIME_INTERVAL        50\t/* 50ms */\n\n/* The size, in bytes, of an AGS entry in the rate switch table */\n#define SIZE_OF_AGS_RATE_TABLE_ENTRY\t9\n\ntypedef struct _RTMP_RA_AGS_TB {\n\tUCHAR\tItemNo;\n\n\tUCHAR\tSTBC:1;\n\tUCHAR\tShortGI:1;\n\tUCHAR\tBW:2;\n\tUCHAR\tMode:3;\n\tUCHAR\tRsv1:1;\n\n\tUCHAR Nss:2; // NSS_XXX (VHT only)\n\tUCHAR rsv2:6; // Reserved\n\t\n\tUCHAR\tCurrMCS;\n\tUCHAR\tTrainUp;\n\tUCHAR\tTrainDown;\n\tUCHAR\tdownMcs;\n\tUCHAR\tupMcs3;\n\tUCHAR\tupMcs2;\n\tUCHAR\tupMcs1;\n}RTMP_RA_AGS_TB;\n\n\n/* AGS control */\ntypedef struct _AGS_CONTROL {\n\tUCHAR MCSGroup; /* The MCS group under testing */\n\tUCHAR lastRateIdx;\n} AGS_CONTROL,*PAGS_CONTROL;\n\n\n/* The statistics information for AGS */\ntypedef struct _AGS_STATISTICS_INFO {\n\tCHAR\tRSSI;\n\tULONG\tTxErrorRatio;\n\tULONG\tAccuTxTotalCnt;\n\tULONG\tTxTotalCnt;\n\tULONG\tTxSuccess;\n\tULONG\tTxRetransmit;\n\tULONG\tTxFailCount;\n} AGS_STATISTICS_INFO, *PAGS_STATISTICS_INFO;\n\n\n/* Support AGS (Adaptive Group Switching) */\n#define SUPPORT_AGS(__pAd)\t\t((__pAd)->rateAlg == RATE_ALG_AGS)\n\n#ifdef DOT11_VHT_AC\n#define AGS_IS_USING(__pAd, __pRateTable)\t\\\n    (SUPPORT_AGS(__pAd) && \\\n     ((__pRateTable == AGS1x1HTRateTable) ||\\\n      (__pRateTable == AGS2x2HTRateTable) ||\\\n      (__pRateTable == AGS3x3HTRateTable) ||\\\n      (__pRateTable == Ags1x1VhtRateTable) ||\\\n      (__pRateTable == Ags2x2VhtRateTable))) \n#else\n#define AGS_IS_USING(__pAd, __pRateTable)\t\\\n    (SUPPORT_AGS(__pAd) && \\\n     ((__pRateTable == AGS1x1HTRateTable) || \\\n      (__pRateTable == AGS2x2HTRateTable) || \\\n      (__pRateTable == AGS3x3HTRateTable))) \n#endif /* DOT11_VHT_AC */\n\n#endif /* __AGS_H__ */\n\n"
  },
  {
    "path": "src/include/ap.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    ap.h\n\n    Abstract:\n    Miniport generic portion header file\n\n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Paul Lin    08-01-2002    created\n    James Tan   09-06-2002    modified (Revise NTCRegTable)\n    John Chang  12-22-2004    modified for RT2561/2661. merge with STA driver\n*/\n#ifndef __AP_H__\n#define __AP_H__\n\n\n\n\n/* ============================================================= */\n/*      Common definition */\n/* ============================================================= */\n#define MBSS_VLAN_INFO_GET(\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pAd, __VLAN_VID, __VLAN_Priority, __FromWhichBSSID) \t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif ((__FromWhichBSSID < __pAd->ApCfg.BssidNum) &&\t\t\t\t\t\\\n\t\t(__FromWhichBSSID < HW_BEACON_MAX_NUM) &&\t\t\t\t\t\t\\\n\t\t(__pAd->ApCfg.MBSSID[__FromWhichBSSID].VLAN_VID != 0))\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t__VLAN_VID = __pAd->ApCfg.MBSSID[__FromWhichBSSID].VLAN_VID;\t\\\n\t\t__VLAN_Priority = __pAd->ApCfg.MBSSID[__FromWhichBSSID].VLAN_Priority; \\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n/* ============================================================= */\n/*      Function Prototypes */\n/* ============================================================= */\n\n/* ap_data.c */\n\nBOOLEAN APBridgeToWirelessSta(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PUCHAR          pHeader,\n    IN  UINT            HdrLen,\n    IN  PUCHAR          pData,\n    IN  UINT            DataLen,\n    IN  ULONG           fromwdsidx);\n\nVOID RTMP_BASetup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pMacEntry,\n\tIN UINT8 UserPriority);\n\nVOID\tAPSendPackets(\n\tIN\tNDIS_HANDLE\t\tMiniportAdapterContext,\n\tIN\tPPNDIS_PACKET\tppPacketArray,\n\tIN\tUINT\t\t\tNumberOfPackets);\n\nNDIS_STATUS APSendPacket(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PNDIS_PACKET    pPacket);\n\nNDIS_STATUS APInsertPsQueue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket,\n\tIN MAC_TABLE_ENTRY *pMacEntry,\n\tIN UCHAR QueIdx);\n\nNDIS_STATUS APHardTransmit(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tUCHAR\t\t\tQueIdx);\n\nVOID APRxEAPOLFrameIndicate(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nNDIS_STATUS APCheckRxError(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RXINFO_STRUC *pRxInfo,\n\tIN UCHAR Wcid);\n\nBOOLEAN APCheckClass2Class3Error(\n    IN  PRTMP_ADAPTER   pAd,\n\tIN ULONG Wcid, \n\tIN  PHEADER_802_11  pHeader);\n\nVOID APHandleRxPsPoll(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpAddr,\n\tIN\tUSHORT\t\t\tAid,\n    IN\tBOOLEAN\t\t\tisActive);\n\nVOID    RTMPDescriptorEndianChange(\n    IN  PUCHAR          pData,\n    IN  ULONG           DescriptorType);\n    \nVOID    RTMPFrameEndianChange(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PUCHAR          pData,\n    IN  ULONG           Dir,\n    IN  BOOLEAN         FromRxDoneInt);\n\n/* ap_assoc.c */\n\nVOID APAssocStateMachineInit(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  STATE_MACHINE *S, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\n\nVOID MbssKickOutStas(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT apidx,\n\tIN USHORT Reason);\n\nVOID APMlmeKickOutSta(\n    IN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pStaAddr, \n\tIN UCHAR Wcid,\n\tIN USHORT Reason);\n\n\n\nVOID  APCls3errAction(\n    IN  PRTMP_ADAPTER   pAd, \n\tIN \tULONG Wcid,\n    IN\tPHEADER_802_11\tpHeader);\n\n/*\nVOID\tRTMPAddClientSec(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\tBssIdx,\n\tIN UCHAR\t\t KeyIdx,\n\tIN UCHAR\t\t CipherAlg,\n\tIN PUCHAR\t\t pKey,\n\tIN PUCHAR\t\t pTxMic,\n\tIN PUCHAR\t\t pRxMic,\n\tIN MAC_TABLE_ENTRY *pEntry);\n*/\n\n/* ap_auth.c */\n\nvoid APAuthStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nVOID APCls2errAction(\n    IN PRTMP_ADAPTER pAd, \n\tIN \tULONG Wcid,\n    IN\tPHEADER_802_11\tpHeader);\n\n/* ap_connect.c */\n\n#ifdef CONFIG_AP_SUPPORT\nBOOLEAN BeaconTransmitRequired(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN INT\t\t\t\tapidx,\n\tIN MULTISSID_STRUCT *pMbss);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID APMakeBssBeacon(\n    IN  PRTMP_ADAPTER   pAd,\n\tIN\tINT\t\t\t\tapidx);\n\nVOID  APUpdateBeaconFrame(\n    IN  PRTMP_ADAPTER   pAd,\n\tIN\tINT\t\t\t\tapidx);\n\nVOID APMakeAllBssBeacon(\n    IN  PRTMP_ADAPTER   pAd);\n\nVOID  APUpdateAllBeaconFrame(\n    IN  PRTMP_ADAPTER   pAd);\n\n\n/* ap_sync.c */\n\nVOID APSyncStateMachineInit(\n    IN PRTMP_ADAPTER pAd,\n    IN STATE_MACHINE *Sm,\n    OUT STATE_MACHINE_FUNC Trans[]);\n\nVOID APScanTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3);\n\nVOID APInvalidStateWhenScan(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID APScanTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID APPeerProbeReqAction(\n    IN  PRTMP_ADAPTER pAd, \n    IN  MLME_QUEUE_ELEM *Elem);\n\nVOID APPeerBeaconAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID APMlmeScanReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID APPeerBeaconAtScanAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID APScanCnclAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID ApSiteSurvey(\n\tIN\tPRTMP_ADAPTER  \t\tpAd,\n\tIN\tPNDIS_802_11_SSID\tpSsid,\n\tIN\tUCHAR\t\t\t\tScanType,\n\tIN\tBOOLEAN\t\t\t\tChannelSel);\n\nVOID SupportRate(\n\tIN PUCHAR SupRate,\n\tIN UCHAR SupRateLen,\n\tIN PUCHAR ExtRate,\n\tIN UCHAR ExtRateLen,\n\tOUT PUCHAR *Rates,\n\tOUT PUCHAR RatesLen,\n\tOUT PUCHAR pMaxSupportRate);\n\n\nBOOLEAN ApScanRunning(\n\tIN PRTMP_ADAPTER pAd);\n\t\n#ifdef DOT11N_DRAFT3\nVOID APOverlappingBSSScan(\n\tIN RTMP_ADAPTER *pAd);\n\nINT GetBssCoexEffectedChRange(\n\tIN RTMP_ADAPTER *pAd,\n\tIN BSS_COEX_CH_RANGE *pCoexChRange);\n\n#endif /* DOT11N_DRAFT3 */\n\n/* ap_wpa.c */\nVOID WpaStateMachineInit(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\n/* ap_mlme.c */\nVOID APMlmePeriodicExec(\n    IN  PRTMP_ADAPTER   pAd);\n\nBOOLEAN APMsgTypeSubst(\n    IN PRTMP_ADAPTER pAd,\n    IN PFRAME_802_11 pFrame, \n    OUT INT *Machine, \n    OUT INT *MsgType);\n\nVOID APQuickResponeForRateUpExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\n#ifdef RTMP_MAC_USB\nVOID BeaconUpdateExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n#endif /* RTMP_MAC_USB */\n\nVOID RTMPSetPiggyBack(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN BOOLEAN\t\t\tbPiggyBack);\n\nVOID APAsicEvaluateRxAnt(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID APAsicRxAntEvalTimeout(\n\tIN PRTMP_ADAPTER\tpAd);\n\n/* ap.c */\nNDIS_STATUS APInitialize(\n    IN  PRTMP_ADAPTER   pAd);\n\nVOID APShutdown(\n    IN PRTMP_ADAPTER    pAd);\n\nVOID APStartUp(\n    IN  PRTMP_ADAPTER   pAd);\n\nVOID APStop(\n    IN  PRTMP_ADAPTER   pAd);\n\nVOID APCleanupPsQueue(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PQUEUE_HEADER   pQueue);\n\n\nVOID MacTableMaintenance(\n    IN PRTMP_ADAPTER pAd);\n\nUINT32 MacTableAssocStaNumGet(\n\tIN PRTMP_ADAPTER pAd);\n\nMAC_TABLE_ENTRY *APSsPsInquiry(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PUCHAR          pAddr, \n    OUT SST             *Sst, \n    OUT USHORT          *Aid,\n    OUT UCHAR           *PsMode,\n    OUT UCHAR           *Rate); \n\nBOOLEAN APPsIndicate(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PUCHAR          pAddr, \n\tIN ULONG Wcid, \n    IN  UCHAR           Psm);\n\n#ifdef SYSTEM_LOG_SUPPORT\nVOID ApLogEvent(\n    IN PRTMP_ADAPTER    pAd,\n    IN PUCHAR           pAddr,\n    IN USHORT           Event);\n#else\n#define ApLogEvent(_pAd, _pAddr, _Event)\n#endif /* SYSTEM_LOG_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\nVOID APUpdateOperationMode(\n    IN PRTMP_ADAPTER pAd);\n#endif /* DOT11_N_SUPPORT */\n\nVOID APUpdateCapabilityAndErpIe(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN ApCheckAccessControlList(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR        pAddr,\n\tIN UCHAR         Apidx);\n\nVOID ApUpdateAccessControlList(\n    IN PRTMP_ADAPTER pAd,\n    IN UCHAR         Apidx);\n\nVOID ApEnqueueNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR        pAddr,\n\tIN UCHAR         TxRate,\n\tIN UCHAR         PID,\n\tIN UCHAR         apidx,\n    IN BOOLEAN       bQosNull,\n    IN BOOLEAN       bEOSP,\n    IN UCHAR         OldUP);\n\n/* ap_sanity.c */\n\n\nBOOLEAN PeerAssocReqCmmSanity(\n    IN PRTMP_ADAPTER pAd, \n\tIN BOOLEAN isRessoc,\n    IN VOID *Msg, \n    IN INT MsgLen,\n    IN IE_LISTS *ie_lists);\n\n\nBOOLEAN PeerDisassocReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT\tUINT16\t*SeqNum,\n    OUT USHORT *Reason);\n\nBOOLEAN PeerDeauthReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n   \tOUT\tUINT16\t*SeqNum,    \n    OUT USHORT *Reason);\n\nBOOLEAN APPeerAuthSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n\tOUT PUCHAR pAddr1, \n    OUT PUCHAR pAddr2, \n    OUT USHORT *Alg, \n    OUT USHORT *Seq, \n    OUT USHORT *Status, \n    OUT CHAR *ChlgText\n\t);\n\n\n#ifdef DOT1X_SUPPORT\n/* ap_cfg.h */\nINT\tSet_OwnIPAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_EAPIfName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_PreAuthIfName_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n/* Define in ap.c */\nBOOLEAN DOT1X_InternalCmdAction(\n    IN  PRTMP_ADAPTER\tpAd,\n    IN  MAC_TABLE_ENTRY *pEntry,\n    IN\tUINT8\t\t\tcmd);\n\nBOOLEAN DOT1X_EapTriggerAction(\n    IN  PRTMP_ADAPTER\tpAd,\n    IN  MAC_TABLE_ENTRY *pEntry);\n#endif /* DOT1X_SUPPORT */\n#endif  /* __AP_H__ */\n\nVOID AP_E2PROM_IOCTL_PostCtrl(\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tPSTRING\t\t\t\t\tmsg);\n\nVOID IAPP_L2_UpdatePostCtrl(\n\tIN PRTMP_ADAPTER\tpAd,\n    IN UINT8 *mac_p,\n    IN INT  bssid);\n"
  },
  {
    "path": "src/include/ap_apcli.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    ap_apcli.h\n\n    Abstract:\n    Support AP-Client function.\n\n    Revision History:\n    Who               When            What\n    --------------    ----------      ----------------------------------------------\n    Shiang, Fonchi    02-13-2007      created\n*/\n\n#ifndef _AP_APCLI_H_\n#define _AP_APCLI_H_\n\n#ifdef APCLI_SUPPORT\n\n#include \"rtmp.h\"\n  \n#define AUTH_TIMEOUT\t300         /* unit: msec */\n#define ASSOC_TIMEOUT\t300         /* unit: msec */\n/*#define JOIN_TIMEOUT\t2000        // unit: msec // not used in Ap-client mode, remove it */\n#define PROBE_TIMEOUT\t1000        /* unit: msec */\n  \n#define APCLI_ROOT_BSSID_GET(pAd, wcid) ((pAd)->MacTab.Content[(wcid)].Addr)\n\n/* sanity check for apidx */\n#define APCLI_MR_APIDX_SANITY_CHECK(idx) \\\n{ \\\n\tif ((idx) >= MAX_APCLI_NUM) \\\n\t{ \\\n\t\t(idx) = 0; \\\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s> Error! apcli-idx > MAX_APCLI_NUM!\\n\", __FUNCTION__)); \\\n\t} \\\n}\n\ntypedef struct _APCLI_MLME_JOIN_REQ_STRUCT {\n\tUCHAR\tBssid[MAC_ADDR_LEN];\n\tUCHAR\tSsidLen;\n\tUCHAR\tSsid[MAX_LEN_OF_SSID];\n} APCLI_MLME_JOIN_REQ_STRUCT;\n\ntypedef struct _STA_CTRL_JOIN_REQ_STRUCT {\n\tUSHORT\tStatus;\n} APCLI_CTRL_MSG_STRUCT, *PSTA_CTRL_MSG_STRUCT;\n\nBOOLEAN isValidApCliIf(\n\tSHORT ifIndex);\n\n/* */\n/* Private routines in apcli_ctrl.c */\n/* */\nVOID ApCliCtrlStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[]);\n\n/* */\n/* Private routines in apcli_sync.c */\n/* */\nVOID ApCliSyncStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\n/* */\n/* Private routines in apcli_auth.c */\n/* */\nVOID ApCliAuthStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\n/* */\n/* Private routines in apcli_assoc.c */\n/* */\nVOID ApCliAssocStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nMAC_TABLE_ENTRY *ApCliTableLookUpByWcid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR wcid,\n\tIN PUCHAR pAddrs);\n\n\nBOOLEAN ApCliAllowToSendPacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET pPacket,\n\tOUT UCHAR\t\t*pWcid);\n\t\nBOOLEAN \tApCliValidateRSNIE(\n\tIN\t\tPRTMP_ADAPTER\tpAd, \n\tIN \t\tPEID_STRUCT    \tpEid_ptr,\n\tIN\t\tUSHORT\t\t\teid_len,\n\tIN\t\tUSHORT\t\t\tidx);\n\n\nVOID ApCli_Remove(\n\tIN PRTMP_ADAPTER \tpAd);\n\nVOID RT28xx_ApCli_Close(\n\tIN PRTMP_ADAPTER \tpAd);\n\n\n\nINT ApCliIfLookUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr);\n\n\nINT ApCli_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET\t\tskb_p, \n\tIN PNET_DEV\t\t\tdev_p);\n\nINT ApCli_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tdev_p,\n\tIN OUT VOID \t\t\t*rq_p,\n\tIN INT cmd);\n\n\t\nVOID ApCliMgtMacHeaderInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN OUT PHEADER_802_11 pHdr80211, \n    IN UCHAR SubType, \n    IN UCHAR ToDs, \n    IN PUCHAR pDA, \n    IN PUCHAR pBssid,\n    IN USHORT ifIndex);\n\n#ifdef DOT11_N_SUPPORT\nBOOLEAN ApCliCheckHt(\n\tIN\t\tPRTMP_ADAPTER \t\tpAd,\n\tIN\t\tUSHORT \t\t\t\tIfIndex,\n\tIN OUT\tHT_CAPABILITY_IE \t*pHtCapability,\n\tIN OUT\tADD_HT_INFO_IE \t\t*pAddHtInfo);\n#endif /* DOT11_N_SUPPORT */\n\nBOOLEAN ApCliLinkUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR ifIndex);\n\nVOID ApCliLinkDown(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR ifIndex);\n\nVOID ApCliIfUp(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ApCliIfDown(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ApCliIfMonitor(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN ApCliMsgTypeSubst(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType);\n\nBOOLEAN preCheckMsgTypeSubset(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType);\n\nBOOLEAN ApCliPeerAssocRspSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pStatus, \n    OUT USHORT *pAid, \n#ifdef P2P_SUPPORT\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement,\n#endif /* P2P_SUPPORT */\n    OUT UCHAR SupRate[], \n    OUT UCHAR *pSupRateLen,\n    OUT UCHAR ExtRate[], \n    OUT UCHAR *pExtRateLen,\n    OUT HT_CAPABILITY_IE *pHtCapability,\n    OUT ADD_HT_INFO_IE *pAddHtInfo,\t/* AP might use this additional ht info IE */\n    OUT UCHAR *pHtCapabilityLen,\n    OUT UCHAR *pAddHtInfoLen,\n    OUT UCHAR *pNewExtChannelOffset,\n    OUT PEDCA_PARM pEdcaParm,\n    OUT UCHAR *pCkipFlag);\n\nVOID\tApCliPeerPairMsg1Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem);\n\nVOID\tApCliPeerPairMsg3Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem);\n\nVOID\tApCliPeerGroupMsg1Action(\n\tIN PRTMP_ADAPTER    pAd, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem);\n\nBOOLEAN ApCliCheckRSNIE(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pData,\n\tIN  UCHAR           DataLen,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tOUT\tUCHAR\t\t\t*Offset);\n\nBOOLEAN ApCliParseKeyData(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pKeyData,\n\tIN  UCHAR           KeyDataLen,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN\tUCHAR\t\t\tIfIdx,\n\tIN\tUCHAR\t\t\tbPairewise);\n\nBOOLEAN  ApCliHandleRxBroadcastFrame(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nVOID APCliInstallPairwiseKey(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  MAC_TABLE_ENTRY *pEntry);\n\nBOOLEAN APCliInstallSharedKey(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pKey,\n\tIN  UCHAR           KeyLen,\n\tIN\tUCHAR\t\t\tDefaultKeyIdx,\n\tIN  MAC_TABLE_ENTRY *pEntry);\n\nVOID ApCliUpdateMlmeRate(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID APCli_Init(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tRTMP_OS_NETDEV_OP_HOOK\t\t*pNetDevOps);\n\nBOOLEAN ApCli_Open(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPNET_DEV\t\t\tdev_p);\n\nBOOLEAN ApCli_Close(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNET_DEV\t\tdev_p);\n\nBOOLEAN ApCliWaitProbRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT ifIndex);\n\n#endif /* APCLI_SUPPORT */\n\n#endif /* _AP_APCLI_H_ */\n\n"
  },
  {
    "path": "src/include/ap_autoChSel.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Abstract:\n\n\n */\n\n#include \"ap_autoChSel_cmm.h\"\n\n#ifndef __AUTOCHSELECT_H__\n#define __AUTOCHSELECT_H__\n\n#define AP_AUTO_CH_SEL(__P, __O)\tAPAutoSelectChannel((__P), (__O))\n\nULONG AutoChBssSearchWithSSID(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR Bssid,\n\tIN PUCHAR pSsid,\n\tIN UCHAR SsidLen,\n\tIN UCHAR Channel);\n\nVOID APAutoChannelInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID UpdateChannelInfo(\n\tIN PRTMP_ADAPTER pAd,\n\tIN int ch,\n\tIN ChannelSel_Alg Alg);\n\nULONG AutoChBssInsertEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pBssid,\n\tIN CHAR Ssid[],\n\tIN UCHAR SsidLen, \n\tIN UCHAR ChannelNo,\n\tIN UCHAR ExtChOffset,\n\tIN CHAR Rssi);\n\nVOID AutoChBssTableInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ChannelInfoInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID AutoChBssTableDestroy(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ChannelInfoDestroy(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID CheckPhyModeIsABand(\n\tIN PRTMP_ADAPTER pAd);\n\nUCHAR SelectBestChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ChannelSel_Alg Alg);\n\nUCHAR APAutoSelectChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ChannelSel_Alg Alg);\n\n#endif /* __AUTOCHSELECT_H__ */\n\n"
  },
  {
    "path": "src/include/ap_autoChSel_cmm.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Abstract:\n\n\n */\n\n\n#ifndef __AUTOCHSELECT_CMM_H__\n#define __AUTOCHSELECT_CMM_H__\n\n#define RSSI_TO_DBM_OFFSET 120 /* RSSI-115 = dBm */\n\n\ntypedef struct {\n\tULONG dirtyness[MAX_NUM_OF_CHANNELS+1];\n\tULONG ApCnt[MAX_NUM_OF_CHANNELS+1];\n\tUINT32 FalseCCA[MAX_NUM_OF_CHANNELS+1];\n    BOOLEAN SkipList[MAX_NUM_OF_CHANNELS+1];\n#ifdef AP_QLOAD_SUPPORT\n\tUINT32 chanbusytime[MAX_NUM_OF_CHANNELS+1]; /* QLOAD ALARM */\n#endif /* AP_QLOAD_SUPPORT */\n        BOOLEAN IsABand;\n} CHANNELINFO, *PCHANNELINFO;\n\ntypedef struct {\n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tUCHAR SsidLen;\n\tCHAR Ssid[MAX_LEN_OF_SSID];\n\tUCHAR Channel;\n\tUCHAR ExtChOffset;\n\tCHAR Rssi;\n} BSSENTRY, *PBSSENTRY;\n\ntypedef struct {\n\tUCHAR BssNr;\n\tBSSENTRY BssEntry[MAX_LEN_OF_BSS_TABLE];\t\n} BSSINFO, *PBSSINFO;\n\ntypedef enum ChannelSelAlg\n{\n\tChannelAlgRandom, /*use by Dfs */\n\tChannelAlgApCnt,\n\tChannelAlgCCA\n} ChannelSel_Alg;\n\n#endif /* __AUTOCHSELECT_CMM_H__ */\n\n"
  },
  {
    "path": "src/include/ap_cfg.h",
    "content": "#ifndef __AP_CFG_H__\n#define __AP_CFG_H__\n\n\n#include \"rt_config.h\"\n\nINT RTMPAPPrivIoctlSet(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr);\n\nINT RTMPAPPrivIoctlShow(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr);\n\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\nINT RTMPAPPrivIoctlAR9Show(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr);\n\nVOID RTMPAR9IoctlGetMacTable(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlGetSTAT2(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlGetRadioDynInfo(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n#endif /*AR9_MAPI_SUPPORT*/\n#endif/* INF_AR9 */\n\nINT RTMPAPSetInformation(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tOUT\tRTMP_IOCTL_INPUT_STRUCT\t*rq,\n\tIN\tINT\t\t\t\tcmd);\n\nINT RTMPAPQueryInformation(\n\tIN\tPRTMP_ADAPTER       pAd,\n\tIN\tOUT\tRTMP_IOCTL_INPUT_STRUCT    *rq,\n\tIN\tINT                 cmd);\n\t\nVOID RTMPIoctlStatistics(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\n\nVOID RTMPIoctlGetMacTable(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\n\nVOID RTMPAPIoctlE2PROM(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  RTMP_IOCTL_INPUT_STRUCT    *wrq);\n\n#ifdef DBG\nVOID RTMPAPIoctlBBP(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  RTMP_IOCTL_INPUT_STRUCT    *wrq);\n\nVOID RTMPAPIoctlMAC(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  RTMP_IOCTL_INPUT_STRUCT    *wrq);\n\n\n#endif /* DBG */\n\nVOID RtmpDrvMaxRateGet(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n/*\tIN\tPHTTRANSMIT_SETTING\t\tpHtPhyMode, */\n\tIN\tUINT8\t\t\t\t\tMODE,\n\tIN\tUINT8\t\t\t\t\tShortGI,\n\tIN\tUINT8\t\t\t\t\tBW,\n\tIN\tUINT8\t\t\t\t\tMCS,\n\tOUT\tUINT32\t\t\t\t\t*pRate);\n\n#ifdef WSC_AP_SUPPORT\nVOID RTMPIoctlWscProfile(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlWscProfile(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n/*add by woody */\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\nVOID RTMPAR9IoctlWscProfile(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlWscPINCode(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\n\nVOID RTMPIoctlWscStatus(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlGetWscDynInfo(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nVOID RTMPIoctlGetWscRegsDynInfo(\n\tIN PRTMP_ADAPTER pAdapter, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n#endif/*AR9_MAPI_SUPPORT*/\n#endif/* INF_AR9 */\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\nVOID RTMPIoctlQueryBaTable(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\nVOID RTMPIoctlStaticWepCopy(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq);\n\nVOID RTMPIoctlRadiusData(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT\t\t*wrq);\n\nVOID RTMPIoctlAddWPAKey(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq);\n\nVOID RTMPIoctlAddPMKIDCache(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq);\n\nVOID RTMPIoctlSetIdleTimeout(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq);\n#endif /* DOT1X_SUPPORT */\n\nINT\tApCfg_Set_AuthMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tINT\t\t\t\tapidx,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tApCfg_Set_MaxStaNum_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN INT\t\t\t\tapidx,\n\tIN PSTRING \t\t\targ);\n\nINT\tApCfg_Set_IdleTimeout_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\nVOID RTMPApCliAddKey(\n\tIN\tPRTMP_ADAPTER\t    pAd, \n\tIN \tINT\t\t\t\tapidx,\n\tIN\tPNDIS_APCLI_802_11_KEY    pApcliKey);\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n#endif /* APCLI_SUPPORT */\n#endif /* __AP_CFG_H__ */\n\n"
  },
  {
    "path": "src/include/ap_diversity.h",
    "content": "/***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tap_diversity.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho \t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------\n\tYY Huang\t06-10-2008\t\tInit for RT3052.\n*/\n\n#ifndef _AP_DIVERSITY_H_\n#define _AP_DIVERSITY_H_\n\n#include \"rtmp.h\"\n\n#define ADDBGPRINT(format,args...)\tdo{if(atomic_read(&DEBUG_VERBOSE_MODE))\tprintk( format, ##args);}while(0)\n#define PROC_DIR\t\"AntDiv\"\n\n/*\n *  For shorter udelay().\n *  (ripped from rtmp.h)\n */\n/*#define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)    {} */\n/* Read BBP register by register's ID. Generate PER to test BA */\n#define RTMP_BBP_IO_READ8_BY_REG_ID_SHORT_DELAY(_A, _I, _pV)\t\t\\\n{\t\t\t\t\t\t\t\t\t\\\n\tBBP_CSR_CFG_STRUC  BbpCsr;\t\t\t\t\t\\\n\tint\ti, k;\t\t\t\t\t\t\t\\\n\tif ((_A)->bPCIclkOff == FALSE)                     \t\t\\\n\t{                                                   \t\t\\\n\t\tfor (i=0; i<MAX_BUSY_COUNT; i++)                    \t\\\n\t\t{                                                   \t\\\n\t\t\tRTMP_IO_READ32(_A, H2M_BBP_AGENT, &BbpCsr.word);\\\n\t\t\tif (BbpCsr.field.Busy == BUSY)\t\t\t\\\n\t\t\t\tcontinue;                               \\\n\t\t\tBbpCsr.word = 0;                                \\\n\t\t\tBbpCsr.field.fRead = 1;                         \\\n\t\t\tBbpCsr.field.BBP_RW_MODE = 1;                   \\\n\t\t\tBbpCsr.field.Busy = 1;                          \\\n\t\t\tBbpCsr.field.RegNum = _I;                       \\\n\t\t\tRTMP_IO_WRITE32(_A, H2M_BBP_AGENT, BbpCsr.word);\\\n\t\t\tAsicSendCommandToMcu(_A, 0x80, 0xff, 0x0, 0x0, FALSE);\t\\\n\t\t\tRTMPusecDelay(10);\t\t\t\t\\\n\t\t\tfor (k=0; k<MAX_BUSY_COUNT; k++)\t\t\\\n\t\t\t{                                               \\\n\t\t\t\tRTMP_IO_READ32(_A, H2M_BBP_AGENT, &BbpCsr.word);\t\t\t\\\n\t\t\t\tif (BbpCsr.field.Busy == IDLE)          \\\n\t\t\t\t\tbreak;                          \\\n\t\t\t\telse\t\t\t\t\t\\\n\t\t\t\t\tprintk(\"MCU busy\\n\");\t\t\\\n\t\t\t}                                               \\\n\t\t\tif ((BbpCsr.field.Busy == IDLE) &&              \\\n\t\t\t\t(BbpCsr.field.RegNum == _I))            \\\n\t\t\t{                                               \\\n\t\t\t\t*(_pV) = (UCHAR)BbpCsr.field.Value;     \\\n\t\t\t\tbreak;                                  \\\n\t\t\t}                                               \\\n\t\t}                                                   \t\\\n\t\tif (BbpCsr.field.Busy == BUSY)                      \t\\\n\t\t{                                                   \t\\\n\t\t\tDBGPRINT_ERR((\"BBP read R%d=0x%x fail\\n\", _I, BbpCsr.word));\t\\\n\t\t\t*(_pV) = (_A)->BbpWriteLatch[_I];               \\\n\t\t\tRTMP_IO_READ32(_A, H2M_BBP_AGENT, &BbpCsr.word);\\\n\t\t\tBbpCsr.field.Busy = 0;                          \\\n\t\t\tRTMP_IO_WRITE32(_A, H2M_BBP_AGENT, BbpCsr.word);\\\n\t\t}                                                   \\\n\t}                   \\\n}\n\n\n/*\n * proc fs related macros.\n */\n#define CREATE_PROC_ENTRY(x)\t\\\n\tif ((pProc##x = create_proc_entry(#x, 0, pProcDir))){\t\t\\\n\t\tpProc##x->read_proc = (read_proc_t*)&x##Read;\t\t\\\n\t\tpProc##x->write_proc = (write_proc_t*)&x##Write;\t\\\n\t}\t\t\t\t\t\t\t\t\\\n\n#define IMPLEMENT_PROC_ENTRY(x,y,z)\t\t\t\\\nstatic struct proc_dir_entry *pProc##x;\t\t\t\\\nIMPLEMENT_PROC_ENTRY_READ(x,y,z)\t\t\t\\\nIMPLEMENT_PROC_ENTRY_WRITE(x,y,z)\n\n#define IMPLEMENT_PROC_ENTRY_READ(x,y,z)\t\t\\\nstatic INT x##Read(char *page, char **start, off_t off,\t\\\n\t\t   int count, int *eof, void *data){\t\\\n\tINT\tlen;\t\t\t\t\t\\\n\tsprintf(page, \"%d\\n\", atomic_read(&x));\t\t\\\n\tlen = strlen(page) + 1;\t\t\t\t\\\n\t*eof = 1;\t\t\t\t\t\\\n\treturn len;\t\t\t\t\t\\\n}\n#define IMPLEMENT_PROC_ENTRY_WRITE(x,y,z)\t\t\\\nstatic INT x##Write(struct file *file, const char *buffer, \\\n\t\t\t unsigned long count, void *data){ \\\n\tCHAR tmp[32];INT tmp_val;\t\t\t\\\n\tif (count > 32)\tcount = 32;\t\t\t\\\n\tmemset(tmp, 0, 32);\t\t\t\t\\\n\tif (copy_from_user(tmp, buffer, count))\t\t\\\n\t\treturn -EFAULT;\t\t\t\t\\\n\ttmp_val = simple_strtol(tmp, 0, 10);\t\t\\\n\tif(tmp_val > z || tmp_val < y)\t\t\t\\\n\t\treturn -EFAULT;\t\t\t\t\\\n\tatomic_set(&x,  (int)tmp_val);\t\t\t\\\n\treturn count;\t\t\t\t\t\\\n}\n#define DESTORY_PROC_ENTRY(x) if (pProc##x)\tremove_proc_entry(#x, pProcDir);\n\n/*\n * function prototype\n */\nVOID RT3XXX_AntDiversity_Init(\n    IN RTMP_ADAPTER *pAd);\n\nVOID RT3XXX_AntDiversity_Fini(\n    IN RTMP_ADAPTER *pAd);\n\nVOID AntDiversity_Update_Rssi_Sample(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RSSI_SAMPLE *pRssi,\n\tIN RXWI_STRUC *pRxWI);\n                        \n\n#endif\n"
  },
  {
    "path": "src/include/ap_ids.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n     \n     Module Name:\n     ap_ids.c\n     \n     Abstract:\n     IDS definition\n     \n     Revision History:\n     Who         When          What\n     --------    ----------    ----------------------------------------------\n */\n\nVOID RTMPIdsPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nBOOLEAN RTMPSpoofedMgmtDetection(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PHEADER_802_11 \tpHeader,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2,\n\tIN UCHAR\t\t\tAntSel);\n\nVOID RTMPConflictSsidDetection(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PUCHAR\t\t\tpSsid,\n\tIN UCHAR\t\t\tSsidLen,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2,\n\tIN UCHAR\t\t\tAntSel);\n\nBOOLEAN RTMPReplayAttackDetection(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PUCHAR\t\t\tpAddr2,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2,\n\tIN UCHAR\t\t\tAntSel,\n\tIN UCHAR\t\t\tBW);\n\nVOID RTMPUpdateStaMgmtCounter(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN USHORT\t\t\ttype);\n\nVOID RTMPClearAllIdsCounter(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID RTMPIdsStart(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID RTMPIdsStop(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID rtmp_read_ids_from_file(\n\t\t\tIN  PRTMP_ADAPTER pAd,\n\t\t\tchar *tmpbuf,\n\t\t\tchar *buffer);\n\n"
  },
  {
    "path": "src/include/ap_mbss.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    ap_mbss.h\n\n    Abstract:\n    Support multi-BSS function.\n\n    Revision History:\n    Who         When            What\n    --------    ----------      ----------------------------------------------\n    Sample Lin  01-02-2007      created\n*/\n\n#ifndef MODULE_MBSS\n\n#define MBSS_EXTERN    extern\n\n#else\n\n#define MBSS_EXTERN\n\n#endif /* MODULE_MBSS */\n\n\n/*\n\tFor MBSS, the phy mode is different;\n\tSo MBSS_PHY_MODE_RESET() can help us to adjust the correct mode &\n\tmaximum MCS for the BSS.\n*/\n#define MBSS_PHY_MODE_RESET(__BssId, __HtPhyMode)\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUCHAR __PhyMode = pAd->ApCfg.MBSSID[__BssId].PhyMode;\t\\\n\t\tif ((__PhyMode == WMODE_B) &&\t\t\t\t\t\t\t\\\n\t\t\t(__HtPhyMode.field.MODE != MODE_CCK))\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t__HtPhyMode.field.MODE = MODE_CCK;\t\t\t\t\t\\\n\t\t\t__HtPhyMode.field.MCS = 3;\t\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse if ((!WMODE_CAP_N(__PhyMode)) &&\t\t\t\t\t\t\\\n\t\t\t\t(__PhyMode != WMODE_B) &&\t\t\t\t\t\t\\\n\t\t\t\t(__HtPhyMode.field.MODE != MODE_OFDM))\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t__HtPhyMode.field.MODE = MODE_OFDM;\t\t\t\t\t\\\n\t\t\t__HtPhyMode.field.MCS = 7;\t\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\n\n\n/* Public function list */\nINT\tShow_MbssInfo_Display_Proc(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tPSTRING\t\t\t\t\t\targ);\n\nVOID MBSS_Init(\n\tIN PRTMP_ADAPTER\t\t\t\tpAd,\n\tIN RTMP_OS_NETDEV_OP_HOOK\t\t*pNetDevOps);\n\nVOID MBSS_Remove(\n\tIN PRTMP_ADAPTER\t\t\t\tpAd);\n\nINT MBSS_Open(\n\tIN\tPNET_DEV\t\t\t\t\tpDev);\n\nINT MBSS_Close(\n\tIN\tPNET_DEV\t\t\t\t\tpDev);\n\nINT32 RT28xx_MBSS_IdxGet(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNET_DEV\t\t\tpDev);\n\n"
  },
  {
    "path": "src/include/br_ftph.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll Bridge Fast Path Related Structure & Definition.\n\n***************************************************************************/\n\n#ifndef __BR_FTPH_H__\n#define __BR_FTPH_H__\n\n/* Public function prototype */\n/*\n========================================================================\nRoutine Description:\n\tInit bridge fast path module.\n\nArguments:\n\tNone\n\nReturn Value:\n\tNone\n\nNote:\n\tUsed in module init.\n========================================================================\n*/\nVOID BG_FTPH_Init(VOID);\n\n/*\n========================================================================\nRoutine Description:\n\tRemove bridge fast path module.\n\nArguments:\n\tNone\n\nReturn Value:\n\tNone\n\nNote:\n\tUsed in module remove.\n========================================================================\n*/\nVOID BG_FTPH_Remove(VOID);\n\n/*\n========================================================================\nRoutine Description:\n\tForward the received packet.\n\nArguments:\n\tpPacket\t\t\t- the received packet\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUINT32 BG_FTPH_PacketFromApHandle(\n\tIN\t\tPNDIS_PACKET\tpPacket);\n\n#endif /* __BR_FTPH_H__ */\n\n/* End of br_ftph.h */\n\n"
  },
  {
    "path": "src/include/cfg80211.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll MAC80211/CFG80211 Related Structure & Definition.\n\n***************************************************************************/\n\n#ifdef RT_CFG80211_SUPPORT\n\n#include <linux/ieee80211.h>\n\ntypedef struct __CFG80211_CB {\n\n\t/* we can change channel/rate information on the fly so we backup them */\n\tstruct ieee80211_supported_band Cfg80211_bands[IEEE80211_NUM_BANDS];\n\tstruct ieee80211_channel *pCfg80211_Channels;\n\tstruct ieee80211_rate *pCfg80211_Rates;\n\n\t/* used in wiphy_unregister */\n\tstruct wireless_dev *pCfg80211_Wdev;\n\n\t/* used in scan end */\n\tstruct cfg80211_scan_request *pCfg80211_ScanReq;\n\n\t/* monitor filter */\n\tUINT32 MonFilterFlag;\n\n\t/* channel information */\n\tstruct ieee80211_channel ChanInfo[MAX_NUM_OF_CHANNELS];\n} CFG80211_CB;\n\n\n\n\n/*\n========================================================================\nRoutine Description:\n\tRegister MAC80211 Module.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpDev\t\t\t- Generic device interface\n\tpNetDev\t\t\t- Network device\n\nReturn Value:\n\tNONE\n\nNote:\n\tpDev != pNetDev\n\t#define SET_NETDEV_DEV(net, pdev)\t((net)->dev.parent = (pdev))\n\n\tCan not use pNetDev to replace pDev; Or kernel panic.\n========================================================================\n*/\nBOOLEAN CFG80211_Register(\n\tVOID\t\t\t\t\t\t*pAd,\n\tstruct device\t\t\t\t*pDev,\n\tstruct net_device\t\t\t*pNetDev);\n\n\n#endif /* RT_CFG80211_SUPPORT */\n\n/* End of cfg80211.h */\n"
  },
  {
    "path": "src/include/cfg80211extr.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll MAC80211/CFG80211 Function Prototype.\n\n***************************************************************************/\n\n#ifdef RT_CFG80211_SUPPORT\n\n#define RT_CFG80211_REGISTER(__pDev, __pNetDev)\t\t\t\t\t\t\t\t\\\n\tCFG80211_Register(__pDev, __pNetDev);\n\n#define RT_CFG80211_BEACON_CR_PARSE(__pAd, __pVIE, __LenVIE)\t\t\t\t\\\n\tCFG80211_BeaconCountryRegionParse((VOID *)__pAd, __pVIE, __LenVIE);\n\n#define RT_CFG80211_CRDA_REG_HINT(__pAd, __pCountryIe, __CountryIeLen)\t\t\\\n\tCFG80211_RegHint((VOID *)__pAd, __pCountryIe, __CountryIeLen);\n\n#define RT_CFG80211_CRDA_REG_HINT11D(__pAd, __pCountryIe, __CountryIeLen)\t\\\n\tCFG80211_RegHint11D((VOID *)__pAd, __pCountryIe, __CountryIeLen);\n\n#define RT_CFG80211_CRDA_REG_RULE_APPLY(__pAd)\t\t\t\t\t\t\t\t\\\n\tCFG80211_RegRuleApply((VOID *)__pAd, NULL, __pAd->Cfg80211_Alpha2);\n\n#define RT_CFG80211_SCANNING_INFORM(__pAd, __BssIdx, __ChanId, __pFrame,\t\\\n\t\t\t__FrameLen, __RSSI)\t\t\t\t\t\t\t\t\t\\\n\tCFG80211_Scaning((VOID *)__pAd, __BssIdx, __ChanId, __pFrame,\t\t\t\\\n\t\t\t\t\t\t__FrameLen, __RSSI);\n\n#define RT_CFG80211_SCAN_END(__pAd, __FlgIsAborted)\t\t\t\t\t\t\t\\\n\tCFG80211_ScanEnd((VOID *)__pAd, __FlgIsAborted);\n\n#define RT_CFG80211_REINIT(__pAd)\t\t\t\t\t\t\t\t\t\t\t\\\n\tCFG80211_SupBandReInit((VOID *)__pAd);\t\t\t\t\t\t\t\t\t\\\n\n#define RT_CFG80211_CONN_RESULT_INFORM(__pAd, __pBSSID, __pReqIe, __ReqIeLen,\\\n\t\t\t__pRspIe, __RspIeLen, __FlgIsSuccess)\t\t\t\t\t\t\t\\\n\tCFG80211_ConnectResultInform((VOID *)__pAd, __pBSSID,\t\t\t\t\t\\\n\t\t\t__pReqIe, __ReqIeLen, __pRspIe, __RspIeLen, __FlgIsSuccess);\n\n#define RT_CFG80211_RFKILL_STATUS_UPDATE(_pAd, _active) \\\n\tCFG80211_RFKillStatusUpdate(_pAd, _active);\n\n#ifdef SINGLE_SKU\n#define CFG80211_BANDINFO_FILL(__pAd, __pBandInfo)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t(__pBandInfo)->RFICType = __pAd->RFICType;\t\t\t\t\t\t\t\t\\\n\t(__pBandInfo)->MpduDensity = __pAd->CommonCfg.BACapability.field.MpduDensity;\\\n\t(__pBandInfo)->TxStream = __pAd->CommonCfg.TxStream;\t\t\t\t\t\\\n\t(__pBandInfo)->RxStream = __pAd->CommonCfg.RxStream;\t\t\t\t\t\\\n\t(__pBandInfo)->MaxTxPwr = __pAd->CommonCfg.DefineMaxTxPwr;\t\t\t\t\\\n\tif (WMODE_EQUAL(__pAd->CommonCfg.PhyMode, WMODE_B))\t\t\t\t\\\n\t\t(__pBandInfo)->FlgIsBMode = TRUE;\t\t\t\t\t\t\t\t\t\\\n\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(__pBandInfo)->FlgIsBMode = FALSE;\t\t\t\t\t\t\t\t\t\\\n\t(__pBandInfo)->MaxBssTable = MAX_LEN_OF_BSS_TABLE;\t\t\t\t\t\t\\\n\t(__pBandInfo)->RtsThreshold = pAd->CommonCfg.RtsThreshold;\t\t\t\t\\\n\t(__pBandInfo)->FragmentThreshold = pAd->CommonCfg.FragmentThreshold;\t\\\n\t(__pBandInfo)->RetryMaxCnt = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(__pAd, TX_RTY_CFG, &((__pBandInfo)->RetryMaxCnt));\t\t\\\n}\n#else\n#define CFG80211_BANDINFO_FILL(__pAd, __pBandInfo)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t(__pBandInfo)->RFICType = __pAd->RFICType;\t\t\t\t\t\t\t\t\\\n\t(__pBandInfo)->MpduDensity = __pAd->CommonCfg.BACapability.field.MpduDensity;\\\n\t(__pBandInfo)->TxStream = __pAd->CommonCfg.TxStream;\t\t\t\t\t\\\n\t(__pBandInfo)->RxStream = __pAd->CommonCfg.RxStream;\t\t\t\t\t\\\n\t(__pBandInfo)->MaxTxPwr = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (WMODE_EQUAL(__pAd->CommonCfg.PhyMode, WMODE_B))\t\t\t\t\\\n\t\t(__pBandInfo)->FlgIsBMode = TRUE;\t\t\t\t\t\t\t\t\t\\\n\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(__pBandInfo)->FlgIsBMode = FALSE;\t\t\t\t\t\t\t\t\t\\\n\t(__pBandInfo)->MaxBssTable = MAX_LEN_OF_BSS_TABLE;\t\t\t\t\t\t\\\n\t(__pBandInfo)->RtsThreshold = pAd->CommonCfg.RtsThreshold;\t\t\t\t\\\n\t(__pBandInfo)->FragmentThreshold = pAd->CommonCfg.FragmentThreshold;\t\\\n\t(__pBandInfo)->RetryMaxCnt = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_READ32(__pAd, TX_RTY_CFG, &((__pBandInfo)->RetryMaxCnt));\t\t\\\n}\n#endif /* SINGLE_SKU */\n\n\n/* utilities used in DRV module */\nINT CFG80211DRV_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData);\n\nBOOLEAN CFG80211DRV_OpsSetChannel(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nBOOLEAN CFG80211DRV_OpsChgVirtualInf(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pFlgFilter,\n\tUINT8\t\t\t\t\t\tIfType);\n\nBOOLEAN CFG80211DRV_OpsScan(\n\tVOID\t\t\t\t\t\t*pAdOrg);\n\nBOOLEAN CFG80211DRV_OpsJoinIbss(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nBOOLEAN CFG80211DRV_OpsLeave(\n\tVOID\t\t\t\t\t\t*pAdOrg);\n\nBOOLEAN CFG80211DRV_StaGet(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nBOOLEAN CFG80211DRV_Connect(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nBOOLEAN CFG80211DRV_KeyAdd(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nVOID CFG80211DRV_RegNotify(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nVOID CFG80211DRV_SurveyGet(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nVOID CFG80211DRV_PmkidConfig(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData);\n\nVOID CFG80211_RegHint(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UCHAR\t\t\t\t\t*pCountryIe,\n\tIN ULONG\t\t\t\t\tCountryIeLen);\n\nVOID CFG80211_RegHint11D(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UCHAR\t\t\t\t\t*pCountryIe,\n\tIN ULONG\t\t\t\t\tCountryIeLen);\n\nVOID CFG80211_ScanEnd(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN BOOLEAN\t\t\t\t\tFlgIsAborted);\n\nVOID CFG80211_ConnectResultInform(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UCHAR\t\t\t\t\t*pBSSID,\n\tIN UCHAR\t\t\t\t\t*pReqIe,\n\tIN UINT32\t\t\t\t\tReqIeLen,\n\tIN UCHAR\t\t\t\t\t*pRspIe,\n\tIN UINT32\t\t\t\t\tRspIeLen,\n\tIN UCHAR\t\t\t\t\tFlgIsSuccess);\n\nBOOLEAN CFG80211_SupBandReInit(\n\tIN VOID\t\t\t\t\t\t*pAdCB);\n\nVOID CFG80211_RegRuleApply(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN VOID\t\t\t\t\t\t*pWiphy,\n\tIN UCHAR\t\t\t\t\t*pAlpha2);\n\nVOID CFG80211_Scaning(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UINT32\t\t\t\t\tBssIdx,\n\tIN UINT32\t\t\t\t\tChanId,\n\tIN UCHAR\t\t\t\t\t*pFrame,\n\tIN UINT32\t\t\t\t\tFrameLen,\n\tIN INT32\t\t\t\t\tRSSI);\n\n#ifdef RFKILL_HW_SUPPORT\nVOID CFG80211_RFKillStatusUpdate(\n\tIN PVOID\t\t\t\t\tpAd,\n\tIN BOOLEAN\t\t\t\t\tactive);\n#endif /* RFKILL_HW_SUPPORT */\n\nVOID CFG80211_UnRegister(\n\tIN VOID\t\t\t\t\t\t*pAdOrg,\n\tIN VOID\t\t\t\t\t\t*pNetDev);\n\n#endif /* RT_CFG80211_SUPPORT */\n\n/* End of cfg80211extr.h */\n"
  },
  {
    "path": "src/include/chip/chip_id.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tchip_id.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __CHIP_ID_H__\n#define __CHIP_ID_H__\n\n\n#define NIC_PCI_VENDOR_ID\t\t0x1814\n\n#define NIC2860_PCI_DEVICE_ID\t0x0601\n#define NIC2860_PCIe_DEVICE_ID\t0x0681\n#define NIC2760_PCI_DEVICE_ID\t0x0701\t\t/* 1T/2R Cardbus ??? */\n#define NIC2790_PCIe_DEVICE_ID  0x0781\t\t/* 1T/2R miniCard */\n\n#define VEN_AWT_PCIe_DEVICE_ID\t0x1059\n#define VEN_AWT_PCI_VENDOR_ID\t0x1A3B\n\n#define EDIMAX_PCI_VENDOR_ID\t0x1432\n\n#define NIC3090_PCIe_DEVICE_ID  0x3090\t\t/* 1T/1R miniCard */\n#define NIC3091_PCIe_DEVICE_ID  0x3091\t\t/* 1T/2R miniCard */\n#define NIC3092_PCIe_DEVICE_ID  0x3092\t\t/* 2T/2R miniCard */\n#define NIC3390_PCIe_DEVICE_ID  0x3390\t\t/* 1T/1R miniCard */\n\n#define NIC3062_PCI_DEVICE_ID\t0x3062\t\t/* 2T/2R miniCard */\n#define NIC3562_PCI_DEVICE_ID\t0x3562\t\t/* 2T/2R miniCard */\n#define NIC3060_PCI_DEVICE_ID\t0x3060\t\t/* 1T/1R miniCard */\n\n#define NIC3592_PCIe_DEVICE_ID\t0x3592\t\t/* 2T/2R miniCard */\n\n\n#define NIC3593_PCI_OR_PCIe_DEVICE_ID\t0x3593\n#define NIC5390_PCIe_DEVICE_ID\t0x5390\n#define NIC539F_PCIe_DEVICE_ID \t0x539F\n#define NIC5392_PCIe_DEVICE_ID \t0x5392\n#define NIC5360_PCI_DEVICE_ID   \t0x5360\n#define NIC5362_PCI_DEVICE_ID\t0x5362\n\n#define NIC5592_PCIe_DEVICE_ID  0x5592\n\n#define NIC3290_PCIe_DEVICE_ID 0x3290\n\n#define NIC6590_PCIe_DEVICE_ID 0x6590\n#define NIC7601_PCIe_DEVICE_ID 0x7601\n\n#define NIC8592_5592_PCIe_DEVICE_ID\t0x5592\n#define NIC8592_PCIe_DEVICE_ID\t0x8592\n\n#define NIC6390_PCIe_DEVICE_ID 0x6390\n\n#endif /* __CHIP_ID_H__ */\n"
  },
  {
    "path": "src/include/chip/mt7601.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt6590.h\n\n    Abstract:\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __MT7601_H__\n#define __MT7601_H__\n\nstruct _RTMP_ADAPTER;\n\n#define MAC_VERSION\t\t\"\"\n\n#define BBP_VERSION\t\t\"MT7601E2_BBP_CSD_20121019\"\n#define RF_VERSION\t\t\"RT6390_RF_Register_20121122\"\n\n#define NIC6590_PCIe_DEVICE_ID 0x6590\n#define MAX_RF_ID\t127\n#define MAC_RF_BANK 7\n\n#define MAX_CHECK_COUNT 200\n#define MT7601_VALID_EEPROM_VERSION\t\t\t0x0C\n\n#define ENABLE_WLAN_FUN(__WlanFunCtrl)\\\n{\\\n\t__WlanFunCtrl.field.WLAN_CLK_EN = 1;\\\n\t__WlanFunCtrl.field.WLAN_EN = 1;\\\n}\n\n#define DISABLE_WLAN_FUN(__WlanFunCtrl)\\\n{\\\n\t__WlanFunCtrl.field.PCIE_APP0_CLK_REQ = 0;\\\n\t__WlanFunCtrl.field.WLAN_EN = 0;\\\n\t__WlanFunCtrl.field.WLAN_CLK_EN = 0;\\\n}\n\n#define MT7601_WSC_HDR_BTN_GPIO\t0x400\n#define MT7601_WSC_HDR_BTN_MR_PRESS_FLG_GET(__pAd, __FlgIsPressed)\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT32 __gpio_value;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tRTMP_IO_READ32(__pAd, WLAN_FUN_CTRL, (&__gpio_value));\t\t\t\\\n\t\tif (__gpio_value & MT7601_WSC_HDR_BTN_GPIO)\t\t\t\t\t\t\\\n\t\t\t__FlgIsPressed = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t__FlgIsPressed = 1;\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\n\n\n#define RF_PA_MODE0_DECODE\t\t0\n#define RF_PA_MODE1_DECODE\t\t8847\t// 1.08 * 8192\n#define RF_PA_MODE2_DECODE\t\t-5734\t// -0.7 * 8192\n#define RF_PA_MODE3_DECODE\t\t-5734\t// -0.7 * 8192\n\n#define MT7601_E2_TEMPERATURE_SLOPE\t39\n\n#define\tBW20_MCS_POWER_CCK_1M\t\t\t((pAd->Tx20MPwrCfgGBand[0] & 0xFF) < 0x20)?(pAd->Tx20MPwrCfgGBand[0] & 0xFF):(CHAR)((pAd->Tx20MPwrCfgGBand[0] & 0xFF) - 0x40)\n#define\tBW20_MCS_POWER_CCK_2M\t\t\t((pAd->Tx20MPwrCfgGBand[0] & 0xFF) < 0x20)?(pAd->Tx20MPwrCfgGBand[0] & 0xFF):(CHAR)((pAd->Tx20MPwrCfgGBand[0] & 0xFF) - 0x40)\n#define\tBW20_MCS_POWER_CCK_5M\t\t\t(((pAd->Tx20MPwrCfgGBand[0] & 0xFF00) >> 8) < 0x20)?((pAd->Tx20MPwrCfgGBand[0] & 0xFF00) >> 8):(CHAR)(((pAd->Tx20MPwrCfgGBand[0] & 0xFF00) >> 8)-0x40)\n#define\tBW20_MCS_POWER_CCK_11M\t\t\t(((pAd->Tx20MPwrCfgGBand[0] & 0xFF00) >> 8) < 0x20)?((pAd->Tx20MPwrCfgGBand[0] & 0xFF00) >> 8):(CHAR)(((pAd->Tx20MPwrCfgGBand[0] & 0xFF00) >> 8)-0x40)\n#define\tBW40_MCS_POWER_CCK_1M\t\t\t((pAd->Tx40MPwrCfgGBand[0] & 0xFF) < 0x20)?(pAd->Tx40MPwrCfgGBand[0] & 0xFF) :(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF) < 0x20)-0x40)\n#define\tBW40_MCS_POWER_CCK_2M\t\t\t((pAd->Tx40MPwrCfgGBand[0] & 0xFF) < 0x20)?(pAd->Tx40MPwrCfgGBand[0] & 0xFF) :(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF) < 0x20)-0x40)\n#define\tBW40_MCS_POWER_CCK_5M\t\t\t(((pAd->Tx40MPwrCfgGBand[0] & 0xFF00) >> 8) < 0x20)?((pAd->Tx40MPwrCfgGBand[0] & 0xFF00) >> 8):(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF00) >> 8)-0x40)\n#define\tBW40_MCS_POWER_CCK_11M\t\t\t(((pAd->Tx40MPwrCfgGBand[0] & 0xFF00) >> 8) < 0x20)?((pAd->Tx40MPwrCfgGBand[0] & 0xFF00) >> 8):(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF00) >> 8)-0x40)\n\n#define\tBW20_MCS_POWER_OFDM_6M\t\t\t(((pAd->Tx20MPwrCfgGBand[0] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx20MPwrCfgGBand[0] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx20MPwrCfgGBand[0] & 0xFF0000) >> 16)-0x40)\n#define\tBW20_MCS_POWER_OFDM_9M\t\t\t(((pAd->Tx20MPwrCfgGBand[0] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx20MPwrCfgGBand[0] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx20MPwrCfgGBand[0] & 0xFF0000) >> 16)-0x40)\n#define\tBW20_MCS_POWER_OFDM_12M\t\t(((pAd->Tx20MPwrCfgGBand[0] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx20MPwrCfgGBand[0] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx20MPwrCfgGBand[0] & 0xFF000000) >> 24)-0x40)\n#define\tBW20_MCS_POWER_OFDM_18M\t\t(((pAd->Tx20MPwrCfgGBand[0] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx20MPwrCfgGBand[0] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx20MPwrCfgGBand[0] & 0xFF000000) >> 24)-0x40)\n#define\tBW20_MCS_POWER_OFDM_24M\t\t((pAd->Tx20MPwrCfgGBand[1] & 0xFF) < 0x20)?(pAd->Tx20MPwrCfgGBand[1] & 0xFF):(CHAR)((pAd->Tx20MPwrCfgGBand[1] & 0xFF)-0x40)\n#define\tBW20_MCS_POWER_OFDM_36M\t\t((pAd->Tx20MPwrCfgGBand[1] & 0xFF) < 0x20)?(pAd->Tx20MPwrCfgGBand[1] & 0xFF):(CHAR)((pAd->Tx20MPwrCfgGBand[1] & 0xFF)-0x40)\n#define\tBW20_MCS_POWER_OFDM_48M\t\t(((pAd->Tx20MPwrCfgGBand[1] & 0xFF00) >> 8) < 0x20)?((pAd->Tx20MPwrCfgGBand[1] & 0xFF00) >> 8):(CHAR)(((pAd->Tx20MPwrCfgGBand[1] & 0xFF00) >> 8)-0x40)\n#define\tBW20_MCS_POWER_OFDM_54M\t\t(((pAd->Tx20MPwrCfgGBand[1] & 0xFF00) >> 8) < 0x20)?((pAd->Tx20MPwrCfgGBand[1] & 0xFF00) >> 8):(CHAR)(((pAd->Tx20MPwrCfgGBand[1] & 0xFF00) >> 8)-0x40)\n#define\tBW40_MCS_POWER_OFDM_6M\t\t\t(((pAd->Tx40MPwrCfgGBand[0] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx40MPwrCfgGBand[0] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF0000) >> 16)-0x40)\n#define\tBW40_MCS_POWER_OFDM_9M\t\t\t(((pAd->Tx40MPwrCfgGBand[0] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx40MPwrCfgGBand[0] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF0000) >> 16)-0x40)\n#define\tBW40_MCS_POWER_OFDM_12M\t\t(((pAd->Tx40MPwrCfgGBand[0] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx40MPwrCfgGBand[0] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF000000) >> 24)-0x40)\n#define\tBW40_MCS_POWER_OFDM_18M\t\t(((pAd->Tx40MPwrCfgGBand[0] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx40MPwrCfgGBand[0] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx40MPwrCfgGBand[0] & 0xFF000000) >> 24)-0x40)\n#define\tBW40_MCS_POWER_OFDM_24M\t\t((pAd->Tx40MPwrCfgGBand[1] & 0xFF) < 0x20)?(pAd->Tx40MPwrCfgGBand[1] & 0xFF):(CHAR)((pAd->Tx40MPwrCfgGBand[1] & 0xFF)-0x40)\n#define\tBW40_MCS_POWER_OFDM_36M\t\t((pAd->Tx40MPwrCfgGBand[1] & 0xFF) < 0x20)?(pAd->Tx40MPwrCfgGBand[1] & 0xFF):(CHAR)((pAd->Tx40MPwrCfgGBand[1] & 0xFF)-0x40)\n#define\tBW40_MCS_POWER_OFDM_48M\t\t(((pAd->Tx40MPwrCfgGBand[1] & 0xFF00) >> 8) < 0x20)?((pAd->Tx40MPwrCfgGBand[1] & 0xFF00) >> 8):(CHAR)(((pAd->Tx40MPwrCfgGBand[1] & 0xFF00) >> 8)-0x40)\n#define\tBW40_MCS_POWER_OFDM_54M\t\t(((pAd->Tx40MPwrCfgGBand[1] & 0xFF00) >> 8) < 0x20)?((pAd->Tx40MPwrCfgGBand[1] & 0xFF00) >> 8):(CHAR)(((pAd->Tx40MPwrCfgGBand[1] & 0xFF00) >> 8)-0x40)\n\n#define\tBW20_MCS_POWER_HT_MCS0\t\t\t(((pAd->Tx20MPwrCfgGBand[1] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx20MPwrCfgGBand[1] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx20MPwrCfgGBand[1] & 0xFF0000) >> 16)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS1\t\t\t(((pAd->Tx20MPwrCfgGBand[1] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx20MPwrCfgGBand[1] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx20MPwrCfgGBand[1] & 0xFF0000) >> 16)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS2\t\t\t(((pAd->Tx20MPwrCfgGBand[1] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx20MPwrCfgGBand[1] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx20MPwrCfgGBand[1] & 0xFF000000) >> 24)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS3\t\t\t(((pAd->Tx20MPwrCfgGBand[1] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx20MPwrCfgGBand[1] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx20MPwrCfgGBand[1] & 0xFF000000) >> 24)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS4\t\t\t((pAd->Tx20MPwrCfgGBand[2] & 0xFF) < 0x20)?(pAd->Tx20MPwrCfgGBand[2] & 0xFF):(CHAR)((pAd->Tx20MPwrCfgGBand[2] & 0xFF)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS5\t\t\t((pAd->Tx20MPwrCfgGBand[2] & 0xFF) < 0x20)?(pAd->Tx20MPwrCfgGBand[2] & 0xFF):(CHAR)((pAd->Tx20MPwrCfgGBand[2] & 0xFF)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS6\t\t\t(((pAd->Tx20MPwrCfgGBand[2] & 0xFF00 ) >> 8) < 0x20)?((pAd->Tx20MPwrCfgGBand[2] & 0xFF00 ) >> 8):(CHAR)(((pAd->Tx20MPwrCfgGBand[2] & 0xFF00 ) >> 8)-0x40)\n#define\tBW20_MCS_POWER_HT_MCS7\t\t\t(((pAd->Tx20MPwrCfgGBand[2] & 0xFF00 ) >> 8) < 0x20)?((pAd->Tx20MPwrCfgGBand[2] & 0xFF00 ) >> 8):(CHAR)(((pAd->Tx20MPwrCfgGBand[2] & 0xFF00 ) >> 8)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS0\t\t\t(((pAd->Tx40MPwrCfgGBand[1] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx40MPwrCfgGBand[1] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx40MPwrCfgGBand[1] & 0xFF0000) >> 16)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS1\t\t\t(((pAd->Tx40MPwrCfgGBand[1] & 0xFF0000) >> 16) < 0x20)?((pAd->Tx40MPwrCfgGBand[1] & 0xFF0000) >> 16):(CHAR)(((pAd->Tx40MPwrCfgGBand[1] & 0xFF0000) >> 16)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS2\t\t\t(((pAd->Tx40MPwrCfgGBand[1] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx40MPwrCfgGBand[1] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx40MPwrCfgGBand[1] & 0xFF000000) >> 24)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS3\t\t\t(((pAd->Tx40MPwrCfgGBand[1] & 0xFF000000) >> 24) < 0x20)?((pAd->Tx40MPwrCfgGBand[1] & 0xFF000000) >> 24):(CHAR)(((pAd->Tx40MPwrCfgGBand[1] & 0xFF000000) >> 24)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS4\t\t\t((pAd->Tx40MPwrCfgGBand[2] & 0xFF) < 0x20)?(pAd->Tx40MPwrCfgGBand[2] & 0xFF):(CHAR)((pAd->Tx40MPwrCfgGBand[2] & 0xFF)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS5\t\t\t((pAd->Tx40MPwrCfgGBand[2] & 0xFF) < 0x20)?(pAd->Tx40MPwrCfgGBand[2] & 0xFF):(CHAR)((pAd->Tx40MPwrCfgGBand[2] & 0xFF)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS6\t\t\t(((pAd->Tx40MPwrCfgGBand[2] & 0xFF00) >> 8) < 0x20)?((pAd->Tx40MPwrCfgGBand[2] & 0xFF00) >> 8):(CHAR)(((pAd->Tx40MPwrCfgGBand[2] & 0xFF00) >> 8)-0x40)\n#define\tBW40_MCS_POWER_HT_MCS7\t\t\t(((pAd->Tx40MPwrCfgGBand[2] & 0xFF00) >> 8) < 0x20)?((pAd->Tx40MPwrCfgGBand[2] & 0xFF00) >> 8):(CHAR)(((pAd->Tx40MPwrCfgGBand[2] & 0xFF00) >> 8)-0x40)\n\n#define\tRF_PA_MODE_CCK_1M\t\t\t\t(pAd->chipCap.PAModeCCK[0])\n#define\tRF_PA_MODE_CCK_2M\t\t\t\t(pAd->chipCap.PAModeCCK[1]) \n#define\tRF_PA_MODE_CCK_5M\t\t\t\t(pAd->chipCap.PAModeCCK[2]) \n#define\tRF_PA_MODE_CCK_11M\t\t\t\t(pAd->chipCap.PAModeCCK[3]) \n\n#define\tRF_PA_MODE_OFDM_6M\t\t\t\t(pAd->chipCap.PAModeOFDM[0])\n#define\tRF_PA_MODE_OFDM_9M\t\t\t\t(pAd->chipCap.PAModeOFDM[1])\n#define\tRF_PA_MODE_OFDM_12M\t\t\t\t(pAd->chipCap.PAModeOFDM[2]) \n#define\tRF_PA_MODE_OFDM_18M\t\t\t\t(pAd->chipCap.PAModeOFDM[3]) \n#define\tRF_PA_MODE_OFDM_24M\t\t\t\t(pAd->chipCap.PAModeOFDM[4])\n#define\tRF_PA_MODE_OFDM_36M\t\t\t\t(pAd->chipCap.PAModeOFDM[5])\n#define\tRF_PA_MODE_OFDM_48M\t\t\t\t(pAd->chipCap.PAModeOFDM[6])\n#define\tRF_PA_MODE_OFDM_54M\t\t\t\t(pAd->chipCap.PAModeOFDM[7])\n\n#define\tRF_PA_MODE_HT_MCS0\t\t\t\t(pAd->chipCap.PAModeHT[0])\n#define\tRF_PA_MODE_HT_MCS1\t\t\t\t(pAd->chipCap.PAModeHT[1]) \n#define\tRF_PA_MODE_HT_MCS2\t\t\t\t(pAd->chipCap.PAModeHT[2]) \n#define\tRF_PA_MODE_HT_MCS3\t\t\t\t(pAd->chipCap.PAModeHT[3]) \n#define\tRF_PA_MODE_HT_MCS4\t\t\t\t(pAd->chipCap.PAModeHT[4])\n#define\tRF_PA_MODE_HT_MCS5\t\t\t\t(pAd->chipCap.PAModeHT[5])\n#define\tRF_PA_MODE_HT_MCS6\t\t\t\t(pAd->chipCap.PAModeHT[6])\n#define\tRF_PA_MODE_HT_MCS7\t\t\t\t(pAd->chipCap.PAModeHT[7])\n#define\tRF_PA_MODE_HT_MCS8\t\t\t\t(pAd->chipCap.PAModeHT[8])\n#define\tRF_PA_MODE_HT_MCS9\t\t\t\t(pAd->chipCap.PAModeHT[9]) \n#define\tRF_PA_MODE_HT_MCS10\t\t\t\t(pAd->chipCap.PAModeHT[10]) \n#define\tRF_PA_MODE_HT_MCS11\t\t\t\t(pAd->chipCap.PAModeHT[11]) \n#define\tRF_PA_MODE_HT_MCS12\t\t\t\t(pAd->chipCap.PAModeHT[12])\n#define\tRF_PA_MODE_HT_MCS13\t\t\t\t(pAd->chipCap.PAModeHT[13])\n#define\tRF_PA_MODE_HT_MCS14\t\t\t\t(pAd->chipCap.PAModeHT[14])\n#define\tRF_PA_MODE_HT_MCS15\t\t\t\t(pAd->chipCap.PAModeHT[15])\n\nenum TEMPERATURE_MODE {\n\tTEMPERATURE_MODE_NORMAL,\n\tTEMPERATURE_MODE_LOW,\n\tTEMPERATURE_MODE_HIGH,\n};\n\n#ifdef RTMP_INTERNAL_TX_ALC\n#define DEFAULT_BO              4\n#define LIN2DB_ERROR_CODE       (-10000)\n\nVOID MT7601_TssiDcGainCalibration(struct _RTMP_ADAPTER *pAd);\n\ntypedef struct _MT7601_TX_ALC_DATA {\n\tINT32\tPowerDiffPre;\n\tINT32\tMT7601_TSSI_T0_Delta_Offset;\n\tINT16\tTSSI_DBOFFSET_HVGA;\n\tINT16\tTSSI0_DB;\n\tUCHAR\tTssiSlope;\n\tCHAR\tTssiDC0;\n\tCHAR\tTssiDC0_HVGA;\n\tUINT32\tInitTxAlcCfg1;\n\tBOOLEAN\tTSSI_USE_HVGA;\n\tBOOLEAN TssiTriggered;\n\tCHAR\tMT7601_TSSI_OFFSET[3];\n} MT7601_TX_ALC_DATA, *PMT7601_TX_ALC_DATA;\n\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n/*\n\trsv: Reserved\n\ttcp: packet type, tcp : 1, udp:0\n\ttups: TCP/UDP header start offset (in unit of DWORD)\n\tips: IP start offset (in unit of byte), base address of ips is the beginning of TXWI\n\tmss: Max Segment size (in unit of byte)\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef struct _TSO_INFO_{\n\tUINT32 mss:16;\n\tUINT32 ips:8;\n\tUINT32 tups:6;\t\n\tUINT32 tcp:1;\t\n\tUINT32 rsv:1;\n}TSO_INFO;\n#else\ntypedef struct _TSO_INFO_{\n\tUINT32 rsv:1;\n\tUINT32 tcp:1;\n\tUINT32 tups:6;\n\tUINT32 ips:8;\n\tUINT32 mss:16;\n}TSO_INFO;\n#endif /* RT_BIG_ENDIAN */\n\n/* \n * Frequency plan item  for MT7601\n * K_R17[7:0]: sdm_k[7:0]\n * K_R18[7:0]: sdm_k[15:8]\n * K_R19[1:0]: sdm_k[17:16]\n * K_R19[3]: sdm_clk_sel\n * R_R20[7:0]: sdm_n[7:0]\n */\ntypedef struct _MT7601_FREQ_ITEM {\n\tUINT8 Channel;\n\tUINT8 K_R17;\n\tUINT8 K_R18;\n\tUINT8 K_R19;\n\tUINT8 N_R20;\n} MT7601_FREQ_ITEM;\n\n#define RF_G_BAND \t\t0x01\n#define RF_A_BAND \t\t0x02\n#define RF_A_BAND_LB\t0x04\n#define RF_A_BAND_MB\t0x08\n#define RF_A_BAND_HB\t0x10\ntypedef struct _RT6590_RF_SWITCH_ITEM {\n\tUCHAR Bank;\n\tUCHAR Register;\n\tUCHAR Band; /* G_Band, A_Band_LB, A_Band_MB, A_Band_HB */\n\tUCHAR BW;\n\tUCHAR Value;\n} RT6590_RF_SWITCH_ITEM, *PRT6590_RF_SWITCH_ITEM;\n\nVOID MT7601_Init(struct _RTMP_ADAPTER *pAd);\nVOID MT7601_RXDC_CAL(struct _RTMP_ADAPTER *pAd);\nINT MT7601_ReadChannelPwr(struct _RTMP_ADAPTER *pAd);\nVOID MT7601_ReadTxPwrPerRate(struct _RTMP_ADAPTER *pAd);\nVOID MT7601_INIT_CAL(struct _RTMP_ADAPTER *pAd);\nNTSTATUS MT7601DisableTxRx(struct _RTMP_ADAPTER *pAd, UCHAR Level);\nVOID dump_bw_info(struct _RTMP_ADAPTER *pAd);\nVOID MT7601AsicTemperatureCompensation(IN struct _RTMP_ADAPTER *pAd, IN BOOLEAN bPowerOn);\n#ifdef RTMP_INTERNAL_TX_ALC\nINT16 lin2dBd(UINT16 linearValue);\nVOID MT7601_EnableTSSI(struct _RTMP_ADAPTER *pAd);\n#endif /* RTMP_INTERNAL_TX_ALC */\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2)\nVOID MT7601_InitPAModeTable(struct _RTMP_ADAPTER *pAd);\n#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2) */\n\n#ifdef MICROWAVE_OVEN_SUPPORT\nVOID MT7601_AsicMitigateMicrowave(\n\tIN struct _RTMP_ADAPTER *pAd);\n\nVOID MT7601_AsicMeasureFalseCCA(\n\tIN struct _RTMP_ADAPTER *pAd);\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\nINT MT7601_Read_Temperature(\n\tstruct _RTMP_ADAPTER *pAd, \n\tOUT\tCHAR*\t\t\tTemperature);\n\nINT MT7601_Bootup_Read_Temperature(\n\tstruct _RTMP_ADAPTER *pAd, \n\tOUT\tCHAR*\t\t\tTemperature);\n\nVOID MT7601SetRxAnt(\n\tstruct _RTMP_ADAPTER *pAd,\n\tIN UCHAR\t\t\tAnt);\n#endif /* __MT7601_H__ */\n\n"
  },
  {
    "path": "src/include/chip/rt28xx.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt28xx.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RT28XX_H__\n#define __RT28XX_H__\n\n#ifdef RT28xx\n\nVOID RT28xx_ChipSwitchChannel(\n\tIN struct _RTMP_ADAPTER \t*pAd,\n\tIN UCHAR\t\t\t\t\tChannel,\n\tIN BOOLEAN\t\t\t\t\tbScan);\n\n#endif /* RT28xx */\n\n#endif /*__RT28XX_H__ */\n\n"
  },
  {
    "path": "src/include/chip/rt3290.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt3290.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RT3290_H__\n#define __RT3290_H__\n\n#ifdef RT3290\n\n#error \"For RT3290, you should define the compile flag -DRTMP_PCI_SUPPORT\"\n\n#error \"For RT3290, you should define the compile flag -DRTMP_MAC_PCI\"\n\n#error \"For RT3290, you should define the compile flag -DRTMP_RF_RW_SUPPORT\"\n\n#error \"For RT3290, you should define the compile flag -DRT30xx\"\n\n#include \"chip/mac_pci.h\"\n#include \"chip/rt30xx.h\"\n\nstruct _RTMP_ADAPTER;\n\n\n#define NIC3290_PCIe_DEVICE_ID 0x3290\n\n\n#define RT3290_CHECK_SW_EEP_BUSY(pAd)\t\\\n{\t\\\n\tUINT32 _val, _cnt = 0;\t\\\n\tdo {\t\\\n\t\tRTMP_IO_FORCE_READ32(pAd, WLAN_FUN_INFO, &_val);\t\\\n\t\tif ((_val & 0x80000000) == 0 || (_val == 0xffffffff))\t\\\n\t\t\tbreak;\t\\\n\t\t_cnt++;\t\\\n\t\tDBGPRINT_ERR((\"RT3290: EEP is busy!!!! BusyCnt%d : fail\\n\",  _cnt));\t\\\n\t\tRTMPusecDelay(500);\t\\\n\t} while (_cnt<300);\t\\\n}\t\\\n\n#define RT3290_CURRENT_LEAKAGE(_pAd,_A,_e)\t\\\n{\t\\\n\tif (IS_RT3290(_pAd))\t\\\n\t{\t\\\n\t\tUINT32 btFunInfo, _val = 0;\t\\\n\t\tRTMP_IO_FORCE_READ32(_pAd, _A, &_val);\t\\\n\t\tif (_e)\t\\\n\t\t\t_val &= ~(EESK|EEDI);\t\t\\\n\t\telse\t\\\n\t\t{\t\\\n\t\t\t_val &= ~(EESK);\t\t\\\n\t\t\t_val |= EEDI;\t\t\t\\\n\t\t}\t\\\n\t\tRT3290_CHECK_SW_EEP_BUSY(_pAd);\t\\\n\t\tRTMP_IO_FORCE_READ32(_pAd, BT_FUN_INFO, &btFunInfo);\t\\\n\t\tbtFunInfo |= 0x80000000;\t\\\n\t\tRTMP_IO_FORCE_WRITE32(_pAd, BT_FUN_INFO, btFunInfo);\t\\\n\t\t\\\n\t\tRTMP_IO_FORCE_WRITE32(_pAd, _A, _V);\t\\\n\t\t\\\n\t\tbtFunInfo &= ~(0x80000000);\t\\\n\t\tRTMP_IO_FORCE_WRITE32(_pAd, BT_FUN_INFO, btFunInfo);\t\\\n\t}\t\\\n}\n\n\nVOID MlmeAntSelection(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN ULONG\t AccuTxTotalCnt,\n\tIN ULONG\t TxErrorRatio,\n\tIN ULONG TxSuccess,\n\tIN CHAR Rssi);\n\nINT RT3290_eeprom_access_grant(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bGetCtrl);\n\t\nVOID RTMP_MAC_PWRSV_EN(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN BOOLEAN EnterIdle,\n\tIN BOOLEAN use40M);\n\nVOID RTMPEnableWlan(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bOn,\n\tIN BOOLEAN bResetWLAN);\n\nVOID RT3290_Init(\n\tIN struct _RTMP_ADAPTER *pAd);\n\n#endif /* RT3290 */\n\n#endif /* __RT5390_H__ */\n\n"
  },
  {
    "path": "src/include/chip/rt6590.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt6590.h\n\n    Abstract:\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RT6590_H__\n#define __RT6590_H__\n\nstruct _RTMP_ADAPTER;\n\n#define NIC6590_PCIe_DEVICE_ID 0x6590\n#define MAX_RF_ID\t127\n#define MAC_RF_BANK 7\n\n/*\n\trsv: Reserved\n\ttcp: packet type, tcp : 1, udp:0\n\ttups: TCP/UDP header start offset (in unit of DWORD)\n\tips: IP start offset (in unit of byte), base address of ips is the beginning of TXWI\n\tmss: Max Segment size (in unit of byte)\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef struct _TSO_INFO_{\n\tUINT32 mss:16;\n\tUINT32 ips:8;\n\tUINT32 tups:6;\t\n\tUINT32 tcp:1;\t\n\tUINT32 rsv:1;\n}TSO_INFO;\n#else\ntypedef struct _TSO_INFO_{\n\tUINT32 rsv:1;\n\tUINT32 tcp:1;\n\tUINT32 tups:6;\n\tUINT32 ips:8;\n\tUINT32 mss:16;\n}TSO_INFO;\n#endif /* RT_BIG_ENDIAN */\n\n\n/* \n * Frequency plan item  for RT85592 \n * N: R9[4], R8[7:0]\n * K: R7[7], R9[3:0]\n * mod: R9[7:5], R11[3:2] (eg. mod=8 => 0x0, mod=10 => 0x2)\n * R: R11[1:0] (eg. R=1 => 0x0, R=3 => 0x2)\n */\ntypedef struct _RT8592_FREQ_ITEM {\n\tUINT8 Channel;\n\tUINT16 N;\n\tUINT8 K;\n\tUINT8 mod;\n\tUINT8 R;\n} RT8592_FREQ_ITEM;\n\n#define RT6590_RF_VER\t\"MT7650_WiFi_RF_Register_20120516.xls\"\n//#define RT6590_BBP_VER\t\"TC6008_BBP_CR_20120518.xls\"\n#define RT6590_BBP_VER\t\"TC6008_BBP_CR_20120522.xls\"\n\n/* \n\tRdiv: R24[1:0]  (2-bits)\n\tPLL_N: R29[7:0], R30[0]  (9-bits)\n\tPLL_K(Nominator): R31[4:0] (5-bits)\n\tNon-Sigma: !SDM R31[7:5] (3-bits)\n\tDen: (Denomina - 8) R32[4:0]  (5-bits)\n\tLoop Filter Config: R33, R34  \n\tPll_idiv: frac comp R35[6:0]  (7-bits)\n\t\n\t5G only\n\t\tPll_LDO: R16 [6:4] = <010>\n*/\ntypedef struct _RT6590_FREQ_ITEM {\n\tUINT8 Channel;\n\tUINT8 Band;\n\tUINT16 PLL_N;\n\tUINT8 PLL_K;\n\tUINT8 Rdiv;\n\tUINT8 NonSigma;\n\tUINT8 Den;\n\tUINT8 LFC_R33;\n\tUINT8 LFC_R34;\n\tUINT32 Pll_idiv;\n\tUINT8 Pll_LDO; // 5G only\n} RT6590_FREQ_ITEM;\n\n#define RF_G_BAND \t\t0x01\n#define RF_A_BAND \t\t0x02\n#define RF_A_BAND_LB\t0x04\n#define RF_A_BAND_MB\t0x08\n#define RF_A_BAND_HB\t0x10\ntypedef struct _RT6590_RF_SWITCH_ITEM {\n\tUCHAR Bank;\n\tUCHAR Register;\n\tUCHAR Band; /* G_Band, A_Band_LB, A_Band_MB, A_Band_HB */\n\tUCHAR BW;\n\tUCHAR Value;\n} RT6590_RF_SWITCH_ITEM, *PRT6590_RF_SWITCH_ITEM;\n\ntypedef struct _RT6590_DCOC_Table {\n\tUCHAR Band; /* G_Band, A_Band_LB, A_Band_MB, A_Band_HB */\n\tRTMP_REG_PAIR RegDate;\n} RT6590_DOCO_Table, *PRT6590_DOCO_Table;\n\nVOID RT6590_Init(struct _RTMP_ADAPTER *pAd);\nINT RT6590_ReadChannelPwr(struct _RTMP_ADAPTER *pAd);\n\n#ifdef RT8592\nVOID RT85592_Init(struct _RTMP_ADAPTER *pAd);\nINT RT85592_ReadChannelPwr(struct _RTMP_ADAPTER *pAd);\nVOID RT85592ReadTxPwrPerRate(struct _RTMP_ADAPTER *pAd);\n#endif /* RT8592 */\nVOID RT6590ReadTxPwrPerRate(struct _RTMP_ADAPTER *pAd);\n\nVOID dump_bw_info(struct _RTMP_ADAPTER *pAd);\n\n#endif /* __RT6590_H__ */\n\n"
  },
  {
    "path": "src/include/chip/rtmp_phy.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_phy.h\n\n\tAbstract:\n\tRalink Wireless Chip PHY(BBP/RF) related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RTMP_PHY_H__\n#define __RTMP_PHY_H__\n\n\n#include \"mac_ral/rf_ctrl.h\"\n#ifdef RLT_MAC\n#include \"phy/rlt_phy.h\"\n#endif /* RLT_MAC */\n\n/*\n\tRF sections\n*/\n#define RF_R00\t\t\t0\n#define RF_R01\t\t\t1\n#define RF_R02\t\t\t2\n#define RF_R03\t\t\t3\n#define RF_R04\t\t\t4\n#define RF_R05\t\t\t5\n#define RF_R06\t\t\t6\n#define RF_R07\t\t\t7\n#define RF_R08\t\t\t8\n#define RF_R09\t\t\t9\n#define RF_R10\t\t\t10\n#define RF_R11\t\t\t11\n#define RF_R12\t\t\t12\n#define RF_R13\t\t\t13\n#define RF_R14\t\t\t14\n#define RF_R15\t\t\t15\n#define RF_R16\t\t\t16\n#define RF_R17\t\t\t17\n#define RF_R18\t\t\t18\n#define RF_R19\t\t\t19\n#define RF_R20\t\t\t20\n#define RF_R21\t\t\t21\n#define RF_R22\t\t\t22\n#define RF_R23\t\t\t23\n#define RF_R24\t\t\t24\n#define RF_R25\t\t\t25\n#define RF_R26\t\t\t26\n#define RF_R27\t\t\t27\n#define RF_R28\t\t\t28\n#define RF_R29\t\t\t29\n#define RF_R30\t\t\t30\n#define RF_R31\t\t\t31\n#define\tRF_R32\t\t\t32\n#define\tRF_R33\t\t\t33\n#define\tRF_R34\t\t\t34\n#define\tRF_R35\t\t\t35\n#define\tRF_R36\t\t\t36\n#define\tRF_R37\t\t\t37\n#define\tRF_R38\t\t\t38\n#define\tRF_R39\t\t\t39\n#define\tRF_R40\t\t\t40\n#define\tRF_R41\t\t\t41\n#define\tRF_R42\t\t\t42\n#define\tRF_R43\t\t\t43\n#define\tRF_R44\t\t\t44\n#define\tRF_R45\t\t\t45\n#define\tRF_R46\t\t\t46\n#define\tRF_R47\t\t\t47\n#define\tRF_R48\t\t\t48\n#define\tRF_R49\t\t\t49\n#define\tRF_R50\t\t\t50\n#define\tRF_R51\t\t\t51\n#define\tRF_R52\t\t\t52\n#define\tRF_R53\t\t\t53\n#define\tRF_R54\t\t\t54\n#define\tRF_R55\t\t\t55\n#define\tRF_R56\t\t\t56\n#define\tRF_R57\t\t\t57\n#define\tRF_R58\t\t\t58\n#define\tRF_R59\t\t\t59\n#define\tRF_R60\t\t\t60\n#define\tRF_R61\t\t\t61\n#define\tRF_R62\t\t\t62\n#define\tRF_R63\t\t\t63\n#define\tRF_R64\t\t\t64\n#define\tRF_R65\t\t\t65\n#define\tRF_R66\t\t\t66\n#define\tRF_R67\t\t\t67\n#define\tRF_R68\t\t\t68\n#define\tRF_R69\t\t\t69\n#define\tRF_R70\t\t\t70\n#define\tRF_R71\t\t\t71\n#define\tRF_R72\t\t\t72\n#define\tRF_R73\t\t\t73\n#define\tRF_R74\t\t\t74\n#define\tRF_R75\t\t\t75\n#define\tRF_R126\t\t\t126\n#define\tRF_R127\t\t\t127\n\n\n/* value domain of pAd->RfIcType */\n#define RFIC_2820                   1       /* 2.4G 2T3R */\n#define RFIC_2850                   2       /* 2.4G/5G 2T3R */\n#define RFIC_2720                   3       /* 2.4G 1T2R */\n#define RFIC_2750                   4       /* 2.4G/5G 1T2R */\n#define RFIC_3020                   5       /* 2.4G 1T1R */\n#define RFIC_2020                   6       /* 2.4G B/G */\n#define RFIC_3021                   7       /* 2.4G 1T2R */\n#define RFIC_3022                   8       /* 2.4G 2T2R */\n#define RFIC_3052                   9       /* 2.4G/5G 2T2R */\n#define RFIC_2853\t\t\t\t\t10\t\t/* 2.4G.5G 3T3R */\n#define RFIC_3320                   11      /* 2.4G 1T1R with PA (RT3350/RT3370/RT3390) */\n#define RFIC_3322                   12      /* 2.4G 2T2R with PA (RT3352/RT3371/RT3372/RT3391/RT3392) */\n#define RFIC_3053                   13      /* 2.4G/5G 3T3R (RT3883/RT3563/RT3573/RT3593/RT3662) */\n#define RFIC_3853                   13      /* 2.4G/5G 3T3R (RT3883/RT3563/RT3573/RT3593/RT3662) */\n#define RFIC_5592\t\t\t14\t /* 2.4G/5G */\n#define RFIC_UNKNOWN\t\t\t\t0xff\n\n#define RFIC_IS_5G_BAND(__pAd)\t\t\t\\\n\t((__pAd->RfIcType == RFIC_2850) ||\t\\\n\t(__pAd->RfIcType == RFIC_2750) ||\t\\\n\t(__pAd->RfIcType == RFIC_3052) ||\t\\\n\t(__pAd->RfIcType == RFIC_2853) ||\t\\\n\t(__pAd->RfIcType == RFIC_3053) ||\t\\\n\t(__pAd->RfIcType == RFIC_3853) ||\t\\\n\t(__pAd->RfIcType == RFIC_5592) ||\t\\\n\t(__pAd->RfIcType == RFIC_UNKNOWN))\n\n/*\n\tBBP sections\n*/\n#define BBP_R0\t\t\t0  /* version */\n#define BBP_R1\t\t\t1  /* TSSI */\n#define BBP_R2\t\t\t2  /* TX configure */\n#define BBP_R3\t\t\t3\n#define BBP_R4\t\t\t4\n#define BBP_R5\t\t\t5\n#define BBP_R6\t\t\t6\n#define BBP_R10\t\t\t10 /* Rate report */\n#define BBP_R14\t\t\t14 /* RX configure */\n#define BBP_R16\t\t\t16\n#define BBP_R17\t\t\t17 /* RX sensibility */\n#define BBP_R18\t\t\t18\n#define BBP_R20\t\t\t20\n#define BBP_R21\t\t\t21\n#define BBP_R22\t\t\t22\n#define BBP_R23\t\t\t23\n#define BBP_R24\t\t\t24\n#define BBP_R25\t\t\t25\n#define BBP_R26\t\t\t26\n#define BBP_R27\t\t\t27\n#define BBP_R31\t\t\t31\n#define BBP_R47\t\t\t47\n#define BBP_R49\t\t\t49 /*TSSI */\n#define BBP_R50\t\t\t50\n#define BBP_R51\t\t\t51\n#define BBP_R52\t\t\t52\n#define BBP_R53\t\t\t53\n#define BBP_R54\t\t\t54\n#define BBP_R55\t\t\t55\n#define BBP_R60\t\t\t60\n#define BBP_R57\t\t\t57\n#define BBP_R58\t\t\t58\n#define BBP_R62\t\t\t62 /* Rx SQ0 Threshold HIGH */\n#define BBP_R63\t\t\t63\n#define BBP_R64\t\t\t64\n#define BBP_R65\t\t\t65\n#define BBP_R66\t\t\t66\n#define BBP_R67\t\t\t67\n#define BBP_R68\t\t\t68\n#define BBP_R69\t\t\t69\n#define BBP_R70\t\t\t70 /* Rx AGC SQ CCK Xcorr threshold */\n#define BBP_R73\t\t\t73\n#define BBP_R74\t\t\t74\n#define BBP_R75\t\t\t75\n#define BBP_R76\t\t\t76\n#define BBP_R77\t\t\t77\n#define BBP_R78\t\t\t78\n#define BBP_R79\t\t\t79\n#define BBP_R80\t\t\t80\n#define BBP_R81\t\t\t81\n#define BBP_R82\t\t\t82\n#define BBP_R83\t\t\t83\n#define BBP_R84\t\t\t84\n#define BBP_R85\t\t\t85\n#define BBP_R86\t\t\t86\n#define BBP_R88\t\t\t88\n#define BBP_R91\t\t\t91\n#define BBP_R92\t\t\t92\n#define BBP_R94\t\t\t94 /* Tx Gain Control */\n#define BBP_R95\t\t\t95\n#define BBP_R98\t\t\t98\n#define BBP_R99\t\t\t99\n#define BBP_R101\t\t101\n#define BBP_R103\t\t103\n#define BBP_R104\t\t104\n#define BBP_R105\t\t105\n#define BBP_R106\t\t106\n#define BBP_R107\t\t107\n#define BBP_R108\t\t108\n#define BBP_R109\t\t109\n#define BBP_R110\t\t110\n#define BBP_R113\t\t113\n#define BBP_R114\t\t114\n#define BBP_R115\t\t115\n#define BBP_R116\t\t116\n#define BBP_R117\t\t117\n#define BBP_R118\t\t118\n#define BBP_R119\t\t119\n#define BBP_R120\t\t120\n#define BBP_R121\t\t121\n#define BBP_R122\t\t122\n#define BBP_R123\t\t123\n#define BBP_R126\t\t126\n#define BBP_R127\t\t127\n#define BBP_R128\t\t128\n#define BBP_R129\t\t129\n#define BBP_R130\t\t130\n#define BBP_R131\t\t131\n#define BBP_R133\t\t133\n#define BBP_R134\t\t134\n#define BBP_R135\t\t135\n#define BBP_R137\t\t137\n#define BBP_R138\t\t138 /* add by johnli, RF power sequence setup, ADC dynamic on/off control */\n#define BBP_R140\t\t140\n#define BBP_R141\t\t141\n#define BBP_R142\t\t142\n#define BBP_R143\t\t143\n#define BBP_R148\t\t148\n#define BBP_R150\t\t150\n#define BBP_R151\t\t151\n#define BBP_R152\t\t152\n#define BBP_R153\t\t153\n#define BBP_R154\t\t154\n#define BBP_R155\t\t155\n#define BBP_R158\t\t158 /* Calibration register are accessed through R158 and R159 */\n#define BBP_R159\t\t159\n#define BBP_R160\t\t160 /* Tx BF control */\n#define BBP_R161\t\t161\n#define BBP_R162\t\t162\n#define BBP_R163\t\t163\n#define BBP_R164\t\t164\n#define BBP_R165\t\t165\n#define BBP_R166\t\t166\n#define BBP_R167\t\t167\n\n#define BBP_R173\t\t173\n#define BBP_R174\t\t174\n#define BBP_R175\t\t175\n#define BBP_R176\t\t176\n#define BBP_R177\t\t177\n#define BBP_R178\t\t178\n#define BBP_R179\t\t179\n#define BBP_R180\t\t180\n#define BBP_R181\t\t181\n#define BBP_R182\t\t182\n#define BBP_R184\t\t184\n#define BBP_R185\t\t185\n#define BBP_R186\t\t186\n#define BBP_R187\t\t187\n#define BBP_R188\t\t188\n#define BBP_R189\t\t189\n#define BBP_R190\t\t190\n#define BBP_R191\t\t191\n#define BBP_R195\t\t195\n#define BBP_R196\t\t196\n#define BBP_R241\t\t241\n#define BBP_R242\t\t242\n#define BBP_R244\t\t244\n#define BBP_R250\t\t250\n#define BBP_R253\t\t253\n#define BBP_R254\t\t254\n#define BBP_R255\t\t255\n\n#define BBPR94_DEFAULT\t0x06 /* Add 1 value will gain 1db */\n\ntypedef enum{\n\tRX_CHAIN_0 = 1<<0,\n\tRX_CHAIN_1 = 1<<1,\n\tRX_CHAIN_2 = 1<<2,\n\tRX_CHAIN_ALL = 0xf\n}RX_CHAIN_IDX;\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R47_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tAdc6On:1;\n\t\tUCHAR\tReserved:2; \n\t\tUCHAR\tTssiMode:2;\n\t\tUCHAR\tTssiUpdateReq:1;\n\t\tUCHAR\tTssiReportSel:2;\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R47_STRUC, *PBBP_R47_STRUC;\n#else\ntypedef union _BBP_R47_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tTssiReportSel:2;\n\t\tUCHAR\tTssiUpdateReq:1;\n\t\tUCHAR\tTssiMode:2;\n\t\tUCHAR\tReserved:2; \n\t\tUCHAR\tAdc6On:1;\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R47_STRUC, *PBBP_R47_STRUC;\n#endif\n\n/* */\n/* BBP R49 TSSI (Transmit Signal Strength Indicator) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R49_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tadc5_in_sel:1; /* 0: TSSI (from the external components, old version), 1: PSI (internal components, new version - RT3390) */\n\t\tUCHAR\tbypassTSSIAverage:1; /* 0: the average TSSI (the average of the 16 samples), 1: the current TSSI */\n\t\tUCHAR\tReserved:1; /* Reserved field */\n\t\tUCHAR\tTSSI:5; /* TSSI value */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R49_STRUC, *PBBP_R49_STRUC;\n#else\ntypedef union _BBP_R49_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tTSSI:5; /* TSSI value */\n\t\tUCHAR\tReserved:1; /* Reserved field */\n\t\tUCHAR\tbypassTSSIAverage:1; /* 0: the average TSSI (the average of the 16 samples), 1: the current TSSI */\n\t\tUCHAR\tadc5_in_sel:1; /* 0: TSSI (from the external components, old version), 1: PSI (internal components, new version - RT3390) */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R49_STRUC, *PBBP_R49_STRUC;\n#endif\n\n/* */\n/* BBP R105 (FEQ control, MLD control and SIG remodulation) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R105_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tReserve1:4; /* Reserved field */\n\t\tUCHAR\tEnableSIGRemodulation:1; /* Enable the channel estimation updates based on remodulation of L-SIG and HT-SIG symbols. */\n\t\tUCHAR\tMLDFor2Stream:1; /* Apply Maximum Likelihood Detection (MLD) for 2 stream case (reserved field if single RX) */\n\t\tUCHAR\tIndependentFeedForwardCompensation:1; /* Apply independent feed-forward compensation for independent stream. */\n\t\tUCHAR\tDetectSIGOnPrimaryChannelOnly:1; /* Under 40 MHz band, detect SIG on primary channel only. */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R105_STRUC, *PBBP_R105_STRUC;\n#else\ntypedef union _BBP_R105_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDetectSIGOnPrimaryChannelOnly:1; /* Under 40 MHz band, detect SIG on primary channel only. */\n\t\tUCHAR\tIndependentFeedForwardCompensation:1; /* Apply independent feed-forward compensation for independent stream. */\n\t\tUCHAR\tMLDFor2Stream:1; /* Apply Maximum Likelihood Detection (MLD) for 2 stream case (reserved field if single RX) */\n\t\tUCHAR\tEnableSIGRemodulation:1; /* Enable the channel estimation updates based on remodulation of L-SIG and HT-SIG symbols. */\n\t\tUCHAR\tReserve1:4; /* Reserved field */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R105_STRUC, *PBBP_R105_STRUC;\n#endif\n\n/* */\n/* BBP R106 (GI remover) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R106_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tEnableLowPowerFSD:1; /* enable/disable the low power FSD */\n\t\tUCHAR\tShortGI_Offset40:4; /* Delay GI remover when the short GI is detected in 40MHz band (40M sampling rate) */\n\t\tUCHAR\tShortGI_Offset20:3; /* Delay GI remover when the short GI is detected in 20MHz band (20M sampling rate) */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R106_STRUC, *PBBP_R106_STRUC;\n#else\ntypedef union _BBP_R106_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tShortGI_Offset20:3; /* Delay GI remover when the short GI is detected in 20MHz band (20M sampling rate) */\n\t\tUCHAR\tShortGI_Offset40:4; /* Delay GI remover when the short GI is detected in 40MHz band (40M sampling rate) */\n\t\tUCHAR\tEnableLowPowerFSD:1; /* enable/disable the low power FSD */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R106_STRUC, *PBBP_R106_STRUC;\n#endif\n\n/* */\n/* BBP R109 (Tx power control in 0.1dB step) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R109_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tTx1PowerCtrl:4; /* Tx1 power control in 0.1dB step (valid: 0~10) */\n\t\tUCHAR\tTx0PowerCtrl:4; /* Tx0 power control in 0.1dB step (valid: 0~10) */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R109_STRUC, *PBBP_R109_STRUC;\n#else\ntypedef union _BBP_R109_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tTx0PowerCtrl:4; /* Tx0 power control in 0.1dB step (valid: 0~10) */\n\t\tUCHAR\tTx1PowerCtrl:4; /* Tx0 power control in 0.1dB step (valid: 0~10) */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R109_STRUC, *PBBP_R109_STRUC;\n#endif\n\n/* */\n/* BBP R110 (Tx power control in 0.1dB step) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R110_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tTx2PowerCtrl:4; /* Tx2 power control in 0.1dB step (valid: 0~10) */\n\t\tUCHAR\tAllTxPowerCtrl:4; /* All transmitters' fine power control in 0.1dB (valid: 0~10) */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R110_STRUC, *PBBP_R110_STRUC;\n#else\ntypedef union _BBP_R110_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tAllTxPowerCtrl:4; /* All transmitters' fine power control in 0.1dB (valid: 0~10) */\n\t\tUCHAR\tTx2PowerCtrl:4; /* Tx2 power control in 0.1dB step (valid: 0~10) */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R110_STRUC, *PBBP_R110_STRUC;\n#endif\n\n/* */\n/* BBP R179 (Test config #1) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R179_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDataIndex1:8; /* Data index #1 */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R179_STRUC, *PBBP_R179_STRUC;\n#else\ntypedef union _BBP_R179_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDataIndex1:8; /* Data index #1 */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R179_STRUC, *PBBP_R179_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n/* */\n/* BBP R180 (Test config #2) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R180_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDataIndex2:8; /* Data index #2 */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R180_STRUC, *PBBP_R180_STRUC;\n#else\ntypedef union _BBP_R180_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDataIndex2:8; /* Data index #2 */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R180_STRUC, *PBBP_R180_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n/* */\n/* BBP R182 (Test data port) */\n/* */\n#ifdef RT_BIG_ENDIAN\ntypedef union _BBP_R182_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDataArray:8; /* Data array indexed by BBP R179 and R180 */\n\t} field;\n\n\tUCHAR\t\tbyte;\n} BBP_R182_STRUC, *PBBP_R182_STRUC;\n#else\ntypedef union _BBP_R182_STRUC {\n\tstruct\n\t{\n\t\tUCHAR\tDataArray:8; /* Data array indexed by BBP R179 and R180 */\n\t} field;\n\t\n\tUCHAR\t\tbyte;\n} BBP_R182_STRUC, *PBBP_R182_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n#if defined(RT5370) || defined(RT5390) || defined(RT3290) //for hw antenna diversity (PPAD)\n\t#define MAX_BBP_ID\t255\n#elif defined(RT30xx)\n\t/* edit by johnli, RF power sequence setup, add BBP R138 for ADC dynamic on/off control */\n\t#define MAX_BBP_ID\t185\n#elif defined(RT2883)\n\t#define MAX_BBP_ID\t180\n#else\n\t#define MAX_BBP_ID\t136\n#endif /* RT30xx */\n\n\t#define MAX_BBP_MSG_SIZE\t2048\n\n\n\n\n/* */\n/* BBP & RF are using indirect access. Before write any value into it. */\n/* We have to make sure there is no outstanding command pending via checking busy bit. */\n/* */\n#define MAX_BUSY_COUNT  100         /* Number of retry before failing access BBP & RF indirect register */\n\n/*#define PHY_TR_SWITCH_TIME          5  // usec */\n\n/*#define BBP_R17_LOW_SENSIBILITY     0x50 */\n/*#define BBP_R17_MID_SENSIBILITY     0x41 */\n/*#define BBP_R17_DYNAMIC_UP_BOUND    0x40 */\n\n#define RSSI_FOR_VERY_LOW_SENSIBILITY   -35\n#define RSSI_FOR_LOW_SENSIBILITY\t\t-58\n#define RSSI_FOR_MID_LOW_SENSIBILITY\t-65 /*-80*/\n#define RSSI_FOR_MID_SENSIBILITY\t\t-90\n\n/*****************************************************************************\n\tRF register Read/Write marco definition\n *****************************************************************************/\n\n#ifdef RTMP_MAC_USB\n#define RTMP_RF_IO_WRITE32(_A, _V)                 RTUSBWriteRFRegister(_A, _V)\n#endif /* RTMP_MAC_USB */\n\n\n/*****************************************************************************\n\tBBP register Read/Write marco definitions.\n\twe read/write the bbp value by register's ID. \n\tGenerate PER to test BA\n *****************************************************************************/\n\t\n#ifdef CARRIER_DETECTION_SUPPORT\n/*TONE_RADAR_DETECT_V2*/\n#define RTMP_CARRIER_IO_READ8(_A, _I, _V)               \\\n{                                                       \\\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_A, BBP_R184, _I);          \\\n\tRTMP_BBP_IO_READ8_BY_REG_ID(_A, BBP_R185, _V);           \\\n}\n#define RTMP_CARRIER_IO_WRITE8(_A, _I, _V)              \\\n{                                                       \\\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_A, BBP_R184, _I);          \\\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_A, BBP_R185, _V);          \\\n}\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DFS_SUPPORT\n#define RTMP_DFS_IO_READ8(_A, _I, _V)                   \\\n{                                                       \\\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_A, BBP_R140, _I);          \\\n\tRTMP_BBP_IO_READ8_BY_REG_ID(_A, BBP_R141, _V);           \\\n}\n\n#define RTMP_DFS_IO_WRITE8(_A, _I, _V)                  \\\n{                                                       \\\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_A, BBP_R140, _I);          \\\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_A, BBP_R141, _V);          \\\n}\n#endif /*DFS_SUPPORT*/\n\n#ifdef RTMP_MAC_USB\n#ifndef MT7601\n#define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)   RTUSBReadBBPRegister(_A, _I, _pV)\n#define RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)   RTUSBWriteBBPRegister(_A, _I, _V)\n#define BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)\t\t\tRTUSBWriteBBPRegister(_A, _I, _V)\n#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)   \t\tRTUSBReadBBPRegister(_A, _I, _pV)\n#endif /* MT7601 */\n#endif /* RTMP_MAC_USB */\n\n#ifdef MT7601\nNDIS_STATUS MT7601_BBP_write(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN UCHAR regID,\n\tIN UCHAR value);\n\nNDIS_STATUS MT7601_BBP_read(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN UCHAR regID,\n\tIN UCHAR *pValue);\n\n#define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)\tMT7601_BBP_read(_A, _I, _pV)\n#define RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)\tMT7601_BBP_write(_A, _I, _V)\n#define BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)\t\t\tMT7601_BBP_write(_A, _I, _V)\n#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)\t\t\tMT7601_BBP_read(_A, _I, _pV)\n#endif /* MT7601 */\n\n\n\n#if defined(RT30xx) || defined(MT7601)\n\n#define RTMP_ASIC_MMPS_DISABLE(_pAd)\t\t\t\t\t\t\t\\\n\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUCHAR _bbpData = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT32 _macData;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* disable MMPS BBP control register */\t\t\t\t\t\t\\\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(_pAd, BBP_R3, &_bbpData);\t\\\n\t\t_bbpData &= ~(0x04);\t\t\t\t\t\t\t\t\t\t\\\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_pAd, BBP_R3, _bbpData);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* disable MMPS MAC control register */\t\t\t\t\t\t\\\n\t\tRTMP_IO_READ32(_pAd, 0x1210, &_macData);\t\t\t\t\\\n\t\t_macData &= ~(0x09);\t\t\t\t\t\t\t\t\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, 0x1210, _macData);\t\t\t\t\\\n\t}while(0)\n\n\n#define RTMP_ASIC_MMPS_ENABLE(_pAd)\t\t\t\t\t\t\t\\\n\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUCHAR _bbpData = 0;\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT32 _macData;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* enable MMPS BBP control register */\t\t\t\t\t\t\\\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(_pAd, BBP_R3, &_bbpData);\t\\\n\t\t_bbpData |= (0x04);\t\t\t\t\t\t\t\t\\\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(_pAd, BBP_R3, _bbpData);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* enable MMPS MAC control register */\t\t\t\t\t\t\\\n\t\tRTMP_IO_READ32(_pAd, 0x1210, &_macData);\t\t\t\t\\\n\t\t_macData |= (0x09);\t\t\t\t\t\t\t\t\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, 0x1210, _macData);\t\t\t\t\\\n\t}while(0)\n#endif /*  defined(RT30xx) || defined(MT7601) */\n\n\nstruct _RMTP_ADAPTER;\n\nINT rtmp_bbp_set_bw(struct _RTMP_ADAPTER *pAd, INT bw);\nINT rtmp_bbp_set_ctrlch(struct _RTMP_ADAPTER *pAd, INT ext_ch);\nINT rtmp_bbp_set_rxpath(struct _RTMP_ADAPTER *pAd, INT rxpath);\nINT rtmp_bbp_set_txdac(struct _RTMP_ADAPTER *pAd, INT tx_dac);\nINT rtmp_bbp_set_mmps(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower);\nINT rtmp_bbp_is_ready(struct _RTMP_ADAPTER *pAd);\nINT rtmp_bbp_set_agc(struct _RTMP_ADAPTER *pAd, UCHAR agc, RX_CHAIN_IDX idx);\nINT rtmp_bbp_get_agc(struct _RTMP_ADAPTER *pAd, CHAR *agc, RX_CHAIN_IDX idx);\nINT rtmp_bbp_set_filter_coefficient_ctrl(struct _RTMP_ADAPTER *pAd, UCHAR Channel);\nUCHAR rtmp_bbp_get_random_seed(struct _RTMP_ADAPTER *pAd);\n\nNDIS_STATUS NICInitBBP(struct _RTMP_ADAPTER *pAd);\n\n#endif /* __RTMP_PHY_H__ */\n\n"
  },
  {
    "path": "src/include/chlist.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tchlist.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifndef __CHLIST_H__\n#define __CHLIST_H__\n\n#include \"rtmp_type.h\"\n#include \"rtmp_def.h\"\n\n\ntypedef struct _CH_DESC {\n\tUCHAR FirstChannel;\n\tUCHAR NumOfCh;\n\tUCHAR ChannelProp;\n}CH_DESC, *PCH_DESC;\n\ntypedef struct _COUNTRY_REGION_CH_DESC {\n\tUCHAR RegionIndex;\n\tPCH_DESC pChDesc;\n}COUNTRY_REGION_CH_DESC, *PCOUNTRY_REGION_CH_DESC;\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n#define ODOR\t\t\t0\n#define IDOR\t\t\t1\n#define BOTH\t\t\t2\n\ntypedef struct _CH_DESP {\n\tUCHAR FirstChannel;\n\tUCHAR NumOfCh;\n\tCHAR MaxTxPwr;\t\t\t/* dBm */\n\tUCHAR Geography;\t\t\t/* 0:out door, 1:in door, 2:both */\n\tBOOLEAN DfsReq;\t\t\t/* Dfs require, 0: No, 1: yes. */\n} CH_DESP, *PCH_DESP;\n\ntypedef struct _CH_REGION {\n\tUCHAR CountReg[3];\n\tUCHAR DfsType;\t\t\t/* 0: CE, 1: FCC, 2: JAP, 3:JAP_W53, JAP_W56 */\n\tCH_DESP *pChDesp;\n} CH_REGION, *PCH_REGION;\n\nextern CH_REGION ChRegion[];\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef SINGLE_SKU_V2\n#define\tSINGLE_SKU_TABLE_LENGTH\t\t(SINGLE_SKU_TABLE_CCK_LENGTH+SINGLE_SKU_TABLE_OFDM_LENGTH+(SINGLE_SKU_TABLE_HT_LENGTH*2))\n\n#define SINGLE_SKU_TABLE_CCK_LENGTH\t4\n#define SINGLE_SKU_TABLE_OFDM_LENGTH\t8\n#define SINGLE_SKU_TABLE_HT_LENGTH\t16\n\ntypedef struct _CH_POWER_{\n\tDL_LIST\t\tList;\n\tUCHAR\t\tStartChannel;\n\tUCHAR\t\tnum;\n\tUCHAR\t\t*Channel;\n\tUCHAR\t\tPwrCCK[SINGLE_SKU_TABLE_CCK_LENGTH];\n\tUCHAR\t\tPwrOFDM[SINGLE_SKU_TABLE_OFDM_LENGTH];\n\tUCHAR\t\tPwrHT20[SINGLE_SKU_TABLE_HT_LENGTH];\n\tUCHAR\t\tPwrHT40[SINGLE_SKU_TABLE_HT_LENGTH];\n}CH_POWER;\n#endif /* SINGLE_SKU_V2 */\n\ntypedef struct _CH_FREQ_MAP_{\n\tUINT16\t\tchannel;\n\tUINT16\t\tfreqKHz;\n}CH_FREQ_MAP;\n\nextern CH_FREQ_MAP CH_HZ_ID_MAP[];\nextern int CH_HZ_ID_MAP_NUM;\n\n\n#define     MAP_CHANNEL_ID_TO_KHZ(_ch, _khz)                 \\\n\t\t\tRTMP_MapChannelID2KHZ(_ch, (UINT32 *)&(_khz))\n#define     MAP_KHZ_TO_CHANNEL_ID(_khz, _ch)                 \\\n\t\t\tRTMP_MapKHZ2ChannelID(_khz, (INT *)&(_ch))\n\n/* Check if it is Japan W53(ch52,56,60,64) channel. */\n#define JapanChannelCheck(_ch)  ((_ch == 52) || (_ch == 56) || (_ch == 60) || (_ch == 64))\n\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nVOID BuildChannelListEx(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID BuildBeaconChList(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pBuf,\n\tOUT\tPULONG pBufLen);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef DOT11_N_SUPPORT\nVOID N_ChannelCheck(RTMP_ADAPTER *pAd);\nUCHAR N_SetCenCh(RTMP_ADAPTER *pAd, UCHAR channel);\nBOOLEAN N_ChannelGroupCheck(RTMP_ADAPTER *pAd, UCHAR channel);\n\n#endif /* DOT11_N_SUPPORT */\n\nUINT8 GetCuntryMaxTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT8 channel);\n\nVOID RTMP_MapChannelID2KHZ(\n\tIN UCHAR Ch,\n\tOUT UINT32 *pFreq);\n\nVOID RTMP_MapKHZ2ChannelID(\n\tIN ULONG Freq,\n\tOUT INT *pCh);\n\nUCHAR GetChannel_5GHZ(\n\tIN PCH_DESC pChDesc, \n\tIN UCHAR index);\n\nUCHAR GetChannel_2GHZ(\n\tIN PCH_DESC pChDesc, \n\tIN UCHAR index);\n\nUCHAR GetChannelFlag(\n\tIN PCH_DESC pChDesc, \n\tIN UCHAR index);\n\nUINT16 TotalChNum(\n\tIN PCH_DESC pChDesc);\n\t\n#endif /* __CHLIST_H__ */\n\n"
  },
  {
    "path": "src/include/client_wds.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tclient_wds.h\n\n\tAbstract:\n*/\n\n#ifndef __CLIENT_WDS_H__\n#define __CLIENT_WDS_H__\n\n#include \"client_wds_cmm.h\"\n\nVOID CliWds_ProxyTabInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID CliWds_ProxyTabDestory(\n\tIN PRTMP_ADAPTER pAd);\n\nPCLIWDS_PROXY_ENTRY CliWdsEntyAlloc(\n\tIN PRTMP_ADAPTER pAd);\n\n\nVOID CliWdsEntyFree(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PCLIWDS_PROXY_ENTRY pCliWdsEntry);\n\n\nPUCHAR CliWds_ProxyLookup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMac);\n\n\nVOID CliWds_ProxyTabUpdate(\n\tIN PRTMP_ADAPTER pAd,\n\tIN SHORT Aid,\n\tIN PUCHAR pMac);\n\n\nVOID CliWds_ProxyTabMaintain(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /* __CLIENT_WDS_H__ */\n\n"
  },
  {
    "path": "src/include/client_wds_cmm.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tclient_wds_cmm.h\n\n\tAbstract:\n*/\n\n#ifndef __CLIENT_WDS_CMM_H__\n#define __CLIENT_WDS_CMM_H__\n\n#include \"rtmp_def.h\"\n\n#ifdef CLIENT_WDS\n\n\n#define CLI_WDS_ENTRY_AGEOUT 5000  /* seconds */\n\n#define CLIWDS_POOL_SIZE 128\n#define CLIWDS_HASH_TAB_SIZE 64  /* the legth of hash table must be power of 2. */\ntypedef struct _CLIWDS_PROXY_ENTRY {\n\tstruct _CLIWDS_PROXY_ENTRY * pNext;\n\tULONG LastRefTime;\n\tSHORT Aid;\n\tUCHAR Addr[MAC_ADDR_LEN];\n} CLIWDS_PROXY_ENTRY, *PCLIWDS_PROXY_ENTRY;\n\n#endif /* CLIENT_WDS */\n\n#endif /* __CLIENT_WDS_CMM_H__ */\n\n"
  },
  {
    "path": "src/include/crypt_aes.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    AES\n\n    Abstract:\n    RFC 3394: Advanced Encryption Standard (AES) Key Wrap Algorithm    \n    RFC 3601: Counter with CBC-MAC (CCM)\n    RFC 4493: The AES-CMAC Algorithm\n    FIPS PUBS 197: ADVANCED ENCRYPTION STANDARD (AES)\n    NIST 800-38A: Recommendation for Block Cipher Modes of Operation\n    NIST 800-38C: The CCM Mode for Authentication and Confidentiality \n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/05/19      Create AES-Key Wrap\n    Eddy        2009/04/20      Create AES-CMAC, AES-CCM    \n    Eddy        2009/01/19      Create AES-128, AES-192, AES-256, AES-CBC\n***************************************************************************/\n\n#ifndef __CRYPT_AES_H__\n#define __CRYPT_AES_H__\n\n#include \"rt_config.h\"\n\n\n/* AES definition & structure */\n#define AES_STATE_ROWS 4     /* Block size: 4*4*8 = 128 bits */\n#define AES_STATE_COLUMNS 4\n#define AES_BLOCK_SIZES AES_STATE_ROWS*AES_STATE_COLUMNS\n#define AES_KEY_ROWS 4\n#define AES_KEY_COLUMNS 8    /*Key length: 4*{4,6,8}*8 = 128, 192, 256 bits */\n#define AES_KEY128_LENGTH 16\n#define AES_KEY192_LENGTH 24\n#define AES_KEY256_LENGTH 32\n#define AES_CBC_IV_LENGTH 16\n\ntypedef struct {\n    UINT8 State[AES_STATE_ROWS][AES_STATE_COLUMNS];\n    UINT8 KeyWordExpansion[AES_KEY_ROWS][AES_KEY_ROWS*((AES_KEY256_LENGTH >> 2) + 6 + 1)];\n} AES_CTX_STRUC, *PAES_CTX_STRUC;\n\n\n/* AES operations */\nVOID RT_AES_KeyExpansion (\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    INOUT AES_CTX_STRUC *paes_ctx);\n\nVOID RT_AES_Encrypt (\n    IN UINT8 PlainBlock[],\n    IN UINT PlainBlockSize,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 CipherBlock[],\n    INOUT UINT *CipherBlockSize);\n\nVOID RT_AES_Decrypt (\n    IN UINT8 CipherBlock[],\n    IN UINT CipherBlockSize,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 PlainBlock[],\n    INOUT UINT *PlainBlockSize);\n\n/* AES Counter with CBC-MAC operations */\nVOID AES_CCM_MAC (\n    IN UINT8 Payload[],\n    IN UINT  PayloadLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    IN UINT8 Nonce[],\n    IN UINT  NonceLength,\n    IN UINT8 AAD[],\n    IN UINT  AADLength,\n    IN UINT  MACLength,\n    OUT UINT8 MACText[]);\n\nINT AES_CCM_Encrypt (\n    IN UINT8 PlainText[],\n    IN UINT  PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    IN UINT8 Nonce[],\n    IN UINT  NonceLength,\n    IN UINT8 AAD[],\n    IN UINT  AADLength,\n    IN UINT  MACLength,\n    OUT UINT8 CipherText[],\n    INOUT UINT *CipherTextLength);\n\nINT AES_CCM_Decrypt (\n    IN UINT8 CipherText[],\n    IN UINT  CipherTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    IN UINT8 Nonce[],\n    IN UINT  NonceLength,\n    IN UINT8 AAD[],\n    IN UINT  AADLength,\n    IN UINT  MACLength,\n    OUT UINT8 PlainText[],\n    INOUT UINT *PlainTextLength);\n\n/* AES-CMAC operations */\nVOID AES_CMAC_GenerateSubKey (\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 SubKey1[],\n    OUT UINT8 SubKey2[]);\n\nVOID AES_CMAC (\n    IN UINT8 PlainText[],\n    IN UINT PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    OUT UINT8 MACText[],\n    INOUT UINT *MACTextLength);\n\n\n\n/* AES-CBC operations */\nVOID AES_CBC_Encrypt (\n    IN UINT8 PlainText[],\n    IN UINT PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    IN UINT8 IV[],\n    IN UINT IVLength,\n    OUT UINT8 CipherText[],\n    INOUT UINT *CipherTextLength);\n\nVOID AES_CBC_Decrypt (\n    IN UINT8 CipherText[],\n    IN UINT CipherTextLength,\n    IN UINT8 Key[],\n    IN UINT KeyLength,\n    IN UINT8 IV[],\n    IN UINT IVLength,\n    OUT UINT8 PlainText[],\n    INOUT UINT *PlainTextLength);\n\n/* AES key wrap operations */\nINT AES_Key_Wrap (\n    IN UINT8 PlainText[],\n    IN UINT  PlainTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    OUT UINT8 CipherText[],\n    OUT UINT *CipherTextLength);\n        \nINT AES_Key_Unwrap (\n    IN UINT8 CipherText[],\n    IN UINT  CipherTextLength,\n    IN UINT8 Key[],\n    IN UINT  KeyLength,\n    OUT UINT8 PlainText [],\n    OUT UINT *PlainTextLength);\n\n\n#endif /* __CRYPT_AES_H__ */\n\n"
  },
  {
    "path": "src/include/crypt_arc4.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    RC4\n\n    Abstract:\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/05/13      ARC4\n***************************************************************************/\n\n#ifndef __CRYPT_ARC4_H__\n#define __CRYPT_ARC4_H__\n\n#include \"rt_config.h\"\n\n/* ARC4 definition & structure */\n#define ARC4_KEY_BLOCK_SIZE 256\n\ntypedef struct {\n\tUINT BlockIndex1;\n\tUINT BlockIndex2;\n\tUINT8 KeyBlock[256];\n} ARC4_CTX_STRUC, *PARC4_CTX_STRUC;\n\n/* ARC4 operations */\nVOID ARC4_INIT(\n\tIN ARC4_CTX_STRUC * pARC4_CTX,\n\tIN PUCHAR pKey,\n\tIN UINT KeyLength);\n\nVOID ARC4_Compute(\n\tIN ARC4_CTX_STRUC * pARC4_CTX,\n\tIN UINT8 InputBlock[],\n\tIN UINT InputBlockSize,\n\tOUT UINT8 OutputBlock[]);\n\nVOID ARC4_Discard_KeyLength(\n\tIN ARC4_CTX_STRUC * pARC4_CTX,\n\tIN UINT Length);\n\n#endif /* __CRYPT_ARC4_H__ */\n"
  },
  {
    "path": "src/include/crypt_biginteger.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    BigInteger\n\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/01/12      Create\n***************************************************************************/\n\n#ifndef __CRYPT_BIGINTEGER_H__\n#define __CRYPT_BIGINTEGER_H__\n\n#include \"rt_config.h\"\n\n\n/* BigInteger definition & structure */\n#define SLIDING_WINDOW 16\ntypedef struct _BIG_INTEGER_STRUC\n{\n\tSTRING Name[10];\n\tUINT32 *pIntegerArray;\n\tUINT AllocSize;\n\tUINT ArrayLength;\n\tUINT IntegerLength;\n\tINT  Signed;\n} BIG_INTEGER, *PBIG_INTEGER;\n\n\n/* BigInteger operations */\nVOID BigInteger_Print (\n    IN PBIG_INTEGER pBI);\n    \nVOID BigInteger_Init (\n    INOUT PBIG_INTEGER *pBI);\n\nVOID BigInteger_Free_AllocSize (\n    IN PBIG_INTEGER *pBI);\n\nVOID BigInteger_Free (\n    IN PBIG_INTEGER *pBI);\n\nVOID BigInteger_AllocSize (\n    IN PBIG_INTEGER *pBI,\n    IN INT Length);\n\nVOID BigInteger_ClearHighBits (\n    IN PBIG_INTEGER pBI);\n\nVOID BigInteger_BI2Bin (\n    IN PBIG_INTEGER pBI, \n    OUT UINT8 *pValue,\n    OUT UINT *Length);\n\nVOID BigInteger_Bin2BI (\n    IN UINT8 *pValue,\n    IN UINT Length,\n    OUT PBIG_INTEGER *pBI);\n\nVOID BigInteger_BitsOfBI (\n    IN PBIG_INTEGER pBI,\n    OUT UINT *Bits_Of_P);\n\nINT BigInteger_GetBitValue (\n    IN PBIG_INTEGER pBI,\n    IN UINT Index);\n\nUINT8 BigInteger_GetByteValue (\n    IN PBIG_INTEGER pBI,\n    IN UINT Index);\n\nVOID BigInteger_Copy (\n    IN PBIG_INTEGER pBI_Copied,\n    OUT PBIG_INTEGER *pBI_Result);\n\nINT BigInteger_UnsignedCompare (\n    IN PBIG_INTEGER pFirstOperand,\n    IN PBIG_INTEGER pSecondOperand);\n\nVOID BigInteger_Add (\n    IN PBIG_INTEGER pFirstOperand,\n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result);\n\nVOID BigInteger_Sub (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result);\n\nVOID BigInteger_Mul (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result);\n\nVOID BigInteger_Square (\n    IN PBIG_INTEGER pBI, \n    OUT PBIG_INTEGER *pBI_Result);\n    \nVOID BigInteger_Div (\n    IN PBIG_INTEGER pFirstOperand, \n    IN PBIG_INTEGER pSecondOperand, \n    OUT PBIG_INTEGER *pBI_Result,\n    OUT PBIG_INTEGER *pBI_Remainder);\n\nVOID BigInteger_Montgomery_Reduction (\n    IN PBIG_INTEGER pBI_A,\n    IN PBIG_INTEGER pBI_P,\n    IN PBIG_INTEGER pBI_R,\n    OUT PBIG_INTEGER *pBI_Result);\n\nVOID BigInteger_Montgomery_ExpMod (\n    IN PBIG_INTEGER pBI_G,\n    IN PBIG_INTEGER pBI_E,\n    IN PBIG_INTEGER pBI_P,\n    OUT PBIG_INTEGER *pBI_Result);\n\n\n#endif /* __CRYPT_BIGINTEGER_H__ */\n\n"
  },
  {
    "path": "src/include/crypt_dh.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    DH\n\n    Abstract:\n    RFC 2631: Diffie-Hellman Key Agreement Method\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2009/01/21      Create Diffie-Hellman, Montgomery Algorithm\n***************************************************************************/\n\n#ifndef __CRYPT_DH_H__\n#define __CRYPT_DH_H__\n\n#include \"rt_config.h\"\n\n\n/* DH operations */\nvoid DH_PublicKey_Generate (\n    IN UINT8 GValue[],\n    IN UINT GValueLength,\n    IN UINT8 PValue[],\n    IN UINT PValueLength,\n    IN UINT8 PrivateKey[],\n    IN UINT PrivateKeyLength,\n    OUT UINT8 PublicKey[],\n    INOUT UINT *PublicKeyLength);\n\nvoid DH_SecretKey_Generate (\n    IN UINT8 PublicKey[],\n    IN UINT PublicKeyLength,\n    IN UINT8 PValue[],\n    IN UINT PValueLength,\n    IN UINT8 PrivateKey[],\n    IN UINT PrivateKeyLength,\n    OUT UINT8 SecretKey[],\n    INOUT UINT *SecretKeyLength);\n\n#define RT_DH_PublicKey_Generate(GK, GKL, PV, PVL, PriK, PriKL, PubK, PubKL) \\\n    DH_PublicKey_Generate((GK), (GKL), (PV), (PVL), (PriK), (PriKL), (UINT8 *) (PubK), (UINT *) (PubKL))\n\n#define RT_DH_SecretKey_Generate(PubK, PubKL, PV, PVL, PriK, PriKL, SecK, SecKL) \\\n    DH_SecretKey_Generate((PubK), (PubKL), (PV), (PVL), (PriK), (PriKL), (UINT8 *) (SecK), (UINT *) (SecKL))\n\n#define RT_DH_FREE_ALL()\n\n    \n#endif /* __CRYPT_DH_H__ */\n\n"
  },
  {
    "path": "src/include/crypt_hmac.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    HMAC\n\n    Abstract:\n    FIPS 198: The Keyed-Hash Message Authentication Code (HMAC)\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2008/11/24      Create HMAC-SHA1, HMAC-SHA256\n***************************************************************************/\n\n#ifndef __CRYPT_HMAC_H__\n#define __CRYPT_HMAC_H__\n\n#include \"rt_config.h\"\n\n\n#ifdef SHA1_SUPPORT\n#define HMAC_SHA1_SUPPORT\nVOID RT_HMAC_SHA1(\n\tIN const UINT8 Key[],\n\tIN UINT KeyLen,\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen,\n\tOUT UINT8 MAC[],\n\tIN UINT MACLen);\n#endif /* SHA1_SUPPORT */\n\n#ifdef SHA256_SUPPORT\n#define HMAC_SHA256_SUPPORT\nVOID RT_HMAC_SHA256(\n\tIN const UINT8 Key[],\n\tIN UINT KeyLen,\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen,\n\tOUT UINT8 MAC[],\n\tIN UINT MACLen);\n#endif /* SHA256_SUPPORT */\n\n#ifdef MD5_SUPPORT\n#define HMAC_MD5_SUPPORT\nVOID RT_HMAC_MD5(\n\tIN const UINT8 Key[],\n\tIN UINT KeyLen,\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen,\n\tOUT UINT8 MAC[],\n\tIN UINT MACLen);\n#endif /* MD5_SUPPORT */\n\n\n#endif /* __CRYPT_HMAC_H__ */\n"
  },
  {
    "path": "src/include/crypt_md5.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    MD5\n\n    Abstract:\n    RFC1321: The MD5 Message-Digest Algorithm\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2008/11/24      Create md5\n***************************************************************************/\n\n#ifndef __CRYPT_MD5_H__\n#define __CRYPT_MD5_H__\n\n\n/* Algorithm options */\n#define MD5_SUPPORT\n\n#ifdef MD5_SUPPORT\n#define MD5_BLOCK_SIZE    64\t/* 512 bits = 64 bytes */\n#define MD5_DIGEST_SIZE   16\t/* 128 bits = 16 bytes */\ntypedef struct {\n\tUINT32 HashValue[4];\n\tUINT64 MessageLen;\n\tUINT8 Block[MD5_BLOCK_SIZE];\n\tUINT BlockLen;\n} MD5_CTX_STRUC, *PMD5_CTX_STRUC;\n\nVOID RT_MD5_Init(\n\tIN MD5_CTX_STRUC * pMD5_CTX);\nVOID RT_MD5_Hash(\n\tIN MD5_CTX_STRUC * pMD5_CTX);\nVOID RT_MD5_Append(\n\tIN MD5_CTX_STRUC * pMD5_CTX,\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen);\nVOID RT_MD5_End(\n\tIN MD5_CTX_STRUC * pMD5_CTX,\n\tOUT UINT8 DigestMessage[]);\nVOID RT_MD5(\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen,\n\tOUT UINT8 DigestMessage[]);\n#endif /* MD5_SUPPORT */\n\n\n#endif /* __CRYPT_MD5_H__ */\n"
  },
  {
    "path": "src/include/crypt_sha2.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n    Module Name:\n    SHA2\n\n    Abstract:\n    FIPS 180-2: Secure Hash Standard (SHS)\n    \n    Revision History:\n    Who         When            What\n    --------    ----------      ------------------------------------------\n    Eddy        2008/11/24      Create SHA1\n    Eddy        2008/07/23      Create SHA256\n***************************************************************************/\n\n#ifndef __CRYPT_SHA2_H__\n#define __CRYPT_SHA2_H__\n\n\n/* Algorithm options */\n#define SHA1_SUPPORT\n#define SHA256_SUPPORT\n\n#ifdef SHA1_SUPPORT\n#define SHA1_BLOCK_SIZE    64\t/* 512 bits = 64 bytes */\n#define SHA1_DIGEST_SIZE   20\t/* 160 bits = 20 bytes */\ntypedef struct _SHA1_CTX_STRUC {\n\tUINT32 HashValue[5];\t/* 5 = (SHA1_DIGEST_SIZE / 32) */\n\tUINT64 MessageLen;\t/* total size */\n\tUINT8 Block[SHA1_BLOCK_SIZE];\n\tUINT BlockLen;\n} SHA1_CTX_STRUC, *PSHA1_CTX_STRUC;\n\nVOID RT_SHA1_Init(\n\tIN SHA1_CTX_STRUC * pSHA_CTX);\nVOID RT_SHA1_Hash(\n\tIN SHA1_CTX_STRUC * pSHA_CTX);\nVOID RT_SHA1_Append(\n\tIN SHA1_CTX_STRUC * pSHA_CTX,\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen);\nVOID RT_SHA1_End(\n\tIN SHA1_CTX_STRUC * pSHA_CTX,\n\tOUT UINT8 DigestMessage[]);\nVOID RT_SHA1(\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen,\n\tOUT UINT8 DigestMessage[]);\n#endif /* SHA1_SUPPORT */\n\n#ifdef SHA256_SUPPORT\n#define SHA256_BLOCK_SIZE   64\t/* 512 bits = 64 bytes */\n#define SHA256_DIGEST_SIZE  32\t/* 256 bits = 32 bytes */\ntypedef struct _SHA256_CTX_STRUC {\n\tUINT32 HashValue[8];\t/* 8 = (SHA256_DIGEST_SIZE / 32) */\n\tUINT64 MessageLen;\t/* total size */\n\tUINT8 Block[SHA256_BLOCK_SIZE];\n\tUINT BlockLen;\n} SHA256_CTX_STRUC, *PSHA256_CTX_STRUC;\n\nVOID RT_SHA256_Init(\n\tIN SHA256_CTX_STRUC * pSHA_CTX);\nVOID RT_SHA256_Hash(\n\tIN SHA256_CTX_STRUC * pSHA_CTX);\nVOID RT_SHA256_Append(\n\tIN SHA256_CTX_STRUC * pSHA_CTX,\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen);\nVOID RT_SHA256_End(\n\tIN SHA256_CTX_STRUC * pSHA_CTX,\n\tOUT UINT8 DigestMessage[]);\nVOID RT_SHA256(\n\tIN const UINT8 Message[],\n\tIN UINT MessageLen,\n\tOUT UINT8 DigestMessage[]);\n#endif /* SHA256_SUPPORT */\n\n\n#endif /* __CRYPT_SHA2_H__ */\n"
  },
  {
    "path": "src/include/cs.h",
    "content": "#ifndef __CS_H__\n#define __CS_H__\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#define CARRIER_DETECT_RECHECK_TIME\t\t\t3\n#define CARRIER_GONE_TRESHOLD\t\t\t\t10 /* Radar tone count in 1 sec */\n#define CARRIER_DETECT_THRESHOLD\t\t\t0x0fffffff\n#define CARRIER_DETECT_STOP_RATIO\t\t\t2\n#define CARRIER_DETECT_STOP_RECHECK_TIME\t\t4\n#define CARRIER_DETECT_DEFAULT_MASK\t\t\t20\n#define CARRIER_DETECT_DELTA\t\t\t\t7\n#define CARRIER_DETECT_DIV_FLAG\t\t\t\t0\n#define CD_INT_POLLING_CMD\t\t\t0x67\n#define CARRIER_DETECT_CRITIRIA\t\t\t\t7000\n\ntypedef enum CD_STATE_n {\n\tCD_NORMAL,\n\tCD_SILENCE,\n\tCD_MAX_STATE\n} CD_STATE;\n\ntypedef enum _TONE_RADAR_VERSION {\n\tDISABLE_TONE_RADAR = 0,\n\tTONE_RADAR_V1,\n\tTONE_RADAR_V2\n} TONE_RADAR_VERSION;\n\ntypedef struct CARRIER_DETECTION_s {\n\tBOOLEAN Enable;\n\tUINT8 CDSessionTime;\n\tUINT8 CDPeriod;\n\tCD_STATE CD_State;\n\tUINT8 delta;\n\tUINT8 SymRund;\n\tUINT8 div_flag;\n\tUINT32 threshold;\n\tUINT8 recheck;\n\tUINT8 recheck1;\n\tUINT32 TimeStamp; /*unit:16us*/\n\tUINT32 criteria;\n\tULONG idle_time;\n\tULONG busy_time;\n\tULONG Debug;\n\tULONG OneSecIntCount;\n\tUINT8 CarrierGoneThreshold;\n\tUCHAR VGA_Mask;\n\tUCHAR Packet_End_Mask;\n\tUCHAR Rx_PE_Mask;\n} CARRIER_DETECTION_STRUCT, *PCARRIER_DETECTION_STRUCT;\n\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\n/* Mcu command */\n#define CD_ONOFF_MCU_CMD\t\t\t0x65\n#define CD_CHECKOUT_MCU_CMD\t\t\t0x66\n/* share memory offsets */\n#define CD_CRITERIA     \t\t\t0x4CB2\n#define CD_CHECK_COUNT  \t\t\t0x4CB9\n#define RADAR_TONE_COUNT\t\t\t0x4CBE\n#define CD_RECHECK      \t\t\t0x4CBF\n#undef CARRIER_DETECT_RECHECK_TIME\n#undef CARRIER_GONE_TRESHOLD\n#undef CARRIER_DETECT_THRESHOLD\n#define CARRIER_DETECT_RECHECK_TIME\t\t\t5\n#define CARRIER_GONE_TRESHOLD\t\t\t\t35\n#define CARRIER_DETECT_THRESHOLD\t\t\t0x4fffffff\n\n/* Parameters needed to decide the Carrier Detect State */\ntypedef struct _CARRIER_DETECT_PARAM {\n\t\tUINT8\tRadarToneCount; /* Number of radar tones in 100 msec*/\n\t\tUINT8\tReCheck;\n} CARRIER_DETECT_PARAM, *PCARRIER_DETECT_PARAM;\n\n/* For debug print */\ntypedef struct _CARRIER_DETECT_DEBUG {\n\t \tUINT8\tdelta_div;\n\t\tUINT8\tinternalRadarToneCount;\n\t\tUINT16\tCriteria;\n\t\tUINT32\tThreshold;\n\t\tUINT8\tCount;\n\t\tUINT8\tCheckCount;\n\t\tUINT8 \tReserved;\n\t\tUINT8\tVGA_Mask;\n\t\tUINT8\tPckMask;\n\t\tUINT8\tRxPeMask;\n\t\tUINT8\tRadarToneCount;\n\t\tUINT8\tReCheck;\n} CARRIER_DETECT_DEBUG, *PCARRIER_DETECT_DEBUG;\n#endif /*CARRIER_DETECTION_FIRMWARE_SUPPORT*/\n\nINT isCarrierDetectExist(\n\tIN PRTMP_ADAPTER pAd);\n\nINT CarrierDetectReset(\n\tIN PRTMP_ADAPTER pAd);\n\nextern VOID RtmpOsMsDelay(\n\tIN\tULONG\tmsec);\n\nINT Set_CarrierCriteria_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING \t\t\targ);\n\nINT Set_CarrierReCheck_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PSTRING \t\t\targ);\n\nINT Set_CarrierGoneThreshold_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PSTRING\t\t\targ);\n\nINT Set_CarrierStopCheck_Proc(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PSTRING \t\t\targ);\n\nINT\tSet_CarrierDebug_Proc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING \t\targ);\n\nINT\tSet_CarrierDelta_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_CarrierDivFlag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_CarrierThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n/* v2 functions */\nINT\tSet_CarrierSymRund_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_CarrierMask_Proc(\n    IN PRTMP_ADAPTER   pAd,\n    IN PSTRING         arg);\n\nVOID CSInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID CarrierDetectionStart(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RTMPHandleRadarInterrupt(\n\tIN PRTMP_ADAPTER  pAd);\n\nVOID CarrierDetectionStop(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID ToneRadarProgram_v1(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG threshold);\n\nVOID ToneRadarProgram_v2(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG threshold);\n\n#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT\nVOID CarrierDetectionPeriodicStateCtrl(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nINT Set_CarrierDetect_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n#endif /*CONFIG_AP_SUPPORT*/\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#endif /*__CS_H__*/\n"
  },
  {
    "path": "src/include/dfs.h",
    "content": "\n/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    dfs.h\n\n    Abstract:\n    Support DFS function.\n\n    Revision History:\n    Who       When            What\n    --------  ----------      ----------------------------------------------\n    Fonchi    03-12-2007      created\n*/\n#ifndef __DFS_H__\n#define __DFS_H__\n\n/*************************************************************************\n  *\n  *\tDFS Radar related definitions.\n  *\n  ************************************************************************/ \n\n#ifdef DFS_SUPPORT\n#define RADAR_DEBUG_SHOW_RAW_EVENT\t\t0x01  /* Show the 384-bytes raw data of event buffer */\n#define RADAR_DEBUG_EVENT\t\t\t\t\t0x02  /* Show effective event reads out from the event buffer */\n#define RADAR_DEBUG_SILENCE\t\t\t\t0x04\n#define RADAR_DEBUG_SW_SILENCE\t\t\t0x08\n#define RADAR_DONT_SWITCH\t\t0x10 /* Don't Switch channel when hit */\n#define RADAR_DEBUG_DONT_CHECK_BUSY\t\t0x20\n#define RADAR_DEBUG_DONT_CHECK_RSSI\t\t0x40\n#define RADAR_SIMULATE\t\t\t\t\t\t0x80 /* simulate a short pulse hit this channel */\n\n/* McuCmd */\n#define DFS_ONOFF_MCU_CMD\t\t\t\t\t0x64\n\n/*#define DFS_SW_RADAR_DECLARE_THRES\t3*/\n#define DFS_EVENT_SIZE\t\t\t\t\t\t6    /* Number of bytes of each DFS event */\n#define DFS_EVENT_BUFFER_SIZE\t\t\t\t384  /* Number of bytes of a DFS event buffer */\n#define DFS_SW_RADAR_CHECK_LOOP\t\t\t\t50\n#define DFS_SW_RADAR_SHIFT          \t\t3\n#define DFS_SW_RADAR_CH0_ERR\t\t\t\t8\n#define DFS_SW_RADAR_PERIOD_ERR\t\t\t\t4\n#define CE_STAGGERED_RADAR_CH0_H_ERR\t\t(DFS_SW_RADAR_CH0_ERR + 16) // the step is 16 for every 0.1 us different in width\n#define CE_STAGGERED_RADAR_DECLARE_THRES\t2\n\n#define NEW_DFS_FCC_5_ENT_NUM\t\t\t5\n#define NEW_DFS_DBG_PORT_ENT_NUM_POWER\t8\n#define NEW_DFS_DBG_PORT_ENT_NUM\t\t(1 << NEW_DFS_DBG_PORT_ENT_NUM_POWER)\t/* CE Debug Port entry number, 256 */\n#define NEW_DFS_DBG_PORT_MASK\t\t\t(NEW_DFS_DBG_PORT_ENT_NUM - 1)\t/* 0xff */\n\n#define CH_BUSY_SAMPLE_POWER 3\n#define CH_BUSY_SAMPLE \t\t(1 << CH_BUSY_SAMPLE_POWER)\n#define CH_BUSY_MASK  \t\t(CH_BUSY_SAMPLE - 1)\n\n#define MAX_FDF_NUMBER 5\t/* max false-detection-filter number */\n\n/* Matched Period definition */\n#define NEW_DFS_MPERIOD_ENT_NUM_POWER\t8\n#define NEW_DFS_MPERIOD_ENT_NUM\t\t\t(1 << NEW_DFS_MPERIOD_ENT_NUM_POWER)\t/* CE Period Table entry number, 512 */\n#define NEW_DFS_CHANNEL_0\t\t\t\t1\n#define NEW_DFS_CHANNEL_1\t\t\t\t2\n#define NEW_DFS_CHANNEL_2\t\t\t\t4\n#define NEW_DFS_CHANNEL_3\t\t\t\t8\n#define NEW_DFS_CHANNEL_4\t\t\t\t16\n#define NEW_DFS_CHANNEL_5\t\t\t\t32\n\n#define NEW_DFS_MAX_CHANNEL\t\t\t5\n\n#define CE_SW_CHECK\t\t\t\t\t\t3\n\n#define NEW_DFS_WATCH_DOG_TIME\t\t1 /* note that carrier detection also need timer interrupt hook*/\n\n#define NEW_DFS_FCC\t\t0x1 /* include Japan*/\n#define NEW_DFS_EU\t\t0x2\n#define NEW_DFS_JAP\t\t0x4\n#define NEW_DFS_JAP_W53\t0x8\n#define NEW_DFS_END\t\t0xff\n#define MAX_VALID_RADAR_W\t5\n#define MAX_VALID_RADAR_T\t5\n\n#define DFS_SW_RADAR_CH1_SHIFT\t\t3\n#define DFS_SW_RADAR_CH2_SHIFT\t\t3\n\n#define CE_STAGGERED_RADAR_PERIOD_MAX\t\t((133333 + 125000 + 117647 + 1000) * 2)\n#define FCC_RADAR_PERIOD_MAX\t\t\t\t(((28570 << 1) + 1000) * 2)\n#define JAP_RADAR_PERIOD_MAX\t\t\t\t(((80000 << 1) + 1000) * 2)\n\n#define NEW_DFS_BANDWITH_MONITOR_TIME \t(NEW_DFS_CHECK_TIME / NEW_DFS_CHECK_TIME_TASKLET)\n#define NEW_DFS_CHECK_TIME\t\t\t\t300\n#define NEW_DFS_CHECK_TIME_TASKLET\t\t3\n\n/*#define DFS_SW_RADAR_DECLARE_THRES\t3*/\n\n#define DFS_SW_RADAR_SHIFT          3\n\n#define DFS_SW_RADAR_CH0_ERR\t\t8\n\n#define CE_STAGGERED_RADAR_CH0_H_ERR\t\t(DFS_SW_RADAR_CH0_ERR + 16) /* the step is 16 for every 0.1 us different in width*/\n\n#define CE_STAGGERED_RADAR_DECLARE_THRES\t2\n\n\n/* DFS Macros */\n#define PERIOD_MATCH(a, b, c)\t\t\t((a >= b)? ((a-b) <= c):((b-a) <= c))\n#define ENTRY_PLUS(a, b, c)\t\t\t\t(((a+b) < c)? (a+b) : (a+b-c))\n#define ENTRY_MINUS(a, b, c)\t\t\t((a >= b)? (a - b) : (a+c-b))\n#define MAX_PROCESS_ENTRY \t\t\t\t16\n\n#define IS_FCC_RADAR_1(HT_BW, T)\t\t\t(((HT_BW)? ((T > 57120) && (T < 57160)) : (T > 28560) && (T < 28580)))\n#define IS_W53_RADAR_2(HT_BW, T)\t\t\t(((HT_BW)? ((T > 153820) && (T < 153872)) : (T > 76910) && (T < 76936)))\n#define IS_W56_RADAR_3(HT_BW, T)\t\t\t(((HT_BW)? ((T > 159900) && (T < 160100)) : (T > 79950) && (T < 80050)))\n\n#define DFS_EVENT_SANITY_CHECK(_pAd, _DfsEvent)\t\\\n\t\t!(((_DfsEvent).EngineId >= _pAd->chipCap.DfsEngineNum) ||\t\\\n\t\t ((_DfsEvent).TimeStamp & 0xffc00000) ||\t\\\n\t\t ((_DfsEvent).Width & 0xe000))\n\t\t \n#define DFS_EVENT_PRINT(_DfsEvent)\t\t\\\n\t\tDBGPRINT(RT_DEBUG_ERROR, ( \"EngineId = %u, Timestamp = %u, Width = %u\\n\",\t\\\n\t\t_DfsEvent.EngineId, _DfsEvent.TimeStamp, _DfsEvent.Width));\n\n\n#define DFS_EVENT_BUFF_PRINT(_StarIdx,  _TableIdx, _BufSize)\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tUINT32 k;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tfor (k = _StarIdx; k < _BufSize; k++)\t\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"0x%02x \", _TableIdx[k]));\t\t\t\t\t\t\\\n\t\tif(k%DFS_EVENT_SIZE == ((DFS_EVENT_SIZE-1+_StarIdx)%DFS_EVENT_SIZE)) \t\\\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n/* check whether we can do DFS detection or not */\n#define DFS_CHECK_FLAGS(_pAd, _pRadarDetect)\t\t\t\t\t\\\n\t\t!((_pAd->Dot11_H.RDMode == RD_SWITCHING_MODE) ||\t\t\\\n\t\t(_pRadarDetect->bDfsInit == FALSE) ||\t\t\t\t\t\t\\\n\t\t(_pRadarDetect->DFSAPRestart == 1))\n\n#ifdef RTMP_MAC_USB\n#define INIT_DFS_EVENT_BUFF_SHARED_MEMORY(_pAd, _StartOffset, _NumOfPages, _InitVal)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tUINT32 i = 0;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tfor (i = _StartOffset; i < _StartOffset + (_NumOfPages*384); i++)\t\t\t\t\t\t\t\\\n\t\tRTUSBSingleWrite(_pAd, i, _InitVal, FALSE);\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_IO_WRITE32(_pAd, BBPR127TABLE_OWNERID, 0x01010101);\t\t\t\t\t\t\t\\\n\tRTMP_IO_WRITE32(_pAd, BBPR127TABLE_OWNERID + 4, 0x01010101);\t\t\t\t\t\t\\\n}\n#endif /* RTMP_MAC_USB */\n\ntypedef enum _DFS_VERSION {\n\tSOFTWARE_DFS = 0,\n\tHARDWARE_DFS_V1,\n\tHARDWARE_DFS_V2\n} DFS_VERSION;\n\ntypedef struct _NewDFSValidRadar\n{\n\tUSHORT type;\n\tUSHORT channel; /* bit map*/\n\tUSHORT WLow;\n\tUSHORT WHigh;\n\tUSHORT W;  /* for fixed width radar*/\n\tUSHORT WMargin;\n\tULONG TLow;\n\tULONG THigh;\n\tULONG T;  /* for fixed period radar */\n\tUSHORT TMargin;\n}NewDFSValidRadar, *pNewDFSValidRadar;\n\ntypedef struct _NewDFSDebugPort {\n\tULONG counter;\n\tULONG timestamp;\n\tUSHORT width;\n\tUSHORT start_idx;\t/* start index to period table */\n\tUSHORT end_idx;\t\t/* end index to period table */\n} NewDFSDebugPort, *pNewDFSDebugPort;\n\n/* Matched Period Table */\ntypedef struct _NewDFSMPeriod {\n\tUSHORT idx;\n\tUSHORT width;\n\tUSHORT idx2;\n\tUSHORT width2;\n\tULONG period;\n} NewDFSMPeriod, *pNewDFSMPeriod;\n\n\n\ntypedef struct _NewDFSParam {\n\tBOOLEAN valid;\n\tUCHAR mode;\n\tUSHORT avgLen;\n\tUSHORT ELow;\n\tUSHORT EHigh;\n\tUSHORT WLow;\n\tUSHORT WHigh;\n\tUCHAR EpsilonW;\n\tULONG TLow;\n\tULONG THigh;\n\tUCHAR EpsilonT;\n\tULONG BLow;\n\tULONG BHigh;\n} NewDFSParam, *pNewDFSParam;\n\ntypedef struct _DFS_PROGRAM_PARAM{\n\tNewDFSParam NewDFSTableEntry[NEW_DFS_MAX_CHANNEL*4];\n\tUSHORT ChEnable;\t/* Enabled Dfs channels (bit wise)*/\n\tUCHAR DeltaDelay;\n\t/* Support after dfs_func >= 2 */\n\tUCHAR Symmetric_Round;\n\tUCHAR VGA_Mask;\n\tUCHAR Packet_End_Mask;\n\tUCHAR Rx_PE_Mask;\n\tULONG RadarEventExpire[NEW_DFS_MAX_CHANNEL];\n}DFS_PROGRAM_PARAM, *PDFS_PROGRAM_PARAM;\n\ntypedef struct _NewDFSTable\n{\n\tUSHORT type;\n\tNewDFSParam entry[NEW_DFS_MAX_CHANNEL];\n}NewDFSTable, *pNewDFSTable;\n\n#ifdef DFS_DEBUG\ntypedef struct _NewDFSDebugResult\n{\n\tchar delta_delay_shift;\n\tchar EL_shift;\n\tchar EH_shift;\n\tchar WL_shift;\n\tchar WH_shift;\n\tULONG hit_time;\n\tULONG false_time;\n}NewDFSDebugResult, *pNewDFSDebugResult;\n#endif\n\ntypedef struct _DFS_EVENT{\n\tUINT8  EngineId;\n\tUINT32 TimeStamp;\n\tUINT16 Width;\n}DFS_EVENT, *PDFS_EVENT;\n\ntypedef struct _DFS_SW_DETECT_PARAM{\n\tNewDFSDebugPort FCC_5[NEW_DFS_FCC_5_ENT_NUM];\n\tUCHAR fcc_5_idx;\n\tUCHAR fcc_5_last_idx;\n\tUSHORT fcc_5_threshold; /* to check the width of long pulse radar */\n\tUSHORT dfs_width_diff_ch1_Shift;\n\tUSHORT dfs_width_diff_ch2_Shift;\n\tUSHORT dfs_period_err;\n\tULONG dfs_max_period;\t/* Max possible Period */\n\tUSHORT dfs_width_diff;\n\tUSHORT dfs_width_ch0_err_L;\n\tUSHORT dfs_width_ch0_err_H;\n\tUCHAR dfs_check_loop;\n\tUCHAR dfs_declare_thres;\t\n\tULONG dfs_w_counter;\n\tDFS_EVENT PreDfsEvent;\t\t/* previous radar event */\n\tUINT32 EvtDropAdjTime;\t\t/* timing threshold for adjacent event */\n\tUINT sw_idx[NEW_DFS_MAX_CHANNEL];\n\tUINT hw_idx[NEW_DFS_MAX_CHANNEL];\n\tUINT pr_idx[NEW_DFS_MAX_CHANNEL];\t\n\tUSHORT dfs_t_idx[NEW_DFS_MAX_CHANNEL];\t\n\tUSHORT dfs_w_idx[NEW_DFS_MAX_CHANNEL];\n\tUSHORT dfs_w_last_idx[NEW_DFS_MAX_CHANNEL];\n\tNewDFSDebugPort DFS_W[NEW_DFS_MAX_CHANNEL][NEW_DFS_DBG_PORT_ENT_NUM];\n\tNewDFSMPeriod DFS_T[NEW_DFS_MAX_CHANNEL][NEW_DFS_MPERIOD_ENT_NUM];\t/* period table */\n\t/*UCHAR\tce_sw_id_check;*/\n\t/*USHORT\tce_sw_t_diff;*/\n\t/*ULONG fcc_5_counter;*/\n\t/* CE Staggered radar / weather radar */\t\n#ifdef DFS_DEBUG\n\t/* Roger debug */\n\tUCHAR DebugPort[384];\n\tUCHAR DebugPortPrint;\t/* 0 = stop, 1 = log req, 2 = loging, 3 = log done */\n\tULONG TotalEntries[4];\n\tULONG T_Matched_2;\n\tULONG T_Matched_3;\n\tULONG T_Matched_4;\n\tULONG T_Matched_5;\n\tUCHAR BBP127Repeat;\n\tULONG CounterStored[5];\n\tULONG CounterStored2[5];\n\tULONG CounterStored3;\n\tNewDFSDebugPort CE_DebugCh0[NEW_DFS_DBG_PORT_ENT_NUM];\n\tNewDFSMPeriod CE_TCh0[NEW_DFS_MPERIOD_ENT_NUM];\n#endif\n}DFS_SW_DETECT_PARAM, *PDFS_SW_DETECT_PARAM;\n\n/***************************************************************************\n  *\tstructure for radar detection and channel switch\n  **************************************************************************/\ntypedef struct _RADAR_DETECT_STRUCT {\n\tUCHAR\tDFSAPRestart;\n\tULONG MCURadarRegion;\n\tCHAR  AvgRssiReq;\n\tULONG DfsLowerLimit;\n\tULONG DfsUpperLimit;\n\tULONG upperlimit;\n\tULONG lowerlimit;\n\tULONG TimeStamp; /*unit: 1us*/\n\tUCHAR ChirpCheck; /* anounce on second detection of chirp radar */\n\tUCHAR bChannelSwitchInProgress; /* RDMode could cover this*/\n\tBOOLEAN bDfsSwDisable; /* disable sotfwre check */\n\tBOOLEAN bDfsInit;\t\t/* to indicate if dfs regs has been initialized */\n\tUSHORT PollTime;\n\tINT DfsRssiHigh;\n\tINT DfsRssiLow;\n\tBOOLEAN DfsRssiHighFromCfg;\n\tBOOLEAN DfsRssiLowFromCfg;\n\tBOOLEAN DfsRssiHighCfgValid;\n\tBOOLEAN DfsRssiLowCfgValid;\t\n\tBOOLEAN DFSParamFromConfig;\t\n\tBOOLEAN use_tasklet;\t\n\tDFS_VERSION dfs_func;\n\tBOOLEAN DFSWatchDogIsRunning;\n\tUCHAR radarDeclared;\n\tBOOLEAN SymRoundFromCfg;\n\tBOOLEAN SymRoundCfgValid;\n\tULONG idle_time;\n\tULONG busy_time;\n\tUCHAR ch_busy;\n\tCHAR\tch_busy_countdown;\n\tUCHAR\tbusy_channel;\n\tUCHAR ch_busy_idle_ratio;\n\tBOOLEAN BusyIdleFromCfg;\n\tBOOLEAN BusyIdleCfgValid;\n\tUCHAR print_ch_busy_sta;\n\tULONG ch_busy_sta[CH_BUSY_SAMPLE];\n\tULONG ch_idle_sta[CH_BUSY_SAMPLE];\n\tUCHAR ch_busy_sta_index;\n\tINT\t\tch_busy_sum;\n\tINT\t\tch_idle_sum;\n\tUCHAR fdf_num;\n\tUSHORT ch_busy_threshold[MAX_FDF_NUMBER];\n\tINT\t\trssi_threshold[MAX_FDF_NUMBER];\t\n\tUCHAR McuRadarDebug;\n\tUSHORT McuRadarTick;\n\tULONG RadarTimeStampHigh;\n\tULONG RadarTimeStampLow;\n\tUCHAR EnabledChMask;\t\t\t\t/* Bit-wise mask for enabled DFS channels */\n\tDFS_PROGRAM_PARAM DfsProgramParam;\n\tDFS_SW_DETECT_PARAM DfsSwParam;\n} RADAR_DETECT_STRUCT, *PRADAR_DETECT_STRUCT;\n\ntypedef struct _NewDFSProgParam\n{\n\tUCHAR channel;\n\tUCHAR mode;\t\t\t/* reg 0x10, Detection Mode[2:0]*/\n\tUSHORT avgLen;\t\t/* reg 0x11~0x12, M[7:0] & M[8]*/\n\tUSHORT ELow;\t\t/* reg 0x13~0x14, Energy Low[7:0] & Energy Low[11:8]*/\n\tUSHORT EHigh;\t\t/* reg 0x15~0x16, Energy High[7:0] & Energy High[11:8]*/\n\tUSHORT WLow;\t\t/* reg 0x28~0x29, Width Low[7:0] & Width Low[11:8]*/\n\tUSHORT WHigh;\t\t/* reg 0x2a~0x2b, Width High[7:0] & Width High[11:8]*/\n\tUCHAR EpsilonW;\t\t/* reg 0x2c, Width Delta[7:0], (Width Measurement Uncertainty) */\n\tULONG TLow;\t\t\t/* reg 0x17~0x1a, Period Low[7:0] & Period Low[15:8] & Period Low[23:16] & Period Low[31:24]*/\n\tULONG THigh;\t\t/* reg 0x1b~0x1e, Period High[7:0] & Period High[15:8] & Period High[23:16] & Period High[31:24]*/\n\tUCHAR EpsilonT;\t\t/* reg 0x27, Period Delt[7:0], (Period Measurement Uncertainty) */\n\tULONG BLow;\t\t\t/* reg 0x1f~0x22, Burst Low[7:0] & Burst Low[15:8] & Burst Low[23:16] & Burst Low[31:24]*/\n\tULONG BHigh;\t\t/* reg 0x23~0x26, Burst High[7:0] & Burst High[15:8] & Burst High[23:16] & Burst High[31:24]\t\t*/\n}NewDFSProgParam, *pNewDFSProgParam;\n\n#ifdef CONFIG_AP_SUPPORT\nVOID NewRadarDetectionStart(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID NewRadarDetectionStop(\n\tIN PRTMP_ADAPTER pAd);\n\nvoid modify_table1(\n\tIN PRTMP_ADAPTER pAd, \n\tIN ULONG idx, \n\tIN ULONG value);\n\nvoid modify_table2(\n\tIN PRTMP_ADAPTER pAd, \n\tIN ULONG idx, \n\tIN ULONG value);\n  \nvoid schedule_dfs_task(\n\t IN PRTMP_ADAPTER pAd);\n \nint SWRadarCheck(\n\t IN PRTMP_ADAPTER pAd, USHORT id);\n\nVOID NewRadarDetectionProgram(\n\tIN PRTMP_ADAPTER pAd,\n\tIN pNewDFSTable pDFS2Table);\n\nBOOLEAN DfsSwCheckOnHwDetection(\n\t IN PRTMP_ADAPTER pAd,\n\t IN pNewDFSTable pDFS2Table,\n\t IN UINT8 DfsChannel,\n\t IN ULONG RadarPeriod,\n\t IN ULONG RadarWidth);\n\nINT Set_RfReg_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT\tShow_BlockCh_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadarDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ResetRadarHwDetect_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_DfsSwDisable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_DfsEnvtDropAdjTime_Proc(\n\tIN PRTMP_ADAPTER   pAd, \n\tIN PSTRING  arg);\n\nINT\tSet_RadarStart_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadarStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadarSetTbl1_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadarSetTbl2_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_Fcc5Thrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ChBusyThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RssiThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_PollTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_PrintBusyIdle_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_RadarSim_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BusyIdleRatio_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DfsRssiHigh_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DfsRssiLow_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_EventExpire_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN      PSTRING                 arg);\n\nINT\tSet_CEPrint_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_Ch0LErr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_MaxPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_PeriodErr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_Ch0HErr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_Ch1Shift_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_Ch2Shift_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DeclareThres_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_CheckLoop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DFS_DEBUG\nINT\tSet_DfsLowerLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DfsUpperLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_FixDfsLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_AvgRssiReq_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_CEPrintDebug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DFS_DEBUG */\n\nvoid dfs_tasklet(unsigned long data);\n\nVOID DFSInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID ApRadarDetectPeriodic(\n\tIN PRTMP_ADAPTER pAd);\n\n\n\n#ifdef RTMP_MAC_USB\n VOID NewUsbTimerCB_Radar(\n\t IN PRTMP_ADAPTER pAd);\n#endif /* RTMP_MAC_USB */\n\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DFS_SUPPORT */\n\n#endif /*_DFS_H__*/\n\n"
  },
  {
    "path": "src/include/dot11ac_vht.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    dot11ac_vht.h\n \n    Abstract:\n\tDefined IE/frame structures of 802.11ac (D1.2).\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Shiang Tu  01-11-2012    created for 11ac\n */\n\n#ifdef DOT11_VHT_AC\n\n\n#ifndef __DOT11AC_VHT_H\n#define __DOT11AC_VHT_H\n\n#include \"rtmp_type.h\"\n\n\n#define IE_VHT_CAP\t\t191\n#define IE_VHT_OP\t\t192\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.160.2\n\tVHT Capabilities Info field\n\n\tmax_mpdu_len: MAximun MPDU Length\n\t\t->Indicate the max MPDU length.\n\t\t\t\t0: 3895 octets(Max A-MSDU length in HT Cap set to 3839)\n\t\t\t\t1: 7991 octets(Max A-MSDU length in HT Cap set to 7935)\n\t\t\t\t2: 11454 octets(Max A-MSDU length in HT Cap set to 7935)\n\t\t\t\t3: reserved\n\tch_width: Supported Channel Width Set \n\t\t->Indicates the channel widths supported by the STA.\n\t\t\t\t0: the STA does not support either 160 or 80+80 MHz\n\t\t\t\t1: the STA support 160 MHz\n\t\t\t\t2: the STA support 160 MHz and 80 + 80 MHz\n\t\t\t\t3: reserved\n\trx_ldpc: Rx LDPC\n\t\t-> Indicates support of receiving LDPC coded packets\n\t\t\t\t0: not support\n\t\t\t\t1: support\n\tsgi_80M: Short GI for 80 MHz\n\t\t-> Indicates short GI support for the reception of VHT+CBW80 packet\n\t\t\t\t0: not support\n\t\t\t\t1: support\n\tsgi_160M: Short GI for 160 and 80 + 80 MHz\n\t\t->Indicates rx short GI for VHT+(CBW160 and CBW80+80) packet\n\t\t\t\t0: not support\n\t\t\t\t1: support\n\ttx_stbc: Tx STBC\n\t\t-> Indicates support for tx of at least 2x1 STBC\n\t\t\t\t0: not support\n\t\t\t\t1: support\n\trx_stbc: Rx STBC\n\t\t-> Indicates support for rx of PPDUs using STBC\n\t\t\t\t0: not support\n\t\t\t\t1: support 1SS\n\t\t\t\t2: support 1SS and 2SS\n\t\t\t\t3: support 1SS, 2SS and 3SS\n\t\t\t\t4: support 1SS, 2SS, 3SS and 4SS\n\t\t\t\t5,6,7: reserved\n\tbfer_cap_su: SU Beamformer Capable\n\t\t->Indicates support for operation as a single user beamformer\n\t\t\t\t0: not support\n\t\t\t\t1: support\n\tbfee_cap_su: SU Beamformee Capable\n\t\t-> Indicates support for operation as a single user beamformee\n\t\t\t\t0: not support\n\t\t\t\t1: support\t\t\t\t\n\tcmp_st_num_bfer: Compressed Steering Number of Beamformer Antenna Supported\n\t\t-> Beamformee's capability indicateing the max number of beamformer \n\t\t\tantennas the beamformee can support when sending compressed\n\t\t\tbeamforming feedback\n\t\t\t\tIf SU beamformee capable, set to the max value minus 1.\n\t\t\t\totehrwise, reserved.\n\tnum_snd_dimension: Number of Sounding Dimensions\n\t\t-> Beamformer's capability indicating the number of antennas used for\n\t\t\tbeamformed transmissions.\n\t\t\t\tIf SU beamformer capable, set to value minus 1.\n\t\t\t\totehrwise, reserved.\n\tbfer_cap_mu: MU Beamformer Capable\n\t\t-> Indicates support for operation as an MU beamformer\n\t\t\t\t0: if not supported or if sent by a non-AP STA\n\t\t\t\t1: supported\n\tbfee_cap_mu: MU Beamformee Capable\n\t\t-> Indicates support for operation as an MU beamformer\n\t\t\t\t0: if not supported or if snet by an AP\n\t\t\t\t1: supported\n\tvht_txop_ps: VHT TXOP PS\n\t\t-> Indicates whether or not the AP supports VHT TXOP Power Save Mode or\n\t\t\twhether or not the STA is in VHT TXOP Power Save Mode\n\t\t->When tx by a VHT AP in the VHT Capabilities element included in Beacon, \n\t\t\tProbeResp, AssocResp, and ReassocResp, frames:\n\t\t\t\t0: if the VHT AP does not support VHT TXOP PS in the BSS.\n\t\t\t\t1: if the VHT AP support TXOP PS in the BSS.\n\t\t->When tx by a VHT non-AP STA in the VHT Capabilities element included\n\t\t\tin AssocReq, ReassocReq and ProbReq frames:\n\t\t\t\t0: if the VHT STA is not in TXOP Power Save Mode.\n\t\t\t\t1: if the VHT STA is in TXOP Power Save Mode.\n\thtc_vht_cap: +HTC-VHT Capable\n\t\t-> Indicates whether or not the STA supports receiving an HT Control \n\t\t\tfield in the VHT format\n\t\t\t\t0: if not support\n\t\t\t\t1: if support\n\tmax_ampdu_exp: Maximum A-MPDU Length Exponent\n\t\t-> Indicates the maximum length of A-MPDU pre-EOF padding that the STA\n\t\t\tcan receive.\n\t\t->The length defined by this field is equal to 2^(13 + max_ampdu_exp) -1\n\t\t\t\t0~7 : integer in the range of 0 to 7.\n\tvht_link_adapt: VHT Link Adaptation Capable\n\t\t-> Indicates whether or not the STA support link adaptation using VHT\n\t\t\tvariant HT Control field.\n\t\t-> This field is ignored if the _HTC-VHT Capble field is set to 0.\n\t\t\t\t0: (No Feedback), if the STA does not provide VHT MFB\n\t\t\t\t2: (Unsolicited), if the STA provides only unsolicited VHT MFB\n\t\t\t\t3: (Both), if the STA can provide VHT MFB in response to VHT MRQ\n\t\t\t\t\tand if the STA provides unsolicited VHT MFB.\n\t\t\t\t1: reserved\n\trx_ant_consistency: Rx Antenna Pattern Consistency\n\t\t->Indicates the possibility of Rx antenna pattern change\n\t\t\t\t0: if Rx antenna pattern might change during association\n\t\t\t\t1: if Rx antenna pattern does not change during association\n\ttx_ant_consistency: Tx Antenna Pattern Consistency\n\t\t->Indicates the possibility of Tx antenna pattern change\n\t\t\t\t0: if Tx antenna pattern might change during association\n\t\t\t\t1: if Tx antenna pattern does not change during association\n*/\ntypedef struct GNU_PACKED _VHT_CAP_INFO{\n#ifdef RT_BIG_ENDIAN\n\tUINT32 rsv:2;\n\tUINT32 tx_ant_consistency:1;\n\tUINT32 rx_ant_consistency:1;\n\tUINT32 vht_link_adapt:2;\n\tUINT32 max_ampdu_exp:3;\n\tUINT32 htc_vht_cap:1;\n\tUINT32 vht_txop_ps:1;\n\tUINT32 bfee_cap_mu:1;\n\tUINT32 bfer_cap_mu:1;\n\tUINT32 num_snd_dimension:3;\n\n\tUINT32 cmp_st_num_bfer:3;\n\tUINT32 bfee_cap_su:1;\n\tUINT32 bfer_cap_su:1;\n\tUINT32 rx_stbc:3;\n\n\tUINT32 tx_stbc:1;\n\tUINT32 sgi_160M:1;\n\tUINT32 sgi_80M:1;\n\tUINT32 rx_ldpc:1;\n\tUINT32 ch_width:2;\n\tUINT32 max_mpdu_len:2;\n#else\n\tUINT32 max_mpdu_len:2;\t/* 0: 3895, 1: 7991, 2: 11454, 3: rsv */\n\tUINT32 ch_width:2;\t/* */\n\tUINT32 rx_ldpc:1;\n\tUINT32 sgi_80M:1;\n\tUINT32 sgi_160M:1;\n\tUINT32 tx_stbc:1;\n\n\tUINT32 rx_stbc:3;\n\tUINT32 bfer_cap_su:1;\n\tUINT32 bfee_cap_su:1;\n\tUINT32 cmp_st_num_bfer:3;\n\n\tUINT32 num_snd_dimension:3;\n\tUINT32 bfer_cap_mu:1;\n\tUINT32 bfee_cap_mu:1;\n\tUINT32 vht_txop_ps:1;\n\tUINT32 htc_vht_cap:1;\n\tUINT32 max_ampdu_exp:3;\n\tUINT32 vht_link_adapt:2;\n\tUINT32 rx_ant_consistency:1;\n\tUINT32 tx_ant_consistency:1;\t\n\tUINT32 rsv:2;\n#endif /* RT_BIG_ENDIAN */\n}VHT_CAP_INFO;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.160.3\n\tRx MCS Map and Tx MCS map, figure 8-401bt\n\n\tmcs_ss1: Max MCS for 1SS\n\tmcs_ss2: Max MCS for 2SS\n\tmcs_ss3: Max MCS for 3SS\n\tmcs_ss4: Max MCS for 4SS\n\tmcs_ss5: Max MCS for 5SS\n\tmcs_ss6: Max MCS for 6SS\n\tmcs_ss7: Max MCS for 7SS\n\tmcs_ss8: Max MCS for 8SS\n\n\tThe 2-bit MAx MCS for n SS field for each number of spatial streams n = 1~8\n\tis encoded as following:\n\t\t0: indicates support for MCS 0~7\n\t\t1: indicates support for MCS 0~8\n\t\t2: indicates support for MCS 0~9\n\t\t3: indicates that n spatial streams is not supported.\n\tNote: some MCSs are not be valid for particular bandwidth and number of\n\t\tspatial stream combinations.\n*/\n#define VHT_MCS_CAP_7\t0\n#define VHT_MCS_CAP_8\t1\n#define VHT_MCS_CAP_9\t2\n#define VHT_MCS_CAP_NA\t3\n\ntypedef struct GNU_PACKED _VHT_MCS_MAP{\n#ifdef RT_BIG_ENDIAN\n\tUINT16 mcs_ss8:2;\n\tUINT16 mcs_ss7:2;\n\tUINT16 mcs_ss6:2;\n\tUINT16 mcs_ss5:2;\n\tUINT16 mcs_ss4:2;\n\tUINT16 mcs_ss3:2;\n\tUINT16 mcs_ss2:2;\n\tUINT16 mcs_ss1:2;\n#else\n\tUINT16 mcs_ss1:2;\n\tUINT16 mcs_ss2:2;\n\tUINT16 mcs_ss3:2;\n\tUINT16 mcs_ss4:2;\n\tUINT16 mcs_ss5:2;\n\tUINT16 mcs_ss6:2;\n\tUINT16 mcs_ss7:2;\n\tUINT16 mcs_ss8:2;\n#endif /* RT_BIG_ENDIAN */\n}VHT_MCS_MAP;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.160.3\n\tVHT Supported MCS Set field, figure 8-401bs\n\n\trx_mcs_map: Rx MCS Map\n\t\t-> Indicates the maximum MCS that can be received for each number of\n\t\t\tspatial streams\n\t\t\t\tSee \"VHT_MCS_MAP\"\n\trx_high_rate: Rx Highest Supported Data Rate\n\t\t-> Indicates the maximum data rate that the STA can receive\n\t\t-> In unit of 1Mb/s where 1 represents 1Mb/s, and incrementing in steps\n\t\t\tof 1 Mb/s.\n\t\t-> If the maximum data rate expressed in Mb/s is not an integer, then\n\t\t\tthe value is rounded up to the next integer.\n\ttx_mcs_map: Tx MCS Map\n\ttx_high_rate: Tx Highest Supported Data Rate\n\t\t-> Indicates the maximum data rate that the STA will transmit\n\t\t-> In unit of 1Mb/s where 1 represents 1Mb/s, and incrementing in steps\n\t\t\tof 1 Mb/s.\n\t\t-> If the maximum data rate expressed in Mb/s is not an integer, then\n\t\t\tthe value is rounded up to the next integer.\n*/\n\n// TODO: shiang-6590, check the layout of this data structure!!!!\ntypedef struct GNU_PACKED _VHT_MCS_SET{\n#ifdef RT_BIG_ENDIAN\n\tUINT16 rsv2:3;\n\tUINT16 tx_high_rate:13;\n\tstruct _VHT_MCS_MAP tx_mcs_map;\n\tUINT16 rsv:3;\n\tUINT16 rx_high_rate:13;\n\tstruct _VHT_MCS_MAP rx_mcs_map;\t\n#else\n\tstruct _VHT_MCS_MAP rx_mcs_map;\t\n\tUINT16 rx_high_rate:13;\n\tUINT16 rsv:3;\n\tstruct _VHT_MCS_MAP tx_mcs_map;\n\tUINT16 tx_high_rate:13;\n\tUINT16 rsv2:3;\n#endif /* RT_BIG_ENDIAN */\n}VHT_MCS_SET;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.160.1\n\tVHT Capabilities Element structure\n\n\teid: Element ID\n\t\t\t191   (IE_VHT_CAP)\n\tlen: Length\n\t\t\t12\n\tvht_cap: VHT Capabilities Info\n\t\t->contains a numner of fields that are used to advertise VHT capabilities\n\t\t\tof a VHT STA\n\tmcs_set: VHT supported MCS Set\n\t\t->Used to convey the combinations of MCSs and spatial streams a STA\n\t\t\tsupports for both reception and transmission.\n*/\ntypedef struct GNU_PACKED _VHT_CAP_IE{\n\tVHT_CAP_INFO vht_cap;\n\tVHT_MCS_SET mcs_set;\n}VHT_CAP_IE;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.161\n\tVHT Operation Information field, figure 8-401bv\n\n\tThe operation of VHT STAs in the BSS is controlled by the HT Operation\n\telement and the VHT Operation element.\n\t\n\tch_width: Channel Width\n\t\t-> This field, together with the HT Operation element STA Channel Width\n\t\t\tfield, defines the BSS operating channel width.\n\t\t\t\t0: for 20MHz or 40MHz operating channel width\n\t\t\t\t1: for 80MHz operating channel width\n\t\t\t\t2: for 160MHz operating channel width\n\t\t\t\t3: for 80+80MHz operating channel width\n\t\t\t\t4~255: reserved\n\tcenter_freq_1: Channel Center Frequency Segment 1\n\t\t-> Defines the channel center frequency for an 80 and 160MHz VHT BSS\n\t\t\tand the segment 1 channel center frequency for an 80+90MHz VHT BSS.\n\t\t-> For 80MHZ or 160MHz operating channel width, indicates the channel\n\t\t\tcenter frequency index for the 80MHz or 160MHz channel on which the\n\t\t\tVHT BSS operates.\n\t\t->For 80+80MHz operating channel width, indicates the channel center\n\t\t\tfrequency index for the 80MHz channel of frequency segment 1 on\n\t\t\twhich the VHT BSS operates.\n\t\t->Set 0 for 20MHz or 40MHz operating channel width.\n\t\t\t\n\tcenter_freq_2: Channel Center Frequency Segment 2\n\t\t-> Defines the seg 2 channel center frequency for an 80+80MHz VHT BSS\n\t\t->For a 80+80MHz operating channel width, indicates the channel center\n\t\t\tfrequency index of the 80MHz channel of frequency segment 2 on\n\t\t\twhich the VHT BSS operates. Reserved otherwise.\n*/\ntypedef struct GNU_PACKED _VHT_OP_INFO{\n\tUINT8 ch_width;\n\tUINT8 center_freq_1;\n\tUINT8 center_freq_2;\n}VHT_OP_INFO;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.161\n\tVHT Operation element, figure 8-401bu\n\n\tThe operation of VHT STAs in the BSS is controlled by the HT Operation\n\telement and the VHT Operation element.\n\t\n\teid: Element ID\n\t\t\t192 (IE_VHT_OP)\n\tlen: Length\n\t\t\t5\n\tvht_op_info: VHT Operation Information\n\tbasic_mcs_set: VHT Basic MCS Set\n*/\ntypedef struct GNU_PACKED _VHT_OP_IE{\n\tVHT_OP_INFO vht_op_info;\n\tVHT_MCS_MAP basic_mcs_set;\n}VHT_OP_IE;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.163\n\tWide Bandwidth Channel Switch element, figure 8-401bx\n\n\tincluded in the Channel Switch Announcement frames.\n\t\n\tnew_ch_width: New STA Channel Width\n\tcenter_freq_1: New Channel Center Frequency Segment 1\n\tcenter_freq_2: New Channel Center Frequency Segment 2\n\n\tThe definition of upper subfields is the same as \"VHT_OP_INFO\"\n*/\ntypedef struct GNU_PACKED _WIDE_BW_CH_SWITCH_IE{\n\tUINT8 e_id;\n\tUINT len;\n\tUINT8 new_ch_width;\n\tUINT8 center_freq_1;\n\tUINT8 center_freq_2;\n}WIDE_BW_CH_SWITCH_IE;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.164\n\tVHT Transmit Power Envelope element\n\n\t\n*/\ntypedef struct GNU_PACKED _CH_SEG_PAIR{\n\tUINT8 ch_center_freq;\n\tUINT8 seg_ch_width;\n}CH_SEG_PAIR;\n\n\n/*\n\tIEEE 802.11AC D2.0, sec 8.4.2.164\n\tVHT Transmit Power Envelope element\n\n\tmax_txpwr: Maximum Transmit Power\n\t\t-> Define the maximum transmit power limit of the tx bandwidth defined\n\t\t\tby the VHT Transmit Power Envelop element. The Maximum Transmit\n\t\t\tPower field is a 8 bit 2's complement signed integer in the range of \n\t\t\t-64 dBm to 63.5 dBm with a 0.5 dB step.\n\n\tNOTE: The following two subfields may repeated as needed.\n\t\tcenter_freq_1: Channel Center Frequency Segment\n\t\tch_seg_width: Segment Channel Width\n*/\ntypedef struct GNU_PACKED _VHT_TXPWR_ENV_IE{\n\tUINT8 e_id;\n\tUINT8 len;\n\tUINT8 max_txpwr;\n\tCH_SEG_PAIR ch_seg_pair[0];\n}VHT_TXPWR_ENV_IE;\n\n\n\ntypedef struct  GNU_PACKED _VHT_CONTROL{\n#ifdef RT_BIG_ENDIAN\n\tUINT32 RDG:1;\n\tUINT32 ACConstraint:1;\n\tUINT32 unso_mfb:1;\n\tUINT32 fb_tx_type:1;\n\tUINT32 coding:1;\n\tUINT32 gid_h:3;\n\tUINT32 mfb_snr:6;\n\tUINT32 mfb_bw:2;\n\tUINT32 mfb_mcs:4;\n\tUINT32 mfb_n_sts:3;\n\tUINT32 mfsi_gidl:3;\n\tUINT32 stbc_ind:1;\n\tUINT32 comp_msi:2;\n\tUINT32 mrq:1;\n\tUINT32 rsv:1;\n\tUINT32 vht:1;\n#else\n\tUINT32 vht:1;\n\tUINT32 rsv:1;\n\tUINT32 mrq:1;\n\tUINT32 comp_msi:2;\n\tUINT32 stbc_ind:1;\n\tUINT32 mfsi_gidl:3;\n\tUINT32 mfb_n_sts:3;\n\tUINT32 mfb_mcs:4;\n\tUINT32 mfb_bw:2;\n\tUINT32 mfb_snr:6;\n\tUINT32 gid_h:3;\n\tUINT32 coding:1;\n\tUINT32 fb_tx_type:1;\n\tUINT32 unso_mfb:1;\n\tUINT32 ACConstraint:1;\n\tUINT32 RDG:1;\n#endif\n}VHT_CONTROL;\n\n\ntypedef struct GNU_PACKED _NDPA_PKT{\n\tUSHORT frm_ctrl;\n\tUSHORT duration;\n\tUINT8 ra[MAC_ADDR_LEN];\n\tUINT8 ta[MAC_ADDR_LEN];\n\tUINT8 snd_seq;\n}DNPA_PKT;\n\n\n\t\n#endif /* __DOT11AC_VHT_H */\n\n#endif /* DOT11_VHT_AC */\n\n"
  },
  {
    "path": "src/include/dot11i_wpa.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 5F., No.36 Taiyuan St., Jhubei City,\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2008, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tdot11i_wpa.h\n\t\n\tRevision History:\n\tWho \t\t\tWhen\t\t\tWhat\n\t--------\t\t----------\t\t----------------------------------------------\n\t\n*/\n\n#ifndef\t__DOT11I_WPA_H__\n#define\t__DOT11I_WPA_H__\n\n#include \"rtmp_type.h\"\n\n/* The length is the EAPoL-Key frame except key data field. \n   Please refer to 802.11i-2004 ,Figure 43u in p.78 */\n#define MIN_LEN_OF_EAPOL_KEY_MSG\t95\t\n\n/* The related length of the EAPOL Key frame */\n#define LEN_KEY_DESC_NONCE\t\t\t32\n#define LEN_KEY_DESC_IV\t\t\t\t16\n#define LEN_KEY_DESC_RSC\t\t\t8\n#define LEN_KEY_DESC_ID\t\t\t\t8\n#define LEN_KEY_DESC_REPLAY\t\t\t8\n#define LEN_KEY_DESC_MIC\t\t\t16\n\n/* EAP Code Type */\n#define EAP_CODE_REQUEST\t1\n#define EAP_CODE_RESPONSE\t2\n#define EAP_CODE_SUCCESS    3\n#define EAP_CODE_FAILURE    4\n\n/* EAPOL frame Protocol Version */\n#define\tEAPOL_VER\t\t\t\t\t1\n#define\tEAPOL_VER2\t\t\t\t\t2\n\n/* EAPOL-KEY Descriptor Type */\n#define\tWPA1_KEY_DESC\t\t\t\t0xfe\n#define WPA2_KEY_DESC               0x02\n\n/* Key Descriptor Version of Key Information */\n#define\tKEY_DESC_TKIP\t\t\t1\n#define\tKEY_DESC_AES\t\t\t2\n#define KEY_DESC_EXT\t\t\t3\n\n#define IE_WPA\t\t\t\t\t221\n#define IE_RSN\t\t\t\t\t48\n\n#define WPA_KDE_TYPE\t\t\t0xdd\n\n/*EAP Packet Type */\n#define\tEAPPacket\t\t0\n#define\tEAPOLStart\t\t1\n#define\tEAPOLLogoff\t\t2\n#define\tEAPOLKey\t\t3\n#define\tEAPOLASFAlert\t4\n#define\tEAPTtypeMax\t\t5\n\n#define PAIRWISEKEY\t\t\t\t\t1\n#define GROUPKEY\t\t\t\t\t0\n\n/* RSN IE Length definition */\n#define MAX_LEN_OF_RSNIE         \t255\n#define MIN_LEN_OF_RSNIE         \t18\n#define MAX_LEN_GTK\t\t\t\t\t32\n#define MIN_LEN_GTK\t\t\t\t\t5\n\n#define LEN_PMK\t\t\t\t\t\t32\n#define LEN_PMKID\t\t\t\t\t16\n#define LEN_PMK_NAME\t\t\t\t16\n\n#define LEN_GMK\t\t\t\t\t\t32\n\n#define LEN_PTK_KCK\t\t\t\t\t16\n#define LEN_PTK_KEK\t\t\t\t\t16\n#define LEN_TK\t\t\t\t\t\t16\t/* The length Temporal key. */\n#define LEN_TKIP_MIC\t\t\t\t8\t/* The length of TX/RX Mic of TKIP */\n#define LEN_TK2\t\t\t\t\t\t(2 * LEN_TKIP_MIC)\n#define LEN_PTK\t\t\t\t\t\t(LEN_PTK_KCK + LEN_PTK_KEK + LEN_TK + LEN_TK2)\n\n#define LEN_TKIP_PTK\t\t\t\tLEN_PTK\n#define LEN_AES_PTK\t\t\t\t\t(LEN_PTK_KCK + LEN_PTK_KEK + LEN_TK)\n#define LEN_TKIP_GTK\t\t\t\t(LEN_TK + LEN_TK2)\n#define LEN_AES_GTK\t\t\t\t\tLEN_TK\n#define LEN_TKIP_TK\t\t\t\t\t(LEN_TK + LEN_TK2)\n#define LEN_AES_TK\t\t\t\t\tLEN_TK\n\n#define LEN_WEP64\t\t\t\t\t5\n#define LEN_WEP128\t\t\t\t\t13\n\n#define OFFSET_OF_PTK_TK\t\t\t(LEN_PTK_KCK + LEN_PTK_KEK)\t/* The offset of the PTK Temporal key in PTK */\n#define OFFSET_OF_AP_TKIP_TX_MIC\t(OFFSET_OF_PTK_TK + LEN_TK)\n#define OFFSET_OF_AP_TKIP_RX_MIC\t(OFFSET_OF_AP_TKIP_TX_MIC + LEN_TKIP_MIC)\n#define OFFSET_OF_STA_TKIP_RX_MIC\t(OFFSET_OF_PTK_TK + LEN_TK)\n#define OFFSET_OF_STA_TKIP_TX_MIC\t(OFFSET_OF_AP_TKIP_TX_MIC + LEN_TKIP_MIC)\n\n#define LEN_KDE_HDR\t\t\t\t\t6\n#define LEN_NONCE\t\t\t\t\t32\n#define LEN_PN\t\t\t\t\t\t6\n#define LEN_TKIP_IV_HDR\t\t\t\t8\n#define LEN_CCMP_HDR\t\t\t\t8\n#define LEN_CCMP_MIC\t\t\t\t8\n#define LEN_OUI_SUITE\t\t\t\t4\n#define LEN_WEP_TSC\t\t\t\t\t3\n#define LEN_WPA_TSC\t\t\t\t\t6\n#define LEN_WEP_IV_HDR\t\t\t\t4\n#define LEN_ICV\t\t\t\t\t\t4\n\n/* It's defined in IEEE Std 802.11-2007 Table 8-4 */\ntypedef enum _WPA_KDE_ID\n{\t\t\n   \tKDE_RESV0,\n   \tKDE_GTK,\n   \tKDE_RESV2,\n   \tKDE_MAC_ADDR,\n   \tKDE_PMKID,\n   \tKDE_SMK,\n   \tKDE_NONCE,\n   \tKDE_LIFETIME,\n   \tKDE_ERROR,\n   \tKDE_RESV_OTHER\n} WPA_KDE_ID;\n\n/* EAPOL Key Information definition within Key descriptor format */\ntypedef\tstruct GNU_PACKED _KEY_INFO\n{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\tKeyAck:1;\n    UCHAR\tInstall:1;\n    UCHAR\tKeyIndex:2;\n    UCHAR\tKeyType:1;\n    UCHAR\tKeyDescVer:3;\n    UCHAR\tRsvd:3;\n    UCHAR\tEKD_DL:1;\t\t/* EKD for AP; DL for STA */\n    UCHAR\tRequest:1;\n    UCHAR\tError:1;\n    UCHAR\tSecure:1;\n    UCHAR\tKeyMic:1;\n#else\n\tUCHAR\tKeyMic:1;\n\tUCHAR\tSecure:1;\n\tUCHAR\tError:1;\n\tUCHAR\tRequest:1;\n\tUCHAR\tEKD_DL:1;       /* EKD for AP; DL for STA */\n\tUCHAR\tRsvd:3;\n\tUCHAR\tKeyDescVer:3;\n\tUCHAR\tKeyType:1;\n\tUCHAR\tKeyIndex:2;\n\tUCHAR\tInstall:1;\n\tUCHAR\tKeyAck:1;\n#endif\t\n}\tKEY_INFO, *PKEY_INFO;\n\n/* EAPOL Key descriptor format */\ntypedef\tstruct GNU_PACKED _KEY_DESCRIPTER\n{\n\tUCHAR\t\tType;\n\tKEY_INFO\tKeyInfo;\n\tUCHAR\t\tKeyLength[2];\n\tUCHAR\t\tReplayCounter[LEN_KEY_DESC_REPLAY];\n\tUCHAR\t\tKeyNonce[LEN_KEY_DESC_NONCE];\n\tUCHAR\t\tKeyIv[LEN_KEY_DESC_IV];\n\tUCHAR\t\tKeyRsc[LEN_KEY_DESC_RSC];\n\tUCHAR\t\tKeyId[LEN_KEY_DESC_ID];\n\tUCHAR\t\tKeyMic[LEN_KEY_DESC_MIC];\n\tUCHAR\t\tKeyDataLen[2];\t   \n\tUCHAR\t\tKeyData[0];\n}\tKEY_DESCRIPTER, *PKEY_DESCRIPTER;\n\ntypedef\tstruct GNU_PACKED _EAPOL_PACKET\n{\n\tUCHAR\t \t\t\tProVer;\n\tUCHAR\t \t\t\tProType;\n\tUCHAR\t \t\t\tBody_Len[2];\n\tKEY_DESCRIPTER\t\tKeyDesc;\n}\tEAPOL_PACKET, *PEAPOL_PACKET;\n\ntypedef struct GNU_PACKED _KDE_HDR\n{\n    UCHAR               Type;\n    UCHAR               Len;\n    UCHAR               OUI[3];\n    UCHAR               DataType;\n\tUCHAR\t\t\t\toctet[0];\n}   KDE_HDR, *PKDE_HDR;\n\n/*802.11i D10 page 83 */\ntypedef struct GNU_PACKED _GTK_KDE\n{\n#ifndef RT_BIG_ENDIAN\n    UCHAR               Kid:2;\n    UCHAR               tx:1;\n    UCHAR               rsv:5;\n    UCHAR               rsv1;\n#else\n    UCHAR               rsv:5;\n    UCHAR               tx:1;\n    UCHAR               Kid:2;\n    UCHAR               rsv1;    \t\n#endif\n    UCHAR               GTK[0];\n}   GTK_KDE, *PGTK_KDE;\n\n/* For WPA1 */\ntypedef struct GNU_PACKED _RSNIE {\n    UCHAR   oui[4];\n    USHORT  version;\n    UCHAR   mcast[4];\n    USHORT  ucount;\n    struct GNU_PACKED {\n        UCHAR oui[4];\n    }ucast[1];\n} RSNIE, *PRSNIE;\n\n/* For WPA2 */\ntypedef struct GNU_PACKED _RSNIE2 {\n    USHORT  version;\n    UCHAR   mcast[4];\n    USHORT  ucount;\n    struct GNU_PACKED {\n        UCHAR oui[4];\n    }ucast[1];\n} RSNIE2, *PRSNIE2;\n\n/* AKM Suite */\ntypedef struct GNU_PACKED _RSNIE_AUTH {\n    USHORT acount;\n    struct GNU_PACKED {\n        UCHAR oui[4];\n    }auth[1];\n} RSNIE_AUTH,*PRSNIE_AUTH;\n\n/* PMKID List */\ntypedef struct GNU_PACKED _RSNIE_PMKID {\n    USHORT pcount;\n    struct GNU_PACKED {\n        UCHAR list[16];\n    }pmkid[1];\n} RSNIE_PMKID,*PRSNIE_PMKID;\n\ntypedef\tunion GNU_PACKED _RSN_CAPABILITIES\t{\n\tstruct\tGNU_PACKED {\n#ifdef RT_BIG_ENDIAN\n        USHORT\t\tRsvd:8;\t\t\n\t\tUSHORT\t\tMFPC:1;\n\t\tUSHORT\t\tMFPR:1;\n        USHORT\t\tGTKSA_R_Counter:2;\n        USHORT\t\tPTKSA_R_Counter:2;\n        USHORT\t\tNo_Pairwise:1;\n\t\tUSHORT\t\tPreAuth:1;\n#else\n        USHORT\t\tPreAuth:1;\n\t\tUSHORT\t\tNo_Pairwise:1;\n\t\tUSHORT\t\tPTKSA_R_Counter:2;\n\t\tUSHORT\t\tGTKSA_R_Counter:2;\n\t\tUSHORT\t\tMFPR:1;\n\t\tUSHORT\t\tMFPC:1;\n\t\tUSHORT\t\tRsvd:8;\n#endif\n\t}\tfield;\n\tUSHORT\t\t\tword;\n}\tRSN_CAPABILITIES, *PRSN_CAPABILITIES;\n\ntypedef struct GNU_PACKED _EAP_HDR {\n    UCHAR   ProVer;\n    UCHAR   ProType;\n    UCHAR   Body_Len[2];\n    UCHAR   code;\n    UCHAR   identifier;\n    UCHAR   length[2]; /* including code and identifier, followed by length-2 octets of data */\n} EAP_HDR, *PEAP_HDR;\n\n\n#endif /* __DOT11I_WPA_H__ */\n\n"
  },
  {
    "path": "src/include/dot11r_ft.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    dot11r_ft.h\n \n    Abstract:\n\tDefined status code, IE and frame structures that FT (802.11rD9.0) needed.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Fonchi Wu  12-02-2008    created for 11r soft-AP\n */\n\n\n#ifndef __DOT11R_FT_H\n#define __DOT11R_FT_H\n\n#include \"rtmp_type.h\"\n\n\n\n#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT)\n#define FT_MIC_LEN\t\t\t\t\t16\n#define FT_NONCE_LEN\t\t\t\t32\t\t\t\n#endif\n\n\n#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT)\n/* Information element ID defined in 802.11rD9.0 specification. */\n#define IE_FT_MDIE\t\t\t\t54\n#define IE_FT_FTIE\t\t\t\t55\n#define IE_FT_TIMEOUT_INTERVAL\t56\n#define IE_FT_RIC_DATA\t\t\t57\n#define IE_FT_RIC_DESCRIPTOR\t75\n\n\n/* RIC Type */\n#define FT_RIC_TYPE_BA\t\t\t1\n\n/* AKM SUITE */\n#define FT_AKM_SUITE_1X\t\t3\n#define FT_AKM_SUITE_PSK\t4\n#endif\n\n\n#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT)\ntypedef union GNU_PACKED _FT_MIC_CTR_FIELD\n{\n\t/*\n\t\tIECnt: contains the number of IEs\n\t\tthat are included int eht MIC calculation.\n\t*/\n\tstruct GNU_PACKED\n\t{\n#ifdef RT_BIG_ENDIAN\n\tUINT16 IECnt:8;\n\tUINT16 :8;\n#else\n\tUINT16 :8;\n\tUINT16 IECnt:8;\n#endif\n\t} field;\n\tUINT16 word;\n} FT_MIC_CTR_FIELD, *PFT_MIC_CTR_FIELD;\n\n/*\n** FTIE: Fast Transition IE.\n*/\ntypedef struct GNU_PACKED _FT_FTIE\n{\n\tFT_MIC_CTR_FIELD MICCtr;\t\t/* 2 Octects. */\n\tUINT8 MIC[FT_MIC_LEN];\t\t\t/* 16 Octects. */\n\tUINT8 ANonce[FT_NONCE_LEN];\t\t/* 32 Octects. */\n\tUINT8 SNonce[FT_NONCE_LEN];\t\t/* 32 Octects. */\n\tUINT8 Option[0];\t\t\t\t/* 1:R1KHID, 2:GTK, 3:ROKHId, else:Res */ \n} FT_FTIE, *PFT_FTIE;\n#endif\n\n\n#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT)\n/*\n** Timeout Interval IE.\n*/\ntypedef enum _FT_TIMEOUT_INTERVAL_TYPE\n{\n\tREASSOC_DEADLINE_INTERVAL = 1,\t/* TUs */\n\tKEY_LIFETIME_INTERVAL,\t\t\t\t/* seconds. */\n\tRESERVED_INTERVAL\n} FT_TIMEOUT_INTERVAL_TYPE, *PFT_TIMEOUT_INTERVAL_TYPE;\n\ntypedef struct GNU_PACKED _FT_TIMEOUT_INTERVAL_IE\n{\n\tUINT8 TimeoutIntervalType;\n\tUINT32 TimeoutIntervalValue;\n} FT_TIMEOUT_INTERVAL_IE, *PFT_TIMEOUT_INTERVAL_IE;\n#endif\n\n\n#endif /* __DOT11R_FT_H */\n\n"
  },
  {
    "path": "src/include/dot11z_tdls.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    dot11z_tdls.h\n \n    Abstract:\n\tDefined status code, IE and frame structures that TDLS (802.11zD4.0) needed.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 11z\n */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#include \"rtmp_type.h\"\n\n#ifndef __DOT11Z_TDLS_H\n#define __DOT11Z_TDLS_H\n\n\n/* TDLS definitions in 802.11z D13.0 specification */\n#define\tPROTO_NAME_TDLS\t\t\t\t2\n#define\tTDLS_AKM_SUITE_1X\t\t\t5\t// <ANA>\n#define\tTDLS_AKM_SUITE_PSK\t\t\t7\n\n/* TDLS Action frame definition in 802.11z D13.0 specification */\n#define TDLS_ACTION_CODE_SETUP_REQUEST\t\t\t\t0\n#define TDLS_ACTION_CODE_SETUP_RESPONSE\t\t\t\t1\n#define TDLS_ACTION_CODE_SETUP_CONFIRM\t\t\t\t2\n#define TDLS_ACTION_CODE_TEARDOWN\t\t\t\t\t3\n#define TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION\t4 /* for TDLS UAPSD */\n#define TDLS_ACTION_CODE_CHANNEL_SWITCH_REQUEST\t\t5\n#define TDLS_ACTION_CODE_CHANNEL_SWITCH_RESPONSE\t6\n#define TDLS_ACTION_CODE_PEER_PSM_REQUEST\t\t\t7\n#define TDLS_ACTION_CODE_PEER_PSM_RESPONSE\t\t\t8\n#define TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE\t\t9 /* for TDLS UAPSD */\n#define TDLS_ACTION_CODE_DISCOVERY_REQUEST\t\t\t10\n\n/* Status codes defined in 802.11zD13.0 specification. */\n#define TDLS_STATUS_CODE_WAKEUP_SCHEDULE_REJECT_BUT_ALTERNATIVE_SCHEDULE_PROVIDED\t2\n#define TDLS_STATUS_CODE_WAKEUP_SCHEDULE_REJECT\t\t\t\t\t\t\t\t\t\t3\n#define TDLS_STATUS_CODE_SECURITY_DISABLED\t\t\t\t\t\t\t\t\t\t\t5\n#define TDLS_STATUS_CODE_UNACCEPTABLE_LIFETIME\t\t\t\t\t\t\t\t\t\t6\n#define TDLS_STATUS_CODE_NOT_IN_SAME_BSS\t\t\t\t\t\t\t\t\t\t\t7\n#define TDLS_STATUS_CODE_INVALID_CONTENTS_OF_RSNIE\t\t\t\t\t\t\t\t\t72\n\n/* Reason codes defined in 802.11zD13.0 specification. */\n#define TDLS_REASON_CODE_TEARDOWN_DUE_TO_PEER_STA_UNREACHABLE\t\t\t\t\t\t25\n#define TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON\t\t\t\t\t\t\t26\n\n/* Information element ID defined in 802.11z D13.0 specification. */\n#define IE_TDLS_LINK_IDENTIFIER\t\t\t101\n#define IE_TDLS_WAKEUP_SCHEDULE\t\t\t102\n#define IE_TDLS_CHANNEL_SWITCH_TIMING\t104\n#define IE_TDLS_PTI_CONTROL\t\t\t\t105\n#define IE_TDLS_PU_BUFFER_STATUS\t\t106\n\n\n#define TDLS_ELM_LEN_LINK_IDENTIFIER\t\t18\n#define TDLS_ELM_LEN_WAKEUP_SCHEDULE\t\t18\n#define TDLS_ELM_LEN_CHANNEL_SWITCH_TIMING\t6\n#define TDLS_ELM_LEN_PTI_CONTROL\t\t\t5\n#define TDLS_ELM_LEN_BUFFER_STATUS\t\t\t3\n\n#define TDLS_KEY_TIMEOUT\t\t\t3600      /* unit: sec */\n\n#define TDLS_KEY_TIMEOUT\t\t\t300      // unit: sec\n#define TDLS_LEY_LIFETIME\t\t\t3600\n\n#define FT_MIC_LEN\t\t\t\t\t16\n#define FT_NONCE_LEN\t\t\t\t32\n\n/* Information element ID defined in 802.11rD9.0 specification. */\n#define IE_FT_MDIE\t\t\t\t54\n#define IE_FT_FTIE\t\t\t\t55\n#define IE_FT_TIMEOUT_INTERVAL\t56\n#define IE_FT_RIC_DATA\t\t\t57\n#define IE_FT_RIC_DESCRIPTOR\t75\n\n\n/* RIC Type */\n#define FT_RIC_TYPE_BA\t\t\t1\n\n/* AKM SUITE */\n#define FT_AKM_SUITE_1X\t\t3\n#define FT_AKM_SUITE_PSK\t4\n\ntypedef union GNU_PACKED _FT_MIC_CTR_FIELD\n{\n\t/*\n\t\tIECnt: contains the number of IEs\n\t\tthat are included int eht MIC calculation.\n\t*/\n\tstruct GNU_PACKED\n\t{\n#ifdef RT_BIG_ENDIAN\n\tUINT16 IECnt:8;\n\tUINT16 :8;\n#else\n\tUINT16 :8;\n\tUINT16 IECnt:8;\n#endif\n\t} field;\n\tUINT16 word;\n} FT_MIC_CTR_FIELD, *PFT_MIC_CTR_FIELD;\n\n/*\n** FTIE: Fast Transition IE.\n*/\ntypedef struct GNU_PACKED _FT_FTIE\n{\n\tFT_MIC_CTR_FIELD MICCtr;\t\t/* 2 Octects. */\n\tUINT8 MIC[FT_MIC_LEN];\t\t\t/* 16 Octects. */\n\tUINT8 ANonce[FT_NONCE_LEN];\t\t/* 32 Octects. */\n\tUINT8 SNonce[FT_NONCE_LEN];\t\t/* 32 Octects. */\n\tUINT8 Option[0];\t\t\t\t/* 1:R1KHID, 2:GTK, 3:ROKHId, else:Res */ \n} FT_FTIE, *PFT_FTIE;\n\n/*\n** Timeout Interval IE.\n*/\ntypedef enum _FT_TIMEOUT_INTERVAL_TYPE\n{\n\tREASSOC_DEADLINE_INTERVAL = 1,\t/* TUs */\n\tKEY_LIFETIME_INTERVAL,\t\t\t\t/* seconds. */\n\tRESERVED_INTERVAL\n} FT_TIMEOUT_INTERVAL_TYPE, *PFT_TIMEOUT_INTERVAL_TYPE;\n\ntypedef struct GNU_PACKED _FT_TIMEOUT_INTERVAL_IE\n{\n\tUINT8 TimeoutIntervalType;\n\tUINT32 TimeoutIntervalValue;\n} FT_TIMEOUT_INTERVAL_IE, *PFT_TIMEOUT_INTERVAL_IE;\n\ntypedef struct GNU_PACKED _TDLS_LINK_IDENT_ELEMENT{\n\tUCHAR\tBSSID[MAC_ADDR_LEN];\n\tUCHAR\tInitiatorAddr[MAC_ADDR_LEN];\n\tUCHAR\tResponderAddr[MAC_ADDR_LEN];\n}TDLS_LINK_IDENT_ELEMENT, *PTDLS_LINK_IDENT_ELEMENT;\n\ntypedef struct GNU_PACKED _TDLS_CH_SWITCH_TIMING_ELEMENT{\n\tUSHORT\tChSwitchTime;\n\tUSHORT\tChSwitchTimeOut;\n}TDLS_CH_SWITCH_TIMING_ELEMENT, *PTDLS_CH_SWITCH_TIMING_ELEMENT;\n\ntypedef struct GNU_PACKED _TDLS_WAKEUP_SCHEDULE_IE\n{\n\tUINT32\tInterval;\n\tUINT32\tAwakeDuration;\n\tUINT16\tIdleCount;\n} TDLS_WAKEUP_SCHEDULE_IE, *PTDLS_WAKEUP_SCHEDULE_IE;\n\ntypedef struct GNU_PACKED _TDLS_AP_PHY_DATA_RATE_IE\n{\n\tUINT32\tAP_PHY_Data_Rate;\n} TDLS_AP_PHY_DATA_RATE_IE, *PTDLS_AP_PHY_DATA_RATE_IE;\n\ntypedef struct GNU_PACKED _TDLS_CHANNEL_SWITCH_TIMING_IE\n{\n\tUINT16\tSwitchTime;\n\tUINT16\tSwitchTimeout;\n} TDLS_CHANNEL_SWITCH_TIMING_IE, *PTDLS_CHANNEL_SWITCH_TIMING_IE;\n\n#endif /* __DOT11Z_TDLS_H */\n\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n"
  },
  {
    "path": "src/include/drs_extr.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll Dynamic Rate Switch Related Structure & Definition\n\n***************************************************************************/\n\n#ifndef __DRS_EXTR_H__\n#define __DRS_EXTR_H__\n\nstruct _RTMP_ADAPTER;\nstruct _MAC_TABLE_ENTRY;\n\n\ntypedef struct _RTMP_TX_RATE {\n\tUCHAR mode;\n\tUCHAR bw;\n\tUCHAR mcs;\n\tUCHAR nss;\n\tUCHAR sgi;\n\tUCHAR stbc;\n}RTMP_TX_RATE;\n\n\ntypedef struct _RTMP_RA_LEGACY_TB\n{\n\tUCHAR   ItemNo;\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\tRsv2:1;\n\tUCHAR\tMode:3;\n\tUCHAR\tBW:2;\n\tUCHAR\tShortGI:1;\n\tUCHAR\tSTBC:1;\n#else\n\tUCHAR\tSTBC:1;\n\tUCHAR\tShortGI:1;\n\tUCHAR\tBW:2;\n\tUCHAR\tMode:3;\n\tUCHAR\tRsv2:1;\n#endif\t\n\tUCHAR   CurrMCS;\n\tUCHAR   TrainUp;\n\tUCHAR   TrainDown;\n} RTMP_RA_LEGACY_TB;\n\n#define PTX_RA_LEGACY_ENTRY(pTable, idx)\t((RTMP_RA_LEGACY_TB *)&(pTable[(idx+1)*5]))\n\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\ntypedef struct  _RTMP_RA_GRP_TB\n{\n\tUCHAR   ItemNo;\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\tRsv2:1;\n\tUCHAR\tMode:3;\t\n\tUCHAR\tBW:2;\n\tUCHAR\tShortGI:1;\n\tUCHAR\tSTBC:1;\n#else\n\tUCHAR\tSTBC:1;\n\tUCHAR\tShortGI:1;\n\tUCHAR\tBW:2;\n\tUCHAR\tMode:3;\n\tUCHAR\tRsv2:1;\n#endif\t\n\tUCHAR   CurrMCS;\n\tUCHAR   TrainUp;\n\tUCHAR   TrainDown;\n\tUCHAR\tdownMcs;\n\tUCHAR\tupMcs3;\n\tUCHAR\tupMcs2;\n\tUCHAR\tupMcs1;\n\tUCHAR\tdataRate;\n} RTMP_RA_GRP_TB;\n\n#define PTX_RA_GRP_ENTRY(pTable, idx)\t((RTMP_RA_GRP_TB *)&(pTable[(idx+1)*10]))\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#define RATE_TABLE_SIZE(pTable)\t\t\t((pTable)[0])\t\t/* Byte 0 is number of rate indices */\n#define RATE_TABLE_INIT_INDEX(pTable)\t((pTable)[1])\t\t/* Byte 1 is initial rate index */\n\nenum RATE_ADAPT_ALG{\n\tRATE_ALG_LEGACY = 1,\n\tRATE_ALG_GRP = 2,\n\tRATE_ALG_AGS = 3,\n\tRATE_ALG_MAX_NUM\n};\n\n\ntypedef enum {\n\tRAL_OLD_DRS,\n\tRAL_NEW_DRS,\n\tRAL_QUICK_DRS\n}RA_LOG_TYPE;\n\n\nextern UCHAR RateSwitchTable11B[];\nextern UCHAR RateSwitchTable11G[];\nextern UCHAR RateSwitchTable11BG[];\n\n#ifdef DOT11_N_SUPPORT\nextern UCHAR RateSwitchTable11BGN1S[];\nextern UCHAR RateSwitchTable11BGN2S[];\nextern UCHAR RateSwitchTable11BGN2SForABand[];\nextern UCHAR RateSwitchTable11N1S[];\nextern UCHAR RateSwitchTable11N1SForABand[];\nextern UCHAR RateSwitchTable11N2S[];\nextern UCHAR RateSwitchTable11N2SForABand[];\nextern UCHAR RateSwitchTable11BGN3S[];\nextern UCHAR RateSwitchTable11BGN3SForABand[];\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\nextern UCHAR RateSwitchTableAdapt11N1S[];\nextern UCHAR RateSwitchTableAdapt11N2S[];\nextern UCHAR RateSwitchTableAdapt11N3S[];\n\n#define PER_THRD_ADJ\t\t\t1\n\n/* ADAPT_RATE_TABLE - true if pTable is one of the Adaptive Rate Switch tables */\n#ifdef DOT11_VHT_AC\nextern UCHAR RateTableVht1S[];\nextern UCHAR RateTableVht2S[];\n\n#define ADAPT_RATE_TABLE(pTable)\t((pTable)==RateSwitchTableAdapt11N1S ||\\\n\t\t\t\t\t\t\t\t\t(pTable)==RateSwitchTableAdapt11N2S ||\\\n\t\t\t\t\t\t\t\t\t(pTable)==RateSwitchTableAdapt11N3S ||\\\n\t\t\t\t\t\t\t\t\t(pTable)==RateTableVht1S ||\\\n\t\t\t\t\t\t\t\t\t(pTable)==RateTableVht2S)\n#else\n#define ADAPT_RATE_TABLE(pTable)\t((pTable)==RateSwitchTableAdapt11N1S || \\\n\t\t\t\t\t\t\t\t\t(pTable)==RateSwitchTableAdapt11N2S || \\\n\t\t\t\t\t\t\t\t\t(pTable)==RateSwitchTableAdapt11N3S)\n#endif /* DOT11_VHT_AC */\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\n/* FUNCTION */\nVOID MlmeGetSupportedMcs(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN UCHAR\t*pTable,\n\tOUT CHAR \tmcs[]);\n\nUCHAR MlmeSelectTxRate(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN CHAR\tmcs[],\n\tIN CHAR\t\tRssi,\n\tIN CHAR\t\tRssiOffset);\n\nVOID MlmeClearTxQuality(struct _MAC_TABLE_ENTRY *pEntry);\nVOID MlmeClearAllTxQuality(struct _MAC_TABLE_ENTRY *pEntry);\nVOID MlmeDecTxQuality(struct _MAC_TABLE_ENTRY *pEntry, UCHAR rateIndex);\nUSHORT MlmeGetTxQuality(struct _MAC_TABLE_ENTRY *pEntry, UCHAR rateIndex);\nVOID MlmeSetTxQuality(\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR rateIndex,\n\tIN USHORT txQuality);\n\n\n\nVOID MlmeOldRateAdapt(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR\t\t\tCurrRateIdx,\n\tIN UCHAR\t\t\tUpRateIdx,\n\tIN UCHAR\t\t\tDownRateIdx,\n\tIN ULONG\t\t\tTrainUp,\n\tIN ULONG\t\t\tTrainDown,\n\tIN ULONG\t\t\tTxErrorRatio);\n\nVOID MlmeRestoreLastRate(\n\tIN struct _MAC_TABLE_ENTRY *pEntry);\n\nVOID MlmeCheckRDG(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry);\n\nVOID RTMPSetSupportMCS(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN UCHAR OpMode,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR SupRate[],\n\tIN UCHAR SupRateLen,\n\tIN UCHAR ExtRate[],\n\tIN UCHAR ExtRateLen,\n#ifdef DOT11_VHT_AC\n\tIN UCHAR vht_cap_len,\n\tIN VHT_CAP_IE *vht_cap,\n#endif /* DOT11_VHT_AC */\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR HtCapabilityLen);\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\nVOID MlmeSetMcsGroup(struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEnt);\n\nUCHAR MlmeSelectUpRate(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_GRP_TB *pCurrTxRate);\n\nUCHAR MlmeSelectDownRate(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR\t\t\tCurrRateIdx);\n\nVOID MlmeGetSupportedMcsAdapt(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR\tmcs23GI,\n\tOUT CHAR \tmcs[]);\n\nUCHAR MlmeSelectTxRateAdapt(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN CHAR\t\tmcs[],\n\tIN CHAR\t\tRssi,\n\tIN CHAR\t\tRssiOffset);\n\nBOOLEAN MlmeRAHybridRule(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_GRP_TB *pCurrTxRate,\n\tIN ULONG\t\t\tNewTxOkCount,\n\tIN ULONG\t\t\tTxErrorRatio);\n\nVOID MlmeNewRateAdapt(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR\t\t\tUpRateIdx,\n\tIN UCHAR\t\t\tDownRateIdx,\n\tIN ULONG\t\t\tTrainUp,\n\tIN ULONG\t\t\tTrainDown,\n\tIN ULONG\t\t\tTxErrorRatio);\n\nINT\tSet_PerThrdAdj_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING arg);\n\nINT\tSet_LowTrafficThrd_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\t\targ);\n\nINT\tSet_TrainUpRule_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\t\targ);\n\nINT\tSet_TrainUpRuleRSSI_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\t\targ);\n\nINT\tSet_TrainUpLowThrd_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\t\targ);\n\nINT\tSet_TrainUpHighThrd_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\t\targ);\n\nINT Set_RateTable_Proc(\n\tIN  struct _RTMP_ADAPTER *pAd,\n\tIN  PSTRING arg);\n\n#ifdef CONFIG_AP_SUPPORT\nVOID APMlmeDynamicTxRateSwitchingAdapt(struct _RTMP_ADAPTER *pAd, ULONG idx);\nVOID APQuickResponeForRateUpExecAdapt(struct _RTMP_ADAPTER *pAd, ULONG idx);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nVOID StaQuickResponeForRateUpExecAdapt(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN ULONG i,\n\tIN CHAR  Rssi);\n\nVOID MlmeDynamicTxRateSwitchingAdapt(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN ULONG i,\n\tIN ULONG TxSuccess,\n\tIN ULONG TxRetransmit,\n\tIN ULONG TxFailCount);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nVOID APMlmeDynamicTxRateSwitching(\n    IN struct _RTMP_ADAPTER *pAd);\n\nVOID APQuickResponeForRateUpExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\nVOID APMlmeSetTxRate(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_LEGACY_TB *pTxRate);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nVOID MlmeDynamicTxRateSwitching(\n\tIN struct _RTMP_ADAPTER *pAd);\n\nVOID StaQuickResponeForRateUpExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID MlmeSetTxRate(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_LEGACY_TB *pTxRate);\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID MlmeRAInit(struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEntry);\nVOID MlmeNewTxRate(struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEntry);\n\nVOID MlmeRALog(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN RA_LOG_TYPE raLogType,\n\tIN ULONG TxErrorRatio,\n\tIN ULONG TxTotalCnt);\n\nVOID MlmeSelectTxRateTable(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN struct _MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR **ppTable,\n\tIN UCHAR *pTableSize,\n\tIN UCHAR *pInitTxRateIdx);\n\n/* normal rate switch */\n#define RTMP_DRS_ALG_INIT(__pAd, __Alg)\t\t\t\t\t\t\t\t\t\t\\\n\t(__pAd)->rateAlg = __Alg;\n\n#endif /* __DRS_EXTR_H__ */\n\n/* End of drs_extr.h */\n"
  },
  {
    "path": "src/include/eeprom.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\teeprom.h\n\n\tAbstract:\n\tMiniport header file for eeprom related information\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n#ifndef __EEPROM_H__\n#define __EEPROM_H__\n\n/* For ioctl check usage */\n#define EEPROM_IS_PROGRAMMED\t\t0x80\n\n\n#ifdef RTMP_MAC_USB\n#define EEPROM_SIZE\t\t\t\t\t0x400\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _EEPROM_WORD_STRUC {\n\tstruct {\n\t\tUCHAR\tByte1;\t\t\t\t// High Byte\n\t\tUCHAR\tByte0;\t\t\t\t// Low Byte\n\t} field;\n\tUSHORT\tword;\n} EEPROM_WORD_STRUC;\n#else\ntypedef\tunion _EEPROM_WORD_STRUC {\n\tstruct {\n\t\tUCHAR\tByte0;\n\t\tUCHAR\tByte1;\n\t} field;\n\tUSHORT\tword;\n} EEPROM_WORD_STRUC;\n#endif\n\n\n/* ------------------------------------------------------------------- */\n/*  E2PROM data layout */\n/* ------------------------------------------------------------------- */\n\n/* Board type */\n\n#define BOARD_TYPE_MINI_CARD\t\t0\t/* Mini card */\n#define BOARD_TYPE_USB_PEN\t\t1\t/* USB pen */\n\n/*\n\tEEPROM antenna select format\n*/\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_NIC_CINFIG2_STRUC {\n\tstruct {\n\t\tUSHORT DACTestBit:1;\t/* control if driver should patch the DAC issue */\n\t\tUSHORT CoexBit:1;\n\t\tUSHORT bInternalTxALC:1;\t/* Internal Tx ALC */\n\t\tUSHORT AntOpt:1;\t/* Fix Antenna Option: 0:Main; 1: Aux */\n\t\tUSHORT AntDiversity:1;\t/* Antenna diversity */\n\t\tUSHORT Rsv1:1;\t/* must be 0 */\n\t\tUSHORT BW40MAvailForA:1;\t/* 0:enable, 1:disable */\n\t\tUSHORT BW40MAvailForG:1;\t/* 0:enable, 1:disable */\n\t\tUSHORT EnableWPSPBC:1;\t/* WPS PBC Control bit */\n\t\tUSHORT BW40MSidebandForA:1;\n\t\tUSHORT BW40MSidebandForG:1;\n\t\tUSHORT CardbusAcceleration:1;\t/* !!! NOTE: 0 - enable, 1 - disable */\n\t\tUSHORT ExternalLNAForA:1;\t/* external LNA enable for 5G */\n\t\tUSHORT ExternalLNAForG:1;\t/* external LNA enable for 2.4G */\n\t\tUSHORT DynamicTxAgcControl:1;\t/* */\n\t\tUSHORT HardwareRadioControl:1;\t/* Whether RF is controlled by driver or HW. 1:enable hw control, 0:disable */\n\t} field;\n\tUSHORT word;\n} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC;\n#else\ntypedef union _EEPROM_NIC_CINFIG2_STRUC {\n\tstruct {\n\t\tUSHORT HardwareRadioControl:1;\t/* 1:enable, 0:disable */\n\t\tUSHORT DynamicTxAgcControl:1;\t/* */\n\t\tUSHORT ExternalLNAForG:1;\t/* */\n\t\tUSHORT ExternalLNAForA:1;\t/* external LNA enable for 2.4G */\n\t\tUSHORT CardbusAcceleration:1;\t/* !!! NOTE: 0 - enable, 1 - disable */\n\t\tUSHORT BW40MSidebandForG:1;\n\t\tUSHORT BW40MSidebandForA:1;\n\t\tUSHORT EnableWPSPBC:1;\t/* WPS PBC Control bit */\n\t\tUSHORT BW40MAvailForG:1;\t/* 0:enable, 1:disable */\n\t\tUSHORT BW40MAvailForA:1;\t/* 0:enable, 1:disable */\n\t\tUSHORT Rsv1:1;\t/* must be 0 */\n\t\tUSHORT AntDiversity:1;\t/* Antenna diversity */\n\t\tUSHORT AntOpt:1;\t/* Fix Antenna Option: 0:Main; 1: Aux */\n\t\tUSHORT bInternalTxALC:1;\t/* Internal Tx ALC */\n\t\tUSHORT CoexBit:1;\n\t\tUSHORT DACTestBit:1;\t/* control if driver should patch the DAC issue */\n\t} field;\n\tUSHORT word;\n} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC;\n#endif\n\n\n#if defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290)\n#ifdef RTMP_USB_SUPPORT\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_NIC_CINFIG3_STRUC {\n\tstruct {\n\t\tUSHORT Rsv1:7;\t/* must be 0 */\n\t\tUSHORT CoexMethod:1;\n\t\tUSHORT TxStream:4;\t/* Number of Tx stream */\n\t\tUSHORT RxStream:4;\t/* Number of rx stream */\n\t} field;\n\tUSHORT word;\n} EEPROM_NIC_CONFIG3_STRUC, *PEEPROM_NIC_CONFIG3_STRUC;\n#else\ntypedef union _EEPROM_NIC_CINFIG3_STRUC {\n\tstruct {\n\t\tUSHORT RxStream:4;\t/* Number of rx stream */\n\t\tUSHORT TxStream:4;\t/* Number of Tx stream */\n\t\tUSHORT CoexMethod:1;\n\t\tUSHORT Rsv1:7;\t/* must be 0 */\n\t} field;\n\tUSHORT word;\n} EEPROM_NIC_CONFIG3_STRUC, *PEEPROM_NIC_CONFIG3_STRUC;\n#endif\n#endif /* RTMP_USB_SUPPORT */\n\n#endif /* defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290) */\n\n\n\n/*\n\tTX_PWR Value valid range 0xFA(-6) ~ 0x24(36)\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_TX_PWR_STRUC {\n\tstruct {\n\t\tsigned char Byte1;\t/* High Byte */\n\t\tsigned char Byte0;\t/* Low Byte */\n\t} field;\n\tUSHORT word;\n} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC;\n#else\ntypedef union _EEPROM_TX_PWR_STRUC {\n\tstruct {\n\t\tsigned char Byte0;\t/* Low Byte */\n\t\tsigned char Byte1;\t/* High Byte */\n\t} field;\n\tUSHORT word;\n} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC;\n#endif\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_VERSION_STRUC {\n\tstruct {\n\t\tUCHAR Version;\t/* High Byte */\n\t\tUCHAR FaeReleaseNumber;\t/* Low Byte */\n\t} field;\n\tUSHORT word;\n} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC;\n#else\ntypedef union _EEPROM_VERSION_STRUC {\n\tstruct {\n\t\tUCHAR FaeReleaseNumber;\t/* Low Byte */\n\t\tUCHAR Version;\t/* High Byte */\n\t} field;\n\tUSHORT word;\n} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC;\n#endif\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_LED_STRUC {\n\tstruct {\n\t\tUSHORT Rsvd:3;\t/* Reserved */\n\t\tUSHORT LedMode:5;\t/* Led mode. */\n\t\tUSHORT PolarityGPIO_4:1;\t/* Polarity GPIO#4 setting. */\n\t\tUSHORT PolarityGPIO_3:1;\t/* Polarity GPIO#3 setting. */\n\t\tUSHORT PolarityGPIO_2:1;\t/* Polarity GPIO#2 setting. */\n\t\tUSHORT PolarityGPIO_1:1;\t/* Polarity GPIO#1 setting. */\n\t\tUSHORT PolarityGPIO_0:1;\t/* Polarity GPIO#0 setting. */\n\t\tUSHORT PolarityACT:1;\t/* Polarity ACT setting. */\n\t\tUSHORT PolarityRDY_A:1;\t/* Polarity RDY_A setting. */\n\t\tUSHORT PolarityRDY_G:1;\t/* Polarity RDY_G setting. */\n\t} field;\n\tUSHORT word;\n} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC;\n#else\ntypedef union _EEPROM_LED_STRUC {\n\tstruct {\n\t\tUSHORT PolarityRDY_G:1;\t/* Polarity RDY_G setting. */\n\t\tUSHORT PolarityRDY_A:1;\t/* Polarity RDY_A setting. */\n\t\tUSHORT PolarityACT:1;\t/* Polarity ACT setting. */\n\t\tUSHORT PolarityGPIO_0:1;\t/* Polarity GPIO#0 setting. */\n\t\tUSHORT PolarityGPIO_1:1;\t/* Polarity GPIO#1 setting. */\n\t\tUSHORT PolarityGPIO_2:1;\t/* Polarity GPIO#2 setting. */\n\t\tUSHORT PolarityGPIO_3:1;\t/* Polarity GPIO#3 setting. */\n\t\tUSHORT PolarityGPIO_4:1;\t/* Polarity GPIO#4 setting. */\n\t\tUSHORT LedMode:5;\t/* Led mode. */\n\t\tUSHORT Rsvd:3;\t/* Reserved */\n\t} field;\n\tUSHORT word;\n} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC;\n#endif\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_TXPOWER_DELTA_STRUC {\n\tstruct {\n\t\tUCHAR TxPowerEnable:1;\t/* Enable */\n\t\tUCHAR Type:1;\t/* 1: plus the delta value, 0: minus the delta value */\n\t\tUCHAR DeltaValue:6;\t/* Tx Power dalta value (MAX=4) */\n\t} field;\n\tUCHAR value;\n} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC;\n#else\ntypedef union _EEPROM_TXPOWER_DELTA_STRUC {\n\tstruct {\n\t\tUCHAR DeltaValue:6;\t/* Tx Power dalta value (MAX=4) */\n\t\tUCHAR Type:1;\t/* 1: plus the delta value, 0: minus the delta value */\n\t\tUCHAR TxPowerEnable:1;\t/* Enable */\n\t} field;\n\tUCHAR value;\n} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_TX_PWR_OFFSET_STRUC\n{\n\tstruct\n\t{\n\t\tUCHAR\tByte1;\t/* High Byte */\n\t\tUCHAR\tByte0;\t/* Low Byte */\n\t} field;\n\t\n\tUSHORT\t\tword;\n} EEPROM_TX_PWR_OFFSET_STRUC, *PEEPROM_TX_PWR_OFFSET_STRUC;\n#else\ntypedef union _EEPROM_TX_PWR_OFFSET_STRUC\n{\n\tstruct\n\t{\n\t\tUCHAR\tByte0;\t/* Low Byte */\n\t\tUCHAR\tByte1;\t/* High Byte */\n\t} field;\n\n\tUSHORT\t\tword;\n} EEPROM_TX_PWR_OFFSET_STRUC, *PEEPROM_TX_PWR_OFFSET_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n\nstruct _RTMP_ADAPTER;\n\n\n\n#ifdef RTMP_USB_SUPPORT\nNTSTATUS RTUSBReadEEPROM16(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN USHORT offset,\n\tOUT\tUSHORT *pData);\n\nNTSTATUS RTUSBWriteEEPROM16(\n\tIN struct _RTMP_ADAPTER *pAd, \n\tIN USHORT offset, \n\tIN USHORT value);\n#endif /* RTMP_USB_SUPPORT */\n\n\n#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT)\nNDIS_STATUS rtmp_nv_init(struct _RTMP_ADAPTER *pAd);\nint rtmp_ee_flash_read(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT *pVal);\nint rtmp_ee_flash_write(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT data);\nVOID rtmp_ee_flash_read_all(struct _RTMP_ADAPTER *pAd, USHORT *Data);\nVOID rtmp_ee_flash_write_all(struct _RTMP_ADAPTER *pAd, USHORT *Data);\n#endif /* defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) */\n\n\n#ifdef RTMP_EFUSE_SUPPORT\nINT eFuseLoadEEPROM(struct _RTMP_ADAPTER *pAd);\nINT eFuseWriteEeeppromBuf(struct _RTMP_ADAPTER *pAd);\nVOID eFuseGetFreeBlockCount(struct _RTMP_ADAPTER *pAd, UINT *EfuseFreeBlock);\n\nint rtmp_ee_efuse_read16(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT *pVal);\nint rtmp_ee_efuse_write16(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT data);\n\n\nNTSTATUS eFuseRead(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT *pData, USHORT len);\nNTSTATUS eFuseWrite(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT *pData, USHORT len);\n\nINT eFuse_init(struct _RTMP_ADAPTER *pAd);\nINT efuse_probe(struct _RTMP_ADAPTER *pAd);\n\n#ifdef RALINK_ATE\nINT Set_LoadEepromBufferFromEfuse_Proc(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\t\targ);\n#endif /* RALINK_ATE */\n#endif /* RTMP_EFUSE_SUPPORT */\n\n\n/*************************************************************************\n  *\tPublic function declarations for prom operation callback functions setting\n  ************************************************************************/\nINT RtmpChipOpsEepromHook(struct _RTMP_ADAPTER *pAd, INT infType);\n\n#endif /* __EEPROM_H__ */\n"
  },
  {
    "path": "src/include/firmware.h",
    "content": "/* AUTO GEN PLEASE DO NOT MODIFY IT */ \n/* AUTO GEN PLEASE DO NOT MODIFY IT */ \n\n\nUCHAR FirmwareImage [] = { \n0x48, 0x00, 0x00, 0x52, 0x48, 0x00, 0x00, 0x1e, 0x48, 0x00, 0x00, 0x1c, 0x48, 0x00, 0x00, 0x1a, \n0x48, 0x00, 0x00, 0x18, 0x48, 0x00, 0x00, 0x16, 0x48, 0x00, 0x00, 0x14, 0x48, 0x00, 0x00, 0x12, \n0x48, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x0e, 0x48, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x0a, \n0x48, 0x00, 0x00, 0x08, 0x48, 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x04, 0x48, 0x00, 0x00, 0x02, \n0x92, 0x00, 0x48, 0x00, 0x00, 0x00, 0x92, 0x00, 0x3a, 0x0f, 0xab, 0xbc, 0x3a, 0xff, 0xbc, 0x3c, \n0x64, 0x62, 0x04, 0x02, 0x64, 0x72, 0xa4, 0x02, 0x64, 0x82, 0x00, 0x02, 0x3a, 0x6f, 0xa0, 0x3c, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x05, 0xa0, 0xb4, 0x00, 0x15, 0xf0, 0x00, 0x00, 0x46, 0x10, \n0x00, 0x04, 0x58, 0x10, 0x8f, 0xb0, 0xdd, 0x21, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x05, 0xa0, \n0xb4, 0x00, 0x05, 0xf0, 0x00, 0x00, 0x3a, 0x6f, 0xa0, 0x04, 0x64, 0x62, 0x04, 0x03, 0x64, 0x72, \n0xa4, 0x03, 0x64, 0x82, 0x00, 0x03, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x0f, 0xab, 0x84, 0x64, 0x00, \n0x00, 0x04, 0x92, 0x00, 0x84, 0x0a, 0x64, 0x02, 0x00, 0x03, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, \n0x02, 0x00, 0x44, 0x10, 0x04, 0x01, 0xa8, 0x41, 0x84, 0x00, 0x64, 0x02, 0x24, 0x03, 0x46, 0x0c, \n0x00, 0x00, 0x58, 0x00, 0x00, 0x02, 0x64, 0x03, 0x00, 0x03, 0x47, 0xf0, 0x00, 0x0f, 0x59, 0xff, \n0x8f, 0x00, 0x46, 0x00, 0x00, 0x08, 0x58, 0x00, 0x0b, 0x60, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, \n0x83, 0x60, 0x84, 0x40, 0xd5, 0x02, 0xaa, 0x81, 0x4c, 0x10, 0x7f, 0xff, 0x46, 0x00, 0x00, 0x09, \n0x58, 0x00, 0x05, 0x70, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0xd4, 0x84, 0x40, 0xd5, 0x02, \n0xaa, 0x81, 0x4c, 0x10, 0x7f, 0xff, 0x48, 0x00, 0x26, 0xab, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0xb4, 0x20, 0xc1, 0x17, 0xa1, 0x41, 0x84, 0x80, 0xa9, 0x49, 0xb6, 0x25, 0xb6, 0x80, \n0xa9, 0x01, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x50, 0xa0, 0xc2, 0xb4, 0x20, 0x9e, 0x99, \n0xa8, 0x82, 0x4c, 0x10, 0x40, 0x08, 0xa0, 0x0b, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x44, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x27, 0x80, 0x97, 0x80, 0xe0, 0xc2, 0x11, 0x80, 0x02, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x44, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, \n0x80, 0x97, 0x80, 0x27, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0xcc, 0xdd, 0x2f, 0xec, 0x04, \n0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x84, 0xe4, 0xdd, 0x2f, 0x46, 0x17, 0xff, 0xff, 0x58, 0x10, 0x8f, 0xff, \n0x46, 0x20, 0x00, 0x0c, 0x58, 0x21, 0x02, 0x50, 0x81, 0x00, 0x40, 0xa0, 0x04, 0x00, 0x44, 0x00, \n0xea, 0x60, 0x14, 0xa1, 0x00, 0x04, 0x80, 0xe2, 0xb4, 0xc2, 0x41, 0xc4, 0x00, 0x00, 0xd5, 0x2d, \n0xa0, 0x32, 0x40, 0x34, 0x00, 0x01, 0x4e, 0x35, 0x00, 0x20, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x81, 0x0c, 0xdd, 0x2f, 0xa4, 0x36, 0xc0, 0x10, 0x9e, 0x01, 0xac, 0x36, 0x15, 0xc3, \n0x00, 0x02, 0x05, 0xe3, 0x80, 0x01, 0xa9, 0xb9, 0xb6, 0xe6, 0x15, 0xe3, 0x00, 0x01, 0xb6, 0xde, \n0xa1, 0x7a, 0x9d, 0x29, 0xa9, 0x3a, 0xd5, 0x05, 0xa0, 0x75, 0xc1, 0x03, 0xa0, 0x34, 0xdd, 0x21, \n0x14, 0xa3, 0x80, 0x04, 0xd5, 0x09, 0xa0, 0xbc, 0x40, 0x90, 0x08, 0x01, 0x4e, 0x95, 0x00, 0x03, \n0xd5, 0x02, 0xa8, 0x3c, 0x81, 0x26, 0xb4, 0xc9, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x50, \n0x4c, 0x64, 0xff, 0xd0, 0xb4, 0xa6, 0xd6, 0x09, 0xa0, 0xf4, 0x40, 0x01, 0xa0, 0x01, 0x46, 0xf0, \n0x00, 0x00, 0x58, 0xf7, 0x81, 0x4c, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x02, 0x50, 0xa0, 0x33, 0x84, 0x20, \n0xa8, 0x72, 0xb6, 0xc6, 0xa9, 0xb1, 0xc8, 0x08, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x86, 0xd4, \n0xdd, 0x2f, 0xa8, 0x33, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x44, 0xdd, 0x2f, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, \n0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0xa0, 0x32, \n0xc8, 0x02, 0xd5, 0x09, 0x9e, 0x01, 0xa8, 0x32, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x81, 0x80, 0xdd, 0x2f, 0x80, 0xc0, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, \n0xdd, 0x2f, 0x80, 0x06, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xf4, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, 0x80, 0xe1, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x8f, 0xf8, 0xdd, 0x2f, 0xa0, 0xb2, 0x80, 0x06, 0x9c, 0x51, 0xa8, 0x72, 0x80, 0x27, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x81, 0x74, 0xdd, 0x2f, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x80, 0x0c, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0x6c, \n0xdd, 0x2f, 0x46, 0x70, 0x00, 0x09, 0x58, 0x73, 0x85, 0x90, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, \n0x0f, 0xc0, 0x46, 0x80, 0x00, 0x00, 0x58, 0x84, 0x02, 0xbc, 0xa9, 0xf2, 0x80, 0x26, 0x46, 0x00, \n0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x4b, 0xe0, 0x20, 0x01, 0x50, 0x73, 0x86, 0x40, 0x46, 0x50, \n0x00, 0x0b, 0x58, 0x52, 0x8b, 0x10, 0x8c, 0xd8, 0xdf, 0xf1, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, \n0x02, 0x74, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0x6c, 0xdd, 0x2f, 0x46, 0x70, 0x00, 0x0b, \n0x58, 0x73, 0x8b, 0x10, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x00, 0x50, 0x46, 0x80, 0x00, 0x00, \n0x58, 0x84, 0x02, 0xbc, 0xa9, 0xf2, 0x80, 0x26, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x74, \n0x4b, 0xe0, 0x20, 0x01, 0x50, 0x73, 0x80, 0xc8, 0x46, 0x50, 0x00, 0x0b, 0x58, 0x52, 0x8f, 0xc0, \n0x8c, 0xd8, 0xdf, 0xf1, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x84, 0xe0, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x85, 0x0c, 0xdd, 0x2f, 0x46, 0xf0, \n0x00, 0x09, 0x10, 0x77, 0x85, 0x83, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x77, 0x85, 0x84, 0x46, 0x60, \n0x00, 0x02, 0x58, 0x63, 0x08, 0xac, 0x44, 0x00, 0x00, 0x10, 0x46, 0x10, 0x00, 0x02, 0x58, 0x10, \n0x89, 0xf4, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x11, 0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8a, 0x04, \n0xdd, 0x26, 0x84, 0x00, 0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8a, 0x14, 0xdd, 0x26, 0x84, 0x01, \n0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8a, 0x24, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x19, 0x46, 0x10, \n0x00, 0x02, 0x58, 0x10, 0x8a, 0x34, 0xdd, 0x26, 0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8b, 0x30, \n0x44, 0x00, 0x00, 0x18, 0xdd, 0x26, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0xfc, 0xdd, 0x2f, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x84, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x89, 0x00, \n0xdd, 0x2f, 0x84, 0xc0, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x84, 0x88, 0xdd, 0x2f, 0x46, 0x40, \n0x00, 0x0c, 0x58, 0x42, 0x02, 0x84, 0x10, 0x72, 0x02, 0x64, 0x14, 0x62, 0x00, 0x2d, 0x80, 0x26, \n0x50, 0x02, 0x02, 0x66, 0x84, 0x48, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, \n0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x08, 0x00, 0xa9, 0x84, 0x46, 0x20, 0x30, 0x00, 0xa0, 0xc3, \n0x40, 0x11, 0x88, 0x04, 0xa8, 0x43, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x9c, 0x3c, 0x96, 0x00, 0x96, 0x48, 0x95, 0x82, 0x99, 0x71, 0x44, 0x32, 0x0d, 0x60, \n0x99, 0x2b, 0x00, 0x31, 0x00, 0x40, 0x95, 0x25, 0x84, 0xa0, 0x38, 0x71, 0x14, 0x00, 0x99, 0xac, \n0xaf, 0xf0, 0x9d, 0x69, 0x44, 0x70, 0x00, 0x10, 0xdf, 0xf9, 0x9b, 0x94, 0x50, 0x52, 0x00, 0x18, \n0x50, 0x22, 0x00, 0x10, 0x38, 0x73, 0x08, 0x00, 0x18, 0x71, 0x00, 0x01, 0xda, 0xfc, 0x50, 0x42, \n0x00, 0x20, 0x38, 0x23, 0x14, 0x00, 0x18, 0x22, 0x80, 0x01, 0xdc, 0xfc, 0x46, 0x40, 0x01, 0x06, \n0x40, 0x20, 0x04, 0x09, 0x58, 0x42, 0x0c, 0x00, 0x99, 0x54, 0x94, 0xaa, 0x97, 0x04, 0xb4, 0x02, \n0xcc, 0x1d, 0xc9, 0x05, 0x54, 0x31, 0x80, 0x0f, 0x84, 0xd0, 0xd5, 0x39, 0x84, 0xa1, 0xd9, 0x07, \n0x54, 0x11, 0x80, 0x0f, 0x94, 0xcc, 0x44, 0x6f, 0xff, 0x0f, 0xd5, 0x31, 0x84, 0x82, 0x54, 0x31, \n0x80, 0x0f, 0x4c, 0x12, 0x40, 0x07, 0x40, 0x31, 0xa0, 0x08, 0x44, 0x6f, 0xf0, 0xff, 0xd5, 0x27, \n0x40, 0x31, 0xb0, 0x08, 0x44, 0x1f, 0x0f, 0xff, 0xd5, 0x2b, 0xc9, 0x0c, 0x46, 0x5f, 0xff, 0x0f, \n0x54, 0x31, 0x80, 0x0f, 0x58, 0x52, 0x8f, 0xff, 0x40, 0x31, 0xc0, 0x08, 0x40, 0x00, 0x14, 0x02, \n0xd5, 0x21, 0x84, 0xa1, 0xd9, 0x0a, 0x54, 0x11, 0x80, 0x0f, 0x40, 0x30, 0xd0, 0x08, 0x46, 0x1f, \n0xf0, 0xff, 0x58, 0x10, 0x8f, 0xff, 0xd5, 0x14, 0x84, 0xa2, 0xd9, 0x0c, 0x54, 0x61, 0x80, 0x0f, \n0x40, 0x33, 0x60, 0x08, 0x46, 0x6f, 0x0f, 0xff, 0x58, 0x63, 0x0f, 0xff, 0x40, 0x00, 0x18, 0x02, \n0xd5, 0x09, 0x46, 0x10, 0xff, 0xff, 0x40, 0x31, 0xf0, 0x08, 0x58, 0x10, 0x8f, 0xff, 0x40, 0x00, \n0x04, 0x02, 0x40, 0x00, 0x0c, 0x04, 0xb6, 0x02, 0x3a, 0x6f, 0x9c, 0x04, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa0, 0xbc, 0x84, 0x41, 0x96, 0x48, 0x4c, 0x11, 0x40, 0x23, 0x04, 0x80, 0x00, 0x04, \n0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xd4, 0x50, 0x64, 0x00, 0x1c, 0x80, 0x06, 0x46, 0x10, \n0x00, 0x09, 0x58, 0x10, 0x84, 0x44, 0x84, 0x46, 0x4b, 0xe0, 0x1c, 0x01, 0xc8, 0x11, 0x50, 0x84, \n0x00, 0x7c, 0x9d, 0xb6, 0x80, 0x06, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0x74, 0x84, 0x46, \n0x4b, 0xe0, 0x1c, 0x01, 0xc8, 0x05, 0x4c, 0x64, 0x7f, 0xf6, 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, \n0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x44, 0x30, \n0x01, 0x0c, 0x54, 0xa0, 0x80, 0xff, 0x42, 0x65, 0x0c, 0x24, 0x54, 0x91, 0x00, 0xff, 0x44, 0x20, \n0x00, 0x43, 0x42, 0x64, 0x88, 0x73, 0x97, 0xc0, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x03, 0xb4, \n0x99, 0xb0, 0x84, 0x20, 0x97, 0x20, 0x80, 0x06, 0x81, 0x05, 0xf4, 0x81, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x84, 0x24, 0x4c, 0x70, 0xc0, 0x04, 0x84, 0x03, 0xd5, 0x09, \n0x84, 0x46, 0x4c, 0x71, 0x40, 0x04, 0x84, 0x04, 0xd5, 0x04, 0x84, 0xab, 0xdf, 0x04, 0x84, 0x02, \n0x10, 0x03, 0x00, 0x40, 0x41, 0xe0, 0x88, 0x08, 0x11, 0xe3, 0x00, 0x41, 0x80, 0x28, 0x46, 0x70, \n0x01, 0x02, 0x58, 0x73, 0x86, 0xa4, 0x80, 0x06, 0x80, 0x5e, 0xdd, 0x27, 0x01, 0xc3, 0x00, 0x40, \n0x84, 0x23, 0x4d, 0xc0, 0xc0, 0x1b, 0xf4, 0x01, 0x50, 0x54, 0x00, 0x18, 0x50, 0x33, 0x00, 0x10, \n0x8d, 0x10, 0x51, 0xc3, 0x00, 0x18, 0xc4, 0x09, 0xb6, 0xbf, 0x80, 0x03, 0x80, 0x28, 0x84, 0x48, \n0xdd, 0x27, 0xb4, 0x3f, 0x80, 0x1c, 0xd5, 0x07, 0x80, 0x25, 0x80, 0x03, 0x84, 0x48, 0xdd, 0x27, \n0x80, 0x1c, 0x80, 0x28, 0x84, 0x48, 0xdd, 0x27, 0x80, 0x0a, 0x80, 0x29, 0x80, 0x46, 0x46, 0xf0, \n0x00, 0x00, 0x58, 0xf7, 0x84, 0x80, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa0, 0xbc, 0x44, 0x30, 0x01, 0x0c, 0x97, 0x00, 0x42, 0x62, 0x0c, 0x24, 0x46, 0x20, \n0x00, 0x0c, 0x58, 0x21, 0x03, 0xb4, 0x99, 0xb2, 0x81, 0x01, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x43, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0c, \n0x00, 0x07, 0x84, 0xc1, 0x84, 0xa4, 0xd8, 0x03, 0x84, 0x03, 0xd5, 0x04, 0x84, 0xa6, 0xd8, 0x24, \n0x84, 0x04, 0x45, 0xe0, 0x00, 0x10, 0x10, 0x03, 0x00, 0x40, 0x11, 0xe3, 0x00, 0x41, 0x50, 0x14, \n0x00, 0x20, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xa4, 0x80, 0x06, 0x80, 0x5e, 0x4b, 0xe0, \n0x1c, 0x01, 0x00, 0x03, 0x00, 0x40, 0x84, 0xa3, 0xd8, 0x0f, 0x50, 0x14, 0x00, 0x38, 0x84, 0x48, \n0x50, 0x03, 0x00, 0x10, 0x4b, 0xe0, 0x1c, 0x01, 0x50, 0x03, 0x00, 0x18, 0x50, 0x14, 0x00, 0x30, \n0x84, 0x48, 0x4b, 0xe0, 0x1c, 0x01, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xdc, 0x97, 0x20, 0x55, 0xc0, 0x80, 0xff, 0x54, 0x91, 0x00, 0xff, 0x96, 0xd8, 0xc4, 0x44, \n0x84, 0x23, 0x4c, 0x30, 0x80, 0x05, 0x84, 0x45, 0x4c, 0x31, 0x40, 0x70, 0x85, 0x40, 0x80, 0xe0, \n0x81, 0x2a, 0x81, 0x0a, 0x80, 0xdf, 0xd5, 0x30, 0xa6, 0x38, 0x44, 0x30, 0x00, 0xdd, 0x4c, 0x01, \n0xc0, 0x26, 0x9c, 0x3a, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x20, 0x84, 0x43, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x86, 0xd4, 0xdd, 0x2f, 0xc8, 0x19, 0xa7, 0x7d, 0x87, 0xc1, 0x4c, 0x5f, \n0x40, 0x16, 0xa7, 0x39, 0x00, 0x93, 0x80, 0x06, 0x50, 0x82, 0x7f, 0xfa, 0x54, 0x84, 0x00, 0xff, \n0x50, 0x13, 0x80, 0x08, 0x80, 0x1f, 0x80, 0x48, 0x54, 0x94, 0x80, 0x03, 0xe7, 0x10, 0xe9, 0x40, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xa6, 0xb9, 0x9c, 0x52, 0x89, 0x41, \n0x99, 0xf9, 0x54, 0xa5, 0x00, 0xff, 0xa7, 0x79, 0x9c, 0xea, 0x40, 0x01, 0xa8, 0x00, 0x40, 0xfe, \n0x00, 0x07, 0xe8, 0xcb, 0xd5, 0x0f, 0x84, 0xc5, 0x4c, 0x33, 0x40, 0x30, 0x80, 0x20, 0x80, 0x5c, \n0x80, 0x1f, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xe7, 0x24, 0xe8, 0x20, \n0x81, 0x1c, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x02, 0x84, 0x80, 0x48, 0x80, 0x3f, 0x50, 0x03, \n0x01, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x84, 0x20, 0x00, 0x03, \n0x02, 0x3d, 0x10, 0x93, 0x02, 0x3c, 0x80, 0x49, 0x50, 0x53, 0x01, 0x10, 0x80, 0x61, 0x80, 0x81, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x85, 0xd8, 0xdd, 0x2f, 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, \n0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x85, 0x20, 0x81, 0x09, 0xd5, 0xdb, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x94, 0x85, 0x40, 0x80, 0xc2, 0x55, 0xc0, 0x00, 0xff, 0x44, 0x00, \n0x02, 0x00, 0x81, 0x21, 0x14, 0xaf, 0x80, 0x19, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0x9c, \n0xdd, 0x2f, 0xa7, 0x32, 0xa6, 0x73, 0x40, 0x32, 0x20, 0x08, 0x40, 0x21, 0x84, 0x04, 0x9c, 0x94, \n0x50, 0x1f, 0x80, 0x64, 0x80, 0x66, 0x84, 0x9f, 0x50, 0x8f, 0x80, 0x54, 0x80, 0xe0, 0x46, 0xf0, \n0x00, 0x02, 0x58, 0xf7, 0x84, 0x3c, 0xdd, 0x2f, 0x80, 0x2a, 0x80, 0x08, 0x44, 0x20, 0x00, 0x10, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x84, 0x02, 0x4d, 0xc0, 0x40, 0x1a, \n0x50, 0xaf, 0x80, 0x04, 0xf3, 0x19, 0x80, 0x09, 0x80, 0x47, 0x80, 0x8a, 0x44, 0x50, 0x00, 0x14, \n0x9e, 0x6c, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x81, 0x54, 0xdd, 0x2f, 0x80, 0x08, 0x80, 0x2a, \n0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xd5, 0x0d, \n0x44, 0x10, 0x00, 0x10, 0xf3, 0x19, 0x80, 0x09, 0x80, 0x88, 0x80, 0x47, 0x80, 0xa1, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x80, 0x10, 0xdd, 0x2f, 0x50, 0x1f, 0x80, 0x54, 0x44, 0x20, 0x00, 0x10, \n0x50, 0x03, 0x00, 0x51, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x80, 0x07, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0xb0, 0xdd, 0x2f, 0xec, 0x6c, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x87, \n0x84, 0xc2, 0xf6, 0x0c, 0x84, 0xe3, 0x85, 0x21, 0x84, 0xa0, 0x44, 0x00, 0x00, 0x5f, 0xaf, 0xf1, \n0x10, 0x93, 0x00, 0x00, 0xaf, 0x72, 0xae, 0x33, 0x83, 0x83, 0xf4, 0x81, 0x97, 0xc8, 0x96, 0x90, \n0x4e, 0x82, 0x00, 0x04, 0x84, 0x02, 0xd5, 0x02, 0x84, 0x1e, 0xae, 0x34, 0x46, 0x90, 0x00, 0x0c, \n0x58, 0x94, 0x82, 0x84, 0x00, 0x54, 0x82, 0x3d, 0xa7, 0x36, 0x56, 0x02, 0x80, 0x06, 0x85, 0x41, \n0x87, 0xc2, 0x40, 0x9f, 0x00, 0x1a, 0x40, 0x95, 0x00, 0x1b, 0x40, 0x12, 0x0c, 0x09, 0x94, 0x4b, \n0x40, 0x50, 0xa4, 0x04, 0xaf, 0x76, 0xe6, 0xe5, 0xe9, 0x04, 0x42, 0x52, 0x8c, 0x09, 0xd5, 0x03, \n0x58, 0x52, 0x80, 0x08, 0xaf, 0x76, 0x4e, 0x83, 0x00, 0x14, 0xe6, 0xe5, 0xe9, 0x11, 0xa7, 0x76, \n0x54, 0x01, 0x00, 0x03, 0x44, 0x3f, 0xff, 0xcf, 0x41, 0xe0, 0x10, 0x08, 0x40, 0xa2, 0x8c, 0x02, \n0x40, 0x45, 0x78, 0x04, 0x84, 0x43, 0xaf, 0x36, 0x4c, 0x71, 0x40, 0x0e, 0xd5, 0x0e, 0x84, 0x23, \n0x4c, 0x70, 0xc0, 0x07, 0xa7, 0x36, 0x58, 0x22, 0x00, 0x40, 0xae, 0xb6, 0xd5, 0x06, 0x85, 0x41, \n0x4c, 0x75, 0x00, 0x04, 0x84, 0xa5, 0xdf, 0x09, 0xa6, 0x36, 0x44, 0x1f, 0xff, 0x80, 0x40, 0x30, \n0x04, 0x04, 0x84, 0xa1, 0xae, 0xf6, 0xd7, 0x05, 0xa7, 0x35, 0x58, 0x22, 0x00, 0x01, 0xae, 0xb5, \n0x4e, 0x82, 0x00, 0x05, 0xe6, 0xe3, 0xe8, 0x04, 0xd5, 0x0d, 0xe6, 0xe5, 0xe9, 0x18, 0x01, 0xe3, \n0x00, 0x05, 0x58, 0xaf, 0x00, 0x02, 0x10, 0xa3, 0x00, 0x05, 0x4e, 0x82, 0x00, 0x11, 0x84, 0xa3, \n0xd7, 0x03, 0x84, 0xa5, 0xdf, 0x05, 0xa6, 0x75, 0x58, 0x00, 0x80, 0x10, 0xae, 0x35, 0x4e, 0x82, \n0x00, 0x07, 0x84, 0x41, 0x4c, 0x71, 0x00, 0x04, 0x84, 0xa3, 0xdf, 0x11, 0x46, 0xf0, 0x00, 0x0c, \n0x00, 0x17, 0x84, 0xc1, 0x45, 0xe0, 0x00, 0x10, 0x56, 0x30, 0x80, 0x04, 0x40, 0x5f, 0x04, 0x08, \n0x40, 0xa2, 0x8c, 0x1a, 0x40, 0xaf, 0x0c, 0x1b, 0x10, 0xa3, 0x00, 0x08, 0x50, 0x03, 0x00, 0x09, \n0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x83, 0x4c, 0x84, 0x48, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x86, 0xa4, 0xdd, 0x2f, 0xe6, 0xe4, 0xe9, 0x05, 0x4e, 0x83, 0x00, 0x26, 0x84, 0xa5, 0xdf, 0x23, \n0x46, 0xa0, 0x01, 0x02, 0x58, 0xa5, 0x06, 0xa4, 0x50, 0x03, 0x00, 0x11, 0x80, 0x3c, 0x44, 0x20, \n0x00, 0x20, 0x4b, 0xe0, 0x28, 0x01, 0x4e, 0x83, 0x00, 0x12, 0x84, 0xa5, 0xdf, 0x0f, 0x50, 0x1e, \n0x00, 0x10, 0x50, 0x03, 0x00, 0x31, 0x44, 0x20, 0x00, 0x10, 0x4b, 0xe0, 0x28, 0x01, 0x00, 0x33, \n0x00, 0x40, 0x9d, 0x5a, 0x10, 0x53, 0x00, 0x40, 0xd5, 0x08, 0x84, 0xa3, 0xdf, 0x04, 0x4e, 0x83, \n0x00, 0x05, 0xd5, 0x0c, 0x84, 0xa5, 0xdf, 0x0a, 0xf1, 0x01, 0x50, 0x03, 0x00, 0x41, 0x84, 0x46, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x50, 0x03, 0x00, 0x51, 0x84, 0x20, \n0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x84, 0xa1, \n0xd7, 0x0c, 0x80, 0x09, 0x80, 0x46, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x83, 0x54, 0x46, 0xf0, \n0x00, 0x00, 0x58, 0xf7, 0x88, 0x30, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xee, 0x84, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x07, 0x08, 0x50, 0x60, \n0x00, 0x5b, 0x84, 0x20, 0x97, 0xd0, 0x50, 0x0f, 0x81, 0x60, 0x44, 0x20, 0x00, 0x10, 0xdd, 0x28, \n0x84, 0x20, 0x44, 0x20, 0x00, 0x50, 0x50, 0x0f, 0x81, 0x00, 0xdd, 0x28, 0x50, 0x9f, 0x81, 0x74, \n0x84, 0x20, 0x44, 0x20, 0x00, 0xff, 0x80, 0x1f, 0xdd, 0x28, 0x84, 0x20, 0x84, 0x42, 0x80, 0x09, \n0xdd, 0x28, 0x50, 0x13, 0x7f, 0xaa, 0x80, 0x09, 0x84, 0x42, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x86, 0xa4, 0xdd, 0x2f, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x87, 0x84, 0xc2, 0x4c, 0x70, \n0x00, 0x08, 0x84, 0x43, 0x4c, 0x71, 0x00, 0x05, 0x84, 0x65, 0x4c, 0x71, 0xc0, 0x26, 0x51, 0xcf, \n0x81, 0x50, 0x84, 0x20, 0x84, 0x48, 0x80, 0x1c, 0x50, 0xa3, 0x7f, 0xae, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x46, 0x90, 0x00, 0x02, 0x58, 0x94, 0x84, 0x14, 0x80, 0x0a, \n0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x83, 0x4c, 0x84, 0x48, 0x4b, 0xe0, 0x24, 0x01, 0x84, 0x81, \n0x4c, 0x02, 0x00, 0x09, 0x80, 0x0a, 0x80, 0x3c, 0x84, 0x48, 0x4b, 0xe0, 0x24, 0x01, 0x4e, 0x03, \n0x00, 0xcc, 0x84, 0xa1, 0xd7, 0x6a, 0x00, 0xa3, 0x7f, 0xa7, 0x00, 0x93, 0x7f, 0xa8, 0x41, 0xe5, \n0x20, 0x08, 0x50, 0xa3, 0x7f, 0xf6, 0x41, 0xcf, 0x24, 0x04, 0x80, 0x2a, 0x44, 0x20, 0x00, 0x10, \n0x46, 0x90, 0x01, 0x02, 0x58, 0x94, 0x86, 0xa4, 0x50, 0x0f, 0x81, 0x50, 0x4b, 0xe0, 0x24, 0x01, \n0x84, 0x20, 0x80, 0x0a, 0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, \n0xdd, 0x2f, 0x00, 0x0f, 0x81, 0x75, 0x84, 0x21, 0x54, 0x00, 0x00, 0x07, 0x51, 0xce, 0x00, 0x04, \n0x4c, 0x00, 0xc0, 0x18, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x84, 0x85, 0x44, 0x8c, 0x2f, \n0x10, 0xa4, 0x82, 0x3d, 0x50, 0x04, 0x80, 0xd0, 0x80, 0x7c, 0x50, 0x23, 0x7f, 0xa5, 0x50, 0x4f, \n0x81, 0x60, 0x80, 0xa1, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x80, 0x10, 0xdd, 0x2f, 0xd5, 0x21, \n0x84, 0x42, 0x4c, 0x01, 0x40, 0x1f, 0x46, 0xa0, 0x00, 0x0c, 0x58, 0xa5, 0x02, 0x84, 0x80, 0x7c, \n0x87, 0x86, 0x11, 0xc5, 0x02, 0x3d, 0x50, 0x05, 0x00, 0xd0, 0x8c, 0x2f, 0x50, 0x23, 0x7f, 0xa5, \n0x50, 0x4f, 0x81, 0x00, 0x9d, 0x4c, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x81, 0x54, 0xdd, 0x2f, \n0x50, 0x1f, 0x81, 0x00, 0x50, 0x0f, 0x81, 0x60, 0x44, 0x20, 0x00, 0x10, 0x4b, 0xe0, 0x24, 0x01, \n0x50, 0x0f, 0x81, 0x50, 0x50, 0x1f, 0x81, 0x60, 0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x86, 0xd4, 0xdd, 0x2f, 0xc8, 0x60, 0xa7, 0x76, 0xa7, 0x37, 0x40, 0x32, 0xa0, 0x08, \n0x40, 0x31, 0x90, 0x04, 0x4e, 0x36, 0x00, 0x04, 0x84, 0x01, 0xd5, 0x57, 0x84, 0x23, 0x4c, 0x70, \n0xc0, 0x05, 0x4e, 0x83, 0x00, 0x06, 0xd5, 0x42, 0x84, 0x05, 0x4c, 0x70, 0x40, 0x40, 0x00, 0x5f, \n0x81, 0x75, 0x84, 0x42, 0x55, 0xe2, 0x80, 0x07, 0x80, 0x9f, 0x50, 0x03, 0x00, 0x08, 0x4d, 0xe1, \n0x40, 0x1e, 0xa6, 0x76, 0x01, 0xe3, 0x00, 0x07, 0x40, 0x90, 0xa0, 0x08, 0x40, 0x14, 0xf8, 0x04, \n0x94, 0xd3, 0x46, 0x20, 0x00, 0x0c, 0x58, 0x21, 0x03, 0x64, 0x50, 0x5f, 0x81, 0x70, 0x85, 0x20, \n0x14, 0x9f, 0x80, 0x5c, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x8e, 0x98, 0xdd, 0x2f, 0xf3, 0x5c, \n0x00, 0x4f, 0x81, 0x71, 0xae, 0xf7, 0xaf, 0x36, 0xd5, 0x0d, 0x80, 0x40, 0x46, 0x00, 0x00, 0x0c, \n0x58, 0x00, 0x03, 0x64, 0x50, 0x13, 0x7f, 0xd6, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x8c, \n0xdd, 0x2f, 0x4e, 0x83, 0x00, 0x0c, 0x84, 0x05, 0x4c, 0x70, 0x40, 0x09, 0x00, 0x5f, 0x81, 0x75, \n0x40, 0x22, 0x90, 0x09, 0x54, 0x21, 0x00, 0x03, 0xd5, 0x02, 0x84, 0x40, 0xa6, 0x77, 0x80, 0x67, \n0x80, 0x88, 0x80, 0x1f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x87, 0x2c, 0xdd, 0x2f, 0x84, 0x60, \n0x40, 0x01, 0x80, 0x06, 0xd5, 0x02, 0x84, 0x00, 0xed, 0x7c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xd4, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x84, 0x00, 0x34, \n0x82, 0x3d, 0x84, 0x45, 0x80, 0xc0, 0xf3, 0x85, 0x01, 0xc4, 0x82, 0x3c, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x8a, 0xe0, 0xdd, 0x2f, 0xc0, 0x69, 0x50, 0x13, 0x00, 0x09, 0x84, 0x48, 0x46, 0x80, \n0x01, 0x02, 0x58, 0x84, 0x06, 0xa4, 0x50, 0x04, 0x80, 0xc8, 0xdd, 0x28, 0x46, 0xf0, 0x00, 0x08, \n0x58, 0xf7, 0x89, 0x60, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x46, 0xf0, \n0x00, 0x00, 0x58, 0xf7, 0x82, 0x78, 0xdd, 0x2f, 0x81, 0x40, 0xc0, 0x4f, 0xa1, 0xc2, 0xc7, 0x4d, \n0x84, 0xc0, 0x80, 0x26, 0x44, 0x20, 0x04, 0x00, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x87, 0x08, 0xdd, 0x2f, 0xf0, 0x05, 0x80, 0x66, 0x80, 0x86, 0x80, 0xa6, 0x80, 0x5c, 0x84, 0x26, \n0x51, 0xc3, 0x80, 0x0e, 0xb6, 0xdf, 0xf6, 0x81, 0x15, 0xcf, 0x80, 0x02, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x89, 0x04, 0xdd, 0x2f, 0x50, 0x14, 0x82, 0x3f, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x18, \n0xdd, 0x28, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0x74, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x1e, \n0xdd, 0x28, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x38, 0x84, 0x42, 0x50, 0x0f, 0x80, 0x24, \n0xdd, 0x28, 0x00, 0x2e, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x03, 0x40, 0x81, 0x20, 0x08, 0x40, 0x84, \n0x00, 0x04, 0x50, 0x1f, 0x80, 0x18, 0x84, 0x4e, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x86, 0xf0, 0xdd, 0x2f, 0x50, 0x14, 0x00, 0x12, 0x80, 0x0a, 0x96, 0x49, 0x80, 0x46, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x8f, 0xd4, 0xdd, 0x2f, 0xec, 0x2c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xf8, 0x50, 0x6f, 0x80, 0x04, 0x80, 0xe0, 0x84, 0x42, 0x81, 0x01, \n0x80, 0x06, 0x84, 0x20, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x84, 0x42, \n0x80, 0x06, 0x9c, 0x7d, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xa6, 0xb1, \n0x54, 0x01, 0x00, 0x80, 0xc0, 0x16, 0xa6, 0x30, 0x54, 0x10, 0x00, 0x0e, 0xc9, 0x04, 0x54, 0x31, \n0x00, 0x08, 0xcb, 0x0f, 0x54, 0x40, 0x00, 0x0f, 0x84, 0xa3, 0xdc, 0x0b, 0x54, 0x21, 0x00, 0x08, \n0xca, 0x08, 0x80, 0x07, 0x80, 0x28, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x8d, 0x30, 0xdd, 0x2f, \n0xec, 0x08, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x9c, 0x80, 0xc0, \n0x44, 0x00, 0x00, 0x10, 0xf3, 0x83, 0xf2, 0x88, 0xf4, 0x89, 0xf5, 0x8a, 0x4c, 0x30, 0x00, 0x0d, \n0x44, 0x20, 0x00, 0x18, 0x4c, 0x31, 0x00, 0x09, 0x41, 0xe0, 0x04, 0x08, 0x4c, 0x3f, 0x00, 0x05, \n0x84, 0x1f, 0x48, 0x00, 0x00, 0xa2, 0x8e, 0x28, 0x80, 0x01, 0x84, 0xe0, 0xf1, 0x81, 0xf7, 0x97, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0x9c, 0xdd, 0x2f, 0xf0, 0x82, 0xc8, 0x04, 0x84, 0x1e, \n0x48, 0x00, 0x00, 0x93, 0x50, 0x0f, 0x80, 0x54, 0x46, 0xa0, 0x01, 0x02, 0x58, 0xa5, 0x06, 0xa4, \n0x80, 0x26, 0x84, 0x48, 0x4b, 0xe0, 0x28, 0x01, 0xf2, 0x01, 0xf0, 0x02, 0x40, 0x91, 0x0c, 0x09, \n0x50, 0x13, 0x00, 0x08, 0x4b, 0xe0, 0x28, 0x01, 0x84, 0xe5, 0x54, 0x04, 0x80, 0xff, 0x80, 0x89, \n0x42, 0x40, 0x1c, 0x73, 0x40, 0x24, 0x8c, 0x08, 0x05, 0xef, 0x80, 0x02, 0x50, 0x31, 0x7f, 0xf8, \n0x52, 0x50, 0x00, 0x00, 0x54, 0x82, 0x80, 0xff, 0x55, 0xc2, 0x00, 0xff, 0x40, 0xaf, 0x0c, 0x00, \n0x50, 0x64, 0xff, 0xff, 0x14, 0x8f, 0x80, 0x07, 0x15, 0xcf, 0x80, 0x04, 0xf7, 0x85, 0x14, 0xaf, \n0x80, 0x0b, 0xf6, 0x86, 0xf6, 0x06, 0x04, 0xaf, 0x80, 0x0b, 0x05, 0xcf, 0x80, 0x04, 0x46, 0x90, \n0x01, 0x02, 0x58, 0x94, 0x86, 0xa4, 0x50, 0x8f, 0x80, 0x5c, 0x50, 0x7f, 0x80, 0x4c, 0xd5, 0x2f, \n0xa7, 0x0f, 0x9f, 0xb1, 0x40, 0x3e, 0x10, 0x03, 0xae, 0xcf, 0xdd, 0x29, 0x80, 0x2a, 0x84, 0x48, \n0x50, 0x0f, 0x80, 0x3c, 0xdd, 0x29, 0xf3, 0x03, 0x46, 0xf0, 0x00, 0x09, 0x04, 0x17, 0x80, 0xd8, \n0xf2, 0x08, 0x45, 0xe0, 0x00, 0x10, 0x50, 0x4f, 0x80, 0x44, 0x80, 0xa8, 0x50, 0x0f, 0x80, 0x34, \n0x15, 0xef, 0x80, 0x17, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x88, 0xac, 0xdd, 0x2f, 0x50, 0x1f, \n0x80, 0x44, 0x84, 0x48, 0x50, 0x0f, 0x80, 0x54, 0xdd, 0x29, 0x80, 0x0a, 0x80, 0x27, 0x84, 0x48, \n0xdd, 0x29, 0x50, 0x1e, 0x7f, 0xff, 0x55, 0xc0, 0x80, 0xff, 0x8f, 0x48, 0x84, 0x48, 0x50, 0x0f, \n0x80, 0x34, 0x50, 0x1f, 0x80, 0x54, 0x4e, 0x64, 0xff, 0xcd, 0x05, 0xef, 0x80, 0x04, 0xf4, 0x07, \n0xf1, 0x05, 0x40, 0x3f, 0x10, 0x00, 0x9e, 0x89, 0x96, 0x18, 0x84, 0xbf, 0xf2, 0x85, 0xf0, 0x84, \n0xda, 0xb2, 0xf2, 0x01, 0xf5, 0x0a, 0xb6, 0x45, 0xf2, 0x01, 0xf1, 0x02, 0xf0, 0x09, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xf0, 0x02, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x81, 0xb0, 0xdd, 0x2f, 0x84, 0x00, 0xec, 0x64, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xee, 0xe4, 0xb6, 0x5f, 0xf3, 0x81, 0x80, 0xc1, 0x46, 0x70, 0x01, 0x02, \n0x58, 0x73, 0x87, 0x08, 0x84, 0x20, 0x44, 0x20, 0x00, 0x60, 0x83, 0x80, 0x50, 0x0f, 0x80, 0x68, \n0x81, 0x44, 0x81, 0x25, 0x50, 0x8f, 0x80, 0xc8, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x60, 0x50, 0x0f, 0x80, 0x08, 0x4b, 0xe0, 0x1c, 0x01, 0x80, 0x08, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x40, 0x4b, 0xe0, 0x1c, 0x01, 0x5c, 0xf3, 0x00, 0x41, 0xe8, 0x0f, 0x80, 0x08, 0x80, 0x3c, \n0x80, 0x46, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x50, 0x6f, 0x80, 0xc8, \n0x51, 0xcf, 0x81, 0x08, 0x80, 0xe6, 0xd5, 0x0a, 0x80, 0x1c, 0x80, 0x26, 0x80, 0x48, 0x46, 0xf0, \n0x01, 0x03, 0x58, 0xf7, 0x8e, 0x98, 0xdd, 0x2f, 0xd5, 0xf2, 0xa6, 0x78, 0x56, 0x00, 0x80, 0x36, \n0x18, 0x03, 0x80, 0x01, 0x4c, 0x7e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x68, 0x80, 0x07, 0x46, 0xf0, \n0x01, 0x03, 0x58, 0xf7, 0x8e, 0x54, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, 0x0d, 0xc0, \n0x80, 0x07, 0x50, 0x1f, 0x80, 0xc8, 0x44, 0x20, 0x00, 0x40, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0x3f, \n0xf2, 0x01, 0x80, 0x07, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x50, 0x1f, 0x81, 0x08, 0x46, 0xf0, \n0x01, 0x03, 0x58, 0xf7, 0x8d, 0x48, 0xdd, 0x2f, 0xa6, 0xf0, 0x56, 0x21, 0x80, 0x6a, 0x18, 0x23, \n0x00, 0x01, 0x4c, 0x6e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x08, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x03, \n0x58, 0xf7, 0x8e, 0x54, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, 0x0d, 0xc0, 0x80, 0x07, \n0x50, 0x1f, 0x80, 0xc8, 0x44, 0x20, 0x00, 0x40, 0x50, 0x6f, 0x81, 0x08, 0x4b, 0xe0, 0x20, 0x01, \n0x44, 0x20, 0x00, 0x10, 0x80, 0x07, 0x80, 0x26, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x80, 0x26, \n0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, 0x8d, 0x48, 0xdd, 0x2f, 0x46, 0x30, 0x01, 0x02, 0x58, 0x31, \n0x86, 0xa4, 0xe7, 0x31, 0xe9, 0x06, 0x80, 0x0a, 0x80, 0x26, 0x44, 0x20, 0x00, 0x10, 0xd5, 0x04, \n0x80, 0x0a, 0x80, 0x26, 0x80, 0x49, 0x4b, 0xe0, 0x0c, 0x01, 0xed, 0x1c, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xee, 0xcc, 0xb6, 0x5f, 0xf3, 0x81, 0x80, 0xc1, \n0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x87, 0x08, 0x84, 0x20, 0x44, 0x20, 0x00, 0x68, 0x83, 0x80, \n0x50, 0x0f, 0x80, 0x70, 0x81, 0x44, 0x81, 0x25, 0x50, 0x8f, 0x80, 0xdc, 0x4b, 0xe0, 0x1c, 0x01, \n0x84, 0x20, 0x44, 0x20, 0x00, 0x68, 0x50, 0x0f, 0x80, 0x08, 0x4b, 0xe0, 0x1c, 0x01, 0x80, 0x08, \n0x84, 0x20, 0x44, 0x20, 0x00, 0x40, 0x4b, 0xe0, 0x1c, 0x01, 0x5c, 0xf3, 0x00, 0x41, 0xe8, 0x0f, \n0x80, 0x08, 0x80, 0x3c, 0x80, 0x46, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, \n0x50, 0x6f, 0x80, 0xdc, 0x51, 0xcf, 0x81, 0x1c, 0x80, 0xe6, 0xd5, 0x0a, 0x80, 0x1c, 0x80, 0x26, \n0x80, 0x48, 0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, 0x81, 0xbc, 0xdd, 0x2f, 0xd5, 0xf2, 0xa6, 0x78, \n0x56, 0x00, 0x80, 0x36, 0x18, 0x03, 0x80, 0x01, 0x4c, 0x7e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x70, \n0x80, 0x07, 0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, 0x81, 0x78, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, \n0x58, 0x84, 0x00, 0xe4, 0x80, 0x07, 0x50, 0x1f, 0x80, 0xdc, 0x44, 0x20, 0x00, 0x40, 0x4b, 0xe0, \n0x20, 0x01, 0xb4, 0x3f, 0xf2, 0x01, 0x80, 0x07, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x50, 0x1f, \n0x81, 0x1c, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x8f, 0xd8, 0xdd, 0x2f, 0xa6, 0xf0, 0x56, 0x21, \n0x80, 0x6a, 0x18, 0x23, 0x00, 0x01, 0x4c, 0x6e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x08, 0x80, 0x07, \n0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, 0x81, 0x78, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, \n0x00, 0xe4, 0x80, 0x07, 0x50, 0x1f, 0x80, 0xdc, 0x44, 0x20, 0x00, 0x40, 0x50, 0x6f, 0x81, 0x1c, \n0x4b, 0xe0, 0x20, 0x01, 0x44, 0x20, 0x00, 0x14, 0x80, 0x07, 0x80, 0x26, 0x4b, 0xe0, 0x20, 0x01, \n0x80, 0x07, 0x80, 0x26, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x8f, 0xd8, 0xdd, 0x2f, 0x46, 0x30, \n0x01, 0x02, 0x58, 0x31, 0x86, 0xa4, 0xe7, 0x35, 0xe9, 0x06, 0x80, 0x0a, 0x80, 0x26, 0x44, 0x20, \n0x00, 0x14, 0xd5, 0x04, 0x80, 0x0a, 0x80, 0x26, 0x80, 0x49, 0x4b, 0xe0, 0x0c, 0x01, 0xed, 0x34, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x04, 0x00, 0x04, 0x10, 0x00, 0x20, \n0x54, 0x10, 0x81, 0x00, 0xc1, 0x0c, 0x80, 0x60, 0x46, 0x00, 0x04, 0x00, 0x44, 0x21, 0x00, 0x00, \n0x58, 0x00, 0x02, 0x80, 0x14, 0x21, 0x80, 0x9f, 0x84, 0x20, 0xd5, 0x08, 0x80, 0x80, 0x46, 0x00, \n0x04, 0x00, 0x14, 0x12, 0x00, 0x9f, 0x58, 0x00, 0x02, 0x80, 0xb6, 0x20, 0x46, 0x30, 0x04, 0x00, \n0x58, 0x31, 0x82, 0x70, 0xb4, 0x23, 0x40, 0x50, 0xa0, 0x09, 0x40, 0x52, 0xa0, 0x08, 0xb6, 0xa3, \n0x46, 0x50, 0x04, 0x00, 0xb4, 0x83, 0x58, 0x22, 0x00, 0x80, 0xb6, 0x43, 0x04, 0x02, 0x80, 0x96, \n0x58, 0x10, 0x00, 0x03, 0x14, 0x12, 0x80, 0x96, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x04, 0x00, \n0x04, 0x20, 0x80, 0x97, 0x96, 0x14, 0xc0, 0x45, 0x80, 0x81, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, \n0x82, 0x84, 0x04, 0x32, 0x00, 0x20, 0x04, 0x40, 0x80, 0x98, 0x54, 0x31, 0x81, 0x00, 0x58, 0x52, \n0x00, 0x40, 0x14, 0x50, 0x80, 0x98, 0xc3, 0x1d, 0x46, 0x30, 0x04, 0x00, 0x44, 0x51, 0x00, 0x00, \n0x80, 0x03, 0x14, 0x51, 0x80, 0x9f, 0x84, 0x60, 0x14, 0x30, 0x00, 0xa0, 0x46, 0x00, 0x04, 0x00, \n0x58, 0x00, 0x02, 0x70, 0xb4, 0x60, 0x92, 0x68, 0x40, 0x31, 0xa0, 0x08, 0xb6, 0x60, 0x58, 0x42, \n0x00, 0xc0, 0xb4, 0x60, 0x58, 0x51, 0x80, 0x80, 0xb6, 0xa0, 0x14, 0x40, 0x80, 0x98, 0xd5, 0x19, \n0x46, 0x40, 0x04, 0x00, 0x80, 0x04, 0x14, 0x32, 0x00, 0x9f, 0x14, 0x30, 0x00, 0xa0, 0x46, 0x00, \n0x04, 0x00, 0x58, 0x00, 0x02, 0x70, 0xb4, 0x60, 0x42, 0x52, 0x9c, 0x09, 0x92, 0x68, 0x40, 0x31, \n0xa0, 0x08, 0xb6, 0x60, 0xb4, 0x60, 0x58, 0x41, 0x80, 0x80, 0xb6, 0x80, 0x14, 0x50, 0x80, 0x98, \n0x54, 0x11, 0x10, 0x00, 0xc1, 0x06, 0x84, 0x61, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x37, 0x82, 0x44, \n0x46, 0x00, 0x04, 0x00, 0x14, 0x20, 0x00, 0x97, 0xdd, 0x9e, 0x92, 0x00, 0xc8, 0x0a, 0x46, 0xf0, \n0x00, 0x0c, 0x00, 0x07, 0x80, 0xe6, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x27, 0x80, 0xe8, 0xd5, 0x1c, \n0x84, 0xa1, 0xd8, 0x10, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x47, 0x80, 0xe6, 0x46, 0xf0, 0x00, 0x0c, \n0x00, 0x37, 0x80, 0xe8, 0x40, 0x02, 0x10, 0x09, 0x42, 0x21, 0x98, 0x0b, 0x54, 0x00, 0x00, 0x03, \n0xd5, 0x21, 0x84, 0xa2, 0xd8, 0x0e, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x07, 0x80, 0xe7, 0x46, 0xf0, \n0x00, 0x0c, 0x00, 0x27, 0x80, 0xe9, 0x54, 0x00, 0x00, 0x03, 0x42, 0x21, 0x08, 0x0b, 0xd5, 0x12, \n0x84, 0x83, 0x4c, 0x02, 0x40, 0x31, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x57, 0x80, 0xe7, 0x46, 0xf0, \n0x00, 0x0c, 0x00, 0x27, 0x80, 0xe9, 0x40, 0x02, 0x90, 0x09, 0x42, 0x21, 0x18, 0x0b, 0x40, 0x00, \n0x10, 0x02, 0x84, 0xa1, 0xd8, 0x22, 0x46, 0x50, 0x04, 0x00, 0x80, 0x25, 0x44, 0x41, 0x00, 0x00, \n0x84, 0x60, 0x14, 0x42, 0x80, 0x9f, 0x14, 0x30, 0x80, 0xa0, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, \n0x82, 0x70, 0xb4, 0xa1, 0x40, 0x32, 0xa0, 0x09, 0x40, 0x31, 0xa0, 0x08, 0xb6, 0x61, 0x4c, 0x20, \n0x40, 0x06, 0xb4, 0x01, 0x58, 0x00, 0x00, 0x82, 0xd5, 0x04, 0xb4, 0x41, 0x58, 0x01, 0x00, 0x80, \n0xb6, 0x01, 0xd5, 0x44, 0x84, 0x00, 0x80, 0x40, 0x9e, 0x42, 0x96, 0x90, 0xe6, 0x22, 0xe8, 0x21, \n0x46, 0x30, 0x04, 0x00, 0x46, 0x00, 0x30, 0x70, 0x80, 0xa3, 0x58, 0x00, 0x03, 0x07, 0x14, 0x01, \n0x80, 0x9d, 0x14, 0x02, 0x80, 0x9e, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x70, 0xb4, 0x80, \n0x40, 0x52, 0x20, 0x09, 0x40, 0x52, 0xa0, 0x08, 0x84, 0x61, 0xb6, 0xa0, 0x4c, 0x21, 0xc0, 0x06, \n0xb4, 0x40, 0x58, 0x11, 0x00, 0x86, 0xd5, 0x21, 0xb4, 0x80, 0x58, 0x12, 0x00, 0x84, 0xd5, 0x1d, \n0x46, 0x10, 0x04, 0x00, 0x80, 0x01, 0x84, 0xa0, 0x14, 0x50, 0x80, 0x9f, 0x14, 0x50, 0x00, 0xa0, \n0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x70, 0xb4, 0x80, 0x40, 0x52, 0x20, 0x09, 0x40, 0x52, \n0xa0, 0x08, 0x84, 0x21, 0xb6, 0xa0, 0x4c, 0x20, 0xc0, 0x06, 0xb4, 0x40, 0x58, 0x11, 0x00, 0x82, \n0xd5, 0x04, 0xb4, 0x80, 0x58, 0x12, 0x00, 0x80, 0xb6, 0x20, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xe4, 0x96, 0x49, 0x40, 0x20, 0x88, 0x09, 0xf2, 0x83, 0x4e, 0x12, 0x01, 0xc4, 0x54, 0x10, \n0x80, 0x03, 0x4e, 0x13, 0x01, 0xc0, 0x46, 0x30, 0xa0, 0xa0, 0x46, 0x90, 0x04, 0x00, 0x58, 0x94, \n0x82, 0x88, 0x46, 0xa0, 0x04, 0x00, 0x58, 0x31, 0x80, 0x01, 0x14, 0x9f, 0x80, 0x02, 0x83, 0x80, \n0xf3, 0x81, 0x50, 0x8f, 0x80, 0x16, 0x81, 0x21, 0x48, 0x00, 0x01, 0xa7, 0xb4, 0xbc, 0xb4, 0xfc, \n0xb4, 0xdc, 0x40, 0x43, 0xa0, 0x09, 0x40, 0x13, 0x40, 0x09, 0x96, 0x48, 0x44, 0x00, 0x00, 0x52, \n0x97, 0xa8, 0x97, 0xe0, 0x4c, 0x10, 0x01, 0x6f, 0x5c, 0xf0, 0x80, 0x53, 0xe8, 0x0a, 0x45, 0xe0, \n0x00, 0x50, 0x4c, 0x1f, 0x00, 0x12, 0x9e, 0x81, 0x4c, 0x11, 0x41, 0x95, 0x48, 0x00, 0x01, 0x5a, \n0x9c, 0x02, 0x4c, 0x10, 0x01, 0x76, 0xe2, 0x20, 0x4e, 0xf3, 0x01, 0x68, 0x9c, 0xc1, 0x4c, 0x11, \n0xc1, 0x8a, 0x48, 0x00, 0x01, 0x7f, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x77, 0x80, 0xe0, 0x4e, 0x72, \n0x01, 0x79, 0x9f, 0x79, 0x97, 0x28, 0xe6, 0x86, 0x4e, 0xf2, 0x00, 0xaa, 0x44, 0x50, 0x00, 0x10, \n0xd6, 0x21, 0xe6, 0xd1, 0xe8, 0x06, 0xc6, 0x10, 0x84, 0xa8, 0x4c, 0x62, 0xc0, 0xa1, 0xd5, 0x66, \n0x44, 0x50, 0x00, 0x60, 0xd6, 0x13, 0x40, 0x5f, 0x04, 0x08, 0xd6, 0x12, 0x44, 0x50, 0x00, 0x20, \n0x4c, 0x62, 0xc0, 0x96, 0xd5, 0x03, 0x80, 0x06, 0xd5, 0x02, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x83, 0xac, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0x8b, 0x84, 0x02, 0xd5, 0xf8, 0x84, 0x03, \n0xd5, 0xf6, 0x84, 0xa4, 0xdf, 0x1a, 0x46, 0x50, 0x04, 0x00, 0x80, 0x25, 0x44, 0x41, 0x00, 0x00, \n0x84, 0x00, 0x14, 0x42, 0x80, 0x9f, 0x14, 0x00, 0x80, 0xa0, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, \n0x82, 0x70, 0xb4, 0x41, 0x41, 0xe1, 0x20, 0x09, 0x41, 0xef, 0x20, 0x08, 0x15, 0xe0, 0x80, 0x00, \n0xb4, 0xa1, 0x58, 0x22, 0x80, 0x80, 0xd5, 0x1a, 0x84, 0xa5, 0xdf, 0x19, 0x46, 0x20, 0x04, 0x00, \n0x80, 0x22, 0x45, 0xe1, 0x00, 0x00, 0x84, 0xa0, 0x15, 0xe1, 0x00, 0x9f, 0x14, 0x50, 0x80, 0xa0, \n0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x70, 0xb4, 0x81, 0x40, 0x02, 0x20, 0x09, 0x40, 0x00, \n0x20, 0x08, 0xb6, 0x01, 0xb4, 0x41, 0x58, 0x21, 0x00, 0x82, 0xb6, 0x41, 0x46, 0x50, 0x04, 0x00, \n0x47, 0xe0, 0x06, 0x40, 0x80, 0x65, 0x44, 0x10, 0x01, 0x90, 0x59, 0xef, 0x00, 0x64, 0x15, 0xe2, \n0x80, 0x9f, 0x14, 0x11, 0x80, 0xa0, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x70, 0xb4, 0x81, \n0x40, 0x22, 0x20, 0x09, 0x40, 0x21, 0x20, 0x08, 0xd5, 0x35, 0x84, 0xa2, 0xdf, 0x1b, 0x46, 0x40, \n0x04, 0x00, 0x46, 0x20, 0x30, 0x70, 0x83, 0xc4, 0x58, 0x21, 0x03, 0x20, 0x84, 0x21, 0x14, 0x22, \n0x00, 0x9f, 0x14, 0x1f, 0x00, 0xa0, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x70, 0xb4, 0xa1, \n0x40, 0x02, 0xa0, 0x09, 0x40, 0x00, 0x20, 0x08, 0xb6, 0x01, 0xb4, 0x81, 0x58, 0x22, 0x00, 0x80, \n0xd5, 0x1d, 0x84, 0xa3, 0xdf, 0x1c, 0x46, 0x40, 0x04, 0x00, 0x46, 0x20, 0x06, 0x40, 0x83, 0xc4, \n0x58, 0x21, 0x00, 0x64, 0x44, 0x10, 0x01, 0x90, 0x14, 0x22, 0x00, 0x9f, 0x14, 0x1f, 0x00, 0xa0, \n0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x70, 0xb4, 0xa1, 0x40, 0x22, 0xa0, 0x09, 0x40, 0x21, \n0x20, 0x08, 0xb6, 0x41, 0xb4, 0x01, 0x58, 0x20, 0x00, 0x81, 0xb6, 0x41, 0x9f, 0x7f, 0x96, 0x68, \n0xe6, 0x23, 0xe9, 0x04, 0x84, 0xac, 0x4c, 0x72, 0xc0, 0xc5, 0x84, 0xa3, 0xd6, 0x78, 0xe6, 0xc4, \n0xe8, 0x06, 0xc6, 0x0c, 0x84, 0xa1, 0x4c, 0x62, 0xc0, 0xbd, 0xd5, 0x14, 0x84, 0xae, 0xd6, 0x12, \n0x44, 0x50, 0x00, 0x62, 0x4c, 0x62, 0xc0, 0xb6, 0xd5, 0x4c, 0x46, 0x50, 0x04, 0x00, 0x46, 0x30, \n0xa1, 0x40, 0x80, 0x05, 0x58, 0x31, 0x80, 0x01, 0x14, 0x32, 0x80, 0x9f, 0x14, 0x60, 0x00, 0xa0, \n0xd5, 0x31, 0x84, 0xa7, 0xdf, 0x1c, 0x46, 0x10, 0x04, 0x00, 0x83, 0xc1, 0x46, 0x40, 0x10, 0x00, \n0x58, 0x42, 0x00, 0x01, 0x44, 0x21, 0x75, 0x30, 0x14, 0x20, 0x80, 0x9f, 0x14, 0x4f, 0x00, 0xa0, \n0x46, 0x40, 0x04, 0x00, 0x58, 0x42, 0x02, 0x70, 0xb4, 0xa4, 0x40, 0x02, 0xa0, 0x09, 0x40, 0x00, \n0x20, 0x08, 0xb6, 0x04, 0xb4, 0x44, 0x58, 0x11, 0x00, 0x80, 0xb6, 0x24, 0x50, 0x53, 0xff, 0xf8, \n0x96, 0x28, 0xe6, 0x02, 0x4e, 0xf2, 0x00, 0x86, 0x46, 0x10, 0x04, 0x00, 0x83, 0xc1, 0x46, 0x40, \n0x10, 0x00, 0x58, 0x42, 0x00, 0x01, 0x44, 0x31, 0x75, 0x30, 0x14, 0x30, 0x80, 0x9f, 0x14, 0x4f, \n0x00, 0xa0, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x70, 0x05, 0xe0, 0x00, 0x00, 0x40, 0x5f, \n0x20, 0x09, 0x40, 0x52, 0xa0, 0x08, 0xb6, 0xa0, 0xb4, 0x40, 0x58, 0x11, 0x00, 0x80, 0xd5, 0x37, \n0xe6, 0x22, 0xe8, 0x03, 0xf0, 0x01, 0xd5, 0x07, 0x84, 0xac, 0xdf, 0x63, 0x46, 0x00, 0xa0, 0xa2, \n0x58, 0x00, 0x0e, 0xe0, 0x14, 0x05, 0x00, 0xa1, 0x87, 0xc0, 0xf4, 0x02, 0x46, 0x00, 0x04, 0x00, \n0x15, 0xe2, 0x00, 0x00, 0x58, 0x00, 0x02, 0x70, 0xb4, 0xa0, 0x44, 0x2f, 0x00, 0xff, 0x40, 0x32, \n0x88, 0x02, 0xb6, 0x60, 0xb4, 0x20, 0x42, 0x10, 0xbc, 0x08, 0xd5, 0x19, 0xe6, 0x22, 0xe9, 0x03, \n0x84, 0xac, 0xdf, 0x47, 0xf0, 0x01, 0x87, 0xc0, 0x14, 0x05, 0x00, 0xa1, 0x46, 0x00, 0x04, 0x00, \n0xf4, 0x02, 0x58, 0x00, 0x02, 0x70, 0x15, 0xe2, 0x00, 0x00, 0x44, 0x3f, 0x00, 0xff, 0xb4, 0x40, \n0x40, 0x51, 0x0c, 0x02, 0xb6, 0xa0, 0xb4, 0x20, 0x42, 0x10, 0xbc, 0x08, 0xb6, 0x20, 0xd5, 0x31, \n0x46, 0xf0, 0x00, 0x0c, 0x10, 0x67, 0x80, 0xe2, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x77, 0x80, 0xe1, \n0xd5, 0x28, 0x40, 0x23, 0x20, 0x08, 0x40, 0x31, 0x1c, 0x04, 0x80, 0x28, 0x84, 0x42, 0x46, 0x00, \n0x00, 0x0c, 0x58, 0x00, 0x00, 0xe4, 0xd5, 0x16, 0x41, 0xe3, 0x20, 0x08, 0x40, 0x3f, 0x1c, 0x04, \n0x80, 0x28, 0x84, 0x42, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0xe6, 0xd5, 0x0b, 0x40, 0x43, \n0x20, 0x08, 0x40, 0x32, 0x1c, 0x04, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0xe8, 0x80, 0x28, \n0x84, 0x42, 0x12, 0x3f, 0x80, 0x0b, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, \n0x8d, 0x21, 0x51, 0xce, 0x00, 0x04, 0xf3, 0x03, 0xe3, 0x23, 0x4e, 0xf3, 0xfe, 0x59, 0x84, 0x00, \n0xd5, 0x02, 0x84, 0x01, 0xec, 0x1c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x96, 0x49, 0x54, 0x20, \n0x80, 0x03, 0x40, 0x30, 0x88, 0x09, 0xca, 0x10, 0x5c, 0xf0, 0x80, 0xc8, 0xe8, 0x0d, 0x80, 0x20, \n0xb4, 0x40, 0x84, 0x01, 0xd5, 0x04, 0xb4, 0x81, 0x9c, 0x01, 0xab, 0x11, 0x9c, 0x4c, 0xe2, 0x03, \n0xe9, 0xfb, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0x3c, \n0xa4, 0x88, 0x84, 0xa8, 0xda, 0x16, 0x80, 0x80, 0xa2, 0xa1, 0xb4, 0xa4, 0x5c, 0xf2, 0x80, 0x40, \n0xe8, 0x10, 0x84, 0x60, 0xd5, 0x04, 0xa3, 0x91, 0x80, 0x64, 0xb6, 0xc0, 0x40, 0x21, 0x20, 0x08, \n0x92, 0x48, 0x9c, 0x04, 0x9d, 0x19, 0xdb, 0xf8, 0x94, 0x22, 0xac, 0x08, 0x84, 0x00, 0xd5, 0x02, \n0x84, 0x01, 0x3a, 0x6f, 0x98, 0x04, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x94, 0xb5, 0x20, \n0x80, 0xc0, 0x84, 0x01, 0x4c, 0x90, 0x40, 0x7f, 0x51, 0xe3, 0x00, 0x08, 0x51, 0xc3, 0x00, 0x0c, \n0x50, 0xa3, 0x00, 0x20, 0x50, 0x83, 0x00, 0x04, 0xb5, 0x08, 0xb4, 0xbe, 0xb4, 0x9c, 0xb4, 0x6a, \n0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xf0, 0x50, 0x13, 0x00, 0x14, 0x84, 0x46, 0x50, 0x0f, \n0x80, 0x60, 0x01, 0xc3, 0x00, 0x6c, 0x00, 0xa3, 0x00, 0x6d, 0xf3, 0x83, 0xf4, 0x82, 0xf5, 0x81, \n0xdd, 0x27, 0x50, 0x13, 0x00, 0x1a, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x58, 0xdd, 0x27, 0x50, 0x13, \n0x00, 0x24, 0x44, 0x20, 0x00, 0x40, 0x50, 0x0f, 0x80, 0x10, 0xdd, 0x27, 0x50, 0x13, 0x00, 0x64, \n0x50, 0x0f, 0x80, 0x50, 0x84, 0x48, 0xdd, 0x27, 0x54, 0x04, 0x00, 0x01, 0xf3, 0x03, 0xf4, 0x02, \n0xf5, 0x01, 0xc0, 0x05, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x97, 0x84, 0xd1, 0x54, 0x84, 0x00, 0x02, \n0x4e, 0x82, 0x00, 0x0b, 0x84, 0xc1, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x67, 0x84, 0xd3, 0x46, 0xf0, \n0x00, 0x0c, 0x10, 0x67, 0x84, 0xd2, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x02, 0x84, 0x14, 0x53, \n0x00, 0x95, 0x14, 0x43, 0x00, 0x96, 0x10, 0x33, 0x02, 0x3e, 0x11, 0xc3, 0x02, 0x3c, 0x10, 0xa3, \n0x02, 0x3d, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xf0, 0x50, 0x1f, 0x80, 0x60, 0x84, 0x46, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x05, 0x74, 0xdd, 0x27, 0x50, 0x1f, 0x80, 0x58, 0x84, 0x46, \n0x50, 0x03, 0x02, 0x3f, 0xdd, 0x27, 0x50, 0x1f, 0x80, 0x10, 0x44, 0x20, 0x00, 0x40, 0x50, 0x03, \n0x00, 0xd0, 0xdd, 0x27, 0x50, 0x1f, 0x80, 0x50, 0x84, 0x48, 0x50, 0x03, 0x00, 0xc8, 0xdd, 0x27, \n0x84, 0x00, 0x50, 0x13, 0x00, 0xd0, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x86, 0xa0, 0xdd, 0x2f, \n0x84, 0x00, 0xec, 0x6c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, \n0x96, 0x49, 0x54, 0x70, 0x80, 0x07, 0x40, 0xa0, 0x88, 0x09, 0xcf, 0x2e, 0x9d, 0x84, 0x46, 0x90, \n0x00, 0x05, 0x58, 0x94, 0x86, 0xf4, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x05, 0xb4, 0xd5, 0x1f, \n0xb4, 0x20, 0x40, 0x00, 0xa0, 0x08, 0x92, 0x08, 0x40, 0x20, 0xf8, 0x09, 0x4e, 0x14, 0x00, 0x0a, \n0x40, 0x00, 0xc0, 0x09, 0x84, 0x40, 0x96, 0x48, 0x96, 0x00, 0x4b, 0xe0, 0x20, 0x01, 0xd5, 0x0a, \n0x84, 0xa1, 0xda, 0x09, 0x40, 0x40, 0xc0, 0x09, 0x96, 0x20, 0x96, 0x48, 0x84, 0x40, 0x4b, 0xe0, \n0x24, 0x01, 0xc8, 0x0a, 0xb4, 0xa0, 0x9d, 0xfa, 0xb6, 0xa6, 0x8c, 0xc8, 0x9e, 0x34, 0xe2, 0xea, \n0xe9, 0xe0, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0x54, 0x70, 0x80, 0x07, 0x41, 0xc0, 0x88, 0x09, \n0xcf, 0x35, 0x9d, 0x84, 0x46, 0xa0, 0x00, 0x05, 0x58, 0xa5, 0x07, 0x68, 0x46, 0x90, 0x00, 0x05, \n0x58, 0x94, 0x86, 0x6c, 0xd5, 0x26, 0xb4, 0x20, 0x9d, 0xfa, 0x40, 0x00, 0xa0, 0x08, 0x92, 0x08, \n0x40, 0x80, 0xf8, 0x09, 0x4e, 0x14, 0x00, 0x0c, 0x40, 0x00, 0xc0, 0x09, 0xb4, 0x46, 0x96, 0x00, \n0x96, 0x48, 0x4b, 0xe0, 0x24, 0x01, 0x84, 0xa1, 0xd0, 0x13, 0xd5, 0x18, 0x84, 0xa1, 0x4c, 0x82, \n0xc0, 0x0c, 0x40, 0x50, 0xc0, 0x09, 0xb4, 0x46, 0x96, 0x28, 0x96, 0x48, 0x4b, 0xe0, 0x28, 0x01, \n0x4c, 0x04, 0x00, 0x07, 0xd5, 0x0b, 0x05, 0xe3, 0x00, 0x00, 0x15, 0xe0, 0x00, 0x00, 0x8c, 0xc8, \n0x9e, 0x34, 0xe2, 0xfc, 0xe9, 0xd9, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xec, 0x04, 0x3a, 0x6f, \n0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x85, 0x0c, 0x96, 0xc9, 0x40, 0x21, \n0xa1, 0x17, 0x40, 0x11, 0x88, 0x09, 0xf1, 0x81, 0x4e, 0x83, 0x00, 0x6a, 0x50, 0x70, 0x00, 0x08, \n0x9d, 0x84, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, 0x06, 0x6c, 0xd5, 0x5a, 0xb4, 0x20, 0x40, 0x00, \n0xa0, 0x08, 0x92, 0x08, 0x8d, 0x03, 0x40, 0x20, 0xf8, 0x09, 0x4e, 0x14, 0x00, 0x20, 0x40, 0x90, \n0xc0, 0x09, 0x54, 0x94, 0x80, 0xff, 0x54, 0xa0, 0x80, 0xff, 0x80, 0x2a, 0x84, 0x40, 0x80, 0x09, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0x80, 0x40, 0x80, 0x2a, 0x80, 0x09, \n0xca, 0x46, 0xb4, 0x66, 0xb4, 0x82, 0x05, 0xe3, 0x80, 0x00, 0x40, 0x21, 0x8c, 0x05, 0x40, 0x51, \n0x10, 0x02, 0x40, 0x22, 0xf8, 0x04, 0xdd, 0x3c, 0xd5, 0x23, 0x84, 0xa1, 0xda, 0x24, 0x40, 0x00, \n0xc0, 0x09, 0x54, 0x90, 0x00, 0xff, 0x54, 0xa0, 0x80, 0xff, 0x80, 0x2a, 0x84, 0x40, 0x80, 0x09, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0x80, 0x40, 0x80, 0x2a, 0x80, 0x09, \n0xca, 0x26, 0xb4, 0xa6, 0xb4, 0x82, 0xb4, 0x67, 0x40, 0x22, 0x94, 0x05, 0x41, 0xe1, 0x10, 0x02, \n0x40, 0x2f, 0x0c, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0x68, 0xdd, 0x2f, 0x84, 0xa1, \n0xd0, 0x0d, 0xd5, 0x15, 0xb4, 0x60, 0xb4, 0x26, 0xb4, 0x47, 0x40, 0x50, 0x84, 0x05, 0x40, 0x41, \n0x94, 0x02, 0x41, 0xe2, 0x08, 0x04, 0x15, 0xe0, 0x00, 0x00, 0x8c, 0xcc, 0x8c, 0xec, 0x05, 0xef, \n0x80, 0x01, 0x9e, 0x34, 0xe3, 0x1e, 0xe9, 0xa3, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xec, 0x0c, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x04, 0x80, \n0x80, 0x04, 0x80, 0xc1, 0x40, 0x14, 0x50, 0x09, 0x81, 0x20, 0x54, 0x10, 0x80, 0x7f, 0x44, 0x00, \n0x00, 0x14, 0x84, 0xe4, 0x4c, 0x10, 0x00, 0x6e, 0xe4, 0x35, 0xe8, 0x17, 0x84, 0xaa, 0xd1, 0x41, \n0xe4, 0x2b, 0xe8, 0x0a, 0x84, 0xa8, 0xd1, 0x2b, 0xe4, 0x29, 0xe8, 0x32, 0x84, 0xa1, 0x4c, 0x12, \n0xc0, 0xcf, 0x48, 0x00, 0x00, 0xb8, 0x84, 0x0c, 0x4c, 0x10, 0x00, 0x3f, 0xe0, 0x20, 0xe9, 0x45, \n0x9d, 0x44, 0x4c, 0x12, 0xc0, 0xc5, 0xd5, 0x4d, 0x44, 0x50, 0x00, 0x1c, 0x4c, 0x12, 0x80, 0x8b, \n0xe4, 0x3d, 0xe8, 0x0a, 0x9c, 0x82, 0x4c, 0x11, 0x00, 0xbd, 0xe0, 0x22, 0xe9, 0x52, 0x9d, 0x44, \n0x4c, 0x12, 0xc0, 0xb6, 0xd5, 0x56, 0x9c, 0xaa, 0x4c, 0x11, 0x00, 0x8d, 0xe0, 0x22, 0x4e, 0xf3, \n0x00, 0x82, 0x9d, 0x51, 0x4c, 0x12, 0xc0, 0xac, 0x48, 0x00, 0x00, 0x8d, 0xa0, 0x32, 0xa4, 0x76, \n0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x88, 0x8c, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0xa4, 0xa0, 0x32, \n0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8b, 0x04, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0x9b, \n0xa0, 0x32, 0xa4, 0x76, 0x54, 0x74, 0x3f, 0xff, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8a, 0x0c, \n0xdd, 0x2f, 0x48, 0x00, 0x00, 0x90, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x8a, 0x80, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0x87, 0xa0, 0x32, 0x50, 0x13, 0x00, 0x0c, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x88, 0xbc, 0xdd, 0x2f, 0xa5, 0xf6, 0x54, 0x73, 0xbf, 0xff, 0xd5, 0x7a, \n0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x84, 0xec, 0xdd, 0x2f, 0xd5, 0x72, \n0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x89, 0x0c, 0xdd, 0x2f, 0xd5, 0x6a, \n0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x88, 0xf8, 0xdd, 0x2f, 0xd5, 0x62, \n0xa1, 0x32, 0x84, 0x21, 0xa2, 0xa1, 0xb4, 0x64, 0x4c, 0x20, 0xc0, 0x07, 0x46, 0xf0, 0x00, 0x0c, \n0x10, 0x37, 0x84, 0xd0, 0xd5, 0x54, 0x84, 0xa3, 0xda, 0x52, 0x96, 0xd8, 0x46, 0xf0, 0x00, 0x0c, \n0x10, 0x37, 0x84, 0xe8, 0x46, 0x20, 0x04, 0x10, 0x04, 0x01, 0x02, 0x03, 0x42, 0x20, 0x60, 0x09, \n0x42, 0x21, 0x64, 0x09, 0xcb, 0x06, 0x46, 0x00, 0x30, 0x00, 0x46, 0x10, 0x04, 0x10, 0xd5, 0x05, \n0x46, 0x00, 0x10, 0x00, 0x46, 0x10, 0x04, 0x10, 0x40, 0x51, 0x00, 0x04, 0x14, 0x50, 0x82, 0x03, \n0xd5, 0x36, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x83, 0x08, 0xdd, 0x2f, \n0xd5, 0x31, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x83, 0xec, 0xdd, 0x2f, \n0xd5, 0x29, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x80, 0x90, 0xdd, 0x2f, \n0xd5, 0x21, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x86, 0x6c, 0xdd, 0x2f, \n0xd5, 0x19, 0x03, 0xe3, 0x00, 0x06, 0xa0, 0x72, 0x5c, 0xff, 0x00, 0x04, 0xe9, 0x12, 0xb4, 0x61, \n0x84, 0xa1, 0xdb, 0x0d, 0x9d, 0x0c, 0xb4, 0x44, 0x46, 0x00, 0x00, 0x0c, 0x96, 0x50, 0x10, 0x10, \n0x00, 0xec, 0xe6, 0x22, 0xe9, 0x04, 0x84, 0xa0, 0x10, 0x50, 0x00, 0xec, 0x84, 0x00, 0xd5, 0x02, \n0x84, 0x01, 0x93, 0x10, 0x54, 0x84, 0x00, 0x0f, 0x4e, 0x83, 0x00, 0x04, 0x80, 0x08, 0xd5, 0x51, \n0x47, 0xef, 0xff, 0x0f, 0x59, 0xef, 0x0f, 0xff, 0x40, 0x53, 0xf8, 0x02, 0x40, 0x84, 0x40, 0x08, \n0x40, 0x42, 0xa0, 0x04, 0x42, 0x72, 0x78, 0x09, 0x42, 0x73, 0xfc, 0x09, 0x46, 0x3f, 0xf0, 0xff, \n0x43, 0xe3, 0xf8, 0x08, 0x54, 0x20, 0x00, 0x0f, 0x58, 0x31, 0x8f, 0xff, 0x40, 0x1f, 0x0c, 0x02, \n0x40, 0x51, 0x50, 0x08, 0x46, 0x4c, 0x6f, 0xff, 0x40, 0x20, 0x94, 0x04, 0x46, 0xf0, 0x00, 0x0c, \n0x01, 0xe7, 0x80, 0xec, 0x58, 0x42, 0x0f, 0xff, 0x46, 0x31, 0x80, 0x00, 0x40, 0x71, 0x10, 0x02, \n0x40, 0x43, 0x8c, 0x04, 0x54, 0x5f, 0x00, 0x03, 0x40, 0x02, 0xe4, 0x08, 0x42, 0x22, 0x64, 0x09, \n0x42, 0x21, 0x68, 0x09, 0x40, 0x71, 0x00, 0x04, 0x42, 0x73, 0xbc, 0x09, 0x55, 0xe3, 0xbf, 0xff, \n0x5e, 0xff, 0x00, 0x08, 0xe8, 0x07, 0x40, 0x33, 0xb8, 0x09, 0x40, 0x31, 0xb8, 0x08, 0x58, 0x71, \n0x80, 0x08, 0x54, 0x43, 0xbf, 0xff, 0x84, 0x41, 0xad, 0x36, 0x10, 0x23, 0x00, 0x0f, 0xa9, 0xf4, \n0x80, 0x09, 0x80, 0x26, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8d, 0x5c, 0xdd, 0x2f, 0x84, 0x01, \n0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x44, 0x20, \n0x00, 0x14, 0x80, 0xc0, 0x80, 0xe1, 0x84, 0x20, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, \n0xdd, 0x2f, 0xa6, 0x70, 0xa6, 0xb4, 0xa6, 0x31, 0x84, 0x7e, 0x40, 0x40, 0x8c, 0x02, 0x92, 0x02, \n0x94, 0x02, 0x40, 0x51, 0x0c, 0x02, 0xaf, 0x30, 0xaf, 0x74, 0xae, 0x31, 0xa7, 0x37, 0x00, 0x33, \n0x80, 0x9d, 0x54, 0x21, 0x00, 0x02, 0xae, 0xf5, 0xa6, 0xf3, 0xa1, 0x7b, 0x00, 0x03, 0x80, 0x9e, \n0x54, 0x31, 0x80, 0x30, 0x98, 0x28, 0x96, 0x01, 0x40, 0x70, 0x20, 0x09, 0x54, 0x53, 0x80, 0x3f, \n0x92, 0x86, 0x95, 0x26, 0x40, 0x42, 0x14, 0x04, 0x58, 0x21, 0x00, 0x1c, 0x54, 0x50, 0x80, 0x08, \n0x58, 0x31, 0x80, 0x40, 0x84, 0x20, 0xaf, 0x70, 0xaf, 0x37, 0xae, 0xb4, 0xae, 0x72, 0xae, 0xf3, \n0xae, 0x36, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, \n0x44, 0x60, 0x00, 0x18, 0x10, 0x60, 0x00, 0x9e, 0x50, 0x60, 0x00, 0x24, 0x80, 0xe0, 0x84, 0x20, \n0x44, 0x20, 0x00, 0x18, 0x80, 0x06, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, \n0xa6, 0xf0, 0x00, 0x83, 0x00, 0x01, 0x44, 0x0f, 0xff, 0xd8, 0x40, 0x44, 0x00, 0x02, 0x54, 0x51, \n0x80, 0x03, 0x58, 0x22, 0x80, 0x08, 0x58, 0x12, 0x00, 0x01, 0x84, 0x60, 0x10, 0x33, 0x00, 0x16, \n0x10, 0x33, 0x00, 0x17, 0xae, 0xb0, 0xae, 0x71, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xf0, \n0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x84, 0xc3, 0x84, 0x46, 0x50, 0x03, 0x80, 0x28, 0x4b, 0xe0, \n0x20, 0x01, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0x74, 0x84, 0x46, 0x50, 0x03, 0x80, 0x2e, \n0x4b, 0xe0, 0x20, 0x01, 0xa0, 0x79, 0x50, 0x03, 0x80, 0x34, 0x84, 0x46, 0x4b, 0xe0, 0x20, 0x01, \n0x00, 0x03, 0x80, 0x94, 0xc0, 0x06, 0xa6, 0x71, 0x59, 0xe0, 0x80, 0x40, 0x11, 0xe3, 0x00, 0x01, \n0xa7, 0x31, 0x42, 0x22, 0x10, 0x09, 0xae, 0xb1, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x80, 0x20, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x84, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8c, 0x38, 0xdd, 0x2f, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, \n0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0x5c, 0x81, 0x00, 0x97, 0x90, 0x40, 0x90, \n0x80, 0x13, 0x80, 0x1f, 0x84, 0x20, 0x44, 0x20, 0x00, 0xa0, 0x04, 0x74, 0x00, 0x02, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xce, 0x13, 0x46, 0x30, 0x00, 0x0c, 0x58, 0x31, \n0x82, 0x84, 0x00, 0x41, 0x81, 0x70, 0xcc, 0x05, 0x80, 0x64, 0x44, 0x20, 0x00, 0xff, 0xd5, 0x0c, \n0x00, 0x01, 0x81, 0x71, 0xc0, 0x05, 0x50, 0x31, 0x81, 0x30, 0x80, 0x46, 0xd5, 0x05, 0x84, 0x60, \n0x44, 0x20, 0x00, 0xff, 0x80, 0x83, 0x87, 0xc1, 0x50, 0x53, 0x80, 0x0e, 0x50, 0x14, 0xff, 0xf2, \n0x80, 0x1f, 0x11, 0xef, 0x80, 0x9d, 0xf3, 0xa6, 0xb7, 0x1f, 0xf5, 0x82, 0xf1, 0x83, 0x10, 0x4f, \n0x80, 0x94, 0x10, 0x2f, 0x80, 0x9c, 0xf7, 0x81, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8f, 0x0c, \n0xdd, 0x2f, 0x00, 0x0f, 0x80, 0x9e, 0x50, 0x2f, 0x80, 0x24, 0x99, 0x50, 0x9d, 0xeb, 0x92, 0xe2, \n0x95, 0xfa, 0x9b, 0x3d, 0x10, 0x4f, 0x80, 0x9f, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xf0, \n0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x24, 0x84, 0x46, 0x80, 0x07, 0x4b, 0xe0, 0x20, 0x01, \n0xf1, 0x01, 0x9c, 0x3e, 0x8c, 0x2c, 0x84, 0x42, 0x4b, 0xe0, 0x20, 0x01, 0x00, 0x3f, 0x80, 0x9e, \n0x80, 0x3f, 0x50, 0x21, 0x80, 0x08, 0x50, 0x0f, 0x80, 0x10, 0x10, 0x2f, 0x80, 0x9e, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x8e, 0x88, 0xdd, 0x2f, 0x80, 0x1f, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x8f, 0xb0, 0xdd, 0x2f, 0x80, 0xdf, 0x84, 0x00, 0xec, 0xa4, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x17, 0x84, 0xd0, 0xc1, 0x06, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x84, 0xb0, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xbc, 0x85, 0x40, 0x14, 0xaf, 0x80, 0x0f, \n0x46, 0x60, 0x01, 0x02, 0x58, 0x63, 0x06, 0xa4, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x84, 0xc3, \n0x84, 0x46, 0x55, 0xc0, 0x00, 0xff, 0x50, 0x0f, 0x80, 0x2c, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x10, \n0x00, 0x0c, 0x58, 0x10, 0x85, 0x74, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x32, 0x4b, 0xe0, 0x18, 0x01, \n0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x38, 0x84, 0x42, 0x50, 0x0f, 0x80, 0x38, 0x4b, 0xe0, \n0x18, 0x01, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x89, 0x60, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0c, \n0x58, 0x00, 0x02, 0x64, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x78, 0xdd, 0x2f, 0x81, 0x00, \n0x44, 0x00, 0x06, 0x00, 0x04, 0x94, 0x00, 0x02, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0x9c, \n0xdd, 0x2f, 0x80, 0xe0, 0xc8, 0x0d, 0x80, 0x28, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0xbc, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0xdd, 0x50, 0x64, \n0x85, 0x6a, 0x80, 0x2a, 0x44, 0x20, 0x04, 0x00, 0x80, 0x09, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x87, 0x08, 0xdd, 0x2f, 0xa6, 0x35, 0x85, 0x41, 0x58, 0x30, 0x00, 0x08, 0x84, 0xa3, 0x84, 0x9e, \n0x10, 0xa3, 0x00, 0x00, 0xaf, 0x71, 0xaf, 0x34, 0xae, 0xf5, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x07, \n0x84, 0xc1, 0x84, 0x46, 0xa6, 0x76, 0x4c, 0x01, 0x40, 0x09, 0x41, 0xe0, 0x8c, 0x09, 0x41, 0xef, \n0x0c, 0x08, 0x58, 0x1f, 0x00, 0x02, 0xd5, 0x05, 0x92, 0x23, 0x94, 0x4b, 0x58, 0x10, 0x80, 0x01, \n0xae, 0x76, 0xa6, 0x35, 0xa6, 0x76, 0x54, 0x4e, 0x00, 0x01, 0x43, 0xe0, 0x8c, 0x09, 0x94, 0xa3, \n0x40, 0xaf, 0x08, 0x04, 0x58, 0x50, 0x00, 0x05, 0x84, 0x80, 0x45, 0xc0, 0x00, 0x5f, 0x10, 0xa3, \n0x00, 0x06, 0xaf, 0x75, 0xaf, 0x32, 0x11, 0xc3, 0x00, 0x03, 0x50, 0x03, 0x00, 0x09, 0x46, 0x10, \n0x00, 0x0c, 0x58, 0x10, 0x84, 0xea, 0x84, 0x48, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xf0, \n0xdd, 0x2f, 0x46, 0x30, 0x00, 0x0c, 0x58, 0x31, 0x84, 0xf1, 0x00, 0xa1, 0x80, 0x00, 0x50, 0x55, \n0x00, 0x01, 0x55, 0xc2, 0x80, 0xff, 0x11, 0xc1, 0x80, 0x00, 0x9e, 0xd9, 0x4f, 0xc3, 0x00, 0x08, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x04, 0xe9, 0x4c, 0x30, 0x7f, 0xf1, 0xa7, 0x72, 0x01, 0xc3, \n0x00, 0x03, 0x40, 0x42, 0xa0, 0x08, 0x41, 0xe2, 0x70, 0x04, 0x50, 0x2f, 0x00, 0x04, 0x50, 0x1f, \n0x80, 0x3c, 0x80, 0x66, 0x84, 0x9f, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x84, 0x3c, \n0xdd, 0x2f, 0x46, 0x30, 0x01, 0x02, 0x58, 0x31, 0x87, 0x08, 0xf3, 0x81, 0x51, 0xcf, 0x80, 0x1c, \n0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x80, 0x1c, 0x46, 0xa0, 0x00, 0x0c, 0x58, 0xa5, 0x02, 0x84, \n0xdd, 0x23, 0x00, 0x25, 0x02, 0x3d, 0x84, 0x26, 0xf3, 0x01, 0x4c, 0x20, 0xc0, 0x21, 0x50, 0x0f, \n0x80, 0x08, 0x84, 0x20, 0x44, 0x20, 0x00, 0x14, 0xdd, 0x23, 0xf3, 0x0f, 0x50, 0x05, 0x00, 0xd0, \n0x80, 0x47, 0x50, 0x4f, 0x80, 0x08, 0x44, 0x50, 0x00, 0x14, 0x9e, 0x6c, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x81, 0x54, 0xdd, 0x2f, 0x80, 0x1c, 0x50, 0x1f, 0x80, 0x08, 0x44, 0x20, 0x00, 0x10, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xd5, 0x0d, 0x8c, 0x2a, 0xf3, 0x0f, \n0x50, 0x05, 0x00, 0xd0, 0x80, 0x9c, 0x80, 0x47, 0x80, 0xa1, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x80, 0x10, 0xdd, 0x2f, 0x46, 0xa0, 0x01, 0x02, 0x58, 0xa5, 0x06, 0xf0, 0x50, 0x1f, 0x80, 0x1c, \n0x44, 0x20, 0x00, 0x10, 0x50, 0x03, 0x00, 0x51, 0x4b, 0xe0, 0x28, 0x01, 0xa6, 0x72, 0xa6, 0x33, \n0x40, 0x60, 0xa0, 0x08, 0x40, 0x63, 0x00, 0x04, 0x50, 0x1f, 0x80, 0x2c, 0x84, 0x4e, 0x80, 0x09, \n0x4b, 0xe0, 0x28, 0x01, 0x50, 0x23, 0x00, 0x12, 0x96, 0x51, 0x80, 0x08, 0x84, 0x40, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x8f, 0xd4, 0xdd, 0x2f, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x81, 0xb0, 0xdd, 0x2f, 0xec, 0x44, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0xc2, 0x17, 0xc0, 0x04, 0xa6, 0xc1, 0x96, 0x1c, 0xc8, 0x13, 0xa6, 0x11, 0x54, 0x20, \n0x00, 0x03, 0xca, 0x0f, 0x54, 0x40, 0x00, 0x04, 0x96, 0x20, 0xc0, 0x0c, 0xa7, 0x49, 0x54, 0x12, \n0x80, 0x03, 0x5c, 0x00, 0x80, 0x01, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x80, 0xe4, 0xdd, 0x2f, \n0x84, 0x01, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0xdc, 0x81, 0x20, 0xa4, 0x06, 0x5c, 0xf0, 0x00, 0x39, 0xe9, 0x3f, 0x04, 0x84, 0x80, 0x02, \n0x50, 0x64, 0x00, 0x04, 0xa6, 0xb7, 0x50, 0x74, 0x00, 0x20, 0x40, 0x41, 0x18, 0x09, 0x46, 0xf0, \n0x00, 0x0c, 0x10, 0x47, 0x84, 0xe9, 0x80, 0x26, 0x80, 0x07, 0x80, 0x48, 0x46, 0xf0, 0x00, 0x02, \n0x58, 0xf7, 0x83, 0x3c, 0xdd, 0x2f, 0x84, 0xa1, 0xd0, 0x28, 0x50, 0x3f, 0x80, 0x04, 0xb7, 0x03, \n0x14, 0x91, 0x80, 0x03, 0xa9, 0x99, 0xa9, 0xda, 0xa9, 0xdc, 0x84, 0x80, 0xa6, 0x73, 0x01, 0xe3, \n0x00, 0x02, 0x54, 0x00, 0x80, 0x3f, 0x40, 0x50, 0x20, 0x08, 0x40, 0x22, 0xf8, 0x04, 0x12, 0x21, \n0x80, 0x0a, 0x12, 0x41, 0x80, 0x0b, 0x87, 0xc2, 0xa6, 0x78, 0x40, 0x00, 0x88, 0x09, 0x54, 0x50, \n0x00, 0x03, 0x4c, 0x5f, 0x00, 0x03, 0xd5, 0x07, 0x80, 0x03, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x80, 0xc0, 0xdd, 0x2f, 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x24, 0x3a, 0x6f, 0xa4, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x84, 0x60, 0xd5, 0x0e, 0x38, 0x50, 0x0c, 0x00, 0x38, 0x40, 0x8c, 0x00, \n0x9c, 0xd9, 0xe2, 0x85, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x08, 0xe2, 0xa4, 0xe8, 0x03, 0x84, 0x02, \n0xd5, 0x04, 0xe2, 0x62, 0xe9, 0xf2, 0x84, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x2f, 0x94, 0x3c, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x81, 0x20, 0x50, 0x0f, 0x80, 0x20, 0xf0, 0x81, 0x80, 0xe1, \n0x84, 0xc0, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xa4, 0xf2, 0x01, 0x84, 0xbf, 0x9d, 0x14, \n0xf4, 0x81, 0x40, 0x04, 0x98, 0x00, 0xb4, 0x62, 0x9c, 0x64, 0x80, 0x43, 0xd3, 0x07, 0xf1, 0x81, \n0x99, 0xb3, 0xb4, 0x24, 0x4b, 0xe0, 0x20, 0x01, 0xd5, 0xf1, 0x80, 0x06, 0xb6, 0xc7, 0xec, 0x0c, \n0x3a, 0x6f, 0xa4, 0x84, 0xec, 0x10, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x20, \n0x44, 0x20, 0x00, 0x14, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x04, 0xd0, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x80, 0xc0, 0xa0, 0x02, 0xa6, 0xc0, 0x40, 0x21, 0x90, 0x09, \n0x54, 0x11, 0x00, 0x04, 0x4e, 0x13, 0x01, 0x29, 0xa7, 0x41, 0x54, 0x42, 0x80, 0x40, 0xc4, 0x08, \n0xb5, 0x26, 0x00, 0x84, 0x80, 0x02, 0x54, 0x74, 0x00, 0x01, 0x4e, 0x72, 0x01, 0x1e, 0x9c, 0x04, \n0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xd4, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x44, \n0x84, 0x46, 0x4b, 0xe0, 0x1c, 0x01, 0xc8, 0x03, 0x84, 0xe3, 0xd5, 0x16, 0xa0, 0x32, 0x46, 0x10, \n0x00, 0x0c, 0x58, 0x10, 0x85, 0x74, 0x9c, 0x04, 0x84, 0x46, 0x4b, 0xe0, 0x1c, 0x01, 0xc8, 0x03, \n0x84, 0xe1, 0xd5, 0x0a, 0xa0, 0xf2, 0x84, 0x22, 0xa6, 0x9c, 0x55, 0xe1, 0x00, 0x01, 0x40, 0x7f, \n0x78, 0x1a, 0x40, 0x70, 0xf8, 0x1b, 0x02, 0x03, 0x00, 0x0a, 0x05, 0xe3, 0x00, 0x04, 0x50, 0x90, \n0x7f, 0xe8, 0x50, 0x2f, 0x00, 0x18, 0x12, 0x93, 0x00, 0x0a, 0xa8, 0xb4, 0x04, 0x83, 0x00, 0x02, \n0x00, 0x54, 0x00, 0x00, 0x40, 0x42, 0x90, 0x09, 0x54, 0x02, 0x00, 0x08, 0xc0, 0x1e, 0x02, 0x33, \n0x00, 0x0b, 0x58, 0x11, 0x80, 0x40, 0x96, 0x49, 0x12, 0x13, 0x00, 0x0b, 0xa6, 0x10, 0x96, 0x82, \n0x4e, 0x24, 0x00, 0x06, 0x58, 0x40, 0x80, 0x02, 0x12, 0x43, 0x00, 0x0b, 0x05, 0xe3, 0x00, 0x04, \n0x02, 0x93, 0x00, 0x0a, 0x50, 0x8f, 0x00, 0x02, 0x50, 0x54, 0xff, 0xfe, 0x14, 0x83, 0x00, 0x04, \n0x12, 0x53, 0x00, 0x0a, 0x54, 0x00, 0x00, 0x0f, 0x10, 0x03, 0x00, 0x18, 0xb4, 0x26, 0xa6, 0x89, \n0x54, 0x01, 0x00, 0x10, 0xc0, 0x12, 0x03, 0xe3, 0x00, 0x0b, 0x04, 0x93, 0x00, 0x04, 0x02, 0x83, \n0x00, 0x0a, 0x58, 0x5f, 0x00, 0x08, 0x50, 0x44, 0x80, 0x04, 0x50, 0x34, 0x7f, 0xfc, 0x12, 0x53, \n0x00, 0x0b, 0xa9, 0x34, 0x12, 0x33, 0x00, 0x0a, 0xb4, 0x26, 0xa6, 0x89, 0x54, 0x01, 0x00, 0x40, \n0xc0, 0x0a, 0x02, 0x83, 0x00, 0x0b, 0xa1, 0x74, 0x58, 0x44, 0x00, 0x10, 0x9c, 0xea, 0x12, 0x43, \n0x00, 0x0b, 0xa8, 0xf4, 0xa0, 0x34, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xd4, 0x46, 0x10, \n0x00, 0x09, 0x58, 0x10, 0x84, 0x24, 0x84, 0x46, 0x4b, 0xe0, 0x20, 0x01, 0xc0, 0x0b, 0xa0, 0x34, \n0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x2c, 0x84, 0x46, 0x4b, 0xe0, 0x20, 0x01, 0x4e, 0x03, \n0x00, 0x8c, 0xa1, 0x34, 0x02, 0x33, 0x00, 0x0a, 0x9c, 0x66, 0x51, 0xe1, 0xff, 0xfa, 0xa8, 0x74, \n0x50, 0x8f, 0x80, 0x04, 0x13, 0xe3, 0x00, 0x0a, 0x84, 0x42, 0x80, 0x08, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x86, 0xf0, 0xdd, 0x2f, 0xa0, 0x74, 0x02, 0x03, 0x00, 0x0a, 0x9c, 0x8a, 0x50, 0x90, \n0x7f, 0xfe, 0xa8, 0xb4, 0x12, 0x93, 0x00, 0x0a, 0x80, 0x08, 0x46, 0x90, 0x01, 0x02, 0x58, 0x94, \n0x86, 0xd4, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x34, 0x84, 0x42, 0x4b, 0xe0, 0x24, 0x01, \n0xc0, 0x63, 0x80, 0x08, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x3c, 0x84, 0x42, 0x4b, 0xe0, \n0x24, 0x01, 0xc8, 0x35, 0x84, 0x22, 0x4c, 0x70, 0x80, 0x33, 0xa0, 0xb4, 0x01, 0xe1, 0x00, 0x00, \n0x54, 0x5f, 0x00, 0x0f, 0x40, 0x32, 0x84, 0x0c, 0xe6, 0x79, 0xe8, 0x4e, 0x00, 0x11, 0x00, 0x09, \n0x44, 0x50, 0x00, 0x11, 0xd9, 0x09, 0x99, 0x53, 0xa6, 0xec, 0xa6, 0xad, 0x40, 0x01, 0xa0, 0x08, \n0x40, 0x00, 0x08, 0x04, 0xd5, 0x03, 0x84, 0xa6, 0xd9, 0x3f, 0x84, 0x81, 0x4c, 0x72, 0x40, 0x06, \n0x84, 0x46, 0x4c, 0x11, 0x40, 0x06, 0xd5, 0x38, 0x84, 0x63, 0x4c, 0x71, 0xc0, 0x36, 0x44, 0x50, \n0x00, 0x11, 0xd9, 0x32, 0x44, 0x10, 0x00, 0x6e, 0x4c, 0x00, 0xc0, 0x2f, 0x80, 0x06, 0x84, 0x21, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x85, 0x80, 0xdd, 0x2f, 0xd5, 0x26, 0x50, 0x8f, 0x80, 0x04, \n0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xd4, 0x80, 0x08, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, \n0x84, 0x40, 0x84, 0x42, 0x4b, 0xe0, 0x1c, 0x01, 0xc0, 0x17, 0x80, 0x08, 0x46, 0x10, 0x00, 0x09, \n0x58, 0x10, 0x84, 0x38, 0x84, 0x42, 0x4b, 0xe0, 0x1c, 0x01, 0xc8, 0x0e, 0xa0, 0x34, 0x84, 0xa3, \n0x01, 0xe0, 0x00, 0x01, 0x4d, 0xe2, 0xc0, 0x09, 0x02, 0x13, 0x00, 0x0a, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x8e, 0x30, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x50, 0x00, 0x0c, 0x58, 0x52, 0x85, 0xd4, 0x46, 0xf0, \n0x00, 0x09, 0x14, 0x57, 0x81, 0x5c, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x84, 0x88, 0xdd, 0x2f, \n0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x64, 0xb4, 0x60, 0xb6, 0x60, 0xa0, 0x81, 0xa8, 0x81, \n0xa0, 0x42, 0xa8, 0x42, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x84, 0xcc, 0xdd, 0x2f, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x84, 0xf0, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x40, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x82, 0x98, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, \n0xfc, 0x84, 0xdd, 0x9e, 0xc8, 0x02, 0xd5, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x78, 0x96, 0x40, 0x96, 0x8c, \n0xc2, 0x07, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x3c, 0x84, 0x01, 0xd5, 0x69, 0x54, 0x30, \n0x80, 0x02, 0xc3, 0x07, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x3d, 0x84, 0x02, 0xd5, 0x60, \n0x40, 0x60, 0x40, 0x09, 0x96, 0x70, 0x54, 0x50, 0x80, 0x02, 0xc5, 0x08, 0x46, 0xf0, 0x00, 0x0c, \n0x04, 0x67, 0x80, 0x4d, 0x44, 0x02, 0x00, 0x00, 0xd5, 0x53, 0x96, 0x8c, 0xc2, 0x08, 0x46, 0xf0, \n0x00, 0x0c, 0x04, 0x67, 0x80, 0x4c, 0x44, 0x01, 0x00, 0x00, 0xd5, 0x4a, 0x40, 0x60, 0x60, 0x09, \n0x96, 0x74, 0xc1, 0x08, 0x46, 0x00, 0x10, 0x00, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x54, \n0xd5, 0x3f, 0x54, 0x43, 0x00, 0x02, 0xc4, 0x08, 0x46, 0x00, 0x20, 0x00, 0x46, 0xf0, 0x00, 0x0c, \n0x04, 0x67, 0x80, 0x55, 0xd5, 0x35, 0x55, 0xe3, 0x00, 0x04, 0x4f, 0xe2, 0x00, 0x09, 0x46, 0x00, \n0x40, 0x00, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x56, 0xd5, 0x2a, 0x54, 0x13, 0x00, 0x10, \n0xc1, 0x08, 0x46, 0x01, 0x00, 0x00, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x58, 0xd5, 0x20, \n0x54, 0x43, 0x00, 0x20, 0xc4, 0x08, 0x46, 0x02, 0x00, 0x00, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, \n0x80, 0x59, 0xd5, 0x16, 0x55, 0xe3, 0x00, 0x40, 0x4f, 0xe2, 0x00, 0x09, 0x46, 0x04, 0x00, 0x00, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x5a, 0xd5, 0x0b, 0x54, 0x63, 0x00, 0x80, 0x97, 0xb0, \n0xc6, 0x07, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x67, 0x80, 0x5b, 0x46, 0x08, 0x00, 0x00, 0x46, 0x30, \n0x04, 0x10, 0x58, 0x31, 0x88, 0x00, 0x14, 0x01, 0x80, 0x78, 0x84, 0x20, 0x40, 0x00, 0x98, 0x06, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x87, 0x84, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, \n0x02, 0x84, 0xdd, 0x26, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x80, 0xc0, 0x5c, 0x00, 0x00, 0x20, 0x80, 0xe1, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x87, 0x84, 0xdd, 0x2f, 0x46, 0x50, 0x00, 0x0c, 0x58, 0x52, 0x80, 0xf0, 0x38, 0x72, 0x9a, 0x0a, \n0x46, 0x10, 0x04, 0x10, 0x58, 0x10, 0x88, 0x00, 0x04, 0x30, 0x80, 0x78, 0x84, 0x81, 0x40, 0x62, \n0x18, 0x0c, 0x40, 0x23, 0x0c, 0x04, 0x14, 0x20, 0x80, 0x78, 0x04, 0x00, 0x80, 0x7a, 0x40, 0x63, \n0x00, 0x04, 0x14, 0x60, 0x80, 0x7a, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x44, 0x40, 0x00, 0x40, 0x84, 0xa0, 0xf5, 0x81, 0x46, 0x10, \n0x04, 0x10, 0x10, 0x4f, 0x80, 0x04, 0x10, 0x4f, 0x80, 0x07, 0x58, 0x10, 0x88, 0x00, 0xb4, 0x61, \n0x50, 0x60, 0x00, 0x9c, 0x58, 0x01, 0x80, 0x02, 0xb6, 0x01, 0x80, 0x01, 0xf2, 0x01, 0x14, 0x20, \n0x80, 0x71, 0x04, 0x70, 0x00, 0x71, 0x42, 0x93, 0x8c, 0x0b, 0xf7, 0x81, 0x81, 0x01, 0x4e, 0x93, \n0xff, 0xfa, 0x42, 0x73, 0x84, 0x0b, 0xcf, 0xf6, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, 0x80, 0xf0, \n0x50, 0x13, 0x7f, 0x64, 0x50, 0x23, 0x7f, 0xe4, 0x50, 0x04, 0x01, 0xa0, 0x84, 0x62, 0x4b, 0xe0, \n0x24, 0x01, 0x46, 0x00, 0x04, 0x10, 0x50, 0x13, 0x7f, 0x84, 0x50, 0x23, 0x7f, 0xec, 0x58, 0x00, \n0x09, 0xb0, 0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x46, 0x00, 0x04, 0x10, 0x46, 0x90, 0x00, 0x03, \n0x58, 0x94, 0x80, 0xa4, 0x50, 0x13, 0x7f, 0xa4, 0x50, 0x23, 0x7f, 0xf4, 0x58, 0x00, 0x09, 0x80, \n0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x46, 0x00, 0x04, 0x10, 0x50, 0x13, 0x7f, 0xc4, 0x9e, 0xb4, \n0x58, 0x00, 0x09, 0x90, 0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x84, 0x61, 0xaf, 0xf5, 0xaf, 0xf4, \n0x10, 0x34, 0x01, 0xa8, 0x10, 0x34, 0x01, 0xb8, 0x14, 0x73, 0x00, 0x09, 0xaf, 0xf7, 0xaf, 0xf6, \n0xa9, 0xf4, 0xa9, 0xf5, 0xa9, 0xf2, 0xa9, 0xf3, 0x50, 0x03, 0x00, 0x1c, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x81, 0x6c, 0xdd, 0x2f, 0x04, 0x04, 0x00, 0x71, 0x58, 0x20, 0x00, 0x05, 0xf0, 0x81, \n0x10, 0x2f, 0x80, 0x04, 0xf1, 0x01, 0x14, 0x14, 0x00, 0x71, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x42, 0x11, 0x40, 0x08, 0x14, 0x10, 0x00, 0x2d, \n0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x42, 0x11, 0x44, 0x08, 0x14, 0x10, 0x00, 0x2d, \n0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x58, 0x11, 0x00, 0x01, 0x14, 0x10, 0x00, 0x2d, \n0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x58, 0x11, 0x00, 0x02, 0x14, 0x10, 0x00, 0x2d, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x3c, 0xef, 0xf4, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, \n0x08, 0x00, 0x50, 0x10, 0x00, 0x80, 0x85, 0x20, 0x04, 0x40, 0x00, 0x43, 0x40, 0x32, 0x40, 0x09, \n0x54, 0x31, 0x80, 0x0f, 0x80, 0x40, 0xc3, 0x64, 0x84, 0x40, 0x97, 0x5c, 0xc5, 0x5c, 0x54, 0x61, \n0x00, 0x03, 0x14, 0x60, 0x00, 0x43, 0x84, 0xc0, 0x04, 0x80, 0x00, 0x43, 0x40, 0x44, 0x20, 0x09, \n0x54, 0x42, 0x00, 0x7f, 0x40, 0x72, 0x20, 0x08, 0x40, 0x53, 0x90, 0x04, 0x14, 0x50, 0x00, 0x1d, \n0x44, 0x7f, 0xff, 0xc7, 0x04, 0xa0, 0x80, 0x02, 0xb5, 0x01, 0x14, 0xaf, 0x80, 0x01, 0x8d, 0x04, \n0x00, 0xaf, 0x80, 0x07, 0x80, 0xa4, 0x40, 0xa5, 0x1c, 0x02, 0x58, 0xa5, 0x00, 0x20, 0x10, 0xaf, \n0x80, 0x07, 0x54, 0x74, 0x00, 0x7f, 0x40, 0xa4, 0x1c, 0x09, 0x40, 0x74, 0x9c, 0x06, 0x04, 0x8f, \n0x80, 0x01, 0x88, 0xea, 0x14, 0x80, 0x80, 0x02, 0x50, 0x83, 0xff, 0xff, 0xd5, 0x08, 0x14, 0xa0, \n0x00, 0x1b, 0x9d, 0xb1, 0x04, 0xa0, 0x00, 0x1b, 0x54, 0x55, 0x00, 0x7f, 0x40, 0xa2, 0xa0, 0x08, \n0xe2, 0xc8, 0xe9, 0xf6, 0x54, 0x63, 0x80, 0x7f, 0x40, 0x63, 0x20, 0x08, 0x40, 0x52, 0xc0, 0x08, \n0x58, 0x73, 0x00, 0x02, 0x58, 0x63, 0x00, 0x18, 0x40, 0x73, 0x94, 0x04, 0x40, 0x53, 0x14, 0x04, \n0x46, 0x68, 0x0f, 0xff, 0x58, 0x63, 0x0f, 0xff, 0x40, 0x42, 0x60, 0x08, 0x40, 0x52, 0x98, 0x02, \n0x40, 0x73, 0x98, 0x02, 0x40, 0x73, 0x90, 0x04, 0x40, 0x42, 0x90, 0x04, 0x14, 0x40, 0x00, 0x44, \n0x14, 0x70, 0x00, 0x45, 0x9c, 0x91, 0x84, 0xa4, 0xd2, 0x98, 0x92, 0x61, 0xd5, 0x9f, 0x46, 0x00, \n0x20, 0x00, 0x14, 0x01, 0x00, 0x78, 0xec, 0x0c, 0x3a, 0x6f, 0xa8, 0x04, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa8, 0x3c, 0xef, 0xf4, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x08, 0x00, 0x50, 0x10, \n0x00, 0x80, 0x85, 0x20, 0x04, 0x40, 0x00, 0x40, 0x40, 0x32, 0x40, 0x09, 0x54, 0x31, 0x80, 0x0f, \n0x80, 0x40, 0xc3, 0x6a, 0x84, 0x40, 0x97, 0x5c, 0xc5, 0x62, 0x54, 0x61, 0x00, 0x03, 0x14, 0x60, \n0x00, 0x40, 0x84, 0xc0, 0x04, 0x80, 0x00, 0x40, 0x40, 0x44, 0x20, 0x09, 0x54, 0x42, 0x00, 0x7f, \n0x40, 0x72, 0x20, 0x08, 0x40, 0x53, 0x90, 0x04, 0x14, 0x50, 0x00, 0x1d, 0x44, 0x7f, 0xff, 0xc7, \n0x04, 0xa0, 0x80, 0x02, 0xb5, 0x01, 0x14, 0xaf, 0x80, 0x01, 0x8d, 0x04, 0x00, 0xaf, 0x80, 0x07, \n0x80, 0xa4, 0x40, 0xa5, 0x1c, 0x02, 0x58, 0xa5, 0x00, 0x28, 0x10, 0xaf, 0x80, 0x07, 0x54, 0x74, \n0x00, 0x7f, 0x40, 0xa4, 0x1c, 0x09, 0x40, 0x74, 0x9c, 0x06, 0x04, 0x8f, 0x80, 0x01, 0x88, 0xea, \n0x14, 0x80, 0x80, 0x02, 0x50, 0x83, 0xff, 0xff, 0xd5, 0x08, 0x14, 0xa0, 0x00, 0x1b, 0x9d, 0xb1, \n0x04, 0xa0, 0x00, 0x1b, 0x54, 0x55, 0x00, 0x7f, 0x40, 0xa2, 0xa0, 0x08, 0xe2, 0xc8, 0xe9, 0xf6, \n0x00, 0x8f, 0x80, 0x07, 0x54, 0x63, 0x80, 0x7f, 0x40, 0x74, 0x04, 0x09, 0x40, 0x63, 0x20, 0x08, \n0x54, 0x73, 0x80, 0x03, 0x40, 0x82, 0xc0, 0x08, 0x40, 0x73, 0x98, 0x04, 0x40, 0x53, 0xa0, 0x04, \n0x58, 0x63, 0x00, 0x02, 0x46, 0x78, 0x0f, 0xff, 0x40, 0x63, 0x20, 0x04, 0x58, 0x73, 0x8f, 0xff, \n0x40, 0x82, 0x60, 0x08, 0x40, 0x52, 0x9c, 0x02, 0x40, 0x63, 0x1c, 0x02, 0x40, 0x63, 0x20, 0x04, \n0x40, 0x42, 0xa0, 0x04, 0x14, 0x40, 0x00, 0x41, 0x14, 0x60, 0x00, 0x42, 0x9c, 0x91, 0x84, 0xa4, \n0xd2, 0x92, 0x92, 0x61, 0xd5, 0x99, 0x46, 0x00, 0x10, 0x00, 0x14, 0x01, 0x00, 0x78, 0xec, 0x0c, \n0x3a, 0x6f, 0xa8, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0x3c, 0x04, 0x50, 0x00, 0x29, \n0x04, 0x30, 0x00, 0x2a, 0x9d, 0x2a, 0x9a, 0xa3, 0xe4, 0x42, 0x4e, 0xf3, 0x00, 0x85, 0x00, 0x30, \n0x00, 0xa2, 0x9c, 0x9c, 0x40, 0x81, 0x10, 0x08, 0x40, 0x20, 0x20, 0x00, 0xa7, 0xd7, 0x54, 0x63, \n0x80, 0x80, 0xc6, 0x79, 0xb5, 0x01, 0x50, 0x41, 0x80, 0x24, 0x38, 0x80, 0x12, 0x0a, 0x00, 0x70, \n0x80, 0x9f, 0x00, 0x50, 0x80, 0x9e, 0xa1, 0x0b, 0x99, 0xbd, 0x50, 0x73, 0x00, 0x14, 0x50, 0x50, \n0x80, 0x10, 0x02, 0x81, 0x00, 0x03, 0x95, 0x9c, 0xc4, 0x22, 0x93, 0x0e, 0x40, 0x84, 0x38, 0x08, \n0x40, 0x74, 0x1c, 0x04, 0xad, 0xd3, 0xb6, 0xa2, 0xa7, 0x17, 0x42, 0x42, 0x18, 0x09, 0xaf, 0x17, \n0x99, 0x86, 0xa1, 0x4a, 0x14, 0x53, 0x00, 0x12, 0xa1, 0x0b, 0xa4, 0x52, 0x54, 0x42, 0x3f, 0xff, \n0x92, 0x2e, 0x40, 0x10, 0xb8, 0x08, 0x40, 0x50, 0x90, 0x04, 0xad, 0x52, 0xa7, 0x17, 0xa6, 0x55, \n0x54, 0x52, 0x00, 0x7f, 0x58, 0x10, 0x80, 0x40, 0xaf, 0x57, 0xd5, 0x1b, 0x93, 0x0e, 0x40, 0x84, \n0x38, 0x08, 0x40, 0x74, 0x1c, 0x04, 0xad, 0xd3, 0x99, 0x86, 0xa6, 0x57, 0xb6, 0xa2, 0x58, 0x10, \n0x80, 0x40, 0xae, 0x57, 0x14, 0x43, 0x00, 0x12, 0xa4, 0x52, 0xa7, 0x17, 0x92, 0x2e, 0x40, 0x10, \n0xb8, 0x08, 0xac, 0x52, 0x54, 0x42, 0x00, 0x7f, 0xa6, 0x55, 0xaf, 0x17, 0x42, 0x10, 0x98, 0x09, \n0x95, 0x1c, 0xae, 0x55, 0x98, 0x44, 0x50, 0x10, 0x80, 0x48, 0xa6, 0x8e, 0x44, 0x5f, 0xff, 0xcf, \n0x40, 0x41, 0x14, 0x02, 0x58, 0x22, 0x00, 0x08, 0x9c, 0xdc, 0x84, 0x84, 0xaf, 0x0f, 0xae, 0x8e, \n0x40, 0x51, 0x90, 0x0c, 0x99, 0x05, 0xa4, 0xa3, 0xb4, 0x61, 0x54, 0x51, 0x3f, 0xff, 0x99, 0x1d, \n0xad, 0x0a, 0x46, 0x40, 0x04, 0x10, 0x00, 0x20, 0x00, 0xa2, 0x04, 0x50, 0x00, 0x2a, 0x9c, 0x51, \n0x96, 0x8c, 0x9c, 0xe9, 0x58, 0x42, 0x08, 0x00, 0x14, 0x30, 0x00, 0x2a, 0x10, 0x20, 0x00, 0xa2, \n0x10, 0x22, 0x01, 0x88, 0x3a, 0x6f, 0xa0, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x04, 0x50, 0x00, 0x2b, \n0x04, 0x30, 0x00, 0x2c, 0x9d, 0x2a, 0x9a, 0xa3, 0xe4, 0x42, 0xe9, 0x3e, 0x00, 0x30, 0x00, 0xa3, \n0x9d, 0x1e, 0x94, 0xa4, 0x98, 0x82, 0xa7, 0x57, 0x54, 0x42, 0x80, 0x80, 0xc4, 0x35, 0x50, 0x51, \n0x80, 0x26, 0x38, 0x10, 0x16, 0x0a, 0x94, 0xdc, 0xa1, 0x0a, 0x98, 0xc3, 0xb6, 0x82, 0xa1, 0x4c, \n0x14, 0x51, 0x80, 0x1b, 0xa5, 0x0e, 0xa4, 0xd3, 0x54, 0x42, 0x3f, 0xff, 0x92, 0x6e, 0x40, 0x31, \n0xb8, 0x08, 0x40, 0x51, 0x90, 0x04, 0xad, 0x53, 0xa7, 0x55, 0x00, 0x40, 0x80, 0x0f, 0xa6, 0xd7, \n0x96, 0x64, 0x95, 0x0e, 0x54, 0x11, 0x80, 0x3f, 0x40, 0x30, 0x90, 0x04, 0x54, 0x12, 0x80, 0x7f, \n0xae, 0xd7, 0xae, 0x55, 0x46, 0x10, 0x04, 0x10, 0x00, 0x50, 0x00, 0xa3, 0x04, 0x40, 0x00, 0x2c, \n0x9c, 0xa9, 0x97, 0x54, 0x9c, 0xe1, 0x58, 0x10, 0x88, 0x00, 0x14, 0x30, 0x00, 0x2c, 0x10, 0x50, \n0x00, 0xa3, 0x10, 0x50, 0x81, 0x98, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x85, 0x20, \n0x80, 0xc0, 0x46, 0x80, 0x00, 0x00, 0x58, 0x84, 0x02, 0xbc, 0xd5, 0x22, 0xa7, 0x1f, 0x54, 0x22, \n0x00, 0x80, 0xc2, 0x30, 0x38, 0x23, 0x06, 0x02, 0x38, 0x93, 0x06, 0x0a, 0x80, 0x22, 0x00, 0x31, \n0x00, 0x14, 0xcb, 0x02, 0xd5, 0x05, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x4b, 0xe0, \n0x20, 0x01, 0x9c, 0x3e, 0x94, 0xc4, 0x99, 0xf3, 0xa6, 0xbf, 0x44, 0x4f, 0xff, 0xc0, 0x40, 0x51, \n0x10, 0x04, 0xaf, 0x7f, 0x04, 0x13, 0x00, 0x2b, 0x9c, 0x09, 0x14, 0x03, 0x00, 0x2b, 0x04, 0x23, \n0x00, 0x2b, 0x04, 0x53, 0x00, 0x2c, 0x97, 0xd4, 0x9c, 0x7e, 0x95, 0x0c, 0x41, 0xe2, 0x88, 0x01, \n0x50, 0x13, 0x80, 0x26, 0x98, 0xf4, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x74, 0x4f, 0xe6, \n0xff, 0xcf, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0xfc, 0x85, 0x20, 0x80, 0xc0, 0x46, 0x80, 0x00, 0x00, 0x58, 0x84, 0x02, 0xbc, 0xd5, 0x1a, \n0xa6, 0xff, 0x54, 0x11, 0x80, 0x80, 0xc1, 0x28, 0x38, 0x13, 0x0a, 0x02, 0x38, 0x93, 0x0a, 0x0a, \n0x4b, 0xe0, 0x20, 0x01, 0xa6, 0x7f, 0xa6, 0xfd, 0x44, 0x0f, 0xff, 0xc0, 0x40, 0x50, 0x80, 0x04, \n0x58, 0x41, 0x80, 0x40, 0xaf, 0x7f, 0xaf, 0x3d, 0x04, 0x23, 0x00, 0x29, 0x9c, 0x11, 0x14, 0x03, \n0x00, 0x29, 0x04, 0x43, 0x00, 0x29, 0x04, 0x53, 0x00, 0x2a, 0x96, 0x64, 0x9c, 0xcc, 0x95, 0xdc, \n0x41, 0xe2, 0x90, 0x01, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x50, 0x20, 0x80, 0x24, \n0x99, 0xf7, 0x4f, 0xe6, 0xff, 0xd7, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x83, 0x80, 0x50, 0x00, 0x00, 0xb8, 0x46, 0x40, 0x04, 0x10, \n0xf0, 0x81, 0x58, 0x42, 0x08, 0x00, 0x00, 0x7e, 0x00, 0xa1, 0x00, 0x12, 0x01, 0xbc, 0x9d, 0x7a, \n0x94, 0xac, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x50, 0xa3, 0x80, 0x22, 0x40, 0x6e, \n0x08, 0x00, 0x4c, 0x70, 0x80, 0x55, 0xa6, 0x77, 0x55, 0xe0, 0x80, 0x80, 0x4f, 0xe2, 0x00, 0x50, \n0x02, 0x83, 0x00, 0x03, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x78, 0xdd, 0x2f, \n0x54, 0x94, 0x3f, 0xff, 0x95, 0x3c, 0x81, 0x00, 0x40, 0x3e, 0x10, 0x00, 0xf0, 0x01, 0xb4, 0x9f, \n0x4e, 0x83, 0x00, 0x07, 0xbb, 0x2d, 0x42, 0x01, 0xc4, 0x08, 0xb8, 0xad, 0xd5, 0x38, 0x39, 0xee, \n0x2a, 0x02, 0x84, 0x41, 0x12, 0x9f, 0x00, 0x06, 0x80, 0x3e, 0x04, 0x51, 0x80, 0x0b, 0x10, 0x2f, \n0x00, 0x14, 0x14, 0x5f, 0x00, 0x04, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0xbc, \n0xdd, 0x2f, 0x38, 0x8e, 0x2a, 0x0a, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa6, 0xf7, 0x04, 0x84, 0x00, 0x02, 0x58, 0x01, \n0x80, 0x40, 0xae, 0x37, 0xa4, 0x73, 0xb7, 0x06, 0x40, 0x50, 0xb8, 0x09, 0x40, 0x52, 0xb8, 0x08, \n0x58, 0x22, 0x86, 0x40, 0xac, 0xb3, 0xb4, 0x9f, 0x10, 0x72, 0x01, 0xb8, 0x00, 0xae, 0x00, 0xa1, \n0x50, 0x75, 0x00, 0x01, 0x97, 0xbc, 0x10, 0x6e, 0x00, 0xa1, 0xd5, 0x9e, 0xec, 0x0c, 0x3a, 0x6f, \n0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x83, 0x80, 0x50, 0x00, 0x00, 0xb8, \n0x46, 0x40, 0x04, 0x10, 0xf0, 0x81, 0x58, 0x42, 0x08, 0x00, 0x00, 0x7e, 0x00, 0xa0, 0x00, 0x52, \n0x01, 0xac, 0x94, 0xbc, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x74, 0x50, 0xa3, 0x80, 0x20, \n0x40, 0x6e, 0x08, 0x00, 0xd7, 0x54, 0x01, 0xe3, 0x00, 0x07, 0x54, 0x5f, 0x00, 0x80, 0xc5, 0x4f, \n0x02, 0x83, 0x00, 0x03, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x78, 0xdd, 0x2f, \n0x98, 0x7f, 0x54, 0x94, 0x3f, 0xff, 0x81, 0x00, 0x9c, 0x09, 0x95, 0x03, 0x40, 0x3e, 0x10, 0x00, \n0xf0, 0x01, 0xb4, 0x9f, 0x4e, 0x83, 0x00, 0x06, 0x44, 0x31, 0x00, 0x00, 0xbb, 0xad, 0xd5, 0x37, \n0x39, 0xee, 0x2a, 0x02, 0x84, 0x40, 0x12, 0x9f, 0x00, 0x06, 0x80, 0x3e, 0xa1, 0x59, 0x10, 0x2f, \n0x00, 0x14, 0x14, 0x5f, 0x00, 0x04, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0xbc, \n0xdd, 0x2f, 0x38, 0x8e, 0x2a, 0x0a, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa6, 0xf7, 0x04, 0x84, 0x00, 0x02, 0x58, 0x11, \n0x80, 0x40, 0xae, 0x77, 0xa5, 0x33, 0xb7, 0x06, 0x40, 0x52, 0x38, 0x09, 0x40, 0x52, 0xb8, 0x08, \n0x58, 0x22, 0x80, 0xc8, 0xac, 0xb3, 0xb4, 0x9f, 0x10, 0x72, 0x01, 0xa8, 0x00, 0xae, 0x00, 0xa0, \n0x50, 0x75, 0x00, 0x01, 0x97, 0xbc, 0x10, 0x6e, 0x00, 0xa0, 0xd5, 0xa0, 0xec, 0x0c, 0x3a, 0x6f, \n0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0xb6, 0x20, 0xa8, 0xc1, 0x80, 0xc1, \n0xa0, 0x43, 0x84, 0xe0, 0x81, 0x23, 0x81, 0x02, 0xa8, 0x42, 0x47, 0xc0, 0x01, 0x02, 0x59, 0xce, \n0x07, 0x08, 0x81, 0x47, 0xd5, 0x0c, 0xdd, 0x3c, 0xa6, 0xb7, 0x44, 0x3f, 0xff, 0xc0, 0x40, 0x01, \n0x0c, 0x04, 0xae, 0x37, 0x1c, 0xa4, 0x00, 0x01, 0x9d, 0xf9, 0x8c, 0xd0, 0x80, 0x06, 0x84, 0x20, \n0x44, 0x20, 0x00, 0x10, 0xe2, 0xe9, 0xe9, 0xf0, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0xb6, 0x20, 0xa8, 0xc1, 0x46, 0x80, 0x04, 0x10, 0x04, 0x90, \n0x00, 0x03, 0x58, 0x84, 0x09, 0xb0, 0x14, 0x90, 0x00, 0x02, 0x44, 0x70, 0x06, 0x40, 0x83, 0x83, \n0x80, 0xc1, 0x46, 0x30, 0x00, 0x0c, 0x58, 0x31, 0x82, 0x64, 0x40, 0x10, 0x20, 0x03, 0x44, 0x50, \n0x00, 0xc8, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x74, 0x40, 0x41, 0x84, 0x1a, 0x40, 0x40, \n0x04, 0x1b, 0x40, 0x82, 0x84, 0x1b, 0x40, 0x83, 0x84, 0x1a, 0x84, 0xe0, 0xf4, 0x83, 0x81, 0x42, \n0x46, 0x40, 0x01, 0x02, 0x58, 0x42, 0x07, 0x08, 0x81, 0x27, 0x54, 0x34, 0x3f, 0xff, 0xd5, 0x26, \n0xf3, 0x81, 0xf4, 0x82, 0xdd, 0x24, 0xf0, 0x03, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x78, \n0xdd, 0x2f, 0xf3, 0x01, 0xf4, 0x02, 0xc0, 0x20, 0x12, 0x80, 0x00, 0x06, 0x10, 0x90, 0x00, 0x0e, \n0x10, 0x90, 0x00, 0x0f, 0xa6, 0x77, 0x9d, 0xf9, 0x55, 0xe0, 0x80, 0x3f, 0x11, 0xe3, 0x00, 0x07, \n0xa5, 0x73, 0x40, 0x12, 0xb8, 0x09, 0x40, 0x10, 0xb8, 0x08, 0x41, 0xe0, 0x8c, 0x04, 0x13, 0xe3, \n0x00, 0x03, 0xa0, 0x82, 0xaa, 0xb4, 0x1c, 0x05, 0x00, 0x01, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x10, 0xe2, 0xfc, 0xe9, 0xd6, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x20, 0x04, 0x00, 0x04, 0x61, 0x00, 0x09, 0x84, 0x01, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, 0x40, 0x03, 0x7c, 0x0a, 0x84, 0xa1, 0xd8, 0x0b, \n0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x04, 0xb4, 0x80, 0x54, 0x32, 0x01, 0xfd, 0x58, 0x11, \n0x80, 0x02, 0xd5, 0x08, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x04, 0xb4, 0xa0, 0x54, 0x12, \n0x81, 0xfd, 0xb6, 0x20, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x46, 0x60, \n0x04, 0x00, 0x58, 0x63, 0x00, 0x04, 0x84, 0xe0, 0x85, 0x08, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, \n0x88, 0xd0, 0x84, 0x01, 0x4b, 0xe0, 0x24, 0x01, 0xb4, 0x46, 0x99, 0xff, 0x54, 0x11, 0x00, 0x08, \n0x84, 0x01, 0x97, 0xf8, 0xc1, 0x03, 0x40, 0x73, 0x80, 0x04, 0x05, 0xe3, 0x00, 0x00, 0x8f, 0x01, \n0x54, 0x5f, 0x01, 0xfe, 0x58, 0x42, 0x80, 0x01, 0xb6, 0x86, 0x54, 0x84, 0x00, 0xff, 0x4b, 0xe0, \n0x24, 0x01, 0xb4, 0x66, 0x54, 0x01, 0x81, 0xfe, 0xb6, 0x06, 0x4e, 0x83, 0xff, 0xe4, 0x84, 0x08, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, 0x80, 0x07, 0xec, 0x04, 0x3a, 0x6f, \n0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x46, 0x60, 0x04, 0x00, 0x97, 0xc0, \n0x58, 0x63, 0x00, 0x04, 0x85, 0x28, 0x46, 0x80, 0x00, 0x03, 0x58, 0x84, 0x08, 0xd0, 0xb4, 0x46, \n0x40, 0x33, 0x9c, 0x09, 0x94, 0x5a, 0x55, 0xe1, 0x01, 0xfb, 0x40, 0x00, 0xf8, 0x04, 0xb6, 0x06, \n0x84, 0x01, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0xa6, 0x84, 0x01, 0x54, 0x42, 0x81, 0xfe, 0x40, 0x32, \n0x00, 0x04, 0xb6, 0x66, 0x8f, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0x46, 0x84, 0x01, 0x54, 0x11, \n0x01, 0xfe, 0xb6, 0x26, 0x99, 0xff, 0x54, 0x94, 0x80, 0xff, 0x4b, 0xe0, 0x20, 0x01, 0x97, 0xf8, \n0x4e, 0x93, 0xff, 0xdf, 0x84, 0x0a, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, \n0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x20, 0x04, 0x00, \n0x04, 0x01, 0x00, 0x09, 0x84, 0xa1, 0x90, 0x1f, 0xd8, 0x15, 0x46, 0x60, 0x04, 0x00, 0x58, 0x63, \n0x00, 0x04, 0xb4, 0x26, 0x55, 0xe0, 0x81, 0xfd, 0x58, 0x5f, 0x00, 0x02, 0xb6, 0xa6, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, 0xb4, 0x86, 0x54, 0x32, 0x01, 0xfd, 0xb6, 0x66, \n0xd5, 0x08, 0x80, 0xc2, 0xa0, 0xf1, 0x54, 0x21, 0x81, 0xfd, 0x58, 0x01, 0x00, 0x02, 0xa8, 0x31, \n0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x82, 0xe8, \n0xdd, 0x2f, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x82, 0x74, 0xdd, 0x2f, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x82, 0x08, 0xdd, 0x2f, 0x80, 0xc0, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x81, 0xb0, 0xdd, 0x2f, 0x96, 0x34, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x97, 0x81, 0x97, 0xca, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x82, 0xe8, 0xdd, 0x2f, \n0x84, 0x03, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x82, 0x74, 0xdd, 0x2f, 0xcf, 0x05, 0x44, 0x00, \n0xfc, 0x00, 0x40, 0x63, 0x00, 0x04, 0x46, 0x70, 0x00, 0x03, 0x58, 0x73, 0x82, 0x74, 0x40, 0x03, \n0x20, 0x09, 0x4b, 0xe0, 0x1c, 0x01, 0x96, 0x30, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x82, 0x08, 0xdd, 0x2f, 0x80, 0xc0, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x81, 0xb0, \n0xdd, 0x2f, 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, \n0x46, 0x60, 0x00, 0x03, 0x58, 0x63, 0x02, 0x74, 0x54, 0x80, 0x80, 0xff, 0x97, 0xc1, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x82, 0xe8, 0xdd, 0x2f, 0x84, 0x02, 0xdd, 0x26, 0x40, 0x03, 0xa0, 0x09, \n0xdd, 0x26, 0x96, 0x38, 0xdd, 0x26, 0x80, 0x08, 0xdd, 0x26, 0x46, 0x60, 0x00, 0x03, 0x58, 0x63, \n0x03, 0x44, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x81, 0xb0, 0xdd, 0x2f, 0x4b, 0xe0, 0x18, 0x01, \n0xc8, 0xfe, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x82, 0xe8, 0xdd, 0x2f, 0x84, 0x04, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x82, 0x74, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x81, 0xb0, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x82, 0xe8, 0xdd, 0x2f, 0x84, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x82, 0x74, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x81, 0xb0, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x04, 0x00, 0x80, 0x01, 0x84, 0x48, \n0x14, 0x20, 0x81, 0x06, 0x14, 0x20, 0x01, 0x0a, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x00, 0x0c, \n0x04, 0x20, 0x00, 0x5c, 0x46, 0x30, 0x04, 0x00, 0x9c, 0x51, 0x14, 0x10, 0x00, 0x5c, 0x04, 0x51, \n0x81, 0x00, 0x80, 0x03, 0x58, 0x42, 0x80, 0x11, 0x14, 0x41, 0x81, 0x00, 0x04, 0x20, 0x01, 0x06, \n0x58, 0x11, 0x00, 0x80, 0x14, 0x10, 0x01, 0x06, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x30, 0x04, 0x00, \n0x80, 0x03, 0x44, 0x20, 0x00, 0x4e, 0x44, 0x10, 0x00, 0xa8, 0x14, 0x21, 0x81, 0x04, 0x14, 0x10, \n0x01, 0x06, 0xdd, 0x9e, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x5c, 0xdd, 0x9e, 0x92, 0x00, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x05, 0x90, 0x84, 0x80, 0xb6, 0x80, 0x84, 0x21, 0xb4, 0x60, \n0xa8, 0xc1, 0xa8, 0x42, 0xb4, 0x40, 0xa1, 0x42, 0x9f, 0x29, 0x40, 0x32, 0x08, 0x02, 0x9c, 0x5a, \n0x95, 0x4a, 0x98, 0xc5, 0x46, 0x40, 0x00, 0x0c, 0x58, 0x42, 0x05, 0x7c, 0xa9, 0x19, 0xb4, 0x40, \n0x9c, 0x51, 0xb6, 0x20, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x81, 0x70, \n0xb4, 0x41, 0x98, 0x02, 0xd5, 0x03, 0x64, 0x00, 0x00, 0x00, 0xb4, 0x81, 0x9a, 0xe0, 0x4e, 0x35, \n0xff, 0xfc, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0xa0, 0x32, 0xc0, 0x2d, 0x84, 0xa2, \n0xd0, 0x2b, 0x84, 0xa3, 0xd8, 0x02, 0xd5, 0x28, 0xa0, 0x33, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x57, \n0x80, 0x5d, 0xd0, 0x07, 0xa0, 0x41, 0x05, 0xe3, 0x00, 0x01, 0x40, 0x50, 0xf8, 0x00, 0xa9, 0x41, \n0xa0, 0x73, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x01, 0x74, 0x4c, 0x13, 0x40, 0x05, 0x84, 0x40, \n0xb6, 0x40, 0xd5, 0x0d, 0x05, 0xe3, 0x00, 0x04, 0x14, 0x1f, 0x00, 0x03, 0xa1, 0x33, 0xa1, 0x74, \n0xa9, 0x64, 0xb4, 0x60, 0x4c, 0x33, 0x40, 0x04, 0xa0, 0x73, 0xb6, 0x20, 0x84, 0x00, 0x84, 0x43, \n0xa8, 0x34, 0xa8, 0xb2, 0xa8, 0x33, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, \n0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xf4, 0x80, 0xe1, 0x80, 0xc0, 0xc1, 0x7a, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0x84, 0x01, 0xa8, 0x32, 0x46, 0x30, 0x00, 0x0c, 0x04, 0x21, \n0x80, 0x5d, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x01, 0x7c, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, \n0x81, 0x70, 0xca, 0x0b, 0xa9, 0xb3, 0xa9, 0xb4, 0x14, 0x61, 0x80, 0x5d, 0x46, 0xf0, 0x00, 0x0c, \n0x14, 0x77, 0x80, 0x5e, 0xa9, 0xf1, 0xd5, 0x39, 0xb4, 0x21, 0xb4, 0x00, 0xe2, 0x20, 0xe8, 0x03, \n0x9a, 0x01, 0xd5, 0x02, 0x9a, 0x08, 0x44, 0x10, 0x00, 0x21, 0x40, 0x00, 0x04, 0x37, 0xa0, 0x51, \n0xe2, 0x01, 0xe8, 0x03, 0x9a, 0x08, 0xd5, 0x02, 0x84, 0x00, 0xa8, 0x11, 0xa0, 0xd1, 0x46, 0xf0, \n0x00, 0x0c, 0x04, 0x17, 0x80, 0x5d, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x37, 0x80, 0x5e, 0xa0, 0x11, \n0xe2, 0xe0, 0xe8, 0x0b, 0x9a, 0x07, 0xa8, 0x11, 0x46, 0x00, 0x00, 0x0c, 0x04, 0x50, 0x00, 0x5d, \n0xda, 0x20, 0x14, 0x60, 0x00, 0x5d, 0xd5, 0x1d, 0xa0, 0x93, 0x9b, 0xf8, 0x4c, 0x20, 0xff, 0xf1, \n0xd5, 0x18, 0x14, 0x00, 0x80, 0x5e, 0xc0, 0x0c, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x81, 0x70, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x01, 0x7c, 0xb4, 0x41, 0xb6, 0x40, 0xd5, 0x03, 0x84, 0x22, \n0xa8, 0x72, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, 0xdd, 0x2f, 0xd5, 0x16, \n0xa8, 0xb3, 0xa0, 0x14, 0x46, 0x10, 0x00, 0x0c, 0xa8, 0x34, 0x05, 0xe1, 0x00, 0x04, 0x14, 0x6f, \n0x00, 0x03, 0xa9, 0x94, 0xa9, 0xf1, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x37, 0x80, 0x5d, 0x04, 0x40, \n0x80, 0x5e, 0xa0, 0x19, 0xe2, 0x80, 0xe8, 0xd6, 0xd5, 0xe5, 0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0x90, \n0xa0, 0xc9, 0xa1, 0x4a, 0xf0, 0x01, 0x9f, 0x29, 0x40, 0x22, 0x0c, 0x02, 0x9d, 0x92, 0x95, 0x72, \n0x99, 0x0d, 0xa1, 0xa1, 0xa0, 0xc9, 0x9c, 0x99, 0xa8, 0x89, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x80, 0x0c, 0xdd, 0x2f, 0x84, 0x00, 0xa8, 0x34, 0xb6, 0x06, 0xa8, 0x31, 0xa8, 0x32, 0xa8, 0x33, \n0x80, 0x06, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x17, 0x80, 0x5c, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x27, \n0x80, 0x98, 0x9a, 0x0a, 0x4e, 0x05, 0x00, 0x07, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x88, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x04, 0x01, \n0x84, 0x21, 0xa8, 0x42, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x04, 0x01, 0x84, 0x20, 0xb6, 0x20, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x04, 0x01, 0x96, 0x00, 0xa8, 0x09, 0xdd, 0x9e, 0x92, 0x00, \n0x46, 0x00, 0x04, 0x01, 0x84, 0x22, 0xa8, 0x42, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x04, 0x01, \n0x04, 0x00, 0x81, 0x8a, 0x96, 0x04, 0xc0, 0x04, 0x84, 0x41, 0x14, 0x20, 0x81, 0x8a, 0xdd, 0x9e, \n0x46, 0x20, 0x04, 0x01, 0xa0, 0x52, 0x56, 0x00, 0x80, 0x04, 0x42, 0x00, 0x08, 0x0b, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x50, 0x04, 0x00, 0x46, 0x60, 0x04, 0x01, 0x58, 0x63, 0x06, 0x8c, \n0x04, 0x82, 0x80, 0x80, 0xb4, 0x86, 0x46, 0x70, 0x00, 0x03, 0x58, 0x73, 0x88, 0xdc, 0x58, 0x02, \n0x00, 0x40, 0xb6, 0x06, 0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, 0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, \n0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, 0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, 0xb4, 0x66, 0x42, 0x11, \n0x98, 0x09, 0x54, 0x04, 0x00, 0x03, 0xb6, 0x26, 0xc8, 0x14, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, \n0x02, 0x04, 0xb4, 0x80, 0x46, 0x3f, 0xf0, 0xff, 0x58, 0x22, 0x00, 0x01, 0xb6, 0x40, 0x05, 0xe0, \n0x00, 0x00, 0x58, 0x31, 0x8f, 0xff, 0x50, 0x10, 0x00, 0x08, 0x40, 0x2f, 0x0c, 0x02, 0xd5, 0x19, \n0x84, 0xa1, 0xd8, 0x1c, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x04, 0xb4, 0xa0, 0x42, 0x42, \n0x80, 0x09, 0xb6, 0x80, 0x46, 0x3f, 0xf0, 0xff, 0xb4, 0x40, 0x58, 0x31, 0x8f, 0xff, 0x41, 0xe1, \n0x0c, 0x02, 0x15, 0xe0, 0x00, 0x00, 0xb4, 0xa0, 0x50, 0x10, 0x00, 0x08, 0x42, 0x22, 0xd0, 0x08, \n0xb6, 0x40, 0xb4, 0x41, 0x58, 0x01, 0x03, 0x00, 0xb6, 0x01, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0x9c, 0x3c, 0x96, 0xd8, 0x96, 0x90, 0xcb, 0x15, 0x54, 0x21, 0x00, 0xfc, 0xd5, 0x0f, \n0x38, 0x41, 0x84, 0x02, 0x9c, 0xdc, 0x40, 0x52, 0x60, 0x09, 0x40, 0x72, 0x20, 0x09, 0x40, 0x62, \n0x40, 0x09, 0xa9, 0xc1, 0xa9, 0x82, 0xa9, 0x43, 0xb6, 0x80, 0x8c, 0x10, 0x4c, 0x31, 0x7f, 0xf2, \n0xd5, 0x0c, 0x84, 0xa1, 0xdb, 0x0a, 0x84, 0x60, 0xd5, 0x05, 0xa3, 0xc9, 0x38, 0x71, 0x80, 0x08, \n0x9c, 0xd9, 0x97, 0x18, 0xe2, 0x82, 0xe9, 0xfa, 0x3a, 0x6f, 0x9c, 0x04, 0xdd, 0x9e, 0x92, 0x00, \n0x96, 0x01, 0x96, 0x89, 0xe2, 0x02, 0xe8, 0x02, 0x80, 0x20, 0x96, 0x09, 0xdd, 0x9e, 0x92, 0x00, \n0x96, 0x00, 0x96, 0x88, 0xe2, 0x02, 0xe8, 0x02, 0x80, 0x20, 0x96, 0x08, 0xdd, 0x9e, 0x92, 0x00, \n0xd5, 0x03, 0x92, 0x00, 0x9e, 0x01, 0x96, 0x00, 0xc8, 0xfd, 0xdd, 0x9e, 0xd5, 0x08, 0x44, 0x10, \n0x00, 0xff, 0x92, 0x00, 0x9e, 0x49, 0x96, 0x48, 0xc9, 0xfd, 0x9e, 0x01, 0x96, 0x00, 0xc8, 0xf8, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x96, 0x00, 0x54, 0xa0, \n0x80, 0xff, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x84, 0x4c, 0x97, 0xd1, 0x40, 0x80, 0x04, 0x00, \n0x84, 0xc0, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, 0x83, 0x7c, 0xd5, 0x09, 0x4b, 0xe0, 0x24, 0x01, \n0x9d, 0xb1, 0x9d, 0xf9, 0x18, 0x04, 0x00, 0x01, 0x97, 0xb0, 0x97, 0xf9, 0x80, 0x07, 0x84, 0x20, \n0xe2, 0xca, 0xe9, 0xf5, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0x00, 0x04, 0x00, 0x04, 0x10, 0x00, 0x09, 0x4e, 0x14, 0x00, 0x04, 0x84, 0x21, 0xd5, 0x02, \n0x84, 0x20, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x17, 0x85, 0x89, 0x44, 0x00, 0x00, 0x11, 0x84, 0x20, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x83, 0x7c, 0xdd, 0x2f, 0x54, 0x30, 0x00, 0x0f, 0x84, 0xa2, \n0xdb, 0x0e, 0x54, 0x40, 0x00, 0x10, 0xc4, 0x09, 0x46, 0x50, 0x04, 0x00, 0x05, 0xe2, 0x80, 0x08, \n0x42, 0x6f, 0x2c, 0x09, 0x14, 0x62, 0x80, 0x08, 0x84, 0x20, 0xd5, 0x02, 0x84, 0x21, 0x46, 0xf0, \n0x00, 0x09, 0x10, 0x17, 0x85, 0x88, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x88, 0xc8, 0x47, \n0x46, 0x60, 0x00, 0x03, 0x58, 0x63, 0x08, 0xf8, 0x84, 0x02, 0x84, 0x21, 0x94, 0x83, 0xdd, 0x26, \n0x84, 0x08, 0x84, 0x26, 0x44, 0x20, 0x00, 0x12, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x24, 0x84, 0x22, \n0x9e, 0x82, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x2a, 0x84, 0x23, 0x94, 0x8b, 0xdd, 0x26, 0x44, 0x00, \n0x00, 0x2e, 0x84, 0x23, 0x44, 0x20, 0x00, 0x1b, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x35, 0x84, 0x21, \n0x44, 0x20, 0x00, 0x1e, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x39, 0x84, 0x21, 0x44, 0x20, 0x00, 0x1f, \n0xdd, 0x26, 0x44, 0x00, 0x00, 0x76, 0x84, 0x21, 0x94, 0x8d, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x7a, \n0x84, 0x21, 0x44, 0x20, 0x00, 0x21, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x78, 0x84, 0x21, 0x44, 0x20, \n0x00, 0x26, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x96, 0x84, 0x21, 0x44, 0x20, 0x00, 0x24, 0xdd, 0x26, \n0x44, 0x00, 0x00, 0x9d, 0x84, 0x21, 0x44, 0x20, 0x00, 0x25, 0xdd, 0x26, 0x3a, 0x6f, 0x98, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x40, 0x80, 0x00, 0x13, 0x54, 0x94, \n0x00, 0xff, 0x46, 0x70, 0x04, 0x01, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x04, 0x4c, 0x97, 0x08, \n0x96, 0x92, 0x96, 0xda, 0x89, 0x20, 0x58, 0x73, 0x84, 0x00, 0x84, 0xc0, 0x47, 0xc0, 0x00, 0x03, \n0x59, 0xce, 0x03, 0x7c, 0x85, 0x47, 0xd5, 0x1a, 0xc3, 0x0b, 0xf2, 0x82, 0xf3, 0x81, 0xf4, 0x83, \n0x80, 0x08, 0x84, 0x20, 0xdd, 0x3c, 0xf2, 0x02, 0xf3, 0x01, 0xf4, 0x03, 0xd5, 0x03, 0x00, 0x04, \n0x80, 0x00, 0x9c, 0x71, 0x8d, 0x01, 0x56, 0x63, 0x00, 0x01, 0xc2, 0x03, 0x40, 0x05, 0x18, 0x1a, \n0xaa, 0x39, 0x97, 0x88, 0x40, 0x84, 0x00, 0x13, 0x8d, 0x21, 0xe2, 0xc4, 0xe9, 0xe6, 0xec, 0x14, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, 0x00, 0x09, 0x02, 0x07, 0x82, 0xbe, 0xc8, 0x02, \n0xd5, 0x03, 0x84, 0xa1, 0xd8, 0x0b, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x07, 0x85, 0x82, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x87, 0x5c, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x85, 0xc8, 0x1c, 0x46, 0xf0, 0x00, 0x09, \n0x02, 0x07, 0x82, 0xbe, 0x84, 0xa1, 0xd8, 0x13, 0x46, 0x40, 0x04, 0x01, 0x04, 0x12, 0x01, 0xa3, \n0x46, 0x00, 0x04, 0x10, 0x59, 0xe0, 0x80, 0x08, 0x54, 0x5f, 0x00, 0xff, 0x14, 0x52, 0x01, 0xa3, \n0x58, 0x00, 0x02, 0x38, 0xb4, 0x60, 0x42, 0x11, 0xc4, 0x08, 0xd5, 0x36, 0x84, 0xa2, 0xd8, 0x50, \n0xd5, 0x49, 0x84, 0xa2, 0xd8, 0x4d, 0x46, 0xf0, 0x00, 0x09, 0x02, 0x07, 0x82, 0xbe, 0xc8, 0x48, \n0x46, 0xf0, 0x00, 0x09, 0x02, 0x07, 0x82, 0xbf, 0x44, 0x50, 0x00, 0x81, 0xd0, 0x1d, 0x5c, 0xf0, \n0x00, 0x82, 0xe8, 0x08, 0xe6, 0x0a, 0xe8, 0x03, 0xc8, 0x0f, 0xd5, 0x34, 0x9f, 0x69, 0xd8, 0x38, \n0xd5, 0x31, 0x9c, 0x6a, 0x4c, 0x00, 0x80, 0x20, 0xe2, 0x01, 0xe9, 0x18, 0x9d, 0x49, 0xd0, 0x20, \n0x9d, 0x4a, 0xd8, 0x2e, 0xd5, 0x22, 0x97, 0x40, 0x46, 0x40, 0x04, 0x01, 0x94, 0x2d, 0x58, 0x42, \n0x00, 0x08, 0x98, 0x04, 0xd5, 0x05, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x38, 0x05, 0xe0, \n0x00, 0x00, 0x58, 0x1f, 0x00, 0x40, 0xb6, 0x20, 0xd5, 0x15, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, \n0x00, 0x58, 0xd5, 0xf6, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x78, 0xd5, 0xf1, 0x46, 0x00, \n0x04, 0x01, 0x58, 0x00, 0x00, 0x98, 0xd5, 0xec, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0xb8, \n0xd5, 0xe7, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0x5c, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x85, 0xc0, 0x05, \n0x84, 0xa2, 0x4c, 0x02, 0xc0, 0xa3, 0xd5, 0x1a, 0x46, 0xf0, 0x00, 0x09, 0x02, 0x37, 0x82, 0xbe, \n0x84, 0xa1, 0x4c, 0x32, 0xc0, 0x9b, 0x46, 0x30, 0x04, 0x01, 0x04, 0x41, 0x81, 0xa3, 0x46, 0x50, \n0x04, 0x10, 0x54, 0x22, 0x00, 0xf7, 0x14, 0x21, 0x81, 0xa3, 0x04, 0x02, 0x80, 0x8e, 0x43, 0xe0, \n0x44, 0x09, 0x15, 0xe2, 0x80, 0x8e, 0x48, 0x00, 0x00, 0x83, 0x46, 0xf0, 0x00, 0x09, 0x02, 0x57, \n0x82, 0xbe, 0x4e, 0x53, 0x00, 0x83, 0x46, 0x20, 0x00, 0x09, 0x02, 0x01, 0x02, 0xbf, 0x44, 0x50, \n0x00, 0x82, 0xd0, 0x3b, 0x5c, 0xf0, 0x00, 0x83, 0xe8, 0x07, 0xc0, 0x71, 0xe6, 0x0a, 0xe9, 0x0c, \n0x9f, 0x69, 0xd8, 0x6d, 0xd5, 0x25, 0x9c, 0x6a, 0x4c, 0x00, 0x80, 0x4a, 0xe2, 0x01, 0xe9, 0x3a, \n0x9d, 0x49, 0xd8, 0x65, 0xd5, 0x51, 0x55, 0xe0, 0x00, 0xff, 0x46, 0x50, 0x04, 0x01, 0x58, 0x52, \n0x86, 0x88, 0x58, 0x3f, 0x00, 0x60, 0x15, 0xe2, 0x80, 0x00, 0x40, 0x0f, 0x14, 0x08, 0xb6, 0x65, \n0x50, 0x12, 0xf9, 0x80, 0x41, 0xe0, 0x04, 0x00, 0xb4, 0x7e, 0x42, 0x11, 0x98, 0x09, 0xb6, 0x3e, \n0x00, 0x01, 0x05, 0x7e, 0x58, 0x40, 0x00, 0x60, 0xb6, 0x05, 0xb6, 0x85, 0xd5, 0x48, 0x46, 0x00, \n0x04, 0x01, 0x58, 0x00, 0x06, 0x88, 0x44, 0x30, 0x00, 0x11, 0x44, 0x20, 0x00, 0x71, 0xb6, 0x60, \n0x50, 0x10, 0x79, 0xb0, 0xb6, 0x40, 0xd5, 0x34, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x06, 0x88, \n0x44, 0x30, 0x00, 0x12, 0x44, 0x20, 0x00, 0x72, 0xb6, 0x60, 0x50, 0x10, 0x79, 0xd0, 0xb6, 0x40, \n0xd5, 0x27, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x06, 0x88, 0x44, 0x30, 0x00, 0x13, 0x44, 0x20, \n0x00, 0x73, 0xb6, 0x60, 0x50, 0x10, 0x79, 0xf0, 0xb6, 0x40, 0xd5, 0x1a, 0x46, 0x00, 0x04, 0x01, \n0x58, 0x00, 0x06, 0x88, 0x44, 0x30, 0x00, 0x14, 0x44, 0x20, 0x00, 0x74, 0xb6, 0x60, 0x50, 0x10, \n0x7a, 0x10, 0xb6, 0x40, 0xd5, 0x0d, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x06, 0x88, 0x44, 0x30, \n0x00, 0x15, 0x44, 0x20, 0x00, 0x75, 0xb6, 0x60, 0xb6, 0x40, 0x50, 0x10, 0x7a, 0x30, 0x05, 0xe0, \n0x80, 0x00, 0x42, 0x4f, 0x18, 0x09, 0xb6, 0x81, 0xb6, 0x60, 0xb6, 0x40, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x5c, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xf4, 0x96, 0x92, 0x97, 0xc1, 0x97, 0x8b, 0xf2, 0x81, 0x47, 0xc0, 0x00, 0x03, 0x59, 0xce, \n0x0a, 0x34, 0x46, 0xa0, 0x00, 0x03, 0x58, 0xa5, 0x07, 0x74, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, \n0x87, 0x80, 0xd5, 0x20, 0x96, 0x30, 0x44, 0x10, 0x00, 0x40, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x88, 0xc0, 0xdd, 0x2f, 0x81, 0x00, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0xa0, 0xdd, 0x2f, \n0xc0, 0xfb, 0xf3, 0x01, 0x80, 0x28, 0x84, 0x40, 0x80, 0x07, 0xdd, 0x3c, 0x50, 0x63, 0x7f, 0xc0, \n0x80, 0x08, 0x50, 0x73, 0x80, 0x40, 0x4b, 0xe0, 0x28, 0x01, 0x97, 0xb3, 0x4b, 0xe0, 0x24, 0x01, \n0x97, 0xf9, 0x4e, 0x64, 0xff, 0xe1, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x57, 0x85, 0x84, 0x40, 0x80, 0x00, 0x10, \n0x4c, 0x54, 0x40, 0x31, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x04, 0x4c, 0x44, 0x40, 0x00, 0x40, \n0x84, 0x60, 0x10, 0x30, 0x00, 0x8e, 0x10, 0x40, 0x00, 0x8d, 0x10, 0x40, 0x00, 0x3e, 0x10, 0x30, \n0x00, 0x3f, 0x10, 0x40, 0x00, 0x45, 0x10, 0x30, 0x00, 0x46, 0x10, 0x40, 0x00, 0x4c, 0x10, 0x30, \n0x00, 0x4d, 0x10, 0x40, 0x00, 0x53, 0x10, 0x30, 0x00, 0x54, 0x10, 0x40, 0x00, 0x5a, 0x10, 0x30, \n0x00, 0x5b, 0x10, 0x40, 0x00, 0x61, 0x10, 0x30, 0x00, 0x62, 0x10, 0x40, 0x00, 0x68, 0x10, 0x30, \n0x00, 0x69, 0x10, 0x40, 0x00, 0x6f, 0x10, 0x30, 0x00, 0x70, 0x10, 0x40, 0x00, 0x86, 0x10, 0x30, \n0x00, 0x87, 0x46, 0x60, 0x00, 0x09, 0x00, 0x03, 0x05, 0x80, 0x44, 0x10, 0x00, 0x40, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x88, 0xc0, 0xdd, 0x2f, 0x80, 0x20, 0x80, 0x48, 0x84, 0x60, 0x80, 0xe0, \n0x44, 0x00, 0x00, 0x28, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8a, 0x34, 0xdd, 0x2f, 0x80, 0x07, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x74, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x87, 0x80, 0xdd, 0x2f, 0x00, 0x53, 0x05, 0x80, 0x5c, 0xf2, 0x80, 0x41, 0xe9, 0x37, 0x46, 0x60, \n0x00, 0x03, 0x58, 0x63, 0x07, 0xa0, 0x4b, 0xe0, 0x18, 0x01, 0xc0, 0xfe, 0x46, 0xf0, 0x00, 0x09, \n0x00, 0x67, 0x84, 0x78, 0x84, 0xa1, 0x46, 0x00, 0x00, 0x09, 0x46, 0x20, 0x00, 0x03, 0x58, 0x21, \n0x08, 0xc0, 0xde, 0x05, 0x00, 0x00, 0x05, 0x80, 0x84, 0x2a, 0xd5, 0x05, 0x00, 0x00, 0x05, 0x80, \n0x44, 0x10, 0x00, 0x36, 0x50, 0x00, 0x7f, 0xc0, 0x96, 0x00, 0x4b, 0xe0, 0x08, 0x01, 0x84, 0x40, \n0x80, 0x20, 0x80, 0xc0, 0x80, 0x62, 0x44, 0x00, 0x00, 0x68, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x8a, 0x34, 0xdd, 0x2f, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x74, 0xdd, 0x2f, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0x46, 0x30, 0x00, 0x09, 0x58, 0x31, \n0x84, 0x4c, 0x84, 0x40, 0x84, 0x82, 0x10, 0x41, 0x80, 0x8e, 0x10, 0x21, 0x80, 0x8d, 0x10, 0x21, \n0x80, 0x3e, 0x10, 0x41, 0x80, 0x3f, 0x10, 0x21, 0x80, 0x45, 0x10, 0x41, 0x80, 0x46, 0x10, 0x21, \n0x80, 0x4c, 0x10, 0x41, 0x80, 0x4d, 0x10, 0x21, 0x80, 0x53, 0x10, 0x41, 0x80, 0x54, 0x10, 0x21, \n0x80, 0x5a, 0x10, 0x41, 0x80, 0x5b, 0x10, 0x21, 0x80, 0x61, 0x10, 0x41, 0x80, 0x62, 0x10, 0x21, \n0x80, 0x68, 0x10, 0x41, 0x80, 0x69, 0x10, 0x21, 0x80, 0x6f, 0x10, 0x41, 0x80, 0x70, 0x10, 0x21, \n0x80, 0x86, 0x10, 0x41, 0x80, 0x87, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0xfc, 0x46, 0x80, 0x00, 0x09, 0x02, 0x04, 0x02, 0xbe, 0x84, 0xa3, 0x40, 0x10, 0x20, 0x09, \n0xd1, 0x45, 0xe6, 0x24, 0xe8, 0x07, 0x84, 0xa1, 0xd1, 0x0d, 0x84, 0xa2, 0x4c, 0x12, 0xc0, 0x98, \n0xd5, 0x34, 0x84, 0xa7, 0xd1, 0x34, 0x84, 0xaf, 0xd1, 0x14, 0x84, 0xa6, 0x4c, 0x12, 0xc0, 0x90, \n0xd5, 0x1e, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x80, 0x44, 0x10, 0x00, 0x12, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x88, 0xc0, 0xdd, 0x2f, 0x80, 0x20, 0x84, 0x00, 0x80, 0x40, 0xd5, 0x79, \n0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x80, 0x84, 0x2c, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x88, 0xc0, 0xdd, 0x2f, 0x80, 0x20, 0x44, 0x00, 0x00, 0x1c, 0xd5, 0x51, 0x46, 0xf0, 0x00, 0x09, \n0x00, 0x07, 0x85, 0x80, 0x84, 0x2a, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xc0, 0xdd, 0x2f, \n0x80, 0x20, 0x44, 0x00, 0x00, 0x12, 0xd5, 0x43, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x8d, 0xd0, 0xdd, 0x2f, 0xd5, 0x5f, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x67, \n0x85, 0x88, 0xce, 0x03, 0x96, 0x00, 0xc8, 0x05, 0x44, 0x00, 0x00, 0x9e, 0x84, 0x24, 0xd5, 0x2f, \n0x46, 0x70, 0x00, 0x03, 0x58, 0x73, 0x83, 0x7c, 0x80, 0x26, 0x50, 0x00, 0x00, 0x27, 0x4b, 0xe0, \n0x1c, 0x01, 0x81, 0x20, 0x80, 0x26, 0x44, 0x00, 0x00, 0x27, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x50, \n0x00, 0xff, 0x80, 0x20, 0xd0, 0x05, 0x00, 0x04, 0x05, 0x7c, 0xe6, 0x0d, 0xe9, 0x1a, 0x46, 0xf0, \n0x00, 0x09, 0x00, 0x07, 0x85, 0x7c, 0x84, 0xa1, 0xd8, 0x06, 0x44, 0x00, 0x00, 0xa2, 0x44, 0x10, \n0x00, 0x12, 0xd5, 0x0d, 0x84, 0xa2, 0xd8, 0x06, 0x44, 0x00, 0x00, 0xb4, 0x44, 0x10, 0x00, 0x1c, \n0xd5, 0x06, 0x84, 0xa3, 0xd8, 0x24, 0x44, 0x00, 0x00, 0xd0, 0x84, 0x28, 0x84, 0x40, 0xd5, 0x19, \n0x40, 0x00, 0xa0, 0x08, 0x55, 0xe4, 0x80, 0xff, 0x40, 0x8f, 0x00, 0x04, 0x40, 0x84, 0x00, 0x13, \n0x80, 0x26, 0x80, 0x08, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x17, 0x85, 0x80, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xc0, 0xdd, 0x2f, 0x80, 0x20, 0x84, 0x41, 0x80, 0x08, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8d, 0x5c, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x87, 0x5c, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x40, 0x04, 0x01, 0x80, 0x64, 0x96, 0x48, 0x96, 0x00, \n0x14, 0x02, 0x01, 0x00, 0x14, 0x11, 0x81, 0x01, 0x96, 0x10, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x87, 0x74, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x00, \n0x80, 0x20, 0x84, 0x41, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x80, 0xc0, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x09, 0x00, 0x07, 0x85, 0x82, 0x84, 0x20, 0x84, 0x41, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x80, 0xc0, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x85, 0x44, 0x50, 0x00, 0x81, 0xd0, 0x50, \n0x9d, 0x69, 0xd0, 0x0b, 0x9f, 0x6a, 0xd8, 0x44, 0x47, 0xe0, 0x04, 0x01, 0x04, 0x5f, 0x01, 0xa3, \n0x54, 0x42, 0x80, 0x08, 0xcc, 0x43, 0xd5, 0x44, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x7e, \n0x9f, 0x69, 0xd0, 0x12, 0x5c, 0xf0, 0x00, 0x82, 0xe8, 0x05, 0xc0, 0x3a, 0xe6, 0x0a, 0xe8, 0x30, \n0xd5, 0x24, 0x9c, 0x6a, 0x4c, 0x00, 0x80, 0x13, 0xe2, 0x01, 0xe9, 0x0b, 0x9d, 0x49, 0xd0, 0x13, \n0x9d, 0x4a, 0xd8, 0x26, 0xd5, 0x15, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x38, 0xd5, 0x1b, \n0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x58, 0xd5, 0x16, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, \n0x00, 0x78, 0xd5, 0x11, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x98, 0xd5, 0x0c, 0x46, 0x00, \n0x04, 0x01, 0x58, 0x00, 0x00, 0xb8, 0xd5, 0x07, 0x46, 0x50, 0x04, 0x01, 0x95, 0x05, 0x58, 0x52, \n0x80, 0x08, 0x98, 0x25, 0x05, 0xe0, 0x00, 0x00, 0x42, 0x0f, 0x18, 0x0b, 0xd5, 0x0a, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0x5c, 0xdd, 0x2f, 0xd5, 0x0b, 0x84, 0x02, 0xd5, 0x02, 0x84, 0x00, \n0x84, 0x20, 0x84, 0x42, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x80, 0xc0, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x30, 0x04, 0x01, 0x04, 0x51, 0x81, 0x80, \n0x46, 0xf0, 0x00, 0x09, 0x10, 0x57, 0x85, 0x85, 0x80, 0x83, 0x04, 0x12, 0x01, 0x81, 0x46, 0xf0, \n0x00, 0x09, 0x10, 0x17, 0x85, 0x86, 0x80, 0xa3, 0x04, 0x21, 0x81, 0x82, 0x04, 0x42, 0x81, 0x83, \n0x96, 0x10, 0x96, 0x60, 0x40, 0x30, 0xa0, 0x08, 0x40, 0x51, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x09, \n0x12, 0x57, 0x82, 0xbe, 0x46, 0x20, 0x04, 0x01, 0x80, 0x02, 0x04, 0x11, 0x01, 0x84, 0x04, 0x30, \n0x01, 0x85, 0x97, 0x08, 0x97, 0x58, 0x40, 0x22, 0xa0, 0x08, 0x40, 0x51, 0x10, 0x04, 0x46, 0xf0, \n0x00, 0x09, 0x12, 0x57, 0x82, 0xbf, 0x80, 0x20, 0x04, 0x40, 0x81, 0x86, 0x04, 0x30, 0x01, 0x87, \n0x96, 0x60, 0x96, 0x18, 0x40, 0x40, 0x20, 0x08, 0x40, 0x32, 0x04, 0x04, 0x46, 0x00, 0x04, 0x01, \n0x46, 0xf0, 0x00, 0x09, 0x12, 0x37, 0x82, 0xc0, 0x84, 0x41, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x09, \n0x14, 0x57, 0x81, 0x5d, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x27, 0x85, 0x83, 0x14, 0x10, 0x01, 0x8c, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x30, 0x04, 0x01, 0x44, 0x50, 0x00, 0xff, 0x80, 0x43, 0x14, 0x51, \n0x81, 0x8a, 0x44, 0x30, 0x00, 0x39, 0x46, 0x10, 0x04, 0x01, 0x14, 0x31, 0x01, 0x98, 0x58, 0x10, \n0x86, 0x88, 0x84, 0x80, 0x44, 0x50, 0x00, 0x10, 0x44, 0x30, 0x00, 0x70, 0x44, 0x20, 0x00, 0x60, \n0xb6, 0xa1, 0x50, 0x00, 0x80, 0x18, 0xb6, 0x61, 0xb6, 0x81, 0xb6, 0x41, 0x44, 0x10, 0x00, 0x31, \n0xb6, 0x20, 0x9d, 0x49, 0x9c, 0x4c, 0x9e, 0xca, 0x9e, 0x89, 0xb6, 0xa0, 0xb6, 0x60, 0xb6, 0x40, \n0xb6, 0x20, 0x80, 0x24, 0x50, 0x20, 0x80, 0x21, 0x84, 0xa9, 0x9c, 0x49, 0xb6, 0x40, 0xd9, 0xfb, \n0x46, 0x00, 0x04, 0x01, 0x44, 0x10, 0x00, 0x3f, 0x14, 0x10, 0x01, 0x8c, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xdc, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x17, 0x85, 0x84, \n0x47, 0xe0, 0x04, 0x01, 0x04, 0x3f, 0x01, 0xa3, 0x46, 0x40, 0x04, 0x00, 0x58, 0x21, 0x80, 0x01, \n0x14, 0x2f, 0x01, 0xa3, 0x80, 0xbe, 0x04, 0x02, 0x00, 0x8f, 0xf5, 0x81, 0x83, 0x85, 0xf1, 0x01, \n0x81, 0x45, 0x81, 0x25, 0x15, 0xcf, 0x80, 0x02, 0x14, 0xaf, 0x80, 0x03, 0x14, 0x9f, 0x80, 0x04, \n0x58, 0x10, 0x80, 0x58, 0xf1, 0x81, 0xf3, 0x02, 0xf2, 0x03, 0xf1, 0x04, 0x81, 0x05, 0x80, 0xe5, \n0x80, 0xc5, 0x14, 0x8f, 0x80, 0x05, 0xf7, 0x86, 0xf6, 0x87, 0x58, 0x31, 0x80, 0x78, 0x58, 0x21, \n0x00, 0x98, 0x58, 0x10, 0x80, 0xb8, 0xf3, 0x82, 0xf2, 0x83, 0xf1, 0x84, 0xf3, 0x05, 0xf2, 0x06, \n0xf1, 0x07, 0x58, 0x00, 0x02, 0x00, 0x58, 0x31, 0x80, 0x48, 0x58, 0x21, 0x00, 0x68, 0x58, 0x10, \n0x80, 0x88, 0x83, 0xc5, 0xf3, 0x85, 0xf2, 0x86, 0xf1, 0x87, 0x14, 0x02, 0x00, 0x8f, 0x44, 0x40, \n0x00, 0x8c, 0x14, 0x4f, 0x00, 0x0e, 0x9e, 0xa4, 0xf0, 0x01, 0x9e, 0xd4, 0xb6, 0x40, 0x9c, 0x51, \n0xf4, 0x02, 0x83, 0x85, 0xb6, 0x64, 0x81, 0x45, 0xf0, 0x03, 0x81, 0x25, 0xb6, 0x20, 0x81, 0x05, \n0xf4, 0x04, 0x80, 0xe5, 0xb6, 0x44, 0xf0, 0x05, 0xb6, 0x40, 0xf4, 0x06, 0xb6, 0x64, 0xf0, 0x07, \n0x46, 0x50, 0x04, 0x01, 0xb6, 0x20, 0x58, 0x52, 0x86, 0x88, 0xb9, 0xaa, 0x14, 0x15, 0x00, 0x32, \n0x44, 0x40, 0x00, 0x10, 0x14, 0x14, 0x80, 0x3a, 0x8e, 0x74, 0x14, 0x24, 0x00, 0x42, 0x94, 0x21, \n0x14, 0x13, 0x80, 0x4a, 0x84, 0x40, 0x44, 0x10, 0x00, 0x60, 0xb6, 0x85, 0xb6, 0x65, 0xb6, 0x45, \n0xb6, 0x25, 0x14, 0x03, 0x01, 0x8c, 0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x10, 0x04, 0x01, 0x04, 0x60, 0x81, 0x8c, 0x96, 0x34, 0xc0, 0x06, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x82, 0x08, 0xdd, 0x2f, 0x54, 0x23, 0x00, 0x08, 0xc2, 0x0a, \n0x46, 0x50, 0x04, 0x01, 0x80, 0x65, 0x87, 0xc8, 0x84, 0x80, 0x15, 0xe2, 0x81, 0x8c, 0x14, 0x41, \n0x81, 0xa7, 0x54, 0x03, 0x00, 0x10, 0xc0, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x82, 0xa4, \n0xdd, 0x2f, 0x54, 0x63, 0x00, 0x20, 0xc6, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x10, \n0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x50, 0x0f, \n0x80, 0x04, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x01, \n0x44, 0x50, 0x00, 0x80, 0x14, 0x52, 0x01, 0xa8, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x07, 0x85, 0x85, \n0x46, 0x60, 0x00, 0x09, 0x84, 0x40, 0x54, 0x00, 0x00, 0x60, 0x44, 0x10, 0x00, 0x20, 0x10, 0x23, \n0x05, 0x83, 0x4c, 0x00, 0x80, 0x20, 0x95, 0x49, 0xd0, 0x14, 0xc8, 0x1c, 0x46, 0xf0, 0x00, 0x09, \n0x00, 0x07, 0x85, 0x86, 0x84, 0x2c, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xc0, 0xdd, 0x2f, \n0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x83, 0x68, 0x38, 0x20, 0x82, 0x02, 0xdd, 0x22, 0xd5, 0x0f, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x89, 0x34, 0xdd, 0x2f, 0x96, 0xc0, 0x10, 0x33, 0x05, 0x83, \n0xd5, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x5c, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x01, \n0x84, 0xa0, 0x14, 0x52, 0x01, 0xa8, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, \n0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xf4, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x89, 0x3c, 0xdd, 0x2f, 0x46, 0x50, 0x04, 0x01, \n0x04, 0x02, 0x81, 0xa3, 0x54, 0x00, 0x00, 0x02, 0xc8, 0x66, 0x80, 0xe5, 0xb6, 0xff, 0x80, 0xc5, \n0xb4, 0x3f, 0xf6, 0x81, 0x58, 0x10, 0x80, 0xb8, 0xb6, 0x3f, 0xf1, 0x01, 0x80, 0x45, 0x58, 0x10, \n0x80, 0x88, 0xf1, 0x81, 0x44, 0x10, 0x00, 0x8b, 0x14, 0x11, 0x00, 0x26, 0x83, 0xc2, 0xb4, 0x5f, \n0x83, 0x85, 0xb6, 0x22, 0x81, 0x45, 0xf2, 0x01, 0x81, 0x25, 0x81, 0x05, 0x80, 0xe5, 0xb6, 0x22, \n0x80, 0xc5, 0x44, 0x20, 0x00, 0xff, 0x46, 0x40, 0x04, 0x01, 0x14, 0x1f, 0x00, 0x2a, 0x58, 0x42, \n0x06, 0x88, 0xb9, 0xb2, 0x14, 0x15, 0x00, 0x3a, 0x14, 0x14, 0x80, 0x42, 0x14, 0x14, 0x00, 0x4a, \n0x14, 0x23, 0x81, 0x8a, 0x44, 0x10, 0x00, 0x39, 0x44, 0x20, 0x00, 0x10, 0x14, 0x13, 0x01, 0x98, \n0xb6, 0x44, 0x44, 0x10, 0x00, 0x70, 0x44, 0x20, 0x00, 0x60, 0xb6, 0x24, 0x50, 0x32, 0x00, 0x18, \n0xb6, 0x04, 0x84, 0x22, 0xb6, 0x44, 0x44, 0x20, 0x00, 0x31, 0x14, 0x12, 0x81, 0xa3, 0x9d, 0x12, \n0xb6, 0x43, 0x9c, 0x53, 0x9f, 0x4a, 0x9c, 0x89, 0xb6, 0xa3, 0xb6, 0x83, 0xb6, 0x23, 0xb6, 0x43, \n0x80, 0x23, 0x50, 0x50, 0x00, 0x21, 0x84, 0x69, 0x9c, 0x01, 0xb6, 0xa1, 0x4c, 0x01, 0xff, 0xfb, \n0x80, 0xa6, 0x44, 0x00, 0x00, 0x3f, 0x84, 0x20, 0x14, 0x02, 0x81, 0x8c, 0x46, 0xf0, 0x00, 0x09, \n0x10, 0x17, 0x85, 0x84, 0x80, 0x05, 0x04, 0x20, 0x01, 0xa3, 0x54, 0x41, 0x00, 0xfe, 0x14, 0x40, \n0x01, 0xa3, 0xd5, 0x38, 0x46, 0x40, 0x04, 0x00, 0x04, 0x32, 0x00, 0x85, 0x80, 0xe5, 0x46, 0x00, \n0x04, 0x01, 0x58, 0x00, 0x06, 0xa0, 0x58, 0x21, 0x80, 0x04, 0x44, 0x60, 0x00, 0x39, 0x45, 0xe0, \n0x00, 0x31, 0x45, 0xc0, 0x00, 0x32, 0x44, 0xa0, 0x00, 0x33, 0x44, 0x90, 0x00, 0x34, 0x44, 0x80, \n0x00, 0x35, 0x14, 0x22, 0x00, 0x85, 0x14, 0x63, 0x81, 0x98, 0x15, 0xe0, 0x00, 0x00, 0x15, 0xc0, \n0x00, 0x00, 0xb7, 0x40, 0xb7, 0x20, 0xb7, 0x00, 0x84, 0x20, 0x50, 0x80, 0x80, 0x21, 0x84, 0xa9, \n0x9c, 0x49, 0xb7, 0x00, 0xd9, 0xfb, 0x81, 0x27, 0x8d, 0x4c, 0x14, 0xa4, 0x81, 0x8c, 0x80, 0x07, \n0x04, 0x10, 0x01, 0xa3, 0x96, 0x4c, 0xc1, 0x02, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x17, \n0x85, 0x84, 0x46, 0x00, 0x04, 0x01, 0x84, 0xa0, 0x84, 0x40, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x27, \n0x85, 0x8a, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x27, 0x85, 0x83, 0x46, 0xf0, 0x00, 0x09, 0x14, 0x57, \n0x81, 0x5e, 0x14, 0x50, 0x01, 0xa8, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x37, 0x85, 0x84, 0x46, 0xf0, \n0x00, 0x09, 0x00, 0x07, 0x85, 0x88, 0x46, 0xf0, 0x00, 0x09, 0x00, 0x47, 0x85, 0x89, 0x40, 0x11, \n0xa4, 0x08, 0x40, 0x00, 0x28, 0x08, 0x40, 0x30, 0x80, 0x04, 0x58, 0x01, 0x80, 0x02, 0x40, 0x12, \n0x2c, 0x08, 0x46, 0x40, 0x04, 0x00, 0x40, 0x20, 0x04, 0x04, 0x46, 0xf0, 0x00, 0x09, 0x10, 0x57, \n0x85, 0x87, 0x14, 0x22, 0x00, 0x8f, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x60, 0x00, 0x03, 0x58, 0x63, 0x07, 0x8c, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x87, 0x68, 0xdd, 0x2f, 0x4b, 0xe0, 0x18, 0x01, 0xc0, 0xfe, 0x46, 0x00, 0x04, 0x01, \n0xb4, 0x40, 0x46, 0x00, 0x04, 0x01, 0x96, 0x90, 0x58, 0x00, 0x05, 0x00, 0x84, 0x20, 0xd5, 0x05, \n0xa3, 0x01, 0x96, 0xe0, 0x18, 0x30, 0x80, 0x01, 0xe0, 0x22, 0xe9, 0xfb, 0x47, 0xe0, 0x00, 0x09, \n0x02, 0x3f, 0x02, 0xc0, 0x84, 0x20, 0x9a, 0x1a, 0x97, 0x41, 0x40, 0x00, 0x94, 0x06, 0x12, 0x5f, \n0x02, 0xc0, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x60, 0x00, 0x03, \n0x58, 0x63, 0x07, 0x8c, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x68, 0xdd, 0x2f, 0x4b, 0xe0, \n0x18, 0x01, 0xc0, 0xfe, 0x47, 0xe0, 0x04, 0x01, 0xb4, 0xde, 0x97, 0xb0, 0x46, 0xf0, 0x00, 0x09, \n0x04, 0x07, 0x81, 0x5d, 0x46, 0x10, 0x04, 0x01, 0x80, 0x46, 0x58, 0x10, 0x85, 0x00, 0x84, 0x61, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0x60, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x09, 0x02, 0x40, \n0x82, 0xc0, 0x84, 0x00, 0x9a, 0xe6, 0x96, 0x99, 0x40, 0x00, 0x08, 0x06, 0x12, 0x20, 0x82, 0xc0, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x60, 0x00, 0x09, \n0x58, 0x63, 0x05, 0x80, 0xa4, 0x30, 0x44, 0x10, 0x00, 0x40, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x88, 0xb0, 0xdd, 0x2f, 0x46, 0x80, 0x00, 0x09, 0x58, 0x84, 0x05, 0x74, 0x97, 0xc0, 0xb4, 0x28, \n0x46, 0x00, 0x04, 0x01, 0x80, 0x47, 0x58, 0x00, 0x04, 0x00, 0x84, 0x60, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x88, 0x60, 0xdd, 0x2f, 0xb4, 0x68, 0x80, 0x07, 0x98, 0xbb, 0xb6, 0x48, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0x74, 0xdd, 0x2f, 0xa4, 0x70, 0x84, 0x00, 0x9b, 0xcf, 0x97, 0xf9, \n0x40, 0x00, 0x1c, 0x06, 0xad, 0xf0, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xf4, 0x96, 0x02, 0xf0, 0x81, 0x84, 0xc0, 0x46, 0xa0, 0x00, 0x03, 0x58, 0xa5, 0x08, 0xb0, \n0x46, 0x70, 0x00, 0x09, 0x58, 0x73, 0x85, 0x74, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, 0x83, 0x7c, \n0xd5, 0x12, 0x00, 0x83, 0x80, 0x01, 0xa7, 0x78, 0x40, 0x44, 0x20, 0x08, 0x40, 0x02, 0x14, 0x04, \n0xb6, 0x7f, 0x4b, 0xe0, 0x24, 0x01, 0xb4, 0x7f, 0x9d, 0xb1, 0xb6, 0x03, 0x97, 0xb0, 0xb4, 0x47, \n0x9c, 0x51, 0xb6, 0x27, 0x46, 0xf0, 0x00, 0x09, 0x02, 0x07, 0x82, 0xc0, 0x44, 0x10, 0x00, 0x40, \n0x4b, 0xe0, 0x28, 0x01, 0x46, 0x10, 0x01, 0x00, 0x58, 0x10, 0x85, 0x00, 0x98, 0xb1, 0x46, 0x80, \n0x00, 0x09, 0xf1, 0x01, 0x94, 0xd2, 0xe2, 0xc0, 0xe9, 0xdd, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x87, 0x74, 0xdd, 0x2f, 0x02, 0x34, 0x02, 0xc0, 0x84, 0x00, 0x9b, 0x9e, 0x97, 0xb1, \n0x40, 0x00, 0x18, 0x06, 0x12, 0x64, 0x02, 0xc0, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x46, 0x70, 0x00, 0x03, 0x58, 0x73, 0x87, 0x8c, 0x97, 0x82, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x68, 0xdd, 0x2f, 0x4b, 0xe0, 0x1c, 0x01, 0xc0, 0xfe, \n0x46, 0x20, 0x04, 0x01, 0xb5, 0x22, 0x85, 0x00, 0x44, 0x10, 0x00, 0xfc, 0x40, 0x04, 0x18, 0x1b, \n0x40, 0x00, 0x98, 0x1a, 0x46, 0x70, 0x04, 0x01, 0xf0, 0x81, 0x54, 0x94, 0x80, 0xff, 0x58, 0x73, \n0x85, 0x00, 0x47, 0xc0, 0x00, 0x03, 0x59, 0xce, 0x04, 0x58, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, \n0x05, 0x74, 0x46, 0xa0, 0x00, 0x03, 0x58, 0xa5, 0x03, 0xdc, 0xd5, 0x15, 0xdd, 0x3c, 0xa7, 0x31, \n0xf2, 0x01, 0xa6, 0x70, 0x40, 0x31, 0x10, 0x04, 0xa3, 0x79, 0x40, 0x01, 0xa0, 0x08, 0x40, 0x00, \n0x04, 0x04, 0x96, 0x68, 0x4b, 0xe0, 0x28, 0x01, 0xb4, 0x86, 0x8d, 0x01, 0x9c, 0xe1, 0xb6, 0x66, \n0x54, 0x84, 0x00, 0xff, 0xe3, 0x09, 0xe9, 0xeb, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x84, 0x28, \n0xdd, 0x2f, 0x46, 0x30, 0x00, 0x09, 0x02, 0x41, 0x82, 0xc0, 0x84, 0x20, 0x40, 0x02, 0x24, 0x01, \n0x97, 0x41, 0x40, 0x00, 0x94, 0x06, 0x12, 0x51, 0x82, 0xc0, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x86, \n0xa6, 0x00, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x05, 0x8a, 0x84, 0x40, 0x44, 0x10, 0x00, 0x26, \n0xae, 0xb0, 0x4c, 0x00, 0x81, 0xde, 0x5c, 0xf0, 0x00, 0x27, 0xe8, 0x35, 0x84, 0x68, 0x4c, 0x01, \n0x82, 0x45, 0xe6, 0x09, 0xe8, 0x15, 0x84, 0x83, 0x4c, 0x02, 0x01, 0x7b, 0xe6, 0x04, 0xe8, 0x08, \n0x84, 0xa1, 0xd0, 0x6e, 0x87, 0xc2, 0x4c, 0x0f, 0x42, 0x5f, 0x48, 0x00, 0x01, 0x5c, 0x84, 0x26, \n0x4c, 0x00, 0x81, 0x67, 0x84, 0x47, 0x4c, 0x01, 0x42, 0x57, 0x48, 0x00, 0x01, 0x6a, 0x84, 0x6b, \n0x4c, 0x01, 0x82, 0x35, 0xe6, 0x0c, 0xe8, 0x09, 0x84, 0x89, 0x4c, 0x02, 0x02, 0x30, 0x84, 0xaa, \n0x4c, 0x02, 0xc2, 0x4a, 0x48, 0x00, 0x02, 0x24, 0x45, 0xe0, 0x00, 0x22, 0x4c, 0x0f, 0x01, 0xa1, \n0x44, 0x10, 0x00, 0x23, 0x4c, 0x00, 0x81, 0xb8, 0x44, 0x20, 0x00, 0x20, 0x4c, 0x01, 0x42, 0x3c, \n0x48, 0x00, 0x01, 0x89, 0x44, 0x30, 0x00, 0x43, 0x4c, 0x01, 0x81, 0x79, 0x5c, 0xf0, 0x00, 0x44, \n0xe8, 0x20, 0x44, 0x40, 0x00, 0x33, 0x4c, 0x02, 0x01, 0xcc, 0x5c, 0xf0, 0x00, 0x34, 0xe8, 0x0b, \n0x44, 0x50, 0x00, 0x27, 0x4c, 0x02, 0x81, 0xa0, 0x45, 0xe0, 0x00, 0x32, 0x4c, 0x0f, 0x42, 0x24, \n0x48, 0x00, 0x01, 0xaa, 0x44, 0x10, 0x00, 0x37, 0x4c, 0x00, 0x81, 0xbb, 0x44, 0x20, 0x00, 0x42, \n0x4c, 0x01, 0x01, 0x3c, 0x44, 0x30, 0x00, 0x36, 0x4c, 0x01, 0xc2, 0x16, 0x48, 0x00, 0x01, 0xa9, \n0x44, 0x40, 0x00, 0x52, 0x4c, 0x02, 0x01, 0xb9, 0x5c, 0xf0, 0x00, 0x53, 0xe8, 0x0b, 0x44, 0x50, \n0x00, 0x46, 0x4c, 0x02, 0x81, 0x3c, 0x45, 0xe0, 0x00, 0x47, 0x4c, 0x0f, 0x42, 0x05, 0x48, 0x00, \n0x01, 0x46, 0x44, 0x10, 0x00, 0x56, 0x4c, 0x00, 0x81, 0xb6, 0x44, 0x20, 0x00, 0x57, 0x4c, 0x01, \n0x01, 0xbb, 0x44, 0x30, 0x00, 0x53, 0x4c, 0x01, 0xc1, 0xf7, 0x48, 0x00, 0x01, 0xb5, 0x46, 0x00, \n0x00, 0x09, 0x58, 0x00, 0x05, 0x7c, 0xa6, 0x00, 0x84, 0x88, 0x4c, 0x02, 0x00, 0x8b, 0xe6, 0x09, \n0xe8, 0x07, 0x84, 0xa1, 0xd0, 0x0f, 0x87, 0xc2, 0x4c, 0x0f, 0x41, 0xec, 0xd5, 0x76, 0x44, 0x10, \n0x00, 0x10, 0x4c, 0x00, 0x80, 0x89, 0x44, 0x20, 0x00, 0x12, 0x4c, 0x01, 0x41, 0xe3, 0x48, 0x00, \n0x00, 0xa3, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x00, \n0x58, 0x42, 0x02, 0x0c, 0xb4, 0x44, 0x84, 0x20, 0x58, 0x31, 0x00, 0x10, 0xb6, 0x64, 0x92, 0x00, \n0x84, 0x07, 0x9c, 0x49, 0x4c, 0x10, 0x7f, 0xfd, 0x44, 0x1f, 0xff, 0xef, 0x46, 0x00, 0x04, 0x00, \n0x40, 0x21, 0x04, 0x02, 0x58, 0x00, 0x02, 0x0c, 0xb6, 0x40, 0x47, 0xe0, 0x04, 0x00, 0x59, 0xef, \n0x02, 0x00, 0xb4, 0xbe, 0x54, 0x12, 0x80, 0x03, 0xc9, 0x12, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, \n0x82, 0x04, 0x05, 0xe0, 0x80, 0x00, 0x46, 0x3f, 0xf0, 0xff, 0x58, 0x5f, 0x00, 0x01, 0xb6, 0xa1, \n0x58, 0x31, 0x8f, 0xff, 0xb4, 0x81, 0x40, 0x22, 0x0c, 0x02, 0xd5, 0x31, 0x84, 0x41, 0x4c, 0x11, \n0x40, 0x18, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x04, 0xb4, 0x41, 0x84, 0x9e, 0x41, 0xe1, \n0x10, 0x02, 0x15, 0xe0, 0x80, 0x00, 0x46, 0x3f, 0xf0, 0xff, 0xb4, 0xa1, 0x58, 0x31, 0x8f, 0xff, \n0x40, 0x42, 0x8c, 0x02, 0xb6, 0x81, 0x46, 0x30, 0x01, 0x00, 0xb4, 0x41, 0xd5, 0x16, 0x46, 0x10, \n0x04, 0x00, 0x58, 0x10, 0x82, 0x04, 0xb4, 0x81, 0x84, 0xbe, 0x40, 0x22, 0x14, 0x02, 0xb6, 0x41, \n0x46, 0x3f, 0xf0, 0xff, 0x05, 0xe0, 0x80, 0x00, 0x58, 0x31, 0x8f, 0xff, 0x40, 0x5f, 0x0c, 0x02, \n0xb6, 0xa1, 0x46, 0x30, 0x05, 0x00, 0xb4, 0x41, 0x40, 0x21, 0x0c, 0x04, 0xb6, 0x41, 0xb4, 0x20, \n0x58, 0x10, 0x83, 0x00, 0x48, 0x00, 0x00, 0xca, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0xb0, 0xdd, 0x2f, 0x48, 0x00, 0x01, 0x6a, \n0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x04, 0x00, 0x05, 0xe0, 0x00, 0x00, 0x58, 0x1f, 0x0c, 0x00, \n0x48, 0x00, 0x00, 0xb4, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0xa0, 0xdd, 0x2f, 0xc8, 0x09, \n0x84, 0x61, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x8a, 0xae, 0xc0, 0x48, 0x00, 0x01, 0x52, \n0x46, 0x50, 0x00, 0x09, 0x58, 0x52, 0x83, 0x64, 0xa7, 0x28, 0x46, 0x20, 0x04, 0x01, 0x58, 0x21, \n0x04, 0x00, 0xb6, 0x82, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x74, 0xdd, 0x2f, \n0x48, 0x00, 0x01, 0x40, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0x46, 0x40, \n0x04, 0x01, 0x58, 0x42, 0x06, 0x60, 0x84, 0xa0, 0xb6, 0xa4, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x86, 0xd0, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, 0x85, 0x8a, 0xae, 0x08, 0x46, 0x40, \n0x04, 0x00, 0x58, 0x42, 0x02, 0x04, 0xb4, 0x44, 0x44, 0x3f, 0x00, 0xff, 0x40, 0x01, 0x0c, 0x02, \n0x58, 0x50, 0x44, 0x00, 0xb6, 0xa4, 0x46, 0x0f, 0xf0, 0xff, 0xb4, 0x44, 0x58, 0x00, 0x0f, 0xff, \n0x58, 0x31, 0x00, 0x01, 0xb6, 0x64, 0x46, 0x10, 0x04, 0x00, 0xb4, 0xa4, 0x58, 0x10, 0x82, 0x0c, \n0x40, 0x22, 0x80, 0x02, 0xb6, 0x44, 0xb4, 0x61, 0x58, 0x01, 0x83, 0x00, 0xb6, 0x01, 0x48, 0x00, \n0x01, 0x09, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x47, 0xe0, 0x00, 0x09, 0x59, 0xef, \n0x05, 0x7c, 0x46, 0x30, 0x04, 0x10, 0xb4, 0x20, 0x02, 0x2f, 0x00, 0x00, 0xd5, 0x22, 0x46, 0x00, \n0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x20, 0x04, 0x10, 0xb4, 0x20, 0xd5, 0x26, 0x46, 0x00, \n0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x30, 0x04, 0x10, 0xb4, 0x20, 0x46, 0x60, 0x00, 0x09, \n0x58, 0x63, 0x05, 0x8a, 0x48, 0x00, 0x00, 0xab, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, \n0x46, 0x20, 0x00, 0x09, 0x58, 0x21, 0x05, 0x7c, 0x46, 0x30, 0x04, 0x00, 0xb4, 0x20, 0xa4, 0x90, \n0x98, 0x4b, 0xb6, 0x20, 0xac, 0x88, 0x48, 0x00, 0x00, 0xd5, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, \n0x05, 0x74, 0x46, 0x20, 0x04, 0x00, 0xb4, 0x20, 0x98, 0xca, 0xb6, 0x60, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x87, 0x28, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0xbd, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, \n0x05, 0x74, 0x46, 0x30, 0x04, 0x00, 0xb4, 0x20, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x05, 0x8a, \n0xd5, 0x7d, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0xb4, 0x80, 0x46, 0x00, 0x00, 0x09, \n0x58, 0x00, 0x05, 0x78, 0x40, 0x12, 0x40, 0x08, 0xb6, 0x20, 0x48, 0x00, 0x00, 0xab, 0x46, 0x00, \n0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x47, 0xe0, 0x00, 0x09, 0x59, 0xef, 0x05, 0x78, 0x46, 0x50, \n0x00, 0x09, 0x58, 0x52, 0x85, 0x7c, 0xb4, 0x3e, 0xb4, 0x60, 0xa4, 0xa8, 0xd5, 0xc2, 0x46, 0x20, \n0x00, 0x09, 0x58, 0x21, 0x05, 0x78, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0xb4, 0x22, \n0xb4, 0x40, 0xd5, 0xc3, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x05, 0x78, 0x46, 0x00, 0x00, 0x09, \n0x58, 0x00, 0x05, 0x74, 0xb4, 0x26, 0xb4, 0x60, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x05, 0x8a, \n0x98, 0x4b, 0xd5, 0x45, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x40, 0x00, 0x09, \n0x58, 0x42, 0x05, 0x7c, 0x46, 0x30, 0x04, 0x20, 0xb4, 0x20, 0xa4, 0xa0, 0xd5, 0x9a, 0x46, 0x00, \n0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x20, 0x04, 0x20, 0xb4, 0x20, 0xd5, 0x9e, 0x46, 0x00, \n0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x30, 0x04, 0x20, 0xb4, 0x20, 0x46, 0x60, 0x00, 0x09, \n0x58, 0x63, 0x05, 0x8a, 0xd5, 0x23, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x50, \n0x00, 0x09, 0x58, 0x52, 0x85, 0x7c, 0x46, 0x30, 0x05, 0x00, 0xb4, 0x20, 0xa4, 0xa8, 0x48, 0xff, \n0xff, 0x79, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x20, 0x05, 0x00, 0xb4, 0x20, \n0x48, 0xff, 0xff, 0x7c, 0x46, 0x00, 0x00, 0x09, 0x58, 0x00, 0x05, 0x74, 0x46, 0x30, 0x05, 0x00, \n0xb4, 0x20, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x05, 0x8a, 0x98, 0x4b, 0xb6, 0x20, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0xa0, 0xdd, 0x2f, 0xc8, 0x02, 0xd5, 0x1a, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x87, 0x88, 0xdd, 0x2f, 0xd5, 0x25, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x88, 0x80, 0xdd, 0x2f, 0xd5, 0x1c, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x87, 0xa0, 0xdd, 0x2f, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x05, 0x8a, 0xc8, 0x03, 0x84, 0x01, \n0xd5, 0x10, 0x46, 0x20, 0x00, 0x09, 0x58, 0x21, 0x05, 0x86, 0x01, 0xe1, 0x00, 0x00, 0x56, 0x0f, \n0x00, 0x0b, 0x5c, 0x00, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x87, 0xec, 0xdd, 0x2f, \n0xae, 0x30, 0xd5, 0x07, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x5c, 0xdd, 0x2f, 0xd5, 0x06, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x80, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x09, 0x58, 0x10, \n0x85, 0x8a, 0x20, 0x00, 0x80, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x87, 0x20, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, \n0x83, 0x9c, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x10, 0x04, 0x52, 0x02, 0x01, 0x40, 0x22, 0xa0, 0x08, \n0x92, 0x48, 0x14, 0x22, 0x02, 0x01, 0x84, 0x0a, 0x46, 0x10, 0x00, 0x05, 0x58, 0x10, 0x81, 0xe8, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0x78, 0xdd, 0x2f, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x01, 0xc4, 0x84, 0x02, 0x46, 0x10, 0x00, 0x04, 0x58, 0x10, 0x84, 0x10, 0xdd, 0x26, 0x84, 0x01, \n0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x87, 0x8c, 0xdd, 0x26, 0x84, 0x0c, 0x46, 0x10, 0x00, 0x03, \n0x58, 0x10, 0x84, 0x9c, 0xdd, 0x26, 0x46, 0x10, 0x00, 0x01, 0x58, 0x10, 0x82, 0xfc, 0x84, 0x0f, \n0xdd, 0x26, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x05, 0xc4, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x81, 0x6c, 0xdd, 0x2f, 0x84, 0x20, 0x80, 0x81, 0x46, 0x20, 0x00, 0x08, 0x58, 0x21, 0x0b, 0x60, \n0x44, 0x30, 0x08, 0x00, 0x46, 0x00, 0x00, 0x05, 0x58, 0x00, 0x00, 0x24, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x81, 0x20, 0xdd, 0x2f, 0x84, 0x00, 0x46, 0x10, 0x00, 0x08, 0x58, 0x10, 0x8a, 0x48, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0xe4, 0xdd, 0x2f, 0x46, 0x00, 0x04, 0x00, 0x84, 0x21, \n0x14, 0x10, 0x00, 0x8c, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xe0, 0xdd, 0x2f, 0x84, 0x00, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x80, 0x00, 0x02, \n0x58, 0x84, 0x07, 0x84, 0x80, 0xe0, 0x5c, 0x00, 0x00, 0x10, 0x80, 0xc1, 0x4b, 0xe0, 0x20, 0x01, \n0x84, 0x20, 0x40, 0x00, 0x98, 0x06, 0x4b, 0xe0, 0x20, 0x01, 0x95, 0xfa, 0x46, 0x00, 0x00, 0x09, \n0x58, 0x00, 0x05, 0x24, 0x99, 0xf8, 0xb6, 0xc7, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x46, 0x70, 0x00, 0x02, 0x58, 0x73, 0x87, 0x84, 0x84, 0x01, \n0x4b, 0xe0, 0x1c, 0x01, 0x46, 0xf0, 0x00, 0x09, 0x04, 0x67, 0x81, 0x53, 0x84, 0x00, 0x40, 0x00, \n0x18, 0x06, 0x4b, 0xe0, 0x1c, 0x01, 0xdd, 0x26, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, \n0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x05, 0xa0, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0xa8, \n0xb6, 0x20, 0x48, 0xff, 0xd8, 0x43, 0xdd, 0x9e, 0x64, 0x12, 0x00, 0x02, 0x96, 0x4c, 0x64, 0x02, \n0x00, 0x43, 0x64, 0x00, 0x00, 0x08, 0xb6, 0x20, 0xdd, 0x9e, 0x92, 0x00, 0x64, 0x12, 0x00, 0x02, \n0x42, 0x10, 0x80, 0x09, 0x40, 0x10, 0x80, 0x04, 0x64, 0x12, 0x00, 0x03, 0x64, 0x00, 0x00, 0x08, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x64, 0x12, 0x00, 0x43, 0x64, 0x00, 0x00, 0x08, \n0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x05, 0xa0, 0x04, 0x03, 0x00, 0x0b, 0xc0, 0x02, 0xdd, 0x20, \n0x04, 0x03, 0x00, 0x0c, 0xc0, 0x02, 0xdd, 0x20, 0x04, 0x23, 0x00, 0x08, 0x44, 0x10, 0x03, 0x00, \n0x54, 0x01, 0x03, 0x00, 0x4c, 0x00, 0xff, 0xf2, 0x64, 0x00, 0x00, 0x00, 0xd5, 0xee, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x37, 0x81, 0x70, 0x40, 0x43, \n0x18, 0x05, 0x40, 0x22, 0x0c, 0x02, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x27, 0x81, 0x70, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, 0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x37, \n0x81, 0x70, 0xf0, 0x01, 0x40, 0x23, 0x0c, 0x04, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x27, 0x81, 0x70, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, 0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x80, 0xc1, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x07, \n0x81, 0x73, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x67, 0x81, 0x74, 0xc8, 0x08, 0x44, 0x00, 0x01, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0xa4, 0xdd, 0x2f, 0xce, 0x08, 0x44, 0x00, 0x02, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0xa4, 0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa8, 0xbc, 0x44, 0x50, 0x00, 0x14, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x05, 0xa8, \n0x42, 0x60, 0x94, 0x73, 0x80, 0xe0, 0x81, 0x43, 0x50, 0x03, 0x00, 0x0c, 0xa8, 0x71, 0x84, 0x20, \n0x81, 0x22, 0x81, 0x04, 0xa8, 0x72, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x81, 0x6c, 0xdd, 0x2f, \n0x50, 0x35, 0x7f, 0xb8, 0x40, 0x24, 0x8c, 0x00, 0x58, 0x44, 0x00, 0x08, 0x84, 0x0a, 0xb6, 0x46, \n0xa9, 0xd1, 0xb6, 0x82, 0xa8, 0x12, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0xa8, 0x01, 0xb6, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xa0, 0x81, 0xb6, 0x01, 0xa8, 0x89, 0xb6, 0x22, 0xa8, 0x41, 0xdd, 0x9e, \n0xb4, 0x20, 0x4c, 0x10, 0x40, 0x04, 0x84, 0x20, 0xd5, 0x07, 0xa0, 0xc9, 0xb4, 0x81, 0xb6, 0x83, \n0xb4, 0x01, 0xa0, 0x89, 0xa8, 0x81, 0x80, 0x01, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x20, 0x00, 0x09, \n0x04, 0x11, 0x01, 0x5c, 0x98, 0x01, 0x14, 0x01, 0x01, 0x5c, 0x80, 0x01, 0xdd, 0x9e, 0x92, 0x00, \n0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x85, 0xd4, 0x46, 0xf0, 0x00, 0x09, 0x14, 0x17, 0x81, 0x5c, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x50, 0x00, 0x0c, 0x58, 0x52, 0x81, 0x80, 0x38, 0x12, 0x82, 0x0a, \n0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x00, 0xa0, 0x8d, 0x84, 0x61, 0x40, 0x41, 0x80, 0x0c, \n0x40, 0x02, 0x08, 0x04, 0xa8, 0x0d, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x00, \n0x04, 0x00, 0x58, 0x00, 0x02, 0x00, 0xa0, 0x44, 0x96, 0x08, 0x54, 0x20, 0x00, 0x08, 0xc2, 0x06, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x63, 0xd5, 0x7b, 0x54, 0x30, 0x00, 0x10, 0xc3, 0x06, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x64, 0xd5, 0x73, 0x54, 0x50, 0x00, 0x20, 0xc5, 0x06, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x65, 0xd5, 0x6b, 0x54, 0x20, 0x00, 0x02, 0xc2, 0x06, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x61, 0xd5, 0x63, 0x96, 0xc4, 0xc3, 0x06, 0x46, 0xf0, \n0x00, 0x0c, 0x04, 0x07, 0x80, 0x60, 0xd5, 0x5c, 0x54, 0x40, 0x00, 0x04, 0xc4, 0x06, 0x46, 0xf0, \n0x00, 0x0c, 0x04, 0x07, 0x80, 0x62, 0xd5, 0x54, 0x40, 0x20, 0xa0, 0x09, 0x96, 0x10, 0x55, 0xe0, \n0x00, 0x01, 0x4f, 0xe2, 0x00, 0x07, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x68, 0xd5, 0x48, \n0x54, 0x30, 0x00, 0x02, 0xc3, 0x06, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x69, 0xd5, 0x40, \n0x54, 0x40, 0x00, 0x04, 0xc4, 0x06, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x6a, 0xd5, 0x38, \n0x55, 0xe0, 0x00, 0x08, 0x4f, 0xe2, 0x00, 0x07, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x6b, \n0xd5, 0x2f, 0x54, 0x30, 0x00, 0x10, 0xc3, 0x06, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x6c, \n0xd5, 0x27, 0x54, 0x40, 0x00, 0x20, 0xc4, 0x06, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x6d, \n0xd5, 0x1f, 0x54, 0x50, 0x00, 0x40, 0xc5, 0x06, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x6e, \n0xd5, 0x17, 0x54, 0x20, 0x00, 0x80, 0xc2, 0x06, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x6f, \n0xd5, 0x0f, 0x40, 0x00, 0xc0, 0x09, 0x96, 0x00, 0x97, 0x04, 0xc4, 0x02, 0xd5, 0x05, 0x54, 0x10, \n0x00, 0x02, 0x96, 0x08, 0xc0, 0x05, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0x70, 0xdd, 0x20, \n0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0x3c, 0x84, 0x44, 0x96, 0x49, \n0x4c, 0x11, 0x40, 0x27, 0xb4, 0x20, 0x4e, 0x14, 0x00, 0x65, 0x46, 0x50, 0x00, 0x0c, 0x84, 0xe0, \n0x00, 0x32, 0x82, 0x00, 0x10, 0x72, 0x82, 0x00, 0x46, 0x40, 0x00, 0x0c, 0x46, 0xf0, 0x00, 0x0c, \n0x00, 0x57, 0x82, 0x04, 0x00, 0x12, 0x02, 0x02, 0x40, 0x61, 0xc0, 0x08, 0x10, 0x52, 0x02, 0x02, \n0x46, 0xf0, 0x00, 0x0c, 0x10, 0x37, 0x82, 0x01, 0x40, 0x63, 0x04, 0x04, 0x84, 0x40, 0x46, 0xf0, \n0x00, 0x0c, 0x10, 0x17, 0x82, 0x03, 0xb6, 0x40, 0x80, 0x22, 0xb6, 0xc0, 0xd5, 0x43, 0xe6, 0x38, \n0xe9, 0x40, 0x80, 0x20, 0xa3, 0x49, 0x96, 0xec, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x37, 0x82, 0x05, \n0xb4, 0x81, 0x40, 0x22, 0x60, 0x09, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x27, 0x82, 0x06, 0xb4, 0xa1, \n0x40, 0x32, 0xc0, 0x09, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x37, 0x82, 0x07, 0xb4, 0x81, 0x50, 0x60, \n0x00, 0x08, 0x40, 0x22, 0x20, 0x09, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x27, 0x82, 0x08, 0xb4, 0xa1, \n0x50, 0x70, 0x00, 0x0c, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x57, 0x82, 0x09, 0xb4, 0x86, 0x50, 0x50, \n0x00, 0x10, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x47, 0x80, 0x83, 0xb4, 0xc7, 0x50, 0x40, 0x00, 0x14, \n0x46, 0xf0, 0x00, 0x0c, 0x10, 0x67, 0x82, 0x04, 0xb4, 0x65, 0x84, 0x20, 0x46, 0xf0, 0x00, 0x0c, \n0x12, 0x37, 0x81, 0x08, 0xb4, 0xe4, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x77, 0x82, 0x12, 0xd5, 0x02, \n0x84, 0x21, 0x80, 0x01, 0x3a, 0x6f, 0x9c, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x84, 0x00, 0xdd, 0x9e, \n0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x07, 0x82, 0x05, 0xc8, 0x0f, \n0x46, 0xf0, 0x00, 0x0c, 0x12, 0x07, 0x81, 0x0a, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x07, 0x82, 0x02, \n0x46, 0xf0, 0x00, 0x0c, 0x10, 0x07, 0x82, 0x00, 0x48, 0x00, 0x00, 0xca, 0x46, 0x30, 0x00, 0x0c, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x47, 0x80, 0x5c, 0x04, 0x51, 0x80, 0x86, 0xe2, 0xa4, 0x4e, 0xf2, \n0x00, 0xbf, 0x14, 0x41, 0x80, 0x86, 0x44, 0x10, 0x00, 0xb8, 0x84, 0x41, 0x84, 0x00, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x87, 0x68, 0xdd, 0x2f, 0x50, 0x2f, 0x80, 0x04, 0x84, 0x00, 0x44, 0x10, \n0x00, 0xb9, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf2, 0x01, 0x46, 0x00, \n0x00, 0x0c, 0x58, 0x00, 0x02, 0x14, 0x97, 0xd4, 0x4e, 0x72, 0x00, 0x9f, 0xa4, 0x40, 0x46, 0xf0, \n0x00, 0x0c, 0x03, 0xe7, 0x81, 0x08, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x02, 0xe2, 0x3e, \n0xe8, 0x0d, 0x46, 0x40, 0x00, 0x0c, 0x00, 0x52, 0x02, 0x00, 0xa6, 0x80, 0x9c, 0xe9, 0x10, 0x32, \n0x02, 0x00, 0xc2, 0x0c, 0x9f, 0x91, 0xaf, 0x80, 0xd5, 0x09, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x17, \n0x82, 0x04, 0xa7, 0xc0, 0xe2, 0xe1, 0xe8, 0x02, 0xae, 0x40, 0x84, 0xa0, 0x46, 0xf0, 0x00, 0x0c, \n0x12, 0x57, 0x81, 0x0a, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0x68, 0x44, 0x10, 0x00, 0xb8, \n0x84, 0x45, 0x84, 0x00, 0xdd, 0x26, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x27, 0x82, 0x06, 0x44, 0x10, \n0x00, 0xb9, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb8, 0x84, 0x42, 0x84, 0x00, 0xdd, 0x26, \n0x46, 0xf0, 0x00, 0x0c, 0x00, 0x27, 0x82, 0x09, 0x44, 0x10, 0x00, 0xb9, 0x84, 0x00, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0xb8, 0x84, 0x43, 0x84, 0x00, 0xdd, 0x26, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x27, \n0x82, 0x08, 0x44, 0x10, 0x00, 0xb9, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb8, 0x84, 0x44, \n0x84, 0x00, 0xdd, 0x26, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x27, 0x82, 0x07, 0x84, 0x00, 0x44, 0x10, \n0x00, 0xb9, 0xdd, 0x26, 0x46, 0x70, 0x00, 0x0c, 0x58, 0x73, 0x82, 0x0c, 0x44, 0x10, 0x00, 0xb8, \n0x84, 0x49, 0x84, 0x00, 0xdd, 0x26, 0xa6, 0xbb, 0x44, 0x10, 0x00, 0xb9, 0x84, 0x00, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0xb8, 0x84, 0x48, 0x84, 0x00, 0xdd, 0x26, 0xa6, 0xba, 0x44, 0x10, 0x00, 0xb9, \n0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb8, 0x84, 0x47, 0x84, 0x00, 0xdd, 0x26, 0xa6, 0xb9, \n0x44, 0x10, 0x00, 0xb9, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb8, 0x84, 0x46, 0x84, 0x00, \n0xdd, 0x26, 0xa6, 0xb8, 0x44, 0x10, 0x00, 0xb9, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb8, \n0x84, 0x41, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb9, 0x84, 0x41, 0x84, 0x00, 0xdd, 0x26, \n0x84, 0x00, 0x44, 0x10, 0x00, 0xb8, 0x80, 0x40, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xb9, 0x84, 0x41, \n0x84, 0x00, 0xdd, 0x26, 0xd5, 0x04, 0xa5, 0xc0, 0x9d, 0xb9, 0xad, 0x80, 0xec, 0x0c, 0x3a, 0x6f, \n0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0x3c, 0xef, 0xf4, 0x46, 0x30, 0x04, 0x10, 0x54, 0x80, \n0x00, 0x0f, 0x58, 0x31, 0x85, 0x00, 0x40, 0x84, 0x38, 0x08, 0x84, 0x80, 0x54, 0x70, 0x80, 0x3f, \n0xb4, 0xa3, 0xf5, 0x81, 0x00, 0x5f, 0x80, 0x07, 0x54, 0x52, 0x80, 0x80, 0x97, 0x68, 0xcd, 0x3c, \n0xf5, 0x81, 0x00, 0x9f, 0x80, 0x07, 0x42, 0x94, 0x98, 0x09, 0x00, 0x6f, 0x80, 0x05, 0x92, 0xc6, \n0x95, 0xb6, 0x44, 0xaf, 0xff, 0x80, 0x40, 0x94, 0xa8, 0x04, 0x40, 0x63, 0x1c, 0x04, 0x10, 0x9f, \n0x80, 0x07, 0x10, 0x6f, 0x80, 0x05, 0x44, 0x9c, 0x3f, 0xff, 0xf6, 0x01, 0x40, 0x63, 0x24, 0x02, \n0x40, 0x63, 0x20, 0x04, 0xf6, 0x81, 0xb6, 0xc3, 0xb4, 0xc3, 0x9d, 0x69, 0xf6, 0x81, 0x00, 0x6f, \n0x80, 0x07, 0x54, 0x63, 0x00, 0x80, 0xc6, 0x05, 0x44, 0xa0, 0x00, 0x64, 0x4c, 0x55, 0x7f, 0xf6, \n0x00, 0x5f, 0x80, 0x07, 0x54, 0x52, 0x80, 0x80, 0xcd, 0x0f, 0x00, 0x5f, 0x80, 0x05, 0x54, 0x52, \n0x80, 0x3f, 0xd9, 0x0a, 0xf5, 0x01, 0x92, 0xae, 0x54, 0x52, 0x80, 0x0f, 0xd8, 0x05, 0x00, 0x0f, \n0x80, 0x04, 0xb6, 0x02, 0xd5, 0x05, 0x9d, 0x21, 0x44, 0x50, 0x00, 0x64, 0xdc, 0xba, 0xf1, 0x01, \n0x40, 0x00, 0xfc, 0x09, 0xec, 0x0c, 0x3a, 0x6f, 0xa8, 0x04, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, \n0xef, 0xf8, 0x46, 0x30, 0x04, 0x10, 0x84, 0x80, 0x05, 0xe1, 0x81, 0x40, 0x9d, 0x21, 0x15, 0xef, \n0x80, 0x01, 0x00, 0x6f, 0x80, 0x07, 0x54, 0x53, 0x00, 0x80, 0xc5, 0x04, 0x44, 0x50, 0x00, 0x64, \n0xdc, 0xf4, 0x00, 0x5f, 0x80, 0x07, 0x44, 0x3f, 0xff, 0xc0, 0x41, 0xe2, 0x8c, 0x04, 0x11, 0xef, \n0x80, 0x07, 0x54, 0x40, 0x00, 0x0f, 0xf3, 0x01, 0x44, 0x6c, 0x3f, 0xff, 0x40, 0x52, 0x38, 0x08, \n0x41, 0xe1, 0x98, 0x02, 0x40, 0x3f, 0x14, 0x04, 0xf3, 0x81, 0x01, 0xef, 0x80, 0x05, 0x54, 0x40, \n0x80, 0x3f, 0x40, 0x6f, 0x18, 0x09, 0x95, 0xb6, 0x40, 0x33, 0x10, 0x04, 0x10, 0x2f, 0x80, 0x04, \n0x10, 0x3f, 0x80, 0x05, 0x46, 0x20, 0x04, 0x10, 0xf6, 0x01, 0x14, 0x61, 0x01, 0x40, 0x80, 0x5f, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0x84, 0x01, 0xec, 0x08, 0x3a, 0x6f, \n0x98, 0x84, 0xdd, 0x9e, 0xef, 0xf8, 0x46, 0x00, 0x04, 0x11, 0x58, 0x00, 0x00, 0x1c, 0x84, 0x60, \n0xb4, 0x80, 0xf4, 0x81, 0x00, 0x5f, 0x80, 0x06, 0x54, 0x42, 0x80, 0x02, 0x97, 0x20, 0xcc, 0x23, \n0xf4, 0x81, 0x10, 0x1f, 0x80, 0x05, 0x00, 0x5f, 0x80, 0x06, 0x58, 0x52, 0x80, 0x03, 0x10, 0x5f, \n0x80, 0x06, 0xf5, 0x01, 0xb6, 0xa0, 0xb4, 0xa0, 0x9d, 0x21, 0xf5, 0x81, 0x00, 0x5f, 0x80, 0x06, \n0x54, 0x52, 0x80, 0x02, 0xc5, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdc, 0xf6, 0x00, 0x5f, 0x80, 0x06, \n0x54, 0x42, 0x80, 0x02, 0xcc, 0x08, 0x00, 0x5f, 0x80, 0x05, 0xd9, 0x05, 0x00, 0x0f, 0x80, 0x04, \n0xb6, 0x02, 0xd5, 0x05, 0x9c, 0xd9, 0x44, 0x50, 0x00, 0x64, 0xdb, 0xd3, 0xf1, 0x01, 0x42, 0x00, \n0xc4, 0x0b, 0xec, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, 0x46, 0x30, \n0x04, 0x11, 0x84, 0x80, 0xa1, 0x5f, 0x9d, 0x21, 0xf5, 0x81, 0x01, 0xef, 0x80, 0x06, 0x54, 0x5f, \n0x00, 0x02, 0xc5, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdc, 0xf6, 0x84, 0xa0, 0x84, 0x82, 0xf5, 0x81, \n0x10, 0x2f, 0x80, 0x04, 0x10, 0x4f, 0x80, 0x06, 0x10, 0x1f, 0x80, 0x05, 0x80, 0x43, 0xf3, 0x01, \n0xa8, 0xd7, 0x80, 0x5f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0x84, 0x01, \n0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, 0x46, 0x20, \n0x04, 0x11, 0x80, 0x80, 0x84, 0x60, 0x05, 0xe1, 0x00, 0x07, 0x9c, 0xd9, 0x15, 0xef, 0x80, 0x01, \n0x00, 0x5f, 0x80, 0x06, 0x54, 0x02, 0x80, 0x02, 0xc0, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdb, 0xf4, \n0x84, 0x62, 0x84, 0x00, 0xf0, 0x81, 0x10, 0x3f, 0x80, 0x06, 0x10, 0x1f, 0x80, 0x04, 0x10, 0x4f, \n0x80, 0x05, 0xf1, 0x01, 0xa8, 0x57, 0x80, 0x24, 0x80, 0x5f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x86, 0xf4, 0xdd, 0x2f, 0x84, 0x01, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xc4, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x05, 0xb4, 0x84, 0x22, \n0x50, 0x2f, 0x80, 0x2c, 0x84, 0x04, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x1c, 0x50, 0x2f, 0x80, 0x28, \n0x84, 0x04, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x1d, 0x50, 0x2f, 0x80, 0x24, 0x84, 0x04, 0xdd, 0x28, \n0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x20, 0x84, 0x04, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x11, \n0x50, 0x2f, 0x80, 0x1c, 0x84, 0x05, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, 0x80, 0x18, \n0x84, 0x05, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x14, 0x84, 0x05, 0xdd, 0x28, \n0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x10, 0x84, 0x05, 0xdd, 0x28, 0x46, 0x70, 0x04, 0x10, \n0x46, 0x6f, 0xf0, 0x00, 0x46, 0xa0, 0x04, 0x10, 0x47, 0xc0, 0x00, 0x80, 0x46, 0x80, 0x04, 0x11, \n0x58, 0x73, 0x80, 0x80, 0x58, 0x63, 0x00, 0x03, 0x58, 0xa5, 0x04, 0x00, 0x59, 0xce, 0x0c, 0x00, \n0x58, 0x84, 0x02, 0x04, 0x85, 0x23, 0xb6, 0xc7, 0x15, 0xc5, 0x00, 0x00, 0xb7, 0x28, 0x46, 0x70, \n0x00, 0x03, 0x58, 0x73, 0x85, 0x28, 0x84, 0x01, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x40, 0x04, 0x10, \n0x46, 0x00, 0x04, 0x10, 0x46, 0x20, 0x18, 0xca, 0x58, 0x42, 0x05, 0x0c, 0x44, 0x50, 0x00, 0x17, \n0x44, 0x30, 0x00, 0x1f, 0x58, 0x00, 0x05, 0x04, 0x58, 0x21, 0x00, 0x08, 0x84, 0x38, 0xb6, 0xa4, \n0xb6, 0x60, 0xb6, 0x44, 0xb6, 0x20, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0x44, 0x10, \n0x00, 0x11, 0x44, 0x20, 0x00, 0x99, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, \n0x00, 0x99, 0x84, 0x00, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, 0x84, 0x49, 0x84, 0x00, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x14, 0x44, 0x20, 0x00, 0x51, 0x84, 0x00, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x20, \n0x00, 0x8e, 0x84, 0x00, 0xdd, 0x26, 0x84, 0x21, 0x80, 0x41, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x01, \n0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x22, 0x44, 0x20, 0x00, 0x81, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x1c, 0x44, 0x20, 0x00, 0x5a, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x1d, 0x44, 0x20, \n0x00, 0x68, 0x84, 0x04, 0xdd, 0x26, 0x85, 0x00, 0x84, 0x01, 0x4b, 0xe0, 0x1c, 0x01, 0x83, 0x88, \n0x81, 0x48, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x87, 0xb8, 0x50, 0x6f, 0x80, 0x34, 0x84, 0x24, \n0x44, 0x00, 0x00, 0x2f, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x40, 0x44, 0x00, 0x00, 0x16, 0xdd, 0x29, \n0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x28, 0xdd, 0x2f, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x2f, 0xdd, 0x29, 0x80, 0x46, 0x44, 0x10, 0x00, 0x31, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0x84, 0x20, 0x44, 0x00, 0x00, 0x16, 0xdd, 0x29, 0x84, 0x21, \n0x44, 0x00, 0x00, 0x15, 0xdd, 0x29, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x29, 0xf3, 0x0d, \n0x54, 0x44, 0x00, 0xff, 0x8d, 0x01, 0x44, 0x10, 0x00, 0x1d, 0x84, 0x04, 0x50, 0x24, 0x00, 0x68, \n0x40, 0xfe, 0x0c, 0x06, 0xe8, 0x03, 0x83, 0x83, 0x81, 0x44, 0x87, 0xc8, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x86, 0x6c, 0x4c, 0x8f, 0x00, 0x04, 0xdd, 0x27, 0xd5, 0xc2, 0x80, 0x4a, 0x44, 0x10, \n0x00, 0x1d, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x1c, 0x44, 0x20, 0x00, 0x59, 0x84, 0x04, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x1d, 0x84, 0x49, 0x84, 0x04, 0xdd, 0x27, 0x85, 0x00, 0x46, 0x10, \n0x00, 0x03, 0x58, 0x10, 0x85, 0x28, 0x84, 0x01, 0x4b, 0xe0, 0x04, 0x01, 0x14, 0x8f, 0x80, 0x02, \n0x81, 0x48, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x87, 0xb8, 0x50, 0x6f, 0x80, 0x34, 0x47, 0xc0, \n0x00, 0x05, 0x59, 0xce, 0x06, 0xf4, 0x84, 0x24, 0x44, 0x00, 0x00, 0x2f, 0xdd, 0x29, 0x44, 0x10, \n0x00, 0x40, 0x44, 0x00, 0x00, 0x16, 0xdd, 0x29, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x85, 0x28, 0xdd, 0x2f, 0x84, 0x20, 0x44, 0x00, 0x00, 0x2f, 0xdd, 0x29, 0x80, 0x46, 0x44, 0x10, \n0x00, 0x31, 0x84, 0x00, 0xdd, 0x3c, 0x84, 0x20, 0x44, 0x00, 0x00, 0x16, 0xdd, 0x29, 0x84, 0x21, \n0x44, 0x00, 0x00, 0x15, 0xdd, 0x29, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x29, 0x84, 0x04, \n0x54, 0x44, 0x00, 0xff, 0xf3, 0x0d, 0x8d, 0x01, 0xf5, 0x02, 0x40, 0x24, 0x00, 0x0c, 0x44, 0x10, \n0x00, 0x1c, 0x8c, 0x49, 0xe2, 0xa3, 0xe8, 0x03, 0xf3, 0x82, 0x81, 0x44, 0x84, 0x88, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x86, 0x6c, 0x4c, 0x82, 0x00, 0x04, 0xdd, 0x27, 0xd5, 0xc5, 0x40, 0x95, \n0x10, 0x08, 0x80, 0x49, 0x44, 0x10, 0x00, 0x1c, 0x84, 0x04, 0xdd, 0x27, 0x54, 0x14, 0x80, 0xff, \n0xb6, 0x3f, 0x84, 0x40, 0x84, 0x22, 0x84, 0x04, 0xdd, 0x27, 0xb4, 0xbf, 0x46, 0x60, 0x04, 0x10, \n0x46, 0x86, 0x00, 0xc2, 0x58, 0x22, 0x80, 0x08, 0x44, 0x10, 0x00, 0x1c, 0x58, 0x63, 0x05, 0x0c, \n0x84, 0x04, 0x58, 0x84, 0x00, 0x3f, 0xdd, 0x27, 0xb7, 0x06, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, \n0x00, 0x27, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xf1, 0x84, 0x05, 0xdd, 0x27, 0x47, 0xc6, \n0x00, 0xc2, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0xa1, 0x84, 0x05, 0xdd, 0x27, 0x59, 0xce, \n0x00, 0x38, 0x44, 0x10, 0x00, 0x14, 0x84, 0x41, 0x46, 0xa0, 0x04, 0x10, 0x84, 0x05, 0xdd, 0x27, \n0x15, 0xc3, 0x00, 0x00, 0x14, 0xaf, 0x80, 0x03, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x87, 0xb8, \n0x44, 0x00, 0x00, 0x17, 0x44, 0x10, 0x00, 0x10, 0xdd, 0x29, 0xf3, 0x03, 0x84, 0x00, 0x58, 0x31, \n0x80, 0x7c, 0xf3, 0x83, 0xf0, 0x81, 0x81, 0x49, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, 0x05, 0xb4, \n0x50, 0x9f, 0x80, 0x30, 0xf4, 0x01, 0xf2, 0x02, 0x05, 0xef, 0x80, 0x00, 0x54, 0x82, 0x00, 0x07, \n0x40, 0x24, 0x20, 0x1a, 0x41, 0xe4, 0x20, 0x1a, 0x97, 0xa0, 0xf2, 0x82, 0x15, 0xef, 0x80, 0x00, \n0xe6, 0xc8, 0xe8, 0x0f, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2b, 0x84, 0x04, 0xdd, 0x3c, 0xf5, 0x0c, \n0xf0, 0x01, 0x54, 0x32, 0x80, 0xf8, 0x44, 0x10, 0x00, 0x2b, 0x40, 0x20, 0x0c, 0x04, 0xd5, 0x24, \n0xe6, 0xd0, 0xe8, 0x10, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2b, 0x84, 0x04, 0xdd, 0x3c, 0xf2, 0x0c, \n0x40, 0x14, 0x10, 0x08, 0x54, 0x31, 0x00, 0x8f, 0x40, 0x20, 0x8c, 0x04, 0x44, 0x10, 0x00, 0x2b, \n0xd5, 0x13, 0xe6, 0xd8, 0xe8, 0x14, 0x80, 0x49, 0x44, 0x10, 0x00, 0x11, 0x84, 0x04, 0xdd, 0x3c, \n0xf3, 0x01, 0xf0, 0x0c, 0x54, 0x51, 0x80, 0x0f, 0x95, 0x2b, 0x54, 0x30, 0x00, 0xc7, 0x40, 0x22, \n0x0c, 0x04, 0x44, 0x10, 0x00, 0x11, 0x84, 0x04, 0xf3, 0x8c, 0xd5, 0x12, 0x44, 0x10, 0x00, 0x11, \n0x80, 0x49, 0x84, 0x04, 0xdd, 0x3c, 0x44, 0x50, 0x00, 0x18, 0x40, 0x03, 0x14, 0x97, 0xf1, 0x0c, \n0x84, 0x04, 0x54, 0x20, 0x80, 0xf8, 0xf2, 0x8c, 0x84, 0x2e, 0x40, 0x22, 0x08, 0x04, 0xdd, 0x27, \n0x84, 0x2a, 0x44, 0x00, 0x00, 0xf1, 0xdd, 0x2a, 0x84, 0x20, 0x44, 0x00, 0x00, 0xf2, 0xdd, 0x2a, \n0x84, 0x20, 0x84, 0x04, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x31, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x2a, \n0x84, 0x24, 0x84, 0x01, 0xdd, 0x2a, 0x84, 0x21, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x2a, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, 0x44, 0x00, \n0x00, 0x9f, 0x44, 0x10, 0x00, 0x9b, 0xdd, 0x2a, 0x84, 0x00, 0xd5, 0x0b, 0x92, 0x00, 0x87, 0xc7, \n0x9c, 0x49, 0x4c, 0x1f, 0x7f, 0xfd, 0x9c, 0x01, 0x44, 0x30, 0x01, 0x2c, 0x4c, 0x01, 0x80, 0x04, \n0x84, 0x20, 0xd5, 0xf5, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x2a, 0x84, 0x00, 0xd5, 0x0a, \n0x92, 0x00, 0x84, 0x47, 0x9c, 0x49, 0x4c, 0x11, 0x7f, 0xfd, 0x9c, 0x01, 0x84, 0x8a, 0x4c, 0x02, \n0x00, 0x04, 0x84, 0x20, 0xd5, 0xf6, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x2a, 0x44, 0x10, \n0x00, 0xba, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x10, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x2a, 0xf3, 0x03, 0x44, 0x10, 0x00, 0x30, 0x44, 0x00, 0x00, 0x9f, 0xb4, 0x43, 0xdd, 0x2a, \n0xf5, 0x03, 0xf1, 0x02, 0xb4, 0x05, 0xe2, 0x20, 0xe8, 0x05, 0xf0, 0x82, 0x54, 0x03, 0x00, 0x07, \n0xb6, 0x1f, 0x87, 0xc7, 0x4c, 0x8f, 0x40, 0x90, 0x4c, 0x64, 0x40, 0x32, 0x80, 0x49, 0x44, 0x10, \n0x00, 0x2b, 0x84, 0x04, 0xdd, 0x3c, 0xf4, 0x0c, 0xb4, 0x5f, 0x54, 0x82, 0x00, 0xf8, 0x40, 0x61, \n0x20, 0x04, 0xf6, 0x8c, 0x80, 0x46, 0x44, 0x10, 0x00, 0x2b, 0x84, 0x04, 0xdd, 0x27, 0x80, 0x49, \n0x44, 0x10, 0x00, 0x2c, 0x84, 0x04, 0xdd, 0x3c, 0xf3, 0x0c, 0xb4, 0x1f, 0x54, 0x51, 0x80, 0xf8, \n0x40, 0x40, 0x14, 0x04, 0xf4, 0x8c, 0x80, 0x44, 0x44, 0x10, 0x00, 0x2c, 0x84, 0x04, 0xdd, 0x27, \n0x80, 0x49, 0x44, 0x10, 0x00, 0x2d, 0x84, 0x04, 0xdd, 0x3c, 0xf2, 0x0c, 0xb5, 0x1f, 0x54, 0x61, \n0x00, 0xf8, 0x44, 0x10, 0x00, 0x2d, 0x40, 0x34, 0x18, 0x04, 0xd5, 0x32, 0x84, 0x2f, 0x4c, 0x60, \n0xc0, 0x32, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2b, 0x84, 0x04, 0xdd, 0x3c, 0xf5, 0x0c, 0xb4, 0x1f, \n0x54, 0x12, 0x80, 0x8f, 0x95, 0x84, 0x40, 0x43, 0x04, 0x04, 0xf4, 0x8c, 0x80, 0x44, 0x44, 0x10, \n0x00, 0x2b, 0x84, 0x04, 0xdd, 0x27, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2c, 0x84, 0x04, 0xdd, 0x3c, \n0xf2, 0x0c, 0x44, 0x10, 0x00, 0x2c, 0x54, 0x81, 0x00, 0x8f, 0x40, 0x33, 0x20, 0x04, 0xf3, 0x8c, \n0x80, 0x43, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x2d, 0x80, 0x49, 0x84, 0x04, 0xdd, 0x3c, \n0xf0, 0x0c, 0x44, 0x10, 0x00, 0x2d, 0x54, 0x50, 0x00, 0x8f, 0x40, 0x33, 0x14, 0x04, 0x80, 0x43, \n0xd5, 0x15, 0x45, 0xe0, 0x00, 0x17, 0x4c, 0x6f, 0x40, 0x14, 0x80, 0x49, 0x44, 0x10, 0x00, 0x11, \n0x84, 0x04, 0xdd, 0x3c, 0xb4, 0x5f, 0xf3, 0x0c, 0x40, 0x81, 0x0c, 0x08, 0x54, 0x61, 0x80, 0xc3, \n0x40, 0x34, 0x18, 0x04, 0x80, 0x43, 0x44, 0x10, 0x00, 0x11, 0x84, 0x04, 0xd5, 0x12, 0x44, 0x40, \n0x00, 0x1f, 0x4c, 0x62, 0x40, 0x11, 0x84, 0x2e, 0x80, 0x49, 0x84, 0x04, 0xdd, 0x3c, 0xf6, 0x0c, \n0xb4, 0x3f, 0x54, 0x53, 0x00, 0xf8, 0x40, 0x30, 0x94, 0x04, 0x84, 0x04, 0x80, 0x43, 0x84, 0x2e, \n0xf3, 0x8c, 0xdd, 0x27, 0x04, 0x8f, 0x80, 0x01, 0x45, 0xe0, 0x00, 0x20, 0x50, 0x04, 0x00, 0x01, \n0xf0, 0x81, 0x4c, 0x0f, 0x7e, 0xb1, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x87, 0xb8, 0x84, 0x20, \n0x44, 0x00, 0x00, 0xf4, 0xdd, 0x27, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x27, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x27, 0x84, 0x00, \n0xd5, 0x0a, 0x92, 0x00, 0x84, 0x67, 0x9c, 0x49, 0x4c, 0x11, 0xff, 0xfd, 0x9c, 0x01, 0x84, 0x4a, \n0x4c, 0x01, 0x00, 0x04, 0x84, 0x20, 0xd5, 0xf6, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xf2, 0x0b, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x06, 0x6c, 0x50, 0x8f, 0x80, 0x30, 0x84, 0x22, 0x84, 0x04, 0xdd, 0x26, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x85, 0xb4, 0x80, 0x48, 0x44, 0x10, 0x00, 0x1c, 0x84, 0x04, 0x4b, 0xe0, 0x1c, 0x01, \n0xf3, 0x0a, 0xf2, 0x0c, 0x54, 0x11, 0x80, 0x1f, 0x40, 0x50, 0x88, 0x04, 0xf5, 0x8a, 0x80, 0x45, \n0x44, 0x10, 0x00, 0x1c, 0x84, 0x04, 0xdd, 0x26, 0x80, 0x48, 0x44, 0x10, 0x00, 0x1d, 0x84, 0x04, \n0x4b, 0xe0, 0x1c, 0x01, 0xf4, 0x09, 0xf0, 0x0c, 0x54, 0x22, 0x00, 0xf8, 0x40, 0x31, 0x00, 0x04, \n0xf3, 0x89, 0x80, 0x43, 0x44, 0x10, 0x00, 0x1d, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x08, 0x44, 0x10, \n0x00, 0x13, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x07, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x06, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x05, 0x44, 0x10, 0x00, 0x13, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x04, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0x46, 0x10, \n0x04, 0x10, 0x46, 0x40, 0x04, 0x10, 0x84, 0xa0, 0x58, 0x10, 0x85, 0x04, 0x58, 0x42, 0x05, 0x0c, \n0xb6, 0xa1, 0xb6, 0xa4, 0xec, 0x3c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0x8c, 0x96, 0x48, 0x97, 0xd0, 0x54, 0xa0, 0x00, 0xff, 0xf1, 0x83, 0x4e, 0x73, 0x05, 0x45, \n0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x05, 0xb4, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x64, 0x84, 0x05, \n0xdd, 0x26, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x60, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x80, 0x20, \n0x50, 0x2f, 0x80, 0x5c, 0xdd, 0x26, 0x80, 0x27, 0x50, 0x2f, 0x80, 0x58, 0x84, 0x05, 0xdd, 0x26, \n0x84, 0x26, 0x50, 0x2f, 0x80, 0x54, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x84, 0x27, 0x50, 0x2f, \n0x80, 0x50, 0xdd, 0x26, 0x81, 0x26, 0x44, 0x80, 0x00, 0x25, 0x50, 0x6f, 0x80, 0x1c, 0x80, 0x28, \n0x80, 0x46, 0x84, 0x05, 0xdd, 0x29, 0x8d, 0x01, 0x44, 0x00, 0x00, 0x2f, 0x9d, 0xb4, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x85, 0xb4, 0x4c, 0x80, 0x7f, 0xf4, 0x44, 0x10, 0x00, 0x3a, 0x50, 0x2f, \n0x80, 0x48, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x3b, 0x50, 0x2f, 0x80, 0x44, 0x84, 0x05, \n0xdd, 0x27, 0x51, 0xcf, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x17, 0x50, 0x2f, 0x80, 0x4c, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0x84, 0x20, 0x80, 0x5c, 0x84, 0x05, \n0xdd, 0x27, 0xf4, 0x1b, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x06, 0x6c, 0x58, 0x22, 0x00, 0x03, \n0x84, 0x20, 0x84, 0x05, 0x4b, 0xe0, 0x20, 0x01, 0x84, 0x21, 0x80, 0x5c, 0x84, 0x05, 0xdd, 0x27, \n0xf3, 0x1b, 0x84, 0x05, 0x58, 0x21, 0x80, 0x01, 0x84, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0x81, 0x3c, \n0x84, 0xc0, 0x46, 0x80, 0x00, 0x03, 0x58, 0x84, 0x05, 0x28, 0x84, 0x01, 0x4b, 0xe0, 0x20, 0x01, \n0x80, 0x49, 0x84, 0x05, 0x84, 0x21, 0xdd, 0x27, 0xf5, 0x1b, 0x9d, 0xb1, 0x96, 0x2c, 0x44, 0x20, \n0x00, 0x28, 0xf0, 0x9b, 0x4c, 0x61, 0x00, 0x03, 0xc8, 0xf1, 0x51, 0xef, 0x80, 0x6c, 0x80, 0x5e, \n0x84, 0x20, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0xf0, 0x1b, \n0x85, 0x1c, 0x41, 0xc0, 0x20, 0x02, 0x58, 0x2e, 0x00, 0x01, 0x84, 0x20, 0x50, 0x6f, 0x80, 0x68, \n0x84, 0x05, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x86, 0xf4, 0x15, 0xcf, 0x80, 0x1b, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x86, 0x6c, 0xdd, 0x2f, 0x80, 0x46, 0x44, 0x10, 0x00, 0x17, 0x84, 0x00, \n0x4b, 0xe0, 0x24, 0x01, 0xf2, 0x1a, 0x44, 0x7f, 0xff, 0xe0, 0x40, 0x51, 0x1c, 0x02, 0xf5, 0x9a, \n0x84, 0x00, 0x58, 0x22, 0x80, 0x10, 0x44, 0x10, 0x00, 0x17, 0x4b, 0xe0, 0x24, 0x01, 0x87, 0x89, \n0x44, 0x00, 0x00, 0x27, 0x40, 0x6e, 0x28, 0x1b, 0x40, 0x60, 0x28, 0x1a, 0x44, 0x30, 0x00, 0x31, \n0x84, 0x8e, 0x85, 0x20, 0x40, 0x82, 0x28, 0x1b, 0x40, 0x81, 0xa8, 0x1a, 0xf6, 0x85, 0x14, 0x8f, \n0x80, 0x04, 0x83, 0x89, 0x81, 0x09, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x85, 0xb4, 0x46, 0x60, \n0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0x4e, 0x93, 0x00, 0x56, 0x84, 0x28, 0x50, 0x2f, 0x80, 0x6c, \n0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0xf4, 0x1b, 0x84, 0x28, 0x54, 0x22, 0x00, 0xfb, 0x84, 0x05, \n0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x80, 0x09, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf3, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x58, 0x11, \n0x80, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xf1, 0x05, 0xf1, 0x82, \n0x80, 0x29, 0xd5, 0x09, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x01, 0xd8, 0xfd, 0x9c, 0x49, 0x84, 0x4a, \n0x4c, 0x11, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf7, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf7, 0x1a, 0x84, 0x04, 0x54, 0x13, \n0x80, 0xe7, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x0a, \n0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, 0x4c, 0x03, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x0a, 0x4c, 0x10, \n0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, \n0xd5, 0x57, 0x84, 0x28, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0xf4, 0x1b, \n0x84, 0x28, 0x58, 0x22, 0x00, 0x04, 0x84, 0x05, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x15, \n0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, \n0xf3, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x58, 0x11, 0x80, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x87, 0xb8, 0xdd, 0x2f, 0xf1, 0x04, 0xf1, 0x82, 0x84, 0x20, 0xd5, 0x09, 0x92, 0x00, 0x87, 0xc7, \n0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0xaa, 0xd1, 0x03, 0x84, 0x00, 0xd5, 0xf7, \n0x84, 0x24, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, \n0xdd, 0x2f, 0xf7, 0x1a, 0x84, 0x04, 0x54, 0x23, 0x80, 0xe7, 0x58, 0x11, 0x00, 0x10, 0xf2, 0x9a, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, \n0x84, 0xc7, 0x9c, 0x01, 0x4c, 0x03, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, \n0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, 0x00, 0x15, 0x84, 0x00, 0x50, 0x2f, 0x80, 0x68, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf1, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x54, 0x10, \n0x80, 0xfe, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x85, 0xb4, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0x4e, 0xa2, 0x00, 0x7a, \n0x46, 0x40, 0x04, 0x10, 0x47, 0xe0, 0x04, 0x10, 0x59, 0xef, 0x05, 0x04, 0x58, 0x42, 0x05, 0x0c, \n0x44, 0x30, 0x00, 0x10, 0x44, 0x10, 0x00, 0x18, 0xb6, 0x64, 0xb6, 0x3e, 0x50, 0x2f, 0x80, 0x6c, \n0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x27, 0x05, 0xcf, 0x80, 0x1b, 0x44, 0x10, 0x00, 0x11, \n0x58, 0x2e, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xc1, \n0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x20, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x14, 0x84, 0x42, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x6c, \n0x84, 0x05, 0xdd, 0x27, 0xf2, 0x1b, 0x44, 0x0f, 0xff, 0xc0, 0x40, 0x51, 0x00, 0x02, 0xf5, 0x9b, \n0x58, 0x22, 0x80, 0x3f, 0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x6c, \n0x84, 0x05, 0xdd, 0x27, 0xf4, 0x1b, 0x44, 0x3f, 0xff, 0xc0, 0x41, 0xc2, 0x0c, 0x02, 0x15, 0xcf, \n0x80, 0x1b, 0x58, 0x2e, 0x00, 0x3f, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x80, 0x20, \n0x44, 0x20, 0x00, 0x31, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x3a, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, \n0xdd, 0x27, 0xf2, 0x1b, 0x44, 0x0f, 0xff, 0x80, 0x40, 0x51, 0x00, 0x02, 0xf5, 0x9b, 0x80, 0x45, \n0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x3b, 0x50, 0x2f, 0x80, 0x6c, \n0x84, 0x05, 0xdd, 0x27, 0xf3, 0x1b, 0x44, 0x4f, 0xff, 0x80, 0x41, 0xc1, 0x90, 0x02, 0x15, 0xcf, \n0x80, 0x1b, 0x80, 0x5c, 0x84, 0x05, 0x44, 0x10, 0x00, 0x3b, 0xdd, 0x26, 0x87, 0x80, 0xd5, 0x6c, \n0x46, 0x10, 0x04, 0x10, 0x47, 0xe0, 0x04, 0x10, 0x59, 0xef, 0x05, 0x04, 0x84, 0xa8, 0x44, 0x80, \n0x00, 0x18, 0x58, 0x10, 0x85, 0x0c, 0xb6, 0xa1, 0xb7, 0x1e, 0x44, 0x10, 0x00, 0x11, 0x50, 0x2f, \n0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf3, 0x1b, 0x44, 0x10, 0x00, 0x11, 0x58, 0x21, 0x80, 0x80, \n0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xf1, 0x84, 0x05, 0xdd, 0x26, \n0x80, 0x48, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x14, 0x44, 0x20, \n0x00, 0xc2, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, \n0xf2, 0x1b, 0x44, 0x0f, 0xff, 0xc0, 0x40, 0x41, 0x00, 0x02, 0xf4, 0x9b, 0x58, 0x22, 0x00, 0x34, \n0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, \n0xf5, 0x1b, 0x44, 0x8f, 0xff, 0xc0, 0x40, 0x32, 0xa0, 0x02, 0xf3, 0x9b, 0x58, 0x21, 0x80, 0x34, \n0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x26, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, \n0xf2, 0x1b, 0x44, 0x0f, 0xff, 0x80, 0x40, 0x41, 0x00, 0x02, 0xf4, 0x9b, 0x80, 0x44, 0x84, 0x26, \n0x84, 0x05, 0xdd, 0x26, 0x84, 0x27, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf7, 0x1b, \n0x44, 0x5f, 0xff, 0x80, 0x40, 0x83, 0x94, 0x02, 0x14, 0x8f, 0x80, 0x1b, 0x80, 0x48, 0x84, 0x05, \n0x84, 0x27, 0xdd, 0x26, 0x81, 0x0a, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, \n0x4c, 0x03, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0xea, 0x4c, 0x13, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, \n0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x84, 0x22, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, \n0x18, 0x01, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x86, 0xf4, 0x50, 0x2f, 0x80, 0x68, 0x44, 0x10, \n0x00, 0x9f, 0x84, 0x00, 0x4b, 0xe0, 0x1c, 0x01, 0xf3, 0x1a, 0x84, 0x59, 0x40, 0x11, 0x88, 0x02, \n0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, \n0x84, 0x00, 0x4b, 0xe0, 0x1c, 0x01, 0xf4, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x58, 0x12, 0x00, 0x01, \n0x4b, 0xe0, 0x18, 0x01, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, \n0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, \n0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, \n0xdd, 0x2f, 0xf1, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x54, 0x10, 0x80, 0xfe, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x09, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x01, \n0xd8, 0xfd, 0x9c, 0x49, 0x84, 0xca, 0x4c, 0x13, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf7, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x87, 0xb8, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x1c, 0x01, \n0x44, 0x00, 0x00, 0x9f, 0x44, 0x10, 0x00, 0x82, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0xc0, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x86, 0xf4, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x01, \n0x4c, 0x02, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x6a, 0x4c, 0x11, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, \n0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x44, 0x10, 0x00, 0x9f, 0x4b, 0xe0, 0x1c, 0x01, 0xf2, 0x1a, \n0x84, 0x02, 0x4c, 0x20, 0x00, 0x08, 0x45, 0xe0, 0x00, 0x14, 0x4c, 0x6f, 0x00, 0x04, 0x9d, 0xb1, \n0xd5, 0xe3, 0x44, 0x10, 0x00, 0x39, 0x44, 0x00, 0x00, 0x9e, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x87, 0xb8, 0xdd, 0x2f, 0x44, 0x10, 0x00, 0x9f, 0x84, 0x00, 0x50, 0x2f, 0x80, 0x68, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0x00, 0x1f, 0x80, 0x68, 0x54, 0x10, 0x80, 0x7f, \n0xf1, 0x81, 0x5e, 0xf0, 0x80, 0x40, 0xe9, 0x06, 0x44, 0x6f, 0xff, 0x80, 0x40, 0x50, 0x98, 0x04, \n0xf5, 0x81, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x87, 0xb8, 0x84, 0x22, 0x44, 0x00, 0x00, 0x9e, \n0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x30, 0x00, 0x05, 0x58, 0x31, 0x86, 0xf4, 0x44, 0x10, 0x00, 0x9f, \n0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x4b, 0xe0, 0x0c, 0x01, 0xf4, 0x1a, 0x44, 0x00, 0x00, 0x9f, \n0x58, 0x12, 0x00, 0x06, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x86, 0x6c, \n0x4e, 0xa2, 0x00, 0x2a, 0x50, 0x2f, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0xf0, 0x1b, 0x44, 0x10, 0x00, 0x3a, 0x54, 0x50, \n0x00, 0x80, 0xf5, 0x9b, 0x40, 0x2e, 0x14, 0x00, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0x50, 0x2f, \n0x80, 0x6c, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, \n0xdd, 0x2f, 0xf2, 0x1b, 0x44, 0x10, 0x00, 0x3b, 0x54, 0x31, 0x00, 0x80, 0x40, 0x2e, 0x0c, 0x00, \n0x84, 0x00, 0xd5, 0x24, 0x84, 0x26, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0xf4, 0x1b, 0x84, 0x26, 0x54, 0x62, 0x00, 0x80, 0xf6, 0x9b, \n0x40, 0x24, 0x18, 0x00, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x27, 0x50, 0x2f, 0x80, 0x6c, \n0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0xf1, 0x1b, 0x84, 0x05, \n0x54, 0x30, 0x80, 0x80, 0x40, 0x24, 0x0c, 0x00, 0x84, 0x27, 0xf3, 0x9b, 0x4b, 0xe0, 0x1c, 0x01, \n0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x9c, 0x49, \n0x84, 0x6a, 0x4c, 0x11, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf2, 0x1a, \n0x44, 0x00, 0x00, 0x15, 0x58, 0x11, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, \n0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x09, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x01, 0xd8, 0xfd, 0x9c, 0x49, \n0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf7, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf1, 0x1a, \n0x44, 0x00, 0x00, 0x15, 0x54, 0x10, 0x80, 0xfe, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, \n0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, 0x4c, 0x03, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0x8a, 0x4c, 0x12, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x07, 0xb8, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x00, \n0x00, 0x9f, 0x44, 0x10, 0x00, 0x82, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0xc0, 0x84, 0x20, 0xd5, 0x0a, \n0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x6a, 0x4c, 0x11, \n0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x44, 0x10, 0x00, 0x9f, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf2, 0x1a, 0x84, 0xa2, 0xd2, 0x07, \n0x44, 0x00, 0x00, 0x14, 0x4c, 0x60, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0xe1, 0x44, 0x10, 0x00, 0x39, \n0x44, 0x00, 0x00, 0x9e, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x44, 0x10, \n0x00, 0x9f, 0x84, 0x00, 0x50, 0x2f, 0x80, 0x68, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, \n0xdd, 0x2f, 0x00, 0x1f, 0x80, 0x68, 0x54, 0x10, 0x80, 0x7f, 0x5e, 0xf0, 0x80, 0x40, 0xe9, 0x05, \n0x44, 0x4f, 0xff, 0x80, 0x40, 0x10, 0x90, 0x04, 0x05, 0xef, 0x80, 0x01, 0xf6, 0x02, 0x40, 0x1f, \n0x04, 0x01, 0x40, 0x2e, 0x28, 0x1b, 0x40, 0x24, 0x28, 0x1a, 0xe0, 0xc1, 0xe8, 0x22, 0xca, 0x2d, \n0x4e, 0x93, 0x00, 0x12, 0x4e, 0xa2, 0x00, 0x09, 0x46, 0x70, 0x00, 0x0c, 0x58, 0x73, 0x82, 0x29, \n0x10, 0x93, 0x80, 0x00, 0xd5, 0x4e, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x28, 0x10, 0xa4, \n0x80, 0x00, 0xd5, 0x47, 0x4e, 0xa2, 0x00, 0x07, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x82, 0x2b, \n0xd5, 0x4a, 0x46, 0x30, 0x00, 0x0c, 0x58, 0x31, 0x82, 0x2a, 0x10, 0xa1, 0x80, 0x00, 0xd5, 0x4b, \n0x5e, 0xf1, 0x00, 0x3f, 0xe8, 0x0a, 0x4e, 0xa2, 0x00, 0x06, 0x51, 0xce, 0x00, 0x01, 0x48, 0xff, \n0xfe, 0xe1, 0x8d, 0x01, 0x48, 0xff, 0xfe, 0xde, 0xf5, 0x02, 0xe0, 0x25, 0xe8, 0x19, 0x44, 0x00, \n0x00, 0x3f, 0x4c, 0x20, 0x40, 0x16, 0x4e, 0x93, 0x00, 0x0b, 0x4e, 0xa2, 0x00, 0x1d, 0x46, 0x10, \n0x00, 0x0c, 0x58, 0x10, 0x82, 0x29, 0x11, 0xc0, 0x80, 0x00, 0xd5, 0x1b, 0x4e, 0xa2, 0x00, 0x26, \n0x46, 0x40, 0x00, 0x0c, 0x58, 0x42, 0x02, 0x2b, 0x11, 0xc2, 0x00, 0x00, 0xd5, 0x24, 0x4e, 0x93, \n0x00, 0x14, 0x4e, 0xa2, 0x00, 0x09, 0x47, 0xe0, 0x00, 0x0c, 0x59, 0xef, 0x02, 0x29, 0x11, 0xcf, \n0x00, 0x00, 0xd5, 0x07, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x28, 0x10, 0x84, 0x80, 0x00, \n0x85, 0x21, 0x48, 0xff, 0xfc, 0x2a, 0x4e, 0xa2, 0x00, 0x09, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, \n0x82, 0x2b, 0x80, 0x5c, 0xae, 0x88, 0xd5, 0x07, 0x46, 0x30, 0x00, 0x0c, 0x58, 0x31, 0x82, 0x2a, \n0x10, 0x81, 0x80, 0x00, 0x8d, 0x21, 0x84, 0xa2, 0x4c, 0x92, 0xfc, 0x17, 0x46, 0x20, 0x04, 0x10, \n0x46, 0x10, 0x04, 0x10, 0x85, 0x00, 0x58, 0x21, 0x05, 0x0c, 0x58, 0x10, 0x85, 0x04, 0xb7, 0x02, \n0xb7, 0x01, 0x50, 0x2f, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0xf0, 0x1b, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, \n0x54, 0x20, 0x00, 0x7f, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, \n0x80, 0x48, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x14, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x19, 0x84, 0x23, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x18, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0xf2, 0x17, 0x80, 0x20, \n0xdd, 0x26, 0xf2, 0x16, 0x80, 0x28, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x15, 0x84, 0x26, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x14, 0x84, 0x05, 0x84, 0x27, 0xdd, 0x26, 0x50, 0x9f, 0x80, 0x1c, 0x44, 0x70, \n0x00, 0x25, 0x0c, 0x24, 0x80, 0x01, 0x80, 0x27, 0x84, 0x05, 0xdd, 0x26, 0x9d, 0xf9, 0x44, 0x40, \n0x00, 0x2f, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x06, 0x6c, 0x4c, 0x72, 0x7f, 0xf4, 0xf2, 0x12, \n0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0x4b, 0xe0, 0x20, 0x01, 0xf2, 0x11, 0x44, 0x10, 0x00, 0x3b, \n0x84, 0x05, 0x4b, 0xe0, 0x20, 0x01, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x50, 0x8f, \n0x80, 0x68, 0x84, 0x22, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, \n0x86, 0xf4, 0x80, 0x48, 0x44, 0x10, 0x00, 0x9f, 0x84, 0x00, 0x4b, 0xe0, 0x24, 0x01, 0xf3, 0x1a, \n0x44, 0x00, 0x00, 0x9f, 0x54, 0x11, 0x80, 0xf9, 0xdd, 0x26, 0x80, 0x48, 0x84, 0x24, 0x84, 0x00, \n0x4b, 0xe0, 0x24, 0x01, 0xf7, 0x1a, 0x84, 0x04, 0x54, 0x13, 0x80, 0xf3, 0xdd, 0x26, 0xf1, 0x13, \n0x44, 0x00, 0x00, 0x17, 0xdd, 0x26, 0x05, 0xef, 0x80, 0x03, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, \n0x85, 0xb4, 0x50, 0x8f, 0x80, 0x6c, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0x4f, 0xe3, \n0x00, 0x4c, 0x80, 0x48, 0x84, 0x26, 0x84, 0x05, 0xdd, 0x27, 0xf5, 0x1b, 0x46, 0x90, 0x00, 0x0c, \n0x58, 0x94, 0x82, 0x28, 0x54, 0x42, 0x80, 0xc0, 0x00, 0x14, 0x80, 0x00, 0xf4, 0x9b, 0x98, 0x8c, \n0x84, 0x05, 0x84, 0x26, 0xdd, 0x26, 0x80, 0x48, 0x84, 0x27, 0x84, 0x05, 0xdd, 0x27, 0xf3, 0x1b, \n0x00, 0x04, 0x80, 0x00, 0x54, 0x91, 0x80, 0xc0, 0x14, 0x9f, 0x80, 0x1b, 0x40, 0x20, 0x24, 0x00, \n0x84, 0x27, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x48, 0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0xdd, 0x27, \n0xf2, 0x1b, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x29, 0x54, 0x41, 0x00, 0xc0, 0x00, 0x54, \n0x80, 0x00, 0xf4, 0x9b, 0x98, 0xac, 0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x48, \n0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x27, 0xf1, 0x1b, 0x00, 0x04, 0x80, 0x00, 0x54, 0x50, \n0x80, 0xc0, 0xf5, 0x9b, 0x98, 0x85, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x03, \n0x84, 0x28, 0x84, 0x05, 0xd5, 0x49, 0x84, 0x26, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x27, 0xf1, 0x1b, \n0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x2a, 0x54, 0x40, 0x80, 0xc0, 0x00, 0x04, 0x80, 0x00, \n0xf4, 0x9b, 0x98, 0x84, 0x84, 0x26, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x27, 0x80, 0x48, 0x84, 0x05, \n0xdd, 0x27, 0xf3, 0x1b, 0x00, 0x24, 0x80, 0x00, 0x54, 0x91, 0x80, 0xc0, 0x14, 0x9f, 0x80, 0x1b, \n0x88, 0x49, 0x84, 0x27, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x3a, 0x80, 0x48, 0x84, 0x05, \n0xdd, 0x27, 0xf5, 0x1b, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x2b, 0x54, 0x42, 0x80, 0xc0, \n0x00, 0x14, 0x80, 0x00, 0xf4, 0x9b, 0x98, 0x8c, 0x84, 0x05, 0x44, 0x10, 0x00, 0x3a, 0xdd, 0x26, \n0x80, 0x48, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x27, 0xf0, 0x1b, 0x00, 0x24, 0x80, 0x00, \n0x54, 0x30, 0x00, 0xc0, 0xf3, 0x9b, 0x98, 0x93, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x26, \n0x84, 0x05, 0x84, 0x28, 0x84, 0x44, 0xdd, 0x26, 0xec, 0x74, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xcc, 0x46, 0x50, 0x04, 0x11, 0x58, 0x52, 0x80, 0x04, 0x84, 0xc0, \n0x05, 0xc2, 0x80, 0x00, 0x46, 0x30, 0x04, 0x10, 0xb6, 0xc5, 0x58, 0x31, 0x85, 0x04, 0x44, 0x40, \n0x18, 0x30, 0xb5, 0x43, 0x46, 0x00, 0x04, 0x10, 0xb6, 0x83, 0x58, 0x00, 0x05, 0x0c, 0x44, 0x10, \n0x20, 0x00, 0xb5, 0x20, 0xb6, 0x20, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x05, 0xb4, 0x50, 0x2f, \n0x80, 0x2c, 0x84, 0x24, 0x84, 0x05, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x86, 0x6c, 0xdd, 0x28, \n0x84, 0x24, 0x44, 0x20, 0x00, 0x27, 0x84, 0x05, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x28, 0x44, 0x10, \n0x00, 0x11, 0x84, 0x05, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, \n0xdd, 0x27, 0x50, 0x2f, 0x80, 0x24, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x28, 0x44, 0x10, \n0x00, 0x12, 0x44, 0x20, 0x00, 0x83, 0x84, 0x05, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x20, 0x44, 0x10, \n0x00, 0x13, 0x84, 0x05, 0xdd, 0x28, 0x50, 0x2f, 0x80, 0x1c, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, \n0xdd, 0x28, 0x80, 0x46, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x14, \n0x44, 0x20, 0x00, 0x20, 0x84, 0x05, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x18, 0x80, 0x06, 0x84, 0x21, \n0xdd, 0x28, 0x80, 0x46, 0x80, 0x06, 0x84, 0x21, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x14, 0x80, 0x06, \n0x44, 0x10, 0x00, 0x22, 0xdd, 0x28, 0x80, 0x06, 0x44, 0x10, 0x00, 0x22, 0x44, 0x20, 0x00, 0x13, \n0xdd, 0x27, 0x50, 0x2f, 0x80, 0x10, 0x80, 0x06, 0x44, 0x10, 0x00, 0x23, 0xdd, 0x28, 0x80, 0x46, \n0x80, 0x06, 0x44, 0x10, 0x00, 0x23, 0xdd, 0x27, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x07, 0xb8, \n0x84, 0x24, 0x44, 0x00, 0x00, 0x2f, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x16, \n0xdd, 0x28, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x28, 0xdd, 0x2f, 0x50, 0x2f, \n0x80, 0x0c, 0x80, 0x06, 0x44, 0x10, 0x00, 0x31, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, \n0xdd, 0x2f, 0xf2, 0x03, 0x80, 0x26, 0xf2, 0x81, 0x44, 0x00, 0x00, 0x16, 0xdd, 0x28, 0x80, 0x06, \n0x44, 0x10, 0x00, 0x23, 0x84, 0x41, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x16, \n0xdd, 0x28, 0xd5, 0x0b, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x49, 0x4c, 0x1f, 0x7f, 0xfd, 0x9d, 0xb1, \n0x44, 0x70, 0x00, 0x3c, 0x4c, 0x63, 0x80, 0x04, 0x84, 0x20, 0xd5, 0xf5, 0x44, 0x10, 0x00, 0x31, \n0x50, 0x2f, 0x80, 0x0c, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, \n0xf6, 0x01, 0x20, 0x7f, 0x80, 0x0c, 0x97, 0x72, 0x9a, 0x3d, 0x44, 0x40, 0x03, 0xe8, 0x42, 0x20, \n0x10, 0x24, 0x44, 0x30, 0x00, 0x2b, 0x40, 0x01, 0x0c, 0x36, 0x84, 0x2a, 0x40, 0x20, 0x04, 0xd6, \n0xe4, 0xc5, 0xe9, 0x02, 0x8c, 0x0a, 0x87, 0xca, 0x40, 0x20, 0x78, 0x16, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x06, 0x6c, 0x84, 0x27, 0x84, 0x00, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x87, 0xb8, \n0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x16, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x21, 0x44, 0x00, \n0x00, 0x15, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x1c, 0x01, \n0xf2, 0x0b, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0a, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x09, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x08, 0x44, 0x10, \n0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x07, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x06, 0x84, 0x21, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x05, 0x44, 0x10, 0x00, 0x22, 0x84, 0x00, \n0xdd, 0x26, 0xf2, 0x04, 0x44, 0x10, 0x00, 0x23, 0x84, 0x00, 0xdd, 0x26, 0x46, 0x20, 0x04, 0x11, \n0x46, 0x10, 0x04, 0x10, 0x46, 0x30, 0x04, 0x10, 0x58, 0x31, 0x85, 0x0c, 0x58, 0x21, 0x00, 0x04, \n0x58, 0x10, 0x85, 0x04, 0x15, 0xc1, 0x00, 0x00, 0xb7, 0x41, 0xb7, 0x23, 0x84, 0x27, 0x50, 0x2f, \n0x80, 0x08, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x85, 0xb4, 0xdd, 0x2f, 0xec, 0x34, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x46, 0x50, \n0x08, 0x21, 0x58, 0x52, 0x80, 0x04, 0xb4, 0x85, 0x46, 0x10, 0x04, 0x11, 0x84, 0x73, 0x58, 0x10, \n0x80, 0x04, 0x40, 0x22, 0x0c, 0x02, 0xb6, 0x41, 0x46, 0x10, 0x04, 0x11, 0x80, 0xc0, 0x58, 0x10, \n0x82, 0x00, 0x84, 0x00, 0xb5, 0x01, 0x54, 0x74, 0x00, 0x03, 0xc7, 0x14, 0x84, 0x40, 0xd5, 0x0b, \n0x92, 0x00, 0x85, 0x27, 0x9c, 0xd9, 0x4c, 0x34, 0xff, 0xfd, 0x9c, 0x91, 0x45, 0xe0, 0x00, 0x32, \n0x4c, 0x2f, 0x00, 0x04, 0x84, 0x60, 0xd5, 0xf5, 0x9c, 0x01, 0x44, 0x20, 0x27, 0x10, 0x4c, 0x01, \n0x7f, 0xeb, 0x84, 0xa0, 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, 0x80, 0x05, 0xf5, 0x81, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf0, 0x01, 0x44, 0x3f, 0xff, 0xe7, 0x84, 0x81, \n0x40, 0x10, 0x0c, 0x02, 0x4c, 0x62, 0x00, 0x06, 0x84, 0xe3, 0x4c, 0x63, 0xc0, 0x08, 0xd5, 0x04, \n0x58, 0x10, 0x80, 0x10, 0xd5, 0x03, 0x58, 0x10, 0x80, 0x08, 0x4c, 0x10, 0x00, 0x08, 0x84, 0x04, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x46, 0x00, 0x04, 0x11, 0x58, 0x00, \n0x00, 0x04, 0xb5, 0x00, 0x58, 0x14, 0x00, 0x0c, 0xb6, 0x20, 0xc6, 0x05, 0x85, 0x21, 0x4c, 0x64, \n0xc0, 0xbc, 0xd5, 0x5d, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x87, 0xb8, 0x44, 0x10, 0x00, 0x24, \n0x44, 0x00, 0x00, 0xc3, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x10, 0x00, 0x30, 0x44, 0x00, 0x00, 0xc4, \n0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x85, 0xb4, 0x80, 0x5f, 0x84, 0x26, \n0x84, 0x05, 0xdd, 0x27, 0xb4, 0xdf, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x82, 0x28, 0x54, 0x33, \n0x00, 0xc0, 0x00, 0x90, 0x80, 0x00, 0xb6, 0x7f, 0x40, 0x24, 0x8c, 0x00, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x06, 0x6c, 0x84, 0x26, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x5f, 0x84, 0x27, 0x84, 0x05, \n0xdd, 0x27, 0xb4, 0x1f, 0x84, 0x27, 0x54, 0x40, 0x00, 0xc0, 0xb6, 0x9f, 0x40, 0x22, 0x24, 0x00, \n0x84, 0x05, 0xdd, 0x26, 0x80, 0x5f, 0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0xdd, 0x27, 0xb4, 0x7f, \n0x46, 0x50, 0x00, 0x0c, 0x58, 0x52, 0x82, 0x29, 0x54, 0x41, 0x80, 0xc0, 0x00, 0x92, 0x80, 0x00, \n0xb6, 0x9f, 0x40, 0x24, 0x90, 0x00, 0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x5f, \n0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x27, 0xb4, 0x5f, 0x81, 0x1f, 0x54, 0x31, 0x00, 0xc0, \n0x44, 0x10, 0x00, 0x3b, 0x40, 0x21, 0xa4, 0x00, 0x84, 0x05, 0xd5, 0x5c, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x87, 0xb8, 0x44, 0x10, 0x00, 0x24, 0x44, 0x00, 0x00, 0xc3, 0x4b, 0xe0, 0x1c, 0x01, \n0x44, 0x10, 0x00, 0x3a, 0x44, 0x00, 0x00, 0xc4, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x85, 0xb4, 0x84, 0x26, 0x80, 0x5f, 0x84, 0x05, 0xdd, 0x27, 0xb4, 0xdf, 0x46, 0x10, \n0x00, 0x0c, 0x58, 0x10, 0x82, 0x2a, 0x54, 0x53, 0x00, 0xc0, 0x00, 0x90, 0x80, 0x00, 0xb6, 0xbf, \n0x40, 0x24, 0x94, 0x00, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0x84, 0x26, 0x84, 0x05, \n0xdd, 0x26, 0x84, 0x27, 0x80, 0x5f, 0x84, 0x05, 0xdd, 0x27, 0xb4, 0x5f, 0x84, 0x27, 0x54, 0x31, \n0x00, 0xc0, 0xb6, 0x7f, 0x40, 0x21, 0xa4, 0x00, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x3a, \n0x80, 0x5f, 0x84, 0x05, 0xdd, 0x27, 0xb4, 0x9f, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x2b, \n0x00, 0x90, 0x00, 0x00, 0x54, 0x52, 0x00, 0xc0, 0xb6, 0xbf, 0x40, 0x24, 0x94, 0x00, 0x44, 0x10, \n0x00, 0x3a, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x5f, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x27, \n0xb4, 0x5f, 0x81, 0x1f, 0x54, 0x31, 0x00, 0xc0, 0x84, 0x05, 0x40, 0x21, 0xa4, 0x00, 0x44, 0x10, \n0x00, 0x3b, 0xb6, 0x7f, 0xdd, 0x26, 0x84, 0x01, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x84, 0x40, 0xf2, 0x81, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x97, \n0x82, 0x34, 0x54, 0x80, 0x00, 0xff, 0x46, 0x60, 0x00, 0x09, 0x58, 0x63, 0x03, 0x9c, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x86, 0x6c, 0xa7, 0x70, 0x4c, 0x54, 0x40, 0x16, 0xa6, 0xb1, 0x44, 0x10, \n0x00, 0x11, 0x84, 0x00, 0xdd, 0x27, 0xa6, 0xb2, 0x44, 0x10, 0x00, 0x12, 0x84, 0x00, 0xdd, 0x27, \n0xa6, 0xb3, 0x44, 0x10, 0x00, 0x13, 0x84, 0x00, 0xdd, 0x27, 0xa6, 0xb4, 0x84, 0x00, 0x44, 0x10, \n0x00, 0x14, 0xdd, 0x27, 0x9d, 0xb5, 0x46, 0x50, 0x00, 0x09, 0x58, 0x52, 0x83, 0xe2, 0xde, 0xe4, \n0x46, 0x50, 0x04, 0x11, 0x04, 0x22, 0x80, 0xec, 0x44, 0x0f, 0xc0, 0xc0, 0x54, 0x14, 0x80, 0x3f, \n0x41, 0xe1, 0x00, 0x02, 0x40, 0x40, 0xf8, 0x04, 0x14, 0x42, 0x80, 0xec, 0xe7, 0x0f, 0xe8, 0x1a, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x77, 0x80, 0x8e, 0x44, 0x00, 0x00, 0x3e, 0x52, 0x73, 0x80, 0x37, \n0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x80, 0x27, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x27, \n0x44, 0x00, 0x00, 0x3f, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x27, 0x44, 0x00, 0x00, 0x40, 0x4b, 0xe0, \n0x18, 0x01, 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x85, 0xb4, 0xdd, 0x2f, 0xf1, 0x01, 0x84, 0x00, 0x58, 0x30, 0x80, 0x80, 0x80, 0x43, 0x84, 0x24, \n0xf3, 0x81, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0x6c, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0c, \n0x00, 0x47, 0x82, 0x2e, 0x40, 0x32, 0x04, 0x09, 0x54, 0x01, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x06, \n0x58, 0xf7, 0x8d, 0x58, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0xe6, 0x38, 0xe9, 0x36, 0x80, 0x60, 0xa2, 0x59, \n0x47, 0xe0, 0x00, 0x0c, 0x14, 0x1f, 0x00, 0x8b, 0xb4, 0xa3, 0x50, 0x20, 0x00, 0x08, 0x46, 0xf0, \n0x00, 0x0c, 0x14, 0x57, 0x80, 0x8c, 0xb4, 0x62, 0x50, 0x20, 0x00, 0x0c, 0x46, 0xf0, 0x00, 0x0c, \n0x14, 0x37, 0x80, 0x8d, 0xb4, 0xa2, 0x50, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x57, \n0x80, 0x8e, 0x50, 0x50, 0x00, 0x14, 0xb4, 0x82, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x47, 0x80, 0x8f, \n0x00, 0x0f, 0x02, 0x2c, 0xb4, 0x65, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x37, 0x80, 0x90, 0x5c, 0xf0, \n0x00, 0x37, 0xe8, 0x0a, 0x42, 0x10, 0xa0, 0x0b, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x8f, 0x90, \n0xdd, 0x2f, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x85, 0x00, 0x14, 0x8f, 0x80, 0x03, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x07, 0xb8, 0x44, 0x10, 0x00, 0x10, 0x81, 0x40, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x00, \n0x00, 0xba, 0x84, 0x21, 0xdd, 0x26, 0x84, 0xe3, 0x80, 0x66, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, \n0x06, 0xf4, 0x50, 0x6f, 0x80, 0x08, 0xf3, 0x81, 0x80, 0x27, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x23, \n0x44, 0x10, 0x00, 0xbc, 0x84, 0x00, 0x80, 0x46, 0xdd, 0x3c, 0xf1, 0x02, 0x9d, 0xfc, 0x44, 0x00, \n0x00, 0x2f, 0x89, 0x01, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x87, 0xb8, 0xf3, 0x01, 0x4c, 0x70, \n0x7f, 0xec, 0x9e, 0x44, 0x44, 0x00, 0x00, 0xbb, 0x4b, 0xe0, 0x24, 0x01, 0x50, 0x2f, 0x80, 0x0c, \n0x44, 0x10, 0x00, 0xbc, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, \n0x84, 0x20, 0x84, 0x04, 0x4b, 0xe0, 0x24, 0x01, 0xf0, 0x03, 0x44, 0x50, 0x00, 0x37, 0x42, 0x30, \n0x14, 0x24, 0x84, 0x96, 0x40, 0x21, 0x90, 0x36, 0x89, 0x02, 0x40, 0x04, 0x28, 0x07, 0xec, 0x14, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x4c, 0x46, 0x60, \n0x00, 0x09, 0x58, 0x63, 0x03, 0xfc, 0x83, 0xc6, 0x3a, 0x0f, 0x0c, 0x04, 0x46, 0xa0, 0x00, 0x09, \n0x58, 0xa5, 0x03, 0xf4, 0x50, 0x9f, 0x80, 0x48, 0x46, 0x50, 0x00, 0x09, 0x58, 0x52, 0x83, 0xec, \n0x51, 0xcf, 0x80, 0x64, 0x3a, 0x04, 0x8c, 0x24, 0x46, 0x20, 0x00, 0x09, 0x58, 0x21, 0x03, 0xe4, \n0x50, 0x6f, 0x80, 0x34, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x87, 0x08, 0x3a, 0x05, 0x04, 0x00, \n0x81, 0x09, 0xf0, 0x9b, 0x12, 0x1e, 0x00, 0x06, 0x3a, 0x02, 0x84, 0x00, 0x85, 0x20, 0xb4, 0x9e, \n0xb6, 0x1c, 0x12, 0x1e, 0x00, 0x02, 0x3a, 0x01, 0x04, 0x00, 0x41, 0xe2, 0x40, 0x09, 0x50, 0xaf, \n0x80, 0x5c, 0xb6, 0x0a, 0x12, 0x44, 0x00, 0x00, 0x12, 0x15, 0x00, 0x02, 0x11, 0xef, 0x80, 0x5a, \n0x14, 0x9f, 0x80, 0x2a, 0x44, 0x20, 0x00, 0x14, 0x80, 0x29, 0x80, 0x06, 0x4b, 0xe0, 0x1c, 0x01, \n0xa6, 0xf3, 0xa5, 0x73, 0x00, 0x83, 0x00, 0x04, 0x40, 0x22, 0xb8, 0x09, 0x40, 0x21, 0x38, 0x08, \n0x54, 0x41, 0x80, 0x3f, 0x54, 0x04, 0x00, 0x03, 0x44, 0x1f, 0xff, 0x80, 0x87, 0xc7, 0x58, 0x51, \n0x00, 0x18, 0x40, 0x32, 0x04, 0x04, 0x11, 0xe3, 0x00, 0x02, 0x58, 0x40, 0x00, 0x1c, 0x87, 0xc1, \n0x50, 0x8f, 0x80, 0x1c, 0x11, 0xe3, 0x00, 0x05, 0xad, 0x73, 0xae, 0xf3, 0xaf, 0x34, 0x80, 0x29, \n0x44, 0x20, 0x00, 0x18, 0x80, 0x08, 0x4b, 0xe0, 0x1c, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x24, \n0x00, 0x01, 0x54, 0x00, 0x80, 0x03, 0x58, 0x31, 0x00, 0x01, 0x58, 0x40, 0x00, 0x08, 0x10, 0x34, \n0x00, 0x01, 0x10, 0x44, 0x00, 0x00, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xf0, 0x50, 0x1f, \n0x80, 0x6c, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x20, 0xdd, 0x27, 0x80, 0x3c, 0x84, 0x46, 0x50, 0x0f, \n0x80, 0x26, 0xdd, 0x27, 0x80, 0x2a, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x2c, 0xdd, 0x27, 0x46, 0x50, \n0x04, 0x10, 0x04, 0xa2, 0x81, 0x01, 0x45, 0xcf, 0xff, 0x1f, 0x40, 0x45, 0x70, 0x02, 0x14, 0x42, \n0x81, 0x01, 0x46, 0x00, 0x04, 0x1d, 0x80, 0x26, 0x44, 0x20, 0x00, 0x14, 0xdd, 0x27, 0x46, 0x00, \n0x04, 0x1d, 0x80, 0x28, 0x44, 0x20, 0x00, 0x18, 0x58, 0x00, 0x00, 0x14, 0xdd, 0x27, 0x46, 0x00, \n0x04, 0x11, 0x84, 0x24, 0xa8, 0x41, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x04, 0x10, 0xb4, 0x60, \n0x80, 0x29, 0x58, 0x21, 0x80, 0x04, 0xb6, 0x40, 0xb4, 0xe0, 0x9c, 0x49, 0x55, 0xc3, 0x80, 0x40, \n0x4f, 0xc2, 0x00, 0x05, 0x44, 0x50, 0x00, 0x64, 0xd9, 0xf8, 0x46, 0x80, 0x04, 0x11, 0x85, 0x20, \n0x14, 0x94, 0x00, 0x01, 0x80, 0xc8, 0x05, 0xe3, 0x00, 0xca, 0x46, 0xa0, 0x00, 0x05, 0x58, 0xa5, \n0x07, 0xb8, 0x15, 0xef, 0x80, 0x05, 0x80, 0x29, 0x44, 0x00, 0x00, 0x1b, 0xdd, 0x2a, 0x47, 0xc0, \n0x00, 0x05, 0x59, 0xce, 0x06, 0xf4, 0x44, 0x10, 0x00, 0x41, 0x50, 0x2f, 0x80, 0xac, 0x80, 0x09, \n0xdd, 0x3c, 0xf5, 0x2b, 0x50, 0x2f, 0x80, 0xac, 0xf5, 0x84, 0x44, 0x10, 0x00, 0x42, 0x80, 0x09, \n0xdd, 0x3c, 0xf2, 0x2b, 0x44, 0x10, 0x00, 0x8c, 0xf2, 0x83, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, \n0x44, 0x10, 0x00, 0x9f, 0x50, 0x2f, 0x80, 0xac, 0x80, 0x09, 0xdd, 0x3c, 0xf0, 0x2b, 0x46, 0x40, \n0x00, 0xc0, 0x58, 0x42, 0x00, 0x20, 0xf0, 0x82, 0x14, 0x43, 0x00, 0xca, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x85, 0xb4, 0x84, 0x21, 0x50, 0x2f, 0x80, 0xa4, 0x84, 0x05, 0xdd, 0x27, 0x84, 0x21, \n0x50, 0x2f, 0x80, 0xa0, 0x80, 0x09, 0xdd, 0x27, 0x80, 0x29, 0x50, 0x2f, 0x80, 0x9c, 0x84, 0x04, \n0xdd, 0x27, 0x84, 0x2b, 0x50, 0x2f, 0x80, 0x98, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x2d, 0x50, 0x2f, \n0x80, 0x94, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x90, 0x84, 0x04, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x8c, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, \n0x00, 0x16, 0x50, 0x2f, 0x80, 0x88, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x11, 0x50, 0x2f, \n0x80, 0x84, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, 0x80, 0x80, 0x84, 0x05, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x7c, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, \n0x00, 0x14, 0x50, 0x2f, 0x80, 0x78, 0x84, 0x05, 0xdd, 0x27, 0x84, 0x21, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x06, 0x6c, 0x80, 0x41, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x21, 0x44, 0x20, 0x00, 0xe1, \n0x80, 0x09, 0xdd, 0x26, 0x80, 0x29, 0x44, 0x20, 0x00, 0x83, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x2b, \n0x44, 0x20, 0x00, 0x51, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x2d, 0x44, 0x20, 0x00, 0x3c, 0x84, 0x04, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x24, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x15, 0x9e, 0x8b, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x16, 0x44, 0x20, 0x00, 0xa1, \n0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xf1, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, \n0x44, 0x20, 0x00, 0xa1, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x41, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x10, 0x9c, 0x0f, 0xdd, 0x2a, 0x80, 0x29, 0x44, 0x00, 0x00, 0x6d, \n0xdd, 0x2a, 0x80, 0x29, 0x44, 0x00, 0x00, 0x6e, 0xdd, 0x2a, 0x84, 0x28, 0x14, 0x14, 0x00, 0x01, \n0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0x8c, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x40, 0x44, 0x00, \n0x00, 0x9f, 0xdd, 0x2a, 0x80, 0x29, 0x44, 0x00, 0x00, 0x1b, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x39, \n0x44, 0x00, 0x00, 0x41, 0xdd, 0x2a, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0x8c, 0xdd, 0x2a, \n0x80, 0xc9, 0x50, 0x8f, 0x80, 0xac, 0x80, 0xfc, 0x84, 0x00, 0x44, 0x10, 0x00, 0x8c, 0x80, 0x48, \n0xdd, 0x27, 0xf3, 0x2b, 0x9d, 0xb1, 0xc3, 0x04, 0x44, 0x50, 0x00, 0x64, 0xde, 0xf6, 0x46, 0x60, \n0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x84, 0x20, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x22, \n0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x84, 0x2a, 0x44, 0x00, 0x00, 0xbc, 0xdd, 0x26, 0x84, 0x23, \n0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x41, 0x44, 0x00, 0x00, 0xbc, 0xdd, 0x26, \n0x84, 0x24, 0x44, 0x00, 0x00, 0xf1, 0xdd, 0x26, 0x87, 0x85, 0x44, 0x00, 0x00, 0xf2, 0x84, 0x20, \n0xdd, 0x26, 0x85, 0x20, 0x15, 0xcf, 0x80, 0x01, 0xb7, 0x3f, 0x50, 0xaf, 0x80, 0xa8, 0x50, 0x9f, \n0x80, 0xac, 0x50, 0x8f, 0x80, 0x74, 0x84, 0x20, 0x44, 0x00, 0x00, 0x1b, 0xdd, 0x26, 0x50, 0x4f, \n0x80, 0x48, 0x38, 0x12, 0x70, 0x00, 0x44, 0x00, 0x00, 0x42, 0xdd, 0x26, 0x84, 0x24, 0x84, 0x00, \n0x80, 0x4a, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf1, 0x2a, 0x54, 0x70, \n0x80, 0x10, 0xcf, 0x05, 0x58, 0x10, 0x80, 0x10, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x11, \n0x44, 0x00, 0x00, 0xf4, 0xdd, 0x26, 0x84, 0x21, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x21, \n0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0xbc, 0xdd, 0x26, \n0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x28, 0xdd, 0x2f, 0x84, 0xe0, 0x44, 0x10, \n0x00, 0xbc, 0x84, 0x00, 0x80, 0x49, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, \n0xf0, 0x2b, 0x9d, 0xf9, 0x54, 0x10, 0x00, 0x80, 0xc1, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdf, 0xf0, \n0xf1, 0x2a, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x26, 0x84, 0x21, \n0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x84, 0x21, \n0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xff, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0xbc, 0x84, 0x00, 0x80, 0x48, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, \n0xdd, 0x2f, 0xf1, 0x1d, 0x5c, 0xf0, 0x80, 0xb4, 0xe8, 0x08, 0x51, 0xce, 0x00, 0x01, 0x5e, 0xfe, \n0x00, 0x13, 0xe9, 0x8a, 0x48, 0x00, 0x00, 0x89, 0x5c, 0xf0, 0x80, 0xf6, 0xe9, 0x07, 0x51, 0xce, \n0x7f, 0xff, 0x4f, 0xc4, 0xff, 0x82, 0x48, 0x00, 0x00, 0x80, 0xb4, 0x9f, 0x84, 0x65, 0x40, 0x22, \n0x0c, 0xb6, 0x87, 0xc4, 0x4c, 0x5f, 0x40, 0x05, 0xf0, 0x01, 0x9c, 0x43, 0xf1, 0x81, 0xb4, 0x5f, \n0x84, 0xa5, 0xd2, 0x72, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x81, 0x10, 0xdd, 0x2f, \n0x84, 0x41, 0x4c, 0x01, 0x00, 0x09, 0x05, 0xef, 0x80, 0x00, 0x40, 0x7f, 0x08, 0x00, 0xb6, 0xff, \n0x48, 0xff, 0xff, 0x63, 0xf0, 0x2a, 0x54, 0x60, 0x00, 0x10, 0xce, 0x09, 0x58, 0x10, 0x00, 0x10, \n0x84, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x07, 0xb8, 0x84, 0x23, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x23, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x2f, 0x44, 0x00, 0x00, 0xbd, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x2f, 0x44, 0x00, \n0x00, 0xbd, 0xdd, 0x26, 0x84, 0x25, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x25, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x2f, 0x44, 0x00, 0x00, 0xbd, 0xdd, 0x26, 0x84, 0x26, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x26, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x2f, 0x44, 0x00, \n0x00, 0xbd, 0xdd, 0x26, 0x84, 0x27, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x27, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x2f, 0x44, 0x00, 0x00, 0xbd, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x1c, \n0x44, 0x00, 0x00, 0xbc, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x44, 0x00, \n0x00, 0xbc, 0x9c, 0x44, 0xdd, 0x26, 0xf1, 0x05, 0x46, 0x00, 0x04, 0x11, 0x14, 0x10, 0x00, 0xca, \n0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0xf1, 0x2a, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x1b, 0xdd, 0x26, 0xf1, 0x04, 0x44, 0x00, 0x00, 0x41, 0xdd, 0x26, 0xf1, 0x03, \n0x44, 0x00, 0x00, 0x42, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x8c, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0xf1, 0x02, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0xf2, 0x29, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x06, 0x6c, 0x84, 0x21, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x28, 0x84, 0x21, 0x84, 0x00, 0xdd, 0x26, \n0xf2, 0x27, 0x84, 0x20, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x26, 0x84, 0x2b, 0x84, 0x04, 0xdd, 0x26, \n0xf2, 0x25, 0x84, 0x2d, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x24, 0x44, 0x10, 0x00, 0x13, 0x84, 0x04, \n0xdd, 0x26, 0xf2, 0x23, 0x44, 0x10, 0x00, 0x15, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x22, 0x44, 0x10, \n0x00, 0x16, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x21, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x20, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x1f, 0x44, 0x10, 0x00, 0x13, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x1e, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0x46, 0x30, \n0x04, 0x11, 0x84, 0x80, 0xa9, 0x19, 0xec, 0xb4, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x54, 0x90, \n0x00, 0xff, 0x54, 0x80, 0x80, 0xff, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0xb0, 0x97, 0xd0, \n0x4b, 0xe0, 0x18, 0x01, 0x80, 0x29, 0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x4e, 0x83, \n0x00, 0x07, 0x44, 0x10, 0x00, 0xb1, 0x44, 0x00, 0x00, 0x9e, 0xd5, 0x05, 0x44, 0x00, 0x00, 0x9e, \n0x44, 0x10, 0x00, 0xb2, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x27, 0x44, 0x00, 0x00, 0x9f, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x54, 0x90, \n0x00, 0xff, 0x54, 0x80, 0x80, 0xff, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0xb0, 0x80, 0xe2, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x30, 0x00, 0xb2, \n0x44, 0x40, 0x00, 0xb1, 0x40, 0x12, 0x24, 0x1a, 0x40, 0x11, 0xa4, 0x1b, 0x44, 0x00, 0x00, 0x9e, \n0xdd, 0x26, 0x80, 0x28, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, \n0xdd, 0x26, 0x84, 0x00, 0x92, 0x00, 0x84, 0x27, 0x9c, 0x01, 0x4c, 0x00, 0xff, 0xfd, 0x46, 0x60, \n0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x18, 0x01, \n0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x00, 0x00, 0x9f, 0x44, 0x10, \n0x00, 0x9b, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x00, 0x00, 0x9b, 0xf0, 0x81, 0x50, 0x6f, 0x80, 0x04, \n0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x06, 0xf4, 0xd5, 0x11, 0x92, 0x00, 0x84, 0x47, 0x9c, 0x49, \n0x4c, 0x11, 0x7f, 0xfd, 0x9c, 0x01, 0x84, 0xaa, 0xd0, 0x03, 0x84, 0x20, 0xd5, 0xf7, 0x84, 0x00, \n0x44, 0x10, 0x00, 0x9f, 0x80, 0x46, 0x4b, 0xe0, 0x20, 0x01, 0x05, 0xef, 0x80, 0x01, 0x44, 0x30, \n0x00, 0x9b, 0x4d, 0xe1, 0xc0, 0x04, 0x84, 0x00, 0xd5, 0xf1, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x07, 0xb8, 0x44, 0x10, 0x00, 0xba, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x2a, \n0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x40, 0x04, 0x10, 0x58, 0x42, 0x00, 0x7c, \n0xb4, 0x04, 0x40, 0x10, 0x40, 0x09, 0x4e, 0x04, 0x00, 0x05, 0x44, 0x2f, 0x00, 0x00, 0x98, 0x4a, \n0x45, 0xe0, 0x80, 0x00, 0x40, 0x50, 0x78, 0x02, 0x96, 0x01, 0xc5, 0x04, 0x44, 0x3f, 0x00, 0x00, \n0x98, 0x03, 0x42, 0x10, 0x84, 0x24, 0x42, 0x10, 0x00, 0x73, 0xb6, 0x27, 0xec, 0x0c, 0x3a, 0x6f, \n0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x74, 0x96, 0x00, 0xf0, 0x81, 0x4e, 0x03, \n0x02, 0x54, 0x47, 0xc0, 0x04, 0x11, 0x46, 0x80, 0x04, 0x10, 0x46, 0x60, 0x04, 0x10, 0x46, 0xa0, \n0x00, 0xcf, 0x44, 0x51, 0x20, 0x3e, 0x58, 0x84, 0x05, 0x0c, 0x59, 0xce, 0x00, 0x04, 0x58, 0x63, \n0x05, 0x04, 0x58, 0xa5, 0x08, 0x30, 0xb6, 0x1c, 0xb6, 0xa8, 0xb7, 0x46, 0x50, 0x2f, 0x80, 0x7c, \n0xf0, 0x01, 0x84, 0x24, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf2, 0x1f, \n0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x87, 0xb8, 0x54, 0x11, 0x00, 0xe7, 0x84, 0x04, 0x4b, 0xe0, \n0x24, 0x01, 0xf0, 0x01, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x05, 0xb4, 0x50, 0x2f, 0x80, 0x70, \n0x84, 0x21, 0xdd, 0x26, 0xf0, 0x01, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x22, 0xdd, 0x26, 0xf0, 0x01, \n0x50, 0x2f, 0x80, 0x68, 0x44, 0x10, 0x00, 0x23, 0xdd, 0x26, 0xf0, 0x01, 0x50, 0x2f, 0x80, 0x64, \n0x44, 0x10, 0x00, 0x2a, 0xdd, 0x26, 0xf1, 0x01, 0x50, 0x2f, 0x80, 0x60, 0x84, 0x04, 0xdd, 0x26, \n0x50, 0x2f, 0x80, 0x5c, 0x84, 0x22, 0x84, 0x04, 0xdd, 0x26, 0x50, 0x2f, 0x80, 0x58, 0x44, 0x10, \n0x00, 0x22, 0x84, 0x04, 0xdd, 0x26, 0x50, 0x2f, 0x80, 0x54, 0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, \n0x50, 0x2f, 0x80, 0x50, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0x50, 0x2f, 0x80, 0x4c, 0x44, 0x10, \n0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0x50, 0x2f, 0x80, 0x48, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, \n0xdd, 0x26, 0x50, 0x2f, 0x80, 0x44, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0x50, 0x2f, \n0x80, 0x40, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0xf0, 0x01, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x86, 0x6c, 0x84, 0x21, 0x44, 0x20, 0x00, 0x21, 0xdd, 0x27, 0xf0, 0x01, 0x84, 0x22, \n0x44, 0x20, 0x00, 0x10, 0xdd, 0x27, 0xf0, 0x01, 0x44, 0x10, 0x00, 0x23, 0x80, 0x40, 0xdd, 0x27, \n0xf0, 0x01, 0x44, 0x10, 0x00, 0x2a, 0x44, 0x20, 0x00, 0x1b, 0xdd, 0x27, 0xf1, 0x01, 0x44, 0x20, \n0x00, 0x81, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x22, 0x44, 0x20, 0x00, 0x81, 0x84, 0x04, 0xdd, 0x27, \n0x44, 0x10, 0x00, 0x22, 0x44, 0x20, 0x00, 0xee, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x23, 0x44, 0x20, \n0x00, 0x3f, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x20, 0x00, 0x3f, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x27, \n0x46, 0x00, 0x60, 0x12, 0x58, 0x00, 0x00, 0x3e, 0xb6, 0x08, 0x44, 0x10, 0x00, 0x40, 0x44, 0x00, \n0x00, 0x16, 0x4b, 0xe0, 0x24, 0x01, 0x50, 0x8f, 0x80, 0x80, 0xf1, 0x01, 0x80, 0x48, 0x84, 0x05, \n0xdd, 0x26, 0x04, 0x9f, 0x80, 0x20, 0xf1, 0x01, 0x54, 0x44, 0x80, 0x01, 0xf4, 0xa0, 0x80, 0x44, \n0x84, 0x05, 0xdd, 0x27, 0x80, 0x48, 0x84, 0x21, 0x84, 0x05, 0xdd, 0x26, 0xf1, 0x20, 0x84, 0x05, \n0x58, 0x30, 0x80, 0x04, 0xf3, 0xa0, 0x80, 0x43, 0x84, 0x21, 0xdd, 0x27, 0xd5, 0x0b, 0x84, 0x00, \n0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x84, 0x05, 0x84, 0x21, 0x80, 0x48, \n0xdd, 0x26, 0xf7, 0x20, 0x54, 0x73, 0x80, 0x04, 0xcf, 0xf3, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, \n0x07, 0xb8, 0x80, 0x27, 0x44, 0x00, 0x00, 0x16, 0x4b, 0xe0, 0x20, 0x01, 0x44, 0x00, 0x00, 0x15, \n0x84, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x67, 0x92, 0x00, 0x84, 0x27, 0x9c, 0xd9, 0x4c, 0x30, \n0xff, 0xfd, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, 0x07, 0xb8, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, \n0xdd, 0x3c, 0x80, 0x49, 0x84, 0x20, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x86, 0x6c, 0x84, 0x05, \n0xdd, 0x29, 0x46, 0x10, 0x04, 0x11, 0x44, 0x30, 0x00, 0x10, 0x58, 0x10, 0x80, 0x04, 0xb6, 0x61, \n0x44, 0x20, 0x00, 0x80, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x12, \n0x44, 0x20, 0x00, 0xd7, 0x84, 0x05, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0xa2, \n0x84, 0x05, 0xdd, 0x29, 0x44, 0x20, 0x00, 0x20, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x29, \n0x44, 0x10, 0x00, 0xaa, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x3c, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0xab, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x3c, 0x84, 0x2a, 0x44, 0x00, \n0x00, 0x9f, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0xac, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x3c, 0x44, 0x10, \n0x00, 0x3f, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0xad, 0x44, 0x00, 0x00, 0x9e, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0x3f, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x40, \n0x44, 0x00, 0x00, 0xf4, 0xdd, 0x3c, 0x50, 0x2f, 0x80, 0x7c, 0x44, 0x10, 0x00, 0x1f, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0x04, 0x8f, 0x80, 0x1f, 0x44, 0x00, \n0x00, 0x1f, 0x58, 0x74, 0x00, 0x60, 0xf7, 0x9f, 0x80, 0x27, 0xdd, 0x3c, 0x84, 0x25, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x3c, 0x44, 0x00, 0x00, 0x9f, 0x84, 0x20, 0xdd, 0x3c, 0x46, 0x60, 0x00, 0x09, \n0x58, 0x63, 0x04, 0x14, 0x46, 0x50, 0x00, 0x09, 0x58, 0x52, 0x84, 0x18, 0x46, 0x00, 0x00, 0x09, \n0x58, 0x00, 0x04, 0x10, 0xb5, 0x45, 0xb4, 0x46, 0xb5, 0x20, 0x46, 0x40, 0x00, 0x0c, 0x58, 0x42, \n0x02, 0x20, 0x84, 0x60, 0x14, 0xaf, 0x80, 0x09, 0xf2, 0x8a, 0x14, 0x9f, 0x80, 0x0b, 0xf4, 0x85, \n0xf3, 0x82, 0x05, 0xcf, 0x80, 0x09, 0xf5, 0x02, 0x15, 0xcf, 0x80, 0x0f, 0x50, 0xaf, 0x80, 0x3c, \n0x38, 0x65, 0x14, 0x00, 0xf4, 0x0a, 0xf3, 0x0b, 0x40, 0x03, 0x64, 0x08, 0x44, 0x21, 0x20, 0x3e, \n0x46, 0x90, 0x04, 0x10, 0x40, 0x10, 0x08, 0x04, 0x58, 0x94, 0x85, 0x0c, 0xf4, 0x8e, 0xf3, 0x8d, \n0xb6, 0x29, 0x50, 0x8f, 0x80, 0x38, 0x05, 0xef, 0x80, 0x02, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, \n0x06, 0x6c, 0x38, 0x74, 0x78, 0x00, 0x84, 0x23, 0x80, 0x47, 0x84, 0x05, 0xdd, 0x3c, 0x80, 0x47, \n0x84, 0x24, 0x84, 0x05, 0xdd, 0x3c, 0xf5, 0x02, 0x50, 0xaf, 0x80, 0x34, 0x38, 0x15, 0x14, 0x00, \n0x44, 0x00, 0x00, 0x17, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x84, 0xc0, \n0x50, 0x2f, 0x80, 0x84, 0x44, 0x00, 0x00, 0x20, 0x84, 0x85, 0x85, 0x20, 0xaf, 0x91, 0xaf, 0x90, \n0xf0, 0x84, 0xf4, 0x86, 0x50, 0x5f, 0x80, 0x74, 0xd5, 0x68, 0x81, 0x49, 0xf1, 0x03, 0xf7, 0x04, \n0xa7, 0x88, 0x45, 0xe0, 0x00, 0x20, 0x40, 0x83, 0x1c, 0x01, 0x54, 0x74, 0x00, 0x3f, 0x80, 0x1c, \n0x80, 0x27, 0x50, 0x2f, 0x80, 0x78, 0x4c, 0x6f, 0x40, 0x06, 0x14, 0x9f, 0x80, 0x1e, 0x80, 0xe6, \n0xd5, 0x08, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x88, 0xa0, 0xdd, 0x2f, 0xb4, 0xbf, \n0xf4, 0x07, 0x80, 0x45, 0x40, 0x92, 0x18, 0x00, 0x54, 0x84, 0x80, 0x3f, 0x80, 0x1c, 0x80, 0x28, \n0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x88, 0xa0, 0xdd, 0x2f, 0x04, 0x9f, 0x80, 0x1e, \n0xf4, 0x1d, 0x40, 0x04, 0xa8, 0x06, 0xf1, 0x08, 0x56, 0x50, 0x00, 0x01, 0x40, 0x22, 0x84, 0x02, \n0x40, 0x35, 0x10, 0x06, 0x40, 0x01, 0x0c, 0x02, 0xb4, 0xbf, 0xc0, 0x07, 0x05, 0xef, 0x80, 0x03, \n0x81, 0x2a, 0x10, 0x6f, 0x00, 0x00, 0xd5, 0x0a, 0xe3, 0x24, 0xe8, 0x04, 0xf6, 0x03, 0xaf, 0xf0, \n0xd5, 0x05, 0xf7, 0x03, 0x81, 0x24, 0x10, 0x83, 0x80, 0x00, 0xf3, 0x03, 0x80, 0x3c, 0x08, 0x21, \n0x80, 0x01, 0x84, 0x00, 0x51, 0xce, 0x00, 0x01, 0x85, 0x02, 0xb6, 0xbf, 0xf3, 0x83, 0x46, 0xf0, \n0x00, 0x07, 0x58, 0xf7, 0x88, 0x40, 0xdd, 0x2f, 0xb4, 0xbf, 0x4d, 0xc4, 0x7f, 0xa8, 0xf4, 0x06, \n0x84, 0x5f, 0x9e, 0x21, 0x96, 0x42, 0xf1, 0x86, 0x4c, 0x11, 0x00, 0x1c, 0x05, 0xcf, 0x80, 0x04, \n0x40, 0xae, 0x04, 0x09, 0x14, 0xaf, 0x80, 0x04, 0xf2, 0x06, 0x87, 0x80, 0xf6, 0x04, 0x56, 0x71, \n0x00, 0x05, 0x84, 0x20, 0x83, 0xdc, 0x40, 0x30, 0x9c, 0x06, 0x50, 0x8f, 0x80, 0x84, 0x41, 0xe3, \n0x1c, 0x1b, 0xf3, 0x88, 0x14, 0x8f, 0x80, 0x03, 0x81, 0x49, 0x15, 0xef, 0x80, 0x07, 0xd5, 0x87, \n0xf4, 0x05, 0x04, 0x8f, 0x80, 0x02, 0x50, 0x6f, 0x80, 0x84, 0xa7, 0xf1, 0x01, 0xe3, 0x00, 0x00, \n0x50, 0x54, 0x00, 0x01, 0x9c, 0x22, 0x85, 0x24, 0xf5, 0x82, 0xaf, 0xe1, 0x11, 0xe2, 0x00, 0x00, \n0xf0, 0x85, 0x4c, 0x54, 0xff, 0x30, 0x46, 0x90, 0x00, 0x0c, 0x58, 0x94, 0x82, 0x20, 0x85, 0x00, \n0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x87, 0xb8, 0x44, 0x10, 0x00, 0xb0, 0x44, 0x00, 0x00, 0x9e, \n0xdd, 0x27, 0x80, 0x28, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0x44, 0x10, 0x00, 0xb1, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x27, 0x00, 0x14, 0x80, 0x00, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0x44, 0x10, \n0x00, 0xb2, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x27, 0x00, 0x14, 0x80, 0x01, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x27, 0x8d, 0x01, 0x84, 0x64, 0x8d, 0x22, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, \n0x4c, 0x81, 0xff, 0xdc, 0xf1, 0x01, 0x4e, 0x13, 0x00, 0x85, 0x46, 0x50, 0x04, 0x11, 0x58, 0x52, \n0x80, 0x04, 0xb6, 0x25, 0x44, 0x00, 0x00, 0xf4, 0xf1, 0x01, 0xdd, 0x26, 0xf0, 0x01, 0x50, 0x2f, \n0x80, 0x7c, 0x44, 0x10, 0x00, 0x1f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, \n0xf1, 0x1f, 0x44, 0x00, 0x00, 0x1f, 0x54, 0x20, 0x80, 0x9f, 0xf2, 0x9f, 0x80, 0x22, 0xdd, 0x26, \n0x84, 0x28, 0x44, 0x00, 0x00, 0x1f, 0xdd, 0x26, 0xf1, 0x01, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0xf1, 0x01, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x26, \n0xf0, 0x01, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x15, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0x46, 0x60, 0x04, 0x10, \n0x46, 0x00, 0x04, 0x10, 0x84, 0xe0, 0x58, 0x63, 0x05, 0x04, 0x58, 0x00, 0x05, 0x0c, 0xb6, 0xe6, \n0xb6, 0xe0, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0xf2, 0x1c, 0x84, 0x21, 0x80, 0x07, \n0xdd, 0x26, 0xf2, 0x1b, 0x84, 0x22, 0x80, 0x07, 0xdd, 0x26, 0xf2, 0x1a, 0x44, 0x10, 0x00, 0x23, \n0x80, 0x07, 0xdd, 0x26, 0xf2, 0x19, 0x44, 0x10, 0x00, 0x2a, 0x80, 0x07, 0xdd, 0x26, 0xf2, 0x18, \n0x80, 0x27, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x17, 0x84, 0x22, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x16, \n0x44, 0x10, 0x00, 0x22, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x15, 0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x14, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x13, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x12, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x11, 0x44, 0x10, \n0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x10, 0x84, 0x05, 0x44, 0x10, 0x00, 0x14, 0xdd, 0x26, \n0xec, 0x8c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xf8, 0x84, 0x21, \n0x80, 0xe0, 0x44, 0x00, 0x00, 0x15, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, \n0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0x07, 0x9c, 0x91, 0x4c, 0x20, 0x7f, 0xfd, 0x9c, 0x49, \n0x84, 0x6a, 0x4c, 0x11, 0x80, 0x04, 0x84, 0x40, 0xd5, 0xf6, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x07, 0xb8, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x9b, 0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, \n0x18, 0x01, 0x44, 0x10, 0x00, 0x9b, 0xf1, 0x81, 0x50, 0x6f, 0x80, 0x04, 0x46, 0x80, 0x00, 0x05, \n0x58, 0x84, 0x06, 0xf4, 0xd5, 0x12, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x91, 0x4c, 0x22, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0x4a, 0x4c, 0x11, 0x00, 0x04, 0x84, 0x40, 0xd5, 0xf6, 0x84, 0x00, 0x44, 0x10, \n0x00, 0x9f, 0x80, 0x46, 0x4b, 0xe0, 0x20, 0x01, 0xf5, 0x01, 0x45, 0xe0, 0x00, 0x9b, 0x4c, 0x5f, \n0x40, 0x04, 0x84, 0x20, 0xd5, 0xf2, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x44, 0x10, \n0x00, 0xba, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x14, 0x44, 0x00, \n0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x00, 0x7c, 0xb4, 0x20, \n0x40, 0x20, 0xc0, 0x09, 0x4e, 0x14, 0x00, 0x05, 0x44, 0x3f, 0x00, 0x00, 0x98, 0x93, 0x44, 0x50, \n0x80, 0x00, 0x40, 0x40, 0x94, 0x02, 0x96, 0x49, 0xc4, 0x04, 0x45, 0xef, 0x00, 0x00, 0x88, 0x3e, \n0x42, 0x21, 0x08, 0x24, 0x42, 0x20, 0x84, 0x73, 0xb6, 0x47, 0xec, 0x08, 0x3a, 0x6f, 0xa0, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x94, 0x96, 0x00, 0xf0, 0x82, 0x4e, 0x03, \n0x02, 0x22, 0x46, 0x30, 0x04, 0x11, 0x46, 0x80, 0x04, 0x10, 0x80, 0x28, 0x46, 0x60, 0x00, 0xcf, \n0x58, 0x63, 0x08, 0x30, 0x45, 0xc0, 0x00, 0x10, 0x44, 0x91, 0x20, 0x3e, 0xa8, 0x19, 0x15, 0xc1, \n0x80, 0x01, 0x14, 0x94, 0x01, 0x43, 0x14, 0x60, 0x81, 0x41, 0x51, 0xef, 0x80, 0x64, 0x15, 0xef, \n0x80, 0x01, 0xf0, 0x02, 0x80, 0x5e, 0x46, 0xa0, 0x00, 0x05, 0x58, 0xa5, 0x06, 0xf4, 0x84, 0x24, \n0x4b, 0xe0, 0x28, 0x01, 0xf5, 0x19, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x54, 0x12, \n0x80, 0xe7, 0x84, 0x04, 0xdd, 0x26, 0xf0, 0x02, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x85, 0xb4, \n0x84, 0x21, 0x50, 0x2f, 0x80, 0x60, 0xdd, 0x27, 0xf0, 0x02, 0x84, 0x22, 0x50, 0x2f, 0x80, 0x5c, \n0xdd, 0x27, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x23, 0x50, 0x2f, 0x80, 0x58, 0xdd, 0x27, 0xf0, 0x02, \n0x44, 0x10, 0x00, 0x2a, 0x50, 0x2f, 0x80, 0x54, 0xdd, 0x27, 0xf1, 0x02, 0x50, 0x2f, 0x80, 0x50, \n0x84, 0x04, 0xdd, 0x27, 0x84, 0x22, 0x50, 0x2f, 0x80, 0x4c, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, \n0x00, 0x22, 0x50, 0x2f, 0x80, 0x48, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x44, \n0x84, 0x05, 0xdd, 0x27, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x40, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, \n0x00, 0x11, 0x50, 0x2f, 0x80, 0x3c, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, \n0x80, 0x38, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x34, 0x84, 0x05, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x30, 0x84, 0x05, 0xdd, 0x27, 0xf0, 0x02, \n0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x86, 0x6c, 0x84, 0x21, 0x44, 0x20, 0x00, 0x21, 0xdd, 0x27, \n0xf0, 0x02, 0x80, 0x5c, 0x84, 0x22, 0xdd, 0x27, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x23, 0x80, 0x40, \n0xdd, 0x27, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x2a, 0x44, 0x20, 0x00, 0x1b, 0xdd, 0x27, 0xf1, 0x02, \n0x44, 0x20, 0x00, 0x81, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x22, 0x44, 0x20, 0x00, 0x81, 0x84, 0x04, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x22, 0x44, 0x20, 0x00, 0xee, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x23, \n0x44, 0x20, 0x00, 0x2d, 0x84, 0x05, 0xdd, 0x27, 0x84, 0x24, 0x44, 0x20, 0x00, 0x2d, 0x84, 0x05, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, \n0x00, 0x12, 0x44, 0x20, 0x00, 0xd7, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, \n0x00, 0xa2, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x20, 0x00, 0x20, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0xaa, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0xf1, 0x02, 0x44, 0x00, \n0x00, 0x9f, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xab, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x84, 0x2a, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xac, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x3f, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xad, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x3f, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x40, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x26, 0xf2, 0x01, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x1f, \n0x4b, 0xe0, 0x28, 0x01, 0xf2, 0x19, 0x44, 0x00, 0x00, 0x1f, 0x58, 0x31, 0x00, 0x60, 0xf3, 0x99, \n0x80, 0x23, 0xdd, 0x26, 0x14, 0x94, 0x01, 0x43, 0x84, 0x23, 0x44, 0x20, 0x00, 0x3e, 0x84, 0x05, \n0xdd, 0x27, 0x44, 0x20, 0x00, 0x3e, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x1f, \n0x44, 0x00, 0x00, 0x17, 0xdd, 0x26, 0x84, 0x25, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x84, 0x24, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x84, 0x23, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x60, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x04, 0xaf, 0x80, 0x02, 0x84, 0x05, 0x44, 0x10, \n0x00, 0x20, 0x14, 0xaf, 0x80, 0x05, 0xf0, 0x83, 0xf1, 0x84, 0x50, 0x2f, 0x80, 0x2c, 0x50, 0x5f, \n0x80, 0x28, 0x48, 0x00, 0x00, 0xdb, 0x14, 0xaf, 0x80, 0x06, 0x84, 0x01, 0x4d, 0xc0, 0x00, 0x0b, \n0xf4, 0x03, 0xe4, 0x84, 0x4e, 0xf2, 0x00, 0xba, 0x04, 0x9f, 0x80, 0x09, 0x04, 0xaf, 0x80, 0x05, \n0xd5, 0x03, 0x04, 0x9f, 0x80, 0x08, 0x05, 0xef, 0x80, 0x04, 0x40, 0x75, 0x78, 0x01, 0x96, 0xf8, \n0x4f, 0xc3, 0x00, 0x12, 0x44, 0x10, 0x00, 0x28, 0x44, 0x00, 0x00, 0x9e, 0xf2, 0x81, 0xb6, 0xbf, \n0x54, 0x71, 0x80, 0x0f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xf2, 0x01, \n0xb4, 0xbf, 0xd5, 0x10, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0x29, 0xf2, 0x81, 0xb6, 0xbf, \n0x54, 0x71, 0x80, 0x3f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xb4, 0xbf, \n0xf2, 0x01, 0x80, 0x27, 0x44, 0x00, 0x00, 0x9f, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xf6, 0x01, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, \n0x8f, 0xe8, 0xdd, 0x2f, 0xf5, 0x04, 0x84, 0x20, 0x40, 0x50, 0xa4, 0x1b, 0x40, 0x22, 0xa8, 0x00, \n0x96, 0xd0, 0xb4, 0xbf, 0xf2, 0x01, 0x4f, 0xc3, 0x00, 0x10, 0x44, 0x10, 0x00, 0x28, 0x44, 0x00, \n0x00, 0x9e, 0x54, 0x61, 0x80, 0x0f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, \n0xf2, 0x01, 0xb4, 0xbf, 0xd5, 0x10, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0x29, 0xf2, 0x81, \n0xb6, 0xbf, 0x54, 0x61, 0x80, 0x3f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, \n0xb4, 0xbf, 0xf2, 0x01, 0x80, 0x26, 0x44, 0x00, 0x00, 0x9f, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xb4, 0x1f, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, \n0x8f, 0xe8, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, 0x4e, 0x93, 0x00, 0x08, 0xf0, 0x0b, 0xe2, 0x08, \n0xe9, 0x04, 0xf4, 0x0a, 0xe3, 0x04, 0xe9, 0x0a, 0xf3, 0x0b, 0x04, 0x8f, 0x80, 0x0a, 0xe2, 0x68, \n0xe8, 0x04, 0x81, 0x03, 0x81, 0x47, 0xd5, 0x02, 0x81, 0x46, 0x4f, 0xc3, 0x00, 0x10, 0x44, 0x10, \n0x00, 0x28, 0x44, 0x00, 0x00, 0x9e, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x87, 0xb8, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, 0xd5, 0x0e, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, \n0x00, 0x29, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, \n0xb4, 0xbf, 0xf2, 0x01, 0x44, 0x00, 0x00, 0x9f, 0x80, 0x2a, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x87, 0xb8, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, 0x4f, 0xc3, 0x00, 0x06, \n0x14, 0xaf, 0x80, 0x05, 0x04, 0xaf, 0x80, 0x06, 0x51, 0xce, 0x00, 0x01, 0x55, 0xce, 0x00, 0xff, \n0x84, 0xe2, 0x4d, 0xc3, 0xff, 0x3a, 0x05, 0xef, 0x80, 0x03, 0x14, 0x8f, 0x80, 0x07, 0x4f, 0xe7, \n0x00, 0x06, 0xf6, 0x04, 0x40, 0x13, 0x04, 0x09, 0xf1, 0x84, 0xf7, 0x03, 0x84, 0x7e, 0x9f, 0x39, \n0x96, 0x22, 0xf0, 0x83, 0x4c, 0x01, 0x80, 0x16, 0xf6, 0x03, 0x14, 0xaf, 0x80, 0x06, 0x57, 0xc3, \n0x00, 0x03, 0x56, 0x13, 0x00, 0x05, 0x5c, 0x8e, 0x00, 0x01, 0x5d, 0xe0, 0x80, 0x01, 0x14, 0x8f, \n0x80, 0x09, 0x15, 0xef, 0x80, 0x08, 0x87, 0x80, 0x04, 0x8f, 0x80, 0x07, 0x48, 0xff, 0xff, 0x17, \n0xf5, 0x05, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x57, 0x82, 0x1c, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0xa7, \n0x82, 0x1d, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x07, 0xb8, 0x44, 0x10, 0x00, 0x28, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x26, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x37, 0x82, 0x1c, 0x44, 0x00, 0x00, 0x9f, \n0x54, 0x11, 0x80, 0x0f, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x29, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0x46, 0xf0, 0x00, 0x0c, 0x00, 0x77, 0x82, 0x1d, 0x44, 0x00, 0x00, 0x9f, 0x54, 0x13, 0x80, 0x3f, \n0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x26, 0x46, 0x20, 0x04, 0x11, 0x84, 0xe0, 0xa9, 0xd1, 0x80, 0x27, 0x44, 0x00, 0x00, 0xf4, \n0xdd, 0x26, 0x50, 0x2f, 0x80, 0x64, 0x44, 0x10, 0x00, 0x1f, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x86, 0xf4, 0xdd, 0x2f, 0xf1, 0x19, 0x44, 0x00, 0x00, 0x1f, 0x54, 0x40, 0x80, 0x9f, \n0xf4, 0x99, 0x80, 0x24, 0xdd, 0x26, 0x84, 0x21, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x84, 0x01, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x85, 0x28, 0xdd, 0x2f, 0x80, 0x27, 0x44, 0x00, 0x00, 0x15, \n0xdd, 0x26, 0xf3, 0x02, 0xcb, 0x48, 0x05, 0xef, 0x80, 0x02, 0x46, 0x40, 0x04, 0x10, 0x80, 0xc4, \n0x15, 0xe2, 0x01, 0x41, 0x15, 0xe3, 0x01, 0x43, 0x84, 0x21, 0xf2, 0x18, 0xf0, 0x02, 0x46, 0x60, \n0x00, 0x05, 0x58, 0x63, 0x06, 0x6c, 0xdd, 0x26, 0xf2, 0x17, 0xf0, 0x02, 0x84, 0x22, 0xdd, 0x26, \n0xf2, 0x16, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x23, 0xdd, 0x26, 0xf2, 0x15, 0xf0, 0x02, 0x44, 0x10, \n0x00, 0x2a, 0xdd, 0x26, 0xf2, 0x14, 0xf1, 0x02, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x13, 0x84, 0x22, \n0x84, 0x04, 0xdd, 0x26, 0xf2, 0x12, 0x44, 0x10, 0x00, 0x22, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x11, \n0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x10, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0f, \n0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0e, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x0d, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0c, 0x84, 0x05, \n0x94, 0x42, 0xdd, 0x26, 0xec, 0x6c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x96, 0x49, 0xe6, 0x24, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x51, 0xb4, 0x20, 0x84, 0xa4, \n0xd1, 0x22, 0xe4, 0x25, 0xe8, 0x09, 0x84, 0xa2, 0xd1, 0x15, 0xe4, 0x23, 0xe8, 0x16, 0x84, 0x01, \n0x4c, 0x10, 0x40, 0x45, 0xd5, 0x09, 0x84, 0x46, 0x4c, 0x11, 0x00, 0x2a, 0xe0, 0x22, 0xe9, 0x1e, \n0x84, 0xa7, 0xd1, 0x37, 0xd5, 0x3b, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x8a, 0xf0, 0xdd, 0x2f, \n0xd5, 0x35, 0x9d, 0x44, 0xb4, 0x05, 0xd5, 0x32, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x88, 0x10, \n0xdd, 0x2f, 0xd5, 0x2c, 0x9c, 0x44, 0x05, 0xe0, 0x80, 0x00, 0x54, 0x0f, 0x00, 0x01, 0x46, 0xf0, \n0x00, 0x07, 0x58, 0xf7, 0x89, 0xc4, 0xdd, 0x2f, 0xd5, 0x21, 0x9c, 0xc4, 0xb4, 0x43, 0x96, 0x14, \n0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x80, 0xe4, 0xdd, 0x2f, 0xd5, 0x18, 0x9c, 0x04, 0x05, 0xe0, \n0x00, 0x00, 0xb4, 0x20, 0xb4, 0x80, 0x40, 0x50, 0xa0, 0x09, 0x54, 0x0f, 0x00, 0xff, 0x96, 0x68, \n0x42, 0x22, 0x40, 0x0b, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8f, 0x0c, 0xdd, 0x2f, 0xd5, 0x06, \n0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x81, 0xb8, 0xdd, 0x2f, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, \n0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0x3c, 0x46, 0x30, 0x04, 0x00, 0x58, 0x31, 0x80, 0x64, \n0x46, 0x00, 0x04, 0x00, 0xb4, 0x83, 0x58, 0x00, 0x00, 0x38, 0x46, 0x51, 0x00, 0x00, 0xb4, 0x60, \n0x44, 0x6f, 0xe0, 0x00, 0x40, 0x02, 0x14, 0x02, 0x96, 0x48, 0x40, 0x31, 0x98, 0x02, 0xc0, 0x04, \n0x58, 0x31, 0x80, 0x39, 0xd5, 0x03, 0x58, 0x31, 0x80, 0x19, 0x46, 0x50, 0x04, 0x00, 0x58, 0x52, \n0x80, 0x38, 0xb6, 0x65, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x08, 0xb4, 0xa0, 0xb4, 0x80, \n0x44, 0x6f, 0xef, 0xff, 0x40, 0x42, 0x18, 0x02, 0xb6, 0x80, 0x46, 0x30, 0x04, 0x00, 0x58, 0x31, \n0x80, 0x80, 0xb4, 0x83, 0x84, 0xdc, 0x40, 0x42, 0x18, 0x02, 0xb6, 0x83, 0x46, 0x00, 0x04, 0x00, \n0x58, 0x00, 0x02, 0x14, 0xb4, 0xc0, 0x46, 0x30, 0x04, 0x00, 0x42, 0x43, 0x3c, 0x08, 0xb6, 0x80, \n0x58, 0x31, 0x82, 0x58, 0xb4, 0x83, 0x46, 0x6f, 0x0f, 0xff, 0x58, 0x63, 0x0f, 0xff, 0x40, 0x42, \n0x18, 0x02, 0x46, 0x60, 0xa0, 0x00, 0x40, 0x42, 0x18, 0x04, 0x46, 0x00, 0x04, 0x00, 0xb6, 0x83, \n0x58, 0x00, 0x00, 0x88, 0xb4, 0x60, 0xc2, 0x09, 0x46, 0x4f, 0xf0, 0x00, 0x40, 0x61, 0x90, 0x02, \n0x99, 0x16, 0x42, 0x32, 0x7c, 0x08, 0xb6, 0x60, 0x46, 0x40, 0x04, 0x00, 0x58, 0x42, 0x00, 0x3c, \n0xb4, 0x04, 0x46, 0x6f, 0x00, 0x00, 0x84, 0x63, 0x40, 0x00, 0x18, 0x02, 0x4c, 0x11, 0x80, 0x15, \n0xe6, 0x24, 0xe8, 0x05, 0x84, 0x62, 0x4c, 0x11, 0xc0, 0x18, 0xd5, 0x12, 0x84, 0xc4, 0x4c, 0x13, \n0x00, 0x08, 0x84, 0x85, 0x4c, 0x12, 0x40, 0x11, 0x44, 0x60, 0xff, 0x01, 0xd5, 0x0f, 0x44, 0x10, \n0xef, 0x01, 0x98, 0x01, 0xd5, 0x0c, 0x44, 0x30, 0xe3, 0x01, 0x98, 0x03, 0xd5, 0x08, 0x44, 0x60, \n0xc0, 0x01, 0x98, 0x06, 0xd5, 0x04, 0x44, 0x60, 0x80, 0x01, 0x98, 0x06, 0x46, 0x10, 0x04, 0x00, \n0x58, 0x10, 0x80, 0x3c, 0xb6, 0x01, 0x46, 0x60, 0x04, 0x00, 0x58, 0x63, 0x02, 0x14, 0xb4, 0x06, \n0x44, 0x4f, 0xef, 0xff, 0x40, 0x30, 0x10, 0x02, 0x46, 0x10, 0x00, 0x0c, 0x58, 0x10, 0x82, 0x44, \n0x84, 0x00, 0xb6, 0x66, 0xae, 0x08, 0x64, 0x00, 0x00, 0x20, 0xa7, 0x88, 0xce, 0x02, 0xd5, 0xfc, \n0x44, 0x40, 0x03, 0xe8, 0x40, 0x21, 0x10, 0x17, 0x46, 0x30, 0x04, 0x00, 0x58, 0x31, 0x80, 0x3c, \n0xb4, 0x23, 0x44, 0x6f, 0xff, 0xbf, 0x40, 0x00, 0x98, 0x02, 0xb6, 0x03, 0x46, 0x40, 0x00, 0x0c, \n0x58, 0x42, 0x01, 0x70, 0xb4, 0xc4, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x14, 0x46, 0x00, \n0x04, 0x00, 0x58, 0x00, 0x00, 0x80, 0x46, 0x30, 0x04, 0x00, 0x58, 0x31, 0x82, 0x08, 0x98, 0x96, \n0xb6, 0x44, 0xb4, 0x81, 0x58, 0x22, 0x10, 0x00, 0xb6, 0x41, 0xb4, 0x80, 0x58, 0x22, 0x00, 0x03, \n0xb6, 0x40, 0xb6, 0xa3, 0x3a, 0x6f, 0x98, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x96, 0x00, 0x96, 0x48, 0xc2, 0x0d, 0x46, 0xf0, 0x00, 0x0c, 0x14, 0x27, 0x80, 0x92, \n0x46, 0xf0, 0x00, 0x0c, 0x10, 0x07, 0x82, 0x47, 0x46, 0xf0, 0x00, 0x0c, 0x10, 0x17, 0x82, 0x46, \n0x46, 0xf0, 0x00, 0x0c, 0x00, 0x07, 0x82, 0x47, 0x46, 0xf0, 0x00, 0x0c, 0x00, 0x17, 0x82, 0x46, \n0x46, 0xf0, 0x00, 0x0c, 0x04, 0x27, 0x80, 0x92, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x87, 0x24, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x96, 0x49, 0xe6, 0x28, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x1f, 0x80, 0x60, 0xa2, 0x19, \n0x44, 0x20, 0x00, 0x33, 0xb4, 0x23, 0x4c, 0x01, 0x40, 0x0f, 0x84, 0x81, 0x46, 0xf0, 0x00, 0x0c, \n0x10, 0x47, 0x82, 0x45, 0x96, 0x48, 0x84, 0x40, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x88, 0xbc, \n0xdd, 0x2f, 0xd5, 0x0a, 0x44, 0x50, 0x00, 0x34, 0xd0, 0x02, 0xd5, 0x06, 0x84, 0x20, 0x46, 0xf0, \n0x00, 0x0c, 0x10, 0x17, 0x82, 0x45, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, 0x02, 0x84, 0x50, 0x0f, \n0x80, 0x04, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, 0x04, 0x73, 0x00, 0x2d, \n0xf0, 0x01, 0x97, 0xfc, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, 0xdd, 0x2f, 0xc7, 0x07, \n0x80, 0x06, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8e, 0x6c, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, \n0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x46, 0x60, 0x00, 0x0c, 0x58, 0x63, \n0x02, 0x84, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0xf8, 0xdd, 0x2f, \n0x04, 0x33, 0x00, 0x2d, 0x84, 0x40, 0xb6, 0x7f, 0x14, 0x23, 0x00, 0x2d, 0xf0, 0x01, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x80, 0x0c, 0xdd, 0x2f, 0xb4, 0x3f, 0x96, 0x0c, 0xc0, 0x07, 0x80, 0x06, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8e, 0x6c, 0xdd, 0x2f, 0xb4, 0xbf, 0x54, 0x42, 0x80, 0x02, \n0xc4, 0x0a, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x84, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x8d, 0xe8, 0xdd, 0x2f, 0xb4, 0x1f, 0x41, 0xe0, 0x3c, 0x08, 0x41, 0xef, 0x7c, 0x09, 0x4f, 0xe2, \n0x00, 0x0b, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x84, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x8f, 0xc4, 0xdd, 0x2f, 0xb4, 0x7f, 0x40, 0x21, 0xb8, 0x08, 0x92, 0x5f, 0xc2, 0x0a, 0x46, 0x00, \n0x00, 0x0c, 0x58, 0x00, 0x02, 0x84, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8e, 0xe0, 0xdd, 0x2f, \n0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x44, 0x00, \n0x02, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x80, 0x60, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x09, \n0x00, 0x07, 0x85, 0x83, 0x84, 0xa1, 0xd8, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x84, 0x68, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0c, 0x20, 0x37, 0x82, 0x45, 0x84, 0x81, 0x4c, 0x32, 0x40, 0x0a, \n0x84, 0x00, 0x80, 0x20, 0x80, 0x40, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x88, 0xbc, 0xdd, 0x2f, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0x2c, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, \n0x89, 0xa4, 0xdd, 0x2f, 0x46, 0xa0, 0x00, 0x00, 0x58, 0xa5, 0x02, 0x78, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x83, 0xf0, 0xdd, 0x2f, 0x46, 0x90, 0x00, 0x02, 0x58, 0x94, 0x83, 0x7c, 0x46, 0x70, \n0x00, 0x00, 0x58, 0x73, 0x82, 0xbc, 0x46, 0x80, 0x00, 0x01, 0x58, 0x84, 0x0b, 0xf8, 0xd5, 0x20, \n0x4b, 0xe0, 0x28, 0x01, 0x00, 0x10, 0x00, 0x14, 0x80, 0xc0, 0xc9, 0x0f, 0x80, 0x20, 0x46, 0x00, \n0x00, 0x0c, 0x58, 0x00, 0x02, 0x84, 0x4b, 0xe0, 0x20, 0x01, 0xc8, 0x12, 0x80, 0x26, 0x46, 0x00, \n0x00, 0x0c, 0x58, 0x00, 0x02, 0x74, 0xd5, 0x0a, 0x84, 0xa1, 0xd9, 0x0a, 0x4b, 0xe0, 0x24, 0x01, \n0x80, 0x26, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x02, 0x64, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0xf0, \n0x00, 0x0c, 0x04, 0x17, 0x80, 0xd1, 0x46, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x03, 0x3c, 0xc9, 0xd9, \n0x46, 0x50, 0x00, 0x0c, 0x05, 0xe2, 0x80, 0x93, 0x5e, 0x4f, 0x03, 0xe9, 0x50, 0x3f, 0x00, 0x01, \n0x40, 0x21, 0x90, 0x1b, 0x40, 0x20, 0x90, 0x1a, 0x46, 0xf0, 0x00, 0x0c, 0x04, 0x07, 0x80, 0xce, \n0x14, 0x22, 0x80, 0x93, 0xc8, 0x08, 0x44, 0x00, 0x02, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x80, 0xa4, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x41, 0x00, 0x00, 0xf0, 0x3b, 0x00, 0x00, \n0x5c, 0x37, 0x00, 0x00, 0xfc, 0x3a, 0x00, 0x00, 0x5c, 0x37, 0x00, 0x00, 0xf4, 0x38, 0x00, 0x00, \n0x5c, 0x3f, 0x00, 0x00, 0x5c, 0x37, 0x00, 0x00, 0x18, 0x41, 0x00, 0x00, 0xc0, 0x3a, 0x00, 0x00, \n0xf8, 0x40, 0x00, 0x00, 0xa8, 0x3a, 0x00, 0x00, 0x5c, 0x37, 0x00, 0x00, 0x01, 0x99, 0x99, 0x09, \n0x50, 0x02, 0x46, 0x44, 0x0a, 0x50, 0x03, 0xec, 0xee, 0x0a, 0x50, 0x04, 0x99, 0x99, 0x0b, 0x50, \n0x05, 0x46, 0x44, 0x08, 0x51, 0x06, 0xec, 0xee, 0x08, 0x51, 0x07, 0x99, 0x99, 0x09, 0x51, 0x08, \n0x46, 0x44, 0x0a, 0x51, 0x09, 0xec, 0xee, 0x0a, 0x51, 0x0a, 0x99, 0x99, 0x0b, 0x51, 0x0b, 0x46, \n0x44, 0x08, 0x52, 0x0c, 0xec, 0xee, 0x08, 0x52, 0x0d, 0x99, 0x99, 0x09, 0x52, 0x0e, 0x33, 0x33, \n0x0b, 0x52, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xaa, 0xbb, 0xcc, \n0xdd, 0xee, 0x00, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x00, 0x00, 0x10, 0x14, 0x18, 0x1c, \n0x20, 0x30, 0x34, 0x38, 0x3c, 0x40, 0x44, 0x60, 0x64, 0x68, 0x6c, 0x70, 0x74, 0x78, 0x7c, 0x00, \n0x1a, 0x14, 0x10, 0x10, 0x2f, 0x2c, 0x2c, 0x2c, 0x02, 0x06, 0x0a, 0x0c, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x0f, 0xac, 0x00, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x03, 0x00, \n0x00, 0xf8, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x88, 0x8e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, \n0x86, 0xdd, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x12, 0x01, 0x00, 0x02, \n0x00, 0x00, 0x00, 0x40, 0x8f, 0x14, 0x01, 0x76, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01, 0x0a, 0x06, \n0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x05, 0x0f, 0x0c, 0x00, 0x01, 0x07, 0x10, 0x02, \n0x02, 0x00, 0x00, 0x00, 0x09, 0x02, 0x4a, 0x00, 0x01, 0x01, 0x00, 0xa0, 0x50, 0x09, 0x04, 0x00, \n0x00, 0x08, 0xff, 0xff, 0xff, 0x00, 0x07, 0x05, 0x84, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x85, \n0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x08, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x04, 0x02, 0x00, \n0x02, 0x00, 0x07, 0x05, 0x05, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x06, 0x02, 0x00, 0x02, 0x00, \n0x07, 0x05, 0x07, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x09, 0x02, 0x00, 0x02, 0x00, 0x09, 0x04, \n0x01, 0x00, 0x05, 0xff, 0xff, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x00, 0x07, 0x05, \n0x82, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x02, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x83, 0x01, \n0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x01, 0x40, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x12, 0x03, \n0x4d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x61, 0x00, 0x54, 0x00, 0x65, 0x00, 0x6b, 0x00, \n0x1c, 0x03, 0x38, 0x00, 0x30, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x31, 0x00, 0x20, 0x00, \n0x6e, 0x00, 0x20, 0x00, 0x57, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x08, 0x03, 0x31, 0x00, \n0x2e, 0x00, 0x30, 0x00, 0x38, 0x4f, 0x00, 0x00, 0x3c, 0x4f, 0x00, 0x00, 0x40, 0x4f, 0x00, 0x00, \n0x44, 0x4f, 0x00, 0x00, 0x48, 0x4f, 0x00, 0x00, 0x4c, 0x4f, 0x00, 0x00, 0x50, 0x4f, 0x00, 0x00, \n0x54, 0x4f, 0x00, 0x00, 0x58, 0x4f, 0x00, 0x00, 0x5c, 0x4f, 0x00, 0x00, 0x60, 0x4f, 0x00, 0x00, \n0x64, 0x4f, 0x00, 0x00, 0x68, 0x4f, 0x00, 0x00, 0x6c, 0x4f, 0x00, 0x00, 0x70, 0x4f, 0x00, 0x00, \n0x74, 0x4f, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0xb1, 0x00, 0x00, 0x00, 0x03, 0x08, 0x12, 0x20, } ;\n"
  },
  {
    "path": "src/include/frq_cal.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\teeprom.h\n\n\tAbstract:\n\tMiniport header file for eeprom related information\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n#ifndef __FRQCAL_H__\n#define __FRQCAL_H__\n\n/* */\n/* The frequency calibration control */\n/* */\ntypedef struct _FREQUENCY_CALIBRATION_CONTROL\n{\n\tBOOLEAN bEnableFrequencyCalibration; /* Enable the frequency calibration algorithm */\n\n\tBOOLEAN bSkipFirstFrequencyCalibration; /* Avoid calibrating frequency at the time the STA is just link-up */\n\tBOOLEAN bApproachFrequency; /* Approach the frequency */\n\tUCHAR AdaptiveFreqOffset; /* Adaptive frequency offset */\n\tCHAR LatestFreqOffsetOverBeacon; /* Latest frequency offset from the beacon */\n\tCHAR BeaconPhyMode; /* Latest frequency offset from the beacon */\n\t\n} FREQUENCY_CALIBRATION_CONTROL, *PFREQUENCY_CALIBRATION_CONTROL;\n\n#define RTMP_FREQ_CAL_DISABLE(__pAd)\t\t\t\t\t\t\t\t\t\\\n\t__pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration = FALSE;\n\n/* */\n/* Invalid frequency offset */\n/* */\n#define INVALID_FREQUENCY_OFFSET\t\t\t-128\n\n/* */\n/* The upperbound/lowerbound of the frequency offset */\n/* */\n#define UPPERBOUND_OF_FREQUENCY_OFFSET\t\t127\n#define LOWERBOUND_OF_FREQUENCY_OFFSET\t-127\n\n\n/*#ifdef RT5390 */\n/* */\n/* The trigger point of the high/low frequency */\n/* */\n#define HIGH_FREQUENCY_TRIGGER_POINT_OFDM\t\t20\n#define LOW_FREQUENCY_TRIGGER_POINT_OFDM\t\t-20\n#define HIGH_FREQUENCY_TRIGGER_POINT_CCK\t\t4\n#define LOW_FREQUENCY_TRIGGER_POINT_CCK\t\t-4\n\n#ifdef MT7601\n#define MT7601_HIGH_FREQUENCY_TRIGGER_POINT_CCK\t\t19\n#define MT7601_LOW_FREQUENCY_TRIGGER_POINT_CCK\t\t-19\n#define MT7601_DECREASE_FREQUENCY_OFFSET_CCK\t\t5\n#define MT7601_INCREASE_FREQUENCY_OFFSET_CCK\t\t-5\n\n#define MT7601_HIGH_FREQUENCY_TRIGGER_POINT_OFDM20\t\t102\n#define MT7601_LOW_FREQUENCY_TRIGGER_POINT_OFDM20\t\t-102\n#define MT7601_DECREASE_FREQUENCY_OFFSET_OFDM20\t\t\t32\n#define MT7601_INCREASE_FREQUENCY_OFFSET_OFDM20\t\t\t-32\n\n#define MT7601_HIGH_FREQUENCY_TRIGGER_POINT_OFDM40\t\t82\n#define MT7601_LOW_FREQUENCY_TRIGGER_POINT_OFDM40\t\t-82\n#define MT7601_DECREASE_FREQUENCY_OFFSET_OFDM40\t\t\t20\n#define MT7601_INCREASE_FREQUENCY_OFFSET_OFDM40\t\t\t-20\n#endif /* MT7601 */\n\n/* */\n/* The trigger point of decreasng/increasing the frequency offset */\n/* */\n#define DECREASE_FREQUENCY_OFFSET_OFDM\t\t\t10\n#define INCREASE_FREQUENCY_OFFSET_OFDM\t\t\t-10\n#define DECREASE_FREQUENCY_OFFSET_CCK\t\t\t2\n#define INCREASE_FREQUENCY_OFFSET_CCK\t\t\t-2\n/*#endif // RT5390 */\n/* */\n/* The trigger point of decreasng/increasing the frequency offset */\n/* */\n#define DECREASE_FREQUENCY_OFFSET\t\t\t3\n#define INCREASE_FREQUENCY_OFFSET\t\t\t-3\n\n/* */\n/* Frequency calibration period */\n/* */\n\n#define FREQUENCY_CALIBRATION_PERIOD\t\t100\n\n#endif /* __FRQCAL_H__ */\n"
  },
  {
    "path": "src/include/iface/iface_util.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trtmp_util.h\n \n    Abstract:\n\tCommon for PCI/USB/RBUS.\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n*/\n\n#ifndef __RTMP_UTIL_H__\n#define __RTMP_UTIL_H__\n\n/* maximum of PCI, USB, or RBUS, int PCI, it is 0 but in USB, it is 11 */\n#define RTMP_PKT_TAIL_PADDING \t11 /* 3(max 4 byte padding) + 4 (last packet padding) + 4 (MaxBulkOutsize align padding) */\n\n#ifdef PCI_MSI_SUPPORT\n#define RTMP_MSI_ENABLE(_pAd) \\\n\t{     POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \\\n\t\t(_pAd)->HaveMsi = pci_enable_msi(_pObj->pci_dev) == 0 ? TRUE : FALSE; \\\n\t}\n\n#define RTMP_MSI_DISABLE(_pci_dev, _pHaveMsi)\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (*(_pHaveMsi) == TRUE)\t\t\t\t\\\n\t\t\tpci_disable_msi(_pci_dev);\t\t\t\\\n\t\t*(_pHaveMsi) = FALSE;\t\t\t\t\t\\\n\t}\n\n#else\n#define RTMP_MSI_ENABLE(_pAd)\t\t\t\t\tdo{}while(0)\n#define RTMP_MSI_DISABLE(_pci_dev, _pHaveMsi)\tdo{}while(0)\n#endif /* PCI_MSI_SUPPORT */\n\n#define RTMP_PCI_DMA_TODEVICE\t\t0xFF00\n#define RTMP_PCI_DMA_FROMDEVICE\t\t0xFF01\n\n\n\n\n#define UNLINK_TIMEOUT_MS\t\t3\n\n#define USBD_TRANSFER_DIRECTION_OUT\t\t0\n#define USBD_TRANSFER_DIRECTION_IN\t\t0\n#define USBD_SHORT_TRANSFER_OK\t\t\t0\n#define PURB\t\t\tpurbb_t\n\n#define OS_RTUSBMlmeUp\t\t\t\t\tRtmpOsMlmeUp\n\n\n\n\n#endif /* __RTMP_UTIL_H__ */\n"
  },
  {
    "path": "src/include/iface/rtmp_reg_pcirbs.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trtmp_reg_pcirbus.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n*/\n\n#ifndef __RTMP_REG_PCIRBUS_H__\n#define __RTMP_REG_PCIRBUS_H__\n\n\n// TODO: shiang, for RT3290, make sure following definition is correct to put as here\n\n#define ASIC_VERSION\t0x0000\n\n#define CMB_CTRL\t\t0x20\n#ifdef RT_BIG_ENDIAN\ntypedef union _CMB_CTRL_STRUC{\n\tstruct{\n\t\tUINT32       \tLDO0_EN:1;\n\t\tUINT32       \tLDO3_EN:1;\n\t\tUINT32       \tLDO_BGSEL:2;\n\t\tUINT32       \tLDO_CORE_LEVEL:4;\n\t\tUINT32       \tPLL_LD:1;\n\t\tUINT32       \tXTAL_RDY:1;\n\t\tUINT32       \tRsv:2;\n\t\tUINT32\t\tLDO25_FRC_ON:1;//4      \n\t\tUINT32\t\tLDO25_LARGEA:1;\n\t\tUINT32\t\tLDO25_LEVEL:2;\n\t\tUINT32\t\tAUX_OPT_Bit15_Two_AntennaMode:1;\n\t\tUINT32\t\tAUX_OPT_Bit14_TRSW1_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit13_GPIO7_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit12_TRSW0_as_WLAN_ANT_SEL:1;\n\t\tUINT32\t\tAUX_OPT_Bit11_Rsv:1;\n\t\tUINT32\t\tAUX_OPT_Bit10_NotSwap_WL_LED_ACT_RDY:1;\n\t\tUINT32\t\tAUX_OPT_Bit9_GPIO3_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit8_AuxPower_Exists:1;\n\t\tUINT32\t\tAUX_OPT_Bit7_KeepInterfaceClk:1;\n\t\tUINT32\t\tAUX_OPT_Bit6_KeepXtal_On:1;\n\t\tUINT32\t\tAUX_OPT_Bit5_RemovePCIePhyClk_BTOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit4_RemovePCIePhyClk_WLANOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit3_PLLOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit2_PCIeCoreClkOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit1_PCIePhyClkOn_L1:1;\t\n\t\tUINT32\t\tAUX_OPT_Bit0_InterfaceClk_40Mhz:1;\n\t}field;\n\tUINT32 word;\n}CMB_CTRL_STRUC, *PCMB_CTRL_STRUC;\n#else\ntypedef union _CMB_CTRL_STRUC{\n\tstruct{\n\t\tUINT32\t\tAUX_OPT_Bit0_InterfaceClk_40Mhz:1;\n\t\tUINT32\t\tAUX_OPT_Bit1_PCIePhyClkOn_L1:1;\t\n\t\tUINT32\t\tAUX_OPT_Bit2_PCIeCoreClkOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit3_PLLOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit4_RemovePCIePhyClk_WLANOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit5_RemovePCIePhyClk_BTOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit6_KeepXtal_On:1;\n\t\tUINT32\t\tAUX_OPT_Bit7_KeepInterfaceClk:1;\n\t\tUINT32\t\tAUX_OPT_Bit8_AuxPower_Exists:1;\n\t\tUINT32\t\tAUX_OPT_Bit9_GPIO3_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit10_NotSwap_WL_LED_ACT_RDY:1;\t\n\t\tUINT32\t\tAUX_OPT_Bit11_Rsv:1;\n\t\tUINT32\t\tAUX_OPT_Bit12_TRSW0_as_WLAN_ANT_SEL:1;\n\t\tUINT32\t\tAUX_OPT_Bit13_GPIO7_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit14_TRSW1_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit15_Two_AntennaMode:1;\n\t\tUINT32\t\tLDO25_LEVEL:2;\n\t\tUINT32\t\tLDO25_LARGEA:1;\n\t\tUINT32\t\tLDO25_FRC_ON:1;//4      \n\t\tUINT32       \tRsv:2;\n\t\tUINT32       \tXTAL_RDY:1;\n\t\tUINT32       \tPLL_LD:1;\n\t\tUINT32       \tLDO_CORE_LEVEL:4;\n\t\tUINT32       \tLDO_BGSEL:2;\n\t\tUINT32       \tLDO3_EN:1;\n\t\tUINT32       \tLDO0_EN:1;\n\t}field;\n\tUINT32 word;\n}CMB_CTRL_STRUC, *PCMB_CTRL_STRUC;\n#endif\n\n\n#define OSCCTL\t\t\t\t0x38\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _OSCCTL_STRUC{\n\tstruct{\n\t\tUINT32       \tROSC_EN:1;\n\t\tUINT32       \tCAL_REQ:1;\n\t\tUINT32       \tCLK_32K_VLD:1;\n\t\tUINT32\t\tCAL_ACK:1;\n\t\tUINT32\t\tCAL_CNT:12;\n\t\tUINT32\t\tRsv:3;\n\t\tUINT32\t\tREF_CYCLE:13;\n\t}field;\n\tUINT32 word;\n}OSCCTL_STRUC, *POSCCTL_STRUC;\n#else\ntypedef union _OSCCTL_STRUC{\n\tstruct{\n\t\tUINT32\t\tREF_CYCLE:13;\n\t\tUINT32\t\tRsv:3;\n\t\tUINT32\t\tCAL_CNT:12;\n\t\tUINT32\t\tCAL_ACK:1;\n\t\tUINT32       \tCLK_32K_VLD:1;\n\t\tUINT32       \tCAL_REQ:1;\n\t\tUINT32       \tROSC_EN:1;\n\t}field;\n\tUINT32 word;\n}OSCCTL_STRUC, *POSCCTL_STRUC;\n#endif\n\n\n#define COEXCFG0\t\t\t0x40\n#ifdef RT_BIG_ENDIAN\ntypedef union _COEXCFG0_STRUC{\n\tstruct{\n\t\tUINT32       \tCOEX_CFG1:8;\n\t\tUINT32       \tCOEX_CFG0:8;\t\t\n\t\tUINT32       \tFIX_WL_RF_LNA:2;\n\t\tUINT32\t\tFIX_BT_H_PA:3;\n\t\tUINT32\t\tFIX_BT_L_PA:3;\n\t\tUINT32\t\tFIX_WL_TX_PWR:2;\n\t\tUINT32\t\tRsv:3;\n\t\tUINT32\t\tFIX_WL_ANT_EN:1;\n\t\tUINT32\t\tFIX_WL_DI_ANT:1;\n\t\tUINT32\t\tCOEX_ENT:1;\n\t}field;\n\tUINT32 word;\n}COEXCFG0_STRUC, *PCOEXCFG0_STRUC;\n#else\ntypedef union _COEXCFG0_STRUC{\n\tstruct{\n\t\tUINT32\t\tCOEX_ENT:1;\n\t\tUINT32\t\tFIX_WL_DI_ANT:1;\n\t\tUINT32\t\tFIX_WL_ANT_EN:1;\n\t\tUINT32\t\tRsv:3;\n\t\tUINT32\t\tFIX_WL_TX_PWR:2;\n\t\tUINT32\t\tFIX_BT_L_PA:3;\n\t\tUINT32\t\tFIX_BT_H_PA:3;\n\t\tUINT32       \tFIX_WL_RF_LNA:2;\n\n\t\tUINT32       \tCOEX_CFG0:8;\n\t\tUINT32       \tCOEX_CFG1:8;\n\t}field;\n\tUINT32 word;\n}COEXCFG0_STRUC, *PCOEXCFG0_STRUC;\n#endif\n\n\n#define COEXCFG1\t\t\t0x44\n#ifdef RT_BIG_ENDIAN\ntypedef union _COEXCFG1_STRUC{\n\tstruct{\n\t\tUINT32       \tRsv:8;\n\t\tUINT32\t\tDIS_WL_RF_DELY:8;\n\t\tUINT32\t\tDIS_WL_PA_DELY:8;\n\t\tUINT32\t\tDIS_WL_TR_DELY:8;\n\t}field;\n\tUINT32 word;\n}COEXCFG1_STRUC, *PCOEXCFG1_STRUC;\n#else\ntypedef union _COEXCFG1_STRUC{\n\tstruct{\n\t\tUINT32\t\tDIS_WL_TR_DELY:8;\n\t\tUINT32\t\tDIS_WL_PA_DELY:8;\n\t\tUINT32\t\tDIS_WL_RF_DELY:8;\n\t\tUINT32       \tRsv:8;\n\t}field;\n\tUINT32 word;\n}COEXCFG1_STRUC, *PCOEXCFG1_STRUC;\n#endif\n\n\n#define COEXCFG2\t\t\t0x48\n#ifdef RT_BIG_ENDIAN\ntypedef union _COEXCFG2_STRUC{\n\tstruct{\n\t\tUINT32\t\tBT_COEX_CFG1_Bit31_Rsv:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit30_Rsv:1;\t\n\t\tUINT32\t\tBT_COEX_CFG1_Bit29_HaltHighPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit28_HaltHighPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit27_HaltHighPriorityTx_wl_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit26_HaltLowPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit25_HaltLowPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit24_HaltLowPriorityTx_wl_busy:1;\t\t\n\t\t\n\t\tUINT32\t\tBT_COEX_CFG0_Bit23_Rsv:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit22_Rsv:1;\t\n\t\tUINT32\t\tBT_COEX_CFG0_Bit21_HaltHighPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit20_HaltHighPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit19_HaltHighPriorityTx_wl_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit18_HaltLowPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit17_HaltLowPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit16_HaltLowPriorityTx_wl_busy:1;\n\t\t\n\t\tUINT32\t\tWL_COEX_CFG1_Bit15_LowerTxPwr_bt_high_priority:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit14_Enable_Tx_free_timer:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit13_Disable_TxAgg_bi_high_priority:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit12_Disable_bt_rx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit11_HaltTx_bt_tx_req_l:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit10_HaltTx_bt_tx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit9_HaltTx_bt_rx_req_h:1;\t\n\t\tUINT32\t\tWL_COEX_CFG1_Bit8_HaltTx_bt_rx_busy:1;\t\t\n\t\t\n\t\tUINT32\t\tWL_COEX_CFG0_Bit7_LowerTxPwr_bt_high_priority:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit6_Enable_Tx_free_timer:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit5_Disable_TxAgg_bi_high_priority:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit4_Disable_bt_rx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit3_HaltTx_bt_tx_req_l:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit2_HaltTx_bt_tx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit1_HaltTx_bt_rx_req_h:1;\t\n\t\tUINT32\t\tWL_COEX_CFG0_Bit0_HaltTx_bt_rx_busy:1;\t\t\t\n\t}field;\n\tUINT32 word;\n}COEXCFG2_STRUC, *PCOEXCFG2_STRUC;\n#else\ntypedef union _COEXCFG2_STRUC{\n\tstruct{\n\t\tUINT32\t\tWL_COEX_CFG0_Bit0_HaltTx_bt_rx_busy:1;\t\n\t\tUINT32\t\tWL_COEX_CFG0_Bit1_HaltTx_bt_rx_req_h:1;\t\n\t\tUINT32\t\tWL_COEX_CFG0_Bit2_HaltTx_bt_tx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit3_HaltTx_bt_tx_req_l:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit4_Disable_bt_rx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit5_Disable_TxAgg_bi_high_priority:1;\n\t\tUINT32\t\tWL_COEX_CFG0_Bit6_Enable_Tx_free_timer:1;\t\t\n\t\tUINT32\t\tWL_COEX_CFG0_Bit7_LowerTxPwr_bt_high_priority:1;\n\n\t\tUINT32\t\tWL_COEX_CFG1_Bit8_HaltTx_bt_rx_busy:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit9_HaltTx_bt_rx_req_h:1;\t\n\t\tUINT32\t\tWL_COEX_CFG1_Bit10_HaltTx_bt_tx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit11_HaltTx_bt_tx_req_l:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit12_Disable_bt_rx_req_h:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit13_Disable_TxAgg_bi_high_priority:1;\n\t\tUINT32\t\tWL_COEX_CFG1_Bit14_Enable_Tx_free_timer:1;\t\t\n\t\tUINT32\t\tWL_COEX_CFG1_Bit15_LowerTxPwr_bt_high_priority:1;\n\t\t\n\t\tUINT32\t\tBT_COEX_CFG0_Bit16_HaltLowPriorityTx_wl_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit17_HaltLowPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit18_HaltLowPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit19_HaltHighPriorityTx_wl_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit20_HaltHighPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit21_HaltHighPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG0_Bit22_Rsv:1;\t\n\t\tUINT32\t\tBT_COEX_CFG0_Bit23_Rsv:1;\n\t\t\n\t\tUINT32\t\tBT_COEX_CFG1_Bit24_HaltLowPriorityTx_wl_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit25_HaltLowPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit26_HaltLowPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit27_HaltHighPriorityTx_wl_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit28_HaltHighPriorityTx_wl_rx_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit29_HaltHighPriorityTx_wl_bcn_busy:1;\n\t\tUINT32\t\tBT_COEX_CFG1_Bit30_Rsv:1;\t\t\t\n\t\tUINT32\t\tBT_COEX_CFG1_Bit31_Rsv:1;\n\t}field;\n\tUINT32 word;\n}COEXCFG2_STRUC, *PCOEXCFG2_STRUC;\n#endif\n\n\n#define PLL_CTRL\t\t0x50\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion\t_PLL_CTRL_STRUC\t{\n\tstruct\t{\n\t\tULONG\t\tVBGBK_EN:1;\n\t\tULONG      \tLOCK_DETECT_WINDOW_CTRL:3;\n\t\tULONG\t\tPFD_DELAY_CTRL:2;\n\t\tULONG\t\tCP_CURRENT_CTRL:2;\n\t\tULONG\t\tLPF_C2_CTRL:2;\n\t\tULONG\t\tLPF_C1_CTRL:2;\n\t\tULONG\t\tLPF_R1:1;\n\t\tULONG\t\tVCO_FIXED_CURRENT_CONTROL:3;\n\t\tULONG\t\tRESERVED_INPUT2:8;\n\t\tULONG\t\tRESERVED_INPUT1:8;\n\t}\tfield;\n\tULONG\t\t\tword;\n}\tPLL_CTRL_STRUC, *PPLL_CTRL_STRUC;\n#else\ntypedef\tunion\t_PLL_CTRL_STRUC\t{\n\tstruct\t{\n\t\tULONG\t\tRESERVED_INPUT1:8;\n\t\tULONG\t\tRESERVED_INPUT2:8;\n\t\tULONG\t\tVCO_FIXED_CURRENT_CONTROL:3;\n\t\tULONG\t\tLPF_R1:1;\n\t\tULONG\t\tLPF_C1_CTRL:2;\n\t\tULONG\t\tLPF_C2_CTRL:2;\n\t\tULONG\t\tCP_CURRENT_CTRL:2;\n\t\tULONG\t\tPFD_DELAY_CTRL:2;\n\t\tULONG      \tLOCK_DETECT_WINDOW_CTRL:3;\n\t\tULONG\t\tVBGBK_EN:1;\n\t}\tfield;\n\tULONG\t\t\tword;\n} PLL_CTRL_STRUC, *PPLL_CTRL_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n\n#define WPDMA_RST_IDX \t0x20c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _WPDMA_RST_IDX_STRUC {\n\tstruct\t{\n\t\tUINT32       \t:14;\n\t\tUINT32       \tRST_DRX_IDX1:1;\n\t\tUINT32       \tRST_DRX_IDX0:1;\n\t\tUINT32       \trsv:6;\n\t\tUINT32       \tRST_DTX_IDX9:1;\n\t\tUINT32       \tRST_DTX_IDX8:1;\n\t\tUINT32       \tRST_DTX_IDX7:1;\n\t\tUINT32       \tRST_DTX_IDX6:1;\n\t\tUINT32       \tRST_DTX_IDX5:1;\n\t\tUINT32       \tRST_DTX_IDX4:1;\n\t\tUINT32\t\tRST_DTX_IDX3:1;\n\t\tUINT32\t\tRST_DTX_IDX2:1;\n\t\tUINT32\t\tRST_DTX_IDX1:1;\n\t\tUINT32\t\tRST_DTX_IDX0:1;\n\t}\tfield;\n\tUINT32\t\t\tword;\n}WPDMA_RST_IDX_STRUC, *PWPDMA_RST_IDX_STRUC;\n#else\ntypedef\tunion _WPDMA_RST_IDX_STRUC {\n\tstruct\t{\n\t\tUINT32\t\tRST_DTX_IDX0:1;\n\t\tUINT32\t\tRST_DTX_IDX1:1;\n\t\tUINT32\t\tRST_DTX_IDX2:1;\n\t\tUINT32\t\tRST_DTX_IDX3:1;\n\t\tUINT32       \tRST_DTX_IDX4:1;\n\t\tUINT32       \tRST_DTX_IDX5:1;\n\t\tUINT32       \tRST_DTX_IDX6:1;\n\t\tUINT32       \tRST_DTX_IDX7:1;\t\t\n\t\tUINT32       \tRST_DTX_IDX8:1;\n\t\tUINT32       \tRST_DTX_IDX9:1;\n\t\tUINT32       \trsv:6;\n\t\tUINT32       \tRST_DRX_IDX0:1;\n\t\tUINT32       \tRST_DRX_IDX1:1;\n\t\tUINT32       \t:14;\n\t}\tfield;\n\tUINT32\t\t\tword;\n} WPDMA_RST_IDX_STRUC, *PWPDMA_RST_IDX_STRUC;\n#endif\n#define DELAY_INT_CFG  0x0210\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _DELAY_INT_CFG_STRUC {\n\tstruct\t{\n\t\tUINT32       \tTXDLY_INT_EN:1;\n\t\tUINT32       \tTXMAX_PINT:7;\n\t\tUINT32       \tTXMAX_PTIME:8;\n\t\tUINT32       \tRXDLY_INT_EN:1;\n\t\tUINT32       \tRXMAX_PINT:7;\n\t\tUINT32\t\tRXMAX_PTIME:8;\n\t}\tfield;\n\tUINT32\t\t\tword;\n}DELAY_INT_CFG_STRUC, *PDELAY_INT_CFG_STRUC;\n#else\ntypedef\tunion _DELAY_INT_CFG_STRUC {\n\tstruct\t{\n\t\tUINT32\t\tRXMAX_PTIME:8;\n\t\tUINT32       \tRXMAX_PINT:7;\n\t\tUINT32       \tRXDLY_INT_EN:1;\n\t\tUINT32       \tTXMAX_PTIME:8;\n\t\tUINT32       \tTXMAX_PINT:7;\n\t\tUINT32       \tTXDLY_INT_EN:1;\n\t}\tfield;\n\tUINT32\t\t\tword;\n} DELAY_INT_CFG_STRUC, *PDELAY_INT_CFG_STRUC;\n#endif\n\n#endif /* __RTMP_REG_PCIRBUS_H__ */\n"
  },
  {
    "path": "src/include/iface/rtmp_usb.h",
    "content": "#ifndef __RTMP_USB_H__\n#define __RTMP_USB_H__\n\n#include \"rtusb_io.h\"\n\nextern UCHAR EpToQueue[6];\n\n#define RXBULKAGGRE_SIZE\t\t\t12\n#define MAX_TXBULK_LIMIT\t\t\t(LOCAL_TXBUF_SIZE*(BULKAGGRE_SIZE-1))\n#define MAX_TXBULK_SIZE\t\t\t(LOCAL_TXBUF_SIZE*BULKAGGRE_SIZE)\n#define MAX_RXBULK_SIZE\t\t\t(LOCAL_TXBUF_SIZE*RXBULKAGGRE_SIZE)\n#define MAX_MLME_HANDLER_MEMORY 20\n#define CMD_RSP_BULK_SIZE\t1024\n\n/*Power saving */\n#define PowerWakeCID\t\t3\n#define CID0MASK\t\t0x000000ff\n#define CID1MASK\t\t0x0000ff00\n#define CID2MASK\t\t0x00ff0000\n#define CID3MASK\t\t0xff000000\n\n\n/* Flags for Bulkflags control for bulk out data */\n/* */\n#define\tfRTUSB_BULK_OUT_DATA_NULL\t\t\t0x00000001\n#define\tfRTUSB_BULK_OUT_RTS\t\t\t\t\t0x00000002\n#define\tfRTUSB_BULK_OUT_MLME\t\t\t\t0x00000004\n\n#define\tfRTUSB_BULK_OUT_PSPOLL\t\t\t\t0x00000010\n#define\tfRTUSB_BULK_OUT_DATA_FRAG\t\t\t0x00000020\n#define\tfRTUSB_BULK_OUT_DATA_FRAG_2\t\t\t0x00000040\n#define\tfRTUSB_BULK_OUT_DATA_FRAG_3\t\t\t0x00000080\n#define\tfRTUSB_BULK_OUT_DATA_FRAG_4\t\t\t0x00000100\n\n#define\tfRTUSB_BULK_OUT_DATA_NORMAL\t\t\t0x00010000\n#define\tfRTUSB_BULK_OUT_DATA_NORMAL_2\t\t0x00020000\n#define\tfRTUSB_BULK_OUT_DATA_NORMAL_3\t\t0x00040000\n#define\tfRTUSB_BULK_OUT_DATA_NORMAL_4\t\t0x00080000\n\n\n#define fRTUSB_BULK_OUT_DATA_HCCA\t\t\t0x00100000\n#define fRTUSB_BULK_OUT_DATA_NULL_HCCA\t\t\t0x00400000\n#define fRTUSB_BULK_OUT_MLME_HCCA\t\t\t0x00800000\n\n\n\n/* TODO:move to ./ate/include/iface/ate_usb.h */\n#ifdef RALINK_ATE\n#define\tfRTUSB_BULK_OUT_DATA_ATE\t\t\t0x00100000\n#endif /* RALINK_ATE */\n\n\n#define FREE_HTTX_RING(_pCookie, _pipeId, _txContext)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tif ((_txContext)->ENextBulkOutPosition == (_txContext)->CurWritePosition)\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(_txContext)->bRingEmpty = TRUE;\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/*NdisInterlockedDecrement(&(_p)->TxCount); */\\\n}\n\n#define NT_SUCCESS(status)\t\t\t(((status) >=0) ? (TRUE):(FALSE))\n\n\n\n\n#define PIRP\t\tPVOID\n/*#define NDIS_OID\tUINT */\n#ifndef USB_ST_NOERROR\n#define USB_ST_NOERROR     0\n#endif\n\n\n/* vendor-specific control operations */\n#define CONTROL_TIMEOUT_JIFFIES ( (300 * OS_HZ) / 1000)\n/*#define UNLINK_TIMEOUT_MS\t\t3 // os abl move */\n\n\n#define DEVICE_VENDOR_REQUEST_OUT       0x40\n#define DEVICE_VENDOR_REQUEST_IN        0xc0\n/*#define INTERFACE_VENDOR_REQUEST_OUT    0x41 */\n/*#define INTERFACE_VENDOR_REQUEST_IN     0xc1 */\n#define BULKOUT_MGMT_RESET_FLAG\t\t0x80\n\n#define RTUSB_SET_BULK_FLAG(_M, _F)\t((_M)->BulkFlags |= (_F))\n#define RTUSB_CLEAR_BULK_FLAG(_M, _F)\t((_M)->BulkFlags &= ~(_F))\n#define RTUSB_TEST_BULK_FLAG(_M, _F)\t(((_M)->BulkFlags & (_F)) != 0)\n\n#endif /* __RTMP_USB_H__ */\n"
  },
  {
    "path": "src/include/igmp_snoop.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tigmp_snoop.h\n \n    Abstract:\n    \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n \n\n#ifndef __RTMP_IGMP_SNOOP_H__\n#define __RTMP_IGMP_SNOOP_H__\n\n#include \"link_list.h\"\n\n#define IGMP_PROTOCOL_DESCRIPTOR\t0x02\n#define IGMP_V1_MEMBERSHIP_REPORT\t0x12\n#define IGMP_V2_MEMBERSHIP_REPORT\t0x16\n#define IGMP_LEAVE_GROUP\t\t\t0x17\n#define IGMP_V3_MEMBERSHIP_REPORT\t0x22\n\n#define MLD_V1_LISTENER_REPORT\t\t131\n#define MLD_V1_LISTENER_DONE\t\t132\n#define MLD_V2_LISTERNER_REPORT\t\t143\n\n#define IGMPMAC_TB_ENTRY_AGEOUT_TIME (120 * OS_HZ)\n\n#define MULTICAST_ADDR_HASH_INDEX(Addr)      (MAC_ADDR_HASH(Addr) & (MAX_LEN_OF_MULTICAST_FILTER_HASH_TABLE - 1))\n\n#define IS_MULTICAST_MAC_ADDR(Addr)\t\t\t((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff))\n#define IS_IPV6_MULTICAST_MAC_ADDR(Addr)\t((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) == 0x33))\n#define IS_BROADCAST_MAC_ADDR(Addr)\t\t\t((((Addr[0]) & 0xff) == 0xff))\n\n#define IGMP_NONE\t\t0\n#define IGMP_PKT\t\t1\n#define IGMP_IN_GROUP\t2\n\n\nVOID MulticastFilterTableInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMULTICAST_FILTER_TABLE *ppMulticastFilterTable);\n\nVOID MultiCastFilterTableReset(\n\tIN PMULTICAST_FILTER_TABLE *ppMulticastFilterTable);\n\nBOOLEAN MulticastFilterTableInsertEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pGrpId,\n\tIN PUCHAR pMemberAddr,\n\tIN PNET_DEV dev,\n\tIN MulticastFilterEntryType type);\n\nBOOLEAN MulticastFilterTableDeleteEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pGrpId,\n\tIN PUCHAR pMemberAddr,\n\tIN PNET_DEV dev);\n\nPMULTICAST_FILTER_TABLE_ENTRY MulticastFilterTableLookup(\n\tIN PMULTICAST_FILTER_TABLE pMulticastFilterTable,\n\tIN PUCHAR pAddr,\n\tIN PNET_DEV dev);\n\nBOOLEAN isIgmpPkt(\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pIpHeader);\n\nVOID IGMPSnooping(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pSrcMacAddr,\n\tIN PUCHAR pIpHeader,\n\tIN PNET_DEV pDev);\n\nBOOLEAN isMldPkt(\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pIpHeader,\n\tOUT UINT8 *pProtoType,\n\tOUT PUCHAR *pMldHeader);\n\nBOOLEAN IPv6MulticastFilterExcluded(\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pIpHeader);\n\nVOID MLDSnooping(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDstMacAddr,\n\tIN PUCHAR pSrcMacAddr,\n\tIN PUCHAR pIpHeader,\n\tIN PNET_DEV pDev);\n\nUCHAR IgmpMemberCnt(\n\tIN PLIST_HEADER pList);\n\nVOID IgmpGroupDelMembers(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMemberAddr,\n\tIN PNET_DEV pDev);\n\nINT Set_IgmpSn_Enable_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_IgmpSn_AddEntry_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_IgmpSn_DelEntry_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nINT Set_IgmpSn_TabDisplay_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nvoid rtmp_read_igmp_snoop_from_file(\n\tIN  PRTMP_ADAPTER pAd,\n\tPSTRING tmpbuf,\n\tPSTRING buffer);\n\nNDIS_STATUS IgmpPktInfoQuery(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pSrcBufVA,\n\tIN PNDIS_PACKET pPacket,\n\tIN UCHAR FromWhichBSSID,\n\tOUT INT *pInIgmpGroup,\n\tOUT PMULTICAST_FILTER_TABLE_ENTRY *ppGroupEntry);\n\nNDIS_STATUS IgmpPktClone(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket,\n\tIN INT IgmpPktInGroup,\n\tIN PMULTICAST_FILTER_TABLE_ENTRY pGroupEntry,\n\tIN UCHAR QueIdx,\n\tIN UINT8 UserPriority,\n\tIN PNET_DEV pNetDev);\n\n#endif /* __RTMP_IGMP_SNOOP_H__ */\n\n"
  },
  {
    "path": "src/include/ipv6.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tipv6.h\n \n    Abstract:\n    \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __IPV6_HDR_H_\n#define __IPV6_HDR_H_\n\n#define IPV6_ADDR_LEN 16\n#define IPV6_HDR_LEN  40\n\n/* IPv6 address definition */\n#define IPV6_LINK_LOCAL_ADDR_PREFIX\t\t0xFE8\n#define IPV6_SITE_LOCAL_ADDR_PREFIX\t\t0xFEC\n#define IPV6_LOCAL_ADDR_PREFIX\t\t\t0xFE8\n#define IPV6_MULTICAST_ADDR_PREFIX\t\t0xFF\n#define IPV6_LOOPBACK_ADDR\t\t\t\t0x1\n#define IPV6_UNSPECIFIED_ADDR\t\t\t0x0\n\n/* defined as sequence in IPv6 header */\n#define IPV6_NEXT_HEADER_HOP_BY_HOP\t\t0x00\t/* 0 */\n#define IPV6_NEXT_HEADER_DESTINATION\t0x3c\t/* 60 */\n#define IPV6_NEXT_HEADER_ROUTING\t\t0x2b\t/* 43 */\n#define IPV6_NEXT_HEADER_FRAGMENT\t\t0x2c\t/* 44 */\n#define IPV6_NEXT_HEADER_AUTHENTICATION\t0x33  \t/* 51 */\n#define IPV6_NEXT_HEADER_ENCAPSULATION\t0x32  \t/* 50, RFC-2406 */\n#define IPV6_NEXT_HEADER_NONE\t\t\t0x3b\t/* 59 */\n\n#define IPV6_NEXT_HEADER_TCP\t\t\t0x06\n#define IPV6_NEXT_HEADER_UDP\t\t\t0x11\n#define IPV6_NEXT_HEADER_ICMPV6\t\t\t0x3a\n#define IPV6_NEXT_HEADER_PIM\t\t\t0x67\n\n/* ICMPv6 msg type definition */\n#define ICMPV6_MSG_TYPE_ROUTER_SOLICITATION\t\t\t0x85 /* 133 */\n#define ROUTER_SOLICITATION_FIXED_LEN\t\t\t\t8\n\n#define ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT\t\t0x86 /* 134 */\n#define ROUTER_ADVERTISEMENT_FIXED_LEN\t\t\t\t16\n\n#define ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION\t\t0x87 /* 135 */\n#define NEIGHBOR_SOLICITATION_FIXED_LEN\t\t\t\t24\n\n#define ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT\t\t0x88 /* 136 */\n#define NEIGHBOR_ADVERTISEMENT_FIXED_LEN\t\t\t24\n\n#define ICMPV6_MSG_TYPE_REDIRECT\t\t\t\t\t0x89 /* 137 */\n#define REDIRECT_FIXED_LEN\t\t\t\t\t\t\t40\n\n/* IPv6 Address related structures */\ntypedef struct rt_ipv6_addr_\n{\n\tunion\n\t{\n\t\tUCHAR\tipv6Addr8[16];\n\t\tUSHORT\tipv6Addr16[8];\n\t\tUINT32\tipv6Addr32[4];\n\t}addr;\n#define ipv6_addr\t\t\taddr.ipv6Addr8\n#define ipv6_addr16\t\t\taddr.ipv6Addr16\n#define ipv6_addr32\t\t\taddr.ipv6Addr32\n}RT_IPV6_ADDR, *PRT_IPV6_ADDR;\n\n\t\n#define PRINT_IPV6_ADDR(ipv6Addr)\t\\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[0]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[1]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[2]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[3]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[4]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[5]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[6]), \\\n\tOS_NTOHS((ipv6Addr).ipv6_addr16[7])\n\n\n/*\u0014\u0014IPv6 Header related structures */\ntypedef struct GNU_PACKED _rt_ipv6_hdr_\n{\n\tUINT32 \t\t\tver:4,\n\t\t\t\t\ttrafficClass:8,\n        \t\t   \tflowLabel:20;\n\tUSHORT \t\t\tpayload_len;\n\tUCHAR  \t\t\tnextHdr;\n\tUCHAR  \t\t\thopLimit;\n\tRT_IPV6_ADDR  \tsrcAddr;\n\tRT_IPV6_ADDR\tdstAddr;\n}RT_IPV6_HDR, *PRT_IPV6_HDR;\n\n\ntypedef struct GNU_PACKED _rt_ipv6_ext_hdr_\n{\n\tUCHAR\tnextProto; /* Indicate the protocol type of next extension header. */\n\tUCHAR\textHdrLen; /* optional field for msg length of this extension header which didn't include the first \"nextProto\" field. */\n\tUCHAR\toctets[1]; /* hook to extend header message body. */\n}RT_IPV6_EXT_HDR, *PRT_IPV6_EXT_HDR;\n\n\n/* ICMPv6 related structures */\ntypedef struct GNU_PACKED _rt_ipv6_icmpv6_hdr_\n{\n\tUCHAR\ttype;\n\tUCHAR\tcode;\n\tUSHORT\tchksum;\n\tUCHAR\toctets[1]; /*hook to extend header message body. */\n}RT_ICMPV6_HDR, *PRT_ICMPV6_HDR;\n\n\ntypedef struct GNU_PACKED _rt_icmp6_option_hdr_\n{\n\tUCHAR type;\n\tUCHAR len;\n\tUCHAR octet[1];\n}RT_ICMPV6_OPTION_HDR, *PRT_ICMPV6_OPTION_HDR;\n\ntypedef enum{\n/* Defined ICMPv6 Option Types. */\n\tTYPE_SRC_LL_ADDR \t= 1,\n\tTYPE_TGT_LL_ADDR \t= 2,\n\tTYPE_PREFIX_INFO \t\t\t= 3,\n\tTYPE_REDIRECTED_HDR\t\t\t= 4,\n\tTYPE_MTU\t\t\t\t\t= 5,\n}ICMPV6_OPTIONS_TYPE_DEF;\n\n\nstatic inline BOOLEAN IPv6ExtHdrHandle(\n\tRT_IPV6_EXT_HDR \t*pExtHdr,\n\tUCHAR \t\t\t\t*pProto,\n\tUINT32 \t\t\t\t*pOffset)\n{\n\tUCHAR nextProto = 0xff;\n\tUINT32 extLen = 0;\n\tBOOLEAN status = TRUE;\n\n\t/*printk(\"%s(): parsing the Extension Header with Protocol(0x%x):\\n\", __FUNCTION__, *pProto); */\n\tswitch (*pProto)\n\t{\n\t\tcase IPV6_NEXT_HEADER_HOP_BY_HOP:\n\t\t\t/* IPv6ExtHopByHopHandle(); */\n\t\t\tnextProto = pExtHdr->nextProto;\n\t\t\textLen = (pExtHdr->extHdrLen + 1) * 8;\n\t\t\tbreak;\n\t\t\t\n\t\tcase IPV6_NEXT_HEADER_DESTINATION:\n\t\t\t/* IPv6ExtDestHandle(); */\n\t\t\tnextProto = pExtHdr->nextProto;\n\t\t\textLen = (pExtHdr->extHdrLen + 1) * 8;\n\t\t\tbreak;\n\t\t\t\n\t\tcase IPV6_NEXT_HEADER_ROUTING:\n\t\t\t/* IPv6ExtRoutingHandle(); */\n\t\t\tnextProto = pExtHdr->nextProto;\n\t\t\textLen = (pExtHdr->extHdrLen + 1) * 8;\n\t\t\tbreak;\n\t\t\t\n\t\tcase IPV6_NEXT_HEADER_FRAGMENT:\n\t\t\t/* IPv6ExtFragmentHandle(); */\n\t\t\tnextProto = pExtHdr->nextProto;\n\t\t\textLen = 8; /* The Fragment header length is fixed to 8 bytes. */\n\t\t\tbreak;\n\t\t\t\n\t\tcase IPV6_NEXT_HEADER_AUTHENTICATION:\n\t\t/*   IPV6_NEXT_HEADER_ENCAPSULATION: */\n\t\t\t/*\n\t\t\t\tTODO: Not support. For encryption issue.\n\t\t\t*/\n\t\t\tnextProto = 0xFF;\n\t\t\tstatus = FALSE;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tnextProto = 0xFF;\n\t\t\tstatus = FALSE;\t\t\t\n\t\t\tbreak;\n\t}\n\n\t*pProto = nextProto;\n\t*pOffset += extLen;\n\t/*printk(\"%s(): nextProto = 0x%x!, offset=0x%x!\\n\", __FUNCTION__, nextProto, offset); */\n\t\n\treturn status;\n\t\n}\n\n#endif /* __IPV6_HDR_H_ */\n\n"
  },
  {
    "path": "src/include/link_list.h",
    "content": "\n#ifndef __LINK_LIST_H__\n#define __LINK_LIST_H__\n\ntypedef struct _LIST_ENTRY\n{\n\tstruct _LIST_ENTRY *pNext;\n} LIST_ENTRY, *PLIST_ENTRY;\n\ntypedef struct _LIST_HEADR\n{\n\tPLIST_ENTRY pHead;\n\tPLIST_ENTRY pTail;\n\tUCHAR size;\n} LIST_HEADER, *PLIST_HEADER;\n\nstatic inline VOID initList(\n\tIN PLIST_HEADER pList)\n{\n\tpList->pHead = pList->pTail = NULL;\n\tpList->size = 0;\n\treturn;\n}\n\nstatic inline VOID insertTailList(\n\tIN PLIST_HEADER pList,\n\tIN PLIST_ENTRY pEntry)\n{\n\tpEntry->pNext = NULL;\n\tif (pList->pTail)\n\t\tpList->pTail->pNext = pEntry;\n\telse\n\t\tpList->pHead = pEntry;\n\tpList->pTail = pEntry;\n\tpList->size++;\n\n\treturn;\n}\n\nstatic inline PLIST_ENTRY removeHeadList(\n\tIN PLIST_HEADER pList)\n{\n\tPLIST_ENTRY pNext;\n\tPLIST_ENTRY pEntry;\n\n\tpEntry = pList->pHead;\n\tif (pList->pHead != NULL)\n\t{\n\t\tpNext = pList->pHead->pNext;\n\t\tpList->pHead = pNext;\n\t\tif (pNext == NULL)\n\t\t\tpList->pTail = NULL;\n\t\tpList->size--;\n\t}\n\treturn pEntry;\n}\n\nstatic inline int getListSize(\n\tIN PLIST_HEADER pList)\n{\n\treturn pList->size;\n}\n\nstatic inline PLIST_ENTRY delEntryList(\n\tIN PLIST_HEADER pList,\n\tIN PLIST_ENTRY pEntry)\n{\n\tPLIST_ENTRY pCurEntry;\n\tPLIST_ENTRY pPrvEntry;\n\n\tif(pList->pHead == NULL)\n\t\treturn NULL;\n\n\tif(pEntry == pList->pHead)\n\t{\n\t\tpCurEntry = pList->pHead;\n\t\tpList->pHead = pCurEntry->pNext;\n\n\t\tif(pList->pHead == NULL)\n\t\t\tpList->pTail = NULL;\n\n\t\tpList->size--;\n\t\treturn pCurEntry;\n\t}\n\n\tpPrvEntry = pList->pHead;\n\tpCurEntry = pPrvEntry->pNext;\n\twhile(pCurEntry != NULL)\n\t{\n\t\tif (pEntry == pCurEntry)\n\t\t{\n\t\t\tpPrvEntry->pNext = pCurEntry->pNext;\n\n\t\t\tif(pEntry == pList->pTail)\n\t\t\t\tpList->pTail = pPrvEntry;\n\n\t\t\tpList->size--;\n\t\t\tbreak;\n\t\t}\n\t\tpPrvEntry = pCurEntry;\n\t\tpCurEntry = pPrvEntry->pNext;\n\t}\n\n\treturn pCurEntry;\n}\n\n\ntypedef struct _DL_LIST\n{\n\tstruct _DL_LIST *Next;\n\tstruct _DL_LIST *Prev;\n}DL_LIST, *PDL_LIST;\n\nstatic inline void DlListInit(struct _DL_LIST *List)\n{\n\tList->Next = List;\n\tList->Prev = List;\n}\n\nstatic inline void DlListAdd(struct _DL_LIST *List, struct _DL_LIST *Item)\n{\n\tItem->Next = List->Next;\n\tItem->Prev = List;\n\tList->Next->Prev = Item;\n\tList->Next = Item; \t\n}\n\nstatic inline void DlListAddTail(struct _DL_LIST *List, struct _DL_LIST *Item)\n{\n\tDlListAdd(List->Prev, Item);\n}\n\nstatic inline void DlListDel(struct _DL_LIST *Item)\n{\n\tItem->Next->Prev = Item->Prev;\n\tItem->Prev->Next = Item->Next;\n\tItem->Next = NULL;\n\tItem->Prev = NULL;\n}\n\nstatic inline int DlListEmpty(struct _DL_LIST *List)\n{\n\treturn List->Next == List;\n}\n\nstatic inline unsigned int DlListLen(struct _DL_LIST *List)\n{\n\tstruct _DL_LIST *Item;\n\tunsigned int Count = 0;\n\t\n\tfor (Item = List->Next; Item != List; Item = Item->Next)\n\t\tCount++;\n\t\n\treturn Count;\n}\n\n\n#ifndef offsetof\n#define offsetof(type, member) ((long) &((type *) 0)->member)\n#endif\n\n#define DlListEntry(item, type, member) \\\n    ((type *) ((char *) item - offsetof(type, member)))\n\n#define DlListFirst(list, type, member) \\\n    (DlListEmpty((list)) ? NULL : \\\n     DlListEntry((list)->Next, type, member))\n\n#define DlListForEach(item, list, type, member) \\\n    for (item = DlListEntry((list)->Next, type, member); \\\n         &item->member != (list); \\\n         item = DlListEntry(item->member.Next, type, member))\n\n#define DlListForEachSafe(item, n, list, type, member) \\\n    for (item = DlListEntry((list)->Next, type, member), \\\n             n = DlListEntry(item->member.Next, type, member); \\\n         &item->member != (list); \\\n         item = n, n = DlListEntry(n->member.Next, type, member))\n\n\n#endif /* ___LINK_LIST_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/fce.h",
    "content": "/*\n\n*/\n\n#ifndef __FCE_H__\n#define __FCE_H__\n\n#include \"rt_config.h\"\n\n#define FCE_PSE_CTRL\t0x0800\n#define FCE_CSO\t\t\t0x0808\n#define FCE_L2_STUFF\t0x080c\n#define TX_CPU_PORT_FROM_FCE_BASE_PTR\t\t0x09A0\n#define TX_CPU_PORT_FROM_FCE_MAX_COUNT\t\t0x09A4\n#define FCE_PDMA_GLOBAL_CONF\t\t\t\t0x09C4\n#define TX_CPU_PORT_FROM_FCE_CPU_DESC_INDEX 0x09A8\n#define FCE_SKIP_FS\t\t\t\t\t\t\t0x0A6C\n#define PER_PORT_PAUSE_ENABLE_CONTROL1\t\t0x0A38\n\n#ifdef BIG_ENDIAN\ntypedef\tunion _L2_STUFFING_STRUC\n{\n\tstruct\t{\n\t    UINT32  RSV:6;\n\t    UINT32  OTHER_PORT:2;\n\t\tUINT32  TS_LENGTH_EN:8;\n\t\tUINT32  TS_CMD_QSEL_EN:8;\n\t\tUINT32  RSV2:2;\n\t\tUINT32  MVINF_BYTE_SWP:1;\n\t\tUINT32  FS_WR_MPDU_LEN_EN:1;\n\t\tUINT32  TX_L2_DE_STUFFING_EN:1;\n\t\tUINT32  RX_L2_STUFFING_EN:1;\n\t\tUINT32  QoS_L2_EN:1;\n\t\tUINT32  HT_L2_EN:1;\n\t}\tfield;\n\t\n\tUINT32 word;\n} L2_STUFFING_STRUC, *PL2_STUFFING_STRUC;\n#else\ntypedef\tunion _L2_STUFFING_STRUC\n{\n\tstruct\t{\n\t\tUINT32  HT_L2_EN:1;\n\t\tUINT32  QoS_L2_EN:1;\n\t\tUINT32  RX_L2_STUFFING_EN:1;\n\t\tUINT32  TX_L2_DE_STUFFING_EN:1;\n\t\tUINT32  FS_WR_MPDU_LEN_EN:1;\n\t\tUINT32  MVINF_BYTE_SWP:1;\n\t\tUINT32  RSV2:2;\n\t\tUINT32  TS_CMD_QSEL_EN:8;\n\t\tUINT32  TS_LENGTH_EN:8;\n\t\tUINT32  OTHER_PORT:2;\n\t\tUINT32  RSV:6;\n\t}\tfield;\n\t\n\tUINT32 word;\n} L2_STUFFING_STRUC, *PL2_STUFFING_STRUC;\n#endif\n\n#define NORMAL_PKT\t\t\t\t0x0\n#define CMD_PKT\t\t\t\t\t0x1\n\n#define FCE_WLAN_PORT\t\t\t0x0\n#define FCE_CPU_RX_PORT\t\t\t0x1\n#define FCE_CPU_TX_PORT\t\t\t0x2\n#define FCE_HOST_PORT\t\t\t0x3\n#define FCE_VIRTUAL_CPU_RX_PORT\t0x4\n#define FCE_VIRTUAL_CPU_TX_PORT\t0x5\n#define FCE_DISCARD\t\t\t\t0x6\n#endif /*__FCE_H__ */\n"
  },
  {
    "path": "src/include/mac_ral/mac_pci.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tmac_pci.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __MAC_PCI_H__\n#define __MAC_PCI_H__\n\n#include \"rtmp_type.h\"\n\n#ifdef RLT_MAC\n#include \"mac_ral/nmac/ral_nmac_pci.h\"\n#endif /* RLT_MAC */\n#ifdef RTMP_MAC\n#include \"mac_ral/omac/ral_omac_pci.h\"\n#endif /* RTMP_MAC */\n\n#include \"mac_ral/rtmp_mac.h\"\n#include \"chip/rtmp_phy.h\"\n#include \"rtmp_iface.h\"\n#include \"rtmp_dot11.h\"\n\n\n\n#define fRTMP_ADAPTER_NEED_STOP_TX\t0\n\n\n/* =================================================================================\n\tPCI/RBUS TX / RX Frame Descriptors format\n\n\tMemory Layout\n\n\t1. Tx Descriptor\n\t\t\tTxD (12 bytes) + TXINFO (4 bytes)\n\t2. Packet Buffer\n\t\t\tTXWI + 802.11\n         31                                                                                                                             0\n\t+--------------------------------------------------------------------------+\n\t|                                   SDP0[31:0]                                                                               |\n\t+-+--+---------------------+-+--+-----------------------------------------+\n\t|D |L0|       SDL0[13:0]              |B|L1|                    SDL1[13:0]                                    |\n\t+-+--+---------------------+-+--+-----------------------------------------+\n\t|                                   SDP1[31:0]                                                                               |\n\t+--------------------------------------------------------------------------+\n\t|                                        TXINFO                                                                                |\n\t+--------------------------------------------------------------------------+\n================================================================================= */\n/*\n\tTX descriptor format for Tx Data/Mgmt Rings\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _TXD_STRUC {\n\t/* Word 0 */\n\tUINT32\t\tSDPtr0;\n\t/* Word 1 */\n\tUINT32\t\tDMADONE:1;\n\tUINT32\t\tLastSec0:1;\n\tUINT32\t\tSDLen0:14;\n\tUINT32\t\tBurst:1;\n\tUINT32\t\tLastSec1:1;\n\tUINT32\t\tSDLen1:14;\n\t/* Word 2 */\n\tUINT32\t\tSDPtr1;\n} TXD_STRUC, *PTXD_STRUC;\n#else\ntypedef\tstruct GNU_PACKED _TXD_STRUC {\n\t/* Word\t0 */\n\tUINT32\t\tSDPtr0;\n\t/* Word\t1 */\n\tUINT32\t\tSDLen1:14;\n\tUINT32\t\tLastSec1:1;\n\tUINT32\t\tBurst:1;\n\tUINT32\t\tSDLen0:14;\n\tUINT32\t\tLastSec0:1;\n\tUINT32\t\tDMADONE:1;\n\t/*Word2 */\n\tUINT32\t\tSDPtr1;\n} TXD_STRUC, *PTXD_STRUC;\n#endif\n\n\n/*\n\tRx descriptor format, Rx Ring\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _RXD_STRUC{\n\t/* Word 0 */\n\tUINT32\t\tSDP0;\n\t/* Word 1 */\n\tUINT32\t\tDDONE:1;\n\tUINT32\t\tLS0:1;\n\tUINT32\t\tSDL0:14;\n\tUINT32\t\tBURST:1;\n\tUINT32\t\tLS1:1;\n\tUINT32\t\tSDL1:14;\n\t/* Word 2 */\n\tUINT32\t\tSDP1;\n}RXD_STRUC, *PRXD_STRUC;\n#else\ntypedef\tstruct GNU_PACKED _RXD_STRUC{\n\t/* Word\t0 */\n\tUINT32\t\tSDP0;\n\t/* Word\t1 */\n\tUINT32\t\tSDL1:14;\n\tUINT32\t\tLS1:1;\n\tUINT32\t\tBURST:1;\n\tUINT32\t\tSDL0:14;\n\tUINT32\t\tLS0:1;\n\tUINT32\t\tDDONE:1;\n\t/* Word\t2 */\n\tUINT32\t\tSDP1;\n}RXD_STRUC, *PRXD_STRUC;\n#endif\n\n\n/* ----------------- EEPROM Related MACRO ----------------- */\n\n/* 8051 firmware image for RT2860 - base address = 0x4000 */\n#define FIRMWARE_IMAGE_BASE     0x2000\n#define MAX_FIRMWARE_IMAGE_SIZE 0x2000    /* 8kbyte */\n\n\n/* ----------------- Frimware Related MACRO ----------------- */\n#define RTMP_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen)\t\t\\\n\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tULONG\t_i, _firm;\t\t\t\t\t\t\t\t\t\\\n\t\t/* protect 8051 we will do firmware upload */\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x10000);\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tfor(_i=0; _i<_FwLen; _i+=4)\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_firm = _pFwImage[_i] +\t\t\t\t\t\t\t\\\n\t\t\t   (_pFwImage[_i+3] << 24) +\t\t\t\t\t\\\n\t\t\t   (_pFwImage[_i+2] << 16) +\t\t\t\t\t\\\n\t\t\t   (_pFwImage[_i+1] << 8);\t\t\t\t\t\t\\\n\t\t\tRTMP_IO_WRITE32(_pAd, FIRMWARE_IMAGE_BASE + _i, _firm);\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* do 8051 firmware reset */\t\t\t\t\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00000);\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00001);\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* initialize BBP R/W access agent */\t\t\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, 0);\t\t\t\\\n\t\tRTMP_IO_WRITE32(_pAd, H2M_MAILBOX_CSR, 0);\t\t\t\\\n\t}while(0)\n\n\n/* ----------------- TX Related MACRO ----------------- */\n#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags)\t\tdo{}while(0)\n#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags)\t\tdo{}while(0)\n\n\n#define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \\\n\t\t((freeNum) >= (ULONG)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + 3)) /* rough estimate we will use 3 more descriptor. */\n#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx)\t\\\n\t\tdo{}while(0)\n\n#define NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, freeNum, _TxFrameType) \\\n\t\t(((freeNum != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 0)) || (freeNum<3))\n\t\t/*(((freeNum) != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 1)) */\n\t\t\n\n#define HAL_KickOutMgmtTx(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen)\t\\\n\t\t\tRtmpPCIMgmtKickOut(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen)\n\n#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)\t\\\n\t\t/* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)*/\n\n#define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber)\t\\\n\t\t\tRtmpPCI_WriteSingleTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)\n\n#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \\\n\t\t\tRtmpPCI_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)\n\t\t\t\n#define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber)\t\\\n\t\t\tRtmpPCI_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber)\n\t\n#define HAL_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx)\t\\\n\t\t\tRtmpPCI_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx)\n\n#define HAL_LastTxIdx(_pAd, _QueIdx,_LastTxIdx) \\\n\t\t\t/*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx)*/\n\n#ifdef RLT_MAC\n#define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx)\t\\\n\t\t\tRTMP_IO_WRITE32((_pAd), TX_RING_CIDX + ((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx)\n#endif /* RLT_MAC */\n#ifdef RTMP_MAC\n#define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx)\t\\\n\t\t\tRTMP_IO_WRITE32((_pAd), TX_CTX_IDX0+((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx)\n/*\t\t\tRtmpPCIDataKickOut(_pAd, _pTxBlk, _QueIdx)*/\n#endif /* RTMP_MAC */\n\n#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen)\t\\\n\t\t\tMiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen)\n\t\t\t\n#define GET_TXRING_FREENO(_pAd, _QueIdx) \\\n\t(_pAd->TxRing[_QueIdx].TxSwFreeIdx > _pAd->TxRing[_QueIdx].TxCpuIdx)\t? \\\n\t\t\t(_pAd->TxRing[_QueIdx].TxSwFreeIdx - _pAd->TxRing[_QueIdx].TxCpuIdx - 1) \\\n\t\t\t :\t\\\n\t\t\t(_pAd->TxRing[_QueIdx].TxSwFreeIdx + TX_RING_SIZE - _pAd->TxRing[_QueIdx].TxCpuIdx - 1);\n\n\n#define GET_MGMTRING_FREENO(_pAd) \\\n\t(_pAd->MgmtRing.TxSwFreeIdx > _pAd->MgmtRing.TxCpuIdx)\t? \\\n\t\t\t(_pAd->MgmtRing.TxSwFreeIdx - _pAd->MgmtRing.TxCpuIdx - 1) \\\n\t\t\t :\t\\\n\t\t\t(_pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - _pAd->MgmtRing.TxCpuIdx - 1);\n\n\n/* ----------------- RX Related MACRO ----------------- */\n\n\n/* ----------------- ASIC Related MACRO ----------------- */\n/* reset MAC of a station entry to 0x000000000000 */\n#define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid)\t\\\n\tAsicDelWcidTab(pAd, Wcid);\n\n/* add this entry into ASIC RX WCID search table */\n#define RTMP_STA_ENTRY_ADD(pAd, pEntry)\t\t\\\n\tAsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);\n\n#define RTMP_UPDATE_PROTECT(_pAd, _OperationMode, _SetMask, _bDisableBGProtect, _bNonGFExist)\t\\\n\tAsicUpdateProtect(pAd, _OperationMode, _SetMask, _bDisableBGProtect, _bNonGFExist);\n\n#ifdef CONFIG_AP_SUPPORT\n#define RTMP_AP_UPDATE_CAPABILITY_AND_ERPIE(pAd)\t\\\n\tAPUpdateCapabilityAndErpIe(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n/* Insert the BA bitmap to ASIC for the Wcid entry */\n#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID)\t\\\n\t\tdo{\t\t\t\t\t\\\n\t\t\tUINT32\t_Value = 0, _Offset;\t\t\t\t\t\\\n\t\t\t_Offset = MAC_WCID_BASE + (_Aid) * HW_WCID_ENTRY_SIZE + 4;\t\\\n\t\t\tRTMP_IO_READ32((_pAd), _Offset, &_Value);\\\n\t\t\t_Value |= (0x10000<<(_TID));\t\\\n\t\t\tRTMP_IO_WRITE32((_pAd), _Offset, _Value);\\\n\t\t}while(0)\n\n\n/* Remove the BA bitmap from ASIC for the Wcid entry */\n/*\t\tbitmap field starts at 0x10000 in ASIC WCID table */\n#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID)\t\t\t\t\\\n\t\tdo{\t\t\t\t\t\t\t\t\\\n\t\t\tUINT32\t_Value = 0, _Offset;\t\t\t\t\\\n\t\t\t_Offset = MAC_WCID_BASE + (_Wcid) * HW_WCID_ENTRY_SIZE + 4;\t\\\n\t\t\tRTMP_IO_READ32((_pAd), _Offset, &_Value);\t\t\t\\\n\t\t\t_Value &= (~(0x10000 << (_TID)));\t\t\t\t\\\n\t\t\tRTMP_IO_WRITE32((_pAd), _Offset, _Value);\t\t\t\\\n\t\t}while(0)\n\n\n/* ----------------- Interface Related MACRO ----------------- */\n\n/* */\n/* Enable & Disable NIC interrupt via writing interrupt mask register */\n/* Since it use ADAPTER structure, it have to be put after structure definition. */\n/* */\n#define RTMP_ASIC_INTERRUPT_DISABLE(_pAd)\t\t\\\n\tdo{\t\t\t\\\n\t\tRTMP_IO_WRITE32((_pAd), INT_MASK_CSR, 0x0);     /* 0: disable */\t\\\n\t\tRTMP_CLEAR_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE);\t\t\\\n\t}while(0)\n\n#define RTMP_ASIC_INTERRUPT_ENABLE(_pAd)\\\n\tdo{\t\t\t\t\\\n\t\tRTMP_IO_WRITE32((_pAd), INT_MASK_CSR, (_pAd)->int_enable_reg /*DELAYINTMASK*/);     /* 1:enable */\t\\\n\t\tRTMP_SET_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE);\t\\\n\t}while(0)\n\n\n#ifdef RLT_MAC\n#define RTMP_IRQ_INIT(pAd)\t\\\n\t{\tunsigned long _irqFlags;\\\n\t\tRTMP_INT_LOCK(&pAd->irq_lock, _irqFlags);\\\n\t\tpAd->int_enable_reg = ((DELAYINTMASK) |(RxINT|TxDataInt|TxMgmtInt));\\\n\t\tpAd->int_disable_mask = 0;\\\n\t\tpAd->int_pending = 0;\\\n\t\tRTMP_INT_UNLOCK(&pAd->irq_lock, _irqFlags);\\\n\t}\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n#define RTMP_IRQ_INIT(pAd)\t\\\n\t{\tunsigned long _irqFlags;\\\n\t\tRTMP_INT_LOCK(&pAd->irq_lock, _irqFlags);\\\n\t\tpAd->int_enable_reg = ((DELAYINTMASK) |\t\t\\\n\t\t\t\t\t(RxINT|TxDataInt|TxMgmtInt)) & ~(0x03);\t\\\n\t\tpAd->int_disable_mask = 0;\t\t\t\t\t\t\\\n\t\tpAd->int_pending = 0; \\\n\t\tRTMP_INT_UNLOCK(&pAd->irq_lock, _irqFlags);\\\n\t}\n#endif /* RTMP_MAC */\n\n#define RTMP_IRQ_ENABLE(pAd)\t\t\t\t\t\\\n{\t/* clear garbage ints */\t\t\t\\\n\t\tunsigned long _irqFlags;\\\n\t\tRTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff);\\\n\t\tRTMP_INT_LOCK(&pAd->irq_lock, _irqFlags);\\\n\t\tRTMP_ASIC_INTERRUPT_ENABLE(pAd); \\\n\t\tRTMP_INT_UNLOCK(&pAd->irq_lock, _irqFlags);\\\n}\n\n\n\n/* ----------------- MLME Related MACRO ----------------- */\n#define RTMP_MLME_HANDLER(pAd)\t\t\tMlmeHandler(pAd)\n\n#define RTMP_MLME_PRE_SANITY_CHECK(pAd)\n\n#define RTMP_MLME_RESET_STATE_MACHINE(pAd)\t\\\n\t\tMlmeRestartStateMachine(pAd)\n\n#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)\\\n\t\tHandleCounterMeasure(_pAd, _pEntry)\n\t\t\n/* ----------------- Power Save Related MACRO ----------------- */\n#define RTMP_PS_POLL_ENQUEUE(pAd)\t\t\t\tEnqueuePsPoll(pAd)\n\n\n/* For RTMPPCIePowerLinkCtrlRestore () function */\n#define RESTORE_HALT\t\t1\n#define RESTORE_WAKEUP\t\t2\n#define RESTORE_CLOSE           3\n\n#define PowerSafeCID\t\t1\n#define PowerRadioOffCID\t2\n#define PowerWakeCID\t\t3\n#define CID0MASK\t\t0x000000ff\n#define CID1MASK\t\t0x0000ff00\n#define CID2MASK\t\t0x00ff0000\n#define CID3MASK\t\t0xff000000\n\n\n#ifdef CONFIG_STA_SUPPORT\n#define RTMP_STA_FORCE_WAKEUP(pAd, bFromTx) \\\n    RT28xxPciStaAsicForceWakeup(pAd, bFromTx);\n\n#define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \\\n    RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);\n\n#define RTMP_SET_PSM_BIT(_pAd, _val) \\\n\tMlmeSetPsmBit(_pAd, _val);\n#endif /* CONFIG_STA_SUPPORT */\n\n#define RTMP_MLME_RADIO_ON(pAd) \\\n    RT28xxPciMlmeRadioOn(pAd);\n\n#define RTMP_MLME_RADIO_OFF(pAd) \\\n    RT28xxPciMlmeRadioOFF(pAd);\n\n/* ----------------- Security Related MACRO ----------------- */\n\n/* Set Asic WCID Attribute table */\n#define RTMP_SET_WCID_SEC_INFO(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\t\\\n\tRTMPSetWcidSecurityInfo(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\n\n/* Set Asic WCID IV/EIV table */\n#define RTMP_ASIC_WCID_IVEIV_TABLE(_pAd, _Wcid, _uIV, _uEIV)\t\\\n\tAsicUpdateWCIDIVEIV(_pAd, _Wcid, _uIV, _uEIV)\n\n/* Set Asic WCID Attribute table (offset:0x6800) */\n#define RTMP_ASIC_WCID_ATTR_TABLE(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\\\n\tAsicUpdateWcidAttributeEntry(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\n\n/* Set Asic Pairwise key table */\n#define RTMP_ASIC_PAIRWISE_KEY_TABLE(_pAd, _WCID, _pCipherKey)\t\\\n\tAsicAddPairwiseKeyEntry(_pAd, _WCID, _pCipherKey)\n\n/* Set Asic Shared key table */\n#define RTMP_ASIC_SHARED_KEY_TABLE(_pAd, _BssIndex, _KeyIdx, _pCipherKey) \\\n\tAsicAddSharedKeyEntry(_pAd, _BssIndex, _KeyIdx, _pCipherKey)\n\n#ifdef CONFIG_STA_SUPPORT\n/* Set Port Secured */\n#define RTMP_SET_PORT_SECURED(_pAd) \t\t\t\t\t\t\t\t\t\t\\\n\tSTA_PORT_SECURED(_pAd);\n#endif /* CONFIG_STA_SUPPORT */\n\n/* Remove Pairwise Key table */\n#define RTMP_REMOVE_PAIRWISE_KEY_ENTRY(_pAd, _Wcid)\\\n\tAsicRemovePairwiseKeyEntry(_pAd, _Wcid)\n\n#ifdef PCI_MSI_SUPPORT\n#define RTMP_OS_IRQ_RELEASE(_pAd, _NetDev)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPOS_COOKIE pObj = (POS_COOKIE)(_pAd->OS_Cookie);\t\t\t\t\t\t\\\n\tRtmpOSIRQRelease(_NetDev, pAd->infType, pObj->pci_dev, &_pAd->HaveMsi);\t\\\n}\n#else\n#define RTMP_OS_IRQ_RELEASE(_pAd, _NetDev)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPOS_COOKIE pObj = (POS_COOKIE)(_pAd->OS_Cookie);\t\t\t\t\t\t\\\n\tRtmpOSIRQRelease(_NetDev, pAd->infType, pObj->pci_dev, NULL);\t\t\t\\\n}\n#endif /* PCI_MSI_SUPPORT */\n\n#endif /*__MAC_PCI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/mac_usb.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n        mac_usb.h\n\n    Abstract:\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __MAC_USB_H__\n#define __MAC_USB_H__\n\n#include \"rtmp_type.h\"\n#ifdef RLT_MAC\n#include \"mac_ral/nmac/ral_nmac_usb.h\"\n#endif /* RLT_MAC */\n#ifdef RTMP_MAC\n#include \"mac_ral/omac/ral_omac_usb.h\"\n#endif /* RTMP_MAC */\n\n#include \"mac_ral/rtmp_mac.h\"\n#include \"chip/rtmp_phy.h\"\n#include \"rtmp_iface.h\"\n#include \"rtmp_dot11.h\"\n\n\n#define USB_CYC_CFG\t\t\t\t0x02a4\n\n/*#define BEACON_RING_SIZE\t\t2 */\n#ifdef CONFIG_MULTI_CHANNEL\n#define MGMTPIPEIDX\t\t\t\t5\t/* EP6 is highest priority */\n#else\n#define MGMTPIPEIDX\t\t\t\t0\t/* EP6 is highest priority */\n#endif /* CONFIG_MULTI_CHANNEL */\n\n/* os abl move */\n/*#define RTMP_PKT_TAIL_PADDING \t11 // 3(max 4 byte padding) + 4 (last packet padding) + 4 (MaxBulkOutsize align padding) */\n\n#define fRTMP_ADAPTER_NEED_STOP_TX\t\t\\\n\t\t(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS |\t\\\n\t\t fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_BULKOUT_RESET | \\\n\t\t fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_REMOVE_IN_PROGRESS)\n\n\n/* =================================================================================\n\tUSB TX / RX Frame Descriptors format\n\n\tTx Memory Layout\n\t1. Packet Buffer\n\t\tTxINFO(4 bytes) + TXWI( 16 bytes) + 802.11\n         31                                                                                                                             0\n\t+--------------------------------------------------------------------------+\n\t|                                   TXINFO[31:0]                                                                            |\n\t+--------------------------------------------------------------------------+\n\t|\t\t\t\t\tTxWI                                                                                          |\n\t+                                                                                                                                  +\n\t|                                                                                                                                   |\n\t+                                                                                                                                  +\n\t|                                                                                                                                   |\n\t+\t                                                                                                                             +\n\t|\t                                                                                                                             |\n\t+--------------------------------------------------------------------------+\n\t|                                      802.11                                                                                  |\n\t|                                      .........                                                                                   |\n\t+--------------------------------------------------------------------------+\n\n\n\tRx Memory Layout\n\t1. Packet Buffer\n\t\tRxDMALen(4 bytes) + RXWI(16 bytes) + 802.11 + RXINFO (4 bytes)\n         31                                                                                                                             0\n\t+--------------------------------------------------------------------------+\n\t|                                  RXDMALen[31:0]                                                                        |\n\t+--------------------------------------------------------------------------+\n\t|\t\t\t\t\t RxWI                                                                                         |\n\t+                                                                                                                                  +\n\t|                                                                                                                                   |\n\t+                                                                                                                                  +\n\t|                                                                                                                                   |\n\t+\t                                                                                                                             +\n\t|\t                                                                                                                             |\n\t+--------------------------------------------------------------------------+\n\t|                                  802.11                                                                                       |\n\t|                                  .........                                                                                        |\n\t+--------------------------------------------------------------------------+\n\t|                                  RXINFO                                                                                     |\n\t+--------------------------------------------------------------------------+\n\n================================================================================= */\n\n\n/*\n\tRXINFO appends at the end of each rx packet\n*/\n#define RXDMA_FIELD_SIZE\t4\n\n\n/*\n\tRx descriptor format, Rx Ring\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _RXD_STRUC{\n\tUINT32 dma_len;\n}RXD_STRUC, *PRXD_STRUC;\n#else\ntypedef\tstruct GNU_PACKED _RXD_STRUC{\n\tUINT32 dma_len;\n}RXD_STRUC, *PRXD_STRUC;\n#endif\n\n\n/*\n\tManagement ring buffer format\n*/\ntypedef\tstruct _MGMT_STRUC\t{\n\tBOOLEAN\t\tValid;\n\tPUCHAR\t\tpBuffer;\n\tULONG\t\tLength;\n} MGMT_STRUC, *PMGMT_STRUC;\n\n\n/*////////////////////////////////////////////////////////////////////////*/\n/* The TX_BUFFER structure forms the transmitted USB packet to the device */\n/*////////////////////////////////////////////////////////////////////////*/\ntypedef struct __TX_BUFFER{\n\tunion{\n\t\tUCHAR\t\t\tWirelessPacket[TX_BUFFER_NORMSIZE];\n\t\tHEADER_802_11\tNullFrame;\n\t\tPSPOLL_FRAME\tPsPollPacket;\n\t\tRTS_FRAME\t\tRTSFrame;\n\t}field;\n\tUCHAR\t\t\tAggregation[4];  /*Buffer for save Aggregation size. */\n} TX_BUFFER, *PTX_BUFFER;\n\ntypedef struct __HTTX_BUFFER{\n\tunion{\n\t\tUCHAR\t\t\tWirelessPacket[MAX_TXBULK_SIZE];\n\t\tHEADER_802_11\tNullFrame;\n\t\tPSPOLL_FRAME\tPsPollPacket;\n\t\tRTS_FRAME\t\tRTSFrame;\n\t}field;\n\tUCHAR\t\t\tAggregation[4];  /*Buffer for save Aggregation size. */\n} HTTX_BUFFER, *PHTTX_BUFFER;\n\n#define EDCA_AC0_PIPE\t0\t/* Bulk EP1 OUT */\n#define EDCA_AC1_PIPE\t1\t/* Bulk EP2 OUT */\n#define EDCA_AC2_PIPE\t2\t/* Bulk EP3\tOUT */\n#define\tEDCA_AC3_PIPE\t3\t/* Bulk EP4 OUT */\n#define\tHCCA_PIPE\t\t4\t/* Bulk EP5\tOUT */\n\n/* used to track driver-generated write irps */\ntypedef struct _TX_CONTEXT\n{\n\tPVOID\t\t\tpAd;\t\t/*Initialized in MiniportInitialize */\n\tPURB\t\t\tpUrb;\t\t\t/*Initialized in MiniportInitialize */\n\tPIRP\t\t\tpIrp;\t\t\t/*used to cancel pending bulk out. */\n\t\t\t\t\t\t\t\t\t/*Initialized in MiniportInitialize */\n\tPTX_BUFFER\t\tTransferBuffer;\t/*Initialized in MiniportInitialize */\n\tULONG\t\t\tBulkOutSize;\n\tUCHAR\t\t\tBulkOutPipeId;\n\tUCHAR\t\t\tSelfIdx;\n\tBOOLEAN\t\t\tInUse;\n\tBOOLEAN\t\t\tbWaitingBulkOut; /* at least one packet is in this TxContext, ready for making IRP anytime. */\n\tBOOLEAN\t\t\tbFullForBulkOut; /* all tx buffer are full , so waiting for tx bulkout. */\n\tBOOLEAN\t\t\tIRPPending;\n\tBOOLEAN\t\t\tLastOne;\n\tBOOLEAN\t\t\tbAggregatible;\n\tUCHAR\t\t\tHeader_802_3[LENGTH_802_3];\n\tUCHAR\t\t\tRsv[2];\n\tULONG\t\t\tDataOffset;\n\tUINT\t\t\tTxRate;\n\tra_dma_addr_t\t\tdata_dma;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef UAPSD_SUPPORT\n\tUSHORT\t\t\tWcid;\n#endif /* UAPSD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n}\tTX_CONTEXT, *PTX_CONTEXT, **PPTX_CONTEXT;\n\n\n/* used to track driver-generated write irps */\ntypedef struct _HT_TX_CONTEXT\n{\n\tPVOID\t\t\tpAd;\t\t/*Initialized in MiniportInitialize */\n\tPURB\t\t\tpUrb;\t\t\t/*Initialized in MiniportInitialize */\n\tPIRP\t\t\tpIrp;\t\t\t/*used to cancel pending bulk out. */\n\t\t\t\t\t\t\t\t\t/*Initialized in MiniportInitialize */\n\tPHTTX_BUFFER\tTransferBuffer;\t/*Initialized in MiniportInitialize */\n\tULONG\t\t\tBulkOutSize;\t/* Indicate the total bulk-out size in bytes in one bulk-transmission */\n\tUCHAR\t\t\tBulkOutPipeId;\n\tBOOLEAN\t\t\tIRPPending;\n\tBOOLEAN\t\t\tLastOne;\n\tBOOLEAN\t\t\tbCurWriting;\n\tBOOLEAN\t\t\tbRingEmpty;\n\tBOOLEAN\t\t\tbCopySavePad;\n\tUCHAR\t\t\tSavedPad[8];\n\tUCHAR\t\t\tHeader_802_3[LENGTH_802_3];\n\tULONG\t\t\tCurWritePosition;\t\t/* Indicate the buffer offset which packet will be inserted start from. */\n\tULONG\t\t\tCurWriteRealPos;\t\t/* Indicate the buffer offset which packet now are writing to. */\n\tULONG\t\t\tNextBulkOutPosition;\t/* Indicate the buffer start offset of a bulk-transmission */\n\tULONG\t\t\tENextBulkOutPosition;\t/* Indicate the buffer end offset of a bulk-transmission */\n\tUINT\t\t\tTxRate;\n\tra_dma_addr_t\t\tdata_dma;\t\t/* urb dma on linux */\n#ifdef USB_BULK_BUF_ALIGMENT\n\tULONG \t\t\tCurWriteIdx;\t/* pointer to next 32k bytes position when wirte tx resource or when bulk out sizze not > 0x6000 */\n\tULONG \t\t\tNextBulkIdx;\t/* pointer to next alignment section when bulk ot */\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n}\tHT_TX_CONTEXT, *PHT_TX_CONTEXT, **PPHT_TX_CONTEXT;\n\n\ntypedef struct _CMD_CONTEXT\n{\n\tPVOID pAd;\n\tPURB pUrb;\n\tra_dma_addr_t data_dma;\n\tPUCHAR TransferBuffer;\n\tBOOLEAN IRPPending;\n}  CMD_CONTEXT, *PCMD_CONTEXT, **PPCMD_CONTEXT;\n\n/* */\n/* Structure to keep track of receive packets and buffers to indicate */\n/* receive data to the protocol. */\n/* */\ntypedef struct _RX_CONTEXT\n{\n\tPUCHAR\t\t\t\tTransferBuffer; \n\tPVOID\t\t\t\tpAd;\n\tPIRP\t\t\t\tpIrp;/*used to cancel pending bulk in. */\n\tPURB\t\t\t\tpUrb;\n\t/*These 2 Boolean shouldn't both be 1 at the same time. */\n\tULONG\t\t\t\tBulkInOffset;\t/* number of packets waiting for reordering . */\n/*\tBOOLEAN\t\t\t\tReorderInUse;\t// At least one packet in this buffer are in reordering buffer and wait for receive indication */\n\tBOOLEAN\t\t\t\tbRxHandling;\t/* Notify this packet is being process now. */\n\tBOOLEAN\t\t\t\tInUse;\t\t\t/* USB Hardware Occupied. Wait for USB HW to put packet. */\n\tBOOLEAN\t\t\t\tReadable;\t\t/* Receive Complete back. OK for driver to indicate receiving packet. */\n\tBOOLEAN\t\t\t\tIRPPending;\t\t/* TODO: To be removed */\n\t/*atomic_t\t\t\t\tIrpLock; */\n\tNDIS_SPIN_LOCK\t\tRxContextLock;\n\tra_dma_addr_t\t\t\tdata_dma;\t\t/* urb dma on linux */\n}\tRX_CONTEXT, *PRX_CONTEXT;\n\n\ntypedef struct _CMD_RSP_CONTEXT\n{\n\tPUCHAR CmdRspBuffer;\n\tPVOID pAd;\n\tPURB pUrb;\n\tBOOLEAN IRPPending;\n\tBOOLEAN InUse;\n\tBOOLEAN Readable; \n\tra_dma_addr_t data_dma;\n} CMD_RSP_CONTEXT, *PCMD_RSP_CONTEXT;\n\n/******************************************************************************\n\n  \tUSB Frimware Related MACRO\n\n******************************************************************************/\n/* 8051 firmware image for usb - use last-half base address = 0x3000 */\n#define FIRMWARE_IMAGE_BASE\t\t\t0x3000\n#define MAX_FIRMWARE_IMAGE_SIZE\t\t0x1000    /* 4kbyte */\n\n#define RTMP_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen)\t\t\\\n\tRTUSBFirmwareWrite(_pAd, _pFwImage, _FwLen)\n\t\n\n\n/******************************************************************************\n\n  \tUSB TX Related MACRO \n  \t\n******************************************************************************/\n#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags)\t\t\t\t\\\n\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tRTMP_IRQ_LOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\t\t\\\n\t\t\t\tif (pAd->DeQueueRunning[QueIdx])\t\t\t\t\t\t\\\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\\\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"DeQueueRunning[%d]= TRUE!\\n\", QueIdx));\t\t\\\n\t\t\t\t\tcontinue;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tpAd->DeQueueRunning[QueIdx] = TRUE;\t\t\t\t\t\\\n\t\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\\\n\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t}\n\n#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags)\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tRTMP_IRQ_LOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\t\t\\\n\t\t\t\tpAd->DeQueueRunning[QueIdx] = FALSE;\t\t\t\t\t\\\n\t\t\t\tRTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\t\\\n\t\t\t}while(0)\n\n#define\tRTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \\\n\t\t(RTUSBFreeDescRequest(pAd, pTxBlk->QueIdx, (pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket))) == NDIS_STATUS_SUCCESS)\n\n#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx)\t\t\t\\\n\t\tdo{}while(0)\n\n#define NEED_QUEUE_BACK_FOR_AGG(_pAd, _QueIdx, _freeNum, _TxFrameType) \t\t\\\n\t\t((_TxFrameType == TX_RALINK_FRAME) && (RTUSBNeedQueueBackForAgg(_pAd, _QueIdx)))\t\n\n#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)\t\\\n\t\t\tRtmpUSB_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)\n\t\t\t\n#define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber)\t\\\n\t\t\tRtmpUSB_WriteSingleTxResource(pAd, pTxBlk,bIsLast, pFreeNumber)\n\n#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \\\n\t\t\tRtmpUSB_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)\n\t\t\t\n#define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber)\t\\\n\t\t\tRtmpUSB_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber)\n\t\n#define HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, TxIdx)\t\\\n\t\t\tRtmpUSB_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, TxIdx)\n\n#define HAL_LastTxIdx(pAd, QueIdx,TxIdx) \\\n\t\t\t/*RtmpUSBDataLastTxIdx(pAd, QueIdx,TxIdx)*/\n\t\n#define HAL_KickOutTx(pAd, pTxBlk, QueIdx)\t\\\n\t\t\tRtmpUSBDataKickOut(pAd, pTxBlk, QueIdx)\n\n#define HAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen)\t\\\n\t\t\tRtmpUSBMgmtKickOut(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen)\n\n#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen)\t\\\n\t\t\tRtmpUSBNullFrameKickOut(_pAd, _QueIdx, _pNullFrame, _frameLen)\n\n#define GET_TXRING_FREENO(_pAd, _QueIdx)\t(_QueIdx) /*(_pAd->TxRing[_QueIdx].TxSwFreeIdx) */\n#define GET_MGMTRING_FREENO(_pAd)\t\t\t(_pAd->MgmtRing.TxSwFreeIdx)\n\n\n/* ----------------- RX Related MACRO ----------------- */\n\n\n/* \n  *\tDevice Hardware Interface Related MACRO\n  */\n#define RTMP_IRQ_INIT(pAd)\t\t\t\tdo{}while(0)\n#define RTMP_IRQ_ENABLE(pAd)\t\t\tdo{}while(0)\n\n\n/* \n  *\tMLME Related MACRO \n  */\n#define RTMP_MLME_HANDLER(pAd)\t\t\tRTUSBMlmeUp(&(pAd->mlmeTask))\n\n#define RTMP_MLME_PRE_SANITY_CHECK(pAd)\t\t\t\t\t\t\t\t\\\n\t{\tif ((pAd->StaCfg.bHardwareRadio == TRUE) && \t\t\t\t\t\\\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&\t\t\\\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))) {\t\\\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_CHECK_GPIO, NULL, 0); } }\n\n#define RTMP_MLME_RESET_STATE_MACHINE(pAd)\t\\\n\t\t        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_RESET_CONF, 0, NULL, 0);\t\\\n\t\t        RTUSBMlmeUp(&(pAd->mlmeTask));\n\n#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)\t\t\\\n\t{\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_802_11_COUNTER_MEASURE, _pEntry, sizeof(MAC_TABLE_ENTRY));\t\\\n\t\tRTUSBMlmeUp(&(_pAd->mlmeTask));\t\t\t\t\t\t\t\t\t\\\n\t}\n\n\n/*\n  *\tPower Save Related MACRO \n  */\n#ifdef CONFIG_STA_SUPPORT\n#define RTMP_PS_POLL_ENQUEUE(pAd)\t\t\t\t\t\t\\\n\t{\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL);\t\\\n\t\tRTUSBKickBulkOut(pAd); }\n\n#define RTMP_STA_FORCE_WAKEUP(_pAd, bFromTx) \\\n\tRT28xxUsbStaAsicForceWakeup(_pAd, bFromTx);\n\n#define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \\\n    RT28xxUsbStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);\n\n#define RTMP_SET_PSM_BIT(_pAd, _val) \\\n\t{\\\n\t\tif ((_pAd)->StaCfg.WindowsPowerMode == Ndis802_11PowerModeFast_PSP) \\\n\t\t\tMlmeSetPsmBit(_pAd, _val);\\\n\t\telse \\\n\t\t{ \\\n\t\t\tUSHORT _psm_val = _val; \\\n\t\t\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_PSM_BIT, &(_psm_val), sizeof(USHORT)); \\\n\t\t}\\\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#define RTMP_MLME_RADIO_ON(pAd) \\\n    RT28xxUsbMlmeRadioOn(pAd);\n\n#define RTMP_MLME_RADIO_OFF(pAd) \\\n    RT28xxUsbMlmeRadioOFF(pAd);\n\n/* MAC Search table */\n/* add this entry into ASIC RX WCID search table */\n#define RTMP_STA_ENTRY_ADD(pAd, pEntry)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_SET_ASIC_WCID Info;\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.WCID = pEntry->Aid;\t\t\t\t\t\t\t\t\t\\\n\tNdisMoveMemory(Info.Addr, pEntry->Addr, MAC_ADDR_LEN);\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(pAd, CMDTHREAD_SET_CLIENT_MAC_ENTRY, \t\\\n\t\t\t\t\t\t\t&Info, sizeof(RT_SET_ASIC_WCID));\t\\\n}\n\n/* ----------------- Security Related MACRO ----------------- */\n\n/* Set Asic WCID Attribute table */\n#define RTMP_SET_WCID_SEC_INFO(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_ASIC_WCID_SEC_INFO Info;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.BssIdx = _BssIdx;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.KeyIdx = _KeyIdx;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.CipherAlg = _CipherAlg;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.Wcid = _Wcid;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.KeyTabFlag = _KeyTabFlag;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_WCID_SEC_INFO, \t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t&Info, sizeof(RT_ASIC_WCID_SEC_INFO));\t\t\t\t\t\t\\\n}\n\n/* Set Asic WCID IV/EIV table */\n#define RTMP_ASIC_WCID_IVEIV_TABLE(_pAd, _Wcid, _uIV, _uEIV)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_ASIC_WCID_IVEIV_ENTRY Info;\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.Wcid = _Wcid;\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.Iv = _uIV;\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.Eiv = _uEIV;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_ASIC_WCID_IVEIV, \t\\\n\t\t\t\t\t\t\t&Info, \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\tsizeof(RT_ASIC_WCID_IVEIV_ENTRY));\t\\\n}\n\n/* Set Asic WCID Attribute table */\n#define RTMP_ASIC_WCID_ATTR_TABLE(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_ASIC_WCID_ATTR_ENTRY Info;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.BssIdx = _BssIdx;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.KeyIdx = _KeyIdx;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.CipherAlg = _CipherAlg;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.Wcid = _Wcid;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.KeyTabFlag = _KeyTabFlag;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_ASIC_WCID_ATTR, \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t&Info, sizeof(RT_ASIC_WCID_ATTR_ENTRY));\t\t\t\t\t\t\\\n}\n\n/* Set Asic Pairwise key table */\n#define RTMP_ASIC_PAIRWISE_KEY_TABLE(_pAd, _WCID, _pCipherKey)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_ASIC_PAIRWISE_KEY Info;\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.WCID = _WCID;\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tNdisMoveMemory(&Info.CipherKey, _pCipherKey, sizeof(CIPHER_KEY));\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_ASIC_PAIRWISE_KEY,\t\t\t\\\n\t\t\t\t\t\t\t&Info, sizeof(RT_ASIC_PAIRWISE_KEY));\t\t\\\n}\n\n/* Set Asic Shared key table */\n#define RTMP_ASIC_SHARED_KEY_TABLE(_pAd, _BssIndex, _KeyIdx, _pCipherKey) \t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_ASIC_SHARED_KEY Info;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.BssIndex = _BssIndex;\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tInfo.KeyIdx = _KeyIdx;\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tNdisMoveMemory(&Info.CipherKey, _pCipherKey, sizeof(CIPHER_KEY));\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_ASIC_SHARED_KEY,\t\t\t\t\\\n\t\t\t\t\t\t\t&Info, sizeof(RT_ASIC_SHARED_KEY));\t\t\t\t\\\n}\n\n#ifdef CONFIG_STA_SUPPORT\n/* Set Port Secured */\n#define RTMP_SET_PORT_SECURED(_pAd) \t\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_SET_PORT_SECURED, NULL, 0);\t\t\\\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/* Remove Pairwise Key table */\n#define RTMP_REMOVE_PAIRWISE_KEY_ENTRY(_pAd, _Wcid)\t\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tUCHAR _tWcid =_Wcid;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTEnqueueInternalCmd(_pAd, CMDTHREAD_REMOVE_PAIRWISE_KEY, &(_tWcid), sizeof(UCHAR));\\\n}\n\n#define RTMP_OS_IRQ_RELEASE(_pAd, _NetDev)\n\n#endif /*__MAC_USB_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/nmac/ral_nmac.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_nmac.h\n\n\tAbstract:\n\tRalink Wireless Chip RAL MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_NMAC_H__\n#define __RAL_NMAC_H__\n\n\n#include \"rtmp_type.h\"\n\n#ifdef MT7601\n#include \"mac_ral/omac/ral_omac_rxwi.h\"\n#else\n#include \"mac_ral/nmac/ral_nmac_rxwi.h\"\n#endif /* MT7601 */\n\n#include \"mac_ral/nmac/ral_nmac_txwi.h\"\n\nenum INFO_TYPE {\n\tNORMAL_PACKET,\n\tCMD_PACKET,\n};\n\nenum D_PORT {\n\tWLAN_PORT,\n\tCPU_RX_PORT,\n\tCPU_TX_PORT,\n\tHOST_PORT,\n\tVIRTUAL_CPU_RX_PORT,\n\tVIRTUAL_CPU_TX_PORT,\n\tDISCARD,\n};\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _TXINFO_NMAC_PKT{\n\tUINT32 info_type:2;\n\tUINT32 d_port:3;\n\tUINT32 QSEL:2;\n\tUINT32 wiv:1;\n\tUINT32 rsv1:2;\n\tUINT32 cso:1;\n\tUINT32 tso:1;\n\tUINT32 pkt_80211:1;\n\tUINT32 rsv0:1;\n\tUINT32 tx_burst:1;\n\tUINT32 next_vld:1;\n\tUINT32 pkt_len:16;\n}TXINFO_NMAC_PKT;\n#else\ntypedef struct GNU_PACKED _TXINFO_NMAC_PKT {\n\tUINT32 pkt_len:16;\n\tUINT32 next_vld:1;\n\tUINT32 tx_burst:1;\n\tUINT32 rsv0:1;\n\tUINT32 pkt_80211:1;\n\tUINT32 tso:1;\n\tUINT32 cso:1;\n\tUINT32 rsv1:2;\n\tUINT32 wiv:1;\n\tUINT32 QSEL:2;\n\tUINT32 d_port:3;\n\tUINT32 info_type:2;\n}TXINFO_NMAC_PKT;\n#endif /* RT_BIG_ENDIAN */\n\n#define TxInfoWIV\t\t\ttxinfo_nmac_pkt.wiv\n#define TxInfoQSEL\t\t\ttxinfo_nmac_pkt.QSEL\n#define TxInfoPktLen\t\t\ttxinfo_nmac_pkt.pkt_len\n#define TxInfoSwLstRnd\t\ttxinfo_nmac_pkt.rsv0\n#define TxInfoUDMATxburst\ttxinfo_nmac_pkt.tx_burst\n#define TxInfoUDMANextVld\ttxinfo_nmac_pkt.next_vld\n#define TxInfoPKT_80211\ttxinfo_nmac_pkt.pkt_80211\n#define TxInfoCSO\t\t\ttxinfo_nmac_pkt.cso\n#define TxInfoTSO\t\t\ttxinfo_nmac_pkt.tso\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _TXINFO_NMAC_CMD{\n\tUINT32 info_type:2;\n\tUINT32 d_port:3;\n\tUINT32 cmd_type:7;\n\tUINT32 cmd_seq:4;\n\tUINT32 pkt_len:16;\n}TXINFO_NMAC_CMD;\n#else\ntypedef struct GNU_PACKED _TXINFO_NMAC_CMD{\n\tUINT32 pkt_len:16;\n\tUINT32 cmd_seq:4;\n\tUINT32 cmd_type:7;\n\tUINT32 d_port:3;\n\tUINT32 info_type:2;\n}TXINFO_NMAC_CMD;\n#endif /* RT_BIG_ENDIAN */\n\n\ntypedef union GNU_PACKED _TXINFO_NMAC{\n\tstruct _TXINFO_NMAC_PKT txinfo_pkt;\n\tstruct _TXINFO_NMAC_CMD txinfo_cmd;\n}TXINFO_NMAC;\n\n\n/*\n\tRx Memory layout:\n\n\t1. Rx Descriptor\n\t\tRx Descriptor(12 Bytes) + RX_FCE_Info(4 Bytes)\n\t2. Rx Buffer\n\t\tRxInfo(4 Bytes) + RXWI() + 802.11 packet\n*/\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _RXFCE_INFO{\n\tUINT32 info_type:2;\n\tUINT32 s_port:3;\n\tUINT32 qsel:2;\n\tUINT32 pcie_intr:1;\n\n\tUINT32 mac_len:3;\n\tUINT32 l3l4_done:1;\n\tUINT32 pkt_80211:1;\n\tUINT32 ip_err:1;\n\tUINT32 tcp_err:1;\n\tUINT32 udp_err:1;\n\t\n\tUINT32 rsv:2;\n\tUINT32 pkt_len:14;\n}RXFCE_INFO;\n#else\ntypedef struct GNU_PACKED _RXFCE_INFO{\n\tUINT32 pkt_len:14;\n\tUINT32 rsv:2;\n\n\tUINT32 udp_err:1;\n\tUINT32 tcp_err:1;\n\tUINT32 ip_err:1;\n\tUINT32 pkt_80211:1;\n\tUINT32 l3l4_done:1;\n\tUINT32 mac_len:3;\n\n\tUINT32 pcie_intr:1;\n\tUINT32 qsel:2;\n\tUINT32 s_port:3;\n\tUINT32 info_type:2;\n}RXFCE_INFO;\n#endif /* RT_BIG_ENDIAN */\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _RXFCE_INFO_CMD{\n\tUINT32 info_type:2;\n\tUINT32 d_port:3;\n\tUINT32 qsel:2;\n\tUINT32 pcie_intr:1;\n\tUINT32 evt_type:4;\n\tUINT32 cmd_seq:4;\n\tUINT32 self_gen:1;\n\tUINT32 rsv:1;\n\tUINT32 pkt_len:14;\n}RXFCE_INFO_CMD;\n#else\ntypedef struct GNU_PACKED _RXFCE_INFO_CMD{\n\tUINT32 pkt_len:14;\n\tUINT32 rsv:1;\n\tUINT32 self_gen:1;\n\tUINT32 cmd_seq:4;\n\tUINT32 evt_type:4;\n\tUINT32 pcie_intr:1;\n\tUINT32 qsel:2;\n\tUINT32 d_port:3;\n\tUINT32 info_type:2;\n}RXFCE_INFO_CMD;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _RXINFO_NMAC{\n\tUINT32 ic_err:1;\n\tUINT32 tc_err:1;\n\tUINT32 ichk_bps:1;\n\tUINT32 tchk_bps:1;\n\tUINT32 rsv0:6;\n\tUINT32 pn_len:3;\n\tUINT32 wapi_kid:1;\n\tUINT32 bssid_idx3:1;\n\tUINT32 dec:1;\n\tUINT32 ampdu:1;\n\tUINT32 l2pad:1;\n\tUINT32 rssi:1;\n\tUINT32 htc:1;\n\tUINT32 amsdu:1;\n\tUINT32 mic_err:1;\n\tUINT32 icv_err:1;\n\tUINT32 crc_err:1;\n\tUINT32 mybss:1;\n\tUINT32 bc:1;\n\tUINT32 mc:1;\n\tUINT32 u2me:1;\n\tUINT32 frag:1;\n\tUINT32 null:1;\n\tUINT32 data:1;\n\tUINT32 ba:1;\n}RXINFO_NMAC;\n#else\ntypedef struct GNU_PACKED _RXINFO_NMAC{\n\tUINT32 ba:1;\n\tUINT32 data:1;\n\tUINT32 null:1;\n\tUINT32 frag:1;\n\tUINT32 u2me:1;\n\tUINT32 mcast:1;\n\tUINT32 bcast:1;\n\tUINT32 mybss:1;\n\tUINT32 crc_err:1;\n\tUINT32 icv_err:1;\t\n\tUINT32 mic_err:1;\n\tUINT32 amsdu:1;\n\tUINT32 htc:1;\n\tUINT32 rssi:1;\n\tUINT32 l2pad:1;\n\tUINT32 ampdu:1;\n\tUINT32 dec:1;\n\tUINT32 bssid_idx3:1;\n\tUINT32 wapi_kid:1;\n\tUINT32 pn_len:3;\n\tUINT32 rsv0:6;\n\tUINT32 tchk_bps:1;\n\tUINT32 ichk_bps:1;\n\tUINT32 tc_err:1;\n\tUINT32 ic_err:1;\n}RXINFO_NMAC;\n#endif /* RT_BIG_ENDIAN */\n\n\n/* ================================================================================= */\n/* Register format */\n/* ================================================================================= */\n\n\n#define WLAN_FUN_CTRL\t\t0x80\n#ifdef RT_BIG_ENDIAN\ntypedef union _WLAN_FUN_CTRL_STRUC{\n\tstruct{\n\t\tUINT32 GPIO0_OUT_OE_N:8;\n\t\tUINT32 GPIO0_OUT:8;\n\t\tUINT32 GPIO0_IN:8;\n\t\tUINT32 WLAN_ACC_BT:1;\n\t\tUINT32 INV_TR_SW0:1;\n\t\tUINT32 FRC_WL_ANT_SET:1;\n\t\tUINT32 PCIE_APP0_CLK_REQ:1;\n\t\tUINT32 WLAN_RESET:1;\n\t\tUINT32 WLAN_RESET_RF:1;\n\t\tUINT32 WLAN_CLK_EN:1;\n\t\tUINT32 WLAN_EN:1;\n\t}field;\n\tUINT32 word;\n}WLAN_FUN_CTRL_STRUC, *PWLAN_FUN_CTRL_STRUC;\n#else\ntypedef union _WLAN_FUN_CTRL_STRUC{\n\tstruct{\n\t\tUINT32 WLAN_EN:1;\n\t\tUINT32 WLAN_CLK_EN:1;\n\t\tUINT32 WLAN_RESET_RF:1;\n\t\tUINT32 WLAN_RESET:1;\n\t\tUINT32 PCIE_APP0_CLK_REQ:1;\n\t\tUINT32 FRC_WL_ANT_SET:1;\n\t\tUINT32 INV_TR_SW0:1;\n\t\tUINT32 WLAN_ACC_BT:1;\n\t\tUINT32 GPIO0_IN:8;\n\t\tUINT32 GPIO0_OUT:8;\n\t\tUINT32 GPIO0_OUT_OE_N:8;\n\t}field;\n\tUINT32 word;\n}WLAN_FUN_CTRL_STRUC, *PWLAN_FUN_CTRL_STRUC;\n#endif\n\n\n#define WLAN_FUN_INFO\t\t0x84\n#ifdef RT_BIG_ENDIAN\ntypedef union _WLAN_FUN_INFO_STRUC{\n\tstruct{\n\t\tUINT32\t\tBT_EEP_BUSY:1; /* Read-only for WLAN Driver */\n\t\tUINT32\t\tRsv1:26;\t\t\n\t\tUINT32\t\tCOEX_MODE:5; /* WLAN function enable */\n\t}field;\n\tUINT32 word;\n}WLAN_FUN_INFO_STRUC, *PWLAN_FUN_INFO_STRUC;\n#else\ntypedef union _WLAN_FUN_INFO_STRUC{\n\tstruct{\n\t\tUINT32\t\tCOEX_MODE:5; /* WLAN function enable */\n\t\tUINT32\t\tRsv1:26;\n\t\tUINT32\t\tBT_EEP_BUSY:1; /* Read-only for WLAN Driver */\n\t}field;\n\tUINT32 word;\n}WLAN_FUN_INFO_STRUC, *PWLAN_FUN_INFO_STRUC;\n#endif\n\n\n#define BT_FUN_CTRL\t\t0xC0\n#ifdef RT_BIG_ENDIAN\ntypedef union _BT_FUN_CTRL_STRUC{\n\tstruct{\n\t\tUINT32\t\tGPIO1_OUT_OE_N:8;\n\t\tUINT32\t\tGPIO1_OUT:8;\n\t\tUINT32\t\tGPIO1_IN:8;\n\t\tUINT32\t\tBT_ACC_WLAN:1;\n\t\tUINT32\t\tINV_TR_SW1:1;\n\t\tUINT32\t\tURXD_GPIO_MODE:1;\n\t\tUINT32\t\tPCIE_APP1_CLK_REQ:1;\n\t\tUINT32\t\tBT_RESET:1;\n\t\tUINT32\t\tBT_RF_EN:1;\n\t\tUINT32\t\tBT_CLK_EN:1;\n\t\tUINT32\t\tBT_EN:1;\n\t}field;\n\tUINT32 word;\n}BT_FUN_CTRL_STRUC, *PBT_FUN_CTRL_STRUC;\n#else\ntypedef union _BT_FUN_CTRL_STRUC\t{\n\tstruct{\n\t\tUINT32\t\tBT_EN:1;\n\t\tUINT32\t\tBT_CLK_EN:1;\n\t\tUINT32\t\tBT_RF_EN:1;\n\t\tUINT32\t\tBT_RESET:1;\n\t\tUINT32\t\tPCIE_APP1_CLK_REQ:1;\n\t\tUINT32\t\tURXD_GPIO_MODE:1;\n\t\tUINT32\t\tINV_TR_SW1:1;\n\t\tUINT32\t\tBT_ACC_WLAN:1;\n\t\tUINT32\t\tGPIO1_IN:8;\n\t\tUINT32\t\tGPIO1_OUT:8;\n\t\tUINT32\t\tGPIO1_OUT_OE_N:8;\n\t}field;\n\tUINT32 word;\n}BT_FUN_CTRL_STRUC, *PBT_FUN_CTRL_STRUC;\n#endif\n\n\n#define BT_FUN_INFO\t\t0xC4\n#ifdef RT_BIG_ENDIAN\ntypedef union _BT_FUN_INFO_STRUC{\n\tstruct{\n\t\tUINT32\t\tWLAN_EEP_BUSY:1;\n\t\tUINT32\t\tBTPower1:7;\t/* Peer */\n\t\tUINT32\t\tBTPower0:8; /* Self */\n\t\tUINT32\t\tAFH_END_CH:8;\t\t\n\t\tUINT32\t\tAFH_START_CH:8;\n\t}field;\n\tUINT32 word;\n} BT_FUN_INFO_STRUC, *PBT_FUN_INFO_STRUC;\n#else\ntypedef\tunion _BT_FUN_INFO_STRUC\t{\n\tstruct{\n\t\tUINT32\t\tAFH_START_CH:8;\n\t\tUINT32\t\tAFH_END_CH:8;\n\t\tUINT32\t\tBTPower0:8;\t/* Self */\n\t\tUINT32\t\tBTPower1:7;\t/* Peer */\n\t\tUINT32\t\tWLAN_EEP_BUSY:1;\t\t\t\n\t}field;\n\tUINT32 word;\n}BT_FUN_INFO_STRUC, *PBT_FUN_INFO_STRUC;\n#endif\n\n// TODO: shiang, this data structure is not defined for register. may can move to other place\ntypedef struct _WLAN_BT_COEX_SETTING\n{\n\tBOOLEAN\t\t\t\t\tampduOff;\n\tBOOLEAN\t\t\t\t\tcoexSettingRunning;\n\tBOOLEAN\t\t\t\t\tRateSelectionForceToUseRSSI;\n\tUCHAR\t\t\t\t\tTxQualityFlag;\n\tULONG\t\t\t\t\talc;\n\tULONG\t\t\t\t\tslna;\n}WLAN_BT_COEX_SETTING, *PWLAN_BT_COEX_SETTING;\n\n\n#define MCU_CMD_CFG 0x0234\n\n\n#define TSO_CTRL\t0x0250\n#ifdef RT_BIG_ENDIAN\ntypedef union _TSO_CTRL_STRUC {\n\tstruct {\n\t\tUINT32 rsv:13;\n\t\tUINT32 TSO_WR_LEN_EN:1;\n\t\tUINT32 TSO_SEG_EN:1;\n\t\tUINT32 TSO_EN:1;\n\t\tUINT32 RXWI_LEN:4;\n\t\tUINT32 RX_L2_FIX_LEN:4;\n\t\tUINT32 TXWI_LEN:4;\n\t\tUINT32 TX_L2_FIX_LEN:4;\n\t} field;\n\tUINT32 word;\n} TSO_CTRL_STRUC;\n#else\ntypedef union _TSO_CTRL_STRUC {\n\tstruct {\n\t\tUINT32 TX_L2_FIX_LEN:4;\n\t\tUINT32 TXWI_LEN:4;\n\t\tUINT32 RX_L2_FIX_LEN:4;\n\t\tUINT32 RXWI_LEN:4;\n\t\tUINT32 TSO_EN:1;\n\t\tUINT32 TSO_SEG_EN:1;\n\t\tUINT32 TSO_WR_LEN_EN:1;\n\t\tUINT32 rsv:13;\n\t} field;\n\tUINT32 word;\n} TSO_CTRL_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n\n#define TX_FBK_LIMIT\t0x1398\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_FBK_LIMIT_STRUC {\n\tstruct {\n\t\tUINT32 rsv:13;\n\t\tUINT32 TX_RATE_LUT_EN:1;\n\t\tUINT32 TX_AMPDU_UP_CLEAR:1;\n\t\tUINT32 TX_MPDU_UP_CLEAR:1;\n\t\tUINT32 TX_AMPDU_FBK_LIMIT:8;\n\t\tUINT32 TX_MPDU_FBK_LIMIT:8;\n\t} field;\n\tUINT32 word;\n} TX_FBK_LIMIT_STRUC;\n#else\ntypedef union _TX_FBK_LIMIT_STRUC {\n\tstruct {\n\t\tUINT32 TX_MPDU_FBK_LIMIT:8;\n\t\tUINT32 TX_AMPDU_FBK_LIMIT:8;\n\t\tUINT32 TX_MPDU_UP_CLEAR:1;\n\t\tUINT32 TX_AMPDU_UP_CLEAR:1;\n\t\tUINT32 TX_RATE_LUT_EN:1;\n\t\tUINT32 rsv:13;\n\t} field;\n\tUINT32 word;\n} TX_FBK_LIMIT_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n#define TX_PROT_CFG6    0x13E0    // VHT 20 Protection\n#define TX_PROT_CFG7    0x13E4    // VHT 40 Protection\n#define TX_PROT_CFG8    0x13E8    // VHT 80 Protection\n#define PIFS_TX_CFG     0x13EC    // PIFS setting\n\n\n//----------------------------------------------------------------\n// Header Translation \n//----------------------------------------------------------------\n\n/* \n\tWIFI INFO for TX translation \n\t|TXINO|TXWI|WIFI INFO|802.3 MAC Header|Pyaload| \n*/\n\n#define WIFI_INFO_SIZE\t\t4\n#ifdef RT_BIG_ENDIAN\ntypedef union GNU_PACKED _WIFI_INFO_STRUC {\n\tstruct {\n    \tUINT32 More_Data:1;\n    \tUINT32 WEP:1;\n    \tUINT32 PS:1;\n    \tUINT32 RDG:1;\n    \tUINT32 QoS:1;\n    \tUINT32 EOSP:1;\n    \tUINT32 TID:4;\n    \tUINT32 Mode:2;\n    \tUINT32 VLAN:1;\n    \tUINT32 Rsv:3;\n    \tUINT32 BssIdx:4;\n    \tUINT32 Seq_Num:12;\n\t} field;\n\tUINT32 word;\n} WIFI_INFO_STRUC, *PWIFI_INFO_STRUC;\n#else\ntypedef union GNU_PACKED _WIFI_INFO_STRUC {\n\tstruct {\n    \tUINT32 Seq_Num:12;\n    \tUINT32 BssIdx:4;\n    \tUINT32 Rsv:3;\n    \tUINT32 VLAN:1;\n    \tUINT32 Mode:2;\n    \tUINT32 TID:4;\n    \tUINT32 EOSP:1;\n    \tUINT32 QoS:1;\n    \tUINT32 RDG:1;\n    \tUINT32 PS:1;\n    \tUINT32 WEP:1;\n    \tUINT32 More_Data:1;\n\t} field;\n\tUINT32 word;\n} WIFI_INFO_STRUC, *PWIFI_INFO_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n/* \n\theader translation control register \n\tbit0 --> TX translation enable\n\tbit1 --> RX translation enable \n*/\n#define HEADER_TRANS_CTRL_REG\t0x0260\n#define HT_TX_ENABLE\t\t\t0x1\n#define HT_RX_ENABLE\t\t\t0x2\n\n#define HT_MAC_ADDR_DW0\t\t0x02A4\n#define HT_MAC_ADDR_DW1\t\t0x02A8\n#define HT_MAC_BSSID_DW0\t\t0x02AC\n#define HT_MAC_BSSID_DW1\t\t0x02B0\n\n#ifdef RT_BIG_ENDIAN\ntypedef union GNU_PACKED _HDR_TRANS_CTRL_STRUC {\n\tstruct {\n    \tUINT32 Rsv:30;\n    \tUINT32 Rx_En:1;\n    \tUINT32 Tx_En:1;\n\t} field;\n\tUINT32 word;\t\n} HDR_TRANS_CTRL_STRUC, *PHDR_TRANS_CTRL_STRUC;\n#else\ntypedef union GNU_PACKED _HDR_TRANS_CTRL_STRUC {\n\tstruct {\n    \tUINT32 Tx_En:1;\n    \tUINT32 Rx_En:1;\n    \tUINT32 Rsv:30;\n\t} field;\n\tUINT32 word;\n} HDR_TRANS_CTRL_STRUC, *PHDR_TRANS_CTRL_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n/* RX header translation enable by WCID */ \n#define HT_RX_WCID_EN_BASE\t0x0264\n#define HT_RX_WCID_OFFSET\t32\n#if defined(MT7601)\n#define HT_RX_WCID_SIZE\t\t(HT_RX_WCID_OFFSET * 4)\t/* 128 WCIDs */\n#elif defined(RT65xx)\n#define HT_RX_WCID_SIZE\t\t(HT_RX_WCID_OFFSET * 8)\t/*\t256 WCIDs */\n#endif /* defined(RT63xx) */\n#ifdef RT_BIG_ENDIAN\ntypedef union GNU_PACKED _HT_RX_WCID_EN_STRUC {\n\tstruct {\n    \tUINT32 RX_WCID31_TRAN_EN:1;\n    \tUINT32 RX_WCID30_TRAN_EN:1;\n    \tUINT32 RX_WCID29_TRAN_EN:1;\n    \tUINT32 RX_WCID28_TRAN_EN:1;\n    \tUINT32 RX_WCID27_TRAN_EN:1;\n    \tUINT32 RX_WCID26_TRAN_EN:1;\n    \tUINT32 RX_WCID25_TRAN_EN:1;\n    \tUINT32 RX_WCID24_TRAN_EN:1;\n    \tUINT32 RX_WCID23_TRAN_EN:1;\n    \tUINT32 RX_WCID22_TRAN_EN:1;\n    \tUINT32 RX_WCID21_TRAN_EN:1;\n    \tUINT32 RX_WCID20_TRAN_EN:1;\n    \tUINT32 RX_WCID19_TRAN_EN:1;\n    \tUINT32 RX_WCID18_TRAN_EN:1;\n    \tUINT32 RX_WCID17_TRAN_EN:1;\n    \tUINT32 RX_WCID16_TRAN_EN:1;\n    \tUINT32 RX_WCID15_TRAN_EN:1;\n    \tUINT32 RX_WCID14_TRAN_EN:1;\n    \tUINT32 RX_WCID13_TRAN_EN:1;\n    \tUINT32 RX_WCID12_TRAN_EN:1;\n    \tUINT32 RX_WCID11_TRAN_EN:1;\n    \tUINT32 RX_WCID10_TRAN_EN:1;\n    \tUINT32 RX_WCID9_TRAN_EN:1;\n    \tUINT32 RX_WCID8_TRAN_EN:1;\n    \tUINT32 RX_WCID7_TRAN_EN:1;\n    \tUINT32 RX_WCID6_TRAN_EN:1;\n    \tUINT32 RX_WCID5_TRAN_EN:1;\n    \tUINT32 RX_WCID4_TRAN_EN:1;\n    \tUINT32 RX_WCID3_TRAN_EN:1;\n    \tUINT32 RX_WCID2_TRAN_EN:1;\n    \tUINT32 RX_WCID1_TRAN_EN:1;\n    \tUINT32 RX_WCID0_TRAN_EN:1;\n\t} field;\n\tUINT32 word;\t\n} HT_RX_WCID_EN_STRUC, *PHT_RX_WCID_EN_STRUC;\n#else\ntypedef union GNU_PACKED _HT_RX_WCID_EN_STRUC {\n\tstruct {\n    \tUINT32 RX_WCID0_TRAN_EN:1;\n    \tUINT32 RX_WCID1_TRAN_EN:1;\n    \tUINT32 RX_WCID2_TRAN_EN:1;\n    \tUINT32 RX_WCID3_TRAN_EN:1;\n    \tUINT32 RX_WCID4_TRAN_EN:1;\n    \tUINT32 RX_WCID5_TRAN_EN:1;\n    \tUINT32 RX_WCID6_TRAN_EN:1;\n    \tUINT32 RX_WCID7_TRAN_EN:1;\n    \tUINT32 RX_WCID8_TRAN_EN:1;\n    \tUINT32 RX_WCID9_TRAN_EN:1;\n    \tUINT32 RX_WCID10_TRAN_EN:1;\n    \tUINT32 RX_WCID11_TRAN_EN:1;\n    \tUINT32 RX_WCID12_TRAN_EN:1;\n    \tUINT32 RX_WCID13_TRAN_EN:1;\n    \tUINT32 RX_WCID14_TRAN_EN:1;\n    \tUINT32 RX_WCID15_TRAN_EN:1;\n    \tUINT32 RX_WCID16_TRAN_EN:1;\n    \tUINT32 RX_WCID17_TRAN_EN:1;\n    \tUINT32 RX_WCID18_TRAN_EN:1;\n    \tUINT32 RX_WCID19_TRAN_EN:1;\n    \tUINT32 RX_WCID20_TRAN_EN:1;\n    \tUINT32 RX_WCID21_TRAN_EN:1;\n    \tUINT32 RX_WCID22_TRAN_EN:1;\n    \tUINT32 RX_WCID23_TRAN_EN:1;\n    \tUINT32 RX_WCID24_TRAN_EN:1;\n    \tUINT32 RX_WCID25_TRAN_EN:1;\n    \tUINT32 RX_WCID26_TRAN_EN:1;\n    \tUINT32 RX_WCID27_TRAN_EN:1;\n    \tUINT32 RX_WCID28_TRAN_EN:1;\n    \tUINT32 RX_WCID29_TRAN_EN:1;\n    \tUINT32 RX_WCID30_TRAN_EN:1;\n    \tUINT32 RX_WCID31_TRAN_EN:1;\n\t} field;\n\tUINT32 word;\n} HT_RX_WCID_EN_STRUC, *PHT_RX_WCID_EN_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n/* RX header translation - black list */\n#define HT_RX_BL_BASE\t\t0x0284\n#define HT_RX_BL_OFFSET\t\t2\n#define HT_RX_BL_SIZE\t\t8\n#ifdef RT_BIG_ENDIAN\ntypedef union GNU_PACKED _HT_RX_BLACK_LIST_STRUC {\n\tstruct {\n    \tUINT32 BLACK_ETHER_TYPE1:16;\n    \tUINT32 BLACK_ETHER_TYPE0:16;\n\t} field;\n\tUINT32 word;\t\n} HT_RX_BLACK_LIST_STRUC, *PHT_RX_BLACK_LIST_STRUC;\n#else\ntypedef union GNU_PACKED _HT_RX_BLACK_LIST_STRUC {\n\tstruct {\n    \tUINT32 BLACK_ETHER_TYPE0:16;\n    \tUINT32 BLACK_ETHER_TYPE1:16;\n\t} field;\n\tUINT32 word;\n} HT_RX_BLACK_LIST_STRUC, *PHT_RX_BLACK_LIST_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n/* RX VLAN Mapping (TCI) */\n#define HT_BSS_VLAN_BASE\t0x0294\n#define HT_BSS_VLAN_OFFSET\t2\n#define HT_BSS_VLAN_SIZE\t8\n#ifdef RT_BIG_ENDIAN\ntypedef union GNU_PACKED _HT_BSS_VLAN_STRUC {\n\tstruct {\n    \tUINT32 TCI1_VID:12;\n    \tUINT32 TCI1_CFI:1;\n    \tUINT32 TCI1_PCP:3;\n    \tUINT32 TCI0_VID:12;\n    \tUINT32 TCI0_CFI:1;\n    \tUINT32 TCI0_PCP:3;\n\t} field;\n\tUINT32 word;\t\n} HT_BSS_VLAN_STRUC, *PHT_BSS_VLAN_STRUC;\n#else\ntypedef union GNU_PACKED _HT_BSS_VLAN_STRUC {\n\tstruct {\n    \tUINT32 TCI0_PCP:3;\n    \tUINT32 TCI0_CFI:1;\n    \tUINT32 TCI0_VID:12;\n    \tUINT32 TCI1_PCP:3;\n    \tUINT32 TCI1_CFI:1;\n    \tUINT32 TCI1_VID:12;\n\t} field;\n\tUINT32 word;\n} HT_BSS_VLAN_STRUC, *PHT_BSS_VLAN_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n\n// TODO: shiang-6590, following definitions are dummy and not used for RT6590, shall remove/correct these!\n#define GPIO_CTRL_CFG\t0x0228\n#define PBF_MAX_PCNT\t0x0408 //actually, it's the TX_MAX_PCNT\n// TODO:shiang-6590 --------------------------\n\n#define PAIRWISE_KEY_TABLE_BASE     0x8000      /* 32-byte * 256-entry =  -byte */\n#define HW_KEY_ENTRY_SIZE           0x20\n\n#define PAIRWISE_IVEIV_TABLE_BASE     0xa000      /* 8-byte * 256-entry =  -byte */\n#define MAC_IVEIV_TABLE_BASE     0xa000      /* 8-byte * 256-entry =  -byte */\n#define HW_IVEIV_ENTRY_SIZE   8\n\n#define MAC_WCID_ATTRIBUTE_BASE     0xa800      /* 4-byte * 256-entry =  -byte */\n#define HW_WCID_ATTRI_SIZE   4\n\n#define SHARED_KEY_TABLE_BASE       0xac00      /* 32-byte * 16-entry = 512-byte */\n#define SHARED_KEY_MODE_BASE       0xb000      /* 32-byte * 16-entry = 512-byte */\n\n#define HW_SHARED_KEY_MODE_SIZE   4\n#define SHAREDKEYTABLE\t\t\t0\n#define PAIRWISEKEYTABLE\t\t\t1\n\n/* This resgiser is ONLY be supported for RT3883 or later.\n   It conflicted with BCN#0 offset of previous chipset. */\n#define WAPI_PN_TABLE_BASE\t\t0xb800\t\t\n#define WAPI_PN_ENTRY_SIZE   \t\t8\n\n#define RF_MISC\t0x0518\n#ifdef RT_BIG_ENDIAN\ntypedef union _RF_MISC_STRUC{\n\tstruct{\n\t\tUINT32 Rsv1:29;\n\t\tUINT32 EXT_PA_EN:1;\n\t\tUINT32 ADDAC_LDO_ADC9_EN:1;\n\t\tUINT32 ADDAC_LDO_ADC6_EN:1;\n\t}field;\n\tUINT32 word;\n}RF_MISC_STRUC, *PRF_MISC_STRUC;\n#else\ntypedef union _RF_MISC_STRUC{\n\tstruct{\n\t\tUINT32 ADDAC_LDO_ADC6_EN:1;\n\t\tUINT32 ADDAC_LDO_ADC9_EN:1;\n\t\tUINT32 EXT_PA_EN:1;\n\t\tUINT32 Rsv1:29;\n\t}field;\n\tUINT32 word;\n}RF_MISC_STRUC, *PRF_MISC_STRUC;\n#endif\n\nVOID ral_wlan_chip_onoff(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bOn,\n\tIN BOOLEAN bResetWLAN);\n\n#ifdef MT7601\nVOID MT7601_WLAN_ChipOnOff(\n\tIN struct _RTMP_ADAPTER *pAd,\n\tIN BOOLEAN bOn,\n\tIN BOOLEAN bResetWLAN);\n#endif /* MT7601 */\n\n#define AUX_CLK_CFG\t\t0x120C\n#define BB_PA_MODE_CFG0\t0x1214\n#define BB_PA_MODE_CFG1\t0x1218\n#define RF_PA_MODE_CFG0 0x121C\n#define RF_PA_MODE_CFG1\t0x1220\n#define TX_ALC_CFG_0\t0x13B0\n#define TX_ALC_CFG_1\t0x13B4\n\n#define TX0_RF_GAIN_CORR\t0x13A0\n#define TX0_RF_GAIN_ATTEN\t0x13A8\n#define TX0_BB_GAIN_ATTEN\t0x13C0\n#define TX_ALC_VGA3\t\t\t0x13C8\n\n\n#if defined(RT65xx) || defined(MT7601)\n#define RESET_CTL\t\t\t0x070C\n#define INT_LEVEL\t\t\t0x0718\n#define COM_REG0\t\t\t0x0730\n#define COM_REG1\t\t\t0x0734\n#define COM_REG2\t\t\t0x0738\n#define COM_REG3\t\t\t0x073C\n#define PCIE_REMAP_BASE1\t0x0740\n#define PCIE_REMAP_BASE2\t0x0744\n#define PCIE_REMAP_BASE3\t0x0748\n#define PCIE_REMAP_BASE4\t0x074C\n#define LED_CTRL\t\t\t\t0x0770\n#define LED_TX_BLINK_0\t\t0x0774\n#define LED_TX_BLINK_1\t\t0x0778\n#define LED0_S0\t\t\t\t0x077C\n#define LED0_S1\t\t\t\t0x0780\n#define SEMAPHORE_00\t\t0x07B0\n#endif /* RT65xx */\n#endif /* __RAL_NMAC_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/nmac/ral_nmac_pbf.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_nmac_pbf.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_NMAC_PBF_H__\n#define __RAL_NMAC_PBF_H__\n\n\n\n/* ================================================================================= */\n/* Register format  for PBF                                                                                                                                                     */\n/* ================================================================================= */\n\n\n/* Most are for debug. Driver doesn't touch PBF register. */\n#define PBF_SYS_CTRL \t 0x0400\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _PBF_SYS_CTRL_STRUC {\n\tstruct {\n\t\tUINT32 rsv5:7; /* Reserved */\n\t\tUINT32 CSR_TEST_EN:1;\n\t\tUINT32 MAC_CLKSEL:2; /* MAC clock selection */\n\t\tUINT32 PWRSV_EN:2;\n\t\tUINT32 SHRM_SEL:1; /* Shared memory access selection */\n\t\tUINT32 PBF_MSEL:2; /* Packet buffer memory access selection */\n\t\tUINT32 rsv4:5;\n\t\tUINT32 PBF_CLK_EN:1; /* PBF clock enable */\n\t\tUINT32 MAC_CLK_EN:1; /* MAC clock enable */\n\t\tUINT32 rsv3:6;\n\t\tUINT32 PBF_RESET:1; /* PBF hardware reset */\n\t\tUINT32 MAC_RESET:1; /* MAC hardware reset */\n\t\tUINT32 rsv:2;\n\t} field;\n\tUINT32 word;\n} PBF_SYS_CTRL_STRUC;\n#else\ntypedef union _PBF_SYS_CTRL_STRUC{\n\tstruct {\n                UINT32 rsv5:7; /* Reserved */\n                UINT32 CSR_TEST_EN:1;\n                UINT32 MAC_CLKSEL:2; /* MAC clock selection */\n                UINT32 PWRSV_EN:2;\n                UINT32 SHRM_SEL:1; /* Shared memory access selection */\n                UINT32 PBF_MSEL:2; /* Packet buffer memory access selection */\n                UINT32 rsv4:5;\n                UINT32 PBF_CLK_EN:1; /* PBF clock enable */\n                UINT32 MAC_CLK_EN:1; /* MAC clock enable */\n                UINT32 rsv3:6;\n                UINT32 PBF_RESET:1; /* PBF hardware reset */\n                UINT32 MAC_RESET:1; /* MAC hardware reset */\n                UINT32 rsv:2;\n\t}field;\n\tUINT32 word;\n} PBF_SYS_CTRL_STRUC;\n#endif\n\n\n#define PBF_CFG\t\t\t0x0404\n#define TX_MAX_PCNT\t0x0408\n#define RX_MAX_PCNT\t0x040c\n#define PBF_CTRL\t\t\t0x0410\n#define RXQ_STA\t\t\t0x0430\n#define TXQ_STA\t\t\t0x0434\n\n#define BCN_OFFSET0\t\t0x041c\n#define BCN_OFFSET1\t\t0x0420\n#define BCN_OFFSET2\t\t0x0424\n#define BCN_OFFSET3\t\t0x0428\n\n\n#define FCE_CTRL\t\t\t0x0800\n#define FCE_PARAM\t\t0x0804\n#define CHECKSUM_OFFLOAD\t0x0808\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _CSO_CTRL_STRUC {\n\tstruct {\n                UINT32 rsv:21;\n                UINT32 stamp_seq_num_en:1;\n                UINT32 cso_bigendian:1;\n                UINT32 cso_en:1;\n                UINT32 tx_ipv6_en:1;\n                UINT32 tx_ipv4_cs_gen:1;\n                UINT32 tx_tcp_cs_gen:1;\n                UINT32 tx_udp_cs_gen:1;\n                UINT32 rx_ipv6_en:1;\n                UINT32 rx_ipv4_cs_en:1;\n                UINT32 rx_tcp_cs_en:1;\n                UINT32 rx_udp_cs_en:1;\n\t} field;\n\tUINT32 word;\n} CSO_CTRL_STRUC;\n#else\ntypedef union _CSO_CTRL_STRUC{\n\tstruct {\n                UINT32 rx_udp_cs_en:1;\n                UINT32 rx_tcp_cs_en:1;\n                UINT32 rx_ipv4_cs_en:1;\n                UINT32 rx_ipv6_en:1;\n                UINT32 tx_udp_cs_gen:1;\n                UINT32 tx_tcp_cs_gen:1;\n                UINT32 tx_ipv4_cs_gen:1;\n                UINT32 tx_ipv6_en:1;\n                UINT32 cso_en:1;\n                UINT32 cso_bigendian:1;\n                UINT32 stamp_seq_num_en:1;\n                UINT32 rsv:21;\n\t}field;\n\tUINT32 word;\n} CSO_CTRL_STRUC;\n#endif\n\n#endif /* __RAL_NMAC_PBF_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/nmac/ral_nmac_pci.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tral_nmac_pci.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RAL_NMAC_PCI_H__\n#define __RAL_NMAC_PCI_H__\n\n\n\n/* INT_SOURCE_CSR: Interrupt source register. Write one to clear corresponding bit */\n#define INT_SOURCE_CSR\t\t0x200\n\n\n#define INT_R0_DONE\t\t(1<<0)\n#define INT_R1_DONE\t\t(1<<1)\n#define INT_T0_DONE\t\t(1<<4)\n#define INT_T1_DONE\t\t(1<<5)\n#define INT_T2_DONE\t\t(1<<6)\n#define INT_T3_DONE\t\t(1<<7)\n#define INT_T4_DONE\t\t(1<<8)\n#define INT_T5_DONE\t\t(1<<9)\n#define INT_T6_DONE\t\t(1<<10)\n#define INT_T7_DONE\t\t(1<<11)\n#define INT_T8_DONE\t\t(1<<12)\n#define INT_T9_DONE\t\t(1<<13)\n#define INT_RESVD\t\t((1<<14) | (1<<15))\n#define INT_RX_COHE\t\t(1<<16)\n#define INT_TX_COHE\t\t(1<<17)\n#define INT_ANY_COH\t\t(1<<18)\n#define INT_MCU_CMD\t(1<<19)\n#define INT_TBTT_ISR\t(1<<20)\n#define INT_PRE_TBTT\t(1<<21)\n#define INT_TX_STAT\t\t(1<<22)\n#define INT_AUTO_WAKE\t(1<<23)\n#define INT_GP_TIMER\t(1<<24)\n#define INT_RESVD_2\t\t(1<<25)\n#define INT_RX_DLY\t\t(1<<26)\n#define INT_TX_DLY\t\t(1<<27)\n#ifdef CARRIER_DETECTION_SUPPORT\n// TODO: shiang-6590, for 6590, what's the interrupt bit for TONE_RADAR?? now just give a reseved bit\n#define RT2860_INT_TONE_RADAR\t(1<<29)\n#endif /* CARRIER_DETECTION_SUPPORT*/\n\n /* Delayed Rx or indivi rx */\n#define RxINT\t\t\t(INT_R0_DONE | INT_R1_DONE /* | INT_RX_DLY */)\n/* Delayed Tx or indivi tx */\n#define TxDataInt\t\t(INT_T0_DONE | INT_T1_DONE | INT_T2_DONE | INT_T3_DONE /*| INT_TX_DLY*/)\n\n#ifdef RT8592\n#define TxMgmtInt\t\t(INT_T5_DONE /*| INT_TX_DLY*/)\n#else\n#define TxMgmtInt\t\t(INT_T9_DONE /*| INT_TX_DLY*/)\n#endif /* RT8592 */\n\n#define RxCoherent\t\tINT_RX_COHE\n#define TxCoherent\t\tINT_TX_COHE\n#define TxRxCoherent\t\tINT_ANY_COH\n\n/* mcu */\n#define McuCommand\t\tINT_MCU_CMD\n#define PreTBTTInt\t\tINT_PRE_TBTT\n#define TBTTInt\t\t\tINT_TBTT_ISR\n\n/*  fifo statistics full interrupt */\n#define FifoStaFullInt\t\tINT_TX_STAT\n\n/* AutoWakeupInt interrupt */\n#define AutoWakeupInt\tINT_AUTO_WAKE\n\n/* GPtimeout interrupt */\n#define GPTimeOutInt\tINT_GP_TIMER\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#define RadarInt\t\t\t(RT2860_INT_TONE_RADAR)\n#endif /* CARRIER_DETECTION_SUPPORT*/\n\n#define INT_RX\t\t\t(INT_R0_DONE | INT_R1_DONE)\n\n#define INT_AC0_DLY\t\t(INT_T0_DONE)\n#define INT_AC1_DLY\t\t(INT_T1_DONE)\n#define INT_AC2_DLY\t\t(INT_T2_DONE)\n#define INT_AC3_DLY\t\t(INT_T3_DONE)\n#ifdef RT8592\n#define INT_HCCA_DLY\t(INT_T4_DONE)\n#define INT_MGMT_DLY\t(INT_T5_DONE)\n#else\n#define INT_HCCA_DLY\t(INT_T8_DONE)\n#define INT_MGMT_DLY\t(INT_T9_DONE)\n#endif /* RT8592 */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#define INT_TONE_RADAR\t(RT2860_INT_TONE_RADAR)\n#endif /* CARRIER_DETECTION_SUPPORT*/\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#define DELAYINTMASK\t(0x0DFF3FF3 | (RadarInt))\n#define INTMASK\t\t\t(0x0DFF3FF3 | (RadarInt))\n#else\n#define DELAYINTMASK\t0x0DFF3FF3\n#define INTMASK\t\t\t0x0DFF3FF3\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _INT_SOURCE_CSR_STRUC {\n\tstruct {\n\t\tUINT32 rsv1:4;\n\t\tUINT32 TxDelayINT:1;\n\t\tUINT32 RxDelayINT:1;\n\t\tUINT32 rsv2:1;\n\t\tUINT32 GPTimer:1;\n\t\tUINT32 AutoWakeup:1;\n\t\tUINT32 TXFifoStatusInt:1;\n\t\tUINT32 PreTBTT:1;\n\t\tUINT32 tbttInt:1;\n\t\tUINT32 MCUCommandINT:1;\n\t\tUINT32 trCoherent:1;\n\t\tUINT32 txCoherent:1;\n\t\tUINT32 rxCoherent:1;\n\t\tUINT32 rsv3:2;\n\t\tUINT32 TxDone9:1;\n\t\tUINT32 TxDone8:1;\n\t\tUINT32 TxDone7:1;\n\t\tUINT32 TxDone6:1;\n\t\tUINT32 MgmtDmaDone:1;\n\t\tUINT32 HccaDmaDone:1;\n\t\tUINT32 Ac3DmaDone:1;\n\t\tUINT32 Ac2DmaDone:1;\n\t\tUINT32 Ac1DmaDone:1;\n\t\tUINT32 Ac0DmaDone:1;\n\t\tUINT32 rsv4:2;\n\t\tUINT32 RxDone1:1;\n\t\tUINT32 RxDone:1;\n\t}field;\n\tUINT32 word;\n}INT_SOURCE_CSR_STRUC;\n#else\ntypedef union _INT_SOURCE_CSR_STRUC {\n\tstruct {\n\t\tUINT32 RxDone:1;\n\t\tUINT32 RxDone1:1;\n\t\tUINT32 rsv4:2;\n\t\tUINT32 Ac0DmaDone:1;\n\t\tUINT32 Ac1DmaDone:1;\n\t\tUINT32 Ac2DmaDone:1;\n\t\tUINT32 Ac3DmaDone:1;\n\t\tUINT32 HccaDmaDone:1;\n\t\tUINT32 MgmtDmaDone:1;\n\t\tUINT32 TxDone6:1;\n\t\tUINT32 TxDone7:1;\n\t\tUINT32 TxDone8:1;\n\t\tUINT32 TxDone9:1;\n\t\tUINT32 rsv3:2;\n\t\tUINT32 rxCoherent:1;\n\t\tUINT32 txCoherent:1;\n\t\tUINT32 trCoherent:1;\n\t\tUINT32 MCUCommandINT:1;\n\t\tUINT32 tbttInt:1;\n\t\tUINT32 PreTBTT:1;\n\t\tUINT32 TXFifoStatusInt:1;\n\t\tUINT32 AutoWakeup:1;\n\t\tUINT32 GPTimer:1;\n\t\tUINT32 rsv2:1;\n\t\tUINT32 RxDelayINT:1;\n\t\tUINT32 TxDelayINT:1;\n\t\tUINT32 rsv1:4;\n\t}field;\n\tUINT32 word;\n}INT_SOURCE_CSR_STRUC;\n#endif /* RT_BIG_ENDIAN */\n\n\n/* INT_MASK_CSR:   Interrupt MASK register.   1: the interrupt is mask OFF */\n#define INT_MASK_CSR        0x204\n#ifdef RT_BIG_ENDIAN\ntypedef union _PDMA_INT_MASK{\n\tstruct {\n\t\tUINT32 rsv1:4;\n\t\tUINT32 TxDelayINT:1;\n\t\tUINT32 RxDelayINT:1;\n\t\tUINT32 rsv2:1;\n\t\tUINT32 GPTimer:1;\n\t\tUINT32 AutoWakeup:1;\n\t\tUINT32 TXFifoStatusInt:1;\n\t\tUINT32 PreTBTT:1;\n\t\tUINT32 tbttInt:1;\n\t\tUINT32 MCUCommandINT:1;\n\t\tUINT32 trCoherent:1;\n\t\tUINT32 txCoherent:1;\n\t\tUINT32 rxCoherent:1;\n\t\tUINT32 rsv3:2;\n\t\tUINT32 TxDone9:1;\n\t\tUINT32 TxDone8:1;\n\t\tUINT32 TxDone7:1;\n\t\tUINT32 TxDone6:1;\n\t\tUINT32 MgmtDmaDone:1;\n\t\tUINT32 HccaDmaDone:1;\n\t\tUINT32 Ac3DmaDone:1;\n\t\tUINT32 Ac2DmaDone:1;\n\t\tUINT32 Ac1DmaDone:1;\n\t\tUINT32 Ac0DmaDone:1;\n\t\tUINT32 rsv4:2;\n\t\tUINT32 RxDone1:1;\n\t\tUINT32 RxDone:1;\n\t}field;\n\tUINT32 word;\n}PMDA_INT_MASK;\n#else\ntypedef union _PDMA_INT_MASK{\n\tstruct {\n\t\tUINT32 RxDone:1;\n\t\tUINT32 RxDone1:1;\n\t\tUINT32 rsv4:2;\n\t\tUINT32 Ac0DmaDone:1;\n\t\tUINT32 Ac1DmaDone:1;\n\t\tUINT32 Ac2DmaDone:1;\n\t\tUINT32 Ac3DmaDone:1;\n\t\tUINT32 HccaDmaDone:1;\n\t\tUINT32 MgmtDmaDone:1;\n\t\tUINT32 TxDone6:1;\n\t\tUINT32 TxDone7:1;\n\t\tUINT32 TxDone8:1;\n\t\tUINT32 TxDone9:1;\n\t\tUINT32 rsv3:2;\n\t\tUINT32 rxCoherent:1;\n\t\tUINT32 txCoherent:1;\n\t\tUINT32 trCoherent:1;\n\t\tUINT32 MCUCommandINT:1;\n\t\tUINT32 tbttInt:1;\n\t\tUINT32 PreTBTT:1;\n\t\tUINT32 TXFifoStatusInt:1;\n\t\tUINT32 AutoWakeup:1;\n\t\tUINT32 GPTimer:1;\n\t\tUINT32 rsv2:1;\n\t\tUINT32 RxDelayINT:1;\n\t\tUINT32 TxDelayINT:1;\n\t\tUINT32 rsv1:4;\n\t}field;\n\tUINT32 word;\n}PMDA_INT_MASK;\n#endif /* RT_BIG_ENDIAN */\n\n\n/*\n\tTx Ring Layout and assignments\n\n\tTotally we have 10 Tx Rings and assigned as following usage:\n\t1. RT85592\n\t\tTxRing 0~3: for TxQ Channel 1 with AC_BK/BE/VI/VO\n\t\tTxRing 4    : for TxQ CTRL\n\t\tTxRing 5    : for TxQ MGMT\n\t\tTxRing 6~9: for TxQ Channel 2 with AC_BK/BE/VI/VO\n\n\t2. MT7650\n\t\tTxRing 0~3: for TxQ Channel 1 with AC_BK/BE/VI/VO\n\t\tTxRing 4~7: for TxQ Channel 2 with AC_BK/BE/VI/VO\n\t\tTxRing 8    : for TxQ CTRL\n\t\tTxRing 9    : for TxQ MGMT\n\t\t\n\tFor each TxRing, we have four register to control it\n\t\tTX_RINGn_CTRL0 (0x0): base address of this ring(4-DWORD aligned address)\n\t\tTX_RINGn_CTRL1 (0x4): maximum number of TxD count in this ring\n\t\tTX_RINGn_CTRL2 (0x8): Point to the next TxD CPU wants to use\n\t\tTX_RINGn_CTRL3 (0xc): Point to the next TxD DMA wants to use\n\n*/\n#define RINGREG_DIFF\t0x10\n#define TX_RING_BASE\t0x0300\n#define TX_RING_NUM\t\t10\n#define TX_RING_PTR\t\t0x0300\n#define TX_RING_CNT\t\t0x0304\n#define TX_RING_CIDX\t0x0308\n#define TX_RING_DIDX\t0x030c\n\n#ifdef RT8592\n#define TX_MGMT_BASE\t(TX_RING_BASE  + RINGREG_DIFF * 5)\n#else\n/* Mgmt Tx Ring registers */\n#define TX_MGMT_BASE\t(TX_RING_BASE  + RINGREG_DIFF * 9)\n#endif /* RT8592 */\n#define TX_MGMT_CNT\t(TX_MGMT_BASE + 0x04)\n#define TX_MGMT_CIDX\t(TX_MGMT_BASE + 0x08)\n#define TX_MGMT_DIDX\t(TX_MGMT_BASE + 0x0c)\n\n#ifdef RT8592\n#define TX_CTRL_BASE\t(TX_RING_BASE  + RINGREG_DIFF * 4)\n#else\n/* Mgmt Tx Ring registers */\n#define TX_CTRL_BASE\t(TX_RING_BASE  + RINGREG_DIFF * 8)\n#endif /* RT8592 */\n#define TX_CTRL_CNT\t\t(TX_CTRL_BASE + 0x04)\n#define TX_CTRL_CIDX\t(TX_CTRL_BASE + 0x08)\n#define TX_CTRL_DIDX\t(TX_CTRL_BASE + 0x0c)\n\n\n#define TX_CHAN_BASE_1\t\t(TX_RING_BASE + RINGREG_DIFF * 0)\n#define TX_CHAN_BASE_2\t\t(TX_RING_BASE + RINGREG_DIFF * 6)\n\n/* following address is base on TX_CHAN_BASE_X */\n#define TX_RING_BK_BASE\t0x0\n#define TX_RING_BK_CNT\t\t(TX_RING_BK_BASE + 0x04)\n#define TX_RING_BK_CIDX\t\t(TX_RING_BK_BASE + 0x08)\n#define TX_RING_BK_DIDX\t(TX_RING_BK_BASE + 0x0c)\n\n#define TX_RING_BE_BASE\t(TX_RING_BK_BASE + RINGREG_DIFF)\n#define TX_RING_BE_CNT\t\t(TX_RING_BE_BASE + 0x04)\n#define TX_RING_BE_CIDX\t\t(TX_RING_BE_BASE + 0x08)\n#define TX_RING_BE_DIDX\t(TX_RING_BE_BASE + 0x0c)\n\n#define TX_RING_VI_BASE\t\t(TX_RING_BE_BASE + RINGREG_DIFF)\n#define TX_RING_VI_CNT\t\t(TX_RING_VI_BASE + 0x04)\n#define TX_RING_VI_CIDX\t\t(TX_RING_VI_BASE + 0x08)\n#define TX_RING_VI_DIDX\t\t(TX_RING_VI_BASE + 0x0c)\n\n#define TX_RING_VO_BASE\t(TX_RING_VI_BASE + RINGREG_DIFF)\n#define TX_RING_VO_CNT\t\t(TX_RING_VO_BASE + 0x04)\n#define TX_RING_VO_CIDX\t(TX_RING_VO_BASE + 0x08)\n#define TX_RING_VO_DIDX\t(TX_RING_VO_BASE + 0x0c)\n\n\n/*\n\tRx Ring Layput and assignments\n\n\tTotally we have 2 Rx Rings and assigned as following usage:\n\t\tRxRing 0: for all received data packets\n\t\tRxRing 1: for internal ctrl/info packets generated by on-chip CPU.\n\n\tFor each TxRing, we have four register to control it\n\t\tRX_RING_CTRL0 (0x0): base address of this ring(4-DWORD aligned address)\n\t\tRX_RING_CTRL1 (0x4): maximum number of RxD count in this ring\n\t\tRX_RING_CTRL2 (0x8): Point to the next RxD CPU wants to use\n\t\tRX_RING_CTRL3 (0xc): Point to the next RxD DMA wants to use\n*/\n#define RX_RING_BASE\t0x03c0\n#define RX_RING_NUM\t2\n#define RX_RING_PTR\t\tRX_RING_BASE\n#define RX_RING_CNT\t\t(RX_RING_BASE + 0x04)\n#define RX_RING_CIDX\t(RX_RING_BASE + 0x08)\n#define RX_RING_DIDX\t(RX_RING_BASE + 0x0c)\n#define RX_CTRL_BASE\t(RX_RING_BASE + RINGREG_DIFF)\n#define RX_CTRL_PTR\t\tRX_CTRL_BASE\n#define RX_CTRL_CNT\t\t(RX_CTRL_BASE + 0x04)\n#define RX_CTRL_CIDX\t(RX_CTRL_BASE + 0x08)\n#define RX_CTRL_DIDX\t(RX_CTRL_BASE + 0x0c)\n\n#endif /*__RAL_NMAC_PCI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/nmac/ral_nmac_rxwi.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_nmac_rxwi.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_NMAC_RXWI_H__\n#define __RAL_NMAC_RXWI_H__\n\n#include \"rtmp_type.h\"\n\n/*\n\tRXWI wireless information format.\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _RXWI_NMAC{\n\t/* Word 0 */\n\tUINT32 eof:1;\n\tUINT32 rsv:1;\n\tUINT32 MPDUtotalByteCnt:14;\n\tUINT32 udf:3;\n\tUINT32 bss_idx:3;\n\tUINT32 key_idx:2;\n\tUINT32 wcid:8;\n\n\t/* Word 1 */\n\tUINT32 phy_mode:3;\n\tUINT32 i_txbf:1;\n\tUINT32 e_txbf:1;\n\tUINT32 stbc:1;\n\tUINT32 sgi:1;\n\tUINT32 bw:2;\n\tUINT32 mcs:7;\n\tUINT32 sn:12;\n\tUINT32 tid:4;\n\n\t/* Word 2 */\n\tUINT8 rssi[4];\n\n\t/* Word 3~6 */\n\tUINT8 bbp_rxinfo[16];\n}\tRXWI_NMAC;\n#else\ntypedef\tstruct GNU_PACKED _RXWI_NMAC {\n\t/* Word 0 */\n\tUINT32 wcid:8;\n\tUINT32 key_idx:2;\n\tUINT32 bss_idx:3;\n\tUINT32 udf:3;\n\tUINT32 MPDUtotalByteCnt:14;\n\tUINT32 rsv:1;\n\tUINT32 eof:1;\n\n\t/* Word 1 */\n\tUINT32 tid:4;\n\tUINT32 sn:12;\n\tUINT32 mcs:7;\n\tUINT32 bw:2;\n\tUINT32 sgi:1;\n\tUINT32 stbc:1;\n\tUINT32 e_txbf:1;\n\tUINT32 i_txbf:1;\n\tUINT32 phy_mode:3;\n\n\t/* Word 2 */\n\tUINT8 rssi[4];\n\n\t/* Word 3~6 */\n\tUINT8 bbp_rxinfo[16];\n}\tRXWI_NMAC;\n#endif /* RT_BIG_ENDIAN */\n\n\n#define RxWIMPDUByteCnt\tRXWI_N.MPDUtotalByteCnt\n#define RxWIWirelessCliID\tRXWI_N.wcid\n#define RxWIKeyIndex\t\tRXWI_N.key_idx\n#define RxWIMCS\t\t\t\tRXWI_N.mcs\n#define RxWIBW\t\t\t\tRXWI_N.bw\n#define RxWIBSSID\t\t\tRXWI_N.bss_idx\n#define RxWISGI\t\t\t\tRXWI_N.sgi\n#define RxWIPhyMode\t\tRXWI_N.phy_mode\n#define RxWISTBC\t\t\tRXWI_N.stbc\n#define RxWITID\t\t\t\tRXWI_N.tid\n#define RxWIRSSI0\t\t\tRXWI_N.rssi[0]\n#define RxWIRSSI1\t\t\tRXWI_N.rssi[1]\n#define RxWIRSSI2\t\t\tRXWI_N.rssi[2]\n#define RxWISNR0\t\t\tRXWI_N.bbp_rxinfo[0]\n#define RxWISNR1\t\t\tRXWI_N.bbp_rxinfo[1]\n#define RxWISNR2\t\t\tRXWI_N.bbp_rxinfo[2]\n#define RxWIFOFFSET\t\t\tRXWI_N.bbp_rxinfo[3]\n\n\n\n#endif /* __RAL_NMAC_RXWI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/nmac/ral_nmac_txwi.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_nmac_txwi.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_NMAC_TXWI_H__\n#define __RAL_NMAC_TXWI_H__\n\n#include \"rtmp_type.h\"\n\n\n\n#ifdef RT65xx\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _TXWI_NMAC {\n\t/* Word 0 */\n\tUINT32\t\tPHYMODE:3;\n\tUINT32\t\tiTxBF:1;\n\tUINT32\t\teTxBF:1;\n\tUINT32\t\tSTBC:1;\n\tUINT32\t\tShortGI:1;\n\tUINT32\t\tBW:2;\t\t\t/* channel bandwidth 20/40/80 MHz */\n\tUINT32\t\tMCS:7;\n\t\n\tUINT32\t\trsv0:2;\n\tUINT32\t\tSounding:1;\n\tUINT32\t\tNDPSndBW:1;\t/* NDP sounding BW */\n\tUINT32\t\tNDPSndRate:2;\t/* 0 : MCS0, 1: MCS8, 2: MCS16, 3: reserved */\n\tUINT32\t\ttxop:2;\n\n\tUINT32\t\tMpduDensity:3;\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tTS:1;\n\tUINT32\t\tCFACK:1;\n\tUINT32\t\tMIMOps:1;\t/* the remote peer is in dynamic MIMO-PS mode */\n\tUINT32\t\tFRAG:1;\t\t/* 1 to inform TKIP engine this is a fragment. */\n\t\n\t/* Word 1 */\n\tUINT32\t\tRsv1:2;\n\tUINT32\t\tMPDUtotalByteCnt:14;\n\tUINT32\t\twcid:8;\n\tUINT32\t\tBAWinSize:6;\n\tUINT32\t\tNSEQ:1;\n\tUINT32\t\tACK:1;\n\n\t/* Word 2 */\n\tUINT32\t\tIV;\n\t/* Word 3 */\n\tUINT32\t\tEIV;\n\n\t/* Word 4 */\n\tUINT32\t\tTxPktId:8;\n\tUINT32\t\tRsv4:4;\n\tUINT32\t\tTxPwrAdj:4;\n\tUINT32\t\tTxStreamMode:8;\n\tUINT32\t\tTxEAPId:8;\n}\tTXWI_NMAC, *PTXWI_NMAC;\n#else\ntypedef\tstruct GNU_PACKED _TXWI_NMAC {\n\t/* Word\t0 */\n\t/* ex: 00 03 00 40 means txop = 3, PHYMODE = 1 */\n\tUINT32\t\tFRAG:1;\t\t/* 1 to inform TKIP engine this is a fragment. */\n\tUINT32\t\tMIMOps:1;\t/* the remote peer is in dynamic MIMO-PS mode */\n\tUINT32\t\tCFACK:1;\n\tUINT32\t\tTS:1;\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tMpduDensity:3;\n\n\tUINT32\t\ttxop:2;\n\tUINT32\t\tNDPSndRate:2; /* 0 : MCS0, 1: MCS8, 2: MCS16, 3: reserved */\n\tUINT32\t\tNDPSndBW:1; /* NDP sounding BW */\n\tUINT32\t\tSounding:1;\n\tUINT32\t\trsv0:2;\n\t\n\tUINT32\t\tMCS:7;\n\tUINT32\t\tBW:2;\t\t/*channel bandwidth 20/40/80 MHz */\n\tUINT32\t\tShortGI:1;\n\tUINT32\t\tSTBC:1;\n\tUINT32\t\teTxBF:1;\n\tUINT32\t\tiTxBF:1;\n\tUINT32\t\tPHYMODE:3;  \n\n\t/* Word1 */\n\t/* ex:  1c ff 38 00 means ACK=0, BAWinSize=7, MPDUtotalByteCnt = 0x38 */\n\tUINT32\t\tACK:1;\n\tUINT32\t\tNSEQ:1;\n\tUINT32\t\tBAWinSize:6;\n\tUINT32\t\twcid:8;\n\tUINT32\t\tMPDUtotalByteCnt:14;\n\tUINT32\t\tRsv1:2;\n\t\n\t/*Word2 */\n\tUINT32\t\tIV;\n\t\n\t/*Word3 */\n\tUINT32\t\tEIV;\n\n\t/* Word 4 */\n\tUINT32\t\tTxEAPId:8;\n\tUINT32\t\tTxStreamMode:8;\n\tUINT32\t\tTxPwrAdj:4;\n\tUINT32\t\tRsv4:4;\t\n\tUINT32\t\tTxPktId:8;\n}\tTXWI_NMAC, *PTXWI_NMAC;\n#endif /* RT_BIG_ENDIAN */\n#else\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _TXWI_NMAC {\n\t/* Word 0 */\n\tUINT32\t\tPHYMODE:2;\n\tUINT32\t\tRsv1:3;\t\n\tUINT32\t\tSTBC:2;\n\tUINT32\t\tShortGI:1;\n\tUINT32\t\tBW:1;\n\tUINT32\t\tMCS:7;\n\t\n\tUINT32\t\tTXLUT:1;\n\tUINT32\t\tTXRPT:1;\n\tUINT32\t\tAutofallback:1;\t/* TX rate auto fallback disable */\n\tUINT32\t\tCWMIN:3;\n\tUINT32\t\ttxop:2;\n\n\tUINT32\t\tMpduDensity:3;\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tTS:1;\n\tUINT32\t\tCFACK:1;\n\tUINT32\t\tMIMOps:1;\t/* the remote peer is in dynamic MIMO-PS mode */\n\tUINT32\t\tFRAG:1;\t\t/* 1 to inform TKIP engine this is a fragment. */\n\t\n\t/* Word 1 */\n\tUINT32\t\tTxPktId:4;\n\tUINT32\t\tMPDUtotalByteCnt:12;\n\tUINT32\t\twcid:8;\n\tUINT32\t\tBAWinSize:6;\n\tUINT32\t\tNSEQ:1;\n\tUINT32\t\tACK:1;\n\n\t/* Word 2 */\n\tUINT32\t\tIV;\n\t/* Word 3 */\n\tUINT32\t\tEIV;\n\n\t/* Word 4 */\n\tUINT32\t\tRsv3:9;\n\tUINT32\t\tPIFS_REV:1;\n\tUINT32\t\tRsv2:1;\n\tUINT32\t\tCCP:1;\t\t/* Channel Check Packet */\n\tUINT32\t\tTxPwrAdj:4;\n\tUINT32\t\tTxStreamMode:8;\n\tUINT32\t\tTxEAPId:8;\n}\tTXWI_NMAC, *PTXWI_NMAC;\n#else\ntypedef\tstruct GNU_PACKED _TXWI_NMAC {\n\t/* Word\t0 */\n\t/* ex: 00 03 00 40 means txop = 3, PHYMODE = 1 */\n\tUINT32\t\tFRAG:1;\t\t/* 1 to inform TKIP engine this is a fragment. */\n\tUINT32\t\tMIMOps:1;\t/* the remote peer is in dynamic MIMO-PS mode */\n\tUINT32\t\tCFACK:1;\n\tUINT32\t\tTS:1;\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tMpduDensity:3;\n\n\tUINT32\t\ttxop:2;\n\tUINT32\t\tCWMIN:3;\n\tUINT32\t\tAutofallback:1;\t/* TX rate auto fallback disable */\n\tUINT32\t\tTXRPT:1;\n\tUINT32\t\tTXLUT:1;\n\n\tUINT32\t\tMCS:7;\n\tUINT32\t\tBW:1;\n\tUINT32\t\tShortGI:1;\n\tUINT32\t\tSTBC:2;\n\tUINT32\t\tRsv1:3;\t\n\tUINT32\t\tPHYMODE:2;  \n\n\t/* Word1 */\n\t/* ex:  1c ff 38 00 means ACK=0, BAWinSize=7, MPDUtotalByteCnt = 0x38 */\n\tUINT32\t\tACK:1;\n\tUINT32\t\tNSEQ:1;\n\tUINT32\t\tBAWinSize:6;\n\tUINT32\t\twcid:8;\n\tUINT32\t\tMPDUtotalByteCnt:12;\n\tUINT32\t\tTxPktId:4;\n\t\n\t/*Word2 */\n\tUINT32\t\tIV;\n\t\n\t/*Word3 */\n\tUINT32\t\tEIV;\n\n\t/* Word 4 */\n\tUINT32\t\tTxEAPId:8;\n\tUINT32\t\tTxStreamMode:8;\n\tUINT32\t\tTxPwrAdj:4;\n\tUINT32\t\tCCP:1;\t\t/* Channel Check Packet */\n\tUINT32\t\tRsv2:1;\n\tUINT32\t\tPIFS_REV:1;\n\tUINT32\t\tRsv3:9;\n}\tTXWI_NMAC, *PTXWI_NMAC;\n#endif /* RT_BIG_ENDIAN */\n#endif /* RT65xx */\n\n#define TxWIMPDUByteCnt\tTXWI_N.MPDUtotalByteCnt\n#define TxWIWirelessCliID\tTXWI_N.wcid\n#define TxWIFRAG\t\t\tTXWI_N.FRAG\n#define TxWICFACK\t\t\tTXWI_N.CFACK\n#define TxWITS\t\t\t\tTXWI_N.TS\n#define TxWIAMPDU\t\t\tTXWI_N.AMPDU\n#define TxWIACK\t\t\t\tTXWI_N.ACK\n#define TxWITXOP\t\t\tTXWI_N.txop\n#define TxWINSEQ\t\t\tTXWI_N.NSEQ\n#define TxWIBAWinSize\t\tTXWI_N.BAWinSize\n#define TxWIShortGI\t\t\tTXWI_N.ShortGI\n#define TxWISTBC\t\t\tTXWI_N.STBC\n#define TxWIPacketId\t\tTXWI_N.TxPktId\n#define TxWIBW\t\t\t\tTXWI_N.BW\n#define TxWIMCS\t\t\t\tTXWI_N.MCS\n#define TxWIPHYMODE\t\tTXWI_N.PHYMODE\n#define TxWIMIMOps\t\t\tTXWI_N.MIMOps\n#define TxWIMpduDensity\t\tTXWI_N.MpduDensity\n#define TxWITXRPT\t\t\tTXWI_N.TXRPT\n#define TxWITXLUT\t\t\tTXWI_N.TXLUT\n\n\n#endif /* __RAL_NMAC_TXWI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/nmac/ral_nmac_usb.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tral_omac_usb.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RAL_OMAC_USB_H__\n#define __RAL_OMAC_USB_H__\n#define CMB_CTRL\t\t0x20\n#ifdef RT_BIG_ENDIAN\ntypedef union _CMB_CTRL_STRUC{\n\tstruct{\n\t\tUINT32       \tLDO0_EN:1;\n\t\tUINT32       \tLDO3_EN:1;\n\t\tUINT32       \tLDO_BGSEL:2;\n\t\tUINT32       \tLDO_CORE_LEVEL:4;\n\t\tUINT32       \tPLL_LD:1;\n\t\tUINT32       \tXTAL_RDY:1;\n\t\tUINT32       \tRsv:2;\n\t\tUINT32\t\tLDO25_FRC_ON:1;//4      \n\t\tUINT32\t\tLDO25_LARGEA:1;\n\t\tUINT32\t\tLDO25_LEVEL:2;\n\t\tUINT32\t\tAUX_OPT_Bit15_Two_AntennaMode:1;\n\t\tUINT32\t\tAUX_OPT_Bit14_TRSW1_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit13_GPIO7_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit12_TRSW0_as_WLAN_ANT_SEL:1;\n\t\tUINT32\t\tAUX_OPT_Bit11_Rsv:1;\n\t\tUINT32\t\tAUX_OPT_Bit10_NotSwap_WL_LED_ACT_RDY:1;\n\t\tUINT32\t\tAUX_OPT_Bit9_GPIO3_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit8_AuxPower_Exists:1;\n\t\tUINT32\t\tAUX_OPT_Bit7_KeepInterfaceClk:1;\n\t\tUINT32\t\tAUX_OPT_Bit6_KeepXtal_On:1;\n\t\tUINT32\t\tAUX_OPT_Bit5_RemovePCIePhyClk_BTOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit4_RemovePCIePhyClk_WLANOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit3_PLLOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit2_PCIeCoreClkOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit1_PCIePhyClkOn_L1:1;\t\n\t\tUINT32\t\tAUX_OPT_Bit0_InterfaceClk_40Mhz:1;\n\t}field;\n\tUINT32 word;\n}CMB_CTRL_STRUC, *PCMB_CTRL_STRUC;\n#else\ntypedef union _CMB_CTRL_STRUC{\n\tstruct{\n\t\tUINT32\t\tAUX_OPT_Bit0_InterfaceClk_40Mhz:1;\n\t\tUINT32\t\tAUX_OPT_Bit1_PCIePhyClkOn_L1:1;\t\n\t\tUINT32\t\tAUX_OPT_Bit2_PCIeCoreClkOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit3_PLLOn_L1:1;\n\t\tUINT32\t\tAUX_OPT_Bit4_RemovePCIePhyClk_WLANOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit5_RemovePCIePhyClk_BTOff:1;\n\t\tUINT32\t\tAUX_OPT_Bit6_KeepXtal_On:1;\n\t\tUINT32\t\tAUX_OPT_Bit7_KeepInterfaceClk:1;\n\t\tUINT32\t\tAUX_OPT_Bit8_AuxPower_Exists:1;\n\t\tUINT32\t\tAUX_OPT_Bit9_GPIO3_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit10_NotSwap_WL_LED_ACT_RDY:1;\t\n\t\tUINT32\t\tAUX_OPT_Bit11_Rsv:1;\n\t\tUINT32\t\tAUX_OPT_Bit12_TRSW0_as_WLAN_ANT_SEL:1;\n\t\tUINT32\t\tAUX_OPT_Bit13_GPIO7_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit14_TRSW1_as_GPIO:1;\n\t\tUINT32\t\tAUX_OPT_Bit15_Two_AntennaMode:1;\n\t\tUINT32\t\tLDO25_LEVEL:2;\n\t\tUINT32\t\tLDO25_LARGEA:1;\n\t\tUINT32\t\tLDO25_FRC_ON:1;//4      \n\t\tUINT32       \tRsv:2;\n\t\tUINT32       \tXTAL_RDY:1;\n\t\tUINT32       \tPLL_LD:1;\n\t\tUINT32       \tLDO_CORE_LEVEL:4;\n\t\tUINT32       \tLDO_BGSEL:2;\n\t\tUINT32       \tLDO3_EN:1;\n\t\tUINT32       \tLDO0_EN:1;\n\t}field;\n\tUINT32 word;\n}CMB_CTRL_STRUC, *PCMB_CTRL_STRUC;\n#endif\n\n\n\n\n#define USB_DMA_CFG 0x0238\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _USB_DMA_CFG_STRUC {\n\tstruct {\n\t\tUINT32 TxBusy:1;   \t/*USB DMA TX FSM busy. debug only */\n\t\tUINT32 RxBusy:1;        /*USB DMA RX FSM busy. debug only */\n\t\tUINT32 EpoutValid:3;        /*OUT endpoint data valid. debug only */\n\t\tUINT32 rsv3:1;\t\t\n\t\tUINT32 UDMA_RX_WL_DROP:1; /* Drop current WL RX packets in UDMA */\n\t\tUINT32 rsv2:1;\n\t\tUINT32 TxBulkEn:1;        /*Enable USB DMA Tx */\n\t\tUINT32 RxBulkEn:1;        /*Enable USB DMA Rx */\n\t\tUINT32 RxBulkAggEn:1;        /*Enable Rx Bulk Aggregation */\n\t\tUINT32 TxopHalt:1;        /*Halt TXOP count down when TX buffer is full. */\n\t\tUINT32 TxClear:1;        /*Clear USB DMA TX path */\n\t\tUINT32 rsv1:2;        \n\t\tUINT32 phyclear:1;        \t\t/*phy watch dog enable. write 1 */\n\t\tUINT32 RxBulkAggLmt:8;        /*Rx Bulk Aggregation Limit  in unit of 1024 bytes */\n\t\tUINT32 RxBulkAggTOut:8;        /*Rx Bulk Aggregation TimeOut  in unit of 33ns */\n\t} field;\n\tUINT32 word;\n} USB_DMA_CFG_STRUC, *PUSB_DMA_CFG_STRUC;\n#else\ntypedef\tunion _USB_DMA_CFG_STRUC {\n\tstruct {\n\t\tUINT32 RxBulkAggTOut:8;        /*Rx Bulk Aggregation TimeOut  in unit of 33ns */\n\t\tUINT32 RxBulkAggLmt:8;        /*Rx Bulk Aggregation Limit  in unit of 256 bytes */\n\t\tUINT32 phyclear:1;        \t\t/*phy watch dog enable. write 1 */\n\t\tUINT32 rsv1:2;\n\t\tUINT32 TxClear:1;        /*Clear USB DMA TX path */\n\t\tUINT32 TxopHalt:1;        /*Halt TXOP count down when TX buffer is full. */\n\t\tUINT32 RxBulkAggEn:1;        /*Enable Rx Bulk Aggregation */\n\t\tUINT32 RxBulkEn:1;        /*Enable USB DMA Rx */\n\t\tUINT32 TxBulkEn:1;        /*Enable USB DMA Tx */\n\t\tUINT32 rsv2:1;\n\t\tUINT32 UDMA_RX_WL_DROP:1; /* Drop current WL RX packets in UDMA */\n\t\tUINT32 rsv3:1;\t\t\n\t\tUINT32 EpoutValid:3;        /*OUT endpoint data valid */\n\t\tUINT32 RxBusy:1;        /*USB DMA RX FSM busy */\n\t\tUINT32 TxBusy:1;   \t/*USB DMA TX FSM busy */\n\t} field;\n\tUINT32 word;\n} USB_DMA_CFG_STRUC, *PUSB_DMA_CFG_STRUC;\n#endif\n\n#endif /*__RAL_OMAC_USB_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_omac.h\n\n\tAbstract:\n\tRalink Wireless Chip RAL MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_OMAC_H__\n#define __RAL_OMAC_H__\n\n#include \"rtmp_type.h\"\n\n#include \"mac_ral/omac/ral_omac_txwi.h\"\n#include \"mac_ral/omac/ral_omac_rxwi.h\"\n\n/*\n\tTXINFO\n*/\n\n/*\n\tTXINFO fields defintion:\n\t\n\tUSBDMATxPktLen[b0~b14]:\n\t\tTotal bytes of all sub-frame. ONLY for USB bulk Aggregation\n\tIPOffset[b15~b18]:\n\t\tStart byte of IP packet. The base address is from TXINFO.\n\t\t0: header will be parsed by hardware.\n\t\tThis field is like backdoor.\n\t\tFor AMSDU, this field is useless\n\n\tTCPOffset[b19~b23]:\n\t\tStart byte of TCP packet from IP packet The base address is IP header.\n\t\t0: header will be parsed by hardware.\n\t\tThis field is like backdoor.\n\t\tFor AMSDU, this field is useless\n\n\tWIV[b24]:\n\t\tWireless Info Valid. \n\t\t1: if Driver already fill WI\n\t\t0: if DMA needs to copy WI to correctposition\n\n\tQSEL[b25~b26]:\n\t\tSelect on-chip FIFO ID for 2nd-stage output scheduler.\n\t\t0:MGMT, 1:HCCA 2:EDCA\n\n\tSwUseLastRound[b27]:\n\t\tSoftware used for USB-based chipset, reserved for other interfaces.\n\n\tuso[b28]:\n\t\tUDP checksum enable. \n\t\t1: indicate this packet needs to do UDP checksum\n\n\tcso[b29]:\n\t\tChecksum offload. \n\t\t1: indicate this packet needs to do checksum\n\n\tUSBDMANextVLD[b30]:\n\t\tUsed for USB-based chipset, reserved for other interfaces.\n\t\tUsed ONLY in USB bulk Aggregation, host driver info DMA current \n\t\tframe is not he last frame in current Tx queue\n\n\tUSBDMATxburst[b31]:\n\t\tforce DMA transmit frame from current selected endpoint\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct _TXINFO_OMAC {\n\tUINT32 USBDMATxburst:1;\n\tUINT32 USBDMANextVLD:1;\n\tUINT32 cso:1;\n\tUINT32 uso:1;\n#ifdef USB_BULK_BUF_ALIGMENT\n\tUINT32 bFragLasAlignmentsectiontRound:1;\n#else\n\tUINT32 SwUseLastRound:1;\n#endif /* USB_BULK_BUF_ALIGMENT */\n\tUINT32 QSEL:2;\n\tUINT32 WIV:1;\n\tUINT32 TCPOffset:5;\n\tUINT32 IPOffset:4;\n\tUINT32 USBDMATxPktLen:15;\n}TXINFO_OMAC;\n#else\ntypedef\tstruct _TXINFO_OMAC {\n\tUINT32 USBDMATxPktLen:15;\n\tUINT32 IPOffset:4;\n\tUINT32 TCPOffset:5;\n\tUINT32 WIV:1;\n\tUINT32 QSEL:2;\n#ifdef USB_BULK_BUF_ALIGMENT\n\tUINT32 bFragLasAlignmentsectiontRound:1;\n#else\n\tUINT32 SwUseLastRound:1;\n#endif /* USB_BULK_BUF_ALIGMENT */\n\tUINT32 uso:1;\n\tUINT32 cso:1;\n\tUINT32 USBDMANextVLD:1;\n\tUINT32 USBDMATxburst:1;\n}TXINFO_OMAC;\n#endif /* RT_BIG_ENDIAN */\n\n\n#define TxInfoWIV\t\t\ttxinfo_omac.WIV\n#define TxInfoQSEL\t\t\ttxinfo_omac.QSEL\n#define TxInfoPktLen\t\t\ttxinfo_omac.USBDMATxPktLen\n#define TxInfoSwLstRnd\t\ttxinfo_omac.SwUseLastRound\n#define TxInfoUDMATxburst\ttxinfo_omac.USBDMATxburst\n#define TxInfoUDMANextVld\ttxinfo_omac.USBDMANextVLD\n#define TxInfoIPOffset\t\ttxinfo_omac.IPOffset\n#define TxInfoTCPOffset\t\ttxinfo_omac.TCPOffset\n#define TxInfoCSO\t\t\ttxinfo_omac.cso\n#define TxInfoUSO\t\t\ttxinfo_omac.uso\n\n\n\n\n/* ================================================================================= */\n/* Register format */\n/* ================================================================================= */\n\n#define GPIO_CTRL_CFG\t0x0228\n#define MCU_CMD_CFG\t0x022c\n\n\n#define PAIRWISE_KEY_TABLE_BASE     0x4000      /* 32-byte * 256-entry =  -byte */\n#define HW_KEY_ENTRY_SIZE           0x20\n\n#define PAIRWISE_IVEIV_TABLE_BASE     0x6000      /* 8-byte * 256-entry =  -byte */\n#define MAC_IVEIV_TABLE_BASE     0x6000      /* 8-byte * 256-entry =  -byte */\n#define HW_IVEIV_ENTRY_SIZE   8\n\n#define MAC_WCID_ATTRIBUTE_BASE     0x6800      /* 4-byte * 256-entry =  -byte */\n#define HW_WCID_ATTRI_SIZE   4\n\n#define SHARED_KEY_TABLE_BASE       0x6c00      /* 32-byte * 16-entry = 512-byte */\n#define SHARED_KEY_MODE_BASE       0x7000      /* 32-byte * 16-entry = 512-byte */\n\n#define HW_SHARED_KEY_MODE_SIZE   4\n#define SHAREDKEYTABLE\t\t\t0\n#define PAIRWISEKEYTABLE\t\t\t1\n\n/* This resgiser is ONLY be supported for RT3883 or later.\n   It conflicted with BCN#0 offset of previous chipset. */\n#define WAPI_PN_TABLE_BASE\t\t0x7800\t\t\n#define WAPI_PN_ENTRY_SIZE   \t\t8\n\n#endif /* __RAL_OMAC_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac_pbf.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_omac_pbf.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_OMAC_PBF_H__\n#define __RAL_OMAC_PBF_H__\n\n\n#include \"rtmp_type.h\"\n\n/* ================================================================================= */\n/* Register format  for PBF                                                                                                                                                     */\n/* ================================================================================= */\n\n\n/* Most are for debug. Driver doesn't touch PBF register. */\n#define PBF_SYS_CTRL \t 0x0400\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _PBF_SYS_CTRL_STRUC {\n\tstruct {\n\t\tUINT32 Reserved5:12; /* Reserved */\n\t\tUINT32 SHR_MSEL:1; /* Shared memory access selection */\n\t\tUINT32 PBF_MSEL:2; /* Packet buffer memory access selection */\n\t\tUINT32 HST_PM_SEL:1; /* The write selection of the host program RAM */\n\t\tUINT32 Reserved4:1; /* Reserved */\n\t\tUINT32 CAP_MODE:1; /* Packet buffer capture mode */\n\t\tUINT32 Reserved3:1; /* Reserved */\n\t\tUINT32 CLK_SEL:1; /* MAC/PBF clock source selection */\n\t\tUINT32 PBF_CLK_EN:1; /* PBF clock enable */\n\t\tUINT32 MAC_CLK_EN:1; /* MAC clock enable */\n\t\tUINT32 DMA_CLK_EN:1; /* DMA clock enable */\n\t\tUINT32 Reserved2:1; /* Reserved */\n\t\tUINT32 MCU_READY:1; /* MCU ready */\n\t\tUINT32 Reserved1:2; /* Reserved */\n\t\tUINT32 ASY_RESET:1; /* ASYNC interface reset */\n\t\tUINT32 PBF_RESET:1; /* PBF hardware reset */\n\t\tUINT32 MAC_RESET:1; /* MAC hardware reset */\n\t\tUINT32 DMA_RESET:1; /* DMA hardware reset */\n\t\tUINT32 MCU_RESET:1; /* MCU hardware reset */\n\t} field;\n\tUINT32 word;\n} PBF_SYS_CTRL_STRUC;\n#else\ntypedef union _PBF_SYS_CTRL_STRUC {\n\tstruct {\n\t\tUINT32 MCU_RESET:1;\n\t\tUINT32 DMA_RESET:1;\n\t\tUINT32 MAC_RESET:1;\n\t\tUINT32 PBF_RESET:1;\n\t\tUINT32 ASY_RESET:1;\n\t\tUINT32 Reserved1:2;\n\t\tUINT32 MCU_READY:1;\n\t\tUINT32 Reserved2:1;\n\t\tUINT32 DMA_CLK_EN:1;\n\t\tUINT32 MAC_CLK_EN:1;\n\t\tUINT32 PBF_CLK_EN:1;\n\t\tUINT32 CLK_SEL:1;\n\t\tUINT32 Reserved3:1;\n\t\tUINT32 CAP_MODE:1;\n\t\tUINT32 Reserved4:1;\n\t\tUINT32 HST_PM_SEL:1;\n\t\tUINT32 PBF_MSEL:2;\n\t\tUINT32 SHR_MSEL:1;\n\t\tUINT32 Reserved5:12;\n\t}field;\n\tUINT32 word;\n} PBF_SYS_CTRL_STRUC;\n#endif\n\n\n#define PBF_CFG\t\t\t0x0408\n#define PBF_MAX_PCNT\t0x040C\n#define PBF_CAP_CTRL\t0x0440\n\n#define BCN_OFFSET0\t\t0x042C\n#define BCN_OFFSET1\t\t0x0430\n\n#endif /* __RAL_OMAC_PBF_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac_pci.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tral_omac_pci.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RAL_OMAC_PCI_H__\n#define __RAL_OMAC_PCI_H__\n\n\n/* INT_SOURCE_CSR: Interrupt source register. Write one to clear corresponding bit */\n#define INT_SOURCE_CSR\t\t0x200\n\n#define RxINT\t\t\t\t0x00000005\t/* Delayed Rx or indivi rx */\n#define TxDataInt\t\t\t0x000000fa\t/* Delayed Tx or indivi tx */\n#define TxMgmtInt\t\t\t0x00000102\t/* Delayed Tx or indivi tx */\n#define TxCoherent\t\t\t0x00020000\t/* tx coherent */\n#define RxCoherent\t\t\t0x00010000\t/* rx coherent */\n#define TxRxCoherent\t\t\t0x00000400\t/* tx rx coherent */\n#define McuCommand\t\t\t0x00000200\t/* mcu */\n#define PreTBTTInt\t\t\t0x00001000\t/* Pre-TBTT interrupt */\n#define TBTTInt\t\t\t\t0x00000800\t\t/* TBTT interrupt */\n#define GPTimeOutInt\t\t\t0x00008000\t\t/* GPtimeout interrupt */\n#define AutoWakeupInt\t\t0x00004000\t\t/* AutoWakeupInt interrupt */\n#define FifoStaFullInt\t\t\t0x00002000\t/*  fifo statistics full interrupt */\n\n\n\n#define RT2860_INT_RX_DLY\t\t\t\t(1<<0)\t\t/* bit 0 */\n#define RT2860_INT_TX_DLY\t\t\t\t(1<<1)\t\t/* bit 1 */\n#define RT2860_INT_RX_DONE\t\t\t\t(1<<2)\t\t/* bit 2 */\n#define RT2860_INT_AC0_DMA_DONE\t\t\t(1<<3)\t\t/* bit 3 */\n#define RT2860_INT_AC1_DMA_DONE\t\t\t(1<<4)\t\t/* bit 4 */\n#define RT2860_INT_AC2_DMA_DONE\t\t\t(1<<5)\t\t/* bit 5 */\n#define RT2860_INT_AC3_DMA_DONE\t\t\t(1<<6)\t\t/* bit 6 */\n#define RT2860_INT_HCCA_DMA_DONE\t\t(1<<7)\t\t/* bit 7 */\n#define RT2860_INT_MGMT_DONE\t\t\t(1<<8)\t\t/* bit 8 */\n#ifdef CARRIER_DETECTION_SUPPORT\n#define RT2860_INT_TONE_RADAR\t\t\t(1<<20)\t\t/* bit 20 */\n#endif /* CARRIER_DETECTION_SUPPORT*/\n\n#define INT_RX\t\t\tRT2860_INT_RX_DONE\n\n#define INT_AC0_DLY\t\t(RT2860_INT_AC0_DMA_DONE) /*| RT2860_INT_TX_DLY) */\n#define INT_AC1_DLY\t\t(RT2860_INT_AC1_DMA_DONE) /*| RT2860_INT_TX_DLY) */\n#define INT_AC2_DLY\t\t(RT2860_INT_AC2_DMA_DONE) /*| RT2860_INT_TX_DLY) */\n#define INT_AC3_DLY\t\t(RT2860_INT_AC3_DMA_DONE) /*| RT2860_INT_TX_DLY) */\n#define INT_HCCA_DLY \t(RT2860_INT_HCCA_DMA_DONE) /*| RT2860_INT_TX_DLY) */\n#define INT_MGMT_DLY\tRT2860_INT_MGMT_DONE\n#ifdef CARRIER_DETECTION_SUPPORT\n#define INT_TONE_RADAR\t(RT2860_INT_TONE_RADAR)\n#endif /* CARRIER_DETECTION_SUPPORT*/\n\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#define DELAYINTMASK\t\t0x0013fffb\n#define INTMASK\t\t\t\t0x0013fffb\n#define IndMask\t\t\t\t0x0013fffc\n#define RadarInt\t\t\t0x00100000\n#else\n#define DELAYINTMASK\t\t0x0003fffb\n#define INTMASK\t\t\t\t0x0003fffb\n#define IndMask\t\t\t\t0x0003fffc\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _INT_SOURCE_CSR_STRUC {\n\tstruct {\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\tUINT32\t\t\t:11;\n\t\tUINT32\t\t\tRadarINT:1;\n\t\tUINT32       \trsv:2;\n#else /* original source code */\n\t\tUINT32       \t:14;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\tUINT32       \tTxCoherent:1;\n\t\tUINT32       \tRxCoherent:1;\n\t\tUINT32       \tGPTimer:1;\n\t\tUINT32       \tAutoWakeup:1;/*bit14 */\n\t\tUINT32       \tTXFifoStatusInt:1;/*FIFO Statistics is full, sw should read 0x171c */\n\t\tUINT32       \tPreTBTT:1;\n\t\tUINT32       \tTBTTInt:1;\n\t\tUINT32       \tRxTxCoherent:1;\n\t\tUINT32       \tMCUCommandINT:1;\n\t\tUINT32       \tMgmtDmaDone:1;\n\t\tUINT32       \tHccaDmaDone:1;\n\t\tUINT32       \tAc3DmaDone:1;\n\t\tUINT32       \tAc2DmaDone:1;\n\t\tUINT32       \tAc1DmaDone:1;\n\t\tUINT32\t\tAc0DmaDone:1;\n\t\tUINT32\t\tRxDone:1;\n\t\tUINT32\t\tTxDelayINT:1;\t/*delayed interrupt, not interrupt until several int or time limit hit */\n\t\tUINT32\t\tRxDelayINT:1; /*dealyed interrupt */\n\t}field;\n\tUINT32\t\t\tword;\n}\tINT_SOURCE_CSR_STRUC;\n#else\ntypedef\tunion _INT_SOURCE_CSR_STRUC {\n\tstruct\t{\n\t\tUINT32\t\tRxDelayINT:1;\n\t\tUINT32\t\tTxDelayINT:1;\n\t\tUINT32\t\tRxDone:1;\n\t\tUINT32\t\tAc0DmaDone:1;/*4 */\n\t\tUINT32       \tAc1DmaDone:1;\n\t\tUINT32       \tAc2DmaDone:1;\n\t\tUINT32       \tAc3DmaDone:1;\n\t\tUINT32       \tHccaDmaDone:1; /* bit7 */\n\t\tUINT32       \tMgmtDmaDone:1;\n\t\tUINT32       \tMCUCommandINT:1;/*bit 9 */\n\t\tUINT32       \tRxTxCoherent:1;\n\t\tUINT32       \tTBTTInt:1;\n\t\tUINT32       \tPreTBTT:1;\n\t\tUINT32       \tTXFifoStatusInt:1;/*FIFO Statistics is full, sw should read 0x171c */\n\t\tUINT32       \tAutoWakeup:1;/*bit14 */\n\t\tUINT32       \tGPTimer:1;\n\t\tUINT32       \tRxCoherent:1;/*bit16 */\n\t\tUINT32       \tTxCoherent:1;\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\tUINT32       \trsv:2;\n\t\tUINT32\t\t\tRadarINT:1;\n\t\tUINT32\t\t\t:11;\n#else\n\t\tUINT32       \t:14;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t}\tfield;\n\tUINT32\t\t\tword;\n} INT_SOURCE_CSR_STRUC;\n#endif\n\n\n/* INT_MASK_CSR:   Interrupt MASK register.   1: the interrupt is mask OFF */\n#define INT_MASK_CSR        0x204\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _INT_MASK_CSR_STRUC {\n\tstruct\t{\n\t\tUINT32       \tTxCoherent:1;\n\t\tUINT32       \tRxCoherent:1;\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\tUINT32\t\t\t:9;\n\t\tUINT32\t\t\tRadarINT:1;\n\t\tUINT32       \trsv:10;\n#else\n\t\tUINT32       \t:20;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\tUINT32       \tMCUCommandINT:1;\n\t\tUINT32       \tMgmtDmaDone:1;\n\t\tUINT32       \tHccaDmaDone:1;\n\t\tUINT32       \tAc3DmaDone:1;\n\t\tUINT32       \tAc2DmaDone:1;\n\t\tUINT32       \tAc1DmaDone:1;\n\t\tUINT32\t\tAc0DmaDone:1;\n\t\tUINT32\t\tRxDone:1;\n\t\tUINT32\t\tTxDelay:1;\n\t\tUINT32\t\tRXDelay_INT_MSK:1;\n\t}\tfield;\n\tUINT32\t\t\tword;\n}INT_MASK_CSR_STRUC, *PINT_MASK_CSR_STRUC;\n#else\ntypedef\tunion _INT_MASK_CSR_STRUC {\n\tstruct {\n\t\tUINT32\t\tRXDelay_INT_MSK:1;\n\t\tUINT32\t\tTxDelay:1;\n\t\tUINT32\t\tRxDone:1;\n\t\tUINT32\t\tAc0DmaDone:1;\n\t\tUINT32       \tAc1DmaDone:1;\n\t\tUINT32       \tAc2DmaDone:1;\n\t\tUINT32       \tAc3DmaDone:1;\n\t\tUINT32       \tHccaDmaDone:1;\n\t\tUINT32       \tMgmtDmaDone:1;\n\t\tUINT32       \tMCUCommandINT:1;\n#ifdef CARRIER_DETECTION_SUPPORT\n\t\tUINT32       \trsv:10;\n\t\tUINT32\t\t\tRadarINT:1;\n\t\tUINT32\t\t\t:9;\n#else\n\t\tUINT32       \t:20;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\tUINT32       \tRxCoherent:1;\n\t\tUINT32       \tTxCoherent:1;\n\t}\tfield;\n\tUINT32\t\t\tword;\n} INT_MASK_CSR_STRUC, *PINT_MASK_CSR_STRUC;\n#endif\n\n\n#define RINGREG_DIFF\t\t\t0x10\n#define TX_BASE_PTR0     0x0230\t/*AC_BK base address */\n#define TX_MAX_CNT0      0x0234\n#define TX_CTX_IDX0       0x0238\n#define TX_DTX_IDX0      0x023c\n#define TX_BASE_PTR1     0x0240 \t/*AC_BE base address */\n#define TX_MAX_CNT1      0x0244\n#define TX_CTX_IDX1       0x0248\n#define TX_DTX_IDX1      0x024c\n#define TX_BASE_PTR2     0x0250 \t/*AC_VI base address */\n#define TX_MAX_CNT2      0x0254\n#define TX_CTX_IDX2       0x0258\n#define TX_DTX_IDX2      0x025c\n#define TX_BASE_PTR3     0x0260 \t/*AC_VO base address */\n#define TX_MAX_CNT3      0x0264\n#define TX_CTX_IDX3       0x0268\n#define TX_DTX_IDX3      0x026c\n#define TX_BASE_PTR4     0x0270 \t/*HCCA base address */\n#define TX_MAX_CNT4      0x0274\n#define TX_CTX_IDX4       0x0278\n#define TX_DTX_IDX4      0x027c\n#define TX_BASE_PTR5     0x0280 \t/*MGMT base address */\n#define  TX_MAX_CNT5     0x0284\n#define TX_CTX_IDX5       0x0288\n#define TX_DTX_IDX5      0x028c\n#define TX_MGMTMAX_CNT      TX_MAX_CNT5\n#define TX_MGMTCTX_IDX       TX_CTX_IDX5\n#define TX_MGMTDTX_IDX      TX_DTX_IDX5\n#define RX_BASE_PTR     0x0290 \t/*RX base address */\n#define RX_MAX_CNT      0x0294\n#define RX_CRX_IDX       0x0298\n#define RX_DRX_IDX      0x029c\n\n\n#define US_CYC_CNT      0x02a4\n#ifdef BIG_ENDIAN\ntypedef\tunion _US_CYC_CNT_STRUC {\n\tstruct {\n\t    UINT32  rsv2:7;\n\t    UINT32  TestEn:1;\n\t    UINT32  TestSel:8;\n\t    UINT32  rsv1:7;\n\t    UINT32  MiscModeEn:1;\n\t    UINT32  UsCycCnt:8;\n\t} field;\n\tUINT32 word;\n} US_CYC_CNT_STRUC;\n#else\ntypedef\tunion _US_CYC_CNT_STRUC {\n\tstruct {\n\t\tUINT32  UsCycCnt:8;\n\t\tUINT32  MiscModeEn:1;\n\t\tUINT32  rsv1:7;\n\t\tUINT32  TestSel:8;\n\t\tUINT32  TestEn:1;\n\t\tUINT32  rsv2:7;\n\t} field;\n\tUINT32 word;\n} US_CYC_CNT_STRUC;\n#endif\n\n\n#endif /*__RAL_OMAC_PCI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac_rf_ctrl.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_omac_rf_ctrl.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_OMAC_RF_CTRL_H__\n#define __RAL_OMAC_RF_CTRL_H__\n\n\n\n/* ================================================================================= */\n/* Register format  for RFCTRL                                                       */\n/* ================================================================================= */\n\n#define OSC_CTRL\t\t0x5a4\n#define PCIE_PHY_TX_ATTENUATION_CTRL\t\t0x05C8\n#define INTERNAL_1\t\t0x05C8\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _INTERNAL_1_STRUCT\n{\n\tstruct\n\t{\n\t\tUINT32 Reserve1:10;\n\t\tUINT32 CSO_RX_IPV6_CHKSUM_EN:1;\n\t\tUINT32 CSO_TX_IPV6_CHKSUM_EN:1;\n\t\tUINT32 CSO_HW_PARSE_TCP:1;\n\t\tUINT32 CSO_HW_PARSE_IP:1;\n\t\tUINT32 CSO_RX_CHKSUM_EN:1;\n\t\tUINT32 CSO_TX_CHKSUM_EN:1;\n\t\tUINT32 CSO_TIMEOUT_VALUE:4;\n\t\tUINT32 PCIE_PHY_TX_ATTEN_EN:1;\n\t\tUINT32 PCIE_PHY_TX_ATTEN_VALUE:3;\n\t\tUINT32 Reserve2:7;\n\t\tUINT32 RF_ISOLATION_ENABLE:1;\n\t} field;\n\n\tUINT32 word;\n} INTERNAL_1_STRUCT, *PINTERNAL_1_STRUCT;\n#else\ntypedef union _TX_ATTENUATION_CTRL_STRUC {\n\tstruct\n\t{\n\t\tUINT32 RF_ISOLATION_ENABLE:1;\n\t\tUINT32 Reserve2:7;\n\t\tUINT32 PCIE_PHY_TX_ATTEN_VALUE:3;\n\t\tUINT32 PCIE_PHY_TX_ATTEN_EN:1;\n\t\tUINT32 CSO_TIMEOUT_VALUE:4;\n\t\tUINT32 CSO_TX_CHKSUM_EN:1;\n\t\tUINT32 CSO_RX_CHKSUM_EN:1;\n\t\tUINT32 CSO_HW_PARSE_IP:1;\n\t\tUINT32 CSO_HW_PARSE_TCP:1;\n\t\tUINT32 CSO_TX_IPV6_CHKSUM_EN:1;\n\t\tUINT32 CSO_RX_IPV6_CHKSUM_EN:1;\n\t\tUINT32 Reserve1:10;\t\t\n\t} field;\n\t\n\tUINT32 word;\n} INTERNAL_1_STRUCT, *PINTERNAL_1_STRUCT;\n#endif\n\n#define LDO_CFG0 \t\t\t\t0x05d4\n#define GPIO_SWITCH\t\t\t\t0x05dc\n\n#define DEBUG_INDEX\t\t\t\t0x05e8\t\n\n\n#endif /* __RAL_OMAC_RF_CTRL_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac_rxwi.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_omac_rxwi.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_OMAC_RXWI_H__\n#define __RAL_OMAC_RXWI_H__\n\n#include \"rtmp_type.h\"\n\n/*\n\tRXWI wireless information format, in PBF. invisible in driver.\n*/\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _RXWI_OMAC{\n\t/* Word 0 */\n\tUINT32\t\ttid:4;\n\tUINT32\t\tMPDUtotalByteCnt:12;\n\tUINT32\t\tUDF:3;\n\tUINT32\t\tbss_idx:3;\n\tUINT32\t\tkey_idx:2;\n\tUINT32\t\twcid:8;\n\t\n\t/* Word 1 */\n\tUINT32\t\tphy_mode:2;              /* 1: this RX frame is unicast to me */\n\tUINT32\t\tiTxBF:1; /* iTxBF enable */\n\tUINT32\t\tSounding:1; /* Sounding enable */\n\tUINT32\t\teTxBF:1; /* eTxBF enable */\n\tUINT32\t\tstbc:2;\n\tUINT32\t\tsgi:1;\n\tUINT32\t\tbw:1;\n\tUINT32\t\tmcs:7;\n\tUINT32\t\tSEQUENCE:12;\n\tUINT32\t\tFRAG:4;\n\t\n\t/* Word 2 */\n\tUINT32\t\trsv1:8;\n\tUINT32\t\tRSSI2:8;\n\tUINT32\t\tRSSI1:8;\n\tUINT32\t\tRSSI0:8;\n\t\n\t/* Word 3 */\n\tUINT32\t\tFOFFSET:8;\n\tUINT32\t\tSNR2:8;\n\tUINT32\t\tSNR1:8;\n\tUINT32\t\tSNR0:8;\n\t\n\tUINT32\t\trsv3;\n\n#if defined(RT5592) || defined(MT7601)\n\t/* Word 5 */\n\t/* For Exper Antenna */\n\tUINT32\t\trsv4:24;\n\tUINT32\t\tEANT_ID:8;\n#endif /* RT5592 */\n}\tRXWI_OMAC, *PRXWI_OMAC;\n#else\ntypedef\tstruct GNU_PACKED _RXWI_OMAC{\n\t/* Word\t0 */\n\tUINT32\t\twcid:8;\n\tUINT32\t\tkey_idx:2;\n\tUINT32\t\tbss_idx:3;\n\tUINT32\t\tUDF:3;\n\tUINT32\t\tMPDUtotalByteCnt:12;\n\tUINT32\t\ttid:4;\n\n\t/* Word\t1 */\n\tUINT32\t\tFRAG:4;\n\tUINT32\t\tSEQUENCE:12;\n\tUINT32\t\tmcs:7;\n\tUINT32\t\tbw:1;\n\tUINT32\t\tsgi:1;\n\tUINT32\t\tstbc:2;\n\tUINT32\t\teTxBF:1; /* eTxBF enable */\n\tUINT32\t\tSounding:1; /* Sounding enable */\n\tUINT32\t\tiTxBF:1; /* iTxBF enable */\n\tUINT32\t\tphy_mode:2;              /* 1: this RX frame is unicast to me */\n\n\t/*Word2 */\n\tUINT32\t\tRSSI0:8;\n\tUINT32\t\tRSSI1:8;\n\tUINT32\t\tRSSI2:8;\n\tUINT32\t\trsv1:8;\n\n\t/*Word3 */\n\tUINT32\t\tSNR0:8;\n\tUINT32\t\tSNR1:8;\n\tUINT32\t\tSNR2:8;\n\tUINT32\t\tFOFFSET:8;\n\n\tUINT32\t\trsv3;\n\n#if defined(RT5592) || defined(MT7601)\n\t/* Word 5 */\n\t/* For Exper Antenna */\n\tUINT32      EANT_ID:8;\n\tUINT32      rsv4:24;\n#endif /* RT5592 */\n}\tRXWI_OMAC, *PRXWI_OMAC;\n#endif\n\n\n#define RxWIMPDUByteCnt\tRXWI_O.MPDUtotalByteCnt\n#define RxWIWirelessCliID\tRXWI_O.wcid\n#define RxWIKeyIndex\t\tRXWI_O.key_idx\n#define RxWIMCS\t\t\t\tRXWI_O.mcs\n#define RxWIBW\t\t\t\tRXWI_O.bw\n#define RxWISGI\t\t\t\tRXWI_O.sgi\n#define RxWIBSSID\t\t\tRXWI_O.bss_idx\n#define RxWIPhyMode\t\tRXWI_O.phy_mode\n#define RxWISTBC\t\t\tRXWI_O.stbc\n#define RxWITID\t\t\t\tRXWI_O.tid\n#define RxWIRSSI0\t\t\tRXWI_O.RSSI0\n#define RxWIRSSI1\t\t\tRXWI_O.RSSI1\n#define RxWIRSSI2\t\t\tRXWI_O.RSSI2\n#define RxWISNR0\t\t\tRXWI_O.SNR0\n#define RxWISNR1\t\t\tRXWI_O.SNR1\n#define RxWISNR2\t\t\tRXWI_O.SNR2\n#define RxWIFOFFSET\t\t\tRXWI_O.FOFFSET\n\n\n\n#endif /* __RAL_OMAC_RXWI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac_txwi.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tral_omac_txwi.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RAL_OMAC_TXWI_H__\n#define __RAL_OMAC_TXWI_H__\n\n\n#include \"rtmp_type.h\"\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _TXWI_OMAC {\n\t/* Word 0 */\n\tUINT32\t\tPHYMODE:2;\n\tUINT32\t\tiTxBF:1; /* iTxBF enable */\n\tUINT32\t\tSounding:1; /* Sounding enable */\n\tUINT32\t\teTxBF:1; /* eTxBF enable */\n\tUINT32\t\tSTBC:2;\t/*channel bandwidth 20MHz or 40 MHz */\n\tUINT32\t\tShortGI:1;\n\tUINT32\t\tBW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\tUINT32\t\tMCS:7;\n\t\n\tUINT32\t\trsv:1;\n\tUINT32\t\tTXRPT:1;\n\tUINT32\t\tAutofallback:1; /* TX rate auto fallback disable */\n\tUINT32\t\tNDPSndBW:1; /* NDP sounding BW */\n\tUINT32\t\tNDPSndRate:2; /* 0 : MCS0, 1: MCS8, 2: MCS16, 3: reserved */\n\tUINT32\t\ttxop:2;\n\tUINT32\t\tMpduDensity:3;\n\tUINT32\t\tAMPDU:1;\n\t\n\tUINT32\t\tTS:1;\n\tUINT32\t\tCFACK:1;\n\tUINT32\t\tMIMOps:1;\t/* the remote peer is in dynamic MIMO-PS mode */\n\tUINT32\t\tFRAG:1;\t\t/* 1 to inform TKIP engine this is a fragment. */\n\t/* Word 1 */\n\tUINT32\t\tPacketId:4;\n\tUINT32\t\tMPDUtotalByteCnt:12;\n\tUINT32\t\twcid:8;\n\tUINT32\t\tBAWinSize:6;\n\tUINT32\t\tNSEQ:1;\n\tUINT32\t\tACK:1;\n\t/* Word 2 */\n\tUINT32\t\tIV;\n\t/* Word 3 */\n\tUINT32\t\tEIV;\n\n\t/* Word 4 */\n\t/* For Expert Antenna */\n\tUINT32\t\tReserved:11;\n\tUINT32\t\tCCP:1;\n\tUINT32\t\tTxPwrAdj:4;\n\tUINT32\t\tTxStreamMode:8;\n\tUINT32\t\tEncodedAntID:8;\n}\tTXWI_OMAC, *PTXWI_OMAC;\n#else\ntypedef\tstruct GNU_PACKED _TXWI_OMAC {\n\t/* Word\t0 */\n\t/* ex: 00 03 00 40 means txop = 3, PHYMODE = 1 */\n\tUINT32\t\tFRAG:1;\t\t/* 1 to inform TKIP engine this is a fragment. */\n\tUINT32\t\tMIMOps:1;\t/* the remote peer is in dynamic MIMO-PS mode */\n\tUINT32\t\tCFACK:1;\n\tUINT32\t\tTS:1;\n\t\t\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tMpduDensity:3;\n\tUINT32\t\ttxop:2;\t/*FOR \"THIS\" frame. 0:HT TXOP rule , 1:PIFS TX ,2:Backoff, 3:sifs only when previous frame exchange is successful. */\n\tUINT32\t\tNDPSndRate:2; /* 0 : MCS0, 1: MCS8, 2: MCS16, 3: reserved */\n\tUINT32\t\tNDPSndBW:1; /* NDP sounding BW */\n\tUINT32\t\tAutofallback:1; /* TX rate auto fallback disable */\n\tUINT32\t\tTXRPT:1;\n\tUINT32\t\trsv:1;\n\t\n\tUINT32\t\tMCS:7;\n\tUINT32\t\tBW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\tUINT32\t\tShortGI:1;\n\tUINT32\t\tSTBC:2;\t/* 1: STBC support MCS =0-7,   2,3 : RESERVE */\n\tUINT32\t\teTxBF:1; /* eTxBF enable */\n\tUINT32\t\tSounding:1; /* Sounding enable */\n\tUINT32\t\tiTxBF:1; /* iTxBF enable */\n\tUINT32\t\tPHYMODE:2;  \n\t/* Word1 */\n\t/* ex:  1c ff 38 00 means ACK=0, BAWinSize=7, MPDUtotalByteCnt = 0x38 */\n\tUINT32\t\tACK:1;\n\tUINT32\t\tNSEQ:1;\n\tUINT32\t\tBAWinSize:6;\n\tUINT32\t\twcid:8;\n\tUINT32\t\tMPDUtotalByteCnt:12;\n\tUINT32\t\tPacketId:4;\n\t/*Word2 */\n\tUINT32\t\tIV;\n\t/*Word3 */\n\tUINT32\t\tEIV;\n\n}\tTXWI_OMAC, *PTXWI_OMAC;\n#endif\n\n\n#define TxWIMPDUByteCnt\tTXWI_O.MPDUtotalByteCnt\n#define TxWIWirelessCliID\tTXWI_O.wcid\n#define TxWIFRAG\t\t\tTXWI_O.FRAG\n#define TxWICFACK\t\t\tTXWI_O.CFACK\n#define TxWITS\t\t\t\tTXWI_O.TS\n#define TxWIAMPDU\t\t\tTXWI_O.AMPDU\n#define TxWIACK\t\t\t\tTXWI_O.ACK\n#define TxWITXOP\t\t\tTXWI_O.txop\n#define TxWINSEQ\t\t\tTXWI_O.NSEQ\n#define TxWIBAWinSize\t\tTXWI_O.BAWinSize\n#define TxWIShortGI\t\t\tTXWI_O.ShortGI\n#define TxWISTBC\t\t\tTXWI_O.STBC\n#define TxWIBW\t\t\t\tTXWI_O.BW\n#define TxWIMCS\t\t\t\tTXWI_O.MCS\n#define TxWIPHYMODE\t\tTXWI_O.PHYMODE\n#define TxWIMIMOps\t\t\tTXWI_O.MIMOps\n#define TxWIMpduDensity\t\tTXWI_O.MpduDensity\n\n#endif /* __RAL_OMAC_TXWI_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/omac/ral_omac_usb.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tral_omac_usb.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RAL_OMAC_USB_H__\n#define __RAL_OMAC_USB_H__\n\n\n#define USB_DMA_CFG 0x02a0\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _USB_DMA_CFG_STRUC {\n\tstruct {\n\t\tUINT32 TxBusy:1;   \t/*USB DMA TX FSM busy. debug only */\n\t\tUINT32 RxBusy:1;        /*USB DMA RX FSM busy. debug only */\n\t\tUINT32 EpoutValid:6;        /*OUT endpoint data valid. debug only */\n\t\tUINT32 TxBulkEn:1;        /*Enable USB DMA Tx */\n\t\tUINT32 RxBulkEn:1;        /*Enable USB DMA Rx */\n\t\tUINT32 RxBulkAggEn:1;        /*Enable Rx Bulk Aggregation */\n\t\tUINT32 TxopHalt:1;        /*Halt TXOP count down when TX buffer is full. */\n\t\tUINT32 TxClear:1;        /*Clear USB DMA TX path */\n\t\tUINT32 rsv:2;        \n\t\tUINT32 phyclear:1;        \t\t/*phy watch dog enable. write 1 */\n\t\tUINT32 RxBulkAggLmt:8;        /*Rx Bulk Aggregation Limit  in unit of 1024 bytes */\n\t\tUINT32 RxBulkAggTOut:8;        /*Rx Bulk Aggregation TimeOut  in unit of 33ns */\n\t} field;\n\tUINT32 word;\n} USB_DMA_CFG_STRUC, *PUSB_DMA_CFG_STRUC;\n#else\ntypedef\tunion _USB_DMA_CFG_STRUC {\n\tstruct {\n\t\tUINT32 RxBulkAggTOut:8;        /*Rx Bulk Aggregation TimeOut  in unit of 33ns */\n\t\tUINT32 RxBulkAggLmt:8;        /*Rx Bulk Aggregation Limit  in unit of 256 bytes */\n\t\tUINT32 phyclear:1;        \t\t/*phy watch dog enable. write 1 */\n\t\tUINT32 rsv:2;\n\t\tUINT32 TxClear:1;        /*Clear USB DMA TX path */\n\t\tUINT32 TxopHalt:1;        /*Halt TXOP count down when TX buffer is full. */\n\t\tUINT32 RxBulkAggEn:1;        /*Enable Rx Bulk Aggregation */\n\t\tUINT32 RxBulkEn:1;        /*Enable USB DMA Rx */\n\t\tUINT32 TxBulkEn:1;        /*Enable USB DMA Tx */\n\t\tUINT32 EpoutValid:6;        /*OUT endpoint data valid */\n\t\tUINT32 RxBusy:1;        /*USB DMA RX FSM busy */\n\t\tUINT32 TxBusy:1;   \t/*USB DMA TX FSM busy */\n\t} field;\n\tUINT32 word;\n} USB_DMA_CFG_STRUC, *PUSB_DMA_CFG_STRUC;\n#endif\n\n#endif /*__RAL_OMAC_USB_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/pbf.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tpbf.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __PBF_H__\n#define __PBF_H__\n\n\n#ifdef RLT_MAC\n#include \"mac_ral/nmac/ral_nmac_pbf.h\"\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n#include \"mac_ral/omac/ral_omac_pbf.h\"\n#endif /* RTMP_MAC */\n\n\n/* ================================================================================= */\n/* Register format  for PBF                                                                                                                                                     */\n/* ================================================================================= */\n\n\n#define WPDMA_GLO_CFG \t0x208\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _WPDMA_GLO_CFG_STRUC\t{\n\tstruct\t{\n\t\tUINT32 rx_2b_offset:1;\n\t\tUINT32 clk_gate_dis:1;\n\t\tUINT32 rsv:14;\n\t\tUINT32 HDR_SEG_LEN:8;\n\t\tUINT32 BigEndian:1;\n\t\tUINT32 EnTXWriteBackDDONE:1;\n\t\tUINT32 WPDMABurstSIZE:2;\n\t\tUINT32 RxDMABusy:1;\n\t\tUINT32 EnableRxDMA:1;\n\t\tUINT32 TxDMABusy:1;\n\t\tUINT32 EnableTxDMA:1;\n\t}\tfield;\n\tUINT32 word;\n}WPDMA_GLO_CFG_STRUC, *PWPDMA_GLO_CFG_STRUC;\n#else\ntypedef\tunion _WPDMA_GLO_CFG_STRUC\t{\n\tstruct {\n\t\tUINT32 EnableTxDMA:1;\n\t\tUINT32 TxDMABusy:1;\n\t\tUINT32 EnableRxDMA:1;\n\t\tUINT32 RxDMABusy:1;\n\t\tUINT32 WPDMABurstSIZE:2;\n\t\tUINT32 EnTXWriteBackDDONE:1;\n\t\tUINT32 BigEndian:1;\n\t\tUINT32 HDR_SEG_LEN:8;\n\t\tUINT32 rsv:14;\n\t\tUINT32 clk_gate_dis:1;\n\t\tUINT32 rx_2b_offset:1;\n\t} field;\n\tUINT32 word;\n} WPDMA_GLO_CFG_STRUC, *PWPDMA_GLO_CFG_STRUC;\n#endif\n\n\n#define PBF_CTRL\t\t\t0x0410\n#define MCU_INT_STA\t\t0x0414\n#define MCU_INT_ENA\t0x0418\n#define TXRXQ_PCNT\t\t0x0438\n#define PBF_DBG\t\t\t0x043c\n\n\n#endif /* __PBF_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/rf_ctrl.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trf_ctrl.h\n\n\tAbstract:\n\tRalink wireless chip RF related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RF_CTRL_H__\n#define __RF_CTRL_H__\n\n#ifdef RTMP_MAC\n#include \"mac_ral/omac/ral_omac_rf_ctrl.h\"\n#endif /* RTMP_MAC */\n\n#ifdef RLT_MAC\n\n#endif /* RLT_MAC */\n\n\n/* ================================================================================= */\n/* Register format  for RFCTRL                                                                                                                                               */\n/* ================================================================================= */\n\n#define\tRF_CSR_CFG\t0x500\n\n#ifdef RLT_RF\n\n#define RF_BANK0\t0\n#define RF_BANK1\t1\n#define RF_BANK2\t2\n#define RF_BANK3\t3\n#define RF_BANK4\t4\n#define RF_BANK5\t5\n#define RF_BANK6\t6\n#define RF_BANK7\t7\n#define RF_BANK8\t8\n#define RF_BANK9\t9\n#define RF_BANK10\t10\n#define RF_BANK11\t11\n#define RF_BANK12\t12\n#define RF_BANK13\t13\n#define RF_BANK14\t14\n#define RF_BANK15\t15\n\n/* @!Release\n\tRF_CSR_KICK:1\n\t\t\tWrite - kick RF register read/write\n\t\t\t\t0: do nothing        \n\t\t\t\t1: kick read/write process\n\t\t\tRead - Polling RF register read/write\n\t\t\t\t0: idle                   \n\t\t\t\t1: busy\n\tRF_CSR_RW:1\n\t\t\t0: read  1: write\n\trsv:12\n\tRF_CSR_REG_ID:10\n\t\t\tRF register ID, 0 for R0, 1 for R1 and so on\n\t\t\t\tBits [17:15] 3 bits, indicates the bank number\n\t\t\t\tBits [14:08] 7 bits, indicates the register number\n\n\tRF_CSR_DATA:8\n\t\t\tDATA written to/read from RF\n*/\ntypedef\tunion _RLT_RF_CSR_CFG {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUINT RF_CSR_KICK:1;\n\t\tUINT RF_CSR_WR:1;\n\t\tUINT rsv:12;\n#ifdef MT7601\n\t\tUINT RF_CSR_REG_BANK:4;\n\t\tUINT RF_CSR_REG_ID:6;\n#else\n\t\tUINT RF_CSR_REG_BANK:3;\n\t\tUINT RF_CSR_REG_ID:7;\n#endif /* MT7601 */\n\t\tUINT RF_CSR_DATA:8;\n\t} field;\n#else\n\tstruct {\n\t\tUINT RF_CSR_DATA:8;\n#ifdef MT7601\n\t\tUINT RF_CSR_REG_ID:6;\n\t\tUINT RF_CSR_REG_BANK:4;\n#else\n\t\tUINT RF_CSR_REG_ID:7;\n\t\tUINT RF_CSR_REG_BANK:3;\n#endif /* MT7601 */\n\t\tUINT rsv:12;\n\t\tUINT RF_CSR_WR:1;\n\t\tUINT RF_CSR_KICK:1;\n\t} field;\n#endif /* RT_BIG_ENDIAN */\n\tUINT word;\n}RLT_RF_CSR_CFG;\n#endif /* RLT_RF */\n\n\ntypedef\tunion _RF_CSR_CFG_STRUC {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUINT32\tRsvd1:14;\t\t\t\t/* Reserved */\n\t\tUINT32\tRF_CSR_KICK:1;\t\t\t/* kick RF register read/write */\n\t\tUINT32\tRF_CSR_WR:1;\t\t\t/* 0: read  1: write */\n\t\tUINT32\tTESTCSR_RFACC_REGNUM:8;\t/* RF register ID */\n\t\tUINT32\tRF_CSR_DATA:8;\t\t\t/* DATA */\n\t} field;\n#else\n\tstruct {\n\t\tUINT32\tRF_CSR_DATA:8;\n\t\tUINT32\tTESTCSR_RFACC_REGNUM:8;\n\t\tUINT32\tRF_CSR_WR:1;\n\t\tUINT32\tRF_CSR_KICK:1;\n\t\tUINT32\tRsvd1:14;\n\t} field;\n#endif /* RT_BIG_ENDIAN */\n\tUINT32 word;\n}RF_CSR_CFG_STRUC;\n\n#define RF_BYPASS_0\t\t0x0504\n\n#define RF_SETTING_0\t0x050C\n\n#endif /* __RF_CTRL_H__ */\n\n"
  },
  {
    "path": "src/include/mac_ral/rtmp_mac.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering\tthe source code\tis stricitly prohibited, unless\tthe prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_mac.h\n\n\tAbstract:\n\tRalink Wireless Chip MAC related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef __RTMP_MAC_H__\n#define __RTMP_MAC_H__\n\n\n#ifdef RLT_MAC\n#include \"mac_ral/nmac/ral_nmac.h\"\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n#include \"mac_ral/omac/ral_omac.h\"\n#endif /* RTMP_MAC */\n\n\n/*\n\tTX / RX ring descriptor format\n\n\tTX:\n\t\tPCI/RBUS_Descriptor + TXINFO + TXWI + 802.11\n\n\tRx:\n\t\tPCI/RBUS/USB_Descripotr + (PCI/RBUS RXFCE_INFO) + (PCI/RBUS  RXINFO) + RXWI + 802.11 + (USB RXINFO)\n\t\n*/\n\n/* the first 24-byte in TXD is called TXINFO and will be DMAed to MAC block through TXFIFO. */\n/* MAC block use this TXINFO to control the transmission behavior of this frame. */\n#define FIFO_MGMT\t0\n#define FIFO_HCCA\t1\n#define FIFO_EDCA\t2\n#define FIFO_EDCA2\t3\n\ntypedef\tunion GNU_PACKED _TXWI_STRUC {\n#ifdef RLT_MAC\n\tstruct _TXWI_NMAC TXWI_N;\n#endif /* RLT_MAC */\n#ifdef RTMP_MAC\n\tstruct _TXWI_OMAC TXWI_O;\n#endif /* RTMP_MAC */\n\tUINT32 word;\n}TXWI_STRUC;\n\n\n#define TXINFO_SIZE\t\t\t4\ntypedef union GNU_PACKED _TXINFO_STRUC{\n#ifdef RTMP_MAC\n\tstruct _TXINFO_OMAC txinfo_omac;\n#endif /* RTMP_MAC */\n#ifdef RLT_MAC\n\tstruct _TXINFO_NMAC_PKT txinfo_nmac_pkt;\n\tstruct _TXINFO_NMAC_CMD txinfo_nmac_cmd;\n#endif /* RLT_MAC */\n\tUINT32 word;\n}TXINFO_STRUC;\n\n\n/*\n\tRXWI wireless information format, in PBF. invisible in driver.\n*/\ntypedef\tunion GNU_PACKED _RXWI_STRUC {\n#ifdef RLT_MAC\n#ifdef MT7601\n\tstruct _RXWI_OMAC RXWI_O;\n#else\n\tstruct _RXWI_NMAC RXWI_N;\n#endif /* MT7601 */\n#endif /* RLT_MAC */\n#ifdef RTMP_MAC\n\tstruct _RXWI_OMAC RXWI_O;\n#endif /* RTMP_MAC */\n}RXWI_STRUC;\n\n\n#define RXINFO_SIZE\t\t\t4\n#ifdef RT_BIG_ENDIAN\ntypedef\tstruct GNU_PACKED _RXINFO_STRUC {\n\tUINT32\t\tip_sum_err:1;\t\t/* IP checksum error */\n\tUINT32\t\ttcp_sum_err:1;\t/* TCP checksum error */\n\tUINT32\t\tip_sum_bypass:1;\t\t/* IP checksum bypass(hw does not do checksum) */\n\tUINT32\t\ttcp_sum_bypass:1;\t/* TCP/UDP checksum bypass(hw does not do checksum) */\n#ifdef HDR_TRANS_SUPPORT\n\tUINT32\t\trsv:5;\n\tUINT32\t\tpkt_80211:1;\n#else\n\tUINT32\t\trsv:6;\n#endif /* HDR_TRANS_SUPPORT */\n\tUINT32\t\tpn_len:3;\n\tUINT32\t\twapi_kidx:1;\n\tUINT32\t\tBssIdx3:1;\n\tUINT32\t\tDecrypted:1;\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tL2PAD:1;\n\tUINT32\t\tRSSI:1;\n\tUINT32\t\tHTC:1;\n\tUINT32\t\tAMSDU:1;\t\t/* rx with 802.3 header, not 802.11 header. obsolete. */\n\tUINT32\t\tCipherErr:2;        /* 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid */\n\tUINT32\t\tCrc:1;\t\t\t/* 1: CRC error */\n\tUINT32\t\tMyBss:1;\t\t/* 1: this frame belongs to the same BSSID */\n\tUINT32\t\tBcast:1;\t\t\t/* 1: this is a broadcast frame */\n\tUINT32\t\tMcast:1;\t\t\t/* 1: this is a multicast frame */\n\tUINT32\t\tU2M:1;\t\t\t/* 1: this RX frame is unicast to me */\n\tUINT32\t\tFRAG:1;\n\tUINT32\t\tNULLDATA:1;\n\tUINT32\t\tDATA:1;\n\tUINT32\t\tBA:1;\n}\tRXINFO_STRUC, *PRXINFO_STRUC;\n#else\ntypedef\tstruct GNU_PACKED _RXINFO_STRUC {\n\tUINT32\t\tBA:1;\n\tUINT32\t\tDATA:1;\n\tUINT32\t\tNULLDATA:1;\n\tUINT32\t\tFRAG:1;\n\tUINT32\t\tU2M:1;\n\tUINT32\t\tMcast:1;\n\tUINT32\t\tBcast:1;\n\tUINT32\t\tMyBss:1;\n\tUINT32\t\tCrc:1;\n\tUINT32\t\tCipherErr:2;\n\tUINT32\t\tAMSDU:1;\n\tUINT32\t\tHTC:1;\n\tUINT32\t\tRSSI:1;\n\tUINT32\t\tL2PAD:1;\n\tUINT32\t\tAMPDU:1;\n\tUINT32\t\tDecrypted:1;\n\tUINT32\t\tBssIdx3:1;\n\tUINT32\t\twapi_kidx:1;\n\tUINT32\t\tpn_len:3;\n#ifdef HDR_TRANS_SUPPORT\n\tUINT32\t\tpkt_80211:1;\n\tUINT32\t\trsv:5;\n#else\n\tUINT32\t\trsv:6;\n#endif /* HDR_TRANS_SUPPORT */\n\tUINT32\t\ttcp_sum_bypass:1;\n\tUINT32\t\tip_sum_bypass:1;\n\tUINT32\t\ttcp_sum_err:1;\n\tUINT32\t\tip_sum_err:1;\n}RXINFO_STRUC, *PRXINFO_STRUC;\n#endif\n\n#define TSO_SIZE\t\t0\n\n\n/* ================================================================================= */\n/* Register format */\n/* ================================================================================= */\n\n\n/*\n\tSCH/DMA registers - base address 0x0200\n*/\n#define WMM_AIFSN_CFG   0x0214\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _AIFSN_CSR_STRUC{\n\tstruct {\n\t    UINT32   Aifsn7:4;       /* for AC_VO */\n\t    UINT32   Aifsn6:4;       /* for AC_VI */\n\t    UINT32   Aifsn5:4;       /* for AC_BK */\n\t    UINT32   Aifsn4:4;       /* for AC_BE */\n\t    UINT32   Aifsn3:4;       /* for AC_VO */\n\t    UINT32   Aifsn2:4;       /* for AC_VI */\n\t    UINT32   Aifsn1:4;       /* for AC_BK */\n\t    UINT32   Aifsn0:4;       /* for AC_BE */\n\t}field;\n\tUINT32 word;\n} AIFSN_CSR_STRUC;\n#else\ntypedef union _AIFSN_CSR_STRUC {\n\tstruct {\n\t    UINT32   Aifsn0:4;\n\t    UINT32   Aifsn1:4;\n\t    UINT32   Aifsn2:4;\n\t    UINT32   Aifsn3:4;\n\t    UINT32   Aifsn4:4;\n\t    UINT32   Aifsn5:4;\n\t    UINT32   Aifsn6:4;\n\t    UINT32   Aifsn7:4;\n\t} field;\n\tUINT32 word;\n} AIFSN_CSR_STRUC;\n#endif\n\n/* CWMIN_CSR: CWmin for each EDCA AC */\n#define WMM_CWMIN_CFG   0x0218\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _CWMIN_CSR_STRUC\t{\n\tstruct {\n\t\tUINT32   Cwmin7:4;       /* for AC_VO */\n\t\tUINT32   Cwmin6:4;       /* for AC_VI */\n\t\tUINT32   Cwmin5:4;       /* for AC_BK */\n\t\tUINT32   Cwmin4:4;       /* for AC_BE */\n\t\tUINT32   Cwmin3:4;       /* for AC_VO */\n\t\tUINT32   Cwmin2:4;       /* for AC_VI */\n\t\tUINT32   Cwmin1:4;       /* for AC_BK */\n\t\tUINT32   Cwmin0:4;       /* for AC_BE */\n\t} field;\n\tUINT32 word;\n} CWMIN_CSR_STRUC;\n#else\ntypedef\tunion _CWMIN_CSR_STRUC\t{\n\tstruct {\n\t    UINT32   Cwmin0:4;\n\t    UINT32   Cwmin1:4;\n\t    UINT32   Cwmin2:4;\n\t    UINT32   Cwmin3:4;\n\t    UINT32   Cwmin4:4;\n\t    UINT32   Cwmin5:4;\n\t    UINT32   Cwmin6:4;\n\t    UINT32   Cwmin7:4;\n\t} field;\n\tUINT32 word;\n} CWMIN_CSR_STRUC;\n#endif\n\n\n/* CWMAX_CSR: CWmin for each EDCA AC */\n#define WMM_CWMAX_CFG   0x021c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _CWMAX_CSR_STRUC {\n\tstruct {\n\t\tUINT32   Cwmax7:4;       /* for AC_VO */\n\t\tUINT32   Cwmax6:4;       /* for AC_VI */\n\t\tUINT32   Cwmax5:4;       /* for AC_BK */\n\t\tUINT32   Cwmax4:4;       /* for AC_BE */\n\t\tUINT32   Cwmax3:4;       /* for AC_VO */\n\t\tUINT32   Cwmax2:4;       /* for AC_VI */\n\t\tUINT32   Cwmax1:4;       /* for AC_BK */\n\t\tUINT32   Cwmax0:4;       /* for AC_BE */\n\t} field;\n\tUINT32 word;\n} CWMAX_CSR_STRUC;\n#else\ntypedef\tunion _CWMAX_CSR_STRUC {\n\tstruct {\n\t    UINT32   Cwmax0:4;\n\t    UINT32   Cwmax1:4;\n\t    UINT32   Cwmax2:4;\n\t    UINT32   Cwmax3:4;\n\t    UINT32   Cwmax4:4;\n\t    UINT32   Cwmax5:4;\n\t    UINT32   Cwmax6:4;\n\t    UINT32   Cwmax7:4;\n\t} field;\n\tUINT32 word;\n}\tCWMAX_CSR_STRUC;\n#endif\n\n\n/* AC_TXOP_CSR0: AC_BK/AC_BE TXOP register */\n#define WMM_TXOP0_CFG    0x0220\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _AC_TXOP_CSR0_STRUC {\n\tstruct {\n\t    UINT16  Ac1Txop; /* for AC_BE, in unit of 32us */\n\t    UINT16  Ac0Txop; /* for AC_BK, in unit of 32us */\n\t} field;\n\tUINT32 word;\n} AC_TXOP_CSR0_STRUC;\n#else\ntypedef\tunion _AC_TXOP_CSR0_STRUC {\n\tstruct {\n\t    UINT16  Ac0Txop;\n\t    UINT16  Ac1Txop;\n\t} field;\n\tUINT32 word;\n} AC_TXOP_CSR0_STRUC;\n#endif\n\n\n/* AC_TXOP_CSR1: AC_VO/AC_VI TXOP register */\n#define WMM_TXOP1_CFG    0x0224\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _AC_TXOP_CSR1_STRUC {\n\tstruct {\n\t    UINT16  Ac3Txop; /* for AC_VO, in unit of 32us */\n\t    UINT16  Ac2Txop; /* for AC_VI, in unit of 32us */\n\t} field;\n\tUINT32 word;\n} AC_TXOP_CSR1_STRUC;\n#else\ntypedef\tunion _AC_TXOP_CSR1_STRUC {\n\tstruct {\n\t    UINT16 Ac2Txop;\n\t    UINT16 Ac3Txop;\n\t} field;\n\tUINT32 word;\n} AC_TXOP_CSR1_STRUC;\n#endif\n\n\n#define WMM_TXOP2_CFG 0x0228\n#define WMM_TXOP3_CFG 0x022c\n\n#define WMM_CTRL\t0x0230\n\n\n\n/*================================================================================= */\n/* MAC  registers                                                                                                                                                                 */\n/*================================================================================= */\n/*  4.1 MAC SYSTEM  configuration registers (offset:0x1000) */\n#define MAC_CSR0            0x1000\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _ASIC_VER_ID_STRUC {\n\tstruct {\n\t    UINT16  ASICVer;        /* version */\n\t    UINT16  ASICRev;        /* reversion */\n\t} field;\n\tUINT32 word;\n} ASIC_VER_ID_STRUC;\n#else\ntypedef\tunion _ASIC_VER_ID_STRUC {\n\tstruct {\n\t    UINT16  ASICRev;\n\t    UINT16  ASICVer;\n\t} field;\n\tUINT32 word;\n} ASIC_VER_ID_STRUC;\n#endif\n\n#define MAC_SYS_CTRL            0x1004\n#define MAC_ADDR_DW0\t\t0x1008\n#define MAC_ADDR_DW1\t\t0x100c\n\n/* MAC_CSR2: STA MAC register 0 */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _MAC_DW0_STRUC {\n\tstruct {\n\t\tUINT8 Byte3;\t\t/* MAC address byte 3 */\n\t\tUINT8 Byte2;\t\t/* MAC address byte 2 */\n\t\tUINT8 Byte1;\t\t/* MAC address byte 1 */\n\t\tUINT8 Byte0;\t\t/* MAC address byte 0 */\n\t} field;\n\tUINT32 word;\n} MAC_DW0_STRUC;\n#else\ntypedef\tunion _MAC_DW0_STRUC {\n\tstruct {\n\t\tUINT8 Byte0;\n\t\tUINT8 Byte1;\n\t\tUINT8 Byte2;\n\t\tUINT8 Byte3;\n\t} field;\n\tUINT32 word;\n} MAC_DW0_STRUC;\n#endif\n\n\n/* MAC_CSR3: STA MAC register 1 */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _MAC_DW1_STRUC {\n\tstruct {\n\t\tUINT8\t\tRsvd1;\n\t\tUINT8\t\tU2MeMask;\n\t\tUINT8\t\tByte5;\t\t/* MAC address byte 5 */\n\t\tUINT8\t\tByte4;\t\t/* MAC address byte 4 */\n\t} field;\n\tUINT32 word;\n} MAC_DW1_STRUC;\n#else\ntypedef\tunion _MAC_DW1_STRUC {\n\tstruct {\n\t\tUINT8 Byte4;\n\t\tUINT8 Byte5;\n\t\tUINT8 U2MeMask;\n\t\tUINT8 Rsvd1;\n\t} field;\n\tUINT32 word;\n}\tMAC_DW1_STRUC;\n#endif\n\n#define MAC_BSSID_DW0\t\t0x1010\n#define MAC_BSSID_DW1\t\t0x1014\n/* MAC_CSR5: BSSID register 1 */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion\t_MAC_BSSID_DW1_STRUC {\n\tstruct {\n\t\tUINT32 NMBssMode3:1;\n\t\tUINT32 NMBssMode2:1;\n\t\tUINT32 NMBssMode:1;\n\t\tUINT32 MBssBcnNum:3;\n\t\tUINT32 MBssMode:2; /* 0: one BSSID, 10: 4 BSSID,  01: 2 BSSID , 11: 8BSSID */\n\t\tUINT32 Byte5:8;\t\t /* BSSID byte 5 */\n\t\tUINT32 Byte4:8;\t\t /* BSSID byte 4 */\n\t} field;\n\tUINT32 word;\n} MAC_BSSID_DW1_STRUC;\n#else\ntypedef\tunion\t_MAC_BSSID_DW1_STRUC {\n\tstruct {\n\t\tUINT32 Byte4:8;\n\t\tUINT32 Byte5:8;\n\t\tUINT32 MBssMode:2;\n\t\tUINT32 MBssBcnNum:3;\n\t\tUINT32 NMBssMode:1;\n\t\tUINT32 NMBssMode2:1;\t\t\n\t\tUINT32 NMBssMode3:1;\n\t} field;\n\tUINT32 word;\n} MAC_BSSID_DW1_STRUC;\n#endif\n\n/* rt2860b max 16k bytes. bit12:13 Maximum PSDU length (power factor) 0:2^13, 1:2^14, 2:2^15, 3:2^16 */\n#define MAX_LEN_CFG              0x1018\n\n\n/* BBP_CSR_CFG: BBP serial control register */\n#define BBP_CSR_CFG            \t0x101c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _BBP_CSR_CFG_STRUC {\n\tstruct {\n\t\tUINT32\t\t:12;\t\t\n\t\tUINT32\t\tBBP_RW_MODE:1;\t/* 0: use serial mode  1:parallel */\n\t\tUINT32\t\tBBP_PAR_DUR:1;\t\t/* 0: 4 MAC clock cycles  1: 8 MAC clock cycles */\n\t\tUINT32\t\tBusy:1;\t\t\t\t/* 1: ASIC is busy execute BBP programming. */\n\t\tUINT32\t\tfRead:1;\t\t\t\t/* 0: Write BBP, 1:\tRead BBP */\n\t\tUINT32\t\tRegNum:8;\t\t\t/* Selected BBP register */\n\t\tUINT32\t\tValue:8;\t\t\t\t/* Register value to program into BBP */\n\t} field;\n\tUINT32 word;\n} BBP_CSR_CFG_STRUC;\n#else\ntypedef\tunion _BBP_CSR_CFG_STRUC {\n\tstruct {\n\t\tUINT32\t\tValue:8;\n\t\tUINT32\t\tRegNum:8;\n\t\tUINT32\t\tfRead:1;\n\t\tUINT32\t\tBusy:1;\n\t\tUINT32\t\tBBP_PAR_DUR:1;\n\t\tUINT32\t\tBBP_RW_MODE:1;\n\t\tUINT32\t\t:12;\n\t} field;\n\tUINT32 word;\n} BBP_CSR_CFG_STRUC;\n#endif\n\n\n/* RF_CSR_CFG: RF control register */\n#define RF_CSR_CFG0            \t\t0x1020\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RF_CSR_CFG0_STRUC {\n\tstruct {\n\t\tUINT32 Busy:1;\t\t    /* 0: idle 1: 8busy */\n\t\tUINT32 Sel:1;\t\t\t/* 0:RF_LE0 activate  1:RF_LE1 activate */\n\t\tUINT32 StandbyMode:1;\t/* 0: high when stand by 1:\tlow when standby */\n\t\tUINT32 bitwidth:5;\t\t/* Selected BBP register */\n\t\tUINT32 RegIdAndContent:24;\t/* Register value to program into BBP */\n\t} field;\n\tUINT32 word;\n} RF_CSR_CFG0_STRUC;\n#else\ntypedef\tunion _RF_CSR_CFG0_STRUC {\n\tstruct {\n\t\tUINT32 RegIdAndContent:24;\n\t\tUINT32 bitwidth:5;\n\t\tUINT32 StandbyMode:1;\n\t\tUINT32 Sel:1;\n\t\tUINT32 Busy:1;\n\t} field;\n\tUINT32 word;\n} RF_CSR_CFG0_STRUC;\n#endif\n\n\n#define RF_CSR_CFG1           \t\t0x1024\t\t \n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RF_CSR_CFG1_STRUC {\n\tstruct {\n\t\tUINT32 rsv:7;\t/* 0: idle 1: 8busy */\n\t\tUINT32 RFGap:5;\t/* Gap between BB_CONTROL_RF and RF_LE. 0: 3 system clock cycle (37.5usec) 1: 5 system clock cycle (62.5usec) */\n\t\tUINT32 RegIdAndContent:24;\t/* Register value to program into BBP */\n\t} field;\n\tUINT32 word;\n} RF_CSR_CFG1_STRUC;\n#else\ntypedef\tunion _RF_CSR_CFG1_STRUC {\n\tstruct {\n\t\tUINT32 RegIdAndContent:24;\n\t\tUINT32 RFGap:5;\n\t\tUINT32 rsv:7;\n\t} field;\n\tUINT32 word;\n} RF_CSR_CFG1_STRUC;\n#endif\n\n\n#define RF_CSR_CFG2           \t\t0x1028\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RF_CSR_CFG2_STRUC {\n\tstruct {\n\t\tUINT32 rsv:8;\t\t    /* 0: idle 1: 8busy */\n\t\tUINT32 RegIdAndContent:24; /* Register value to program into BBP */\n\t} field;\n\tUINT32 word;\n}\tRF_CSR_CFG2_STRUC;\n#else\ntypedef\tunion _RF_CSR_CFG2_STRUC {\n\tstruct {\n\t\tUINT32 RegIdAndContent:24;\n\t\tUINT32 rsv:8;\n\t} field;\n\tUINT32 word;\n} RF_CSR_CFG2_STRUC;\n#endif\n\n\n#define LED_CFG           \t\t0x102c \n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _LED_CFG_STRUC {\n\tstruct {\n\t\tUINT32\t\t:1;\t\t\t \n\t\tUINT32\t\tLedPolar:1;\t\t\t/* Led Polarity.  0: active low1: active high */\n\t\tUINT32\t\tYLedMode:2;\t\t\t/* yellow Led Mode */\n\t\tUINT32\t\tGLedMode:2;\t\t\t/* green Led Mode */\n\t\tUINT32\t\tRLedMode:2;\t\t\t/* red Led Mode    0: off1: blinking upon TX2: periodic slow blinking3: always on */\n\t\tUINT32\t\trsv:2;\t\t    \n\t\tUINT32\t\tSlowBlinkPeriod:6;\t\t\t/* slow blinking period. unit:1ms */\n\t\tUINT32\t\tOffPeriod:8;\t\t\t/* blinking off period unit 1ms */\n\t\tUINT32\t\tOnPeriod:8;\t\t\t/* blinking on period unit 1ms */\n\t} field;\n\tUINT32 word;\n} LED_CFG_STRUC;\n#else\ntypedef\tunion _LED_CFG_STRUC {\n\tstruct {\n\t\tUINT32\t\tOnPeriod:8;\n\t\tUINT32\t\tOffPeriod:8;\n\t\tUINT32\t\tSlowBlinkPeriod:6;\n\t\tUINT32\t\trsv:2;\n\t\tUINT32\t\tRLedMode:2;\n\t\tUINT32\t\tGLedMode:2;\n\t\tUINT32\t\tYLedMode:2;\t\n\t\tUINT32\t\tLedPolar:1;\n\t\tUINT32\t\t:1;\n\t} field;\n\tUINT32 word;\n} LED_CFG_STRUC;\n#endif\n\n\n#define AMPDU_MAX_LEN_20M1S\t0x1030\n#define AMPDU_MAX_LEN_20M2S\t0x1034\n#define AMPDU_MAX_LEN_40M1S\t0x1038\n#define AMPDU_MAX_LEN_40M2S\t0x103c\n#define AMPDU_MAX_LEN\t\t\t0x1040\n\n\n/* The number of the Tx chains */\n#define NUM_OF_TX_CHAIN\t\t4\n\n#define TX_CHAIN_ADDR0_L\t0x1044\t\t/* Stream mode MAC address registers */\n#define TX_CHAIN_ADDR0_H\t0x1048\n#define TX_CHAIN_ADDR1_L\t0x104C\n#define TX_CHAIN_ADDR1_H\t0x1050\n#define TX_CHAIN_ADDR2_L\t0x1054\n#define TX_CHAIN_ADDR2_H\t0x1058\n#define TX_CHAIN_ADDR3_L\t0x105C\n#define TX_CHAIN_ADDR3_H\t0x1060\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR0_L_STRUC {\n\tstruct {\n\t\tUINT8 TxChainAddr0L_Byte3; /* Destination MAC address of Tx chain0 (byte 3) */\n\t\tUINT8 TxChainAddr0L_Byte2; /* Destination MAC address of Tx chain0 (byte 2) */\n\t\tUINT8 TxChainAddr0L_Byte1; /* Destination MAC address of Tx chain0 (byte 1) */\n\t\tUINT8 TxChainAddr0L_Byte0; /* Destination MAC address of Tx chain0 (byte 0) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR0_L_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR0_L_STRUC {\n\tstruct {\n\t\tUINT8 TxChainAddr0L_Byte0;\n\t\tUINT8 TxChainAddr0L_Byte1;\n\t\tUINT8 TxChainAddr0L_Byte2;\n\t\tUINT8 TxChainAddr0L_Byte3;\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR0_L_STRUC;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR0_H_STRUC {\n\tstruct {\n\t\tUINT16\tReserved:12; /* Reserved */\n\t\tUINT16\tTxChainSel0:4; /* Selection value of Tx chain0 */\n\t\tUINT8\tTxChainAddr0H_Byte5; /* Destination MAC address of Tx chain0 (byte 5) */\n\t\tUINT8\tTxChainAddr0H_Byte4; /* Destination MAC address of Tx chain0 (byte 4) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR0_H_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR0_H_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr0H_Byte4; /* Destination MAC address of Tx chain0 (byte 4) */\n\t\tUINT8\tTxChainAddr0H_Byte5; /* Destination MAC address of Tx chain0 (byte 5) */\n\t\tUINT16\tTxChainSel0:4; /* Selection value of Tx chain0 */\n\t\tUINT16\tReserved:12; /* Reserved */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR0_H_STRUC;\n#endif\n\n\n#ifdef BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR1_L_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr1L_Byte3; /* Destination MAC address of Tx chain1 (byte 3) */\n\t\tUINT8\tTxChainAddr1L_Byte2; /* Destination MAC address of Tx chain1 (byte 2) */\n\t\tUINT8\tTxChainAddr1L_Byte1; /* Destination MAC address of Tx chain1 (byte 1) */\n\t\tUINT8\tTxChainAddr1L_Byte0; /* Destination MAC address of Tx chain1 (byte 0) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR1_L_STRUC, *PTX_CHAIN_ADDR1_L_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR1_L_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr1L_Byte0;\n\t\tUINT8\tTxChainAddr1L_Byte1;\n\t\tUINT8\tTxChainAddr1L_Byte2;\n\t\tUINT8\tTxChainAddr1L_Byte3;\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR1_L_STRUC, *PTX_CHAIN_ADDR1_L_STRUC;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR1_H_STRUC {\n\tstruct {\n\t\tUINT16\tReserved:12; /* Reserved */\n\t\tUINT16\tTxChainSel0:4; /* Selection value of Tx chain0 */\n\t\tUINT8\tTxChainAddr1H_Byte5; /* Destination MAC address of Tx chain1 (byte 5) */\n\t\tUINT8\tTxChainAddr1H_Byte4; /* Destination MAC address of Tx chain1 (byte 4) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR1_H_STRUC ;\n#else\ntypedef union _TX_CHAIN_ADDR1_H_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr1H_Byte4; \n\t\tUINT8\tTxChainAddr1H_Byte5; \n\t\tUINT16\tTxChainSel0:4; \n\t\tUINT16\tReserved:12; \n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR1_H_STRUC ;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR2_L_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr2L_Byte3; /* Destination MAC address of Tx chain2 (byte 3) */\n\t\tUINT8\tTxChainAddr2L_Byte2; /* Destination MAC address of Tx chain2 (byte 2) */\n\t\tUINT8\tTxChainAddr2L_Byte1; /* Destination MAC address of Tx chain2 (byte 1) */\n\t\tUINT8\tTxChainAddr2L_Byte0; /* Destination MAC address of Tx chain2 (byte 0) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR2_L_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR2_L_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr2L_Byte0;\n\t\tUINT8\tTxChainAddr2L_Byte1;\n\t\tUINT8\tTxChainAddr2L_Byte2;\n\t\tUINT8\tTxChainAddr2L_Byte3;\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR2_L_STRUC;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR2_H_STRUC {\n\tstruct {\n\t\tUINT16\tReserved:12; /* Reserved */\n\t\tUINT16\tTxChainSel0:4; /* Selection value of Tx chain0 */\n\t\tUINT8\tTxChainAddr2H_Byte5; /* Destination MAC address of Tx chain2 (byte 5) */\n\t\tUINT8\tTxChainAddr2H_Byte4; /* Destination MAC address of Tx chain2 (byte 4) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR2_H_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR2_H_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr2H_Byte4;\n\t\tUINT8\tTxChainAddr2H_Byte5;\n\t\tUINT16\tTxChainSel0:4;\n\t\tUINT16\tReserved:12;\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR2_H_STRUC;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR3_L_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr3L_Byte3; /* Destination MAC address of Tx chain3 (byte 3) */\n\t\tUINT8\tTxChainAddr3L_Byte2; /* Destination MAC address of Tx chain3 (byte 2) */\n\t\tUINT8\tTxChainAddr3L_Byte1; /* Destination MAC address of Tx chain3 (byte 1) */\n\t\tUINT8\tTxChainAddr3L_Byte0; /* Destination MAC address of Tx chain3 (byte 0) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR3_L_STRUC, *PTX_CHAIN_ADDR3_L_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR3_L_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr3L_Byte0;\n\t\tUINT8\tTxChainAddr3L_Byte1;\n\t\tUINT8\tTxChainAddr3L_Byte2;\n\t\tUINT8\tTxChainAddr3L_Byte3;\n\t} field;\n\tUINT32 word;\n}\tTX_CHAIN_ADDR3_L_STRUC, *PTX_CHAIN_ADDR3_L_STRUC;\n#endif\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _TX_CHAIN_ADDR3_H_STRUC {\n\tstruct {\n\t\tUINT16\tReserved:12; /* Reserved */\n\t\tUINT16\tTxChainSel0:4; /* Selection value of Tx chain0 */\n\t\tUINT8\tTxChainAddr3H_Byte5; /* Destination MAC address of Tx chain3 (byte 5) */\n\t\tUINT8\tTxChainAddr3H_Byte4; /* Destination MAC address of Tx chain3 (byte 4) */\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR3_H_STRUC, *PTX_CHAIN_ADDR3_H_STRUC;\n#else\ntypedef union _TX_CHAIN_ADDR3_H_STRUC {\n\tstruct {\n\t\tUINT8\tTxChainAddr3H_Byte4;\n\t\tUINT8\tTxChainAddr3H_Byte5;\n\t\tUINT16\tTxChainSel0:4;\n\t\tUINT16\tReserved:12;\n\t} field;\n\tUINT32 word;\n} TX_CHAIN_ADDR3_H_STRUC;\n#endif\n\n\n\n/*  4.2 MAC TIMING  configuration registers (offset:0x1100) */\n#define XIFS_TIME_CFG             0x1100\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _IFS_SLOT_CFG_STRUC {\n\tstruct {\n\t    UINT32  rsv:2;         \n\t    UINT32  BBRxendEnable:1;        /*  reference RXEND signal to begin XIFS defer */\n\t    UINT32  EIFS:9;        /*  unit 1us */\n\t    UINT32  OfdmXifsTime:4;        /*OFDM SIFS. unit 1us. Applied after OFDM RX when MAC doesn't reference BBP signal BBRXEND */\n\t    UINT32  OfdmSifsTime:8;        /*  unit 1us. Applied after OFDM RX/TX */\n\t    UINT32  CckmSifsTime:8;        /*  unit 1us. Applied after CCK RX/TX */\n\t} field;\n\tUINT32 word;\n} IFS_SLOT_CFG_STRUC;\n#else\ntypedef\tunion _IFS_SLOT_CFG_STRUC {\n\tstruct {\n\t    UINT32  CckmSifsTime:8;\n\t    UINT32  OfdmSifsTime:8;\n\t    UINT32  OfdmXifsTime:4;\n\t    UINT32  EIFS:9;\n\t    UINT32  BBRxendEnable:1;\n\t    UINT32  rsv:2;         \n\t} field;\n\tUINT32 word;\n} IFS_SLOT_CFG_STRUC;\n#endif\n\n#define BKOFF_SLOT_CFG\t\t0x1104\n#define NAV_TIME_CFG\t\t0x1108\n#define CH_TIME_CFG\t\t\t0x110C\n#define PBF_LIFE_TIMER\t\t0x1110\t/*TX/RX MPDU timestamp timer (free run)Unit: 1us */\n\n\n/* BCN_TIME_CFG : Synchronization control register */\n#define BCN_TIME_CFG             0x1114\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _BCN_TIME_CFG_STRUC {\n\tstruct {\n\t\tUINT32 TxTimestampCompensate:8;\n\t\tUINT32 :3;\n\t\tUINT32 bBeaconGen:1;\t\t/* Enable beacon generator */\n\t\tUINT32 bTBTTEnable:1;\n\t\tUINT32 TsfSyncMode:2;\t\t/* Enable TSF sync, 00: disable, 01: infra mode, 10: ad-hoc mode */\n\t\tUINT32 bTsfTicking:1;\t\t/* Enable TSF auto counting */\n\t\tUINT32 BeaconInterval:16;  /* in unit of 1/16 TU */\n\t} field;\n\tUINT32 word;\n} BCN_TIME_CFG_STRUC;\n#else\ntypedef union _BCN_TIME_CFG_STRUC {\n\tstruct {\n\t\tUINT32 BeaconInterval:16;\n\t\tUINT32 bTsfTicking:1;\n\t\tUINT32 TsfSyncMode:2;\n\t\tUINT32 bTBTTEnable:1;\n\t\tUINT32 bBeaconGen:1;\n\t\tUINT32 :3;\n\t\tUINT32 TxTimestampCompensate:8;\n\t} field;\n\tUINT32 word;\n} BCN_TIME_CFG_STRUC;\n#endif\n\n\n#define TBTT_SYNC_CFG\t\t0x1118\n#define TSF_TIMER_DW0\t\t0x111c\t/* Local TSF timer lsb 32 bits. Read-only */\n#define TSF_TIMER_DW1\t\t0x1120\t/* msb 32 bits. Read-only. */\n#define TBTT_TIMER\t\t\t0x1124\t/* TImer remains till next TBTT. Read-only */\n#define INT_TIMER_CFG\t\t0x1128\n#define INT_TIMER_EN\t\t0x112c\t/* GP-timer and pre-tbtt Int enable */\n#define CH_IDLE_STA\t\t\t0x1130\t/* channel idle time */\n#define CH_BUSY_STA\t\t\t0x1134\t/* channle busy time */\n#define CH_BUSY_STA_SEC\t0x1138\t/* channel busy time for secondary channel */\n\n\n/*  4.2 MAC POWER  configuration registers (offset:0x1200) */\n#define MAC_STATUS_CFG\t\t0x1200\n#define PWR_PIN_CFG\t\t0x1204\n\n\n/* AUTO_WAKEUP_CFG: Manual power control / status register */\n#define AUTO_WAKEUP_CFG\t0x1208\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _AUTO_WAKEUP_STRUC {\n\tstruct {\n\t\tUINT32 :16;\n\t\tUINT32 EnableAutoWakeup:1;\t/* 0:sleep, 1:awake */\n\t\tUINT32 NumofSleepingTbtt:7;          /* ForceWake has high privilege than PutToSleep when both set */\n\t\tUINT32 AutoLeadTime:8;\n\t} field;\n\tUINT32 word;\n} AUTO_WAKEUP_STRUC;\n#else\ntypedef\tunion _AUTO_WAKEUP_STRUC {\n\tstruct {\n\t\tUINT32 AutoLeadTime:8;\n\t\tUINT32 NumofSleepingTbtt:7;\n\t\tUINT32 EnableAutoWakeup:1;\n\t\tUINT32 :16;\n\t} field;\n\tUINT32 word;\n} AUTO_WAKEUP_STRUC;\n#endif\n\n\n/*  4.3 MAC TX  configuration registers (offset:0x1300) */\n#define EDCA_AC0_CFG\t0x1300\n#define EDCA_AC1_CFG\t0x1304\n#define EDCA_AC2_CFG\t0x1308\n#define EDCA_AC3_CFG\t0x130c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _EDCA_AC_CFG_STRUC {\n\tstruct {\n\t    UINT32 :12;\n\t    UINT32 Cwmax:4;\t/* unit power of 2 */\n\t    UINT32 Cwmin:4;\n\t    UINT32 Aifsn:4;\t/* # of slot time */\n\t    UINT32 AcTxop:8;\t/*  in unit of 32us */\n\t} field;\n\tUINT32 word;\n} EDCA_AC_CFG_STRUC;\n#else\ntypedef\tunion _EDCA_AC_CFG_STRUC {\n\tstruct {\n\t    UINT32 AcTxop:8;\n\t    UINT32 Aifsn:4;\n\t    UINT32 Cwmin:4;\n\t    UINT32 Cwmax:4;\n\t    UINT32 :12;\n\t} field;\n\tUINT32 word;\n} EDCA_AC_CFG_STRUC;\n#endif\n\n#define EDCA_TID_AC_MAP\t0x1310\n\n\n/* Default Tx power */\n#define DEFAULT_TX_POWER\t0x6\n\n#define TX_PWR_CFG_0\t\t0x1314\n#define TX_PWR_CFG_0_EXT\t0x1390\n#define TX_PWR_CFG_1\t\t0x1318\n#define TX_PWR_CFG_1_EXT\t0x1394\n#define TX_PWR_CFG_2\t\t0x131C\n#define TX_PWR_CFG_2_EXT\t0x1398\n#define TX_PWR_CFG_3\t\t0x1320\n#define TX_PWR_CFG_3_EXT\t0x139C\n#define TX_PWR_CFG_4\t\t0x1324\n#define TX_PWR_CFG_4_EXT\t0x13A0\n#define TX_PWR_CFG_5\t\t0x1384\n#define TX_PWR_CFG_6\t\t0x1388\n#define TX_PWR_CFG_7\t\t0x13D4\n#define TX_PWR_CFG_8\t\t0x13D8\n#define TX_PWR_CFG_9\t\t0x13DC\n\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_PWR_CFG_STRUC {\n\tstruct {\n\t    UINT32 Byte3:8;\n\t    UINT32 Byte2:8;\n\t    UINT32 Byte1:8;\n\t    UINT32 Byte0:8;\n\t} field;\n\tUINT32 word;\n} TX_PWR_CFG_STRUC;\n#else\ntypedef\tunion _TX_PWR_CFG_STRUC {\n\tstruct {\n\t    UINT32 Byte0:8;\n\t    UINT32 Byte1:8;\n\t    UINT32 Byte2:8;\n\t    UINT32 Byte3:8;\n\t} field;\n\tUINT32 word;\n} TX_PWR_CFG_STRUC;\n#endif\n\n\n#define TX_PIN_CFG\t\t0x1328\t\t \n#define TX_BAND_CFG\t0x132c\t/* 0x1 use upper 20MHz. 0 juse lower 20MHz */\n#define TX_SW_CFG0\t\t0x1330\n#define TX_SW_CFG1\t\t0x1334\n#define TX_SW_CFG2\t\t0x1338\n\n\n#define TXOP_THRES_CFG\t0x133c\n#ifdef RT_BIG_ENDIAN\ntypedef union _TXOP_THRESHOLD_CFG_STRUC {\n\tstruct {\n\t\tUINT32\tTXOP_REM_THRES:8; /* Remaining TXOP threshold (unit: 32us) */\n\t\tUINT32\tCF_END_THRES:8; /* CF-END threshold (unit: 32us) */\n\t\tUINT32\tRDG_IN_THRES:8; /* Rx RDG threshold (unit: 32us) */\n\t\tUINT32\tRDG_OUT_THRES:8; /* Tx RDG threshold (unit: 32us) */\n\t} field;\n\tUINT32 word;\n} TXOP_THRESHOLD_CFG_STRUC;\n#else\ntypedef union _TXOP_THRESHOLD_CFG_STRUC {\n\tstruct {\n\t\tUINT32\tRDG_OUT_THRES:8;\n\t\tUINT32\tRDG_IN_THRES:8;\n\t\tUINT32\tCF_END_THRES:8;\n\t\tUINT32\tTXOP_REM_THRES:8;\n\t} field;\n\tUINT32 word;\n} TXOP_THRESHOLD_CFG_STRUC;\n#endif\n\n#define TXOP_CTRL_CFG 0x1340\n\n\n#define TX_RTS_CFG 0x1344\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_RTS_CFG_STRUC {\n\tstruct {\n\t    UINT32 rsv:7;     \n\t    UINT32 RtsFbkEn:1;    /* enable rts rate fallback */\n\t    UINT32 RtsThres:16;    /* unit:byte */\n\t    UINT32 AutoRtsRetryLimit:8;\n\t} field;\n\tUINT32 word;\n} TX_RTS_CFG_STRUC;\n#else\ntypedef\tunion _TX_RTS_CFG_STRUC\t {\n\tstruct {\n\t    UINT32 AutoRtsRetryLimit:8;\n\t    UINT32 RtsThres:16;\n\t    UINT32 RtsFbkEn:1;\n\t    UINT32 rsv:7;\n\t} field;\n\tUINT32 word;\n} TX_RTS_CFG_STRUC;\n#endif\n\n\n#define TX_TXBF_CFG_0 0x138c\n#define TX_TXBF_CFG_1 0x13A4\n#define TX_TXBF_CFG_2 0x13A8\n#define TX_TXBF_CFG_3 0x13AC\ntypedef\tunion _TX_TXBF_CFG_0_STRUC {\n\tstruct {\n#ifdef RT_BIG_ENDIAN\n\t    UINT32       EtxbfFbkRate:16;     \n\t    UINT32       EtxbfFbkEn:1;\n\t    UINT32       EtxbfFbkSeqEn:1;\n\t    UINT32       EtxbfFbkCoef:2;\n\t    UINT32       EtxbfFbkCode:2;\n\t    UINT32       EtxbfFbkNg:2;\n\t    UINT32       CsdBypass:1;\n\t    UINT32       EtxbfForce:1;\n\t    UINT32       EtxbfEnable:1;\n\t    UINT32       AutoTxbfEn:3;\n\t    UINT32       ItxbfForce:1;\n\t    UINT32       ItxbfEn:1;\n#else\n\t    UINT32       ItxbfEn:1;\n\t    UINT32       ItxbfForce:1;\n\t    UINT32       AutoTxbfEn:3;\n\t    UINT32       EtxbfEnable:1;\n\t    UINT32       EtxbfForce:1;\n\t    UINT32       CsdBypass:1;\n\t    UINT32       EtxbfFbkNg:2;\n\t    UINT32       EtxbfFbkCode:2;\n\t    UINT32       EtxbfFbkCoef:2;\n\t    UINT32       EtxbfFbkSeqEn:1;\n\t    UINT32       EtxbfFbkEn:1;\n\t    UINT32       EtxbfFbkRate:16;     \n#endif\n\t} field;\n\tUINT32 word;\n} TX_TXBF_CFG_0_STRUC;\n\n\n#define TX_TIMEOUT_CFG\t0x1348\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_TIMEOUT_CFG_STRUC {\n\tstruct {\n\t    UINT32 rsv2:8;     \n\t    UINT32 TxopTimeout:8;\t/*TXOP timeout value for TXOP truncation.  It is recommended that (SLOT_TIME) > (TX_OP_TIMEOUT) > (RX_ACK_TIMEOUT) */\n\t    UINT32 RxAckTimeout:8;\t/* unit:slot. Used for TX precedure */\n\t    UINT32 MpduLifeTime:4;    /*  expiration time = 2^(9+MPDU LIFE TIME)  us */\n\t    UINT32 rsv:4;     \n\t} field;\n\tUINT32 word;\n} TX_TIMEOUT_CFG_STRUC;\n#else\ntypedef\tunion _TX_TIMEOUT_CFG_STRUC {\n\tstruct {\n\t    UINT32 rsv:4;     \n\t    UINT32 MpduLifeTime:4;\n\t    UINT32 RxAckTimeout:8;\n\t    UINT32 TxopTimeout:8;\n\t    UINT32 rsv2:8;\n\t} field;\n\tUINT32 word;\n} TX_TIMEOUT_CFG_STRUC;\n#endif\n\n\n#define TX_RTY_CFG\t0x134c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_RTY_CFG_STRUC {\n\tstruct {\n\t    UINT32 rsv:1;     \n\t    UINT32 TxautoFBEnable:1;    /* Tx retry PHY rate auto fallback enable */\n\t    UINT32 AggRtyMode:1;\t/* Aggregate MPDU retry mode.  0:expired by retry limit, 1: expired by mpdu life timer */\n\t    UINT32 NonAggRtyMode:1;\t/* Non-Aggregate MPDU retry mode.  0:expired by retry limit, 1: expired by mpdu life timer */\n\t    UINT32 LongRtyThre:12;\t/* Long retry threshoold */\n\t    UINT32 LongRtyLimit:8;\t/*long retry limit */\n\t    UINT32 ShortRtyLimit:8;\t/*  short retry limit */\n\t} field;\n\tUINT32 word;\n} TX_RTY_CFG_STRUC;\n#else\ntypedef\tunion _TX_RTY_CFG_STRUC {\n\tstruct {\n\t    UINT32 ShortRtyLimit:8;\n\t    UINT32 LongRtyLimit:8;\n\t    UINT32 LongRtyThre:12;\n\t    UINT32 NonAggRtyMode:1;\n\t    UINT32 AggRtyMode:1;\n\t    UINT32 TxautoFBEnable:1;\n\t    UINT32 rsv:1;\n\t} field;\n\tUINT32 word;\n} TX_RTY_CFG_STRUC;\n#endif\n\n\n#define TX_LINK_CFG\t0x1350\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_LINK_CFG_STRUC {\n\tstruct {\n\t    UINT32       RemotMFS:8;\t/*remote MCS feedback sequence number */\n\t    UINT32       RemotMFB:8;    /*  remote MCS feedback */\n\t    UINT32       rsv:3;\t/* */\n\t    UINT32       TxCFAckEn:1;\t/*   Piggyback CF-ACK enable */\n\t    UINT32       TxRDGEn:1;\t/* RDG TX enable */\n\t    UINT32       TxMRQEn:1;\t/*  MCS request TX enable */\n\t    UINT32       RemoteUMFSEnable:1;\t/*  remote unsolicit  MFB enable.  0: not apply remote remote unsolicit (MFS=7) */\n\t    UINT32       MFBEnable:1;\t/*  TX apply remote MFB 1:enable */\n\t    UINT32       RemoteMFBLifeTime:8;\t/*remote MFB life time. unit : 32us */\n\t} field;\n\tUINT32 word;\n} TX_LINK_CFG_STRUC;\n#else\ntypedef\tunion _TX_LINK_CFG_STRUC {\n\tstruct {\n\t    UINT32       RemoteMFBLifeTime:8;\n\t    UINT32       MFBEnable:1;\n\t    UINT32       RemoteUMFSEnable:1;\n\t    UINT32       TxMRQEn:1;\n\t    UINT32       TxRDGEn:1;\n\t    UINT32       TxCFAckEn:1;\n\t    UINT32       rsv:3;\n\t    UINT32       RemotMFB:8;\n\t    UINT32       RemotMFS:8;\n\t} field;\n\tUINT32 word;\n} TX_LINK_CFG_STRUC;\n#endif\n\n\n#define HT_FBK_CFG0\t0x1354\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _HT_FBK_CFG0_STRUC {\n\tstruct {\n\t    UINT32 HTMCS7FBK:4;\n\t    UINT32 HTMCS6FBK:4;\n\t    UINT32 HTMCS5FBK:4;\n\t    UINT32 HTMCS4FBK:4;\n\t    UINT32 HTMCS3FBK:4;\n\t    UINT32 HTMCS2FBK:4;\n\t    UINT32 HTMCS1FBK:4;\n\t    UINT32 HTMCS0FBK:4;\n\t} field;\n\tUINT32 word;\n} HT_FBK_CFG0_STRUC;\n#else\ntypedef\tunion _HT_FBK_CFG0_STRUC {\n\tstruct {\n\t    UINT32 HTMCS0FBK:4;\n\t    UINT32 HTMCS1FBK:4;\n\t    UINT32 HTMCS2FBK:4;\n\t    UINT32 HTMCS3FBK:4;\n\t    UINT32 HTMCS4FBK:4;\n\t    UINT32 HTMCS5FBK:4;\n\t    UINT32 HTMCS6FBK:4;\n\t    UINT32 HTMCS7FBK:4;\n\t} field;\n\tUINT32 word;\n} HT_FBK_CFG0_STRUC;\n#endif\n\n\n#define HT_FBK_CFG1\t0x1358\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _HT_FBK_CFG1_STRUC {\n\tstruct {\n\t    UINT32       HTMCS15FBK:4;\n\t    UINT32       HTMCS14FBK:4;\n\t    UINT32       HTMCS13FBK:4;\n\t    UINT32       HTMCS12FBK:4;\n\t    UINT32       HTMCS11FBK:4;\n\t    UINT32       HTMCS10FBK:4;\n\t    UINT32       HTMCS9FBK:4;\n\t    UINT32       HTMCS8FBK:4;\n\t} field;\n\tUINT32 word;\n} HT_FBK_CFG1_STRUC;\n#else\ntypedef\tunion _HT_FBK_CFG1_STRUC {\n\tstruct {\n\t    UINT32       HTMCS8FBK:4;\n\t    UINT32       HTMCS9FBK:4;\n\t    UINT32       HTMCS10FBK:4;\n\t    UINT32       HTMCS11FBK:4;\n\t    UINT32       HTMCS12FBK:4;\n\t    UINT32       HTMCS13FBK:4;\n\t    UINT32       HTMCS14FBK:4;\n\t    UINT32       HTMCS15FBK:4;\n\t} field;\n\tUINT32 word;\n} HT_FBK_CFG1_STRUC;\n#endif\n\n\n#define LG_FBK_CFG0\t0x135c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _LG_FBK_CFG0_STRUC {\n\tstruct {\n\t    UINT32       OFDMMCS7FBK:4;\n\t    UINT32       OFDMMCS6FBK:4;\n\t    UINT32       OFDMMCS5FBK:4\n\t    UINT32       OFDMMCS4FBK:4;\n\t    UINT32       OFDMMCS3FBK:4;\n\t    UINT32       OFDMMCS2FBK:4;\n\t    UINT32       OFDMMCS1FBK:4;\n\t    UINT32       OFDMMCS0FBK:4;\n\t} field;\n\tUINT32 word;\n} LG_FBK_CFG0_STRUC;\n#else\ntypedef\tunion _LG_FBK_CFG0_STRUC {\n\tstruct {\n\t    UINT32       OFDMMCS0FBK:4;\n\t    UINT32       OFDMMCS1FBK:4;\n\t    UINT32       OFDMMCS2FBK:4;\n\t    UINT32       OFDMMCS3FBK:4;\n\t    UINT32       OFDMMCS4FBK:4;\n\t    UINT32       OFDMMCS5FBK:4;\n\t    UINT32       OFDMMCS6FBK:4;\n\t    UINT32       OFDMMCS7FBK:4;\n\t} field;\n\tUINT32 word;\n} LG_FBK_CFG0_STRUC;\n#endif\n\n\n#define LG_FBK_CFG1\t\t0x1360\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _LG_FBK_CFG1_STRUC {\n\tstruct {\n\t    UINT32       rsv:16;\t \n\t    UINT32       CCKMCS3FBK:4;\n\t    UINT32       CCKMCS2FBK:4;\n\t    UINT32       CCKMCS1FBK:4;\n\t    UINT32       CCKMCS0FBK:4;\n\t} field;\n\tUINT32 word;\n}\tLG_FBK_CFG1_STRUC;\n#else\ntypedef\tunion _LG_FBK_CFG1_STRUC {\n\tstruct {\n\t    UINT32       CCKMCS0FBK:4;\n\t    UINT32       CCKMCS1FBK:4;\n\t    UINT32       CCKMCS2FBK:4;\n\t    UINT32       CCKMCS3FBK:4;\n\t    UINT32       rsv:16;\n\t}\tfield;\n\tUINT32 word;\n}\tLG_FBK_CFG1_STRUC;\n#endif\n\n\n/*======================================================= */\n/*                                     Protection Paramater                                                         */\n/*======================================================= */\n#define ASIC_SHORTNAV\t1\n#define ASIC_LONGNAV\t2\n#define ASIC_RTS\t\t1\n#define ASIC_CTS\t\t2\n\n#define CCK_PROT_CFG\t0x1364\t/* CCK Protection */\n#define OFDM_PROT_CFG\t0x1368\t/* OFDM Protection */\n#define MM20_PROT_CFG\t0x136C\t/* MM20 Protection */\n#define MM40_PROT_CFG\t0x1370\t/* MM40 Protection */\n#define GF20_PROT_CFG\t0x1374\t/* GF20 Protection */\n#define GF40_PROT_CFG\t0x1378\t/* GR40 Protection */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _PROT_CFG_STRUC {\n\tstruct {\n\t    UINT32       rsv:5;\t \n\t    UINT32       RTSThEn:1;\t/*RTS threshold enable on CCK TX */\n\t    UINT32       TxopAllowGF40:1;\t/*CCK TXOP allowance.0:disallow. */\n\t    UINT32       TxopAllowGF20:1;\t/*CCK TXOP allowance.0:disallow. */\n\t    UINT32       TxopAllowMM40:1;\t/*CCK TXOP allowance.0:disallow. */\n\t    UINT32       TxopAllowMM20:1;\t/*CCK TXOP allowance. 0:disallow. */\n\t    UINT32       TxopAllowOfdm:1;\t/*CCK TXOP allowance.0:disallow. */\n\t    UINT32       TxopAllowCck:1;\t/*CCK TXOP allowance.0:disallow. */\n\t    UINT32       ProtectNav:2;\t/*TXOP protection type for CCK TX. 0:None, 1:ShortNAVprotect,  2:LongNAVProtect, 3:rsv */\n\t    UINT32       ProtectCtrl:2;\t/*Protection control frame type for CCK TX. 1:RTS/CTS, 2:CTS-to-self, 0:None, 3:rsv */\n\t    UINT32       ProtectRate:16;\t/*Protection control frame rate for CCK TX(RTS/CTS/CFEnd). */\n\t} field;\n\tUINT32 word;\n} PROT_CFG_STRUC;\n#else\ntypedef\tunion _PROT_CFG_STRUC {\n\tstruct {\n\t    UINT32       ProtectRate:16;\n\t    UINT32       ProtectCtrl:2;\n\t    UINT32       ProtectNav:2;\n\t    UINT32       TxopAllowCck:1;\n\t    UINT32       TxopAllowOfdm:1;\n\t    UINT32       TxopAllowMM20:1;\n\t    UINT32       TxopAllowMM40:1;\n\t    UINT32       TxopAllowGF20:1;\n\t    UINT32       TxopAllowGF40:1;\n\t    UINT32       RTSThEn:1;\n\t    UINT32       rsv:5;\t \n\t} field;\n\tUINT32 word;\n} PROT_CFG_STRUC;\n#endif\n\n\n#define EXP_CTS_TIME\t0x137C\n#define EXP_ACK_TIME\t0x1380\n\n\n#define HT_FBK_TO_LEGACY\t0x1384\n\n\n#ifdef DOT11N_SS3_SUPPORT\n#define TX_FBK_CFG_3S_0\t0x13c4\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_FBK_CFG_3S_0_STRUC {\n\tstruct {\n\t\tUINT32       rsv0:3;\n\t\tUINT32       HTMCS19FBK:5;\n\t\tUINT32       rsv1:3;\n\t\tUINT32       HTMCS18FBK:5;\n\t\tUINT32       rsv2:3;\n\t\tUINT32       HTMCS17FBK:5;\n\t\tUINT32       rsv3:3;\n\t\tUINT32       HTMCS16FBK:5;\n\t} field;\n\tUINT32 word;\n} TX_FBK_CFG_3S_0_STRUC;\n#else\ntypedef\tunion _TX_FBK_CFG_3S_0_STRUC {\n\tstruct {\n\t\tUINT32       HTMCS16FBK:5;\n\t\tUINT32       rsv3:3;\n\t\tUINT32       HTMCS17FBK:5;\n\t\tUINT32       rsv2:3;\n\t\tUINT32       HTMCS18FBK:5;\n\t\tUINT32       rsv1:3;\n\t\tUINT32       HTMCS19FBK:5;\n\t\tUINT32       rsv0:4;\n\t} field;\n\tUINT32 word;\n} TX_FBK_CFG_3S_0_STRUC;\n#endif\n\n#define TX_FBK_CFG_3S_1\t0x13c8\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_FBK_CFG_3S_1_STRUC {\n\tstruct {\n\t\tUINT32       rsv0:3;\n\t\tUINT32       HTMCS23FBK:5;\n\t\tUINT32       rsv1:3;\n\t\tUINT32       HTMCS22FBK:5;\n\t\tUINT32       rsv2:3;\n\t\tUINT32       HTMCS21FBK:5;\n\t\tUINT32       rsv3:3;\n\t\tUINT32       HTMCS20FBK:5;\n\t} field;\n\tUINT32 word;\n} TX_FBK_CFG_3S_1_STRUC;\n#else\ntypedef\tunion _TX_FBK_CFG_3S_1_STRUC {\n\tstruct {\n\t\tUINT32       HTMCS20FBK:5;\n\t\tUINT32       rsv3:3;\n\t\tUINT32       HTMCS21FBK:5;\n\t\tUINT32       rsv2:3;\n\t\tUINT32       HTMCS22FBK:5;\n\t\tUINT32       rsv1:3;\n\t\tUINT32       HTMCS23FBK:5;\n\t\tUINT32       rsv0:3;\n\t} field;\n\tUINT32 word;\n} TX_FBK_CFG_3S_1_STRUC;\n#endif\n#endif /* DOT11N_SS3_SUPPORT */\n\n#define TX_AC_RTY_LIMIT\t\t0x13cc\n#define TX_AC_FBK_SPEED\t0x13d0\n\n\n\n/*  4.4 MAC RX configuration registers (offset:0x1400) */\n\n/* RX_FILTR_CFG:  /RX configuration register */\n#define RX_FILTR_CFG\t0x1400\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RX_FILTR_CFG_STRUC {\n\tstruct {\n\t\tUINT32 rsv:15;\t\t\n\t\tUINT32 DropRsvCntlType:1;\n        \tUINT32 DropBAR:1;\n\t\tUINT32 DropBA:1;\t\n\t\tUINT32 DropPsPoll:1;\t\t/* Drop Ps-Poll */\n\t\tUINT32 DropRts:1;\t\t/* Drop Ps-Poll */\n\t\tUINT32 DropCts:1;\t\t/* Drop Ps-Poll */\n\t\tUINT32 DropAck:1;\t\t/* Drop Ps-Poll */\n\t\tUINT32 DropCFEnd:1;\t\t/* Drop Ps-Poll */\n\t\tUINT32 DropCFEndAck:1;\t\t/* Drop Ps-Poll */\n\t\tUINT32 DropDuplicate:1;\t\t/* Drop duplicate frame */\n\t\tUINT32 DropBcast:1;\t\t/* Drop broadcast frames */\n\t\tUINT32 DropMcast:1;\t\t/* Drop multicast frames */\n\t\tUINT32 DropVerErr:1;\t    /* Drop version error frame */\n\t\tUINT32 DropNotMyBSSID:1;\t\t\t/* Drop fram ToDs bit is true */\n\t\tUINT32 DropNotToMe:1;\t\t/* Drop not to me unicast frame */\n\t\tUINT32 DropPhyErr:1;\t\t/* Drop physical error */\n\t\tUINT32 DropCRCErr:1;\t\t/* Drop CRC error */\n\t} field;\n\tUINT32 word;\n} RX_FILTR_CFG_STRUC;\n#else\ntypedef\tunion _RX_FILTR_CFG_STRUC {\n\tstruct {\n\t\tUINT32 DropCRCErr:1;\n\t\tUINT32 DropPhyErr:1;\n\t\tUINT32 DropNotToMe:1;\n\t\tUINT32 DropNotMyBSSID:1;\n\t\tUINT32 DropVerErr:1;\n\t\tUINT32 DropMcast:1;\n\t\tUINT32 DropBcast:1;\n\t\tUINT32 DropDuplicate:1;\n\t\tUINT32 DropCFEndAck:1;\n\t\tUINT32 DropCFEnd:1;\n\t\tUINT32 DropAck:1;\n\t\tUINT32 DropCts:1;\n\t\tUINT32 DropRts:1;\n\t\tUINT32 DropPsPoll:1;\n\t\tUINT32 DropBA:1;\n        \tUINT32  DropBAR:1;\n\t\tUINT32 DropRsvCntlType:1;\n\t\tUINT32 rsv:15;\n\t} field;\n\tUINT32 word;\n}\tRX_FILTR_CFG_STRUC;\n#endif\n\n\n/* AUTO_RSP_CFG: Auto-Responder */\n#define AUTO_RSP_CFG\t0x1404\n#ifdef RT_BIG_ENDIAN\ntypedef union _AUTO_RSP_CFG_STRUC {\n\tstruct {\n\t\tUINT32        :24;    \n\t\tUINT32       AckCtsPsmBit:1;   /* Power bit value in conrtrol frame */\n\t\tUINT32       DualCTSEn:1;   /* Power bit value in conrtrol frame */\n\t\tUINT32       rsv:1;   /* Power bit value in conrtrol frame */\n\t\tUINT32       AutoResponderPreamble:1;    /* 0:long, 1:short preamble */\n\t\tUINT32       CTS40MRef:1;  /* Response CTS 40MHz duplicate mode */\n\t\tUINT32       CTS40MMode:1;  /* Response CTS 40MHz duplicate mode */\n\t\tUINT32       BACAckPolicyEnable:1;    /* 0:long, 1:short preamble */\n\t\tUINT32       AutoResponderEnable:1;\n\t} field;\n\tUINT32 word;\n} AUTO_RSP_CFG_STRUC;\n#else\ntypedef union _AUTO_RSP_CFG_STRUC {\n\tstruct {\n\t\tUINT32       AutoResponderEnable:1;\n\t\tUINT32       BACAckPolicyEnable:1;\n\t\tUINT32       CTS40MMode:1;\n\t\tUINT32       CTS40MRef:1;\n\t\tUINT32       AutoResponderPreamble:1;\n\t\tUINT32       rsv:1;\n\t\tUINT32       DualCTSEn:1;\n\t\tUINT32       AckCtsPsmBit:1;\n\t\tUINT32        :24;    \n\t} field;\n\tUINT32   word;\n} AUTO_RSP_CFG_STRUC;\n#endif\n\n\n#define LEGACY_BASIC_RATE\t0x1408\n#define HT_BASIC_RATE\t\t0x140c\n#define HT_CTRL_CFG\t\t\t0x1410\n#define SIFS_COST_CFG\t\t0x1414\n#define RX_PARSER_CFG\t\t0x1418\t/*Set NAV for all received frames */\n\n\n/*  4.5 MAC Security configuration (offset:0x1500) */\n#define TX_SEC_CNT0\t\t0x1500\n#define RX_SEC_CNT0\t\t0x1504\n#define CCMP_FC_MUTE\t0x1508\n\n\n/*  4.6 HCCA/PSMP (offset:0x1600) */\n#define TXOP_HLDR_ADDR0\t\t0x1600\t\t \n#define TXOP_HLDR_ADDR1\t\t0x1604\t\t \n#define TXOP_HLDR_ET\t\t\t0x1608\t\t \n#define QOS_CFPOLL_RA_DW0\t\t0x160c\n#define QOS_CFPOLL_A1_DW1\t\t0x1610\n#define QOS_CFPOLL_QC\t\t\t0x1614\n\n\n/*  4.7 MAC Statistis registers (offset:0x1700) */\n/* RX_STA_CNT0_STRUC: RX PLCP error count & RX CRC error count */\n#define RX_STA_CNT0\t\t0x1700\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RX_STA_CNT0_STRUC {\n\tstruct {\n\t    UINT16  PhyErr;\n\t    UINT16  CrcErr;\n\t} field;\n\tUINT32 word;\n} RX_STA_CNT0_STRUC;\n#else\ntypedef\tunion _RX_STA_CNT0_STRUC {\n\tstruct {\n\t    UINT16  CrcErr;\n\t    UINT16  PhyErr;\n\t} field;\n\tUINT32 word;\n} RX_STA_CNT0_STRUC;\n#endif\n\n\n/* RX_STA_CNT1_STRUC: RX False CCA count & RX LONG frame count */\n#define RX_STA_CNT1\t\t0x1704\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RX_STA_CNT1_STRUC {\n\tstruct {\n\t    UINT16  PlcpErr;\n\t    UINT16  FalseCca;\n\t} field;\n\tUINT32 word;\n} RX_STA_CNT1_STRUC;\n#else\ntypedef\tunion _RX_STA_CNT1_STRUC {\n\tstruct {\n\t    UINT16  FalseCca;\n\t    UINT16  PlcpErr;\n\t} field;\n\tUINT32 word;\n} RX_STA_CNT1_STRUC;\n#endif\n\n\n/* RX_STA_CNT2_STRUC: */\n#define RX_STA_CNT2\t\t0x1708\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _RX_STA_CNT2_STRUC {\n\tstruct {\n\t    UINT16  RxFifoOverflowCount;\n\t    UINT16  RxDupliCount;\n\t} field;\n\tUINT32 word;\n} RX_STA_CNT2_STRUC;\n#else\ntypedef\tunion _RX_STA_CNT2_STRUC {\n\tstruct {\n\t    UINT16  RxDupliCount;\n\t    UINT16  RxFifoOverflowCount;\n\t} field;\n\tUINT32 word;\n} RX_STA_CNT2_STRUC;\n#endif\n\n\n/* STA_CSR3: TX Beacon count */\n#define TX_STA_CNT0\t\t0x170C\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_STA_CNT0_STRUC {\n\tstruct {\n\t    UINT16  TxBeaconCount;\n\t    UINT16  TxFailCount;\n\t} field;\n\tUINT32 word;\n} TX_STA_CNT0_STRUC;\n#else\ntypedef\tunion _TX_STA_CNT0_STRUC {\n\tstruct {\n\t    UINT16  TxFailCount;\n\t    UINT16  TxBeaconCount;\n\t} field;\n\tUINT32 word;\n} TX_STA_CNT0_STRUC;\n#endif\n\n\n\n/* TX_STA_CNT1: TX tx count */\n#define TX_STA_CNT1\t\t0x1710\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_STA_CNT1_STRUC {\n\tstruct {\n\t    UINT16  TxRetransmit;\n\t    UINT16  TxSuccess;\n\t} field;\n\tUINT32 word;\n} TX_STA_CNT1_STRUC;\n#else\ntypedef\tunion _TX_STA_CNT1_STRUC {\n\tstruct {\n\t    UINT16  TxSuccess;\n\t    UINT16  TxRetransmit;\n\t} field;\n\tUINT32 word;\n} TX_STA_CNT1_STRUC;\n#endif\n\n\n/* TX_STA_CNT2: TX tx count */\n#define TX_STA_CNT2\t\t0x1714\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_STA_CNT2_STRUC {\n\tstruct {\n\t    UINT16  TxUnderFlowCount;\n\t    UINT16  TxZeroLenCount;\n\t} field;\n\tUINT32 word;\n} TX_STA_CNT2_STRUC;\n#else\ntypedef\tunion _TX_STA_CNT2_STRUC {\n\tstruct {\n\t    UINT16  TxZeroLenCount;\n\t    UINT16  TxUnderFlowCount;\n\t} field;\n\tUINT32 word;\n} TX_STA_CNT2_STRUC;\n#endif\n\n\n/* TX_STA_FIFO_STRUC: TX Result for specific PID status fifo register */\n#define TX_STA_FIFO\t\t0x1718\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_STA_FIFO_STRUC {\n\tstruct {\n\t\tUINT32\t\tReserve:2;\n\t\tUINT32\t\tiTxBF:1; /* iTxBF enable */\n\t\tUINT32\t\tSounding:1; /* Sounding enable */\n\t\tUINT32\t\teTxBF:1; /* eTxBF enable */\n\t\tUINT32\t\tSuccessRate:11;\t/*include MCS, mode ,shortGI, BW settingSame format as TXWI Word 0 Bit 31-16. */\n\t\tUINT32\t\twcid:8;\t\t/*wireless client index */\n\t\tUINT32       \tTxAckRequired:1;    /* ack required */\n\t\tUINT32       \tTxAggre:1;    /* Tx is aggregated */\n\t\tUINT32       \tTxSuccess:1;   /* Tx success. whether success or not */\n\t\tUINT32       \tPidType:4;\n\t\tUINT32       \tbValid:1;   /* 1:This register contains a valid TX result */\n\t} field;\n\tUINT32 word;\n} TX_STA_FIFO_STRUC;\n#else\ntypedef\tunion _TX_STA_FIFO_STRUC {\n\tstruct {\n\t\tUINT32       \tbValid:1;\n\t\tUINT32       \tPidType:4;\n\t\tUINT32       \tTxSuccess:1;\n\t\tUINT32       \tTxAggre:1;\n\t\tUINT32       \tTxAckRequired:1;\n\t\tUINT32\t\twcid:8;\n\t\tUINT32\t\tSuccessRate:11;\n\t\tUINT32\t\teTxBF:1;\n\t\tUINT32\t\tSounding:1;\n\t\tUINT32\t\tiTxBF:1;\n\t\tUINT32\t\tReserve:2;\n\t} field;\n\tUINT32 word;\n} TX_STA_FIFO_STRUC;\n#endif\n\n\n/* \n\tDebug counters\n*/\n#define TX_AGG_CNT\t\t0x171c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_NAG_AGG_CNT_STRUC {\n\tstruct {\n\t    UINT16  AggTxCount;\n\t    UINT16  NonAggTxCount;\n\t} field;\n\tUINT32 word;\n} TX_NAG_AGG_CNT_STRUC;\n#else\ntypedef\tunion _TX_NAG_AGG_CNT_STRUC {\n\tstruct {\n\t    UINT16  NonAggTxCount;\n\t    UINT16  AggTxCount;\n\t} field;\n\tUINT32 word;\n} TX_NAG_AGG_CNT_STRUC;\n#endif\n\n\n#define TX_AGG_CNT0\t0x1720\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT0_STRUC {\n\tstruct {\n\t    UINT16  AggSize2Count;\n\t    UINT16  AggSize1Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT0_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT0_STRUC {\n\tstruct {\n\t    UINT16  AggSize1Count;\n\t    UINT16  AggSize2Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT0_STRUC;\n#endif\n\n\n#define TX_AGG_CNT1\t0x1724\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT1_STRUC {\n\tstruct {\n\t    UINT16  AggSize4Count;\n\t    UINT16  AggSize3Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT1_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT1_STRUC {\n\tstruct {\n\t    UINT16  AggSize3Count;\n\t    UINT16  AggSize4Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT1_STRUC;\n#endif\n\n\n#define TX_AGG_CNT2\t0x1728\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT2_STRUC {\n\tstruct {\n\t    UINT16  AggSize6Count;\n\t    UINT16  AggSize5Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT2_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT2_STRUC {\n\tstruct {\n\t    UINT16  AggSize5Count;\n\t    UINT16  AggSize6Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT2_STRUC;\n#endif\n\n\n#define TX_AGG_CNT3\t0x172c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT3_STRUC {\n\tstruct {\n\t    UINT16  AggSize8Count;\n\t    UINT16  AggSize7Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT3_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT3_STRUC {\n\tstruct {\n\t    UINT16  AggSize7Count;\n\t    UINT16  AggSize8Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT3_STRUC;\n#endif\n\n\n#define TX_AGG_CNT4\t0x1730\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT4_STRUC {\n\tstruct {\n\t    UINT16  AggSize10Count;\n\t    UINT16  AggSize9Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT4_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT4_STRUC {\n\tstruct {\n\t    UINT16  AggSize9Count;\n\t    UINT16  AggSize10Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT4_STRUC;\n#endif\n\n\n#define TX_AGG_CNT5\t0x1734\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT5_STRUC {\n\tstruct {\n\t    UINT16  AggSize12Count;\n\t    UINT16  AggSize11Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT5_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT5_STRUC {\n\tstruct {\n\t    UINT16  AggSize11Count;\n\t    UINT16  AggSize12Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT5_STRUC;\n#endif\n\n\n#define TX_AGG_CNT6\t\t0x1738\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT6_STRUC {\n\tstruct {\n\t    UINT16  AggSize14Count;\n\t    UINT16  AggSize13Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT6_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT6_STRUC {\n\tstruct {\n\t    UINT16  AggSize13Count;\n\t    UINT16  AggSize14Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT6_STRUC;\n#endif\n\n\n#define TX_AGG_CNT7\t\t0x173c\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT7_STRUC {\n\tstruct {\n\t    UINT16  AggSize16Count;\n\t    UINT16  AggSize15Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT7_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT7_STRUC {\n\tstruct {\n\t    UINT16  AggSize15Count;\n\t    UINT16  AggSize16Count;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT7_STRUC;\n#endif\n\n\n#define TX_AGG_CNT8\t0x174c\t/* AGG_SIZE  = 17,18 */\n#define TX_AGG_CNT9\t0x1750\t/* AGG_SIZE  = 19,20 */\n#define TX_AGG_CNT10\t0x1754\t/* AGG_SIZE  = 21,22 */\n#define TX_AGG_CNT11\t0x1758\t/* AGG_SIZE  = 23,24 */\n#define TX_AGG_CNT12\t0x175c\t/* AGG_SIZE  = 25,26 */\n#define TX_AGG_CNT13\t0x1760\t/* AGG_SIZE  = 27,28 */\n#define TX_AGG_CNT14\t0x1764\t/* AGG_SIZE  = 29,30 */\n#define TX_AGG_CNT15\t0x1768\t/* AGG_SIZE  = 31,32 */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_AGG_CNT_STRUC {\n\tstruct {\n\t    UINT16  AggTxCount;\t/* the count of aggregation size = x + 1 */\n\t    UINT16  NonAggTxCount;\t/* the count of aggregation size = x */\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT_STRUC;\n#else\ntypedef\tunion _TX_AGG_CNT_STRUC {\n\tstruct {\n\t    UINT16  NonAggTxCount;\n\t    UINT16  AggTxCount;\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNT_STRUC;\n#endif\n\ntypedef\tunion _TX_AGG_CNTN_STRUC {\n\tstruct {\n#ifdef RT_BIG_ENDIAN\n\t    UINT16  AggSizeHighCount;\n\t    UINT16  AggSizeLowCount;\n#else\n\t    UINT16  AggSizeLowCount;\n\t    UINT16  AggSizeHighCount;\n#endif\n\t} field;\n\tUINT32 word;\n} TX_AGG_CNTN_STRUC;\n\n\n#define MPDU_DENSITY_CNT\t\t0x1740\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _MPDU_DEN_CNT_STRUC {\n\tstruct {\n\t    UINT16  RXZeroDelCount;\t/*RX zero length delimiter count */\n\t    UINT16  TXZeroDelCount;\t/*TX zero length delimiter count */\n\t} field;\n\tUINT32 word;\n} MPDU_DEN_CNT_STRUC;\n#else\ntypedef\tunion _MPDU_DEN_CNT_STRUC {\n\tstruct {\n\t    UINT16  TXZeroDelCount;\n\t    UINT16  RXZeroDelCount;\n\t} field;\n\tUINT32 word;\n} MPDU_DEN_CNT_STRUC;\n#endif\n\n\n#ifdef FIFO_EXT_SUPPORT\n/* TX_STA_FIFO_EXT_STRUC: TX retry cnt for specific frame */\n#define TX_STA_FIFO_EXT\t\t0x1798\t\t/* Only work after RT53xx */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _TX_STA_FIFO_EXT_STRUC {\n\tstruct {\n\t\tUINT32\t\tReserve:24;\n\t\tUINT32\t\ttxRtyCnt:8;   /* frame Tx retry cnt */\n\t} field;\n\tUINT32 word;\n} TX_STA_FIFO_EXT_STRUC;\n#else\ntypedef\tunion _TX_STA_FIFO_EXT_STRUC {\n\tstruct {\n\t\tUINT32\t\ttxRtyCnt:8;\n\t\tUINT32\t\tReserve:24;\n\t} field;\n\tUINT32 word;\n} TX_STA_FIFO_EXT_STRUC;\n#endif\n\n\n\n#define WCID_TX_CNT_0\t0x176c\n#define WCID_TX_CNT_1\t0x1770\n#define WCID_TX_CNT_2\t0x1774\n#define WCID_TX_CNT_3\t0x1778\n#define WCID_TX_CNT_4\t0x177c\n#define WCID_TX_CNT_5\t0x1780\n#define WCID_TX_CNT_6\t0x1784\n#define WCID_TX_CNT_7\t0x1788\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _WCID_TX_CNT_STRUC {\n\tstruct {\n\t\tUINT32\t\treTryCnt:16;\n\t\tUINT32\t\tsuccCnt:16;\n\t} field;\n\tUINT32 word;\n} WCID_TX_CNT_STRUC;\n#else\ntypedef\tunion _WCID_TX_CNT_STRUC {\n\tstruct {\n\t\tUINT32\t\tsuccCnt:16;\n\t\tUINT32\t\treTryCnt:16;\n\t} field;\n\tUINT32 word;\n} WCID_TX_CNT_STRUC;\n#endif\n\n\n#define WCID_MAPPING_0\t0x178c\n#define WCID_MAPPING_1\t0x1790\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _WCID_MAPPING_STRUC {\n\tstruct {\n\t\tUINT32\t\twcid3:8;\n\t\tUINT32\t\twcid2:8;\n\t\tUINT32\t\twcid1:8;\n\t\tUINT32\t\twcid0:8;\n\t} field;\n\tUINT32 word;\n} WCID_MAPPING_STRUC;\n#else\ntypedef\tunion _WCID_MAPPING_STRUC {\n\tstruct {\n\t\tUINT32\t\twcid0:8;\n\t\tUINT32\t\twcid1:8;\n\t\tUINT32\t\twcid2:8;\n\t\tUINT32\t\twcid3:8;\n\t} field;\n\tUINT32 word;\n} WCID_MAPPINGT_STRUC;\n#endif\n#endif /* FIFO_EXT_SUPPORT */\n\n\n\n/* Security key table memory, base address = 0x1000 */\n#define MAC_WCID_BASE\t\t0x1800 /*8-bytes(use only 6-bytes) * 256 entry = */\n#define HW_WCID_ENTRY_SIZE   8\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _SHAREDKEY_MODE_STRUC {\n\tstruct {\n\t\tUINT32       Bss1Key3CipherAlg:4;\n\t\tUINT32       Bss1Key2CipherAlg:4;\n\t\tUINT32       Bss1Key1CipherAlg:4;\n\t\tUINT32       Bss1Key0CipherAlg:4;\n\t\tUINT32       Bss0Key3CipherAlg:4;\n\t\tUINT32       Bss0Key2CipherAlg:4;\n\t\tUINT32       Bss0Key1CipherAlg:4;\n\t\tUINT32       Bss0Key0CipherAlg:4;\n\t} field;\n\tUINT32 word;\n} SHAREDKEY_MODE_STRUC;\n#else\ntypedef\tunion _SHAREDKEY_MODE_STRUC {\n\tstruct {\n\t\tUINT32       Bss0Key0CipherAlg:4;\n\t\tUINT32       Bss0Key1CipherAlg:4;\n\t\tUINT32       Bss0Key2CipherAlg:4;\n\t\tUINT32       Bss0Key3CipherAlg:4;\n\t\tUINT32       Bss1Key0CipherAlg:4;\n\t\tUINT32       Bss1Key1CipherAlg:4;\n\t\tUINT32       Bss1Key2CipherAlg:4;\n\t\tUINT32       Bss1Key3CipherAlg:4;\n\t} field;\n\tUINT32 word;\n} SHAREDKEY_MODE_STRUC;\n#endif\n\n\n/* 64-entry for pairwise key table, 8-byte per entry  */\ntypedef struct _HW_WCID_ENTRY {\n    UINT8   Address[6];\n    UINT8   Rsv[2];\n} HW_WCID_ENTRY;\n\n\n/* ================================================================================= */\n/* WCID  format */\n/* ================================================================================= */\n/*7.1\tWCID  ENTRY  format  : 8bytes */\ntypedef\tstruct _WCID_ENTRY_STRUC {\n\tUINT8\t\tRXBABitmap7;    /* bit0 for TID8, bit7 for TID 15 */\n\tUINT8\t\tRXBABitmap0;    /* bit0 for TID0, bit7 for TID 7 */\n\tUINT8\t\tMAC[6];\t/* 0 for shared key table.  1 for pairwise key table */\n} WCID_ENTRY_STRUC;\n\n\n/*8.1.1\tSECURITY  KEY  format  : 8DW */\n/* 32-byte per entry, total 16-entry for shared key table, 64-entry for pairwise key table */\ntypedef struct _HW_KEY_ENTRY {\n    UINT8   Key[16];\n    UINT8   TxMic[8];\n    UINT8   RxMic[8];\n} HW_KEY_ENTRY;\n\n\n/*8.1.2\tIV/EIV  format  : 2DW */\n\n/* RX attribute entry format  : 1DW */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _WCID_ATTRIBUTE_STRUC {\n\tstruct {\n\t\tUINT32\t\tWAPIKeyIdx:8;\n\t\tUINT32\t\tWAPI_rsv:8;\n\t\tUINT32\t\tWAPI_MCBC:1;\n\t\tUINT32\t\trsv:3;\n\t\tUINT32\t\tBSSIdxExt:1;\n\t\tUINT32\t\tPairKeyModeExt:1;\n\t\tUINT32\t\tRXWIUDF:3;\n\t\tUINT32\t\tBSSIdx:3; /*multipleBSS index for the WCID */\n\t\tUINT32\t\tPairKeyMode:3;\n\t\tUINT32\t\tKeyTab:1;\t/* 0 for shared key table.  1 for pairwise key table */\n\t} field;\n\tUINT32 word;\n} WCID_ATTRIBUTE_STRUC;\n#else\ntypedef\tunion _WCID_ATTRIBUTE_STRUC {\n\tstruct {\n\t\tUINT32\t\tKeyTab:1;\t/* 0 for shared key table.  1 for pairwise key table */\n\t\tUINT32\t\tPairKeyMode:3;\n\t\tUINT32\t\tBSSIdx:3; \t\t/*multipleBSS index for the WCID */\n\t\tUINT32\t\tRXWIUDF:3;\n\t\tUINT32\t\tPairKeyModeExt:1;\n\t\tUINT32\t\tBSSIdxExt:1;\n\t\tUINT32\t\trsv:3;\n\t\tUINT32\t\tWAPI_MCBC:1;\n\t\tUINT32\t\tWAPI_rsv:8;\n\t\tUINT32\t\tWAPIKeyIdx:8;\n\t} field;\n\tUINT32 word;\n} WCID_ATTRIBUTE_STRUC;\n#endif\n\n\n/* ================================================================================= */\n/* HOST-MCU communication data structure */\n/* ================================================================================= */\n\n/* H2M_MAILBOX_CSR: Host-to-MCU Mailbox */\n#ifdef RT_BIG_ENDIAN\ntypedef union _H2M_MAILBOX_STRUC {\n    struct {\n        UINT32       Owner:8;\n        UINT32       CmdToken:8;    /* 0xff tells MCU not to report CmdDoneInt after excuting the command */\n        UINT32       HighByte:8;\n        UINT32       LowByte:8;\n    } field;\n    UINT32 word;\n} H2M_MAILBOX_STRUC;\n#else\ntypedef union _H2M_MAILBOX_STRUC {\n    struct {\n        UINT32       LowByte:8;\n        UINT32       HighByte:8;\n        UINT32       CmdToken:8;\n        UINT32       Owner:8;\n    } field;\n    UINT32 word;\n} H2M_MAILBOX_STRUC;\n#endif\n\n\n/* M2H_CMD_DONE_CSR: MCU-to-Host command complete indication */\n#ifdef RT_BIG_ENDIAN\ntypedef union _M2H_CMD_DONE_STRUC {\n    struct {\n        UINT32       CmdToken3;\n        UINT32       CmdToken2;\n        UINT32       CmdToken1;\n        UINT32       CmdToken0;\n    } field;\n    UINT32 word;\n} M2H_CMD_DONE_STRUC;\n#else\ntypedef union _M2H_CMD_DONE_STRUC {\n    struct {\n        UINT32       CmdToken0;\n        UINT32       CmdToken1;\n        UINT32       CmdToken2;\n        UINT32       CmdToken3;\n    } field;\n    UINT32 word;\n} M2H_CMD_DONE_STRUC;\n#endif\n\n\n/* HOST_CMD_CSR: For HOST to interrupt embedded processor */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _HOST_CMD_CSR_STRUC {\n\tstruct {\n\t    UINT32   Rsv:24;\n\t    UINT32   HostCommand:8;\n\t} field;\n\tUINT32 word;\n} HOST_CMD_CSR_STRUC;\n#else\ntypedef\tunion _HOST_CMD_CSR_STRUC {\n\tstruct {\n\t    UINT32   HostCommand:8;\n\t    UINT32   Rsv:24;\n\t} field;\n\tUINT32 word;\n} HOST_CMD_CSR_STRUC;\n#endif\n\n\n// TODO: shiang-6590, Need to check following definitions are useful or not!!!\n/* AIFSN_CSR: AIFSN for each EDCA AC */\n\n\n/* E2PROM_CSR: EEPROM control register */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _E2PROM_CSR_STRUC {\n\tstruct {\n\t\tUINT32\t\tRsvd:25;\n\t\tUINT32       LoadStatus:1;   /* 1:loading, 0:done */\n\t\tUINT32\t\tType:1;\t\t\t/* 1: 93C46, 0:93C66 */\n\t\tUINT32\t\tEepromDO:1;\n\t\tUINT32\t\tEepromDI:1;\n\t\tUINT32\t\tEepromCS:1;\n\t\tUINT32\t\tEepromSK:1;\n\t\tUINT32\t\tReload:1;\t\t/* Reload EEPROM content, write one to reload, self-cleared. */\n\t} field;\n\tUINT32 word;\n} E2PROM_CSR_STRUC;\n#else\ntypedef\tunion _E2PROM_CSR_STRUC {\n\tstruct {\n\t\tUINT32\t\tReload:1;\n\t\tUINT32\t\tEepromSK:1;\n\t\tUINT32\t\tEepromCS:1;\n\t\tUINT32\t\tEepromDI:1;\n\t\tUINT32\t\tEepromDO:1;\n\t\tUINT32\t\tType:1;\n\t\tUINT32       LoadStatus:1;\n\t\tUINT32\t\tRsvd:25;\n\t} field;\n\tUINT32 word;\n} E2PROM_CSR_STRUC;\n#endif\n\n\n/* QOS_CSR0: TXOP holder address0 register */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _QOS_CSR0_STRUC {\n\tstruct {\n\t\tUINT8\t\tByte3;\t\t/* MAC address byte 3 */\n\t\tUINT8\t\tByte2;\t\t/* MAC address byte 2 */\n\t\tUINT8\t\tByte1;\t\t/* MAC address byte 1 */\n\t\tUINT8\t\tByte0;\t\t/* MAC address byte 0 */\n\t} field;\n\tUINT32 word;\n} QOS_CSR0_STRUC;\n#else\ntypedef\tunion _QOS_CSR0_STRUC {\n\tstruct {\n\t\tUINT8\t\tByte0;\n\t\tUINT8\t\tByte1;\n\t\tUINT8\t\tByte2;\n\t\tUINT8\t\tByte3;\n\t} field;\n\tUINT32 word;\n} QOS_CSR0_STRUC;\n#endif\n\n\n/* QOS_CSR1: TXOP holder address1 register */\n#ifdef RT_BIG_ENDIAN\ntypedef\tunion _QOS_CSR1_STRUC {\n\tstruct {\n\t\tUINT8\t\tRsvd1;\n\t\tUINT8\t\tRsvd0;\n\t\tUINT8\t\tByte5;\t\t/* MAC address byte 5 */\n\t\tUINT8\t\tByte4;\t\t/* MAC address byte 4 */\n\t} field;\n\tUINT32 word;\n} QOS_CSR1_STRUC;\n#else\ntypedef\tunion _QOS_CSR1_STRUC {\n\tstruct {\n\t\tUINT8\t\tByte4;\t\t/* MAC address byte 4 */\n\t\tUINT8\t\tByte5;\t\t/* MAC address byte 5 */\n\t\tUINT8\t\tRsvd0;\n\t\tUINT8\t\tRsvd1;\n\t} field;\n\tUINT32 word;\n} QOS_CSR1_STRUC;\n#endif\n\n// TODO: shiang-6590, check upper definitions are useful or not!\n\n\n\n/* Other on-chip shared memory space, base = 0x2000 */\n\n/* CIS space - base address = 0x2000 */\n#define HW_CIS_BASE             0x2000\n\n/* Carrier-sense CTS frame base address. It's where mac stores carrier-sense frame for carrier-sense function. */\n#define HW_CS_CTS_BASE\t\t\t0x7700\n/* DFS CTS frame base address. It's where mac stores CTS frame for DFS. */\n#define HW_DFS_CTS_BASE\t\t\t0x7780\n#define HW_CTS_FRAME_SIZE\t\t0x80\n\n/* 2004-11-08 john - since NULL frame won't be that long (256 byte). We steal 16 tail bytes */\n/* to save debugging settings */\n#define HW_DEBUG_SETTING_BASE   0x77f0  /* 0x77f0~0x77ff total 16 bytes */\n#define HW_DEBUG_SETTING_BASE2  0x7770  /* 0x77f0~0x77ff total 16 bytes */\n\n#ifdef WOW_SUPPORT\n/* WOW - NullFrame buffer */\n#define HW_NULL2_BASE\t\t\t0x7780\n#define GPIO_HOLDTIME_OFFSET    0x7020 /* Target is 0x7023 */\n#endif /* WOW_SUPPORT */\n\n/* \n\tOn-chip BEACON frame space -\n   \t1. HW_BEACON_OFFSET/64B must be 0;\n   \t2. BCN_OFFSETx(0~) must also be changed in MACRegTable(common/rtmp_init.c)\n */\n#define HW_BEACON_OFFSET\t\t0x0200 \n\n\n/* \tIn order to support maximum 8 MBSS and its maximum length is 512 for each beacon\n\tThree section discontinue memory segments will be used.\n\t1. The original region for BCN 0~3\n\t2. Extract memory from FCE table for BCN 4~5\n\t3. Extract memory from Pair-wise key table for BCN 6~7\n  \t\tIt occupied those memory of wcid 238~253 for BCN 6 \n\t\tand wcid 222~237 for BCN 7  \t*/\n/*#define HW_BEACON_MAX_COUNT     8 */\n#define HW_BEACON_MAX_SIZE(__pAd)      ((__pAd)->chipCap.BcnMaxHwSize)\n#define HW_BEACON_BASE0(__pAd)         ((__pAd)->chipCap.BcnBase[0])\n/*#define HW_BEACON_BASE1         0x7A00 */\n/*#define HW_BEACON_BASE2         0x7C00 */\n/*#define HW_BEACON_BASE3         0x7E00 */\n/*#define HW_BEACON_BASE4         0x7200 */\n/*#define HW_BEACON_BASE5         0x7400 */\n/*#define HW_BEACON_BASE6         0x5DC0 */\n/*#define HW_BEACON_BASE7         0x5BC0 */\n\n\n/* Higher 8KB shared memory */\n#define HW_BEACON_BASE0_REDIRECTION\t0x4000\n#define HW_BEACON_BASE1_REDIRECTION\t0x4200\n#define HW_BEACON_BASE2_REDIRECTION\t0x4400\n#define HW_BEACON_BASE3_REDIRECTION\t0x4600\n#define HW_BEACON_BASE4_REDIRECTION\t0x4800\n#define HW_BEACON_BASE5_REDIRECTION\t0x4A00\n#define HW_BEACON_BASE6_REDIRECTION\t0x4C00\n#define HW_BEACON_BASE7_REDIRECTION\t0x4E00\n\n\n/* HOST-MCU shared memory - base address = 0x2100 */\n#define HOST_CMD_CSR\t\t0x404\n#define H2M_MAILBOX_CSR         0x7010\n#define H2M_MAILBOX_CID         0x7014\n#define H2M_MAILBOX_STATUS      0x701c\n#define H2M_INT_SRC             0x7024\n#define H2M_BBP_AGENT           0x7028\n#define M2H_CMD_DONE_CSR        0x000c\n#define MCU_TXOP_ARRAY_BASE     0x000c   /* TODO: to be provided by Albert */\n#define MCU_TXOP_ENTRY_SIZE     32       /* TODO: to be provided by Albert */\n#define MAX_NUM_OF_TXOP_ENTRY   16       /* TODO: must be same with 8051 firmware */\n#define MCU_MBOX_VERSION        0x01     /* TODO: to be confirmed by Albert */\n#define MCU_MBOX_VERSION_OFFSET 5        /* TODO: to be provided by Albert */\n\n\n/* Host DMA registers - base address 0x200 .  TX0-3=EDCAQid0-3, TX4=HCCA, TX5=MGMT, */\n/*  DMA RING DESCRIPTOR */\n#define E2PROM_CSR          0x0004\n#define IO_CNTL_CSR         0x77d0\n\n\n\n/* ================================================================ */\n/* Tx /\tRx / Mgmt ring descriptor definition */\n/* ================================================================ */\n\n/* the following PID values are used to mark outgoing frame type in TXD->PID so that */\n/* proper TX statistics can be collected based on these categories */\n/* b3-2 of PID field - */\n#define PID_MGMT\t\t\t0x05\n#define PID_BEACON\t\t\t0x0c\n#define PID_DATA_NORMALUCAST\t \t0x02\n#define PID_DATA_AMPDU\t \t0x04\n#define PID_DATA_NO_ACK    \t0x08\n#define PID_DATA_NOT_NORM_ACK\t \t0x03\n/* value domain of pTxD->HostQId (4-bit: 0~15) */\n#define QID_AC_BK               1   /* meet ACI definition in 802.11e */\n#define QID_AC_BE               0   /* meet ACI definition in 802.11e */\n#define QID_AC_VI               2\n#define QID_AC_VO               3\n#define QID_HCCA                4\n#define NUM_OF_TX_RING          5\n#define QID_CTRL\t            9\n#define QID_MGMT                13\n#define QID_RX                  14\n#define QID_OTHER               15\n\n\n\n\n\n#define RTMP_MAC_SHR_MSEL_PROTECT_LOCK(__pAd, __IrqFlags)\t__IrqFlags = __IrqFlags;\n#define RTMP_MAC_SHR_MSEL_PROTECT_UNLOCK(__pAd, __IrqFlags) __IrqFlags = __IrqFlags;\n\n\n#ifdef RTMP_MAC_USB\n#ifdef DFS_SUPPORT\n#define BBPR127TABLE_OWNERID\t\t\t0x4CA0 \n#define BBPR127TABLE_OFFSET\t\t\t\t0x4D00\n#endif /* DFS_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n\nstruct _RTMP_ADAPTER;\n\nINT get_pkt_phymode_by_rxwi(RXWI_STRUC *rxwi);\nINT get_pkt_rssi_by_rxwi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *rxwi, INT size, CHAR *rssi);\nINT get_pkt_snr_by_rxwi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *rxwi, INT size, UCHAR *snr);\n\nINT rtmp_mac_set_band(struct _RTMP_ADAPTER *pAd, int  band);\nINT rtmp_mac_set_ctrlch(struct _RTMP_ADAPTER *pAd, INT extch);\nINT rtmp_mac_set_mmps(struct  _RTMP_ADAPTER *pAd, INT ReduceCorePower);\n\n#endif /* __RTMP_MAC_H__ */\n\n"
  },
  {
    "path": "src/include/mat.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    mat.h\n\n    Abstract:\n    Support AP-Client function.\n\n    Revision History:\n    Who               When            What\n    --------------    ----------      ----------------------------------------------\n    Shiang\t\t      02-26-2007      created\n*/\n\n#ifndef _MAT_H_\n#define _MAT_H_\n\n\n\n\n/*#if defined(LINUX) || defined (VXWORKS) */\n\n/*#else */\n/*Currently support upper layer protocols */\n#ifndef ETH_P_IP\n#define ETH_P_IP        0x0800          /* Internet Protocol packet     */\n#endif\n#ifndef ETH_P_ARP\n#define ETH_P_ARP       0x0806          /* Address Resolution packet    */\n#endif\n#ifndef ETH_P_PPP_DISC\n#define ETH_P_PPP_DISC  0x8863          /* PPPoE discovery messages     */\n#endif\n#ifndef ETH_P_PPP_SES\n#define ETH_P_PPP_SES   0x8864          /* PPPoE session messages       */\n#endif\n\n/* ARP protocol HARDWARE identifiers. */\n#ifndef ARPHRD_ETHER\n#define ARPHRD_ETHER    1               /* Ethernet 10Mbps              */\n#endif\n\n/* ARP protocol opcodes. */\n#ifndef ARPOP_REQUEST\n#define ARPOP_REQUEST   1               /* ARP request                  */\n#endif\n#ifndef ARPOP_REPLY\n#define ARPOP_REPLY     2               /* ARP reply                    */\n#endif\n\ntypedef struct _NET_PRO_ARP_HDR{\n\tunsigned short  ar_hrd;         /* format of hardware address   */\n\tunsigned short  ar_pro;         /* format of protocol address   */\n\tunsigned char   ar_hln;         /* length of hardware address   */\n\tunsigned char   ar_pln;         /* length of protocol address   */\n\tunsigned short  ar_op;          /* ARP opcode (command)         */\n} NET_PRO_ARP_HDR;\n\ntypedef struct _NET_PRO_IP_HDR{\n#ifndef RT_BIG_ENDIAN\n\tUCHAR   ihl:4,\n\t\t\tversion:4;\n#else\n\tUCHAR\tversion:4,\n\t\t\tihl:4;\n#endif\n\tUCHAR\ttos;\n\tUINT16\ttot_len;\n\tUINT16\tid;\n\tUINT16\tfrag_off;\n\tUCHAR\tttl;\n\tUCHAR\tprotocol;\n\tUINT16\tcheck;\n\tUINT16\tsaddr;\n\tUINT32\tdaddr;\n} NET_PRO_IP_HDR; \n/*#endif  //endif of __LINUX__ */\n\n#ifndef MAT_SUPPORT\n#error \"You should define MAT_SUPPORT if you want to compile MAT related functions!\"\n#endif\n\n\n/* MAT relate definition */\n#define MAT_MAX_HASH_ENTRY_SUPPORT\t\t64\n#define MAT_TB_ENTRY_AGEOUT_TIME\t\t  \t(5 * 60 * OS_HZ)\t/* 30000, 5min. MAT convert table entry age-out time interval. now set it as 5min. */\n\n\n/* 802.3 Ethernet related definition */\n#define MAT_ETHER_HDR_LEN\t\t14\t\t\t\t\t\t\t/* dstMac(6) + srcMac(6) + protoType(2) */\n#define MAT_VLAN_ETH_HDR_LEN \t(MAT_ETHER_HDR_LEN + 4)\t\t/* 4 for h_vlan_TCI and h_vlan_encapsulated_proto */\n\n#define MAT_MAC_ADDR_HASH(Addr)       (Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5])\n#define MAT_MAC_ADDR_HASH_INDEX(Addr) (MAT_MAC_ADDR_HASH(Addr) % MAT_MAX_HASH_ENTRY_SUPPORT)\n\n#define isMcastEtherAddr(addr)\t(addr[0] & 0x1)\n#define isBcastEtherAddr(addr)\t((addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5])== 0xff)\n#define isZeroEtherAddr(addr)\t(!(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]))\n\n#define IS_GROUP_MAC(Addr)\t\t((Addr[0]) & 0x01)\n#define IS_UCAST_MAC(addr)\t\t(!(isMcastEtherAddr(addr) || isZeroEtherAddr(addr))) /* isUcastMac = !(00:00:00:00:00:00 || mcastMac); */\n#define IS_EQUAL_MAC(a, b)\t\t(((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5])) == 0)\n\n#define IS_VLAN_PACKET(pkt)\t\t((((pkt)[12] << 8) | (pkt)[13]) == 0x8100)\n\n/* IPv4 related definition */\n#define IPMAC_TB_HASH_ENTRY_NUM\t\t\t(MAT_MAX_HASH_ENTRY_SUPPORT+1)\t/* One entry for broadcast address */\n#define IPMAC_TB_HASH_INDEX_OF_BCAST \tMAT_MAX_HASH_ENTRY_SUPPORT\t\t/* cause hash index start from 0. */\n\n#define MAT_IP_ADDR_HASH(Addr)\t\t(((Addr>>24)&0xff)^((Addr>>16) & 0xff) ^((Addr>>8) & 0xff) ^ (Addr & 0xff))\n#define MAT_IP_ADDR_HASH_INDEX(Addr)\t(MAT_IP_ADDR_HASH(Addr) % MAT_MAX_HASH_ENTRY_SUPPORT)\n\n#define IS_GOOD_IP(IP)\t(IP!= 0)\n#define IS_MULTICAST_IP(IP)\t(((UINT32)(IP) & 0xf0000000) == 0xe0000000)\n\n/* IPv6 related definition */\n#define IPV6MAC_TB_HASH_ENTRY_NUM \t\t(MAT_MAX_HASH_ENTRY_SUPPORT+1)\t/* One entry for broadcast address */\n#define IPV6MAC_TB_HASH_INDEX_OF_BCAST \tMAT_MAX_HASH_ENTRY_SUPPORT\t\t/* cause hash index start from 0. */\n\n/*We just use byte 10,13,14,15 to calculate the IPv6 hash, because the byte 11,12 usually are 0xff, 0xfe for link-local address. */\n#define MAT_IPV6_ADDR_HASH(Addr)    ((Addr[10]&0xff) ^ (Addr[13] & 0xff) ^(Addr[14] & 0xff) ^ (Addr[15] & 0xff))\n#define MAT_IPV6_ADDR_HASH_INDEX(Addr)\t(MAT_IPV6_ADDR_HASH(Addr) % MAT_MAX_HASH_ENTRY_SUPPORT)\n\n#define IS_UNSPECIFIED_IPV6_ADDR(_addr)\t\\\n\t\t(!((_addr).ipv6_addr32[0] | (_addr).ipv6_addr32[1] | (_addr).ipv6_addr32[2] | (_addr).ipv6_addr32[3]))\n\n#define IS_LOOPBACK_IPV6_ADDR(_addr) \\\n\t\t(NdisEqualMemory((UCHAR *)(&((_addr).ipv6_addr[0])), &IPV6_LOOPBACKADDR[0], IPV6_ADDR_LEN))\n#define IS_MULTICAST_IPV6_ADDR(_addr) \\\n\t\t(((_addr).ipv6_addr[0] & 0xff) == 0xff)\n\n/* The MAT_TABLE used for MacAddress <-> UpperLayer Address Translation. */\ntypedef struct _MAT_TABLE_\n{\n\tVOID\t*IPMacTable;\t\t/* IPv4 Address, Used for IP, ARP protocol */\n\tVOID\t*IPv6MacTable;\t\t/* IPv6 Address, Used for IPv6 related protocols */\n\tVOID\t*SesMacTable;\t\t/* PPPoE Session */\n\tVOID\t*UidMacTable;\t\t/* PPPoE Discovery */\n}MAT_TABLE, *PMAT_TABLE;\n\n\ntypedef enum _MAT_ENGINE_STATUS_\n{\n\tMAT_ENGINE_STAT_UNKNOWN = 0,\n\tMAT_ENGINE_STAT_INITED = 1,\n\tMAT_ENGINE_STAT_EXITED = 2,\n}MAT_ENGINE_STATUS;\n\n\ntypedef struct _MAT_STRUCT_\n{\n\tMAT_ENGINE_STATUS\tstatus;\n\tNDIS_SPIN_LOCK \t\tMATDBLock;\n\tMAT_TABLE\t\t\tMatTableSet;\n#ifdef KMALLOC_BATCH\n\tUCHAR \t\t\t\t*pMATNodeEntryPoll;\n#endif\n\tUINT32\t\t\t\tnodeCount;\t\t/* the number of nodes which connect to Internet via us. */\n\tVOID\t\t\t\t*pPriv;\n}MAT_STRUCT;\n\n\ntypedef struct _MATProtoOps\n{\n\tNDIS_STATUS \t(*init)(MAT_STRUCT *pMatCfg);\n\tPUCHAR\t\t\t(*tx)(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);\n\tPUCHAR\t\t\t(*rx)(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);\n\tNDIS_STATUS\t\t(*exit)(MAT_STRUCT *pMatCfg);\n}MATProtoOps, *PMATProtoOps;\n\n\ntypedef struct _MATProtoTable\n{\n\tUSHORT \t\t\tprotocol;\n\tMATProtoOps\t\t*pHandle;\n}MATProtoTable, *PMATProtoTable;\n\n\nVOID dumpPkt(PUCHAR pHeader, int len);\n\n/*#define KMALLOC_BATCH */\n\nPUCHAR MATDBEntryAlloc(\n\tIN MAT_STRUCT \t*pMatStruct, \n\tIN UINT32 \t\tsize);\n\nNDIS_STATUS MATDBEntryFree(\n\tIN MAT_STRUCT \t*pMatStruct, \n\tIN PUCHAR \t\tNodeEntry);\n\n\t\t\n#endif /* _MAT_H_ */\n\n"
  },
  {
    "path": "src/include/mcu/MT7601_firmware.h",
    "content": "/* AUTO GEN PLEASE DO NOT MODIFY IT */ \n/* AUTO GEN PLEASE DO NOT MODIFY IT */ \n\n\nUCHAR MT7601_FirmwareImage[] = {\n0x44, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x76, 0x00, 0x01, 0x41, 0x76, 0x06, 0x02, \n0x32, 0x30, 0x31, 0x33, 0x30, 0x32, 0x30, 0x35, 0x32, 0x31, 0x34, 0x36, 0x5f, 0x5f, 0x5f, 0x5f, \n0x48, 0x00, 0x00, 0x52, 0x48, 0x00, 0x00, 0x1e, 0x48, 0x00, 0x00, 0x1c, 0x48, 0x00, 0x00, 0x1a, \n0x48, 0x00, 0x00, 0x18, 0x48, 0x00, 0x00, 0x16, 0x48, 0x00, 0x00, 0x14, 0x48, 0x00, 0x00, 0x12, \n0x48, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x0e, 0x48, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x0a, \n0x48, 0x00, 0x00, 0x08, 0x48, 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x04, 0x48, 0x00, 0x00, 0x02, \n0x92, 0x00, 0x48, 0x00, 0x00, 0x00, 0x92, 0x00, 0x3a, 0x0f, 0xab, 0xbc, 0x3a, 0xff, 0xbc, 0x3c, \n0x64, 0x62, 0x04, 0x02, 0x64, 0x72, 0xa4, 0x02, 0x64, 0x82, 0x00, 0x02, 0x3a, 0x6f, 0xa0, 0x3c, \n0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x01, 0x54, 0xb4, 0x00, 0x15, 0xf0, 0x00, 0x00, 0x46, 0x10, \n0x00, 0x05, 0x58, 0x10, 0x89, 0xf0, 0xdd, 0x21, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x01, 0x54, \n0xb4, 0x00, 0x05, 0xf0, 0x00, 0x00, 0x3a, 0x6f, 0xa0, 0x04, 0x64, 0x62, 0x04, 0x03, 0x64, 0x72, \n0xa4, 0x03, 0x64, 0x82, 0x00, 0x03, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x0f, 0xab, 0x84, 0x64, 0x00, \n0x00, 0x04, 0x92, 0x00, 0x84, 0x0a, 0x64, 0x02, 0x00, 0x03, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, \n0x02, 0x00, 0x44, 0x10, 0x04, 0x01, 0xa8, 0x41, 0x84, 0x00, 0x64, 0x02, 0x24, 0x03, 0x46, 0x0c, \n0x00, 0x00, 0x58, 0x00, 0x00, 0x02, 0x64, 0x03, 0x00, 0x03, 0x47, 0xf0, 0x00, 0x0f, 0x59, 0xff, \n0x8f, 0x00, 0x46, 0x00, 0x00, 0x0a, 0x58, 0x00, 0x06, 0xe0, 0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, \n0x8e, 0xe0, 0x84, 0x40, 0xd5, 0x02, 0xaa, 0x81, 0x4c, 0x10, 0x7f, 0xff, 0x46, 0x00, 0x00, 0x0b, \n0x58, 0x00, 0x01, 0x50, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x81, 0x94, 0x84, 0x40, 0xd5, 0x02, \n0xaa, 0x81, 0x4c, 0x10, 0x7f, 0xff, 0x48, 0x00, 0x2b, 0xf3, 0x92, 0x00, 0x84, 0x80, 0xa8, 0xc5, \n0xa9, 0x01, 0xa8, 0x46, 0xa8, 0x84, 0xb6, 0x80, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0xb4, 0x20, 0xc1, 0x17, 0xa1, 0x41, 0x84, 0x80, 0xa9, 0x49, 0xb6, 0x25, 0xb6, 0x80, \n0xa9, 0x01, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x40, 0xa0, 0xc2, 0xb4, 0x20, 0x9e, 0x99, \n0xa8, 0x82, 0x4c, 0x10, 0x40, 0x08, 0xa0, 0x0b, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x90, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x27, 0x83, 0x93, 0x80, 0xe0, 0xc2, 0x11, 0x80, 0x02, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x90, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, \n0x83, 0x93, 0x80, 0x27, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x80, 0x18, 0xdd, 0x2f, 0xec, 0x04, \n0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x8f, 0x30, 0xdd, 0x2f, 0x46, 0x17, 0xff, 0xff, 0x58, 0x10, 0x8f, 0xff, \n0x46, 0x20, 0x00, 0x0d, 0x58, 0x21, 0x0e, 0x40, 0x81, 0x00, 0x40, 0xa0, 0x04, 0x00, 0x44, 0x00, \n0xea, 0x60, 0x14, 0xa1, 0x00, 0x04, 0x80, 0xe2, 0xb4, 0xc2, 0x41, 0xc4, 0x00, 0x00, 0xd5, 0x2e, \n0xa0, 0x32, 0x40, 0x34, 0x00, 0x01, 0x4e, 0x35, 0x00, 0x21, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x81, 0x1c, 0xdd, 0x2f, 0xa4, 0x36, 0xc0, 0x10, 0x9e, 0x01, 0xac, 0x36, 0x15, 0xc3, \n0x00, 0x02, 0x05, 0xe3, 0x80, 0x01, 0xa9, 0xb9, 0xb6, 0xe6, 0x15, 0xe3, 0x00, 0x01, 0xb6, 0xde, \n0xa1, 0x7a, 0x9d, 0x29, 0xa9, 0x3a, 0xd5, 0x06, 0xa0, 0xb6, 0xc2, 0x04, 0xa0, 0x75, 0xa0, 0x34, \n0xdd, 0x22, 0x14, 0xa3, 0x80, 0x04, 0xd5, 0x09, 0xa0, 0xbc, 0x40, 0x90, 0x08, 0x01, 0x4e, 0x95, \n0x00, 0x03, 0xd5, 0x02, 0xa8, 0x3c, 0x81, 0x26, 0xb4, 0xc9, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, \n0x8e, 0x40, 0x4c, 0x64, 0xff, 0xcf, 0xb4, 0xa6, 0xd6, 0x09, 0xa0, 0xf4, 0x40, 0x01, 0xa0, 0x01, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x5c, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x80, 0xe1, 0x44, 0x10, 0xea, 0x60, \n0x80, 0xc0, 0xe2, 0x27, 0xe8, 0x0e, 0x40, 0x03, 0x84, 0x57, 0x44, 0x2f, 0x15, 0xa0, 0x96, 0x01, \n0x42, 0x70, 0x08, 0x73, 0xac, 0x36, 0xcf, 0x07, 0x9e, 0xc1, 0xac, 0xf6, 0x80, 0xe1, 0xd5, 0x03, \n0x84, 0x20, 0xac, 0x46, 0x46, 0x80, 0x00, 0x0d, 0x58, 0x84, 0x0e, 0x40, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x8f, 0x30, 0xdd, 0x2f, 0xb4, 0x88, 0x40, 0x90, 0x1c, 0x00, 0x4c, 0x44, 0x00, 0x08, \n0x05, 0xe4, 0x00, 0x04, 0x40, 0x54, 0xf8, 0x01, 0x4e, 0x54, 0x00, 0x0c, 0x46, 0xf0, 0x00, 0x0d, \n0x14, 0x97, 0x83, 0x94, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x5c, 0xdd, 0x2f, \n0xb4, 0x06, 0x14, 0x93, 0x00, 0x02, 0xc8, 0x0f, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x47, 0x83, 0x91, \n0x14, 0x64, 0x00, 0x01, 0xb7, 0x06, 0xa9, 0x31, 0xb6, 0xc4, 0x04, 0x14, 0x00, 0x02, 0x9c, 0xc9, \n0x14, 0x34, 0x00, 0x02, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x40, 0xa0, 0x33, 0x84, 0x20, 0xa8, 0x72, 0xb6, 0xc6, \n0xa9, 0xb1, 0xc8, 0x08, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0x20, 0xdd, 0x2f, 0xa8, 0x33, \n0xd5, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x90, 0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, 0xa0, 0x32, 0xc8, 0x02, 0xd5, 0x09, \n0x9e, 0x01, 0xa8, 0x32, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0xf8, 0xdd, 0x2f, \n0x80, 0xc0, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, 0x80, 0x06, \n0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, 0x80, 0xc0, \n0x50, 0x0f, 0x80, 0x04, 0x80, 0xe1, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, \n0xa0, 0xb2, 0x80, 0x06, 0x9c, 0x51, 0xa8, 0x72, 0x80, 0x27, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8b, 0xec, 0xdd, 0x2f, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, \n0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x00, 0x00, 0x0d, \n0x58, 0x00, 0x0e, 0x54, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0xe4, 0xdd, 0x2f, 0x46, 0x70, \n0x00, 0x0b, 0x58, 0x73, 0x81, 0x70, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0b, 0xa0, 0x46, 0x80, \n0x00, 0x00, 0x58, 0x84, 0x03, 0x68, 0xa9, 0xf2, 0x80, 0x26, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, \n0x0e, 0x54, 0x4b, 0xe0, 0x20, 0x01, 0x50, 0x73, 0x86, 0x40, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, \n0x86, 0xf0, 0x8c, 0xd8, 0xdf, 0xf1, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x64, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8b, 0xe4, 0xdd, 0x2f, 0x46, 0x70, 0x00, 0x0d, 0x58, 0x73, 0x86, 0xf0, \n0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0c, 0x30, 0x46, 0x80, 0x00, 0x00, 0x58, 0x84, 0x03, 0x68, \n0xa9, 0xf2, 0x80, 0x26, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x64, 0x4b, 0xe0, 0x20, 0x01, \n0x50, 0x73, 0x80, 0xc8, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8b, 0xa0, 0x8c, 0xd8, 0xdf, 0xf1, \n0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x30, 0x04, 0x00, \n0xb4, 0x43, 0x44, 0x50, 0x76, 0x10, 0x40, 0x01, 0x40, 0x09, 0xd8, 0x07, 0x83, 0xc3, 0x04, 0x5f, \n0x00, 0x41, 0x42, 0x42, 0xd0, 0x0b, 0xc4, 0x0f, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8f, 0x9c, \n0xdd, 0x2f, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x07, 0x81, 0x64, 0x46, 0xf0, 0x00, 0x0b, \n0x10, 0x07, 0x81, 0x63, 0x46, 0x60, 0x00, 0x03, 0x58, 0x63, 0x01, 0xf8, 0x44, 0x00, 0x00, 0x10, \n0x46, 0x10, 0x00, 0x03, 0x58, 0x10, 0x84, 0x38, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x11, 0x46, 0x10, \n0x00, 0x03, 0x58, 0x10, 0x84, 0x48, 0xdd, 0x26, 0x84, 0x00, 0x46, 0x10, 0x00, 0x03, 0x58, 0x10, \n0x84, 0x58, 0xdd, 0x26, 0x84, 0x01, 0x46, 0x10, 0x00, 0x03, 0x58, 0x10, 0x84, 0x68, 0xdd, 0x26, \n0x44, 0x00, 0x00, 0x19, 0x46, 0x10, 0x00, 0x03, 0x58, 0x10, 0x84, 0x78, 0xdd, 0x26, 0x46, 0x10, \n0x00, 0x03, 0x58, 0x10, 0x85, 0x74, 0x44, 0x00, 0x00, 0x18, 0xdd, 0x26, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x83, 0xa8, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x83, 0x44, 0xdd, 0x2f, 0x84, 0xc0, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x8c, 0xb0, 0xdd, 0x2f, 0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, 0x8e, 0x74, 0x84, 0x80, 0x10, 0x41, \n0x82, 0xa8, 0x14, 0x61, 0x80, 0x2d, 0x50, 0x01, 0x82, 0xaa, 0x80, 0x26, 0x84, 0x48, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x46, 0x30, 0x04, 0x10, 0x58, 0x31, 0x88, 0x00, \n0xa9, 0x9c, 0x46, 0x00, 0x30, 0x00, 0xa1, 0x5b, 0x40, 0x42, 0x80, 0x04, 0xa9, 0x1b, 0x3a, 0x6f, \n0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0x3c, 0x96, 0x00, 0x96, 0x48, 0x95, 0x82, 0x99, 0x71, \n0x44, 0x32, 0x0d, 0x60, 0x99, 0x2b, 0x00, 0x31, 0x00, 0x40, 0x95, 0x25, 0x84, 0xa0, 0x38, 0x71, \n0x14, 0x00, 0x99, 0xac, 0xaf, 0xf0, 0x9d, 0x69, 0x44, 0x70, 0x00, 0x10, 0xdf, 0xf9, 0x9b, 0x94, \n0x50, 0x52, 0x00, 0x18, 0x50, 0x22, 0x00, 0x10, 0x38, 0x73, 0x08, 0x00, 0x18, 0x71, 0x00, 0x01, \n0xda, 0xfc, 0x50, 0x42, 0x00, 0x20, 0x38, 0x23, 0x14, 0x00, 0x18, 0x22, 0x80, 0x01, 0xdc, 0xfc, \n0x46, 0x40, 0x01, 0x06, 0x40, 0x20, 0x04, 0x09, 0x58, 0x42, 0x0c, 0x00, 0x99, 0x54, 0x94, 0xaa, \n0x97, 0x04, 0xb4, 0x02, 0xcc, 0x1d, 0xc9, 0x05, 0x54, 0x31, 0x80, 0x0f, 0x84, 0xd0, 0xd5, 0x39, \n0x84, 0xa1, 0xd9, 0x07, 0x54, 0x11, 0x80, 0x0f, 0x94, 0xcc, 0x44, 0x6f, 0xff, 0x0f, 0xd5, 0x31, \n0x84, 0x82, 0x54, 0x31, 0x80, 0x0f, 0x4c, 0x12, 0x40, 0x07, 0x40, 0x31, 0xa0, 0x08, 0x44, 0x6f, \n0xf0, 0xff, 0xd5, 0x27, 0x40, 0x31, 0xb0, 0x08, 0x44, 0x1f, 0x0f, 0xff, 0xd5, 0x2b, 0xc9, 0x0c, \n0x46, 0x5f, 0xff, 0x0f, 0x54, 0x31, 0x80, 0x0f, 0x58, 0x52, 0x8f, 0xff, 0x40, 0x31, 0xc0, 0x08, \n0x40, 0x00, 0x14, 0x02, 0xd5, 0x21, 0x84, 0xa1, 0xd9, 0x0a, 0x54, 0x11, 0x80, 0x0f, 0x40, 0x30, \n0xd0, 0x08, 0x46, 0x1f, 0xf0, 0xff, 0x58, 0x10, 0x8f, 0xff, 0xd5, 0x14, 0x84, 0xa2, 0xd9, 0x0c, \n0x54, 0x61, 0x80, 0x0f, 0x40, 0x33, 0x60, 0x08, 0x46, 0x6f, 0x0f, 0xff, 0x58, 0x63, 0x0f, 0xff, \n0x40, 0x00, 0x18, 0x02, 0xd5, 0x09, 0x46, 0x10, 0xff, 0xff, 0x40, 0x31, 0xf0, 0x08, 0x58, 0x10, \n0x8f, 0xff, 0x40, 0x00, 0x04, 0x02, 0x40, 0x00, 0x0c, 0x04, 0xb6, 0x02, 0x3a, 0x6f, 0x9c, 0x04, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x02, 0x10, 0x00, 0x0a, 0xa1, 0x84, \n0x5c, 0xf0, 0x80, 0x66, 0xe9, 0x2a, 0x51, 0xc0, 0xff, 0x9a, 0x84, 0xe0, 0x46, 0xa0, 0x01, 0x02, \n0x58, 0xa5, 0x06, 0xd4, 0x80, 0x06, 0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, 0x80, 0x14, 0x84, 0x46, \n0x4b, 0xe0, 0x28, 0x01, 0xc8, 0x15, 0x81, 0x20, 0x50, 0x83, 0x00, 0x06, 0x80, 0x08, 0x46, 0x10, \n0x00, 0x0e, 0x58, 0x10, 0x81, 0x28, 0x84, 0x46, 0x8d, 0x21, 0x4b, 0xe0, 0x28, 0x01, 0xc8, 0x09, \n0x44, 0x50, 0x00, 0x10, 0x8d, 0x06, 0x4c, 0x92, 0xff, 0xf3, 0x84, 0x01, 0xd5, 0x07, 0x9d, 0xb1, \n0x9d, 0xf9, 0x40, 0xfe, 0x1c, 0x06, 0xe8, 0xdf, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x44, 0x30, 0x01, 0x0c, 0x54, 0xa0, \n0x80, 0xff, 0x42, 0x65, 0x0c, 0x24, 0x54, 0x91, 0x00, 0xff, 0x44, 0x20, 0x00, 0x43, 0x42, 0x64, \n0x88, 0x73, 0x97, 0xc0, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0f, 0xa4, 0x99, 0xb0, 0x84, 0x20, \n0x97, 0x20, 0x80, 0x06, 0x81, 0x05, 0xf4, 0x81, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, \n0xdd, 0x2f, 0x84, 0x24, 0x4c, 0x70, 0xc0, 0x04, 0x84, 0x03, 0xd5, 0x09, 0x84, 0x46, 0x4c, 0x71, \n0x40, 0x04, 0x84, 0x04, 0xd5, 0x04, 0x84, 0xab, 0xdf, 0x04, 0x84, 0x02, 0x10, 0x03, 0x00, 0x40, \n0x41, 0xe0, 0x88, 0x08, 0x11, 0xe3, 0x00, 0x41, 0x80, 0x28, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, \n0x86, 0xa4, 0x80, 0x06, 0x80, 0x5e, 0xdd, 0x27, 0x01, 0xc3, 0x00, 0x40, 0x84, 0x23, 0x4d, 0xc0, \n0xc0, 0x1b, 0xf4, 0x01, 0x50, 0x54, 0x00, 0x18, 0x50, 0x33, 0x00, 0x10, 0x8d, 0x10, 0x51, 0xc3, \n0x00, 0x18, 0xc4, 0x09, 0xb6, 0xbf, 0x80, 0x03, 0x80, 0x28, 0x84, 0x48, 0xdd, 0x27, 0xb4, 0x3f, \n0x80, 0x1c, 0xd5, 0x07, 0x80, 0x25, 0x80, 0x03, 0x84, 0x48, 0xdd, 0x27, 0x80, 0x1c, 0x80, 0x28, \n0x84, 0x48, 0xdd, 0x27, 0x80, 0x0a, 0x80, 0x29, 0x80, 0x46, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, \n0x85, 0x44, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, \n0x44, 0x30, 0x01, 0x0c, 0x97, 0x00, 0x42, 0x62, 0x0c, 0x24, 0x46, 0x20, 0x00, 0x0d, 0x58, 0x21, \n0x0f, 0xa4, 0x99, 0xb2, 0x81, 0x01, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x43, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x07, 0x80, 0xb1, \n0x84, 0xa4, 0xd8, 0x03, 0x84, 0x03, 0xd5, 0x04, 0x84, 0xa6, 0xd8, 0x24, 0x84, 0x04, 0x45, 0xe0, \n0x00, 0x10, 0x10, 0x03, 0x00, 0x40, 0x11, 0xe3, 0x00, 0x41, 0x50, 0x14, 0x00, 0x20, 0x46, 0x70, \n0x01, 0x02, 0x58, 0x73, 0x86, 0xa4, 0x80, 0x06, 0x80, 0x5e, 0x4b, 0xe0, 0x1c, 0x01, 0x00, 0x03, \n0x00, 0x40, 0x84, 0xa3, 0xd8, 0x0f, 0x50, 0x14, 0x00, 0x38, 0x84, 0x48, 0x50, 0x03, 0x00, 0x10, \n0x4b, 0xe0, 0x1c, 0x01, 0x50, 0x03, 0x00, 0x18, 0x50, 0x14, 0x00, 0x30, 0x84, 0x48, 0x4b, 0xe0, \n0x1c, 0x01, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xdc, 0x97, 0x20, \n0x55, 0xc0, 0x80, 0xff, 0x54, 0x91, 0x00, 0xff, 0x96, 0xd8, 0xc4, 0x44, 0x84, 0x23, 0x4c, 0x30, \n0x80, 0x05, 0x84, 0x45, 0x4c, 0x31, 0x40, 0x70, 0x85, 0x40, 0x80, 0xe0, 0x81, 0x2a, 0x81, 0x0a, \n0x80, 0xdf, 0xd5, 0x30, 0xa6, 0x38, 0x44, 0x30, 0x00, 0xdd, 0x4c, 0x01, 0xc0, 0x26, 0x9c, 0x3a, \n0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, 0x8f, 0xf0, 0x84, 0x43, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x86, 0xd4, 0xdd, 0x2f, 0xc8, 0x19, 0xa7, 0x7d, 0x87, 0xc1, 0x4c, 0x5f, 0x40, 0x16, 0xa7, 0x39, \n0x00, 0x93, 0x80, 0x06, 0x50, 0x82, 0x7f, 0xfa, 0x54, 0x84, 0x00, 0xff, 0x50, 0x13, 0x80, 0x08, \n0x80, 0x1f, 0x80, 0x48, 0x54, 0x94, 0x80, 0x03, 0xe7, 0x10, 0xe9, 0x40, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xa6, 0xb9, 0x9c, 0x52, 0x89, 0x41, 0x99, 0xf9, 0x54, 0xa5, \n0x00, 0xff, 0xa7, 0x79, 0x9c, 0xea, 0x40, 0x01, 0xa8, 0x00, 0x40, 0xfe, 0x00, 0x07, 0xe8, 0xcb, \n0xd5, 0x0f, 0x84, 0xc5, 0x4c, 0x33, 0x40, 0x30, 0x80, 0x20, 0x80, 0x5c, 0x80, 0x1f, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xe7, 0x24, 0xe8, 0x20, 0x81, 0x1c, 0x46, 0x60, \n0x00, 0x0d, 0x58, 0x63, 0x0e, 0x74, 0x80, 0x48, 0x80, 0x3f, 0x50, 0x03, 0x01, 0x10, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x84, 0x20, 0x00, 0x03, 0x02, 0x3e, 0x10, 0x93, \n0x02, 0x3c, 0x80, 0x49, 0x50, 0x53, 0x01, 0x10, 0x80, 0x61, 0x80, 0x81, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x86, 0xb4, 0xdd, 0x2f, 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x24, 0x3a, 0x6f, \n0xaa, 0x84, 0xdd, 0x9e, 0x85, 0x20, 0x81, 0x09, 0xd5, 0xdb, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0x94, 0x85, 0x40, 0x80, 0xc2, 0x55, 0xc0, 0x00, 0xff, 0x44, 0x00, 0x02, 0x00, 0x81, 0x21, \n0x14, 0xaf, 0x80, 0x19, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8c, 0x14, 0xdd, 0x2f, 0xa7, 0x32, \n0xa6, 0x73, 0x40, 0x32, 0x20, 0x08, 0x40, 0x21, 0x84, 0x04, 0x9c, 0x94, 0x50, 0x1f, 0x80, 0x64, \n0x80, 0x66, 0x84, 0x9f, 0x50, 0x8f, 0x80, 0x54, 0x80, 0xe0, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x8a, 0xd0, 0xdd, 0x2f, 0x80, 0x2a, 0x80, 0x08, 0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x84, 0x02, 0x4d, 0xc0, 0x40, 0x1a, 0x50, 0xaf, 0x80, 0x04, \n0xf3, 0x19, 0x80, 0x09, 0x80, 0x47, 0x80, 0x8a, 0x44, 0x50, 0x00, 0x14, 0x9e, 0x6c, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x82, 0x70, 0xdd, 0x2f, 0x80, 0x08, 0x80, 0x2a, 0x44, 0x20, 0x00, 0x10, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xd5, 0x0d, 0x44, 0x10, 0x00, 0x10, \n0xf3, 0x19, 0x80, 0x09, 0x80, 0x88, 0x80, 0x47, 0x80, 0xa1, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x81, 0x2c, 0xdd, 0x2f, 0x50, 0x1f, 0x80, 0x54, 0x44, 0x20, 0x00, 0x10, 0x50, 0x03, 0x00, 0x51, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8c, 0x28, 0xdd, 0x2f, 0xec, 0x6c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x87, 0x80, 0xb3, 0xf6, 0x0c, \n0x84, 0xe3, 0x85, 0x21, 0x84, 0xa0, 0x44, 0x00, 0x00, 0x5f, 0xaf, 0xf1, 0x10, 0x93, 0x00, 0x00, \n0xaf, 0x72, 0xae, 0x33, 0x83, 0x83, 0xf4, 0x81, 0x97, 0xc8, 0x96, 0x90, 0x4e, 0x82, 0x00, 0x04, \n0x84, 0x02, 0xd5, 0x02, 0x84, 0x1e, 0xae, 0x34, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x17, 0x80, 0xb4, \n0xc1, 0x03, 0x85, 0x23, 0xd5, 0x0d, 0x46, 0xf0, 0x00, 0x0e, 0x01, 0xe7, 0x80, 0xb1, 0x84, 0x81, \n0x56, 0x3f, 0x00, 0x06, 0x85, 0x42, 0x40, 0x95, 0x0c, 0x1a, 0x40, 0x92, 0x0c, 0x1b, 0xa7, 0x76, \n0x40, 0x02, 0x8c, 0x09, 0x94, 0x03, 0x40, 0x00, 0x24, 0x04, 0xae, 0x36, 0xe6, 0xe5, 0xe9, 0x04, \n0x42, 0x00, 0x0c, 0x09, 0xd5, 0x03, 0x58, 0x00, 0x00, 0x08, 0xae, 0x36, 0x4e, 0x83, 0x00, 0x14, \n0xe6, 0xe5, 0xe9, 0x11, 0xa7, 0x76, 0x54, 0x11, 0x00, 0x03, 0x44, 0x3f, 0xff, 0xcf, 0x94, 0x0c, \n0x41, 0xe2, 0x8c, 0x02, 0x40, 0xaf, 0x00, 0x04, 0x84, 0x43, 0x10, 0xa3, 0x00, 0x06, 0x4c, 0x71, \n0x40, 0x0f, 0xd5, 0x0f, 0x84, 0x83, 0x4c, 0x72, 0x40, 0x08, 0x00, 0xa3, 0x00, 0x06, 0x58, 0x25, \n0x00, 0x40, 0xae, 0xb6, 0xd5, 0x06, 0x87, 0xc1, 0x4c, 0x7f, 0x00, 0x04, 0x84, 0xa5, 0xdf, 0x09, \n0xa7, 0x36, 0x44, 0x1f, 0xff, 0x80, 0x40, 0x32, 0x04, 0x04, 0x84, 0xa1, 0xae, 0xf6, 0xd7, 0x06, \n0x00, 0xa3, 0x00, 0x05, 0x58, 0x25, 0x00, 0x01, 0xae, 0xb5, 0x4e, 0x82, 0x00, 0x05, 0xe6, 0xe3, \n0xe8, 0x04, 0xd5, 0x0c, 0xe6, 0xe5, 0xe9, 0x17, 0xa6, 0x35, 0x59, 0xe0, 0x00, 0x02, 0x11, 0xe3, \n0x00, 0x05, 0x4e, 0x82, 0x00, 0x11, 0x84, 0xa3, 0xd7, 0x03, 0x84, 0xa5, 0xdf, 0x05, 0xa6, 0x75, \n0x58, 0x40, 0x80, 0x10, 0xaf, 0x35, 0x4e, 0x82, 0x00, 0x07, 0x84, 0x41, 0x4c, 0x71, 0x00, 0x04, \n0x84, 0xa3, 0xdf, 0x10, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x47, 0x80, 0xb1, 0x44, 0x00, 0x00, 0x10, \n0x56, 0x32, 0x00, 0x04, 0x95, 0x41, 0x41, 0xe2, 0x8c, 0x1a, 0x41, 0xe0, 0x0c, 0x1b, 0x11, 0xe3, \n0x00, 0x08, 0x50, 0x03, 0x00, 0x09, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8f, 0x3c, 0x84, 0x48, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0xe6, 0xe4, 0xe9, 0x05, 0x4e, 0x83, \n0x00, 0x26, 0x84, 0xa5, 0xdf, 0x23, 0x46, 0xa0, 0x01, 0x02, 0x58, 0xa5, 0x06, 0xa4, 0x50, 0x03, \n0x00, 0x11, 0x80, 0x3c, 0x44, 0x20, 0x00, 0x20, 0x4b, 0xe0, 0x28, 0x01, 0x4e, 0x83, 0x00, 0x12, \n0x84, 0xa5, 0xdf, 0x0f, 0x50, 0x1e, 0x00, 0x10, 0x50, 0x03, 0x00, 0x31, 0x44, 0x20, 0x00, 0x10, \n0x4b, 0xe0, 0x28, 0x01, 0x00, 0x53, 0x00, 0x40, 0x9c, 0x2a, 0x10, 0x03, 0x00, 0x40, 0xd5, 0x08, \n0x84, 0xa3, 0xdf, 0x04, 0x4e, 0x83, 0x00, 0x05, 0xd5, 0x0c, 0x84, 0xa5, 0xdf, 0x0a, 0xf1, 0x01, \n0x50, 0x03, 0x00, 0x41, 0x84, 0x46, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, \n0x84, 0x20, 0x50, 0x03, 0x00, 0x51, 0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x87, 0x08, 0xdd, 0x2f, 0x84, 0xa1, 0xd7, 0x0c, 0x80, 0x09, 0x80, 0x46, 0x46, 0x10, 0x00, 0x0d, \n0x58, 0x10, 0x8f, 0x44, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x89, 0x0c, 0xdd, 0x2f, 0xec, 0x0c, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xee, 0x84, 0x46, 0x80, \n0x01, 0x02, 0x58, 0x84, 0x07, 0x08, 0x50, 0x60, 0x00, 0x5b, 0x84, 0x20, 0x97, 0xd0, 0x50, 0x0f, \n0x81, 0x60, 0x44, 0x20, 0x00, 0x10, 0xdd, 0x28, 0x84, 0x20, 0x44, 0x20, 0x00, 0x50, 0x50, 0x0f, \n0x81, 0x00, 0xdd, 0x28, 0x50, 0x9f, 0x81, 0x74, 0x84, 0x20, 0x44, 0x20, 0x00, 0xff, 0x80, 0x1f, \n0xdd, 0x28, 0x84, 0x20, 0x84, 0x42, 0x80, 0x09, 0xdd, 0x28, 0x50, 0x13, 0x7f, 0xaa, 0x80, 0x09, \n0x84, 0x42, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x84, 0x01, 0x46, 0xf0, \n0x00, 0x0e, 0x00, 0x87, 0x80, 0xb3, 0x4c, 0x70, 0x00, 0x08, 0x84, 0x43, 0x4c, 0x71, 0x00, 0x05, \n0x84, 0x65, 0x4c, 0x71, 0xc0, 0x26, 0x51, 0xcf, 0x81, 0x50, 0x84, 0x20, 0x84, 0x48, 0x80, 0x1c, \n0x50, 0xa3, 0x7f, 0xae, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x46, 0x90, \n0x00, 0x02, 0x58, 0x94, 0x88, 0xd8, 0x80, 0x0a, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8f, 0x3c, \n0x84, 0x48, 0x4b, 0xe0, 0x24, 0x01, 0x84, 0x81, 0x4c, 0x02, 0x00, 0x09, 0x80, 0x0a, 0x80, 0x3c, \n0x84, 0x48, 0x4b, 0xe0, 0x24, 0x01, 0x4e, 0x03, 0x00, 0xcc, 0x84, 0xa1, 0xd7, 0x6a, 0x00, 0xa3, \n0x7f, 0xa7, 0x00, 0x93, 0x7f, 0xa8, 0x41, 0xe5, 0x20, 0x08, 0x50, 0xa3, 0x7f, 0xf6, 0x41, 0xcf, \n0x24, 0x04, 0x80, 0x2a, 0x44, 0x20, 0x00, 0x10, 0x46, 0x90, 0x01, 0x02, 0x58, 0x94, 0x86, 0xa4, \n0x50, 0x0f, 0x81, 0x50, 0x4b, 0xe0, 0x24, 0x01, 0x84, 0x20, 0x80, 0x0a, 0x44, 0x20, 0x00, 0x10, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x00, 0x0f, 0x81, 0x75, 0x84, 0x21, \n0x54, 0x00, 0x00, 0x07, 0x51, 0xce, 0x00, 0x04, 0x4c, 0x00, 0xc0, 0x18, 0x46, 0x90, 0x00, 0x0d, \n0x58, 0x94, 0x8e, 0x74, 0x85, 0x44, 0x8c, 0x2f, 0x10, 0xa4, 0x82, 0x3d, 0x50, 0x04, 0x80, 0xd0, \n0x80, 0x7c, 0x50, 0x23, 0x7f, 0xa5, 0x50, 0x4f, 0x81, 0x60, 0x80, 0xa1, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x81, 0x2c, 0xdd, 0x2f, 0xd5, 0x21, 0x84, 0x42, 0x4c, 0x01, 0x40, 0x1f, 0x46, 0xa0, \n0x00, 0x0d, 0x58, 0xa5, 0x0e, 0x74, 0x80, 0x7c, 0x87, 0x86, 0x11, 0xc5, 0x02, 0x3d, 0x50, 0x05, \n0x00, 0xd0, 0x8c, 0x2f, 0x50, 0x23, 0x7f, 0xa5, 0x50, 0x4f, 0x81, 0x00, 0x9d, 0x4c, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x82, 0x70, 0xdd, 0x2f, 0x50, 0x1f, 0x81, 0x00, 0x50, 0x0f, 0x81, 0x60, \n0x44, 0x20, 0x00, 0x10, 0x4b, 0xe0, 0x24, 0x01, 0x50, 0x0f, 0x81, 0x50, 0x50, 0x1f, 0x81, 0x60, \n0x44, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xd4, 0xdd, 0x2f, 0xc8, 0x60, \n0xa7, 0x76, 0xa7, 0x37, 0x40, 0x32, 0xa0, 0x08, 0x40, 0x31, 0x90, 0x04, 0x4e, 0x36, 0x00, 0x04, \n0x84, 0x01, 0xd5, 0x57, 0x84, 0x23, 0x4c, 0x70, 0xc0, 0x05, 0x4e, 0x83, 0x00, 0x06, 0xd5, 0x42, \n0x84, 0x05, 0x4c, 0x70, 0x40, 0x40, 0x00, 0x5f, 0x81, 0x75, 0x84, 0x42, 0x55, 0xe2, 0x80, 0x07, \n0x80, 0x9f, 0x50, 0x03, 0x00, 0x08, 0x4d, 0xe1, 0x40, 0x1e, 0xa6, 0x76, 0x01, 0xe3, 0x00, 0x07, \n0x40, 0x90, 0xa0, 0x08, 0x40, 0x14, 0xf8, 0x04, 0x94, 0xd3, 0x46, 0x20, 0x00, 0x0d, 0x58, 0x21, \n0x0f, 0x54, 0x50, 0x5f, 0x81, 0x70, 0x85, 0x20, 0x14, 0x9f, 0x80, 0x5c, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x8f, 0xb4, 0xdd, 0x2f, 0xf3, 0x5c, 0x00, 0x4f, 0x81, 0x71, 0xae, 0xf7, 0xaf, 0x36, \n0xd5, 0x0d, 0x80, 0x40, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0f, 0x54, 0x50, 0x13, 0x7f, 0xd6, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x8c, 0xdd, 0x2f, 0x4e, 0x83, 0x00, 0x0c, 0x84, 0x05, \n0x4c, 0x70, 0x40, 0x09, 0x00, 0x5f, 0x81, 0x75, 0x40, 0x22, 0x90, 0x09, 0x54, 0x21, 0x00, 0x03, \n0xd5, 0x02, 0x84, 0x40, 0xa6, 0x77, 0x80, 0x67, 0x80, 0x88, 0x80, 0x1f, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x88, 0x08, 0xdd, 0x2f, 0x84, 0x60, 0x40, 0x01, 0x80, 0x06, 0xd5, 0x02, 0x84, 0x00, \n0xed, 0x7c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xd4, 0x46, 0x90, \n0x00, 0x0d, 0x58, 0x94, 0x8e, 0x74, 0x80, 0xc1, 0x00, 0x34, 0x82, 0x3d, 0x80, 0xe0, 0x80, 0x22, \n0x80, 0x06, 0x84, 0x45, 0xf3, 0x85, 0x01, 0xc4, 0x82, 0x3c, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, \n0x8b, 0xc8, 0xdd, 0x2f, 0xc8, 0x0a, 0x46, 0x02, 0x00, 0x00, 0x80, 0x27, 0x46, 0xf0, 0x00, 0x02, \n0x58, 0xf7, 0x8e, 0xbc, 0xdd, 0x2f, 0xd5, 0x69, 0x50, 0x13, 0x00, 0x09, 0x84, 0x48, 0x46, 0x80, \n0x01, 0x02, 0x58, 0x84, 0x06, 0xa4, 0x50, 0x04, 0x80, 0xc8, 0xdd, 0x28, 0x46, 0xf0, 0x00, 0x0a, \n0x58, 0xf7, 0x84, 0x94, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x54, 0x46, 0xf0, \n0x00, 0x00, 0x58, 0xf7, 0x83, 0x24, 0xdd, 0x2f, 0x81, 0x40, 0xc0, 0x4f, 0xa1, 0xc2, 0xc7, 0x4d, \n0x84, 0xc0, 0x80, 0x26, 0x44, 0x20, 0x04, 0x00, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x87, 0x08, 0xdd, 0x2f, 0xf0, 0x05, 0x80, 0x66, 0x80, 0x86, 0x80, 0xa6, 0x80, 0x5c, 0x84, 0x26, \n0x51, 0xc3, 0x80, 0x0e, 0xb6, 0xdf, 0xf6, 0x81, 0x15, 0xcf, 0x80, 0x02, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x89, 0xe0, 0xdd, 0x2f, 0x50, 0x14, 0x82, 0x41, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x18, \n0xdd, 0x28, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x81, 0x28, 0x84, 0x46, 0x50, 0x0f, 0x80, 0x1e, \n0xdd, 0x28, 0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, 0x80, 0x08, 0x84, 0x42, 0x50, 0x0f, 0x80, 0x24, \n0xdd, 0x28, 0x00, 0x2e, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x03, 0x40, 0x81, 0x20, 0x08, 0x40, 0x84, \n0x00, 0x04, 0x50, 0x1f, 0x80, 0x18, 0x84, 0x4e, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x86, 0xf0, 0xdd, 0x2f, 0x50, 0x14, 0x00, 0x12, 0x80, 0x0a, 0x96, 0x49, 0x80, 0x46, 0x46, 0xf0, \n0x00, 0x02, 0x58, 0xf7, 0x84, 0xbc, 0xdd, 0x2f, 0xec, 0x2c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x50, 0x6f, 0x80, 0x04, 0x80, 0xe1, 0x81, 0x00, 0x84, 0x20, \n0x81, 0x22, 0x80, 0x06, 0x84, 0x42, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, \n0x80, 0x06, 0x9c, 0x7d, 0x84, 0x42, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, \n0xa6, 0xf1, 0x54, 0x01, 0x80, 0x80, 0xc0, 0x23, 0xa7, 0x30, 0x54, 0x12, 0x00, 0x0e, 0xc9, 0x0f, \n0x54, 0x21, 0x80, 0x08, 0xc2, 0x0c, 0x97, 0x24, 0xcc, 0x1a, 0x46, 0x04, 0x00, 0x00, 0x80, 0x28, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8e, 0xbc, 0xdd, 0x2f, 0xd5, 0x11, 0x55, 0xe2, 0x00, 0x0f, \n0x84, 0xa3, 0x4d, 0xe2, 0xc0, 0x0d, 0x54, 0x31, 0x80, 0x08, 0xcb, 0x09, 0x80, 0x08, 0x80, 0x27, \n0x80, 0x49, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x8e, 0x18, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, \n0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x9c, 0x80, 0xc0, 0x44, 0x00, 0x00, 0x10, \n0xf3, 0x83, 0xf2, 0x88, 0xf4, 0x89, 0xf5, 0x8a, 0x4c, 0x30, 0x00, 0x0d, 0x44, 0x20, 0x00, 0x18, \n0x4c, 0x31, 0x00, 0x09, 0x41, 0xe0, 0x04, 0x08, 0x4c, 0x3f, 0x00, 0x05, 0x84, 0x1f, 0x48, 0x00, \n0x00, 0xa2, 0x8e, 0x28, 0x80, 0x01, 0x84, 0xe0, 0xf1, 0x81, 0xf7, 0x97, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8c, 0x14, 0xdd, 0x2f, 0xf0, 0x82, 0xc8, 0x04, 0x84, 0x1e, 0x48, 0x00, 0x00, 0x93, \n0x50, 0x0f, 0x80, 0x54, 0x46, 0xa0, 0x01, 0x02, 0x58, 0xa5, 0x06, 0xa4, 0x80, 0x26, 0x84, 0x48, \n0x4b, 0xe0, 0x28, 0x01, 0xf2, 0x01, 0xf0, 0x02, 0x40, 0x91, 0x0c, 0x09, 0x50, 0x13, 0x00, 0x08, \n0x4b, 0xe0, 0x28, 0x01, 0x84, 0xe5, 0x54, 0x04, 0x80, 0xff, 0x80, 0x89, 0x42, 0x40, 0x1c, 0x73, \n0x40, 0x24, 0x8c, 0x08, 0x05, 0xef, 0x80, 0x02, 0x50, 0x31, 0x7f, 0xf8, 0x52, 0x50, 0x00, 0x00, \n0x54, 0x82, 0x80, 0xff, 0x55, 0xc2, 0x00, 0xff, 0x40, 0xaf, 0x0c, 0x00, 0x50, 0x64, 0xff, 0xff, \n0x14, 0x8f, 0x80, 0x07, 0x15, 0xcf, 0x80, 0x04, 0xf7, 0x85, 0x14, 0xaf, 0x80, 0x0b, 0xf6, 0x86, \n0xf6, 0x06, 0x04, 0xaf, 0x80, 0x0b, 0x05, 0xcf, 0x80, 0x04, 0x46, 0x90, 0x01, 0x02, 0x58, 0x94, \n0x86, 0xa4, 0x50, 0x8f, 0x80, 0x5c, 0x50, 0x7f, 0x80, 0x4c, 0xd5, 0x2f, 0xa7, 0x0f, 0x9f, 0xb1, \n0x40, 0x3e, 0x10, 0x03, 0xae, 0xcf, 0xdd, 0x29, 0x80, 0x2a, 0x84, 0x48, 0x50, 0x0f, 0x80, 0x3c, \n0xdd, 0x29, 0xf3, 0x03, 0x46, 0xf0, 0x00, 0x0a, 0x04, 0x17, 0x83, 0xb8, 0xf2, 0x08, 0x45, 0xe0, \n0x00, 0x10, 0x50, 0x4f, 0x80, 0x44, 0x80, 0xa8, 0x50, 0x0f, 0x80, 0x34, 0x15, 0xef, 0x80, 0x17, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x88, 0xac, 0xdd, 0x2f, 0x50, 0x1f, 0x80, 0x44, 0x84, 0x48, \n0x50, 0x0f, 0x80, 0x54, 0xdd, 0x29, 0x80, 0x0a, 0x80, 0x27, 0x84, 0x48, 0xdd, 0x29, 0x50, 0x1e, \n0x7f, 0xff, 0x55, 0xc0, 0x80, 0xff, 0x8f, 0x48, 0x84, 0x48, 0x50, 0x0f, 0x80, 0x34, 0x50, 0x1f, \n0x80, 0x54, 0x4e, 0x64, 0xff, 0xcd, 0x05, 0xef, 0x80, 0x04, 0xf4, 0x07, 0xf1, 0x05, 0x40, 0x3f, \n0x10, 0x00, 0x9e, 0x89, 0x96, 0x18, 0x84, 0xbf, 0xf2, 0x85, 0xf0, 0x84, 0xda, 0xb2, 0xf2, 0x01, \n0xf5, 0x0a, 0xb6, 0x45, 0xf2, 0x01, 0xf1, 0x02, 0xf0, 0x09, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x86, 0xa4, 0xdd, 0x2f, 0xf0, 0x02, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8c, 0x28, 0xdd, 0x2f, \n0x84, 0x00, 0xec, 0x64, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xee, 0xe4, 0xb6, 0x5f, 0xf3, 0x81, 0x80, 0xc1, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x87, 0x08, \n0x84, 0x20, 0x44, 0x20, 0x00, 0x60, 0x83, 0x80, 0x50, 0x0f, 0x80, 0x68, 0x81, 0x44, 0x81, 0x25, \n0x50, 0x8f, 0x80, 0xc8, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x20, 0x44, 0x20, 0x00, 0x60, 0x50, 0x0f, \n0x80, 0x08, 0x4b, 0xe0, 0x1c, 0x01, 0x80, 0x08, 0x84, 0x20, 0x44, 0x20, 0x00, 0x40, 0x4b, 0xe0, \n0x1c, 0x01, 0x5c, 0xf3, 0x00, 0x41, 0xe8, 0x0f, 0x80, 0x08, 0x80, 0x3c, 0x80, 0x46, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x50, 0x6f, 0x80, 0xc8, 0x51, 0xcf, 0x81, 0x08, \n0x80, 0xe6, 0xd5, 0x0a, 0x80, 0x1c, 0x80, 0x26, 0x80, 0x48, 0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, \n0x8e, 0x98, 0xdd, 0x2f, 0xd5, 0xf2, 0xa6, 0x78, 0x56, 0x00, 0x80, 0x36, 0x18, 0x03, 0x80, 0x01, \n0x4c, 0x7e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x68, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, \n0x8e, 0x54, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, 0x0d, 0xc0, 0x80, 0x07, 0x50, 0x1f, \n0x80, 0xc8, 0x44, 0x20, 0x00, 0x40, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0x3f, 0xf2, 0x01, 0x80, 0x07, \n0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x50, 0x1f, 0x81, 0x08, 0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, \n0x8d, 0x48, 0xdd, 0x2f, 0xa6, 0xf0, 0x56, 0x21, 0x80, 0x6a, 0x18, 0x23, 0x00, 0x01, 0x4c, 0x6e, \n0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x08, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x03, 0x58, 0xf7, 0x8e, 0x54, \n0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, 0x0d, 0xc0, 0x80, 0x07, 0x50, 0x1f, 0x80, 0xc8, \n0x44, 0x20, 0x00, 0x40, 0x50, 0x6f, 0x81, 0x08, 0x4b, 0xe0, 0x20, 0x01, 0x44, 0x20, 0x00, 0x10, \n0x80, 0x07, 0x80, 0x26, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x80, 0x26, 0x46, 0xf0, 0x01, 0x03, \n0x58, 0xf7, 0x8d, 0x48, 0xdd, 0x2f, 0x46, 0x30, 0x01, 0x02, 0x58, 0x31, 0x86, 0xa4, 0xe7, 0x31, \n0xe9, 0x06, 0x80, 0x0a, 0x80, 0x26, 0x44, 0x20, 0x00, 0x10, 0xd5, 0x04, 0x80, 0x0a, 0x80, 0x26, \n0x80, 0x49, 0x4b, 0xe0, 0x0c, 0x01, 0xed, 0x1c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xee, 0xcc, 0xb6, 0x5f, 0xf3, 0x81, 0x80, 0xc1, 0x46, 0x70, 0x01, 0x02, \n0x58, 0x73, 0x87, 0x08, 0x84, 0x20, 0x44, 0x20, 0x00, 0x68, 0x83, 0x80, 0x50, 0x0f, 0x80, 0x70, \n0x81, 0x44, 0x81, 0x25, 0x50, 0x8f, 0x80, 0xdc, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x68, 0x50, 0x0f, 0x80, 0x08, 0x4b, 0xe0, 0x1c, 0x01, 0x80, 0x08, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x40, 0x4b, 0xe0, 0x1c, 0x01, 0x5c, 0xf3, 0x00, 0x41, 0xe8, 0x0f, 0x80, 0x08, 0x80, 0x3c, \n0x80, 0x46, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xa4, 0xdd, 0x2f, 0x50, 0x6f, 0x80, 0xdc, \n0x51, 0xcf, 0x81, 0x1c, 0x80, 0xe6, 0xd5, 0x0a, 0x80, 0x1c, 0x80, 0x26, 0x80, 0x48, 0x46, 0xf0, \n0x01, 0x03, 0x58, 0xf7, 0x81, 0xbc, 0xdd, 0x2f, 0xd5, 0xf2, 0xa6, 0x78, 0x56, 0x00, 0x80, 0x36, \n0x18, 0x03, 0x80, 0x01, 0x4c, 0x7e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x70, 0x80, 0x07, 0x46, 0xf0, \n0x01, 0x03, 0x58, 0xf7, 0x81, 0x78, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, 0x00, 0xe4, \n0x80, 0x07, 0x50, 0x1f, 0x80, 0xdc, 0x44, 0x20, 0x00, 0x40, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0x3f, \n0xf2, 0x01, 0x80, 0x07, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x50, 0x1f, 0x81, 0x1c, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x8f, 0xd8, 0xdd, 0x2f, 0xa6, 0xf0, 0x56, 0x21, 0x80, 0x6a, 0x18, 0x23, \n0x00, 0x01, 0x4c, 0x6e, 0x7f, 0xfb, 0x50, 0x7f, 0x80, 0x08, 0x80, 0x07, 0x46, 0xf0, 0x01, 0x03, \n0x58, 0xf7, 0x81, 0x78, 0xdd, 0x2f, 0x46, 0x80, 0x01, 0x03, 0x58, 0x84, 0x00, 0xe4, 0x80, 0x07, \n0x50, 0x1f, 0x80, 0xdc, 0x44, 0x20, 0x00, 0x40, 0x50, 0x6f, 0x81, 0x1c, 0x4b, 0xe0, 0x20, 0x01, \n0x44, 0x20, 0x00, 0x14, 0x80, 0x07, 0x80, 0x26, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x07, 0x80, 0x26, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x8f, 0xd8, 0xdd, 0x2f, 0x46, 0x30, 0x01, 0x02, 0x58, 0x31, \n0x86, 0xa4, 0xe7, 0x35, 0xe9, 0x06, 0x80, 0x0a, 0x80, 0x26, 0x44, 0x20, 0x00, 0x14, 0xd5, 0x04, \n0x80, 0x0a, 0x80, 0x26, 0x80, 0x49, 0x4b, 0xe0, 0x0c, 0x01, 0xed, 0x34, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x20, 0x00, 0x80, 0x58, 0x21, 0x00, 0x50, 0x46, 0x50, 0x04, 0x00, \n0x98, 0xc2, 0x58, 0x52, 0x82, 0x7c, 0x94, 0x03, 0x84, 0x40, 0x99, 0x05, 0x94, 0xdb, 0xb6, 0x44, \n0xb6, 0x43, 0x50, 0x22, 0xff, 0xf4, 0x44, 0x30, 0x00, 0xff, 0x40, 0x51, 0x80, 0x0c, 0xb4, 0x82, \n0x40, 0x32, 0x94, 0x05, 0x40, 0x51, 0x90, 0x02, 0x96, 0x48, 0x84, 0x61, 0xb6, 0xa2, 0x4c, 0x11, \n0xc0, 0x06, 0xb4, 0x22, 0x44, 0x30, 0x00, 0x82, 0xd5, 0x03, 0xb4, 0x22, 0x94, 0xdf, 0x40, 0x41, \n0x80, 0x0c, 0x40, 0x02, 0x04, 0x04, 0xb6, 0x02, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x50, 0x00, 0x80, \n0x58, 0x52, 0x80, 0x50, 0x46, 0x40, 0x04, 0x00, 0x98, 0x85, 0x58, 0x42, 0x02, 0x7c, 0x94, 0x03, \n0x99, 0x44, 0x94, 0x93, 0x44, 0x31, 0x00, 0x00, 0x84, 0x80, 0xb6, 0x65, 0xb6, 0x82, 0x46, 0x20, \n0x04, 0x00, 0x58, 0x21, 0x02, 0x70, 0x44, 0x30, 0x00, 0xff, 0x40, 0x51, 0x80, 0x0c, 0xb4, 0x82, \n0x40, 0x32, 0x94, 0x05, 0x40, 0x51, 0x90, 0x02, 0x96, 0x48, 0x84, 0x61, 0xb6, 0xa2, 0x4c, 0x11, \n0xc0, 0x06, 0xb4, 0x22, 0x44, 0x30, 0x00, 0x82, 0xd5, 0x03, 0xb4, 0x22, 0x94, 0xdf, 0x40, 0x41, \n0x80, 0x0c, 0x40, 0x02, 0x04, 0x04, 0xb6, 0x02, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x40, 0x04, 0x00, \n0x46, 0x20, 0x30, 0x70, 0x80, 0xa4, 0x58, 0x21, 0x03, 0x07, 0x14, 0x22, 0x00, 0x9d, 0x14, 0x22, \n0x80, 0x9e, 0x46, 0x20, 0x04, 0x00, 0x58, 0x21, 0x02, 0x70, 0x44, 0x30, 0x00, 0xff, 0x94, 0x03, \n0x40, 0x51, 0x80, 0x0c, 0xb4, 0x82, 0x40, 0x32, 0x94, 0x05, 0x40, 0x51, 0x90, 0x02, 0x96, 0x48, \n0x84, 0x61, 0xb6, 0xa2, 0x4c, 0x11, 0xc0, 0x06, 0xb4, 0x22, 0x44, 0x30, 0x00, 0x86, 0xd5, 0x04, \n0xb4, 0x22, 0x44, 0x30, 0x00, 0x84, 0x40, 0x51, 0x80, 0x0c, 0x40, 0x02, 0x84, 0x04, 0xb6, 0x02, \n0xdd, 0x9e, 0x92, 0x00, 0x40, 0x31, 0xe0, 0x08, 0x40, 0x41, 0x90, 0x04, 0x40, 0x21, 0x40, 0x08, \n0x46, 0x50, 0x00, 0x80, 0x40, 0x22, 0x08, 0x04, 0x58, 0x52, 0x80, 0x50, 0x46, 0x40, 0x04, 0x00, \n0x98, 0xc5, 0x58, 0x42, 0x02, 0x7c, 0x94, 0x03, 0x99, 0x44, 0xb6, 0x45, 0x94, 0xdb, 0x84, 0x40, \n0xb6, 0x43, 0x50, 0x22, 0x7f, 0xf4, 0x44, 0x50, 0x00, 0xff, 0x40, 0x32, 0x80, 0x0c, 0xb4, 0x82, \n0x40, 0x51, 0x8c, 0x05, 0x40, 0x32, 0x90, 0x02, 0x96, 0x48, 0x84, 0xa1, 0xb6, 0x62, 0xd9, 0x05, \n0xb4, 0x22, 0x44, 0x30, 0x00, 0x82, 0xd5, 0x03, 0xb4, 0x22, 0x94, 0xef, 0x40, 0x41, 0x80, 0x0c, \n0x40, 0x02, 0x04, 0x04, 0xb6, 0x02, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x44, 0x20, \n0x00, 0x19, 0x96, 0x48, 0x80, 0x62, 0x84, 0x81, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x84, 0xc4, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x44, 0x20, 0x00, 0x32, 0x96, 0x48, 0x84, 0x6a, 0x84, 0x81, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x84, 0xc4, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x10, 0x04, 0x00, 0x04, 0x00, 0x80, 0x20, 0x54, 0x00, \n0x01, 0x00, 0xc0, 0x09, 0x84, 0x00, 0x80, 0x20, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x84, 0x0c, \n0xdd, 0x2f, 0xd5, 0x07, 0x80, 0x20, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x83, 0xb4, 0xdd, 0x2f, \n0x46, 0x20, 0x04, 0x00, 0x58, 0x21, 0x00, 0x20, 0xb4, 0x22, 0x59, 0xe0, 0x88, 0x00, 0x15, 0xe1, \n0x00, 0x00, 0x84, 0x01, 0xb4, 0xa2, 0x84, 0x20, 0x42, 0x32, 0xc4, 0x09, 0xb6, 0x62, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x84, 0x6c, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x84, 0x48, 0x96, 0x49, 0x4c, 0x11, 0x40, 0x04, 0x84, 0x81, \n0xd5, 0x07, 0x95, 0x51, 0xd1, 0x04, 0x84, 0x01, 0x48, 0x00, 0x00, 0xc4, 0x84, 0x82, 0x46, 0xa0, \n0x10, 0x00, 0x58, 0xa5, 0x00, 0x01, 0x85, 0x20, 0x47, 0xc1, 0x11, 0x10, 0x46, 0x70, 0x04, 0x00, \n0xb6, 0x9f, 0x14, 0xaf, 0x80, 0x01, 0x59, 0xce, 0x01, 0x90, 0x81, 0x49, 0x58, 0x73, 0x82, 0x70, \n0x46, 0x80, 0x00, 0x01, 0x58, 0x84, 0x04, 0x0c, 0x81, 0x20, 0x80, 0x29, 0xa3, 0x89, 0xb4, 0x21, \n0xe6, 0xc4, 0x4e, 0xf2, 0x00, 0xa0, 0x84, 0xa4, 0xd1, 0x34, 0xe6, 0x25, 0xe8, 0x0a, 0x84, 0xa1, \n0xd1, 0x1d, 0xc1, 0x17, 0x84, 0xa2, 0xd1, 0x21, 0x84, 0xa3, 0x4c, 0x12, 0xc0, 0x94, 0xd5, 0x25, \n0x8c, 0xac, 0xd1, 0x42, 0xe6, 0x31, 0xe8, 0x07, 0x84, 0xa5, 0xd1, 0x2a, 0x84, 0xa6, 0x4c, 0x12, \n0xc0, 0x8a, 0xd5, 0x32, 0x9d, 0x69, 0xd1, 0x59, 0x9d, 0x69, 0x4c, 0x12, 0xc0, 0x84, 0xd5, 0x64, \n0x80, 0x06, 0x84, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0xd5, 0x7d, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x83, 0xb4, 0xdd, 0x2f, 0xd5, 0x76, 0x80, 0x06, 0x84, 0x20, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x84, 0x6c, 0xdd, 0x2f, 0xd5, 0x6e, 0x84, 0x21, 0x44, 0x20, 0x00, 0x32, 0xd5, 0x0b, \n0x80, 0x06, 0x84, 0x21, 0x46, 0x20, 0x00, 0x01, 0x58, 0x21, 0x05, 0x28, 0xd5, 0x62, 0x84, 0x21, \n0x44, 0x20, 0x00, 0x11, 0x80, 0x06, 0x80, 0x62, 0x80, 0x81, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x84, 0xc4, 0xdd, 0x2f, 0xd5, 0x57, 0x80, 0x06, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x85, 0x4c, 0xdd, 0x2f, 0xd5, 0x4f, 0x46, 0x50, 0x00, 0x80, 0x58, 0x52, 0x80, 0x50, 0x46, 0x20, \n0x04, 0x00, 0x98, 0xf5, 0x58, 0x21, 0x02, 0x7c, 0x95, 0x73, 0x98, 0x6a, 0x15, 0xc0, 0x80, 0x00, \n0x41, 0xe1, 0x8c, 0x08, 0xf4, 0x01, 0xb6, 0x9e, 0x44, 0x00, 0x00, 0x82, 0xb4, 0x47, 0x40, 0x60, \n0x14, 0x0c, 0x41, 0xe1, 0x20, 0x09, 0x41, 0xef, 0x20, 0x08, 0x15, 0xe3, 0x80, 0x00, 0xb4, 0x27, \n0x40, 0x63, 0x04, 0x04, 0xb6, 0xc7, 0xd5, 0x2e, 0x80, 0x06, 0x84, 0x21, 0x4b, 0xe0, 0x20, 0x01, \n0x80, 0x46, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0c, 0xc0, 0x46, 0x10, 0x00, 0x01, 0x58, 0x10, \n0x87, 0x78, 0x84, 0x61, 0xd5, 0x0f, 0x80, 0x06, 0x84, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0x80, 0x46, \n0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0c, 0xc0, 0x46, 0x10, 0x00, 0x01, 0x58, 0x10, 0x87, 0x78, \n0x84, 0x63, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x0c, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0d, \n0x58, 0x00, 0x0c, 0xc0, 0x44, 0x10, 0x13, 0x88, 0x46, 0x20, 0x00, 0x00, 0x58, 0x21, 0x02, 0x54, \n0xdd, 0x22, 0xb4, 0x1f, 0x8d, 0x41, 0x8d, 0x28, 0xe3, 0x40, 0x4e, 0xf3, 0xff, 0x58, 0x84, 0x00, \n0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x84, 0xa2, 0x80, 0xc0, \n0xd1, 0x25, 0x84, 0xa3, 0xd1, 0x2a, 0x84, 0xa1, 0xd9, 0x2e, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x83, 0xb4, 0xdd, 0x2f, 0x80, 0x46, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0c, 0xc0, 0x46, 0x10, \n0x00, 0x01, 0x58, 0x10, 0x87, 0x78, 0x84, 0x62, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x0c, \n0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0c, 0xc0, 0x44, 0x10, 0x0b, 0xb8, 0x46, 0xf0, \n0x00, 0x00, 0x58, 0xf7, 0x82, 0x54, 0xdd, 0x2f, 0xd5, 0x0e, 0x84, 0x20, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x84, 0x6c, 0xdd, 0x2f, 0xd5, 0x07, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x83, 0xb4, 0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0xef, 0xf8, 0x46, 0x10, 0x04, 0x00, 0x04, 0x60, 0x80, 0x97, 0x96, 0x34, 0xc0, 0x15, 0x80, 0x61, \n0x04, 0x21, 0x80, 0x20, 0x54, 0x01, 0x01, 0x00, 0xc0, 0x09, 0x84, 0x00, 0x80, 0x20, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x84, 0x0c, 0xdd, 0x2f, 0xd5, 0x07, 0x80, 0x20, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x83, 0xb4, 0xdd, 0x2f, 0x40, 0x43, 0x40, 0x08, 0x92, 0x9f, 0xc4, 0x06, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x8d, 0x20, 0xdd, 0x2f, 0x55, 0xe3, 0x10, 0x00, 0x4f, 0xe2, 0x00, 0x07, \n0x84, 0x21, 0x46, 0xf0, 0x00, 0x0d, 0x10, 0x17, 0x8e, 0x38, 0x46, 0x30, 0x04, 0x00, 0x14, 0x61, \n0x80, 0x97, 0x04, 0x21, 0x80, 0x97, 0xf2, 0x81, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, \n0x96, 0x49, 0x54, 0x20, 0x80, 0x03, 0x40, 0x30, 0x88, 0x09, 0xca, 0x10, 0x5c, 0xf0, 0x80, 0xc8, \n0xe8, 0x0d, 0x80, 0x20, 0xb4, 0x40, 0x84, 0x01, 0xd5, 0x04, 0xb4, 0x81, 0x9c, 0x01, 0xab, 0x11, \n0x9c, 0x4c, 0xe2, 0x03, 0xe9, 0xfb, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0x3c, 0xa4, 0x88, 0x5c, 0xf1, 0x00, 0xc8, 0xe8, 0x16, 0x80, 0x60, 0xa2, 0x99, \n0xb4, 0xa3, 0x5c, 0xf2, 0x80, 0x40, 0xe8, 0x10, 0x84, 0x60, 0xd5, 0x04, 0xa3, 0x91, 0x80, 0x64, \n0xb6, 0xc0, 0x40, 0x21, 0x20, 0x08, 0x92, 0x48, 0x9c, 0x04, 0x9d, 0x19, 0xdb, 0xf8, 0x94, 0x22, \n0xac, 0x08, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0x3a, 0x6f, 0x98, 0x04, 0xdd, 0x9e, 0x92, 0x00, \n0x96, 0x49, 0xe6, 0x28, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x29, 0x80, 0x40, 0xa2, 0xd1, 0x8c, 0x08, \n0xb4, 0x22, 0xb4, 0x40, 0xc3, 0x02, 0xd5, 0x21, 0x46, 0x44, 0x00, 0x04, 0x46, 0x10, 0x04, 0x00, \n0x58, 0x10, 0x80, 0xdc, 0x40, 0x51, 0x10, 0x04, 0xb6, 0xa1, 0x80, 0x03, 0xd5, 0x09, 0x92, 0x00, \n0x84, 0x67, 0x9c, 0x49, 0x4c, 0x11, 0xff, 0xfd, 0x9c, 0x01, 0x84, 0xaa, 0xd0, 0x03, 0x84, 0x20, \n0xd5, 0xf7, 0x46, 0x1b, 0xff, 0xfb, 0x46, 0x00, 0x04, 0x00, 0x58, 0x10, 0x8f, 0xff, 0x40, 0x21, \n0x04, 0x02, 0x58, 0x00, 0x00, 0xdc, 0xb6, 0x40, 0x84, 0x00, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xf4, 0x80, 0xe4, 0x81, 0x42, 0x81, 0x03, 0x81, 0x25, 0x55, 0xc0, 0x00, 0xff, 0x97, 0x08, \n0x5c, 0xf3, 0x80, 0xc1, 0xe8, 0x4e, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x64, 0xf4, 0x81, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x83, 0x24, 0xdd, 0x2f, 0x80, 0xc0, 0xf4, 0x01, 0xc0, 0x41, \n0x46, 0xf0, 0x00, 0x0d, 0x00, 0x37, 0x8c, 0xdc, 0x54, 0x22, 0x00, 0x0f, 0x54, 0x5e, 0x00, 0x0f, \n0x41, 0xe1, 0x40, 0x08, 0x40, 0x02, 0xd0, 0x08, 0x46, 0x25, 0x80, 0x00, 0xa1, 0x72, 0x40, 0x4f, \n0x00, 0x04, 0x54, 0x11, 0x80, 0x03, 0x41, 0xe2, 0x08, 0x04, 0x14, 0x82, 0x80, 0x01, 0x40, 0x00, \n0xe4, 0x08, 0xb7, 0x45, 0x50, 0x83, 0x80, 0x08, 0x40, 0x3f, 0x00, 0x04, 0x80, 0x47, 0x54, 0x84, \n0x3f, 0xff, 0x80, 0x29, 0x50, 0x02, 0x80, 0x08, 0x40, 0x71, 0xa0, 0x04, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x86, 0xf0, 0xdd, 0x2f, 0x84, 0x21, 0x84, 0x00, 0x10, 0x13, 0x00, 0x0f, 0x10, 0x03, \n0x00, 0x14, 0x12, 0x83, 0x00, 0x06, 0xa9, 0xf4, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, \n0x80, 0x26, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0xa0, 0xdd, 0x2f, 0x84, 0x00, 0xd5, 0x02, \n0x84, 0x01, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x97, 0x09, 0x97, 0xd8, 0xe6, 0x84, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x1f, 0xb4, 0x00, \n0x84, 0x21, 0x4c, 0x00, 0x80, 0x03, 0xd5, 0x19, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x74, \n0x04, 0x33, 0x00, 0xa9, 0xb6, 0x62, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, 0x84, 0x3c, 0xdd, 0x2f, \n0x84, 0x40, 0x80, 0x27, 0x50, 0x53, 0x02, 0xa4, 0x84, 0x05, 0x80, 0x62, 0x84, 0x84, 0x46, 0xf0, \n0x00, 0x01, 0x58, 0xf7, 0x89, 0x2c, 0xdd, 0x2f, 0x84, 0x05, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x97, 0x82, 0x46, 0x00, 0x00, 0x0d, \n0x58, 0x00, 0x0e, 0x64, 0x97, 0xc8, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x83, 0x24, 0xdd, 0x2f, \n0xc8, 0x03, 0x84, 0x01, 0xd5, 0x2b, 0x46, 0xf0, 0x00, 0x0d, 0x01, 0xe7, 0x8c, 0xdc, 0x54, 0x53, \n0x80, 0x0f, 0x54, 0x4f, 0x00, 0x03, 0x40, 0x32, 0xc0, 0x08, 0x40, 0x12, 0x64, 0x08, 0x46, 0x25, \n0x88, 0x08, 0x41, 0xe1, 0x84, 0x04, 0xa1, 0x42, 0x58, 0x21, 0x00, 0x08, 0x40, 0x1f, 0x08, 0x04, \n0x84, 0x88, 0x84, 0x61, 0x84, 0x40, 0xb6, 0xc5, 0xa8, 0x44, 0xad, 0x06, 0x10, 0x30, 0x00, 0x0f, \n0x10, 0x20, 0x00, 0x14, 0x80, 0x20, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x87, 0xa0, 0xdd, 0x2f, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0xf0, 0x00, 0x0d, 0x20, 0x27, 0x8c, 0xde, \n0x84, 0xa1, 0xda, 0x58, 0x46, 0x60, 0x04, 0x10, 0x04, 0x53, 0x01, 0x0e, 0x40, 0x82, 0xc0, 0x09, \n0x46, 0xf0, 0x00, 0x0b, 0x00, 0x37, 0x80, 0x1d, 0x54, 0x84, 0x00, 0xff, 0xe3, 0x03, 0xe9, 0x22, \n0x46, 0x70, 0x00, 0x0d, 0x20, 0x63, 0x8c, 0xe1, 0xce, 0x1d, 0x46, 0xf0, 0x00, 0x0d, 0x10, 0x67, \n0x8c, 0xe0, 0x10, 0x23, 0x8c, 0xe1, 0x80, 0x02, 0x80, 0x26, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x8a, 0x44, 0xdd, 0x2f, 0xc0, 0x03, 0x10, 0x63, 0x8c, 0xe1, 0x84, 0x01, 0x80, 0x20, 0x46, 0x60, \n0x00, 0x01, 0x58, 0x63, 0x0a, 0x44, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x01, 0x84, 0x22, 0x4b, 0xe0, \n0x18, 0x01, 0x46, 0xf0, 0x00, 0x0d, 0x00, 0x27, 0x8c, 0xdf, 0xe2, 0x48, 0xe9, 0x23, 0x46, 0x70, \n0x00, 0x0d, 0x20, 0x63, 0x8c, 0xe0, 0xce, 0x1e, 0x84, 0x61, 0x46, 0xf0, 0x00, 0x0d, 0x10, 0x67, \n0x8c, 0xe1, 0x10, 0x33, 0x8c, 0xe0, 0x80, 0x06, 0x80, 0x26, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x8a, 0x44, 0xdd, 0x2f, 0xc0, 0x03, 0x10, 0x63, 0x8c, 0xe0, 0x84, 0x21, 0x46, 0x60, 0x00, 0x01, \n0x58, 0x63, 0x0a, 0x44, 0x84, 0x00, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x00, 0x84, 0x22, 0x4b, 0xe0, \n0x18, 0x01, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xa2, 0x41, 0x84, 0x41, \n0xb4, 0x00, 0x4c, 0x11, 0x40, 0x07, 0x46, 0xf0, 0x00, 0x0e, 0x10, 0x07, 0x80, 0xc8, 0xd5, 0x4b, \n0x84, 0xa3, 0xd9, 0x3e, 0x96, 0x00, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x74, 0x10, 0x03, \n0x02, 0xa8, 0x46, 0x10, 0x04, 0x10, 0x04, 0x40, 0x82, 0x03, 0x42, 0x22, 0x60, 0x09, 0x42, 0x21, \n0x64, 0x09, 0xc8, 0x0f, 0x46, 0x30, 0x30, 0x00, 0x41, 0xe1, 0x0c, 0x04, 0x15, 0xe0, 0x82, 0x03, \n0x50, 0x03, 0x02, 0x68, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x1c, 0xdd, 0x2f, 0xd5, 0x2b, \n0x42, 0x01, 0x60, 0x08, 0x84, 0x40, 0x14, 0x00, 0x82, 0x03, 0x10, 0x23, 0x02, 0x64, 0x14, 0x23, \n0x00, 0xa9, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8b, 0x34, 0xdd, 0x2f, 0x84, 0x01, 0x80, 0x20, \n0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x85, 0x28, 0xdd, 0x2f, 0x50, 0x03, 0x02, 0x68, 0x44, 0x10, \n0x27, 0x10, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x54, 0xdd, 0x2f, 0xd5, 0x0c, 0x84, 0xa4, \n0xd9, 0x0a, 0x5c, 0x50, 0x00, 0x03, 0x84, 0x80, 0x40, 0x02, 0x14, 0x1a, 0x46, 0xf0, 0x00, 0x0e, \n0x10, 0x07, 0x80, 0xd9, 0x84, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0x94, 0x80, 0xc0, 0xb4, 0x00, 0x84, 0x21, 0x4c, 0x00, 0xc0, 0x24, 0x9c, 0xb4, 0xb4, 0x22, \n0x50, 0x33, 0x00, 0x0c, 0x97, 0x0c, 0x8c, 0xc8, 0xb4, 0x46, 0xb4, 0x63, 0xc4, 0x05, 0x46, 0xf0, \n0x00, 0x0e, 0x10, 0x07, 0x80, 0xc9, 0x54, 0x00, 0x80, 0x02, 0xc0, 0x0a, 0x85, 0x01, 0x46, 0xf0, \n0x00, 0x0e, 0x10, 0x87, 0x80, 0xcb, 0x46, 0xf0, 0x00, 0x0e, 0x10, 0x87, 0x80, 0xca, 0x46, 0xf0, \n0x00, 0x0e, 0x14, 0x37, 0x80, 0x35, 0x46, 0xf0, 0x00, 0x0e, 0x14, 0x27, 0x80, 0x34, 0xd5, 0x4e, \n0x84, 0xa2, 0xd8, 0x4e, 0x01, 0xe3, 0x00, 0x50, 0x00, 0x43, 0x00, 0x51, 0x00, 0x33, 0x00, 0x53, \n0x51, 0xc3, 0x00, 0x04, 0xb5, 0x3c, 0x01, 0xc3, 0x00, 0x52, 0x15, 0xef, 0x80, 0x01, 0xf3, 0x83, \n0xf4, 0x82, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xf0, 0x50, 0x13, 0x00, 0x08, 0x94, 0xad, \n0x50, 0xaf, 0x80, 0x50, 0x50, 0x0f, 0x80, 0x10, 0x46, 0x70, 0x00, 0x0d, 0x58, 0x73, 0x8e, 0x74, \n0xdd, 0x28, 0x50, 0x13, 0x00, 0x48, 0x84, 0x48, 0x42, 0x64, 0x84, 0x0b, 0x80, 0x0a, 0x54, 0x94, \n0x80, 0x01, 0xdd, 0x28, 0x10, 0x93, 0x82, 0x3f, 0x10, 0x63, 0x82, 0x40, 0x50, 0x1f, 0x80, 0x10, \n0xf5, 0x01, 0x44, 0x20, 0x00, 0x40, 0x10, 0x53, 0x82, 0x3c, 0x50, 0x03, 0x80, 0xd0, 0xf3, 0x02, \n0x10, 0x33, 0x82, 0x3d, 0xf4, 0x03, 0x13, 0xc3, 0x81, 0x26, 0x10, 0x43, 0x82, 0x3e, 0xdd, 0x28, \n0x80, 0x2a, 0x84, 0x48, 0x50, 0x03, 0x80, 0xc8, 0xdd, 0x28, 0x50, 0x13, 0x80, 0xd0, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x87, 0x7c, 0xdd, 0x2f, 0x84, 0x00, 0xd5, 0x2a, 0x84, 0xa3, \n0xd0, 0x02, 0xd5, 0x26, 0x50, 0x9f, 0x80, 0x60, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xf0, \n0x9c, 0x74, 0x84, 0x46, 0x50, 0x8f, 0x80, 0x58, 0x80, 0x09, 0xdd, 0x27, 0x50, 0x13, 0x00, 0x0a, \n0x84, 0x46, 0x80, 0x08, 0xdd, 0x27, 0x80, 0x29, 0x84, 0x46, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, \n0x01, 0x28, 0xdd, 0x27, 0x8c, 0xd0, 0x84, 0x46, 0x80, 0x28, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, \n0x00, 0xb5, 0xdd, 0x27, 0xb4, 0x06, 0x46, 0xf0, 0x00, 0x0e, 0x14, 0x07, 0x80, 0x45, 0x84, 0x01, \n0xec, 0x6c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x96, 0x49, 0x54, 0x70, \n0x80, 0x07, 0x40, 0xa0, 0x88, 0x09, 0xcf, 0x2e, 0x9d, 0x84, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, \n0x8e, 0xf8, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x0d, 0xb8, 0xd5, 0x1f, 0xb4, 0x20, 0x40, 0x00, \n0xa0, 0x08, 0x92, 0x08, 0x40, 0x20, 0xf8, 0x09, 0x4e, 0x14, 0x00, 0x0a, 0x40, 0x00, 0xc0, 0x09, \n0x84, 0x40, 0x96, 0x48, 0x96, 0x00, 0x4b, 0xe0, 0x20, 0x01, 0xd5, 0x0a, 0x84, 0xa1, 0xda, 0x09, \n0x40, 0x40, 0xc0, 0x09, 0x96, 0x20, 0x96, 0x48, 0x84, 0x40, 0x4b, 0xe0, 0x24, 0x01, 0xc8, 0x0a, \n0xb4, 0xa0, 0x9d, 0xfa, 0xb6, 0xa6, 0x8c, 0xc8, 0x9e, 0x34, 0xe2, 0xea, 0xe9, 0xe0, 0x84, 0x00, \n0xd5, 0x02, 0x84, 0x01, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xfc, 0x96, 0x49, 0x54, 0x70, 0x80, 0x07, 0x41, 0xc0, 0x88, 0x09, 0xcf, 0x35, 0x9d, 0x84, \n0x46, 0xa0, 0x00, 0x05, 0x58, 0xa5, 0x0f, 0x6c, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x8e, 0x70, \n0xd5, 0x26, 0xb4, 0x20, 0x9d, 0xfa, 0x40, 0x00, 0xa0, 0x08, 0x92, 0x08, 0x40, 0x80, 0xf8, 0x09, \n0x4e, 0x14, 0x00, 0x0c, 0x40, 0x00, 0xc0, 0x09, 0xb4, 0x46, 0x96, 0x00, 0x96, 0x48, 0x4b, 0xe0, \n0x24, 0x01, 0x84, 0xa1, 0xd0, 0x13, 0xd5, 0x18, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x0c, 0x40, 0x50, \n0xc0, 0x09, 0xb4, 0x46, 0x96, 0x28, 0x96, 0x48, 0x4b, 0xe0, 0x28, 0x01, 0x4c, 0x04, 0x00, 0x07, \n0xd5, 0x0b, 0x05, 0xe3, 0x00, 0x00, 0x15, 0xe0, 0x00, 0x00, 0x8c, 0xc8, 0x9e, 0x34, 0xe2, 0xfc, \n0xe9, 0xd9, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x85, 0x0c, 0x96, 0xc9, 0x40, 0x21, 0xa1, 0x17, 0x40, 0x11, \n0x88, 0x09, 0xf1, 0x81, 0x4e, 0x83, 0x00, 0x6a, 0x50, 0x70, 0x00, 0x08, 0x9d, 0x84, 0x47, 0xc0, \n0x00, 0x05, 0x59, 0xce, 0x0e, 0x70, 0xd5, 0x5a, 0xb4, 0x20, 0x40, 0x00, 0xa0, 0x08, 0x92, 0x08, \n0x8d, 0x03, 0x40, 0x20, 0xf8, 0x09, 0x4e, 0x14, 0x00, 0x20, 0x40, 0x90, 0xc0, 0x09, 0x54, 0x94, \n0x80, 0xff, 0x54, 0xa0, 0x80, 0xff, 0x80, 0x2a, 0x84, 0x40, 0x80, 0x09, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0x80, 0x40, 0x80, 0x2a, 0x80, 0x09, 0xca, 0x46, 0xb4, 0x66, \n0xb4, 0x82, 0x05, 0xe3, 0x80, 0x00, 0x40, 0x21, 0x8c, 0x05, 0x40, 0x51, 0x10, 0x02, 0x40, 0x22, \n0xf8, 0x04, 0xdd, 0x3c, 0xd5, 0x23, 0x84, 0xa1, 0xda, 0x24, 0x40, 0x00, 0xc0, 0x09, 0x54, 0x90, \n0x00, 0xff, 0x54, 0xa0, 0x80, 0xff, 0x80, 0x2a, 0x84, 0x40, 0x80, 0x09, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x80, 0x40, 0x80, 0x2a, 0x80, 0x09, 0xca, 0x26, 0xb4, 0xa6, \n0xb4, 0x82, 0xb4, 0x67, 0x40, 0x22, 0x94, 0x05, 0x41, 0xe1, 0x10, 0x02, 0x40, 0x2f, 0x0c, 0x04, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8f, 0x6c, 0xdd, 0x2f, 0x84, 0xa1, 0xd0, 0x0d, 0xd5, 0x15, \n0xb4, 0x60, 0xb4, 0x26, 0xb4, 0x47, 0x40, 0x50, 0x84, 0x05, 0x40, 0x41, 0x94, 0x02, 0x41, 0xe2, \n0x08, 0x04, 0x15, 0xe0, 0x00, 0x00, 0x8c, 0xcc, 0x8c, 0xec, 0x05, 0xef, 0x80, 0x01, 0x9e, 0x34, \n0xe3, 0x1e, 0xe9, 0xa3, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0xe6, 0x24, 0xe8, 0x03, \n0x84, 0x01, 0xd5, 0x5b, 0xb4, 0x20, 0x84, 0xa4, 0xd1, 0x2a, 0xe6, 0x25, 0xe8, 0x06, 0x84, 0xa1, \n0xd1, 0x09, 0x84, 0xa3, 0xd9, 0x51, 0xd5, 0x12, 0x84, 0xa5, 0xd1, 0x31, 0x84, 0xa6, 0xd9, 0x4c, \n0xd5, 0x38, 0x9c, 0x04, 0xb4, 0x40, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0c, 0xdc, 0x96, 0x50, \n0xae, 0x40, 0xe6, 0x22, 0xe9, 0x41, 0x84, 0x20, 0xd5, 0x20, 0x9d, 0x04, 0xb4, 0x64, 0x46, 0x10, \n0x00, 0x0b, 0x58, 0x10, 0x80, 0x1c, 0x54, 0x01, 0x80, 0x0f, 0xae, 0x08, 0xe6, 0x04, 0xe9, 0x03, \n0x84, 0x05, 0xd5, 0x31, 0xc8, 0x31, 0x84, 0xa1, 0xaf, 0x48, 0xd5, 0x2f, 0x9c, 0x84, 0xb4, 0x22, \n0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0c, 0xdd, 0x55, 0xe0, 0x80, 0x0f, 0x11, 0xe0, 0x00, 0x00, \n0x5c, 0xff, 0x00, 0x04, 0xe9, 0x21, 0x84, 0x23, 0xae, 0x40, 0xd5, 0x1e, 0x9c, 0xc4, 0xb4, 0x03, \n0x54, 0x00, 0x00, 0x0f, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x88, 0x64, 0xdd, 0x2f, 0xd5, 0x14, \n0x9c, 0x84, 0xb4, 0x02, 0x40, 0x50, 0x40, 0x09, 0x40, 0x10, 0x7c, 0x09, 0x46, 0xf0, 0x00, 0x0b, \n0x10, 0x57, 0x80, 0x1d, 0x46, 0xf0, 0x00, 0x0d, 0x10, 0x17, 0x8c, 0xde, 0x46, 0x10, 0x00, 0x0d, \n0x58, 0x10, 0x8c, 0xdf, 0xae, 0x08, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x04, 0x80, 0x80, 0x04, 0x80, 0xc1, 0x40, 0x14, 0x50, 0x09, \n0x81, 0x20, 0x54, 0x10, 0x80, 0x7f, 0x44, 0x00, 0x00, 0x10, 0x84, 0xe4, 0x4c, 0x10, 0x00, 0x60, \n0xe4, 0x31, 0xe8, 0x18, 0x84, 0xa9, 0xd1, 0x35, 0xe4, 0x2a, 0xe8, 0x0b, 0x84, 0xa2, 0x4c, 0x12, \n0x80, 0x9d, 0x84, 0xa8, 0xd1, 0x26, 0x84, 0xa1, 0x4c, 0x12, 0xc0, 0xf4, 0x48, 0x00, 0x00, 0x8e, \n0x84, 0x0b, 0x4c, 0x10, 0x00, 0x41, 0xe0, 0x20, 0xe9, 0x2c, 0x84, 0xac, 0x4c, 0x12, 0xc0, 0xea, \n0xd5, 0x32, 0x44, 0x50, 0x00, 0x18, 0xd1, 0x5b, 0xe4, 0x39, 0xe8, 0x09, 0x9d, 0x45, 0xd1, 0x4f, \n0x9d, 0x46, 0xd1, 0x0d, 0x9d, 0x44, 0x4c, 0x12, 0xc0, 0xdd, 0xd5, 0x41, 0x9d, 0x6e, 0xd1, 0x65, \n0x9d, 0x69, 0xd1, 0x6b, 0x9f, 0x6e, 0x4c, 0x12, 0xc0, 0xd5, 0xd5, 0x51, 0x84, 0x01, 0xd5, 0x7c, \n0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x88, 0x60, 0xdd, 0x2f, 0xd5, 0x74, \n0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8e, 0x80, 0xdd, 0x2f, 0xd5, 0x6c, \n0xa0, 0x32, 0xa4, 0x76, 0x54, 0x74, 0x3f, 0xff, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8d, 0x88, \n0xdd, 0x2f, 0xd5, 0x62, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8d, 0xfc, \n0xdd, 0x2f, 0xd5, 0x5a, 0xa0, 0x32, 0x50, 0x13, 0x00, 0x0c, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, \n0x88, 0x90, 0xdd, 0x2f, 0xa5, 0xf6, 0x54, 0x73, 0xbf, 0xff, 0xd5, 0x4e, 0xa0, 0x32, 0xa4, 0x76, \n0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x85, 0xd0, 0xdd, 0x2f, 0xd5, 0x46, 0xa0, 0x32, 0xa4, 0x76, \n0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, 0x83, 0x2c, 0xdd, 0x2f, 0xd5, 0x3e, 0xa0, 0x32, 0xa4, 0x76, \n0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8c, 0x3c, 0xdd, 0x2f, 0xd5, 0x36, 0xa0, 0x32, 0xa4, 0x76, \n0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x8b, 0x88, 0xdd, 0x2f, 0xd5, 0x2e, 0x40, 0x24, 0x40, 0x09, \n0xa4, 0x76, 0xa0, 0x32, 0x54, 0x31, 0x00, 0x0f, 0x50, 0x2f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x89, 0xec, 0xdd, 0x2f, 0xd5, 0x75, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x08, \n0x58, 0xf7, 0x82, 0x20, 0xdd, 0x2f, 0xd5, 0x18, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x09, \n0x58, 0xf7, 0x8b, 0xfc, 0xdd, 0x2f, 0xd5, 0x10, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x8f, 0x74, 0xdd, 0x2f, 0xd5, 0x08, 0xa0, 0x32, 0xa4, 0x76, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x88, 0xd0, 0xdd, 0x2f, 0x93, 0x10, 0x54, 0x84, 0x00, 0x0f, 0x4e, 0x82, 0x00, 0x52, \n0x46, 0x3f, 0xff, 0x0f, 0x58, 0x31, 0x8f, 0xff, 0x40, 0x73, 0x8c, 0x02, 0x40, 0x84, 0x40, 0x08, \n0x41, 0xe3, 0xa0, 0x04, 0x42, 0x5f, 0x78, 0x09, 0x42, 0x52, 0xfc, 0x09, 0x46, 0x4f, 0xf0, 0xff, \n0x42, 0x32, 0xf8, 0x08, 0x54, 0x10, 0x00, 0x0f, 0x58, 0x42, 0x0f, 0xff, 0x40, 0x71, 0x90, 0x02, \n0x40, 0x00, 0xd0, 0x08, 0x47, 0xec, 0x6f, 0xff, 0x40, 0x53, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x0d, \n0x00, 0x37, 0x8c, 0xdc, 0x59, 0xef, 0x0f, 0xff, 0x46, 0x11, 0x80, 0x00, 0x40, 0x42, 0xf8, 0x02, \n0x40, 0x72, 0x04, 0x04, 0x54, 0x01, 0x80, 0x03, 0x42, 0x53, 0xe4, 0x09, 0x42, 0x52, 0xe8, 0x09, \n0x41, 0xe0, 0x64, 0x08, 0x40, 0x32, 0xf8, 0x04, 0x42, 0x71, 0xbc, 0x09, 0x54, 0x13, 0xbf, 0xff, \n0xe4, 0x28, 0xe8, 0x07, 0x40, 0x03, 0xb8, 0x09, 0x40, 0x00, 0x38, 0x08, 0x58, 0x70, 0x00, 0x08, \n0x54, 0x53, 0xbf, 0xff, 0x84, 0x21, 0x10, 0x13, 0x00, 0x0f, 0xad, 0x76, 0xa9, 0xf4, 0x80, 0x09, \n0x80, 0x26, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x87, 0xa0, 0xdd, 0x2f, 0x84, 0x01, 0xd5, 0x02, \n0x84, 0x00, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xfc, 0x44, 0x20, 0x00, 0x14, 0x80, 0xc0, 0x80, 0xe1, 0x84, 0x20, 0x46, 0xf0, 0x01, 0x02, \n0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa6, 0x70, 0xa6, 0xb4, 0xa6, 0x31, 0x84, 0x7e, 0x40, 0x40, \n0x8c, 0x02, 0x92, 0x02, 0x94, 0x02, 0x40, 0x51, 0x0c, 0x02, 0xaf, 0x30, 0xaf, 0x74, 0xae, 0x31, \n0xa7, 0x37, 0x00, 0x33, 0x80, 0x9d, 0x54, 0x21, 0x00, 0x02, 0xae, 0xf5, 0xa6, 0xf3, 0xa1, 0x7b, \n0x00, 0x03, 0x80, 0x9e, 0x54, 0x31, 0x80, 0x38, 0x98, 0x28, 0x96, 0x01, 0x40, 0x70, 0x20, 0x09, \n0x54, 0x53, 0x80, 0x0f, 0x92, 0x84, 0x95, 0x24, 0x40, 0x42, 0x14, 0x04, 0x58, 0x21, 0x00, 0x1c, \n0x54, 0x50, 0x80, 0x08, 0x58, 0x31, 0x80, 0x40, 0x84, 0x20, 0xaf, 0x70, 0xaf, 0x37, 0xae, 0xb4, \n0xae, 0x72, 0xae, 0xf3, 0xae, 0x36, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x44, 0x20, 0x00, 0x14, 0x80, 0xc0, 0x80, 0xe1, 0x84, 0x20, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa6, 0x70, 0xa6, 0xb4, 0xa6, 0x31, \n0x84, 0x7e, 0x40, 0x40, 0x8c, 0x02, 0x92, 0x02, 0x94, 0x02, 0x40, 0x51, 0x0c, 0x02, 0xaf, 0x30, \n0xaf, 0x74, 0xae, 0x31, 0xa7, 0x37, 0x00, 0x33, 0x80, 0x9d, 0x54, 0x21, 0x00, 0x02, 0xae, 0xf5, \n0xa6, 0xf3, 0xa1, 0x7b, 0x00, 0x03, 0x80, 0x9e, 0x58, 0x21, 0x00, 0x1c, 0x98, 0x28, 0x96, 0x01, \n0x40, 0x70, 0x20, 0x09, 0x54, 0x53, 0x80, 0x0f, 0x92, 0x84, 0x95, 0x24, 0x40, 0x42, 0x14, 0x04, \n0x54, 0x31, 0x80, 0x38, 0x54, 0x50, 0x80, 0x08, 0x84, 0x20, 0xaf, 0x70, 0xaf, 0x37, 0xae, 0xb4, \n0xae, 0x72, 0xae, 0xf3, 0xae, 0x36, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa0, 0xbc, 0x44, 0x60, 0x00, 0x18, 0x10, 0x60, 0x00, 0x9e, 0x50, 0x60, 0x00, 0x24, \n0x80, 0xe0, 0x84, 0x20, 0x44, 0x20, 0x00, 0x18, 0x80, 0x06, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, \n0x87, 0x08, 0xdd, 0x2f, 0xa6, 0xf0, 0x00, 0x83, 0x00, 0x01, 0x44, 0x0f, 0xff, 0xd8, 0x40, 0x44, \n0x00, 0x02, 0x54, 0x51, 0x80, 0x03, 0x58, 0x22, 0x80, 0x08, 0x58, 0x12, 0x00, 0x01, 0x84, 0x60, \n0x10, 0x33, 0x00, 0x16, 0x10, 0x33, 0x00, 0x17, 0xae, 0xb0, 0xae, 0x71, 0x46, 0x80, 0x01, 0x02, \n0x58, 0x84, 0x06, 0xf0, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x80, 0xb5, 0x84, 0x46, 0x50, 0x03, \n0x80, 0x28, 0x4b, 0xe0, 0x20, 0x01, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x81, 0x28, 0x84, 0x46, \n0x50, 0x03, 0x80, 0x2e, 0x4b, 0xe0, 0x20, 0x01, 0xa0, 0x79, 0x50, 0x03, 0x80, 0x34, 0x84, 0x46, \n0x4b, 0xe0, 0x20, 0x01, 0x00, 0x03, 0x80, 0x94, 0xc0, 0x06, 0xa6, 0x71, 0x59, 0xe0, 0x80, 0x40, \n0x11, 0xe3, 0x00, 0x01, 0xa7, 0x31, 0x42, 0x22, 0x10, 0x09, 0xae, 0xb1, 0x3a, 0x6f, 0xa0, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x80, 0x20, 0x46, 0x00, 0x00, 0x0d, \n0x58, 0x00, 0x0e, 0x74, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x86, 0x7c, 0xdd, 0x2f, 0x84, 0x00, \n0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0xef, 0x60, 0x81, 0x01, \n0x80, 0xe2, 0x50, 0x9f, 0x80, 0x24, 0x84, 0x20, 0x44, 0x20, 0x00, 0xa0, 0x80, 0x1f, 0x81, 0x43, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0x84, 0x80, 0x80, 0x28, 0x80, 0x47, \n0x84, 0x7f, 0x80, 0x09, 0xf4, 0x83, 0x10, 0x3f, 0x80, 0x9d, 0xf4, 0x82, 0xb7, 0x5f, 0x14, 0x8f, \n0x80, 0x01, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xf0, 0xdd, 0x2f, 0x96, 0xb8, 0x40, 0x04, \n0x88, 0x00, 0x9d, 0x43, 0x40, 0x42, 0x88, 0x09, 0x95, 0x22, 0x9a, 0xe0, 0x80, 0x3f, 0x50, 0x0f, \n0x80, 0x10, 0x10, 0x3f, 0x80, 0x9f, 0x10, 0x2f, 0x80, 0x9e, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x82, 0xf0, 0xdd, 0x2f, 0x80, 0x1f, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x84, 0x14, 0xdd, 0x2f, \n0x80, 0xdf, 0x84, 0x01, 0xec, 0xa0, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0x5c, 0x81, 0x00, 0x97, 0x90, 0x40, 0x90, 0x80, 0x13, 0x80, 0x1f, 0x84, 0x20, 0x44, 0x20, \n0x00, 0xa0, 0x04, 0x74, 0x00, 0x02, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, \n0xce, 0x10, 0x46, 0x40, 0x00, 0x0d, 0x58, 0x42, 0x0e, 0x74, 0x00, 0x32, 0x01, 0x70, 0xcb, 0x02, \n0xd5, 0x09, 0x00, 0x02, 0x01, 0x71, 0xc0, 0x05, 0x50, 0x42, 0x01, 0x30, 0x80, 0x46, 0xd5, 0x05, \n0x84, 0x60, 0x80, 0x83, 0x44, 0x20, 0x00, 0xff, 0x87, 0xc1, 0x50, 0x53, 0x80, 0x0e, 0x50, 0x14, \n0xff, 0xf2, 0x80, 0x1f, 0x11, 0xef, 0x80, 0x9d, 0x10, 0x3f, 0x80, 0x94, 0xb7, 0x1f, 0xf5, 0x82, \n0xf1, 0x83, 0xf4, 0xa6, 0x10, 0x2f, 0x80, 0x9c, 0xf7, 0x81, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, \n0x83, 0x70, 0xdd, 0x2f, 0x00, 0x0f, 0x80, 0x9e, 0x50, 0x2f, 0x80, 0x24, 0x99, 0x50, 0x9d, 0xeb, \n0x92, 0xe2, 0x95, 0xfa, 0x9b, 0x3d, 0x10, 0x4f, 0x80, 0x9f, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, \n0x06, 0xf0, 0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, 0x8f, 0xf4, 0x84, 0x46, 0x80, 0x07, 0x4b, 0xe0, \n0x20, 0x01, 0xf1, 0x01, 0x9c, 0x3e, 0x8c, 0x2c, 0x84, 0x42, 0x4b, 0xe0, 0x20, 0x01, 0x00, 0x3f, \n0x80, 0x9e, 0x80, 0x3f, 0x50, 0x21, 0x80, 0x08, 0x50, 0x0f, 0x80, 0x10, 0x10, 0x2f, 0x80, 0x9e, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x82, 0x6c, 0xdd, 0x2f, 0x80, 0x1f, 0x46, 0xf0, 0x00, 0x02, \n0x58, 0xf7, 0x84, 0x14, 0xdd, 0x2f, 0x80, 0xdf, 0x84, 0x00, 0xec, 0xa4, 0x3a, 0x6f, 0xa4, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf0, 0xb4, 0x60, 0xa6, 0x98, 0x54, 0x11, \n0x00, 0x80, 0x4e, 0x12, 0x00, 0x9a, 0x05, 0xe0, 0x00, 0x02, 0x44, 0x50, 0x00, 0x80, 0x00, 0x6f, \n0x00, 0x00, 0x54, 0x43, 0x00, 0xf0, 0x4c, 0x42, 0xc0, 0x90, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x37, \n0x83, 0x5a, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x17, 0x81, 0x88, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, \n0x0e, 0x74, 0x84, 0x41, 0x14, 0x33, 0x00, 0x92, 0x4c, 0x11, 0x40, 0x31, 0x02, 0x10, 0x00, 0x0a, \n0xa0, 0x04, 0x80, 0x5f, 0x50, 0x3f, 0x80, 0x08, 0x50, 0x4f, 0x80, 0x0e, 0x46, 0xf0, 0x00, 0x02, \n0x58, 0xf7, 0x89, 0x84, 0xdd, 0x2f, 0x02, 0x03, 0x01, 0x28, 0xc0, 0x0f, 0x01, 0xe3, 0x02, 0xa8, \n0x84, 0xa1, 0x4d, 0xe2, 0xc0, 0x0b, 0x00, 0x23, 0x02, 0x51, 0xc2, 0x07, 0x84, 0x00, 0x46, 0xf0, \n0x00, 0x02, 0x58, 0xf7, 0x8d, 0xb4, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x07, 0x80, 0xc4, \n0x46, 0xf0, 0x00, 0x0e, 0x00, 0x47, 0x80, 0xc5, 0x46, 0x30, 0x00, 0x0e, 0x58, 0x31, 0x81, 0x88, \n0x87, 0xc0, 0x11, 0xe1, 0x80, 0x03, 0xae, 0x19, 0xaf, 0x1a, 0x46, 0xf0, 0x00, 0x0e, 0x04, 0x27, \n0x80, 0x62, 0x40, 0x21, 0x20, 0x08, 0x92, 0x48, 0x84, 0xa1, 0xda, 0x46, 0x46, 0xf0, 0x00, 0x0e, \n0x00, 0x17, 0x81, 0x8c, 0x4c, 0x11, 0x00, 0x3f, 0x84, 0xa2, 0xd9, 0x04, 0x44, 0x00, 0x00, 0xc8, \n0xd5, 0x12, 0x84, 0xa3, 0xd1, 0x0e, 0x84, 0x04, 0x4c, 0x10, 0x00, 0x0c, 0x56, 0x30, 0x80, 0x05, \n0x45, 0xe0, 0x15, 0x7c, 0x84, 0x40, 0x40, 0x01, 0x0c, 0x1b, 0x40, 0x0f, 0x0c, 0x1a, 0xd5, 0x03, \n0x44, 0x00, 0x07, 0xd0, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x37, 0x80, 0xc2, 0xcb, 0x05, 0x46, 0xf0, \n0x00, 0x0e, 0x00, 0x37, 0x80, 0xc3, 0x46, 0x20, 0x04, 0x11, 0x05, 0xe1, 0x00, 0x49, 0x46, 0xf0, \n0x00, 0x0e, 0x04, 0x57, 0x80, 0x64, 0x40, 0x2f, 0x18, 0x08, 0x44, 0x40, 0x03, 0xe8, 0x42, 0x42, \n0x90, 0x24, 0x51, 0xe1, 0x51, 0x20, 0x40, 0x2f, 0x00, 0x01, 0x9f, 0x59, 0x42, 0x22, 0x14, 0x73, \n0x4e, 0x27, 0x00, 0x0b, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, 0x82, 0x9c, 0xdd, 0x2f, \n0xd5, 0x03, 0x84, 0x02, 0xd5, 0xd8, 0xec, 0x10, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x17, 0x80, 0xc8, 0x80, 0xc0, 0xc1, 0x06, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8f, 0x5c, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x07, \n0x80, 0xd8, 0x84, 0xa1, 0x4c, 0x02, 0x80, 0x8a, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x57, 0x81, 0x88, \n0x4e, 0x52, 0x00, 0x84, 0xb4, 0x26, 0xa6, 0x48, 0x55, 0xe0, 0x80, 0x60, 0x4f, 0xe3, 0x00, 0x0f, \n0x54, 0x20, 0x80, 0x10, 0xc2, 0x0b, 0xa1, 0x32, 0xa6, 0xe1, 0x54, 0x61, 0x80, 0x20, 0x96, 0x70, \n0xc9, 0x05, 0x46, 0xf0, 0x00, 0x0e, 0x10, 0x17, 0x81, 0x8a, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x07, \n0x80, 0xc5, 0xc0, 0x0d, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x01, 0x88, 0x01, 0xe0, 0x00, 0x02, \n0x4f, 0xe2, 0x00, 0x06, 0xa6, 0x41, 0xc1, 0x03, 0x84, 0x20, 0xd5, 0x06, 0x84, 0x21, 0x46, 0x00, \n0x00, 0x0e, 0x58, 0x00, 0x01, 0x88, 0xae, 0x43, 0x46, 0xf0, 0x00, 0x0e, 0x04, 0x47, 0x80, 0x62, \n0x46, 0x0f, 0xf0, 0x00, 0x58, 0x00, 0x00, 0xff, 0x46, 0x30, 0x10, 0x00, 0x40, 0x52, 0x00, 0x02, \n0x58, 0x31, 0x80, 0x01, 0xdb, 0x4a, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8d, 0xb4, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x17, 0x81, 0x8c, 0x84, 0xa1, 0xd1, 0x3c, 0x84, 0xa2, \n0xd9, 0x04, 0x44, 0x00, 0x00, 0xc8, 0xd5, 0x11, 0x84, 0xa3, 0xd1, 0x0d, 0x84, 0xa4, 0xd1, 0x0b, \n0x56, 0x40, 0x80, 0x05, 0x44, 0x50, 0x15, 0x7c, 0x87, 0xc0, 0x40, 0x0f, 0x10, 0x1b, 0x40, 0x02, \n0x90, 0x1a, 0xd5, 0x03, 0x44, 0x00, 0x07, 0xd0, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x37, 0x80, 0xc2, \n0xcb, 0x05, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x37, 0x80, 0xc3, 0x46, 0x20, 0x04, 0x11, 0x05, 0xe1, \n0x00, 0x49, 0x46, 0xf0, 0x00, 0x0e, 0x04, 0x57, 0x80, 0x64, 0x40, 0x2f, 0x18, 0x08, 0x44, 0x40, \n0x03, 0xe8, 0x43, 0xe2, 0x90, 0x24, 0x50, 0x21, 0x51, 0x20, 0x9a, 0x90, 0x9e, 0x19, 0x42, 0x2f, \n0x00, 0x73, 0x4e, 0x27, 0x00, 0x0b, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, 0x82, 0x9c, \n0xdd, 0x2f, 0xd5, 0x03, 0x84, 0x02, 0xd5, 0xd9, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xe0, 0x80, 0x60, 0xa4, 0x06, 0x5c, 0xf0, 0x00, 0x35, 0xe9, 0x2e, \n0xa0, 0x5a, 0x9c, 0x8c, 0xa7, 0x97, 0x40, 0x43, 0x18, 0x09, 0x46, 0xf0, 0x00, 0x0e, 0x10, 0x47, \n0x81, 0x1d, 0xc1, 0x24, 0xa7, 0x89, 0x55, 0xe3, 0x00, 0x01, 0x4f, 0xe3, 0x00, 0x20, 0x54, 0x63, \n0x00, 0x06, 0xce, 0x1c, 0xd5, 0x20, 0x12, 0x20, 0x00, 0x0a, 0x12, 0x60, 0x00, 0x0b, 0xa6, 0xa0, \n0x40, 0x11, 0x08, 0x09, 0x54, 0x10, 0x80, 0x03, 0xc1, 0x0b, 0x84, 0xa2, 0xd1, 0x02, 0xd5, 0x06, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x86, 0xf0, 0xdd, 0x2f, 0x84, 0x01, 0xd5, 0x08, 0x46, 0xf0, \n0x00, 0x02, 0x58, 0xf7, 0x85, 0xa4, 0xdd, 0x2f, 0xd5, 0xf9, 0x84, 0x00, 0xec, 0x20, 0x3a, 0x6f, \n0x98, 0x84, 0xdd, 0x9e, 0x50, 0x0f, 0x80, 0x04, 0x50, 0x40, 0x80, 0x1c, 0xb6, 0x20, 0xa8, 0x81, \n0xa8, 0xc3, 0xa9, 0x02, 0xa9, 0x04, 0x46, 0xf0, 0x00, 0x0e, 0x01, 0xe7, 0x80, 0xd8, 0xa7, 0x53, \n0xa6, 0xd2, 0x54, 0x22, 0x80, 0x0f, 0x40, 0x11, 0x20, 0x08, 0x84, 0xa1, 0x40, 0x20, 0x8c, 0x04, \n0x4d, 0xe2, 0xff, 0xcb, 0xd5, 0xe3, 0x92, 0x00, 0x84, 0x60, 0xd5, 0x0e, 0x38, 0x50, 0x0c, 0x00, \n0x38, 0x40, 0x8c, 0x00, 0x9c, 0xd9, 0xe2, 0x85, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x08, 0xe2, 0xa4, \n0xe8, 0x03, 0x84, 0x02, 0xd5, 0x04, 0xe2, 0x62, 0xe9, 0xf2, 0x84, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0x3c, 0x9c, 0x01, 0x08, 0x60, 0x00, 0x01, 0x96, 0x49, 0xaf, 0x90, 0x08, 0x60, \n0x00, 0x01, 0xaf, 0xa0, 0x08, 0x60, 0x00, 0x01, 0xaf, 0xa8, 0xa7, 0xa0, 0xa7, 0x40, 0xf4, 0x01, \n0xce, 0x05, 0x97, 0xac, 0xc6, 0x03, 0x84, 0xc1, 0xd5, 0x02, 0x84, 0xc0, 0xaf, 0x98, 0x54, 0x32, \n0x80, 0xfe, 0x95, 0x5b, 0xa6, 0x90, 0xe0, 0x25, 0xe9, 0x08, 0x9e, 0x94, 0x99, 0x5a, 0x96, 0xa8, \n0x9d, 0x51, 0x94, 0xab, 0xe0, 0x22, 0xe9, 0x03, 0x84, 0x00, 0xd5, 0x16, 0x40, 0x50, 0x8c, 0x09, \n0x9a, 0xeb, 0x96, 0x98, 0x98, 0x02, 0x96, 0xd4, 0x84, 0xa8, 0x40, 0x21, 0x8c, 0x1a, 0x40, 0x22, \n0x8c, 0x1b, 0x20, 0x00, 0x00, 0x01, 0x54, 0x50, 0x80, 0x0f, 0x9a, 0xea, 0x40, 0x10, 0x0c, 0x0e, \n0x96, 0x4c, 0xc1, 0x04, 0x84, 0x01, 0xae, 0x20, 0xd5, 0x02, 0xae, 0x60, 0x84, 0x01, 0x3a, 0x6f, \n0x98, 0x04, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xdc, 0x85, 0x20, 0xf4, 0x83, 0x12, 0x92, \n0x00, 0x00, 0x80, 0xa0, 0x08, 0x42, 0x80, 0x0a, 0xf3, 0x82, 0x40, 0x82, 0x10, 0x09, 0xf1, 0x85, \n0x14, 0x8f, 0x80, 0x04, 0x80, 0xc0, 0x80, 0x25, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xf0, \n0x80, 0x02, 0x84, 0x46, 0x4b, 0xe0, 0x1c, 0x01, 0xf0, 0x02, 0x50, 0x13, 0x00, 0x10, 0x84, 0x46, \n0x47, 0xc0, 0x00, 0x0d, 0x59, 0xce, 0x0e, 0x74, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0xa0, 0x00, 0x24, \n0x50, 0x73, 0x00, 0x24, 0x50, 0x9e, 0x02, 0x51, 0x50, 0x6f, 0x80, 0x1f, 0x46, 0x80, 0x00, 0x02, \n0x58, 0x84, 0x09, 0x00, 0xd5, 0x2c, 0xf0, 0x03, 0xa4, 0x80, 0x98, 0x51, 0x5e, 0xf0, 0x81, 0x7e, \n0xe8, 0x2f, 0x01, 0xe3, 0x80, 0x00, 0x84, 0x65, 0x4d, 0xe1, 0xc0, 0x1e, 0xf4, 0x04, 0x84, 0xa8, \n0xdc, 0x1a, 0xf0, 0x02, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x80, 0xb5, 0x84, 0x46, 0x46, 0xf0, \n0x01, 0x02, 0x58, 0xf7, 0x86, 0xd4, 0xdd, 0x2f, 0xc8, 0x0e, 0x02, 0x1e, 0x01, 0x26, 0xb7, 0x3f, \n0x80, 0x07, 0x80, 0x46, 0x50, 0x34, 0xff, 0xff, 0x50, 0x44, 0xff, 0xfd, 0x50, 0x54, 0xff, 0xfe, \n0x4b, 0xe0, 0x20, 0x01, 0xa6, 0xb9, 0x9c, 0x52, 0x99, 0xf9, 0x89, 0x41, 0xa6, 0x79, 0x05, 0xef, \n0x80, 0x05, 0x9c, 0xca, 0x40, 0x01, 0xa8, 0x00, 0x40, 0xff, 0x00, 0x06, 0xe8, 0xcd, 0x84, 0x01, \n0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x80, 0xc0, 0x54, 0xa0, \n0x80, 0xff, 0x54, 0x91, 0x00, 0xff, 0x84, 0x20, 0x44, 0x20, 0x00, 0x18, 0x80, 0xe3, 0x81, 0x04, \n0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa7, 0x30, 0xa6, 0x31, 0x54, 0x32, \n0x00, 0x03, 0x40, 0x55, 0x10, 0x08, 0x42, 0x40, 0x00, 0x09, 0x54, 0x24, 0x80, 0x01, 0x40, 0x02, \n0x08, 0x04, 0x40, 0x11, 0x94, 0x04, 0xae, 0x70, 0xae, 0x31, 0x80, 0x27, 0x84, 0x46, 0x46, 0x70, \n0x01, 0x02, 0x58, 0x73, 0x86, 0xf0, 0x9c, 0x34, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x10, 0x00, 0x0e, \n0x58, 0x10, 0x81, 0x28, 0x84, 0x46, 0x50, 0x03, 0x00, 0x0a, 0x4b, 0xe0, 0x1c, 0x01, 0x50, 0x03, \n0x00, 0x10, 0x80, 0x28, 0x84, 0x46, 0x4b, 0xe0, 0x1c, 0x01, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, \n0x3a, 0x2f, 0x94, 0x3c, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x81, 0x20, 0x50, 0x0f, 0x80, 0x20, \n0xf0, 0x81, 0x80, 0xe1, 0x84, 0xc0, 0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xa4, 0xf2, 0x01, \n0x84, 0xbf, 0x9d, 0x14, 0xf4, 0x81, 0x40, 0x04, 0x98, 0x00, 0xb4, 0x62, 0x9c, 0x64, 0x80, 0x43, \n0xd3, 0x07, 0xf1, 0x81, 0x99, 0xb3, 0xb4, 0x24, 0x4b, 0xe0, 0x20, 0x01, 0xd5, 0xf1, 0x80, 0x06, \n0xb6, 0xc7, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xec, 0x10, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x74, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, \n0xfc, 0x84, 0xdd, 0x9e, 0x46, 0x00, 0x04, 0x11, 0xa0, 0x81, 0x58, 0x11, 0x00, 0x0c, 0xa8, 0x41, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0x3c, 0x46, 0x40, 0x04, 0x10, 0x46, 0x30, 0x04, 0x10, \n0x46, 0x20, 0x04, 0x10, 0x58, 0x42, 0x04, 0x38, 0x58, 0x31, 0x8a, 0x30, 0x58, 0x21, 0x0a, 0x34, \n0x84, 0x20, 0xb4, 0xc4, 0xb4, 0xa3, 0x5c, 0x63, 0x00, 0x01, 0x96, 0x28, 0xc0, 0x02, 0x84, 0xc0, \n0xb4, 0xa2, 0x46, 0x7f, 0xf0, 0x0f, 0x58, 0x73, 0x8f, 0x00, 0x40, 0x02, 0x9c, 0x02, 0x9c, 0x49, \n0xc8, 0x02, 0xce, 0x08, 0x84, 0x1f, 0x4c, 0x50, 0x00, 0x92, 0x44, 0x50, 0x07, 0xd0, 0xd9, 0xea, \n0xd5, 0x6b, 0x46, 0x10, 0x04, 0x11, 0x58, 0x10, 0x82, 0x00, 0xb4, 0x81, 0x96, 0xa4, 0xc2, 0x17, \n0x84, 0x40, 0xd5, 0x0b, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0xd9, 0x4c, 0x33, 0x7f, 0xfd, 0x9c, 0x91, \n0x44, 0x70, 0x00, 0x32, 0x4c, 0x23, 0x80, 0x04, 0x84, 0x60, 0xd5, 0xf5, 0x84, 0x7f, 0x4c, 0x41, \n0x80, 0x76, 0x9c, 0x01, 0x44, 0x40, 0x07, 0xd0, 0x4c, 0x02, 0x7f, 0xe9, 0x46, 0x60, 0x04, 0x11, \n0x58, 0x63, 0x00, 0x04, 0xb4, 0x06, 0x84, 0xb7, 0x40, 0x10, 0x14, 0x02, 0x46, 0x40, 0x04, 0x10, \n0x46, 0x30, 0x04, 0x10, 0x46, 0x20, 0x04, 0x10, 0xb6, 0x26, 0x58, 0x42, 0x04, 0x38, 0x58, 0x31, \n0x8a, 0x30, 0x58, 0x21, 0x0a, 0x34, 0x84, 0x20, 0xb4, 0xa4, 0x46, 0x60, 0x0f, 0xf0, 0xb4, 0x03, \n0x40, 0x52, 0x98, 0x02, 0xc0, 0x03, 0x84, 0xa0, 0xd5, 0x03, 0x5c, 0x52, 0x80, 0x01, 0xb4, 0x02, \n0x9c, 0x49, 0xc8, 0x03, 0xc5, 0x05, 0xd5, 0x09, 0x84, 0xff, 0x4c, 0x03, 0x80, 0x48, 0x44, 0x00, \n0x07, 0xd0, 0x4c, 0x10, 0x7f, 0xeb, 0xd5, 0x31, 0x46, 0x10, 0x04, 0x11, 0x58, 0x10, 0x82, 0x00, \n0xb4, 0x81, 0x54, 0x22, 0x00, 0x02, 0xc2, 0x3a, 0x84, 0x40, 0xd5, 0x0b, 0x92, 0x00, 0x84, 0xe7, \n0x9c, 0xd9, 0x4c, 0x33, 0xff, 0xfd, 0x9c, 0x91, 0x44, 0x60, 0x00, 0x32, 0x4c, 0x23, 0x00, 0x04, \n0x84, 0x60, 0xd5, 0xf5, 0x84, 0xff, 0x4c, 0x43, 0x80, 0x2a, 0x9c, 0x01, 0x44, 0x30, 0x07, 0xd0, \n0x4c, 0x01, 0xff, 0xe8, 0xd5, 0x23, 0x46, 0x10, 0x04, 0x10, 0x46, 0x60, 0x04, 0x10, 0x46, 0x40, \n0x04, 0x10, 0x58, 0x10, 0x8a, 0x30, 0x58, 0x63, 0x0a, 0x34, 0x58, 0x42, 0x04, 0x38, 0xb4, 0x41, \n0xb4, 0x26, 0xb4, 0x04, 0x84, 0x00, 0xd5, 0x86, 0x46, 0x20, 0x04, 0x10, 0x46, 0x00, 0x04, 0x10, \n0x46, 0x50, 0x04, 0x10, 0x58, 0x00, 0x0a, 0x34, 0x58, 0x21, 0x0a, 0x30, 0x58, 0x52, 0x84, 0x38, \n0xb4, 0x42, 0xb4, 0x20, 0xb4, 0x05, 0x84, 0x00, 0xd5, 0xc0, 0x3a, 0x6f, 0x9c, 0x04, 0xdd, 0x9e, \n0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x46, 0x60, 0x00, 0x0e, 0x58, 0x63, 0x00, 0xc8, 0x46, 0x70, \n0x01, 0x02, 0x58, 0x73, 0x87, 0x08, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x80, 0x06, 0x4b, 0xe0, \n0x1c, 0x01, 0x84, 0x20, 0x44, 0x20, 0x01, 0x8c, 0x50, 0x03, 0x7e, 0x74, 0x4b, 0xe0, 0x1c, 0x01, \n0x84, 0x20, 0x84, 0x46, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x01, 0x28, 0x4b, 0xe0, 0x1c, 0x01, \n0x84, 0x40, 0x80, 0x62, 0x46, 0x70, 0x00, 0x00, 0x58, 0x73, 0x81, 0x0c, 0x50, 0x03, 0x00, 0x14, \n0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8e, 0x78, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x40, 0x50, 0x03, \n0x00, 0x30, 0x80, 0x62, 0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8d, 0x48, 0x4b, 0xe0, 0x1c, 0x01, \n0x84, 0x00, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8e, 0x74, 0x46, 0xf0, 0x00, 0x0e, 0x10, 0x07, \n0x81, 0x88, 0x10, 0x00, 0x82, 0x65, 0x10, 0x00, 0x82, 0x66, 0x10, 0x00, 0x82, 0x64, 0xec, 0x04, \n0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x00, \n0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x04, 0x20, 0x00, 0xa8, 0x96, 0x54, 0xc1, 0x1c, 0x04, 0x50, \n0x00, 0x92, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x47, 0x83, 0x5a, 0x50, 0x32, 0x83, 0xe8, 0x46, 0x10, \n0x00, 0x0d, 0x58, 0x10, 0x8c, 0xe4, 0xe2, 0x64, 0xe8, 0x0c, 0xb4, 0x81, 0x9c, 0xa1, 0xb6, 0x41, \n0xe4, 0x4a, 0xe9, 0x09, 0x04, 0x50, 0x00, 0xa9, 0x42, 0x32, 0xf0, 0x08, 0x14, 0x30, 0x00, 0xa9, \n0x84, 0x00, 0xb6, 0x01, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x00, 0xf8, 0x44, 0x10, 0x03, 0xe8, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x54, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x81, 0x00, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, \n0x84, 0x94, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x54, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x83, 0x24, 0xdd, 0x2f, 0x80, 0xe0, 0xc0, 0x4c, 0xa1, 0x82, 0x46, 0x30, 0x00, 0x0e, \n0x58, 0x31, 0x80, 0xb5, 0x80, 0x83, 0x80, 0x06, 0x84, 0x24, 0x84, 0x41, 0x46, 0xf0, 0x00, 0x02, \n0x58, 0xf7, 0x8a, 0x58, 0xdd, 0x2f, 0x84, 0x40, 0xae, 0xb2, 0xae, 0xb3, 0x46, 0x10, 0x00, 0x0d, \n0x58, 0x10, 0x8e, 0x74, 0x00, 0x30, 0x82, 0x66, 0xa7, 0x30, 0x00, 0x53, 0x00, 0x16, 0xa6, 0x31, \n0x85, 0x53, 0x54, 0x91, 0x80, 0x0f, 0x40, 0x42, 0x28, 0x02, 0x54, 0x84, 0x00, 0x01, 0x40, 0x94, \n0x90, 0x08, 0x54, 0x52, 0x80, 0x0f, 0x40, 0x84, 0x10, 0x08, 0x42, 0x00, 0x10, 0x09, 0x40, 0x00, \n0x20, 0x04, 0x92, 0x64, 0x58, 0x42, 0x00, 0x08, 0x40, 0x52, 0xa4, 0x04, 0x10, 0x33, 0x00, 0x17, \n0xaf, 0x30, 0x10, 0x53, 0x00, 0x16, 0xae, 0x31, 0x44, 0x30, 0x00, 0xff, 0x00, 0x00, 0x82, 0x66, \n0x9d, 0x01, 0x10, 0x40, 0x82, 0x66, 0x4c, 0x01, 0xc0, 0x04, 0x10, 0x20, 0x82, 0x66, 0x80, 0x26, \n0x80, 0x67, 0x84, 0x00, 0x8c, 0x58, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x84, 0x38, 0xdd, 0x2f, \n0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x0e, 0x00, 0x07, 0x81, 0x88, 0x84, 0x41, 0x46, 0x10, 0x00, 0x02, 0x58, 0x10, 0x8d, 0xb4, \n0x4c, 0x01, 0x40, 0x03, 0xd5, 0x02, 0x84, 0x00, 0x4b, 0xe0, 0x04, 0x01, 0x46, 0x00, 0x00, 0x0e, \n0x58, 0x00, 0x00, 0xdc, 0x44, 0x10, 0x27, 0x10, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x82, 0x54, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x84, 0x20, 0x80, 0xc0, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x84, 0x6c, 0xdd, 0x2f, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8b, 0x44, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, \n0x8e, 0x74, 0x00, 0x20, 0x82, 0x65, 0x84, 0x01, 0x14, 0x60, 0x80, 0xa9, 0x10, 0x00, 0x82, 0x64, \n0xca, 0x14, 0x46, 0x40, 0x04, 0x00, 0x05, 0xe2, 0x00, 0x19, 0x42, 0x5f, 0x00, 0x09, 0x14, 0x52, \n0x00, 0x19, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x34, 0xb4, 0x60, 0x96, 0x99, 0xb6, 0x40, \n0x46, 0x31, 0x23, 0x40, 0xb4, 0x20, 0xd5, 0x15, 0x84, 0xa1, 0xda, 0x16, 0x46, 0x40, 0x04, 0x00, \n0x05, 0xe2, 0x00, 0x20, 0x46, 0x00, 0x04, 0x00, 0x58, 0x5f, 0x00, 0x80, 0x14, 0x52, 0x00, 0x20, \n0x58, 0x00, 0x02, 0x34, 0xb4, 0x60, 0x96, 0x99, 0xb6, 0x40, 0x46, 0x35, 0x67, 0x80, 0xb4, 0x20, \n0x40, 0x10, 0x8c, 0x04, 0xd5, 0x08, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x80, 0xb4, 0x20, \n0x42, 0x10, 0xc0, 0x08, 0xb6, 0x20, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0xf4, 0xa0, 0x82, 0x80, 0xc0, 0xa6, 0xd0, 0x40, 0x11, 0x90, 0x09, 0x54, 0x00, 0x80, 0x04, \n0x4e, 0x03, 0x01, 0x06, 0xb4, 0x26, 0xa6, 0x08, 0x54, 0x40, 0x00, 0x60, 0xc4, 0x05, 0x54, 0x50, \n0x00, 0x80, 0x4e, 0x52, 0x00, 0xfd, 0xa7, 0xd1, 0x54, 0x23, 0x80, 0x40, 0xc2, 0x07, 0x00, 0x90, \n0x80, 0x02, 0x54, 0x84, 0x80, 0x01, 0x4e, 0x82, 0x00, 0xf3, 0x55, 0xe0, 0x00, 0x40, 0x4f, 0xe2, \n0x00, 0x04, 0x84, 0xe3, 0xd5, 0x0e, 0x54, 0x10, 0x00, 0x10, 0xc1, 0x03, 0x84, 0xe1, 0xd5, 0x09, \n0x54, 0x40, 0x00, 0x20, 0x96, 0x20, 0x84, 0x62, 0x40, 0x70, 0x00, 0x1a, 0x40, 0x71, 0x80, 0x1b, \n0xa0, 0xb4, 0x02, 0x13, 0x00, 0x0a, 0x8c, 0x58, 0x51, 0xe0, 0xff, 0xe8, 0x13, 0xe3, 0x00, 0x0a, \n0xa8, 0xb4, 0x04, 0x93, 0x00, 0x02, 0x00, 0x84, 0x80, 0x00, 0x40, 0x54, 0x10, 0x09, 0x54, 0x02, \n0x80, 0x08, 0xc0, 0x1d, 0x02, 0x43, 0x00, 0x0b, 0x58, 0x02, 0x00, 0x40, 0x96, 0x41, 0x12, 0x13, \n0x00, 0x0b, 0xa6, 0x10, 0x96, 0xc2, 0x4e, 0x34, 0x00, 0x06, 0x58, 0x50, 0x80, 0x02, 0x12, 0x53, \n0x00, 0x0b, 0xa0, 0x74, 0x03, 0xe3, 0x00, 0x0a, 0x50, 0x90, 0x80, 0x02, 0x50, 0x8f, 0x7f, 0xfe, \n0x14, 0x93, 0x00, 0x04, 0x12, 0x83, 0x00, 0x0a, 0x54, 0x00, 0x00, 0x0f, 0x10, 0x03, 0x00, 0x18, \n0xb4, 0x06, 0xa6, 0xc1, 0x54, 0x21, 0x80, 0x10, 0xc2, 0x12, 0x02, 0x13, 0x00, 0x0b, 0x05, 0xe3, \n0x00, 0x04, 0x02, 0x93, 0x00, 0x0a, 0x58, 0x80, 0x80, 0x08, 0x50, 0x5f, 0x00, 0x04, 0x50, 0x44, \n0xff, 0xfc, 0x12, 0x83, 0x00, 0x0b, 0xa9, 0x74, 0x12, 0x43, 0x00, 0x0a, 0xb4, 0x06, 0xa6, 0xc1, \n0x54, 0x21, 0x80, 0x40, 0xc2, 0x0c, 0x02, 0x93, 0x00, 0x0b, 0x04, 0x83, 0x00, 0x04, 0x58, 0x54, \n0x80, 0x10, 0x50, 0x44, 0x00, 0x02, 0x12, 0x53, 0x00, 0x0b, 0xa9, 0x34, 0xa0, 0x34, 0x46, 0x80, \n0x01, 0x02, 0x58, 0x84, 0x06, 0xd4, 0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, 0x8f, 0xf4, 0x84, 0x46, \n0x4b, 0xe0, 0x20, 0x01, 0xc0, 0x0a, 0xa0, 0x34, 0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, 0x8f, 0xfc, \n0x84, 0x46, 0x4b, 0xe0, 0x20, 0x01, 0xc8, 0x73, 0x04, 0x93, 0x00, 0x04, 0x02, 0x53, 0x00, 0x0a, \n0x50, 0x14, 0x80, 0x06, 0x51, 0xe2, 0xff, 0xfa, 0xa8, 0x74, 0x13, 0xe3, 0x00, 0x0a, 0x84, 0x42, \n0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x86, 0xf0, 0xdd, 0x2f, 0xa1, 0x34, \n0x02, 0x03, 0x00, 0x0a, 0x9c, 0xe2, 0x9e, 0x82, 0x84, 0xa2, 0xa8, 0xf4, 0x12, 0x23, 0x00, 0x0a, \n0xd7, 0x16, 0x46, 0xf0, 0x00, 0x0e, 0x04, 0x27, 0x80, 0x34, 0x96, 0x54, 0xc1, 0x10, 0x80, 0x06, \n0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x86, 0x44, 0xdd, 0x2f, 0x84, 0xa1, 0xd8, 0x08, 0x80, 0x26, \n0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8e, 0xbc, 0xdd, 0x2f, 0xd5, 0x41, 0x50, 0x9f, 0x80, 0x04, \n0x46, 0x80, 0x01, 0x02, 0x58, 0x84, 0x06, 0xd4, 0x80, 0x09, 0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, \n0x80, 0x04, 0x84, 0x42, 0x4b, 0xe0, 0x20, 0x01, 0xc0, 0x32, 0x80, 0x09, 0x46, 0x10, 0x00, 0x0b, \n0x58, 0x10, 0x80, 0x0c, 0x84, 0x42, 0x4b, 0xe0, 0x20, 0x01, 0xc8, 0x03, 0x84, 0xa2, 0xdf, 0x27, \n0x50, 0x8f, 0x80, 0x04, 0x46, 0x70, 0x01, 0x02, 0x58, 0x73, 0x86, 0xd4, 0x80, 0x08, 0x46, 0x10, \n0x00, 0x0b, 0x58, 0x10, 0x80, 0x10, 0x84, 0x42, 0x4b, 0xe0, 0x1c, 0x01, 0xc0, 0x18, 0x80, 0x08, \n0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, 0x80, 0x08, 0x84, 0x42, 0x4b, 0xe0, 0x1c, 0x01, 0xc8, 0x0f, \n0xa0, 0x74, 0x84, 0xa3, 0x01, 0xe0, 0x80, 0x01, 0x4d, 0xe2, 0xc0, 0x0a, 0x02, 0x23, 0x00, 0x0a, \n0x80, 0x06, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x8f, 0x30, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, \n0xa4, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, \n0x81, 0x94, 0x46, 0xf0, 0x00, 0x0b, 0x14, 0x17, 0x80, 0x54, 0x46, 0x40, 0x04, 0x00, 0x05, 0xe2, \n0x00, 0x08, 0x42, 0x5f, 0x40, 0x09, 0x14, 0x52, 0x00, 0x08, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x8e, 0xcc, 0xdd, 0x2f, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x38, 0xb4, 0x60, 0xb6, 0x60, \n0xa0, 0x81, 0xa8, 0x81, 0xa0, 0x42, 0xa8, 0x42, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x18, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x3c, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x82, 0xec, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x01, 0x58, 0xf7, 0x85, 0x70, 0xdd, 0x2f, \n0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x46, 0x40, 0x00, 0x0d, 0x58, 0x42, 0x0c, 0xe8, \n0x38, 0x12, 0x02, 0x0a, 0x46, 0x10, 0x04, 0x10, 0x58, 0x10, 0x88, 0x00, 0x04, 0x50, 0x80, 0x78, \n0x84, 0x41, 0x40, 0x41, 0x00, 0x0c, 0x40, 0x32, 0x14, 0x04, 0x14, 0x30, 0x80, 0x78, 0x04, 0x20, \n0x80, 0x7a, 0x40, 0x02, 0x08, 0x04, 0x14, 0x00, 0x80, 0x7a, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xf4, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x78, 0x96, 0x40, \n0x96, 0x8c, 0xc2, 0x07, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x3a, 0x84, 0x01, 0xd5, 0x68, \n0x54, 0x10, 0x80, 0x02, 0xc1, 0x07, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x3b, 0x84, 0x02, \n0xd5, 0x5f, 0x41, 0xe0, 0x40, 0x09, 0x54, 0x1f, 0x00, 0xff, 0x54, 0x50, 0x80, 0x02, 0xc5, 0x08, \n0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x4b, 0x44, 0x02, 0x00, 0x00, 0xd5, 0x51, 0x96, 0xcc, \n0xc3, 0x08, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x4a, 0x44, 0x01, 0x00, 0x00, 0xd5, 0x48, \n0x40, 0x10, 0x60, 0x09, 0x97, 0x0c, 0xc4, 0x08, 0x46, 0x00, 0x10, 0x00, 0x46, 0xf0, 0x00, 0x0d, \n0x04, 0x17, 0x83, 0x52, 0xd5, 0x3d, 0x54, 0x50, 0x80, 0x02, 0xc5, 0x08, 0x46, 0x00, 0x20, 0x00, \n0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x53, 0xd5, 0x33, 0x54, 0x20, 0x80, 0x04, 0xc2, 0x08, \n0x46, 0x00, 0x40, 0x00, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x54, 0xd5, 0x29, 0x54, 0x40, \n0x80, 0x10, 0xc4, 0x08, 0x46, 0x01, 0x00, 0x00, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x56, \n0xd5, 0x1f, 0x54, 0x50, 0x80, 0x20, 0xc5, 0x08, 0x46, 0x02, 0x00, 0x00, 0x46, 0xf0, 0x00, 0x0d, \n0x04, 0x17, 0x83, 0x57, 0xd5, 0x15, 0x54, 0x20, 0x80, 0x40, 0xc2, 0x08, 0x46, 0x04, 0x00, 0x00, \n0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x58, 0xd5, 0x0b, 0x54, 0x40, 0x80, 0x80, 0x96, 0x60, \n0xc1, 0x07, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0x59, 0x46, 0x08, 0x00, 0x00, 0x47, 0xe0, \n0x04, 0x10, 0x59, 0xef, 0x08, 0x00, 0x14, 0x0f, 0x00, 0x78, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, \n0x0e, 0x74, 0x04, 0x5f, 0x00, 0x78, 0xf5, 0x81, 0xdd, 0x21, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x44, 0x40, 0x00, 0x40, 0x84, 0xa0, \n0xf5, 0x81, 0x46, 0x10, 0x04, 0x10, 0x10, 0x4f, 0x80, 0x04, 0x10, 0x4f, 0x80, 0x07, 0x58, 0x10, \n0x88, 0x00, 0xb4, 0x61, 0x50, 0x60, 0x00, 0x9c, 0x58, 0x01, 0x80, 0x02, 0xb6, 0x01, 0x80, 0x01, \n0xf2, 0x01, 0x14, 0x20, 0x80, 0x71, 0x04, 0x70, 0x00, 0x71, 0x42, 0x93, 0x8c, 0x0b, 0xf7, 0x81, \n0x81, 0x01, 0x4e, 0x93, 0xff, 0xfa, 0x42, 0x73, 0x84, 0x0b, 0xcf, 0xf6, 0x46, 0x90, 0x00, 0x03, \n0x58, 0x94, 0x8b, 0x34, 0x50, 0x13, 0x7f, 0x64, 0x50, 0x23, 0x7f, 0xe4, 0x50, 0x04, 0x01, 0xa0, \n0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x46, 0x00, 0x04, 0x10, 0x50, 0x13, 0x7f, 0x84, 0x50, 0x23, \n0x7f, 0xec, 0x58, 0x00, 0x09, 0xb0, 0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x46, 0x00, 0x04, 0x10, \n0x46, 0x90, 0x00, 0x03, 0x58, 0x94, 0x8a, 0xe8, 0x50, 0x13, 0x7f, 0xa4, 0x50, 0x23, 0x7f, 0xf4, \n0x58, 0x00, 0x09, 0x80, 0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x46, 0x00, 0x04, 0x10, 0x50, 0x13, \n0x7f, 0xc4, 0x9e, 0xb4, 0x58, 0x00, 0x09, 0x90, 0x84, 0x62, 0x4b, 0xe0, 0x24, 0x01, 0x84, 0x61, \n0xaf, 0xf5, 0xaf, 0xf4, 0x10, 0x34, 0x01, 0xa8, 0x10, 0x34, 0x01, 0xb8, 0x14, 0x73, 0x00, 0x09, \n0xaf, 0xf7, 0xaf, 0xf6, 0xa9, 0xf4, 0xa9, 0xf5, 0xa9, 0xf2, 0xa9, 0xf3, 0x50, 0x03, 0x00, 0x1c, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0xe4, 0xdd, 0x2f, 0x04, 0x04, 0x00, 0x71, 0x58, 0x20, \n0x00, 0x05, 0xf0, 0x81, 0x10, 0x2f, 0x80, 0x04, 0xf1, 0x01, 0x14, 0x14, 0x00, 0x71, 0xec, 0x0c, \n0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x42, 0x11, 0x40, 0x08, \n0x14, 0x10, 0x00, 0x2d, 0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x42, 0x11, 0x44, 0x08, \n0x14, 0x10, 0x00, 0x2d, 0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x58, 0x11, 0x00, 0x01, \n0x14, 0x10, 0x00, 0x2d, 0xdd, 0x9e, 0x92, 0x00, 0x04, 0x20, 0x00, 0x2d, 0x58, 0x11, 0x00, 0x02, \n0x14, 0x10, 0x00, 0x2d, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x3c, 0xef, 0xf4, 0x46, 0x00, \n0x04, 0x10, 0x58, 0x00, 0x08, 0x00, 0x50, 0x10, 0x00, 0x80, 0x85, 0x20, 0x04, 0x40, 0x00, 0x43, \n0x40, 0x32, 0x40, 0x09, 0x54, 0x31, 0x80, 0x0f, 0x80, 0x40, 0xc3, 0x64, 0x84, 0x40, 0x97, 0x5c, \n0xc5, 0x5c, 0x54, 0x61, 0x00, 0x03, 0x14, 0x60, 0x00, 0x43, 0x84, 0xc0, 0x04, 0x80, 0x00, 0x43, \n0x40, 0x44, 0x20, 0x09, 0x54, 0x42, 0x00, 0x7f, 0x40, 0x72, 0x20, 0x08, 0x40, 0x53, 0x90, 0x04, \n0x14, 0x50, 0x00, 0x1d, 0x44, 0x7f, 0xff, 0xc7, 0x04, 0xa0, 0x80, 0x02, 0xb5, 0x01, 0x14, 0xaf, \n0x80, 0x01, 0x8d, 0x04, 0x00, 0xaf, 0x80, 0x07, 0x80, 0xa4, 0x40, 0xa5, 0x1c, 0x02, 0x58, 0xa5, \n0x00, 0x20, 0x10, 0xaf, 0x80, 0x07, 0x54, 0x74, 0x00, 0x7f, 0x40, 0xa4, 0x1c, 0x09, 0x40, 0x74, \n0x9c, 0x06, 0x04, 0x8f, 0x80, 0x01, 0x88, 0xea, 0x14, 0x80, 0x80, 0x02, 0x50, 0x83, 0xff, 0xff, \n0xd5, 0x08, 0x14, 0xa0, 0x00, 0x1b, 0x9d, 0xb1, 0x04, 0xa0, 0x00, 0x1b, 0x54, 0x55, 0x00, 0x7f, \n0x40, 0xa2, 0xa0, 0x08, 0xe2, 0xc8, 0xe9, 0xf6, 0x54, 0x63, 0x80, 0x7f, 0x40, 0x63, 0x20, 0x08, \n0x40, 0x52, 0xc0, 0x08, 0x58, 0x73, 0x00, 0x02, 0x58, 0x63, 0x00, 0x18, 0x40, 0x73, 0x94, 0x04, \n0x40, 0x53, 0x14, 0x04, 0x46, 0x68, 0x0f, 0xff, 0x58, 0x63, 0x0f, 0xff, 0x40, 0x42, 0x60, 0x08, \n0x40, 0x52, 0x98, 0x02, 0x40, 0x73, 0x98, 0x02, 0x40, 0x73, 0x90, 0x04, 0x40, 0x42, 0x90, 0x04, \n0x14, 0x40, 0x00, 0x44, 0x14, 0x70, 0x00, 0x45, 0x9c, 0x91, 0x84, 0xa4, 0xd2, 0x98, 0x92, 0x61, \n0xd5, 0x9f, 0x46, 0x00, 0x20, 0x00, 0x14, 0x01, 0x00, 0x78, 0xec, 0x0c, 0x3a, 0x6f, 0xa8, 0x04, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x3c, 0xef, 0xf4, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, \n0x08, 0x00, 0x50, 0x10, 0x00, 0x80, 0x85, 0x20, 0x04, 0x40, 0x00, 0x40, 0x40, 0x32, 0x40, 0x09, \n0x54, 0x31, 0x80, 0x0f, 0x80, 0x40, 0xc3, 0x6a, 0x84, 0x40, 0x97, 0x5c, 0xc5, 0x62, 0x54, 0x61, \n0x00, 0x03, 0x14, 0x60, 0x00, 0x40, 0x84, 0xc0, 0x04, 0x80, 0x00, 0x40, 0x40, 0x44, 0x20, 0x09, \n0x54, 0x42, 0x00, 0x7f, 0x40, 0x72, 0x20, 0x08, 0x40, 0x53, 0x90, 0x04, 0x14, 0x50, 0x00, 0x1d, \n0x44, 0x7f, 0xff, 0xc7, 0x04, 0xa0, 0x80, 0x02, 0xb5, 0x01, 0x14, 0xaf, 0x80, 0x01, 0x8d, 0x04, \n0x00, 0xaf, 0x80, 0x07, 0x80, 0xa4, 0x40, 0xa5, 0x1c, 0x02, 0x58, 0xa5, 0x00, 0x28, 0x10, 0xaf, \n0x80, 0x07, 0x54, 0x74, 0x00, 0x7f, 0x40, 0xa4, 0x1c, 0x09, 0x40, 0x74, 0x9c, 0x06, 0x04, 0x8f, \n0x80, 0x01, 0x88, 0xea, 0x14, 0x80, 0x80, 0x02, 0x50, 0x83, 0xff, 0xff, 0xd5, 0x08, 0x14, 0xa0, \n0x00, 0x1b, 0x9d, 0xb1, 0x04, 0xa0, 0x00, 0x1b, 0x54, 0x55, 0x00, 0x7f, 0x40, 0xa2, 0xa0, 0x08, \n0xe2, 0xc8, 0xe9, 0xf6, 0x00, 0x8f, 0x80, 0x07, 0x54, 0x63, 0x80, 0x7f, 0x40, 0x74, 0x04, 0x09, \n0x40, 0x63, 0x20, 0x08, 0x54, 0x73, 0x80, 0x03, 0x40, 0x82, 0xc0, 0x08, 0x40, 0x73, 0x98, 0x04, \n0x40, 0x53, 0xa0, 0x04, 0x58, 0x63, 0x00, 0x02, 0x46, 0x78, 0x0f, 0xff, 0x40, 0x63, 0x20, 0x04, \n0x58, 0x73, 0x8f, 0xff, 0x40, 0x82, 0x60, 0x08, 0x40, 0x52, 0x9c, 0x02, 0x40, 0x63, 0x1c, 0x02, \n0x40, 0x63, 0x20, 0x04, 0x40, 0x42, 0xa0, 0x04, 0x14, 0x40, 0x00, 0x41, 0x14, 0x60, 0x00, 0x42, \n0x9c, 0x91, 0x84, 0xa4, 0xd2, 0x92, 0x92, 0x61, 0xd5, 0x99, 0x46, 0x00, 0x10, 0x00, 0x14, 0x01, \n0x00, 0x78, 0xec, 0x0c, 0x3a, 0x6f, 0xa8, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0x3c, \n0x04, 0x50, 0x00, 0x29, 0x04, 0x30, 0x00, 0x2a, 0x9d, 0x2a, 0x9a, 0xa3, 0xe4, 0x42, 0x4e, 0xf3, \n0x00, 0x85, 0x00, 0x30, 0x00, 0xa2, 0x9c, 0x9c, 0x40, 0x81, 0x10, 0x08, 0x40, 0x20, 0x20, 0x00, \n0xa7, 0xd7, 0x54, 0x63, 0x80, 0x80, 0xc6, 0x79, 0xb5, 0x01, 0x50, 0x41, 0x80, 0x24, 0x38, 0x80, \n0x12, 0x0a, 0x00, 0x70, 0x80, 0x9f, 0x00, 0x50, 0x80, 0x9e, 0xa1, 0x0b, 0x99, 0xbd, 0x50, 0x73, \n0x00, 0x14, 0x50, 0x50, 0x80, 0x10, 0x02, 0x81, 0x00, 0x03, 0x95, 0x9c, 0xc4, 0x22, 0x93, 0x0e, \n0x40, 0x84, 0x38, 0x08, 0x40, 0x74, 0x1c, 0x04, 0xad, 0xd3, 0xb6, 0xa2, 0xa7, 0x17, 0x42, 0x42, \n0x18, 0x09, 0xaf, 0x17, 0x99, 0x86, 0xa1, 0x4a, 0x14, 0x53, 0x00, 0x12, 0xa1, 0x0b, 0xa4, 0x52, \n0x54, 0x42, 0x3f, 0xff, 0x92, 0x2e, 0x40, 0x10, 0xb8, 0x08, 0x40, 0x50, 0x90, 0x04, 0xad, 0x52, \n0xa7, 0x17, 0xa6, 0x55, 0x54, 0x52, 0x00, 0x7f, 0x58, 0x10, 0x80, 0x40, 0xaf, 0x57, 0xd5, 0x1b, \n0x93, 0x0e, 0x40, 0x84, 0x38, 0x08, 0x40, 0x74, 0x1c, 0x04, 0xad, 0xd3, 0x99, 0x86, 0xa6, 0x57, \n0xb6, 0xa2, 0x58, 0x10, 0x80, 0x40, 0xae, 0x57, 0x14, 0x43, 0x00, 0x12, 0xa4, 0x52, 0xa7, 0x17, \n0x92, 0x2e, 0x40, 0x10, 0xb8, 0x08, 0xac, 0x52, 0x54, 0x42, 0x00, 0x7f, 0xa6, 0x55, 0xaf, 0x17, \n0x42, 0x10, 0x98, 0x09, 0x95, 0x1c, 0xae, 0x55, 0x98, 0x44, 0x50, 0x10, 0x80, 0x48, 0xa6, 0x8e, \n0x44, 0x5f, 0xff, 0xcf, 0x40, 0x41, 0x14, 0x02, 0x58, 0x22, 0x00, 0x08, 0x9c, 0xdc, 0x84, 0x84, \n0xaf, 0x0f, 0xae, 0x8e, 0x40, 0x51, 0x90, 0x0c, 0x99, 0x05, 0xa4, 0xa3, 0xb4, 0x61, 0x54, 0x51, \n0x3f, 0xff, 0x99, 0x1d, 0xad, 0x0a, 0x46, 0x40, 0x04, 0x10, 0x00, 0x20, 0x00, 0xa2, 0x04, 0x50, \n0x00, 0x2a, 0x9c, 0x51, 0x96, 0x8c, 0x9c, 0xe9, 0x58, 0x42, 0x08, 0x00, 0x14, 0x30, 0x00, 0x2a, \n0x10, 0x20, 0x00, 0xa2, 0x10, 0x22, 0x01, 0x88, 0x3a, 0x6f, 0xa0, 0x04, 0xdd, 0x9e, 0x92, 0x00, \n0x04, 0x50, 0x00, 0x2b, 0x04, 0x30, 0x00, 0x2c, 0x9d, 0x2a, 0x9a, 0xa3, 0xe4, 0x42, 0xe9, 0x3e, \n0x00, 0x30, 0x00, 0xa3, 0x9d, 0x1e, 0x94, 0xa4, 0x98, 0x82, 0xa7, 0x57, 0x54, 0x42, 0x80, 0x80, \n0xc4, 0x35, 0x50, 0x51, 0x80, 0x26, 0x38, 0x10, 0x16, 0x0a, 0x94, 0xdc, 0xa1, 0x0a, 0x98, 0xc3, \n0xb6, 0x82, 0xa1, 0x4c, 0x14, 0x51, 0x80, 0x1b, 0xa5, 0x0e, 0xa4, 0xd3, 0x54, 0x42, 0x3f, 0xff, \n0x92, 0x6e, 0x40, 0x31, 0xb8, 0x08, 0x40, 0x51, 0x90, 0x04, 0xad, 0x53, 0xa7, 0x55, 0x00, 0x40, \n0x80, 0x0f, 0xa6, 0xd7, 0x96, 0x64, 0x95, 0x0e, 0x54, 0x11, 0x80, 0x3f, 0x40, 0x30, 0x90, 0x04, \n0x54, 0x12, 0x80, 0x7f, 0xae, 0xd7, 0xae, 0x55, 0x46, 0x10, 0x04, 0x10, 0x00, 0x50, 0x00, 0xa3, \n0x04, 0x40, 0x00, 0x2c, 0x9c, 0xa9, 0x97, 0x54, 0x9c, 0xe1, 0x58, 0x10, 0x88, 0x00, 0x14, 0x30, \n0x00, 0x2c, 0x10, 0x50, 0x00, 0xa3, 0x10, 0x50, 0x81, 0x98, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0xfc, 0x85, 0x20, 0x80, 0xc0, 0x46, 0x80, 0x00, 0x00, 0x58, 0x84, 0x03, 0x68, 0xd5, 0x22, \n0xa7, 0x1f, 0x54, 0x22, 0x00, 0x80, 0xc2, 0x30, 0x38, 0x23, 0x06, 0x02, 0x38, 0x93, 0x06, 0x0a, \n0x80, 0x22, 0x00, 0x31, 0x00, 0x14, 0xcb, 0x02, 0xd5, 0x05, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, \n0x0e, 0x54, 0x4b, 0xe0, 0x20, 0x01, 0x9c, 0x3e, 0x94, 0xc4, 0x99, 0xf3, 0xa6, 0xbf, 0x44, 0x4f, \n0xff, 0xc0, 0x40, 0x51, 0x10, 0x04, 0xaf, 0x7f, 0x04, 0x13, 0x00, 0x2b, 0x9c, 0x09, 0x14, 0x03, \n0x00, 0x2b, 0x04, 0x23, 0x00, 0x2b, 0x04, 0x53, 0x00, 0x2c, 0x97, 0xd4, 0x9c, 0x7e, 0x95, 0x0c, \n0x41, 0xe2, 0x88, 0x01, 0x50, 0x13, 0x80, 0x26, 0x98, 0xf4, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, \n0x0e, 0x64, 0x4f, 0xe6, 0xff, 0xcf, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x85, 0x20, 0x80, 0xc0, 0x46, 0x80, 0x00, 0x00, 0x58, 0x84, \n0x03, 0x68, 0xd5, 0x1a, 0xa6, 0xff, 0x54, 0x11, 0x80, 0x80, 0xc1, 0x28, 0x38, 0x13, 0x0a, 0x02, \n0x38, 0x93, 0x0a, 0x0a, 0x4b, 0xe0, 0x20, 0x01, 0xa6, 0x7f, 0xa6, 0xfd, 0x44, 0x0f, 0xff, 0xc0, \n0x40, 0x50, 0x80, 0x04, 0x58, 0x41, 0x80, 0x40, 0xaf, 0x7f, 0xaf, 0x3d, 0x04, 0x23, 0x00, 0x29, \n0x9c, 0x11, 0x14, 0x03, 0x00, 0x29, 0x04, 0x43, 0x00, 0x29, 0x04, 0x53, 0x00, 0x2a, 0x96, 0x64, \n0x9c, 0xcc, 0x95, 0xdc, 0x41, 0xe2, 0x90, 0x01, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x54, \n0x50, 0x20, 0x80, 0x24, 0x99, 0xf7, 0x4f, 0xe6, 0xff, 0xd7, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x83, 0x80, 0x50, 0x00, 0x00, 0xb8, \n0x46, 0x40, 0x04, 0x10, 0xf0, 0x81, 0x58, 0x42, 0x08, 0x00, 0x00, 0x7e, 0x00, 0xa1, 0x00, 0x12, \n0x01, 0xbc, 0x9d, 0x7a, 0x94, 0xac, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x54, 0x50, 0xa3, \n0x80, 0x22, 0x40, 0x6e, 0x08, 0x00, 0x4c, 0x70, 0x80, 0x55, 0xa6, 0x77, 0x55, 0xe0, 0x80, 0x80, \n0x4f, 0xe2, 0x00, 0x50, 0x02, 0x83, 0x00, 0x03, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, \n0x83, 0x24, 0xdd, 0x2f, 0x54, 0x94, 0x3f, 0xff, 0x95, 0x3c, 0x81, 0x00, 0x40, 0x3e, 0x10, 0x00, \n0xf0, 0x01, 0xb4, 0x9f, 0x4e, 0x83, 0x00, 0x07, 0xbb, 0x2d, 0x42, 0x01, 0xc4, 0x08, 0xb8, 0xad, \n0xd5, 0x38, 0x39, 0xee, 0x2a, 0x02, 0x84, 0x41, 0x12, 0x9f, 0x00, 0x06, 0x80, 0x3e, 0x04, 0x51, \n0x80, 0x0b, 0x10, 0x2f, 0x00, 0x14, 0x14, 0x5f, 0x00, 0x04, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x83, 0x68, 0xdd, 0x2f, 0x38, 0x8e, 0x2a, 0x0a, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa6, 0xf7, 0x04, 0x84, \n0x00, 0x02, 0x58, 0x01, 0x80, 0x40, 0xae, 0x37, 0xa4, 0x73, 0xb7, 0x06, 0x40, 0x50, 0xb8, 0x09, \n0x40, 0x52, 0xb8, 0x08, 0x58, 0x22, 0x86, 0x40, 0xac, 0xb3, 0xb4, 0x9f, 0x10, 0x72, 0x01, 0xb8, \n0x00, 0xae, 0x00, 0xa1, 0x50, 0x75, 0x00, 0x01, 0x97, 0xbc, 0x10, 0x6e, 0x00, 0xa1, 0xd5, 0x9e, \n0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x83, 0x80, \n0x50, 0x00, 0x00, 0xb8, 0x46, 0x40, 0x04, 0x10, 0xf0, 0x81, 0x58, 0x42, 0x08, 0x00, 0x00, 0x7e, \n0x00, 0xa0, 0x00, 0x52, 0x01, 0xac, 0x94, 0xbc, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x64, \n0x50, 0xa3, 0x80, 0x20, 0x40, 0x6e, 0x08, 0x00, 0xd7, 0x54, 0x01, 0xe3, 0x00, 0x07, 0x54, 0x5f, \n0x00, 0x80, 0xc5, 0x4f, 0x02, 0x83, 0x00, 0x03, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, \n0x83, 0x24, 0xdd, 0x2f, 0x98, 0x7f, 0x54, 0x94, 0x3f, 0xff, 0x81, 0x00, 0x9c, 0x09, 0x95, 0x03, \n0x40, 0x3e, 0x10, 0x00, 0xf0, 0x01, 0xb4, 0x9f, 0x4e, 0x83, 0x00, 0x06, 0x44, 0x31, 0x00, 0x00, \n0xbb, 0xad, 0xd5, 0x37, 0x39, 0xee, 0x2a, 0x02, 0x84, 0x40, 0x12, 0x9f, 0x00, 0x06, 0x80, 0x3e, \n0xa1, 0x59, 0x10, 0x2f, 0x00, 0x14, 0x14, 0x5f, 0x00, 0x04, 0xb6, 0x9f, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x83, 0x68, 0xdd, 0x2f, 0x38, 0x8e, 0x2a, 0x0a, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, \n0x00, 0x10, 0x46, 0xf0, 0x01, 0x02, 0x58, 0xf7, 0x87, 0x08, 0xdd, 0x2f, 0xa6, 0xf7, 0x04, 0x84, \n0x00, 0x02, 0x58, 0x11, 0x80, 0x40, 0xae, 0x77, 0xa5, 0x33, 0xb7, 0x06, 0x40, 0x52, 0x38, 0x09, \n0x40, 0x52, 0xb8, 0x08, 0x58, 0x22, 0x80, 0xc8, 0xac, 0xb3, 0xb4, 0x9f, 0x10, 0x72, 0x01, 0xa8, \n0x00, 0xae, 0x00, 0xa0, 0x50, 0x75, 0x00, 0x01, 0x97, 0xbc, 0x10, 0x6e, 0x00, 0xa0, 0xd5, 0xa0, \n0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0xb6, 0x20, \n0xa8, 0xc1, 0x80, 0xc1, 0xa0, 0x43, 0x84, 0xe0, 0x81, 0x23, 0x81, 0x02, 0xa8, 0x42, 0x47, 0xc0, \n0x01, 0x02, 0x59, 0xce, 0x07, 0x08, 0x81, 0x47, 0xd5, 0x0c, 0xdd, 0x3c, 0xa6, 0xb7, 0x44, 0x3f, \n0xff, 0xc0, 0x40, 0x01, 0x0c, 0x04, 0xae, 0x37, 0x1c, 0xa4, 0x00, 0x01, 0x9d, 0xf9, 0x8c, 0xd0, \n0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0xe2, 0xe9, 0xe9, 0xf0, 0xec, 0x04, 0x3a, 0x6f, \n0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0xb6, 0x20, 0xa8, 0xc1, 0x46, 0x80, \n0x04, 0x10, 0x04, 0x90, 0x00, 0x03, 0x58, 0x84, 0x09, 0xb0, 0x14, 0x90, 0x00, 0x02, 0x44, 0x70, \n0x06, 0x40, 0x83, 0x83, 0x80, 0xc1, 0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, 0x8e, 0x54, 0x40, 0x10, \n0x20, 0x03, 0x44, 0x50, 0x00, 0xc8, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x64, 0x40, 0x41, \n0x84, 0x1a, 0x40, 0x40, 0x04, 0x1b, 0x40, 0x82, 0x84, 0x1b, 0x40, 0x83, 0x84, 0x1a, 0x84, 0xe0, \n0xf4, 0x83, 0x81, 0x42, 0x46, 0x40, 0x01, 0x02, 0x58, 0x42, 0x07, 0x08, 0x81, 0x27, 0x54, 0x34, \n0x3f, 0xff, 0xd5, 0x26, 0xf3, 0x81, 0xf4, 0x82, 0xdd, 0x24, 0xf0, 0x03, 0x46, 0xf0, 0x00, 0x00, \n0x58, 0xf7, 0x83, 0x24, 0xdd, 0x2f, 0xf3, 0x01, 0xf4, 0x02, 0xc0, 0x20, 0x12, 0x80, 0x00, 0x06, \n0x10, 0x90, 0x00, 0x0e, 0x10, 0x90, 0x00, 0x0f, 0xa6, 0x77, 0x9d, 0xf9, 0x55, 0xe0, 0x80, 0x3f, \n0x11, 0xe3, 0x00, 0x07, 0xa5, 0x73, 0x40, 0x12, 0xb8, 0x09, 0x40, 0x10, 0xb8, 0x08, 0x41, 0xe0, \n0x8c, 0x04, 0x13, 0xe3, 0x00, 0x03, 0xa0, 0x82, 0xaa, 0xb4, 0x1c, 0x05, 0x00, 0x01, 0x80, 0x06, \n0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0xe2, 0xfc, 0xe9, 0xd6, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x83, 0x1c, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x69, 0x84, 0xa1, \n0xd8, 0x0b, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x04, 0xb4, 0x80, 0x54, 0x32, 0x01, 0xfd, \n0x58, 0x11, 0x80, 0x02, 0xd5, 0x08, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x04, 0xb4, 0xa0, \n0x54, 0x12, 0x81, 0xfd, 0xb6, 0x20, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x1c, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, \n0xef, 0xfc, 0x46, 0x60, 0x04, 0x00, 0x58, 0x63, 0x00, 0x04, 0x84, 0xe0, 0x85, 0x08, 0x46, 0x90, \n0x00, 0x04, 0x58, 0x94, 0x83, 0x1c, 0x84, 0x01, 0x4b, 0xe0, 0x24, 0x01, 0xb4, 0x46, 0x99, 0xff, \n0x54, 0x11, 0x00, 0x08, 0x84, 0x01, 0x97, 0xf8, 0xc1, 0x03, 0x40, 0x73, 0x80, 0x04, 0x05, 0xe3, \n0x00, 0x00, 0x8f, 0x01, 0x54, 0x5f, 0x01, 0xfe, 0x58, 0x42, 0x80, 0x01, 0xb6, 0x86, 0x54, 0x84, \n0x00, 0xff, 0x4b, 0xe0, 0x24, 0x01, 0xb4, 0x66, 0x54, 0x01, 0x81, 0xfe, 0xb6, 0x06, 0x4e, 0x83, \n0xff, 0xe4, 0x84, 0x08, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x1c, 0xdd, 0x2f, 0x80, 0x07, \n0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x46, 0x60, \n0x04, 0x00, 0x97, 0xc0, 0x58, 0x63, 0x00, 0x04, 0x85, 0x28, 0x46, 0x80, 0x00, 0x04, 0x58, 0x84, \n0x03, 0x1c, 0xb4, 0x46, 0x40, 0x33, 0x9c, 0x09, 0x94, 0x5a, 0x55, 0xe1, 0x01, 0xfb, 0x40, 0x00, \n0xf8, 0x04, 0xb6, 0x06, 0x84, 0x01, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0xa6, 0x84, 0x01, 0x54, 0x42, \n0x81, 0xfe, 0x40, 0x32, 0x00, 0x04, 0xb6, 0x66, 0x8f, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0xb4, 0x46, \n0x84, 0x01, 0x54, 0x11, 0x01, 0xfe, 0xb6, 0x26, 0x99, 0xff, 0x54, 0x94, 0x80, 0xff, 0x4b, 0xe0, \n0x20, 0x01, 0x97, 0xf8, 0x4e, 0x93, 0xff, 0xdf, 0x84, 0x0a, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x83, 0x1c, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x69, 0x84, 0xa1, 0xd8, 0x16, 0x46, 0x60, 0x04, 0x00, \n0x58, 0x63, 0x00, 0x04, 0x05, 0xe3, 0x00, 0x00, 0x54, 0x5f, 0x01, 0xfd, 0x58, 0x42, 0x80, 0x02, \n0xb6, 0x86, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x1c, 0xdd, 0x2f, 0xb4, 0x66, 0x54, 0x21, \n0x81, 0xfd, 0xb6, 0x46, 0xd5, 0x09, 0x46, 0x60, 0x04, 0x00, 0xa0, 0xb1, 0x54, 0x01, 0x01, 0xfd, \n0x58, 0x10, 0x00, 0x02, 0xa8, 0x71, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x1c, \n0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x8d, 0x2c, 0xdd, 0x2f, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8c, 0xb8, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8c, 0x4c, 0xdd, 0x2f, 0x80, 0xc0, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x8b, 0xf4, 0xdd, 0x2f, 0x96, 0x34, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x97, 0x81, 0x97, 0xca, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x8d, 0x2c, 0xdd, 0x2f, 0x84, 0x03, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8c, 0xb8, 0xdd, 0x2f, \n0xcf, 0x05, 0x44, 0x00, 0xfc, 0x00, 0x40, 0x63, 0x00, 0x04, 0x46, 0x70, 0x00, 0x03, 0x58, 0x73, \n0x8c, 0xb8, 0x40, 0x03, 0x20, 0x09, 0x4b, 0xe0, 0x1c, 0x01, 0x96, 0x30, 0x4b, 0xe0, 0x1c, 0x01, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8c, 0x4c, 0xdd, 0x2f, 0x80, 0xc0, 0x46, 0xf0, 0x00, 0x03, \n0x58, 0xf7, 0x8b, 0xf4, 0xdd, 0x2f, 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x60, 0x00, 0x03, 0x58, 0x63, 0x0c, 0xb8, 0x54, 0x80, 0x80, 0xff, \n0x97, 0xc1, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8d, 0x2c, 0xdd, 0x2f, 0x84, 0x02, 0xdd, 0x26, \n0x40, 0x03, 0xa0, 0x09, 0xdd, 0x26, 0x96, 0x38, 0xdd, 0x26, 0x80, 0x08, 0xdd, 0x26, 0x46, 0x60, \n0x00, 0x03, 0x58, 0x63, 0x0d, 0x88, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8b, 0xf4, 0xdd, 0x2f, \n0x4b, 0xe0, 0x18, 0x01, 0xc8, 0xfe, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8d, 0x2c, 0xdd, 0x2f, 0x84, 0x04, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x8c, 0xb8, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8b, 0xf4, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8d, 0x2c, 0xdd, 0x2f, 0x84, 0x06, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x8c, 0xb8, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8b, 0xf4, \n0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x04, 0x00, \n0x80, 0x01, 0x84, 0x48, 0x14, 0x20, 0x81, 0x06, 0x14, 0x20, 0x01, 0x0a, 0xdd, 0x9e, 0x92, 0x00, \n0xef, 0xf8, 0x46, 0x10, 0x00, 0x0d, 0x04, 0x40, 0x83, 0x5a, 0x46, 0x30, 0x04, 0x00, 0x9c, 0xa1, \n0x14, 0x20, 0x83, 0x5a, 0x58, 0x31, 0x84, 0x00, 0xb4, 0x03, 0x46, 0x10, 0x04, 0x00, 0x58, 0x50, \n0x00, 0x11, 0xb6, 0xa3, 0x04, 0x40, 0x81, 0x06, 0x58, 0x22, 0x00, 0x80, 0x14, 0x20, 0x81, 0x06, \n0xb4, 0x03, 0xf0, 0x81, 0xec, 0x08, 0xdd, 0x9e, 0x46, 0x30, 0x04, 0x00, 0x80, 0x03, 0x44, 0x20, \n0x00, 0x4e, 0x44, 0x10, 0x00, 0xa8, 0x14, 0x21, 0x81, 0x04, 0x14, 0x10, 0x01, 0x06, 0xdd, 0x9e, \n0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x5a, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x00, 0x0e, \n0x58, 0x00, 0x01, 0x44, 0x84, 0x80, 0xb6, 0x80, 0x84, 0x21, 0xb4, 0x60, 0xa8, 0xc1, 0xa8, 0x42, \n0xb4, 0x40, 0xa1, 0x42, 0x9f, 0x29, 0x40, 0x32, 0x08, 0x02, 0x9c, 0x5a, 0x95, 0x4a, 0x98, 0xc5, \n0x46, 0x40, 0x00, 0x0e, 0x58, 0x42, 0x01, 0x30, 0xa9, 0x19, 0xb4, 0x40, 0x9c, 0x51, 0xb6, 0x20, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8d, 0x68, 0xb4, 0x41, 0x98, 0x02, \n0xd5, 0x03, 0x64, 0x00, 0x00, 0x00, 0xb4, 0x81, 0x9a, 0xe0, 0x4e, 0x35, 0xff, 0xfc, 0xdd, 0x9e, \n0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, 0xa0, 0x32, 0xc0, 0x2d, 0x84, 0xa2, 0xd0, 0x2b, 0x84, 0xa3, \n0xd8, 0x02, 0xd5, 0x28, 0xa0, 0x33, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x57, 0x83, 0x5b, 0xd0, 0x07, \n0xa0, 0x41, 0x05, 0xe3, 0x00, 0x01, 0x40, 0x50, 0xf8, 0x00, 0xa9, 0x41, 0xa0, 0x73, 0x46, 0x00, \n0x00, 0x0d, 0x58, 0x00, 0x0d, 0x6c, 0x4c, 0x13, 0x40, 0x05, 0x84, 0x40, 0xb6, 0x40, 0xd5, 0x0d, \n0x05, 0xe3, 0x00, 0x04, 0x14, 0x1f, 0x00, 0x03, 0xa1, 0x33, 0xa1, 0x74, 0xa9, 0x64, 0xb4, 0x60, \n0x4c, 0x33, 0x40, 0x04, 0xa0, 0x73, 0xb6, 0x20, 0x84, 0x00, 0x84, 0x43, 0xa8, 0x34, 0xa8, 0xb2, \n0xa8, 0x33, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, 0xec, 0x08, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, 0x80, 0xe1, \n0x80, 0xc0, 0xc1, 0x7a, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, \n0xdd, 0x2f, 0x84, 0x01, 0xa8, 0x32, 0x46, 0x30, 0x00, 0x0d, 0x04, 0x21, 0x83, 0x5b, 0x46, 0x00, \n0x00, 0x0d, 0x58, 0x00, 0x0d, 0x74, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8d, 0x68, 0xca, 0x0b, \n0xa9, 0xb3, 0xa9, 0xb4, 0x14, 0x61, 0x83, 0x5b, 0x46, 0xf0, 0x00, 0x0d, 0x14, 0x77, 0x83, 0x5c, \n0xa9, 0xf1, 0xd5, 0x39, 0xb4, 0x21, 0xb4, 0x00, 0xe2, 0x20, 0xe8, 0x03, 0x9a, 0x01, 0xd5, 0x02, \n0x9a, 0x08, 0x44, 0x10, 0x00, 0x21, 0x40, 0x00, 0x04, 0x37, 0xa0, 0x51, 0xe2, 0x01, 0xe8, 0x03, \n0x9a, 0x08, 0xd5, 0x02, 0x84, 0x00, 0xa8, 0x11, 0xa0, 0xd1, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, \n0x83, 0x5b, 0x46, 0xf0, 0x00, 0x0d, 0x14, 0x37, 0x83, 0x5c, 0xa0, 0x11, 0xe2, 0xe0, 0xe8, 0x0b, \n0x9a, 0x07, 0xa8, 0x11, 0x46, 0x00, 0x00, 0x0d, 0x04, 0x50, 0x03, 0x5b, 0xda, 0x20, 0x14, 0x60, \n0x03, 0x5b, 0xd5, 0x1d, 0xa0, 0x93, 0x9b, 0xf8, 0x4c, 0x20, 0xff, 0xf1, 0xd5, 0x18, 0x14, 0x00, \n0x83, 0x5c, 0xc0, 0x0c, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8d, 0x68, 0x46, 0x00, 0x00, 0x0d, \n0x58, 0x00, 0x0d, 0x74, 0xb4, 0x41, 0xb6, 0x40, 0xd5, 0x03, 0x84, 0x22, 0xa8, 0x72, 0xf0, 0x01, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, 0xd5, 0x16, 0xa8, 0xb3, 0xa0, 0x14, \n0x46, 0x10, 0x00, 0x0d, 0xa8, 0x34, 0x05, 0xe1, 0x00, 0x04, 0x14, 0x6f, 0x00, 0x03, 0xa9, 0x94, \n0xa9, 0xf1, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x37, 0x83, 0x5b, 0x04, 0x40, 0x83, 0x5c, 0xa0, 0x19, \n0xe2, 0x80, 0xe8, 0xd6, 0xd5, 0xe5, 0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8a, 0x70, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x81, 0x44, 0xa0, 0xc9, 0xa1, 0x4a, \n0xf0, 0x01, 0x9f, 0x29, 0x40, 0x22, 0x0c, 0x02, 0x9d, 0x92, 0x95, 0x72, 0x99, 0x0d, 0xa1, 0xa1, \n0xa0, 0xc9, 0x9c, 0x99, 0xa8, 0x89, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, \n0x84, 0x00, 0xa8, 0x34, 0xb6, 0x06, 0xa8, 0x31, 0xa8, 0x32, 0xa8, 0x33, 0x80, 0x06, 0xec, 0x08, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x0d, 0x04, 0x17, 0x83, 0x5a, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x27, 0x83, 0x94, 0x9a, 0x0a, \n0x4e, 0x05, 0x00, 0x07, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, 0x81, 0x98, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x04, 0x01, 0x84, 0x21, 0xa8, 0x42, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x04, 0x01, 0x84, 0x20, 0xb6, 0x20, 0xdd, 0x9e, 0x92, 0x00, \n0x46, 0x10, 0x04, 0x01, 0x96, 0x00, 0xa8, 0x09, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x04, 0x01, \n0x84, 0x22, 0xa8, 0x42, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x04, 0x01, 0x04, 0x00, 0x81, 0x8a, \n0x96, 0x04, 0xc0, 0x04, 0x84, 0x41, 0x14, 0x20, 0x81, 0x8a, 0xdd, 0x9e, 0x46, 0x20, 0x04, 0x01, \n0xa0, 0x52, 0x56, 0x00, 0x80, 0x04, 0x42, 0x00, 0x08, 0x0b, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, \n0x46, 0x50, 0x04, 0x00, 0x46, 0x60, 0x04, 0x01, 0x58, 0x63, 0x06, 0x8c, 0x04, 0x82, 0x80, 0x80, \n0xb4, 0x86, 0x46, 0x70, 0x00, 0x04, 0x58, 0x73, 0x83, 0x28, 0x58, 0x02, 0x00, 0x40, 0xb6, 0x06, \n0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, 0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, 0x44, 0x00, 0x00, 0xff, \n0xdd, 0x27, 0x44, 0x00, 0x00, 0xff, 0xdd, 0x27, 0xb4, 0x66, 0x42, 0x11, 0x98, 0x09, 0x54, 0x04, \n0x00, 0x03, 0xb6, 0x26, 0xc8, 0x14, 0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x04, 0xb4, 0x80, \n0x46, 0x3f, 0xf0, 0xff, 0x58, 0x22, 0x00, 0x01, 0xb6, 0x40, 0x05, 0xe0, 0x00, 0x00, 0x58, 0x31, \n0x8f, 0xff, 0x50, 0x10, 0x00, 0x08, 0x40, 0x2f, 0x0c, 0x02, 0xd5, 0x19, 0x84, 0xa1, 0xd8, 0x1c, \n0x46, 0x00, 0x04, 0x00, 0x58, 0x00, 0x02, 0x04, 0xb4, 0xa0, 0x42, 0x42, 0x80, 0x09, 0xb6, 0x80, \n0x46, 0x3f, 0xf0, 0xff, 0xb4, 0x40, 0x58, 0x31, 0x8f, 0xff, 0x41, 0xe1, 0x0c, 0x02, 0x15, 0xe0, \n0x00, 0x00, 0xb4, 0xa0, 0x50, 0x10, 0x00, 0x08, 0x42, 0x22, 0xd0, 0x08, 0xb6, 0x40, 0xb4, 0x41, \n0x58, 0x01, 0x03, 0x00, 0xb6, 0x01, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0x3c, \n0x96, 0xd8, 0x96, 0x90, 0xcb, 0x15, 0x54, 0x21, 0x00, 0xfc, 0xd5, 0x0f, 0x38, 0x41, 0x84, 0x02, \n0x9c, 0xdc, 0x40, 0x52, 0x60, 0x09, 0x40, 0x72, 0x20, 0x09, 0x40, 0x62, 0x40, 0x09, 0xa9, 0xc1, \n0xa9, 0x82, 0xa9, 0x43, 0xb6, 0x80, 0x8c, 0x10, 0x4c, 0x31, 0x7f, 0xf2, 0xd5, 0x0c, 0x84, 0xa1, \n0xdb, 0x0a, 0x84, 0x60, 0xd5, 0x05, 0xa3, 0xc9, 0x38, 0x71, 0x80, 0x08, 0x9c, 0xd9, 0x97, 0x18, \n0xe2, 0x82, 0xe9, 0xfa, 0x3a, 0x6f, 0x9c, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x96, 0x01, 0x96, 0x89, \n0xe2, 0x02, 0xe8, 0x02, 0x80, 0x20, 0x96, 0x09, 0xdd, 0x9e, 0x92, 0x00, 0x96, 0x00, 0x96, 0x88, \n0xe2, 0x02, 0xe8, 0x02, 0x80, 0x20, 0x96, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0xd5, 0x03, 0x92, 0x00, \n0x9e, 0x01, 0x96, 0x00, 0xc8, 0xfd, 0xdd, 0x9e, 0xd5, 0x08, 0x44, 0x10, 0x00, 0xff, 0x92, 0x00, \n0x9e, 0x49, 0x96, 0x48, 0xc9, 0xfd, 0x9e, 0x01, 0x96, 0x00, 0xc8, 0xf8, 0xdd, 0x9e, 0x92, 0x00, \n0x46, 0x20, 0x00, 0x0d, 0x58, 0x21, 0x0d, 0x78, 0xb4, 0x22, 0xc1, 0x08, 0xd5, 0x09, 0x84, 0x2a, \n0x92, 0x00, 0x9e, 0xc9, 0x96, 0x58, 0xc9, 0xfd, 0x9e, 0x01, 0xc8, 0xfa, 0xd5, 0x0b, 0x8c, 0x1f, \n0x92, 0x05, 0xd5, 0x07, 0x84, 0x28, 0x92, 0x00, 0x9f, 0x09, 0x96, 0x60, 0xc9, 0xfd, 0x9e, 0x01, \n0xc8, 0xfa, 0xdd, 0x9e, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x96, 0x00, 0x54, 0xa0, \n0x80, 0xff, 0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, 0x80, 0x20, 0x97, 0xd1, 0x40, 0x80, 0x04, 0x00, \n0x84, 0xc0, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, 0x8d, 0xc0, 0xd5, 0x09, 0x4b, 0xe0, 0x24, 0x01, \n0x9d, 0xb1, 0x9d, 0xf9, 0x18, 0x04, 0x00, 0x01, 0x97, 0xb0, 0x97, 0xf9, 0x80, 0x07, 0x84, 0x20, \n0xe2, 0xca, 0xe9, 0xf5, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0x00, 0x04, 0x00, 0x04, 0x10, 0x00, 0x09, 0x4e, 0x14, 0x00, 0x04, 0x84, 0x21, 0xd5, 0x02, \n0x84, 0x20, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x17, 0x81, 0x69, 0x44, 0x00, 0x00, 0x11, 0x84, 0x20, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8d, 0xc0, 0xdd, 0x2f, 0x54, 0x30, 0x00, 0x0f, 0x84, 0xa2, \n0xdb, 0x0e, 0x54, 0x40, 0x00, 0x10, 0xc4, 0x09, 0x46, 0x50, 0x04, 0x00, 0x05, 0xe2, 0x80, 0x08, \n0x42, 0x6f, 0x2c, 0x09, 0x14, 0x62, 0x80, 0x08, 0x84, 0x20, 0xd5, 0x02, 0x84, 0x21, 0x46, 0xf0, \n0x00, 0x0b, 0x10, 0x17, 0x81, 0x68, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x68, 0xc8, 0x47, \n0x46, 0x60, 0x00, 0x04, 0x58, 0x63, 0x03, 0x78, 0x84, 0x02, 0x84, 0x21, 0x94, 0x83, 0xdd, 0x26, \n0x84, 0x08, 0x84, 0x26, 0x44, 0x20, 0x00, 0x12, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x24, 0x84, 0x22, \n0x9e, 0x82, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x2a, 0x84, 0x23, 0x94, 0x8b, 0xdd, 0x26, 0x44, 0x00, \n0x00, 0x2e, 0x84, 0x23, 0x44, 0x20, 0x00, 0x1b, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x35, 0x84, 0x21, \n0x44, 0x20, 0x00, 0x1e, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x39, 0x84, 0x21, 0x44, 0x20, 0x00, 0x1f, \n0xdd, 0x26, 0x44, 0x00, 0x00, 0x76, 0x84, 0x21, 0x94, 0x8d, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x7a, \n0x84, 0x21, 0x44, 0x20, 0x00, 0x21, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x78, 0x84, 0x21, 0x44, 0x20, \n0x00, 0x26, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x96, 0x84, 0x21, 0x44, 0x20, 0x00, 0x24, 0xdd, 0x26, \n0x44, 0x00, 0x00, 0x9d, 0x84, 0x21, 0x44, 0x20, 0x00, 0x25, 0xdd, 0x26, 0x3a, 0x6f, 0x98, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x46, 0x80, 0x04, 0x01, 0x97, 0x81, \n0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x00, 0x20, 0x97, 0x08, 0x96, 0x92, 0x96, 0xda, 0x58, 0x84, \n0x04, 0x00, 0x40, 0x93, 0x00, 0x00, 0x84, 0xe0, 0x47, 0xc0, 0x00, 0x03, 0x59, 0xce, 0x0d, 0xc0, \n0x85, 0x47, 0xd5, 0x1a, 0xc3, 0x0b, 0xf2, 0x82, 0xf3, 0x81, 0xf4, 0x83, 0x80, 0x06, 0x84, 0x20, \n0xdd, 0x3c, 0xf2, 0x02, 0xf3, 0x01, 0xf4, 0x03, 0xd5, 0x03, 0x00, 0x04, 0x80, 0x00, 0x9c, 0x79, \n0x9d, 0xb1, 0x56, 0x73, 0x80, 0x01, 0xc2, 0x03, 0x40, 0x05, 0x1c, 0x1a, 0x1c, 0x04, 0x00, 0x01, \n0x97, 0xc8, 0x97, 0xb1, 0x8d, 0x21, 0xe2, 0xe4, 0xe9, 0xe6, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x81, 0xcc, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0b, 0x02, 0x07, 0x80, 0xae, 0xc8, 0x02, 0xd5, 0x03, 0x84, 0xa1, \n0xd8, 0x0b, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x07, 0x81, 0x62, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x81, 0xcc, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xa8, 0xdd, 0x2f, \n0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x0b, 0x00, 0x07, 0x81, 0x65, 0xc8, 0x1c, 0x46, 0xf0, 0x00, 0x0b, 0x02, 0x07, 0x80, 0xae, \n0x84, 0xa1, 0xd8, 0x13, 0x46, 0x40, 0x04, 0x01, 0x04, 0x12, 0x01, 0xa3, 0x46, 0x00, 0x04, 0x10, \n0x59, 0xe0, 0x80, 0x08, 0x54, 0x5f, 0x00, 0xff, 0x14, 0x52, 0x01, 0xa3, 0x58, 0x00, 0x02, 0x38, \n0xb4, 0x60, 0x42, 0x11, 0xc4, 0x08, 0xd5, 0x36, 0x84, 0xa2, 0xd8, 0x50, 0xd5, 0x49, 0x84, 0xa2, \n0xd8, 0x4d, 0x46, 0xf0, 0x00, 0x0b, 0x02, 0x07, 0x80, 0xae, 0xc8, 0x48, 0x46, 0xf0, 0x00, 0x0b, \n0x02, 0x07, 0x80, 0xaf, 0x44, 0x50, 0x00, 0x81, 0xd0, 0x1d, 0x5c, 0xf0, 0x00, 0x82, 0xe8, 0x08, \n0xe6, 0x0a, 0xe8, 0x03, 0xc8, 0x0f, 0xd5, 0x34, 0x9f, 0x69, 0xd8, 0x38, 0xd5, 0x31, 0x9c, 0x6a, \n0x4c, 0x00, 0x80, 0x20, 0xe2, 0x01, 0xe9, 0x18, 0x9d, 0x49, 0xd0, 0x20, 0x9d, 0x4a, 0xd8, 0x2e, \n0xd5, 0x22, 0x97, 0x40, 0x46, 0x40, 0x04, 0x01, 0x94, 0x2d, 0x58, 0x42, 0x00, 0x08, 0x98, 0x04, \n0xd5, 0x05, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x38, 0x05, 0xe0, 0x00, 0x00, 0x58, 0x1f, \n0x00, 0x40, 0xb6, 0x20, 0xd5, 0x15, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x58, 0xd5, 0xf6, \n0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x78, 0xd5, 0xf1, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, \n0x00, 0x98, 0xd5, 0xec, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0xb8, 0xd5, 0xe7, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x81, 0xa8, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x65, 0xc0, 0x05, 0x84, 0xa2, 0x4c, 0x02, \n0xc0, 0xa3, 0xd5, 0x1a, 0x46, 0xf0, 0x00, 0x0b, 0x02, 0x37, 0x80, 0xae, 0x84, 0xa1, 0x4c, 0x32, \n0xc0, 0x9b, 0x46, 0x30, 0x04, 0x01, 0x04, 0x41, 0x81, 0xa3, 0x46, 0x50, 0x04, 0x10, 0x54, 0x22, \n0x00, 0xf7, 0x14, 0x21, 0x81, 0xa3, 0x04, 0x02, 0x80, 0x8e, 0x43, 0xe0, 0x44, 0x09, 0x15, 0xe2, \n0x80, 0x8e, 0x48, 0x00, 0x00, 0x83, 0x46, 0xf0, 0x00, 0x0b, 0x02, 0x57, 0x80, 0xae, 0x4e, 0x53, \n0x00, 0x83, 0x46, 0x20, 0x00, 0x0b, 0x02, 0x01, 0x00, 0xaf, 0x44, 0x50, 0x00, 0x82, 0xd0, 0x3b, \n0x5c, 0xf0, 0x00, 0x83, 0xe8, 0x07, 0xc0, 0x71, 0xe6, 0x0a, 0xe9, 0x0c, 0x9f, 0x69, 0xd8, 0x6d, \n0xd5, 0x25, 0x9c, 0x6a, 0x4c, 0x00, 0x80, 0x4a, 0xe2, 0x01, 0xe9, 0x3a, 0x9d, 0x49, 0xd8, 0x65, \n0xd5, 0x51, 0x55, 0xe0, 0x00, 0xff, 0x46, 0x50, 0x04, 0x01, 0x58, 0x52, 0x86, 0x88, 0x58, 0x3f, \n0x00, 0x60, 0x15, 0xe2, 0x80, 0x00, 0x40, 0x0f, 0x14, 0x08, 0xb6, 0x65, 0x50, 0x12, 0xf9, 0x80, \n0x41, 0xe0, 0x04, 0x00, 0xb4, 0x7e, 0x42, 0x11, 0x98, 0x09, 0xb6, 0x3e, 0x00, 0x01, 0x01, 0x5e, \n0x58, 0x40, 0x00, 0x60, 0xb6, 0x05, 0xb6, 0x85, 0xd5, 0x48, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, \n0x06, 0x88, 0x44, 0x30, 0x00, 0x11, 0x44, 0x20, 0x00, 0x71, 0xb6, 0x60, 0x50, 0x10, 0x79, 0xb0, \n0xb6, 0x40, 0xd5, 0x34, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x06, 0x88, 0x44, 0x30, 0x00, 0x12, \n0x44, 0x20, 0x00, 0x72, 0xb6, 0x60, 0x50, 0x10, 0x79, 0xd0, 0xb6, 0x40, 0xd5, 0x27, 0x46, 0x00, \n0x04, 0x01, 0x58, 0x00, 0x06, 0x88, 0x44, 0x30, 0x00, 0x13, 0x44, 0x20, 0x00, 0x73, 0xb6, 0x60, \n0x50, 0x10, 0x79, 0xf0, 0xb6, 0x40, 0xd5, 0x1a, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x06, 0x88, \n0x44, 0x30, 0x00, 0x14, 0x44, 0x20, 0x00, 0x74, 0xb6, 0x60, 0x50, 0x10, 0x7a, 0x10, 0xb6, 0x40, \n0xd5, 0x0d, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x06, 0x88, 0x44, 0x30, 0x00, 0x15, 0x44, 0x20, \n0x00, 0x75, 0xb6, 0x60, 0xb6, 0x40, 0x50, 0x10, 0x7a, 0x30, 0x05, 0xe0, 0x80, 0x00, 0x42, 0x4f, \n0x18, 0x09, 0xb6, 0x81, 0xb6, 0x60, 0xb6, 0x40, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, \n0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xa8, 0xdd, 0x2f, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x96, 0x92, \n0x97, 0xc1, 0x97, 0x8b, 0xf2, 0x81, 0x47, 0xc0, 0x00, 0x04, 0x59, 0xce, 0x04, 0xb4, 0x46, 0xa0, \n0x00, 0x04, 0x58, 0xa5, 0x01, 0xc0, 0x46, 0x90, 0x00, 0x04, 0x58, 0x94, 0x81, 0xcc, 0xd5, 0x20, \n0x96, 0x30, 0x44, 0x10, 0x00, 0x40, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x0c, 0xdd, 0x2f, \n0x81, 0x00, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xec, 0xdd, 0x2f, 0xc0, 0xfb, 0xf3, 0x01, \n0x80, 0x28, 0x84, 0x40, 0x80, 0x07, 0xdd, 0x3c, 0x50, 0x63, 0x7f, 0xc0, 0x80, 0x08, 0x50, 0x73, \n0x80, 0x40, 0x4b, 0xe0, 0x28, 0x01, 0x97, 0xb3, 0x4b, 0xe0, 0x24, 0x01, 0x97, 0xf9, 0x4e, 0x64, \n0xff, 0xe1, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, \n0x46, 0xf0, 0x00, 0x0b, 0x00, 0x57, 0x81, 0x64, 0x40, 0x80, 0x00, 0x10, 0x4c, 0x54, 0x40, 0x31, \n0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x00, 0x20, 0x44, 0x40, 0x00, 0x40, 0x84, 0x60, 0x10, 0x30, \n0x00, 0x8e, 0x10, 0x40, 0x00, 0x8d, 0x10, 0x40, 0x00, 0x3e, 0x10, 0x30, 0x00, 0x3f, 0x10, 0x40, \n0x00, 0x45, 0x10, 0x30, 0x00, 0x46, 0x10, 0x40, 0x00, 0x4c, 0x10, 0x30, 0x00, 0x4d, 0x10, 0x40, \n0x00, 0x53, 0x10, 0x30, 0x00, 0x54, 0x10, 0x40, 0x00, 0x5a, 0x10, 0x30, 0x00, 0x5b, 0x10, 0x40, \n0x00, 0x61, 0x10, 0x30, 0x00, 0x62, 0x10, 0x40, 0x00, 0x68, 0x10, 0x30, 0x00, 0x69, 0x10, 0x40, \n0x00, 0x6f, 0x10, 0x30, 0x00, 0x70, 0x10, 0x40, 0x00, 0x86, 0x10, 0x30, 0x00, 0x87, 0x46, 0x60, \n0x00, 0x0b, 0x00, 0x03, 0x01, 0x60, 0x44, 0x10, 0x00, 0x40, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x83, 0x0c, 0xdd, 0x2f, 0x80, 0x20, 0x80, 0x48, 0x84, 0x60, 0x80, 0xe0, 0x44, 0x00, 0x00, 0x28, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x84, 0xb4, 0xdd, 0x2f, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x81, 0xc0, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, \n0x00, 0x53, 0x01, 0x60, 0x5c, 0xf2, 0x80, 0x41, 0xe9, 0x37, 0x46, 0x60, 0x00, 0x04, 0x58, 0x63, \n0x01, 0xec, 0x4b, 0xe0, 0x18, 0x01, 0xc0, 0xfe, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x67, 0x80, 0x4c, \n0x84, 0xa1, 0x46, 0x00, 0x00, 0x0b, 0x46, 0x20, 0x00, 0x04, 0x58, 0x21, 0x03, 0x0c, 0xde, 0x05, \n0x00, 0x00, 0x01, 0x60, 0x84, 0x2a, 0xd5, 0x05, 0x00, 0x00, 0x01, 0x60, 0x44, 0x10, 0x00, 0x36, \n0x50, 0x00, 0x7f, 0xc0, 0x96, 0x00, 0x4b, 0xe0, 0x08, 0x01, 0x84, 0x40, 0x80, 0x20, 0x80, 0xc0, \n0x80, 0x62, 0x44, 0x00, 0x00, 0x68, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x84, 0xb4, 0xdd, 0x2f, \n0x80, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xc0, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, 0x46, 0x30, 0x00, 0x0b, 0x58, 0x31, 0x80, 0x20, 0x84, 0x40, \n0x84, 0x82, 0x10, 0x41, 0x80, 0x8e, 0x10, 0x21, 0x80, 0x8d, 0x10, 0x21, 0x80, 0x3e, 0x10, 0x41, \n0x80, 0x3f, 0x10, 0x21, 0x80, 0x45, 0x10, 0x41, 0x80, 0x46, 0x10, 0x21, 0x80, 0x4c, 0x10, 0x41, \n0x80, 0x4d, 0x10, 0x21, 0x80, 0x53, 0x10, 0x41, 0x80, 0x54, 0x10, 0x21, 0x80, 0x5a, 0x10, 0x41, \n0x80, 0x5b, 0x10, 0x21, 0x80, 0x61, 0x10, 0x41, 0x80, 0x62, 0x10, 0x21, 0x80, 0x68, 0x10, 0x41, \n0x80, 0x69, 0x10, 0x21, 0x80, 0x6f, 0x10, 0x41, 0x80, 0x70, 0x10, 0x21, 0x80, 0x86, 0x10, 0x41, \n0x80, 0x87, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x46, 0x80, \n0x00, 0x0b, 0x02, 0x04, 0x00, 0xae, 0x84, 0xa3, 0x40, 0x10, 0x20, 0x09, 0xd1, 0x45, 0xe6, 0x24, \n0xe8, 0x07, 0x84, 0xa1, 0xd1, 0x0d, 0x84, 0xa2, 0x4c, 0x12, 0xc0, 0x98, 0xd5, 0x34, 0x84, 0xa7, \n0xd1, 0x34, 0x84, 0xaf, 0xd1, 0x14, 0x84, 0xa6, 0x4c, 0x12, 0xc0, 0x90, 0xd5, 0x1e, 0x46, 0xf0, \n0x00, 0x0b, 0x00, 0x07, 0x81, 0x60, 0x44, 0x10, 0x00, 0x12, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x83, 0x0c, 0xdd, 0x2f, 0x80, 0x20, 0x84, 0x00, 0x80, 0x40, 0xd5, 0x79, 0x46, 0xf0, 0x00, 0x0b, \n0x00, 0x07, 0x81, 0x60, 0x84, 0x2c, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x0c, 0xdd, 0x2f, \n0x80, 0x20, 0x44, 0x00, 0x00, 0x1c, 0xd5, 0x51, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x60, \n0x84, 0x2a, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x0c, 0xdd, 0x2f, 0x80, 0x20, 0x44, 0x00, \n0x00, 0x12, 0xd5, 0x43, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x88, 0x4c, 0xdd, 0x2f, 0xd5, 0x5f, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x67, 0x81, 0x68, 0xce, 0x03, \n0x96, 0x00, 0xc8, 0x05, 0x44, 0x00, 0x00, 0x9e, 0x84, 0x24, 0xd5, 0x2f, 0x46, 0x70, 0x00, 0x03, \n0x58, 0x73, 0x8d, 0xc0, 0x80, 0x26, 0x50, 0x00, 0x00, 0x27, 0x4b, 0xe0, 0x1c, 0x01, 0x81, 0x20, \n0x80, 0x26, 0x44, 0x00, 0x00, 0x27, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x50, 0x00, 0xff, 0x80, 0x20, \n0xd0, 0x05, 0x00, 0x04, 0x01, 0x5c, 0xe6, 0x0d, 0xe9, 0x1a, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, \n0x81, 0x5c, 0x84, 0xa1, 0xd8, 0x06, 0x44, 0x00, 0x00, 0xa2, 0x44, 0x10, 0x00, 0x12, 0xd5, 0x0d, \n0x84, 0xa2, 0xd8, 0x06, 0x44, 0x00, 0x00, 0xb4, 0x44, 0x10, 0x00, 0x1c, 0xd5, 0x06, 0x84, 0xa3, \n0xd8, 0x24, 0x44, 0x00, 0x00, 0xd0, 0x84, 0x28, 0x84, 0x40, 0xd5, 0x19, 0x40, 0x00, 0xa0, 0x08, \n0x55, 0xe4, 0x80, 0xff, 0x40, 0x8f, 0x00, 0x04, 0x40, 0x84, 0x00, 0x13, 0x80, 0x26, 0x80, 0x08, \n0x4b, 0xe0, 0x1c, 0x01, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x81, 0x60, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x83, 0x0c, 0xdd, 0x2f, 0x80, 0x20, 0x84, 0x41, 0x80, 0x08, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x87, 0xd8, 0xdd, 0x2f, 0xd5, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xa8, \n0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x46, 0x40, 0x04, 0x01, 0x80, 0x64, 0x96, 0x48, 0x96, 0x00, 0x14, 0x02, 0x01, 0x00, \n0x14, 0x11, 0x81, 0x01, 0x96, 0x10, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xc0, 0xdd, 0x2f, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x00, 0x80, 0x20, 0x84, 0x41, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8b, 0x3c, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, \n0x81, 0x62, 0x84, 0x20, 0x84, 0x41, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8b, 0x3c, 0xdd, 0x2f, \n0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, \n0x00, 0x0b, 0x00, 0x07, 0x81, 0x65, 0x44, 0x50, 0x00, 0x81, 0xd0, 0x50, 0x9d, 0x69, 0xd0, 0x0b, \n0x9f, 0x6a, 0xd8, 0x44, 0x47, 0xe0, 0x04, 0x01, 0x04, 0x5f, 0x01, 0xa3, 0x54, 0x42, 0x80, 0x08, \n0xcc, 0x43, 0xd5, 0x44, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x5e, 0x9f, 0x69, 0xd0, 0x12, \n0x5c, 0xf0, 0x00, 0x82, 0xe8, 0x05, 0xc0, 0x3a, 0xe6, 0x0a, 0xe8, 0x30, 0xd5, 0x24, 0x9c, 0x6a, \n0x4c, 0x00, 0x80, 0x13, 0xe2, 0x01, 0xe9, 0x0b, 0x9d, 0x49, 0xd0, 0x13, 0x9d, 0x4a, 0xd8, 0x26, \n0xd5, 0x15, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x38, 0xd5, 0x1b, 0x46, 0x00, 0x04, 0x01, \n0x58, 0x00, 0x00, 0x58, 0xd5, 0x16, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x78, 0xd5, 0x11, \n0x46, 0x00, 0x04, 0x01, 0x58, 0x00, 0x00, 0x98, 0xd5, 0x0c, 0x46, 0x00, 0x04, 0x01, 0x58, 0x00, \n0x00, 0xb8, 0xd5, 0x07, 0x46, 0x50, 0x04, 0x01, 0x95, 0x05, 0x58, 0x52, 0x80, 0x08, 0x98, 0x25, \n0x05, 0xe0, 0x00, 0x00, 0x42, 0x0f, 0x18, 0x0b, 0xd5, 0x0a, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x81, 0xa8, 0xdd, 0x2f, 0xd5, 0x0b, 0x84, 0x02, 0xd5, 0x02, 0x84, 0x00, 0x84, 0x20, 0x84, 0x42, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8b, 0x3c, 0xdd, 0x2f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x30, 0x04, 0x01, 0x04, 0x51, 0x81, 0x80, 0x46, 0xf0, 0x00, 0x0b, \n0x10, 0x57, 0x81, 0x65, 0x80, 0x83, 0x04, 0x12, 0x01, 0x81, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x17, \n0x81, 0x66, 0x80, 0xa3, 0x04, 0x21, 0x81, 0x82, 0x04, 0x42, 0x81, 0x83, 0x96, 0x10, 0x96, 0x60, \n0x40, 0x30, 0xa0, 0x08, 0x40, 0x51, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x0b, 0x12, 0x57, 0x80, 0xae, \n0x46, 0x20, 0x04, 0x01, 0x80, 0x02, 0x04, 0x11, 0x01, 0x84, 0x04, 0x30, 0x01, 0x85, 0x97, 0x08, \n0x97, 0x58, 0x40, 0x22, 0xa0, 0x08, 0x40, 0x51, 0x10, 0x04, 0x46, 0xf0, 0x00, 0x0b, 0x12, 0x57, \n0x80, 0xaf, 0x80, 0x20, 0x04, 0x40, 0x81, 0x86, 0x04, 0x30, 0x01, 0x87, 0x96, 0x60, 0x96, 0x18, \n0x40, 0x40, 0x20, 0x08, 0x40, 0x32, 0x04, 0x04, 0x46, 0x00, 0x04, 0x01, 0x46, 0xf0, 0x00, 0x0b, \n0x12, 0x37, 0x80, 0xb0, 0x84, 0x41, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x0b, 0x14, 0x57, 0x80, 0x55, \n0x46, 0xf0, 0x00, 0x0b, 0x10, 0x27, 0x81, 0x63, 0x14, 0x10, 0x01, 0x8c, 0xdd, 0x9e, 0x92, 0x00, \n0x84, 0x20, 0x46, 0xf0, 0x00, 0x0d, 0x10, 0x17, 0x8d, 0x7c, 0xdd, 0x9e, 0x46, 0x30, 0x04, 0x01, \n0x44, 0x50, 0x00, 0xff, 0x80, 0x43, 0x14, 0x51, 0x81, 0x8a, 0x44, 0x30, 0x00, 0x39, 0x46, 0x10, \n0x04, 0x01, 0x14, 0x31, 0x01, 0x98, 0x58, 0x10, 0x86, 0x88, 0x84, 0x80, 0x44, 0x50, 0x00, 0x10, \n0x44, 0x30, 0x00, 0x70, 0x44, 0x20, 0x00, 0x60, 0xb6, 0xa1, 0x50, 0x00, 0x80, 0x18, 0xb6, 0x61, \n0xb6, 0x81, 0xb6, 0x41, 0x44, 0x10, 0x00, 0x31, 0xb6, 0x20, 0x9d, 0x49, 0x9c, 0x4c, 0x9e, 0xca, \n0x9e, 0x89, 0xb6, 0xa0, 0xb6, 0x60, 0xb6, 0x40, 0xb6, 0x20, 0x80, 0x24, 0x50, 0x20, 0x80, 0x21, \n0x84, 0xa9, 0x9c, 0x49, 0xb6, 0x40, 0xd9, 0xfb, 0x46, 0x00, 0x04, 0x01, 0x44, 0x10, 0x00, 0x3f, \n0x14, 0x10, 0x01, 0x8c, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xe4, 0x84, 0x41, \n0x46, 0xf0, 0x00, 0x0b, 0x10, 0x27, 0x81, 0x64, 0x47, 0xe0, 0x04, 0x01, 0x04, 0x1f, 0x01, 0xa3, \n0x46, 0x40, 0x04, 0x00, 0x58, 0x50, 0x80, 0x01, 0x14, 0x5f, 0x01, 0xa3, 0x83, 0x9e, 0x81, 0x5c, \n0x81, 0x2a, 0x04, 0x02, 0x00, 0x8f, 0x15, 0xcf, 0x80, 0x00, 0x14, 0xaf, 0x80, 0x01, 0x14, 0x9f, \n0x80, 0x02, 0xb4, 0x7f, 0xf2, 0x01, 0xf1, 0x02, 0x81, 0x09, 0x80, 0xe8, 0x80, 0xc7, 0x14, 0x8f, \n0x80, 0x03, 0xf7, 0x84, 0xf6, 0x85, 0x58, 0x31, 0x80, 0x38, 0x58, 0x21, 0x00, 0x58, 0x58, 0x10, \n0x80, 0x78, 0xb6, 0x7f, 0xf2, 0x81, 0xf1, 0x82, 0xf3, 0x03, 0xf2, 0x04, 0xf1, 0x05, 0x58, 0x00, \n0x02, 0x00, 0x58, 0x31, 0x80, 0x98, 0x58, 0x21, 0x00, 0xb8, 0x58, 0x10, 0x80, 0x48, 0xf3, 0x83, \n0xf2, 0x84, 0xf1, 0x85, 0x14, 0x02, 0x00, 0x8f, 0x44, 0x00, 0x00, 0x8c, 0xb4, 0x9f, 0x9e, 0x84, \n0xb6, 0x04, 0x9e, 0xd4, 0xf4, 0x01, 0x9e, 0x43, 0xb6, 0x44, 0x83, 0xc6, 0xf0, 0x02, 0x83, 0x86, \n0xb6, 0x60, 0x81, 0x46, 0xf4, 0x03, 0x81, 0x26, 0xb6, 0x24, 0x81, 0x06, 0xf0, 0x04, 0x80, 0xe6, \n0xb6, 0x40, 0xf4, 0x05, 0x80, 0xa6, 0x44, 0x00, 0x00, 0x20, 0xb6, 0x44, 0x14, 0x3f, 0x00, 0x1a, \n0xb9, 0xa2, 0x14, 0x15, 0x00, 0x2a, 0x14, 0x14, 0x80, 0x32, 0x14, 0x14, 0x00, 0x3a, 0x14, 0x23, \n0x80, 0x42, 0x14, 0x13, 0x00, 0x4a, 0x14, 0x02, 0x81, 0x8c, 0xec, 0x1c, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x46, 0x10, 0x04, 0x01, 0x04, 0x60, \n0x81, 0x8c, 0x96, 0x34, 0xc0, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8c, 0x84, 0xdd, 0x2f, \n0x54, 0x23, 0x00, 0x08, 0xc2, 0x17, 0x46, 0x40, 0x04, 0x01, 0x80, 0x64, 0x84, 0x48, 0x84, 0x20, \n0x84, 0x01, 0x14, 0x22, 0x01, 0x8c, 0x14, 0x11, 0x81, 0xa7, 0x46, 0xf0, 0x00, 0x0d, 0x10, 0x07, \n0x8d, 0x7c, 0x46, 0x30, 0x04, 0x00, 0x04, 0x51, 0x80, 0x96, 0x42, 0x42, 0xfc, 0x08, 0x14, 0x41, \n0x80, 0x96, 0x54, 0x53, 0x00, 0x10, 0xc5, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8d, 0x2c, \n0xdd, 0x2f, 0x54, 0x63, 0x00, 0x20, 0xc6, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x8d, 0x98, \n0xdd, 0x2f, 0x46, 0x00, 0x04, 0x01, 0x05, 0xe0, 0x01, 0x8c, 0x15, 0xef, 0x80, 0x01, 0xec, 0x08, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x50, 0x0f, \n0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x01, \n0x44, 0x50, 0x00, 0x80, 0x14, 0x52, 0x01, 0xa8, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x07, 0x81, 0x65, \n0x46, 0x60, 0x00, 0x0b, 0x84, 0x40, 0x54, 0x00, 0x00, 0x60, 0x44, 0x10, 0x00, 0x20, 0x10, 0x23, \n0x01, 0x63, 0x4c, 0x00, 0x80, 0x20, 0x95, 0x49, 0xd0, 0x14, 0xc8, 0x1c, 0x46, 0xf0, 0x00, 0x0b, \n0x00, 0x07, 0x81, 0x66, 0x84, 0x2c, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x0c, 0xdd, 0x2f, \n0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, 0x8e, 0xe8, 0x38, 0x20, 0x82, 0x02, 0xdd, 0x22, 0xd5, 0x0f, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x83, 0xc4, 0xdd, 0x2f, 0x96, 0xc0, 0x10, 0x33, 0x01, 0x63, \n0xd5, 0x06, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xa8, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x01, \n0x84, 0xa0, 0x14, 0x52, 0x01, 0xa8, 0xf0, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, \n0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xf4, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0xbc, 0xdd, 0x2f, 0x46, 0x50, 0x04, 0x01, \n0x04, 0x02, 0x81, 0xa3, 0x54, 0x00, 0x00, 0x02, 0xc8, 0x66, 0x80, 0xe5, 0xb6, 0xff, 0x80, 0xc5, \n0xb4, 0x3f, 0xf6, 0x81, 0x58, 0x10, 0x80, 0xb8, 0xb6, 0x3f, 0xf1, 0x01, 0x80, 0x45, 0x58, 0x10, \n0x80, 0x88, 0xf1, 0x81, 0x44, 0x10, 0x00, 0x8b, 0x14, 0x11, 0x00, 0x26, 0x83, 0xc2, 0xb4, 0x5f, \n0x83, 0x85, 0xb6, 0x22, 0x81, 0x45, 0xf2, 0x01, 0x81, 0x25, 0x81, 0x05, 0x80, 0xe5, 0xb6, 0x22, \n0x80, 0xc5, 0x44, 0x20, 0x00, 0xff, 0x46, 0x40, 0x04, 0x01, 0x14, 0x1f, 0x00, 0x2a, 0x58, 0x42, \n0x06, 0x88, 0xb9, 0xb2, 0x14, 0x15, 0x00, 0x3a, 0x14, 0x14, 0x80, 0x42, 0x14, 0x14, 0x00, 0x4a, \n0x14, 0x23, 0x81, 0x8a, 0x44, 0x10, 0x00, 0x39, 0x44, 0x20, 0x00, 0x10, 0x14, 0x13, 0x01, 0x98, \n0xb6, 0x44, 0x44, 0x10, 0x00, 0x70, 0x44, 0x20, 0x00, 0x60, 0xb6, 0x24, 0x50, 0x32, 0x00, 0x18, \n0xb6, 0x04, 0x84, 0x22, 0xb6, 0x44, 0x44, 0x20, 0x00, 0x31, 0x14, 0x12, 0x81, 0xa3, 0x9d, 0x12, \n0xb6, 0x43, 0x9c, 0x53, 0x9f, 0x4a, 0x9c, 0x89, 0xb6, 0xa3, 0xb6, 0x83, 0xb6, 0x23, 0xb6, 0x43, \n0x80, 0x23, 0x50, 0x50, 0x00, 0x21, 0x84, 0x69, 0x9c, 0x01, 0xb6, 0xa1, 0x4c, 0x01, 0xff, 0xfb, \n0x80, 0xa6, 0x44, 0x00, 0x00, 0x3f, 0x84, 0x20, 0x14, 0x02, 0x81, 0x8c, 0x46, 0xf0, 0x00, 0x0b, \n0x10, 0x17, 0x81, 0x64, 0x80, 0x05, 0x04, 0x20, 0x01, 0xa3, 0x54, 0x41, 0x00, 0xfe, 0x14, 0x40, \n0x01, 0xa3, 0xd5, 0x38, 0x46, 0x40, 0x04, 0x00, 0x04, 0x32, 0x00, 0x85, 0x80, 0xe5, 0x46, 0x00, \n0x04, 0x01, 0x58, 0x00, 0x06, 0xa0, 0x58, 0x21, 0x80, 0x04, 0x44, 0x60, 0x00, 0x39, 0x45, 0xe0, \n0x00, 0x31, 0x45, 0xc0, 0x00, 0x32, 0x44, 0xa0, 0x00, 0x33, 0x44, 0x90, 0x00, 0x34, 0x44, 0x80, \n0x00, 0x35, 0x14, 0x22, 0x00, 0x85, 0x14, 0x63, 0x81, 0x98, 0x15, 0xe0, 0x00, 0x00, 0x15, 0xc0, \n0x00, 0x00, 0xb7, 0x40, 0xb7, 0x20, 0xb7, 0x00, 0x84, 0x20, 0x50, 0x80, 0x80, 0x21, 0x84, 0xa9, \n0x9c, 0x49, 0xb7, 0x00, 0xd9, 0xfb, 0x81, 0x27, 0x8d, 0x4c, 0x14, 0xa4, 0x81, 0x8c, 0x80, 0x07, \n0x04, 0x10, 0x01, 0xa3, 0x96, 0x4c, 0xc1, 0x02, 0x84, 0x21, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x17, \n0x81, 0x64, 0x46, 0x00, 0x04, 0x01, 0x84, 0xa0, 0x84, 0x40, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x27, \n0x81, 0x6a, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x27, 0x81, 0x63, 0x46, 0xf0, 0x00, 0x0b, 0x14, 0x57, \n0x80, 0x56, 0x14, 0x50, 0x01, 0xa8, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x37, 0x81, 0x64, 0x46, 0xf0, \n0x00, 0x0b, 0x00, 0x07, 0x81, 0x68, 0x46, 0xf0, 0x00, 0x0b, 0x00, 0x47, 0x81, 0x69, 0x40, 0x11, \n0xa4, 0x08, 0x40, 0x00, 0x28, 0x08, 0x40, 0x30, 0x80, 0x04, 0x58, 0x01, 0x80, 0x02, 0x40, 0x12, \n0x2c, 0x08, 0x46, 0x40, 0x04, 0x00, 0x40, 0x20, 0x04, 0x04, 0x46, 0xf0, 0x00, 0x0b, 0x10, 0x57, \n0x81, 0x67, 0x14, 0x22, 0x00, 0x8f, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x60, 0x00, 0x04, 0x58, 0x63, 0x01, 0xd8, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x81, 0xb4, 0xdd, 0x2f, 0x4b, 0xe0, 0x18, 0x01, 0xc0, 0xfe, 0x46, 0x00, 0x04, 0x01, \n0xb4, 0x40, 0x46, 0x00, 0x04, 0x01, 0x96, 0x90, 0x58, 0x00, 0x05, 0x00, 0x84, 0x20, 0xd5, 0x05, \n0xa3, 0x01, 0x96, 0xe0, 0x18, 0x30, 0x80, 0x01, 0xe0, 0x22, 0xe9, 0xfb, 0x47, 0xe0, 0x00, 0x0b, \n0x02, 0x3f, 0x00, 0xb0, 0x84, 0x20, 0x9a, 0x1a, 0x97, 0x41, 0x40, 0x00, 0x94, 0x06, 0x12, 0x5f, \n0x00, 0xb0, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x60, 0x00, 0x04, \n0x58, 0x63, 0x01, 0xd8, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xb4, 0xdd, 0x2f, 0x4b, 0xe0, \n0x18, 0x01, 0xc0, 0xfe, 0x47, 0xe0, 0x04, 0x01, 0xb4, 0xde, 0x97, 0xb0, 0x46, 0xf0, 0x00, 0x0b, \n0x04, 0x07, 0x80, 0x55, 0x46, 0x10, 0x04, 0x01, 0x80, 0x46, 0x58, 0x10, 0x85, 0x00, 0x84, 0x61, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x82, 0xac, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x0b, 0x02, 0x40, \n0x80, 0xb0, 0x84, 0x00, 0x9a, 0xe6, 0x96, 0x99, 0x40, 0x00, 0x08, 0x06, 0x12, 0x20, 0x80, 0xb0, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x60, 0x00, 0x0b, \n0x58, 0x63, 0x01, 0x60, 0xa4, 0x30, 0x44, 0x10, 0x00, 0x40, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x82, 0xfc, 0xdd, 0x2f, 0x46, 0x80, 0x00, 0x0b, 0x58, 0x84, 0x01, 0x54, 0x97, 0xc0, 0xb4, 0x28, \n0x46, 0x00, 0x04, 0x01, 0x80, 0x47, 0x58, 0x00, 0x04, 0x00, 0x84, 0x60, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x82, 0xac, 0xdd, 0x2f, 0xb4, 0x68, 0x80, 0x07, 0x98, 0xbb, 0xb6, 0x48, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x81, 0xc0, 0xdd, 0x2f, 0xa4, 0x70, 0x84, 0x00, 0x9b, 0xcf, 0x97, 0xf9, \n0x40, 0x00, 0x1c, 0x06, 0xad, 0xf0, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xf4, 0x96, 0x02, 0xf0, 0x81, 0x84, 0xc0, 0x46, 0xa0, 0x00, 0x04, 0x58, 0xa5, 0x02, 0xfc, \n0x46, 0x70, 0x00, 0x0b, 0x58, 0x73, 0x81, 0x54, 0x46, 0x90, 0x00, 0x03, 0x58, 0x94, 0x8d, 0xc0, \n0xd5, 0x12, 0x00, 0x83, 0x80, 0x01, 0xa7, 0x78, 0x40, 0x44, 0x20, 0x08, 0x40, 0x02, 0x14, 0x04, \n0xb6, 0x7f, 0x4b, 0xe0, 0x24, 0x01, 0xb4, 0x7f, 0x9d, 0xb1, 0xb6, 0x03, 0x97, 0xb0, 0xb4, 0x47, \n0x9c, 0x51, 0xb6, 0x27, 0x46, 0xf0, 0x00, 0x0b, 0x02, 0x07, 0x80, 0xb0, 0x44, 0x10, 0x00, 0x40, \n0x4b, 0xe0, 0x28, 0x01, 0x46, 0x10, 0x01, 0x00, 0x58, 0x10, 0x85, 0x00, 0x98, 0xb1, 0x46, 0x80, \n0x00, 0x0b, 0xf1, 0x01, 0x94, 0xd2, 0xe2, 0xc0, 0xe9, 0xdd, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x04, \n0x58, 0xf7, 0x81, 0xc0, 0xdd, 0x2f, 0x02, 0x34, 0x00, 0xb0, 0x84, 0x00, 0x9b, 0x9e, 0x97, 0xb1, \n0x40, 0x00, 0x18, 0x06, 0x12, 0x64, 0x00, 0xb0, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x46, 0x70, 0x00, 0x04, 0x58, 0x73, 0x81, 0xd8, 0x97, 0x82, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xb4, 0xdd, 0x2f, 0x4b, 0xe0, 0x1c, 0x01, 0xc0, 0xfe, \n0x46, 0x20, 0x04, 0x01, 0xb5, 0x22, 0x85, 0x00, 0x44, 0x10, 0x00, 0xfc, 0x40, 0x04, 0x18, 0x1b, \n0x40, 0x00, 0x98, 0x1a, 0x46, 0x70, 0x04, 0x01, 0xf0, 0x81, 0x54, 0x94, 0x80, 0xff, 0x58, 0x73, \n0x85, 0x00, 0x47, 0xc0, 0x00, 0x03, 0x59, 0xce, 0x0e, 0x9c, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, \n0x01, 0x54, 0x46, 0xa0, 0x00, 0x03, 0x58, 0xa5, 0x0e, 0x20, 0xd5, 0x15, 0xdd, 0x3c, 0xa7, 0x31, \n0xf2, 0x01, 0xa6, 0x70, 0x40, 0x31, 0x10, 0x04, 0xa3, 0x79, 0x40, 0x01, 0xa0, 0x08, 0x40, 0x00, \n0x04, 0x04, 0x96, 0x68, 0x4b, 0xe0, 0x28, 0x01, 0xb4, 0x86, 0x8d, 0x01, 0x9c, 0xe1, 0xb6, 0x66, \n0x54, 0x84, 0x00, 0xff, 0xe3, 0x09, 0xe9, 0xeb, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8e, 0x6c, \n0xdd, 0x2f, 0x46, 0x30, 0x00, 0x0b, 0x02, 0x41, 0x80, 0xb0, 0x84, 0x20, 0x40, 0x02, 0x24, 0x01, \n0x97, 0x41, 0x40, 0x00, 0x94, 0x06, 0x12, 0x51, 0x80, 0xb0, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x66, \n0xa6, 0x00, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, 0x01, 0x6a, 0x84, 0x40, 0x44, 0x10, 0x00, 0x26, \n0xae, 0xb0, 0x4c, 0x00, 0x81, 0xde, 0x5c, 0xf0, 0x00, 0x27, 0xe8, 0x35, 0x84, 0x68, 0x4c, 0x01, \n0x82, 0x45, 0xe6, 0x09, 0xe8, 0x15, 0x84, 0x83, 0x4c, 0x02, 0x01, 0x7b, 0xe6, 0x04, 0xe8, 0x08, \n0x84, 0xa1, 0xd0, 0x6e, 0x87, 0xc2, 0x4c, 0x0f, 0x42, 0x5f, 0x48, 0x00, 0x01, 0x5c, 0x84, 0x26, \n0x4c, 0x00, 0x81, 0x67, 0x84, 0x47, 0x4c, 0x01, 0x42, 0x57, 0x48, 0x00, 0x01, 0x6a, 0x84, 0x6b, \n0x4c, 0x01, 0x82, 0x35, 0xe6, 0x0c, 0xe8, 0x09, 0x84, 0x89, 0x4c, 0x02, 0x02, 0x30, 0x84, 0xaa, \n0x4c, 0x02, 0xc2, 0x4a, 0x48, 0x00, 0x02, 0x24, 0x45, 0xe0, 0x00, 0x22, 0x4c, 0x0f, 0x01, 0xa1, \n0x44, 0x10, 0x00, 0x23, 0x4c, 0x00, 0x81, 0xb8, 0x44, 0x20, 0x00, 0x20, 0x4c, 0x01, 0x42, 0x3c, \n0x48, 0x00, 0x01, 0x89, 0x44, 0x30, 0x00, 0x43, 0x4c, 0x01, 0x81, 0x79, 0x5c, 0xf0, 0x00, 0x44, \n0xe8, 0x20, 0x44, 0x40, 0x00, 0x33, 0x4c, 0x02, 0x01, 0xcc, 0x5c, 0xf0, 0x00, 0x34, 0xe8, 0x0b, \n0x44, 0x50, 0x00, 0x27, 0x4c, 0x02, 0x81, 0xa0, 0x45, 0xe0, 0x00, 0x32, 0x4c, 0x0f, 0x42, 0x24, \n0x48, 0x00, 0x01, 0xaa, 0x44, 0x10, 0x00, 0x37, 0x4c, 0x00, 0x81, 0xbb, 0x44, 0x20, 0x00, 0x42, \n0x4c, 0x01, 0x01, 0x3c, 0x44, 0x30, 0x00, 0x36, 0x4c, 0x01, 0xc2, 0x16, 0x48, 0x00, 0x01, 0xa9, \n0x44, 0x40, 0x00, 0x52, 0x4c, 0x02, 0x01, 0xb9, 0x5c, 0xf0, 0x00, 0x53, 0xe8, 0x0b, 0x44, 0x50, \n0x00, 0x46, 0x4c, 0x02, 0x81, 0x3c, 0x45, 0xe0, 0x00, 0x47, 0x4c, 0x0f, 0x42, 0x05, 0x48, 0x00, \n0x01, 0x46, 0x44, 0x10, 0x00, 0x56, 0x4c, 0x00, 0x81, 0xb6, 0x44, 0x20, 0x00, 0x57, 0x4c, 0x01, \n0x01, 0xbb, 0x44, 0x30, 0x00, 0x53, 0x4c, 0x01, 0xc1, 0xf7, 0x48, 0x00, 0x01, 0xb5, 0x46, 0x00, \n0x00, 0x0b, 0x58, 0x00, 0x01, 0x5c, 0xa6, 0x00, 0x84, 0x88, 0x4c, 0x02, 0x00, 0x8b, 0xe6, 0x09, \n0xe8, 0x07, 0x84, 0xa1, 0xd0, 0x0f, 0x87, 0xc2, 0x4c, 0x0f, 0x41, 0xec, 0xd5, 0x76, 0x44, 0x10, \n0x00, 0x10, 0x4c, 0x00, 0x80, 0x89, 0x44, 0x20, 0x00, 0x12, 0x4c, 0x01, 0x41, 0xe3, 0x48, 0x00, \n0x00, 0xa3, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x00, \n0x58, 0x42, 0x02, 0x0c, 0xb4, 0x44, 0x84, 0x20, 0x58, 0x31, 0x00, 0x10, 0xb6, 0x64, 0x92, 0x00, \n0x84, 0x07, 0x9c, 0x49, 0x4c, 0x10, 0x7f, 0xfd, 0x44, 0x1f, 0xff, 0xef, 0x46, 0x00, 0x04, 0x00, \n0x40, 0x21, 0x04, 0x02, 0x58, 0x00, 0x02, 0x0c, 0xb6, 0x40, 0x47, 0xe0, 0x04, 0x00, 0x59, 0xef, \n0x02, 0x00, 0xb4, 0xbe, 0x54, 0x12, 0x80, 0x03, 0xc9, 0x12, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, \n0x82, 0x04, 0x05, 0xe0, 0x80, 0x00, 0x46, 0x3f, 0xf0, 0xff, 0x58, 0x5f, 0x00, 0x01, 0xb6, 0xa1, \n0x58, 0x31, 0x8f, 0xff, 0xb4, 0x81, 0x40, 0x22, 0x0c, 0x02, 0xd5, 0x31, 0x84, 0x41, 0x4c, 0x11, \n0x40, 0x18, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x04, 0xb4, 0x41, 0x84, 0x9e, 0x41, 0xe1, \n0x10, 0x02, 0x15, 0xe0, 0x80, 0x00, 0x46, 0x3f, 0xf0, 0xff, 0xb4, 0xa1, 0x58, 0x31, 0x8f, 0xff, \n0x40, 0x42, 0x8c, 0x02, 0xb6, 0x81, 0x46, 0x30, 0x01, 0x00, 0xb4, 0x41, 0xd5, 0x16, 0x46, 0x10, \n0x04, 0x00, 0x58, 0x10, 0x82, 0x04, 0xb4, 0x81, 0x84, 0xbe, 0x40, 0x22, 0x14, 0x02, 0xb6, 0x41, \n0x46, 0x3f, 0xf0, 0xff, 0x05, 0xe0, 0x80, 0x00, 0x58, 0x31, 0x8f, 0xff, 0x40, 0x5f, 0x0c, 0x02, \n0xb6, 0xa1, 0x46, 0x30, 0x05, 0x00, 0xb4, 0x41, 0x40, 0x21, 0x0c, 0x04, 0xb6, 0x41, 0xb4, 0x20, \n0x58, 0x10, 0x83, 0x00, 0x48, 0x00, 0x00, 0xca, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xfc, 0xdd, 0x2f, 0x48, 0x00, 0x01, 0x6a, \n0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x04, 0x00, 0x05, 0xe0, 0x00, 0x00, 0x58, 0x1f, 0x0c, 0x00, \n0x48, 0x00, 0x00, 0xb4, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xec, 0xdd, 0x2f, 0xc8, 0x09, \n0x84, 0x61, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x6a, 0xae, 0xc0, 0x48, 0x00, 0x01, 0x52, \n0x46, 0x50, 0x00, 0x0a, 0x58, 0x52, 0x8e, 0xe4, 0xa7, 0x28, 0x46, 0x20, 0x04, 0x01, 0x58, 0x21, \n0x04, 0x00, 0xb6, 0x82, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xc0, 0xdd, 0x2f, \n0x48, 0x00, 0x01, 0x40, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, 0x46, 0x40, \n0x04, 0x01, 0x58, 0x42, 0x06, 0x60, 0x84, 0xa0, 0xb6, 0xa4, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x81, 0x60, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, 0x81, 0x6a, 0xae, 0x08, 0x46, 0x40, \n0x04, 0x00, 0x58, 0x42, 0x02, 0x04, 0xb4, 0x44, 0x44, 0x3f, 0x00, 0xff, 0x40, 0x01, 0x0c, 0x02, \n0x58, 0x50, 0x44, 0x00, 0xb6, 0xa4, 0x46, 0x0f, 0xf0, 0xff, 0xb4, 0x44, 0x58, 0x00, 0x0f, 0xff, \n0x58, 0x31, 0x00, 0x01, 0xb6, 0x64, 0x46, 0x10, 0x04, 0x00, 0xb4, 0xa4, 0x58, 0x10, 0x82, 0x0c, \n0x40, 0x22, 0x80, 0x02, 0xb6, 0x44, 0xb4, 0x61, 0x58, 0x01, 0x83, 0x00, 0xb6, 0x01, 0x48, 0x00, \n0x01, 0x09, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x47, 0xe0, 0x00, 0x0b, 0x59, 0xef, \n0x01, 0x5c, 0x46, 0x30, 0x04, 0x10, 0xb4, 0x20, 0x02, 0x2f, 0x00, 0x00, 0xd5, 0x22, 0x46, 0x00, \n0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x20, 0x04, 0x10, 0xb4, 0x20, 0xd5, 0x26, 0x46, 0x00, \n0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x30, 0x04, 0x10, 0xb4, 0x20, 0x46, 0x60, 0x00, 0x0b, \n0x58, 0x63, 0x01, 0x6a, 0x48, 0x00, 0x00, 0xab, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, \n0x46, 0x20, 0x00, 0x0b, 0x58, 0x21, 0x01, 0x5c, 0x46, 0x30, 0x04, 0x00, 0xb4, 0x20, 0xa4, 0x90, \n0x98, 0x4b, 0xb6, 0x20, 0xac, 0x88, 0x48, 0x00, 0x00, 0xd5, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, \n0x01, 0x54, 0x46, 0x20, 0x04, 0x00, 0xb4, 0x20, 0x98, 0xca, 0xb6, 0x60, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x81, 0xb8, 0xdd, 0x2f, 0x48, 0x00, 0x00, 0xbd, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, \n0x01, 0x54, 0x46, 0x30, 0x04, 0x00, 0xb4, 0x20, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, 0x01, 0x6a, \n0xd5, 0x7d, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0xb4, 0x80, 0x46, 0x00, 0x00, 0x0b, \n0x58, 0x00, 0x01, 0x58, 0x40, 0x12, 0x40, 0x08, 0xb6, 0x20, 0x48, 0x00, 0x00, 0xab, 0x46, 0x00, \n0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x47, 0xe0, 0x00, 0x0b, 0x59, 0xef, 0x01, 0x58, 0x46, 0x50, \n0x00, 0x0b, 0x58, 0x52, 0x81, 0x5c, 0xb4, 0x3e, 0xb4, 0x60, 0xa4, 0xa8, 0xd5, 0xc2, 0x46, 0x20, \n0x00, 0x0b, 0x58, 0x21, 0x01, 0x58, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0xb4, 0x22, \n0xb4, 0x40, 0xd5, 0xc3, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, 0x01, 0x58, 0x46, 0x00, 0x00, 0x0b, \n0x58, 0x00, 0x01, 0x54, 0xb4, 0x26, 0xb4, 0x60, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, 0x01, 0x6a, \n0x98, 0x4b, 0xd5, 0x45, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x40, 0x00, 0x0b, \n0x58, 0x42, 0x01, 0x5c, 0x46, 0x30, 0x04, 0x20, 0xb4, 0x20, 0xa4, 0xa0, 0xd5, 0x9a, 0x46, 0x00, \n0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x20, 0x04, 0x20, 0xb4, 0x20, 0xd5, 0x9e, 0x46, 0x00, \n0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x30, 0x04, 0x20, 0xb4, 0x20, 0x46, 0x60, 0x00, 0x0b, \n0x58, 0x63, 0x01, 0x6a, 0xd5, 0x23, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x50, \n0x00, 0x0b, 0x58, 0x52, 0x81, 0x5c, 0x46, 0x30, 0x05, 0x00, 0xb4, 0x20, 0xa4, 0xa8, 0x48, 0xff, \n0xff, 0x79, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x20, 0x05, 0x00, 0xb4, 0x20, \n0x48, 0xff, 0xff, 0x7c, 0x46, 0x00, 0x00, 0x0b, 0x58, 0x00, 0x01, 0x54, 0x46, 0x30, 0x05, 0x00, \n0xb4, 0x20, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, 0x01, 0x6a, 0x98, 0x4b, 0xb6, 0x20, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x81, 0xec, 0xdd, 0x2f, 0xc8, 0x02, 0xd5, 0x1a, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x82, 0x18, 0xdd, 0x2f, 0xd5, 0x25, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x83, 0x10, 0xdd, 0x2f, 0xd5, 0x1c, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x81, 0xec, 0xdd, 0x2f, 0x46, 0x60, 0x00, 0x0b, 0x58, 0x63, 0x01, 0x6a, 0xc8, 0x03, 0x84, 0x01, \n0xd5, 0x10, 0x46, 0x20, 0x00, 0x0b, 0x58, 0x21, 0x01, 0x66, 0x01, 0xe1, 0x00, 0x00, 0x56, 0x0f, \n0x00, 0x0b, 0x5c, 0x00, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x82, 0x7c, 0xdd, 0x2f, \n0xae, 0x30, 0xd5, 0x07, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xa8, 0xdd, 0x2f, 0xd5, 0x06, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0xcc, 0xdd, 0x2f, 0x46, 0x10, 0x00, 0x0b, 0x58, 0x10, \n0x81, 0x6a, 0x20, 0x00, 0x80, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x81, 0x84, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x00, 0x58, 0xf7, \n0x84, 0x48, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x10, 0x04, 0x62, 0x02, 0x01, 0x40, 0x53, 0x20, 0x08, \n0x92, 0xa8, 0x14, 0x52, 0x02, 0x01, 0x84, 0x0a, 0x46, 0x10, 0x00, 0x05, 0x58, 0x10, 0x8c, 0x60, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x08, 0xdd, 0x2f, 0x46, 0x30, 0x04, 0x00, 0xb4, 0x43, \n0x44, 0x50, 0x76, 0x10, 0x40, 0x01, 0x40, 0x09, 0xd8, 0x07, 0x04, 0x01, 0x80, 0x41, 0x43, 0xe0, \n0x50, 0x0b, 0x4f, 0xe2, 0x00, 0x0c, 0x84, 0x02, 0x46, 0x10, 0x00, 0x04, 0x58, 0x10, 0x8e, 0x74, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8c, 0x3c, 0xdd, 0x2f, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x0c, 0x3c, 0x84, 0x01, 0x46, 0x10, 0x00, 0x03, 0x58, 0x10, 0x82, 0x2c, 0x4b, 0xe0, 0x18, 0x01, \n0x84, 0x0c, 0x46, 0x10, 0x00, 0x03, 0x58, 0x10, 0x8e, 0xe0, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x10, \n0x00, 0x01, 0x58, 0x10, 0x87, 0xec, 0x84, 0x0f, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x00, 0x00, 0x0e, \n0x58, 0x00, 0x01, 0x78, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0xe4, 0xdd, 0x2f, 0x84, 0x20, \n0x80, 0x81, 0x46, 0x20, 0x00, 0x0a, 0x58, 0x21, 0x06, 0xe0, 0x44, 0x30, 0x08, 0x00, 0x46, 0x00, \n0x00, 0x05, 0x58, 0x00, 0x0a, 0x9c, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0x98, 0xdd, 0x2f, \n0x84, 0x00, 0x46, 0x10, 0x00, 0x0a, 0x58, 0x10, 0x85, 0x7c, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8b, 0x5c, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x00, 0x84, 0xa1, 0x14, 0x52, 0x00, 0x8c, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8a, 0x58, 0xdd, 0x2f, 0x84, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0xf0, 0x00, 0x0b, 0x04, 0x07, 0x80, 0x48, 0xdd, 0x20, \n0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x46, 0x20, 0x00, 0x0b, 0x58, 0x21, 0x00, 0xf8, \n0x94, 0xc2, 0x98, 0x1a, 0xb6, 0x20, 0xdd, 0x9e, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, \n0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x01, 0x54, \n0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x81, 0x5c, 0xb6, 0x20, 0x48, 0xff, 0xd3, 0x07, 0xdd, 0x9e, \n0x64, 0x12, 0x00, 0x02, 0x96, 0x4c, 0x64, 0x02, 0x00, 0x43, 0x64, 0x00, 0x00, 0x08, 0xb6, 0x20, \n0xdd, 0x9e, 0x92, 0x00, 0x64, 0x12, 0x00, 0x02, 0x42, 0x10, 0x80, 0x09, 0x40, 0x10, 0x80, 0x04, \n0x64, 0x12, 0x00, 0x03, 0x64, 0x00, 0x00, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x64, 0x12, 0x00, 0x43, 0x64, 0x00, 0x00, 0x08, 0x46, 0x60, 0x00, 0x0e, 0x58, 0x63, 0x01, 0x54, \n0x04, 0x03, 0x00, 0x0b, 0xc0, 0x02, 0xdd, 0x20, 0x04, 0x03, 0x00, 0x0c, 0xc0, 0x02, 0xdd, 0x20, \n0x04, 0x23, 0x00, 0x08, 0x44, 0x10, 0x03, 0x00, 0x54, 0x01, 0x03, 0x00, 0x4c, 0x00, 0xff, 0xf2, \n0x64, 0x00, 0x00, 0x00, 0xd5, 0xee, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, \n0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, 0x46, 0xf0, \n0x00, 0x0e, 0x04, 0x37, 0x80, 0x5d, 0x40, 0x43, 0x18, 0x05, 0x40, 0x22, 0x0c, 0x02, 0xf0, 0x01, \n0x46, 0xf0, 0x00, 0x0e, 0x14, 0x27, 0x80, 0x5d, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, \n0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0xef, 0xf8, 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, \n0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0e, 0x04, 0x37, 0x80, 0x5d, 0xf0, 0x01, 0x40, 0x23, 0x0c, 0x04, \n0x46, 0xf0, 0x00, 0x0e, 0x14, 0x27, 0x80, 0x5d, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, \n0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x80, 0xc1, 0x46, 0xf0, 0x00, 0x0e, 0x14, 0x07, 0x80, 0x60, 0x46, 0xf0, 0x00, 0x0e, 0x14, 0x67, \n0x80, 0x61, 0xc8, 0x08, 0x44, 0x00, 0x01, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0x1c, \n0xdd, 0x2f, 0xce, 0x08, 0x44, 0x00, 0x02, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0x1c, \n0xdd, 0x2f, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x44, 0x50, 0x00, 0x14, \n0x46, 0x60, 0x00, 0x0e, 0x58, 0x63, 0x01, 0x5c, 0x42, 0x60, 0x94, 0x73, 0x80, 0xe0, 0x81, 0x43, \n0x50, 0x03, 0x00, 0x0c, 0xa8, 0x71, 0x84, 0x20, 0x81, 0x22, 0x81, 0x04, 0xa8, 0x72, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8b, 0xe4, 0xdd, 0x2f, 0x50, 0x35, 0x7f, 0xb8, 0x40, 0x24, 0x8c, 0x00, \n0x58, 0x44, 0x00, 0x08, 0x84, 0x0a, 0xb6, 0x46, 0xa9, 0xd1, 0xb6, 0x82, 0xa8, 0x12, 0x3a, 0x6f, \n0xa8, 0x84, 0xdd, 0x9e, 0xa8, 0x01, 0xb6, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0xa0, 0x81, 0xb6, 0x01, \n0xa8, 0x89, 0xb6, 0x22, 0xa8, 0x41, 0xdd, 0x9e, 0xb4, 0x20, 0x4c, 0x10, 0x40, 0x04, 0x84, 0x20, \n0xd5, 0x07, 0xa0, 0xc9, 0xb4, 0x81, 0xb6, 0x83, 0xb4, 0x01, 0xa0, 0x89, 0xa8, 0x81, 0x80, 0x01, \n0xdd, 0x9e, 0x92, 0x00, 0x46, 0x20, 0x00, 0x0b, 0x04, 0x11, 0x00, 0x54, 0x98, 0x01, 0x14, 0x01, \n0x00, 0x54, 0x80, 0x01, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x10, 0x00, 0x0e, 0x58, 0x10, 0x81, 0x94, \n0x46, 0xf0, 0x00, 0x0b, 0x14, 0x17, 0x80, 0x54, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x50, 0x00, 0x0d, \n0x58, 0x52, 0x8d, 0x80, 0x38, 0x12, 0x82, 0x0a, 0x46, 0x10, 0x04, 0x00, 0x58, 0x10, 0x82, 0x00, \n0xa0, 0x8d, 0x84, 0x61, 0x40, 0x41, 0x80, 0x0c, 0x40, 0x02, 0x08, 0x04, 0xa8, 0x0d, 0xdd, 0x9e, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x30, 0x04, 0x00, 0x58, 0x31, 0x82, 0x00, 0xa0, 0x5c, \n0x46, 0xf0, 0x00, 0x0d, 0x00, 0x07, 0x8e, 0x3a, 0xc0, 0x0e, 0x47, 0xe0, 0x04, 0x00, 0x46, 0x08, \n0x00, 0x00, 0x58, 0x00, 0x03, 0xe8, 0x84, 0xa1, 0x14, 0x0f, 0x00, 0x22, 0x46, 0xf0, 0x00, 0x0d, \n0x10, 0x57, 0x8e, 0x3b, 0x96, 0x08, 0x54, 0x20, 0x00, 0x08, 0xc2, 0x07, 0x46, 0xf0, 0x00, 0x0d, \n0x04, 0x07, 0x83, 0x63, 0x48, 0x00, 0x00, 0x84, 0x54, 0x30, 0x00, 0x10, 0xc3, 0x06, 0x46, 0xf0, \n0x00, 0x0d, 0x04, 0x07, 0x83, 0x64, 0xd5, 0x7b, 0x54, 0x50, 0x00, 0x20, 0xc5, 0x06, 0x46, 0xf0, \n0x00, 0x0d, 0x04, 0x07, 0x83, 0x65, 0xd5, 0x73, 0x54, 0x20, 0x00, 0x02, 0xc2, 0x06, 0x46, 0xf0, \n0x00, 0x0d, 0x04, 0x07, 0x83, 0x61, 0xd5, 0x6b, 0x96, 0xc4, 0xc3, 0x06, 0x46, 0xf0, 0x00, 0x0d, \n0x04, 0x07, 0x83, 0x60, 0xd5, 0x64, 0x54, 0x40, 0x00, 0x04, 0xc4, 0x06, 0x46, 0xf0, 0x00, 0x0d, \n0x04, 0x07, 0x83, 0x62, 0xd5, 0x5c, 0x40, 0x20, 0xa0, 0x09, 0x96, 0x10, 0x55, 0xe0, 0x00, 0x01, \n0x4f, 0xe2, 0x00, 0x07, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x68, 0xd5, 0x50, 0x54, 0x30, \n0x00, 0x02, 0xc3, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x69, 0xd5, 0x48, 0x54, 0x40, \n0x00, 0x04, 0xc4, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x6a, 0xd5, 0x40, 0x55, 0xe0, \n0x00, 0x08, 0x4f, 0xe2, 0x00, 0x07, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x6b, 0xd5, 0x37, \n0x54, 0x30, 0x00, 0x10, 0xc3, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x6c, 0xd5, 0x2f, \n0x54, 0x40, 0x00, 0x20, 0xc4, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x6d, 0xd5, 0x27, \n0x54, 0x50, 0x00, 0x40, 0xc5, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x6e, 0xd5, 0x1f, \n0x54, 0x20, 0x00, 0x80, 0xc2, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x6f, 0xd5, 0x17, \n0x40, 0x40, 0xc0, 0x09, 0x96, 0x60, 0x96, 0x0c, 0xc0, 0x02, 0xd5, 0x04, 0x54, 0x10, 0x80, 0x02, \n0xc1, 0x06, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x70, 0xd5, 0x09, 0x47, 0xe0, 0x04, 0x00, \n0x04, 0x3f, 0x00, 0x8d, 0x9c, 0x99, 0x14, 0x2f, 0x00, 0x8d, 0xd5, 0x02, 0xdd, 0x20, 0xec, 0x04, \n0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x3c, 0xef, 0xf4, 0x46, 0x30, \n0x04, 0x10, 0x54, 0x80, 0x00, 0x0f, 0x58, 0x31, 0x85, 0x00, 0x40, 0x84, 0x38, 0x08, 0x84, 0x80, \n0x54, 0x70, 0x80, 0x3f, 0xb4, 0xa3, 0xf5, 0x81, 0x00, 0x5f, 0x80, 0x07, 0x54, 0x52, 0x80, 0x80, \n0x97, 0x68, 0xcd, 0x3c, 0xf5, 0x81, 0x00, 0x9f, 0x80, 0x07, 0x42, 0x94, 0x98, 0x09, 0x00, 0x6f, \n0x80, 0x05, 0x92, 0xc6, 0x95, 0xb6, 0x44, 0xaf, 0xff, 0x80, 0x40, 0x94, 0xa8, 0x04, 0x40, 0x63, \n0x1c, 0x04, 0x10, 0x9f, 0x80, 0x07, 0x10, 0x6f, 0x80, 0x05, 0x44, 0x9c, 0x3f, 0xff, 0xf6, 0x01, \n0x40, 0x63, 0x24, 0x02, 0x40, 0x63, 0x20, 0x04, 0xf6, 0x81, 0xb6, 0xc3, 0xb4, 0xc3, 0x9d, 0x69, \n0xf6, 0x81, 0x00, 0x6f, 0x80, 0x07, 0x54, 0x63, 0x00, 0x80, 0xc6, 0x05, 0x44, 0xa0, 0x00, 0x64, \n0x4c, 0x55, 0x7f, 0xf6, 0x00, 0x5f, 0x80, 0x07, 0x54, 0x52, 0x80, 0x80, 0xcd, 0x0f, 0x00, 0x5f, \n0x80, 0x05, 0x54, 0x52, 0x80, 0x3f, 0xd9, 0x0a, 0xf5, 0x01, 0x92, 0xae, 0x54, 0x52, 0x80, 0x0f, \n0xd8, 0x05, 0x00, 0x0f, 0x80, 0x04, 0xb6, 0x02, 0xd5, 0x05, 0x9d, 0x21, 0x44, 0x50, 0x00, 0x64, \n0xdc, 0xba, 0xf1, 0x01, 0x40, 0x00, 0xfc, 0x09, 0xec, 0x0c, 0x3a, 0x6f, 0xa8, 0x04, 0xdd, 0x9e, \n0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x46, 0x30, 0x04, 0x10, 0x84, 0x80, 0x05, 0xe1, 0x81, 0x40, \n0x9d, 0x21, 0x15, 0xef, 0x80, 0x01, 0x00, 0x6f, 0x80, 0x07, 0x54, 0x53, 0x00, 0x80, 0xc5, 0x04, \n0x44, 0x50, 0x00, 0x64, 0xdc, 0xf4, 0x00, 0x5f, 0x80, 0x07, 0x44, 0x3f, 0xff, 0xc0, 0x41, 0xe2, \n0x8c, 0x04, 0x11, 0xef, 0x80, 0x07, 0x54, 0x40, 0x00, 0x0f, 0xf3, 0x01, 0x44, 0x6c, 0x3f, 0xff, \n0x40, 0x52, 0x38, 0x08, 0x41, 0xe1, 0x98, 0x02, 0x40, 0x3f, 0x14, 0x04, 0xf3, 0x81, 0x01, 0xef, \n0x80, 0x05, 0x54, 0x40, 0x80, 0x3f, 0x40, 0x6f, 0x18, 0x09, 0x95, 0xb6, 0x40, 0x33, 0x10, 0x04, \n0x10, 0x2f, 0x80, 0x04, 0x10, 0x3f, 0x80, 0x05, 0x46, 0x20, 0x04, 0x10, 0xf6, 0x01, 0x14, 0x61, \n0x01, 0x40, 0x80, 0x5f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0x84, 0x01, \n0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0xef, 0xf8, 0x46, 0x00, 0x04, 0x11, 0x58, 0x00, \n0x00, 0x1c, 0x84, 0x60, 0xb4, 0x80, 0xf4, 0x81, 0x00, 0x5f, 0x80, 0x06, 0x54, 0x42, 0x80, 0x02, \n0x97, 0x20, 0xcc, 0x23, 0xf4, 0x81, 0x10, 0x1f, 0x80, 0x05, 0x00, 0x5f, 0x80, 0x06, 0x58, 0x52, \n0x80, 0x03, 0x10, 0x5f, 0x80, 0x06, 0xf5, 0x01, 0xb6, 0xa0, 0xb4, 0xa0, 0x9d, 0x21, 0xf5, 0x81, \n0x00, 0x5f, 0x80, 0x06, 0x54, 0x52, 0x80, 0x02, 0xc5, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdc, 0xf6, \n0x00, 0x5f, 0x80, 0x06, 0x54, 0x42, 0x80, 0x02, 0xcc, 0x08, 0x00, 0x5f, 0x80, 0x05, 0xd9, 0x05, \n0x00, 0x0f, 0x80, 0x04, 0xb6, 0x02, 0xd5, 0x05, 0x9c, 0xd9, 0x44, 0x50, 0x00, 0x64, 0xdb, 0xd3, \n0xf1, 0x01, 0x42, 0x00, 0xc4, 0x0b, 0xec, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xf4, 0x46, 0x30, 0x04, 0x11, 0x84, 0x80, 0xa1, 0x5f, 0x9d, 0x21, 0xf5, 0x81, 0x01, 0xef, \n0x80, 0x06, 0x54, 0x5f, 0x00, 0x02, 0xc5, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdc, 0xf6, 0x84, 0xa0, \n0x84, 0x82, 0xf5, 0x81, 0x10, 0x2f, 0x80, 0x04, 0x10, 0x4f, 0x80, 0x06, 0x10, 0x1f, 0x80, 0x05, \n0x80, 0x43, 0xf3, 0x01, 0xa8, 0xd7, 0x80, 0x5f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, \n0xdd, 0x2f, 0x84, 0x01, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, \n0xef, 0xf8, 0x46, 0x10, 0x04, 0x10, 0x46, 0x00, 0x04, 0x10, 0x46, 0x20, 0x00, 0xff, 0x58, 0x10, \n0x85, 0x0c, 0x58, 0x00, 0x05, 0x04, 0x44, 0x40, 0xe0, 0x10, 0x58, 0x21, 0x0f, 0xf8, 0xb5, 0x21, \n0xb5, 0x00, 0xb6, 0x81, 0xb6, 0x40, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0d, 0xb8, 0x84, 0x21, \n0x50, 0x2f, 0x80, 0x04, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x64, 0x80, 0x43, 0x84, 0x05, 0x84, 0x21, \n0xb6, 0x7f, 0x81, 0x46, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x80, 0xdf, \n0xd5, 0x0a, 0x84, 0x00, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x01, 0xd8, 0xfd, 0x84, 0x05, 0x84, 0x21, \n0x80, 0x5f, 0xdd, 0x2a, 0xb4, 0xff, 0x54, 0x73, 0x80, 0x04, 0xcf, 0xf4, 0xf2, 0x01, 0x84, 0x21, \n0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x46, 0x30, 0x04, 0x10, \n0x46, 0x00, 0x04, 0x10, 0x58, 0x31, 0x85, 0x04, 0x58, 0x00, 0x05, 0x0c, 0xb6, 0xe3, 0xb7, 0x20, \n0xb7, 0x03, 0xec, 0x08, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x84, 0x21, 0x80, 0x40, \n0x44, 0x00, 0x02, 0x58, 0x40, 0x51, 0x00, 0x97, 0x9c, 0x49, 0x96, 0x48, 0x84, 0x6b, 0x98, 0x28, \n0x92, 0x01, 0x4c, 0x11, 0xff, 0xf9, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, 0x46, 0x20, \n0x04, 0x11, 0x80, 0x80, 0x84, 0x60, 0x05, 0xe1, 0x00, 0x07, 0x9c, 0xd9, 0x15, 0xef, 0x80, 0x01, \n0x00, 0x5f, 0x80, 0x06, 0x54, 0x02, 0x80, 0x02, 0xc0, 0x04, 0x44, 0x50, 0x00, 0x64, 0xdb, 0xf4, \n0x84, 0x62, 0x84, 0x00, 0xf0, 0x81, 0x10, 0x3f, 0x80, 0x06, 0x10, 0x1f, 0x80, 0x04, 0x10, 0x4f, \n0x80, 0x05, 0xf1, 0x01, 0xa8, 0x57, 0x80, 0x24, 0x80, 0x5f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0x84, 0x01, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xa4, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8d, 0xb8, 0x84, 0x22, \n0x50, 0x2f, 0x80, 0x50, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x1c, 0x50, 0x2f, 0x80, 0x4c, \n0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x1d, 0x50, 0x2f, 0x80, 0x48, 0x84, 0x04, 0xdd, 0x27, \n0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x44, 0x84, 0x04, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x11, \n0x50, 0x2f, 0x80, 0x40, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, 0x80, 0x3c, \n0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x38, 0x84, 0x05, 0xdd, 0x27, \n0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x34, 0x84, 0x05, 0xdd, 0x27, 0x46, 0x00, 0x04, 0x10, \n0x58, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x46, 0x10, 0x04, 0x10, 0xf4, 0x87, 0x58, 0x10, 0x84, 0x00, \n0xb4, 0x41, 0x46, 0xa0, 0x04, 0x11, 0xf2, 0x86, 0x58, 0xa5, 0x02, 0x04, 0xb4, 0x6a, 0x46, 0x90, \n0x04, 0x10, 0xf3, 0x85, 0x58, 0x94, 0x85, 0x0c, 0xb4, 0xa9, 0x46, 0x60, 0x04, 0x10, 0xf5, 0x84, \n0x58, 0x63, 0x05, 0x04, 0xb4, 0x86, 0x47, 0xcf, 0xf0, 0x00, 0x46, 0x80, 0x00, 0x80, 0x84, 0x43, \n0x59, 0xce, 0x00, 0x03, 0x58, 0x84, 0x0c, 0x00, 0xf4, 0x83, 0x15, 0xc0, 0x00, 0x00, 0xb7, 0x01, \n0xb6, 0x4a, 0x47, 0xc0, 0x00, 0x03, 0x59, 0xce, 0x0f, 0x74, 0x84, 0x01, 0xdd, 0x3c, 0x46, 0x50, \n0x18, 0xca, 0x44, 0x30, 0x00, 0x1f, 0x58, 0x52, 0x80, 0x0f, 0x84, 0x9f, 0x44, 0xa0, 0x00, 0x17, \n0xb7, 0x49, 0xb6, 0x66, 0xb6, 0xa9, 0xb6, 0x86, 0x44, 0x10, 0x00, 0x11, 0x50, 0x2f, 0x80, 0x30, \n0x84, 0x00, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, 0x80, 0x2c, 0x84, 0x00, 0xdd, 0x27, \n0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x28, 0x84, 0x00, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x14, \n0x50, 0x2f, 0x80, 0x24, 0x84, 0x00, 0xdd, 0x27, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x20, 0x84, 0x00, \n0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x0e, 0x70, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, \n0x00, 0x99, 0x84, 0x00, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0x99, 0x84, 0x00, \n0xdd, 0x28, 0x44, 0x10, 0x00, 0x13, 0x84, 0x49, 0x84, 0x00, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x14, \n0x44, 0x20, 0x00, 0x51, 0x84, 0x00, 0xdd, 0x28, 0x84, 0x24, 0x44, 0x20, 0x00, 0x8e, 0x84, 0x00, \n0xdd, 0x28, 0x84, 0x21, 0x80, 0x41, 0x84, 0x05, 0xdd, 0x28, 0x84, 0x01, 0xdd, 0x3c, 0x46, 0x06, \n0x00, 0x42, 0x58, 0x00, 0x00, 0x3f, 0xb6, 0x09, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x27, \n0x84, 0x04, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x28, \n0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xf1, 0x84, 0x05, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x13, \n0x44, 0x20, 0x00, 0xa1, 0x84, 0x05, 0xdd, 0x28, 0x84, 0x41, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, \n0xdd, 0x28, 0x46, 0x10, 0x00, 0x82, 0x58, 0x10, 0x80, 0x3f, 0xb6, 0x29, 0x46, 0x60, 0x00, 0x06, \n0x58, 0x63, 0x00, 0x78, 0x80, 0x0a, 0x84, 0x24, 0xdd, 0x26, 0x84, 0x2a, 0x44, 0x00, 0x00, 0xf1, \n0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0xf2, 0xdd, 0x26, 0x84, 0x20, 0x84, 0x04, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x31, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x26, 0x46, 0x20, 0x04, 0x10, 0xf2, 0x82, \n0x84, 0x01, 0x84, 0x24, 0xdd, 0x26, 0xf3, 0x02, 0x85, 0x40, 0x58, 0x31, 0x80, 0x7c, 0xf3, 0x82, \n0x14, 0xaf, 0x80, 0x01, 0x83, 0x8a, 0x50, 0x9f, 0x80, 0x54, 0x05, 0xef, 0x80, 0x01, 0x54, 0x75, \n0x00, 0x07, 0x41, 0xe3, 0x9c, 0x1a, 0x54, 0x85, 0x00, 0xff, 0x15, 0xef, 0x80, 0x01, 0x41, 0xc3, \n0x9c, 0x1a, 0xe7, 0x08, 0xe8, 0x19, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2b, 0x84, 0x04, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf0, 0x15, 0x44, 0x10, 0x00, 0x2b, 0x54, 0x50, \n0x00, 0xf8, 0x40, 0x25, 0x14, 0x04, 0x84, 0x04, 0xf5, 0x95, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0x70, 0xdd, 0x2f, 0xd5, 0x19, 0x44, 0x10, 0x00, 0x11, 0x80, 0x49, 0x84, 0x04, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf2, 0x15, 0x94, 0x7b, 0x54, 0x31, 0x00, 0xc7, \n0x40, 0x20, 0x8c, 0x04, 0x84, 0x04, 0x44, 0x10, 0x00, 0x11, 0xf3, 0x95, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x84, 0x21, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x9b, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x84, 0x20, 0xd5, 0x0b, 0x92, 0x00, 0x84, 0x87, \n0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, 0x9c, 0x49, 0x45, 0xe0, 0x01, 0x2c, 0x4c, 0x1f, 0x00, 0x04, \n0x84, 0x00, 0xd5, 0xf5, 0x84, 0x21, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x84, 0x20, 0xd5, 0x09, \n0x92, 0x00, 0x84, 0xa7, 0x9c, 0x01, 0xd8, 0xfd, 0x9c, 0x49, 0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, \n0x84, 0x00, 0xd5, 0xf7, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xba, \n0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x10, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, \n0xf3, 0x02, 0xb4, 0x23, 0x40, 0x00, 0xc0, 0x09, 0x4e, 0x14, 0x00, 0x05, 0x44, 0x2f, 0x00, 0x00, \n0x98, 0x02, 0x45, 0xe0, 0x80, 0x00, 0x40, 0x40, 0xf8, 0x02, 0x96, 0x49, 0xc4, 0x04, 0x44, 0x5f, \n0x00, 0x00, 0x98, 0x4d, 0x42, 0x00, 0x00, 0x24, 0x42, 0x00, 0x84, 0x73, 0xf1, 0x01, 0xe2, 0x20, \n0xe8, 0x04, 0xf0, 0x81, 0x55, 0xc4, 0x00, 0x07, 0x84, 0x07, 0x4c, 0x70, 0x40, 0x6a, 0x4c, 0x83, \n0xc0, 0x4b, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2b, 0x84, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8d, 0xb8, 0xdd, 0x2f, 0xf5, 0x15, 0x44, 0x10, 0x00, 0x2b, 0x54, 0x22, 0x80, 0xf8, 0x40, 0x4e, \n0x08, 0x04, 0x80, 0x44, 0x84, 0x04, 0xf4, 0x95, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, \n0xdd, 0x2f, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2c, 0x84, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8d, 0xb8, 0xdd, 0x2f, 0xf3, 0x15, 0x44, 0x10, 0x00, 0x2c, 0x54, 0x01, 0x80, 0xf8, 0x40, 0x5e, \n0x00, 0x04, 0x80, 0x45, 0x84, 0x04, 0xf5, 0x95, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, \n0xdd, 0x2f, 0x80, 0x49, 0x44, 0x10, 0x00, 0x2d, 0x84, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8d, 0xb8, 0xdd, 0x2f, 0xf4, 0x15, 0x44, 0x10, 0x00, 0x2d, 0x54, 0x22, 0x00, 0xf8, 0x40, 0x3e, \n0x08, 0x04, 0x80, 0x43, 0x84, 0x04, 0xf3, 0x95, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, \n0xdd, 0x2f, 0xd5, 0x1e, 0x87, 0xcf, 0x4c, 0x8f, 0x40, 0x1c, 0x44, 0x10, 0x00, 0x11, 0x80, 0x49, \n0x84, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf4, 0x15, 0x40, 0x1e, \n0x0c, 0x08, 0x54, 0x02, 0x00, 0xc7, 0x40, 0x30, 0x80, 0x04, 0x80, 0x43, 0x84, 0x04, 0x44, 0x10, \n0x00, 0x11, 0xf3, 0x95, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x8d, 0x41, \n0x44, 0x20, 0x00, 0x10, 0x4c, 0xa1, 0x7e, 0xfb, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, \n0x84, 0x20, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x26, \n0x84, 0x00, 0xd5, 0x09, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x49, 0xd9, 0xfd, 0x9c, 0x01, 0x87, 0xca, \n0x4c, 0x0f, 0x00, 0x04, 0x84, 0x20, 0xd5, 0xf7, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf2, 0x0c, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x0e, 0x70, 0x44, 0x10, 0x00, 0x11, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x0b, 0x44, 0x10, 0x00, 0x12, \n0x84, 0x00, 0xdd, 0x26, 0xf2, 0x0a, 0x44, 0x10, 0x00, 0x13, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x09, \n0x44, 0x10, 0x00, 0x14, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x08, 0x84, 0x24, 0x84, 0x00, 0xdd, 0x26, \n0xf2, 0x11, 0x44, 0x10, 0x00, 0x13, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x10, 0x44, 0x10, 0x00, 0x11, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0f, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0e, \n0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0d, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, \n0xdd, 0x26, 0xf5, 0x07, 0x46, 0x40, 0x04, 0x10, 0x58, 0x42, 0x00, 0x80, 0xb6, 0xa4, 0x46, 0x30, \n0x04, 0x10, 0xf4, 0x06, 0x58, 0x31, 0x84, 0x00, 0xb6, 0x83, 0x46, 0x20, 0x04, 0x11, 0xf5, 0x05, \n0x58, 0x21, 0x02, 0x04, 0xb6, 0xa2, 0x46, 0x10, 0x04, 0x10, 0xf4, 0x03, 0x58, 0x10, 0x85, 0x04, \n0xb6, 0x81, 0x46, 0x00, 0x04, 0x10, 0xf3, 0x04, 0x58, 0x00, 0x05, 0x0c, 0xb6, 0x60, 0xec, 0x5c, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xc4, 0x46, 0x40, \n0x04, 0x11, 0x58, 0x42, 0x00, 0x04, 0xb4, 0xa4, 0x84, 0xc0, 0xf5, 0x81, 0x46, 0x20, 0x04, 0x10, \n0xb6, 0xc4, 0x44, 0x30, 0x18, 0x30, 0x58, 0x21, 0x05, 0x04, 0x05, 0xc1, 0x00, 0x00, 0x46, 0x00, \n0x04, 0x10, 0xb6, 0x62, 0x58, 0x00, 0x05, 0x0c, 0x44, 0x10, 0x20, 0x00, 0xb5, 0x40, 0xb6, 0x20, \n0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x0d, 0xb8, 0x50, 0x2f, 0x80, 0x34, 0x84, 0x24, 0x84, 0x05, \n0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0x70, 0xdd, 0x28, 0x84, 0x24, 0x44, 0x20, 0x00, 0x27, \n0x84, 0x05, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x30, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x28, \n0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x2c, \n0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0x83, \n0x84, 0x05, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x28, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x28, \n0x50, 0x2f, 0x80, 0x24, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x28, 0x80, 0x46, 0x44, 0x10, \n0x00, 0x13, 0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x14, 0x44, 0x20, 0x00, 0x20, 0x84, 0x05, \n0xdd, 0x27, 0x50, 0x2f, 0x80, 0x20, 0x80, 0x06, 0x84, 0x21, 0xdd, 0x28, 0x80, 0x46, 0x80, 0x06, \n0x84, 0x21, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x1c, 0x80, 0x06, 0x44, 0x10, 0x00, 0x22, 0xdd, 0x28, \n0x80, 0x06, 0x44, 0x10, 0x00, 0x22, 0x44, 0x20, 0x00, 0x13, 0xdd, 0x27, 0x50, 0x2f, 0x80, 0x18, \n0x80, 0x06, 0x44, 0x10, 0x00, 0x23, 0xdd, 0x28, 0x80, 0x46, 0x80, 0x06, 0x44, 0x10, 0x00, 0x23, \n0xdd, 0x27, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x8e, 0xf8, 0x50, 0x2f, 0x80, 0x14, 0x44, 0x10, \n0x00, 0x2f, 0x80, 0x06, 0x4b, 0xe0, 0x24, 0x01, 0x46, 0x80, 0x00, 0x06, 0x58, 0x84, 0x00, 0x78, \n0x84, 0x24, 0x44, 0x00, 0x00, 0x2f, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x16, \n0xdd, 0x28, 0x84, 0x01, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x74, 0xdd, 0x2f, 0x50, 0x2f, \n0x80, 0x10, 0x80, 0x06, 0x44, 0x10, 0x00, 0x31, 0x4b, 0xe0, 0x24, 0x01, 0x80, 0x26, 0x44, 0x00, \n0x00, 0x16, 0x04, 0x9f, 0x80, 0x04, 0xdd, 0x28, 0x80, 0x06, 0x44, 0x10, 0x00, 0x23, 0x84, 0x41, \n0xdd, 0x27, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x16, 0xdd, 0x28, 0xd5, 0x0b, 0x92, 0x00, \n0x87, 0xc7, 0x9c, 0x49, 0x4c, 0x1f, 0x7f, 0xfd, 0x9d, 0xb1, 0x44, 0x70, 0x00, 0x3c, 0x4c, 0x63, \n0x80, 0x04, 0x84, 0x20, 0xd5, 0xf5, 0x44, 0x10, 0x00, 0x31, 0x50, 0x2f, 0x80, 0x10, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x20, 0x7f, 0x80, 0x10, 0x40, 0x54, \n0x80, 0x10, 0x9a, 0xfd, 0x44, 0x40, 0x03, 0xe8, 0x42, 0x01, 0x90, 0x24, 0x44, 0x20, 0x00, 0x2b, \n0x40, 0x00, 0x08, 0x36, 0x84, 0x2a, 0x40, 0x20, 0x04, 0xd6, 0xe4, 0xc5, 0xe9, 0x02, 0x8c, 0x0a, \n0x87, 0xca, 0x40, 0x20, 0x78, 0x16, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0x84, 0x27, \n0x84, 0x00, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x16, 0xdd, 0x27, 0x84, 0x21, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x27, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x15, 0xdd, 0x27, 0xf2, 0x0d, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0c, 0x44, 0x10, \n0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x0b, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x0a, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x09, 0x44, 0x10, 0x00, 0x14, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x08, 0x84, 0x21, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x07, 0x44, 0x10, \n0x00, 0x22, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x06, 0x44, 0x10, 0x00, 0x23, 0x84, 0x00, 0xdd, 0x26, \n0xf1, 0x05, 0x44, 0x00, 0x00, 0x2f, 0xdd, 0x27, 0xf3, 0x01, 0x46, 0x20, 0x04, 0x11, 0x46, 0x10, \n0x04, 0x10, 0x46, 0x00, 0x04, 0x10, 0x58, 0x21, 0x00, 0x04, 0x58, 0x10, 0x85, 0x04, 0x58, 0x00, \n0x05, 0x0c, 0xb6, 0x62, 0x15, 0xc0, 0x80, 0x00, 0xb7, 0x40, 0x84, 0x27, 0x50, 0x2f, 0x80, 0x0c, \n0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xec, 0x3c, 0x3a, 0x6f, \n0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xf8, 0x84, 0x21, 0x96, 0x00, 0x50, 0x2f, \n0x80, 0x04, 0x46, 0x30, 0x00, 0x05, 0x58, 0x31, 0x8d, 0xb8, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x0e, 0x70, 0x4c, 0x00, 0xc0, 0x10, 0x84, 0x23, 0x84, 0x05, 0x4b, 0xe0, 0x0c, 0x01, 0xf2, 0x01, \n0x40, 0x31, 0x14, 0x09, 0x94, 0xdd, 0x58, 0x31, 0x80, 0x11, 0x84, 0x23, 0x80, 0x43, 0x84, 0x05, \n0xd5, 0x0e, 0x84, 0x23, 0x84, 0x05, 0x4b, 0xe0, 0x0c, 0x01, 0xf7, 0x01, 0x40, 0x53, 0x94, 0x09, \n0x95, 0x6d, 0x58, 0x32, 0x80, 0x08, 0x84, 0x05, 0x80, 0x43, 0x84, 0x23, 0xf3, 0x81, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x8e, 0xf8, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x5f, 0x44, 0x10, 0x00, 0x2f, \n0x84, 0x00, 0x4b, 0xe0, 0x1c, 0x01, 0xb4, 0x5f, 0x44, 0x0f, 0xff, 0x9f, 0x40, 0x31, 0x00, 0x02, \n0x58, 0x51, 0x80, 0x40, 0xb6, 0xbf, 0x80, 0x25, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, \n0x44, 0x00, 0x00, 0x2f, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x20, 0x44, 0x00, 0x00, 0x3a, 0x4b, 0xe0, \n0x18, 0x01, 0x80, 0x5f, 0x44, 0x10, 0x00, 0x2f, 0x84, 0x00, 0x4b, 0xe0, 0x1c, 0x01, 0xb4, 0x9f, \n0x40, 0x22, 0x1c, 0x09, 0x94, 0x97, 0x58, 0x31, 0x00, 0x50, 0xb6, 0x7f, 0x80, 0x23, 0x44, 0x00, \n0x00, 0x2f, 0x81, 0x1f, 0x4b, 0xe0, 0x18, 0x01, 0xec, 0x08, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x84, 0x80, 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, 0x97, 0x80, \n0x80, 0x04, 0xf4, 0x81, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf0, 0x01, \n0x44, 0x3f, 0xff, 0xe7, 0x84, 0x41, 0x40, 0x10, 0x0c, 0x02, 0x4c, 0x61, 0x00, 0x06, 0xc6, 0x09, \n0x84, 0xa3, 0xde, 0x07, 0xd5, 0x04, 0x58, 0x10, 0x80, 0x10, 0xd5, 0x03, 0x58, 0x10, 0x80, 0x08, \n0x4c, 0x10, 0x00, 0x08, 0x84, 0x04, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x84, 0x01, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xec, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x10, 0x00, 0x10, 0x81, 0x20, \n0x84, 0x04, 0xdd, 0x26, 0x44, 0x00, 0x00, 0xba, 0x84, 0x21, 0xdd, 0x26, 0x84, 0xe0, 0x80, 0x66, \n0x50, 0xaf, 0x80, 0x0c, 0x84, 0xc3, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, 0x0e, 0xf8, 0xf3, 0x81, \n0x80, 0x26, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x23, 0x44, 0x10, 0x00, 0xbc, 0x84, 0x00, 0x80, 0x4a, \n0xdd, 0x3c, 0xf1, 0x03, 0x9d, 0xb4, 0x44, 0x50, 0x00, 0x2f, 0x99, 0xf9, 0x46, 0x80, 0x00, 0x06, \n0x58, 0x84, 0x00, 0x78, 0xf3, 0x01, 0xde, 0xec, 0x9e, 0x6c, 0x44, 0x00, 0x00, 0xbb, 0x4b, 0xe0, \n0x20, 0x01, 0x80, 0x4a, 0x44, 0x10, 0x00, 0xbc, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0xf6, 0x03, 0x84, 0x20, 0x84, 0x04, 0x4b, 0xe0, 0x20, 0x01, 0x44, 0x50, \n0x00, 0x37, 0x42, 0x33, 0x14, 0x24, 0x84, 0x96, 0x40, 0x21, 0x90, 0x36, 0x99, 0xfa, 0xe1, 0x27, \n0xe8, 0x03, 0x84, 0x00, 0xd5, 0x05, 0x5e, 0x73, 0xff, 0xf6, 0x56, 0x03, 0x80, 0x01, 0xec, 0x14, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x2c, 0x46, 0x40, \n0x00, 0x0a, 0x58, 0x42, 0x0f, 0xa8, 0xf0, 0x81, 0x3a, 0x02, 0x0c, 0x04, 0x50, 0x8f, 0x80, 0x80, \n0x84, 0xc0, 0x47, 0xc0, 0x04, 0x11, 0x3a, 0x04, 0x0c, 0x24, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, \n0x80, 0x78, 0x80, 0x26, 0x44, 0x00, 0x00, 0xba, 0xb4, 0x64, 0x40, 0x91, 0xc0, 0x09, 0x12, 0x34, \n0x00, 0x00, 0x10, 0x9f, 0x80, 0x92, 0xf6, 0xb2, 0x81, 0x5c, 0x05, 0xee, 0x00, 0x01, 0x15, 0xef, \n0x80, 0x0f, 0x50, 0x8f, 0x80, 0xcc, 0xdd, 0x27, 0x80, 0x26, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x27, \n0x80, 0x26, 0x44, 0x00, 0x00, 0xbc, 0xdd, 0x27, 0x04, 0x55, 0x00, 0xca, 0x80, 0x26, 0xf5, 0x8e, \n0x44, 0x00, 0x00, 0x1b, 0xdd, 0x27, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x8e, 0xf8, 0x80, 0x48, \n0x44, 0x10, 0x00, 0x41, 0x80, 0x06, 0xdd, 0x29, 0xf4, 0x33, 0x80, 0x48, 0xf4, 0x8d, 0x44, 0x10, \n0x00, 0x42, 0x80, 0x06, 0xdd, 0x29, 0xf3, 0x33, 0x44, 0x10, 0x00, 0x8c, 0xf3, 0x8c, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x27, 0x80, 0x48, 0x44, 0x10, 0x00, 0x9f, 0x80, 0x06, 0xdd, 0x29, 0xf2, 0x33, \n0x84, 0x23, 0xf2, 0x8b, 0x44, 0x00, 0x00, 0x9e, 0x47, 0xc0, 0x04, 0x10, 0xdd, 0x27, 0x80, 0x48, \n0x44, 0x10, 0x00, 0x9f, 0x80, 0x06, 0xdd, 0x29, 0x04, 0xae, 0x01, 0x41, 0x46, 0x90, 0x04, 0x10, \n0x14, 0xaf, 0x80, 0x0a, 0x04, 0x84, 0x81, 0x43, 0x46, 0x58, 0x1f, 0xff, 0x58, 0x52, 0x8e, 0x7f, \n0x46, 0x30, 0xa0, 0x00, 0x46, 0x00, 0x80, 0x00, 0x40, 0x74, 0x14, 0x02, 0xf4, 0x33, 0x40, 0x13, \n0x8c, 0x04, 0x40, 0x23, 0x80, 0x04, 0x14, 0x8f, 0x80, 0x06, 0xf6, 0x83, 0xf7, 0x84, 0xf4, 0x89, \n0xf6, 0x85, 0xf6, 0x82, 0xf1, 0x87, 0xf2, 0x88, 0x44, 0x00, 0x00, 0x9f, 0x44, 0x10, 0x00, 0x60, \n0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x46, 0x50, 0x04, 0x10, 0x04, 0xa2, \n0x81, 0x41, 0x47, 0xc0, 0x00, 0xc0, 0x59, 0xce, 0x00, 0x80, 0x40, 0x65, 0x70, 0x04, 0x14, 0x62, \n0x81, 0x41, 0xf0, 0x02, 0xc8, 0x13, 0x05, 0xef, 0x80, 0x01, 0x5e, 0xff, 0x01, 0x5f, 0xe9, 0x03, \n0xf3, 0x07, 0xd5, 0x1d, 0x04, 0x9f, 0x80, 0x01, 0x5e, 0xf4, 0xff, 0x06, 0xe8, 0x05, 0xf2, 0x04, \n0x42, 0x31, 0x68, 0x08, 0xd5, 0x14, 0xf3, 0x08, 0xd5, 0x12, 0xf3, 0x01, 0x5e, 0xf1, 0x81, 0x5f, \n0xe9, 0x07, 0xf4, 0x04, 0x46, 0x80, 0xc0, 0x00, 0x40, 0x32, 0x20, 0x04, 0xd5, 0x08, 0xf0, 0x01, \n0xf3, 0x08, 0xf7, 0x07, 0x5e, 0x10, 0x7f, 0x06, 0x40, 0x33, 0x84, 0x1a, 0x80, 0x85, 0x46, 0x20, \n0x04, 0x11, 0x51, 0xee, 0x7f, 0xa0, 0x14, 0x32, 0x01, 0x43, 0x15, 0xe1, 0x00, 0xca, 0x46, 0x90, \n0x00, 0x05, 0x58, 0x94, 0x8d, 0xb8, 0x84, 0x21, 0x50, 0x2f, 0x80, 0xc4, 0x84, 0x05, 0xdd, 0x29, \n0x84, 0x21, 0x50, 0x2f, 0x80, 0xc0, 0x84, 0x00, 0xdd, 0x29, 0x84, 0x20, 0x50, 0x2f, 0x80, 0xbc, \n0x84, 0x04, 0xdd, 0x29, 0x84, 0x2b, 0x50, 0x2f, 0x80, 0xb8, 0x84, 0x04, 0xdd, 0x29, 0x84, 0x2d, \n0x50, 0x2f, 0x80, 0xb4, 0x84, 0x04, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0xb0, \n0x84, 0x04, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0xac, 0x84, 0x04, 0xdd, 0x29, \n0x44, 0x10, 0x00, 0x16, 0x50, 0x2f, 0x80, 0xa8, 0x84, 0x04, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x11, \n0x50, 0x2f, 0x80, 0xa4, 0x84, 0x05, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, 0x80, 0xa0, \n0x84, 0x05, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x9c, 0x84, 0x05, 0xdd, 0x29, \n0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x98, 0x84, 0x05, 0xdd, 0x29, 0x84, 0x21, 0x47, 0xc0, \n0x00, 0x05, 0x59, 0xce, 0x0e, 0x70, 0x80, 0x41, 0x84, 0x05, 0xdd, 0x3c, 0x84, 0x21, 0x44, 0x20, \n0x00, 0xe1, 0x84, 0x00, 0xdd, 0x3c, 0x84, 0x20, 0x44, 0x20, 0x00, 0x83, 0x84, 0x04, 0xdd, 0x3c, \n0x84, 0x2b, 0x44, 0x20, 0x00, 0x51, 0x84, 0x04, 0xdd, 0x3c, 0x84, 0x2d, 0x44, 0x20, 0x00, 0x3c, \n0x84, 0x04, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x24, 0x84, 0x04, 0xdd, 0x3c, \n0x44, 0x10, 0x00, 0x15, 0x9e, 0x8b, 0x84, 0x04, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x16, 0x44, 0x20, \n0x00, 0xa1, 0x84, 0x04, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xf1, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, \n0x00, 0x13, 0x44, 0x20, 0x00, 0xa1, 0x84, 0x05, 0xdd, 0x3c, 0x84, 0x41, 0x44, 0x10, 0x00, 0x14, \n0x84, 0x05, 0xdd, 0x3c, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x10, 0x00, 0x10, \n0x9c, 0x0f, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x6d, 0xdd, 0x26, 0x46, 0xa0, 0x04, 0x11, \n0x84, 0x20, 0x44, 0x00, 0x00, 0x6e, 0xdd, 0x26, 0x84, 0xa8, 0x14, 0x55, 0x00, 0x01, 0x44, 0x10, \n0x00, 0x8c, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x40, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x1b, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x39, 0x44, 0x00, \n0x00, 0x41, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0x8c, 0xdd, 0x26, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x8e, 0xf8, 0x84, 0xc0, 0x84, 0x00, 0x44, 0x10, 0x00, 0x8c, 0x50, 0x2f, \n0x80, 0xcc, 0x4b, 0xe0, 0x1c, 0x01, 0xf3, 0x33, 0x9d, 0xb1, 0xc3, 0x05, 0x44, 0x80, 0x00, 0x64, \n0x4c, 0x64, 0x7f, 0xf4, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x84, 0x20, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x22, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x84, 0x2a, 0x44, 0x00, \n0x00, 0xbc, 0xdd, 0x26, 0x84, 0x23, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x41, \n0x44, 0x00, 0x00, 0xbc, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, 0x00, 0xf1, 0xdd, 0x26, 0x84, 0x20, \n0x44, 0x00, 0x00, 0xf2, 0xdd, 0x26, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0xf8, 0x84, 0x00, \n0x84, 0x24, 0x50, 0x2f, 0x80, 0xc8, 0x4b, 0xe0, 0x1c, 0x01, 0x81, 0x06, 0x85, 0x40, 0x85, 0x25, \n0x87, 0x88, 0x50, 0x7f, 0x80, 0x94, 0x84, 0x20, 0x44, 0x00, 0x00, 0x1b, 0xdd, 0x28, 0x50, 0x5f, \n0x80, 0x80, 0x38, 0x12, 0xa4, 0x00, 0x44, 0x00, 0x00, 0x42, 0xdd, 0x28, 0xf1, 0x32, 0x54, 0x00, \n0x80, 0x10, 0xc8, 0x05, 0x58, 0x10, 0x80, 0x10, 0x84, 0x04, 0xdd, 0x28, 0x44, 0x10, 0x00, 0x11, \n0x44, 0x00, 0x00, 0xf4, 0xdd, 0x28, 0x84, 0x21, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x28, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x15, 0xdd, 0x28, 0x84, 0x20, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x28, 0x84, 0x21, \n0x44, 0x00, 0x00, 0xbb, 0xdd, 0x28, 0xf1, 0x02, 0xc9, 0x06, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, \n0x00, 0xbc, 0xd5, 0x05, 0x44, 0x00, 0x00, 0xbc, 0x44, 0x10, 0x00, 0x81, 0xdd, 0x28, 0x84, 0x01, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x8f, 0x74, 0xdd, 0x2f, 0x84, 0xc0, 0x50, 0x2f, 0x80, 0xcc, \n0x84, 0x00, 0x44, 0x10, 0x00, 0xbc, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, \n0xf4, 0x33, 0x9d, 0xb1, 0x54, 0x22, 0x00, 0x80, 0xc2, 0x04, 0x44, 0x50, 0x00, 0x64, 0xde, 0xef, \n0xf1, 0x32, 0x84, 0x04, 0xdd, 0x28, 0x84, 0x20, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x28, 0x84, 0x21, \n0x44, 0x00, 0x00, 0x15, 0xdd, 0x28, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0xdd, 0x28, 0x84, 0x21, \n0x44, 0x00, 0x00, 0xba, 0xdd, 0x28, 0x44, 0x10, 0x00, 0xff, 0x44, 0x00, 0x00, 0xbb, 0xdd, 0x28, \n0x44, 0x10, 0x00, 0xbc, 0x84, 0x00, 0x80, 0x47, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, \n0xdd, 0x2f, 0xf1, 0x25, 0x5c, 0xf0, 0x80, 0xb4, 0xe8, 0x05, 0x8d, 0x21, 0xe5, 0x33, 0xe9, 0x8c, \n0xd5, 0x1f, 0x5c, 0xf0, 0x80, 0xf6, 0xe9, 0x05, 0x8f, 0x21, 0x4e, 0x94, 0xff, 0x86, 0xd5, 0x18, \n0x84, 0x05, 0x40, 0x25, 0x00, 0xd6, 0x84, 0xa4, 0xde, 0x03, 0x51, 0xce, 0x00, 0x0a, 0x84, 0xa5, \n0x4c, 0xa2, 0x80, 0x0f, 0x80, 0x1c, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x89, 0x8c, 0xdd, 0x2f, \n0x84, 0xa1, 0xd8, 0x03, 0x85, 0x00, 0xd5, 0x05, 0x8d, 0x41, 0x48, 0xff, 0xff, 0x6e, 0x85, 0x01, \n0xf3, 0x32, 0x54, 0x71, 0x80, 0x10, 0xcf, 0x09, 0x58, 0x11, 0x80, 0x10, 0x84, 0x04, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, \n0x84, 0x24, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, \n0x84, 0x2f, 0x44, 0x00, 0x00, 0xbd, 0xdd, 0x26, 0x84, 0x25, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, \n0x84, 0x25, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x2f, 0x44, 0x00, 0x00, 0xbd, 0xdd, 0x26, \n0x84, 0x26, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x26, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, \n0x84, 0x2f, 0x44, 0x00, 0x00, 0xbd, 0xdd, 0x26, 0x84, 0x27, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, \n0x84, 0x27, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x44, 0x00, 0x00, 0xbd, 0x84, 0x2f, 0xdd, 0x26, \n0xf2, 0x02, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0xf8, 0xca, 0x30, 0x84, 0x22, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x84, 0x22, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0xf0, 0x02, 0x50, 0x2f, \n0x80, 0xcc, 0x44, 0x10, 0x00, 0xbd, 0x4b, 0xe0, 0x1c, 0x01, 0xf3, 0x33, 0xf4, 0x01, 0x40, 0x21, \n0x98, 0x09, 0x94, 0x96, 0x5e, 0xf2, 0x01, 0x5f, 0xe9, 0x04, 0x58, 0x21, 0x00, 0x14, 0xd5, 0x0b, \n0x05, 0xef, 0x80, 0x01, 0x5e, 0xff, 0x7f, 0x06, 0xe8, 0x04, 0x58, 0x21, 0x00, 0x08, 0xd5, 0x03, \n0x58, 0x21, 0x00, 0x10, 0xf2, 0xb3, 0x84, 0x22, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, \n0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x22, 0xd5, 0x2e, 0x84, 0x23, 0x44, 0x00, 0x00, 0xba, \n0xdd, 0x26, 0x84, 0x23, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x44, 0x10, 0x00, 0xbd, 0x50, 0x2f, \n0x80, 0xcc, 0x84, 0x00, 0x4b, 0xe0, 0x1c, 0x01, 0xf5, 0x33, 0xf0, 0x01, 0x40, 0x22, 0x98, 0x09, \n0x94, 0x96, 0x5e, 0xf0, 0x01, 0x5f, 0xe9, 0x04, 0x58, 0x21, 0x00, 0x18, 0xd5, 0x0a, 0xf7, 0x01, \n0x5e, 0xf3, 0xff, 0x06, 0xe8, 0x04, 0x58, 0x21, 0x00, 0x10, 0xd5, 0x03, 0x58, 0x21, 0x00, 0x14, \n0xf2, 0xb3, 0x84, 0x23, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x00, 0x00, 0xba, \n0xdd, 0x26, 0x84, 0x23, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0xf1, 0x33, 0x44, 0x00, 0x00, 0xbd, \n0xdd, 0x26, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x27, 0xf4, 0x02, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, \n0x00, 0x78, 0xcc, 0x11, 0x84, 0x22, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x22, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x44, 0x00, 0x00, 0xbd, 0x84, 0x2f, 0xdd, 0x26, 0x14, 0x8f, 0x80, 0x05, \n0x48, 0x00, 0x00, 0x90, 0x84, 0x23, 0x44, 0x00, 0x00, 0xba, 0xdd, 0x26, 0x84, 0x23, 0x44, 0x00, \n0x00, 0xba, 0xdd, 0x26, 0x44, 0x00, 0x00, 0xbd, 0x84, 0x2f, 0xdd, 0x26, 0x14, 0x8f, 0x80, 0x03, \n0xd5, 0x03, 0xf3, 0x02, 0xc3, 0x7e, 0xf7, 0x05, 0x84, 0xa1, 0xdf, 0x03, 0xf5, 0x03, 0xd7, 0x79, \n0x46, 0xa0, 0x00, 0x0a, 0x58, 0xa5, 0x0f, 0x68, 0x81, 0x0a, 0x3a, 0x04, 0x0c, 0x04, 0x50, 0x9f, \n0x80, 0x40, 0x85, 0x40, 0x47, 0xc0, 0x00, 0x06, 0x59, 0xce, 0x00, 0x78, 0x3a, 0x04, 0x8c, 0x24, \n0x3a, 0x04, 0x0c, 0x04, 0x3a, 0x04, 0x8c, 0x24, 0x3a, 0x04, 0x0c, 0x04, 0x3a, 0x04, 0x8c, 0x24, \n0x3a, 0x04, 0x0c, 0x00, 0x3a, 0x04, 0x8c, 0x20, 0x44, 0x00, 0x00, 0xba, 0x50, 0x15, 0x00, 0x02, \n0xdd, 0x3c, 0x50, 0x7f, 0x80, 0x40, 0x84, 0xc3, 0x85, 0x0a, 0x80, 0x26, 0x44, 0x00, 0x00, 0xbb, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0xbc, 0x50, 0x2f, 0x80, 0xcc, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf0, 0x33, 0x50, 0x00, 0x7f, 0x80, 0x4e, 0x06, 0x00, 0x05, \n0x44, 0x10, 0x00, 0x80, 0xd5, 0x08, 0xa6, 0xb8, 0x42, 0x10, 0x08, 0x24, 0x40, 0x40, 0xa0, 0x56, \n0x50, 0x12, 0x00, 0x80, 0x44, 0x00, 0x00, 0xbc, 0xdd, 0x3c, 0x9d, 0xb4, 0x44, 0x50, 0x01, 0x03, \n0x9d, 0xf9, 0x46, 0x90, 0x00, 0x06, 0x58, 0x94, 0x80, 0x78, 0xde, 0xd8, 0x8d, 0x41, 0x84, 0xa2, \n0x4c, 0xa2, 0xff, 0xcc, 0x84, 0x20, 0x44, 0x00, 0x00, 0xba, 0x4b, 0xe0, 0x24, 0x01, 0x44, 0x00, \n0x00, 0xbb, 0x84, 0x24, 0x4b, 0xe0, 0x24, 0x01, 0xf6, 0x01, 0x5e, 0xf3, 0x7f, 0x06, 0xe8, 0x05, \n0x84, 0x2e, 0x44, 0x00, 0x00, 0xbc, 0xd5, 0x05, 0x44, 0x00, 0x00, 0xbc, 0x44, 0x10, 0x00, 0x1c, \n0x4b, 0xe0, 0x24, 0x01, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, 0x84, 0x20, 0x44, 0x00, \n0x00, 0xbb, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x00, 0x00, 0xbc, 0x9c, 0x44, 0x4b, 0xe0, 0x1c, 0x01, \n0xf6, 0x0e, 0x47, 0xe0, 0x04, 0x11, 0x14, 0x6f, 0x00, 0xca, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, \n0x80, 0x78, 0xf1, 0x32, 0x84, 0x04, 0xdd, 0x27, 0x84, 0x20, 0x44, 0x00, 0x00, 0x1b, 0xdd, 0x27, \n0xf1, 0x0d, 0x44, 0x00, 0x00, 0x41, 0xdd, 0x27, 0xf1, 0x0c, 0x44, 0x00, 0x00, 0x42, 0xdd, 0x27, \n0x44, 0x10, 0x00, 0x8c, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x27, 0xf1, 0x0b, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x27, 0xf2, 0x31, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0x84, 0x21, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x30, 0x84, 0x21, 0x84, 0x00, 0xdd, 0x26, 0xf2, 0x2f, 0x84, 0x20, 0x84, 0x04, \n0xdd, 0x26, 0xf2, 0x2e, 0x84, 0x2b, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x2d, 0x84, 0x2d, 0x84, 0x04, \n0xdd, 0x26, 0xf2, 0x2c, 0x44, 0x10, 0x00, 0x13, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x2b, 0x44, 0x10, \n0x00, 0x15, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x2a, 0x44, 0x10, 0x00, 0x16, 0x84, 0x04, 0xdd, 0x26, \n0xf2, 0x29, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x28, 0x44, 0x10, 0x00, 0x12, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x27, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x26, \n0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0xf3, 0x0f, 0x46, 0x20, 0x04, 0x11, 0xa8, 0xd1, \n0x84, 0x23, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x27, 0xf1, 0x09, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, \n0xf4, 0x0a, 0x46, 0x10, 0x04, 0x10, 0x14, 0x40, 0x81, 0x41, 0x80, 0xa1, 0xf0, 0x06, 0x14, 0x02, \n0x81, 0x43, 0xf7, 0x02, 0xcf, 0x06, 0x87, 0x81, 0x15, 0xcf, 0x80, 0x02, 0x48, 0xff, 0xfc, 0x66, \n0xec, 0xd4, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x8c, 0x96, 0x48, \n0x97, 0xd0, 0x54, 0xa0, 0x00, 0xff, 0xf1, 0x83, 0x4e, 0x73, 0x05, 0x5a, 0x84, 0x24, 0x50, 0x2f, \n0x80, 0x40, 0x80, 0x07, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0d, 0xb8, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x64, 0x84, 0x05, 0xdd, 0x26, \n0x84, 0x24, 0x50, 0x2f, 0x80, 0x60, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x80, 0x20, 0x50, 0x2f, \n0x80, 0x5c, 0xdd, 0x26, 0x80, 0x27, 0x50, 0x2f, 0x80, 0x58, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x26, \n0x50, 0x2f, 0x80, 0x54, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x84, 0x27, 0x50, 0x2f, 0x80, 0x50, \n0xdd, 0x26, 0x81, 0x26, 0x44, 0x80, 0x00, 0x25, 0x50, 0x6f, 0x80, 0x18, 0x80, 0x28, 0x80, 0x46, \n0x84, 0x05, 0xdd, 0x29, 0x8d, 0x01, 0x44, 0x00, 0x00, 0x2f, 0x9d, 0xb4, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x8d, 0xb8, 0x4c, 0x80, 0x7f, 0xf4, 0x44, 0x10, 0x00, 0x3a, 0x50, 0x2f, 0x80, 0x48, \n0x84, 0x05, 0xdd, 0x27, 0x44, 0x10, 0x00, 0x3b, 0x50, 0x2f, 0x80, 0x44, 0x84, 0x05, 0xdd, 0x27, \n0x50, 0x9f, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x17, 0x50, 0x2f, 0x80, 0x4c, 0x84, 0x00, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x84, 0x20, 0x80, 0x49, 0x84, 0x05, 0xdd, 0x27, \n0xf4, 0x1b, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x0e, 0x70, 0x58, 0x22, 0x00, 0x03, 0x84, 0x20, \n0x84, 0x05, 0x4b, 0xe0, 0x20, 0x01, 0x84, 0x21, 0x80, 0x49, 0x84, 0x05, 0xdd, 0x27, 0xf3, 0x1b, \n0x84, 0x05, 0x58, 0x21, 0x80, 0x01, 0x84, 0x21, 0x4b, 0xe0, 0x20, 0x01, 0x84, 0xc0, 0x81, 0x09, \n0x84, 0x00, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0x47, 0x9c, 0x49, 0x4c, 0x11, 0x7f, 0xfd, 0x9c, 0x01, \n0x44, 0x50, 0x00, 0x64, 0xd0, 0x03, 0x84, 0x20, 0xd5, 0xf6, 0x84, 0x21, 0x84, 0x05, 0x80, 0x48, \n0xdd, 0x27, 0xf1, 0x1b, 0x9d, 0xb1, 0x96, 0x0c, 0x45, 0xc0, 0x00, 0x28, 0xf0, 0x9b, 0x4c, 0x6e, \n0x00, 0x03, 0xc8, 0xe7, 0x51, 0xef, 0x80, 0x6c, 0x80, 0x5e, 0x84, 0x20, 0x84, 0x05, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf0, 0x1b, 0x85, 0x1c, 0x40, 0x60, 0x20, 0x02, \n0x58, 0x23, 0x00, 0x01, 0x84, 0x20, 0x50, 0x7f, 0x80, 0x68, 0x84, 0x05, 0xf6, 0x9b, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x80, 0x47, 0x44, 0x10, 0x00, 0x17, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf5, 0x1a, 0x45, 0xcf, 0xff, 0xe0, \n0x40, 0x92, 0xf0, 0x02, 0x58, 0x14, 0x80, 0x10, 0x44, 0x00, 0x00, 0x17, 0x14, 0x9f, 0x80, 0x1a, \n0x85, 0x09, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x44, 0x30, 0x00, 0x31, \n0x84, 0x82, 0x44, 0x00, 0x00, 0x27, 0x40, 0x64, 0x28, 0x1b, 0x40, 0x60, 0x28, 0x1a, 0x40, 0x22, \n0x28, 0x1b, 0x40, 0x21, 0xa8, 0x1a, 0x85, 0x20, 0xf2, 0x84, 0xf6, 0x85, 0x81, 0x09, 0x83, 0x89, \n0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8d, 0xb8, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, \n0x4e, 0x93, 0x00, 0x56, 0x84, 0x28, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, \n0xf3, 0x1b, 0x84, 0x28, 0x54, 0x21, 0x80, 0xfb, 0x84, 0x05, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, \n0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x80, 0x09, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, \n0xdd, 0x2f, 0xf2, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x58, 0x11, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x06, \n0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf1, 0x05, 0xf1, 0x82, 0x80, 0x29, 0xd5, 0x09, 0x92, 0x00, \n0x84, 0x87, 0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0xaa, 0xd1, 0x03, 0x84, 0x00, \n0xd5, 0xf7, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0xf7, 0x1a, 0x84, 0x04, 0x54, 0x13, 0x80, 0xe7, 0x46, 0xf0, 0x00, 0x06, \n0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, \n0x4c, 0x03, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, \n0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0xd5, 0x58, 0x84, 0x28, 0x50, 0x2f, \n0x80, 0x6c, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0xf3, 0x1b, 0x84, 0x28, 0x58, 0x21, 0x80, 0x04, \n0x84, 0x05, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf2, 0x1a, 0x44, 0x00, 0x00, 0x15, \n0x58, 0x11, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf1, 0x04, \n0xf1, 0x82, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0x8a, 0x4c, 0x12, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x84, 0x24, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf7, 0x1a, \n0x84, 0x04, 0x54, 0x53, 0x80, 0xe7, 0x58, 0x12, 0x80, 0x10, 0xf5, 0x9a, 0x46, 0xf0, 0x00, 0x06, \n0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, \n0x4c, 0x03, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, \n0x44, 0x10, 0x00, 0x15, 0x84, 0x00, 0x50, 0x2f, 0x80, 0x68, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0xf1, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x54, 0x10, 0x80, 0xfe, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8d, 0xb8, \n0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0x4e, 0xa2, 0x00, 0x7a, 0x46, 0x20, 0x04, 0x10, \n0x47, 0xe0, 0x04, 0x10, 0x59, 0xef, 0x05, 0x04, 0x44, 0x30, 0x00, 0x10, 0x58, 0x21, 0x05, 0x0c, \n0x44, 0x10, 0x00, 0x18, 0xb6, 0x62, 0xb6, 0x3e, 0x50, 0x2f, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x11, \n0x84, 0x05, 0xdd, 0x27, 0x05, 0xcf, 0x80, 0x1b, 0x44, 0x10, 0x00, 0x11, 0x58, 0x2e, 0x00, 0x80, \n0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xc1, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x20, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x14, \n0x84, 0x42, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, \n0xf0, 0x1b, 0x44, 0x5f, 0xff, 0xc0, 0x40, 0x40, 0x14, 0x02, 0xf4, 0x9b, 0x58, 0x22, 0x00, 0x3f, \n0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, \n0xf2, 0x1b, 0x44, 0x3f, 0xff, 0xc0, 0x41, 0xc1, 0x0c, 0x02, 0x15, 0xcf, 0x80, 0x1b, 0x58, 0x2e, \n0x00, 0x3f, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x80, 0x20, 0x44, 0x20, 0x00, 0x31, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x3a, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf0, 0x1b, \n0x44, 0x5f, 0xff, 0x80, 0x40, 0x40, 0x14, 0x02, 0xf4, 0x9b, 0x80, 0x44, 0x44, 0x10, 0x00, 0x3a, \n0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x3b, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, \n0xf2, 0x1b, 0x44, 0x3f, 0xff, 0x80, 0x41, 0xc1, 0x0c, 0x02, 0x15, 0xcf, 0x80, 0x1b, 0x80, 0x5c, \n0x84, 0x05, 0x44, 0x10, 0x00, 0x3b, 0xdd, 0x26, 0x87, 0x80, 0xd5, 0x6c, 0x46, 0x10, 0x04, 0x10, \n0x47, 0xe0, 0x04, 0x10, 0x59, 0xef, 0x05, 0x04, 0x84, 0x88, 0x44, 0x80, 0x00, 0x18, 0x58, 0x10, \n0x85, 0x0c, 0xb6, 0x81, 0xb7, 0x1e, 0x44, 0x10, 0x00, 0x11, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, \n0xdd, 0x27, 0xf3, 0x1b, 0x44, 0x10, 0x00, 0x11, 0x58, 0x21, 0x80, 0x80, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xf1, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x48, 0x44, 0x10, \n0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x14, 0x44, 0x20, 0x00, 0xc2, 0x84, 0x05, \n0xdd, 0x26, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf2, 0x1b, 0x44, 0x0f, \n0xff, 0xc0, 0x40, 0x51, 0x00, 0x02, 0xf5, 0x9b, 0x58, 0x22, 0x80, 0x34, 0x84, 0x23, 0x84, 0x05, \n0xdd, 0x26, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf4, 0x1b, 0x44, 0x8f, \n0xff, 0xc0, 0x40, 0x32, 0x20, 0x02, 0xf3, 0x9b, 0x58, 0x21, 0x80, 0x34, 0x84, 0x24, 0x84, 0x05, \n0xdd, 0x26, 0x84, 0x26, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf2, 0x1b, 0x44, 0x0f, \n0xff, 0x80, 0x40, 0x51, 0x00, 0x02, 0xf5, 0x9b, 0x80, 0x45, 0x84, 0x26, 0x84, 0x05, 0xdd, 0x26, \n0x84, 0x27, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0xdd, 0x27, 0xf7, 0x1b, 0x44, 0x4f, 0xff, 0x80, \n0x40, 0x83, 0x90, 0x02, 0x14, 0x8f, 0x80, 0x1b, 0x80, 0x48, 0x84, 0x05, 0x84, 0x27, 0xdd, 0x26, \n0x81, 0x0a, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, 0x4c, 0x03, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0xea, 0x4c, 0x13, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x46, 0x60, 0x00, 0x06, \n0x58, 0x63, 0x00, 0x78, 0x84, 0x22, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x70, \n0x00, 0x05, 0x58, 0x73, 0x8e, 0xf8, 0x50, 0x2f, 0x80, 0x68, 0x44, 0x10, 0x00, 0x9f, 0x84, 0x00, \n0x4b, 0xe0, 0x1c, 0x01, 0xf3, 0x1a, 0x84, 0x59, 0x40, 0x11, 0x88, 0x02, 0x44, 0x00, 0x00, 0x9f, \n0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x4b, 0xe0, \n0x1c, 0x01, 0xf5, 0x1a, 0x44, 0x00, 0x00, 0x15, 0x58, 0x12, 0x80, 0x01, 0x4b, 0xe0, 0x18, 0x01, \n0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x9c, 0x49, \n0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf1, 0x1a, \n0x44, 0x00, 0x00, 0x15, 0x54, 0x10, 0x80, 0xfe, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, \n0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0xca, 0x4c, 0x13, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x46, 0x70, 0x00, 0x06, \n0x58, 0x73, 0x80, 0x78, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x00, \n0x00, 0x9f, 0x44, 0x10, 0x00, 0x82, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0xc0, 0x46, 0x70, 0x00, 0x05, \n0x58, 0x73, 0x8e, 0xf8, 0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x01, 0xd8, 0xfd, \n0x9c, 0x49, 0x44, 0x30, 0x00, 0x64, 0x4c, 0x11, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x44, 0x10, 0x00, 0x9f, 0x4b, 0xe0, 0x1c, 0x01, 0xf2, 0x1a, 0x84, 0x02, \n0x4c, 0x20, 0x00, 0x08, 0x45, 0xe0, 0x00, 0x14, 0x4c, 0x6f, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0xe3, \n0x44, 0x10, 0x00, 0x39, 0x44, 0x00, 0x00, 0x9e, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, \n0xdd, 0x2f, 0x44, 0x10, 0x00, 0x9f, 0x84, 0x00, 0x50, 0x2f, 0x80, 0x68, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x00, 0x1f, 0x80, 0x68, 0x54, 0x10, 0x80, 0x7f, 0xf1, 0x81, \n0x5e, 0xf0, 0x80, 0x40, 0xe9, 0x06, 0x44, 0x6f, 0xff, 0x80, 0x40, 0x40, 0x98, 0x04, 0xf4, 0x81, \n0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, 0x84, 0x22, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, \n0x1c, 0x01, 0x46, 0x30, 0x00, 0x05, 0x58, 0x31, 0x8e, 0xf8, 0x44, 0x10, 0x00, 0x9f, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x4b, 0xe0, 0x0c, 0x01, 0xf5, 0x1a, 0x44, 0x00, 0x00, 0x9f, 0x58, 0x12, \n0x80, 0x06, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0x70, 0x4e, 0xa2, \n0x00, 0x2a, 0x50, 0x2f, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf0, 0x1b, 0x44, 0x10, 0x00, 0x3a, 0x54, 0x40, 0x00, 0x80, \n0xf4, 0x9b, 0x40, 0x2e, 0x10, 0x00, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0x50, 0x2f, 0x80, 0x6c, \n0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, \n0xf2, 0x1b, 0x44, 0x10, 0x00, 0x3b, 0x54, 0x31, 0x00, 0x80, 0x40, 0x2e, 0x0c, 0x00, 0x84, 0x00, \n0xd5, 0x24, 0x84, 0x26, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8d, 0xb8, 0xdd, 0x2f, 0xf5, 0x1b, 0x84, 0x26, 0x54, 0x62, 0x80, 0x80, 0xf6, 0x9b, 0x40, 0x24, \n0x18, 0x00, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x27, 0x50, 0x2f, 0x80, 0x6c, 0x84, 0x05, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf1, 0x1b, 0x84, 0x05, 0x54, 0x30, \n0x80, 0x80, 0x40, 0x24, 0x0c, 0x00, 0x84, 0x27, 0xf3, 0x9b, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x20, \n0xd5, 0x0a, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x9c, 0x49, 0x84, 0x6a, \n0x4c, 0x11, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x68, \n0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf2, 0x1a, 0x44, 0x00, \n0x00, 0x15, 0x58, 0x11, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, 0x9c, 0x49, \n0x84, 0x0a, 0x4c, 0x10, 0x00, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, \n0x80, 0x68, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf1, 0x1a, \n0x44, 0x00, 0x00, 0x15, 0x54, 0x10, 0x80, 0xfe, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, \n0xdd, 0x2f, 0x84, 0x20, 0xd5, 0x09, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, 0x4c, 0x03, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0xaa, 0xd1, 0x03, 0x84, 0x00, 0xd5, 0xf7, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, \n0x00, 0x78, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x00, 0x00, 0x9f, \n0x44, 0x10, 0x00, 0x82, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0xc0, 0x84, 0x20, 0xd5, 0x0b, 0x92, 0x00, \n0x87, 0xc7, 0x9c, 0x01, 0x4c, 0x0f, 0x7f, 0xfd, 0x9c, 0x49, 0x44, 0x30, 0x00, 0x64, 0x4c, 0x11, \n0x80, 0x04, 0x84, 0x00, 0xd5, 0xf5, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x00, 0x44, 0x10, 0x00, 0x9f, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf2, 0x1a, 0x84, 0x82, 0x4c, 0x22, \n0x00, 0x08, 0x44, 0x00, 0x00, 0x14, 0x4c, 0x60, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0xdf, 0x44, 0x10, \n0x00, 0x39, 0x44, 0x00, 0x00, 0x9e, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x44, 0x10, 0x00, 0x9f, 0x84, 0x00, 0x50, 0x2f, 0x80, 0x68, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0x00, 0x1f, 0x80, 0x68, 0x54, 0x10, 0x80, 0x7f, 0x5e, 0xf0, 0x80, 0x40, \n0xe9, 0x05, 0x44, 0x5f, 0xff, 0x80, 0x40, 0x10, 0x94, 0x04, 0x05, 0xef, 0x80, 0x01, 0xf6, 0x02, \n0x40, 0x1f, 0x04, 0x01, 0x40, 0x2e, 0x28, 0x1b, 0x40, 0x24, 0x28, 0x1a, 0xe0, 0xc1, 0xe8, 0x22, \n0xca, 0x2d, 0x4e, 0x93, 0x00, 0x12, 0x4e, 0xa2, 0x00, 0x09, 0x46, 0x70, 0x00, 0x0d, 0x58, 0x73, \n0x8e, 0x1d, 0x10, 0x93, 0x80, 0x00, 0xd5, 0x4e, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, 0x8e, 0x1c, \n0x10, 0xa4, 0x80, 0x00, 0xd5, 0x47, 0x4e, 0xa2, 0x00, 0x07, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, \n0x8e, 0x1f, 0xd5, 0x4a, 0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, 0x8e, 0x1e, 0x10, 0xa1, 0x80, 0x00, \n0xd5, 0x4b, 0x5e, 0xf1, 0x00, 0x3f, 0xe8, 0x0a, 0x4e, 0xa2, 0x00, 0x06, 0x51, 0xce, 0x00, 0x01, \n0x48, 0xff, 0xfe, 0xdf, 0x8d, 0x01, 0x48, 0xff, 0xfe, 0xdc, 0xf4, 0x02, 0xe0, 0x24, 0xe8, 0x19, \n0x44, 0x00, 0x00, 0x3f, 0x4c, 0x20, 0x40, 0x16, 0x4e, 0x93, 0x00, 0x0b, 0x4e, 0xa2, 0x00, 0x1d, \n0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8e, 0x1d, 0x11, 0xc0, 0x80, 0x00, 0xd5, 0x1b, 0x4e, 0xa2, \n0x00, 0x26, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8e, 0x1f, 0x11, 0xc2, 0x80, 0x00, 0xd5, 0x24, \n0x4e, 0x93, 0x00, 0x14, 0x4e, 0xa2, 0x00, 0x09, 0x47, 0xe0, 0x00, 0x0d, 0x59, 0xef, 0x0e, 0x1d, \n0x11, 0xcf, 0x00, 0x00, 0xd5, 0x07, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, 0x8e, 0x1c, 0x10, 0x84, \n0x80, 0x00, 0x85, 0x21, 0x48, 0xff, 0xfc, 0x26, 0x4e, 0xa2, 0x00, 0x09, 0x46, 0x10, 0x00, 0x0d, \n0x58, 0x10, 0x8e, 0x1f, 0x80, 0x5c, 0xae, 0x88, 0xd5, 0x07, 0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, \n0x8e, 0x1e, 0x10, 0x81, 0x80, 0x00, 0x8d, 0x21, 0x84, 0x82, 0x4c, 0x92, 0x7c, 0x13, 0x46, 0x20, \n0x04, 0x10, 0x46, 0x10, 0x04, 0x10, 0x85, 0x00, 0x58, 0x21, 0x05, 0x0c, 0x58, 0x10, 0x85, 0x04, \n0xb7, 0x02, 0xb7, 0x01, 0x50, 0x2f, 0x80, 0x6c, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0x46, 0xf0, \n0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf0, 0x1b, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, \n0x0e, 0x70, 0x54, 0x20, 0x00, 0x7f, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x12, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, 0x80, 0x48, 0x84, 0x05, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x14, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x19, 0x84, 0x23, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x18, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0xf2, 0x17, \n0x80, 0x20, 0xdd, 0x26, 0xf2, 0x16, 0x80, 0x28, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x15, 0x84, 0x26, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x14, 0x84, 0x05, 0x84, 0x27, 0xdd, 0x26, 0x50, 0x9f, 0x80, 0x18, \n0x44, 0x70, 0x00, 0x25, 0x0c, 0x24, 0x80, 0x01, 0x80, 0x27, 0x84, 0x05, 0xdd, 0x26, 0x9d, 0xf9, \n0x44, 0x50, 0x00, 0x2f, 0x46, 0x80, 0x00, 0x05, 0x58, 0x84, 0x0e, 0x70, 0xdf, 0xf4, 0xf2, 0x12, \n0x44, 0x10, 0x00, 0x3a, 0x84, 0x05, 0x4b, 0xe0, 0x20, 0x01, 0xf2, 0x11, 0x44, 0x10, 0x00, 0x3b, \n0x84, 0x05, 0x4b, 0xe0, 0x20, 0x01, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x50, 0x8f, \n0x80, 0x68, 0x84, 0x22, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, \n0x8e, 0xf8, 0x80, 0x48, 0x44, 0x10, 0x00, 0x9f, 0x84, 0x00, 0x4b, 0xe0, 0x24, 0x01, 0xf3, 0x1a, \n0x44, 0x00, 0x00, 0x9f, 0x54, 0x11, 0x80, 0xf9, 0xdd, 0x26, 0x80, 0x48, 0x84, 0x24, 0x84, 0x00, \n0x4b, 0xe0, 0x24, 0x01, 0xf7, 0x1a, 0x84, 0x04, 0x54, 0x13, 0x80, 0xf3, 0xdd, 0x26, 0xf1, 0x13, \n0x44, 0x00, 0x00, 0x17, 0xdd, 0x26, 0xf1, 0x10, 0x84, 0x04, 0xdd, 0x26, 0x05, 0xef, 0x80, 0x03, \n0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8d, 0xb8, 0x50, 0x8f, 0x80, 0x6c, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x0e, 0x70, 0x4f, 0xe3, 0x00, 0x4c, 0x80, 0x48, 0x84, 0x26, 0x84, 0x05, 0xdd, 0x27, \n0xf4, 0x1b, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, 0x8e, 0x1c, 0x54, 0x52, 0x00, 0xc0, 0x00, 0x14, \n0x80, 0x00, 0xf5, 0x9b, 0x98, 0x8d, 0x84, 0x05, 0x84, 0x26, 0xdd, 0x26, 0x80, 0x48, 0x84, 0x27, \n0x84, 0x05, 0xdd, 0x27, 0xf3, 0x1b, 0x00, 0x04, 0x80, 0x00, 0x54, 0x91, 0x80, 0xc0, 0x14, 0x9f, \n0x80, 0x1b, 0x40, 0x20, 0x24, 0x00, 0x84, 0x27, 0x84, 0x05, 0xdd, 0x26, 0x80, 0x48, 0x44, 0x10, \n0x00, 0x3a, 0x84, 0x05, 0xdd, 0x27, 0xf2, 0x1b, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, 0x8e, 0x1d, \n0x54, 0x51, 0x00, 0xc0, 0x00, 0x44, 0x80, 0x00, 0xf5, 0x9b, 0x98, 0xa5, 0x44, 0x10, 0x00, 0x3a, \n0x84, 0x05, 0xdd, 0x26, 0x80, 0x48, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x27, 0xf1, 0x1b, \n0x00, 0x04, 0x80, 0x00, 0x54, 0x40, 0x80, 0xc0, 0xf4, 0x9b, 0x98, 0x84, 0x44, 0x10, 0x00, 0x3b, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x03, 0x84, 0x28, 0x84, 0x05, 0xd5, 0x49, 0x84, 0x26, 0x80, 0x48, \n0x84, 0x05, 0xdd, 0x27, 0xf1, 0x1b, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, 0x8e, 0x1e, 0x54, 0x50, \n0x80, 0xc0, 0x00, 0x04, 0x80, 0x00, 0xf5, 0x9b, 0x98, 0x85, 0x84, 0x26, 0x84, 0x05, 0xdd, 0x26, \n0x84, 0x27, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x27, 0xf3, 0x1b, 0x00, 0x24, 0x80, 0x00, 0x54, 0x91, \n0x80, 0xc0, 0x14, 0x9f, 0x80, 0x1b, 0x88, 0x49, 0x84, 0x27, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x3a, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x27, 0xf4, 0x1b, 0x46, 0x90, 0x00, 0x0d, 0x58, 0x94, \n0x8e, 0x1f, 0x54, 0x52, 0x00, 0xc0, 0x00, 0x14, 0x80, 0x00, 0xf5, 0x9b, 0x98, 0x8d, 0x84, 0x05, \n0x44, 0x10, 0x00, 0x3a, 0xdd, 0x26, 0x80, 0x48, 0x44, 0x10, 0x00, 0x3b, 0x84, 0x05, 0xdd, 0x27, \n0xf0, 0x1b, 0x00, 0x24, 0x80, 0x00, 0x54, 0x30, 0x00, 0xc0, 0xf3, 0x9b, 0x98, 0x93, 0x44, 0x10, \n0x00, 0x3b, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x05, 0x84, 0x28, 0x84, 0x44, 0xdd, 0x26, 0xec, 0x74, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x84, 0x40, \n0xf2, 0x81, 0x46, 0xf0, 0x00, 0x0d, 0x00, 0x97, 0x8e, 0x28, 0x54, 0x80, 0x00, 0xff, 0x46, 0x60, \n0x00, 0x0a, 0x58, 0x63, 0x0f, 0x20, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0x70, 0xa7, 0x70, \n0x4c, 0x54, 0x40, 0x16, 0xa6, 0xb1, 0x44, 0x10, 0x00, 0x11, 0x84, 0x00, 0xdd, 0x27, 0xa6, 0xb2, \n0x44, 0x10, 0x00, 0x12, 0x84, 0x00, 0xdd, 0x27, 0xa6, 0xb3, 0x44, 0x10, 0x00, 0x13, 0x84, 0x00, \n0xdd, 0x27, 0xa6, 0xb4, 0x84, 0x00, 0x44, 0x10, 0x00, 0x14, 0xdd, 0x27, 0x9d, 0xb5, 0x46, 0x50, \n0x00, 0x0a, 0x58, 0x52, 0x8f, 0x66, 0xde, 0xe4, 0x46, 0x50, 0x04, 0x11, 0x05, 0xe2, 0x80, 0xec, \n0x44, 0x1f, 0xc0, 0xc0, 0x54, 0x74, 0x80, 0x3f, 0x40, 0x6f, 0x04, 0x02, 0x40, 0x43, 0x98, 0x04, \n0x14, 0x42, 0x80, 0xec, 0xe7, 0x0f, 0xe8, 0x1a, 0x46, 0xf0, 0x00, 0x0d, 0x04, 0x27, 0x83, 0x8b, \n0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x52, 0x71, 0x00, 0x37, 0x80, 0x27, 0x44, 0x00, \n0x00, 0x3e, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x27, 0x44, 0x00, 0x00, 0x3f, 0x4b, 0xe0, 0x18, 0x01, \n0x80, 0x27, 0x44, 0x00, 0x00, 0x40, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, \n0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8d, 0xb8, 0xdd, 0x2f, 0xf1, 0x01, 0x84, 0x00, \n0x58, 0x50, 0x80, 0x80, 0x80, 0x45, 0x84, 0x24, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x20, \n0xf5, 0x81, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0xa7, 0x32, 0x40, 0x32, \n0x04, 0x09, 0x54, 0x71, 0x80, 0x07, 0x80, 0x07, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x89, 0x30, \n0xdd, 0x2f, 0xc7, 0x06, 0x84, 0xa1, 0x4c, 0x72, 0xc1, 0x3a, 0x48, 0x00, 0x00, 0x86, 0x00, 0x83, \n0x00, 0x01, 0x84, 0xa4, 0x54, 0x84, 0x00, 0x0e, 0x4c, 0x82, 0xc0, 0x07, 0x46, 0x60, 0x00, 0x06, \n0x58, 0x63, 0x00, 0x78, 0xd5, 0x4a, 0x84, 0xa2, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, \n0x4c, 0x82, 0xc0, 0x44, 0x44, 0x10, 0x00, 0x12, 0x44, 0x00, 0x00, 0x45, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x5e, 0x44, 0x00, 0x00, 0x4b, 0xdd, 0x26, 0x84, 0x27, 0x44, 0x00, 0x00, 0x5b, 0xdd, 0x26, \n0x80, 0x28, 0x44, 0x00, 0x00, 0x5c, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x23, 0x44, 0x00, 0x00, 0xc3, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x17, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x24, \n0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x84, 0x26, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x81, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x00, 0x00, 0xc4, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x83, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x17, \n0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x88, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x5e, 0x48, 0x00, 0x00, 0xb0, 0x44, 0x10, 0x00, 0x12, 0x44, 0x00, 0x00, 0x45, \n0xdd, 0x26, 0x84, 0x27, 0x44, 0x00, 0x00, 0x5b, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x23, 0x44, 0x00, \n0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x17, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x24, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x84, 0x26, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x81, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x00, \n0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x83, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x17, 0x48, 0x00, 0x00, 0x81, 0xa6, 0xf1, 0x84, 0x04, 0x54, 0x81, 0x80, 0x0e, 0x4c, 0x80, \n0x40, 0x34, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x10, 0x00, 0x15, 0x44, 0x00, \n0x00, 0x45, 0xdd, 0x26, 0x80, 0x28, 0x44, 0x00, 0x00, 0x5b, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x23, \n0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x24, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x84, 0x28, 0x44, 0x00, 0x00, 0xc4, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x81, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x15, \n0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x83, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x16, 0xd5, 0x48, 0x84, 0xa2, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, \n0x4c, 0x82, 0xc0, 0x45, 0x44, 0x10, 0x00, 0x15, 0x44, 0x00, 0x00, 0x45, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x5c, 0x44, 0x00, 0x00, 0x4b, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, 0x00, 0x5b, 0xdd, 0x26, \n0x84, 0x23, 0x44, 0x00, 0x00, 0x5c, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x23, 0x44, 0x00, 0x00, 0xc3, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x10, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x24, \n0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x84, 0x28, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, \n0x00, 0x81, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x15, 0x44, 0x00, 0x00, 0xc4, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x83, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x16, \n0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x88, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x5b, 0x44, 0x00, 0x00, 0xc4, 0xd5, 0x30, 0x44, 0x10, 0x00, 0x15, 0x44, 0x00, \n0x00, 0x45, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x00, 0x00, 0x5b, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x23, \n0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x24, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x84, 0x28, 0x44, 0x00, 0x00, 0xc4, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x81, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x15, \n0x44, 0x00, 0x00, 0xc4, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x83, 0x44, 0x00, 0x00, 0xc3, 0xdd, 0x26, \n0x44, 0x00, 0x00, 0xc4, 0x44, 0x10, 0x00, 0x16, 0xdd, 0x26, 0x84, 0x01, 0x80, 0x40, 0x80, 0x27, \n0x46, 0x60, 0x00, 0x07, 0x58, 0x63, 0x02, 0x78, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x27, 0x84, 0x00, \n0x84, 0x41, 0x4b, 0xe0, 0x18, 0x01, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, \n0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0xe6, 0x38, 0xe9, 0x36, 0x80, 0x60, 0xa2, 0x59, \n0x47, 0xe0, 0x00, 0x0d, 0x14, 0x1f, 0x03, 0x88, 0xb4, 0xa3, 0x50, 0x20, 0x00, 0x08, 0x46, 0xf0, \n0x00, 0x0d, 0x14, 0x57, 0x83, 0x89, 0xb4, 0x62, 0x50, 0x20, 0x00, 0x0c, 0x46, 0xf0, 0x00, 0x0d, \n0x14, 0x37, 0x83, 0x8a, 0xb4, 0xa2, 0x50, 0x20, 0x00, 0x10, 0x46, 0xf0, 0x00, 0x0d, 0x14, 0x57, \n0x83, 0x8b, 0x50, 0x50, 0x00, 0x14, 0xb4, 0x82, 0x46, 0xf0, 0x00, 0x0d, 0x14, 0x47, 0x83, 0x8c, \n0x00, 0x0f, 0x0e, 0x20, 0xb4, 0x65, 0x46, 0xf0, 0x00, 0x0d, 0x14, 0x37, 0x83, 0x8d, 0x5c, 0xf0, \n0x00, 0x37, 0xe8, 0x0a, 0x42, 0x10, 0xa0, 0x0b, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x8e, 0x88, \n0xdd, 0x2f, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x54, 0x90, \n0x00, 0xff, 0x54, 0x80, 0x80, 0xff, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0xb0, 0x97, 0xd0, \n0x4b, 0xe0, 0x18, 0x01, 0x80, 0x29, 0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x4e, 0x83, \n0x00, 0x07, 0x44, 0x10, 0x00, 0xb1, 0x44, 0x00, 0x00, 0x9e, 0xd5, 0x05, 0x44, 0x00, 0x00, 0x9e, \n0x44, 0x10, 0x00, 0xb2, 0x4b, 0xe0, 0x18, 0x01, 0x80, 0x27, 0x44, 0x00, 0x00, 0x9f, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, \n0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xf4, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x54, 0x90, \n0x00, 0xff, 0x97, 0xc8, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0xb0, 0x81, 0x02, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x30, 0x00, 0xb2, 0x44, 0x40, \n0x00, 0xb1, 0x40, 0x12, 0x24, 0x1a, 0x40, 0x11, 0xa4, 0x1b, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0x80, 0x27, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x26, \n0x84, 0x00, 0x92, 0x00, 0x84, 0x27, 0x9c, 0x01, 0x4c, 0x00, 0xff, 0xfd, 0x46, 0x60, 0x00, 0x06, \n0x58, 0x63, 0x00, 0x78, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x00, 0x00, 0x9f, 0x44, 0x10, 0x00, 0x9b, \n0x4b, 0xe0, 0x18, 0x01, 0x44, 0x00, 0x00, 0x9b, 0xf0, 0x81, 0x84, 0xe0, 0x50, 0x6f, 0x80, 0x04, \n0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x8e, 0xf8, 0xd5, 0x27, 0x44, 0x20, 0x00, 0x65, 0x4c, 0x71, \n0x00, 0x04, 0x84, 0x00, 0xd5, 0x18, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x84, 0x20, \n0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, \n0x18, 0x01, 0xd5, 0x17, 0x92, 0x00, 0x84, 0xa7, 0x9c, 0x49, 0xd9, 0xfd, 0x9c, 0x01, 0x87, 0xca, \n0x4c, 0x0f, 0x00, 0x04, 0x84, 0x20, 0xd5, 0xf7, 0x84, 0x00, 0x44, 0x10, 0x00, 0x9f, 0x80, 0x46, \n0x9d, 0xf9, 0x4b, 0xe0, 0x24, 0x01, 0xf4, 0x01, 0x44, 0x30, 0x00, 0x9b, 0x4c, 0x41, 0xbf, 0xd7, \n0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x10, 0x00, 0xba, 0x44, 0x00, 0x00, 0x9e, \n0x4b, 0xe0, 0x18, 0x01, 0x84, 0x2a, 0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x10, \n0x04, 0x10, 0x58, 0x10, 0x80, 0x7c, 0xb4, 0x01, 0x40, 0x10, 0x40, 0x09, 0x4e, 0x04, 0x00, 0x05, \n0x44, 0x2f, 0x00, 0x00, 0x98, 0x4a, 0x45, 0xe0, 0x80, 0x00, 0x40, 0x50, 0x78, 0x02, 0x96, 0x01, \n0xc5, 0x04, 0x44, 0x4f, 0x00, 0x00, 0x98, 0x04, 0x42, 0x30, 0x84, 0x24, 0x42, 0x30, 0x00, 0x73, \n0xb6, 0x68, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0x6c, 0x96, 0x00, 0xf0, 0x82, 0xc0, 0x08, 0x84, 0x20, 0xf1, 0x84, 0xf1, 0x89, 0xf1, 0x8a, \n0xf1, 0x8b, 0x48, 0x00, 0x02, 0x7f, 0x46, 0x30, 0x04, 0x11, 0x58, 0x31, 0x80, 0x04, 0xb5, 0x23, \n0x47, 0xe0, 0x04, 0x11, 0x14, 0x9f, 0x80, 0x0b, 0x59, 0xef, 0x03, 0xb8, 0xb4, 0x5e, 0x46, 0x70, \n0x04, 0x10, 0xf2, 0x8a, 0x58, 0x73, 0x85, 0x04, 0xb4, 0x87, 0x46, 0x80, 0x04, 0x10, 0xf4, 0x89, \n0x58, 0x84, 0x05, 0x0c, 0xb4, 0x28, 0xf0, 0x02, 0x44, 0xa0, 0x00, 0x10, 0xf1, 0x84, 0xb6, 0x03, \n0xb7, 0x5e, 0x50, 0x2f, 0x80, 0x48, 0xf0, 0x02, 0x84, 0x24, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0xf5, 0x12, 0x46, 0x90, 0x00, 0x06, 0x58, 0x94, 0x80, 0x78, 0x54, 0x12, \n0x80, 0xe7, 0x84, 0x04, 0x4b, 0xe0, 0x24, 0x01, 0xf0, 0x02, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, \n0x0d, 0xb8, 0x84, 0x21, 0x50, 0x2f, 0x80, 0x7c, 0xdd, 0x3c, 0xf0, 0x02, 0x84, 0x22, 0x50, 0x2f, \n0x80, 0x78, 0xdd, 0x3c, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x23, 0x50, 0x2f, 0x80, 0x74, 0xdd, 0x3c, \n0xf0, 0x02, 0x44, 0x10, 0x00, 0x2a, 0x50, 0x2f, 0x80, 0x70, 0xdd, 0x3c, 0xf1, 0x02, 0x50, 0x2f, \n0x80, 0x6c, 0x84, 0x04, 0xdd, 0x3c, 0x84, 0x22, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x04, 0xdd, 0x3c, \n0x44, 0x10, 0x00, 0x22, 0x50, 0x2f, 0x80, 0x64, 0x84, 0x04, 0xdd, 0x3c, 0x84, 0x23, 0x50, 0x2f, \n0x80, 0x60, 0x84, 0x05, 0xdd, 0x3c, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x5c, 0x84, 0x05, 0xdd, 0x3c, \n0x44, 0x10, 0x00, 0x11, 0x50, 0x2f, 0x80, 0x58, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x12, \n0x50, 0x2f, 0x80, 0x54, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x50, \n0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x4c, 0x84, 0x05, 0xdd, 0x3c, \n0xf0, 0x02, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0x84, 0x21, 0x44, 0x20, 0x00, 0x21, \n0xdd, 0x26, 0xf0, 0x02, 0x80, 0x4a, 0x84, 0x22, 0xdd, 0x26, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x23, \n0x80, 0x40, 0xdd, 0x26, 0xf0, 0x02, 0x44, 0x10, 0x00, 0x2a, 0x44, 0x20, 0x00, 0x1b, 0xdd, 0x26, \n0xf1, 0x02, 0x44, 0x20, 0x00, 0x81, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x22, 0x44, 0x20, 0x00, 0x81, \n0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x22, 0x44, 0x20, 0x00, 0xee, 0x84, 0x04, 0xdd, 0x26, \n0x84, 0x23, 0x44, 0x20, 0x00, 0x30, 0x84, 0x05, 0xdd, 0x26, 0x84, 0x24, 0x44, 0x20, 0x00, 0x30, \n0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xd7, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, \n0x44, 0x20, 0x00, 0xa2, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x20, 0x00, 0x20, 0x44, 0x10, 0x00, 0x14, \n0x84, 0x05, 0xdd, 0x26, 0xf1, 0x02, 0x44, 0x00, 0x00, 0x17, 0x4b, 0xe0, 0x24, 0x01, 0xf2, 0x02, \n0x46, 0x30, 0x00, 0xcf, 0x58, 0x31, 0x88, 0xb0, 0x44, 0x45, 0x20, 0x00, 0xb6, 0x47, 0xb6, 0x88, \n0xb6, 0x67, 0xf3, 0x02, 0x92, 0x00, 0x84, 0xe7, 0x9c, 0xd9, 0x4c, 0x33, 0xff, 0xfd, 0x46, 0x80, \n0x04, 0x10, 0x58, 0x84, 0x05, 0x0c, 0x44, 0x65, 0x20, 0x1e, 0xb6, 0xc8, 0x84, 0x60, 0x92, 0x00, \n0x85, 0x47, 0x9c, 0xd9, 0x4c, 0x35, 0x7f, 0xfd, 0x47, 0xc0, 0x04, 0x10, 0x59, 0xce, 0x05, 0x0c, \n0x44, 0x55, 0x20, 0x3e, 0xb6, 0xbc, 0x84, 0x60, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0xd9, 0x4c, 0x3f, \n0x7f, 0xfd, 0x46, 0x90, 0x00, 0x06, 0x58, 0x94, 0x80, 0x78, 0x84, 0x20, 0x44, 0x00, 0x00, 0x17, \n0xdd, 0x29, 0x44, 0x10, 0x00, 0xaa, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x9f, 0xdd, 0x29, 0x44, 0x10, 0x00, 0xab, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x84, 0x2a, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x29, 0x44, 0x10, 0x00, 0xac, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, \n0x44, 0x10, 0x00, 0x3f, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x29, 0x44, 0x10, 0x00, 0xad, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x3f, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x29, 0x44, 0x10, \n0x00, 0x40, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x29, 0x50, 0x2f, 0x80, 0x88, 0x44, 0x10, 0x00, 0x1f, \n0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf7, 0x22, 0x44, 0x00, \n0x00, 0x1f, 0x58, 0x23, 0x80, 0x60, 0xf2, 0xa2, 0x80, 0x22, 0xdd, 0x29, 0x84, 0x25, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x29, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x29, 0x46, 0x40, 0x00, 0x0d, \n0x58, 0x42, 0x0e, 0x00, 0x22, 0x12, 0x00, 0x00, 0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, 0x8e, 0x10, \n0x84, 0x00, 0xf1, 0x88, 0xf3, 0x86, 0xf0, 0x83, 0x46, 0x80, 0x00, 0x0a, 0x58, 0x84, 0x0f, 0xd8, \n0x3a, 0x04, 0x04, 0x00, 0x46, 0x70, 0x00, 0x0a, 0x58, 0x73, 0x8f, 0xd0, 0xf0, 0x90, 0x12, 0x1f, \n0x80, 0x22, 0xf1, 0x03, 0x50, 0x0f, 0x80, 0x40, 0x38, 0x20, 0x04, 0x00, 0x44, 0x31, 0x20, 0x3e, \n0x40, 0x91, 0x64, 0x08, 0x3a, 0x03, 0x84, 0x00, 0x46, 0x40, 0x04, 0x10, 0x41, 0xe4, 0x8c, 0x04, \n0x58, 0x42, 0x05, 0x0c, 0x51, 0xcf, 0x80, 0x38, 0xb6, 0x1c, 0x12, 0x1f, 0x80, 0x1e, 0x15, 0xe2, \n0x00, 0x00, 0x46, 0xa0, 0x00, 0x06, 0x58, 0xa5, 0x00, 0x78, 0xf5, 0x03, 0x44, 0x00, 0x00, 0x17, \n0x38, 0x1e, 0x14, 0x00, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0xb0, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, \n0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0xb2, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x2a, 0x44, 0x00, 0x00, 0x9f, 0x84, 0x20, 0xdd, 0x2a, 0xf6, 0x03, 0x54, 0x83, \n0x00, 0xff, 0x4e, 0x83, 0x00, 0x3b, 0x46, 0x80, 0x2e, 0xba, 0x58, 0x84, 0x0e, 0x3f, 0x44, 0x70, \n0x00, 0x12, 0x47, 0xc0, 0x00, 0x0a, 0x59, 0xce, 0x0f, 0xbc, 0x46, 0xa0, 0x00, 0x05, 0x58, 0xa5, \n0x0e, 0x70, 0x46, 0x90, 0x00, 0x08, 0x58, 0x94, 0x83, 0x00, 0xd5, 0x22, 0xf5, 0x08, 0x9f, 0xfa, \n0x38, 0x6e, 0x14, 0x00, 0x80, 0x46, 0x4b, 0xe0, 0x28, 0x01, 0x80, 0x46, 0x84, 0x24, 0x84, 0x05, \n0x4b, 0xe0, 0x28, 0x01, 0x84, 0x00, 0x80, 0x20, 0x50, 0x2f, 0x80, 0x84, 0x4b, 0xe0, 0x24, 0x01, \n0x84, 0x00, 0x44, 0x10, 0x00, 0x21, 0x50, 0x2f, 0x80, 0x80, 0x4b, 0xe0, 0x24, 0x01, 0xf6, 0x21, \n0xe3, 0x06, 0xe9, 0x05, 0x05, 0xef, 0x80, 0x20, 0xe3, 0x1e, 0xe8, 0x07, 0x97, 0xf9, 0x97, 0x3b, \n0x84, 0x23, 0x84, 0x05, 0xf4, 0x88, 0xcf, 0xdb, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, \n0x44, 0x10, 0x00, 0xb1, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x00, 0x00, 0x9f, \n0x84, 0x20, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x90, 0x00, 0x20, 0x84, 0x60, 0x85, 0x40, 0x87, 0x85, \n0x14, 0x9f, 0x80, 0x05, 0x10, 0x3f, 0x80, 0x8d, 0x10, 0x3f, 0x80, 0x8c, 0x15, 0xcf, 0x80, 0x07, \n0x81, 0x2a, 0xd5, 0x63, 0x81, 0x49, 0xf1, 0x05, 0xa7, 0x98, 0x44, 0x80, 0x00, 0x20, 0x9a, 0xb1, \n0x54, 0x71, 0x00, 0x3f, 0x80, 0x1c, 0x80, 0x27, 0x50, 0x2f, 0x80, 0x84, 0x4c, 0x64, 0x40, 0x06, \n0x14, 0x9f, 0x80, 0x21, 0x80, 0xe6, 0xd5, 0x08, 0xf3, 0x81, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, \n0x83, 0x00, 0xdd, 0x2f, 0xf3, 0x01, 0x05, 0xef, 0x80, 0x0c, 0x80, 0x1c, 0x40, 0x5f, 0x18, 0x00, \n0x54, 0x82, 0x80, 0x3f, 0x80, 0x28, 0x50, 0x2f, 0x80, 0x80, 0xf3, 0x81, 0x46, 0xf0, 0x00, 0x08, \n0x58, 0xf7, 0x83, 0x00, 0xdd, 0x2f, 0x04, 0x9f, 0x80, 0x21, 0xf5, 0x20, 0x40, 0x04, 0xa8, 0x06, \n0xf1, 0x0d, 0x56, 0x20, 0x00, 0x01, 0x40, 0x31, 0x04, 0x02, 0x40, 0x45, 0x14, 0x06, 0x40, 0x01, \n0x90, 0x02, 0xf3, 0x01, 0xc0, 0x04, 0xaf, 0x98, 0x81, 0x2a, 0xd5, 0x08, 0xe3, 0x25, 0xe8, 0x03, \n0xaf, 0xd8, 0xd5, 0x04, 0x10, 0x81, 0x80, 0x00, 0x81, 0x25, 0x08, 0x21, 0x80, 0x01, 0x80, 0x3c, \n0x84, 0x00, 0x51, 0xce, 0x00, 0x01, 0x84, 0xc2, 0xf3, 0x81, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, \n0x82, 0xa0, 0xdd, 0x2f, 0xf3, 0x01, 0x4d, 0xc3, 0x7f, 0xaf, 0xf3, 0x07, 0x84, 0xff, 0x50, 0x81, \n0xff, 0xff, 0x40, 0xa4, 0x00, 0x10, 0x14, 0xaf, 0x80, 0x07, 0x4c, 0xa3, 0x80, 0x18, 0xf4, 0x05, \n0x41, 0xc2, 0x04, 0x09, 0x15, 0xcf, 0x80, 0x05, 0xf6, 0x07, 0x87, 0x80, 0xf0, 0x05, 0x56, 0x23, \n0x00, 0x05, 0x87, 0xc0, 0x80, 0x3c, 0x40, 0x5f, 0x08, 0x06, 0x40, 0x10, 0x08, 0x1b, 0xf5, 0x8d, \n0x50, 0x3f, 0x80, 0x8c, 0x81, 0x49, 0xf1, 0x8c, 0xd5, 0x8f, 0x04, 0x8f, 0x80, 0x06, 0xf1, 0x03, \n0x00, 0x4f, 0x80, 0x8c, 0x00, 0x3f, 0x80, 0x8d, 0x50, 0x90, 0x80, 0x01, 0x50, 0x74, 0x00, 0x02, \n0x85, 0x43, 0x14, 0x9f, 0x80, 0x03, 0x10, 0x44, 0x00, 0x00, 0x10, 0x34, 0x00, 0x01, 0xf7, 0x86, \n0x4c, 0x95, 0x7e, 0xdc, 0xf2, 0x08, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x00, 0xac, 0x80, \n0x85, 0x20, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, 0xd5, 0x37, 0x44, 0x10, 0x00, 0xb0, \n0x44, 0x00, 0x00, 0x9e, 0xdd, 0x27, 0x80, 0x2a, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0x00, 0x24, \n0x00, 0x00, 0x44, 0x10, 0x00, 0xb1, 0x54, 0x41, 0x00, 0x3f, 0xf4, 0xa2, 0x44, 0x00, 0x00, 0x9e, \n0xdd, 0x27, 0xf1, 0x22, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0x00, 0x34, 0x00, 0x01, 0x44, 0x10, \n0x00, 0xb2, 0x54, 0x61, 0x80, 0x3f, 0xf6, 0xa2, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x27, 0xf1, 0x22, \n0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0x8d, 0x02, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8e, 0x16, \n0x8d, 0x41, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x4c, 0x82, 0xff, 0xd1, 0x8d, 0x24, \n0x45, 0xe0, 0x00, 0x10, 0x4c, 0x9f, 0x00, 0x08, 0x46, 0x80, 0x00, 0x0d, 0x58, 0x84, 0x0e, 0x10, \n0x81, 0x49, 0xd5, 0xc5, 0xf1, 0x02, 0x4e, 0x13, 0x00, 0x95, 0xf3, 0x0b, 0x46, 0x40, 0x04, 0x11, \n0x58, 0x42, 0x00, 0x04, 0xb6, 0x64, 0x46, 0x50, 0x04, 0x11, 0xf0, 0x0a, 0x58, 0x52, 0x83, 0xb8, \n0xb6, 0x05, 0x44, 0x00, 0x00, 0xf4, 0xf1, 0x02, 0xdd, 0x26, 0xf0, 0x02, 0x50, 0x2f, 0x80, 0x88, \n0x44, 0x10, 0x00, 0x1f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x04, 0x8f, \n0x80, 0x22, 0x44, 0x00, 0x00, 0x1f, 0x54, 0x74, 0x00, 0x9f, 0xf7, 0xa2, 0x80, 0x27, 0xdd, 0x26, \n0x84, 0x28, 0x44, 0x00, 0x00, 0x1f, 0xdd, 0x26, 0xf1, 0x02, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0xf1, 0x02, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x26, \n0xf0, 0x02, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, 0x4c, 0x03, 0x7f, 0xfd, 0x84, 0x20, 0x46, 0x80, \n0x00, 0x06, 0x58, 0x84, 0x00, 0x78, 0x44, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x20, 0x01, 0x46, 0x20, \n0x04, 0x10, 0x84, 0xe0, 0x58, 0x21, 0x05, 0x04, 0xb6, 0xe2, 0x46, 0x00, 0x04, 0x10, 0xf5, 0x04, \n0x58, 0x00, 0x05, 0x0c, 0xb6, 0xa0, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0xf1, 0x09, \n0x80, 0x07, 0xb6, 0x22, 0x84, 0x21, 0xf2, 0x1f, 0xdd, 0x26, 0xf2, 0x1e, 0x84, 0x22, 0x80, 0x07, \n0xdd, 0x26, 0xf2, 0x1d, 0x44, 0x10, 0x00, 0x23, 0x80, 0x07, 0xdd, 0x26, 0xf2, 0x1c, 0x44, 0x10, \n0x00, 0x2a, 0x80, 0x07, 0xdd, 0x26, 0xf2, 0x1b, 0x80, 0x27, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x1a, \n0x84, 0x22, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x19, 0x44, 0x10, 0x00, 0x22, 0x84, 0x04, 0xdd, 0x26, \n0xf2, 0x18, 0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x17, 0x84, 0x24, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x16, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x15, 0x44, 0x10, 0x00, 0x12, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x14, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x13, \n0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0xf1, 0x12, 0x84, 0x04, 0x4b, 0xe0, 0x20, 0x01, \n0xec, 0x94, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xf8, 0x84, 0x21, \n0x80, 0xe0, 0x44, 0x00, 0x00, 0x15, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x84, 0x20, 0xd5, 0x0a, 0x92, 0x00, 0x84, 0x07, 0x9c, 0x91, 0x4c, 0x20, 0x7f, 0xfd, 0x9c, 0x49, \n0x84, 0x6a, 0x4c, 0x11, 0x80, 0x04, 0x84, 0x40, 0xd5, 0xf6, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, \n0x00, 0x78, 0x84, 0x20, 0x44, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x18, 0x01, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x9b, 0x44, 0x00, 0x00, 0x9f, 0x4b, 0xe0, \n0x18, 0x01, 0x44, 0x10, 0x00, 0x9b, 0xf1, 0x81, 0x50, 0x6f, 0x80, 0x04, 0x46, 0x80, 0x00, 0x05, \n0x58, 0x84, 0x0e, 0xf8, 0xd5, 0x12, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x91, 0x4c, 0x22, 0x7f, 0xfd, \n0x9c, 0x49, 0x84, 0x4a, 0x4c, 0x11, 0x00, 0x04, 0x84, 0x40, 0xd5, 0xf6, 0x84, 0x00, 0x44, 0x10, \n0x00, 0x9f, 0x80, 0x46, 0x4b, 0xe0, 0x20, 0x01, 0xf5, 0x01, 0x45, 0xe0, 0x00, 0x9b, 0x4c, 0x5f, \n0x40, 0x04, 0x84, 0x20, 0xd5, 0xf2, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x10, \n0x00, 0xba, 0x44, 0x00, 0x00, 0x9e, 0x4b, 0xe0, 0x18, 0x01, 0x44, 0x10, 0x00, 0x14, 0x44, 0x00, \n0x00, 0x9f, 0x4b, 0xe0, 0x18, 0x01, 0x46, 0x00, 0x04, 0x10, 0x58, 0x00, 0x00, 0x7c, 0xb4, 0x20, \n0x40, 0x20, 0xc0, 0x09, 0x4e, 0x14, 0x00, 0x05, 0x44, 0x3f, 0x00, 0x00, 0x98, 0x93, 0x44, 0x50, \n0x80, 0x00, 0x40, 0x40, 0x94, 0x02, 0x96, 0x49, 0xc4, 0x04, 0x45, 0xef, 0x00, 0x00, 0x88, 0x3e, \n0x42, 0x21, 0x08, 0x24, 0x42, 0x20, 0x84, 0x73, 0xb6, 0x47, 0xec, 0x08, 0x3a, 0x6f, 0xa0, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x7c, 0x96, 0x00, 0xf0, 0x83, 0xc0, 0x08, \n0x84, 0x20, 0xf1, 0x87, 0xf1, 0x8a, 0xf1, 0x8b, 0xf1, 0x8c, 0x48, 0x00, 0x03, 0x9d, 0x46, 0x40, \n0x04, 0x11, 0x58, 0x42, 0x00, 0x04, 0xb5, 0x24, 0x46, 0x30, 0x04, 0x11, 0x14, 0x9f, 0x80, 0x0a, \n0x58, 0x31, 0x83, 0xb8, 0xb4, 0x43, 0x46, 0x70, 0x04, 0x10, 0xf2, 0x87, 0x58, 0x73, 0x85, 0x04, \n0xb4, 0x27, 0x46, 0x80, 0x04, 0x10, 0xf1, 0x8c, 0x58, 0x84, 0x05, 0x0c, 0x05, 0xef, 0x80, 0x03, \n0xb4, 0x08, 0x44, 0xa0, 0x00, 0x10, 0xf0, 0x8b, 0x15, 0xe2, 0x00, 0x00, 0xb7, 0x43, 0x50, 0x2f, \n0x80, 0x44, 0xf0, 0x03, 0x84, 0x24, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, \n0xf5, 0x11, 0x46, 0x90, 0x00, 0x06, 0x58, 0x94, 0x80, 0x78, 0x54, 0x12, 0x80, 0xe7, 0x84, 0x04, \n0x4b, 0xe0, 0x24, 0x01, 0xf0, 0x03, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, 0x0d, 0xb8, 0x84, 0x21, \n0x50, 0x2f, 0x80, 0x78, 0xdd, 0x3c, 0xf0, 0x03, 0x84, 0x22, 0x50, 0x2f, 0x80, 0x74, 0xdd, 0x3c, \n0xf0, 0x03, 0x44, 0x10, 0x00, 0x23, 0x50, 0x2f, 0x80, 0x70, 0xdd, 0x3c, 0xf0, 0x03, 0x44, 0x10, \n0x00, 0x2a, 0x50, 0x2f, 0x80, 0x6c, 0xdd, 0x3c, 0xf1, 0x03, 0x50, 0x2f, 0x80, 0x68, 0x84, 0x04, \n0xdd, 0x3c, 0x84, 0x22, 0x50, 0x2f, 0x80, 0x64, 0x84, 0x04, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x22, \n0x50, 0x2f, 0x80, 0x60, 0x84, 0x04, 0xdd, 0x3c, 0x84, 0x23, 0x50, 0x2f, 0x80, 0x5c, 0x84, 0x05, \n0xdd, 0x3c, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x58, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x11, \n0x50, 0x2f, 0x80, 0x54, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, 0x80, 0x50, \n0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x4c, 0x84, 0x05, 0xdd, 0x3c, \n0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x48, 0x84, 0x05, 0xdd, 0x3c, 0xf0, 0x03, 0x46, 0x60, \n0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0x84, 0x21, 0x44, 0x20, 0x00, 0x21, 0xdd, 0x26, 0xf0, 0x03, \n0x80, 0x4a, 0x84, 0x22, 0xdd, 0x26, 0xf0, 0x03, 0x44, 0x10, 0x00, 0x23, 0x80, 0x40, 0xdd, 0x26, \n0xf0, 0x03, 0x44, 0x10, 0x00, 0x2a, 0x44, 0x20, 0x00, 0x1b, 0xdd, 0x26, 0xf1, 0x03, 0x44, 0x20, \n0x00, 0x81, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x22, 0x44, 0x20, 0x00, 0x81, 0x84, 0x04, 0xdd, 0x26, \n0x44, 0x10, 0x00, 0x22, 0x44, 0x20, 0x00, 0xee, 0x84, 0x04, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x11, \n0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x12, 0x44, 0x20, 0x00, 0xd7, \n0x84, 0x05, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0xa2, 0x84, 0x05, 0xdd, 0x26, \n0x44, 0x20, 0x00, 0x20, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0xf1, 0x03, 0x44, 0x00, \n0x00, 0x17, 0x4b, 0xe0, 0x24, 0x01, 0xf2, 0x03, 0x46, 0x30, 0x00, 0xcf, 0x58, 0x31, 0x88, 0xb0, \n0x44, 0x45, 0x20, 0x00, 0xb6, 0x47, 0xb6, 0x88, 0xb6, 0x67, 0xf3, 0x03, 0x92, 0x00, 0x84, 0xe7, \n0x9c, 0xd9, 0x4c, 0x33, 0xff, 0xfd, 0x46, 0x80, 0x04, 0x10, 0x58, 0x84, 0x05, 0x0c, 0x44, 0x65, \n0x20, 0x1e, 0xb6, 0xc8, 0x84, 0x60, 0x92, 0x00, 0x85, 0x47, 0x9c, 0xd9, 0x4c, 0x35, 0x7f, 0xfd, \n0x47, 0xc0, 0x04, 0x10, 0x59, 0xce, 0x05, 0x0c, 0x44, 0x55, 0x20, 0x3e, 0xb6, 0xbc, 0x84, 0x60, \n0x92, 0x00, 0x84, 0x87, 0x9c, 0xd9, 0x4c, 0x32, 0x7f, 0xfd, 0x46, 0x90, 0x00, 0x06, 0x58, 0x94, \n0x80, 0x78, 0x84, 0x24, 0x44, 0x00, 0x00, 0x17, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x14, 0x44, 0x00, \n0x00, 0xf1, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0xf2, 0xdd, 0x29, 0x44, 0x10, \n0x00, 0x31, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x29, 0x44, 0x10, 0x00, 0xb0, 0x44, 0x00, 0x00, 0x9e, \n0xdd, 0x29, 0x44, 0x10, 0x00, 0x80, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x29, 0x46, 0x80, 0x00, 0x05, \n0x58, 0x84, 0x0e, 0xf8, 0x50, 0x2f, 0x80, 0x40, 0x44, 0x10, 0x00, 0x1f, 0x84, 0x00, 0x4b, 0xe0, \n0x20, 0x01, 0xf1, 0x10, 0x44, 0x00, 0x00, 0x1f, 0x58, 0x20, 0x80, 0x60, 0xf2, 0x9f, 0x80, 0x22, \n0xdd, 0x29, 0x84, 0x25, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x84, 0x24, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x29, 0x84, 0x23, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x50, 0x2f, 0x80, 0x7c, 0x44, 0x10, \n0x00, 0x9f, 0x84, 0x00, 0x4b, 0xe0, 0x20, 0x01, 0xf3, 0x1f, 0x44, 0x00, 0x00, 0x9f, 0x58, 0x11, \n0x80, 0x60, 0xdd, 0x29, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0x70, 0x84, 0x23, 0x44, 0x20, \n0x00, 0x3c, 0x84, 0x05, 0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x20, 0x00, 0x3c, 0x84, 0x24, 0x84, 0x05, \n0x4b, 0xe0, 0x1c, 0x01, 0x44, 0x10, 0x00, 0x28, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x44, 0x00, \n0x00, 0x9f, 0x84, 0x20, 0xdd, 0x29, 0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, 0x8e, 0x00, 0x22, 0x41, \n0x80, 0x00, 0x4e, 0x44, 0x00, 0x04, 0x84, 0x80, 0xd5, 0x05, 0xe4, 0x93, 0xe9, 0x42, 0x44, 0x40, \n0x00, 0x12, 0xad, 0x18, 0xd5, 0x3e, 0x46, 0x40, 0x00, 0x0a, 0x58, 0x42, 0x0f, 0xbc, 0x38, 0x22, \n0x08, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x22, 0x54, 0x00, 0x00, \n0x47, 0xe0, 0x00, 0x0a, 0x59, 0xef, 0x0f, 0xbc, 0x38, 0x2f, 0x14, 0x00, 0x84, 0x24, 0x84, 0x05, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0x70, 0xdd, 0x2f, 0x44, 0x10, 0x00, 0x29, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x21, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x29, 0x80, 0x07, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0x29, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x9f, 0xdd, 0x29, 0x80, 0x06, 0xdd, 0x3c, 0xf0, 0x0f, 0xe3, 0x40, 0xe9, 0x24, 0xf3, 0x0e, \n0xe3, 0x43, 0xe9, 0x21, 0x02, 0x14, 0x00, 0x00, 0x9c, 0x8a, 0x12, 0x24, 0x00, 0x00, 0xd5, 0x15, \n0x46, 0xa0, 0x05, 0xf5, 0x58, 0xa5, 0x0e, 0x10, 0x46, 0x80, 0x00, 0x0d, 0x58, 0x84, 0x0e, 0x00, \n0x46, 0x90, 0x00, 0x06, 0x58, 0x94, 0x80, 0x78, 0x50, 0x7f, 0x80, 0x3c, 0x47, 0xc0, 0x00, 0x08, \n0x59, 0xce, 0x0b, 0x18, 0x50, 0x6f, 0x80, 0x38, 0x22, 0x24, 0x00, 0x00, 0x84, 0x23, 0x84, 0x05, \n0xe4, 0x53, 0xe9, 0xaa, 0x85, 0x40, 0x85, 0x25, 0x45, 0xc0, 0x00, 0x20, 0x84, 0x00, 0x46, 0x70, \n0x00, 0x0d, 0x58, 0x73, 0x8e, 0x0c, 0x14, 0x9f, 0x80, 0x05, 0x15, 0xcf, 0x80, 0x06, 0x14, 0xaf, \n0x80, 0x04, 0xae, 0x38, 0x50, 0x2f, 0x80, 0x38, 0x50, 0x5f, 0x80, 0x3c, 0x81, 0x2a, 0x83, 0x8a, \n0x48, 0x00, 0x00, 0xf4, 0x14, 0x9f, 0x80, 0x04, 0x84, 0x61, 0x4c, 0xa1, 0x80, 0x17, 0x05, 0xef, \n0x80, 0x05, 0x5e, 0xff, 0x00, 0x04, 0x4e, 0xf2, 0x00, 0xd7, 0x46, 0x80, 0x00, 0x0d, 0x58, 0x84, \n0x0e, 0x0c, 0x00, 0x94, 0x00, 0x00, 0x04, 0x8f, 0x80, 0x09, 0x54, 0x14, 0x80, 0x0f, 0x56, 0x40, \n0x80, 0x08, 0x40, 0x02, 0x0c, 0x06, 0xd5, 0x09, 0x54, 0x64, 0x80, 0x3f, 0x56, 0x33, 0x00, 0x20, \n0x04, 0x8f, 0x80, 0x08, 0x5c, 0x01, 0x80, 0x01, 0xc0, 0x05, 0x15, 0xcf, 0x80, 0x0f, 0x80, 0xe9, \n0xd5, 0x39, 0xf0, 0x06, 0x40, 0x74, 0x80, 0x01, 0x96, 0xf8, 0x4e, 0xa3, 0x00, 0x12, 0x44, 0x10, \n0x00, 0x28, 0x44, 0x00, 0x00, 0x9e, 0xf2, 0x81, 0xb6, 0xbf, 0x54, 0x71, 0x80, 0x0f, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, 0xd5, 0x10, 0x44, 0x00, \n0x00, 0x9e, 0x44, 0x10, 0x00, 0x29, 0xf2, 0x81, 0xb6, 0xbf, 0x54, 0x71, 0x80, 0x3f, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xb4, 0xbf, 0xf2, 0x01, 0x80, 0x27, 0x44, 0x00, \n0x00, 0x9f, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0xb4, 0xbf, 0x80, 0x05, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x8b, 0x18, 0xdd, 0x2f, 0xb4, 0xbf, \n0xf2, 0x01, 0xf1, 0x06, 0x84, 0x80, 0x40, 0x40, 0xa0, 0x1a, 0x41, 0xe2, 0x24, 0x00, 0x54, 0x3f, \n0x00, 0xff, 0x4e, 0xa3, 0x00, 0x12, 0x44, 0x10, 0x00, 0x28, 0x44, 0x00, 0x00, 0x9e, 0xf2, 0x81, \n0xb6, 0xbf, 0x54, 0x61, 0x80, 0x0f, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0xf2, 0x01, 0xb4, 0xbf, 0xd5, 0x10, 0x44, 0x00, 0x00, 0x9e, 0x44, 0x10, 0x00, 0x29, 0xf2, 0x81, \n0xb6, 0xbf, 0x54, 0x61, 0x80, 0x3f, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0xb4, 0xbf, 0xf2, 0x01, 0x80, 0x26, 0x44, 0x00, 0x00, 0x9f, 0xb6, 0xbf, 0xf2, 0x81, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf2, 0x01, 0x80, 0x02, 0x46, 0xf0, 0x00, 0x08, \n0x58, 0xf7, 0x8b, 0x18, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, 0x4e, 0x83, 0x00, 0x09, 0xf3, 0x0f, \n0xe2, 0x7c, 0xe9, 0x05, 0xf0, 0x0e, 0x40, 0xfe, 0x00, 0x06, 0xe9, 0x0a, 0xf3, 0x0f, 0x05, 0xcf, \n0x80, 0x0e, 0xe2, 0x7c, 0xe8, 0x04, 0x83, 0x83, 0x81, 0x27, 0xd5, 0x02, 0x81, 0x26, 0x4e, 0xa3, \n0x00, 0x10, 0x44, 0x10, 0x00, 0x28, 0x44, 0x00, 0x00, 0x9e, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, 0xd5, 0x0e, 0x44, 0x00, \n0x00, 0x9e, 0x44, 0x10, 0x00, 0x29, 0xf2, 0x81, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, \n0x80, 0x78, 0xdd, 0x2f, 0xb4, 0xbf, 0xf2, 0x01, 0x44, 0x00, 0x00, 0x9f, 0x80, 0x29, 0xf2, 0x81, \n0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0xf2, 0x01, 0xb4, 0xbf, \n0x4e, 0xa3, 0x00, 0x0a, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x0c, 0x10, 0x93, 0x00, 0x00, \n0x04, 0x9f, 0x80, 0x04, 0x8d, 0x41, 0x54, 0xa5, 0x00, 0xff, 0x84, 0xe2, 0x4c, 0xa3, 0xff, 0x1c, \n0xf1, 0x05, 0x9f, 0x09, 0x41, 0xe2, 0x00, 0x10, 0x15, 0xef, 0x80, 0x05, 0x4f, 0xe2, 0x00, 0x18, \n0xf0, 0x06, 0x40, 0x30, 0x04, 0x09, 0xf3, 0x86, 0x05, 0xef, 0x80, 0x05, 0x14, 0x9f, 0x80, 0x04, \n0x56, 0x4f, 0x00, 0x05, 0x56, 0x7f, 0x00, 0x03, 0x5c, 0xa2, 0x00, 0x01, 0x5c, 0x63, 0x80, 0x01, \n0x14, 0xaf, 0x80, 0x08, 0xf6, 0x89, 0x85, 0x40, 0x48, 0xff, 0xff, 0x00, 0x44, 0x00, 0x00, 0x17, \n0x84, 0x27, 0x14, 0x9f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x46, 0x20, 0x00, 0x0d, 0x58, 0x21, 0x0e, 0x0c, 0xa7, 0x50, 0x80, 0xdc, 0x55, 0xc2, 0x80, 0x08, \n0x54, 0x32, 0x80, 0x0f, 0x4f, 0xc2, 0x00, 0x05, 0x50, 0x11, 0xff, 0xf0, 0x96, 0xca, 0x84, 0x04, \n0x42, 0x31, 0x80, 0x01, 0x5e, 0xf1, 0xff, 0xf9, 0xe8, 0x04, 0x84, 0x78, 0xf3, 0x86, 0xd5, 0x04, \n0x9f, 0x19, 0x97, 0xe2, 0xf7, 0x86, 0x05, 0xcf, 0x80, 0x04, 0x55, 0xee, 0x00, 0x20, 0x54, 0x3e, \n0x00, 0x3f, 0x4f, 0xe2, 0x00, 0x05, 0x50, 0x51, 0xff, 0xc0, 0x96, 0xea, 0x44, 0x20, 0x00, 0x1c, \n0x42, 0x31, 0x88, 0x01, 0x5e, 0xf1, 0xff, 0xe1, 0xe8, 0x04, 0x44, 0x3f, 0xff, 0xe0, 0xd5, 0x03, \n0x9e, 0x59, 0x96, 0xca, 0xf3, 0x85, 0xf3, 0x06, 0xf7, 0x05, 0x87, 0xc0, 0x9d, 0x1b, 0x9c, 0x3b, \n0x15, 0xef, 0x80, 0x08, 0xf4, 0x89, 0xf0, 0x8d, 0x50, 0x2f, 0x80, 0x3c, 0x83, 0x83, 0xd5, 0x5f, \n0xf2, 0x81, 0xf4, 0x82, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x80, 0x2a, 0x44, 0x00, 0x00, 0x9f, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, \n0x44, 0x10, 0x00, 0x29, 0x44, 0x00, 0x00, 0x9e, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, \n0xdd, 0x2f, 0x80, 0x26, 0x44, 0x00, 0x00, 0x9f, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, \n0xdd, 0x2f, 0xf5, 0x01, 0x80, 0x05, 0x46, 0xf0, 0x00, 0x08, 0x58, 0xf7, 0x8b, 0x18, 0xdd, 0x2f, \n0xb4, 0xbf, 0xf1, 0x06, 0xf2, 0x01, 0xf4, 0x02, 0xd9, 0x09, 0xf3, 0x05, 0x4c, 0x81, 0xc0, 0x07, \n0x10, 0xa2, 0x00, 0x00, 0xf6, 0x84, 0xf0, 0x0f, 0xd5, 0x0c, 0xf0, 0x0f, 0xe2, 0x09, 0xe9, 0x03, \n0x80, 0x09, 0xd5, 0x07, 0x54, 0x93, 0x80, 0x3f, 0x10, 0xa2, 0x00, 0x00, 0x14, 0x9f, 0x80, 0x04, \n0x8d, 0x01, 0x40, 0x84, 0x00, 0x10, 0x51, 0xce, 0x00, 0x01, 0x81, 0x20, 0x05, 0xef, 0x80, 0x05, \n0x54, 0x74, 0x00, 0xff, 0x40, 0x3e, 0x78, 0x00, 0x05, 0xef, 0x80, 0x0d, 0x44, 0x10, 0x00, 0x28, \n0x44, 0x00, 0x00, 0x9e, 0x54, 0x63, 0x80, 0x3f, 0x40, 0xff, 0x0c, 0x07, 0xe8, 0xaa, 0xf7, 0x08, \n0x9d, 0x29, 0x9c, 0x39, 0xf0, 0x88, 0x80, 0xc9, 0x41, 0xc2, 0x00, 0x10, 0x05, 0xef, 0x80, 0x08, \n0xf3, 0x06, 0xf1, 0x09, 0x40, 0x5f, 0x0c, 0x00, 0xe0, 0x25, 0xe9, 0x0f, 0x54, 0x9e, 0x00, 0x0f, \n0x85, 0x40, 0x80, 0xbc, 0x04, 0x8f, 0x80, 0x05, 0x83, 0x8a, 0x46, 0x40, 0x00, 0x0d, 0x58, 0x42, \n0x0e, 0x0c, 0x81, 0x49, 0x81, 0x26, 0xd5, 0xd3, 0xf6, 0x04, 0x46, 0x20, 0x00, 0x0d, 0x58, 0x21, \n0x0e, 0x0d, 0xaf, 0x90, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x10, 0x00, 0x28, \n0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8e, 0x0c, 0xa7, 0x28, \n0x44, 0x00, 0x00, 0x9f, 0x54, 0x12, 0x00, 0x0f, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x29, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x26, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x0d, 0xa7, 0xc0, 0x44, 0x00, \n0x00, 0x9f, 0x54, 0x13, 0x80, 0x3f, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, \n0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0xf4, 0xdd, 0x26, \n0x44, 0x00, 0x00, 0x15, 0x84, 0x21, 0xdd, 0x26, 0x84, 0x60, 0x92, 0x00, 0x84, 0x27, 0x9c, 0xd9, \n0x4c, 0x30, 0xff, 0xfd, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, 0x44, 0x00, 0x00, 0x15, \n0x84, 0x20, 0xdd, 0x27, 0xf3, 0x03, 0xcb, 0x6e, 0x05, 0xef, 0x80, 0x0a, 0x46, 0x30, 0x04, 0x11, \n0x58, 0x31, 0x80, 0x04, 0x15, 0xe1, 0x80, 0x00, 0x46, 0x50, 0x04, 0x11, 0xf1, 0x07, 0x58, 0x52, \n0x83, 0xb8, 0xb6, 0x25, 0x46, 0x20, 0x04, 0x10, 0xf0, 0x03, 0x58, 0x21, 0x05, 0x04, 0xb6, 0x02, \n0x46, 0x40, 0x04, 0x10, 0xf6, 0x0b, 0x58, 0x42, 0x05, 0x0c, 0xb6, 0xc4, 0x44, 0x10, 0x00, 0xb0, \n0x05, 0xef, 0x80, 0x0c, 0x44, 0x00, 0x00, 0x9e, 0x15, 0xe1, 0x00, 0x00, 0x46, 0x60, 0x00, 0x05, \n0x58, 0x63, 0x0e, 0x70, 0xdd, 0x27, 0xf1, 0x03, 0x44, 0x00, 0x00, 0x9f, 0xdd, 0x27, 0xf1, 0x10, \n0x44, 0x00, 0x00, 0x1f, 0xdd, 0x27, 0xf2, 0x1e, 0xf0, 0x03, 0x84, 0x21, 0xdd, 0x26, 0xf2, 0x1d, \n0xf0, 0x03, 0x84, 0x22, 0xdd, 0x26, 0xf2, 0x1c, 0xf0, 0x03, 0x44, 0x10, 0x00, 0x23, 0xdd, 0x26, \n0xf2, 0x1b, 0xf0, 0x03, 0x44, 0x10, 0x00, 0x2a, 0xdd, 0x26, 0xf2, 0x1a, 0xf1, 0x03, 0x84, 0x04, \n0xdd, 0x26, 0xf2, 0x19, 0x84, 0x22, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x18, 0x44, 0x10, 0x00, 0x22, \n0x84, 0x04, 0xdd, 0x26, 0xf2, 0x17, 0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x16, 0x84, 0x24, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x15, 0x44, 0x10, 0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x14, \n0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x13, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, \n0xdd, 0x26, 0xf2, 0x12, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x26, 0xf1, 0x11, 0x84, 0x04, \n0xdd, 0x27, 0xec, 0x84, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0x94, 0x46, 0x60, 0x00, 0x0a, 0x58, 0x63, 0x0f, 0xe0, 0x96, 0x40, 0xf1, 0x82, 0x3a, 0x03, \n0x08, 0x00, 0x50, 0x5f, 0x80, 0x2c, 0x80, 0x65, 0x3a, 0x01, 0x84, 0x24, 0x40, 0x41, 0x40, 0x09, \n0xf0, 0x02, 0xac, 0x98, 0x10, 0x4f, 0x80, 0x36, 0xc0, 0x06, 0x84, 0x40, 0xf2, 0x87, 0xf2, 0x89, \n0x48, 0x00, 0x02, 0x9d, 0x46, 0x70, 0x04, 0x10, 0x58, 0x73, 0x85, 0x0c, 0xb4, 0x87, 0x46, 0x80, \n0x04, 0x10, 0xf4, 0x89, 0x58, 0x84, 0x05, 0x04, 0x05, 0xe4, 0x00, 0x00, 0xf1, 0x02, 0x15, 0xef, \n0x80, 0x07, 0x47, 0xc0, 0x00, 0x05, 0x59, 0xce, 0x0d, 0xb8, 0x50, 0x2f, 0x80, 0x64, 0x84, 0x04, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x60, 0x84, 0x04, 0xdd, 0x3c, 0x44, 0x10, \n0x00, 0x11, 0x50, 0x2f, 0x80, 0x5c, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x12, 0x50, 0x2f, \n0x80, 0x58, 0x84, 0x05, 0xdd, 0x3c, 0x44, 0x10, 0x00, 0x13, 0x50, 0x2f, 0x80, 0x54, 0x84, 0x05, \n0xdd, 0x3c, 0x44, 0x10, 0x00, 0x14, 0x50, 0x2f, 0x80, 0x50, 0x84, 0x05, 0xdd, 0x3c, 0x84, 0x23, \n0x50, 0x2f, 0x80, 0x4c, 0x84, 0x05, 0xdd, 0x3c, 0x84, 0x24, 0x50, 0x2f, 0x80, 0x48, 0x84, 0x05, \n0xdd, 0x3c, 0xf1, 0x02, 0x46, 0xa0, 0x00, 0x05, 0x58, 0xa5, 0x0e, 0x70, 0x44, 0x20, 0x00, 0x87, \n0x84, 0x04, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x24, 0x84, 0x04, 0xdd, 0x2a, \n0x44, 0x10, 0x00, 0x11, 0x44, 0x20, 0x00, 0x80, 0x84, 0x05, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x12, \n0x44, 0x20, 0x00, 0xc1, 0x84, 0x05, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x13, 0x44, 0x20, 0x00, 0x60, \n0x84, 0x05, 0xdd, 0x2a, 0xf2, 0x02, 0x44, 0x10, 0x00, 0x14, 0x84, 0x05, 0xdd, 0x2a, 0x84, 0x23, \n0x44, 0x20, 0x00, 0x3c, 0x84, 0x05, 0xdd, 0x2a, 0x84, 0x24, 0x44, 0x20, 0x00, 0x3c, 0x84, 0x05, \n0xdd, 0x2a, 0xf0, 0x02, 0x46, 0x90, 0x00, 0x05, 0x58, 0x94, 0x8e, 0xf8, 0x44, 0x10, 0x00, 0x17, \n0x50, 0x2f, 0x80, 0x40, 0x4b, 0xe0, 0x24, 0x01, 0xf0, 0x02, 0x50, 0x2f, 0x80, 0x44, 0x84, 0x24, \n0x4b, 0xe0, 0x24, 0x01, 0xf1, 0x02, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x84, 0x04, \n0x4b, 0xe0, 0x18, 0x01, 0xf1, 0x02, 0x44, 0x00, 0x00, 0x17, 0x4b, 0xe0, 0x18, 0x01, 0x47, 0xc0, \n0x00, 0x92, 0xf0, 0x02, 0x46, 0xa0, 0x00, 0xdf, 0x46, 0x90, 0x00, 0x92, 0x58, 0xa5, 0x08, 0x38, \n0x58, 0x94, 0x80, 0x10, 0xb6, 0x08, 0x15, 0xc3, 0x80, 0x00, 0xb7, 0x48, 0xb7, 0x27, 0xf3, 0x02, \n0x92, 0x00, 0x84, 0xa7, 0x9c, 0xd9, 0xdb, 0xfd, 0x46, 0x30, 0x04, 0x10, 0x46, 0x10, 0x00, 0x92, \n0x58, 0x31, 0x85, 0x0c, 0x58, 0x10, 0x80, 0x30, 0xb6, 0x23, 0x84, 0x60, 0x92, 0x00, 0x84, 0x47, \n0x9c, 0xd9, 0x4c, 0x31, 0x7f, 0xfd, 0x46, 0x70, 0x04, 0x10, 0x46, 0x80, 0x00, 0x92, 0x58, 0x73, \n0x85, 0x0c, 0x58, 0x84, 0x00, 0x38, 0xb7, 0x07, 0x84, 0x60, 0x92, 0x00, 0x84, 0x07, 0x9c, 0xd9, \n0x4c, 0x30, 0x7f, 0xfd, 0x46, 0x90, 0x00, 0x06, 0x58, 0x94, 0x80, 0x78, 0x84, 0x22, 0x44, 0x00, \n0x00, 0x17, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x14, 0x44, 0x00, 0x00, 0xf1, 0xdd, 0x29, 0x44, 0x10, \n0x00, 0x80, 0x44, 0x00, 0x00, 0xf2, 0xdd, 0x29, 0x44, 0x10, 0x00, 0x31, 0x44, 0x00, 0x00, 0xf4, \n0xdd, 0x29, 0x84, 0x25, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9f, \n0xdd, 0x29, 0x85, 0x40, 0x84, 0x23, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x29, 0x14, 0xaf, 0x80, 0x03, \n0x44, 0x00, 0x00, 0x9f, 0x44, 0x10, 0x00, 0x60, 0xdd, 0x29, 0xf6, 0x03, 0x50, 0x5f, 0x80, 0x38, \n0xf6, 0x88, 0xf6, 0x86, 0xf6, 0x85, 0xf6, 0x84, 0x81, 0x26, 0x51, 0xef, 0x80, 0x2c, 0x38, 0x8f, \n0x24, 0x00, 0x84, 0x23, 0x80, 0x48, 0x84, 0x05, 0xb6, 0xbf, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0x70, 0xdd, 0x2f, 0x80, 0x48, 0x84, 0x24, 0x84, 0x05, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8e, 0x70, 0xdd, 0x2f, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x78, 0x84, 0x20, 0x44, 0x00, \n0x00, 0x9e, 0x4b, 0xe0, 0x1c, 0x01, 0x45, 0xc0, 0x00, 0x93, 0x44, 0x00, 0x00, 0x9f, 0x44, 0x10, \n0x00, 0x93, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0xf8, 0x15, 0xcf, \n0x80, 0x0f, 0xd5, 0x14, 0x92, 0x00, 0x84, 0x87, 0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, 0x9c, 0x49, \n0x84, 0x6a, 0x4c, 0x11, 0x80, 0x04, 0x84, 0x00, 0xd5, 0xf6, 0xb6, 0xbf, 0x84, 0x00, 0x44, 0x10, \n0x00, 0x9f, 0x50, 0x2f, 0x80, 0x3c, 0x4b, 0xe0, 0x18, 0x01, 0xf2, 0x0f, 0x44, 0x10, 0x00, 0x93, \n0xb4, 0xbf, 0x4c, 0x20, 0xc0, 0x04, 0x84, 0x20, 0xd5, 0xef, 0x87, 0x80, 0x46, 0xa0, 0x00, 0x06, \n0x58, 0xa5, 0x00, 0x78, 0x44, 0x40, 0x10, 0x00, 0x87, 0xc0, 0x15, 0xef, 0x80, 0x0e, 0xb6, 0xbf, \n0xf4, 0x81, 0x44, 0x10, 0x00, 0x1e, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, 0x80, 0x3c, 0x44, 0x00, \n0x00, 0x9f, 0xdd, 0x2a, 0x44, 0x10, 0x00, 0x22, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x2a, 0xb5, 0x1f, \n0x46, 0x20, 0x00, 0x0a, 0x58, 0x21, 0x0f, 0x1c, 0xb4, 0x02, 0x44, 0x10, 0x00, 0x9f, 0x80, 0x48, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf3, 0x0e, 0x44, 0x10, 0x00, 0x21, \n0x44, 0x00, 0x00, 0x9e, 0x40, 0x81, 0xe0, 0x08, 0xdd, 0x2a, 0x46, 0x40, 0x00, 0x0a, 0x58, 0x42, \n0x0f, 0x1c, 0xb4, 0xff, 0xb4, 0x04, 0x80, 0x47, 0x44, 0x10, 0x00, 0x9f, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x44, 0x10, 0x00, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xf6, 0x0e, \n0xdd, 0x2a, 0x46, 0x50, 0x00, 0x0a, 0x58, 0x52, 0x8f, 0x1c, 0xb4, 0x3f, 0xb4, 0x05, 0x80, 0x41, \n0x44, 0x10, 0x00, 0x9f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf2, 0x0e, \n0x44, 0x10, 0x00, 0x1f, 0x44, 0x00, 0x00, 0x9e, 0x40, 0x73, 0x40, 0x08, 0x40, 0x61, 0x20, 0x08, \n0xdd, 0x2a, 0x46, 0x30, 0x00, 0x0a, 0x58, 0x31, 0x8f, 0x1c, 0xb4, 0x9f, 0xb4, 0x03, 0x80, 0x44, \n0x44, 0x10, 0x00, 0x9f, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0x40, 0x04, \n0x1c, 0x00, 0x04, 0x8f, 0x80, 0x0e, 0x54, 0x3e, 0x00, 0xff, 0x40, 0x50, 0x20, 0x00, 0x98, 0xae, \n0xf4, 0x01, 0xb4, 0xbf, 0xe6, 0x62, 0xe8, 0x10, 0x46, 0x10, 0x08, 0x00, 0x40, 0x01, 0x04, 0x02, \n0xc0, 0x10, 0x46, 0x80, 0x0f, 0xff, 0x58, 0x84, 0x0f, 0xff, 0x46, 0x7f, 0xf0, 0x00, 0x40, 0x61, \n0x20, 0x02, 0x98, 0x37, 0xd5, 0x07, 0x87, 0xc4, 0x4c, 0x3f, 0x40, 0x04, 0x80, 0x02, 0xd5, 0x1d, \n0x80, 0x02, 0xcb, 0x05, 0x40, 0x30, 0x10, 0x16, 0xf3, 0x84, 0xd5, 0x1b, 0x84, 0x21, 0x4c, 0x30, \n0xc0, 0x06, 0x40, 0x20, 0x10, 0x16, 0xf2, 0x85, 0xd5, 0x14, 0x84, 0xc2, 0x4c, 0x33, 0x40, 0x06, \n0x40, 0x01, 0x30, 0x09, 0xf0, 0x86, 0xd5, 0x0d, 0x84, 0xe3, 0x4c, 0x33, 0xc0, 0x07, 0x40, 0x81, \n0x30, 0x09, 0x14, 0x8f, 0x80, 0x08, 0xd5, 0x05, 0x41, 0xe0, 0x10, 0x16, 0x15, 0xef, 0x80, 0x03, \n0x51, 0xce, 0x00, 0x01, 0x84, 0x65, 0x4d, 0xc1, 0xff, 0x59, 0xf1, 0x06, 0xf4, 0x04, 0x42, 0x12, \n0x10, 0x75, 0xf1, 0x8f, 0x5c, 0xf0, 0xa7, 0x10, 0xe8, 0x38, 0x5c, 0xf0, 0x80, 0x65, 0xe8, 0x04, \n0x50, 0x04, 0x80, 0x09, 0xd5, 0x2d, 0x5c, 0xf0, 0x80, 0x9f, 0xe8, 0x04, 0x50, 0x04, 0x80, 0x08, \n0xd5, 0x27, 0x5c, 0xf0, 0x80, 0xfc, 0xe8, 0x04, 0x50, 0x04, 0x80, 0x07, 0xd5, 0x21, 0x5c, 0xf0, \n0x81, 0x8f, 0xe8, 0x04, 0x50, 0x04, 0x80, 0x06, 0xd5, 0x1b, 0x5c, 0xf0, 0x82, 0x77, 0xe8, 0x04, \n0x50, 0x04, 0x80, 0x05, 0xd5, 0x15, 0x5c, 0xf0, 0x83, 0xe9, 0xe8, 0x04, 0x50, 0x04, 0x80, 0x04, \n0xd5, 0x0f, 0x5c, 0xf0, 0x86, 0x31, 0xe8, 0x04, 0x50, 0x04, 0x80, 0x03, 0xd5, 0x09, 0x5c, 0xf0, \n0x89, 0xd0, 0xe8, 0x04, 0x50, 0x04, 0x80, 0x02, 0xd5, 0x03, 0x50, 0x04, 0x80, 0x01, 0x54, 0x90, \n0x00, 0xff, 0xe7, 0x2b, 0x4e, 0xf3, 0xfe, 0xcb, 0xf0, 0x04, 0xf6, 0x06, 0x44, 0x80, 0x00, 0x64, \n0x42, 0x60, 0x00, 0x75, 0x46, 0x70, 0x00, 0x06, 0x58, 0x73, 0x80, 0x5c, 0x42, 0x03, 0x20, 0x24, \n0x4b, 0xe0, 0x1c, 0x01, 0xf1, 0x08, 0xf2, 0x05, 0x80, 0xc0, 0x42, 0x11, 0x08, 0x75, 0x42, 0x00, \n0xa0, 0x24, 0x4b, 0xe0, 0x1c, 0x01, 0x50, 0x53, 0x7c, 0x18, 0x80, 0x60, 0x5c, 0xf2, 0x81, 0x91, \n0xe8, 0x48, 0x9b, 0x30, 0x5e, 0xf2, 0x00, 0x71, 0xe8, 0x44, 0x5e, 0xf2, 0x7f, 0x90, 0xe9, 0x41, \n0xf0, 0x04, 0x51, 0xe0, 0x00, 0x20, 0x5c, 0xff, 0x00, 0x41, 0xe8, 0x3b, 0xf1, 0x05, 0x50, 0x40, \n0x80, 0x20, 0x5c, 0xf2, 0x00, 0x41, 0xe8, 0x35, 0x44, 0x70, 0x03, 0xe8, 0x42, 0x21, 0x9c, 0x24, \n0x04, 0x8f, 0x80, 0x03, 0x44, 0x50, 0x59, 0x88, 0x42, 0x80, 0x80, 0x75, 0x40, 0x01, 0x18, 0x96, \n0x42, 0x84, 0x14, 0x24, 0x42, 0x41, 0x98, 0x24, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8e, 0x08, \n0x46, 0x30, 0x00, 0x0d, 0x58, 0x31, 0x8e, 0x04, 0x51, 0xe0, 0x7c, 0x18, 0x40, 0x24, 0x10, 0xd6, \n0x50, 0x70, 0x03, 0xe8, 0x40, 0x6f, 0x20, 0x08, 0x40, 0x43, 0x1c, 0xf6, 0x50, 0x11, 0x00, 0x0c, \n0xb6, 0x45, 0xb6, 0x83, 0xe6, 0x39, 0xe9, 0x03, 0x84, 0x20, 0xb6, 0x25, 0x9c, 0xe7, 0xe6, 0x6f, \n0xe9, 0x15, 0x84, 0x00, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x04, 0xb6, 0x06, 0xd5, 0x0e, \n0x87, 0xc0, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8e, 0x08, 0x46, 0x40, 0x00, 0x0d, 0x58, 0x42, \n0x0e, 0x04, 0x15, 0xe2, 0x80, 0x00, 0x15, 0xe2, 0x00, 0x00, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, \n0x00, 0x78, 0x84, 0x23, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x50, 0x2f, 0x80, 0x3c, 0x44, 0x10, \n0x00, 0x9f, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf5, 0x0f, \n0x44, 0x00, 0x00, 0x9f, 0x58, 0x12, 0x80, 0x07, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x37, 0x44, 0x00, \n0x00, 0x9e, 0xdd, 0x26, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x04, 0xb4, 0x80, 0x44, 0x00, \n0x00, 0x9f, 0x54, 0x12, 0x00, 0x3f, 0xdd, 0x26, 0x44, 0x10, 0x00, 0x35, 0x44, 0x00, 0x00, 0x9e, \n0xdd, 0x26, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8e, 0x08, 0xb4, 0x61, 0x44, 0x00, 0x00, 0x9f, \n0x54, 0x11, 0x80, 0x3f, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0x9e, 0xdd, 0x26, 0x44, 0x00, \n0x00, 0x9f, 0x84, 0x20, 0xdd, 0x26, 0xf2, 0x02, 0x4e, 0x23, 0x00, 0x9e, 0x46, 0x60, 0x04, 0x10, \n0x47, 0xe0, 0x00, 0x92, 0x58, 0x63, 0x05, 0x0c, 0x59, 0xef, 0x00, 0x18, 0x15, 0xe3, 0x00, 0x00, \n0xf1, 0x02, 0x92, 0x00, 0x84, 0x47, 0x9c, 0x49, 0x4c, 0x11, 0x7f, 0xfd, 0x46, 0x30, 0x04, 0x10, \n0x46, 0x10, 0x00, 0x92, 0x58, 0x31, 0x85, 0x0c, 0x58, 0x10, 0x80, 0x08, 0xb6, 0x23, 0x84, 0x00, \n0x92, 0x00, 0x84, 0x87, 0x9c, 0x01, 0x4c, 0x02, 0x7f, 0xfd, 0x46, 0x00, 0x04, 0x10, 0x46, 0x50, \n0x00, 0x92, 0x58, 0x00, 0x05, 0x0c, 0xb6, 0xa0, 0x84, 0x00, 0x92, 0x00, 0x84, 0xc7, 0x9c, 0x01, \n0x4c, 0x03, 0x7f, 0xfd, 0xf1, 0x10, 0x46, 0x60, 0x00, 0x06, 0x58, 0x63, 0x00, 0x78, 0x44, 0x00, \n0x00, 0x17, 0xdd, 0x26, 0xf1, 0x11, 0x84, 0x04, 0xdd, 0x26, 0x84, 0x20, 0x44, 0x00, 0x00, 0xf4, \n0xdd, 0x26, 0x44, 0x10, 0x00, 0x15, 0x50, 0x2f, 0x80, 0x3c, 0x84, 0x00, 0x46, 0xf0, 0x00, 0x05, \n0x58, 0xf7, 0x8e, 0xf8, 0xdd, 0x2f, 0xf3, 0x0f, 0x44, 0x00, 0x00, 0x15, 0x58, 0x21, 0x80, 0x01, \n0xf2, 0x8f, 0x80, 0x22, 0xdd, 0x26, 0x84, 0x00, 0xd5, 0x0a, 0x92, 0x00, 0x87, 0xc7, 0x9c, 0x49, \n0x4c, 0x1f, 0x7f, 0xfd, 0x9c, 0x01, 0x84, 0x2a, 0x4c, 0x00, 0x80, 0x04, 0x84, 0x20, 0xd5, 0xf6, \n0xf3, 0x0f, 0x44, 0x00, 0x00, 0x15, 0x54, 0x21, 0x80, 0xfe, 0x80, 0x22, 0xf2, 0x8f, 0x46, 0xf0, \n0x00, 0x06, 0x58, 0xf7, 0x80, 0x78, 0xdd, 0x2f, 0x46, 0x40, 0x04, 0x10, 0x58, 0x42, 0x05, 0x04, \n0x84, 0x20, 0xb6, 0x24, 0x46, 0x50, 0x04, 0x10, 0xf6, 0x09, 0x58, 0x52, 0x85, 0x0c, 0xb6, 0xc5, \n0x46, 0x60, 0x00, 0x05, 0x58, 0x63, 0x0e, 0x70, 0xf0, 0x07, 0xb6, 0x04, 0x84, 0x04, 0xf2, 0x19, \n0xdd, 0x26, 0xf2, 0x18, 0x44, 0x10, 0x00, 0x13, 0x84, 0x04, 0xdd, 0x26, 0xf2, 0x17, 0x44, 0x10, \n0x00, 0x11, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x16, 0x44, 0x10, 0x00, 0x12, 0x84, 0x05, 0xdd, 0x26, \n0xf2, 0x15, 0x44, 0x10, 0x00, 0x13, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x14, 0x44, 0x10, 0x00, 0x14, \n0x84, 0x05, 0xdd, 0x26, 0xf2, 0x13, 0x84, 0x23, 0x84, 0x05, 0xdd, 0x26, 0xf2, 0x12, 0x84, 0x05, \n0x84, 0x24, 0xdd, 0x26, 0xec, 0x6c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, \n0xef, 0xfc, 0x96, 0x49, 0xe6, 0x24, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x61, 0xb4, 0x20, 0x84, 0xa5, \n0xd1, 0x2c, 0xe4, 0x26, 0xe8, 0x09, 0x84, 0xa3, 0xd1, 0x17, 0xe4, 0x24, 0xe8, 0x1b, 0x84, 0x01, \n0x4c, 0x10, 0x40, 0x55, 0xd5, 0x0b, 0x84, 0x47, 0x4c, 0x11, 0x00, 0x3b, 0xe0, 0x22, 0xe9, 0x26, \n0x84, 0xa8, 0xd1, 0x3e, 0x84, 0xa9, 0xd1, 0x45, 0xd5, 0x49, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, \n0x85, 0xe8, 0xdd, 0x2f, 0xd5, 0x43, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x80, 0xd0, 0xdd, 0x2f, \n0xd5, 0x3d, 0x9c, 0x44, 0x05, 0xe0, 0x80, 0x00, 0x54, 0x0f, 0x00, 0x01, 0x46, 0xf0, 0x00, 0x08, \n0x58, 0xf7, 0x84, 0x4c, 0xdd, 0x2f, 0xd5, 0x32, 0x9c, 0xc4, 0xb4, 0x43, 0x96, 0x14, 0x46, 0xf0, \n0x00, 0x08, 0x58, 0xf7, 0x8c, 0x14, 0xdd, 0x2f, 0xd5, 0x29, 0x9c, 0x04, 0x05, 0xe0, 0x00, 0x00, \n0xb4, 0x20, 0xb4, 0x80, 0x40, 0x50, 0xa0, 0x09, 0x54, 0x0f, 0x00, 0xff, 0x96, 0x68, 0x42, 0x22, \n0x40, 0x0b, 0x46, 0xf0, 0x00, 0x07, 0x58, 0xf7, 0x82, 0x78, 0xdd, 0x2f, 0xd5, 0x17, 0x9c, 0x84, \n0xb4, 0x02, 0x46, 0xf0, 0x00, 0x06, 0x58, 0xf7, 0x8a, 0x38, 0xdd, 0x2f, 0xd5, 0x0f, 0x9d, 0x04, \n0xb4, 0x64, 0x96, 0x1c, 0x46, 0xf0, 0x00, 0x09, 0x58, 0xf7, 0x84, 0xcc, 0xdd, 0x2f, 0xd5, 0x06, \n0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8f, 0xbc, 0xdd, 0x2f, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, \n0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xc4, 0x84, 0xa1, 0x46, 0x40, 0x00, 0x0d, \n0x58, 0x42, 0x0e, 0x3a, 0x84, 0x60, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x3b, 0xaf, 0x60, \n0x46, 0x60, 0x04, 0x00, 0xae, 0xc0, 0x58, 0x63, 0x02, 0x14, 0x05, 0xc3, 0x00, 0x00, 0x45, 0xef, \n0xef, 0xff, 0x40, 0xae, 0x78, 0x02, 0xb7, 0x46, 0x46, 0x70, 0x04, 0x00, 0x58, 0x73, 0x84, 0x18, \n0xb5, 0x27, 0x44, 0x6f, 0xff, 0x7f, 0x40, 0x84, 0x98, 0x02, 0xb7, 0x07, 0x46, 0x30, 0x04, 0x00, \n0x58, 0x31, 0x82, 0x58, 0xb4, 0xa3, 0x46, 0x7f, 0x0f, 0xff, 0x58, 0x73, 0x8f, 0xff, 0x47, 0xe0, \n0xa0, 0x00, 0x54, 0xa0, 0x80, 0xff, 0x40, 0x12, 0x9c, 0x02, 0x40, 0x40, 0xf8, 0x04, 0x84, 0x05, \n0xb6, 0x83, 0x4c, 0xa0, 0x41, 0x64, 0x47, 0xc0, 0x04, 0x10, 0x15, 0xcf, 0x80, 0x04, 0x47, 0xe0, \n0x0c, 0x2d, 0x15, 0xef, 0x80, 0x01, 0x05, 0xef, 0x80, 0x04, 0x46, 0x00, 0x04, 0x10, 0x59, 0xef, \n0x07, 0x20, 0x15, 0xef, 0x80, 0x04, 0x05, 0xef, 0x80, 0x01, 0x58, 0x00, 0x00, 0x80, 0x59, 0xef, \n0x0f, 0xc0, 0x15, 0xef, 0x80, 0x01, 0x46, 0x10, 0x04, 0x10, 0x05, 0xe0, 0x00, 0x00, 0x58, 0x10, \n0x80, 0xc0, 0x15, 0xef, 0x80, 0x0b, 0x46, 0x50, 0x04, 0x10, 0x05, 0xe0, 0x80, 0x00, 0x58, 0x52, \n0x80, 0x04, 0x15, 0xef, 0x80, 0x0a, 0x46, 0x60, 0x04, 0x10, 0x05, 0xe2, 0x80, 0x00, 0x58, 0x63, \n0x07, 0x08, 0x15, 0xef, 0x80, 0x09, 0x46, 0x90, 0x04, 0x10, 0x05, 0xe3, 0x00, 0x00, 0x58, 0x94, \n0x80, 0x20, 0x15, 0xef, 0x80, 0x08, 0x46, 0x30, 0x04, 0x10, 0x05, 0xe4, 0x80, 0x00, 0x58, 0x31, \n0x80, 0x78, 0x15, 0xef, 0x80, 0x07, 0x46, 0x4f, 0x02, 0x10, 0x05, 0xe1, 0x80, 0x00, 0x15, 0xef, \n0x80, 0x06, 0x05, 0xef, 0x80, 0x04, 0x46, 0x7f, 0xf0, 0x00, 0x05, 0xef, 0x00, 0x00, 0x46, 0x80, \n0x04, 0x10, 0x47, 0xc0, 0x18, 0x00, 0x15, 0xef, 0x80, 0x05, 0x58, 0x84, 0x00, 0x3c, 0xb6, 0x80, \n0x44, 0x40, 0x00, 0x10, 0x44, 0x00, 0x00, 0xc8, 0x59, 0xce, 0x00, 0x80, 0xb6, 0xe1, 0xb6, 0x85, \n0xb6, 0x06, 0x15, 0xc4, 0x00, 0x00, 0x47, 0xe0, 0x00, 0x0d, 0x59, 0xef, 0x0d, 0x78, 0xf7, 0x01, \n0x84, 0xc1, 0xb6, 0xe9, 0xb6, 0xde, 0xf2, 0x82, 0xf3, 0x83, 0x46, 0x70, 0x00, 0x04, 0x58, 0x73, \n0x83, 0x40, 0x80, 0x0a, 0xdd, 0x27, 0x46, 0x10, 0x0c, 0x2d, 0x58, 0x10, 0x8f, 0x80, 0xb6, 0x29, \n0x46, 0x28, 0x00, 0x00, 0xf5, 0x03, 0xb6, 0x45, 0x46, 0x00, 0x19, 0xc0, 0xf3, 0x04, 0x84, 0x84, \n0x58, 0x00, 0x00, 0x80, 0xb6, 0x83, 0x46, 0x60, 0x19, 0xc0, 0xb6, 0x08, 0x58, 0x63, 0x00, 0x90, \n0x80, 0x0a, 0xdd, 0x27, 0xb6, 0xc8, 0x84, 0x0a, 0xdd, 0x27, 0x46, 0x10, 0x19, 0x40, 0x58, 0x10, \n0x80, 0x90, 0xb6, 0x28, 0x84, 0x0a, 0xdd, 0x27, 0x46, 0x20, 0x18, 0x40, 0x58, 0x21, 0x00, 0x90, \n0xb6, 0x48, 0x84, 0x0a, 0xdd, 0x27, 0x46, 0x00, 0x04, 0x00, 0xf2, 0x02, 0x58, 0x00, 0x00, 0x88, \n0xb4, 0x20, 0xc2, 0x09, 0x46, 0x3f, 0xf0, 0x00, 0x40, 0x60, 0x8c, 0x02, 0x98, 0x96, 0x42, 0x81, \n0x7c, 0x08, 0xb7, 0x00, 0x64, 0x00, 0x00, 0x00, 0x84, 0x00, 0x46, 0x40, 0x00, 0x0d, 0x58, 0x42, \n0x0e, 0x3a, 0x46, 0x80, 0x00, 0x0d, 0x58, 0x84, 0x0e, 0x3b, 0xae, 0x20, 0x46, 0x30, 0x04, 0x00, \n0x10, 0x04, 0x00, 0x00, 0x58, 0x31, 0x82, 0x14, 0xb4, 0x23, 0x47, 0xe0, 0x04, 0x00, 0x58, 0x50, \n0x90, 0x00, 0xb6, 0xa3, 0x59, 0xef, 0x04, 0x18, 0xb4, 0xde, 0x46, 0x80, 0x04, 0x10, 0x46, 0x70, \n0x19, 0x40, 0x58, 0x84, 0x00, 0x3c, 0x58, 0x23, 0x00, 0x80, 0x58, 0x73, 0x80, 0x90, 0xb6, 0x5e, \n0xb6, 0xe8, 0x44, 0x00, 0x08, 0x98, 0x46, 0x70, 0x00, 0x04, 0x58, 0x73, 0x83, 0x40, 0x4b, 0xe0, \n0x1c, 0x01, 0x46, 0x40, 0x19, 0xc0, 0x58, 0x42, 0x00, 0x90, 0xb6, 0x88, 0x84, 0x0a, 0x4b, 0xe0, \n0x1c, 0x01, 0x46, 0x00, 0x19, 0x80, 0x46, 0x50, 0x04, 0x10, 0x46, 0x10, 0x0c, 0x0d, 0x58, 0x00, \n0x00, 0x90, 0x58, 0x52, 0x80, 0x20, 0x58, 0x10, 0x8f, 0xc0, 0xb6, 0x08, 0x46, 0x80, 0x04, 0x00, \n0xb6, 0x25, 0x58, 0x84, 0x00, 0x20, 0x84, 0xc0, 0xb4, 0xa8, 0x46, 0x30, 0x04, 0x00, 0xf5, 0x8d, \n0xf2, 0x0d, 0x84, 0x04, 0x41, 0xe1, 0x0c, 0x02, 0x4f, 0xe3, 0x00, 0x0a, 0x4b, 0xe0, 0x1c, 0x01, \n0x44, 0x10, 0x07, 0xd1, 0x4c, 0x60, 0x80, 0x04, 0x9d, 0xb1, 0xd5, 0xef, 0x46, 0x70, 0x04, 0x10, \n0x46, 0x60, 0x0c, 0x0d, 0x58, 0x73, 0x80, 0x20, 0x58, 0x63, 0x0f, 0xc8, 0xb6, 0xc7, 0x46, 0x70, \n0x04, 0x00, 0x58, 0x73, 0x80, 0x20, 0x84, 0xc0, 0x46, 0x80, 0x00, 0x04, 0x58, 0x84, 0x03, 0x40, \n0xb4, 0x67, 0x46, 0x20, 0x08, 0x00, 0xf3, 0x8d, 0x05, 0xef, 0x80, 0x0d, 0x84, 0x04, 0x40, 0x4f, \n0x08, 0x02, 0xcc, 0x09, 0x4b, 0xe0, 0x20, 0x01, 0x44, 0x00, 0x0b, 0xb9, 0x4c, 0x60, 0x00, 0x04, \n0x9d, 0xb1, 0xd5, 0xef, 0x46, 0x70, 0x04, 0x10, 0x58, 0x73, 0x80, 0x3c, 0x84, 0x20, 0xb6, 0x27, \n0x46, 0x80, 0x04, 0x10, 0x05, 0xef, 0x80, 0x0b, 0x58, 0x84, 0x00, 0x80, 0x15, 0xe4, 0x00, 0x00, \n0x46, 0x60, 0x04, 0x10, 0xf7, 0x0a, 0x58, 0x63, 0x00, 0xc0, 0xb6, 0xe6, 0x46, 0x50, 0x04, 0x10, \n0xf6, 0x09, 0x58, 0x52, 0x80, 0x04, 0xb6, 0xc5, 0x46, 0x40, 0x04, 0x10, 0xf7, 0x08, 0x58, 0x42, \n0x07, 0x08, 0xb6, 0xe4, 0x46, 0x30, 0x04, 0x10, 0x05, 0xef, 0x80, 0x07, 0x58, 0x31, 0x80, 0x20, \n0x15, 0xe1, 0x80, 0x00, 0x46, 0x20, 0x04, 0x10, 0xf3, 0x06, 0x58, 0x21, 0x00, 0x78, 0xb6, 0x62, \n0x46, 0x00, 0x04, 0x10, 0xf4, 0x05, 0x58, 0x00, 0x07, 0x20, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, \n0x8d, 0x78, 0xb6, 0x80, 0xb6, 0x25, 0x48, 0x00, 0x01, 0x34, 0x51, 0xc5, 0x7f, 0xff, 0x54, 0x9e, \n0x00, 0xff, 0xe7, 0x24, 0x4e, 0xf2, 0x01, 0x2d, 0x46, 0x40, 0x04, 0x00, 0x58, 0x42, 0x00, 0x64, \n0x46, 0x60, 0x04, 0x00, 0xb4, 0xa4, 0x58, 0x63, 0x00, 0x38, 0x46, 0x31, 0x00, 0x00, 0xb4, 0x26, \n0x44, 0x0f, 0xe0, 0x00, 0x40, 0x82, 0x8c, 0x02, 0x40, 0x40, 0x80, 0x02, 0x4e, 0x82, 0x00, 0x05, \n0x58, 0x42, 0x00, 0x13, 0xd5, 0x03, 0x58, 0x42, 0x00, 0x27, 0x46, 0x80, 0x04, 0x00, 0x58, 0x84, \n0x00, 0x38, 0xb6, 0x88, 0x46, 0x70, 0x04, 0x00, 0x58, 0x73, 0x82, 0x08, 0xb5, 0x07, 0x05, 0xc3, \n0x80, 0x00, 0x45, 0xef, 0xef, 0x37, 0x40, 0x9e, 0x78, 0x02, 0xb7, 0x27, 0xe7, 0x43, 0xe9, 0x13, \n0x46, 0x50, 0x04, 0x00, 0x58, 0x52, 0x80, 0x80, 0xb4, 0xc5, 0x44, 0x1f, 0xff, 0xef, 0x40, 0x33, \n0x04, 0x02, 0xb6, 0x65, 0x84, 0x05, 0xf2, 0x82, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x83, 0x40, \n0xdd, 0x2f, 0xf2, 0x02, 0x47, 0xc0, 0x04, 0x00, 0x46, 0x60, 0x04, 0x00, 0x59, 0xce, 0x00, 0xc0, \n0x58, 0x63, 0x00, 0x80, 0xb5, 0x3c, 0xb4, 0xe6, 0x84, 0x3d, 0x40, 0x43, 0x84, 0x02, 0xb6, 0x86, \n0x84, 0x05, 0xb4, 0xbc, 0x41, 0xe2, 0x84, 0x02, 0x15, 0xee, 0x00, 0x00, 0xf2, 0x82, 0x46, 0xf0, \n0x00, 0x04, 0x58, 0xf7, 0x83, 0x40, 0xdd, 0x2f, 0xb4, 0x46, 0x87, 0xde, 0x40, 0x31, 0x78, 0x02, \n0xb6, 0x66, 0x46, 0x10, 0x04, 0x00, 0xb4, 0xfc, 0x58, 0x10, 0x82, 0x14, 0x40, 0x73, 0xf8, 0x02, \n0xb6, 0xfc, 0x46, 0x20, 0x04, 0x00, 0xb4, 0x81, 0x58, 0x21, 0x02, 0x58, 0x42, 0x02, 0x3c, 0x08, \n0xb6, 0x01, 0x46, 0x6f, 0x0f, 0xff, 0xb4, 0xa2, 0x58, 0x63, 0x0f, 0xff, 0x47, 0xc0, 0xa0, 0x00, \n0x40, 0x42, 0x98, 0x02, 0x40, 0x02, 0x70, 0x04, 0xb6, 0x02, 0x46, 0x30, 0x04, 0x00, 0xf2, 0x02, \n0x58, 0x31, 0x80, 0x88, 0xb4, 0x83, 0xc2, 0x0c, 0x46, 0x7f, 0xf0, 0x00, 0x40, 0x62, 0x1c, 0x02, \n0x47, 0xe8, 0x00, 0x00, 0x41, 0xc1, 0x18, 0x00, 0x40, 0x0e, 0x78, 0x04, 0xb6, 0x03, 0x47, 0xc0, \n0x04, 0x00, 0x59, 0xce, 0x00, 0x80, 0xb4, 0x3c, 0x46, 0x50, 0x04, 0x00, 0x58, 0x30, 0x80, 0x40, \n0xb6, 0x7c, 0x58, 0x52, 0x80, 0x04, 0xb4, 0xc5, 0x84, 0x1b, 0x40, 0x43, 0x00, 0x02, 0xb6, 0x85, \n0x46, 0x30, 0x04, 0x00, 0x58, 0x31, 0x80, 0x20, 0xb4, 0x23, 0x46, 0x00, 0x04, 0x00, 0x58, 0x50, \n0x90, 0x00, 0xb6, 0xa3, 0x58, 0x00, 0x00, 0x3c, 0xb4, 0xdc, 0x46, 0x1f, 0x00, 0x00, 0x58, 0x43, \n0x00, 0x20, 0xb6, 0x9c, 0xb4, 0x60, 0x84, 0xa3, 0x40, 0x31, 0x84, 0x02, 0x4c, 0xa2, 0x80, 0x0d, \n0x87, 0x84, 0x4c, 0xae, 0x00, 0x06, 0x84, 0xa2, 0x4c, 0xa2, 0xc0, 0x0f, 0xd5, 0x09, 0x44, 0x70, \n0xef, 0x01, 0x98, 0xdf, 0xd5, 0x0c, 0x45, 0xe0, 0xe3, 0x01, 0x88, 0x7e, 0xd5, 0x08, 0x44, 0x40, \n0xc0, 0x01, 0x98, 0xdc, 0xd5, 0x04, 0x44, 0x60, 0x80, 0x01, 0x98, 0xde, 0x46, 0x10, 0x04, 0x00, \n0x58, 0x10, 0x80, 0x3c, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8e, 0x38, 0x84, 0x00, 0xb6, 0x61, \n0xae, 0x28, 0xa6, 0xe8, 0xcb, 0x04, 0x64, 0x00, 0x00, 0x20, 0xd5, 0xfc, 0x44, 0x60, 0x03, 0xe8, \n0x40, 0x21, 0x18, 0x77, 0x46, 0x50, 0x00, 0x0d, 0x58, 0x52, 0x8d, 0x68, 0xb4, 0xc5, 0x46, 0x40, \n0x04, 0x00, 0x58, 0x42, 0x02, 0x14, 0x47, 0xc0, 0x04, 0x00, 0x59, 0xce, 0x04, 0x18, 0x98, 0xd6, \n0xb6, 0x65, 0xb4, 0x24, 0x58, 0x00, 0x90, 0x00, 0xb6, 0x04, 0xb4, 0xbc, 0x58, 0x22, 0x80, 0x80, \n0xb6, 0x5c, 0xe7, 0x43, 0xe9, 0x09, 0x47, 0xc0, 0x04, 0x00, 0x59, 0xce, 0x00, 0x80, 0xb4, 0x9c, \n0x58, 0x02, 0x00, 0x10, 0xb6, 0x1c, 0x47, 0xc0, 0x04, 0x00, 0x59, 0xce, 0x00, 0x80, 0xb4, 0x1c, \n0x46, 0x20, 0x04, 0x00, 0x58, 0x10, 0x00, 0x02, 0xb6, 0x3c, 0x58, 0x21, 0x00, 0xc0, 0xb4, 0x7c, \n0x46, 0x10, 0x04, 0x00, 0x58, 0x51, 0x80, 0x01, 0xb6, 0xbc, 0xb7, 0x22, 0x58, 0x10, 0x80, 0x20, \n0xb4, 0x01, 0x44, 0x4f, 0xef, 0xff, 0x40, 0x30, 0x10, 0x02, 0xb6, 0x61, 0x46, 0x20, 0x04, 0x00, \n0xb4, 0x9c, 0x46, 0x10, 0x04, 0x00, 0x44, 0x5f, 0xff, 0xdf, 0x58, 0x21, 0x00, 0x3c, 0x40, 0x02, \n0x14, 0x02, 0x58, 0x10, 0x82, 0x08, 0x84, 0x60, 0xb6, 0x1c, 0xb6, 0x62, 0xb7, 0x01, 0x84, 0x60, \n0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x3a, 0x46, 0x10, 0x00, 0x0d, 0x58, 0x10, 0x8e, 0x3b, \n0xae, 0xc0, 0x46, 0x40, 0x04, 0x00, 0xae, 0xc8, 0x58, 0x42, 0x00, 0x20, 0xb4, 0xa4, 0x58, 0x22, \n0x80, 0x40, 0xb6, 0x44, 0xec, 0x3c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, \n0xef, 0xf8, 0x46, 0x70, 0x04, 0x00, 0x58, 0x73, 0x82, 0x14, 0x84, 0xc0, 0x44, 0x30, 0x80, 0x06, \n0xb5, 0x07, 0xb6, 0xc7, 0xb6, 0x67, 0x96, 0x48, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x09, 0x58, 0xf7, \n0x8c, 0xd4, 0xdd, 0x2f, 0xb7, 0x07, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x07, 0x81, 0x88, 0x84, 0xa1, \n0xd8, 0x29, 0xf6, 0x81, 0x46, 0x70, 0x00, 0x05, 0x58, 0x73, 0x8e, 0x70, 0x84, 0x24, 0x84, 0x4a, \n0x80, 0x06, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x25, 0x44, 0x20, 0x00, 0x20, 0x80, 0x06, 0x4b, 0xe0, \n0x1c, 0x01, 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8d, 0xb8, 0xdd, 0x2f, 0xf5, 0x01, 0x80, 0x06, 0x58, 0x42, 0x80, 0x80, 0xf4, 0x81, 0x80, 0x44, \n0x84, 0x24, 0x4b, 0xe0, 0x1c, 0x01, 0x84, 0x02, 0x46, 0xf0, 0x00, 0x02, 0x58, 0xf7, 0x8b, 0x1c, \n0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, \n0x96, 0x49, 0xe6, 0x28, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x7c, 0x80, 0x60, 0xa2, 0x99, 0x44, 0x40, \n0x00, 0x30, 0xb4, 0x23, 0x4c, 0x22, 0x40, 0x06, 0x80, 0x02, 0x96, 0x48, 0x84, 0x40, 0xd5, 0x3d, \n0x44, 0x50, 0x00, 0x32, 0xda, 0x40, 0x87, 0xc1, 0x46, 0xf0, 0x00, 0x0d, 0x11, 0xe7, 0x8e, 0x39, \n0x50, 0x30, 0x00, 0x08, 0x50, 0x20, 0x00, 0x0c, 0x84, 0x01, 0xb4, 0x83, 0xb4, 0x62, 0x4c, 0x10, \n0x00, 0x64, 0x84, 0xa2, 0xd9, 0x04, 0x44, 0x00, 0x00, 0xc8, 0xd5, 0x12, 0x84, 0x03, 0x4c, 0x10, \n0x00, 0x0e, 0x84, 0xa4, 0xd1, 0x0b, 0x56, 0x60, 0x80, 0x05, 0x45, 0xe0, 0x15, 0x7c, 0x84, 0xa0, \n0x40, 0x02, 0x98, 0x1b, 0x40, 0x0f, 0x18, 0x1a, 0xd5, 0x03, 0x44, 0x00, 0x07, 0xd0, 0x47, 0xe0, \n0x04, 0x11, 0x04, 0x2f, 0x00, 0x49, 0x44, 0x50, 0x03, 0xe8, 0x43, 0xe1, 0x94, 0x24, 0x95, 0x56, \n0x50, 0x22, 0xd1, 0x20, 0x50, 0x3f, 0x7c, 0x18, 0x42, 0x21, 0x90, 0x73, 0x9a, 0x90, 0x4e, 0x27, \n0x00, 0x38, 0x96, 0x48, 0x44, 0x00, 0x00, 0x32, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, 0x82, 0x9c, \n0xdd, 0x2f, 0xd5, 0x2e, 0x44, 0x10, 0x00, 0x33, 0x4c, 0x20, 0xc0, 0x08, 0x84, 0x20, 0x46, 0x00, \n0x00, 0x0d, 0x58, 0x00, 0x0e, 0x39, 0xd5, 0x23, 0x44, 0x50, 0x00, 0x34, 0xda, 0x18, 0x50, 0x40, \n0x00, 0x08, 0xb4, 0x43, 0x51, 0xe0, 0x00, 0x10, 0xb4, 0x64, 0x50, 0x10, 0x00, 0x0c, 0xb4, 0x01, \n0x46, 0x50, 0x00, 0x0e, 0x58, 0x52, 0x81, 0x88, 0xb4, 0x1e, 0x84, 0x01, 0xa8, 0xea, 0xae, 0x28, \n0xae, 0xac, 0x46, 0x60, 0x04, 0x11, 0x04, 0x03, 0x00, 0x49, 0xd5, 0x0a, 0x9d, 0x4a, 0xd2, 0x02, \n0xd5, 0x07, 0x84, 0x20, 0x46, 0x00, 0x00, 0x0e, 0x58, 0x00, 0x01, 0x88, 0xae, 0x40, 0x84, 0x00, \n0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x84, 0x02, 0xd5, 0xb3, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, \n0xef, 0xf4, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, \n0x46, 0xf0, 0x00, 0x0d, 0x04, 0x17, 0x83, 0xca, 0x54, 0x70, 0x80, 0x02, 0xc7, 0x04, 0x42, 0x10, \n0x80, 0x09, 0x84, 0xe1, 0xf0, 0x01, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, 0x0e, 0x74, 0x14, 0x13, \n0x00, 0x2d, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, 0xc7, 0x07, 0x80, 0x06, \n0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0x2c, 0xdd, 0x2f, 0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, \n0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, 0x46, 0x60, 0x00, 0x0d, 0x58, 0x63, \n0x0e, 0x74, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x70, 0xdd, 0x2f, \n0x04, 0x73, 0x00, 0x2d, 0xf0, 0x01, 0x97, 0xfc, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, \n0xdd, 0x2f, 0xc7, 0x07, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xb0, 0xdd, 0x2f, \n0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x46, 0x60, \n0x00, 0x0d, 0x58, 0x63, 0x0e, 0x74, 0x50, 0x0f, 0x80, 0x04, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, \n0x8a, 0x70, 0xdd, 0x2f, 0x04, 0x33, 0x00, 0x2d, 0xf0, 0x01, 0x84, 0x40, 0xb6, 0x7f, 0x14, 0x23, \n0x00, 0x2d, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0x84, 0xdd, 0x2f, 0xb4, 0x3f, 0x96, 0x0c, \n0xc0, 0x07, 0x80, 0x06, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, 0x88, 0xb0, 0xdd, 0x2f, 0xb4, 0xbf, \n0x54, 0x42, 0x80, 0x02, 0xc4, 0x0a, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x88, 0x2c, 0xdd, 0x2f, 0xb4, 0x1f, 0x41, 0xe0, 0x3c, 0x08, 0x41, 0xef, \n0x7c, 0x09, 0x4f, 0xe2, 0x00, 0x0b, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x46, 0xf0, \n0x00, 0x03, 0x58, 0xf7, 0x8a, 0x08, 0xdd, 0x2f, 0xb4, 0x7f, 0x40, 0x21, 0xb8, 0x08, 0x92, 0x5f, \n0xc2, 0x0a, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x46, 0xf0, 0x00, 0x03, 0x58, 0xf7, \n0x89, 0x24, 0xdd, 0x2f, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, \n0xef, 0xfc, 0x44, 0x00, 0x02, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8a, 0xd8, 0xdd, 0x2f, \n0x46, 0x30, 0x04, 0x00, 0xb4, 0x43, 0x44, 0x50, 0x76, 0x10, 0x40, 0x01, 0x40, 0x09, 0xd8, 0x07, \n0x80, 0xe3, 0x04, 0x53, 0x80, 0x41, 0x42, 0x42, 0xd0, 0x0b, 0xc4, 0x23, 0x46, 0xf0, 0x00, 0x0b, \n0x00, 0x87, 0x81, 0x63, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x07, 0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, \n0x8e, 0xf8, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0e, 0x00, 0x07, 0x80, 0xc8, 0xc8, 0x12, 0x46, 0xf0, \n0x00, 0x0d, 0x01, 0xe7, 0x8d, 0x7c, 0x84, 0xa1, 0x4d, 0xe2, 0xc0, 0x0c, 0x46, 0xf0, 0x00, 0x0b, \n0x00, 0x17, 0x80, 0x1c, 0x80, 0x40, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, 0x82, 0x9c, 0xdd, 0x2f, \n0x46, 0xf0, 0x00, 0x04, 0x58, 0xf7, 0x81, 0x78, 0xdd, 0x2f, 0x46, 0xf0, 0x00, 0x0a, 0x58, 0xf7, \n0x84, 0xd8, 0xdd, 0x2f, 0x46, 0xa0, 0x00, 0x00, 0x58, 0xa5, 0x03, 0x24, 0x46, 0xf0, 0x00, 0x01, \n0x58, 0xf7, 0x8a, 0xc4, 0xdd, 0x2f, 0x46, 0x90, 0x00, 0x02, 0x58, 0x94, 0x88, 0x30, 0x46, 0x70, \n0x00, 0x00, 0x58, 0x73, 0x83, 0x68, 0x46, 0x80, 0x00, 0x02, 0x58, 0x84, 0x00, 0x40, 0xd5, 0x20, \n0x4b, 0xe0, 0x28, 0x01, 0x00, 0x10, 0x00, 0x14, 0x80, 0xc0, 0xc9, 0x0f, 0x80, 0x20, 0x46, 0x00, \n0x00, 0x0d, 0x58, 0x00, 0x0e, 0x74, 0x4b, 0xe0, 0x20, 0x01, 0xc8, 0x12, 0x80, 0x26, 0x46, 0x00, \n0x00, 0x0d, 0x58, 0x00, 0x0e, 0x64, 0xd5, 0x0a, 0x84, 0xa1, 0xd9, 0x0a, 0x4b, 0xe0, 0x24, 0x01, \n0x80, 0x26, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0e, 0x54, 0x4b, 0xe0, 0x1c, 0x01, 0x46, 0xf0, \n0x00, 0x0d, 0x04, 0x57, 0x83, 0xcd, 0x46, 0x00, 0x00, 0x0d, 0x58, 0x00, 0x0f, 0x2c, 0xcd, 0xd9, \n0x46, 0xf0, 0x00, 0x0d, 0x04, 0x07, 0x83, 0x8f, 0x44, 0x20, 0x03, 0xe8, 0x40, 0x20, 0x0b, 0xd6, \n0x4f, 0xe3, 0x00, 0x07, 0x46, 0x10, 0x04, 0x00, 0x9c, 0xd1, 0x14, 0x30, 0x80, 0x8e, 0x46, 0x10, \n0x00, 0x0d, 0x9d, 0x01, 0x14, 0x40, 0x83, 0x8f, 0x5e, 0xf0, 0x13, 0x89, 0xe9, 0x04, 0x84, 0xa0, \n0x14, 0x50, 0x83, 0x8f, 0x46, 0xf0, 0x00, 0x0d, 0x05, 0xe7, 0x83, 0xca, 0x4f, 0xe3, 0x00, 0x09, \n0x44, 0x00, 0x02, 0x00, 0x46, 0xf0, 0x00, 0x05, 0x58, 0xf7, 0x8b, 0x1c, 0xdd, 0x2f, 0xec, 0x04, \n0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x4b, 0x00, 0x00, 0x6c, 0x46, 0x00, 0x00, \n0xa8, 0x41, 0x00, 0x00, 0x78, 0x45, 0x00, 0x00, 0xa8, 0x41, 0x00, 0x00, 0x74, 0x43, 0x00, 0x00, \n0xd8, 0x49, 0x00, 0x00, 0xa8, 0x41, 0x00, 0x00, 0x94, 0x4b, 0x00, 0x00, 0x3c, 0x45, 0x00, 0x00, \n0x74, 0x4b, 0x00, 0x00, 0x24, 0x45, 0x00, 0x00, 0xa8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x01, 0x99, 0x99, 0x09, 0x50, 0x02, 0x46, 0x44, 0x0a, 0x50, 0x03, 0xec, 0xee, 0x0a, 0x50, 0x04, \n0x99, 0x99, 0x0b, 0x50, 0x05, 0x46, 0x44, 0x08, 0x51, 0x06, 0xec, 0xee, 0x08, 0x51, 0x07, 0x99, \n0x99, 0x09, 0x51, 0x08, 0x46, 0x44, 0x0a, 0x51, 0x09, 0xec, 0xee, 0x0a, 0x51, 0x0a, 0x99, 0x99, \n0x0b, 0x51, 0x0b, 0x46, 0x44, 0x08, 0x52, 0x0c, 0xec, 0xee, 0x08, 0x52, 0x0d, 0x99, 0x99, 0x09, \n0x52, 0x0e, 0x33, 0x33, 0x0b, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, \n0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, \n0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x30, 0x34, 0x38, \n0x3c, 0x40, 0x44, 0x60, 0x64, 0x68, 0x6c, 0x70, 0x74, 0x78, 0x7c, 0x00, 0x24, 0x25, 0x26, 0x27, \n0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, \n0x16, 0x14, 0x12, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x14, 0x18, 0x1c, 0x00, 0x00, \n0x20, 0x21, 0x22, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x0f, 0xac, 0x00, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x03, 0x00, \n0x00, 0xf8, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x88, 0x8e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, \n0x86, 0xdd, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x05, 0xff, 0x00, 0x00, \n0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x8f, 0x14, 0x01, 0x76, 0x01, 0x00, 0x01, 0x02, \n0x03, 0x01, 0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x05, 0x0f, 0x0c, 0x00, \n0x01, 0x07, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x09, 0x02, 0x4a, 0x00, 0x01, 0x01, 0x00, 0xa0, \n0x50, 0x09, 0x04, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x00, 0x07, 0x05, 0x84, 0x02, 0x00, 0x02, \n0x00, 0x07, 0x05, 0x85, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x08, 0x02, 0x00, 0x02, 0x00, 0x07, \n0x05, 0x04, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x05, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x06, \n0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x07, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x09, 0x02, 0x00, \n0x02, 0x00, 0x09, 0x04, 0x01, 0x00, 0x05, 0xff, 0xff, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, \n0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x00, 0x02, 0x00, 0x07, 0x05, 0x02, 0x02, 0x00, 0x02, 0x00, \n0x07, 0x05, 0x83, 0x01, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x01, 0x40, 0x00, 0x00, 0x04, 0x03, \n0x09, 0x04, 0x12, 0x03, 0x4d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x61, 0x00, 0x54, 0x00, \n0x65, 0x00, 0x6b, 0x00, 0x1c, 0x03, 0x38, 0x00, 0x30, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x31, 0x00, \n0x31, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x57, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x4e, 0x00, \n0x08, 0x03, 0x31, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x18, 0x5a, 0x00, 0x00, 0x1c, 0x5a, 0x00, 0x00, \n0x20, 0x5a, 0x00, 0x00, 0x24, 0x5a, 0x00, 0x00, 0x28, 0x5a, 0x00, 0x00, 0x2c, 0x5a, 0x00, 0x00, \n0x30, 0x5a, 0x00, 0x00, 0x34, 0x5a, 0x00, 0x00, 0x38, 0x5a, 0x00, 0x00, 0x3c, 0x5a, 0x00, 0x00, \n0x40, 0x5a, 0x00, 0x00, 0x44, 0x5a, 0x00, 0x00, 0x48, 0x5a, 0x00, 0x00, 0x4c, 0x5a, 0x00, 0x00, \n0x50, 0x5a, 0x00, 0x00, 0x54, 0x5a, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0xb1, 0x00, 0x00, 0x00, \n0x40, 0x76, 0x00, 0x01, } ;\n"
  },
  {
    "path": "src/include/misc.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2009, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tmisc.h\n\n\tAbstract:\n\n\tHandling Misc Problem\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tSean Wang\t2009-08-12\t\tCreate\n\tJohn Li\t\t2009-12-23\t\tModified\n*/\n\n\n"
  },
  {
    "path": "src/include/misc_cmm.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2009, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tmisc_cmm.h\n\n\tAbstract:\n\n\tHandling Misc Problem\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tSean Wang\t2009-08-12\t\tCreate\n\tJohn Li\t\t2009-12-23\t\tModified\n*/\n\n\n"
  },
  {
    "path": "src/include/mlme.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tmlme.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn Chang\t2003-08-28\t\tCreated\n\tJohn Chang  2004-09-06      modified for RT2600\n\t\n*/\n#ifndef __MLME_H__\n#define __MLME_H__\n\n#include \"rtmp_dot11.h\"\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n#include \"wpa_cmm.h\"\n\n\n/* maximum supported capability information - */\n/* ESS, IBSS, Privacy, Short Preamble, Spectrum mgmt, Short Slot */\n#define SUPPORTED_CAPABILITY_INFO   0x0533\n\n#define END_OF_ARGS                 -1\n#define LFSR_MASK                   0x80000057\n#define MLME_TASK_EXEC_INTV         100/*200*/       /* */\n#ifdef RT3290\n#define LEAD_TIME                   7\n#else\n#define LEAD_TIME                   5\n#endif /* RT3290 */\n\n#define MLME_TASK_EXEC_MULTIPLE       10  /*5*/       /* MLME_TASK_EXEC_MULTIPLE * MLME_TASK_EXEC_INTV = 1 sec */\n#define REORDER_EXEC_INTV         \t100       /* 0.1 sec */\n#ifdef RTMP_MAC_USB\n#ifdef CONFIG_STA_SUPPORT\n#define STAY_10_SECONDS_AWAKE        100/* */\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n/*#define TBTT_PRELOAD_TIME         384        // usec. LomgPreamble + 24-byte at 1Mbps */\n\n/* The definition of Radar detection duration region */\n#define CE\t\t0\n#define FCC\t\t1\n#define JAP\t\t2\n#define JAP_W53\t3\n#define JAP_W56\t4\n#define MAX_RD_REGION 5\n\n#define BEACON_LOST_TIME            4 * OS_HZ    /* 2048 msec = 2 sec */\n\n#define DLS_TIMEOUT                 1200      /* unit: msec */\n#define AUTH_TIMEOUT                300       /* unit: msec */\n#define ASSOC_TIMEOUT               300       /* unit: msec */\n#define JOIN_TIMEOUT                2000        /* unit: msec */\n#define SHORT_CHANNEL_TIME          90        /* unit: msec */\n#define MIN_CHANNEL_TIME            110        /* unit: msec, for dual band scan */\n#define MAX_CHANNEL_TIME            140       /* unit: msec, for single band scan */\n#define\tFAST_ACTIVE_SCAN_TIME\t    30 \t\t  /* Active scan waiting for probe response time */\n#define CW_MIN_IN_BITS              4         /* actual CwMin = 2^CW_MIN_IN_BITS - 1 */\n#define AUTO_CHANNEL_SEL_TIMEOUT\t\t400\t\t/* uint: msec */\n#define LINK_DOWN_TIMEOUT           20000      /* unit: msec */\n#define AUTO_WAKEUP_TIMEOUT\t\t\t70\t\t\t/*unit: msec */\n\n#ifdef CONFIG_AP_SUPPORT \n#ifndef CONFIG_STA_SUPPORT\n#define CW_MAX_IN_BITS              6        /* actual CwMax = 2^CW_MAX_IN_BITS - 1 */\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifndef CONFIG_AP_SUPPORT\n#define CW_MAX_IN_BITS              10        /* actual CwMax = 2^CW_MAX_IN_BITS - 1 */\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\nextern UINT32 CW_MAX_IN_BITS;\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n/* Note: RSSI_TO_DBM_OFFSET has been changed to variable for new RF (2004-0720). */\n/* SHould not refer to this constant anymore */\n/*#define RSSI_TO_DBM_OFFSET          120 // for RT2530 RSSI-115 = dBm */\n#define RSSI_FOR_MID_TX_POWER       -55  /* -55 db is considered mid-distance */\n#define RSSI_FOR_LOW_TX_POWER       -45  /* -45 db is considered very short distance and */\n                                        /* eligible to use a lower TX power */\n#define RSSI_FOR_LOWEST_TX_POWER    -30\n/*#define MID_TX_POWER_DELTA          0   // 0 db from full TX power upon mid-distance to AP */\n#define LOW_TX_POWER_DELTA          6    /* -3 db from full TX power upon very short distance. 1 grade is 0.5 db */\n#define LOWEST_TX_POWER_DELTA       16   /* -8 db from full TX power upon shortest distance. 1 grade is 0.5 db */\n\n#define RSSI_TRIGGERED_UPON_BELOW_THRESHOLD     0\n#define RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD   1\n#define RSSI_THRESHOLD_FOR_ROAMING              25\n#define RSSI_DELTA                              5\n\n/* Channel Quality Indication */\n#define CQI_IS_GOOD(cqi)            ((cqi) >= 50)\n/*#define CQI_IS_FAIR(cqi)          (((cqi) >= 20) && ((cqi) < 50)) */\n#define CQI_IS_POOR(cqi)            (cqi < 50)  /*(((cqi) >= 5) && ((cqi) < 20)) */\n#define CQI_IS_BAD(cqi)             (cqi < 5)\n#define CQI_IS_DEAD(cqi)            (cqi == 0)\n\n/* weighting factor to calculate Channel quality, total should be 100% */\n#define RSSI_WEIGHTING                   50\n#define TX_WEIGHTING                     30\n#define RX_WEIGHTING                     20\n\n\n#define BSS_NOT_FOUND                    0xFFFFFFFF\n\n#ifdef CONFIG_AP_SUPPORT\n#ifndef CONFIG_STA_SUPPORT\n#define MAX_LEN_OF_MLME_QUEUE            20 /*10 */\n#endif\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#define MAX_LEN_OF_MLME_QUEUE            40 /*10 */\n#endif /* CONFIG_STA_SUPPORT */\n\nenum SCAN_MODE{\n\t/* Active scan, send probe request, and wait beacon and probe response */\n\tSCAN_ACTIVE = 0x00,\t\t\t/* all channels */\n\tSCAN_CISCO_ACTIVE = 0x1,\t/* single channel only */\n\tFAST_SCAN_ACTIVE = 0x2,\t\n#ifdef WSC_INCLUDED\n\tSCAN_WSC_ACTIVE = 0x3,\n#endif /* WSC_INCLUDED */\n#ifdef DOT11N_DRAFT3\n\tSCAN_2040_BSS_COEXIST = 0x4,\n#endif /* DOT11N_DRAFT3 */\n#ifdef P2P_SUPPORT\n\tSCAN_P2P = 0x5,\n\tSCAN_P2P_SEARCH = 0x6,\n#endif /* P2P_SUPPORT */\n\tSCAN_ACTIVE_MAX,\n\t\n\t/* Passive scan, no probe request, only wait beacon and probe response */\n\tSCAN_PASSIVE = 0x80,\t\t/* all channels */\n\tSCAN_CISCO_PASSIVE = 0x81,\t/* single channel only */\n\tSCAN_CISCO_NOISE = 0x82,\t/* single channel only, for noise histogram collection */\n\tSCAN_CISCO_CHANNEL_LOAD = 0x83,\t/* single channel only, for channel load collection */\n\tSCAN_PASSIVE_MAX,\n};\n\n#define SCAN_MASK\t0x80\n#define SCAN_MODE_ACT(_x)\t(((_x) & SCAN_MASK) == 0)\n#define SCAN_MODE_PSV(_x)\t(((_x) & SCAN_MASK) == SCAN_MASK)\n#define SCAN_MODE_VALID(_x)\t((SCAN_MODE_ACT(_x) && ((_x) < SCAN_ACTIVE_MAX)) ||\\\n\t\t\t\t\t\t\t\t(SCAN_MODE_PSV(_x) && ((_x) < SCAN_PASSIVE_MAX)))\n\n/*#define BSS_TABLE_EMPTY(x)             ((x).BssNr == 0) */\n#define MAC_ADDR_IS_GROUP(Addr)       (((Addr[0]) & 0x01))\n#define MAC_ADDR_HASH(Addr)            (Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5])\n#define MAC_ADDR_HASH_INDEX(Addr)      (MAC_ADDR_HASH(Addr) & (HASH_TABLE_SIZE - 1))\n#define TID_MAC_HASH(Addr,TID)            (TID^Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5])\n#define TID_MAC_HASH_INDEX(Addr,TID)      (TID_MAC_HASH(Addr,TID) & (HASH_TABLE_SIZE - 1))\n\n\n/* bit definition of the 2-byte pBEACON->Capability field */\n#define CAP_IS_ESS_ON(x)                 (((x) & 0x0001) != 0)\n#define CAP_IS_IBSS_ON(x)                (((x) & 0x0002) != 0)\n#define CAP_IS_CF_POLLABLE_ON(x)         (((x) & 0x0004) != 0)\n#define CAP_IS_CF_POLL_REQ_ON(x)         (((x) & 0x0008) != 0)\n#define CAP_IS_PRIVACY_ON(x)             (((x) & 0x0010) != 0)\n#define CAP_IS_SHORT_PREAMBLE_ON(x)      (((x) & 0x0020) != 0)\n#define CAP_IS_PBCC_ON(x)                (((x) & 0x0040) != 0)\n#define CAP_IS_AGILITY_ON(x)             (((x) & 0x0080) != 0)\n#define CAP_IS_SPECTRUM_MGMT(x)          (((x) & 0x0100) != 0)  /* 802.11e d9 */\n#define CAP_IS_QOS(x)                    (((x) & 0x0200) != 0)  /* 802.11e d9 */\n#define CAP_IS_SHORT_SLOT(x)             (((x) & 0x0400) != 0)\n#define CAP_IS_APSD(x)                   (((x) & 0x0800) != 0)  /* 802.11e d9 */\n#define CAP_IS_IMMED_BA(x)               (((x) & 0x1000) != 0)  /* 802.11e d9 */\n#define CAP_IS_DSSS_OFDM(x)              (((x) & 0x2000) != 0)\n#define CAP_IS_DELAY_BA(x)               (((x) & 0x4000) != 0)  /* 802.11e d9 */\n\n#define CAP_GENERATE(ess,ibss,priv,s_pre,s_slot,spectrum)  (((ess) ? 0x0001 : 0x0000) | ((ibss) ? 0x0002 : 0x0000) | ((priv) ? 0x0010 : 0x0000) | ((s_pre) ? 0x0020 : 0x0000) | ((s_slot) ? 0x0400 : 0x0000) | ((spectrum) ? 0x0100 : 0x0000))\n\n/*#define STA_QOS_CAPABILITY               0 // 1-byte. see 802.11e d9.0 for bit definition */\n\n#define ERP_IS_NON_ERP_PRESENT(x)        (((x) & 0x01) != 0)    /* 802.11g */\n#define ERP_IS_USE_PROTECTION(x)         (((x) & 0x02) != 0)    /* 802.11g */\n#define ERP_IS_USE_BARKER_PREAMBLE(x)    (((x) & 0x04) != 0)    /* 802.11g */\n\n#define DRS_TX_QUALITY_WORST_BOUND       8/* 3  // just test by gary */\n#define DRS_PENALTY                      8\n\n#define BA_NOTUSE \t2\n/*BA Policy subfiled value in ADDBA frame */\n#define IMMED_BA \t1\n#define DELAY_BA\t0\n\n/* BA Initiator subfield in DELBA frame */\n#define ORIGINATOR\t1\n#define RECIPIENT\t0\n\n/* ADDBA Status Code */\n#define ADDBA_RESULTCODE_SUCCESS\t\t\t\t\t0\n#define ADDBA_RESULTCODE_REFUSED\t\t\t\t\t37\n#define ADDBA_RESULTCODE_INVALID_PARAMETERS\t\t\t38\n\n/* DELBA Reason Code */\n#define DELBA_REASONCODE_QSTA_LEAVING\t\t\t\t36\n#define DELBA_REASONCODE_END_BA\t\t\t\t\t\t37\n#define DELBA_REASONCODE_UNKNOWN_BA\t\t\t\t\t38\n#define DELBA_REASONCODE_TIMEOUT\t\t\t\t\t39\n\n/* reset all OneSecTx counters */\n#ifdef FIFO_EXT_SUPPORT\n#define RESET_ONE_SEC_TX_CNT(__pEntry) \\\nif (((__pEntry)) != NULL) \\\n{ \\\n\t(__pEntry)->OneSecTxRetryOkCount = 0; \\\n\t(__pEntry)->OneSecTxFailCount = 0; \\\n\t(__pEntry)->OneSecTxNoRetryOkCount = 0; \\\n\t(__pEntry)->OneSecRxLGICount = 0; \\\n\t(__pEntry)->OneSecRxSGICount = 0; \\\n\t(__pEntry)->fifoTxSucCnt = 0;\\\n\t(__pEntry)->fifoTxRtyCnt = 0;\\\n}\n#else\n#define RESET_ONE_SEC_TX_CNT(__pEntry) \\\nif (((__pEntry)) != NULL) \\\n{ \\\n\t(__pEntry)->OneSecTxRetryOkCount = 0; \\\n\t(__pEntry)->OneSecTxFailCount = 0; \\\n\t(__pEntry)->OneSecTxNoRetryOkCount = 0; \\\n\t(__pEntry)->OneSecRxLGICount = 0; \\\n\t(__pEntry)->OneSecRxSGICount = 0; \\\n}\n#endif /* FIFO_EXT_SUPPORT */\n\n\n/*\n\t802.11 frame formats\n*/\n/*  HT Capability INFO field in HT Cap IE . */\ntypedef struct GNU_PACKED{\n#ifdef RT_BIG_ENDIAN\n\tUSHORT\tLSIGTxopProSup:1;\n\tUSHORT\tForty_Mhz_Intolerant:1;\n\tUSHORT\tPSMP:1;\n\tUSHORT\tCCKmodein40:1;\n\tUSHORT\tAMsduSize:1;\n\tUSHORT\tDelayedBA:1;\n\tUSHORT\tRxSTBC:2;\n\tUSHORT\tTxSTBC:1;\n\tUSHORT\tShortGIfor40:1;\n\tUSHORT\tShortGIfor20:1;\n\tUSHORT\tGF:1;\n\tUSHORT\tMimoPs:2;\n\tUSHORT\tChannelWidth:1;\n\tUSHORT\tAdvCoding:1;\n#else\n\tUSHORT\tAdvCoding:1;\n\tUSHORT\tChannelWidth:1;\n\tUSHORT\tMimoPs:2;\t\t/* mimo power safe */\n\tUSHORT\tGF:1;\t\t\t/* green field */\n\tUSHORT\tShortGIfor20:1;\n\tUSHORT\tShortGIfor40:1;\t/* for40MHz */\n\tUSHORT\tTxSTBC:1;\t\t/* 0:not supported,  1:if supported */\n\tUSHORT\tRxSTBC:2;\n\tUSHORT\tDelayedBA:1;\n\tUSHORT\tAMsduSize:1;\t/* only support as zero */\n\tUSHORT\tCCKmodein40:1;\n\tUSHORT\tPSMP:1;\n\tUSHORT\tForty_Mhz_Intolerant:1;\n\tUSHORT\tLSIGTxopProSup:1;\n#endif /* RT_BIG_ENDIAN */\n} HT_CAP_INFO, *PHT_CAP_INFO;\n\n\n/*  HT Capability INFO field in HT Cap IE . */\ntypedef struct GNU_PACKED _HT_CAP_PARM{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\trsv:3;/*momi power safe */\n\tUCHAR\tMpduDensity:3;\n\tUCHAR\tMaxRAmpduFactor:2;\n#else\n\tUCHAR\tMaxRAmpduFactor:2;\n\tUCHAR\tMpduDensity:3;\n\tUCHAR\trsv:3;/*momi power safe */\n#endif /* RT_BIG_ENDIAN */\n} HT_CAP_PARM, *PHT_CAP_PARM;\n\n\ntypedef struct GNU_PACKED _HT_MCS_SET_TX_SUBFIELD{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\tTxMCSSetDefined:1; \n\tUCHAR\tTxRxNotEqual:1;\n\tUCHAR\tTxMaxStream:2;\n\tUCHAR\tTxUnqualModulation:1;\n\tUCHAR\trsv:3;\n#else\n\tUCHAR\trsv:3;\n\tUCHAR\tTxUnqualModulation:1;\n\tUCHAR\tTxMaxStream:2;\n\tUCHAR\tTxRxNotEqual:1;\n\tUCHAR\tTxMCSSetDefined:1;\n#endif /* RT_BIG_ENDIAN */\n}HT_MCS_SET_TX_SUBFIELD, *PHT_MCS_SET_TX_SUBFIELD;\n\n\n/*  HT Capability INFO field in HT Cap IE . */\ntypedef struct GNU_PACKED _HT_MCS_SET{\n\tUCHAR\tMCSSet[10];\n\tUCHAR\tSupRate[2];  /* unit : 1Mbps */\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\trsv:3;\n\tUCHAR\tMpduDensity:1;\n\tUCHAR\tTxStream:2;\n\tUCHAR\tTxRxNotEqual:1;\n\tUCHAR\tTxMCSSetDefined:1; \n#else\n\tUCHAR\tTxMCSSetDefined:1; \n\tUCHAR\tTxRxNotEqual:1;\n\tUCHAR\tTxStream:2;\n\tUCHAR\tMpduDensity:1;\n\tUCHAR\trsv:3;\n#endif /* RT_BIG_ENDIAN */\n\tUCHAR\trsv3[3];  \n} HT_MCS_SET, *PHT_MCS_SET;\n\n/*  HT Capability INFO field in HT Cap IE . */\ntypedef struct GNU_PACKED _EXT_HT_CAP_INFO{\n#ifdef RT_BIG_ENDIAN \n\tUSHORT\trsv2:4;\n\tUSHORT\tRDGSupport:1;\t/*reverse Direction Grant  support */\n\tUSHORT\tPlusHTC:1;\t/*+HTC control field support */\n\tUSHORT\tMCSFeedback:2;\t/*0:no MCS feedback, 2:unsolicited MCS feedback, 3:Full MCS feedback,  1:rsv. */\n\tUSHORT\trsv:5;/*momi power safe */\n\tUSHORT\tTranTime:2;\n\tUSHORT\tPco:1;\n#else\n\tUSHORT\tPco:1;\n\tUSHORT\tTranTime:2;\n\tUSHORT\trsv:5;/*momi power safe */\n\tUSHORT\tMCSFeedback:2;\t/*0:no MCS feedback, 2:unsolicited MCS feedback, 3:Full MCS feedback,  1:rsv. */\n\tUSHORT\tPlusHTC:1;\t/*+HTC control field support */\n\tUSHORT\tRDGSupport:1;\t/*reverse Direction Grant  support */\n\tUSHORT\trsv2:4;\n#endif /* RT_BIG_ENDIAN */\n} EXT_HT_CAP_INFO, *PEXT_HT_CAP_INFO;\n\n/* HT Explicit Beamforming Feedback Capable */\n#define HT_ExBF_FB_CAP_NONE\t\t\t0\n#define HT_ExBF_FB_CAP_DELAYED\t\t1\n#define HT_ExBF_FB_CAP_IMMEDIATE\t\t2\n#define HT_ExBF_FB_CAP_BOTH\t\t\t3\n\n/* HT Beamforming field in HT Cap IE */\ntypedef struct GNU_PACKED _HT_BF_CAP{\n#ifdef RT_BIG_ENDIAN\n\tULONG\trsv:3;\n\tULONG\tChanEstimation:2;\n\tULONG\tCSIRowBFSup:2;\n\tULONG\tComSteerBFAntSup:2;\n\tULONG\tNoComSteerBFAntSup:2;\n\tULONG\tCSIBFAntSup:2;\n\tULONG\tMinGrouping:2;\n\tULONG\tExpComBF:2;\t\n\tULONG\tExpNoComBF:2;\n\tULONG\tExpCSIFbk:2;\n\tULONG\tExpComSteerCapable:1;\n\tULONG\tExpNoComSteerCapable:1;\n\tULONG\tExpCSICapable:1;\n\tULONG\tCalibration:2;\n\tULONG\tImpTxBFCapable:1;\n\tULONG\tTxNDPCapable:1;\t\n\tULONG\tRxNDPCapable:1;\t\n\tULONG\tTxSoundCapable:1;\n\tULONG\tRxSoundCapable:1;\n\tULONG\tTxBFRecCapable:1;\n#else\n\tULONG\tTxBFRecCapable:1;\n\tULONG\tRxSoundCapable:1;\n\tULONG\tTxSoundCapable:1;\n\tULONG\tRxNDPCapable:1;\t\n\tULONG\tTxNDPCapable:1;\t\n\tULONG\tImpTxBFCapable:1;\t\n\tULONG\tCalibration:2;\n\tULONG\tExpCSICapable:1;\n\tULONG\tExpNoComSteerCapable:1;\n\tULONG\tExpComSteerCapable:1;\n\tULONG\tExpCSIFbk:2;\t\n\tULONG\tExpNoComBF:2;\t\n\tULONG\tExpComBF:2;\t\n\tULONG\tMinGrouping:2;\n\tULONG\tCSIBFAntSup:2;\n\tULONG\tNoComSteerBFAntSup:2;\n\tULONG\tComSteerBFAntSup:2;\n\tULONG\tCSIRowBFSup:2;\n\tULONG\tChanEstimation:2;\n\tULONG\trsv:3;\n#endif /* RT_BIG_ENDIAN */\n} HT_BF_CAP, *PHT_BF_CAP;\n\n/*  HT antenna selection field in HT Cap IE . */\ntypedef struct GNU_PACKED _HT_AS_CAP{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\trsv:1;\n\tUCHAR\tTxSoundPPDU:1;\n\tUCHAR\tRxASel:1;\n\tUCHAR\tAntIndFbk:1;\n\tUCHAR\tExpCSIFbk:1;\n\tUCHAR\tAntIndFbkTxASEL:1;\n\tUCHAR\tExpCSIFbkTxASEL:1;\n\tUCHAR\tAntSelect:1; \n#else\n\tUCHAR\tAntSelect:1; \n\tUCHAR\tExpCSIFbkTxASEL:1;\n\tUCHAR\tAntIndFbkTxASEL:1;\n\tUCHAR\tExpCSIFbk:1;\n\tUCHAR\tAntIndFbk:1;\n\tUCHAR\tRxASel:1;\n\tUCHAR\tTxSoundPPDU:1;\n\tUCHAR\trsv:1;\n#endif /* RT_BIG_ENDIAN */\n} HT_AS_CAP, *PHT_AS_CAP;\n\n/* Draft 1.0 set IE length 26, but is extensible.. */\n#define SIZE_HT_CAP_IE\t\t26\n/* The structure for HT Capability IE. */\ntypedef struct GNU_PACKED _HT_CAPABILITY_IE{\n\tHT_CAP_INFO\t\tHtCapInfo;\n\tHT_CAP_PARM\t\tHtCapParm;\n/*\tHT_MCS_SET\t\tHtMCSSet; */\n\tUCHAR\t\t\tMCSSet[16];\n\tEXT_HT_CAP_INFO\tExtHtCapInfo;\n\tHT_BF_CAP\t\tTxBFCap;\t/* beamforming cap. rt2860c not support beamforming. */\n\tHT_AS_CAP\t\tASCap;\t/*antenna selection. */\n} HT_CAPABILITY_IE, *PHT_CAPABILITY_IE;\n\n\n/* 802.11n draft3 related structure definitions. */\n/* 7.3.2.60 */\n#define dot11OBSSScanPassiveDwell\t\t\t\t\t\t\t20\t/* in TU. min amount of time that the STA continously scans each channel when performing an active OBSS scan. */\n#define dot11OBSSScanActiveDwell\t\t\t\t\t\t\t10\t/* in TU.min amount of time that the STA continously scans each channel when performing an passive OBSS scan. */\n#define dot11BSSWidthTriggerScanInterval\t\t\t\t\t300  /* in sec. max interval between scan operations to be performed to detect BSS channel width trigger events. */\n#define dot11OBSSScanPassiveTotalPerChannel\t\t\t\t\t200\t/* in TU. min total amount of time that the STA scans each channel when performing a passive OBSS scan. */\n#define dot11OBSSScanActiveTotalPerChannel\t\t\t\t\t20\t/*in TU. min total amount of time that the STA scans each channel when performing a active OBSS scan */\n#define dot11BSSWidthChannelTransactionDelayFactor\t\t\t5\t/* min ratio between the delay time in performing a switch from 20MHz BSS to 20/40 BSS operation and the maximum */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/*\tinterval between overlapping BSS scan operations. */\n#define dot11BSSScanActivityThreshold\t\t\t\t\t\t25\t/* in %%, max total time that a STA may be active on the medium during a period of */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/*\t(dot11BSSWidthChannelTransactionDelayFactor * dot11BSSWidthTriggerScanInterval) seconds without */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/*\tbeing obligated to perform OBSS Scan operations. default is 25(== 0.25%) */\n\ntypedef struct GNU_PACKED _OVERLAP_BSS_SCAN_IE{\n\tUSHORT\t\tScanPassiveDwell;\n\tUSHORT\t\tScanActiveDwell;\n\tUSHORT\t\tTriggerScanInt;\t\t\t\t/* Trigger scan interval */\n\tUSHORT\t\tPassiveTalPerChannel;\t\t/* passive total per channel */\n\tUSHORT\t\tActiveTalPerChannel;\t\t/* active total per channel */\n\tUSHORT\t\tDelayFactor;\t\t\t\t/* BSS width channel transition delay factor */\n\tUSHORT\t\tScanActThre;\t\t\t\t/* Scan Activity threshold */\n}OVERLAP_BSS_SCAN_IE, *POVERLAP_BSS_SCAN_IE;\n\n\n/*  7.3.2.56. 20/40 Coexistence element used in  Element ID = 72 = IE_2040_BSS_COEXIST */\ntypedef union GNU_PACKED _BSS_2040_COEXIST_IE{\n struct GNU_PACKED {\n #ifdef RT_BIG_ENDIAN\n\tUCHAR\trsv:3;\n \tUCHAR\tObssScanExempGrant:1;\n\tUCHAR\tObssScanExempReq:1;\n\tUCHAR\tBSS20WidthReq:1;\n\tUCHAR\tIntolerant40:1;\t\n\tUCHAR\tInfoReq:1; \n #else\n\tUCHAR\tInfoReq:1;\n\tUCHAR\tIntolerant40:1;\t\t\t/* Inter-BSS. set 1 when prohibits a receiving BSS from operating as a 20/40 Mhz BSS. */\n\tUCHAR\tBSS20WidthReq:1;\t\t/* Intra-BSS set 1 when prohibits a receiving AP from operating its BSS as a 20/40MHz BSS. */\n\tUCHAR\tObssScanExempReq:1;\n\tUCHAR\tObssScanExempGrant:1;\n\tUCHAR\trsv:3;\n#endif /* RT_BIG_ENDIAN */\n    } field;\n UCHAR   word;\n} BSS_2040_COEXIST_IE, *PBSS_2040_COEXIST_IE;\n\n\ntypedef struct  _TRIGGER_EVENTA{\n\tBOOLEAN\t\t\tbValid;\t \n\tUCHAR\tBSSID[6];\t\n\tUCHAR\tRegClass;\t/* Regulatory Class */\n\tUSHORT\tChannel;\n} TRIGGER_EVENTA, *PTRIGGER_EVENTA;\n\n\n/* 20/40 trigger event table */\n/* If one Event A delete or created, or if Event B is detected or not detected, STA should send 2040BSSCoexistence to AP. */\n#define MAX_TRIGGER_EVENT\t\t64\ntypedef struct  _TRIGGER_EVENT_TAB{\n\tUCHAR\tEventANo;\t\n\tTRIGGER_EVENTA\tEventA[MAX_TRIGGER_EVENT];\t\n\tULONG\t\t\tEventBCountDown;\t/* Count down counter for Event B. */\n} TRIGGER_EVENT_TAB, *PTRIGGER_EVENT_TAB;\n\n\n/* 7.3.27 20/40 Bss Coexistence Mgmt capability used in extended capabilities information IE( ID = 127 = IE_EXT_CAPABILITY). */\n/*\tThis is the first octet and was defined in 802.11n D3.03 and 802.11yD9.0 */\ntypedef struct GNU_PACKED _EXT_CAP_INFO_ELEMENT{\n#ifdef RT_BIG_ENDIAN\n\t// TODO: shiang-6590, check the data structure format if this IE\n\tUINT32\trsv7:1;\n\tUINT32\tTDLSChSwitchSupport:1; /* bit30: TDLS Channel Switching */\n\tUINT32\tTDLSPeerPSMSupport:1; /* bit29: TDLS Peer PSM Support */\n\tUINT32\tUAPSDBufSTASupport:1; /* bit28: Peer U-APSD Buffer STA Support */\n\tUINT32\trsv6:1;\n\tUINT32\tDMSSupport:1;\n\tUINT32\trsv5:6;\n\tUINT32\tBssTransitionManmt:1;\n\tUINT32\trsv4:1;\n\tUINT32\tWNMSleepSupport:1;/*bit 17*/\n\tUINT32\tTFSSupport:1;/*bit 16*/\n\tUINT32\trsv3:4;\n\tUINT32\tFMSSupport:1;/*bit 11*/\n\tUINT32\trsv2:8;\n\tUINT32\tExtendChannelSwitch:1;\n\tUINT32\trsv:1;\n\tUINT32\tBssCoexistMgmtSupport:1;\n#else\n\tUINT32\tBssCoexistMgmtSupport:1;\n\tUINT32\trsv:1;\n\tUINT32\tExtendChannelSwitch:1;\n\tUINT32\trsv2:8;\n\tUINT32\tFMSSupport:1;/*bit 11*/\n\tUINT32\trsv3:4;\n\tUINT32\tTFSSupport:1;/*bit 16*/\n\tUINT32\tWNMSleepSupport:1;/*bit 17*/\n\tUINT32\trsv4:1;\n\tUINT32\tBssTransitionManmt:1;\n\tUINT32\trsv5:6;\n\tUINT32\tDMSSupport:1;\n\tUINT32\trsv6:1;\n\tUINT32\tUAPSDBufSTASupport:1; /* bit28: Peer U-APSD Buffer STA Support */\n\tUINT32\tTDLSPeerPSMSupport:1; /* bit29: TDLS Peer PSM Support */\n\tUINT32\tTDLSChSwitchSupport:1; /* bit30: TDLS Channel Switching */\n\tUINT32\trsv7:1;\n#endif /* RT_BIG_ENDIAN */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef RT_BIG_ENDIAN\n\tUINT8\tTDLSChSwitchProhibited:1; /* bit39: TDLS Channel Switching Prohibited */\n\tUINT8\tTDLSProhibited:1; /* bit38: TDLS Prohibited */\n\tUINT8\tTDLSSupport:1; /* bit37: TDLS Support */\n\tUINT8\trsv8:5;\n#else\n\tUINT8\trsv8:5;\n\tUINT8\tTDLSSupport:1; /* bit37: TDLS Support */\n\tUINT8\tTDLSProhibited:1; /* bit38: TDLS Prohibited */\n\tUINT8\tTDLSChSwitchProhibited:1; /* bit39: TDLS Channel Switching Prohibited */\n#endif // RT_BIG_ENDIAN //\n#endif /* DOT11Z_TDLS_SUPPORT */\n}EXT_CAP_INFO_ELEMENT, *PEXT_CAP_INFO_ELEMENT;\n\n\n/* 802.11n 7.3.2.61 */\ntypedef struct GNU_PACKED _BSS_2040_COEXIST_ELEMENT{\n\tUCHAR\t\t\t\t\tElementID;\t\t/* ID = IE_2040_BSS_COEXIST = 72 */\n\tUCHAR\t\t\t\t\tLen;\n\tBSS_2040_COEXIST_IE\t\tBssCoexistIe;\n}BSS_2040_COEXIST_ELEMENT, *PBSS_2040_COEXIST_ELEMENT;\n\n\n/*802.11n 7.3.2.59 */\ntypedef struct GNU_PACKED _BSS_2040_INTOLERANT_CH_REPORT{\n\tUCHAR\t\t\t\tElementID;\t\t/* ID = IE_2040_BSS_INTOLERANT_REPORT = 73 */\n\tUCHAR\t\t\t\tLen;\t\n\tUCHAR\t\t\t\tRegulatoryClass;\n\tUCHAR\t\t\t\tChList[0];\n}BSS_2040_INTOLERANT_CH_REPORT, *PBSS_2040_INTOLERANT_CH_REPORT;\n\n\n/* The structure for channel switch annoucement IE. This is in 802.11n D3.03 */\ntypedef struct GNU_PACKED _CHA_SWITCH_ANNOUNCE_IE{\n\tUCHAR\t\t\tSwitchMode;\t/*channel switch mode */\n\tUCHAR\t\t\tNewChannel;\t/* */\n\tUCHAR\t\t\tSwitchCount;\t/* */\n} CHA_SWITCH_ANNOUNCE_IE, *PCHA_SWITCH_ANNOUNCE_IE;\n\n\n/* The structure for channel switch annoucement IE. This is in 802.11n D3.03 */\ntypedef struct GNU_PACKED _SEC_CHA_OFFSET_IE{\n\tUCHAR\t\t\tSecondaryChannelOffset;\t /* 1: Secondary above, 3: Secondary below, 0: no Secondary */\n} SEC_CHA_OFFSET_IE, *PSEC_CHA_OFFSET_IE;\n\n\n/* This structure is extracted from struct RT_HT_CAPABILITY and RT_VHT_CAP */\ntypedef struct _RT_PHY_INFO{\n\tBOOLEAN\t\tbHtEnable;\t /* If we should use ht rate. */\n\tBOOLEAN\t\tbPreNHt;\t /* If we should use ht rate. */\n\t/*Substract from HT Capability IE */\n\tUCHAR\t\tMCSSet[16];\n#ifdef DOT11_VHT_AC\n\tBOOLEAN \tbVhtEnable;\n\tUCHAR \t\tvht_bw;\n\tVHT_MCS_SET vht_mcs_set;\n#endif /* DOT11_VHT_AC */\n} RT_PHY_INFO;\n\n\n#ifdef DOT11_VHT_AC\ntypedef struct _RT_VHT_CAP{\n\tUINT32 vht_bw:2;\n\tUINT32 vht_txstbc:1;\n\tUINT32 vht_rxstbc:3;\n\tUINT32 sgi_80m:1;\n\tUINT32 vht_htc:1;\n\n\tUINT32 vht_mcs_ss1:2;\n\tUINT32 vht_mcs_ss2:2;\n\tUINT32 vht_rx_rate:2;\n\tUINT32 vht_tx_rate:2;\n\n\tUINT32 rsv:16;\n}RT_VHT_CAP;\n#endif /* DOT11_VHT_AC */\n\n\n/*\n\tThis structure substracts ralink supports from all 802.11n-related features.\n\tFeatures not listed here but contained in 802.11n spec are not supported in rt2860\n*/\ntypedef struct {\n#ifdef RT_BIG_ENDIAN\n\tUSHORT\trsv:5;\n\tUSHORT\tAmsduSize:1;\t/* Max receiving A-MSDU size */\n\tUSHORT\tAmsduEnable:1;\t/* Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n */\n\tUSHORT\tRxSTBC:2;\n\tUSHORT\tTxSTBC:1;\n\tUSHORT\tShortGIfor40:1;\t/*for40MHz */\n\tUSHORT\tShortGIfor20:1;\n\tUSHORT\tGF:1;\t/*green field */\n\tUSHORT\tMimoPs:2;/*mimo power safe MMPS_ */\n\tUSHORT\tChannelWidth:1;\n#else\n\tUSHORT\tChannelWidth:1;\n\tUSHORT\tMimoPs:2;/*mimo power safe MMPS_ */\n\tUSHORT\tGF:1;\t/*green field */\n\tUSHORT\tShortGIfor20:1;\n\tUSHORT\tShortGIfor40:1;\t/*for 40MHz */\n\tUSHORT\tTxSTBC:1;\t/* 0:not supported,  1:if supported */\n\tUSHORT\tRxSTBC:2;\t/* 2 bits */\n\tUSHORT\tAmsduEnable:1;\t/* Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n */\n\tUSHORT\tAmsduSize:1;\t/* Max receiving A-MSDU size */\n\tUSHORT\trsv:5;\n#endif\n\n\t/*Substract from Addiont HT INFO IE */\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\tRecomWidth:1;\n\tUCHAR\tExtChanOffset:2;\t/* Please not the difference with following \tUCHAR\tNewExtChannelOffset; from 802.11n */\n\tUCHAR\tMpduDensity:3;\t\n\tUCHAR\tMaxRAmpduFactor:2;\n#else\n\tUCHAR\tMaxRAmpduFactor:2;\n\tUCHAR\tMpduDensity:3;\n\tUCHAR\tExtChanOffset:2;\t/* Please not the difference with following \tUCHAR\tNewExtChannelOffset; from 802.11n */\n\tUCHAR\tRecomWidth:1;\n#endif\n\n#ifdef RT_BIG_ENDIAN\n\tUSHORT\trsv2:11;\n\tUSHORT\tOBSS_NonHTExist:1;\n\tUSHORT\trsv3:1;\n\tUSHORT\tNonGfPresent:1;\n\tUSHORT\tOperaionMode:2;\n#else\n\tUSHORT\tOperaionMode:2;\n\tUSHORT\tNonGfPresent:1;\n\tUSHORT\trsv3:1;\n\tUSHORT\tOBSS_NonHTExist:1;\n\tUSHORT\trsv2:11;\n#endif\n\t\n\t/* New Extension Channel Offset IE */\n\tUCHAR\tNewExtChannelOffset;\t\n\t/* Extension Capability IE = 127 */\n\tUCHAR\tBSSCoexist2040;\t\n} RT_HT_CAPABILITY, *PRT_HT_CAPABILITY;\n\n\n/*   field in Addtional HT Information IE . */\ntypedef struct GNU_PACKED _ADD_HTINFO{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\tSerInterGranu:3;\n\tUCHAR\tS_PSMPSup:1;\n\tUCHAR\tRifsMode:1; \n\tUCHAR\tRecomWidth:1;\t\n\tUCHAR\tExtChanOffset:2;\n#else\n\tUCHAR\tExtChanOffset:2;\n\tUCHAR\tRecomWidth:1;\n\tUCHAR\tRifsMode:1; \n\tUCHAR\tS_PSMPSup:1;\t /*Indicate support for scheduled PSMP */\n\tUCHAR\tSerInterGranu:3;\t /*service interval granularity */\n#endif\n} ADD_HTINFO, *PADD_HTINFO;\n\n\ntypedef struct GNU_PACKED _ADD_HTINFO2{\n#ifdef RT_BIG_ENDIAN\n\tUSHORT\trsv2:11; \n\tUSHORT\tOBSS_NonHTExist:1;\n\tUSHORT\trsv:1;\n\tUSHORT\tNonGfPresent:1;\n\tUSHORT\tOperaionMode:2;\t\n#else\n\tUSHORT\tOperaionMode:2;\n\tUSHORT\tNonGfPresent:1;\n\tUSHORT\trsv:1; \n\tUSHORT\tOBSS_NonHTExist:1;\n\tUSHORT\trsv2:11; \n#endif\n} ADD_HTINFO2, *PADD_HTINFO2;\n\n\n/* TODO: Need sync with spec about the definition of StbcMcs. In Draft 3.03, it's reserved. */\ntypedef struct GNU_PACKED _ADD_HTINFO3{\n#ifdef RT_BIG_ENDIAN\n\tUSHORT\trsv:4;\n\tUSHORT\tPcoPhase:1;\n\tUSHORT\tPcoActive:1;\n\tUSHORT\tLsigTxopProt:1;\n\tUSHORT\tSTBCBeacon:1;\n\tUSHORT\tDualCTSProtect:1;\n\tUSHORT\tDualBeacon:1;\n\tUSHORT\tStbcMcs:6;\n#else\n\tUSHORT\tStbcMcs:6;\n\tUSHORT\tDualBeacon:1;\n\tUSHORT\tDualCTSProtect:1; \n\tUSHORT\tSTBCBeacon:1;\n\tUSHORT\tLsigTxopProt:1;\t/* L-SIG TXOP protection full support */\n\tUSHORT\tPcoActive:1; \n\tUSHORT\tPcoPhase:1; \n\tUSHORT\trsv:4; \n#endif /* RT_BIG_ENDIAN */\n} ADD_HTINFO3, *PADD_HTINFO3;\n\n#define SIZE_ADD_HT_INFO_IE\t\t22\ntypedef struct  GNU_PACKED _ADD_HT_INFO_IE{\n\tUCHAR\t\t\t\tControlChan;\n\tADD_HTINFO\t\t\tAddHtInfo;\n\tADD_HTINFO2\t\t\tAddHtInfo2;\t \n\tADD_HTINFO3\t\t\tAddHtInfo3;\t \n\tUCHAR\t\t\t\tMCSSet[16];\t\t/* Basic MCS set */\n} ADD_HT_INFO_IE, *PADD_HT_INFO_IE;\n\ntypedef struct  GNU_PACKED _NEW_EXT_CHAN_IE{\n\tUCHAR\t\t\t\tNewExtChanOffset;\n} NEW_EXT_CHAN_IE, *PNEW_EXT_CHAN_IE;\n\ntypedef struct GNU_PACKED _FRAME_802_11 {\n    HEADER_802_11   Hdr;\n    UCHAR            Octet[1];\n} FRAME_802_11, *PFRAME_802_11;\n\n/* QoSNull embedding of management action. When HT Control MA field set to 1. */\ntypedef struct GNU_PACKED _MA_BODY {\n    UCHAR            Category;\n    UCHAR            Action;\n    UCHAR            Octet[1];\n} MA_BODY, *PMA_BODY;\n\ntypedef\tstruct GNU_PACKED _HEADER_802_3\t{\n    UCHAR           DAAddr1[MAC_ADDR_LEN];\n    UCHAR           SAAddr2[MAC_ADDR_LEN];\n    UCHAR           Octet[2];\n} HEADER_802_3, *PHEADER_802_3;\n\n\n/* Block ACK related format */\n/* 2-byte BA Parameter  field  in \tDELBA frames to terminate an already set up bA */\ntypedef struct GNU_PACKED _DELBA_PARM{\n#ifdef RT_BIG_ENDIAN\n    USHORT      TID:4;\t/* value of TC os TS */\n    USHORT      Initiator:1;\t/* 1: originator    0:recipient */\n    USHORT      Rsv:11;\t/* always set to 0 */\n#else\n    USHORT      Rsv:11;\t/* always set to 0 */\n    USHORT      Initiator:1;\t/* 1: originator    0:recipient */\n    USHORT      TID:4;\t/* value of TC os TS */\n#endif /* RT_BIG_ENDIAN */\n} DELBA_PARM, *PDELBA_PARM;\n\n/* 2-byte BA Parameter Set field  in ADDBA frames to signal parm for setting up a BA */\ntypedef struct GNU_PACKED _BA_PARM{\n#ifdef RT_BIG_ENDIAN\n    USHORT      BufSize:10;\t/* number of buffe of size 2304 octetsr */\n    USHORT      TID:4;\t/* value of TC os TS */\n    USHORT      BAPolicy:1;\t/* 1: immediately BA    0:delayed BA */\n    USHORT      AMSDUSupported:1;\t/* 0: not permitted\t\t1: permitted */\n#else\n    USHORT      AMSDUSupported:1;\t/* 0: not permitted\t\t1: permitted */\n    USHORT      BAPolicy:1;\t/* 1: immediately BA    0:delayed BA */\n    USHORT      TID:4;\t/* value of TC os TS */\n    USHORT      BufSize:10;\t/* number of buffe of size 2304 octetsr */\n#endif /* RT_BIG_ENDIAN */\n} BA_PARM, *PBA_PARM;\n\n/* 2-byte BA Starting Seq CONTROL field */\ntypedef union GNU_PACKED _BASEQ_CONTROL{\n    struct GNU_PACKED {\n#ifdef RT_BIG_ENDIAN\n    USHORT      StartSeq:12;   /* sequence number of the 1st MSDU for which this BAR is sent */\n\tUSHORT      FragNum:4;\t/* always set to 0 */\n#else\n    USHORT      FragNum:4;\t/* always set to 0 */\n\tUSHORT      StartSeq:12;   /* sequence number of the 1st MSDU for which this BAR is sent */\n#endif /* RT_BIG_ENDIAN */\n    }   field;\n    USHORT           word;\n} BASEQ_CONTROL, *PBASEQ_CONTROL;\n\n/*BAControl and BARControl are the same */\n/* 2-byte BA CONTROL field in BA frame */\ntypedef struct GNU_PACKED _BA_CONTROL{\n#ifdef RT_BIG_ENDIAN\n    USHORT      TID:4;\n    USHORT      Rsv:9;\n    USHORT      Compressed:1;\n    USHORT      MTID:1;\t\t/*EWC V1.24 */\n    USHORT      ACKPolicy:1; /* only related to N-Delayed BA. But not support in RT2860b. 0:NormalACK  1:No ACK */\n#else\n    USHORT      ACKPolicy:1; /* only related to N-Delayed BA. But not support in RT2860b. 0:NormalACK  1:No ACK */\n    USHORT      MTID:1;\t\t/*EWC V1.24 */\n    USHORT      Compressed:1;\n    USHORT      Rsv:9;\n    USHORT      TID:4;\n#endif /* RT_BIG_ENDIAN */\n} BA_CONTROL, *PBA_CONTROL;\n\n/* 2-byte BAR CONTROL field in BAR frame */\ntypedef struct GNU_PACKED _BAR_CONTROL{\n#ifdef RT_BIG_ENDIAN\n    USHORT      TID:4;\n    USHORT      Rsv1:9;\n    USHORT      Compressed:1;\n    USHORT      MTID:1;\t\t/*if this bit1, use  FRAME_MTBA_REQ,  if 0, use FRAME_BA_REQ */\n    USHORT      ACKPolicy:1;\n#else\n    USHORT      ACKPolicy:1; /* 0:normal ack,  1:no ack. */\n    USHORT      MTID:1;\t\t/*if this bit1, use  FRAME_MTBA_REQ,  if 0, use FRAME_BA_REQ */\n    USHORT      Compressed:1;\n    USHORT      Rsv1:9;\n    USHORT      TID:4;\n#endif /* !RT_BIG_ENDIAN */\n} BAR_CONTROL, *PBAR_CONTROL;\n\n/* BARControl in MTBAR frame */\ntypedef struct GNU_PACKED _MTBAR_CONTROL{\n#ifdef RT_BIG_ENDIAN\n    USHORT      NumTID:4;\n    USHORT      Rsv1:9;\n    USHORT      Compressed:1;\n    USHORT      MTID:1;\t\t\n    USHORT      ACKPolicy:1;\n#else\n    USHORT      ACKPolicy:1;\n    USHORT      MTID:1;\t\t\n    USHORT      Compressed:1;\n    USHORT      Rsv1:9;\n    USHORT      NumTID:4;\n#endif /* RT_BIG_ENDIAN */\n} MTBAR_CONTROL, *PMTBAR_CONTROL;\n\ntypedef struct GNU_PACKED _PER_TID_INFO{\n#ifdef RT_BIG_ENDIAN\n    USHORT      TID:4;\n    USHORT      Rsv1:12;\n#else\n    USHORT      Rsv1:12;\n    USHORT      TID:4;\n#endif /* RT_BIG_ENDIAN */\n} PER_TID_INFO, *PPER_TID_INFO;\n\ntypedef struct {\n\tPER_TID_INFO      PerTID;\n\tBASEQ_CONTROL \t BAStartingSeq;\n} EACH_TID, *PEACH_TID;\n\n\n/* BAREQ AND MTBAREQ have the same subtype BAR, 802.11n BAR use compressed bitmap. */\ntypedef struct GNU_PACKED _FRAME_BA_REQ {\n\tFRAME_CONTROL   FC;\n\tUSHORT          Duration;\n\tUCHAR           Addr1[MAC_ADDR_LEN];\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tBAR_CONTROL  BARControl;\n\tBASEQ_CONTROL \t BAStartingSeq;\n}   FRAME_BA_REQ, *PFRAME_BA_REQ;\n\ntypedef struct GNU_PACKED _FRAME_MTBA_REQ {\n\tFRAME_CONTROL   FC;\n\tUSHORT          Duration;\n\tUCHAR           Addr1[MAC_ADDR_LEN];\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tMTBAR_CONTROL  MTBARControl;\n\tPER_TID_INFO\tPerTIDInfo;\n\tBASEQ_CONTROL \t BAStartingSeq;\n}   FRAME_MTBA_REQ, *PFRAME_MTBA_REQ;\n\n/* Compressed format is mandantory in HT STA */\ntypedef struct GNU_PACKED _FRAME_MTBA {\n\tFRAME_CONTROL   FC;\n\tUSHORT          Duration;\n\tUCHAR           Addr1[MAC_ADDR_LEN];\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tBA_CONTROL  BAControl;\n\tBASEQ_CONTROL \t BAStartingSeq;\n\tUCHAR\t\tBitMap[8];\n}   FRAME_MTBA, *PFRAME_MTBA;\n\ntypedef struct GNU_PACKED _FRAME_PSMP_ACTION {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n\tUCHAR\tPsmp;\t/* 7.3.1.25 */\n}   FRAME_PSMP_ACTION, *PFRAME_PSMP_ACTION;\n\ntypedef struct GNU_PACKED _FRAME_ACTION_HDR {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n}   FRAME_ACTION_HDR, *PFRAME_ACTION_HDR;\n\n/*Action Frame */\n/*Action Frame  Category:Spectrum,  Action:Channel Switch. 7.3.2.20 */\ntypedef struct GNU_PACKED _CHAN_SWITCH_ANNOUNCE {\n\tUCHAR\t\t\t\t\tElementID;\t/* ID = IE_CHANNEL_SWITCH_ANNOUNCEMENT = 37 */\n\tUCHAR\t\t\t\t\tLen;\n\tCHA_SWITCH_ANNOUNCE_IE\tCSAnnounceIe;\n}   CHAN_SWITCH_ANNOUNCE, *PCHAN_SWITCH_ANNOUNCE;\n\n\n/*802.11n : 7.3.2.20a */\ntypedef struct GNU_PACKED _SECOND_CHAN_OFFSET {\n\tUCHAR\t\t\t\tElementID;\t\t/* ID = IE_SECONDARY_CH_OFFSET = 62 */\n\tUCHAR\t\t\t\tLen;\n\tSEC_CHA_OFFSET_IE\tSecChOffsetIe;\n}   SECOND_CHAN_OFFSET, *PSECOND_CHAN_OFFSET;\n\n\ntypedef struct GNU_PACKED _FRAME_SPETRUM_CS {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n\tCHAN_SWITCH_ANNOUNCE\tCSAnnounce;\n\tSECOND_CHAN_OFFSET\t\tSecondChannel;\n}   FRAME_SPETRUM_CS, *PFRAME_SPETRUM_CS;\n\n\ntypedef struct GNU_PACKED _FRAME_ADDBA_REQ {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n\tUCHAR\tToken;\t/* 1 */\n\tBA_PARM\t\tBaParm;\t      /*  2 - 10 */\n\tUSHORT\t\tTimeOutValue;\t/* 0 - 0 */\n\tBASEQ_CONTROL\tBaStartSeq; /* 0-0 */\n}   FRAME_ADDBA_REQ, *PFRAME_ADDBA_REQ;\n\ntypedef struct GNU_PACKED _FRAME_ADDBA_RSP {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n\tUCHAR\tToken;\n\tUSHORT\tStatusCode;\n\tBA_PARM\t\tBaParm; /*0 - 2 */\n\tUSHORT\t\tTimeOutValue;\n}   FRAME_ADDBA_RSP, *PFRAME_ADDBA_RSP;\n\ntypedef struct GNU_PACKED _FRAME_DELBA_REQ {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n\tDELBA_PARM\t\tDelbaParm;\n\tUSHORT\tReasonCode;\n}   FRAME_DELBA_REQ, *PFRAME_DELBA_REQ;\n\n\n/*7.2.1.7 */\ntypedef struct GNU_PACKED _FRAME_BAR {\n\tFRAME_CONTROL   FC;\n\tUSHORT          Duration;\n\tUCHAR           Addr1[MAC_ADDR_LEN];\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tBAR_CONTROL\t\tBarControl;\n\tBASEQ_CONTROL\tStartingSeq;\n}   FRAME_BAR, *PFRAME_BAR;\n\n/*7.2.1.7 */\ntypedef struct GNU_PACKED _FRAME_BA {\n\tFRAME_CONTROL   FC;\n\tUSHORT          Duration;\n\tUCHAR           Addr1[MAC_ADDR_LEN];\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tBAR_CONTROL\t\tBarControl;\n\tBASEQ_CONTROL\tStartingSeq;\n\tUCHAR\t\tbitmask[8];\n}   FRAME_BA, *PFRAME_BA;\n\n\n/* Radio Measuement Request Frame Format */\ntypedef struct GNU_PACKED _FRAME_RM_REQ_ACTION {\n\tHEADER_802_11   Hdr;\n\tUCHAR\tCategory;\n\tUCHAR\tAction;\n\tUCHAR\tToken;\n\tUSHORT\tRepetition;\n\tUCHAR   data[0];\n}   FRAME_RM_REQ_ACTION, *PFRAME_RM_REQ_ACTION;\n\ntypedef struct GNU_PACKED _HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE{\n\tUCHAR\t\tID;\n\tUCHAR\t\tLength;\n\tUCHAR\t\tChannelSwitchMode;\n\tUCHAR\t\tNewRegClass;\n\tUCHAR\t\tNewChannelNum;\n\tUCHAR\t\tChannelSwitchCount;\n} HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE, *PHT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE;\n\n\n/* */\n/* _Limit must be the 2**n - 1 */\n/* _SEQ1 , _SEQ2 must be within 0 ~ _Limit */\n/* */\n#define SEQ_STEPONE(_SEQ1, _SEQ2, _Limit)\t((_SEQ1 == ((_SEQ2+1) & _Limit)))\n#define SEQ_SMALLER(_SEQ1, _SEQ2, _Limit)\t(((_SEQ1-_SEQ2) & ((_Limit+1)>>1)))\n#define SEQ_LARGER(_SEQ1, _SEQ2, _Limit)\t((_SEQ1 != _SEQ2) && !(((_SEQ1-_SEQ2) & ((_Limit+1)>>1))))\n#define SEQ_WITHIN_WIN(_SEQ1, _SEQ2, _WIN, _Limit) (SEQ_LARGER(_SEQ1, _SEQ2, _Limit) &&  \\\n\t\t\t\t\t\t\t\t\t\t\t\tSEQ_SMALLER(_SEQ1, ((_SEQ2+_WIN+1)&_Limit), _Limit))\n\n/* */\n/* Contention-free parameter (without ID and Length) */\n/* */\ntypedef struct GNU_PACKED _CF_PARM{\n    BOOLEAN     bValid;         /* 1: variable contains valid value */\n    UCHAR       CfpCount;\n    UCHAR       CfpPeriod;\n    USHORT      CfpMaxDuration;\n    USHORT      CfpDurRemaining;\n} CF_PARM, *PCF_PARM;\n\ntypedef\tstruct _CIPHER_SUITE {\n\tNDIS_802_11_ENCRYPTION_STATUS\tPairCipher;\t\t/* Unicast cipher 1, this one has more secured cipher suite */\n\tNDIS_802_11_ENCRYPTION_STATUS\tPairCipherAux;\t/* Unicast cipher 2 if AP announce two unicast cipher suite */\n\tNDIS_802_11_ENCRYPTION_STATUS\tGroupCipher;\t/* Group cipher */\n\tUSHORT\t\t\t\t\t\t\tRsnCapability;\t/* RSN capability from beacon */\n\tBOOLEAN\t\t\t\t\t\t\tbMixMode;\t\t/* Indicate Pair & Group cipher might be different */\n}\tCIPHER_SUITE, *PCIPHER_SUITE;\n\t\n\n/* EDCA configuration from AP's BEACON/ProbeRsp */\ntypedef struct {\n    BOOLEAN     bValid;         /* 1: variable contains valid value */\n    BOOLEAN     bAdd;         /* 1: variable contains valid value */\n    BOOLEAN     bQAck;\n    BOOLEAN     bQueueRequest;\n    BOOLEAN     bTxopRequest;\n    BOOLEAN     bAPSDCapable;\n/*  BOOLEAN     bMoreDataAck; */\n    UCHAR       EdcaUpdateCount;\n    UCHAR       Aifsn[4];       /* 0:AC_BK, 1:AC_BE, 2:AC_VI, 3:AC_VO */\n    UCHAR       Cwmin[4];\n    UCHAR       Cwmax[4];\n    USHORT      Txop[4];      /* in unit of 32-us */\n    BOOLEAN     bACM[4];      /* 1: Admission Control of AC_BK is mandattory */\n} EDCA_PARM, *PEDCA_PARM;\n\n/* QBSS LOAD information from QAP's BEACON/ProbeRsp */\ntypedef struct {\n    BOOLEAN     bValid;                     /* 1: variable contains valid value */\n    USHORT      StaNum;\n    UCHAR       ChannelUtilization;\n    USHORT      RemainingAdmissionControl;  /* in unit of 32-us */\n} QBSS_LOAD_PARM, *PQBSS_LOAD_PARM;\n\n/* QBSS Info field in QSTA's assoc req */\ntypedef struct GNU_PACKED _QBSS_STA_INFO_PARM{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\t\tRsv2:1;\n\tUCHAR\t\tMaxSPLength:2;\n\tUCHAR\t\tRsv1:1;\n\tUCHAR\t\tUAPSD_AC_BE:1;\n\tUCHAR\t\tUAPSD_AC_BK:1;\n\tUCHAR\t\tUAPSD_AC_VI:1;\n\tUCHAR\t\tUAPSD_AC_VO:1;\n#else\n    UCHAR\t\tUAPSD_AC_VO:1;\n\tUCHAR\t\tUAPSD_AC_VI:1;\n\tUCHAR\t\tUAPSD_AC_BK:1;\n\tUCHAR\t\tUAPSD_AC_BE:1;\n\tUCHAR\t\tRsv1:1;\n\tUCHAR\t\tMaxSPLength:2;\n\tUCHAR\t\tRsv2:1;\n#endif /* RT_BIG_ENDIAN */\n} QBSS_STA_INFO_PARM, *PQBSS_STA_INFO_PARM;\n\ntypedef struct {\n\tQBSS_STA_INFO_PARM\tQosInfo;\n\tUCHAR\tRsv;\n\tUCHAR\tQ_AC_BE[4];\n\tUCHAR\tQ_AC_BK[4];\n\tUCHAR\tQ_AC_VI[4];\n\tUCHAR\tQ_AC_VO[4];\n} QBSS_STA_EDCA_PARM, *PQBSS_STA_EDCA_PARM;\n\n/* QBSS Info field in QAP's Beacon/ProbeRsp */\ntypedef struct GNU_PACKED _QBSS_AP_INFO_PARM{\n#ifdef RT_BIG_ENDIAN\n\tUCHAR\t\tUAPSD:1;\n\tUCHAR\t\tRsv:3;\n    UCHAR\t\tParamSetCount:4;\n#else\n    UCHAR\t\tParamSetCount:4;\n\tUCHAR\t\tRsv:3;\n\tUCHAR\t\tUAPSD:1;\n#endif /* RT_BIG_ENDIAN */\n} QBSS_AP_INFO_PARM, *PQBSS_AP_INFO_PARM;\n\n/* QOS Capability reported in QAP's BEACON/ProbeRsp */\n/* QOS Capability sent out in QSTA's AssociateReq/ReAssociateReq */\ntypedef struct {\n    BOOLEAN     bValid;                     /* 1: variable contains valid value */\n    BOOLEAN     bQAck;\n    BOOLEAN     bQueueRequest;\n    BOOLEAN     bTxopRequest;\n/*  BOOLEAN     bMoreDataAck; */\n    UCHAR       EdcaUpdateCount;\n} QOS_CAPABILITY_PARM, *PQOS_CAPABILITY_PARM;\n\n#ifdef CONFIG_STA_SUPPORT\ntypedef struct {\n    UCHAR       IELen;\n    UCHAR       IE[MAX_CUSTOM_LEN];\n} WPA_IE_;\n#endif /* CONFIG_STA_SUPPORT */\n\n\ntypedef struct {\n    UCHAR   Bssid[MAC_ADDR_LEN];\n    UCHAR   Channel;\n\tUCHAR   CentralChannel;\t/*Store the wide-band central channel for 40MHz.  .used in 40MHz AP. Or this is the same as Channel. */\n    UCHAR   BssType;\n    USHORT  AtimWin;\n    USHORT  BeaconPeriod;\n\n    UCHAR   SupRate[MAX_LEN_OF_SUPPORTED_RATES];\n    UCHAR   SupRateLen;\n    UCHAR   ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n    UCHAR   ExtRateLen;\n\tHT_CAPABILITY_IE HtCapability;\n\tUCHAR\t\t\tHtCapabilityLen;\n\tADD_HT_INFO_IE AddHtInfo;\t/* AP might use this additional ht info IE */\n\tUCHAR\t\t\tAddHtInfoLen;\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\t/* this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. */\n\tUCHAR\t\t\tNewExtChanOffset;\n\tCHAR    Rssi;\n\n#ifdef DOT11_VHT_AC\n\tUCHAR vht_cap_len;\n\tUCHAR vht_op_len;\n\tVHT_CAP_IE vht_cap_ie;\n\tVHT_OP_IE vht_op_ie;\n#endif /* DOT11_VHT_AC */\n\n\n\tCHAR\tMinSNR;\t\n    UCHAR   Privacy;\t\t\t/* Indicate security function ON/OFF. Don't mess up with auth mode. */\n\tUCHAR\tHidden;\n\n    USHORT  DtimPeriod;\n    USHORT  CapabilityInfo;\n\n    USHORT  CfpCount;\n    USHORT  CfpPeriod;\n    USHORT  CfpMaxDuration;\n    USHORT  CfpDurRemaining;\n    UCHAR   SsidLen;\n    CHAR    Ssid[MAX_LEN_OF_SSID];\n    \n\tUCHAR\tSameRxTimeCount;\n\tULONG   LastBeaconRxTimeA; /* OS's timestamp */\n    ULONG   LastBeaconRxTime; /* OS's timestamp */\n\n\tBOOLEAN\tbSES;\n\n\t/* New for WPA2 */\n\tCIPHER_SUITE\t\t\t\t\tWPA;\t\t\t/* AP announced WPA cipher suite */\n\tCIPHER_SUITE\t\t\t\t\tWPA2;\t\t\t/* AP announced WPA2 cipher suite */\n#ifdef WAPI_SUPPORT\n\tCIPHER_SUITE\t\t\t\t\tWAPI;\t\t\t/* AP announced WAPI cipher suite */\n#endif /* WAPI_SUPPORT */\n\n\t/* New for microsoft WPA support */\n\tNDIS_802_11_FIXED_IEs\tFixIEs;\n\tNDIS_802_11_AUTHENTICATION_MODE\tAuthModeAux;\t/* Addition mode for WPA2 / WPA capable AP */\n\tNDIS_802_11_AUTHENTICATION_MODE\tAuthMode;\t\n\tNDIS_802_11_WEP_STATUS\tWepStatus;\t\t\t\t/* Unicast Encryption Algorithm extract from VAR_IE */\n\tUSHORT\t\t\t\t\tVarIELen;\t\t\t\t/* Length of next VIE include EID & Length */\n\tUCHAR\t\t\t\t\tVarIEs[MAX_VIE_LEN];\n\tUSHORT\t\t\t\t\tVarIeFromProbeRspLen;\n\tUCHAR\t\t\t\t\t*pVarIeFromProbRsp;\n\n\t/* CCX Ckip information */\n    UCHAR   CkipFlag;\n\n\t/* CCX 2 TSF */\n\tUCHAR\tPTSF[4];\t\t/* Parent TSF */\n\tUCHAR\tTTSF[8];\t\t/* Target TSF */\n\n    /* 802.11e d9, and WMM */\n\tEDCA_PARM           EdcaParm;\n\tQOS_CAPABILITY_PARM QosCapability;\n\tQBSS_LOAD_PARM      QbssLoad;\n\n#ifdef WSC_INCLUDED\n    UCHAR\t\tWpsAP;\t\t/* 0x00: not support WPS, 0x01: support normal WPS, 0x02: support Ralink auto WPS, 0x04: support WAC AP */\n\tUSHORT\t\tWscDPIDFromWpsAP;\n#endif /* WSC_INCLUDED */\n\n\n#ifdef CONFIG_STA_SUPPORT\n    WPA_IE_     WpaIE;\n    WPA_IE_     RsnIE;\n\tWPA_IE_ \tWpsIE;\n#ifdef WAPI_SUPPORT\n\tWPA_IE_     WapiIE;\n#endif /* WAPI_SUPPORT */\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tUCHAR\t\tCountryString[3];\n\tBOOLEAN\t\tbHasCountryIE;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* CONFIG_STA_SUPPORT */\n\n\tUCHAR   MacAddr[MAC_ADDR_LEN];\n\tULONG ClientStatusFlags;\n} BSS_ENTRY, *PBSS_ENTRY;\n\ntypedef struct {\n    UCHAR           BssNr;\n    UCHAR           BssOverlapNr;\n    BSS_ENTRY       BssEntry[MAX_LEN_OF_BSS_TABLE];\n} BSS_TABLE, *PBSS_TABLE;\n\n\ntypedef struct _MLME_QUEUE_ELEM {\n\tUCHAR             Msg[MGMT_DMA_BUFFER_SIZE];\t/* move here to fix alignment issue for ARM CPU */\n    ULONG             Machine;\n    ULONG             MsgType;\n    ULONG             MsgLen;\n    LARGE_INTEGER     TimeStamp;\n    UCHAR             Rssi0;\n    UCHAR             Rssi1;\n    UCHAR             Rssi2;\n    UCHAR             AntSel;\n    UCHAR             Signal;\n    UCHAR             Channel;\n    UCHAR             Wcid;\n    BOOLEAN           Occupied;\n\tUCHAR\t\t\t  OpMode;\n\tULONG             Priv;\n} MLME_QUEUE_ELEM, *PMLME_QUEUE_ELEM;\n\ntypedef struct _MLME_QUEUE {\n    ULONG             Num;\n    ULONG             Head;\n    ULONG             Tail;\n    NDIS_SPIN_LOCK   Lock;\n    MLME_QUEUE_ELEM  Entry[MAX_LEN_OF_MLME_QUEUE];\n} MLME_QUEUE, *PMLME_QUEUE;\n\ntypedef VOID (*STATE_MACHINE_FUNC)(VOID *pAd, MLME_QUEUE_ELEM *Elem);\n\ntypedef struct _STATE_MACHINE {\n    ULONG\t\t\t\tBase;\n    ULONG\t\t\t\tNrState;\n    ULONG\t\t\t\tNrMsg;\n    ULONG\t\t\t\tCurrState;\n    STATE_MACHINE_FUNC\t*TransFunc;\n} STATE_MACHINE, *PSTATE_MACHINE;\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\ntypedef VOID (*APCLI_STATE_MACHINE_FUNC)(VOID *pAd, MLME_QUEUE_ELEM *Elem, PULONG pCurrState, USHORT ifIndex);\n\ntypedef struct _STA_STATE_MACHINE {\n\tULONG                           Base;\n\tULONG                           NrState;\n\tULONG                           NrMsg;\n\tULONG                           CurrState;\n\tAPCLI_STATE_MACHINE_FUNC          *TransFunc;\n} APCLI_STATE_MACHINE, *PSTA_STATE_MACHINE;\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n/* MLME AUX data structure that hold temporarliy settings during a connection attempt. */\n/* Once this attemp succeeds, all settings will be copy to pAd->StaActive. */\n/* A connection attempt (user set OID, roaming, CCX fast roaming,..) consists of */\n/* several steps (JOIN, AUTH, ASSOC or REASSOC) and may fail at any step. We purposely */\n/* separate this under-trial settings away from pAd->StaActive so that once */\n/* this new attempt failed, driver can auto-recover back to the active settings. */\ntypedef struct _MLME_AUX {\n\tUCHAR               BssType;\n\tUCHAR               Ssid[MAX_LEN_OF_SSID];\n\tUCHAR               SsidLen;\n\tUCHAR               Bssid[MAC_ADDR_LEN];\n\tUCHAR\t\t\tAutoReconnectSsid[MAX_LEN_OF_SSID];\n\tUCHAR\t\t\tAutoReconnectSsidLen;\n\tUSHORT\t\t\tAlg;\n\tUCHAR\t\t\tScanType;\n\tUCHAR\t\t\tChannel;\n\tUCHAR               CentralChannel;\n\tUSHORT              Aid;\n\tUSHORT              CapabilityInfo;\n\tUSHORT              BeaconPeriod;\n\tUSHORT              CfpMaxDuration;\n\tUSHORT              CfpPeriod;\n\tUSHORT              AtimWin;\n    \n\t/* Copy supported rate from desired AP's beacon. We are trying to match */\n\t/* AP's supported and extended rate settings. */\n\tUCHAR\t\t        SupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t        ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t        SupRateLen;\n\tUCHAR\t\t        ExtRateLen;\n\tHT_CAPABILITY_IE\t\tHtCapability;\n\tUCHAR\t\t        \tHtCapabilityLen;\n\tADD_HT_INFO_IE\t\tAddHtInfo;\t/* AP might use this additional ht info IE */\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo; /* this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. */\n\tUCHAR\t\t\tNewExtChannelOffset;\n\t/*RT_HT_CAPABILITY\tSupportedHtPhy; */\n\n#ifdef DOT11_VHT_AC\n\tUCHAR vht_cap_len;\n\tUCHAR vht_op_len;\n\tVHT_CAP_IE vht_cap;\n\tVHT_OP_IE vht_op;\n#endif /* DOT11_VHT_AC */\n\n    /* new for QOS */\n    QOS_CAPABILITY_PARM APQosCapability;    /* QOS capability of the current associated AP */\n    EDCA_PARM           APEdcaParm;         /* EDCA parameters of the current associated AP */\n    QBSS_LOAD_PARM      APQbssLoad;         /* QBSS load of the current associated AP */\n\n    /* new to keep Ralink specific feature */\n    ULONG               APRalinkIe;\n    \n    BSS_TABLE           SsidBssTab;     /* AP list for the same SSID */\n    BSS_TABLE           RoamTab;        /* AP list eligible for roaming */\n    ULONG               BssIdx;\n    ULONG               RoamIdx;\n\n\tBOOLEAN\t\t\t\tCurrReqIsFromNdis;\n\n    RALINK_TIMER_STRUCT BeaconTimer, ScanTimer, APScanTimer;\n    RALINK_TIMER_STRUCT AuthTimer;\n    RALINK_TIMER_STRUCT AssocTimer, ReassocTimer, DisassocTimer;\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tUSHORT              VarIELen;           /* Length of next VIE include EID & Length */\n    UCHAR               VarIEs[MAX_VIE_LEN];\n    LONG\t\t\t\tRssi; /* Record the rssi value when receive Probe Rsp. */\n\tRALINK_TIMER_STRUCT ProbeTimer, ApCliAssocTimer, ApCliAuthTimer;\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tBOOLEAN\t\t\t\tbBwFallBack;\n\tUCHAR\t\t\t\tConCurrentCentralChannel;\n#endif /* P2P_SUPPORT */\n} MLME_AUX, *PMLME_AUX;\n\ntypedef struct _MLME_ADDBA_REQ_STRUCT{\n\tUCHAR   Wcid;\t/* */\n\tUCHAR   pAddr[MAC_ADDR_LEN];\n\tUCHAR   BaBufSize;\n\tUSHORT\tTimeOutValue;\n\tUCHAR   TID;\n\tUCHAR   Token;\n\tUSHORT\tBaStartSeq;\n} MLME_ADDBA_REQ_STRUCT, *PMLME_ADDBA_REQ_STRUCT;\n\n\ntypedef struct _MLME_DELBA_REQ_STRUCT{\n\tUCHAR   Wcid;\t/* */\n\tUCHAR     Addr[MAC_ADDR_LEN];\n\tUCHAR   TID;\n\tUCHAR\tInitiator;\n} MLME_DELBA_REQ_STRUCT, *PMLME_DELBA_REQ_STRUCT;\n\n/* assoc struct is equal to reassoc */\ntypedef struct _MLME_ASSOC_REQ_STRUCT{\n    UCHAR     Addr[MAC_ADDR_LEN];\n    USHORT    CapabilityInfo;\n    USHORT    ListenIntv;\n    ULONG     Timeout;\n} MLME_ASSOC_REQ_STRUCT, *PMLME_ASSOC_REQ_STRUCT, MLME_REASSOC_REQ_STRUCT, *PMLME_REASSOC_REQ_STRUCT;\n\ntypedef struct _MLME_DISASSOC_REQ_STRUCT{\n    UCHAR     Addr[MAC_ADDR_LEN];\n    USHORT    Reason;\n} MLME_DISASSOC_REQ_STRUCT, *PMLME_DISASSOC_REQ_STRUCT;\n\ntypedef struct _MLME_AUTH_REQ_STRUCT {\n    UCHAR        Addr[MAC_ADDR_LEN];\n    USHORT       Alg;\n    ULONG        Timeout;\n} MLME_AUTH_REQ_STRUCT, *PMLME_AUTH_REQ_STRUCT;\n\ntypedef struct _MLME_DEAUTH_REQ_STRUCT {\n    UCHAR        Addr[MAC_ADDR_LEN];\n    USHORT       Reason;\n} MLME_DEAUTH_REQ_STRUCT, *PMLME_DEAUTH_REQ_STRUCT;\n\ntypedef struct {\n    ULONG      BssIdx;\n} MLME_JOIN_REQ_STRUCT;\n\ntypedef struct _MLME_SCAN_REQ_STRUCT {\n    UCHAR      Bssid[MAC_ADDR_LEN];\n    UCHAR      BssType;\n    UCHAR      ScanType;\n    UCHAR      SsidLen;\n    CHAR       Ssid[MAX_LEN_OF_SSID];\n} MLME_SCAN_REQ_STRUCT, *PMLME_SCAN_REQ_STRUCT;\n\ntypedef struct _MLME_START_REQ_STRUCT {\n    CHAR        Ssid[MAX_LEN_OF_SSID];\n    UCHAR       SsidLen;\n} MLME_START_REQ_STRUCT, *PMLME_START_REQ_STRUCT;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\n/* structure for DLS */\ntypedef struct _RT_802_11_DLS {\n\tUSHORT\t\t\t\t\t\tTimeOut;\t\t/* Use to time out while slience, unit: second , set by UI */\n\tUSHORT\t\t\t\t\t\tCountDownTimer;\t/* Use to time out while slience,unit: second , used by driver only */\n\tNDIS_802_11_MAC_ADDRESS\t\tMacAddr;\t\t/* set by UI */\n\tUCHAR\t\t\t\t\t\tStatus;\t\t\t/* 0: none , 1: wait STAkey, 2: finish DLS setup , set by driver only */\n\tBOOLEAN\t\t\t\t\t\tValid;\t\t\t/* 1: valid , 0: invalid , set by UI, use to setup or tear down DLS link */\n\tRALINK_TIMER_STRUCT\t\t\tTimer;\t\t\t/* Use to time out while handshake */\n\tUSHORT\t\t\t\t\t\tSequence;\n\tUSHORT\t\t\t\t\t\tMacTabMatchWCID;\t/* ASIC */\n\tBOOLEAN\t\t\t\t\t\tbHTCap;\n\tPVOID\t\t\t\t\t\tpAd;\n} RT_802_11_DLS, *PRT_802_11_DLS;\n\ntypedef struct _MLME_DLS_REQ_STRUCT {\n    PRT_802_11_DLS\tpDLS;\n    USHORT\t\t\tReason;\n} MLME_DLS_REQ_STRUCT, *PMLME_DLS_REQ_STRUCT;\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\ntypedef struct GNU_PACKED _EID_STRUCT{\n    UCHAR   Eid;\n    UCHAR   Len;\n    UCHAR   Octet[1];\n} EID_STRUCT,*PEID_STRUCT, BEACON_EID_STRUCT, *PBEACON_EID_STRUCT;\n\n\n/* ========================== AP mlme.h =============================== */\n#define TBTT_PRELOAD_TIME       384        /* usec. LomgPreamble + 24-byte at 1Mbps */\n#define DEFAULT_DTIM_PERIOD     1\n\n/* weighting factor to calculate Channel quality, total should be 100% */\n/*#define RSSI_WEIGHTING                   0 */\n/*#define TX_WEIGHTING                     40 */\n/*#define RX_WEIGHTING                     60 */\n\n#define MAC_TABLE_AGEOUT_TIME\t\t\t300\t\t\t/* unit: sec */\n#define MAC_TABLE_MIN_AGEOUT_TIME\t\t60\t\t\t/* unit: sec */\n#define MAC_TABLE_ASSOC_TIMEOUT\t\t\t5\t\t\t/* unit: sec */\n#define MAC_TABLE_FULL(Tab)\t\t\t\t((Tab).size == MAX_LEN_OF_MAC_TABLE)\n\n/* AP shall drop the sta if contine Tx fail count reach it. */\n#define MAC_ENTRY_LIFE_CHECK_CNT\t\t1024\t\t\t/* packet cnt. */\n\n/* Value domain of pMacEntry->Sst */\ntypedef enum _Sst {\n    SST_NOT_AUTH,   /* 0: equivalent to IEEE 802.11/1999 state 1 */\n    SST_AUTH,       /* 1: equivalent to IEEE 802.11/1999 state 2 */\n    SST_ASSOC       /* 2: equivalent to IEEE 802.11/1999 state 3 */\n} SST;\n\n/* value domain of pMacEntry->AuthState */\ntypedef enum _AuthState {\n    AS_NOT_AUTH,\n    AS_AUTH_OPEN,       /* STA has been authenticated using OPEN SYSTEM */\n    AS_AUTH_KEY,        /* STA has been authenticated using SHARED KEY */\n    AS_AUTHENTICATING   /* STA is waiting for AUTH seq#3 using SHARED KEY */\n} AUTH_STATE;\n\n\ntypedef struct _IE_lists {\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUCHAR ApAddr[MAC_ADDR_LEN];\n\tUSHORT CapabilityInfo;\n\tUSHORT ListenInterval;\n\tUCHAR SsidLen;\n\tUCHAR Ssid[MAX_LEN_OF_SSID];\n\tUCHAR SupportedRatesLen;\n\tUCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR RSN_IE[MAX_LEN_OF_RSNIE];\n\tUCHAR RSNIE_Len;\n\tBOOLEAN bWmmCapable;\n#ifdef WSC_AP_SUPPORT\n\tBOOLEAN bWscCapable;\n#endif /* WSC_AP_SUPPORT */\n\tULONG RalinkIe;\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\n#ifdef P2P_SUPPORT\n\tULONG P2PSubelementLen;\n\tUCHAR P2pSubelement[MAX_VIE_LEN];\n#endif /* P2P_SUPPORT */\n\tUCHAR ht_cap_len;\n\tHT_CAPABILITY_IE HTCapability;\n#ifdef DOT11_VHT_AC\n\tVHT_CAP_IE vht_cap;\n\tVHT_OP_IE vht_op;\n\tUCHAR vht_cap_len;\n\tUCHAR vht_op_len;\n#endif /* DOT11_VHT_AC */\n}IE_LISTS;\n\n\ntypedef struct _bcn_ie_list {\n\tUCHAR Addr2[MAC_ADDR_LEN]; \n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tCHAR Ssid[MAX_LEN_OF_SSID];\n\tUCHAR SsidLen;\n\tUCHAR BssType;\n\tUSHORT BeaconPeriod;\n\tUCHAR Channel;\n\tUCHAR NewChannel;\n\tUSHORT AtimWin;\n\tUSHORT CapabilityInfo;\n\tUCHAR Erp;\n\tUCHAR DtimCount;\n\tUCHAR DtimPeriod;\n\tUCHAR BcastFlag;\n\tUCHAR MessageToMe;\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR SupRateLen;\n\tUCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR ExtRateLen;\n\tUCHAR CkipFlag;\n\tUCHAR AironetCellPowerLimit;\n\tLARGE_INTEGER TimeStamp;\n\tCF_PARM CfParm;\n\tEDCA_PARM EdcaParm;\n\tQBSS_LOAD_PARM QbssLoad;\n\tQOS_CAPABILITY_PARM QosCapability;\n\tULONG RalinkIe;\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\n\tUCHAR HtCapabilityLen;\n\tUCHAR PreNHtCapabilityLen;\n\tHT_CAPABILITY_IE HtCapability;\n\tUCHAR AddHtInfoLen;\n\tADD_HT_INFO_IE AddHtInfo;\n\tUCHAR NewExtChannelOffset;\n#ifdef DOT11_VHT_AC\n\tVHT_CAP_IE vht_cap_ie;\n\tVHT_OP_IE vht_op_ie;\n\tUCHAR vht_cap_len;\n\tUCHAR vht_op_len;\n#endif /* DOT11_VHT_AC */\n}BCN_IE_LIST;\n\n#endif\t/* MLME_H__ */\n\n"
  },
  {
    "path": "src/include/mlme_sys.h",
    "content": "/*\n\n*/\n\n\n#include \"rtmp_type.h\"\n\n\n\n"
  },
  {
    "path": "src/include/netif_block.h",
    "content": "\n#ifndef __NET_IF_BLOCK_H__\n#define __NET_IF_BLOCK_H__\n\n#include \"link_list.h\"\n#include \"rtmp.h\"\n\n#define FREE_NETIF_POOL_SIZE 32\n\ntypedef struct _NETIF_ENTRY\n{\n\tstruct _NETIF_ENTRY *pNext;\n\tPNET_DEV pNetDev;\n} NETIF_ENTRY, *PNETIF_ENTRY;\n\nvoid initblockQueueTab(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN blockNetIf(\n\tIN PBLOCK_QUEUE_ENTRY pBlockQueueEntry,\n\tIN PNET_DEV pNetDev);\n\nVOID releaseNetIf(\n\tIN PBLOCK_QUEUE_ENTRY pBlockQueueEntry);\n\nVOID StopNetIfQueue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR QueIdx,\n\tIN PNDIS_PACKET pPacket);\n#endif /* __NET_IF_BLOCK_H__ */\n\n"
  },
  {
    "path": "src/include/oid.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\toid.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n*/\n#ifndef _OID_H_\n#define _OID_H_\n\n/*#include <linux/wireless.h> */\n\n\n\n/* new types for Media Specific Indications */\n/* Extension channel offset */\n#define EXTCHA_NONE\t\t\t0\n#define EXTCHA_ABOVE\t\t0x1\n#define EXTCHA_BELOW\t\t0x3\n\n/* BW */\n#define BAND_WIDTH_20\t\t0\n#define BAND_WIDTH_40\t\t1\n#define BAND_WIDTH_80\t\t2\n#define BAND_WIDTH_BOTH\t3\n#define BAND_WIDTH_10\t\t4\t/* 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. */\n\n\n/* SHORTGI */\n#define GAP_INTERVAL_400\t1\t/* only support in HT mode */\n#define GAP_INTERVAL_800\t0\n#define GAP_INTERVAL_BOTH\t2\n\n#define NdisMediaStateConnected\t\t\t1\n#define NdisMediaStateDisconnected\t\t0\n\n#define NdisApMediaStateConnected\t\t\t1\n#define NdisApMediaStateDisconnected\t\t0\n\n\n#define NDIS_802_11_LENGTH_SSID         32\n\n#define\tIEEE80211_ADDR_LEN\t\t6\t/* size of 802.11 address */\n#define\tIEEE80211_NWID_LEN      32\n\n#define NDIS_802_11_LENGTH_RATES        8\n#define NDIS_802_11_LENGTH_RATES_EX     16\n#define MAC_ADDR_LENGTH                 6\n/*#define MAX_NUM_OF_CHS\t\t\t\t\t49 */ /* 14 channels @2.4G +  12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL terminationc */\n/*#define MAX_NUM_OF_CHS             \t\t54 */ /* 14 channels @2.4G +  12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0 @Japan + 1 as NULL termination */\n#define MAX_NUMBER_OF_EVENT\t\t\t\t10\t/* entry # in EVENT table */\n#define MAX_NUMBER_OF_MAC\t\t\t\t32\t/* if MAX_MBSSID_NUM is 8, this value can't be larger than 211 */\n#define MAX_NUMBER_OF_ACL\t\t\t\t64\n#define MAX_LENGTH_OF_SUPPORT_RATES\t\t12\t/* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */\n#define MAX_NUMBER_OF_DLS_ENTRY\t\t\t4\n\n\n#define RT_QUERY_SIGNAL_CONTEXT\t\t\t\t0x0402\n#define RT_SET_IAPP_PID                 \t0x0404\n#define RT_SET_APD_PID\t\t\t\t\t\t0x0405\n#define RT_SET_DEL_MAC_ENTRY\t\t\t\t0x0406\n#define RT_QUERY_EVENT_TABLE            \t0x0407\n/* */\n/* IEEE 802.11 OIDs */\n/* */\n#define\tOID_GET_SET_TOGGLE\t\t\t0x8000\n#define\tOID_GET_SET_FROM_UI\t\t\t0x4000\n\n#define\tOID_802_11_NETWORK_TYPES_SUPPORTED\t\t\t0x0103\n#define\tOID_802_11_NETWORK_TYPE_IN_USE\t\t\t\t0x0104\n#define\tOID_802_11_RSSI_TRIGGER\t\t\t\t\t\t0x0107\n#define\tRT_OID_802_11_RSSI\t\t\t\t\t\t\t0x0108\t/* rt2860 only */\n#define\tRT_OID_802_11_RSSI_1\t\t\t\t\t\t0x0109\t/* rt2860 only */\n#define\tRT_OID_802_11_RSSI_2\t\t\t\t\t\t0x010A\t/* rt2860 only */\n#define\tOID_802_11_NUMBER_OF_ANTENNAS\t\t\t\t0x010B\n#define\tOID_802_11_RX_ANTENNA_SELECTED\t\t\t\t0x010C\n#define\tOID_802_11_TX_ANTENNA_SELECTED\t\t\t\t0x010D\n#define\tOID_802_11_SUPPORTED_RATES\t\t\t\t\t0x010E\n#define\tOID_802_11_ADD_WEP\t\t\t\t\t\t\t0x0112\n#define\tOID_802_11_REMOVE_WEP\t\t\t\t\t\t0x0113\n#define\tOID_802_11_DISASSOCIATE\t\t\t\t\t\t0x0114\n#define\tOID_802_11_PRIVACY_FILTER\t\t\t\t\t0x0118\n#define\tOID_802_11_ASSOCIATION_INFORMATION\t\t\t0x011E\n#define\tOID_802_11_TEST\t\t\t\t\t\t\t\t0x011F\n\n\n#define\tRT_OID_802_11_COUNTRY_REGION\t\t\t\t0x0507\n#define\tOID_802_11_BSSID_LIST_SCAN\t\t\t\t\t0x0508\n#define\tOID_802_11_SSID\t\t\t\t\t\t\t\t0x0509\n#define\tOID_802_11_BSSID\t\t\t\t\t\t\t0x050A\n#define\tRT_OID_802_11_RADIO\t\t\t\t\t\t\t0x050B\n#define\tRT_OID_802_11_PHY_MODE\t\t\t\t\t\t0x050C\n#define\tRT_OID_802_11_STA_CONFIG\t\t\t\t\t0x050D\n#define\tOID_802_11_DESIRED_RATES\t\t\t\t\t0x050E\n#define\tRT_OID_802_11_PREAMBLE\t\t\t\t\t\t0x050F\n#define\tOID_802_11_WEP_STATUS\t\t\t\t\t\t0x0510\n#define\tOID_802_11_AUTHENTICATION_MODE\t\t\t\t0x0511\n#define\tOID_802_11_INFRASTRUCTURE_MODE\t\t\t\t0x0512\n#define\tRT_OID_802_11_RESET_COUNTERS\t\t\t\t0x0513\n#define\tOID_802_11_RTS_THRESHOLD\t\t\t\t\t0x0514\n#define\tOID_802_11_FRAGMENTATION_THRESHOLD\t\t\t0x0515\n#define\tOID_802_11_POWER_MODE\t\t\t\t\t\t0x0516\n#define\tOID_802_11_TX_POWER_LEVEL\t\t\t\t\t0x0517\n#define\tRT_OID_802_11_ADD_WPA\t\t\t\t\t\t0x0518\n#define\tOID_802_11_REMOVE_KEY\t\t\t\t\t\t0x0519\n#define\tRT_OID_802_11_QUERY_PID\t\t\t\t\t\t0x051A\n#define\tRT_OID_802_11_QUERY_VID\t\t\t\t\t\t0x051B\n#define\tOID_802_11_ADD_KEY\t\t\t\t\t\t\t0x0520\n#define\tOID_802_11_CONFIGURATION\t\t\t\t\t0x0521\n#define\tOID_802_11_TX_PACKET_BURST\t\t\t\t\t0x0522\n#define\tRT_OID_802_11_QUERY_NOISE_LEVEL\t\t\t\t0x0523\n#define\tRT_OID_802_11_EXTRA_INFO\t\t\t\t\t0x0524\n#define\tRT_OID_802_11_HARDWARE_REGISTER\t\t\t\t0x0525\n#define OID_802_11_ENCRYPTION_STATUS            OID_802_11_WEP_STATUS\n#define OID_802_11_DEAUTHENTICATION                 0x0526\n#define OID_802_11_DROP_UNENCRYPTED                 0x0527\n#define OID_802_11_MIC_FAILURE_REPORT_FRAME         0x0528\n#define OID_802_11_EAP_METHOD\t\t\t\t\t\t0x0529\n#define OID_802_11_ACL_LIST\t\t\t\t\t\t\t0x052A\n\n/* For 802.1x daemin using */\n#ifdef DOT1X_SUPPORT\n#define OID_802_DOT1X_CONFIGURATION\t\t\t\t\t0x0540\n#define OID_802_DOT1X_PMKID_CACHE\t\t\t\t\t0x0541\n#define OID_802_DOT1X_RADIUS_DATA\t\t\t\t\t0x0542\n#define OID_802_DOT1X_WPA_KEY\t\t\t\t\t\t0x0543\n#define OID_802_DOT1X_STATIC_WEP_COPY\t\t\t\t0x0544\n#define OID_802_DOT1X_IDLE_TIMEOUT\t\t\t\t\t0x0545\n#endif /* DOT1X_SUPPORT */\n\n#define\tRT_OID_DEVICE_NAME\t\t\t\t\t\t\t0x0607\n#define\tRT_OID_VERSION_INFO\t\t\t\t\t\t\t0x0608\n#define\tOID_802_11_BSSID_LIST\t\t\t\t\t\t0x0609\n#define\tOID_802_3_CURRENT_ADDRESS\t\t\t\t\t0x060A\n#define\tOID_GEN_MEDIA_CONNECT_STATUS\t\t\t\t0x060B\n#define\tRT_OID_802_11_QUERY_LINK_STATUS\t\t\t\t0x060C\n#define\tOID_802_11_RSSI\t\t\t\t\t\t\t\t0x060D\n#define\tOID_802_11_STATISTICS\t\t\t\t\t\t0x060E\n#define\tOID_GEN_RCV_OK\t\t\t\t\t\t\t\t0x060F\n#define\tOID_GEN_RCV_NO_BUFFER\t\t\t\t\t\t0x0610\n#define\tRT_OID_802_11_QUERY_EEPROM_VERSION\t\t\t0x0611\n#define\tRT_OID_802_11_QUERY_FIRMWARE_VERSION\t\t0x0612\n#define\tRT_OID_802_11_QUERY_LAST_RX_RATE\t\t\t0x0613\n#define\tRT_OID_802_11_TX_POWER_LEVEL_1\t\t\t\t0x0614\n#define\tRT_OID_802_11_QUERY_PIDVID\t\t\t\t\t0x0615\n/*for WPA_SUPPLICANT_SUPPORT */\n#define OID_SET_COUNTERMEASURES                     0x0616\n#define OID_802_11_SET_IEEE8021X                    0x0617\n#define OID_802_11_SET_IEEE8021X_REQUIRE_KEY        0x0618\n#define OID_802_11_PMKID                            0x0620\n#define RT_OID_WPA_SUPPLICANT_SUPPORT               0x0621\n#define RT_OID_WE_VERSION_COMPILED                  0x0622\n#define RT_OID_NEW_DRIVER                           0x0623\n#define\tOID_AUTO_PROVISION_BSSID_LIST\t\t\t\t0x0624\n#define RT_OID_WPS_PROBE_REQ_IE\t\t\t\t\t\t0x0625\n\n#define\tRT_OID_802_11_SNR_0\t\t\t\t\t\t\t0x0630\n#define\tRT_OID_802_11_SNR_1\t\t\t\t\t\t\t0x0631\n#define\tRT_OID_802_11_QUERY_LAST_TX_RATE\t\t\t0x0632\n#define\tRT_OID_802_11_QUERY_HT_PHYMODE\t\t\t\t0x0633\n#define\tRT_OID_802_11_SET_HT_PHYMODE\t\t\t\t0x0634\n#define\tOID_802_11_RELOAD_DEFAULTS\t\t\t\t\t0x0635\n#define\tRT_OID_802_11_QUERY_APSD_SETTING\t\t\t0x0636\n#define\tRT_OID_802_11_SET_APSD_SETTING\t\t\t\t0x0637\n#define\tRT_OID_802_11_QUERY_APSD_PSM\t\t\t\t0x0638\n#define\tRT_OID_802_11_SET_APSD_PSM\t\t\t\t\t0x0639\n#define\tRT_OID_802_11_QUERY_DLS\t\t\t\t\t\t0x063A\n#define\tRT_OID_802_11_SET_DLS\t\t\t\t\t\t0x063B\n#define\tRT_OID_802_11_QUERY_DLS_PARAM\t\t\t\t0x063C\n#define\tRT_OID_802_11_SET_DLS_PARAM\t\t\t\t\t0x063D\n#define RT_OID_802_11_QUERY_WMM              \t\t0x063E\n#define RT_OID_802_11_SET_WMM      \t\t\t\t\t0x063F\n#define RT_OID_802_11_QUERY_IMME_BA_CAP\t\t\t\t0x0640\n#define RT_OID_802_11_SET_IMME_BA_CAP\t\t\t\t0x0641\n#define RT_OID_802_11_QUERY_BATABLE\t\t\t\t\t0x0642\n#define RT_OID_802_11_ADD_IMME_BA\t\t\t\t\t0x0643\n#define RT_OID_802_11_TEAR_IMME_BA\t\t\t\t\t0x0644\n#define RT_OID_DRIVER_DEVICE_NAME                   0x0645\n#define RT_OID_802_11_QUERY_DAT_HT_PHYMODE          0x0646\n#define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT          0x0647\n#define OID_802_11_SET_PSPXLINK_MODE\t\t\t\t0x0648\n/*+++ add by woody +++*/\n#define OID_802_11_SET_PASSPHRASE\t\t\t\t0x0649\n#define RT_OID_802_11_QUERY_TX_PHYMODE                          0x0650\n#define RT_OID_802_11_QUERY_MAP_REAL_TX_RATE                          0x0678\n#define RT_OID_802_11_QUERY_MAP_REAL_RX_RATE                          0x0679\n#define\tRT_OID_802_11_SNR_2\t\t\t\t\t\t\t0x067A\n#define RT_OID_802_11_PER_BSS_STATISTICS\t\t\t0x067D\n\n#ifdef TXBF_SUPPORT\n#define RT_OID_802_11_QUERY_TXBF_TABLE\t\t\t\t0x067C\n#endif\n\n\n#ifdef HOSTAPD_SUPPORT\n#define SIOCSIWGENIE\t0x8B30\n#define OID_HOSTAPD_SUPPORT               0x0661\n\n#define HOSTAPD_OID_STATIC_WEP_COPY   0x0662\n#define HOSTAPD_OID_GET_1X_GROUP_KEY   0x0663\n\n#define HOSTAPD_OID_SET_STA_AUTHORIZED   0x0664\n#define HOSTAPD_OID_SET_STA_DISASSOC   0x0665\n#define HOSTAPD_OID_SET_STA_DEAUTH   0x0666\n#define HOSTAPD_OID_DEL_KEY   0x0667\n#define HOSTAPD_OID_SET_KEY   0x0668\n#define HOSTAPD_OID_SET_802_1X   0x0669\n#define HOSTAPD_OID_GET_SEQ   0x0670\n#define HOSTAPD_OID_GETWPAIE                 0x0671\n#define HOSTAPD_OID_COUNTERMEASURES 0x0672\n#define HOSTAPD_OID_SET_WPAPSK 0x0673\n#define HOSTAPD_OID_SET_WPS_BEACON_IE 0x0674\n#define HOSTAPD_OID_SET_WPS_PROBE_RESP_IE 0x0675\n\n#define\tRT_HOSTAPD_OID_HOSTAPD_SUPPORT\t\t\t\t(OID_GET_SET_TOGGLE |\tOID_HOSTAPD_SUPPORT)\n#define\tRT_HOSTAPD_OID_STATIC_WEP_COPY\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_STATIC_WEP_COPY)\n#define\tRT_HOSTAPD_OID_GET_1X_GROUP_KEY\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_GET_1X_GROUP_KEY)\n#define\tRT_HOSTAPD_OID_SET_STA_AUTHORIZED\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_STA_AUTHORIZED)\n#define\tRT_HOSTAPD_OID_SET_STA_DISASSOC\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_STA_DISASSOC)\n#define\tRT_HOSTAPD_OID_SET_STA_DEAUTH\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_STA_DEAUTH)\n#define\tRT_HOSTAPD_OID_DEL_KEY\t\t\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_DEL_KEY)\n#define\tRT_HOSTAPD_OID_SET_KEY\t\t\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_KEY)\n#define\tRT_HOSTAPD_OID_SET_802_1X\t\t\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_802_1X)\n#define\tRT_HOSTAPD_OID_COUNTERMEASURES\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_COUNTERMEASURES)\n#define\tRT_HOSTAPD_OID_SET_WPAPSK\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_WPAPSK)\n#define\tRT_HOSTAPD_OID_SET_WPS_BEACON_IE\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_WPS_BEACON_IE)\n#define\tRT_HOSTAPD_OID_SET_WPS_PROBE_RESP_IE\t\t\t\t(OID_GET_SET_TOGGLE |\tHOSTAPD_OID_SET_WPS_PROBE_RESP_IE)\n\n#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)\n#define\tIEEE80211_KEYBUF_SIZE\t16\n#define\tIEEE80211_MICBUF_SIZE\t(8 + 8)\t/* space for both tx+rx keys */\n#define IEEE80211_TID_SIZE\t\t17\t/* total number of TIDs */\n\n#define\tIEEE80211_MLME_ASSOC\t\t    1\t/* associate station */\n#define\tIEEE80211_MLME_DISASSOC\t\t    2\t/* disassociate station */\n#define\tIEEE80211_MLME_DEAUTH\t\t    3\t/* deauthenticate station */\n#define\tIEEE80211_MLME_AUTHORIZE\t    4\t/* authorize station */\n#define\tIEEE80211_MLME_UNAUTHORIZE\t    5\t/* unauthorize station */\n#define IEEE80211_MLME_CLEAR_STATS\t    6\t/* clear station statistic */\n#define IEEE80211_1X_COPY_KEY        \t7\t/* copy static-wep unicast key */\n\n#define\tIEEE80211_MAX_OPT_IE\t256\n#define IWEVEXPIRED\t0x8C04\n\nstruct ieee80211req_mlme {\n\tUINT8 im_op;\t\t/* operation to perform */\n\tUINT8 im_ssid_len;\t/* length of optional ssid */\n\tUINT16 im_reason;\t/* 802.11 reason code */\n\tUINT8 im_macaddr[IEEE80211_ADDR_LEN];\n\tUINT8 im_ssid[IEEE80211_NWID_LEN];\n};\n\nstruct ieee80211req_key {\n\tUINT8 ik_type;\t\t/* key/cipher type */\n\tUINT8 ik_pad;\n\tUINT16 ik_keyix;\t/* key index */\n\tUINT8 ik_keylen;\t/* key length in bytes */\n\tUINT8 ik_flags;\n\tUINT8 ik_macaddr[IEEE80211_ADDR_LEN];\n\tUINT64 ik_keyrsc;\t/* key receive sequence counter */\n\tUINT64 ik_keytsc;\t/* key transmit sequence counter */\n\tUINT8 ik_keydata[IEEE80211_KEYBUF_SIZE + IEEE80211_MICBUF_SIZE];\n\tint txkey;\n};\n\nstruct ieee80211req_del_key {\n\tUINT8 idk_keyix;\t/* key index */\n\tUINT8 idk_macaddr[IEEE80211_ADDR_LEN];\n};\n\nstruct default_group_key {\n\tUINT16 ik_keyix;\t/* key index */\n\tUINT8 ik_keylen;\t/* key length in bytes */\n\tUINT8 ik_keydata[IEEE80211_KEYBUF_SIZE + IEEE80211_MICBUF_SIZE];\n};\n\nstruct ieee80211req_wpaie {\n\tUINT8 wpa_macaddr[IEEE80211_ADDR_LEN];\n\tUINT8 rsn_ie[IEEE80211_MAX_OPT_IE];\n};\n\nstruct hostapd_wpa_psk {\n\tstruct hostapd_wpa_psk *next;\n\tint group;\n\tUCHAR psk[32];\n\tUCHAR addr[6];\n};\n\n#endif /*HOSTAPD_SUPPORT */\n\n#define RT_OID_802_11_QUERY_TDLS_PARAM\t\t\t0x0676\n#define\tRT_OID_802_11_QUERY_TDLS\t\t\t\t0x0677\n\n/* Ralink defined OIDs */\n/* Dennis Lee move to platform specific */\n\n#define\tRT_OID_802_11_BSSID\t\t\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_BSSID)\n#define\tRT_OID_802_11_SSID\t\t\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_SSID)\n#define\tRT_OID_802_11_INFRASTRUCTURE_MODE\t  (OID_GET_SET_TOGGLE |\tOID_802_11_INFRASTRUCTURE_MODE)\n#define\tRT_OID_802_11_ADD_WEP\t\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_ADD_WEP)\n#define\tRT_OID_802_11_ADD_KEY\t\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_ADD_KEY)\n#define\tRT_OID_802_11_REMOVE_WEP\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_REMOVE_WEP)\n#define\tRT_OID_802_11_REMOVE_KEY\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_REMOVE_KEY)\n#define\tRT_OID_802_11_DISASSOCIATE\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_DISASSOCIATE)\n#define\tRT_OID_802_11_AUTHENTICATION_MODE\t  (OID_GET_SET_TOGGLE |\tOID_802_11_AUTHENTICATION_MODE)\n#define\tRT_OID_802_11_PRIVACY_FILTER\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_PRIVACY_FILTER)\n#define\tRT_OID_802_11_BSSID_LIST_SCAN\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_BSSID_LIST_SCAN)\n#define\tRT_OID_802_11_WEP_STATUS\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_WEP_STATUS)\n#define\tRT_OID_802_11_RELOAD_DEFAULTS\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_RELOAD_DEFAULTS)\n#define\tRT_OID_802_11_NETWORK_TYPE_IN_USE\t  (OID_GET_SET_TOGGLE |\tOID_802_11_NETWORK_TYPE_IN_USE)\n#define\tRT_OID_802_11_TX_POWER_LEVEL\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_TX_POWER_LEVEL)\n#define\tRT_OID_802_11_RSSI_TRIGGER\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_RSSI_TRIGGER)\n#define\tRT_OID_802_11_FRAGMENTATION_THRESHOLD (OID_GET_SET_TOGGLE |\tOID_802_11_FRAGMENTATION_THRESHOLD)\n#define\tRT_OID_802_11_RTS_THRESHOLD\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_RTS_THRESHOLD)\n#define\tRT_OID_802_11_RX_ANTENNA_SELECTED\t  (OID_GET_SET_TOGGLE |\tOID_802_11_RX_ANTENNA_SELECTED)\n#define\tRT_OID_802_11_TX_ANTENNA_SELECTED\t  (OID_GET_SET_TOGGLE |\tOID_802_11_TX_ANTENNA_SELECTED)\n#define\tRT_OID_802_11_SUPPORTED_RATES\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_SUPPORTED_RATES)\n#define\tRT_OID_802_11_DESIRED_RATES\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_DESIRED_RATES)\n#define\tRT_OID_802_11_CONFIGURATION\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_CONFIGURATION)\n#define\tRT_OID_802_11_POWER_MODE\t\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_POWER_MODE)\n#define RT_OID_802_11_SET_PSPXLINK_MODE\t\t  (OID_GET_SET_TOGGLE |\tOID_802_11_SET_PSPXLINK_MODE)\n#define RT_OID_802_11_EAP_METHOD\t\t\t  (OID_GET_SET_TOGGLE | OID_802_11_EAP_METHOD)\n#define RT_OID_802_11_SET_PASSPHRASE\t\t  (OID_GET_SET_TOGGLE | OID_802_11_SET_PASSPHRASE)\n\n#ifdef DOT1X_SUPPORT\n#define RT_OID_802_DOT1X_PMKID_CACHE\t\t(OID_GET_SET_TOGGLE | OID_802_DOT1X_PMKID_CACHE)\n#define RT_OID_802_DOT1X_RADIUS_DATA\t\t(OID_GET_SET_TOGGLE | OID_802_DOT1X_RADIUS_DATA)\n#define RT_OID_802_DOT1X_WPA_KEY\t\t\t(OID_GET_SET_TOGGLE | OID_802_DOT1X_WPA_KEY)\n#define RT_OID_802_DOT1X_STATIC_WEP_COPY\t(OID_GET_SET_TOGGLE | OID_802_DOT1X_STATIC_WEP_COPY)\n#define RT_OID_802_DOT1X_IDLE_TIMEOUT\t\t(OID_GET_SET_TOGGLE | OID_802_DOT1X_IDLE_TIMEOUT)\n#endif /* DOT1X_SUPPORT */\n\n#define RT_OID_802_11_SET_TDLS_PARAM\t\t\t(OID_GET_SET_TOGGLE | RT_OID_802_11_QUERY_TDLS_PARAM)\n#define RT_OID_802_11_SET_TDLS\t\t\t\t(OID_GET_SET_TOGGLE | RT_OID_802_11_QUERY_TDLS)\n\n#ifdef WAPI_SUPPORT\n#define OID_802_11_WAPI_PID\t\t\t\t\t0x06A0\n#define OID_802_11_PORT_SECURE_STATE\t\t0x06A1\n#define OID_802_11_UCAST_KEY_INFO\t\t\t0x06A2\n#define OID_802_11_MCAST_TXIV\t\t\t\t0x06A3\n#define OID_802_11_MCAST_KEY_INFO\t\t\t0x06A4\n#define OID_802_11_WAPI_CONFIGURATION\t\t0x06A5\n#define OID_802_11_WAPI_IE\t\t\t\t\t0x06A6\n\n#define RT_OID_802_11_WAPI_PID\t\t\t\t(OID_GET_SET_TOGGLE | OID_802_11_WAPI_PID)\n#define RT_OID_802_11_PORT_SECURE_STATE\t\t(OID_GET_SET_TOGGLE | OID_802_11_PORT_SECURE_STATE)\n#define RT_OID_802_11_UCAST_KEY_INFO\t\t(OID_GET_SET_TOGGLE | OID_802_11_UCAST_KEY_INFO)\n#define RT_OID_802_11_MCAST_TXIV\t\t\t(OID_GET_SET_TOGGLE | OID_802_11_MCAST_TXIV)\n#define RT_OID_802_11_MCAST_KEY_INFO\t\t(OID_GET_SET_TOGGLE | OID_802_11_MCAST_KEY_INFO)\n#define RT_OID_802_11_WAPI_CONFIGURATION\t(OID_GET_SET_TOGGLE | OID_802_11_WAPI_CONFIGURATION)\n#define RT_OID_802_11_WAPI_IE\t\t\t\t(OID_GET_SET_TOGGLE | OID_802_11_WAPI_IE)\n#endif /* WAPI_SUPPORT */\n\ntypedef enum _NDIS_802_11_STATUS_TYPE {\n\tNdis802_11StatusType_Authentication,\n\tNdis802_11StatusType_MediaStreamMode,\n\tNdis802_11StatusType_PMKID_CandidateList,\n\tNdis802_11StatusTypeMax\t/* not a real type, defined as an upper bound */\n} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;\n\ntypedef UCHAR NDIS_802_11_MAC_ADDRESS[6];\n\ntypedef struct _NDIS_802_11_STATUS_INDICATION {\n\tNDIS_802_11_STATUS_TYPE StatusType;\n} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION;\n\n/* mask for authentication/integrity fields */\n#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS        0x0f\n\n#define NDIS_802_11_AUTH_REQUEST_REAUTH             0x01\n#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE          0x02\n#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR     0x06\n#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR        0x0E\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_REQUEST {\n\tULONG Length;\t\t/* Length of structure */\n\tNDIS_802_11_MAC_ADDRESS Bssid;\n\tULONG Flags;\n} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST;\n\n/*Added new types for PMKID Candidate lists. */\ntypedef struct _PMKID_CANDIDATE {\n\tNDIS_802_11_MAC_ADDRESS BSSID;\n\tULONG Flags;\n} PMKID_CANDIDATE, *PPMKID_CANDIDATE;\n\ntypedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST {\n\tULONG Version;\t\t/* Version of the structure */\n\tULONG NumCandidates;\t/* No. of pmkid candidates */\n\tPMKID_CANDIDATE CandidateList[1];\n} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST;\n\n/*Flags for PMKID Candidate list structure */\n#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED\t0x01\n\n/* Added new types for OFDM 5G and 2.4G */\ntypedef enum _NDIS_802_11_NETWORK_TYPE {\n\tNdis802_11FH,\n\tNdis802_11DS,\n\tNdis802_11OFDM5,\n\tNdis802_11OFDM24,\n\tNdis802_11Automode,\n\tNdis802_11OFDM5_N,\n\tNdis802_11OFDM24_N,\n\tNdis802_11NetworkTypeMax\t/* not a real type, defined as an upper bound */\n} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;\n\ntypedef struct _NDIS_802_11_NETWORK_TYPE_LIST {\n\tUINT NumberOfItems;\t/* in list below, at least 1 */\n\tNDIS_802_11_NETWORK_TYPE NetworkType[1];\n} NDIS_802_11_NETWORK_TYPE_LIST, *PNDIS_802_11_NETWORK_TYPE_LIST;\n\ntypedef enum _NDIS_802_11_POWER_MODE {\n\tNdis802_11PowerModeCAM,\n\tNdis802_11PowerModeMAX_PSP,\n\tNdis802_11PowerModeFast_PSP,\n\tNdis802_11PowerModeLegacy_PSP,\n\tNdis802_11PowerModeMax\t/* not a real mode, defined as an upper bound */\n} NDIS_802_11_POWER_MODE, *PNDIS_802_11_POWER_MODE;\n\ntypedef ULONG NDIS_802_11_TX_POWER_LEVEL;\t/* in milliwatts */\n\n/* */\n/* Received Signal Strength Indication */\n/* */\ntypedef LONG NDIS_802_11_RSSI;\t/* in dBm */\n\ntypedef struct _NDIS_802_11_CONFIGURATION_FH {\n\tULONG Length;\t\t/* Length of structure */\n\tULONG HopPattern;\t/* As defined by 802.11, MSB set */\n\tULONG HopSet;\t\t/* to one if non-802.11 */\n\tULONG DwellTime;\t/* units are Kusec */\n} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;\n\ntypedef struct _NDIS_802_11_CONFIGURATION {\n\tULONG Length;\t\t/* Length of structure */\n\tULONG BeaconPeriod;\t/* units are Kusec */\n\tULONG ATIMWindow;\t/* units are Kusec */\n\tULONG DSConfig;\t\t/* Frequency, units are kHz */\n\tNDIS_802_11_CONFIGURATION_FH FHConfig;\n} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;\n\ntypedef struct _NDIS_802_11_STATISTICS {\n\tULONG Length;\t\t/* Length of structure */\n\tLARGE_INTEGER TransmittedFragmentCount;\n\tLARGE_INTEGER MulticastTransmittedFrameCount;\n\tLARGE_INTEGER FailedCount;\n\tLARGE_INTEGER RetryCount;\n\tLARGE_INTEGER MultipleRetryCount;\n\tLARGE_INTEGER RTSSuccessCount;\n\tLARGE_INTEGER RTSFailureCount;\n\tLARGE_INTEGER ACKFailureCount;\n\tLARGE_INTEGER FrameDuplicateCount;\n\tLARGE_INTEGER ReceivedFragmentCount;\n\tLARGE_INTEGER MulticastReceivedFrameCount;\n\tLARGE_INTEGER FCSErrorCount;\n\tLARGE_INTEGER TransmittedFrameCount;\n\tLARGE_INTEGER WEPUndecryptableCount;\n\tLARGE_INTEGER TKIPLocalMICFailures;\n\tLARGE_INTEGER TKIPRemoteMICErrors;\n\tLARGE_INTEGER TKIPICVErrors;\n\tLARGE_INTEGER TKIPCounterMeasuresInvoked;\n\tLARGE_INTEGER TKIPReplays;\n\tLARGE_INTEGER CCMPFormatErrors;\n\tLARGE_INTEGER CCMPReplays;\n\tLARGE_INTEGER CCMPDecryptErrors;\n\tLARGE_INTEGER FourWayHandshakeFailures;\n} NDIS_802_11_STATISTICS, *PNDIS_802_11_STATISTICS;\n\ntypedef struct _MBSS_STATISTICS {\n\tLONG TxCount;\n\tULONG RxCount;\n\tULONG ReceivedByteCount;\n\tULONG TransmittedByteCount;\n\tULONG RxErrorCount;\n\tULONG RxDropCount;\n\tULONG TxErrorCount;\n\tULONG TxDropCount;\n\tULONG ucPktsTx;\n\tULONG ucPktsRx;\n\tULONG mcPktsTx;\n\tULONG mcPktsRx;\n\tULONG bcPktsTx;\n\tULONG bcPktsRx;\n} MBSS_STATISTICS, *PMBSS_STATISTICS;\n\ntypedef ULONG NDIS_802_11_KEY_INDEX;\ntypedef ULONGLONG NDIS_802_11_KEY_RSC;\n\n#ifdef DOT1X_SUPPORT\n#define MAX_RADIUS_SRV_NUM\t\t\t2\t/* 802.1x failover number */\n\n/* The dot1x related structure. \n   It's used to communicate with DOT1X daemon */\ntypedef struct GNU_PACKED _RADIUS_SRV_INFO {\n\tUINT32 radius_ip;\n\tUINT32 radius_port;\n\tUCHAR radius_key[64];\n\tUCHAR radius_key_len;\n} RADIUS_SRV_INFO, *PRADIUS_SRV_INFO;\n\ntypedef struct GNU_PACKED _DOT1X_BSS_INFO {\n\tUCHAR radius_srv_num;\n\tRADIUS_SRV_INFO radius_srv_info[MAX_RADIUS_SRV_NUM];\n\tUCHAR ieee8021xWEP;\t/* dynamic WEP */\n\tUCHAR key_index;\n\tUCHAR key_length;\t/* length of key in bytes */\n\tUCHAR key_material[13];\n\tUCHAR nasId[IFNAMSIZ];\n\tUCHAR nasId_len;\n} DOT1X_BSS_INFO, *PDOT1X_BSS_INFO;\n\ntypedef struct GNU_PACKED _DOT1X_CMM_CONF {\n\tUINT32 Length;\t\t/* Length of this structure */\n\tUCHAR mbss_num;\t\t/* indicate multiple BSS number */\n\tUINT32 own_ip_addr;\n\tUINT32 retry_interval;\n\tUINT32 session_timeout_interval;\n\tUINT32 quiet_interval;\n\tUCHAR EAPifname[8][IFNAMSIZ];\n\tUCHAR EAPifname_len[8];\n\tUCHAR PreAuthifname[8][IFNAMSIZ];\n\tUCHAR PreAuthifname_len[8];\n\tDOT1X_BSS_INFO Dot1xBssInfo[8];\n} DOT1X_CMM_CONF, *PDOT1X_CMM_CONF;\n\ntypedef struct GNU_PACKED _DOT1X_IDLE_TIMEOUT {\n\tUCHAR StaAddr[6];\n\tUINT32 idle_timeout;\n} DOT1X_IDLE_TIMEOUT, *PDOT1X_IDLE_TIMEOUT;\n#endif /* DOT1X_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\ntypedef struct _NDIS_AP_802_11_KEY {\n\tUINT Length;\t\t/* Length of this structure */\n\tUCHAR addr[6];\n\tUINT KeyIndex;\n\tUINT KeyLength;\t\t/* length of key in bytes */\n\tUCHAR KeyMaterial[1];\t/* variable length depending on above field */\n} NDIS_AP_802_11_KEY, *PNDIS_AP_802_11_KEY;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\ntypedef struct _NDIS_APCLI_802_11_KEY\n{\n    UINT           Length;             \n    UINT           KeyIndex;           \n    UINT           KeyLength;         \n    NDIS_802_11_MAC_ADDRESS BSSID;\n    NDIS_802_11_KEY_RSC KeyRSC;\n    UCHAR           KeyMaterial[1];     \n} NDIS_APCLI_802_11_KEY, *PNDIS_APCLI_802_11_KEY;\n#endif/* APCLI_WPA_SUPPLICANT_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n/* Key mapping keys require a BSSID */\ntypedef struct _NDIS_802_11_KEY {\n\tUINT Length;\t\t/* Length of this structure */\n\tUINT KeyIndex;\n\tUINT KeyLength;\t\t/* length of key in bytes */\n\tNDIS_802_11_MAC_ADDRESS BSSID;\n\tNDIS_802_11_KEY_RSC KeyRSC;\n\tUCHAR KeyMaterial[1];\t/* variable length depending on above field */\n} NDIS_802_11_KEY, *PNDIS_802_11_KEY;\n\ntypedef struct _NDIS_802_11_PASSPHRASE {\n\tUINT KeyLength;\t\t/* length of key in bytes */\n\tNDIS_802_11_MAC_ADDRESS BSSID;\n\tUCHAR KeyMaterial[1];\t/* variable length depending on above field */\n} NDIS_802_11_PASSPHRASE, *PNDIS_802_11_PASSPHRASE;\n#endif /* CONFIG_STA_SUPPORT */\n\ntypedef struct _NDIS_802_11_REMOVE_KEY {\n\tUINT Length;\t\t/* Length of this structure */\n\tUINT KeyIndex;\n\tNDIS_802_11_MAC_ADDRESS BSSID;\n} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY;\n\ntypedef struct _NDIS_802_11_WEP {\n\tUINT Length;\t\t/* Length of this structure */\n\tUINT KeyIndex;\t\t/* 0 is the per-client key, 1-N are the */\n\t/* global keys */\n\tUINT KeyLength;\t\t/* length of key in bytes */\n\tUCHAR KeyMaterial[1];\t/* variable length depending on above field */\n} NDIS_802_11_WEP, *PNDIS_802_11_WEP;\n\n\n/* Add new authentication modes */\ntypedef enum _NDIS_802_11_AUTHENTICATION_MODE {\n\tNdis802_11AuthModeOpen,\n\tNdis802_11AuthModeShared,\n\tNdis802_11AuthModeAutoSwitch,\n\tNdis802_11AuthModeWPA,\n\tNdis802_11AuthModeWPAPSK,\n\tNdis802_11AuthModeWPANone,\n\tNdis802_11AuthModeWPA2,\n\tNdis802_11AuthModeWPA2PSK,\n\tNdis802_11AuthModeWPA1WPA2,\n\tNdis802_11AuthModeWPA1PSKWPA2PSK,\n#ifdef WAPI_SUPPORT\n\tNdis802_11AuthModeWAICERT,\t/* WAI certificate authentication */\n\tNdis802_11AuthModeWAIPSK,\t/* WAI pre-shared key */\n#endif\t\t\t\t/* WAPI_SUPPORT */\n\tNdis802_11AuthModeMax\t/* Not a real mode, defined as upper bound */\n} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;\n\ntypedef UCHAR NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES];\t/* Set of 8 data rates */\ntypedef UCHAR NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX];\t/* Set of 16 data rates */\n\ntypedef struct GNU_PACKED _NDIS_802_11_SSID {\n\tUINT SsidLength;\t/* length of SSID field below, in bytes; */\n\t/* this can be zero. */\n\tUCHAR Ssid[NDIS_802_11_LENGTH_SSID];\t/* SSID information field */\n} NDIS_802_11_SSID, *PNDIS_802_11_SSID;\n\ntypedef struct GNU_PACKED _NDIS_WLAN_BSSID {\n\tULONG Length;\t\t/* Length of this structure */\n\tNDIS_802_11_MAC_ADDRESS MacAddress;\t/* BSSID */\n\tUCHAR Reserved[2];\n\tNDIS_802_11_SSID Ssid;\t/* SSID */\n\tULONG Privacy;\t\t/* WEP encryption requirement */\n\tNDIS_802_11_RSSI Rssi;\t/* receive signal strength in dBm */\n\tNDIS_802_11_NETWORK_TYPE NetworkTypeInUse;\n\tNDIS_802_11_CONFIGURATION Configuration;\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;\n\tNDIS_802_11_RATES SupportedRates;\n} NDIS_WLAN_BSSID, *PNDIS_WLAN_BSSID;\n\ntypedef struct GNU_PACKED _NDIS_802_11_BSSID_LIST {\n\tUINT NumberOfItems;\t/* in list below, at least 1 */\n\tNDIS_WLAN_BSSID Bssid[1];\n} NDIS_802_11_BSSID_LIST, *PNDIS_802_11_BSSID_LIST;\n\ntypedef struct {\n\tBOOLEAN bValid;\t\t/* 1: variable contains valid value */\n\tUSHORT StaNum;\n\tUCHAR ChannelUtilization;\n\tUSHORT RemainingAdmissionControl;\t/* in unit of 32-us */\n} QBSS_LOAD_UI, *PQBSS_LOAD_UI;\n\n/* Added Capabilities, IELength and IEs for each BSSID */\ntypedef struct GNU_PACKED _NDIS_WLAN_BSSID_EX {\n\tULONG Length;\t\t/* Length of this structure */\n\tNDIS_802_11_MAC_ADDRESS MacAddress;\t/* BSSID */\n\tUCHAR WpsAP; /* 0x00: not support WPS, 0x01: support normal WPS, 0x02: support Ralink auto WPS, 0x04: support Samsung WAC */\n\tCHAR MinSNR;\n\tNDIS_802_11_SSID Ssid;\t/* SSID */\n\tUINT Privacy;\t\t/* WEP encryption requirement */\n\tNDIS_802_11_RSSI Rssi;\t/* receive signal */\n\t/* strength in dBm */\n\tNDIS_802_11_NETWORK_TYPE NetworkTypeInUse;\n\tNDIS_802_11_CONFIGURATION Configuration;\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;\n\tNDIS_802_11_RATES_EX SupportedRates;\n\tULONG IELength;\n\tUCHAR IEs[1];\n\n} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX;\n\ntypedef struct GNU_PACKED _NDIS_802_11_BSSID_LIST_EX {\n\tUINT NumberOfItems;\t/* in list below, at least 1 */\n\tNDIS_WLAN_BSSID_EX Bssid[1];\n} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX;\n\ntypedef struct GNU_PACKED _NDIS_802_11_FIXED_IEs {\n\tUCHAR Timestamp[8];\n\tUSHORT BeaconInterval;\n\tUSHORT Capabilities;\n} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;\n\ntypedef struct _NDIS_802_11_VARIABLE_IEs {\n\tUCHAR ElementID;\n\tUCHAR Length;\t\t/* Number of bytes in data field */\n\tUCHAR data[1];\n} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs;\n\ntypedef ULONG NDIS_802_11_FRAGMENTATION_THRESHOLD;\n\ntypedef ULONG NDIS_802_11_RTS_THRESHOLD;\n\ntypedef ULONG NDIS_802_11_ANTENNA;\n\ntypedef enum _NDIS_802_11_PRIVACY_FILTER {\n\tNdis802_11PrivFilterAcceptAll,\n\tNdis802_11PrivFilter8021xWEP\n} NDIS_802_11_PRIVACY_FILTER, *PNDIS_802_11_PRIVACY_FILTER;\n\n/* Added new encryption types */\n/* Also aliased typedef to new name */\ntypedef enum _NDIS_802_11_WEP_STATUS {\n\tNdis802_11WEPEnabled,\n\tNdis802_11Encryption1Enabled = Ndis802_11WEPEnabled,\n\tNdis802_11WEPDisabled,\n\tNdis802_11EncryptionDisabled = Ndis802_11WEPDisabled,\n\tNdis802_11WEPKeyAbsent,\n\tNdis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,\n\tNdis802_11WEPNotSupported,\n\tNdis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,\n\tNdis802_11Encryption2Enabled,\n\tNdis802_11Encryption2KeyAbsent,\n\tNdis802_11Encryption3Enabled,\n\tNdis802_11Encryption3KeyAbsent,\n\tNdis802_11Encryption4Enabled,\t/* TKIP or AES mix */\n\tNdis802_11Encryption4KeyAbsent,\n\tNdis802_11GroupWEP40Enabled,\n\tNdis802_11GroupWEP104Enabled,\n#ifdef WAPI_SUPPORT\n\tNdis802_11EncryptionSMS4Enabled,\t/* WPI SMS4 support */\n#endif /* WAPI_SUPPORT */\n} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;\n\ntypedef enum _NDIS_802_11_RELOAD_DEFAULTS {\n\tNdis802_11ReloadWEPKeys\n} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS;\n\n#define NDIS_802_11_AI_REQFI_CAPABILITIES      1\n#define NDIS_802_11_AI_REQFI_LISTENINTERVAL    2\n#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS  4\n\n#define NDIS_802_11_AI_RESFI_CAPABILITIES      1\n#define NDIS_802_11_AI_RESFI_STATUSCODE        2\n#define NDIS_802_11_AI_RESFI_ASSOCIATIONID     4\n\ntypedef struct _NDIS_802_11_AI_REQFI {\n\tUSHORT Capabilities;\n\tUSHORT ListenInterval;\n\tNDIS_802_11_MAC_ADDRESS CurrentAPAddress;\n} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;\n\ntypedef struct _NDIS_802_11_AI_RESFI {\n\tUSHORT Capabilities;\n\tUSHORT StatusCode;\n\tUSHORT AssociationId;\n} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;\n\ntypedef struct _NDIS_802_11_ASSOCIATION_INFORMATION {\n\tULONG Length;\n\tUSHORT AvailableRequestFixedIEs;\n\tNDIS_802_11_AI_REQFI RequestFixedIEs;\n\tULONG RequestIELength;\n\tULONG OffsetRequestIEs;\n\tUSHORT AvailableResponseFixedIEs;\n\tNDIS_802_11_AI_RESFI ResponseFixedIEs;\n\tULONG ResponseIELength;\n\tULONG OffsetResponseIEs;\n} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_EVENT {\n\tNDIS_802_11_STATUS_INDICATION Status;\n\tNDIS_802_11_AUTHENTICATION_REQUEST Request[1];\n} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;\n\n/*        \ntypedef struct _NDIS_802_11_TEST\n{\n    ULONG Length;\n    ULONG Type;\n    union\n    {\n        NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent;\n        NDIS_802_11_RSSI RssiTrigger;\n    };\n} NDIS_802_11_TEST, *PNDIS_802_11_TEST;\n */\n\n/* 802.11 Media stream constraints, associated with OID_802_11_MEDIA_STREAM_MODE */\ntypedef enum _NDIS_802_11_MEDIA_STREAM_MODE {\n\tNdis802_11MediaStreamOff,\n\tNdis802_11MediaStreamOn,\n} NDIS_802_11_MEDIA_STREAM_MODE, *PNDIS_802_11_MEDIA_STREAM_MODE;\n\n/* PMKID Structures */\ntypedef UCHAR NDIS_802_11_PMKID_VALUE[16];\n\n#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_WPA_SUPPLICANT_SUPPORT)\ntypedef struct _BSSID_INFO {\n\tNDIS_802_11_MAC_ADDRESS BSSID;\n\tNDIS_802_11_PMKID_VALUE PMKID;\n} BSSID_INFO, *PBSSID_INFO;\n\ntypedef struct _NDIS_802_11_PMKID {\n\tUINT Length;\n\tUINT BSSIDInfoCount;\n\tBSSID_INFO BSSIDInfo[1];\n} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID;\n#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_WPA_SUPPLICANT_SUPPORT) */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\ntypedef struct _NDIS_APCLI_802_11_PMKID\n{\n    UINT    Length;\n    UINT    BSSIDInfoCount;\n    BSSID_INFO BSSIDInfo[1];\n} NDIS_APCLI_802_11_PMKID, *PNDIS_APCLI_802_11_PMKID;\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n\ntypedef struct _AP_BSSID_INFO {\n\tNDIS_802_11_MAC_ADDRESS MAC;\n\tNDIS_802_11_PMKID_VALUE PMKID;\n\tUCHAR PMK[32];\n\tULONG RefreshTime;\n\tBOOLEAN Valid;\n} AP_BSSID_INFO, *PAP_BSSID_INFO;\n\n#define MAX_PMKID_COUNT\t\t8\ntypedef struct _NDIS_AP_802_11_PMKID {\n\tAP_BSSID_INFO BSSIDInfo[MAX_PMKID_COUNT];\n} NDIS_AP_802_11_PMKID, *PNDIS_AP_802_11_PMKID;\n#endif /* CONFIG_AP_SUPPORT */\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION {\n\tNDIS_802_11_AUTHENTICATION_MODE AuthModeSupported;\n\tNDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported;\n} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION;\n\ntypedef struct _NDIS_802_11_CAPABILITY {\n\tULONG Length;\n\tULONG Version;\n\tULONG NoOfPMKIDs;\n\tULONG NoOfAuthEncryptPairsSupported;\n\tNDIS_802_11_AUTHENTICATION_ENCRYPTION\n\t    AuthenticationEncryptionSupported[1];\n} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY;\n\n\n\n#ifdef DBG\n/*\n\tWhen use private ioctl oid get/set the configuration, we can use following flags to provide specific rules when handle the cmd\n */\n#define RTPRIV_IOCTL_FLAG_UI\t\t\t0x0001\t/* Notidy this private cmd send by UI. */\n#define RTPRIV_IOCTL_FLAG_NODUMPMSG\t0x0002\t/* Notify driver cannot dump msg to stdio/stdout when run this private ioctl cmd */\n#define RTPRIV_IOCTL_FLAG_NOSPACE\t\t0x0004\t/* Notify driver didn't need copy msg to caller due to the caller didn't reserve space for this cmd */\n#endif /* DBG */\n\n\n#ifdef SNMP_SUPPORT\n/*SNMP ieee 802dot11 , 2008_0220 */\n/* dot11res(3) */\n#define RT_OID_802_11_MANUFACTUREROUI\t\t\t0x0700\n#define RT_OID_802_11_MANUFACTURERNAME\t\t\t0x0701\n#define RT_OID_802_11_RESOURCETYPEIDNAME\t\t0x0702\n\n/* dot11smt(1) */\n#define RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED\t0x0703\n#define RT_OID_802_11_POWERMANAGEMENTMODE\t\t0x0704\n#define OID_802_11_WEPDEFAULTKEYVALUE\t\t\t0x0705\t/* read , write */\n#define OID_802_11_WEPDEFAULTKEYID\t\t\t\t0x0706\n#define RT_OID_802_11_WEPKEYMAPPINGLENGTH\t\t0x0707\n#define OID_802_11_SHORTRETRYLIMIT\t\t\t\t0x0708\n#define OID_802_11_LONGRETRYLIMIT\t\t\t\t0x0709\n#define RT_OID_802_11_PRODUCTID\t\t\t\t\t0x0710\n#define RT_OID_802_11_MANUFACTUREID\t\t\t\t0x0711\n\n#endif /* SNMP_SUPPORT */\n\n/* //dot11Phy(4) */\n#define OID_802_11_CURRENTCHANNEL\t\t\t\t0x0712\n\n/*dot11mac */\n#define RT_OID_802_11_MAC_ADDRESS\t\t\t\t0x0713\n#define OID_802_11_BUILD_CHANNEL_EX\t\t\t\t0x0714\n#define OID_802_11_GET_CH_LIST\t\t\t\t\t0x0715\n#define OID_802_11_GET_COUNTRY_CODE\t\t\t\t0x0716\n#define OID_802_11_GET_CHANNEL_GEOGRAPHY\t\t0x0717\n\n/*#define RT_OID_802_11_STATISTICS              (OID_GET_SET_TOGGLE | OID_802_11_STATISTICS) */\n\n\n\n#ifdef WSC_INCLUDED\n#define RT_OID_WAC_REQ\t\t\t\t\t\t\t\t0x0736\n#define\tRT_OID_WSC_AUTO_PROVISION_WITH_BSSID\t\t0x0737\n#define\tRT_OID_WSC_AUTO_PROVISION\t\t\t\t\t0x0738\n#ifdef WSC_LED_SUPPORT\n/*WPS LED MODE 10 for Dlink WPS LED */\n#define RT_OID_LED_WPS_MODE10\t\t\t\t\t\t0x0739\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n#ifdef CONFIG_STA_SUPPORT\n#define RT_OID_WSC_SET_PASSPHRASE                   0x0740\t/* passphrase for wpa(2)-psk */\n#define RT_OID_WSC_DRIVER_AUTO_CONNECT              0x0741\n#define RT_OID_WSC_QUERY_DEFAULT_PROFILE            0x0742\n#define RT_OID_WSC_SET_CONN_BY_PROFILE_INDEX        0x0743\n#define RT_OID_WSC_SET_ACTION                       0x0744\n#define RT_OID_WSC_SET_SSID                         0x0745\n#define RT_OID_WSC_SET_PIN_CODE                     0x0746\n#define RT_OID_WSC_SET_MODE                         0x0747\t/* PIN or PBC */\n#define RT_OID_WSC_SET_CONF_MODE                    0x0748\t/* Enrollee or Registrar */\n#define RT_OID_WSC_SET_PROFILE                      0x0749\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n#define RT_OID_APCLI_WSC_PIN_CODE\t\t\t\t\t0x074A\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#define\tRT_OID_WSC_FRAGMENT_SIZE\t\t\t\t\t0x074D\n#define\tRT_OID_WSC_V2_SUPPORT\t\t\t\t\t\t0x074E\n#define\tRT_OID_WSC_CONFIG_STATUS\t\t\t\t\t0x074F\n#define RT_OID_802_11_WSC_QUERY_PROFILE\t\t\t\t0x0750\n/* for consistency with RT61 */\n#define RT_OID_WSC_QUERY_STATUS\t\t\t\t\t\t0x0751\n#define RT_OID_WSC_PIN_CODE\t\t\t\t\t\t\t0x0752\n#define RT_OID_WSC_UUID\t\t\t\t\t\t\t\t0x0753\n#define RT_OID_WSC_SET_SELECTED_REGISTRAR\t\t\t0x0754\n#define RT_OID_WSC_EAPMSG\t\t\t\t\t\t\t0x0755\n#define RT_OID_WSC_MANUFACTURER\t\t\t\t\t\t0x0756\n#define RT_OID_WSC_MODEL_NAME\t\t\t\t\t\t0x0757\n#define RT_OID_WSC_MODEL_NO\t\t\t\t\t\t\t0x0758\n#define RT_OID_WSC_SERIAL_NO\t\t\t\t\t\t0x0759\n#define RT_OID_WSC_READ_UFD_FILE\t\t\t\t\t0x075A\n#define RT_OID_WSC_WRITE_UFD_FILE\t\t\t\t\t0x075B\n#define RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING\t\t0x075C\n#define RT_OID_WSC_MAC_ADDRESS\t\t\t\t\t\t0x0760\n\n#ifdef LLTD_SUPPORT\n/* for consistency with RT61 */\n#define RT_OID_GET_PHY_MODE                         0x761\n#ifdef CONFIG_AP_SUPPORT\n#define RT_OID_GET_LLTD_ASSO_TABLE                  0x762\n#ifdef APCLI_SUPPORT\n#define RT_OID_GET_REPEATER_AP_LINEAGE\t\t\t\t0x763\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* LLTD_SUPPORT */\n\n\n\n\n/* New for MeetingHouse Api support */\n#define OID_MH_802_1X_SUPPORTED               0xFFEDC100\n\n/* MIMO Tx parameter, ShortGI, MCS, STBC, etc.  these are fields in TXWI. Don't change this definition!!! */\n#ifdef RT65xx\ntypedef union _HTTRANSMIT_SETTING {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUSHORT MODE:3;\t/* Use definition MODE_xxx. */\n\t\tUSHORT iTxBF:1;\n\t\tUSHORT eTxBF:1;\n\t\tUSHORT STBC:1;\t/* only support in HT/VHT mode with MCS0~7 */\n\t\tUSHORT ShortGI:1;\n\t\tUSHORT BW:2;\t/* channel bandwidth 20MHz/40/80 MHz */\n\t\tUSHORT MCS:7;\t/* MCS */\n\t} field;\n#else\n\tstruct {\n\t\tUSHORT MCS:7;\n\t\tUSHORT BW:2;\n\t\tUSHORT ShortGI:1;\n\t\tUSHORT STBC:1;\n\t\tUSHORT eTxBF:1;\n\t\tUSHORT iTxBF:1;\n\t\tUSHORT MODE:3;\n\t} field;\n#endif\n\tUSHORT word;\n} HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING;\n#else\ntypedef union _HTTRANSMIT_SETTING {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUSHORT MODE:2;\t/* Use definition MODE_xxx. */\n\t\tUSHORT iTxBF:1;\n\t\tUSHORT rsv:1;\n\t\tUSHORT eTxBF:1;\n\t\tUSHORT STBC:2;\t/*SPACE */\n\t\tUSHORT ShortGI:1;\n\t\tUSHORT BW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\t\tUSHORT MCS:7;\t/* MCS */\n\t} field;\n#else\n\tstruct {\n\t\tUSHORT MCS:7;\t/* MCS */\n\t\tUSHORT BW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\t\tUSHORT ShortGI:1;\n\t\tUSHORT STBC:2;\t/*SPACE */\n\t\tUSHORT eTxBF:1;\n\t\tUSHORT rsv:1;\n\t\tUSHORT iTxBF:1;\n\t\tUSHORT MODE:2;\t/* Use definition MODE_xxx. */\n\t} field;\n#endif\n\tUSHORT word;\n} HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING;\n#endif /* RT65xx */\n\ntypedef enum _RT_802_11_PREAMBLE {\n\tRt802_11PreambleLong,\n\tRt802_11PreambleShort,\n\tRt802_11PreambleAuto\n} RT_802_11_PREAMBLE, *PRT_802_11_PREAMBLE;\n\ntypedef enum _RT_802_11_PHY_MODE {\n\tPHY_11BG_MIXED = 0,\n\tPHY_11B = 1,\n\tPHY_11A = 2,\n\tPHY_11ABG_MIXED = 3,\n\tPHY_11G = 4,\n#ifdef DOT11_N_SUPPORT\n\tPHY_11ABGN_MIXED = 5,\t/* both band   5 */\n\tPHY_11N_2_4G = 6,\t\t/* 11n-only with 2.4G band      6 */\n\tPHY_11GN_MIXED = 7,\t\t/* 2.4G band      7 */\n\tPHY_11AN_MIXED = 8,\t\t/* 5G  band       8 */\n\tPHY_11BGN_MIXED = 9,\t/* if check 802.11b.      9 */\n\tPHY_11AGN_MIXED = 10,\t/* if check 802.11b.      10 */\n\tPHY_11N_5G = 11,\t\t/* 11n-only with 5G band                11 */\n#endif /* DOT11_N_SUPPORT */\n#ifdef DOT11_VHT_AC\n\tPHY_11VHT_N_ABG_MIXED = 12, /* 12 -> AC/A/AN/B/G/GN mixed */\n\tPHY_11VHT_N_AG_MIXED = 13, /* 13 -> AC/A/AN/G/GN mixed  */\n\tPHY_11VHT_N_A_MIXED = 14, /* 14 -> AC/AN/A mixed in 5G band */\n\tPHY_11VHT_N_MIXED = 15, /* 15 -> AC/AN mixed in 5G band */\n#endif /* DOT11_VHT_AC */\n\tPHY_MODE_MAX,\n} RT_802_11_PHY_MODE;\n\n#ifdef DOT11_VHT_AC\n#define PHY_MODE_IS_5G_BAND(__Mode)\t\\\n\t((__Mode == PHY_11A) ||\t\t\t\\\n\t(__Mode == PHY_11ABG_MIXED) ||\t\\\n\t(__Mode == PHY_11ABGN_MIXED) ||\t\\\n\t(__Mode == PHY_11AN_MIXED) ||\t\\\n\t(__Mode == PHY_11AGN_MIXED) ||\t\\\n\t(__Mode == PHY_11N_5G) ||\\\n\t(__Mode == PHY_11VHT_N_MIXED) ||\\\n\t(__Mode == PHY_11VHT_N_A_MIXED))\n#elif defined(DOT11_N_SUPPORT)\n#define PHY_MODE_IS_5G_BAND(__Mode)\t\\\n\t((__Mode == PHY_11A) ||\t\t\t\\\n\t(__Mode == PHY_11ABG_MIXED) ||\t\\\n\t(__Mode == PHY_11ABGN_MIXED) ||\t\\\n\t(__Mode == PHY_11AN_MIXED) ||\t\\\n\t(__Mode == PHY_11AGN_MIXED) ||\t\\\n\t(__Mode == PHY_11N_5G))\n#else\n\n#define PHY_MODE_IS_5G_BAND(__Mode)\t\\\n\t((__Mode == PHY_11A) ||\t\t\t\\\n\t(__Mode == PHY_11ABG_MIXED))\n#endif /* DOT11_N_SUPPORT */\n\n/* put all proprietery for-query objects here to reduce # of Query_OID */\ntypedef struct _RT_802_11_LINK_STATUS {\n\tULONG CurrTxRate;\t/* in units of 0.5Mbps */\n\tULONG ChannelQuality;\t/* 0..100 % */\n\tULONG TxByteCount;\t/* both ok and fail */\n\tULONG RxByteCount;\t/* both ok and fail */\n\tULONG CentralChannel;\t/* 40MHz central channel number */\n} RT_802_11_LINK_STATUS, *PRT_802_11_LINK_STATUS;\n\n#ifdef SYSTEM_LOG_SUPPORT\ntypedef struct _RT_802_11_EVENT_LOG {\n\tLARGE_INTEGER SystemTime;\t/* timestammp via NdisGetCurrentSystemTime() */\n\tUCHAR Addr[MAC_ADDR_LENGTH];\n\tUSHORT Event;\t\t/* EVENT_xxx */\n} RT_802_11_EVENT_LOG, *PRT_802_11_EVENT_LOG;\n\ntypedef struct _RT_802_11_EVENT_TABLE {\n\tULONG Num;\n\tULONG Rsv;\t\t/* to align Log[] at LARGE_INEGER boundary */\n\tRT_802_11_EVENT_LOG Log[MAX_NUMBER_OF_EVENT];\n} RT_802_11_EVENT_TABLE, *PRT_802_11_EVENT_TABLE;\n#endif /* SYSTEM_LOG_SUPPORT */\n\n/* MIMO Tx parameter, ShortGI, MCS, STBC, etc.  these are fields in TXWI. Don't change this definition!!! */\ntypedef union _MACHTTRANSMIT_SETTING {\n\tstruct {\n\t\tUSHORT MCS:7;\t/* MCS */\n\t\tUSHORT BW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\t\tUSHORT ShortGI:1;\n\t\tUSHORT STBC:2;\t/*SPACE */\n\t\tUSHORT rsv:3;\n\t\tUSHORT MODE:2;\t/* Use definition MODE_xxx. */\n\t} field;\n\tUSHORT word;\n} MACHTTRANSMIT_SETTING, *PMACHTTRANSMIT_SETTING;\n\ntypedef struct _RT_802_11_MAC_ENTRY {\n\tUCHAR ApIdx;\n\tUCHAR Addr[MAC_ADDR_LENGTH];\n\tUCHAR Aid;\n\tUCHAR Psm;\t\t/* 0:PWR_ACTIVE, 1:PWR_SAVE */\n\tUCHAR MimoPs;\t\t/* 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled */\n\tCHAR AvgRssi0;\n\tCHAR AvgRssi1;\n\tCHAR AvgRssi2;\n\tUINT32 ConnectedTime;\n\tMACHTTRANSMIT_SETTING TxRate;\n} RT_802_11_MAC_ENTRY, *PRT_802_11_MAC_ENTRY;\n\ntypedef struct _RT_802_11_MAC_TABLE {\n\tULONG Num;\n\tRT_802_11_MAC_ENTRY Entry[MAX_NUMBER_OF_MAC];\n} RT_802_11_MAC_TABLE, *PRT_802_11_MAC_TABLE;\n\n#ifdef DOT11_N_SUPPORT\n#ifdef TXBF_SUPPORT\ntypedef\n    struct {\n\tULONG TxSuccessCount;\n\tULONG TxRetryCount;\n\tULONG TxFailCount;\n\tULONG ETxSuccessCount;\n\tULONG ETxRetryCount;\n\tULONG ETxFailCount;\n\tULONG ITxSuccessCount;\n\tULONG ITxRetryCount;\n\tULONG ITxFailCount;\n} RT_COUNTER_TXBF;\n\ntypedef\n    struct {\n\tULONG Num;\n\tRT_COUNTER_TXBF Entry[MAX_NUMBER_OF_MAC];\n} RT_802_11_TXBF_TABLE;\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n/* structure for query/set hardware register - MAC, BBP, RF register */\ntypedef struct _RT_802_11_HARDWARE_REGISTER {\n\tULONG HardwareType;\t/* 0:MAC, 1:BBP, 2:RF register, 3:EEPROM */\n\tULONG Offset;\t\t/* Q/S register offset addr */\n\tULONG Data;\t\t/* R/W data buffer */\n} RT_802_11_HARDWARE_REGISTER, *PRT_802_11_HARDWARE_REGISTER;\n\ntypedef struct _RT_802_11_AP_CONFIG {\n\tULONG EnableTxBurst;\t/* 0-disable, 1-enable */\n\tULONG EnableTurboRate;\t/* 0-disable, 1-enable 72/100mbps turbo rate */\n\tULONG IsolateInterStaTraffic;\t/* 0-disable, 1-enable isolation */\n\tULONG HideSsid;\t\t/* 0-disable, 1-enable hiding */\n\tULONG UseBGProtection;\t/* 0-AUTO, 1-always ON, 2-always OFF */\n\tULONG UseShortSlotTime;\t/* 0-no use, 1-use 9-us short slot time */\n\tULONG Rsv1;\t\t/* must be 0 */\n\tULONG SystemErrorBitmap;\t/* ignore upon SET, return system error upon QUERY */\n} RT_802_11_AP_CONFIG, *PRT_802_11_AP_CONFIG;\n\n/* structure to query/set STA_CONFIG */\ntypedef struct _RT_802_11_STA_CONFIG {\n\tULONG EnableTxBurst;\t/* 0-disable, 1-enable */\n\tULONG EnableTurboRate;\t/* 0-disable, 1-enable 72/100mbps turbo rate */\n\tULONG UseBGProtection;\t/* 0-AUTO, 1-always ON, 2-always OFF */\n\tULONG UseShortSlotTime;\t/* 0-no use, 1-use 9-us short slot time when applicable */\n\tULONG AdhocMode;\t/* 0-11b rates only (WIFI spec), 1 - b/g mixed, 2 - g only */\n\tULONG HwRadioStatus;\t/* 0-OFF, 1-ON, default is 1, Read-Only */\n\tULONG Rsv1;\t\t/* must be 0 */\n\tULONG SystemErrorBitmap;\t/* ignore upon SET, return system error upon QUERY */\n} RT_802_11_STA_CONFIG, *PRT_802_11_STA_CONFIG;\n\n/* */\n/*  For OID Query or Set about BA structure */\n/* */\ntypedef struct _OID_BACAP_STRUC {\n\tUCHAR RxBAWinLimit;\n\tUCHAR TxBAWinLimit;\n\tUCHAR Policy;\t\t/* 0: DELAY_BA 1:IMMED_BA  (//BA Policy subfiled value in ADDBA frame)   2:BA-not use. other value invalid */\n\tUCHAR MpduDensity;\t/* 0: DELAY_BA 1:IMMED_BA  (//BA Policy subfiled value in ADDBA frame)   2:BA-not use. other value invalid */\n\tUCHAR AmsduEnable;\t/*Enable AMSDU transmisstion */\n\tUCHAR AmsduSize;\t/* 0:3839, 1:7935 bytes. UINT  MSDUSizeToBytes[]        = { 3839, 7935}; */\n\tUCHAR MMPSmode;\t\t/* MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable */\n\tBOOLEAN AutoBA;\t\t/* Auto BA will automatically */\n} OID_BACAP_STRUC, *POID_BACAP_STRUC;\n\ntypedef struct _RT_802_11_ACL_ENTRY {\n\tUCHAR Addr[MAC_ADDR_LENGTH];\n\tUSHORT Rsv;\n} RT_802_11_ACL_ENTRY, *PRT_802_11_ACL_ENTRY;\n\ntypedef struct GNU_PACKED _RT_802_11_ACL {\n\tULONG Policy;\t\t/* 0-disable, 1-positive list, 2-negative list */\n\tULONG Num;\n\tRT_802_11_ACL_ENTRY Entry[MAX_NUMBER_OF_ACL];\n} RT_802_11_ACL, *PRT_802_11_ACL;\n\ntypedef struct _RT_802_11_WDS {\n\tULONG Num;\n\tNDIS_802_11_MAC_ADDRESS Entry[24 /*MAX_NUM_OF_WDS_LINK */ ];\n\tULONG KeyLength;\n\tUCHAR KeyMaterial[32];\n} RT_802_11_WDS, *PRT_802_11_WDS;\n\ntypedef struct _RT_802_11_TX_RATES_ {\n\tUCHAR SupRateLen;\n\tUCHAR SupRate[MAX_LENGTH_OF_SUPPORT_RATES];\n\tUCHAR ExtRateLen;\n\tUCHAR ExtRate[MAX_LENGTH_OF_SUPPORT_RATES];\n} RT_802_11_TX_RATES, *PRT_802_11_TX_RATES;\n\n/* Definition of extra information code */\n#define\tGENERAL_LINK_UP\t\t\t0x0\t/* Link is Up */\n#define\tGENERAL_LINK_DOWN\t\t0x1\t/* Link is Down */\n#define\tHW_RADIO_OFF\t\t\t0x2\t/* Hardware radio off */\n#define\tSW_RADIO_OFF\t\t\t0x3\t/* Software radio off */\n#define\tAUTH_FAIL\t\t\t\t0x4\t/* Open authentication fail */\n#define\tAUTH_FAIL_KEYS\t\t\t0x5\t/* Shared authentication fail */\n#define\tASSOC_FAIL\t\t\t\t0x6\t/* Association failed */\n#define\tEAP_MIC_FAILURE\t\t\t0x7\t/* Deauthencation because MIC failure */\n#define\tEAP_4WAY_TIMEOUT\t\t0x8\t/* Deauthencation on 4-way handshake timeout */\n#define\tEAP_GROUP_KEY_TIMEOUT\t0x9\t/* Deauthencation on group key handshake timeout */\n#define\tEAP_SUCCESS\t\t\t\t0xa\t/* EAP succeed */\n#define\tDETECT_RADAR_SIGNAL\t\t0xb\t/* Radar signal occur in current channel */\n#define EXTRA_INFO_MAX\t\t\t0xb\t/* Indicate Last OID */\n\n#define EXTRA_INFO_CLEAR\t\t0xffffffff\n\n/* This is OID setting structure. So only GF or MM as Mode. This is valid when our wirelss mode has 802.11n in use. */\ntypedef struct {\n\tRT_802_11_PHY_MODE PhyMode;\t/* */\n\tUCHAR TransmitNo;\n\tUCHAR HtMode;\t\t/*HTMODE_GF or HTMODE_MM */\n\tUCHAR ExtOffset;\t/*extension channel above or below */\n\tUCHAR MCS;\n\tUCHAR BW;\n\tUCHAR STBC;\n\tUCHAR SHORTGI;\n\tUCHAR rsv;\n} OID_SET_HT_PHYMODE, *POID_SET_HT_PHYMODE;\n\n\n#ifdef LLTD_SUPPORT\ntypedef struct _RT_LLTD_ASSOICATION_ENTRY {\n\tUCHAR Addr[ETH_LENGTH_OF_ADDRESS];\n\tunsigned short MOR;\t/* maximum operational rate */\n\tUCHAR phyMode;\n} RT_LLTD_ASSOICATION_ENTRY, *PRT_LLTD_ASSOICATION_ENTRY;\n\ntypedef struct _RT_LLTD_ASSOICATION_TABLE {\n\tunsigned int Num;\n\tRT_LLTD_ASSOICATION_ENTRY Entry[MAX_NUMBER_OF_MAC];\n} RT_LLTD_ASSOICATION_TABLE, *PRT_LLTD_ASSOICATION_TABLE;\n#endif /* LLTD_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\n/*rt2860, 2007-0118 */\n/* structure for DLS */\ntypedef struct _RT_802_11_DLS_UI {\n\tUSHORT TimeOut;\t\t/* unit: second , set by UI */\n\tUSHORT CountDownTimer;\t/* unit: second , used by driver only */\n\tNDIS_802_11_MAC_ADDRESS MacAddr;\t/* set by UI */\n\tUCHAR Status;\t\t/* 0: none , 1: wait STAkey, 2: finish DLS setup , set by driver only */\n\tBOOLEAN Valid;\t\t/* 1: valid , 0: invalid , set by UI, use to setup or tear down DLS link */\n} RT_802_11_DLS_UI, *PRT_802_11_DLS_UI;\n\ntypedef struct _RT_802_11_DLS_INFO {\n\tRT_802_11_DLS_UI Entry[MAX_NUMBER_OF_DLS_ENTRY];\n\tUCHAR num;\n} RT_802_11_DLS_INFO, *PRT_802_11_DLS_INFO;\n\ntypedef enum _RT_802_11_DLS_MODE {\n\tDLS_NONE,\n\tDLS_WAIT_KEY,\n\tDLS_FINISH\n} RT_802_11_DLS_MODE;\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\ntypedef struct _RT_802_11_TDLS_UI {\n\tUSHORT TimeOut;\t\t/* unit: second , set by UI */\n\tUSHORT CountDownTimer;\t/* unit: second , used by driver only */\n\tNDIS_802_11_MAC_ADDRESS MacAddr;\t/* set by UI */\n\tUCHAR Status;\t\t/* 0: none , 1: wait STAkey, 2: finish DLS setup , set by driver only */\n\tBOOLEAN Valid;\t\t/* 1: valid , 0: invalid , set by UI, use to setup or tear down DLS link */\n} RT_802_11_TDLS_UI, *PRT_802_11_TDLS_UI;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#define RT_WSC_UPNP_EVENT_FLAG\t\t0x109\n#endif /* WSC_INCLUDED */\n\n\n\n/*#define MAX_CUSTOM_LEN 128 */\n\n#ifdef CONFIG_STA_SUPPORT\ntypedef enum _RT_802_11_D_CLIENT_MODE {\n\tRt802_11_D_None,\n\tRt802_11_D_Flexible,\n\tRt802_11_D_Strict,\n} RT_802_11_D_CLIENT_MODE, *PRT_802_11_D_CLIENT_MODE;\n#endif /* CONFIG_STA_SUPPORT */\n\ntypedef struct _RT_CHANNEL_LIST_INFO {\n\tUCHAR ChannelList[MAX_NUM_OF_CHS];\t/* list all supported channels for site survey */\n\tUCHAR ChannelListNum;\t/* number of channel in ChannelList[] */\n} RT_CHANNEL_LIST_INFO, *PRT_CHANNEL_LIST_INFO;\n\n#ifdef IWSC_SUPPORT\n#define IWSC_MAX_SUB_MASK_LIST_COUNT\t3\n#endif /* IWSC_SUPPORT */\n\n/* WSC configured credential */\ntypedef struct _WSC_CREDENTIAL {\n\tNDIS_802_11_SSID SSID;\t/* mandatory */\n\tUSHORT AuthType;\t/* mandatory, 1: open, 2: wpa-psk, 4: shared, 8:wpa, 0x10: wpa2, 0x20: wpa2-psk */\n\tUSHORT EncrType;\t/* mandatory, 1: none, 2: wep, 4: tkip, 8: aes */\n\tUCHAR Key[64];\t\t/* mandatory, Maximum 64 byte */\n\tUSHORT KeyLength;\n\tUCHAR MacAddr[MAC_ADDR_LENGTH];\t/* mandatory, AP MAC address */\n\tUCHAR KeyIndex;\t\t/* optional, default is 1 */\n\tUCHAR bFromUPnP;\t/* TRUE: This credential is from external UPnP registrar */\n\tUCHAR Rsvd[2];\t\t/* Make alignment */\n#ifdef IWSC_SUPPORT\n\tUSHORT\t\t\t\tIpConfigMethod;\n\tUINT32\t\t\t\tRegIpv4Addr;\n\tUINT32\t\t\t\tIpv4SubMask;\n\tUINT32\t\t\t\tEnrIpv4Addr;\n\tUINT32\t\t\t\tAvaIpv4SubmaskList[IWSC_MAX_SUB_MASK_LIST_COUNT];\n#endif /* IWSC_SUPPORT */\n} WSC_CREDENTIAL, *PWSC_CREDENTIAL;\n\n/* WSC configured profiles */\ntypedef struct _WSC_PROFILE {\n\tUINT ProfileCnt;\n\tUINT ApplyProfileIdx;\t/* add by johnli, fix WPS test plan 5.1.1 */\n\tWSC_CREDENTIAL Profile[8];\t/* Support up to 8 profiles */\n} WSC_PROFILE, *PWSC_PROFILE;\n\n#ifdef WAPI_SUPPORT\ntypedef enum _WAPI_PORT_SECURE_STATE {\n\tWAPI_PORT_NOT_SECURED,\n\tWAPI_PORT_SECURED,\n} WAPI_PORT_SECURE_STATE, *PWAPI_PORT_SECURE_STATE;\n\ntypedef struct _WAPI_PORT_SECURE_STRUCT {\n\tUCHAR Addr[MAC_ADDR_LENGTH];\n\tUSHORT state;\n} WAPI_PORT_SECURE_STRUCT, *PWAPI_PORT_SECURE_STRUCT;\n\ntypedef struct _WAPI_UCAST_KEY_STRUCT {\n\tUCHAR Addr[MAC_ADDR_LENGTH];\n\tUSHORT key_id;\n\tUCHAR PTK[64];\t\t/* unicast and additional key */\n} WAPI_UCAST_KEY_STRUCT, *PWAPI_UCAST_KEY_STRUCT;\n\ntypedef struct _WAPI_MCAST_KEY_STRUCT {\n\tUINT32 key_id;\n\tUCHAR m_tx_iv[16];\n\tUCHAR key_announce[16];\n\tUCHAR NMK[16];\t\t/* notify master key */\n} WAPI_MCAST_KEY_STRUCT, *PWAPI_MCAST_KEY_STRUCT;\n\ntypedef struct _WAPI_WIE_STRUCT {\n\tUCHAR addr[6];\n\tUINT32 wie_len;\n\tUCHAR wie[90];\t\t/* wapi information element */\n} WAPI_WIE_STRUCT, *PWAPI_WIE_STRUCT;\n\n#endif /* WAPI_SUPPORT */\n\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n#define\tRT_ASSOC_EVENT_FLAG                         0x0101\n#define\tRT_DISASSOC_EVENT_FLAG                      0x0102\n#define\tRT_REQIE_EVENT_FLAG                         0x0103\n#define\tRT_RESPIE_EVENT_FLAG                        0x0104\n#define\tRT_ASSOCINFO_EVENT_FLAG                     0x0105\n#define RT_PMKIDCAND_FLAG                           0x0106\n#define RT_INTERFACE_DOWN                           0x0107\n#define RT_INTERFACE_UP                             0x0108\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n\n#ifdef P2P_SUPPORT\n/* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n#define RT_P2P_DEVICE_FIND\t\t\t\t\t\t\t0x010A\n#define RT_P2P_RECV_PROV_REQ\t\t\t\t\t\t\t0x010B\n#define RT_P2P_RECV_PROV_RSP\t\t\t\t\t\t\t0x010C\n#define RT_P2P_RECV_INVITE_REQ\t\t\t\t\t\t\t0x010D\n#define RT_P2P_RECV_INVITE_RSP\t\t\t\t\t\t\t0x010E\n#define RT_P2P_RECV_GO_NEGO_REQ\t\t\t\t\t\t\t0x010F\n#define RT_P2P_RECV_GO_NEGO_RSP\t\t\t\t\t\t\t0x0110\n#define RT_P2P_GO_NEG_COMPLETED\t\t\t\t\t\t0x0111\n#define RT_P2P_GO_NEG_FAIL\t\t\t\t\t\t0x0112\n#define RT_P2P_WPS_COMPLETED\t\t\t\t\t\t0x0113\n#define RT_P2P_CONNECTED\t\t\t\t\t\t\t0x0114\n#define RT_P2P_DISCONNECTED\t\t\t\t\t\t\t0x0115\n#define RT_P2P_CONNECT_FAIL\t\t\t\t\t\t\t0x0116\n#define RT_P2P_LEGACY_CONNECTED\t\t\t\t\t0x0117\n#define RT_P2P_LEGACY_DISCONNECTED\t\t\t\t\t0x0118\n#define RT_P2P_AP_STA_CONNECTED\t\t\t\t\t0x0119\n#define RT_P2P_AP_STA_DISCONNECTED\t\t\t\t\t0x011A\n#define RT_P2P_DEVICE_TABLE_ITEM_DELETE\t\t\t\t0x011B\n#define RT_P2P_GO_NEGO_FAIL_INTENT\t\t\t\t\t0x011C\n/* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n#define OID_802_11_P2P_MODE\t0x0801\n#define OID_802_11_P2P_DEVICE_NAME\t\t\t0x0802\n#define OID_802_11_P2P_LISTEN_CHANNEL\t\t0x0803\n#define OID_802_11_P2P_OPERATION_CHANNEL\t\t0x0804\n#define OID_802_11_P2P_DEV_ADDR\t\t0x0805\n#define OID_802_11_P2P_SCAN_LIST\t\t0x0806\n#define OID_802_11_P2P_GO_INT\t\t0x080c\n\n#define OID_802_11_P2P_CTRL_STATUS\t\t0x0807\n#define OID_802_11_P2P_DISC_STATUS\t\t0x0808\n#define OID_802_11_P2P_GOFORM_STATUS\t\t0x0809\n#define OID_P2P_WSC_PIN_CODE\t\t0x080a\n#define OID_802_11_P2P_CLEAN_TABLE\t\t0x080b\n#define OID_802_11_P2P_SCAN\t\t0x080d\n#define OID_802_11_P2P_WscMode\t\t0x080e\n#define OID_802_11_P2P_WscConf\t\t0x080f\n/* 0x0810 ~ 0x0814 Reserved for iNIC USERDEF_GPIO_SUPPORT */\n/* 0x0820 ~ 0x0822 Reserved for iNIC USERDEF_GPIO_SUPPORT */\n#define OID_802_11_P2P_Link\t\t\t\t\t\t\t\t0x0830\n#define OID_802_11_P2P_Connected_MAC\t\t\t\t\t0x0831\n#define OID_P2P_OFFSET\t\t\t\t\t\t0x0000\n#define OID_802_11_P2P_RESET\t\t\t\t(0x0832 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_SIGMA_ENABLE\t\t\t(0x0833 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_SSID\t\t\t\t\t(0x0834 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_CONNECT_ADDR\t\t\t(0x0835 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_CONNECT_STATUS\t\t(0x0836 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PEER_GROUP_ID\t\t(0x0837 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_ENTER_PIN\t\t\t\t\t(0x0838 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PROVISION\t\t\t\t\t(0x0839 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_DEL_CLIENT\t\t\t\t\t(0x083a + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PASSPHRASE\t\t\t\t\t(0x0840 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_ASSOCIATE_TAB\t\t\t\t(0x0841 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PROVISION_MAC\t\t\t\t(0x0842 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_LINK_DOWN\t\t\t\t\t\t(0x0843 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PRI_DEVICE_TYPE\t\t\t\t(0x0844 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_INVITE\t\t\t\t\t\t\t(0x0845 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PERSISTENT_TABLE\t\t\t\t(0x0846 + OID_P2P_OFFSET)\n#define OID_DELETE_PERSISTENT_TABLE          \t\t\t\t(0x0847 + OID_P2P_OFFSET)\n/* If p2p0 is Go, please use following OID to trigger WPS with None-P2P STA */\n#define OID_802_11_P2P_TRIGGER_WSC\t\t\t\t\t\t(0x0848 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_WSC_CONF_MODE\t\t\t\t\t\t(0x0849 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PERSISTENT_ENABLE            (0x084a + OID_P2P_OFFSET)\n#define OID_802_11_P2P_WSC_MODE\t\t\t\t\t\t(0x0850 + OID_P2P_OFFSET)\n#define OID_802_11_P2P_PIN_CODE\t\t\t\t\t\t(0x0851 + OID_P2P_OFFSET)\n\n#ifdef WFD_SUPPORT\n#define OID_802_11_WFD_ENABLE\t\t\t\t\t\t(0x0859 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_DEVICE_TYPE\t\t\t\t(0x0860 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_SOURCE_COUPLED\t\t\t(0x0861 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_SINK_COUPLED\t\t\t\t(0x0862 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_SESSION_AVAILABLE \t\t(0x0863 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_RTSP_PORT\t\t\t\t\t(0x0864 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_MAX_THROUGHPUT\t\t\t(0x0865 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_SESSION_ID\t\t\t\t(0x0866 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_PEER_RTSP_PORT\t\t\t(0x0867 + OID_P2P_OFFSET)\n#define RT_OID_802_11_QUERY_WFD_TDLS_CONNECT_STATUS       (0x0868 + OID_P2P_OFFSET)\n#define RT_OID_802_11_QUERY_WFD_TDLS_PEER_IP_ADDR    (0x0869 + OID_P2P_OFFSET)\n#define OID_802_11_WFD_CONTENT_PROTECT\t\t\t(0x086a + OID_P2P_OFFSET)\n\n#define OID_802_11_WFD_DEV_LIST\t\t\t\t\t\t(0x0870 + OID_P2P_OFFSET)\n#ifdef RT_CFG80211_SUPPORT\n#define OID_802_11_WFD_IE_INSERT\t\t\t\t\t(0x0871 + OID_P2P_OFFSET)\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n#define RT_OID_802_11_P2P_MODE\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_MODE)\n#define RT_OID_802_11_P2P_DEVICE_NAME\t\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_DEVICE_NAME)\n#define RT_OID_802_11_P2P_LISTEN_CHANNEL\t\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_LISTEN_CHANNEL)\n#define RT_OID_802_11_P2P_OPERATION_CHANNEL\t\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_OPERATION_CHANNEL)\n#define RT_OID_802_11_P2P_DEV_ADDR\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_DEV_ADDR)\n#define RT_OID_802_11_P2P_SCAN_LIST\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_SCAN_LIST)\n#define RT_OID_802_11_P2P_CTRL_STATUS\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_CTRL_STATUS)\n#define RT_OID_802_11_P2P_DISC_STATUS\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_DISC_STATUS)\n#define RT_OID_802_11_P2P_GOFORM_STATUS\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_GOFORM_STATUS)\n#define RT_OID_P2P_WSC_PIN_CODE\t(OID_GET_SET_TOGGLE + OID_P2P_WSC_PIN_CODE)\n#define RT_OID_802_11_P2P_CLEAN_TABLE\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_CLEAN_TABLE)\n#define RT_OID_802_11_P2P_GO_INT\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_GO_INT)\n#define RT_OID_802_11_P2P_SCAN\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_SCAN)\n#define RT_OID_802_11_P2P_WscMode\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_WscMode)\n#define RT_OID_802_11_P2P_WscConf\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_WscConf)\n#define RT_OID_802_11_P2P_Link\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_Link)\n#define RT_OID_802_11_P2P_Connected_MAC\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_Connected_MAC)\n#define RT_OID_802_11_P2P_RESET\t(OID_GET_SET_TOGGLE + OID_802_11_P2P_RESET)\n\n\n#define IWEVP2PSHOWPIN \t0x8C05\n#define IWEVP2PKEYPIN \t0x8C06\n\n#endif /* P2P_SUPPORT */\n\n\n\n#ifdef IWSC_SUPPORT\n#define RT_OID_IWSC_SELF_IPV4\t\t\t\t0x0900\n#define RT_OID_IWSC_REGISTRAR_IPV4\t\t\t0x0901\n#define RT_OID_IWSC_SMPBC_ENROLLEE_COUNT\t0x0902\n#endif // IWSC_SUPPORT //\n\n#ifdef RTMP_MAC_USB\n#define RT_OID_USB_WOW_SUSPEND\t\t\t\t0x0920\n#define RT_OID_USB_WOW_RESUME\t\t\t\t0x0921\n#endif /* RTMP_MAC_USB */\n\n#endif /* _OID_H_ */\n"
  },
  {
    "path": "src/include/os/rt_drv.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt_drv.h\n\n    Abstract:\n\tPut all virtual OS related definition/structure/MACRO here except\n\tstandard ANSI C function.\n\n\tNote:\n\tNo any OS related definition/MACRO is defined here.\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n*/\n\n/* same as rt_linux.h to warn users the two files can not be used simultaneously */\n#ifndef __RT_LINUX_H__\n#define __RT_LINUX_H__\n\n#include \"os/rt_linux_cmm.h\"\n#include <linux/string.h>\n#include <linux/ctype.h>\n\n#undef AP_WSC_INCLUDED\n#undef STA_WSC_INCLUDED\n#undef WSC_INCLUDED\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_AP_SUPPORT\n#define AP_WSC_INCLUDED\n#endif /* WSC_AP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\n#define STA_WSC_INCLUDED\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#if defined(WSC_AP_SUPPORT) || defined(WSC_STA_SUPPORT)\n#define WSC_INCLUDED\n#endif\n\n/*#ifdef RTMP_USB_SUPPORT */\ntypedef VOID\t*PUSB_DEV;\ntypedef VOID\t*purbb_t;\ntypedef VOID\tpregs;\n/*typedef struct usb_ctrlrequest devctrlrequest; */\n/*#endif */\n\n/***********************************************************************************\n *\tProfile related sections\n ***********************************************************************************/\n#ifdef CONFIG_AP_SUPPORT\n#ifdef RTMP_MAC_USB\n#ifdef INF_AMAZON_SE\n#define AP_PROFILE_PATH                 \"/ramdisk/etc/Wireless/RT2870AP/RT2870AP.dat\"\n#define AP_RTMP_FIRMWARE_FILE_NAME \"/ramdisk/etc/Wireless/RT2870AP/RT2870AP.bin\"\n#else\n#define AP_PROFILE_PATH\t\t\t\"/etc/Wireless/RT2870AP/RT2870AP.dat\"\n#define AP_RTMP_FIRMWARE_FILE_NAME \"/etc/Wireless/RT2870AP/RT2870AP.bin\"\n#endif\n#define AP_NIC_DEVICE_NAME\t\t\t\"RT2870AP\"\n#define AP_DRIVER_VERSION\t\t\t\"3.0.0.0\"\n#ifdef MULTIPLE_CARD_SUPPORT\n#define CARD_INFO_PATH\t\t\t\"/etc/Wireless/RT2870AP/RT2870APCard.dat\"\n#endif /* MULTIPLE_CARD_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\n#ifdef RTMP_MAC_USB\n#define STA_PROFILE_PATH\t\t\t\"/etc/Wireless/RT2870STA/RT2870STA.dat\"\n#define STA_DRIVER_VERSION\t\t\t\"3.0.0.3\"\n#ifdef MULTIPLE_CARD_SUPPORT\n#define CARD_INFO_PATH\t\t\t\"/etc/Wireless/RT2870STA/RT2870STACard.dat\"\n#endif /* MULTIPLE_CARD_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef SINGLE_SKU_V2\n#define SINGLE_SKU_TABLE_FILE_NAME\t\"/etc/Wireless/RT2870STA/SingleSKU.dat\"\n#endif /* SINGLE_SKU_V2 */\n\n/***********************************************************************************\n *\tCompiler related definitions\n ***********************************************************************************/\n#undef __inline\n#define __inline\t\tstatic inline\n#define IN\n#define OUT\n#define INOUT\n#define NDIS_STATUS\t\tINT\n\n\n/***********************************************************************************\n *\tOS Specific definitions and data structures\n ***********************************************************************************/\ntypedef void\t\t\t\t* PPCI_DEV;\ntypedef void\t\t\t\t* PNET_DEV;\ntypedef void\t\t\t\t* PNDIS_PACKET;\ntypedef char\t\t\t\tNDIS_PACKET;\ntypedef PNDIS_PACKET\t\t* PPNDIS_PACKET;\ntypedef ra_dma_addr_t\t\tNDIS_PHYSICAL_ADDRESS;\ntypedef ra_dma_addr_t\t\t* PNDIS_PHYSICAL_ADDRESS;\ntypedef void\t\t\t\t* NDIS_HANDLE;\ntypedef char \t\t\t\t* PNDIS_BUFFER;\n\n#undef KERN_ERR\n#define KERN_ERR\n\n\n/***********************************************************************************\n *\tNetwork related constant definitions\n ***********************************************************************************/\n#ifndef IFNAMSIZ\n#define IFNAMSIZ 16\n#endif\n\n#define ETH_LENGTH_OF_ADDRESS\t6\n\n#define NDIS_STATUS_SUCCESS                     0x00\n#define NDIS_STATUS_FAILURE                     0x01\n#define NDIS_STATUS_INVALID_DATA\t\t\t\t0x02\n#define NDIS_STATUS_RESOURCES                   0x03\n\n#define NDIS_SET_PACKET_STATUS(_p, _status)\t\t\tdo{} while(0)\n#define NdisWriteErrorLogEntry(_a, _b, _c, _d)\t\tdo{} while(0)\n\n/* statistics counter */\n#define STATS_INC_RX_PACKETS(_pAd, _dev)\n#define STATS_INC_TX_PACKETS(_pAd, _dev)\n\n#define STATS_INC_RX_BYTESS(_pAd, _dev, len)\n#define STATS_INC_TX_BYTESS(_pAd, _dev, len)\n\n#define STATS_INC_RX_ERRORS(_pAd, _dev)\n#define STATS_INC_TX_ERRORS(_pAd, _dev)\n\n#define STATS_INC_RX_DROPPED(_pAd, _dev)\n#define STATS_INC_TX_DROPPED(_pAd, _dev)\n\n\n/***********************************************************************************\n *\tRalink Specific network related constant definitions\n ***********************************************************************************/\n#define MIN_NET_DEVICE_FOR_MBSSID\t\t0x00\t\t/*0x00,0x10,0x20,0x30 */\n#define MIN_NET_DEVICE_FOR_WDS\t\t\t0x10\t\t/*0x40,0x50,0x60,0x70 */\n#define MIN_NET_DEVICE_FOR_APCLI\t\t0x20\n#define MIN_NET_DEVICE_FOR_MESH\t\t\t0x30\n#ifdef CONFIG_STA_SUPPORT\n#define MIN_NET_DEVICE_FOR_DLS\t\t\t0x40\n#define MIN_NET_DEVICE_FOR_TDLS\t\t\t0x50\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef P2P_SUPPORT\n#define MIN_NET_DEVICE_FOR_P2P_CLI\t\t(MIN_NET_DEVICE_FOR_TDLS + 0x10)\n#define MIN_NET_DEVICE_FOR_P2P_GO\t\t\t(MIN_NET_DEVICE_FOR_TDLS + 0x20)\n#endif /* P2P_SUPPORT */\n\n#define NET_DEVICE_REAL_IDX_MASK\t\t0x0f\t\t/* for each operation mode, we maximum support 15 entities. */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#define NDIS_PACKET_TYPE_DIRECTED\t\t0\n#define NDIS_PACKET_TYPE_MULTICAST\t\t1\n#define NDIS_PACKET_TYPE_BROADCAST\t\t2\n#define NDIS_PACKET_TYPE_ALL_MULTICAST\t3\n#define NDIS_PACKET_TYPE_PROMISCUOUS\t4\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/***********************************************************************************\n *\tOS signaling related constant definitions\n ***********************************************************************************/\n\n/***********************************************************************************\n *\tOS file operation related data structure definitions\n ***********************************************************************************/\ntypedef VOID * \t\t\tRTMP_OS_FD;\n\n#define IS_FILE_OPEN_ERR(_fd)\tRtmpOsFileIsErr((_fd))\n\n#ifndef O_RDONLY\n#define O_RDONLY\t\t\tRTMP_FILE_RDONLY\n#endif /* O_RDONLY */\n\n#ifndef O_WRONLY\n#define O_WRONLY\t\t\tRTMP_FILE_WRONLY\n#endif /* O_WRONLY */\n\n#ifndef O_CREAT\n#define O_CREAT\t\t\t\tRTMP_FILE_CREAT\n#endif /* O_CREAT */\n\n#ifndef O_TRUNC\n#define O_TRUNC\t\t\t\tRTMP_FILE_TRUNC\n#endif /* O_TRUNC */\n\n\n/***********************************************************************************\n *\tOS semaphore related data structure and definitions\n ***********************************************************************************/\n#define RTCMDUp\t\t\t\tRtmpOsCmdUp\n\n\n/***********************************************************************************\n *\tOS Memory Access related data structure and definitions\n ***********************************************************************************/\n#define NdisMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length)\n#define NdisCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length)\n#define NdisZeroMemory(Destination, Length)         memset(Destination, 0, Length)\n#define NdisFillMemory(Destination, Length, Fill)   memset(Destination, Fill, Length)\n#define NdisCmpMemory(Destination, Source, Length)  memcmp(Destination, Source, Length)\n#define NdisEqualMemory(Source1, Source2, Length)   (!memcmp(Source1, Source2, Length))\n#define RTMPEqualMemory(Source1, Source2, Length)\t(!memcmp(Source1, Source2, Length))\n\n#define MlmeAllocateMemory(_pAd, _ppVA)\t\t\t\tos_alloc_mem(_pAd, _ppVA, MGMT_DMA_BUFFER_SIZE)\n#define MlmeFreeMemory(_pAd, _pVA)\t\t\t\t\tos_free_mem(_pAd, _pVA)\n\n#define COPY_MAC_ADDR(Addr1, Addr2)             \tmemcpy((Addr1), (Addr2), MAC_ADDR_LEN)\n\n\n/***********************************************************************************\n *\tOS task related data structure and definitions\n ***********************************************************************************/\n#define RTMP_OS_PID\t\t\t\t\t\tULONG /* value or pointer */\n\n#define RTMP_GET_OS_PID(_a, _b)\t\t\tRtmpOsGetPid(&_a, _b);\n#define CHECK_TASK_LEGALITY(_task)\t\tRtmpOsCheckTaskLegality(_task)\n#define ATE_KILL_THREAD_PID\t\t\t\tRtmpThreadPidKill\n\ntypedef INT (*RTMP_OS_TASK_CALLBACK)(ULONG);\n\n\n/***********************************************************************************\n * IOCTL related definitions and data structures.\n **********************************************************************************/\n#define NET_IOCTL\t\t\t\tVOID\n#define PNET_IOCTL\t\t\t\tVOID *\n\n/* undef them to avoid compile errors in rt_symb.c */\n#undef EINVAL\n#undef EOPNOTSUPP\n#undef EFAULT\n#undef ENETDOWN\n#undef E2BIG\n#undef ENOMEM\n#undef EAGAIN\n#undef ENOTCONN\n\n#define EINVAL\t\t\t\t\t(-RTMP_IO_EINVAL)\n#define EOPNOTSUPP      \t\t(-RTMP_IO_EOPNOTSUPP)\n#define EFAULT\t\t\t\t\t(-RTMP_IO_EFAULT)\n#define ENETDOWN\t\t\t\t(-RTMP_IO_ENETDOWN)\n#define E2BIG\t\t\t\t\t(-RTMP_IO_E2BIG)\n#define ENOMEM\t\t\t\t\t(-RTMP_IO_ENOMEM)\n#define EAGAIN\t\t\t\t\t(-RTMP_IO_EAGAIN)\n#define ENOTCONN\t\t\t\t(-RTMP_IO_ENOTCONN)\n\n\n/***********************************************************************************\n * Timer related definitions and data structures.\n **********************************************************************************/\n#define OS_HZ\t\t\t\t\tRtmpOsTickUnitGet()\n\ntypedef void (*TIMER_FUNCTION)(ULONG);\n\n#define OS_WAIT\t\t\t\t\tRtmpOsWait\n\n#define RTMP_TIME_AFTER\t\t\tRtmpOsTimerAfter\n#define RTMP_TIME_BEFORE\t\tRtmpOsTimerBefore\n\n#define ONE_TICK\t\t\t\t1\n\n#define NdisGetSystemUpTime\t\tRtmpOsGetSystemUpTime\n\n\n/***********************************************************************************\n *\tOS specific cookie data structure binding to RTMP_ADAPTER\n ***********************************************************************************/\n\n/* do not have compile option in the structure for UTIL module */\nstruct os_cookie {\n\n#ifdef RTMP_MAC_USB\n\tVOID\t\t\t\t\t*pUsb_Dev;\n#ifdef CONFIG_STA_SUPPORT\n\tVOID\t\t\t\t\t *intf;\n#endif /* CONFIG_STA_SUPPORT */\n\n#endif /* RTMP_MAC_USB */\n\n#ifdef WORKQUEUE_BH\n\tUINT32\t\t     \t\tpAd_va;\n#endif /* WORKQUEUE_BH */\n\n\tRTMP_NET_TASK_STRUCT\trx_done_task;\n\tRTMP_NET_TASK_STRUCT\tcmd_rsp_event_task;\n\tRTMP_NET_TASK_STRUCT\tmgmt_dma_done_task;\n\tRTMP_NET_TASK_STRUCT\tac0_dma_done_task;\n#ifdef RALINK_ATE\n\tRTMP_NET_TASK_STRUCT\tate_ac0_dma_done_task;\n#endif /* RALINK_ATE */\n\tRTMP_NET_TASK_STRUCT\tac1_dma_done_task;\n\tRTMP_NET_TASK_STRUCT\tac2_dma_done_task;\n\tRTMP_NET_TASK_STRUCT\tac3_dma_done_task;\n\tRTMP_NET_TASK_STRUCT\thcca_dma_done_task;\n\tRTMP_NET_TASK_STRUCT\ttbtt_task;\n\n\n#ifdef UAPSD_SUPPORT\n\tRTMP_NET_TASK_STRUCT\tuapsd_eosp_sent_task;\n#endif /* UAPSD_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DFS_SUPPORT\n#ifdef DFS_SOFTWARE_SUPPORT\n\tRTMP_NET_TASK_STRUCT\tpulse_radar_detect_task;\n\tRTMP_NET_TASK_STRUCT\twidth_radar_detect_task;\n#endif /* DFS_SOFTWARE_SUPPORT */\n#endif /* DFS_SUPPORT */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\tRTMP_NET_TASK_STRUCT\tcarrier_sense_task;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DFS_SUPPORT\n\tRTMP_NET_TASK_STRUCT\tdfs_task;\n#endif /* DFS_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\tRTMP_NET_TASK_STRUCT\tnull_frame_complete_task;\n\tRTMP_NET_TASK_STRUCT\tpspoll_frame_complete_task;\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tRTMP_NET_TASK_STRUCT\thcca_null_frame_complete_task;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\tRTMP_OS_PID\t\t\t\tapd_pid; /*802.1x daemon pid */\n\tunsigned long\t\t\tapd_pid_nr;\n#ifdef CONFIG_AP_SUPPORT\n#ifdef IAPP_SUPPORT\n/*\tRT_SIGNAL_STRUC\t\t\tRTSignal; */\n\tRTMP_OS_PID\t\t\t\tIappPid; /*IAPP daemon pid */\n\tunsigned long\t\t\tIappPid_nr;\n#endif /* IAPP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef WAPI_SUPPORT\n\tRTMP_OS_PID\t\t\t\twapi_pid; /*wapi daemon pid */\n\tunsigned long\t\t\twapi_pid_nr;\n#endif /* WAPI_SUPPORT */\n\tINT\t\t\t\t\t\tioctl_if_type;\n\tINT \t\t\t\t\tioctl_if;\n};\n\ntypedef struct os_cookie\t* POS_COOKIE;\n\n\n/***********************************************************************************\n *\tOS debugging and printing related definitions and data structure\n ***********************************************************************************/\n#define PRINT_MAC(addr)\t\\\n\taddr[0], addr[1], addr[2], addr[3], addr[4], addr[5]\n\n#ifdef DBG\nextern ULONG\t\tRTDebugLevel;\nextern ULONG\t\tRTDebugFunc;\n\n#define DBGPRINT_RAW(Level, Fmt)    \\\ndo{                                   \\\n\tULONG __gLevel = (Level) & 0xff;\\\n\tULONG __fLevel = ((Level)>>8) & 0xffffff;\\\n    if (__gLevel <= RTDebugLevel)      \\\n    {                               \\\n    \tif ((RTDebugFunc == 0) || \\\n\t\t((RTDebugFunc != 0) && (((__fLevel & RTDebugFunc)!= 0) || (__gLevel <= RT_DEBUG_ERROR))))\\\n        printk Fmt;               \\\n    }                               \\\n}while(0)\n\n#define DBGPRINT(Level, Fmt)    DBGPRINT_RAW(Level, Fmt)\n\n\n#define DBGPRINT_ERR(Fmt)           \\\n{                                   \\\n    printk(\"ERROR!!! \");          \\\n    printk Fmt;                  \\\n}\n\n#define DBGPRINT_S(Status, Fmt)\t\t\\\n{\t\t\t\t\t\t\t\t\t\\\n\tprintk Fmt;\t\t\t\t\t\\\n}\n#else\n#define DBGPRINT(Level, Fmt)\n#define DBGPRINT_RAW(Level, Fmt)\n#define DBGPRINT_S(Status, Fmt)\n#define DBGPRINT_ERR(Fmt)\n#endif\n\n#undef  ASSERT\n#ifdef DBG\n#define ASSERT(x)                                                               \\\n{                                                                               \\\n    if (!(x))                                                                   \\\n    {                                                                           \\\n        printk(__FILE__ \":%d assert \" #x \"failed\\n\", __LINE__);    \\\n    }                                                                           \\\n}\n#else\n#define ASSERT(x)\n#endif /* DBG */\n\nvoid hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen);\n\n\n/*********************************************************************************************************\n\tThe following code are not revised, temporary put it here.\n  *********************************************************************************************************/\n\n\n/***********************************************************************************\n * Device DMA Access related definitions and data structures.\n **********************************************************************************/\n/*#ifdef RTMP_MAC_PCI*/\n#define size_t\t\t\t\t\t\tULONG\n\nra_dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction);\nvoid linux_pci_unmap_single(void *handle, ra_dma_addr_t dma_addr, size_t size, int direction);\n\n#define pci_enable_msi\t\tRtmpOsPciMsiEnable\n#define pci_disable_msi\t\tRtmpOsPciMsiDisable\n\n#define PCI_MAP_SINGLE_DEV(_handle, _ptr, _size, _sd_idx, _dir)\t\t\t\t\\\n\tlinux_pci_map_single(_handle, _ptr, _size, _sd_idx, _dir)\n\t\n#define PCI_UNMAP_SINGLE(_pAd, _ptr, _size, _dir)\t\t\t\t\t\t\\\n\tlinux_pci_unmap_single(((POS_COOKIE)(_pAd->OS_Cookie))->pci_dev, _ptr, _size, _dir)\n\n#define PCI_ALLOC_CONSISTENT(_pci_dev, _size, _ptr)\t\t\t\t\t\t\t\\\n\tpci_alloc_consistent(_pci_dev, _size, _ptr)\n\n#define PCI_FREE_CONSISTENT(_pci_dev, _size, _virtual_addr, _physical_addr)\t\\\n\tpci_free_consistent(_pci_dev, _size, _virtual_addr, _physical_addr)\n/*#endif RTMP_MAC_PCI*/\n\n#define DEV_ALLOC_SKB(_pAd, _Pkt, _length)\t\t\t\t\t\t\t\t\t\\\n\t_Pkt = RtmpOSNetPktAlloc(_pAd, _length);\n\n/*#ifdef RTMP_MAC_USB */\n/*#define PCI_MAP_SINGLE(_handle, _ptr, _size, _dir)\t\t\t\t(ULONG)0 */\n/*#define PCI_UNMAP_SINGLE(_handle, _ptr, _size, _dir) */\n/*#endif RTMP_MAC_USB */\n\n\n/*\n * ULONG\n * RTMP_GetPhysicalAddressLow(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);\n */\n#define RTMP_GetPhysicalAddressLow(phy_addr)\t\t(phy_addr)\n\n/*\n * ULONG\n * RTMP_GetPhysicalAddressHigh(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);\n */\n#define RTMP_GetPhysicalAddressHigh(phy_addr)\t\t(0)\n\n/*\n * VOID\n * RTMP_SetPhysicalAddressLow(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,\n *   IN ULONG  Value);\n */\n#define RTMP_SetPhysicalAddressLow(phy_addr, Value)\t\\\n\t\t\tphy_addr = Value;\n\n/*\n * VOID\n * RTMP_SetPhysicalAddressHigh(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,\n *   IN ULONG  Value);\n */\n#define RTMP_SetPhysicalAddressHigh(phy_addr, Value)\n\n#define NdisMIndicateStatus(_w, _x, _y, _z)\n\n\n\n/***********************************************************************************\n * Device Register I/O Access related definitions and data structures.\n **********************************************************************************/\n#define readl\t\tRTMP_PCI_Readl\n#define readw\t\tRTMP_PCI_Readw\n#define readb\t\tRTMP_PCI_Readb\n#define writel\t\tRTMP_PCI_Writel\n#define writew\t\tRTMP_PCI_Writew\n#define writeb\t\tRTMP_PCI_Writeb\n\n/* TODO: We can merge two readl to a function to speed up or one real/writel */\n\n\n#ifdef RTMP_MAC_USB\n#define RTMP_IO_FORCE_READ32(_A, _R, _pV)\t\t\t\t\t\t\t\t\\\n\tRTUSBReadMACRegister((_A), (_R), (PUINT32) (_pV))\n\n#define RTMP_IO_FORCE_WRITE32(_A, _R, _V)\t\\\n\tdo{\\\n\t\t/* if ((_R) != 0x404)*/ /* TODO:shiang-6590, depends on sw porting guide, don't acccess it now */\\\n\t\t\tRTUSBWriteMACRegister((_A), (_R), (UINT32) (_V), FALSE);\t\t\\\n\t}while(0)\n\n#define RTMP_IO_READ32(_A, _R, _pV)\t\t\t\t\t\t\t\t\\\n\tRTUSBReadMACRegister((_A), (_R), (PUINT32) (_pV))\n\n#define RTMP_IO_READ8(_A, _R, _pV)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n#define RTMP_IO_WRITE32(_A, _R, _V)\t\t\t\t\t\t\t\t\\\n\tRTUSBWriteMACRegister((_A), (_R), (UINT32) (_V), FALSE)\n\n#define RTMP_IO_WRITE8(_A, _R, _V)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tUSHORT\t_Val = _V;\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTUSBSingleWrite((_A), (_R), (USHORT) (_Val), FALSE);\t\t\\\n}\n\n\n#define RTMP_IO_WRITE16(_A, _R, _V)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTUSBSingleWrite((_A), (_R), (USHORT) (_V), FALSE);\t\t\t\\\n}\n\n#define RTMP_SYS_IO_READ32\n#define RTMP_SYS_IO_WRITE32\n#endif /* RTMP_MAC_USB */\n\n#define pci_read_config_word\tRtmpOsPciConfigReadWord\n#define pci_write_config_word\tRtmpOsPciConfigWriteWord\n#define pci_read_config_dword\tRtmpOsPciConfigReadDWord\n#define pci_write_config_dword\tRtmpOsPciConfigWriteDWord\n#define pci_find_capability\t\tRtmpOsPciFindCapability\n\n#define RTMP_USB_URB_DATA_GET\tRtmpOsUsbUrbDataGet\n#define RTMP_USB_URB_STATUS_GET\tRtmpOsUsbUrbStatusGet\n#define RTMP_USB_URB_LEN_GET\tRtmpOsUsbUrbLenGet\n\n#define IW_SCAN_MAX_DATA\t\tRTMP_OS_MAX_SCAN_DATA_GET()\n\n/***********************************************************************************\n *\tNetwork Related data structure and marco definitions\n ***********************************************************************************/\n#define PKTSRC_NDIS             0x7f\n#define PKTSRC_DRIVER           0x0f\n\n#define RTMP_OS_NETDEV_GET_PHYADDR\tRtmpOsNetDevGetPhyAddr\n#define SET_OS_PKT_NETDEV\t\t\tRtmpOsSetPktNetDev\n#define RTMP_OS_NETDEV_GET_DEVNAME\tRtmpOsGetNetDevName\n#define RTMP_OS_NETDEV_SET_TYPE\t\tRtmpOsSetNetDevType\n#define RTMP_OS_NETDEV_SET_TYPE_MONITOR\t\tRtmpOsSetNetDevTypeMonitor\n\n#define QUEUE_ENTRY_TO_PACKET(pEntry) \\\n\t(PNDIS_PACKET)(pEntry)\n\n#define PACKET_TO_QUEUE_ENTRY(pPacket) \\\n\t(PQUEUE_ENTRY)(pPacket)\n\n#define RTMP_OS_NETDEV_STATE_RUNNING(_pNetDev)\t(RtmpOSNetDevIsUp(_pNetDev) == TRUE)\n\n#define RELEASE_NDIS_PACKET(_pReserved, _pPacket, _Status)\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n        RTMPFreeNdisPacket(_pReserved, _pPacket);\t\t\t\t\t\t\\\n}\n\n/*\n * packet helper\n * \t- convert internal rt packet to os packet or\n *             os packet to rt packet\n */\nextern ULONG RTPktOffsetData, RTPktOffsetLen, RTPktOffsetCB;\n\n#define RTPKT_TO_OSPKT(_p)\t\t(_p)\n#define OSPKT_TO_RTPKT(_p)\t\t(_p)\n\n#define GET_OS_PKT_DATAPTR(_pkt) \\\n\t\t((UCHAR *)(*(ULONG *)((UCHAR *)_pkt + RTPktOffsetData)))\n\n#define SET_OS_PKT_DATAPTR\t\t\\\n\t\tRtmpOsPktDataPtrAssign\n\n#define GET_OS_PKT_LEN(_pkt) \t\\\n\t\t(*(UINT32 *)((UCHAR *)_pkt + RTPktOffsetLen))\n\n#define SET_OS_PKT_LEN\t\t\t\\\n\t\tRtmpOsPktLenAssign\n\n#define GET_OS_PKT_CB(_pkt) \t\\\n\t\t((UCHAR *)((UCHAR *)_pkt + RTPktOffsetCB))\n\n#define GET_OS_PKT_NETDEV(_pkt) RtmpOsPktNetDevGet\n\n#define OS_PKT_CLONED\t\t\t\\\n\t\tRtmpOsIsPktCloned\n\n#define OS_PKT_COPY\t\t\t\t\\\n\t\tRtmpOsPktCopy\n\n#define OS_PKT_TAIL_ADJUST\t\t\\\n\t\tRtmpOsPktTailAdjust\n\n#define OS_PKT_HEAD_BUF_EXTEND\t\\\n\t\tRtmpOsPktHeadBufExtend\n\n#define OS_PKT_TAIL_BUF_EXTEND\t\\\n\t\tRtmpOsPktTailBufExtend\n\n#define OS_PKT_RESERVE\t\t\t\\\n\t\tRtmpOsPktReserve\n\n#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag)\t\t\\\n\t\t_src = RtmpOsPktClone((_pkt));\n\n#define RTMP_OS_PKT_INIT\t\t\tRtmpOsPktInit\n\nextern UINT32 RtmpOsGetUnaligned32(\n\tIN UINT32\t\t\t\t*pWord);\n\nextern ULONG RtmpOsGetUnalignedlong(\n\tIN ULONG\t\t\t\t*pWord);\n\n#define get_unaligned\t\tRtmpOsGetUnaligned\n#define get_unaligned32\t\tRtmpOsGetUnaligned32\n#define get_unalignedlong\tRtmpOsGetUnalignedlong\n\n#define OS_NTOHS\t\tRtmpOsNtohs\n#define OS_HTONS\t\tRtmpOsHtons\n#define OS_NTOHL\t\tRtmpOsNtohl\n#define OS_HTONL\t\tRtmpOsHtonl\n\n#ifndef ntohs\n#define ntohs\t\t\tOS_NTOHS\n#endif /* ntohs */\n#ifndef htons\n#define htons\t\t\tOS_HTONS\n#endif /* htons */\n#ifndef ntohl\n#define ntohl\t\t\tOS_NTOHL\n#endif /* ntohl */\n#ifndef htonl\n#define htonl\t\t\tOS_HTONL\n#endif /* htonl */\n\n#define RTMP_OS_NETDEV_START_QUEUE\t\t\t\tRtmpOsNetQueueStart\n#define RTMP_OS_NETDEV_STOP_QUEUE\t\t\t\tRtmpOsNetQueueStop\n#define RTMP_OS_NETDEV_WAKE_QUEUE\t\t\t\tRtmpOsNetQueueWake\n\n\n#define CB_OFF  10\n\n#define PACKET_CB_ASSIGN(_p, _offset)\t\\\n\t(*((UINT8 *)_p + RTPktOffsetCB + _offset))\n\n#define PACKET_CB(_p, _offset)\t\\\n\t(*((UINT8 *)_p + RTPktOffsetCB + CB_OFF + _offset))\n\n/* User Priority */\n#define RTMP_SET_PACKET_UP(_p, _prio)\t\t\t(PACKET_CB(_p, 0) = _prio)\n#define RTMP_GET_PACKET_UP(_p)\t\t\t\t\t(PACKET_CB(_p, 0))\n\n/* Fragment # */\n#define RTMP_SET_PACKET_FRAGMENTS(_p, _num)\t\t(PACKET_CB(_p, 1) = _num)\n#define RTMP_GET_PACKET_FRAGMENTS(_p)\t\t\t(PACKET_CB(_p, 1))\n\n/* 0x0 ~0x7f: TX to AP's own BSS which has the specified AID. if AID>127, set bit 7 in RTMP_SET_PACKET_EMACTAB too. */\n/*(this value also as MAC(on-chip WCID) table index) */\n/* 0x80~0xff: TX to a WDS link. b0~6: WDS index */\n#define RTMP_SET_PACKET_WCID(_p, _wdsidx)\t\t(PACKET_CB(_p, 2) = _wdsidx)\n#define RTMP_GET_PACKET_WCID(_p)          \t\t(PACKET_CB(_p, 2))\n\n/* 0xff: PKTSRC_NDIS, others: local TX buffer index. This value affects how to a packet */\n#define RTMP_SET_PACKET_SOURCE(_p, _pktsrc)\t\t(PACKET_CB(_p, 3) = _pktsrc)\n#define RTMP_GET_PACKET_SOURCE(_p)       \t\t(PACKET_CB(_p, 3))\n\n/* RTS/CTS-to-self protection method */\n#define RTMP_SET_PACKET_RTS(_p, _num)      \t\t(PACKET_CB(_p, 4) = _num)\n#define RTMP_GET_PACKET_RTS(_p)          \t\t(PACKET_CB(_p, 4))\n/* see RTMP_S(G)ET_PACKET_EMACTAB */\n\n/* TX rate index */\n#define RTMP_SET_PACKET_TXRATE(_p, _rate)\t\t(PACKET_CB(_p, 5) = _rate)\n#define RTMP_GET_PACKET_TXRATE(_p)\t\t  \t\t(PACKET_CB(_p, 5))\n\n/* From which Interface */\n#define RTMP_SET_PACKET_IF(_p, _ifdx)\t\t\t(PACKET_CB(_p, 6) = _ifdx)\n#define RTMP_GET_PACKET_IF(_p)\t\t  \t\t\t(PACKET_CB(_p, 6))\n#define RTMP_SET_PACKET_NET_DEVICE_MBSSID(_p, _bss)\t\tRTMP_SET_PACKET_IF((_p), (_bss))\n#define RTMP_SET_PACKET_NET_DEVICE_WDS(_p, _bss)\t\tRTMP_SET_PACKET_IF((_p), ((_bss) + MIN_NET_DEVICE_FOR_WDS))\n#define RTMP_SET_PACKET_NET_DEVICE_APCLI(_p, _idx)   \tRTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_APCLI))\n#define RTMP_SET_PACKET_NET_DEVICE_MESH(_p, _idx)   \tRTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_MESH))\n#define RTMP_SET_PACKET_NET_DEVICE_P2P(_p, _idx)   \t\tRTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_P2P_GO))\n#define RTMP_GET_PACKET_NET_DEVICE_MBSSID(_p)\t\t\tRTMP_GET_PACKET_IF((_p))\n#define RTMP_GET_PACKET_NET_DEVICE(_p)\t\t\t\t\tRTMP_GET_PACKET_IF((_p))\n\n#define RTMP_SET_PACKET_MOREDATA(_p, _morebit)\t(PACKET_CB(_p, 7) = _morebit)\n#define RTMP_GET_PACKET_MOREDATA(_p)\t\t\t(PACKET_CB(_p, 7))\n\n\n\n#ifdef UAPSD_SUPPORT\n/* if we queue a U-APSD packet to any software queue, we will set the U-APSD\n   flag and its physical queue ID for it */\n#define RTMP_SET_PACKET_UAPSD(_p, _flg_uapsd, _que_id) \\\n                    (PACKET_CB(_p, 9) = ((_flg_uapsd<<7) | _que_id))\n\n#define RTMP_SET_PACKET_QOS_NULL(_p)     (PACKET_CB(_p, 9) = 0xff)\n#define RTMP_GET_PACKET_QOS_NULL(_p)\t (PACKET_CB(_p, 9))\n#define RTMP_SET_PACKET_NON_QOS_NULL(_p) (PACKET_CB(_p, 9) = 0x00)\n#define RTMP_GET_PACKET_UAPSD_Flag(_p)   ((PACKET_CB(_p, 9) & 0x80) >> 7)\n#define RTMP_GET_PACKET_UAPSD_QUE_ID(_p) (PACKET_CB(_p, 9) & 0x7f)\n\n#define RTMP_SET_PACKET_EOSP(_p, _flg)   (PACKET_CB(_p, 10) = _flg)\n#define RTMP_GET_PACKET_EOSP(_p)         (PACKET_CB(_p, 10))\n#endif /* UAPSD_SUPPORT */\n\n\n/* */\n/*\tSepcific Pakcet Type definition */\n/* */\n#define RTMP_PACKET_SPECIFIC_CB_OFFSET\t11\n\n#define RTMP_PACKET_SPECIFIC_DHCP\t\t0x01\n#define RTMP_PACKET_SPECIFIC_EAPOL\t\t0x02\n#define RTMP_PACKET_SPECIFIC_IPV4\t\t0x04\n#define RTMP_PACKET_SPECIFIC_WAI\t\t0x08\n#define RTMP_PACKET_SPECIFIC_VLAN\t\t0x10\n#define RTMP_PACKET_SPECIFIC_LLCSNAP\t0x20\n#define RTMP_PACKET_SPECIFIC_TDLS\t\t0x40\n\n/*Specific */\n#define RTMP_SET_PACKET_SPECIFIC(_p, _flg)\t   \t(PACKET_CB(_p, 11) = _flg)\n\n/*DHCP */\n#define RTMP_SET_PACKET_DHCP(_p, _flg)   \t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) |= (RTMP_PACKET_SPECIFIC_DHCP);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) &= (~RTMP_PACKET_SPECIFIC_DHCP);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_DHCP(_p)\t\t(PACKET_CB(_p, 11) & RTMP_PACKET_SPECIFIC_DHCP)\n\n/*EAPOL */\n#define RTMP_SET_PACKET_EAPOL(_p, _flg)   \t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) |= (RTMP_PACKET_SPECIFIC_EAPOL);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) &= (~RTMP_PACKET_SPECIFIC_EAPOL);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_EAPOL(_p)\t\t(PACKET_CB(_p, 11) & RTMP_PACKET_SPECIFIC_EAPOL)\n\n/*WAI */\n#define RTMP_SET_PACKET_WAI(_p, _flg)   \t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) |= (RTMP_PACKET_SPECIFIC_WAI);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) &= (~RTMP_PACKET_SPECIFIC_WAI);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_WAI(_p)\t\t\t(PACKET_CB(_p, 11) & RTMP_PACKET_SPECIFIC_WAI)\n\n#define RTMP_GET_PACKET_LOWRATE(_p)\t\t(PACKET_CB(_p, 11) & (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_DHCP | RTMP_PACKET_SPECIFIC_WAI))\n\n/*VLAN */\n#define RTMP_SET_PACKET_VLAN(_p, _flg)   \t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) |= (RTMP_PACKET_SPECIFIC_VLAN);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) &= (~RTMP_PACKET_SPECIFIC_VLAN);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_VLAN(_p)\t\t(PACKET_CB(_p, 11) & RTMP_PACKET_SPECIFIC_VLAN)\n\n/*LLC/SNAP */\n#define RTMP_SET_PACKET_LLCSNAP(_p, _flg)   \t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) |= (RTMP_PACKET_SPECIFIC_LLCSNAP);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) &= (~RTMP_PACKET_SPECIFIC_LLCSNAP);\t\\\n\t\t\t}while(0)\n\t\t\t\n#define RTMP_GET_PACKET_LLCSNAP(_p)\t\t(PACKET_CB(_p, 11) & RTMP_PACKET_SPECIFIC_LLCSNAP)\n\n/* IP */\n#define RTMP_SET_PACKET_IPV4(_p, _flg)\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) |= (RTMP_PACKET_SPECIFIC_IPV4);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tPACKET_CB(_p, 11) &= (~RTMP_PACKET_SPECIFIC_IPV4);\t\\\n\t\t\t}while(0)\n\t\t\t\n#define RTMP_GET_PACKET_IPV4(_p)\t\t(PACKET_CB(_p, 11) & RTMP_PACKET_SPECIFIC_IPV4)\n\n/* TDLS */\n#define RTMP_SET_PACKET_TDLS(_p, _flg)\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_TDLS);\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_TDLS);\t\\\n\t\t\t}while(0)\n\t\t\t\n#define RTMP_GET_PACKET_TDLS(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_TDLS)\n\n/* If this flag is set, it indicates that this EAPoL frame MUST be clear. */\n#define RTMP_SET_PACKET_CLEAR_EAP_FRAME(_p, _flg)   (PACKET_CB(_p, 12) = _flg)\n#define RTMP_GET_PACKET_CLEAR_EAP_FRAME(_p)         (PACKET_CB(_p, 12))\n\n\n#ifdef DOT11_VHT_AC\n#define MAX_PACKETS_IN_QUEUE\t\t\t\t1024 /*(512)*/\n#else\n#define MAX_PACKETS_IN_QUEUE\t\t\t\t(512)\n#endif /* DOT11_VHT_AC */\n\n\n/* use bit3 of cb[CB_OFF+16] */\n#define RTMP_SET_PACKET_MGMT_PKT(_p, _flg)\t        \\\n        PACKET_CB(_p, 16) = (PACKET_CB(_p, 16) & 0xF7) | ((_flg & 0x01) << 3);\n#define RTMP_GET_PACKET_MGMT_PKT(_p)\t\t\t\t\\\n\t\t((PACKET_CB(_p, 16) & 0x08) >> 3)\n\n/* use bit0 of cb[CB_OFF+20] */\n#define RTMP_SET_PACKET_MGMT_PKT_DATA_QUE(_p, _flg)\t\\\n        PACKET_CB(_p, 20) = (PACKET_CB(_p, 20) & 0xFE) | (_flg & 0x01);\n#define RTMP_GET_PACKET_MGMT_PKT_DATA_QUE(_p)\t\t\\\n\t\t(PACKET_CB(_p, 20) & 0x01)\n\n#define RTMP_SET_PACKET_5VT(_p, _flg)   (PACKET_CB(_p, 22) = _flg)\n#define RTMP_GET_PACKET_5VT(_p)         (PACKET_CB(_p, 22))\n\n#define RTMP_SET_PACKET_PROTOCOL(_p, _protocol) {\\\n\t(PACKET_CB(_p, 23) = (UINT8)((_protocol) & 0x00ff)); \\\n\t(PACKET_CB(_p, 24) = (UINT8)(((_protocol) & 0xff00) >> 8)); \\\n}\n\n#define RTMP_GET_PACKET_PROTOCOL(_p) \\\n\t((((UINT16)PACKET_CB(_p, 23)) << 8) \\\n\t| ((UINT16)PACKET_CB(_p, 24)))\n\n#ifdef INF_AMAZON_SE\n/* [CB_OFF+28], 1B, Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */\n#define RTMP_SET_PACKET_NOBULKOUT(_p, _morebit)\t\t\t(PACKET_CB(_p, 28) = _morebit)\n#define RTMP_GET_PACKET_NOBULKOUT(_p)\t\t\t\t\t(PACKET_CB(_p, 28))\n#endif /* INF_AMAZON_SE */\n/* Max skb->cb = 48B = [CB_OFF+38] */\n\n\n\n#ifdef P2P_SUPPORT\n#define RTMP_SET_PACKET_OPMODE(_p, _flg)   (PACKET_CB(_p, 26) = _flg)\n#define RTMP_GET_PACKET_OPMODE(_p)         (PACKET_CB(_p, 26))\n#endif /* P2P_SUPPORT */\n\n#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT)\n#define RTMP_SET_TCP_CHKSUM_FAIL(_p, _flg) \t(PACKET_CB(_p, 30) = _flg);\n#define RTMP_GET_TCP_CHKSUM_FAIL(_p)\t\t(PACKET_CB(_p, 30))\n#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT) */\n\n\n\n/***********************************************************************************\n *\tOther function prototypes definitions\n ***********************************************************************************/\nvoid RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);\n\n\n\n\n#ifdef RTMP_USB_SUPPORT\n/******************************************************************************\n\n  \tUSB related definitions\n\n******************************************************************************/\n\n#define RTMP_USB_PKT_COPY\t\t\tRtmpOsPktBodyCopy\n\n/*typedef struct usb_device_id USB_DEVICE_ID; */\n\n#ifdef INF_AMAZON_SE\n#define BULKAGGRE_SIZE          30\n#else\n#define BULKAGGRE_SIZE          60\n#endif /* INF_AMAZON_SE */\n\n/*#define RT28XX_PUT_DEVICE\t\t\trausb_put_dev */\n#define RTUSB_ALLOC_URB\t\t\t\trausb_alloc_urb\n#define RTUSB_SUBMIT_URB\t\t\trausb_submit_urb\n#define RTUSB_URB_ALLOC_BUFFER\t\trausb_buffer_alloc\n#define RTUSB_URB_FREE_BUFFER\t\trausb_buffer_free\n#define RTUSB_FREE_URB\t\t\t\trausb_free_urb\n#define RTUSB_UNLINK_URB\t\t\trausb_kill_urb\n#define USB_CONTROL_MSG\t\t\t\trausb_control_msg\n#define usb_sndctrlpipe\t\t\t\trausb_sndctrlpipe\n#define usb_rcvctrlpipe\t\t\t\trausb_rcvctrlpipe\n#define RTUSB_AUTOPM_PUT_INTERFACE\trausb_autopm_put_interface\n#define RTUSB_AUTOPM_GET_INTERFACE\trausb_autopm_get_interface\n\n\n\n#define RTUSB_CONTROL_MSG(pUsb_Dev, uEndpointAddress, Request, RequestType, Value,Index, tmpBuf, TransferBufferLength, timeout, ret)\t\\\n  \t\tdo{\t\\\n\t\t\tif (RequestType == DEVICE_VENDOR_REQUEST_OUT)\t\\\n\t\t\t\tret = USB_CONTROL_MSG(pUsb_Dev, usb_sndctrlpipe(pUsb_Dev, uEndpointAddress), Request, RequestType, Value, Index, tmpBuf, TransferBufferLength, timeout);\t\\\n\t\t\telse if (RequestType == DEVICE_VENDOR_REQUEST_IN)\t\\\n\t\t\t\tret = USB_CONTROL_MSG(pUsb_Dev, usb_rcvctrlpipe(pUsb_Dev, uEndpointAddress), Request, RequestType, Value, Index, tmpBuf, TransferBufferLength, timeout);\t\\\n\t\t\telse\t\\\n\t\t\t{\t\\\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"vendor request direction is failed\\n\"));\t\\\n\t\t\t\tret = -1;\t\\\n\t\t\t}\t\\\n\t\t}while(0)\n\n\nextern VOID dump_urb(VOID *purb);\n\ntypedef VOID\t\tUSBHST_STATUS;\ntypedef INT32\t\tURBCompleteStatus;\n#define RTMP_OS_WAIT_QUEUE_HEAD\t\tVOID\ntypedef VOID (*usb_complete_t)(VOID *);\n\n#define RtmpUsbBulkOutDataPacketComplete\t\tpRtmpDrvNetOps->RtmpNetUsbBulkOutDataPacketComplete\n#define RtmpUsbBulkOutMLMEPacketComplete\t\tpRtmpDrvNetOps->RtmpNetUsbBulkOutMLMEPacketComplete\n#define RtmpUsbBulkOutNullFrameComplete\t\t\tpRtmpDrvNetOps->RtmpNetUsbBulkOutNullFrameComplete\n#ifdef CONFIG_MULTI_CHANNEL\n#define RtmpUsbBulkOutHCCANullFrameComplete\t\t\tpRtmpDrvNetOps->RtmpNetUsbBulkOutHCCANullFrameComplete\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#define RtmpUsbBulkOutRTSFrameComplete\t\t\tpRtmpDrvNetOps->RtmpNetUsbBulkOutRTSFrameComplete\n#define RtmpUsbBulkOutPsPollComplete\t\t\tpRtmpDrvNetOps->RtmpNetUsbBulkOutPsPollComplete\n#define RtmpUsbBulkRxComplete\t\t\t\t\tpRtmpDrvNetOps->RtmpNetUsbBulkRxComplete\n#define RtmpUsbBulkCmdRspEventComplete\t\t\tpRtmpDrvNetOps->RtmpNetUsbBulkCmdRspEventComplete\n\n#define RTUSBBulkOutDataPacketComplete(Status, pURB, pt_regs)    RTUSBBulkOutDataPacketComplete(pURB)\n#define RTUSBBulkOutMLMEPacketComplete(Status, pURB, pt_regs)    RTUSBBulkOutMLMEPacketComplete(pURB)\n#define RTUSBBulkOutNullFrameComplete(Status, pURB, pt_regs)     RTUSBBulkOutNullFrameComplete(pURB)\n#define RTUSBBulkOutRTSFrameComplete(Status, pURB, pt_regs)      RTUSBBulkOutRTSFrameComplete(pURB)\n#define RTUSBBulkOutPsPollComplete(Status, pURB, pt_regs)        RTUSBBulkOutPsPollComplete(pURB)\n#define RTUSBBulkRxComplete(Status, pURB, pt_regs)               RTUSBBulkRxComplete(pURB)\n#define RTUSBBulkCmdRspEventComplete(Status, pURB, pt_regs)\t \t RTUSBBulkCmdRspEventComplete(pURB)\n#define USBUploadFWComplete(Status, pURB, pt_regs)               USBUploadFWComplete(pURB)\n#define USBKickOutCmdComplete(Status, pURB, pt_regs)               USBKickOutCmdComplete(pURB)\n#ifdef CONFIG_MULTI_CHANNEL\n#define RTUSBBulkOutHCCANullFrameComplete(Status, pURB, pt_regs)\tRTUSBBulkOutHCCANullFrameComplete(pURB)\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\nUSBHST_STATUS RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutMLMEPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutNullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutRTSFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutPsPollComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkRxComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkCmdRspEventComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\n#ifdef CONFIG_MULTI_CHANNEL\nUSBHST_STATUS RTUSBBulkOutHCCANullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#define rtusb_urb_context  context\n#define rtusb_urb_status   status\n\n#define RTMP_OS_USB_CONTEXT_GET\t\tRtmpOsUsbContextGet\n#define RTMP_OS_USB_STATUS_GET\t\tRtmpOsUsbStatusGet\n\n#define RTUSB_URB_DMA_MAPPING\t\tRtmpOsUsbDmaMapping\n\n#define RTUSB_FILL_TX_BULK_URB\t\tRtmpOsUsbInitHTTxDesc\n#define RTUSB_FILL_HTTX_BULK_URB\tRtmpOsUsbInitHTTxDesc\n#define RTUSB_FILL_RX_BULK_URB\t\tRtmpOsUsbInitRxDesc\n\n#undef in_interrupt\n#define in_interrupt\t\tRtmpOsIsInInterrupt\n\nextern VOID *rausb_alloc_urb(INT32 iso_packets);\nextern VOID rausb_free_urb(VOID *urb);\nextern INT32 rausb_submit_urb(VOID *urb);\nextern VOID *rausb_buffer_alloc(VOID *dev,\n\t\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\t\tra_dma_addr_t *dma);\nextern VOID rausb_buffer_free(VOID *dev,\n\t\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\t\tVOID *addr,\n\t\t\t\t\t\t\t\tra_dma_addr_t dma);\nextern VOID rausb_kill_urb(VOID *urb);\n\nextern int rausb_control_msg(VOID *dev,\n\t\t\t\t\t\tunsigned int pipe,\n\t\t\t\t\t\t__u8 request,\n\t\t\t\t\t\t__u8 requesttype,\n\t\t\t\t\t\t__u16 value,\n\t\t\t\t\t\t__u16 index,\n\t\t\t\t\t\tvoid *data,\n\t\t\t\t\t\t__u16 size,\n\t\t\t\t\t\tint timeout);\n\n#endif /* RTMP_USB_SUPPORT */\n\n\n#ifdef RALINK_ATE\n/******************************************************************************\n\n  \tATE related definitions\n\n******************************************************************************/\n#define ate_print printk\n#define ATEDBGPRINT DBGPRINT\n\n#ifdef RTMP_MAC_USB\n#ifdef CONFIG_AP_SUPPORT\n#define EEPROM_BIN_FILE_NAME  \"/etc/Wireless/RT2870AP/e2p.bin\"\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#undef EEPROM_BIN_FILE_NAME /* Avoid APSTA mode re-define issue */\n#define EEPROM_BIN_FILE_NAME  \"/etc/Wireless/RT2870STA/e2p.bin\"\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#endif /* RALINK_ATE */\n\n\n/* OS definition re-declaration */\n#ifndef NULL\n#define NULL\t\t\t0\n#endif\n\n#ifndef ETH_P_IPV6\n#define ETH_P_IPV6\t\t0x86DD\n#endif\n\n#ifndef ETH_P_IP\n#define ETH_P_IP        0x0800          /* Internet Protocol packet     */\n#endif\n\n#ifndef ETH_ALEN\n#define ETH_ALEN\t\t6\n#endif\n\n#undef KERN_EMERG\n#define KERN_EMERG\n#undef KERN_WARNING\n#define KERN_WARNING\n\n#undef copy_from_user\n#undef copy_to_user\n\n#define RTMP_OS_MAX_SCAN_DATA_GET\t\tRtmpOsMaxScanDataGet\n#define vmalloc\t\t\t\t\t\t\tRtmpOsVmalloc\n#define vfree\t\t\t\t\t\t\tRtmpOsVfree\n#define copy_from_user\t\t\t\t\tRtmpOsCopyFromUser\n#define copy_to_user\t\t\t\t\tRtmpOsCopyToUser\n#define simple_strtol\t\t\t\t\tRtmpOsSimpleStrtol\n\n#undef atomic_read\n#undef atomic_dec\n#undef InterlockedExchange\n#define atomic_read\t\t\t\t\t\tRtmpOsAtomicRead\n#define atomic_dec\t\t\t\t\t\tRtmpOsAtomicDec\n#define InterlockedExchange\t\t\t\tRtmpOsAtomicInterlockedExchange\n\nextern int sprintf(char * buf, const char * fmt, ...);\nextern int sscanf(const char *, const char *, ...);\n\n#define printk\t\t\t\t\t\t\tpRaOsOps->ra_printk\n#define snprintf\t\t\t\t\t\tpRaOsOps->ra_snprintf\n\n#endif /* __RT_LINUX_H__ */\n"
  },
  {
    "path": "src/include/os/rt_linux.h",
    "content": "/****************************************************************************\n\n    Module Name:\n\trt_linux.h\n \n    Abstract:\n\tAny OS related definition/MACRO is defined here.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#ifndef __RT_LINUX_H__\n#define __RT_LINUX_H__\n\n#include <linux/module.h>\n#include <linux/version.h>\n#include <linux/kernel.h>\n#include <linux/spinlock.h>\n#include <linux/init.h>\n#include <linux/string.h>\n#include <linux/timer.h>\n#include <linux/errno.h>\n#include <linux/slab.h>\n#include <linux/interrupt.h>\n#include <linux/pci.h>\n#include <linux/netdevice.h>\n#include <linux/etherdevice.h>\n#include <linux/skbuff.h>\n#include <linux/ethtool.h>\n#include <linux/wireless.h>\n#include <linux/proc_fs.h>\n#include <linux/delay.h>\n#include <linux/if_arp.h>\n#include <linux/ctype.h>\n#include <linux/vmalloc.h>\n#ifdef RTMP_USB_SUPPORT\n#include <linux/usb.h>\n#endif /* RTMP_USB_SUPPORT */\n#include <linux/wireless.h>\n#include <net/iw_handler.h>\n\n#ifdef INF_PPA_SUPPORT\n#include <net/ifx_ppa_api.h>\n#include <net/ifx_ppa_hook.h>\n#endif /* INF_PPA_SUPPORT */\n\n/* load firmware */\n#define __KERNEL_SYSCALLS__\n#include <linux/unistd.h>\n#include <asm/uaccess.h>\n#include <asm/types.h>\n#include <asm/unaligned.h>\t/* for get_unaligned() */\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)\n#include <linux/pid.h>\n#endif\n\n#ifdef RT_CFG80211_SUPPORT\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))\n#include <net/mac80211.h>\n#define EXT_BUILD_CHANNEL_LIST\t\t/* must define with CRDA */\n#else /* LINUX_VERSION_CODE */\n#undef RT_CFG80211_SUPPORT\n#endif /* LINUX_VERSION_CODE */\n#endif /* RT_CFG80211_SUPPORT */\n\n#ifdef MAT_SUPPORT\n#include <linux/if_ether.h>\n#include <linux/if_arp.h>\n#include <linux/ip.h>\n#endif /* MAT_SUPPORT */\n\n/* must put the definition before include \"os/rt_linux_cmm.h\" */\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)\n#define KTHREAD_SUPPORT 1\n#endif /* LINUX_VERSION_CODE */\n\n#ifdef KTHREAD_SUPPORT\n#include <linux/err.h>\n#include <linux/kthread.h>\n#endif /* KTHREAD_SUPPORT */\n\n\n#include \"os/rt_linux_cmm.h\"\n\n#ifdef RT_CFG80211_SUPPORT\n#include \"cfg80211.h\"\n#endif /* RT_CFG80211_SUPPORT */\n\n#undef AP_WSC_INCLUDED\n#undef STA_WSC_INCLUDED\n#undef WSC_INCLUDED\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_AP_SUPPORT\n#define AP_WSC_INCLUDED\n#endif /* WSC_AP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\n#define STA_WSC_INCLUDED\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#if defined(WSC_AP_SUPPORT) || defined(WSC_STA_SUPPORT)\n#define WSC_INCLUDED\n#endif\n\n#ifdef KTHREAD_SUPPORT\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)\n#error \"This kerne version doesn't support kthread!!\"\n#endif\n#endif /* KTHREAD_SUPPORT */\n\n/*#ifdef RTMP_USB_SUPPORT // os abl move */\ntypedef struct usb_device\t*PUSB_DEV;\ntypedef struct urb *purbb_t;\ntypedef struct usb_ctrlrequest devctrlrequest;\n/*#endif */\n\n/***********************************************************************************\n *\tProfile related sections\n ***********************************************************************************/\n#ifdef CONFIG_AP_SUPPORT\n#ifdef RTMP_MAC_USB\n#ifdef INF_AMAZON_SE\n#define AP_PROFILE_PATH                 \"/ramdisk/etc/Wireless/RT2870AP/RT2870AP.dat\"\n#define AP_RTMP_FIRMWARE_FILE_NAME \"/ramdisk/etc/Wireless/RT2870AP/RT2870AP.bin\"\n#else\n#define AP_PROFILE_PATH\t\t\t\"/etc/Wireless/RT2870AP/RT2870AP.dat\"\n#define AP_RTMP_FIRMWARE_FILE_NAME \"/etc/Wireless/RT2870AP/RT2870AP.bin\"\n#endif\n#define AP_NIC_DEVICE_NAME\t\t\t\"RT2870AP\"\n#define AP_DRIVER_VERSION\t\t\t\"3.0.0.0\"\n#ifdef MULTIPLE_CARD_SUPPORT\n#define CARD_INFO_PATH\t\t\t\"/etc/Wireless/RT2870AP/RT2870APCard.dat\"\n#endif /* MULTIPLE_CARD_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef SINGLE_SKU_V2\n#define SINGLE_SKU_TABLE_FILE_NAME\t\"/etc/Wireless/RT2860STA/SingleSKU.dat\"\n#endif /* SINGLE_SKU_V2 */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\n#ifdef RTMP_MAC_USB\n#define STA_PROFILE_PATH\t\t\t\"/etc/Wireless/RT2870STA/RT2870STA.dat\"\n#define STA_DRIVER_VERSION\t\t\t\"3.0.0.3\"\n#ifdef MULTIPLE_CARD_SUPPORT\n#define CARD_INFO_PATH\t\t\t\"/etc/Wireless/RT2870STA/RT2870STACard.dat\"\n#endif /* MULTIPLE_CARD_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n\nextern\tconst struct iw_handler_def rt28xx_iw_handler_def;\n\n#ifdef SINGLE_SKU_V2\n#define SINGLE_SKU_TABLE_FILE_NAME\t\"/etc/Wireless/RT2870STA/SingleSKU.dat\"\n#endif /* SINGLE_SKU_V2 */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\nextern\tconst struct iw_handler_def rt28xx_ap_iw_handler_def;\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n/***********************************************************************************\n *\tCompiler related definitions\n ***********************************************************************************/\n#undef __inline\n#define __inline\t\tstatic inline\n#define IN\n#define OUT\n#define INOUT\n#define NDIS_STATUS\t\tINT\n\n\n/***********************************************************************************\n *\tOS Specific definitions and data structures\n ***********************************************************************************/\ntypedef struct net_device_stats\tNET_DEV_STATS;\ntypedef struct pci_dev \t\t* PPCI_DEV;\ntypedef struct net_device\t* PNET_DEV;\ntypedef void\t\t\t\t* PNDIS_PACKET;\ntypedef char\t\t\t\tNDIS_PACKET;\ntypedef PNDIS_PACKET\t\t* PPNDIS_PACKET;\ntypedef\tra_dma_addr_t\t\t\tNDIS_PHYSICAL_ADDRESS;\ntypedef\tra_dma_addr_t\t\t\t* PNDIS_PHYSICAL_ADDRESS;\ntypedef void\t\t\t\t* NDIS_HANDLE;\ntypedef char \t\t\t\t* PNDIS_BUFFER;\n\ntypedef struct ifreq\t\tNET_IOCTL;\ntypedef struct ifreq\t\t* PNET_IOCTL;\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)\ntypedef\tstruct pid *\tRTMP_OS_PID;\n#else\ntypedef pid_t \t\t\t\tRTMP_OS_PID;\n#endif\n\ntypedef struct semaphore\tOS_SEM;\n\ntypedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_dev);\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#define RT_MOD_INC_USE_COUNT() \\\n\tif (!try_module_get(THIS_MODULE)) \\\n\t{ \\\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: cannot reserve module\\n\", __FUNCTION__)); \\\n\t\treturn -1; \\\n\t}\n\n#define RT_MOD_DEC_USE_COUNT() module_put(THIS_MODULE);\n#else\n#define RT_MOD_INC_USE_COUNT()\tMOD_INC_USE_COUNT;\n#define RT_MOD_DEC_USE_COUNT() MOD_DEC_USE_COUNT;\n#endif\n\n#define RTMP_INC_REF(_A)\t\t0\n#define RTMP_DEC_REF(_A)\t\t0\n#define RTMP_GET_REF(_A)\t\t0\n\n\n#if WIRELESS_EXT >= 12\n/* This function will be called when query /proc */\nstruct iw_statistics *rt28xx_get_wireless_stats(\n    IN struct net_device *net_dev);\n#endif\n\n\n/***********************************************************************************\n *\tNetwork related constant definitions\n ***********************************************************************************/\n#ifndef IFNAMSIZ\n#define IFNAMSIZ 16\n#endif\n\n#define ETH_LENGTH_OF_ADDRESS\t6\n\n#define NDIS_STATUS_SUCCESS                     0x00\n#define NDIS_STATUS_FAILURE                     0x01\n#define NDIS_STATUS_INVALID_DATA\t\t\t\t0x02\n#define NDIS_STATUS_RESOURCES                   0x03\n\n#define NDIS_SET_PACKET_STATUS(_p, _status)\t\t\tdo{} while(0)\n#define NdisWriteErrorLogEntry(_a, _b, _c, _d)\t\tdo{} while(0)\n\n/* statistics counter */\n#define STATS_INC_RX_PACKETS(_pAd, _dev)\n#define STATS_INC_TX_PACKETS(_pAd, _dev)\n\n#define STATS_INC_RX_BYTESS(_pAd, _dev, len)\n#define STATS_INC_TX_BYTESS(_pAd, _dev, len)\n\n#define STATS_INC_RX_ERRORS(_pAd, _dev)\n#define STATS_INC_TX_ERRORS(_pAd, _dev)\n\n#define STATS_INC_RX_DROPPED(_pAd, _dev)\n#define STATS_INC_TX_DROPPED(_pAd, _dev)\n\n\n/***********************************************************************************\n *\tRalink Specific network related constant definitions\n ***********************************************************************************/\n#define MIN_NET_DEVICE_FOR_MBSSID\t\t0x00\t\t/*0x00,0x10,0x20,0x30 */\n#define MIN_NET_DEVICE_FOR_WDS\t\t\t0x10\t\t/*0x40,0x50,0x60,0x70 */\n#define MIN_NET_DEVICE_FOR_APCLI\t\t0x20\n#define MIN_NET_DEVICE_FOR_MESH\t\t\t0x30\n#ifdef CONFIG_STA_SUPPORT\n#define MIN_NET_DEVICE_FOR_DLS\t\t\t0x40\n#define MIN_NET_DEVICE_FOR_TDLS\t\t\t0x50\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef P2P_SUPPORT\n#define MIN_NET_DEVICE_FOR_P2P_CLI\t\t(MIN_NET_DEVICE_FOR_TDLS + 0x10)\n#define MIN_NET_DEVICE_FOR_P2P_GO\t\t\t(MIN_NET_DEVICE_FOR_TDLS + 0x20)\n#endif /* P2P_SUPPORT */\n\n#define NET_DEVICE_REAL_IDX_MASK\t\t0x0f\t\t/* for each operation mode, we maximum support 15 entities. */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#define NDIS_PACKET_TYPE_DIRECTED\t\t0\n#define NDIS_PACKET_TYPE_MULTICAST\t\t1\n#define NDIS_PACKET_TYPE_BROADCAST\t\t2\n#define NDIS_PACKET_TYPE_ALL_MULTICAST\t3\n#define NDIS_PACKET_TYPE_PROMISCUOUS\t4\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/***********************************************************************************\n *\tOS signaling related constant definitions\n ***********************************************************************************/\n\n\n/***********************************************************************************\n *\tOS file operation related data structure definitions\n ***********************************************************************************/\ntypedef struct file* RTMP_OS_FD;\n\ntypedef struct _OS_FS_INFO_\n{\n\tint\t\t\t\tfsuid;\n\tint\t\t\t\tfsgid;\n\tmm_segment_t\tfs;\n} OS_FS_INFO;\n\n#define IS_FILE_OPEN_ERR(_fd) \t((_fd == NULL) || IS_ERR((_fd)))\n\n\n/***********************************************************************************\n *\tOS semaphore related data structure and definitions\n ***********************************************************************************/\nstruct os_lock  {\n\tspinlock_t\t\tlock;\n\tunsigned long  \tflags;\n};\n\ntypedef spinlock_t\t\t\tOS_NDIS_SPIN_LOCK;\n\n/* */\n/*  spin_lock enhanced for Nested spin lock */\n/* */\n#define OS_NdisAllocateSpinLock(__lock)\t\t\t\\\n{                                       \t\t\\\n    spin_lock_init((spinlock_t *)(__lock));\t\t\\\n}\n\n#define OS_NdisFreeSpinLock(lock)\t\t\t\t\\\n\tdo{}while(0)\n\n\n#define OS_SEM_LOCK(__lock)\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_lock_bh((spinlock_t *)(__lock));\t\t\\\n}\n\n#define OS_SEM_UNLOCK(__lock)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_unlock_bh((spinlock_t *)(__lock));\t\t\\\n}\n\n\n/* sample, use semaphore lock to replace IRQ lock, 2007/11/15 */\n#ifdef MULTI_CORE_SUPPORT\n\n#define OS_IRQ_LOCK(__lock, __irqflags)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__irqflags = 0;\t\t\t\t\t\t\t\t\t\\\n\tspin_lock_irqsave((spinlock_t *)(__lock), __irqflags);\t\t\t\\\n}\n\n#define OS_IRQ_UNLOCK(__lock, __irqflag)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_unlock_irqrestore((spinlock_t *)(__lock), __irqflag);\t\t\t\\\n}\n#else\n#define OS_IRQ_LOCK(__lock, __irqflags)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__irqflags = 0;\t\t\t\t\t\t\t\t\\\n\tspin_lock_bh((spinlock_t *)(__lock));\t\t\\\n}\n\n#define OS_IRQ_UNLOCK(__lock, __irqflag)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_unlock_bh((spinlock_t *)(__lock));\t\t\\\n}\n#endif // MULTI_CORE_SUPPORT //\n#define OS_INT_LOCK(__lock, __irqflags)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_lock_irqsave((spinlock_t *)__lock, __irqflags);\t\\\n}\n\n#define OS_INT_UNLOCK(__lock, __irqflag)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_unlock_irqrestore((spinlock_t *)(__lock), ((unsigned long)__irqflag));\t\\\n}\n\n#define OS_NdisAcquireSpinLock\t\tOS_SEM_LOCK\n#define OS_NdisReleaseSpinLock\t\tOS_SEM_UNLOCK\n\n/*\n\tFollowing lock/unlock definition used for BBP/RF register read/write.\n\tCurrently we don't use it to protect MAC register access.\n\n\tFor USB: \n\t\t\twe use binary semaphore to do the protection because all register \n\t\t\taccess done in kernel thread and should allow task go sleep when\n\t\t\tin protected status.\n\n\tFor PCI/PCI-E/RBUS:\n\t\t\tWe use interrupt to do the protection because the register may accessed\n\t\t\tin thread/tasklet/timer/inteerupt, so we use interrupt_disable to protect\n\t\t\tthe access.\n*/\t\n#define RTMP_MCU_RW_LOCK(_pAd, _irqflags)\t\\\n\tdo{\t\t\t\t\t\t\t\t\\\n\t\tif (_pAd->infType == RTMP_DEV_INF_USB)\t\\\n\t\t{\\\n\t\t\tRTMP_SEM_EVENT_WAIT(&_pAd->McuCmdSem, _irqflags);\\\n\t\t}\\\n\t\telse\\\n\t\t{\\\n\t\t\tRTMP_SEM_LOCK(&_pAd->McuCmdLock, _irqflags);\\\n\t\t}\\\n\t}while(0)\n\n#define RTMP_MCU_RW_UNLOCK(_pAd, _irqflags)\t\\\n\tdo{\t\t\t\t\\\n\t\tif(_pAd->infType == RTMP_DEV_INF_USB)\\\n\t\t{\t\\\n\t\t\tRTMP_SEM_EVENT_UP(&_pAd->McuCmdSem);\\\n\t\t}\t\t\\\n\t\telse\\\n\t\t{\\\n\t\t\tRTMP_SEM_UNLOCK(&_pAd->McuCmdLock, _irqflags);\\\n\t\t}\\\n\t}while(0)\n\n\t\n#ifndef wait_event_interruptible_timeout\n#define __wait_event_interruptible_timeout(wq, condition, ret) \\\ndo { \\\n        wait_queue_t __wait; \\\n        init_waitqueue_entry(&__wait, current); \\\n        add_wait_queue(&wq, &__wait); \\\n        for (;;) { \\\n                set_current_state(TASK_INTERRUPTIBLE); \\\n                if (condition) \\\n                        break; \\\n                if (!signal_pending(current)) { \\\n                        ret = schedule_timeout(ret); \\\n                        if (!ret) \\\n                                break; \\\n                        continue; \\\n                } \\\n                ret = -ERESTARTSYS; \\\n                break; \\\n        } \\\n        current->state = TASK_RUNNING; \\\n        remove_wait_queue(&wq, &__wait); \\\n} while (0)\n\n#define wait_event_interruptible_timeout(wq, condition, timeout) \\\n({ \\\n        long __ret = timeout; \\\n        if (!(condition)) \\\n                __wait_event_interruptible_timeout(wq, condition, __ret); \\\n        __ret; \\\n})\n#endif\n\n#define OS_SEM_EVENT_INIT_LOCKED(_pSema) \tsema_init((_pSema), 0)\n#define OS_SEM_EVENT_INIT(_pSema)\t\t\tsema_init((_pSema), 1)\n#define OS_SEM_EVENT_DESTORY(_pSema)\t\tdo{}while(0)\n#define OS_SEM_EVENT_WAIT(_pSema, _status)\t((_status) = down_interruptible((_pSema)))\n#define OS_SEM_EVENT_UP(_pSema)\t\t\t\tup(_pSema)\n\n#define RTCMDUp\t\t\t\t\tOS_RTCMDUp\n\n#ifdef KTHREAD_SUPPORT\n#define RTMP_WAIT_EVENT_INTERRUPTIBLE(_Status, _pTask) \\\ndo { \\\n\t\twait_event_interruptible(_pTask->kthread_q, \\\n\t\t\t\t\t\t\t\t _pTask->kthread_running || kthread_should_stop()); \\\n\t\t_pTask->kthread_running = FALSE; \\\n\t\tif (kthread_should_stop()) \\\n\t\t{ \\\n\t\t\t(_Status) = -1; \\\n\t\t\tbreak; \\\n\t\t} \\\n\t\telse (_Status) = 0; \\\n} while(0)\n#endif\n\n#ifdef KTHREAD_SUPPORT\n#define WAKE_UP(_pTask) \\\n\tdo{ \\\n\t\tif ((_pTask)->kthread_task) \\\n        { \\\n\t\t\t(_pTask)->kthread_running = TRUE; \\\n\t        wake_up(&(_pTask)->kthread_q); \\\n\t\t} \\\n\t}while(0)\n#endif\n\n/***********************************************************************************\n *\tOS Memory Access related data structure and definitions\n ***********************************************************************************/\n#define MEM_ALLOC_FLAG      (GFP_ATOMIC) /*(GFP_DMA | GFP_ATOMIC) */\n\n#define NdisMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length)\n#define NdisCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length)\n#define NdisZeroMemory(Destination, Length)         memset(Destination, 0, Length)\n#define NdisFillMemory(Destination, Length, Fill)   memset(Destination, Fill, Length)\n#define NdisCmpMemory(Destination, Source, Length)  memcmp(Destination, Source, Length)\n#define NdisEqualMemory(Source1, Source2, Length)   (!memcmp(Source1, Source2, Length))\n#define RTMPEqualMemory(Source1, Source2, Length)\t(!memcmp(Source1, Source2, Length))\n\n#define MlmeAllocateMemory(_pAd, _ppVA)\t\tos_alloc_mem(_pAd, _ppVA, MGMT_DMA_BUFFER_SIZE)\n#define MlmeFreeMemory(_pAd, _pVA)\t\t\tos_free_mem(_pAd, _pVA)\n\n#define COPY_MAC_ADDR(Addr1, Addr2)             memcpy((Addr1), (Addr2), MAC_ADDR_LEN)\n\n\n/***********************************************************************************\n *\tOS task related data structure and definitions\n ***********************************************************************************/\n#define RTMP_OS_MGMT_TASK_FLAGS\tCLONE_VM\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)\n/*typedef\tstruct pid *\tTHREAD_PID; // no use */\n#define\tTHREAD_PID_INIT_VALUE\tNULL\n/* TODO: Use this IOCTL carefully when linux kernel version larger than 2.6.27, because the PID only correct when the user space task do this ioctl itself. */\n/*#define RTMP_GET_OS_PID(_x, _y)    _x = get_task_pid(current, PIDTYPE_PID); */\n#define RT_GET_OS_PID(_x, _y)\t\tdo{rcu_read_lock(); _x=(ULONG)current->pids[PIDTYPE_PID].pid; rcu_read_unlock();}while(0)\n#ifdef OS_ABL_FUNC_SUPPORT\n#define RTMP_GET_OS_PID(_a, _b)\t\t\tRtmpOsGetPid(&_a, _b)\n#else\n#define RTMP_GET_OS_PID(_a, _b)\t\t\tRT_GET_OS_PID(_a, _b)\n#endif\n#define\tGET_PID_NUMBER(_v)\tpid_nr((_v))\n#define CHECK_PID_LEGALITY(_pid)\tif (pid_nr((_pid)) > 0)\n#define KILL_THREAD_PID(_A, _B, _C)\tkill_pid((_A), (_B), (_C))\n#else\n/*typedef\tpid_t\tTHREAD_PID; // no use */\n#define\tTHREAD_PID_INIT_VALUE\t-1\n#define RT_GET_OS_PID(_x, _pid)\t\t_x = _pid\n#define RTMP_GET_OS_PID(_x, _pid)\t\t_x = _pid\n#define\tGET_PID_NUMBER(_v)\t(_v)\n#define CHECK_PID_LEGALITY(_pid)\tif ((_pid) >= 0)\n#define KILL_THREAD_PID(_A, _B, _C)\tkill_proc((_A), (_B), (_C))\n#endif\n\n#define ATE_KILL_THREAD_PID(PID)\t\tKILL_THREAD_PID(PID, SIGTERM, 1)\n\ntypedef int (*cast_fn)(void *);\ntypedef INT (*RTMP_OS_TASK_CALLBACK)(ULONG);\n\n#ifdef WORKQUEUE_BH\ntypedef struct work_struct OS_NET_TASK_STRUCT;\ntypedef struct work_struct *POS_NET_TASK_STRUCT;\n#else\ntypedef struct tasklet_struct OS_NET_TASK_STRUCT;\ntypedef struct tasklet_struct  *POS_NET_TASK_STRUCT;\n#endif /* WORKQUEUE_BH */\n\n/***********************************************************************************\n * Timer related definitions and data structures.\n **********************************************************************************/\n#define OS_HZ\t\t\tHZ\n\ntypedef struct timer_list\tOS_NDIS_MINIPORT_TIMER;\ntypedef struct timer_list\tOS_TIMER;\n\ntypedef void (*TIMER_FUNCTION)(unsigned long);\n\n\n#define OS_WAIT(_time) \\\n{\t\\\n\tif (in_interrupt()) \\\n\t{\\\n\t\tRTMPusecDelay(_time * 1000);\\\n\t}else\t\\\n\t{\\\n\t\tint _i; \\\n\t\tlong _loop = ((_time)/(1000/OS_HZ)) > 0 ? ((_time)/(1000/OS_HZ)) : 1;\\\n\t\twait_queue_head_t _wait; \\\n\t\tinit_waitqueue_head(&_wait); \\\n\t\tfor (_i=0; _i<(_loop); _i++) \\\n\t\t\twait_event_interruptible_timeout(_wait, 0, ONE_TICK); \\\n\t}\\\n}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#define RTMP_TIME_AFTER(a,b)\t\t\\\n\t(typecheck(unsigned long, (unsigned long)a) && \\\n\t typecheck(unsigned long, (unsigned long)b) && \\\n\t ((long)(b) - (long)(a) < 0))\n\n#define RTMP_TIME_AFTER_EQ(a,b)\t\\\n\t(typecheck(unsigned long, (unsigned long)a) && \\\n\t typecheck(unsigned long, (unsigned long)b) && \\\n\t ((long)(a) - (long)(b) >= 0))\n#define RTMP_TIME_BEFORE(a,b)\tRTMP_TIME_AFTER_EQ(b,a)\n#else\n#define typecheck(type,x) \\\n({      type __dummy; \\\n        typeof(x) __dummy2; \\\n        (void)(&__dummy == &__dummy2); \\\n        1; \\\n})\n#define RTMP_TIME_AFTER_EQ(a,b)\t\\\n\t(typecheck(unsigned long, (unsigned long)a) && \\\n\t typecheck(unsigned long, (unsigned long)b) && \\\n\t ((long)(a) - (long)(b) >= 0))\n#define RTMP_TIME_BEFORE(a,b)\tRTMP_TIME_AFTER_EQ(b,a)\n#define RTMP_TIME_AFTER(a,b) time_after(a, b)\n#endif\n\n#define ONE_TICK 1\n\nstatic inline void NdisGetSystemUpTime(ULONG *time)\n{\n\t*time = jiffies;\n}\n\n\n/***********************************************************************************\n *\tOS specific cookie data structure binding to RTMP_ADAPTER\n ***********************************************************************************/\n\nstruct os_cookie {\n\n#ifdef RTMP_MAC_USB\n\tstruct usb_device\t\t*pUsb_Dev;\n#ifdef CONFIG_STA_SUPPORT\n\tstruct usb_interface *intf;\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#ifdef WORKQUEUE_BH\n\tUINT32\t\t     pAd_va;\n#endif /* WORKQUEUE_BH */\n\n\tRTMP_NET_TASK_STRUCT rx_done_task;\n\tRTMP_NET_TASK_STRUCT cmd_rsp_event_task;\n\tRTMP_NET_TASK_STRUCT mgmt_dma_done_task;\n\tRTMP_NET_TASK_STRUCT ac0_dma_done_task;\n#ifdef RALINK_ATE\n\tRTMP_NET_TASK_STRUCT ate_ac0_dma_done_task;\n#endif /* RALINK_ATE */\n\tRTMP_NET_TASK_STRUCT ac1_dma_done_task;\n\tRTMP_NET_TASK_STRUCT ac2_dma_done_task;\n\tRTMP_NET_TASK_STRUCT ac3_dma_done_task;\n\tRTMP_NET_TASK_STRUCT hcca_dma_done_task;\n\tRTMP_NET_TASK_STRUCT tbtt_task;\n\n\n#ifdef UAPSD_SUPPORT\n\tRTMP_NET_TASK_STRUCT uapsd_eosp_sent_task;\n#endif /* UAPSD_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef DFS_SUPPORT\n#ifdef DFS_SOFTWARE_SUPPORT\n\tRTMP_NET_TASK_STRUCT pulse_radar_detect_task;\n\tRTMP_NET_TASK_STRUCT width_radar_detect_task;\n#endif /* DFS_SOFTWARE_SUPPORT */\n#endif /* DFS_SUPPORT */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\tRTMP_NET_TASK_STRUCT carrier_sense_task;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DFS_SUPPORT\n\tstruct tasklet_struct\tdfs_task;\n#endif /* DFS_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef RTMP_MAC_USB\n\tRTMP_NET_TASK_STRUCT null_frame_complete_task;\n\tRTMP_NET_TASK_STRUCT pspoll_frame_complete_task;\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tRTMP_NET_TASK_STRUCT\thcca_null_frame_complete_task;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\tRTMP_OS_PID\t\t\tapd_pid; /*802.1x daemon pid */\n\tunsigned long\t\t\tapd_pid_nr;\n#ifdef CONFIG_AP_SUPPORT\n#ifdef IAPP_SUPPORT\n/*\tRT_SIGNAL_STRUC\t\t\tRTSignal; */\n\tRTMP_OS_PID\t\t\tIappPid; /*IAPP daemon pid */\n\tunsigned long\t\t\tIappPid_nr;\n#endif /* IAPP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef WAPI_SUPPORT\n\tRTMP_OS_PID\t\t\twapi_pid; /*wapi daemon pid */\n\tunsigned long\t\t\twapi_pid_nr;\n#endif /* WAPI_SUPPORT */\n\tINT\t\t\t\t\t\tioctl_if_type;\n\tINT \t\t\t\t\tioctl_if;\n};\n\ntypedef struct os_cookie\t* POS_COOKIE;\n\n\n\n/***********************************************************************************\n *\tOS debugging and printing related definitions and data structure\n ***********************************************************************************/\n#define PRINT_MAC(addr)\t\\\n\taddr[0], addr[1], addr[2], addr[3], addr[4], addr[5]\n\n#ifdef DBG\nextern ULONG\t\tRTDebugLevel;\nextern ULONG\t\tRTDebugFunc;\n\n#define DBGPRINT_RAW(Level, Fmt)    \\\ndo{                                   \\\n\tULONG __gLevel = (Level) & 0xff;\\\n\tULONG __fLevel = ((Level)>>8) & 0xffffff;\\\n    if (__gLevel <= RTDebugLevel)      \\\n    {                               \\\n    \tif ((RTDebugFunc == 0) || \\\n\t\t((RTDebugFunc != 0) && (((__fLevel & RTDebugFunc)!= 0) || (__gLevel <= RT_DEBUG_ERROR))))\\\n        printk Fmt;               \\\n    }                               \\\n}while(0)\n\n#define DBGPRINT(Level, Fmt)    DBGPRINT_RAW(Level, Fmt)\n\n\n#define DBGPRINT_ERR(Fmt)           \\\n{                                   \\\n    printk(\"ERROR!!! \");          \\\n    printk Fmt;                  \\\n}\n\n#define DBGPRINT_S(Status, Fmt)\t\t\\\n{\t\t\t\t\t\t\t\t\t\\\n\tprintk Fmt;\t\t\t\t\t\\\n}\n#else\n#define DBGPRINT(Level, Fmt)\n#define DBGPRINT_RAW(Level, Fmt)\n#define DBGPRINT_S(Status, Fmt)\n#define DBGPRINT_ERR(Fmt)\n#endif\n\n#undef  ASSERT\n#ifdef DBG\n#define ASSERT(x)                                                               \\\n{                                                                               \\\n    if (!(x))                                                                   \\\n    {                                                                           \\\n        printk(KERN_WARNING __FILE__ \":%d assert \" #x \"failed\\n\", __LINE__);    \\\n    }                                                                           \\\n}\n#else\n#define ASSERT(x)\n#endif /* DBG */\n\nvoid hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen);\n\n\n/*********************************************************************************************************\n\tThe following code are not revised, temporary put it here.\n  *********************************************************************************************************/\n\n\n/***********************************************************************************\n * Device DMA Access related definitions and data structures.\n **********************************************************************************/\nra_dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction);\nvoid linux_pci_unmap_single(void *handle, ra_dma_addr_t dma_addr, size_t size, int direction);\n\n#define PCI_MAP_SINGLE_DEV(_handle, _ptr, _size, _sd_idx, _dir)\t\t\t\t\\\n\tlinux_pci_map_single(_handle, _ptr, _size, _sd_idx, _dir)\n\t\n#define PCI_UNMAP_SINGLE(_pAd, _ptr, _size, _dir)\t\t\t\t\t\t\\\n\tlinux_pci_unmap_single(((POS_COOKIE)(_pAd->OS_Cookie))->pci_dev, _ptr, _size, _dir)\n\n#define PCI_ALLOC_CONSISTENT(_pci_dev, _size, _ptr) \\\n\tpci_alloc_consistent(_pci_dev, _size, _ptr)\n\n#define PCI_FREE_CONSISTENT(_pci_dev, _size, _virtual_addr, _physical_addr) \\\n\tpci_free_consistent(_pci_dev, _size, _virtual_addr, _physical_addr)\n\n#ifdef VENDOR_FEATURE2_SUPPORT\n#define DEV_ALLOC_SKB(_pAd, _Pkt, _length)\t\\\n\t_Pkt = dev_alloc_skb(_length);\t\t\t\\\n\tif (_Pkt != NULL) {MEM_DBG_PKT_ALLOC_INC(_Pkt);};\n#else\n\n#define DEV_ALLOC_SKB(_pAd, _Pkt, _length)\t\\\n\t_Pkt = dev_alloc_skb(_length);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\n/*#define PCI_MAP_SINGLE(_handle, _ptr, _size, _dir) (ULONG)0 */\n/*#define PCI_UNMAP_SINGLE(_handle, _ptr, _size, _dir) */\n\n\n/*\n * ULONG\n * RTMP_GetPhysicalAddressLow(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);\n */\n#define RTMP_GetPhysicalAddressLow(PhysicalAddress)\t\t(PhysicalAddress)\n\n/*\n * ULONG\n * RTMP_GetPhysicalAddressHigh(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);\n */\n#define RTMP_GetPhysicalAddressHigh(PhysicalAddress)\t\t(0)\n\n/*\n * VOID\n * RTMP_SetPhysicalAddressLow(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,\n *   IN ULONG  Value);\n */\n#define RTMP_SetPhysicalAddressLow(PhysicalAddress, Value)\t\\\n\t\t\tPhysicalAddress = Value;\n\n/*\n * VOID\n * RTMP_SetPhysicalAddressHigh(\n *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,\n *   IN ULONG  Value);\n */\n#define RTMP_SetPhysicalAddressHigh(PhysicalAddress, Value)\n\n#define NdisMIndicateStatus(_w, _x, _y, _z)\n\n\n\n/***********************************************************************************\n * Device Register I/O Access related definitions and data structures.\n **********************************************************************************/\n\n#ifdef RTMP_MAC_USB\n#define RTMP_IO_FORCE_READ32(_A, _R, _pV)\t\t\t\t\t\t\t\t\\\n\tRTUSBReadMACRegister((_A), (_R), (PUINT32) (_pV))\n\n#define RTMP_IO_READ32(_A, _R, _pV)\t\t\t\t\t\t\t\t\\\n\tRTUSBReadMACRegister((_A), (_R), (PUINT32) (_pV))\n\n#define RTMP_IO_FORCE_WRITE32(_A, _R, _V)\t\\\n\tdo{\\\n\t\t/*if ((_R) != 0x404)*/ /* TODO:shiang-6590, depends on sw porting guide, don't acccess it now */\\\n\t\t\tRTUSBWriteMACRegister((_A), (_R), (UINT32) (_V), FALSE);\t\t\\\n\t}while(0)\n\n#define RTMP_IO_READ8(_A, _R, _pV)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n#define RTMP_IO_WRITE32(_A, _R, _V)\t\t\t\t\t\t\t\t\\\n\tRTUSBWriteMACRegister((_A), (_R), (UINT32) (_V), FALSE)\n\n#define RTMP_IO_WRITE8(_A, _R, _V)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tUSHORT\t_Val = _V;\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTUSBSingleWrite((_A), (_R), (USHORT) (_Val), FALSE);\t\t\\\n}\n\n\n#define RTMP_IO_WRITE16(_A, _R, _V)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTUSBSingleWrite((_A), (_R), (USHORT) (_V), FALSE);\t\t\t\\\n}\n\n#define RTMP_SYS_IO_READ32\n#define RTMP_SYS_IO_WRITE32\n#endif /* RTMP_MAC_USB */\n\n#define RTMP_USB_URB_DATA_GET(__pUrb)\t\t\t((purbb_t)__pUrb)->context\n#define RTMP_USB_URB_STATUS_GET(__pUrb)\t\t\t((purbb_t)__pUrb)->status\n#define RTMP_USB_URB_LEN_GET(__pUrb)\t\t\t((purbb_t)__pUrb)->actual_length\n\n/***********************************************************************************\n *\tNetwork Related data structure and marco definitions\n ***********************************************************************************/\n#define PKTSRC_NDIS             0x7f\n#define PKTSRC_DRIVER           0x0f\n\n#define RTMP_OS_NETDEV_STATE_RUNNING(_pNetDev)\t((_pNetDev)->flags & IFF_UP)\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)\n#define _RTMP_OS_NETDEV_GET_PRIV(_pNetDev)\t\t((_pNetDev)->ml_priv)\n#define _RTMP_OS_NETDEV_SET_PRIV(_pNetDev, _pPriv)\t((_pNetDev)->ml_priv = (_pPriv))\n#else\n#define _RTMP_OS_NETDEV_GET_PRIV(_pNetDev)\t\t((_pNetDev)->priv)\n#define _RTMP_OS_NETDEV_SET_PRIV(_pNetDev, _pPriv)\t((_pNetDev)->priv = (_pPriv))\n#endif\n\n#define RTMP_OS_NETDEV_GET_DEVNAME(_pNetDev)\t((_pNetDev)->name)\n#define RTMP_OS_NETDEV_GET_PHYADDR(_pNetDev)\t((_pNetDev)->dev_addr)\n\n/* Get & Set NETDEV interface hardware type */\n#define RTMP_OS_NETDEV_GET_TYPE(_pNetDev)\t\t\t((_pNetDev)->type)\n#define RTMP_OS_NETDEV_SET_TYPE(_pNetDev, _type)\t((_pNetDev)->type = (_type))\n#define RTMP_OS_NETDEV_SET_TYPE_MONITOR(_pNetDev)\tRTMP_OS_NETDEV_SET_TYPE(_pNetDev, ARPHRD_IEEE80211_PRISM)\n\n#define RTMP_OS_NETDEV_START_QUEUE(_pNetDev)\tnetif_start_queue((_pNetDev))\n#define RTMP_OS_NETDEV_STOP_QUEUE(_pNetDev)\tnetif_stop_queue((_pNetDev))\n#define RTMP_OS_NETDEV_WAKE_QUEUE(_pNetDev)\tnetif_wake_queue((_pNetDev))\n#define RTMP_OS_NETDEV_CARRIER_OFF(_pNetDev)\tnetif_carrier_off((_pNetDev))\n\n#define QUEUE_ENTRY_TO_PACKET(pEntry) \\\n\t(PNDIS_PACKET)(pEntry)\n\n#define PACKET_TO_QUEUE_ENTRY(pPacket) \\\n\t(PQUEUE_ENTRY)(pPacket)\n\n#ifdef CONFIG_5VT_ENHANCE\n#define BRIDGE_TAG 0x35564252    /* depends on 5VT define in br_input.c */\n#endif\n\n#define GET_SG_LIST_FROM_PACKET(_p, _sc)\t\\\n    rt_get_sg_list_from_packet(_p, _sc)\n\n#define RELEASE_NDIS_PACKET(_pAd, _pPacket, _Status)                    \\\n{                                                                       \\\n        RTMPFreeNdisPacket(_pAd, _pPacket);                             \\\n}\n\n\n/*\n * packet helper\n * \t- convert internal rt packet to os packet or\n *             os packet to rt packet\n */\n#define RTPKT_TO_OSPKT(_p)\t\t((struct sk_buff *)(_p))\n#define OSPKT_TO_RTPKT(_p)\t\t((PNDIS_PACKET)(_p))\n\n#define GET_OS_PKT_DATAPTR(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->data)\n#define SET_OS_PKT_DATAPTR(_pkt, _dataPtr)\t\\\n\t\t(RTPKT_TO_OSPKT(_pkt)->data) = (_dataPtr)\n\n#define GET_OS_PKT_LEN(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->len)\n#define SET_OS_PKT_LEN(_pkt, _len)\t\\\n\t\t(RTPKT_TO_OSPKT(_pkt)->len) = (_len)\n\t\t\n#define GET_OS_PKT_DATATAIL(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->tail)\n#define SET_OS_PKT_DATATAIL(_pkt, _start, _len)\t\\\n\t\t((RTPKT_TO_OSPKT(_pkt))->tail) = (PUCHAR)((_start) + (_len))\n\t\t\n#define GET_OS_PKT_HEAD(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->head)\n\n#define GET_OS_PKT_END(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->end)\n\n#define GET_OS_PKT_NETDEV(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->dev)\n#define SET_OS_PKT_NETDEV(_pkt, _pNetDev)\t\\\n\t\t(RTPKT_TO_OSPKT(_pkt)->dev) = (_pNetDev)\n\t\t\n#define GET_OS_PKT_TYPE(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt))\n\n#define GET_OS_PKT_NEXT(_pkt) \\\n\t\t(RTPKT_TO_OSPKT(_pkt)->next)\n\n\n#define OS_PKT_CLONED(_pkt)\t\tskb_cloned(RTPKT_TO_OSPKT(_pkt))\n#define OS_PKT_COPY(_pkt)\t\tskb_copy(RTPKT_TO_OSPKT(_pkt), GFP_ATOMIC)\n\n#define OS_PKT_TAIL_ADJUST(_pkt, _removedTagLen)\t\t\t\t\t\t\t\t\\\n\tSET_OS_PKT_DATATAIL(_pkt, GET_OS_PKT_DATATAIL(_pkt), (-_removedTagLen));\t\\\n\tGET_OS_PKT_LEN(_pkt) -= _removedTagLen;\n\n#define OS_PKT_HEAD_BUF_EXTEND(_pkt, _offset)\t\t\t\t\t\t\t\t\\\n\tskb_push(RTPKT_TO_OSPKT(_pkt), _offset)\n\n#define OS_PKT_TAIL_BUF_EXTEND(_pkt, _Len)\t\t\t\t\t\t\t\t\t\\\n\tskb_put(RTPKT_TO_OSPKT(_pkt), _Len)\n\n#define OS_PKT_RESERVE(_pkt, _Len)\t\t\t\t\t\t\t\t\t\t\t\\\n\tskb_reserve(RTPKT_TO_OSPKT(_pkt), _Len)\n\n#define RTMP_OS_PKT_INIT(__pRxPacket, __pNetDev, __pData, __DataSize)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPNDIS_PACKET __pRxPkt;\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pRxPkt = RTPKT_TO_OSPKT(__pRxPacket);\t\t\t\t\t\t\t\t\t\\\n\tSET_OS_PKT_NETDEV(__pRxPkt, __pNetDev);\t\t\t\t\t\t\t\t\t\\\n\tSET_OS_PKT_DATAPTR(__pRxPkt, __pData);\t\t\t\t\t\t\t\t\t\\\n\tSET_OS_PKT_LEN(__pRxPkt, __DataSize);\t\t\t\t\t\t\t\t\t\\\n\tSET_OS_PKT_DATATAIL(__pRxPkt, __pData, __DataSize);\t\t\t\t\t\t\\\n}\n\n#ifdef VENDOR_FEATURE2_SUPPORT\n#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag)\t\t\\\n\t_src = skb_clone(RTPKT_TO_OSPKT(_pkt), _flag);\t\\\n\tif (_src != NULL) OS_NumOfPktAlloc ++;\n#else\n\n#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag)\t\t\\\n\t_src = skb_clone(RTPKT_TO_OSPKT(_pkt), _flag);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\n#define get_unaligned32\t\t\t\t\t\t\tget_unaligned\n#define get_unalignedlong\t\t\t\t\t\tget_unaligned\n\n#define OS_NTOHS(_Val) \\\n\t\t(ntohs((_Val)))\n#define OS_HTONS(_Val) \\\n\t\t(htons((_Val)))\n#define OS_NTOHL(_Val) \\\n\t\t(ntohl((_Val)))\n#define OS_HTONL(_Val) \\\n\t\t(htonl((_Val)))\n\n#define CB_OFF  10\n\n#define GET_OS_PKT_CB(_p)\t\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb)\n\n/* User Priority */\n#define RTMP_SET_PACKET_UP(_p, _prio)\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+0] = _prio)\n#define RTMP_GET_PACKET_UP(_p)\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+0])\n\n/* Fragment # */\n#define RTMP_SET_PACKET_FRAGMENTS(_p, _num)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+1] = _num)\n#define RTMP_GET_PACKET_FRAGMENTS(_p)\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+1])\n\n/* 0x0 ~0x7f: TX to AP's own BSS which has the specified AID. if AID>127, set bit 7 in RTMP_SET_PACKET_EMACTAB too. */\n/*(this value also as MAC(on-chip WCID) table index) */\n/* 0x80~0xff: TX to a WDS link. b0~6: WDS index */\n#define RTMP_SET_PACKET_WCID(_p, _wdsidx)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+2] = _wdsidx)\n#define RTMP_GET_PACKET_WCID(_p)          \t\t((UCHAR)(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+2]))\n\n/* 0xff: PKTSRC_NDIS, others: local TX buffer index. This value affects how to a packet */\n#define RTMP_SET_PACKET_SOURCE(_p, _pktsrc)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+3] = _pktsrc)\n#define RTMP_GET_PACKET_SOURCE(_p)       \t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+3])\n\n/* RTS/CTS-to-self protection method */\n#define RTMP_SET_PACKET_RTS(_p, _num)      \t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+4] = _num)\n#define RTMP_GET_PACKET_RTS(_p)          \t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+4])\n/* see RTMP_S(G)ET_PACKET_EMACTAB */\n\n/* TX rate index */\n#define RTMP_SET_PACKET_TXRATE(_p, _rate)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+5] = _rate)\n#define RTMP_GET_PACKET_TXRATE(_p)\t\t  \t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+5])\n\n/* From which Interface */\n#define RTMP_SET_PACKET_IF(_p, _ifdx)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+6] = _ifdx)\n#define RTMP_GET_PACKET_IF(_p)\t\t  \t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+6])\n#define RTMP_SET_PACKET_NET_DEVICE_MBSSID(_p, _bss)\t\tRTMP_SET_PACKET_IF((_p), (_bss))\n#define RTMP_SET_PACKET_NET_DEVICE_WDS(_p, _bss)\t\tRTMP_SET_PACKET_IF((_p), ((_bss) + MIN_NET_DEVICE_FOR_WDS))\n#define RTMP_SET_PACKET_NET_DEVICE_APCLI(_p, _idx)   \tRTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_APCLI))\n#define RTMP_SET_PACKET_NET_DEVICE_MESH(_p, _idx)   \tRTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_MESH))\n#define RTMP_SET_PACKET_NET_DEVICE_P2P(_p, _idx)   \t\tRTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_P2P_GO))\n#define RTMP_GET_PACKET_NET_DEVICE_MBSSID(_p)\t\t\tRTMP_GET_PACKET_IF((_p))\n#define RTMP_GET_PACKET_NET_DEVICE(_p)\t\t\t\t\tRTMP_GET_PACKET_IF((_p))\n\n#define RTMP_SET_PACKET_MOREDATA(_p, _morebit)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+7] = _morebit)\n#define RTMP_GET_PACKET_MOREDATA(_p)\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+7])\n\n\n\n#ifdef UAPSD_SUPPORT\n/* if we queue a U-APSD packet to any software queue, we will set the U-APSD\n   flag and its physical queue ID for it */\n#define RTMP_SET_PACKET_UAPSD(_p, _flg_uapsd, _que_id) \\\n                    (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+9] = ((_flg_uapsd<<7) | _que_id))\n\n#define RTMP_SET_PACKET_QOS_NULL(_p)     (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+9] = 0xff)\n#define RTMP_GET_PACKET_QOS_NULL(_p)\t (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+9])\n#define RTMP_SET_PACKET_NON_QOS_NULL(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+9] = 0x00)\n#define RTMP_GET_PACKET_UAPSD_Flag(_p)   (((RTPKT_TO_OSPKT(_p)->cb[CB_OFF+9]) & 0x80) >> 7)\n#define RTMP_GET_PACKET_UAPSD_QUE_ID(_p) ((RTPKT_TO_OSPKT(_p)->cb[CB_OFF+9]) & 0x7f)\n\n#define RTMP_SET_PACKET_EOSP(_p, _flg)   (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+10] = _flg)\n#define RTMP_GET_PACKET_EOSP(_p)         (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+10])\n#endif /* UAPSD_SUPPORT */\n\n/* */\n/*\tSepcific Pakcet Type definition */\n/* */\n#define RTMP_PACKET_SPECIFIC_CB_OFFSET\t11\n\n#define RTMP_PACKET_SPECIFIC_DHCP\t\t0x01\n#define RTMP_PACKET_SPECIFIC_EAPOL\t\t0x02\n#define RTMP_PACKET_SPECIFIC_IPV4\t\t0x04\n#define RTMP_PACKET_SPECIFIC_WAI\t\t0x08\n#define RTMP_PACKET_SPECIFIC_VLAN\t\t0x10\n#define RTMP_PACKET_SPECIFIC_LLCSNAP\t0x20\n#define RTMP_PACKET_SPECIFIC_TDLS\t\t0x40\n\n/*Specific */\n#define RTMP_SET_PACKET_SPECIFIC(_p, _flg)\t   \t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] = _flg)\n\n/*DHCP */\n#define RTMP_SET_PACKET_DHCP(_p, _flg)   \t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_DHCP);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_DHCP);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_DHCP(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_DHCP)\n\n/*EAPOL */\n#define RTMP_SET_PACKET_EAPOL(_p, _flg)   \t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_EAPOL);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_EAPOL);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_EAPOL(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_EAPOL)\n\n/*WAI */\n#define RTMP_SET_PACKET_WAI(_p, _flg)   \t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_WAI);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_WAI);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_WAI(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_WAI)\n\n#define RTMP_GET_PACKET_LOWRATE(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_DHCP | RTMP_PACKET_SPECIFIC_WAI))\n\n/*VLAN */\n#define RTMP_SET_PACKET_VLAN(_p, _flg)   \t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_VLAN);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_VLAN);\t\\\n\t\t\t}while(0)\n#define RTMP_GET_PACKET_VLAN(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_VLAN)\n\n/*LLC/SNAP */\n#define RTMP_SET_PACKET_LLCSNAP(_p, _flg)   \t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_LLCSNAP);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_LLCSNAP);\t\t\\\n\t\t\t}while(0)\n\t\t\t\n#define RTMP_GET_PACKET_LLCSNAP(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_LLCSNAP)\n\n/* IP */\n#define RTMP_SET_PACKET_IPV4(_p, _flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_IPV4);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_IPV4);\t\\\n\t\t\t}while(0)\n\t\t\t\n#define RTMP_GET_PACKET_IPV4(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_IPV4)\n\n// TDLS\n#define RTMP_SET_PACKET_TDLS(_p, _flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tif (_flg)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_TDLS);\t\t\\\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (~RTMP_PACKET_SPECIFIC_TDLS);\t\\\n\t\t\t}while(0)\n\t\t\t\n#define RTMP_GET_PACKET_TDLS(_p)\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_TDLS)\n\n/* If this flag is set, it indicates that this EAPoL frame MUST be clear. */\n#define RTMP_SET_PACKET_CLEAR_EAP_FRAME(_p, _flg)   (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+12] = _flg)\n#define RTMP_GET_PACKET_CLEAR_EAP_FRAME(_p)         (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+12])\n\n\n#ifdef DOT11_VHT_AC\n#define MAX_PACKETS_IN_QUEUE\t\t\t\t1024 /*(512)*/\n#else\n#define MAX_PACKETS_IN_QUEUE\t\t\t\t(512)\n#endif /* DOT11_VHT_AC */\n\n\n/* use bit3 of cb[CB_OFF+16] */\n#define RTMP_SET_PACKET_MGMT_PKT(_p, _flg)\t        \\\n        RTPKT_TO_OSPKT(_p)->cb[CB_OFF+16] = (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+16] & 0xF7) | ((_flg & 0x01) << 3);\n#define RTMP_GET_PACKET_MGMT_PKT(_p)\t\t\t\t\\\n\t\t((RTPKT_TO_OSPKT(_p)->cb[CB_OFF+16] & 0x08) >> 3)\n\n/* use bit0 of cb[CB_OFF+20] */\n#define RTMP_SET_PACKET_MGMT_PKT_DATA_QUE(_p, _flg)\t\\\n        RTPKT_TO_OSPKT(_p)->cb[CB_OFF+20] = (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+20] & 0xFE) | (_flg & 0x01);\n#define RTMP_GET_PACKET_MGMT_PKT_DATA_QUE(_p)\t\t\\\n\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+20] & 0x01)\n\n#define RTMP_SET_PACKET_5VT(_p, _flg)   (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+22] = _flg)\n#define RTMP_GET_PACKET_5VT(_p)         (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+22])\n\n#define RTMP_SET_PACKET_PROTOCOL(_p, _protocol) {\\\n\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+23] = (UINT8)((_protocol) & 0x00ff)); \\\n\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+24] = (UINT8)(((_protocol) & 0xff00) >> 8)); \\\n}\n\n#define RTMP_GET_PACKET_PROTOCOL(_p) \\\n\t((((UINT16)(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+24]) & 0x00ff) << 8) \\\n\t| ((UINT16)(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+23]) & 0x00ff))\n\n#ifdef INF_AMAZON_SE\n/* [CB_OFF+28], 1B, Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */\n#define RTMP_SET_PACKET_NOBULKOUT(_p, _morebit)\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+28] = _morebit)\n#define RTMP_GET_PACKET_NOBULKOUT(_p)\t\t\t\t\t(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+28])\t\t\t\n#endif /* INF_AMAZON_SE */\n\n\n#ifdef P2P_SUPPORT\n#define RTMP_SET_PACKET_OPMODE(_p, _flg)   (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+26] = _flg)\n#define RTMP_GET_PACKET_OPMODE(_p)         (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+26])\n#endif /* P2P_SUPPORT */\n\n#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT)\n#define RTMP_SET_TCP_CHKSUM_FAIL(_p, _flg) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+30] = _flg);\n#define RTMP_GET_TCP_CHKSUM_FAIL(_p)  (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+30])\n#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT) */\n\n\n/* Max skb->cb = 48B = [CB_OFF+38] */\n\n\n\n/***********************************************************************************\n *\tOther function prototypes definitions\n ***********************************************************************************/\nvoid RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);\nint rt28xx_packet_xmit(VOID *skb);\n\n\n#if LINUX_VERSION_CODE <= 0x20402\t/* Red Hat 7.1 */\nstruct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *));\n#endif /* LINUX_VERSION_CODE */\n\n\n\nINT rt28xx_ioctl(\n\tIN\tPNET_DEV\t\tnet_dev,\n\tIN\tOUT\tstruct ifreq\t*rq, \n\tIN\tINT\t\t\tcmd);\n\nextern int ra_mtd_write(int num, loff_t to, size_t len, const u_char *buf);\nextern int ra_mtd_read(int num, loff_t from, size_t len, u_char *buf);\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)\n#define _GET_PAD_FROM_NET_DEV(_pAd, _net_dev)\t(_pAd) = (_net_dev)->ml_priv;\n#else\n#define _GET_PAD_FROM_NET_DEV(_pAd, _net_dev)\t(_pAd) = (_net_dev)->priv;\n#endif\n\n#define GET_PAD_FROM_NET_DEV(_pAd, _net_dev)\t\t\t\t\t\t\\\n\t_pAd = RTMP_OS_NETDEV_GET_PRIV(_net_dev);\n\n/*#ifdef RTMP_USB_SUPPORT */\n/******************************************************************************\n\n  \tUSB related definitions\n\n******************************************************************************/\n\n#define RTMP_USB_PKT_COPY(__pNetDev, __pNetPkt, __Len, __pData)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tmemcpy(skb_put(__pNetPkt, __Len), __pData, __Len);\t\t\t\t\t\\\n\tGET_OS_PKT_NETDEV(__pNetPkt) = __pNetDev;\t\t\t\t\t\t\t\\\n\tRTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(__pNetPkt), PKTSRC_NDIS);\t\t\\\n}\n\ntypedef struct usb_device_id USB_DEVICE_ID;\n\n#ifdef INF_AMAZON_SE\n#define BULKAGGRE_SIZE\t\t\t\t30\n#else\n#define BULKAGGRE_SIZE\t\t\t\t60 /* 100 */\n#endif /* INF_AMAZON_SE */\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\n#ifndef OS_ABL_SUPPORT\n/*#define RT28XX_PUT_DEVICE\t\t\tusb_put_dev */\n#define RTUSB_ALLOC_URB(iso)\t\tusb_alloc_urb(iso, GFP_ATOMIC)\n#define RTUSB_SUBMIT_URB(pUrb)\t\tusb_submit_urb(pUrb, GFP_ATOMIC)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)\n#define RTUSB_URB_ALLOC_BUFFER(_dev, _size, _dma)\tusb_alloc_coherent(_dev, _size, GFP_ATOMIC, _dma)\n#define RTUSB_URB_FREE_BUFFER(_dev, _size, _addr, _dma)\tusb_free_coherent(_dev, _size, _addr, _dma)\n#else\n#define RTUSB_URB_ALLOC_BUFFER(_dev, _size, _dma)\tusb_buffer_alloc(_dev, _size, GFP_ATOMIC, _dma)\n#define RTUSB_URB_FREE_BUFFER(_dev, _size, _addr, _dma)\tusb_buffer_free(_dev, _size, _addr, _dma)\n#endif\n#else\n#define RTUSB_URB_ALLOC_BUFFER(_dev, _size, _dma)\tkmalloc(_size, GFP_ATOMIC)\n#define RTUSB_URB_FREE_BUFFER(_dev, _size, _addr, _dma)\tkfree(_addr) \n#endif\n\n#else\n\n/*#define RT28XX_PUT_DEVICE\t\t\trausb_put_dev */\n#define RTUSB_ALLOC_URB(iso)\t\trausb_alloc_urb(iso)\n#define RTUSB_SUBMIT_URB(pUrb)\t\trausb_submit_urb(pUrb)\n#define RTUSB_URB_ALLOC_BUFFER\t\trausb_buffer_alloc\n#define RTUSB_URB_FREE_BUFFER\t\trausb_buffer_free\n#endif /* OS_ABL_SUPPORT */\n\n#else\n\n#define RT28XX_PUT_DEVICE(dev_p)\n\n#ifndef OS_ABL_SUPPORT\n#define RTUSB_ALLOC_URB(iso)                                               \tusb_alloc_urb(iso)\n#define RTUSB_SUBMIT_URB(pUrb)                                             \tusb_submit_urb(pUrb)\n#else\n#define RTUSB_ALLOC_URB(iso)                                               \trausb_alloc_urb(iso)\n#define RTUSB_SUBMIT_URB(pUrb)                                             \trausb_submit_urb(pUrb)\n#endif /* OS_ABL_SUPPORT */\n\n#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr)         \t\tkmalloc(BufSize, GFP_ATOMIC)\n#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)  \tkfree(pTransferBuf)\n#endif\n\n#ifndef OS_ABL_SUPPORT\n#define RTUSB_FREE_URB(pUrb)\tusb_free_urb(pUrb)\n#else\n#define RTUSB_FREE_URB(pUrb)\trausb_free_urb(pUrb)\n#endif /* OS_ABL_SUPPORT */\n\n/* unlink urb */\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)\n\n#ifndef OS_ABL_SUPPORT\n#define RTUSB_UNLINK_URB(pUrb)\t\tusb_kill_urb(pUrb)\n#else\n#define RTUSB_UNLINK_URB(pUrb)\t\trausb_kill_urb(pUrb)\n#endif /* OS_ABL_SUPPORT */\n\n#else\n#define RTUSB_UNLINK_URB(pUrb)\t\tusb_unlink_urb(pUrb)\n#endif /* LINUX_VERSION_CODE */\n\n/* Prototypes of completion funuc. */\n#define RtmpUsbBulkOutDataPacketComplete\t\tRTUSBBulkOutDataPacketComplete\n#define RtmpUsbBulkOutMLMEPacketComplete\t\tRTUSBBulkOutMLMEPacketComplete\n#define RtmpUsbBulkOutNullFrameComplete\t\t\tRTUSBBulkOutNullFrameComplete\n#ifdef CONFIG_MULTI_CHANNEL\n#define RtmpUsbBulkOutHCCANullFrameComplete\t\t\tRTUSBBulkOutHCCANullFrameComplete\n#endif /* CONFIG_MULTI_CHANNEL */\n#define RtmpUsbBulkOutRTSFrameComplete\t\t\tRTUSBBulkOutRTSFrameComplete\n#define RtmpUsbBulkOutPsPollComplete\t\t\tRTUSBBulkOutPsPollComplete\n#define RtmpUsbBulkRxComplete\t\t\t\t\tRTUSBBulkRxComplete\n#define RTUSBBulkCmdRspEventComplete(Status, pURB, pt_regs)\t \t RTUSBBulkCmdRspEventComplete(pURB)\n\t\t\t\t\t\t\t\t\t\t\t\t\n#if ((LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 51)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))) \n#define RTUSBBulkOutDataPacketComplete(Status, pURB, pt_regs)    RTUSBBulkOutDataPacketComplete(pURB)\n#define RTUSBBulkOutMLMEPacketComplete(Status, pURB, pt_regs)    RTUSBBulkOutMLMEPacketComplete(pURB)\n#define RTUSBBulkOutNullFrameComplete(Status, pURB, pt_regs)     RTUSBBulkOutNullFrameComplete(pURB)\n#ifdef CONFIG_MULTI_CHANNEL\n#define RTUSBBulkOutHCCANullFrameComplete(Status, pURB, pt_regs)     RTUSBBulkOutHCCANullFrameComplete(pURB)\n#endif /* CONFIG_MULTI_CHANNEL */\n#define RTUSBBulkOutRTSFrameComplete(Status, pURB, pt_regs)      RTUSBBulkOutRTSFrameComplete(pURB)\n#define RTUSBBulkOutPsPollComplete(Status, pURB, pt_regs)        RTUSBBulkOutPsPollComplete(pURB)\n#define RTUSBBulkRxComplete(Status, pURB, pt_regs)               RTUSBBulkRxComplete(pURB)\n#define RTUSBBulkCmdRspEventComplete(Status, pURB, pt_regs)               RTUSBBulkCmdRspEventComplete(pURB)\n#define USBUploadFWComplete(Status, pURB, pt_regs)               USBUploadFWComplete(pURB)\n#define USBKickOutCmdComplete(Status, pURB, pt_regs)               USBKickOutCmdComplete(pURB)\n#else\n#define RTUSBBulkOutDataPacketComplete(Status, pURB, pt_regs)    RTUSBBulkOutDataPacketComplete(pURB, pt_regs)\n#define RTUSBBulkOutMLMEPacketComplete(Status, pURB, pt_regs)    RTUSBBulkOutMLMEPacketComplete(pURB, pt_regs)\n#define RTUSBBulkOutNullFrameComplete(Status, pURB, pt_regs)     RTUSBBulkOutNullFrameComplete(pURB, pt_regs)\n#ifdef CONFIG_MULTI_CHANNEL\n#define RTUSBBulkOutHCCANullFrameComplete(Status, pURB, pt_regs)     RTUSBBulkOutHCCANullFrameComplete(pURB, pt_regs)\n#endif /* CONFIG_MULTI_CHANNEL */\n#define RTUSBBulkOutRTSFrameComplete(Status, pURB, pt_regs)      RTUSBBulkOutRTSFrameComplete(pURB, pt_regs)\n#define RTUSBBulkOutPsPollComplete(Status, pURB, pt_regs)        RTUSBBulkOutPsPollComplete(pURB, pt_regs)\n#define RTUSBBulkRxComplete(Status, pURB, pt_regs)               RTUSBBulkRxComplete(pURB, pt_regs)\n#define RTUSBBulkCmdRspEventComplete(Status, pURB, pt_regs)               RTUSBBulkCmdRspEventComplete(pURB, pt_regs)\n#define USBUploadFWComplete(Status, pURB, pt_regs)               USBUploadFWComplete(pURB, pt_regs)\n#define USBKickOutCmdComplete(Status, pURB, pt_regs)               USBKickOutCmdComplete(pURB, pt_regs)\n#endif /* */\n\n/*extern void dump_urb(struct urb *purb); */\n\n#define InterlockedIncrement \t \tatomic_inc\n#define NdisInterlockedIncrement \tatomic_inc\n#define InterlockedDecrement\t\tatomic_dec\n#define NdisInterlockedDecrement \tatomic_dec\n#define InterlockedExchange\t\t\tatomic_set\n\ntypedef void USBHST_STATUS;\ntypedef INT32 URBCompleteStatus;\ntypedef struct pt_regs pregs;\n\nUSBHST_STATUS RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutMLMEPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutNullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\n#ifdef CONFIG_MULTI_CHANNEL\nUSBHST_STATUS RTUSBBulkOutHCCANullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\n#endif /* CONFIG_MULTI_CHANNEL */\nUSBHST_STATUS RTUSBBulkOutRTSFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkOutPsPollComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkRxComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS RTUSBBulkCmdRspEventComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS USBUploadFWComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\nUSBHST_STATUS USBKickOutCmdComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\n\n\n/* Fill Bulk URB Macro */\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#define RTUSB_FILL_TX_BULK_URB(pUrb,\t\\\n\t\t\t       pUsb_Dev,\t\\\n\t\t\t       uEndpointAddress,\t\t\\\n\t\t\t       pTransferBuf,\t\t\t\\\n\t\t\t       BufSize,\t\t\t\t\\\n\t\t\t       Complete,\t\\\n\t\t\t       pContext,\t\t\\\n\t\t\t\t\tTransferDma)\t\\\n  \t\t\t   do{\t\\\n\t\t\t       \t\tusb_fill_bulk_urb(pUrb, pUsb_Dev, usb_sndbulkpipe(pUsb_Dev, uEndpointAddress),\t\\\n\t\t\t\t\t\t\t\tpTransferBuf, BufSize, Complete, pContext);\t\\\n\t\t\t\t\t\tpUrb->transfer_dma\t= TransferDma;\t\\\n\t\t\t       \t\tpUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;\t\\\n\t\t\t\t}while(0)\n#else\n#define RTUSB_FILL_TX_BULK_URB(pUrb,\t\\\n\t\t\t       pUsb_Dev,\t\\\n\t\t\t       uEndpointAddress,\t\t\\\n\t\t\t       pTransferBuf,\t\t\t\\\n\t\t\t       BufSize,\t\t\t\t\\\n\t\t\t       Complete,\t\\\n\t\t\t       pContext,\t\\\n\t\t\t\t\tTransferDma)\t\\\n  \t\t\t       do{\t\\\n  \t\t\t       \t\tFILL_BULK_URB(pUrb, pUsb_Dev, usb_sndbulkpipe(pUsb_Dev, uEndpointAddress),\t\\\n\t\t\t\t\t\t\tpTransferBuf, BufSize, Complete, pContext);\t\\\n\t\t\t       }while(0)\n\n#endif\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#define RTUSB_FILL_HTTX_BULK_URB(pUrb,\t\\\n\t\t\t\tpUsb_Dev,\t\\\n\t\t\t\tuEndpointAddress,\t\t\\\n\t\t\t\tpTransferBuf,\t\t\t\\\n\t\t\t\tBufSize,\t\t\t\t\\\n\t\t\t\tComplete,\t\\\n\t\t\t\tpContext,\t\t\t\t\\\n\t\t\t\tTransferDma)\t\t\t\t\\\n  \t\t\t\tdo{\t\\\n\t\t\t\t\tusb_fill_bulk_urb(pUrb, pUsb_Dev, usb_sndbulkpipe(pUsb_Dev, uEndpointAddress),\t\\\n\t\t\t\t\t\t\t\tpTransferBuf, BufSize, Complete, pContext);\t\\\n\t\t\t\t\tpUrb->transfer_dma\t= TransferDma; \\\n\t\t\t\t\tpUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;\t\\\n\t\t\t\t}while(0)\n#else\n#define RTUSB_FILL_HTTX_BULK_URB(pUrb,\t\\\n\t\t\t\tpUsb_Dev,\t\t\t\t\\\n\t\t\t\tuEndpointAddress,\t\t\\\n\t\t\t\tpTransferBuf,\t\t\t\\\n\t\t\t\tBufSize,\t\t\t\t\\\n\t\t\t\tComplete,\t\t\t\t\\\n\t\t\t       pContext,\t\\\n\t\t\t\t\tTransferDma)\t\\\n  \t\t\t\tdo{\t\\\n\t\t\t\t\tFILL_BULK_URB(pUrb, pUsb_Dev, usb_sndbulkpipe(pUsb_Dev, uEndpointAddress),\t\\\n\t\t\t\t\t\t\t\tpTransferBuf, BufSize, Complete, pContext);\t\\\n\t\t\t\t}while(0)\n#endif\t\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#define RTUSB_FILL_RX_BULK_URB(pUrb,\t\\\n\t\t\t\tpUsb_Dev,\t\t\t\t\\\n\t\t\t\tuEndpointAddress,\t\t\\\n\t\t\t\tpTransferBuf,\t\t\t\\\n\t\t\t\tBufSize,\t\t\t\t\\\n\t\t\t\tComplete,\t\t\t\t\\\n\t\t\t\tpContext,\t\t\t\t\\\n\t\t\t\tTransferDma)\t\t\t\\\n  \t\t\t\tdo{\t\\\n\t\t\t\t\tusb_fill_bulk_urb(pUrb, pUsb_Dev, usb_rcvbulkpipe(pUsb_Dev, uEndpointAddress),\t\\\n\t\t\t\t\t\t\t\tpTransferBuf, BufSize, Complete, pContext);\t\\\n\t\t\t\t\tpUrb->transfer_dma\t= TransferDma;\t\\\n\t\t\t\t\tpUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;\t\\\n\t\t\t\t}while(0)\n/* pRxContext->data_dma + pAd->NextRxBulkInPosition; */\n#else\n#define RTUSB_FILL_RX_BULK_URB(pUrb,\t\\\n\t\t\t\tpUsb_Dev,\t\\\n\t\t\t\tuEndpointAddress,\t\t\\\n\t\t\t\tpTransferBuf,\t\t\t\\\n\t\t\t\tBufSize,\t\t\t\t\\\n\t\t\t\tComplete,\t\\\n\t\t\t       pContext,\t\\\n\t\t\t\t\tTransferDma)\t\\\n  \t\t\t\tdo{\t\\\n\t\t\t\t\tFILL_BULK_URB(pUrb, pUsb_Dev, usb_rcvbulkpipe(pUsb_Dev, uEndpointAddress),\t\\\n\t\t\t\t\t\t\t\tpTransferBuf, BufSize, Complete, pContext);\t\\\n\t\t\t\t}while(0)\n#endif\n\t\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#define RTUSB_URB_DMA_MAPPING(pUrb)\t\\\n\t{\t\\\n\t\tpUrb->transfer_dma\t= 0;\t\\\n\t\tpUrb->transfer_flags &= (~URB_NO_TRANSFER_DMA_MAP);\t\\\n\t}\n#else\n#define\tRTUSB_URB_DMA_MAPPING(pUrb)\n#endif\n\n#define RTUSB_CONTROL_MSG(pUsb_Dev, uEndpointAddress, Request, RequestType, Value,Index, tmpBuf, TransferBufferLength, timeout, ret)\t\\\n  \t\tdo{\t\\\n\t\t\tif (RequestType == DEVICE_VENDOR_REQUEST_OUT)\t\\\n\t\t\t\tret = USB_CONTROL_MSG(pUsb_Dev, usb_sndctrlpipe(pUsb_Dev, uEndpointAddress), Request, RequestType, Value, Index, tmpBuf, TransferBufferLength, timeout);\t\\\n\t\t\telse if (RequestType == DEVICE_VENDOR_REQUEST_IN)\t\\\n\t\t\t\tret = USB_CONTROL_MSG(pUsb_Dev, usb_rcvctrlpipe(pUsb_Dev, uEndpointAddress), Request, RequestType, Value, Index, tmpBuf, TransferBufferLength, timeout);\t\\\n\t\t\telse\t\\\n\t\t\t{\t\\\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"vendor request direction is failed\\n\"));\t\\\n\t\t\t\tret = -1;\t\\\n\t\t\t}\t\\\n\t\t}while(0)\n\t\t\n#define rtusb_urb_context  context\n#define rtusb_urb_status   status\n\n#define RTMP_OS_USB_CONTEXT_GET(__pURB)\t\t__pURB->rtusb_urb_context\n#define RTMP_OS_USB_STATUS_GET(__pURB)\t\t__pURB->rtusb_urb_status\n\n#ifndef OS_ABL_SUPPORT\n#define USB_CONTROL_MSG\t\tusb_control_msg\n\n#else\n\n#define USB_CONTROL_MSG\t\trausb_control_msg\n\n/*extern int rausb_register(struct usb_driver * new_driver); */\n/*extern void rausb_deregister(struct usb_driver * driver); */\n\nextern struct urb *rausb_alloc_urb(int iso_packets);\nextern void rausb_free_urb(VOID *urb);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\nextern void rausb_put_dev(VOID *dev);\nextern struct usb_device *rausb_get_dev(VOID *dev);\n#endif /* LINUX_VERSION_CODE */\n\nextern int rausb_submit_urb(VOID *urb);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n#ifndef gfp_t\n#define gfp_t\t\tINT32\n#endif /* gfp_t */\n\nextern void *rausb_buffer_alloc(VOID *dev,\n\t\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\t\tra_dma_addr_t *dma);\nextern void rausb_buffer_free(VOID *dev,\n\t\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\t\tvoid *addr,\n\t\t\t\t\t\t\t\tra_dma_addr_t dma);\n#endif /* LINUX_VERSION_CODE */\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)\nextern void rausb_kill_urb(VOID *urb);\n#endif /* LINUX_VERSION_CODE */\n\nextern int rausb_control_msg(VOID *dev,\n\t\t\t\t\t\t\tunsigned int pipe,\n\t\t\t\t\t\t\t__u8 request,\n\t\t\t\t\t\t\t__u8 requesttype,\n\t\t\t\t\t\t\t__u16 value,\n\t\t\t\t\t\t\t__u16 index,\n\t\t\t\t\t\t\tvoid *data,\n\t\t\t\t\t\t\t__u16 size,\n\t\t\t\t\t\t\tint timeout);\n\n#endif /* OS_ABL_SUPPORT */\n\n/*#endif // RTMP_USB_SUPPORT */\n\n#ifdef RALINK_ATE\n/******************************************************************************\n\n  \tATE related definitions\n\n******************************************************************************/\n#define ate_print printk\n#define ATEDBGPRINT DBGPRINT\n\n#ifdef RTMP_MAC_USB\n#ifdef CONFIG_AP_SUPPORT\n#define EEPROM_BIN_FILE_NAME  \"/etc/Wireless/RT2870AP/e2p.bin\"\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#undef EEPROM_BIN_FILE_NAME /* Avoid APSTA mode re-define issue */\n#define EEPROM_BIN_FILE_NAME  \"/etc/Wireless/RT2870STA/e2p.bin\"\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#ifdef RTMP_USB_SUPPORT\n\n#if ((LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 51)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18)))\n/* Prototypes of completion funuc. */\n#define ATE_RTUSBBulkOutDataPacketComplete(Status, pURB, pt_regs)    ATE_RTUSBBulkOutDataPacketComplete(pURB)\n#else\n#define ATE_RTUSBBulkOutDataPacketComplete(Status, pURB, pt_regs)    ATE_RTUSBBulkOutDataPacketComplete(pURB, pt_regs)\t\n#endif /* LINUX_VERSION_CODE */\n\nUSBHST_STATUS ATE_RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs);\n\t\t\n#endif /* RTMP_USB_SUPPORT */\n\n#endif /* RALINK_ATE */\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\nINT RtmpOSNetDevOpsAlloc(\n\tIN PVOID *pNetDevOps);\n#endif\n\n#define RTMP_OS_MAX_SCAN_DATA_GET()\t\tIW_SCAN_MAX_DATA\n\n#include \"os/rt_os.h\"\n\n#endif /* __RT_LINUX_H__ */\n"
  },
  {
    "path": "src/include/os/rt_linux_cmm.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt_linux_cmm.h\n \n    Abstract:\n\tCommon OS structure/definition in LINUX whatever OS ABL.\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n \n\n#ifndef __RT_LINUX_CMM_H__\n#define __RT_LINUX_CMM_H__\n\n\ntypedef struct _OS_RSTRUC  {\n\tUCHAR *pContent; /* pointer to real structure content */\n} OS_RSTRUC;\n\n\n/* declare new chipset function here */\n#ifdef OS_ABL_FUNC_SUPPORT\n\n#define RTMP_DECLARE_DRV_OPS_FUNCTION(_func)\t\t\t\t\t\\\n\tvoid Rtmp_Drv_Ops_##_func(VOID *__pDrvOps, VOID *__pNetOps, \\\n\t\t\t\t\t\tVOID *__pPciConfig, VOID *__pUsbConfig)\n\n#define RTMP_BUILD_DRV_OPS_FUNCTION(_func)\t\t\t\t\t\t\\\nvoid Rtmp_Drv_Ops_##_func(VOID *__pDrvOps, VOID *__pNetOps, \t\\\n\t\t\t\t\tVOID *__pPciConfig, VOID *__pUsbConfig)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRtmpDrvOpsInit(__pDrvOps, __pNetOps, __pPciConfig, __pUsbConfig);\\\n}\n\n#define RTMP_GET_DRV_OPS_FUNCTION(_func)\t\t\t\t\t\t\\\n\t(PVOID)Rtmp_Drv_Ops_##_func\n\n#define RTMP_DRV_OPS_FUNCTION_BODY(_func)\t\t\t\t\t\t\\\n\tRtmp_Drv_Ops_##_func\n\n\n#define xdef_to_str(s)   def_to_str(s) \n#define def_to_str(s)    #s\n\n\n#ifdef RTMP_MAC_USB\n#define RTMP_DRV_NAME\t\"rtusb\" xdef_to_str(RT28xx_MODE)\nRTMP_DECLARE_DRV_OPS_FUNCTION(usb);\n#define RTMP_DRV_OPS_FUNCTION\t\t\t\tRTMP_DRV_OPS_FUNCTION_BODY(usb)\n#define RTMP_BUILD_DRV_OPS_FUNCTION_BODY\tRTMP_BUILD_DRV_OPS_FUNCTION(usb)\n#endif /* RTMP_MAC_USB */\n\n#else\n\n#ifdef RTMP_MAC_USB\n#define RTMP_DRV_NAME\t\"rt2870\"\n#else\n#define RTMP_DRV_NAME\t\"rt2860\"\n#endif /* RTMP_MAC_USB */\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n/*****************************************************************************\n *\tOS task related data structure and definitions\n ******************************************************************************/\n#define RTMP_OS_TASK_INIT(__pTask, __pTaskName, __pAd)\t\t\\\n\tRtmpOSTaskInit(__pTask, __pTaskName, __pAd, &(__pAd)->RscTaskMemList, &(__pAd)->RscSemMemList);\n\n#ifndef OS_ABL_FUNC_SUPPORT\n\n/* rt_linux.h */\n#define RTMP_OS_TASK\t\t\t\tOS_TASK\n\n#define RTMP_OS_TASK_GET(__pTask)\t\t\t\t\t\t\t\\\n\t(__pTask)\n\n#define RTMP_OS_TASK_DATA_GET(__pTask)\t\t\t\t\t\t\\\n\t((__pTask)->priv)\n\n#define RTMP_OS_TASK_IS_KILLED(__pTask)\t\t\t\t\t\t\\\n\t((__pTask)->task_killed)\n\n#ifdef KTHREAD_SUPPORT\n#define RTMP_OS_TASK_WAKE_UP(__pTask)\t\t\t\t\t\t\\\n\tWAKE_UP(pTask);\n#else\n#define RTMP_OS_TASK_WAKE_UP(__pTask)\t\t\t\t\t\t\\\n\tRTMP_SEM_EVENT_UP(&(pTask)->taskSema);\n#endif /* KTHREAD_SUPPORT */\n\n#ifdef KTHREAD_SUPPORT\n#define RTMP_OS_TASK_LEGALITY(__pTask)\t\t\t\t\t\t\\\n\tif ((__pTask)->kthread_task != NULL)\n#else\n#define RTMP_OS_TASK_LEGALITY(__pTask)\t\t\t\t\t\t\\\n\tCHECK_PID_LEGALITY((__pTask)->taskPID)\n#endif /* KTHREAD_SUPPORT */\n\n#else\n\n/* rt_linux_cmm.h */\n#define RTMP_OS_TASK\t\t\t\tOS_RSTRUC\n\n#define RTMP_OS_TASK_GET(__pTask)\t\t\t\t\t\t\t\\\n\t((OS_TASK *)((__pTask)->pContent))\n\n#define RTMP_OS_TASK_DATA_GET(__pTask)\t\t\t\t\t\t\\\n\tRtmpOsTaskDataGet(__pTask)\n\n#define RTMP_OS_TASK_IS_KILLED(__pTask)\t\t\t\t\t\t\\\n\tRtmpOsTaskIsKilled(__pTask)\n\n#define RTMP_OS_TASK_WAKE_UP(__pTask)\t\t\t\t\t\t\\\n\tRtmpOsTaskWakeUp(pTask)\n\n#define RTMP_OS_TASK_LEGALITY(__pTask)\t\t\t\t\t\t\\\n\tif (RtmpOsCheckTaskLegality(__pTask))\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n/*****************************************************************************\n * Timer related definitions and data structures.\n ******************************************************************************/\n#ifndef OS_ABL_FUNC_SUPPORT\n\n/* rt_linux.h */\n#define NDIS_MINIPORT_TIMER\t\t\tOS_NDIS_MINIPORT_TIMER\n#define RTMP_OS_TIMER\t\t\t\tOS_TIMER\n\n#define RTMP_OS_FREE_TIMER(__pAd)\n#define RTMP_OS_FREE_LOCK(__pAd)\n#define RTMP_OS_FREE_TASKLET(__pAd)\n#define RTMP_OS_FREE_TASK(__pAd)\n#define RTMP_OS_FREE_SEM(__pAd)\n#define RTMP_OS_FREE_ATOMIC(__pAd)\n\n#else\n\n/* rt_linux_cmm.h */\n#define NDIS_MINIPORT_TIMER\t\t\tOS_RSTRUC\n#define RTMP_OS_TIMER\t\t\t\tOS_RSTRUC\n\n#define RTMP_OS_FREE_TIMER(__pAd)\n#define RTMP_OS_FREE_LOCK(__pAd)\n#define RTMP_OS_FREE_TASKLET(__pAd)\n#define RTMP_OS_FREE_TASK(__pAd)\n#define RTMP_OS_FREE_SEM(__pAd)\n#define RTMP_OS_FREE_ATOMIC(__pAd)\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n/*****************************************************************************\n *\tOS file operation related data structure definitions\n ******************************************************************************/\n/* if you add any new type, please also modify RtmpOSFileOpen() */\n#define RTMP_FILE_RDONLY\t\t\t0x0F01\n#define RTMP_FILE_WRONLY\t\t\t0x0F02\n#define RTMP_FILE_CREAT\t\t\t\t0x0F03\n#define RTMP_FILE_TRUNC\t\t\t\t0x0F04\n\n#ifndef OS_ABL_FUNC_SUPPORT\n\n/* rt_linux.h */\n#define RTMP_OS_FS_INFO\t\t\t\tOS_FS_INFO\n\n#else\n\n/* rt_linux_cmm.h */\n#define RTMP_OS_FS_INFO\t\t\t\tOS_RSTRUC\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n/*****************************************************************************\n *\tOS semaphore related data structure and definitions\n ******************************************************************************/\n\n#ifndef OS_ABL_FUNC_SUPPORT\n\n#define NDIS_SPIN_LOCK\t\t\t\t\t\t\tOS_NDIS_SPIN_LOCK\n#define NdisAllocateSpinLock(__pReserved, __pLock)\tOS_NdisAllocateSpinLock(__pLock)\n#define NdisFreeSpinLock\t\t\t\t\t\tOS_NdisFreeSpinLock\n#define RTMP_SEM_LOCK\t\t\t\t\t\t\tOS_SEM_LOCK\n#define RTMP_SEM_UNLOCK\t\t\t\t\t\t\tOS_SEM_UNLOCK\n#define RTMP_IRQ_LOCK\t\t\t\t\t\t\tOS_IRQ_LOCK\n#define RTMP_IRQ_UNLOCK\t\t\t\t\t\t\tOS_IRQ_UNLOCK\n#define RTMP_INT_LOCK\t\t\t\t\t\t\tOS_INT_LOCK\n#define RTMP_INT_UNLOCK\t\t\t\t\t\t\tOS_INT_UNLOCK\n#define RTMP_OS_SEM\t\t\t\t\t\t\t\tOS_SEM\n#define RTMP_OS_ATOMIC\t\t\t\t\t\t\tatomic_t\n\n#define NdisAcquireSpinLock\t\t\t\t\t\tRTMP_SEM_LOCK\n#define NdisReleaseSpinLock\t\t\t\t\t\tRTMP_SEM_UNLOCK\n\n#define RTMP_SEM_EVENT_INIT_LOCKED(__pSema, __pSemaList)\tOS_SEM_EVENT_INIT_LOCKED(__pSema)\n#define RTMP_SEM_EVENT_INIT(__pSema, __pSemaList)\t\t\tOS_SEM_EVENT_INIT(__pSema)\n#define RTMP_SEM_EVENT_DESTORY\t\t\t\t\tOS_SEM_EVENT_DESTORY\n#define RTMP_SEM_EVENT_WAIT\t\t\t\t\t\tOS_SEM_EVENT_WAIT\n#define RTMP_SEM_EVENT_UP\t\t\t\t\t\tOS_SEM_EVENT_UP\n\n#define RTUSBMlmeUp\t\t\t\t\t\t\t\tOS_RTUSBMlmeUp\n\n#define RTMP_OS_ATMOIC_INIT(__pAtomic, __pAtomicList)\n#define RTMP_OS_ATMOIC_DESTROY(__pAtomic)\n#define RTMP_THREAD_PID_KILL(__PID)\t\t\t\tKILL_THREAD_PID(__PID, SIGTERM, 1)\n\n#else\n\n#define NDIS_SPIN_LOCK\t\t\t\t\t\t\tOS_RSTRUC\n#define RTMP_OS_SEM\t\t\t\t\t\t\t\tOS_RSTRUC\n#define RTMP_OS_ATOMIC\t\t\t\t\t\t\tOS_RSTRUC\n\n#define RTMP_SEM_EVENT_INIT_LOCKED \t\t\t\tRtmpOsSemaInitLocked\n#define RTMP_SEM_EVENT_INIT\t\t\t\t\t\tRtmpOsSemaInit\n#define RTMP_SEM_EVENT_DESTORY\t\t\t\t\tRtmpOsSemaDestory\n#define RTMP_SEM_EVENT_WAIT(_pSema, _status)\t((_status) = RtmpOsSemaWaitInterruptible((_pSema)))\n#define RTMP_SEM_EVENT_UP\t\t\t\t\t\tRtmpOsSemaWakeUp\n\n#define RTUSBMlmeUp\t\t\t\t\t\t\t\tRtmpOsMlmeUp\n\n#define RTMP_OS_ATMOIC_INIT\t\t\t\t\t\tRtmpOsAtomicInit\n#define RTMP_OS_ATMOIC_DESTROY\t\t\t\t\tRtmpOsAtomicDestroy\n#define RTMP_THREAD_PID_KILL\t\t\t\t\tRtmpThreadPidKill\n\n/* */\n/*  spin_lock enhanced for Nested spin lock */\n/* */\n#define NdisAllocateSpinLock(__pAd, __pLock)\t\tRtmpOsAllocateLock(__pLock, &(__pAd)->RscLockMemList)\n#define NdisFreeSpinLock\t\t\t\t\t\t\tRtmpOsFreeSpinLock\n\n#define RTMP_SEM_LOCK(__lock)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRtmpOsSpinLockBh(__lock);\t\t\t\t\t\\\n}\n\n#define RTMP_SEM_UNLOCK(__lock)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRtmpOsSpinUnLockBh(__lock);\t\t\t\t\t\\\n}\n\n/* sample, use semaphore lock to replace IRQ lock, 2007/11/15 */\n#ifdef MULTI_CORE_SUPPORT\n\n#define RTMP_IRQ_LOCK(__lock, __irqflags)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__irqflags = 0;\t\t\t\t\t\t\t\t\t\\\n\tspin_lock_irqsave((spinlock_t *)(__lock), __irqflags);\t\t\t\\\n}\n\n#define RTMP_IRQ_UNLOCK(__lock, __irqflag)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tspin_unlock_irqrestore((spinlock_t *)(__lock), __irqflag);\t\t\t\\\n}\n#else\n#define RTMP_IRQ_LOCK(__lock, __irqflags)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__irqflags = 0;\t\t\t\t\t\t\t\t\\\n\tRtmpOsSpinLockBh(__lock);\t\t\t\t\t\\\n}\n\n#define RTMP_IRQ_UNLOCK(__lock, __irqflag)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRtmpOsSpinUnLockBh(__lock);\t\t\t\t\t\\\n}\n#endif // MULTI_CORE_SUPPORT //\n#define RTMP_INT_LOCK(__Lock, __Flag)\tRtmpOsIntLock(__Lock, &__Flag)\n#define RTMP_INT_UNLOCK\t\t\t\t\tRtmpOsIntUnLock\n\n#define NdisAcquireSpinLock\t\t\t\tRTMP_SEM_LOCK\n#define NdisReleaseSpinLock\t\t\t\tRTMP_SEM_UNLOCK\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n/*****************************************************************************\n *\tOS task related data structure and definitions\n ******************************************************************************/\n\n#ifndef OS_ABL_FUNC_SUPPORT\n\n/* rt_linux.h */\n#define RTMP_NET_TASK_STRUCT\t\tOS_NET_TASK_STRUCT\n#define PRTMP_NET_TASK_STRUCT\t\tPOS_NET_TASK_STRUCT\n\n#ifdef WORKQUEUE_BH\t\n#define RTMP_OS_TASKLET_SCHE(__pTasklet)\t\t\t\t\t\t\t\\\n\t\tschedule_work(__pTasklet)\n#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data)\t\\\n\t\tINIT_WORK((struct work_struct *)__pTasklet, (work_func_t)__pFunc)\n#define RTMP_OS_TASKLET_KILL(__pTasklet)\n#else\n#define RTMP_OS_TASKLET_SCHE(__pTasklet)\t\t\t\t\t\t\t\\\n\t\ttasklet_hi_schedule(__pTasklet)\n#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data)\t\\\n\t\ttasklet_init(__pTasklet, __pFunc, __Data)\n#define RTMP_OS_TASKLET_KILL(__pTasklet)\t\t\t\t\t\t\t\\\n\t\ttasklet_kill(__pTasklet)\n#endif /* WORKQUEUE_BH */\n\n#define RTMP_NET_TASK_DATA_ASSIGN(__Tasklet, __Data)\t\t\\\n\t(__Tasklet)->data = (unsigned long)__Data\n\n#else\n\n/* rt_linux_cmm.h */\ntypedef OS_RSTRUC\t\t\t\t\tRTMP_NET_TASK_STRUCT;\ntypedef OS_RSTRUC\t\t\t\t\t*PRTMP_NET_TASK_STRUCT;\n\n#define RTMP_OS_TASKLET_SCHE(__pTasklet)\t\t\t\t\t\\\n\t\tRtmpOsTaskletSche(__pTasklet)\n\n#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data)\t\\\n\t\tRtmpOsTaskletInit(__pTasklet, __pFunc, __Data, &(__pAd)->RscTaskletMemList)\n\n#define RTMP_OS_TASKLET_KILL(__pTasklet)\t\t\t\t\t\\\n\t\tRtmpOsTaskletKill(__pTasklet)\n\n#define RTMP_NET_TASK_DATA_ASSIGN(__pTasklet, __Data)\t\t\\\n\t\tRtmpOsTaskletDataAssign(__pTasklet, __Data)\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n\n\n/*****************************************************************************\n *\tOS definition related data structure and definitions\n ******************************************************************************/\n\n#ifdef OS_ABL_SUPPORT\n\n#define RTMP_USB_CONTROL_MSG_ENODEV\t\t-1\n#define RTMP_USB_CONTROL_MSG_FAIL\t\t-2\n\ntypedef struct __RTMP_PCI_CONFIG {\n\n\tUINT32\tConfigVendorID;\n} RTMP_PCI_CONFIG;\n\ntypedef struct __RTMP_USB_CONFIG {\n\n\tUINT32\tReserved;\n} RTMP_USB_CONFIG;\n\nextern RTMP_PCI_CONFIG *pRtmpPciConfig;\nextern RTMP_USB_CONFIG *pRtmpUsbConfig;\n\n#define RTMP_OS_PCI_VENDOR_ID\t\t\tpRtmpPciConfig->ConfigVendorID\n\n/*\n\tDeclare dma_addr_t here, can not define it in rt_drv.h\n\n\tIf you define it in include/os/rt_drv.h, then the size in DRIVER module\n\twill be 64-bit, but in UTIL/NET modules, it maybe 32-bit.\n\tThis will cause size mismatch problem when OS_ABL = yes.\n*/\n/*\n\tIn big-endian & 32-bit DMA address platform, if you use long long to\n\trecord DMA address, when you call kernel function to set DMA address,\n\tthe address will be 0 because you need to do swap I think.\n\tSo if you sure your DMA address is 32-bit, do not use RTMP_DMA_ADDR_64.\n*/\n#define ra_dma_addr_t\t\t\t\t\tunsigned long long\n\n#else\n\n#ifdef RTMP_USB_SUPPORT\n#define RTMP_USB_CONTROL_MSG_ENODEV\t\t(-ENODEV)\n#define RTMP_USB_CONTROL_MSG_FAIL\t\t(-EFAULT)\n#endif /* RTMP_USB_SUPPORT */\n\n#define RTMP_OS_PCI_VENDOR_ID\t\t\tPCI_VENDOR_ID\n\n#define ra_dma_addr_t\t\t\t\t\tdma_addr_t\n\n#endif /* OS_ABL_SUPPORT */\n\n#define PCI_MAP_SINGLE\t\t\t\t\tRtmpDrvPciMapSingle\n\n\n/***********************************************************************************\n *\tOthers\n ***********************************************************************************/\n#define APCLI_IF_UP_CHECK(pAd, ifidx) (RtmpOSNetDevIsUp((pAd)->ApCfg.ApCliTab[(ifidx)].dev) == TRUE)\n\n\n#define RTMP_OS_NETDEV_SET_PRIV\t\tRtmpOsSetNetDevPriv\n#define RTMP_OS_NETDEV_GET_PRIV\t\tRtmpOsGetNetDevPriv\n#define RT_DEV_PRIV_FLAGS_GET\t\tRtmpDevPrivFlagsGet\n#define RT_DEV_PRIV_FLAGS_SET\t\tRtmpDevPrivFlagsSet\n\n#endif /* __RT_LINUX_CMM_H__ */\n\n"
  },
  {
    "path": "src/include/os/rt_os.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt_os.h\n\n\tAbstract:\n\tPut all OS related definition/structure/MACRO here.\n\n\tNote:\n\tUsed in UTIL/NETIF module.\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n*/\n\n#ifndef _RT_OS_H_\n#define _RT_OS_H_\n\n\n#ifdef LINUX\n#if WIRELESS_EXT <= 11\n#ifndef SIOCDEVPRIVATE\n#define SIOCDEVPRIVATE                              0x8BE0\n#endif\n#define SIOCIWFIRSTPRIV\t\t\t\t\t\t\t\tSIOCDEVPRIVATE\n#endif\n#endif /* LINUX */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#define RT_PRIV_IOCTL\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x01) /* Sync. with AP for wsc upnp daemon */\n#define RTPRIV_IOCTL_SET\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x02)\n\n#ifdef DBG\n#define RTPRIV_IOCTL_BBP                            (SIOCIWFIRSTPRIV + 0x03)\n#define RTPRIV_IOCTL_MAC                            (SIOCIWFIRSTPRIV + 0x05)\n\n#define RTPRIV_IOCTL_RF                             (SIOCIWFIRSTPRIV + 0x13)  /* edit by johnli, fix read rf register problem */\n#define RTPRIV_IOCTL_E2P                            (SIOCIWFIRSTPRIV + 0x07)\n#endif /* DBG */\n\n#define RTPRIV_IOCTL_ATE\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x08)\n\n#define RTPRIV_IOCTL_STATISTICS                     (SIOCIWFIRSTPRIV + 0x09)\n#define RTPRIV_IOCTL_ADD_PMKID_CACHE                (SIOCIWFIRSTPRIV + 0x0A)\n#define RTPRIV_IOCTL_RADIUS_DATA                    (SIOCIWFIRSTPRIV + 0x0C)\n#define RTPRIV_IOCTL_GSITESURVEY\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x0D)\n#define RT_PRIV_IOCTL_EXT\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x0E) /* Sync. with RT61 (for wpa_supplicant) */\n#define RTPRIV_IOCTL_GET_MAC_TABLE\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x0F)\n#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x1F)\t/* modified by Red@Ralink, 2009/09/30 */\n\n#define RTPRIV_IOCTL_SHOW\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x11)\n\n\n#ifdef WSC_STA_SUPPORT\n#define RTPRIV_IOCTL_SET_WSC_PROFILE_U32_ITEM       (SIOCIWFIRSTPRIV + 0x14)\n#define RTPRIV_IOCTL_SET_WSC_PROFILE_STRING_ITEM    (SIOCIWFIRSTPRIV + 0x16)\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n/* Ralink defined OIDs */\n#define RT_PRIV_IOCTL\t\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x01)\n#define RTPRIV_IOCTL_SET\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x02)\n#define RT_PRIV_IOCTL_EXT\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x0E) /* Sync. with RT61 (for wpa_supplicant) */\t\t\t\t\n#ifdef DBG\n#define RTPRIV_IOCTL_BBP                            (SIOCIWFIRSTPRIV + 0x03)\n#define RTPRIV_IOCTL_MAC                            (SIOCIWFIRSTPRIV + 0x05)\n\n#define RTPRIV_IOCTL_RF                             (SIOCIWFIRSTPRIV + 0x13)\n\n#endif /* DBG */\n#define RTPRIV_IOCTL_E2P                            (SIOCIWFIRSTPRIV + 0x07)\n\n#define RTPRIV_IOCTL_ATE\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x08)\n\n#define RTPRIV_IOCTL_STATISTICS                     (SIOCIWFIRSTPRIV + 0x09)\n#define RTPRIV_IOCTL_ADD_PMKID_CACHE                (SIOCIWFIRSTPRIV + 0x0A)\n#define RTPRIV_IOCTL_RADIUS_DATA                    (SIOCIWFIRSTPRIV + 0x0C)\n#define RTPRIV_IOCTL_GSITESURVEY\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x0D)\n#define RTPRIV_IOCTL_ADD_WPA_KEY                    (SIOCIWFIRSTPRIV + 0x0E)\n#define RTPRIV_IOCTL_GET_MAC_TABLE\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x0F)\n#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT\t(SIOCIWFIRSTPRIV + 0x1F)\t/* modified by Red@Ralink, 2009/09/30 */\n#define RTPRIV_IOCTL_STATIC_WEP_COPY                (SIOCIWFIRSTPRIV + 0x10)\n\n#define RTPRIV_IOCTL_SHOW\t\t\t\t\t\t\t(SIOCIWFIRSTPRIV + 0x11)\n#define RTPRIV_IOCTL_WSC_PROFILE                    (SIOCIWFIRSTPRIV + 0x12)\n#define RTPRIV_IOCTL_QUERY_BATABLE                  (SIOCIWFIRSTPRIV + 0x16)\n#ifdef INF_AR9\n#define RTPRIV_IOCTL_GET_AR9_SHOW   (SIOCIWFIRSTPRIV + 0x17)\n#endif/* INF_AR9 */\n#define RTPRIV_IOCTL_SET_WSCOOB\t(SIOCIWFIRSTPRIV + 0x19)\n#define RTPRIV_IOCTL_WSC_CALLBACK\t(SIOCIWFIRSTPRIV + 0x1A)\n#endif /* CONFIG_AP_SUPPORT */\n\n#endif /* _RT_OS_H_ */\n"
  },
  {
    "path": "src/include/p2p.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2005, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attempt\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tp2p.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\n*/\n\n#ifndef __P2P_H__\n#define __P2P_H__\n\n#include \"p2p_cmm.h\"\n#include \"rtmp.h\"\n\n/*\n *  New is here\n */\n\n/* Macro */\n#define\tP2P_DISABLE\t\t0x00000000\n#define P2P_GO_UP\t\t0x00000001\n#define P2P_CLI_UP\t\t0x00000002\n#define P2P_FIXED_MODE\t0x80000000\n\n#define P2P_GO_ON(_pAd) \\\n\t(((_pAd)->flg_p2p_init) \\\n\t\t&& (((_pAd)->flg_p2p_OpStatusFlags & P2P_GO_UP) == P2P_GO_UP))\n\n#define P2P_CLI_ON(_pAd) \\\n\t(((_pAd)->flg_p2p_init) \\\n\t\t&& ((_pAd)->flg_p2p_OpStatusFlags == P2P_CLI_UP))\n\n/* ASCII to Integer */\n\n/*\tatoi & atoh */\n\n/* event */\n\n/* general */\n\n\n\n\ntypedef struct _RTMP_OID_SET_P2P_CONFIG \n{\n\tUCHAR\tConfigMode;\t/* Disable, activate p2p, or activate WPSE, or delete p2p profile. */\n\tULONG\tWscMode;\t/* Method : PIN or PBC or SMPBC */\n\tUCHAR\tPinCode[8];\n\tUCHAR\tDeviceName[32];\n\tULONG\tDeviceNameLen;\n\tUCHAR\tSSID[32];\n\tUCHAR\tSSIDLen;\n\tUCHAR\tP2PGroupMode; /* temporary or persistent. See definition. */\n\tUCHAR\tGoIntentIdx;\t/* Value = 0~15. Intent to be a GO in P2P */\n\tUCHAR\tConnectingMAC[MAX_P2P_GROUP_SIZE][6];  /* Specify MAC address want to connect. Set to all 0xff or all 0x0 if not specified. */\n\tUCHAR\tConnectingDeviceName[MAX_P2P_GROUP_SIZE][32];  /* Specify the Device Name that want to connect. Set to all 0xff or all 0x0 if not specified. */\n\tUCHAR\tListenChannel;\n\tUCHAR\tOperatinChannel;\n} RT_OID_SET_P2P_STRUCT, *PRT_OID_SET_P2P_STRUCT;\n\ntypedef struct _RALINKIP_IE\n{\n\tUCHAR\tElementID;\t\t/* 0xDD */\n\tUCHAR\tLength;\t\t\t/* limited by 256 */\n\tUCHAR\tOUI[3];\t\t\t/* should be SSIDL_OUI {00-0c-43-} */\n\tUCHAR\tOUIMode;\t\t\t/* See definition RALINKOUIMODE_xxxx */\n\tUCHAR\tOctet[1];\t\t/* Set bit position according to Aid.  (Like DTIM) */\n} RALINKIP_IE, *PRALINKIP_IE;\n\ntypedef struct _RALINKMBRIP_ELEM\n{\n\tUCHAR\tAddr[MAC_ADDR_LEN];\t\t  \n\tULONG\tMemberip;\t\t\t \n} RALINKMBRIP_ELEM, *PRALINKMBRIP_ELEM;\n\n/* global function prototype for non-p2p modules */\n\n\nINT Set_P2P_Enable(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Listen_Channel(\n\t\tIN\tPRTMP_ADAPTER\tpAd, \n\t\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Operation_Channel(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_GO_Intent(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Device_Name(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_WSC_Mode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT  Set_P2P_WSC_ConfMethod(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_NoA_Count(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_NoA_Duration(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_NoA_Interval(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Extend_Listen(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Extend_Listen_Interval(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Extend_Listen_Periodic(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Intra_Bss(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Print_Cfg(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Scan(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING \t\targ);\n\nINT Set_P2P_Print_GroupTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Print_PersistentTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Provision_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Invite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Device_Discoverability_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Service_Discovery_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Service_Discovery_Capable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\t\n\nINT Set_P2P_Send_Service_Discovery_Init_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Send_Service_Discovery_Comeback_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Send_Service_Discovery_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_P2P_Connect_GoIndex_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Connect_Dev_Addr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Send_Invite_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Provision_Dev_Addr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_P2P_State_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Reset_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Link_Down_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Sigma_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_QoS_NULL_Legacy_Rate_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_CLIENT_PM_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Persistent_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Enter_WSC_PIN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Dev_Discoverability_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Default_Config_Method_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_ProvisionByAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_DelDevByAddr_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_DevDiscPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_PriDeviceType_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_SecDevTypeList_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\nINT Set_P2P_DelPerstTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Cancel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_ConfirmByUI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2P_Discoverable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nVOID P2PStateMachineInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tSTATE_MACHINE *S, \n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID MlmeGASIntialReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeGASIntialRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeGASComebackReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeGASComebackRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeP2pNoaAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeP2pPresRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeP2pGoDiscoverAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeP2pPresReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerP2pNoaAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerP2pPresRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerP2pGoDiscoverAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerP2pPresReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pSendServiceReqCmd(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR \tp2pindex);\n\nVOID P2pSendPresenceReqCmd(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t p2pindex);\n\nVOID P2pGOStartNoA(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pStopNoA(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY\tpMacClient);\n\nVOID P2pStartOpPS(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pStopOpPS(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pPreAbsenTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID P2pSwNoATimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID P2pWscTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID P2pReSendTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID P2pCliReConnectTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nBOOLEAN P2pHandleNoAAttri(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY\tpMacClient,\n\tIN PUCHAR pData);\n\nBOOLEAN P2pResetNoATimer(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tULONG\tDiffTimeInus);\n\nBOOLEAN \tP2pSetGP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tULONG\tDiffTimeInus);\n\nVOID\t\tP2pGPTimeOutHandle(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID PeerGASIntialReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerGASIntialRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nBOOLEAN P2PParseServiceDiscoReq(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PFRAME_802_11 \tpFrame, \n\tOUT UCHAR\t\t*DialogToken, \n\tOUT UCHAR\t\t*ServiceTransaction,\n\tOUT PUCHAR\tpServiceDiscQuery,\n\tOUT UINT\t*ServiceDiscQueryLen);\n\nBOOLEAN P2PParseServiceDiscoRsp(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PRT_P2P_CLIENT_ENTRY\tpP2pEntry,\n\tIN UCHAR\t\tpP2pidx,\n\tIN PFRAME_802_11 \tpFrame, \n\tOUT UCHAR\t\t*ServiceTransaction,\n\tOUT PUCHAR\tpServiceDiscQuery,\n\tOUT UINT\t*ServiceDiscQueryLen);\n\nBOOLEAN P2PParseComebackReq(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PFRAME_802_11 \tpFrame, \n\tOUT UCHAR\t\t*DialogToken); \n\nBOOLEAN P2PParseComebackRsp(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PRT_P2P_CLIENT_ENTRY pP2pEntry,\n\tIN PFRAME_802_11 \tpFrame, \n\tIN UCHAR\t\t*ServiceTransaction);\n\nVOID P2PPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pCopyPerstParmToCfg(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tPerstindex);\n\nVOID P2pGetRandomSSID(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PSTRING pSSID,\n\tOUT PUCHAR pSSIDLen);\n\nINT\tP2P_GoSetCommonHT(\t\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID P2pSetPerstTable(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PVOID pInformationBuffer);\n\nVOID P2pEnable(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pCfgInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pLinkDown(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT32 type);\n\nVOID P2pScanChannelDefault(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID P2pStopConnectThis(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pScan(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pStopScan(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pCheckInviteReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN\t\tbIAmGO,\n\tIN UCHAR\t\tindex,\n\tIN PUCHAR\tChannelList,\n\tIN PUCHAR\tBssidAddr,\n\tIN UCHAR\t\tOpChannel,\n\tIN PUCHAR\tSsid,\n\tIN UCHAR\tSsidLen,\n\tIN UCHAR\t*pRspStatus);\n\nVOID P2pCheckInviteReqFromExisting(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tChannelList,\n\tIN PUCHAR\tBssidAddr,\n\tIN UCHAR\t\tOpChannel,\n\tIN PUCHAR\tSsid,\n\tIN UCHAR\t\tSsidLen,\n\tIN PUCHAR\tpRspStatus);\n\n\nBOOLEAN P2pCheckChannelList(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpChannelList);\n\nVOID P2PMakeFakeNoATlv(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\t StartTime,\n\tIN PUCHAR\t\tpOutBuffer);\n\nULONG InsertP2PGroupInfoTlv(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tpOutBuffer);\n\nULONG InsertP2PSubelmtTlv(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t\tSubId,\n\tIN PUCHAR\t\tpInBuffer,\n\tIN PUCHAR\t\tpOutBuffer);\n\nVOID InsertP2pChannelList(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t OpChannel, \n\tOUT ULONG\t *ChannelListLen, \n\tOUT PUCHAR \tpDest);\n\nBOOLEAN P2pParseGroupInfoAttribute(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR P2pindex, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen);\n\nVOID P2pParseNoASubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN UCHAR  wcidindex,\n\tIN UINT32 Sequence);\n\nVOID P2pParseExtListenSubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT USHORT *ExtListenPeriod,\n\tOUT USHORT *ExtListenInterval);\n\nVOID P2pParseManageSubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT UCHAR *pChannel,\n\tOUT UCHAR *pNumOfP2pOtherAttribute,\n\tOUT UCHAR *pTotalNumOfP2pAttribute,\n\tOUT UCHAR *pMamageablity,\n\tOUT UCHAR *pMinorReason);\n\nVOID P2pParseSubElmt(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN BOOLEAN  bBeacon, \n\tOUT USHORT *pDpid,\n\tOUT UCHAR *pGroupCap,\n\tOUT UCHAR *pDeviceCap,\n\tOUT UCHAR *pDeviceName,\n\tOUT UCHAR *pDeviceNameLen,\n\tOUT UCHAR *pDevAddr,\n\tOUT UCHAR *pInterFAddr,\n\tOUT UCHAR *pBssidAddr,\n\tOUT UCHAR *pSsidLen,\n\tOUT UCHAR *pSsid,\n\tOUT USHORT *pConfigMethod,\n\tOUT USHORT *pWpsConfigMethod,\n\tOUT UCHAR *pDevType,\n\tOUT UCHAR *pListenChannel,\n\tOUT UCHAR *pOpChannel,\n\tOUT UCHAR *pChannelList,\n\tOUT UCHAR *pIntent,\n\tOUT UCHAR *pStatusCode,\n\tOUT UCHAR *pInviteFlag,\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT VOID *pPrivate);\n\nVOID P2pReceGoNegoConfirmAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem); \n\nVOID P2pReceGoNegoRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem); \n\nVOID P2pSendProbeReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR Channel);\n\nVOID P2pReceGoNegoReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem); \n\nVOID P2pReceDevDisReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pReceDevDisRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pReceInviteRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pReceInviteReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pReceProvisionReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID P2pReceProvisionRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\n\nVOID P2PMakeGoNegoConfirm(\n\tIN PRTMP_ADAPTER pAd,\n \tIN PUCHAR\t\tAddr1,\n\tIN UCHAR\t\t\tToken,\n\tIN PUCHAR\t\tpOutBuffer,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PSendGoNegoConfirm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t\tToken,\n\tIN UCHAR\t\t\tidx,\n\tIN PUCHAR\t\tAddr1);\n\nVOID P2PSendDevDisReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tBssid,\n\tIN PUCHAR\t\tClientAddr1,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PSendDevDisRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR \t\tRspStatus,\n\tIN UCHAR \t\t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PSendProvisionReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT \t\tConfigMethod,\n\tIN UCHAR \t\t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PSendProvisionRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT \t\tConfigMethod,\n\tIN UCHAR \t\t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PMakeGoNegoRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tAddr1,\n\tIN USHORT\t\t\tReceDpid,\n\tIN UCHAR\t\t\tToken,\n\tIN UCHAR\t\t\tTempIntent,\n\tIN UCHAR\t\t\tChannel,\n\tIN UCHAR\t\t\tStatus,\n\tIN PUCHAR\t\tpOutBuffer,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PMakeGoNegoReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t\tindex,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tpOutBuffer,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PMakeInviteReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR \t\t\tMyRule,\n\tIN UCHAR \t\t\tInviteFlag,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tBssid,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2PMakeInviteRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR \t\tMyRule,\n\tIN UCHAR \t\tToken,\n\tIN PUCHAR\t\tAddr1,\n\tIN PUCHAR\t\tBssid,\n\tIN PUCHAR\t\tOpChannel,\n\tIN PUCHAR\t\tStatus,\n\tOUT PULONG\t\tpTotalFrameLen);\n\nVOID P2pAckRequiredCheck(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PP2P_PUBLIC_FRAME\tpFrame,\n\tOUT \t\tUCHAR\t*TempPid);\n\nBOOLEAN IsP2pFirstMacSmaller(\n\tIN PUCHAR\t\tFirststaddr,\n\tIN PUCHAR\t\tSecondAddr);\n\nVOID P2pSetListenIntBias(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tBias);\n\nVOID P2pSetRule(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tIndex,\n\tIN PUCHAR\t\tPeerBssid,\n\tIN UCHAR\t\tPeerGOIntent,\n\tIN UCHAR\t\tChannel);\n\nVOID P2pGroupMaintain(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pCopyP2PTabtoMacTab(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tP2pindex,\n\tIN UCHAR\t\tMacindex);\n\nVOID P2pGroupTabInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pGroupTabDisconnect(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN bSendDeAuth);\n\nUCHAR P2pGroupTabInsert(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr,\n\tIN P2P_CLIENT_STATE\tState,\n\tIN CHAR Ssid[], \n\tIN UCHAR SsidLen,\n\tIN UCHAR DevCap,\n\tIN UCHAR GrpCap);\n\nUCHAR P2pGroupTabDelete(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR    p2pindex, \n\tIN PUCHAR    Addr);\n\nUCHAR P2pGroupTabSearch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr); \n\nVOID P2pPerstTabClean(\n\tIN PRTMP_ADAPTER pAd);\n\nUCHAR P2pPerstTabInsert(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpAddr,\n\tIN PWSC_CREDENTIAL pProfile);\n\nUCHAR P2pPerstTabDelete(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t*pMacList);\n\nUCHAR P2pPerstTabSearch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr,\n\tIN PUCHAR    Bssid,\n\tIN PUCHAR    InfAddr);\n\nVOID P2pCrednTabClean(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pCrednTabInsert(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpAddr,\n\tIN WSC_CREDENTIAL\t*pProfile);\n\nVOID P2pCrednTabDelete(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t*pAddr);\n\nBOOLEAN P2pCrednEntrySearch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR    Addr,\n\tIN PUCHAR\tResultIndex);\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\nVOID P2pSendWirelessEvent(\n    IN PRTMP_ADAPTER pAd,\n    IN INT MsgType,\n    IN PRT_P2P_CLIENT_ENTRY pP2pEntry,\n    IN PUCHAR Addr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\nBOOLEAN P2pStartGroupForm(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR\t\tidx);\n\nBOOLEAN P2pProvision(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr);\n\nBOOLEAN P2pConnect(\n\tIN PRTMP_ADAPTER pAd); \n\nVOID P2pConnectPrepare(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tAddr,\n\tIN UINT32 ConnType); \n\nBOOLEAN P2pConnectAfterScan(\n\tIN PRTMP_ADAPTER pAd, \n\tIN BOOLEAN\tbBeacon,\n\tIN UCHAR\t\tidx);\n\nVOID P2pConnectAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN BOOLEAN\tbBeacon,\n\tIN UCHAR\t\tindex);\n\nVOID P2pConnectP2pClient(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tGrpIndex);\n\nBOOLEAN P2pConnectP2pGo(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tidx);\n\nBOOLEAN P2pClientDiscovery(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR \t\tGoP2pTabIdx);\n\nBOOLEAN P2pInviteAsRule(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR\t\tMyRule,\n\tIN UCHAR \t\tP2pTabIdx);\n\nBOOLEAN P2pInvite(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN UCHAR\t\tPersistentTabIdx, \n\tIN UCHAR \t\tP2pTabIdx);\n\nBOOLEAN PeerP2pProbeReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n/*\tOUT RALINKIP_IE *RequestIp, */\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement, \n/*\tOUT USHORT *WSCInfoAtBeaconsLen, */\n/*\tOUT PUCHAR WSCInfoAtBeacons, */\n/*\tOUT USHORT *WSCInfoAtProbeRspLen, */\n/*\tOUT PUCHAR WSCInfoAtProbeRsp, */\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT ULONG *WpsIELen, \n\tOUT PUCHAR pWpsIE);\n\nBOOLEAN PeerP2pBeaconSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement);\n\n#ifndef WFD_SUPPORT\nBOOLEAN PeerP2pProbeRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT UCHAR *pChannel,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement);\n#else\nBOOLEAN PeerP2pProbeRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT UCHAR *pChannel,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement,\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement);\n#endif /* WFD_SUPPORT */\n\nVOID P2pPeerBeaconAtJoinAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN PUCHAR\t\tBssid);\n\nVOID PeerP2pBeaconProbeRspAtScan(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n/*\tIN USHORT CapabilityInfo, */\n/*\tIN UCHAR\tWorkingChannel); */\n/*\tIN USHORT WSCInfoAtBeaconsLen,\n\tIN PUCHAR WSCInfoAtBeacons,\n\tIN USHORT WSCInfoAtProbeRspLen,\n\tIN PUCHAR WSCInfoAtProbeRsp);*/\n\nVOID PeerP2pBeacon(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tpAddr2,\n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN LARGE_INTEGER   TimeStamp);\n\nBOOLEAN PeerBeaconParseRalinkIE( \n\t\tIN PRTMP_ADAPTER pAd, \n\t\tIN VOID *Msg, \n\t\tIN ULONG MsgLen, \n\t\tOUT RALINKIP_IE\t\t\t\t*pRalinkIE,\n\t\tOUT RALINKMBRIP_ELEM\t\t\t\t*pMemberip,\n\t\tOUT ULONG *pPeerip);\n\nVOID PeerP2pProbeReq(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n/*\tIN BOOLEAN\tbSendRsp);  */\n\nVOID P2PParseWPSIE(\n\tIN PUCHAR\tpWpsData,\n\tIN USHORT\t\tWpsLen,\n\tOUT PUSHORT\tDpid,\n\tOUT PUSHORT\tConfigMethod,\n\tOUT PUCHAR\tDeviceName,\n\tOUT UCHAR\t*DeviceNameLen);\n\nBOOLEAN P2PDeviceMatch(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR\tAddr,\n\tIN PUCHAR\tDeviceName,\n\tIN ULONG\t\tDeviceNameLen);\n\nVOID P2PMakeProbe(\n\tIN PRTMP_ADAPTER pAd,  \n\tIN MLME_QUEUE_ELEM *Elem, \n\tIN UCHAR\t\tDsChannel,\n\tIN USHORT\tSubType,\n\tOUT PUCHAR pDest,\n\tOUT\tULONG *pFrameLen);\n\nVOID P2pMakeP2pIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN \tUCHAR\t\t\tPacketType,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPULONG\t\t\tpIeLen);\n\nVOID P2pSetWps(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN PRT_P2P_CLIENT_ENTRY pP2pEntry); \n\nVOID P2pGotoIdle(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pGotoScan(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pGoNegoDone(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PRT_P2P_CLIENT_ENTRY pP2pEntry);\n\nVOID P2pWpsDone(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tpAddr);\n\nVOID P2pCopyMacTabtoP2PTab(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tP2pindex,\n\tIN UCHAR\t\tMacindex);\n\nVOID P2pReceiveEapNack(\n\tIN PRTMP_ADAPTER pAd,\n\tIN\tPMLME_QUEUE_ELEM\tpElem);\n\nVOID P2pMakeProbeRspWSCIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPULONG\t\t\tpIeLen);\n\nVOID P2pMakeProbeReqIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen);\n\nVOID P2pStartAutoGo(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pStartGo(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pPauseBssSync(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2pResumeBssSync(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2PCTWindowTimer(\n\tIN PVOID\tSystemSpecific1, \n\tIN PVOID\tFunctionContext, \n\tIN PVOID\tSystemSpecific2, \n\tIN PVOID\tSystemSpecific3);\n\nVOID GoPeerDisassocReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tAddr2);\n\nULONG P2pUpdateGroupBeacon(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG\tStartPosition);\n\nULONG P2pUpdateNoABeacon(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR apidx,\n/*\tIN ULONG\tStartPosition); */\n\tIN PUCHAR\tpDest);\n\nULONG P2pUpdateNoAProbeRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpInbuffer);\n\nVOID P2pUpdateBssBeacon(\n\tIN PRTMP_ADAPTER pAd,\n\tIN  PUCHAR\t pCapability,\n\tIN  PUCHAR\tpIpReq);\n\nVOID P2pMakeBssBeacon(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID\tP2PInitListenTimer(\n\tIN PRTMP_ADAPTER\tpAd,\n\tUINT32\tvalue);\n\nVOID\tP2PSetListenTimer(\n\tIN PRTMP_ADAPTER\tpAd,\n\tUINT32\tvalue);\n\t\nVOID\tP2PListenTimerExec(\n\tIN PRTMP_ADAPTER\tpAd,\n\tUINT32\tvalue);\n\nVOID\tP2PInitNextScanTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue);\n\nVOID\tP2PSetNextScanTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue);\n\nVOID\tP2PNextScanTimerExec(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue);\n\nVOID\tP2PInitDevDiscTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue);\n\nVOID\tP2PSetDevDiscTimer(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue);\n\nVOID\tP2PDevDiscTimerExec(\n\tIN PRTMP_ADAPTER pAd,\n\tUINT32\tvalue);\n\nVOID P2P_SetWscRule(\n\tIN PRTMP_ADAPTER pAd,\n\tUCHAR\tindex,\n\tPUSHORT PeerWscMethod);\n\nVOID GOUpdateBeaconFrame(\n\tIN PRTMP_ADAPTER pAd);\n\nUCHAR ChannelToClass(\n\tIN UCHAR\t\tChannel,\n\tIN UCHAR\t\tCountry);\n\nVOID P2PCtrlStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID P2PDiscoveryStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID P2PGoFormationStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID P2PStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID P2PInitChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd);\n\nNDIS_STATUS P2PAPInitialize(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID P2PAPShutdown(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2PUserCfgInit(\n\tIN\tPRTMP_ADAPTER pAd);\n\nPSTRING decodeDpid (USHORT dpid);\nPSTRING decodeConfigMethod (USHORT ConfigMethos);\nPSTRING decodeP2PState (UCHAR P2pState);\nPSTRING decodeP2PClientState (P2P_CLIENT_STATE P2pClientState);\nPSTRING decodeMyRule (USHORT Rule);\nPSTRING decodeCtrlState (UCHAR State);\nPSTRING decodeDiscoveryState (UCHAR State);\nPSTRING decodeGroupFormationState (UCHAR State);\nVOID decodeDeviceCap (UCHAR State);\nVOID decodeGroupCap (UCHAR State);\n\n\nVOID P2PPrintMac(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\tmacindex);\n\nVOID P2PPrintP2PEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tp2pindex);\n\nVOID P2PPrintP2PPerstEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tp2pindex);\n\nVOID P2P_GoStartUp(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN INT         \tbssidx);\n\nVOID P2P_GoStop(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2P_CliStartUp(\n\tIN PRTMP_ADAPTER \tpAd);\n\nVOID P2P_CliStop(\n\tIN PRTMP_ADAPTER \tpAd);\n\nVOID AsicEnableP2PGoSync(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID MgtMacP2PHeaderInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN OUT PHEADER_802_11 pHdr80211, \n\tIN UCHAR SubType, \n\tIN UCHAR ToDs, \n\tIN PUCHAR pDA, \n\tIN PUCHAR pBssid);\n\nVOID P2PMacTableReset(\n\tIN  PRTMP_ADAPTER  pAd);\n\nVOID P2PMacTableMaintenance(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2PChannelInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tifIndex);\n\nVOID\tP2PCfgInit(\n\tIN\tPRTMP_ADAPTER pAd);\n\nVOID P2PUpdateMlmeRate(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID P2pInit(\n\tIN PRTMP_ADAPTER \t\t\t\tpAd,\n\tIN RTMP_OS_NETDEV_OP_HOOK\t\t*pNetDevOps);\n\nINT P2P_OpenPre(\n\tIN\tPNET_DEV\t\t\t\t\tpDev);\n\nINT P2P_OpenPost(\n\tIN\tPNET_DEV\t\t\t\t\tpDev);\n\nINT P2P_Close(\n\tIN\tPNET_DEV\t\t\t\t\tpDev);\n\nVOID P2P_Remove(\n\tIN PRTMP_ADAPTER\t\t\t\tpAd);\n\nINT P2PGetEntryCnt(\n\tIN PRTMP_ADAPTER\tpAd);\n\n/* ******************************************************************** */\n/* WiFi Direct control */\n\n#define P2P_INC_CHA_INDEX(_idx, _RingSize)    \\\n{                                          \\\n    (_idx)++;                              \\\n    if ((_idx) >= (_RingSize)) _idx=0;     \\\n}\n/*  channel 1, 6, 11 is listen channel. */\n#define P2P_LISTEN_CHA_SIZE\t\t3\n\n\n#define ICS_STATUS_ENABLED\t\t1\n#define ICS_STATUS_DISABLED\t\t0\n\n\n\n#define P2PMANAGED_ENABLE_BIT\t\t0x1\n#define P2PMANAGED_ICS_ENABLE_BIT\t\t0x2\n#define P2PMANAGED_COEXIST_OPT_BIT\t\t0x4\n\n#define P2P_OPPS_BIT\t\t0x80\n\n/*\n *  Macros for bit check\n*/\n\n#define P2P_TEST_BIT(_M, _F)      (((_M) & (_F)) != 0)\n\n\n\n/* Packet Format. */\n#define IE_P2P\t\t\t\t\t0xdd\n\ntypedef struct {\n\tUCHAR\t\tOUI[3];\n\tUCHAR\t\tOUIType;\n\tUCHAR            Octet[1];\n} P2P_IE, *PP2P_IE;\n\n#define SIZE_OF_FIXED_CLIENT_INFO_DESC\t25\n\n\n\n\ntypedef struct _OID_P2P_PERSISTENT_TABLE\n{\n\tUCHAR  PerstNumber;  /* What persistent profile is set ? */\n\tRT_P2P_PERSISTENT_ENTRY  PerstEntry[MAX_P2P_TABLE_SIZE]; /* Save persistent profile for auto reconnect */\n} OID_P2P_PERSISTENT_TABLE, *POID_P2P_PERSISTENT_TABLE;\n\n\n\n\n\n\ntypedef struct {\n    UCHAR   Eid;\n    UCHAR   Len[2];\n    CHAR   Octet[1];\n} P2PEID_STRUCT,*PP2PEID_STRUCT;\n\n\n#endif /* __P2P_H__ */\n\n\n"
  },
  {
    "path": "src/include/p2p_cmm.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tDefine all structures, data types that rtmp.h needed in this file. Don't\n\tput any sturctures and functions definition which refer to RTMP_ADAPTER\n\tHere.\n\n\n***************************************************************************/\n\n#ifdef P2P_SUPPORT\n\n\n#ifndef __P2P_CMM_H__\n#define __P2P_CMM_H__\n\n#include \"wfa_p2p.h\"\n\n#ifdef WFD_SUPPORT\n#include \"wfd_cmm.h\"\n#endif /* WFD_SUPPORT */\n\n/* Marco for interna use */\n#define P2P_INF_ON(_pAd) \\\n\t(((_pAd)->flg_p2p_init) \\\n\t\t&& ((_pAd)->p2p_dev) \\\n\t\t&& (RtmpOSNetDevIsUp((_pAd)->p2p_dev) == TRUE))\n\n#define IS_P2P_GO_NEG(_A)\t\t(((_A)->P2pCfg.P2PConnectState == P2P_ANY_IN_FORMATION_AS_CLIENT) || ((_A)->P2pCfg.P2PConnectState == P2P_ANY_IN_FORMATION_AS_GO))\n\n#define IS_P2P_REGISTRA(_A)\t\t(((_A)->P2pCfg.P2PConnectState == P2P_WPS_REGISTRA))\n#define IS_P2P_ENROLLEE(_A)\t\t(((_A)->P2pCfg.P2PConnectState == P2P_DO_WPS_ENROLLEE))\n#define IS_P2P_PROVISIONING(_A)\t\t(IS_P2P_ENROLLEE(_A) || IS_P2P_REGISTRA(_A))\n/*#define IS_P2P_GO_WPA2PSKING(_A)\t\t((_A)->P2pCfg.P2PConnectState == P2P_GO_ASSOC_AUTH) */\n/*#define IS_P2P_CLIENT_WPA2PSKING(_A)\t\t((_A)->P2pCfg.P2PConnectState == P2P_I_AM_CLIENT_ASSOC_AUTH) */\n\n/*#define IS_P2P_GO_OP(_A)\t\t(((_A)->P2pCfg.P2PConnectState >= P2P_I_AM_GO_OP)) */\n/*#define IS_P2P_CLIENT_OP(_A)\t\t(((_A)->P2pCfg.P2PConnectState == P2P_I_AM_CLIENT_OP)) */\n/*#define IS_P2P_OP(_A)\t\t(IS_P2P_GO_OP(_A) || IS_P2P_CLIENT_OP(_A)) */\n\n#define IS_P2P_CONNECT_IDLE(_A)\t\t(((_A)->P2pCfg.P2PConnectState) == P2P_CONNECT_IDLE)\n#define IS_P2P_CONNECTING(_A)\t\t(((_A)->P2pCfg.P2PConnectState) > P2P_CONNECT_IDLE)\n#define IS_P2P_GO_NEGOING(_A)\t\t(((_A)->P2pCfg.P2PConnectState < P2P_DO_GO_SCAN_BEGIN) &&  ((_A)->P2pCfg.P2PConnectState > P2P_CONNECT_IDLE))\n#define IS_P2P_GROUP_FORMING(_A)\t\t(((_A)->P2pCfg.P2PConnectState <= P2P_WPS_REGISTRA) &&  ((_A)->P2pCfg.P2PConnectState > P2P_CONNECT_IDLE))\n#define IS_P2P_INVITING(_A)\t\t(((_A)->P2pCfg.P2PConnectState == P2P_INVITE))\n/* Check for Peer's State. */\n#define IS_P2P_PEER_CLIENT_OP(_C)\t\t(((_C)->P2pClientState <= P2PSTATE_CLIENT_FIND)&& ((_C)->P2pClientState >= P2PSTATE_CLIENT_OPERATING))\n#define IS_P2P_PEER_PROVISIONING(_C)\t\t(((_C)->P2pClientState == P2PSTATE_CLIENT_WPS)&& ((_C)->P2pClientState == P2PSTATE_GO_WPS))\n#define IS_P2P_PEER_WPAPSK(_C)\t\t(((_C)->P2pClientState <= P2PSTATE_CLIENT_ASSOC)&& ((_C)->P2pClientState >= P2PSTATE_CLIENT_AUTH))\n#define IS_P2P_PEER_GO_OP(_C)\t\t(((_C)->P2pClientState <= P2PSTATE_GO_FIND)&& ((_C)->P2pClientState >= P2PSTATE_GO_OPERATING))\n#define IS_P2P_PEER_OP(_C)\t\t((IS_P2P_PEER_CLIENT_OP(_C)) || (IS_P2P_PEER_GO_OP(_C)))\n#define IS_P2P_PEER_DISCOVERY(_C)\t\t(((_C)->P2pClientState <= P2PSTATE_DISCOVERY_CLIENT)&& ((_C)->P2pClientState >= P2PSTATE_DISCOVERY))\n#define IS_P2PPEER_CLIENT_GO_FORM(_C)\t\t(((_C)->P2pClientState <= P2PSTATE_GO_COMFIRM_ACK_SUCCESS)&& ((_C)->P2pClientState >= P2PSTATE_DISCOVERY))\n\n/* P2P Control Reg. */\n#define IS_MANAGED_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_MANAGED) != 0)\n#define IS_PERSISTENT_ON(_A)\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_PERSISTENT) != 0)\n#define IS_INVITE_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_INVITE) != 0)\n#define IS_INTRA_BSS_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_INTRA_BSS) != 0)\n#define IS_CLIENT_DISCOVERY_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_CLI_DISCOVERY) != 0)\n#define IS_EXT_LISTEN_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_EXT_LISTEN) != 0)\n#define IS_SERVICE_DISCOVERY_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_SERVICE_DISCOVERY) != 0)\n#define IS_OPPS_ON(_A)\t\t((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_OPPS) != 0)\n#define IS_SW_NOA_TIMER(_A) ((_A->P2pCfg.P2pControl.word & P2P_CONTROL_REG_SW_NOA) != 0)\n#define IS_P2P_SUPPORT_EXT_LISTEN(_A)\t(((_A)->P2pCfg.ExtListenInterval != 0) && ((_A)->P2pCfg.ExtListenPeriod != 0) && ((_A)->P2pCfg.P2pControl.field.ExtendListen == 1))\n#define IS_P2P_ABSENCE(_A)\t(((_A)->P2pCfg.bPreKeepSlient) || ((_A)->P2pCfg.bKeepSlient))\n\n/* P2P Discovery State Machine. */\n#define IS_P2P_LISTEN(_pAd)\t\\\n\t(_pAd->P2pCfg.DiscCurrentState == P2P_DISC_LISTEN)\n#define IS_P2P_SEARCH(_pAd)\t\\\n\t(_pAd->P2pCfg.DiscCurrentState == P2P_DISC_SEARCH)\n#define IS_P2P_SCAN(_pAd)\t\\\n\t(_pAd->P2pCfg.DiscCurrentState == P2P_DISC_SCAN)\n#define IS_P2P_DEVICE_DISCOVERING(_pAd) \\\n\t(_pAd->P2pCfg.CtrlCurrentState == P2P_CTRL_DISCOVERY)\n\n/* Definition */\n#define P2P_WSC_CONF_MTHD_DEFAULT(_pAd)\t\\\n\t\t_pAd->P2pCfg.WscMode = WSC_PIN_MODE;\t\\\n\t\t_pAd->P2pCfg.ConfigMethod = 0x188;\t\\\n\t\t_pAd->P2pCfg.Dpid = DEV_PASS_ID_NOSPEC;\n\n/* \n  * P2P CTRL State machine: states, events, total function\n  */\ntypedef\tenum\t_P2P_CTRL_STATE\n{\n\tP2P_CTRL_IDLE,\n\tP2P_CTRL_DISCOVERY,\n\tP2P_CTRL_GROUP_FORMATION,\n\tP2P_CTRL_DONE,\n\tP2P_CTRL_MAX_STATES,\n}\tP2P_CTRL_STATE;\n\ntypedef enum _P2P_CTRL_EVENT\n{\n\tP2P_CTRL_DISC_EVT,\n\tP2P_CTRL_DISC_CANL_EVT,\n\tP2P_CTRL_DISC_DONE_EVT,\n\tP2P_CTRL_GO_BACK_TO_OP_CH_EVT,\n\tP2P_CTRL_GO_NEGO_EVT,\n\tP2P_CTRL_GO_NEGO_CANL_EVT,\n\tP2P_CTRL_GO_NEGO_DONE_EVT,\n\tP2P_CTRL_MAX_EVENTS,\n} P2P_CTRL_EVENT;\n\n#define\tP2P_CTRL_FUNC_SIZE\t(P2P_CTRL_MAX_STATES * P2P_CTRL_MAX_EVENTS)\n\n\n/*\n  * P2P DISC state machine: states, evvents, total function\n  */\ntypedef enum\t_P2P_DISC_STATE\n{\n\tP2P_DISC_IDLE,\n\tP2P_DISC_SCAN,\n\tP2P_DISC_LISTEN,\n\tP2P_DISC_SEARCH,\n\tP2P_DISC_MAX_STATES,\n} P2P_DISC_STATE;\n\ntypedef enum\t_P2P_DISC_EVENT\n{\n\tP2P_DISC_SCAN_CMD_EVT,\n\tP2P_DISC_LISTEN_CMD_EVT,\n\tP2P_DISC_SEARCH_CMD_EVT,\n\tP2P_DISC_CANL_CMD_EVT,\n\tP2P_DISC_PEER_PROB_REQ,\n\tP2P_DISC_PEER_PROB_RSP,\n\tP2P_DISC_MAX_EVENTS,\n} P2P_DISC_EVENT;\n\n#define\tP2P_DISC_FUNC_SIZE\t(P2P_DISC_MAX_STATES * P2P_DISC_MAX_EVENTS)\n\n/*\n  * P2P GO_FORM state machine: states, evvents, total function\n  */\ntypedef enum\t_P2P_GO_FORM_STATE\n{\n\tP2P_GO_FORM_IDLE,\n\tP2P_WAIT_GO_FORM_RSP,\n\tP2P_WAIT_GO_FORM_CONF,\n\tP2P_GO_FORM_DONE,\n\tP2P_GO_FORM_PROV,\n\tP2P_WAIT_GO_FORM_PROV_RSP,\n\tP2P_GO_FORM_INVITE,\n\tP2P_WAIT_GO_FORM_INVITE_RSP,\n\tP2P_WAIT_GO_FORM_DEV_DISC_RSP,\n\tP2P_WAIT_GO_FORM_SRV_DISC_RSP,\n\tP2P_GO_FORM_MAX_STATES,\n} P2P_GO_FORM_STATE;\n\ntypedef enum\t_P2P_GO_FORM_EVENT\n{\n\tP2P_GO_NEGO_REQ_CMD_EVT,\n\tP2P_PEER_GO_NEGO_REQ_EVT,\n\tP2P_GO_NEGO_RSP_EVT,\n\tP2P_PEER_GO_NEGO_RSP_EVT,\n\tP2P_GO_NEGO_CONFIRM_EVT,\n\tP2P_PEER_GO_NEGO_CONFIRM_EVT,\n\tP2P_GO_NEGO_PROV_REQ_CMD_EVT,\n\tP2P_PEER_GO_NEGO_PROV_REQ_EVT,\n\tP2P_GO_NEGO_PROV_RSP_EVT,\n\tP2P_PEER_GO_NEGO_PROV_RSP_EVT,\n\tP2P_GO_NEGO_CANCEL_EVT,\n\tP2P_PEER_INVITE_REQ_EVT,\n\tP2P_PEER_INVITE_RSP_EVT,\n\tP2P_DEV_DISC_REQ_CMD_EVT,\n\tP2P_PEER_DEV_DISC_REQ_EVT,\n\tP2P_DEV_DISC_RSP_EVT,\n\tP2P_PEER_DEV_DISC_RSP_EVT,\n\tP2P_START_COMMUNICATE_CMD_EVT,\n\tP2P_SEND_PASSED_CMD_EVT,\n\tP2P_GO_NEGO_MAX_EVENTS,\n} P2P_GO_FORM_EVENT;\n\ntypedef enum\t_P2P_LINK_DOWN_TYPE\n{\n\tP2P_DISCONNECTED,\n\tP2P_CONNECT_FAIL,\n} P2P_LINK_DOWN_TYPE;\n\n#define\tP2P_GO_FORM_FUNC_SIZE\t(P2P_GO_FORM_MAX_STATES * P2P_GO_NEGO_MAX_EVENTS)\n\n/*\n  * P2P state machine: states, events, total function #\n  */\n#define MT2_MAX_PEER_SUPPORT              3\ntypedef enum\t_P2P_ACTION_STATE\n{\n\tP2P_IDLE_STATE,\n\tMAX_P2P_STATE,\t\t\n} P2P_ACTION_STATE;\n\ntypedef enum\t_P2P_ACTION_EVENT\n{\n\tMT2_PEER_P2P_NOA,\n\tMT2_PEER_P2P_PRESENCE_REQ,\n\tMT2_PEER_P2P_PRESENCE_RSP,\n\tMT2_PEER_P2P_GO_DIS_REQ,\n\tMT2_MLME_P2P_NOA,\n\tMT2_MLME_P2P_PRESENCE_REQ,\n\tMT2_MLME_P2P_PRESENCE_RSP,\n\tMT2_MLME_P2P_GO_DIS_REQ,\n\tMT2_MLME_P2P_GAS_INT_REQ,\n\tMT2_MLME_P2P_GAS_INT_RSP,\n\tMT2_MLME_P2P_GAS_CB_REQ,\n\tMT2_MLME_P2P_GAS_CB_RSP,\n\tMAX_P2P_MSG,\n} P2P_ACTION_EVENT;\n\n#define P2P_ACTION_FUNC_SIZE\t(MAX_P2P_STATE * MAX_P2P_MSG)\n\n\n/* ----- General ----- */\n\n/* P2P Oprtation Mode */\n#define\tP2P_ONLY\t\t\t\t\t(1<<0)\t/* STA or P2P in single interface */\n#define\tP2P_CONCURRENT\t\t\t\t(1<<1)\t/* STA and P2P in different interface */\t\n\n#define P2P_IS_GO\t\t\t\t\t1\n#define P2P_IS_CLIENT\t\t\t\t2\n#define P2P_IS_DEVICE\t\t\t\t3\n#define P2P_IS_CLIENT_IN_GROUP\t\t4\n\n#define P2P_SET_FLAG(_M, _F)       ((_M)->P2pFlag |= (_F))\n#define P2P_CLEAR_FLAG(_M, _F)     ((_M)->P2pFlag &= ~(_F))\n#define P2P_TEST_FLAG(_M, _F)      (((_M)->P2pFlag & (_F)) != 0)\n#define P2P_TEST_FLAGS(_M, _F)     (((_M)->P2pFlag & (_F)) == (_F))\n\n\n#define P2PFLAG_PROVISIONED\t\t\t\t\t\t0x01\n#define P2PFLAG_INVITE_ENABLED\t\t\t\t\t0x02\n#define P2PFLAG_DEVICE_DISCOVERABLE\t\t\t\t0x04\n\n#define P2P_OUI\t\t\t\t\t\t\t0x099a6f50 /* spec. P2P OUI */\n#define P2P_RANDOM_BASE\t\t\t\t\t35\t/*; 3 second. */\n#define P2P_RANDOM_WPS_BASE\t\t\t\t10\t/*; 5 second. */\n#define P2P_RANDOM_BIAS\t\t\t\t\t10\t/*; 2 second. */\n#define P2P_RANDOM_PERST_BIAS\t\t\t60\t/*; 2 second. */\n#define P2P_SCAN_CHANNEL_STEP\t\t\t11\n#define P2P_SCAN_PERIOD\t\t\t\t\t1800\t/* unit : 100ms. Scan period how long ? 2min ? */\n#define P2P_SCAN_SHORTPERIOD\t\t\t100\t/* unit : 100ms. Scan period how long ? 2min ? */\n#define P2P_EXT_LISTEN_INTERVAL\t\t\t4000\t/* unit is 1ms */\n#define P2P_EXT_LISTEN_PERIOD\t\t\t1000\t/* unit is 1ms */\n\n#define P2P_CHECK_GO_TIMER\t\t\t\t300000\t/* 3 minutes */\n#define P2P_CHECK_CLIENT_TIMER\t\t\t30000\t/* 30 seconds */\n#define P2P_WSC_TIMER\t\t\t\t\t120000\t/* 120 seconds */\n#define P2P_TRANSMIT_TIMER\t\t\t\t500\t\t/* 500 ms */\n\n\n#define ONETU\t\t\t\t\t\t\t100\n\n/* P2P Tab index */\n#define P2P_NOT_FOUND                    0xFF\n\n#define MINOR_REASON_SUCCESS\t\t\t\t0\n#define MINOR_REASON_CROSS_CONNECT\t\t\t1\n#define MINOR_REASON_MANAGED_BIT_ZERO\t\t2\n#define MINOR_REASON_COEXIST_PARM_BAD\t\t3\n#define MINOR_REASON_MANAGED_BIT_ONE\t\t4\n\n\n/* Invittion Flags */\n#define P2P_INVITE_FLAG_REINVOKE\t\t1\n\n\n#define GROUP_MODE_TEMP\t\t1\n#define GROUP_MODE_PERSISTENT\t\t2\n#define MAX_P2P_GROUP_SIZE\t\t30 /* Max mactab size(32) - 2 */\n#define MAX_P2P_TABLE_SIZE\t\t8 /*  Save Presistent entry */\n#define PROFILE_P2P\t\t1\n#define PROFILE_WPSE\t\t2\n#define P2P_DEVICE_TYPE_LEN\t\t8\n#define P2P_DEVICE_NAME_LEN\t\t32\n\n/* P2P Scan */\n#define P2P_STOP_SCAN\t\t\t0\n#define P2P_SCANNING\t\t\t1\n#define P2P_STOP_SCAN_AND_LISTEN\t2\n\n#define CONNECTING_OR_NO_LINK\t\t0\n#define P2P_GO\t\t1\n#define P2P_CLIENT\t2\n#define P2P_DEVICE\t3\n#define TDLS_LINKED 4\n#define WFD_SESSION_UNAVALIBLE\t5\n#define WFD_PEER_PC_P2P\t6\n#define WFD_PEER_TDLS_WEAK_SECURITY\t7\n\n/* Use macro to define the default value of bConfirmByUI. */\n#ifdef HE_BD_SUPPORT\n#define CONFIRM_BY_UI_DEFAULT       TRUE\n#else\n#define CONFIRM_BY_UI_DEFAULT       FALSE\n#endif\n\n/* Describe the peer's state when I am performing P2P Operation with the peer. */\ntypedef\tenum\t_P2pClientState\n{\n\t\tP2PSTATE_NONE,\n\t\tP2PSTATE_DISCOVERY, /* Not associated. Because need to get SSID from Probe Response. So add this state. */\n\t\tP2PSTATE_DISCOVERY_GO,\t/* this device is a GO. has beacon */\n\t\tP2PSTATE_DISCOVERY_CLIENT,\t/* this device is a client that associates with a GO. (in a p2p group.) */\n\t\tP2PSTATE_DISCOVERY_UNKNOWN, /* Need to scan to decide this peer's rule is GO or Client or Device. */\n\t\tP2PSTATE_CLIENT_DISCO_COMMAND,\t/* Do Client Discovery. */\n\t\tP2PSTATE_WAIT_GO_DISCO_ACK, /* Do Client Discovery. */\n\t\tP2PSTATE_WAIT_GO_DISCO_ACK_SUCCESS, /* Do Client Discovery. */\n\t\tP2PSTATE_GO_DISCO_COMMAND,\t/* Need to send to this GO when doing Client Discovery */\n\t\tP2PSTATE_INVITE_COMMAND,\t/* Wait to send Invite Req. */\n\t\tP2PSTATE_CONNECT_COMMAND,\t/* wait to send Go Nego Req. */\n\t\tP2PSTATE_PROVISION_COMMAND, /* Provision first, then connect. */\n\t\tP2PSTATE_SERVICE_DISCOVER_INIT_COMMAND, /* Do Service Discovery. */\n\t\tP2PSTATE_SERVICE_COMEBACK_COMMAND, /* Do Service Discovery. */\n\t\tP2PSTATE_SENT_INVITE_REQ,\n\t\tP2PSTATE_SENT_PROVISION_REQ,\n\t\tP2PSTATE_SENT_PROVISION_RSP,\n\t\tP2PSTATE_WAIT_REVOKEINVITE_RSP_ACK, /* 15 */\n\t\tP2PSTATE_REVOKEINVITE_RSP_ACK_SUCCESS,\t\t\n\t\tP2PSTATE_SENT_GO_NEG_REQ,\t\t\n\t\tP2PSTATE_GOT_GO_RSP_INFO_UNAVAI,\t/* got GO Nego Rsp with Status : information unavailable. Still need 120 sec more to time out. */\n\t\tP2PSTATE_WAIT_GO_COMFIRM,\t\t\n\t\tP2PSTATE_WAIT_GO_COMFIRM_ACK,\t\t\n\t\tP2PSTATE_GOT_GO_COMFIRM,\t\t\n\t\tP2PSTATE_GO_COMFIRM_ACK_SUCCESS,\t\t\n\t\tP2PSTATE_REINVOKEINVITE_TILLCONFIGTIME, \t\n\t\tP2PSTATE_GO_DONE,\t\t\n\t\tP2PSTATE_GO_WPS,\t/* Internal registra */\n\t\tP2PSTATE_GO_AUTH,\n\t\tP2PSTATE_GO_ASSOC,\t\t/*30 */\n\t\tP2PSTATE_CLIENT_WPS,\t\t/* Enrollee */\n\t\tP2PSTATE_CLIENT_WPS_DONE,\t\t/* Enrollee */\n\t\tP2PSTATE_CLIENT_AUTH,\n\t\tP2PSTATE_CLIENT_ASSOC,\n\t\tP2PSTATE_CLIENT_OPERATING,\t /* 35 */\n\t\tP2PSTATE_CLIENT_ABSENCE,\t\t\n\t\tP2PSTATE_CLIENT_SCAN,\t\t/* Already in P2P group, but go to scan phase. */\n\t\tP2PSTATE_CLIENT_FIND,\t\t/* Already in P2P group, but go to find phase. */\n\t\tP2PSTATE_GO_OPERATING,\t\t\n\t\tP2PSTATE_GO_ABSENCE,\t\t/*During absence period. */\n\t\tP2PSTATE_GO_SCAN,\t\t/* Already in P2P group, but go to scan phase. */\n\t\tP2PSTATE_GO_FIND,\t\t/* Already in P2P group, but go to find phase. */\n\t\t/* Go can support legacy station not use WiFi Direct Spec to connect to. Assign following 2 states to such client. */\n\t\tP2PSTATE_NONP2P_PSK,\t\t/* legacy client that uses WPA2PSK-AES to connect to GO(me). */\n\t\tP2PSTATE_NONP2P_WPS,\t\t/* Legacy client that uses WPS to connect to GO(me). */\n\t\tP2PSTATE_MAX_STATE,\n}\tP2P_CLIENT_STATE;\n\ntypedef VOID (*p2p_cmd_handler) (VOID *pAD, VOID *pElem);\ntypedef struct _P2P_CMD_STRUCT\n{\n\tUCHAR\tAddr[MAC_ADDR_LEN];\n\tUCHAR\tIdx;\n\t/*USHORT\tConfigMethod; */\n\n} P2P_CMD_STRUCT, *PP2P_CMD_STRUCT;\n\n/* Describe the current discovery state and provistioning state if WifI direct is enabled. */\ntypedef\tenum\t_P2pDiscoProvState\n{\n\tP2P_DISABLE,\n\tP2P_ENABLE_LISTEN_ONLY,\t/* In this state, only reponse to P2P Probe req. that has P2P IE. enable listen mode. */\n/*\tP2P_IDLE, */\n/*\tP2P_SEARCH_COMMAND, */\t/* 5\t */\n\tP2P_SCAN,\n\tP2P_SEARCH,\t\t/* 6 */\n/*\tP2P_SEARCH_COMPLETE, */\n/*\tP2P_LISTEN_COMMAND, */\t\n\tP2P_LISTEN,\t\t/* 9 */\n/*\tP2P_LISTEN_COMPLETE, */\t\n/*\tP2PGO_SEARCH, */\t/* I am alreayd an GO, But go to other listen channel perform search  */\n/*\tP2PGO_SEARCH_COMMAND, */\t/*  go to other listen channel perform search  */\n\tP2P_MAX_DISC_STATE,\n}\tP2P_DISCOPROV_STATE;\n\n/* Describe the current state when performing P2P Operation. */\ntypedef\tenum\t_P2pConnectState\n{\n\tP2P_CONNECT_NOUSE,\n\tP2P_CONNECT_IDLE = 13,\t/* Set to bigger number, so don't overlap with P2P_DISCOPROV_STATE */\n\tP2P_INVITE,\n\tP2P_ANY_IN_FORMATION_AS_GO,\t/* 15 */\n\tP2P_ANY_IN_FORMATION_AS_CLIENT,\t\t\n\tP2P_DO_GO_NEG_DONE_CLIENT,\t\t/* 17 */\n\tP2P_DO_GO_SCAN_OP_BEGIN,\t\t/* 18 */\n\tP2P_DO_GO_SCAN_OP_DONE,\t\t/* 19 */\n\tP2P_DO_GO_SCAN_BEGIN,\t\t \n\tP2P_DO_GO_SCAN_DONE,\t\t \n\tP2P_WPS_REGISTRA,\t\t/* 22 */\n\tP2P_DO_WPS_ENROLLEE,\t\t\n/*\tP2P_DO_WPS_ENROLLEE_DONE, */\n/*\tP2P_GO_ASSOC_AUTH,\t */\n/*\tP2P_I_AM_CLIENT_ASSOC_AUTH,\t */\n/*\tP2P_I_AM_CLIENT_OP, */\t\t/* 27 I am operating as client */\n/*\tP2P_I_AM_GO_OP,\t*/\t\t/* 28 I am operatin as Go. */\n/*\tP2PGO_DO_WPS_REGISTRA, */\t\t/* 29 */\n/*\tP2PGO_I_AM_GO_ASSOC_AUTH, */\t\t\n}\tP2P_CONNECT_STATE;\n\n\n\n#define CONFIG_MODE_DISABLE_P2P_WPSE\t\t\t\t0 /* Uncheck \"enable WFD feature\" #define CONFIG_MODE_DISABLE_WIFI_DIRECT_WPSE     0 */\n#define CONFIG_MODE_ENABLE_P2P\t\t\t\t\t1    /* set device name to driver when check \"enable WFD feature\" */\n#define CONFIG_MODE_P2P_SCAN\t\t\t\t\t\t2    /* set device name to driver when press \"Scan\" */\n#define CONFIG_MODE_CONNECT_P2P\t\t\t\t\t3  /* set all config (RTMP_WIFI_DIRECT_CONFIG) to driver #define CONFIG_MODE_ACTIVATE_WIFI_DIRECT           1 */\n#define CONFIG_MODE_ACTIVATE_WPSE\t\t\t\t4    /* #define CONFIG_MODE_ACTIVATE_WPSE                 2 */\n#define CONFIG_MODE_DELETE_ACTIVE_P2P\t\t\t5    /* set to actived config (RTMP_WIFI_DIRECT_CONFIG) to driver (driver will send disconnect event and clean persistent table ) #define CONFIG_MODE_DELETE_ACTIVED_WIFI_DIRECT    3 */\n#define CONFIG_MODE_DISCONNECT_P2P\t\t\t\t6    /* do nothing in UI when press \"Disconnect\" #define CONFIG_MODE_DISCONNECT_WIFI_DIRECT         4 */\n#define CONFIG_MODE_DELETE_PERST_P2P\t\t\t\t7    /* set inactive but persistent config (RTMP_WIFI_DIRECT_CONFIG) to driver when delete perseistent profile from profile list #define CONFIG_MODE_DELETE_PERST_WIFI_DIRECT    5 */\n#define CONFIG_MODE_PROVISION_THIS\t\t\t\t8    /*   */\n#define CONFIG_MODE_SET_GO_WPS\t\t\t\t\t9    /*  When I am GO. Set WPS for indivial client. */\n#define CONFIG_MODE_SERVICE_DISCOVERY\t\t\t10    /*  Start SErvice Discovery */\n\n#define P2P_PHYMODE_LEGACY_ONLY\t\t\t\t0\n#define P2P_PHYMODE_ENABLE_11N_20\t\t\t1\n#define P2P_PHYMODE_ENABLE_11N_40\t\t\t2\n\n#define P2P_GROUP_MODE_TEMP\t\t\t\t\t1\n#define P2P_GROUP_MODE_PERSISTENT\t\t\t\t2\n\n#define    P2P_WPSE_PIN_METHOD\t\t\t\t\t0x10000000\n#define    P2P_WPSE_PBC_METHOD\t\t\t\t\t0x20000000\n#define    P2P_WPSE_SMPBC_METHOD\t\t\t\t0x30000000\n\n#define RALINKOUIMODE_IPREQ\t\t\t\t\t0x30\n#define RALINKOUIMODE_IPRSP\t\t\t\t\t0x31\n#define RALINKOUIMODE_MBRIPRSP\t\t\t\t0x32\t/* Group Member ip notify */\n\n/*define P2P_REG_CM_LABEL\t\t\t\t\t\t1 */\t/* Default I broadcast my config method is label. (DefaultConfigMethod:2) */\n#define P2P_REG_CM_DISPLAY\t\t\t\t\t\t1\t/* Default I broadcast my config method is display. */\n#define P2P_REG_CM_KEYPAD\t\t\t\t\t\t2\t/* Default I broadcast my config method is keypad. */\n#define P2P_REG_CM_PBC\t\t\t\t\t\t\t3\t/* Default I broadcast my config method is pbc. (DefaultConfigMethod:2) */\n\n/* WSC connection mode */\n/*define\tWSC_PIN_MODE\t\t0x10000000 */\t/* Default PIN */\n/*define\tWSC_PBC_MODE\t\t0x20000000 */\n#define\tWSC_PIN_MODE_USER_SPEC\t\t\t0x40000000\n#define\tWSC_PIN_MODE_REGISTRA_SPEC\t\t0x80000000\n\n#define P2P_CONTROL_REG_ENABLE\t\t\t\t0x00000001\n#define P2P_CONTROL_REG_MANAGED\t\t\t\t0x00000002\n#define P2P_CONTROL_REG_PERSISTENT\t\t\t0x00000004\n#define P2P_CONTROL_REG_INVITE\t\t\t\t0x00000008\n#define P2P_CONTROL_REG_INTENT\t\t\t\t0x000000F0\n#define P2P_CONTROL_REG_LISTEN_CHANNEL\t\t0x00000F00\n#define P2P_CONTROL_REG_CONFIG_MHD\t\t\t0x00007000\n#define P2P_CONTROL_REG_INTRA_BSS\t\t\t0x00008000\n#define P2P_CONTROL_REG_OP_CHANNEL\t\t\t0x000F0000\n#define P2P_CONTROL_REG_CLI_DISCOVERY\t\t0x00100000\n#define P2P_CONTROL_REG_EXT_LISTEN\t\t\t0x00200000\n#define P2P_CONTROL_REG_SERVICE_DISCOVERY\t0x00400000\n#define P2P_CONTROL_REG_OPPS\t\t\t\t0x00800000\n#define P2P_CONTROL_REG_GROUP_LIMIT\t\t\t0x01000000\n#define P2P_CONTROL_REG_DISABLE_CRS_CONN\t0x02000000\n#define P2P_CONTROL_REG_SW_NOA\t\t\t\t0x80000000\n\n/* key information */\ntypedef\tunion\t \t{\n\tstruct\t{\n\t\t/* 1 */\n\t\tULONG\t\tEnable:1;\t\t\t/* Enable WiFi Direct. */\n\t\tULONG\t\tManaged:1;\t\t\t/* Support Managed AP */\n\t\tULONG\t\tEnablePresistent:1;\t\t\t/* Enable persistent */\n\t\tULONG\t\tEnableInvite:1;\t\t\t/* For invitation Test Case. */\n\t\t/* 2 */\n\t\tULONG\t\tDefaultIntentIndex:4;\t\t\t/* the default intent index GUI used when first editing a profile. */\n\t\t/* 3 */\n\t\tULONG\t\tListenChannel:4;\t\t\t/* Listen Channel */\n\t\t/* 4 */\n\t\tULONG\t\tDefaultConfigMethod:3;\t\t\t/* Default Config Method that is set in Probe Rsp when P2P On. */\n\t\tULONG\t\tEnableIntraBss:1;\t\t\t/*  1: Enable Intra BSS function when I am GO */\n\t\t/* 5 */\n\t\tULONG\t\tOpChannel:4;\t\t\t/* default use 2.4GHz channel */\n\t\t/* 6 */\n\t\tULONG\t\tClientDiscovery:1;\t\t\t/* Client Discoverbility */\n\t\tULONG\t\tExtendListen:1;\t\t\t/* Extended Listening */\n\t\tULONG\t\tServiceDiscovery:1;\t\t\t/* Service Discovery */\n\t\tULONG\t\tOpPSAlwaysOn:1;\t\t\t/* Service Discovery */\n\t\t/* 7 */\n\t\tULONG\t\tP2PGroupLimit:1;\t\t\t/* When Limit == 1. GO only support ONE device in my group.. */\n\t\tULONG\t\tForceDisableCrossConnect:1;\n\t\tULONG\t\tRsvd:5;\t\t\t/* Not Used */\n\t\tULONG\t\tSwBasedNoA:1;\t\t\t/* Software Based NoA implementation */\n\t}\tfield;\n\tUINT32\t\t\tword;\n}\tP2P_CONTROL, *PP2P_CONTROL;\n\n\n/*\n  *  The miniport PORT structure\n  */\ntypedef struct _PORT_COMMON_CONFIG\n{\n\tULONG   OpStatusFlags;\n\tULONG   OperationMode; /* DOT11_OPERATION_MODE_EXTENSIBLE_STATION or DOT11_OPERATION_MODE_NETWORK_MONITOR */\n\tUCHAR\tBssid[MAC_ADDR_LEN];\n\tCHAR\tSsid[MAX_LEN_OF_SSID]; /* NOT NULL-terminated */\n\tUCHAR\tSsidLen;               /* the actual ssid length in used */\n\tUCHAR\tLastSsidLen;               /* the actual ssid length in used */\n\tCHAR\tLastSsid[MAX_LEN_OF_SSID]; /* NOT NULL-terminated */\n\tUCHAR\tLastBssid[MAC_ADDR_LEN];\t\n\t/*UCHAR\tChannel; */\n\t/*UCHAR\tCentralChannel; */    \t/* Central Channel when using 40MHz is indicating. not real channel. */\n\t\n\tULONG\tAuthMode;       /* This should match to whatever microsoft defined, use ULONG Intead of DOT11_AUTH_ALGORITHM. \t */\n\tULONG\tWepStatus;\t\t/*use ULONG intead of DOT11_CIPHER_ALGORITHM,  */\n\tUCHAR\tDefaultKeyId;\n\t\n\tULONG\tOrigWepStatus;\t/* Original wep status set from OID */\n\t\t/* Add to support different cipher suite for WPA2/WPA mode */\n\tULONG\tGroupCipher;\t\t/* Multicast cipher suite */\n\tULONG\tPairCipher;\t\t\t/* Unicast cipher suite */\n\tUCHAR\t\tCipherAlg;\n\tNDIS_802_11_WEP_STATUS\tGroupKeyWepStatus;\n/*\tRT_802_11_CIPHER_SUITE_TYPE\t\t\tMixedModeGroupCipher; */ /* for WPA+WEP mixed mode, and CCKM WEP */\n\tBOOLEAN\t\t\t\t\t\t\t\tbMixCipher;\t\t\t/* Indicate current Pair & Group use different cipher suites */\n\tUSHORT\t\t\t\t\t\t\t\tRsnCapability;\n\tULONG                   MulticastCipherAlgorithmCount;\n\tULONG       PacketFilter;       /* Packet filter for receiving */\n\n\tUINT                    MCAddressCount;\n/*\tUCHAR                   MCAddressList[HW_MAX_MCAST_LIST_SIZE][DOT11_ADDRESS_SIZE]; */\n\n\tBOOLEAN\t\t\t\t\tbHiddenNetworkEnabled;\n\tBOOLEAN\t\t\t\t\tExcludeUnencrypted;\n\t\n\tULONG                               OperatingPhyId;         /* ID of currently operating PHY */\n\tULONG                               SelectedPhyId;          /* index of PHY that any PHY specific OID is applied to */\n \tULONG                               DefaultPhyId;\n}PORT_COMMON_CONFIG,*PPORT_COMMON_CONFIG;\n\ntypedef struct _P2P_COUNTER_STRUCT \n{\n\tULONG\t\tManageAPEnReconCounter;\t/* right after shutdown,  */\n\tULONG\t\tClientConnectedCounter;\t/* If I am P2P Client and is connected,  */\n\tULONG\t\tDisableRetryGrpFormCounter;\t/* If Group Nego is rejected because both intent is 15. can't retry in a short time.  */\n\tULONG\t\tCounter100ms;\t/* plus 1 every 100ms  */\n\tULONG\t\tGoScanBeginCounter100ms;\n\tULONG\t\tWpa2pskCounter100ms;\n\tULONG\t\tNextScanRound;\t/* Unit : 100 TU */\n\tUCHAR\t\tListenInterval;\t/* Unit : 100 TU */\n\tUCHAR\t\tListenIntervalBias;\t/* for some important action that need more dwell time in scan channel, add this Bias. Unit : 100 TU */\n\tULONG\t\tCounterAftrScanButton;\t\t/* Unit 100ms. Counter for After Pressing \"Apply\" Profile button. */\n\tULONG\t\tCounterAftrSetEvent;\t\t/* Unit 100ms. Counter for Driver called KeSetEvent. */\n\tBOOLEAN\t\tbListen;\n\tBOOLEAN\t\tbStartScan;\n\tBOOLEAN\t\tbNextScan;\n\tULONG\t\tUserAccept;\n} P2P_COUNTER_STRUCT, *PP2P_COUNTER_STRUCT;\n\ntypedef struct _P2P_RALINK_STRUCT \n{\n\tUCHAR\t\tListenChanel[3];\t \n\tUCHAR\t\tListenChanelIndex;\n\tUCHAR\t\tListenChanelCount;\n} P2P_RALINK_STRUCT, *PP2P_RALINK_STRUCT;\n\n/* often need to change beacon content. So save the offset. */\ntypedef struct _P2P_BEACONOFFSET_STRUCT \n{\n\tULONG\t\t\t\tIpBitmapBcnOffset;\t\t/*  USed as GO */\n\tULONG\t\t\t\tP2pCapOffset;\n} P2P_BEACONOFFSET_STRUCT, *PP2P_BEACONOFFSET_STRUCT;\n\ntypedef\tstruct\t_P2P_SAVED_PUBLIC_FRAME\t{\n\tHEADER_802_11   p80211Header;\n\tUCHAR          Category;\n\tUCHAR           Action;\n\tUCHAR           OUI[3];\n\tUCHAR\t\tOUIType;\n\tUCHAR\t\tSubtype;\n\tUCHAR\t\tToken;\n}\tP2P_SAVED_PUBLIC_FRAME, *PP2P_SAVED_PUBLIC_FRAME;\n\ntypedef struct _P2P_MANAGED_STRUCT \n{\n\tUCHAR\t\t\tManageAPBSsid[MAC_ADDR_LEN];\t/* Store the AP's BSSID that is the managed AP and is the latest one that I recently connected to.. */\n\tUCHAR\t\t\tManageAPSsid[32];\t/* Store the AP's BSSID that is the managed AP and is the latest one that I recently connected to.. */\n\tUCHAR\t\t\tManageAPSsidLen;\t/* Store the AP's BSSID that is the managed AP and is the latest one that I recently connected to.. */\n\tUCHAR\t\t\tAPP2pManageability;\t/* Store the AP's P2P Manageability byte that currently I want to associate. */\n\tUCHAR\t\t\tAPP2pMinorReason;\t/* Store the AP's minorreason byte that recently being deauthed */\n\tUCHAR\t\t\tICSStatus;\t/*  */\n\tUCHAR\t\t\tAPUsageChannel;\t/* \tThe suggest channel from AP's IE=0x61 */\n\tUCHAR\t\t\tTotalNumOfP2pAttribute;\n} P2P_MANAGED_STRUCT, *PP2P_MANAGED_STRUCT;\n\ntypedef\tstruct\t_P2PCLIENT_NOA_SCHEDULE\t{\n\tBOOLEAN\t\tbValid;\n\tBOOLEAN\t\tbInAwake;\n\tBOOLEAN\t\tbNeedResumeNoA;\t/* Set to TRUE if need to restart infinite NoA */\n\tBOOLEAN\t\tbWMMPSInAbsent;\t/* Set to TRUE if enter GO absent period by supported UAPSD GO */\n\tUCHAR\t\tToken;\n\tULONG\t\tSwTimerTickCounter; /* this Counter os used for sw-base NoA implementation tick counter */\n\tULONG\t\tCurrentTargetTimePoint; /* For sw-base method NoA usage */\n\tULONG           NextTargetTimePoint;\n\tULONG           NextTimePointForWMMPSCounting;\t/* fro counting WMM PS EOSP bit. Not used for NoA implementation. */\n\tUCHAR          Count;\n\tULONG           Duration;\n\tULONG           Interval;\n\tULONG           StartTime;\n\tULONG\t\tOngoingAwakeTime; /* this time will keep increasing as time go by. indecate the current awake time point */\n\tULONG           TsfHighByte;\n\tULONG           ThreToWrapAround;\n\tULONG\t\t\tLastBeaconTimeStamp;\n}\tP2PCLIENT_NOA_SCHEDULE, *PP2PCLIENT_NOA_SCHEDULE;\n\ntypedef struct {\n\tUCHAR\t\tLength;\n\tUCHAR\t\tDevAddr[MAC_ADDR_LEN];\n\tUCHAR            InterfaceAddr[MAC_ADDR_LEN];\n\tUCHAR            Capability;\n\tUCHAR            ConfigMethod[2];\n\tUCHAR            PrimaryDevType[P2P_DEVICE_TYPE_LEN];\n\tUCHAR\t\tNumSecondaryType;\n\tUCHAR\t\tOctet[1];\n} P2P_CLIENT_INFO_DESC, *PP2P_CLIENT_INFO_DESC;\n\n/* Save for \"Persistent\" P2P table. Temporary P2P doesn't need to save in the table. */\ntypedef struct _RT_P2P_PERSISTENT_ENTRY\n{\n\tBOOLEAN\t\tbValid;\n\tUCHAR\t\tMyRule;\t\t/* My rule is GO or Client  */\n\tUCHAR\t\tAddr[MAC_ADDR_LEN];\t\t/* this addr is to distinguish this persistent entry is for which mac addr   */\n\tWSC_CREDENTIAL\tProfile;\t\t\t\t/*  profile's bssid is always the GO's bssid. */\n} RT_P2P_PERSISTENT_ENTRY, *PRT_P2P_PERSISTENT_ENTRY;\n\ntypedef struct _P2P_ETHER_ADDR\n{\n\tUCHAR octet[MAC_ADDR_LEN];\n} P2P_ETHER_ADDR, *PP2P_ETHER_ADDR;\n\ntypedef struct _P2P_PEER_SSID\n{\n\tUCHAR ssid[32+1];\n} P2P_PEER_SSID, *PP2P_PEER_SSID;\n\ntypedef struct _P2P_PEER_DEV_TYPE\n{\n#ifdef HE_BD_SUPPORT\t\n\tUCHAR dev_type[8];\n#else\n\tUCHAR dev_type;\n#endif /* HE_BD_SUPPORT */\n} P2P_PEER_DEV_TYPE, *PP2P_PEER_DEV_TYPE;\n\ntypedef struct _P2P_STA_ASSOC_LIST\n{\n\tP2P_ETHER_ADDR\tmaclist[3];\n\tUINT\t\t\tmaclist_count;\n\tP2P_PEER_SSID\tdevice_name[3];\n\tP2P_PEER_DEV_TYPE\tdevice_type[3];\n\tBOOLEAN\t\t\tis_p2p[3];\n#ifdef HE_BD_SUPPORT\n\tCHAR                                    rssi[3];\n#ifdef WFD_SUPPORT\n\tBOOLEAN\t\t\t\t\tis_wfd[3];\n\tUSHORT\t\t\t\t\trtsp_port[3];\n#endif /* CONFIG_WFD */\n#endif /* HE_BD_SUPPORT */\n} P2P_STA_ASSOC_LIST, *PP2P_STA_ASSOC_LIST;\n\n/* Store for persistent P2P group */\ntypedef struct _RT_P2P_CONFIG \n{\n/*\tPNET_DEV\t\t\t\t\tdev; */\n#ifdef CONFIG_MULTI_CHANNEL\n\tUCHAR\t\t\t\t\t\tBW;\n\tBOOLEAN\t\t\t\t\t\tbStartP2pConnect;\n\tUCHAR\t\t\t\t\t\tTmpLongRtyLimit;\n\tUCHAR\t\t\t\t\t\tTmpShortRtyLimit;\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\tUCHAR\t\t\t\t\t\tP2p_OpMode;\n\tUCHAR\t\t\t\t\t\tCurrentAddress[ETH_LENGTH_OF_ADDRESS];\n\tP2P_CTRL_STATE\t\t\t\tCtrlCurrentState;\n\tSTATE_MACHINE\t\t\t\tP2PCtrlMachine;\n\tSTATE_MACHINE_FUNC\t\t\tP2PCtrlFunc[P2P_CTRL_FUNC_SIZE];\n\tP2P_DISC_STATE\t\t\t\tDiscCurrentState;\n\tSTATE_MACHINE\t\t\t\tP2PDiscMachine;\n\tSTATE_MACHINE_FUNC\t\t\tP2PDiscFunc[P2P_DISC_FUNC_SIZE];\n\tP2P_GO_FORM_STATE\t\t\tGoFormCurrentState;\n\tSTATE_MACHINE\t\t\t\tP2PGoFormMachine;\n\tSTATE_MACHINE_FUNC\t\t\tP2PGoFormFunc[P2P_GO_FORM_FUNC_SIZE];\n\tP2P_ACTION_STATE\t\t\tActionState;\n\tSTATE_MACHINE\t\t\t\tP2PActionMachine;\n\tSTATE_MACHINE_FUNC\t\t\tP2PActionFunc[P2P_ACTION_FUNC_SIZE];\n\tUCHAR\t\t\t\t\t\tRule;\t\t/* Device / Client / GO. */\n\t\n\n/*\tP2P_DISCOPROV_STATE\t\tP2PDiscoProvState; */\t\t/* P2P State for P2P discovery(listen, scan, search) and P2P provistioning (Service provision, wps provision) */\n\tP2P_CONNECT_STATE\t\t\tP2PConnectState;\t\t/* P2P State for P2P connection. */\n/*\tP2P_EVENTQUEUE_STRUCT\tP2pEventQueue; */\n\tP2P_COUNTER_STRUCT\t\t\tP2pCounter;\n\tP2P_RALINK_STRUCT\t\t\tP2pProprietary;\t/* Ralink Proprietary to improve usage. */\n\tP2P_BEACONOFFSET_STRUCT\tP2pBcnOffset;\n\tP2P_SAVED_PUBLIC_FRAME\t\tLatestP2pPublicFrame;\t/* Latest received P2P Public frame */\n\tP2P_MANAGED_STRUCT\t\t\tP2pManagedParm;\n\n\tBOOLEAN\t\t\t\t\t\tbFirstTimeCancelOpps;\n\tBOOLEAN\t\t\t\t\t\tbPreKeepSlient;\n\tBOOLEAN\t\t\t\t\t\tbKeepSlient;\n\tUCHAR\t\t\t\t\t\tMyGOwcid;\n\tUCHAR\t\t\t\t\t\tLastSentInviteFlag;\n\tUCHAR\t\t\t\t\t\tP2pCapability[2];\n\tULONG\t\t\t\t\t\tMyIp;\n\tWSC_DEV_INFO\t\t\t\tDevInfo;\n\tUCHAR\t\t\t\t\t\tWsc_Uuid_E[UUID_LEN_STR];\n\tUCHAR\t\t\t\t\t\tWsc_Uuid_Str[UUID_LEN_STR];\n\tULONG\t\t\t\t\t\tWscMode;\t\t/* predefined WSC mode, 1: PIN, 2: PBC */\n\tBOOLEAN\t\t\t\t\t\tbConfiguredAP;\t /* true (1:un-configured), false(2: configured) ; used by GO */\n\tUSHORT\t\t\t\t\t\tDpid;\t/* WPS device password ID. */\n\tUSHORT\t\t\t\t\t\tConfigMethod;\t/* WPS device password ID. */\n\tUCHAR\t\t\t\t\t\tPinCode[9];\n\tUCHAR\t\t\t\t\t\tConfigTimeout[2];\n\tUCHAR\t\t\t\t\t\tAssocPriDeviceType[8];\n\tUCHAR\t\t\t\t\t\tPhraseKey[64];\n\tUCHAR\t\t\t\t\t\tPhraseKeyLen;\n\tP2P_STA_ASSOC_LIST \t\t\t\tAssocList;\n\tUCHAR\t\t\t\t\t\tP2pPhyMode;\n\tUCHAR\t\t\t\t\t\tNoAIndex;\n\tUCHAR\t\t\t\t\t\tPopUpIndex;\t/* store the p2p entry index when receiving Go Nego Req and need a GUI to pop up a window to set connection. */\n\tUCHAR\t\t\t\t\t\tConnectingIndex;\t/* Point to the ?rd Connecting MAC that I will try to connect with. */\n\tUCHAR\t\t\t\t\t\tConnectingMAC[MAC_ADDR_LEN];  /* Specify MAC address want to connect. Set to all 0xff or all 0x0 if not specified. */\n\tUCHAR\t\t\t\t\t\tConnectingDeviceName[MAX_P2P_GROUP_SIZE][32];  /* Specify the Device Name that want to connect. Set to all 0xff or all 0x0 if not specified. */\n\tUCHAR\t\t\t\t\t\tSSID[32];\n\tUCHAR\t\t\t\t\t\tSSIDLen;\n\tUCHAR\t\t\t\t\t\tToken;\n\tUCHAR\t\t\t\t\t\tBssid[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\t\tManufacturer[64];\n\tUCHAR\t\t\t\t\t\tManufacturerLen;\n\tUCHAR\t\t\t\t\t\tModelName[32];\n\tUCHAR\t\t\t\t\t\tModelNameLen;\n\tUCHAR\t\t\t\t\t\tModelNumber[32];\n\tUCHAR\t\t\t\t\t\tModelNumberLen;\n\tUCHAR\t\t\t\t\t\tSerialNumber[32];\n\tUCHAR\t\t\t\t\t\tSerialNumberLen;\n\tUCHAR\t\t\t\t\t\tDeviceName[32];\n\tULONG\t\t\t\t\t\tDeviceNameLen;\n\tUCHAR\t\t\t\t\t\tListenChannel;\t /* The channel that perform the group formatuib oricedure. */\n\tUCHAR\t\t\t\t\t\tGroupChannel;\t /* Group setting channel from GUI. Real OP channel need to be negociated.. */\n\tUCHAR\t\t\t\t\t\tGroupOpChannel;\t /* Group operating channel. */\n\tUCHAR\t\t\t\t\t\tGoIntentIdx;\t/* Value = 0~15. Intent to be a GO in P2P */\n\tBOOLEAN\t\t\t\t\t\tbIntraBss;\n\tBOOLEAN\t\t\t\t\t\tbExtListen;\n\tUSHORT\t\t\t\t\t\tExtListenPeriod;\t/* Period for extended listening */\n\tUSHORT\t\t\t\t\t\tExtListenInterval;\t/* Interval for extended listening */\n\tUCHAR\t\t\t\t\t\tCTWindows;\t/* CTWindows and OppPS parameter field */\n\tULONG\t\t\t\t\t\tGOBeaconBufWscLen;\n\tUCHAR\t\t\t\t\t\tLastConfigMode;\t/* Disable, activate p2p, or activate WPSE, or delete p2p profile. */\n\n\tP2PCLIENT_NOA_SCHEDULE\t\t\t\t\tGONoASchedule;\n\tRALINK_TIMER_STRUCT\t\t\t\t\t\tP2pCTWindowTimer;\n\tRALINK_TIMER_STRUCT\t\t\t\t\t\tP2pSwNoATimer;\n\tRALINK_TIMER_STRUCT\t\t\t\t\t\tP2pPreAbsenTimer; \n\tRALINK_TIMER_STRUCT\t\t\t\t\t\tP2pWscTimer; \n\tRALINK_TIMER_STRUCT\t\t\t\t\t\tP2pReSendTimer;\n\tBOOLEAN\t\t\t\t\t\t\t\t\tbP2pReSendTimerRunning;\n\tRALINK_TIMER_STRUCT\t\t\t\t\t\tP2pCliReConnectTimer;\n\tBOOLEAN\t\t\t\t\t\t\t\t\tbP2pCliReConnectTimerRunning;\n\n\tPORT_COMMON_CONFIG\t\t\t\t\tPortCfg;\n\tUCHAR\t\t\t\t\t\t\t\t\tDefaultConfigMethod;\n\tP2P_CONTROL \t\t\t\tP2pControl;\n\tINT\t\t\t\t\t\t\tWscState;\n\tBOOLEAN\t\t\t\t\tbSigmaEnabled;\n\tBOOLEAN\t\t\t\t\tbP2pCliPmEnable;\n\tBOOLEAN\t\t\t\t\tbLowRateQoSNULL;\n\tBOOLEAN\t\t\t\t\tbP2pCliReConnect;\n\tBOOLEAN\t\t\t\t\tbStopAuthRsp;\n\tULONG\t\t\t\t\tDevDiscPeriod;\t\t/* Unit 100ms */\n\tBOOLEAN\t\t\t\t\tbPeriodicListen;\n\tBOOLEAN\t\t\t\t\tbConfirmByUI;\n\tINT\t\t\t\t\tp2pMaxEntry;\n\tBOOLEAN\t\t\t\t\t\tbProvAutoRsp;\n\tUCHAR\t\t\t\t\t\tP2pProvIndex;\n\tUSHORT\t\t\t\t\t\tP2pProvConfigMethod;\n\tUCHAR \t\t\t\t\t\tP2pProvToken;\n\tBOOLEAN\t\t\t\t\t\tP2pProvUserNotify;\n\tPUCHAR\t\t\t\t\t\tpGoNegoRspOutBuffer;\n\tBOOLEAN\t\t\t\t\tbSentProbeRSP;\n\tUCHAR\t\t\t\t\tp2pidxForServiceCbReq;\n\tUCHAR\t\t\t\t\tServiceTransac;\n\n} RT_P2P_CONFIG, *PRT_P2P_CONFIG;\n\ntypedef struct _RT_P2P_CLIENT_ENTRY\n{\n\tP2P_CLIENT_STATE\t\tP2pClientState;\t/* From the state, can know peer it registra or enrollee. */\n\tUCHAR\t\t\t\t\tMyGOIndex;\t/* If this device is a client in a P2P group, then this is its GO's table index. */\n\tULONG\t\t\t\t\tPeerip;\n\tCHAR\t\t\t\t\tDbm;\n\tUCHAR\t\t\t\t\tP2pFlag;\n\tUCHAR\t\t\t\t\tNoAToken;\n\tUCHAR\t\t\t\t\tGeneralToken;\n\tUCHAR\t\t\t\t\tStateCount;\n\tUCHAR\t\t\t\t\tRule;\n\tUCHAR\t\t\t\t\tDevCapability;\t/* table 10 */\n\tUCHAR\t\t\t\t\tGroupCapability;\n\tUSHORT\t\t\t\t\tConfigMethod;\n\tUCHAR\t\t\t\t\tPIN[8];\n\tUSHORT\t\t\t\t\tDpid;\n\tUCHAR\t\t\t\t\tSsid[MAX_LEN_OF_SSID];\n\tUCHAR\t\t\t\t\tSsidLen;\n\tUCHAR\t\t\t\t\tGoIntent;\n\tUCHAR\t\t\t\t\taddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\tInterfaceAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\tbssid[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\tPrimaryDevType[P2P_DEVICE_TYPE_LEN];\n\tUCHAR\t\t\t\t\tNumSecondaryType;\n\tUCHAR\t\t\t\t\tSecondaryDevType[P2P_DEVICE_TYPE_LEN];\n\tUCHAR\t\t\t\t\tRegClass;\n\tUCHAR\t\t\t\t\tChannelNr;\n\tUCHAR\t\t\t\t\tOpChannel;\n\tUCHAR\t\t\t\t\tDeviceName[P2P_DEVICE_NAME_LEN];\n\tULONG\t\t\t\t\tDeviceNameLen;\n\tUCHAR\t\t\t\t\tConfigTimeOut;\n\tUCHAR\t\t\t\t\tListenChannel;\n\tULONG\t\t\t\t\tWscMode;\n\tUSHORT\t\t\t\t\tExtListenPeriod;\t/* Period for extended listening */\n\tUSHORT\t\t\t\t\tExtListenInterval;\t/* Interval for extended listening */\n\tUCHAR\t\t\t\t\tCTWindow;\t/* As GO, Store client's Presence request NoA.  As Client, Store GO's NoA In beacon or P2P Action frame */\n\tBOOLEAN\t\t\t\t\tbValid;\n\tP2PCLIENT_NOA_SCHEDULE\tNoADesc[1];\t/* As GO, Store client's Presence request NoA.  As Client, Store GO's NoA In beacon or P2P Action frame */\n\tCHAR\t\t\t\t\tRssi;\n\tULONG\t\t\t\t\tReTransmitCnt;\n\tUCHAR\t\t\t\t\tDialogToken;\n#ifdef WFD_SUPPORT\n\tWFD_ENTRY_INFO\t\t\tWfdEntryInfo;\n#endif /* WFD_SUPPORT */\n} RT_P2P_CLIENT_ENTRY, *PRT_P2P_CLIENT_ENTRY;\n\ntypedef struct _P2P_ENTRY_PARM\n{\n\tP2P_CLIENT_STATE\t\tP2pClientState;\t/* From the state, can know peer it registra or enrollee. */\n\tUCHAR\t\t\t\t\tP2pFlag;\n\tUCHAR\t\t\t\t\tNoAToken;\n\tUCHAR\t\t\t\t\tGeneralToken;\n\tUCHAR\t\t\t\t\tDevCapability;\t/* table 10 */\n\tUCHAR\t\t\t\t\tGroupCapability;\t/* \t */\n\tUCHAR\t\t\t\t\tDevAddr[MAC_ADDR_LEN];\t/* P2P Device Address */\n\tUCHAR\t\t\t\t\tInterfaceAddr[MAC_ADDR_LEN];\n\tUCHAR\t\t\t\t\tPrimaryDevType[P2P_DEVICE_TYPE_LEN];\n\tUCHAR\t\t\t\t\tNumSecondaryType;\n\tUCHAR\t\t\t\t\tSecondaryDevType[P2P_DEVICE_TYPE_LEN];\t/* This definition only support save one 2ndary DevType */\n\tUCHAR\t\t\t\t\tDeviceName[32];\n\tULONG\t\t\t\t\tDeviceNameLen;\n\tUSHORT\t\t\t\t\tConfigMethod;\n/*\tUSHORT\t\tExtListenPeriod; */\t/* Period for extended listening */\n/*\tUSHORT\t\tExtListenInterval; */\t/* Interval for extended listening */\n\tUCHAR\t\t\t\t\tCTWindow;\t/* As GO, Store client's Presence request NoA.  As Client, Store GO's NoA In beacon or P2P Action frame */\n\tP2PCLIENT_NOA_SCHEDULE\tNoADesc[1];\t/* As GO, Store client's Presence request NoA.  As Client, Store GO's NoA In beacon or P2P Action frame */\n\tUCHAR\t\t\t\t\tp2pIndex;\n}P2P_ENTRY_PARM, *PP2P_ENTRY_PARM;\n\n/* Save for \"Persistent\" P2P table. Temporary P2P doesn't need to save in the table. */\ntypedef struct _RT_GO_CREDENTIAL_ENTRY\n{\n\tBOOLEAN\t\tbValid;\n\tUCHAR\t\tInterAddr[MAC_ADDR_LEN];\t\t/* this addr is to distinguish this persistent entry is for which mac addr   */\n\tWSC_CREDENTIAL\tProfile;\t\t\t\t/*  profile's bssid is always the GO's bssid.  */\n} RT_GO_CREDENTIAL_ENTRY, *PRT_GO_CREDENTIAL_ENTRY;\n\n/* Store for persistent P2P group */\ntypedef struct _RT_P2P_TABLE \n{\n\tUCHAR\t\t\t\t\t\tPerstNumber;\t\t/* What persistent profile is set ? */\n\tUCHAR\t\t\t\t\t\tClientNumber;\t /* What clients are in my group now? */\n\tRT_P2P_PERSISTENT_ENTRY\t\tPerstEntry[MAX_P2P_TABLE_SIZE]; /* Save persistent profile for auto reconnect */\n\tRT_P2P_CLIENT_ENTRY\t\t\tClient[MAX_P2P_GROUP_SIZE];\t/* Store for current group member. */\n\tRT_GO_CREDENTIAL_ENTRY\t\tTempCredential[2/*MAX_P2P_SAVECREDN_SIZE*/];\n} RT_P2P_TABLE, *PRT_P2P_TABLE;\n\ntypedef struct _RT_P2P_UI_TABLE \n{\n\tUCHAR\t\t\t\t\t\tClientNumber;\t /* What clients are in my group now? */\n\tRT_P2P_CLIENT_ENTRY\t\t\tClient[MAX_P2P_GROUP_SIZE];\t/* Store for current group member. */\n} RT_P2P_UI_TABLE, *PRT_P2P_UI_TABLE;\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\ntypedef struct _RT_P2P_AP_STA_CONNECTED_REPORT\n{\n\tUCHAR addr[MAC_ADDR_LEN];\n\tUCHAR ClientFlag;\n\tUCHAR dev_addr[MAC_ADDR_LEN];\n} RT_P2P_AP_STA_CONNECTED_REPORT, *PRT_P2P_AP_STA_CONNECTED_REPORT;\n\ntypedef struct _RT_P2P_DEV_FOUND\n{\n\tUCHAR addr[MAC_ADDR_LEN];\n\tUCHAR dev_addr[MAC_ADDR_LEN];\n\tUCHAR pri_dev_type[P2P_DEVICE_TYPE_LEN];\n\tUCHAR dev_name[32];\n\tUSHORT config_methods;\n\tUSHORT dpid;\n\tUCHAR dev_capab;\n\tUCHAR group_capab;\n\tCHAR rssi;\n#ifdef WFD_SUPPORT\n\tUCHAR\tbWfdClient;\n\tUCHAR\twfd_devive_type;\n\tUCHAR\tsource_coupled;\n\tUCHAR\tsink_coupled;\n\tUCHAR\tsession_avail;\n\tUCHAR\twfd_service_discovery;\n\tUCHAR\twfd_PC;\n\tUCHAR\twfd_CP;\n\tUCHAR\twfd_time_sync;\n\tUSHORT\trtsp_port;\n\tUSHORT\tmax_throughput;\n\tUCHAR \tassoc_addr[MAC_ADDR_LEN];\n\tWFD_COUPLED_SINK_INFO\tcoupled_sink_status;\n\tUCHAR   \tcoupled_peer_addr[MAC_ADDR_LEN];\n#endif /* WFD_SUPPORT */\n} RT_P2P_DEV_FOUND, *PRT_P2P_DEV_FOUND;\n\ntypedef struct _RT_P2P_ALL_INFO\n{\n\tUCHAR addr[MAC_ADDR_LEN];\n\tUCHAR dev_addr[MAC_ADDR_LEN];\n\tUCHAR pri_dev_type[P2P_DEVICE_TYPE_LEN];\n\tUCHAR dev_name[32];\n\tUSHORT config_methods;\n\tUSHORT dpid;\n\tUCHAR dev_capab;\n\tUCHAR group_capab;\n\tCHAR rssi;\n\tUSHORT supp_config_methods;//provision req will need.\n\tUCHAR ClientFlag;//connected report will need.\n\tUSHORT dev_passwd_id;\n\t/* group stared info will need ----> */\n\tUCHAR Rule;\n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tUCHAR Ssid[32];\n\tUCHAR peer[MAC_ADDR_LEN];\n\tUCHAR WpaPsk[64];\n\tUCHAR P2PChannel;\n\t/* group stared info will need <---- */\n#if defined (WFD_SUPPORT) && defined (RT_P2P_SPECIFIC_WIRELESS_EVENT)\n\t/* for HE/DTV WFD event */\n\tUCHAR\tbWfdClient;\n\tUCHAR\twfd_devive_type;\n\tUCHAR\tsource_coupled;\n\tUCHAR\tsink_coupled;\n\tUCHAR\tsession_avail;\n\tUCHAR\twfd_service_discovery;\n\tUCHAR\twfd_PC;\n\tUCHAR\twfd_CP;\n\tUCHAR\twfd_time_sync;\n\tUSHORT\trtsp_port;\n\tUSHORT\tmax_throughput;\n\tUCHAR \tassoc_addr[MAC_ADDR_LEN];\n\tWFD_COUPLED_SINK_INFO\tcoupled_sink_status;\n\tUCHAR   \tcoupled_peer_addr[MAC_ADDR_LEN];\n#endif /* WFD_SUPPORT */\n} RT_P2P_ALL_INFO, *PRT_P2P_ALL_INFO;\n\ntypedef struct _RT_P2P_PROV_DISC_REQ\n{\n\tUCHAR peer[MAC_ADDR_LEN];\n\tUSHORT config_methods;\n\tUCHAR dev_addr[MAC_ADDR_LEN];\n\tUCHAR pri_dev_type[P2P_DEVICE_TYPE_LEN];\n\tUCHAR dev_name[32];\n\tUSHORT supp_config_methods;\n\tUCHAR dev_capab;\n\tUCHAR group_capab;\n} RT_P2P_PROV_DISC_REQ, *PRT_P2P_PROV_DISC_REQ;\n\ntypedef struct _RT_P2P_PROV_DISC_RESP\n{\n\tUCHAR peer[MAC_ADDR_LEN];\n\tUSHORT config_methods;\n} RT_P2P_PROV_DISC_RESP, *PRT_P2P_PROV_DISC_RESP;\n\ntypedef struct _RT_P2P_GO_NEG_REQ_RX\n{\n\tUCHAR src[MAC_ADDR_LEN];\n\tUSHORT dev_passwd_id;\n} RT_P2P_GO_NEG_REQ_RX, *PRT_P2P_GO_NEG_REQ_RX;\n\ntypedef struct _RT_P2P_GROUP_INFO\n{\n\tUCHAR Rule;\n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tUCHAR Ssid[32];\n\tUCHAR peer[MAC_ADDR_LEN];\n\tUCHAR WpaPsk[64];\n\tUCHAR P2PChannel;\n#ifdef WFD_SUPPORT\n\t/* for HE event */\n\tUSHORT rtsp_port;\n\tUCHAR device_type;\n#endif /* WFD_SUPPORT */\n} RT_P2P_GROUP_INFO, *PRT_P2P_GROUP_INFO;\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\n#endif /* __P2P_CMM_H__ */\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/include/p2p_inf.h",
    "content": " /*\n  ***************************************************************************\n  * Ralink Tech Inc.\n  * 4F, No. 2 Technology 5th Rd.\n  * Science-based Industrial Park\n  * Hsin-chu, Taiwan, R.O.C.\n  *\n  * (c) Copyright 2002-2005, Ralink Technology, Inc.\n  *\n  * All rights reserved. Ralink's source code is an unpublished work and the\n  * use of a copyright notice does not imply otherwise. This source code\n  * contains confidential trade secret material of Ralink Tech. Any attempt\n  * or participation in deciphering, decoding, reverse engineering or in any\n  * way altering the source code is stricitly prohibited, unless the prior\n  * written consent of Ralink Technology, Inc. is obtained.\n  ***************************************************************************\n \n\t Module Name:\n\t p2p_inf.h\n \n\t Abstract:\n \n\t Revision History:\n\t Who\t\t When\t\t\t What\n\t --------\t ---------- \t ----------------------------------------------\n \n */\n\n#ifndef __P2P_INF_H__\n#define __P2P_INF_H__\n\n#define\tP2P_DISABLE 0x0\n#define P2P_GO_UP\t0x1\n#define P2P_CLI_UP\t0x2\n/*#define P2P_GO_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_P2P_GO)) */\n/*#define P2P_CLI_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_P2P_CLI)) */\n\n\n\n#define P2P_GO_ON(_pAd) \\\n\t(((_pAd)->flg_p2p_init) \\\n\t\t&& ((_pAd)->flg_p2p_OpStatusFlags == P2P_GO_UP))\n\n\n#define P2P_CLI_ON(_pAd) \\\n\t(((_pAd)->flg_p2p_init) \\\n\t\t&& ((_pAd)->flg_p2p_OpStatusFlags == P2P_CLI_UP))\n\n /* P2P interface hook function definition */\n VOID RTMP_P2P_Init(\n\t\t IN PRTMP_ADAPTER ad_p,\n\t\t IN PNET_DEV main_dev_p);\n \n INT P2P_VirtualIF_Open(\n\t IN  PNET_DEV\t dev_p);\n \n INT P2P_VirtualIF_Close(\n\t IN  PNET_DEV\t dev_p);\n \n INT P2P_VirtualIF_PacketSend(\n\t IN PNDIS_PACKET\t skb_p, \n\t IN PNET_DEV\t\t dev_p);\n \n INT P2P_VirtualIF_Ioctl(\n\t IN PNET_DEV\t\t\t dev_p,\n\t IN OUT struct ifreq\t *rq_p,\n\t IN INT cmd);\n \n VOID RTMP_P2P_Remove(\n\t IN PRTMP_ADAPTER pAd);\n\n #endif /* __P2P_INF_H__ */\n\n"
  },
  {
    "path": "src/include/p2pcli.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    p2pcli.h\n\n    Abstract:\n    Support AP-Client function.\n\n    Revision History:\n    Who               When            What\n    --------------    ----------      ----------------------------------------------\n    Shiang, Fonchi    02-13-2007      created\n*/\n\n#ifndef _P2P_CLI_H_\n#define _P2P_CLI_H_\n\n#ifdef P2P_SUPPORT\n\n#include \"rtmp.h\"\n  \n#define AUTH_TIMEOUT\t300         // unit: msec\n#define ASSOC_TIMEOUT\t300         // unit: msec\n//#define JOIN_TIMEOUT\t2000        // unit: msec // not used in Ap-client mode, remove it\n#define PROBE_TIMEOUT\t1000        // unit: msec\n  \n#define P2P_CLI_ROOT_BSSID_GET(pAd, wcid) ((pAd)->MacTab.Content[(wcid)].Addr)\n#define P2P_CLI_IF_UP_CHECK(pAd, ifidx) ((pAd)->StaCfg.P2PCliTab[(ifidx)].dev->flags & IFF_UP)\n\n/* sanity check for apidx */\n#define P2P_CLI_MR_APIDX_SANITY_CHECK(idx) \\\n{ \\\n\tif ((idx) >= MAX_APCLI_NUM) \\\n\t{ \\\n\t\t(idx) = 0; \\\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s> Error! apcli-idx > MAX_APCLI_NUM!\\n\", __FUNCTION__)); \\\n\t} \\\n}\n\ntypedef struct _P2PCLI_MLME_JOIN_REQ_STRUCT {\n\tUCHAR\tBssid[MAC_ADDR_LEN];\n\tUCHAR\tSsidLen;\n\tUCHAR\tSsid[MAX_LEN_OF_SSID];\n} P2PCLI_MLME_JOIN_REQ_STRUCT;\n\ntypedef struct _P2PCLI_CTRL_MSG_STRUCT {\n\tUSHORT\tStatus;\n} P2PCLI_CTRL_MSG_STRUCT, *PP2PCLI_CTRL_MSG_STRUCT;\n\nBOOLEAN isValidP2pCliIf(\n\tSHORT ifIndex);\n\n/*\n * Private routines in apcli_ctrl.c\n*/\n\nVOID P2P_CliCtrlStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[]);\n\n/*\n * Private routines in apcli_sync.c\n*/\n\nVOID P2P_CliSyncStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\n/*\n * Private routines in apcli_auth.c\n*/\n\nVOID P2P_CliAuthStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\n/*\n* Private routines in apcli_assoc.c\n*/\n\nVOID P2P_CliAssocStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nMAC_TABLE_ENTRY *P2P_CliTableLookUpByWcid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR wcid,\n\tIN PUCHAR pAddrs);\n\nBOOLEAN P2P_CliAllowToSendPacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET pPacket,\n\tOUT UCHAR\t\t*pWcid);\n\t\nBOOLEAN\tP2P_CliValidateRSNIE(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN \tPEID_STRUCT    \tpEid_ptr,\n\tIN\tUSHORT\t\t\teid_len,\n\tIN\tUSHORT\t\t\tidx);\n\nINT P2P_CliIfLookUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr);\n\nVOID P2P_CliMgtMacHeaderInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN OUT PHEADER_802_11 pHdr80211, \n    IN UCHAR SubType, \n    IN UCHAR ToDs, \n    IN PUCHAR pDA, \n    IN PUCHAR pBssid,\n    IN USHORT ifIndex);\n\n#ifdef DOT11_N_SUPPORT\nBOOLEAN P2P_CliCheckHt(\n\tIN\tPRTMP_ADAPTER pAd,\n\tIN\tUSHORT IfIndex,\n\tIN OUT\tHT_CAPABILITY_IE *pHtCapability,\n\tIN OUT\tADD_HT_INFO_IE \t*pAddHtInfo);\n#endif /* DOT11_N_SUPPORT */\n\nBOOLEAN P2P_CliLinkUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR ifIndex);\n\nVOID P2P_CliLinkDown(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR ifIndex);\n\nVOID P2P_CliIfUp(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2P_CliIfDown(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID P2P_CliIfMonitor(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN P2P_CliMsgTypeSubst(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType);\n\nBOOLEAN P2P_PreCheckMsgTypeSubset(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType);\n\nBOOLEAN P2P_CliPeerAssocRspSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pStatus, \n    OUT USHORT *pAid, \n    OUT UCHAR SupRate[], \n    OUT UCHAR *pSupRateLen,\n    OUT UCHAR ExtRate[], \n    OUT UCHAR *pExtRateLen,\n    OUT HT_CAPABILITY_IE *pHtCapability,\n    OUT ADD_HT_INFO_IE *pAddHtInfo,\t/* AP might use this additional ht info IE */\n    OUT UCHAR *pHtCapabilityLen,\n    OUT UCHAR *pAddHtInfoLen,\n    OUT UCHAR *pNewExtChannelOffset,\n    OUT PEDCA_PARM pEdcaParm,\n    OUT UCHAR *pCkipFlag);\n\nBOOLEAN  P2P_CliHandleRxBroadcastFrame(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nVOID P2P_CliInstallPairwiseKey(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  MAC_TABLE_ENTRY *pEntry);\n\nBOOLEAN P2P_CliInstallSharedKey(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pKey,\n\tIN  UCHAR           KeyLen,\n\tIN\tUCHAR\t\t\tDefaultKeyIdx,\n\tIN  MAC_TABLE_ENTRY *pEntry);\n\n#endif /* P2P_SUPPORT */\n#endif /* _P2P_CLI_H_ */\n\n"
  },
  {
    "path": "src/include/phy/rlt_phy.h",
    "content": "\n/*\n\n*/\n\n\n#ifndef __RLT_PHY_H__\n#define __RLT_PHY_H_\n\n\n#define BBP_CORE\t0x2000\n#define BBP_IBI\t\t0x2100\n#define BBP_AGC1\t0x2300\n#define BBP_TXC\t\t0x2400\n#define BBP_RXC\t\t0x2500\n#define BBP_TXO\t\t0x2600\n#define BBP_TXBE\t0x2700\n#define BBP_RXFE\t0x2800\n#define BBP_RXO\t\t0x2900\n#define BBP_DFS\t\t0x2a00\n#define BBP_TR\t\t0x2b00\n#define BBP_CAL\t\t0x2c00\n#define BBP_DSC\t\t0x2d00\n#define BBP_PFMU\t0x2f00\n\n\n/* 0x2000 ~ */\n#define CORE_R0\t\t(BBP_CORE + 0x00)\n#define CORE_R1\t\t(BBP_CORE + 0x04)\n#define CORE_R4\t\t(BBP_CORE + 0x10)\n#define CORE_R24\t(BBP_CORE + 0x60)\n#define CORE_R32\t(BBP_CORE + 0x80)\n#define CORE_R35\t(BBP_CORE + 0x8c)\n#define CORE_R42\t(BBP_CORE + 0xa8)\n#define CORE_R44\t(BBP_CORE + 0xb0)\n\n/* 0x2100 ~ */\n#define IBI_R0\t\t(BBP_IBI + 0x00)\n#define IBI_R1\t\t(BBP_IBI + 0x04)\n#define IBI_R2\t\t(BBP_IBI + 0x08)\n#define IBI_R3\t\t(BBP_IBI + 0x0c)\n#define IBI_R4\t\t(BBP_IBI + 0x10)\n#define IBI_R5\t\t(BBP_IBI + 0x14)\n#define IBI_R6\t\t(BBP_IBI + 0x18)\n#define IBI_R7\t\t(BBP_IBI + 0x1c)\n#define IBI_R9\t\t(BBP_IBI + 0x24)\n#define IBI_R11\t\t(BBP_IBI + 0x2c)\n\n/* 0x2300 ~ */\n#define AGC1_R0\t\t(BBP_AGC1 + 0x00)\n#define AGC1_R1\t\t(BBP_AGC1 + 0x04)\n#define AGC1_R2\t\t(BBP_AGC1 + 0x08)\n#define AGC1_R4\t\t(BBP_AGC1 + 0x10)\n#define AGC1_R5\t\t(BBP_AGC1 + 0x14)\n#define AGC1_R8\t\t(BBP_AGC1 + 0x20)\n#define AGC1_R9\t\t(BBP_AGC1 + 0x24)\n#define AGC1_R12\t(BBP_AGC1 + 0x30)\n#define AGC1_R13\t(BBP_AGC1 + 0x34)\n#define AGC1_R14\t(BBP_AGC1 + 0x38)\n#define AGC1_R16\t(BBP_AGC1 + 0x40)\n#define AGC1_R18\t(BBP_AGC1 + 0x48)\n#define AGC1_R19\t(BBP_AGC1 + 0x4c)\n#define AGC1_R20\t(BBP_AGC1 + 0x50)\n#define AGC1_R21\t(BBP_AGC1 + 0x54)\n#define AGC1_R22\t(BBP_AGC1 + 0x58)\n#define AGC1_R23\t(BBP_AGC1 + 0x5c)\n#define AGC1_R24\t(BBP_AGC1 + 0x60)\n#define AGC1_R25\t(BBP_AGC1 + 0x64)\n#define AGC1_R26\t(BBP_AGC1 + 0x68)\n#define AGC1_R27\t(BBP_AGC1 + 0x6c)\n#define AGC1_R28\t(BBP_AGC1 + 0x70)\n#define AGC1_R30\t(BBP_AGC1 + 0x78)\n#define AGC1_R31\t(BBP_AGC1 + 0x7c)\n#define AGC1_R32\t(BBP_AGC1 + 0x80)\n#define AGC1_R33\t(BBP_AGC1 + 0x84)\n#define AGC1_R34\t(BBP_AGC1 + 0x88)\n#define AGC1_R35\t(BBP_AGC1 + 0x8c)\n#define AGC1_R37\t(BBP_AGC1 + 0x94)\n#define AGC1_R39\t(BBP_AGC1 + 0x9c)\n#define AGC1_R41\t(BBP_AGC1 + 0xa4)\n#define AGC1_R43\t(BBP_AGC1 + 0xac)\n#define AGC1_R45\t(BBP_AGC1 + 0xb4)\n#define AGC1_R47\t(BBP_AGC1 + 0xbc)\n#define AGC1_R49\t(BBP_AGC1 + 0xc4)\n#define AGC1_R51\t(BBP_AGC1 + 0xcc)\n#define AGC1_R53\t(BBP_AGC1 + 0xd4)\n#define AGC1_R55\t(BBP_AGC1 + 0xdc)\n#define AGC1_R57\t(BBP_AGC1 + 0xe4)\n#define AGC1_R58\t(BBP_AGC1 + 0xe8)\n#define AGC1_R59\t(BBP_AGC1 + 0xec)\n#define AGC1_R60\t(BBP_AGC1 + 0xf0)\n#define AGC1_R61\t(BBP_AGC1 + 0xf4)\n#define AGC1_R62\t(BBP_AGC1 + 0xf8)\n#define AGC1_R63\t(BBP_AGC1 + 0xfc)\n\n/* 0x2400 ~ */\n#define TXC_R0\t\t(BBP_TXC + 0x00)\n#define TXC_R1\t\t(BBP_TXC + 0x04)\n\n/* 0x2500 ~ */\n#define RXC_R0\t\t(BBP_RXC + 0x00)\n#define RXC_R1\t\t(BBP_RXC + 0x04)\n#define RXC_R2\t\t(BBP_RXC + 0x08)\n#define RXC_R3\t\t(BBP_RXC + 0x0c)\n#define RXC_R4\t\t(BBP_RXC + 0x10)\n\n/* 0x2600 ~ */\n#define TXO_R0\t\t(BBP_TXO + 0x00)\n#define TXO_R1\t\t(BBP_TXO + 0x04)\n#define TXO_R2\t\t(BBP_TXO + 0x08)\n#define TXO_R3\t\t(BBP_TXO + 0x0c)\n#define TXO_R4\t\t(BBP_TXO + 0x10)\n#define TXO_R5\t\t(BBP_TXO + 0x14)\n#define TXO_R6\t\t(BBP_TXO + 0x18)\n#define TXO_R7\t\t(BBP_TXO + 0x1c)\n#define TXO_R8\t\t(BBP_TXO + 0x20)\n\n/* 0x2700 ~ */\n#define TXBE_R0\t\t(BBP_TXBE + 0x00)\n#define TXBE_R1\t\t(BBP_TXBE + 0x04)\n#define TXBE_R2\t\t(BBP_TXBE + 0x08)\n#define TXBE_R3\t\t(BBP_TXBE + 0x0c)\n#define TXBE_R4\t\t(BBP_TXBE + 0x10)\n#define TXBE_R5\t\t(BBP_TXBE + 0x14)\n#define TXBE_R6\t\t(BBP_TXBE + 0x18)\n#define TXBE_R8\t\t(BBP_TXBE + 0x20)\n#define TXBE_R9\t\t(BBP_TXBE + 0x24)\n#define TXBE_R10\t(BBP_TXBE + 0x28)\n#define TXBE_R12\t(BBP_TXBE + 0x30)\n#define TXBE_R13\t(BBP_TXBE + 0x34)\n#define TXBE_R14\t(BBP_TXBE + 0x38)\n#define TXBE_R15\t(BBP_TXBE + 0x3c)\n#define TXBE_R16\t(BBP_TXBE + 0x40)\n#define TXBE_R17\t(BBP_TXBE + 0x44)\n\n/* 0x2800 ~ */\n#define RXFE_R0\t\t(BBP_RXFE + 0x00)\n#define RXFE_R2\t\t(BBP_RXFE + 0x08)\n#define RXFE_R3\t\t(BBP_RXFE + 0x0c)\n#define RXFE_R4\t\t(BBP_RXFE + 0x10)\n\n/* 0x2900 ~ */\n#define RXO_R9\t\t(BBP_RXO + 0x24)\n#define RXO_R13\t\t(BBP_RXO + 0x34)\n#define RXO_R14\t\t(BBP_RXO + 0x38)\n#define RXO_R15\t\t(BBP_RXO + 0x3c)\n#define RXO_R16\t\t(BBP_RXO + 0x40)\n#define RXO_R17\t\t(BBP_RXO + 0x44)\n#define RXO_R21\t\t(BBP_RXO + 0x54)\n#define RXO_R24\t\t(BBP_RXO + 0x60)\n#define RXO_R28\t\t(BBP_RXO + 0x70)\n#define RXO_R29\t\t(BBP_RXO + 0x74)\n\n/* 0x2a00 ~ */\n#define DFS_R0\t\t(BBP_DFS + 0x00)\n#define DFS_R1\t\t(BBP_DFS + 0x04)\n#define DFS_R2\t\t(BBP_DFS + 0x08)\n#define DFS_R3\t\t(BBP_DFS + 0x0c)\n#define DFS_R4\t\t(BBP_DFS + 0x10)\n#define DFS_R5\t\t(BBP_DFS + 0x14)\n#define DFS_R7\t\t(BBP_DFS + 0x1c)\n#define DFS_R9\t\t(BBP_DFS + 0x24)\n#define DFS_R11\t\t(BBP_DFS + 0x2c)\n#define DFS_R13\t\t(BBP_DFS + 0x34)\n#define DFS_R14\t\t(BBP_DFS + 0x38)\n#define DFS_R15\t\t(BBP_DFS + 0x3c)\n#define DFS_R17\t\t(BBP_DFS + 0x44)\n#define DFS_R19\t\t(BBP_DFS + 0x4c)\n#define DFS_R20\t\t(BBP_DFS + 0x50)\n#define DFS_R22\t\t(BBP_DFS + 0x58)\n#define DFS_R23\t\t(BBP_DFS + 0x5c)\n#define DFS_R25\t\t(BBP_DFS + 0x64)\n#define DFS_R26\t\t(BBP_DFS + 0x68)\n#define DFS_R28\t\t(BBP_DFS + 0x70)\n#define DFS_R30\t\t(BBP_DFS + 0x78)\n#define DFS_R31\t\t(BBP_DFS + 0x7c)\n\n/* 0x2c00 ~ */\n#define CAL_R0\t\t(BBP_CAL + 0x00)\n#define CAL_R1\t\t(BBP_CAL + 0x04)\n#define CAL_R2\t\t(BBP_CAL + 0x08)\n#define CAL_R3\t\t(BBP_CAL + 0x0c)\n#define CAL_R4\t\t(BBP_CAL + 0x10)\n#define CAL_R5\t\t(BBP_CAL + 0x14)\n#define CAL_R6\t\t(BBP_CAL + 0x18)\n#define CAL_R7\t\t(BBP_CAL + 0x1C)\n#define CAL_R8\t\t(BBP_CAL + 0x20)\n#define CAL_R9\t\t(BBP_CAL + 0x24)\n#define CAL_R10\t\t(BBP_CAL + 0x28)\n#define CAL_R11\t\t(BBP_CAL + 0x2C)\n#define CAL_R12\t\t(BBP_CAL + 0x30)\n#define CAL_R13\t\t(BBP_CAL + 0x34)\n#define CAL_R14\t\t(BBP_CAL + 0x38)\n#define CAL_R15\t\t(BBP_CAL + 0x3C)\n#define CAL_R16\t\t(BBP_CAL + 0x40)\n#define CAL_R17\t\t(BBP_CAL + 0x44)\n#define CAL_R18\t\t(BBP_CAL + 0x48)\n#define CAL_R19\t\t(BBP_CAL + 0x4C)\n#define CAL_R20\t\t(BBP_CAL + 0x50)\n#define CAL_R21\t\t(BBP_CAL + 0x54)\n#define CAL_R22\t\t(BBP_CAL + 0x58)\n#define CAL_R23\t\t(BBP_CAL + 0x5C)\n#define CAL_R24\t\t(BBP_CAL + 0x60)\n#define CAL_R25\t\t(BBP_CAL + 0x64)\n#define CAL_R26\t\t(BBP_CAL + 0x68)\n#define CAL_R27\t\t(BBP_CAL + 0x6C)\n#define CAL_R28\t\t(BBP_CAL + 0x70)\n#define CAL_R29\t\t(BBP_CAL + 0x74)\n#define CAL_R30\t\t(BBP_CAL + 0x78)\n#define CAL_R31\t\t(BBP_CAL + 0x7C)\n#define CAL_R32\t\t(BBP_CAL + 0x80)\n#define CAL_R33\t\t(BBP_CAL + 0x84)\n#define CAL_R34\t\t(BBP_CAL + 0x88)\n#define CAL_R35\t\t(BBP_CAL + 0x8C)\n#define CAL_R36\t\t(BBP_CAL + 0x90)\n#define CAL_R37\t\t(BBP_CAL + 0x94)\n#define CAL_R38\t\t(BBP_CAL + 0x98)\n#define CAL_R39\t\t(BBP_CAL + 0x9C)\n#define CAL_R40\t\t(BBP_CAL + 0xA0)\n#define CAL_R41\t\t(BBP_CAL + 0xA4)\n#define CAL_R42\t\t(BBP_CAL + 0xA8)\n#define CAL_R43\t\t(BBP_CAL + 0xAC)\n#define CAL_R44\t\t(BBP_CAL + 0xB0)\n#define CAL_R45\t\t(BBP_CAL + 0xB4)\n#define CAL_R46\t\t(BBP_CAL + 0xB8)\n#define CAL_R47\t\t(BBP_CAL + 0xBC)\n#define CAL_R48\t\t(BBP_CAL + 0xC0)\n#define CAL_R49\t\t(BBP_CAL + 0xC4)\n#define CAL_R50\t\t(BBP_CAL + 0xC8)\n#define CAL_R51\t\t(BBP_CAL + 0xCC)\n#define CAL_R52\t\t(BBP_CAL + 0xD0)\n#define CAL_R53\t\t(BBP_CAL + 0xD4)\n#define CAL_R54\t\t(BBP_CAL + 0xD8)\n#define CAL_R55\t\t(BBP_CAL + 0xDC)\n#define CAL_R56\t\t(BBP_CAL + 0xE0)\n#define CAL_R57\t\t(BBP_CAL + 0xE4)\n#define CAL_R58\t\t(BBP_CAL + 0xE8)\n#define CAL_R59\t\t(BBP_CAL + 0xEC)\n#define CAL_R60\t\t(BBP_CAL + 0xF0)\n#define CAL_R61\t\t(BBP_CAL + 0xF4)\n#define CAL_R62\t\t(BBP_CAL + 0xF8)\n#define CAL_R63\t\t(BBP_CAL + 0xFC)\n#define CAL_R64\t\t(BBP_CAL + 0x100)\n#define CAL_R65\t\t(BBP_CAL + 0x104)\n#define CAL_R66\t\t(BBP_CAL + 0x108)\n#define CAL_R67\t\t(BBP_CAL + 0x10C)\n#define CAL_R68\t\t(BBP_CAL + 0x110)\n#define CAL_R69\t\t(BBP_CAL + 0x114)\n#define CAL_R70\t\t(BBP_CAL + 0x118)\n\n\n#define RTMP_BBP_IO_READ32(_p, _i, _pV)\tRTMP_IO_READ32(_p, _i, _pV)\n#define RTMP_BBP_IO_WRITE32(_p, _i, _v)\tRTMP_IO_WRITE32(_p, _i, _v)\n\n#define RF_BANK0\t0\n#define RF_BANK1\t1\n#define RF_BANK2\t2\n#define RF_BANK3\t3\n#define RF_BANK4\t4\n#define RF_BANK5\t5\n#define RF_BANK6\t6\n#define RF_BANK7\t7\n#define RF_BANK8\t8\n#define RF_BANK9\t9\n#define RF_BANK10\t10\n#define RF_BANK11\t11\n#define RF_BANK12\t12\n#define RF_BANK13\t13\n#define RF_BANK14\t14\n#define RF_BANK15\t15\n\nINT rlt_bbp_is_ready(struct _RTMP_ADAPTER *pAd);\n\n#endif /* __RLT_PHY_H__ */\n\n"
  },
  {
    "path": "src/include/radar.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    radar.h\n\n    Abstract:\n     CS/DFS common functions.\n\n    Revision History:\n    Who       When            What\n    --------  ----------      ----------------------------------------------\n*/\n#ifndef __RADAR_H__\n#define __RADAR_H__\n\n/* RESTRICTION_BAND_1: 5600MHz ~ 5650MHz */\n#define RESTRICTION_BAND_1(_pAd)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 ? \t\t\t\t\t\t\\\n\t((_pAd->CommonCfg.Channel >= 116) && (_pAd->CommonCfg.Channel <= 128)) :\t\\\n\t((_pAd->CommonCfg.Channel >= 120) && (_pAd->CommonCfg.Channel <= 128))\n\n/* 802.11H */\ntypedef struct _DOT11_H {\n\t/* 802.11H and DFS related params */\n\tUCHAR CSCount;\t\t/*Channel switch counter */\n\tUCHAR CSPeriod; \t/*Channel switch period (beacon count) */\n\tUSHORT RDCount; \t/*Radar detection counter, if RDCount >  ChMovingTime, start to send beacons*/\n\tUCHAR RDMode;\t\t/*Radar Detection mode */\n\tUSHORT ChMovingTime;\n\tBOOLEAN bDFSIndoor;\n\tULONG InServiceMonitorCount;\t/* unit: sec */\n} DOT11_H, *PDOT11_H;\n\nBOOLEAN RadarChannelCheck(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tCh);\n\nULONG JapRadarType(\n\tIN PRTMP_ADAPTER pAd);\n\n#ifdef CONFIG_AP_SUPPORT\nVOID ChannelSwitchingCountDownProc(\n\tIN PRTMP_ADAPTER\tpAd);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID RadarDetectPeriodic(\n\tIN PRTMP_ADAPTER\tpAd);\n\nINT\tSet_CSPeriod_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ChMovingTime_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg);\n\nINT Set_BlockChReset_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PSTRING arg);\n\n#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)\nINT\tSet_RadarShow_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nVOID CckMrcStatusCtrl(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RadarGLRTCompensate(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /*defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)*/\n\n#endif /* __RADAR_H__ */\n"
  },
  {
    "path": "src/include/rt_config.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trt_config.h\n\n\tAbstract:\n\tCentral header file to maintain all include files for all NDIS\n\tminiport driver routines.\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n\tPaul Lin    08-01-2002    created\n\n*/\n#ifndef\t__RT_CONFIG_H__\n#define\t__RT_CONFIG_H__\n\n/* #define WDS_VLAN_SUPPORT */\n\n#include \"rtmp_comm.h\"\n/*#include \"rtmp_type.h\" */\n/*#include \"rtmp_os.h\" */\n\n#include \"rtmp_def.h\"\n#include \"rtmp_chip.h\"\n#include \"rtmp_timer.h\"\n\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n#include \"cfg80211extr.h\"\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\n#ifdef AGS_SUPPORT\n#include \"ags.h\"\n#endif /* AGS_SUPPORT */\n\n#include \"mlme.h\"\n#include \"crypt_md5.h\"\n#include \"crypt_sha2.h\"\n#include \"crypt_hmac.h\"\n#include \"crypt_aes.h\"\n#include \"crypt_arc4.h\"\n/*#include \"rtmp_cmd.h\" */\n#include \"rtmp.h\"\n#include \"ap.h\"\n#include \"wpa.h\"\n#include \"chlist.h\"\n#include \"spectrum.h\"\n#ifdef CONFIG_AP_SUPPORT\n#include \"ap_autoChSel.h\"\n#endif /* CONFIG_AP_SUPPORT */\n#include \"rt_os_util.h\"\n\n#include \"eeprom.h\"\n#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_USB_SUPPORT)\n#include \"rtmp_mcu.h\"\n#endif\n\n#undef AP_WSC_INCLUDED\n#undef STA_WSC_INCLUDED\n#undef WSC_INCLUDED\n\n#include \"rt_os_net.h\"\n\n#ifdef UAPSD_SUPPORT\n#include \"uapsd.h\"\n#endif /* UAPSD_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\n#include \"ap_mbss.h\"\n#endif /* MBSS_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\n#include \"ap_apcli.h\"\n#endif /* APCLI_SUPPORT */\n\n#ifdef WSC_AP_SUPPORT\n#define AP_WSC_INCLUDED\n#endif /* WSC_AP_SUPPORT */\n\n#include \"ap_ids.h\"\n#include \"ap_cfg.h\"\n\n#ifdef CLIENT_WDS\n#include \"client_wds.h\"\n#endif /* CLIENT_WDS */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef MAT_SUPPORT\n#include \"mat.h\"\n#endif /* MAT_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\n#define STA_WSC_INCLUDED\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef BLOCK_NET_IF\n#include \"netif_block.h\"\n#endif /* BLOCK_NET_IF */\n\n#ifdef IGMP_SNOOP_SUPPORT\n#include \"igmp_snoop.h\"\n#endif /* IGMP_SNOOP_SUPPORT */\n\n#ifdef RALINK_ATE\n#include \"rt_ate.h\"\n#endif /* RALINK_ATE */\n\n#ifdef RALINK_QA\n#include \"rt_qa.h\"\n#endif /* RALINK_QA */\n\n#ifdef RALINK_QA\n#ifndef RALINK_ATE\n#error \"For supporting QA GUI, please set HAS_ATE=y and HAS_QA_SUPPORT=y.\"\n#endif /* RALINK_ATE */\n#endif /* RALINK_QA */\n\n\n\n#ifdef WAPI_SUPPORT\n#include \"wapi.h\"\n#endif /* WAPI_SUPPORT */\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#include \"tdls.h\"\n#include \"tdls_uapsd.h\"\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED)\n#define WSC_INCLUDED\n#endif\n\n//#ifdef CONFIG_AP_SUPPORT\n//#ifdef WDS_SUPPORT\n#define RALINK_PASSPHRASE\t\"Ralink\"\n//#endif /* WDS_SUPPORT */\n//#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n#ifndef APCLI_SUPPORT\n#error \"Build Apcli for being controlled by NetworkManager or wext, please set HAS_APCLI_SUPPORT=y and HAS_APCLI_WPA_SUPPLICANT=y\"\n#endif /* APCLI_SUPPORT */\n#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n#ifndef WPA_SUPPLICANT_SUPPORT\n#error \"Build for being controlled by NetworkManager or wext, please set HAS_WPA_SUPPLICANT=y and HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y\"\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#include \"crypt_biginteger.h\"\n#include \"crypt_dh.h\"\n#include \"wsc_tlv.h\"\n#endif /* WSC_INCLUDED */\n\n\n#ifdef IKANOS_VX_1X0\n#include \"vr_ikans.h\"\n#endif /* IKANOS_VX_1X0 */\n\n\n\n\n\n#ifdef WAPI_SUPPORT\n#include \"wapi.h\"\n#endif /* WAPI_SUPPORT */\n\n#ifdef P2P_SUPPORT\n/*#include \"p2p_inf.h\" */\n#include \"p2p.h\"\n#include \"p2pcli.h\"\n#endif /* P2P_SUPPORT */\n\n#ifdef WFD_SUPPORT\n#include \"wfd.h\"\n#endif /* WFD_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n#include \"vht.h\"\n#endif /* DOT11_VHT_AC */\n#ifdef CONFIG_STA_SUPPORT\n#include \"sta_cfg.h\"\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n\n#ifdef WORKQUEUE_BH\n#include <linux/workqueue.h>\n#endif /* WORKQUEUE_BH / */\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n#include \"frq_cal.h\"\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n#include \"rt_txbf.h\"\n#endif /* TXBF_SUPPORT */\n\n\n#include \"mac_ral/fce.h\"\n\n#endif\t/* __RT_CONFIG_H__ */\n\n"
  },
  {
    "path": "src/include/rt_os_net.h",
    "content": "/****************************************************************************\n\n    Module Name:\n\trt_os_net.h\n\n\tAbstract:\n\tAll function prototypes are defined in NETIF modules.\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#ifndef __RT_OS_NET_H__\n#define __RT_OS_NET_H__\n\n#include \"chip/chip_id.h\"\n\ntypedef VOID *(*RTMP_NET_ETH_CONVERT_DEV_SEARCH)(VOID *net_dev, UCHAR *pData);\ntypedef int (*RTMP_NET_PACKET_TRANSMIT)(VOID *pPacket);\n\n#ifdef LINUX\n#ifdef OS_ABL_FUNC_SUPPORT\n\n/* ========================================================================== */\n/* operators used in NETIF module */\n/* Note: No need to put any compile option here */\ntypedef struct _RTMP_DRV_ABL_OPS {\n\nNDIS_STATUS\t(*RTMPAllocAdapterBlock)(PVOID handle, VOID **ppAdapter);\nVOID (*RTMPFreeAdapter)(VOID *pAd);\nBOOLEAN (*RtmpRaDevCtrlExit)(VOID *pAd);\nINT (*RtmpRaDevCtrlInit)(VOID *pAd, RTMP_INF_TYPE infType);\nVOID (*RTMPHandleInterrupt)(VOID *pAd);\nINT (*RTMP_COM_IoctlHandle)(\n\tIN\tVOID *pAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT *wrq,\n\tIN\tINT cmd,\n\tIN\tUSHORT subcmd,\n\tIN\tVOID *pData,\n\tIN\tULONG Data);\n\nint (*RTMPSendPackets)(\n\tIN\tNDIS_HANDLE MiniportAdapterContext,\n\tIN\tPPNDIS_PACKET ppPacketArray,\n\tIN\tUINT NumberOfPackets,\n\tIN\tUINT32 PktTotalLen,\n\tIN\tRTMP_NET_ETH_CONVERT_DEV_SEARCH Func);\n\nint (*MBSS_PacketSend)(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint (*WDS_PacketSend)(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint (*APC_PacketSend)(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint (*MESH_PacketSend)(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint (*P2P_PacketSend)(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nINT (*RTMP_AP_IoctlHandle)(\n\tIN\tVOID\t\t\t\t\t*pAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData);\n\nINT (*RTMP_STA_IoctlHandle)(\n\tIN\tVOID\t\t\t\t\t*pAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData,\n\tIN  USHORT                  priv_flags);\n\nVOID (*RTMPDrvOpen)(VOID *pAd);\n\nVOID (*RTMPDrvClose)(VOID *pAd, VOID *net_dev);\n\nVOID (*RTMPInfClose)(VOID *pAd);\n\nint (*rt28xx_init)(VOID *pAd,  PSTRING pDefaultMac, PSTRING pHostName);\n} RTMP_DRV_ABL_OPS;\n\nextern RTMP_DRV_ABL_OPS *pRtmpDrvOps;\n\nVOID RtmpDrvOpsInit(\n\tOUT \tVOID\t\t\t\t*pDrvOpsOrg,\n\tINOUT\tVOID\t\t\t\t*pDrvNetOpsOrg,\n\tIN\t\tRTMP_PCI_CONFIG\t\t*pPciConfig,\n\tIN\t\tRTMP_USB_CONFIG\t\t*pUsbConfig);\n#endif /* OS_ABL_FUNC_SUPPORT */\n#endif /* LINUX */\n\n\n\n\n/* ========================================================================== */\n/* operators used in DRIVER module */\ntypedef void (*RTMP_DRV_USB_COMPLETE_HANDLER)(VOID *pURB);\n\ntypedef struct _RTMP_NET_ABL_OPS {\n\n#ifdef RTMP_USB_SUPPORT\n/* net complete handlers */\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkOutDataPacketComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkOutMLMEPacketComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkOutNullFrameComplete;\n\n#ifdef CONFIG_MULTI_CHANNEL\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkOutHCCANullFrameComplete;\n#endif /* CONFIG_MULTI_CHANNEL */\n\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkOutRTSFrameComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkOutPsPollComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkRxComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpNetUsbBulkCmdRspEventComplete;\n\n/* drv complete handlers */\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkOutDataPacketComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkOutMLMEPacketComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkOutNullFrameComplete;\n\n#ifdef CONFIG_MULTI_CHANNEL\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkOutHCCANullFrameComplete;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkOutRTSFrameComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkOutPsPollComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkRxComplete;\nRTMP_DRV_USB_COMPLETE_HANDLER\tRtmpDrvUsbBulkCmdRspEventComplete;\n\n#endif /* RTMP_USB_SUPPORT */\n\n} RTMP_NET_ABL_OPS;\n\nextern RTMP_NET_ABL_OPS *pRtmpDrvNetOps;\n\nVOID RtmpNetOpsInit(VOID *pNetOpsOrg);\nVOID RtmpNetOpsSet(VOID *pNetOpsOrg);\n\n\n/* ========================================================================== */\n#if defined(RTMP_MODULE_OS) && defined(OS_ABL_FUNC_SUPPORT)\n/* for UTIL/NETIF module in OS ABL mode */\n\n#define RTMPAllocAdapterBlock (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPAllocAdapterBlock)\n#define RTMPFreeAdapter (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPFreeAdapter)\n#define RtmpRaDevCtrlExit (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RtmpRaDevCtrlExit)\n#define RtmpRaDevCtrlInit (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RtmpRaDevCtrlInit)\n#define RTMPHandleInterrupt (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPHandleInterrupt)\n#define RTMP_COM_IoctlHandle (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMP_COM_IoctlHandle)\n#define RTMPSendPackets (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPSendPackets)\n#define MBSS_PacketSend (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->MBSS_PacketSend)\n#define WDS_PacketSend (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->WDS_PacketSend)\n#define APC_PacketSend (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->APC_PacketSend)\n#define MESH_PacketSend (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->MESH_PacketSend)\n#define P2P_PacketSend (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->P2P_PacketSend)\n#define RTMP_AP_IoctlHandle (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMP_AP_IoctlHandle)\n#define RTMP_STA_IoctlHandle (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMP_STA_IoctlHandle)\n#define RTMPDrvOpen (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPDrvOpen)\n#define RTMPDrvClose (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPDrvClose)\n#define RTMPInfClose (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPInfClose)\n#define rt28xx_init (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->rt28xx_init)\n\n#else /* RTMP_MODULE_OS && OS_ABL_FUNC_SUPPORT */\n\nNDIS_STATUS RTMPAllocAdapterBlock(PVOID handle, VOID **ppAdapter);\nVOID RTMPFreeAdapter(VOID *pAd);\nBOOLEAN RtmpRaDevCtrlExit(VOID *pAd);\nINT RtmpRaDevCtrlInit(VOID *pAd, RTMP_INF_TYPE infType);\nVOID RTMPHandleInterrupt(VOID *pAd);\n\nINT RTMP_COM_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData);\n\nint\tRTMPSendPackets(\n\tIN\tNDIS_HANDLE\t\tMiniportAdapterContext,\n\tIN\tPPNDIS_PACKET\tppPacketArray,\n\tIN\tUINT\t\t\tNumberOfPackets,\n\tIN\tUINT32\t\t\tPktTotalLen,\n\tIN\tRTMP_NET_ETH_CONVERT_DEV_SEARCH\tFunc);\n\nint MBSS_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint WDS_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint APC_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint MESH_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\nint P2P_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tpPktSrc, \n\tIN\tPNET_DEV\t\t\t\t\tpDev,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc);\n\n#ifdef CONFIG_AP_SUPPORT\nINT RTMP_AP_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nINT RTMP_STA_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData,\n\tIN  USHORT                  priv_flags );\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID RTMPDrvOpen(VOID *pAd);\nVOID RTMPDrvClose(VOID *pAd, VOID *net_dev);\nVOID RTMPInfClose(VOID *pAd);\n\nint rt28xx_init(\n\tIN VOID\t\t\t\t\t\t*pAd, \n\tIN PSTRING\t\t\t\t\tpDefaultMac, \n\tIN PSTRING\t\t\t\t\tpHostName);\n\nPNET_DEV RtmpPhyNetDevMainCreate(VOID *pAd);\n#endif /* RTMP_MODULE_OS */\n\n\n\n\n/* ========================================================================== */\nint rt28xx_close(VOID *dev);\nint rt28xx_open(VOID *dev);\n\n__inline INT VIRTUAL_IF_UP(VOID *pAd)\n{\n\tRT_CMD_INF_UP_DOWN InfConf = { rt28xx_open, rt28xx_close };\n\tif (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP,\n\t\t\t\t\t\t0, &InfConf, 0) != NDIS_STATUS_SUCCESS)\n\t\treturn -1;\n\treturn 0;\n}\n\n__inline VOID VIRTUAL_IF_DOWN(VOID *pAd)\n{\n\tRT_CMD_INF_UP_DOWN InfConf = { rt28xx_open, rt28xx_close };\n\tRTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN,\n\t\t\t\t\t\t0, &InfConf, 0);\n\treturn;\n}\n\n#ifdef RTMP_MODULE_OS\n\n#ifdef CONFIG_AP_SUPPORT\nINT rt28xx_ap_ioctl(\n\tIN\tPNET_DEV\t\tnet_dev, \n\tIN\tOUT\tstruct ifreq\t*rq, \n\tIN\tINT\t\t\tcmd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nINT rt28xx_sta_ioctl(\n\tIN\tPNET_DEV\t\tnet_dev, \n\tIN\tOUT\tstruct ifreq\t*rq, \n\tIN\tINT\t\t\tcmd);\n#endif /* CONFIG_STA_SUPPORT */\n\nPNET_DEV RtmpPhyNetDevInit(\n\tIN VOID\t\t\t\t\t\t*pAd,\n\tIN RTMP_OS_NETDEV_OP_HOOK\t*pNetHook);\n\nBOOLEAN RtmpPhyNetDevExit(\n\tIN VOID\t\t\t\t\t\t*pAd, \n\tIN PNET_DEV\t\t\t\t\tnet_dev);\n\n#endif /* RTMP_MODULE_OS && OS_ABL_FUNC_SUPPORT */\n\n\nVOID RT28xx_MBSS_Init(\n\tIN VOID *pAd,\n\tIN PNET_DEV main_dev_p);\nVOID RT28xx_MBSS_Remove(\n\tIN VOID *pAd);\nINT MBSS_VirtualIF_Open(\n\tIN\tPNET_DEV\t\t\tdev_p);\nINT MBSS_VirtualIF_Close(\n\tIN\tPNET_DEV\t\t\tdev_p);\nINT MBSS_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET\t\t\tskb_p,\n\tIN PNET_DEV\t\t\t\tdev_p);\nINT MBSS_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tdev_p, \n\tIN OUT VOID \t\t\t*rq_p, \n\tIN INT cmd);\n\nVOID RT28xx_WDS_Init(\n\tIN VOID\t\t\t\t\t*pAd,\n\tIN PNET_DEV\t\t\t\tnet_dev);\nINT WdsVirtualIFSendPackets(\n\tIN PNDIS_PACKET\t\t\tpSkb,\n\tIN PNET_DEV\t\t\t\tdev);\nINT WdsVirtualIF_open(\n\tIN\tPNET_DEV\t\t\tdev);\nINT WdsVirtualIF_close(\n\tIN PNET_DEV\t\t\t\tdev);\nINT WdsVirtualIF_ioctl(\n\tIN PNET_DEV\t\t\t\tnet_dev, \n\tIN OUT VOID\t\t\t\t*rq, \n\tIN INT\t\t\t\t\tcmd);\nVOID RT28xx_WDS_Remove(\n\tIN VOID\t\t\t\t\t*pAd);\n\nVOID RT28xx_ApCli_Init(\n\tIN VOID \t\t\t\t*pAd,\n\tIN PNET_DEV\t\t\t\tmain_dev_p);\nINT ApCli_VirtualIF_Open(\n\tIN PNET_DEV\t\t\t\tdev_p);\nINT ApCli_VirtualIF_Close(\n\tIN\tPNET_DEV\t\t\tdev_p);\nINT ApCli_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET \t\tpPktSrc, \n\tIN PNET_DEV\t\t\t\tpDev);\nINT ApCli_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tdev_p, \n\tIN OUT VOID \t\t\t*rq_p, \n\tIN INT \t\t\t\t\tcmd);\nVOID RT28xx_ApCli_Remove(\n\tIN VOID \t\t\t\t*pAd);\n\nVOID RTMP_Mesh_Init(\n\tIN VOID\t\t\t\t\t*pAd,\n\tIN PNET_DEV\t\t\t\tmain_dev_p,\n\tIN PSTRING\t\t\t\tpHostName);\nVOID RTMP_Mesh_Remove(\n\tIN VOID \t\t\t\t*pAd);\nINT Mesh_VirtualIF_Open(\n\tIN PNET_DEV\t\t\t\tpDev);\nINT Mesh_VirtualIF_Close(\n\tIN\tPNET_DEV\t\t\tpDev);\nINT Mesh_VirtualIF_PacketSend(\n\tIN PNDIS_PACKET \t\tpPktSrc, \n\tIN PNET_DEV\t\t\t\tpDev);\nINT Mesh_VirtualIF_Ioctl(\n\tIN PNET_DEV\t\t\t\tdev_p, \n\tIN OUT VOID\t\t\t\t*rq_p, \n\tIN INT \t\t\t\t\tcmd);\n\nVOID RTMP_P2P_Init(\n\t\t IN VOID\t\t\t *pAd,\n\t\t IN PNET_DEV main_dev_p);\n \n INT P2P_VirtualIF_Open(\n\t IN  PNET_DEV\t dev_p);\n \n INT P2P_VirtualIF_Close(\n\t IN  PNET_DEV\t dev_p);\n \n INT P2P_VirtualIF_PacketSend(\n\t IN PNDIS_PACKET\t skb_p, \n\t IN PNET_DEV\t\t dev_p);\n \n INT P2P_VirtualIF_Ioctl(\n\t IN PNET_DEV\t\t\t dev_p,\n\t IN OUT VOID\t *rq_p,\n\t IN INT cmd);\n\nVOID RTMP_P2P_Remove(\n\tIN VOID\t\t\t\t*pAd);\n\n\n/* communication with RALINK DRIVER module in NET module */\n/* general */\n#define RTMP_DRIVER_NET_DEV_GET(__pAd, __pNetDev)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_NETDEV_GET, 0, __pNetDev, 0)\n\n#define RTMP_DRIVER_NET_DEV_SET(__pAd, __pNetDev)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_NETDEV_SET, 0, __pNetDev, 0)\n\n#define RTMP_DRIVER_OP_MODE_GET(__pAd, __pOpMode)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_OPMODE_GET, 0, __pOpMode, 0)\n\n#define RTMP_DRIVER_IW_STATS_GET(__pAd, __pIwStats)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET, 0, __pIwStats, 0)\n\n#define RTMP_DRIVER_INF_STATS_GET(__pAd, __pInfStats)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_STATS_GET, 0, __pInfStats, 0)\n\n#define RTMP_DRIVER_INF_TYPE_GET(__pAd, __pInfType)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_TYPE_GET, 0, __pInfType, 0)\n\n#define RTMP_DRIVER_TASK_LIST_GET(__pAd, __pList)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_TASK_LIST_GET, 0, __pList, 0)\n\n#define RTMP_DRIVER_NIC_NOT_EXIST_SET(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_NIC_NOT_EXIST, 0, NULL, 0)\n\n#define RTMP_DRIVER_MCU_SLEEP_CLEAR(__pAd)\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR, 0, NULL, 0)\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n#define RTMP_DRIVER_MAX_IN_BITS_SET(__pAd, __MaxInBit)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MAX_IN_BIT, 0, NULL, __MaxInBit)\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n//#ifdef CONFIG_PM\n//#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\n#define RTMP_DRIVER_USB_DEV_GET(__pAd, __pUsbDev)                                                       \\\n        RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_DEV_GET, 0, __pUsbDev, 0)\n\n#define RTMP_DRIVER_ADAPTER_END_DISSASSOCIATE(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_SEND_DISSASSOCIATE, 0, NULL, 0)\n\n#define RTMP_DRIVER_ADAPTER_SUSPEND_TEST(__pAd, __flag)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_TEST, 0,  __flag, 0)\n\n#define RTMP_DRIVER_ADAPTER_IDLE_RADIO_OFF_TEST(__pAd, __flag)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_IDLE_RADIO_OFF_TEST, 0,  __flag, 0)\n\n//#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n#define RTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(__pAd, __flag)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_STATUS, 0, __flag, 0)\n\n#define RTMP_DRIVER_ADAPTER_RT28XX_WOW_ENABLE(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_ENABLE, 0, NULL, 0)\n\n#define RTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_DISABLE, 0, NULL, 0)\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n//#endif /* CONFIG_PM */\t\n\n#define RTMP_DRIVER_AP_SSID_GET(__pAd, pData)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_AP_BSSID_GET, 0, pData, 0)\n#endif /* CONFIG_STA_SUPPORT */\n\n#define RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_OFF(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF, 0, NULL, 0)\n\n#define RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_ON(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON, 0, NULL, 0)\n\n#define RTMP_DRIVER_ADAPTER_SUSPEND_SET(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET, 0, NULL, 0)\n\n#define RTMP_DRIVER_ADAPTER_SUSPEND_CLEAR(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR, 0, NULL, 0)\n\n#define RTMP_DRIVER_VIRTUAL_INF_NUM_GET(__pAd, __pIfNum)\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET, 0, __pIfNum, 0)\n\n#define RTMP_DRIVER_CHANNEL_GET(__pAd, __Channel)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SIOCGIWFREQ, 0, __Channel, 0)\n\n#define RTMP_DRIVER_IOCTL_SANITY_CHECK(__pAd, __SetCmd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SANITY_CHECK, 0, __SetCmd, 0)\n\n#define RTMP_DRIVER_BITRATE_GET(__pAd, __pBitRate)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ, 0, __pBitRate, 0)\n\n#define RTMP_DRIVER_MAIN_INF_CREATE(__pAd, __ppNetDev)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_MAIN_CREATE, 0, __ppNetDev, 0)\n\n#define RTMP_DRIVER_MAIN_INF_GET(__pAd, __pInfId)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET, 0, __pInfId, 0)\n\n#define RTMP_DRIVER_MAIN_INF_CHECK(__pAd, __InfId)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_MAIN_CHECK, 0, NULL, __InfId)\n\n#define RTMP_DRIVER_P2P_INF_CHECK(__pAd, __InfId)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_P2P_CHECK, 0, NULL, __InfId)\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n#define RTMP_DRIVER_SET_PRECONFIG_VALUE(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_SET_PRECONFIG_VALUE, 0, NULL, 0)\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n/* cfg80211 */\n#define RTMP_DRIVER_CFG80211_START(__pAd)\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_CFG80211_CFG_START, 0, NULL, 0)\n\n\n#ifdef RT_CFG80211_SUPPORT\n#define RTMP_DRIVER_80211_CB_GET(__pAd, __ppCB)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CB_GET, 0, __ppCB, 0)\n#define RTMP_DRIVER_80211_CB_SET(__pAd, __pCB)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CB_SET, 0, __pCB, 0)\n#define RTMP_DRIVER_80211_CHAN_SET(__pAd, __pChan)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CHAN_SET, 0, __pChan, 0)\n#define RTMP_DRIVER_80211_VIF_SET(__pAd, __Filter, __IfType)\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_VIF_CHG, 0, &__Filter, __IfType)\n#define RTMP_DRIVER_80211_SCAN(__pAd)\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_SCAN, 0, NULL, 0)\n#define RTMP_DRIVER_80211_IBSS_JOIN(__pAd, __pInfo)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_IBSS_JOIN, 0, __pInfo, 0)\n#define RTMP_DRIVER_80211_STA_LEAVE(__pAd)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_STA_LEAVE, 0, NULL, 0)\n#define RTMP_DRIVER_80211_STA_GET(__pAd, __pStaInfo)\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_STA_GET, 0, __pStaInfo, 0)\n#define RTMP_DRIVER_80211_KEY_ADD(__pAd, __pKeyInfo)\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_KEY_ADD, 0, __pKeyInfo, 0)\n#define RTMP_DRIVER_80211_KEY_DEFAULT_SET(__pAd, __KeyId)\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET, 0, NULL, __KeyId)\n#define RTMP_DRIVER_80211_CONNECT(__pAd, __pConnInfo)\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CONNECT_TO, 0, __pConnInfo, 0)\n#define RTMP_DRIVER_80211_RFKILL(__pAd, __pActive)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_RFKILL, 0, __pActive, 0)\n#define RTMP_DRIVER_80211_REG_NOTIFY(__pAd, __pNotify)\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO, 0, __pNotify, 0)\n#define RTMP_DRIVER_80211_UNREGISTER(__pAd, __pNetDev)\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_UNREGISTER, 0, __pNetDev, 0)\n#define RTMP_DRIVER_80211_BANDINFO_GET(__pAd, __pBandInfo)\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_BANDINFO_GET, 0, __pBandInfo, 0)\n#define RTMP_DRIVER_80211_SURVEY_GET(__pAd, __pSurveyInfo)\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_SURVEY_GET, 0, __pSurveyInfo, 0)\n#define RTMP_DRIVER_80211_PMKID_CTRL(__pAd, __pPmkidInfo)\t\t\t\t\\\n\tRTMP_STA_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWPMKSA, 0, __pPmkidInfo, 0, 0);\n#endif /* RT_CFG80211_SUPPORT */\n\n/* mesh */\n#define RTMP_DRIVER_MESH_REMOVE(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MESH_REMOVE, 0, NULL, 0)\n\n/* inf ppa */\n#define RTMP_DRIVER_INF_PPA_INIT(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_PPA_INIT, 0, NULL, 0)\n\n#define RTMP_DRIVER_INF_PPA_EXIT(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_PPA_EXIT, 0, NULL, 0)\n\n/* pci */\n#define RTMP_DRIVER_IRQ_INIT(__pAd)\t\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_IRQ_INIT, 0, NULL, 0)\n\n#define RTMP_DRIVER_IRQ_RELEASE(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_IRQ_RELEASE, 0, NULL, 0)\n\n#define RTMP_DRIVER_PCI_MSI_ENABLE(__pAd, __pPciDev)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MSI_ENABLE, 0, __pPciDev, 0)\n\n#define RTMP_DRIVER_PCI_SUSPEND(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCI_SUSPEND, 0, NULL, 0)\n\n#define RTMP_DRIVER_PCI_RESUME(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCI_RESUME, 0, NULL, 0)\n\n#define RTMP_DRIVER_PCI_CSR_SET(__pAd, __Address)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCI_CSR_SET, 0, NULL, __Address)\n\n#define RTMP_DRIVER_PCIE_INIT(__pAd, __pPciDev)\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tRT_CMD_PCIE_INIT __Config, *__pConfig = &__Config;\t\t\t\t\t\t\\\n\t__pConfig->pPciDev = __pPciDev;\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pConfig->ConfigDeviceID = PCI_DEVICE_ID;\t\t\t\t\t\t\t\t\\\n\t__pConfig->ConfigSubsystemVendorID = PCI_SUBSYSTEM_VENDOR_ID;\t\t\t\\\n\t__pConfig->ConfigSubsystemID = PCI_SUBSYSTEM_ID;\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCIE_INIT, 0, __pConfig, 0);\\\n}\n\n/* usb */\n#define RTMP_DRIVER_USB_MORE_FLAG_SET(__pAd, __pConfig)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_MORE_FLAG_SET, 0, __pConfig, 0)\n\n#define RTMP_DRIVER_USB_CONFIG_INIT(__pAd, __pConfig)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_CONFIG_INIT, 0, __pConfig, 0)\n\n#define RTMP_DRIVER_USB_SUSPEND(__pAd, __bIsRunning)\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_SUSPEND, 0, NULL, __bIsRunning)\n\n#define RTMP_DRIVER_USB_RESUME(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_RESUME, 0, NULL, 0)\n\n/* ap */\n#define RTMP_DRIVER_AP_BITRATE_GET(__pAd, __pConfig)\t\t\t\t\t\t\t\\\n\tRTMP_AP_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ, 0, __pConfig, 0)\n\n#define RTMP_DRIVER_AP_MAIN_OPEN(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_AP_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MAIN_OPEN, 0, NULL, 0)\n\n/* sta */\n#define RTMP_DRIVER_STA_DEV_TYPE_SET(__pAd, __Type)\t\t\t\t\t\t\t\\\n\tRTMP_STA_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ORI_DEV_TYPE_SET, 0, NULL, __Type, __Type)\n\n#define RTMP_DRIVER_MAC_ADDR_GET(__pAd, __pMacAddr)\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MAC_ADDR_GET, 0, __pMacAddr, 0)\n\t\n#define RTMP_DRIVER_ADAPTER_CSO_SUPPORT_TEST(__pAd, __flag)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_CSO_SUPPORT_TEST, 0,  __flag, 0)\n\n#define RTMP_DRIVER_ADAPTER_TSO_SUPPORT_TEST(__pAd, __flag)\t\t\t\t\t\t\t\t\\\n\tRTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_ADAPTER_TSO_SUPPORT_TEST, 0,  __flag, 0)\n\n#endif /* __RT_OS_NET_H__ */\n\n"
  },
  {
    "path": "src/include/rt_os_util.h",
    "content": "/****************************************************************************\n\n    Module Name:\n\trt_os_util.h\n\n\tAbstract:\n\tAll function prototypes are provided from UTIL modules.\n\n\tNote:\n\tBut can not use any OS key word and compile option here.\n\tAll functions are provided from UTIL modules.\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#ifndef __RT_OS_UTIL_H__\n#define __RT_OS_UTIL_H__\n\n/* ============================ rt_linux.c ================================== */\n/* General */\nVOID RtmpUtilInit(VOID);\n\n/* OS Time */\nVOID RTMPusecDelay(\n\tIN\tULONG\t\t\t\t\tusec);\n\nVOID RtmpOsUsDelay(ULONG value);\n\nVOID RtmpOsMsDelay(\n\tIN\tULONG\t\t\t\t\tmsec);\n\nvoid RTMP_GetCurrentSystemTime(\n\tIN\tLARGE_INTEGER\t\t\t*time);\n\nvoid RTMP_GetCurrentSystemTick(\n\tIN\tULONG\t\t\t\t\t*pNow);\n\nVOID RtmpOsWait(\n\tIN\tUINT32\t\t\t\t\tTime);\n\nUINT32 RtmpOsTimerAfter(\n\tIN\tULONG\t\t\t\t\ta,\n\tIN\tULONG\t\t\t\t\tb);\n\nUINT32 RtmpOsTimerBefore(\n\tIN\tULONG\t\t\t\t\ta,\n\tIN\tULONG\t\t\t\t\tb);\n\nVOID RtmpOsGetSystemUpTime(\n\tIN\tULONG\t\t\t\t\t*pTime);\n\nUINT32 RtmpOsTickUnitGet(VOID);\n\n/* OS Memory */\nNDIS_STATUS os_alloc_mem(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tOUT\tUCHAR\t\t\t\t\t**mem,\n\tIN\tULONG\t\t\t\t\tsize);\n\nNDIS_STATUS os_alloc_mem_suspend(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tOUT\tUCHAR\t\t\t\t\t**mem,\n\tIN\tULONG\t\t\t\t\tsize);\n\nNDIS_STATUS os_free_mem(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tPVOID\t\t\t\t\tmem);\n\nNDIS_STATUS AdapterBlockAllocateMemory(\n\tIN\tPVOID\t\t\t\t\thandle,\n\tOUT\tPVOID\t\t\t\t\t*ppAd,\n\tIN\tUINT32\t\t\t\t\tSizeOfpAd);\n\nVOID *RtmpOsVmalloc(\n\tIN\tULONG\t\t\t\t\tSize);\n\nVOID RtmpOsVfree(\n\tIN\tVOID\t\t\t\t\t*pMem);\n\nULONG RtmpOsCopyFromUser(\n\tOUT\tVOID\t\t\t\t\t*to,\n\tIN\tconst void\t\t\t\t*from,\n\tIN\tULONG\t\t\t\t\tn);\n\nULONG RtmpOsCopyToUser(\n\tOUT VOID\t\t\t\t\t*to,\n\tIN\tconst void\t\t\t\t*from,\n\tIN\tULONG\t\t\t\t\tn);\n\nBOOLEAN RtmpOsStatsAlloc(\n\tIN\tVOID\t\t\t\t\t**ppStats,\n\tIN\tVOID\t\t\t\t\t**ppIwStats);\n\n/* OS Packet */\nPNDIS_PACKET RtmpOSNetPktAlloc(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tint\t\t\t\t\t\tsize);\n\nPNDIS_PACKET RTMP_AllocateFragPacketBuffer(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tULONG\t\t\t\t\tLength);\n\nNDIS_STATUS RTMPAllocateNdisPacket(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tOUT PNDIS_PACKET\t\t\t*ppPacket,\n\tIN\tPUCHAR\t\t\t\t\tpHeader,\n\tIN\tUINT\t\t\t\t\tHeaderLen,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tUINT\t\t\t\t\tDataLen);\n\nVOID RTMPFreeNdisPacket(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tPNDIS_PACKET\t\t\tpPacket);\n\nNDIS_STATUS Sniff2BytesFromNdisBuffer(\n\tIN  PNDIS_BUFFER\t\t\tpFirstBuffer,\n\tIN  UCHAR           \t\tDesiredOffset,\n\tOUT PUCHAR          \t\tpByte0,\n\tOUT PUCHAR          \t\tpByte1);\n\nvoid RTMP_QueryPacketInfo(\n\tIN  PNDIS_PACKET\t\t\tpPacket,\n\tOUT PACKET_INFO  \t\t\t*pPacketInfo,\n\tOUT PUCHAR\t\t \t\t\t*pSrcBufVA,\n\tOUT\tUINT\t\t \t\t\t*pSrcBufLen);\n\nPNDIS_PACKET DuplicatePacket(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tPNDIS_PACKET\t\t\tpPacket,\n\tIN\tUCHAR\t\t\t\t\tFromWhichBSSID);\n\nPNDIS_PACKET duplicate_pkt(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tPUCHAR\t\t\t\t\tpHeader802_3,\n    IN  UINT            \t\tHdrLen,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tULONG\t\t\t\t\tDataSize,\n\tIN\tUCHAR\t\t\t\t\tFromWhichBSSID);\n\nPNDIS_PACKET duplicate_pkt_with_TKIP_MIC(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tPNDIS_PACKET\t\t\tpOldPkt);\n\nPNDIS_PACKET duplicate_pkt_with_VLAN(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUSHORT\t\t\t\t\tVLAN_VID,\n\tIN\tUSHORT\t\t\t\t\tVLAN_Priority,\n\tIN\tPUCHAR\t\t\t\t\tpHeader802_3,\n    IN  UINT            \t\tHdrLen,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tULONG\t\t\t\t\tDataSize,\n\tIN\tUCHAR\t\t\t\t\tFromWhichBSSID,\n\tIN\tUCHAR\t\t\t\t\t*TPID);\n\ntypedef void (*RTMP_CB_8023_PACKET_ANNOUNCE)(\n\t\t\tIN\tVOID\t\t\t*pCtrlBkPtr, \n\t\t\tIN\tPNDIS_PACKET\tpPacket,\n\t\t\tIN\tUCHAR\t\t\tOpMode);\n\nBOOLEAN RTMPL2FrameTxAction(\n\tIN  VOID\t\t\t\t\t*pCtrlBkPtr,\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tRTMP_CB_8023_PACKET_ANNOUNCE _announce_802_3_packet,\n\tIN\tUCHAR\t\t\t\t\tapidx,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tUINT32\t\t\t\t\tdata_len,\n\tIN\tUCHAR\t\t\tOpMode);\n\nPNDIS_PACKET ExpandPacket(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tPNDIS_PACKET\t\t\tpPacket,\n\tIN\tUINT32\t\t\t\t\text_head_len,\n\tIN\tUINT32\t\t\t\t\text_tail_len);\n\nPNDIS_PACKET ClonePacket(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tPNDIS_PACKET\t\t\tpPacket,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tULONG\t\t\t\t\tDataSize);\n\nvoid wlan_802_11_to_802_3_packet(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUCHAR\t\t\t\t\tOpMode,\n\tIN\tUSHORT\t\t\t\t\tVLAN_VID,\n\tIN\tUSHORT\t\t\t\t\tVLAN_Priority,\n\tIN\tPNDIS_PACKET\t\t\tpRxPacket,\n\tIN\tUCHAR\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tDataSize,\n\tIN\tPUCHAR\t\t\t\t\tpHeader802_3,\n\tIN  UCHAR\t\t\t\t\tFromWhichBSSID,\n\tIN\tUCHAR\t\t\t\t\t*TPID);\n\n#ifdef HDR_TRANS_SUPPORT\nVOID RtmpOsSetPacket(\n\tIN PNET_DEV pNetDev,\n\tIN PNDIS_PACKET pRxPacket,\n\tIN UCHAR *pData,\n\tIN ULONG DataSize);\n#endif /* HDR_TRANS_SUPPORT */\n\nvoid send_monitor_packets(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tPNDIS_PACKET\t\t\tpRxPacket,\n\tIN\tPHEADER_802_11\t\t\tpHeader,\n\tIN\tUCHAR\t\t\t\t\t*pData,\n\tIN\tUSHORT\t\t\t\t\tDataSize,\n\tIN\tUCHAR\t\t\t\t\tL2PAD,\n\tIN\tUCHAR\t\t\t\t\tPHYMODE,\n\tIN\tUCHAR\t\t\t\t\tBW,\n\tIN\tUCHAR\t\t\t\t\tShortGI,\n\tIN\tUCHAR\t\t\t\t\tMCS,\n\tIN\tUCHAR\t\t\t\t\tAMPDU,\n\tIN\tUCHAR\t\t\t\t\tSTBC,\n\tIN\tUCHAR\t\t\t\t\tRSSI1,\n\tIN\tUCHAR\t\t\t\t\tBssMonitorFlag11n,\n\tIN\tUCHAR\t\t\t\t\t*pDevName,\n\tIN\tUCHAR\t\t\t\t\tChannel,\n\tIN\tUCHAR\t\t\t\t\tCentralChannel,\n\tIN\tUINT32\t\t\t\t\tMaxRssi);\n\nUCHAR VLAN_8023_Header_Copy(\n\tIN\tUSHORT\t\t\t\t\tVLAN_VID,\n\tIN\tUSHORT\t\t\t\t\tVLAN_Priority,\n\tIN\tPUCHAR\t\t\t\t\tpHeader802_3,\n\tIN\tUINT            \t\tHdrLen,\n\tOUT PUCHAR\t\t\t\t\tpData,\n\tIN\tUCHAR\t\t\t\t\tFromWhichBSSID,\n\tIN\tUCHAR\t\t\t\t\t*TPID);\n\nVOID RtmpOsPktBodyCopy(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tULONG\t\t\t\t\tThisFrameLen,\n\tIN\tPUCHAR\t\t\t\t\tpData);\n\nINT RtmpOsIsPktCloned(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nPNDIS_PACKET RtmpOsPktCopy(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nPNDIS_PACKET RtmpOsPktClone(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nVOID RtmpOsPktDataPtrAssign(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tUCHAR\t\t\t\t\t*pData);\n\nVOID RtmpOsPktLenAssign(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tLONG\t\t\t\t\tLen);\n\nVOID RtmpOsPktTailAdjust(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tUINT\t\t\t\t\tremovedTagLen);\n\nPUCHAR RtmpOsPktTailBufExtend(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tUINT\t\t\t\t\tLen);\n\nPUCHAR RtmpOsPktHeadBufExtend(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tUINT\t\t\t\t\tLen);\n\nVOID RtmpOsPktReserve(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tUINT\t\t\t\t\tLen);\n\nVOID RtmpOsPktProtocolAssign(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nVOID RtmpOsPktInfPpaSend(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nVOID RtmpOsPktRcvHandle(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nVOID RtmpOsPktNatMagicTag(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nVOID RtmpOsPktNatNone(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt);\n\nVOID RtmpOsPktInit(\n\tIN\tPNDIS_PACKET\t\t\tpNetPkt,\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUCHAR\t\t\t\t\t*pData,\n\tIN\tUSHORT\t\t\t\t\tDataSize);\n\nPNDIS_PACKET RtmpOsPktIappMakeUp(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUINT8\t\t\t\t\t*pMac);\n\nBOOLEAN RtmpOsPktOffsetInit(VOID);\n\nUINT16 RtmpOsNtohs(\n\tIN\tUINT16\t\t\t\t\tValue);\n\nUINT16 RtmpOsHtons(\n\tIN\tUINT16\t\t\t\t\tValue);\n\nUINT32 RtmpOsNtohl(\n\tIN\tUINT32\t\t\t\t\tValue);\n\nUINT32 RtmpOsHtonl(\n\tIN\tUINT32\t\t\t\t\tValue);\n\n/* OS File */\nRTMP_OS_FD RtmpOSFileOpen(char *pPath,  int flag, int mode);\nint RtmpOSFileClose(RTMP_OS_FD osfd);\nvoid RtmpOSFileSeek(RTMP_OS_FD osfd, int offset);\nint RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen);\nint RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen);\n\nINT32 RtmpOsFileIsErr(\n\tIN\tVOID\t\t\t\t\t*pFile);\n\nvoid RtmpOSFSInfoChange(\n\tIN\tRTMP_OS_FS_INFO\t\t\t*pOSFSInfoOrg,\n\tIN\tBOOLEAN\t\t\t\t\tbSet);\n\n/* OS Network Interface */\nint RtmpOSNetDevAddrSet(\n\tIN UCHAR\t\t\t\t\tOpMode,\n\tIN PNET_DEV \t\t\t\tpNetDev,\n\tIN PUCHAR\t\t\t\t\tpMacAddr,\n\tIN PUCHAR\t\t\t\t\tdev_name);\n\nvoid RtmpOSNetDevClose(\n\tIN PNET_DEV\t\t\t\t\tpNetDev);\n\nvoid RtmpOSNetDevFree(\n\tIN\tPNET_DEV\t\t\t\tpNetDev);\n\nINT RtmpOSNetDevAlloc(\n\tIN\tPNET_DEV\t\t\t\t*new_dev_p,\n\tIN\tUINT32\t\t\t\t\tprivDataSize);\n\nINT RtmpOSNetDevOpsAlloc(\n\tIN\tPVOID\t\t\t\t\t*pNetDevOps);\n\n\nPNET_DEV RtmpOSNetDevGetByName(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tPSTRING\t\t\t\t\tpDevName);\n\nvoid RtmpOSNetDeviceRefPut(\n\tIN\tPNET_DEV\t\t\t\tpNetDev);\n\nINT RtmpOSNetDevDestory(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tPNET_DEV\t\t\t\tpNetDev);\n\nvoid RtmpOSNetDevDetach(\n\tIN\tPNET_DEV\t\t\t\tpNetDev);\n\nint RtmpOSNetDevAttach(\n\tIN\tUCHAR\t\t\t\t\tOpMode,\n\tIN\tPNET_DEV\t\t\t\tpNetDev, \n\tIN\tRTMP_OS_NETDEV_OP_HOOK\t*pDevOpHook);\n\nvoid RtmpOSNetDevProtect(\n\tIN BOOLEAN lock_it);\n\nPNET_DEV RtmpOSNetDevCreate(\n\tIN\tINT32\t\t\t\t\tMC_RowID,\n\tIN\tUINT32\t\t\t\t\t*pIoctlIF,\n\tIN\tINT \t\t\t\t\tdevType,\n\tIN\tINT\t\t\t\t\t\tdevNum,\n\tIN\tINT\t\t\t\t\t\tprivMemSize,\n\tIN\tPSTRING\t\t\t\t\tpNamePrefix);\n\nBOOLEAN RtmpOSNetDevIsUp(\n\tIN\tVOID\t\t\t\t\t*pDev);\n\nunsigned char *RtmpOsNetDevGetPhyAddr(\n\tIN\tVOID\t\t\t\t\t*pDev);\n\nVOID RtmpOsNetQueueStart(\n\tIN\tPNET_DEV\t\t\t\tpDev);\n\nVOID RtmpOsNetQueueStop(\n\tIN\tPNET_DEV\t\t\t\tpDev);\n\nVOID RtmpOsNetQueueWake(\n\tIN\tPNET_DEV\t\t\t\tpDev);\n\nVOID RtmpOsSetPktNetDev(\n\tIN\tVOID\t\t\t\t\t*pPkt,\n\tIN\tVOID\t\t\t\t\t*pDev);\n\nPNET_DEV RtmpOsPktNetDevGet(\n\tIN\tVOID\t\t\t\t\t*pPkt);\n\nchar *RtmpOsGetNetDevName(\n\tIN\tVOID\t\t\t\t\t*pDev);\n\nVOID RtmpOsSetNetDevPriv(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tVOID\t\t\t\t\t*pPriv);\n\nVOID *RtmpOsGetNetDevPriv(\n\tIN\tVOID\t\t\t\t\t*pDev);\n\nUSHORT RtmpDevPrivFlagsGet(\n\tIN\tVOID\t\t\t\t\t*pDev);\n\nVOID RtmpDevPrivFlagsSet(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tUSHORT\t\t\t\t\tPrivFlags);\n\nVOID RtmpOsSetNetDevType(VOID *pDev, USHORT Type);\n\nVOID RtmpOsSetNetDevTypeMonitor(VOID *pDev);\n\n\n/* OS Semaphore */\nVOID RtmpOsCmdUp(RTMP_OS_TASK *pCmdQTask);\nBOOLEAN RtmpOsSemaInitLocked(RTMP_OS_SEM *pSemOrg, LIST_HEADER *pSemList);\nBOOLEAN RtmpOsSemaInit(RTMP_OS_SEM *pSemOrg, LIST_HEADER *pSemList);\nBOOLEAN RtmpOsSemaDestory(RTMP_OS_SEM *pSemOrg);\nINT RtmpOsSemaWaitInterruptible(RTMP_OS_SEM *pSemOrg);\nVOID RtmpOsSemaWakeUp(RTMP_OS_SEM *pSemOrg);\nVOID RtmpOsMlmeUp(RTMP_OS_TASK *pMlmeQTask);\n\n/* OS Task */\nBOOLEAN RtmpOsTaskletSche(RTMP_NET_TASK_STRUCT *pTasklet);\n\nBOOLEAN RtmpOsTaskletInit(\n\tRTMP_NET_TASK_STRUCT *pTasklet,\n\tVOID (*pFunc)(unsigned long data),\n\tULONG Data,\n\tLIST_HEADER *pTaskletList);\n\nBOOLEAN RtmpOsTaskletKill(RTMP_NET_TASK_STRUCT *pTasklet);\n\nVOID RtmpOsTaskletDataAssign(\n\tRTMP_NET_TASK_STRUCT *pTasklet,\n\tULONG Data);\n\nVOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTaskOrg);\n\nINT32 RtmpOsTaskIsKilled(RTMP_OS_TASK *pTaskOrg);\n\nBOOLEAN RtmpOsCheckTaskLegality(RTMP_OS_TASK *pTaskOrg);\n\nBOOLEAN RtmpOSTaskAlloc(\n\tIN\tRTMP_OS_TASK\t\t\t*pTask,\n\tIN\tLIST_HEADER\t\t\t\t*pTaskList);\n\nVOID RtmpOSTaskFree(\n\tIN\tRTMP_OS_TASK\t\t\t*pTask);\n\nNDIS_STATUS RtmpOSTaskKill(\n\tIN\tRTMP_OS_TASK\t\t\t*pTaskOrg);\n\nINT RtmpOSTaskNotifyToExit(\n\tIN\tRTMP_OS_TASK\t\t\t*pTaskOrg);\n\nVOID RtmpOSTaskCustomize(\n\tIN\tRTMP_OS_TASK\t\t\t*pTaskOrg);\n\nNDIS_STATUS RtmpOSTaskAttach(\n\tIN\tRTMP_OS_TASK\t\t\t*pTaskOrg,\n\tIN\tRTMP_OS_TASK_CALLBACK\tfn,\n\tIN\tULONG\t\t\t\t\targ);\n\nNDIS_STATUS RtmpOSTaskInit(\n\tIN\tRTMP_OS_TASK\t\t\t*pTaskOrg,\n\tIN\tPSTRING\t\t\t\t\tpTaskName,\n\tIN\tVOID\t\t\t\t\t*pPriv,\n\tIN\tLIST_HEADER\t\t\t\t*pTaskList,\n\tIN\tLIST_HEADER\t\t\t\t*pSemList);\n\nBOOLEAN RtmpOSTaskWait(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tRTMP_OS_TASK\t\t\t*pTaskOrg,\n\tIN\tINT32\t\t\t\t\t*pStatus);\n\nVOID *RtmpOsTaskDataGet(RTMP_OS_TASK *pTaskOrg);\n\nINT32 RtmpThreadPidKill(RTMP_OS_PID\t PID);\n\n/* OS Cache */\nVOID RtmpOsDCacheFlush(ULONG AddrStart, ULONG Size);\n\n/* OS Timer */\nVOID RTMP_SetPeriodicTimer(\n\tIN\tNDIS_MINIPORT_TIMER *pTimerOrg, \n\tIN\tunsigned long timeout);\n\nVOID RTMP_OS_Init_Timer(\n\tIN\tVOID \t\t\t\t\t*pReserved,\n\tIN\tNDIS_MINIPORT_TIMER\t\t*pTimerOrg, \n\tIN\tTIMER_FUNCTION\t\t\tfunction,\n\tIN\tPVOID\t\t\t\t\tdata,\n\tIN\tLIST_HEADER\t\t\t\t*pTimerList);\n\nVOID RTMP_OS_Add_Timer(\n\tIN\tNDIS_MINIPORT_TIMER *pTimerOrg,\n\tIN\tunsigned long timeout);\n\nVOID RTMP_OS_Mod_Timer(\n\tIN\tNDIS_MINIPORT_TIMER *pTimerOrg,\n\tIN\tunsigned long timeout);\n\nVOID RTMP_OS_Del_Timer(\n\tIN\tNDIS_MINIPORT_TIMER\t\t*pTimerOrg,\n\tOUT\tBOOLEAN\t\t\t\t\t*pCancelled);\n\nVOID RTMP_OS_Release_Timer(\n\tIN\tNDIS_MINIPORT_TIMER\t\t*pTimerOrg);\n\nBOOLEAN RTMP_OS_Alloc_Rsc(\n\tIN\tLIST_HEADER\t\t\t\t*pRscList,\n\tIN\tVOID \t\t\t\t\t*pRsc,\n\tIN\tUINT32\t\t\t\t\tRscLen);\n\nVOID RTMP_OS_Free_Rscs(\n\tIN\tLIST_HEADER\t\t\t\t*pRscList);\n\n/* OS Lock */\nBOOLEAN RtmpOsAllocateLock(\n\tIN\tNDIS_SPIN_LOCK\t\t\t*pLock,\n\tIN\tLIST_HEADER\t\t\t\t*pLockList);\n\nVOID RtmpOsFreeSpinLock(\n\tIN\tNDIS_SPIN_LOCK\t\t\t*pLockOrg);\n\nVOID RtmpOsSpinLockBh(\n\tIN\tNDIS_SPIN_LOCK\t\t\t*pLockOrg);\n\nVOID RtmpOsSpinUnLockBh(NDIS_SPIN_LOCK *pLockOrg);\nVOID RtmpOsIntLock(NDIS_SPIN_LOCK *pLockOrg, ULONG *pIrqFlags);\nVOID RtmpOsIntUnLock(NDIS_SPIN_LOCK *pLockOrg, ULONG IrqFlags);\n\n/* OS PID */\nVOID RtmpOsGetPid(ULONG *pDst, ULONG PID);\nVOID RtmpOsTaskPidInit(RTMP_OS_PID *pPid);\n\n/* OS I/O */\nVOID RTMP_PCI_Writel(ULONG Value, VOID *pAddr);\nVOID RTMP_PCI_Writew(ULONG Value, VOID *pAddr);\nVOID RTMP_PCI_Writeb(ULONG Value, VOID *pAddr);\nULONG RTMP_PCI_Readl(VOID *pAddr);\nULONG RTMP_PCI_Readw(VOID *pAddr);\nULONG RTMP_PCI_Readb(VOID *pAddr);\n\nint RtmpOsPciConfigReadWord(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tUINT32\t\t\t\t\tOffset,\n\tOUT UINT16\t\t\t\t\t*pValue);\n\nint RtmpOsPciConfigWriteWord(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tUINT32\t\t\t\t\tOffset,\n\tIN\tUINT16\t\t\t\t\tValue);\n\nint RtmpOsPciConfigReadDWord(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tUINT32\t\t\t\t\tOffset,\n\tOUT UINT32\t\t\t\t\t*pValue);\n\nint RtmpOsPciConfigWriteDWord(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tUINT32\t\t\t\t\tOffset,\n\tIN\tUINT32\t\t\t\t\tValue);\n\nint RtmpOsPciFindCapability(\n\tIN\tVOID\t\t\t\t\t*pDev,\n\tIN\tint\t\t\t\t\t\tCap);\n\nVOID *RTMPFindHostPCIDev(VOID *pPciDevSrc);\n\nint RtmpOsPciMsiEnable(VOID *pDev);\nVOID RtmpOsPciMsiDisable(VOID *pDev);\n\n/* OS Wireless */\nULONG RtmpOsMaxScanDataGet(VOID);\n\n/* OS Interrutp */\nINT32 RtmpOsIsInInterrupt(VOID);\n\n/* OS USB */\nVOID *RtmpOsUsbUrbDataGet(VOID *pUrb);\nNTSTATUS RtmpOsUsbUrbStatusGet(VOID *pUrb);\nULONG RtmpOsUsbUrbLenGet(VOID *pUrb);\n\n/* OS Atomic */\nBOOLEAN RtmpOsAtomicInit(RTMP_OS_ATOMIC *pAtomic, LIST_HEADER *pAtomicList);\nVOID RtmpOsAtomicDestroy(RTMP_OS_ATOMIC *pAtomic);\nLONG RtmpOsAtomicRead(RTMP_OS_ATOMIC *pAtomic);\nVOID RtmpOsAtomicDec(RTMP_OS_ATOMIC *pAtomic);\nVOID RtmpOsAtomicInterlockedExchange(RTMP_OS_ATOMIC *pAtomicSrc, LONG Value);\n\n/* OS Utility */\nvoid hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen);\n\ntypedef VOID (*RTMP_OS_SEND_WLAN_EVENT)(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tUSHORT\t\t\t\t\tEvent_flag,\n\tIN\tPUCHAR \t\t\t\t\tpAddr,\n\tIN  UCHAR\t\t\t\t\tBssIdx,\n\tIN\tCHAR\t\t\t\t\tRssi);\n\nVOID RtmpOsSendWirelessEvent(\n\tIN\tVOID\t\t\t*pAd,\n\tIN\tUSHORT\t\t\tEvent_flag,\n\tIN\tPUCHAR \t\t\tpAddr,\n\tIN\tUCHAR\t\t\tBssIdx,\n\tIN\tCHAR\t\t\tRssi,\n\tIN\tRTMP_OS_SEND_WLAN_EVENT pFunc);\n\n#ifdef CONFIG_AP_SUPPORT\nvoid SendSignalToDaemon(\n\tIN\tINT sig,\n\tIN\tRTMP_OS_PID\t pid,\n\tIN\tunsigned long pid_no);\n#endif /* CONFIG_AP_SUPPORT */\n\nint RtmpOSWrielessEventSend(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUINT32\t\t\t\t\teventType,\n\tIN\tINT\t\t\t\t\t\tflags,\n\tIN\tPUCHAR\t\t\t\t\tpSrcMac,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tUINT32\t\t\t\t\tdataLen);\n\nint RtmpOSWrielessEventSendExt(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUINT32\t\t\t\t\teventType,\n\tIN\tINT\t\t\t\t\t\tflags,\n\tIN\tPUCHAR\t\t\t\t\tpSrcMac,\n\tIN\tPUCHAR\t\t\t\t\tpData,\n\tIN\tUINT32\t\t\t\t\tdataLen,\n\tIN\tUINT32\t\t\t\t\tfamily);\n\nUINT RtmpOsWirelessExtVerGet(VOID);\n\nVOID RtmpDrvAllMacPrint(\n\tIN VOID\t\t\t\t\t\t*pReserved,\n\tIN UINT32\t\t\t\t\t*pBufMac,\n\tIN UINT32\t\t\t\t\tAddrStart,\n\tIN UINT32\t\t\t\t\tAddrEnd,\n\tIN UINT32\t\t\t\t\tAddrStep);\n\nVOID RtmpDrvAllE2PPrint(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tUSHORT\t\t\t\t\t*pMacContent,\n\tIN\tUINT32\t\t\t\t\tAddrEnd,\n\tIN\tUINT32\t\t\t\t\tAddrStep);\n\nVOID RtmpDrvAllRFPrint(\n\tIN VOID *pReserved,\n\tIN UINT32 *pBuf,\n\tIN UINT32 BufLen);\n\nint RtmpOSIRQRelease(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUINT32\t\t\t\t\tinfType,\n\tIN\tPPCI_DEV\t\t\t\tpci_dev,\n\tIN\tBOOLEAN\t\t\t\t\t*pHaveMsi);\n\nVOID RtmpOsWlanEventSet(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tBOOLEAN\t\t\t\t\t*pCfgWEnt,\n\tIN\tBOOLEAN\t\t\t\t\tFlgIsWEntSup);\n\nUINT16 RtmpOsGetUnaligned(UINT16 *pWord);\n\nUINT32 RtmpOsGetUnaligned32(UINT32 *pWord);\n\nULONG RtmpOsGetUnalignedlong(ULONG *pWord);\n\nlong RtmpOsSimpleStrtol(\n\tIN\tconst char\t\t\t\t*cp,\n\tIN\tchar \t\t\t\t\t**endp,\n\tIN\tunsigned int\t\t\tbase);\n\nVOID RtmpOsOpsInit(RTMP_OS_ABL_OPS *pOps);\n\n/* ============================ rt_os_util.c ================================ */\nVOID RtmpDrvMaxRateGet(\n\tIN VOID *pReserved,\n\tIN UINT8 MODE,\n\tIN UINT8 ShortGI,\n\tIN UINT8 BW,\n\tIN UINT8 MCS,\n\tOUT UINT32 *pRate);\n\nchar * rtstrchr(const char * s, int c);\n\nPSTRING   WscGetAuthTypeStr(USHORT authFlag);\n\nPSTRING   WscGetEncryTypeStr(USHORT encryFlag);\n\nUSHORT WscGetAuthTypeFromStr(PSTRING arg);\n\nUSHORT WscGetEncrypTypeFromStr(PSTRING arg);\n\nVOID RtmpMeshDown(\n\tIN VOID *pDrvCtrlBK,\n\tIN BOOLEAN WaitFlag,\n\tIN BOOLEAN (*RtmpMeshLinkCheck)(IN VOID *pAd));\n\nUSHORT RtmpOsNetPrivGet(PNET_DEV pDev);\n\nBOOLEAN RtmpOsCmdDisplayLenCheck(\n\tIN\tUINT32\t\t\t\t\tLenSrc,\n\tIN\tUINT32\t\t\t\t\tOffset);\n\nVOID    WpaSendMicFailureToWpaSupplicant(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n    IN  BOOLEAN\t\t\t\t\tbUnicast);\n\nint wext_notify_event_assoc(\n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUCHAR\t\t\t\t\t*ReqVarIEs,\n\tIN\tUINT32\t\t\t\t\tReqVarIELen);\n\nVOID    SendAssocIEsToWpaSupplicant( \n\tIN\tPNET_DEV\t\t\t\tpNetDev,\n\tIN\tUCHAR\t\t\t\t\t*ReqVarIEs,\n\tIN\tUINT32\t\t\t\t\tReqVarIELen);\n\nPVOID RtmpInitCompletion(VOID);\n\nULONG RtmpWaitForCompletionTimeout(VOID *Completion, ULONG Expire);\n\nVOID RtmpComplete(VOID *Completion);\n\nULONG RtmpMsecsToJiffies(UINT32 msecs);\n/* ============================ rt_rbus_pci_util.c ========================== */\nvoid RtmpAllocDescBuf(\n\tIN PPCI_DEV pPciDev,\n\tIN UINT Index,\n\tIN ULONG Length,\n\tIN BOOLEAN Cached,\n\tOUT VOID **VirtualAddress,\n\tOUT PNDIS_PHYSICAL_ADDRESS\tPhysicalAddress);\n\nvoid RtmpFreeDescBuf(\n\tIN PPCI_DEV pPciDev,\n\tIN ULONG Length,\n\tIN VOID *VirtualAddress,\n\tIN NDIS_PHYSICAL_ADDRESS\tPhysicalAddress);\n\nvoid RTMP_AllocateFirstTxBuffer(\n\tIN PPCI_DEV pPciDev,\n\tIN UINT Index,\n\tIN ULONG Length,\n\tIN BOOLEAN Cached,\n\tOUT VOID **VirtualAddress,\n\tOUT PNDIS_PHYSICAL_ADDRESS\tPhysicalAddress);\n\nvoid RTMP_FreeFirstTxBuffer(\n\tIN\tPPCI_DEV\t\t\t\tpPciDev,\n\tIN\tULONG\t\t\t\t\tLength,\n\tIN\tBOOLEAN\t\t\t\t\tCached,\n\tIN\tPVOID\t\t\t\t\tVirtualAddress,\n\tIN\tNDIS_PHYSICAL_ADDRESS\tPhysicalAddress);\n\nPNDIS_PACKET RTMP_AllocateRxPacketBuffer(\n\tIN\tVOID\t\t\t\t\t*pReserved,\n\tIN\tVOID\t\t\t\t\t*pPciDev,\n\tIN\tULONG\t\t\t\t\tLength,\n\tIN\tBOOLEAN\t\t\t\t\tCached,\n\tOUT\tPVOID\t\t\t\t\t*VirtualAddress,\n\tOUT\tPNDIS_PHYSICAL_ADDRESS\tPhysicalAddress);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\nint RTMP_Usb_AutoPM_Put_Interface(\n\tIN\tVOID\t\t\t*pUsb_Dev,\n\tIN\tVOID\t\t\t*intf);\n\nint  RTMP_Usb_AutoPM_Get_Interface(\n\tIN\tVOID\t\t\t*pUsb_Dev,\n\tIN\tVOID\t\t\t*intf);\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\nint rausb_autopm_put_interface (\n\tIN\tVOID\t\t\t*intfsrc);\n\nint rausb_autopm_get_interface (\n\tIN\tVOID\t\t\t*intfsrc);\n\nra_dma_addr_t linux_pci_map_single(void *pPciDev, void *ptr, size_t size, int sd_idx, int direction);\n\nvoid linux_pci_unmap_single(void *pPciDev, ra_dma_addr_t dma_addr, size_t size, int direction);\n\n/* ============================ rt_usb_util.c =============================== */\n#ifdef RTMP_MAC_USB\nvoid dump_urb(VOID *purb);\n\nint rausb_register(VOID * new_driver);\n\nvoid rausb_deregister(VOID * driver);\n\n/*struct urb *rausb_alloc_urb(int iso_packets); */\n\nvoid rausb_free_urb(VOID *urb);\n\nvoid rausb_put_dev(VOID *dev);\n\nstruct usb_device *rausb_get_dev(VOID *dev);\n\nint rausb_submit_urb(VOID *urb);\n\nvoid *rausb_buffer_alloc(VOID *dev,\n\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\tra_dma_addr_t *dma);\n\nvoid rausb_buffer_free(VOID *dev,\n\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\tvoid *addr,\n\t\t\t\t\t\t\tra_dma_addr_t dma);\n\nint rausb_control_msg(VOID *dev,\n\t\t\t\t\t\tunsigned int pipe,\n\t\t\t\t\t\t__u8 request,\n\t\t\t\t\t\t__u8 requesttype,\n\t\t\t\t\t\t__u16 value,\n\t\t\t\t\t\t__u16 index,\n\t\t\t\t\t\tvoid *data,\n\t\t\t\t\t\t__u16 size,\n\t\t\t\t\t\tint timeout);\n\nunsigned int rausb_sndctrlpipe(VOID *dev, ULONG address);\n\nunsigned int rausb_rcvctrlpipe(VOID *dev, ULONG address);\n\nvoid rausb_kill_urb(VOID *urb);\n\nVOID RtmpOsUsbEmptyUrbCheck(\n\tIN\tVOID\t\t\t\t**ppWait,\n\tIN\tNDIS_SPIN_LOCK\t\t*pBulkInLock,\n\tIN\tUCHAR\t\t\t\t*pPendingRx);\n\ntypedef VOID (*USB_COMPLETE_HANDLER)(VOID *);\n\nVOID\tRtmpOsUsbInitHTTxDesc(\n\tIN\tVOID\t\t\t*pUrbSrc,\n\tIN\tVOID\t\t\t*pUsb_Dev,\n\tIN\tUINT\t\t\tBulkOutEpAddr,\n\tIN\tPUCHAR\t\t\tpSrc,\n\tIN\tULONG\t\t\tBulkOutSize,\n\tIN\tUSB_COMPLETE_HANDLER\tFunc,\n\tIN\tVOID\t\t\t*pTxContext,\n\tIN\tra_dma_addr_t\t\tTransferDma);\n\nVOID\tRtmpOsUsbInitRxDesc(\n\tIN\tVOID\t\t\t*pUrbSrc,\n\tIN\tVOID\t\t\t*pUsb_Dev,\n\tIN\tUINT\t\t\tBulkInEpAddr,\n\tIN\tUCHAR\t\t\t*pTransferBuffer,\n\tIN\tUINT32\t\t\tBufSize,\n\tIN\tUSB_COMPLETE_HANDLER\tFunc,\n\tIN\tVOID\t\t\t*pRxContext,\n\tIN\tra_dma_addr_t\t\tTransferDma);\n\nVOID *RtmpOsUsbContextGet(\n\tIN\tVOID\t\t\t*pUrb);\n\nNTSTATUS RtmpOsUsbStatusGet(\n\tIN\tVOID\t\t\t*pUrb);\n\nVOID RtmpOsUsbDmaMapping(\n\tIN\tVOID\t\t\t*pUrb);\n#endif /* RTMP_MAC_USB */\n\n#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT)\nvoid RtmpFlashRead(\n\tUCHAR * p,\n\tULONG a,\n\tULONG b);\n\nvoid RtmpFlashWrite(\n\tUCHAR * p,\n\tULONG a,\n\tULONG b);\n#endif /* defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) */\n\nUINT32 RtmpOsGetUsbDevVendorID(\n\tIN VOID *pUsbDev);\n\nUINT32 RtmpOsGetUsbDevProductID(\n\tIN VOID *pUsbDev);\n\n/* CFG80211 */\n#ifdef RT_CFG80211_SUPPORT\ntypedef struct __CFG80211_BAND {\n\n\tUINT8 RFICType;\n\tUINT8 MpduDensity;\n\tUINT8 TxStream;\n\tUINT8 RxStream;\n\tUINT32 MaxTxPwr;\n\tUINT32 MaxBssTable;\n\n\tUINT16 RtsThreshold;\n\tUINT16 FragmentThreshold;\n\tUINT32 RetryMaxCnt; /* bit0~7: short; bit8 ~ 15: long */\n\tBOOLEAN FlgIsBMode;\n} CFG80211_BAND;\n\nVOID CFG80211OS_UnRegister(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN VOID\t\t\t\t\t\t*pNetDev);\n\nBOOLEAN CFG80211_SupBandInit(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN CFG80211_BAND \t\t\t*pBandInfo,\n\tIN VOID\t\t\t\t\t\t*pWiphyOrg,\n\tIN VOID\t\t\t\t\t\t*pChannelsOrg,\n\tIN VOID\t\t\t\t\t\t*pRatesOrg);\n\nBOOLEAN CFG80211OS_SupBandReInit(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN CFG80211_BAND \t\t\t*pBandInfo);\n\nVOID CFG80211OS_RegHint(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UCHAR\t\t\t\t\t*pCountryIe,\n\tIN ULONG\t\t\t\t\tCountryIeLen);\n\nVOID CFG80211OS_RegHint11D(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UCHAR\t\t\t\t\t*pCountryIe,\n\tIN ULONG\t\t\t\t\tCountryIeLen);\n\nBOOLEAN CFG80211OS_BandInfoGet(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN VOID\t\t\t\t\t\t*pWiphyOrg,\n\tOUT VOID\t\t\t\t\t**ppBand24,\n\tOUT VOID\t\t\t\t\t**ppBand5);\n\nUINT32 CFG80211OS_ChanNumGet(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN VOID\t\t\t\t\t\t*pWiphyOrg,\n\tIN UINT32\t\t\t\t\tIdBand);\n\nBOOLEAN CFG80211OS_ChanInfoGet(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN VOID\t\t\t\t\t\t*pWiphyOrg,\n\tIN UINT32\t\t\t\t\tIdBand,\n\tIN UINT32\t\t\t\t\tIdChan,\n\tOUT UINT32\t\t\t\t\t*pChanId,\n\tOUT UINT32\t\t\t\t\t*pPower,\n\tOUT BOOLEAN\t\t\t\t\t*pFlgIsRadar);\n\nBOOLEAN CFG80211OS_ChanInfoInit(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UINT32\t\t\t\t\tInfoIndex,\n\tIN UCHAR\t\t\t\t\tChanId,\n\tIN UCHAR\t\t\t\t\tMaxTxPwr,\n\tIN BOOLEAN\t\t\t\t\tFlgIsNMode,\n\tIN BOOLEAN\t\t\t\t\tFlgIsBW20M);\n\nVOID CFG80211OS_Scaning(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UINT32\t\t\t\t\tChanId,\n\tIN UCHAR\t\t\t\t\t*pFrame,\n\tIN UINT32\t\t\t\t\tFrameLen,\n\tIN INT32\t\t\t\t\tRSSI,\n\tIN BOOLEAN\t\t\t\t\tFlgIsNMode,\n\tIN UINT8\t\t\t\t\tBW);\n\nVOID CFG80211OS_ScanEnd(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN BOOLEAN\t\t\t\t\tFlgIsAborted);\n\nvoid CFG80211OS_ConnectResultInform(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UCHAR\t\t\t\t\t*pBSSID,\n\tIN UCHAR\t\t\t\t\t*pReqIe,\n\tIN UINT32\t\t\t\t\tReqIeLen,\n\tIN UCHAR\t\t\t\t\t*pRspIe,\n\tIN UINT32\t\t\t\t\tRspIeLen,\n\tIN UCHAR\t\t\t\t\tFlgIsSuccess);\n#endif /* RT_CFG80211_SUPPORT */\n\n\n\n\n/* ================================ MACRO =================================== */\n#define RTMP_UTIL_DCACHE_FLUSH(__AddrStart, __Size)\n\n/* ================================ EXTERN ================================== */\nextern UCHAR SNAP_802_1H[6];\nextern UCHAR SNAP_BRIDGE_TUNNEL[6];\nextern UCHAR EAPOL[2];\nextern UCHAR TPID[];\nextern UCHAR IPX[2];\nextern UCHAR APPLE_TALK[2];\nextern UCHAR NUM_BIT8[8];\nextern ULONG RTPktOffsetData, RTPktOffsetLen, RTPktOffsetCB;\n\nextern ULONG OS_NumOfMemAlloc, OS_NumOfMemFree;\n\nextern INT32 ralinkrate[];\nextern UINT32 RT_RateSize;\n\n#ifdef PLATFORM_UBM_IPX8\n#include \"vrut_ubm.h\"\n#endif /* PLATFORM_UBM_IPX8 */\n\nINT32  RtPrivIoctlSetVal(VOID);\n\n#endif /* __RT_OS_UTIL_H__ */\n"
  },
  {
    "path": "src/include/rt_txbf.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2009, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tcmm_txbf.c\n\n\tAbstract:\n\tTx Beamforming related constants and data structures\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n\tShiang     2010/06/29\n*/\n\n\n#ifndef _RT_TXBF_H_\n#define _RT_TXBF_H_\n\n#ifdef TXBF_SUPPORT\n\n//#define MRQ_FORCE_TX\t\t//Force MRQ regardless the capability of the station\n\n\n// TxSndgPkt Sounding type definitions\n#define SNDG_TYPE_DISABLE\t\t0\n#define SNDG_TYPE_SOUNDING\t1\n#define SNDG_TYPE_NDP\t\t\t2\n\n// Explicit TxBF feedback mechanism\n#define ETXBF_FB_DISABLE\t0\n#define ETXBF_FB_CSI\t\t1\n#define ETXBF_FB_NONCOMP\t2\n#define ETXBF_FB_COMP\t\t4\n\n\n//#define MRQ_FORCE_TX\t\t//Force MRQ regardless the capability of the station\n\n/* \n\teTxBfEnCond values:\n\t 0:no etxbf, \n\t 1:etxbf update periodically, \n\t 2:etxbf updated if mcs changes in RateSwitchingAdapt() or APQuickResponeForRateUpExecAdapt(). \n\t 3:auto-selection: if mfb changes or timer expires, then send sounding packets <------not finished yet!!!\n\t note: \n\t\twhen = 1 or 3, NO_SNDG_CNT_THRD controls the frequency to update the \n\t\tmatrix(ETXBF_EN_COND=1) or activate the whole bf evaluation process(not defined)\n*/\n\n// Defines to include optional code.\n//\tNOTE: Do not define these options. ETxBfEnCond==3 and\n//\t\tMCS Feedback are not fully implemented\n//#define ETXBF_EN_COND3_SUPPORT\t// Include ETxBfEnCond==3 code\n//#define MFB_SUPPORT\t\t\t\t// Include MCS Feedback code\n\n// MCS FB definitions\n#define MSI_TOGGLE_BF\t\t6\n#define TOGGLE_BF_PKTS\t\t5// the number of packets with inverted BF status\n\n// TXBF State definitions\n#define READY_FOR_SNDG0\t\t0//jump to WAIT_SNDG_FB0 when channel change or periodically\n#define WAIT_SNDG_FB0\t\t1//jump to WAIT_SNDG_FB1 when bf report0 is received\n#define WAIT_SNDG_FB1\t\t2\n#define WAIT_MFB\t\t\t3\n#define WAIT_USELESS_RSP\t4\n#define WAIT_BEST_SNDG\t\t5\n\n#define NO_SNDG_CNT_THRD\t0//send sndg packet if there is no sounding for (NO_SNDG_CNT_THRD+1)*500msec. If this =0, bf matrix is updated at each call of APMlmeDynamicTxRateSwitchingAdapt()\n\n\n// ------------ BEAMFORMING PROFILE HANDLING ------------\n\n#define IMP_MAX_BYTES\t\t14\t\t// Implicit: 14 bytes per subcarrier\n#define IMP_MAX_BYTES_ONE_COL\t7\t// Implicit: 7 bytes per subcarrier, when reading first column\n#define EXP_MAX_BYTES\t\t18\t\t// Explicit: 18 bytes per subcarrier\n#define IMP_COEFF_SIZE\t\t 9\t\t// 9 bits/coeff\n#define IMP_COEFF_MASK\t\t0x1FF\n\n#define PROFILE_MAX_CARRIERS_20\t\t56\t\t// Number of subcarriers in 20 MHz mode\n#define PROFILE_MAX_CARRIERS_40\t\t114\t\t// Number of subcarriers in 40 MHz mode\n\n// Indices of valid rows in Implicit and Explicit profiles for 20 and 40 MHz\ntypedef struct {\n\tint lwb1, upb1;\n\tint lwb2, upb2;\n} SC_TABLE_ENTRY;\n\n\ntypedef struct {\n\tBOOLEAN impProfile;\n\tBOOLEAN fortyMHz;\n\tint rows, columns;\n\tint grouping;\n\tUCHAR tag[EXP_MAX_BYTES];\n\tUCHAR data[PROFILE_MAX_CARRIERS_40][EXP_MAX_BYTES];\n} PROFILE_DATA;\n\nextern PROFILE_DATA profData;\n\n\ntypedef\nstruct {\n\tUCHAR gBeg[2];\n\tUCHAR gEnd[2];\n\tUCHAR aLowBeg[2];\n\tUCHAR aLowEnd[2];\n\tUCHAR aMidBeg[2];\n\tUCHAR aMidEnd[2];\n\tUCHAR aHighBeg[2];\n\tUCHAR aHighEnd[2];\n} ITXBF_PHASE_PARAMS;\t\t\t// ITxBF BBP reg phase calibration parameters\n\ntypedef\nstruct {\n\tUCHAR gBeg[2];\n\tUCHAR gEnd[2];\n\tUCHAR aLowBeg[2];\n\tUCHAR aLowEnd[2];\n\tUCHAR aMidBeg[2];\n\tUCHAR aMidEnd[2];\n\tUCHAR aHighBeg[2];\n\tUCHAR aHighEnd[2];\n} ITXBF_LNA_PARAMS;\t\t\t// ITxBF BBP reg LNA calibration parameters\n\ntypedef\nstruct {\n\tUCHAR gBeg[2];\n\tUCHAR gEnd[2];\n\tUCHAR aLow[2];\n\tUCHAR aMid[2];\n\tUCHAR aHigh[2];\n} ITXBF_DIV_PARAMS;\t\t\t\t// ITxBF Divider Calibration parameters\n\nvoid ITxBFGetEEPROM(\n\tIN RTMP_ADAPTER *pAd,\n\tIN ITXBF_PHASE_PARAMS *phaseParams,\n\tIN ITXBF_LNA_PARAMS *lnaParams,\n\tIN ITXBF_DIV_PARAMS *divParams);\n\nINT ITxBFDividerCalibration(\n\tIN RTMP_ADAPTER *pAd,\n\tIN int calFunction,\n\tIN int calMethod,\n\tOUT UCHAR *divPhase);\n\nVOID ITxBFLoadLNAComp(\n\tIN RTMP_ADAPTER *pAd);\n\nint ITxBFLNACalibration(\n\tIN RTMP_ADAPTER *pAd,\n\tIN int calFunction,\n\tIN int calMethod,\n\tIN BOOLEAN gBand);\n\nvoid Read_TxBfProfile(\n\tIN\tRTMP_ADAPTER\t*pAd, \n\tIN\tPROFILE_DATA\t*prof,\n\tIN\tint\t\t\t\tprofileNum,\n\tIN\tBOOLEAN\t\t\timplicitProfile);\n\nvoid Write_TxBfProfile(\n\tIN\tRTMP_ADAPTER\t*pAd, \n\tIN\tPROFILE_DATA\t*prof,\n\tIN\tint\t\t\t\tprofileNum);\n\nvoid Read_TagField(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  UCHAR\t*row,\n\tIN  int\t\tprofileNum);\n\t\n// Write_TagField - write a profile tagfield\nvoid Write_TagField(\n\tIN\tRTMP_ADAPTER *pAd, \n\tIN  UCHAR\t*row,\n\tIN  int\t\tprofileNum);\n\t\n// displayTagfield - display one tagfield\nvoid displayTagfield(\n\tIN\tRTMP_ADAPTER *pAd, \n\tIN\tint\t\tprofileNum,\n\tIN\tBOOLEAN implicitProfile);\n\t\n// Unpack an ITxBF matrix element from a row of bytes\nint Unpack_IBFValue(\n\tIN UCHAR *row,\n\tIN int elemNum);\n\nint iCalcCalibration(\n\tIN RTMP_ADAPTER *pAd, \n\tIN int calParams[2], \n\tIN int profileNum);\n\nvoid ITxBFSetEEPROM(\n\tIN RTMP_ADAPTER *pAd,\n\tIN ITXBF_PHASE_PARAMS *phaseParams,\n\tIN ITXBF_LNA_PARAMS *lnaParams,\n\tIN ITXBF_DIV_PARAMS *divParams);\n\n#endif // TXBF_SUPPORT //\n\n#endif // _RT_TXBF_H_\n"
  },
  {
    "path": "src/include/rtmp.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    rtmp.h\n\n    Abstract:\n    Miniport generic portion header file\n\n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Paul Lin    2002-08-01    created\n    James Tan   2002-09-06    modified (Revise NTCRegTable)\n    John Chang  2004-09-06    modified for RT2600     \n*/\n#ifndef __RTMP_H__\n#define __RTMP_H__\n\n#include \"link_list.h\"\n#include \"spectrum_def.h\"\n\n#include \"rtmp_dot11.h\"\n#include \"wpa_cmm.h\"\n\n#ifdef CONFIG_AP_SUPPORT\n#include \"ap_autoChSel_cmm.h\"\n#endif /* CONFIG_AP_SUPPORT */\n\n#include \"wsc.h\"\n#ifdef MAT_SUPPORT\n#include \"mat.h\"\n#endif /* MAT_SUPPORT */\n\n\n#ifdef WAPI_SUPPORT\n#include \"wapi_def.h\"\n#endif /* WAPI_SUPPORT */\n\n\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#include \"tdls_cmm.h\"\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef CLIENT_WDS\n#include \"client_wds_cmm.h\"\n#endif /* CLIENT_WDS */\n\n\n\n#ifdef P2P_SUPPORT\n#include \"p2p_cmm.h\"\n#endif /* P2P_SUPPORT */\n\n#ifdef WFD_SUPPORT\n#include \"wfd_cmm.h\"\n#endif /* WFD_SUPPORT */\n\n#include \"drs_extr.h\"\n\nstruct _RTMP_RA_LEGACY_TB;\n\ntypedef struct _RTMP_ADAPTER RTMP_ADAPTER;\ntypedef struct _RTMP_ADAPTER *PRTMP_ADAPTER;\n\ntypedef struct _RTMP_CHIP_OP_ RTMP_CHIP_OP;\ntypedef struct _RTMP_CHIP_CAP_ RTMP_CHIP_CAP;\n\ntypedef struct _UAPSD_INFO {\n\tBOOLEAN bAPSDCapable;\n} UAPSD_INFO;\n\n#include \"rtmp_mcu.h\"\n\n#include \"rtmp_M51.h\"\n\n#ifdef CONFIG_ANDES_SUPPORT\n#include \"rtmp_and.h\"\n#endif\n\n#include \"rtmp_chip.h\"\n\n#include \"radar.h\"\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#include \"cs.h\"\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DFS_SUPPORT\n#include \"dfs.h\"\n#endif /* DFS_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n#include \"rt_led.h\"\n#endif /* LED_CONTROL_SUPPORT */\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n#include \"frq_cal.h\"\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n#ifdef RALINK_ATE\n#include \"rt_ate.h\"\n#endif /* RALINK_ATE */\n\n\n/*#define DBG\t\t1 */\n\nBOOLEAN RtmpPktPmBitCheck(\n    IN  PRTMP_ADAPTER       pAd);\n\n/*#define DBG_DIAGNOSE\t\t1 */\n\n\n/*+++Used for merge MiniportMMRequest() and MiniportDataMMRequest() into one function */\n#define MAX_DATAMM_RETRY\t3\n#define MGMT_USE_QUEUE_FLAG\t0x80\n/*---Used for merge MiniportMMRequest() and MiniportDataMMRequest() into one function */\n/* The number of channels for per-channel Tx power offset */\n\n\n#define\tMAXSEQ\t\t(0xFFF)\n\n#ifdef DOT11N_SS3_SUPPORT\n#define MAX_MCS_SET 24\t\t/* From MCS 0 ~ MCS 23 */\n#else\n#define MAX_MCS_SET 16\t\t/* From MCS 0 ~ MCS 15 */\n#endif /* DOT11N_SS3_SUPPORT */\n\n\n#define MAX_TXPOWER_ARRAY_SIZE\t5\n\nextern unsigned char CISCO_OUI[];\nextern UCHAR BaSizeArray[4];\n\nextern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN];\nextern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];\nextern ULONG BIT32[32];\nextern char *CipherName[];\nextern UCHAR RxwiMCSToOfdmRate[12];\nextern UCHAR SNAP_802_1H[6];\nextern UCHAR SNAP_BRIDGE_TUNNEL[6];\nextern UCHAR EAPOL[2];\nextern UCHAR IPX[2];\nextern UCHAR TPID[];\nextern UCHAR APPLE_TALK[2];\n#ifdef DOT11Z_TDLS_SUPPORT\nextern UCHAR TDLS_LLC_SNAP_WITH_CATEGORY[10];\n#ifdef WFD_SUPPORT\nextern UCHAR TDLS_LLC_SNAP_WITH_WFD_CATEGORY[10];\n#endif /* WFD_SUPPORT */\nextern UCHAR TDLS_ETHERTYPE[2];\n#endif /* DOT11Z_TDLS_SUPPORT */\nextern UCHAR OfdmRateToRxwiMCS[];\nextern UCHAR MapUserPriorityToAccessCategory[8];\n\nextern unsigned char RateIdToMbps[];\nextern USHORT RateIdTo500Kbps[];\n\nextern UCHAR CipherSuiteWpaNoneTkip[];\nextern UCHAR CipherSuiteWpaNoneTkipLen;\n\nextern UCHAR CipherSuiteWpaNoneAes[];\nextern UCHAR CipherSuiteWpaNoneAesLen;\n\nextern UCHAR SsidIe;\nextern UCHAR SupRateIe;\nextern UCHAR ExtRateIe;\n\n#ifdef DOT11_N_SUPPORT\nextern UCHAR HtCapIe;\nextern UCHAR AddHtInfoIe;\nextern UCHAR NewExtChanIe;\nextern UCHAR BssCoexistIe;\nextern UCHAR ExtHtCapIe;\n#ifdef CONFIG_STA_SUPPORT\nextern UCHAR PRE_N_HT_OUI[];\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\nextern UCHAR ExtCapIe;\n\nextern UCHAR ErpIe;\nextern UCHAR DsIe;\nextern UCHAR TimIe;\nextern UCHAR WpaIe;\nextern UCHAR Wpa2Ie;\nextern UCHAR IbssIe;\nextern UCHAR WapiIe;\n\nextern UCHAR WPA_OUI[];\nextern UCHAR RSN_OUI[];\nextern UCHAR WAPI_OUI[];\nextern UCHAR WME_INFO_ELEM[];\nextern UCHAR WME_PARM_ELEM[];\nextern UCHAR RALINK_OUI[];\nextern UCHAR PowerConstraintIE[];\n\ntypedef union _CAPTURE_MODE_PACKET_BUFFER {\n\tstruct \n\t{\n\t\tUINT32       BYTE0:8;     \n\t\tUINT32       BYTE1:8;\n\t\tUINT32       BYTE2:8;\n\t\tUINT32       BYTE3:8;\n\t} field;\n\tUINT32                   Value;\n}CAPTURE_MODE_PACKET_BUFFER, *PCAPTURE_MODE_PACKET_BUFFER;\n\ntypedef struct _RSSI_SAMPLE {\n\tCHAR LastRssi0;\t\t/* last received RSSI */\n\tCHAR LastRssi1;\t\t/* last received RSSI */\n\tCHAR LastRssi2;\t\t/* last received RSSI */\n\tCHAR AvgRssi0;\n\tCHAR AvgRssi1;\n\tCHAR AvgRssi2;\n\tSHORT AvgRssi0X8;\n\tSHORT AvgRssi1X8;\n\tSHORT AvgRssi2X8;\n\tCHAR LastSnr0;\n\tCHAR LastSnr1;\n\tCHAR LastSnr2;\n\tCHAR AvgSnr0;\n\tCHAR AvgSnr1;\n\tCHAR AvgSnr2;\n\tSHORT AvgSnr0X8;\n\tSHORT AvgSnr1X8;\n\tSHORT AvgSnr2X8;\n\tCHAR LastNoiseLevel0;\n\tCHAR LastNoiseLevel1;\n\tCHAR LastNoiseLevel2;\n} RSSI_SAMPLE;\n\n/* */\n/*  Queue structure and macros */\n/* */\n#define InitializeQueueHeader(QueueHeader)              \\\n{                                                       \\\n\t(QueueHeader)->Head = (QueueHeader)->Tail = NULL;   \\\n\t(QueueHeader)->Number = 0;                          \\\n}\n\n#define RemoveHeadQueue(QueueHeader)                \\\n(QueueHeader)->Head;                                \\\n{                                                   \\\n\tPQUEUE_ENTRY pNext;                             \\\n\tif ((QueueHeader)->Head != NULL)\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tpNext = (QueueHeader)->Head->Next;          \\\n\t\t(QueueHeader)->Head->Next = NULL;\t\t\\\n\t\t(QueueHeader)->Head = pNext;                \\\n\t\tif (pNext == NULL)                          \\\n\t\t\t(QueueHeader)->Tail = NULL;             \\\n\t\t(QueueHeader)->Number--;                    \\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n#define InsertHeadQueue(QueueHeader, QueueEntry)            \\\n{                                                           \\\n\t\t((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \\\n\t\t(QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \\\n\t\tif ((QueueHeader)->Tail == NULL)                        \\\n\t\t\t(QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);   \\\n\t\t(QueueHeader)->Number++;                                \\\n}\n\n#define InsertTailQueue(QueueHeader, QueueEntry)\t\t\t\t\\\n{                                                               \\\n\t((PQUEUE_ENTRY)QueueEntry)->Next = NULL;                    \\\n\tif ((QueueHeader)->Tail)                                    \\\n\t\t(QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry); \\\n\telse                                                        \\\n\t\t(QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \\\n\t(QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);           \\\n\t(QueueHeader)->Number++;                                    \\\n}\n\n#define InsertTailQueueAc(pAd, pEntry, QueueHeader, QueueEntry)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t((PQUEUE_ENTRY)QueueEntry)->Next = NULL;\t\t\t\t\t\t\t\\\n\tif ((QueueHeader)->Tail)\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry);\t\t\t\\\n\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);\t\t\t\t\\\n\t(QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);\t\t\t\t\t\\\n\t(QueueHeader)->Number++;\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n\n/* */\n/*  Macros for flag and ref count operations */\n/* */\n#define RTMP_SET_FLAG(_M, _F)       ((_M)->Flags |= (_F))\n#define RTMP_CLEAR_FLAG(_M, _F)     ((_M)->Flags &= ~(_F))\n#define RTMP_CLEAR_FLAGS(_M)        ((_M)->Flags = 0)\n#define RTMP_TEST_FLAG(_M, _F)      (((_M)->Flags & (_F)) != 0)\n#define RTMP_TEST_FLAGS(_M, _F)     (((_M)->Flags & (_F)) == (_F))\n/* Macro for power save flag. */\n#define RTMP_SET_PSFLAG(_M, _F)       ((_M)->PSFlags |= (_F))\n#define RTMP_CLEAR_PSFLAG(_M, _F)     ((_M)->PSFlags &= ~(_F))\n#define RTMP_CLEAR_PSFLAGS(_M)        ((_M)->PSFlags = 0)\n#define RTMP_TEST_PSFLAG(_M, _F)      (((_M)->PSFlags & (_F)) != 0)\n#define RTMP_TEST_PSFLAGS(_M, _F)     (((_M)->PSFlags & (_F)) == (_F))\n\n#define OPSTATUS_SET_FLAG(_pAd, _F)     ((_pAd)->CommonCfg.OpStatusFlags |= (_F))\n#define OPSTATUS_CLEAR_FLAG(_pAd, _F)   ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F))\n#define OPSTATUS_TEST_FLAG(_pAd, _F)    (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0)\n\n#define CLIENT_STATUS_SET_FLAG(_pEntry,_F)      ((_pEntry)->ClientStatusFlags |= (_F))\n#define CLIENT_STATUS_CLEAR_FLAG(_pEntry,_F)    ((_pEntry)->ClientStatusFlags &= ~(_F))\n#define CLIENT_STATUS_TEST_FLAG(_pEntry,_F)     (((_pEntry)->ClientStatusFlags & (_F)) != 0)\n\n#define RX_FILTER_SET_FLAG(_pAd, _F)    ((_pAd)->CommonCfg.PacketFilter |= (_F))\n#define RX_FILTER_CLEAR_FLAG(_pAd, _F)  ((_pAd)->CommonCfg.PacketFilter &= ~(_F))\n#define RX_FILTER_TEST_FLAG(_pAd, _F)   (((_pAd)->CommonCfg.PacketFilter & (_F)) != 0)\n\n#define RTMP_SET_MORE_FLAG(_M, _F)       ((_M)->MoreFlags |= (_F))\n#define RTMP_TEST_MORE_FLAG(_M, _F)      (((_M)->MoreFlags & (_F)) != 0)\n#define RTMP_CLEAR_MORE_FLAG(_M, _F)     ((_M)->MoreFlags &= ~(_F))\n\n#define SET_ASIC_CAP(_pAd, _caps)\t\t((_pAd)->chipCap.asic_caps |= (_caps))\n#define IS_ASIC_CAP(_pAd, _caps)\t\t\t(((_pAd)->chipCap.asic_caps & (_caps)) != 0)\n#define CLR_ASIC_CAP(_pAd, _caps)\t\t((_pAd)->chipCap.asic_caps &= ~(_caps))\n\n\n#ifdef CONFIG_STA_SUPPORT\n#define STA_NO_SECURITY_ON(_p)          (_p->StaCfg.WepStatus == Ndis802_11EncryptionDisabled)\n#define STA_WEP_ON(_p)                  (_p->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)\n#define STA_TKIP_ON(_p)                 (_p->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)\n#define STA_AES_ON(_p)                  (_p->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)\n\n#define STA_TGN_WIFI_ON(_p)             (_p->StaCfg.bTGnWifiTest == TRUE)\n#endif /* CONFIG_STA_SUPPORT */\n\n#define CKIP_KP_ON(_p)\t\t\t\t((((_p)->StaCfg.CkipFlag) & 0x10) && ((_p)->StaCfg.bCkipCmicOn == TRUE))\n#define CKIP_CMIC_ON(_p)\t\t\t((((_p)->StaCfg.CkipFlag) & 0x08) && ((_p)->StaCfg.bCkipCmicOn == TRUE))\n\n#define INC_RING_INDEX(_idx, _RingSize)    \\\n{                                          \\\n    (_idx) = (_idx+1) % (_RingSize);       \\\n}\n\n#ifdef USB_BULK_BUF_ALIGMENT\n#define CUR_WRITE_IDX_INC(_idx, _RingSize)    \\\n{                                          \\\n    (_idx) = (_idx+1) % (_RingSize);       \\\n}\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n#ifdef DOT11_N_SUPPORT\n/* StaActive.SupportedHtPhy.MCSSet is copied from AP beacon.  Don't need to update here. */\n#define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd)                                 \\\n{                                                                                       \\\n\t_pAd->StaActive.SupportedHtPhy.ChannelWidth = _pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth;      \\\n\t_pAd->StaActive.SupportedHtPhy.MimoPs = _pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs;      \\\n\t_pAd->StaActive.SupportedHtPhy.GF = _pAd->MlmeAux.HtCapability.HtCapInfo.GF;      \\\n\t_pAd->StaActive.SupportedHtPhy.ShortGIfor20 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20;      \\\n\t_pAd->StaActive.SupportedHtPhy.ShortGIfor40 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40;      \\\n\t_pAd->StaActive.SupportedHtPhy.TxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC;      \\\n\t_pAd->StaActive.SupportedHtPhy.RxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC;      \\\n\t_pAd->StaActive.SupportedHtPhy.ExtChanOffset = _pAd->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset;      \\\n\t_pAd->StaActive.SupportedHtPhy.RecomWidth = _pAd->MlmeAux.AddHtInfo.AddHtInfo.RecomWidth;      \\\n\t_pAd->StaActive.SupportedHtPhy.OperaionMode = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode;      \\\n\t_pAd->StaActive.SupportedHtPhy.NonGfPresent = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent;      \\\n\tNdisMoveMemory((_pAd)->MacTab.Content[BSSID_WCID].HTCapability.MCSSet, (_pAd)->StaActive.SupportedPhyInfo.MCSSet, sizeof(UCHAR) * 16);\\\n}\n\n#define COPY_AP_HTSETTINGS_FROM_BEACON(_pAd, _pHtCapability)                                 \\\n{                                                                                       \\\n\t_pAd->MacTab.Content[BSSID_WCID].AMsduSize = (UCHAR)(_pHtCapability->HtCapInfo.AMsduSize);\t\\\n\t_pAd->MacTab.Content[BSSID_WCID].MmpsMode= (UCHAR)(_pHtCapability->HtCapInfo.MimoPs);\t\\\n\t_pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor = (UCHAR)(_pHtCapability->HtCapParm.MaxRAmpduFactor);\t\\\n}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n#define COPY_VHT_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd)                                 \\\n{                                                                                       \\\n}\n#endif /* DOT11_VHT_AC */\n\n\n/*\n\tCommon fragment list structure -  Identical to the scatter gather frag list structure\n*/\n#define NIC_MAX_PHYS_BUF_COUNT              8\n\ntypedef struct _RTMP_SCATTER_GATHER_ELEMENT {\n\tPVOID Address;\n\tULONG Length;\n\tPULONG Reserved;\n} RTMP_SCATTER_GATHER_ELEMENT, *PRTMP_SCATTER_GATHER_ELEMENT;\n\ntypedef struct _RTMP_SCATTER_GATHER_LIST {\n\tULONG NumberOfElements;\n\tPULONG Reserved;\n\tRTMP_SCATTER_GATHER_ELEMENT Elements[NIC_MAX_PHYS_BUF_COUNT];\n} RTMP_SCATTER_GATHER_LIST, *PRTMP_SCATTER_GATHER_LIST;\n\n\n/*\n\tSome utility macros\n*/\n#ifndef min\n#define min(_a, _b)     (((_a) < (_b)) ? (_a) : (_b))\n#endif\n\n#ifndef max\n#define max(_a, _b)     (((_a) > (_b)) ? (_a) : (_b))\n#endif\n\n#define GET_LNA_GAIN(_pAd)\t((_pAd->LatchRfRegs.Channel <= 14) ? (_pAd->BLNAGain) : ((_pAd->LatchRfRegs.Channel <= 64) ? (_pAd->ALNAGain0) : ((_pAd->LatchRfRegs.Channel <= 128) ? (_pAd->ALNAGain1) : (_pAd->ALNAGain2))))\n\n#define INC_COUNTER64(Val)          (Val.QuadPart++)\n\n#define INFRA_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_INFRA_ON))\n#define ADHOC_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_ADHOC_ON))\n#define MONITOR_ON(_p)              (((_p)->StaCfg.BssType) == BSS_MONITOR)\n#define IDLE_ON(_p)                 (!INFRA_ON(_p) && !ADHOC_ON(_p))\n\n/* Check LEAP & CCKM flags */\n#define LEAP_ON(_p)                 (((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP)\n#define LEAP_CCKM_ON(_p)            ((((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP) && ((_p)->StaCfg.LeapAuthInfo.CCKM == TRUE))\n\n/* if orginal Ethernet frame contains no LLC/SNAP, then an extra LLC/SNAP encap is required */\n#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(_pBufVA, _pExtraLlcSnapEncap)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (((*(_pBufVA + 12) << 8) + *(_pBufVA + 13)) > 1500)\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pExtraLlcSnapEncap = SNAP_802_1H;\t\t\t\t\t\t\\\n\t\tif (NdisEqualMemory(IPX, _pBufVA + 12, 2) || \t\t\t\\\n\t\t\tNdisEqualMemory(APPLE_TALK, _pBufVA + 12, 2))\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pExtraLlcSnapEncap = NULL;\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n/* New Define for new Tx Path. */\n#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(_pBufVA, _pExtraLlcSnapEncap)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (((*(_pBufVA) << 8) + *(_pBufVA + 1)) > 1500)\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pExtraLlcSnapEncap = SNAP_802_1H;\t\t\t\t\t\t\\\n\t\tif (NdisEqualMemory(IPX, _pBufVA, 2) || \t\t\t\t\\\n\t\t\tNdisEqualMemory(APPLE_TALK, _pBufVA, 2))\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pExtraLlcSnapEncap = NULL;\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n#define MAKE_802_3_HEADER(_p, _pMac1, _pMac2, _pType)                   \\\n{                                                                       \\\n    NdisMoveMemory(_p, _pMac1, MAC_ADDR_LEN);                           \\\n    NdisMoveMemory((_p + MAC_ADDR_LEN), _pMac2, MAC_ADDR_LEN);          \\\n    NdisMoveMemory((_p + MAC_ADDR_LEN * 2), _pType, LENGTH_802_3_TYPE); \\\n}\n\n/*\n\tif pData has no LLC/SNAP (neither RFC1042 nor Bridge tunnel),\n\t\tkeep it that way.\n\telse if the received frame is LLC/SNAP-encaped IPX or APPLETALK,\n\t\tpreserve the LLC/SNAP field\n\telse remove the LLC/SNAP field from the result Ethernet frame\n\n\tPatch for WHQL only, which did not turn on Netbios but use IPX within its payload\n\tNote:\n\t\t_pData & _DataSize may be altered (remove 8-byte LLC/SNAP) by this MACRO\n\t\t_pRemovedLLCSNAP: pointer to removed LLC/SNAP; NULL is not removed\n*/\n#define CONVERT_TO_802_3(_p8023hdr, _pDA, _pSA, _pData, _DataSize, _pRemovedLLCSNAP)      \\\n{                                                                       \\\n    char LLC_Len[2];                                                    \\\n                                                                        \\\n    _pRemovedLLCSNAP = NULL;                                            \\\n    if (NdisEqualMemory(SNAP_802_1H, _pData, 6)  ||                     \\\n        NdisEqualMemory(SNAP_BRIDGE_TUNNEL, _pData, 6))                 \\\n    {                                                                   \\\n        PUCHAR pProto = _pData + 6;                                     \\\n                                                                        \\\n        if ((NdisEqualMemory(IPX, pProto, 2) || NdisEqualMemory(APPLE_TALK, pProto, 2)) &&  \\\n            NdisEqualMemory(SNAP_802_1H, _pData, 6))                    \\\n        {                                                               \\\n            LLC_Len[0] = (UCHAR)(_DataSize >> 8);                       \\\n            LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1));                \\\n            MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len);          \\\n        }                                                               \\\n        else                                                            \\\n        {                                                               \\\n            MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, pProto);           \\\n            _pRemovedLLCSNAP = _pData;                                  \\\n            _DataSize -= LENGTH_802_1_H;                                \\\n            _pData += LENGTH_802_1_H;                                   \\\n        }                                                               \\\n    }                                                                   \\\n    else                                                                \\\n    {                                                                   \\\n        LLC_Len[0] = (UCHAR)(_DataSize >> 8);                           \\\n        LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1));                    \\\n        MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len);              \\\n    }                                                                   \\\n}\n\n/*\n\tEnqueue this frame to MLME engine\n\tWe need to enqueue the whole frame because MLME need to pass data type\n\tinformation from 802.11 header\n*/\n#ifdef RTMP_MAC_USB\n#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, _Rssi1, _Rssi2, _MinSNR, _AntSel, _OpMode)        \\\n{                                                                                       \\\n    UINT32 High32TSF=0, Low32TSF=0;                                                          \\\n    MlmeEnqueueForRecv(_pAd, Wcid, High32TSF, Low32TSF, (UCHAR)_Rssi0, (UCHAR)_Rssi1,(UCHAR)_Rssi2 ,_AntSel, _FrameSize, _pFrame, (UCHAR)_MinSNR, _OpMode);   \\\n}\n#endif /* RTMP_MAC_USB */\n\n#define MAC_ADDR_EQUAL(pAddr1,pAddr2)           RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), MAC_ADDR_LEN)\n#define SSID_EQUAL(ssid1, len1, ssid2, len2)    ((len1==len2) && (RTMPEqualMemory(ssid1, ssid2, len1)))\n\n\n#ifdef CONFIG_STA_SUPPORT\n#define STA_EXTRA_SETTING(_pAd)\n\n#define STA_PORT_SECURED(_pAd) \\\n{ \\\n\tBOOLEAN\tCancelled; \\\n\t(_pAd)->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \\\n\tRTMP_IndicateMediaState(_pAd, NdisMediaStateConnected); \\\n\tNdisAcquireSpinLock(&((_pAd)->MacTabLock)); \\\n\t(_pAd)->MacTab.Content[BSSID_WCID].PortSecured = (_pAd)->StaCfg.PortSecured; \\\n\t(_pAd)->MacTab.Content[BSSID_WCID].PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\\\n\tNdisReleaseSpinLock(&(_pAd)->MacTabLock); \\\n\tRTMPCancelTimer(&((_pAd)->Mlme.LinkDownTimer), &Cancelled);\\\n\tSTA_EXTRA_SETTING(_pAd); \\\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/* */\n/*  Data buffer for DMA operation, the buffer must be contiguous physical memory */\n/*  Both DMA to / from CPU use the same structure. */\n/* */\ntypedef struct _RTMP_DMABUF {\n\tULONG AllocSize;\n\tPVOID AllocVa;\t\t/* TxBuf virtual address */\n\tNDIS_PHYSICAL_ADDRESS AllocPa;\t/* TxBuf physical address */\n} RTMP_DMABUF, *PRTMP_DMABUF;\n\n/* */\n/* Control block (Descriptor) for all ring descriptor DMA operation, buffer must be */\n/* contiguous physical memory. NDIS_PACKET stored the binding Rx packet descriptor */\n/* which won't be released, driver has to wait until upper layer return the packet */\n/* before giveing up this rx ring descriptor to ASIC. NDIS_BUFFER is assocaited pair */\n/* to describe the packet buffer. For Tx, NDIS_PACKET stored the tx packet descriptor */\n/* which driver should ACK upper layer when the tx is physically done or failed. */\n/* */\ntypedef struct _RTMP_DMACB {\n\tULONG AllocSize;\t/* Control block size */\n\tPVOID AllocVa;\t\t/* Control block virtual address */\n\tNDIS_PHYSICAL_ADDRESS AllocPa;\t/* Control block physical address */\n\tPNDIS_PACKET pNdisPacket;\n\tPNDIS_PACKET pNextNdisPacket;\n\n\tRTMP_DMABUF DmaBuf;\t/* Associated DMA buffer structure */\n#ifdef CACHE_LINE_32B\n\tRXD_STRUC LastBDInfo;\n#endif /* CACHE_LINE_32B */\n} RTMP_DMACB, *PRTMP_DMACB;\n\ntypedef struct _RTMP_TX_RING {\n\tRTMP_DMACB Cell[TX_RING_SIZE];\n\tUINT32 TxCpuIdx;\n\tUINT32 TxDmaIdx;\n\tUINT32 TxSwFreeIdx;\t/* software next free tx index */\n} RTMP_TX_RING, *PRTMP_TX_RING;\n\ntypedef struct _RTMP_RX_RING {\n\tRTMP_DMACB Cell[RX_RING_SIZE];\n\tUINT32 RxCpuIdx;\n\tUINT32 RxDmaIdx;\n\tINT32 RxSwReadIdx;\t/* software next read index */\n} RTMP_RX_RING, *PRTMP_RX_RING;\n\ntypedef struct _RTMP_MGMT_RING {\n\tRTMP_DMACB Cell[MGMT_RING_SIZE];\n\tUINT32 TxCpuIdx;\n\tUINT32 TxDmaIdx;\n\tUINT32 TxSwFreeIdx;\t/* software next free tx index */\n} RTMP_MGMT_RING, *PRTMP_MGMT_RING;\n\ntypedef struct _RTMP_CTRL_RING {\n\tRTMP_DMACB Cell[16];\n\tUINT32 TxCpuIdx;\n\tUINT32 TxDmaIdx;\n\tUINT32 TxSwFreeIdx;\t/* software next free tx index */\n} RTMP_CTRL_RING, *PRTMP_CTRL_RING;\n\n/* */\n/*  Statistic counter structure */\n/* */\ntypedef struct _COUNTER_802_3 {\n\t/* General Stats */\n\tULONG GoodTransmits;\n\tULONG GoodReceives;\n\tULONG TxErrors;\n\tULONG RxErrors;\n\tULONG RxNoBuffer;\n\n\t/* Ethernet Stats */\n\tULONG RcvAlignmentErrors;\n\tULONG OneCollision;\n\tULONG MoreCollisions;\n\n} COUNTER_802_3, *PCOUNTER_802_3;\n\ntypedef struct _COUNTER_802_11 {\n\tULONG Length;\n/*\tLARGE_INTEGER   LastTransmittedFragmentCount; */\n\tLARGE_INTEGER TransmittedFragmentCount;\n\tLARGE_INTEGER MulticastTransmittedFrameCount;\n\tLARGE_INTEGER FailedCount;\n\tLARGE_INTEGER RetryCount;\n\tLARGE_INTEGER MultipleRetryCount;\n\tLARGE_INTEGER RTSSuccessCount;\n\tLARGE_INTEGER RTSFailureCount;\n\tLARGE_INTEGER ACKFailureCount;\n\tLARGE_INTEGER FrameDuplicateCount;\n\tLARGE_INTEGER ReceivedFragmentCount;\n\tLARGE_INTEGER MulticastReceivedFrameCount;\n\tLARGE_INTEGER FCSErrorCount;\n\tLARGE_INTEGER TransmittedFrameCount;\n\tLARGE_INTEGER WEPUndecryptableCount;\n\tLARGE_INTEGER TransmitCountFrmOs;\n} COUNTER_802_11, *PCOUNTER_802_11;\n\n\n#ifdef RT3290\ntypedef struct _ANT_DIVERSITY\n{\n\tBOOLEAN\t\tRateUp;\n\tULONG\t\tTrainCounter;\n\tULONG\t\tAntennaDiversityState;\t// 0->Stable state 1->training state\n\tULONG\t\tAntennaDiversityPER[2];  // 0 ->main 1->aux\n\tULONG\t\tAntennaDiversityTxPacketCount[2];  // 0 ->main 1->aux\t\n\tULONG\t\tAntennaDiversityRxPacketCount[2];\n\tCHAR\t\tRssi[2];\n\tULONG\t\tAntennaDiversityCount;\n\tULONG\t\tAntennaDiversityTrigger;\t\n}ANT_DIVERSITY, *PANT_DIVERSITY;\n#endif /* RT3290 */\n\ntypedef struct _COUNTER_RALINK {\n\tUINT32 OneSecStart;\t/* for one sec count clear use */\n\tUINT32 OneSecBeaconSentCnt;\n\tUINT32 OneSecFalseCCACnt;\t/* CCA error count, for debug purpose, might move to global counter */\n\tUINT32 OneSecRxFcsErrCnt;\t/* CRC error */\n\tUINT32 OneSecRxOkCnt;\t/* RX without error */\n\tUINT32 OneSecTxFailCount;\n\tUINT32 OneSecTxNoRetryOkCount;\n\tUINT32 OneSecTxRetryOkCount;\n\tUINT32 OneSecRxOkDataCnt;\t/* unicast-to-me DATA frame count */\n\tUINT32 OneSecTransmittedByteCount;\t/* both successful and failure, used to calculate TX throughput */\n\n\tULONG OneSecOsTxCount[NUM_OF_TX_RING];\n\tULONG OneSecDmaDoneCount[NUM_OF_TX_RING];\n\tUINT32 OneSecTxDoneCount;\n\tULONG OneSecRxCount;\n\tUINT32 OneSecReceivedByteCount;\n\tUINT32 OneSecTxAggregationCount;\n\tUINT32 OneSecRxAggregationCount;\n\tUINT32 OneSecEnd;\t/* for one sec count clear use */\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tUINT16 FalseCCACnt_100MS[MLME_TASK_EXEC_MULTIPLE]; /* one handred millisecond false CCA Count */\n\tUINT16 PLCPErrCnt_100MS[MLME_TASK_EXEC_MULTIPLE]; /* one handred millisecond PLCP Error Count */\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\tULONG TransmittedByteCount;\t/* both successful and failure, used to calculate TX throughput */\n\tULONG ReceivedByteCount;\t/* both CRC okay and CRC error, used to calculate RX throughput */\n#ifdef RT3290\n\t// TODO: shiang, check the purpose of following parameter\n\tULONG OneSecRxOkCnt2; /* RX without error */\n#endif /* RT3290 */\n\tULONG BadCQIAutoRecoveryCount;\n\tULONG PoorCQIRoamingCount;\n\tULONG MgmtRingFullCount;\n\tULONG RxCountSinceLastNULL;\n\tULONG RxCount;\n\tULONG KickTxCount;\n\tLARGE_INTEGER RealFcsErrCount;\n\tULONG PendingNdisPacketCount;\n\tULONG FalseCCACnt;                    /* CCA error count */\n\n\tUINT32 LastOneSecTotalTxCount;\t/* OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount */\n\tUINT32 LastOneSecRxOkDataCnt;\t/* OneSecRxOkDataCnt */\n\tULONG DuplicateRcv;\n\tULONG TxAggCount;\n\tULONG TxNonAggCount;\n\tULONG TxAgg1MPDUCount;\n\tULONG TxAgg2MPDUCount;\n\tULONG TxAgg3MPDUCount;\n\tULONG TxAgg4MPDUCount;\n\tULONG TxAgg5MPDUCount;\n\tULONG TxAgg6MPDUCount;\n\tULONG TxAgg7MPDUCount;\n\tULONG TxAgg8MPDUCount;\n\tULONG TxAgg9MPDUCount;\n\tULONG TxAgg10MPDUCount;\n\tULONG TxAgg11MPDUCount;\n\tULONG TxAgg12MPDUCount;\n\tULONG TxAgg13MPDUCount;\n\tULONG TxAgg14MPDUCount;\n\tULONG TxAgg15MPDUCount;\n\tULONG TxAgg16MPDUCount;\n\n\tLARGE_INTEGER TransmittedOctetsInAMSDU;\n\tLARGE_INTEGER TransmittedAMSDUCount;\n\tLARGE_INTEGER ReceivedOctesInAMSDUCount;\n\tLARGE_INTEGER ReceivedAMSDUCount;\n\tLARGE_INTEGER TransmittedAMPDUCount;\n\tLARGE_INTEGER TransmittedMPDUsInAMPDUCount;\n\tLARGE_INTEGER TransmittedOctetsInAMPDUCount;\n\tLARGE_INTEGER MPDUInReceivedAMPDUCount;\n} COUNTER_RALINK, *PCOUNTER_RALINK;\n\ntypedef struct _COUNTER_DRS {\n\t/* to record the each TX rate's quality. 0 is best, the bigger the worse. */\n\tUSHORT TxQuality[MAX_TX_RATE_INDEX+1];\n\tUCHAR PER[MAX_TX_RATE_INDEX+1];\n\tUCHAR TxRateUpPenalty;\t/* extra # of second penalty due to last unstable condition */\n\tULONG CurrTxRateStableTime;\t/* # of second in current TX rate */\n\t/*BOOLEAN         fNoisyEnvironment; */\n\tBOOLEAN fLastSecAccordingRSSI;\n\tUCHAR LastSecTxRateChangeAction;\t/* 0: no change, 1:rate UP, 2:rate down */\n\tUCHAR LastTimeTxRateChangeAction;\t/*Keep last time value of LastSecTxRateChangeAction */\n\tULONG LastTxOkCount;\n} COUNTER_DRS, *PCOUNTER_DRS;\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef TXBF_SUPPORT\ntypedef\n    struct {\n\tULONG TxSuccessCount;\n\tULONG TxRetryCount;\n\tULONG TxFailCount;\n\tULONG ETxSuccessCount;\n\tULONG ETxRetryCount;\n\tULONG ETxFailCount;\n\tULONG ITxSuccessCount;\n\tULONG ITxRetryCount;\n\tULONG ITxFailCount;\n} COUNTER_TXBF;\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef STREAM_MODE_SUPPORT\ntypedef struct _STREAM_MODE_ENTRY_{\n#define STREAM_MODE_STATIC\t\t1\n\tUSHORT flag;\n\tUCHAR macAddr[MAC_ADDR_LEN];\n}STREAM_MODE_ENTRY;\n#endif /* STREAM_MODE_SUPPORT */\n\n/* for Microwave oven */\n#ifdef MICROWAVE_OVEN_SUPPORT\ntypedef struct _MO_CFG_STRUCT {\n\tBOOLEAN\t\tbEnable;\n\tUINT8  \t\tnPeriod_Cnt; \t/* measurement period 100ms, mitigate the interference period 900 ms */\n\tUINT16 \t\tnFalseCCACnt;\t\n\tUINT16\t\tnFalseCCATh;\t/* default is 100 */\n#ifdef MT7601\n\tUINT32\t\tStored_BBP_R65;\n\tUCHAR\t\tStored_RF_B5_R6;\n\tUCHAR\t\tStored_RF_B5_R7;\n#endif /* MT7601 */\n} MO_CFG_STRUCT, *PMO_CFG_STRUCT;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n/***************************************************************************\n  *\tsecurity key related data structure\n  **************************************************************************/\n\n/* structure to define WPA Group Key Rekey Interval */\ntypedef struct GNU_PACKED _RT_802_11_WPA_REKEY {\n\tULONG ReKeyMethod;\t/* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */\n\tULONG ReKeyInterval;\t/* time-based: seconds, packet-based: kilo-packets */\n} RT_WPA_REKEY,*PRT_WPA_REKEY, RT_802_11_WPA_REKEY, *PRT_802_11_WPA_REKEY;\n\n\n#ifdef RTMP_MAC_USB\n/***************************************************************************\n  *\tRTUSB I/O related data structure\n  **************************************************************************/\n\n/* for USB interface, avoid in interrupt when write key */\ntypedef struct RT_ADD_PAIRWISE_KEY_ENTRY {\n\tUCHAR MacAddr[6];\n\tUSHORT MacTabMatchWCID;\t/* ASIC */\n\tCIPHER_KEY CipherKey;\n} RT_ADD_PAIRWISE_KEY_ENTRY,*PRT_ADD_PAIRWISE_KEY_ENTRY;\n\n\n/* Cipher suite type for mixed mode group cipher, P802.11i-2004 */\ntypedef enum _RT_802_11_CIPHER_SUITE_TYPE {\n\tCipher_Type_NONE,\n\tCipher_Type_WEP40,\n\tCipher_Type_TKIP,\n\tCipher_Type_RSVD,\n\tCipher_Type_CCMP,\n\tCipher_Type_WEP104\n} RT_802_11_CIPHER_SUITE_TYPE, *PRT_802_11_CIPHER_SUITE_TYPE;\n#endif /* RTMP_MAC_USB */\n\ntypedef struct {\n\tUCHAR Addr[MAC_ADDR_LEN];\n\tUCHAR ErrorCode[2];\t/*00 01-Invalid authentication type */\n\t/*00 02-Authentication timeout */\n\t/*00 03-Challenge from AP failed */\n\t/*00 04-Challenge to AP failed */\n\tBOOLEAN Reported;\n} ROGUEAP_ENTRY, *PROGUEAP_ENTRY;\n\ntypedef struct {\n\tUCHAR RogueApNr;\n\tROGUEAP_ENTRY RogueApEntry[MAX_LEN_OF_BSS_TABLE];\n} ROGUEAP_TABLE, *PROGUEAP_TABLE;\n\n/*\n  *\tFragment Frame structure\n  */\ntypedef struct _FRAGMENT_FRAME {\n\tPNDIS_PACKET pFragPacket;\n\tULONG RxSize;\n\tUSHORT Sequence;\n\tUSHORT LastFrag;\n\tULONG Flags;\t\t/* Some extra frame information. bit 0: LLC presented */\n} FRAGMENT_FRAME, *PFRAGMENT_FRAME;\n\n\n/* */\n/* Tkip Key structure which RC4 key & MIC calculation */\n/* */\ntypedef struct _TKIP_KEY_INFO {\n\tUINT nBytesInM;\t\t/* # bytes in M for MICKEY */\n\tULONG IV16;\n\tULONG IV32;\n\tULONG K0;\t\t/* for MICKEY Low */\n\tULONG K1;\t\t/* for MICKEY Hig */\n\tULONG L;\t\t/* Current state for MICKEY */\n\tULONG R;\t\t/* Current state for MICKEY */\n\tULONG M;\t\t/* Message accumulator for MICKEY */\n\tUCHAR RC4KEY[16];\n\tUCHAR MIC[8];\n} TKIP_KEY_INFO, *PTKIP_KEY_INFO;\n\n\n/* */\n/* Private / Misc data, counters for driver internal use */\n/* */\ntypedef struct __PRIVATE_STRUC {\n\tUINT SystemResetCnt;\t/* System reset counter */\n\tUINT TxRingFullCnt;\t/* Tx ring full occurrance number */\n\tUINT PhyRxErrCnt;\t/* PHY Rx error count, for debug purpose, might move to global counter */\n\t/* Variables for WEP encryption / decryption in rtmp_wep.c */\n\t/* Tkip stuff */\n\tTKIP_KEY_INFO Tx;\n\tTKIP_KEY_INFO Rx;\n} PRIVATE_STRUC, *PPRIVATE_STRUC;\n\n\n/***************************************************************************\n  *\tChannel and BBP related data structures\n  **************************************************************************/\n/* structure to tune BBP R66 (BBP TUNING) */\ntypedef struct _BBP_R66_TUNING {\n\tBOOLEAN bEnable;\n\tUSHORT FalseCcaLowerThreshold;\t/* default 100 */\n\tUSHORT FalseCcaUpperThreshold;\t/* default 512 */\n\tUCHAR R66Delta;\n\tUCHAR R66CurrentValue;\n\tBOOLEAN R66LowerUpperSelect;\t/*Before LinkUp, Used LowerBound or UpperBound as R66 value. */\n} BBP_R66_TUNING, *PBBP_R66_TUNING;\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n#define EFFECTED_CH_SECONDARY 0x1\n#define EFFECTED_CH_PRIMARY\t0x2\n#define EFFECTED_CH_LEGACY\t\t0x4\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n/* structure to store channel TX power */\ntypedef struct _CHANNEL_TX_POWER {\n\tUSHORT RemainingTimeForUse;\t/*unit: sec */\n\tUCHAR Channel;\n#ifdef DOT11N_DRAFT3\n\tBOOLEAN bEffectedChannel;\t/* For BW 40 operating in 2.4GHz , the \"effected channel\" is the channel that is covered in 40Mhz. */\n#endif /* DOT11N_DRAFT3 */\n\tCHAR Power;\n\tCHAR Power2;\n#ifdef DOT11N_SS3_SUPPORT\n\tCHAR Power3;\n#endif /* DOT11N_SS3_SUPPORT */\n\tUCHAR MaxTxPwr;\n\tUCHAR DfsReq;\n\tUCHAR RegulatoryDomain;\n\n/*\n\tChannel property:\n \n\tCHANNEL_DISABLED: The channel is disabled.\n\tCHANNEL_PASSIVE_SCAN: Only passive scanning is allowed.\n\tCHANNEL_NO_IBSS: IBSS is not allowed.\n\tCHANNEL_RADAR: Radar detection is required.\n\tCHANNEL_NO_FAT_ABOVE: Extension channel above this channel is not allowed.\n\tCHANNEL_NO_FAT_BELOW: Extension channel below this channel is not allowed.\n\tCHANNEL_40M_CAP: 40 BW channel group\n */\n#define CHANNEL_DEFAULT_PROP\t0x00\n#define CHANNEL_DISABLED\t\t0x01\t/* no use */\n#define CHANNEL_PASSIVE_SCAN\t0x02\n#define CHANNEL_NO_IBSS\t\t\t0x04\n#define CHANNEL_RADAR\t\t\t0x08\n#define CHANNEL_NO_FAT_ABOVE\t0x10\n#define CHANNEL_NO_FAT_BELOW\t0x20\n#define CHANNEL_40M_CAP\t\t\t0x40\n\n\tUCHAR Flags;\n\n} CHANNEL_TX_POWER, *PCHANNEL_TX_POWER;\n\n/* Channel list subset */\ntypedef struct _CHANNEL_LIST_SUB {\n\tUCHAR\tChannel;\n\tUCHAR\tIdxMap; /* Index mapping to original channel list */\n} CHANNEL_LIST_SUB, *PCHANNEL_LIST_SUB;\n\n\ntypedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT {\n\tUCHAR EvaluatePeriod;\t/* 0:not evalute status, 1: evaluate status, 2: switching status */\n\tUCHAR EvaluateStableCnt;\n\tUCHAR Pair1PrimaryRxAnt;\t/* 0:Ant-E1, 1:Ant-E2 */\n\tUCHAR Pair1SecondaryRxAnt;\t/* 0:Ant-E1, 1:Ant-E2 */\n#ifdef CONFIG_STA_SUPPORT\n\tSHORT Pair1AvgRssi[2];\t/* AvgRssi[0]:E1, AvgRssi[1]:E2 */\n\tSHORT Pair2AvgRssi[2];\t/* AvgRssi[0]:E3, AvgRssi[1]:E4 */\n\tSHORT CRC_Cnt[2];\t\t/* RX CRC count */\n\tSHORT CCK_SNR[2];\t\t/* RX CCK SNR */\n\tSHORT OFDM_SNR[2];\t\t/* RX OFDM SNR */\n\tUCHAR CCK_Cnt[2];\t\t/* RX CCK packet count */\n\tUCHAR OFDM_Cnt[2];\t\t/* RX OFDM packet count */\n#endif /* CONFIG_STA_SUPPORT */\n\tSHORT Pair1LastAvgRssi;\t/* */\n\tSHORT Pair2LastAvgRssi;\t/* */\n\tULONG RcvPktNumWhenEvaluate;\n\tBOOLEAN FirstPktArrivedWhenEvaluate;\n#ifdef CONFIG_AP_SUPPORT\n\tLONG Pair1AvgRssiGroup1[2];\n\tLONG Pair1AvgRssiGroup2[2];\n\tULONG RcvPktNum[2];\n#endif /* CONFIG_AP_SUPPORT */\n} SOFT_RX_ANT_DIVERSITY, *PSOFT_RX_ANT_DIVERSITY;\n\ntypedef enum _ABGBAND_STATE_ {\n\tUNKNOWN_BAND,\n\tBG_BAND,\n\tA_BAND,\n} ABGBAND_STATE;\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n/***************************************************************************\n  *\tstructure for MLME state machine\n  **************************************************************************/\ntypedef struct _MLME_STRUCT {\n#ifdef CONFIG_STA_SUPPORT\n\t/* STA state machines */\n\tSTATE_MACHINE CntlMachine;\n\tSTATE_MACHINE AssocMachine;\n\tSTATE_MACHINE AuthMachine;\n\tSTATE_MACHINE AuthRspMachine;\n\tSTATE_MACHINE SyncMachine;\n\tSTATE_MACHINE WpaPskMachine;\n\tSTATE_MACHINE LeapMachine;\n\tSTATE_MACHINE_FUNC AssocFunc[ASSOC_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC AuthFunc[AUTH_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC AuthRspFunc[AUTH_RSP_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC SyncFunc[SYNC_FUNC_SIZE];\n\n#endif /* CONFIG_STA_SUPPORT */\n\tSTATE_MACHINE_FUNC ActFunc[ACT_FUNC_SIZE];\n\t/* Action */\n\tSTATE_MACHINE ActMachine;\n\n#ifdef WSC_INCLUDED\n\tSTATE_MACHINE WscMachine;\n\tSTATE_MACHINE_FUNC WscFunc[WSC_FUNC_SIZE];\n\n#ifdef IWSC_SUPPORT\n\tSTATE_MACHINE\t\t\tIWscMachine;\n\tSTATE_MACHINE_FUNC\t\tIWscFunc[IWSC_FUNC_SIZE];\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n#ifdef QOS_DLS_SUPPORT\n\tSTATE_MACHINE DlsMachine;\n\tSTATE_MACHINE_FUNC DlsFunc[DLS_FUNC_SIZE];\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\tSTATE_MACHINE TdlsMachine;\n\tSTATE_MACHINE_FUNC TdlsFunc[TDLS_FUNC_SIZE];\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* AP state machines */\n\tSTATE_MACHINE ApAssocMachine;\n\tSTATE_MACHINE ApAuthMachine;\n\tSTATE_MACHINE ApSyncMachine;\n\tSTATE_MACHINE_FUNC ApAssocFunc[AP_ASSOC_FUNC_SIZE];\n/*\tSTATE_MACHINE_FUNC\t\tApDlsFunc[DLS_FUNC_SIZE]; */\n\tSTATE_MACHINE_FUNC ApAuthFunc[AP_AUTH_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC ApSyncFunc[AP_SYNC_FUNC_SIZE];\n#ifdef APCLI_SUPPORT\n\tSTATE_MACHINE ApCliAuthMachine;\n\tSTATE_MACHINE ApCliAssocMachine;\n\tSTATE_MACHINE ApCliCtrlMachine;\n\tSTATE_MACHINE ApCliSyncMachine;\n\tSTATE_MACHINE ApCliWpaPskMachine;\n\n\tSTATE_MACHINE_FUNC ApCliAuthFunc[APCLI_AUTH_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC ApCliAssocFunc[APCLI_ASSOC_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC ApCliCtrlFunc[APCLI_CTRL_FUNC_SIZE];\n\tSTATE_MACHINE_FUNC ApCliSyncFunc[APCLI_SYNC_FUNC_SIZE];\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* common WPA state machine */\n\tSTATE_MACHINE WpaMachine;\n\tSTATE_MACHINE_FUNC WpaFunc[WPA_FUNC_SIZE];\n\n\n\tULONG ChannelQuality;\t/* 0..100, Channel Quality Indication for Roaming */\n\tULONG Now32;\t\t/* latch the value of NdisGetSystemUpTime() */\n\tULONG LastSendNULLpsmTime;\n\n\tBOOLEAN bRunning;\n\tNDIS_SPIN_LOCK TaskLock;\n\tMLME_QUEUE Queue;\n\n\tUINT ShiftReg;\n\n\tRALINK_TIMER_STRUCT PeriodicTimer;\n\tRALINK_TIMER_STRUCT APSDPeriodicTimer;\n\tRALINK_TIMER_STRUCT LinkDownTimer;\n\tRALINK_TIMER_STRUCT LinkUpTimer;\n\tULONG PeriodicRound;\n\tULONG GPIORound;\n\tULONG OneSecPeriodicRound;\n\n\tUCHAR RealRxPath;\n\tBOOLEAN bLowThroughput;\n\tBOOLEAN bEnableAutoAntennaCheck;\n\tRALINK_TIMER_STRUCT RxAntEvalTimer;\n\n\n#ifdef RTMP_MAC_USB\n\tRALINK_TIMER_STRUCT AutoWakeupTimer;\n\tBOOLEAN AutoWakeupTimerRunning;\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tRALINK_TIMER_STRUCT MCCTimer;\n\n\tRALINK_TIMER_STRUCT ConcurrentP2PConnectTimer;\n\tUINT32 HCCAToEDCATimerValue;\n\tUINT32 EDCAToHCCATimerValue;\n\tBOOLEAN ConcurrentP2PConnectTimerRunning;\n\tUINT32 StaStayTick;\n\tUINT32 P2pStayTick;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef CONFIG_STA_SUPPORT\n\tBOOLEAN bSendNullFrameAfterWareUp;\n#endif /* CONFIG_STA_SUPPORT */\n} MLME_STRUCT, *PMLME_STRUCT;\n\n#ifdef DOT11_N_SUPPORT\n/***************************************************************************\n  *\t802.11 N related data structures\n  **************************************************************************/\nstruct reordering_mpdu {\n\tstruct reordering_mpdu *next;\n\tPNDIS_PACKET pPacket;\t/* coverted to 802.3 frame */\n\tint Sequence;\t\t/* sequence number of MPDU */\n\tBOOLEAN bAMSDU;\n\tUCHAR\t\t\t\t\tOpMode;\n};\n\nstruct reordering_list {\n\tstruct reordering_mpdu *next;\n\tint qlen;\n};\n\nstruct reordering_mpdu_pool {\n\tPVOID mem;\n\tNDIS_SPIN_LOCK lock;\n\tstruct reordering_list freelist;\n};\n\ntypedef enum _REC_BLOCKACK_STATUS {\n\tRecipient_NONE = 0,\n\tRecipient_USED,\n\tRecipient_HandleRes,\n\tRecipient_Accept\n} REC_BLOCKACK_STATUS, *PREC_BLOCKACK_STATUS;\n\ntypedef enum _ORI_BLOCKACK_STATUS {\n\tOriginator_NONE = 0,\n\tOriginator_USED,\n\tOriginator_WaitRes,\n\tOriginator_Done\n} ORI_BLOCKACK_STATUS, *PORI_BLOCKACK_STATUS;\n\ntypedef struct _BA_ORI_ENTRY {\n\tUCHAR Wcid;\n\tUCHAR TID;\n\tUCHAR BAWinSize;\n\tUCHAR Token;\n/* Sequence is to fill every outgoing QoS DATA frame's sequence field in 802.11 header. */\n\tUSHORT Sequence;\n\tUSHORT TimeOutValue;\n\tORI_BLOCKACK_STATUS ORI_BA_Status;\n\tRALINK_TIMER_STRUCT ORIBATimer;\n\tPVOID pAdapter;\n} BA_ORI_ENTRY, *PBA_ORI_ENTRY;\n\ntypedef struct _BA_REC_ENTRY {\n\tUCHAR Wcid;\n\tUCHAR TID;\n\tUCHAR BAWinSize;\t/* 7.3.1.14. each buffer is capable of holding a max AMSDU or MSDU. */\n\t/*UCHAR NumOfRxPkt; */\n\t/*UCHAR    Curindidx; // the head in the RX reordering buffer */\n\tUSHORT LastIndSeq;\n/*\tUSHORT\t\tLastIndSeqAtTimer; */\n\tUSHORT TimeOutValue;\n\tRALINK_TIMER_STRUCT RECBATimer;\n\tULONG LastIndSeqAtTimer;\n\tULONG nDropPacket;\n\tULONG rcvSeq;\n\tREC_BLOCKACK_STATUS REC_BA_Status;\n/*\tUCHAR\tRxBufIdxUsed; */\n\t/* corresponding virtual address for RX reordering packet storage. */\n\t/*RTMP_REORDERDMABUF MAP_RXBuf[MAX_RX_REORDERBUF]; */\n\tNDIS_SPIN_LOCK RxReRingLock;\t/* Rx Ring spinlock */\n/*\tstruct _BA_REC_ENTRY *pNext; */\n\tPVOID pAdapter;\n\tstruct reordering_list list;\n} BA_REC_ENTRY, *PBA_REC_ENTRY;\n\n\ntypedef struct {\n\tULONG numAsRecipient;\t/* I am recipient of numAsRecipient clients. These client are in the BARecEntry[] */\n\tULONG numAsOriginator;\t/* I am originator of   numAsOriginator clients. These clients are in the BAOriEntry[] */\n\tULONG numDoneOriginator;\t/* count Done Originator sessions */\n\tBA_ORI_ENTRY BAOriEntry[MAX_LEN_OF_BA_ORI_TABLE];\n\tBA_REC_ENTRY BARecEntry[MAX_LEN_OF_BA_REC_TABLE];\n} BA_TABLE, *PBA_TABLE;\n\n/*For QureyBATableOID use; */\ntypedef struct GNU_PACKED _OID_BA_REC_ENTRY {\n\tUCHAR MACAddr[MAC_ADDR_LEN];\n\tUCHAR BaBitmap;\t\t/* if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize */\n\tUCHAR rsv;\n\tUCHAR BufSize[8];\n\tREC_BLOCKACK_STATUS REC_BA_Status[8];\n} OID_BA_REC_ENTRY, *POID_BA_REC_ENTRY;\n\n/*For QureyBATableOID use; */\ntypedef struct GNU_PACKED _OID_BA_ORI_ENTRY {\n\tUCHAR MACAddr[MAC_ADDR_LEN];\n\tUCHAR BaBitmap;\t\t/* if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize, read ORI_BA_Status[TID] for status */\n\tUCHAR rsv;\n\tUCHAR BufSize[8];\n\tORI_BLOCKACK_STATUS ORI_BA_Status[8];\n} OID_BA_ORI_ENTRY, *POID_BA_ORI_ENTRY;\n\ntypedef struct _QUERYBA_TABLE {\n\tOID_BA_ORI_ENTRY BAOriEntry[32];\n\tOID_BA_REC_ENTRY BARecEntry[32];\n\tUCHAR OriNum;\t\t/* Number of below BAOriEntry */\n\tUCHAR RecNum;\t\t/* Number of below BARecEntry */\n} QUERYBA_TABLE, *PQUERYBA_TABLE;\n\ntypedef union _BACAP_STRUC {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUINT32:4;\n\t\tUINT32 b2040CoexistScanSup:1;\t/*As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz. */\n\t\tUINT32 bHtAdhoc:1;\t/* adhoc can use ht rate. */\n\t\tUINT32 MMPSmode:2;\t/* MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable */\n\t\tUINT32 AmsduSize:1;\t/* 0:3839, 1:7935 bytes. UINT  MSDUSizeToBytes[]        = { 3839, 7935}; */\n\t\tUINT32 AmsduEnable:1;\t/*Enable AMSDU transmisstion */\n\t\tUINT32 MpduDensity:3;\n\t\tUINT32 Policy:2;\t/* 0: DELAY_BA 1:IMMED_BA  (//BA Policy subfiled value in ADDBA frame)   2:BA-not use */\n\t\tUINT32 AutoBA:1;\t/* automatically BA */\n\t\tUINT32 TxBAWinLimit:8;\n\t\tUINT32 RxBAWinLimit:8;\n\t} field;\n#else\n\tstruct {\n\t\tUINT32 RxBAWinLimit:8;\n\t\tUINT32 TxBAWinLimit:8;\n\t\tUINT32 AutoBA:1;\t/* automatically BA */\n\t\tUINT32 Policy:2;\t/* 0: DELAY_BA 1:IMMED_BA  (//BA Policy subfiled value in ADDBA frame)   2:BA-not use */\n\t\tUINT32 MpduDensity:3;\n\t\tUINT32 AmsduEnable:1;\t/*Enable AMSDU transmisstion */\n\t\tUINT32 AmsduSize:1;\t/* 0:3839, 1:7935 bytes. UINT  MSDUSizeToBytes[]        = { 3839, 7935}; */\n\t\tUINT32 MMPSmode:2;\t/* MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable */\n\t\tUINT32 bHtAdhoc:1;\t/* adhoc can use ht rate. */\n\t\tUINT32 b2040CoexistScanSup:1;\t/*As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz. */\n\t\t UINT32:4;\n\t} field;\n#endif\n\tUINT32 word;\n} BACAP_STRUC, *PBACAP_STRUC;\n\ntypedef struct {\n\tBOOLEAN IsRecipient;\n\tUCHAR MACAddr[MAC_ADDR_LEN];\n\tUCHAR TID;\n\tUCHAR nMSDU;\n\tUSHORT TimeOut;\n\tBOOLEAN bAllTid;\t/* If True, delete all TID for BA sessions with this MACaddr. */\n} OID_ADD_BA_ENTRY, *POID_ADD_BA_ENTRY;\n\n#ifdef DOT11N_DRAFT3\ntypedef enum _BSS2040COEXIST_FLAG {\n\tBSS_2040_COEXIST_DISABLE = 0,\n\tBSS_2040_COEXIST_TIMER_FIRED = 1,\n\tBSS_2040_COEXIST_INFO_SYNC = 2,\n\tBSS_2040_COEXIST_INFO_NOTIFY = 4,\n} BSS2040COEXIST_FLAG;\n\ntypedef struct _BssCoexChRange_ {\n\tUCHAR primaryCh;\n\tUCHAR secondaryCh;\n\tUCHAR effectChStart;\n\tUCHAR effectChEnd;\n} BSS_COEX_CH_RANGE;\n#endif /* DOT11N_DRAFT3 */\n\n#define IS_HT_STA(_pMacEntry)\t\\\n\t(_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX)\n\n#define IS_HT_RATE(_pMacEntry)\t\\\n\t(_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)\n\n#define PEER_IS_HT_RATE(_pMacEntry)\t\\\n\t(_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)\n\n#endif /* DOT11_N_SUPPORT */\n\n/*This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second.  (Details see MLMEPeriodic) */\ntypedef struct _IOT_STRUC {\n\tBOOLEAN bRTSLongProtOn;\n#ifdef CONFIG_STA_SUPPORT\n\tBOOLEAN bLastAtheros;\n\tBOOLEAN bCurrentAtheros;\n\tBOOLEAN bNowAtherosBurstOn;\n\tBOOLEAN bNextDisableRxBA;\n\tBOOLEAN bToggle;\n#endif /* CONFIG_STA_SUPPORT */\n} IOT_STRUC, *PIOT_STRUC;\n\n/* This is the registry setting for 802.11n transmit setting.  Used in advanced page. */\ntypedef union _REG_TRANSMIT_SETTING {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUINT32 rsv:13;\n\t\tUINT32 EXTCHA:2;\n\t\tUINT32 HTMODE:1;\n\t\tUINT32 TRANSNO:2;\n\t\tUINT32 STBC:1;\t/*SPACE */\n\t\tUINT32 ShortGI:1;\n\t\tUINT32 BW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\t\tUINT32 TxBF:1;\t/* 3*3 */\n\t\tUINT32 ITxBfEn:1;\n\t\tUINT32 rsv0:9;\n\t\t/*UINT32  MCS:7;                 // MCS */\n\t\t/*UINT32  PhyMode:4; */\n\t} field;\n#else\n\tstruct {\n\t\t/*UINT32  PhyMode:4; */\n\t\t/*UINT32  MCS:7;                 // MCS */\n\t\tUINT32 rsv0:9;\n\t\tUINT32 ITxBfEn:1;\n\t\tUINT32 TxBF:1;\n\t\tUINT32 BW:1;\t/*channel bandwidth 20MHz or 40 MHz */\n\t\tUINT32 ShortGI:1;\n\t\tUINT32 STBC:1;\t/*SPACE */\n\t\tUINT32 TRANSNO:2;\n\t\tUINT32 HTMODE:1;\n\t\tUINT32 EXTCHA:2;\n\t\tUINT32 rsv:13;\n\t} field;\n#endif\n\tUINT32 word;\n} REG_TRANSMIT_SETTING, *PREG_TRANSMIT_SETTING;\n\n\ntypedef union _DESIRED_TRANSMIT_SETTING {\n#ifdef RT_BIG_ENDIAN\n\tstruct {\n\t\tUSHORT rsv:3;\n\t\tUSHORT FixedTxMode:2;\t/* If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode. */\n\t\tUSHORT PhyMode:4;\n\t\tUSHORT MCS:7;\t/* MCS */\n\t} field;\n#else\n\tstruct {\n\t\tUSHORT MCS:7;\t/* MCS */\n\t\tUSHORT PhyMode:4;\n\t\tUSHORT FixedTxMode:2;\t/* If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode. */\n\t\tUSHORT rsv:3;\n\t} field;\n#endif\n\tUSHORT word;\n} DESIRED_TRANSMIT_SETTING, *PDESIRED_TRANSMIT_SETTING;\n\n\nstruct hw_setting{\n\tUCHAR prim_ch;\n\tUCHAR cent_ch;\n\tUCHAR bbp_bw;\n\tUCHAR rf_band;\n};\n\n\nstruct wifi_dev{\n\tNDIS_802_11_AUTHENTICATION_MODE AuthMode;\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\tNDIS_802_11_WEP_STATUS GroupKeyWepStatus;\n\tWPA_MIX_PAIR_CIPHER WpaMixPairCipher;\n\t\n\tRT_PHY_INFO DesiredHtPhyInfo;\n\tDESIRED_TRANSMIT_SETTING DesiredTransmitSetting;\t/* Desired transmit setting. this is for reading registry setting only. not useful. */\n\tBOOLEAN bAutoTxRateSwitch;\n\n\tBOOLEAN bWmmCapable;\t/* 0:disable WMM, 1:enable WMM */\n\t\n\tHTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;\n};\n\n\n#ifdef RTMP_MAC_USB\n/***************************************************************************\n  *\tUSB-based chip Beacon related data structures\n  **************************************************************************/\n#define BEACON_BITMAP_MASK\t\t0xff\ntypedef struct _BEACON_SYNC_STRUCT_ {\n\tUCHAR BeaconBuf[HW_BEACON_MAX_NUM][HW_BEACON_OFFSET];\n\tUCHAR *BeaconTxWI[HW_BEACON_MAX_NUM];\n\tULONG TimIELocationInBeacon[HW_BEACON_MAX_NUM];\n\tULONG CapabilityInfoLocationInBeacon[HW_BEACON_MAX_NUM];\n\tBOOLEAN EnableBeacon;\t/* trigger to enable beacon transmission. */\n\tUCHAR BeaconBitMap;\t/* NOTE: If the MAX_MBSSID_NUM is larger than 8, this parameter need to change. */\n\tUCHAR DtimBitOn;\t/* NOTE: If the MAX_MBSSID_NUM is larger than 8, this parameter need to change. */\n} BEACON_SYNC_STRUCT;\n#endif /* RTMP_MAC_USB */\n\n/***************************************************************************\n  *\tMultiple SSID related data structures\n  **************************************************************************/\n#define WLAN_MAX_NUM_OF_TIM\t\t\t((MAX_LEN_OF_MAC_TABLE >> 3) + 1)\t/* /8 + 1 */\n#define WLAN_CT_TIM_BCMC_OFFSET\t\t0\t/* unit: 32B */\n\n/* clear bcmc TIM bit */\n#define WLAN_MR_TIM_BCMC_CLEAR(apidx) \\\n\tpAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] &= ~NUM_BIT8[0];\n\n/* set bcmc TIM bit */\n#define WLAN_MR_TIM_BCMC_SET(apidx) \\\n\tpAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] |= NUM_BIT8[0];\n\n/* clear a station PS TIM bit */\n#define WLAN_MR_TIM_BIT_CLEAR(ad_p, apidx, wcid) \\\n\t{\tUCHAR tim_offset = wcid >> 3; \\\n\t\tUCHAR bit_offset = wcid & 0x7; \\\n\t\tad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] &= (~NUM_BIT8[bit_offset]); }\n\n/* set a station PS TIM bit */\n#define WLAN_MR_TIM_BIT_SET(ad_p, apidx, wcid) \\\n\t{\tUCHAR tim_offset = wcid >> 3; \\\n\t\tUCHAR bit_offset = wcid & 0x7; \\\n\t\tad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] |= NUM_BIT8[bit_offset]; }\n\n\n#ifdef CONFIG_AP_SUPPORT\ntypedef struct _MULTISSID_STRUCT {\n\n\tstruct wifi_dev wdev;\n\n#ifdef HOSTAPD_SUPPORT\n\tBOOLEAN Hostapd;\n\tBOOLEAN HostapdWPS;\n#endif\n\n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tUCHAR SsidLen;\n\tCHAR Ssid[MAX_LEN_OF_SSID];\n\tUSHORT CapabilityInfo;\n\n\tUCHAR MaxStaNum;\t/* Limit the STA connection number per BSS */\n\tUCHAR StaCount;\n\n\tPNET_DEV MSSIDDev;\n\n\tNDIS_802_11_AUTHENTICATION_MODE AuthMode;\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\tNDIS_802_11_WEP_STATUS GroupKeyWepStatus;\n\tWPA_MIX_PAIR_CIPHER WpaMixPairCipher;\n\n\tHTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;\t/* For transmit phy setting in TXWI. */\n\tRT_PHY_INFO DesiredHtPhyInfo;\n\tDESIRED_TRANSMIT_SETTING DesiredTransmitSetting;\t/* Desired transmit setting. this is for reading registry setting only. not useful. */\n\tBOOLEAN bAutoTxRateSwitch;\n\n\t/*MBSS_STATISTICS MbssStat;*/\n\tULONG TxCount;\n\tULONG RxCount;\n\tULONG ReceivedByteCount;\n\tULONG TransmittedByteCount;\n\tULONG RxErrorCount;\n\tULONG RxDropCount;\n\n\tULONG TxErrorCount;\n\tULONG TxDropCount;\n\tULONG ucPktsTx;\n\tULONG ucPktsRx;\n\tULONG mcPktsTx;\n\tULONG mcPktsRx;\n\tULONG bcPktsTx;\n\tULONG bcPktsRx;\n\n\t/*CIPHER_KEY SharedKey[SHARE_KEY_NUM]; // ref pAd->SharedKey[BSS][4] */\n\tUCHAR DefaultKeyId;\n\n\tUCHAR TxRate; /* RATE_1, RATE_2, RATE_5_5, RATE_11, ... */\n\tUCHAR DesiredRates[MAX_LEN_OF_SUPPORTED_RATES];\t/* OID_802_11_DESIRED_RATES */\n\tUCHAR DesiredRatesIndex;\n\tUCHAR MaxTxRate; /* RATE_1, RATE_2, RATE_5_5, RATE_11 */\n\n/*\tULONG TimBitmap;      // bit0 for broadcast, 1 for AID1, 2 for AID2, ...so on */\n/*    ULONG TimBitmap2;     // b0 for AID32, b1 for AID33, ... and so on */\n\tUCHAR TimBitmaps[WLAN_MAX_NUM_OF_TIM];\n\n\t/* WPA */\n\tUCHAR GMK[32];\n\tUCHAR PMK[32];\n\tUCHAR GTK[32];\n#ifdef DOT1X_SUPPORT\n\tBOOLEAN IEEE8021X;\n\tBOOLEAN PreAuth;\n#endif /* DOT1X_SUPPORT */\n\tUCHAR GNonce[32];\n\tUCHAR PortSecured;\n\tNDIS_802_11_PRIVACY_FILTER PrivacyFilter;\n\tUCHAR BANClass3Data;\n\tULONG IsolateInterStaTraffic;\n\n\tUCHAR RSNIE_Len[2];\n\tUCHAR RSN_IE[2][MAX_LEN_OF_RSNIE];\n\n\t/* for Group Rekey */\n\tRT_WPA_REKEY WPAREKEY;\n\tULONG REKEYCOUNTER;\n\tRALINK_TIMER_STRUCT REKEYTimer;\n\tUCHAR REKEYTimerRunning;\n\tUINT8 RekeyCountDown;\n\n#ifdef WAPI_SUPPORT\n\tUCHAR WAPIPassPhrase[64];\t/* WAPI PSK pass phrase */\n\tUINT WAPIPassPhraseLen;\t/* the length of WAPI PSK pass phrase */\n\tUINT WapiPskType;\t/* 0 - Hex, 1 - ASCII */\n\tUCHAR WAPI_BK[16];\t/* WAPI base key */\n\n\tUCHAR NMK[LEN_WAPI_NMK];\n\tUCHAR key_announce_flag[LEN_WAPI_TSC];\n\tBOOLEAN sw_wpi_encrypt;\t/* WPI data encrypt by SW */\n#endif /* WAPI_SUPPORT */\n\n\tUCHAR TimIELocationInBeacon;\n\tUCHAR CapabilityInfoLocationInBeacon;\n\n\t/* For PMK Cache using */\n\tULONG PMKCachePeriod;\t/* unit : jiffies */\n\tNDIS_AP_802_11_PMKID PMKIDCache;\n\n\t/* outgoing BEACON frame buffer and corresponding TXWI */\n\t/* TXWI_STRUC *BeaconTxWI; */\n\tCHAR BeaconBuf[MAX_BEACON_SIZE];\t/* NOTE: BeaconBuf should be 4-byte aligned */\n\n\tBOOLEAN bHideSsid;\n\tUINT16 StationKeepAliveTime;\t/* unit: second */\n\n\t/* VLAN related */\n\tBOOLEAN bVLAN_Tag;\n\tUSHORT VLAN_VID;\n\tUSHORT VLAN_Priority;\n\n\tRT_802_11_ACL AccessControlList;\n\n\t/* EDCA Qos */\n\tBOOLEAN bWmmCapable;\t/* 0:disable WMM, 1:enable WMM */\n\tBOOLEAN bDLSCapable;\t/* 0:disable DLS, 1:enable DLS */\n\n\t/*\n\t   Why need the parameter: 2009/09/22\n\n\t   1. iwpriv ra0 set WmmCapable=0\n\t   2. iwpriv ra0 set WirelessMode=9\n\t   3. iwpriv ra0 set WirelessMode=0\n\t   4. iwpriv ra0 set SSID=SampleAP\n\n\t   After the 4 commands, WMM is still enabled.\n\t   So we need the parameter to recover WMM Capable flag.\n\n\t   No the problem in station mode.\n\t */\n\tBOOLEAN bWmmCapableOrg;\t/* origin Wmm Capable in non-11n mode */\n\n#ifdef QOS_DLS_SUPPORT\n\tUCHAR DlsPTK[64];\t/* Due to windows dirver count on meetinghouse to handle 4-way shake */\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\n\t/* For 802.1x daemon setting per BSS */\n\tUINT8 radius_srv_num;\n\tRADIUS_SRV_INFO radius_srv_info[MAX_RADIUS_SRV_NUM];\n\tUINT8 NasId[IFNAMSIZ];\n\tUINT8 NasIdLen;\n#endif /* DOT1X_SUPPORT */\n\n#ifdef RTL865X_SOC\n\tunsigned int mylinkid;\n#endif\n\n#ifdef CONFIG_AP_SUPPORT\n\tWSC_LV_INFO WscIEBeacon;\n\tWSC_LV_INFO WscIEProbeResp;\n#ifdef WSC_AP_SUPPORT\n\tWSC_CTRL WscControl;\n\tWSC_SECURITY_MODE WscSecurityMode;\n#endif /* WSC_AP_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef IDS_SUPPORT\n\tUINT32 RcvdConflictSsidCount;\n\tUINT32 RcvdSpoofedAssocRespCount;\n\tUINT32 RcvdSpoofedReassocRespCount;\n\tUINT32 RcvdSpoofedProbeRespCount;\n\tUINT32 RcvdSpoofedBeaconCount;\n\tUINT32 RcvdSpoofedDisassocCount;\n\tUINT32 RcvdSpoofedAuthCount;\n\tUINT32 RcvdSpoofedDeauthCount;\n\tUINT32 RcvdSpoofedUnknownMgmtCount;\n\tUINT32 RcvdReplayAttackCount;\n\n\tCHAR RssiOfRcvdConflictSsid;\n\tCHAR RssiOfRcvdSpoofedAssocResp;\n\tCHAR RssiOfRcvdSpoofedReassocResp;\n\tCHAR RssiOfRcvdSpoofedProbeResp;\n\tCHAR RssiOfRcvdSpoofedBeacon;\n\tCHAR RssiOfRcvdSpoofedDisassoc;\n\tCHAR RssiOfRcvdSpoofedAuth;\n\tCHAR RssiOfRcvdSpoofedDeauth;\n\tCHAR RssiOfRcvdSpoofedUnknownMgmt;\n\tCHAR RssiOfRcvdReplayAttack;\n#endif /* IDS_SUPPORT */\n\n\t/* used in if beacon send or stop */\n\tBOOLEAN bBcnSntReq;\n\tUCHAR BcnBufIdx;\n\n\n\n\n\n\tUCHAR PhyMode;\n\n\n\t/* UAPSD information: such as enable or disable, do not remove */\n\tUAPSD_INFO UapsdInfo;\n\n} MULTISSID_STRUCT, *PMULTISSID_STRUCT;\n#endif /* CONFIG_AP_SUPPORT */\n\n\n/* configuration common to OPMODE_AP as well as OPMODE_STA */\ntypedef struct _COMMON_CONFIG {\n\tBOOLEAN bCountryFlag;\n\tUCHAR CountryCode[3];\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tUCHAR Geography;\n\tUCHAR DfsType;\n\tPUCHAR pChDesp;\n#endif\t\t\t\t/* EXT_BUILD_CHANNEL_LIST */\n\tUCHAR CountryRegion;\t/* Enum of country region, 0:FCC, 1:IC, 2:ETSI, 3:SPAIN, 4:France, 5:MKK, 6:MKK1, 7:Israel */\n\tUCHAR CountryRegionForABand;\t/* Enum of country region for A band */\n\tUCHAR PhyMode;\n\tUCHAR cfg_wmode;\n\tUCHAR SavedPhyMode;\n\tUSHORT Dsifs;\t\t/* in units of usec */\n\tULONG PacketFilter;\t/* Packet filter for receiving */\n\tUINT8 RegulatoryClass[MAX_NUM_OF_REGULATORY_CLASS];\n\n\tCHAR Ssid[MAX_LEN_OF_SSID];\t/* NOT NULL-terminated */\n\tUCHAR SsidLen;\t\t/* the actual ssid length in used */\n\tUCHAR LastSsidLen;\t/* the actual ssid length in used */\n\tCHAR LastSsid[MAX_LEN_OF_SSID];\t/* NOT NULL-terminated */\n\tUCHAR LastBssid[MAC_ADDR_LEN];\n\n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tUSHORT BeaconPeriod;\n\tUCHAR Channel;\n\tUCHAR CentralChannel;\t/* Central Channel when using 40MHz is indicating. not real channel. */\n\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR SupRateLen;\n\tUCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR ExtRateLen;\n\tUCHAR DesireRate[MAX_LEN_OF_SUPPORTED_RATES];\t/* OID_802_11_DESIRED_RATES */\n\tUCHAR MaxDesiredRate;\n\tUCHAR ExpectedACKRate[MAX_LEN_OF_SUPPORTED_RATES];\n\n\tULONG BasicRateBitmap;\t/* backup basic ratebitmap */\n\tULONG BasicRateBitmapOld;\t/* backup basic ratebitmap */\n\n\tBOOLEAN bInServicePeriod;\n\n\n\tBOOLEAN bAPSDAC_BE;\n\tBOOLEAN bAPSDAC_BK;\n\tBOOLEAN bAPSDAC_VI;\n\tBOOLEAN bAPSDAC_VO;\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\tBOOLEAN\t TDLS_bAPSDAC_BE;\n\tBOOLEAN\t TDLS_bAPSDAC_BK;\n\tBOOLEAN\t TDLS_bAPSDAC_VI;\n\tBOOLEAN\t TDLS_bAPSDAC_VO;\n\tUCHAR TDLS_MaxSPLength;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t/* because TSPEC can modify the APSD flag, we need to keep the APSD flag\n\t   requested in association stage from the station;\n\t   we need to recover the APSD flag after the TSPEC is deleted. */\n\tBOOLEAN bACMAPSDBackup[4];\t/* for delivery-enabled & trigger-enabled both */\n\tBOOLEAN bACMAPSDTr[4];\t/* no use */\n\tUCHAR MaxSPLength;\n\n\tBOOLEAN bNeedSendTriggerFrame;\n\tBOOLEAN bAPSDForcePowerSave;\t/* Force power save mode, should only use in APSD-STAUT */\n\tULONG TriggerTimerCount;\n\tUCHAR BBPCurrentBW;\t/* BW_10, BW_20, BW_40, BW_80 */\n\tREG_TRANSMIT_SETTING RegTransmitSetting;\t/*registry transmit setting. this is for reading registry setting only. not useful. */\n\tUCHAR TxRate;\t\t/* Same value to fill in TXD. TxRate is 6-bit */\n\tUCHAR MaxTxRate;\t/* RATE_1, RATE_2, RATE_5_5, RATE_11 */\n\tUCHAR TxRateIndex;\t/* Tx rate index in RateSwitchTable */\n\tUCHAR MinTxRate;\t/* RATE_1, RATE_2, RATE_5_5, RATE_11 */\n\tUCHAR RtsRate;\t\t/* RATE_xxx */\n\tHTTRANSMIT_SETTING MlmeTransmit;\t/* MGMT frame PHY rate setting when operatin at Ht rate. */\n\tUCHAR MlmeRate;\t\t/* RATE_xxx, used to send MLME frames */\n\tUCHAR BasicMlmeRate;\t/* Default Rate for sending MLME frames */\n\n\tUSHORT RtsThreshold;\t/* in unit of BYTE */\n\tUSHORT FragmentThreshold;\t/* in unit of BYTE */\n\n\tUCHAR TxPower;\t\t/* in unit of mW */\n\tULONG TxPowerPercentage;\t/* 0~100 % */\n\tULONG TxPowerDefault;\t/* keep for TxPowerPercentage */\n\tUINT8 PwrConstraint;\n\n#ifdef DOT11_N_SUPPORT\n\tBACAP_STRUC BACapability;\t/*   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0 */\n\tBACAP_STRUC REGBACapability;\t/*   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0 */\n#endif\t\t\t\t/* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n\tBOOLEAN force_vht;\n\tUCHAR vht_bw;\n\tUCHAR vht_cent_ch;\n\tUCHAR vht_cent_ch2;\n#endif /* DOT11_VHT_AC */\n\n\tIOT_STRUC IOTestParm;\t/* 802.11n InterOpbility Test Parameter; */\n\tULONG TxPreamble;\t/* Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto */\n\tBOOLEAN bUseZeroToDisableFragment;\t/* Microsoft use 0 as disable */\n\tULONG UseBGProtection;\t/* 0: auto, 1: always use, 2: always not use */\n\tBOOLEAN bUseShortSlotTime;\t/* 0: disable, 1 - use short slot (9us) */\n\tBOOLEAN bEnableTxBurst;\t/* 1: enble TX PACKET BURST (when BA is established or AP is not a legacy WMM AP), 0: disable TX PACKET BURST */\n\tBOOLEAN bAggregationCapable;\t/* 1: enable TX aggregation when the peer supports it */\n\tBOOLEAN bPiggyBackCapable;\t/* 1: enable TX piggy-back according MAC's version */\n\tBOOLEAN bIEEE80211H;\t/* 1: enable IEEE802.11h spec. */\n\tUCHAR RDDurRegion; /* Region of radar detection */\n\tULONG DisableOLBCDetect;\t/* 0: enable OLBC detect; 1 disable OLBC detect */\n\n#ifdef DOT11_N_SUPPORT\n\tBOOLEAN bRdg;\n#endif\t\t\t\t/* DOT11_N_SUPPORT */\n\tBOOLEAN bWmmCapable;\t/* 0:disable WMM, 1:enable WMM */\n\tQOS_CAPABILITY_PARM APQosCapability;\t/* QOS capability of the current associated AP */\n\tEDCA_PARM APEdcaParm;\t/* EDCA parameters of the current associated AP */\n\tQBSS_LOAD_PARM APQbssLoad;\t/* QBSS load of the current associated AP */\n\tUCHAR AckPolicy[4];\t/* ACK policy of the specified AC. see ACK_xxx */\n#ifdef CONFIG_STA_SUPPORT\n\tBOOLEAN bDLSCapable;\t/* 0:disable DLS, 1:enable DLS */\n#endif\t\t\t\t/* CONFIG_STA_SUPPORT */\n\t/* a bitmap of BOOLEAN flags. each bit represent an operation status of a particular */\n\t/* BOOLEAN control, either ON or OFF. These flags should always be accessed via */\n\t/* OPSTATUS_TEST_FLAG(), OPSTATUS_SET_FLAG(), OP_STATUS_CLEAR_FLAG() macros. */\n\t/* see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition */\n\tULONG OpStatusFlags;\n\n\tBOOLEAN NdisRadioStateOff;\t/*For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff. */\n\n#ifdef DFS_SUPPORT\n\t/* IEEE802.11H--DFS. */\n\tRADAR_DETECT_STRUCT RadarDetect;\n#endif /* DFS_SUPPORT */\n#ifdef CARRIER_DETECTION_SUPPORT\n\tCARRIER_DETECTION_STRUCT CarrierDetect;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t/* HT */\n\tRT_HT_CAPABILITY DesiredHtPhy;\n\tHT_CAPABILITY_IE HtCapability;\n\tADD_HT_INFO_IE AddHTInfo;\t/* Useful as AP. */\n\t/*This IE is used with channel switch announcement element when changing to a new 40MHz. */\n\t/*This IE is included in channel switch ammouncement frames 7.4.1.5, beacons, probe Rsp. */\n\tNEW_EXT_CHAN_IE NewExtChanOffset;\t/*7.3.2.20A, 1 if extension channel is above the control channel, 3 if below, 0 if not present */\n\n\tEXT_CAP_INFO_ELEMENT ExtCapIE;\t/* this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. */\n\n#ifdef DOT11N_DRAFT3\n\tBOOLEAN bBssCoexEnable;\n\t/* \n\t   Following two paramters now only used for the initial scan operation. the AP only do \n\t   bandwidth fallback when BssCoexApCnt > BssCoexApCntThr\n\t   By default, the \"BssCoexApCntThr\" is set as 0 in \"UserCfgInit()\".\n\t */\n\tUCHAR BssCoexApCntThr;\n\tUCHAR BssCoexApCnt;\n\n\tUCHAR Bss2040CoexistFlag;\t/* bit 0: bBssCoexistTimerRunning, bit 1: NeedSyncAddHtInfo. */\n\tRALINK_TIMER_STRUCT Bss2040CoexistTimer;\n\tUCHAR\t\t\t\t\tBss2040NeedFallBack; \t/* 1: Need Fall back to 20MHz */\n\n\t/*This IE is used for 20/40 BSS Coexistence. */\n\tBSS_2040_COEXIST_IE BSS2040CoexistInfo;\n\n\tUSHORT Dot11OBssScanPassiveDwell;\t/* Unit : TU. 5~1000 */\n\tUSHORT Dot11OBssScanActiveDwell;\t/* Unit : TU. 10~1000 */\n\tUSHORT Dot11BssWidthTriggerScanInt;\t/* Unit : Second */\n\tUSHORT Dot11OBssScanPassiveTotalPerChannel;\t/* Unit : TU. 200~10000 */\n\tUSHORT Dot11OBssScanActiveTotalPerChannel;\t/* Unit : TU. 20~10000 */\n\tUSHORT Dot11BssWidthChanTranDelayFactor;\n\tUSHORT Dot11OBssScanActivityThre;\t/* Unit : percentage */\n\n\tULONG Dot11BssWidthChanTranDelay;\t/* multiple of (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor) */\n\tULONG CountDownCtr;\t/* CountDown Counter from (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor) */\n\n\tBSS_2040_COEXIST_IE LastBSSCoexist2040;\n\tBSS_2040_COEXIST_IE BSSCoexist2040;\n\tTRIGGER_EVENT_TAB TriggerEventTab;\n\tUCHAR ChannelListIdx;\n\n\tBOOLEAN bOverlapScanning;\n\tBOOLEAN bBssCoexNotify;\n#endif /* DOT11N_DRAFT3 */\n\n\tBOOLEAN bHTProtect;\n\tBOOLEAN bMIMOPSEnable;\n\tBOOLEAN bBADecline;\n\tBOOLEAN bDisableReordering;\n\tBOOLEAN bForty_Mhz_Intolerant;\n\tBOOLEAN bExtChannelSwitchAnnouncement;\n\tBOOLEAN bRcvBSSWidthTriggerEvents;\n\tULONG LastRcvBSSWidthTriggerEventsTime;\n\n\tUCHAR TxBASize;\n\n\tBOOLEAN bRalinkBurstMode;\n\tUINT32 RestoreBurstMode;\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n\tUINT32 cfg_vht;\n\tVHT_CAP_INFO vht_info;\n#endif /* DOT11_VHT_AC */\n\n#ifdef SYSTEM_LOG_SUPPORT\n\t/* Enable wireless event */\n\tBOOLEAN bWirelessEvent;\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\tBOOLEAN bWiFiTest;\t/* Enable this parameter for WiFi test */\n\n\t/* Tx & Rx Stream number selection */\n\tUCHAR TxStream;\n\tUCHAR RxStream;\n\n\t/* transmit phy mode, trasmit rate for Multicast. */\n#ifdef MCAST_RATE_SPECIFIC\n\tUCHAR McastTransmitMcs;\n\tUCHAR McastTransmitPhyMode;\n#endif /* MCAST_RATE_SPECIFIC */\n\n\tBOOLEAN bHardwareRadio;\t/* Hardware controlled Radio enabled */\n\n#ifdef RTMP_MAC_USB\n\tBOOLEAN bMultipleIRP;\t/* Multiple Bulk IN flag */\n\tUCHAR NumOfBulkInIRP;\t/* if bMultipleIRP == TRUE, NumOfBulkInIRP will be 4 otherwise be 1 */\n\tRT_HT_CAPABILITY SupportedHtPhy;\n\tULONG MaxPktOneTxBulk;\n\tUCHAR TxBulkFactor;\n\tUCHAR RxBulkFactor;\n\n\tBOOLEAN IsUpdateBeacon;\n\tBEACON_SYNC_STRUCT *pBeaconSync;\n\tRALINK_TIMER_STRUCT BeaconUpdateTimer;\n\tUINT32 BeaconAdjust;\n\tUINT32 BeaconFactor;\n\tUINT32 BeaconRemain;\n#endif\t\t\t\t/* RTMP_MAC_USB */\n\n#ifdef WSC_INCLUDED\n\t/* WSC hardware push button function 0811 */\n\tUINT8 WscHdrPshBtnCheckCount;\n#endif\t\t\t\t/* WSC_INCLUDED */\n\n\n\tNDIS_SPIN_LOCK MeasureReqTabLock;\n\tPMEASURE_REQ_TAB pMeasureReqTab;\n\n\tNDIS_SPIN_LOCK TpcReqTabLock;\n\tPTPC_REQ_TAB pTpcReqTab;\n\n\t/* transmit phy mode, trasmit rate for Multicast. */\n#ifdef MCAST_RATE_SPECIFIC\n\tHTTRANSMIT_SETTING MCastPhyMode;\n#endif /* MCAST_RATE_SPECIFIC */\n\n#ifdef SINGLE_SKU\n\tUINT16 DefineMaxTxPwr;\n\tBOOLEAN bSKUMode;\n\tUINT16 AntGain;\n\tUINT16 BandedgeDelta;\n\tUINT16 ModuleTxpower;\n#endif /* SINGLE_SKU */\n\n#ifdef WAPI_SUPPORT\n\tCOMMON_WAPI_INFO comm_wapi_info;\n\n\t/* rekey related parameter */\n\t/* USK update parameter */\n\tUINT8 wapi_usk_rekey_method;\t/* 0:disable , 1:time, 2:packet */\n\tUINT32 wapi_usk_rekey_threshold;\t/* the rekey threshold */\n\n\t/* MSK update parameter */\n\tUINT8 wapi_msk_rekey_method;\t/* 0:disable , 1:time, 2:packet */\n\tUINT32 wapi_msk_rekey_threshold;\t/* the rekey threshold */\n\n\tUINT32 wapi_msk_rekey_cnt;\n\tRALINK_TIMER_STRUCT WapiMskRekeyTimer;\n\tUCHAR WapiMskRekeyTimerRunning;\n#endif /* WAPI_SUPPORT */\n\n\n\tBOOLEAN HT_DisallowTKIP;\t/* Restrict the encryption type in 11n HT mode */\n\n\tBOOLEAN HT_Disable;\t/* 1: disable HT function; 0: enable HT function */\n\n\n#ifdef PRE_ANT_SWITCH\n\tBOOLEAN PreAntSwitch;\t/* Preamble Antenna Switch */\n\tSHORT PreAntSwitchRSSI;\t/* Preamble Antenna Switch RSSI threshold */\n\tSHORT PreAntSwitchTimeout; /* Preamble Antenna Switch timeout in seconds */\n#endif /* PRE_ANT_SWITCH */\n\n#ifdef CFO_TRACK\n\tSHORT\tCFOTrack;\t/* CFO Tracking. 0=>use default, 1=>track, 2-7=> track 8-n times, 8=>done tracking */\n#endif /* CFO_TRACK */\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tUSHORT\tlowTrafficThrd;\t\t/* Threshold for reverting to default MCS when traffic is low */\n\tBOOLEAN\tTrainUpRule;\t\t/* QuickDRS train up criterion: 0=>Throughput, 1=>PER, 2=> Throughput & PER */\n\tSHORT\tTrainUpRuleRSSI;\t/* If TrainUpRule=2 then use Hybrid rule when RSSI < TrainUpRuleRSSI */\n\tUSHORT\tTrainUpLowThrd;\t\t/* QuickDRS Hybrid train up low threshold */\n\tUSHORT\tTrainUpHighThrd;\t/* QuickDRS Hybrid train up high threshold */\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n#define\t\tSTREAM_MODE_STA_NUM\t\t4\n\n\tUCHAR\tStreamMode; /* 0=disabled, 1=enable for 1SS, 2=enable for 2SS, 3=enable for 1,2SS */\n\tUCHAR\tStreamModeMac[STREAM_MODE_STA_NUM][MAC_ADDR_LEN];\n\tUINT16\tStreamModeMCS;\t/* Bit map for enabling Stream Mode based on MCS */\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef TXBF_SUPPORT\n\tULONG ITxBfTimeout;\n\tULONG ETxBfTimeout;\n\tULONG\tETxBfEnCond;\t\t/* Enable sending of sounding and beamforming */\n\tBOOLEAN\tETxBfNoncompress;\t/* Force non-compressed Sounding Response */\n\tBOOLEAN\tETxBfIncapable;\t\t/* Report Incapable of BF in TX BF Capabilities */\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n\tULONG DebugFlags;\t/* Temporary debug flags */\n#endif /* DBG_CTRL_SUPPORT */\n\n\n#ifdef WSC_INCLUDED\n\tBOOLEAN WscPBCOverlap;\n\tWSC_STA_PBC_PROBE_INFO WscStaPbcProbeInfo;\n#endif\t\t\t\t/* WSC_INCLUDED */\n\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tMO_CFG_STRUCT MO_Cfg;\t/* data structure for mitigating microwave interference */\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t\n} COMMON_CONFIG, *PCOMMON_CONFIG;\n\n#ifdef DBG_CTRL_SUPPORT\n/* DebugFlag definitions */\n#define DBF_NO_BF_AWARE_RA\t\t0x0001\t/* Revert to older Rate Adaptation that is not BF aware */\n#define DBF_SHOW_BF_STATS\t\t0x0002\t/* Display BF statistics in AP \"iwpriv stat\" display */\n#define DBF_NO_TXBF_3SS\t\t\t0x0004\t/* Disable TXBF for MCS > 20 */\n#define DBF_UNUSED0008\t\t\t0x0008\t/* Unused */\n#define DBF_DBQ_RA_LOG\t\t\t0x0010\t/* Log RA information in DBQ */\n#define DBF_INIT_MCS_MARGIN\t\t0x0020\t/* Use 6 dB margin when selecting initial MCS */\n#define DBF_INIT_MCS_DIS1\t\t0x0040\t/* Disable highest MCSs when selecting initial MCS */\n#define DBF_FORCE_QUICK_DRS\t\t0x0080\t/* Force Quick DRS even if rate didn't change */\n#define DBF_FORCE_SGI\t\t\t0x0100\t/* Force Short GI */\n#define DBF_DBQ_NO_BCN\t\t\t0x0200\t/* Disable logging of RX Beacon frames */\n#define DBF_LOG_VCO_CAL\t\t\t0x0400\t/* Log VCO cal */\n#define DBF_DISABLE_CAL\t\t\t0x0800\t/* Disable Divider Calibration at channel change */\n#ifdef INCLUDE_DEBUG_QUEUE\n#define DBF_DBQ_TXFIFO\t\t\t0x1000\t/* Enable logging of TX information from FIFO */\n#define DBF_DBQ_TXFRAME\t\t\t0x2000\t/* Enable logging of Frames queued for TX */\n#define DBF_DBQ_RXWI_FULL\t\t0x4000\t/* Enable logging of full RXWI */\n#define DBF_DBQ_RXWI\t\t\t0x8000\t/* Enable logging of partial RXWI */\n#endif /* INCLUDE_DEBUG_QUEUE */\n\n#define DBF_SHOW_RA_LOG\t\t\t0x010000\t/* Display concise Rate Adaptation information */\n#define DBF_SHOW_ZERO_RA_LOG\t0x020000\t/* Include RA Log entries when TxCount is 0 */\n#define DBF_FORCE_20MHZ\t\t\t0x040000\t/* Force 20 MHz TX */\n#define DBF_FORCE_40MHZ \t\t0x080000\t/* Force 40 MHz Tx */\n#define DBF_DISABLE_CCK\t\t\t0x100000\t/* Disable CCK */\n#define DBF_UNUSED200000\t\t0x200000\t/* Unused */\n#define DBF_ENABLE_HT_DUP\t\t0x400000\t/* Allow HT Duplicate mode in TX rate table */\n#define DBF_ENABLE_CCK_5G\t\t0x800000\t/* Enable CCK rates in 5G band */\n#define DBF_UNUSED0100000\t\t0x0100000\t/* Unused */\n#define DBF_ENABLE_20MHZ_MCS8\t0x02000000\t/* Substitute 20MHz MCS8 for 40MHz MCS8 */\n#define DBF_DISABLE_20MHZ_MCS0\t0x04000000\t/* Disable substitution of 20MHz MCS0 for 40MHz MCS32 */\n#define DBF_DISABLE_20MHZ_MCS1\t0x08000000\t/* Disable substitution of 20MHz MCS1 for 40MHz MCS0 */\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\n#ifdef CREDENTIAL_STORE\ntypedef struct _STA_CONNECT_INFO {\n\tBOOLEAN Changeable;\n\tBOOLEAN IEEE8021X;\n\tCHAR Ssid[MAX_LEN_OF_SSID]; // NOT NULL-terminated\n\tUCHAR SsidLen; // the actual ssid length in used\n\tNDIS_802_11_AUTHENTICATION_MODE AuthMode; // This should match to whatever microsoft defined\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\tUCHAR DefaultKeyId;\n\tUCHAR PMK[LEN_PMK]; // WPA PSK mode PMK\n\tUCHAR WpaPassPhrase[64]; // WPA PSK pass phrase\n\tUINT WpaPassPhraseLen; // the length of WPA PSK pass phrase\n\tUINT8 WpaState;\n\tCIPHER_KEY SharedKey[1][4]; // STA always use SharedKey[BSS0][0..3]\n\tNDIS_SPIN_LOCK Lock;\n} STA_CONNECT_INFO, *P_STA_CONNECT_INFO;\n#endif /* CREDENTIAL_STORE */\n\n#ifdef DOT11Z_TDLS_SUPPORT\ntypedef struct _TDLS_STRUCT\n{\n\tBOOLEAN bTDLSCapable;\t/* 0:disable TDLS, 1:enable TDLS */\n\tBOOLEAN\tTdlsChSwitchSupp;\n\tBOOLEAN\tTdlsPsmSupp;\n\tUINT8 TdlsDialogToken;\n\tUINT32 TdlsKeyLifeTime;\n\tUINT8 TdlsLinkSize;\t\t/* record how much links establish already. */\n\tRT_802_11_TDLS TDLSEntry[MAX_NUM_OF_TDLS_ENTRY];\n\tNDIS_SPIN_LOCK TDLSEntryLock;\n\tNDIS_SPIN_LOCK TDLSUapsdLock;\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tBOOLEAN\tTdlsAutoLink;\n\tLIST_HEADER TdlsDiscovPeerList;\n\tNDIS_SPIN_LOCK TdlsDiscovPeerListSemLock;\n\tLIST_HEADER TdlsBlackList;\n\tNDIS_SPIN_LOCK TdlsBlackListSemLock;\n\n\tCHAR TdlsAutoSetupRssiThreshold;\n\tCHAR TdlsAutoTeardownRssiThreshold;\n\tUSHORT TdlsRssiMeasurementPeriod;\n\tUSHORT TdlsDisabledPeriodByTeardown;\n\tUSHORT TdlsAutoDiscoveryPeriod;\n#endif /* TDLS_AUTOLINK_SUPPORT */\n\n\t/* Channel Switch */\n\tUINT16 TdlsSwitchTime;\n\tUINT16 TdlsSwitchTimeout;\n\tBOOLEAN TdlsForcePowerSaveWithAP;\n\tBOOLEAN bTdlsNoticeAPPowerSave;\n\n\tRALINK_TIMER_STRUCT TdlsPeriodGoBackBaseChTimer;\n\tRALINK_TIMER_STRUCT TdlsPeriodGoOffChTimer;\n\tRALINK_TIMER_STRUCT TdlsResponderGoBackBaseChTimer;\n\tRALINK_TIMER_STRUCT TdlsDisableChannelSwitchTimer;\n\n\tBOOLEAN bDoingPeriodChannelSwitch;\n\tBOOLEAN bChannelSwitchUnSolRsp;\n\tBOOLEAN bChannelSwitchInitiator;\n\tBOOLEAN bTdlsCurrentDoingChannelSwitchWaitSuccess;\n\tUCHAR TdlsTargetOffChannel;\n\tUCHAR TdlsTargetOffChannelBW;\n\tUCHAR TdlsCurrentChannel;\n\tUCHAR TdlsCurrentChannelBW;\n\tUCHAR TdlsCurrentOperateChannel;\n\tUCHAR TdlsCurrentOperateChannelBW;\n\n\tUINT16 TdlsOffChannelDelay;\n\tUCHAR TdlsChannelSwitchPairCount;\n\tUCHAR TdlsChannelSwitchRetryCount;\n\tULONG TdlsGoBackStartTime;\n\tULONG TdlsGlobalSwitchTime;\n\tULONG TdlsGlobalSwitchTimeOut;\n\tUCHAR TdlsSendNullFrameCount;\n\tBOOLEAN TdlsChannelSwitchHWTimerRunning;\n\tUCHAR TdlsChannelSwitchHWTimerCount;\n\tUCHAR TdlsDtimCount;\n\n\t/* record old power save mode */\n#define TDLS_POWER_SAVE_ACTIVE_COUNT_DOWN_NUM\t\t(5*1000/MLME_TASK_EXEC_INTV)\n\tBOOLEAN TdlsFlgIsKeepingActiveCountDown; /* keep active until 0 */\n\tUINT8 TdlsPowerSaveActiveCountDown;\n}TDLS_STRUCT, *PTDLS_STRUCT;\n#endif // DOT11Z_TDLS_SUPPORT //\n\n/* Modified by Wu Xi-Kun 4/21/2006 */\n/* STA configuration and status */\ntypedef struct _STA_ADMIN_CONFIG {\n\tstruct wifi_dev wdev;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tUCHAR BW;\n\tUCHAR ReConnectCountDown;\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\t/*\n\t\tGROUP 1 -\n\t\tUser configuration loaded from Registry, E2PROM or OID_xxx. These settings describe\n\t\tthe user intended configuration, but not necessary fully equal to the final\n\t\tsettings in ACTIVE BSS after negotiation/compromize with the BSS holder (either\n\t\tAP or IBSS holder).\n\t\tOnce initialized, user configuration can only be changed via OID_xxx\n\t*/\n\tUCHAR BssType;\t\t/* BSS_INFRA or BSS_ADHOC */\n\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n#define MONITOR_FLAG_11N_SNIFFER\t\t0x01\n\tUCHAR BssMonitorFlag;\t/* Specific flag for monitor */\n#endif\t\t\t\t/* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\n\tUSHORT AtimWin;\t\t/* used when starting a new IBSS */\n\n\t/*\n\t\tGROUP 2 -\n\t\tUser configuration loaded from Registry, E2PROM or OID_xxx. These settings describe\n\t\tthe user intended configuration, and should be always applied to the final\n\t\tsettings in ACTIVE BSS without compromising with the BSS holder.\n\t\tOnce initialized, user configuration can only be changed via OID_xxx\n\t*/\n\tUCHAR RssiTrigger;\n\tUCHAR RssiTriggerMode;\t/* RSSI_TRIGGERED_UPON_BELOW_THRESHOLD or RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD */\n\tUSHORT DefaultListenCount;\t/* default listen count; */\n\tULONG WindowsPowerMode;\t/* Power mode for AC power */\n\tULONG WindowsBatteryPowerMode;\t/* Power mode for battery if exists */\n\tBOOLEAN bWindowsACCAMEnable;\t/* Enable CAM power mode when AC on */\n\tBOOLEAN bAutoReconnect;\t/* Set to TRUE when setting OID_802_11_SSID with no matching BSSID */\n\tULONG WindowsPowerProfile;\t/* Windows power profile, for NDIS5.1 PnP */\n\n\tBOOLEAN\t FlgPsmCanNotSleep; /* TRUE: can not switch ASIC to sleep */\n\t/* MIB:ieee802dot11.dot11smt(1).dot11StationConfigTable(1) */\n\tUSHORT Psm;\t\t/* power management mode   (PWR_ACTIVE|PWR_SAVE) */\n\tUSHORT DisassocReason;\n\tUCHAR DisassocSta[MAC_ADDR_LEN];\n\tUSHORT DeauthReason;\n\tUCHAR DeauthSta[MAC_ADDR_LEN];\n\tUSHORT AuthFailReason;\n\tUCHAR AuthFailSta[MAC_ADDR_LEN];\n\n\tNDIS_802_11_PRIVACY_FILTER PrivacyFilter;\t/* PrivacyFilter enum for 802.1X */\n\tNDIS_802_11_AUTHENTICATION_MODE AuthMode;\t/* This should match to whatever microsoft defined */\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\n\t/* Add to support different cipher suite for WPA2/WPA mode */\n\tNDIS_802_11_ENCRYPTION_STATUS GroupCipher;\t/* Multicast cipher suite */\n\tNDIS_802_11_ENCRYPTION_STATUS PairCipher;\t/* Unicast cipher suite */\n\tBOOLEAN bMixCipher;\t/* Indicate current Pair & Group use different cipher suites */\n\tUSHORT RsnCapability;\n\n\tNDIS_802_11_WEP_STATUS GroupKeyWepStatus;\n\n\tUCHAR WpaPassPhrase[64];\t/* WPA PSK pass phrase */\n\tUINT WpaPassPhraseLen;\t/* the length of WPA PSK pass phrase */\n\tUCHAR PMK[LEN_PMK];\t/* WPA PSK mode PMK */\n\tUCHAR PTK[LEN_PTK];\t/* WPA PSK mode PTK */\n\tUCHAR GMK[LEN_GMK];\t/* WPA PSK mode GMK */\n\tUCHAR GTK[MAX_LEN_GTK];\t/* GTK from authenticator */\n\tUCHAR GNonce[32];\t/* GNonce for WPA2PSK from authenticator */\n\tCIPHER_KEY TxGTK;\n\tBSSID_INFO SavedPMK[PMKID_NO];\n\tUINT SavedPMKNum;\t/* Saved PMKID number */\n\n\tUCHAR DefaultKeyId;\n\n#ifdef WAPI_SUPPORT\n\tUCHAR WAPIPassPhrase[64];\t/* WAPI PSK pass phrase */\n\tUINT WAPIPassPhraseLen;\t/* the length of WAPI PSK pass phrase */\n\tUINT WapiPskType;\t/* 0 - Hex, 1 - ASCII */\n\tUCHAR WAPI_BK[16];\t/* WAPI base key */\n\n\tUCHAR NMK[16];\t\t/* WAPI notify master key */\n#endif\t\t\t\t/* WAPI_SUPPORT */\n\n\t/* WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED */\n\tUCHAR PortSecured;\n\n\t/* For WPA countermeasures */\n\tULONG LastMicErrorTime;\t/* record last MIC error time */\n\tULONG MicErrCnt;\t/* Should be 0, 1, 2, then reset to zero (after disassoiciation). */\n\tBOOLEAN bBlockAssoc;\t/* Block associate attempt for 60 seconds after counter measure occurred. */\n\t/* For WPA-PSK supplicant state */\n\tUINT8 WpaState;\t\t/* Default is SS_NOTUSE and handled by microsoft 802.1x */\n\tUCHAR ReplayCounter[8];\n\tUCHAR ANonce[32];\t/* ANonce for WPA-PSK from aurhenticator */\n\tUCHAR SNonce[32];\t/* SNonce for WPA-PSK */\n\n\tUCHAR LastSNR0;\t\t/* last received BEACON's SNR */\n\tUCHAR LastSNR1;\t\t/* last received BEACON's SNR for 2nd  antenna */\n#ifdef DOT11N_SS3_SUPPORT\n\tUCHAR LastSNR2;\t\t/* last received BEACON's SNR for 3nd  antenna */\n\tINT32 BF_SNR[3];\t/* Last RXWI BF SNR. Units=0.25 dB */\n#endif /* DOT11N_SS3_SUPPORT */\n\tRSSI_SAMPLE RssiSample;\n\tULONG NumOfAvgRssiSample;\n\n\tULONG LastBeaconRxTime;\t/* OS's timestamp of the last BEACON RX time */\n\tULONG Last11bBeaconRxTime;\t/* OS's timestamp of the last 11B BEACON RX time */\n\tULONG Last11gBeaconRxTime;\t/* OS's timestamp of the last 11G BEACON RX time */\n\tULONG Last20NBeaconRxTime;\t/* OS's timestamp of the last 20MHz N BEACON RX time */\n\n\tULONG LastScanTime;\t/* Record last scan time for issue BSSID_SCAN_LIST */\n\tBOOLEAN bNotFirstScan;\t/* Sam add for ADHOC flag to do first scan when do initialization */\n\tBOOLEAN bSwRadio;\t/* Software controlled Radio On/Off, TRUE: On */\n\tBOOLEAN bHwRadio;\t/* Hardware controlled Radio On/Off, TRUE: On */\n\tBOOLEAN bRadio;\t\t/* Radio state, And of Sw & Hw radio state */\n\tBOOLEAN bHardwareRadio;\t/* Hardware controlled Radio enabled */\n\tBOOLEAN bShowHiddenSSID;\t/* Show all known SSID in SSID list get operation */\n\n\t/* New for WPA, windows want us to to keep association information and */\n\t/* Fixed IEs from last association response */\n\tNDIS_802_11_ASSOCIATION_INFORMATION AssocInfo;\n\tUSHORT ReqVarIELen;\t/* Length of next VIE include EID & Length */\n\tUCHAR ReqVarIEs[MAX_VIE_LEN];\t/* The content saved here should be little-endian format. */\n\tUSHORT ResVarIELen;\t/* Length of next VIE include EID & Length */\n\tUCHAR ResVarIEs[MAX_VIE_LEN];\n\n\tUCHAR RSNIE_Len;\n\tUCHAR RSN_IE[MAX_LEN_OF_RSNIE];\t/* The content saved here should be little-endian format. */\n\n\tULONG CLBusyBytes;\t/* Save the total bytes received durning channel load scan time */\n\tUSHORT RPIDensity[8];\t/* Array for RPI density collection */\n\n\tUCHAR RMReqCnt;\t\t/* Number of measurement request saved. */\n\tUCHAR CurrentRMReqIdx;\t/* Number of measurement request saved. */\n\tBOOLEAN ParallelReq;\t/* Parallel measurement, only one request performed, */\n\t/* It must be the same channel with maximum duration */\n\tUSHORT ParallelDuration;\t/* Maximum duration for parallel measurement */\n\tUCHAR ParallelChannel;\t/* Only one channel with parallel measurement */\n\tUSHORT IAPPToken;\t/* IAPP dialog token */\n\t/* Hack for channel load and noise histogram parameters */\n\tUCHAR NHFactor;\t\t/* Parameter for Noise histogram */\n\tUCHAR CLFactor;\t\t/* Parameter for channel load */\n\n\tRALINK_TIMER_STRUCT StaQuickResponeForRateUpTimer;\n\tBOOLEAN StaQuickResponeForRateUpTimerRunning;\n\n\tUCHAR DtimCount;\t/* 0.. DtimPeriod-1 */\n\tUCHAR DtimPeriod;\t/* default = 3 */\n\n#ifdef QOS_DLS_SUPPORT\n\tRT_802_11_DLS DLSEntry[MAX_NUM_OF_DLS_ENTRY];\n\tUCHAR DlsReplayCounter[8];\n#endif\t\t\t\t/* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\tTDLS_STRUCT TdlsInfo;\n#endif\t\t\t\t/* DOT11Z_TDLS_SUPPORT */\n\n\tRALINK_TIMER_STRUCT WpaDisassocAndBlockAssocTimer;\n\t/* Fast Roaming */\n\tBOOLEAN bAutoRoaming;\t/* 0:disable auto roaming by RSSI, 1:enable auto roaming by RSSI */\n\tCHAR dBmToRoam;\t\t/* the condition to roam when receiving Rssi less than this value. It's negative value. */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tBOOLEAN IEEE8021X;\n\tBOOLEAN IEEE8021x_required_keys;\n\tCIPHER_KEY DesireSharedKey[4];\t/* Record user desired WEP keys */\n\tUCHAR DesireSharedKeyId;\n\n\t/* 0x00: driver ignores wpa_supplicant */\n\t/* 0x01: wpa_supplicant initiates scanning and AP selection */\n\t/* 0x02: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters */\n\t/* 0x80: wpa_supplicant trigger driver to do WPS */\n\tUCHAR WpaSupplicantUP;\n\tUCHAR WpaSupplicantScanCount;\n\tBOOLEAN bRSN_IE_FromWpaSupplicant;\n\tBOOLEAN bLostAp;\n\tUCHAR *pWpsProbeReqIe;\n\tUINT WpsProbeReqIeLen;\n\tUCHAR *pWpaAssocIe;\n\tUINT WpaAssocIeLen;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\tWSC_LV_INFO WpsIEBeacon;\n\tWSC_LV_INFO WpsIEProbeResp;\n\tWSC_CTRL WscControl;\n#ifdef IWSC_SUPPORT\n\tIWSC_INFO\t\t\tIWscInfo;\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\tCHAR dev_name[16];\n\tUSHORT OriDevType;\n\n\tBOOLEAN bTGnWifiTest;\n\tBOOLEAN bSkipAutoScanConn;\n\n\tHTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;\t/* For transmit phy setting in TXWI. */\n\tDESIRED_TRANSMIT_SETTING DesiredTransmitSetting;\n\tRT_PHY_INFO DesiredHtPhyInfo;\n\tBOOLEAN bAutoTxRateSwitch;\n\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tUCHAR IEEE80211dClientMode;\n\tUCHAR StaOriCountryCode[3];\n\tUCHAR StaOriGeography;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef IP_ASSEMBLY\n\tBOOLEAN bFragFlag;\n#endif /* IP_ASSEMBLY */\n\n\n\n\n\tBOOLEAN bAutoConnectByBssid;\n\tULONG BeaconLostTime;\t/* seconds */\n\tBOOLEAN bForceTxBurst;\t/* 1: force enble TX PACKET BURST, 0: disable */\n#ifdef XLINK_SUPPORT\n\tBOOLEAN PSPXlink;\t/* 0: Disable. 1: Enable */\n#endif /* XLINK_SUPPORT */\n\tBOOLEAN bAutoConnectIfNoSSID;\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tUCHAR RegClass;\t\t/*IE_SUPP_REG_CLASS: 2009 PF#3: For 20/40 Intolerant Channel Report */\n#endif /* DOT11N_DRAFT3 */\n\tBOOLEAN bAdhocN;\n#endif /* DOT11_N_SUPPORT */\n\tBOOLEAN bAdhocCreator;\t/*TRUE indicates divice is Creator. */\n\n\n\t/*\n\t   Enhancement Scanning Mechanism\n\t   To decrease the possibility of ping loss\n\t */\n\tBOOLEAN bImprovedScan;\n\tBOOLEAN BssNr;\n\tUCHAR ScanChannelCnt;\t/* 0 at the beginning of scan, stop at 7 */\n\tUCHAR LastScanChannel;\n\t/************************************/\n\n\tBOOLEAN bFastConnect;\n\n/*connectinfo  for tmp store connect info from UI*/\n\tBOOLEAN Connectinfoflag;\n\tUCHAR   ConnectinfoBssid[MAC_ADDR_LEN];\n\tUCHAR   ConnectinfoChannel;\n\tUCHAR   ConnectinfoSsidLen;\n\tCHAR    ConnectinfoSsid[MAX_LEN_OF_SSID];\n\tUCHAR ConnectinfoBssType;\n\t\n\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\tBOOLEAN\t\t\t\tAdaptiveFreq;  /* Todo: iwpriv and profile support. */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\t/* UAPSD information: such as enable or disable, do not remove */\n\tUAPSD_INFO UapsdInfo;\n\n#ifdef WFD_SUPPORT\n\tRT_WFD_CONFIG WfdCfg;\n#endif /* WFD_SUPPORT */\n\n#ifdef RT3290\n\t// TODO: shiang, check the purpose of following parameters\n\tULONG AntS;\n\tULONG AntSAuxDelta;\n\tULONG AntSRssiFactor;\n\tULONG AntSPERFactor;\n\tCHAR Rssi[2];\n#endif /* RT3290 */\n} STA_ADMIN_CONFIG, *PSTA_ADMIN_CONFIG;\n\n\n/*\n\tThis data structure keep the current active BSS/IBSS's configuration that\n\tthis STA had agreed upon joining the network. Which means these parameters\n\tare usually decided by the BSS/IBSS creator instead of user configuration.\n\tData in this data structurre is valid only when either ADHOC_ON()/INFRA_ON()\n\tis TRUE. Normally, after SCAN or failed roaming attempts, we need to\n\trecover back to the current active settings\n*/\ntypedef struct _STA_ACTIVE_CONFIG {\n\tUSHORT Aid;\n\tUSHORT AtimWin;\t\t/* in kusec; IBSS parameter set element */\n\tUSHORT CapabilityInfo;\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\n\tUSHORT CfpMaxDuration;\n\tUSHORT CfpPeriod;\n\n\t/* Copy supported rate from desired AP's beacon. We are trying to match */\n\t/* AP's supported and extended rate settings. */\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR SupRateLen;\n\tUCHAR ExtRateLen;\n\t/* Copy supported ht from desired AP's beacon. We are trying to match */\n\tRT_PHY_INFO SupportedPhyInfo;\n\tRT_HT_CAPABILITY SupportedHtPhy;\n#ifdef DOT11_VHT_AC\n\tRT_VHT_CAP\tSupVhtCap;\n#endif /* DOT11_VHT_AC */\n} STA_ACTIVE_CONFIG, *PSTA_ACTIVE_CONFIG;\n\n\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n/***************************************************************************\n  *\tAP related data structures\n  **************************************************************************/\n/* AUTH-RSP State Machine Aux data structure */\ntypedef struct _AP_MLME_AUX {\n\tUCHAR Addr[MAC_ADDR_LEN];\n\tUSHORT Alg;\n\tCHAR Challenge[CIPHER_TEXT_LEN];\n} AP_MLME_AUX, *PAP_MLME_AUX;\n\ntypedef enum _MAC_ENTRY_OP_MODE_ {\n\tENTRY_OP_MODE_ERROR = 0x00,\n\tENTRY_OP_MODE_CLI = 0x01,\t/* Sta mode, set this TRUE after Linkup,too. */\n\tENTRY_OP_MODE_WDS = 0x02,\t/* This is WDS Entry. only for AP mode. */\n\tENTRY_OP_MODE_APCLI = 0x04,\t/* This is a AP-Client entry, only for AP mode which enable AP-Client functions. */\n\tENTRY_OP_MODE_MESH = 0x08,\t/* Peer conect with us via mesh. */\n\tENTRY_OP_MODE_DLS = 0x10,\t/* This is DLS Entry. only for STA mode. */\n\tENTRY_OP_MODE_MAX = 0x20\n} MAC_ENTRY_OP_MODE;\n#endif /* CONFIG_AP_SUPPORT */\n\n/* Values of LastSecTxRateChangeAction */\n#define RATE_NO_CHANGE\t0\t\t/* No change in rate */\n#define RATE_UP\t\t\t1\t\t/* Trying higher rate or same rate with different BF */\n#define RATE_DOWN\t\t2\t\t/* Trying lower rate */\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\ntypedef struct _FOUR_WAY_HANDSHAKE_PROFILE {\n\tUCHAR ANonce[LEN_KEY_DESC_NONCE];\n\tUCHAR SNonce[LEN_KEY_DESC_NONCE];\n\tUCHAR ReplayCounter[LEN_KEY_DESC_REPLAY];\n\tUCHAR PTK[64];\n\tUINT8 WpaState;\n\tUCHAR MsgType;\n\tRALINK_TIMER_STRUCT MsgRetryTimer;\n\tUCHAR MsgRetryCounter;\n} FOUR_WAY_HANDSHAKE_PROFILE, *PFOUR_WAY_HANDSHAKE_PROFILE;\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\ntypedef struct _MAC_TABLE_ENTRY {\n\t/*\n\t   0:Invalid,\n\t   Bit 0: AsCli, Bit 1: AsWds, Bit 2: AsAPCLI,\n\t   Bit 3: AsMesh, Bit 4: AsDls, Bit 5: AsTDls\n\t */\n\tUINT32 EntryType;\n\n#ifdef P2P_SUPPORT\n\tUINT32 P2PEntryType; /* 0:Invalid, 1:P2P_GO, 2:P2P_CLI */\n#endif /* P2P_SUPPORT */\n\tBOOLEAN isCached;\n\tBOOLEAN bIAmBadAtheros;\t/* Flag if this is Atheros chip that has IOT problem.  We need to turn on RTS/CTS protection. */\n\n\t/* WPA/WPA2 4-way database */\n\tUCHAR EnqueueEapolStartTimerRunning;\t/* Enqueue EAPoL-Start for triggering EAP SM */\n\tRALINK_TIMER_STRUCT EnqueueStartForPSKTimer;\t/* A timer which enqueue EAPoL-Start for triggering PSK SM */\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\tFOUR_WAY_HANDSHAKE_PROFILE WPA_Supplicant;\n\tFOUR_WAY_HANDSHAKE_PROFILE WPA_Authenticator;\n\tCIPHER_KEY RxGTK;\n\tBOOLEAN bPeerHigherMAC;\n#ifdef IWSC_SUPPORT\n\tBOOLEAN bUpdateInfoFromPeerBeacon;\n#endif /* IWSC_SUPPORT */\n#endif\t\t\t\t/* ADHOC_WPA2PSK_SUPPORT */\n\n\t/*jan for wpa */\n\t/* record which entry revoke MIC Failure , if it leaves the BSS itself, AP won't update aMICFailTime MIB */\n\tUCHAR CMTimerRunning;\n\tUCHAR apidx;\t\t/* MBSS number */\n\tUCHAR RSNIE_Len;\n\tUCHAR RSN_IE[MAX_LEN_OF_RSNIE];\n\tUCHAR ANonce[LEN_KEY_DESC_NONCE];\n\tUCHAR SNonce[LEN_KEY_DESC_NONCE];\n\tUCHAR R_Counter[LEN_KEY_DESC_REPLAY];\n\tUCHAR PTK[64];\n\tUCHAR ReTryCounter;\n\tRALINK_TIMER_STRUCT RetryTimer;\n#ifdef TXBF_SUPPORT\n\tRALINK_TIMER_STRUCT eTxBfProbeTimer;\n#endif /* TXBF_SUPPORT */\n\tNDIS_802_11_AUTHENTICATION_MODE AuthMode;\t/* This should match to whatever microsoft defined */\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\tNDIS_802_11_WEP_STATUS GroupKeyWepStatus;\n\tUINT8 WpaState;\n\tUINT8 GTKState;\n\tUSHORT PortSecured;\n\tNDIS_802_11_PRIVACY_FILTER PrivacyFilter;\t/* PrivacyFilter enum for 802.1X */\n\tCIPHER_KEY PairwiseKey;\n\tPVOID pAd;\n\tINT PMKID_CacheIdx;\n\tUCHAR PMKID[LEN_PMKID];\n\tUCHAR NegotiatedAKM[LEN_OUI_SUITE];\t/* It indicate the negotiated AKM suite */\n\n#ifdef WAPI_SUPPORT\n\tUCHAR usk_id;\t\t/* unicast key index for WPI */\n#endif\t\t\t\t/* WAPI_SUPPORT */\n\n\tUCHAR Addr[MAC_ADDR_LEN];\n\tUCHAR\t\t\tHdrAddr1[MAC_ADDR_LEN];\n\tUCHAR\t\t\tHdrAddr2[MAC_ADDR_LEN];\n\tUCHAR\t\t\tHdrAddr3[MAC_ADDR_LEN];\n\tUCHAR PsMode;\n\tUCHAR FlgPsModeIsWakeForAWhile; /* wake up for a while until a condition */\n\tUCHAR VirtualTimeout; /* peer power save virtual timeout */\n\tSST Sst;\n\tAUTH_STATE AuthState;\t/* for SHARED KEY authentication state machine used only */\n\tBOOLEAN IsReassocSta;\t/* Indicate whether this is a reassociation procedure */\n\tUSHORT Aid;\n\tUSHORT CapabilityInfo;\n\tUCHAR LastRssi;\n\tULONG NoDataIdleCount;\n\tUINT16 StationKeepAliveCount;\t/* unit: second */\n\tULONG PsQIdleCount;\n\tQUEUE_HEADER PsQueue;\n\n\tUINT32 StaConnectTime;\t/* the live time of this station since associated with AP */\n\tUINT32 StaIdleTimeout;\t/* idle timeout per entry */\n\n#ifdef UAPSD_SUPPORT\n\t/* these UAPSD states are used on the fly */\n\t/* 0:AC_BK, 1:AC_BE, 2:AC_VI, 3:AC_VO */\n\tBOOLEAN bAPSDCapablePerAC[4];\t/* for trigger-enabled */\n\tBOOLEAN bAPSDDeliverEnabledPerAC[4];\t/* for delivery-enabled */\n\n\n\tUCHAR MaxSPLength;\n\n\tBOOLEAN bAPSDAllAC;\t/* 1: all AC are delivery-enabled U-APSD */\n\n\tQUEUE_HEADER UAPSDQueue[WMM_NUM_OF_AC];\t/* queue for each U-APSD */\n\tUSHORT UAPSDQIdleCount;\t/* U-APSD queue timeout */\n\n\tPQUEUE_ENTRY pUAPSDEOSPFrame;\t/* the last U-APSD frame */\n\tUSHORT UAPSDTxNum;\t/* total U-APSD frame number */\n\tBOOLEAN bAPSDFlagEOSPOK;\t/* 1: EOSP frame is tx by ASIC */\n\tBOOLEAN bAPSDFlagSPStart;\t/* 1: SP is started */\n\n\t/* need to use unsigned long, because time parameters in OS is defined as\n\t   unsigned long */\n\tunsigned long UAPSDTimeStampLast;\t/* unit: 1000000/OS_HZ */\n\tBOOLEAN bAPSDFlagSpRoughUse;\t/* 1: use rough SP (default: accurate) */\n\n\t/* we will set the flag when PS-poll frame is received and\n\t   clear it when statistics handle.\n\t   if the flag is set when PS-poll frame is received then calling\n\t   statistics handler to clear it. */\n\tBOOLEAN bAPSDFlagLegacySent;\t/* 1: Legacy PS sent but\n\t\t\t\t\t   yet statistics handle */\n\n#ifdef RTMP_MAC_USB\n\tUINT32 UAPSDTagOffset[WMM_NUM_OF_AC];\n#endif /* RTMP_MAC_USB */\n#endif /* UAPSD_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\tBOOLEAN bSendBAR;\n\tUSHORT NoBADataCountDown;\n\n\tUINT32 CachedBuf[16];\t/* UINT (4 bytes) for alignment */\n\n#ifdef TXBF_SUPPORT\n\tCOUNTER_TXBF TxBFCounters;\t\t/* TxBF Statistics */\n\tUINT LastETxCount;\t\t/* Used to compute %BF statistics */\n\tUINT LastITxCount;\n\tUINT LastTxCount;\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n\tUINT32 StreamModeMACReg;\t/* MAC reg used to control stream mode for this client. 0=>No stream mode */\n#endif // STREAM_MODE_SUPPORT //\n\n\tUINT FIFOCount;\n\tUINT DebugFIFOCount;\n\tUINT DebugTxCount;\n\tBOOLEAN bDlsInit;\n\n/*==================================================== */\n/*WDS entry needs these */\n/* If ValidAsWDS==TRUE, MatchWDSTabIdx is the index in WdsTab.MacTab */\n\tUINT MatchWDSTabIdx;\n\tUCHAR MaxSupportedRate;\n\tUCHAR CurrTxRate;\n\tUCHAR CurrTxRateIndex;\n\tUCHAR lastRateIdx;\n\tUCHAR *pTable;\t/* Pointer to this entry's Tx Rate Table */\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tUCHAR lowTrafficCount;\n\tUCHAR fewPktsCnt;\n\tBOOLEAN perThrdAdj;\n\tUCHAR mcsGroup;/*the mcs group to be tried */\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\tenum RATE_ADAPT_ALG rateAlg;\n\n#ifdef MFB_SUPPORT\n\tUCHAR lastLegalMfb;\t/*last legal mfb which is used to set rate */\n\tBOOLEAN isMfbChanged;\t/*purpose: true when mfb has changed but the new mfb is not adopted for Tx */\n\tstruct _RTMP_RA_LEGACY_TB *LegalMfbRS;\n\tBOOLEAN fLastChangeAccordingMfb;\n\tNDIS_SPIN_LOCK fLastChangeAccordingMfbLock;\n/*Tx MRQ */\n\tBOOLEAN toTxMrq;\n\tUCHAR msiToTx, mrqCnt;\t/*mrqCnt is used to count down the inverted-BF mrq to be sent */\n/*Rx mfb */\n\tUCHAR pendingMfsi;\n/*Tx MFB */\n\tBOOLEAN toTxMfb;\n\tUCHAR\tmfbToTx;\n\tUCHAR\tmfb0, mfb1;\n#endif\t/* MFB_SUPPORT */\n#ifdef TXBF_SUPPORT\n\tUCHAR\t\t\tTxSndgType;\n\tNDIS_SPIN_LOCK\tTxSndgLock;\n\n/* ETxBF */\n\tUCHAR\t\tbfState;\n\tUCHAR\t\tsndgMcs;\n\tUCHAR\t\tsndgBW;\n\tINT\t\t\tsndg0Snr0, sndg0Snr1, sndg0Snr2;\n\tUCHAR\t\tsndg0Mcs;\n#ifdef ETXBF_EN_COND3_SUPPORT\n\tUCHAR\t\tbestMethod;\n\tUCHAR\t\tsndgRateIdx;\n\tUCHAR\t\tbf0Mcs, sndg0RateIdx, bf0RateIdx;\n\tUCHAR\t\tsndg1Mcs, bf1Mcs, sndg1RateIdx, bf1RateIdx;\n\tINT\t\t\tsndg1Snr0, sndg1Snr1, sndg1Snr2;\n#endif /* ETXBF_EN_COND3_SUPPORT */\n\tUCHAR\t\tnoSndgCnt;\n\tUCHAR\t\teTxBfEnCond;\n\tUCHAR\t\tnoSndgCntThrd, ndpSndgStreams;\n\tUCHAR\t\tiTxBfEn;\n\n\tBOOLEAN\t\tphyETxBf;\t\t\t/* True=>Set ETxBF bit in PHY rate */\n\tBOOLEAN\t\tphyITxBf;\t\t\t/* True=>Set ITxBF bit in PHY rate */\n\tUCHAR\t\tlastNonBfRate;\t\t/* Last good non-BF rate */\n\tBOOLEAN\t\tlastRatePhyTxBf;\t/* For Quick Check. True if last rate was BF */\n\tUSHORT      BfTxQuality[MAX_TX_RATE_INDEX + 1];\t/* Beamformed TX Quality */\n#endif /* TXBF_SUPPORT */\n\n\t/* to record the each TX rate's quality. 0 is best, the bigger the worse. */\n\tUSHORT      TxQuality[MAX_TX_RATE_INDEX + 1];\n\tUINT32\t\tOneSecTxNoRetryOkCount;\n\tUINT32      OneSecTxRetryOkCount;\n\tUINT32      OneSecTxFailCount;\n\tUINT32      OneSecRxLGICount;\t\t/* unicast-to-me Long GI count */\n\tUINT32      OneSecRxSGICount;      \t/* unicast-to-me Short GI count */\n\n#ifdef FIFO_EXT_SUPPORT\n\tUINT32\t\tfifoTxSucCnt;\n\tUINT32\t\tfifoTxRtyCnt;\n#endif /* FIFO_EXT_SUPPORT */\n\n\n\tBOOLEAN fLastSecAccordingRSSI;\n\tUCHAR LastSecTxRateChangeAction;\t/* 0: no change, 1:rate UP, 2:rate down */\n\tCHAR LastTimeTxRateChangeAction;\t/*Keep last time value of LastSecTxRateChangeAction */\n\tULONG LastTxOkCount; /* TxSuccess count in last Rate Adaptation interval */\n\tUCHAR LastTxPER;\t/* Tx PER in last Rate Adaptation interval */\n\tUCHAR PER[MAX_TX_RATE_INDEX + 1];\n\n\tUINT32 ContinueTxFailCnt;\n\tUINT32 CurrTxRateStableTime;\t/* # of second in current TX rate */\n\tUCHAR TxRateUpPenalty;\t/* extra # of second penalty due to last unstable condition */\n\tULONG TimeStamp_toTxRing;\n\n/*==================================================== */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tUINT MatchAPCLITabIdx;\t/* indicate the index in ApCfg.ApCliTab. */\n#endif\t\t\t\t/* APCLI_SUPPORT */\n#endif\t\t\t\t/* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\n\tUINT MatchDlsEntryIdx;\t/* indicate the index in pAd->StaCfg.DLSEntry */\n#endif\t\t\t\t/* QOS_DLS_SUPPORT */\n#endif\t\t\t\t/* CONFIG_STA_SUPPORT */\n\n\t/*\n\t\tA bitmap of BOOLEAN flags. each bit represent an operation status of a particular\n\t\tBOOLEAN control, either ON or OFF. These flags should always be accessed via\n\t\tCLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros.\n\t\tsee fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED\n\t*/\n\tULONG ClientStatusFlags;\n\n\tHTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;\t/* For transmit phy setting in TXWI. */\n\n#ifdef DOT11_N_SUPPORT\n\t/* HT EWC MIMO-N used parameters */\n\tUSHORT RXBAbitmap;\t/* fill to on-chip  RXWI_BA_BITMASK in 8.1.3RX attribute entry format */\n\tUSHORT TXBAbitmap;\t/* This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI */\n\tUSHORT TXAutoBAbitmap;\n\tUSHORT BADeclineBitmap;\n\tUSHORT BARecWcidArray[NUM_OF_TID];\t/* The mapping wcid of recipient session. if RXBAbitmap bit is masked */\n\tUSHORT BAOriWcidArray[NUM_OF_TID];\t/* The mapping wcid of originator session. if TXBAbitmap bit is masked */\n\tUSHORT BAOriSequence[NUM_OF_TID];\t/* The mapping wcid of originator session. if TXBAbitmap bit is masked */\n\n\t/* 802.11n features. */\n\tUCHAR MpduDensity;\n\tUCHAR MaxRAmpduFactor;\n\tUCHAR AMsduSize;\n\tUCHAR MmpsMode;\t\t/* MIMO power save more. */\n\n\tHT_CAPABILITY_IE HTCapability;\n\n#ifdef DOT11N_DRAFT3\n\tUCHAR BSS2040CoexistenceMgmtSupport;\n\tBOOLEAN bForty_Mhz_Intolerant;\n#endif /* DOT11N_DRAFT3 */\n\n#ifdef DOT11_VHT_AC\n\tVHT_CAP_IE vht_cap_ie;\n#endif /* DOT11_VHT_AC */\n\n#endif /* DOT11_N_SUPPORT */\n\n\n\tBOOLEAN bAutoTxRateSwitch;\n\n\tUCHAR RateLen;\n\tstruct _MAC_TABLE_ENTRY *pNext;\n\tUSHORT TxSeq[NUM_OF_TID];\n\tUSHORT NonQosDataSeq;\n\n\tRSSI_SAMPLE RssiSample;\n\tUINT32 LastRxRate;\n\tSHORT freqOffset;\t\t/* Last RXWI FOFFSET */\n\tSHORT freqOffsetValid;\t/* Set when freqOffset field has been updated */\n\n\n\tBOOLEAN bWscCapable;\n\tUCHAR Receive_EapolStart_EapRspId;\n\n\tUINT32 TXMCSExpected[MAX_MCS_SET];\n\tUINT32 TXMCSSuccessful[MAX_MCS_SET];\n\tUINT32 TXMCSFailed[MAX_MCS_SET];\n\tUINT32 TXMCSAutoFallBack[MAX_MCS_SET][MAX_MCS_SET];\n\n#ifdef CONFIG_STA_SUPPORT\n\tULONG LastBeaconRxTime;\n#endif\t\t\t\t/* CONFIG_STA_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\tBOOLEAN WapiUskRekeyTimerRunning;\n\tRALINK_TIMER_STRUCT WapiUskRekeyTimer;\n\tUINT32 wapi_usk_rekey_cnt;\n#endif\t\t\t\t/* WAPI_SUPPORT */\n\n\n\tULONG AssocDeadLine;\n\n\n\n\n\tULONG ChannelQuality;\t/* 0..100, Channel Quality Indication for Roaming */\n\n\n#ifdef CONFIG_AP_SUPPORT\n\tMULTISSID_STRUCT *pMbss;\n#endif\t\t\t\t/* CONFIG_AP_SUPPORT */\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t/* total 128B, use UINT32 to avoid alignment problem */\n\tUINT32 HeaderBuf[32];\t/* (total 128B) TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP */\n\n\tUCHAR HdrPadLen;\t/* recording Header Padding Length; */\n\tUCHAR MpduHeaderLen;\n\tUINT16 Protocol;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\tAGS_CONTROL AGSCtrl;\t/* AGS control */\n#endif /* AGS_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tLARGE_INTEGER TxPackets;\n\tLARGE_INTEGER RxPackets;\n\tULONG TxBytes;\n\tULONG RxBytes;\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef P2P_SUPPORT\n\tP2P_ENTRY_PARM P2pInfo;\n\tBOOLEAN bP2pClient;\n#endif /* P2P_SUPPORT */\n#ifdef WFD_SUPPORT\n\tBOOLEAN bWfdClient;\n#endif /* WFD_SUPPORT */\n#ifdef IWSC_SUPPORT\n\tBOOLEAN\t\t\tbIWscSmpbcAccept;\n#endif /* IWSC_SUPPORT */\n\nUCHAR\tSupportRateMode; /* 1: CCK 2:OFDM 4: HT, 8:VHT */\nBOOLEAN SupportCCKMCS[MAX_LEN_OF_CCK_RATES];\nBOOLEAN SupportOFDMMCS[MAX_LEN_OF_OFDM_RATES];\nBOOLEAN SupportHTMCS[MAX_LEN_OF_HT_RATES];\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\tUINT16\t\t\tTdlsTxFailCount;\n\tUINT32\t\t\tTdlsKeyLifeTimeCount;\n\tUCHAR\t\t\tMatchTdlsEntryIdx; // indicate the index in pAd->StaCfg.DLSEntry\n#endif // DOT11Z_TDLS_SUPPORT //\n\n#ifdef DOT11_VHT_AC\nBOOLEAN SupportVHTMCS[MAX_LEN_OF_VHT_RATES];\n#endif /* DOT11_VHT_AC */\n#ifdef CONFIG_MULTI_CHANNEL\n\tBOOLEAN bDoRateTune;\n#endif /* CONFIG_MULTI_CHANNEL */\n} MAC_TABLE_ENTRY, *PMAC_TABLE_ENTRY;\n\n\ntypedef struct _MAC_TABLE {\n\tMAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE];\n\tMAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE];\n\tUSHORT Size;\n\tQUEUE_HEADER McastPsQueue;\n\tULONG PsQIdleCount;\n\tBOOLEAN fAnyStationInPsm;\n\tBOOLEAN fAnyStationBadAtheros;\t/* Check if any Station is atheros 802.11n Chip.  We need to use RTS/CTS with Atheros 802,.11n chip. */\n\tBOOLEAN fAnyTxOPForceDisable;\t/* Check if it is necessary to disable BE TxOP */\n\tBOOLEAN fAllStationAsRalink;\t/* Check if all stations are ralink-chipset */\n#ifdef DOT11_N_SUPPORT\n\tBOOLEAN fAnyStationIsLegacy;\t/* Check if I use legacy rate to transmit to my BSS Station/ */\n\tBOOLEAN fAnyStationNonGF;\t/* Check if any Station can't support GF. */\n\tBOOLEAN fAnyStation20Only;\t/* Check if any Station can't support GF. */\n\tBOOLEAN fAnyStationMIMOPSDynamic;\t/* Check if any Station is MIMO Dynamic */\n\tBOOLEAN fAnyBASession;\t/* Check if there is BA session.  Force turn on RTS/CTS */\n\tBOOLEAN fAnyStaFortyIntolerant;\t/* Check if still has any station set the Intolerant bit on! */\n\tBOOLEAN fAllStationGainGoodMCS; /* Check if all stations more than MCS threshold */\n\n#ifdef CONFIG_AP_SUPPORT\n\tBOOLEAN fAnyStationIsHT;\t/* Check if there is 11n STA.  Force turn off AP MIMO PS */\n#endif\t\t\t\t/* CONFIG_AP_SUPPORT */\n#endif\t\t\t\t/* DOT11_N_SUPPORT */\n\n\tUSHORT\t\t\tMsduLifeTime; /* life time for PS packet */\n\n#ifdef WAPI_SUPPORT\n\tBOOLEAN fAnyWapiStation;\n#endif\t\t\t\t/* WAPI_SUPPORT */\n} MAC_TABLE, *PMAC_TABLE;\n\n\n/***************************************************************************\n  *\tAP WDS related data structures\n  **************************************************************************/\n//#ifdef WDS_SUPPORT\ntypedef struct _WDS_COUNTER {\n\tLARGE_INTEGER ReceivedFragmentCount;\n\tLARGE_INTEGER TransmittedFragmentCount;\n\tULONG ReceivedByteCount;\n\tULONG TransmittedByteCount;\n\tULONG RxErrors;\n\tULONG TxErrors;\n\tLARGE_INTEGER MulticastReceivedFrameCount;\n\tULONG OneCollision;\n\tULONG MoreCollisions;\n\tULONG RxNoBuffer;\n\tULONG RcvAlignmentErrors;\n} WDS_COUNTER, *PWDS_COUNTER;\n\ntypedef struct _WDS_ENTRY {\n\tBOOLEAN Valid;\n\tUCHAR Addr[MAC_ADDR_LEN];\n\tULONG NoDataIdleCount;\n\tstruct _WDS_ENTRY *pNext;\n} WDS_ENTRY, *PWDS_ENTRY;\n\ntypedef struct _WDS_TABLE_ENTRY {\n\tUSHORT Size;\n\tUCHAR WdsAddr[MAC_ADDR_LEN];\n\tWDS_ENTRY *Hash[HASH_TABLE_SIZE];\n\tWDS_ENTRY Content[MAX_LEN_OF_MAC_TABLE];\n\tUCHAR MaxSupportedRate;\n\tUCHAR CurrTxRate;\n\tUSHORT TxQuality[MAX_LEN_OF_SUPPORTED_RATES];\n\tUSHORT OneSecTxOkCount;\n\tUSHORT OneSecTxRetryOkCount;\n\tUSHORT OneSecTxFailCount;\n\tULONG CurrTxRateStableTime;\t/* # of second in current TX rate */\n\tUCHAR TxRateUpPenalty;\t/* extra # of second penalty due to last unstable condition */\n} WDS_TABLE_ENTRY, *PWDS_TABLE_ENTRY;\n\ntypedef struct _RT_802_11_WDS_ENTRY {\n\tstruct wifi_dev wdev;\n\tPNET_DEV dev;\n\tUCHAR Valid;\n\tUCHAR PhyMode;\n\tUCHAR PeerWdsAddr[MAC_ADDR_LEN];\n\tUCHAR MacTabMatchWCID;\t/* ASIC */\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\tUCHAR KeyIdx;\n\tCIPHER_KEY WdsKey;\n\tHTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;\n\tRT_PHY_INFO DesiredHtPhyInfo;\n\tBOOLEAN bAutoTxRateSwitch;\n\tDESIRED_TRANSMIT_SETTING DesiredTransmitSetting;\t/* Desired transmit setting. */\n\tWDS_COUNTER WdsCounter;\n\n#ifdef WDS_VLAN_SUPPORT\n\t/* VLAN */\n    USHORT\t\t\t\tVLAN_VID;\n    USHORT\t\t\t\tVLAN_Priority;\n#endif /* WDS_VLAN_SUPPORT */\n} RT_802_11_WDS_ENTRY, *PRT_802_11_WDS_ENTRY;\n\ntypedef struct _WDS_TABLE {\n\tUCHAR Mode;\n\tULONG Size;\n\tRT_802_11_WDS_ENTRY WdsEntry[MAX_WDS_ENTRY];\n} WDS_TABLE, *PWDS_TABLE;\n//#endif /* WDS_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n/***************************************************************************\n  *\tAP APCLI related data structures\n  **************************************************************************/\ntypedef struct _APCLI_STRUCT {\n\tstruct wifi_dev wdev;\n\t\n\tPNET_DEV dev;\n#ifdef RTL865X_SOC\n\tunsigned int mylinkid;\n#endif\n\tBOOLEAN Enable;\t\t/* Set it as 1 if the apcli interface was configured to \"1\"  or by iwpriv cmd \"ApCliEnable\" */\n\tBOOLEAN Valid;\t\t/* Set it as 1 if the apcli interface associated success to remote AP. */\n\tUCHAR MacTabWCID;\t/*WCID value, which point to the entry of ASIC Mac table. */\n\tUCHAR SsidLen;\n\tCHAR Ssid[MAX_LEN_OF_SSID];\n\n\tUCHAR CfgSsidLen;\n\tCHAR CfgSsid[MAX_LEN_OF_SSID];\n\tUCHAR CfgApCliBssid[ETH_LENGTH_OF_ADDRESS];\n\tUCHAR CurrentAddress[ETH_LENGTH_OF_ADDRESS];\n\n\tULONG ApCliRcvBeaconTime;\n\tULONG ApCliLinkUpTime;\n\tUSHORT ApCliBeaconPeriod;\n\n\tULONG CtrlCurrState;\n\tULONG SyncCurrState;\n\tULONG AuthCurrState;\n\tULONG AssocCurrState;\n\tULONG WpaPskCurrState;\n\n\tUSHORT AuthReqCnt;\n\tUSHORT AssocReqCnt;\n\n\tULONG ClientStatusFlags;\n\tUCHAR MpduDensity;\n\n\tNDIS_802_11_AUTHENTICATION_MODE AuthMode;\t/* This should match to whatever microsoft defined */\n\tNDIS_802_11_WEP_STATUS WepStatus;\n\n\t/* Add to support different cipher suite for WPA2/WPA mode */\n\tNDIS_802_11_ENCRYPTION_STATUS GroupCipher;\t/* Multicast cipher suite */\n\tNDIS_802_11_ENCRYPTION_STATUS PairCipher;\t/* Unicast cipher suite */\n\tBOOLEAN bMixCipher;\t/* Indicate current Pair & Group use different cipher suites */\n\tUSHORT RsnCapability;\n\n\tUCHAR PSK[100];\t\t/* reserve PSK key material */\n\tUCHAR PSKLen;\n\tUCHAR PMK[32];\t\t/* WPA PSK mode PMK */\n\t/*UCHAR       PTK[64];                // WPA PSK mode PTK */\n\tUCHAR GTK[32];\t\t/* GTK from authenticator */\n\n\t/*CIPHER_KEY            PairwiseKey; */\n\tCIPHER_KEY SharedKey[SHARE_KEY_NUM];\n\tUCHAR DefaultKeyId;\n\n\t/* WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED */\n\t/*UCHAR       PortSecured; */\n\n\t/* store RSN_IE built by driver */\n\tUCHAR RSN_IE[MAX_LEN_OF_RSNIE];\t/* The content saved here should be convert to little-endian format. */\n\tUCHAR RSNIE_Len;\n\n\t/* For WPA countermeasures */\n\tULONG LastMicErrorTime;\t/* record last MIC error time */\n\t/*ULONG       MicErrCnt;          // Should be 0, 1, 2, then reset to zero (after disassoiciation). */\n\tBOOLEAN bBlockAssoc;\t/* Block associate attempt for 60 seconds after counter measure occurred. */\n\n\t/* For WPA-PSK supplicant state */\n\t/*WPA_STATE     WpaState;           // Default is SS_NOTUSE */\n\t/*UCHAR         ReplayCounter[8]; */\n\t/*UCHAR         ANonce[32];         // ANonce for WPA-PSK from authenticator */\n\tUCHAR SNonce[32];\t/* SNonce for WPA-PSK */\n\tUCHAR GNonce[32];\t/* GNonce for WPA-PSK from authenticator */\n\n#ifdef WSC_AP_SUPPORT\n\tWSC_CTRL WscControl;\n#endif /* WSC_AP_SUPPORT */\n\n\tHTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;\n\tRT_PHY_INFO DesiredHtPhyInfo;\n\tBOOLEAN bAutoTxRateSwitch;\n\tDESIRED_TRANSMIT_SETTING DesiredTransmitSetting;\t/* Desired transmit setting. */\n\tUCHAR RxMcsSet[16];\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\n    \tBOOLEAN             IEEE8021X;\n  \tBOOLEAN             IEEE8021x_required_keys;\n    \tCIPHER_KEY\t        DesireSharedKey[4];\t// Record user desired WEP keys\t\n    \tUCHAR               DesireSharedKeyId;\n    \tUCHAR               WpaSupplicantUP;\n\tUCHAR\t\t\t\tWpaSupplicantScanCount;\n\tBOOLEAN\t\t\t\tbRSN_IE_FromWpaSupplicant;\n\tBOOLEAN\t\t\t\tbLostAp;\n\tUCHAR\t\t\t\t*pWpsProbeReqIe;\n\tUINT\t\t\t\tWpsProbeReqIeLen;\n\tUCHAR\t\t\t\t*pWpaAssocIe;\n\tUINT\t\t\t\tWpaAssocIeLen;\n\tBOOLEAN\t\t\t    bScanReqIsFromWebUI;\n\tBSSID_INFO\tSavedPMK[PMKID_NO];\n\tUINT\t\tSavedPMKNum;\t\t\t// Saved PMKID number\n\tBOOLEAN\t\tbConfigChanged;\n\tNDIS_802_11_ASSOCIATION_INFORMATION     AssocInfo;\n\tUSHORT       ReqVarIELen;                // Length of next VIE include EID & Length\n\tUCHAR       ReqVarIEs[MAX_VIE_LEN];\t\t// The content saved here should be little-endian format.\n\tUSHORT       ResVarIELen;                // Length of next VIE include EID & Length\n\tUCHAR       ResVarIEs[MAX_VIE_LEN];\n\tUCHAR       LastSsidLen;               // the actual ssid length in used\n\tCHAR        LastSsid[MAX_LEN_OF_SSID]; // NOT NULL-terminated\n\tUCHAR\t\tLastBssid[MAC_ADDR_LEN];\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n\n#ifdef P2P_SUPPORT\n\tBOOLEAN \t\t\t\t\tbP2pClient;\n#endif /* P2P_SUPPORT */\n\n    PSPOLL_FRAME PsPollFrame;\n    HEADER_802_11 NullFrame;\n\n\tUAPSD_INFO\tUapsdInfo;\n} APCLI_STRUCT, *PAPCLI_STRUCT;\n\ntypedef struct _AP_ADMIN_CONFIG {\n\tUSHORT CapabilityInfo;\n\t/* Multiple SSID */\n\tUCHAR BssidNum;\n\tUCHAR MacMask;\n\tMULTISSID_STRUCT MBSSID[HW_BEACON_MAX_NUM];\n\tULONG IsolateInterStaTrafficBTNBSSID;\n\n#ifdef APCLI_SUPPORT\n\tUCHAR ApCliInfRunned;\t/* Number of  ApClient interface which was running. value from 0 to MAX_APCLI_INTERFACE */\n\tBOOLEAN FlgApCliIsUapsdInfoUpdated;\n\tAPCLI_STRUCT ApCliTab[MAX_APCLI_NUM];\t/*AP-client */\n#endif\t\t\t\t/* APCLI_SUPPORT */\n\n\t/* for wpa */\n\tRALINK_TIMER_STRUCT CounterMeasureTimer;\n\n\tUCHAR CMTimerRunning;\n\tUCHAR BANClass3Data;\n\tLARGE_INTEGER aMICFailTime;\n\tLARGE_INTEGER PrevaMICFailTime;\n\tULONG MICFailureCounter;\n\n\tRSSI_SAMPLE RssiSample;\n\tULONG NumOfAvgRssiSample;\n\n\tBOOLEAN bAutoChannelAtBootup;\t/* 0: disable, 1: enable */\n\tChannelSel_Alg AutoChannelAlg;\t/* Alg for selecting Channel */\n#ifdef AP_SCAN_SUPPORT\n\tUINT32  ACSCheckTime;           /* Periodic timer to trigger Auto Channel Selection (unit: second) */\n\tUINT32  ACSCheckCount;          /* if  ACSCheckCount > ACSCheckTime, then do ACS check */\n#endif /* AP_SCAN_SUPPORT */\n\tBOOLEAN bAvoidDfsChannel;\t/* 0: disable, 1: enable */\n\tBOOLEAN bIsolateInterStaTraffic;\n\tBOOLEAN bHideSsid;\n\n\t/* temporary latch for Auto channel selection */\n\tULONG ApCnt;\t\t/* max RSSI during Auto Channel Selection period */\n\tUCHAR AutoChannel_Channel;\t/* channel number during Auto Channel Selection */\n\tUCHAR current_channel_index;\t/* current index of channel list */\n\tUCHAR AutoChannelSkipListNum;\t/* number of rejected channel list */\n\tUCHAR AutoChannelSkipList[10];\n\tUCHAR DtimCount;\t/* 0.. DtimPeriod-1 */\n\tUCHAR DtimPeriod;\t/* default = 3 */\n\tUCHAR ErpIeContent;\n\tULONG LastOLBCDetectTime;\n\tULONG LastNoneHTOLBCDetectTime;\n\tULONG LastScanTime;\t/* Record last scan time for issue BSSID_SCAN_LIST */\n\n\tUCHAR LastSNR0;\t\t/* last received BEACON's SNR */\n\tUCHAR LastSNR1;\t\t/* last received BEACON's SNR for 2nd  antenna */\n#ifdef DOT11N_SS3_SUPPORT\n\tUCHAR LastSNR2;\t\t/* last received BEACON's SNR for 2nd  antenna */\n#endif\t\t\t\t/* DOT11N_SS3_SUPPORT */\n\n#ifdef DOT1X_SUPPORT\n\t/* dot1x related parameter */\n\tUINT32 own_ip_addr;\n\tUINT32 retry_interval;\n\tUINT32 session_timeout_interval;\n\tUINT32 quiet_interval;\n\tUCHAR EAPifname[HW_BEACON_MAX_NUM][IFNAMSIZ];\t/* indicate as the binding interface for EAP negotiation. */\n\tUCHAR EAPifname_len[HW_BEACON_MAX_NUM];\n\tUCHAR PreAuthifname[HW_BEACON_MAX_NUM][IFNAMSIZ];\t/* indicate as the binding interface for WPA2 Pre-authentication. */\n\tUCHAR PreAuthifname_len[HW_BEACON_MAX_NUM];\n#endif\t\t\t\t/* DOT1X_SUPPORT */\n\n\t/* EDCA parameters to be announced to its local BSS */\n\tEDCA_PARM BssEdcaParm;\n\n\tRALINK_TIMER_STRUCT ApQuickResponeForRateUpTimer;\n\tBOOLEAN ApQuickResponeForRateUpTimerRunning;\n\n#ifdef IDS_SUPPORT\n\t/* intrusion detection parameter */\n\tBOOLEAN IdsEnable;\n\tUINT32 AuthFloodThreshold;\t/* Authentication frame flood threshold */\n\tUINT32 AssocReqFloodThreshold;\t/* Association request frame flood threshold */\n\tUINT32 ReassocReqFloodThreshold;\t/* Re-association request frame flood threshold */\n\tUINT32 ProbeReqFloodThreshold;\t/* Probe request frame flood threshold */\n\tUINT32 DisassocFloodThreshold;\t/* Disassociation frame flood threshold */\n\tUINT32 DeauthFloodThreshold;\t/* Deauthentication frame flood threshold */\n\tUINT32 EapReqFloodThreshold;\t/* EAP request frame flood threshold */\n\n\tUINT32 RcvdAuthCount;\n\tUINT32 RcvdAssocReqCount;\n\tUINT32 RcvdReassocReqCount;\n\tUINT32 RcvdProbeReqCount;\n\tUINT32 RcvdDisassocCount;\n\tUINT32 RcvdDeauthCount;\n\tUINT32 RcvdEapReqCount;\n\n\tRALINK_TIMER_STRUCT IDSTimer;\n\tBOOLEAN IDSTimerRunning;\n#endif\t\t\t\t/* IDS_SUPPORT */\n\n\t/* Indicate the maximum idle timeout */\n\tUINT32 StaIdleTimeout;\n\n\tULONG EntryLifeCheck;\n\n#ifdef IGMP_SNOOP_SUPPORT\n\tBOOLEAN IgmpSnoopEnable;\t/* 0: disable, 1: enable. */\n#endif\t\t\t\t/* IGMP_SNOOP_SUPPORT */\n\n\n#ifdef CLIENT_WDS\n\tNDIS_SPIN_LOCK CliWdsTabLock;\n\tPCLIWDS_PROXY_ENTRY pCliWdsEntryPool;\n\tLIST_HEADER CliWdsEntryFreeList;\n\tLIST_HEADER CliWdsProxyTab[CLIWDS_HASH_TAB_SIZE];\n#endif /* CLIENT_WDS */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\n\tUCHAR GreenAPLevel;\n\tBOOLEAN bGreenAPEnable;\n\tBOOLEAN bGreenAPActive;\n#endif /* GREENAP_SUPPORT */\n\n\tULONG\tMAX_PSDU_LEN;\t/* Maximum PSDU length */\n#endif /* DOT11_N_SUPPORT */\n\n\tUCHAR\tEntryClientCount;\n} AP_ADMIN_CONFIG, *PAP_ADMIN_CONFIG;\n\n#ifdef IGMP_SNOOP_SUPPORT\ntypedef enum _IGMP_GROUP_TYPE {\n\tMODE_IS_INCLUDE = 1,\n\tMODE_IS_EXCLUDE,\n\tCHANGE_TO_INCLUDE_MODE,\n\tCHANGE_TO_EXCLUDE_MODE,\n\tALLOW_NEW_SOURCES,\n\tBLOCK_OLD_SOURCES\n} IgmpGroupType;\n\ntypedef enum _MULTICAST_FILTER_ENTRY_TYPE {\n\tMCAT_FILTER_STATIC = 0,\n\tMCAT_FILTER_DYNAMIC,\n} MulticastFilterEntryType;\n\ntypedef struct _MEMBER_ENTRY {\n\tstruct _MEMBER_ENTRY *pNext;\n\tUCHAR Addr[MAC_ADDR_LEN];\n/*\tUSHORT Aid; */\n} MEMBER_ENTRY, *PMEMBER_ENTRY;\n\ntypedef struct _MULTICAST_FILTER_TABLE_ENTRY {\n\tBOOLEAN Valid;\n\tMulticastFilterEntryType type;\t/* 0: static, 1: dynamic. */\n\tUINT lastTime;\n\tPNET_DEV net_dev;\n\tUCHAR Addr[MAC_ADDR_LEN];\n\tLIST_HEADER MemberList;\n\tstruct _MULTICAST_FILTER_TABLE_ENTRY *pNext;\n} MULTICAST_FILTER_TABLE_ENTRY, *PMULTICAST_FILTER_TABLE_ENTRY;\n\ntypedef struct _MULTICAST_FILTER_TABLE {\n\tUCHAR Size;\n\tPMULTICAST_FILTER_TABLE_ENTRY\n\t  Hash[MAX_LEN_OF_MULTICAST_FILTER_HASH_TABLE];\n\tMULTICAST_FILTER_TABLE_ENTRY Content[MAX_LEN_OF_MULTICAST_FILTER_TABLE];\n\tNDIS_SPIN_LOCK MulticastFilterTabLock;\n\tNDIS_SPIN_LOCK FreeMemberPoolTabLock;\n\tMEMBER_ENTRY freeMemberPool[FREE_MEMBER_POOL_SIZE];\n\tLIST_HEADER freeEntryList;\n} MULTICAST_FILTER_TABLE, *PMULTICAST_FILTER_TABLE;\n#endif /* IGMP_SNOOP_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\ntypedef enum _RT_GREEN_AP_LEVEL {\n\tGREENAP_11BGN_STAS = 0,\n\tGREENAP_ONLY_11BG_STAS,\n\tGREENAP_WITHOUT_ANY_STAS_CONNECT\n} RT_GREEN_AP_LEVEL;\n#endif /* DOT11_N_SUPPORT */\n#endif /* GREENAP_SUPPORT */\n\n/* ----------- end of AP ---------------------------- */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef BLOCK_NET_IF\ntypedef struct _BLOCK_QUEUE_ENTRY {\n\tBOOLEAN SwTxQueueBlockFlag;\n\tLIST_HEADER NetIfList;\n} BLOCK_QUEUE_ENTRY, *PBLOCK_QUEUE_ENTRY;\n#endif /* BLOCK_NET_IF */\n\n\nstruct wificonf {\n\tBOOLEAN bShortGI;\n\tBOOLEAN bGreenField;\n};\n\ntypedef struct _RTMP_DEV_INFO_ {\n\tUCHAR chipName[16];\n\tRTMP_INF_TYPE infType;\n} RTMP_DEV_INFO;\n\n#ifdef DBG_DIAGNOSE\n#define DIAGNOSE_TIME\t10\t/* 10 sec */\ntypedef struct _RtmpDiagStrcut_ {\t/* Diagnosis Related element */\n\tunsigned char inited;\n\tunsigned char qIdx;\n\tunsigned char ArrayStartIdx;\n\tunsigned char ArrayCurIdx;\n\t/* Tx Related Count */\n\tUSHORT TxDataCnt[DIAGNOSE_TIME];\n\tUSHORT TxFailCnt[DIAGNOSE_TIME];\n/*\tUSHORT TxDescCnt[DIAGNOSE_TIME][16];\t\t// TxDesc queue length in scale of 0~14, >=15 */\n\tUSHORT TxDescCnt[DIAGNOSE_TIME][24];\t/* 3*3    // TxDesc queue length in scale of 0~14, >=15 */\n/*\tUSHORT TxMcsCnt[DIAGNOSE_TIME][16];\t\t\t// TxDate MCS Count in range from 0 to 15, step in 1. */\n\tUSHORT TxMcsCnt[DIAGNOSE_TIME][MAX_MCS_SET];\t/* 3*3 */\n\tUSHORT TxSWQueCnt[DIAGNOSE_TIME][9];\t/* TxSwQueue length in scale of 0, 1, 2, 3, 4, 5, 6, 7, >=8 */\n\n\tUSHORT TxAggCnt[DIAGNOSE_TIME];\n\tUSHORT TxNonAggCnt[DIAGNOSE_TIME];\n/*\tUSHORT TxAMPDUCnt[DIAGNOSE_TIME][16];\t\t// 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1. */\n\tUSHORT TxAMPDUCnt[DIAGNOSE_TIME][MAX_MCS_SET];\t/* 3*3 // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1. */\n\tUSHORT TxRalinkCnt[DIAGNOSE_TIME];\t/* TxRalink Aggregation Count in 1 sec scale. */\n\tUSHORT TxAMSDUCnt[DIAGNOSE_TIME];\t/* TxAMSUD Aggregation Count in 1 sec scale. */\n\n\t/* Rx Related Count */\n\tUSHORT RxDataCnt[DIAGNOSE_TIME];\t/* Rx Total Data count. */\n\tUSHORT RxCrcErrCnt[DIAGNOSE_TIME];\n/*\tUSHORT\t\t\tRxMcsCnt[DIAGNOSE_TIME][16];\t\t// Rx MCS Count in range from 0 to 15, step in 1. */\n\tUSHORT RxMcsCnt[DIAGNOSE_TIME][MAX_MCS_SET];\t/* 3*3 */\n} RtmpDiagStruct;\n#endif /* DBG_DIAGNOSE */\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) \n/*\n\tThe number of channels for per-channel Tx power offset\n*/\n#define NUM_OF_CH_FOR_PER_CH_TX_PWR_OFFSET\t14\n\n/* The Tx power control using the internal ALC */\ntypedef struct _TX_POWER_CONTROL {\n\tBOOLEAN bInternalTxALC; /* Internal Tx ALC */\n\tBOOLEAN bExtendedTssiMode; /* The extended TSSI mode (each channel has different Tx power if needed) */\n\tCHAR PerChTxPwrOffset[NUM_OF_CH_FOR_PER_CH_TX_PWR_OFFSET + 1]; /* Per-channel Tx power offset */\n\tCHAR idxTxPowerTable; /* The index of the Tx power table for ant0 */\n\tCHAR idxTxPowerTable2; /* The index of the Tx power table for ant1 */\n\tCHAR RF_TX_ALC; /* 3390: RF R12[4:0]: Tx0 ALC, 3352: RF R47[4:0]: Tx0 ALC, 5390: RF R49[5:0]: Tx0 ALC */\n\tCHAR MAC_PowerDelta; /* Tx power control over MAC 0x1314~0x1324 */\n\tCHAR MAC_PowerDelta2; /* Tx power control for Tx1 */\n\tCHAR TotalDeltaPower2; /* Tx power control for Tx1 */\n#ifdef RTMP_TEMPERATURE_COMPENSATION\n\tINT LookupTable[IEEE80211_BAND_NUMS][33];\n\tINT RefTemp[IEEE80211_BAND_NUMS];\n\tUCHAR TssiGain[IEEE80211_BAND_NUMS];\n\t/* Index offset, -7....25. */\n\tINT LookupTableIndex;\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n} TX_POWER_CONTROL, *PTX_POWER_CONTROL;\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\n/* */\n/* The entry of transmit power control over MAC */\n/* */\ntypedef struct _TX_POWER_CONTROL_OVER_MAC_ENTRY {\n\tUSHORT MACRegisterOffset;\t/* MAC register offset */\n\tULONG RegisterValue;\t/* Register value */\n} TX_POWER_CONTROL_OVER_MAC_ENTRY, *PTX_POWER_CONTROL_OVER_MAC_ENTRY;\n\n/* */\n/* The maximum registers of transmit power control */\n/* */\n#define MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS 5\n\n\n\n/* */\n/* The configuration of the transmit power control over MAC */\n/* */\ntypedef struct _CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC {\n\tUCHAR NumOfEntries;\t/* Number of entries */\n\tTX_POWER_CONTROL_OVER_MAC_ENTRY TxPwrCtrlOverMAC[MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS];\n} CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC, *PCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC;\n\n/* */\n/* The extension of the transmit power control over MAC */\n/* */\ntypedef struct _TX_POWER_CONTROL_EXT_OVER_MAC {\n\tstruct {\n\t\tULONG TxPwrCfg0;\t/* MAC 0x1314 */\n\t\tULONG TxPwrCfg0Ext;\t/* MAC 0x1390 */\n\t\tULONG TxPwrCfg1;\t/* MAC 0x1318 */\n\t\tULONG TxPwrCfg1Ext;\t/* MAC 0x1394 */\n\t\tULONG TxPwrCfg2;\t/* MAC 0x131C */\n\t\tULONG TxPwrCfg2Ext;\t/* MAC 0x1398 */\n\t\tULONG TxPwrCfg3;\t/* MAC 0x1320 */\n\t\tULONG TxPwrCfg3Ext;\t/* MAC 0x139C */\n\t\tULONG TxPwrCfg4;\t/* MAC 0x1324 */\n\t\tULONG TxPwrCfg4Ext;\t/* MAC 0x13A0 */\n\t\tULONG TxPwrCfg5;\t/* MAC 0x1384 */\n\t\tULONG TxPwrCfg6;\t/* MAC 0x1388 */\n\t\tULONG TxPwrCfg7;\t/* MAC 0x13D4 */\n\t\tULONG TxPwrCfg8;\t/* MAC 0x13D8 */\n\t\tULONG TxPwrCfg9;\t/* MAC 0x13DC */\n\t} BW20Over2Dot4G;\n\n\tstruct {\n\t\tULONG TxPwrCfg0;\t/* MAC 0x1314 */\n\t\tULONG TxPwrCfg0Ext;\t/* MAC 0x1390 */\n\t\tULONG TxPwrCfg1;\t/* MAC 0x1318 */\n\t\tULONG TxPwrCfg1Ext;\t/* MAC 0x1394 */\n\t\tULONG TxPwrCfg2;\t/* MAC 0x131C */\n\t\tULONG TxPwrCfg2Ext;\t/* MAC 0x1398 */\n\t\tULONG TxPwrCfg3;\t/* MAC 0x1320 */\n\t\tULONG TxPwrCfg3Ext;\t/* MAC 0x139C */\n\t\tULONG TxPwrCfg4;\t/* MAC 0x1324 */\n\t\tULONG TxPwrCfg4Ext;\t/* MAC 0x13A0 */\n\t\tULONG TxPwrCfg5;\t/* MAC 0x1384 */\n\t\tULONG TxPwrCfg6;\t/* MAC 0x1388 */\n\t\tULONG TxPwrCfg7;\t/* MAC 0x13D4 */\n\t\tULONG TxPwrCfg8;\t/* MAC 0x13D8 */\n\t\tULONG TxPwrCfg9;\t/* MAC 0x13DC */\n\t} BW40Over2Dot4G;\n\n\tstruct {\n\t\tULONG TxPwrCfg0;\t/* MAC 0x1314 */\n\t\tULONG TxPwrCfg0Ext;\t/* MAC 0x1390 */\n\t\tULONG TxPwrCfg1;\t/* MAC 0x1318 */\n\t\tULONG TxPwrCfg1Ext;\t/* MAC 0x1394 */\n\t\tULONG TxPwrCfg2;\t/* MAC 0x131C */\n\t\tULONG TxPwrCfg2Ext;\t/* MAC 0x1398 */\n\t\tULONG TxPwrCfg3;\t/* MAC 0x1320 */\n\t\tULONG TxPwrCfg3Ext;\t/* MAC 0x139C */\n\t\tULONG TxPwrCfg4;\t/* MAC 0x1324 */\n\t\tULONG TxPwrCfg4Ext;\t/* MAC 0x13A0 */\n\t\tULONG TxPwrCfg5;\t/* MAC 0x1384 */\n\t\tULONG TxPwrCfg6;\t/* MAC 0x1388 */\n\t\tULONG TxPwrCfg7;\t/* MAC 0x13D4 */\n\t\tULONG TxPwrCfg8;\t/* MAC 0x13D8 */\n\t\tULONG TxPwrCfg9;\t/* MAC 0x13DC */\n\t} BW20Over5G;\n\n\tstruct {\n\t\tULONG TxPwrCfg0;\t/* MAC 0x1314 */\n\t\tULONG TxPwrCfg0Ext;\t/* MAC 0x1390 */\n\t\tULONG TxPwrCfg1;\t/* MAC 0x1318 */\n\t\tULONG TxPwrCfg1Ext;\t/* MAC 0x1394 */\n\t\tULONG TxPwrCfg2;\t/* MAC 0x131C */\n\t\tULONG TxPwrCfg2Ext;\t/* MAC 0x1398 */\n\t\tULONG TxPwrCfg3;\t/* MAC 0x1320 */\n\t\tULONG TxPwrCfg3Ext;\t/* MAC 0x139C */\n\t\tULONG TxPwrCfg4;\t/* MAC 0x1324 */\n\t\tULONG TxPwrCfg4Ext;\t/* MAC 0x13A0 */\n\t\tULONG TxPwrCfg5;\t/* MAC 0x1384 */\n\t\tULONG TxPwrCfg6;\t/* MAC 0x1388 */\n\t\tULONG TxPwrCfg7;\t/* MAC 0x13D4 */\n\t\tULONG TxPwrCfg8;\t/* MAC 0x13D8 */\n\t\tULONG TxPwrCfg9;\t/* MAC 0x13DC */\n\t} BW40Over5G;\n} TX_POWER_CONTROL_EXT_OVER_MAC, *PTX_POWER_CONTROL_EXT_OVER_MAC;\n\n/* For Wake on Wireless LAN */\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\ntypedef struct _WOW_CFG_STRUCT {\n\tBOOLEAN\t\t\tbEnable;\t\t/* Enable WOW function*/\n\tBOOLEAN\t\t\tbWOWFirmware;\t/* Enable WOW function, trigger to reload WOW-support firmware */\n\tBOOLEAN\t\t\tbInBand;\t\t/* use in-band signal to wakeup system */\n\tUINT8\t\t\tnSelectedGPIO;\t/* Side band signal to wake up system */\n\tUINT8\t\t\tnDelay;\t\t\t/* Delay number is multiple of 3 secs, and it used to postpone the WOW function */\n\tUINT8           nHoldTime;      /* GPIO puls hold time, unit: 10ms */\n} WOW_CFG_STRUCT, *PWOW_CFG_STRUCT;\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef NEW_WOW_SUPPORT\ntypedef enum {\n\tWOW_PKT_TO_HOST,\n\tWOW_PKT_TO_ANDES\n} WOW_PKT_FLOW_T;\n\ntypedef enum {\n\tWOW_WAKEUP_BY_PCIE,\n\tWOW_WAKEUP_BY_USB,\n\tWOW_WAKEUP_BY_GPIO\n} WOW_WAKEUP_METHOD_T; \n\ntypedef enum {\n\tWOW_ENABLE = 1,\n\tWOW_TRAFFIC = 3,\n\tWOW_WAKEUP = 4\n} WOW_FEATURE_T;\n\ntypedef enum {\n\tWOW_MASK_CFG = 1,\n\tWOW_SEC_CFG,\n\tWOW_INFRA_CFG,\n\tWOW_P2P_CFG,\n} WOW_CONFIG_T;\n\nenum {\n\tWOW_MAGIC_PKT,\n\tWOW_BITMAP,\n\tWOW_IPV4_TCP_SYNC,\n\tWOW_IPV6_TCP_SYNC\n};\n\ntypedef struct NEW_WOW_MASK_CFG_STRUCT {\n\tUINT32 \tConfig_Type;\n\tUINT32 \tFunction_Enable;\n\tUINT32 \tDetect_Mask;\n\tUINT32 \tEvent_Mask;\n} NEW_WOW_MASK_CFG_STRUCT, PNEW_WOW_MASK_CFG_STRUCT;\n\ntypedef struct NEW_WOW_SEC_CFG_STRUCT {\n\tUINT32 \tConfig_Type;\n\tUINT32 \tWPA_Ver;\n\tUCHAR \tPTK[64];\n\tUCHAR \tR_COUNTER[8];\n\tUCHAR \tKey_Id;\n\tUCHAR \tCipher_Alg;\n\tUCHAR \tWCID;\n\tUCHAR \tGroup_Cipher;\n} NEW_WOW_SEC_CFG_STRUCT, PNEW_WOW_SEC_CFG_STRUCT;\n\ntypedef struct NEW_WOW_INFRA_CFG_STRUCT {\n\tUINT32 \tConfig_Type;\n\tUCHAR \tSTA_MAC[6];\n\tUCHAR \tAP_MAC[6];\n\tUINT32 \tAP_Status;\n} NEW_WOW_INFRA_CFG_STRUCT, PNEW_WOW_INFRA_CFG_STRUCT;\n\ntypedef struct _NEW_WOW_P2P_CFG_STRUCT {\n\tUINT32 \tConfig_Type;\n\tUCHAR \tGO_MAC[6];\n\tUCHAR \tCLI_MAC[6];\n\tUINT32 \tP2P_Status;\n} NEW_WOW_P2P_CFG_STRUCT, *PNEW_WOW_P2P_CFG_STRUCT;\n\ntypedef struct _NEW_WOW_PARAM_STRUCT {\n\tUINT32 \tParameter;\n\tUINT32 \tValue;\n} NEW_WOW_PARAM_STRUCT, *PNEW_WOW_PARAM_STRUCT;\n#endif /* NEW_WOW_SUPPORT */\n\n/*\n\tPacket drop reason code\n*/\ntypedef enum{\n\tPKT_ATE_ON = 1 << 8,\n\tPKT_RADAR_ON = 2 << 8,\n\tPKT_RRM_QUIET = 3 << 8,\n\tPKT_TX_STOP = 4 <<8,\n\tPKT_TX_JAM = 5 << 8,\n\n\tPKT_NETDEV_DOWN = 6 < 8,\n\tPKT_NETDEV_NO_MATCH = 7 << 8,\n\tPKT_NOT_ALLOW_SEND = 8 << 8,\n\n\tPKT_INVALID_DST = 9<< 8,\n\tPKT_INVALID_SRC = 10 << 8,\n\tPKT_INVALID_PKT_DATA = 11 << 8,\n\tPKT_INVALID_PKT_LEN = 12 << 8,\n\tPKT_INVALID_ETH_TYPE = 13 << 8,\n\tPKT_INVALID_TXBLK_INFO = 14 << 8,\n\tPKT_INVALID_SW_ENCRYPT = 15 << 8,\n\tPKT_INVALID_PKT_TYPE = 16 << 8,\n\tPKT_INVALID_PKT_MIC = 17 << 8,\n\t\n\tPKT_PORT_NOT_SECURE = 18 << 8,\n\tPKT_TSPEC_NO_MATCH  = 19 << 8,\n\tPKT_NO_ASSOCED_STA = 20 << 8,\n\tPKT_INVALID_MAC_ENTRY = 21 << 8,\n\t\n\tPKT_TX_QUE_FULL = 22 << 8,\n\tPKT_TX_QUE_ADJUST = 23<<8,\n\t\t\n\tPKT_PS_QUE_TIMEOUT = 24 <<8,\n\tPKT_PS_QUE_CLEAN = 25 << 8,\n\tPKT_MCAST_PS_QUE_FULL = 26 << 8,\n\tPKT_UCAST_PS_QUE_FULL = 27 << 8,\n\t\n\tPKT_RX_EAPOL_SANITY_FAIL = 28 <<8,\n\tPKT_RX_NOT_TO_KERNEL = 29 << 8,\n\tPKT_RX_MESH_SIG_FAIL = 30 << 8,\n\tPKT_APCLI_FAIL = 31 << 8,\n\tPKT_ZERO_DATA = 32 <<8,\n\tPKT_SW_DECRYPT_FAIL = 33 << 8,\n\tPKT_TX_SW_ENC_FAIL = 34 << 8,\n\n\tPKT_ACM_FAIL = 35 << 8,\n\tPKT_IGMP_GRP_FAIL = 36 << 8,\n\tPKT_MGMT_FAIL = 37 << 8,\n\tPKT_AMPDU_OUT_ORDER = 38 << 8,\n\tPKT_UAPSD_EOSP = 39 << 8,\n\tPKT_UAPSD_Q_FULL = 40 << 8,\n\n\tPKT_DRO_REASON_MAX = 41,\n}PKT_DROP_REASON;\n\n/* Packet drop Direction code */\ntypedef enum{\n\tPKT_TX = 0,\n\tPKT_RX = 1 << 31,\n}PKT_DROP_DIECTION;\n\n\n\n\ntypedef struct _BBP_RESET_CTL\n{\n#define BBP_RECORD_NUM\t47\n\tREG_PAIR BBPRegDB[BBP_RECORD_NUM];\n\tBOOLEAN\tAsicCheckEn;\n} BBP_RESET_CTL, *PBBP_RESET_CTL;\n\n\n/* */\n/*  The miniport adapter structure */\n/* */\nstruct _RTMP_ADAPTER {\n\tPVOID OS_Cookie;\t/* save specific structure relative to OS */\n\tPNET_DEV net_dev;\n\tULONG VirtualIfCnt;\n\n\tRTMP_CHIP_OP chipOps;\n\tRTMP_CHIP_CAP chipCap;\n\n#ifdef CONFIG_STA_SUPPORT\n\tUSHORT ThisTbttNumToNextWakeUp;\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef HOSTAPD_SUPPORT\n\tUINT32 IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n#ifdef INF_PPA_SUPPORT\n\tUINT32 g_if_id;\n\tBOOLEAN PPAEnable;\n\tPPA_DIRECTPATH_CB *pDirectpathCb;\n#endif /* INF_PPA_SUPPORT */\n\n\n\tNDIS_SPIN_LOCK irq_lock;\n\n\t/*======Cmd Thread in PCI/RBUS/USB */\n\tCmdQ CmdQ;\n\tNDIS_SPIN_LOCK CmdQLock;\t/* CmdQLock spinlock */\n\tRTMP_OS_TASK cmdQTask;\n\n#ifdef RTMP_MAC_USB\n/*****************************************************************************************/\n/*      USB related parameters                                                           */\n/*****************************************************************************************/\n/*\tstruct usb_config_descriptor\t\t*config; */\n\tVOID *config;\n\n\tUINT NumberOfPipes;\n\tUSHORT BulkOutMaxPacketSize;\n\tUSHORT BulkInMaxPacketSize;\n\tUINT8 BulkOutEpAddr[6];\n\tUINT8 BulkInEpAddr[2]; \n\n\t/*======Control Flags */\n\tULONG BulkFlags;\n\tBOOLEAN bUsbTxBulkAggre;\t/* Flags for bulk out data priority */\n\n\t/*======Cmd Thread */\n/*\tCmdQ\t\t\t\t\tCmdQ; */\n/*\tNDIS_SPIN_LOCK\t\t\tCmdQLock;\t\t\t\t// CmdQLock spinlock */\n/*\tRTMP_OS_TASK\t\t\tcmdQTask; */\n\n\t/*======Semaphores (event) */\n\tRTMP_OS_SEM UsbVendorReq_semaphore;\n\tRTMP_OS_SEM reg_atomic;\n\tRTMP_OS_SEM hw_atomic;\n\tPVOID UsbVendorReqBuf;\n\tBOOLEAN VendorResetFlag;\n/*\twait_queue_head_t\t *wait; */\n\tVOID *wait;\n\n\t/* lock for ATE */\n#ifdef RALINK_ATE\n\tNDIS_SPIN_LOCK GenericLock;\t/* ATE Tx/Rx generic spinlock */\n#endif /* RALINK_ATE */\n\n#endif /* RTMP_MAC_USB */\n\n/*****************************************************************************************/\n/*      RBUS related parameters                                                           \t\t\t\t\t\t\t\t  */\n/*****************************************************************************************/\n\n/*****************************************************************************************/\n/*      Both PCI/USB related parameters                                                  \t\t\t\t\t\t\t  */\n/*****************************************************************************************/\n\t/*RTMP_DEV_INFO                 chipInfo; */\n\tRTMP_INF_TYPE infType;\n\n/*****************************************************************************************/\n/*      Driver Mgmt related parameters                                                  \t\t\t\t\t\t\t  */\n/*****************************************************************************************/\n\tRTMP_OS_TASK mlmeTask;\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\t/* If you want use timer task to handle the timer related jobs, enable this. */\n\tRTMP_TIMER_TASK_QUEUE TimerQ;\n\tNDIS_SPIN_LOCK TimerQLock;\n\tRTMP_OS_TASK timerTask;\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\n/*****************************************************************************************/\n/*      Tx related parameters                                                           */\n/*****************************************************************************************/\n\tBOOLEAN DeQueueRunning[NUM_OF_TX_RING];\t/* for ensuring RTUSBDeQueuePacket get call once */\n\tNDIS_SPIN_LOCK DeQueueLock[NUM_OF_TX_RING];\n\n#ifdef RTMP_MAC_USB\n\t/* Data related context and AC specified, 4 AC supported */\n\tNDIS_SPIN_LOCK BulkOutLock[6];\t/* BulkOut spinlock for 4 ACs */\n\tNDIS_SPIN_LOCK MLMEBulkOutLock;\t/* MLME BulkOut lock */\n\n\tHT_TX_CONTEXT TxContext[NUM_OF_TX_RING];\n\tNDIS_SPIN_LOCK TxContextQueueLock[NUM_OF_TX_RING];\t/* TxContextQueue spinlock */\n\n\t/* 4 sets of Bulk Out index and pending flag */\n\t/*\n\t   array size of NextBulkOutIndex must be larger than or equal to 5;\n\t   Or BulkOutPending[0] will be overwrited in NICInitTransmit().\n\t */\n\tUCHAR NextBulkOutIndex[NUM_OF_TX_RING];\t/* only used for 4 EDCA bulkout pipe */\n\n\tBOOLEAN BulkOutPending[6];\t/* used for total 6 bulkout pipe */\n\tUCHAR bulkResetPipeid;\n\tBOOLEAN MgmtBulkPending;\n\tULONG bulkResetReq[6];\n#ifdef INF_AMAZON_SE\n\tULONG BulkOutDataSizeCount[NUM_OF_TX_RING];\n\tBOOLEAN BulkOutDataFlag[NUM_OF_TX_RING];\n\tULONG BulkOutDataSizeLimit[NUM_OF_TX_RING];\n\tUCHAR RunningQueueNoCount;\n\tUCHAR LastRunningQueueNo;\n#endif /* #ifdef INF_AMAZON_SE */\n\n#ifdef CONFIG_STA_SUPPORT\n\tUSHORT CountDowntoPsm;\n#endif /* CONFIG_STA_SUPPORT */\n\n#endif /* RTMP_MAC_USB */\n\n\t/* resource for software backlog queues */\n\tQUEUE_HEADER TxSwQueue[NUM_OF_TX_RING];\t/* 4 AC + 1 HCCA */\n\tNDIS_SPIN_LOCK TxSwQueueLock[NUM_OF_TX_RING];\t/* TxSwQueue spinlock */\n\n\t/* Maximum allowed tx software Queue length */\n\tUINT32\t\t\t\t\tTxSwQMaxLen;\n\n\tRTMP_DMABUF MgmtDescRing;\t/* Shared memory for MGMT descriptors */\n\tRTMP_MGMT_RING MgmtRing;\n\tNDIS_SPIN_LOCK MgmtRingLock;\t/* Prio Ring spinlock */\n\n\n\tUCHAR LastMCUCmd;\n\n/*****************************************************************************************/\n/*      Rx related parameters                                                           */\n/*****************************************************************************************/\n\n\n#ifdef RTMP_MAC_USB\n\tRX_CONTEXT RxContext[RX_RING_SIZE];\t/* 1 for redundant multiple IRP bulk in. */\n\tNDIS_SPIN_LOCK BulkInLock;\t/* BulkIn spinlock for 4 ACs */\n\tNDIS_SPIN_LOCK CmdRspLock;\n\tUCHAR PendingRx;\t/* The Maximum pending Rx value should be       RX_RING_SIZE. */\n\tUCHAR NextRxBulkInIndex;\t/* Indicate the current RxContext Index which hold by Host controller. */\n\tUCHAR NextRxBulkInReadIndex;\t/* Indicate the current RxContext Index which driver can read & process it. */\n\tULONG NextRxBulkInPosition;\t/* Want to contatenate 2 URB buffer while 1st is bulkin failed URB. This Position is 1st URB TransferLength. */\n\tULONG TransferBufferLength;\t/* current length of the packet buffer */\n\tULONG ReadPosition;\t/* current read position in a packet buffer */\n\n\tCMD_RSP_CONTEXT CmdRspEventContext;\n#endif /* RTMP_MAC_USB */\n\n/*****************************************************************************************/\n/*      ASIC related parameters                                                          */\n/*****************************************************************************************/\n\tUINT32 MACVersion;\t/* MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101).. */\n\n\t/* --------------------------- */\n\t/* E2PROM */\n\t/* --------------------------- */\n\tULONG EepromVersion;\t/* byte 0: version, byte 1: revision, byte 2~3: unused */\n\tULONG FirmwareVersion;\t/* byte 0: Minor version, byte 1: Major version, otherwise unused. */\n\tUSHORT EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];\n#ifdef TXBF_SUPPORT\n\tUSHORT EEPROMITxBFCalParams[6];\n#endif /* TXBF_SUPPORT */\n\tUCHAR EEPROMAddressNum;\t/* 93c46=6  93c66=8 */\n\tBOOLEAN EepromAccess;\n\tUCHAR EFuseTag;\n\n\t/* --------------------------- */\n\t/* BBP Control */\n\t/* --------------------------- */\n\tUCHAR BbpWriteLatch[MAX_BBP_ID + 1];\t/* record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID */\n\tCHAR BbpRssiToDbmDelta;\t/* change from UCHAR to CHAR for high power */\n\tBBP_R66_TUNING BbpTuning;\n\n\t/* ---------------------------- */\n\t/* RFIC control */\n\t/* ---------------------------- */\n\tUCHAR RfIcType;\t\t/* RFIC_xxx */\n\tULONG RfFreqOffset;\t/* Frequency offset for channel switching */\n\n\n\tRTMP_RF_REGS LatchRfRegs;\t/* latch th latest RF programming value since RF IC doesn't support READ */\n\n\tEEPROM_ANTENNA_STRUC Antenna;\t/* Since ANtenna definition is different for a & g. We need to save it for future reference. */\n\tEEPROM_NIC_CONFIG2_STRUC NicConfig2;\n#if defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290)\n\tEEPROM_NIC_CONFIG3_STRUC NicConfig3;\n#endif /* defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290) */\n\n\t/* This soft Rx Antenna Diversity mechanism is used only when user set */\n\t/* RX Antenna = DIVERSITY ON */\n\tSOFT_RX_ANT_DIVERSITY RxAnt;\n\n\tCHANNEL_TX_POWER TxPower[MAX_NUM_OF_CHANNELS];\t/* Store Tx power value for all channels. */\n\tCHANNEL_TX_POWER ChannelList[MAX_NUM_OF_CHANNELS];\t/* list all supported channels for site survey */\n\n\n\n\tUCHAR ChannelListNum;\t/* number of channel in ChannelList[] */\n\tUCHAR Bbp94;\n\tBOOLEAN BbpForCCK;\n\tULONG Tx20MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE];\n\tULONG Tx20MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE];\n\tULONG Tx40MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE];\n\tULONG Tx40MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE];\n#ifdef DOT11_VHT_AC\n\tULONG Tx80MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE]; // Per-rate Tx power control for VHT BW80 (5GHz only)\n#endif /* DOT11_VHT_AC */\n\n\n#ifdef MT7601\n\tUINT32 TxCCKPwrCfg;\n#endif /* MT7601 */\n\n\tBOOLEAN bAutoTxAgcA;\t/* Enable driver auto Tx Agc control */\n\tUCHAR TssiRefA;\t\t/* Store Tssi reference value as 25 temperature. */\n\tUCHAR TssiPlusBoundaryA[5];\t/* Tssi boundary for increase Tx power to compensate. */\n\tUCHAR TssiMinusBoundaryA[5];\t/* Tssi boundary for decrease Tx power to compensate. */\n\tUCHAR TxAgcStepA;\t/* Store Tx TSSI delta increment / decrement value */\n\tCHAR TxAgcCompensateA;\t/* Store the compensation (TxAgcStep * (idx-1)) */\n\n\tBOOLEAN bAutoTxAgcG;\t/* Enable driver auto Tx Agc control */\n\tUCHAR TssiRefG;\t\t/* Store Tssi reference value as 25 temperature. */\n\tUCHAR TssiPlusBoundaryG[5];\t/* Tssi boundary for increase Tx power to compensate. */\n\tUCHAR TssiMinusBoundaryG[5];\t/* Tssi boundary for decrease Tx power to compensate. */\n\tUCHAR TxAgcStepG;\t/* Store Tx TSSI delta increment / decrement value */\n\tCHAR TxAgcCompensateG;\t/* Store the compensation (TxAgcStep * (idx-1)) */\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) \n\tTX_POWER_CONTROL TxPowerCtrl;\t/* The Tx power control using the internal ALC */\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\tFREQUENCY_CALIBRATION_CONTROL FreqCalibrationCtrl;\t/* The frequency calibration control */\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\tsigned char BGRssiOffset[3]; /* Store B/G RSSI #0/1/2 Offset value on EEPROM 0x46h */\n\tsigned char ARssiOffset[3]; /* Store A RSSI 0/1/2 Offset value on EEPROM 0x4Ah */\n\n\tCHAR BLNAGain;\t\t/* Store B/G external LNA#0 value on EEPROM 0x44h */\n\tCHAR ALNAGain0;\t\t/* Store A external LNA#0 value for ch36~64 */\n\tCHAR ALNAGain1;\t\t/* Store A external LNA#1 value for ch100~128 */\n\tCHAR ALNAGain2;\t\t/* Store A external LNA#2 value for ch132~165 */\n\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* LED control */\n\tLED_CONTROL LedCntl;\n#endif /* LED_CONTROL_SUPPORT */\n\n\t/* ---------------------------- */\n\t/* MAC control */\n\t/* ---------------------------- */\n\n#ifdef RT8592\n// TODO: shiang-6590, temporary get from windows and need to revise it!!\n\t/* IQ Calibration */\n\tUCHAR IQGainTx[3][4];\n\tUCHAR IQPhaseTx[3][4];\n\tUSHORT IQControl;\n#endif /* RT8592 */\n\n#if defined(RT3290) || defined(RT65xx) || defined(MT7601)\n\n\tWLAN_FUN_CTRL_STRUC WlanFunCtrl;\n#endif /* defined(RT3290) || defined(RT65xx) || defined(MT7601) */\n\n#ifdef RT3290\n\t// TODO: shiang, check about the purpose of this parameter\n\tCMB_CTRL_STRUC\tCmbCtrl;\n\tWLAN_FUN_INFO_STRUC WlanFunInfo;\n\tBT_FUN_CTRL_STRUC BtFunCtrl;\n\tWLAN_BT_COEX_SETTING WlanBTCoexInfo;\n\tBOOLEAN RateUp;\n\tULONG AntennaDiversityState;/* 0->Stable state 1->training state */\n\tULONG AntennaDiversityPER[2];  // 0 ->main 1->aux\n\tULONG AntennaDiversityTxPacketCount[2];  // 0 ->main 1->aux\t\n\tULONG AntennaDiversityRxPacketCount[2];\n\tULONG AntennaDiversityTrigger;\n\tULONG AntennaDiversityCount;\n\tULONG TrainCounter;\n\tANT_DIVERSITY AntennaDiversityInfo;\n#endif /* RT3290 */\n\n\tstruct hw_setting hw_cfg;\n\n/*****************************************************************************************/\n/*      802.11 related parameters                                                        */\n/*****************************************************************************************/\n\t/* outgoing BEACON frame buffer and corresponding TXD */\n\tTXWI_STRUC BeaconTxWI;\n\tPUCHAR BeaconBuf;\n\tUSHORT BeaconOffset[HW_BEACON_MAX_NUM];\n\n\t/* pre-build PS-POLL and NULL frame upon link up. for efficiency purpose. */\n#ifdef CONFIG_STA_SUPPORT\n\tPSPOLL_FRAME PsPollFrame;\n#endif /* CONFIG_STA_SUPPORT */\n\tHEADER_802_11 NullFrame;\n\n#ifdef RTMP_MAC_USB\n\tTX_CONTEXT NullContext[2];\n\tTX_CONTEXT PsPollContext;\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef UAPSD_SUPPORT\n\tNDIS_SPIN_LOCK UAPSDEOSPLock;\t/* EOSP frame access lock use */\n\tBOOLEAN bAPSDFlagSPSuspend;\t/* 1: SP is suspended; 0: SP is not */\n#endif /* UAPSD_SUPPORT */\n\n/*=========AP=========== */\n#ifdef CONFIG_AP_SUPPORT\n\t/* ----------------------------------------------- */\n\t/* AP specific configuration & operation status */\n\t/* used only when pAd->OpMode == OPMODE_AP */\n\t/* ----------------------------------------------- */\n\tAP_ADMIN_CONFIG ApCfg;\t/* user configuration when in AP mode */\n\tAP_MLME_AUX ApMlmeAux;\n#ifdef APCLI_SUPPORT\n\t\tMLME_AUX\t\t\t\tApCliMlmeAux;\t\t\t/* temporary settings used during MLME state machine */\n#endif /* APCLI_SUPPORT */\n\n\n#ifdef MBSS_SUPPORT\n\tBOOLEAN FlgMbssInit;\n#endif /* MBSS_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\n\tBOOLEAN flg_apcli_init;\n#endif /* APCLI_SUPPORT */\n\n/*#ifdef AUTO_CH_SELECT_ENHANCE */\n\tPBSSINFO pBssInfoTab;\n\tPCHANNELINFO pChannelInfo;\n/*#endif // AUTO_CH_SELECT_ENHANCE */\n\n\n#endif /* CONFIG_AP_SUPPORT */\n\n\tWDS_TABLE MulTestTab;\n/*=======STA=========== */\n#ifdef CONFIG_STA_SUPPORT\n\t/* ----------------------------------------------- */\n\t/* STA specific configuration & operation status */\n\t/* used only when pAd->OpMode == OPMODE_STA */\n\t/* ----------------------------------------------- */\n\tSTA_ADMIN_CONFIG StaCfg;\t/* user desired settings */\n\tSTA_ACTIVE_CONFIG StaActive;\t/* valid only when ADHOC_ON(pAd) || INFRA_ON(pAd) */\n\tCHAR nickname[IW_ESSID_MAX_SIZE + 1];\t/* nickname, only used in the iwconfig i/f */\n\tNDIS_MEDIA_STATE PreMediaState;\n#endif /* CONFIG_STA_SUPPORT */\n\n/*=======Common=========== */\n\t/* OP mode: either AP or STA */\n\tUCHAR OpMode;\t\t/* OPMODE_STA, OPMODE_AP */\n\n\tenum RATE_ADAPT_ALG rateAlg;\t\t/* Rate adaptation algorithm */\n\t\n\tNDIS_MEDIA_STATE IndicateMediaState;\t/* Base on Indication state, default is NdisMediaStateDisConnected */\n#ifdef CONFIG_MULTI_CHANNEL\n\tBOOLEAN\t\tMulti_Channel_Enable;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n#ifdef PROFILE_STORE\n\tRTMP_OS_TASK \tWriteDatTask;\n\tBOOLEAN\t\t\tbWriteDat;\n#endif /* PROFILE_STORE */\n\n#ifdef CREDENTIAL_STORE\t\n\tSTA_CONNECT_INFO StaCtIf;\n#endif /* CREDENTIAL_STORE */\n\n#ifdef WSC_INCLUDED\n\tRTMP_OS_TASK wscTask;\n\tUCHAR WriteWscCfgToDatFile;\n\tBOOLEAN WriteWscCfgToAr9DatFile;\n\tNDIS_SPIN_LOCK WscElmeLock;\n\tMLME_QUEUE_ELEM *pWscElme;\n\n\t/* WSC hardware push button function 0811 */\n\tBOOLEAN WscHdrPshBtnFlag;\t/* 1: support, read from EEPROM */\n#ifdef CONFIG_AP_SUPPORT\n\tBOOLEAN bWscDriverAutoUpdateCfg;\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n\n\t/* MAT related parameters */\n#ifdef MAT_SUPPORT\n\tMAT_STRUCT MatCfg;\n#endif /* MAT_SUPPORT */\n\n\n\t/* \n\t\tFrequency setting for rate adaptation \n\t\t\t@ra_interval: \t\tfor baseline time interval\n\t\t\t@ra_fast_interval:\tfor quick response time interval\n\t*/\n\tUINT32\t\t\tra_interval;\n\tUINT32\t\t\tra_fast_interval;\n\n\t/* configuration: read from Registry & E2PROM */\n\tBOOLEAN bLocalAdminMAC;\t/* Use user changed MAC */\n\tUCHAR PermanentAddress[MAC_ADDR_LEN];\t/* Factory default MAC address */\n\tUCHAR CurrentAddress[MAC_ADDR_LEN];\t/* User changed MAC address */\n\n\t/* ------------------------------------------------------ */\n\t/* common configuration to both OPMODE_STA and OPMODE_AP */\n\t/* ------------------------------------------------------ */\n\tCOMMON_CONFIG CommonCfg;\n\tMLME_STRUCT Mlme;\n\n\t/* AP needs those vaiables for site survey feature. */\n\tMLME_AUX MlmeAux;\t/* temporary settings used during MLME state machine */\n#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT)\n\tBSS_TABLE ScanTab;\t/* store the latest SCAN result */\n#endif /* defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) */\n\n\t/*About MacTab, the sta driver will use #0 and #1 for multicast and AP. */\n\tMAC_TABLE MacTab;\t/* ASIC on-chip WCID entry table.  At TX, ASIC always use key according to this on-chip table. */\n\tNDIS_SPIN_LOCK MacTabLock;\n\n#ifdef DOT11_N_SUPPORT\n\tBA_TABLE BATable;\n\tNDIS_SPIN_LOCK BATabLock;\n\tRALINK_TIMER_STRUCT RECBATimer;\n#endif /* DOT11_N_SUPPORT */\n\n\t/* DOT11_H */\n\tDOT11_H Dot11_H;\n\n\t/* encryption/decryption KEY tables */\n\tCIPHER_KEY SharedKey[HW_BEACON_MAX_NUM + MAX_P2P_NUM][4];\t/* STA always use SharedKey[BSS0][0..3] */\n\n\t/* RX re-assembly buffer for fragmentation */\n\tFRAGMENT_FRAME FragFrame;\t/* Frame storage for fragment frame */\n\n\t/* various Counters */\n\tCOUNTER_802_3 Counters8023;\t/* 802.3 counters */\n\tCOUNTER_802_11 WlanCounters;\t/* 802.11 MIB counters */\n\tCOUNTER_RALINK RalinkCounters;\t/* Ralink propriety counters */\n\t/* COUNTER_DRS DrsCounters;\t*/ /* counters for Dynamic TX Rate Switching */\n\tPRIVATE_STRUC PrivateInfo;\t/* Private information & counters */\n\n\t/* flags, see fRTMP_ADAPTER_xxx flags */\n\tULONG Flags;\t\t/* Represent current device status */\n\tULONG PSFlags;\t\t/* Power Save operation flag. */\n\tULONG MoreFlags;\t/* Represent specific requirement */\n\n\t/* current TX sequence # */\n\tUSHORT Sequence;\n\n\t/* Control disconnect / connect event generation */\n\t/*+++Didn't used anymore */\n\tULONG LinkDownTime;\n\t/*--- */\n\tULONG LastRxRate;\n\tULONG LastTxRate;\n\t/*+++Used only for Station */\n\tBOOLEAN bConfigChanged;\t/* Config Change flag for the same SSID setting */\n\t/*--- */\n\n\tULONG ExtraInfo;\t/* Extra information for displaying status */\n\tULONG SystemErrorBitmap;\t/* b0: E2PROM version error */\n\n\t/*+++Didn't used anymore */\n\tULONG MacIcVersion;\t/* MAC/BBP serial interface issue solved after ver.D */\n\t/*--- */\n\n#ifdef SYSTEM_LOG_SUPPORT\n\t/* --------------------------- */\n\t/* System event log */\n\t/* --------------------------- */\n\tRT_802_11_EVENT_TABLE EventTab;\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\tBOOLEAN HTCEnable;\n\n\t/*****************************************************************************************/\n\t/*      Statistic related parameters                                                     */\n\t/*****************************************************************************************/\n#ifdef RTMP_MAC_USB\n\tULONG BulkOutDataOneSecCount;\n\tULONG BulkInDataOneSecCount;\n\tULONG BulkLastOneSecCount;\t/* BulkOutDataOneSecCount + BulkInDataOneSecCount */\n\tULONG watchDogRxCnt;\n\tULONG watchDogRxOverFlowCnt;\n\tULONG watchDogTxPendingCnt[NUM_OF_TX_RING];\n#endif /* RTMP_MAC_USB */\n\n\tBOOLEAN bUpdateBcnCntDone;\n\n\tULONG macwd;\n\t/* ---------------------------- */\n\t/* DEBUG paramerts */\n\t/* ---------------------------- */\n\n\t/* ---------------------------- */\n\t/* rt2860c emulation-use Parameters */\n\t/* ---------------------------- */\n\t/*ULONG         rtsaccu[30]; */\n\t/*ULONG         ctsaccu[30]; */\n\t/*ULONG         cfendaccu[30]; */\n\t/*ULONG         bacontent[16]; */\n\t/*ULONG         rxint[RX_RING_SIZE+1]; */\n\t/*UCHAR         rcvba[60]; */\n\tBOOLEAN bLinkAdapt;\n\tBOOLEAN bForcePrintTX;\n\tBOOLEAN bForcePrintRX;\n\t/*BOOLEAN               bDisablescanning;               //defined in RT2870 USB */\n\tBOOLEAN bStaFifoTest;\n\tBOOLEAN bProtectionTest;\n\tBOOLEAN bHCCATest;\n\tBOOLEAN bGenOneHCCA;\n\tBOOLEAN bBroadComHT;\n\t/*+++Following add from RT2870 USB. */\n\tULONG BulkOutReq;\n\tULONG BulkOutComplete;\n\tULONG BulkOutCompleteOther;\n\tULONG BulkOutCompleteCancel;\t/* seems not use now? */\n\tULONG BulkInReq;\n\tULONG BulkInComplete;\n\tULONG BulkInCompleteFail;\n\t/*--- */\n\n\tstruct wificonf WIFItestbed;\n\n\tUCHAR\t\tTssiGain;\n#ifdef RALINK_ATE\n\tATE_INFO ate;\n#ifdef RTMP_MAC_USB\n\tBOOLEAN ContinBulkOut;\t/*ATE bulk out control */\n\tBOOLEAN ContinBulkIn;\t/*ATE bulk in control */\n\tRTMP_OS_ATOMIC BulkOutRemained;\n\tRTMP_OS_ATOMIC BulkInRemained;\n#endif /* RTMP_MAC_USB */\n#endif /* RALINK_ATE */\n\n#ifdef DOT11_N_SUPPORT\n\tstruct reordering_mpdu_pool mpdu_blk_pool;\n#endif /* DOT11_N_SUPPORT */\n\n\t/* statistics count */\n\n\tVOID *iw_stats;\n\tVOID *stats;\n\n#ifdef BLOCK_NET_IF\n\tBLOCK_QUEUE_ENTRY blockQueueTab[NUM_OF_TX_RING];\n#endif /* BLOCK_NET_IF */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef IGMP_SNOOP_SUPPORT\n\tPMULTICAST_FILTER_TABLE pMulticastFilterTable;\n\tUCHAR IgmpGroupTxRate;\n#endif /* IGMP_SNOOP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef MULTIPLE_CARD_SUPPORT\n\tINT32 MC_RowID;\n\tSTRING MC_FileName[256];\n#endif /* MULTIPLE_CARD_SUPPORT */\n\n\tULONG TbttTickCount;\t/* beacon timestamp work-around */\n#ifdef PCI_MSI_SUPPORT\n\tBOOLEAN HaveMsi;\n#endif /* PCI_MSI_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tRALINK_TIMER_STRUCT PeriodicTimer;\n\n#ifdef AP_QLOAD_SUPPORT\n\tUINT8 FlgQloadEnable;\t/* 1: any BSS WMM is enabled */\n\tULONG QloadUpTimeLast;\t/* last up time */\n\tUINT8 QloadChanUtil;\t/* last QBSS Load, unit: us */\n\tUINT32 QloadChanUtilTotal;\t/* current QBSS Load Total */\n\tUINT8 QloadChanUtilBeaconCnt;\t/* 1~100, default: 50 */\n\tUINT8 QloadChanUtilBeaconInt;\t/* 1~100, default: 50 */\n\tUINT32 QloadLatestChannelBusyTimePri;\n\tUINT32 QloadLatestChannelBusyTimeSec;\n\n\t/*\n\t   ex: For 100ms beacon interval,\n\t   if the busy time in last TBTT is smaller than 5ms, QloadBusyCount[0] ++;\n\t   if the busy time in last TBTT is between 5 and 10ms, QloadBusyCount[1] ++;\n\t   ......\n\t   if the busy time in last TBTT is larger than 95ms, QloadBusyCount[19] ++;\n\n\t   Command: \"iwpriv ra0 qload show\".\n\t */\n\n/* provide busy time statistics for every TBTT */\n#define QLOAD_FUNC_BUSY_TIME_STATS\n\n/* provide busy time alarm mechanism */\n/* use the function to avoid to locate in some noise environments */\n#define QLOAD_FUNC_BUSY_TIME_ALARM\n\n#ifdef QLOAD_FUNC_BUSY_TIME_STATS\n#define QLOAD_BUSY_INTERVALS\t20\t/* partition TBTT to QLOAD_BUSY_INTERVALS */\n\t/* for primary channel & secondary channel */\n\tUINT32 QloadBusyCountPri[QLOAD_BUSY_INTERVALS];\n\tUINT32 QloadBusyCountSec[QLOAD_BUSY_INTERVALS];\n#endif /* QLOAD_FUNC_BUSY_TIME_STATS */\n\n#ifdef QLOAD_FUNC_BUSY_TIME_ALARM\n#define QLOAD_DOES_ALARM_OCCUR(pAd)\t(pAd->FlgQloadAlarmIsSuspended == TRUE)\n#define QLOAD_ALARM_EVER_OCCUR(pAd) (pAd->QloadAlarmNumber > 0)\n\tBOOLEAN FlgQloadAlarmIsSuspended;\t/* 1: suspend */\n\n\tUINT8 QloadAlarmBusyTimeThreshold;\t/* unit: 1/100 */\n\tUINT8 QloadAlarmBusyNumThreshold;\t/* unit: 1 */\n\tUINT8 QloadAlarmBusyNum;\n\tUINT8 QloadAlarmDuration;\t/* unit: TBTT */\n\n\tUINT32 QloadAlarmNumber;\t/* total alarm times */\n\tBOOLEAN FlgQloadAlarm;\t/* 1: alarm occurs */\n\n\t/* speed up use */\n\tUINT32 QloadTimePeriodLast;\n\tUINT32 QloadBusyTimeThreshold;\n#else\n\n#define QLOAD_DOES_ALARM_OCCUR(pAd)\t0\n#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */\n\n#endif /* AP_QLOAD_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\t/* for detect_wmm_traffic() BE TXOP use */\n\tULONG OneSecondnonBEpackets;\t/* record non BE packets per second */\n\tUCHAR is_on;\n\n\t/* for detect_wmm_traffic() BE/BK TXOP use */\n#define TIME_BASE\t\t\t(1000000/OS_HZ)\n#define TIME_ONE_SECOND\t\t(1000000/TIME_BASE)\n\tUCHAR flg_be_adjust;\n\tULONG be_adjust_last_time;\n\n\n#ifdef WSC_INCLUDED\n\t/* for multiple card */\n\tUCHAR *pHmacData;\n#endif /* WSC_INCLUDED */\n\n#ifdef IKANOS_VX_1X0\n\tstruct IKANOS_TX_INFO IkanosTxInfo;\n\tstruct IKANOS_TX_INFO IkanosRxInfo[HW_BEACON_MAX_NUM + MAX_WDS_ENTRY +\n\t\t\t\t\t   MAX_APCLI_NUM + MAX_MESH_NUM];\n#endif /* IKANOS_VX_1X0 */\n\n\n#ifdef DBG_DIAGNOSE\n\tRtmpDiagStruct DiagStruct;\n#endif /* DBG_DIAGNOSE */\n\n\n\tUINT8 FlgCtsEnabled;\n\tUINT8 PM_FlgSuspend;\n\n#ifdef RTMP_EFUSE_SUPPORT\n\tBOOLEAN bUseEfuse;\n\tBOOLEAN bEEPROMFile;\n\tBOOLEAN bFroceEEPROMBuffer;\n\tBOOLEAN bCalFreeIC;\n\tUCHAR EEPROMImage[1024];\n#endif /* RTMP_EFUSE_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\n\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\tUCHAR FifoUpdateDone, FifoUpdateRx;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n\tUINT8 RFICType;\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n\tVOID *pCfgDev;\n\tVOID *pCfg80211_CB;\n\n\tBOOLEAN FlgCfg80211Scanning;\n\tBOOLEAN FlgCfg80211Connecting;\n\tUCHAR Cfg80211_Alpha2[2];\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\n#ifdef OS_ABL_SUPPORT\n#ifdef MAT_SUPPORT\n\t/* used in OS_ABL */\n\tBOOLEAN (*MATPktRxNeedConvert) (RTMP_ADAPTER *pAd, PNET_DEV net_dev);\n\n\tPUCHAR (*MATEngineRxHandle)(RTMP_ADAPTER *pAd, PNDIS_PACKET pPkt, UINT infIdx);\n#endif /* MAT_SUPPORT */\n#endif /* OS_ABL_SUPPORT */\n\n\tUINT32 ContinueMemAllocFailCount;\n\n\tstruct {\n\t\tINT IeLen;\n\t\tUCHAR *pIe;\n\t} ProbeRespIE[MAX_LEN_OF_BSS_TABLE];\n\n\t/* purpose: We free all kernel resources when module is removed */\n\tLIST_HEADER RscTimerMemList;\t/* resource timers memory */\n\tLIST_HEADER RscTaskMemList;\t/* resource tasks memory */\n\tLIST_HEADER RscLockMemList;\t/* resource locks memory */\n\tLIST_HEADER RscTaskletMemList;\t/* resource tasklets memory */\n\tLIST_HEADER RscSemMemList;\t/* resource semaphore memory */\n\tLIST_HEADER RscAtomicMemList;\t/* resource atomic memory */\n\n\t/* purpose: Cancel all timers when module is removed */\n\tLIST_HEADER RscTimerCreateList;\t/* timers list */\n\n#ifdef OS_ABL_SUPPORT\n#endif /* OS_ABL_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tRT_P2P_CONFIG\t\t\tP2pCfg;\n\tNDIS_SPIN_LOCK\t\t\tP2pTableSemLock;\n\tRT_P2P_TABLE\t\t\tP2pTable;\n\tULONG\t\t\t\t\tGOBeaconBufNoALen;\n\tCHAR\t\t\t\t\tGoBeaconBuf[512]; /* NOTE: BeaconBuf should be 4-byte aligned */\n\tULONG\t\t\t\t\tBeaconBufLen;\n\tULONG\t\t\t\t\tGoBeaconBufLen;\n\tBOOLEAN \t\t\t\tbIsClearScanTab;   /* TURE, we need to force Scan */\n\tBOOLEAN \t\t\t\tflg_p2p_init;\n\tULONG\t\t\t\t\tflg_p2p_OpStatusFlags;\n\tUCHAR\t\t\t\t\tP2PChannel;\n#ifdef DOT11_N_SUPPORT\t\n\tUINT8\t\t\t\t\tP2PExtChOffset;\n#endif /* DOT11_N_SUPPORT */\n\tUCHAR\t\t\t\t\tP2PCurrentAddress[MAC_ADDR_LEN];\t  /* User changed MAC address */\n\tPNET_DEV\t\t\t\tp2p_dev;\n#endif /* P2P_SUPPORT */\n\n\n\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tWOW_CFG_STRUCT WOW_Cfg; /* data structure for wake on wireless */\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef WLAN_SKB_RECYCLE\n    struct sk_buff_head rx0_recycle;\n#endif /* WLAN_SKB_RECYCLE */\n\n#ifdef FPGA_MODE\n\tINT tx_kick_cnt;\n\tINT phy_rates;\n\tINT data_phy;\n\tUCHAR data_bw;\n\tUCHAR data_mcs;\n\tUCHAR data_gi;\n\tUCHAR data_basize;\n\tBOOLEAN fpga_on;\n#endif /* FPGA_MODE */\n#ifdef WFA_VHT_PF\n\tBOOLEAN force_amsdu;\n#endif /* WFA_VHT_PF */\n\n\tUCHAR bloopBackTest;\n\tBOOLEAN bHwTxLookupRate;\n\tTXWI_STRUC NullTxWI;\n\tBOOLEAN TestMulMac;\n\n\tstruct MCU_CTRL MCUCtrl;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tUSHORT NullBufOffset[2];\n\tCHAR NullFrBuf[100];\n\tUINT32 NullFrLen;\n\tUINT32 MultiChannelFlowCtl;\n\tRTMP_OS_TASK MultiChannelTask;\n\tUCHAR MultiChannelAction;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef SINGLE_SKU_V2\n\tDL_LIST SingleSkuPwrList;\n\tUCHAR DefaultTargetPwr;\n\tCHAR SingleSkuRatePwrDiff[18];\n#endif /* SINGLE_SKU_V2 */\n\n};\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) \n/* The offset of the Tx power tuning entry (zero-based array) */\n#define TX_POWER_TUNING_ENTRY_OFFSET\t\t\t30\n\n/* The lower-bound of the Tx power tuning entry */\n#define LOWERBOUND_TX_POWER_TUNING_ENTRY\t\t-30\n\n/* The upper-bound of the Tx power tuning entry in G band */\n#define UPPERBOUND_TX_POWER_TUNING_ENTRY(__pAd)\t\t((__pAd)->chipCap.TxAlcTxPowerUpperBound_2G)\n\n#ifdef A_BAND_SUPPORT\n/* The upper-bound of the Tx power tuning entry in A band */\n#define UPPERBOUND_TX_POWER_TUNING_ENTRY_5G(__pAd)\t\t((__pAd)->chipCap.TxAlcTxPowerUpperBound_5G)\n#endif /* A_BAND_SUPPORT */\n\n/* Temperature compensation lookup table */\n\n#define TEMPERATURE_COMPENSATION_LOOKUP_TABLE_OFFSET\t7\n\n/* The lower/upper power delta index for the TSSI rate table */\n\n#define LOWER_POWER_DELTA_INDEX\t\t0\n#define UPPER_POWER_DELTA_INDEX\t\t24\n\n/* The offset of the TSSI rate table */\n\n#define TSSI_RATIO_TABLE_OFFSET\t12\n\n\n/* Get the power delta bound */\n\n#define GET_TSSI_RATE_TABLE_INDEX(x) (((x) > UPPER_POWER_DELTA_INDEX) ? (UPPER_POWER_DELTA_INDEX) : (((x) < LOWER_POWER_DELTA_INDEX) ? (LOWER_POWER_DELTA_INDEX) : ((x))))\n\n/* 802.11b CCK TSSI information */\n\ntypedef union _CCK_TSSI_INFO\n{\n#ifdef RT_BIG_ENDIAN\n\tstruct\n\t{\n\t\tUCHAR\tReserved:1;\n\t\tUCHAR\tShortPreamble:1;\n\t\tUCHAR\tRate:2;\n\t\tUCHAR\tTx40MSel:2;\n\t\tUCHAR\tTxType:2;\n\t} field;\n#else\n\tstruct\n\t{\n\t\tUCHAR\tTxType:2;\n\t\tUCHAR\tTx40MSel:2;\n\t\tUCHAR\tRate:2;\n\t\tUCHAR\tShortPreamble:1;\n\t\tUCHAR\tReserved:1;\n\t} field;\n#endif /* RT_BIG_ENDIAN */\n\n\tUCHAR\tvalue;\n} CCK_TSSI_INFO, *PCCK_TSSI_INFO;\n\n\n/* 802.11a/g OFDM TSSI information */\n\ntypedef union _OFDM_TSSI_INFO\n{\n#ifdef RT_BIG_ENDIAN\n\tstruct\n\t{\n\t\tUCHAR\tRate:4;\n\t\tUCHAR\tTx40MSel:2;\n\t\tUCHAR\tTxType:2;\n\t} field;\n#else\n\tstruct\n\t{\n\t\tUCHAR\tTxType:2;\n\t\tUCHAR\tTx40MSel:2;\n\t\tUCHAR\tRate:4;\n\t} field;\n#endif /* RT_BIG_ENDIAN */\n\n\tUCHAR\tvalue;\n} OFDM_TSSI_INFO, *POFDM_TSSI_INFO;\n\n\n/* 802.11n HT TSSI information */\n\ntypedef struct _HT_TSSI_INFO {\n\tunion {\n#ifdef RT_BIG_ENDIAN\n\t\tstruct {\n\t\t\tUCHAR SGI:1;\n\t\t\tUCHAR STBC:2;\n\t\t\tUCHAR Aggregation:1;\n\t\t\tUCHAR Tx40MSel:2;\n\t\t\tUCHAR TxType:2;\n\t\t} field;\n#else\t\n\t\tstruct {\n\t\t\tUCHAR TxType:2;\n\t\t\tUCHAR Tx40MSel:2;\n\t\t\tUCHAR Aggregation:1;\n\t\t\tUCHAR STBC:2;\n\t\t\tUCHAR SGI:1;\n\t\t} field;\n#endif /* RT_BIG_ENDIAN */\n\n\t\tUCHAR value;\n\t} PartA;\n\n\tunion {\n#ifdef RT_BIG_ENDIAN\n\t\tstruct {\n\t\t\tUCHAR BW:1;\n\t\t\tUCHAR MCS:7;\n\t\t} field;\n#else\t\n\t\tstruct {\n\t\t\tUCHAR MCS:7;\n\t\t\tUCHAR BW:1;\n\t\t} field;\n#endif /* RT_BIG_ENDIAN */\n\t\tUCHAR\tvalue;\n\t} PartB;\n} HT_TSSI_INFO, *PHT_TSSI_INFO;\n\ntypedef struct _TSSI_INFO_{\n\tUCHAR tssi_info_0;\n\tunion {\n\t\tCCK_TSSI_INFO cck_tssi_info;\n\t\tOFDM_TSSI_INFO ofdm_tssi_info;\n\t\tHT_TSSI_INFO ht_tssi_info_1;\n\t\tUCHAR byte;\n\t}tssi_info_1;\n\tHT_TSSI_INFO ht_tssi_info_2;\n}TSSI_INFO;\n\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\n\n/***************************************************************************\n  *\tRx Path software control block related data structures\n  **************************************************************************/\ntypedef struct _RX_BLK_\n{\n\tUCHAR hw_rx_info[RXD_SIZE]; /* include \"RXD_STRUC RxD\" and \"RXINFO_STRUC rx_info \" */\n\tRXINFO_STRUC *pRxInfo;\n#ifdef RLT_MAC\n\tRXFCE_INFO *pRxFceInfo;\n#endif /* RLT_MAC */\n\tRXWI_STRUC *pRxWI;\n\tPHEADER_802_11 pHeader;\n\tPNDIS_PACKET pRxPacket;\n\tUCHAR *pData;\n\tUSHORT DataSize;\n\tUSHORT Flags;\n\tUCHAR UserPriority;\t/* for calculate TKIP MIC using */\n\tUCHAR OpMode;\t/* 0:OPMODE_STA 1:OPMODE_AP */\n\tUCHAR wcid;\t\t/* copy of pRxWI->RxWIWirelessCliID */\n\tUCHAR mcs;\n\tUCHAR U2M;\n#ifdef HDR_TRANS_SUPPORT\n\tBOOLEAN\tbHdrRxTrans;\t/* this packet's header is translated to 802.3 by HW  */\n\tBOOLEAN bHdrVlanTaged;\t/* VLAN tag is added to this header */\n\tUCHAR *pTransData;\n\tUSHORT TransDataSize;\n#endif /* HDR_TRANS_SUPPORT */\n} RX_BLK;\n\n\n#define RX_BLK_SET_FLAG(_pRxBlk, _flag)\t\t(_pRxBlk->Flags |= _flag)\n#define RX_BLK_TEST_FLAG(_pRxBlk, _flag)\t\t(_pRxBlk->Flags & _flag)\n#define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag)\t(_pRxBlk->Flags &= ~(_flag))\n\n\n#define fRX_WDS\t\t\t0x0001\n#define fRX_AMSDU\t\t0x0002\n#define fRX_ARALINK\t\t0x0004\n#define fRX_HTC\t\t\t0x0008\n#define fRX_PAD\t\t\t0x0010\n#define fRX_AMPDU\t\t0x0020\n#define fRX_QOS\t\t\t0x0040\n#define fRX_INFRA\t\t0x0080\n#define fRX_EAP\t\t\t0x0100\n#define fRX_MESH\t\t0x0200\n#define fRX_APCLI\t\t0x0400\n#define fRX_DLS\t\t\t0x0800\n#define fRX_WPI\t\t\t0x1000\n#define fRX_P2PGO\t\t0x2000\n#define fRX_P2PCLI\t\t0x4000\n\n#define LENGTH_AMSDU_SUBFRAMEHEAD\t14\n#define LENGTH_ARALINK_SUBFRAMEHEAD\t14\n#define LENGTH_ARALINK_HEADER_FIELD\t 2\n\n\n/***************************************************************************\n  *\tTx Path software control block related data structures\n  **************************************************************************/\n#define TX_UNKOWN_FRAME\t\t0x00\n#define TX_MCAST_FRAME\t\t\t0x01\n#define TX_LEGACY_FRAME\t\t0x02\n#define TX_AMPDU_FRAME\t\t0x04\n#define TX_AMSDU_FRAME\t\t0x08\n#define TX_RALINK_FRAME\t\t0x10\n#define TX_FRAG_FRAME\t\t\t0x20\n\n\n/*\tCurrently the sizeof(TX_BLK) is 148 bytes. */\ntypedef struct _TX_BLK_\n{\n\tUCHAR\t\t\t\tQueIdx;\n\tUCHAR\t\t\t\tTxFrameType;\t\t\t\t/* Indicate the Transmission type of the all frames in one batch */\n\tUCHAR\t\t\t\tTotalFrameNum;\t\t\t\t/* Total frame number want to send-out in one batch */\n\tUSHORT\t\t\t\tTotalFragNum;\t\t\t\t/* Total frame fragments required in one batch */\n\tUSHORT\t\t\t\tTotalFrameLen;\t\t\t\t/* Total length of all frames want to send-out in one batch */\n\n\tQUEUE_HEADER\t\tTxPacketList;\n\tMAC_TABLE_ENTRY\t*pMacEntry;\t\t\t\t\t/* NULL: packet with 802.11 RA field is multicast/broadcast address */\n\tHTTRANSMIT_SETTING\t*pTransmit;\n\t\n\t/* Following structure used for the characteristics of a specific packet. */\n\tPNDIS_PACKET\t\tpPacket;\n\tPUCHAR\t\t\t\tpSrcBufHeader;\t\t\t\t/* Reference to the head of sk_buff->data */\n\tPUCHAR\t\t\t\tpSrcBufData;\t\t\t\t/* Reference to the sk_buff->data, will changed depends on hanlding progresss */\n\tUINT\t\t\t\tSrcBufLen;\t\t\t\t\t/* Length of packet payload which not including Layer 2 header */\n\n\tPUCHAR\t\t\t\tpExtraLlcSnapEncap;\t\t\t/* NULL means no extra LLC/SNAP is required */\n#ifndef VENDOR_FEATURE1_SUPPORT\n\t/*\n\t\tNote: Can not insert any other new parameters\n\t\tbetween pExtraLlcSnapEncap & HeaderBuf; Or\n\t\tthe start address of HeaderBuf will not be aligned by 4.\n\n\t\tBut we can not change HeaderBuf[128] to HeaderBuf[32] because\n\t\tmany codes use HeaderBuf[index].\n\t*/\n\tUCHAR\t\t\t\tHeaderBuf[128];\t\t\t\t/* TempBuffer for TX_INFO + TX_WI + TSO_INFO + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP */\n#else\n\tUINT32\t\t\t\tHeaderBuffer[32];\t\t\t/* total 128B, use UINT32 to avoid alignment problem */\n\tUCHAR\t\t\t\t*HeaderBuf;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\tUCHAR\t\t\t\tMpduHeaderLen;\t\t\t\t/* 802.11 header length NOT including the padding */\n\tUCHAR\t\t\t\tHdrPadLen;\t\t\t\t\t/* recording Header Padding Length; */\n\tUCHAR\t\t\t\tapidx;\t\t\t\t\t\t/* The interface associated to this packet */\n\tUCHAR\t\t\t\tWcid;\t\t\t\t\t\t/* The MAC entry associated to this packet */\n\tUCHAR\t\t\t\tUserPriority;\t\t\t\t/* priority class of packet */\n\tUCHAR\t\t\t\tFrameGap;\t\t\t\t\t/* what kind of IFS this packet use */\n\tUCHAR\t\t\t\tMpduReqNum;\t\t\t\t\t/* number of fragments of this frame */\n\tUCHAR\t\t\t\tTxRate;\t\t\t\t\t\t/* TODO: Obsoleted? Should change to MCS? */\n\tUCHAR\t\t\t\tCipherAlg;\t\t\t\t\t/* cipher alogrithm */\n\tPCIPHER_KEY\t\t\tpKey;\n\tUCHAR\t\t\t\tKeyIdx;\t\t\t\t\t\t/* Indicate the transmit key index */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\tUINT\t\t\t\tApCliIfidx;\n\tPAPCLI_STRUCT\t\tpApCliEntry;\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\tUINT32\t\t\t\tFlags;\t\t\t\t\t\t/*See following definitions for detail. */\n\n\t/*YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer. */\n\tULONG\t\t\t\tPriv;\t\t\t\t\t\t/* Hardware specific value saved in here. */\n\n#ifdef CONFIG_AP_SUPPORT\n\tMULTISSID_STRUCT *pMbss;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\tUCHAR\t\t\t\tTxSndgPkt; /* 1: sounding 2: NDP sounding */\n\tUCHAR\t\t\t\tTxNDPSndgBW;\n\tUCHAR\t\t\t\tTxNDPSndgMcs;\n#endif /* TXBF_SUPPORT */\n\n#ifdef TX_PKT_SG\n\tPACKET_INFO pkt_info;\n#endif /* TX_PKT_SG */\n\tUCHAR\t\t\t\tOpMode;\n\n#ifdef HDR_TRANS_SUPPORT\n\tBOOLEAN\t\t\t\tNeedTrans;\t/* indicate the packet needs to do hw header translate */\n#endif /* HDR_TRANS_SUPPORT */\n} TX_BLK, *PTX_BLK;\n\n\n#define fTX_bRtsRequired\t\t\t0x0001\t/* Indicate if need send RTS frame for protection. Not used in RT2860/RT2870. */\n#define fTX_bAckRequired\t\t\t0x0002\t/* the packet need ack response */\n#define fTX_bPiggyBack\t\t\t0x0004\t/* Legacy device use Piggback or not */\n#define fTX_bHTRate\t\t\t\t0x0008\t/* allow to use HT rate */\n#define fTX_bForceNonQoS\t\t0x0010\t/* force to transmit frame without WMM-QoS in HT mode */\n#define fTX_bAllowFrag\t\t\t0x0020\t/* allow to fragment the packet, A-MPDU, A-MSDU, A-Ralink is not allowed to fragment */\n#define fTX_bMoreData\t\t\t0x0040\t/* there are more data packets in PowerSave Queue */\n#define fTX_bWMM\t\t\t\t0x0080\t/* QOS Data */\n#define fTX_bClearEAPFrame\t\t0x0100\n\n#define\tfTX_bSwEncrypt\t\t\t0x0400\t/* this packet need to be encrypted by software before TX */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n#define fTX_bApCliPacket\t\t\t0x0200\n#endif /* APCLI_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef UAPSD_SUPPORT\n#define\tfTX_bWMM_UAPSD_EOSP\t0x0800\t/* Used when UAPSD_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef WAPI_SUPPORT\n#define\tfTX_bWPIDataFrame\t\t0x8000\t/* indicate this packet is an WPI data frame, it need to be encrypted by software */\n#endif /* WAPI_SUPPORT */\n\n#ifdef CLIENT_WDS\n#define fTX_bClientWDSFrame\t\t0x10000\n#endif /* CLIENT_WDS */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#define fTX_bTdlsEntry\t\t\t\t0x20000\t/* Used when DOT11Z_TDLS_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#define TX_BLK_SET_FLAG(_pTxBlk, _flag)\t\t(_pTxBlk->Flags |= _flag)\n#define TX_BLK_TEST_FLAG(_pTxBlk, _flag)\t(((_pTxBlk->Flags & _flag) == _flag) ? 1 : 0)\n#define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag)\t(_pTxBlk->Flags &= ~(_flag))\n\t\n\n\n\n#ifdef RT_BIG_ENDIAN\n/***************************************************************************\n  *\tEndian conversion related functions\n  **************************************************************************/\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tEndian conversion of Tx/Rx descriptor .\n\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\tpData\t\t\tPointer to Tx/Rx descriptor\n\t\tDescriptorType\tDirection of the frame\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\tCall this function when read or update descriptor\n\t========================================================================\n*/\nstatic inline VOID\tRTMPWIEndianChange(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tULONG\t\t\tDescriptorType)\n{\n\tint size;\n\tint i;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUINT8 RXWISize = pAd->chipCap.RXWISize;\n\t\n\tsize = ((DescriptorType == TYPE_TXWI) ? TXWISize : RXWISize);\n\t\n\tif(DescriptorType == TYPE_TXWI)\n\t{\n\t\t*((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData)));\t\t/* Byte 0~3 */\n\t\t*((UINT32 *)(pData + 4)) = SWAP32(*((UINT32 *)(pData+4)));\t/* Byte 4~7 */\n\t} \n\telse\n\t{\n\t\tfor(i=0; i < size/4 ; i++)\n\t\t\t*(((UINT32 *)pData) +i) = SWAP32(*(((UINT32 *)pData)+i));\n\t}\n}\n\n\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tEndian conversion of Tx/Rx descriptor .\n\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\tpData\t\t\tPointer to Tx/Rx descriptor\n\t\tDescriptorType\tDirection of the frame\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\tCall this function when read or update descriptor\n\t========================================================================\n*/\n\n#ifdef RTMP_MAC_USB\nstatic inline VOID RTMPDescriptorEndianChange(UCHAR *pData, ULONG DescType)\n{\t\n\t*((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData)));\n}\n#endif /* RTMP_MAC_USB */\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tEndian conversion of all kinds of 802.11 frames .\n\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\tpData\t\t\tPointer to the 802.11 frame structure\n\t\tDir \t\t\tDirection of the frame\n\t\tFromRxDoneInt\tCaller is from RxDone interrupt\n\n\tReturn Value:\n\t\tNone\n\n\tNote:\n\t\tCall this function when read or update buffer data\n\t========================================================================\n*/\nstatic inline VOID\tRTMPFrameEndianChange(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPUCHAR\t\t\tpData, \n\tIN\tULONG\t\t\tDir,\n\tIN\tBOOLEAN \t\tFromRxDoneInt)\n{\n\tPHEADER_802_11 pFrame;\n\tPUCHAR\tpMacHdr;\n\n\t/* swab 16 bit fields - Frame Control field */\n\tif(Dir == DIR_READ)\n\t{\n\t\t*(USHORT *)pData = SWAP16(*(USHORT *)pData);\n\t}\n\n\tpFrame = (PHEADER_802_11) pData;\n\tpMacHdr = (PUCHAR) pFrame;\n\n\t/* swab 16 bit fields - Duration/ID field */\n\t*(USHORT *)(pMacHdr + 2) = SWAP16(*(USHORT *)(pMacHdr + 2));\n\n\tif (pFrame->FC.Type != BTYPE_CNTL)\n\t{\n\t\t/* swab 16 bit fields - Sequence Control field */\n\t\t*(USHORT *)(pMacHdr + 22) = SWAP16(*(USHORT *)(pMacHdr + 22));\n\t}\n\n\tif(pFrame->FC.Type == BTYPE_MGMT)\n\t{\n\t\tswitch(pFrame->FC.SubType)\n\t\t{\n\t\t\tcase SUBTYPE_ASSOC_REQ:\n\t\t\tcase SUBTYPE_REASSOC_REQ:\n\t\t\t\t/* swab 16 bit fields - CapabilityInfo field */\n\t\t\t\tpMacHdr += sizeof(HEADER_802_11);\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\n\t\t\t\t/* swab 16 bit fields - Listen Interval field */\n\t\t\t\tpMacHdr += 2;\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_ASSOC_RSP:\n\t\t\tcase SUBTYPE_REASSOC_RSP:\n\t\t\t\t/* swab 16 bit fields - CapabilityInfo field */\n\t\t\t\tpMacHdr += sizeof(HEADER_802_11);\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\n\t\t\t\t/* swab 16 bit fields - Status Code field */\n\t\t\t\tpMacHdr += 2;\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\n\t\t\t\t/* swab 16 bit fields - AID field */\n\t\t\t\tpMacHdr += 2;\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_AUTH:\n\t\t\t\t /* When the WEP bit is on, don't do the conversion here.\n\t\t\t\t\tThis is only shared WEP can hit this condition. \n\t\t\t\t\tFor AP, it shall do conversion after decryption. \n\t\t\t\t\tFor STA, it shall do conversion before encryption. */\n\t\t\t\tif (pFrame->FC.Wep == 1)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* swab 16 bit fields - Auth Alg No. field */\n\t\t\t\t\tpMacHdr += sizeof(HEADER_802_11);\n\t\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\n\t\t\t\t\t/* swab 16 bit fields - Auth Seq No. field */\n\t\t\t\t\tpMacHdr += 2;\n\t\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\n\t\t\t\t\t/* swab 16 bit fields - Status Code field */\n\t\t\t\t\tpMacHdr += 2;\n\t\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_BEACON:\n\t\t\tcase SUBTYPE_PROBE_RSP:\n\t\t\t\t/* swab 16 bit fields - BeaconInterval field */\n\t\t\t\tpMacHdr += (sizeof(HEADER_802_11) + TIMESTAMP_LEN);\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\n\t\t\t\t/* swab 16 bit fields - CapabilityInfo field */\n\t\t\t\tpMacHdr += sizeof(USHORT);\n\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_DEAUTH:\n\t\t\tcase SUBTYPE_DISASSOC:\n\t\t\t\t/* If the PMF is negotiated, those frames shall be encrypted */\n\t\t\t\tif(!FromRxDoneInt && pFrame->FC.Wep == 1)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* swab 16 bit fields - Reason code field */\n\t\t\t\t\tpMacHdr += sizeof(HEADER_802_11);\n\t\t\t\t\t*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse if( pFrame->FC.Type == BTYPE_DATA )\n\t{\n\t}\n\telse if(pFrame->FC.Type == BTYPE_CNTL)\n\t{\n\t\tswitch(pFrame->FC.SubType)\n\t\t{\n\t\t\tcase SUBTYPE_BLOCK_ACK_REQ:\n\t\t\t\t{\n\t\t\t\t\tPFRAME_BA_REQ pBAReq = (PFRAME_BA_REQ)pFrame;\n\t\t\t\t\t*(USHORT *)(&pBAReq->BARControl) = SWAP16(*(USHORT *)(&pBAReq->BARControl));\n\t\t\t\t\tpBAReq->BAStartingSeq.word = SWAP16(pBAReq->BAStartingSeq.word);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SUBTYPE_BLOCK_ACK:\n\t\t\t\t/* For Block Ack packet, the HT_CONTROL field is in the same offset with Addr3 */\n\t\t\t\t*(UINT32 *)(&pFrame->Addr3[0]) = SWAP32(*(UINT32 *)(&pFrame->Addr3[0]));\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_ACK:\n\t\t\t\t/*For ACK packet, the HT_CONTROL field is in the same offset with Addr2 */\n\t\t\t\t*(UINT32 *)(&pFrame->Addr2[0])=\tSWAP32(*(UINT32 *)(&pFrame->Addr2[0]));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Invalid Frame Type!!!\\n\"));\n\t}\n\n\t/* swab 16 bit fields - Frame Control */\n\tif(Dir == DIR_WRITE)\n\t{\n\t\t*(USHORT *)pData = SWAP16(*(USHORT *)pData);\n\t}\n}\n#endif /* RT_BIG_ENDIAN */\n\n\n/***************************************************************************\n  *\tOther static inline function definitions\n  **************************************************************************/\nstatic inline VOID ConvertMulticastIP2MAC(\n\tIN PUCHAR pIpAddr,\n\tIN PUCHAR *ppMacAddr, \n\tIN UINT16 ProtoType)\n{\n\tif (pIpAddr == NULL)\n\t\treturn;\n\n\tif (ppMacAddr == NULL || *ppMacAddr == NULL)\n\t\treturn;\n\n\tswitch (ProtoType)\n\t{\n\t\tcase ETH_P_IPV6:\n/*\t\t\tmemset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS); */\n\t\t\t*(*ppMacAddr) = 0x33;\n\t\t\t*(*ppMacAddr + 1) = 0x33;\n\t\t\t*(*ppMacAddr + 2) = pIpAddr[12];\n\t\t\t*(*ppMacAddr + 3) = pIpAddr[13];\n\t\t\t*(*ppMacAddr + 4) = pIpAddr[14];\n\t\t\t*(*ppMacAddr + 5) = pIpAddr[15];\n\t\t\tbreak;\n\n\t\tcase ETH_P_IP:\n\t\tdefault:\n/*\t\t\tmemset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS); */\n\t\t\t*(*ppMacAddr) = 0x01;\n\t\t\t*(*ppMacAddr + 1) = 0x00;\n\t\t\t*(*ppMacAddr + 2) = 0x5e;\n\t\t\t*(*ppMacAddr + 3) = pIpAddr[1] & 0x7f;\n\t\t\t*(*ppMacAddr + 4) = pIpAddr[2];\n\t\t\t*(*ppMacAddr + 5) = pIpAddr[3];\n\t\t\tbreak;\n\t}\n\n\treturn;\n}\n\n\nchar *get_phymode_str(int phy_mode);\nchar *get_bw_str(int bandwidth);\n\n\nBOOLEAN RTMPCheckForHang(\n\tIN  NDIS_HANDLE MiniportAdapterContext);\n\n/*\n\tPrivate routines in rtmp_init.c\n*/\nNDIS_STATUS RTMPAllocTxRxRingMemory(\n\tIN  PRTMP_ADAPTER   pAd);\n\n#ifdef RESOURCE_PRE_ALLOC\nNDIS_STATUS RTMPInitTxRxRingMemory(\n\tIN RTMP_ADAPTER *pAd);\n#endif /* RESOURCE_PRE_ALLOC */\n\nNDIS_STATUS\tRTMPReadParametersHook(\n\tIN\tPRTMP_ADAPTER pAd);\n\nNDIS_STATUS\tRTMPSetProfileParameters(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\tpBuffer);\n\nINT RTMPGetKeyParameter(\n    IN PSTRING key,\n    OUT PSTRING dest,\n    IN INT destsize,\n    IN PSTRING buffer,\n    IN BOOLEAN bTrimSpace);\n\n#ifdef WSC_INCLUDED\nVOID rtmp_read_wsc_user_parms_from_file(\n\tIN\tPRTMP_ADAPTER pAd, \n\tIN \tchar *tmpbuf, \n\tIN \tchar *buffer);\n#endif/*WSC_INCLUDED*/\n\nVOID rtmp_read_multest_from_file(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING tmpbuf,\n\tIN PSTRING buffer);\n\n#ifdef SINGLE_SKU_V2\nNDIS_STATUS\tRTMPSetSingleSKUParameters(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID InitSkuRateDiffTable(\n\tIN PRTMP_ADAPTER \tpAd );\n\nUCHAR GetSkuChannelBasePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR \t\t\tchannel);\n\nUCHAR GetSkuRatePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN CHAR \t\t\t\tphymode,\n\tIN UCHAR \t\t\tchannel,\n\tIN UCHAR\t\t\tbw);\n\nVOID UpdateSkuRatePwr(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR \t\t\tchannel,\n\tIN UCHAR\t\t\tbw,\n\tIN CHAR\t\t\t\tbase_pwr);\n#endif /* SINGLE_SKU_V2 */\n\nVOID AP_WDS_KeyNameMakeUp(\n\tIN\tSTRING\t*pKey,\n\tIN\tUINT32\tKeyMaxSize,\n\tIN\tINT\tKeyId);\n\nVOID AsicUpdateMulTestRxWCIDTable(\n\tIN PRTMP_ADAPTER pAd);\n\nMAC_TABLE_ENTRY *MulTestTableLookup(\n    IN  PRTMP_ADAPTER pAd, \n    IN  PUCHAR pAddr,\n\tIN BOOLEAN bResetIdelCount);\n\nVOID AsicUpdateMulTestEncryption(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR wcid);\n\nMAC_TABLE_ENTRY *MacTableInsertMulTestEntry(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR pAddr,\n\tUINT WdsTabIdx);\n\n\n\n#ifdef RLT_RF\nNDIS_STATUS rlt_rf_write(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR bank,\n\tIN UCHAR regID,\n\tIN UCHAR value);\n\nNDIS_STATUS rlt_rf_read(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR bank,\n\tIN UCHAR regID,\n\tIN UCHAR *pValue);\n#endif /* RLT_RF */\n\nVOID NICReadEEPROMParameters(\n\tIN  PRTMP_ADAPTER       pAd,\n\tIN\tPSTRING\t\t\t\tmac_addr);\n\nVOID NICInitAsicFromEEPROM(\n\tIN  PRTMP_ADAPTER       pAd);\n\nNDIS_STATUS NICInitializeAdapter(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN   BOOLEAN    bHardReset);\n\nNDIS_STATUS NICInitializeAsic(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  BOOLEAN\t\tbHardReset);\n\n\nVOID RTMPRingCleanUp(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR           RingType);\n\nVOID UserCfgExit(\t\n\tIN  RTMP_ADAPTER *pAd);\n\nVOID UserCfgInit(\n\tIN  PRTMP_ADAPTER   pAd);\n\nNDIS_STATUS NICLoadFirmware(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID NICEraseFirmware(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID NICUpdateFifoStaCounters(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID NICUpdateRawCounters(\n\tIN  PRTMP_ADAPTER   pAd);\n\n#ifdef MICROWAVE_OVEN_SUPPORT\nVOID NICUpdateRxStatusCnt1(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR   Idx);\n\nUINT32 NICSumFalseCCACnt(\nIN  PRTMP_ADAPTER   pAd);\n\nUINT32 NICSumPLCPErrCnt(\nIN  PRTMP_ADAPTER   pAd);\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n#ifdef FIFO_EXT_SUPPORT\nBOOLEAN NicGetMacFifoTxCnt(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry);\n\nVOID AsicFifoExtSet(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID AsicFifoExtEntryClean(\n\tIN RTMP_ADAPTER * pAd, \n\tIN MAC_TABLE_ENTRY *pEntry);\n#endif /* FIFO_EXT_SUPPORT */\n\nVOID NicResetRawCounters(RTMP_ADAPTER *pAd);\n\nVOID NicGetTxRawCounters(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_STA_CNT0_STRUC *pStaTxCnt0,\n\tIN TX_STA_CNT1_STRUC *pStaTxCnt1);\n\t\nVOID RTMPZeroMemory(\n\tIN  PVOID   pSrc,\n\tIN  ULONG   Length);\n\nULONG RTMPCompareMemory(\n\tIN  PVOID   pSrc1,\n\tIN  PVOID   pSrc2,\n\tIN  ULONG   Length);\n\nVOID RTMPMoveMemory(\n\tOUT PVOID   pDest,\n\tIN  PVOID   pSrc,\n\tIN  ULONG   Length);\n\nVOID AtoH(\n\tPSTRING\tsrc,\n\tPUCHAR dest,\n\tint\t\tdestlen);\n\nUCHAR BtoH(\n\tchar ch);\n\nVOID\tRTMP_TimerListAdd(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd,\n\tIN\tVOID\t\t\t\t\t*pRsc);\n\nVOID\tRTMP_TimerListRelease(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd);\n\nVOID\tRTMP_AllTimerListRelease(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd);\n\nVOID RTMPInitTimer(\n\tIN  PRTMP_ADAPTER           pAd,\n\tIN  PRALINK_TIMER_STRUCT    pTimer,\n\tIN  PVOID                   pTimerFunc,\n\tIN\tPVOID\t\t\t\t\tpData,\n\tIN  BOOLEAN                 Repeat);\n\nVOID RTMPSetTimer(\n\tIN  PRALINK_TIMER_STRUCT    pTimer,\n\tIN  ULONG                   Value);\n\n\nVOID RTMPModTimer(\n\tIN\tPRALINK_TIMER_STRUCT\tpTimer,\n\tIN\tULONG\t\t\t\t\tValue);\n\nVOID RTMPCancelTimer(\n\tIN  PRALINK_TIMER_STRUCT    pTimer,\n\tOUT BOOLEAN                 *pCancelled);\n\nVOID\tRTMPReleaseTimer(\n\tIN  PRALINK_TIMER_STRUCT    pTimer,\n\tOUT BOOLEAN                 *pCancelled);\n\nVOID RTMPEnableRxTx(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID AntCfgInit(\n\tIN  PRTMP_ADAPTER   pAd);\n\n/* */\n/* prototype in action.c */\n/* */\nVOID ActionStateMachineInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN  STATE_MACHINE *S, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nVOID MlmeADDBAAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeDELBAAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeDLSAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeInvalidAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeQOSAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\n#ifdef DOT11_N_SUPPORT\nVOID PeerAddBAReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerAddBARspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerDelBAAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerBAAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n#endif /* DOT11_N_SUPPORT */\n\nVOID SendPSMPAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tWcid,\n\tIN UCHAR\t\t\tPsmp);\n\t\t\t\t   \n#ifdef CONFIG_AP_SUPPORT\t\t\t\t   \nVOID SendBeaconRequest(\n\tIN PRTMP_ADAPTER\t\tpAd,\n\tIN UCHAR\t\t\t\tWcid);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID PeerRMAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\n#ifdef CONFIG_STA_SUPPORT\nVOID StaPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN BSS_2040_COEXIST_IE *pBss2040CoexIE);\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nVOID ApPublicAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID PeerBSSTranAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\n#ifdef DOT11_N_SUPPORT\nVOID PeerHTAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n#endif /* DOT11_N_SUPPORT */\n\nVOID PeerQOSAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\n#ifdef QOS_DLS_SUPPORT\nVOID PeerDLSAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\nVOID DlsParmFill(\n\tIN PRTMP_ADAPTER pAd, \n\tIN OUT MLME_DLS_REQ_STRUCT *pDlsReq,\n\tIN PRT_802_11_DLS pDls,\n\tIN USHORT reason);\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\nVOID RECBATimerTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\nVOID ORIBATimerTimeout(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID SendRefreshBAR(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry);\n\n#ifdef DOT11N_DRAFT3\nVOID RTMP_11N_D3_TimerInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID SendBSS2040CoexistMgmtAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\tWcid,\n\tIN\tUCHAR\tapidx,\n\tIN\tUCHAR\tInfoReq);\n\nVOID SendNotifyBWActionFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR  Wcid,\n\tIN UCHAR apidx);\n\t\nBOOLEAN ChannelSwitchSanityCheck(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN    UCHAR  NewChannel,\n\tIN    UCHAR  Secondary);\n\nVOID ChannelSwitchAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN    UCHAR  Channel,\n\tIN    UCHAR  Secondary);\n\nULONG BuildIntolerantChannelRep(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    PUCHAR  pDest); \n\nVOID Update2040CoexistFrameAndNotify(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN\tBOOLEAN\tbAddIntolerantCha);\n\t\nVOID Send2040CoexistAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR  Wcid,\n\tIN\tBOOLEAN\tbAddIntolerantCha);\n\nVOID UpdateBssScanParm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OVERLAP_BSS_SCAN_IE APBssScan);\n#endif /* DOT11N_DRAFT3 */\n\nVOID AsicEnableRalinkBurstMode(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID AsicDisableRalinkBurstMode(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\nVOID ActHeaderInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN OUT PHEADER_802_11 pHdr80211, \n    IN PUCHAR Addr1, \n    IN PUCHAR Addr2,\n    IN PUCHAR Addr3);\n\nVOID BarHeaderInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN OUT PFRAME_BAR pCntlBar, \n\tIN PUCHAR pDA,\n\tIN PUCHAR pSA);\n\nVOID InsertActField(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 Category,\n\tIN UINT8 ActCode);\n\nBOOLEAN QosBADataParse(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN BOOLEAN bAMSDU,\n\tIN PUCHAR p8023Header,\n\tIN UCHAR\tWCID,\n\tIN UCHAR\tTID,\n\tIN USHORT Sequence,\n\tIN UCHAR DataOffset, \n\tIN USHORT Datasize,\n\tIN UINT   CurRxIndex);\n\n#ifdef DOT11_N_SUPPORT\nBOOLEAN CntlEnqueueForRecv(\n    IN\tPRTMP_ADAPTER\tpAd, \n\tIN ULONG Wcid, \n    IN ULONG MsgLen, \n\tIN PFRAME_BA_REQ pMsg);\n\nVOID BaAutoManSwitch(\n\tIN\tPRTMP_ADAPTER\tpAd);\n#endif /* DOT11_N_SUPPORT */\n\nVOID HTIOTCheck(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN    UCHAR     BatRecIdx);\n\n/* */\n/* Private routines in rtmp_data.c */\n/* */\nBOOLEAN RTMPHandleTxRingDmaDoneInterrupt(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT32 int_reg);\n\nVOID RTMPHandleMgmtRingDmaDoneInterrupt(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RTMPHandleTBTTInterrupt(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RTMPHandlePreTBTTInterrupt(\n\tIN PRTMP_ADAPTER pAd);\n\nvoid RTMPHandleTwakeupInterrupt(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RTMPHandleRxCoherentInterrupt(\n\tIN PRTMP_ADAPTER pAd);\n\n#ifdef CONFIG_AP_SUPPORT\nVOID RTMPHandleMcuInterrupt(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n\nNDIS_STATUS STASendPacket(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PNDIS_PACKET    pPacket);\n\nVOID STASendPackets(\n\tIN  NDIS_HANDLE     MiniportAdapterContext,\n\tIN  PPNDIS_PACKET   ppPacketArray,\n\tIN  UINT            NumberOfPackets);\n\nVOID RTMPDeQueuePacket(\n\tIN RTMP_ADAPTER *pAd,\n   \tIN BOOLEAN bIntContext,\n\tIN UCHAR QueIdx,\n\tIN INT Max_Tx_Packets);\n\nNDIS_STATUS\tRTMPHardTransmit(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNDIS_PACKET\t\tpPacket,\n\tIN  UCHAR\t\t\tQueIdx,\n\tOUT\tPULONG\t\t\tpFreeTXDLeft);\n\nNDIS_STATUS\tSTAHardTransmit(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN TX_BLK\t\t\t*pTxBlk,\n\tIN  UCHAR\t\t\tQueIdx);\n\nVOID STARxEAPOLFrameIndicate(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t*pEntry,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nNDIS_STATUS RTMPFreeTXDRequest(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR           RingType,\n\tIN  UCHAR           NumberRequired,\n\tIN \tPUCHAR          FreeNumberIs);\n\nNDIS_STATUS MlmeHardTransmit(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR\tQueIdx,\n\tIN  PNDIS_PACKET    pPacket,\n\tIN\tBOOLEAN\t\t\tFlgDataQForce,\n\tIN\tBOOLEAN\t\t\tFlgIsLocked);\n\nNDIS_STATUS MlmeHardTransmitMgmtRing(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR\tQueIdx,\n\tIN  PNDIS_PACKET    pPacket);\n\n\nUSHORT RTMPCalcDuration(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Rate,\n\tIN ULONG Size);\n\nVOID RTMPWriteTxWI(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TXWI_STRUC *pTxWI,\n\tIN BOOLEAN FRAG,\n\tIN BOOLEAN CFACK,\n\tIN BOOLEAN InsTimestamp,\n\tIN BOOLEAN AMPDU,\n\tIN BOOLEAN Ack,\n\tIN BOOLEAN NSeq, /* HW new a sequence. */\n\tIN UCHAR BASize,\n\tIN UCHAR WCID,\n\tIN ULONG Length,\n\tIN UCHAR PID,\n\tIN UCHAR TID,\n\tIN UCHAR TxRate,\n\tIN UCHAR Txopmode,\n\tIN BOOLEAN CfAck,\n\tIN HTTRANSMIT_SETTING *pTransmit);\n\n\nVOID RTMPWriteTxWI_Data(\n\tIN RTMP_ADAPTER *pAd,\n\tINOUT TXWI_STRUC *pTxWI,\n\tIN TX_BLK *pTxBlk);\n\n\t\nVOID RTMPWriteTxWI_Cache(\n\tIN RTMP_ADAPTER *pAd,\n\tINOUT TXWI_STRUC *pTxWI,\n\tIN TX_BLK *pTxBlk);\n\nVOID RTMPSuspendMsduTransmission(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID RTMPResumeMsduTransmission(\n\tIN RTMP_ADAPTER *pAd);\n\nNDIS_STATUS MiniportMMRequest(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR QueIdx,\n\tIN UCHAR *pData,\n\tIN UINT Length);\n\nVOID RTMPSendNullFrame(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR TxRate,\n\tIN BOOLEAN bQosNull,\n\tIN USHORT PwrMgmt);\n\n#ifdef CONFIG_MULTI_CHANNEL\nVOID RTMPP2PSendNullFrame(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR           TxRate,\n\tIN\tBOOLEAN\t\t\tbQosNull,\n\tIN  USHORT\t\t\tPwrMgmt);\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n#ifdef CONFIG_STA_SUPPORT\nVOID RTMPReportMicError(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PCIPHER_KEY     pWpaKey);\n\nVOID\tWpaMicFailureReportFrame(\n\tIN  PRTMP_ADAPTER    pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID    WpaDisassocApAndBlockAssoc(\n    IN  PVOID SystemSpecific1, \n    IN  PVOID FunctionContext, \n    IN  PVOID SystemSpecific2, \n    IN  PVOID SystemSpecific3);\n\nVOID WpaStaPairwiseKeySetting(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID WpaStaGroupKeySetting(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID    WpaSendEapolStart(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN  PUCHAR          pBssid);\n\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\nBOOLEAN RTMPFreeTXDUponTxDmaDone(\n\tIN PRTMP_ADAPTER    pAd, \n\tIN UCHAR            QueIdx);\n\nBOOLEAN RTMPCheckEtherType(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tPMAC_TABLE_ENTRY pMacEntry,\n\tIN\tUCHAR\t\t\tOpMode,\n\tOUT PUCHAR pUserPriority,\n\tOUT PUCHAR pQueIdx);\n\n\nVOID RTMPCckBbpTuning(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUINT\t\t\tTxRate);\n/* */\n/* MLME routines */\n/* */\n\n/* Asic/RF/BBP related functions */\nVOID AsicGetTxPowerOffset(\n\tIN PRTMP_ADAPTER \t\t\tpAd,\n\tIN PULONG\t\t\t\t\tTxPwr);\n\nVOID AsicGetAutoAgcOffsetForExternalTxAlc(\n\tIN PRTMP_ADAPTER \t\tpAd,\n\tIN PCHAR \t\t\t\tpDeltaPwr,\n\tIN PCHAR \t\t\t\tpTotalDeltaPwr,\n\tIN PCHAR \t\t\t\tpAgcCompensate,\n\tIN PCHAR \t\t\t\tpDeltaPowerByBbpR1);\n\t\n#ifdef RTMP_TEMPERATURE_COMPENSATION\nVOID AsicGetAutoAgcOffsetForTemperatureSensor(\n\tIN PRTMP_ADAPTER \t\tpAd,\n\tIN PCHAR\t\t\t\tpDeltaPwr,\n\tIN PCHAR\t\t\t\tpTotalDeltaPwr,\n\tIN PCHAR\t\t\t\tpAgcCompensate,\n\tIN PCHAR \t\t\t\tpDeltaPowerByBbpR1);\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\n#ifdef SINGLE_SKU\nVOID GetSingleSkuDeltaPower(\n\tIN \t\tPRTMP_ADAPTER \tpAd,\n\tIN \t\tPCHAR \t\t\tpTotalDeltaPower,\n\tINOUT \tPULONG\t\t\tpSingleSKUTotalDeltaPwr,\n\tINOUT  \tPUCHAR              \tpSingleSKUBbpR1Offset);\n#endif /* SINGLE_SKU*/\n\nVOID AsicPercentageDeltaPower(\n\tIN \t\tPRTMP_ADAPTER \t\tpAd,\n\tIN\t\tCHAR\t\t\t\tRssi,\n\tINOUT\tPCHAR\t\t\t\tpDeltaPwr,\n\tINOUT\tPCHAR\t\t\t\tpDeltaPowerByBbpR1);\n\nVOID AsicCompensatePowerViaBBP(\n\tIN \t\tPRTMP_ADAPTER \t\tpAd,\n\tINOUT\tPCHAR\t\t\t\tpTotalDeltaPower);\n\nVOID AsicAdjustTxPower(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID \tAsicUpdateProtect(\n\tIN\t\tPRTMP_ADAPTER\tpAd,\n\tIN \t\tUSHORT\t\t\tOperaionMode,\n\tIN \t\tUCHAR\t\t\tSetMask,\n\tIN\t\tBOOLEAN\t\t\tbDisableBGProtect,\n\tIN\t\tBOOLEAN\t\t\tbNonGFExist);\n\nVOID AsicBBPAdjust(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID AsicSwitchChannel(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN\tUCHAR\t\t\tChannel,\n\tIN\tBOOLEAN\t\t\tbScan);\n\nINT AsicSetChannel(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR ch,\n\tIN UCHAR bw,\n\tIN UCHAR ext_ch,\n\tIN BOOLEAN bScan);\n\nVOID AsicLockChannel(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR Channel) ;\n\nVOID AsicAntennaSelect(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR           Channel);\n\nVOID AsicResetBBPAgent(\n\tIN PRTMP_ADAPTER pAd);\n\n#ifdef CONFIG_STA_SUPPORT\nVOID AsicSleepThenAutoWakeup(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  USHORT TbttNumToNextWakeUp);\n\nVOID AsicForceSleep(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID AsicForceWakeup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN    bFromTx);\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID AsicSetBssid(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR pBssid);\n\nVOID AsicSetMcastWC(\n\tIN PRTMP_ADAPTER pAd);\n\n\nVOID AsicDelWcidTab(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\tWcid);\n\n#ifdef DOT11_N_SUPPORT\nVOID AsicEnableRDG(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID AsicDisableRDG(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* DOT11_N_SUPPORT */\n\nVOID AsicDisableSync(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID AsicEnableBssSync(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID AsicEnableIbssSync(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID AsicSetEdcaParm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PEDCA_PARM    pEdcaParm);\n\nVOID AsicSetSlotTime(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN bUseShortSlotTime);\n\nVOID AsicAddSharedKeyEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR         BssIndex,\n\tIN UCHAR         KeyIdx,\n\tIN PCIPHER_KEY\t pCipherKey);\n\nVOID AsicRemoveSharedKeyEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR         BssIndex,\n\tIN UCHAR         KeyIdx);\n\nVOID AsicUpdateWCIDIVEIV(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT\t\tWCID,\n\tIN ULONG        uIV,\n\tIN ULONG        uEIV);\n\nVOID AsicUpdateRxWCIDTable(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT\t\tWCID,\n\tIN PUCHAR        pAddr);\n\nVOID\tAsicUpdateWcidAttributeEntry(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBssIdx,\n\tIN \tUCHAR\t\t \tKeyIdx,\n\tIN \tUCHAR\t\t \tCipherAlg,\n\tIN\tUINT8\t\t\t\tWcid,\n\tIN\tUINT8\t\t\t\tKeyTabFlag);\n\nVOID AsicAddPairwiseKeyEntry(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR\t\t\tWCID,\n\tIN PCIPHER_KEY\t\tpCipherKey);\n\nVOID AsicRemovePairwiseKeyEntry(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN UCHAR\t\t Wcid);\n\nBOOLEAN AsicSendCommandToMcu(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR         Command,\n\tIN UCHAR         Token,\n\tIN UCHAR         Arg0,\n\tIN UCHAR         Arg1,\n\tIN BOOLEAN in_atomic);\n\nBOOLEAN AsicSendCommandToMcuBBP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t Command,\n\tIN UCHAR\t\t Token,\n\tIN UCHAR\t\t Arg0,\n\tIN UCHAR\t\t Arg1,\n\tIN BOOLEAN\t\tFlgIsNeedLocked);\n\n\n\n#ifdef WAPI_SUPPORT\nVOID AsicUpdateWAPIPN(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT\t\t WCID,\n\tIN ULONG         pn_low,\n\tIN ULONG         pn_high);\n#endif /* WAPI_SUPPORT */\n\n#ifdef VCORECAL_SUPPORT\nVOID AsicVCORecalibration(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* VCORECAL_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\nUINT32 StreamModeRegVal(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID AsicSetStreamMode(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PUCHAR pMacAddr,\n\tIN INT chainIdx,\n\tIN BOOLEAN bEnabled);\n\nVOID RtmpStreamModeInit(\n\tIN RTMP_ADAPTER *pAd);\n\n/*\n\tUpdate the Tx chain address\n\tParameters\n\t\tpAd: The adapter data structure\n\t\tpMacAddress: The MAC address of the peer STA\n\n\tReturn Value:\n\t\tNone\n*/\nVOID AsicUpdateTxChainAddress(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pMacAddress);\n\nINT Set_StreamMode_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\nINT Set_StreamModeMac_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT Set_StreamModeMCS_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg);\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef WOW_SUPPORT\n#ifdef RTMP_MAC_USB\n/* For WOW, 8051 MUC send full frame */\nVOID AsicWOWSendNullFrame(\n    IN PRTMP_ADAPTER pAd,\n    IN UCHAR TxRate,\n    IN BOOLEAN bQosNull);\n \nVOID AsicLoadWOWFirmware(\n    IN PRTMP_ADAPTER pAd,\n    IN BOOLEAN WOW);\n#endif /* RTMP_MAC_USB */\n#endif /* WOW_SUPPORT */\n\nVOID MacAddrRandomBssid(\n\tIN  PRTMP_ADAPTER   pAd, \n\tOUT PUCHAR pAddr);\n\nVOID MgtMacHeaderInit(\n\tIN  PRTMP_ADAPTER     pAd, \n\tIN OUT PHEADER_802_11 pHdr80211, \n\tIN UCHAR SubType, \n\tIN UCHAR ToDs, \n\tIN PUCHAR pDA, \n#ifdef P2P_SUPPORT\n\tIN PUCHAR pSA,\n#endif /* P2P_SUPPORT */\n\tIN PUCHAR pBssid);\n\nVOID MlmeRadioOff(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID MlmeRadioOn(\n\tIN PRTMP_ADAPTER pAd);\n\n\nVOID BssTableInit(\n\tIN BSS_TABLE *Tab);\n\n#ifdef DOT11_N_SUPPORT\nVOID BATableInit(\n\tIN PRTMP_ADAPTER pAd,\n    IN BA_TABLE *Tab);\n\nVOID BATableExit(\t\n\tIN RTMP_ADAPTER *pAd);\n#endif /* DOT11_N_SUPPORT */\n\nULONG BssTableSearch(\n\tIN BSS_TABLE *Tab, \n\tIN PUCHAR pBssid,\n\tIN UCHAR Channel);\n\nULONG BssSsidTableSearch(\n\tIN BSS_TABLE *Tab, \n\tIN PUCHAR    pBssid,\n\tIN PUCHAR    pSsid,\n\tIN UCHAR     SsidLen,\n\tIN UCHAR     Channel);\n\nULONG BssTableSearchWithSSID(\n\tIN BSS_TABLE *Tab, \n\tIN PUCHAR    Bssid,\n\tIN PUCHAR    pSsid,\n\tIN UCHAR     SsidLen,\n\tIN UCHAR     Channel);\n\nULONG BssSsidTableSearchBySSID(\n\tIN BSS_TABLE *Tab,\n\tIN PUCHAR\t pSsid,\n\tIN UCHAR\t SsidLen);\n\nVOID BssTableDeleteEntry(\n\tIN OUT  PBSS_TABLE pTab, \n\tIN      PUCHAR pBssid,\n\tIN      UCHAR Channel);\n\nULONG BssTableSetEntry(\n\tIN PRTMP_ADAPTER pAd, \n\tOUT BSS_TABLE *Tab, \n\tIN BCN_IE_LIST *ie_list,\n\tIN CHAR Rssi,\n\tIN USHORT LengthVIE,\t\n\tIN PNDIS_802_11_VARIABLE_IEs pVIE);\n\n\n#ifdef DOT11_N_SUPPORT\nVOID BATableInsertEntry(\n    IN\tPRTMP_ADAPTER\tpAd, \n\tIN USHORT Aid,    \n    IN USHORT\t\tTimeOutValue,\n\tIN USHORT\t\tStartingSeq,\n    IN UCHAR TID, \n\tIN UCHAR BAWinSize, \n\tIN UCHAR OriginatorStatus, \n    IN BOOLEAN IsRecipient);\n\n#ifdef DOT11N_DRAFT3\nVOID Bss2040CoexistTimeOut(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\n\nVOID  TriEventInit(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nINT TriEventTableSetEntry(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tOUT TRIGGER_EVENT_TAB *Tab, \n\tIN PUCHAR pBssid, \n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR\t\t\tHtCapabilityLen,\n\tIN UCHAR\t\t\tRegClass,\n\tIN UCHAR ChannelNo);\n\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\nVOID BssTableSsidSort(\n\tIN  PRTMP_ADAPTER   pAd, \n\tOUT BSS_TABLE *OutTab, \n\tIN  CHAR Ssid[], \n\tIN  UCHAR SsidLen);\n\nVOID  BssTableSortByRssi(\n\tIN OUT BSS_TABLE *OutTab);\n\nVOID BssCipherParse(\n\tIN OUT  PBSS_ENTRY  pBss);\n\nNDIS_STATUS  MlmeQueueInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE *Queue);\n\nVOID  MlmeQueueDestroy(\n\tIN MLME_QUEUE *Queue);\n\nBOOLEAN MlmeEnqueue(\n\tIN PRTMP_ADAPTER pAd, \n\tIN ULONG Machine, \n\tIN ULONG MsgType, \n\tIN ULONG MsgLen, \n\tIN VOID *Msg,\n\tIN ULONG Priv);\n\nBOOLEAN MlmeEnqueueForRecv(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN ULONG Wcid, \n\tIN ULONG TimeStampHigh, \n\tIN ULONG TimeStampLow, \n\tIN UCHAR Rssi0, \n\tIN UCHAR Rssi1, \n\tIN UCHAR Rssi2, \n\tIN UCHAR AntSel, \n\tIN ULONG MsgLen, \n\tIN PVOID Msg,\n\tIN UCHAR Signal,\n\tIN UCHAR OpMode);\n\n#ifdef WSC_INCLUDED\nBOOLEAN MlmeEnqueueForWsc(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN ULONG eventID,\n\tIN LONG senderID,\n\tIN ULONG Machine,\n\tIN ULONG MsgType,\n\tIN ULONG MsgLen,\n\tIN VOID *Msg);\n#endif /* WSC_INCLUDED */\n\nBOOLEAN MlmeDequeue(\n\tIN MLME_QUEUE *Queue, \n\tOUT MLME_QUEUE_ELEM **Elem);\n\nVOID    MlmeRestartStateMachine(\n\tIN  PRTMP_ADAPTER   pAd);\n\nBOOLEAN  MlmeQueueEmpty(\n\tIN MLME_QUEUE *Queue);\n\nBOOLEAN  MlmeQueueFull(\n\tIN MLME_QUEUE *Queue,\n\tIN UCHAR SendId);\n\nBOOLEAN  MsgTypeSubst(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType);\n\nVOID StateMachineInit(\n\tIN STATE_MACHINE *Sm, \n\tIN STATE_MACHINE_FUNC Trans[], \n\tIN ULONG StNr, \n\tIN ULONG MsgNr, \n\tIN STATE_MACHINE_FUNC DefFunc, \n\tIN ULONG InitState, \n\tIN ULONG Base);\n\nVOID StateMachineSetAction(\n\tIN STATE_MACHINE *S, \n\tIN ULONG St, \n\tULONG Msg, \n\tIN STATE_MACHINE_FUNC F);\n\nVOID StateMachinePerformAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN STATE_MACHINE *S, \n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN ULONG CurrState);\n\nVOID Drop(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID AssocStateMachineInit(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  STATE_MACHINE *Sm, \n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID ReassocTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID AssocTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID DisassocTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\n/*---------------------------------------------- */\nVOID MlmeDisassocReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeAssocReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeReassocReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeDisassocReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerAssocRspAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerReassocRspAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerDisassocAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID DisassocTimeoutAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID AssocTimeoutAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID  ReassocTimeoutAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID  Cls3errAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR pAddr);\n\nVOID  InvalidStateWhenAssoc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID  InvalidStateWhenReassoc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID InvalidStateWhenDisassociate(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\n#ifdef RTMP_MAC_USB\nVOID MlmeCntlConfirm(\n\tIN PRTMP_ADAPTER pAd, \n\tIN ULONG MsgType, \n\tIN USHORT Msg);\n#endif /* RTMP_MAC_USB */\n\nVOID  ComposePsPoll(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID  ComposeNullFrame(\n\tIN  PRTMP_ADAPTER pAd);\n\nVOID  AssocPostProc(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  PUCHAR pAddr2, \n\tIN  USHORT CapabilityInfo, \n\tIN  USHORT Aid, \n\tIN  UCHAR SupRate[], \n\tIN  UCHAR SupRateLen,\n\tIN  UCHAR ExtRate[],\n\tIN  UCHAR ExtRateLen,\n\tIN PEDCA_PARM pEdcaParm,\n\tIN IE_LISTS *ie_list,\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN  UCHAR HtCapabilityLen,\n\tIN ADD_HT_INFO_IE *pAddHtInfo);\n\nVOID AuthStateMachineInit(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN PSTATE_MACHINE sm, \n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID AuthTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID MlmeAuthReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerAuthRspAtSeq2Action(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerAuthRspAtSeq4Action(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID AuthTimeoutAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID Cls2errAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR pAddr);\n\nVOID MlmeDeauthReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID InvalidStateWhenAuth(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\n/*============================================= */\n\nVOID AuthRspStateMachineInit(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PSTATE_MACHINE Sm, \n\tIN  STATE_MACHINE_FUNC Trans[]);\n\nVOID PeerDeauthAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerAuthSimpleRspGenAndSend(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PHEADER_802_11  pHdr80211, \n\tIN  USHORT Alg, \n\tIN  USHORT Seq, \n\tIN  USHORT Reason, \n\tIN  USHORT Status);\n\n/* */\n/* Private routines in dls.c */\n/* */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef QOS_DLS_SUPPORT\nVOID APDLSStateMachineInit(\n    IN\tPRTMP_ADAPTER\t\tpAd, \n    IN  STATE_MACHINE\t\t*S, \n    OUT STATE_MACHINE_FUNC\tTrans[]);\n\nVOID APPeerDlsReqAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM\t*Elem);\n\nVOID APPeerDlsRspAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM\t*Elem);\n\nVOID APPeerDlsTearDownAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM\t*Elem);\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\nvoid DlsStateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nVOID MlmeDlsReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerDlsReqAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM\t*Elem);\n\nVOID PeerDlsRspAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM\t*Elem);\n\nVOID MlmeDlsTearDownAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerDlsTearDownAction(\n    IN PRTMP_ADAPTER\tpAd, \n    IN MLME_QUEUE_ELEM\t*Elem);\n\nVOID RTMPCheckDLSTimeOut(\n\tIN PRTMP_ADAPTER\tpAd);\n\nBOOLEAN RTMPRcvFrameDLSCheck(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PHEADER_802_11 pHeader,\n\tIN ULONG Len,\n\tIN RXD_STRUC *pRxD);\n\nINT\tRTMPCheckDLSFrame(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR *pDA);\n\nVOID RTMPSendDLSTearDownFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR          pDA);\n\nNDIS_STATUS RTMPSendSTAKeyRequest(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpDA);\n\nNDIS_STATUS RTMPSendSTAKeyHandShake(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpDA);\n\nVOID DlsTimeoutAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nBOOLEAN MlmeDlsReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PRT_802_11_DLS *pDLS,\n    OUT PUSHORT pReason);\n\nINT Set_DlsEntryInfo_Display_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR arg);\n\nMAC_TABLE_ENTRY *MacTableInsertDlsEntry(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  PUCHAR\tpAddr,\n\tIN  UINT\tDlsEntryIdx);\n\nBOOLEAN MacTableDeleteDlsEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT wcid,\n\tIN PUCHAR pAddr);\n\nMAC_TABLE_ENTRY *DlsEntryTableLookup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\tpAddr,\n\tIN BOOLEAN\tbResetIdelCount);\n\nMAC_TABLE_ENTRY *DlsEntryTableLookupByWcid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\twcid,\n\tIN PUCHAR\tpAddr,\n\tIN BOOLEAN\tbResetIdelCount);\n\nINT\tSet_DlsAddEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DlsTearDownEntry_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef QOS_DLS_SUPPORT\nBOOLEAN PeerDlsReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PUCHAR pDA,\n    OUT PUCHAR pSA,\n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pDlsTimeout,\n    OUT UCHAR *pRatesLen,\n    OUT UCHAR Rates[],\n    OUT UCHAR *pHtCapabilityLen,\n    OUT HT_CAPABILITY_IE *pHtCapability);\n\nBOOLEAN PeerDlsRspSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PUCHAR pDA,\n    OUT PUCHAR pSA,\n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pStatus,\n    OUT UCHAR *pRatesLen,\n    OUT UCHAR Rates[],\n    OUT UCHAR *pHtCapabilityLen,\n    OUT HT_CAPABILITY_IE *pHtCapability);\n\nBOOLEAN PeerDlsTearDownSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PUCHAR pDA,\n    OUT PUCHAR pSA,\n    OUT USHORT *pReason);\n#endif /* QOS_DLS_SUPPORT */\n\nBOOLEAN PeerProbeReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2,\n    OUT CHAR Ssid[], \n    OUT UCHAR *SsidLen,\n    OUT BOOLEAN *bRequestRssi);\n\n/*======================================== */\n\nVOID SyncStateMachineInit(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  STATE_MACHINE *Sm, \n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID BeaconTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID ScanTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID MlmeScanReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID InvalidStateWhenScan(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID InvalidStateWhenJoin(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID InvalidStateWhenStart(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerBeacon(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID EnqueueProbeRequest(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN ScanRunning(\n\t\tIN PRTMP_ADAPTER pAd);\n/*========================================= */\n\nVOID MlmeCntlInit(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  STATE_MACHINE *S, \n\tOUT STATE_MACHINE_FUNC Trans[]);\n\nVOID MlmeCntlMachinePerformAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  STATE_MACHINE *S, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlIdleProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlOidScanProc(\n\tIN  PRTMP_ADAPTER pAd,\n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlOidSsidProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM * Elem);\n\nVOID CntlOidRTBssidProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM * Elem);\n\nVOID CntlMlmeRoamingProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM * Elem);\n\nVOID CntlWaitDisassocProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlWaitJoinProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlWaitReassocProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlWaitStartProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlWaitAuthProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlWaitAuthProc2(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID CntlWaitAssocProc(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\n#ifdef QOS_DLS_SUPPORT\nVOID CntlOidDLSSetupProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n#endif /* QOS_DLS_SUPPORT */\n\n\nVOID LinkUp(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  UCHAR BssType);\n\nVOID LinkDown(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  BOOLEAN         IsReqFromAP);\n\nVOID IterateOnBssTab(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID IterateOnBssTab2(\n\tIN  PRTMP_ADAPTER   pAd);;\n\nVOID JoinParmFill(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  OUT MLME_JOIN_REQ_STRUCT *JoinReq, \n\tIN  ULONG BssIdx);\n\nVOID AssocParmFill(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN OUT MLME_ASSOC_REQ_STRUCT *AssocReq, \n\tIN  PUCHAR pAddr, \n\tIN  USHORT CapabilityInfo, \n\tIN  ULONG Timeout, \n\tIN  USHORT ListenIntv);\n\nVOID ScanParmFill(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  OUT MLME_SCAN_REQ_STRUCT *ScanReq, \n\tIN  STRING Ssid[], \n\tIN  UCHAR SsidLen, \n\tIN  UCHAR BssType, \n\tIN  UCHAR ScanType); \n\nVOID DisassocParmFill(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq, \n\tIN  PUCHAR pAddr, \n\tIN  USHORT Reason);\n\nVOID StartParmFill(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  OUT MLME_START_REQ_STRUCT *StartReq, \n\tIN  CHAR Ssid[], \n\tIN  UCHAR SsidLen);\n\nVOID AuthParmFill(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  OUT MLME_AUTH_REQ_STRUCT *AuthReq, \n\tIN  PUCHAR pAddr, \n\tIN  USHORT Alg);\n\nVOID EnqueuePsPoll(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID EnqueueBeaconFrame(\n\tIN  PRTMP_ADAPTER   pAd); \n\nVOID MlmeJoinReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeScanReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeStartReqAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeForceJoinReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID MlmeForceScanReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID ScanTimeoutAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID BeaconTimeoutAtJoinAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerBeaconAtScanAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerBeaconAtJoinAction(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerBeacon(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID PeerProbeReqAction(\n\tIN  PRTMP_ADAPTER pAd, \n\tIN  MLME_QUEUE_ELEM *Elem);\n\nVOID ScanNextChannel(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUCHAR\tOpMode);\n\n\nULONG MakeIbssBeacon(\n\tIN  PRTMP_ADAPTER   pAd);\n\n#ifdef CONFIG_STA_SUPPORT\nVOID InitChannelRelatedValue(\n\tIN  PRTMP_ADAPTER   pAd);\n\n#ifdef CONFIG_MULTI_CHANNEL\nVOID AdjustChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT UCHAR *pBwFallBack,\n\tIN USHORT ifIndex,\n\tIN BOOLEAN BandWidth,\n\tIN UCHAR PriCh,\n\tIN UCHAR ExtraCh,\n\tIN BOOLEAN bfromP2P);\n#else\nVOID AdjustChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT UCHAR *pBwFallBack,\n\tIN USHORT ifIndex,\n\tIN BOOLEAN BandWidth,\n\tIN UCHAR PriCh,\n\tIN UCHAR ExtraCh);\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n#endif /* CONFIG_STA_SUPPORT */\n\nBOOLEAN MlmeScanReqSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT UCHAR *BssType, \n\tOUT CHAR ssid[], \n\tOUT UCHAR *SsidLen, \n\tOUT UCHAR *ScanType);\n\n\nBOOLEAN PeerBeaconAndProbeRspSanity_Old(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tIN  UCHAR MsgChannel,\n\tOUT PUCHAR pAddr2, \n\tOUT PUCHAR pBssid, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT UCHAR *pBssType, \n\tOUT USHORT *pBeaconPeriod, \n\tOUT UCHAR *pChannel, \n\tOUT UCHAR *pNewChannel, \n\tOUT LARGE_INTEGER *pTimestamp, \n\tOUT CF_PARM *pCfParm, \n\tOUT USHORT *pAtimWin, \n\tOUT USHORT *pCapabilityInfo, \n\tOUT UCHAR *pErp,\n\tOUT UCHAR *pDtimCount, \n\tOUT UCHAR *pDtimPeriod, \n\tOUT UCHAR *pBcastFlag, \n\tOUT UCHAR *pMessageToMe, \n\tOUT UCHAR SupRate[],\n\tOUT UCHAR *pSupRateLen,\n\tOUT UCHAR ExtRate[],\n\tOUT UCHAR *pExtRateLen,\n\tOUT\tUCHAR *pCkipFlag,\n\tOUT\tUCHAR *pAironetCellPowerLimit,\n\tOUT PEDCA_PARM       pEdcaParm,\n\tOUT PQBSS_LOAD_PARM  pQbssLoad,\n\tOUT PQOS_CAPABILITY_PARM pQosCapability,\n\tOUT ULONG *pRalinkIe,\n\tOUT UCHAR\t\t *pHtCapabilityLen,\n#ifdef CONFIG_STA_SUPPORT\n\tOUT UCHAR\t\t *pPreNHtCapabilityLen,\n#endif /* CONFIG_STA_SUPPORT */\n\tOUT HT_CAPABILITY_IE *pHtCapability,\n\tOUT EXT_CAP_INFO_ELEMENT *pExtCapInfo,\n\tOUT UCHAR\t\t *AddHtInfoLen,\n\tOUT ADD_HT_INFO_IE *AddHtInfo,\n\tOUT UCHAR *NewExtChannel,\n\tOUT USHORT *LengthVIE,\n\tOUT PNDIS_802_11_VARIABLE_IEs pVIE);\n\n\nBOOLEAN PeerBeaconAndProbeRspSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN UCHAR  MsgChannel,\n\tOUT BCN_IE_LIST *ie_list,\n\tOUT USHORT *LengthVIE,\t\n\tOUT PNDIS_802_11_VARIABLE_IEs pVIE);\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\nBOOLEAN PeerBeaconAndProbeRspSanity2(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tIN OVERLAP_BSS_SCAN_IE *BssScan,\n\tOUT UCHAR \t*RegClass);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\nBOOLEAN PeerAddBAReqActionSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen,\n\tOUT PUCHAR pAddr2);\n\nBOOLEAN PeerAddBARspActionSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen);\n\nBOOLEAN PeerDelBAActionSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN UCHAR Wcid, \n    IN VOID *pMsg, \n    IN ULONG MsgLen);\n\nBOOLEAN MlmeAssocReqSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT PUCHAR pApAddr, \n\tOUT USHORT *CapabilityInfo, \n\tOUT ULONG *Timeout, \n\tOUT USHORT *ListenIntv);\n\nBOOLEAN MlmeAuthReqSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT PUCHAR pAddr, \n\tOUT ULONG *Timeout, \n\tOUT USHORT *Alg);\n\nBOOLEAN MlmeStartReqSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *Ssidlen);\n\nBOOLEAN PeerAuthSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT PUCHAR pAddr, \n\tOUT USHORT *Alg, \n\tOUT USHORT *Seq, \n\tOUT USHORT *Status, \n\tOUT CHAR ChlgText[]);\n\nBOOLEAN PeerAssocRspSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n    IN VOID *pMsg, \n\tIN  ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT USHORT *pCapabilityInfo, \n\tOUT USHORT *pStatus, \n\tOUT USHORT *pAid, \n\tOUT UCHAR SupRate[], \n\tOUT UCHAR *pSupRateLen,\n\tOUT UCHAR ExtRate[],\n\tOUT UCHAR *pExtRateLen,\n    OUT HT_CAPABILITY_IE\t\t*pHtCapability,\n    OUT ADD_HT_INFO_IE\t\t*pAddHtInfo,\t/* AP might use this additional ht info IE */\n    OUT UCHAR\t\t\t*pHtCapabilityLen,\n    OUT UCHAR\t\t\t*pAddHtInfoLen,\n    OUT UCHAR\t\t\t*pNewExtChannelOffset,\n\tOUT PEDCA_PARM pEdcaParm,\n\tOUT EXT_CAP_INFO_ELEMENT *pExtCapInfo,\n\tOUT UCHAR *pCkipFlag,\n\tOUT IE_LISTS *ie_list);\n\nBOOLEAN PeerDisassocSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT USHORT *Reason);\n\nBOOLEAN PeerDeauthSanity(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  VOID *Msg, \n\tIN  ULONG MsgLen, \n\tOUT PUCHAR pAddr1,\n\tOUT PUCHAR pAddr2, \n\tOUT PUCHAR pAddr3, \n\tOUT USHORT *Reason);\n\nBOOLEAN GetTimBit(\n\tIN  CHAR *Ptr, \n\tIN  USHORT Aid, \n\tOUT UCHAR *TimLen, \n\tOUT UCHAR *BcastFlag, \n\tOUT UCHAR *DtimCount, \n\tOUT UCHAR *DtimPeriod, \n\tOUT UCHAR *MessageToMe);\n\nUCHAR ChannelSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN UCHAR channel);\n\nNDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(\n\tIN PBSS_ENTRY pBss);\n\nBOOLEAN MlmeDelBAReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen);\n\nBOOLEAN MlmeAddBAReqSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2);\n\nULONG MakeOutgoingFrame(\n\tOUT UCHAR *Buffer, \n\tOUT ULONG *Length, ...);\n\nUCHAR RandomByte(\n\tIN  PRTMP_ADAPTER   pAd);\n\nUCHAR RandomByte2(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID AsicUpdateAutoFallBackTable(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpTxRate);\n\n\n\nVOID  MlmePeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID LinkDownExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID LinkUpExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID STAMlmePeriodicExec(\n\tPRTMP_ADAPTER pAd);\n\nVOID MlmeAutoScan(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID MlmeAutoReconnectLastSSID(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN MlmeValidateSSID(\n\tIN PUCHAR pSsid,\n\tIN UCHAR  SsidLen); \n\nVOID MlmeCheckForRoaming(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG    Now32);\n\nBOOLEAN MlmeCheckForFastRoaming(\n\tIN  PRTMP_ADAPTER   pAd);\n\n#ifdef TXBF_SUPPORT\nBOOLEAN MlmeTxBfAllowed(\n\tIN PRTMP_ADAPTER \t\tpAd,\n\tIN PMAC_TABLE_ENTRY\t\tpEntry,\n\tIN struct _RTMP_RA_LEGACY_TB *pTxRate);\n#endif /* TXBF_SUPPORT */\n\n#ifdef AGS_SUPPORT\nINT Show_AGS_Proc(\n    IN  PRTMP_ADAPTER\tpAd, \n    IN  PSTRING\t\t\targ);\n\n#ifdef CONFIG_STA_SUPPORT\nVOID MlmeDynamicTxRateSwitchingAGS(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY pEntry, \n\tIN PUCHAR pTable, \n\tIN UCHAR TableSize, \n\tIN PAGS_STATISTICS_INFO pAGSStatisticsInfo,\n\tIN UCHAR InitTxRateIdx);\n\nVOID StaQuickResponeForRateUpExecAGS(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY pEntry, \n\tIN PUCHAR pTable, \n\tIN UCHAR TableSize, \n\tIN PAGS_STATISTICS_INFO pAGSStatisticsInfo,\n\tIN UCHAR InitTxRateIdx);\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nVOID ApMlmeDynamicTxRateSwitchingAGS(\n\tIN RTMP_ADAPTER *pAd,\n\tIN INT idx);\n\nVOID ApQuickResponeForRateUpExecAGS(\n\tIN RTMP_ADAPTER *pAd,\n\tIN INT idx);\n\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* AGS_SUPPORT */\n\nVOID MlmeCalculateChannelQuality(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pMacEntry,\n\tIN ULONG Now);\n\nVOID MlmeCheckPsmChange(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG    Now32);\n\nVOID MlmeSetPsmBit(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT psm);\n\nVOID MlmeSetTxPreamble(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT TxPreamble);\n\nVOID UpdateBasicRateBitmap(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID MlmeUpdateTxRates(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN \tBOOLEAN\t\t \tbLinkUp,\n\tIN\tUCHAR\t\t\tapidx);\n\n#ifdef DOT11_N_SUPPORT\nVOID MlmeUpdateHtTxRates(\n\tIN PRTMP_ADAPTER \t\tpAd,\n\tIN\tUCHAR\t\t\t\tapidx);\n#endif /* DOT11_N_SUPPORT */\n\nVOID    RTMPCheckRates(\n\tIN      PRTMP_ADAPTER   pAd,\n\tIN OUT  UCHAR           SupRate[],\n\tIN OUT  UCHAR           *SupRateLen);\n\n#ifdef CONFIG_STA_SUPPORT\nBOOLEAN RTMPCheckChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\tCentralChannel,\n\tIN UCHAR\t\tChannel);\n#endif /* CONFIG_STA_SUPPORT */\n\nBOOLEAN RTMPCheckHt(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Wcid,\n\tINOUT HT_CAPABILITY_IE *pHtCapability,\n\tINOUT ADD_HT_INFO_IE *pAddHtInfo);\n\n#ifdef DOT11_VHT_AC\nBOOLEAN RTMPCheckVht(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Wcid,\n\tIN VHT_CAP_IE *vht_cap,\n\tIN VHT_OP_IE *vht_op);\n#endif /* DOT11_VHT_AC */\n\nVOID RTMPUpdateMlmeRate(\n\tIN PRTMP_ADAPTER\tpAd);\n\nCHAR RTMPMaxRssi(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN CHAR\t\t\t\tRssi0,\n\tIN CHAR\t\t\t\tRssi1,\n\tIN CHAR\t\t\t\tRssi2);\n\nCHAR RTMPAvgRssi(\n        IN PRTMP_ADAPTER\tpAd,\n        IN RSSI_SAMPLE\t\t*pRssi);\n\n\nCHAR RTMPMinSnr(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN CHAR\t\t\t\tSnr0,\n\tIN CHAR\t\t\t\tSnr1);\n\nVOID AsicSetRxAnt(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tAnt);\n\n#ifdef RTMP_EFUSE_SUPPORT\nINT set_eFuseGetFreeBlockCount_Proc(  \n   \tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT set_eFusedump_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT set_eFuseLoadFromBin_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nVOID eFusePhysicalReadRegisters( \n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tUSHORT Offset, \n\tIN\tUSHORT Length, \n\tOUT\tUSHORT* pData);\n\nint RtmpEfuseSupportCheck(\n\tIN RTMP_ADAPTER *pAd);\n\n#ifdef RALINK_ATE\nINT set_eFuseBufferModeWriteBack_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#endif /* RALINK_ATE */\n#endif /* RTMP_EFUSE_SUPPORT */\n\n\n\n\n\nVOID AsicEvaluateRxAnt(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID AsicRxAntEvalTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID APSDPeriodicExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nBOOLEAN RTMPCheckEntryEnableAutoRateSwitch(\n\tIN PRTMP_ADAPTER    pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry);\n\nUCHAR RTMPStaFixedTxMode(\n\tIN PRTMP_ADAPTER    pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry);\n\nVOID RTMPUpdateLegacyTxSetting(\n\t\tUCHAR\t\t\t\tfixed_tx_mode,\n\t\tPMAC_TABLE_ENTRY\tpEntry);\n\nBOOLEAN RTMPAutoRateSwitchCheck(\n\tIN PRTMP_ADAPTER    pAd);\n\nNDIS_STATUS MlmeInit(\n\tIN  PRTMP_ADAPTER   pAd);\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n/*\n\tInitialize the frequency calibration\n\tParameters\n\t\tpAd: The adapter data structure\n\tReturn Value:\n\t\tNone\n*/\nVOID InitFrequencyCalibration(\n\tIN PRTMP_ADAPTER pAd);\n\n/* */\n/* To stop the frequency calibration algorithm */\n/* */\n/* Parameters */\n/*\tpAd: The adapter data structure */\n/* */\n/* Return Value: */\n/*\tNone */\n/* */\nVOID StopFrequencyCalibration(\n\tIN PRTMP_ADAPTER pAd);\n\n/* */\n/* The frequency calibration algorithm */\n/* */\n/* Parameters */\n/*\tpAd: The adapter data structure */\n/* */\n/* Return Value: */\n/*\tNone */\n/* */\nVOID FrequencyCalibration(\n\tIN PRTMP_ADAPTER pAd);\n\n/* */\n/* Get the frequency offset */\n/* */\n/* Parameters */\n/*\tpAd: The adapter data structure */\n/*\tpRxWI: Point to the RxWI structure */\n/* */\n/* Return Value: */\n/*\tThe frequency offset */\n/* */\nCHAR GetFrequencyOffset(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RXWI_STRUC *pRxWI);\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef RTMP_TEMPERATURE_COMPENSATION\nVOID InitLookupTable(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\nVOID MlmeHandler(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID MlmeHalt(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID MlmeResetRalinkCounters(\n\tIN  PRTMP_ADAPTER   pAd);\n\nVOID BuildChannelList(\n\tIN PRTMP_ADAPTER pAd);\n\nUCHAR FirstChannel(\n\tIN  PRTMP_ADAPTER   pAd);\n\nUCHAR NextChannel(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  UCHAR channel);\n\nVOID ChangeToCellPowerLimit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR         AironetCellPowerLimit);\n\n/* */\n/* Prototypes of function definition in cmm_tkip.c */\n/* */\nVOID    RTMPInitMICEngine(\n\tIN  PRTMP_ADAPTER   pAd,    \n\tIN  PUCHAR          pKey,\n\tIN  PUCHAR          pDA,\n\tIN  PUCHAR          pSA,\n\tIN  UCHAR           UserPriority,\n\tIN  PUCHAR          pMICKey);\n\nBOOLEAN RTMPTkipCompareMICValue(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pSrc,\n\tIN  PUCHAR          pDA,\n\tIN  PUCHAR          pSA,\n\tIN  PUCHAR          pMICKey,\n\tIN\tUCHAR\t\t\tUserPriority,\n\tIN  UINT            Len);\n\nVOID    RTMPCalculateMICValue(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PNDIS_PACKET    pPacket,\n\tIN  PUCHAR          pEncap,\n\tIN  PCIPHER_KEY     pKey,\n\tIN\tUCHAR\t\t\tapidx);\n\nVOID    RTMPTkipAppendByte( \n\tIN  PTKIP_KEY_INFO  pTkip,  \n\tIN  UCHAR           uChar);\n\nVOID    RTMPTkipAppend( \n\tIN  PTKIP_KEY_INFO  pTkip,  \n\tIN  PUCHAR          pSrc,\n\tIN  UINT            nBytes);\n\nVOID    RTMPTkipGetMIC( \n\tIN  PTKIP_KEY_INFO  pTkip);\n\n/* */\n/* Prototypes of function definition in cmm_cfg.c */\n/* */\nINT RT_CfgSetCountryRegion(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ,\n\tIN INT\t\t\t\tband);\n\nINT RT_CfgSetWirelessMode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nUCHAR cfgmode_2_wmode(UCHAR cfg_mode);\nUCHAR wmode_2_cfgmode(UCHAR wmode);\nUCHAR *wmode_2_str(UCHAR wmode);\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef MBSS_SUPPORT\nINT RT_CfgSetMbssWirelessMode(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\nINT RT_CfgSetShortSlot(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tRT_CfgSetWepKey(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tkeyString,\n\tIN\tCIPHER_KEY\t\t*pSharedKey,\n\tIN\tINT\t\t\t\tkeyIdx);\n\nINT RT_CfgSetWPAPSKKey(\n\tIN RTMP_ADAPTER\t*pAd, \n\tIN PSTRING\t\tkeyString,\n\tIN INT\t\t\tkeyStringLen,\n\tIN UCHAR\t\t*pHashStr,\n\tIN INT\t\t\thashStrLen,\n\tOUT PUCHAR\t\tpPMKBuf);\n\nINT\tRT_CfgSetFixedTxPhyMode(\n\tIN\tPSTRING\t\t\targ);\n\nINT\tRT_CfgSetMacAddress(\n\tIN \tPRTMP_ADAPTER \tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tRT_CfgSetTxMCSProc(\n\tIN\tPSTRING\t\t\targ,\n\tOUT\tBOOLEAN\t\t\t*pAutoRate);\n\nINT\tRT_CfgSetAutoFallBack(\n\tIN \tPRTMP_ADAPTER \tpAd,\n\tIN\tPSTRING\t\t\targ);\n\n#ifdef WSC_INCLUDED\nINT\tRT_CfgSetWscPinCode(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING\t\tpPinCodeStr,\n\tOUT PWSC_CTRL   pWscControl);\n#endif /* WSC_INCLUDED */\n\nINT\tSet_Antenna_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\n\n#ifdef MICROWAVE_OVEN_SUPPORT\nINT Set_MO_FalseCCATh_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n/* */\n/* Prototypes of function definition in cmm_info.c */\n/* */\nNDIS_STATUS RTMPWPARemoveKeyProc(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PVOID           pBuf);\n\nVOID    RTMPWPARemoveAllKeys(\n\tIN  PRTMP_ADAPTER   pAd);\n\nBOOLEAN RTMPCheckStrPrintAble(\n    IN  CHAR *pInPutStr, \n    IN  UCHAR strLen);\n    \nVOID    RTMPSetPhyMode(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  ULONG phymode);\n\nVOID\tRTMPUpdateHTIE(\n\tIN\tRT_HT_CAPABILITY\t*pRtHt,\n\tIN\t\tUCHAR\t\t\t\t*pMcsSet,\n\tOUT\t\tHT_CAPABILITY_IE *pHtCapability,\n\tOUT\t\tADD_HT_INFO_IE\t\t*pAddHtInfo);\n\nVOID\tRTMPAddWcidAttributeEntry(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBssIdx,\n\tIN \tUCHAR\t\t \tKeyIdx,\n\tIN \tUCHAR\t\t \tCipherAlg,\n\tIN \tMAC_TABLE_ENTRY *pEntry);\n\nPSTRING GetEncryptType(\n\tCHAR enc);\n\nPSTRING GetAuthMode(\n\tCHAR auth);\n\n#ifdef DOT11_N_SUPPORT\nVOID\tRTMPSetHT(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tOID_SET_HT_PHYMODE *pHTPhyMode);\n\nVOID\tRTMPSetIndividualHT(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tUCHAR\t\t\t\tapidx);\n\nUCHAR get_cent_ch_by_htinfo(\n\tRTMP_ADAPTER *pAd,\n\tADD_HT_INFO_IE *ht_op,\n\tHT_CAPABILITY_IE *ht_cap);\n\nINT get_ht_cent_ch(RTMP_ADAPTER *pAd, UCHAR *rf_bw, UCHAR *ext_ch);\nINT ht_mode_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, HT_CAPABILITY_IE *peer, RT_HT_CAPABILITY *my);\nINT set_ht_fixed_mcs(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, UCHAR fixed_mcs, UCHAR mcs_bound);\nINT get_ht_max_mcs(RTMP_ADAPTER *pAd, UCHAR *desire_mcs, UCHAR *cap_mcs);\n#endif /* DOT11_N_SUPPORT */\n\nVOID RTMPDisableDesiredHtInfo(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\n#ifdef SYSTEM_LOG_SUPPORT\nVOID RtmpDrvSendWirelessEvent(\n\tIN\tVOID\t\t\t*pAdSrc,\n\tIN\tUSHORT\t\t\tEvent_flag,\n\tIN\tPUCHAR \t\t\tpAddr,\n\tIN  UCHAR\t\t\tBssIdx,\n\tIN\tCHAR\t\t\tRssi);\n#else\n#define RtmpDrvSendWirelessEvent(_pAd, _Event_flag, _pAddr, _BssIdx, _Rssi)\n#endif /* SYSTEM_LOG_SUPPORT */\n\t\nCHAR    ConvertToRssi(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN CHAR\t\t\t\tRssi,\n\tIN UCHAR    RssiNumber,\n\tIN UCHAR AntSel,\n\tIN UCHAR BW);\n\nCHAR    ConvertToSnr(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN UCHAR\t\t\t\tSnr);\n\n#ifdef DOT11N_DRAFT3\nVOID BuildEffectedChannelList(\n\tIN PRTMP_ADAPTER pAd);\n\n\nVOID DeleteEffectedChannelList(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID CntlChannelWidth(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tPrimaryChannel,\n\tIN UCHAR\t\t\tCentralChannel,\t\n\tIN UCHAR\t\t\tChannelWidth,\n\tIN UCHAR\t\t\tSecondaryChannelOffset);\n\n#endif /* DOT11N_DRAFT3 */\n\n\nVOID APAsicEvaluateRxAnt(\n\tIN PRTMP_ADAPTER\tpAd);\n\n\nVOID APAsicRxAntEvalTimeout(\n\tIN PRTMP_ADAPTER\tpAd);\n\n\n/* */\n/* function prototype in ap_wpa.c */\n/* */\nVOID RTMPGetTxTscFromAsic(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUCHAR\t\t\tapidx,\n\tOUT\tPUCHAR\t\t\tpTxTsc);\n\nMAC_TABLE_ENTRY *PACInquiry(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  ULONG           Wcid);\n\nUINT\tAPValidateRSNIE(\n\tIN PRTMP_ADAPTER    pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN PUCHAR\t\t\tpRsnIe,\n\tIN UCHAR\t\t\trsnie_len);\n\nVOID HandleCounterMeasure(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MAC_TABLE_ENTRY  *pEntry);\n\nVOID WPAStart4WayHS(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN\tULONG\t\t\tTimeInterval);\n\nVOID WPAStart2WayGroupHS(\n\tIN  PRTMP_ADAPTER   pAd, \n\tIN  MAC_TABLE_ENTRY *pEntry);\n\nVOID PeerPairMsg1Action(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MAC_TABLE_ENTRY  *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerPairMsg2Action(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MAC_TABLE_ENTRY  *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerPairMsg3Action(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MAC_TABLE_ENTRY  *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerPairMsg4Action(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MAC_TABLE_ENTRY  *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID PeerGroupMsg1Action(\n\tIN  PRTMP_ADAPTER    pAd, \n\tIN  PMAC_TABLE_ENTRY pEntry,\n    IN  MLME_QUEUE_ELEM  *Elem);\n\nVOID PeerGroupMsg2Action(\n\tIN  PRTMP_ADAPTER    pAd, \n\tIN  PMAC_TABLE_ENTRY pEntry,\n\tIN  VOID             *Msg,\n\tIN  UINT             MsgLen);\n\nVOID CMTimerExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID WPARetryExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\n#ifdef TXBF_SUPPORT\nVOID eTxBfProbeTimerExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3);\n#endif /* TXBF_SUPPORT */\n\nVOID EnqueueStartForPSKExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3); \n\nVOID RTMPHandleSTAKey(\n    IN PRTMP_ADAPTER    pAdapter, \n    IN MAC_TABLE_ENTRY  *pEntry,\n    IN MLME_QUEUE_ELEM  *Elem);\n\nVOID MlmeDeAuthAction(\n\tIN  PRTMP_ADAPTER    pAd, \n\tIN  PMAC_TABLE_ENTRY pEntry,\n\tIN  USHORT           Reason,\n\tIN  BOOLEAN          bDataFrameFirst);\n\n\nVOID GREKEYPeriodicExec(\n\tIN  PVOID   SystemSpecific1, \n\tIN  PVOID   FunctionContext, \n\tIN  PVOID   SystemSpecific2, \n\tIN  PVOID   SystemSpecific3);\n\nVOID AES_128_CMAC(\n\tIN\tPUCHAR\tkey,\n\tIN\tPUCHAR\tinput,\n\tIN\tINT\t\tlen,\n\tOUT\tPUCHAR\tmac);\n\n#ifdef DOT1X_SUPPORT\nVOID    WpaSend(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  PUCHAR          pPacket,\n    IN  ULONG           Len);\n\nVOID RTMPAddPMKIDCache(\n\tIN  PRTMP_ADAPTER   \t\tpAd,\n\tIN\tINT\t\t\t\t\t\tapidx,\n\tIN\tPUCHAR\t\t\t\tpAddr,\n\tIN\tUCHAR\t\t\t\t\t*PMKID,\n\tIN\tUCHAR\t\t\t\t\t*PMK);\n\nINT RTMPSearchPMKIDCache(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tINT\t\t\t\tapidx,\n\tIN\tPUCHAR\t\tpAddr);\n\nVOID RTMPDeletePMKIDCache(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tINT\t\t\t\tapidx,\n\tIN  INT\t\t\t\tidx);\n\nVOID RTMPMaintainPMKIDCache(\n\tIN  PRTMP_ADAPTER   pAd);\n#else\n#define RTMPMaintainPMKIDCache(_pAd)\n#endif /* DOT1X_SUPPORT */\n\n#ifdef RESOURCE_PRE_ALLOC\nVOID RTMPResetTxRxRingMemory(\n\tIN  RTMP_ADAPTER   *pAd);\n#endif /* RESOURCE_PRE_ALLOC */\n\nVOID RTMPFreeTxRxRingMemory(\n    IN  PRTMP_ADAPTER   pAd);\n\nBOOLEAN RTMP_FillTxBlkInfo(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk);\n\n void announce_802_3_packet(\n\tIN\tVOID\t\t\t*pAdSrc,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tUCHAR\t\t\tOpMode);\n\n#ifdef DOT11_N_SUPPORT\nUINT BA_Reorder_AMSDU_Annnounce(\n\tIN\tPRTMP_ADAPTER\tpAd, \t\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tUCHAR\t\t\tOpMode);\n#endif /* DOT11_N_SUPPORT */\n\nPNET_DEV get_netdev_from_bssid(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\n\n#ifdef DOT11_N_SUPPORT\nvoid ba_flush_reordering_timeout_mpdus(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN PBA_REC_ENTRY\tpBAEntry,\n\tIN ULONG\t\t\tNow32);\n\n\nVOID BAOriSessionSetUp(\n\t\t\tIN PRTMP_ADAPTER    pAd, \n\t\t\tIN MAC_TABLE_ENTRY\t*pEntry,\n\t\t\tIN UCHAR\t\t\tTID,\n\t\t\tIN USHORT\t\t\tTimeOut,\n\t\t\tIN ULONG\t\t\tDelayTime,\n\t\t\tIN BOOLEAN\t\tisForced);\n\nVOID BASessionTearDownALL(\n\tIN OUT\tPRTMP_ADAPTER pAd, \n\tIN\t\tUCHAR Wcid);\n\nVOID BAOriSessionTearDown(\n\tIN OUT\tPRTMP_ADAPTER\tpAd, \n\tIN\t\tUCHAR\t\t\tWcid,\n\tIN\t\tUCHAR\t\t\tTID,\n\tIN\t\tBOOLEAN\t\t\tbPassive,\n\tIN\t\tBOOLEAN\t\t\tbForceSend);\n\nVOID BARecSessionTearDown(\n\tIN OUT\tPRTMP_ADAPTER\tpAd, \n\tIN\t\tUCHAR\t\t\tWcid,\n\tIN\t\tUCHAR\t\t\tTID,\n\tIN\t\tBOOLEAN\t\t\tbPassive);\n#endif /* DOT11_N_SUPPORT */\n\nBOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);\nvoid ba_reordering_resource_release(PRTMP_ADAPTER pAd);\n\nINT ComputeChecksum(\n\tIN UINT PIN);\n\nUINT GenerateWpsPinCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n    IN  BOOLEAN         bFromApcli,\n\tIN\tUCHAR\tapidx);\n\n#ifdef WSC_INCLUDED\nINT\tSet_WscGenPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_WscVendorPinCode_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\n#ifdef WSC_AP_SUPPORT\nVOID RTMPIoctlSetWSCOOB(IN PRTMP_ADAPTER pAd);\n#endif\n\n#ifdef WSC_STA_SUPPORT\nVOID CntlWscIterate(\n\tIN PRTMP_ADAPTER pAd);\n\nUSHORT WscGetAuthTypeFromStr(\n    IN  PSTRING          arg);\n\nUSHORT WscGetEncrypTypeFromStr(\n    IN  PSTRING          arg);\n#endif /* WSC_STA_SUPPORT */\n/* */\n/* prototype in wsc.c */\n/* */\nBOOLEAN\tWscMsgTypeSubst(\n\tIN\tUCHAR\tEAPType,\n\tIN\tUCHAR\tEAPCode,\n\tOUT\tINT\t    *MsgType);\n\nVOID    WscStateMachineInit(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tSTATE_MACHINE\t\t*S, \n\tOUT STATE_MACHINE_FUNC Trans[]);\n\n#ifdef IWSC_SUPPORT\nvoid\tIWSC_StateMachineInit(\n    IN  PRTMP_ADAPTER pAd, \n    IN  STATE_MACHINE *S, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nVOID\tIWSC_Init(\n\tIN  IN PRTMP_ADAPTER pAd);\n#endif // IWSC_SUPPORT //\n\nVOID    WscEAPOLStartAction(\n    IN  PRTMP_ADAPTER    pAd, \n    IN  MLME_QUEUE_ELEM  *Elem);\n\nVOID    WscEAPAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM *Elem);\n\nVOID    WscEapEnrolleeAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  UCHAR\t        MsgType,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl);\n\n#ifdef CONFIG_AP_SUPPORT\nVOID    WscEapApProxyAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  UCHAR\t        MsgType,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID    WscEapRegistrarAction(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tMLME_QUEUE_ELEM\t*Elem,\n\tIN  UCHAR\t        MsgType,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN  PWSC_CTRL       pWscControl);\n\t\nVOID    WscEAPOLTimeOutAction(\n    IN  PVOID SystemSpecific1, \n    IN  PVOID FunctionContext, \n    IN  PVOID SystemSpecific2, \n    IN  PVOID SystemSpecific3);\n\nVOID    Wsc2MinsTimeOutAction(\n    IN  PVOID SystemSpecific1, \n    IN  PVOID FunctionContext, \n    IN  PVOID SystemSpecific2, \n    IN  PVOID SystemSpecific3);\n\nUCHAR\tWscRxMsgType(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPMLME_QUEUE_ELEM\tpElem);\n\nVOID\tWscInitRegistrarPair(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN  UCHAR\t\t\t\tapidx);\n\nVOID\tWscSendEapReqId(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPMAC_TABLE_ENTRY\tpEntry,\n\tIN  UCHAR\t\t\t\tCurOpMode);\n\nVOID    WscSendEapolStart(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR          pBssid,\n\tIN  UCHAR\t\t\tCurOpMode);\n\nVOID\tWscSendEapRspId(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  PMAC_TABLE_ENTRY    pEntry,\n\tIN  PWSC_CTRL           pWscControl);\n\nVOID\tWscMacHeaderInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN OUT\tPHEADER_802_11\tHdr, \n\tIN\tPUCHAR \t\t\tpAddr1,\n\tIN  PUCHAR          pBSSID,\n\tIN  BOOLEAN         bFromApCli);\n\nVOID\tWscSendMessage(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter, \n\tIN  UCHAR               OpCode,\n\tIN  PUCHAR\t\t\t\tpData,\n\tIN  INT\t\t\t\t\tLen,\n\tIN  PWSC_CTRL           pWscControl,\n    IN  UCHAR               OpMode,\t/* 0: AP Mode, 1: AP Client Mode, 2: STA Mode */\n    IN  UCHAR               EapType);\n\nVOID\tWscSendEapReqAck(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter, \n\tIN\tPMAC_TABLE_ENTRY\tpEntry);\n\t\nVOID\tWscSendEapReqDone(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter, \n\tIN\tPMLME_QUEUE_ELEM\tpElem);\n\nVOID\tWscSendEapFail(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN  BOOLEAN\t\t\t\tbSendDeAuth);\n\nVOID WscM2DTimeOutAction(\n    IN  PVOID SystemSpecific1, \n    IN  PVOID FunctionContext, \n    IN  PVOID SystemSpecific2, \n    IN  PVOID SystemSpecific3);\n\nVOID WscUPnPMsgTimeOutAction(\n\tIN  PVOID SystemSpecific1, \n    IN  PVOID FunctionContext, \n    IN  PVOID SystemSpecific2, \n    IN  PVOID SystemSpecific3);\n\nint WscSendUPnPConfReqMsg(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR apIdx,\n\tIN PUCHAR ssidStr,\n\tIN PUCHAR macAddr,\n\tIN INT\t  Status,\n\tIN UINT   eventID,\n\tIN UCHAR  CurOpMode);\n\n\t\nint WscSendUPnPMessage(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tUCHAR\t\t\t\tapIdx,\n\tIN\tUSHORT\t\t\t\tmsgType,\n\tIN\tUSHORT\t\t\t\tmsgSubType,\n\tIN\tPUCHAR\t\t\t\tpData,\n\tIN\tINT\t\t\t\t\tdataLen,\n\tIN\tUINT\t\t\t\teventID,\n\tIN\tUINT\t\t\t\ttoIPAddr,\n\tIN\tPUCHAR\t\t\t\tpMACAddr,\n\tIN  UCHAR\t\t\t\tCurOpMode);\n\nVOID WscUPnPErrHandle(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PWSC_CTRL\t\tpWscControl,\n\tIN UINT \t\t\teventID);\n\nVOID    WscBuildBeaconIE(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tUCHAR b_configured,\n\tIN\tBOOLEAN b_selRegistrar,\n\tIN\tUSHORT devPwdId,\n\tIN\tUSHORT selRegCfgMethods,\n\tIN  UCHAR apidx,\n\tIN  UCHAR *pAuthorizedMACs,\n\tIN  UCHAR  \tAuthorizedMACsLen,\n\tIN  UCHAR\tCurOpMode);\n\nVOID    WscBuildProbeRespIE(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN\tUCHAR respType,\n\tIN\tUCHAR scState,\n\tIN\tBOOLEAN b_selRegistrar,\n\tIN\tUSHORT devPwdId,\n\tIN\tUSHORT selRegCfgMethods,\n\tIN  UCHAR apidx,\n\tIN  UCHAR *pAuthorizedMACs,\n\tIN  INT   AuthorizedMACsLen,\n\tIN  UCHAR\tCurOpMode);\n\n\n#ifdef CONFIG_AP_SUPPORT\nVOID WscBuildAssocRespIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  UCHAR \t\t\tApIdx,\n\tIN  UCHAR\t\t\tReason,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen);\n\nVOID\tWscSelectedRegistrar(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\tRegInfo,\n\tIN\tUINT\tlength,\n\tIN  UCHAR \tapidx);\n\nVOID    WscInformFromWPA(\n    IN  PMAC_TABLE_ENTRY    pEntry);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nVOID WscBuildProbeReqIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  UCHAR\t\t\tCurOpMode,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen);\n\nVOID WscBuildAssocReqIE(\n\tIN  PWSC_CTRL\t\tpWscControl,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpIeLen);\n\n#ifdef IWSC_SUPPORT\nVOID\tIWSC_Stop(\n\tIN  PRTMP_ADAPTER \tpAd,\n\tIN  BOOLEAN\t\t\tbSendNotification);\n\nVOID\tIWSC_T1TimerAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3);\n\nVOID\tIWSC_T2TimerAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3);\n\nVOID\tIWSC_EntryTimerAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3);\n\nVOID\tIWSC_DevQueryAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3);\n\nBOOLEAN\tIWSC_PeerEapolStart(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMAC_TABLE_ENTRY \tpEntry);\n\nVOID \tIWSC_AddSmpbcEnrollee(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR\t\t\tpPeerAddr);\n\nBOOLEAN IWSC_IpContentForCredential(\n\tIN  PRTMP_ADAPTER\tpAd);\n#endif /* IWSC_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID    WscProfileRetryTimeout(\n\tIN  PVOID SystemSpecific1,\n\tIN  PVOID FunctionContext,\n\tIN  PVOID SystemSpecific2,\n\tIN  PVOID SystemSpecific3);\n\nVOID    WscPBCTimeOutAction(\n    IN  PVOID SystemSpecific1, \n    IN  PVOID FunctionContext, \n    IN  PVOID SystemSpecific2, \n    IN  PVOID SystemSpecific3);\n\nVOID    WscScanTimeOutAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3);\n\n\nINT WscGenerateUUID(\n\tRTMP_ADAPTER\t*pAd, \n\tUCHAR \t\t\t*uuidHexStr, \n\tUCHAR \t\t\t*uuidAscStr, \n\tint \t\t\tapIdx,\n\tBOOLEAN\t\t\tbUseCurrentTime);\n\t\nVOID WscStop(\n\tIN\tPRTMP_ADAPTER\tpAd,\n#ifdef CONFIG_AP_SUPPORT\n    IN  BOOLEAN         bFromApcli,\n#endif /* CONFIG_AP_SUPPORT */\n\tIN  PWSC_CTRL       pWscControl);\n\nVOID WscInit(\n\tIN\tPRTMP_ADAPTER\tpAd,\n    IN  BOOLEAN         bFromApcli,\t\n\tIN  UCHAR       \tBssIndex);\n\nBOOLEAN\tValidateChecksum(\n\tIN UINT PIN);\n\nUINT\tWscRandomGen4digitPinCode(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nUINT WscRandomGeneratePinCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\tapidx);\n\nint BuildMessageM1(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM2(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM2D(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM3(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM4(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM5(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM6(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM7(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageM8(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageDONE(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageACK(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint BuildMessageNACK(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT\tVOID *pbuf);\n\nint ProcessMessageM1(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM2(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL\t\tpWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tIN  UCHAR\t\t\tapidx,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM2D(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM3(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM4(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM5(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM6(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM7(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL           pWscControl,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tOUT\tPWSC_REG_DATA pReg);\n\nint ProcessMessageM8(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN\tVOID *precv,\n\tIN\tINT Length,\n\tIN  PWSC_CTRL       pWscControl);\n\nUSHORT  WscGetAuthType(\n    IN  NDIS_802_11_AUTHENTICATION_MODE authType);\n\nUSHORT  WscGetEncryType(\n    IN  NDIS_802_11_WEP_STATUS encryType);\n\nNDIS_STATUS WscThreadInit(\n\tIN RTMP_ADAPTER *pAd);\n\nBOOLEAN WscThreadExit(\n\tIN RTMP_ADAPTER *pAd);\n\nint     AppendWSCTLV(\n    IN  USHORT index, \n    OUT UCHAR * obuf, \n    IN  UCHAR * ibuf, \n    IN  USHORT varlen);\n\nVOID    WscGetRegDataPIN(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  UINT            PinCode,\n    IN  PWSC_CTRL       pWscControl);\n\nVOID    WscPushPBCAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL   \tpWscControl);\n\nVOID    WscScanExec(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL   \tpWscControl);\n\nBOOLEAN WscPBCExec(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  BOOLEAN\t\t\tbFromM2,\n\tIN  PWSC_CTRL       pWscControl);\n\nVOID    WscPBCBssTableSort(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl);\n\nVOID\tWscGenRandomKey(\n\tIN  \tPRTMP_ADAPTER\tpAd,\n\tIN  \tPWSC_CTRL       pWscControl,\n\tINOUT\tPUCHAR\t\t\tpKey,\n\tINOUT\tPUSHORT\t\t\tpKeyLen);\n\nVOID\tWscCreateProfileFromCfg(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR               OpMode,         /* 0: AP Mode, 1: AP Client Mode, 2: STA Mode */\n\tIN  PWSC_CTRL           pWscControl,\n\tOUT PWSC_PROFILE        pWscProfile); \n\nvoid    WscWriteConfToPortCfg(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PWSC_CTRL       pWscControl,\n    IN  PWSC_CREDENTIAL pCredential,\n    IN  BOOLEAN         bEnrollee);\n\n#ifdef APCLI_SUPPORT\nvoid    WscWriteConfToApCliCfg(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PWSC_CTRL       pWscControl,\n    IN  PWSC_CREDENTIAL pCredential,\n    IN  BOOLEAN         bEnrollee);\n#endif /* APCLI_SUPPORT */\n\nVOID   WpsSmProcess(\n    IN PRTMP_ADAPTER        pAd,\n    IN MLME_QUEUE_ELEM \t   *Elem);\n\nVOID WscPBCSessionOverlapCheck(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID WscPBC_DPID_FromSTA(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPUCHAR\t\t\t\tpMacAddr);\n\n#ifdef CONFIG_AP_SUPPORT\nINT\tWscGetConfWithoutTrigger(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL       pWscControl,\n\tIN  BOOLEAN         bFromUPnP);\n\nBOOLEAN\tWscReadProfileFromUfdFile(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR               ApIdx,\n\tIN  PSTRING\t\t\t\tpUfdFileName);\n\nBOOLEAN\tWscWriteProfileToUfdFile(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR               ApIdx,\n\tIN  PSTRING\t\t\t\tpUfdFileName);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID WscCheckWpsIeFromWpsAP(\n    IN  PRTMP_ADAPTER \tpAd, \n    IN  PEID_STRUCT\t\tpEid,\n    OUT PUSHORT\t\t\tpDPIDFromAP);\n\n#ifdef CONFIG_STA_SUPPORT\nVOID PeerProbeRespAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nULONG WscSearchWpsApBySSID(\n\tIN  PRTMP_ADAPTER \tpAd, \n\tIN PUCHAR\t \t\tpSsid,\n\tIN UCHAR\t \t\tSsidLen,\n\tIN INT\t\t \t\tWscMode);\n#endif /* CONFIG_STA_SUPPORT */\n\n/* WSC hardware push button function 0811 */\nVOID WSC_HDR_BTN_Init(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID WSC_HDR_BTN_Stop(\n\tIN\tPRTMP_ADAPTER\tpAd);\n \nVOID WSC_HDR_BTN_CheckHandler(\n\tIN\tPRTMP_ADAPTER\tpAd);\n#ifdef WSC_LED_SUPPORT\nBOOLEAN WscSupportWPSLEDMode(\n\tIN PRTMP_ADAPTER pAdapter);\n\nBOOLEAN WscSupportWPSLEDMode10(\n\tIN PRTMP_ADAPTER pAdapter);\n\nBOOLEAN WscAPHasSecuritySetting(\n\tIN PRTMP_ADAPTER pAdapter,\n\tIN PWSC_CTRL     pWscControl);\n\nVOID WscLEDTimer(\n\tIN PVOID\tSystemSpecific1, \n\tIN PVOID\tFunctionContext, \n\tIN PVOID\tSystemSpecific2, \n\tIN PVOID\tSystemSpecific3);\n\nVOID WscSkipTurnOffLEDTimer(\n\tIN PVOID\tSystemSpecific1, \n\tIN PVOID\tFunctionContext, \n\tIN PVOID\tSystemSpecific2, \n\tIN PVOID\tSystemSpecific3);\n#endif /* WSC_LED_SUPPORT */\n\n\n\n#ifdef CONFIG_AP_SUPPORT\nVOID WscUpdatePortCfgTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3);\n#endif /* CONFIG_AP_SUPPORT */\n\nVOID\tWscCheckPeerDPID(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PFRAME_802_11 \tFr,\n\tIN  PUCHAR\t\t\teid_data,\n\tIN  INT\t\t\t\teid_len);\n\nVOID\tWscClearPeerList(\n\tIN  PLIST_HEADER\tpWscEnList);\n\nPWSC_PEER_ENTRY\tWscFindPeerEntry(\n\tIN  PLIST_HEADER\tpWscEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr);\n\nVOID\tWscDelListEntryByMAC(\n\tPLIST_HEADER\t\tpWscEnList,\n\tIN  PUCHAR\t\t\tpMacAddr);;\n\nVOID\tWscInsertPeerEntryByMAC(\n\tIN  PLIST_HEADER\tpWscEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr);\n\n#ifdef CONFIG_AP_SUPPORT\nINT WscApShowPeerList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nINT WscStaShowPeerList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID\tWscMaintainPeerList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL\t\tpWpsCtrl);\n\nVOID\tWscAssignEntryMAC(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL\t\tpWpsCtrl);\n\n#ifdef WSC_V2_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\nVOID \tWscOnOff(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  INT\t\t\t\tApIdx,\n\tIN  BOOLEAN\t\t\tbOff);\n\nVOID\tWscAddEntryToAclList(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tINT\t\t\t\tApIdx,\n\tIN  PUCHAR\t\t\tpMacAddr);\n\nVOID WscSetupLockTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3);\n\nVOID\tWscCheckPinAttackCount(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PWSC_CTRL\t\tpWscControl);\n#endif /* CONFIG_AP_SUPPORT */\n\nBOOLEAN\tWscGenV2Msg(\n\tIN  PWSC_CTRL\t\tpWpsCtrl,\n\tIN  BOOLEAN\t\t\tbSelRegistrar,\n\tIN\tPUCHAR\t\t\tpAuthorizedMACs,\n\tIN  INT   \t\t\tAuthorizedMACsLen,\n\tOUT\tUCHAR\t\t\t**pOutBuf,\n\tOUT\tINT\t\t\t\t*pOutBufLen);\n\nBOOLEAN\tWscParseV2SubItem(\n\tIN\tUCHAR\t\t\tSubID,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tDataLen,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUCHAR\t\t\tpOutBufLen);\n\nVOID\tWscSendEapFragAck(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL\t\t\tpWscControl,\n\tIN\tPMAC_TABLE_ENTRY\tpEntry);\n\nVOID\tWscSendEapFragData(\n\tIN\tPRTMP_ADAPTER\t\tpAdapter,\n\tIN  PWSC_CTRL\t\t\tpWscControl,\n\tIN\tPMAC_TABLE_ENTRY\tpEntry);\n#endif /* WSC_V2_SUPPORT */\n\nBOOLEAN WscGetDataFromPeerByTag(\n    IN  PRTMP_ADAPTER \tpAd, \n    IN  PUCHAR\t\t\tpIeData,\n    IN  INT\t\t\t\tIeDataLen,\n    IN  USHORT\t\t\tWscTag,\n    OUT PUCHAR\t\t\tpWscBuf,\n    OUT PUSHORT\t\t\tpWscBufLen);\n\n#endif /* WSC_INCLUDED */\n\n\n\n\nBOOLEAN rtstrmactohex(\n\tIN PSTRING s1,\n\tIN PSTRING s2);\n\nBOOLEAN rtstrcasecmp(\n\tIN PSTRING s1,\n\tIN PSTRING s2);\n\nPSTRING rtstrstruncasecmp(\n\tIN PSTRING s1,\n\tIN PSTRING s2);\n\nPSTRING rtstrstr(\n\tIN\tconst PSTRING s1,\n\tIN\tconst PSTRING s2);\n\nPSTRING rstrtok(\n\tIN PSTRING s,\n\tIN const PSTRING ct);\n\t\nint rtinet_aton(\n\tconst PSTRING cp, \n\tunsigned int *addr);\n\t\n/*//////// common ioctl functions ////////*/\nINT Set_DriverVersion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_CountryRegion_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_CountryRegionABand_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_WirelessMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_MBSS_WirelessMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_Channel_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\nINT\tSet_ShortSlot_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_TxPower_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT Set_BGProtection_Proc(\n\tIN  PRTMP_ADAPTER\t\tpAd, \n\tIN  PSTRING\t\t\targ);\n\nINT Set_TxPreamble_Proc(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  PSTRING\t\t\targ);\n\nINT Set_RTSThreshold_Proc(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  PSTRING\t\t\targ);\n\nINT Set_FragThreshold_Proc(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  PSTRING\t\t\targ);\n\nINT Set_TxBurst_Proc(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  PSTRING\t\t\targ);\n\n\n#ifdef AGGREGATION_SUPPORT\nINT\tSet_PktAggregate_Proc(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  PSTRING\t\t\targ);\n#endif /* AGGREGATION_SUPPORT */\n\n#ifdef INF_PPA_SUPPORT\nINT\tSet_INF_AMAZON_SE_PPA_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPUCHAR\t\t\targ);\n\nINT ifx_ra_start_xmit (\n\tIN\tstruct net_device *rx_dev, \n\tIN\tstruct net_device *tx_dev,\n\tIN\tstruct sk_buff *skb,\n\tIN\tint len);\n#endif /* INF_PPA_SUPPORT */\n\nINT\tSet_IEEE80211H_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_ExtCountryCode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  PSTRING          arg);\n\nINT Set_ExtDfsType_Proc(\n    IN      PRTMP_ADAPTER   pAd,\n    IN      PSTRING         arg);\n\nINT Set_ChannelListAdd_Proc(\n    IN      PRTMP_ADAPTER   pAd,\n    IN      PSTRING         arg);\n\nINT Set_ChannelListShow_Proc(\n    IN      PRTMP_ADAPTER\tpAd,\n    IN      PSTRING\t\t\targ);\nINT Set_ChannelListDel_Proc(\n    IN      PRTMP_ADAPTER\tpAd,\n    IN      PSTRING\t\t\targ);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef DBG\nINT\tSet_Debug_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_DebugFunc_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg);\n#endif\n\n#ifdef TXBF_SUPPORT\nINT\tSet_ReadITxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ReadETxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WriteITxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WriteETxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_StatITxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_StatETxBf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_TxBfTag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ITxBfTimeout_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT Set_ETxBfTimeout_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT\tSet_InvTxBfTag_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ITxBfCal_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ITxBfDivCal_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ITxBfLnaCal_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ETxBfEnCond_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ETxBfCodebook_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT Set_ETxBfCoefficient_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT Set_ETxBfGrouping_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT Set_ETxBfNoncompress_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\nINT Set_ETxBfIncapable_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING          arg);\n\nINT\tSet_NoSndgCntThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_NdpSndgStreams_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_Trigger_Sounding_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ITxBfEn_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#endif /* TXBF_SUPPORT */\n\nINT Set_RateAdaptInterval(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING arg);\n\n\n#ifdef PRE_ANT_SWITCH\nINT Set_PreAntSwitch_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\nINT Set_PreAntSwitchRSSI_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg);\n\nINT Set_PreAntSwitchTimeout_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg);\n\n#endif /* PRE_ANT_SWITCH */\n\n\n#ifdef CFO_TRACK\nINT Set_CFOTrack_Proc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  PSTRING         arg);\n\n#ifdef CFO_TRACK\n#ifdef CONFIG_AP_SUPPORT\nINT rtmp_cfo_track(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, INT lastClient);\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* CFO_TRACK */\n\n#endif // CFO_TRACK //\n\n#ifdef DBG_CTRL_SUPPORT\nINT Set_DebugFlags_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n\n#ifdef INCLUDE_DEBUG_QUEUE\nINT Set_DebugQueue_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\nvoid dbQueueEnqueue(\n\tIN UCHAR type,\n\tIN UCHAR *data);\n\nvoid dbQueueEnqueueTxFrame(\n\tIN UCHAR *pTxWI,\n\tIN UCHAR *pHeader_802_11);\n\nvoid dbQueueEnqueueRxFrame(\n\tIN UCHAR *pRxWI,\n\tIN UCHAR *pHeader_802_11,\n\tIN ULONG flags);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\nINT\tShow_DescInfo_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tShow_MacTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT show_devinfo_proc(RTMP_ADAPTER *pAd, PSTRING arg);\n\n\nINT\tSet_ResetStatCounter_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT11_N_SUPPORT\nINT\tSet_BASetup_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BADecline_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BAOriTearDown_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BARecTearDown_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtBw_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtMcs_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtGi_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtOpMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtStbc_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtHtc_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtExtcha_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtMpduDensity_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtBaWinSize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtRdg_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtLinkAdapt_Proc(\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtAmsdu_Proc(\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\t\nINT\tSet_HtAutoBa_Proc(\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\t\t\t\t\t\nINT\tSet_HtProtect_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtMimoPs_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\n#ifdef DOT11N_DRAFT3\nINT Set_HT_BssCoex_Proc(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPSTRING\t\t\t\tpParam);\n\nINT Set_HT_BssCoexApCntThr_Proc(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPSTRING\t\t\t\tpParam);\n#endif /* DOT11N_DRAFT3 */\n\n\n#ifdef CONFIG_AP_SUPPORT\nINT\tSet_HtTxStream_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtRxStream_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#ifdef DOT11_N_SUPPORT\n#ifdef GREENAP_SUPPORT\nINT\tSet_GreenAP_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* GREENAP_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\nINT\tSet_ForceShortGI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_ForceGF_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSetCommonHT(RTMP_ADAPTER *pAd);\n\nINT\tSet_SendPSMPAction_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nvoid convert_reordering_packet_to_preAMSDU_or_802_3_packet(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN  UCHAR\t\t\tFromWhichBSSID);\n\nINT\tSet_HtMIMOPSmode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\nINT\tSet_HtTxBASize_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_HtDisallowTKIP_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_BurstMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef DOT11_VHT_AC\nINT\tSet_VhtBw_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg);\n\nINT\tSet_VhtStbc_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg);\n#endif /* DOT11_VHT_AC */\n\n\n#ifdef APCLI_SUPPORT\nINT RTMPIoctlConnStatus(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n#endif /*APCLI_SUPPORT*/\n\n\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID RTMPSendDLSTearDownFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpDA);\n\n#ifdef DOT11_N_SUPPORT\nVOID QueryBATABLE(\n\tIN  PRTMP_ADAPTER pAd,\n\tOUT PQUERYBA_TABLE pBAT);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\nINT\t    WpaCheckEapCode(\n\tIN  PRTMP_ADAPTER   \tpAd,\n\tIN  PUCHAR\t\t\t\tpFrame,\n\tIN  USHORT\t\t\t\tFrameLen,\n\tIN  USHORT\t\t\t\tOffSet);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nVOID detect_wmm_traffic(\n\tIN RTMP_ADAPTER\t*pAd, \n\tIN UCHAR up,\n\tIN UCHAR bOutput);\n\nVOID dynamic_tune_be_tx_op(\n\tIN RTMP_ADAPTER *pAd,\n\tIN ULONG nonBEpackets);\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef DOT11_N_SUPPORT\nVOID Handle_BSS_Width_Trigger_Events(RTMP_ADAPTER *pAd);\n\nvoid build_ext_channel_switch_ie(\n\tIN RTMP_ADAPTER *pAd,\n\tIN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);\n\nvoid assoc_ht_info_debugshow(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN UCHAR ht_cap_len,\n\tIN HT_CAPABILITY_IE *pHTCapability);\n#endif /* DOT11_N_SUPPORT */\n\nBOOLEAN APRxDoneInterruptHandle(RTMP_ADAPTER *pAd);\nBOOLEAN STARxDoneInterruptHandle(RTMP_ADAPTER *pAd, BOOLEAN argc);\nBOOLEAN RxDoneInterruptHandle(RTMP_ADAPTER *pAd);\n\nNTSTATUS StopDmaRx(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Level);\nNTSTATUS StopDmaTx(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR Level);\n\n#ifdef DOT11_N_SUPPORT\n/* AMPDU packet indication */\nVOID Indicate_AMPDU_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\n#ifdef HDR_TRANS_SUPPORT\nVOID Indicate_AMPDU_Packet_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n#endif /* HDR_TRANS_SUPPORT */\n\n/* AMSDU packet indication */\nVOID Indicate_AMSDU_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nVOID BaReOrderingBufferMaintain(\n    IN PRTMP_ADAPTER pAd);\n#endif /* DOT11_N_SUPPORT */\n\n/* Normal legacy Rx packet indication */\nVOID Indicate_Legacy_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\n#ifdef HDR_TRANS_SUPPORT\nVOID Indicate_Legacy_Packet_Hdr_Trns(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n#endif /* HDR_TRANS_SUPPORT */\n\nVOID Indicate_EAPOL_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nUINT deaggregate_AMSDU_announce(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tPNDIS_PACKET\t\tpPacket,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tULONG\t\t\tDataSize,\n\tIN\tUCHAR\t\t\tOpMode);\n\n#ifdef TXBF_SUPPORT\nBOOLEAN clientSupportsETxBF(RTMP_ADAPTER *pAd, HT_BF_CAP *pTxBFCap);\nvoid setETxBFCap(RTMP_ADAPTER *pAd, HT_BF_CAP *pTxBFCap);\n\n#ifdef ETXBF_EN_COND3_SUPPORT\nVOID txSndgSameMcs(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY * pEnt, UCHAR smoothMfb);\nVOID txSndgOtherGroup(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry);\nVOID txMrqInvTxBF(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry);\nVOID chooseBestMethod(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, UCHAR mfb);\nVOID rxBestSndg(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry);\n#endif /* ETXBF_EN_COND3_SUPPORT */\n\nVOID handleBfFb(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk);\n\nVOID TxBFInit(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN MAC_TABLE_ENTRY\t*pEntry,\n\tIN BOOLEAN\t\t\tsupportsETxBF);\n\nVOID eTxBFProbing(\n \tIN PRTMP_ADAPTER \tpAd,\n\tIN MAC_TABLE_ENTRY\t*pEntry);\n\nVOID Trigger_Sounding_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tSndgType,\n\tIN\tUCHAR\t\t\tSndgBW,\n\tIN\tUCHAR\t\t\tSndgMcs,\n\tIN  MAC_TABLE_ENTRY *pEntry);\n\nVOID rtmp_asic_set_bf(\n\tIN RTMP_ADAPTER *pAd);\n\nBOOLEAN rtmp_chk_itxbf_calibration(\n\tIN RTMP_ADAPTER *pAd);\n\n#endif /* TXBF_SUPPORT */\n\nBOOLEAN CmdRspEventCallbackHandle(PRTMP_ADAPTER pAd, PUCHAR pRspBuffer);\t\n\n#ifdef CONFIG_AP_SUPPORT\n/* remove LLC and get 802_3 Header */\n#define  RTMP_AP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA;                                 \t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (RX_BLK_TEST_FLAG(_pRxBlk, fRX_WDS) || RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH)) \t\t\\\n\t{                                                                           \t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pDA = _pRxBlk->pHeader->Addr3;                                         \t\t\t\t\t\t\t\\\n\t\t_pSA = (PUCHAR)_pRxBlk->pHeader + sizeof(HEADER_802_11);                \t\t\t\t\t\\\n\t}                                                                           \t\t\t\t\t\t\t\t\t\t\t\\\n\telse if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_APCLI))\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pDA = _pRxBlk->pHeader->Addr1; \t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pSA = _pRxBlk->pHeader->Addr3;\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\telse                                                                        \t\t\t\t\t\t\t\t\t\t\\\n\t{                                                                           \t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_pDA = _pRxBlk->pHeader->Addr3;                                         \t\t\t\t\t\t\t\\\n\t\t_pSA = _pRxBlk->pHeader->Addr2;                                         \t\t\t\t\t\t\t\\\n\t}                                                                           \t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tCONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData, \t\t\t\t\t\t\\\n\t\t_pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \t\t\t\t\t\t\\\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n/* remove LLC and get 802_3 Header */\n#define  RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3)\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA;                                 \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (RX_BLK_TEST_FLAG(_pRxBlk, fRX_WDS) || RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH)) \\\n\t{                                                                           \\\n\t\t_pDA = _pRxBlk->pHeader->Addr3;                                         \\\n\t\t_pSA = (PUCHAR)_pRxBlk->pHeader + sizeof(HEADER_802_11);                \\\n\t}                                                                           \\\n\telse                                                                        \\\n\t{                                                                           \\\n\t\tif (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA))                              \t\\\n\t\t{                                                                       \\\n\t\t\t_pDA = _pRxBlk->pHeader->Addr1;                                     \\\n\t\tif (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS))\t\t\t\t\t\t\t\t\t\\\n\t\t\t_pSA = _pRxBlk->pHeader->Addr2;\t\t\t\t\t\t\t\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_pSA = _pRxBlk->pHeader->Addr3;                                     \\\n\t\t}                                                                       \\\n\t\telse                                                                    \\\n\t\t{                                                                       \\\n\t\t\t_pDA = _pRxBlk->pHeader->Addr1;                                     \\\n\t\t\t_pSA = _pRxBlk->pHeader->Addr2;                                     \\\n\t\t}                                                                       \\\n\t}                                                                           \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tCONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData, \t\t\t\t\\\n\t\t_pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \\\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nBOOLEAN APFowardWirelessStaToWirelessSta(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tULONG\t\t\tFromWhichBSSID);\n\nVOID Announce_or_Forward_802_3_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\nVOID Sta_Announce_or_Forward_802_3_Packet(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNDIS_PACKET\tpPacket,\n\tIN\tUCHAR\t\t\tFromWhichBSSID);\n\n#ifdef CONFIG_AP_SUPPORT\n#define AP_ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\\\n\t\t\tAnnounce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\\\n\t\t\tSta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);\n\t\t\t/*announce_802_3_packet(_pAd, _pPacket); */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n\n/* Normal, AMPDU or AMSDU */\nVOID CmmRxnonRalinkFrameIndicate(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID);\n\n#ifdef HDR_TRANS_SUPPORT\nVOID CmmRxnonRalinkFrameIndicate_Hdr_Trns(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID);\n#endif /* HDR_TRANS_SUPPORT */\n\nVOID CmmRxRalinkFrameIndicate(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID);\n\nVOID Update_Rssi_Sample(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RSSI_SAMPLE *pRssi,\n\tIN RXWI_STRUC *pRxWI);\n\nPNDIS_PACKET GetPacketFromRxRing(\n\tIN RTMP_ADAPTER *pAd,\n\tOUT RX_BLK *pRxBlk,\n\tOUT BOOLEAN\t *pbReschedule,\n\tINOUT UINT32 *pRxPending);\n\nPNDIS_PACKET RTMPDeFragmentDataFrame(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk);\n\n/*////////////////////////////////////*/\n\n#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)\nVOID RTMPIoctlGetSiteSurvey(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT *wrq);\n#endif\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\nINT Set_ApCli_AuthMode_Proc(\n    IN PRTMP_ADAPTER pAd, \n    IN PSTRING arg);\n\nINT Set_ApCli_EncrypType_Proc(\n    IN PRTMP_ADAPTER pAd, \n    IN PSTRING arg);\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef MAT_SUPPORT\n\nVOID getIPv6MacTbInfo(MAT_STRUCT *, char *, ULONG);\n\nVOID getIPMacTbInfo(\n\tIN MAT_STRUCT *pMatCfg, \n\tIN char *pOutBuf,\n\tIN ULONG BufLen);\n\nNDIS_STATUS MATEngineInit(\n\tIN RTMP_ADAPTER *pAd);\n\nNDIS_STATUS MATEngineExit(\n\tIN RTMP_ADAPTER *pAd);\n\nPUCHAR MATEngineRxHandle(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNDIS_PACKET\t\tpPkt,\n\tIN UINT\t\t\t\tinfIdx);\n\n\nPUCHAR MATEngineTxHandle(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PNDIS_PACKET     pPkt,\n\tIN UINT\t\t\t\tinfIdx,\n\tIN UCHAR                  OpMode);\n\nBOOLEAN MATPktRxNeedConvert(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN PNET_DEV\t\t\tnet_dev);\n\n#endif /* MAT_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\ntypedef struct CountryCodeToCountryRegion {\n\tUSHORT\t\tCountryNum;\n\tUCHAR\t\tIsoName[3];\n\t/*UCHAR\t\tCountryName[40]; */\n\tPSTRING\t\tpCountryName;\n\tBOOLEAN\t\tSupportABand;\n\t/*ULONG\t\tRegDomainNum11A; */\n\tUCHAR\t\tRegDomainNum11A;\n\tBOOLEAN  \tSupportGBand;\n\t/*ULONG\t\tRegDomainNum11G; */\n\tUCHAR\t\tRegDomainNum11G;\n} COUNTRY_CODE_TO_COUNTRY_REGION;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef SNMP_SUPPORT\n/*for snmp */\ntypedef struct _DefaultKeyIdxValue\n{\n\tUCHAR\tKeyIdx;\n\tUCHAR\tValue[16];\n} DefaultKeyIdxValue, *PDefaultKeyIdxValue;\n#endif\n\n\n#ifdef CONFIG_STA_SUPPORT\n\n/* The radio capture header precedes the 802.11 header. */\ntypedef struct GNU_PACKED _ieee80211_radiotap_header {\n    UINT8\tit_version;\t/* Version 0. Only increases\n\t\t\t\t * for drastic changes,\n\t\t\t\t * introduction of compatible\n\t\t\t\t * new fields does not count.\n\t\t\t\t */\n    UINT8\tit_pad;\n    UINT16     it_len;         /* length of the whole\n\t\t\t\t * header in bytes, including\n\t\t\t\t * it_version, it_pad,\n\t\t\t\t * it_len, and data fields.\n\t\t\t\t */\n    UINT32   it_present;\t/* A bitmap telling which\n\t\t\t\t\t * fields are present. Set bit 31\n\t\t\t\t\t * (0x80000000) to extend the\n\t\t\t\t\t * bitmap by another 32 bits.\n\t\t\t\t\t * Additional extensions are made\n\t\t\t\t\t * by setting bit 31.\n\t\t\t\t\t */\n}ieee80211_radiotap_header ;\n\nenum ieee80211_radiotap_type {\n    IEEE80211_RADIOTAP_TSFT = 0,\n    IEEE80211_RADIOTAP_FLAGS = 1,\n    IEEE80211_RADIOTAP_RATE = 2,\n    IEEE80211_RADIOTAP_CHANNEL = 3,\n    IEEE80211_RADIOTAP_FHSS = 4,\n    IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,\n    IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,\n    IEEE80211_RADIOTAP_LOCK_QUALITY = 7,\n    IEEE80211_RADIOTAP_TX_ATTENUATION = 8,\n    IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,\n    IEEE80211_RADIOTAP_DBM_TX_POWER = 10,\n    IEEE80211_RADIOTAP_ANTENNA = 11,\n    IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,\n    IEEE80211_RADIOTAP_DB_ANTNOISE = 13\n};\n\n#define WLAN_RADIOTAP_PRESENT (\t\t\t\\\n\t(1 << IEEE80211_RADIOTAP_TSFT)\t|\t\\\n\t(1 << IEEE80211_RADIOTAP_FLAGS) |\t\\\n\t(1 << IEEE80211_RADIOTAP_RATE)  | \t\\\n\t 0)\n\ntypedef struct _wlan_radiotap_header {\n\tieee80211_radiotap_header wt_ihdr;\n\tINT64 wt_tsft;\n\tUINT8 wt_flags;\t\n\tUINT8 wt_rate;\n} wlan_radiotap_header;\n/* Definition from madwifi */\n\n\nvoid STA_MonPktSend(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRX_BLK\t\t\t*pRxBlk);\n\nVOID    RTMPSetDesiredRates(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  LONG            Rates);\n\n#ifdef XLINK_SUPPORT\nINT Set_XlinkMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n#endif /* XLINK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\nINT\tSet_FixedTxMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\nINT\tSet_OpMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\nINT Set_LongRetryLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ShortRetryLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_AutoFallBack_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\n\nVOID RT28XXDMADisable(\n\tIN RTMP_ADAPTER \t\t*pAd);\n\nVOID RT28XXDMAEnable(\n\tIN RTMP_ADAPTER \t\t*pAd);\n\t\nVOID RT28xx_UpdateBeaconToAsic(\n\tIN RTMP_ADAPTER * pAd, \n\tIN INT apidx,\n\tIN ULONG BeaconLen,\n\tIN ULONG UpdatePos);\n\nvoid CfgInitHook(PRTMP_ADAPTER pAd);\n\n\nNDIS_STATUS RtmpNetTaskInit(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID RtmpNetTaskExit(\n\tIN PRTMP_ADAPTER pAd);\n\nNDIS_STATUS RtmpMgmtTaskInit(\n\tIN RTMP_ADAPTER *pAd);\n\t\nVOID RtmpMgmtTaskExit(\n\tIN RTMP_ADAPTER *pAd);\n\nvoid tbtt_tasklet(unsigned long data);\n\n\n\t\n\t\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CREDENTIAL_STORE\nNDIS_STATUS RecoverConnectInfo(\n\tIN  RTMP_ADAPTER *pAd);\n\nNDIS_STATUS StoreConnectInfo(\n\tIN  RTMP_ADAPTER *pAd);\n#endif /* CREDENTIAL_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\nVOID AsicTurnOffRFClk(\n\tIN PRTMP_ADAPTER    pAd, \n\tIN\tUCHAR           Channel);\n\n\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\nINT RtmpTimerQThread(\n\tIN ULONG Context);\n\nRTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RALINK_TIMER_STRUCT *pTimer);\n\nBOOLEAN RtmpTimerQRemove(\n\tIN RTMP_ADAPTER *pAd, \n\tIN RALINK_TIMER_STRUCT *pTimer);\n\nvoid RtmpTimerQExit(\n\tIN RTMP_ADAPTER *pAd);\n\nvoid RtmpTimerQInit(\n\tIN RTMP_ADAPTER *pAd);\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\n\n#ifdef RTMP_MAC_USB\n\nNTSTATUS RTUSBMultiRead(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength);\n\nNTSTATUS RTUSBMultiWrite(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength,\n\tIN\tBOOLEAN\t\t\tbWriteHigh);\n\nNTSTATUS RTUSBMultiWrite_nBytes(\n        IN      PRTMP_ADAPTER   pAd,\n        IN      USHORT                  Offset,\n        IN      PUCHAR                  pData,\n        IN      USHORT                  length,\n        IN      USHORT                  batchLen);\n\nNTSTATUS RTUSBMultiWrite_OneByte(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData);\n\nNTSTATUS RTUSBReadBBPRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tId,\n\tIN\tPUCHAR\t\t\tpValue);\n\nNTSTATUS RTUSBWriteBBPRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tId,\n\tIN\tUCHAR\t\t\tValue);\n\nNTSTATUS RTUSBWriteRFRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUINT32\t\t\tValue);\n\t\nNTSTATUS RTUSB_VendorRequest(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUINT32\t\t\tTransferFlags,\n\tIN\tUCHAR\t\t\tReservedBits,\n\tIN\tUCHAR\t\t\tRequest,\n\tIN\tUSHORT\t\t\tValue,\n\tIN\tUSHORT\t\t\tIndex,\n\tIN\tPVOID\t\t\tTransferBuffer,\n\tIN\tUINT32\t\t\tTransferBufferLength);\n\nNTSTATUS RTUSBReadEEPROM(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength);\n\nNTSTATUS RTUSBWriteEEPROM(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tPUCHAR\t\t\tpData,\n\tIN\tUSHORT\t\t\tlength);\n\nVOID RTUSBPutToSleep(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nNTSTATUS RTUSBWakeUp(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nNDIS_STATUS\tRTUSBEnqueueCmdFromNdis(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tNDIS_OID\t\tOid,\n\tIN\tBOOLEAN\t\t\tSetInformation,\n\tIN\tPVOID\t\t\tpInformationBuffer,\n\tIN\tUINT32\t\t\tInformationBufferLength);\n\nVOID RTUSBDequeueCmd(\n\tIN\tPCmdQ\t\tcmdq,\n\tOUT\tPCmdQElmt\t*pcmdqelmt);\n\nINT RTUSBCmdThread(\n\tIN ULONG Context);\n\nVOID RTUSBBssBeaconExit(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID RTUSBBssBeaconStop(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID RTUSBBssBeaconStart(\n\tIN RTMP_ADAPTER * pAd);\n\nVOID RTUSBBssBeaconInit(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID RTUSBWatchDog(\n\tIN RTMP_ADAPTER *pAd);\n\t\nNTSTATUS RTUSBWriteMACRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tUINT32\t\t\tValue,\n\tIN\tBOOLEAN\t\t\tbWriteHigh);\n\nNTSTATUS RTUSBReadMACRegister(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tOUT\tPUINT32\t\t\tpValue);\n\nNTSTATUS RTUSBSingleWrite(\n\tIN \tRTMP_ADAPTER \t*pAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tUSHORT\t\t\tValue,\n\tIN\tBOOLEAN\t\t\tbWriteHigh);\n\nNTSTATUS RTUSBFirmwareWrite(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR\t\tpFwImage,\n\tIN ULONG\t\tFwLen);\n\nNTSTATUS\tRTUSBVenderReset(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nNDIS_STATUS RTUSBSetHardWareRegister(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN\tPVOID\t\t\tpBuf);\n\nNDIS_STATUS RTUSBQueryHardWareRegister(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN\tPVOID\t\t\tpBuf);\n\n/*VOID CMDHandler( */\n/*    IN PRTMP_ADAPTER pAd); */\n\nNDIS_STATUS\tRTUSBWriteHWMACAddress(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID MlmeSetPsm(\n\tIN RTMP_ADAPTER *pAd, \n\tIN USHORT psm);\n\nNDIS_STATUS RTMPWPAAddKeyProc(\n\tIN RTMP_ADAPTER *pAd,\n\tIN VOID *pBuf);\n\nVOID AsicRxAntEvalAction(\n\tIN RTMP_ADAPTER *pAd);\n\nvoid append_pkt(\n\tIN RTMP_ADAPTER *pAd, \n\tIN UCHAR *pHeader802_3,\n\tIN UINT HdrLen,\n\tIN UCHAR *pData,\n\tIN ULONG DataSize,\n\tOUT PNDIS_PACKET *ppPacket);\n\n\nVOID RTUSBMlmeHardTransmit(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MGMT_STRUC *pMgmt);\n\nINT MlmeThread(ULONG Context);\n\n\n/*\n\tFunction Prototype in rtusb_data.c\n*/\nNDIS_STATUS\tRTUSBFreeDescRequest(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR BulkOutPipeId,\n\tIN UINT32 req_cnt);\n\n\nBOOLEAN\tRTUSBNeedQueueBackForAgg(\n\tIN RTMP_ADAPTER *pAd, \n\tIN UCHAR\t\tBulkOutPipeId);\n\n\n/* Function Prototype in cmm_data_usb.c */\nUSHORT RtmpUSB_WriteSubTxResource(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tBOOLEAN\t\t\tbIsLast,\n\tOUT\tUSHORT\t\t\t*FreeNumber);\n\nUSHORT RtmpUSB_WriteSingleTxResource(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tBOOLEAN\t\t\tbIsLast,\n\tOUT\tUSHORT\t\t\t*FreeNumber);\n\nUSHORT\tRtmpUSB_WriteFragTxResource(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tUCHAR\t\t\tfragNum,\n\tOUT\tUSHORT\t\t\t*FreeNumber);\n\t\nUSHORT RtmpUSB_WriteMultiTxResource(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tUCHAR\t\t\tframeNum,\n\tOUT\tUSHORT\t\t\t*FreeNumber);\n\nVOID RtmpUSB_FinalWriteTxResource(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tUSHORT\t\t\ttotalMPDUSize,\n\tIN\tUSHORT\t\t\tTxIdx);\n\nVOID RtmpUSBDataLastTxIdx(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tQueIdx,\n\tIN\tUSHORT\t\t\tTxIdx);\n\nVOID RtmpUSBDataKickOut(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tTX_BLK\t\t\t*pTxBlk,\n\tIN\tUCHAR\t\t\tQueIdx);\n\nint RtmpUSBMgmtKickOut(\n\tIN RTMP_ADAPTER \t*pAd, \n\tIN UCHAR \t\t\tQueIdx,\n\tIN PNDIS_PACKET\t\tpPacket,\n\tIN PUCHAR\t\t\tpSrcBufVA,\n\tIN UINT \t\t\tSrcBufLen);\n\nVOID RtmpUSBNullFrameKickOut(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR\t\tQueIdx,\n\tIN UCHAR\t\t*pNullFrame,\n\tIN UINT32\t\tframeLen);\n\t\nVOID RtmpUsbStaAsicForceWakeupTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID RT28xxUsbStaAsicForceWakeup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN       bFromTx);\n\nVOID RT28xxUsbStaAsicSleepThenAutoWakeup(\n\tIN PRTMP_ADAPTER pAd, \n\tIN USHORT TbttNumToNextWakeUp);\n\nVOID RT28xxUsbMlmeRadioOn(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RT28xxUsbMlmeRadioOFF(\n\tIN PRTMP_ADAPTER pAd);\nVOID RT28xxUsbAsicRadioOff(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RT28xxUsbAsicRadioOn(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN AsicCheckCommandOk(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t\t Command);\n\nVOID RT28xxUsbAsicWOWEnable(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID RT28xxUsbAsicWOWDisable(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /* RTMP_MAC_USB */\n\n#ifdef NEW_WOW_SUPPORT\nVOID RT28xxAndesWOWEnable(\n    IN PRTMP_ADAPTER pAd);\nVOID RT28xxAndesWOWDisable(\n    IN PRTMP_ADAPTER pAd);\n#endif /* NEW_WOW_SUPPORT */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\nVOID RT28xxAsicWOWEnable(\n    IN PRTMP_ADAPTER pAd);\n\nVOID RT28xxAsicWOWDisable(\n    IN PRTMP_ADAPTER pAd);\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\nNDIS_STATUS RTMPCheckRxError(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PHEADER_802_11 pHeader,\n\tIN RXWI_STRUC *pRxWI,\n\tIN RXINFO_STRUC *pRxInfo);\n\n\n/*////////////////////////////////////*/\n\n#ifdef AP_QLOAD_SUPPORT\nVOID QBSS_LoadInit(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\nVOID QBSS_LoadAlarmReset(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\nVOID QBSS_LoadAlarmResume(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\nUINT32 QBSS_LoadBusyTimeGet(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\nBOOLEAN QBSS_LoadIsAlarmIssued(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\nBOOLEAN QBSS_LoadIsBusyTimeAccepted(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tUINT32\t\t\tBusyTime);\n\nUINT32 QBSS_LoadElementAppend(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tOUT\t\tUINT8\t\t\t*buf_p);\n\nUINT32 QBSS_LoadElementParse(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tUINT8\t\t\t*pElement,\n\tOUT\t\tUINT16\t\t\t*pStationCount,\n\tOUT\t\tUINT8\t\t\t*pChanUtil,\n\tOUT\t\tUINT16\t\t\t*pAvalAdmCap);\n\nVOID QBSS_LoadUpdate(\n \tIN\t\tRTMP_ADAPTER\t*pAd,\n\tIN\t\tULONG\t\t\tUpTime);\n\nVOID QBSS_LoadStatusClear(\n \tIN\t\tRTMP_ADAPTER\t*pAd);\n\nINT\tShow_QoSLoad_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n#endif /* AP_QLOAD_SUPPORT */\n\n/*///////////////////////////////////*/\nINT RTMPShowCfgValue(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tpName,\n\tIN\tPSTRING\t\t\tpBuf,\n\tIN\tUINT32\t\t\tMaxLen);\n\nPSTRING RTMPGetRalinkAuthModeStr(\n    IN  NDIS_802_11_AUTHENTICATION_MODE authMode);\n\nPSTRING RTMPGetRalinkEncryModeStr(\n    IN  USHORT encryMode);\n/*//////////////////////////////////*/\n\n#ifdef CONFIG_STA_SUPPORT\nVOID AsicStaBbpTuning(\n\tIN PRTMP_ADAPTER pAd);\n\nBOOLEAN StaAddMacTableEntry(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  PMAC_TABLE_ENTRY\tpEntry,\n\tIN  UCHAR\t\t\t\tMaxSupportedRateIn500Kbps,\n\tIN  HT_CAPABILITY_IE\t*pHtCapability,\n\tIN  UCHAR\t\t\t\tHtCapabilityLen,\n\tIN  ADD_HT_INFO_IE\t\t*pAddHtInfo,\n\tIN  UCHAR\t\t\t\tAddHtInfoLen,\n\tIN IE_LISTS *ie_list,\n\tIN  USHORT        \t\tCapabilityInfo);\n\n\nBOOLEAN\tAUTH_ReqSend(\n\tIN  PRTMP_ADAPTER \t\tpAd,\n\tIN  PMLME_QUEUE_ELEM\tpElem,\n\tIN  PRALINK_TIMER_STRUCT pAuthTimer,\n\tIN  PSTRING\t\t\t\tpSMName,\n\tIN  USHORT\t\t\t\tSeqNo,\n\tIN  PUCHAR\t\t\t\tpNewElement,\n\tIN  ULONG\t\t\t\tElementLen);\n#endif /* CONFIG_STA_SUPPORT */ \n\n\nVOID ReSyncBeaconTime(RTMP_ADAPTER *pAd);\nVOID RTMPSetAGCInitValue(RTMP_ADAPTER *pAd, UCHAR BandWidth);\n\n#ifdef TXBF_SUPPORT\nVOID handleHtcField(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk);\n#endif /* TXBF_SUPPORT */\n\n#ifdef MFB_SUPPORT\nVOID MFB_PerPareMRQ(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tVOID* pBuf,\n\tIN\tPMAC_TABLE_ENTRY pEntry);\n\nVOID MFB_PerPareMFB(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tVOID* pBuf,\n\tIN\tPMAC_TABLE_ENTRY pEntry);\n#endif /* MFB_SUPPORT */\n\n#define VIRTUAL_IF_INC(__pAd) ((__pAd)->VirtualIfCnt++)\n#define VIRTUAL_IF_DEC(__pAd) ((__pAd)->VirtualIfCnt--)\n#define VIRTUAL_IF_NUM(__pAd) ((__pAd)->VirtualIfCnt)\n\n\n\n#ifdef RTMP_USB_SUPPORT\n/*\n * Function Prototype in rtusb_bulk.c\n */\n \n#ifdef INF_AMAZON_SE\nVOID SoftwareFlowControl(\n\tIN PRTMP_ADAPTER pAd) ;\n#endif /* INF_AMAZON_SE */\n\n\nVOID\tRTUSBInitTxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPTX_CONTEXT\t\tpTxContext,\n\tIN\tUCHAR\t\t\tBulkOutPipeId,\n\tIN\tusb_complete_t\tFunc);\n\nVOID\tRTUSBInitHTTxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPHT_TX_CONTEXT\tpTxContext,\n\tIN\tUCHAR\t\t\tBulkOutPipeId,\n\tIN\tULONG\t\t\tBulkOutSize,\n\tIN\tusb_complete_t\tFunc);\n\nVOID\tRTUSBInitRxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPRX_CONTEXT\t\tpRxContext);\n\nVOID RTUSBCleanUpDataBulkOutQueue(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBCancelPendingBulkOutIRP(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBBulkOutDataPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tBulkOutPipeId,\n\tIN\tUCHAR\t\t\tIndex);\n\nVOID RTUSBBulkOutNullFrame(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBBulkOutRTSFrame(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBCancelPendingBulkInIRP(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBCancelPendingIRPs(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBBulkOutMLMEPacket(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tIndex);\n\nVOID RTUSBBulkOutPsPoll(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBCleanUpMLMEBulkOutQueue(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBKickBulkOut(\n\tIN\tPRTMP_ADAPTER pAd);\n\nVOID\tRTUSBBulkReceive(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID RTUSBBulkCmdRspEventReceive(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID DoBulkIn(\n\tIN RTMP_ADAPTER *pAd);\n\nVOID RTUSBInitRxDesc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PRX_CONTEXT\t\tpRxContext);\n\nVOID RTUSBBulkRxHandle(\n\tIN unsigned long data);\t\n#endif /* RTMP_USB_SUPPORT */\n\n\n#ifdef SOFT_ENCRYPT\nBOOLEAN RTMPExpandPacketForSwEncrypt(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tPTX_BLK\t\t\tpTxBlk);\n\nVOID RTMPUpdateSwCacheCipherInfo(\t\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tPTX_BLK\t\t\tpTxBlk,\n\tIN\tPUCHAR\t\t\tpHdr);\n#endif /* SOFT_ENCRYPT */\n\n\n/*\n\tOS Related funciton prototype definitions.\n\tTODO: Maybe we need to move these function prototypes to other proper place.\n*/\n\nVOID RTInitializeCmdQ(\n\tIN\tPCmdQ\tcmdq);\n\nINT RTPCICmdThread(\n\tIN ULONG Context);\n\nVOID CMDHandler(\n    IN PRTMP_ADAPTER pAd);\n\nVOID RTThreadDequeueCmd(\n\tIN\tPCmdQ\t\tcmdq,\n\tOUT\tPCmdQElmt\t*pcmdqelmt);\n\nNDIS_STATUS RTEnqueueInternalCmd(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN NDIS_OID\t\t\tOid,\n\tIN PVOID\t\t\tpInformationBuffer,\n\tIN UINT32\t\t\tInformationBufferLength);\n\n#ifdef HOSTAPD_SUPPORT\nVOID ieee80211_notify_michael_failure(\n\tIN\tPRTMP_ADAPTER    pAd,\n\tIN\tPHEADER_802_11   pHeader,\n\tIN\tUINT            keyix,\n\tIN\tINT              report);\n\nconst CHAR* ether_sprintf(const UINT8 *mac);\n#endif/*HOSTAPD_SUPPORT*/\n\n#ifdef VENDOR_FEATURE3_SUPPORT\nVOID RTMP_IO_WRITE32(\n\tPRTMP_ADAPTER pAd,\n\tUINT32 Offset,\n\tUINT32 Value);\n\nVOID RTMP_BBP_IO_READ8_BY_REG_ID(\n\tPRTMP_ADAPTER pAd,\n\tUINT32 Offset,\n\tUINT8 *pValue);\n\nVOID RTMP_BBP_IO_READ8(\n\tPRTMP_ADAPTER pAd,\n\tUCHAR Offset,\n\tUINT8 *pValue,\n\tBOOLEAN FlgValidMCR);\n\nVOID RTMP_BBP_IO_WRITE8_BY_REG_ID(\n\tPRTMP_ADAPTER pAd,\n\tUINT32 Offset,\n\tUINT8 Value);\n\nVOID RTMP_BBP_IO_WRITE8(\n\tPRTMP_ADAPTER pAd,\n\tUCHAR Offset,\n\tUINT8 Value,\n\tBOOLEAN FlgValidMCR);\n#endif /* VENDOR_FEATURE3_SUPPORT */\n\n\nINT AsicGetMacVersion(\n\tIN RTMP_ADAPTER *pAd);\n\nINT WaitForAsicReady(\n\tIN RTMP_ADAPTER *pAd);\n\nBOOLEAN CHAN_PropertyCheck(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT32\t\t\tChanNum,\n\tIN UCHAR\t\t\tProperty);\n\n#ifdef CONFIG_STA_SUPPORT\n\n/* command */\nINT Set_SSID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n#ifdef WMM_SUPPORT\nINT\tSet_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif\n\nINT Set_NetworkType_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_AuthMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_EncrypType_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_DefaultKeyID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_Key1_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_Key2_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_Key3_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_Key4_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\nINT Set_WPAPSK_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n\nINT Set_PSMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\n#ifdef WPA_SUPPLICANT_SUPPORT\nINT Set_Wpa_Support(\n    IN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef DBG\n\nVOID RTMPIoctlMAC(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq);\n\nVOID RTMPIoctlE2PROM(\n    IN  PRTMP_ADAPTER   pAdapter,\n    IN  RTMP_IOCTL_INPUT_STRUCT *wrq);\n#endif /* DBG */\n\n#ifdef WSC_STA_SUPPORT\nINT\tSet_WscConfMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscConfStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscSsid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_WscBssid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscUUIDE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscGetConf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_WscStop_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef WSC_V2_SUPPORT\nINT Set_WscForceSetAP_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n#endif /* WSC_V2_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\nNDIS_STATUS RTMPWPANoneAddKeyProc(\n    IN  PRTMP_ADAPTER   pAd,\n    IN\tPVOID\t\t\tpBuf);\n\t\nINT Set_FragTest_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n\t\n#ifdef DOT11_N_SUPPORT\t\nINT Set_TGnWifiTest_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg);\n#endif /* DOT11_N_SUPPORT */\n\nINT Set_LongRetryLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ShortRetryLimit_Proc(\n\tIN\tPRTMP_ADAPTER\tpAdapter, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_Ieee80211dClientMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\nINT\tShow_Adhoc_MacTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\textra,\n\tIN\tUINT32\t\t\tsize);\n\n\n\nINT Set_BeaconLostTime_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\nINT Set_AutoRoaming_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\nINT Set_SiteSurvey_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_ForceTxBurst_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n\nVOID RTMPAddKey(\n\tIN\tPRTMP_ADAPTER\t    pAd, \n\tIN\tPNDIS_802_11_KEY    pKey);\n\n\nVOID StaSiteSurvey(\n\tIN\tPRTMP_ADAPTER  \t\tpAd,\n\tIN\tPNDIS_802_11_SSID\tpSsid,\n\tIN\tUCHAR\t\t\t\tScanType);\n\nVOID MaintainBssTable(\n\tIN  PRTMP_ADAPTER pAd,\n\tIN OUT\tBSS_TABLE *Tab,\n\tIN  ULONG\tMaxRxTimeDiff,\n\tIN  UCHAR\tMaxSameRxTimeCount);\n#endif /* CONFIG_STA_SUPPORT */\n\nvoid  getRate(\n    IN HTTRANSMIT_SETTING HTSetting, \n    OUT ULONG* fLastTxRxRate);\n\n\n#ifdef APCLI_SUPPORT\n#ifdef APCLI_WPA_SUPPLICANT_SUPPORT\nVOID    ApcliSendAssocIEsToWpaSupplicant( \n    IN  PRTMP_ADAPTER pAd,\n    IN UINT ifIndex);\n\nINT\t    ApcliWpaCheckEapCode(\n\tIN  PRTMP_ADAPTER   \t\tpAd,\n\tIN  PUCHAR\t\t\t\tpFrame,\n\tIN  USHORT\t\t\t\tFrameLen,\n\tIN  USHORT\t\t\t\tOffSet);\n\nVOID    ApcliWpaSendEapolStart(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR          pBssid,\n\tIN  PMAC_TABLE_ENTRY pMacEntry,\n\tIN\tPAPCLI_STRUCT pApCliEntry);\n\n\nVOID\tApCliRTMPSendNullFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tTxRate,\n\tIN\tBOOLEAN \t\tbQosNull,\n\tIN PMAC_TABLE_ENTRY pMacEntry);\n\n#endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/\n#endif/*APCLI_SUPPORT*/\n\n\nvoid RTMP_IndicateMediaState(\t\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  NDIS_MEDIA_STATE\tmedia_state);\n\n#if defined(RT3350) || defined(RT33xx)\nVOID RTMP_TxEvmCalibration(\n\tIN PRTMP_ADAPTER pAd);\n#endif /* defined(RT3350) || defined(RT33xx) */\n\nINT RTMPSetInformation(\n    IN RTMP_ADAPTER *pAd,\n    IN OUT RTMP_IOCTL_INPUT_STRUCT *rq,\n    IN INT cmd);\n\nINT RTMPQueryInformation(\n    IN RTMP_ADAPTER *pAd,\n    INOUT RTMP_IOCTL_INPUT_STRUCT *rq,\n    IN INT cmd);\n\nVOID RTMPIoctlShow(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RTMP_IOCTL_INPUT_STRUCT *rq,\n\tIN UINT32 subcmd,\n\tIN VOID *pData,\n\tIN ULONG Data);\n\nINT RTMP_COM_IoctlHandle(\n\tIN VOID *pAdSrc,\n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq,\n\tIN INT cmd,\n\tIN USHORT subcmd,\n\tIN VOID *pData,\n\tIN ULONG Data);\n\n#ifdef CONFIG_AP_SUPPORT\nINT RTMP_AP_IoctlPrepare(\n\tIN RTMP_ADAPTER *pAd,\n\tIN VOID *pCB);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\nBOOLEAN APHandleRxDonePacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET\tpRxPacket,\n\tIN RX_BLK *pRxCell);\n\nBOOLEAN STAHandleRxDonePacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET pRxPacket,\n\tIN RX_BLK *pRxCell);\n#endif /* P2P_SUPPORT */\n\nINT Set_VcoPeriod_Proc(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING arg);\n\nINT\tSet_RateAlg_Proc(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING arg);\n\n#ifdef SINGLE_SKU\nINT Set_ModuleTxpower_Proc(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING arg);\n#endif /* SINGLE_SKU */\n\nVOID RtmpEnqueueNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR        pAddr,\n\tIN UCHAR         TxRate,\n\tIN UCHAR         PID,\n\tIN UCHAR         apidx,\n    IN BOOLEAN       bQosNull,\n    IN BOOLEAN       bEOSP,\n    IN UCHAR         OldUP);\n\nVOID RtmpCleanupPsQueue(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PQUEUE_HEADER   pQueue);\n\n#ifdef CONFIG_MULTI_CHANNEL\nVOID RtmpPrepareHwNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN BOOLEAN bQosNull,\n\tIN BOOLEAN bEOSP,\n\tIN UCHAR OldUP,\n\tIN UCHAR OpMode,\n\tIN UCHAR PwrMgmt,\n\tIN BOOLEAN bWaitACK,\n\tIN CHAR Index);\n\nVOID RTMPHwSendNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR TxRate,\n\tIN BOOLEAN bQosNull,\n\tIN USHORT PwrMgmt,\n\tIN CHAR Index);\n\nVOID RtmpEnqueueLastNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr,\n\tIN UCHAR TxRate,\n\tIN UCHAR PID,\n\tIN UCHAR apidx,\n    IN BOOLEAN bQosNull,\n    IN BOOLEAN bEOSP,\n    IN UCHAR OldUP,\n    IN UCHAR PwrMgmt,\n\tIN UCHAR OpMode);\n\nVOID RtmpPrepareHwNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN BOOLEAN bQosNull,\n\tIN BOOLEAN bEOSP,\n\tIN UCHAR OldUP,\n\tIN UCHAR OpMode,\n\tIN UCHAR PwrMgmt,\n\tIN BOOLEAN bWaitACK,\n\tIN CHAR Index);\n\nVOID MCC_ChangeAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID ConcurrentP2PConnectTimeout(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\nNDIS_STATUS MultiChannelThreadInit(\n\tIN  PRTMP_ADAPTER pAd);\n\nBOOLEAN MultiChannelThreadExit(\n\tIN  PRTMP_ADAPTER pAd);\n\nVOID MultiChannelTimerStop(\n\tIN  PRTMP_ADAPTER pAd);\n\nVOID MultiChannelTimerStart(\n\tIN  PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY  *pEntry);\n\nVOID MultiChannelSwitchToRa(\n\tIN  PRTMP_ADAPTER pAd);\n\nVOID MultiChannelSwitchToP2P(\n\tIN  PRTMP_ADAPTER pAd);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\nUCHAR dot11_2_ra_rate(UCHAR MaxSupportedRateIn500Kbps);\nUCHAR dot11_max_sup_rate(INT SupRateLen, UCHAR *SupRate, INT ExtRateLen, UCHAR *ExtRate);\n\nVOID set_entry_phy_cfg(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry);\nVOID MacTableReset(RTMP_ADAPTER *pAd);\nMAC_TABLE_ENTRY *MacTableLookup(RTMP_ADAPTER *pAd, UCHAR *pAddr);\nBOOLEAN MacTableDeleteEntry(RTMP_ADAPTER *pAd, USHORT wcid, UCHAR *pAddr);\nMAC_TABLE_ENTRY *MacTableInsertEntry(\n    IN RTMP_ADAPTER *pAd,\n    IN UCHAR *pAddr,\n\tIN UCHAR apidx,\n\tIN UCHAR OpMode,\n\tIN BOOLEAN CleanAll);\n\n\n\nVOID dumpTxWI(RTMP_ADAPTER *pAd, TXWI_STRUC *pTxWI);\nVOID dump_rxwi(RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI);\nVOID dump_txinfo(RTMP_ADAPTER *pAd, TXINFO_STRUC *pTxInfo);\nVOID dump_rxinfo(RTMP_ADAPTER *pAd, RXINFO_STRUC *pRxInfo);\n#if defined(RT65xx) || defined(MT7601)\nVOID dumpRxFCEInfo(RTMP_ADAPTER *pAd, RXFCE_INFO *pRxFceInfo);\n#endif /* defined(RT65xx) || defined(MT7601) */\n\n\n\n#ifdef FPGA_MODE\nINT set_tx_kickcnt(RTMP_ADAPTER *pAd, PSTRING arg);\nINT set_data_phy_mode(RTMP_ADAPTER *pAd, PSTRING arg);\nINT set_data_bw(RTMP_ADAPTER *pAd, PSTRING arg);\nINT set_data_mcs(RTMP_ADAPTER *pAd, PSTRING arg);\nINT set_data_gi(RTMP_ADAPTER *pAd, PSTRING arg);\nINT set_data_basize(RTMP_ADAPTER *pAd, PSTRING arg);\nINT set_fpga_mode(RTMP_ADAPTER *pAd, PSTRING arg);\n#endif /* FPGA_MODE */\n\n#ifdef WFA_VHT_PF\nINT set_force_amsdu(RTMP_ADAPTER *pAd, PSTRING arg);\n#endif /* WFA_VHT_PF */\n\n\n\n#ifdef RLT_RF\nINT set_rf(RTMP_ADAPTER *pAd, PSTRING arg);\n#endif /* RLT_RF */\n\nBOOLEAN CmdRspEventHandle(RTMP_ADAPTER *pAd);\n\n\n\n#endif  /* __RTMP_H__ */\n\n"
  },
  {
    "path": "src/include/rtmp_M51.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_M51.h\n\n\tAbstract:\n\tMiniport header file for mcu related information\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifndef __RTMP_M51_H__\n#define __RTMP_M51_H__\n\nstruct _RTMP_ADAPTER;\n\nINT RtmpAsicEraseFirmware(\n\tstruct _RTMP_ADAPTER *pAd);\n\nNDIS_STATUS RtmpAsicLoadFirmware(\n\tstruct _RTMP_ADAPTER *pAd);\n\nNDIS_STATUS isMCUnotReady(\n\tstruct _RTMP_ADAPTER *pAd);\n\nNDIS_STATUS isMCUNeedToLoadFIrmware(\n\tstruct _RTMP_ADAPTER *pAd);\n\nINT RtmpAsicSendCommandToMcu(\n\tstruct _RTMP_ADAPTER *pAd,\n\tUCHAR Command,\n\tUCHAR Token,\n\tUCHAR Arg0,\n\tUCHAR Arg1,\n\tBOOLEAN FlgIsNeedLocked);\n#endif\n"
  },
  {
    "path": "src/include/rtmp_and.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_and.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifndef __RTMP_AND_H__\n#define __RTMP_AND_H__\n\n/*\n * Power opration\n */\nenum PWR_OP {\n\tRADIO_OFF = 0x30,\n\tRADIO_ON,\n\tRADIO_OFF_AUTO_WAKEUP,\n\tRADIO_OFF_ADVANCE,\n\tRADIO_ON_ADVANCE,\n};\n\n\n/*\n * Calibration ID\n */\nenum CALIBRATION_ID {\n\tR_CALIBRATION = 1,\n\tDCOC_CALIBRATION,\n};\n\n/*\n * Function set ID\n */\nenum FUN_ID {\n\tQ_SELECT = 1,\n\tATOMIC_TSSI_SETTING  = 5,\n};\n\n/*\n * Command response RX Ring selection\n */\nenum RX_RING_ID {\n\tRX_RING0,\n\tRX_RING1,\n};\n\n/*\n * Command type table \n */\nenum CMD_TYPE {\n\tCMD_FUN_SET_OP = 1,\n\tCMD_BURST_WRITE = 8,\n\tCMD_READ_MODIFY_WRITE,\n\tCMD_RANDOM_READ,\n\tCMD_BURST_READ,\n\tCMD_RANDOM_WRITE = 12,\n\tCMD_LED_MODE_OP = 16,\n\tCMD_POWER_SAVING_OP = 20,\n\tCMD_WOW_CONFIG,\n\tCMD_WOW_QUERY,\n\tCMD_WOW_FEATURE = 24,\n\tCMD_CARRIER_DETECT_OP = 28,\n\tCMD_RADOR_DETECT_OP,\n\tCMD_SWITCH_CHANNEL_OP,\n\tCMD_CALIBRATION_OP,\n\tCMD_BEACON_OP,\n\tCMD_ANTENNA_OP\n};\n\n/*\n * Event type table\n */\nenum EVENT_TYPE {\n\tCMD_DONE,\n\tCMD_ERROR,\n\tCMD_RETRY,\n\tEVENT_PWR_RSP,\n\tEVENT_WOW_RSP,\n\tEVENT_CARRIER_DETECT_RSP,\n\tEVENT_DFS_DETECT_RSP,\n};\n\n#define ANDES_CALIBRATION_R\t\t\t1\n#define ANDES_CALIBRATION_LC\t\t\t3\n#define ANDES_CALIBRATION_LOFT\t\t4\n#define ANDES_CALIBRATION_TXIQ\t\t5\n#define ANDES_CALIBRATION_BW\t\t\t6\n#define ANDES_CALIBRATION_DPD\t\t\t7\n#define ANDES_CALIBRATION_RXIQ\t\t8\n#define ANDES_CALIBRATION_TXDCOC\t\t9\n\nINT AsicSendCommandToAndes(PRTMP_ADAPTER pAd, struct CMD_UNIT CmdUnit);\nNDIS_STATUS USBLoadFirmwareToAndes(RTMP_ADAPTER *pAd);\nNDIS_STATUS PCILoadFirmwareToAndes(RTMP_ADAPTER *pAd);\nINT AsicSendCmdToAndes(PRTMP_ADAPTER pAd, struct CMD_UNIT *CmdUnit);\nINT AndesBurstWrite(PRTMP_ADAPTER pAd, UINT32 Offset, UINT32 *Data, UINT32 Count);\nINT AndesBurstRead(PRTMP_ADAPTER pAd, UINT32 Offset, UINT32 Cnt, UINT32 *Data);\nINT AndesRandomRead(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num);\nINT AndesRFRandomRead(PRTMP_ADAPTER pAd, BANK_RF_REG_PAIR *RegPair, UINT32 Num);\nINT AndesReadModifyWrite(PRTMP_ADAPTER pAd, R_M_W_REG *RegPair, UINT32 Num);\nINT AndesRFReadModifyWrite(PRTMP_ADAPTER pAd, RF_R_M_W_REG *RegPair, UINT32 Num);\nINT AndesRandomWritePair(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num);\nINT AndesRFRandomWritePair(PRTMP_ADAPTER pAd, BANK_RF_REG_PAIR *RegPair, UINT32 Num);\nINT AndesRandomWrite(PRTMP_ADAPTER pAd, UINT32 Num, ...);\nINT AndesRFRandomWrite(PRTMP_ADAPTER pAd, UINT32 Num, ...);\n#ifdef MT7601\nINT AndesBBPRandomWritePair(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num);\nINT AndesBBPRandomWrite(PRTMP_ADAPTER pAd, UINT32 Num, ...);\n#endif /* MT7601 */\nINT AndesFunSetOP(PRTMP_ADAPTER pAd, UINT32 FunID, UINT32 Param);\nINT AndesPwrSavingOP(PRTMP_ADAPTER pAd, UINT32 PwrOP, UINT32 PwrLevel, \n\t\t\t\t\tUINT32 ListenInterval, UINT32 PreTBTTLeadTime,\n\t\t\t\t\tUINT8 TIMByteOffset, UINT8 TIMBytePattern);\nINT AndesCalibrationOP(PRTMP_ADAPTER, UINT32 CalibrationID, UINT32 Param);\nBOOLEAN IsInBandCmdProcessing(PRTMP_ADAPTER pAd);\nUCHAR GetCmdRspNum(PRTMP_ADAPTER pAd);\n#endif\n"
  },
  {
    "path": "src/include/rtmp_chip.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_chip.h\n\n\tAbstract:\n\tRalink Wireless Chip related definition & structures\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t  What\n\t--------\t----------\t  ----------------------------------------------\n*/\n\n#ifndef\t__RTMP_CHIP_H__\n#define\t__RTMP_CHIP_H__\n\n#include \"rtmp_type.h\"\n\nstruct _RTMP_ADAPTER;\nstruct _RSSI_SAMPLE;\n\n#include \"mac_ral/pbf.h\"\n\n#include \"eeprom.h\"\n\n\n#ifdef RTMP_MAC_USB\n#include \"mac_ral/rtmp_mac.h\"\n#include \"mac_ral/mac_usb.h\"\n#endif /* RTMP_MAC_USB */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#ifdef RT3290\n#include \"chip/rt3290.h\"\n#endif /* RT3290 */\n\n#ifdef RT65xx\n#include \"chip/rt6590.h\"\n#endif /* RT65xx */\n\n#ifdef RT8592\n#include \"chip/rt6590.h\"\n#endif /* RT8592 */\n\n#include \"rtmp_mcu.h\"\n\n#ifdef MT7601\n#include \"chip/mt7601.h\"\n#endif /* MT7601 */\n\n#define IS_RT3090A(_pAd)    ((((_pAd)->MACVersion & 0xffff0000) == 0x30900000))\n\n/* We will have a cost down version which mac version is 0x3090xxxx */\n#define IS_RT3090(_pAd)     ((((_pAd)->MACVersion & 0xffff0000) == 0x30710000) || (IS_RT3090A(_pAd)))\n\n#define IS_RT3070(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x30700000)\n#define IS_RT3071(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x30710000)\n#define IS_RT2070(_pAd)\t\t(((_pAd)->RfIcType == RFIC_2020) || ((_pAd)->EFuseTag == 0x27))\n\n#define IS_RT2860(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x28600000)\n#define IS_RT2872(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x28720000)\n#define IS_RT2880(_pAd)\t\t(IS_RT2860(_pAd) && IS_RBUS_INF(_pAd))\n\n#define IS_RT30xx(_pAd)\t\t(((_pAd)->MACVersion & 0xfff00000) == 0x30700000||IS_RT3090A(_pAd)||IS_RT3390(_pAd))\n\n#define IS_RT3052B(_pAd)\t(((_pAd)->CommonCfg.CID == 0x102) && (((_pAd)->CommonCfg.CN >> 16) == 0x3033)) \n#define IS_RT3052(_pAd)\t\t(((_pAd)->MACVersion == 0x28720200) && (_pAd->Antenna.field.TxPath == 2))\n#define IS_RT3050(_pAd)\t\t(((_pAd)->MACVersion == 0x28720200) && ((_pAd)->RfIcType == RFIC_3020))\n#define IS_RT3350(_pAd)\t\t(((_pAd)->MACVersion == 0x28720200) && ((_pAd)->RfIcType == RFIC_3320))\n#define IS_RT3352(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x33520000)\n#define IS_RT5350(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x53500000)\n#define IS_RT305x(_pAd)\t\t(IS_RT3050(_pAd) || IS_RT3052(_pAd) || IS_RT3350(_pAd) || IS_RT3352(_pAd) || IS_RT5350(_pAd))\n#define IS_RT3050_3052_3350(_pAd) (\\\n\t((_pAd)->MACVersion == 0x28720200) && \\\n\t((((_pAd)->CommonCfg.CN >> 16) == 0x3333) || (((_pAd)->CommonCfg.CN >> 16) == 0x3033)) \\\n)\n\n\n/* RT3572, 3592, 3562, 3062 share the same MAC version */\n#define IS_RT3572(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x35720000)\n\n/* Check if it is RT3xxx, or Specified ID in registry for debug */\n#define IS_DEV_RT3xxx(_pAd)( \\\n\t(_pAd->DeviceID == NIC3090_PCIe_DEVICE_ID) || \\\n\t(_pAd->DeviceID == NIC3091_PCIe_DEVICE_ID) || \\\n\t(_pAd->DeviceID == NIC3092_PCIe_DEVICE_ID) || \\\n\t(_pAd->DeviceID == NIC3592_PCIe_DEVICE_ID) || \\\n\t((_pAd->DeviceID == NIC3593_PCI_OR_PCIe_DEVICE_ID) && (RT3593OverPCIe(_pAd))) \\\n)\n\n#define RT3593_DEVICE_ID_CHECK(__DevId)\t\t\t\\\n\t(0)\n\n#define RT3592_DEVICE_ID_CHECK(__DevId)\t\t\t\\\n\t(__DevId == NIC3592_PCIe_DEVICE_ID)\n\n#define IS_RT2883(_pAd)\t\t(0)\n\n#define IS_RT3883(_pAd)\t\t(0)\n\n#define IS_VERSION_BEFORE_F(_pAd)\t\t\t(((_pAd)->MACVersion&0xffff) <= 0x0211)\n/* F version is 0x0212, E version is 0x0211. 309x can save more power after F version. */\n#define IS_VERSION_AFTER_F(_pAd)\t\t\t((((_pAd)->MACVersion&0xffff) >= 0x0212) || (((_pAd)->b3090ESpecialChip == TRUE)))\n\n#define IS_RT3290(_pAd)\t(((_pAd)->MACVersion & 0xffff0000) == 0x32900000)\n#define IS_RT3290LE(_pAd)   ((((_pAd)->MACVersion & 0xffffffff) >= 0x32900011))\n\n/* 3593 */\n#define IS_RT3593(_pAd) (((_pAd)->MACVersion & 0xFFFF0000) == 0x35930000)\n\n/* RT5392 */\n#define IS_RT5392(_pAd)   ((_pAd->MACVersion & 0xFFFF0000) == 0x53920000) /* Include RT5392, RT5372 and RT5362 */\n\n/* RT5390 */\n#define IS_RT5390(_pAd)   ((((_pAd)->MACVersion & 0xFFFF0000) == 0x53900000) || IS_RT5390H(_pAd)) /* Include RT5390, RT5370 and RT5360 */\n\n/* RT5390F */\n#define IS_RT5390F(_pAd)\t((IS_RT5390(_pAd)) && (((_pAd)->MACVersion & 0x0000FFFF) >= 0x0502))\n\n/* RT5370G */\n#define IS_RT5370G(_pAd)\t((IS_RT5390(_pAd)) && (((_pAd)->MACVersion & 0x0000FFFF) >= 0x0503)) /* support HW PPAD ( the hardware rx antenna diversity ) */\n\n/* RT5390R */\n#define IS_RT5390R(_pAd)   ((IS_RT5390(_pAd)) && (((_pAd)->MACVersion & 0x0000FFFF) == 0x1502)) /* support HW PPAD ( the hardware rx antenna diversity ) */\n\n/* PCIe interface NIC */\n#define IS_MINI_CARD(_pAd) ((_pAd)->Antenna.field.BoardType == BOARD_TYPE_MINI_CARD)\n\n/* 5390U (5370 using PCIe interface) */\n#define IS_RT5390U(_pAd)   (IS_MINI_CARD(_pAd) && ((_pAd)->MACVersion & 0xFFFF0000) == 0x53900000)\n\n/* RT5390H */\n#define IS_RT5390H(_pAd)   (((_pAd->MACVersion & 0xFFFF0000) == 0x53910000) && (((_pAd)->MACVersion & 0x0000FFFF) >= 0x1500))\n\n/* RT5390BC8 (WiFi + BT) */\n\n\n/* RT5390D */\n#define IS_RT5390D(_pAd)\t((IS_RT5390(_pAd)) && (((_pAd)->MACVersion & 0x0000FFFF) >= 0x0502))\n\n/* RT5392C */\n#define IS_RT5392C(_pAd)\t((IS_RT5392(_pAd)) && (((_pAd)->MACVersion & 0x0000FFFF) >= 0x0222)) /* Include RT5392, RT5372 and RT5362 */\n\n#define IS_RT5592(_pAd)\t\t(((_pAd)->MACVersion & 0xFFFF0000) == 0x55920000)\n#define REV_RT5592C\t\t\t0x0221\n\n#define IS_RT65XX(_pAd)\t\t((((_pAd)->MACVersion & 0xFFFF0000) == 0x65900000) ||\\\n\t\t\t\t\t\t\t (((_pAd)->MACVersion & 0xfffff000) == 0x85592000) || \\\n\t\t\t\t\t\t\t (((_pAd)->MACVersion & 0xfffff000) == 0x65900000) || \\\n\t\t\t\t\t\t\t (((_pAd)->MACVersion & 0xffff0000) == 0x76500000))\n\n#define IS_RT6570(_pAd)\t\t(((((_pAd)->MACVersion & 0xffff0000) == 0x76500000) || \\\n\t\t\t\t\t\t\t (((_pAd)->MACVersion & 0xffff0000) == 0x65900000)) && \\\n\t\t\t\t\t\t\t((_pAd)->infType == RTMP_DEV_INF_USB))\n#define IS_RT6590(_pAd)\t\t((((_pAd)->MACVersion & 0xffff0000) == 0x65900000) || \\\n\t\t\t\t\t\t\t (((_pAd)->MACVersion & 0xffff0000) == 0x76500000))\n#define IS_MT7650(_pAd)\t\t(((_pAd)->chipCap.ChipID && 0xffff0000) == 0x76500000)\n\n#define IS_MT76x2(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x76620000)\n#define IS_MT7662(_pAd)\t\t(((_pAd)->chipCap.ChipID && 0xffff0000) == 0x76620000)\n\n#define IS_MT76xx(_pAd)\t\t(IS_MT76x0(_pAd) || IS_MT76x2(_pAd))\n\n#define IS_RT8592(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x85590000)\n\t\t\t\t\t\t\t\n#define IS_RT8592(_pAd)\t\t(((_pAd)->MACVersion & 0xffff0000) == 0x85590000)\n\n#define IS_MT7601(_pAd)\t\t((((_pAd)->MACVersion & 0xFFFF0000) == 0x76010000))\n\n/* RT3592BC8 (WiFi + BT) */\n\n#define IS_USB_INF(_pAd)\t\t((_pAd)->infType == RTMP_DEV_INF_USB)\n#define IS_PCIE_INF(_pAd)\t\t((_pAd)->infType == RTMP_DEV_INF_PCIE)\n#define IS_PCI_INF(_pAd)\t\t(((_pAd)->infType == RTMP_DEV_INF_PCI) || IS_PCIE_INF(_pAd))\n#define IS_PCI_ONLY_INF(_pAd)\t((_pAd)->infType == RTMP_DEV_INF_PCI)\n#define IS_RBUS_INF(_pAd) ((_pAd)->infType == RTMP_DEV_INF_RBUS)\n\n#define RT_REV_LT(_pAd, _chip, _rev)\\\n\tIS_##_chip(_pAd) && (((_pAd)->MACVersion & 0x0000FFFF) < (_rev))\n\n#define RT_REV_GTE(_pAd, _chip, _rev)\\\n\tIS_##_chip(_pAd) && (((_pAd)->MACVersion & 0x0000FFFF) >= (_rev))\n\n/* Dual-band NIC (RF/BBP/MAC are in the same chip.) */\n\n#define IS_RT_NEW_DUAL_BAND_NIC(_pAd) ((FALSE))\n\n\n/* Is the NIC dual-band NIC? */\n\n#define IS_DUAL_BAND_NIC(_pAd) (((_pAd->RfIcType == RFIC_2850) || (_pAd->RfIcType == RFIC_2750) || (_pAd->RfIcType == RFIC_3052)\t\t\\\n\t\t\t\t\t\t\t\t|| (_pAd->RfIcType == RFIC_3053) || (_pAd->RfIcType == RFIC_2853) || (_pAd->RfIcType == RFIC_3853) \t\\\n\t\t\t\t\t\t\t\t|| IS_RT_NEW_DUAL_BAND_NIC(_pAd)) && !IS_RT5390(_pAd))\n\n\n/* RT3593 over PCIe bus */\n#define RT3593OverPCIe(_pAd) (IS_RT3593(_pAd) && (_pAd->CommonCfg.bPCIeBus == TRUE))\n\n/* RT3593 over PCI bus */\n#define RT3593OverPCI(_pAd) (IS_RT3593(_pAd) && (_pAd->CommonCfg.bPCIeBus == FALSE))\n\n/*RT3390,RT3370 */\n#define IS_RT3390(_pAd)\t\t\t\t(((_pAd)->MACVersion & 0xFFFF0000) == 0x33900000)\n\n/* ------------------------------------------------------ */\n/* PCI registers - base address 0x0000 */\n/* ------------------------------------------------------ */\n#define CHIP_PCI_CFG\t\t0x0000\n#define CHIP_PCI_EECTRL\t\t0x0004\n#define CHIP_PCI_MCUCTRL\t0x0008\n\n#define OPT_14\t\t\t0x114\n\n#define RETRY_LIMIT\t\t10\n\n/* ------------------------------------------------------ */\n/* BBP & RF\tdefinition */\n/* ------------------------------------------------------ */\n#define\tBUSY\t\t                1\n#define\tIDLE\t\t                0\n\n/*------------------------------------------------------------------------- */\n/* EEPROM definition */\n/*------------------------------------------------------------------------- */\n#define EEDO                        0x08\n#define EEDI                        0x04\n#define EECS                        0x02\n#define EESK                        0x01\n#define EERL                        0x80\n\n#define EEPROM_WRITE_OPCODE         0x05\n#define EEPROM_READ_OPCODE          0x06\n#define EEPROM_EWDS_OPCODE          0x10\n#define EEPROM_EWEN_OPCODE          0x13\n\n#define NUM_EEPROM_BBP_PARMS\t\t19\t/* Include NIC Config 0, 1, CR, TX ALC step, BBPs */\n#define NUM_EEPROM_TX_G_PARMS\t\t7\n\n#define VALID_EEPROM_VERSION        1\n#define EEPROM_VERSION_OFFSET       0x02\n#define EEPROM_NIC1_OFFSET          0x34\t/* The address is from NIC config 0, not BBP register ID */\n#define EEPROM_NIC2_OFFSET          0x36\t/* The address is from NIC config 1, not BBP register ID */\n\n\n#define EEPROM_COUNTRY_REGION\t\t\t0x38\n\n#define EEPROM_DEFINE_MAX_TXPWR\t\t\t0x4e\n\n#define EEPROM_FREQ_OFFSET\t\t\t0x3a\n#define EEPROM_LEDAG_CONF_OFFSET\t0x3c\n#define EEPROM_LEDACT_CONF_OFFSET\t0x3e\n#define EEPROM_LED_POLARITY_OFFSET\t0x40\n#if defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290)\n#define\tEEPROM_NIC3_OFFSET\t\t\t0x42\n#endif /* defined(BT_COEXISTENCE_SUPPORT) || defined(RT3290) */\n\n#define EEPROM_LNA_OFFSET\t\t\t0x44\n\n#define EEPROM_RSSI_BG_OFFSET\t\t\t0x46\n#define EEPROM_RSSI_A_OFFSET\t\t\t0x4a\n#define EEPROM_TXMIXER_GAIN_2_4G\t\t0x48\n#define EEPROM_TXMIXER_GAIN_5G\t\t\t0x4c\n\n#define EEPROM_TXPOWER_DELTA\t\t\t0x50\t/* 20MHZ AND 40 MHZ use different power. This is delta in 40MHZ. */\n\n#define EEPROM_G_TX_PWR_OFFSET\t\t\t0x52\n#define EEPROM_G_TX2_PWR_OFFSET\t\t\t0x60\n\n#define EEPROM_G_TSSI_BOUND1\t\t\t0x6e\n#define EEPROM_G_TSSI_BOUND2\t\t\t0x70\n#define EEPROM_G_TSSI_BOUND3\t\t\t0x72\n#define EEPROM_G_TSSI_BOUND4\t\t\t0x74\n#define EEPROM_G_TSSI_BOUND5\t\t\t0x76\n\n#ifdef MT7601\n#define EEPROM_TX0_TSSI_SLOPE\t\t\t\t0x6e\n#define EEPROM_TX0_TSSI_OFFSET_GROUP1\t0x70\n#define EEPROM_TX0_TSSI_OFFSET\t\t\t0x76\n#define EEPROM_G_TARGET_POWER\t\t\t0xD0\n#define EEPROM_FREQ_OFFSET_COMPERSATION\t\t0xDA\n#endif /* MT7601 */\n\n\n#define EEPROM_A_TX_PWR_OFFSET      \t\t0x78\n#define EEPROM_A_TX2_PWR_OFFSET\t\t\t0xa6\n\n#define MBSSID_MODE0 0\n#define MBSSID_MODE1 1\n\nenum FREQ_CAL_INIT_MODE {\n\tFREQ_CAL_INIT_MODE0,\n\tFREQ_CAL_INIT_MODE1,\n\tFREQ_CAL_INIT_MODE2,\n\tFREQ_CAL_INIT_UNKNOW,\n};\n\nenum FREQ_CAL_MODE {\n\tFREQ_CAL_MODE0,\n\tFREQ_CAL_MODE1,\n\tFREQ_CAL_MODE2,\n};\n\nenum RXWI_FRQ_OFFSET_FIELD {\n\tRXWI_FRQ_OFFSET_FIELD0, /* SNR1 */\n\tRXWI_FRQ_OFFSET_FIELD1, /* Frequency Offset */\n};\n\n\n#define EEPROM_A_TSSI_BOUND1\t\t0xd4\n#define EEPROM_A_TSSI_BOUND2\t\t0xd6\n#define EEPROM_A_TSSI_BOUND3\t\t0xd8\n#define EEPROM_A_TSSI_BOUND4\t\t0xda\n#define EEPROM_A_TSSI_BOUND5\t\t0xdc\n\n/* ITxBF calibration values EEPROM locations 0x1a0 to 0x1ab */\n#define EEPROM_ITXBF_CAL\t\t\t\t0x1a0\n\n#define EEPROM_TXPOWER_BYRATE \t\t\t0xde\t/* 20MHZ power. */\n#define EEPROM_TXPOWER_BYRATE_20MHZ_2_4G\t0xde\t/* 20MHZ 2.4G tx power. */\n#define EEPROM_TXPOWER_BYRATE_40MHZ_2_4G\t0xee\t/* 40MHZ 2.4G tx power. */\n#define EEPROM_TXPOWER_BYRATE_20MHZ_5G\t\t0xfa\t/* 20MHZ 5G tx power. */\n#define EEPROM_TXPOWER_BYRATE_40MHZ_5G\t\t0x10a\t/* 40MHZ 5G tx power. */\n\n#define EEPROM_BBP_BASE_OFFSET\t\t\t0xf0\t/* The address is from NIC config 0, not BBP register ID */\n\n/* */\n/* Bit mask for the Tx ALC and the Tx fine power control */\n/* */\n#define GET_TX_ALC_BIT_MASK\t\t\t\t\t0x1F\t/* Valid: 0~31, and in 0.5dB step */\n#define GET_TX_FINE_POWER_CTRL_BIT_MASK\t0xE0\t/* Valid: 0~4, and in 0.1dB step */\n#define NUMBER_OF_BITS_FOR_TX_ALC\t\t\t5\t/* The length, in bit, of the Tx ALC field */\n\n\n/* TSSI gain and TSSI attenuation */\n\n#define EEPROM_TSSI_GAIN_AND_ATTENUATION\t0x76\n\n/*#define EEPROM_Japan_TX_PWR_OFFSET      0x90 // 802.11j */\n/*#define EEPROM_Japan_TX2_PWR_OFFSET      0xbe */\n/*#define EEPROM_TSSI_REF_OFFSET\t0x54 */\n/*#define EEPROM_TSSI_DELTA_OFFSET\t0x24 */\n/*#define EEPROM_CCK_TX_PWR_OFFSET  0x62 */\n/*#define EEPROM_CALIBRATE_OFFSET\t0x7c */\n\n#define EEPROM_NIC_CFG1_OFFSET\t\t0\n#define EEPROM_NIC_CFG2_OFFSET\t\t1\n#define EEPROM_NIC_CFG3_OFFSET\t\t2\n#define EEPROM_COUNTRY_REG_OFFSET\t3\n#define EEPROM_BBP_ARRAY_OFFSET\t\t4\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) \n/* */\n/* The TSSI over OFDM 54Mbps */\n/* */\n#define EEPROM_TSSI_OVER_OFDM_54\t\t0x6E\n\n/* */\n/* The TSSI value/step (0.5 dB/unit) */\n/* */\n#define EEPROM_TSSI_STEP_OVER_2DOT4G\t0x77\n#define EEPROM_TSSI_STEP_OVER_5DOT5G\t0xDD\n#define TSSI_READ_SAMPLE_NUM\t\t\t3\n\n/* */\n/* Per-channel Tx power offset (for the extended TSSI mode) */\n/* */\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_1\t0x6F\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_3\t0x70\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_5\t0x71\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_7\t0x72\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_9\t0x73\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_11\t0x74\n#define EEPROM_TX_POWER_OFFSET_OVER_CH_13\t0x75\n\n/* */\n/* Tx power configuration (bit3:0 for Tx0 power setting and bit7:4 for Tx1 power setting) */\n/* */\n#define EEPROM_CCK_MCS0_MCS1\t\t\t\t0xDE\n#define EEPROM_CCK_MCS2_MCS3\t\t\t\t0xDF\n#define EEPROM_OFDM_MCS0_MCS1\t\t\t0xE0\n#define EEPROM_OFDM_MCS2_MCS3\t\t\t0xE1\n#define EEPROM_OFDM_MCS4_MCS5\t\t\t0xE2\n#define EEPROM_OFDM_MCS6_MCS7\t\t\t0xE3\n#define EEPROM_HT_MCS0_MCS1\t\t\t\t0xE4\n#define EEPROM_HT_MCS2_MCS3\t\t\t\t0xE5\n#define EEPROM_HT_MCS4_MCS5\t\t\t\t0xE6\n#define EEPROM_HT_MCS6_MCS7\t\t\t\t0xE7\n#define EEPROM_HT_MCS8_MCS9                     \t0xE8\n#define EEPROM_HT_MCS10_MCS11                   \t0xE9\n#define EEPROM_HT_MCS12_MCS13                   \t0xEA\n#define EEPROM_HT_MCS14_MCS15                   \t0xEB\n#define EEPROM_HT_USING_STBC_MCS0_MCS1\t0xEC\n#define EEPROM_HT_USING_STBC_MCS2_MCS3\t0xED\n#define EEPROM_HT_USING_STBC_MCS4_MCS5\t0xEE\n#define EEPROM_HT_USING_STBC_MCS6_MCS7\t0xEF\n\n/* */\n/* Bit mask for the Tx ALC and the Tx fine power control */\n/* */\n\n#define DEFAULT_BBP_TX_FINE_POWER_CTRL \t0\n\n#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef union _EEPROM_ANTENNA_STRUC {\n\tstruct {\n\t\tUSHORT RssiIndicationMode:1; \t/* RSSI indication mode */\n\t\tUSHORT Rsv:1;\n\t\tUSHORT BoardType:2; \t\t/* 0: mini card; 1: USB pen */\n\t\tUSHORT RfIcType:4;\t\t\t/* see E2PROM document */\n\t\tUSHORT TxPath:4;\t\t\t/* 1: 1T, 2: 2T, 3: 3T */\n\t\tUSHORT RxPath:4;\t\t\t/* 1: 1R, 2: 2R, 3: 3R */\n\t} field;\n\tUSHORT word;\n} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC;\n#else\ntypedef union _EEPROM_ANTENNA_STRUC {\n\tstruct {\n\t\tUSHORT RxPath:4;\t\t\t/* 1: 1R, 2: 2R, 3: 3R */\n\t\tUSHORT TxPath:4;\t\t\t/* 1: 1T, 2: 2T, 3: 3T */\n\t\tUSHORT RfIcType:4;\t\t\t/* see E2PROM document */\n\t\tUSHORT BoardType:2; \t\t/* 0: mini card; 1: USB pen */\n\t\tUSHORT Rsv:1;\n\t\tUSHORT RssiIndicationMode:1; \t/* RSSI indication mode */\t\n\t} field;\n\tUSHORT word;\n} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC;\n#endif\n\n\n/*\n  *   EEPROM operation related marcos\n  */\n#define RT28xx_EEPROM_READ16(_pAd, _offset, _value)\t\t\t\\\n\t(_pAd)->chipOps.eeread((RTMP_ADAPTER *)(_pAd), (USHORT)(_offset), (PUSHORT)&(_value))\n\n#define RT28xx_EEPROM_WRITE16(_pAd, _offset, _value)\t\t\\\n\t(_pAd)->chipOps.eewrite((RTMP_ADAPTER *)(_pAd), (USHORT)(_offset), (USHORT)(_value))\n\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) \n/* The Tx power tuning entry */\ntypedef struct _TX_POWER_TUNING_ENTRY_STRUCT {\n\tCHAR\tRF_TX_ALC; \t\t/* 3390: RF R12[4:0]: Tx0 ALC, 5390: RF R49[5:0]: Tx0 ALC */\n\tCHAR \tMAC_PowerDelta;\t/* Tx power control over MAC 0x1314~0x1324 */\n} TX_POWER_TUNING_ENTRY_STRUCT, *PTX_POWER_TUNING_ENTRY_STRUCT;\n#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */\n\n/*\n\t2860: 28xx\n\t2870: 28xx\n\n\t30xx:\n\t\t3090\n\t\t3070\n\t\t2070 3070\n\n\t33xx:\t30xx\n\t\t3390 3090\n\t\t3370 3070\n\n\t35xx:\t30xx\n\t\t3572, 2870, 28xx\n\t\t3062, 2860, 28xx\n\t\t3562, 2860, 28xx\n\n\t3593, 28xx, 30xx, 35xx\n\n\t< Note: 3050, 3052, 3350 can not be compiled simultaneously. >\n\t305x:\n\t\t3052\n\t\t3050\n\t\t3350, 3050\n\n\t3352: 305x\n\n\t2880: 28xx\n\t2883:\n\t3883:\n*/\n\nstruct _RTMP_CHIP_CAP_ {\n\tUINT32 ChipID;\n\t/* register */\n\tREG_PAIR *pRFRegTable;\n\tREG_PAIR *pBBPRegTable;\n\tUCHAR bbpRegTbSize;\n\n\tUINT32 MaxNumOfRfId;\n\tUINT32 MaxNumOfBbpId;\n\n#define RF_REG_WT_METHOD_NONE\t\t\t0\n#define RF_REG_WT_METHOD_STEP_ON\t\t1\n\tUCHAR RfReg17WtMethod;\n\n\t/* beacon */\n\tBOOLEAN FlgIsSupSpecBcnBuf;\t/* SPECIFIC_BCN_BUF_SUPPORT */\n\tUINT8 BcnMaxNum;\t/* software use */\n\tUINT8 BcnMaxHwNum;\t/* hardware limitation */\n\tUINT8 WcidHwRsvNum;\t/* hardware available WCID number */\n\tUINT16 BcnMaxHwSize;\t/* hardware maximum beacon size */\n\tUINT16 BcnBase[HW_BEACON_MAX_NUM];\t/* hardware beacon base address */\n\t\n\t/* function */\n\t/* use UINT8, not bit-or to speed up driver */\n\tBOOLEAN FlgIsHwWapiSup;\n\n\t/* VCO calibration mode */\n\tUINT8\tVcoPeriod; /* default 10s */\n#define VCO_CAL_DISABLE\t\t0\t/* not support */\n#define VCO_CAL_MODE_1\t\t1\t/* toggle RF7[0] */\n#define VCO_CAL_MODE_2\t\t2\t/* toggle RF3[7] */\n#define VCO_CAL_MODE_3\t\t3\t/* toggle RF4[7] */\t\n\tUINT8\tFlgIsVcoReCalMode;\n\n\tBOOLEAN FlgIsHwAntennaDiversitySup;\n\tBOOLEAN FlgSwBasedPPAD;\n#ifdef STREAM_MODE_SUPPORT\n\tBOOLEAN FlgHwStreamMode;\n#endif /* STREAM_MODE_SUPPORT */\n#ifdef TXBF_SUPPORT\n\tBOOLEAN FlgHwTxBfCap;\n#endif /* TXBF_SUPPORT */\n#ifdef FIFO_EXT_SUPPORT\n\tBOOLEAN FlgHwFifoExtCap;\n#endif /* FIFO_EXT_SUPPORT */\n\n\n\tenum ASIC_CAP asic_caps;\n\tenum PHY_CAP phy_caps;\n\t\n#ifdef TXRX_SW_ANTDIV_SUPPORT\n\tBOOLEAN bTxRxSwAntDiv;\n#endif /* TXRX_SW_ANTDIV_SUPPORT */\n\n\t/* ---------------------------- signal ---------------------------------- */\n#define SNR_FORMULA1\t\t0\t/* ((0xeb     - pAd->StaCfg.LastSNR0) * 3) / 16; */\n#define SNR_FORMULA2\t\t1\t/* (pAd->StaCfg.LastSNR0 * 3 + 8) >> 4; */\n#define SNR_FORMULA3\t\t2\t/* (pAd->StaCfg.LastSNR0) * 3) / 16; */\n\tUINT8 SnrFormula;\n\n\tUINT8 MaxNss;\t\t\t/* maximum Nss, 3 for 3883 or 3593 */\n\n\tBOOLEAN bTempCompTxALC;\n\n\tBOOLEAN bLimitPowerRange; /* TSSI compensation range limit */\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)\n\tUINT8 TxAlcTxPowerUpperBound_2G;\n\tconst TX_POWER_TUNING_ENTRY_STRUCT *TxPowerTuningTable_2G;\n#ifdef A_BAND_SUPPORT\n\tUINT8 TxAlcTxPowerUpperBound_5G;\n\tconst TX_POWER_TUNING_ENTRY_STRUCT *TxPowerTuningTable_5G;\n#endif /* A_BAND_SUPPORT */\n\n#ifdef MT7601\n\tMT7601_TX_ALC_DATA TxALCData;\n#endif /* MT7601 */\n#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */\n\n#if defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2)\n\tINT16\tPAModeCCK[4];\n\tINT16\tPAModeOFDM[8];\n\tINT16\tPAModeHT[16];\n#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2) */\n\n#ifdef MT7601\n\tCHAR\tTemperatureRef25C;\n\tUCHAR\tTemperatureMode;\n\tBOOLEAN\tbPllLockProtect;\n\tCHAR\tCurrentTemperBbpR49;\n#ifdef DPD_CALIBRATION_SUPPORT\n\tINT32\tTemperatureDPD;\t\t\t\t\t// temperature when do DPD calibration\n#endif /* DPD_CALIBRATION_SUPPORT */\n\tINT32\tCurrentTemperature;\t\t\t\t\t// (BBP_R49 - Ref25C) * offset\n#endif /* MT7601 */\n\t/* ---------------------------- packet ---------------------------------- */\n\tUINT8 TXWISize;\n\tUINT8 RXWISize;\n\n\t/* ---------------------------- others ---------------------------------- */\n#ifdef RTMP_EFUSE_SUPPORT\n\tUINT16 EFUSE_USAGE_MAP_START;\n\tUINT16 EFUSE_USAGE_MAP_END;\n\tUINT8 EFUSE_USAGE_MAP_SIZE;\n\tUCHAR *EFUSE_DEFAULT_BIN;\n\tUINT16 EFUSE_DEFAULT_BIN_SIZE;\n#endif /* RTMP_EFUSE_SUPPORT */\n\n#ifdef RTMP_FLASH_SUPPORT\n\tUCHAR *eebuf;\n#endif /* RTMP_FLASH_SUPPORT */\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\tUCHAR carrier_func;\n#endif /* CARRIER_DETECTION_SUPPORT */\n#ifdef DFS_SUPPORT\n\tUINT8 DfsEngineNum;\n#endif /* DFS_SUPPORT */\n\n\t/*\n\t\tDefine the burst size of WPDMA of PCI\n\t\t0 : 4 DWORD (16bytes)\n\t\t1 : 8 DWORD (32 bytes)\n\t\t2 : 16 DWORD (64 bytes)\n\t\t3 : 32 DWORD (128 bytes)\n\t*/\n\tUINT8 WPDMABurstSIZE;\n\n\t/* \n \t * 0: MBSSID_MODE0 \n \t * (The multiple MAC_ADDR/BSSID are distinguished by [bit2:bit0] of byte5) \n \t * 1: MBSSID_MODE1\n \t * (The multiple MAC_ADDR/BSSID are distinguished by [bit4:bit2] of byte0) \n \t */\n\tUINT8 MBSSIDMode;\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\tUINT8 FreqCalibrationSupport;\n\tUINT8 FreqCalInitMode;\n\tUINT8 FreqCalMode;\n\tUINT8 RxWIFrqOffset;\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef RT5592EP_SUPPORT\n\tUINT32 Priv; /* Flag for RT5592 EP */\n#endif /* RT5592EP_SUPPORT */\n\n#ifdef CONFIG_ANDES_SUPPORT\n\tUINT32 WlanMemmapOffset;\n\tUINT32 InbandPacketMaxLen;\n\tUINT8 CmdRspRxRing;\n\tBOOLEAN IsComboChip;\n#endif\n\n#ifdef SINGLE_SKU_V2\n\tCHAR\tApwrdelta;\n\tCHAR\tGpwrdelta;\n#endif /* SINGLE_SKU_V2 */\n\n#ifdef RTMP_USB_SUPPORT\n\tUINT8 DataBulkInAddr;\n\tUINT8 CommandRspBulkInAddr;\n\tUINT8 WMM0ACBulkOutAddr[4];\n\tUINT8 WMM1ACBulkOutAddr;\n\tUINT8 CommandBulkOutAddr;\n#endif\n\t\n\tenum MCU_TYPE MCUType;\n\tUCHAR *FWImageName;\n};\n\ntypedef VOID (*CHIP_SPEC_FUNC)(VOID *pAd, VOID *pData, ULONG Data);\n\n/* The chip specific function ID */\ntypedef enum _CHIP_SPEC_ID\n{\t\t\n\tCHIP_SPEC_RESV_FUNC\n} CHIP_SPEC_ID;\n\n#define CHIP_SPEC_ID_NUM \tCHIP_SPEC_RESV_FUNC\n\n\nstruct _RTMP_CHIP_OP_ {\n\t/*  Calibration access related callback functions */\n\tint (*eeinit)(struct _RTMP_ADAPTER *pAd);\n\tint (*eeread)(struct _RTMP_ADAPTER *pAd, USHORT offset, PUSHORT pValue);\n\tint (*eewrite)(struct _RTMP_ADAPTER *pAd, USHORT offset, USHORT value);\n\n\t/* MCU related callback functions */\n\tint (*loadFirmware)(struct _RTMP_ADAPTER *pAd);\n\tint (*eraseFirmware)(struct _RTMP_ADAPTER *pAd);\n\tint (*sendCommandToMcu)(struct _RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1, BOOLEAN FlgIsNeedLocked);\t/* int (*sendCommandToMcu)(RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1); */\n#ifdef CONFIG_ANDES_SUPPORT\n\tint (*sendCommandToAndesMcu)(struct _RTMP_ADAPTER *pAd, UCHAR QueIdx, UCHAR cmd, UCHAR *pData, USHORT DataLen, BOOLEAN FlgIsNeedLocked);\n#endif /* CONFIG_ANDES_SUPPORT */\n\n\tvoid (*AsicRfInit)(struct _RTMP_ADAPTER *pAd);\n\tvoid (*AsicBbpInit)(struct _RTMP_ADAPTER *pAd);\n\tvoid (*AsicMacInit)(struct _RTMP_ADAPTER *pAd);\n\n\tvoid (*AsicRfTurnOn)(struct _RTMP_ADAPTER *pAd);\n\tvoid (*AsicRfTurnOff)(struct _RTMP_ADAPTER *pAd);\n\tvoid (*AsicReverseRfFromSleepMode)(struct _RTMP_ADAPTER *pAd, BOOLEAN FlgIsInitState);\n\tvoid (*AsicHaltAction)(struct _RTMP_ADAPTER *pAd);\n\n\t/* Power save */\n\tVOID (*EnableAPMIMOPS)(IN struct _RTMP_ADAPTER *pAd, IN BOOLEAN ReduceCorePower);\n\tVOID (*DisableAPMIMOPS)(IN struct _RTMP_ADAPTER *pAd);\n\n\t/* Chip tuning */\n\tVOID (*RxSensitivityTuning)(IN struct _RTMP_ADAPTER *pAd);\n\n\t/* MAC */\n\tVOID (*BeaconUpdate)(struct _RTMP_ADAPTER *pAd, USHORT Offset, UINT32 Value, UINT8 Unit);\n\n\t/* BBP adjust */\n\tVOID (*ChipBBPAdjust)(IN struct _RTMP_ADAPTER *pAd);\n\n\t/* AGC */\n\tVOID (*ChipAGCInit)(struct _RTMP_ADAPTER *pAd, UCHAR bw);\n\tUCHAR (*ChipAGCAdjust)(struct _RTMP_ADAPTER *pAd, CHAR Rssi, UCHAR OrigR66Value);\n\t\n\t/* Channel */\n\tVOID (*ChipSwitchChannel)(struct _RTMP_ADAPTER *pAd, UCHAR ch, BOOLEAN bScan);\n\n\t/* IQ Calibration */\n\tVOID (*ChipIQCalibration)(struct _RTMP_ADAPTER *pAd, UCHAR Channel);\n\n\t/* TX ALC */\n\tUINT32 (*TSSIRatio)(INT32 delta_power);\n\tVOID (*InitDesiredTSSITable)(IN struct _RTMP_ADAPTER *pAd);\n\tint (*ATETssiCalibration)(struct _RTMP_ADAPTER *pAd, PSTRING arg);\n\tint (*ATETssiCalibrationExtend)(struct _RTMP_ADAPTER *pAd, PSTRING arg);\n\tint (*ATEReadExternalTSSI)(struct _RTMP_ADAPTER *pAd, PSTRING arg);\n\n\tVOID (*AsicTxAlcGetAutoAgcOffset)(\n\t\t\t\tIN struct _RTMP_ADAPTER\t*pAd,\n\t\t\t\tIN PCHAR\t\t\t\tpDeltaPwr,\n\t\t\t\tIN PCHAR\t\t\t\tpTotalDeltaPwr,\n\t\t\t\tIN PCHAR\t\t\t\tpAgcCompensate,\n\t\t\t\tIN PCHAR \t\t\t\tpDeltaPowerByBbpR1);\n\n\n\t\n\tVOID (*AsicGetTxPowerOffset)(struct _RTMP_ADAPTER *pAd, ULONG *TxPwr);\n\tVOID (*AsicExtraPowerOverMAC)(struct _RTMP_ADAPTER *pAd);\n\t\n\t/* Antenna */\n\tVOID (*AsicAntennaDefaultReset)(struct _RTMP_ADAPTER *pAd, union _EEPROM_ANTENNA_STRUC *pAntenna);\n\tVOID (*SetRxAnt)(struct _RTMP_ADAPTER *pAd, UCHAR Ant);\n\n\t/* EEPROM */\n\tVOID (*NICInitAsicFromEEPROM)(IN struct _RTMP_ADAPTER *pAd);\n\n\t/* Temperature Compensation */\n\tVOID (*InitTemperCompensation)(IN struct _RTMP_ADAPTER *pAd);\n\tVOID (*TemperCompensation)(IN struct _RTMP_ADAPTER *pAd);\n\t\n\t/* high power tuning */\n\tVOID (*HighPowerTuning)(struct _RTMP_ADAPTER *pAd, struct _RSSI_SAMPLE *pRssi);\n\t\n\t/* Others */\n\tVOID (*NetDevNickNameInit)(IN struct _RTMP_ADAPTER *pAd);\n\n\t/* The chip specific function list */\n\tCHIP_SPEC_FUNC ChipSpecFunc[CHIP_SPEC_ID_NUM];\n\t\n\tVOID (*AsicResetBbpAgent)(IN struct _RTMP_ADAPTER *pAd);\n\n#ifdef CARRIER_DETECTION_SUPPORT\n\tVOID (*ToneRadarProgram)(struct _RTMP_ADAPTER *pAd, ULONG  threshold);\n#endif /* CARRIER_DETECTION_SUPPORT */\n\tVOID (*CckMrcStatusCtrl)(struct _RTMP_ADAPTER *pAd);\n\tVOID (*RadarGLRTCompensate)(struct _RTMP_ADAPTER *pAd);\n\t\n\tVOID (*Calibration)(struct _RTMP_ADAPTER *pAd, UINT32 CalibrationID, UINT32 Parameter);\n\n\tINT (*BurstWrite)(struct _RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 *Data, UINT32 Cnt);\n\n\tINT (*BurstRead)(struct _RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 Cnt, UINT32 *Data);\n\n\tINT (*RandomRead)(struct _RTMP_ADAPTER *pAd, RTMP_REG_PAIR *RegPair, UINT32 Num);\n\n\tINT (*RFRandomRead)(struct _RTMP_ADAPTER *pAd, BANK_RF_REG_PAIR *RegPair, UINT32 Num);\n\n\tINT (*ReadModifyWrite)(struct _RTMP_ADAPTER *pAd, R_M_W_REG *RegPair, UINT32 Num);\n\n\tINT (*RFReadModifyWrite)(struct _RTMP_ADAPTER *pAd, RF_R_M_W_REG *RegPair, UINT32 Num);\n\n\tINT (*RandomWrite)(struct _RTMP_ADAPTER *pAd, RTMP_REG_PAIR *RegPair, UINT32 Num);\n\n\tINT (*RFRandomWrite)(struct _RTMP_ADAPTER *pAd, BANK_RF_REG_PAIR *RegPair, UINT32 Num);\n\n\tVOID (*DisableTxRx)(struct _RTMP_ADAPTER *pAd, UCHAR Level);\n\n\tVOID (*AsicRadioOn)(struct _RTMP_ADAPTER *pAd, UCHAR Stage);\n\n\tVOID (*AsicRadioOff)(struct _RTMP_ADAPTER *pAd, UCHAR Stage);\n\n\tINT (*PwrSavingOP)(struct _RTMP_ADAPTER *pAd, UINT32 PwrOP, UINT32 PwrLevel, \n\t\t\t\t\t\t\tUINT32 ListenInterval, UINT32 PreTBTTLeadTime,\n\t\t\t\t\t\t\tUINT8 TIMByteOffset, UINT8 TIMBytePattern);\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tVOID (*AsicMeasureFalseCCA)(IN struct _RTMP_ADAPTER *pAd);\n\n\tVOID (*AsicMitigateMicrowave)(IN struct _RTMP_ADAPTER *pAd);\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tVOID (*AsicWOWEnable)(\n\t\t\t\tIN struct _RTMP_ADAPTER *pAd);\n\tVOID (*AsicWOWDisable)(\n\t\t\t\tIN struct _RTMP_ADAPTER *pAd);\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n};\n\n#define RTMP_CHIP_ENABLE_AP_MIMOPS(__pAd, __ReduceCorePower)\t\t\t\t\\\n\t\tif (__pAd->chipOps.EnableAPMIMOPS != NULL)\t\t\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.EnableAPMIMOPS(__pAd, __ReduceCorePower)\n\n#define RTMP_CHIP_DISABLE_AP_MIMOPS(__pAd)\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.DisableAPMIMOPS != NULL)\t\t\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.DisableAPMIMOPS(__pAd)\n\n#define PWR_SAVING_OP(__pAd, __PwrOP, __PwrLevel, __ListenInterval, \\\n\t\t\t\t\t\t__PreTBTTLeadTime, __TIMByteOffset, __TIMBytePattern)\t\\\ndo {\t\\\n\t\tif (__pAd->chipOps.PwrSavingOP != NULL)\t\\\n\t\t\t__pAd->chipOps.PwrSavingOP(__pAd, __PwrOP, __PwrLevel,\t\\\n\t\t\t\t\t\t\t\t\t\t__ListenInterval,__PreTBTTLeadTime, \\\n\t\t\t\t\t\t\t\t\t\t__TIMByteOffset, __TIMBytePattern);\t\\\n} while (0)\n\n#define RTMP_CHIP_RX_SENSITIVITY_TUNING(__pAd)\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.RxSensitivityTuning != NULL)\t\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.RxSensitivityTuning(__pAd)\n\n#define RTMP_CHIP_ASIC_AGC_ADJUST(__pAd, __Rssi, __R66)\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.ChipAGCAdjust != NULL)\t\t\t\t\t\t\\\n\t\t\t__R66 = __pAd->chipOps.ChipAGCAdjust(__pAd, __Rssi, __R66)\n\n#define RTMP_CHIP_ASIC_TSSI_TABLE_INIT(__pAd)\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.InitDesiredTSSITable != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.InitDesiredTSSITable(__pAd)\n\n#define RTMP_CHIP_ATE_TSSI_CALIBRATION(__pAd, __pData)\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.ATETssiCalibration != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.ATETssiCalibration(__pAd, __pData)\n\n#define RTMP_CHIP_ATE_TSSI_CALIBRATION_EXTEND(__pAd, __pData)\t\t\t\\\n\t\tif (__pAd->chipOps.ATETssiCalibrationExtend != NULL)\t\t\t\t\\\n\t\t\t__pAd->chipOps.ATETssiCalibrationExtend(__pAd, __pData)\t\n\n#define RTMP_CHIP_ATE_READ_EXTERNAL_TSSI(__pAd, __pData)\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.ATEReadExternalTSSI != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.ATEReadExternalTSSI(__pAd, __pData)\t\n\n#define RTMP_CHIP_ASIC_TX_POWER_OFFSET_GET(__pAd, __pCfgOfTxPwrCtrlOverMAC)\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.AsicGetTxPowerOffset != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.AsicGetTxPowerOffset(__pAd, __pCfgOfTxPwrCtrlOverMAC)\t\n\t\t\n#define RTMP_CHIP_ASIC_AUTO_AGC_OFFSET_GET(\t\t\t\t\t\t\t\t\t\\\n\t\t__pAd, __pDeltaPwr, __pTotalDeltaPwr, __pAgcCompensate, __pDeltaPowerByBbpR1)\t\\\n\t\tif (__pAd->chipOps.AsicTxAlcGetAutoAgcOffset != NULL)\t\t\t\t\\\n\t\t\t__pAd->chipOps.AsicTxAlcGetAutoAgcOffset(\t\t\t\t\t\t\\\n\t\t__pAd, __pDeltaPwr, __pTotalDeltaPwr, __pAgcCompensate, __pDeltaPowerByBbpR1)\n\n#define RTMP_CHIP_ASIC_EXTRA_POWER_OVER_MAC(__pAd)\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.AsicExtraPowerOverMAC != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.AsicExtraPowerOverMAC(__pAd)\n\n#define RTMP_CHIP_ASIC_GET_TSSI_RATIO(__pAd, __DeltaPwr)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.TSSIRatio(__DeltaPwr)\n\n#define RTMP_CHIP_ASIC_FREQ_CAL_STOP(__pAd)\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.AsicFreqCalStop != NULL)\t\t\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.AsicFreqCalStop(__pAd)\n\n#define RTMP_CHIP_IQ_CAL(__pAd, __pChannel)\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.ChipIQCalibration != NULL)\t\t\t\t\t\t\t\t\\\n\t\t\t __pAd->chipOps.ChipIQCalibration(__pAd, __pChannel)\n\n#define RTMP_CHIP_HIGH_POWER_TUNING(__pAd, __pRssi)\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.HighPowerTuning != NULL)\t\t\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.HighPowerTuning(__pAd, __pRssi)\n\n#define RTMP_CHIP_ANTENNA_INFO_DEFAULT_RESET(__pAd, __pAntenna)\t\t\t\t\\\n\t\tif (__pAd->chipOps.AsicAntennaDefaultReset != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.AsicAntennaDefaultReset(__pAd, __pAntenna)\n\n#define RTMP_NET_DEV_NICKNAME_INIT(__pAd)\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.NetDevNickNameInit != NULL)\t\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.NetDevNickNameInit(__pAd)\n\n#define RTMP_EEPROM_ASIC_INIT(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.NICInitAsicFromEEPROM != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.NICInitAsicFromEEPROM(__pAd)\n\n#define RTMP_CHIP_ASIC_INIT_TEMPERATURE_COMPENSATION(__pAd)\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.InitTemperCompensation != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.InitTemperCompensation(__pAd)\n\n#define RTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(__pAd)\t\t\t\t\t\t\\\n\t\tif (__pAd->chipOps.TemperCompensation != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.TemperCompensation(__pAd)\n\n#define RTMP_CHIP_SPECIFIC(__pAd, __FuncId, __pData, __Data)\t\t\t\t\\\n\t\tif ((__FuncId >= 0) && (__FuncId < CHIP_SPEC_RESV_FUNC))\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tif (__pAd->chipOps.ChipSpecFunc[__FuncId] != NULL)\t\t\t\t\t\\\n\t\t\t\t__pAd->chipOps.ChipSpecFunc[__FuncId](__pAd, __pData, __Data);\t\\\n\t\t}\n\n#define RTMP_CHIP_ASIC_RESET_BBP_AGENT(__pAd)\t\\\n\t\tif (__pAd->chipOps.AsicResetBbpAgent != NULL)\t\t\t\t\\\n\t\t\t__pAd->chipOps.AsicResetBbpAgent(__pAd)\n\n#define RTMP_CHIP_UPDATE_BEACON(__pAd, Offset, Value, Unit)\t\t\\\n\t\tif (__pAd->chipOps.BeaconUpdate != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.BeaconUpdate(__pAd, Offset, Value, Unit)\n\n#ifdef CARRIER_DETECTION_SUPPORT\n#define\tRTMP_CHIP_CARRIER_PROGRAM(__pAd, threshold)\t\t\t\t\t\t\t\\\n\t\tif(__pAd->chipOps.ToneRadarProgram != NULL)\t\t\t\t\t\\\n\t\t\t__pAd->chipOps.ToneRadarProgram(__pAd, threshold)\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#define RTMP_CHIP_CCK_MRC_STATUS_CTRL(__pAd)\t\t\t\t\t\t\\\n\t\tif(__pAd->chipOps.CckMrcStatusCtrl != NULL)\t\t\t\t\\\n\t\t\t__pAd->chipOps.CckMrcStatusCtrl(__pAd)\n\n#define RTMP_CHIP_RADAR_GLRT_COMPENSATE(__pAd)\t\t\t\t\t\t\\\n\t\t\t\t\tif(__pAd->chipOps.RadarGLRTCompensate != NULL)\t\t\t\t\\\n\t\t\t\t\t\t__pAd->chipOps.RadarGLRTCompensate(__pAd)\n\n\n#define RTMP_CHIP_CALIBRATION(__pAd, __CalibrationID, __parameter) \\\ndo {\t\\\n\tif(__pAd->chipOps.Calibration != NULL) \\\n\t\t__pAd->chipOps.Calibration(__pAd, __CalibrationID, __parameter); \\\n} while (0)\n\n#define BURST_WRITE(_pAd, _Offset, _pData, _Cnt)\t\\\ndo {\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (_pAd->chipOps.BurstWrite != NULL)\t\t\\\n\t\t\t_pAd->chipOps.BurstWrite(_pAd, _Offset, _pData, _Cnt);\\\n} while (0)\n\n#define BURST_READ(_pAd, _Offset, _Cnt, _pData)\t\\\ndo {\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (_pAd->chipOps.BurstRead != NULL)\t\\\n\t\t\t_pAd->chipOps.BurstRead(_pAd, _Offset, _Cnt, _pData);\t\\\n} while (0)\n\n#define RANDOM_READ(_pAd, _RegPair, _Num)\t\\\ndo {\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (_pAd->chipOps.RandomRead != NULL)\t\\\n\t\t\t_pAd->chipOps.RandomRead(_pAd, _RegPair, _Num);\t\\\n} while (0)\n\n#define RF_RANDOM_READ(_pAd, _RegPair, _Num)\t\\\ndo {\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (_pAd->chipOps.RFRandomRead != NULL)\t\\\n\t\t\t_pAd->chipOps.RFRandomRead(_pAd, _RegPair, _Num); \\\n} while (0)\n\n#define READ_MODIFY_WRITE(_pAd, _RegPair, _Num)\t\\\ndo {\t\\\n\t\tif (_pAd->chipOps.ReadModifyWrite != NULL)\t\\\n\t\t\t_pAd->chipOps.ReadModifyWrite(_pAd, _RegPair, _Num);\t\\\n} while (0)\n\n#define RF_READ_MODIFY_WRITE(_pAd, _RegPair, _Num)\t\\\ndo {\t\\\n\t\tif (_pAd->chipOps.RFReadModifyWrite != NULL)\t\\\n\t\t\t_pAd->chipOps.RFReadModifyWrite(_pAd, _RegPair, _Num);\t\\\n} while (0)\n\n#define RANDOM_WRITE(_pAd, _RegPair, _Num)\t\\\ndo {\t\\\n\t\tif (_pAd->chipOps.RandomWrite != NULL)\t\\\n\t\t\t_pAd->chipOps.RandomWrite(_pAd, _RegPair, _Num);\t\\\n} while (0)\n\n#define RF_RANDOM_WRITE(_pAd, _RegPair, _Num)\t\\\ndo {\t\\\n\t\tif (_pAd->chipOps.RFRandomWrite != NULL)\t\\\n\t\t\t_pAd->chipOps.RFRandomWrite(_pAd, _RegPair, _Num);\t\\\n} while (0)\n\n#define DISABLE_TX_RX(_pAd, _Level)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.DisableTxRx != NULL)\t\\\n\t\t_pAd->chipOps.DisableTxRx(_pAd, _Level);\t\\\n} while (0)\n\n#define ASIC_RADIO_ON(_pAd, _Stage)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.AsicRadioOn != NULL)\t\\\n\t\t_pAd->chipOps.AsicRadioOn(_pAd, _Stage);\t\\\n} while (0)\n\n#define ASIC_RADIO_OFF(_pAd, _Stage)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.AsicRadioOff != NULL)\t\\\n\t\t_pAd->chipOps.AsicRadioOff(_pAd, _Stage);\t\\\n} while (0)\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n#define ASIC_MEASURE_FALSE_CCA(_pAd)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.AsicMeasureFalseCCA != NULL)\t\\\n\t\t_pAd->chipOps.AsicMeasureFalseCCA(_pAd);\t\\\n} while (0)\n\n#define ASIC_MITIGATE_MICROWAVE(_pAd)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.AsicMitigateMicrowave != NULL)\t\\\n\t\t_pAd->chipOps.AsicMitigateMicrowave(_pAd);\t\\\n} while (0)\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n#define ASIC_WOW_ENABLE(_pAd)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.AsicWOWEnable != NULL)\t\\\n\t\t_pAd->chipOps.AsicWOWEnable(_pAd);\t\\\n} while (0)\n\n#define ASIC_WOW_DISABLE(_pAd)\t\\\ndo {\t\\\n\tif (_pAd->chipOps.AsicWOWDisable != NULL)\t\\\n\t\t_pAd->chipOps.AsicWOWDisable(_pAd);\t\\\n} while(0)\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n/* function prototype */\nVOID RtmpChipOpsHook(VOID *pCB);\n\nVOID RtmpChipBcnInit(struct _RTMP_ADAPTER *pAd);\nVOID RtmpChipBcnSpecInit(struct _RTMP_ADAPTER *pAd);\n#ifdef RLT_MAC\nVOID rlt_bcn_buf_init(struct _RTMP_ADAPTER *pAd);\n#endif /* RLT_MAC */\n\nVOID RtmpChipWriteHighMemory(\n\tIN\tstruct _RTMP_ADAPTER *pAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tUINT32\t\t\tValue,\n\tIN\tUINT8\t\t\tUnit);\n\nVOID RtmpChipWriteMemory(\n\tIN\tstruct _RTMP_ADAPTER *pAd,\n\tIN\tUSHORT\t\t\tOffset,\n\tIN\tUINT32\t\t\tValue,\n\tIN\tUINT8\t\t\tUnit);\n\nVOID RTMPReadChannelPwr(struct _RTMP_ADAPTER *pAd);\nVOID RTMPReadTxPwrPerRate(struct _RTMP_ADAPTER *pAd);\n\n\nVOID NetDevNickNameInit(IN struct _RTMP_ADAPTER *pAd);\n\n\n\n#ifdef GREENAP_SUPPORT\nVOID EnableAPMIMOPSv2(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower);\nVOID DisableAPMIMOPSv2(struct _RTMP_ADAPTER *pAd);\nVOID EnableAPMIMOPSv1(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower);\nVOID DisableAPMIMOPSv1(struct _RTMP_ADAPTER *pAd);\n#endif /* GREENAP_SUPPORT */\n\n\n/* global variable */\nextern FREQUENCY_ITEM RtmpFreqItems3020[];\nextern FREQUENCY_ITEM FreqItems3020_Xtal20M[];\nextern UCHAR NUM_OF_3020_CHNL;\nextern FREQUENCY_ITEM *FreqItems3020;\nextern RTMP_RF_REGS RF2850RegTable[];\nextern UCHAR NUM_OF_2850_CHNL;\n\nBOOLEAN AsicWaitPDMAIdle(struct _RTMP_ADAPTER *pAd, INT round, INT wait_us);\nINT AsicSetPreTbttInt(struct _RTMP_ADAPTER *pAd, BOOLEAN enable);\nINT AsicReadAggCnt(struct _RTMP_ADAPTER *pAd, ULONG *aggCnt, int cnt_len);\n\n#endif /* __RTMP_CHIP_H__ */\n"
  },
  {
    "path": "src/include/rtmp_cmd.h",
    "content": "#ifndef __RTMP_CMD_H__\n#define __RTMP_CMD_H__\n\n#include \"rtmp_type.h\"\n\ntypedef struct _CmdQElmt {\n\tUINT command;\n\tPVOID buffer;\n\tULONG bufferlength;\n\tBOOLEAN CmdFromNdis;\n\tBOOLEAN SetOperation;\n\tstruct _CmdQElmt *next;\n} CmdQElmt, *PCmdQElmt;\n\ntypedef struct _CmdQ {\n\tUINT size;\n\tCmdQElmt *head;\n\tCmdQElmt *tail;\n\tUINT32 CmdQState;\n} CmdQ, *PCmdQ;\n\n#define EnqueueCmd(cmdq, cmdqelmt)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tif (cmdq->size == 0)\t\t\t\t\\\n\t\tcmdq->head = cmdqelmt;\t\t\t\\\n\telse\t\t\t\t\t\t\t\t\\\n\t\tcmdq->tail->next = cmdqelmt;\t\\\n\tcmdq->tail = cmdqelmt;\t\t\t\t\\\n\tcmdqelmt->next = NULL;\t\t\t\t\\\n\tcmdq->size++;\t\t\t\t\t\t\\\n}\n\n#define NDIS_OID\tUINT\n\n/* OS_RTCMDUp is only used in UTIL/NETIF module */\n#define OS_RTCMDUp\t\t\t\t\t\tRtmpOsCmdUp\n\n\n\n/* RALINK command status code */\n#define RTMP_IO_EINVAL\t\t\t\t\t\t\t30000\n#define RTMP_IO_EOPNOTSUPP\t\t\t\t\t\t30001\n#define RTMP_IO_EFAULT\t\t\t\t\t\t\t30002\n#define RTMP_IO_ENETDOWN\t\t\t\t\t\t30003\n#define RTMP_IO_E2BIG\t\t\t\t\t\t\t30004\n#define RTMP_IO_ENOMEM\t\t\t\t\t\t\t30005\n#define RTMP_IO_EAGAIN\t\t\t\t\t\t\t30006\n#define RTMP_IO_ENOTCONN\t\t\t\t\t\t30007\n\nenum {\n#ifdef MAT_SUPPORT\n\tSHOW_IPV4_MAT_INFO = 1,\n\tSHOW_IPV6_MAT_INFO = 2,\n\tSHOW_ETH_CLONE_MAC = 3,\n#endif /* MAT_SUPPORT */\n\tSHOW_CONN_STATUS = 4,\n\tSHOW_DRVIER_VERION = 5,\n\tSHOW_BA_INFO = 6,\n\tSHOW_DESC_INFO = 7,\n#ifdef RTMP_MAC_USB\n\tSHOW_RXBULK_INFO = 8,\n\tSHOW_TXBULK_INFO = 9,\n#endif /* RTMP_MAC_USB */\n\tRAIO_OFF = 10,\n\tRAIO_ON = 11,\n#ifdef QOS_DLS_SUPPORT\n\tSHOW_DLS_ENTRY_INFO = 20,\n#endif /* QOS_DLS_SUPPORT */\n\tSHOW_CFG_VALUE = 21,\n\tSHOW_ADHOC_ENTRY_INFO = 22,\n#ifdef DOT11Z_TDLS_SUPPORT\n\tSHOW_TDLS_ENTRY_INFO = 25,\n#endif /* DOT11Z_TDLS_SUPPORT */\n\tSHOW_DEV_INFO = 26,\n\tSHOW_STA_INFO = 27,\n};\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\nenum {\n\tWSC_CREDENTIAL_COUNT = 1,\n\tWSC_CREDENTIAL_SSID = 2,\n\tWSC_CREDENTIAL_AUTH_MODE = 3,\n\tWSC_CREDENTIAL_ENCR_TYPE = 4,\n\tWSC_CREDENTIAL_KEY_INDEX = 5,\n\tWSC_CREDENTIAL_KEY = 6,\n\tWSC_CREDENTIAL_MAC = 7,\n\tWSC_SET_DRIVER_CONNECT_BY_CREDENTIAL_IDX = 8,\n\tWSC_SET_DRIVER_AUTO_CONNECT = 9,\n\tWSC_SET_CONF_MODE = 10,\t/* Enrollee or Registrar */\n\tWSC_SET_MODE = 11,\t/* PIN or PBC */\n\tWSC_SET_PIN = 12,\n\tWSC_SET_SSID = 13,\n\tWSC_START = 14,\n\tWSC_STOP = 15,\n\tWSC_GEN_PIN_CODE = 16,\n\tWSC_AP_BAND = 17,\n\tWSC_SET_BSSID = 18,\n};\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n#define\tRT_ASSOC_EVENT_FLAG                         0x0101\n#define\tRT_DISASSOC_EVENT_FLAG                      0x0102\n#define\tRT_REQIE_EVENT_FLAG                         0x0103\n#define\tRT_RESPIE_EVENT_FLAG                        0x0104\n#define\tRT_ASSOCINFO_EVENT_FLAG                     0x0105\n#define RT_PMKIDCAND_FLAG                           0x0106\n#define RT_INTERFACE_DOWN                           0x0107\n#define RT_INTERFACE_UP                             0x0108\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n/* RALINK command handle ID */\n/* ap commands */\ntypedef enum _CMD_RTPRIV_IOCTL_AP {\n\n\t/* general */\n\tCMD_RTPRIV_IOCTL_SET_WSCOOB = 0x0001,\n\tCMD_RTPRIV_IOCTL_GET_MAC_TABLE,\n\tCMD_RTPRIV_IOCTL_GSITESURVEY,\n\tCMD_RTPRIV_IOCTL_STATISTICS,\n\tCMD_RTPRIV_IOCTL_QUERY_BATABLE,\n\tCMD_RTPRIV_IOCTL_E2P,\n\tCMD_RTPRIV_IOCTL_BBP,\n\tCMD_RTPRIV_IOCTL_MAC,\n\tCMD_RTPRIV_IOCTL_RF,\n\tCMD_RT_PRIV_IOCTL,\n\tCMD_RTPRIV_IOCTL_SET,\n\tCMD_RTPRIV_IOCTL_SHOW,\n\tCMD_RTPRIV_IOCTL_GET_AR9_SHOW,\n\tCMD_RTPRIV_IOCTL_ATE,\n\tCMD_RTPRIV_IOCTL_CHID_2_FREQ,\n\tCMD_RTPRIV_IOCTL_FREQ_2_CHID,\n\tCMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT,\n\n\t/* mbss */\n\tCMD_RTPRIV_IOCTL_MBSS_BEACON_UPDATE,\n\tCMD_RTPRIV_IOCTL_MBSS_OPEN,\n\tCMD_RTPRIV_IOCTL_MBSS_CLOSE,\n\tCMD_RTPRIV_IOCTL_MBSS_INIT,\n\tCMD_RTPRIV_IOCTL_MBSS_REMOVE,\n\n\t/* wsc */\n\tCMD_RTPRIV_IOCTL_WSC_PROFILE,\n\tCMD_RTPRIV_IOCTL_WSC_INIT,\n\n\t/* apc */\n\tCMD_RTPRIV_IOCTL_APC_UP,\n\tCMD_RTPRIV_IOCTL_APC_DISCONNECT,\n\tCMD_RTPRIV_IOCTL_APC_INIT,\n\tCMD_RTPRIV_IOCTL_APC_OPEN,\n\tCMD_RTPRIV_IOCTL_APC_CLOSE,\n\tCMD_RTPRIV_IOCTL_APC_REMOVE,\n\n\t/* interface */\n\tCMD_RTPRIV_IOCTL_MAIN_OPEN,\n\n\t/* ioctl */\n\tCMD_RTPRIV_IOCTL_PREPARE,\n\tCMD_RTPRIV_IOCTL_AP_SIOCGIWAP,\n\tCMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR,\n\tCMD_RTPRIV_IOCTL_AP_SIOCGIWESSID,\n\tCMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ,\n\tCMD_RTPRIV_IOCTL_AP_SIOCSIWGENIE,\n\n\t/* can not exceed 0x5000 */\n} CMD_RTPRIV_IOCTL_AP;\n\n/* common commands */\ntypedef enum _CMD_RTPRIV_IOCTL_COMMON {\n\n\t/* general */\n\tCMD_RTPRIV_IOCTL_NETDEV_GET = 0x5000,\n\tCMD_RTPRIV_IOCTL_NETDEV_SET,\n\tCMD_RTPRIV_IOCTL_OPMODE_GET,\n\tCMD_RTPRIV_IOCTL_TASK_LIST_GET,\n\tCMD_RTPRIV_IOCTL_IRQ_INIT,\n\tCMD_RTPRIV_IOCTL_IRQ_RELEASE,\n\tCMD_RTPRIV_IOCTL_MSI_ENABLE,\n\tCMD_RTPRIV_IOCTL_NIC_NOT_EXIST,\n\tCMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR,\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\tCMD_RTPRIV_IOCTL_MAX_IN_BIT,\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n//#ifdef CONFIG_PM\n//#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tCMD_RTPRIV_IOCTL_USB_DEV_GET,\n\tCMD_RTPRIV_IOCTL_ADAPTER_SEND_DISSASSOCIATE,\n\tCMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_TEST,\n\tCMD_RTPRIV_IOCTL_ADAPTER_IDLE_RADIO_OFF_TEST,\n//#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tCMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_STATUS,\n\tCMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_ENABLE,\n\tCMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_DISABLE,\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n//#endif /* CONFIG_PM */\n\tCMD_RTPRIV_IOCTL_AP_BSSID_GET,\n#endif /* CONFIG_STA_SUPPORT */\n\tCMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET,\n\tCMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR,\n\tCMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF,\n\tCMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON,\n\tCMD_RTPRIV_IOCTL_SANITY_CHECK,\n\tCMD_RTPRIV_IOCTL_SANITY_CHECK_ON_SET_CMD,\t\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tCMD_RTPRIV_SET_PRECONFIG_VALUE,\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\n\t/* mesh */\n\tCMD_RTPRIV_IOCTL_MESH_INIT,\n\tCMD_RTPRIV_IOCTL_MESH_REMOVE,\n\tCMD_RTPRIV_IOCTL_MESH_OPEN_PRE,\n\tCMD_RTPRIV_IOCTL_MESH_OPEN_POST,\n\tCMD_RTPRIV_IOCTL_MESH_IS_VALID,\n\tCMD_RTPRIV_IOCTL_MESH_CLOSE,\n\n\t/* p2p */\n\tCMD_RTPRIV_IOCTL_P2P_INIT,\n\tCMD_RTPRIV_IOCTL_P2P_REMOVE,\n\tCMD_RTPRIV_IOCTL_P2P_OPEN_PRE,\n\tCMD_RTPRIV_IOCTL_P2P_OPEN_POST,\n\tCMD_RTPRIV_IOCTL_P2P_IS_VALID,\n\tCMD_RTPRIV_IOCTL_P2P_CLOSE,\n\n\t/* usb */\n\tCMD_RTPRIV_IOCTL_USB_MORE_FLAG_SET,\n\tCMD_RTPRIV_IOCTL_USB_CONFIG_INIT,\n\tCMD_RTPRIV_IOCTL_USB_SUSPEND,\n\tCMD_RTPRIV_IOCTL_USB_RESUME,\n\n\t/* pci */\n\tCMD_RTPRIV_IOCTL_PCI_SUSPEND,\n\tCMD_RTPRIV_IOCTL_PCI_RESUME,\n\tCMD_RTPRIV_IOCTL_PCI_CSR_SET,\n\tCMD_RTPRIV_IOCTL_PCIE_INIT,\n\n\t/* cfg80211 */\n\tCMD_RTPRIV_IOCTL_CFG80211_CFG_START,\n\n\t/* inf ppa */\n\tCMD_RTPRIV_IOCTL_INF_PPA_INIT,\n\tCMD_RTPRIV_IOCTL_INF_PPA_EXIT,\n\n\t/* wireless */\n\tCMD_RTPRIV_IOCTL_BEACON_UPDATE,\n\tCMD_RTPRIV_IOCTL_RXPATH_GET,\n\tCMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET,\n\tCMD_RTPRIV_IOCTL_CHAN_LIST_GET,\n\tCMD_RTPRIV_IOCTL_FREQ_LIST_GET,\n\n\t/* interface */\n\tCMD_RTPRIV_IOCTL_VIRTUAL_INF_UP,\n\tCMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN,\n\tCMD_RTPRIV_IOCTL_VIRTUAL_INF_GET,\n\tCMD_RTPRIV_IOCTL_INF_TYPE_GET,\n\tCMD_RTPRIV_IOCTL_INF_STATS_GET,\n\tCMD_RTPRIV_IOCTL_INF_IW_STATUS_GET,\n\tCMD_RTPRIV_IOCTL_INF_MAIN_CREATE,\n\tCMD_RTPRIV_IOCTL_INF_MAIN_ID_GET,\n\tCMD_RTPRIV_IOCTL_INF_MAIN_CHECK,\n\tCMD_RTPRIV_IOCTL_INF_P2P_CHECK,\n\n\t/* ioctl */\n\tCMD_RTPRIV_IOCTL_SIOCGIWFREQ,\n\tCMD_RTPRIV_IOCTL_SIOCGIWNAME,\n\n\t/* wds */\n\tCMD_RTPRIV_IOCTL_WDS_INIT,\n\tCMD_RTPRIV_IOCTL_WDS_REMOVE,\n\tCMD_RTPRIV_IOCTL_WDS_STATS_GET,\n\n\tCMD_RTPRIV_IOCTL_MAC_ADDR_GET,\n\n#ifdef RT_CFG80211_SUPPORT\n\t/* cfg802.11 */\n\t/* Note: All cfg commands must be continue. */\n\tCMD_RTPRIV_IOCTL_80211_START,\n\tCMD_RTPRIV_IOCTL_80211_CB_GET,\n\tCMD_RTPRIV_IOCTL_80211_CB_SET,\n\tCMD_RTPRIV_IOCTL_80211_CHAN_SET,\n\tCMD_RTPRIV_IOCTL_80211_VIF_CHG,\n\tCMD_RTPRIV_IOCTL_80211_SCAN,\n\tCMD_RTPRIV_IOCTL_80211_IBSS_JOIN,\n\tCMD_RTPRIV_IOCTL_80211_STA_LEAVE,\n\tCMD_RTPRIV_IOCTL_80211_STA_GET,\n\tCMD_RTPRIV_IOCTL_80211_KEY_ADD,\n\tCMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET,\n\tCMD_RTPRIV_IOCTL_80211_CONNECT_TO,\n\tCMD_RTPRIV_IOCTL_80211_RFKILL,\n\tCMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO,\n\tCMD_RTPRIV_IOCTL_80211_UNREGISTER,\n\tCMD_RTPRIV_IOCTL_80211_BANDINFO_GET,\n\tCMD_RTPRIV_IOCTL_80211_SURVEY_GET,\n\tCMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET,\n\tCMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_SET,\n\tCMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG,\n\tCMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK,\n\tCMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND,\n\tCMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_DUR_TIMER_INIT,\n\tCMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET,\n\tCMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG,\n\tCMD_RTPRIV_IOCTL_80211_BEACON_ADD,\n\tCMD_RTPRIV_IOCTL_80211_BEACON_SET,\n\tCMD_RTPRIV_IOCTL_80211_BEACON_DEL,\n\tCMD_RTPRIV_IOCTL_80211_AP_KEY_ADD,\n\tCMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM,\n\tCMD_RTPRIV_IOCTL_80211_AP_KEY_DEL,\n\tCMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP,\n\tCMD_RTPRIV_IOCTL_80211_PORT_SECURED,\n\tCMD_RTPRIV_IOCTL_80211_AP_STA_DEL,\n\tCMD_RTPRIV_IOCTL_80211_CANCEL_REMAIN_ON_CHAN_SET,\n\tCMD_RTPRIV_IOCTL_80211_BITRATE_SET,\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\tCMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT,\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\tCMD_RTPRIV_IOCTL_80211_END,\n#endif /* RT_CFG80211_SUPPORT */\n\n\tCMD_RTPRIV_IOCTL_ADAPTER_CSO_SUPPORT_TEST,\n\tCMD_RTPRIV_IOCTL_ADAPTER_TSO_SUPPORT_TEST,\n\n\t/* can not exceed 0xa000 */\n\tCMD_RTPRIV_IOCTL_80211_COM_LATEST_ONE,\n} CMD_RTPRIV_IOCTL_COMMON;\n\n#ifdef RT_CFG80211_SUPPORT\ntypedef struct __CMD_RTPRIV_IOCTL_80211_CHAN {\n\n\tUINT8 ChanId;\n\n#define RT_CMD_80211_IFTYPE_STATION\t\t0x00\n#define RT_CMD_80211_IFTYPE_ADHOC\t\t0x01\n#define RT_CMD_80211_IFTYPE_MONITOR\t\t0x02\n\tUINT8 IfType;\n\n#define RT_CMD_80211_CHANTYPE_NOHT\t\t0x00\n#define RT_CMD_80211_CHANTYPE_HT20\t\t0x01\n#define RT_CMD_80211_CHANTYPE_HT40MINUS\t0X02\n#define RT_CMD_80211_CHANTYPE_HT40PLUS\t0X03\n\tUINT8 ChanType;\n\n\tUINT32 MonFilterFlag;\n} CMD_RTPRIV_IOCTL_80211_CHAN;\n\n#define RT_CMD_80211_FILTER_FCSFAIL\t\t0x01\n#define RT_CMD_80211_FILTER_PLCPFAIL\t0x02\n#define RT_CMD_80211_FILTER_CONTROL\t\t0x04\n#define RT_CMD_80211_FILTER_OTHER_BSS\t0x08\n\ntypedef struct __CMD_RTPRIV_IOCTL_80211_IBSS {\n\n\tUINT32 BeaconInterval;\n\tUCHAR *pSsid;\n} CMD_RTPRIV_IOCTL_80211_IBSS;\n\ntypedef struct __CMD_RTPRIV_IOCTL_80211_STA {\n\n\tUINT8 MAC[6];\n\tULONG DataRate;\n\n#define RT_CMD_80211_TXRATE_LEGACY\t\t0x01\n#define RT_CMD_80211_TXRATE_BW_40\t\t0x02\n#define RT_CMD_80211_TXRATE_SHORT_GI\t0x04\n\tUINT32 TxRateFlags;\n\t\n\tUINT32 TxRateMCS;\n\tINT32 Signal;\n\tUINT32 TxPacketCnt;\n\tUINT32 InactiveTime;\n} CMD_RTPRIV_IOCTL_80211_STA;\n\ntypedef struct __CMD_RTPRIV_IOCTL_80211_KEY {\n\n#define RT_CMD_80211_KEY_WEP\t\t\t0x00\n#define RT_CMD_80211_KEY_WPA\t\t\t0x01\n\tUINT8 KeyType;\n\tUINT8 KeyBuf[50];\n\tUINT8 KeyId;\n} CMD_RTPRIV_IOCTL_80211_KEY;\n\ntypedef struct __CMD_RTPRIV_IOCTL_80211_CONNECT {\n\n\tUINT8 WpaVer;\n\tBOOLEAN FlgIs8021x;\n\tBOOLEAN FlgIsAuthOpen;\n\n#define RT_CMD_80211_CONN_ENCRYPT_NONE\t0x01\n#define RT_CMD_80211_CONN_ENCRYPT_WEP\t0x02\n#define RT_CMD_80211_CONN_ENCRYPT_TKIP\t0x04\n#define RT_CMD_80211_CONN_ENCRYPT_CCMP\t0x08\n\tUINT8 PairwiseEncrypType;\n\tUINT8 GroupwiseEncrypType;\n\n\tUINT8 *pKey;\n\tUINT32 KeyLen;\n\tUINT8 KeyIdx;\n\n\tUINT8 *pSsid;\n\tUINT32 SsidLen;\n} CMD_RTPRIV_IOCTL_80211_CONNECT;\n\ntypedef struct __CMD_RTPRIV_IOCTL_80211_REG_NOTIFY {\n\n\tUCHAR Alpha2[2];\n\tVOID *pWiphy;\n} CMD_RTPRIV_IOCTL_80211_REG_NOTIFY;\n\ntypedef struct __CMD_RTPRIV_IOCTL_80211_SURVEY {\n\n\tVOID *pCfg80211;\n/*\tUINT64 ChannelTime; */ /* idle + busy, not support */\n\tUINT64 ChannelTimeBusy;\n\tUINT64 ChannelTimeExtBusy;\n} CMD_RTPRIV_IOCTL_80211_SURVEY;\n\n#endif /* RT_CFG80211_SUPPORT */\n\n/* station commands */\n#ifdef CONFIG_STA_SUPPORT\ntypedef enum _CMD_RTPRIV_IOCTL_STATION {\n\n\t/* general */\n\tCMD_RTPRIV_IOCTL_PARAM_SET = 0xa000,\n\tCMD_RTPRIV_IOCTL_SITESURVEY_GET,\n\tCMD_RTPRIV_IOCTL_SITESURVEY,\n\tCMD_RTPRIV_IOCTL_ORI_DEV_TYPE_SET,\n\tCMD_RTPRIV_IOCTL_STA_SCAN_SANITY_CHECK,\n\tCMD_RTPRIV_IOCTL_STA_SCAN_END,\n\n\t/* wireless */\n\tCMD_RTPRIV_IOCTL_BSS_LIST_GET,\n\n\t/* standard ioctl */\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWFREQ,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWFREQ,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWMODE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWMODE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWAP,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWAP,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWSCAN,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWSCAN,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWESSID,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWESSID,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWNICKN,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWNICKN,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWRTS,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWRTS,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWFRAG,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWFRAG,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWENCODE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWENCODE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWMLME,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWAUTH,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWAUTH,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWENCODEEXT,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWENCODEEXT,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWGENIE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWGENIE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWPMKSA,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWRATE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIWRATE,\n\tCMD_RTPRIV_IOCTL_STA_SIOCGIFHWADDR,\n\tCMD_RTPRIV_IOCTL_STA_SIOCSIWPRIVRSSI,\n\n\tCMD_RTPRIV_IOCTL_STA_IW_SET_WSC_U32_ITEM,\n\tCMD_RTPRIV_IOCTL_STA_IW_SET_WSC_STR_ITEM,\n\tCMD_RTPRIV_IOCTL_STA_IW_GET_STATISTICS,\n} CMD_RTPRIV_IOCTL_STATION;\n\n#define RT_CMD_MODE_ADHOC\t\t\t\t\t\t\t\t0x01\n#define RT_CMD_MODE_INFRA\t\t\t\t\t\t\t\t0x02\n#define RT_CMD_MODE_MONITOR\t\t\t\t\t\t\t\t0x03\n#endif /* CONFIG_STA_SUPPORT */\n\n/* when adding any new type, please also add codes in LINUX_WEVENT_TRANSLATE */\n#define RT_WLAN_EVENT_CUSTOM\t\t\t\t\t\t\t0x01\n#define RT_WLAN_EVENT_CGIWAP\t\t\t\t\t\t\t0x02\n#define RT_WLAN_EVENT_ASSOC_REQ_IE\t\t\t\t\t\t0x03\n#define RT_WLAN_EVENT_SCAN\t\t\t\t\t\t\t\t0x04\n#define RT_WLAN_EVENT_EXPIRED\t\t\t\t\t\t\t0x05\n#define RT_WLAN_EVENT_SHOWPIN\t\t\t\t\t\t\t0x06\n#define RT_WLAN_EVENT_PIN\t\t\t\t\t\t\t0x07\n\ntypedef struct __RT_CMD_RATE_SET {\n\tIN UINT32 Rate;\n\tIN UINT32 Fixed;\n} RT_CMD_RATE_SET;\n\ntypedef struct __RT_CMD_PARAM_SET {\n\tIN PSTRING pThisChar;\n\tIN PSTRING pValue;\n} RT_CMD_PARAM_SET;\n\ntypedef struct __RT_CMD_SHARED_KEY_ADD {\n\tIN UCHAR KeyIdx;\n\tIN BOOLEAN FlgHaveGTK;\n} RT_CMD_SHARED_KEY_ADD;\n\ntypedef struct __RT_CMD_MBSS_KICKOUT {\n\tIN INT BssId;\n\tIN USHORT Reason;\n} RT_CMD_MBSS_KICKOUT;\n\ntypedef struct __RT_CMD_USB_MORE_FLAG_CONFIG {\n\tIN UINT32 VendorID;\n\tIN UINT32 ProductID;\n} RT_CMD_USB_MORE_FLAG_CONFIG;\n\ntypedef struct __RT_CMD_USB_DEV_CONFIG {\n\tIN UINT NumberOfPipes;\n\tIN UINT8 BulkInEpAddr[2];\n\tIN USHORT BulkInMaxPacketSize;\n\tIN UINT8 BulkOutEpAddr[6];\n\tIN USHORT BulkOutMaxPacketSize;\n\tIN VOID *pConfig;\n} RT_CMD_USB_DEV_CONFIG;\n\ntypedef struct __RT_CMD_CFG80211_CONFIG {\n\tIN VOID *pCfgDev;\n\tIN VOID(\n\t*CFG80211_Register) (\n\tIN VOID * pAd,\n\tIN VOID * pDev,\n\tIN VOID * pNetDev);\n} RT_CMD_CFG80211_CONFIG;\n\ntypedef struct __RT_CMD_WAIT_QUEUE_LIST {\n\tOUT RTMP_OS_TASK *pMlmeTask;\n\tOUT RTMP_OS_TASK *pTimerTask;\n\tOUT RTMP_OS_TASK *pCmdQTask;\n\tOUT RTMP_OS_TASK *pWscTask;\n} RT_CMD_WAIT_QUEUE_LIST;\n\ntypedef struct __RT_CMD_INF_UP_DOWN {\n\n\tIN\tint (*rt28xx_open)(VOID *net_dev);\n\tIN\tint (*rt28xx_close)(VOID *net_dev);\n} RT_CMD_INF_UP_DOWN;\n\ntypedef struct __RT_CMD_STATS {\n\tIN VOID *pNetDev;\n\tOUT VOID *pStats;\t/* point to pAd->stats */\n\n\tOUT unsigned long rx_packets;\t/* total packets received       */\n\tOUT unsigned long tx_packets;\t/* total packets transmitted */\n\tOUT unsigned long rx_bytes;\t/* total bytes received         */\n\tOUT unsigned long tx_bytes;\t/* total bytes transmitted      */\n\tOUT unsigned long rx_errors;\t/* bad packets received         */\n\tOUT unsigned long tx_errors;\t/* packet transmit problems     */\n\tOUT unsigned long multicast;\t/* multicast packets received */\n\tOUT unsigned long collisions;\n\n\tOUT unsigned long rx_over_errors;\t/* receiver ring buff overflow  */\n\tOUT unsigned long rx_crc_errors;\t/* recved pkt with crc error    */\n\tOUT unsigned long rx_frame_errors;\t/* recv'd frame alignment error */\n\tOUT unsigned long rx_fifo_errors;\t/* recv'r fifo overrun                  */\n} RT_CMD_STATS;\n\ntypedef struct __RT_CMD_IW_STATS {\n\n\tULONG priv_flags;\n\tUCHAR *dev_addr;\n\n\tVOID *pStats;\t\t/* point to pAd->iw_stats */\n\n\tUINT8 qual;\n\tUINT8 level;\n\tUINT8 noise;\n\tUINT8 updated;\n} RT_CMD_IW_STATS;\n\ntypedef struct __RT_CMD_PCIE_INIT {\n\n\tIN VOID *pPciDev;\n\tIN UINT32 ConfigDeviceID;\n\tIN UINT32 ConfigSubsystemVendorID;\n\tIN UINT32 ConfigSubsystemID;\n} RT_CMD_PCIE_INIT;\n\ntypedef struct __RT_CMD_AP_IOCTL_CONFIG {\n\tIN VOID *net_dev;\n\tIN ULONG priv_flags;\n\tIN char *pCmdData;\n\tIN INT32 CmdId_RTPRIV_IOCTL_SET;\n\tIN char *name;\n\tIN INT apidx;\n\n\tOUT INT32 Status;\n} RT_CMD_AP_IOCTL_CONFIG;\n\ntypedef struct __RT_CMD_AP_IOCTL_SSID {\n\tIN ULONG priv_flags;\n\tIN INT apidx;\n\n\tOUT char *pSsidStr;\n\tOUT INT32 length;\n} RT_CMD_AP_IOCTL_SSID;\n\ntypedef struct __RT_CMD_IOCTL_RATE {\n\tIN ULONG priv_flags;\n\tOUT UINT32 BitRate;\n} RT_CMD_IOCTL_RATE;\n\n#define RTMP_CMD_STA_MODE_AUTO\t\t\t0x00\n#define RTMP_CMD_STA_MODE_ADHOC\t\t\t0x01\n#define RTMP_CMD_STA_MODE_INFRA\t\t\t0x02\n#define RTMP_CMD_STA_MODE_MONITOR\t\t0x03\n\ntypedef struct __RT_CMD_STA_IOCTL_FREQ {\n\tIN INT32 m;\t\t/* Mantissa */\n\tIN INT16 e;\t\t/* Exponent */\n} RT_CMD_STA_IOCTL_FREQ;\n\ntypedef struct __RT_CMD_STA_IOCTL_BSS {\n\tOUT UCHAR Bssid[6];\n\tOUT UCHAR ChannelQuality;\n\tOUT CHAR Rssi;\n\tOUT CHAR Noise;\n} RT_CMD_STA_IOCTL_BSS;\n\ntypedef struct __RT_CMD_STA_IOCTL_BSS_LIST {\n\tIN UINT32 MaxNum;\n\tOUT UINT32 BssNum;\n\tOUT RT_CMD_STA_IOCTL_BSS *pList;\n} RT_CMD_STA_IOCTL_BSS_LIST;\n\ntypedef struct __RT_CMD_STA_IOCTL_SCAN {\n\tIN UCHAR FlgScanThisSsid;\n\tIN UINT32 SsidLen;\n\tIN CHAR *pSsid;\n\tOUT INT32 Status;\n} RT_CMD_STA_IOCTL_SCAN;\n\ntypedef struct __RT_CMD_STA_IOCTL_BSS_TABLE {\n\tOUT UCHAR Bssid[6];\n\tOUT UCHAR Channel;\n\tOUT UCHAR BssType;\n\tOUT UCHAR HtCapabilityLen;\n\n\tOUT UCHAR SupRate[12];\n\tOUT UCHAR SupRateLen;\n\tOUT UCHAR ExtRate[12];\n\tOUT UCHAR ExtRateLen;\n\n\tOUT UCHAR SsidLen;\n\tOUT CHAR Ssid[32];\n\n\tOUT USHORT CapabilityInfo;\n\tOUT UCHAR ChannelWidth, ShortGIfor40, ShortGIfor20, MCSSet;\n\n\tOUT USHORT WpaIeLen;\n\tOUT UCHAR *pWpaIe;\n\n\tOUT USHORT RsnIeLen;\n\tOUT UCHAR *pRsnIe;\n\n\tOUT USHORT WpsIeLen;\n\tOUT UCHAR *pWpsIe;\n\n\tOUT UCHAR FlgIsPrivacyOn;\n\n\tOUT RT_CMD_STA_IOCTL_BSS Signal;\n} RT_CMD_STA_IOCTL_BSS_TABLE;\n\ntypedef struct __RT_CMD_STA_IOCTL_SCAN_TABLE {\n\tIN ULONG priv_flags;\n\tOUT UINT32 BssNr;\n\tOUT RT_CMD_STA_IOCTL_BSS_TABLE *pBssTable;\t/* must be freed by caller */\n\tOUT UCHAR MainSharedKey[4][16];\n} RT_CMD_STA_IOCTL_SCAN_TABLE;\n\ntypedef struct __RT_CMD_STA_IOCTL_SSID {\n\tIN UCHAR FlgAnySsid;\n\tINOUT UINT32 SsidLen;\n\tINOUT CHAR *pSsid;\n\tOUT INT32 Status;\n} RT_CMD_STA_IOCTL_SSID;\n\ntypedef struct __RT_CMD_STA_IOCTL_NICK_NAME {\n\tOUT UINT NameLen;\n\tOUT CHAR *pName;\n} RT_CMD_STA_IOCTL_NICK_NAME;\n\ntypedef struct __RT_CMD_STA_IOCTL_SECURITY {\n\tINOUT CHAR *pData;\n\tINOUT UINT16 length;\n\tIN INT32 KeyIdx;\n\tIN INT32 MaxKeyLen;\n\n#define RT_CMD_STA_IOCTL_SECURITY_ALG_NONE\t\t0x01\n#define RT_CMD_STA_IOCTL_SECURITY_ALG_WEP\t\t0x02\n#define RT_CMD_STA_IOCTL_SECURITY_ALG_TKIP\t\t0x03\n#define RT_CMD_STA_IOCTL_SECURITY_ALG_CCMP\t\t0x04\n\tIN UINT32 Alg;\n\n#define RT_CMD_STA_IOCTL_SECURTIY_EXT_SET_TX_KEY\t0x01\n#define RT_CMD_STA_IOCTL_SECURTIY_EXT_GROUP_KEY\t\t0x02\n\tIN UINT16 ext_flags;\n\n#define RT_CMD_STA_IOCTL_SECURITY_DISABLED\t\t0x01\n#define RT_CMD_STA_IOCTL_SECURITY_ENABLED\t\t0x02\n#define RT_CMD_STA_IOCTL_SECURITY_RESTRICTED\t0x04\n#define RT_CMD_STA_IOCTL_SECURITY_OPEN\t\t\t0x08\n#define RT_CMD_STA_IOCTL_SECURITY_NOKEY\t\t\t0x10\n#define RT_CMD_STA_IOCTL_SECURITY_MODE\t\t\t0x20\n\tINOUT UINT16 flags;\n\n\tOUT INT32 Status;\n} RT_CMD_STA_IOCTL_SECURITY;\n\ntypedef struct __RT_CMD_STA_IOCTL_WSC_U32_ITEM {\n\tIN UINT32 *pUWrq;\n\tOUT INT32 Status;\n} RT_CMD_STA_IOCTL_WSC_U32_ITEM;\n\ntypedef struct __RT_CMD_STA_IOCTL_WSC_STR_ITEM {\n\tIN UINT32 Subcmd;\n\tIN CHAR *pData;\n\tIN UINT32 length;\n\n\tOUT INT32 Status;\n} RT_CMD_STA_IOCTL_WSC_STR_ITEM;\n\ntypedef struct __RT_CMD_STA_IOCTL_SHOW {\n\tIN CHAR *pData;\n\tIN UINT32 MaxSize;\n\tIN UINT32 InfType;\n} RT_CMD_STA_IOCTL_SHOW;\n\n#define RT_CMD_STA_IOCTL_IW_MLME_DEAUTH\t\t0x01\n#define RT_CMD_STA_IOCTL_IW_MLME_DISASSOC\t0x02\n\ntypedef struct __RT_CMD_STA_IOCTL_SECURITY_ADV {\n\n#define RT_CMD_STA_IOCTL_WPA_VERSION\t\t\t\t\t0x10\n#define RT_CMD_STA_IOCTL_WPA_VERSION1\t\t\t\t0x11\n#define RT_CMD_STA_IOCTL_WPA_VERSION2\t\t\t\t0x12\n\n#define RT_CMD_STA_IOCTL_WPA_PAIRWISE\t\t\t\t\t0x20\n#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_NONE\t\t\t0x21\n#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP40\t\t\t0x22\n#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP104\t\t0x23\n#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_TKIP\t\t\t0x24\n#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_CCMP\t\t\t0x25\n\n#define RT_CMD_STA_IOCTL_WPA_GROUP\t\t\t\t\t\t0x30\n#define RT_CMD_STA_IOCTL_WPA_GROUP_NONE\t\t\t\t0x31\n#define RT_CMD_STA_IOCTL_WPA_GROUP_WEP40\t\t\t0x32\n#define RT_CMD_STA_IOCTL_WPA_GROUP_WEP104\t\t\t0x33\n#define RT_CMD_STA_IOCTL_WPA_GROUP_TKIP\t\t\t\t0x34\n#define RT_CMD_STA_IOCTL_WPA_GROUP_CCMP\t\t\t\t0x35\n\n#define RT_CMD_STA_IOCTL_WPA_KEY_MGMT\t\t\t\t\t0x40\n#define RT_CMD_STA_IOCTL_WPA_KEY_MGMT_1X\t\t\t0x41\n#define RT_CMD_STA_IOCTL_WPA_KEY_MGMT_WPS\t\t\t0x42\n\n#define RT_CMD_STA_IOCTL_WPA_AUTH_RX_UNENCRYPTED_EAPOL\t0x50\n#define RT_CMD_STA_IOCTL_WPA_AUTH_PRIVACY_INVOKED\t\t0x60\n#define RT_CMD_STA_IOCTL_WPA_AUTH_DROP_UNENCRYPTED\t\t0x70\n\n#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG\t\t0x80\n#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_SHARED\t\t0x81\n#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_OPEN\t\t0x82\n#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_LEAP\t\t0x83\n\n#define RT_CMD_STA_IOCTL_WPA_AUTH_WPA_ENABLED\t\t\t0x90\n\n#define RT_CMD_STA_IOCTL_WPA_AUTH_COUNTERMEASURES\t\t\t0xA0\n\n\tIN UINT32 flags;\n\tIN UINT32 value;\n} RT_CMD_STA_IOCTL_SECURITY_ADV;\n\ntypedef struct __RT_CMD_STA_IOCTL_RSN_IE {\n\tINOUT UINT32 length;\n\tINOUT UCHAR *pRsnIe;\n} RT_CMD_STA_IOCTL_RSN_IE;\n\ntypedef struct __RT_CMD_STA_IOCTL_PMA_SA {\n#define RT_CMD_STA_IOCTL_PMA_SA_FLUSH\t\t\t\t\t0x01\n#define RT_CMD_STA_IOCTL_PMA_SA_REMOVE\t\t\t\t\t0x02\n#define RT_CMD_STA_IOCTL_PMA_SA_ADD\t\t\t\t\t\t0x03\n\tIN UINT32 Cmd;\n\tIN UCHAR *pBssid;\n\tIN UCHAR *pPmkid;\n} RT_CMD_STA_IOCTL_PMA_SA;\n\n#endif /* __RTMP_CMD_H__ */\n"
  },
  {
    "path": "src/include/rtmp_comm.h",
    "content": "/****************************************************************************\n\n    Module Name:\n\trtmp_comm.h\n\n\tAbstract:\n\tAll common definitions and macros for UTIL/DRIVER/NETIF.\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n\n***************************************************************************/  \n    \n#ifndef __RT_COMM_H__\n#define __RT_COMM_H__\n    \n#define VENDOR_FEATURE1_SUPPORT\n/*#define VENDOR_FEATURE3_SUPPORT */\n    \n    \n/*#define MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n    \n#ifdef CONFIG_STA_SUPPORT\n/*#define AGS_SUPPORT */\n#endif\t/* CONFIG_STA_SUPPORT */\n    \n#ifdef VENDOR_FEATURE3_SUPPORT \n#ifdef DOT1X_SUPPORT\n#undef DOT1X_SUPPORT\n#endif\t/* DOT1X_SUPPORT */\n#ifdef SYSTEM_LOG_SUPPORT\n#undef SYSTEM_LOG_SUPPORT\n#endif\t/* SYSTEM_LOG_SUPPORT */\n#ifdef LED_CONTROL_SUPPORT\n#undef LED_CONTROL_SUPPORT\n#endif\t/* LED_CONTROL_SUPPORT */\n#ifdef WSC_LED_SUPPORT\n#undef WSC_LED_SUPPORT\n#endif\t/* WSC_LED_SUPPORT */\n#endif /* VENDOR_FEATURE3_SUPPORT */\n    \n    \n#ifdef CONFIG_AP_SUPPORT\n    \n#ifndef VENDOR_FEATURE3_SUPPORT\n#define AP_QLOAD_SUPPORT\n#endif /* VENDOR_FEATURE3_SUPPORT */\n    \n#endif\t/* CONFIG_AP_SUPPORT */\n    \n\n/* ======================== Before include files ============================ */ \n/*\n\t14 channels @2.4G +  12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0 @Japan + 1 as NULL termination\n\tRefer to CH_HZ_ID_MAP[] in rt_channel.c\n\n*/\n#ifdef DOT11_VHT_AC\n#define MAX_NUM_OF_CHS             \t\t(54 + 5)\t/* 5 channels for central channel of VHT 80MHz */\n#else\n#define MAX_NUM_OF_CHS             \t\t54\n#endif /* DOT11_VHT_AC*/\n/* 14 channels @2.4G +  12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination */\n#define MAX_NUM_OF_CHANNELS             MAX_NUM_OF_CHS\n\n\n#include \"rtmp_type.h\"\n#include \"rtmp_os.h\"\n#include \"link_list.h\"\n#include \"rtmp_cmd.h\"\n#include \"iface/iface_util.h\"\n    \n\n\n\n/* ======================== Debug =========================================== */ \n/* */\n/*  Debug information verbosity: lower values indicate higher urgency */\n/* */\n#define RT_DEBUG_OFF        0\n#define RT_DEBUG_ERROR      1\n#define RT_DEBUG_WARN       2\n#define RT_DEBUG_TRACE      3\n#define RT_DEBUG_INFO       4\n#define RT_DEBUG_LOUD       5\n    \ntypedef enum{\n\tDBG_FUNC_RA = 0x100,\t/* debug flag for rate adaptation */\n\tDBG_FUNC_SA = 0x200,\t/* debug flag for smart antenna */\n}RT_DEBUG_FUNC;\n\n\n/* ======================== Definition ====================================== */ \n#ifndef TRUE\n#define TRUE\t\t\t\t\t\t1\n#endif\n#ifndef FALSE\n#define FALSE\t\t\t\t\t\t0\n#endif\n    \n/* definition of pAd->OpMode */\n#define OPMODE_STA                  0\n#define OPMODE_AP                   1\n#define OPMODE_APSTA\t\t\t\t2       /* as AP and STA at the same time */\n    \n#define MAIN_MBSSID                 0\n#define FIRST_MBSSID                1\n    \n/* Endian byte swapping codes */\n#define SWAP16(x) \\\n    ((UINT16) (\\\n\t       (((UINT16) (x) & (UINT16) 0x00ffU) << 8) | \\\n\t       (((UINT16) (x) & (UINT16) 0xff00U) >> 8))) \n \n#define SWAP32(x) \\\n    ((UINT32) (\\\n\t       (((UINT32) (x) & (UINT32) 0x000000ffUL) << 24) | \\\n\t       (((UINT32) (x) & (UINT32) 0x0000ff00UL) << 8) | \\\n\t       (((UINT32) (x) & (UINT32) 0x00ff0000UL) >> 8) | \\\n\t       (((UINT32) (x) & (UINT32) 0xff000000UL) >> 24))) \n\n#define SWAP64(x) \\\n    ((UINT64)( \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x00000000000000ffULL) << 56) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x000000000000ff00ULL) << 40) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x0000000000ff0000ULL) << 24) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x00000000ff000000ULL) <<  8) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x000000ff00000000ULL) >>  8) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x0000ff0000000000ULL) >> 24) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0x00ff000000000000ULL) >> 40) | \\\n    (UINT64)(((UINT64)(x) & (UINT64) 0xff00000000000000ULL) >> 56) ))\n \n#ifdef RT_BIG_ENDIAN\n\n#define cpu2le64(x) SWAP64((x))\n#define le2cpu64(x) SWAP64((x))\n#define cpu2le32(x) SWAP32((x))\n#define le2cpu32(x) SWAP32((x))\n#define cpu2le16(x) SWAP16((x))\n#define le2cpu16(x) SWAP16((x))\n#define cpu2be64(x) ((UINT64)(x))\n#define be2cpu64(x) ((UINT64)(x))\n#define cpu2be32(x) ((UINT32)(x))\n#define be2cpu32(x) ((UINT32)(x))\n#define cpu2be16(x) ((UINT16)(x))\n#define be2cpu16(x) ((UINT16)(x))\n    \n#else /* Little_Endian */\n    \n#define cpu2le64(x) ((UINT64)(x))\n#define le2cpu64(x) ((UINT64)(x))\n#define cpu2le32(x) ((UINT32)(x))\n#define le2cpu32(x) ((UINT32)(x))\n#define cpu2le16(x) ((UINT16)(x))\n#define le2cpu16(x) ((UINT16)(x))\n#define cpu2be64(x) SWAP64((x))\n#define be2cpu64(x) SWAP64((x))\n#define cpu2be32(x) SWAP32((x))\n#define be2cpu32(x) SWAP32((x))\n#define cpu2be16(x) SWAP16((x))\n#define be2cpu16(x) SWAP16((x))\n    \n#endif /* RT_BIG_ENDIAN */\n    \n\n#define MAX_CUSTOM_LEN 128 \n    \n/* */\n/* IEEE 802.11 Structures and definitions */\n/* */\n#define MAX_TX_POWER_LEVEL              100   /* mW */\n#define MAX_RSSI_TRIGGER                -10    /* dBm */\n#define MIN_RSSI_TRIGGER                -200   /* dBm */\n#define MAX_FRAG_THRESHOLD              2346  /* byte count */\n#define MIN_FRAG_THRESHOLD              256   /* byte count */\n#define MAX_RTS_THRESHOLD               2347  /* byte count */\n\ntypedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE \n { \nNdis802_11IBSS, \nNdis802_11Infrastructure, \nNdis802_11AutoUnknown, \nNdis802_11Monitor, \nNdis802_11InfrastructureMax\t/* Not a real value, defined as upper bound */\n} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;\n\n\n\n\n/* ======================== Memory ========================================== */ \n#ifdef VENDOR_FEATURE2_SUPPORT\n\nextern ULONG OS_NumOfPktAlloc, OS_NumOfPktFree;\n\n#define MEM_DBG_PKT_ALLOC_INC(__pPacket)\tOS_NumOfPktAlloc ++;\n#define MEM_DBG_PKT_FREE_INC(__pPacket)\t\tOS_NumOfPktFree ++;\n#else\n#define MEM_DBG_PKT_ALLOC_INC(__pPacket)\n#define MEM_DBG_PKT_FREE_INC(__pPacket)\n#endif /* VENDOR_FEATURE2_SUPPORT */\n    \n/* value domain of 802.11 header FC.Tyte, which is b3..b2 of the 1st-byte of MAC header */\n#define BTYPE_MGMT                  0\n#define BTYPE_CNTL                  1\n#define BTYPE_DATA                  2\n    \n/* All PHY rate summary in TXD */\n/* Preamble MODE in TxD */\n#define MODE_CCK\t0\n#define MODE_OFDM   1\n#ifdef DOT11_N_SUPPORT\n#define MODE_HTMIX\t2\n#define MODE_HTGREENFIELD\t3\n#endif /* DOT11_N_SUPPORT */\n#define MODE_VHT\t4\n\n#ifdef NO_CONSISTENT_MEM_SUPPORT\n/* current support RXD_SIZE = 16B and cache line = 16 or 32B */\n#define RTMP_DCACHE_FLUSH(__AddrStart, __Size)\t\t\t\t\t\t\t\\\n\t\tRtmpOsDCacheFlush((ULONG)(__AddrStart), (ULONG)(__Size))\n#else\n#define RTMP_DCACHE_FLUSH(__AddrStart, __Size)\n#endif /* NO_CONSISTENT_MEM_SUPPORT */\n\n\n/* ======================== Interface ======================================= */\ntypedef enum _RTMP_INF_TYPE_\n{\t\n\tRTMP_DEV_INF_UNKNOWN = 0,\n\tRTMP_DEV_INF_PCI = 1,\n\tRTMP_DEV_INF_USB = 2,\n\tRTMP_DEV_INF_RBUS = 4,\n\tRTMP_DEV_INF_PCIE = 5,\n}RTMP_INF_TYPE;\n\n#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT)\n#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd)\t\tif(_pAd->OpMode == OPMODE_AP)\n#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd)\t\tif(_pAd->OpMode == OPMODE_STA)\n#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)\t\tif (__OpMode == OPMODE_AP)\n#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)\tif (__OpMode == OPMODE_STA)\n#else\n#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd)\n#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd)\n#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)\n#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)\n#endif\n\n/* associated with device interface */\ntypedef struct _DEV_PRIV_INFO {\n\tVOID\t\t\t*pPriv; /* pAd */\n\tUINT32\t\t\tpriv_flags;\n} DEV_PRIV_INFO;\n\n\n\n    \n/***********************************************************************************\n * IOCTL related definitions and data structures.\n **********************************************************************************/\ntypedef struct __RTMP_IOCTL_INPUT_STRUCT\n{\n\tunion\n\t{\n\t\tCHAR *name;\n\t\tstruct\n\t\t{\n\t\t\tCHAR *pointer;\n\t\t\tUINT16 length;\n\t\t\tUINT16 flags;\n\t\t} data;\n\t} u;\n} RTMP_IOCTL_INPUT_STRUCT;\n\n\n#define RT_CMD_STATUS_TRANSLATE(__Status)\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (__Status == RTMP_IO_EINVAL)\t\t\t\t\t\\\n\t\t\t__Status = -EINVAL;\t\t\t\t\t\t\t\\\n\t\telse if (__Status == RTMP_IO_EOPNOTSUPP)\t\t\\\n\t\t\t__Status = -EOPNOTSUPP;\t\t\t\t\t\t\\\n\t\telse if (__Status == RTMP_IO_EFAULT)\t\t\t\\\n\t\t\t__Status = -EFAULT;\t\t\t\t\t\t\t\\\n\t\telse if (__Status == RTMP_IO_E2BIG)\t\t\t\t\\\n\t\t\t__Status = -E2BIG;\t\t\t\t\t\t\t\\\n\t\telse if (__Status == RTMP_IO_ENOMEM)\t\t\t\\\n\t\t\t__Status = -ENOMEM;\t\t\t\t\t\t\t\\\n\t\telse if (__Status == RTMP_IO_EAGAIN)\t\t\t\\\n\t\t\t__Status = -EAGAIN;\t\t\t\t\t\t\t\\\n\t\telse if (__Status == RTMP_IO_ENOTCONN)\t\t\t\\\n\t\t\t__Status = -ENOTCONN;\t\t\t\t\t\t\\\n\t}\n\n\n\n\n/* ======================== Timer =========================================== */\ntypedef struct _LIST_RESOURCE_OBJ_ENTRY\n{\n\tstruct _LIST_RESOURCE_OBJ_ENTRY *pNext;\n\tVOID *pRscObj;\n} LIST_RESOURCE_OBJ_ENTRY, *PLIST_RESOURCE_OBJ_ENTRY;\n\n\n\n\n/* ======================== IC =========================================== */\n#define RFIC_24GHZ\t\t0x01\n#define RFIC_5GHZ\t\t0x02\n\n\n\n\n/* ======================== CFG80211 ======================================== */ \n#define RT_CFG80211_DEBUG /* debug use */\n\n#ifdef RT_CFG80211_DEBUG\n#define CFG80211DBG(__Flg, __pMsg)\t\tDBGPRINT(__Flg, __pMsg)\n#else\n#define CFG80211DBG(__Flg, __pMsg)\n#endif /* RT_CFG80211_DEBUG */\n\n/* 1 ~ 14 */\n#define CFG80211_NUM_OF_CHAN_2GHZ\t\t\t14\n\n/* 36 ~ 64, 100 ~ 136, 140 ~ 161 */\n#define CFG80211_NUM_OF_CHAN_5GHZ\t\t\t\\\n\t\t\t\t\t\t\t(sizeof(Cfg80211_Chan)-CFG80211_NUM_OF_CHAN_2GHZ)\n\n\n\n\n/* ======================== Packet ========================================== */ \n#define LENGTH_802_11               24\n#define LENGTH_802_11_AND_H         30\n#define LENGTH_802_11_CRC_H         34\n#define LENGTH_802_11_CRC           28\n#define LENGTH_802_11_WITH_ADDR4    30\n#define LENGTH_802_3                14\n#define LENGTH_802_3_TYPE           2\n#define LENGTH_802_1_H              8\n#define LENGTH_EAPOL_H              4\n#define LENGTH_WMMQOS_H\t\t\t\t2\n#define LENGTH_CRC                  4\n#define MAX_SEQ_NUMBER              0x0fff\n#define LENGTH_802_3_NO_TYPE\t\t12\n#define LENGTH_802_1Q\t\t\t\t4 /* VLAN related */\n\n\n#ifdef TX_PKT_SG\n#ifndef MAX_SKB_FRAGS \n#define MAX_SKB_FRAGS (65536/(1UL << 12) + 2)\n#endif\ntypedef struct _PTK_SG_T{\n\tVOID *data;\n\tINT len;\n}PKT_SG_T;\n#endif /* TX_PKT_SG */\n/*\n\tPacket information for NdisQueryPacket\n*/\ntypedef struct  _PACKET_INFO    {\n\tUINT PhysicalBufferCount;    /* Physical breaks of buffer descripor chained */\n\tUINT BufferCount;           /* Number of Buffer descriptor chained */\n\tUINT TotalPacketLength ;     /* Self explained */\n\tPNDIS_BUFFER pFirstBuffer;   /* Pointer to first buffer descriptor */\n#ifdef TX_PKT_SG\n\tPKT_SG_T sg_list[MAX_SKB_FRAGS];\n#endif /* TX_PKT_SG */\n} PACKET_INFO, *PPACKET_INFO;\n\n\n#define MAC_ADDR_LEN                    6\n    \n/* 2-byte Frame control field */\n    typedef struct GNU_PACKED {\n\t\n#ifdef RT_BIG_ENDIAN\n\tUSHORT Order:1;\t\t/* Strict order expected */\n\tUSHORT Wep:1;\t\t/* Wep data */\n\tUSHORT MoreData:1;\t/* More data bit */\n\tUSHORT PwrMgmt:1;\t/* Power management bit */\n\tUSHORT Retry:1;\t\t/* Retry status bit */\n\tUSHORT MoreFrag:1;\t/* More fragment bit */\n\tUSHORT FrDs:1;\t\t/* From DS indication */\n\tUSHORT ToDs:1;\t\t/* To DS indication */\n\tUSHORT SubType:4;\t/* MSDU subtype */\n\tUSHORT Type:2;\t\t/* MSDU type */\n\tUSHORT Ver:2;\t\t/* Protocol version */\n#else\n        USHORT Ver:2;\t\t/* Protocol version */\n\tUSHORT Type:2;\t\t/* MSDU type */\n\tUSHORT SubType:4;\t/* MSDU subtype */\n\tUSHORT ToDs:1;\t\t/* To DS indication */\n\tUSHORT FrDs:1;\t\t/* From DS indication */\n\tUSHORT MoreFrag:1;\t/* More fragment bit */\n\tUSHORT Retry:1;\t\t/* Retry status bit */\n\tUSHORT PwrMgmt:1;\t/* Power management bit */\n\tUSHORT MoreData:1;\t/* More data bit */\n\tUSHORT Wep:1;\t\t/* Wep data */\n\tUSHORT Order:1;\t\t/* Strict order expected */\n#endif\t/* !RT_BIG_ENDIAN */\n} FRAME_CONTROL, *PFRAME_CONTROL;\n\n\ntypedef struct GNU_PACKED _HEADER_802_11 {\n        FRAME_CONTROL   FC;\n        USHORT          Duration;\n        UCHAR           Addr1[MAC_ADDR_LEN];\n        UCHAR           Addr2[MAC_ADDR_LEN];\n\tUCHAR\t\t\tAddr3[MAC_ADDR_LEN];\n#ifdef RT_BIG_ENDIAN\n\tUSHORT\t\t\tSequence:12;\n\tUSHORT\t\t\tFrag:4;\n#else\n\tUSHORT\t\t\tFrag:4;\n\tUSHORT\t\t\tSequence:12;\n#endif /* !RT_BIG_ENDIAN */\n\tUCHAR\t\t\tOctet[0];\n}\tHEADER_802_11, *PHEADER_802_11;\n\nenum {\n\tDIDmsg_lnxind_wlansniffrm\t\t= 0x00000044,\n\tDIDmsg_lnxind_wlansniffrm_hosttime\t= 0x00010044,\n\tDIDmsg_lnxind_wlansniffrm_mactime\t= 0x00020044,\n\tDIDmsg_lnxind_wlansniffrm_channel\t= 0x00030044,\n\tDIDmsg_lnxind_wlansniffrm_rssi\t\t= 0x00040044,\n\tDIDmsg_lnxind_wlansniffrm_sq\t\t= 0x00050044,\n\tDIDmsg_lnxind_wlansniffrm_signal\t= 0x00060044,\n\tDIDmsg_lnxind_wlansniffrm_noise\t\t= 0x00070044,\n\tDIDmsg_lnxind_wlansniffrm_rate\t\t= 0x00080044,\n\tDIDmsg_lnxind_wlansniffrm_istx\t\t= 0x00090044,\n\tDIDmsg_lnxind_wlansniffrm_frmlen\t= 0x000A0044\n};\nenum { \nP80211ENUM_msgitem_status_no_value = 0x00 \n};\n\nenum { \nP80211ENUM_truth_false = 0x00, \nP80211ENUM_truth_true = 0x01 \n};\n\n\n/* Definition from madwifi */\ntypedef struct {\n        UINT32 did;\n        UINT16 status;\n        UINT16 len;\n        UINT32 data;\n} p80211item_uint32_t;\n\ntypedef struct {\n        UINT32 msgcode;\n        UINT32 msglen;\n#define WLAN_DEVNAMELEN_MAX 16\n        UINT8 devname[WLAN_DEVNAMELEN_MAX];\n        p80211item_uint32_t hosttime;\n        p80211item_uint32_t mactime;\n        p80211item_uint32_t channel;\n        p80211item_uint32_t rssi;\n        p80211item_uint32_t sq;\n        p80211item_uint32_t signal;\n        p80211item_uint32_t noise;\n        p80211item_uint32_t rate;\n        p80211item_uint32_t istx;\n        p80211item_uint32_t frmlen;\n} wlan_ng_prism2_header;\n\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n/*\n\tNote: 2009/11/10\n\tUsed in WiFi Sigma Test Engine RT3593 (replace RT2883).\n*/\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct _ETHEREAL_RADIO {\n        UCHAR Flag_80211n;\n        UCHAR signal_level; /* dBm */\n        UCHAR data_rate; /* rate index */\n        UCHAR channel; /* Channel number */\n} ETHEREAL_RADIO, *PETHEREAL_RADIO;\n#else\ntypedef struct _ETHEREAL_RADIO {\n        UCHAR channel; /* Channel number */\n        UCHAR data_rate; /* rate index */\n        UCHAR signal_level; /* dBm */\n        UCHAR Flag_80211n;      \n} ETHEREAL_RADIO, *PETHEREAL_RADIO;\n#endif\n\n#define WIRESHARK_11N_FLAG_3x3             \t0x01\n#define WIRESHARK_11N_FLAG_GF              \t0x02\n#define WIRESHARK_11N_FLAG_AMPDU     \t \t0x04\n#define WIRESHARK_11N_FLAG_STBC          \t0x08\n#define WIRESHARK_11N_FLAG_SGI             \t0x10\n#define WIRESHARK_11N_FLAG_BW20U      \t\t0x20\n#define WIRESHARK_11N_FLAG_BW20D      \t\t0x40\n#define WIRESHARK_11N_FLAG_BW40             0x80\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n    \n\n\n#endif /* __RT_COMM_H__ */\n\n"
  },
  {
    "path": "src/include/rtmp_def.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    rtmp_def.h\n\n    Abstract:\n    Miniport related definition header\n\n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Paul Lin    08-01-2002    created\n    John Chang  08-05-2003    add definition for 11g & other drafts\n*/\n#ifndef __RTMP_DEF_H__\n#define __RTMP_DEF_H__\n\n#include \"oid.h\"\n\n#undef AP_WSC_INCLUDED\n#undef STA_WSC_INCLUDED\n#undef WSC_INCLUDED\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_AP_SUPPORT\n#define AP_WSC_INCLUDED\n#endif /* WSC_AP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef WSC_STA_SUPPORT\n#define STA_WSC_INCLUDED\n#endif /* WSC_STA_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED)\n#define WSC_INCLUDED\n#endif\n\n\n#define BAND_5G\t\t1\n#define BAND_24G\t2\n#define BAND_BOTH\t(BAND_5G | BAND_24G)\n\n\n#ifdef SNMP_SUPPORT\n/* for snmp, to get manufacturer OUI, 2008_0220 */\n#define ManufacturerOUI_LEN\t\t\t3\n#define ManufacturerNAME\t\t\t(\"Ralink Technology Company.\")\n#define\tResourceTypeIdName\t\t\t(\"Ralink_ID\")\n#endif\n\n#define RALINK_2883_VERSION\t\t((UINT32)0x28830300)\n#define RALINK_2880E_VERSION\t((UINT32)0x28720200)\n#define RALINK_3883_VERSION\t\t((UINT32)0x38830400)\n#define RALINK_3070_VERSION\t\t((UINT32)0x30700200)\n\n#define MAX_RX_PKT_LEN\t1520\n\n\n#define PCI_VIRT_TO_PHYS(__Addr)\t(((UINT32)(__Addr)) & 0x0FFFFFFF)\n\n#ifdef RTMP_MAC_USB\n#define TX_RING_SIZE            8\t/* 1 */\n#define PRIO_RING_SIZE          8\n#define MGMT_RING_SIZE       \t32\t/* PRIO_RING_SIZE */\n#ifdef INF_AMAZON_SE\n#define RX_RING_SIZE            1\n#else\n#define RX_RING_SIZE            8\n#endif /* INF_AMAZON_SE */\n#define MAX_TX_PROCESS          4\n#define LOCAL_TXBUF_SIZE        2048\n#endif /* RTMP_MAC_USB */\n\n#ifdef MULTIPLE_CARD_SUPPORT\n/* MC: Multple Cards */\n#define MAX_NUM_OF_MULTIPLE_CARD\t\t32\n#endif /* MULTIPLE_CARD_SUPPORT */\n\n#ifdef MEMORY_OPTIMIZATION\n#define MAX_RX_PROCESS\t\t32\n#else\n#define MAX_RX_PROCESS\t\t128\t/*64 //32 */\n#endif\n#define NUM_OF_LOCAL_TXBUF      2\n#define TXD_SIZE\t\t16\t/* TXD_SIZE = TxD + TxInfo */\n#define RXD_SIZE\t\t16\t\n\n#define RXINFO_OFFSET\t12\n\n/* TXINFO_SIZE + TXWI_SIZE + 802.11 Header Size + AMSDU sub frame header */\n#define TX_DMA_1ST_BUFFER_SIZE  96\t/* only the 1st physical buffer is pre-allocated */\n\n/*#define MGMT_DMA_BUFFER_SIZE    1536 //2048 */\n/*\n\tNote 20100212 by SampleLin: do not set MGMT_DMA_BUFFER_SIZE smaller than\n\t1600; Or kernel will crash in deaggregate_AMSDU_announce() for EAPOL packet\n\tin enterprise WPA mode.\n*/\n#define MGMT_DMA_BUFFER_SIZE    1600\t/*2048 */\n\n#define RX_BUFFER_AGGRESIZE     3840\t/*3904 //3968 //4096 //2048 //4096 */\n#define RX_BUFFER_NORMSIZE      3840\t/*3904 //3968 //4096 //2048 //4096 */\n#define TX_BUFFER_NORMSIZE\t\tRX_BUFFER_NORMSIZE\n#define MAX_FRAME_SIZE          2346\t/* Maximum 802.11 frame size */\n#define MAX_AGGREGATION_SIZE    3840\t/*3904 //3968 //4096 */\n#define MAX_NUM_OF_TUPLE_CACHE  2\n#define MAX_MCAST_LIST_SIZE     32\n#define MAX_LEN_OF_VENDOR_DESC  64\n/*#define MAX_SIZE_OF_MCAST_PSQ   (NUM_OF_LOCAL_TXBUF >> 2) // AP won't spend more than 1/4 of total buffers on M/BCAST PSQ */\n#define MAX_SIZE_OF_MCAST_PSQ               32\n\n#define MAX_RX_PROCESS_CNT\t(RX_RING_SIZE)\n\n#ifdef WLAN_SKB_RECYCLE\n#define NUM_RX_DESC     128\n#endif /* WLAN_SKB_RECYCLE */\n\n/*\n\tWMM Note: If memory of your system is not much, please reduce the definition;\n\tor when you do WMM test, the queue for low priority AC will be full, i.e.\n\tTX_RING_SIZE + MAX_PACKETS_IN_QUEUE packets for the AC will be buffered in\n\tWLAN, maybe no any packet buffer can be got in Ethernet driver.\n\n\tSometimes no packet buffer can be got in Ethernet driver, the system will\n\tsend flow control packet to the sender to slow down its sending rate.\n\tSo no WMM can be saw in the air.\n*/\n\n/*\n\tNeed to use 64 in vxworks for test case WMM A5-T07\n\tTwo dnlink (10Mbps) from a WMM station to a non-WMM station.\n\tIf use 256, queue is not enough.\n\tAnd in rt_main_end.c, clConfig.clNum = RX_RING_SIZE * 3; is changed to\n\tclConfig.clNum = RX_RING_SIZE * 4;\n*/\n\n#define MAX_PACKETS_IN_MCAST_PS_QUEUE\t\t32\n#define MAX_PACKETS_IN_PS_QUEUE\t\t\t\t128\t/*32 */\n#define WMM_NUM_OF_AC                       4\t/* AC0, AC1, AC2, and AC3 */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef IGMP_SNOOP_SUPPORT\n#ifdef MEMORY_OPTIMIZATION\n#define MAX_LEN_OF_MULTICAST_FILTER_TABLE 16\n#else\n#define MAX_LEN_OF_MULTICAST_FILTER_TABLE 64\n#endif\n/* Size of hash tab must be power of 2. */\n#define MAX_LEN_OF_MULTICAST_FILTER_HASH_TABLE ((MAX_LEN_OF_MULTICAST_FILTER_TABLE) * 2)\n#define FREE_MEMBER_POOL_SIZE 64\n#endif /* IGMP_SNOOP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#define MAX_AGG_3SS_BALIMIT\t\t31\n\n/* RxFilter */\n#define STANORMAL\t 0x17f97\n#define APNORMAL\t 0x15f97\n#ifdef CONFIG_STA_SUPPORT\n#ifdef XLINK_SUPPORT\n#define PSPXLINK\t 0x17f93\n#endif /* XLINK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n#define MAX_PRECONFIG_DESP_ENTRY_SIZE  11\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\n/*\n\tRTMP_ADAPTER flags\n*/\n#ifdef CONFIG_MULTI_CHANNEL\n#define fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET  0x00000001\n#else\n#define fRTMP_ADAPTER_MAP_REGISTER           0x00000001\n#endif /*CONFIG_MULTI_CHANNEL*/\n#define fRTMP_ADAPTER_INTERRUPT_IN_USE       0x00000002\n#define fRTMP_HW_ERR\t\t\t\t0x00000004\n#define fRTMP_SG\t\t\t\t\t0x00000008\t/* Scatter and Gather */\n#define fRTMP_PKT_TX_ERR\t\t\t0x00000010\n#define fRTMP_ADAPTER_MLME_RESET_IN_PROGRESS 0x00000020\n#define fRTMP_ADAPTER_HALT_IN_PROGRESS       0x00000040\n#define fRTMP_ADAPTER_RESET_IN_PROGRESS      0x00000080\n#define fRTMP_ADAPTER_NIC_NOT_EXIST          0x00000100\n#define fRTMP_ADAPTER_TX_RING_ALLOCATED      0x00000200\n#define fRTMP_ADAPTER_REMOVE_IN_PROGRESS     0x00000400\n#define fRTMP_ADAPTER_MIMORATE_INUSED        0x00000800\n#define fRTMP_ADAPTER_RX_RING_ALLOCATED      0x00001000\n#define fRTMP_ADAPTER_INTERRUPT_ACTIVE       0x00002000\n#define fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS   0x00004000\n#define\tfRTMP_ADAPTER_REASSOC_IN_PROGRESS\t 0x00008000\n#define\tfRTMP_ADAPTER_MEDIA_STATE_PENDING\t 0x00010000\n#define\tfRTMP_ADAPTER_RADIO_OFF\t\t\t\t 0x00020000\n#define fRTMP_ADAPTER_BULKOUT_RESET\t\t\t 0x00040000\n#define\tfRTMP_ADAPTER_BULKIN_RESET\t\t\t 0x00080000\n#define fRTMP_ADAPTER_RDG_ACTIVE\t\t\t\t0x00100000\n#define fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE 0x00200000\n#define fRTMP_ADAPTER_RALINK_BURST_MODE\t\t 0x00400000\n#define fRTMP_ADAPTER_SUSPEND \t\t\t\t 0x00800000\n#define fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD\t 0x01000000\n#define fRTMP_ADAPTER_CMD_RADIO_OFF\t\t\t 0x02000000\n#define fRTMP_ADAPTER_SCAN_2040\t\t\t\t0x04000000\n#define\tfRTMP_ADAPTER_RADIO_MEASUREMENT\t0x08000000\n\n#define fRTMP_ADAPTER_START_UP         \t\t 0x10000000\t/*Devive already initialized and enabled Tx/Rx. */\n#define fRTMP_ADAPTER_MEDIA_STATE_CHANGE     0x20000000\n#define fRTMP_ADAPTER_IDLE_RADIO_OFF         0x40000000\n#define fRTMP_ADAPTER_POLL_IDLE\t\t\t\t 0x80000000\n\nenum ASIC_CAP{\n\tfASIC_CAP_CSO = 0x1,\n\tfASIC_CAP_TSO = 0x2,\n\n\tfASIC_CAP_PMF_ENC = 0x10,\n};\n#define fRTMP_ADAPTER_WSC_PBC_PIN0\t\t0x00000004\n#define fRTMP_ADAPTER_DISABLE_DOT_11N\t0x00000008\n\nenum PHY_CAP{\n\tfPHY_CAP_24G = 0x1,\n\tfPHY_CAP_5G = 0x2,\n\n\tfPHY_CAP_HT = 0x10,\n\tfPHY_CAP_VHT = 0x20,\n\n\tfPHY_CAP_TXBF = 0x100,\n};\n\n#define PHY_CAP_2G(_x)\t\t(((_x) & fPHY_CAP_24G) == fPHY_CAP_24G)\n#define PHY_CAP_5G(_x)\t\t(((_x) & fPHY_CAP_5G) == fPHY_CAP_5G)\n\nenum WIFI_MODE{\n\tWMODE_INVALID = 0,\n\tWMODE_A = 1 << 0,\n\tWMODE_B = 1 << 1,\n\tWMODE_G = 1 << 2,\n\tWMODE_GN = 1 << 3,\n\tWMODE_AN = 1 << 4,\n\tWMODE_AC = 1 << 5,\n\tWMODE_COMP = 6,\t/* total types of supported wireless mode, add this value once yow add new type */\n};\n\n#define WMODE_CAP_5G(_x)\t\t\t(((_x) & (WMODE_A | WMODE_AN | WMODE_AC)) != 0)\n#define WMODE_CAP_2G(_x)\t\t\t(((_x) & (WMODE_B | WMODE_G | WMODE_GN)) != 0)\n#define WMODE_CAP_N(_x)\t\t\t(((_x) & (WMODE_GN | WMODE_AN)) != 0)\n#define WMODE_CAP_AC(_x)\t\t(((_x) & (WMODE_AC)) != 0)\n#define WMODE_CAP(_x, _mode)\t(((_x) & (_mode)) != 0)\n\n#define WMODE_EQUAL(_x, _mode)\t((_x) == (_mode))\n\n#define WMODE_5G_ONLY(_x)\t\t(((_x) & (WMODE_B | WMODE_G | WMODE_GN)) == 0)\n#define WMODE_2G_ONLY(_x)\t\t(((_x) & (WMODE_A | WMODE_AN | WMODE_AC)) == 0)\n#define WMODE_HT_ONLY(_x)\t\t(((_x) & (~(WMODE_GN | WMODE_AN | WMODE_AC))) == 0)\n#define WMODE_VHT_ONLY(_x)\t\t(((_x) & (~(WMODE_AC))) == 0)\n\n\n/*\n\tSTA operation status flags\n*/\n#define fOP_STATUS_INFRA_ON                 0x00000001\n#define fOP_STATUS_ADHOC_ON                 0x00000002\n#define fOP_STATUS_BG_PROTECTION_INUSED     0x00000004\n#define fOP_STATUS_SHORT_SLOT_INUSED        0x00000008\n#define fOP_STATUS_SHORT_PREAMBLE_INUSED    0x00000010\n#define fOP_STATUS_RECEIVE_DTIM             0x00000020\n/*#define fOP_STATUS_TX_RATE_SWITCH_ENABLED   0x00000040 */\n#define fOP_STATUS_MEDIA_STATE_CONNECTED    0x00000080\n#define fOP_STATUS_WMM_INUSED               0x00000100\n#define fOP_STATUS_AGGREGATION_INUSED       0x00000200\n#define fOP_STATUS_DOZE                     0x00000400\t/* debug purpose */\n#define fOP_STATUS_PIGGYBACK_INUSED         0x00000800\t/* piggy-back, and aggregation */\n#define fOP_STATUS_APSD_INUSED\t\t\t\t0x00001000\n#define fOP_STATUS_TX_AMSDU_INUSED\t\t\t0x00002000\n#define fOP_STATUS_MAX_RETRY_ENABLED\t\t0x00004000\n#define fOP_STATUS_WAKEUP_NOW               0x00008000\n#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE       0x00020000\n\n#ifdef P2P_SUPPORT\n#define fOP_STATUS_P2P_GO\t\t\t\t\t0x00080000\n#define fOP_STATUS_P2P_CLI\t\t\t\t\t0x00100000\n#endif /* P2P_SUPPORT */\n#define fOP_AP_STATUS_MEDIA_STATE_CONNECTED\t0x00200000\n\n\n/*\n\tRTMP_ADAPTER PSFlags : related to advanced power save\n*/\n/* Indicate whether driver can go to sleep mode from now. This flag is useful AFTER link up */\n#define fRTMP_PS_CAN_GO_SLEEP          0x00000001\n/* Indicate whether driver has issue a LinkControl command to PCIe L1 */\n#define fRTMP_PS_SET_PCI_CLK_OFF_COMMAND          0x00000002\n/* Indicate driver should disable kick off hardware to send packets from now. */\n#define fRTMP_PS_DISABLE_TX         0x00000004\n/* Indicate driver should IMMEDIATELY fo to sleep after receiving AP's beacon in which  doesn't indicate unicate nor multicast packets for me */\n/* This flag is used ONLY in RTMPHandleRxDoneInterrupt routine. */\n#define fRTMP_PS_GO_TO_SLEEP_NOW         0x00000008\n#define fRTMP_PS_TOGGLE_L1\t\t0x00000010\t/* Use Toggle L1 mechanism for rt28xx PCIe */\n#define fRTMP_PS_MCU_SLEEP\t\t\t\t 0x00800000\n\n\n#define WAKE_MCU_CMD\t\t\t\t0x31\n#define SLEEP_MCU_CMD\t\t\t\t0x30\n#define RFOFF_MCU_CMD\t\t\t\t0x35\n\n#ifdef DOT11N_DRAFT3\n#define fOP_STATUS_SCAN_2040               \t    0x00040000\n#endif /* DOT11N_DRAFT3 */\n\n#define CCKSETPROTECT\t\t0x1\n#define OFDMSETPROTECT\t\t0x2\n#define MM20SETPROTECT\t\t0x4\n#define MM40SETPROTECT\t\t0x8\n#define GF20SETPROTECT\t\t0x10\n#define GR40SETPROTECT\t\t0x20\n#define ALLN_SETPROTECT\t\t(GR40SETPROTECT | GF20SETPROTECT | MM40SETPROTECT | MM20SETPROTECT)\n\n/*\n\tAP's client table operation status flags\n*/\n#define fCLIENT_STATUS_WMM_CAPABLE\t\t\t0x00000001\t/* CLIENT can parse QOS DATA frame */\n#define fCLIENT_STATUS_AGGREGATION_CAPABLE\t0x00000002\t/* CLIENT can receive Ralink's proprietary TX aggregation frame */\n#define fCLIENT_STATUS_PIGGYBACK_CAPABLE\t\t0x00000004\t/* CLIENT support piggy-back */\n#define fCLIENT_STATUS_AMSDU_INUSED\t\t\t0x00000008\n#define fCLIENT_STATUS_SGI20_CAPABLE\t\t\t0x00000010\n#define fCLIENT_STATUS_SGI40_CAPABLE\t\t\t0x00000020\n#define fCLIENT_STATUS_TxSTBC_CAPABLE\t\t\t0x00000040\n#define fCLIENT_STATUS_RxSTBC_CAPABLE\t\t\t0x00000080\n#define fCLIENT_STATUS_HTC_CAPABLE\t\t\t0x00000100\n#define fCLIENT_STATUS_RDG_CAPABLE\t\t\t0x00000200\n#define fCLIENT_STATUS_MCSFEEDBACK_CAPABLE\t0x00000400\n#define fCLIENT_STATUS_APSD_CAPABLE\t\t\t0x00000800\t/* UAPSD STATION */\n\n#ifdef DOT11N_DRAFT3\n#define fCLIENT_STATUS_BSSCOEXIST_CAPABLE\t0x00001000\n#endif /* DOT11N_DRAFT3 */\n#define fCLIENT_STATUS_SOFTWARE_ENCRYPT\t\t0x00002000\t/* Indicate the client encrypt/decrypt by software */\n\n#ifdef DOT11_VHT_AC\n#define fCLIENT_STATUS_SGI80_CAPABLE\t\t\t0x00010000\n#define fCLIENT_STATUS_SGI160_CAPABLE\t\t\t0x00020000\n#define fCLIENT_STATUS_VHT_TXSTBC_CAPABLE\t0x00040000\n#define fCLIENT_STATUS_VHT_RXSTBC_CAPABLE\t0x00080000\n#endif /* DOT11_VHT_AC */\n\n#define fCLIENT_STATUS_RALINK_CHIPSET\t\t\t0x00100000\n\n#ifdef CLIENT_WDS\n#define fCLIENT_STATUS_CLI_WDS\t\t\t\t\t0x00200000\n#endif /* CLIENT_WDS */\n\n#ifdef P2P_SUPPORT\n#define fCLIENT_STATUS_P2P_CLI\t\t\t\t\t0x00400000\n#endif /* P2P_SUPPORT */\n\n/*\n\tSTA configuration flags\n*/\n/*#define fSTA_CFG_ENABLE_TX_BURST          0x00000001 */\n\n/* 802.11n Operating Mode Definition. 0-3 also used in ASICUPdateProtect switch case */\n#define HT_NO_PROTECT\t0\n#define HT_LEGACY_PROTECT\t1\n#define HT_40_PROTECT\t2\n#define HT_2040_PROTECT\t3\n#define HT_RTSCTS_6M\t7\n/*following is our own definition in order to turn on our ASIC protection register in INFRASTRUCTURE. */\n#define HT_ATHEROS\t8\t/* rt2860c has problem with atheros chip. we need to turn on RTS/CTS . */\n#define HT_FORCERTSCTS\t9\t/* Force turn on RTS/CTS first. then go to evaluate if this force RTS is necessary. */\n\n/*\n\tRX Packet Filter control flags. Apply on pAd->PacketFilter\n*/\n#define fRX_FILTER_ACCEPT_DIRECT            NDIS_PACKET_TYPE_DIRECTED\n#define fRX_FILTER_ACCEPT_MULTICAST         NDIS_PACKET_TYPE_MULTICAST\n#define fRX_FILTER_ACCEPT_BROADCAST         NDIS_PACKET_TYPE_BROADCAST\n#define fRX_FILTER_ACCEPT_ALL_MULTICAST     NDIS_PACKET_TYPE_ALL_MULTICAST\n#define fRX_FILTER_ACCEPT_PROMISCUOUS       NDIS_PACKET_TYPE_PROMISCUOUS\n\n/*\n\tError code section\n*/\n/* NDIS_ERROR_CODE_ADAPTER_NOT_FOUND */\n#define ERRLOG_READ_PCI_SLOT_FAILED     0x00000101L\n#define ERRLOG_WRITE_PCI_SLOT_FAILED    0x00000102L\n#define ERRLOG_VENDOR_DEVICE_NOMATCH    0x00000103L\n\n/* NDIS_ERROR_CODE_ADAPTER_DISABLED */\n#define ERRLOG_BUS_MASTER_DISABLED      0x00000201L\n\n/* NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION */\n#define ERRLOG_INVALID_SPEED_DUPLEX     0x00000301L\n#define ERRLOG_SET_SECONDARY_FAILED     0x00000302L\n\n/* NDIS_ERROR_CODE_OUT_OF_RESOURCES */\n#define ERRLOG_OUT_OF_MEMORY            0x00000401L\n#define ERRLOG_OUT_OF_SHARED_MEMORY     0x00000402L\n#define ERRLOG_OUT_OF_MAP_REGISTERS     0x00000403L\n#define ERRLOG_OUT_OF_BUFFER_POOL       0x00000404L\n#define ERRLOG_OUT_OF_NDIS_BUFFER       0x00000405L\n#define ERRLOG_OUT_OF_PACKET_POOL       0x00000406L\n#define ERRLOG_OUT_OF_NDIS_PACKET       0x00000407L\n#define ERRLOG_OUT_OF_LOOKASIDE_MEMORY  0x00000408L\n\n/* NDIS_ERROR_CODE_HARDWARE_FAILURE */\n#define ERRLOG_SELFTEST_FAILED          0x00000501L\n#define ERRLOG_INITIALIZE_ADAPTER       0x00000502L\n#define ERRLOG_REMOVE_MINIPORT          0x00000503L\n\n/* NDIS_ERROR_CODE_RESOURCE_CONFLICT */\n#define ERRLOG_MAP_IO_SPACE             0x00000601L\n#define ERRLOG_QUERY_ADAPTER_RESOURCES  0x00000602L\n#define ERRLOG_NO_IO_RESOURCE           0x00000603L\n#define ERRLOG_NO_INTERRUPT_RESOURCE    0x00000604L\n#define ERRLOG_NO_MEMORY_RESOURCE       0x00000605L\n\n/* WDS definition */\n#define\tMAX_WDS_ENTRY               4\n#define WDS_PAIRWISE_KEY_OFFSET     60\t/* WDS links uses pairwise key#60 ~ 63 in ASIC pairwise key table */\n\n#define\tWDS_DISABLE_MODE            0\n#define\tWDS_RESTRICT_MODE           1\n#define\tWDS_BRIDGE_MODE             2\n#define\tWDS_REPEATER_MODE           3\n#define\tWDS_LAZY_MODE               4\n\n#define MAX_MESH_NUM\t\t\t\t0\n\n#define MAX_APCLI_NUM\t\t\t\t0\n#ifdef APCLI_SUPPORT\n#undef\tMAX_APCLI_NUM\n#define MAX_APCLI_NUM\t\t\t\t1\n#endif /* APCLI_SUPPORT */\n\n#define MAX_P2P_NUM\t\t\t\t0\n#ifdef P2P_SUPPORT\n#undef\tMAX_P2P_NUM\n#define MAX_P2P_NUM\t\t\t\t1\n#endif /* P2P_SUPPORT */\n\n#define MAX_MBSSID_NUM(__pAd)\t\t1\n\n\n#ifdef MBSS_SUPPORT\n#undef MAX_MBSSID_NUM\n\n#define HW_BEACON_MAX_COUNT(__pAd)\t((__pAd)->chipCap.BcnMaxHwNum)\n#define MAX_MBSSID_NUM(__pAd)\t\t((__pAd)->chipCap.BcnMaxNum)\n\n#else\n#define HW_BEACON_MAX_COUNT(__pAd)\t8\n#endif /* MBSS_SUPPORT */\n\n#define HW_BEACON_MAX_NUM\t\t\t16\n\n/* sanity check for apidx */\n#define MBSS_MR_APIDX_SANITY_CHECK(__pAd, apidx) \\\n    { if ((apidx >= MAX_MBSSID_NUM(__pAd)) || \\\n\t\t(apidx >= HW_BEACON_MAX_NUM)) { \\\n          DBGPRINT(RT_DEBUG_ERROR, (\"%s> Error! apidx = %d > MAX_MBSSID_NUM!\\n\", __FUNCTION__, apidx)); \\\n\t  apidx = MAIN_MBSSID; } }\n\n#define VALID_WCID(_wcid)\t((_wcid) > 0 && (_wcid) < MAX_LEN_OF_MAC_TABLE )\n\n#define VALID_MBSS(_pAd, _apidx)\t((_apidx < MAX_MBSSID_NUM(_pAd)) && (_apidx < HW_BEACON_MAX_NUM))\n\n#define MAX_BEACON_SIZE\t\t\t\t512\n\n\n#define HW_RESERVED_WCID(__pAd)\t\t((__pAd)->chipCap.WcidHwRsvNum)\n\n/* Then dedicate wcid of DFS and Carrier-Sense. */\n#define DFS_CTS_WCID(__pAd) \t\t(HW_RESERVED_WCID(__pAd) - 1)\n#define CS_CTS_WCID(__pAd) \t\t\t(HW_RESERVED_WCID(__pAd) - 2)\n#define LAST_SPECIFIC_WCID(__pAd)\t(HW_RESERVED_WCID(__pAd) - 2)\n\n/* If MAX_MBSSID_NUM is 8, the maximum available wcid for the associated STA is 211. */\n/* If MAX_MBSSID_NUM is 7, the maximum available wcid for the associated STA is 228. */\n#define MAX_AVAILABLE_CLIENT_WCID(__pAd)\t(LAST_SPECIFIC_WCID(__pAd) - MAX_MBSSID_NUM(__pAd) - 1)\n\n/* TX need WCID to find Cipher Key */\n/* these wcid 212 ~ 219 are reserved for bc/mc packets if MAX_MBSSID_NUM is 8. */\n#define GET_GroupKey_WCID(__pAd, __wcid, __bssidx) \\\n\t{\t\t\t\t\t\t\t\t\t\t\\\n\t\t__wcid = LAST_SPECIFIC_WCID(__pAd) - (MAX_MBSSID_NUM(__pAd)) + __bssidx;\t\\\n\t}\n\n/*#define IsGroupKeyWCID(__pAd, __wcid) (((__wcid) < LAST_SPECIFIC_WCID) && ((__wcid) >= (LAST_SPECIFIC_WCID - (MAX_MBSSID_NUM(__pAd))))) */\n\n/* definition to support multiple BSSID */\n#define BSS0                            0\n#define BSS1                            1\n#define BSS2                            2\n#define BSS3                            3\n#define BSS4                            4\n#define BSS5                            5\n#define BSS6                            6\n#define BSS7                            7\n\n/*============================================================ */\n/* Length definitions */\n#define PEER_KEY_NO                     2\n#define TIMESTAMP_LEN                   8\n#define MAX_LEN_OF_SUPPORTED_RATES      MAX_LENGTH_OF_SUPPORT_RATES\t/* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */\n#define MAX_NUM_OF_REGULATORY_CLASS\t\t16\n#define MAX_LEN_OF_KEY                  32\t/* 32 octets == 256 bits, Redefine for WPA */\n/* #define MAX_NUM_OF_CHANNELS             MAX_NUM_OF_CHS */\t/* 14 channels @2.4G +  12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination */\n#define MAX_NUM_OF_11JCHANNELS             20\t/* 14 channels @2.4G +  12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination */\n#define MAX_LEN_OF_SSID                 32\n#define CIPHER_TEXT_LEN                 128\n#define HASH_TABLE_SIZE                 256\t/* Size of hash tab must be power of 2. */\n#define MAX_VIE_LEN                     1024\t/* New for WPA cipher suite variable IE sizes. */\n#define MAX_SUPPORT_MCS             32\n#define MAX_NUM_OF_BBP_LATCH             256\n#undef MAX_NUM_OF_BBP_LATCH\n#define MAX_NUM_OF_BBP_LATCH             255\n\n#define MAX_LEN_OF_CCK_RATES\t4\n#define MAX_LEN_OF_OFDM_RATES\t8\n#define MAX_LEN_OF_HT_RATES\t\t24\n#ifdef DOT11_VHT_AC\n#define MAX_LEN_OF_VHT_RATES\t\t16\n#endif /* DOT11_VHT_AC */\n#define SUPPORT_CCK_MODE\t1\n#define SUPPORT_OFDM_MODE\t2\n#define SUPPORT_HT_MODE\t\t4\n#define SUPPORT_VHT_MODE\t\t8\n\n/*============================================================ */\n/* ASIC WCID Table definition. */\n/*============================================================ */\n#define BSSID_WCID\t\t1\t/* in infra mode, always put bssid with this WCID */\n#define MCAST_WCID\t0x0\n#define BSS0Mcast_WCID\t0x0\n#define BSS1Mcast_WCID\t0xf8\n#define BSS2Mcast_WCID\t0xf9\n#define BSS3Mcast_WCID\t0xfa\n#define BSS4Mcast_WCID\t0xfb\n#define BSS5Mcast_WCID\t0xfc\n#define BSS6Mcast_WCID\t0xfd\n#define BSS7Mcast_WCID\t0xfe\n#define RESERVED_WCID\t\t0xff\n\n#define MAX_NUM_OF_ACL_LIST\t\t\t\tMAX_NUMBER_OF_ACL\n\n#define MAX_LEN_OF_MAC_TABLE            MAX_NUMBER_OF_MAC\t/* if MAX_MBSSID_NUM is 8, this value can't be larger than 211 */\n\n/*#if MAX_LEN_OF_MAC_TABLE>MAX_AVAILABLE_CLIENT_WCID */\n/*#error MAX_LEN_OF_MAC_TABLE can not be larger than MAX_AVAILABLE_CLIENT_WCID!!!! */\n/*#endif */\n\n#define MAX_NUM_OF_WDS_LINK_PERBSSID\t            3\n/*#define MAX_NUM_OF_WDS_LINK\t            (MAX_NUM_OF_WDS_LINK_PERBSSID*MAX_MBSSID_NUM) // no use */\n#define MAX_NUM_OF_EVENT                MAX_NUMBER_OF_EVENT\n#define WDS_LINK_START_WCID\t\t\t\t(MAX_LEN_OF_MAC_TABLE-1)\n\n#define NUM_OF_TID\t\t\t8\n#define MAX_AID_BA                    4\n#define MAX_LEN_OF_BA_REC_TABLE          ((NUM_OF_TID * MAX_LEN_OF_MAC_TABLE)/2)\t/*   (NUM_OF_TID*MAX_AID_BA + 32)        //Block ACK recipient */\n#define MAX_LEN_OF_BA_ORI_TABLE          ((NUM_OF_TID * MAX_LEN_OF_MAC_TABLE)/2)\t/*   (NUM_OF_TID*MAX_AID_BA + 32)   // Block ACK originator */\n#ifdef MEMORY_OPTIMIZATION\n#define MAX_LEN_OF_BSS_TABLE             1\n#define MAX_REORDERING_MPDU_NUM\t\t\t 256\n#else\n#define MAX_LEN_OF_BSS_TABLE             128 /* 64 */\n#define MAX_REORDERING_MPDU_NUM\t\t\t 512\n#endif\n\n/* key related definitions */\n#define SHARE_KEY_NUM                   4\n#define MAX_LEN_OF_SHARE_KEY            16\t/* byte count */\n#define MAX_LEN_OF_PEER_KEY             16\t/* byte count */\n#define PAIRWISE_KEY_NUM                64\t/* in MAC ASIC pairwise key table */\n#define GROUP_KEY_NUM                   4\n#define PMK_LEN                         32\n#define WDS_PAIRWISE_KEY_OFFSET         60\t/* WDS links uses pairwise key#60 ~ 63 in ASIC pairwise key table */\n#define\tPMKID_NO                        4\t/* Number of PMKID saved supported */\n#define MAX_LEN_OF_MLME_BUFFER          2048\n\n/* power status related definitions */\n#define PWR_ACTIVE                      0\n#define PWR_SAVE                        1\n#define PWR_MMPS                        2\t/*MIMO power save */\n/*#define PWR_UNKNOWN                   2 */\n\n#define PS_LEVEL_NONE\t\t0\n#define PS_LEVEL_NORMAL\t1\n#define PS_LEVEL_MAX\t\t2\n\n/* Auth and Assoc mode related definitions */\n#define AUTH_MODE_OPEN                  0x00\n#define AUTH_MODE_KEY                   0x01\n/*#define AUTH_MODE_AUTO_SWITCH         0x03 */\n/*#define AUTH_MODE_DEAUTH              0x04 */\n/*#define AUTH_MODE_UPLAYER             0x05 // reserved for 802.11i use */\n\n/* BSS Type definitions */\n#define BSS_ADHOC                       0\t/* = Ndis802_11IBSS */\n#define BSS_INFRA                       1\t/* = Ndis802_11Infrastructure */\n#define BSS_ANY                         2\t/* = Ndis802_11AutoUnknown */\n#define BSS_MONITOR\t\t\t            3\t/* = Ndis802_11Monitor */\n\n/* Reason code definitions */\n#define REASON_RESERVED                 0\n#define REASON_UNSPECIFY                1\n#define REASON_NO_LONGER_VALID          2\n#define REASON_DEAUTH_STA_LEAVING       3\n#define REASON_DISASSOC_INACTIVE        4\n#define REASON_DISASSPC_AP_UNABLE       5\n#define REASON_CLS2ERR                  6\n#define REASON_CLS3ERR                  7\n#define REASON_DISASSOC_STA_LEAVING     8\n#define REASON_STA_REQ_ASSOC_NOT_AUTH   9\n#define REASON_INVALID_IE               13\n#define REASON_MIC_FAILURE              14\n#define REASON_4_WAY_TIMEOUT            15\n#define REASON_GROUP_KEY_HS_TIMEOUT     16\n#define REASON_IE_DIFFERENT             17\n#define REASON_MCIPHER_NOT_VALID        18\n#define REASON_UCIPHER_NOT_VALID        19\n#define REASON_AKMP_NOT_VALID           20\n#define REASON_UNSUPPORT_RSNE_VER       21\n#define REASON_INVALID_RSNE_CAP         22\n#define REASON_8021X_AUTH_FAIL          23\n#define REASON_CIPHER_SUITE_REJECTED    24\n#define REASON_DECLINED                 37\n\n#define REASON_QOS_UNSPECIFY              32\n#define REASON_QOS_LACK_BANDWIDTH         33\n#define REASON_POOR_CHANNEL_CONDITION     34\n#define REASON_QOS_OUTSIDE_TXOP_LIMITION  35\n#define REASON_QOS_QSTA_LEAVING_QBSS      36\n#define REASON_QOS_UNWANTED_MECHANISM     37\n#define REASON_QOS_MECH_SETUP_REQUIRED    38\n#define REASON_QOS_REQUEST_TIMEOUT        39\n#define REASON_QOS_CIPHER_NOT_SUPPORT     45\n\n\n#define REASON_FT_INVALID_FTIE\t\t\t\t55\n\n/* Status code definitions */\n#define MLME_SUCCESS                    0\n#define MLME_UNSPECIFY_FAIL             1\n#define MLME_CANNOT_SUPPORT_CAP         10\n#define MLME_REASSOC_DENY_ASSOC_EXIST   11\n#define MLME_ASSOC_DENY_OUT_SCOPE       12\n#define MLME_ALG_NOT_SUPPORT            13\n#define MLME_SEQ_NR_OUT_OF_SEQUENCE     14\n#define MLME_REJ_CHALLENGE_FAILURE      15\n#define MLME_REJ_TIMEOUT                  16\n#define MLME_ASSOC_REJ_UNABLE_HANDLE_STA  17\n#define MLME_ASSOC_REJ_DATA_RATE          18\n\n#define MLME_ASSOC_REJ_NO_EXT_RATE        22\n#define MLME_ASSOC_REJ_NO_EXT_RATE_PBCC   23\n#define MLME_ASSOC_REJ_NO_CCK_OFDM        24\n\n\n#define MLME_QOS_UNSPECIFY                32\n#define MLME_REQUEST_DECLINED             37\n#define MLME_REQUEST_WITH_INVALID_PARAM   38\n#define MLME_INVALID_INFORMATION_ELEMENT  40\n#define MLME_INVALID_GROUP_CIPHER   \t  41\n#define MLME_INVALID_PAIRWISE_CIPHER   \t  42\n#define MLME_INVALID_AKMP   \t\t\t  43\n#define MLME_NOT_SUPPORT_RSN_VERSION\t  44\n#define\tMLME_INVALID_RSN_CAPABILITIES\t  45\n#define MLME_INVALID_SECURITY_POLICY      46 /* Cipher suite rejected because of security policy */\n#define MLME_DLS_NOT_ALLOW_IN_QBSS        48\n#define MLME_DEST_STA_NOT_IN_QBSS         49\n#define MLME_DEST_STA_IS_NOT_A_QSTA       50\n\n#define MLME_INVALID_FORMAT             0x51\n#define MLME_FAIL_NO_RESOURCE           0x52\n#define MLME_STATE_MACHINE_REJECT       0x53\n#define MLME_MAC_TABLE_FAIL             0x54\n\n/* IE code */\n#define IE_SSID                         0\n#define IE_SUPP_RATES                   1\n#define IE_FH_PARM                      2\n#define IE_DS_PARM                      3\n#define IE_CF_PARM                      4\n#define IE_TIM                          5\n#define IE_IBSS_PARM                    6\n#define IE_COUNTRY                      7\t/* 802.11d */\n#define IE_802_11D_REQUEST              10\t/* 802.11d */\n#define IE_QBSS_LOAD                    11\t/* 802.11e d9 */\n#define IE_EDCA_PARAMETER               12\t/* 802.11e d9 */\n#define IE_TSPEC                        13\t/* 802.11e d9 */\n#define IE_TCLAS                        14\t/* 802.11e d9 */\n#define IE_SCHEDULE                     15\t/* 802.11e d9 */\n#define IE_CHALLENGE_TEXT               16\n#define IE_POWER_CONSTRAINT             32\t/* 802.11h d3.3 */\n#define IE_POWER_CAPABILITY             33\t/* 802.11h d3.3 */\n#define IE_TPC_REQUEST                  34\t/* 802.11h d3.3 */\n#define IE_TPC_REPORT                   35\t/* 802.11h d3.3 */\n#define IE_SUPP_CHANNELS                36\t/* 802.11h d3.3 */\n#define IE_CHANNEL_SWITCH_ANNOUNCEMENT  37\t/* 802.11h d3.3 */\n#define IE_MEASUREMENT_REQUEST          38\t/* 802.11h d3.3 */\n#define IE_MEASUREMENT_REPORT           39\t/* 802.11h d3.3 */\n#define IE_QUIET                        40\t/* 802.11h d3.3 */\n#define IE_IBSS_DFS                     41\t/* 802.11h d3.3 */\n#define IE_ERP                          42\t/* 802.11g */\n#define IE_TS_DELAY                     43\t/* 802.11e d9 */\n#define IE_TCLAS_PROCESSING             44\t/* 802.11e d9 */\n#define IE_QOS_CAPABILITY               46\t/* 802.11e d6 */\n#define IE_HT_CAP                       45\t/* 802.11n d1. HT CAPABILITY. ELEMENT ID TBD */\n#define IE_AP_CHANNEL_REPORT\t\t\t51\t/* 802.11k d6 */\n#define IE_HT_CAP2                         52\t/* 802.11n d1. HT CAPABILITY. ELEMENT ID TBD */\n#define IE_RSN                          48\t/* 802.11i d3.0 */\n#define IE_WPA2                         48\t/* WPA2 */\n#define IE_EXT_SUPP_RATES               50\t/* 802.11g */\n#define IE_TIMEOUT_INTERVAL             56      /* 802.11w */\n#define IE_SUPP_REG_CLASS               59\t/* 802.11y. Supported regulatory classes. */\n#define IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT\t60\t/* 802.11n */\n#define IE_ADD_HT                         61\t/* 802.11n d1. ADDITIONAL HT CAPABILITY. ELEMENT ID TBD */\n#define IE_ADD_HT2                        53\t/* 802.11n d1. ADDITIONAL HT CAPABILITY. ELEMENT ID TBD */\n\n/* For 802.11n D3.03 */\n/*#define IE_NEW_EXT_CHA_OFFSET             62    // 802.11n d1. New extension channel offset elemet */\n#define IE_SECONDARY_CH_OFFSET\t\t62\t/* 802.11n D3.03        Secondary Channel Offset element */\n#define IE_WAPI\t\t\t\t\t\t\t68\t/* WAPI information element. Same as Bss Ac Access Dealy Element. */\n#define IE_2040_BSS_COEXIST               72\t/* 802.11n D3.0.3 */\n#define IE_2040_BSS_INTOLERANT_REPORT     73\t/* 802.11n D3.03 */\n#define IE_OVERLAPBSS_SCAN_PARM           74\t/* 802.11n D3.03 */\n#define IE_CHANNEL_USAGE\t\t\t\t\t97\t/* Cisco advertises suggested channel using this IE. */\n#define IE_TIME_ZONE\t\t\t98\t/* 802.11V */\n#define IE_INTERWORKING\t\t\t107 /* 802.11u */\n#define IE_ADVERTISEMENT_PROTO\t108 /* 802.11u */\n#define IE_QOS_MAP_SET\t\t\t110 /* 802.11u */\n#define IE_ROAMING_CONSORTIUM\t111 /* 802.11u */\n#define IE_EXT_CAPABILITY                127\t/* 802.11n D3.03 */\n\n#define IE_WPA                          221\t/* WPA */\n#define IE_VENDOR_SPECIFIC              221\t/* Wifi WMM (WME) */\n#define\tIE_WFA_WSC\t\t\t\t\t\t\t221\n\n#define OUI_BROADCOM_HT              51\t/* */\n#define OUI_BROADCOM_HTADD           52\t/* */\n#define OUI_PREN_HT_CAP              51\t/* */\n#define OUI_PREN_ADD_HT              52\t/* */\n\n/* CCX information */\n#define IE_AIRONET_CKIP                 133\t/* CCX1.0 ID 85H for CKIP */\n#define IE_AP_TX_POWER                  150\t/* CCX 2.0 for AP transmit power */\n#define IE_MEASUREMENT_CAPABILITY       221\t/* CCX 2.0 */\n#define IE_CCX_V2                       221\n#define IE_AIRONET_IPADDRESS            149\t/* CCX ID 95H for IP Address */\n#define IE_AIRONET_CCKMREASSOC          156\t/* CCX ID 9CH for CCKM Reassociation Request element */\n#define CKIP_NEGOTIATION_LENGTH         30\n#define AIRONET_IPADDRESS_LENGTH        10\n#define AIRONET_CCKMREASSOC_LENGTH      24\n\n/* ======================================================== */\n/* MLME state machine definition */\n/* ======================================================== */\n\n/* STA MLME state mahcines */\n#define ASSOC_STATE_MACHINE             1\n#define AUTH_STATE_MACHINE              2\n#define AUTH_RSP_STATE_MACHINE          3\n#define SYNC_STATE_MACHINE              4\n#define MLME_CNTL_STATE_MACHINE         5\n#define WPA_PSK_STATE_MACHINE           6\n/*#define LEAP_STATE_MACHINE              7 */\n#define AIRONET_STATE_MACHINE           8\n#define ACTION_STATE_MACHINE           9\n\n/* AP MLME state machines */\n#define AP_ASSOC_STATE_MACHINE          11\n#define AP_AUTH_STATE_MACHINE           12\n#define AP_SYNC_STATE_MACHINE           14\n#define AP_CNTL_STATE_MACHINE           15\n#define WSC_STATE_MACHINE            17\n#define WSC_UPNP_STATE_MACHINE\t\t    18\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n#define APCLI_AUTH_STATE_MACHINE\t\t\t19\n#define APCLI_ASSOC_STATE_MACHINE\t\t\t20\n#define APCLI_SYNC_STATE_MACHINE\t\t\t21\n#define APCLI_CTRL_STATE_MACHINE\t\t\t22\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#define WPA_STATE_MACHINE            \t\t23\n\n\n#ifdef QOS_DLS_SUPPORT\n#define DLS_STATE_MACHINE               26\n#endif /* QOS_DLS_SUPPORT */\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#define TDLS_STATE_MACHINE               29\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n#ifdef P2P_SUPPORT\n#define\tP2P_CTRL_STATE_MACHINE\t\t\t31\n#define\tP2P_DISC_STATE_MACHINE\t\t\t32\n#define\tP2P_GO_FORM_STATE_MACHINE\t\t33\n#define\tP2P_ACTION_STATE_MACHINE\t\t\t34\n#endif /* P2P_SUPPORT */\n\n\n#ifdef IWSC_SUPPORT\n#define IWSC_STATE_MACHINE\t\t\t\t38\n#endif /* IWSC_SUPPORT */\n\n/*\n\tSTA's CONTROL/CONNECT state machine: states, events, total function #\n*/\n#define CNTL_IDLE                       0\n#define CNTL_WAIT_DISASSOC              1\n#define CNTL_WAIT_JOIN                  2\n#define CNTL_WAIT_REASSOC               3\n#define CNTL_WAIT_START                 4\n#define CNTL_WAIT_AUTH                  5\n#define CNTL_WAIT_ASSOC                 6\n#define CNTL_WAIT_AUTH2                 7\n#define CNTL_WAIT_OID_LIST_SCAN         8\n#define CNTL_WAIT_OID_DISASSOC          9\n#define CNTL_WAIT_SCAN_FOR_CONNECT      10\n\n\n#define MT2_ASSOC_CONF                  34\n#define MT2_AUTH_CONF                   35\n#define MT2_DEAUTH_CONF                 36\n#define MT2_DISASSOC_CONF               37\n#define MT2_REASSOC_CONF                38\n#define MT2_PWR_MGMT_CONF               39\n#define MT2_JOIN_CONF                   40\n#define MT2_SCAN_CONF                   41\n#define MT2_START_CONF                  42\n#define MT2_GET_CONF                    43\n#define MT2_SET_CONF                    44\n#define MT2_RESET_CONF                  45\n#define MT2_FT_OTD_CONF\t\t\t\t\t46\n#define MT2_MLME_ROAMING_REQ            52\n\n#define CNTL_FUNC_SIZE                  1\n\n/*\n\tSTA's ASSOC state machine: states, events, total function #\n*/\n#define ASSOC_IDLE                      0\n#define ASSOC_WAIT_RSP                  1\n#define REASSOC_WAIT_RSP                2\n#define DISASSOC_WAIT_RSP               3\n#define MAX_ASSOC_STATE                 4\n\n#define ASSOC_MACHINE_BASE              0\n#define MT2_MLME_ASSOC_REQ              0\n#define MT2_MLME_REASSOC_REQ            1\n#define MT2_MLME_DISASSOC_REQ           2\n#define MT2_PEER_DISASSOC_REQ           3\n#define MT2_PEER_ASSOC_REQ              4\n#define MT2_PEER_ASSOC_RSP              5\n#define MT2_PEER_REASSOC_REQ            6\n#define MT2_PEER_REASSOC_RSP            7\n#define MT2_DISASSOC_TIMEOUT            8\n#define MT2_ASSOC_TIMEOUT               9\n#define MT2_REASSOC_TIMEOUT             10\n#define MAX_ASSOC_MSG                   11\n\n#define ASSOC_FUNC_SIZE                 (MAX_ASSOC_STATE * MAX_ASSOC_MSG)\n\n/*\n\tACT state machine: states, events, total function #\n*/\n#define ACT_IDLE                      0\n#define MAX_ACT_STATE                 1\n\n#define ACT_MACHINE_BASE              0\n\n/*\n\tThose PEER_xx_CATE number is based on real Categary value in IEEE spec.\n\tPlease doesn't modify it by yourself.\n */\n/*Category */\n#define MT2_PEER_SPECTRUM_CATE\t0\n#define MT2_PEER_QOS_CATE\t\t\t1\n#define MT2_PEER_DLS_CATE\t\t\t2\n#define MT2_PEER_BA_CATE\t\t\t3\n#define MT2_PEER_PUBLIC_CATE\t\t4\n#define MT2_PEER_RM_CATE\t\t\t5\n/* \"FT_CATEGORY_BSS_TRANSITION equal to 6\" is defined file of \"dot11r_ft.h\" */\n#define MT2_PEER_HT_CATE\t\t\t7\t/* 7.4.7 */\n#define MT2_PEER_PMF_CATE\t\t\t8\t/* defined in IEEE 802.11w-D8.0 7.3.1.11 */\n#define MT2_PEER_RESV_9\t\t\t9\n#define MT2_PEER_RESV_10\t\t\t10\n#define MT2_PEER_RESV_11\t\t\t11\n#define MT2_PEER_RESV_12\t\t\t12\n#define MT2_PEER_RESV_13\t\t\t13\n#define MT2_PEER_RESV_14\t\t\t14\n#define MT2_PEER_RESV_15\t\t\t15\n#define MT2_PEER_RESV_16\t\t\t16\n/*\n\tIn WMM spec v1.1. the category must be 17\n\t(see Table 7 Management Action Frame Fields)\n*/\n#define MT2_PEER_WMM\t\t\t\t17\n#define MAX_IEEE_STD_CATE\t\t\t17\t/* Indicate the maximum category code defined in IEEE-802.11-Std */\n#define MAX_PEER_CATE_MSG\t\t\tMAX_IEEE_STD_CATE\n\n#define MT2_MLME_ADD_BA_CATE\t\t(MAX_IEEE_STD_CATE + 1)\n#define MT2_MLME_ORI_DELBA_CATE\t(MAX_IEEE_STD_CATE + 2)\n#define MT2_MLME_REC_DELBA_CATE\t(MAX_IEEE_STD_CATE + 3)\n#define MT2_MLME_QOS_CATE\t\t\t(MAX_IEEE_STD_CATE + 4)\n#define MT2_MLME_DLS_CATE\t\t\t(MAX_IEEE_STD_CATE + 5)\n#define MT2_ACT_INVALID\t\t\t(MAX_IEEE_STD_CATE + 6)\n\n#define MAX_ACT_MSG\t\t\t\t(MAX_IEEE_STD_CATE + 7)\n\n\n#define MT2_ACT_VENDOR\t\t\t\t0x7F\n\n/* Category field */\n#define CATEGORY_SPECTRUM\t\t0\n#define CATEGORY_QOS\t\t\t1\n#define CATEGORY_DLS\t\t\t2\n#define CATEGORY_BA\t\t\t3\n#define CATEGORY_PUBLIC\t\t4\n#define CATEGORY_RM\t\t\t5\n#define CATEGORY_FT\t\t\t\t6\n#define CATEGORY_HT\t\t\t7\n#ifdef DOT11Z_TDLS_SUPPORT\n#define CATEGORY_TDLS\t\t12\n#ifdef WFD_SUPPORT\n#define CATEGORY_VENDOR_SPECIFIC_WFD\t0x7F\n#endif /* WFD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n/* DLS Action frame definition */\n#define ACTION_DLS_REQUEST\t\t0\n#define ACTION_DLS_RESPONSE\t1\n#define ACTION_DLS_TEARDOWN\t2\n\n/* Spectrum  Action field value 802.11h 7.4.1 */\n#define SPEC_MRQ\t0\t/* Request */\n#define SPEC_MRP\t1\t/*Report */\n#define SPEC_TPCRQ\t2\n#define SPEC_TPCRP\t3\n#define SPEC_CHANNEL_SWITCH\t4\n\n/* BA  Action field value */\n#define ADDBA_REQ\t0\n#define ADDBA_RESP\t1\n#define DELBA   2\n\n/* Public's  Action field value in Public Category.  Some in 802.11y and some in 11n */\n#define ACTION_BSS_2040_COEXIST\t\t\t\t0\t/* 11n */\n#define ACTION_DSE_ENABLEMENT\t\t\t\t\t1\t/* 11y D9.0 */\n#define ACTION_DSE_DEENABLEMENT\t\t\t\t2\t/* 11y D9.0 */\n#define ACTION_DSE_REG_LOCATION_ANNOUNCE\t3\t/* 11y D9.0 */\n#define ACTION_EXT_CH_SWITCH_ANNOUNCE\t\t4\t/* 11y D9.0 */\n#define ACTION_DSE_MEASUREMENT_REQ\t\t\t5\t/* 11y D9.0 */\n#define ACTION_DSE_MEASUREMENT_REPORT\t\t6\t/* 11y D9.0 */\n#define ACTION_MEASUREMENT_PILOT_ACTION\t\t7\t/* 11y D9.0 */\n#define ACTION_DSE_POWER_CONSTRAINT\t\t\t8\t/* 11y D9.0 */\n#define ACTION_WIFI_DIRECT\t\t\t\t\t\t9 \t/* 11y */\n#define ACTION_GAS_INITIAL_REQ\t\t\t\t\t10 \t/* 11U */\n#define ACTION_GAS_INITIAL_RSP\t\t\t\t\t11 \t/* 11U */\n#define ACTION_GAS_COMEBACK_REQ\t\t\t\t12 \t/* 11U */\n#define ACTION_GAS_COMEBACK_RSP\t\t\t\t13 \t/* 11U */\n#define ACTION_TDLS_DISCOVERY_RSP\t\t\t\t14\t/* 11z D13.0 */\n#define ACTION_VENDOR_USAGE\t\t\t\t\t221\n\n/*HT  Action field value */\n#define NOTIFY_BW_ACTION\t\t\t\t0\n#define SMPS_ACTION\t\t\t\t\t\t1\n#define PSMP_ACTION   \t\t\t\t\t2\n#define SETPCO_ACTION\t\t\t\t\t3\n#define MIMO_CHA_MEASURE_ACTION\t\t4\n#define MIMO_N_BEACONFORM\t\t\t\t5\t/* non-compressed beamforming report */\n#define MIMO_BEACONFORM\t\t\t\t6\t/* compressed beamforming report */\n#define ANTENNA_SELECT\t\t\t\t\t7\n#define HT_INFO_EXCHANGE\t\t\t\t8\n\n#define ACT_FUNC_SIZE                 (MAX_ACT_STATE * MAX_ACT_MSG)\n/*\n\tSTA's AUTHENTICATION state machine: states, evvents, total function #\n*/\n#define AUTH_REQ_IDLE                   0\n#define AUTH_WAIT_SEQ2                  1\n#define AUTH_WAIT_SEQ4                  2\n#define MAX_AUTH_STATE                  3\n\n#define AUTH_MACHINE_BASE               0\n#define MT2_MLME_AUTH_REQ               0\n#define MT2_PEER_AUTH_EVEN              1\n#define MT2_AUTH_TIMEOUT                2\n#define MAX_AUTH_MSG                    3\n\n#define AUTH_FUNC_SIZE                  (MAX_AUTH_STATE * MAX_AUTH_MSG)\n\n/*\n\tSTA's AUTH_RSP state machine: states, events, total function #\n*/\n#define AUTH_RSP_IDLE                   0\n#define AUTH_RSP_WAIT_CHAL              1\n#define MAX_AUTH_RSP_STATE              2\n\n#define AUTH_RSP_MACHINE_BASE           0\n#define MT2_AUTH_CHALLENGE_TIMEOUT      0\n#define MT2_PEER_AUTH_ODD               1\n#define MT2_PEER_DEAUTH                 2\n#define MAX_AUTH_RSP_MSG                3\n\n#define AUTH_RSP_FUNC_SIZE              (MAX_AUTH_RSP_STATE * MAX_AUTH_RSP_MSG)\n\n/*\n\tSTA's SYNC state machine: states, events, total function #\n*/\n#define SYNC_IDLE                       0\t/* merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state */\n#define JOIN_WAIT_BEACON                1\n#define SCAN_LISTEN                     2\n#define SCAN_PENDING                    3\n#define MAX_SYNC_STATE                  4\n\n#define SYNC_MACHINE_BASE               0\n#define MT2_MLME_SCAN_REQ               0\n#define MT2_MLME_JOIN_REQ               1\n#define MT2_MLME_START_REQ              2\n#define MT2_PEER_BEACON                 3\n#define MT2_PEER_PROBE_RSP              4\n#define MT2_PEER_ATIM                   5\n#define MT2_SCAN_TIMEOUT                6\n#define MT2_BEACON_TIMEOUT              7\n#define MT2_ATIM_TIMEOUT                8\n#define MT2_PEER_PROBE_REQ              9\n#define MT2_MLME_FORCE_JOIN_REQ \t10\n#define MT2_MLME_FORCE_SCAN_REQ \t11\n#define MAX_SYNC_MSG                    \t12\n\n#define SYNC_FUNC_SIZE                  (MAX_SYNC_STATE * MAX_SYNC_MSG)\n\n/*Messages for the DLS state machine */\n#define DLS_IDLE\t\t\t\t\t\t0\n#define MAX_DLS_STATE\t\t\t\t\t1\n\n#define DLS_MACHINE_BASE\t\t\t\t0\n#define MT2_MLME_DLS_REQ\t\t\t    0\n#define MT2_PEER_DLS_REQ\t\t\t    1\n#define MT2_PEER_DLS_RSP\t\t\t    2\n#define MT2_MLME_DLS_TEAR_DOWN\t\t    3\n#define MT2_PEER_DLS_TEAR_DOWN\t\t    4\n#define MAX_DLS_MSG\t\t\t\t        5\n\n#define DLS_FUNC_SIZE\t\t\t\t\t(MAX_DLS_STATE * MAX_DLS_MSG)\n\n#ifdef DOT11Z_TDLS_SUPPORT\n/*Messages for the TDLS state machine */\n#define TDLS_IDLE\t\t\t\t\t\t0\n#define MAX_TDLS_STATE\t\t\t\t\t1\n\n#define TDLS_MACHINE_BASE\t\t        0\n#define MT2_MLME_TDLS_SETUP_REQ\t\t\t0\n#define MT2_PEER_TDLS_SETUP_REQ\t\t\t1\n#define MT2_PEER_TDLS_SETUP_RSP\t\t\t2\n#define MT2_PEER_TDLS_SETUP_CONF\t\t3\n#define MT2_MLME_TDLS_TEAR_DOWN\t\t\t4\n#define MT2_PEER_TDLS_TEAR_DOWN\t\t    5\n#define MT2_PEER_TDLS_TRAFFIC_IND\t\t\t6 /* for TDLS UAPSD */\n#define MT2_MLME_TDLS_CH_SWITCH_REQ\t\t7\n#define MT2_MLME_TDLS_CH_SWITCH_RSP\t\t8\n#define MT2_PEER_TDLS_CH_SWITCH_REQ\t\t9\n#define MT2_PEER_TDLS_CH_SWITCH_RSP\t\t10\n#define MT2_MLME_TDLS_PEER_PSM_REQ\t\t11\n#define MT2_PEER_TDLS_PEER_PSM_REQ\t\t\t12\n#define MT2_PEER_TDLS_PEER_PSM_RESP\t\t13\n#define MT2_PEER_TDLS_TRAFFIC_RSP\t\t\t14 /* for TDLS UAPSD */\n#define MT2_MLME_TDLS_DISCOVER_REQ\t\t15\n#define MT2_PEER_TDLS_DISCOVER_REQ\t\t\t16\n#define MT2_PEER_TDLS_DISCOVER_RSP\t\t\t17\n#define MT2_MLME_TDLS_CH_SWITCH_REQ_DISABLE\t18\n#define MT2_MLME_TDLS_TUNNELED_REQ\t\t\t19\n#define\tMT2_PEER_TDLS_TUNNELED_REQ\t\t\t20\n\n#define MAX_TDLS_MSG\t\t\t\t\t\t\t21\n\n#define\tTDLS_FUNC_SIZE\t\t\t\t\t(MAX_TDLS_STATE * MAX_TDLS_MSG)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n/*\n\tWSC State machine: states, events, total function #\n*/\n#ifdef WSC_INCLUDED\n/*Messages for the WSC State machine */\n#define\tWSC_IDLE\t\t\t\t\t\t0\n#define\tMAX_WSC_STATE\t\t\t\t\t1\n#define\tWSC_FUNC_SIZE\t\t\t\t\t(MAX_WSC_STATE * MAX_WSC_MSG)\n\n#ifdef IWSC_SUPPORT\n#define IWSC_IDLE\t\t\t\t\t0\n#define IWSC_START\t\t\t\t\t1\n#define IWSC_SCAN\t\t\t\t\t2\n#define IWSC_WAIT_PIN\t\t\t\t3\n#define IWSC_WAIT_JOIN\t\t\t\t4\n#define MAX_IWSC_STATE\t\t\t\t5\n\n#define IWSC_MACHINE_BASE\t\t\t0\n#define IWSC_MT2_MLME_START\t\t\t0\n#define IWSC_MT2_MLME_STOP\t\t\t1\n#define IWSC_MT2_MLME_SCAN_DONE\t\t2\n#define IWSC_MT2_MLME_RECONNECT\t\t3\n#define IWSC_MT2_PEER_ACTION_FRAME\t4\n#define IWSC_MT2_PEER_PROBE_REQ\t\t5\n#define IWSC_MT2_PEER_PROBE_RSP\t\t6\n#define IWSC_MT2_PEER_PIN\t\t\t7\n#define MAX_IWSC_MSG\t\t\t\t8\n\n#define\tIWSC_FUNC_SIZE\t\t\t(MAX_IWSC_STATE * MAX_IWSC_MSG)\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n/*\n\tAP's CONTROL/CONNECT state machine: states, events, total function #\n*/\n#define AP_CNTL_FUNC_SIZE               1\n\n/*\n\tAP's ASSOC state machine: states, events, total function #\n*/\n#define AP_ASSOC_IDLE                   0\n#define AP_MAX_ASSOC_STATE              1\n\n#define AP_ASSOC_MACHINE_BASE           0\n#define APMT2_MLME_DISASSOC_REQ         0\n#define APMT2_PEER_DISASSOC_REQ         1\n#define APMT2_PEER_ASSOC_REQ            2\n#define APMT2_PEER_REASSOC_REQ          3\n#define APMT2_CLS3ERR                   4\n#define AP_MAX_ASSOC_MSG                5\n\n#define AP_ASSOC_FUNC_SIZE              (AP_MAX_ASSOC_STATE * AP_MAX_ASSOC_MSG)\n\n/*\n\tAP's AUTHENTICATION state machine: states, events, total function #\n*/\n#define AP_AUTH_REQ_IDLE                0\n#define AP_MAX_AUTH_STATE               1\n\n#define AP_AUTH_MACHINE_BASE            0\n#define APMT2_MLME_DEAUTH_REQ           0\n#define APMT2_CLS2ERR                   1\n#define APMT2_PEER_DEAUTH\t\t\t\t2\n#define APMT2_PEER_AUTH_REQ\t\t\t\t3\n#define APMT2_PEER_AUTH_CONFIRM\t\t\t4\n#define AP_MAX_AUTH_MSG                 5\n\n#define AP_AUTH_FUNC_SIZE               (AP_MAX_AUTH_STATE * AP_MAX_AUTH_MSG)\n\n/*\n\tAP's SYNC state machine: states, events, total function #\n*/\n#ifdef CONFIG_MULTI_CHANNEL\n#define AP_SYNC_IDLE                    0\n#ifdef AP_SCAN_SUPPORT\n#define AP_SCAN_LISTEN\t\t\t\t\t1\n#define AP_SCAN_PENDING               2\n#define AP_MAX_SYNC_STATE               3\n#else\n#define AP_SCAN_PENDING               1\n#define AP_MAX_SYNC_STATE               2\n#endif\n#else\n#define AP_SYNC_IDLE                    0\n#ifdef AP_SCAN_SUPPORT\n#define AP_SCAN_LISTEN\t\t\t\t\t1\n#define AP_MAX_SYNC_STATE               2\n#else\n#define AP_MAX_SYNC_STATE               1\n#endif\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n#define AP_SYNC_MACHINE_BASE\t\t0\n#define APMT2_PEER_PROBE_REQ\t\t0\n#define APMT2_PEER_BEACON\t\t\t1\n#define APMT2_PEER_PROBE_RSP\t\t2\n#ifdef AP_SCAN_SUPPORT\n#define APMT2_MLME_SCAN_REQ\t\t3\n#define APMT2_SCAN_TIMEOUT\t\t4\n#define APMT2_MLME_SCAN_CNCL\t\t5\n#define AP_MAX_SYNC_MSG\t\t\t6\n#else\n#define AP_MAX_SYNC_MSG\t\t\t3\n#endif\n\n#define AP_SYNC_FUNC_SIZE               (AP_MAX_SYNC_STATE * AP_MAX_SYNC_MSG)\n\n#ifdef APCLI_SUPPORT\n/*ApCli authentication state machine */\n#define APCLI_AUTH_REQ_IDLE                0\n#define APCLI_AUTH_WAIT_SEQ2               1\n#define APCLI_AUTH_WAIT_SEQ4               2\n#define APCLI_MAX_AUTH_STATE               3\n\n#define APCLI_AUTH_MACHINE_BASE            0\n#define APCLI_MT2_MLME_AUTH_REQ            0\n#define APCLI_MT2_MLME_DEAUTH_REQ          1\n#define APCLI_MT2_PEER_AUTH_EVEN           2\n#define APCLI_MT2_PEER_DEAUTH              3\n#define APCLI_MT2_AUTH_TIMEOUT             4\n#define APCLI_MAX_AUTH_MSG                 5\n\n#define APCLI_AUTH_FUNC_SIZE               (APCLI_MAX_AUTH_STATE * APCLI_MAX_AUTH_MSG)\n\n/*ApCli association state machine */\n#define APCLI_ASSOC_IDLE                   0\n#define APCLI_ASSOC_WAIT_RSP               1\n#define APCLI_MAX_ASSOC_STATE              2\n\n#define APCLI_ASSOC_MACHINE_BASE           0\n#define APCLI_MT2_MLME_ASSOC_REQ           0\n#define APCLI_MT2_MLME_DISASSOC_REQ        1\n#define APCLI_MT2_PEER_DISASSOC_REQ        2\n#define APCLI_MT2_PEER_ASSOC_RSP           3\n#define APCLI_MT2_ASSOC_TIMEOUT            4\n#define APCLI_MAX_ASSOC_MSG                5\n\n#define APCLI_ASSOC_FUNC_SIZE              (APCLI_MAX_ASSOC_STATE * APCLI_MAX_ASSOC_MSG)\n\n/*ApCli sync state machine */\n#define APCLI_SYNC_IDLE                   0\t/* merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state */\n#define APCLI_JOIN_WAIT_PROBE_RSP         1\n#define APCLI_MAX_SYNC_STATE              2\n\n#define APCLI_SYNC_MACHINE_BASE           0\n#define APCLI_MT2_MLME_PROBE_REQ          0\n#define APCLI_MT2_PEER_PROBE_RSP          1\n#define APCLI_MT2_PEER_BEACON\t\t\t2\n#define APCLI_MT2_PROBE_TIMEOUT           3\n#define APCLI_MAX_SYNC_MSG                4\n\n#define APCLI_SYNC_FUNC_SIZE              (APCLI_MAX_SYNC_STATE * APCLI_MAX_SYNC_MSG)\n\n/*ApCli ctrl state machine */\n#define APCLI_CTRL_DISCONNECTED           0\t/* merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state */\n#define APCLI_CTRL_PROBE                  1\n#define APCLI_CTRL_AUTH                   2\n#define APCLI_CTRL_AUTH_2                 3\n#define APCLI_CTRL_ASSOC                  4\n#define APCLI_CTRL_DEASSOC                5\n#define APCLI_CTRL_CONNECTED              6\n#define APCLI_MAX_CTRL_STATE              7\n\n#define APCLI_CTRL_MACHINE_BASE           0\n#define APCLI_CTRL_JOIN_REQ               0\n#define APCLI_CTRL_PROBE_RSP              1\n#define APCLI_CTRL_AUTH_RSP               2\n#define APCLI_CTRL_DISCONNECT_REQ         3\n#define APCLI_CTRL_PEER_DISCONNECT_REQ    4\n#define APCLI_CTRL_ASSOC_RSP              5\n#define APCLI_CTRL_DEASSOC_RSP            6\n#define APCLI_CTRL_JOIN_REQ_TIMEOUT       7\n#define APCLI_CTRL_AUTH_REQ_TIMEOUT       8\n#define APCLI_CTRL_ASSOC_REQ_TIMEOUT      9\n#define APCLI_MAX_CTRL_MSG                10\n\n#define APCLI_CTRL_FUNC_SIZE              (APCLI_MAX_CTRL_STATE * APCLI_MAX_CTRL_MSG)\n\n\n#endif /* APCLI_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n/* ============================================================================= */\n\n\n/* value domain of 802.11 MGMT frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header */\n#define SUBTYPE_ASSOC_REQ           0\n#define SUBTYPE_ASSOC_RSP           1\n#define SUBTYPE_REASSOC_REQ         2\n#define SUBTYPE_REASSOC_RSP         3\n#define SUBTYPE_PROBE_REQ           4\n#define SUBTYPE_PROBE_RSP           5\n#define SUBTYPE_BEACON              8\n#define SUBTYPE_ATIM                9\n#define SUBTYPE_DISASSOC            10\n#define SUBTYPE_AUTH                11\n#define SUBTYPE_DEAUTH              12\n#define SUBTYPE_ACTION              13\n#define SUBTYPE_ACTION_NO_ACK              14\n\n/* value domain of 802.11 CNTL frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header */\n#define SUBTYPE_WRAPPER       \t7\n#define SUBTYPE_BLOCK_ACK_REQ       8\n#define SUBTYPE_BLOCK_ACK           9\n#define SUBTYPE_PS_POLL             10\n#define SUBTYPE_RTS                 11\n#define SUBTYPE_CTS                 12\n#define SUBTYPE_ACK                 13\n#define SUBTYPE_CFEND               14\n#define SUBTYPE_CFEND_CFACK         15\n\n/* value domain of 802.11 DATA frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header */\n#define SUBTYPE_DATA                0\n#define SUBTYPE_DATA_CFACK          1\n#define SUBTYPE_DATA_CFPOLL         2\n#define SUBTYPE_DATA_CFACK_CFPOLL   3\n#define SUBTYPE_NULL_FUNC           4\n#define SUBTYPE_CFACK               5\n#define SUBTYPE_CFPOLL              6\n#define SUBTYPE_CFACK_CFPOLL        7\n#define SUBTYPE_QDATA               8\n#define SUBTYPE_QDATA_CFACK         9\n#define SUBTYPE_QDATA_CFPOLL        10\n#define SUBTYPE_QDATA_CFACK_CFPOLL  11\n#define SUBTYPE_QOS_NULL            12\n#define SUBTYPE_QOS_CFACK           13\n#define SUBTYPE_QOS_CFPOLL          14\n#define SUBTYPE_QOS_CFACK_CFPOLL    15\n\n/* ACK policy of QOS Control field bit 6:5 */\n#define NORMAL_ACK                  0x00\t/* b6:5 = 00 */\n#define NO_ACK                      0x20\t/* b6:5 = 01 */\n#define NO_EXPLICIT_ACK             0x40\t/* b6:5 = 10 */\n#define BLOCK_ACK                   0x60\t/* b6:5 = 11 */\n\n#ifdef USB_BULK_BUF_ALIGMENT\n#define BUF_ALIGMENT_RINGSIZE         6\t/*BUF_ALIGMENT_RINGSIZE must  >= 3 */\n#endif /* USB_BULK_BUF_ALIGMENT */\n\n\n/* STA_CSR4.field.TxResult */\n#define TX_RESULT_SUCCESS           0\n#define TX_RESULT_ZERO_LENGTH       1\n#define TX_RESULT_UNDER_RUN         2\n#define TX_RESULT_OHY_ERROR         4\n#define TX_RESULT_RETRY_FAIL        6\n\n\n/* MCS for CCK.  BW.SGI.STBC are reserved */\n#define MCS_LONGP_RATE_1                      0\t/* long preamble CCK 1Mbps */\n#define MCS_LONGP_RATE_2                      1\t/* long preamble CCK 1Mbps */\n#define MCS_LONGP_RATE_5_5                    2\n#define MCS_LONGP_RATE_11                     3\n#define MCS_SHORTP_RATE_1                      4\t/* long preamble CCK 1Mbps. short is forbidden in 1Mbps */\n#define MCS_SHORTP_RATE_2                      5\t/* short preamble CCK 2Mbps */\n#define MCS_SHORTP_RATE_5_5                    6\n#define MCS_SHORTP_RATE_11                     7\n/* To send duplicate legacy OFDM. set BW=BW_40.  SGI.STBC are reserved */\n#define MCS_RATE_6                      0\t/* legacy OFDM */\n#define MCS_RATE_9                      1\t/* OFDM */\n#define MCS_RATE_12                     2\t/* OFDM */\n#define MCS_RATE_18                     3\t/* OFDM */\n#define MCS_RATE_24                     4\t/* OFDM */\n#define MCS_RATE_36                     5\t/* OFDM */\n#define MCS_RATE_48                     6\t/* OFDM */\n#define MCS_RATE_54                     7\t/* OFDM */\n/* HT */\n#define MCS_0\t\t0\t/* 1S */\n#define MCS_1\t\t1\n#define MCS_2\t\t2\n#define MCS_3\t\t3\n#define MCS_4\t\t4\n#define MCS_5\t\t5\n#define MCS_6\t\t6\n#define MCS_7\t\t7\n#define MCS_8\t\t8\t/* 2S */\n#define MCS_9\t\t9\n#define MCS_10\t\t10\n#define MCS_11\t\t11\n#define MCS_12\t\t12\n#define MCS_13\t\t13\n#define MCS_14\t\t14\n#define MCS_15\t\t15\n#define MCS_16\t\t16\t/* 3*3 */\n#define MCS_17\t\t17\n#define MCS_18\t\t18\n#define MCS_19\t\t19\n#define MCS_20\t\t20\n#define MCS_21\t\t21\n#define MCS_22\t\t22\n#define MCS_23\t\t23\n#define MCS_32\t\t32\n#define MCS_AUTO\t\t33\n\n#ifdef DOT11_N_SUPPORT\n/* OID_HTPHYMODE */\n/* MODE */\n#define HTMODE_MM\t0\n#define HTMODE_GF\t1\n#endif /* DOT11_N_SUPPORT */\n\n/* Fixed Tx MODE - HT, CCK or OFDM */\n#define FIXED_TXMODE_HT\t0\n#define FIXED_TXMODE_CCK\t1\n#define FIXED_TXMODE_OFDM \t2\n#define FIXED_TXMODE_VHT\t3\n\n/* BW */\n#define BW_20\t\tBAND_WIDTH_20\n#define BW_40\t\tBAND_WIDTH_40\n#define BW_80\t\tBAND_WIDTH_80\n#define BW_10\t\tBAND_WIDTH_10\t/* 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. */\n\n\n\n#define RF_BW_20\t1\n#define RF_BW_40\t2\n#define RF_BW_10\t4\n#define RF_BW_80\t8\n\n#define RF_MODE_CCK\t1\n#define RF_MODE_OFDM\t2\n\n#ifdef DOT11_N_SUPPORT\n#define HT_BW_20\t\t0\n#define HT_BW_40\t\t1\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n#define VHT_BW_2040\t0\n#define VHT_BW_80\t\t1\n#define VHT_BW_160\t\t2\n#define VHT_BW_8080\t3\n#endif /* DOT11_VHT_AC */\n\n#ifdef DOT11_N_SUPPORT\n/* SHORTGI */\n#define GI_400\t\tGAP_INTERVAL_400\t/* only support in HT mode */\n#define GI_BOTH\t\tGAP_INTERVAL_BOTH\n#endif /* DOT11_N_SUPPORT */\n#define GI_800\t\tGAP_INTERVAL_800\n\n/* STBC */\n#define STBC_NONE\t0\n#ifdef DOT11_N_SUPPORT\n#define STBC_USE\t1\t/* limited use in rt2860b phy */\n#define RXSTBC_ONE\t1\t/* rx support of one spatial stream */\n#define RXSTBC_TWO\t2\t/* rx support of 1 and 2 spatial stream */\n#define RXSTBC_THR\t3\t/* rx support of 1~3 spatial stream */\n/* MCS FEEDBACK */\n#define MCSFBK_NONE\t0\t/* not support mcs feedback / */\n#define MCSFBK_RSV\t1\t/* reserved */\n#define MCSFBK_UNSOLICIT\t2\t/* only support unsolict mcs feedback */\n#define MCSFBK_MRQ\t3\t/* response to both MRQ and unsolict mcs feedback */\n\n/* MIMO power safe */\n#define\tMMPS_STATIC\t0\n#define\tMMPS_DYNAMIC\t\t1\n#define   MMPS_RSV\t\t2\n#define MMPS_ENABLE\t\t3\n\n/* A-MSDU size */\n#define\tAMSDU_0\t0\n#define\tAMSDU_1\t\t1\n\n#endif /* DOT11_N_SUPPORT */\n\n/* MCS use 7 bits */\n#define TXRATEMIMO\t\t0x80\n#define TXRATEMCS\t\t0x7F\n#define TXRATEOFDM\t\t0x7F\n#define RATE_1                      0\n#define RATE_2                      1\n#define RATE_5_5                    2\n#define RATE_11                     3\n#define RATE_6                      4\t/* OFDM */\n#define RATE_9                      5\t/* OFDM */\n#define RATE_12                     6\t/* OFDM */\n#define RATE_18                     7\t/* OFDM */\n#define RATE_24                     8\t/* OFDM */\n#define RATE_36                     9\t/* OFDM */\n#define RATE_48                     10\t/* OFDM */\n#define RATE_54                     11\t/* OFDM */\n#define RATE_FIRST_OFDM_RATE        RATE_6\n#define RATE_LAST_OFDM_RATE        \tRATE_54\n#define RATE_6_5                    12\t/* HT mix */\n#define RATE_13                     13\t/* HT mix */\n#define RATE_19_5                   14\t/* HT mix */\n#define RATE_26                     15\t/* HT mix */\n#define RATE_39                     16\t/* HT mix */\n#define RATE_52                     17\t/* HT mix */\n#define RATE_58_5                   18\t/* HT mix */\n#define RATE_65                     19\t/* HT mix */\n#define RATE_78                     20\t/* HT mix */\n#define RATE_104                    21\t/* HT mix */\n#define RATE_117                    22\t/* HT mix */\n#define RATE_130                    23\t/* HT mix */\n/*#define RATE_AUTO_SWITCH            255 // for StaCfg.FixedTxRate only */\n#define HTRATE_0                      12\n#define RATE_FIRST_MM_RATE        HTRATE_0\n#define RATE_FIRST_HT_RATE        HTRATE_0\n#define RATE_LAST_HT_RATE        HTRATE_0\n\n/* pTxWI->txop */\n#define IFS_HTTXOP                 0\t/* The txop will be handles by ASIC. */\n#define IFS_PIFS                    1\n#define IFS_SIFS                    2\n#define IFS_BACKOFF                 3\n\n/* pTxD->RetryMode */\n#define LONG_RETRY                  1\n#define SHORT_RETRY                 0\n\n/* Country Region definition */\n#define REGION_MINIMUM_BG_BAND            0\n#define REGION_0_BG_BAND                  0\t/* 1-11 */\n#define REGION_1_BG_BAND                  1\t/* 1-13 */\n#define REGION_2_BG_BAND                  2\t/* 10-11 */\n#define REGION_3_BG_BAND                  3\t/* 10-13 */\n#define REGION_4_BG_BAND                  4\t/* 14 */\n#define REGION_5_BG_BAND                  5\t/* 1-14 */\n#define REGION_6_BG_BAND                  6\t/* 3-9 */\n#define REGION_7_BG_BAND                  7\t/* 5-13 */\n#define REGION_31_BG_BAND                 31\t/* 5-13 */\n#define REGION_32_BG_BAND                 32\t/* 1 - 13 */\n#define REGION_33_BG_BAND                 33\t/* 1 - 14 */\n#define REGION_MAXIMUM_BG_BAND            7\n\n#define REGION_MINIMUM_A_BAND             0\n#define REGION_0_A_BAND                   0\t/* 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 */\n#define REGION_1_A_BAND                   1\t/* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 */\n#define REGION_2_A_BAND                   2\t/* 36, 40, 44, 48, 52, 56, 60, 64 */\n#define REGION_3_A_BAND                   3\t/* 52, 56, 60, 64, 149, 153, 157, 161 */\n#define REGION_4_A_BAND                   4\t/* 149, 153, 157, 161, 165 */\n#define REGION_5_A_BAND                   5\t/* 149, 153, 157, 161 */\n#define REGION_6_A_BAND                   6\t/* 36, 40, 44, 48 */\n#define REGION_7_A_BAND                   7\t/* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165, 169, 173 */\n#define REGION_8_A_BAND                   8\t/* 52, 56, 60, 64 */\n#define REGION_9_A_BAND                   9\t/* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 */\n#define REGION_10_A_BAND                  10\t/* 36, 40, 44, 48, 149, 153, 157, 161, 165 */\n#define REGION_11_A_BAND                  11\t/* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 */\n#define REGION_12_A_BAND                  12\t/* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 */\n#define REGION_13_A_BAND                  13\t/* 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161 */\n#define REGION_14_A_BAND                  14\t/* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165 */\n#define REGION_15_A_BAND                  15\t/* 149, 153, 157, 161, 165, 169, 173 */\n#define REGION_16_A_BAND                  16\t/* 52, 56, 60, 64, 149, 153, 157, 161, 165 */\n#define REGION_17_A_BAND                  17\n#define REGION_18_A_BAND                  18\n#define REGION_19_A_BAND                  19\n#define REGION_20_A_BAND                  20\n#define REGION_21_A_BAND                  21\n#define REGION_MAXIMUM_A_BAND             37\n\n/* The security mode definition in MAC register */\n#define CIPHER_NONE                 0\n#define CIPHER_WEP64                1\n#define CIPHER_WEP128               2\n#define CIPHER_TKIP                 3\n#define CIPHER_AES                  4\n#define CIPHER_CKIP64               5\n#define CIPHER_CKIP128              6\n#define CIPHER_CKIP152          \t7\n#define CIPHER_SMS4\t\t\t\t\t8\n\n\n\n/* RC4 init value, used fro WEP & TKIP */\n#define PPPINITFCS32                0xffffffff\t/* Initial FCS value */\n\n/* value domain of pAd->StaCfg.PortSecured. 802.1X controlled port definition */\n#define WPA_802_1X_PORT_SECURED     1\n#define WPA_802_1X_PORT_NOT_SECURED 2\n\n#define PAIRWISE_KEY                1\n#define GROUP_KEY                   2\n\n\n\n/* Rate Adaptation timing */\n#define RA_RATE\t\t5\t\t\t\t\t/* RA every fifth 100msec period */\n#define RA_INTERVAL\t\t(RA_RATE*100)\t/* RA Interval in msec */\n\n/* Rate Adaptation simpling interval setting */\n#define DEF_QUICK_RA_TIME_INTERVAL\t100\n\n#define DEF_RA_TIME_INTRVAL\t\t\t500\n\n/*definition of DRS */\n#define MAX_TX_RATE_INDEX\t\t\t33\t\t/* Maximum Tx Rate Table Index value */\n\n/* pre-allocated free NDIS PACKET/BUFFER poll for internal usage */\n#define MAX_NUM_OF_FREE_NDIS_PACKET 128\n\n/*Block ACK */\n#define MAX_TX_REORDERBUF   64\n#define MAX_RX_REORDERBUF   64\n#define DEFAULT_TX_TIMEOUT   30\n#define DEFAULT_RX_TIMEOUT   30\n#ifdef CONFIG_AP_SUPPORT\n#define MAX_BARECI_SESSION   16\n#endif /* CONFIG_AP_SUPPORT */\n\n/* definition of Recipient or Originator */\n#define I_RECIPIENT                  TRUE\n#define I_ORIGINATOR                   FALSE\n\n#define DEFAULT_BBP_TX_POWER        0\n#define DEFAULT_RF_TX_POWER         5\n#define DEFAULT_BBP_TX_FINE_POWER_CTRL 0\n\n#define MAX_INI_BUFFER_SIZE\t\t4096\n#define MAX_PARAM_BUFFER_SIZE\t\t(2048)\t/* enough for ACL (18*64) */\n\t\t\t\t\t\t\t\t\t\t\t/*18 : the length of Mac address acceptable format \"01:02:03:04:05:06;\") */\n\t\t\t\t\t\t\t\t\t\t\t/*64 : MAX_NUM_OF_ACL_LIST */\n\n#ifdef RT_BIG_ENDIAN\n#define DIR_READ                    0\n#define DIR_WRITE                   1\n#define TYPE_TXD                    0\n#define TYPE_RXD                    1\n#define TYPE_TXINFO\t\t\t\t\t0\n#define TYPE_RXINFO\t\t\t\t\t1\n#define TYPE_TXWI\t\t\t\t\t0\n#define TYPE_RXWI\t\t\t\t\t1\n#endif\n\n/* ========================= AP rtmp_def.h =========================== */\n/* value domain for pAd->EventTab.Log[].Event */\n#define EVENT_RESET_ACCESS_POINT    0\t/* Log = \"hh:mm:ss   Restart Access Point\" */\n#define EVENT_ASSOCIATED            1\t/* Log = \"hh:mm:ss   STA 00:01:02:03:04:05 associated\" */\n#define EVENT_DISASSOCIATED         2\t/* Log = \"hh:mm:ss   STA 00:01:02:03:04:05 left this BSS\" */\n#define EVENT_AGED_OUT              3\t/* Log = \"hh:mm:ss   STA 00:01:02:03:04:05 was aged-out and removed from this BSS\" */\n#define EVENT_COUNTER_M             4\n#define EVENT_INVALID_PSK           5\n#define EVENT_MAX_EVENT_TYPE        6\n/* ==== end of AP rtmp_def.h ============ */\n\n/* definition RSSI Number */\n#define RSSI_0\t\t\t\t\t0\n#define RSSI_1\t\t\t\t\t1\n#define RSSI_2\t\t\t\t\t2\n\n/* definition of radar detection */\n#define RD_NORMAL_MODE\t\t\t\t0\t/* Not found radar signal */\n#define RD_SWITCHING_MODE\t\t\t1\t/* Found radar signal, and doing channel switch */\n#define RD_SILENCE_MODE\t\t\t\t2\t/* After channel switch, need to be silence a while to ensure radar not found */\n\n/*Driver defined cid for mapping status and command. */\n#define  SLEEPCID\t0x11\n#define  WAKECID\t0x22\n#define  QUERYPOWERCID\t0x33\n#define  OWNERMCU\t0x1\n#define  OWNERCPU\t0x0\n\n/* MBSSID definition */\n#define ENTRY_NOT_FOUND             0xFF\n\n/* The signal threshold (RSSI) over new rate adaption */\n#define SIGNAL_THRESHOLD_OVER_NEW_RATE_ADAPT    -65\n\n/* After Linux 2.6.9, \n * VLAN module use Private (from user) interface flags (netdevice->priv_flags). \n * #define IFF_802_1Q_VLAN 0x1         --    802.1Q VLAN device.  in if.h     \n * ref to ip_sabotage_out() [ out->priv_flags & IFF_802_1Q_VLAN ] in br_netfilter.c\n * \n * For this reason, we MUST use EVEN value in priv_flags\n */\n#define INT_MAIN\t\t\t0x0100\n#define INT_MBSSID\t\t\t0x0200\n#define INT_WDS\t\t\t\t0x0300\n#define INT_APCLI\t\t\t0x0400\n#define INT_MESH\t\t\t0x0500\n#define INT_P2P\t\t\t\t0x0600\n\n#define ENTRY_NONE\t\t\t0\n#define ENTRY_CLIENT\t\t1\n#define ENTRY_WDS\t\t\t2\n#define ENTRY_APCLI\t\t\t3\n#define ENTRY_MESH\t\t\t4\n#define ENTRY_DLS\t\t\t5\n#define ENTRY_TDLS\t\t\t6\n\n#ifdef P2P_SUPPORT\n#define P2P_ENTRY_NONE\t\t0\n#define P2P_GO_ENTRY\t\t1\n#define P2P_CLI_ENTRY\t\t2\n#endif /* P2P_SUPPORT */\n\n#define IS_ENTRY_NONE(_x)\t\t((_x)->EntryType == ENTRY_NONE)\n#define IS_ENTRY_CLIENT(_x)\t\t((_x)->EntryType == ENTRY_CLIENT)\n#define IS_ENTRY_WDS(_x)\t\t((_x)->EntryType == ENTRY_WDS)\n#define IS_ENTRY_APCLI(_x)\t\t((_x)->EntryType == ENTRY_APCLI)\n#define IS_ENTRY_MESH(_x)\t\t((_x)->EntryType == ENTRY_MESH)\n#define IS_ENTRY_DLS(_x)\t\t((_x)->EntryType == ENTRY_DLS)\n#define IS_ENTRY_TDLS(_x)\t\t((_x)->EntryType == ENTRY_TDLS)\n#ifdef CLIENT_WDS\n#define IS_ENTRY_CLIWDS(_x)\t\tCLIENT_STATUS_TEST_FLAG((_x), fCLIENT_STATUS_CLI_WDS)\n#endif /* CLIENT_WDS */\n#ifdef P2P_SUPPORT\n#define IS_ENTRY_P2PCLI(_x)\t\tCLIENT_STATUS_TEST_FLAG((_x), fCLIENT_STATUS_P2P_CLI)\n#define IS_P2P_ENTRY_NONE(_x)\t((_x)->P2PEntryType == P2P_ENTRY_NONE)\n#define IS_P2P_GO_ENTRY(_x)\t\t((_x)->P2PEntryType == P2P_GO_ENTRY)\n#define IS_P2P_CLI_ENTRY(_x)\t((_x)->P2PEntryType == P2P_CLI_ENTRY)\n#endif /* P2P_SUPPORT */\n\n#define SET_ENTRY_NONE(_x)\t\t((_x)->EntryType = ENTRY_NONE)\n#define SET_ENTRY_CLIENT(_x)\t((_x)->EntryType = ENTRY_CLIENT)\n#define SET_ENTRY_WDS(_x)\t\t((_x)->EntryType = ENTRY_WDS)\n#define SET_ENTRY_APCLI(_x)\t\t((_x)->EntryType = ENTRY_APCLI)\n#define SET_ENTRY_MESH(_x)\t\t((_x)->EntryType = ENTRY_MESH)\n#define SET_ENTRY_DLS(_x)\t\t((_x)->EntryType = ENTRY_DLS)\n#define SET_ENTRY_TDLS(_x)\t\t((_x)->EntryType = ENTRY_TDLS)\n#ifdef CLIENT_WDS\n#define SET_ENTRY_CLIWDS(_x)\tCLIENT_STATUS_SET_FLAG((_x), fCLIENT_STATUS_CLI_WDS)\n#endif /* CLIENT_WDS */\n#ifdef P2P_SUPPORT\n#define SET_ENTRY_P2PCLI(_x)\tCLIENT_STATUS_SET_FLAG((_x), fCLIENT_STATUS_P2P_CLI)\n#define SET_P2P_GO_ENTRY(_x)\t((_x)->P2PEntryType = P2P_GO_ENTRY)\n#define SET_P2P_CLI_ENTRY(_x)\t((_x)->P2PEntryType = P2P_CLI_ENTRY)\n#define SET_P2P_ENTRY_NONE(_x)\t((_x)->P2PEntryType = P2P_ENTRY_NONE)\n#endif /* P2P_SUPPORT */\n#define SET_PKT_OPMODE_AP(_x)\t\t((_x)->OpMode = OPMODE_AP)\n#define SET_PKT_OPMODE_STA(_x)\t\t((_x)->OpMode = OPMODE_STA)\n#define IS_PKT_OPMODE_AP(_x)\t\t((_x)->OpMode == OPMODE_AP)\n#define IS_PKT_OPMODE_STA(_x)\t\t((_x)->OpMode == OPMODE_STA)\n\n\n#define IS_OPMODE_AP(_x)\t\t((_x)->OpMode == OPMODE_AP)\n#define IS_OPMODE_STA(_x)\t\t((_x)->OpMode == OPMODE_STA)\n\n#ifdef ANDROID_SUPPORT\n#define INF_MAIN_DEV_NAME\t\t\"wlan\"\n#define INF_MBSSID_DEV_NAME\t\t\"wlan\"\n#else\n#define INF_MAIN_DEV_NAME\t\t\"ra\"\n#define INF_MBSSID_DEV_NAME\t\t\"ra\"\n#endif /* ANDROID_SUPPORT */\n#define INF_WDS_DEV_NAME\t\t\"wds\"\n#define INF_APCLI_DEV_NAME\t\t\"apcli\"\n#define INF_MESH_DEV_NAME\t\t\"mesh\"\n#define INF_P2P_DEV_NAME\t\t\"p2p\"\n\n/* WEP Key TYPE */\n#define WEP_HEXADECIMAL_TYPE    0\n#define WEP_ASCII_TYPE          1\n\n/* WIRELESS EVENTS definition */\n/* Max number of char in custom event, refer to wireless_tools.28/wireless.20.h */\n#define IW_CUSTOM_MAX_LEN\t\t\t\t  \t\t\t255\t/* In bytes */\n\n/* For system event - start */\n#define\tIW_SYS_EVENT_FLAG_START                     0x0200\n#define\tIW_ASSOC_EVENT_FLAG                         0x0200\n#define\tIW_DISASSOC_EVENT_FLAG                      0x0201\n#define\tIW_DEAUTH_EVENT_FLAG                      \t0x0202\n#define\tIW_AGEOUT_EVENT_FLAG                      \t0x0203\n#define\tIW_COUNTER_MEASURES_EVENT_FLAG              0x0204\n#define\tIW_REPLAY_COUNTER_DIFF_EVENT_FLAG           0x0205\n#define\tIW_RSNIE_DIFF_EVENT_FLAG           \t\t\t0x0206\n#define\tIW_MIC_DIFF_EVENT_FLAG           \t\t\t0x0207\n#define IW_ICV_ERROR_EVENT_FLAG\t\t\t\t\t\t0x0208\n#define IW_MIC_ERROR_EVENT_FLAG\t\t\t\t\t\t0x0209\n#define IW_GROUP_HS_TIMEOUT_EVENT_FLAG\t\t\t\t0x020A\n#define\tIW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG\t\t\t0x020B\n#define IW_RSNIE_SANITY_FAIL_EVENT_FLAG\t\t\t\t0x020C\n#define IW_SET_KEY_DONE_WPA1_EVENT_FLAG\t\t\t\t0x020D\n#define IW_SET_KEY_DONE_WPA2_EVENT_FLAG\t\t\t\t0x020E\n#define IW_STA_LINKUP_EVENT_FLAG\t\t\t\t\t0x020F\n#define IW_STA_LINKDOWN_EVENT_FLAG\t\t\t\t\t0x0210\n#define IW_SCAN_COMPLETED_EVENT_FLAG\t\t\t\t0x0211\n#define IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG\t\t\t\t0x0212\n#define IW_CHANNEL_CHANGE_EVENT_FLAG\t\t\t\t0x0213\n#define IW_STA_MODE_EVENT_FLAG\t\t\t\t\t\t0x0214\n#define IW_MAC_FILTER_LIST_EVENT_FLAG\t\t\t\t0x0215\n#define IW_AUTH_REJECT_CHALLENGE_FAILURE\t\t\t0x0216\n#define IW_SCANNING_EVENT_FLAG\t\t\t\t\t\t0x0217\n#define IW_START_IBSS_FLAG\t\t\t\t\t\t\t0x0218\n#define IW_JOIN_IBSS_FLAG\t\t\t\t\t\t\t0x0219\n#define IW_SHARED_WEP_FAIL\t\t\t\t\t\t\t0x021A\n#define IW_WPS_END_EVENT_FLAG\t\t\t\t\t\t0x021B\n/* if add new system event flag, please upadte the IW_SYS_EVENT_FLAG_END */\n#define\tIW_SYS_EVENT_FLAG_END                       0x021B\n#define\tIW_SYS_EVENT_TYPE_NUM\t\t\t\t\t\t(IW_SYS_EVENT_FLAG_END - IW_SYS_EVENT_FLAG_START + 1)\n/* For system event - end */\n\n#ifdef IDS_SUPPORT\n/* For spoof attack event - start */\n#define\tIW_SPOOF_EVENT_FLAG_START                   0x0300\n#define IW_CONFLICT_SSID_EVENT_FLAG\t\t\t\t\t0x0300\n#define IW_SPOOF_ASSOC_RESP_EVENT_FLAG\t\t\t\t0x0301\n#define IW_SPOOF_REASSOC_RESP_EVENT_FLAG\t\t\t0x0302\n#define IW_SPOOF_PROBE_RESP_EVENT_FLAG\t\t\t\t0x0303\n#define IW_SPOOF_BEACON_EVENT_FLAG\t\t\t\t\t0x0304\n#define IW_SPOOF_DISASSOC_EVENT_FLAG\t\t\t\t0x0305\n#define IW_SPOOF_AUTH_EVENT_FLAG\t\t\t\t\t0x0306\n#define IW_SPOOF_DEAUTH_EVENT_FLAG\t\t\t\t\t0x0307\n#define IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG\t\t\t0x0308\n#define IW_REPLAY_ATTACK_EVENT_FLAG\t\t\t\t\t0x0309\n/* if add new spoof attack event flag, please upadte the IW_SPOOF_EVENT_FLAG_END */\n#define\tIW_SPOOF_EVENT_FLAG_END                     0x0309\n#define\tIW_SPOOF_EVENT_TYPE_NUM\t\t\t\t\t\t(IW_SPOOF_EVENT_FLAG_END - IW_SPOOF_EVENT_FLAG_START + 1)\n/* For spoof attack event - end */\n\n/* For flooding attack event - start */\n#define\tIW_FLOOD_EVENT_FLAG_START                   0x0400\n#define IW_FLOOD_AUTH_EVENT_FLAG\t\t\t\t\t0x0400\n#define IW_FLOOD_ASSOC_REQ_EVENT_FLAG\t\t\t\t0x0401\n#define IW_FLOOD_REASSOC_REQ_EVENT_FLAG\t\t\t\t0x0402\n#define IW_FLOOD_PROBE_REQ_EVENT_FLAG\t\t\t\t0x0403\n#define IW_FLOOD_DISASSOC_EVENT_FLAG\t\t\t\t0x0404\n#define IW_FLOOD_DEAUTH_EVENT_FLAG\t\t\t\t\t0x0405\n#define IW_FLOOD_EAP_REQ_EVENT_FLAG\t\t\t\t\t0x0406\n/* if add new flooding attack event flag, please upadte the IW_FLOOD_EVENT_FLAG_END */\n#define\tIW_FLOOD_EVENT_FLAG_END                   \t0x0406\n#define\tIW_FLOOD_EVENT_TYPE_NUM\t\t\t\t\t\t(IW_FLOOD_EVENT_FLAG_END - IW_FLOOD_EVENT_FLAG_START + 1)\n/* For flooding attack - end */\n#endif /* IDS_SUPPORT */\n\n#ifdef WSC_INCLUDED\n/* For WSC wireless event - start */\n#define\tIW_WSC_EVENT_FLAG_START                   \t0x0500\n#define IW_WSC_PBC_SESSION_OVERLAP\t\t\t\t\t0x0500\n#define IW_WSC_REGISTRAR_SUPPORT_PBC\t\t\t\t0x0501\n#define IW_WSC_REGISTRAR_SUPPORT_PIN\t\t\t\t0x0502\n#define\tIW_WSC_STATUS_SUCCESS              \t\t\t0x0503\n#define\tIW_WSC_STATUS_FAIL             \t\t\t\t0x0504\n#define\tIW_WSC_2MINS_TIMEOUT           \t\t\t\t0x0505\n#define\tIW_WSC_SEND_EAPOL_START    \t\t\t\t\t0x0506\n#define\tIW_WSC_SEND_WSC_START      \t\t\t\t\t0x0507\n#define\tIW_WSC_SEND_M1           \t\t\t\t\t0x0508\n#define\tIW_WSC_SEND_M2           \t\t\t\t\t0x0509\n#define\tIW_WSC_SEND_M3           \t\t\t\t\t0x050a\n#define\tIW_WSC_SEND_M4           \t\t\t\t\t0x050b\n#define\tIW_WSC_SEND_M5           \t\t\t\t\t0x050c\n#define\tIW_WSC_SEND_M6           \t\t\t\t\t0x050d\n#define\tIW_WSC_SEND_M7           \t\t\t\t\t0x050e\n#define\tIW_WSC_SEND_M8           \t\t\t\t\t0x050f\n#define\tIW_WSC_SEND_DONE           \t\t\t\t\t0x0510\n#define\tIW_WSC_SEND_ACK           \t\t\t\t\t0x0511\n#define\tIW_WSC_SEND_NACK           \t\t\t\t\t0x0512\n#define\tIW_WSC_RECEIVE_WSC_START   \t\t\t\t\t0x0513\n#define\tIW_WSC_RECEIVE_M1          \t\t\t\t\t0x0514\n#define\tIW_WSC_RECEIVE_M2          \t\t\t\t\t0x0515\n#define\tIW_WSC_RECEIVE_M3          \t\t\t\t\t0x0516\n#define\tIW_WSC_RECEIVE_M4          \t\t\t\t\t0x0517\n#define\tIW_WSC_RECEIVE_M5          \t\t\t\t\t0x0518\n#define\tIW_WSC_RECEIVE_M6          \t\t\t\t\t0x0519\n#define\tIW_WSC_RECEIVE_M7          \t\t\t\t\t0x051a\n#define\tIW_WSC_RECEIVE_M8          \t\t\t\t\t0x051b\n#define\tIW_WSC_RECEIVE_DONE        \t\t\t\t\t0x051c\n#define\tIW_WSC_RECEIVE_ACK         \t\t\t\t\t0x051d\n#define\tIW_WSC_RECEIVE_NACK        \t\t\t\t\t0x051e\n#define\tIW_WSC_MANY_CANDIDATE \t\t\t\t\t\t0x051f\n#define IW_WSC_NEXT_CANDIDATE\t\t\t\t\t\t0x0520\n#define\tIW_WSC_T1_TIMER_TIMEOUT        \t\t\t\t0x0521\n#define\tIW_WSC_T2_TIMER_TIMEOUT        \t\t\t\t0x0522\n#define\tIW_WSC_EVENT_FLAG_END                   \t0x0522\n#define\tIW_WSC_EVENT_TYPE_NUM\t\t\t\t\t\t(IW_WSC_EVENT_FLAG_END - IW_WSC_EVENT_FLAG_START + 1)\n/* For WSC wireless event - end */\n#endif /* WSC_INCLUDED */\n/* End - WIRELESS EVENTS definition */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef IWSC_SUPPORT\n// For WSC wireless event - start\n#define\tIW_IWSC_EVENT_FLAG_START                  \t0x0600\n#define\tIW_IWSC_T1_TIMER_TIMEOUT       \t\t\t\t0x0600\n#define\tIW_IWSC_T2_TIMER_TIMEOUT       \t\t\t\t0x0601\n#define IW_IWSC_BECOME_REGISTRAR\t\t\t\t\t0x0602\n#define IW_IWSC_BECOME_ENROLLEE\t\t\t\t\t\t0x0603\n#define IW_IWSC_ENTRY_TIMER_TIMEOUT\t\t\t\t\t0x0604\n#define\tIW_IWSC_EVENT_FLAG_END                   \t0x0604\n#define\tIW_IWSC_EVENT_TYPE_NUM\t\t\t\t\t\t(IW_IWSC_EVENT_FLAG_END - IW_IWSC_EVENT_FLAG_START + 1)\n/* For WSC wireless event - end */\n#endif /* IWSC_SUPPORT */\n\n/* definition for DLS */\n#define\tMAX_NUM_OF_INIT_DLS_ENTRY   1\n#define\tMAX_NUM_OF_DLS_ENTRY        MAX_NUMBER_OF_DLS_ENTRY\n\n/*Block ACK */\n#define MAX_TX_REORDERBUF\t\t64\n#define MAX_RX_REORDERBUF\t\t64\n#define DEFAULT_TX_TIMEOUT\t\t30\n#define DEFAULT_RX_TIMEOUT\t\t30\n#ifndef CONFIG_AP_SUPPORT\n#define MAX_BARECI_SESSION\t\t8\n#endif\n\n#ifndef IW_ESSID_MAX_SIZE\n/* Maximum size of the ESSID and pAd->nickname strings */\n#define IW_ESSID_MAX_SIZE   \t\t32\n#endif\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef MCAST_RATE_SPECIFIC\n#define MCAST_DISABLE\t0\n#define MCAST_CCK\t\t1\n#define MCAST_OFDM\t\t2\n#define MCAST_HTMIX\t\t3\n#endif /* MCAST_RATE_SPECIFIC */\n\n/* For AsicRadioOff/AsicRadioOn function */\n#define DOT11POWERSAVE\t\t0\n#define GUIRADIO_OFF\t\t1\n#define RTMP_HALT\t\t    2\n#define GUI_IDLE_POWER_SAVE\t\t3\n#ifdef RT3290\n#define FROM_TX\t\t4\n#endif /* RT3290 */\n/* -- */\n\n/* definition for WpaSupport flag */\n#define WPA_SUPPLICANT_DISABLE\t\t\t\t0x00\n#define WPA_SUPPLICANT_ENABLE\t\t\t\t0x01\n#define\tWPA_SUPPLICANT_ENABLE_WITH_WEB_UI\t0x02\n#define\tWPA_SUPPLICANT_ENABLE_WPS\t\t\t0x80\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n/* definition for mitigating microwave interference */\n#define MO_FALSE_CCA_TH\t50\n#define MO_MEAS_PERIOD\t0\t/* 0 ~ 100 ms */\n#define MO_IDLE_PERIOD\t1\t/* 100 ~ 1000 ms */\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n/* definition for Antenna Diversity flag */\ntypedef enum {\n\tANT_DIVERSITY_DISABLE,\n\tANT_DIVERSITY_ENABLE ,\n\tANT_FIX_ANT0,\n\tANT_FIX_ANT1,\n\tANT_SW_DIVERSITY_ENABLE,\n\tANT_HW_DIVERSITY_ENABLE,\n\tANT_DIVERSITY_DEFAULT\n}ANT_DIVERSITY_TYPE;\n\nenum IEEE80211_BAND {\n  IEEE80211_BAND_2G,\n  IEEE80211_BAND_5G,\n  IEEE80211_BAND_NUMS\n};\n\nenum {\n\tRESUME_RADIO_ON,\n\tSUSPEND_RADIO_OFF,\n\tMLME_RADIO_ON,\n\tMLME_RADIO_OFF,\n\tDOT11_RADIO_ON,\n\tDOT11_RADIO_OFF,\n};\n\n#ifdef CONFIG_MULTI_CHANNEL\n\nenum {\n\tEDCA_AC0_DEQUEUE_DISABLE = (1 << 0),\n\tEDCA_AC1_DEQUEUE_DISABLE = (1 << 1),\n\tEDCA_AC2_DEQUEUE_DISABLE = (1 << 2),\n\tEDCA_AC3_DEQUEUE_DISBALE = (1 << 3),\n\tHCCA_DEQUEUE_DISABLE = (1 << 4)\n};\n\nenum {\n\tHCCA_TO_EDCA,\n\tEDCA_TO_HCCA = 0x55\n};\n\n#define MUL_CHANNEL_ENABLE 0x77\n#define HCCA_TIMEOUT\t100\n#define EDCA_TIMEOUT\t100\n#define\tMCC_ACTION\t\t400\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n/* Advertismenet Protocol ID definitions */\nenum DOT11U_ADVERTISMENT_PROTOCOL_ID {\n\tACCESS_NETWORK_QUERY_PROTOCOL = 0,\n\tMIH_INFORMATION_SERVICE = 1,\n\tMIH_COMMAND_AND_EVENT_SERVICES_CAPBILITY_DISCOVERY = 2,\n\tEMERGENCY_ALERT_SYSTEM = 3,\n\tVENDOR_SPECIFIC = 221\n};\n\n#define ABS(_x, _y) ((_x) > (_y)) ? ((_x) -(_y)) : ((_y) -(_x))\n\n#define A2Dec(_X, _p) \t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\\\n\tUCHAR *p;\t\t\t\t\t\t\\\n\t_X = 0;\t\t\t\t\t\t\t\\\n\tp = _p;\t\t\t\t\t\t\t\\\n\twhile (((*p >= '0') && (*p <= '9')))\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif ((*p >= '0') && (*p <= '9'))\t\t\\\n\t\t\t_X = _X * 10 + *p - 48;\t\t\t\t\t\\\n\t\tp++;\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n#define A2Hex(_X, _p) \t\t\t\t\\\ndo{\t\t\t\t\t\t\t\t\t\\\n\tchar *__p;\t\t\t\t\t\t\\\n\t(_X) = 0;\t\t\t\t\t\t\t\\\n\t__p = (char *)(_p);\t\t\t\t\t\t\t\\\n\twhile (((*__p >= 'a') && (*__p <= 'f')) || ((*__p >= 'A') && (*__p <= 'F')) || ((*__p >= '0') && (*__p <= '9')))\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif ((*__p >= 'a') && (*__p <= 'f'))\t\t\t\t\\\n\t\t\t(_X) = (_X) * 16 + *__p - 87;\t\t\t\t\t\\\n\t\telse if ((*__p >= 'A') && (*__p <= 'F'))\t\t\\\n\t\t\t(_X) = (_X) * 16 + *__p - 55;\t\t\t\t\t\\\n\t\telse if ((*__p >= '0') && (*__p <= '9'))\t\t\\\n\t\t\t(_X) = (_X) * 16 + *__p - 48;\t\t\t\t\t\\\n\t\t__p++;\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\\\n}while(0)\n\n/* ========================================================================== */\n/*\n\tThe full range (1-4,095) of VLAN IDs must be supported by the 802.1Q\n\timplementation.\n\tVLAN ID 0 is reserved.\n*/\n\n#define RT_VLAN_8023_HEADER_COPY(__pAd, __VLAN_VID, __VLAN_Priority,\t\t\\\n\t\t\t\t\t\t\t\t__pHeader8023, __HdrLen, __pData,\t\t\t\\\n\t\t\t\t\t\t\t\t__FromWhichBSSID, __TPID)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tVLAN_8023_Header_Copy(__VLAN_VID, __VLAN_Priority,\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t__pHeader8023, __HdrLen, __pData,\t\t\t\\\n\t\t\t\t\t\t\t\t__FromWhichBSSID, __TPID);\t\t\t\t\t\\\n}\n\n\n#define RT_VLAN_PKT_DUPLICATE(__pPacket, __pAd, __VLAN_VID, __VLAN_Priority,\\\n\t\t\t\t\t\t\t\t__pHeader8023, __HdrLen, __pData,\t\t\t\\\n\t\t\t\t\t\t\t\t__DataSize, __FromWhichBSSID, __TPID)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pPacket = duplicate_pkt_with_VLAN(\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tget_netdev_from_bssid(__pAd, __FromWhichBSSID),\t\t\t\t\\\n\t\t\t\t__VLAN_VID,\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t__VLAN_Priority,\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t__pHeader8023, __HdrLen, __pData, __DataSize,\t\t\t\t\\\n\t\t\t\t__FromWhichBSSID, __TPID);\t\t\t\t\t\t\t\t\t\\\n}\n\n\n#define RT_80211_TO_8023_PACKET(__pAd, __VLAN_VID, __VLAN_Priority,\t\t\t\\\n\t\t\t\t\t\t\t\t__pRxBlk, __pHeader802_3,\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t__FromWhichBSSID, __TPID)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\twlan_802_11_to_802_3_packet(\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tget_netdev_from_bssid(__pAd, __FromWhichBSSID),\t\t\t\t\\\n\t\t\t\t__pRxBlk->OpMode,\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t__VLAN_VID, __VLAN_Priority,\t\t\t\t\t\t\t\t\\\n\t\t\t\t__pRxBlk->pRxPacket, __pRxBlk->pData, __pRxBlk->DataSize,\t\\\n\t\t\t\t__pHeader802_3, __FromWhichBSSID, __TPID);\t\t\t\t\t\\\n}\n\n#define RTMP_L2_FRAME_TX_ACTION(__pAd, __ApIdx, __FrameBuf, __FrameLen)\t\t\\\n\tRTMPL2FrameTxAction(__pAd, get_netdev_from_bssid(__pAd, __ApIdx),\t\t\\\n\t\t\t\t\t\tannounce_802_3_packet, __ApIdx, __FrameBuf, __FrameLen, __pAd->OpMode)\n\n#define RTMP_DUPLICATE_PACKET(__pAd, __pPacket, __FromWhichBSSID)\t\t\t\\\n\tDuplicatePacket(get_netdev_from_bssid(__pAd, __FromWhichBSSID),\t\t\t\\\n\t\t\t\t\t__pPacket, __FromWhichBSSID)\n\n#define RTMP_UPDATE_OS_PACKET_INFO(__pAd, __pRxBlk, __FromWhichBSSID)\t\t\\\n\tRtmpOsPktInit(__pRxBlk->pRxPacket,\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tget_netdev_from_bssid(__pAd, __FromWhichBSSID),\t\t\t\\\n\t\t\t\t\t__pRxBlk->pData, __pRxBlk->DataSize);\n\n#ifdef SYSTEM_LOG_SUPPORT\n/*\n\tRTMPSendWirelessEvent --> RtmpOsSendWirelessEvent --> RtmpDrvSendWirelessEvent\n*/\n#define RTMPSendWirelessEvent(__pAd, __Event_flag, __pAddr, __BssIdx, __Rssi)\t\\\n\tRtmpOsSendWirelessEvent(__pAd, __Event_flag, __pAddr, __BssIdx, __Rssi,\t\t\\\n\t\t\t\t\t\t\tRtmpDrvSendWirelessEvent);\n#else\n#define RTMPSendWirelessEvent(__pAd, __Event_flag, __pAddr, __BssIdx, __Rssi)\n#endif /* SYSTEM_LOG_SUPPORT */\n\n#define RTMP_OS_TASK_INIT(__pTask, __pTaskName, __pAd)\t\t\\\n\tRtmpOSTaskInit(__pTask, __pTaskName, __pAd, &(__pAd)->RscTaskMemList, &(__pAd)->RscSemMemList);\n\n#endif /* __RTMP_DEF_H__ */\n"
  },
  {
    "path": "src/include/rtmp_dot11.h",
    "content": "/*\n\n*/\n\n#ifndef __DOT11_BASE_H__\n#define __DOT11_BASE_H__\n\n#include \"rtmp_type.h\"\n\n#ifdef DOT11_VHT_AC\n#include \"dot11ac_vht.h\"\n#endif /* DOT11_VHT_AC */\n\n#ifdef TXBF_SUPPORT\n/* CSI/Steering values */\n#define DOT11N_BF_FB_NONE\t\t0\n#define DOT11N_BF_FB_CSI\t\t1\n#define DOT11N_BF_FB_NOCOMP\t2\n#define DOT11N_BF_FB_COMP\t\t3\n#endif /* TXBF_SUPPORT */\n\n/* 4-byte HTC field.  maybe included in any frame except non-QOS data frame.  The Order bit must set 1. */\ntypedef struct GNU_PACKED _HT_CONTROL{\n#ifdef RT_BIG_ENDIAN\n\tUINT32 RDG:1;\n\tUINT32 ACConstraint:1;\n\tUINT32 rsv2:5;\n\tUINT32 NDPAnnounce:1;\n\tUINT32 CSISTEERING:2;\n\tUINT32 rsv1:2;\n\tUINT32 CalSeq:2;\n\tUINT32 CalPos:2;\n\tUINT32 MFBorASC:7;\n\tUINT32 MFSI:3;\n\tUINT32 MSI:3;\n\tUINT32 MRQ:1;\n\tUINT32 TRQ:1;\n\tUINT32 vht:1;\n#else\n\tUINT32 vht:1;\t\t/* indicate for VHT variant or HT variant */\n\tUINT32 TRQ:1;\t\t/*sounding request */\n\tUINT32 MRQ:1;\t\t/*MCS feedback. Request for a MCS feedback */\n\tUINT32 MSI:3;\t\t/*MCS Request, MRQ Sequence identifier */\n\tUINT32 MFSI:3;\t\t/*SET to the received value of MRS. 0x111 for unsolicited MFB. */\n\tUINT32 MFBorASC:7;\t/*Link adaptation feedback containing recommended MCS. 0x7f for no feedback or not available */\n\tUINT32 CalPos:2;\t/* calibration position */\n\tUINT32 CalSeq:2;\t/*calibration sequence */\n\tUINT32 rsv1:2;\t\t/* Reserved */\n\tUINT32 CSISTEERING:2;\t/*CSI/ STEERING */\n\tUINT32 NDPAnnounce:1;\t/* ZLF announcement */\n\tUINT32 rsv2:5;\t\t/*calibration sequence */\n\tUINT32 ACConstraint:1;\t/*feedback request */\n\tUINT32 RDG:1;\t\t/*RDG / More PPDU */\n#endif\t\t\t\t/* !RT_BIG_ENDIAN */\n} HT_CONTROL, *PHT_CONTROL;\n\n/* 2-byte QOS CONTROL field */\ntypedef struct GNU_PACKED _QOS_CONTROL{\n#ifdef RT_BIG_ENDIAN\n\tUSHORT Txop_QueueSize:8;\n\tUSHORT AMsduPresent:1;\n\tUSHORT AckPolicy:2;\t/*0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP  3: BA */\n\tUSHORT EOSP:1;\n\tUSHORT TID:4;\n#else\n\tUSHORT TID:4;\n\tUSHORT EOSP:1;\n\tUSHORT AckPolicy:2;\t/*0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP  3: BA */\n\tUSHORT AMsduPresent:1;\n\tUSHORT Txop_QueueSize:8;\n#endif\t\t\t\t/* !RT_BIG_ENDIAN */\n} QOS_CONTROL, *PQOS_CONTROL;\n\n\ntypedef struct GNU_PACKED _AC_PARAM_RECORD{\n\tUINT8 aci_aifsn;\n\tUINT8 ecw_max:4;\n\tUINT8 ecw_min: 4;\n\tUINT16 txop_limit;\n}AC_PARAM_RECORD;\n\n\ntypedef struct GNU_PACKED _PSPOLL_FRAME {\n\tFRAME_CONTROL FC;\n\tUSHORT Aid;\n\tUCHAR Bssid[MAC_ADDR_LEN];\n\tUCHAR Ta[MAC_ADDR_LEN];\n} PSPOLL_FRAME, *PPSPOLL_FRAME;\n\n\ntypedef struct GNU_PACKED _RTS_FRAME {\n\tFRAME_CONTROL FC;\n\tUSHORT Duration;\n\tUCHAR Addr1[MAC_ADDR_LEN];\n\tUCHAR Addr2[MAC_ADDR_LEN];\n} RTS_FRAME, *PRTS_FRAME;\n\n#endif /* __DOT11_BASE_H__ */\n"
  },
  {
    "path": "src/include/rtmp_iface.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt_iface.h\n\n    Abstract:\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RTMP_IFACE_H__\n#define __RTMP_IFACE_H__\n\n\n\n#ifdef RTMP_USB_SUPPORT\n#include \"iface/rtmp_usb.h\"\n#endif /* RTMP_USB_SUPPORT */\n\ntypedef struct _INF_PCI_CONFIG_ {\n\tunsigned long CSRBaseAddress;\t/* PCI MMIO Base Address, all access will use */\n\tunsigned int irq_num;\n} INF_PCI_CONFIG;\n\ntypedef struct _INF_USB_CONFIG_ {\n\tunsigned char BulkInEpAddr;\t/* bulk-in endpoint address */\n\tunsigned char BulkOutEpAddr[6];\t/* bulk-out endpoint address */\n} INF_USB_CONFIG;\n\ntypedef struct _INF_RBUS_CONFIG_ {\n\tunsigned long csr_addr;\n\tunsigned int irq;\n} INF_RBUS_CONFIG;\n\n\ntypedef union _RTMP_INF_CONFIG_ {\n\tstruct _INF_PCI_CONFIG_ pciConfig;\n\tstruct _INF_USB_CONFIG_ usbConfig;\n\tstruct _INF_RBUS_CONFIG_ rbusConfig;\n} RTMP_INF_CONFIG;\n\n#endif /* __RTMP_IFACE_H__ */\n"
  },
  {
    "path": "src/include/rtmp_mcu.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_mcu.h\n\n\tAbstract:\n\tMiniport header file for mcu related information\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#ifndef __RTMP_MCU_H__\n#define __RTMP_MCU_H__\n\nenum MCU_TYPE {\n\tSWMCU,\n\tM8051,\n\tANDES,\n};\n\n\nstruct _RTMP_ADAPTER;\n\ntypedef void (*CMD_RSP_HANDLER)(struct _RTMP_ADAPTER *pAd, UCHAR *Data);\n\n/*\n * CMD Unit (8051, Andes, ...,and etc)\n */\nstruct CMD_UNIT {\n\tunion {\n\t\tstruct {\n\t\t\tUCHAR Command;\n\t\t\tUCHAR Token;\n\t\t\tUCHAR Arg0;\n\t\t\tUCHAR Arg1;\n\t\t} MCU51;\n\t\tstruct {\n\t\t\tUINT8 Type;\n\t\t\tUSHORT CmdPayloadLen;\n\t\t\tPUCHAR CmdPayload;\n\t\t\tUSHORT RspPayloadLen;\n\t\t\tPUCHAR RspPayload;\n\t\t\tULONG Timeout;\n\t\t\tBOOLEAN NeedRsp;\n\t\t\tBOOLEAN NeedWait;\n\t\t\tCMD_RSP_HANDLER CmdRspHdler;\n\t\t} ANDES;\n\t} u;\n};\n\n\nstruct MCU_CTRL {\n\tUCHAR CmdSeq;\n\tNDIS_SPIN_LOCK CmdRspEventListLock;\n\tDL_LIST CmdRspEventList;\n};\n\n\nstruct CMD_RSP_EVENT {\n\tDL_LIST List;\n\tUCHAR CmdSeq;\t\n\tUINT32 Timeout;\n\tBOOLEAN NeedWait;\n\tPVOID\tAckDone;\n\tUCHAR **RspPayload;\n\tUSHORT *RspPayloadLen;\n};\n\nVOID ChipOpsMCUHook(struct _RTMP_ADAPTER *pAd, enum MCU_TYPE MCUType);\nVOID MCUCtrlInit(struct _RTMP_ADAPTER *pAd);\nVOID MCUCtrlExit(struct _RTMP_ADAPTER *pAd);\n\n#endif \n"
  },
  {
    "path": "src/include/rtmp_os.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trtmp_os.h\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n\n#ifndef __RTMP_OS_H__\n#define __RTMP_OS_H__\n\n/* Driver Operators */\ntypedef int (*RTMP_PRINTK)(const char *ftm, ...);\ntypedef int (*RTMP_SNPRINTF)(char *, ULONG, const char *ftm, ...);\n\ntypedef struct _RTMP_OS_ABL_OPS {\n\tint (*ra_printk)(const char *ftm, ...);\n\tint (*ra_snprintf)(char *, ULONG, const char *ftm, ...);\n} RTMP_OS_ABL_OPS;\n\nextern RTMP_OS_ABL_OPS *pRaOsOps;\n\n#ifdef LINUX\n#ifndef OS_ABL_FUNC_SUPPORT\n#include \"os/rt_linux.h\"\n\n#else\n\n#ifdef RTMP_MODULE_OS\n/* for util/netif */\n#include \"os/rt_linux.h\"\n#else\n/* for core */\n#include \"os/rt_drv.h\"\n#endif /* RTMP_MODULE_OS */\n#endif /* OS_ABL_FUNC_SUPPORT */\n#endif /* LINUX */\n\n\n\n\n\n/*\n\tThis data structure mainly strip some callback function defined in \n\t\"struct net_device\" in kernel source \"include/linux/netdevice.h\".\n\n\tThe definition of this data structure may various depends on different\n\tOS. Use it carefully.\n*/\ntypedef struct _RTMP_OS_NETDEV_OP_HOOK_ {\n\tvoid *open;\n\tvoid *stop;\n\tvoid *xmit;\n\tvoid *ioctl;\n\tvoid *get_stats;\n\tvoid *priv;\n\tvoid *get_wstats;\n\tvoid *iw_handler;\n\tint priv_flags;\n\tunsigned char devAddr[6];\n\tunsigned char devName[16];\n\tunsigned char needProtcted;\n} RTMP_OS_NETDEV_OP_HOOK, *PRTMP_OS_NETDEV_OP_HOOK;\n\n\ntypedef enum _RTMP_TASK_STATUS_ {\n\tRTMP_TASK_STAT_UNKNOWN = 0,\n\tRTMP_TASK_STAT_INITED = 1,\n\tRTMP_TASK_STAT_RUNNING = 2,\n\tRTMP_TASK_STAT_STOPED = 4,\n} RTMP_TASK_STATUS;\n#define RTMP_TASK_CAN_DO_INSERT\t\t(RTMP_TASK_STAT_INITED |RTMP_TASK_STAT_RUNNING)\n\n#define RTMP_OS_TASK_NAME_LEN\t16\n\n#if defined(RTMP_MODULE_OS) || !defined(OS_ABL_FUNC_SUPPORT)\n/* used in UTIL/NETIF module */\ntypedef struct _RTMP_OS_TASK_ {\n\tchar taskName[RTMP_OS_TASK_NAME_LEN];\n\tvoid *priv;\n\t/*unsigned long                 taskFlags; */\n\tRTMP_TASK_STATUS taskStatus;\n#ifndef KTHREAD_SUPPORT\n\tRTMP_OS_SEM taskSema;\n\tRTMP_OS_PID taskPID;\n\tstruct completion taskComplete;\n#endif\n\tunsigned char task_killed;\n#ifdef KTHREAD_SUPPORT\n\tstruct task_struct *kthread_task;\n\twait_queue_head_t kthread_q;\n\tBOOLEAN kthread_running;\n#endif\n} OS_TASK;\n#endif /* RTMP_MODULE_OS || ! OS_ABL_FUNC_SUPPORT */\n\nint RtmpOSIRQRequest(\n\tIN PNET_DEV pNetDev);\n/*int RtmpOSIRQRelease(IN PNET_DEV pNetDev); */\n\n#ifndef OS_ABL_SUPPORT\n#define RTMP_MATOpsInit(__pAd)\n#define RTMP_MATPktRxNeedConvert(__pAd, __pDev)\t\t\t\t\\\n\tMATPktRxNeedConvert(__pAd, __pDev)\n#define RTMP_MATEngineRxHandle(__pAd, __pPkt, __InfIdx)\t\t\\\n\tMATEngineRxHandle(__pAd, __pPkt, __InfIdx)\n#else\n\n#define RTMP_MATOpsInit(__pAd)\t\t\t\t\t\t\t\t\\\n\t(__pAd)->MATPktRxNeedConvert = MATPktRxNeedConvert;\t\t\\\n\t(__pAd)->MATEngineRxHandle = MATEngineRxHandle;\n#define RTMP_MATPktRxNeedConvert(__pAd, __pDev)\t\t\t\t\\\n\t((__pAd)->MATPktRxNeedConvert(__pAd, __pDev))\n#define RTMP_MATEngineRxHandle(__pAd, __pPkt, __InfIdx)\t\t\\\n\t((__pAd)->MATEngineRxHandle(__pAd, __pPkt, __InfIdx))\n#endif /* OS_ABL_SUPPORT */\n\n#endif /* __RMTP_OS_H__ */\n"
  },
  {
    "path": "src/include/rtmp_osabl.h",
    "content": "/****************************************************************************\n\n    Module Name:\n    OS/rtmp_osabl.h\n \n    Abstract:\n\tSome structure/definitions for OS ABL function.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#ifndef __RTMP_OS_ABL_H__\n#define __RTMP_OS_ABL_H__\n\n#ifdef OS_ABL_FUNC_SUPPORT\n\n#ifdef OS_ABL_OS_PCI_SUPPORT\n#define RTMP_MAC_PCI\n#define RTMP_PCI_SUPPORT\n#endif /* OS_ABL_OS_PCI_SUPPORT */\n\n#ifdef OS_ABL_OS_USB_SUPPORT\n#include <linux/usb.h>\n\n#ifndef RTMP_MAC_USB\n#define RTMP_MAC_USB\n#endif /* RTMP_MAC_USB */\n#ifndef RTMP_USB_SUPPORT\n#define RTMP_USB_SUPPORT\n#endif /* RTMP_USB_SUPPORT */\n#endif /* OS_ABL_OS_USB_SUPPORT */\n\n#ifdef OS_ABL_OS_RBUS_SUPPORT\n#define RTMP_RBUS_SUPPORT\n#endif /* OS_ABL_OS_RBUS_SUPPORT */\n\n#ifdef OS_ABL_OS_AP_SUPPORT\n#ifndef CONFIG_AP_SUPPORT\n#define CONFIG_AP_SUPPORT\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* OS_ABL_OS_AP_SUPPORT */\n\n#ifdef OS_ABL_OS_STA_SUPPORT\n#ifndef CONFIG_STA_SUPPORT\n#define CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* OS_ABL_OS_STA_SUPPORT */\n\n/* AP & STA con-current */\n#undef RT_CONFIG_IF_OPMODE_ON_AP\n#undef RT_CONFIG_IF_OPMODE_ON_STA\n\n#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT)\n#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)\t\tif (__OpMode == OPMODE_AP)\n#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)\tif (__OpMode == OPMODE_STA)\n#else\n#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)\n#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)\n#endif\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n#endif /* __RTMP_OS_ABL_H__ */\n\n"
  },
  {
    "path": "src/include/rtmp_timer.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2008, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n\trtmp_timer.h\n\n    Abstract:\n\tRalink Wireless Driver timer related data structures and delcarations\n\t\n    Revision History:\n\tWho           When                What\n\t--------    ----------      ----------------------------------------------\n\tName          Date                 Modification logs\n\tShiang Tu    Aug-28-2008\tinit version\n\t\n*/\n\n#ifndef __RTMP_TIMER_H__\n#define  __RTMP_TIMER_H__\n\n#include \"rtmp_os.h\"\n\n#define DECLARE_TIMER_FUNCTION(_func)\t\t\t\\\n\tvoid rtmp_timer_##_func(unsigned long data)\n\n#define GET_TIMER_FUNCTION(_func)\t\t\t\t\\\n\t(PVOID)rtmp_timer_##_func\n\n/* ----------------- Timer Related MARCO ---------------*/\n/* In some os or chipset, we have a lot of timer functions and will read/write register, */\n/*   it's not allowed in Linux USB sub-system to do it ( because of sleep issue when */\n/*  submit to ctrl pipe). So we need a wrapper function to take care it. */\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\ntypedef VOID(\n\t*RTMP_TIMER_TASK_HANDLE) (\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3);\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\ntypedef struct _RALINK_TIMER_STRUCT {\n\tRTMP_OS_TIMER TimerObj;\t/* Ndis Timer object */\n\tBOOLEAN Valid;\t\t/* Set to True when call RTMPInitTimer */\n\tBOOLEAN State;\t\t/* True if timer cancelled */\n\tBOOLEAN PeriodicType;\t/* True if timer is periodic timer */\n\tBOOLEAN Repeat;\t\t/* True if periodic timer */\n\tULONG TimerValue;\t/* Timer value in milliseconds */\n\tULONG cookie;\t\t/* os specific object */\n\tvoid *pAd;\n#ifdef RTMP_TIMER_TASK_SUPPORT\n\tRTMP_TIMER_TASK_HANDLE handle;\n#endif\t\t\t\t/* RTMP_TIMER_TASK_SUPPORT */\n} RALINK_TIMER_STRUCT, *PRALINK_TIMER_STRUCT;\n\n\n#ifdef RTMP_TIMER_TASK_SUPPORT\ntypedef struct _RTMP_TIMER_TASK_ENTRY_ {\n\tRALINK_TIMER_STRUCT *pRaTimer;\n\tstruct _RTMP_TIMER_TASK_ENTRY_ *pNext;\n} RTMP_TIMER_TASK_ENTRY;\n\n#define TIMER_QUEUE_SIZE_MAX\t128\ntypedef struct _RTMP_TIMER_TASK_QUEUE_ {\n\tunsigned int status;\n\tunsigned char *pTimerQPoll;\n\tRTMP_TIMER_TASK_ENTRY *pQPollFreeList;\n\tRTMP_TIMER_TASK_ENTRY *pQHead;\n\tRTMP_TIMER_TASK_ENTRY *pQTail;\n} RTMP_TIMER_TASK_QUEUE;\n\n#define BUILD_TIMER_FUNCTION(_func)\t\t\t\t\t\t\t\t\t\t\\\nvoid rtmp_timer_##_func(unsigned long data)\t\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPRALINK_TIMER_STRUCT\t_pTimer = (PRALINK_TIMER_STRUCT)data;\t\t\t\t\\\n\tRTMP_TIMER_TASK_ENTRY\t*_pQNode;\t\t\t\t\t\t\t\t\t\t\\\n\tRTMP_ADAPTER\t\t\t*_pAd;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_pTimer->handle = _func;\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_pAd = (RTMP_ADAPTER *)_pTimer->pAd;\t\t\t\t\t\t\t\t\t\t\\\n\t_pQNode = RtmpTimerQInsert(_pAd, _pTimer); \t\t\t\t\t\t\t\t\\\n\tif ((_pQNode == NULL) && (_pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT))\t\\\n\t\tRTMP_OS_Add_Timer(&_pTimer->TimerObj, OS_HZ);               \t\t\t\t\t\\\n}\n#else /* !RTMP_TIMER_TASK_SUPPORT */\n#define BUILD_TIMER_FUNCTION(_func)\t\t\t\t\t\t\t\t\t\t\\\nvoid rtmp_timer_##_func(unsigned long data)\t\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tPRALINK_TIMER_STRUCT\tpTimer = (PRALINK_TIMER_STRUCT) data;\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_func(NULL, (PVOID) pTimer->cookie, NULL, pTimer); \t\t\t\t\t\t\t\\\n\tif (pTimer->Repeat)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tRTMP_OS_Add_Timer(&pTimer->TimerObj, pTimer->TimerValue);\t\t\t\\\n}\n#endif /* RTMP_TIMER_TASK_SUPPORT */\n\nDECLARE_TIMER_FUNCTION(MlmePeriodicExec);\nDECLARE_TIMER_FUNCTION(MlmeRssiReportExec);\nDECLARE_TIMER_FUNCTION(AsicRxAntEvalTimeout);\nDECLARE_TIMER_FUNCTION(APSDPeriodicExec);\nDECLARE_TIMER_FUNCTION(EnqueueStartForPSKExec);\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\nDECLARE_TIMER_FUNCTION(Adhoc_WpaRetryExec);\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef RTMP_MAC_USB\nDECLARE_TIMER_FUNCTION(BeaconUpdateExec);\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_MULTI_CHANNEL\nDECLARE_TIMER_FUNCTION(MCC_ChangeAction);\n\nDECLARE_TIMER_FUNCTION(ConcurrentP2PConnectTimeout);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef CONFIG_AP_SUPPORT\nDECLARE_TIMER_FUNCTION(APDetectOverlappingExec);\n\n#ifdef DOT11N_DRAFT3\nDECLARE_TIMER_FUNCTION(Bss2040CoexistTimeOut);\n#endif /* DOT11N_DRAFT3 */\n\nDECLARE_TIMER_FUNCTION(GREKEYPeriodicExec);\nDECLARE_TIMER_FUNCTION(CMTimerExec);\nDECLARE_TIMER_FUNCTION(WPARetryExec);\n#ifdef AP_SCAN_SUPPORT\nDECLARE_TIMER_FUNCTION(APScanTimeout);\n#endif /* AP_SCAN_SUPPORT */\nDECLARE_TIMER_FUNCTION(APQuickResponeForRateUpExec);\n\n#ifdef IDS_SUPPORT\nDECLARE_TIMER_FUNCTION(RTMPIdsPeriodicExec);\n#endif /* IDS_SUPPORT */\n\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nDECLARE_TIMER_FUNCTION(BeaconTimeout);\nDECLARE_TIMER_FUNCTION(ScanTimeout);\nDECLARE_TIMER_FUNCTION(AuthTimeout);\nDECLARE_TIMER_FUNCTION(AssocTimeout);\nDECLARE_TIMER_FUNCTION(ReassocTimeout);\nDECLARE_TIMER_FUNCTION(DisassocTimeout);\nDECLARE_TIMER_FUNCTION(LinkDownExec);\nDECLARE_TIMER_FUNCTION(StaQuickResponeForRateUpExec);\nDECLARE_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);\n\n#ifdef QOS_DLS_SUPPORT\nDECLARE_TIMER_FUNCTION(DlsTimeoutAction);\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\nDECLARE_TIMER_FUNCTION(TDLS_TimeoutAction);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n#ifdef RTMP_MAC_USB\nDECLARE_TIMER_FUNCTION(RtmpUsbStaAsicForceWakeupTimeout);\n#endif /* RTMP_MAC_USB */\n\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef TXBF_SUPPORT\nDECLARE_TIMER_FUNCTION(eTxBfProbeTimerExec);\n#endif // TXBF_SUPPORT //\n\n#ifdef WSC_INCLUDED\nDECLARE_TIMER_FUNCTION(WscEAPOLTimeOutAction);\nDECLARE_TIMER_FUNCTION(Wsc2MinsTimeOutAction);\nDECLARE_TIMER_FUNCTION(WscUPnPMsgTimeOutAction);\nDECLARE_TIMER_FUNCTION(WscM2DTimeOutAction);\nDECLARE_TIMER_FUNCTION(WscPBCTimeOutAction);\nDECLARE_TIMER_FUNCTION(WscScanTimeOutAction);\nDECLARE_TIMER_FUNCTION(WscProfileRetryTimeout);\n#ifdef WSC_LED_SUPPORT\nDECLARE_TIMER_FUNCTION(WscLEDTimer);\nDECLARE_TIMER_FUNCTION(WscSkipTurnOffLEDTimer);\n#endif /* WSC_LED_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\nDECLARE_TIMER_FUNCTION(WscUpdatePortCfgTimeout);\n#ifdef WSC_V2_SUPPORT\nDECLARE_TIMER_FUNCTION(WscSetupLockTimeout);\n#endif /* WSC_V2_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef IWSC_SUPPORT\nDECLARE_TIMER_FUNCTION(IWSC_T1TimerAction);\nDECLARE_TIMER_FUNCTION(IWSC_T2TimerAction);\nDECLARE_TIMER_FUNCTION(IWSC_EntryTimerAction);\nDECLARE_TIMER_FUNCTION(IWSC_DevQueryAction);\n#endif /* IWSC_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n\n\n#ifdef P2P_SUPPORT\nDECLARE_TIMER_FUNCTION(P2PCTWindowTimer);\nDECLARE_TIMER_FUNCTION(P2pSwNoATimeOut);\nDECLARE_TIMER_FUNCTION(P2pPreAbsenTimeOut);\nDECLARE_TIMER_FUNCTION(P2pWscTimeOut);\nDECLARE_TIMER_FUNCTION(P2pReSendTimeOut);\nDECLARE_TIMER_FUNCTION(P2pCliReConnectTimeOut);\n#endif /* P2P_SUPPORT */\n\n#ifdef RALINK_ATE\nDECLARE_TIMER_FUNCTION(ATEPeriodicExec);\n#endif /* RALINK_ATE */\n\n#endif /* __RTMP_TIMER_H__ */\n"
  },
  {
    "path": "src/include/rtmp_type.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    rtmp_type.h\n\n    Abstract:\n\n    Revision History:\n    Who         When            What\n    --------    ----------      ----------------------------------------------\n    Name        Date            Modification logs\n    Paul Lin    1-2-2004\n*/\n\n#ifndef __RTMP_TYPE_H__\n#define __RTMP_TYPE_H__\n\n\n\n#ifndef GNU_PACKED\n#define GNU_PACKED  __attribute__ ((packed))\n#endif /* GNU_PACKED */\n\n\n#ifdef LINUX\n/* Put platform dependent declaration here */\n/* For example, linux type definition */\ntypedef unsigned char UINT8;\ntypedef unsigned short UINT16;\ntypedef unsigned int UINT32;\ntypedef unsigned long long UINT64;\ntypedef short INT16;\ntypedef int INT32;\ntypedef long long INT64;\n\ntypedef unsigned char UCHAR;\ntypedef unsigned short USHORT;\ntypedef unsigned int UINT;\ntypedef unsigned long ULONG;\n#endif /* LINUX */\n\ntypedef unsigned char *PUINT8;\ntypedef unsigned short *PUINT16;\ntypedef unsigned int *PUINT32;\ntypedef unsigned long long *PUINT64;\ntypedef int *PINT32;\ntypedef long long *PINT64;\n\n/* modified for fixing compile warning on Sigma 8634 platform */\ntypedef char STRING;\n\ntypedef signed char CHAR;\n\ntypedef signed short SHORT;\ntypedef signed int INT;\ntypedef signed long LONG;\ntypedef signed long long LONGLONG;\n\ntypedef unsigned long long ULONGLONG;\n\ntypedef unsigned char BOOLEAN;\n#ifdef LINUX\ntypedef void VOID;\n#endif /* LINUX */\n\ntypedef char *PSTRING;\ntypedef VOID *PVOID;\ntypedef CHAR *PCHAR;\ntypedef UCHAR *PUCHAR;\ntypedef USHORT *PUSHORT;\ntypedef LONG *PLONG;\ntypedef ULONG *PULONG;\ntypedef UINT *PUINT;\n\ntypedef unsigned int NDIS_MEDIA_STATE;\n\ntypedef union _LARGE_INTEGER {\n\tstruct {\n#ifdef RT_BIG_ENDIAN\n\t\tINT32 HighPart;\n\t\tUINT LowPart;\n#else\n\t\tUINT LowPart;\n\t\tINT32 HighPart;\n#endif\n\t} u;\n\tINT64 QuadPart;\n} LARGE_INTEGER;\n\n\n/* Register set pair for initialzation register set definition */\ntypedef struct _RTMP_REG_PAIR {\n\tUINT32 Register;\n\tUINT32 Value;\n} RTMP_REG_PAIR, *PRTMP_REG_PAIR;\n\ntypedef struct _REG_PAIR {\n\tUCHAR Register;\n\tUCHAR Value;\n} REG_PAIR, *PREG_PAIR;\n\ntypedef struct _REG_PAIR_CHANNEL {\n\tUCHAR Register;\n\tUCHAR FirstChannel;\n\tUCHAR LastChannel;\n\tUCHAR Value;\n} REG_PAIR_CHANNEL, *PREG_PAIR_CHANNEL;\n\ntypedef struct _REG_PAIR_BW {\n\tUCHAR Register;\n\tUCHAR BW;\n\tUCHAR Value;\n} REG_PAIR_BW, *PREG_PAIR_BW;\n\n\ntypedef struct _REG_PAIR_PHY{\n\tUCHAR reg;\n\tUCHAR s_ch;\n\tUCHAR e_ch;\n\tUCHAR phy;\t/* RF_MODE_XXX */\n\tUCHAR bw;\t/* RF_BW_XX */\n\tUCHAR val;\n}REG_PAIR_PHY;\n\n\n/* Register set pair for initialzation register set definition */\ntypedef struct _RTMP_RF_REGS {\n\tUCHAR Channel;\n\tUINT32 R1;\n\tUINT32 R2;\n\tUINT32 R3;\n\tUINT32 R4;\n} RTMP_RF_REGS, *PRTMP_RF_REGS;\n\ntypedef struct _FREQUENCY_ITEM {\n\tUCHAR Channel;\n\tUCHAR N;\n\tUCHAR R;\n\tUCHAR K;\n} FREQUENCY_ITEM, *PFREQUENCY_ITEM;\n\ntypedef int NTSTATUS;\n\n#define STATUS_SUCCESS\t\t\t0x00\n#define STATUS_UNSUCCESSFUL \t\t0x01\n\ntypedef struct _QUEUE_ENTRY {\n\tstruct _QUEUE_ENTRY *Next;\n} QUEUE_ENTRY, *PQUEUE_ENTRY;\n\n/* Queue structure */\ntypedef struct _QUEUE_HEADER {\n\tPQUEUE_ENTRY Head;\n\tPQUEUE_ENTRY Tail;\n\tULONG Number;\n} QUEUE_HEADER, *PQUEUE_HEADER;\n\ntypedef struct _BANK_RF_REG_PAIR {\n\tUCHAR Bank;\n\tUCHAR Register;\n\tUCHAR Value;\n} BANK_RF_REG_PAIR, *PBANK_RF_REG_PAIR;\n\ntypedef struct _R_M_W_REG{\n\tUINT32 Register;\n\tUINT32 ClearBitMask;\n\tUINT32 Value;\n} R_M_W_REG, *PR_M_W_REG;\n\ntypedef struct _RF_R_M_W_REG{\n\tUCHAR Bank;\n\tUCHAR Register;\n\tUCHAR ClearBitMask;\n\tUCHAR Value;\n} RF_R_M_W_REG, *PRF_R_M_W_REG;\n\n#endif /* __RTMP_TYPE_H__ */\n"
  },
  {
    "path": "src/include/rtusb_io.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2009, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n \tModule Name:\n\trtusb_io.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t    What\n\t--------\t----------  ----------------------------------------------\n\tName\t\tDate\t    Modification logs\n*/\n\n#ifndef __RTUSB_IO_H__\n#define __RTUSB_IO_H__\n\n#include \"wpa_cmm.h\"\n#include \"rtmp_type.h\"\n\n/* First RTUSB IO command number */\n#define CMDTHREAD_FIRST_CMD_ID\t\t\t\t\t\t0x0D730101\n\n#define CMDTHREAD_RESET_BULK_OUT\t\t\t\t\t\t0x0D730101\n#define CMDTHREAD_RESET_BULK_IN\t\t\t\t\t\t0x0D730102\n#define CMDTHREAD_CHECK_GPIO\t\t\t\t\t\t\t0x0D730103\n#define CMDTHREAD_SET_ASIC_WCID\t\t\t\t\t\t0x0D730104\n#define CMDTHREAD_DEL_ASIC_WCID\t\t\t\t\t\t0x0D730105\n#define CMDTHREAD_SET_CLIENT_MAC_ENTRY\t\t\t\t0x0D730106\n\n#ifdef CONFIG_STA_SUPPORT\n#define CMDTHREAD_SET_PSM_BIT\t\t\t\t\t\t\t0x0D730107\n#define CMDTHREAD_FORCE_WAKE_UP\t\t\t\t\t\t0x0D730108\n#define CMDTHREAD_FORCE_SLEEP_AUTO_WAKEUP\t\t\t0x0D730109\n#define CMDTHREAD_QKERIODIC_EXECUT\t\t\t\t\t0x0D73010A\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#define CMDTHREAD_AP_UPDATE_CAPABILITY_AND_ERPIE\t0x0D73010B\n#define CMDTHREAD_AP_ENABLE_TX_BURST\t\t\t\t0x0D73010C\n#define CMDTHREAD_AP_DISABLE_TX_BURST\t\t\t\t0x0D73010D\n#define CMDTHREAD_AP_ADJUST_EXP_ACK_TIME\t\t\t0x0D73010E\n#define CMDTHREAD_AP_RECOVER_EXP_ACK_TIME\t\t\t0x0D73010F\n#define CMDTHREAD_CHAN_RESCAN\t\t\t\t\t\t0x0D730110\n#endif /* CONFIG_AP_SUPPORT */\n\n#define CMDTHREAD_SET_LED_STATUS\t\t\t\t0x0D730111\t/* Set WPS LED status (LED_WPS_XXX). */\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n#define CMDTHREAD_LED_WPS_MODE10\t\t\t\t\t0x0D730112\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n/* Security related */\n#define CMDTHREAD_SET_WCID_SEC_INFO\t\t\t\t\t0x0D730113\n#define CMDTHREAD_SET_ASIC_WCID_IVEIV\t\t\t\t0x0D730114\n#define CMDTHREAD_SET_ASIC_WCID_ATTR\t\t\t\t0x0D730115\n#define CMDTHREAD_SET_ASIC_SHARED_KEY\t\t\t\t0x0D730116\n#define CMDTHREAD_SET_ASIC_PAIRWISE_KEY\t\t\t\t0x0D730117\n#define CMDTHREAD_REMOVE_PAIRWISE_KEY\t\t\t\t0x0D730118\n#ifdef CONFIG_STA_SUPPORT\n#define CMDTHREAD_SET_PORT_SECURED\t\t\t\t\t0x0D730119\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#define CMDTHREAD_802_11_COUNTER_MEASURE\t\t\t0x0D73011A\n#endif /* CONFIG_AP_SUPPORT */\n\n/* add by johnli, fix \"in_interrupt\" error when call \"MacTableDeleteEntry\" in Rx tasklet */\n#define CMDTHREAD_UPDATE_PROTECT\t\t\t\t\t0x0D73011B\n/* end johnli */\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n#define CMDTHREAD_REG_HINT\t\t\t\t\t\t\t0x0D73011C\n#define CMDTHREAD_REG_HINT_11D\t\t\t\t\t\t0x0D73011D\n#define CMDTHREAD_SCAN_END\t\t\t\t\t\t\t0x0D73011E\n#define CMDTHREAD_CONNECT_RESULT_INFORM\t\t\t\t0x0D73011F\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\n#ifdef P2P_SUPPORT\n#define CMDTHREAD_SET_P2P_LINK_DOWN\t\t\t\t0x0D730120\n#endif /* P2P_SUPPORT */\n\n\n\n#define CMDTHREAD_RESPONSE_EVENT_CALLBACK\t\t\t0x0D730123\n\n\ntypedef struct _CMDHandler_TLV {\n\tUSHORT Offset;\n\tUSHORT Length;\n\tUCHAR DataFirst;\n} CMDHandler_TLV, *PCMDHandler_TLV;\n\n\ntypedef struct _RT_SET_ASIC_WCID {\n\tULONG WCID;\t\t/* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */\n\tULONG SetTid;\t\t/* time-based: seconds, packet-based: kilo-packets */\n\tULONG DeleteTid;\t/* time-based: seconds, packet-based: kilo-packets */\n\tUCHAR Addr[MAC_ADDR_LEN];\t/* avoid in interrupt when write key */\n} RT_SET_ASIC_WCID, *PRT_SET_ASIC_WCID;\n\ntypedef struct _RT_ASIC_WCID_SEC_INFO {\n\tUCHAR BssIdx;\n\tUCHAR KeyIdx;\n\tUCHAR CipherAlg;\n\tUINT8 Wcid;\n\tUINT8 KeyTabFlag;\n} RT_ASIC_WCID_SEC_INFO, *PRT_ASIC_WCID_SEC_INFO;\n\ntypedef struct _RT_ASIC_WCID_IVEIV_ENTRY {\n\tUINT8 Wcid;\n\tUINT32 Iv;\n\tUINT32 Eiv;\n} RT_ASIC_WCID_IVEIV_ENTRY, *PRT_ASIC_WCID_IVEIV_ENTRY;\n\ntypedef struct _RT_ASIC_WCID_ATTR_ENTRY {\n\tUCHAR BssIdx;\n\tUCHAR KeyIdx;\n\tUCHAR CipherAlg;\n\tUINT8 Wcid;\n\tUINT8 KeyTabFlag;\n} RT_ASIC_WCID_ATTR_ENTRY, *PRT_ASIC_WCID_ATTR_ENTRY;\n\ntypedef struct _RT_ASIC_PAIRWISE_KEY {\n\tUINT8 WCID;\n\tCIPHER_KEY CipherKey;\n} RT_ASIC_PAIRWISE_KEY, *PRT_ASIC_PAIRWISE_KEY;\n\ntypedef struct _RT_ASIC_SHARED_KEY {\n\tUCHAR BssIndex;\n\tUCHAR KeyIdx;\n\tCIPHER_KEY CipherKey;\n} RT_ASIC_SHARED_KEY, *PRT_ASIC_SHARED_KEY;\n\ntypedef struct _RT_ASIC_PROTECT_INFO {\n\tUSHORT OperationMode;\n\tUCHAR SetMask;\t\n\tBOOLEAN bDisableBGProtect;\n\tBOOLEAN bNonGFExist;\t\n} RT_ASIC_PROTECT_INFO, *PRT_ASIC_PROTECT_INFO;\n\n/******************************************************************************\n\n  \tUSB Cmd to ASIC Related MACRO\n\n******************************************************************************/\n/* reset MAC of a station entry to 0xFFFFFFFFFFFF */\n#define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid)\t\t\t\t\t\\\n\t{\tRT_SET_ASIC_WCID\tSetAsicWcid;\t\t\t\t\t\t\\\n\t\tSetAsicWcid.WCID = Wcid;\t\t\t\t\t\t\t\t\\\n\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_DEL_ASIC_WCID, \t\\\n\t\t\t\t&SetAsicWcid, sizeof(RT_SET_ASIC_WCID));\t}\n\n/* Set MAC register value according operation mode */\n#ifdef CONFIG_AP_SUPPORT\n#define RTMP_AP_UPDATE_CAPABILITY_AND_ERPIE(pAd)\t\\\n \tRTEnqueueInternalCmd(pAd, CMDTHREAD_AP_UPDATE_CAPABILITY_AND_ERPIE, NULL, 0);\n#endif /* CONFIG_AP_SUPPORT */\n\n/* Insert the BA bitmap to ASIC for the Wcid entry */\n#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID)\t\t\t\t\t\\\n\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tRT_SET_ASIC_WCID\tSetAsicWcid;\t\t\t\t\t\t\t\\\n\t\t\tSetAsicWcid.WCID = (_Aid);\t\t\t\t\t\t\t\t\t\\\n\t\t\tSetAsicWcid.SetTid = (0x10000<<(_TID));\t\t\t\t\t\t\\\n\t\t\tSetAsicWcid.DeleteTid = 0xffffffff;\t\t\t\t\t\t\t\\\n\t\t\tRTEnqueueInternalCmd((_pAd), CMDTHREAD_SET_ASIC_WCID, &SetAsicWcid, sizeof(RT_SET_ASIC_WCID));\t\\\n\t\t}while(0)\n\n/* Remove the BA bitmap from ASIC for the Wcid entry */\n#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID)\t\t\t\t\\\n\t\tdo{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tRT_SET_ASIC_WCID\tSetAsicWcid;\t\t\t\t\t\t\t\\\n\t\t\tSetAsicWcid.WCID = (_Wcid);\t\t\t\t\t\t\t\t\t\\\n\t\t\tSetAsicWcid.SetTid = (0xffffffff);\t\t\t\t\t\t\t\\\n\t\t\tSetAsicWcid.DeleteTid = (0x10000<<(_TID) );\t\t\t\t\t\\\n\t\t\tRTEnqueueInternalCmd((_pAd), CMDTHREAD_SET_ASIC_WCID, &SetAsicWcid, sizeof(RT_SET_ASIC_WCID));\t\\\n\t\t}while(0)\n\n#define RTMP_UPDATE_PROTECT(_pAd, _OperationMode, _SetMask, _bDisableBGProtect, _bNonGFExist)\t\\\n\t\tdo {\\\n\t\t\tRT_ASIC_PROTECT_INFO AsicProtectInfo;\\\n\t\t\tAsicProtectInfo.OperationMode = (_OperationMode);\\\n\t\t\tAsicProtectInfo.SetMask = (_SetMask);\\\n\t\t\tAsicProtectInfo.bDisableBGProtect = (_bDisableBGProtect);\\\n\t\t\tAsicProtectInfo.bNonGFExist = (_bNonGFExist);\\\n\t\t\tRTEnqueueInternalCmd((_pAd), CMDTHREAD_UPDATE_PROTECT, &AsicProtectInfo, sizeof(RT_ASIC_PROTECT_INFO));\\\n\t\t} while(0)\n\n#endif /* __RTUSB_IO_H__ */\n"
  },
  {
    "path": "src/include/spectrum.h",
    "content": "\n#ifndef __SPECTRUM_H__\n#define __SPECTRUM_H__\n\n#include \"rtmp_type.h\"\n#include \"spectrum_def.h\"\n\n\nUINT8 GetRegulatoryMaxTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT8 channel);\n\nCHAR RTMP_GetTxPwr(\n\tIN PRTMP_ADAPTER pAd,\n\tIN HTTRANSMIT_SETTING HTTxMode);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare Measurement request action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID MakeMeasurementReqFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pOutBuffer,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 TotalLen,\n\tIN UINT8 Category,\n\tIN UINT8 Action,\n\tIN UINT8 MeasureToken, \n\tIN UINT8 MeasureReqMode,\n\tIN UINT8 MeasureReqType,\n\tIN UINT16 NumOfRepetitions);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare Measurement report action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID EnqueueMeasurementRep(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA,\n\tIN UINT8 DialogToken,\n\tIN UINT8 MeasureToken, \n\tIN UINT8 MeasureReqMode,\n\tIN UINT8 MeasureReqType,\n\tIN UINT8 ReportInfoLen,\n\tIN PUINT8 pReportInfo);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare TPC Request action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID EnqueueTPCReq(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA,\n\tIN UCHAR DialogToken);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPrepare TPC Report action frame and enqueue it into\n\t\tmanagement queue waiting for transmition.\n\t\t\n\tParametrs:\n\t\t1. the destination mac address of the frame.\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID EnqueueTPCRep(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA,\n\tIN UINT8 DialogToken,\n\tIN UINT8 TxPwr,\n\tIN UINT8 LinkMargin);\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tSpectrun action frames Handler such as channel switch annoucement,\n\t\tmeasurement report, measurement request actions frames.\n\t\t\n\tParametrs:\n\t\tElme - MLME message containing the received frame\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nVOID PeerSpectrumAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\t\n\tParametrs:\n\t\n\tReturn\t: None.\n\t==========================================================================\n */\nINT Set_MeasureReq_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_TpcReq_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_PwrConstraint(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n\nNDIS_STATUS\tMeasureReqTabInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID MeasureReqTabExit(\n\tIN PRTMP_ADAPTER pAd);\n\nPMEASURE_REQ_ENTRY MeasureReqLookUp(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken);\n\nPMEASURE_REQ_ENTRY MeasureReqInsert(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken);\n\nVOID MeasureReqDelete(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UINT8\t\t\tDialogToken);\n\nVOID InsertChannelRepIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN PSTRING pCountry,\n\tIN UINT8 RegulatoryClass);\n\nVOID InsertTpcReportIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 TxPwr,\n\tIN UINT8 LinkMargin);\n\nVOID InsertDialogToken(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 DialogToken);\n\nNDIS_STATUS\tTpcReqTabInit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID TpcReqTabExit(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID NotifyChSwAnnToPeerAPs(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pRA,\n\tIN PUCHAR pTA,\n\tIN UINT8 ChSwMode,\n\tIN UINT8 Channel);\n\nVOID RguClass_BuildBcnChList(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pBuf,\n\tOUT\tPULONG pBufLen);\n#endif /* __SPECTRUM_H__ */\n\n"
  },
  {
    "path": "src/include/spectrum_def.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tspectrum_def.h\n \n    Abstract:\n    Handle association related requests either from WSTA or from local MLME\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n\tFonchi Wu    2008\t  \t   created for 802.11h\n */\n\n#ifndef __SPECTRUM_DEF_H__\n#define __SPECTRUM_DEF_H__\n\n\n#define MAX_MEASURE_REQ_TAB_SIZE\t\t32\n/* Size of hash tab must be power of 2. */\n#define MAX_HASH_MEASURE_REQ_TAB_SIZE\tMAX_MEASURE_REQ_TAB_SIZE\n\n#define MAX_TPC_REQ_TAB_SIZE\t\t\t32\n/* Size of hash tab must be power of 2. */\n#define MAX_HASH_TPC_REQ_TAB_SIZE\t\tMAX_TPC_REQ_TAB_SIZE\n\n#define MIN_RCV_PWR\t\t\t\t100\t\t/* Negative value ((dBm) */\n\n#define TPC_REQ_AGE_OUT\t\t\t500\t\t/* ms */\n#define MQ_REQ_AGE_OUT\t\t\t500\t\t/* ms */\n\n#define TPC_DIALOGTOKEN_HASH_INDEX(_DialogToken)\t((_DialogToken) & (MAX_HASH_TPC_REQ_TAB_SIZE - 1))\n#define MQ_DIALOGTOKEN_HASH_INDEX(_DialogToken)\t\t((_DialogToken) & (MAX_MEASURE_REQ_TAB_SIZE - 1))\n\ntypedef struct _MEASURE_REQ_ENTRY\n{\n\tstruct _MEASURE_REQ_ENTRY *pNext;\n\tULONG lastTime;\n\tBOOLEAN\tValid;\n\tUINT8 DialogToken;\n\tUINT8 MeasureDialogToken[3];\t/* 0:basic measure, 1: CCA measure, 2: RPI_Histogram measure. */\n} MEASURE_REQ_ENTRY, *PMEASURE_REQ_ENTRY;\n\ntypedef struct _MEASURE_REQ_TAB\n{\n\tUCHAR Size;\n\tPMEASURE_REQ_ENTRY Hash[MAX_HASH_MEASURE_REQ_TAB_SIZE];\n\tMEASURE_REQ_ENTRY Content[MAX_MEASURE_REQ_TAB_SIZE];\n} MEASURE_REQ_TAB, *PMEASURE_REQ_TAB;\n\ntypedef struct _TPC_REQ_ENTRY\n{\n\tstruct _TPC_REQ_ENTRY *pNext;\n\tULONG lastTime;\n\tBOOLEAN Valid;\n\tUINT8 DialogToken;\n} TPC_REQ_ENTRY, *PTPC_REQ_ENTRY;\n\ntypedef struct _TPC_REQ_TAB\n{\n\tUCHAR Size;\n\tPTPC_REQ_ENTRY Hash[MAX_HASH_TPC_REQ_TAB_SIZE];\n\tTPC_REQ_ENTRY Content[MAX_TPC_REQ_TAB_SIZE];\n} TPC_REQ_TAB, *PTPC_REQ_TAB;\n\n\n/* The regulatory information */\ntypedef struct _DOT11_CHANNEL_SET\n{\n\tUCHAR NumberOfChannels;\n\tUINT8 MaxTxPwr;\n\tUCHAR ChannelList[16];\n} DOT11_CHANNEL_SET, *PDOT11_CHANNEL_SET;\n\ntypedef struct _DOT11_REGULATORY_INFORMATION\n{\n\tUCHAR RegulatoryClass;\n\tDOT11_CHANNEL_SET ChannelSet;\n} DOT11_REGULATORY_INFORMATION, *PDOT11_REGULATORY_INFORMATION;\n\n\n\n#define RM_TPC_REQ\t\t\t\t0\n#define RM_MEASURE_REQ\t\t\t1\n\n#define RM_BASIC\t\t\t\t0\n#define RM_CCA\t\t\t\t\t1\n#define RM_RPI_HISTOGRAM\t\t2\n#define RM_CH_LOAD\t\t\t\t3\n#define RM_NOISE_HISTOGRAM\t\t4\n\n\ntypedef struct GNU_PACKED _TPC_REPORT_INFO\n{\n\tUINT8 TxPwr;\n\tUINT8 LinkMargin;\n} TPC_REPORT_INFO, *PTPC_REPORT_INFO;\n\ntypedef struct GNU_PACKED _CH_SW_ANN_INFO\n{\n\tUINT8 ChSwMode;\n\tUINT8 Channel;\n\tUINT8 ChSwCnt;\n} CH_SW_ANN_INFO, *PCH_SW_ANN_INFO;\n\ntypedef union GNU_PACKED _MEASURE_REQ_MODE\n{\n#ifdef RT_BIG_ENDIAN\n\tstruct GNU_PACKED\n\t{\n\n\t\tUINT8 :3;\n\t\tUINT8 DurationMandatory:1;\n\t\tUINT8 Report:1;\n\t\tUINT8 Request:1;\n\t\tUINT8 Enable:1;\n\t\tUINT8 Parallel:1;\n\t} field;\n#else\n\tstruct GNU_PACKED\n\t{\n\t\tUINT8 Parallel:1;\n\t\tUINT8 Enable:1;\n\t\tUINT8 Request:1;\n\t\tUINT8 Report:1;\n\t\tUINT8 DurationMandatory:1;\n\t\tUINT8 :3;\n\t} field;\n#endif /* RT_BIG_ENDIAN */\n\tUINT8 word;\n} MEASURE_REQ_MODE, *PMEASURE_REQ_MODE;\n\ntypedef struct GNU_PACKED _MEASURE_REQ\n{\n\tUINT8 ChNum;\n\tUINT64 MeasureStartTime;\n\tUINT16 MeasureDuration;\n} MEASURE_REQ, *PMEASURE_REQ;\n\ntypedef struct GNU_PACKED _MEASURE_REQ_INFO\n{\n\tUINT8 Token;\n\tMEASURE_REQ_MODE ReqMode;\n\tUINT8 ReqType;\n\tUINT8 Oct[0];\n} MEASURE_REQ_INFO, *PMEASURE_REQ_INFO;\n\ntypedef union GNU_PACKED _MEASURE_BASIC_REPORT_MAP\n{\n#ifdef RT_BIG_ENDIAN\n\tstruct GNU_PACKED\n\t{\n\t\tUINT8 Rev:3;\n\n\t\tUINT8 Unmeasure:1;\n\t\tUINT8 Radar:1;\n\t\tUINT8 UnidentifiedSignal:1;\n\t\tUINT8 OfdmPreamble:1;\n\t\tUINT8 BSS:1;\n\t} field;\n#else\n\tstruct GNU_PACKED\n\t{\n\t\tUINT8 BSS:1;\n\n\t\tUINT8 OfdmPreamble:1;\n\t\tUINT8 UnidentifiedSignal:1;\n\t\tUINT8 Radar:1;\n\t\tUINT8 Unmeasure:1;\n\t\tUINT8 Rev:3;\n\t} field;\n#endif /* RT_BIG_ENDIAN */\n\tUINT8 word;\n} MEASURE_BASIC_REPORT_MAP, *PMEASURE_BASIC_REPORT_MAP;\n\ntypedef struct GNU_PACKED _MEASURE_BASIC_REPORT\n{\n\tUINT8 ChNum;\n\tUINT64 MeasureStartTime;\n\tUINT16 MeasureDuration;\n\tMEASURE_BASIC_REPORT_MAP Map;\n} MEASURE_BASIC_REPORT, *PMEASURE_BASIC_REPORT;\n\ntypedef struct GNU_PACKED _MEASURE_CCA_REPORT\n{\n\tUINT8 ChNum;\n\tUINT64 MeasureStartTime;\n\tUINT16 MeasureDuration;\n\tUINT8 CCA_Busy_Fraction;\n} MEASURE_CCA_REPORT, *PMEASURE_CCA_REPORT;\n\ntypedef struct GNU_PACKED _MEASURE_RPI_REPORT\n{\n\tUINT8 ChNum;\n\tUINT64 MeasureStartTime;\n\tUINT16 MeasureDuration;\n\tUINT8 RPI_Density[8];\n} MEASURE_RPI_REPORT, *PMEASURE_RPI_REPORT;\n\ntypedef union GNU_PACKED _MEASURE_REPORT_MODE\n{\n\tstruct GNU_PACKED\n\t{\n#ifdef RT_BIG_ENDIAN\n\t\tUINT8 Rev:5;\n\t\tUINT8 Refused:1;\n\t\tUINT8 Incapable:1;\n\t\tUINT8 Late:1;\n#else\n\t\tUINT8 Late:1;\n\t\tUINT8 Incapable:1;\n\t\tUINT8 Refused:1;\n\t\tUINT8 Rev:5;\n#endif /* RT_BIG_ENDIAN */\n\t} field;\n\tUINT8 word;\n} MEASURE_REPORT_MODE, *PMEASURE_REPORT_MODE;\n\ntypedef struct GNU_PACKED _MEASURE_REPORT_INFO\n{\n\tUINT8 Token;\n\tUINT8 ReportMode;\n\tUINT8 ReportType;\n\tUINT8 Octect[0];\n} MEASURE_REPORT_INFO, *PMEASURE_REPORT_INFO;\n\ntypedef struct GNU_PACKED _QUIET_INFO\n{\n\tUINT8 QuietCnt;\n\tUINT8 QuietPeriod;\n\tUINT16 QuietDuration;\n\tUINT16 QuietOffset;\n} QUIET_INFO, *PQUIET_INFO;\n\n#endif /* __SPECTRUM_DEF_H__ */\n\n"
  },
  {
    "path": "src/include/sta_cfg.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2009, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    sta_cfg.h\n\n    Abstract:\n    \n\n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n\n*/\n\n#ifndef __STA_CFG_H__\n#define __STA_CFG_H__\n\nINT RTMPSTAPrivIoctlSet(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PSTRING SetProcName,\n\tIN PSTRING ProcArg);\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n/* set WOW enable */\nINT Set_WOW_Enable(\n        IN PRTMP_ADAPTER        pAd,\n        IN PSTRING              arg);\n/* set GPIO pin for wake-up signal */\nINT Set_WOW_GPIO(\n        IN PRTMP_ADAPTER        pAd,\n        IN PSTRING              arg);\n/* set delay time for WOW really enable */\nINT Set_WOW_Delay(\n        IN PRTMP_ADAPTER        pAd,\n        IN PSTRING              arg);\n/* set wake up hold time */\nINT Set_WOW_Hold(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ);\n/* set wakeup signal type */\nINT Set_WOW_InBand(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ);\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef RTMP_MAC_USB\n/* Sets the FW into WOW Suspend mode */\nINT Set_UsbWOWSuspend(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ);\n/* Resume the FW to Normal mode */\nINT Set_UsbWOWResume(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ);\n#endif /* RTMP_MAC_USB */\n\n#endif /* __STA_CFG_H__ */\n"
  },
  {
    "path": "src/include/tdls.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    tdls.h\n \n    Abstract:\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 802.11z\n */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\n#ifndef __TDLS_H\n#define __TDLS_H\n\n#include \"dot11z_tdls.h\"\n//#include \"dot11r_ft.h\"\n\n#define LENGTH_TDLS_H\t\t\t\t24\n#define LENGTH_TDLS_PAYLOAD_H\t\t3  /* payload type(1 byte) + category(1 byte) + action(1 byte) */\n#define TDLS_TIMEOUT\t\t\t\t5000\t// unit: msec\n#define\tTDLS_DISCOVERY_TRY_COUNT\t2\n#define TDLS_AUTO_DISCOVERY_INTERVAL\t600\t\t/* unit: msec */\n#define TDLS_RSSI_MEASUREMENT_PERIOD\t10\t\t/* unit: sec */\n#define TDLS_AUTO_DISCOVERY_PERIOD\t\t120\t\t/* unit: sec */\n#define TDLS_DISABLE_PERIOD_BY_TEARDOWN\t120\t\t/* unit: sec */\n#define TDLS_AUTO_SETUP_RSSI_THRESHOLD\t-70\t\t/* unit: dbm */\n#define TDLS_AUTO_TEARDOWN_RSSI_THRESHOLD\t-75 /* unit: dbm */\n\n#define TDLS_AUTO_DISCOVERY_TRY_COUNT\t2\n\nextern UCHAR CipherSuiteTDLSWpa2PskAes[];\nextern UCHAR CipherSuiteTDLSLen;\n\n#define IS_TDLS_SUPPORT(_P) \\\n\t((_P)->StaCfg.TdlsInfo.bTDLSCapable == TRUE)\n\n// TDLS State\ntypedef enum _TDLS_STATE {\n\tTDLS_MODE_NONE,\t\t\t\t/* Init state */\n\tTDLS_MODE_WAIT_RESPONSE,\t\t/* Wait a response from the Responder */\n\tTDLS_MODE_WAIT_CONFIRM,\t\t\t/* Wait an confirm from the Initiator */\n\tTDLS_MODE_CONNECTED,\t\t/* Tunneled Direct Link estabilished */\n/*\tTDLS_MODE_SWITCH_CHANNEL, */\n/*\tTDLS_MODE_PSM, */\n/*\tTDLS_MODE_UAPSD */\n} TDLS_STATE;\n\n// TDLS State\ntypedef enum _TDLS_CHANNEL_SWITCH_STATE {\n\tTDLS_CHANNEL_SWITCH_NONE,\t\t\t\t\t// Init state\n\tTDLS_CHANNEL_SWITCH_WAIT_RSP,\t\t// Wait a response from the Responder\n\tTDLS_CHANNEL_SWITCH_DONE,\t\t\t// Channel Switch Finish\n} TDLS_CHANNEL_SWITCH_STATE;\n\ntypedef struct _MLME_TDLS_REQ_STRUCT {\n\tPRT_802_11_TDLS\tpTDLS;\n\tUSHORT\t\t\tReason;\n\tUCHAR\t\t\tAction;\n\tBOOLEAN\t\t\tIsViaAP;\n} MLME_TDLS_REQ_STRUCT, *PMLME_TDLS_REQ_STRUCT;\n\ntypedef struct _MLME_TDLS_DISCOVERY_STRUCT {\n\tUCHAR\tBSSID[MAC_ADDR_LEN];\n\tUCHAR\tInitiatorAddr[MAC_ADDR_LEN];\n\tUCHAR\tResponderAddr[MAC_ADDR_LEN];\n\tUINT8\tDialogToken;\n} MLME_TDLS_DISCOVERY_STRUCT, *PMLME_TDLS_DISCOVERY_STRUCT;\n\ntypedef struct _MLME_TDLS_CH_SWITCH_STRUCT {\n\tUCHAR\tPeerMacAddr[MAC_ADDR_LEN];\n\t//UINT8\tDialogToken;\n\tUINT8\tTargetChannel;\n\tUINT8\tTargetChannelBW;\n} MLME_TDLS_CH_SWITCH_STRUCT, *PMLME_TDLS_CH_SWITCH_STRUCT;\n\n#define TDLS_DISCOVERY_PEER_ENTRY_SIZE\t32\ntypedef struct _TDLS_DISCOVERY_ENTRY {\n\tstruct _TDLS_DISCOVERY_ENTRY *pNext;\n\tULONG\tInitRefTime;\n\tUCHAR\tResponder[MAC_ADDR_LEN];\n\tUCHAR\tRetryCount;\n\tUCHAR\tDialogToken;\n\tTDLS_CTRL_STATE\tCurrentState;\n\tCHAR\tAvgRssi0;\n\tBOOLEAN bTDLSCapable;\n\tBOOLEAN bConnected;\n\tBOOLEAN bFirstTime;\n\tBOOLEAN bConnectedFirstTime;\n} TDLS_DISCOVERY_ENTRY, *PTDLS_DISCOVERY_ENTRY;\n\ntypedef struct _TDLS_BLACK_ENTRY {\n\tstruct _TDLS_BLACK_ENTRY *pNext;\n\tULONG\tInitRefTime;\n\tUCHAR\tMacAddr[MAC_ADDR_LEN];\n\tUCHAR\tCurrentState;\n} TDLS_BLACK_ENTRY, *PTDLS_BLACK_ENTRY;\n\nVOID\nTDLS_Table_Init(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nVOID\nTDLS_Table_Destory(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID\nTDLS_SearchTabMaintain(\n\tIN PRTMP_ADAPTER pAd);\n\nVOID\nTDLS_StateMachineInit(\n    IN PRTMP_ADAPTER pAd, \n    IN STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[]);\n\nVOID\nTDLS_CntlOidTDLSRequestProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nINT\nTDLS_SearchLinkId(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\tpAddr);\n\nVOID\nTDLS_MlmeParmFill(\n\tIN PRTMP_ADAPTER pAd, \n\tIN OUT MLME_TDLS_REQ_STRUCT *pTdlsReq,\n\tIN PRT_802_11_TDLS pTdls,\n\tIN USHORT Reason,\n\tIN BOOLEAN IsViaAP);\n\nINT\tSet_TdlsCapableProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\targ);\n\nINT\tSet_TdlsSetupProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_TdlsTearDownProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\targ);\n\nINT\nSet_TdlsDiscoveryReqProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\targ);\n\n#ifdef WFD_SUPPORT\nINT Set_TdlsTunneledReqProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\targ);\n#endif /* WFD_SUPPORT */\n\nINT\nSet_TdlsTPKLifeTimeProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\targ);\n\n#ifdef TDLS_AUTOLINK_SUPPORT\nINT\nSet_TdlsAutoLinkProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\nSet_TdlsRssiMeasurementPeriodProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\nSet_TdlsAutoDiscoveryPeriodProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\nSet_TdlsAutoSetupRssiThresholdProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\nSet_TdlsDisabledPeriodByTeardownProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\nSet_TdlsAutoTeardownRssiThresholdProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\targ);\n#endif /* TDLS_AUTOLINK_SUPPORT */\n\nNDIS_STATUS\nTDLS_SetupRequestAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS);\n\nNDIS_STATUS\nTDLS_SetupResponseAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN UCHAR\tRsnLen,\n\tIN PUCHAR\tpRsnIe,\n\tIN UCHAR\tFTLen,\n\tIN PUCHAR\tpFTIe,\n\tIN UCHAR\tTILen,\n\tIN PUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode);\n\nNDIS_STATUS\nTDLS_SetupConfirmAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN UCHAR\tRsnLen,\n\tIN PUCHAR\tpRsnIe,\n\tIN UCHAR\tFTLen,\n\tIN PUCHAR\tpFTIe,\n\tIN UCHAR\tTILen,\n\tIN PUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode);\n\nNDIS_STATUS\nTDLS_DiscoveryReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMacAddr);\n\n#ifdef WFD_SUPPORT\nNDIS_STATUS\nTDLS_TunneledProbeRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMacAddr);\n\nNDIS_STATUS\nTDLS_TunneledProbeResponse(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMacAddr);\n#endif /* WFD_SUPPORT */\n\nNDIS_STATUS\nTDLS_DiscoveryRspAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\tPeerToken,\n\tIN PUCHAR\tpPeerMac);\n\nVOID\nTDLS_DiscoveryRspPublicAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen);\n\n#ifdef TDLS_AUTOLINK_SUPPORT\nVOID\nTDLS_ClearEntryList(\n\tIN  PLIST_HEADER\tpTdlsEnList);\n\nPTDLS_DISCOVERY_ENTRY\nTDLS_FindDiscoveryEntry(\n\tIN\tPLIST_HEADER\t\tpTdlsEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr);\n\nBOOLEAN\nTDLS_InsertDiscoveryPeerEntryByMAC(\n\tIN\tPLIST_HEADER pTdlsEnList,\n\tIN\tPUCHAR pMacAddr,\n\tIN\tBOOLEAN bConnected);\n\nVOID\nTDLS_DelDiscoveryEntryByMAC(\n\tIN\tPLIST_HEADER\t\tpTdlsEnList,\n\tIN  PUCHAR\t\t\tpMacAddr);\n\nVOID\nTDLS_MaintainDiscoveryEntryList(\n\tIN\tPRTMP_ADAPTER\tpAd);\n\nPTDLS_BLACK_ENTRY\nTDLS_FindBlackEntry(\n\tIN\tPLIST_HEADER\tpTdlsEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr);\n\nVOID\nTDLS_InsertBlackEntryByMAC(\n\tIN\tPLIST_HEADER\tpTdlsEnList,\n\tIN\tPUCHAR\t\tpMacAddr,\n\tIN\tUCHAR\tCurrentState);\n\nVOID\nTDLS_DelBlackEntryByMAC(\n\tIN\tPLIST_HEADER\t\tpTdlsEnList,\n\tIN  PUCHAR\t\t\tpMacAddr);\n\nVOID\nTDLS_MaintainBlackList(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPLIST_HEADER\tpTdlsBlackenList);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\nVOID\nTDLS_InitPeerEntryRateCapability(\n\tIN\tPRTMP_ADAPTER pAd,\n\tIN\tMAC_TABLE_ENTRY *pEntry,\n\tIN USHORT *pCapabilityInfo,\n\tIN UCHAR SupportRateLens,\n\tIN UCHAR *pSupportRates,\n\tIN UCHAR HtCapabilityLen,\n\tIN HT_CAPABILITY_IE *pHtCapability);\n\nVOID\nTDLS_BuildSetupRequest(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS);\n\nVOID\nTDLS_BuildSetupResponse(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS,\n\tIN\tUCHAR\tRsnLen,\n\tIN\tPUCHAR\tpRsnIe,\n\tIN\tUCHAR\tFTLen,\n\tIN\tPUCHAR\tpFTIe,\n\tIN\tUCHAR\tTILen,\n\tIN\tPUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode);\n\nVOID\nTDLS_BuildSetupConfirm(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS,\n\tIN\tUCHAR\tRsnLen,\n\tIN\tPUCHAR\tpRsnIe,\n\tIN\tUCHAR\tFTLen,\n\tIN\tPUCHAR\tpFTIe,\n\tIN\tUCHAR\tTILen,\n\tIN\tPUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode);\n\nVOID\nTDLS_BuildTeardown(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN\tUINT16\tReasonCode);\n\nVOID\nTDLS_InsertActField(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tCategory,\n\tIN\tUINT8\tActCode);\n\nVOID\nTDLS_InsertStatusCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT16\tStatusCode);\n\nVOID\nTDLS_InsertReasonCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT16\tReasonCode);\n\nVOID\nTDLS_InsertDialogToken(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tDialogToken);\n\nVOID\nTDLS_InsertLinkIdentifierIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tPUCHAR\tpInitAddr,\n\tIN\tPUCHAR\tpPeerAddr);\n\nVOID\nTDLS_InsertCapIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertSSIDIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertSupportRateIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertCountryIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertSupportChannelIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertExtRateIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertQosCapIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertEDCAParameterSetIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN PRT_802_11_TDLS\tpTDLS);\n\nVOID\nTDLS_InsertWMMIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tBOOLEAN\tbEnable);\n\nVOID\nTDLS_InsertWMMParameterIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\n#ifdef DOT11_N_SUPPORT\nVOID\nTDLS_InsertHtCapIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\n#ifdef DOT11N_DRAFT3\nVOID\nTDLS_InsertBSSCoexistenceIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\nVOID\nTDLS_InsertExtCapIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertFTIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 Length,\n\tIN FT_MIC_CTR_FIELD MICCtr,\n\tIN PUINT8 pMic,\n\tIN PUINT8 pANonce,\n\tIN PUINT8 pSNonce);\n\nVOID\nTDLS_InsertTimeoutIntervalIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN FT_TIMEOUT_INTERVAL_TYPE Type,\n\tIN UINT32 TimeOutValue);\n\nVOID\nTDLS_InsertTargetChannel(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tTargetCh);\n\nVOID\nTDLS_InsertRegulatoryClass(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tTargetCh,\n\tIN\tUINT8\tChWidth);\n\nVOID\nTDLS_InsertSecondaryChOffsetIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUCHAR\tChOffset);\n\nVOID\nTDLS_SupportedRegulatoryClasses(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen);\n\nVOID\nTDLS_InsertChannelSwitchTimingIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUSHORT\tSwitchTime,\n\tIN\tUSHORT\tSwitchTimeOut);\n\nUCHAR\nTDLS_GetRegulatoryClass(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\tChannelWidth,\n\tIN UCHAR\tTargetChannel);\n\nVOID\nTDLS_InsertPuBufferStatus(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tOUT PUCHAR\t\t\t\t\t\tpFrameBuf,\n\tOUT PULONG\t\t\t\t\t\tpFrameLen,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac);\n\nVOID\nTDLS_PeerSetupReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID\nTDLS_PeerSetupRspAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID\nTDLS_PeerSetupConfAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID\nTDLS_MlmeTearDownAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID\nTDLS_PeerTearDownAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\n#ifdef WFD_SUPPORT\nVOID TDLS_MlmeTunneledReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID TDLS_PeerTunneledReqRspAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n#endif /* WFD_SUPPORT */\n\nVOID\nTDLS_MlmeDiscoveryReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID\nTDLS_PeerDiscoveryReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem);\n\nBOOLEAN\nTDLS_MsgTypeSubst(\n\tIN\tUCHAR\tTDLSActionType,\n\tOUT\tINT\t\t*MsgType);\n\nBOOLEAN\nTDLS_CheckTDLSframe(\n    IN PRTMP_ADAPTER    pAd,\n    IN PUCHAR           pData,\n    IN ULONG            DataByteCount);\n\nVOID\nTDLS_LinkTearDown(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN BOOLEAN\tbDirect);\n\nVOID\nTDLS_TearDownPeerLink(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PUCHAR\tpPeerAddr,\n\tIN BOOLEAN\tbDirect);\n\nULONG\nPeerTdlsBasicSanity(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tVOID\t*Msg, \n\tIN\tULONG\tMsgLen,\n\tIN\tBOOLEAN\tbInitiator,\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA);\n\nBOOLEAN\nPeerTdlsSetupReqSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT UCHAR\t*pSupRateLen,\t\n\tOUT UCHAR\tSupRate[],\n\tOUT UCHAR\t*pExtRateLen,\n\tOUT UCHAR\tExtRate[],\n\tOUT BOOLEAN *pbWmmCapable,\n\tOUT UCHAR\t*pQosCapability,\n\tOUT UCHAR\t*pHtCapLen,\n\tOUT HT_CAPABILITY_IE\t*pHtCap,\n\tOUT UCHAR\t*pExtCapLen,\n\tOUT EXT_CAP_INFO_ELEMENT\t*pExtCap,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent);\n\nBOOLEAN\nPeerTdlsSetupRspSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT UCHAR\t*pSupRateLen,\t\n\tOUT UCHAR\tSupRate[],\n\tOUT UCHAR\t*pExtRateLen,\n\tOUT UCHAR\tExtRate[],\n\tOUT BOOLEAN *pbWmmCapable,\n\tOUT UCHAR\t*pQosCapability,\n\tOUT UCHAR\t*pHtCapLen,\n\tOUT HT_CAPABILITY_IE\t*pHtCap,\n\tOUT UCHAR\t*pExtCapLen,\n\tOUT EXT_CAP_INFO_ELEMENT\t*pExtCap,\n\tOUT USHORT\t*pStatusCode,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent);\n\nBOOLEAN\nPeerTdlsSetupConfSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT EDCA_PARM\t*pEdcaParm,\n\tOUT USHORT\t*pStatusCode,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent,\n\tOUT UCHAR\t*pAddHtInfoLen,\n\tOUT ADD_HT_INFO_IE\t*pAddHtInfo);\n\nBOOLEAN\nPeerTdlsTearDownSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n\tOUT UCHAR\t*pSA,\n\tOUT\tBOOLEAN *pIsInitator,\n    OUT USHORT *pReasonCode,\n\tOUT UCHAR\t*pFTLen,    \n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent);\n\nBOOLEAN\nPeerTdlsDiscovReqSanity(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tVOID\t*Msg, \n\tIN\tULONG\tMsgLen,\n\tOUT UCHAR\t*pSA,\n\tOUT UCHAR\t*pToken);\n\nBOOLEAN\nPeerTdlsDiscovRspSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\t\tMsgLen,\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT UCHAR\t*pSupRateLen,\t\n\tOUT UCHAR\tSupRate[],\n\tOUT UCHAR\t*pExtRateLen,\n\tOUT UCHAR\tExtRate[],\n\tOUT UCHAR\t*pHtCapLen,\n\tOUT HT_CAPABILITY_IE\t*pHtCap,\n\tOUT UCHAR\t*pTdlsExtCapLen,\n\tOUT EXT_CAP_INFO_ELEMENT\t*pTdlsExtCap,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent);\n\nVOID\nTDLS_TimeoutAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID\nTDLS_FTDeriveTPK(\n\tIN\tPUCHAR \tmac_i,\n\tIN\tPUCHAR \tmac_r,\n\tIN\tPUCHAR \ta_nonce,\n\tIN\tPUCHAR \ts_nonce,\n\tIN\tPUCHAR \tbssid,\n\tIN\tUINT\tkey_len,\n \tOUT\tPUCHAR\ttpk,\n\tOUT\tPUCHAR\ttpk_name);\n\nUSHORT\nTDLS_TPKMsg1Process(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n#ifdef WFD_SUPPORT\n\tIN\tULONG\t\t\t\tWfdSubelementLen,\n#endif /* WFD_SUPPORT */\n\tIN\tPRT_802_11_TDLS\t\tpTDLS,\n\tIN\tPUCHAR\t\t\t\tpRsnIe, \n\tIN\tUCHAR\t\t\t\tRsnLen, \n\tIN\tPUCHAR\t\t\t\tpFTIe, \n\tIN\tUCHAR\t\t\t\tFTLen, \n\tIN\tPUCHAR\t\t\t\tpTIIe, \n\tIN\tUCHAR\t\t\t\tTILen);\n\nUSHORT\nTDLS_TPKMsg2Process(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPRT_802_11_TDLS\t\tpTDLS,\n\tIN\tPUCHAR\t\t\t\tpRsnIe, \n\tIN\tUCHAR\t\t\t\tRsnLen, \n\tIN\tPUCHAR\t\t\t\tpFTIe, \n\tIN\tUCHAR\t\t\t\tFTLen, \n\tIN\tPUCHAR\t\t\t\tpTIIe, \n\tIN\tUCHAR\t\t\t\tTILen,\n\tOUT\tPUCHAR\t\t\t\tpTPK,\n\tOUT PUCHAR\t\t\t\tpTPKName);\n\nUSHORT\nTDLS_TPKMsg3Process(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPRT_802_11_TDLS\t\tpTDLS,\n\tIN\tPUCHAR\t\t\t\tpRsnIe, \n\tIN\tUCHAR\t\t\t\tRsnLen, \n\tIN\tPUCHAR\t\t\t\tpFTIe, \n\tIN\tUCHAR\t\t\t\tFTLen, \n\tIN\tPUCHAR\t\t\t\tpTIIe, \n\tIN\tUCHAR\t\t\t\tTILen);\n\nNDIS_STATUS\nTDLS_TearDownAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN UINT16\tReasonCode,\n\tIN BOOLEAN\tbDirect);\n\nBOOLEAN\nMlmeTdlsReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PRT_802_11_TDLS *pTDLS,\n    OUT PUINT16 pReason,\n    OUT BOOLEAN *pIsViaAP);\n\nVOID\nTDLS_SendNullFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tTxRate,\n\tIN\tBOOLEAN \t\tbQosNull);\n\nVOID\nTDLS_LinkMaintenance(\n\tIN PRTMP_ADAPTER pAd);\n\nINT\nSet_TdlsEntryInfo_Display_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR arg);\n\nVOID\nTDLS_MlmeSetupReqAction(\n\tIN  PRTMP_ADAPTER   pAd,\n    IN MLME_QUEUE_ELEM *Elem);\n\nVOID\nTDLS_LinkTimeoutAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nVOID\nTDLS_InitChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN HT_CAPABILITY_IE *pHtCapability);\n\n#ifdef TDLS_AUTOLINK_SUPPORT\nUCHAR\nTDLS_ValidIdLookup(\n\tIN\tPRTMP_ADAPTER pAd,\n\tIN\tPUCHAR pAddr);\n\nVOID\nTDLS_AutoSetupByRcvFrame(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PHEADER_802_11 pHeader);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n#ifdef WFD_SUPPORT\nBOOLEAN TDLS_PeerTunneledProbeReqRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT UCHAR *pChannel,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement,\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement);\n#endif /* WFD_SUPPORT */\n\n#endif /* __TDLS_H */\n#endif /* DOT11Z_TDLS_SUPPORT */\n"
  },
  {
    "path": "src/include/tdls_cmm.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    tdls.h\n \n    Abstract:\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 802.11z\n */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\n#ifndef __TDLS_CMM_H\n#define __TDLS_CMM_H\n\n#ifdef WFD_SUPPORT\n#include \"wfd_cmm.h\"\n#endif /* WFD_SUPPORT */\n\n#define TDLS_MAX_BLACL_LIST_SZIE\t64\n#define\tMAX_NUM_OF_TDLS_ENTRY        4\n#define TDLS_ENTRY_AGEOUT_TIME\t\t30\t\t/* unit: sec */\n#define TDLS_MAX_SEARCH_TABLE_SZIE\t64\n\n#define TDLS_SEARCH_ENTRY_AGEOUT 5000  /* seconds */\n#define TDLS_SEARCH_ENTRY_AGEOUT_LIMIT\t600000  /* seconds */\n#define TDLS_SEARCH_POOL_SIZE 64\n#define TDLS_SEARCH_HASH_TAB_SIZE 32  /* the legth of hash table must be power of 2. */\n\n#define TDLS_ENTRY_POOL_SIZE 8\n#define TDLS_ENTRY_HASH_TAB_SIZE 4  /* the legth of hash table must be power of 2. */\n\n#ifdef WFD_SUPPORT\n#define WFD_TUNNELED_PROBE_REQ\t\t4\n#define WFD_TUNNELED_PROBE_RSP\t\t5\n#endif /* WFD_SUPPORT */\n\n#define TDLS_DISCOVERY_IDLE\t\t\t\t0\n#define TDLS_DISCOVERY_FIRST_TIME\t\t1\n#define TDLS_DISCOVERY_TO_SETUP\t\t\t2\n#define TDLS_DISCOVERY_TO_SETUP_DONE\t3\n#define TDLS_DISCOVERY_TO_SETUP_FAIL\t4\n\n#define TDLS_FIFO_MGMT\t\t0\n#define TDLS_FIFO_HCCA\t\t1\n#define TDLS_FIFO_EDCA\t\t2\n#define TDLS_FIFO_ALL\t\t3\n\n// states of tdls ctrl state machine\ntypedef enum _TDLS_CTRL_STATE\n{\n\tTDLS_CTRL_IDLE,\n\tTDLS_CTRL_CHANNEL_SWITCH,\n\tTDLS_CTRL_MAX_STATES,\n} TDLS_CTRL_STATE;\n\n// events of tdls ctrl state machine\ntypedef enum _TDLS_CTRL_EVENT\n{\n\t// Events from SME.\n\tTDLS_MLME_CHANNEL_SWITCH_REQ,\n\tTDLS_MLME_CHANNEL_SWITCH_RSP,\n\tTDLS_PEER_CHANNEL_SWITCH_REQ,\n\tTDLS_PEER_CHANNEL_SWITCH_RSP,\n\tTDLS_CTRL_MAX_EVENTS,\n} TDLS_CTRL_EVENT;\n\n#define\tTDLS_CTRL_FUNC_SIZE\t(TDLS_CTRL_MAX_STATES * TDLS_CTRL_MAX_EVENTS)\n\n// states of tdls link management state machine\ntypedef enum _TDLS_LINK_MNG_STATE\n{\n\tTDLS_LINK_IDLE,\n\tTDLS_LINK_SETUP_REQ,\n\tTDLS_LINK_SETUP_RSP,\n\tTDLS_LINK_ESTAB,\n\tTDLS_LINK_TEAR_DOWN,\n\tTDLS_LINK_MAX_STATES,\n} TDLS_LINK_MNG_STATE;\n\n// events of tdls link management state machine\ntypedef enum _TDLS_LINK_MNG_EVENT\n{\n\t// Events from SME.\n\tTDLS_LINK_MLME_SETUP_REQ,\n\tTDLS_LINK_PEER_SETUP_REQ,\n\tTDLS_LINK_PEER_SETUP_RSP,\n\tTDLS_LINK_PEER_SETUP_CONF,\n\tTDLS_LINK_MLME_TEARDOWN,\n\tTDLS_LINK_PEER_TEARDOWN,\n\tTDLS_LINK_MAX_EVENTS,\n} TDLS_LINK_MNG_EVENT;\n\n#define\tTDLS_LINK_MNG_FUNC_SIZE\t(TDLS_LINK_MNG_MAX_STATES * TDLS_LINK_MNG_MAX_EVENTS)\n\n#define\tTDLS_BLACK_NONE\t\t\t\t0\n#define\tTDLS_BLACK_WAIT_NEXT_TRY\t1\n#define TDLS_BLACK_AUTO_DISCOVERY\t2\n#define\tTDLS_BLACK_TDLS_BY_TEARDOWN\t3\n\ntypedef struct _TDLS_SEARCH_ENTRY {\n\tstruct _TDLS_SEARCH_ENTRY * pNext;\n\tULONG\tLastRefTime;\n\tUCHAR\tRetryCount;\n\tUCHAR\tInitRefTime;\n\tUCHAR\tAddr[MAC_ADDR_LEN];\n} TDLS_SEARCH_ENTRY, *PTDLS_SEARCH_ENTRY;\n\n/* TDLS Settings for each link entry */\ntypedef struct _RT_802_11_TDLS {\n\tUSHORT\t\t\tTimeOut;\t\t/* unit: second , set by UI */\n\tUSHORT\t\t\tCountDownTimer;\t/* unit: second , used by driver only */\n\tUCHAR\t\t\tMacAddr[MAC_ADDR_LEN];\t\t/* set by UI */\n\tUCHAR\t\t\tStatus;\t\t\t/* 0: none , 1: wait result, 2: wait add , 3: connected */\n\tBOOLEAN\t\t\tValid;\t\t\t/* 1: valid , 0: invalid , set by UI, use to setup or tear down DLS link */\n\t/* The above parameters are the same as RT_802_11_DLS_UI */\n\n#ifdef UAPSD_SUPPORT\n\tBOOLEAN\t\t\tFlgIsWaitingUapsdTraRsp; /* 1: waiting for traffic rsp frame */\n\tUCHAR\t\t\tUapsdTraIndDelayCnt; /* used to send a detect traffic ind */\n\tBOOLEAN\t\t\tFlgIsUapsdTraRspRcv; /* if we have ever received rsp frame */\n#endif /* UAPSD_SUPPORT */\n\n\tUCHAR\t\t\tToken;\t\t\t/* Dialog token */\n\tRALINK_TIMER_STRUCT\tTimer;\t\t\t/* Use to time out while handshake */\n\tBOOLEAN\t\t\tbInitiator;\t\t/* TRUE: I am TDLS Initiator STA, FALSE: I am TDLS Responder STA */\n\tUCHAR\t\t\tMacTabMatchWCID;\n\tPVOID\t\t\tpAd;\n\tUSHORT\t\t\tCapabilityInfo;\n\n\t/* Copy supported rate from desired Initiator. We are trying to match */\n\t/* Initiator's supported and extended rate settings. */\n\tUCHAR\t\t\tSupRateLen;\n\tUCHAR\t\t\tExtRateLen;\n\tUCHAR\t\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t\tExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\n\t/* For TPK handshake */\n\tUCHAR\t\t\tANonce[32];\t/* Generated in Message 1, random variable */\n\tUCHAR\t\t\tSNonce[32];\t/* Generated in Message 2, random variable */\n\tULONG\t\t\tKeyLifetime;\t/*  Use type= 'Key Lifetime Interval' unit: Seconds, min lifetime = 300 seconds */\n\tUCHAR\t\t\tTPK[LEN_PMK];\t/* TPK-KCK(16 bytes) for MIC + TPK-TP (16 bytes) for data */\n\tUCHAR\t\t\tTPKName[LEN_PMK_NAME];\n\t\n\t/* For QOS */\n\tBOOLEAN\t\t\tbWmmCapable;\t/* WMM capable of the peer TDLS */\n\tUCHAR\t\t\tQosCapability; /* QOS capability of the current connecting Initiator */\n\tEDCA_PARM\t\tEdcaParm;\t\t/* EDCA parameters of the Initiator */\n\n\t/* Features */\n\tUCHAR\t\t\t\t\tHtCapabilityLen;\n\tHT_CAPABILITY_IE\t\tHtCapability;\n\tUCHAR\t\t\t\t\tTdlsExtCapLen;\n\tEXT_CAP_INFO_ELEMENT\tTdlsExtCap;\n\n\t/* Channel Switch */\n\tUINT8\t\t\t\t\tTdlsTargetChannel;\n\tUINT8\t\t\t\t\tTdlsTargetChannelBW;\n\tBOOLEAN \t\t\t\tbDoingPeriodChannelSwitch;\n\tBOOLEAN \t\t\t\tbChannelSwitchInitiator;\n\tUCHAR\t\t\t\t\tChannelSwitchCurrentState;\n\tUSHORT\t\t\t\t\tChSwitchTime;\t\n\tRALINK_TIMER_STRUCT \tChannelSwitchTimer; \t\t// Use to channel switch\n\tUSHORT\t\t\t\t\tChSwitchTimeout;\n\tRALINK_TIMER_STRUCT \tChannelSwitchTimeoutTimer;\t\t\t// Use to channel switch\n\tBOOLEAN \t\t\t\tbEnableChSwitchTime;\n\tULONG\t\t\t\t\tChannelSwitchTimerStartTime;\n\n#ifdef WFD_SUPPORT\n\tWFD_ENTRY_INFO\t\t\tWfdEntryInfo;\n#endif /* WFD_SUPPORT */\n\n} RT_802_11_TDLS, *PRT_802_11_TDLS;\n\n/* change PS mode to ACTIVE mode before building a TDLS link */\n#define TDLS_CHANGE_TO_ACTIVE(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tBOOLEAN __FlgOld = (__pAd)->StaCfg.TdlsInfo.TdlsFlgIsKeepingActiveCountDown;\t\t\\\n\t(__pAd)->StaCfg.TdlsInfo.TdlsFlgIsKeepingActiveCountDown = TRUE;\t\t\t\t\t\\\n\t(__pAd)->StaCfg.TdlsInfo.TdlsPowerSaveActiveCountDown =\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\tTDLS_POWER_SAVE_ACTIVE_COUNT_DOWN_NUM;\t\t\\\n\tif (__FlgOld == FALSE)\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* send a null frame to trigger asic sleep */\t\t\t\t\t\t\\\n\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, FALSE);\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n/* recover PS mode when TdlsPowerSaveActiveCountDown = 0 */\n#define TDLS_RECOVER_POWER_SAVE(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t(__pAd)->StaCfg.TdlsInfo.TdlsFlgIsKeepingActiveCountDown = FALSE;\t\t\t\t\\\n\t(__pAd)->StaCfg.TdlsInfo.TdlsPowerSaveActiveCountDown = 0;\t\t\t\t\t\t\\\n\t/* send a null frame to trigger asic sleep */\t\t\t\t\t\t\t\\\n\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, FALSE);\t\t\t\t\t\\\n}\n#endif /* __TDLS_CMM_H */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n"
  },
  {
    "path": "src/include/uapsd.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n    Abstract:\n\n\tAll related WMM UAPSD definitions & function prototype.\n\n***************************************************************************/\n\n\n/* only for UAPSD_TIMING_RECORD */\n\n\n#define UAPSD_TIMING_RECORD_MAX\t\t\t\t1000\n#define UAPSD_TIMING_RECORD_DISPLAY_TIMES\t10\n\n#define UAPSD_QUEUE_TIMEOUT\t\t\t\t\t5 /* unit: seconds */\n\n#define UAPSD_TIMING_RECORD_ISR\t\t\t\t1\n#define UAPSD_TIMING_RECORD_TASKLET\t\t\t2\n#define UAPSD_TIMING_RECORD_TRG_RCV\t\t\t3\n#define UAPSD_TIMING_RECORD_MOVE2TX\t\t\t4\n#define UAPSD_TIMING_RECORD_TX2AIR\t\t\t5\n\n#define UAPSD_TIMING_CTRL_STOP\t\t\t\t0\n#define UAPSD_TIMING_CTRL_START\t\t\t\t1\n#define UAPSD_TIMING_CTRL_SUSPEND\t\t\t2\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n#define UAPSD_TIMING_RECORD_START()\t\t\t\t\\\n\tUAPSD_TimingRecordCtrl(UAPSD_TIMING_CTRL_START);\n#define UAPSD_TIMING_RECORD_STOP()\t\t\t\t\\\n\tUAPSD_TimingRecordCtrl(UAPSD_TIMING_CTRL_STOP);\n#define UAPSD_TIMING_RECORD(__pAd, __Type)\t\t\\\n\tUAPSD_TimingRecord(__pAd, __Type);\n#define UAPSD_TIMING_RECORD_INDEX(__LoopIndex)\t\\\n\tUAPSD_TimeingRecordLoopIndex(__LoopIndex);\n#else\n\n#define UAPSD_TIMING_RECORD_START()\n#define UAPSD_TIMING_RECORD_STOP()\n#define UAPSD_TIMING_RECORD(__pAd, __type)\n#define UAPSD_TIMING_RECORD_INDEX(__LoopIndex)\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\n\n/* timing */\n#define UAPSD_TIMESTAMP_GET(__pAd, __TimeStamp)\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT32 __CSR=0;\tUINT64 __Value64;\t\t\t\t\\\n\t\tRTMP_IO_READ32((__pAd), TSF_TIMER_DW0, &__CSR);\t\\\n\t\t__TimeStamp = (UINT64)__CSR;\t\t\t\t\t\\\n\t\tRTMP_IO_READ32((__pAd), TSF_TIMER_DW1, &__CSR);\t\\\n\t\t__Value64 = (UINT64)__CSR;\t\t\t\t\t\t\\\n\t\t__TimeStamp |= (__Value64 << 32);\t\t\t\t\\\n\t}\n\n\n#define UAPSD_TIME_GET(__pAd, __Time)\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tNdisGetSystemUpTime(&__Time);\t\t\t\t\t\\\n\t}\n\n/* uapsd packet */\n#ifdef VENDOR_FEATURE3_SUPPORT\n#define UAPSD_INSERT_QUEUE_AC\tUAPSD_InsertTailQueueAc\n#else\n#define UAPSD_INSERT_QUEUE_AC\tInsertTailQueueAc\n#endif /* VENDOR_FEATURE3_SUPPORT */\n\n/* uapsd initialization */\n#define UAPSD_INFO_INIT(__pInfo)\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t(__pInfo)->bAPSDCapable = FALSE;\t\t\t\t\t\\\n}\n\n#define UAPSD_SP_START(__pAd, __pEntry)\t\t\t\t\t\\\n\t__pEntry->bAPSDFlagSPStart = 1;\n\n#ifdef CONFIG_STA_SUPPORT\n#define UAPSD_SP_END(__pAd, __pEntry)\t\t\t\t\t\\\n\t__pEntry->bAPSDFlagSPStart = 0;\t\t\t\t\t\t\\\n\tRtmpAsicSleepHandle(__pAd);\n#else\n/* for AP, we maybe sleep until all SPs are closed */\n#define UAPSD_SP_END(__pAd, __pEntry)\t\t\t\t\t\\\n\t__pEntry->bAPSDFlagSPStart = 0;\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\n/* ASIC power save behavior */\n/* TODO: maybe need to do protection */\n#define ASIC_PS_CAN_SLEEP(__pAd)\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pAd->StaCfg.FlgPsmCanNotSleep = FALSE;\n\n#define ASIC_PS_CAN_NOT_SLEEP(__pAd)\t\t\t\t\t\t\t\t\t\t\\\n\t__pAd->StaCfg.FlgPsmCanNotSleep = TRUE;\n\n/* we will recover ps mode after 5 second if no packet is received. */\n#define RTMP_PS_VIRTUAL_MAX_TIME_OUT\t\t5\n\n/* reset virtual ps mode timeout when we receive any packet from the peer */\n#define RTMP_PS_VIRTUAL_TIMEOUT_RESET(__pMacEntry)\t\t\t\t\t\t\t\\\n\tif (__pMacEntry->VirtualTimeout > 0)\t\t\t\t\t\t\t\t\t\\\n\t\t__pMacEntry->VirtualTimeout = RTMP_PS_VIRTUAL_MAX_TIME_OUT;\n\n/* wake up the peer virtually */\n#define RTMP_PS_VIRTUAL_WAKEUP_PEER(__pMacEntry)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pMacEntry->FlgPsModeIsWakeForAWhile = TRUE;\t\t\t\t\t\t\t\\\n\t__pMacEntry->VirtualTimeout = RTMP_PS_VIRTUAL_MAX_TIME_OUT;\t\t\t\t\\\n\tDBGPRINT(RT_DEBUG_TRACE,\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(\"%02x:%02x:%02x:%02x:%02x:%02x will not sleep for a while!\\n\",\t\t\\\n\t\t__pMacEntry->Addr[0], __pMacEntry->Addr[1], __pMacEntry->Addr[2],\t\\\n\t\t__pMacEntry->Addr[3], __pMacEntry->Addr[4], __pMacEntry->Addr[5]));\t\t\t\t\t\t\t\t\t\t\t\\\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n/* recover the peer power save mode virtually */\n#define RTMP_PS_VIRTUAL_SLEEP(__pMacEntry)\t\t\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t__pMacEntry->FlgPsModeIsWakeForAWhile = FALSE;\t\t\t\t\t\t\t\\\n\t__pMacEntry->VirtualTimeout = 0;\t\t\t\t\t\t\t\t\t\t\\\n\tDBGPRINT(RT_DEBUG_TRACE,\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(\"%02x:%02x:%02x:%02x:%02x:%02x can sleep (ps mode = %d)!\\n\",\t\t\\\n\t\t__pMacEntry->Addr[0], __pMacEntry->Addr[1], __pMacEntry->Addr[2],\t\\\n\t\t__pMacEntry->Addr[3], __pMacEntry->Addr[4], __pMacEntry->Addr[5],\t\\\n\t\t__pMacEntry->PsMode));\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n/* check if the peer virtual ps mode timeout */\n#define RTMP_PS_VIRTUAL_TIMEOUT_HANDLE(__pMacEntry)\t\t\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif (__pMacEntry->VirtualTimeout > 0)\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t__pMacEntry->VirtualTimeout --;\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pMacEntry->VirtualTimeout == 0)\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(\"tdls uapsd> virtual ps timeout!\\n\"));\t\t\t\t\t\\\n\t\t\tRTMP_PS_VIRTUAL_SLEEP(__pMacEntry);\t\t\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n/* extern MACRO & function */\n#ifndef MODULE_WMM_UAPSD\n\n#define UAPSD_EXTERN\t\t\textern\n\n/* Public Marco list */\n\n/*\n\tInit some parameters in packet structure for QoS Null frame;\n\tpurpose: is for management frame tx done use\n*/\n#define UAPSD_MR_QOS_NULL_HANDLE(__pAd, __pData, __pPacket)\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tPHEADER_802_11 __pHeader = (PHEADER_802_11)(__pData);\t\t\t\t\\\n\t\tMAC_TABLE_ENTRY *__pEntry;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pHeader->FC.SubType == SUBTYPE_QOS_NULL)\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tRTMP_SET_PACKET_QOS_NULL((__pPacket));\t\t\t\t\t\t\t\\\n\t\t\t__pEntry = MacTableLookup((__pAd), __pHeader->Addr1);\t\t\t\\\n\t\t\tif (__pEntry != NULL)\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tRTMP_SET_PACKET_WCID((__pPacket), __pEntry->Aid);\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tRTMP_SET_PACKET_NON_QOS_NULL((__pPacket));\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\n\n/*\n\tInit MAC entry UAPSD parameters;\n\tpurpose: initialize UAPSD PS queue and control parameters\n*/\n#define UAPSD_MR_ENTRY_INIT(__pEntry)\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT16\t__IdAc;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tfor(__IdAc=0; __IdAc<WMM_NUM_OF_AC; __IdAc++)\t\t\t\t\t\t\\\n\t\t\tInitializeQueueHeader(&(__pEntry)->UAPSDQueue[__IdAc]);\t\t\t\\\n\t\t(__pEntry)->UAPSDTxNum = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(__pEntry)->pUAPSDEOSPFrame = NULL;\t\t\t\t\t\t\t\t\t\\\n\t\t(__pEntry)->bAPSDFlagSPStart = 0;\t\t\t\t\t\t\t\t\t\\\n\t\t(__pEntry)->bAPSDFlagEOSPOK = 0;\t\t\t\t\t\t\t\t\t\\\n\t\t(__pEntry)->MaxSPLength = 0;\t\t\t\t\t\t\t\t\t\t\\\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> MaxSPLength = 0!\\n\"));\t\t\t\\\n\t}\n\n/*\n\tReset MAC entry UAPSD parameters;\n   purpose: clean all UAPSD PS queue; release the EOSP frame if exists;\n\t\t\treset control parameters\n*/\n#define UAPSD_MR_ENTRY_RESET(__pAd, __pEntry)\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tMAC_TABLE_ENTRY *__pSta; \t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT32 __IdAc;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t__pSta = (__pEntry);\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t/* clear all U-APSD queues */\t\t\t\t\t\t\t\t\t\t\\\n\t\tfor(__IdAc=0; __IdAc<WMM_NUM_OF_AC; __IdAc++)\t\t\t\t\t\t\\\n\t\t\tRtmpCleanupPsQueue((__pAd), &__pSta->UAPSDQueue[__IdAc]);\t\t\\\n\t\t/* clear EOSP frame */\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t__pSta->UAPSDTxNum = 0;\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pSta->pUAPSDEOSPFrame != NULL) {\t\t\t\t\t\t\t\t\\\n\t\t\tRELEASE_NDIS_PACKET((__pAd),\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\tQUEUE_ENTRY_TO_PACKET(__pSta->pUAPSDEOSPFrame),\t\\\n\t\t\t\t\t\t\tNDIS_STATUS_FAILURE);\t\t\t\t\t\t\t\\\n\t\t\t__pSta->pUAPSDEOSPFrame = NULL; }\t\t\t\t\t\t\t\t\\\n\t\t__pSta->bAPSDFlagSPStart = 0;\t\t\t\t\t\t\t\t\t\t\\\n\t\t__pSta->bAPSDFlagEOSPOK = 0;                                                                            \\\n\t\tUAPSD_SP_END(__pAd, __pSta);\t\t\t\t\t\t\t\t\t\t\\\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"uapsd> clear UAPSD queues!\\n\")); }\n\n/*\n * we can not use bMoreData bit to get EOSP bit because\n * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 \n */\n#define UAPSD_MR_EOSP_SET(__pQosCtrl, __pTxBlk)\t\t\t\t\t\t\t\t\\\n\tif (CLIENT_STATUS_TEST_FLAG((__pTxBlk)->pMacEntry,\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\tfCLIENT_STATUS_APSD_CAPABLE)) {\t\t\t\t\\\n\t\t if (TX_BLK_TEST_FLAG((__pTxBlk), fTX_bWMM_UAPSD_EOSP))\t\t\t\t\\\n\t\t\t*(__pQosCtrl) |= (1 << 4);\t\t\t\t\t\t\t\t\t\t\\\n\t}\n\n/*\n\tEnable or disable UAPSD flag in WMM element in beacon frame;\n\tpurpose: set UAPSD enable/disable bit\n*/\n#define UAPSD_MR_IE_FILL(__QosCtrlField, __pUapsdInfo)\t\t\t\t\t\t\\\n\t\t(__QosCtrlField) |= ((__pUapsdInfo)->bAPSDCapable) ? 0x80 : 0x00;\n\n/*\n\tCheck if we do NOT need to control TIM bit for the station;\n\tnote: we control TIM bit only when all AC are UAPSD AC\n*/\n#define UAPSD_MR_IS_NOT_TIM_BIT_NEEDED_HANDLED(__pMacEntry, __QueIdx)\t\t\\\n\t\t(CLIENT_STATUS_TEST_FLAG((__pMacEntry), fCLIENT_STATUS_APSD_CAPABLE) && \\\n\t\t\t(!(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_VO] ||\t\t\t\\\n\t\t\t!(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_VI] ||\t\t\t\\\n\t\t\t!(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_BE] ||\t\t\t\\\n\t\t\t!(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_BK]) &&\t\t\t\\\n\t\t(__pMacEntry)->bAPSDDeliverEnabledPerAC[__QueIdx])\n\n/* check if the AC is UAPSD delivery-enabled AC */\n#define UAPSD_MR_IS_UAPSD_AC(__pMacEntry, __AcId)\t\t\t\t\t\t\t\\\n\t\t(CLIENT_STATUS_TEST_FLAG((__pMacEntry), fCLIENT_STATUS_APSD_CAPABLE) &&\t\\\n\t\t\t((0 <= (__AcId)) && ((__AcId) < WMM_NUM_OF_AC)) && /* 0 ~ 3 */\t\\\n\t\t\t(__pMacEntry)->bAPSDDeliverEnabledPerAC[(__AcId)])\n\n/* check if all AC are UAPSD delivery-enabled AC */\n#define UAPSD_MR_IS_ALL_AC_UAPSD(__FlgIsActive, __pMacEntry)\t\t\t\t\\\n\t\t(((__FlgIsActive) == FALSE) && ((__pMacEntry)->bAPSDAllAC == 1))\n\n/* suspend SP */\n#define UAPSD_MR_SP_SUSPEND(__pAd)\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(__pAd)->bAPSDFlagSPSuspend = 1;\n\n/* resume SP */\n#define UAPSD_MR_SP_RESUME(__pAd)\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(__pAd)->bAPSDFlagSPSuspend = 0;\n\n/* mark PS poll frame sent in mix mode */\n\n#ifdef RTMP_MAC_USB\n#define UAPSD_MR_MIX_PS_POLL_RCV(__pAd, __pMacEntry)\n#endif /* RTMP_MAC_USB */\n\n#else\n\n#define UAPSD_EXTERN\n#define UAPSD_QOS_NULL_QUE_ID\t0x7f\n\n\n#define UAPSD_EPT_SP_INT\t\t(100000/(1000000/OS_HZ)) /* 100ms */\n\n#endif /* MODULE_WMM_UAPSD */\n\n\n/* max UAPSD buffer queue size */\n#define MAX_PACKETS_IN_UAPSD_QUEUE\t16\t/* for each AC = 16*4 = 64 */\n\n\n/* Public function list */\n/*\n========================================================================\nRoutine Description:\n\tUAPSD Module Init.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_Init(\n\tIN\tPRTMP_ADAPTER\t\tpAd);\n\n\n/*\n========================================================================\nRoutine Description:\n\tUAPSD Module Release.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_Release(\n\tIN\tPRTMP_ADAPTER\t\tpAd);\n\n\n/*\n========================================================================\nRoutine Description:\n    Check if ASIC can enter sleep mode. Not software sleep.\n\nArguments:\n\tpAd\t\tPointer to our adapter\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID RtmpAsicSleepHandle(\n    IN  PRTMP_ADAPTER       pAd);\n\n/*\n========================================================================\nRoutine Description:\n\tClose current Service Period.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpEntry\t\t\tClose the SP of the entry\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_SP_Close(\n    IN  PRTMP_ADAPTER       pAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry);\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the SP for entry is closed.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpEntry\t\t\tthe peer entry\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN BOOLEAN UAPSD_SP_IsClosed(\n    IN  PRTMP_ADAPTER       pAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry);\n\n/*\n========================================================================\nRoutine Description:\n\tDeliver all queued packets.\n\nArguments:\n\tpAd            Pointer to our adapter\n\t*pEntry        STATION\n\nReturn Value:\n\tNone\n\nNote:\n\tSMP protection by caller for packet enqueue.\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_AllPacketDeliver(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry);\n\n\n/*\n========================================================================\nRoutine Description:\n\tParse the UAPSD field in WMM element in (re)association request frame.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tSTATION\n\t*pElm\t\t\tQoS information field\n\tFlgApsdCapable\tTRUE: Support UAPSD\n\nReturn Value:\n\tNone\n\nNote:\n\tNo protection is needed.\n\n\t1. Association -> TSPEC:\n\t\tuse static UAPSD settings in Association\n\t\tupdate UAPSD settings in TSPEC\n\n\t2. Association -> TSPEC(11r) -> Reassociation:\n\t\tupdate UAPSD settings in TSPEC\n\t\tbackup static UAPSD settings in Reassociation\n\n\t3. Association -> Reassociation:\n\t\tupdate UAPSD settings in TSPEC\n\t\tbackup static UAPSD settings in Reassociation\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_AssocParse(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tIN\tUCHAR\t\t\t\t*pElm,\n\tIN\tBOOLEAN\t\t\t\tFlgApsdCapable);\n\n\n/*\n========================================================================\nRoutine Description:\n\tEnqueue a UAPSD packet.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tSTATION\n\tpPacket\t\t\tUAPSD dnlink packet\n\tIdAc\t\t\tUAPSD AC ID (0 ~ 3)\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_PacketEnqueue(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tIN\tPNDIS_PACKET\t\tpPacket,\n\tIN\tUINT32\t\t\t\tIdAc);\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandle QoS Null Frame Tx Done or Management Tx Done interrupt.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpPacket\t\t\tCompleted TX packet\n\tpDstMac\t\t\tDestinated MAC address\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_QoSNullTxMgmtTxDoneHandle(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPNDIS_PACKET\t\tpPacket,\n\tIN\tUCHAR\t\t\t\t*pDstMac);\n\n\n/*\n========================================================================\nRoutine Description:\n\tMaintenance our UAPSD PS queue.  Release all queued packet if timeout.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tSTATION\n\nReturn Value:\n\tNone\n\nNote:\n\tIf in RT2870, pEntry can not be removed during UAPSD_QueueMaintenance()\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_QueueMaintenance(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry);\n\n\n/*\n========================================================================\nRoutine Description:\n\tClose SP in Tx Done, not Tx DMA Done.\n\nArguments:\n\tpAd            Pointer to our adapter\n\tpEntry\t\t\tdestination entry\n\tFlgSuccess\t\t0:tx success, 1:tx fail\n\nReturn Value:\n    None\n\nNote:\n\tFor RT28xx series, for packetID=0 or multicast frame, no statistics\n\tcount can be got, ex: ARP response or DHCP packets, we will use\n\tlow rate to set (CCK, MCS=0=packetID).\n\tSo SP will not be close until UAPSD_EPT_SP_INT timeout.\n\n\tSo if the tx rate is 1Mbps for a entry, we will use DMA done, not\n\tuse UAPSD_SP_AUE_Handle().\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_SP_AUE_Handle(\n\tIN RTMP_ADAPTER\t\t*pAd,\n    IN MAC_TABLE_ENTRY\t*pEntry,\n\tIN UCHAR\t\t\tFlgSuccess);\n\n\n/*\n========================================================================\nRoutine Description:\n\tClose current Service Period.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNone\n\nNote:\n\tWhen we receive EOSP frame tx done interrupt and a uplink packet\n\tfrom the station simultaneously, we will regard it as a new trigger\n\tframe because the packet is received when EOSP frame tx done interrupt.\n\n\tWe can not sure the uplink packet is sent after old SP or in the old SP.\n\tSo we must close the old SP in receive done ISR to avoid the problem.\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_SP_CloseInRVDone(\n\tIN\tPRTMP_ADAPTER\t\tpAd);\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if we need to close current SP.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tpPacket\t\t\tCompleted TX packet\n\tpDstMac\t\t\tDestinated MAC address\n\nReturn Value:\n\tNone\n\nNote:\n\t1. We need to call the function in TxDone ISR.\n\t2. SMP protection by caller for packet enqueue.\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_SP_PacketCheck(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPNDIS_PACKET\t\tpPacket,\n\tIN\tUCHAR\t\t\t\t*pDstMac);\n\n\n#ifdef UAPSD_TIMING_RECORD_FUNC\n/*\n========================================================================\nRoutine Description:\n\tEnable/Disable Timing Record Function.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tFlag\t\t\t1 (Enable) or 0 (Disable)\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_TimingRecordCtrl(\n\tIN\tUINT32\t\t\t\tFlag);\n\n/*\n========================================================================\nRoutine Description:\n\tRecord some timings.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tType\t\t\tThe timing is for what type\n\nReturn Value:\n\tNone\n\nNote:\n\tUAPSD_TIMING_RECORD_ISR\n\tUAPSD_TIMING_RECORD_TASKLET\n\tUAPSD_TIMING_RECORD_TRG_RCV\n\tUAPSD_TIMING_RECORD_MOVE2TX\n\tUAPSD_TIMING_RECORD_TX2AIR\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_TimingRecord(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tUINT32\t\t\t\tType);\n\n/*\n========================================================================\nRoutine Description:\n\tRecord the loop index for received packet handle.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tLoopIndex\t\tThe RxProcessed in APRxDoneInterruptHandle()\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_TimeingRecordLoopIndex(\n\tIN\tUINT32\t\t\t\tLoopIndex);\n#endif /* UAPSD_TIMING_RECORD_FUNC */\n\n\n/*\n========================================================================\nRoutine Description:\n    Get the queue status for delivery-enabled AC.\n\nArguments:\n\tpAd\t\t\t\t\tPointer to our adapter\n\tpEntry\t\t\t\tthe peer entry\n\tpFlgIsAnyPktForBK\tTRUE: At lease a BK packet is queued\n\tpFlgIsAnyPktForBE\tTRUE: At lease a BE packet is queued\n\tpFlgIsAnyPktForVI\tTRUE: At lease a VI packet is queued\n\tpFlgIsAnyPktForVO\tTRUE: At lease a VO packet is queued\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nVOID UAPSD_QueueStatusGet(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tOUT\tBOOLEAN\t\t\t\t*pFlgIsAnyPktForBK,\n\tOUT BOOLEAN\t\t\t\t*pFlgIsAnyPktForBE,\n\tOUT BOOLEAN\t\t\t\t*pFlgIsAnyPktForVI,\n\tOUT BOOLEAN\t\t\t\t*pFlgIsAnyPktForVO);\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandle UAPSD Trigger Frame.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pEntry\t\t\tthe source STATION\n\tUpOfFrame\t\tthe UP of the trigger frame\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_TriggerFrameHandle(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tMAC_TABLE_ENTRY\t\t*pEntry,\n\tIN\tUCHAR\t\t\t\tUpOfFrame);\n\n\n#ifdef RTMP_MAC_USB\n/*\n========================================================================\nRoutine Description:\n\tTag current offset of the AC in USB URB tx buffer.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\t*pPkt\t\t\tthe tx packet\n\tWcid\t\t\tdestination entry id\n\tPktOffset\t\tUSB tx buffer offset\n\nReturn Value:\n    None\n\nNote:\n\tOnly for RT2870.\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_TagFrame(\n\tIN\tRTMP_ADAPTER\t\t*pAd,\n\tIN\tNDIS_PACKET\t\t\t*pPkt,\n\tIN\tUCHAR\t\t\t\tWcid,\n\tIN\tUINT32\t\t\t\tPktOffset);\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if UAPSD packets are tx ok.\n\nArguments:\n\tpAd\t\t\t\tPointer to our adapter\n\tAcQueId\t\t\tTX completion for the AC (0 ~ 3)\n\tbulkStartPos\n\tbulkEnPos\n\nReturn Value:\n\tNone\n\nNote:\n\tOnly for RT2870.\n========================================================================\n*/\nUAPSD_EXTERN VOID UAPSD_UnTagFrame(\n\tIN\tRTMP_ADAPTER\t*pAd,\n\tIN\tUCHAR\t\t\tAcQueId,\n\tIN\tUINT32\t\t\tbulkStartPos,\n\tIN\tUINT32\t\t\tbulkEnPos);\n#endif /* RTMP_MAC_USB */\n\n/* End of ap_uapsd.h */\n"
  },
  {
    "path": "src/include/vht.h",
    "content": "/*\n\n*/\n\n#include \"dot11ac_vht.h\"\n\n\nstruct _RTMP_ADAPTER;\nstruct _RT_PHY_INFO;\n\n\nVOID dump_vht_cap(struct _RTMP_ADAPTER *pAd, VHT_CAP_IE *vht_ie);\nVOID dump_vht_op(struct _RTMP_ADAPTER *pAd, VHT_OP_IE *vht_ie);\n\nINT build_vht_ies(struct _RTMP_ADAPTER *pAd, UCHAR *buf, UCHAR frm);\nINT build_vht_cap_ie(RTMP_ADAPTER *pAd, UCHAR *buf);\n\nUCHAR vht_cent_ch_freq(struct _RTMP_ADAPTER *pAd, UCHAR prim_ch);\nINT vht_mode_adjust(struct _RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, VHT_CAP_IE *cap, VHT_OP_IE *op);\nINT SetCommonVHT(struct _RTMP_ADAPTER *pAd);\nVOID rtmp_set_vht(struct _RTMP_ADAPTER *pAd, struct _RT_PHY_INFO *phy_info);\n\nvoid assoc_vht_info_debugshow(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN VHT_CAP_IE *vht_cap,\n\tIN VHT_OP_IE *vht_op);\n\n"
  },
  {
    "path": "src/include/video.h",
    "content": "#ifdef VIDEO_TURBINE_SUPPORT\nextern AP_VIDEO_STRUCT GLOBAL_AP_VIDEO_CONFIG;\n\nVOID VideoModeUpdate(IN PRTMP_ADAPTER pAd);\nVOID VideoModeDynamicTune(IN PRTMP_ADAPTER pAd);\nUINT32 GetAsicDefaultRetry(IN PRTMP_ADAPTER pAd);\nUCHAR GetAsicDefaultTxBA(IN PRTMP_ADAPTER pAd);\nUINT32 GetAsicVideoRetry(IN PRTMP_ADAPTER pAd);\nUCHAR GetAsicVideoTxBA(IN PRTMP_ADAPTER pAd);\nVOID VideoConfigInit(IN PRTMP_ADAPTER pAd);\n#endif /* VIDEO_TURBINE_SUPPORT */\n\n"
  },
  {
    "path": "src/include/vr_ikans.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n \n    Module Name:\n    vr_ikans.h\n \n    Abstract:\n    Only for IKANOS Vx160 or Vx180 platform.\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Sample Lin\t01-28-2008    Created\n\n */\n\n#ifndef __VR_IKANS_H__\n#define __VR_IKANS_H__\n\n#ifndef MODULE_IKANOS\n#define IKANOS_EXTERN\textern\n#else\n#define IKANOS_EXTERN\n#endif /* MODULE_IKANOS */\n\n#ifdef IKANOS_VX_1X0\n\ttypedef void (*IkanosWlanTxCbFuncP)(void *, void *);\n\n\tstruct IKANOS_TX_INFO\n\t{\n\t\tstruct net_device *netdev;\n\t\tIkanosWlanTxCbFuncP *fp;\n\t};\n#endif /* IKANOS_VX_1X0 */\n\n\nIKANOS_EXTERN void VR_IKANOS_FP_Init(UINT8 BssNum, UINT8 *pApMac);\n\nIKANOS_EXTERN INT32 IKANOS_DataFramesTx(struct sk_buff *pSkb,\n\t\t\t\t\t\t\t\t\t\tstruct net_device *pNetDev);\n\nIKANOS_EXTERN void IKANOS_DataFrameRx(PRTMP_ADAPTER pAd,\n\t\t\t\t\t\t\t\t\t\tstruct sk_buff *pSkb);\n\n#endif /* __VR_IKANS_H__ */\n\n/* End of vr_ikans.h */\n"
  },
  {
    "path": "src/include/vrut_ubm.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll Related Structure & Definition for UBICOM platform.\n\n\tOnly used in UTIL module.\n\n***************************************************************************/\n\n#ifndef __VR_UBICOM_H__\n#define __VR_UBICOM_H__\n\n#ifdef PLATFORM_UBM_IPX8\n\n#include <asm/cachectl.h>\n\n#undef RTMP_UTIL_DCACHE_FLUSH\n#define RTMP_UTIL_DCACHE_FLUSH(__AddrStart, __Size)\t\t\t\t\t\t\\\n\tflush_dcache_range((ULONG)(__AddrStart),\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t(ULONG)(((UCHAR *)(__AddrStart)) + __Size - 1))\n\n#endif /* PLATFORM_UBM_IPX8 */\n\n#endif /* __VR_UBICOM_H__ */\n\n/* End of vrut_ubm.h */\n\n"
  },
  {
    "path": "src/include/wapi.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2005, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attempt\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twapi.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tAlbert\t\t2008-4-3      \tSupoort WAPI protocol\n*/\n\n#ifndef __WAPI_H__\n#define __WAPI_H__\n\n#include \"wpa_cmm.h\"\n\n/* Increase TxIV value for next transmission */\n/* Todo - When overflow occurred, do re-key mechanism */\n#define\tINC_TX_IV(_V, NUM)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\\\n\tUCHAR\tcnt = LEN_WAPI_TSC;\t\t\t\t\\\n\tdo\t\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\\\n\t\tcnt--;\t\t\t\t\t\t\t\t\\\n\t\t_V[cnt] = _V[cnt] + NUM;\t\t\t\\\n\t\tif (cnt == 0)\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\\\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PN overflow!!!!\\n\"));\t\\\n\t\t\tbreak;\t\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\\\n\t}while (_V[cnt] == 0);\t\t\t\t\t\\\n}\n\n#define IS_WAPI_CAPABILITY(a)       (((a) >= Ndis802_11AuthModeWAICERT) && ((a) <= Ndis802_11AuthModeWAIPSK))\n\n/* The underlying chip supports hardware-based WPI-SMS4 encryption and de-encryption. */\n#define IS_HW_WAPI_SUPPORT(__pAd)\t\t(__pAd->chipCap.FlgIsHwWapiSup)\n/* \n =====================================\t\n \tfunction prototype in wapi_crypt.c\n =====================================\t\n*/\nint wpi_cbc_mac_engine(\n\t\tunsigned char * maciv_in,\n\t\tunsigned char * in_data1,\n\t\tunsigned int \tin_data1_len,\n\t\tunsigned char * in_data2,\n\t\tunsigned int \tin_data2_len,\n\t\tunsigned char * pkey,\n\t\tunsigned char * mac_out);\n\nint wpi_sms4_ofb_engine(\n\tunsigned char * pofbiv_in,\n\tunsigned char * pbw_in,\n\tunsigned int \tplbw_in,\n\tunsigned char * pkey,\n\tunsigned char * pcw_out);\n\nVOID RTMPInsertWapiIe(\n\tIN\tUINT\t\t\tAuthMode,\n\tIN\tUINT\t\t\tWepStatus,\n\tOUT\tPUCHAR\t\t\tpWIe,\n\tOUT\tUCHAR\t\t\t*w_len);\n\nBOOLEAN RTMPCheckWAIframe(\n    IN PUCHAR           pData,\n    IN ULONG            DataByteCount);\n\nVOID RTMPConstructWPIIVHdr(\n\tIN\tUCHAR\t\t\tkey_id,\n\tIN\tUCHAR\t\t\t*tx_iv, \n\tOUT UCHAR \t\t\t*iv_hdr);\n\nextern INT\tRTMPSoftEncryptSMS4(\n\t\tIN\tPUCHAR\t\t\tpHeader,\n\t\tIN  PUCHAR\t\t\tpData,\n\t\tIN\tUINT32\t\t\tdata_len,\t\t\t\t\n\t\tIN\tUCHAR\t\t\tkey_id,\n\t\tIN\tPUCHAR \t\t\tpKey,\n\t\tIN\tPUCHAR\t\t\tpIv);\nextern INT\tRTMPSoftDecryptSMS4(\n\t\tIN\t\tPUCHAR\t\t\tpHdr,\n\t\tIN\t\tBOOLEAN\t\t\tbSanityIV,\n\t\tIN \t\tPCIPHER_KEY\t\tpKey,\n\t\tINOUT \tPUCHAR\t\t\tpData,\n\t\tINOUT \tUINT16\t\t\t*DataByteCnt);\n\nVOID RTMPDeriveWapiGTK(\n\tIN\tPUCHAR\t\t\tnmk,\n\tOUT\tPUCHAR\t\t\tgtk_ptr);\n\nVOID RT_SMS4_TEST(\n\tIN UINT8\t\t\ttest);\n\nINT SMS4_TEST(void);\n\n/* \n =====================================\t\n \tfunction prototype in wapi.c\n =====================================\t\n*/\n\nBOOLEAN RTMPIsWapiCipher(\n    IN PRTMP_ADAPTER    pAd,\n    IN UCHAR           \tapidx);\n\nVOID RTMPIoctlQueryWapiConf(\n\tIN PRTMP_ADAPTER pAd, \n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq);\n\nvoid rtmp_read_wapi_parms_from_file(\n\t\tIN  PRTMP_ADAPTER pAd, \n\t\tchar *tmpbuf, \n\t\tchar *buffer);\n\nVOID RTMPWapiUskRekeyPeriodicExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\nVOID RTMPWapiMskRekeyPeriodicExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3);\n\nVOID RTMPInitWapiRekeyTimerAction(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry);\n\nVOID RTMPStartWapiRekeyTimerAction(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY pEntry);\n\nVOID RTMPCancelWapiRekeyTimerAction(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY pEntry);\n\nVOID RTMPGetWapiTxTscFromAsic(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tUINT\t\t\tWcid,\n\tOUT\tUCHAR\t\t\t*tx_tsc);\n\nVOID WAPIInstallPairwiseKey(\n\tPRTMP_ADAPTER\t\tpAd,\n\tPMAC_TABLE_ENTRY\tpEntry,\n\tBOOLEAN\t\t\t\tbAE);\n\nVOID WAPIInstallSharedKey(\n\tPRTMP_ADAPTER\t\tpAd,\n\tUINT8\t\t\t\tGroupCipher,\n\tUINT8\t\t\t\tBssIdx,\n\tUINT8\t\t\t\tKeyIdx,\n\tUINT8\t\t\t\tWcid,\n\tPUINT8\t\t\t\tpGtk);\n\nBOOLEAN WAPI_InternalCmdAction(\n\t\tIN  PRTMP_ADAPTER\t\tpAd,\n\t\tIN\tUCHAR\t\t\t\tAuthMode,\n\t\tIN\tUCHAR\t\t\t\tapidx,\n\t\tIN\tPUCHAR\t\t\t\tpAddr,\n\t\tIN\tUCHAR\t\t\t\tflag);\n\n#endif /* __WAPI_H__ */\n\n"
  },
  {
    "path": "src/include/wapi_def.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2005, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attempt\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twapi_def.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\t\n*/\n\n#ifndef __WAPI_DEF_H__\n#define __WAPI_DEF_H__\n\n#ifndef IN\n#define IN\n#endif\n#ifndef OUT\n#define OUT\n#endif\n#ifndef INOUT\n#define INOUT\n#endif\n#ifndef MAC_ADDR_LEN\n#define MAC_ADDR_LEN   6\n#endif \n#ifndef TRUE\n#define TRUE\t1\n#endif\n#ifndef FALSE\n#define FALSE\t0\n#endif\n\n#define WAPI_IFNAMSIZ\t\t16\n#define MAX_WAPI_MBSSID_NUM 8\n#define MAX_ID_NO 10\n\n#define LENGTH_WAI_H\t12\n#define LEN_WAPI_TSC\t16\n#define LEN_WPI_MIC\t\t16\n#define LEN_WPI_IV_HDR\t18\n#define LEN_WAPI_NMK\t16\n#define LEN_WAPI_GTK\t32\n\n/* trigger message from driver */\n#define WAI_MLME_CERT_AUTH_START\t1\n#define WAI_MLME_KEY_HS_START\t\t2\n#define WAI_MLME_UPDATE_BK\t\t\t3\n#define WAI_MLME_UPDATE_USK\t\t\t4\n#define WAI_MLME_UPDATE_MSK\t\t\t5\n#define WAI_MLME_DISCONNECT\t\t\t0xff\n\n#define WAPI_KEY_UPDATE_EXEC_INTV   1000\t\t\t\t/* 1 sec */\n\n/* WAPI rekey method */\n#define REKEY_METHOD_DISABLE        0\n#define REKEY_METHOD_TIME           1\n#define REKEY_METHOD_PKT            2\n/*#define REKEY_METHOD_TIME_PKT     3 */\n\n#define STATUS_WAPI_KEY_INVALID\t\t1\n#define STATUS_WAPI_IV_MISMATCH\t\t2\n#define STATUS_WAPI_MIC_DIFF\t\t3\n\nextern UCHAR AE_BCAST_PN[LEN_WAPI_TSC];\nextern UCHAR ASUE_UCAST_PN[LEN_WAPI_TSC];\nextern UCHAR AE_UCAST_PN[LEN_WAPI_TSC];\n\n/* WAPI authentication mode */\ntypedef enum _WAPI_AUTH_MODE\n{\n   WAPI_AUTH_DISABLE,\n   WAPI_AUTH_PSK,\n   WAPI_AUTH_CERT,\n} WAPI_AUTH_MODE, *PWAPI_AUTH_MODE;\n\n/* WAPI authentication mode */\ntypedef enum _KEY_TYPE_MODE\n{\n   HEX_MODE,\n   ASCII_MODE\n} KEY_TYPE_MODE, *PKEY_TYPE_MODE;\n\n/* the defintion of WAI header */\ntypedef\tstruct GNU_PACKED _HEADER_WAI\t{    \n    USHORT          version;\n\tUCHAR\t\t\ttype;\n\tUCHAR\t\t\tsub_type;\n\tUSHORT\t\t\treserved;\n\tUSHORT\t\t\tlength;\n\tUSHORT\t\t\tpkt_seq;\n\tUCHAR\t\t\tfrag_seq;\n\tUCHAR\t\t\tflag;\n}\tHEADER_WAI, *PHEADER_WAI;\n\n/* For WAPI */\ntypedef struct GNU_PACKED _WAPIIE {\n    USHORT  version;    \n    USHORT  acount;\n    struct GNU_PACKED {\n        UCHAR oui[4];\n    }auth[1];\n} WAPIIE, *PWAPIIE;\n\n/* unicast key suite */\ntypedef struct GNU_PACKED _WAPIIE_UCAST {\n    USHORT ucount;\n    struct GNU_PACKED {\n        UCHAR oui[4];\n    }ucast[1];\n} WAPIIE_UCAST,*PWAPIIE_UCAST;\n\n/* multi-cast key suite and capability */\ntypedef struct GNU_PACKED _WAPIIE_MCAST {\n    UCHAR   mcast[4];\n    USHORT  capability;\n} WAPIIE_MCAST,*PWAPIIE_MCAST;\n\n/* the relative to wapi daemon */\ntypedef struct GNU_PACKED _COMMON_WAPI_INFO\n{\t\n\tUINT8\t\t\twapi_ifname[WAPI_IFNAMSIZ];\t\t/* wai negotiation */\n\tUINT8\t\t\twapi_ifname_len;\t\t\t\n\tUINT8 \t\t\tpreauth_ifname[WAPI_IFNAMSIZ];\t/* pre-authentication */\n\tUINT8\t\t\tpreauth_ifname_len;\n\tUINT8\t\t\tas_cert_no;\n\tUINT8\t\t\tas_cert_path[MAX_ID_NO][128];\t\t\t/* the path of as certification */\n\tUINT8\t\t\tas_cert_path_len[MAX_ID_NO];\n\tUINT8\t\t\tca_cert_path[128];\t\t\t/* the path of ca certification */\n\tUINT8\t\t\tca_cert_path_len;\n\tUINT8\t\t\tuser_cert_path[128];\t\t/* the path of local user certification */\n\tUINT8\t\t\tuser_cert_path_len;\t\t\n\tUINT32\t\t\twapi_as_ip;\t\t\t\t\t/* the ip address of authentication server */\n\tUINT32\t\t\twapi_as_port;\t\t\t\t/* the port of authentication server */\n} COMMON_WAPI_INFO, *PCOMMON_WAPI_INFO;\n\ntypedef struct GNU_PACKED _MBSS_WAPI_INFO\n{\t\n\tUINT8\t\t\tifname[WAPI_IFNAMSIZ];\n\tUINT8\t\t\tifname_len;\n\tUINT8\t\t\tauth_mode;\t\n    UINT8       \tpsk[64];\n\tUINT8\t\t\tpsk_len;\t\n\tUINT8\t\t\twie[128];\n\tUINT8\t\t\twie_len;\n} MBSS_WAPI_INFO, *PMBSS_WAPI_INFO;\n\n/* It's used by wapi daemon to require relative configuration */\ntypedef struct GNU_PACKED _WAPI_CONF\n{\n    UINT8\t\t\t\tmbss_num;\t\t\t\t\t/* indicate multiple BSS number */\n\tCOMMON_WAPI_INFO\tcomm_wapi_info;\t\t\n\tMBSS_WAPI_INFO\t\tmbss_wapi_info[MAX_WAPI_MBSSID_NUM];\n} WAPI_CONF, *PWAPI_CONF;\n\n#ifdef LINUX\n#define WapiMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length)\n#define WapiZeroMemory(Destination, Length)         memset(Destination, 0, Length)\n#define WapiEqualMemory(Source1, Source2, Length)   (!memcmp(Source1, Source2, Length))\n#endif /* LINUX */\n\n#endif /* __WAPI_DEF_H__ */\n\n"
  },
  {
    "path": "src/include/wapi_sms4.h",
    "content": "\n\n/* SMS4 encryption/decryption definition */\n/* Parameter : */\n/*\t\tInput \t- the incoming message packet */\n/*\t\tOuput \t- the result ouput */\n/*\t\trk\t\t- key */\nvoid SMS4Crypt(unsigned char *Input, unsigned char *Output, unsigned int *rk);\n\n/* SMS4 key extend algorithm */\nvoid SMS4KeyExt(unsigned char *Key, unsigned int *rk, unsigned int CryptFlag);\n\n"
  },
  {
    "path": "src/include/wfa_p2p.h",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    wfa_p2p.h\n \n    Abstract:\n\tDefined status code, IE and frame structures that WiFi Direct needed.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    \n */\n\n\n#ifndef __WFA_P2P_H\n#define __WFA_P2P_H\n\n#include \"rtmp_type.h\"\n\n\n#ifdef P2P_SUPPORT\n\ntypedef\tstruct\t_P2P_PUBLIC_FRAME\t{\n\tHEADER_802_11   p80211Header;\n\tUCHAR          Category;\n\tUCHAR           Action;\n\tUCHAR           OUI[3];\n\tUCHAR\t\tOUIType;\n\tUCHAR\t\tSubtype;\n\tUCHAR\t\tToken;\n\tUCHAR            ElementID;\n\tUCHAR            Length;\n\tUCHAR            OUI2[3];\n\tUCHAR            OUIType2;\n\tUCHAR            Octet[1];\n}\n\tP2P_PUBLIC_FRAME, *PP2P_PUBLIC_FRAME;\n\ntypedef\tstruct\t_P2P_ACTION_FRAME\t{\n\tHEADER_802_11\t\t\tp80211Header;\n\tUCHAR\t\t\t\t\tCategory;\n\tUCHAR\t\t\t\t\tOUI[3];\n\tUCHAR\t\t\t\t\tOUIType;\n\tUCHAR\t\t\t\t\tSubtype;\n\tUCHAR\t\t\t\t\tToken;\n\tUCHAR\t\t\t\t\tOctet[1];\n}\tP2P_ACTION_FRAME, *PP2P_ACTION_FRAME;\n\ntypedef struct _FRAME_P2P_ACTION {\n\tHEADER_802_11\t\t\tHdr;\n\tUCHAR\t\t\t\t\tCategory;\n\tUCHAR\t\t\t\t\tOUI[3];\n\tUCHAR\t\t\t\t\tOUIType;\t/* 1 */\n\tUCHAR\t\t\t\t\tOUISubType;\t/* 1 */\n\tUCHAR\t\t\t\t\tToken;\t/* 1 */\n}   FRAME_P2P_ACTION, *PFRAME_P2P_ACTION;\n\ntypedef struct _MLME_P2P_ACTION_STRUCT {\n\tUCHAR\t\t\t\t\tTabIndex;\t/* sometimes it's Mactable index, sometime it's P2P table index. depend on the command. */\n\tUCHAR\t\t\t\t\tAddr[MAC_ADDR_LEN];\n} MLME_P2P_ACTION_STRUCT, *PMLME_P2P_ACTION_STRUCT;\n\ntypedef\tstruct\t_P2P_NOA_DESC\t{\n\tUCHAR\t\t\t\t\tCount;\n\tUCHAR\t\t\t\t\tDuration[4];\n\tUCHAR\t\t\t\t\tInterval[4];\n\tUCHAR\t\t\t\t\tStartTime[4];\n}\tP2P_NOA_DESC, *PP2P_NOA_DESC;\n\n\n/* General format of P2P attribut(4.1.1) */\n#define SUBID_P2P_STATUS\t\t\t\t0\n#define SUBID_P2P_MINOR_REASON\t\t\t1\n#define SUBID_P2P_CAP\t\t\t\t\t2\n#define SUBID_P2P_DEVICE_ID\t\t\t\t3\n#define SUBID_P2P_OWNER_INTENT\t\t\t4\n#define SUBID_P2P_CONFIG_TIMEOUT\t\t5\n#define SUBID_P2P_LISTEN_CHANNEL\t\t6\n#define SUBID_P2P_GROUP_BSSID\t\t\t7\n#define SUBID_P2P_EXT_LISTEN_TIMING\t\t8\n#define SUBID_P2P_INTERFACE_ADDR\t\t9\n#define SUBID_P2P_MANAGEABILITY\t\t\t10\n#define SUBID_P2P_CHANNEL_LIST\t\t\t11\n#define SUBID_P2P_NOA\t\t\t\t\t12\n#define SUBID_P2P_DEVICE_INFO\t\t\t13\n#define SUBID_P2P_GROUP_INFO\t\t\t14\n#define SUBID_P2P_GROUP_ID\t\t\t\t15\n#define SUBID_P2P_INTERFACE\t\t\t\t16\n#define SUBID_P2P_OP_CHANNEL\t\t\t17\n#define SUBID_P2P_INVITE_FLAG\t\t\t18\n#define SUBID_P2P_VENDOR\t\t\t\t221\n\n/* Status Code definitions(4.1.2) */\n#define P2PSTATUS_SUCCESS\t\t\t\t\t0\n#define P2PSTATUS_PASSED\t\t\t\t\t1\n#define P2PSTATUS_IMCOMPA_PARM\t\t\t\t2\n#define P2PSTATUS_LIMIT\t\t\t\t\t\t3\n#define P2PSTATUS_INVALID_PARM\t\t\t\t4\n#define P2PSTATUS_UNABLE\t\t\t\t\t5\n#define P2PSTATUS_NO_CHANNEL\t\t\t\t7\n#define P2PSTATUS_UNKNOWN_GROUP\t\t\t\t8\n#define P2PSTATUS_BOTH_INTENT15\t\t\t\t9\n#define P2PSTATUS_INCOMPATIBLE_PROVISION\t10\n#define P2PSTATUS_REJECT_BY_USER\t\t\t11\n\n//bitmap of P2P Capability/ 1st byte is DEVCAP, 2nd byte is GRPCAP\n/* Device Capability Bitmap definitio(4.1.4) */\n#define DEVCAP_SD\t\t\t\t\t0x1\t//Service discovery\n#define DEVCAP_CLIENT_DISCOVER\t\t0x2\n#define DEVCAP_CLIENT_CONCURRENT\t0x4\n#define DEVCAP_INFRA_MANAGED\t\t0x8\n#define DEVCAP_DEVICE_LIMIT\t\t\t0x10\n#define DEVCAP_INVITE\t\t\t\t0x20\n\n/*Group Capability Bitmap definition(4.1.4) */\n#define GRPCAP_OWNER\t\t\t\t0x1\n#define GRPCAP_PERSISTENT\t\t\t0x2\n#define GRPCAP_LIMIT\t\t\t\t0x4\n#define GRPCAP_INTRA_BSS\t\t\t0x8\n#define GRPCAP_CROSS_CONNECT\t\t0x10\n#define GRPCAP_PERSISTENT_RECONNECT\t0x20\n#define GRPCAP_GROUP_FORMING\t\t0x40\n\n\n/* P2P public action frame typ(4.2.8) */\n#define GO_NEGOCIATION_REQ\t\t\t0\n#define GO_NEGOCIATION_RSP\t\t\t1\n#define GO_NEGOCIATION_CONFIRM\t\t2\n#define P2P_INVITE_REQ\t\t\t\t3\n#define P2P_INVITE_RSP\t\t\t\t4\n#define P2P_DEV_DIS_REQ\t\t\t\t5\n#define P2P_DEV_DIS_RSP\t\t\t\t6\n#define P2P_PROVISION_REQ\t\t\t7\n#define P2P_PROVISION_RSP\t\t\t8\n\n/* P2P action frame typ(4.2.9) */\n#define P2PACT_NOA\t\t\t\t\t0\n#define P2PACT_PERSENCE_REQ\t\t\t1\n#define P2PACT_PERSENCE_RSP\t\t\t2\n#define P2PACT_GO_DISCOVER_REQ\t\t3\n\n/* Service Protocol Type */\n#define SERVICE_PROTOCOL_TYPE_ALL\t\t\t\t0\n#define SERVICE_PROTOCOL_TYPE_BONJOUR\t\t\t1\n#define SERVICE_PROTOCOL_TYPE_UPNP\t\t\t\t2\n#define SERVICE_PROTOCOL_TYPE_WS_DISCOVERY\t\t3\n#define SERVICE_PROTOCOL_TYPE_WFD\t\t\t\t4\n#define SERVICE_PROTOCOL_TYPE_VENDOR_SPECIFIC\t255\n\n#endif /* P2P_SUPPORT */\n\n#endif /* __WFA_P2P_H */\n\n"
  },
  {
    "path": "src/include/wfd.h",
    "content": "/* \n\n  This file is provided under a dual BSD/GPLv2 license.  When using or \n  redistributing this file, you may do so under either license.\n\n  GPL LICENSE SUMMARY\n\n  Copyright(c) 2005-2011 Ralink Technology Corporation.\n\n  This program is free software; you can redistribute it and/or modify \n  it under the terms of version 2 of the GNU General Public License as\n  published by the Free Software Foundation.\n\n  This program is distributed in the hope that it will be useful, but \n  WITHOUT ANY WARRANTY; without even the implied warranty of \n  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU \n  General Public License for more details.\n\n  You should have received a copy of the GNU General Public License \n  along with this program; if not, write to the Free Software \n  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.\n  The full GNU General Public License is included in this distribution \n  in the file called LICENSE.GPL.\n\n  Contact Information:\n    Ralink Technology Corporation\n    5F, No.5, Tai-Yuen 1st St., Jhubei City,\n    HsinChu Hsien 30265, Taiwan, R.O.C.\n\n\n  BSD LICENSE \n\n  Copyright(c) 2005-2011 Ralink Technology Corporation. All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without \n  modification, are permitted provided that the following conditions \n  are met:\n\n    * Redistributions of source code must retain the above copyright \n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright \n      notice, this list of conditions and the following disclaimer in \n      the documentation and/or other materials provided with the \n      distribution.\n    * Neither the name of Intel Corporation nor the names of its \n      contributors may be used to endorse or promote products derived \n      from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \n  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \n  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \n  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \n  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \n  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \n  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \n  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \n  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n*/\n\n\n/*\n\tModule Name:\n\twfd.h\n\t\n\tRevision History:\n\tWho \t\t\tWhen\t\t\tWhat\n\t--------\t\t----------\t\t----------------------------------------------\n\t\n*/\n\n\n#ifndef\t__WFD_H__\n#define\t__WFD_H__\n\n#ifdef WFD_SUPPORT\n\n#include \"rtmp_type.h\"\n\nINT Set_WfdEnable_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\n#ifdef RT_CFG80211_SUPPORT\nINT Set_WfdInsertIe_Proc\n(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPSTRING \t\targ);\n#endif /* RT_CFG80211_SUPPORT */\n\nINT Set_WfdDeviceType_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT Set_WfdCouple_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT Set_WfdSessionAvailable_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT Set_WfdCP_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT\tSet_WfdRtspPort_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT\tSet_WfdMaxThroughput_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT Set_WfdLocalIp_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT Set_PeerRtspPort_Proc(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PSTRING\t\t\targ);\n\nVOID WfdMakeWfdIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN \tULONG\t\t\tWfdIeBitmap,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPULONG\t\t\tpIeLen);\n\nULONG InsertWfdSubelmtTlv(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN UCHAR\t\t\tSubId,\n\tIN PUCHAR\t\t\tpInBuffer,\n\tIN PUCHAR\t\t\tpOutBuffer,\n\tIN UINT\t\t\t\tAction);\n\nVOID WfdParseSubElmt(\n\tIN PRTMP_ADAPTER \tpAd, \n\tIN PWFD_ENTRY_INFO\tpWfdEntryInfo,\n\tIN VOID \t\t\t\t*Msg, \n\tIN ULONG \t\t\tMsgLen);\n\nVOID WfdCfgInit(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /* WFD_SUPPORT */\n#endif /* __WFD_H__ */\n\n"
  },
  {
    "path": "src/include/wfd_cmm.h",
    "content": "/* \n\n  This file is provided under a dual BSD/GPLv2 license.  When using or \n  redistributing this file, you may do so under either license.\n\n  GPL LICENSE SUMMARY\n\n  Copyright(c) 2005-2011 Ralink Technology Corporation.\n\n  This program is free software; you can redistribute it and/or modify \n  it under the terms of version 2 of the GNU General Public License as\n  published by the Free Software Foundation.\n\n  This program is distributed in the hope that it will be useful, but \n  WITHOUT ANY WARRANTY; without even the implied warranty of \n  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU \n  General Public License for more details.\n\n  You should have received a copy of the GNU General Public License \n  along with this program; if not, write to the Free Software \n  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.\n  The full GNU General Public License is included in this distribution \n  in the file called LICENSE.GPL.\n\n  Contact Information:\n    Ralink Technology Corporation\n    5F, No.5, Tai-Yuen 1st St., Jhubei City,\n    HsinChu Hsien 30265, Taiwan, R.O.C.\n\n\n  BSD LICENSE \n\n  Copyright(c) 2005-2011 Ralink Technology Corporation. All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without \n  modification, are permitted provided that the following conditions \n  are met:\n\n    * Redistributions of source code must retain the above copyright \n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright \n      notice, this list of conditions and the following disclaimer in \n      the documentation and/or other materials provided with the \n      distribution.\n    * Neither the name of Intel Corporation nor the names of its \n      contributors may be used to endorse or promote products derived \n      from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \n  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \n  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \n  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \n  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \n  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \n  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \n  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \n  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n*/\n\n\n/*\n\tModule Name:\n\twfd.h\n\t\n\tRevision History:\n\tWho \t\t\tWhen\t\t\tWhat\n\t--------\t\t----------\t\t----------------------------------------------\n\t\n*/\n\n\n#ifndef\t__WFD_CMM_H__\n#define\t__WFD_CMM_H__\n\n#ifdef WFD_SUPPORT\n\n#include \"rtmp_type.h\"\n\n#define WFD_OUI\t\t\t\t\t\t\t\t\t0x506F9A\n\n/* Subelement ID Definitions */\n#define SUBID_WFD_DEVICE_INFO\t\t\t\t\t0\n#define SUBID_WFD_ASSOCIATED_BSSID\t\t\t1\n#define SUBID_WFD_AUDIO_FORMATS\t\t\t\t2\n#define SUBID_WFD_VIDEO_FORMATS\t\t\t\t3\n#define SUBID_WFD_3D_VIDEO_FORMATS\t\t\t4\n#define SUBID_WFD_CONTENT_PROTECTION\t\t5\n#define SUBID_WFD_COUPLED_SINK_INFO\t\t\t6\n#define SUBID_WFD_EXTENDED_CAP\t\t\t\t7\n#define SUBID_WFD_LOCAL_IP_ADDR\t\t\t\t8\n#define SUBID_WFD_SESSION_INFO\t\t\t\t9\n#define SUBID_WFD_ALTERNATE_MAC_ADDR\t\t10\n#define SUBID_WFD_END\t\t11\n\n/* Subelement ID Definitions */\n#define SUBID_WFD_DEVICE_INFO_LEN\t\t\t\t6\n#define SUBID_WFD_ASSOCIATED_BSSID_LEN\t\t\t6\n#define SUBID_WFD_AUDIO_FORMATS_LEN\t\t\t\t15\n#define SUBID_WFD_VIDEO_FORMATS_LEN\t\t\t\t21\n#define SUBID_WFD_3D_VIDEO_FORMATS_LEN\t\t\t13\n#define SUBID_WFD_CONTENT_PROTECTION_LEN\t\t1\n#define SUBID_WFD_COUPLED_SINK_INFO_LEN\t\t\t1\n#define SUBID_WFD_EXTENDED_CAP_LEN\t\t\t\t2\n#define SUBID_WFD_LOCAL_IP_ADDR_LEN\t\t\t\t5\n#define SUBID_WFD_ALTERNATE_MAC_ADDR_LEN\t\t6\n#define WFD_SOURCE\t\t\t\t\t\t\t\t0x0\n#define WFD_PRIMARY_SINK\t\t\t\t\t\t0x1\n#define WFD_SECONDARY_SINK\t\t\t\t\t0x2\n#define WFD_SOURCE_PRIMARY_SINK\t\t\t\t0x3\n#define WFD_DEVICE_TYPE_END\t\t\t\t\t0x4\n\n#define WFD_COUPLED_NOT_SUPPORT\t\t\t\t0x0\n#define WFD_COUPLED_SUPPORT\t\t\t\t\t0x1\n\n#define WFD_SESSION_NOT_AVAILABLE\t\t\t0x0\n#define WFD_SESSION_AVAILABLE\t\t\t\t\t0x1\n\n#define WFD_WSD_NOT_SUPPORT\t\t\t\t\t0x0\n#define WFD_WSD_SUPPORT\t\t\t\t\t\t0x1\n\n#define WFD_PC_P2P\t\t\t\t\t\t\t\t0x0\n#define WFD_PC_TDLS\t\t\t\t\t\t\t0x1\n\n#define WFD_CP_NOT_SUPPORT\t\t\t\t\t0x0\n#define WFD_CP_HDCP20\t\t\t\t\t\t\t0x1\n\n#define WFD_TIME_SYNC_NOT_SUPPORT\t\t\t0x0\n#define WFD_TIME_SYNC_SUPPORT\t\t\t\t0x1\t\t/* Time Synchronization using 802.1AS */\n\n#define WFD_TDLS_WEAK_SECURITY\t\t\t\t0x0\n#define WFD_TDLS_STRONG_SECURITY\t\t\t0x1\n\n/* Coupled Sink Status Bitmap */\n#define WFD_AVAILABLE_FOR_COUPLING\t\t\t0x0\n#define WFD_COUPLED_SUCCESS\t\t\t\t\t0x1\n#define WFD_TEARDOWN_COUPLING\t\t\t\t0x2\n\n/* WFD RTSP Default Port */\n#define WFD_RTSP_DEFAULT_PORT\t\t\t\t7236\n\n/* Version of Local IP Address Subelement */\n#define WFD_LOCAL_IP_ADDR_VERSION_IPV4\t\t1\n\n/* Default max throughput */\n#define WFD_MAX_THROUGHPUT_DEFAULT\t\t\t150\n\n/* Default content protection bit */\n#define WFD_CONTENT_PROTECT_DEFAULT\t\t\tWFD_CP_NOT_SUPPORT\n\ntypedef\tstruct GNU_PACKED _WFD_DEVICE_INFO \n{\n#ifndef RT_BIG_ENDIAN\n\tUSHORT DeviceType:2;\n\tUSHORT SourceCoupled:1;\n\tUSHORT SinkCoupled:1;\n\tUSHORT SessionAvail:2;\n\tUSHORT WSD:1;\n\tUSHORT PC:1;\t\t\t\t\t\t\t\t/* Preferred Connectivity */\n\tUSHORT CP:1;\n\tUSHORT TimeSync:1;\n\tUSHORT Rsvd:6;\n#else\n\tUSHORT Rsvd:6;\n\tUSHORT TimeSync:1;\t\t\t\t\t\t\t/* 802.1AS Support */\n\tUSHORT CP:1;\t\t\t\t\t\t\t\t/* Content Protection */\n\tUSHORT PC:1;\t\t\t\t\t\t\t\t/* Preferred Connectivity */\n\tUSHORT WSD:1;\t\t\t\t\t\t\t\t/* WFD Service Discovery */\n\tUSHORT SessionAvail:2;\n\tUSHORT SinkCoupled:1;\n\tUSHORT SourceCoupled:1;\n\tUSHORT DeviceType:2;\n#endif\n}\tWFD_DEVICE_INFO, *PWFD_DEVICE_INFO;\n\n\ntypedef\tstruct GNU_PACKED _WFD_COUPLED_SINK_INFO\n{\n#ifndef RT_BIG_ENDIAN\n\tUCHAR CoupledStat:2;\t\t\t\t\t\n\tUCHAR Rsvd:6;\n#else\n\tUCHAR Rsvd:6;\n\tUCHAR CoupledStat:2;\t\t\t\t\t\n#endif\n}\tWFD_COUPLED_SINK_INFO, *PWFD_COUPLED_SINK_INFO;\n\n\ntypedef\tstruct GNU_PACKED _WFD_SESSION_INFO \n{\n#ifndef RT_BIG_ENDIAN\n\tUCHAR \t\t\t\t\tLength;\n\tUCHAR \t\t\t\t\tDeviceAddr[MAC_ADDR_LEN];\n\tUCHAR \t\t\t\t\tBssid[MAC_ADDR_LEN];\n\tWFD_DEVICE_INFO \t\tWfdDevInfo;\n\tUSHORT\t\t\t\t\tMaxThroughput;\n\tWFD_COUPLED_SINK_INFO \tCoupledSinkInfo;\t\t\t\t\t\t\t\t\t\n\tUCHAR \t\t\t\t\tCoupledPeerAddr[MAC_ADDR_LEN];\n#else\n\tUCHAR \t\t\t\t\tCoupledPeerAddr[MAC_ADDR_LEN];\n\tWFD_COUPLED_SINK_INFO \tCoupledSinkInfo;\n\tUSHORT\t\t\t\t\tMaxThroughput;\n\tWFD_DEVICE_INFO \t\tWfdDevInfo;\n\tUCHAR \t\t\t\t\tBssid[MAC_ADDR_LEN];\n\tUCHAR \t\t\t\t\tDeviceAddr[MAC_ADDR_LEN];\n\tUCHAR \t\t\t\t\tLength;\n#endif\n}\tWFD_SESSION_INFO, *PWFD_SESSION_INFO;\n\ntypedef struct _WFD_SERV_DISC_QUERY_INFO\n{\n\tBOOLEAN\tbWfd_device_info_ie;\n\tUCHAR\twfd_device_info_ie[SUBID_WFD_DEVICE_INFO_LEN];\n\tBOOLEAN bWfd_associate_bssid_ie;\n\tUCHAR\twfd_associate_bssid_ie[SUBID_WFD_ASSOCIATED_BSSID_LEN];\n\tBOOLEAN bWfd_audio_format_ie;\n\tUCHAR\twfd_audio_format_ie[SUBID_WFD_AUDIO_FORMATS_LEN];\n\tBOOLEAN bWfd_video_format_ie;\n\tUCHAR\twfd_video_format_ie[SUBID_WFD_VIDEO_FORMATS_LEN];\n\tBOOLEAN bWfd_3d_video_format_ie;\n\tUCHAR\twfd_3d_video_format_ie[SUBID_WFD_3D_VIDEO_FORMATS_LEN];\n\tBOOLEAN bWfd_content_proctection;\n\tUCHAR\twfd_content_proctection[SUBID_WFD_CONTENT_PROTECTION_LEN];\n\tBOOLEAN bWfd_couple_sink_info_ie;\n\tUCHAR\twfd_couple_sink_info_ie[SUBID_WFD_COUPLED_SINK_INFO_LEN];\n\tBOOLEAN bWfd_extent_capability_ie;\n\tUCHAR\twfd_extent_capability_ie[SUBID_WFD_EXTENDED_CAP_LEN];\n\tBOOLEAN bWfd_local_ip_ie;\n\tUCHAR\twfd_local_ip_ie[SUBID_WFD_LOCAL_IP_ADDR_LEN];\n\tBOOLEAN bWfd_session_info_ie;\n\tUCHAR\twfd_session_info_ie[120];\n\tBOOLEAN bWfd_alternate_mac_addr_ie;\n\tUCHAR\twfd_alternate_mac_addr_ie[SUBID_WFD_ALTERNATE_MAC_ADDR_LEN];\n} WFD_SERV_DISC_QUERY_INFO, *PWFD_SERV_DISC_QUERY_INFO;\n\n/* Store for WFD Entry Configuration */\ntypedef struct _WFD_ENTRY_INFO \n{\n\tUCHAR \tbWfdClient;\n\tUCHAR\twfd_devive_type;\n\tUCHAR\tsource_coupled;\n\tUCHAR\tsink_coupled;\n\tUCHAR\tsession_avail;\n\tUCHAR\twfd_service_discovery;\n\tUCHAR\twfd_PC;\n\tUCHAR\twfd_CP;\n\tUCHAR\twfd_time_sync;\n\tUCHAR\tsink_audio_unsupport;\n\tUCHAR\tsource_audio_only;\n\tUCHAR\ttdls_persistent_group;\n\tUSHORT\trtsp_port;\n\tUSHORT\tmax_throughput;\n\tUCHAR\tassoc_addr[MAC_ADDR_LEN];\n\tWFD_COUPLED_SINK_INFO\tcoupled_sink_status;\n\tUCHAR   \tcoupled_peer_addr[MAC_ADDR_LEN];\n\t/* Service Discovery */\n\tWFD_SERV_DISC_QUERY_INFO\twfd_serv_disc_query_info;\n} WFD_ENTRY_INFO, *PWFD_ENTRY_INFO;\n\n/* Store for WFD Configuration */\ntypedef struct _RT_WFD_CONFIG \n{\n\tBOOLEAN bWfdEnable;\n#ifdef RT_CFG80211_SUPPORT\n\tBOOLEAN bSuppInsertWfdIe;\t\t/* Insert WFD IE to management frames from wpa_supplicant */\n\tBOOLEAN bSuppGoOn;\t\t\t\t/* wpa_supplicant P2P GO is on */\n#endif /* RT_CFG80211_SUPPORT */\n\tUCHAR  \tDeviceType;\n\tUCHAR  \tSourceCoupled;\n\tUCHAR  \tSinkCoupled;\n\tUCHAR  \tSessionAvail;\n\tUCHAR  \tWSD;\n\tUCHAR  \tPC;\n\tUCHAR  \tCP;                     /* WFD Content Protection capability */\n\tUCHAR  \tTimeSync;\n\tUSHORT \tRtspPort;\t\t\t\t/* Deafult WFD_RTSP_DEFAULT_PORT */\n\tUSHORT\tMaxThroughput;\t\t\t/* Maximum average throughput capability */\n\tUCHAR\tBssid[MAC_ADDR_LEN];\n\tUCHAR\tIPv4Addr[4];\n\tUCHAR  \tTdlsSecurity;\n\tUCHAR  \tPeerSessionAvail;\n\tUCHAR  \tPeerPC;\n\tWFD_COUPLED_SINK_INFO\tCoupledSinkStatus;\n\t/* Service Discovery */\n\tUINT32\tWfdSerDiscCapable;\n\tWFD_SERV_DISC_QUERY_INFO\twfd_serv_disc_query_info;\n} RT_WFD_CONFIG, *PRT_WFD_CONFIG;\n\n#endif /* WFD_SUPPORT */\n#endif /* __WFD_H__ */\n\n"
  },
  {
    "path": "src/include/wpa.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twpa.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n*/\n\n#ifndef\t__WPA_H__\n#define\t__WPA_H__\n\n#ifndef ROUND_UP\n#define ROUND_UP(__x, __y) \\\n\t(((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1)))\n#endif\n\n#define\tSET_UINT16_TO_ARRARY(_V, _LEN)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\\\n\t_V[0] = ((UINT16)_LEN) >> 8;\t\t\t\\\n\t_V[1] = ((UINT16)_LEN & 0xFF);\t\t\t\t\t\\\n}\n\n#define\tINC_UINT16_TO_ARRARY(_V, _LEN)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tUINT16\tvar_len;\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tvar_len = (_V[0]<<8) | (_V[1]);\t\t\t\t\\\n\tvar_len += _LEN;\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_V[0] = (var_len & 0xFF00) >> 8;\t\t\t\\\n\t_V[1] = (var_len & 0xFF);\t\t\t\t\t\\\n}\n\n#define\tCONV_ARRARY_TO_UINT16(_V)\t((_V[0]<<8) | (_V[1]))\n\n#define\tADD_ONE_To_64BIT_VAR(_V)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tUCHAR\tcnt = LEN_KEY_DESC_REPLAY;\t\\\n\tdo\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\\\n\t\tcnt--;\t\t\t\t\t\t\t\\\n\t\t_V[cnt]++;\t\t\t\t\t\t\\\n\t\tif (cnt == 0)\t\t\t\t\t\\\n\t\t\tbreak;\t\t\t\t\t\t\\\n\t}while (_V[cnt] == 0);\t\t\t\t\\\n}\n\n#define INC_TX_TSC(_tsc, _cnt)                          \\\n{                                                       \\\n    INT i=0;                                            \\\n\twhile (++_tsc[i] == 0x0)                            \\\n    {                                                   \\\n        i++;                                            \\\n\t\tif (i == (_cnt))                                \\\n\t\t\tbreak;                                      \\\n\t}                                                   \\\n}\n\n#define IS_WPA_CAPABILITY(a)       (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))\n\n/* \t\n\tWFA recommend to restrict the encryption type in 11n-HT mode.\n \tSo, the WEP and TKIP shall not be allowed to use HT rate. \n */\n#define IS_INVALID_HT_SECURITY(_mode)\t\t\\\n\t(((_mode) == Ndis802_11Encryption1Enabled) || \\\n\t ((_mode) == Ndis802_11Encryption2Enabled))\n\n#define MIX_CIPHER_WPA_TKIP_ON(x)       (((x) & 0x08) != 0)\n#define MIX_CIPHER_WPA_AES_ON(x)        (((x) & 0x04) != 0)\n#define MIX_CIPHER_WPA2_TKIP_ON(x)      (((x) & 0x02) != 0)\n#define MIX_CIPHER_WPA2_AES_ON(x)       (((x) & 0x01) != 0)\n\n/* Some definition are different between Keneral mode and Daemon mode */\n#ifdef WPA_DAEMON_MODE\n/* The definition for Daemon mode */\n#define WPA_GET_BSS_NUM(_pAd)\t\t(_pAd)->mbss_num\n\n#define WPA_GET_PMK(_pAd, _pEntry, _pmk)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_pmk = _pAd->MBSS[_pEntry->apidx].PMK;\t\t\t\t\t\\\n}\n\n#define WPA_GET_GTK(_pAd, _pEntry, _gtk)\t\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_gtk = _pAd->MBSS[_pEntry->apidx].GTK;\t\t\t\t\t\\\n}\n\n#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_cipher = (_pAd)->MBSS[_pEntry->apidx].GroupEncrypType;\t\\\n}\n\n#define WPA_GET_DEFAULT_KEY_ID(_pAd, _pEntry, _idx)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_idx = (_pAd)->MBSS[_pEntry->apidx].DefaultKeyId;\t\t\\\n}\n\n#define WPA_GET_BMCST_TSC(_pAd, _pEntry, _tsc)\t\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_tsc = 1;\t\t\t\t\t\t\t\t\t\t\t\t\\\n}\n\n#define WPA_BSSID(_pAd, _apidx)\t\t(_pAd)->MBSS[_apidx].wlan_addr\n\n#define WPA_OS_MALLOC(_p, _s)\t\t\\\n{\t\t\t\t\t\t\t\t\t\\\n\t_p = os_malloc(_s);\t\t\t\\\n}\n\n#define WPA_OS_FREE(_p)\t\t\\\n{\t\t\t\t\t\t\t\t\\\n\tos_free(_p);\t\t\t\t\\\n}\n\n#define WPA_GET_CURRENT_TIME(_time)\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\\\n\tstruct timeval tv;\t\t\t\t\t\\\n\tgettimeofday(&tv, NULL);\t\t\t\\\n\t*(_time) = tv.tv_sec;\t\t\t\t\t\\\n}\n\n#else\n/* The definition for Driver mode */\n\n#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT)\n#define WPA_GET_BSS_NUM(_pAd)\t\t(((_pAd)->OpMode == OPMODE_AP) ? (_pAd)->ApCfg.BssidNum : 1)\n#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher)\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_cipher = Ndis802_11WEPDisabled;\t\t\t\t\t\t\t\t\\\n\t\tif ((_pAd)->OpMode == OPMODE_AP)\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (IS_ENTRY_APCLI(_pEntry) && \t\t\t\t\t\t\t\t\\\n\t\t\t((_pEntry)->MatchAPCLITabIdx < MAX_APCLI_NUM))\t\t\t\\\n\t\t\t_cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->MatchAPCLITabIdx].GroupCipher;\t\\\n\t\t\telse if ((_pEntry)->apidx < (_pAd)->ApCfg.BssidNum)\t\t\t\\\n\t\t\t\t_cipher = (_pAd)->ApCfg.MBSSID[_pEntry->apidx].GroupKeyWepStatus;\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_cipher = (_pAd)->StaCfg.GroupCipher;\t\t\t\t\t\t\\\n\t}\n\n#define WPA_BSSID(_pAd, _apidx) \t(((_pAd)->OpMode == OPMODE_AP) ?\\\n\t\t\t\t\t\t\t\t\t(_pAd)->ApCfg.MBSSID[_apidx].Bssid :\\\n\t\t\t\t\t\t\t\t\t(_pAd)->CommonCfg.Bssid)\n#elif defined(CONFIG_AP_SUPPORT)\n#define WPA_GET_BSS_NUM(_pAd)\t\t(_pAd)->ApCfg.BssidNum\n#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher)\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t_cipher = Ndis802_11WEPDisabled;\t\t\t\t\t\t\t\\\n\tif (IS_ENTRY_APCLI(_pEntry) && \t\t\t\t\t\t\t\t\\\n\t\t((_pEntry)->MatchAPCLITabIdx < MAX_APCLI_NUM))\t\t\t\\\n\t\t_cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->MatchAPCLITabIdx].GroupCipher;\t\\\n\t\telse if ((_pEntry)->apidx < (_pAd)->ApCfg.BssidNum)\t\t\t\\\n\t\t\t_cipher = (_pAd)->ApCfg.MBSSID[_pEntry->apidx].GroupKeyWepStatus;\\\n\t}\n\n#define WPA_BSSID(_pAd, _apidx) \t(_pAd)->ApCfg.MBSSID[_apidx].Bssid\n\n#elif defined(CONFIG_STA_SUPPORT)\n#define WPA_GET_BSS_NUM(_pAd)\t\t1\n#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher)\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_cipher = (_pAd)->StaCfg.GroupCipher;\t\t\t\t\t\t\\\n\t}\n#define WPA_BSSID(_pAd, _apidx) \t(_pAd)->CommonCfg.Bssid\n#endif /* defined(CONFIG_STA_SUPPORT) */\n\n#define WPA_OS_MALLOC(_p, _s)\t\t\\\n{\t\t\t\t\t\t\t\t\t\\\n\tos_alloc_mem(NULL, (PUCHAR *)&_p, _s);\t\t\\\n}\n\n#define WPA_OS_FREE(_p)\t\t\\\n{\t\t\t\t\t\t\t\\\n\tos_free_mem(NULL, _p);\t\\\n}\n\n#define WPA_GET_CURRENT_TIME(_time)\t\tNdisGetSystemUpTime(_time);\n\n#endif /* End of Driver Mode */\n\n#ifdef CONFIG_AP_SUPPORT\n/*========================================\n\tThe prototype is defined in ap_wpa.c\n  ========================================*/\nVOID WPA_APSetGroupRekeyAction(\n\tIN PRTMP_ADAPTER pAd);\n\n#endif /* CONFIG_AP_SUPPORT */\n\n/*========================================\n\tThe prototype is defined in cmm_wpa.c\n  ========================================*/\nvoid inc_iv_byte(\n\tUCHAR *iv,\n\tUINT len,\n\tUINT cnt);\n\nBOOLEAN WpaMsgTypeSubst(\n\tIN UCHAR EAPType,\n\tOUT INT *MsgType);\n\nVOID PRF(\n\tIN UCHAR *key,\n\tIN INT key_len,\n\tIN UCHAR *prefix,\n\tIN INT prefix_len,\n\tIN UCHAR *data,\n\tIN INT data_len,\n\tOUT UCHAR *output,\n\tIN INT len);\n\nint RtmpPasswordHash(\n\tchar *password,\n\tunsigned char *ssid,\n\tint ssidlength,\n\tunsigned char *output);\n\n\tVOID KDF(\n\tIN PUINT8 key,\n\tIN INT key_len,\n\tIN PUINT8 label,\n\tIN INT label_len,\n\tIN PUINT8 data,\n\tIN INT data_len,\n\tOUT PUINT8 output,\n\tIN USHORT len);\n\nPUINT8 WPA_ExtractSuiteFromRSNIE(\n\tIN PUINT8 rsnie,\n\tIN UINT rsnie_len,\n\tIN UINT8 type,\n\tOUT UINT8 *count);\n\nVOID WpaShowAllsuite(\n\tIN PUINT8 rsnie,\n\tIN UINT rsnie_len);\n\nVOID RTMPInsertRSNIE(\n\tIN PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN PUINT8 rsnie_ptr,\n\tIN UINT8 rsnie_len,\n\tIN PUINT8 pmkid_ptr,\n\tIN UINT8 pmkid_len);\n\n/* \n =====================================\t\n \tfunction prototype in cmm_wpa.c\n =====================================\t\n*/\nVOID RTMPToWirelessSta(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN PUCHAR pHeader802_3,\n\tIN UINT HdrLen,\n\tIN PUCHAR pData,\n\tIN UINT DataLen,\n\tIN BOOLEAN bClearFrame);\n\nVOID WpaDerivePTK(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR *PMK,\n\tIN UCHAR *ANonce,\n\tIN UCHAR *AA,\n\tIN UCHAR *SNonce,\n\tIN UCHAR *SA,\n\tOUT UCHAR *output,\n\tIN UINT len);\n\nVOID WpaDeriveGTK(\n\tIN UCHAR *PMK,\n\tIN UCHAR *GNonce,\n\tIN UCHAR *AA,\n\tOUT UCHAR *output,\n\tIN UINT len);\n\nVOID GenRandom(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR *macAddr,\n\tOUT UCHAR *random);\n\nBOOLEAN RTMPCheckWPAframe(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN PUCHAR pData,\n\tIN ULONG DataByteCount,\n\tIN UCHAR FromWhichBSSID);\n\n#ifdef HDR_TRANS_SUPPORT\nBOOLEAN RTMPCheckWPAframe_Hdr_Trns(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN PUCHAR pData,\n\tIN ULONG DataByteCount,\n\tIN UCHAR FromWhichBSSID);\n#endif /* HDR_TRANS_SUPPORT */\n\nBOOLEAN RTMPParseEapolKeyData(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pKeyData,\n\tIN UCHAR KeyDataLen,\n\tIN UCHAR GroupKeyIndex,\n\tIN UCHAR MsgType,\n\tIN BOOLEAN bWPA2,\n\tIN MAC_TABLE_ENTRY *pEntry);\n\nVOID WPA_ConstructKdeHdr(\n\tIN UINT8 data_type,\n\tIN UINT8 data_len,\n\tOUT PUCHAR pBuf);\n\nVOID ConstructEapolMsg(\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN UCHAR GroupKeyWepStatus,\n\tIN UCHAR MsgType,\n\tIN UCHAR DefaultKeyIdx,\n\tIN UCHAR *KeyNonce,\n\tIN UCHAR *TxRSC,\n\tIN UCHAR *GTK,\n\tIN UCHAR *RSNIE,\n\tIN UCHAR RSNIE_Len,\n\tOUT PEAPOL_PACKET pMsg);\n\nPCIPHER_KEY RTMPSwCipherKeySelection(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pIV,\n\tIN RX_BLK *pRxBlk,\n\tIN PMAC_TABLE_ENTRY pEntry);\n\nNDIS_STATUS RTMPSoftDecryptionAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pHdr,\n\tIN UCHAR UserPriority,\n\tIN PCIPHER_KEY pKey,\n\tINOUT PUCHAR pData,\n\tINOUT UINT16 *DataByteCnt);\n\nVOID RTMPSoftConstructIVHdr(\n\tIN UCHAR CipherAlg,\n\tIN UCHAR key_id,\n\tIN PUCHAR pTxIv,\n\tOUT PUCHAR pHdrIv,\n\tOUT UINT8 *hdr_iv_len);\n\nVOID RTMPSoftEncryptionAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR CipherAlg,\n\tIN PUCHAR pHdr,\n\tIN PUCHAR pSrcBufData,\n\tIN UINT32 SrcBufLen,\n\tIN UCHAR KeyIdx,\n\tIN PCIPHER_KEY pKey,\n\tOUT UINT8 *ext_len);\n\nVOID RTMPMakeRSNIE(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UINT AuthMode,\n\tIN UINT WepStatus,\n\tIN UCHAR apidx);\n\nVOID WPAInstallPairwiseKey(\n\tPRTMP_ADAPTER pAd,\n\tUINT8 BssIdx,\n\tPMAC_TABLE_ENTRY pEntry,\n\tBOOLEAN bAE);\n\nVOID WPAInstallSharedKey(\n\tPRTMP_ADAPTER pAd,\n\tUINT8 GroupCipher,\n\tUINT8 BssIdx,\n\tUINT8 KeyIdx,\n\tUINT8 Wcid,\n\tBOOLEAN bAE,\n\tPUINT8 pGtk,\n\tUINT8 GtkLen);\n\nVOID RTMPSetWcidSecurityInfo(\n\tPRTMP_ADAPTER pAd,\n\tUINT8 BssIdx,\n\tUINT8 KeyIdx,\n\tUINT8 CipherAlg,\n\tUINT8 Wcid,\n\tUINT8 KeyTabFlag);\n\nVOID CalculateMIC(\n\tIN UCHAR KeyDescVer,\n\tIN UCHAR *PTK,\n\tOUT PEAPOL_PACKET pMsg);\n\nPSTRING GetEapolMsgType(\n\tCHAR msg);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n/* \n =====================================\t\n \tfunction prototype in cmm_wpa_adhoc.c\n =====================================\t\n*/\nVOID Adhoc_WpaEAPOLStartAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_WpaEAPOLKeyAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_WpaStart4WayHS(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN ULONG TimeInterval);\n\nVOID Adhoc_PeerPairMsg1Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_PeerPairMsg2Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_PeerPairMsg3Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_PeerPairMsg4Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_PeerGroupMsg1Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nVOID Adhoc_Wpa4WayComplete(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry);\n\nVOID Adhoc_WpaRetryExec(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3);\n\nVOID Adhoc_ConstructEapolMsg(\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN UCHAR GroupKeyWepStatus,\n\tIN UCHAR MsgType,\n\tIN UCHAR DefaultKeyIdx,\n\tIN UCHAR *KeyNonce,\n\tIN UCHAR *TxRSC,\n\tIN UCHAR *GTK,\n\tIN UCHAR *RSNIE,\n\tIN UCHAR RSNIE_Len,\n\tIN PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,\n\tOUT PEAPOL_PACKET pMsg);\n\nVOID Adhoc_ConstructEapolKeyData(\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN UCHAR GroupKeyWepStatus,\n\tIN UCHAR keyDescVer,\n\tIN UCHAR MsgType,\n\tIN UCHAR DefaultKeyIdx,\n\tIN UCHAR *GTK,\n\tIN UCHAR *RSNIE,\n\tIN UCHAR RSNIE_LEN,\n\tIN PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,\n\tOUT PEAPOL_PACKET pMsg);\n\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n/* \n =====================================\t\n \tfunction prototype in cmm_wep.c\n =====================================\t\n*/\nUINT RTMP_CALC_FCS32(\n\tIN UINT Fcs,\n\tIN PUCHAR Cp,\n\tIN INT Len);\n\nVOID RTMPConstructWEPIVHdr(\n\tIN UINT8 key_idx,\n\tIN UCHAR *pn,\n\tOUT UCHAR *iv_hdr);\n\nBOOLEAN RTMPSoftEncryptWEP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pIvHdr,\n\tIN PCIPHER_KEY pKey,\n\tINOUT PUCHAR pData,\n\tIN ULONG DataByteCnt);\n\nBOOLEAN RTMPSoftDecryptWEP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PCIPHER_KEY pKey,\n\tINOUT PUCHAR pData,\n\tINOUT UINT16 *DataByteCnt);\n\n/* \n =====================================\t\n \tfunction prototype in cmm_tkip.c\n =====================================\t\n*/\nBOOLEAN RTMPSoftDecryptTKIP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pHdr,\n\tIN UCHAR UserPriority,\n\tIN PCIPHER_KEY pKey,\n\tINOUT PUCHAR pData,\n\tIN UINT16 *DataByteCnt);\n\nVOID TKIP_GTK_KEY_WRAP(\n\tIN UCHAR *key,\n\tIN UCHAR *iv,\n\tIN UCHAR *input_text,\n\tIN UINT32 input_len,\n\tOUT UCHAR *output_text);\n\nVOID TKIP_GTK_KEY_UNWRAP(\n\tIN UCHAR *key,\n\tIN UCHAR *iv,\n\tIN UCHAR *input_text,\n\tIN UINT32 input_len,\n\tOUT UCHAR *output_text);\n\n/* \n =====================================\t\n \tfunction prototype in cmm_aes.c\n =====================================\t\n*/\nBOOLEAN RTMPSoftDecryptAES(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pData,\n\tIN ULONG DataByteCnt,\n\tIN PCIPHER_KEY pWpaKey);\n\nVOID RTMPConstructCCMPHdr(\n\tIN UINT8 key_idx,\n\tIN UCHAR *pn,\n\tOUT UCHAR *ccmp_hdr);\n\nBOOLEAN RTMPSoftEncryptCCMP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pHdr,\n\tIN PUCHAR pIV,\n\tIN PUCHAR pKey,\n\tINOUT PUCHAR pData,\n\tIN UINT32 DataLen);\n\nBOOLEAN RTMPSoftDecryptCCMP(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pHdr,\n\tIN PCIPHER_KEY pKey,\n\tINOUT PUCHAR pData,\n\tINOUT UINT16 *DataLen);\n\nVOID CCMP_test_vector(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT input);\n\n#endif\n"
  },
  {
    "path": "src/include/wpa_cmm.h",
    "content": "\n#ifndef WPA_CMM_H\n#define WPA_CMM_H\n\n#include \"rtmp_type.h\"\n#include \"dot11i_wpa.h\"\n\n#define CACHE_NOT_FOUND         -1\n\n#define TX_EAPOL_BUFFER\t\t\t1500\n\n/* Retry timer counter initial value */\n#define PEER_MSG1_RETRY_TIMER_CTR           0\n#define PEER_MSG3_RETRY_TIMER_CTR           10\n#define GROUP_MSG1_RETRY_TIMER_CTR          20\n\n/* WPA mechanism retry timer interval */\n#define PEER_MSG1_RETRY_EXEC_INTV\t1000\t/* 1 sec */\n#define PEER_MSG3_RETRY_EXEC_INTV\t3000\t/* 3 sec */\n#define GROUP_KEY_UPDATE_EXEC_INTV\t1000\t/* 1 sec */\n#define PEER_GROUP_KEY_UPDATE_INIV\t2000\t/* 2 sec */\n\n#define\tEAPOL_MSG_INVALID\t0\n#define\tEAPOL_PAIR_MSG_1\t1\n#define\tEAPOL_PAIR_MSG_2\t2\n#define\tEAPOL_PAIR_MSG_3\t3\n#define\tEAPOL_PAIR_MSG_4\t4\n#define\tEAPOL_GROUP_MSG_1\t5\n#define\tEAPOL_GROUP_MSG_2\t6\n\n#define ENQUEUE_EAPOL_START_TIMER\t200\t/* 200 ms */\n\n/* group rekey interval */\n#define TIME_REKEY                          0\n#define PKT_REKEY                           1\n#define DISABLE_REKEY                       2\n#define MAX_REKEY                           2\n\n#define MAX_REKEY_INTER                     0x3ffffff\n\n#define EAPOL_START_DISABLE\t\t\t\t\t0\n#define EAPOL_START_PSK\t\t\t\t\t\t1\n#define EAPOL_START_1X\t\t\t\t\t\t2\n\n/* */\n/* Common WPA state machine: states, events, total function # */\n/* */\n#define WPA_PTK                      0\n#define MAX_WPA_PTK_STATE            1\n\n#define WPA_MACHINE_BASE             0\n#define MT2_EAPPacket                0\n#define MT2_EAPOLStart               1\n#define MT2_EAPOLLogoff              2\n#define MT2_EAPOLKey                 3\n#define MT2_EAPOLASFAlert            4\n#define MAX_WPA_MSG                  5\n\n#define WPA_FUNC_SIZE                (MAX_WPA_PTK_STATE * MAX_WPA_MSG)\n\ntypedef enum _WpaRole {\n\tWPA_NONE,\t\t/* 0 */\n\tWPA_Authenticator,\t/* 1 */\n\tWPA_Supplicant,\t\t/* 2 */\n\tWPA_BOTH,\t\t/* 3: Authenticator and Supplicant */\n} WPA_ROLE;\n\n/*for-wpa value domain of pMacEntry->WpaState  802.1i D3   p.114 */\ntypedef enum _ApWpaState {\n\tAS_NOTUSE,\t\t/* 0 */\n\tAS_DISCONNECT,\t\t/* 1 */\n\tAS_DISCONNECTED,\t/* 2 */\n\tAS_INITIALIZE,\t\t/* 3 */\n\tAS_AUTHENTICATION,\t/* 4 */\n\tAS_AUTHENTICATION2,\t/* 5 */\n\tAS_INITPMK,\t\t/* 6 */\n\tAS_INITPSK,\t\t/* 7 */\n\tAS_PTKSTART,\t\t/* 8 */\n\tAS_PTKINIT_NEGOTIATING,\t/* 9 */\n\tAS_PTKINITDONE,\t\t/* 10 */\n\tAS_UPDATEKEYS,\t\t/* 11 */\n\tAS_INTEGRITY_FAILURE,\t/* 12 */\n\tAS_KEYUPDATE,\t\t/* 13 */\n} AP_WPA_STATE;\n\n/* For supplicant state machine states. 802.11i Draft 4.1, p. 97 */\n/* We simplified it */\ntypedef enum _WpaState {\n\tSS_NOTUSE,\t\t/* 0 */\n\tSS_START,\t\t/* 1 */\n\tSS_WAIT_MSG_3,\t\t/* 2 */\n\tSS_WAIT_GROUP,\t\t/* 3 */\n\tSS_FINISH,\t\t/* 4 */\n\tSS_KEYUPDATE,\t\t/* 5 */\n} WPA_STATE;\n\n/* for-wpa value domain of pMacEntry->WpaState  802.1i D3   p.114 */\ntypedef enum _GTKState {\n\tREKEY_NEGOTIATING,\n\tREKEY_ESTABLISHED,\n\tKEYERROR,\n} GTK_STATE;\n\n/*  for-wpa  value domain of pMacEntry->WpaState  802.1i D3   p.114 */\ntypedef enum _WpaGTKState {\n\tSETKEYS,\n\tSETKEYS_DONE,\n} WPA_GTK_STATE;\n\n/* WPA internal command type */\n#define WPA_SM_4WAY_HS_START \t1\n#define WPA_SM_DISCONNECT\t\t0xff\n\n/* WPA element IDs */\ntypedef enum _WPA_VARIABLE_ELEMENT_ID {\n\tWPA_ELEM_CMD = 1,\n\tWPA_ELEM_PEER_RSNIE,\n\tWPA_ELEM_LOCAL_RSNIE,\n\tWPA_ELEM_PMK,\n\tWPA_ELEM_RESV\n} WPA_VARIABLE_ELEMENT_ID;\n\n#define GROUP_SUITE\t\t\t\t\t0\n#define PAIRWISE_SUITE\t\t\t\t1\n#define AKM_SUITE\t\t\t\t\t2\n#define RSN_CAP_INFO\t\t\t\t3\n#define PMKID_LIST\t\t\t\t\t4\n#define G_MGMT_SUITE\t\t\t\t5\n\n/* */\n/*\tThe definition of the cipher combination */\n/* */\n/* \t bit3\tbit2  bit1   bit0 */\n/*\t+------------+------------+ */\n/* \t|\t  WPA\t |\t   WPA2   | */\n/*\t+------+-----+------+-----+ */\n/*\t| TKIP | AES | TKIP | AES | */\n/*\t|\t0  |  1  |   1  |  0  | -> 0x06 */\n/*\t|\t0  |  1  |   1  |  1  | -> 0x07 */\n/*\t|\t1  |  0  |   0  |  1  | -> 0x09 */\n/*\t|\t1  |  0  |   1  |  1  | -> 0x0B */\n/*\t|\t1  |  1  |   0  |  1  | -> 0x0D */\n/*\t|\t1  |  1  |   1  |  0  | -> 0x0E */\n/*\t|\t1  |  1  |   1  |  1  |\t-> 0x0F */\n/*\t+------+-----+------+-----+ */\n/* */\ntypedef enum _WpaMixPairCipher {\n\tMIX_CIPHER_NOTUSE = 0x00,\n\tWPA_NONE_WPA2_TKIPAES = 0x03,\t/* WPA2-TKIPAES */\n\tWPA_AES_WPA2_TKIP = 0x06,\n\tWPA_AES_WPA2_TKIPAES = 0x07,\n\tWPA_TKIP_WPA2_AES = 0x09,\n\tWPA_TKIP_WPA2_TKIPAES = 0x0B,\n\tWPA_TKIPAES_WPA2_NONE = 0x0C,\t/* WPA-TKIPAES */\n\tWPA_TKIPAES_WPA2_AES = 0x0D,\n\tWPA_TKIPAES_WPA2_TKIP = 0x0E,\n\tWPA_TKIPAES_WPA2_TKIPAES = 0x0F,\n} WPA_MIX_PAIR_CIPHER;\n\n/* The internal command list for ralink dot1x daemon using */\ntypedef enum _Dot1xInternalCmd {\n\tDOT1X_DISCONNECT_ENTRY,\n\tDOT1X_RELOAD_CONFIG,\n} DOT1X_INTERNAL_CMD;\n\n/* 802.1x authentication format */\ntypedef struct _IEEE8021X_FRAME {\n\tUCHAR Version;\t\t/* 1.0 */\n\tUCHAR Type;\t\t/* 0 = EAP Packet */\n\tUSHORT Length;\n} IEEE8021X_FRAME, *PIEEE8021X_FRAME;\n\ntypedef struct GNU_PACKED _RSN_IE_HEADER_STRUCT {\n\tUCHAR Eid;\n\tUCHAR Length;\n\tUSHORT Version;\t\t/* Little endian format */\n} RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT;\n\n/* Cipher suite selector types */\ntypedef struct GNU_PACKED _CIPHER_SUITE_STRUCT {\n\tUCHAR Oui[3];\n\tUCHAR Type;\n} CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT;\n\n/* Authentication and Key Management suite selector */\ntypedef struct GNU_PACKED _AKM_SUITE_STRUCT {\n\tUCHAR Oui[3];\n\tUCHAR Type;\n} AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT;\n\n/* RSN capability */\ntypedef struct GNU_PACKED _RSN_CAPABILITY {\n\tUSHORT Rsv:10;\n\tUSHORT GTKSAReplayCnt:2;\n\tUSHORT PTKSAReplayCnt:2;\n\tUSHORT NoPairwise:1;\n\tUSHORT PreAuth:1;\n} RSN_CAPABILITY, *PRSN_CAPABILITY;\n\ntypedef struct _CIPHER_KEY {\n\tUCHAR Key[16];\t\t/* 128 bits max */\n\tUCHAR TxMic[8];\n\tUCHAR RxMic[8];\n\tUCHAR TxTsc[16];\t/* TSC value. Change it from 48bit to 128bit */\n\tUCHAR RxTsc[16];\t/* TSC value. Change it from 48bit to 128bit */\n\tUCHAR CipherAlg;\t/* 0:none, 1:WEP64, 2:WEP128, 3:TKIP, 4:AES, 5:CKIP64, 6:CKIP128 */\n\tUCHAR KeyLen;\t\t/* Key length for each key, 0: entry is invalid */\n#ifdef CONFIG_STA_SUPPORT\n\tUCHAR BssId[6];\n#endif\t\t\t\t/* CONFIG_STA_SUPPORT */\n\tUCHAR Type;\t\t/* Indicate Pairwise/Group when reporting MIC error */\n} CIPHER_KEY, *PCIPHER_KEY;\n\n#endif /* WPA_CMM_H */\n"
  },
  {
    "path": "src/include/wsc.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twsc.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n\tPaul Lin\t06-08-08\t\tInitial\n*/\n\n#ifndef\t__WSC_H__\n#define\t__WSC_H__\n\n/* WSC OUI SMI */\n#define WSC_OUI\t\t\t\t0x0050f204\n#define\tWSC_SMI\t\t\t\t0x00372A\n#define\tWSC_VENDOR_TYPE\t\t0x00000001\n\n/* EAP code */\n#define\tEAP_CODE_REQ\t\t0x01\n#define\tEAP_CODE_RSP\t\t0x02\n#define\tEAP_CODE_FAIL\t\t0x04\n#define EAP_TYPE_ID\t\t\t0x01\n#define EAP_TYPE_NOTIFY\t\t0x02\n#define\tEAP_TYPE_WSC\t\t0xfe\n\n/* structure to store Simple Config Attributes Info */\ntypedef struct GNU_PACKED _WSC_LV_INFO {\n    USHORT  ValueLen;\n    UCHAR   Value[512];\n} WSC_LV_INFO;\n\ntypedef struct GNU_PACKED _WSC_IE_HEADER {\n\tUCHAR elemId;\n\tUCHAR length;\n\tUCHAR oui[4];\n} WSC_IE_HEADER;\n\n/* WSC IE structure */\ntypedef\tstruct GNU_PACKED _WSC_IE\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tUCHAR\tData[1];\t/* variable length data */\n}\tWSC_IE, *PWSC_IE;\n\n/* WSC fixed information within EAP */\ntypedef\tstruct GNU_PACKED _WSC_FRAME\n{\n\tUCHAR\tSMI[3];\n\tUINT\tVendorType;\n\tUCHAR\tOpCode;\n\tUCHAR\tFlags;\n}\tWSC_FRAME, *PWSC_FRAME;\n\n/* EAP frame format */\ntypedef\tstruct GNU_PACKED _EAP_FRAME\t{\n\tUCHAR\tCode;\t\t\t\t\t\t/* 1 = Request, 2 = Response */\n\tUCHAR\tId;\n\tUSHORT\tLength;\n\tUCHAR\tType;\t\t\t\t\t\t/* 1 = Identity, 0xfe = reserved, used by WSC */\n}\tEAP_FRAME, *PEAP_FRAME;\n\nstatic inline BOOLEAN WscCheckWSCHeader(\n    IN  PUCHAR              pData)\n{\n    PWSC_FRAME\t\t\tpWsc;\n\n\tpWsc = (PWSC_FRAME) pData;\n\n    /* Verify SMI first */\n\tif (((pWsc->SMI[0] * 256 + pWsc->SMI[1]) * 256 + pWsc->SMI[2]) != WSC_SMI)\n\t{\n\t\t/* Wrong WSC SMI Vendor ID, Update WSC status */\n\t\treturn  FALSE;\n\t}\n    \n    /* Verify Vendor Type */\n\tif (cpu2be32(get_unaligned32(&pWsc->VendorType)) != WSC_VENDOR_TYPE)\n\t{\n\t\t/* Wrong WSC Vendor Type, Update WSC status */\n\t\treturn  FALSE;\n\t}\n    return TRUE;\n}\n#ifdef WSC_INCLUDED\n\n#ifdef IWSC_SUPPORT\n/*\n\tIP Address Configuration Methods\n*/\n#define IWSC_IPV4_ASSIGNMENT\t\t\t\t\t0x0001\n#define IWSC_DHCP_IPV4\t\t\t\t\t\t\t0x0002\n#define IWSC_STATIC_IPV4\t\t\t\t\t\t0x0004\n#define IWSC_LINK_LOCAL_IPV4\t\t\t\t\t0x0008\n#define IWSC_NFC_IPV4_ASSIGNMENT\t\t\t\t0x0010\n#define IWSC_NFC_LINK_LOCAL_IPV4\t\t\t\t0x0020\n#define IWSC_IPV6_DEVICE_UNIQUE\t\t\t\t\t0x0040\n\n#define IWSC_DEFAULT_REG_IPV4_ADDR\t\t\t\t0x0a000001\n#define IWSC_DEFAULT_IPV4_SUBMASK\t\t\t\t0xFF000000\n#define IWSC_DEFAULT_IPV4_RANGE\t\t\t\t\t0xFFFFFFC0\n#define IWSC_IPV4_RANGE0\t\t\t\t\t\t0xFFFFFFC0\n#define IWSC_IPV4_RANGE1\t\t\t\t\t\t0xFFFFF03F\n#define IWSC_IPV4_RANGE2\t\t\t\t\t\t0xFFFC0FFF\n#define IWSC_IPV4_RANGE3\t\t\t\t\t\t0xFF03FFFF\n\n#define IWSC_MAX_IP_DEV_COUNT\t\t\t\t\t62\n#endif /* IWSC_SUPPORT */\n\n/* WSC HDR PSH BTN FUNC */\n/* WSC hardware push button function 0811 */\n#define WSC_HDR_BTN_CHECK_PERIOD\tMLME_TASK_EXEC_INTV /* unit: ms, check pin every 100ms */\n#define WSC_HDR_BTN_PRESS_TIME\t\t2000\t/* unit: ms, press button for 2s */\n#define WSC_HDR_BTN_CONT_TIMES\t\t(WSC_HDR_BTN_PRESS_TIME/WSC_HDR_BTN_CHECK_PERIOD)\n#define WSC_HDR_BTN_GPIO_0\t\t\t((UINT32)0x00000001) /* bit 0 for RT2860/RT2870 */\n#define WSC_HDR_BTN_GPIO_3\t\t\t((UINT32)0x00000008) /* bit 3 for RT2860/RT2870 */\n\n/* bit7: WPS PBC (0:off, 1:on) */\n#define WSC_HDR_BTN_MR_HDR_SUPPORT_SET(__pAd, __FlgIsSup)\t\\\n\t\t(__pAd)->WscHdrPshBtnFlag = __FlgIsSup;\n\n/* check if hardware push button is supported */\n#define WSC_HDR_BTN_MR_IS_HDR_SUPPORT(__pAd)\t\t\t\t\\\n\t\t((__pAd)->WscHdrPshBtnFlag)\n\n/* run hardware push button handler */\n#define WSC_HDR_BTN_MR_HANDLE(__pAd)\t\t\t\t\t\t\\\n\t\tif ((__pAd)->WscHdrPshBtnFlag) WSC_HDR_BTN_CheckHandler(__pAd);\n\n/* bit3: WPS PBC function is controlled through GPIO[3] */\n/* currently only for RT2860 & RT2870 */\n#define WSC_HDR_BTN_MR_PRESS_FLG_GET(__pAd, __FlgIsPressed)\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tUINT32 __gpio_value, mask;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tRTMP_IO_READ32(__pAd, GPIO_CTRL_CFG, (&__gpio_value));\t\t\t\\\n\t\tif (RTMP_TEST_MORE_FLAG(__pAd, fRTMP_ADAPTER_WSC_PBC_PIN0))\t\t\\\n\t\t\tmask = WSC_HDR_BTN_GPIO_0;\t\t\t\t\t\t\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tmask = WSC_HDR_BTN_GPIO_3;\t\t\t\t\t\t\t\t\t\\\n\t\tif (__gpio_value & mask)\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t__FlgIsPressed = 0;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t__FlgIsPressed = 1;\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\n/* WSC HDR PSH BTN FUNC */\n\n\n#define WSC_TIMER_INIT(_pAd, _pData, _time_var, _time_flg, _time_fn) \\\n\tdo{ \\\n\t        RTMPInitTimer((_pAd), (_time_var), GET_TIMER_FUNCTION(_time_fn), (_pData), FALSE); \\\n\t    \t(_time_flg) = FALSE; \\\n\t}while(0)\n\n\n/*Messages for the WSC state machine, */\n#define\tWSC_MACHINE_BASE\t\t34\n#define\tWSC_EAPOL_PACKET_MSG\t34\n#define\tWSC_EAPOL_START_MSG\t\t35\n#define\tWSC_EAPOL_UPNP_MSG\t\t36\n\n#define\tMAX_WSC_MSG\t\t\t    3\n\n/* WSC Opcode */\n#define\tWSC_OPCODE_START\t\t0x01\n#define\tWSC_OPCODE_ACK\t\t\t0x02\n#define\tWSC_OPCODE_NACK\t\t\t0x03\n#define\tWSC_OPCODE_MSG\t\t\t0x04\n#define\tWSC_OPCODE_DONE\t\t\t0x05\n#define\tWSC_OPCODE_FRAG_ACK\t\t0x06\n\n/* Flags */\n#define\tWSC_MSG_FLAG_MF\t\t\t0x01\t/* More fragments */\n#define WSC_MSG_FLAG_LF\t\t\t0x02\t/* Length field */\n\n#define WSC_OPCODE_UPNP_MASK\t0x10\n#define WSC_OPCODE_UPNP_DATA\t0x11\n#define WSC_OPCODE_UPNP_MGMT\t0x12\n#define WSC_OPCODE_UPNP_CTRL\t0x13\n\n#define WSC_UPNP_MGMT_SUB_PROBE_REQ\t\t0x01\n#define WSC_UPNP_MGMT_SUB_CONFIG_REQ\t0x02\n#define WSC_UPNP_MGMT_SUB_REG_SELECT\t0x03\n\n\n/*patch for Atheros External registrar */\n#define WSC_UPNP_DATA_SUB_INCLUDE_MAC\t0x0100\n\n#define WSC_UPNP_DATA_SUB_NORMAL\t\t0x00\n#define WSC_UPNP_DATA_SUB_TO_ALL\t\t0x01\n#define WSC_UPNP_DATA_SUB_TO_ONE\t\t0x02\n#define WSC_UPNP_DATA_SUB_ACK\t\t\t0x03\n#define WSC_UPNP_DATA_SUB_M1\t\t\t0x04\n#define WSC_UPNP_DATA_SUB_M2\t\t\t0x05\n#define WSC_UPNP_DATA_SUB_M2D\t\t\t0x06\n#define WSC_UPNP_DATA_SUB_M3\t\t\t0x07\n#define WSC_UPNP_DATA_SUB_M4\t\t\t0x08\n#define WSC_UPNP_DATA_SUB_M5\t\t\t0x09\n#define WSC_UPNP_DATA_SUB_M6\t\t\t0x0A\n#define WSC_UPNP_DATA_SUB_M7\t\t\t0x0B\n#define WSC_UPNP_DATA_SUB_M8\t\t\t0x0C\n#define WSC_UPNP_DATA_SUB_WSC_ACK\t\t0x0D\n#define WSC_UPNP_DATA_SUB_WSC_NACK\t\t0x0E\n#define WSC_UPNP_DATA_SUB_WSC_DONE\t\t0x0F\n#define WSC_UPNP_DATA_SUB_WSC_UNKNOWN\t0xff\n\n\n/* Wsc EAP Messges type */\n#define\tWSC_MSG_EAP_RSP_ID\t\t\t0x21\t\n#define\tWSC_MSG_EAP_REG_RSP_ID      0x22\n#define\tWSC_MSG_EAP_ENR_RSP_ID      0x23\n#define\tWSC_MSG_EAP_UPNP_RSP_ID     0x24\n#define\tWSC_MSG_EAP_REQ_ID\t\t\t0x25\n#define\tWSC_MSG_EAP_REQ_START\t\t0x26\n#define\tWSC_MSG_EAP_FAIL\t\t\t0x27\n#define WSC_MSG_EAP_FRAG_ACK\t\t0x28\n#define\tWSC_MSG_PROB_RSP\t\t\t0x01\n#define WSC_MSG_EAPOL_START         0x02\n#define\tWSC_MSG_M1\t\t\t\t\t0x04\n#define\tWSC_MSG_M2\t\t\t\t\t0x05\n#define\tWSC_MSG_M2D\t\t\t\t\t0x06\n#define\tWSC_MSG_M3\t\t\t\t\t0x07\n#define\tWSC_MSG_M4\t\t\t\t\t0x08\n#define\tWSC_MSG_M5\t\t\t\t\t0x09\n#define\tWSC_MSG_M6\t\t\t\t\t0x0A\n#define\tWSC_MSG_M7\t\t\t\t\t0x0B\n#define\tWSC_MSG_M8\t\t\t\t\t0x0C\n#define\tWSC_MSG_WSC_ACK\t\t\t\t0x0D\n#define\tWSC_MSG_WSC_NACK\t\t\t0x0E\n#define\tWSC_MSG_WSC_DONE\t\t\t0x0F\n#define\tWSC_MSG_UNKNOWN\t\t\t\t0xff\n\n/* WSC connection mode */\n#define\tWSC_PIN_MODE\t\t        1\n#define\tWSC_PBC_MODE\t\t        2\n#define WSC_SMPBC_MODE\t\t\t\t3\n\n/* Value of WSC_IE_DEV_PASS_ID 0x1012 */\n#define\tDEV_PASS_ID_PIN\t\t\t\t0x0000\n#define\tDEV_PASS_ID_USER\t\t\t0x0001\n#define\tDEV_PASS_ID_MACHINE\t\t\t0x0002\n#define\tDEV_PASS_ID_REKEY\t\t\t0x0003\n#define\tDEV_PASS_ID_PBC\t\t\t\t0x0004\n#define\tDEV_PASS_ID_REG\t\t\t\t0x0005\n#define DEV_PASS_ID_SMPBC\t\t\t0x0006\n#define\tDEV_PASS_ID_NOSPEC\t\t\t0xffff\n\n\n/* Common definition */\n#define\tWSC_VERSION\t\t\t\t\t0x10\n#define WSC_CONFIG_METHODS\t\t\t0x008C\n\n/* Wsc status code */\n#define\tSTATUS_WSC_NOTUSED\t\t\t\t\t\t0\n#define\tSTATUS_WSC_IDLE\t\t\t\t\t\t\t1\n#define STATUS_WSC_FAIL        \t\t\t        2\t\t/* WSC Process Fail */\n#define\tSTATUS_WSC_LINK_UP\t\t\t\t\t\t3\t\t/* Start WSC Process */\n#define\tSTATUS_WSC_EAPOL_START_RECEIVED\t\t\t4\t\t/* Received EAPOL-Start */\n#define\tSTATUS_WSC_EAP_REQ_ID_SENT\t\t\t\t5\t\t/* Sending EAP-Req(ID) */\n#define\tSTATUS_WSC_EAP_RSP_ID_RECEIVED\t\t\t6\t\t/* Receive EAP-Rsp(ID) */\n#define\tSTATUS_WSC_EAP_RSP_WRONG_SMI\t\t\t7\t\t/* Receive EAP-Req with wrong WSC SMI Vendor Id */\n#define\tSTATUS_WSC_EAP_RSP_WRONG_VENDOR_TYPE\t8\t\t/* Receive EAPReq with wrong WSC Vendor Type */\n#define\tSTATUS_WSC_EAP_REQ_WSC_START\t\t\t9\t\t/* Sending EAP-Req(WSC_START) */\n#define\tSTATUS_WSC_EAP_M1_SENT\t\t\t\t\t10\t\t/* Send M1 */\n#define\tSTATUS_WSC_EAP_M1_RECEIVED\t\t\t\t11\t\t/* Received M1 */\n#define\tSTATUS_WSC_EAP_M2_SENT\t\t\t\t\t12\t\t/* Send M2 */\n#define\tSTATUS_WSC_EAP_M2_RECEIVED\t\t\t\t13\t\t/* Received M2 */\n#define\tSTATUS_WSC_EAP_M2D_RECEIVED\t\t\t\t14\t\t/* Received M2D */\n#define\tSTATUS_WSC_EAP_M3_SENT\t\t\t\t\t15\t\t/* Send M3 */\n#define\tSTATUS_WSC_EAP_M3_RECEIVED\t\t\t\t16\t\t/* Received M3 */\n#define\tSTATUS_WSC_EAP_M4_SENT\t\t\t\t\t17\t\t/* Send M4 */\n#define\tSTATUS_WSC_EAP_M4_RECEIVED\t\t\t\t18\t\t/* Received M4 */\n#define\tSTATUS_WSC_EAP_M5_SENT\t\t\t\t\t19\t\t/* Send M5 */\n#define\tSTATUS_WSC_EAP_M5_RECEIVED\t\t\t\t20\t\t/* Received M5 */\n#define\tSTATUS_WSC_EAP_M6_SENT\t\t\t\t\t21\t\t/* Send M6 */\n#define\tSTATUS_WSC_EAP_M6_RECEIVED\t\t\t\t22\t\t/* Received M6 */\n#define\tSTATUS_WSC_EAP_M7_SENT\t\t\t\t\t23\t\t/* Send M7 */\n#define\tSTATUS_WSC_EAP_M7_RECEIVED\t\t\t\t24\t\t/* Received M7 */\n#define\tSTATUS_WSC_EAP_M8_SENT\t\t\t\t\t25\t\t/* Send M8 */\n#define\tSTATUS_WSC_EAP_M8_RECEIVED\t\t\t\t26\t\t/* Received M8 */\n#define\tSTATUS_WSC_EAP_RAP_RSP_ACK\t\t\t\t27\t\t/* Processing EAP Response (ACK) */\n#define\tSTATUS_WSC_EAP_RAP_REQ_DONE_SENT\t\t28\t\t/* Processing EAP Request (Done) */\n#define\tSTATUS_WSC_EAP_RAP_RSP_DONE_SENT\t\t29\t\t/* Processing EAP Response (Done) */\n#define STATUS_WSC_EAP_FAIL_SENT                30      /* Sending EAP-Fail */\n#define STATUS_WSC_ERROR_HASH_FAIL              31      /* WSC_ERROR_HASH_FAIL */\n#define STATUS_WSC_ERROR_HMAC_FAIL              32      /* WSC_ERROR_HMAC_FAIL */\n#define STATUS_WSC_ERROR_DEV_PWD_AUTH_FAIL      33      /* WSC_ERROR_DEV_PWD_AUTH_FAIL */\n#define STATUS_WSC_CONFIGURED\t\t\t\t\t34\n#define\tSTATUS_WSC_SCAN_AP\t\t\t\t\t\t35\t\t/* Scanning AP */\n#define\tSTATUS_WSC_EAPOL_START_SENT\t\t\t\t36\n#define STATUS_WSC_EAP_RSP_DONE_SENT\t\t\t37\n#define STATUS_WSC_WAIT_PIN_CODE                38\n#define STATUS_WSC_START_ASSOC\t\t\t\t\t39\n#define STATUS_WSC_IBSS_WAIT_NEXT_SMPBC_ENROLLEE\t40\n#define STATUS_WSC_IBSS_NEW_RANDOM_PIN\t\t\t41\n#define STATUS_WSC_IBSS_FIXED_PIN\t\t\t\t42\n\n/* All error message dtarting from 0x0100 */\n#define\tSTATUS_WSC_PBC_TOO_MANY_AP\t\t\t\t0x0101\t\t/* Too many PBC AP avaliable */\n#define\tSTATUS_WSC_PBC_NO_AP\t\t\t\t\t0x0102\t\t/* No PBC AP avaliable */\n#define\tSTATUS_WSC_EAP_FAIL_RECEIVED\t\t\t0x0103\t\t/* Received EAP-FAIL */\n#define\tSTATUS_WSC_EAP_NONCE_MISMATCH\t\t\t0x0104\t\t/* Receive EAP with wrong NONCE */\n#define\tSTATUS_WSC_EAP_INVALID_DATA\t\t\t\t0x0105\t\t/* Receive EAP without integrity (Hmac mismatch) */\n#define STATUS_WSC_PASSWORD_MISMATCH\t\t\t0x0106\t\t/* Error PIN Code (R-Hash mismatch) */\n#define\tSTATUS_WSC_EAP_REQ_WRONG_SMI\t\t\t0x0107\t\t/* Receive EAP-Req with wrong WPS SMI Vendor Id */\n#define\tSTATUS_WSC_EAP_REQ_WRONG_VENDOR_TYPE\t0x0108\t\t/* Receive EAPReq with wrong WPS Vendor Type */\n#define\tSTATUS_WSC_PBC_SESSION_OVERLAP\t\t\t0x0109\t\t/* AP PBC session overlap */\n#define\tSTATUS_WSC_SMPBC_TOO_MANY_REGISTRAR\t\t0x010a\t\t/* Too many SMPBC Registrars avaliable */\n#define STATUS_WSC_EMPTY_IPV4_SUBMASK_LIST\t\t0x010b\t\t/* Empty available IPv4 Submask list */\n#define\tSTATUS_WSC_SMPBC_NO_AP\t\t\t\t\t0x010c\t\t/* No SMPBC AP avaliable */\n\n#define WSC_DISABLE\t\t    0x0\n#define WSC_ENROLLEE     0x1\n#define WSC_PROXY        0x2\n#define WSC_REGISTRAR    0x4\n#define WSC_ENROLLEE_PROXY           (WSC_ENROLLEE | WSC_PROXY)\n#define WSC_ENROLLEE_REGISTRAR       (WSC_ENROLLEE | WSC_REGISTRAR)\n#define WSC_PROXY_REGISTRAR          (WSC_PROXY | WSC_REGISTRAR)\n#define WSC_ENROLLEE_PROXY_REGISTRAR (WSC_ENROLLEE | WSC_PROXY | WSC_REGISTRAR)\n\n/* Device request/response type */\n#define WSC_MSGTYPE_ENROLLEE_INFO_ONLY\t\t0x00\n#define WSC_MSGTYPE_ENROLLEE_OPEN_8021X\t\t0x01\n#define WSC_MSGTYPE_REGISTRAR\t\t\t\t0x02\n#define WSC_MSGTYPE_AP_WLAN_MGR\t\t\t\t0x03\n#ifdef IWSC_SUPPORT\n#define WSC_MSGTYPE_IWSC_NOTIFIER\t\t\t0x04\n#endif /* IWSC_SUPPORT */\n\n/* RF Band */\n#define WSC_RFBAND_24GHZ    0x01\n#define WSC_RFBAND_50GHZ    0x02\n\n/* Simple Config state */\n#define WSC_SCSTATE_UNCONFIGURED\t0x01\n#define WSC_SCSTATE_CONFIGURED\t\t0x02\n\n/* Common definition */\n#define\tWSC_MANUFACTURE\t\t\"Ralink Technology, Corp.\"\n#ifdef CONFIG_AP_SUPPORT\n#define\tAP_WSC_MODEL_NAME\t\t\"Ralink Wireless Access Point\"\n#define\tAP_WSC_DEVICE_NAME\t\t\"RalinkAPS\"\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n#define\tSTA_WSC_MODEL_NAME\t\t\"Ralink Wireless Linux Client\"\n#define\tSTA_WSC_DEVICE_NAME\t\t\"RalinkLinuxClient\"\n#define\tWSC_DEVICE_NAME_R\t\"Ralink EX-Registrar\"\n#endif /* CONFIG_STA_SUPPORT */\n#define\tWSC_MODEL_NUMBER\t\"RT2860\"\n#define\tWSC_MODEL_SERIAL\t\"12345678\"\n\n/* Time-Out, param for timer func, count by micro-sec, not ticks */\n#define WSC_EAPOL_START_TIME_OUT    2000 \n#define WSC_EAP_ID_TIME_OUT         5000\n#define WSC_EAP_MSG_TIME_OUT        5000\n#define WSC_EAP_MSG_ACK_TIME_OUT    1000\n#define WSC_EAP_EAP_FAIL_TIME_OUT   1000\n#define WSC_TWO_MINS_TIME_OUT       120000\n#define WSC_UPNP_M2D_TIME_OUT\t\t15000\n#define WSC_UPNP_MSG_TIME_OUT\t\t15000\n#define\tWSC_PROFILE_RETRY_TIME_OUT\t10000\n#ifdef WSC_LED_SUPPORT\n#define WSC_SUCCESSFUL_LED_PATTERN_TIMEOUT\t\t300000\t\t/* 300 seconds */\n#define WSC_WPS_FAIL_LED_PATTERN_TIMEOUT\t\t15000\t\t/* 15 seconds. */\n#define WSC_WPS_SKIP_TURN_OFF_LED_TIMEOUT\t\t2500\t\t\t/* 2.5 seconds. */\n#define WSC_WPS_TURN_OFF_LED_TIMEOUT\t\t\t1000\t\t\t/* 1 second. */\n#endif /* WSC_LED_SUPPORT */\n\n#ifdef WSC_V2_SUPPORT\n#define WSC_WPS_AP_SETUP_LOCK_TIME\t\t\t\t60\t\t/* 60 mins */\n#define WSC_WPS_AP_MAX_PIN_ATTACK\t\t\t\t3\n#define WSC_LOCK_FOREVER_PIN_ATTACK\t\t\t\t10\n#endif /* WSC_V2_SUPPORT */\n\n#define WSC_INIT_ENTRY_APIDX        0xFF\n#define WSC_MAX_DATA_LEN            1024\n\n#define WSC_ENTRY_GET_EAPOL_START   0x1\n#define WSC_ENTRY_GET_EAP_RSP_ID    0x2\n\n/* Pack struct to align at byte */\n/*#pragma pack(1) */\n\n/* General used field */\n\n/* UUID related definition */\n#define UUID_LEN_HEX 16  /* 128 bits => 16 bytes */\n#define UUID_LEN_STR 37  /* hex to string, plus 4 dash, plus 1 '\\0' */\n#define UUID_VERSION 1   /* We currently just support version 1 */\n\n/* user define length add by woody */\n#define WSC_MANUFACTURE_LEN\t\t64\n#define WSC_MODELNAME_LEN\t\t32\n#define WSC_MODELNUNBER_LEN\t\t32\n#define\tWSC_DEVICENAME_LEN\t\t32\n#define WSC_SERIALNUNBER_LEN\t32\n#define MAX_2ND_DEV_TYPE_LIST\t2\n#define MAX_2ND_DEV_TYPE_LIST_BUFFER\t(1+(8*MAX_2ND_DEV_TYPE_LIST))\n\ntypedef struct _WSC_UUID_T{\n\tUINT32 timeLow;\n\tUINT16 timeMid;\n\tUINT16 timeHi_Version;\n\tUCHAR  clockSeqHi_Var;\n\tUCHAR  clockSeqLow;\n\tUCHAR  node[6];\n}WSC_UUID_T;\n\n/* For WSC state machine states. */\n/* We simplified it */\ntypedef\tenum\t_WscState\n{\n\tWSC_STATE_OFF,\n\tWSC_STATE_INIT,\n\tWSC_STATE_START,\n\tWSC_STATE_FAIL,\t\n   \tWSC_STATE_CONFIGURED,\n   \tWSC_STATE_LINK_UP,\n   \tWSC_STATE_SEND_EAPOL_START,\n\tWSC_STATE_WAIT_EAPOL_START,\n\tWSC_STATE_WAIT_UPNP_START,\n\tWSC_STATE_WAIT_REQ_ID,\n\tWSC_STATE_WAIT_RESP_ID,\n\tWSC_STATE_WAIT_WSC_START,\n\tWSC_STATE_WAIT_M1,\n\tWSC_STATE_SENT_M1,\n\tWSC_STATE_SENT_M2D,\n\tWSC_STATE_WAIT_M2,\n\tWSC_STATE_RX_M2D,\t\n\tWSC_STATE_WAIT_PIN,\n\tWSC_STATE_WAIT_M3,\n\tWSC_STATE_WAIT_M4,\n\tWSC_STATE_WAIT_M5,\n\tWSC_STATE_WAIT_M6,\n\tWSC_STATE_WAIT_M7,\n\tWSC_STATE_WAIT_M8,\n\tWSC_STATE_WAIT_DONE,\n\tWSC_STATE_WAIT_ACK,\n\tWSC_STATE_WAIT_EAPFAIL,\n\tWSC_STATE_WAIT_DISCONN\n}\tWSC_STATE;\n\n/* WSC saved message */\ntypedef\tstruct\t_WSC_MESSAGE\n{\n\tINT\t    Length;\t\t\t/* Length of saved message */\n\tUCHAR\tData[2048];\t\t/* Contents */\n}\tWSC_MESSAGE, *PWSC_MESSAGE;\n\n\n/* Data structure to hold Enrollee and Registrar information */\ntypedef struct\t_WSC_DEV_INFO\n{\n\tUCHAR\tVersion;\n\tUCHAR\tVersion2;\n\tUCHAR\tUuid[16];\n\tUCHAR\tMacAddr[6];\n\tUCHAR\tDeviceName[32];\n\tUCHAR\tPriDeviceType[8];\n\tUCHAR\tSecDevTypList[MAX_2ND_DEV_TYPE_LIST_BUFFER]; /* 2nd Device Type List, ref. P2P Spec. v1.1 Table 29*/\n\tUSHORT\tAuthTypeFlags;\n\tUSHORT\tEncrTypeFlags;\n\tUCHAR\tConnTypeFlags;\n\tUSHORT\tConfigMethods;\n\tUCHAR\tScState;\n\tUCHAR\tManufacturer[64];\n\tUCHAR\tModelName[32];\n\tUCHAR\tModelNumber[32];\n\tUCHAR\tSerialNumber[32];\n\tUCHAR\tRfBand;\n\tUINT\tOsVersion;\n\tUINT\tFeatureId;\n\tUSHORT\tAssocState;\n\tUSHORT\tDevPwdId;\n\tUSHORT\tConfigError;\n\tUCHAR\tSsid[32];\n    UCHAR\tNewKey[64 + 1]; /* not sure sprintf would add '\\0' or not, add one byte for \\0' */\n    INT     NewKeyLen;\n    UCHAR   NewKeyIndex;\n}\tWSC_DEV_INFO, *PWSC_DEV_INFO;\n\n/* data structure to store info of the instance of Registration protocol */\ntypedef\tstruct\t_WSC_REG_DATA\n{\n\t/* filled in by device self */\n\tWSC_DEV_INFO\tSelfInfo;        \n\t/* filled in by wps peer */\n\tWSC_DEV_INFO\tPeerInfo;    \n\n\t/*Diffie Hellman parameters */\n/*\tBIGNUM\t\t*DH_PubKey_Peer; //peer's pub key stored in bignum format */\n/*\tDH\t\t\t*DHSecret;       //local key pair in bignum format */\n\tUCHAR\t\tEnrolleeRandom[192];\t/* Saved random byte for public key generation */\n\t\n\tUCHAR\t\tReComputePke;\n\tUCHAR\t\tPke[192];\t\t/*enrollee's raw pub key */\n\tUCHAR\t\tPkr[192];\t\t/*registrar's raw pub key */\n\n\tUCHAR\t\tSecretKey[192];\t/* Secret key calculated by enrollee */\n\t\n\tUCHAR\t\tStaEncrSettings[128];\t\t/* to be sent in M2/M8 by reg & M7 by enrollee */\n\tUCHAR\t\tApEncrSettings[1024];\n\n\t/* Saved Message content for authenticator calculation */\n\tWSC_MESSAGE\tLastTx;\n\tWSC_MESSAGE\tLastRx;\n\n\t/* Device password */\n\tUCHAR\t\tPIN[8];\n\tUCHAR\t\tPinCodeLen;\n\t\n\t/* From KDF Key */\n\tUCHAR\t\tAuthKey[32];\n\tUCHAR\t\tKeyWrapKey[16];\n\tUCHAR\t\tEmsk[32];\n\t\n\tUSHORT\t\tEnrolleePwdId;\n\tUCHAR\t\tEnrolleeNonce[16];\t\t/*N1, from enrollee */\n\tUCHAR\t\tRegistrarNonce[16];\t\t/*N2, from registrar */\n\tUCHAR\t\tSelfNonce[16];\n\n\tUCHAR\t\tPsk1[16];\n\tUCHAR\t\tPsk2[16];\n\n\tUCHAR\t\tEHash1[32];\n\tUCHAR\t\tEHash2[32];\n\tUCHAR\t\tEs1[16];\n\tUCHAR\t\tEs2[16];\n\n\tUCHAR\t\tRHash1[32];\n\tUCHAR\t\tRHash2[32];\n\tUCHAR\t\tRs1[16];\n\tUCHAR\t\tRs2[16];\n}\tWSC_REG_DATA, *PWSC_REG_DATA;\n\n\n/* WSC UPnP node info. */\ntypedef struct _WSC_UPNP_NODE_INFO{\n\tBOOLEAN\t\t\t\tbUPnPInProgress;\n\tBOOLEAN\t\t\t\tbUPnPMsgTimerRunning;\n\tBOOLEAN\t\t\t\tbUPnPMsgTimerPending;\n\tUINT\t\t\t\tregistrarID;\n\tRALINK_TIMER_STRUCT   UPnPMsgTimer;\n}WSC_UPNP_NODE_INFO, *PWSC_UPNP_NODE_INFO;\n\n#define MAX_PBC_STA_TABLE_SIZE\t4\ntypedef struct _WSC_STA_PBC_PROBE_INFO {\n\tULONG\t\t\t\tReciveTime[MAX_PBC_STA_TABLE_SIZE];\n    UCHAR\t\t\t\tWscPBCStaProbeCount;\n    UCHAR   \t\t\tStaMacAddr[MAX_PBC_STA_TABLE_SIZE][MAC_ADDR_LEN];\n\tUCHAR\t\t\t\tValid[MAX_PBC_STA_TABLE_SIZE];\n} WSC_STA_PBC_PROBE_INFO, *PWSC_STA_PBC_PROBE_INFO;\n\n#ifdef IWSC_SUPPORT\ntypedef\tstruct\t_IWSC_INFO\n{\n\tRALINK_TIMER_STRUCT\tIWscT1Timer;\n\tRALINK_TIMER_STRUCT\tIWscT2Timer;\n\tRALINK_TIMER_STRUCT\tIWscEntryTimer;\n\tRALINK_TIMER_STRUCT\tIWscDevQueryTimer;\n\tUCHAR\t\t\t\tDialogToken;\n\tUCHAR\t\t\t\tPeerDialogToken;\n\tBOOLEAN\t\t\t\tbSelRegStart;\n\tBOOLEAN\t\t\t\tbReStart;\n\tBOOLEAN\t\t\t\tbIWscT1TimerRunning;\n\tBOOLEAN\t\t\t\tbIWscT2TimerRunning;\n\tBOOLEAN\t\t\t\tbIWscEntryTimerRunning;\n\tBOOLEAN\t\t\t\tbIWscDevQueryReqTimerRunning;\n\tBOOLEAN\t\t\t\tbIWscDevQueryRspTimerRunning;\n\tBOOLEAN\t\t\t\tbLimitedUI;\t\t\t\t// own device is limited UI device\n\tBOOLEAN\t\t\t\tbSinglePIN; // use Physical PIN\n\tBOOLEAN\t\t\t\tbDoNotChangeBSSID;\n\tBOOLEAN\t\t\t\tbSendEapolStart;\n\tUCHAR\t\t\t\tRegMacAddr[MAC_ADDR_LEN];\n\tUINT8\t\t\t\tIWscSmpbcAcceptCount;\n\tUSHORT\t\t\t\tIpConfMethod;\t\t// Bitwise OR values\n\tUSHORT\t\t\t\tIpMethod;\t\t\t// Single Method in WSC Credential\n\tUINT32\t\t\t\tSelfIpv4Addr;\t\t// Device own IPv4 Address\n\tUINT32\t\t\t\tPeerIpv4Addr;\t\t// IPv4 Address for peer in credtential\n\tUINT32\t\t\t\tRegIpv4Addr;\t\t// Registrar's IPv4 Address\n\tUINT32\t\t\t\tIpv4SubMask;\t\t// 255.0.0.0\n\tUINT32\t\t\t\tCurrentIpRange;\t\t\n\tUINT32\t\t\t\tAvaSubMaskList[IWSC_MAX_SUB_MASK_LIST_COUNT];\n\tUINT8\t\t\t\tIpDevCount;\t\t\t// Maximal value is 62\n\tUINT8\t\t\t\tRegDepth;\t\t\t// 0: Root Regitrar\n\tUINT8\t\t\t\tAvaSubMaskListCount;// Available Submask List Count for peer. Maximal value is 3\n\tBOOLEAN\t\t\t\tbAssignWscIPv4;\t\t// TRUE: Can be registrar and assign WSC IPv4 to peer, FALSE: Cannot assign WSC IPv4 to peer anymore\n\tBOOLEAN\t\t\t\tbDoNotStop;\n\tUCHAR\t\t\t\tIWscDevQueryReqMacAddr[MAC_ADDR_LEN];\n\tUINT8\t\t\t\tSmpbcEnrolleeCount;\n#ifdef IWSC_TEST_SUPPORT\n\tUINT8\t\t\t\tIWscConfMode;\t\t\t// 1: Enrollee, 2: Registrar\n\tUINT8\t\t\t\tIWscDefaultSecurity;\t// 1: OPEN-NONE, 2: OPEN-WEP, 3: WPA2PSK-AES\n\tBOOLEAN\t\t\t\tbIwscSmpbcScanningOnly;\t\n\tBOOLEAN\t\t\t\tbEmptySubmaskList;\n\tBOOLEAN\t\t\t\tbBlockConnection;\t\t// TRUE: block connection with peers (i.e. Not to do security handshaking with peers)\n#endif // IWSC_TEST_SUPPORT //\n} IWSC_INFO, *PIWSC_INFO;\n#endif // IWSC_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\ntypedef struct GNU_PACKED _WSC_PEER_DEV_INFO {\n\tUCHAR\tWscPeerDeviceName[32];\n\tUCHAR\tWscPeerManufacturer[64];\n\tUCHAR\tWscPeerModelName[32];\n\tUCHAR\tWscPeerModelNumber[32];\n\tUCHAR\tWscPeerSerialNumber[32];\n\tUCHAR\tWscPeerMAC[6];\n} WSC_PEER_DEV_INFO, *PWSC_PEER_DEV_INFO;\n\n#ifdef WSC_V2_SUPPORT\n#define WSC_PIN_ATTACK_CHECK\t600\n#define WSC_V2_VERSION\t\t\t0x20\n#define\t\tTLV_ASCII\t0\n#define\t\tTLV_HEX\t\t1\n\ntypedef\tstruct\t_WSC_TLV {\n\tUSHORT\tTlvTag;\n\tUSHORT\tTlvLen;\n\tPUCHAR\tpTlvData;\n\tUCHAR\tTlvType;\t/* 0: ASCII, 1: Hex */\n} WSC_TLV, *PWSC_TLV;\n\ntypedef\tstruct\t_WSC_V2_INFO {\n\tWSC_TLV\t\t\tExtraTlv;\n\tBOOLEAN\t\t\tbWpsEnable;\t\t/* FALSE: disable WSC , TRUE: enable WSC */\n\tBOOLEAN\t\t\tbEnableWpsV2;\t/* FALSE: not support WSC 2.0, TRUE: support WSC 2.0 */\n#ifdef CONFIG_STA_SUPPORT\n\tBOOLEAN\t\t\tbForceSetAP; /* FALSE: do not change AP's setting when AP is configured, TRUE: force to change AP's setting when AP is configured */\n#endif /* CONFIG_STA_SUPPORT */\n} WSC_V2_INFO, *PWSC_V2_INFO;\n#endif /* WSC_V2_SUPPORT */\n\n/* WSC control block */\ntypedef\tstruct\t_WSC_CTRL\n{\n\tINT             WscConfMode;    /* 0 Wsc not enable; 1 un-configure AP ; 3 un-configure AP with Proxy ; */\n\t                                /* 5 un-configure AP with Registrar ; 7 un-configure AP with proxy and Registrar */\n\tINT             WscMode;        /* 1 PIN ;2 PBC set from UI dynamically */\n\tUCHAR           WscConfStatus;  /* 1 un-configured; 2 configured; need to update to .dat */\n\tUSHORT\t\t\tWscConfigMethods;  /* Registrar support list. The List is bitwise. PBC:0x0080 Lable:0x0004 Display:0x0008 */\n\tINT             WscStatus;      /* for user to monitor the status */\n\tINT             WscState;    \t/* WSC Protocl State: M1 to M8 */\n\tUINT            WscPinCode;     /* record the UI's PIN code input when we are registrar */\n\tUCHAR\t\t\tWscPinCodeLen;\t/* record the UI's PIN code input length when we are registrar */\n\tBOOLEAN         WscEnrollee4digitPinCode;  /* flag to use 4 or 8 digit Device own PIN code. */\n\tUINT            WscEnrolleePinCode; /* recored Device own PIN code. */\n\tUCHAR\t\t\tWscEnrolleePinCodeLen; /* recored Device own PIN code length */\n\tINT             WscSelReg;     /* record the UI's PIN code input when we are registrar */\n\tNDIS_802_11_SSID\t    WscSsid;\t\t        /* select a desired ssid to connect for PIN mode */\n\tUCHAR\t\t\t\t\tWscPBCBssCount;\t\t\t/* Count of PBC activated APs. */\n\tUCHAR\t\t\t\t    WscBssid[MAC_ADDR_LEN];\t/* select a desired bssid to connect */\n#ifdef CONFIG_STA_SUPPORT\n\tBOOLEAN\t\t\t\t    WscEnAssociateIE;\t    /* Add WSC IE on Associate frame. */\n\tBOOLEAN\t\t\t\t    WscEnProbeReqIE;\t    /* Add WSC IE on Probe-Req frame. */\n\tUCHAR\t\t\t\t    WscPeerMAC[MAC_ADDR_LEN];\t/* peer Mac Address */\n#endif /* CONFIG_STA_SUPPORT */\n\tWSC_REG_DATA\tRegData;\t\t/* Registrar pair data */\n\tUCHAR           lastId;\n\tUCHAR           WscUseUPnP;\n\tBOOLEAN         EapMsgRunning;  /* already recived Eap-Rsp(Identity) and sent M1 or Eap-Req(Start) */\n\tUCHAR           WscRetryCount;\n\tUCHAR           EntryIfIdx;\n\tUCHAR           EntryAddr[MAC_ADDR_LEN];\n\tBOOLEAN         Wsc2MinsTimerRunning;\n\tRALINK_TIMER_STRUCT   Wsc2MinsTimer;\n\tWSC_PROFILE\t\t\tWscProfile;\t\t/* Saved WSC profile after M8 */\n#ifdef CONFIG_STA_SUPPORT\n\tWSC_PROFILE\t\t        WscM7Profile;\t/* Saved WSC profile from AP Settings in M7 */\n\tBOOLEAN\t\t\t        bConfiguredAP;\t/* True: AP is in the configured state. FALSE: others */\n#endif /* CONFIG_STA_SUPPORT */\n\tWSC_UPNP_NODE_INFO\tWscUPnPNodeInfo;\t/*Use to save UPnP node related info. */\n\n    BOOLEAN             EapolTimerRunning; \n    BOOLEAN             EapolTimerPending;\n    RALINK_TIMER_STRUCT   EapolTimer;\n\n\tBOOLEAN                 WscPBCTimerRunning;\n    RALINK_TIMER_STRUCT     WscPBCTimer;\n    BOOLEAN                 WscScanTimerRunning;\n    RALINK_TIMER_STRUCT     WscScanTimer;\n\tBOOLEAN                 WscProfileRetryTimerRunning;\n\tRALINK_TIMER_STRUCT\t\tWscProfileRetryTimer;\n#ifdef CONFIG_STA_SUPPORT\n    /* 0x00: disable, 0x01: Auto Connect first credential only, 0x02: Auto Connect and rotate all crentials */\n    UCHAR                 \tWscDriverAutoConnect;\t\t\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef WSC_LED_SUPPORT\n\tULONG\t\t\t\t\tWscLEDMode; /* WPS LED mode: LED_WPS_XXX definitions. */\n\tULONG\t\t\t\t\tWscLastWarningLEDMode; /* LED_WPS_ERROR or LED_WPS_SESSION_OVERLAP_DETECTED */\n\tBOOLEAN \t\t\t\tbSkipWPSTurnOffLED; /* Skip the WPS turn off LED command. */\n\tBOOLEAN \t\t\t\tWscLEDTimerRunning;\n\tRALINK_TIMER_STRUCT \tWscLEDTimer;\n\tBOOLEAN \t\t\t\tWscSkipTurnOffLEDTimerRunning;\n\tRALINK_TIMER_STRUCT \tWscSkipTurnOffLEDTimer;\n\t/* This variable is TRUE after the 120 seconds WPS walk time expiration. */\n\t/* Note that in the case of LED mode 9, the error LED should be turned on only after WPS walk time expiration */\n\t/* if the NIC cannot find any WPS PBC-enabled APs in the last scanning result. */\n\tBOOLEAN \t\t\t\tbWPSWalkTimeExpiration;\n#endif /* WSC_LED_SUPPORT */\n    UCHAR               WpaPsk[64];\n    INT                 WpaPskLen;\n    BOOLEAN             bWscTrigger;        /* TRUE: AP-Enrollee & AP-Registrar work, FALSE: AP-Enrollee & AP-Registrar stop working */\n    PVOID               pAd;\n    UINT                WscLastPinFromEnrollee;\n    BOOLEAN             WscRejectSamePinFromEnrollee;\n#ifdef CONFIG_AP_SUPPORT\n\tNDIS_802_11_SSID\t    WscDefaultSsid;\t\t/* Default WPS SSID after WPS process complete with Enrollee when AP is un-configured Registrar. */\n\tBOOLEAN\t\t\t\t\tbWCNTest;\n#endif /* CONFIG_AP_SUPPORT */\n\tINT\t\t\t\t\tWscKeyASCII; \t\t/*WscKeyASCII (0:Hex, 1:ASCII(random length), others: ASCII length(8~63, default 8)) */\n\tINT\t\t\t\t\tWscActionMode;\n\tUCHAR                   Wsc_Uuid_E[UUID_LEN_HEX];\n\tUCHAR                   Wsc_Uuid_Str[UUID_LEN_STR];\n\n\tUCHAR\t\t\t\tWpsApBand; /* Preferred WPS AP PHY type. Ref: PREFERRED_WPS_AP_PHY_TYPE */\n/*add by woody */\n\tUCHAR Flags;\n\n\tWSC_PEER_DEV_INFO\tWscPeerInfo;\n\tBOOLEAN\t\t\t\tbCheckMultiByte;\n#ifdef WSC_V2_SUPPORT\n\tWSC_V2_INFO\t\t\t\tWscV2Info;\n#endif /* WSC_V2_SUPPORT */\n\tRALINK_TIMER_STRUCT WscUpdatePortCfgTimer;\n\tBOOLEAN \t\t\tWscUpdatePortCfgTimerRunning;\n#ifdef CONFIG_AP_SUPPORT\n\tRALINK_TIMER_STRUCT WscSetupLockTimer;\n\tBOOLEAN \t\t\tWscSetupLockTimerRunning;\n\tRALINK_TIMER_STRUCT WscPinAttackCountCheckTimer;\n\tBOOLEAN \t\t\tWscPinAttackCountCheckTimerRunning;\n\tBOOLEAN\t\t\t\tbSetupLock;\n\tUCHAR\t\t\t\tPinAttackCount;\n\tUCHAR\t\t\t\tMaxPinAttack;\n\tUINT\t\t\t\tSetupLockTime; /* unit: minute */\n#endif /* CONFIG_AP_SUPPORT */\n\tBOOLEAN\t\t\t\tbWscAutoTigeer;\n\tBOOLEAN\t\t\t\tbWscFragment;\n\tPUCHAR\t\t\t\tpWscRxBuf;\n\tINT\t\t\t\t\tWscRxBufLen;\n\tUSHORT\t\t\t\tWscFragSize;\n\tINT\t\t\t\t\tWscTxBufLen;\n\tPUCHAR\t\t\t\tpWscTxBuf;\n\tBOOLEAN\t\t\t\tbWscLastOne;\n\tBOOLEAN\t\t\t\tbWscFirstOne;\n\tPUCHAR\t\t\t\tpWscCurBufIdx;\n\tNDIS_SPIN_LOCK\t\tWscPeerListSemLock;\n\tLIST_HEADER\t\t\tWscPeerList;\n\tRALINK_TIMER_STRUCT M2DTimer;\n\tBOOLEAN\t\t\t\tbM2DTimerRunning;\n\tINT\t\t\t\t\tM2DACKBalance;\n#ifdef IWSC_SUPPORT\n\tNDIS_SPIN_LOCK\t\tWscConfiguredPeerListSemLock;\n\tLIST_HEADER\t\t\tWscConfiguredPeerList;\n#endif /* IWSC_SUPPORT */\n}\tWSC_CTRL, *PWSC_CTRL;\n\ntypedef struct GNU_PACKED _WSC_CONFIGURED_VALUE {\n\tUSHORT WscConfigured; /* 1 un-configured; 2 configured */\n\tUCHAR\tWscSsid[32 + 1];\n\tUSHORT WscAuthMode;\t/* mandatory, 0x01: open, 0x02: wpa-psk, 0x04: shared, 0x08:wpa, 0x10: wpa2, 0x20: wpa2-psk */\n\tUSHORT\tWscEncrypType;\t/* 0x01: none, 0x02: wep, 0x04: tkip, 0x08: aes */\n\tUCHAR\tDefaultKeyIdx;\n\tUCHAR\tWscWPAKey[64 + 1];\n} WSC_CONFIGURED_VALUE;\n\n/* \n\tFollowing definitions are used for UPnP module to communicate msg.\n*/\n\n/* Ralink specific message header for Linux specific NETLINK socket. */\n#define RTMP_WSC_NLMSG_HDR_LEN\t\t30\t\t/*signature(8) + envID(4) + ackID(4) + msgLen(4) + Flag(2) + segLen(2) + devAddr(6) */\ntypedef struct GNU_PACKED _RTMP_WSC_NLMSG_HDR{\n\tUCHAR\tsignature[8];\t/* Signature used to identify that this's a Ralink specific NETLINK message. \n\t\t\t\t\t\t\t\tMUST be \"RAWSCMSG\" currently.\n\t\t\t\t\t\t\t*/\n\tUINT\tenvID;\t\t\t/* Unique event Identification assigned by sender. */\n\tUINT\tackID;\t\t\t/* Notify that this message is a repsone for the message whose event identifier is \"ackID\". */\n\tUINT\tmsgLen;\t\t\t/* Totally length for this message. This message may seperate in serveral packets. */\n\tUSHORT\tflags;\t\t\t\n\tUSHORT\tsegLen;\t\t\t/* The \"segLen\" means the actual data length in this one msg packet.\n\t\t\t\t\t\t\t\tBecause the NETLINK socket just support 256bytes for \"IWCUSTOM\" typed message, so we may \n\t\t\t\t\t\t\t\tneed to do fragement for our msg. If one message was fragemented as serveral pieces, the \n\t\t\t\t\t\t\t\tuser space receiver need to re-assemble it.\n\t\t\t\t\t\t\t */\n\tUCHAR\tdevAddr[MAC_ADDR_LEN];\t\t/* MAC address of the net device which send this netlink msg. */\n}RTMP_WSC_NLMSG_HDR;\n\n\n/* \n\tRalink specific WSC Mesage Header definition. \n*/\n#define RTMP_WSC_MSG_HDR_LEN\t\t12\t/*msgType(2) + msgSubType(2) + ipAddr(4) + len(4) */\ntypedef struct GNU_PACKED _RTMP_WSC_MSG_HDR{\n\tUSHORT\tmsgType;\n\tUSHORT\tmsgSubType;\n\tUINT   ipAddr;\n\tUINT   msgLen;\t\t/*Not include this header. */\n}RTMP_WSC_MSG_HDR;\n\n#define WSC_MSG_TYPE_ENROLLEE    0x1\n#define WSC_MSG_TYPE_PROXY\t 0x2\n#define WSC_MSG_TYPE_REGISTRAR   0x3\n#define WSC_MSG_TYPE_CTRL\t 0x4\n#define WSC_MSG_TYPE_MGMT\t 0x5\n\nPSTRING   WscGetAuthTypeStr(\n    IN  USHORT authFlag);\n\nPSTRING   WscGetEncryTypeStr(\n    IN  USHORT encryFlag);\n\n#define IWEVCUSTOM_MSG_MAX_LEN  255 /*refer to kernel definition. <linux/wireless.h> */\n#define IWEVCUSTOM_PAYLOD_MAX_LEN  (IWEVCUSTOM_MSG_MAX_LEN - RTMP_WSC_NLMSG_HDR_LEN)\n\n\n#define WSC_U2KMSG_HDR_LEN\t41\ntypedef\tstruct GNU_PACKED _RTMP_WSC_U2KMSG_HDR{\n\tUINT\t\t\tenvID;\t\t\t\t\t/*Event ID. */\n\tUCHAR\t\t\tAddr1[MAC_ADDR_LEN];\t/*RA, should be the MAC address of the AP. */\n\tUCHAR\t\t\tAddr2[MAC_ADDR_LEN];\t/*TA, should be the ipAddress of remote UPnP Device/CotrnolPoint. */\n\tUCHAR\t\t\tAddr3[MAC_ADDR_LEN];\t/*DA, Not used now. */\n\tUCHAR\t\t\trsvWLHdr[2];\t\t\t/*Reserved space for remained 802.11 hdr content. */\n\tUCHAR\t\t\trsv1HHdr[LENGTH_802_1_H];/*Reserved space for 802.1h header */\n\tIEEE8021X_FRAME\tIEEE8021XHdr;\t\t\t/*802.1X header */\n\tEAP_FRAME\t\tEAPHdr;\t\t\t\t\t/*EAP frame header. */\n}RTMP_WSC_U2KMSG_HDR;\n/*--- Used for UPnP module to communicate msg. */\n\n/* define OpMode for WscSendMessage */\n#undef     AP_MODE         \n#undef     AP_CLIENT_MODE  \n#undef     STA_MODE        \n\n#define     AP_MODE         \t0x00\n#define     AP_CLIENT_MODE  \t0x01\n#define     STA_MODE        \t0x02\n#define\t\tREGISTRAR_ACTION\t0x40\n#define \tENROLLEE_ACTION\t\t0x80\n\n/* Definition for Config Methods */\n#define\t\tWPS_CONFIG_METHODS_USBA\t\t\t0x0001\n#define\t\tWPS_CONFIG_METHODS_ETHERNET\t\t0x0002\n#define\t\tWPS_CONFIG_METHODS_LABEL\t\t0x0004\n#define\t\tWPS_CONFIG_METHODS_DISPLAY\t\t0x0008\n#define\t\tWPS_CONFIG_METHODS_ENT\t\t\t0x0010 /* External NFC Token */\n#define\t\tWPS_CONFIG_METHODS_INT\t\t\t0x0020 /* Integrated NFC Token */\n#define\t\tWPS_CONFIG_METHODS_NFCI\t\t\t0x0040 /* NFC Interface */\n#define\t\tWPS_CONFIG_METHODS_PBC\t\t\t0x0080\n#define\t\tWPS_CONFIG_METHODS_KEYPAD\t\t0x0100\n\ntypedef struct _UUID_BSSID_CH_INFO {\n\tUCHAR\tUuid[16];\n\tUCHAR\tBssid[MAC_ADDR_LEN];\n\tUCHAR\tChannel;\n\tUCHAR\tBand;\n\tUCHAR\tSsid[MAX_LEN_OF_SSID];\n\tUCHAR\tSsidLen;\n\tUCHAR   MacAddr[MAC_ADDR_LEN];\n#ifdef IWSC_SUPPORT\n\tUINT8\tRspType;\n#endif /* IWSC_SUPPORT */\n} UUID_BSSID_CH_INFO, *PUUID_BSSID_CH_INFO;\n\n/*\n\t Preferred WPS AP type.\n\n\t a) PREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST\n\t     Select 2.4G WPS AP first. Otherwise select 5G WPS AP.\n\t b) PREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST\n\t     Select the 5G WPS AP first. Otherwise select the 2.4G WPS AP.\n\t c) PREFERRED_WPS_AP_PHY_TYPE_AUTO_SELECTION\n\t     Automactically select WPS AP.\n*/\ntypedef enum _PREFERRED_WPS_AP_PHY_TYPE\n{\n\tPREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST = 0, \n\tPREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST, \n\tPREFERRED_WPS_AP_PHY_TYPE_AUTO_SELECTION, \n\tPREFERRED_WPS_AP_PHY_TYPE_MAXIMUM, \n} PREFERRED_WPS_AP_PHY_TYPE;\n\ntypedef enum _WscSecurityMode{\n\tWPA2PSKAES,\n\tWPA2PSKTKIP,\n\tWPAPSKAES,\n\tWPAPSKTKIP,\n}WSC_SECURITY_MODE;\n\ntypedef struct _WSC_PEER_ENTRY {\n\tstruct _WSC_PEER_ENTRY *pNext;\n\tULONG\treceive_time;\n\tUCHAR\tmac_addr[MAC_ADDR_LEN];\n#ifdef IWSC_SUPPORT\n\tBOOLEAN bIWscSmpbcAccept;\n#endif /* IWSC_SUPPORT */\n} WSC_PEER_ENTRY, *PWSC_PEER_ENTRY;\n\n\n#endif /* WSC_INCLUDED */\n\n#endif\t/* __WSC_H__ */\n\n"
  },
  {
    "path": "src/include/wsc_tlv.h",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twsc_tlv.h\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n\tJuemingChen 06-09-11\t\tInitial\n*/\n\n#ifndef\t__WSC_TLV_H__\n#define\t__WSC_TLV_H__\n\n/* Data Element Definitions */\n#define WSC_ID_AP_CHANNEL          0x1001\n#define WSC_ID_ASSOC_STATE         0x1002\n#define WSC_ID_AUTH_TYPE           0x1003\n#define WSC_ID_AUTH_TYPE_FLAGS     0x1004\n#define WSC_ID_AUTHENTICATOR       0x1005\n#define WSC_ID_CONFIG_METHODS      0x1008\n#define WSC_ID_CONFIG_ERROR        0x1009\n#define WSC_ID_CONF_URL4           0x100A\n#define WSC_ID_CONF_URL6           0x100B\n#define WSC_ID_CONN_TYPE           0x100C\n#define WSC_ID_CONN_TYPE_FLAGS     0x100D\n#define WSC_ID_CREDENTIAL          0x100E\n#define WSC_ID_ENCR_TYPE           0x100F\n#define WSC_ID_ENCR_TYPE_FLAGS     0x1010\n#define WSC_ID_DEVICE_NAME         0x1011\n#define WSC_ID_DEVICE_PWD_ID       0x1012\n#define WSC_ID_E_HASH1             0x1014\n#define WSC_ID_E_HASH2             0x1015\n#define WSC_ID_E_SNONCE1           0x1016\n#define WSC_ID_E_SNONCE2           0x1017\n#define WSC_ID_ENCR_SETTINGS       0x1018\n#define WSC_ID_ENROLLEE_NONCE      0x101A\n#define WSC_ID_FEATURE_ID          0x101B\n#define WSC_ID_IDENTITY            0x101C\n#define WSC_ID_IDENTITY_PROOF      0x101D\n#define WSC_ID_KEY_WRAP_AUTH       0x101E\n#define WSC_ID_KEY_IDENTIFIER      0x101F\n#define WSC_ID_MAC_ADDR            0x1020\n#define WSC_ID_MANUFACTURER        0x1021\n#define WSC_ID_MSG_TYPE            0x1022\n#define WSC_ID_MODEL_NAME          0x1023\n#define WSC_ID_MODEL_NUMBER        0x1024\n#define WSC_ID_NW_INDEX            0x1026\n#define WSC_ID_NW_KEY              0x1027\n#define WSC_ID_NW_KEY_INDEX        0x1028\n#define WSC_ID_NEW_DEVICE_NAME     0x1029\n#define WSC_ID_NEW_PWD             0x102A       \n#define WSC_ID_OOB_DEV_PWD         0x102C\n#define WSC_ID_OS_VERSION          0x102D\n#define WSC_ID_POWER_LEVEL         0x102F\n#define WSC_ID_PSK_CURRENT         0x1030\n#define WSC_ID_PSK_MAX             0x1031\n#define WSC_ID_PUBLIC_KEY          0x1032\n#define WSC_ID_RADIO_ENABLED       0x1033\n#define WSC_ID_REBOOT              0x1034\n#define WSC_ID_REGISTRAR_CURRENT   0x1035\n#define WSC_ID_REGISTRAR_ESTBLSHD  0x1036\n#define WSC_ID_REGISTRAR_LIST      0x1037\n#define WSC_ID_REGISTRAR_MAX       0x1038\n#define WSC_ID_REGISTRAR_NONCE     0x1039\n#define WSC_ID_REQ_TYPE            0x103A\n#define WSC_ID_RESP_TYPE           0x103B\n#define WSC_ID_RF_BAND             0x103C\n#define WSC_ID_R_HASH1             0x103D\n#define WSC_ID_R_HASH2             0x103E\n#define WSC_ID_R_SNONCE1           0x103F\n#define WSC_ID_R_SNONCE2           0x1040\n#define WSC_ID_SEL_REGISTRAR       0x1041\n#define WSC_ID_SERIAL_NUM          0x1042\n#define WSC_ID_SC_STATE            0x1044\n#define WSC_ID_SSID                0x1045\n#define WSC_ID_TOT_NETWORKS        0x1046\n#define WSC_ID_UUID_E              0x1047\n#define WSC_ID_UUID_R              0x1048\n#define WSC_ID_VENDOR_EXT          0x1049\n#define WSC_ID_VERSION             0x104A\n#define WSC_ID_X509_CERT_REQ       0x104B\n#define WSC_ID_X509_CERT           0x104C\n#define WSC_ID_EAP_IDENTITY        0x104D\n#define WSC_ID_MSG_COUNTER         0x104E\n#define WSC_ID_PUBKEY_HASH         0x104F\n#define WSC_ID_REKEY_KEY           0x1050\n#define WSC_ID_KEY_LIFETIME        0x1051\n#define WSC_ID_PERM_CFG_METHODS    0x1052\n#define WSC_ID_SEL_REG_CFG_METHODS 0x1053\n#define WSC_ID_PRIM_DEV_TYPE       0x1054\n#define WSC_ID_SEC_DEV_TYPE_LIST   0x1055\n#define WSC_ID_PORTABLE_DEVICE     0x1056\n#define WSC_ID_AP_SETUP_LOCKED     0x1057\n#define WSC_ID_APP_LIST            0x1058\n#define WSC_ID_EAP_TYPE            0x1059\n#define WSC_ID_INIT_VECTOR         0x1060\n#define WSC_ID_KEY_PROVIDED_AUTO   0x1061\n#define WSC_ID_8021X_ENABLED       0x1062\n#define WSC_ID_APPSESSIONKEY       0x1063\n#define WSC_ID_WEPTRANSMITKEY      0x1064\n#ifdef IWSC_SUPPORT\n#define WSC_ID_ENTRY_ACCEPTABLE    0x106D\n#define WSC_ID_REGISTRATON_READY   0x106E\n#define WSC_ID_REGISTRAR_IPV4      0x106F\n#define WSC_ID_IPV4_SUBMASK        0x1070\n#define WSC_ID_ENROLLEE_IPV4       0x1071\n#define WSC_ID_IPV4_SUBMASK_LIST   0x1072\n#define WSC_ID_IP_ADDR_CONF_METHOD 0x1073\n#endif /* IWSC_SUPPORT */\n\n/* WFA Vendor Extension Subelements */\n#define WFA_EXT_ID_VERSION2\t\t\t\t0x00\n#define WFA_EXT_ID_AUTHORIZEDMACS\t\t0x01\n#define WFA_EXT_ID_NW_KEY_SHAREABLE\t\t0x02\n#define WFA_EXT_ID_REQ_TO_ENROLL\t\t0x03\n#define WFA_EXT_ID_SETTINGS_DELAY_TIME\t0x04\n\n/* Association states */\n#define WSC_ASSOC_NOT_ASSOCIATED  0\n#define WSC_ASSOC_CONN_SUCCESS    1\n#define WSC_ASSOC_CONFIG_FAIL     2\n#define WSC_ASSOC_ASSOC_FAIL      3\n#define WSC_ASSOC_IP_FAIL         4\n\n/* Authentication types */\n#define WSC_AUTHTYPE_OPEN        0x0001\n#define WSC_AUTHTYPE_WPAPSK      0x0002\n#define WSC_AUTHTYPE_SHARED      0x0004\n#define WSC_AUTHTYPE_WPA         0x0008\n#define WSC_AUTHTYPE_WPA2        0x0010\n#define WSC_AUTHTYPE_WPA2PSK     0x0020\n#define WSC_AUTHTYPE_WPANONE     0x0080\n\n/* Config methods */\n#define WSC_CONFMET_USBA            0x0001\n#define WSC_CONFMET_ETHERNET        0x0002\n#define WSC_CONFMET_LABEL           0x0004\n#define WSC_CONFMET_DISPLAY         0x0008\n#define WSC_CONFMET_EXT_NFC_TOK     0x0010\n#define WSC_CONFMET_INT_NFC_TOK     0x0020\n#define WSC_CONFMET_NFC_INTF        0x0040\n#define WSC_CONFMET_PBC             0x0080\n#define WSC_CONFMET_KEYPAD          0x0100\n\n/* WSC error messages */\n#define WSC_ERROR_NO_ERROR                0\n#define WSC_ERROR_OOB_INT_READ_ERR        1\n#define WSC_ERROR_DECRYPT_CRC_FAIL        2\n#define WSC_ERROR_CHAN24_NOT_SUPP         3\n#define WSC_ERROR_CHAN50_NOT_SUPP         4\n#define WSC_ERROR_SIGNAL_WEAK             5\n#define WSC_ERROR_NW_AUTH_FAIL            6\n#define WSC_ERROR_NW_ASSOC_FAIL           7\n#define WSC_ERROR_NO_DHCP_RESP            8\n#define WSC_ERROR_FAILED_DHCP_CONF        9\n#define WSC_ERROR_IP_ADDR_CONFLICT        10\n#define WSC_ERROR_FAIL_CONN_REGISTRAR     11\n#define WSC_ERROR_MULTI_PBC_DETECTED      12\n#define WSC_ERROR_ROGUE_SUSPECTED         13\n#define WSC_ERROR_DEVICE_BUSY             14\n#define WSC_ERROR_SETUP_LOCKED            15\n#define WSC_ERROR_MSG_TIMEOUT             16\n#define WSC_ERROR_REG_SESSION_TIMEOUT     17\n#define WSC_ERROR_DEV_PWD_AUTH_FAIL       18\n#define WSC_ERROR_DO_MULTI_PBC_DETECTION  251\n#define WSC_ERROR_CAN_NOT_ALLOCMEM        252\n#define WSC_ERROR_WANTING_FIELD           253\n#define WSC_ERROR_HASH_FAIL               254\n#define WSC_ERROR_HMAC_FAIL               255\n\n/* Connection types */\n#define WSC_CONNTYPE_ESS    0x01\n#define WSC_CONNTYPE_IBSS   0x02\n\n/* Device password ID */\n#define WSC_DEVICEPWDID_DEFAULT          0x0000\n#define WSC_DEVICEPWDID_USER_SPEC        0x0001\n#define WSC_DEVICEPWDID_MACHINE_SPEC     0x0002\n#define WSC_DEVICEPWDID_REKEY            0x0003\n#define WSC_DEVICEPWDID_PUSH_BTN         0x0004\n#define WSC_DEVICEPWDID_REG_SPEC         0x0005\n\n/* Device type */\n#define WSC_DEVICETYPE_COMPUTER            \"Computer\"\n#define WSC_DEVICETYPE_AP                  \"Access_Point\"\n#define WSC_DEVICETYPE_ROUTER_AP           \"Router_AP\"\n#define WSC_DEVICETYPE_PRINTER             \"Printer\"\n#define WSC_DEVICETYPE_PRINTER_BRIDGE      \"Printer_Brigde\"\n#define WSC_DEVICETYPE_ELECT_PIC_FRAME     \"Electronic_Picture_Frame\"\n#define WSC_DEVICETYPE_DIG_AUDIO_RECV      \"Digital_Audio_Receiver\"\n#define WSC_DEVICETYPE_WIN_MCE             \"Windows_Media_Center_Extender\"\n#define WSC_DEVICETYPE_WIN_MOBILE          \"Windows_Mobile\"\n#define WSC_DEVICETYPE_PVR                 \"Personal_Video_Recorder\"\n#define WSC_DEVICETYPE_VIDEO_STB           \"Video_STB\"\n#define WSC_DEVICETYPE_PROJECTOR           \"Projector\"\n#define WSC_DEVICETYPE_IP_TV               \"IP_TV\"\n#define WSC_DEVICETYPE_DIG_STILL_CAM       \"Digital_Still_Camera\"\n#define WSC_DEVICETYPE_PHONE               \"Phone\"\n#define WSC_DEVICETYPE_VOID_PHONE          \"VoIP_Phone\"\n#define WSC_DEVICETYPE_GAME_CONSOLE        \"Game_console\"\n#define WSC_DEVICETYPE_OTHER               \"Other\"\n\n/* Encryption type */\n#define WSC_ENCRTYPE_NONE    0x0001\n#define WSC_ENCRTYPE_WEP     0x0002\n#define WSC_ENCRTYPE_TKIP    0x0004\n#define WSC_ENCRTYPE_AES     0x0008\n\n/* WSC Message Types */\n#define WSC_ID_BEACON            0x01\n#define WSC_ID_PROBE_REQ         0x02\n#define WSC_ID_PROBE_RESP        0x03\n#define WSC_ID_MESSAGE_M1        0x04\n#define WSC_ID_MESSAGE_M2        0x05\n#define WSC_ID_MESSAGE_M2D       0x06\n#define WSC_ID_MESSAGE_M3        0x07\n#define WSC_ID_MESSAGE_M4        0x08\n#define WSC_ID_MESSAGE_M5        0x09\n#define WSC_ID_MESSAGE_M6        0x0A\n#define WSC_ID_MESSAGE_M7        0x0B\n#define WSC_ID_MESSAGE_M8        0x0C\n#define WSC_ID_MESSAGE_ACK       0x0D\n#define WSC_ID_MESSAGE_NACK      0x0E\n#define WSC_ID_MESSAGE_DONE      0x0F\n#define\tWSC_ID_MESSAGE_EAP_REQ_ID\t\t0x21\t\n#define\tWSC_ID_MESSAGE_EAP_REQ_START\t0x22\t\n#define\tWSC_ID_MESSAGE_EAP_FAIL\t\t\t0x23\t\n#define\tWSC_ID_MESSAGE_UNKNOWN\t\t\t0xFF\n\n/* Device Type categories for primary and secondary device types */\n#define WSC_DEVICE_TYPE_CAT_COMPUTER        1\n#define WSC_DEVICE_TYPE_CAT_INPUT_DEVICE    2\n#define WSC_DEVICE_TYPE_CAT_PRINTER         3\n#define WSC_DEVICE_TYPE_CAT_CAMERA          4\n#define WSC_DEVICE_TYPE_CAT_STORAGE         5\n#define WSC_DEVICE_TYPE_CAT_NW_INFRA        6\n#define WSC_DEVICE_TYPE_CAT_DISPLAYS        7\n#define WSC_DEVICE_TYPE_CAT_MM_DEVICES      8\n#define WSC_DEVICE_TYPE_CAT_GAME_DEVICES    9\n#define WSC_DEVICE_TYPE_CAT_TELEPHONE       10\n\n/* Device Type sub categories for primary and secondary device types */\n#define WSC_DEVICE_TYPE_SUB_CAT_COMP_PC         1\n#define WSC_DEVICE_TYPE_SUB_CAT_COMP_SERVER     2\n#define WSC_DEVICE_TYPE_SUB_CAT_COMP_MEDIA_CTR  3\n#define WSC_DEVICE_TYPE_SUB_CAT_PRTR_PRINTER    1\n#define WSC_DEVICE_TYPE_SUB_CAT_PRTR_SCANNER    2\n#define WSC_DEVICE_TYPE_SUB_CAT_CAM_DGTL_STILL  1\n#define WSC_DEVICE_TYPE_SUB_CAT_STOR_NAS        1\n#define WSC_DEVICE_TYPE_SUB_CAT_NW_AP           1\n#define WSC_DEVICE_TYPE_SUB_CAT_NW_ROUTER       2\n#define WSC_DEVICE_TYPE_SUB_CAT_NW_SWITCH       3\n#define WSC_DEVICE_TYPE_SUB_CAT_DISP_TV         1\n#define WSC_DEVICE_TYPE_SUB_CAT_DISP_PIC_FRAME  2\n#define WSC_DEVICE_TYPE_SUB_CAT_DISP_PROJECTOR  3\n#define WSC_DEVICE_TYPE_SUB_CAT_MM_DAR          1\n#define WSC_DEVICE_TYPE_SUB_CAT_MM_PVR          2\n#define WSC_DEVICE_TYPE_SUB_CAT_MM_MCX          3\n#define WSC_DEVICE_TYPE_SUB_CAT_GAM_XBOX        1\n#define WSC_DEVICE_TYPE_SUB_CAT_GAM_XBOX_360    2\n#define WSC_DEVICE_TYPE_SUB_CAT_GAM_PS          3\n#define WSC_DEVICE_TYPE_SUB_CAT_PHONE_WM        1\n\ntypedef\tstruct _WSC_TLV_0B {\n\t/*USHORT\ttag;*/\n\tUSHORT\tlen;\n} WSC_TLV_0B, *PWSC_TLV_0B;\n\n#endif\t/* __WSC_TLV_H__ */\n\n"
  },
  {
    "path": "src/mac/ral_nmac.c",
    "content": "/*\n\n*/\n\n\n#include \"rt_config.h\"\n\n\nINT get_pkt_phymode_by_rxwi(RXWI_STRUC *rxwi)\n{\n\treturn rxwi->RXWI_N.phy_mode;\n}\n\nINT get_pkt_rssi_by_rxwi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *rxwi, INT size, CHAR *rssi)\n{\n\tif (size < sizeof(rxwi->RXWI_N.rssi)/ sizeof(UINT8))\n\t\tNdisMoveMemory(rssi, &rxwi->RXWI_N.rssi[0], size);\n\n\treturn 0;\n}\n\n\nINT get_pkt_snr_by_rxwi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *rxwi, INT size, UCHAR *snr)\n{\n\t// TODO: shiang-6590, fix me for SNR info of RXWI!!\n\tif (size < 3)\n\t\tNdisMoveMemory(snr, &rxwi->RXWI_N.bbp_rxinfo[0], size);\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/mac/ral_omac.c",
    "content": "/*\n\n*/\n\n\n#include \"rt_config.h\"\n\n\nINT get_pkt_phymode_by_rxwi(RXWI_STRUC *rxwi)\n{\n\treturn rxwi->RXWI_O.phy_mode;\n}\n\nINT get_pkt_rssi_by_rxwi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *rxwi, INT size, CHAR *rssi)\n{\n\tswitch (size) {\n\t\tcase 3:\n\t\t\trssi[2] = rxwi->RxWIRSSI2;\n\t\tcase 2:\n\t\t\trssi[1] = rxwi->RxWIRSSI1;\n\t\tcase 1:\n\t\tdefault:\n#ifdef MT7601\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\trssi[0] = rxwi->RxWISNR2;\n\t\t\telse\n#endif /* MT7601 */\n\t\t\t\trssi[0] = rxwi->RxWIRSSI0;\n\t\t\tbreak;\n\t}\n\n\treturn 0;\n}\n\n\nINT get_pkt_snr_by_rxwi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *rxwi, INT size, UCHAR *snr)\n{\n\n#ifdef MT7601\n\t/*\n\t\tsnr[2] = Gain Report \n\t\tsnr[1] = Antenna report\n\t*/\n\t\t\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tsnr[0] = rxwi->RxWISNR0;\n\t\tsnr[1] = 0;\n\t\tsnr[2] = 0;\n\t\treturn 0;\n\t}\n#endif /* MT7601 */\n\n\tswitch (size) {\n\t\tcase 3:\n\t\t\tsnr[2] = rxwi->RxWISNR2;\n\t\tcase 2:\n\t\t\tsnr[1] = rxwi->RxWISNR1;\n\t\tcase 1:\n\t\tdefault:\n\t\t\tsnr[0] = rxwi->RxWISNR0;\n\t\t\tbreak;\n\t}\n\t\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/mac/rtmp_mac.c",
    "content": "/*\n\n*/\n\n\n#include \"rt_config.h\"\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tCalculates the duration which is required to transmit out frames\n\twith given size and specified rate.\n\t\t\t\t\t  \n\tArguments:\n\t\tpTxWI\t\tPointer to head of each MPDU to HW.\n\t\tAck \t\tSetting for Ack requirement bit\n\t\tFragment\tSetting for Fragment bit\n\t\tRetryMode\tSetting for retry mode\n\t\tIfs \t\tSetting for IFS gap\n\t\tRate\t\tSetting for transmit rate\n\t\tService \tSetting for service\n\t\tLength\t\tFrame length\n\t\tTxPreamble\tShort or Long preamble when using CCK rates\n\t\tQueIdx - 0-3, according to 802.11e/d4.4 June/2003\n\t\t\n\tReturn Value:\n\t\tNone\n\t\n\tSee also : BASmartHardTransmit()    !!!\n\t\n\t========================================================================\n*/\nVOID RTMPWriteTxWI(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TXWI_STRUC *pOutTxWI,\n\tIN BOOLEAN FRAG,\n\tIN BOOLEAN CFACK,\n\tIN BOOLEAN InsTimestamp,\n\tIN BOOLEAN AMPDU,\n\tIN BOOLEAN Ack,\n\tIN BOOLEAN NSeq,\t\t/* HW new a sequence.*/\n\tIN UCHAR BASize,\n\tIN UCHAR WCID,\n\tIN ULONG Length,\n\tIN UCHAR PID,\n\tIN UCHAR TID,\n\tIN UCHAR TxRate,\n\tIN UCHAR Txopmode,\n\tIN BOOLEAN CfAck,\n\tIN HTTRANSMIT_SETTING *pTransmit)\n{\n\tPMAC_TABLE_ENTRY pMac = NULL;\n\tTXWI_STRUC TxWI, *pTxWI;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tif (WCID < MAX_LEN_OF_MAC_TABLE)\n\t\tpMac = &pAd->MacTab.Content[WCID];\n\n\t\n\t/* \n\t\tAlways use Long preamble before verifiation short preamble functionality works well.\n\t\tTodo: remove the following line if short preamble functionality works\n\t*/\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);\n\tNdisZeroMemory(&TxWI, TXWISize);\n\tpTxWI = &TxWI;\n\tpTxWI->TxWIFRAG= FRAG;\n\tpTxWI->TxWICFACK = CFACK;\n\tpTxWI->TxWITS= InsTimestamp;\n\tpTxWI->TxWIAMPDU = AMPDU;\n\tpTxWI->TxWIACK = Ack;\n\tpTxWI->TxWITXOP= Txopmode;\n\t\n\tpTxWI->TxWINSEQ = NSeq;\n\t/* John tune the performace with Intel Client in 20 MHz performance*/\n#ifdef DOT11_N_SUPPORT\n\tBASize = pAd->CommonCfg.TxBASize;\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd))\n\t{\n\t\tif (BASize > 31)\n\t\t\tBASize =31;\n\t}\n\telse\n#endif /* RT65xx */\n\tif (pAd->MACVersion == 0x28720200)\n\t{\n\t\tif (BASize > 13)\n\t\t\tBASize =13;\n\t}\n\telse\n\t{\n\t\tif( BASize >7 )\n\t\t\tBASize =7;\n\t}\n\n\tpTxWI->TxWIBAWinSize = BASize;\n\tpTxWI->TxWIShortGI = pTransmit->field.ShortGI;\n\tpTxWI->TxWISTBC = pTransmit->field.STBC;\n\n#ifdef TXBF_SUPPORT\n\tif (pMac && pAd->chipCap.FlgHwTxBfCap)\n\t{\n\t\tif (pMac->TxSndgType == SNDG_TYPE_NDP  || pMac->TxSndgType == SNDG_TYPE_SOUNDING || pTxWI->eTxBF)\n\t\t\tpTxWI->TxWISTBC = 0;\n\t}\n#endif /* TXBF_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\t\t\n\tpTxWI->TxWIWirelessCliID = WCID;\n\tpTxWI->TxWIMPDUByteCnt = Length;\n#ifdef RLT_MAC\n\tpTxWI->TxWIPacketId = PID;\n#endif /* RLT_MAC */\n\t\n\t/* If CCK or OFDM, BW must be 20*/\n\tpTxWI->TxWIBW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif (pTxWI->TxWIBW)\n\t\tpTxWI->TxWIBW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\n\tpTxWI->TxWIMCS = pTransmit->field.MCS;\n\tpTxWI->TxWIPHYMODE = pTransmit->field.MODE;\n\tpTxWI->TxWICFACK = CfAck;\n\n#ifdef DOT11_N_SUPPORT\n\tif (pMac)\n\t{\n        if (pAd->CommonCfg.bMIMOPSEnable)\n        {\n    \t\tif ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))\n\t\t\t{\n\t\t\t\t/* Dynamic MIMO Power Save Mode*/\n\t\t\t\tpTxWI->TxWIMIMOps = 1;\n\t\t\t}\n\t\t\telse if (pMac->MmpsMode == MMPS_STATIC)\n\t\t\t{\n\t\t\t\t/* Static MIMO Power Save Mode*/\n\t\t\t\tif (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)\n\t\t\t\t{\n\t\t\t\t\tpTxWI->TxWIMCS = 7;\n\t\t\t\t\tpTxWI->TxWIMIMOps = 0;\n\t\t\t\t}\n\t\t\t}\n        }\n\t\t/*pTxWI->TxWIMIMOps = (pMac->PsMode == PWR_MMPS)? 1:0;*/\n\t\t{\n\t\t\tpTxWI->TxWIMpduDensity = pMac->MpduDensity;\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\n#ifdef RLT_MAC\n\tpTxWI->TxWIPacketId = pTxWI->TxWIMCS;\n#endif /* RLT_MAC */\n\tNdisMoveMemory(pOutTxWI, &TxWI, TXWISize);\n//+++Add by shiang for debug\nif (0){\n\thex_dump(\"TxWI\", (UCHAR *)pOutTxWI, TXWISize);\n}\n//---Add by shiang for debug\n}\n\n\nVOID RTMPWriteTxWI_Data(RTMP_ADAPTER *pAd, TXWI_STRUC *pTxWI, TX_BLK *pTxBlk)\n{\n\tHTTRANSMIT_SETTING *pTransmit;\n\tMAC_TABLE_ENTRY *pMacEntry;\n#ifdef DOT11_N_SUPPORT\n\tUCHAR BASize;\n#endif /* DOT11_N_SUPPORT */\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n#ifdef WFA_VHT_PF\n\tBOOLEAN amsdu_in_ampdu = FALSE;\n#endif /* WFA_VHT_PF */\n\n\tASSERT(pTxWI);\n\n\tpTransmit = pTxBlk->pTransmit;\n\tpMacEntry = pTxBlk->pMacEntry;\n\n\t/*\n\t\tAlways use Long preamble before verifiation short preamble functionality works well.\n\t\tTodo: remove the following line if short preamble functionality works\n\t*/\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);\n\tNdisZeroMemory(pTxWI, TXWISize);\n\t\n\tpTxWI->TxWIFRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag);\n\tpTxWI->TxWIACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired);\n\tpTxWI->TxWITXOP = pTxBlk->FrameGap;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\n\tif (pMacEntry && IS_ENTRY_DLS(pMacEntry) &&\n\t\t(pAd->StaCfg.BssType == BSS_INFRA))\n\t\tpTxWI->TxWIWirelessCliID = BSSID_WCID;\n\telse\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\tpTxWI->TxWIWirelessCliID = pTxBlk->Wcid;\n\n#ifdef HDR_TRANS_SUPPORT\n\tif (pTxBlk->NeedTrans )\n\t\tpTxWI->TxWIMPDUByteCnt = pTxBlk->SrcBufLen;\n\telse\n#endif /* HDR_TRANS_SUPPORT */\n\tpTxWI->TxWIMPDUByteCnt = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;\n\tpTxWI->TxWICFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack);\n\n\t/* If CCK or OFDM, BW must be 20 */\n\tpTxWI->TxWIBW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif (pTxWI->TxWIBW)\n\t\tpTxWI->TxWIBW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);\n#endif /* DOT11N_DRAFT3 */\n\n#ifdef WFA_VHT_PF\n\tif ((pAd->force_amsdu == TRUE) && (pTxBlk->TxFrameType == TX_AMSDU_FRAME) && \n\t\t(pTxWI->TxWIWirelessCliID != MCAST_WCID) && pMacEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s():f_amsdu=%d, pTxBlk->TxFrameType=%d, pMacEntry->TXBAbitmap=0x%x, pTxBlk->UserPriority=%d, cond_match=%d!\\n\", \n\t\t\t\t\t__FUNCTION__, pAd->force_amsdu, pTxBlk->TxFrameType, pMacEntry->TXBAbitmap, \n\t\t\t\t\tpTxBlk->UserPriority, ((pMacEntry->TXBAbitmap & (1<<pTxBlk->UserPriority)) != 0) ? TRUE : FALSE));\n\n\n\t\tif ((pAd->force_amsdu == TRUE) && (pTxBlk->TxFrameType == TX_AMSDU_FRAME)\n\t\t\t&& (pMacEntry && ((pMacEntry->TXBAbitmap & (1<<pTxBlk->UserPriority)) != 0)))\n\t\t\tamsdu_in_ampdu = TRUE;\n\t}\n#endif /* WFA_VHT_PF */\n\n#ifdef WFA_VHT_PF\n\tif (amsdu_in_ampdu)\n\t\tpTxWI->TxWIAMPDU = TRUE;\n\telse\n#endif /* WFA_VHT_PF */\n\tpTxWI->TxWIAMPDU = ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE);\n\n#ifdef TXBF_SUPPORT\n\tif(pTxBlk->TxSndgPkt > SNDG_TYPE_DISABLE)\n\t\tpTxWI->TxWIAMPDU = FALSE;\n#endif /* TXBF_SUPPORT */\n\n\tBASize = pAd->CommonCfg.TxBASize;\n\tif((pTxBlk->TxFrameType == TX_AMPDU_FRAME\n#ifdef WFA_VHT_PF\n\t\t|| amsdu_in_ampdu == TRUE\n#endif /* WFA_VHT_PF */\n\t\t) && (pMacEntry))\n\t{\n\t\tUCHAR RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority];\n\n\t\tBASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize;\n\t}\n\n#ifdef TXBF_SUPPORT\n\tif (pTxBlk->TxSndgPkt == SNDG_TYPE_SOUNDING)\n\t{\n\t\tpTxWI->Sounding = 1;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ETxBF in RTMPWriteTxWI_Data(): sending normal sounding, eTxBF=%d\\n\", pTxWI->eTxBF));\n\t\tpTxWI->iTxBF = 0;\n\t}\n\telse if (pTxBlk->TxSndgPkt == SNDG_TYPE_NDP)\n\t{\n\t\tif (pTxBlk->TxNDPSndgMcs >= 16)\n\t\t\tpTxWI->NDPSndRate = 2;\n\t\telse if (pTxBlk->TxNDPSndgMcs >= 8)\n\t\t\tpTxWI->NDPSndRate = 1;\n\t\telse\n\t\t\tpTxWI->NDPSndRate = 0;\n\n\t\tpTxWI->NDPSndBW = pTransmit->field.BW;\n\t\tpTxWI->iTxBF = 0;\n\t}\n\telse\n\t{\n#ifdef MFB_SUPPORT\n\t\tif (pMacEntry && (pMacEntry->mrqCnt >0) && (pMacEntry->toTxMrq == TRUE))\n\t\t\tpTxWI->eTxBF = ~(pTransmit->field.eTxBF);\n\t\telse\n#endif\t/* MFB_SUPPORT */\n\t\t\tpTxWI->eTxBF = pTransmit->field.eTxBF;\n\t\tpTxWI->iTxBF = pTransmit->field.iTxBF;\n\t}\n#endif /* TXBF_SUPPORT */\n\n\tpTxWI->TxWIBAWinSize = BASize;\n\tpTxWI->TxWIShortGI = pTransmit->field.ShortGI;\n\tpTxWI->TxWISTBC = pTransmit->field.STBC;\n#ifdef TXBF_SUPPORT\n\tif (pTxBlk->TxSndgPkt == SNDG_TYPE_NDP  || pTxBlk->TxSndgPkt == SNDG_TYPE_SOUNDING || pTxWI->eTxBF)\n\t\tpTxWI->TxWISTBC = 0;\n#endif /* TXBF_SUPPORT */\n\n#endif /* DOT11_N_SUPPORT */\n\t\n\tpTxWI->TxWIMCS = pTransmit->field.MCS;\n\tpTxWI->TxWIPHYMODE = pTransmit->field.MODE;\n\n\n#ifdef DOT11_N_SUPPORT\n\tif (pMacEntry)\n\t{\n\t\tif ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))\n\t\t{\n\t\t\t/* Dynamic MIMO Power Save Mode*/\n\t\t\tpTxWI->TxWIMIMOps = 1;\n\t\t}\n\t\telse if (pMacEntry->MmpsMode == MMPS_STATIC)\n\t\t{\n\t\t\t/* Static MIMO Power Save Mode*/\n\t\t\tif (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)\n\t\t\t{\n\t\t\t\tpTxWI->TxWIMCS = 7;\n\t\t\t\tpTxWI->TxWIMIMOps = 0;\n\t\t\t}\n\t\t}\n\n\t\tpTxWI->TxWIMpduDensity = pMacEntry->MpduDensity;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\t\n#ifdef TXBF_SUPPORT\n\tif (pTxBlk->TxSndgPkt > SNDG_TYPE_DISABLE)\n\t{\n\t\tpTxWI->TxWIMCS = 0;\n\t\tpTxWI->TxWIAMPDU = FALSE;\n\t}\n#endif /* TXBF_SUPPORT */\n\t\n#ifdef DBG_DIAGNOSE\n\tif (pTxBlk->QueIdx== 0)\n\t{\n\t\tpAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;\n\t\tpAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;\n\t}\n#endif /* DBG_DIAGNOSE */\n\n#ifdef RLT_MAC\n\t/* for rate adapation*/\n\tpTxWI->TxWIPacketId = pTxWI->TxWIMCS;\n#endif /* RLT_MAC */\n\n\n#ifdef INF_AMAZON_SE\n\t/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */\n\tif( RTMP_GET_PACKET_NOBULKOUT(pTxBlk->pPacket))\n\t{\n\t\tif(pTxWI->TxWIPHYMODE == MODE_CCK)\n\t\t\tpTxWI->TxWIPacketId = 6;\n\t}\t\n#endif /* INF_AMAZON_SE */\t\n\n\n#ifdef FPGA_MODE\n\tif (pAd->fpga_on & 0x2)\n\t{\n\t\tpTxWI->TxWIPHYMODE = pAd->data_phy;\n\t\tpTxWI->TxWIMCS = pAd->data_mcs;\n\t\tpTxWI->TxWIBW = pAd->data_bw;\n\t\tpTxWI->TxWIShortGI = pAd->data_gi;\n\t\tif (pAd->data_basize)\n\t\t\tpTxWI->TxWIBAWinSize = pAd->data_basize;\n\t}\n#endif /* FPGA_MODE */\n\n\n}\n\n\nVOID RTMPWriteTxWI_Cache(\n\tIN RTMP_ADAPTER *pAd,\n\tINOUT TXWI_STRUC *pTxWI,\n\tIN TX_BLK *pTxBlk)\n{\n\tHTTRANSMIT_SETTING *pTransmit;\n\tMAC_TABLE_ENTRY *pMacEntry;\n#ifdef DOT11_N_SUPPORT\n#endif /* DOT11_N_SUPPORT */\n\t\n\t\n\t/* update TXWI */\n\tpMacEntry = pTxBlk->pMacEntry;\n\tpTransmit = pTxBlk->pTransmit;\n\t\n\tif (pMacEntry->bAutoTxRateSwitch)\n\t{\n\t\tpTxWI->TxWITXOP = IFS_HTTXOP;\n\n\t\t/* If CCK or OFDM, BW must be 20*/\n\t\tpTxWI->TxWIBW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);\n\t\tpTxWI->TxWIShortGI = pTransmit->field.ShortGI;\n\t\tpTxWI->TxWISTBC = pTransmit->field.STBC;\n\n#ifdef TXBF_SUPPORT\n\t\tif (pTxBlk->TxSndgPkt == SNDG_TYPE_NDP  || pTxBlk->TxSndgPkt == SNDG_TYPE_SOUNDING || pTxWI->eTxBF)\n\t\t\tpTxWI->TxWISTBC = 0;\n#endif /* TXBF_SUPPORT */\n\n\t\tpTxWI->TxWIMCS = pTransmit->field.MCS;\n\t\tpTxWI->TxWIPHYMODE = pTransmit->field.MODE;\n\n#ifdef RLT_MAC\n\t\t/* set PID for TxRateSwitching*/\n\t\tpTxWI->TxWIPacketId = pTransmit->field.MCS;\n#endif /* RLT_MAC */\n\t\t\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tpTxWI->TxWIAMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE: FALSE);\n#ifdef TXBF_SUPPORT\n\tif(pTxBlk->TxSndgPkt > SNDG_TYPE_DISABLE)\n\t\tpTxWI->TxWIAMPDU = FALSE;\n#endif /* TXBF_SUPPORT */\n\n\tpTxWI->TxWIMIMOps = 0;\n\n#ifdef DOT11N_DRAFT3\n\tif (pTxWI->TxWIBW)\n\t\tpTxWI->TxWIBW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);\n#endif /* DOT11N_DRAFT3 */\n\n    if (pAd->CommonCfg.bMIMOPSEnable)\n    {\n\t\t/* MIMO Power Save Mode*/\n\t\tif ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))\n\t\t{\n\t\t\t/* Dynamic MIMO Power Save Mode*/\n\t\t\tpTxWI->TxWIMIMOps = 1;\n\t\t}\n\t\telse if (pMacEntry->MmpsMode == MMPS_STATIC)\n\t\t{\n\t\t\t/* Static MIMO Power Save Mode*/\n\t\t\tif ((pTransmit->field.MODE >= MODE_HTMIX) && (pTransmit->field.MCS > 7))\n\t\t\t{\n\t\t\t\tpTxWI->TxWIMCS = 7;\n\t\t\t\tpTxWI->TxWIMIMOps = 0;\n\t\t\t}\n\t\t}\n    }\n\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DBG_DIAGNOSE\n\tif (pTxBlk->QueIdx== 0)\n\t{\n\t\tpAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;\n\t\tpAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;\n\t}\n#endif /* DBG_DIAGNOSE */\n\n#ifdef TXBF_SUPPORT\n\tif (pTxBlk->TxSndgPkt == SNDG_TYPE_SOUNDING)\n\t{\n\t\tpTxWI->Sounding = 1;\n\t\tpTxWI->eTxBF = 0;\n\t\tpTxWI->iTxBF = 0;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ETxBF in RTMPWriteTxWI_Cache(): sending normal sounding, eTxBF=%d\\n\", pTxWI->eTxBF));\n\t}\n\telse if (pTxBlk->TxSndgPkt == SNDG_TYPE_NDP)\n\t{\n\t\tif (pTxBlk->TxNDPSndgMcs>=16)\n\t\t\tpTxWI->NDPSndRate = 2;\n\t\telse if (pTxBlk->TxNDPSndgMcs>=8)\n\t\t\tpTxWI->NDPSndRate = 1;\n\t\telse\n\t\t\tpTxWI->NDPSndRate = 0;\n\t\tpTxWI->Sounding = 0;\n\t\tpTxWI->eTxBF = 0;\n\t\tpTxWI->iTxBF = 0;\n\n\t\tpTxWI->NDPSndBW = pTransmit->field.BW;\n\n/*\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"%s():ETxBF, sending ndp sounding(BW=%d, Rate=%d, eTxBF=%d)\\n\",\n\t\t\t\t__FUNCTION__, pTxWI->NDPSndBW, pTxWI->NDPSndRate, pTxWI->eTxBF));\n*/\n\t}\n\telse\n\t{\n\t\tpTxWI->Sounding = 0;\n#ifdef MFB_SUPPORT\n\t\tif (pMacEntry && pMacEntry->mrqCnt >0 && pMacEntry->toTxMrq == 1)\n\t\t{\n\t\t\tpTxWI->eTxBF = ~(pTransmit->field.eTxBF);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,(\"ETxBF in AP_AMPDU_Frame_Tx(): invert eTxBF\\n\"));\n\t\t}\n\t\telse\n#endif\t/* MFB_SUPPORT */\n\t\t\tpTxWI->eTxBF = pTransmit->field.eTxBF;\n\n\t\tpTxWI->iTxBF = pTransmit->field.iTxBF;\n\n\t\tif (pTxWI->eTxBF || pTxWI->iTxBF)\n\t\t\tpTxWI->TxWISTBC = 0;\n\t}\n\n\tif (pTxBlk->TxSndgPkt > SNDG_TYPE_DISABLE)\n\t{\n\t\tpTxWI->TxWIMCS = 0;\n\t\tpTxWI->TxWIAMPDU = FALSE;\n\t}\n#endif /* TXBF_SUPPORT */\n\n#ifdef HDR_TRANS_SUPPORT\n\tif (pTxBlk->NeedTrans )\n\t\tpTxWI->TxWIMPDUByteCnt = pTxBlk->SrcBufLen;\n\telse\n#endif /* HDR_TRANS_SUPPORT */\n\tpTxWI->TxWIMPDUByteCnt = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;\n\n\n#ifdef FPGA_MODE\n\tif (pAd->fpga_on & 0x2)\n\t{\n\t\tpTxWI->TxWIPHYMODE = pAd->data_phy;\n\t\tpTxWI->TxWIMCS = pAd->data_mcs;\n\t\tpTxWI->TxWIBW = pAd->data_bw;\n\t\tpTxWI->TxWIShortGI = pAd->data_gi;\n\t\tif (pAd->data_basize)\n\t\t\tpTxWI->TxWIBAWinSize = pAd->data_basize;\n\t}\n#endif /* FPGA_MODE */\n\n\n}\n\n\nINT rtmp_mac_set_band(RTMP_ADAPTER *pAd, int  band)\n{\n\tUINT32 val, band_cfg;\n\n\n\tRTMP_IO_READ32(pAd, TX_BAND_CFG, &band_cfg);\n\tval = band_cfg & (~0x6);\n\tswitch (band)\n\t{\n\t\tcase BAND_5G:\n\t\t\tval |= 0x02;\n\t\t\tbreak;\n\t\tcase BAND_24G:\n\t\tdefault:\n\t\t\tval |= 0x4;\n\t\t\tbreak;\n\t}\n\n\tif (val != band_cfg)\n\t\tRTMP_IO_WRITE32(pAd, TX_BAND_CFG, val);\n\n\treturn TRUE;\n}\n\n\nINT rtmp_mac_set_ctrlch(RTMP_ADAPTER *pAd, INT extch)\n{\n\tUINT32 val, band_cfg;\n\n\n\tRTMP_IO_READ32(pAd, TX_BAND_CFG, &band_cfg);\n\tval = band_cfg & (~0x1);\n\tswitch (extch)\n\t{\n\t\tcase EXTCHA_ABOVE:\n\t\t\tval &= (~0x1);\n\t\t\tbreak;\n\t\tcase EXTCHA_BELOW:\n\t\t\tval |= (0x1);\n\t\t\tbreak;\n\t\tcase EXTCHA_NONE:\n\t\t\tval &= (~0x1);\n\t\t\tbreak;\n\t}\n\n\tif (val != band_cfg)\n\t\tRTMP_IO_WRITE32(pAd, TX_BAND_CFG, val);\n\t\n\treturn TRUE;\n}\n\n\nINT rtmp_mac_set_mmps(RTMP_ADAPTER *pAd, INT ReduceCorePower)\n{\n\tUINT32 mac_val, org_val;\n\n\tRTMP_IO_READ32(pAd, 0x1210, &org_val);\n\tmac_val = org_val;\n\tif (ReduceCorePower)\n\t\tmac_val |= 0x09;\n\telse\n\t\tmac_val &= ~0x09;\n\n\tif (mac_val != org_val)\n\t\tRTMP_IO_WRITE32(pAd, 0x1210, mac_val);\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "src/mcu/rtmp_M51.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_M51.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n#include\t\"rt_config.h\"\n#include \t\"firmware.h\"\n\n\n#ifdef RTMP_MAC_USB\n\n/* RT2870 Firmware Spec only used 1 oct for version expression*/\n\n#define FIRMWARE_MINOR_VERSION\t7\n#endif /* RTMP_MAC_USB */\n\n/* New 8k byte firmware size for RT3071/RT3072*/\n#define FIRMWAREIMAGE_MAX_LENGTH\t0x2000\n#ifdef WOW_SUPPORT \n#define FIRMWAREIMAGE_WOW_LENGTH\t0x3000 /* WOW support firmware(12KB) */\n#endif/*WOW_SUPPORT*/\n#define FIRMWAREIMAGE_LENGTH\t\t\t(sizeof (FirmwareImage) / sizeof(UCHAR))\n#define FIRMWARE_MAJOR_VERSION\t\t0\n\n#define FIRMWAREIMAGEV1_LENGTH\t\t0x1000\n#define FIRMWAREIMAGEV2_LENGTH\t\t0x1000\n#ifdef WOW_SUPPORT \n#define FIRMWAREIMAGEV3_LENGTH\t\t0x2000 /* WOW support firmware */\n#endif/*WOW_SUPPORT*/\n\n\nconst unsigned short ccitt_16Table[] = {\n\t0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\n\t0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n\t0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\n\t0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n\t0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\n\t0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n\t0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\n\t0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n\t0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\n\t0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n\t0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,\n\t0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n\t0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,\n\t0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n\t0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\n\t0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n\t0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\n\t0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n\t0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\n\t0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n\t0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\n\t0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n\t0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\n\t0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n\t0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\n\t0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n\t0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\n\t0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n\t0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\n\t0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n\t0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n\t0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n};\n#define ByteCRC16(v, crc) \\\n\t(unsigned short)((crc << 8) ^  ccitt_16Table[((crc >> 8) ^ (v)) & 255])\n\nunsigned char BitReverse(unsigned char x)\n{\n\tint i;\n\tunsigned char Temp=0;\n\tfor(i=0; ; i++)\n\t{\n\t\tif(x & 0x80)\tTemp |= 0x80;\n\t\tif(i==7)\t\tbreak;\n\t\tx\t<<= 1;\n\t\tTemp >>= 1;\n\t}\n\treturn Temp;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\terase 8051 firmware image in MAC ASIC\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tIRQL = PASSIVE_LEVEL\n\t\t\n\t========================================================================\n*/\nINT RtmpAsicEraseFirmware(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUINT32 i;\n\n\tfor(i = 0; i < MAX_FIRMWARE_IMAGE_SIZE; i += 4)\n\t\tRTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);\n\n\treturn 0;\n}\n\nNDIS_STATUS isMCUNeedToLoadFIrmware(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tULONG\t\t\tIndex;\n\tUINT32\t\t\tMacReg;\n\t\n\tIndex = 0;\n\n\tdo {\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\n\t\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);\n\n\t\tif (MacReg & 0x100) /* check bit 8*/\n\t\t\tbreak;\n\t\t\n\t\tRTMPusecDelay(1000);\n\t} while (Index++ < 100);\n\n\tif (Index >= 100)\n\t\tStatus = NDIS_STATUS_FAILURE;\n\n\treturn Status;\n}\n\nNDIS_STATUS isMCUnotReady(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tULONG\t\t\tIndex;\n\tUINT32\t\t\tMacReg;\n\n#ifdef RT65xx\n\t// TODO: shiang-6590, fix me, currently firmware is not ready yet, so ignore it!\n\tif (IS_RT65XX(pAd)) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): Ignore for MCU status check for 6590 now!\\n\", __FUNCTION__));\n\t\treturn Status;\n\t}\n#endif /* RT65xx */\n\n#ifdef MT7601\n\tif (IS_MT7601(pAd)) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): Ignore for MCU status check for MT7601 now!\\n\", __FUNCTION__));\n\t\treturn Status;\n\t}\n#endif /* MT7601 */\n\t\n\tIndex = 0;\n\n\tdo {\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\n\t\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);\n\n\t\tif (MacReg & 0x80) /* check bit 7*/\n\t\t\tbreak;\n\t\t\n\t\tRTMPusecDelay(1000);\n\t} while (Index++ < 1000);\n\n\tif (Index >= 1000)\n\t\tStatus = NDIS_STATUS_FAILURE;\n\n\treturn Status;\n}\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tLoad 8051 firmware file into MAC ASIC\n\n\tArguments:\n\t\tAdapter\t\t\t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tNDIS_STATUS_SUCCESS         firmware image load ok\n\t\tNDIS_STATUS_FAILURE         image not found\n\n\tIRQL = PASSIVE_LEVEL\n\t\t\n\t========================================================================\n*/\nNDIS_STATUS RtmpAsicLoadFirmware(\n\tIN PRTMP_ADAPTER pAd)\n{\n#ifdef BIN_IN_FILE\n#define NICLF_DEFAULT_USE()\t\\\n\tflg_default_firm_use = TRUE; \\\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s - Use default firmware!\\n\", __FUNCTION__));\n\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tPUCHAR\t\t\tsrc;\n\tRTMP_OS_FD\t\tsrcf;\n\tINT \t\t\t\tretval, i;\n\tPUCHAR\t\t\tpFirmwareImage;\n\tINT\t\t\t\tFileLength = 0;\n\tUINT32\t\t\tMacReg;\n\tULONG\t\t\tIndex;\n\tULONG\t\t\tfirm;\n\tBOOLEAN\t\t\tflg_default_firm_use = FALSE;\n\tRTMP_OS_FS_INFO\tosFSInfo;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> %s\\n\", __FUNCTION__));\n\n\t/* init */\n\tpFirmwareImage = NULL;\n\tsrc = RTMP_FIRMWARE_FILE_NAME;\n\n\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\n\tpAd->FirmwareVersion = (FIRMWARE_MAJOR_VERSION << 8) + \\\n\t\t\t\t\t\t   FIRMWARE_MINOR_VERSION;\n\n\n\t/* allocate firmware buffer */\n/*\tpFirmwareImage = kmalloc(MAX_FIRMWARE_IMAGE_SIZE, MEM_ALLOC_FLAG);*/\n\tos_alloc_mem(pAd, (UCHAR **)&pFirmwareImage, MAX_FIRMWARE_IMAGE_SIZE);\n\tif (pFirmwareImage == NULL)\n\t{\n\t\t/* allocate fail, use default firmware array in firmware.h */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s - Allocate memory fail!\\n\", __FUNCTION__));\n\t\tNICLF_DEFAULT_USE();\n\t}\n\telse\n\t{\n\t\t/* allocate ok! zero the firmware buffer */\n\t\tmemset(pFirmwareImage, 0x00, MAX_FIRMWARE_IMAGE_SIZE);\n\t}\n\n\n\t/* if ok, read firmware file from *.bin file */\n\tif (flg_default_firm_use == FALSE)\n\t{\n\t\tdo\n\t\t{\n\t\t\t/* open the bin file */\n\t\t\tsrcf = RtmpOSFileOpen(src, O_RDONLY, 0);\n\n\t\t\tif (IS_FILE_OPEN_ERR(srcf)) \n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s - Error opening file %s\\n\", __FUNCTION__, src));\n\t\t\t\tNICLF_DEFAULT_USE();\n\t\t\t\tbreak;\n\t\t\t}\n\n\n\t\t\t/* read the firmware from the file *.bin */\n\t\t\tFileLength = RtmpOSFileRead(srcf, pFirmwareImage, MAX_FIRMWARE_IMAGE_SIZE);\n\t\t\tif (FileLength != MAX_FIRMWARE_IMAGE_SIZE)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: error file length (=%d) in RT2860AP.BIN\\n\",\n\t\t\t\t\t   __FUNCTION__, FileLength));\n\t\t\t\tNICLF_DEFAULT_USE();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPUCHAR ptr = pFirmwareImage;\n\t\t\t\tUSHORT crc = 0xffff;\n\n\n\t\t\t\t/* calculate firmware CRC */\n\t\t\t\tfor(i=0; i<(MAX_FIRMWARE_IMAGE_SIZE-2); i++, ptr++)\n\t\t\t\t\tcrc = ByteCRC16(BitReverse(*ptr), crc);\n\n\t\t\t\tif ((pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-2] != \\\n\t\t\t\t\t\t\t\t(UCHAR)BitReverse((UCHAR)(crc>>8))) ||\n\t\t\t\t\t(pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-1] != \\\n\t\t\t\t\t\t\t\t(UCHAR)BitReverse((UCHAR)crc)))\n\t\t\t\t{\n\t\t\t\t\t/* CRC fail */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: CRC = 0x%02x 0x%02x \"\n\t\t\t\t\t\t   \"error, should be 0x%02x 0x%02x\\n\",\n\t\t\t\t\t\t   __FUNCTION__,\n\t\t\t\t\t\t   pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-2],\n\t\t\t\t\t\t   pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-1],\n\t\t\t\t\t\t   (UCHAR)(crc>>8), (UCHAR)(crc)));\n\t\t\t\t\tNICLF_DEFAULT_USE();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* firmware is ok */\n\t\t\t\t\tpAd->FirmwareVersion = \\\n\t\t\t\t\t\t(pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4] << 8) +\n\t\t\t\t\t\tpFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3];\n\n\t\t\t\t\t/* check if firmware version of the file is too old */\n\t\t\t\t\tif ((pAd->FirmwareVersion) < \\\n\t\t\t\t\t\t\t\t\t\t\t((FIRMWARE_MAJOR_VERSION << 8) +\n\t\t\t\t\t\t\t\t\t  \t \t FIRMWARE_MINOR_VERSION))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: firmware version too old!\\n\", __FUNCTION__));\n\t\t\t\t\t\tNICLF_DEFAULT_USE();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"NICLoadFirmware: CRC ok, ver=%d.%d\\n\",\n\t\t\t\t\t\t  pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4],\n\t\t\t\t\t\t  pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3]));\n\t\t\t}\n\t\t\tbreak;\n\t\t} while(TRUE);\n\n\t\t/* close firmware file */\n\t\tif (IS_FILE_OPEN_ERR(srcf))\n\t\t\t;\n\t\telse\n\t\t{\n\t\t\tretval = RtmpOSFileClose(srcf);\n\t\t\tif (retval)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"--> Error %d closing %s\\n\", -retval, src));\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/* write firmware to ASIC */\n\tif (flg_default_firm_use == TRUE)\n\t{\n\t\t/* use default fimeware, free allocated buffer */\n\t\tif (pFirmwareImage != NULL)\n\t\t\tos_free_mem(NULL, pFirmwareImage);\n\n\t\t/* use default *.bin array */\n\t\tpFirmwareImage = FirmwareImage;\n\t\tFileLength = sizeof(FirmwareImage);\n\t}\n\n\t/* enable Host program ram write selection */\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x10000); \n\n\tfor(i=0; i<FileLength; i+=4)\n\t{\n\t\tfirm = pFirmwareImage[i] +\n\t\t\t   (pFirmwareImage[i+3] << 24) +\n\t\t\t   (pFirmwareImage[i+2] << 16) +\n\t\t\t   (pFirmwareImage[i+1] << 8);\n\n\t\tRTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, firm);\n\t}\n\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x00000);\n\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x00001);\n\n\t/* initialize BBP R/W access agent */\n\tRTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0);\n\tRTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);\n\n\tif (flg_default_firm_use == FALSE)\n\t{\n\t\t/* use file firmware, free allocated buffer */\n\t\tif (pFirmwareImage != NULL)\n\t\t\tos_free_mem(NULL, pFirmwareImage);\n\t}\n\n\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n#else\n\n\tNDIS_STATUS\t\tStatus = NDIS_STATUS_SUCCESS;\n\tPUCHAR\t\t\tpFirmwareImage;\n\tULONG\t\t\tFileLength;\n\tUINT32\t\t\tVersion = (pAd->MACVersion >> 16);\n#ifdef RTMP_MAC_USB\n\tBOOLEAN\t\t\tEqual = TRUE;\n\tUINT32\t\t\tMacReg1 = 0;\n\tUCHAR\t\t\tFVer;\n\tUINT16\t\t\tFCS;\n#endif\n\n\n\tpFirmwareImage = FirmwareImage;\n\tFileLength = sizeof(FirmwareImage);\n\n#ifdef RTMP_MAC_USB\n\t/* check firmware version and checksum in RAM and firmware.h */\n\t/* if they are equal, then will skip firmware load procedure */\n\tif (isMCUNeedToLoadFIrmware(pAd) == NDIS_STATUS_SUCCESS)\n\t{\n\t\tRTMP_IO_READ32(pAd, 0x3FFC, &MacReg1);\n\t\tFVer = (MacReg1 >> 8) & 0x00FF;\n\t\tFCS = (MacReg1 >> 16) & 0xFFFF;\n\n\t\n#ifdef WOW_SUPPORT\n\t\tif (pAd->WOW_Cfg.bWOWFirmware == TRUE)\n\t\t{\n\t\t\tUCHAR ver = FirmwareImage[FIRMWAREIMAGEV3_LENGTH+0xFFD];\n\t\t\tUINT16 sum ;\n\n\t\t\tNdisCopyMemory(&sum, &FirmwareImage[FIRMWAREIMAGEV3_LENGTH+0xFFE], 2);\n\t\t\tprintk(\"%s: ver %x/%x, sum %x/%x, mac %x\\n\", __FUNCTION__, FVer, ver, FCS, sum, MacReg1);\n\t\t\tif ( FVer != ver || FCS != sum )\n\t\t\t\tEqual = FALSE;\n\t\t}\n\t\telse\n#endif /* WOW_SUPPORT */\n\t\t{\n\t\t\tUCHAR ver = FirmwareImage[FIRMWAREIMAGEV2_LENGTH+0xFFD];\n\t\t\tUINT16 sum ;\n\n\t\t\tNdisCopyMemory(&sum, &FirmwareImage[FIRMWAREIMAGEV2_LENGTH+0xFFE], 2);\n\t\t\tprintk(\"%s: ver %x/%x, sum %x/%x, mac %x\\n\", __FUNCTION__, FVer, ver, FCS, sum, MacReg1);\n\t\t\tif ( FVer != ver || FCS != sum )\n\t\t\t\tEqual = FALSE;\n\t\t}\t\n\n\t\t/* do not need to load firmware */\n\t\tif (Equal == FALSE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s: WOW stops to go into 4K ram codes ...\\n\", __FUNCTION__));\n\n#ifdef WOW_SUPPORT\n\t\t\t/* Disable MAC TX/RX */\n\t\t\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacReg1);\n\t\t\tMacReg1 &= ~0xC;\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacReg1);\n\t\n\t\t\t/* Disable USB TX/RX DMA */\n\t\t\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &MacReg1);\n\t\t\tMacReg1 &= ~0xC00000;\n\t\t\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, MacReg1);\n\t\n\t\t\t/* Clear Firmware(bit 8) ready bit to force firmware download*/\n\t\t\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg1);\n\t\t\tMacReg1 &= ~0x100;\n\t\t\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacReg1);\n\n#endif /* WOW_SUPPORT */\n\n\t\t\t/* prevent CPU to run in 4K ram codes */\n\t\t\t/* only allow USB vendor request */\n\t\t\tStatus = RTUSB_VendorRequest(\n\t\t\tpAd,\n\t\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t\t0x14,\n\t\t\t0x0,\n\t\t\t0,\n\t\t\tNULL,\n\t\t\t0);\n\n\t\t\t/* disable external functions */\n\t\t\tStatus = RTUSB_VendorRequest(\n\t\t\tpAd,\n\t\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t\t0x12,\n\t\t\t0x0,\n\t\t\t0,\n\t\t\tNULL,\n\t\t\t0);\n\t\t}\n\t}\n\n#endif /* RTMP_MAC_USB */\n\n\t/* New 8k byte firmware size for RT3071/RT3072*/\n\t/*DBGPRINT(RT_DEBUG_TRACE, (\"Usb Chip\\n\"));*/\n\tif (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_MAX_LENGTH)\n\t/*The firmware image consists of two parts. One is the origianl and the other is the new.*/\n\t/*Use Second Part*/\n\t{\n#ifdef RTMP_MAC_USB\n\t\tif ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070)) \n\t\t{\t/* Use Firmware V2.*/\n\t\t\t/*printk(\"KH:Use New Version,part2\\n\");*/\n\t\t\tpFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV1_LENGTH];\n\t\t\tFileLength = FIRMWAREIMAGEV2_LENGTH;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*printk(\"KH:Use New Version,part1\\n\");*/\n\t\t\tpFirmwareImage = FirmwareImage;\n\t\t\tFileLength = FIRMWAREIMAGEV1_LENGTH;\n\t\t}\n#endif /* RTMP_MAC_USB */\n\t}\n\telse\n\t{\n#if defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)\n\t\t/* WOW firmware is 12KB */\n\t\tif ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070))\n\t\t{\n\t\t\tif (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_WOW_LENGTH) /* size 0x3000 */\n\t\t\t{\n\t\t\t\tif (pAd->WOW_Cfg.bWOWFirmware == TRUE)\n\t\t\t\t{\n\t\t\t\t\tpFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV3_LENGTH]; /* WOW offset: 0x2000 */\n\t\t\t\t\tFileLength = FIRMWAREIMAGEV1_LENGTH; /* 0x1000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s: Load WOW firmware!!\\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV2_LENGTH]; /* normal offset: 0x1000 */\n\t\t\t\t\tFileLength = FIRMWAREIMAGEV1_LENGTH; /* 0x1000 */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s: Load normal firmware!!\\n\", __FUNCTION__));\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* defined(WOW_SUPPORT) && defined(RTMP_MAC_USB) */\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"KH: bin file should be 8KB.\\n\"));\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n\n#ifdef RTMP_MAC_USB\n\t/* firmware is never loaded or the loadable firmware is different with the firmware in the RAM */\n\tif (isMCUNeedToLoadFIrmware(pAd) || Equal == FALSE )\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NICLoadFirmware: We need to load firmware\\n\"));\t\n\t\tRTMP_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength); /* FirmwareRun VndReq 0x1/0x8 --> initDone = 1 */\n\t}\n\telse {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NICLoadFirmware: firmware loaded already\\n\"));\n\t\tRTUSB_VendorRequest(\n                pAd,\n                USBD_TRANSFER_DIRECTION_OUT,\n                DEVICE_VENDOR_REQUEST_OUT,\n                0x01,\n                0x8,\n                0,\n                NULL,\n                0);\n\t}\n#else\n\tRTMP_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);\n#endif /* RTMP_MAC_USB */\n\n#endif\n\n\tif (isMCUnotReady(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s(): MCU is not ready!\\n\\n\\n\", __FUNCTION__));\n\t\tStatus = NDIS_STATUS_FAILURE;\n\t}\n#ifdef RTMP_USB_SUPPORT\n\telse\n\t{\n\t\tRTUSBWriteMACRegister(pAd, H2M_BBP_AGENT, 0, FALSE); /* initialize BBP R/W access agent. */\n\t\tRTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0, FALSE);\n\t\tRTUSBWriteMACRegister(pAd, H2M_INT_SRC, 0, FALSE);\n\t\tAsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00, FALSE); /* reset rf by MCU supported by new firmware */\n\t}\n#ifdef WOW_SUPPORT\n\tif (pAd->WOW_Cfg.bEnable == TRUE)\n\t{\n\t\t/* Enable MAC TX/RX */\n\t\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacReg1);\n\t\tMacReg1 |= 0xC;\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacReg1);\n\t\n\t\t/* Enble USB TX/RX DMA */\n\t\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &MacReg1);\n\t\tMacReg1 |= 0xC00000;\n\t\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, MacReg1);\n\n\t\t/* Set Firmware ready bit(bit8) */\n\t\tRTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg1);\n\t\tMacReg1 |= 0x100;\n\t\tRTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacReg1);\n\n\t\t/* need to reset, because interface-up will be normal firmware */\n\t\tpAd->WOW_Cfg.bWOWFirmware = FALSE;\n\n\t}\n#endif /* WOW_SUPPORT */\n\n\tif (Equal == FALSE)\n\t{\n\t\t/* allow all requests (USB vendor request, sleep, wake up, led) */\n\t\tStatus = RTUSB_VendorRequest(\n\t\tpAd,\n\t\tUSBD_TRANSFER_DIRECTION_OUT,\n\t\tDEVICE_VENDOR_REQUEST_OUT,\n\t\t0x13,\n\t\t0x0,\n\t\t0,\n\t\tNULL,\n\t\t0);\n\t}\n\n#endif /* RTMP_USB_SUPPORT */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"<=== %s (status=%d)\\n\", __FUNCTION__, Status));\n\n    return Status;\n}\n\n\nINT RtmpAsicSendCommandToMcu(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\t\t\tCommand,\n\tIN UCHAR\t\t\tToken,\n\tIN UCHAR\t\t\tArg0,\n\tIN UCHAR\t\t\tArg1,\n\tIN BOOLEAN\t\t\tFlgIsNeedLocked)\n{\n\tHOST_CMD_CSR_STRUC\tH2MCmd;\n\tH2M_MAILBOX_STRUC\tH2MMailbox;\n\tINT i = 0;\n\tint ret;\n\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PCIE_PS_SUPPORT\n\tULONG\tConfiguration;\n\tULONG\toffset;\n#endif /* PCIE_PS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PCIE_PS_SUPPORT\n\n#ifdef RT3290\n\tif (IS_RT3290(pAd))\n\t{\n\t\tif (Command == WAKE_MCU_CMD)\n\t\t{\n\t\t\tRTMPEnableWlan(pAd, TRUE, FALSE);\n\t\t}\n\t\telse if (Command == SLEEP_MCU_CMD)\n\t\t{\n\t\t\tWPDMA_GLO_CFG_STRUC\t\tGloCfg;\n\n\t\t\tRTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);\n\t\t\tGloCfg.field.EnableTxDMA = 0;\n\t\t\tRTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);\n\n\t\t\t// wait TX DMA idle\n\t\t\ti = 0;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tRTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);\n\t\t\t\tif (GloCfg.field.TxDMABusy == 0)\n\t\t\t\t\tbreak;\n\t\t\t\tRTMPusecDelay(10);\n\t\t\t\ti++;\n\t\t\t}while(i < 1000);\n\n\t\t\tif (i >= 1000)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" %s: [boundary]DMA Tx keeps busy.  %d\\n\", __FUNCTION__, i ));\n\t\t\t}\t\t\t\n\t\t}\n\t}\n#endif /* RT3290 */\n\n\t/* 3090F power solution 3 has hw limitation that needs to ban all mcu command */\n\t/* when firmware is in radio state.  For other chip doesn't have this limitation. */\n\tif ((((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd) \n\t\t|| IS_RT3593(pAd) || IS_RT5390(pAd) || IS_RT5392(pAd)) \n\t\t&& IS_VERSION_AFTER_F(pAd)) || IS_RT5592(pAd) || IS_RT3290(pAd))\n\t\t&& (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) \n\t\t&& (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))\n\t{\n\n\t\tRTMP_SEM_LOCK(&pAd->McuCmdLock);\n\n\t\tif ((pAd->brt30xxBanMcuCmd == TRUE)\n\t\t\t&& (Command != WAKE_MCU_CMD) && (Command != RFOFF_MCU_CMD))\n\t\t{\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" Ban Mcu Cmd %x in sleep mode\\n\",  Command));\n\t\t\tRTMP_SEM_UNLOCK(&pAd->McuCmdLock);\n\t\t\treturn FALSE;\n\t\t}\n\t\telse if ((Command == SLEEP_MCU_CMD)\n\t\t\t||(Command == RFOFF_MCU_CMD))\n\t\t{\n\t\t\tpAd->brt30xxBanMcuCmd = TRUE;\n\t\t}\n\t\telse if (Command != WAKE_MCU_CMD)\n\t\t{\n\t\t\tpAd->brt30xxBanMcuCmd = FALSE;\n\t\t}\n\n\t\tRTMP_SEM_UNLOCK(&pAd->McuCmdLock);\n\n\n\t}\n\n\n\tif (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd) \n\t\t|| IS_RT3593(pAd) || IS_RT5390(pAd) || IS_RT5392(pAd)\n\t\t|| IS_RT5592(pAd)) \n\t\t&& IS_VERSION_AFTER_F(pAd)\n\t\t&& (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) \n\t\t&& (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)\n\t\t&& (Command == WAKE_MCU_CMD))\n#ifdef RT3290\n\t\t|| (IS_RT3290(pAd) && (Command == WAKE_MCU_CMD))\n#endif /* RT3290 */\n\t)\n\t{\n\t\t/* don't check MailBox for 0x84, 0x31*/\n\t\tif ((Command != 0x84) && (Command != WAKE_MCU_CMD))\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tRTMP_IO_FORCE_READ32(pAd, H2M_MAILBOX_CSR, &H2MMailbox.word);\n\t\t\t\tif (H2MMailbox.field.Owner == 0)\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\tRTMPusecDelay(2);\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"AsicSendCommanToMcu::Mail box is busy\\n\"));\n\t\t\t} while(i++ < 100);\n\n\t\t\tif (i >= 100)\n\t\t\t{\n\t\t\t\tDBGPRINT_ERR((\"H2M_MAILBOX still hold by MCU. command fail\\n\"));\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\tH2MMailbox.field.Owner = 1;\t   /* pass ownership to MCU*/\n\t\tH2MMailbox.field.CmdToken = Token;\n\t\tH2MMailbox.field.HighByte = Arg1;\n\t\tH2MMailbox.field.LowByte = Arg0;\n\t\tRTMP_IO_FORCE_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word);\n\n\t\tH2MCmd.word = 0;\n\t\tH2MCmd.field.HostCommand = Command;\n\t\tRTMP_IO_FORCE_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word);\n\n\t}\n\telse\n#endif /* PCIE_PS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t{\n\n#ifdef RTMP_MAC_USB\n\t\tif (IS_USB_INF(pAd) && (!FlgIsNeedLocked))\n\t\t{\n\t\t\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, ret);\n\t\t\tif (ret != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n#endif /* RTMP_MAC_USB */\n\n\t\tret = FALSE;\n\tdo\n\t{\n\t\tRTMP_IO_READ32(pAd, H2M_MAILBOX_CSR, &H2MMailbox.word);\n\t\tif (H2MMailbox.field.Owner == 0)\n\t\t\tbreak;\n\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\t\n\t\t{\n\t\t\t\tgoto done;\n\t\t}\n\t\tRTMPusecDelay(2);\n\t} while(i++ < 100);\n\n\tif (i >= 100)\n\t{\n\t\t{\n\t\tDBGPRINT_ERR((\"H2M_MAILBOX still hold by MCU. command fail\\n\"));\n\t\t}\n\t\t\tgoto done;\n\t}\n\n\tH2MMailbox.field.Owner\t  = 1;\t   /* pass ownership to MCU*/\n\tH2MMailbox.field.CmdToken = Token;\n\tH2MMailbox.field.HighByte = Arg1;\n\tH2MMailbox.field.LowByte  = Arg0;\n\tRTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word);\n\n\tH2MCmd.word \t\t\t  = 0;\n\tH2MCmd.field.HostCommand  = Command;\n\tRTMP_IO_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word);\n}\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef PCIE_PS_SUPPORT\n\t/* 3090 MCU Wakeup command needs more time to be stable. */\n\t/* Before stable, don't issue other MCU command to prevent from firmware error.*/\n\tif ((((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd) \n\t\t|| IS_RT3593(pAd) || IS_RT5390(pAd) || IS_RT5392(pAd)) && IS_VERSION_AFTER_F(pAd)) || IS_RT5592(pAd) || IS_RT3290(pAd))\n\t\t&& (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) \n\t\t&& (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))\n\t{\n\t\t/*Put this is after RF programming.  */\n\t\t/*NdisAcquireSpinLock(&pAd->McuCmdLock);*/\n\t\t/*pAd->brt30xxBanMcuCmd = FALSE;*/\n\t\t/*NdisReleaseSpinLock(&pAd->McuCmdLock);*/\n\t\tswitch (Command)\n\t\t{\n\t\t\tcase WAKE_MCU_CMD :\n\t\t\t\tRTMPusecDelay(2500);\n\n\t\t\t\tif ((pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) &&\n\t\t\t\t\t(pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))\n\t\t\t\t{\n\t\t\t\t\t/* Put this is after RF program. */ \n\t\t\t\t\tpAd->brt30xxBanMcuCmd = FALSE;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SLEEP_MCU_CMD :\n\t\t\t\tRTMPusecDelay(2000);\n\t\t\t\tbreak;\n\t}\n\t}\n\n#endif /* PCIE_PS_SUPPORT */\t\n#endif /* CONFIG_STA_SUPPORT */\n\n\tif (Command == WAKE_MCU_CMD)\n\t\tpAd->LastMCUCmd = Command;\n\n\tret = TRUE;\n\ndone:\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd) && (!FlgIsNeedLocked))\n\t{\n\t\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\treturn ret;\n}\n\n"
  },
  {
    "path": "src/mcu/rtmp_and.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_and.c\n\n\tAbstract:\n\ton-chip CPU related codes\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n#include\t\"rt_config.h\"\n\n\n#ifdef RT_BIG_ENDIAN\ntypedef struct GNU_PACKED _TXINFO_NMAC_CMD_PKT{\n\tUINT32 info_type:2;\n\tUINT32 d_port:3;\n\tUINT32 cmd_type:7;\n\tUINT32 cmd_seq:4;\n\tUINT32 pkt_len:16;\n}TXINFO_NMAC_CMD_PKT;\n#else\ntypedef struct GNU_PACKED _TXINFO_NMAC_CMD_PKT {\n\tUINT32 pkt_len:16;\n\tUINT32 cmd_seq:4;\n\tUINT32 cmd_type:7;\n\tUINT32 d_port:3;\n\tUINT32 info_type:2;\n}TXINFO_NMAC_CMD_PKT;\n#endif /* RT_BIG_ENDIAN */\n\n\n\n\n#ifdef RTMP_USB_SUPPORT\n\nUSBHST_STATUS USBUploadFWComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tVOID\t*SentToMCUDone = RTMP_OS_USB_CONTEXT_GET(pURB);\n\n\tRtmpComplete(SentToMCUDone);\n}\n\n\nstatic NDIS_STATUS USBLoadIVB(RTMP_ADAPTER *pAd)\n{\n\tNDIS_STATUS Status = NDIS_STATUS_SUCCESS;\n\tUINT32 i;\n\tUSHORT Value;\n\tUSHORT Index;\n\tUSHORT Temp;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\n\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t 0x01,\n\t\t\t\t\t\t\t\t 0x12,\n\t\t\t\t\t\t\t\t 0x00,\n\t\t\t\t\t\t\t\t pChipCap->FWImageName + 32,\n\t\t\t\t\t\t\t\t 64);\n\n\tif (Status)\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Upload IVB Fail\\n\"));\n\t\t\treturn Status;\n\t}\n\n\treturn Status;\n}\n\n\nNDIS_STATUS USBLoadFirmwareToAndes(RTMP_ADAPTER *pAd)\n{\n\tPURB pURB;\n\tNDIS_STATUS Status = NDIS_STATUS_SUCCESS;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tra_dma_addr_t DataDMA;\n\tPUCHAR DataBuffer;\n\tTXINFO_NMAC_CMD *TxInfoCmd;\t\n\tINT32 SentLen;\n\tUINT32 CurLen;\n\tUINT32 MACValue, Loop = 0;\n\tUSHORT Value;\n\tINT Ret;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tUSB_DMA_CFG_STRUC UsbCfg;\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\t//struct completion SentToMCUDone;\n\tVOID *SentToMCUDone;\n\tUINT32 ILMLen, DLMLen;\n\tUSHORT FWVersion, BuildVersion;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s\\n\", __FUNCTION__));\n\n\tif (pChipCap->IsComboChip)\n\t{\nloadfw_protect:\n\t\tRTUSBReadMACRegister(pAd, SEMAPHORE_00, &MACValue);\n\t\tLoop++;\n\n\t\tif (((MACValue & 0x01) == 0) && (Loop < 10000))\n\t\t\tgoto loadfw_protect;\n\t}\n\n\t/* Enable USB_DMA_CFG */\n\tRTUSBWriteMACRegister(pAd, USB_DMA_CFG, 0xC00000, FALSE);\n\n\t/* Check MCU if ready */\n\tRTUSBReadMACRegister(pAd, COM_REG0, &MACValue);\n\n\tif (MACValue == 0x01)\n\t\tgoto error0;\n\n\tRTUSBVenderReset(pAd);\n\t//mdelay(5);\n\tRtmpOsMsDelay(5);\n\t\n\tILMLen = (*(pChipCap->FWImageName + 3) << 24) | (*(pChipCap->FWImageName + 2) << 16) |\n\t\t\t (*(pChipCap->FWImageName + 1) << 8) | (*pChipCap->FWImageName);\n\n\tDLMLen = (*(pChipCap->FWImageName + 7) << 24) | (*(pChipCap->FWImageName + 6) << 16) |\n\t\t\t (*(pChipCap->FWImageName + 5) << 8) | (*(pChipCap->FWImageName + 4));\n\n\tFWVersion = (*(pChipCap->FWImageName + 11) << 8) | (*(pChipCap->FWImageName + 10));\n\n\tBuildVersion = (*(pChipCap->FWImageName + 9) << 8) | (*(pChipCap->FWImageName + 8));\n\t\n\tDBGPRINT(RT_DEBUG_OFF, (\"FW Version:%d.%d.%02d \", (FWVersion & 0xf000) >> 8,\n\t\t\t\t\t\t(FWVersion & 0x0f00) >> 8, FWVersion & 0x00ff));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Build:%x\\n\", BuildVersion));\n\tDBGPRINT(RT_DEBUG_OFF, (\"Build Time:\"));\n\n\tfor (Loop = 0; Loop < 16; Loop++)\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%c\", *(pChipCap->FWImageName + 16 + Loop)));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"ILM Length = %d(bytes)\\n\", ILMLen));\n\tDBGPRINT(RT_DEBUG_OFF, (\"DLM Length = %d(bytes)\\n\", DLMLen));\n\n\tRTMP_IO_WRITE32(pAd, 0xa44, 0x0);\n\n\tRTMP_IO_WRITE32(pAd, 0x230, 0x84210);\n\t//RTMP_IO_WRITE32(pAd, 0x230, 0x41210);\n\n\tRTMP_IO_WRITE32(pAd, 0x400, 0x80c00);\n\n\tRTMP_IO_WRITE32(pAd, 0x800, 0x01);\n\n\tRTMP_IO_READ32(pAd, 0x0404, &MACValue);\n\tMACValue |= 0xF;\n\tRTMP_IO_WRITE32(pAd, 0x0404, MACValue);\n\n\t/* Enable FCE */\n\tRTMP_IO_WRITE32(pAd, FCE_PSE_CTRL, 0x01);\n\n\t/* Enable USB_DMA_CFG */\n\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0xC00000);\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n\t\tUSB_DMA_CFG_STRUC UsbCfg;\n\n\t\tRTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word);\n\t\tUsbCfg.field.TxClear = 1;\n\t\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word);\n\t\tUsbCfg.field.TxClear = 0;\n\t\tRTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word);\n\t}\n#endif /* MT7601 */\n\n\t/* FCE tx_fs_base_ptr */\n\tRTMP_IO_WRITE32(pAd, TX_CPU_PORT_FROM_FCE_BASE_PTR, 0x400230);\n\n\t/* FCE tx_fs_max_cnt */\n\tRTMP_IO_WRITE32(pAd, TX_CPU_PORT_FROM_FCE_MAX_COUNT, 0x01); \n\n\t/* FCE pdma enable */\n\tRTMP_IO_WRITE32(pAd, FCE_PDMA_GLOBAL_CONF, 0x44);  \n\n\t/* FCE skip_fs_en */\n\tRTMP_IO_WRITE32(pAd, FCE_SKIP_FS, 0x03);\n\n\t/* Allocate URB */\n\tpURB = RTUSB_ALLOC_URB(0);\n\n\tif (!pURB)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can not allocate URB\\n\"));\n\t\tStatus = NDIS_STATUS_RESOURCES; \n\t\tgoto error0;\n\t}\n\n\t/* Allocate TransferBuffer */\n\tDataBuffer = RTUSB_URB_ALLOC_BUFFER(pObj->pUsb_Dev, 14592, &DataDMA);\n\t\t\n\tif (!DataBuffer)\n\t{\n\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\tgoto error1;\n\t}\n\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"Loading FW\"));\n\t\n\t//init_completion(&SentToMCUDone);\n\tSentToMCUDone = RtmpInitCompletion();\n\n\tCurLen = 0x40; \n\n\t/* Loading ILM */\n\twhile (1)\n\t{\n/* ++ dump firmware ++ */\n/* ++ dump firmware ++ */\n\n\t\tSentLen = (ILMLen - CurLen) >= 14336 ? 14336 : (ILMLen - CurLen);\n\n\t\tif (SentLen > 0)\n\t\t{\n\t\t\tTxInfoCmd = (TXINFO_NMAC_CMD *)DataBuffer;\n\t\t\tTxInfoCmd->info_type = CMD_PACKET;\n\t\t\tTxInfoCmd->pkt_len = SentLen;\n\t\t\tTxInfoCmd->d_port = CPU_TX_PORT;\n\n/* ++ dump firmware ++ */\n/* ++ dump firmware ++ */\n\n\n#ifdef RT_BIG_ENDIAN\n\t\t\tRTMPDescriptorEndianChange((PUCHAR)TxInfoCmd, TYPE_TXINFO);\n#endif\n\t\t\tNdisMoveMemory(DataBuffer + sizeof(*TxInfoCmd), pChipCap->FWImageName + 32 + CurLen, SentLen);\n\n\t\t\tNdisZeroMemory(DataBuffer + sizeof(*TxInfoCmd) + SentLen, 4);\n\n\t\t\tValue = CurLen & 0xFFFF;\n\n\t\t\t/* Set FCE DMA descriptor */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x230,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA descriptor fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\t\n\t\t\tValue = ((CurLen & 0xFFFF0000) >> 16);\n\n\t\t\t/* Set FCE DMA descriptor */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x232,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA descriptor fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\n\t\t\t\n\n\t\t\tCurLen += SentLen;\n\n\t\t\twhile ((SentLen % 4) != 0)\n\t\t\t\tSentLen++;\n\n\t\t\tValue = ((SentLen << 16) & 0xFFFF);\n\n\t\t\t/* Set FCE DMA length */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x234,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA length fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\t\n\t\t\tValue = (((SentLen << 16) & 0xFFFF0000) >> 16);\n\n\t\t\t/* Set FCE DMA length */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x236,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA length fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\n\t\t\t/* Initialize URB descriptor */\n\t\t\tRTUSB_FILL_HTTX_BULK_URB(pURB,\n\t\t\t\t\t\t\t\t\t pObj->pUsb_Dev,\n\t\t\t\t\t\t\t\t\t pChipCap->CommandBulkOutAddr,\n\t\t\t\t\t\t\t\t\t DataBuffer,\n\t\t\t\t\t\t\t\t\t SentLen + sizeof(*TxInfoCmd) + 4,\n\t\t\t\t\t\t\t\t\t USBUploadFWComplete,\n\t\t\t\t\t\t\t\t\t //&SentToMCUDone,\n\t\t\t\t\t\t\t\t\t SentToMCUDone,\n\t\t\t\t\t\t\t\t\t DataDMA);\n\n\t\t\tStatus = RTUSB_SUBMIT_URB(pURB);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SUBMIT URB fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: submit URB, SentLen = %d, ILMLen = %d, CurLen = %d\\n\", __FUNCTION__, SentLen, ILMLen, CurLen));\n\t\n\t\t\t//if (!wait_for_completion_timeout(&SentToMCUDone, msecs_to_jiffies(1000)))\n\t\t\tif (!RtmpWaitForCompletionTimeout(SentToMCUDone, RtmpMsecsToJiffies(1000)))\n\t\t\t{\n\t\t\t\tRTUSB_UNLINK_URB(pURB);\n\t\t\t\tRet = NDIS_STATUS_FAILURE;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Upload FW timeout\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\".\"));\n\n\t\t\tRTMP_IO_READ32(pAd, TX_CPU_PORT_FROM_FCE_CPU_DESC_INDEX, &MACValue);\n\t\t\tMACValue++;\n\t\t\tRTMP_IO_WRITE32(pAd, TX_CPU_PORT_FROM_FCE_CPU_DESC_INDEX, MACValue);\n\n/* ++ dump firmware ++ */\n/* ++ dump firmware ++ */\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\t\t\n\n\t\t/* Check if DMA done */\n\t\tLoop = 0;\n\t\tdo\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, COM_REG1, &MACValue);\n\t\t\tif (MACValue & 0x80000000)\t\t\t// DDONE 0x400234, bit[31]\n\t\t\t\tbreak;\n\t\t\tLoop++;\n\t\t\tRtmpOsMsDelay(5);\n\t\t} while (Loop <= 100);\n\t\t\n\t}\n\n\tos_free_mem(NULL, SentToMCUDone);\n\n\t//init_completion(&SentToMCUDone);\n\tSentToMCUDone = RtmpInitCompletion();\n\tCurLen = 0x00;\n\n\t/* Loading DLM */\n\twhile (1)\n\t{\n\t\tSentLen = (DLMLen - CurLen) >= 14336 ? 14336 : (DLMLen - CurLen);\n\n\t\tif (SentLen > 0)\n\t\t{\n\t\t\tTxInfoCmd = (TXINFO_NMAC_CMD *)DataBuffer;\n\t\t\tTxInfoCmd->info_type = CMD_PACKET;\n\t\t\tTxInfoCmd->pkt_len = SentLen;\n\t\t\tTxInfoCmd->d_port = CPU_TX_PORT;\n\n#ifdef RT_BIG_ENDIAN\n\t\t\tRTMPDescriptorEndianChange((PUCHAR)TxInfoCmd, TYPE_TXINFO);\n#endif\n\t\t\tNdisMoveMemory(DataBuffer + sizeof(*TxInfoCmd), pChipCap->FWImageName + 32 + ILMLen + CurLen, SentLen);\n\t\n\t\t\tNdisZeroMemory(DataBuffer + sizeof(*TxInfoCmd) + SentLen + 4, 4);\n\n\t\t\tValue = ((CurLen + 0x80000) & 0xFFFF);\n\n\t\t\t/* Set FCE DMA descriptor */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x230,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA descriptor fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\t\n\t\t\tValue = (((CurLen + 0x80000) & 0xFFFF0000) >> 16);\n\n\t\t\t/* Set FCE DMA descriptor */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x232,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA descriptor fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\n\t\t\t\n\n\t\t\tCurLen += SentLen;\n\n\t\t\twhile ((SentLen % 4) != 0)\n\t\t\t\tSentLen++;\n\n\t\t\tValue = ((SentLen << 16) & 0xFFFF);\n\n\t\t\t/* Set FCE DMA length */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x234,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA length fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\t\n\t\t\tValue = (((SentLen << 16) & 0xFFFF0000) >> 16);\n\n\t\t\t/* Set FCE DMA length */\n\t\t\tStatus = RTUSB_VendorRequest(pAd,\n\t\t\t\t\t\t\t\t\t\t USBD_TRANSFER_DIRECTION_OUT,\n\t\t\t\t\t\t\t\t\t\t DEVICE_VENDOR_REQUEST_OUT,\n\t\t\t\t\t\t\t\t\t\t 0x42,\n\t\t\t\t\t\t\t\t\t\t Value,\n\t\t\t\t\t\t\t\t\t\t 0x236,\n\t\t\t\t\t\t\t\t\t\t NULL,\n\t\t\t\t\t\t\t\t\t\t 0);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Set FCE DMA length fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\n\t\t\t/* Initialize URB descriptor */\n\t\t\tRTUSB_FILL_HTTX_BULK_URB(pURB,\n\t\t\t\t\t\t\t\t\t pObj->pUsb_Dev,\n\t\t\t\t\t\t\t\t\t pChipCap->CommandBulkOutAddr,\n\t\t\t\t\t\t\t\t\t DataBuffer,\n\t\t\t\t\t\t\t\t\t SentLen + sizeof(*TxInfoCmd) + 4,\n\t\t\t\t\t\t\t\t\t USBUploadFWComplete,\n\t\t\t\t\t\t\t\t\t //&SentToMCUDone,\n\t\t\t\t\t\t\t\t\t SentToMCUDone,\n\t\t\t\t\t\t\t\t\t DataDMA);\n\n\t\t\tStatus = RTUSB_SUBMIT_URB(pURB);\n\n\t\t\tif (Status)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SUBMIT URB fail\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s: submit URB, SentLen = %d, DLMLen = %d, CurLen = %d\\n\", __FUNCTION__, SentLen, DLMLen, CurLen));\n\t\n\t\t\t//if (!wait_for_completion_timeout(&SentToMCUDone, msecs_to_jiffies(1000)))\n\t\t\tif (!RtmpWaitForCompletionTimeout(SentToMCUDone, RtmpMsecsToJiffies(1000)))\n\t\t\t{\n\t\t\t\tRTUSB_UNLINK_URB(pURB);\n\t\t\t\tRet = NDIS_STATUS_FAILURE;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Upload FW timeout\\n\"));\n\t\t\t\tgoto error2;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\".\"));\n\n\t\t\tRTUSBReadMACRegister(pAd, TX_CPU_PORT_FROM_FCE_CPU_DESC_INDEX, &MACValue);\n\t\t\tMACValue++;\n\t\t\tRTUSBWriteMACRegister(pAd, TX_CPU_PORT_FROM_FCE_CPU_DESC_INDEX, MACValue, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\t\t\n\n\t\t//mdelay(5);\n\t\tRtmpOsMsDelay(5);\n\t}\n\n\tos_free_mem(NULL, SentToMCUDone);\n\n\t/* Upload new 64 bytes interrupt vector */\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\tStatus = USBLoadIVB(pAd);\n\t\n\t/* Check MCU if ready */\n\tLoop = 0;\n\tdo\n\t{\n\t\tRTMP_IO_READ32(pAd, COM_REG0, &MACValue);\n\t\tif (MACValue == 0x1)\n\t\t\tbreak;\n\t\tRtmpOsMsDelay(10);\n\t\tLoop++;\n\t} while (Loop <= 100);\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: COM_REG0(0x%x) = 0x%x\\n\", __FUNCTION__, COM_REG0, MACValue));\n\n\tif (MACValue != 0x1)\n\t\tStatus = NDIS_STATUS_FAILURE;\n\t\nerror2:\n\t/* Free TransferBuffer */\n\tRTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, 14592, \n\t\t\t\t\t\t\t\tDataBuffer, DataDMA);\n\nerror1:\n\t/* Free URB */\n\tRTUSB_FREE_URB(pURB);\n\nerror0: \t\n\tif (pChipCap->IsComboChip)\n\t\tRTUSBWriteMACRegister(pAd, SEMAPHORE_00, 0x1, FALSE);\n\treturn Status;\n}\n#endif /* RTMP_USB_SUPPORT */\n\n\nVOID MCUCtrlInit(PRTMP_ADAPTER pAd)\n{\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE);\n\tNdisZeroMemory(MCtrl, sizeof(*MCtrl));\n\tMCtrl->CmdSeq = 0;\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD);\n\tNdisAllocateSpinLock(pAd, &MCtrl->CmdRspEventListLock);\n\tDlListInit(&MCtrl->CmdRspEventList);\n}\n\n\nVOID MCUCtrlExit(PRTMP_ADAPTER pAd)\n{\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\tstruct CMD_RSP_EVENT *CmdRspEvent, *CmdRspEventTmp;\n\tINT32 Ret;\n\tunsigned long IrqFlags;\n\n\tRtmpOsMsDelay(30);\n\n\tRTMP_IRQ_LOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\tDlListForEachSafe(CmdRspEvent, CmdRspEventTmp, &MCtrl->CmdRspEventList, struct CMD_RSP_EVENT, List)\n\t{\n\t\tif (!CmdRspEvent->NeedWait)\n\t\t{\n\t\t\tDlListDel(&CmdRspEvent->List);\n\t\t\tos_free_mem(NULL, CmdRspEvent);\n\t\t}\n\t}\n\tRTMP_IRQ_UNLOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\n\tNdisFreeSpinLock(&MCtrl->CmdRspEventListLock);\n\tNdisZeroMemory(MCtrl, sizeof(*MCtrl));\n}\n\n\nBOOLEAN IsInBandCmdProcessing(PRTMP_ADAPTER pAd)\n{\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\tunsigned long IrqFlags;\n\tBOOLEAN Ret;\n\n\tRTMP_IRQ_LOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t\n\tif (DlListEmpty(&MCtrl->CmdRspEventList))\n\t\tRet =  FALSE;\n\telse\n\t\tRet = TRUE;\n\n\tRTMP_IRQ_UNLOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\n\treturn Ret;\n}\n\n\nUCHAR GetCmdRspNum(PRTMP_ADAPTER pAd)\n{\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\tunsigned long IrqFlags;\n\tUCHAR Num = 0;\n\tNum = DlListLen(&MCtrl->CmdRspEventList);\n\n\treturn Num;\n}\n\n\nstatic inline UCHAR GetCmdSeq(PRTMP_ADAPTER pAd)\n{\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\tstruct CMD_RSP_EVENT *CmdRspEvent, *CmdRspEventTmp;\n\tunsigned long IrqFlags;\n\tUCHAR TryCount = 0;\n\n\tRTMP_IRQ_LOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\nget_seq:\n\tMCtrl->CmdSeq >= 0xf ? MCtrl->CmdSeq = 1 : MCtrl->CmdSeq++;\n\tTryCount++;\n\tDlListForEachSafe(CmdRspEvent, CmdRspEventTmp, &MCtrl->CmdRspEventList, struct CMD_RSP_EVENT, List)\n\t{\n\t\tif (CmdRspEvent->CmdSeq == MCtrl->CmdSeq)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Command(seq: %d) is still running\\n\", MCtrl->CmdSeq));\n\t\t\t\n\t\t\tif (TryCount > 128)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprintk(\"CmdRspNum = %d\\n\", GetCmdRspNum(pAd));\n\t\t\t\tgoto get_seq;\n\t\t\t}\n\t\t}\n\t}\n\tRTMP_IRQ_UNLOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\n\treturn MCtrl->CmdSeq;\n}\n\n\n#ifdef RTMP_MAC_USB\n\n\nUSBHST_STATUS USBKickOutCmdComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\t//struct completion *SentToMCUDone = (struct completion *)RTMP_OS_USB_CONTEXT_GET(pURB);\n\n\t//complete(SentToMCUDone);\n\n\tVOID\t*SentToMCUDone = RTMP_OS_USB_CONTEXT_GET(pURB);\n\n\tRtmpComplete(SentToMCUDone);\n}\n\n\nINT USBKickOutCmd(PRTMP_ADAPTER pAd, UCHAR *Buf, UINT32 Len)\n{\n\tPURB pURB;\n\tNDIS_STATUS Status = NDIS_STATUS_SUCCESS;\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\tPCHAR DataBuffer;\n\tra_dma_addr_t DataDMA;\n\tINT Ret;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\t//struct completion SentToMCUDone;\n\tVOID\t*SentToMCUDone;\n\n\t//if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\t//return NDIS_STATUS_FAILURE;\n\n\t/* Allocate URB */\n\tpURB = RTUSB_ALLOC_URB(0);\n\n\tif (!pURB)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can not allocate URB\\n\"));\n\t\tStatus = NDIS_STATUS_RESOURCES; \n\t\tgoto error0;\n\t}\n\n\t/* Allocate TransferBuffer */\n\tDataBuffer = RTUSB_URB_ALLOC_BUFFER(pObj->pUsb_Dev, 512, &DataDMA);\n\t\t\n\tif (!DataBuffer)\n\t{\n\t\tStatus = NDIS_STATUS_RESOURCES;\n\t\tgoto error1;\n\t}\n\t\n\tNdisMoveMemory(DataBuffer, Buf, Len);\n\n\tNdisZeroMemory(DataBuffer + Len, 4);\n\n\n\t//init_completion(&SentToMCUDone);\n\tSentToMCUDone = RtmpInitCompletion();\n\n\t/* Initialize URB descriptor */\n\tRTUSB_FILL_HTTX_BULK_URB(pURB,\n\t\t\t\t\t\t\t pObj->pUsb_Dev,\n\t\t\t\t\t\t\t pChipCap->CommandBulkOutAddr,\n\t\t\t\t\t\t\t DataBuffer,\n\t\t\t\t\t\t\t Len + 4,\n\t\t\t\t\t\t\t USBKickOutCmdComplete,\n\t\t\t\t\t\t\t //&SentToMCUDone,\n\t\t\t\t\t\t\t SentToMCUDone,\n\t\t\t\t\t\t\t DataDMA);\n\n\tStatus = RTUSB_SUBMIT_URB(pURB);\n\n\tif (Status)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SUBMIT URB fail\\n\"));\n\t\tgoto error2;\n\t}\n\t\t\t\n\t//if (!wait_for_completion_timeout(&SentToMCUDone, msecs_to_jiffies(500)))\n\tif (!RtmpWaitForCompletionTimeout(SentToMCUDone, RtmpMsecsToJiffies(500)))\n\t{\n\t\tRTUSB_UNLINK_URB(pURB);\n\t\tRet = NDIS_STATUS_FAILURE;\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Timeout\\n\", __FUNCTION__));\n\t\thex_dump(\"CmdBuffer\", (char *)DataBuffer, Len + 4);\n\t}\n\nerror2:\n\t/* Free TransferBuffer */\n\tRTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, 512, \n\t\t\t\t\t\t\t\tDataBuffer, DataDMA);\n\n\tos_free_mem(NULL, SentToMCUDone);\n\n\nerror1:\n\t/* Free URB */\n\tRTUSB_FREE_URB(pURB);\n\nerror0: \n\treturn Status;\n}\n#endif /* RTMP_MAC_USB */\n\n\nINT AsicSendCmdToAndes(PRTMP_ADAPTER pAd, struct CMD_UNIT *CmdUnit)\n{\n\tUINT32 VarLen;\n\tUCHAR *Pos, *Buf;\n\tTXINFO_NMAC_CMD *TxInfoCmd;\n\tINT32 Ret = NDIS_STATUS_SUCCESS;\n\tstruct MCU_CTRL *MCtrl = &pAd->MCUCtrl;\n\tstruct CMD_RSP_EVENT *CmdRspEvent;\n\tULONG Expire;\n\tunsigned long IrqFlags;\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: !fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD && fRTMP_ADAPTER_IDLE_RADIO_OFF\\n\", __FUNCTION__));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tif (pAd->PM_FlgSuspend)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_IDLE_RADIO_OFF | fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\treturn NDIS_STATUS_FAILURE;\n\n\tVarLen = sizeof(*TxInfoCmd) + CmdUnit->u.ANDES.CmdPayloadLen;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tNdisZeroMemory(Buf, VarLen);\n\n\tPos = Buf;\n\tTxInfoCmd = (TXINFO_NMAC_CMD *)Pos;\n\tTxInfoCmd->info_type = CMD_PACKET;\n\tTxInfoCmd->d_port = CPU_TX_PORT;\n\tTxInfoCmd->cmd_type = CmdUnit->u.ANDES.Type;\n\n\tif (CmdUnit->u.ANDES.NeedRsp)\n\t{\n\t\tTxInfoCmd->cmd_seq = GetCmdSeq(pAd);\n\n\t\t//printk(\"cmd seq = %d\\n\", TxInfoCmd->cmd_seq);\n\n\t\tos_alloc_mem(NULL, (UCHAR **)&CmdRspEvent, sizeof(*CmdRspEvent));\n\n\t\tif (!CmdRspEvent)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s Not available memory\\n\", __FUNCTION__));\n\t\t\tRet = NDIS_STATUS_RESOURCES;\n\t\t\tgoto error;\n\t\t}\n\n\t\tNdisZeroMemory(CmdRspEvent, sizeof(*CmdRspEvent));\n\n\t\tCmdRspEvent->CmdSeq = TxInfoCmd->cmd_seq;\n\t\tCmdRspEvent->Timeout = CmdUnit->u.ANDES.Timeout;\n\t\tCmdRspEvent->RspPayload = &CmdUnit->u.ANDES.RspPayload;\n\t\tCmdRspEvent->RspPayloadLen = &CmdUnit->u.ANDES.RspPayloadLen;\n\n\t\tif (CmdUnit->u.ANDES.NeedWait)\n\t\t{\n\t\t\tCmdRspEvent->NeedWait = TRUE;\n\t\t\tCmdRspEvent->AckDone = RtmpInitCompletion();\n\t\t}\n\n\t\tRTMP_IRQ_LOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t\tDlListAddTail(&MCtrl->CmdRspEventList, &CmdRspEvent->List);\n\t\tRTMP_IRQ_UNLOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t}\n\telse\n\t{\t\n\t\tTxInfoCmd->cmd_seq = 0;\n\t}\n\n\tTxInfoCmd->pkt_len = CmdUnit->u.ANDES.CmdPayloadLen;\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPDescriptorEndianChange((PUCHAR)TxInfoCmd, TYPE_TXINFO);\n#endif\n\n\tPos += sizeof(*TxInfoCmd);\n\t\n\tNdisMoveMemory(Pos, CmdUnit->u.ANDES.CmdPayload, CmdUnit->u.ANDES.CmdPayloadLen);\n\t\n#ifdef RTMP_USB_SUPPORT\n\tUSBKickOutCmd(pAd, Buf, VarLen);\n#endif\n\n\n\t/* Wait for Command Rsp */\n\tif (CmdUnit->u.ANDES.NeedWait) {\n\t\tULONG Timeout = CmdUnit->u.ANDES.Timeout;\n\t\tExpire = Timeout ? RtmpMsecsToJiffies(Timeout) : RtmpMsecsToJiffies(300);\n\t\tif (!RtmpWaitForCompletionTimeout(CmdRspEvent->AckDone, Expire))\n\t\t{\n\t\t\tRet = NDIS_STATUS_FAILURE;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Wait for command response timeout(300ms)\\n\"));\n\t\t}\n\t\n\t\tRTMP_IRQ_LOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t\tDlListDel(&CmdRspEvent->List);\n\t\tos_free_mem(NULL, CmdRspEvent->AckDone);\n\t\tos_free_mem(NULL, CmdRspEvent);\n\t\tRTMP_IRQ_UNLOCK(&MCtrl->CmdRspEventListLock, IrqFlags);\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn Ret;\n}\n\nstatic VOID CmdDoneHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n}\n\n\nstatic VOID CmdErrorHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n}\n\n\nstatic VOID CmdRetryHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n}\n\n\nstatic VOID PwrRspEventHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n}\n\n\nstatic VOID WowRspEventHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n}\n\n\nstatic VOID CarrierDetectRspEventHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n\n}\n\n\nstatic VOID DFSDetectRspEventHandler(PRTMP_ADAPTER pAd, UCHAR *Data)\n{\n\n\n\n}\n\n\nCMD_RSP_HANDLER CmdRspHandlerTable[] =\n{\n\tCmdDoneHandler,\n\tCmdErrorHandler,\n\tCmdRetryHandler,\n\tPwrRspEventHandler,\n\tWowRspEventHandler,\n\tCarrierDetectRspEventHandler,\n\tDFSDetectRspEventHandler,\n};\n\n\nINT AndesBurstWrite(PRTMP_ADAPTER pAd, UINT32 Offset, UINT32 *Data, UINT32 Cnt)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen, OffsetNum, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tBOOLEAN LastPacket = FALSE;\n\n\tOffsetNum = Cnt / ((pChipCap->InbandPacketMaxLen - sizeof(Offset)) / 4);\n\n\tif (Cnt % ((pChipCap->InbandPacketMaxLen - sizeof(Offset)) / 4))\n\t\tVarLen = sizeof(Offset) * (OffsetNum + 1) + 4 * Cnt;\n\telse\n\t\tVarLen = sizeof(Offset) * OffsetNum + 4 * Cnt;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\n\tPos = Buf;\n\t\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\t\t\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\t\n\t\tCurHeader = Pos;\n\n\t\tValue = cpu2le32(Offset + pChipCap->WlanMemmapOffset + CurIndex * 4);\n\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\tPos += 4;\n\n\t\tfor (i = 0; i < ((SentLen - 4) / 4); i++)\n\t\t{\n\t\t\tValue = cpu2le32(Data[i + CurIndex]);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t};\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_BURST_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket && (Cnt > 1))\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\t\n\t\tCurIndex += ((SentLen - 4) / 4);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesBurstRead(PRTMP_ADAPTER pAd, UINT32 Offset, UINT32 Cnt, UINT32 *Data)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tUINT32 CurLen = 0, CmdLen, RspLen, OffsetNum, ReceiveLen;\n\tCHAR *Pos, *Pos1, *CmdBuf, *RspBuf, *CurCmdHeader, *CurRspHeader;\n\tUINT32 i, Value, Status = NDIS_STATUS_SUCCESS, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\n\tOffsetNum = Cnt / ((pChipCap->InbandPacketMaxLen - sizeof(Offset)) / 4);\n\n\tif (Cnt % ((pChipCap->InbandPacketMaxLen - sizeof(Offset)) / 4))\n\t{\n\t\tCmdLen = 8 * (OffsetNum + 1); \n\t\tRspLen = sizeof(Offset) * (OffsetNum + 1) + 4 * Cnt;\n\t}\n\telse\n\t{\n\t\tCmdLen = 8 * OffsetNum;\n\t\tRspLen = sizeof(Offset) * OffsetNum + 4 * Cnt;\n\t}\n\n\tos_alloc_mem(pAd, (UCHAR **)&CmdBuf, CmdLen);\n\tos_alloc_mem(pAd, (UCHAR **)&RspBuf, RspLen);\n\t\n\tPos = CmdBuf;\n\tPos1 = RspBuf;\n\n\twhile (CurLen < RspLen)\n\t{\n\t\tReceiveLen = (RspLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t   ? pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t   : (RspLen - CurLen);\n\n\t\tCurCmdHeader = Pos;\n\t\tCurRspHeader = Pos1;\n\t\t\n\t\tValue = cpu2le32(Offset + pChipCap->WlanMemmapOffset + CurIndex * 4);\n\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\tPos += 4;\n\n\t\tValue = cpu2le32((ReceiveLen - 4) / 4);\n\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\tPos += 4;\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\tCmdUnit.u.ANDES.Type = CMD_BURST_READ;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = 8;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurCmdHeader;\n\t\tCmdUnit.u.ANDES.RspPayload = CurRspHeader;\n\t\tCmdUnit.u.ANDES.RspPayloadLen = ReceiveLen;\n\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\tCmdUnit.u.ANDES.Timeout = 0;\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\n\t\tif (CmdUnit.u.ANDES.RspPayloadLen == ReceiveLen)\n\t\t{\n\t\t\tNdisMoveMemory(&Data[CurIndex], CmdUnit.u.ANDES.RspPayload + 4, CmdUnit.u.ANDES.RspPayloadLen - 4);\n\t\t\tPos1 += ReceiveLen;\n\n\t\t\tfor (i = 0; i < (ReceiveLen - 4) / 4; i++)\n\t\t\t{\n\t\t\t\tData[i + CurIndex] = le2cpu32(Data[i + CurIndex]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Rsp len(%d) != Expect len (%d)\\n\", \n\t\t\t\t__FUNCTION__, CmdUnit.u.ANDES.RspPayloadLen, ReceiveLen));\n\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\n\t\t\tgoto error;\n\t\t}\n\t\t\n\t\tCurIndex += ((ReceiveLen - 4) / 4);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\n\tos_free_mem(NULL, CmdBuf);\n\tos_free_mem(NULL, RspBuf);\n\n\treturn Status;\n}\n\n\nINT AndesRandomRead(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tUINT32 VarLen = Num * 8, CurLen = 0, ReceiveLen;\n\tCHAR *Pos, *Pos1, *CmdBuf, *RspBuf, *CurCmdHeader, *CurRspHeader;\n\tUINT32 i, Value, Status = NDIS_STATUS_SUCCESS, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\n\tos_alloc_mem(pAd, (UCHAR **)&CmdBuf, VarLen);\n\tos_alloc_mem(pAd, (UCHAR **)&RspBuf, VarLen);\n\n\tNdisZeroMemory(CmdBuf, VarLen);\n\n\tPos = CmdBuf;\n\tPos1 = RspBuf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tReceiveLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t   ? pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t   : (VarLen - CurLen);\n\n\t\tCurCmdHeader = Pos;\n\t\tCurRspHeader = Pos1;\n\n\t\tfor (i = 0; i < ReceiveLen / 8; i++)\n\t\t{\n\t\t\tValue = cpu2le32(RegPair[i + CurIndex].Register + pChipCap->WlanMemmapOffset);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 8;\n\t\t}\n\t\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_READ;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = ReceiveLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurCmdHeader;\n\t\tCmdUnit.u.ANDES.RspPayload = CurRspHeader;\n\t\tCmdUnit.u.ANDES.RspPayloadLen = ReceiveLen;\n\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\tCmdUnit.u.ANDES.Timeout = 0;\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\n\t\tif (CmdUnit.u.ANDES.RspPayloadLen == ReceiveLen)\n\t\t{\n\t\t\tfor (i = 0; i < ReceiveLen / 8; i++)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&RegPair[i + CurIndex].Value, CmdUnit.u.ANDES.RspPayload + 8 * i + 4, 4);\n\t\t\t\tRegPair[i + CurIndex].Value = le2cpu32(RegPair[i + CurIndex].Value);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Rsp len(%d) != Expect len (%d)\\n\", \n\t\t\t\t__FUNCTION__, CmdUnit.u.ANDES.RspPayloadLen, ReceiveLen));\n\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\n\t\t\tgoto error;\n\t\t}\n\t\t\n\t\tCurIndex += ReceiveLen / 8;\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\t\n\tos_free_mem(NULL, CmdBuf);\n\tos_free_mem(NULL, RspBuf);\n\n\treturn Status;\n}\n\n\nINT AndesRFRandomRead(PRTMP_ADAPTER pAd, BANK_RF_REG_PAIR *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tUINT32 VarLen = Num * 8, CurLen = 0, ReceiveLen;\n\tCHAR *Pos, *Pos1, *CmdBuf, *RspBuf, *CurCmdHeader, *CurRspHeader;\n\tUINT32 i, Value, Status = NDIS_STATUS_SUCCESS, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\n\tos_alloc_mem(pAd, (UCHAR **)&CmdBuf, VarLen);\n\tos_alloc_mem(pAd, (UCHAR **)&RspBuf, VarLen);\n\n\tNdisZeroMemory(CmdBuf, VarLen);\n\tPos = CmdBuf;\n\tPos1 = RspBuf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tReceiveLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t   ? pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t   : (VarLen - CurLen);\n\n\t\tCurCmdHeader = Pos;\n\t\tCurRspHeader = Pos1;\n\n\t\tfor (i = 0; i < ReceiveLen / 8; i++)\n\t\t{\n\t\t\tValue = 0;\n\t\n\t\t\t/* RF selection */\n\t\t\tValue = (Value & ~0x80000000) | 0x80000000;\n\n\t\t\t/* RF bank */\n\t\t\tValue = (Value & ~0x00ff0000) | (RegPair[i + CurIndex].Bank << 16);\n\n\t\t\t/* RF Index */\n\t\t\tValue = (Value & ~0x0000ffff) | RegPair[i + CurIndex].Register;\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 8;\n\t\t}\n\t\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_READ;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = ReceiveLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurCmdHeader;\n\t\tCmdUnit.u.ANDES.RspPayload = CurRspHeader;\n\t\tCmdUnit.u.ANDES.RspPayloadLen = ReceiveLen;\n\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\tCmdUnit.u.ANDES.Timeout = 0;\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\n\t\n\t\tif (CmdUnit.u.ANDES.RspPayloadLen == ReceiveLen)\n\t\t{\n\t\t\tfor (i = 0; i < ReceiveLen / 8; i++)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&RegPair[i + CurIndex].Value, CmdUnit.u.ANDES.RspPayload + 8 * i + 4, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Rsp len(%d) != Expect len (%d)\\n\", \n\t\t\t\t__FUNCTION__, CmdUnit.u.ANDES.RspPayloadLen, ReceiveLen));\n\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\n\t\t\tgoto error;\n\t\t}\n\t\t\n\t\tCurIndex += ReceiveLen / 8;\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\t\nerror:\n\tos_free_mem(NULL, CmdBuf);\n\tos_free_mem(NULL, RspBuf);\n\n\treturn Status;\n}\n\n\nINT AndesReadModifyWrite(PRTMP_ADAPTER pAd, R_M_W_REG *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 12, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tBOOLEAN LastPacket = FALSE;\n\t\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\t\t\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\n\t\tCurHeader = Pos;\n\n\t\tfor (i = 0; i < (SentLen / 12); i++)\n\t\t{\n\t\t\t/* Address */\n\t\t\tValue = cpu2le32(RegPair[i + CurIndex].Register + pChipCap->WlanMemmapOffset);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\t/* ClearBitMask */\n\t\t\tValue = cpu2le32(RegPair[i + CurIndex].ClearBitMask);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\t/* UpdateData */\n\t\t\tValue = cpu2le32(RegPair[i + CurIndex].Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t}\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_READ_MODIFY_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\n\t\tCurIndex += (SentLen / 12);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesRFReadModifyWrite(PRTMP_ADAPTER pAd, RF_R_M_W_REG *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 12, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tBOOLEAN LastPacket = FALSE;\n\t\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\t\t\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\t\t\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < SentLen / 12; i++)\n\t\t{\n\t\t\tValue = 0;\n\t\t\t/* RF selection */\n\t\t\tValue = (Value & ~0x80000000) | 0x80000000;\n\n\t\t\t/* RF bank */\n\t\t\tValue = (Value & ~0x00ff0000) | (RegPair[i + CurIndex].Bank << 16);\n\n\t\t\t/* RF Index */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].Register;\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\tValue = 0;\n\t\t\t/* ClearBitMask */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].ClearBitMask;\n\t\t\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\tValue = 0;\n\t\t\t/* UpdateData */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].Value;\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t}\n\t\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_READ_MODIFY_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\t\n\t\tCurIndex += (SentLen / 12);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesRandomWritePair(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 8, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tBOOLEAN LastPacket = FALSE;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < (SentLen / 8); i++)\n\t\t{\n\t\t\t/* Address */\n\t\t\tValue = cpu2le32(RegPair[i + CurIndex].Register + pChipCap->WlanMemmapOffset);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\t/* UpdateData */\n\t\t\tValue = cpu2le32(RegPair[i + CurIndex].Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t};\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\n\t\tCurIndex += (SentLen / 8);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesRandomWrite(PRTMP_ADAPTER pAd, UINT32 Num, ...)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 8, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tva_list argptr;\n\tBOOLEAN LastPacket = FALSE;\n\n\tva_start(argptr, Num);\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < (SentLen / 8); i++)\n\t\t{\n\t\t\t/* Address */\n\t\t\tValue = cpu2le32( va_arg(argptr, UINT32) +pChipCap->WlanMemmapOffset);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\t/* UpdateData */\n\t\t\tValue = cpu2le32(va_arg(argptr, UINT32));\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t};\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\n\t\tCurIndex += (SentLen / 8);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\tva_end(argptr);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesRFRandomWritePair(PRTMP_ADAPTER pAd, BANK_RF_REG_PAIR *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 8, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tBOOLEAN LastPacket = FALSE;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\t\t\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < (SentLen / 8); i++)\n\t\t{\n\t\t\tValue = 0;\n\t\t\t/* RF selection */\n\t\t\tValue = (Value & ~0x80000000) | 0x80000000;\n\n\t\t\t/* RF bank */\n\t\t\tValue = (Value & ~0x00ff0000) | (RegPair[i + CurIndex].Bank << 16);\n\n\t\t\t/* RF Index */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].Register;\n\t\t\t\n\t\t\t//printk(\"Value = %x RF Bank = %d and Index = %d\\n\", Value, RegPair[i + CurIndex].Bank, RegPair[i + CurIndex].Register);\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\tValue = 0;\n\t\t\t/* UpdateData */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].Value;\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t}\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\t\n\t\tCurIndex += (SentLen / 8);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesRFRandomWrite(PRTMP_ADAPTER pAd, UINT32 Num, ...)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 8, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tva_list argptr;\n\tBOOLEAN LastPacket = FALSE;\n\n\tva_start(argptr, Num);\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < (SentLen / 8); i++)\n\t\t{\n\t\t\tValue = 0;\n\t\t\t/* RF selection */\n\t\t\tValue = (Value & ~0x80000000) | 0x80000000;\n\n\t\t\t/* RF bank */\n\t\t\tValue = (Value & ~0x00ff0000) | (va_arg(argptr, UINT) << 16);\n\n\t\t\t/* RF Index */\n\t\t\tValue = (Value & ~0x000000ff) | va_arg(argptr, UINT);\n\t\t\t\n\t\t\t//printk(\"Value = %x RF Bank = %d and Index = %d\\n\", Value, RegPair[i + CurIndex].Bank, RegPair[i + CurIndex].Register);\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\tValue = 0;\n\t\t\t/* UpdateData */\n\t\t\tValue = (Value & ~0x000000ff) | va_arg(argptr, UINT);\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t}\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\t\t\n\t\tCurIndex += (SentLen / 8);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\n\nerror:\n\tos_free_mem(NULL, Buf);\n\tva_end(argptr);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n#ifdef MT7601\nINT AndesBBPRandomWritePair(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 8, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tBOOLEAN LastPacket = FALSE;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\t\t\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < (SentLen / 8); i++)\n\t\t{\n\t\t\tValue = 0;\n\t\t\t/* BBP selection */\n\t\t\tValue = (Value & ~0x40000000) | 0x40000000;\n\n\t\t\t/* BBP Index */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].Register;\n\t\t\t\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\tValue = 0;\n\t\t\t/* UpdateData */\n\t\t\tValue = (Value & ~0x000000ff) | RegPair[i + CurIndex].Value;\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t}\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\n\t\tCurIndex += (SentLen / 8);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesBBPRandomWrite(PRTMP_ADAPTER pAd, UINT32 Num, ...)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf, *CurHeader;\n\tUINT32 VarLen = Num * 8, CurLen = 0, SentLen;\n\tUINT32 Value, i, CurIndex = 0;\n\tRTMP_CHIP_CAP *pChipCap = &pAd->chipCap;\n\tINT32 Ret;\n\tva_list argptr;\n\tBOOLEAN LastPacket = FALSE;\n\n\tva_start(argptr, Num);\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\t\n\tPos = Buf;\n\n\twhile (CurLen < VarLen)\n\t{\n\t\tSentLen = (VarLen - CurLen) > pChipCap->InbandPacketMaxLen \n\t\t\t\t\t\t\t\t\t? pChipCap->InbandPacketMaxLen : (VarLen - CurLen);\n\n\t\tif ((SentLen < pChipCap->InbandPacketMaxLen) || (CurLen + pChipCap->InbandPacketMaxLen) == VarLen)\n\t\t\tLastPacket = TRUE;\n\t\t\n\t\tCurHeader = Pos;\n\t\t\n\t\tfor (i = 0; i < (SentLen / 8); i++)\n\t\t{\n\t\t\tValue = 0;\n\t\t\t/* BBP selection */\n\t\t\tValue = (Value & ~0x40000000) | 0x40000000;\n\n\t\t\t/* BBP Index */\n\t\t\tValue = (Value & ~0x000000ff) | va_arg(argptr, UINT);\n\t\t\t\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\n\t\t\tValue = 0;\n\t\t\t/* UpdateData */\n\t\t\tValue = (Value & ~0x000000ff) | va_arg(argptr, UINT);\n\n\t\t\tValue = cpu2le32(Value);\n\t\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\t\tPos += 4;\n\t\t}\n\n\t\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\t\tCmdUnit.u.ANDES.Type = CMD_RANDOM_WRITE;\n\t\tCmdUnit.u.ANDES.CmdPayloadLen = SentLen;\n\t\tCmdUnit.u.ANDES.CmdPayload = CurHeader;\n\n\t\tif (LastPacket)\n\t\t{\n\t\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t\t}\n\n\t\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\t\t\n\t\tif (Ret != NDIS_STATUS_SUCCESS)\n\t\t\tgoto error;\n\n\t\tCurIndex += (SentLen / 8);\n\t\tCurLen += pChipCap->InbandPacketMaxLen;\n\t}\n\nerror:\n\tos_free_mem(NULL, Buf);\n\tva_end(argptr);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n#endif\n\n\nINT AndesPwrSavingOP(PRTMP_ADAPTER pAd, UINT32 PwrOP, UINT32 PwrLevel, \n\t\t\t\t\tUINT32 ListenInterval, UINT32 PreTBTTLeadTime,\n\t\t\t\t\tUINT8 TIMByteOffset, UINT8 TIMBytePattern)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf;\n\tUINT32 VarLen;\n\tUINT32 Value;\n\tINT32 Ret;\n\n\t/* Power operation and Power Level */\n\tVarLen = 8;\n\n\tif (PwrOP == RADIO_OFF_ADVANCE)\n\t{\n\t\t/* Listen interval, Pre-TBTT, TIM info */\n\t\tVarLen += 12;\n\t}\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\n\tPos = Buf;\n\n\t/* Power operation */\n\tValue = cpu2le32(PwrOP);\n\tNdisMoveMemory(Pos, &Value, 4);\n\tPos += 4;\n\n\t/* Power Level */\n\tValue = cpu2le32(PwrLevel);\n\tNdisMoveMemory(Pos, &Value, 4);\n\tPos += 4;\n\n\tif ( (PwrOP == RADIO_OFF_ADVANCE) || (PwrOP == RADIO_OFF_AUTO_WAKEUP))\n\t{\n\t\t/* Listen interval */\n\t\tValue = cpu2le32(ListenInterval);\n\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\tPos += 4;\n\n\n\t\t/* Pre TBTT lead time */\n\t\tValue = cpu2le32(PreTBTTLeadTime);\n\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\tPos += 4;\n\t}\n\n\tif (PwrOP == RADIO_OFF_ADVANCE)\n\t{\n\t\t/* TIM Info */\n\t\tValue = (Value & ~0x000000ff) | TIMBytePattern;\n\t\tValue = (Value & ~0x0000ff00) | (TIMByteOffset << 8);\n\t\tValue = cpu2le32(Value);\n\t\tNdisMoveMemory(Pos, &Value, 4);\n\t\tPos += 4;\n\t}\n\n\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\tCmdUnit.u.ANDES.Type = CMD_POWER_SAVING_OP;\n\tCmdUnit.u.ANDES.CmdPayloadLen = VarLen;\n\tCmdUnit.u.ANDES.CmdPayload = Buf;\n\n\tCmdUnit.u.ANDES.NeedRsp = FALSE;\n\tCmdUnit.u.ANDES.NeedWait = FALSE;\n\t\t\n\tCmdUnit.u.ANDES.Timeout = 0;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesFunSetOP(PRTMP_ADAPTER pAd, UINT32 FunID, UINT32 Param)\n{\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf;\n\tUINT32 VarLen;\n\tUINT32 Value;\n\tINT32 Ret;\n\n\t/* Function ID and Parameter */\n\tVarLen = 8;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\n\tPos = Buf;\n\t\n\t/* Function ID */\n\tValue = cpu2le32(FunID);\n\tNdisMoveMemory(Pos, &Value, 4);\n\tPos += 4;\n\n\t/* Parameter */\n\tValue = cpu2le32(Param);\n\tNdisMoveMemory(Pos, &Value, 4);\n\tPos += 4;\n\t\n\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\tCmdUnit.u.ANDES.Type = CMD_FUN_SET_OP;\n\tCmdUnit.u.ANDES.CmdPayloadLen = VarLen;\n\tCmdUnit.u.ANDES.CmdPayload = Buf;\n\n\tif ( FunID == 5  )\n\t{\n\t\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\t\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\t\tCmdUnit.u.ANDES.Timeout = 0;\n\t}\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT AndesCalibrationOP(PRTMP_ADAPTER pAd, UINT32 CalibrationID, UINT32 Param)\n{\n\n\tstruct CMD_UNIT CmdUnit;\n\tCHAR *Pos, *Buf;\n\tUINT32 VarLen;\n\tUINT32 Value;\n\tINT32 Ret;\n\n\t/* Calibration ID and Parameter */\n\tVarLen = 8;\n\n\tos_alloc_mem(pAd, (UCHAR **)&Buf, VarLen);\n\n\tPos = Buf;\n\t\n\t/* Calibration ID */\n\tValue = cpu2le32(CalibrationID);\n\tNdisMoveMemory(Pos, &Value, 4);\n\tPos += 4;\n\n\t/* Parameter */\n\tValue = cpu2le32(Param);\n\tNdisMoveMemory(Pos, &Value, 4);\n\tPos += 4;\n\t\n\tNdisZeroMemory(&CmdUnit, sizeof(CmdUnit));\n\t\n\tCmdUnit.u.ANDES.Type = CMD_CALIBRATION_OP;\n\tCmdUnit.u.ANDES.CmdPayloadLen = VarLen;\n\tCmdUnit.u.ANDES.CmdPayload = Buf;\n\t\n\tCmdUnit.u.ANDES.NeedRsp = TRUE;\n\tCmdUnit.u.ANDES.NeedWait = TRUE;\n\tCmdUnit.u.ANDES.Timeout = 0;\n\n\tRet = AsicSendCmdToAndes(pAd, &CmdUnit);\n\n\tos_free_mem(NULL, Buf);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/mcu/rtmp_mcu.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_mcu.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho         When          What\n\t--------    ----------    ----------------------------------------------\n*/\n\n\n#include\t\"rt_config.h\"\n\nINT MCUBurstWrite(PRTMP_ADAPTER pAd, UINT32 Offset, UINT32 *Data, UINT32 Cnt)\n{\n\tRTUSBMultiWrite_nBytes(pAd, Offset, Data, Cnt * 4, 64); \n}\n\nINT MCURandomWrite(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num)\n{\n\tUINT32 Index;\n\t\n\tfor (Index = 0; Index < Num; Index++)\n\t\tRTMP_IO_WRITE32(pAd, RegPair->Register, RegPair->Value);\n}\n\nVOID ChipOpsMCUHook(PRTMP_ADAPTER pAd, enum MCU_TYPE MCUType)\n{\n\n\tRTMP_CHIP_OP *pChipOps = &pAd->chipOps;\n\n\n\tif (MCUType == M8051) \n\t{\n\t\tpChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;\n\t\tpChipOps->BurstWrite = MCUBurstWrite;\n\t\tpChipOps->RandomWrite = MCURandomWrite;\n\t}\n\n#ifdef CONFIG_ANDES_SUPPORT\n\tif (MCUType == ANDES) \n\t{\n\n#ifdef RTMP_USB_SUPPORT\n\t\tpChipOps->loadFirmware = USBLoadFirmwareToAndes;\n#endif\n\t\t//pChipOps->sendCommandToMcu = AsicSendCmdToAndes;\n\t\tpChipOps->Calibration = AndesCalibrationOP;\n\t\tpChipOps->BurstWrite =  AndesBurstWrite;\n\t\tpChipOps->BurstRead = AndesBurstRead;\n\t\tpChipOps->RandomRead = AndesRandomRead;\n\t\tpChipOps->RFRandomRead = AndesRFRandomRead;\n\t\tpChipOps->ReadModifyWrite = AndesReadModifyWrite;\n\t\tpChipOps->RFReadModifyWrite = AndesRFReadModifyWrite;\n\t\tpChipOps->RandomWrite = AndesRandomWrite;\n\t\tpChipOps->RFRandomWrite = AndesRFRandomWrite;\n\t\tpChipOps->PwrSavingOP = AndesPwrSavingOP;\n\t}\n#endif\n}\n"
  },
  {
    "path": "src/mgmt/mgmt_dev.c",
    "content": "/*\n\n*/\n\n#include \"rt_config.h\"\n\n\nstruct wifi_dev *get_wdev_by_idx(RTMP_ADAPTER *pAd, INT idx)\n{\n\tstruct wifi_dev *wdev = NULL;\n\t\n\tdo\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (idx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\n\t\t\twdev = &pAd->ApCfg.MBSSID[idx - MIN_NET_DEVICE_FOR_P2P_GO].wdev;\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\t\n\t\tif (idx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\t\t\t\t\n\t\t\tidx -= MIN_NET_DEVICE_FOR_APCLI;\t\t\n\t\t\tif (idx < MAX_APCLI_NUM)\n\t\t\t{\n\t\t\t\twdev = &pAd->ApCfg.ApCliTab[idx].wdev;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n#endif /* APCLI_SUPPORT */\n\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\n\t\t\tif ((idx < pAd->ApCfg.BssidNum) && (idx < MAX_MBSSID_NUM(pAd)) && (idx < HW_BEACON_MAX_NUM))\n\t\t\t\twdev = &pAd->ApCfg.MBSSID[idx].wdev;\n\n\t\t\tbreak;\n\t\t}\t\t\t\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\twdev = &pAd->StaCfg.wdev;\n\t\t\tbreak;\n\t\t}\t\n#endif /* CONFIG_STA_SUPPORT */\n\t} while (FALSE);\n\n\tif (wdev == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPSetIndividualHT: invalid idx(%d)\\n\", idx));\n\t}\n\n\treturn wdev;\n}\n\n"
  },
  {
    "path": "src/mgmt/mgmt_entrytb.c",
    "content": "/*\n\n*/\n\n#include <rt_config.h>\n\n\nVOID set_entry_phy_cfg(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)\n{\n\n\tif (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE)\n\t{\n\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_CCK;\n\t\tpEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate;\n\t\tpEntry->MinHTPhyMode.field.MODE = MODE_CCK;\n\t\tpEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate;\n\t\tpEntry->HTPhyMode.field.MODE = MODE_CCK;\n\t\tpEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate;\n\t}\n\telse\n\t{\n\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_OFDM;\n\t\tpEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];\n\t\tpEntry->MinHTPhyMode.field.MODE = MODE_OFDM;\n\t\tpEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];\n\t\tpEntry->HTPhyMode.field.MODE = MODE_OFDM;\n\t\tpEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];\n\t}\n}\n\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tLook up the MAC address in the MAC table. Return NULL if not found.\n\tReturn:\n\t\tpEntry - pointer to the MAC entry; NULL is not found\n\t==========================================================================\n*/\nMAC_TABLE_ENTRY *MacTableLookup(\n\tIN PRTMP_ADAPTER pAd,\n\tPUCHAR pAddr)\n{\n\tULONG HashIdx;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\n\tHashIdx = MAC_ADDR_HASH_INDEX(pAddr);\n\tpEntry = pAd->MacTab.Hash[HashIdx];\n\n\twhile (pEntry && !IS_ENTRY_NONE(pEntry))\n\t{\n\t\tif (MAC_ADDR_EQUAL(pEntry->Addr, pAddr))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t\tpEntry = pEntry->pNext;\n\t}\n\n\treturn pEntry;\n}\n\n\nMAC_TABLE_ENTRY *MacTableInsertEntry(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR\t\t\tpAddr,\n\tIN\tUCHAR\t\t\tapidx,\n\tIN\tUCHAR\t\t\tOpMode,\n\tIN BOOLEAN\tCleanAll)\n{\n\tUCHAR HashIdx;\n\tint i, FirstWcid;\n\tMAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;\n/*\tUSHORT\toffset;*/\n/*\tULONG\taddr;*/\n\tBOOLEAN Cancelled;\n\n\t/* if FULL, return*/\n\tif (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn NULL;\n\n\t\tFirstWcid = 1;\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\tFirstWcid = 2;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* allocate one MAC entry*/\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\tfor (i = FirstWcid; i< MAX_LEN_OF_MAC_TABLE; i++)   /* skip entry#0 so that \"entry index == AID\" for fast lookup*/\n\t{\n\t\t/* pick up the first available vacancy*/\n\t\tif (IS_ENTRY_NONE(&pAd->MacTab.Content[i]))\n\t\t{\n\t\t\tpEntry = &pAd->MacTab.Content[i];\n\n\t\t\t/* ENTRY PREEMPTION: initialize the entry */\n\t\t\tRTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n\t\t\tRTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n\n\t\t\tNdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));\n\n\t\t\tif (CleanAll == TRUE)\n\t\t\t{\n\t\t\t\tpEntry->MaxSupportedRate = RATE_11;\n\t\t\t\tpEntry->CurrTxRate = RATE_11;\n\t\t\t\tNdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));\n\t\t\t\tpEntry->PairwiseKey.KeyLen = 0;\n\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_NONE;\n\t\t\t}\n\n\t\t\tdo\n\t\t\t{\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\t\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t\t{\n\t\t\t\t\tSET_ENTRY_CLIENT(pEntry);\n\t\t\t\t\tpEntry->isCached = FALSE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif /* P2P_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tif (apidx >= MIN_NET_DEVICE_FOR_TDLS)\n\t\t\t{\n\t\t\t\tSET_ENTRY_TDLS(pEntry);\n\t\t\t\tpEntry->isCached = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n#endif /* DOT11Z_TDLS_SUPPORT */\n#ifdef QOS_DLS_SUPPORT\n\t\t\tif (apidx >= MIN_NET_DEVICE_FOR_DLS)\n\t\t\t{\n\t\t\t\tSET_ENTRY_DLS(pEntry);\n\t\t\t\tpEntry->isCached = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\t\t\t\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\t\t\t{\n\t\t\t\t\t\tSET_ENTRY_APCLI(pEntry);\n\t\t\t\t\t\tpEntry->isCached = FALSE;\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tSET_P2P_CLI_ENTRY(pEntry);\n\t\t\t\t\t\tpAd->P2pCfg.MyGOwcid = i;\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\t\t\tif (OpMode == OPMODE_AP)\n#else\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t{\t/* be a regular-entry*/\n\t\t\t\t\t\tif ((apidx < pAd->ApCfg.BssidNum) &&\n\t\t\t\t\t\t\t(apidx < MAX_MBSSID_NUM(pAd)) &&\n\t\t\t\t\t\t\t((apidx < HW_BEACON_MAX_NUM)) &&\n\t\t\t\t\t\t\t(pAd->ApCfg.MBSSID[apidx].MaxStaNum != 0) &&\n\t\t\t\t\t\t\t(pAd->ApCfg.MBSSID[apidx].StaCount >= pAd->ApCfg.MBSSID[apidx].MaxStaNum))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s: The connection table is full in ra%d.\\n\", __FUNCTION__, apidx));\n\t\t\t\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\t\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t\t}\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tSET_P2P_GO_ENTRY(pEntry);\n#endif /* P2P_SUPPORT */\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t\t\tSET_ENTRY_CLIENT(pEntry);\n\n#ifdef IWSC_SUPPORT\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t\t{\n\t\t\t\t\tpEntry->bIWscSmpbcAccept = FALSE;\n\t\t\t\t\tpEntry->bUpdateInfoFromPeerBeacon = FALSE;\n\t\t\t\t}\n#endif // CONFIG_STA_SUPPORT //\n#endif // IWSC_SUPPORT //\n\t\t} while (FALSE);\n\n\t\t\tpEntry->bIAmBadAtheros = FALSE;\n\n\t\t\tRTMPInitTimer(pAd, &pEntry->EnqueueStartForPSKTimer, GET_TIMER_FUNCTION(EnqueueStartForPSKExec), pEntry, FALSE);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n    \t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n    \t\t    RTMPInitTimer(pAd, &pEntry->WPA_Authenticator.MsgRetryTimer, GET_TIMER_FUNCTION(Adhoc_WpaRetryExec), pEntry, FALSE);\n            }\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (OpMode == OPMODE_AP)\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t{\n\t\t\t\tif (IS_ENTRY_CLIENT(pEntry)) /* Only Clent entry need the retry timer.*/\n\t\t\t\t{\n\t\t\t\t\tRTMPInitTimer(pAd, &pEntry->RetryTimer, GET_TIMER_FUNCTION(WPARetryExec), pEntry, FALSE);\n\n\t/*\t\t\t\tRTMP_OS_Init_Timer(pAd, &pEntry->RetryTimer, GET_TIMER_FUNCTION(WPARetryExec), pAd);*/\n\t\t\t\t}\n#ifdef APCLI_SUPPORT\n\t\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t{\n\t\t\t\t\tRTMPInitTimer(pAd, &pEntry->RetryTimer, GET_TIMER_FUNCTION(WPARetryExec), pEntry, FALSE);\n\t\t\t\t}\n#endif /* APCLI_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t\tRTMPInitTimer(pAd, &pEntry->eTxBfProbeTimer, GET_TIMER_FUNCTION(eTxBfProbeTimerExec), pEntry, FALSE);\n#endif /* TXBF_SUPPORT */\n\n\t\t\tpEntry->pAd = pAd;\n\t\t\tpEntry->CMTimerRunning = FALSE;\n\t\t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;\n\t\t\tpEntry->RSNIE_Len = 0;\n\t\t\tNdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));\n\t\t\tpEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;\n\n\t\t\tif (IS_ENTRY_MESH(pEntry))\n\t\t\t\tpEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_MESH);\n\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t\tpEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI);\n\t\t\telse if (IS_ENTRY_WDS(pEntry))\n\t\t\t\tpEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS);\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\n\t\t\telse if (IS_ENTRY_DLS(pEntry))\n\t\t\t\tpEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_DLS);\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\telse if (IS_ENTRY_TDLS(pEntry))\n\t\t\t\tpEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_TDLS);\n#endif /* DOT11Z_TDLS_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\telse if (apidx == MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t\tpEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_P2P_GO);\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\telse\n\t\t\t\tpEntry->apidx = apidx;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif ((apidx < pAd->ApCfg.BssidNum) &&\n\t\t\t\t(apidx < MAX_MBSSID_NUM(pAd)) &&\n\t\t\t\t(apidx < HW_BEACON_MAX_NUM))\n\t\t\t\tpEntry->pMbss = &pAd->ApCfg.MBSSID[pEntry->apidx];\n\t\t\telse\n\t\t\t\tpEntry->pMbss = NULL;\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\tdo\n\t\t\t{\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n\t\t\t\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry->AuthMode = pAd->ApCfg.ApCliTab[pEntry->apidx].AuthMode;\n\t\t\t\t\t\tpEntry->WepStatus = pAd->ApCfg.ApCliTab[pEntry->apidx].WepStatus;\n\t\t\t\t\t\n\t\t\t\t\t\tif (pEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry->WpaState = AS_NOTUSE;\n\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry->WpaState = AS_PTKSTART;\n\t\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpEntry->MatchAPCLITabIdx = pEntry->apidx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\t\t\tif (OpMode == OPMODE_AP)\n#else\n\t\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t{\n\t\t\t\t\t\tMBSS_MR_APIDX_SANITY_CHECK(pAd, apidx);\n\t\t\t\t\t\tpEntry->AuthMode = pAd->ApCfg.MBSSID[apidx].AuthMode;\n\t\t\t\t\t\tpEntry->WepStatus = pAd->ApCfg.MBSSID[apidx].WepStatus;\n\t\t\t\t\t\tpEntry->GroupKeyWepStatus = pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus;\n\t\t\t\t\t\n\t\t\t\t\t\tif (pEntry->AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\t\t\tpEntry->WpaState = AS_NOTUSE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpEntry->WpaState = AS_INITIALIZE;\n\n\t\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t\t\tpEntry->StaIdleTimeout = pAd->ApCfg.StaIdleTimeout;\n\t\t\t\t\t\tpAd->ApCfg.MBSSID[apidx].StaCount++;\n\t\t\t\t\t\tpAd->ApCfg.EntryClientCount++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\t\t\tif (OpMode == OPMODE_STA)\n#else\n\t\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tpEntry->AuthMode = pAd->StaCfg.AuthMode;\n\t\t\t\t\tpEntry->WepStatus = pAd->StaCfg.WepStatus;\n\t\t\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t} while (FALSE);\n\n\t\t\tpEntry->GTKState = REKEY_NEGOTIATING;\n\t\t\tpEntry->PairwiseKey.KeyLen = 0;\n\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_NONE;\n#ifdef CONFIG_STA_SUPPORT\n#ifdef QOS_DLS_SUPPORT\n\t\t\tif (IS_ENTRY_DLS(pEntry))\n\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\telse\n#endif /* QOS_DLS_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n\t\t\tpEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND;\n\t\t\tCOPY_MAC_ADDR(pEntry->Addr, pAddr);\n\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr1, pAddr);\n\n\t\t\tdo\n\t\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t\t\t{\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr2, pAd->ApCfg.ApCliTab[pEntry->apidx].CurrentAddress);\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr3, pAddr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif // APCLI_SUPPORT //\n#ifdef P2P_SUPPORT\n\t\t\t\tif (apidx == MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t\t\t{\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr2, pAd->P2PCurrentAddress);\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr3, pAd->P2PCurrentAddress);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif /* P2P_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tif (OpMode == OPMODE_AP)\n\t\t\t\t{\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr2, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr3, pAd->ApCfg.MBSSID[apidx].Bssid);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif // CONFIG_AP_SUPPORT //\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\tif (OpMode == OPMODE_STA)\n\t\t\t\t{\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr2, pAd->CurrentAddress);\n\t\t\t\t\tCOPY_MAC_ADDR(pEntry->HdrAddr3, pAddr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif // CONFIG_STA_SUPPORT //\n\t\t\t} while (FALSE);\n\n\t\t\tpEntry->Sst = SST_NOT_AUTH;\n\t\t\tpEntry->AuthState = AS_NOT_AUTH;\n\t\t\tpEntry->Aid = (USHORT)i;  /*0;*/\n\t\t\tpEntry->CapabilityInfo = 0;\n\t\t\tpEntry->PsMode = PWR_ACTIVE;\n\t\t\tpEntry->PsQIdleCount = 0;\n\t\t\tpEntry->NoDataIdleCount = 0;\n\t\t\tpEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT;\n\t\t\tpEntry->ContinueTxFailCnt = 0;\n\t\t\tpEntry->TimeStamp_toTxRing = 0;\n\t\t\tInitializeQueueHeader(&pEntry->PsQueue);\n\n#ifdef STREAM_MODE_SUPPORT\n\t\t\t/* Enable Stream mode for first three entries in MAC table */\n\n#endif /* STREAM_MODE_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (OpMode == OPMODE_AP)\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t{\n#ifdef UAPSD_SUPPORT\n\t\t\t\tif (IS_ENTRY_CLIENT(pEntry)) /* Ralink WDS doesn't support any power saving.*/\n\t\t\t\t{\n\t\t\t\t\t/* init U-APSD enhancement related parameters */\n\t\t\t\t\tUAPSD_MR_ENTRY_INIT(pEntry);\n\t\t\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\tpAd->MacTab.Size ++;\n\n\t\t\t/* Set the security mode of this entry as OPEN-NONE in ASIC */\n\t\t\tRTMP_REMOVE_PAIRWISE_KEY_ENTRY(pAd, (UCHAR)i);\n\n\t\t\t/* Add this entry into ASIC RX WCID search table */\n\t\t\tRTMP_STA_ENTRY_ADD(pAd, pEntry);\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\t\tif (OpMode == OPMODE_AP)\n#else\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t\t{\n#ifdef WSC_AP_SUPPORT\n\t\t\t\tpEntry->bWscCapable = FALSE;\n\t\t\t\tpEntry->Receive_EapolStart_EapRspId = 0;\n#endif /* WSC_AP_SUPPORT */\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t\tNdisAllocateSpinLock(pAd, &pEntry->TxSndgLock);\n#endif /* TXBF_SUPPORT */\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTableInsertEntry - allocate entry #%d, Total= %d\\n\",i, pAd->MacTab.Size));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* add this MAC entry into HASH table */\n\tif (pEntry)\n\t{\n#ifdef IWSC_SUPPORT\n\t\tPWSC_PEER_ENTRY pWscPeerEntry = NULL;\n#endif /* IWSC_SUPPORT */\n\n\t\tHashIdx = MAC_ADDR_HASH_INDEX(pAddr);\n\t\tif (pAd->MacTab.Hash[HashIdx] == NULL)\n\t\t{\n\t\t\tpAd->MacTab.Hash[HashIdx] = pEntry;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpCurrEntry = pAd->MacTab.Hash[HashIdx];\n\t\t\twhile (pCurrEntry->pNext != NULL)\n\t\t\t\tpCurrEntry = pCurrEntry->pNext;\n\t\t\tpCurrEntry->pNext = pEntry;\n\t\t}\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (OpMode == OPMODE_AP)\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\n#ifdef WSC_AP_SUPPORT\n\t\t\tif (IS_ENTRY_CLIENT(pEntry) &&\n\t\t\t\t(pEntry->apidx < pAd->ApCfg.BssidNum) &&\n\t\t\t\tMAC_ADDR_EQUAL(pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr))\n\t\t\t{\n\t\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.EntryAddr, MAC_ADDR_LEN);\n\t\t\t}\n#endif /* WSC_AP_SUPPORT */\n\n\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef IWSC_SUPPORT\n\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t{\n\t\t\tpWscPeerEntry = WscFindPeerEntry(&pAd->StaCfg.WscControl.WscPeerList, pEntry->Addr);\n\t\t\tif (pWscPeerEntry && pWscPeerEntry->bIWscSmpbcAccept)\n\t\t\t{\n\t\t\t\tIWSC_AddSmpbcEnrollee(pAd, pEntry->Addr);\n\t\t\t}\n\t\t}\n#endif /* IWSC_SUPPORT */\n\n\t}\n\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\treturn pEntry;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tDelete a specified client from MAC table\n\t==========================================================================\n */\nBOOLEAN MacTableDeleteEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT wcid,\n\tIN PUCHAR pAddr)\n{\n\tUSHORT HashIdx;\n\tMAC_TABLE_ENTRY *pEntry, *pPrevEntry, *pProbeEntry;\n\tBOOLEAN Cancelled;\n\t/*USHORT\toffset;\t unused variable*/\n\t/*UCHAR\tj;\t\t\t unused variable*/\n\n\tif (wcid >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn FALSE;\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\n\tHashIdx = MAC_ADDR_HASH_INDEX(pAddr);\n\t/*pEntry = pAd->MacTab.Hash[HashIdx];*/\n\tpEntry = &pAd->MacTab.Content[wcid];\n\n\tif (pEntry && !IS_ENTRY_NONE(pEntry))\n\t{\n\t\t/* ENTRY PREEMPTION: Cancel all timers */\n\t\tRTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);\n\t\tRTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n\n\t\tif (MAC_ADDR_EQUAL(pEntry->Addr, pAddr))\n\t\t{\n\n\t\t\t/* Delete this entry from ASIC on-chip WCID Table*/\n\t\t\tRTMP_STA_ENTRY_MAC_RESET(pAd, wcid);\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* free resources of BA*/\n\t\t\tBASessionTearDownALL(pAd, pEntry->Aid);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t\tRTMPReleaseTimer(&pEntry->eTxBfProbeTimer, &Cancelled);\n#endif /* TXBF_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n\t\t\t/* Clear Stream Mode register for this client */\n\t\t\tif (pEntry->StreamModeMACReg != 0)\n\t\t\t\tRTMP_IO_WRITE32(pAd, pEntry->StreamModeMACReg+4, 0);\n#endif // STREAM_MODE_SUPPORT //\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tRTMPReleaseTimer(&pEntry->WPA_Authenticator.MsgRetryTimer, &Cancelled);\n\t\t\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tif (IS_ENTRY_CLIENT(pEntry)\n#ifdef P2P_SUPPORT\n\t\t\t\t&& (IS_P2P_GO_ENTRY(pEntry))\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t\t{\n#ifdef DOT1X_SUPPORT \n\t\t\t\tINT\t\tPmkCacheIdx = -1;\n#endif /* DOT1X_SUPPORT */\n\t\t\t\n\t\t\t\tRTMPReleaseTimer(&pEntry->RetryTimer, &Cancelled);\n\n#ifdef DOT1X_SUPPORT    \n\t\t\t\t/* Notify 802.1x daemon to clear this sta info*/\n\t\t\t\tif (pEntry->AuthMode == Ndis802_11AuthModeWPA || \n\t\t\t\t\tpEntry->AuthMode == Ndis802_11AuthModeWPA2 ||\n\t\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].IEEE8021X)\n\t\t\t\t\tDOT1X_InternalCmdAction(pAd, pEntry, DOT1X_DISCONNECT_ENTRY);\n\n\t\t\t\t/* Delete the PMK cache for this entry if it exists.*/\n\t\t    \tif ((PmkCacheIdx = RTMPSearchPMKIDCache(pAd, pEntry->apidx, pEntry->Addr)) != -1)\n\t\t    \t{\n\t\t\t\t\tRTMPDeletePMKIDCache(pAd, pEntry->apidx, PmkCacheIdx);\n\t\t\t\t}\n#endif /* DOT1X_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t\t\t\tRTMPCancelWapiRekeyTimerAction(pAd, pEntry);\n#endif /* WAPI_SUPPORT */\n\n#ifdef IGMP_SNOOP_SUPPORT\n\t\t\t\tIgmpGroupDelMembers(pAd, (PUCHAR)pEntry->Addr, pAd->ApCfg.MBSSID[pEntry->apidx].MSSIDDev);\n#endif /* IGMP_SNOOP_SUPPORT */\n\t\t\t\tpAd->ApCfg.MBSSID[pEntry->apidx].StaCount--;\n\t\t\t\tpAd->ApCfg.EntryClientCount--;\n\n#ifdef HOSTAPD_SUPPORT\n\t\t\t\tif(pEntry && pAd->ApCfg.MBSSID[pEntry->apidx].Hostapd == TRUE )\n\t\t\t\t{\n\t\t\t\t\tRtmpOSWrielessEventSendExt(pAd->net_dev, RT_WLAN_EVENT_EXPIRED, -1, pEntry->Addr,\n\t\t\t\t\t\tNULL, 0,pEntry->apidx);\n\t\t\t\t}\n#endif\n\n\t\t\t}\n#ifdef APCLI_SUPPORT\n\t\t\telse if (IS_ENTRY_APCLI(pEntry))\n\t\t\t{\n\t\t\t\tRTMPReleaseTimer(&pEntry->RetryTimer, &Cancelled);\n\t\t\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n           \n\t\t\tpPrevEntry = NULL;\n\t\t\tpProbeEntry = pAd->MacTab.Hash[HashIdx];\n\t\t\tASSERT(pProbeEntry);\n\t\t\tif (pProbeEntry != NULL)\n\t\t\t{\n\t\t\t\t/* update Hash list*/\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (pProbeEntry == pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pPrevEntry == NULL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->MacTab.Hash[HashIdx] = pEntry->pNext;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpPrevEntry->pNext = pEntry->pNext;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tpPrevEntry = pProbeEntry;\n\t\t\t\t\tpProbeEntry = pProbeEntry->pNext;\n\t\t\t\t} while (pProbeEntry);\n\t\t\t}\n\n\t\t\t/* not found !!!*/\n\t\t\tASSERT(pProbeEntry != NULL);\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tAPCleanupPsQueue(pAd, &pEntry->PsQueue); /* return all NDIS packet in PSQ*/\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t/*RTMP_REMOVE_PAIRWISE_KEY_ENTRY(pAd, wcid);*/\n\n#ifdef UAPSD_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\thex_dump(\"mac=\", pEntry->Addr, 6);\n\t\t\tUAPSD_MR_ENTRY_RESET(pAd, pEntry);\n#else\n#ifdef CONFIG_AP_SUPPORT\n            UAPSD_MR_ENTRY_RESET(pAd, pEntry);\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n\t\tif (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)\n\t\t{\n            RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n\t\t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;\n        }\n\t\tRTMPReleaseTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WSC_AP_SUPPORT\n            if (IS_ENTRY_CLIENT(pEntry))\n            {\n            \tPWSC_CTRL\tpWscControl = &pAd->ApCfg.MBSSID[pEntry->apidx].WscControl;\n            \tif (MAC_ADDR_EQUAL(pEntry->Addr, pWscControl->EntryAddr))\n            \t{\n            \t\t/*\n            \t\t\tSome WPS Client will send dis-assoc close to WSC_DONE. \n            \t\t\tIf AP misses WSC_DONE, WPS Client still sends dis-assoc to AP.\n            \t\t\tDo not cancel timer if WscState is WSC_STATE_WAIT_DONE.\n            \t\t*/\n\t\t\t\t\tif ((pWscControl->EapolTimerRunning == TRUE) &&\n\t\t\t\t\t\t(pWscControl->WscState != WSC_STATE_WAIT_DONE))\n\t\t\t\t\t{\n\t            \t    RTMPCancelTimer(&pWscControl->EapolTimer, &Cancelled);\n\t            \t    pWscControl->EapolTimerRunning = FALSE;\n\t\t\t\t\t\tpWscControl->EapMsgRunning = FALSE;\n\t\t\t\t\t\tNdisZeroMemory(&(pWscControl->EntryAddr[0]), MAC_ADDR_LEN);\n\t\t\t\t\t}            \t    \n            \t}\n            \tpEntry->Receive_EapolStart_EapRspId = 0;\n\t\t\t\tpEntry->bWscCapable = FALSE;\n           \t}\n#endif /* WSC_AP_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n\n//   \t\t\tNdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));\n\t\t\tNdisZeroMemory(pEntry->Addr, MAC_ADDR_LEN);\n\t\t\t/* invalidate the entry */\n\t\t\tSET_ENTRY_NONE(pEntry);\n#ifdef P2P_SUPPORT\n\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t{\n\t\t\t\tif (pEntry->WpaState == AS_PTKINITDONE)\n\t\t\t\tSET_P2P_ENTRY_NONE(pEntry);\n\t\t\t\t/* Legacy is leaving */\n\t\t\t\tif (pEntry->bP2pClient == FALSE)\n\t\t\t\t{\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\t\t\t\tP2pSendWirelessEvent(pAd, RT_P2P_LEGACY_DISCONNECTED, NULL, pEntry->Addr);\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\t\t\t}\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\tpAd->MacTab.Size --;\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t\tNdisFreeSpinLock(&pEntry->TxSndgLock);\n#endif /* TXBF_SUPPORT */\n#ifdef P2P_SUPPORT\n\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t{\n\t\t\t\tUINT32 i, p2pEntryCnt=0;\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\tPWSC_CTRL           pWscControl = &pAd->ApCfg.MBSSID[0].WscControl;\n\n\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tpEntry = &pAd->MacTab.Content[i];\n\t\t\t\t\tif (IS_P2P_GO_ENTRY(pEntry))\n\t\t\t\t\t\tp2pEntryCnt++;\n\t\t\t\t}\n\n\t\t\t\tif ((p2pEntryCnt == 0) && \n\t\t\t\t\t(pWscControl->WscState == WSC_STATE_CONFIGURED) &&\n\t\t\t\t\t(pAd->flg_p2p_OpStatusFlags == P2P_GO_UP))\n\t\t\t\t{\n#ifdef RTMP_MAC_USB\n\t\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_SET_P2P_LINK_DOWN, NULL, 0);\t\n#endif /* RTMP_MAC_USB */\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MacTableDeleteEntry1 - Total= %d. p2pEntry = %d.\\n\", pAd->MacTab.Size, p2pEntryCnt));\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTableDeleteEntry1 - Total= %d\\n\", pAd->MacTab.Size));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%s: Impossible Wcid = %d !!!!!\\n\", __FUNCTION__, wcid));\n\t\t}\n\t}\n\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\t/*Reset operating mode when no Sta.*/\n\tif (pAd->MacTab.Size == 0)\n\t{\n#ifdef DOT11_N_SUPPORT\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;\n#endif /* DOT11_N_SUPPORT */\n\t\tRTMP_UPDATE_PROTECT(pAd, 0, ALLN_SETPROTECT, TRUE, 0);\n\t}\n#ifdef CONFIG_AP_SUPPORT\n\t/*APUpdateCapabilityAndErpIe(pAd);*/\n\tRTMP_AP_UPDATE_CAPABILITY_AND_ERPIE(pAd);  /* edit by johnli, fix \"in_interrupt\" error when call \"MacTableDeleteEntry\" in Rx tasklet*/\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine reset the entire MAC table. All packets pending in\n\t\tthe power-saving queues are freed here.\n\t==========================================================================\n */\nVOID MacTableReset(\n\tIN  PRTMP_ADAPTER  pAd)\n{\n\tint         i;\n\tBOOLEAN     Cancelled;    \n#ifdef CONFIG_AP_SUPPORT\n\tPUCHAR      pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG       FrameLen = 0;\n\tHEADER_802_11 DeAuthHdr;\n\tUSHORT      Reason;\n    UCHAR       apidx = MAIN_MBSSID;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"MacTableReset\\n\"));\n\t/*NdisAcquireSpinLock(&pAd->MacTabLock);*/\n\n\n\tfor (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))\n\t   {\n\t   \t\t/* Delete a entry via WCID */\n\n\t\t\t/*MacTableDeleteEntry(pAd, i, pAd->MacTab.Content[i].Addr);*/\n\t\t\tRTMPReleaseTimer(&pAd->MacTab.Content[i].EnqueueStartForPSKTimer, &Cancelled);\n#ifdef CONFIG_STA_SUPPORT\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t\t{\n\t\t\t\tRTMPReleaseTimer(&pAd->MacTab.Content[i].WPA_Authenticator.MsgRetryTimer, &Cancelled);\n            }\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n            pAd->MacTab.Content[i].EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;\n\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t\t{\n\t\t\t\t/* Before reset MacTable, send disassociation packet to client.*/\n\t\t\t\tif (pAd->MacTab.Content[i].Sst == SST_ASSOC)\n\t\t\t\t{\n\t\t\t\t\t/*  send out a De-authentication request frame*/\n\t\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" MlmeAllocateMemory fail  ..\\n\"));\n\t\t\t\t\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock);*/\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tReason = REASON_NO_LONGER_VALID;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"Send DEAUTH - Reason = %d frame tO %02x:%02x:%02x:%02x:%02x:%02x \\n\",Reason, PRINT_MAC(pAd->MacTab.Content[i].Addr)));\n\t\t\t\t\tMgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pAd->MacTab.Content[i].Addr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pAd->MacTab.Content[i].apidx].Bssid,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.MBSSID[pAd->MacTab.Content[i].apidx].Bssid);\n\t\t\t    \tMakeOutgoingFrame(pOutBuffer,            &FrameLen,\n\t\t\t    \t                  sizeof(HEADER_802_11), &DeAuthHdr,\n\t\t\t    \t                  2,                     &Reason,\n\t\t\t    \t                  END_OF_ARGS);\n\n\t\t\t    \tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t    \tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t\t\tRTMPusecDelay(5000);\n\t\t\t\t}\n\t\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\t\t/* Delete a entry via WCID */\n\t\t\tMacTableDeleteEntry(pAd, i, pAd->MacTab.Content[i].Addr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Delete a entry via WCID */\n\t\t\tMacTableDeleteEntry(pAd, i, pAd->MacTab.Content[i].Addr);\n\t\t}\n\t}\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tfor (apidx = MAIN_MBSSID; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\n#ifdef WSC_AP_SUPPORT\n\t\t\tBOOLEAN Cancelled;\n\t\t\t\n\t    \tRTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx].WscControl.EapolTimer, &Cancelled);\n\t    \tpAd->ApCfg.MBSSID[apidx].WscControl.EapolTimerRunning = FALSE;\n\t\t\tNdisZeroMemory(pAd->ApCfg.MBSSID[apidx].WscControl.EntryAddr, MAC_ADDR_LEN);\n\t    \tpAd->ApCfg.MBSSID[apidx].WscControl.EapMsgRunning = FALSE;\n#endif /* WSC_AP_SUPPORT */\n\t\t\tpAd->ApCfg.MBSSID[apidx].StaCount = 0; \n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"McastPsQueue.Number %ld...\\n\",pAd->MacTab.McastPsQueue.Number));\n\t\tif (pAd->MacTab.McastPsQueue.Number > 0)\n\t\t\tAPCleanupPsQueue(pAd, &pAd->MacTab.McastPsQueue);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"2McastPsQueue.Number %ld...\\n\",pAd->MacTab.McastPsQueue.Number));\n\n\t\t/* ENTRY PREEMPTION: Zero Mac Table but entry's content */\n/*\t\tNdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));*/\n\t\tNdisZeroMemory(&pAd->MacTab.Size,\n\t\t\t\t\t\tsizeof(MAC_TABLE)-\n\t\t\t\t\t\t\tsizeof(pAd->MacTab.Hash)-\n\t\t\t\t\t\t\tsizeof(pAd->MacTab.Content));\n\n\t\tInitializeQueueHeader(&pAd->MacTab.McastPsQueue);\n\t\t/*NdisReleaseSpinLock(&pAd->MacTabLock);*/\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\treturn;\n}\n\n"
  },
  {
    "path": "src/mgmt/mgmt_ht.c",
    "content": "/*\n\n\n*/\n\n\n#include \"rt_config.h\"\n\n\n#ifdef DOT11_N_SUPPORT\n\n\nINT ht_mode_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, HT_CAPABILITY_IE *peer, RT_HT_CAPABILITY *my)\n{\n\tif ((peer->HtCapInfo.GF) && (my->GF))\n\t{\n\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t}\n\telse\n\t{\t\n\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;\n\t\tpAd->MacTab.fAnyStationNonGF = TRUE;\n\t}\n\n\tif ((peer->HtCapInfo.ChannelWidth) && (my->ChannelWidth))\n\t{\n\t\tpEntry->MaxHTPhyMode.field.BW= BW_40;\n\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((my->ShortGIfor40) & (peer->HtCapInfo.ShortGIfor40));\n\t}\n\telse\n\t{\t\n\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((my->ShortGIfor20) & (peer->HtCapInfo.ShortGIfor20));\n\t\tpAd->MacTab.fAnyStation20Only = TRUE;\n\t}\n\t\t\t\t\n\treturn TRUE;\n}\n\n\nINT set_ht_fixed_mcs(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, UCHAR fixed_mcs, UCHAR mcs_bound)\n{\n\tif (fixed_mcs == 32)\n\t{\n\t\t/* Fix MCS as HT Duplicated Mode */\n\t\tpEntry->MaxHTPhyMode.field.BW = 1;\n\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\tpEntry->MaxHTPhyMode.field.STBC = 0;\n\t\tpEntry->MaxHTPhyMode.field.ShortGI = 0;\n\t\tpEntry->MaxHTPhyMode.field.MCS = 32;\n\t}\n\telse if (pEntry->MaxHTPhyMode.field.MCS > mcs_bound)\n\t{\n\t\t/* STA supports fixed MCS */\n\t\tpEntry->MaxHTPhyMode.field.MCS = mcs_bound;\n\t}\n\n\treturn TRUE;\n}\n\n\nINT get_ht_max_mcs(RTMP_ADAPTER *pAd, UCHAR *desire_mcs, UCHAR *cap_mcs)\n{\n\tINT i, j;\n\tUCHAR bitmask;\n\n\n\tfor (i=23; i>=0; i--)\n\t{\t\n\t\tj = i/8;\t\n\t\tbitmask = (1<<(i-(j*8)));\n\t\tif ((desire_mcs[j] & bitmask) && (cap_mcs[j] & bitmask))\n\t\t{\n\t\t\t/*pEntry->MaxHTPhyMode.field.MCS = i; */\n\t\t\t/* find it !!*/\n\t\t\tbreak;\n\t\t}\n\t\tif (i==0)\n\t\t\tbreak;\n\t}\n\n\treturn i;\n}\n\n\nINT get_ht_cent_ch(RTMP_ADAPTER *pAd, UCHAR *rf_bw, UCHAR *ext_ch)\n{\n\tif ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) && \n\t\t(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t)\n\t{\n\t\t*rf_bw = BW_40;\n\t\t*ext_ch = EXTCHA_ABOVE;\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;\n\t}\n\telse if ((pAd->CommonCfg.Channel > 2) && \n\t\t\t(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) && \n\t\t\t(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW))\n\t{\n\t\t*rf_bw = BW_40;\n\t\t*ext_ch = EXTCHA_BELOW;\n\t\tif (pAd->CommonCfg.Channel == 14)\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 1;\n\t\telse\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;\n\t} else {\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\nUCHAR get_cent_ch_by_htinfo(\n\tRTMP_ADAPTER *pAd,\n\tADD_HT_INFO_IE *ht_op,\n\tHT_CAPABILITY_IE *ht_cap)\n{\n\tUCHAR cent_ch;\n\t\n\tif ((ht_op->ControlChan > 2)&&\n\t\t(ht_op->AddHtInfo.ExtChanOffset == EXTCHA_BELOW) &&\n\t\t(ht_cap->HtCapInfo.ChannelWidth == BW_40))\n\t\tcent_ch = ht_op->ControlChan - 2;\n\telse if ((ht_op->AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) &&\n\t\t(ht_cap->HtCapInfo.ChannelWidth == BW_40))\n\t\tcent_ch = ht_op->ControlChan + 2;\n\telse\n\t\tcent_ch = ht_op->ControlChan;\n\t\n\treturn cent_ch;\n}\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tCaller ensures we has 802.11n support.\n\t\tCalls at setting HT from AP/STASetinformation\n\n\tArguments:\n\t\tpAd - Pointer to our adapter\n\t\tphymode  - \n\n\t========================================================================\n*/\nVOID RTMPSetHT(\n\tIN RTMP_ADAPTER *pAd,\n\tIN OID_SET_HT_PHYMODE *pHTPhyMode)\n{\n\tUCHAR RxStream = pAd->CommonCfg.RxStream;\n#ifdef CONFIG_AP_SUPPORT\n\tINT apidx;\n#endif /* CONFIG_AP_SUPPORT */\n\tINT bw;\n\tRT_HT_CAPABILITY *rt_ht_cap = &pAd->CommonCfg.DesiredHtPhy;\n\tHT_CAPABILITY_IE *ht_cap= &pAd->CommonCfg.HtCapability;\n\t\n#ifdef CONFIG_AP_SUPPORT\n\t/* sanity check for extention channel */\n\tif (CHAN_PropertyCheck(pAd, pAd->CommonCfg.Channel,\n\t\t\t\t\t\tCHANNEL_NO_FAT_BELOW | CHANNEL_NO_FAT_ABOVE) == TRUE)\n\t{\n\t\t/* only 20MHz is allowed */\n\t\tpHTPhyMode->BW = 0;\n\t}\n\telse if (pHTPhyMode->ExtOffset == EXTCHA_BELOW)\n\t{\n\t\t/* extension channel below this channel is not allowed */\n\t\tif (CHAN_PropertyCheck(pAd, pAd->CommonCfg.Channel,\n\t\t\t\t\t\tCHANNEL_NO_FAT_BELOW) == TRUE)\n\t\t{\n\t\t\tpHTPhyMode->ExtOffset = EXTCHA_ABOVE;\n\t\t}\n\t}\n\telse if (pHTPhyMode->ExtOffset == EXTCHA_ABOVE)\n\t{\n\t\t/* extension channel above this channel is not allowed */\n\t\tif (CHAN_PropertyCheck(pAd, pAd->CommonCfg.Channel,\n\t\t\t\t\t\tCHANNEL_NO_FAT_ABOVE) == TRUE)\n\t\t{\n\t\t\tpHTPhyMode->ExtOffset = EXTCHA_BELOW;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\\n\",\n\t\t\t\t\t\t\t\t\t\tpHTPhyMode->HtMode, pHTPhyMode->ExtOffset, \n\t\t\t\t\t\t\t\t\t\tpHTPhyMode->MCS, pHTPhyMode->BW,\n\t\t\t\t\t\t\t\t\t\tpHTPhyMode->STBC, pHTPhyMode->SHORTGI));\n\t\t\t\n\t/* Don't zero supportedHyPhy structure.*/\n\tRTMPZeroMemory(ht_cap, sizeof(HT_CAPABILITY_IE));\n\tRTMPZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));\n\tRTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, sizeof(pAd->CommonCfg.NewExtChanOffset));\n\tRTMPZeroMemory(rt_ht_cap, sizeof(RT_HT_CAPABILITY));\n\n   \tif (pAd->CommonCfg.bRdg)\n\t{\n\t\tht_cap->ExtHtCapInfo.PlusHTC = 1;\n\t\tht_cap->ExtHtCapInfo.RDGSupport = 1;\n\t}\n\telse\n\t{\n\t\tht_cap->ExtHtCapInfo.PlusHTC = 0;\n\t\tht_cap->ExtHtCapInfo.RDGSupport = 0;\n\t}\n\n\n\tif (RxStream == 1)\n\t{\n\t\tht_cap->HtCapParm.MaxRAmpduFactor = 2;\n\t\trt_ht_cap->MaxRAmpduFactor = 2;\n\t}\n\telse\n\t{\n\t\tht_cap->HtCapParm.MaxRAmpduFactor = 3;\n\t\trt_ht_cap->MaxRAmpduFactor = 3;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSetHT : RxBAWinLimit = %d\\n\", pAd->CommonCfg.BACapability.field.RxBAWinLimit));\n\n\t/* Mimo power save, A-MSDU size, */\n\trt_ht_cap->AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;\n\trt_ht_cap->AmsduSize = (UCHAR)pAd->CommonCfg.BACapability.field.AmsduSize;\n\trt_ht_cap->MimoPs = (UCHAR)pAd->CommonCfg.BACapability.field.MMPSmode;\n\trt_ht_cap->MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;\n\n\tht_cap->HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;\n\tht_cap->HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;\n\tht_cap->HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\trt_ht_cap->AmsduSize, \n\t\t\t\t\t\t\t\t\t\t\t\t\trt_ht_cap->MimoPs,\n\t\t\t\t\t\t\t\t\t\t\t\t\trt_ht_cap->MpduDensity,\n\t\t\t\t\t\t\t\t\t\t\t\t\trt_ht_cap->MaxRAmpduFactor));\n\t\n\tif(pHTPhyMode->HtMode == HTMODE_GF)\n\t{\n\t\tht_cap->HtCapInfo.GF = 1;\n\t\trt_ht_cap->GF = 1;\n\t}\n\telse\n\t\trt_ht_cap->GF = 0;\n\t\n\t/* Decide Rx MCSSet*/\n\tswitch (RxStream)\n\t{\n\t\tcase 3:\n\t\t\tht_cap->MCSSet[2] =  0xff;\n\t\tcase 2:\n\t\t\tht_cap->MCSSet[1] =  0xff;\n\t\tcase 1:\n\t\tdefault:\n\t\t\tht_cap->MCSSet[0] =  0xff;\n\t\t\tbreak;\n\t}\n\n\tif (pAd->CommonCfg.bForty_Mhz_Intolerant && (pHTPhyMode->BW == BW_40))\n\t{\n\t\tpHTPhyMode->BW = BW_20;\n\t\tht_cap->HtCapInfo.Forty_Mhz_Intolerant = 1;\n\t}\n\n\t// TODO: shiang-6590, how about the \"bw\" when channel 14 for JP region???\n\tbw = BW_20;\n\tif(pHTPhyMode->BW == BW_40)\n\t{\n\t\tht_cap->MCSSet[4] = 0x1; /* MCS 32*/\n\t\tht_cap->HtCapInfo.ChannelWidth = 1;\n\t\tif (pAd->CommonCfg.Channel <= 14) \t\t\n\t\t\tht_cap->HtCapInfo.CCKmodein40 = 1;\n\n\t\trt_ht_cap->ChannelWidth = 1;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = (pHTPhyMode->ExtOffset == EXTCHA_BELOW)? (EXTCHA_BELOW): EXTCHA_ABOVE;\n\t\t/* Set Regsiter for extension channel position.*/\n\t\trtmp_mac_set_ctrlch(pAd, pHTPhyMode->ExtOffset);\n\n\t\t/* Turn on BBP 40MHz mode now only as AP . */\n\t\t/* Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection.*/\n\t\tif ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)\n#ifdef P2P_SUPPORT\n\t\t\t|| P2P_GO_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t)\n\t\t{\n\t\t\trtmp_bbp_set_ctrlch(pAd, pHTPhyMode->ExtOffset);\t\n#ifdef GREENAP_SUPPORT\n\t\t\tif (pAd->ApCfg.bGreenAPActive == 1)\n\t\t\t\tbw = BW_20;\n\t\t\telse\n#endif /* GREENAP_SUPPORT */\n\t\t\t\tbw = BW_40;\n\t\t}\n\t}\n\telse\n\t{\n\t\tht_cap->HtCapInfo.ChannelWidth = 0;\n\t\trt_ht_cap->ChannelWidth = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\t/* Turn on BBP 20MHz mode by request here.*/\n\t\tbw = BW_20;\n\t}\n\n#ifdef DOT11_VHT_AC\n\tif (pHTPhyMode->BW == BW_40 &&\n\t\tpAd->CommonCfg.vht_bw == VHT_BW_80 && \n\t\tpAd->CommonCfg.vht_cent_ch)\n\t\tbw = BW_80;\n#endif /* DOT11_VHT_AC */\n\trtmp_bbp_set_bw(pAd, bw);\n\n\n\tif(pHTPhyMode->STBC == STBC_USE)\n\t{\n\t\tif (pAd->Antenna.field.TxPath >= 2)\n\t\t{\n\t\t\tht_cap->HtCapInfo.TxSTBC = 1;\n\t\t\trt_ht_cap->TxSTBC = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tht_cap->HtCapInfo.TxSTBC = 0;\n\t\t\trt_ht_cap->TxSTBC = 0; \t\n\t\t}\n\t\t\n\t\t/*\n\t\t\tRxSTBC\n\t\t\t\t0: not support,\n\t\t\t\t1: support for 1SS\n\t\t\t\t2: support for 1SS, 2SS\n\t\t\t\t3: support for 1SS, 2SS, 3SS\n\t\t*/\n\t\tif (pAd->Antenna.field.RxPath >= 1)\n\t\t{\n\t\t\tht_cap->HtCapInfo.RxSTBC = 1;\n\t\t\trt_ht_cap->RxSTBC = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tht_cap->HtCapInfo.RxSTBC = 0; \n\t\t\trt_ht_cap->RxSTBC = 0; \t\n\t\t}\n\t}\n\telse\n\t{\n\t\trt_ht_cap->TxSTBC = 0;\n\t\trt_ht_cap->RxSTBC = 0;\n\t}\n\n\tif(pHTPhyMode->SHORTGI == GI_400)\n\t{\n\t\tht_cap->HtCapInfo.ShortGIfor20 = 1;\n\t\tht_cap->HtCapInfo.ShortGIfor40 = 1;\n\t\trt_ht_cap->ShortGIfor20 = 1;\n\t\trt_ht_cap->ShortGIfor40 = 1;\n\t}\n\telse\n\t{\n\t\tht_cap->HtCapInfo.ShortGIfor20 = 0;\n\t\tht_cap->HtCapInfo.ShortGIfor40 = 0;\n\t\trt_ht_cap->ShortGIfor20 = 0;\n\t\trt_ht_cap->ShortGIfor40 = 0;\n\t}\n\t\n\t/* We support link adaptation for unsolicit MCS feedback, set to 2.*/\n\tpAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;\n\t/* 1, the extension channel above the control channel. */\n\t\n\t/* EDCA parameters used for AP's own transmission*/\n\tif (pAd->CommonCfg.APEdcaParm.bValid == FALSE)\n\t{\n\t\tpAd->CommonCfg.APEdcaParm.bValid = TRUE;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;\n\t\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;\n\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;\n\n\t\tpAd->CommonCfg.APEdcaParm.Txop[0]  = 0;\n\t\tpAd->CommonCfg.APEdcaParm.Txop[1]  = 0;\n\t\tpAd->CommonCfg.APEdcaParm.Txop[2]  = 94;\t\n\t\tpAd->CommonCfg.APEdcaParm.Txop[3]  = 47;\t\n\t}\n\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t{\n\t\t/* Set ETxBF */\n\t\tsetETxBFCap(pAd, &ht_cap->TxBFCap);\n\n\t\t/* Check ITxBF */\n\t\tpAd->CommonCfg.RegTransmitSetting.field.ITxBfEn &= rtmp_chk_itxbf_calibration(pAd);\n\n\t\t/* Apply to ASIC */\n\t\trtmp_asic_set_bf(pAd);\n\t}\n#endif /* TXBF_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\tRTMPSetIndividualHT(pAd, apidx);\n#ifdef APCLI_SUPPORT\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t\tRTMPSetIndividualHT(pAd, apidx + MIN_NET_DEVICE_FOR_APCLI);\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t\tRTMPSetIndividualHT(pAd, apidx + MIN_NET_DEVICE_FOR_P2P_GO);\n\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t\tRTMPSetIndividualHT(pAd, apidx + MIN_NET_DEVICE_FOR_APCLI);\t\t\t\n#endif /* P2P_SUPPORT */\n\n\t\tRTMPSetIndividualHT(pAd, 0);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tCaller ensures we has 802.11n support.\n\t\tCalls at setting HT from AP/STASetinformation\n\n\tArguments:\n\t\tpAd - Pointer to our adapter\n\t\tphymode  - \n\n\t========================================================================\n*/\nVOID RTMPSetIndividualHT(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR apidx)\n{\t\n\tRT_PHY_INFO *pDesired_ht_phy = NULL;\n\tUCHAR TxStream = pAd->CommonCfg.TxStream;\t\t\n\tUCHAR DesiredMcs = MCS_AUTO;\n\tUCHAR encrypt_mode = Ndis802_11EncryptionDisabled;\n\t\t\t\t\t\t\n\tdo\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (apidx >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\t\t\t\t\t\t\t\t\n\t\t\tUCHAR idx = apidx - MIN_NET_DEVICE_FOR_P2P_GO;\n\n\t\t\tpDesired_ht_phy = &pAd->ApCfg.MBSSID[idx].DesiredHtPhyInfo;\n\t\t\tDesiredMcs = pAd->ApCfg.MBSSID[idx].DesiredTransmitSetting.field.MCS;\t\t\t\n\t\t\tencrypt_mode = pAd->ApCfg.MBSSID[idx].WepStatus;\n\t\t\tpAd->ApCfg.MBSSID[idx].bWmmCapable = TRUE;\t\n\t\t\tpAd->ApCfg.MBSSID[idx].bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\t\n\t\t\tif (apidx >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t\t{\t\t\t\t\n\t\t\t\tUCHAR\tidx = apidx - MIN_NET_DEVICE_FOR_APCLI;\n\t\t\t\t\t\t\n\t\t\t\tif (idx < MAX_APCLI_NUM)\n\t\t\t\t{\n\t\t\t\t\tpDesired_ht_phy = &pAd->ApCfg.ApCliTab[idx].DesiredHtPhyInfo;\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tDesiredMcs = pAd->ApCfg.ApCliTab[idx].DesiredTransmitSetting.field.MCS;\t\t\t\t\t\t\t\n\t\t\t\t\tencrypt_mode = pAd->ApCfg.ApCliTab[idx].WepStatus;\n\t\t\t\t\tpAd->ApCfg.ApCliTab[idx].bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPSetIndividualHT: invalid idx(%d)\\n\", idx));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n#endif /* APCLI_SUPPORT */\n\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif ((apidx < pAd->ApCfg.BssidNum) && (apidx < MAX_MBSSID_NUM(pAd)) && (apidx < HW_BEACON_MAX_NUM))\n\t\t\t{\t\t\t\t\t\t\t\t\n\t\t\t\tpDesired_ht_phy = &pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo;\t\t\t\t\t\t\t\t\t\n\t\t\t\tDesiredMcs = pAd->ApCfg.MBSSID[apidx].DesiredTransmitSetting.field.MCS;\t\t\t\n\t\t\t\tencrypt_mode = pAd->ApCfg.MBSSID[apidx].WepStatus;\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].bWmmCapable = TRUE;\t\n\t\t\t\tpAd->ApCfg.MBSSID[apidx].bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPSetIndividualHT: invalid apidx(%d)\\n\", apidx));\n\t\t\treturn;\n\t\t}\t\t\t\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\t\t\n\t\t\tpDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;\t\t\t\t\t\n\t\t\tDesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;\n\t\t\tencrypt_mode = pAd->StaCfg.WepStatus;\n\t\t\tbreak;\n\t\t}\t\n#endif /* CONFIG_STA_SUPPORT */\n\t} while (FALSE);\n\n\tif (pDesired_ht_phy == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RTMPSetIndividualHT: invalid apidx(%d)\\n\", apidx));\n\t\treturn;\n\t}\n\tRTMPZeroMemory(pDesired_ht_phy, sizeof(RT_PHY_INFO));\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPSetIndividualHT : Desired MCS = %d\\n\", DesiredMcs));\n\t/* Check the validity of MCS */\n\tif ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15)))\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\\n\", DesiredMcs));\n\t\tDesiredMcs = MCS_7;\t\t\n\t}\n\n\tif ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32))\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\\n\"));\n\t\tDesiredMcs = MCS_0;\t\t\n\t}\n\t   \t\t\n#ifdef CONFIG_STA_SUPPORT\n\tif ((pAd->OpMode == OPMODE_STA) && (pAd->StaCfg.BssType == BSS_INFRA) && (apidx == MIN_NET_DEVICE_FOR_MBSSID))\n\t\t;\n\telse\n#endif /* CONFIG_STA_SUPPORT */\n\t/*\n\t\tWFA recommend to restrict the encryption type in 11n-HT mode.\n\t \tSo, the WEP and TKIP are not allowed in HT rate. \n\t*/\n\tif (pAd->CommonCfg.HT_DisallowTKIP && IS_INVALID_HT_SECURITY(encrypt_mode))\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s : Use legacy rate in WEP/TKIP encryption mode (apidx=%d)\\n\", \n\t\t\t\t\t\t\t\t\t__FUNCTION__, apidx));\n\t\treturn;\n\t}\n\n\tif (pAd->CommonCfg.HT_Disable)\n\t{\n#ifdef CONFIG_STA_SUPPORT\n\t\tpAd->StaCfg.bAdhocN = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : HT is disabled\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\t\t\n\tpDesired_ht_phy->bHtEnable = TRUE;\n\t\t\t\t\t \n\t/* Decide desired Tx MCS*/\n\tswitch (TxStream)\n\t{\n\t\tcase 1:\n\t\t\tif (DesiredMcs == MCS_AUTO)\n\t\t\t\tpDesired_ht_phy->MCSSet[0]= 0xff;\n\t\t\telse if (DesiredMcs <= MCS_7)\n\t\t\t\tpDesired_ht_phy->MCSSet[0]= 1<<DesiredMcs;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tif (DesiredMcs == MCS_AUTO)\n\t\t\t{\n\t\t\t\tpDesired_ht_phy->MCSSet[0]= 0xff;\n\t\t\t\tpDesired_ht_phy->MCSSet[1]= 0xff;\n\t\t\t}\n\t\t\telse if (DesiredMcs <= MCS_15)\n\t\t\t{\n\t\t\t\tULONG mode;\n\t\t\t\t\n\t\t\t\tmode = DesiredMcs / 8;\n\t\t\t\tif (mode < 2)\n\t\t\t\t\tpDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));\n\t\t\t}\t\t\t\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tif (DesiredMcs == MCS_AUTO)\n\t\t\t{\n\t\t\t\t/* MCS0 ~ MCS23, 3 bytes */\n\t\t\t\tpDesired_ht_phy->MCSSet[0]= 0xff;\n\t\t\t\tpDesired_ht_phy->MCSSet[1]= 0xff;\n\t\t\t\tpDesired_ht_phy->MCSSet[2]= 0xff;\n\t\t\t}\n\t\t\telse if (DesiredMcs <= MCS_23)\n\t\t\t{\n\t\t\t\tULONG mode;\n\n\t\t\t\tmode = DesiredMcs / 8;\n\t\t\t\tif (mode < 3)\n\t\t\t\t\tpDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));\n\t\t\t}\n\t\t\tbreak;\n\t}\t\t\t\t\t\t\t\n\n\tif(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40)\n\t{\n\t\tif (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)\n\t\t\tpDesired_ht_phy->MCSSet[4] = 0x1;\n\t}\n\n\t/* update HT Rate setting */\n\tif (pAd->OpMode == OPMODE_STA)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (apidx > BSS0)\n\t\t\tMlmeUpdateHtTxRates(pAd, apidx);\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tMlmeUpdateHtTxRates(pAd, BSS0);\n\t}\n\telse\n\t\tMlmeUpdateHtTxRates(pAd, apidx);\n\n#ifdef DOT11_VHT_AC\n\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode)) {\n\t\tpDesired_ht_phy->bVhtEnable = TRUE;\n\t\trtmp_set_vht(pAd, pDesired_ht_phy);\n\t}\n#endif /* DOT11_VHT_AC */\n}\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tClear the desire HT info per interface\n\t\t\n\tArguments:\n\t\n\t========================================================================\n*/\nVOID RTMPDisableDesiredHtInfo(\n\tIN\tPRTMP_ADAPTER\t\tpAd)\n{\n#ifdef CONFIG_AP_SUPPORT\n\tUINT8\t\t\t\tapidx = 0;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\t\t\t\t\n\t\t\tRTMPZeroMemory(&pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo, sizeof(RT_PHY_INFO));\n\t\t}\n#ifdef APCLI_SUPPORT\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t{\t\t\t\t\n\t\t\tRTMPZeroMemory(&pAd->ApCfg.ApCliTab[apidx].DesiredHtPhyInfo, sizeof(RT_PHY_INFO));\n\t\t}\n#endif /* APCLI_SUPPORT */\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tfor (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)\n\t\t{\t\t\t\n\t\t\tRTMPZeroMemory(&pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo, sizeof(RT_PHY_INFO));\n\t\t}\n\n\t\tfor (apidx = 0; apidx < MAX_APCLI_NUM; apidx++)\n\t\t{\t\t\t\n\t\t\tRTMPZeroMemory(&pAd->ApCfg.ApCliTab[apidx].DesiredHtPhyInfo, sizeof(RT_PHY_INFO));\n\t\t}\n#endif /* P2P_SUPPORT */\n\t\tRTMPZeroMemory(&pAd->StaCfg.DesiredHtPhyInfo, sizeof(RT_PHY_INFO));\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n\n\nINT\tSetCommonHT(RTMP_ADAPTER *pAd)\n{\n\tOID_SET_HT_PHYMODE SetHT;\n\n\tif (!WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\t/* Clear previous HT information */\n\t\tRTMPDisableDesiredHtInfo(pAd);\n\t\treturn FALSE;\n\t}\n\n#ifdef DOT11_VHT_AC\n\tSetCommonVHT(pAd);\n#endif /* DOT11_VHT_AC */\n\n\tSetHT.PhyMode = (RT_802_11_PHY_MODE)pAd->CommonCfg.PhyMode;\n\tSetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath);\n\tSetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;\n\tSetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;\n\tSetHT.MCS = MCS_AUTO;\n\tSetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;\n\tSetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;\n\tSetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;\t\t\n\n\tRTMPSetHT(pAd, &SetHT);\n\n#ifdef DOT11N_DRAFT3\n\tif(pAd->CommonCfg.bBssCoexEnable && pAd->CommonCfg.Bss2040NeedFallBack)\n\t{\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;\n\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;\n\t\tpAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq = 1;\n\t\tpAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;\n\t\tpAd->CommonCfg.Bss2040NeedFallBack = 1;\n\t}\n#endif /* DOT11N_DRAFT3 */\n\n\treturn TRUE;\n}\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tUpdate HT IE from our capability.\n\t\t\n\tArguments:\n\t\tSend all HT IE in beacon/probe rsp/assoc rsp/action frame.\n\t\t\n\t\n\t========================================================================\n*/\nVOID RTMPUpdateHTIE(\n\tIN RT_HT_CAPABILITY\t*pRtHt,\n\tIN UCHAR *pMcsSet,\n\tOUT HT_CAPABILITY_IE *pHtCapability,\n\tOUT ADD_HT_INFO_IE *pAddHtInfo)\n{\n\tRTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));\n\tRTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));\n\t\n\t\tpHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;\n\t\tpHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;\n\t\tpHtCapability->HtCapInfo.GF = pRtHt->GF;\n\t\tpHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;\n\t\tpHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;\n\t\tpHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;\n\t\tpHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;\n\t\tpHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;\n\t\tpHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;\n\t\tpHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;\n\n\t\tpAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset ;\n\t\tpAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;\n\t\tpAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;\n\t\tpAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;\n\t\tRTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet*/pMcsSet, 4); /* rt2860 only support MCS max=32, no need to copy all 16 uchar.*/\n\t\n        DBGPRINT(RT_DEBUG_TRACE,(\"RTMPUpdateHTIE <== \\n\"));\n}\n\n#endif /* DOT11_N_SUPPORT */\n\n"
  },
  {
    "path": "src/mgmt/mgmt_hw.c",
    "content": "/*\n\n\n*/\n\n\n#include <rt_config.h>\n\n\nINT dev_adjust_radio(RTMP_ADAPTER *pAd)\n{\n\tstruct hw_setting *hw_cfg = &pAd->hw_cfg, new_cfg;\n\n\n\tNdisZeroMemory(&new_cfg, sizeof(struct hw_setting));\n\n\t\n\t/* For all wdev, find the maximum inter-set */\n\n\t\n\tif (hw_cfg->bbp_bw != new_cfg.bbp_bw)\n\t{\n\t\trtmp_bbp_set_bw(pAd, new_cfg.bbp_bw);\n\t\thw_cfg->bbp_bw = new_cfg.bbp_bw;\n\t}\n\n\tif (hw_cfg->cent_ch != new_cfg.cent_ch)\n\t{\n\t\tUCHAR ext_ch = EXTCHA_NONE;\n\t\t\n\t\trtmp_bbp_set_ctrlch(pAd, ext_ch);\n\t\trtmp_mac_set_ctrlch(pAd, ext_ch);\t\n\t}\n\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "src/mgmt/mgmt_vht.c",
    "content": "/*\n\n*/\n\n#include \"rt_config.h\"\n\n\n#ifdef DOT11_VHT_AC\n\nVOID rtmp_set_vht(RTMP_ADAPTER *pAd, RT_PHY_INFO *phy_info)\n{\n\tif (!phy_info)\n\t\treturn;\n\n\tif (phy_info->bVhtEnable)\n\t\tphy_info->vht_bw = VHT_BW_80;\n\n}\n\n\nINT SetCommonVHT(RTMP_ADAPTER *pAd)\n{\n\tUCHAR cent_ch = 0;\n\n\tif (!WMODE_CAP_AC(pAd->CommonCfg.PhyMode))\n\t{\n\t\t/* Clear previous VHT information */\n\t\treturn FALSE;\n\t}\n\n\t\n\tpAd->CommonCfg.vht_cent_ch = vht_cent_ch_freq(pAd, pAd->CommonCfg.Channel);\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Config VHT parameters!cent_ch=%d!vht_cent_ch = %d, vht_cent_ch2 = %d\\n\",\n\t\t\t\t__FUNCTION__, cent_ch, pAd->CommonCfg.vht_cent_ch, pAd->CommonCfg.vht_cent_ch2));\n\treturn TRUE;\n}\n\n#endif /* DOT11_VHT_AC */\n"
  },
  {
    "path": "src/os/linux/Kconfig.ap.soc",
    "content": "config RT2860V2_AP\n\ttristate \"Ralink RT2860 802.11n AP support\"\n\tdepends on NET_RADIO \n\t\nconfig RT2860V2_AP_V24_DATA_STRUCTURE\n\tbool\n\tdepends on RT2860V2_AP\n\tdefault y\n\t\nconfig  RT2860V2_AP_LED\n\tbool \"LED Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_WSC\n\tbool \"WSC (WiFi Simple Config)\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_LLTD\n\tbool \"LLTD (Link Layer Topology Discovery Protocol)\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_WDS\n\tbool \"WDS\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_NINTENDO\n\tbool \"Nintendo\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_WMM_ACM\n\tbool \"WMM ACM\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_MBSS\n\tbool \"MBSSID\"\n\tdepends on RT2860V2_AP\n\nconfig\tNEW_MBSSID_MODE\n\tbool \"New MBSSID MODE\"\n\tdepends on RT2860V2_AP\n\tdepends on RT2860V2_AP_MBSS\n\tdepends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350\n\tdefault n\n\nconfig  RT2860V2_AP_APCLI\n\tbool \"AP-CLient Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_IGMP_SNOOP\n\tbool \"IGMP snooping\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_NETIF_BLOCK\n\tbool \"NETIF Block\"\n\tdepends on RT2860V2_AP\n\thelp\n\tSupport Net interface block while Tx-Sw queue full\n\nconfig  RT2860V2_AP_DFS\n\tbool \"DFS\"\n\tdepends on RT2860V2_AP\n\tselect RALINK_TIMER_DFS\n\nconfig  RT2860V2_AP_CARRIER\n\tbool \"Carrier Detect\"\n\tdepends on RT2860V2_AP\n\tselect RALINK_TIMER_DFS\n\nconfig  RT2860V2_AP_DLS\n\tbool \"DLS ((Direct-Link Setup) Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_IDS\n\tbool \"IDS (Intrusion Detection System) Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_MESH\n\tbool \"MESH Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_HW_ANTENNA_DIVERSITY\n\tbool \"Antenna Diversity Support\"\n\tdepends on RT2860V2_AP\n\tdepends on RALINK_RT5350\n\nconfig  RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY\n\tbool \"Antenna Diversity Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_WAPI\n\tbool \"WAPI Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_COC\n\tbool \"CoC Support\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_MEMORY_OPTIMIZATION\n\tbool \"Memory Optimization\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_VIDEO_TURBINE\n\tbool \"Video Turbine support\"\n\tdepends on RT2860V2_AP\n\nconfig  RA_CLASSIFIER\n\ttristate \"Ralink Flow Classifier\"\n\tdepends on RT2860V2_AP_VIDEO_TURBINE\n\tdefault n\n\nconfig  RT2860V2_80211N_DRAFT3\n\tbool \"802.11n Draft3\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_INTELLIGENT_RATE_ADAPTION\n\tbool \"Intelligent Rate Adaption\"\n\tdepends on RT2860V2_AP\n\nconfig  RT2860V2_AP_TXBF\n\tbool \"Tx Beam Forming\"\n\tdepends on RT2860V2_AP\n\tdepends on RALINK_RT3883\n\nconfig  RT2860V2_AP_RTMP_INTERNAL_TX_ALC\n\tbool \"TSSI Compensation\"\n\tdepends on RT2860V2_AP\n\tdepends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350\n\n#config  RT2860V2_EXT_CHANNEL_LIST\n#\tbool \"Extension Channel List\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_KTHREAD\n#\tbool \"Kernel Thread\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_AUTO_CH_SELECT_ENHANCE\n#\tbool \"Auto Channel Selection Enhancement\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_80211R_FT\n#\tbool \"802.11r Fast BSS Transition\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_80211R_RR\n#\tbool \"802.11k Radio Resource Management\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_SINGLE_SKU\n#\tbool \"Single SKU\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_MCAST_RATE_SPECIFIC\n#\tbool \"User specific tx rate of mcast pkt\"\n#\tdepends on RT2860V2_AP\n\n#config  RT2860V2_SNMP\n#\tbool \"Net-SNMP Support\"\n#\tdepends on RT2860V2_AP\n"
  },
  {
    "path": "src/os/linux/Kconfig.ap.usb",
    "content": "config RTUSB_AP\n\ttristate \"Ralink WiFi USB combo driver AP module\"\n\tdepends on m\n\tdefault m\n\nconfig RTUSB_AP_WSC\n\tbool \"WPS support including WPS2.0\"\n\tdepends on RTUSB_AP\n\tdefault y\n\nconfig RTUSB_AP_MBSS\n\tbool \"MBSS support\"\n\tdepends on RTUSB_AP\n\tdefault y\n\nconfig RTUSB_AP_NEW_MBSS_MODE\n\tbool \"New MBSS support\"\n\tdepends on RTUSB_AP_MBSS\n\nconfig RTUSB_WDS\n\tbool \"WDS support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_APCLI\n\tbool \"APClient support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_DFS\n\tbool \"DFS support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_CS\n\tbool \"CS support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_IGMP_SNOOP\n\tbool \"IGMP snoop support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_NETIF_BLOCK\n\tbool \"NETIF block support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_DLS\n\tbool \"DLS support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_IDS\n\tbool \"IDS support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_AP_FLASH_SUPPORT\n\tbool \"FLASH support\"\n\tdepends on RTUSB_AP\n\nconfig RTUSB_AP_80211N_DRAFT3\n\tbool \"802.11n Draft3 support\"\n\tdepends on RTUSB_AP\n\tdefault y\n\n# Chip related\nconfig RT2870_AP\n\tbool \"RT2870 support\"\n\tdepends on RTUSB_AP\n\nconfig RT3572_AP\n\tbool \"RT3572 support\"\n\tdepends on RTUSB_AP\n\nconfig RT3573_AP\n\tbool \"RT3573 support\"\n\tdepends on RTUSB_AP\n\nconfig RT5572_AP\n\tbool \"RT5572 support\"\n\tdepends on RTUSB_AP\n\tdefault y\n\n# ATE\nconfig RTUSB_AP_ATE\n\tbool \"ATE support\"\n\tdepends on RTUSB_AP\n\nconfig RT2870_AP_ATE\n\tbool \"RT2870 ATE support\"\n\tdepends on RTUSB_AP_ATE && RT2870_AP\n\nconfig RT3572_AP_ATE\n\tbool \"RT3572 ATE support\"\n\tdepends on RTUSB_AP_ATE && RT3572_AP\n\nconfig RT5572_AP_ATE\n\tbool \"RT5572 ATE support\"\n\tdepends on RTUSB_AP_ATE && RT5572_AP\n\tdefault y\n\n# QA\nconfig RTUSB_AP_QA\n\tbool \"QA tool support\"\n\tdepends on RTUSB_AP_ATE\n\tdefault y\n\nconfig RTUSB_AP_WAPI\n\tbool \"WAPI support\"\n\tdepends on RTUSB_AP\n\n# Platform specific\nconfig RT5572_AP_WDS\n\tbool\n\tdepends on RTUSB_WDS\n\tdefault y\n"
  },
  {
    "path": "src/os/linux/Kconfig.sta.soc",
    "content": "config RT2860V2_STA\n\ttristate \"Ralink RT2860 802.11n STA support\"\n\tdepends on NET_RADIO \n\nconfig  RT2860V2_STA_WPA_SUPPLICANT\n\tbool \"WPA Supplicant\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_ETH_CONVERT\n\tbool \"Ethernet Convert Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_DPB\n\tbool\n\tdepends on RT2860V2_STA_ETH_CONVERT\n\tdefault y\n\nconfig  RT2860V2_STA_WMM_ACM\n\tbool \"WMM ACM Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_LED\n\tbool \"LED Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_IDS\n\tbool \"IDS (Intrusion Detection System) Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_WSC\n\tbool \"WSC (WiFi Simple Config)\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_CARRIER\n\tbool \"Carrier Sense Support\"\n\tdepends on RT2860V2_STA\n\tselect RALINK_TIMER\n\tselect RALINK_TIMER_DFS\n\nconfig  RT2860V2_STA_DLS\n\tbool \"DLS ((Direct-Link Setup) Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_MESH\n\tbool \"MESH Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY\n\tbool \"Antenna Diversity Support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_HW_STA_ANTENNA_DIVERSITY\n\tbool \"Antenna Diversity Support\"\n\tdepends on RT2860V2_STA\n\tdepends on RALINK_RT5350\n\n#config  RT2860V2_STA_WAPI\n#        bool \"WAPI Support\"\n#        depends on RT2860V2_STA\n\nconfig  RT2860V2_STA_VIDEO_TURBINE\n\tbool \"Video Turbine support\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_INTELLIGENT_RATE_ADAPTION\n\tbool \"Intelligent Rate Adaption\"\n\tdepends on RT2860V2_STA\n\nconfig  RT2860V2_STA_TXBF\n\tbool \"Tx Bean Forming Support (Only 3883)\"\n\tdepends on RT2860V2_STA\n\tdepends on RALINK_RT3883 \n\nconfig  RT2860V2_STA_RTMP_INTERNAL_TX_ALC\n\tbool \"TSSI Compensation\"\n\tdepends on RT2860V2_STA\n\tdepends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350\n\nconfig  RT2860V2_STA_80211N_DRAFT3\n\tbool \"802.11n Draft3\"\n\tdepends on RT2860V2_STA\n\n#config  RT2860V2_EXT_CHANNEL_LIST\n#        bool \"Extension Channel List\"\n#        depends on RT2860V2_STA\n\n#config  RT2860V2_SNMP\n#\tbool \"Net-SNMP Support\"\n#\tdepends on RT2860V2_STA\n"
  },
  {
    "path": "src/os/linux/Makefile.4",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\nMOD_NAME = mt$(MODULE)ap\nDAT_PATH = /etc/Wireless/RT$(MODULE_DAT)AP\nDAT_FILE_NAME = RT$(MODULE_DAT)AP.dat\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\nMOD_NAME = mt$(MODULE)sta\nDAT_PATH = /etc/Wireless/RT$(MODULE_DAT)STA\nDAT_FILE_NAME = RT$(MODULE_DAT)STA.dat\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\nMOD_NAME = mt$(MODULE)apsta\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\nOBJ := -DEXPORT_SYMTAB\nendif\n#endif // WAPI_SUPPORT //\n\nOBJ := $(MOD_NAME).o\n\n#ifdef CONFIG_AP_SUPPORT\nRT28XX_AP_OBJ := \\\n\t$(RT28xx_DIR)/common/crypt_md5.o\\\n\t$(RT28xx_DIR)/common/crypt_sha2.o\\\n\t$(RT28xx_DIR)/common/crypt_hmac.o\\\n\t$(RT28xx_DIR)/common/crypt_aes.o\\\n\t$(RT28xx_DIR)/common/crypt_arc4.o\\\n\t$(RT28xx_DIR)/common/mlme.o\\\n\t$(RT28xx_DIR)/common/cmm_wep.o\\\n\t$(RT28xx_DIR)/common/action.o\\\n\t$(RT28xx_DIR)/common/cmm_data.o\\\n\t$(RT28xx_DIR)/common/rtmp_init.o\\\n\t$(RT28xx_DIR)/common/rtmp_init_inf.o\\\n\t$(RT28xx_DIR)/common/cmm_tkip.o\\\n\t$(RT28xx_DIR)/common/cmm_aes.o\\\n\t$(RT28xx_DIR)/common/cmm_sync.o\\\n\t$(RT28xx_DIR)/common/eeprom.o\\\n\t$(RT28xx_DIR)/common/cmm_sanity.o\\\n\t$(RT28xx_DIR)/common/cmm_info.o\\\n\t$(RT28xx_DIR)/common/cmm_cfg.o\\\n\t$(RT28xx_DIR)/common/cmm_wpa.o\\\n\t$(RT28xx_DIR)/common/dfs.o\\\n\t$(RT28xx_DIR)/common/spectrum.o\\\n\t$(RT28xx_DIR)/common/rtmp_timer.o\\\n\t$(RT28xx_DIR)/common/rt_channel.o\\\n\t$(RT28xx_DIR)/common/cmm_profile.o\\\n\t$(RT28xx_DIR)/common/cmm_asic.o\\\n\t$(RT28xx_DIR)/common/cmm_cmd.o\\\n\t$(RT28xx_DIR)/rate_ctrl/ra_ctrl.o\\\n\t$(RT28xx_DIR)/rate_ctrl/alg_legacy.o\\\n\t$(RT28xx_DIR)/os/linux/rt_profile.o\\\n\t$(RT28xx_DIR)/ap/ap_mbss.o\\\n\t$(RT28xx_DIR)/chips/rtmp_chip.o\\\n\t$(RT28xx_DIR)/ap/ap.o\\\n\t$(RT28xx_DIR)/ap/ap_assoc.o\\\n\t$(RT28xx_DIR)/ap/ap_auth.o\\\n\t$(RT28xx_DIR)/ap/ap_connect.o\\\n\t$(RT28xx_DIR)/ap/ap_mlme.o\\\n\t$(RT28xx_DIR)/ap/ap_sanity.o\\\n\t$(RT28xx_DIR)/ap/ap_sync.o\\\n\t$(RT28xx_DIR)/ap/ap_wpa.o\\\n\t$(RT28xx_DIR)/ap/ap_data.o\\\n\t$(RT28xx_DIR)/common/uapsd.o\\\n\t$(RT28xx_DIR)/ap/ap_autoChSel.o\\\n\t$(RT28xx_DIR)/ap/ap_qload.o\\\n\t$(RT28xx_DIR)/ap/ap_cfg.o\n\nifeq ($(OSABL),NO)\nRT28XX_AP_OBJ := \\\n\t$(RT28xx_DIR)/ap/ap_mbss_inf.o\\\n\t$(RT28xx_DIR)/common/rt_os_util.o\\\n\t$(RT28xx_DIR)/os/linux/ap_ioctl.o\\\n\t$(RT28xx_DIR)/os/linux/rt_linux.o\\\n\t$(RT28xx_DIR)/os/linux/rt_main_dev.o\nelse\nRT28XX_AP_OBJ := \\\n\t$(RT28xx_DIR)/os/linux/rt_symb.o\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nRT28XX_AP_OBJS += $(RT28xx_DIR)/rate_ctrl/alg_grp.o\nendif\n\n#ifdef DOT11_N_SUPPORT\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/common/ba_action.o\\\n\t$(RT28xx_DIR)/mgmt/mgmt_ht.o\n\n#ifdef TXBF_SUPPORT\nifeq ($(HAS_TXBF_SUPPORT),y)\nrt$(MODULE)ap-objs += \\\n\t$(RT28xx_DIR)/common/cmm_txbf.o\\\n\t$(RT28xx_DIR)/common/cmm_txbf_cal.o\nendif\n#endif // TXBF_SUPPORT //\nendif\n#endif // DOT11_N_SUPPORT //\n\n#ifdef BG_FT_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_BGFP_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/br_ftph.o\nendif\nendif\n#endif // BG_FT_SUPPORT //\n\n#ifdef LED_CONTROL_SUPPORT\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/common/rt_led.o\nendif\n#endif // LED_CONTROL_SUPPORT //\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nifeq ($(HAS_RT2880_RT2860_COEXIST),y)\t\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/rt_pci_rbus.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_util.o\\\n\t$(RT28xx_DIR)/os/linux/pci_main_dev.o\\\n\t$(RT28xx_DIR)/common/cmm_dfs.o\nendif\n\nifeq ($(HAS_ATE),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/ate/common/rt_ate.o\nendif\n\nifeq ($(HAS_QA_SUPPORT),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/ate/common/rt_qa.o\nendif\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/common/wsc.o\\\n\t$(RT28xx_DIR)/common/wsc_tlv.o\\\n\t$(RT28xx_DIR)/common/wsc_ufd.o\\\n\t$(RT28xx_DIR)/common/crypt_biginteger.o\\\n\t$(RT28xx_DIR)/common/crypt_dh.o\nendif\nifeq ($(HAS_WSC_V2),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/common/wsc_v2.o\nendif\n#endif // WSC_INCLUDED //\n\n\n\nifeq ($(HAS_WDS),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_wds.o\n\nifeq ($(OSABL),NO)\nRT28XX_AP_OBJ += \\\n\t../../ap/ap_wds_inf.o\nendif\nendif\n\n#ifdef APCLI_SUPPORT\nifeq ($(HAS_APCLI),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/ap/ap_apcli.o \\\n\t$(RT28xx_DIR)/ap/apcli_ctrl.o \\\n\t$(RT28xx_DIR)/ap/apcli_sync.o \\\n\t$(RT28xx_DIR)/ap/apcli_auth.o \\\n\t$(RT28xx_DIR)/ap/apcli_assoc.o \\\n\t$(RT28xx_DIR)/common/cmm_mat.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_iparp.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_pppoe.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_ipv6.o\n\nifeq ($(OSABL),NO)\nRT28XX_AP_OBJ += \\\n\t../../ap/ap_apcli_inf.o\nendif\nendif\n#endif // APCLI_SUPPORT //\n\nifeq ($(HAS_BLOCK_NET_IF),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/common/netif_block.o\nendif\n\nifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/common/igmp_snoop.o\nendif\n\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_dls.o\nendif\n\nifeq ($(HAS_IDS_SUPPORT),y)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_ids.o\nendif\n\nifeq ($(PLATFORM),IKANOS_V160)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/os/linux/vr_ikans.o\nendif\n\nifeq ($(PLATFORM),IKANOS_V180)\nRT28XX_AP_OBJ += $(RT28xx_DIR)/os/linux/vr_ikans.o\nendif\n\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/common/wapi.o\nendif\n#endif // WAPI_SUPPORT //\n\n\n\n\nifeq ($(HAS_CLIENT_WDS_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/common/client_wds.o\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nRT28XX_STA_OBJ := \\\n\t$(RT28xx_DIR)/common/crypt_md5.o\\\n\t$(RT28xx_DIR)/common/crypt_sha2.o\\\n\t$(RT28xx_DIR)/common/crypt_hmac.o\\\n\t$(RT28xx_DIR)/common/crypt_aes.o\\\n\t$(RT28xx_DIR)/common/crypt_arc4.o\\\n\t$(RT28xx_DIR)/common/mlme.o\\\n\t$(RT28xx_DIR)/common/cmm_wep.o\\\n\t$(RT28xx_DIR)/common/action.o\\\n\t$(RT28xx_DIR)/common/cmm_data.o\\\n\t$(RT28xx_DIR)/common/rtmp_init.o\\\n\t$(RT28xx_DIR)/common/rtmp_init_inf.o\\\n\t$(RT28xx_DIR)/common/cmm_tkip.o\\\n\t$(RT28xx_DIR)/common/cmm_aes.o\\\n\t$(RT28xx_DIR)/common/cmm_sync.o\\\n\t$(RT28xx_DIR)/common/eeprom.o\\\n\t$(RT28xx_DIR)/common/cmm_sanity.o\\\n\t$(RT28xx_DIR)/common/cmm_info.o\\\n\t$(RT28xx_DIR)/common/cmm_cfg.o\\\n\t$(RT28xx_DIR)/common/cmm_wpa.o\\\n\t$(RT28xx_DIR)/common/cmm_radar.o\\\n\t$(RT28xx_DIR)/common/cmm_dfs.o\\\n\t$(RT28xx_DIR)/common/spectrum.o\\\n\t$(RT28xx_DIR)/common/rtmp_timer.o\\\n\t$(RT28xx_DIR)/common/rt_channel.o\\\n\t$(RT28xx_DIR)/common/cmm_profile.o\\\n\t$(RT28xx_DIR)/common/cmm_asic.o\\\n\t$(RT28xx_DIR)/common/scan.o\\\n\t$(RT28xx_DIR)/common/ps.o\\\n\t$(RT28xx_DIR)/common/cmm_cmd.o\\\n\t$(RT28xx_DIR)/rate_ctrl/ra_ctrl.o\\\n\t$(RT28xx_DIR)/rate_ctrl/alg_legacy.o\\\n\t$(RT28xx_DIR)/rate_ctrl/alg_ags.o\\\n\t$(RT28xx_DIR)/os/linux/rt_profile.o\\\n\t$(RT28xx_DIR)/chips/rtmp_chip.o\\\n\t$(RT28xx_DIR)/common/txpower.o\\\n\t$(RT28xx_DIR)/mac/rtmp_mac.o\\\n\t$(RT28xx_DIR)/mgmt/mgmt_hw.o\\\n\t$(RT28xx_DIR)/mgmt/mgmt_entrytb.o\\\n\t$(RT28xx_DIR)/phy/rtmp_phy.o\\\n\t$(RT28xx_DIR)/phy/rlt_phy.o\\\n\t$(RT28xx_DIR)/phy/rlt_rf.o\\\n\t$(RT28xx_DIR)/sta/assoc.o\\\n\t$(RT28xx_DIR)/sta/auth.o\\\n\t$(RT28xx_DIR)/sta/auth_rsp.o\\\n\t$(RT28xx_DIR)/sta/sync.o\\\n\t$(RT28xx_DIR)/sta/sanity.o\\\n\t$(RT28xx_DIR)/sta/rtmp_data.o\\\n\t$(RT28xx_DIR)/sta/connect.o\\\n\t$(RT28xx_DIR)/sta/wpa.o\\\n\t$(RT28xx_DIR)/sta/sta_cfg.o\n\nifeq ($(OSABL),NO)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/rt_os_util.o\\\n\t$(RT28xx_DIR)/os/linux/sta_ioctl.o\\\n\t$(RT28xx_DIR)/os/linux/rt_linux.o\\\n\t$(RT28xx_DIR)/os/linux/rt_main_dev.o\nelse\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/rt_symb.o\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nRT28XX_STA_OBJS += $(RT28xx_DIR)/rate_ctrl/alg_grp.o\nendif\n\nifeq ($(HAS_ATE),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/ate/common/rt_ate.o\nendif\n\nifeq ($(HAS_QA_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/ate/common/rt_qa.o\nendif\n\n#ifdef DOT11_N_SUPPORT\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/ba_action.o\\\n\t$(RT28xx_DIR)/mgmt/mgmt_ht.o\n\n#ifdef TXBF_SUPPORT\nifeq ($(HAS_TXBF_SUPPORT),y)\nrt$(MODULE)sta-objs += \\\n\t$(RT28xx_DIR)/common/cmm_txbf.o\\\n\t$(RT28xx_DIR)/common/cmm_txbf_cal.o\nendif\n#endif // TXBF_SUPPORT //\nendif\n#endif // DOT11_N_SUPPORT //\n\n#ifdef ETH_CONVERT\nifeq ($(HAS_ETH_CONVERT_SUPPORT), y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mat.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_iparp.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_pppoe.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_ipv6.o\nendif\n#endif // ETH_CONVERT //\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_wpa_adhoc.o\n#endif // ADHOC_WPA2PSK_SUPPORT //\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/wsc.o\\\n\t$(RT28xx_DIR)/common/wsc_tlv.o\\\n\t$(RT28xx_DIR)/common/crypt_biginteger.o\\\n\t$(RT28xx_DIR)/common/crypt_dh.o\nendif\nifeq ($(HAS_WSC_V2),y)\nRT28XX_STA_OBJ += $(RT28xx_DIR)/common/wsc_v2.o\n\nifeq ($(HAS_IWSC_SUPPORT),y)\nRT28XX_STA_OBJ += $(RT28xx_DIR)/sta/sta_iwsc.o\nendif\n\nendif\n#endif // WSC_INCLUDED //\n\n\nifeq ($(HAS_BLOCK_NET_IF),y)\nRT28XX_STA_OBJ += $(RT28xx_DIR)/common/netif_block.o\nendif\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nRT28XX_STA_OBJ += $(RT28xx_DIR)/sta/dls.o\nendif\n\n#ifdef DOT11Z_TDLS_SUPPORT\nifeq ($(HAS_DOT11Z_TDLS_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/sta/tdls.o\\\n\t$(RT28xx_DIR)/sta/tdls_ctrl.o\\\n\t$(RT28xx_DIR)/sta/tdls_tlv.o\\\n\t$(RT28xx_DIR)/sta/tdls_link_mng.o\nendif\n#endif // DOT11Z_TDLS_SUPPORT //\n\n#ifdef LED_CONTROL_SUPPORT\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/rt_led.o\nendif\n#endif // LED_CONTROL_SUPPORT //\n\n\n\n\n\n\n\nifneq ($(findstring 3593,$(CHIPSET)),)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mac_pci.o\\\n\t$(RT28xx_DIR)/common/cmm_data_pci.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_drv.o\\\n\t$(RT28xx_DIR)/common/rtmp_mcu.o\\\n\t$(RT28xx_DIR)/common/ee_prom.o\\\n\t$(RT28xx_DIR)/common/ee_efuse.o\\\n\t$(RT28xx_DIR)/common/rt_rf.o\\\n\t$(RT28xx_DIR)/common/frq_cal.o\\\n\t$(RT28xx_DIR)/chips/rt30xx.o\\\n\t$(RT28xx_DIR)/chips/rt35xx.o\\\n\t$(RT28xx_DIR)/chips/rt28xx.o\\\n\t$(RT28xx_DIR)/chips/rt3593.o\n\nifeq ($(HAS_ATE),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/ate/chips/rt3593_ate.o\\\n\t$(RT28xx_DIR)/ate/common/ate_pci.o\nendif\n\nifeq ($(OSABL),NO)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/rt_pci_rbus.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_util.o\\\n\t$(RT28xx_DIR)/os/linux/pci_main_dev.o\nendif\nendif\n\nifneq ($(findstring 7601U,$(CHIPSET)),)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mac_usb.o\\\n\t$(RT28xx_DIR)/common/cmm_data_usb.o\\\n\t$(RT28xx_DIR)/common/rtusb_io.o\\\n\t$(RT28xx_DIR)/common/rtusb_data.o\\\n\t$(RT28xx_DIR)/common/rtusb_bulk.o\\\n\t$(RT28xx_DIR)/os/linux/rt_usb.o\\\n\t$(RT28xx_DIR)/common/ee_prom.o\\\n\t$(RT28xx_DIR)/common/ee_efuse.o\\\n\t$(RT28xx_DIR)/mcu/rtmp_and.o\\\n\t$(RT28xx_DIR)/mcu/rtmp_mcu.o\\\n\t$(RT28xx_DIR)/mcu/rtmp_M51.o\\\n\t$(RT28xx_DIR)/common/rt_rf.o\\\n\t$(RT28xx_DIR)/chips/mt7601.o\\\n\t$(RT28xx_DIR)/mac/ral_omac.o\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/ee_flash.o\nendif\n                                                                                \nifeq ($(HAS_ATE),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/ate/chips/mt7601_ate.o\\\n\t$(RT28xx_DIR)/ate/common/ate_usb.o\nendif\n                                                                                \nifeq ($(HAS_TSO_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/naf/net_acc.o\\\n\t$(RT28xx_DIR)/naf/tso.o\\\n\t$(RT28xx_DIR)/naf/cso.o\nendif\n\nifeq ($(OSABL),NO)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/rt_usb.o\\\n\t$(RT28xx_DIR)/os/linux/rt_usb_util.o\\\n\t$(RT28xx_DIR)/os/linux/usb_main_dev.o\\\n\t$(RT28xx_DIR)/common/rtusb_dev_id.o\nendif\n                                                                                \nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/frq_cal.o\nendif\n\n\nendif\n\n\n\nifneq ($(findstring 3390,$(CHIPSET)),)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mac_pci.o\\\n\t$(RT28xx_DIR)/common/cmm_data_pci.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_drv.o\\\n\t$(RT28xx_DIR)/common/ee_prom.o\\\n\t$(RT28xx_DIR)/common/ee_efuse.o\\\n\t$(RT28xx_DIR)/common/rtmp_mcu.o\\\n\t$(RT28xx_DIR)/common/rt_rf.o\\\n\t$(RT28xx_DIR)/chips/rt30xx.o\\\n\t$(RT28xx_DIR)/chips/rt3090.o\\\n\t$(RT28xx_DIR)/chips/rt33xx.o\\\n\t$(RT28xx_DIR)/chips/rt3390.o\n\nifeq ($(HAS_ATE),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/ate/chips/rt33xx_ate.o\\\n\t$(RT28xx_DIR)/ate/chips/rt30xx_ate.o\\\n\t$(RT28xx_DIR)/ate/common/ate_pci.o\nendif\n\nifeq ($(OSABL),NO)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/rt_pci_rbus.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_util.o\\\n\t$(RT28xx_DIR)/os/linux/pci_main_dev.o\nendif\nendif\n\n\n\n\n\n\n\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/common/wapi.o\nendif\n#endif // WAPI_SUPPORT //\n\n\n\n#ifdef P2P_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_P2P_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n        $(RT28xx_DIR)/common/p2p_inf.o\nendif\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t$(RT28xx_DIR)/ap/ap_mbss.o\\\n\t$(RT28xx_DIR)/ap/ap.o\\\n\t$(RT28xx_DIR)/ap/ap_assoc.o\\\n\t$(RT28xx_DIR)/ap/ap_auth.o\\\n\t$(RT28xx_DIR)/ap/ap_connect.o\\\n\t$(RT28xx_DIR)/ap/ap_mlme.o\\\n\t$(RT28xx_DIR)/ap/ap_sanity.o\\\n\t$(RT28xx_DIR)/ap/ap_sync.o\\\n\t$(RT28xx_DIR)/ap/ap_wpa.o\\\n\t$(RT28xx_DIR)/ap/ap_data.o\\\n\t$(RT28xx_DIR)/common/uapsd.o\\\n\t$(RT28xx_DIR)/ap/ap_autoChSel.o\\\n\t$(RT28xx_DIR)/ap/ap_qload.o\\\n\t$(RT28xx_DIR)/sta/p2pcli.o \\\n\t$(RT28xx_DIR)/sta/p2pcli_ctrl.o \\\n\t$(RT28xx_DIR)/sta/p2pcli_sync.o \\\n\t$(RT28xx_DIR)/sta/p2pcli_auth.o \\\n\t$(RT28xx_DIR)/sta/p2pcli_assoc.o \\\n\t$(RT28xx_DIR)/common/cmm_mat.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_iparp.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_pppoe.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_ipv6.o \\\n\t$(RT28xx_DIR)/common/p2p_dbg.o\\\n\t$(RT28xx_DIR)/common/p2p.o\\\n\t$(RT28xx_DIR)/common/p2p_packet.o\\\n\t$(RT28xx_DIR)/common/p2p_action.o\\\n\t$(RT28xx_DIR)/common/p2p_table.o\\\n\t$(RT28xx_DIR)/common/p2p_ctrl.o\\\n\t$(RT28xx_DIR)/common/p2p_disc_mng.o\\\n\t$(RT28xx_DIR)/common/p2p_nego_mng.o\\\n\t$(RT28xx_DIR)/common/p2p_dbg.o\\\n\t$(RT28xx_DIR)/common/p2p.o\\\n\t$(RT28xx_DIR)/common/p2p_packet.o\\\n\t$(RT28xx_DIR)/common/p2p_action.o\\\n\t$(RT28xx_DIR)/common/p2p_table.o\\\n\t$(RT28xx_DIR)/common/p2p_ctrl.o\\\n\t$(RT28xx_DIR)/common/p2p_disc_mng.o\\\n\t$(RT28xx_DIR)/common/p2p_nego_mng.o\\\n\t$(RT28xx_DIR)/common/p2p_cfg.o\\\n\t$(RT28xx_DIR)/common/wsc.o\\\n\t$(RT28xx_DIR)/common/wsc_tlv.o\\\n\t$(RT28xx_DIR)/common/wsc_ufd.o\\\n\t$(RT28xx_DIR)/common/crypt_biginteger.o\\\n\t$(RT28xx_DIR)/common/crypt_dh.o\t\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nRT28XX_STA_OBJ += $(RT28xx_DIR)/ap/ap_dls.o\nendif\n\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\nifeq ($(OSABL),NO)\nRT28XX_STA_OBJ += \\\n        $(RT28xx_DIR)/ap/ap_mbss_inf.o\\\n        $(RT28xx_DIR)/common/rt_os_util.o\\\n        $(RT28xx_DIR)/os/linux/ap_ioctl.o\\\n        $(RT28xx_DIR)/os/linux/sta_ioctl.o\\\n        $(RT28xx_DIR)/os/linux/rt_linux.o\\\n        $(RT28xx_DIR)/os/linux/rt_main_dev.o\nelse\nrt$(MODULE)sta-objs += \\\n        ../../os/linux/rt_symb.o\nendif\nendif\n#endif // P2P_SUPPORT //\n\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nRT28XX_APSTA_OBJ := \\\n\t$(RT28xx_DIR)/common/crypt_md5.o\\\n\t$(RT28xx_DIR)/common/crypt_sha2.o\\\n\t$(RT28xx_DIR)/common/crypt_hmac.o\\\n\t$(RT28xx_DIR)/common/crypt_aes.o\\\n\t$(RT28xx_DIR)/common/crypt_arc4.o\\\n\t$(RT28xx_DIR)/common/mlme.o\\\n\t$(RT28xx_DIR)/common/cmm_wep.o\\\n\t$(RT28xx_DIR)/common/action.o\\\n\t$(RT28xx_DIR)/common/cmm_data.o\\\n\t$(RT28xx_DIR)/common/rtmp_init.o\\\n\t$(RT28xx_DIR)/common/cmm_tkip.o\\\n\t$(RT28xx_DIR)/common/cmm_aes.o\\\n\t$(RT28xx_DIR)/common/cmm_sync.o\\\n\t$(RT28xx_DIR)/common/eeprom.o\\\n\t$(RT28xx_DIR)/common/cmm_sanity.o\\\n\t$(RT28xx_DIR)/common/cmm_info.o\\\n\t$(RT28xx_DIR)/common/cmm_cfg.o\\\n\t$(RT28xx_DIR)/common/cmm_wpa.o\\\n\t$(RT28xx_DIR)/common/cmm_wpa_adhoc.o\\\n\t$(RT28xx_DIR)/common/dfs.o\\\n\t$(RT28xx_DIR)/common/spectrum.o\\\n\t$(RT28xx_DIR)/common/rtmp_timer.o\\\n\t$(RT28xx_DIR)/common/rt_channel.o\\\n\t$(RT28xx_DIR)/common/cmm_profile.o\\\n\t$(RT28xx_DIR)/common/cmm_asic.o\\\n\t$(RT28xx_DIR)/common/cmm_cmd.o\\\n\t$(RT28xx_DIR)/rate_ctrl/ra_ctrl.o\\\n\t$(RT28xx_DIR)/rate_ctrl/alg_legacy.o\\\n\t$(RT28xx_DIR)/ap/ap.o\\\n\t$(RT28xx_DIR)/ap/ap_assoc.o\\\n\t$(RT28xx_DIR)/ap/ap_auth.o\\\n\t$(RT28xx_DIR)/ap/ap_connect.o\\\n\t$(RT28xx_DIR)/ap/ap_mlme.o\\\n\t$(RT28xx_DIR)/ap/ap_sanity.o\\\n\t$(RT28xx_DIR)/ap/ap_sync.o\\\n\t$(RT28xx_DIR)/ap/ap_wpa.o\\\n\t$(RT28xx_DIR)/ap/ap_data.o\\\n\t$(RT28xx_DIR)/common/uapsd.o\\\n\t$(RT28xx_DIR)/sta/assoc.o\\\n\t$(RT28xx_DIR)/sta/auth.o\\\n\t$(RT28xx_DIR)/sta/auth_rsp.o\\\n\t$(RT28xx_DIR)/sta/sync.o\\\n\t$(RT28xx_DIR)/sta/sanity.o\\\n\t$(RT28xx_DIR)/sta/rtmp_data.o\\\n\t$(RT28xx_DIR)/sta/connect.o\\\n\t$(RT28xx_DIR)/sta/wpa.o\\\n\t$(RT28xx_DIR)/sta/sta_cfg.o\\\n\t$(RT28xx_DIR)/ap/ap_autoChSel.o\\\n\t$(RT28xx_DIR)/ap/ap_qload.o\\\n\t$(RT28xx_DIR)/ap/ap_cfg.o\n\nifeq ($(OSABL),NO)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/rtmp_init_inf.o\\\n\t$(RT28xx_DIR)/ap/ap_mbss.o\\\n\t$(RT28xx_DIR)/os/linux/rt_profile.o\\\n\t$(RT28xx_DIR)/os/linux/ap_ioctl.o\\\n\t$(RT28xx_DIR)/os/linux/sta_ioctl.o\\\n\t$(RT28xx_DIR)/os/linux/rt_linux.o\\\n\t$(RT28xx_DIR)/os/linux/rt_main_dev.o\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nRT28XX_APSTA_OBJS += $(RT28xx_DIR)/rate_ctrl/alg_grp.o\nendif\n\n#ifdef DOT11_N_SUPPORT\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/ba_action.o\n\n#ifdef TXBF_SUPPORT\nifeq ($(HAS_TXBF_SUPPORT),y)\nrt$(MODULE)apsta-objs += \\\n\t$(RT28xx_DIR)/common/cmm_txbf.o\\\n\t$(RT28xx_DIR)/common/cmm_txbf_cal.o\nendif\n#endif // TXBF_SUPPORT //\nendif\n#endif // DOT11_N_SUPPORT //\n\n\n#ifdef LED_CONTROL_SUPPORT\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/rt_led.o\nendif\n#endif // LED_CONTROL_SUPPORT //\n\n\n\n\n\n\n\n\nifneq ($(findstring 3573,$(CHIPSET)),)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mac_usb.o\\\n\t$(RT28xx_DIR)/common/rtusb_io.o\\\n\t$(RT28xx_DIR)/common/rtusb_data.o\\\n\t$(RT28xx_DIR)/common/cmm_data_usb.o\\\n\t$(RT28xx_DIR)/common/rtmp_mcu.o\\\n\t$(RT28xx_DIR)/common/ee_prom.o\\\n\t$(RT28xx_DIR)/common/ee_efuse.o\\\n\t$(RT28xx_DIR)/common/rt_rf.o\\\n\t$(RT28xx_DIR)/common/rtusb_bulk.o\\\n\t$(RT28xx_DIR)/common/frq_cal.o\\\n\t$(RT28xx_DIR)/os/linux/rt_usb.o\\\n\t$(RT28xx_DIR)/chips/rt28xx.o\\\n\t$(RT28xx_DIR)/chips/rt30xx.o\\\n\t$(RT28xx_DIR)/chips/rt35xx.o\\\n\t$(RT28xx_DIR)/chips/rt3593.o\n\nifeq ($(OSABL),NO)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/rtusb_dev_id.o\\\n\t$(RT28xx_DIR)/os/linux/rt_usb_util.o\\\n\t$(RT28xx_DIR)/os/linux/usb_main_dev.o\nendif\nifeq ($(HAS_DFS_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/dfs_mcu.o\nendif\nendif\n\nifneq ($(findstring 3593,$(CHIPSET)),)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mac_pci.o\\\n\t$(RT28xx_DIR)/common/cmm_data_pci.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_drv.o\\\n\t$(RT28xx_DIR)/common/rtmp_mcu.o\\\n\t$(RT28xx_DIR)/common/ee_prom.o\\\n\t$(RT28xx_DIR)/common/ee_efuse.o\\\n\t$(RT28xx_DIR)/common/rt_rf.o\\\n\t$(RT28xx_DIR)/common/frq_cal.o\\\n\t$(RT28xx_DIR)/chips/rt30xx.o\\\n\t$(RT28xx_DIR)/chips/rt35xx.o\\\n\t$(RT28xx_DIR)/chips/rt28xx.o\\\n\t$(RT28xx_DIR)/chips/rt3593.o\n\nifeq ($(OSABL),NO)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/rt_pci_rbus.o\\\n\t$(RT28xx_DIR)/os/linux/rt_rbus_pci_util.o\\\n\t$(RT28xx_DIR)/os/linux/pci_main_dev.o\nendif\nifeq ($(HAS_DFS_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/dfs_mcu.o\nendif\nendif\n\n\n\n\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/wsc.o\\\n\t$(RT28xx_DIR)/common/wsc_tlv.o\\\n\t$(RT28xx_DIR)/common/crypt_biginteger.o\\\n\t$(RT28xx_DIR)/common/crypt_dh.o\nendif\n#endif // WSC_INCLUDED //\n\n\nifeq ($(HAS_WDS),y)\nRT28XX_APSTA_OBJ += $(RT28xx_DIR)/ap/ap_wds.o\n\nifeq ($(OSABL),NO)\nRT28XX_APSTA_OBJ += \\\n\t../../ap/ap_wds_inf.o\nendif\nendif\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\nRT28XX_APSTA_OBJ += $(RT28xx_DIR)/ap/ap_dls.o\nendif\n\nifeq ($(HAS_IDS_SUPPORT),y)\nRT28XX_APSTA_OBJ += $(RT28xx_DIR)/ap/ap_ids.o\nendif\n\n#ifdef APCLI_SUPPORT\nifeq ($(HAS_APCLI),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/ap/ap_apcli.o \\\n\t$(RT28xx_DIR)/ap/apcli_ctrl.o \\\n\t$(RT28xx_DIR)/ap/apcli_sync.o \\\n\t$(RT28xx_DIR)/ap/apcli_auth.o \\\n\t$(RT28xx_DIR)/ap/apcli_assoc.o \\\n\t$(RT28xx_DIR)/common/cmm_mat.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_iparp.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_pppoe.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_ipv6.o\n\nifeq ($(OSABL),NO)\nRT28XX_APSTA_OBJ += \\\n\t../../ap/ap_apcli_inf.o\nendif\nendif\n#endif // APCLI_SUPPORT //\n\n#ifdef ETH_CONVERT\nifeq ($(HAS_ETH_CONVERT_SUPPORT), y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/cmm_mat.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_iparp.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_pppoe.o \\\n\t$(RT28xx_DIR)/common/cmm_mat_ipv6.o\nendif\n#endif // ETH_CONVERT //\n\nifeq ($(HAS_BLOCK_NET_IF),y)\nRT28XX_APSTA_OBJ += $(RT28xx_DIR)/common/netif_block.o\nendif\n\nifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)\nRT28XX_APSTA_OBJ += $(RT28xx_DIR)/common/igmp_snoop.o\nendif\n\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/wapi.o\nendif\n#endif // WAPI_SUPPORT //\n\n\nifeq ($(HAS_CLIENT_WDS_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t$(RT28xx_DIR)/common/client_wds.o\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nPHONY := all release clean install uninstall\n\nall:$(OBJ)\n\nmt$(MODULE)sta.o: $(RT28XX_STA_OBJ)\n\t$(LD) -r $^ -o $@\n\nmt$(MODULE)ap.o: $(RT28XX_AP_OBJ)\n\t$(LD) -r $^ -o $@\n\nmt$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ)\n\t$(LD) -r $^ -o $@\n\nrelease:\n\techo \"MAKE Linux Station Code Release\"\n\nclean:\n\trm -f $(RT28xx_DIR)/common/*.o\n\trm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d}\n\trm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}}\n\trm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d}\n\trm -fr $(RT28xx_DIR)/os/linux/.tmp_versions\n\trm -f $(RT28xx_DIR)/chips/*.o\n\trm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d}\nifeq ($(RT28xx_MODE),AP)\n\trm -f $(RT28xx_DIR)/ap/*.o\n\trm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f $(RT28xx_DIR)/sta/*.o\n\trm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),APSTA)\n\trm -f $(RT28xx_DIR)/ap/*.o\n\trm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}\n\trm -f $(RT28xx_DIR)/sta/*.o\n\trm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}\nendif\nendif\nendif\n\ninstall:\n\tmkdir -pv $(DAT_PATH)\n\tcp -v $(RT28xx_DIR)/../etc/Wireless/RT2870AP/$(DAT_FILE_NAME) $(DAT_PATH)/.\n\tinstall -d $(LINUX_SRC_MODULE)\n\tinstall -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE)\n\t/sbin/depmod -a ${shell uname -r}\n\nuninstall:\n\trm -rvf $(DAT_PATH)\n\trm -rvf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME)))\n\t/sbin/depmod -a ${shell uname -r}\n\n# Declare the contents of the .PHONY variable as phony.  We keep that\n# information in a variable so we can use it in if_changed and friends.\n.PHONY: $(PHONY)\n\n"
  },
  {
    "path": "src/os/linux/Makefile.4.netif",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\nMOD_NAME = mtnet$(MODULE)ap\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\nMOD_NAME = mtnet$(MODULE)sta\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\nMOD_NAME = mtnet$(MODULE)apsta\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nOBJ := $(MOD_NAME).o\n\n#ifdef CONFIG_AP_SUPPORT\n\nRT28XX_AP_OBJ := \\\n\t../../ap/ap_mbss_inf.o\\\n\t../../os/linux/ap_ioctl.o\\\n\t../../os/linux/rt_main_dev.o\n\nifeq ($(HAS_WDS),y)\nRT28XX_AP_OBJ += \\\n\t../../ap/ap_wds_inf.o\nendif\n\nifeq ($(HAS_APCLI),y)\nRT28XX_AP_OBJ += \\\n\t../../ap/ap_apcli_inf.o\nendif\n\nifeq ($(HAS_MESH_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t../../common/mesh_inf.o\nendif\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nRT28XX_STA_OBJ := \\\n\t../../os/linux/sta_ioctl.o\\\n\t../../os/linux/rt_main_dev.o\n\nifeq ($(HAS_MESH_SUPPORT),y)\nRT28XX_STA_OBJ += \\\n\t../../common/mesh_inf.o\nendif\n\nifeq ($(HAS_P2P_SUPPORT), y)\nRT28XX_STA_OBJ += \\\n\t../../common/p2p_inf.o\\\n\t../../os/linux/ap_ioctl.o\nendif\n\n\n\n#ifdef MT7601\nifneq ($(findstring 7601,$(CHIPSET)),)\nRT28XX_STA_OBJ += \\\n        ../../common/rtusb_dev_id.o\\\n        ../../os/linux/usb_main_dev.o\nendif\n#endif // MT7601 //\n\n\n\n\n\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nRT28XX_APSTA_OBJ := \\\n\t../../ap/ap_mbss_inf.o\\\n\t../../common/p2p_inf.o\\\n\t../../os/linux/ap_ioctl.o\\\n\t../../os/linux/sta_ioctl.o\\\n\t../../os/linux/rt_main_dev.o\n\nifeq ($(HAS_WDS),y)\nRT28XX_APSTA_OBJ += \\\n\t../../ap/ap_wds_inf.o\nendif\n\nifeq ($(HAS_APCLI),y)\nRT28XX_APSTA_OBJ += \\\n\t../../ap/ap_apcli_inf.o\nendif\n\nifeq ($(HAS_MESH_SUPPORT),y)\nRT28XX_APSTA_OBJ += \\\n\t../../common/mesh_inf.o\nendif\n\n\n\n\n\n\n\n\n\n\n\n\n\n#endif // CONFIG_APSTA_SUPPORT //\n\n\nPHONY := all clean\n\nall:$(OBJ)\n\nmtnet$(MODULE)sta.o: $(RT28XX_STA_OBJ)\n\t$(LD) -r $^ -o $@\n\nmtnet$(MODULE)ap.o: $(RT28XX_AP_OBJ)\n\t$(LD) -r $^ -o $@\n\nmtnet$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ)\n\t$(LD) -r $^ -o $@\n\nclean:\n\trm -f $(RT28xx_DIR)/common/*.o\n\trm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d}\n\trm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}}\n\trm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d}\n\trm -fr $(RT28xx_DIR)/os/linux/.tmp_versions\n\trm -f $(RT28xx_DIR)/chips/*.o\n\trm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d}\nifeq ($(RT28xx_MODE),AP)\n\trm -f $(RT28xx_DIR)/ap/*.o\n\trm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f $(RT28xx_DIR)/sta/*.o\n\trm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),APSTA)\n\trm -f $(RT28xx_DIR)/ap/*.o\n\trm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}\n\trm -f $(RT28xx_DIR)/sta/*.o\n\trm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}\nendif\nendif\nendif\n\ninstall:\n\tinstall -d $(LINUX_SRC_MODULE)\n\tinstall -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE)\n\t/sbin/depmod -a ${shell uname -r}\n\nuninstall:\n\trm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME)))\n\t/sbin/depmod -a ${shell uname -r}\n\n# Declare the contents of the .PHONY variable as phony.  We keep that\n# # information in a variable so we can use it in if_changed and friends.\n.PHONY: $(PHONY)\n"
  },
  {
    "path": "src/os/linux/Makefile.4.util",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\nMOD_NAME = mtutil$(MODULE)ap\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\nMOD_NAME = mtutil$(MODULE)sta\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\nMOD_NAME = mtutil$(MODULE)apsta\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nOBJ := $(MOD_NAME).o\n\n#ifdef CONFIG_AP_SUPPORT\n\nRT28XX_AP_OBJ := \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/rt_linux_symb.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/rt_usb_util.o\\\n\t../../os/linux/rt_linux.o\n\nifeq ($(HAS_BGFP_SUPPORT),y)\nRT28XX_AP_OBJ += \\\n\t$(RT28xx_DIR)/os/linux/br_ftph.o\nendif\n\n#endif // CONFIG_AP_SUPPORT //\n\n\n#ifdef CONFIG_STA_SUPPORT\n\nRT28XX_STA_OBJ := \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/rt_linux_symb.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/rt_usb_util.o\\\n\t../../os/linux/rt_linux.o\n#endif // CONFIG_STA_SUPPORT //\n\n\n#ifdef CONFIG_APSTA_SUPPORT\nRT28XX_APSTA_OBJ := \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/rt_linux_symb.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/rt_usb_util.o\\\n\t../../os/linux/rt_linux.o\n\n#endif // CONFIG_APSTA_SUPPORT //\n\nPHONY := all clean\n\nall:$(OBJ)\n\nmtutil$(MODULE)sta.o: $(RT28XX_STA_OBJ)\n\t$(LD) -r $^ -o $@\n\nmtutil$(MODULE)ap.o: $(RT28XX_AP_OBJ)\n\t$(LD) -r $^ -o $@\n\nmtutil$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ)\n\t$(LD) -r $^ -o $@\n\nclean:\n\trm -f $(RT28xx_DIR)/common/*.o\n\trm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d}\n\trm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}}\n\trm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d}\n\trm -fr $(RT28xx_DIR)/os/linux/.tmp_versions\n\trm -f $(RT28xx_DIR)/chips/*.o\n\trm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d}\nifeq ($(RT28xx_MODE),AP)\n\trm -f $(RT28xx_DIR)/ap/*.o\n\trm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f $(RT28xx_DIR)/sta/*.o\n\trm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),APSTA)\n\trm -f $(RT28xx_DIR)/ap/*.o\n\trm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}\n\trm -f $(RT28xx_DIR)/sta/*.o\n\trm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}\nendif\nendif\nendif\n\ninstall:\n\tinstall -d $(LINUX_SRC_MODULE)\n\tinstall -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE)\n\t/sbin/depmod -a ${shell uname -r}\n\nuninstall:\n\trm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME)))\n\t/sbin/depmod -a ${shell uname -r}\n\n# Declare the contents of the .PHONY variable as phony.  We keep that\n# # information in a variable so we can use it in if_changed and friends.\n.PHONY: $(PHONY)\n"
  },
  {
    "path": "src/os/linux/Makefile.6",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\nobj_wsc :=\nobj_vht :=\nobj_cmm := \\\n\t../../common/crypt_md5.o\\\n        ../../common/crypt_sha2.o\\\n        ../../common/crypt_hmac.o\\\n        ../../common/crypt_aes.o\\\n        ../../common/crypt_arc4.o\\\n        ../../common/mlme.o\\\n        ../../common/cmm_wep.o\\\n        ../../common/action.o\\\n        ../../common/cmm_data.o\\\n\t../../common/rtmp_init.o\\\n        ../../common/rtmp_init_inf.o\\\n        ../../common/cmm_tkip.o\\\n        ../../common/cmm_aes.o\\\n        ../../common/cmm_sync.o\\\n        ../../common/eeprom.o\\\n        ../../common/cmm_sanity.o\\\n        ../../common/cmm_info.o\\\n        ../../common/cmm_cfg.o\\\n        ../../common/cmm_wpa.o\\\n        ../../common/cmm_radar.o\\\n\t../../common/spectrum.o\\\n        ../../common/rtmp_timer.o\\\n        ../../common/rt_channel.o\\\n        ../../common/cmm_profile.o\\\n        ../../common/cmm_asic.o\\\n        ../../common/scan.o\\\n        ../../common/cmm_cmd.o\\\n        ../../common/uapsd.o\\\n\t../../common/ps.o\\\n\t../../rate_ctrl/ra_ctrl.o\\\n        ../../rate_ctrl/alg_legacy.o\\\n        ../../rate_ctrl/alg_ags.o\\\n\t../../chips/rtmp_chip.o\\\n\t\t../../common/txpower.o\\\n\t../../mac/rtmp_mac.o\\\n\t../../mgmt/mgmt_hw.o\\\n\t../../mgmt/mgmt_entrytb.o\\\n        ../../phy/rtmp_phy.o\\\n        ../../phy/rlt_phy.o\\\n\t../../phy/rlt_rf.o\n\nifeq ($(HAS_BLOCK_NET_IF),y)\nobj_cmm += ../../common/netif_block.o\nendif\n\nifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)\nobj_cmm += ../../rate_ctrl/alg_grp.o\nendif\n\nifeq ($(HAS_RATE_ADAPT_AGS_SUPPORT),y)\nobj_cmm += ../../rate_ctrl/alg_ags.o\nendif\n\nifeq ($(HAS_DFS_SUPPORT),y)\nobj_cmm += ../../common/cmm_dfs.o\nendif\n\nifeq ($(HAS_CS_SUPPORT),y)\nobj_cmm += ../../common/cmm_cs.o\nendif\n\n#ifdef DOT11_N_SUPPORT\nifeq ($(HAS_DOT11_N_SUPPORT),y)\nobj_cmm += \\\n        ../../common/ba_action.o\\\n        ../../mgmt/mgmt_ht.o\n\n#ifdef TXBF_SUPPORT\nifeq ($(HAS_TXBF_SUPPORT),y)\nobj_cmm += \\\n        ../../common/cmm_txbf.o\\\n        ../../common/cmm_txbf_cal.o\nendif\n#endif // TXBF_SUPPORT //\nendif\n#endif // DOT11_N_SUPPORT //\n\n#ifdef DOT11_VHT_SUPPORT\nifeq ($(HAS_DOT11_VHT_SUPPORT),y)\nobj_vht += ../../mgmt/mgmt_vht.o\\\n\t../../common/vht.o\nendif\n#endif // DOT11_VHT_SUPPORT //\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC),y)\nobj_wsc += \\\n        ../../common/wsc.o\\\n        ../../common/wsc_tlv.o\\\n        ../../common/crypt_biginteger.o\\\n        ../../common/crypt_dh.o\nendif\nifeq ($(HAS_WSC_V2),y)\nobj_wsc += ../../common/wsc_v2.o\nendif\n#endif // WSC_INCLUDED //\n\n\n#ifdef ANDES_FIRMWARE_SUPPORT\nifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y)\nobj_cmm += ../../mcu/rtmp_and.o\nendif\n#endif /* ANDES_FIRMWARE_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\nifneq ($(findstring 7601,$(CHIPSET)),)\nMOD_NAME = mt$(MODULE)ap\nelse\nMOD_NAME = rt$(MODULE)ap\nendif\nDAT_PATH = /etc/Wireless/RT$(CHIPSET_DAT)AP\nDAT_FILE_NAME = RT$(CHIPSET_DAT)AP.dat\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\nifneq ($(findstring 7601,$(CHIPSET)),)\nMOD_NAME = mt$(MODULE)sta\nelse\nMOD_NAME = rt$(MODULE)sta\nendif\nDAT_PATH = /etc/Wireless/RT$(CHIPSET_DAT)STA\nDAT_FILE_NAME = RT$(CHIPSET_DAT)STA.dat\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\nMOD_NAME = rt$(MODULE)apsta\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nobj-m := $(MOD_NAME).o\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\n$(MOD_NAME)-objs := \\\n\t../../os/linux/rt_profile.o\\\n\t../../ap/ap_mbss.o\\\n\t../../ap/ap.o\\\n\t../../ap/ap_assoc.o\\\n\t../../ap/ap_auth.o\\\n\t../../ap/ap_connect.o\\\n\t../../ap/ap_mlme.o\\\n\t../../ap/ap_sanity.o\\\n\t../../ap/ap_sync.o\\\n\t../../ap/ap_wpa.o\\\n\t../../ap/ap_data.o\\\n\t../../ap/ap_autoChSel.o\\\n\t../../ap/ap_qload.o\\\n\t../../ap/ap_cfg.o\\\n\t$(obj_vht)\\\n\t$(obj_cmm)\\\n\t$(obj_wsc)\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC),y)\n$(MOD_NAME)-objs += \\\n        ../../common/wsc_ufd.o\nendif\n#endif // WSC_INCLUDE //\n\t\nifeq ($(HAS_ATE),y)\n$(MOD_NAME)-objs += ../../ate/common/rt_ate.o\nendif\n\nifeq ($(HAS_QA_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ate/common/rt_qa.o\nendif\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_mbss_inf.o\\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/ap_ioctl.o\\\n\t../../os/linux/rt_linux.o\\\n\t../../os/linux/rt_main_dev.o\nelse\n$(MOD_NAME)-objs += \\\n\t../../os/linux/rt_symb.o\nendif\n\n#ifdef BG_FT_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_BGFP_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/br_ftph.o\nendif\nendif\n#endif // BG_FT_SUPPORT //\n\n\n#ifdef CRDA_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211.o\\\n\t../../os/linux/cfg80211drv.o\nendif\nendif\n\nifeq ($(OSABL),YES)\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211drv.o\nendif\nendif\n#endif // CRDA_SUPPORT //\n\n#ifdef LED_CONTROL_SUPPORT\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/rt_led.o\nendif\n#endif // LED_CONTROL_SUPPORT //\n\n\nifeq ($(HAS_RT2880_RT2860_COEXIST),y)\t\nRT28XX_AP_OBJ += \\\n\t../../os/linux/rt_pci_rbus.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/pci_main_dev.o\\\n\t../../common/dfs.o\nendif\n\n\n\nifeq ($(HAS_WDS),y)\n$(MOD_NAME)-objs += ../../ap/ap_wds.o\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_wds_inf.o\nendif\nendif\n\n#ifdef APCLI_SUPPORT\nifeq ($(HAS_APCLI),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_apcli.o \\\n\t../../ap/apcli_ctrl.o \\\n\t../../ap/apcli_sync.o \\\n\t../../ap/apcli_auth.o \\\n\t../../ap/apcli_assoc.o \\\n\t../../common/cmm_mat.o \\\n\t../../common/cmm_mat_iparp.o \\\n\t../../common/cmm_mat_pppoe.o \\\n\t../../common/cmm_mat_ipv6.o\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_apcli_inf.o\nendif\nendif\n#endif // APCLI_SUPPORT //\n\nifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)\n$(MOD_NAME)-objs += ../../common/igmp_snoop.o\nendif\n\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ap/ap_dls.o\nendif\n\nifeq ($(HAS_IDS_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ap/ap_ids.o\nendif\n\nifeq ($(PLATFORM),IKANOS_V160)\n$(MOD_NAME)-objs += ../../os/linux/vr_ikans.o\nendif\n\nifeq ($(PLATFORM),IKANOS_V180)\n$(MOD_NAME)-objs += ../../os/linux/vr_ikans.o\nendif\n\nifeq ($(PLATFORM),BL2348)\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += ../../os/linux/vr_bdlt.o\nendif\nendif\n#ifdef PLATFORM_BL23570\nifeq ($(PLATFORM),BL23570)\nrt$(CHIPSET)ap-objs += \\\n        ../../os/linux/vr_bdlt.o\nendif\n#endif // PLATFORM_BL23570 //\n\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/wapi.o\nendif\n#endif // WAPI_SUPPORT //\n\n\n\n\n\nifeq ($(HAS_CLIENT_WDS_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/client_wds.o\nendif\n\nifeq ($(HAS_EASY_CONFIG_SETUP_SUPPORT),y)\nifeq ($(PLATFORM),RALINK_3052)\n$(MOD_NAME)-objs += lib.a\nendif\nendif\n\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\n$(MOD_NAME)-objs := \\\n\t../../os/linux/rt_profile.o\\\n\t../../sta/assoc.o\\\n\t../../sta/auth.o\\\n\t../../sta/auth_rsp.o\\\n\t../../sta/sync.o\\\n\t../../sta/sanity.o\\\n\t../../sta/rtmp_data.o\\\n\t../../sta/connect.o\\\n\t../../sta/wpa.o\\\n\t../../sta/sta_cfg.o\\\n\t$(obj_vht)\\\n\t$(obj_cmm)\\\n\t$(obj_wsc)\n\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/sta_ioctl.o\\\n\t../../os/linux/rt_linux.o\\\n\t../../os/linux/rt_main_dev.o\nelse\n$(MOD_NAME)-objs += \\\n\t../../os/linux/rt_symb.o\nendif\n\n#ifdef ETH_CONVERT\nifeq ($(HAS_ETH_CONVERT_SUPPORT), y)\n$(MOD_NAME)-objs += \\\n\t../../common/cmm_mat.o \\\n\t../../common/cmm_mat_iparp.o \\\n\t../../common/cmm_mat_pppoe.o \\\n\t../../common/cmm_mat_ipv6.o\nendif\n#endif // ETH_CONVERT //\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n$(MOD_NAME)-objs += \\\n\t../../common/cmm_wpa_adhoc.o\n#endif // ADHOC_WPA2PSK_SUPPORT //\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC_V2),y)\nifeq ($(HAS_WIDI_SUPPORT),y)\n$(MOD_NAME)-objs += ../../common/l2sd_ta_mod.o\nendif\n\nifeq ($(HAS_IWSC_SUPPORT),y)\n$(MOD_NAME)-objs += ../../sta/sta_iwsc.o\nendif\n\nendif\n#endif // WSC_INCLUDED //\n\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\n$(MOD_NAME)-objs += ../../sta/dls.o\nendif\n\n#ifdef DOT11Z_TDLS_SUPPORT\nifeq ($(HAS_DOT11Z_TDLS_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../sta/tdls.o\\\n\t../../sta/tdls_ctrl.o\\\n\t../../sta/tdls_tlv.o\\\n\t../../sta/tdls_link_mng.o\\\n\t../../sta/tdls_uapsd.o\nendif\n#endif // DOT11Z_TDLS_SUPPORT //\n\n#ifdef WFD_SUPPORT\nifeq ($(HAS_WFD_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/wfd.o\nendif\n#endif // WFD_SUPPORT //\n\n\n#ifdef LED_CONTROL_SUPPORT\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/rt_led.o\nendif\n#endif // LED_CONTROL_SUPPORT //\n\n\nifeq ($(HAS_ATE),y)\n$(MOD_NAME)-objs += ../../ate/common/rt_ate.o\nendif\n\nifeq ($(HAS_QA_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ate/common/rt_qa.o\nendif\n\n\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/wapi.o\nendif\n#endif // WAPI_SUPPORT //\n\n\n\n#ifdef P2P_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_P2P_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/p2p_inf.o\nendif\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_mbss.o\\\n\t../../ap/ap.o\\\n\t../../ap/ap_assoc.o\\\n\t../../ap/ap_auth.o\\\n\t../../ap/ap_connect.o\\\n\t../../ap/ap_mlme.o\\\n\t../../ap/ap_sanity.o\\\n\t../../ap/ap_sync.o\\\n\t../../ap/ap_wpa.o\\\n\t../../ap/ap_data.o\\\n\t../../ap/ap_autoChSel.o\\\n\t../../ap/ap_qload.o\\\n\t../../sta/p2pcli.o \\\n\t../../sta/p2pcli_ctrl.o \\\n\t../../sta/p2pcli_sync.o \\\n\t../../sta/p2pcli_auth.o \\\n\t../../sta/p2pcli_assoc.o \\\n\t../../common/cmm_mat.o \\\n\t../../common/cmm_mat_iparp.o \\\n\t../../common/cmm_mat_pppoe.o \\\n\t../../common/cmm_mat_ipv6.o \\\n\t../../common/p2p_dbg.o\\\n\t../../common/p2p_cfg.o\\\n\t../../common/p2p.o\\\n\t../../common/p2p_packet.o\\\n\t../../common/p2p_action.o\\\n\t../../common/p2p_table.o\\\n\t../../common/p2p_ctrl.o\\\n\t../../common/p2p_disc_mng.o\\\n\t../../common/p2p_nego_mng.o\\\n\t../../common/p2p_dbg.o\\\n\t../../common/p2p.o\\\n\t../../common/p2p_packet.o\\\n\t../../common/p2p_action.o\\\n\t../../common/p2p_table.o\\\n\t../../common/p2p_ctrl.o\\\n\t../../common/p2p_disc_mng.o\\\n\t../../common/p2p_nego_mng.o\\\n\t../../common/wsc.o\\\n\t../../common/wsc_tlv.o\\\n\t../../common/wsc_ufd.o\\\n\t../../common/crypt_biginteger.o\\\n\t../../common/crypt_dh.o\t\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ap/ap_dls.o\nendif\n\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n        ../../ap/ap_mbss_inf.o\\\n        ../../common/rt_os_util.o\\\n        ../../os/linux/ap_ioctl.o\\\n        ../../os/linux/sta_ioctl.o\\\n        ../../os/linux/rt_linux.o\\\n        ../../os/linux/rt_main_dev.o\nelse\n$(MOD_NAME)-objs += \\\n        ../../os/linux/rt_symb.o\nendif\nendif\n#endif // P2P_SUPPORT //\n\n#ifdef CRDA_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211.o \\\n\t../../os/linux/cfg80211drv.o\nendif\nendif\n\nifeq ($(OSABL),YES)\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211drv.o\nendif\nendif\n#endif // CRDA_SUPPORT //\n\n\n#ifdef CONFIG_MULTI_CHANNEL\nifeq ($(HAS_MULTI_CHANNEL),y)\n$(MOD_NAME)-objs += \\\n        ../../common/multi_channel.o\nendif\n#endif /* CONFIG_MULTI_CHANNEL */\n\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\n$(MOD_NAME)-objs := \\\n\t../../common/cmm_wpa_adhoc.o\\\n\t../../os/linux/rt_profile.o\\\n\t../../ap/ap_mbss.o\\\n\t../../chips/rtmp_chip.o\\\n\t../../ap/ap.o\\\n\t../../ap/ap_assoc.o\\\n\t../../ap/ap_auth.o\\\n\t../../ap/ap_connect.o\\\n\t../../ap/ap_mlme.o\\\n\t../../ap/ap_sanity.o\\\n\t../../ap/ap_sync.o\\\n\t../../ap/ap_wpa.o\\\n\t../../ap/ap_data.o\\\n\t../../sta/assoc.o\\\n\t../../sta/auth.o\\\n\t../../sta/auth_rsp.o\\\n\t../../sta/sync.o\\\n\t../../sta/sanity.o\\\n\t../../sta/rtmp_data.o\\\n\t../../sta/connect.o\\\n\t../../sta/wpa.o\\\n\t../../ap/ap_autoChSel.o\\\n\t../../ap/ap_qload.o\\\n\t../../ap/ap_cfg.o\\\n\t../../sta/sta_cfg.o\\\n\t$(obj_cmm)\\\n\t$(obj_wsc)\n\n#ifdef WSC_INCLUDED\nifeq ($(HAS_WSC),y)\n$(MOD_NAME)-objs += \\\n        ../../common/wsc_ufd.o\nendif\n#endif // WSC_INCLUDE //\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_mbss_inf.o\\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/ap_ioctl.o\\\n\t../../os/linux/sta_ioctl.o\\\n\t../../os/linux/rt_linux.o\\\n\t../../os/linux/rt_main_dev.o\nelse\n$(MOD_NAME)-objs += \\\n\t../../os/linux/rt_symb.o\nendif\n\n\n#ifdef LED_CONTROL_SUPPORT\nifeq ($(HAS_LED_CONTROL_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/rt_led.o\nendif\n#endif // LED_CONTROL_SUPPORT //\n\n\nifeq ($(HAS_WDS),y)\n$(MOD_NAME)-objs += ../../ap/ap_wds.o\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_wds_inf.o\nendif\nendif\n\nifeq ($(HAS_QOS_DLS_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ap/ap_dls.o\nendif\n\nifeq ($(HAS_IDS_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ap/ap_ids.o\nendif\n\n#ifdef APCLI_SUPPORT\nifeq ($(HAS_APCLI),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_apcli.o \\\n\t../../ap/apcli_ctrl.o \\\n\t../../ap/apcli_sync.o \\\n\t../../ap/apcli_auth.o \\\n\t../../ap/apcli_assoc.o \\\n\t../../common/cmm_mat.o \\\n\t../../common/cmm_mat_iparp.o \\\n\t../../common/cmm_mat_pppoe.o \\\n\t../../common/cmm_mat_ipv6.o\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_apcli_inf.o\nendif\nendif\n#endif // APCLI_SUPPORT //\n\n#ifdef ETH_CONVERT\nifeq ($(HAS_ETH_CONVERT_SUPPORT), y)\n$(MOD_NAME)-objs += \\\n\t../../common/cmm_mat.o \\\n\t../../common/cmm_mat_iparp.o \\\n\t../../common/cmm_mat_pppoe.o \\\n\t../../common/cmm_mat_ipv6.o\nendif\n#endif // ETH_CONVERT //\n\nifeq ($(HAS_ATE),y)\n$(MOD_NAME)-objs += ../../ate/common/rt_ate.o\nendif\n\nifeq ($(HAS_QA_SUPPORT),y)\n$(MOD_NAME)-objs += ../../ate/common/rt_qa.o\nendif\n\nifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)\n$(MOD_NAME)-objs += ../../common/igmp_snoop.o\nendif\n\n\n#ifdef WAPI_SUPPORT\nifeq ($(HAS_WAPI_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/libwapi.a\\\n\t../../common/wapi.o\nendif\n#endif // WAPI_SUPPORT //\n\n\nifeq ($(HAS_CLIENT_WDS_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/client_wds.o\nendif\n\n#ifdef CRDA_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211.o\nendif\nendif\n#endif // CRDA_SUPPORT //\n\n#ifdef P2P_SUPPORT\nifeq ($(OSABL),NO)\nifeq ($(HAS_P2P_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/p2p_inf.o\nendif\nendif\n\nifeq ($(HAS_P2P_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../sta/p2pcli.o \\\n\t../../sta/p2pcli_ctrl.o \\\n\t../../sta/p2pcli_sync.o \\\n\t../../sta/p2pcli_auth.o \\\n\t../../sta/p2pcli_assoc.o \\\n\t../../common/cmm_mat.o \\\n\t../../common/cmm_mat_iparp.o \\\n\t../../common/cmm_mat_pppoe.o \\\n\t../../common/cmm_mat_ipv6.o \\\n\t../../common/p2p_dbg.o\\\n\t../../common/p2p.o\\\n\t../../common/p2p_packet.o\\\n\t../../common/p2p_action.o\\\n\t../../common/p2p_table.o\\\n\t../../common/p2p_ctrl.o\\\n\t../../common/p2p_disc_mng.o\\\n\t../../common/p2p_nego_mng.o\nendif\n#endif // P2P_SUPPORT //\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\n\n#chip releated\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#ifdef RT3290\nifneq ($(findstring 3290,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n\t../../common/cmm_mac_pci.o\\\n\t../../common/cmm_data_pci.o\\\n\t../../os/linux/rt_rbus_pci_drv.o\\\n\t../../common/rtmp_mcu.o\\\n\t../../common/ee_prom.o\\\n\t../../common/ee_efuse.o\\\n\t../../common/rt_rf.o\\\n\t../../chips/rt30xx.o\\\n\t../../chips/rt3290.o\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n        ../../os/linux/rt_pci_rbus.o\\\n        ../../os/linux/rt_rbus_pci_util.o\\\n        ../../os/linux/pci_main_dev.o\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\n$(MOD_NAME)-objs += \\\n\t../../common/frq_cal.o\nendif\n\nendif\n#endif // RT3290 //\n\n#ifdef RT6592\nifneq ($(findstring 6592,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n        ../../common/cmm_mac_pci.o\\\n        ../../common/cmm_data_pci.o\\\n        ../../os/linux/rt_rbus_pci_drv.o\\\n        ../../common/rtmp_mcu.o\\\n        ../../common/ee_prom.o\\\n        ../../common/ee_efuse.o\\\n        ../../common/rt_rf.o\\\n        ../../chips/rt6592.o\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n        ../../os/linux/rt_pci_rbus.o\\\n        ../../os/linux/rt_rbus_pci_util.o\\\n        ../../os/linux/pci_main_dev.o\nendif\nendif\n#endif // RT6592 //\n\n\n\n\n\n#ifdef RT6590\nifneq ($(findstring 6590,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n                ../../common/cmm_mac_pci.o\\\n                ../../common/cmm_data_pci.o\\\n                ../../os/linux/rt_rbus_pci_drv.o\\\n\t\t\t\t../../common/ee_efuse.o\\\n                ../../common/ee_prom.o\\\n                ../../common/rt_rf.o\\\n                ../../chips/rt30xx.o\\\n\t\t../../chips/rt65xx.o\\\n                ../../chips/rt6590.o\\\n\t\t../../mac/ral_nmac.o\\\n\t\t../../mcu/rtmp_and.o\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/ee_flash.o\nendif\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n                ../../os/linux/rt_pci_rbus.o\\\n                ../../os/linux/rt_rbus_pci_util.o\\\n                ../../os/linux/pci_main_dev.o\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\n$(MOD_NAME)-objs += \\\n        ../../common/frq_cal.o\nendif\n\nendif\n#endif // RT6590 //\n\n\n#ifdef RT6570\nifneq ($(findstring 6570,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n                ../../common/cmm_mac_usb.o\\\n                ../../common/cmm_data_usb.o\\\n\t\t../../common/rtusb_io.o\\\n\t\t../../common/rtusb_data.o\\\n\t\t../../common/rtusb_bulk.o\\\n                ../../os/linux/rt_usb.o\\\n                ../../common/ee_prom.o\\\n\t\t\t\t../../common/ee_efuse.o\\\n                ../../common/rtmp_mcu.o\\\n                ../../common/rt_rf.o\\\n                ../../chips/rt30xx.o\\\n\t\t../../chips/rt65xx.o\\\n                ../../chips/rt6590.o\\\n                ../../mac/ral_nmac.o\\\n                ../../mcu/rtmp_and.o\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/ee_flash.o\nendif\n\nifeq ($(HAS_TSO_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../naf/net_acc.o\\\n\t../../naf/tso.o\\\n\t../../naf/cso.o\nendif\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n                ../../os/linux/rt_usb.o\\\n                ../../os/linux/rt_usb_util.o\\\n                ../../os/linux/usb_main_dev.o\\\n\t\t../../common/rtusb_dev_id.o\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\n$(MOD_NAME)-objs += \\\n        ../../common/frq_cal.o\nendif\n\nendif\n#endif // RT6570 //\n\n\n#ifdef RT8592\nifneq ($(findstring 8592,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n                ../../common/cmm_mac_pci.o\\\n                ../../common/cmm_data_pci.o\\\n                ../../os/linux/rt_rbus_pci_drv.o\\\n                ../../common/ee_prom.o\\\n\t\t../../common/ee_efuse.o\\\n                ../../common/rtmp_mcu.o\\\n                ../../common/rt_rf.o\\\n                ../../chips/rt30xx.o\\\n\t\t../../chips/rt65xx.o\\\n\t\t../../chips/rt6592.o\\\n                ../../chips/rt85592.o\\\n                ../../mac/ral_nmac.o\\\n                ../../mcu/rtmp_and.o\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/ee_flash.o\nendif\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n                ../../os/linux/rt_pci_rbus.o\\\n                ../../os/linux/rt_rbus_pci_util.o\\\n                ../../os/linux/pci_main_dev.o\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\n$(MOD_NAME)-objs += \\\n        ../../common/frq_cal.o\nendif\n\nendif\n#endif // RT8592 //\n\n\n#ifdef MT7601E\nifneq ($(findstring 7601E,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n                ../../common/cmm_mac_pci.o\\\n                ../../common/cmm_data_pci.o\\\n                ../../os/linux/rt_rbus_pci_drv.o\\\n                ../../common/ee_prom.o\\\n\t\t../../common/ee_efuse.o\\\n\t\t../../mcu/rtmp_and.o\\\n\t\t../../mcu/rtmp_mcu.o\\\n\t\t../../mcu/rtmp_M51.o\\\n                ../../common/rt_rf.o\\\n                ../../chips/rt30xx.o\\\n\t\t../../chips/mt7601.o\\\n\t\t../../mac/ral_omac.o\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/ee_flash.o\nendif\n\nifeq ($(HAS_ATE),y)\n$(MOD_NAME)-objs += \\\n\t../../ate/chips/mt7601_ate.o\\\n\t../../ate/common/ate_usb.o\nendif\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n                ../../os/linux/rt_pci_rbus.o\\\n                ../../os/linux/rt_rbus_pci_util.o\\\n                ../../os/linux/pci_main_dev.o\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\n$(MOD_NAME)-objs += \\\n        ../../common/frq_cal.o\nendif\n\nendif\n#endif // MT7601E //\n\n\n#ifdef MT7601U\nifneq ($(findstring 7601U,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n                ../../common/cmm_mac_usb.o\\\n                ../../common/cmm_data_usb.o\\\n\t\t../../common/rtusb_io.o\\\n\t\t../../common/rtusb_data.o\\\n\t\t../../common/rtusb_bulk.o\\\n                ../../os/linux/rt_usb.o\\\n                ../../common/ee_prom.o\\\n                ../../common/ee_efuse.o\\\n\t\t../../mcu/rtmp_and.o\\\n\t\t../../mcu/rtmp_mcu.o\\\n\t\t../../mcu/rtmp_M51.o\\\n                ../../common/rt_rf.o\\\n\t\t../../chips/mt7601.o\\\n                ../../mac/ral_omac.o\n\nifeq ($(HAS_RTMP_FLASH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n        ../../common/ee_flash.o\nendif\n\nifeq ($(HAS_ATE),y)\n$(MOD_NAME)-objs += \\\n\t../../ate/chips/mt7601_ate.o\\\n\t../../ate/common/ate_usb.o\nendif\n\nifeq ($(HAS_TSO_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../naf/net_acc.o\\\n\t../../naf/tso.o\\\n\t../../naf/cso.o\nendif\n\nifeq ($(OSABL),NO)\n$(MOD_NAME)-objs += \\\n                ../../os/linux/rt_usb.o\\\n                ../../os/linux/rt_usb_util.o\\\n                ../../os/linux/usb_main_dev.o\\\n\t\t../../common/rtusb_dev_id.o\nendif\n\nifneq ($(findstring $(RT28xx_MODE),STA APSTA),)\n$(MOD_NAME)-objs += \\\n        ../../common/frq_cal.o\nendif\n\nendif\n#endif // MT7601U //\n\n\nPHONY := clean install uninstall\n\nclean:\n\trm -f ../../common/*.o\n\trm -f ../../common/.*.{cmd,flags,d}\n\trm -f ../../os/linux/*.{o,ko,mod.{o,c}}\n\trm -f ../../os/linux/.*.{cmd,flags,d}\n\trm -fr ../../os/linux/.tmp_versions\n#Must clean Module.symvers; or you will suffer symbol version not match\n#when OS_ABL = YES.\n\trm -f ../../os/linux/Module.symvers\n\trm -f ../../os/linux/Modules.symvers\n\trm -f ../../os/linux/Module.markers\n\trm -f ../../os/linux/modules.order\n\trm -f ../../chips/*.o\n\trm -f ../../chips/.*.{cmd,flags,d}\nifeq ($(RT28xx_MODE),AP)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f ../../sta/*.o\n\trm -f ../../sta/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),APSTA)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.{cmd,flags,d}\n\trm -f ../../sta/*.o\n\trm -f ../../sta/.*.{cmd,flags,d}\nendif\nendif\nendif\n\ninstall:\n\tmkdir -pv $(DAT_PATH)\n\tcp -v $(RT28xx_DIR)/../etc/Wireless/RT2870AP/$(DAT_FILE_NAME) $(DAT_PATH)/.\n\tinstall -d $(LINUX_SRC_MODULE)\n\tinstall -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)\n\t/sbin/depmod -a ${shell uname -r}\n\nuninstall:\n\trm -rvf $(DAT_PATH)\n\trm -rvf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))\n\t/sbin/depmod -a ${shell uname -r}\n\n# Declare the contents of the .PHONY variable as phony.  We keep that\n# information in a variable so we can use it in if_changed and friends.\n.PHONY: $(PHONY)\n"
  },
  {
    "path": "src/os/linux/Makefile.6.netif",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\nMOD_NAME = rtnet$(MODULE)ap\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\nifneq ($(findstring 7601,$(CHIPSET)),)\nMOD_NAME = mtnet$(MODULE)sta\nelse\nMOD_NAME = rtnet$(MODULE)sta\nendif\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\nMOD_NAME = rtnet$(MODULE)apsta\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nobj-m := $(MOD_NAME).o\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\n$(MOD_NAME)-objs := \\\n\t../../ap/ap_mbss_inf.o\\\n\t../../os/linux/ap_ioctl.o\\\n\t../../os/linux/rt_main_dev.o\n\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211.o\nendif\n\nifeq ($(HAS_WDS),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_wds_inf.o\nendif\n\nifeq ($(HAS_APCLI),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_apcli_inf.o\nendif\n\nifeq ($(HAS_MESH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/mesh_inf.o\nendif\n\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\n$(MOD_NAME)-objs := \\\n\t../../os/linux/sta_ioctl.o\\\n\t../../os/linux/rt_main_dev.o\n\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211.o\nendif\n\nifeq ($(HAS_MESH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/mesh_inf.o\nendif\n\nifeq ($(HAS_P2P_SUPPORT), y)\n$(MOD_NAME)-objs += \\\n\t../../common/p2p_inf.o\\\n\t../../os/linux/ap_ioctl.o\nendif\n\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\n$(MOD_NAME)-objs := \\\n\t../../ap/ap_mbss_inf.o\\\n\t../../common/p2p_inf.o\\\n\t../../os/linux/ap_ioctl.o\\\n\t../../os/linux/sta_ioctl.o\\\n\t../../os/linux/rt_main_dev.o\n\nifeq ($(HAS_CFG80211_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/cfg80211.o\nendif\n\nifeq ($(HAS_WDS),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_wds_inf.o\nendif\n\nifeq ($(HAS_APCLI),y)\n$(MOD_NAME)-objs += \\\n\t../../ap/ap_apcli_inf.o\nendif\n\nifeq ($(HAS_MESH_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../common/mesh_inf.o\nendif\n\n\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\n#chip related\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#ifdef MT7601\nifneq ($(findstring 7601,$(CHIPSET)),)\n$(MOD_NAME)-objs += \\\n\t../../common/rtusb_dev_id.o\\\n\t../../os/linux/usb_main_dev.o\nendif\n#endif // MT7601 //\n\nclean:\n\trm -f ../../common/*.o\n\trm -f ../../common/.*.{cmd,flags,d}\n\trm -f ../../os/linux/*.{o,ko,mod.{o,c}}\n\trm -f ../../os/linux/.*.{cmd,flags,d}\n\trm -fr ../../os/linux/.tmp_versions\n\trm -f ../../os/linux/Module.symvers\n\trm -f ../../os/linux/Modules.symvers\n\trm -f ../../os/linux/Module.markers\n\trm -f ../../os/linux/modules.order\n\trm -f ../../chips/*.o\n\trm -f ../../chips/.*.{cmd,flags,d}\nifeq ($(RT28xx_MODE),AP)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f ../../sta/*.o\n\trm -f ../../sta/.*.{cmd,flags,d}\nendif\nendif\n\ninstall:\n\tinstall -d $(LINUX_SRC_MODULE)\n\tinstall -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)\n\t/sbin/depmod -a ${shell uname -r}\n\nuninstall:\n\trm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))\n\t/sbin/depmod -a ${shell uname -r}\n"
  },
  {
    "path": "src/os/linux/Makefile.6.util",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\nMOD_NAME = rtutil$(MODULE)ap\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\nifneq ($(findstring 7601,$(CHIPSET)),)\nMOD_NAME = mtutil$(MODULE)sta\nelse\nMOD_NAME = rtutil$(MODULE)sta\nendif\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\nMOD_NAME = rtutil$(MODULE)apsta\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nobj-m := $(MOD_NAME).o\n\n#ifdef CONFIG_AP_SUPPORT\nifeq ($(RT28xx_MODE),AP)\n$(MOD_NAME)-objs := \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/rt_linux_symb.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/rt_usb_util.o\\\n\t../../os/linux/rt_linux.o\n\nifeq ($(PLATFORM),BL2348)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/vr_bdlt.o\nendif\n\nifeq ($(PLATFORM),BLUBB)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/vr_bdlt.o\nendif\n\nifeq ($(HAS_BGFP_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/br_ftph.o\nendif\nendif\n#endif // CONFIG_AP_SUPPORT //\n\n\n#ifdef CONFIG_STA_SUPPORT\nifeq ($(RT28xx_MODE), STA)\n$(MOD_NAME)-objs := \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/rt_linux_symb.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/rt_usb_util.o\\\n\t../../os/linux/rt_linux.o\nendif\n#endif // CONFIG_STA_SUPPORT //\n\n\n#ifdef CONFIG_APSTA_SUPPORT\nifeq ($(RT28xx_MODE), APSTA)\n$(MOD_NAME)-objs := \\\n\t../../common/rt_os_util.o\\\n\t../../os/linux/rt_linux_symb.o\\\n\t../../os/linux/rt_rbus_pci_util.o\\\n\t../../os/linux/rt_usb_util.o\\\n\t../../os/linux/rt_linux.o\n\nifeq ($(PLATFORM),BL2348)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/vr_bdlt.o\nendif\n\nifeq ($(PLATFORM),BLUBB)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/vr_bdlt.o\nendif\n\nifeq ($(HAS_BGFP_SUPPORT),y)\n$(MOD_NAME)-objs += \\\n\t../../os/linux/br_ftph.o\nendif\nendif\n#endif // CONFIG_APSTA_SUPPORT //\n\nclean:\n\trm -f ../../common/*.o\n\trm -f ../../common/.*.{cmd,flags,d}\n\trm -f ../../os/linux/*.{o,ko,mod.{o,c}}\n\trm -f ../../os/linux/.*.{cmd,flags,d}\n\trm -fr ../../os/linux/.tmp_versions\n\trm -f ../../os/linux/Module.symvers\n\trm -f ../../os/linux/Modules.symvers\n\trm -f ../../os/linux/Module.markers\n\trm -f ../../os/linux/modules.order\n\trm -f ../../chips/*.o\n\trm -f ../../chips/.*.{cmd,flags,d}\nifeq ($(RT28xx_MODE),AP)\n\trm -f ../../ap/*.o\n\trm -f ../../ap/.*.{cmd,flags,d}\nelse\nifeq ($(RT28xx_MODE),STA)\n\trm -f ../../sta/*.o\n\trm -f ../../sta/.*.{cmd,flags,d}\nendif\nendif\n\ninstall:\n\tinstall -d $(LINUX_SRC_MODULE)\n\tinstall -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)\n\t/sbin/depmod -a ${shell uname -r}\n\nuninstall:\n\trm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))\n\t/sbin/depmod -a ${shell uname -r}\n"
  },
  {
    "path": "src/os/linux/Makefile.ap.soc",
    "content": "EXTRA_CFLAGS = -Idrivers/net/wireless/rt2860v2/include -Idrivers/net/wireless/rt2860v2/ate/include\n\nobj-$(CONFIG_RT2860V2_AP) += rt2860v2_ap.o\n\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_md5.o\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_sha2.o\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_hmac.o\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_aes.o\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_arc4.o\nrt2860v2_ap-objs += ../rt2860v2/common/mlme.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_wep.o\nrt2860v2_ap-objs += ../rt2860v2/common/action.o\nrt2860v2_ap-objs += ../rt2860v2/common/ba_action.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_data.o\nrt2860v2_ap-objs += ../rt2860v2/common/rtmp_init.o\nrt2860v2_ap-objs += ../rt2860v2/common/rtmp_init_inf.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_tkip.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_aes.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_sync.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_sanity.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_info.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_cfg.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_wpa.o\nrt2860v2_ap-objs += ../rt2860v2/common/dfs.o\nrt2860v2_ap-objs += ../rt2860v2/common/dfs_mcu.o\nrt2860v2_ap-objs += ../rt2860v2/common/spectrum.o\nrt2860v2_ap-objs += ../rt2860v2/common/rtmp_timer.o\nrt2860v2_ap-objs += ../rt2860v2/common/rt_channel.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_profile.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_asic.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_cmd.o\nrt2860v2_ap-objs += ../rt2860v2/common/rtmp_swmcu.o\nrt2860v2_ap-objs += ../rt2860v2/common/rt_os_util.o\nrt2860v2_ap-objs += ../rt2860v2/common/eeprom.o\nrt2860v2_ap-objs += ../rt2860v2/common/ee_flash.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_mac_pci.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_data_pci.o\n\nrt2860v2_ap-objs += ../rt2860v2/chips/rtmp_chip.o\n\nrt2860v2_ap-objs += ../rt2860v2/ap/ap.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_assoc.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_auth.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_connect.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_mlme.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_sanity.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_sync.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_wpa.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_data.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_uapsd.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_autoChSel.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_qload.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_cfg.o\n\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_proc.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_linux.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_profile.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_main_dev.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/ap_ioctl.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_pci_rbus.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_drv.o\nrt2860v2_ap-objs += ../rt2860v2/os/linux/rbus_main_dev.o\nrt2860v2_ap-objs += ../rt2860v2/common/rt_ate.o\n\nifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y)\nrt2860v2_ap-objs += ../rt2860v2/common/acm_edca.o\nrt2860v2_ap-objs += ../rt2860v2/common/acm_comm.o\nrt2860v2_ap-objs += ../rt2860v2/common/acm_iocl.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_LED),y)\nrt2860v2_ap-objs += ../rt2860v2/common/rt_led.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WSC),y)\nrt2860v2_ap-objs += ../rt2860v2/common/wsc.o \nrt2860v2_ap-objs += ../rt2860v2/common/wsc_tlv.o\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_dh.o\nrt2860v2_ap-objs += ../rt2860v2/common/crypt_biginteger.o\nrt2860v2_ap-objs += ../rt2860v2/common/wsc_ufd.o\nrt2860v2_ap-objs += ../rt2860v2/common/wsc_v2.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y)\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_nintendo.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WDS),y)\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_wds.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_wds_inf.o\nrt2860v2_ap-objs += ../rt2860v2/common/client_wds.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_MBSS),y)\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss_inf.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_APCLI),y)\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli.o\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli_inf.o\nrt2860v2_ap-objs += ../rt2860v2/ap/apcli_assoc.o\nrt2860v2_ap-objs += ../rt2860v2/ap/apcli_auth.o\nrt2860v2_ap-objs += ../rt2860v2/ap/apcli_ctrl.o\nrt2860v2_ap-objs += ../rt2860v2/ap/apcli_sync.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_mat.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_iparp.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_pppoe.o\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_ipv6.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y)\nrt2860v2_ap-objs += ../rt2860v2/common/igmp_snoop.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y)\nrt2860v2_ap-objs += ../rt2860v2/common/netif_block.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_DLS),y)\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_dls.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_IDS),y)\nrt2860v2_ap-objs += ../rt2860v2/ap/ap_ids.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_MESH),y)\nrt2860v2_ap-objs += ../rt2860v2/common/mesh_bmpkt.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_ctrl.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_link_mng.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_sanity.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_tlv.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_inf.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_forwarding.o \nrt2860v2_ap-objs += ../rt2860v2/common/mesh_path_mng.o \nendif\n\nifeq ($(CONFIG_RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY),y)\nrt2860v2_ap-objs += ../rt2860v2/os/linux/ap_diversity.o\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WAPI),y)\nrt2860v2_ap-objs += ../rt2860v2/common/wapi.o\nrt2860v2_ap-objs += ../rt2860v2/common/wapi_crypt.o\nrt2860v2_ap-objs += ../rt2860v2/common/wapi_sms4.o\nendif\n\n#ifeq ($(CONFIG_RT2860V2_80211R_FT),y)\n#rt2860v2_ap-objs += ../rt2860v2/common/ft.o\n#rt2860v2_ap-objs += ../rt2860v2/common/ft_tlv.o\n#rt2860v2_ap-objs += ../rt2860v2/common/ft_ioctl.o\n#rt2860v2_ap-objs += ../rt2860v2/common/ft_rc.o\n#rt2860v2_ap-objs += ../rt2860v2/ap/ap_ftkd.o\n#endif\n\n#ifeq ($(CONFIG_RT2860V2_80211K_RR),y)\n#rt2860v2_ap-objs += ../rt2860v2/common/rrm_tlv.o\n#rt2860v2_ap-objs += ../rt2860v2/common/rrm_sanity.o\n#rt2860v2_ap-objs += ../rt2860v2/common/rrm.o\n#endif\n\nifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y)\nrt2860v2_ap-objs += ../rt2860v2/common/cmm_video.o\nendif\n\nifeq ($(CONFIG_RALINK_RT2880),y)\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt2880.o\nendif\n\nifeq ($(CONFIG_RALINK_RT3052),y)\nrt2860v2_ap-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt305x.o\nendif\n\nifeq ($(CONFIG_RALINK_RT3352),y)\nrt2860v2_ap-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt305x.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt3352.o\nendif\n\nifeq ($(CONFIG_RT3x52),y)\nrt2860v2_ap-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt305x.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt3352.o\nendif\n\nifeq ($(CONFIG_RALINK_RT5350),y)\nrt2860v2_ap-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt305x.o\nrt2860v2_ap-objs +=  ../rt2860v2/chips/rt5350.o\nendif\n\nifeq ($(CONFIG_RALINK_RT3883),y)\nrt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o\nrt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o\nifeq ($(CONFIG_RT2860V2_AP_TXBF),y)\nrt2860v2_ap-objs +=  ../rt2860v2/common/cmm_txbf.o\nrt2860v2_ap-objs +=  ../rt2860v2/common/cmm_txbf_cal.o\nendif\nendif\n\n###################\n#  CFLAGS\n##################\nEXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT  -DLINUX \\\n               -Wall -Wstrict-prototypes -Wno-trigraphs\n\nEXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DAP_SCAN_SUPPORT -DUAPSD_AP_SUPPORT -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI\nEXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DRELASE_EXCLUDE -DIAPP_SUPPORT -DDOT1X_SUPPORT\nEXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW -DNEW_TXCONT -DNEW_TXCARRSUPP\nEXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE\n\n#provide busy time statistics for every TBTT */\n#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS \n\n# provide busy time alarm mechanism \n# use the function to avoid to locate in some noise environments \n#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM\n\nifeq ($(CONFIG_RALINK_RT2880),y)\nEXTRA_CFLAGS += -DRT2880\nendif\n\nifeq ($(CONFIG_RALINK_RT3052),y)\nifeq ($(CONFIG_RALINK_RT3350),y)\nEXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT\nelse\nEXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT\nendif\nendif\n\nifeq ($(CONFIG_RALINK_RT3352),y)\nEXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nendif\n\nifeq ($(CONFIG_RT3x52),y)\nEXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nendif\n\nifeq ($(CONFIG_RALINK_RT5350),y)\nEXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nendif\n\nifeq ($(CONFIG_RALINK_RT3883),y)\nEXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nifeq ($(CONFIG_RT2860V2_AP_TXBF),y)\nEXTRA_CFLAGS += -DTXBF_SUPPORT\nendif\nEXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_DLS),y)\nEXTRA_CFLAGS += -DQOS_DLS_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_IDS),y)\nEXTRA_CFLAGS += -DIDS_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_DFS),y)\nEXTRA_CFLAGS += -DDFS_SUPPORT\nEXTRA_CFLAGS += -DNEW_DFS\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_CARRIER),y)\nEXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT\nifeq ($(CONFIG_RALINK_RT3052),y)\nEXTRA_CFLAGS += -DTONE_RADAR_DETECT_SUPPORT\nendif\nendif\n\nifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y)\nEXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE\nendif\n\nifeq ($(CONFIG_RT2860V2_80211N_DRAFT3),y)\nEXTRA_CFLAGS += -DDOT11N_DRAFT3\nendif\n\nifeq ($(CONFIG_SINGLE_SKU),y)\nEXTRA_CFLAGS += -DSINGLE_SKU\nendif\n\nifeq ($(CONFIG_RT2860V2_SNMP),y)\nEXTRA_CFLAGS += -DSNMP_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y)\nEXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y)\nEXTRA_CFLAGS += -DWMM_ACM_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_LED),y)\nEXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT\nifeq ($(CONFIG_RT2860V2_AP_WSC),y)\nEXTRA_CFLAGS += -DWSC_LED_SUPPORT\nendif\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y)\nEXTRA_CFLAGS += -DNINTENDO_AP\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WSC),y)\nEXTRA_CFLAGS += -DWSC_AP_SUPPORT -DWSC_V2_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_LLTD),y)\nEXTRA_CFLAGS += -DLLTD_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WDS),y)\nEXTRA_CFLAGS += -DWDS_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_MBSS),y)\nEXTRA_CFLAGS += -DMBSS_SUPPORT\nendif\n\nifeq ($(CONFIG_NEW_MBSSID_MODE),y)\nEXTRA_CFLAGS += -DNEW_MBSSID_MODE\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_APCLI),y)\nEXTRA_CFLAGS += -DAPCLI_SUPPORT\nEXTRA_CFLAGS += -DMAT_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y)\nEXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y)\nEXTRA_CFLAGS += -DBLOCK_NET_IF\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_MESH),y)\nEXTRA_CFLAGS   += -DMESH_SUPPORT -DINTEL_CMPC\nendif\n\nifeq ($(CONFIG_RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY),y)\nEXTRA_CFLAGS   += -DRT3XXX_ANTENNA_DIVERSITY_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y)\nEXTRA_CFLAGS   += -DHW_ANTENNA_DIVERSITY_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_WAPI),y)\nEXTRA_CFLAGS   += -DWAPI_SUPPORT\nifeq ($(CONFIG_RALINK_RT3052),y)\nEXTRA_CFLAGS += -DSOFT_ENCRYPT\nendif\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_COC),y)\nEXTRA_CFLAGS   += -DCOC_SUPPORT -DGREENAP_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y)\nEXTRA_CFLAGS   += -DEXT_BUILD_CHANNEL_LIST\nendif\n\nifeq ($(CONFIG_KTHREAD),y)\nEXTRA_CFLAGS   += -DKTHREAD_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_MEMORY_OPTIMIZATION),y)\nEXTRA_CFLAGS   += -DMEMORY_OPTIMIZATION\nelse\nEXTRA_CFLAGS   += -DDBG\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y)\nEXTRA_CFLAGS   += -DVIDEO_TURBINE_SUPPORT\nendif\n\nifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y)\nEXTRA_CFLAGS   += -DWORKQUEUE_BH\nendif\n\nifeq ($(CONFIG_RT2860V2_AP_RTMP_INTERNAL_TX_ALC),y)\nEXTRA_CFLAGS   += -DRTMP_INTERNAL_TX_ALC\nendif\n\n#ifeq ($(CONFIG_RT2860V2_AP_INTELLIGENT_RATE_ADAPTION),y)\n#EXTRA_CFLAGS   += -DNEW_RATE_ADAPT_SUPPORT\n#endif\n"
  },
  {
    "path": "src/os/linux/Makefile.ap.usb",
    "content": "# In-Tree Makefile for USB combo\nEXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/MODULE/include\nEXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/UTIL/include\nEXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/NETIF/include\nEXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/MODULE/ate/include\n\n# UTIL module\nobj-$(CONFIG_RTUSB_AP) += RT5572_ap_util.o\nRT5572_ap_util-y += UTIL/common/rt_os_util.o\nRT5572_ap_util-y += UTIL/os/linux/rt_linux_symb.o\nRT5572_ap_util-y += UTIL/os/linux/rt_rbus_pci_util.o\nRT5572_ap_util-y += UTIL/os/linux/rt_usb_util.o\nRT5572_ap_util-y += UTIL/os/linux/rt_linux.o\n\n# MODULE module\nobj-$(CONFIG_RTUSB_AP) += RT5572_ap.o\nRT5572_ap-y += MODULE/common/crypt_md5.o\nRT5572_ap-y += MODULE/common/crypt_sha2.o\nRT5572_ap-y += MODULE/common/crypt_hmac.o\nRT5572_ap-y += MODULE/common/crypt_aes.o\nRT5572_ap-y += MODULE/common/crypt_arc4.o\nRT5572_ap-y += MODULE/common/mlme.o\nRT5572_ap-y += MODULE/common/cmm_wep.o\nRT5572_ap-y += MODULE/common/action.o\nRT5572_ap-y += MODULE/common/cmm_data.o\nRT5572_ap-y += MODULE/common/rtmp_init.o\nRT5572_ap-y += MODULE/common/rtmp_init_inf.o\nRT5572_ap-y += MODULE/common/cmm_tkip.o\nRT5572_ap-y += MODULE/common/cmm_aes.o\nRT5572_ap-y += MODULE/common/cmm_sync.o\nRT5572_ap-y += MODULE/common/eeprom.o\nRT5572_ap-y += MODULE/common/cmm_sanity.o\nRT5572_ap-y += MODULE/common/cmm_info.o\nRT5572_ap-y += MODULE/common/cmm_cfg.o\nRT5572_ap-y += MODULE/common/cmm_wpa.o\nRT5572_ap-y += MODULE/common/cmm_radar.o\nRT5572_ap-y += MODULE/common/spectrum.o\nRT5572_ap-y += MODULE/common/rtmp_timer.o\nRT5572_ap-y += MODULE/common/rt_channel.o\nRT5572_ap-y += MODULE/common/cmm_profile.o\nRT5572_ap-y += MODULE/common/cmm_asic.o\nRT5572_ap-y += MODULE/common/cmm_cmd.o\nRT5572_ap-y += MODULE/rate_ctrl/ra_ctrl.o\nRT5572_ap-y += MODULE/rate_ctrl/alg_legacy.o\nRT5572_ap-y += MODULE/rate_ctrl/alg_ags.o\nRT5572_ap-y += MODULE/os/linux/rt_profile.o\nRT5572_ap-y += MODULE/chips/rtmp_chip.o\nRT5572_ap-y += MODULE/ap/ap.o\nRT5572_ap-y += MODULE/ap/ap_assoc.o\nRT5572_ap-y += MODULE/ap/ap_auth.o\nRT5572_ap-y += MODULE/ap/ap_connect.o\nRT5572_ap-y += MODULE/ap/ap_mlme.o\nRT5572_ap-y += MODULE/ap/ap_sanity.o\nRT5572_ap-y += MODULE/ap/ap_sync.o\nRT5572_ap-y += MODULE/ap/ap_wpa.o\nRT5572_ap-y += MODULE/ap/ap_data.o\nRT5572_ap-y += MODULE/common/uapsd.o\nRT5572_ap-y += MODULE/ap/ap_autoChSel.o\nRT5572_ap-y += MODULE/ap/ap_qload.o\nRT5572_ap-y += MODULE/ap/ap_cfg.o\nRT5572_ap-y += MODULE/common/ba_action.o\nRT5572_ap-y += MODULE/common/cmm_mac_usb.o\nRT5572_ap-y += MODULE/common/rtusb_io.o\nRT5572_ap-y += MODULE/common/rtusb_data.o\nRT5572_ap-y += MODULE/common/cmm_data_usb.o\nRT5572_ap-y += MODULE/common/rtmp_mcu.o\nRT5572_ap-y += MODULE/common/rtusb_bulk.o\nRT5572_ap-y += MODULE/os/linux/rt_usb.o\nRT5572_ap-y += MODULE/common/ee_prom.o\nRT5572_ap-y += MODULE/common/cmm_dfs.o\nRT5572_ap-y += MODULE/common/cmm_cs.o\nRT5572_ap-y += MODULE/common/ee_prom.o\nRT5572_ap-y += MODULE/common/ee_efuse.o\nRT5572_ap-y += MODULE/common/rt_rf.o\nRT5572_ap-y += MODULE/os/linux/rt_symb.o\nRT5572_ap-y += MODULE/common/rt_led.o\n\n# NET module\nobj-$(CONFIG_RTUSB_AP) += RT5572_ap_net.o\nRT5572_ap_net-y += NETIF/common/rtusb_dev_id.o\nRT5572_ap_net-y += NETIF/os/linux/ap_ioctl.o\nRT5572_ap_net-y += NETIF/os/linux/rt_main_dev.o\nRT5572_ap_net-y += NETIF/os/linux/usb_main_dev.o\n\n# By feature\nifeq ($(CONFIG_RTUSB_AP_WSC),y)\nRT5572_ap-y += MODULE/common/wsc.o \nRT5572_ap-y += MODULE/common/wsc_tlv.o\nRT5572_ap-y += MODULE/common/wsc_ufd.o\nRT5572_ap-y += MODULE/common/crypt_biginteger.o\nRT5572_ap-y += MODULE/common/crypt_dh.o\nRT5572_ap-y += MODULE/common/wsc_v2.o \nendif\n\nifeq ($(CONFIG_RTUSB_WDS),y)\nRT5572_ap-y += MODULE/ap/ap_wds.o\nRT5572_ap-y += MODULE/common/client_wds.o\nRT5572_ap_net-y += NETIF/ap/ap_wds_inf.o\nendif\n\nifeq ($(CONFIG_RTUSB_AP_MBSS),y)\nRT5572_ap-y += MODULE/ap/ap_mbss.o\nRT5572_ap_net-y += NETIF/ap/ap_mbss_inf.o\nendif\n\nifeq ($(CONFIG_RTUSB_APCLI),y)\nRT5572_ap-y += MODULE/ap/ap_apcli.o\nRT5572_ap-y += MODULE/ap/apcli_ctrl.o\nRT5572_ap-y += MODULE/ap/apcli_sync.o\nRT5572_ap-y += MODULE/ap/apcli_auth.o\nRT5572_ap-y += MODULE/ap/apcli_assoc.o\nRT5572_ap-y += MODULE/common/cmm_mat.o\nRT5572_ap-y += MODULE/common/cmm_mat_iparp.o\nRT5572_ap-y += MODULE/common/cmm_mat_pppoe.o\nRT5572_ap-y += MODULE/common/cmm_mat_ipv6.o\nRT5572_ap_net-y += NETIF/ap/ap_apcli_inf.o\nendif\n\nifeq ($(CONFIG_RTUSB_DFS),y)\nRT5572_ap-y += MODULE/common/cmm_dfs.o\nendif\n\nifeq ($(CONFIG_RTUSB_CS),y)\nRT5572_ap-y += MODULE/common/cmm_cs.o\nendif\n\nifeq ($(CONFIG_RTUSB_IGMP_SNOOP),y)\nRT5572_ap-y += MODULE/common/igmp_snoop.o\nendif\n\nifeq ($(CONFIG_RTUSB_NETIF_BLOCK),y)\nRT5572_ap-y += MODULE/common/netif_block.o\nendif\n\nifeq ($(CONFIG_RTUSB_DLS),y)\nRT5572_ap-y += MODULE/ap/ap_dls.o\nendif\n\nifeq ($(CONFIG_RTUSB_IDS),y)\nRT5572_ap-y += MODULE/ap/ap_ids.o\nendif\n\nifeq ($(CONFIG_RTUSB_AP_FLASH_SUPPORT),y)\nRT5572_ap-y += MODULE/common/ee_flash.o\nendif\n\n# WAPI\nifeq ($(CONFIG_RTUSB_AP_WAPI),y)\nRT5572_ap-y += MODULE/common/wapi.o\nRT5572_ap-y += MODULE/common/wapi_sms4.o\nRT5572_ap-y += MODULE/common/wapi_crypt.o\nendif\n\n# Chip related\nifeq ($(CONFIG_RT2870_AP),y)\nRT5572_ap-y += MODULE/chips/rt28xx.o\nendif\n\nifeq ($(CONFIG_RT3572_AP),y)\nRT5572_ap-y += MODULE/chips/rt28xx.o\nRT5572_ap-y += MODULE/chips/rt30xx.o\nRT5572_ap-y += MODULE/chips/rt35xx.o\nendif\n\nifeq ($(CONFIG_RT3573_AP),y)\nRT5572_ap-y += MODULE/chips/rt28xx.o\nRT5572_ap-y += MODULE/chips/rt30xx.o\nRT5572_ap-y += MODULE/chips/rt35xx.o\nRT5572_ap-y += MODULE/chips/rt3593.o\nendif\n\nifeq ($(CONFIG_RT5572_AP),y)\nRT5572_ap-y += MODULE/chips/rt30xx.o\nRT5572_ap-y += MODULE/chips/rt5592.o\nendif\n\n# ATE\nifeq ($(CONFIG_RTUSB_AP_ATE),y)\nRT5572_ap-y += MODULE/ate/common/rt_ate.o\nRT5572_ap-y += MODULE/ate/common/ate_usb.o\nendif\n\nifeq ($(CONFIG_RT2870_AP_ATE),y)\nRT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o\nendif\n\nifeq ($(CONFIG_RT3572_AP_ATE),y)\nRT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o\nRT5572_ap-y += MODULE/ate/chips/rt35xx_ate.o\nendif\n\nifeq ($(CONFIG_RT5572_AP_ATE),y)\nRT5572_ap-y += MODULE/ate/chips/rt5592_ate.o\nendif\n\n# QA tool\nifeq ($(CONFIG_RTUSB_AP_QA),y)\nRT5572_ap-y += MODULE/ate/common/rt_qa.o\nendif\n###################\n#  CFLAGS\n###################\nEXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX\\\n\t\t-Wall -Wstrict-prototypes -Wno-trigraphs\nEXTRA_CFLAGS += -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT\nEXTRA_CFLAGS += -DCONFIG_AP_SUPPORT  -DUAPSD_SUPPORT -DIAPP_SUPPORT -DDBG\\\n\t\t-DDOT1X_SUPPORT -DAP_SCAN_SUPPORT\nEXTRA_CFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT\nEXTRA_CFLAGS += -DSTATS_COUNT_SUPPORT -DDOT11_N_SUPPORT -DRTDEV_SUPPORT\n\n\nifeq ($(CONFIG_RTUSB_AP),m)\nEXTRA_CFLAGS += -DOS_ABL_SUPPORT \nEXTRA_CFLAGS += -DOS_ABL_FUNC_SUPPORT\nEXTRA_CFLAGS += -DOS_ABL_OS_PCI_SUPPORT\nEXTRA_CFLAGS += -DOS_ABL_OS_USB_SUPPORT\nEXTRA_CFLAGS += -DOS_ABL_OS_AP_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_AP_WSC),y)\nEXTRA_CFLAGS += -DWSC_AP_SUPPORT -DWSC_INCLUDED -DWSC_V2_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_WDS),y)\nEXTRA_CFLAGS += -DWDS_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_MBSS),y)\nEXTRA_CFLAGS += -DMBSS_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_APCLI),y)\nEXTRA_CFLAGS += -DAPCLI_SUPPORT\nEXTRA_CFLAGS += -DMAT_SUPPORT\nEXTRA_CFLAGS += -DAP_SCAN_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_AP_DLS),y)\nEXTRA_CFLAGS += -DQOS_DLS_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_IDS),y)\nEXTRA_CFLAGS += -DIDS_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_AP_FLASH_SUPPORT), y)\nEXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_AP_80211N_DRAFT3),y)\nEXTRA_CFLAGS += -DDOT11N_DRAFT3\nendif\n\nifeq ($(CONFIG_RTUSB_LLTD),y)\nEXTRA_CFLAGS += -DLLTD_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_IGMP_SNOOP),y)\nEXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT\nendif\n\nifeq ($(CONFIG_RTUSB_NETIF_BLOCK),y)\nEXTRA_CFLAGS += -DBLOCK_NET_IF\nendif\n\n# Chip related\nifeq ($(CONFIG_RT2870_AP), y)\nEXTRA_CFLAGS += -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT\n\nifeq ($(CONFIG_RTUSB_DFS), y)\nEXTRA_CFLAGS += -DDFS_SOFTWARE_SUPPORT\nendif\n\nendif\n\nifeq ($(CONFIG_RT3572_AP), y)\nEXTRA_CFLAGS += -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT\n\nifeq ($(CONFIG_RTUSB_DFS), y)\nEXTRA_CFLAGS += -DDFS_DEBUG\nendif\n\nifeq ($(CONFIG_RTUSB_CS_SUPPORT), y)\nEXTRA_CFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT\nendif\n\nendif\n\nifeq ($(CONFIG_RT3573_AP), y)\nEXTRA_CFLAGS += -DRT30xx -DRT35xx -DRT3593 -DRT3573 -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT -DVCORECAL_SUPPORT \nendif\n\nifeq ($(CONFIG_RT5572_AP), y)\nEXTRA_CFLAGS += -DRT30xx -DRT5572 -DRT5592 -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT -DRTMP_TEMPERATURE_COMPENSATION\n\nifeq ($(CONFIG_RTUSB_DFS), y)\nEXTRA_CFLAGS += -DDFS_SOFTWARE_SUPPORT -DDFS_HARDWARE_SUPPORT -DDFS_DEBUG\nendif\n\nifeq ($(CONFIG_RTUSB_CS_SUPPORT), y)\nEXTRA_CFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT\nendif\n\nendif\n\n# ATE\nifeq ($(CONFIG_RTUSB_AP_ATE), y)\nEXTRA_CFLAGS += -DRALINK_ATE -DCONFIG_RT2880_ATE_CMD_NEW\nendif\n\n# QA\nifeq ($(CONFIG_RTUSB_AP_QA), y)\nEXTRA_CFLAGS += -DRALINK_QA\nendif\n\n# WAPI\nifeq ($(CONFIG_RTUSB_AP_WAPI), y)\nEXTRA_CFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB\nendif\n\n# NEW MBSS\nifeq ($(CONFIG_RTUSB_AP_NEW_MBSS_MODE), y)\nEXTRA_CFLAGS += -DNEW_MBSSID_MODE\nendif\n\nclean:\n\t@rm -f common/*.o\n\t@rm -f ap/*.o\n\t@rm -f sta/*.o\n\t@rm -f os/linux/*.o\n\t@rm -f chips/*.o\n\t@rm -f `find ./ -name *.o.cmd`\n\t@rm -f *.ko\n\t@rm -f *.o\n"
  },
  {
    "path": "src/os/linux/Makefile.libautoprovision.6",
    "content": "include $(RT28xx_DIR)/os/linux/config.mk\n\n#ifdef CONFIG_AP_SUPPORT\n\nifeq ($(HAS_SAMSUNG_EASY_CONFIG_SUPPORT),y)\nlib-y := ../../common/auto_provision.o\nendif\n\n#endif // CONFIG_AP_SUPPORT //\n"
  },
  {
    "path": "src/os/linux/Makefile.libwapi.4",
    "content": "#\n# Release file for AP Mode\n#\ninclude $(RT28xx_DIR)/os/linux/config.mk\n\nMOD_NAME = wapi_module\n\nOBJ := $(MOD_NAME).o\n\nWAPI_M_OBJ := \\\n\t$(RT28xx_DIR)/common/wapi_sms4.o\\\n\t$(RT28xx_DIR)/common/wapi_crypt.o\n\nPHONY := all\n\t\t\t\t\nall:$(OBJ)\t\t\t\t\n\t\t\t\t\n$(MOD_NAME).o: $(WAPI_M_OBJ)\n\t$(LD) -r $^ -o $@\n\n# Declare the contents of the .PHONY variable as phony.  We keep that\n# information in a variable so we can use it in if_changed and friends.\n.PHONY: $(PHONY)"
  },
  {
    "path": "src/os/linux/Makefile.libwapi.6",
    "content": "#\n# Release file for AP Mode\n#\ninclude $(RT28xx_DIR)/os/linux/config.mk\n\nobj-m := wapi_module.o\n\nwapi_module-objs := \\\n\t../../common/wapi_sms4.o\\\n\t../../common/wapi_crypt.o\n\t\t\t\t"
  },
  {
    "path": "src/os/linux/Makefile.sta.soc",
    "content": "EXTRA_CFLAGS = -Idrivers/net/wireless/rt2860v2/include -Idrivers/net/wireless/rt2860v2/ate/include\n\nobj-$(CONFIG_RT2860V2_STA) += rt2860v2_sta.o\n\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_md5.o\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_sha2.o\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_hmac.o\nrt2860v2_sta-objs += ../rt2860v2/common/mlme.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_wep.o\nrt2860v2_sta-objs += ../rt2860v2/common/action.o\nrt2860v2_sta-objs += ../rt2860v2/common/ba_action.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_data.o\nrt2860v2_sta-objs += ../rt2860v2/common/rtmp_init.o\nrt2860v2_sta-objs += ../rt2860v2/common/rtmp_init_inf.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_tkip.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_aes.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_sync.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_sanity.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_info.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_wpa.o\nrt2860v2_sta-objs += ../rt2860v2/common/dfs.o\n#rt2860v2_sta-objs += ../rt2860v2/common/dfs_mcu.o\nrt2860v2_sta-objs += ../rt2860v2/common/spectrum.o\nrt2860v2_sta-objs += ../rt2860v2/common/rt_os_util.o\n\nrt2860v2_sta-objs += ../rt2860v2/common/rtmp_timer.o\nrt2860v2_sta-objs += ../rt2860v2/common/rt_channel.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_profile.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_asic.o\nrt2860v2_sta-objs += ../rt2860v2/common/rtmp_swmcu.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_cfg.o\nrt2860v2_sta-objs += ../rt2860v2/common/eeprom.o\nrt2860v2_sta-objs += ../rt2860v2/common/ee_flash.o\n#rt2860v2_sta-objs += ../rt2860v2/common/rtmp_mcu.o\n\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_mac_pci.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_data_pci.o\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_aes.o\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_arc4.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_cmd.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_wpa_adhoc.o\n\nrt2860v2_sta-objs += ../rt2860v2/sta/assoc.o\nrt2860v2_sta-objs += ../rt2860v2/sta/auth.o\nrt2860v2_sta-objs += ../rt2860v2/sta/auth_rsp.o\nrt2860v2_sta-objs += ../rt2860v2/sta/sync.o\nrt2860v2_sta-objs += ../rt2860v2/sta/sanity.o\nrt2860v2_sta-objs += ../rt2860v2/sta/rtmp_data.o\nrt2860v2_sta-objs += ../rt2860v2/sta/connect.o\nrt2860v2_sta-objs += ../rt2860v2/sta/wpa.o\nrt2860v2_sta-objs += ../rt2860v2/sta/sta_cfg.o\n\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rt_proc.o\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rt_linux.o\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rt_profile.o\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rt_main_dev.o\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/sta_ioctl.o\nrt2860v2_sta-objs += ../rt2860v2/common/rt_ate.o\nrt2860v2_sta-objs += ../rt2860v2/chips/rtmp_chip.o\n\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rbus_main_dev.o\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rt_pci_rbus.o\nrt2860v2_sta-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o\nrt2860v2_sta-objs +=  ../rt2860v2/os/linux/rt_rbus_pci_drv.o\n\nifeq ($(CONFIG_RALINK_RT2880),y)\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt2880.o\nendif\n\nifeq ($(CONFIG_RALINK_RT3052),y)\nrt2860v2_sta-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt305x.o\nendif\n\nifeq ($(CONFIG_RALINK_RT3352),y)\nrt2860v2_sta-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt305x.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt3352.o\nendif\n\nifeq ($(CONFIG_RT3x52),y)\nrt2860v2_sta-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt305x.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt3352.o\nendif\n\nifeq ($(CONFIG_RALINK_RT5350),y)\nrt2860v2_sta-objs +=  ../rt2860v2/common/rt_rf.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt305x.o\nrt2860v2_sta-objs +=  ../rt2860v2/chips/rt5350.o\nendif\n\nifeq ($(CONFIG_RALINK_RT3883),y)\nrt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o\nrt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o\nifeq ($(CONFIG_RT2860V2_STA_TXBF),y)\nrt2860v2_ap-objs +=  ../rt2860v2/common/cmm_txbf.o\nrt2860v2_ap-objs +=  ../rt2860v2/common/cmm_txbf_cal.o\nendif\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_LED),y)\nrt2860v2_sta-objs += ../rt2860v2/common/rt_led.o\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_WMM_ACM),y)\nrt2860v2_sta-objs += ../rt2860v2/common/acm_edca.o\nrt2860v2_sta-objs += ../rt2860v2/common/acm_comm.o\nrt2860v2_sta-objs += ../rt2860v2/common/acm_iocl.o\nendif\n\n#ifeq ($(CONFIG_RT2860V2_STA_WAPI),y)\n#rt2860v2_sta-objs += wapi.obj\n#rt2860v2_sta-objs += wapi_sms4.obj\n#rt2860v2_sta-objs += wapi_crypt.obj\n#endif\n\n#ifeq ($(CONFIG_RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY),y)\n#rt2860v2_sta-objs += ../rt2860v2/os/linux/ap_diversity.o\n#endif\n\nifeq ($(CONFIG_RT2860V2_STA_MESH),y)\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_bmpkt.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_ctrl.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_link_mng.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_sanity.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_tlv.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_inf.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_forwarding.o\nrt2860v2_sta-objs += ../rt2860v2/common/mesh_path_mng.o\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_DLS),y)\nrt2860v2_sta-objs += ../rt2860v2/sta/dls.o\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_WSC),y)\nrt2860v2_sta-objs += ../rt2860v2/common/wsc.o\nrt2860v2_sta-objs += ../rt2860v2/common/wsc_tlv.o\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_biginteger.o\nrt2860v2_sta-objs += ../rt2860v2/common/crypt_dh.o\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_ETH_CONVERT),y)\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_mat.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_iparp.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_pppoe.o\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_ipv6.o\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_VIDEO_TURBINE),y)\nrt2860v2_sta-objs += ../rt2860v2/common/cmm_video.o\nendif\n\n###################\n#  CFLAGS\n##################\nEXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT  -DLINUX \\\n\t       -Wall -Wstrict-prototypes -Wno-trigraphs \n\nEXTRA_CFLAGS += -DCONFIG_STA_SUPPORT -DDBG -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI\nEXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DRELASE_EXCLUDE\nEXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DNEW_TXCONT -DNEW_TXCARRSUPP -DCONFIG_RT2880_ATE_CMD_NEW\n\nifeq ($(CONFIG_RALINK_RT2880),y)\nEXTRA_CFLAGS += -DRT2880\nendif\n\nifeq ($(CONFIG_RALINK_RT3052),y)\nifeq ($(CONFIG_RALINK_RT3350),y)\nEXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT\nelse\nEXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT\nendif\nendif\n\nifeq ($(CONFIG_RALINK_RT3352),y)\nEXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nendif\n\nifeq ($(CONFIG_RT3x52),y)\nEXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nendif\n\nifeq ($(CONFIG_RALINK_RT5350),y)\nEXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT\nendif\n\nifeq ($(CONFIG_RALINK_RT3883),y)\nEXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT\nifeq ($(CONFIG_RT2860V2_AP_TXBF),y)\nEXTRA_CFLAGS += -DTXBF_SUPPORT\nendif\nEXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_WPA_SUPPLICANT),y)\nEXTRA_CFLAGS += -DWPA_SUPPLICANT_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_WMM_ACM),y)\nEXTRA_CFLAGS += -DWMM_ACM_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_LED),y)\nEXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT\nifeq ($(CONFIG_RT2860V2_STA_WSC),y)\nEXTRA_CFLAGS += -DWSC_LED_SUPPORT\nendif\nendif\n\nifeq ($(CONFIG_RT2860V2_SNMP),y)\nEXTRA_CFLAGS += -DSNMP_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_CARRIER),y)\nEXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y)\nEXTRA_CFLAGS   += -DEXT_BUILD_CHANNEL_LIST\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_IDS),y)\nEXTRA_CFLAGS += -DIDS_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_DLS),y)\nEXTRA_CFLAGS += -DQOS_DLS_SUPPORT\nendif\n\n#ifeq ($(CONFIG_RT2860V2_STA_WAPI),y)\n#EXTRA_CFLAGS += -DWAPI_SUPPORT\n#ifeq ($(CONFIG_RALINK_RT3052),y)\n#EXTRA_CFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT\n#endif\n#endif\n\nifeq ($(CONFIG_RT2860V2_STA_MESH),y)\nEXTRA_CFLAGS   += -DMESH_SUPPORT -DINTEL_CMPC\nendif\n\nifeq ($(CONFIG_RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY),y)\nEXTRA_CFLAGS   += -DRT3XXX_ANTENNA_DIVERSITY_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_HW_STA_ANTENNA_DIVERSITY),y)\nEXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_WSC),y)\nEXTRA_CFLAGS += -DWSC_STA_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_ETH_CONVERT),y)\nEXTRA_CFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_VIDEO_TURBINE),y)\nEXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT\nendif\n\nifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y)\nEXTRA_CFLAGS   += -DWORKQUEUE_BH\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_RTMP_INTERNAL_TX_ALC),y)\nEXTRA_CFLAGS   += -DRTMP_INTERNAL_TX_ALC\nendif\n\nifeq ($(CONFIG_RT2860V2_STA_80211N_DRAFT3),y)\nEXTRA_CFLAGS += -DDOT11N_DRAFT3\nendif\n\n"
  },
  {
    "path": "src/os/linux/ap_ioctl.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\tap_ioctl.c\n\n    Abstract:\n    IOCTL related subroutines\n\n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n*/\n#define RTMP_MODULE_OS\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n#include <linux/wireless.h>\n\nstruct iw_priv_args ap_privtab[] = {\n{ RTPRIV_IOCTL_SET, \n/* 1024 --> 1024 + 512 */\n/* larger size specific to allow 64 ACL MAC addresses to be set up all at once. */\n  IW_PRIV_TYPE_CHAR | 1536, 0,\n  \"set\"},  \n{ RTPRIV_IOCTL_SHOW,\n  IW_PRIV_TYPE_CHAR | 1024, 0,\n  \"show\"},\n{ RTPRIV_IOCTL_GSITESURVEY,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,\n  \"get_site_survey\"}, \n#ifdef INF_AR9\n  { RTPRIV_IOCTL_GET_AR9_SHOW,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,\n  \"ar9_show\"}, \n#endif\n  { RTPRIV_IOCTL_SET_WSCOOB,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,\n  \"set_wsc_oob\"}, \n{ RTPRIV_IOCTL_GET_MAC_TABLE,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,\n  \"get_mac_table\"}, \n{ RTPRIV_IOCTL_E2P,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"e2p\"},\n#ifdef DBG\n{ RTPRIV_IOCTL_BBP,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"bbp\"},\n{ RTPRIV_IOCTL_MAC,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"mac\"},\n{ RTPRIV_IOCTL_RF,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"rf\"},\n#endif /* DBG */\n\n#ifdef WSC_AP_SUPPORT\n{ RTPRIV_IOCTL_WSC_PROFILE,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,\n  \"get_wsc_profile\"},\n#endif /* WSC_AP_SUPPORT */\n{ RTPRIV_IOCTL_QUERY_BATABLE,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,\n  \"get_ba_table\"},\n{ RTPRIV_IOCTL_STATISTICS,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"stat\"}\n};\n\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\nconst struct iw_handler_def rt28xx_ap_iw_handler_def =\n{\n#define\tN(a)\t(sizeof (a) / sizeof (a[0]))\n\t.private_args\t= (struct iw_priv_args *) ap_privtab,\n\t.num_private_args\t= N(ap_privtab),\n#if IW_HANDLER_VERSION >= 7\n\t.get_wireless_stats = rt28xx_get_wireless_stats,\n#endif \n};\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\nINT rt28xx_ap_ioctl(\n\tIN\tstruct net_device\t*net_dev, \n\tIN\tOUT\tstruct ifreq\t*rq, \n\tIN\tINT\t\t\t\t\tcmd)\n{\n\tVOID\t\t\t*pAd = NULL;\n    struct iwreq\t*wrqin = (struct iwreq *) rq;\n\tRTMP_IOCTL_INPUT_STRUCT rt_wrq, *wrq = &rt_wrq;\n    INT\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n    USHORT\t\t\tsubcmd; /*, index; */\n/*\tPOS_COOKIE\t\tpObj; */\n\tINT\t\t\tapidx=0;\n\tUINT32\t\torg_len;\n\tRT_CMD_AP_IOCTL_CONFIG IoctlConfig, *pIoctlConfig = &IoctlConfig;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n/*\tpObj = (POS_COOKIE) pAd->OS_Cookie; */\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\twrq->u.data.pointer = wrqin->u.data.pointer;\n\twrq->u.data.length = wrqin->u.data.length;\n\torg_len = wrq->u.data.length;\n\n\tpIoctlConfig->Status = 0;\n\tpIoctlConfig->net_dev = net_dev;\n\tpIoctlConfig->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);\n\tpIoctlConfig->pCmdData = wrqin->u.data.pointer;\n\tpIoctlConfig->CmdId_RTPRIV_IOCTL_SET = RTPRIV_IOCTL_SET;\n\tpIoctlConfig->name = net_dev->name;\n\tpIoctlConfig->apidx = 0;\n\n\tif ((cmd != SIOCGIWPRIV) &&\n\t\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_PREPARE, 0,\n\t\t\t\t\t\t\tpIoctlConfig, 0) != NDIS_STATUS_SUCCESS)\n\t{\n\t\t/* prepare error */\n\t\tStatus = pIoctlConfig->Status;\n\t\tgoto LabelExit;\n\t}\n\n\tapidx = pIoctlConfig->apidx;\n\t\n    /*+ patch for SnapGear Request even the interface is down */\n    if(cmd== SIOCGIWNAME){\n\t    DBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCGIWNAME\\n\"));\n\n\tRTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SIOCGIWNAME, 0, wrqin->u.name, 0);\n\n\t    return Status;\n    }/*- patch for SnapGear */\n\n\n\tswitch(cmd)\n\t{\n\t\tcase RTPRIV_IOCTL_ATE:\n\t\t\t{\n\t\t\t\tRTMP_COM_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_ATE, 0, wrqin->ifr_name, 0);\n\t\t\t}\n\t\t\tbreak;\n\n        case SIOCGIFHWADDR:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTLIOCTLIOCTL::SIOCGIFHWADDR\\n\"));\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR, 0, NULL, 0);\n/*            if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd)) */\n/*    \t\t\tstrcpy((PSTRING) wrq->u.name, (PSTRING) pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid); */\n\t\t\tbreak;\n\t\tcase SIOCSIWESSID:  /*Set ESSID */\n\t\t\tbreak;\n\t\tcase SIOCGIWESSID:  /*Get ESSID */\n\t\t\t{\n\t\t\t\tRT_CMD_AP_IOCTL_SSID IoctlSSID, *pIoctlSSID = &IoctlSSID;\n\t\t\t\tstruct iw_point *erq = &wrqin->u.essid;\n\t\t\t\tPCHAR pSsidStr = NULL;\n\n\t\t\t\terq->flags=1;\n              /*erq->length = pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; */\n\n\t\t\t\tpIoctlSSID->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);\n\t\t\t\tpIoctlSSID->apidx = apidx;\n\t\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID, 0, pIoctlSSID, 0);\n\n\t\t\t\tpSsidStr = (PCHAR)pIoctlSSID->pSsidStr;\n\t\t\t\terq->length = pIoctlSSID->length;\n\n\n\t\t\t\tif((erq->pointer) && (pSsidStr != NULL))\n\t\t\t\t{\n\t\t\t\t\t/*if(copy_to_user(erq->pointer, pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, erq->length)) */\n\t\t\t\t\tif(copy_to_user(erq->pointer, pSsidStr, erq->length))\n\t\t\t\t\t{\n\t\t\t\t\t\tStatus = RTMP_IO_EFAULT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCGIWESSID (Len=%d, ssid=%s...)\\n\", erq->length, (char *)erq->pointer));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SIOCGIWNWID: /* get network id */\n\t\tcase SIOCSIWNWID: /* set network id (the cell) */\n\t\t\tStatus = RTMP_IO_EOPNOTSUPP;\n\t\t\tbreak;\n\t\tcase SIOCGIWFREQ: /* get channel/frequency (Hz) */\n\t\t{\n\t\t\tULONG Channel;\n\t\t\tRTMP_DRIVER_CHANNEL_GET(pAd, &Channel);\n\t\t\twrqin->u.freq.m = Channel; /*pAd->CommonCfg.Channel; */\n\t\t\twrqin->u.freq.e = 0;\n\t\t\twrqin->u.freq.i = 0;\n\t\t}\n\t\t\tbreak; \n\t\tcase SIOCSIWFREQ: /*set channel/frequency (Hz) */\n\t\t\tStatus = RTMP_IO_EOPNOTSUPP;\n\t\t\tbreak;\n\t\tcase SIOCGIWNICKN:\n\t\tcase SIOCSIWNICKN: /*set node name/nickname */\n\t\t\tStatus = RTMP_IO_EOPNOTSUPP;\n\t\t\tbreak;\n\t\tcase SIOCGIWRATE:  /*get default bit rate (bps) */\n            {\n\t\t\t\tRT_CMD_IOCTL_RATE IoctlRate, *pIoctlRate = &IoctlRate;\n\n\t\t\t\tpIoctlRate->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);\n\t\t\t\tRTMP_DRIVER_BITRATE_GET(pAd, pIoctlRate);\n\n\n\t\t\twrqin->u.bitrate.value = pIoctlRate->BitRate;\n\t\t\twrqin->u.bitrate.disabled = 0;\n            }\n\t\t\tbreak;\n\t\tcase SIOCSIWRATE:  /*set default bit rate (bps) */\n\t\tcase SIOCGIWRTS:  /* get RTS/CTS threshold (bytes) */\n\t\tcase SIOCSIWRTS:  /*set RTS/CTS threshold (bytes) */\n\t\tcase SIOCGIWFRAG:  /*get fragmentation thr (bytes) */\n\t\tcase SIOCSIWFRAG:  /*set fragmentation thr (bytes) */\n\t\tcase SIOCGIWENCODE:  /*get encoding token & mode */\n\t\tcase SIOCSIWENCODE:  /*set encoding token & mode */\n\t\t\tStatus = RTMP_IO_EOPNOTSUPP;\n\t\t\tbreak;\n\t\tcase SIOCGIWAP:  /*get access point MAC addresses */\n\t\t\t{\n/*\t\t\t\tPCHAR pBssidStr; */\n\n\t\t\t\twrqin->u.ap_addr.sa_family = ARPHRD_ETHER;\n\t\t\t\t/*memcpy(wrqin->u.ap_addr.sa_data, &pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid, ETH_ALEN); */\n\n\t\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIWAP, 0,\n\t\t\t\t\t\t\t\twrqin->u.ap_addr.sa_data, RT_DEV_PRIV_FLAGS_GET(net_dev));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SIOCGIWMODE:  /*get operation mode */\n\t\t\twrqin->u.mode = IW_MODE_INFRA;   /*SoftAP always on INFRA mode. */\n\t\t\tbreak;\n\t\tcase SIOCSIWAP:  /*set access point MAC addresses */\n\t\tcase SIOCSIWMODE:  /*set operation mode */\n\t\tcase SIOCGIWSENS:   /*get sensitivity (dBm) */\n\t\tcase SIOCSIWSENS:\t/*set sensitivity (dBm) */\n\t\tcase SIOCGIWPOWER:  /*get Power Management settings */\n\t\tcase SIOCSIWPOWER:  /*set Power Management settings */\n\t\tcase SIOCGIWTXPOW:  /*get transmit power (dBm) */\n\t\tcase SIOCSIWTXPOW:  /*set transmit power (dBm) */\n\t\t/*case SIOCGIWRANGE:\t//Get range of parameters */\n\t\tcase SIOCGIWRETRY:\t/*get retry limits and lifetime */\n\t\tcase SIOCSIWRETRY:\t/*set retry limits and lifetime */\n\t\t\tStatus = RTMP_IO_EOPNOTSUPP;\n\t\t\tbreak;\n\t\tcase SIOCGIWRANGE:\t/*Get range of parameters */\n\t\t    {\n/*\t\t\t\tstruct iw_range range; */\n\t\t\t\tstruct iw_range *prange = NULL;\n\t\t\t\tUINT32 len;\n\n\t\t\t\t/* allocate memory */\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&prange, sizeof(struct iw_range));\n\t\t\t\tif (prange == NULL)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tmemset(prange, 0, sizeof(struct iw_range));\n\t\t\t\tprange->we_version_compiled = WIRELESS_EXT;\n\t\t\t\tprange->we_version_source = 14;\n\n\t\t\t\t/*\n\t\t\t\t\twhat is correct max? This was not\n\t\t\t\t\tdocumented exactly. At least\n\t\t\t\t\t69 has been observed.\n\t\t\t\t*/\n\t\t\t\tprange->max_qual.qual = 100;\n\t\t\t\tprange->max_qual.level = 0; /* dB */\n\t\t\t\tprange->max_qual.noise = 0; /* dB */\n\t\t\t\tlen = copy_to_user(wrq->u.data.pointer, prange, sizeof(struct iw_range));\n\t\t\t\tos_free_mem(NULL, prange);\n\t\t    }\n\t\t    break;\n\t\t    \n\t\tcase RT_PRIV_IOCTL:\n\t\tcase RT_PRIV_IOCTL_EXT:\n\t\t{\n\t\t\tsubcmd = wrqin->u.data.flags;\n\n\t\t\tStatus = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RT_PRIV_IOCTL, subcmd, wrqin->u.data.pointer, 0);\n\t\t}\n\t\t\tbreak;\n\t\t\n#ifdef HOSTAPD_SUPPORT\n\t\tcase SIOCSIWGENIE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ioctl SIOCSIWGENIE apidx=%d\\n\",apidx));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"ioctl SIOCSIWGENIE length=%d, pointer=%x\\n\", wrqin->u.data.length, wrqin->u.data.pointer));\n\n\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrqin, CMD_RTPRIV_IOCTL_AP_SIOCSIWGENIE, 0, NULL, 0);\n\t\t\tbreak;\n#endif /* HOSTAPD_SUPPORT */\n\n\t\tcase SIOCGIWPRIV:\n\t\t\tif (wrqin->u.data.pointer) \n\t\t\t{\n\t\t\t\tif ( access_ok(VERIFY_WRITE, wrqin->u.data.pointer, sizeof(ap_privtab)) != TRUE)\n\t\t\t\t\tbreak;\n\t\t\t\tif ((sizeof(ap_privtab) / sizeof(ap_privtab[0])) <= wrq->u.data.length)\n\t\t\t\t{\n\t\t\t\t\twrqin->u.data.length = sizeof(ap_privtab) / sizeof(ap_privtab[0]);\n\t\t\t\t\tif (copy_to_user(wrqin->u.data.pointer, ap_privtab, sizeof(ap_privtab)))\n\t\t\t\t\t\tStatus = RTMP_IO_EFAULT;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus = RTMP_IO_E2BIG;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RTPRIV_IOCTL_SET:\n\t\t\t{\n\t\t\t\tif( access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) == TRUE)\n\t\t\t\t\tStatus = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SET, 0, NULL, 0);\n\t\t\t}\n\t\t\tbreak;\n\t\t    \n\t\tcase RTPRIV_IOCTL_SHOW:\n\t\t\t{\n\t\t\t\tif( access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) == TRUE)\n\t\t\t\t\tStatus = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SHOW, 0, NULL, 0);\n\t\t\t}\n\t\t\tbreak;\t\n\t\t\t\n#ifdef INF_AR9\n#ifdef AR9_MAPI_SUPPORT\n\t\tcase RTPRIV_IOCTL_GET_AR9_SHOW:\n\t\t\t{\n\t\t\t\tif( access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) == TRUE)\n\t\t\t\t\tStatus = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_AR9_SHOW, 0, NULL, 0);\n\t\t\t}\t\n\t\t    break;\n#endif /*AR9_MAPI_SUPPORT*/\n#endif /* INF_AR9 */\n\n#ifdef WSC_AP_SUPPORT\n\t\tcase RTPRIV_IOCTL_SET_WSCOOB:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SET_WSCOOB, 0, NULL, 0);\n\t\t    break;\n#endif/*WSC_AP_SUPPORT*/\n\n/* modified by Red@Ralink, 2009/09/30 */\n\t\tcase RTPRIV_IOCTL_GET_MAC_TABLE:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_MAC_TABLE, 0, NULL, 0);\n\t\t    break;\n\n\t\tcase RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT, 0, NULL, 0);\n\t\t\tbreak;\n/* end of modification */\n\n#ifdef AP_SCAN_SUPPORT\n\t\tcase RTPRIV_IOCTL_GSITESURVEY:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GSITESURVEY, 0, NULL, 0);\n\t\t\tbreak;\n#endif /* AP_SCAN_SUPPORT */\n\n\t\tcase RTPRIV_IOCTL_STATISTICS:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_STATISTICS, 0, NULL, 0);\n\t\t\tbreak;\n\n#ifdef WSC_AP_SUPPORT\n\t\tcase RTPRIV_IOCTL_WSC_PROFILE:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_WSC_PROFILE, 0, NULL, 0);\n\t\t    break;\n#endif /* WSC_AP_SUPPORT */\n#ifdef DOT11_N_SUPPORT\n\t\tcase RTPRIV_IOCTL_QUERY_BATABLE:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_QUERY_BATABLE, 0, NULL, 0);\n\t\t    break;\n#endif /* DOT11_N_SUPPORT */\n\t\tcase RTPRIV_IOCTL_E2P:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_E2P, 0, NULL, 0);\n\t\t\tbreak;\n\n#ifdef DBG\n\t\tcase RTPRIV_IOCTL_BBP:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_BBP, 0, NULL, 0);\n\t\t\tbreak;\n\t\t\t\n\t\tcase RTPRIV_IOCTL_MAC:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_MAC, 0, NULL, 0);\n\t\t\tbreak;\n            \n\t\tcase RTPRIV_IOCTL_RF:\n\t\t\tRTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_RF, 0, NULL, 0);\n\t\t\tbreak;\n#endif /* DBG */\n\n\t\tdefault:\n/*\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IOCTL::unknown IOCTL's cmd = 0x%08x\\n\", cmd)); */\n\t\t\tStatus = RTMP_IO_EOPNOTSUPP;\n\t\t\tbreak;\n\t}\n\nLabelExit:\n\tif (Status != 0)\n\t{\n\t\tRT_CMD_STATUS_TRANSLATE(Status);\n\t}\n\telse\n\t{\n\t\t/*\n\t\t\tIf wrq length is modified, we reset the lenght of origin wrq;\n\n\t\t\tOr we can not modify it because the address of wrq->u.data.length\n\t\t\tmaybe same as other union field, ex: iw_range, etc.\n\n\t\t\tif the length is not changed but we change it, the value for other\n\t\t\tunion will also be changed, this is not correct.\n\t\t*/\n\t\tif (wrq->u.data.length != org_len)\n\t\t\twrqin->u.data.length = wrq->u.data.length;\n\t}\n\n\treturn Status;\n}\n"
  },
  {
    "path": "src/os/linux/cfg80211.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2009, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll related CFG80211 function body.\n\n\tHistory:\n\t\t1. 2009/09/17\tSample Lin\n\t\t\t(1) Init version.\n\t\t2. 2009/10/27\tSample Lin\n\t\t\t(1) Do not use ieee80211_register_hw() to create virtual interface.\n\t\t\t\tUse wiphy_register() to register nl80211 command handlers.\n\t\t\t(2) Support iw utility.\n\t\t3. 2009/11/03\tSample Lin\n\t\t\t(1) Change name MAC80211 to CFG80211.\n\t\t\t(2) Modify CFG80211_OpsChannelSet().\n\t\t\t(3) Move CFG80211_Register()/CFG80211_UnRegister() to open/close.\n\t\t4. 2009/12/16\tSample Lin\n\t\t\t(1) Patch for Linux 2.6.32.\n\t\t\t(2) Add more supported functions in CFG80211_Ops.\n\t\t5. 2010/12/10\tSample Lin\n\t\t\t(1) Modify for OS_ABL.\n\t\t6. 2011/04/19\tSample Lin\n\t\t\t(1) Add more supported functions in CFG80211_Ops v33 ~ 38.\n\n\tNote:\n\t\tThe feature is supported only in \"LINUX\" 2.6.28 ~ 2.6.38.\n\n***************************************************************************/\n\n\n/* #include \"rt_config.h\" */\n#define RTMP_MODULE_OS\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))\n#ifdef RT_CFG80211_SUPPORT\n\n/* 36 ~ 64, 100 ~ 136, 140 ~ 161 */\n#define CFG80211_NUM_OF_CHAN_5GHZ\t\t\t\\\n\t\t\t\t\t\t\t(sizeof(Cfg80211_Chan)-CFG80211_NUM_OF_CHAN_2GHZ)\n\n#ifdef OS_ABL_FUNC_SUPPORT\n/*\n\tArray of bitrates the hardware can operate with\n\tin this band. Must be sorted to give a valid \"supported\n\trates\" IE, i.e. CCK rates first, then OFDM.\n\n\tFor HT, assign MCS in another structure, ieee80211_sta_ht_cap.\n*/\nconst struct ieee80211_rate Cfg80211_SupRate[12] = {\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 10,\n\t\t.hw_value = 0,\n\t\t.hw_value_short = 0,\n\t},\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 20,\n\t\t.hw_value = 1,\n\t\t.hw_value_short = 1,\n\t},\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 55,\n\t\t.hw_value = 2,\n\t\t.hw_value_short = 2,\n\t},\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 110,\n\t\t.hw_value = 3,\n\t\t.hw_value_short = 3,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 60,\n\t\t.hw_value = 4,\n\t\t.hw_value_short = 4,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 90,\n\t\t.hw_value = 5,\n\t\t.hw_value_short = 5,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 120,\n\t\t.hw_value = 6,\n\t\t.hw_value_short = 6,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 180,\n\t\t.hw_value = 7,\n\t\t.hw_value_short = 7,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 240,\n\t\t.hw_value = 8,\n\t\t.hw_value_short = 8,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 360,\n\t\t.hw_value = 9,\n\t\t.hw_value_short = 9,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 480,\n\t\t.hw_value = 10,\n\t\t.hw_value_short = 10,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 540,\n\t\t.hw_value = 11,\n\t\t.hw_value_short = 11,\n\t},\n};\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n/* all available channels */\nstatic const UCHAR Cfg80211_Chan[] = {\n\t1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n\n\t/* 802.11 UNI / HyperLan 2 */\n\t36, 38, 40, 44, 46, 48, 52, 54, 56, 60, 62, 64,\n\n\t/* 802.11 HyperLan 2 */\n\t100, 104, 108, 112, 116, 118, 120, 124, 126, 128, 132, 134, 136,\n\n\t/* 802.11 UNII */\n\t140, 149, 151, 153, 157, 159, 161, 165, 167, 169, 171, 173,\n\n\t/* Japan */\n\t184, 188, 192, 196, 208, 212, 216,\n};\n\n\nstatic const UINT32 CipherSuites[] = {\n\tWLAN_CIPHER_SUITE_WEP40,\n\tWLAN_CIPHER_SUITE_WEP104,\n\tWLAN_CIPHER_SUITE_TKIP,\n\tWLAN_CIPHER_SUITE_CCMP,\n};\n\n\n\n/*\n\tThe driver's regulatory notification callback.\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\nstatic INT32 CFG80211_RegNotifier(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct regulatory_request\t*pRequest);\n#else\nstatic INT32 CFG80211_RegNotifier(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN enum reg_set_by\t\t\t\tRequest);\n#endif /* LINUX_VERSION_CODE */\n\n\n\n\n/* =========================== Private Function ============================== */\n\n/* get RALINK pAd control block in 80211 Ops */\n#define MAC80211_PAD_GET(__pAd, __pWiphy)\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tULONG *__pPriv;\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t__pPriv = (ULONG *)(wiphy_priv(__pWiphy));\t\t\t\t\t\\\n\t\t__pAd = (VOID *)(*__pPriv);\t\t\t\t\t\t\t\t\t\\\n\t\tif (__pAd == NULL)\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t(\"80211> %s but pAd = NULL!\", __FUNCTION__));\t\\\n\t\t\treturn -EINVAL;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t}\n\n/*\n========================================================================\nRoutine Description:\n\tSet channel.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpChan\t\t\t- Channel information\n\tChannelType\t\t- Channel type\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: set channel, set freq\n\n\tenum nl80211_channel_type {\n\t\tNL80211_CHAN_NO_HT,\n\t\tNL80211_CHAN_HT20,\n\t\tNL80211_CHAN_HT40MINUS,\n\t\tNL80211_CHAN_HT40PLUS\n\t};\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\nstatic int CFG80211_OpsChannelSet(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t*pDev,\n\tIN struct ieee80211_channel\t\t*pChan,\n\tIN enum nl80211_channel_type\tChannelType)\n\n#else\nstatic int CFG80211_OpsChannelSet(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct ieee80211_channel\t\t*pChan,\n\tIN enum nl80211_channel_type\tChannelType)\n#endif /* LINUX_VERSION_CODE */\n{\n\tVOID *pAd;\n\tCFG80211_CB *p80211CB;\n\tCMD_RTPRIV_IOCTL_80211_CHAN ChanInfo;\n\tUINT32 ChanId;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\t/* get channel number */\n\tChanId = ieee80211_frequency_to_channel(pChan->center_freq);\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> Channel = %d\\n\", ChanId));\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> ChannelType = %d\\n\", ChannelType));\n\n\t/* init */\n\tmemset(&ChanInfo, 0, sizeof(ChanInfo));\n\tChanInfo.ChanId = ChanId;\n\n\tp80211CB = NULL;\n\tRTMP_DRIVER_80211_CB_GET(pAd, &p80211CB);\n\n\tif (p80211CB == NULL)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> p80211CB == NULL!\\n\"));\n\t\treturn 0;\n\t}\n\n\tif (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_STATION)\n\t\tChanInfo.IfType = RT_CMD_80211_IFTYPE_STATION;\n\telse if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_ADHOC)\n\t\tChanInfo.IfType = RT_CMD_80211_IFTYPE_ADHOC;\n\telse if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_MONITOR)\n\t\tChanInfo.IfType = RT_CMD_80211_IFTYPE_MONITOR;\n\n\tif (ChannelType == NL80211_CHAN_NO_HT)\n\t\tChanInfo.ChanType = RT_CMD_80211_CHANTYPE_NOHT;\n\telse if (ChannelType == NL80211_CHAN_HT20)\n\t\tChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT20;\n\telse if (ChannelType == NL80211_CHAN_HT40MINUS)\n\t\tChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40MINUS;\n\telse if (ChannelType == NL80211_CHAN_HT40PLUS)\n\t\tChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40PLUS;\n\n\tChanInfo.MonFilterFlag = p80211CB->MonFilterFlag;\n\n\t/* set channel */\n\tRTMP_DRIVER_80211_CHAN_SET(pAd, &ChanInfo);\n\n\treturn 0;\n} /* End of CFG80211_OpsChannelSet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tChange type/configuration of virtual interface.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tIfIndex\t\t\t- Interface index\n\tType\t\t\t- Interface type, managed/adhoc/ap/station, etc.\n\tpFlags\t\t\t- Monitor flags\n\tpParams\t\t\t- Mesh parameters\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: set type, set monitor\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\nstatic int CFG80211_OpsVirtualInfChg(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t*pNetDevIn,\n\tIN enum nl80211_iftype\t\t\tType,\n\tIN u32\t\t\t\t\t\t\t*pFlags,\n\tstruct vif_params\t\t\t\t*pParams)\n#else\nstatic int CFG80211_OpsVirtualInfChg(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN int\t\t\t\t\t\t\tIfIndex,\n\tIN enum nl80211_iftype\t\t\tType,\n\tIN u32\t\t\t\t\t\t\t*pFlags,\n\tstruct vif_params\t\t\t\t*pParams)\n#endif /* LINUX_VERSION_CODE */\n{\n\tVOID *pAd;\n\tCFG80211_CB *pCfg80211_CB;\n\tstruct net_device *pNetDev;\n\tUINT32 Filter;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> Type = %d\\n\", Type));\n\n\t/* sanity check */\n#ifdef CONFIG_STA_SUPPORT\n\tif ((Type != NL80211_IFTYPE_ADHOC) &&\n\t\t(Type != NL80211_IFTYPE_STATION) &&\n\t\t(Type != NL80211_IFTYPE_MONITOR))\n#endif /* CONFIG_STA_SUPPORT */\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Wrong interface type %d!\\n\", Type));\n\t\treturn -EINVAL;\n\t} /* End of if */\n\n\t/* update interface type */\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\n\tpNetDev = pNetDevIn;\n#else\n\tpNetDev = __dev_get_by_index(&init_net, IfIndex);\n#endif /* LINUX_VERSION_CODE */\n\n\tif (pNetDev == NULL)\n\t\treturn -ENODEV;\n\t/* End of if */\n\n\tpNetDev->ieee80211_ptr->iftype = Type;\n\n\tif (pFlags != NULL)\n\t{\n\t\tFilter = 0;\n\n\t\tif (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == NL80211_MNTR_FLAG_FCSFAIL)\n\t\t\tFilter |= RT_CMD_80211_FILTER_FCSFAIL;\n\n\t\tif (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == NL80211_MNTR_FLAG_PLCPFAIL)\n\t\t\tFilter |= RT_CMD_80211_FILTER_PLCPFAIL;\n\n\t\tif (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == NL80211_MNTR_FLAG_CONTROL)\n\t\t\tFilter |= RT_CMD_80211_FILTER_CONTROL;\n\n\t\tif (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == NL80211_MNTR_FLAG_OTHER_BSS)\n\t\t\tFilter |= RT_CMD_80211_FILTER_OTHER_BSS;\n\t} /* End of if */\n\n\tRTMP_DRIVER_80211_VIF_SET(pAd, Filter, Type);\n\n\tRTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB);\n\tpCfg80211_CB->MonFilterFlag = Filter;\n\treturn 0;\n} /* End of CFG80211_OpsVirtualInfChg */\n\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\n#if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT)\nextern int rt_ioctl_siwscan(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wreq, char *extra);\n#endif\n/*\n========================================================================\nRoutine Description:\n\tRequest to do a scan. If returning zero, the scan request is given\n\tthe driver, and will be valid until passed to cfg80211_scan_done().\n\tFor scan results, call cfg80211_inform_bss(); you can call this outside\n\tthe scan/scan_done bracket too.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tpRequest\t\t- Scan request\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: scan\n\n\tstruct cfg80211_scan_request {\n\t\tstruct cfg80211_ssid *ssids;\n\t\tint n_ssids;\n\t\tstruct ieee80211_channel **channels;\n\t\tu32 n_channels;\n\t\tconst u8 *ie;\n\t\tsize_t ie_len;\n\n\t * @ssids: SSIDs to scan for (active scan only)\n\t * @n_ssids: number of SSIDs\n\t * @channels: channels to scan on.\n\t * @n_channels: number of channels for each band\n\t * @ie: optional information element(s) to add into Probe Request or %NULL\n\t * @ie_len: length of ie in octets\n========================================================================\n*/\nstatic int CFG80211_OpsScan(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t*pNdev,\n\tIN struct cfg80211_scan_request *pRequest)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tVOID *pAd;\n\tCFG80211_CB *pCfg80211_CB;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tstruct iw_scan_req IwReq;\n\tunion iwreq_data Wreq;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\t/* sanity check */\n\tif ((pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) &&\n\t\t(pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC))\n\t{\n\t\treturn -EOPNOTSUPP;\n\t} /* End of if */\n\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"80211> Network is down!\\n\"));\n\t\treturn -ENETDOWN;\n\t} /* End of if */\n\n\tif (RTMP_DRIVER_80211_SCAN(pAd) != NDIS_STATUS_SUCCESS)\n\t\treturn -EBUSY; /* scanning */\n\t/* End of if */\n\n\tRTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB);\n\tpCfg80211_CB->pCfg80211_ScanReq = pRequest; /* used in scan end */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tmemset(&Wreq, 0, sizeof(Wreq));\n\tmemset(&IwReq, 0, sizeof(IwReq));\n\n\tif ((pRequest->ssids != NULL) &&\n\t\t(sizeof(pRequest->ssids->ssid) <= sizeof(IwReq.essid)))\n\t{\n\t\t/* use 1st SSID in the requested SSID list */\n\t\tIwReq.essid_len = pRequest->ssids->ssid_len;\n\t\tmemcpy(IwReq.essid, pRequest->ssids->ssid, sizeof(IwReq.essid));\n\n#if WIRELESS_EXT > 17\n\t\tWreq.data.flags |= IW_SCAN_THIS_ESSID;\n\t\tWreq.data.length = sizeof(struct iw_scan_req);\n#endif /* WIRELESS_EXT */\n\t}\n\n\trt_ioctl_siwscan(pNdev, NULL, &Wreq, (char *)&IwReq);\n#else\n\n\trt_ioctl_siwscan(pNdev, NULL, NULL, NULL);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\treturn 0;\n#else\n\n\treturn -EOPNOTSUPP;\n#endif /* CONFIG_STA_SUPPORT */\n} /* End of CFG80211_OpsScan */\n#endif /* LINUX_VERSION_CODE */\n\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))\n#ifdef CONFIG_STA_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tJoin the specified IBSS (or create if necessary). Once done, call\n\tcfg80211_ibss_joined(), also call that function when changing BSSID due\n\tto a merge.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tpParams\t\t\t- IBSS parameters\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: ibss join\n\n\tNo fixed-freq and fixed-bssid support.\n========================================================================\n*/\nstatic int CFG80211_OpsIbssJoin(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t*pNdev,\n\tIN struct cfg80211_ibss_params\t*pParams)\n{\n\tVOID *pAd;\n\tCMD_RTPRIV_IOCTL_80211_IBSS IbssInfo;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> SSID = %s\\n\",\n\t\t\t\tpParams->ssid));\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> Beacon Interval = %d\\n\",\n\t\t\t\tpParams->beacon_interval));\n\n\t/* init */\n\tmemset(&IbssInfo, 0, sizeof(IbssInfo));\n\tIbssInfo.BeaconInterval = pParams->beacon_interval;\n\tIbssInfo.pSsid = pParams->ssid;\n\n\t/* ibss join */\n\tRTMP_DRIVER_80211_IBSS_JOIN(pAd, &IbssInfo);\n\n\treturn 0;\n} /* End of CFG80211_OpsIbssJoin */\n\n\n/*\n========================================================================\nRoutine Description:\n\tLeave the IBSS.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: ibss leave\n========================================================================\n*/\nstatic int CFG80211_OpsIbssLeave(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t*pNdev)\n{\n\tVOID *pAd;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tRTMP_DRIVER_80211_STA_LEAVE(pAd);\n\treturn 0;\n} /* End of CFG80211_OpsIbssLeave */\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\n/*\n========================================================================\nRoutine Description:\n\tSet the transmit power according to the parameters.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tType\t\t\t- \n\tdBm\t\t\t\t- dBm\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tType -\n\tTX_POWER_AUTOMATIC: the dbm parameter is ignored\n\tTX_POWER_LIMITED: limit TX power by the dbm parameter\n\tTX_POWER_FIXED: fix TX power to the dbm parameter\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))\nstatic int CFG80211_OpsTxPwrSet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN enum nl80211_tx_power_setting\tType,\n\tIN int\t\t\t\t\t\t\t\tdBm)\n{\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -EOPNOTSUPP;\n} /* End of CFG80211_OpsTxPwrSet */\n\n#else\nstatic int CFG80211_OpsTxPwrSet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN enum tx_power_setting\t\t\tType,\n\tIN int\t\t\t\t\t\t\t\tdBm)\n{\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -EOPNOTSUPP;\n} /* End of CFG80211_OpsTxPwrSet */\n#endif /* LINUX_VERSION_CODE */\n\n\n/*\n========================================================================\nRoutine Description:\n\tStore the current TX power into the dbm variable.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpdBm\t\t\t- dBm\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsTxPwrGet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN int\t\t\t\t\t\t\t\t*pdBm)\n{\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -EOPNOTSUPP;\n} /* End of CFG80211_OpsTxPwrGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tPower management.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- \n\tFlgIsEnabled\t-\n\tTimeout\t\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsPwrMgmt(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN bool\t\t\t\t\t\t\t\tFlgIsEnabled,\n\tIN int\t\t\t\t\t\t\t\tTimeout)\n{\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -EOPNOTSUPP;\n} /* End of CFG80211_OpsPwrMgmt */\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet information for a specific station.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t-\n\tpMac\t\t\t- STA MAC\n\tpSinfo\t\t\t- STA INFO\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsStaGet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\t*pMac,\n\tIN struct station_info\t\t\t\t*pSinfo)\n{\n\tVOID *pAd;\n\tCMD_RTPRIV_IOCTL_80211_STA StaInfo;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\t/* init */\n\tmemset(pSinfo, 0, sizeof(*pSinfo));\n\tmemset(&StaInfo, 0, sizeof(StaInfo));\n\n\tmemcpy(StaInfo.MAC, pMac, 6);\n\n\t/* get sta information */\n\tif (RTMP_DRIVER_80211_STA_GET(pAd, &StaInfo) != NDIS_STATUS_SUCCESS)\n\t\treturn -ENOENT;\n\n\tif (StaInfo.TxRateFlags != RT_CMD_80211_TXRATE_LEGACY)\n\t{\n\t\tpSinfo->txrate.flags = RATE_INFO_FLAGS_MCS;\n\t\tif (StaInfo.TxRateFlags & RT_CMD_80211_TXRATE_BW_40)\n\t\t\tpSinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;\n\t\t/* End of if */\n\t\tif (StaInfo.TxRateFlags & RT_CMD_80211_TXRATE_SHORT_GI)\n\t\t\tpSinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;\n\t\t/* End of if */\n\n\t\tpSinfo->txrate.mcs = StaInfo.TxRateMCS;\n\t}\n\telse\n\t{\n\t\tpSinfo->txrate.legacy = StaInfo.TxRateMCS;\n\t} /* End of if */\n\n\tpSinfo->filled |= STATION_INFO_TX_BITRATE;\n\n\t/* fill signal */\n\tpSinfo->signal = StaInfo.Signal;\n\tpSinfo->filled |= STATION_INFO_SIGNAL;\n\n#ifdef CONFIG_AP_SUPPORT\n\t/* fill tx count */\n\tpSinfo->tx_packets = StaInfo.TxPacketCnt;\n\tpSinfo->filled |= STATION_INFO_TX_PACKETS;\n\n\t/* fill inactive time */\n\tpSinfo->inactive_time = StaInfo.InactiveTime;\n\tpSinfo->filled |= STATION_INFO_INACTIVE_TIME;\n#endif /* CONFIG_AP_SUPPORT */\n\n\treturn 0;\n} /* End of CFG80211_OpsStaGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tList all stations known, e.g. the AP on managed interfaces.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t-\n\tIdx\t\t\t\t- \n\tpMac\t\t\t-\n\tpSinfo\t\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsStaDump(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN int\t\t\t\t\t\t\t\tIdx,\n\tIN UINT8\t\t\t\t\t\t\t*pMac,\n\tIN struct station_info\t\t\t\t*pSinfo)\n{\n\tVOID *pAd;\n\n\n\tif (Idx != 0)\n\t\treturn -ENOENT;\n\t/* End of if */\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n#ifdef CONFIG_STA_SUPPORT\n\tif (RTMP_DRIVER_AP_SSID_GET(pAd, pMac) != NDIS_STATUS_SUCCESS)\n\t\treturn -EBUSY;\n\telse\n\t\treturn CFG80211_OpsStaGet(pWiphy, pNdev, pMac, pSinfo);\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn -EOPNOTSUPP;\n} /* End of CFG80211_OpsStaDump */\n\n\n/*\n========================================================================\nRoutine Description:\n\tNotify that wiphy parameters have changed.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tChanged\t\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsWiphyParamsSet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN UINT32\t\t\t\t\t\t\tChanged)\n{\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -EOPNOTSUPP;\n} /* End of CFG80211_OpsWiphyParamsSet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tAdd a key with the given parameters.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t-\n\tKeyIdx\t\t\t-\n\tPairwise\t\t-\n\tpMacAddr\t\t-\n\tpParams\t\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tpMacAddr will be NULL when adding a group key.\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\nstatic int CFG80211_OpsKeyAdd(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN bool\t\t\t\t\t\t\t\tPairwise,\n\tIN const UINT8\t\t\t\t\t\t*pMacAddr,\n\tIN struct key_params\t\t\t\t*pParams)\n#else\n\nstatic int CFG80211_OpsKeyAdd(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN const UINT8\t\t\t\t\t\t*pMacAddr,\n\tIN struct key_params\t\t\t\t*pParams)\n#endif /* LINUX_VERSION_CODE */\n{\n\tVOID *pAd;\n\tCMD_RTPRIV_IOCTL_80211_KEY KeyInfo;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n#ifdef RT_CFG80211_DEBUG\n\thex_dump(\"KeyBuf=\", (UINT8 *)pParams->key, pParams->key_len);\n#endif /* RT_CFG80211_DEBUG */\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> KeyIdx = %d\\n\", KeyIdx));\n\n\tif (pParams->key_len >= sizeof(KeyInfo.KeyBuf))\n\t\treturn -EINVAL;\n\t/* End of if */\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* init */\n\tmemset(&KeyInfo, 0, sizeof(KeyInfo));\n\tmemcpy(KeyInfo.KeyBuf, pParams->key, pParams->key_len);\n\tKeyInfo.KeyBuf[pParams->key_len] = 0x00;\n\n\tif ((pParams->cipher == WLAN_CIPHER_SUITE_WEP40) ||\n\t\t(pParams->cipher == WLAN_CIPHER_SUITE_WEP104))\n\t{\n\t\tKeyInfo.KeyType = RT_CMD_80211_KEY_WEP;\n\t}\n\telse if ((pParams->cipher == WLAN_CIPHER_SUITE_TKIP) ||\n\t\t(pParams->cipher == WLAN_CIPHER_SUITE_CCMP))\n\t{\n\t\tKeyInfo.KeyType = RT_CMD_80211_KEY_WPA;\n\t}\n\telse\n\t\treturn -ENOTSUPP;\n\n\tKeyInfo.KeyId = KeyIdx+1;\n\n\t/* add key */\n\tRTMP_DRIVER_80211_KEY_ADD(pAd, &KeyInfo);\n\treturn 0;\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\treturn -ENOTSUPP;\n#endif /* CONFIG_AP_SUPPORT */\n} /* End of CFG80211_OpsKeyAdd */\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet information about the key with the given parameters.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t-\n\tKeyIdx\t\t\t-\n\tPairwise\t\t-\n\tpMacAddr\t\t-\n\tpCookie\t\t\t-\n\tpCallback\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tpMacAddr will be NULL when requesting information for a group key.\n\n\tAll pointers given to the pCallback function need not be valid after\n\tit returns.\n\n\tThis function should return an error if it is not possible to\n\tretrieve the key, -ENOENT if it doesn't exist.\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\nstatic int CFG80211_OpsKeyGet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN bool\t\t\t\t\t\t\t\tPairwise,\n\tIN const UINT8\t\t\t\t\t\t*pMacAddr,\n\tIN void\t\t\t\t\t\t\t\t*pCookie,\n\tIN void\t\t\t\t\t\t\t\t(*pCallback)(void *cookie,\n\t\t\t\t\t\t\t\t\t\t\t\t struct key_params *))\n#else\n\nstatic int CFG80211_OpsKeyGet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN const UINT8\t\t\t\t\t\t*pMacAddr,\n\tIN void\t\t\t\t\t\t\t\t*pCookie,\n\tIN void\t\t\t\t\t\t\t\t(*pCallback)(void *cookie,\n\t\t\t\t\t\t\t\t\t\t\t\t struct key_params *))\n#endif /* LINUX_VERSION_CODE */\n{\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -ENOTSUPP;\n} /* End of CFG80211_OpsKeyGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tRemove a key given the pMacAddr (NULL for a group key) and KeyIdx.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t-\n\tKeyIdx\t\t\t-\n\tpMacAddr\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\treturn -ENOENT if the key doesn't exist.\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\nstatic int CFG80211_OpsKeyDel(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN bool\t\t\t\t\t\t\t\tPairwise,\n\tIN const UINT8\t\t\t\t\t\t*pMacAddr)\n#else\n\nstatic int CFG80211_OpsKeyDel(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN const UINT8\t\t\t\t\t\t*pMacAddr)\n#endif /* LINUX_VERSION_CODE */\n{\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\treturn -ENOTSUPP;\n} /* End of CFG80211_OpsKeyDel */\n\n\n/*\n========================================================================\nRoutine Description:\n\tSet the default key on an interface.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t-\n\tKeyIdx\t\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))\nstatic int CFG80211_OpsKeyDefaultSet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx,\n\tIN bool\t\t\t\t\t\t\t\tUnicast,\n\tIN bool\t\t\t\t\t\t\t\tMulticast)\n#else\n\nstatic int CFG80211_OpsKeyDefaultSet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN UINT8\t\t\t\t\t\t\tKeyIdx)\n#endif /* LINUX_VERSION_CODE */\n{\n\tVOID *pAd;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> KeyIdx = %d\\n\", KeyIdx));\n\n\tRTMP_DRIVER_80211_KEY_DEFAULT_SET(pAd, KeyIdx);\n\treturn 0;\n} /* End of CFG80211_OpsKeyDefaultSet */\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tConnect to the ESS with the specified parameters. When connected,\n\tcall cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS.\n\tIf the connection fails for some reason, call cfg80211_connect_result()\n\twith the status from the AP.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tpSme\t\t\t- \n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: connect\n\n\tYou must use \"iw ra0 connect xxx\", then \"iw ra0 disconnect\";\n\tYou can not use \"iw ra0 connect xxx\" twice without disconnect;\n\tOr you will suffer \"command failed: Operation already in progress (-114)\".\n\n\tYou must support add_key and set_default_key function;\n\tOr kernel will crash without any error message in linux 2.6.32.\n========================================================================\n*/\nstatic int CFG80211_OpsConnect(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN struct cfg80211_connect_params\t*pSme)\n{\n\tVOID *pAd;\n\tCMD_RTPRIV_IOCTL_80211_CONNECT ConnInfo;\n\tstruct ieee80211_channel *pChannel = pSme->channel;\n\tINT32 Pairwise = 0;\n\tINT32 Groupwise = 0;\n\tINT32 Keymgmt = 0;\n\tINT32 WpaVersion = NL80211_WPA_VERSION_2;\n\tINT32 Chan = -1, Idx;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\n\t/* init */\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tif (pChannel != NULL)\n\t\tChan = ieee80211_frequency_to_channel(pChannel->center_freq);\n\n\tGroupwise = pSme->crypto.cipher_group;\n\tfor(Idx=0; Idx<pSme->crypto.n_ciphers_pairwise; Idx++)\n\t\tPairwise |= pSme->crypto.ciphers_pairwise[Idx];\n\t/* End of for */\n\n\tfor(Idx=0; Idx<pSme->crypto.n_akm_suites; Idx++)\n\t\tKeymgmt |= pSme->crypto.akm_suites[Idx];\n\t/* End of for */\n\n\tWpaVersion = pSme->crypto.wpa_versions;\n\n\tmemset(&ConnInfo, 0, sizeof(ConnInfo));\n\tif (WpaVersion & NL80211_WPA_VERSION_2)\n\t\tConnInfo.WpaVer = 2;\n\telse if (WpaVersion & NL80211_WPA_VERSION_1)\n\t\tConnInfo.WpaVer = 1;\n\telse\n\t\tConnInfo.WpaVer = 0;\n\n\tif (Keymgmt & WLAN_AKM_SUITE_8021X)\n\t\tConnInfo.FlgIs8021x = TRUE;\n\telse\n\t\tConnInfo.FlgIs8021x = FALSE;\n\n\tif (pSme->auth_type == NL80211_AUTHTYPE_SHARED_KEY)\n\t\tConnInfo.FlgIsAuthOpen = FALSE;\n\telse\n\t\tConnInfo.FlgIsAuthOpen = TRUE;\n\n\tif (Pairwise & WLAN_CIPHER_SUITE_CCMP)\n\t\tConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP;\n\telse if (Pairwise & WLAN_CIPHER_SUITE_TKIP)\n\t\tConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP;\n\telse if ((Pairwise & WLAN_CIPHER_SUITE_WEP40) ||\n\t\t\t(Pairwise & WLAN_CIPHER_SUITE_WEP104))\n\t{\n\t\tConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_WEP;\n\t}\n\telse\n\t\tConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE;\n\n\tif (Groupwise & WLAN_CIPHER_SUITE_CCMP)\n\t\tConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP;\n\telse if (Groupwise & WLAN_CIPHER_SUITE_TKIP)\n\t\tConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP;\n\telse\n\t\tConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE;\n\t/* End of if */\n\n\tConnInfo.pKey = (UINT8 *)(pSme->key);\n\tConnInfo.KeyLen = pSme->key_len;\n\tConnInfo.pSsid = pSme->ssid;\n\tConnInfo.SsidLen = pSme->ssid_len;\n\n\tCFG80211DBG(RT_DEBUG_ERROR,\t(\"80211> SME %x\\n\",\tpSme->auth_type));\n\n\tRTMP_DRIVER_80211_CONNECT(pAd, &ConnInfo);\n\treturn 0;\n} /* End of CFG80211_OpsConnect */\n\n\n/*\n========================================================================\nRoutine Description:\n\tDisconnect from the BSS/ESS.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tReasonCode\t\t- \n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: connect\n========================================================================\n*/\nstatic int CFG80211_OpsDisconnect(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN u16\t\t\t\t\t\t\t\tReasonCode)\n{\n\tVOID *pAd;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> ReasonCode = %d\\n\", ReasonCode));\n\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tRTMP_DRIVER_80211_STA_LEAVE(pAd);\n\treturn 0;\n} /* End of CFG80211_OpsDisconnect */\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n\n\n#ifdef RFKILL_HW_SUPPORT\nstatic int CFG80211_OpsRFKill(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy)\n{\n\tVOID\t\t*pAd;\n\tBOOLEAN\t\tactive;\n\n\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tRTMP_DRIVER_80211_RFKILL(pAd, &active);\n\twiphy_rfkill_set_hw_state(pWiphy, !active);\t\n\treturn active;\n}\n\n\nVOID CFG80211_RFKillStatusUpdate(\n\tIN PVOID\t\t\t\t\t\t\tpAd,\n\tIN BOOLEAN\t\t\t\t\t\t\tactive)\n{\n\tstruct wiphy *pWiphy;\n\tCFG80211_CB *pCfg80211_CB;\n\n\n\tRTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB);\n\tpWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;\n\twiphy_rfkill_set_hw_state(pWiphy, !active);\n\treturn;\n}\n#endif /* RFKILL_HW_SUPPORT */\n\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))\n/*\n========================================================================\nRoutine Description:\n\tGet site survey information.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tIdx\t\t\t\t-\n\tpSurvey\t\t\t-\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tFor iw utility: survey dump\n========================================================================\n*/\nstatic int CFG80211_OpsSurveyGet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN int\t\t\t\t\t\t\t\tIdx,\n\tIN struct survey_info\t\t\t\t*pSurvey)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\tVOID *pAd;\n\tCMD_RTPRIV_IOCTL_80211_SURVEY SurveyInfo;\n\n\n\tif (Idx != 0)\n\t\treturn -ENOENT;\n\t/* End of if */\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\t/* get information from driver */\n\tRTMP_DRIVER_80211_SURVEY_GET(pAd, &SurveyInfo);\n\n\t/* return the information to upper layer */\n\tpSurvey->channel = ((CFG80211_CB *)(SurveyInfo.pCfg80211))->pCfg80211_Channels;\n\tpSurvey->filled = SURVEY_INFO_CHANNEL_TIME_BUSY |\n\t\t\t\t\t\tSURVEY_INFO_CHANNEL_TIME_EXT_BUSY;\n\tpSurvey->channel_time_busy = SurveyInfo.ChannelTimeBusy; /* unit: us */\n\tpSurvey->channel_time_ext_busy = SurveyInfo.ChannelTimeExtBusy;\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> busy time = %ld %ld\\n\",\n\t\t\t\t(ULONG)SurveyInfo.ChannelTimeBusy,\n\t\t\t\t(ULONG)SurveyInfo.ChannelTimeExtBusy));\n\treturn 0;\n#else\n\n\treturn -ENOTSUPP;\n#endif /* LINUX_VERSION_CODE */\n} /* End of CFG80211_OpsSurveyGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tCache a PMKID for a BSSID.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tpPmksa\t\t\t- PMKID information\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n\tThis is mostly useful for fullmac devices running firmwares capable of\n\tgenerating the (re) association RSN IE.\n\tIt allows for faster roaming between WPA2 BSSIDs.\n========================================================================\n*/\nstatic int CFG80211_OpsPmksaSet(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN struct cfg80211_pmksa\t\t\t*pPmksa)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tVOID *pAd;\n\tRT_CMD_STA_IOCTL_PMA_SA IoctlPmaSa, *pIoctlPmaSa = &IoctlPmaSa;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tif ((pPmksa->bssid == NULL) || (pPmksa->pmkid == NULL))\n\t\treturn -ENOENT;\n\t/* End of if */\n\n\tpIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_ADD;\n\tpIoctlPmaSa->pBssid = (UCHAR *)pPmksa->bssid;\n\tpIoctlPmaSa->pPmkid = pPmksa->pmkid;\n\n\tRTMP_DRIVER_80211_PMKID_CTRL(pAd, pIoctlPmaSa);\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn 0;\n} /* End of CFG80211_OpsPmksaSet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tDelete a cached PMKID.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\tpPmksa\t\t\t- PMKID information\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsPmksaDel(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev,\n\tIN struct cfg80211_pmksa\t\t\t*pPmksa)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tVOID *pAd;\n\tRT_CMD_STA_IOCTL_PMA_SA IoctlPmaSa, *pIoctlPmaSa = &IoctlPmaSa;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tif ((pPmksa->bssid == NULL) || (pPmksa->pmkid == NULL))\n\t\treturn -ENOENT;\n\t/* End of if */\n\n\tpIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_REMOVE;\n\tpIoctlPmaSa->pBssid = (UCHAR *)pPmksa->bssid;\n\tpIoctlPmaSa->pPmkid = pPmksa->pmkid;\n\n\tRTMP_DRIVER_80211_PMKID_CTRL(pAd, pIoctlPmaSa);\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn 0;\n} /* End of CFG80211_OpsPmksaDel */\n\n\n/*\n========================================================================\nRoutine Description:\n\tFlush a cached PMKID.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpNdev\t\t\t- Network device interface\n\nReturn Value:\n\t0\t\t\t\t- success\n\t-x\t\t\t\t- fail\n\nNote:\n========================================================================\n*/\nstatic int CFG80211_OpsPmksaFlush(\n\tIN struct wiphy\t\t\t\t\t\t*pWiphy,\n\tIN struct net_device\t\t\t\t*pNdev)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tVOID *pAd;\n\tRT_CMD_STA_IOCTL_PMA_SA IoctlPmaSa, *pIoctlPmaSa = &IoctlPmaSa;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> %s ==>\\n\", __FUNCTION__));\n\tMAC80211_PAD_GET(pAd, pWiphy);\n\n\tpIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_FLUSH;\n\tRTMP_DRIVER_80211_PMKID_CTRL(pAd, pIoctlPmaSa);\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn 0;\n} /* End of CFG80211_OpsPmksaFlush */\n#endif /* LINUX_VERSION_CODE */\n\n\n\n\nstruct cfg80211_ops CFG80211_Ops = {\n\t/* set channel for a given wireless interface */\n\t.set_channel\t\t\t\t= CFG80211_OpsChannelSet,\n\t/* change type/configuration of virtual interface */\n\t.change_virtual_intf\t\t= CFG80211_OpsVirtualInfChg,\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\n\t/* request to do a scan */\n\t/*\n\t\tNote: must exist whatever AP or STA mode; Or your kernel will crash\n\t\tin v2.6.38.\n\t*/\n\t.scan\t\t\t\t\t\t= CFG80211_OpsScan,\n#endif /* LINUX_VERSION_CODE */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))\n#ifdef CONFIG_STA_SUPPORT\n\t/* join the specified IBSS (or create if necessary) */\n\t.join_ibss\t\t\t\t\t= CFG80211_OpsIbssJoin,\n\t/* leave the IBSS */\n\t.leave_ibss\t\t\t\t\t= CFG80211_OpsIbssLeave,\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\n\t/* set the transmit power according to the parameters */\n\t.set_tx_power\t\t\t\t= CFG80211_OpsTxPwrSet,\n\t/* store the current TX power into the dbm variable */\n\t.get_tx_power\t\t\t\t= CFG80211_OpsTxPwrGet,\n\t/* configure WLAN power management */\n\t.set_power_mgmt\t\t\t\t= CFG80211_OpsPwrMgmt,\n\t/* get station information for the station identified by @mac */\n\t.get_station\t\t\t\t= CFG80211_OpsStaGet,\n\t/* dump station callback */\n\t.dump_station\t\t\t\t= CFG80211_OpsStaDump,\n\t/* notify that wiphy parameters have changed */\n\t.set_wiphy_params\t\t\t= CFG80211_OpsWiphyParamsSet,\n\t/* add a key with the given parameters */\n\t.add_key\t\t\t\t\t= CFG80211_OpsKeyAdd,\n\t/* get information about the key with the given parameters */\n\t.get_key\t\t\t\t\t= CFG80211_OpsKeyGet,\n\t/* remove a key given the @mac_addr */\n\t.del_key\t\t\t\t\t= CFG80211_OpsKeyDel,\n\t/* set the default key on an interface */\n\t.set_default_key\t\t\t= CFG80211_OpsKeyDefaultSet,\n#ifdef CONFIG_STA_SUPPORT\n\t/* connect to the ESS with the specified parameters */\n\t.connect\t\t\t\t\t= CFG80211_OpsConnect,\n\t/* disconnect from the BSS/ESS */\n\t.disconnect\t\t\t\t\t= CFG80211_OpsDisconnect,\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n\n#ifdef RFKILL_HW_SUPPORT\n\t/* polls the hw rfkill line */\n\t.rfkill_poll\t\t\t\t= CFG80211_OpsRFKill,\n#endif /* RFKILL_HW_SUPPORT */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))\n\t/* get site survey information */\n\t.dump_survey\t\t\t\t= CFG80211_OpsSurveyGet,\n\t/* cache a PMKID for a BSSID */\n\t.set_pmksa\t\t\t\t\t= CFG80211_OpsPmksaSet,\n\t/* delete a cached PMKID */\n\t.del_pmksa\t\t\t\t\t= CFG80211_OpsPmksaDel,\n\t/* flush all cached PMKIDs */\n\t.flush_pmksa\t\t\t\t= CFG80211_OpsPmksaFlush,\n#endif /* LINUX_VERSION_CODE */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))\n\t/*\n\t\tRequest the driver to remain awake on the specified\n\t\tchannel for the specified duration to complete an off-channel\n\t\toperation (e.g., public action frame exchange).\n\t*/\n\t.remain_on_channel\t\t\t= NULL,\n\t/* cancel an on-going remain-on-channel operation */\n\t.cancel_remain_on_channel\t= NULL,\n#if (LINUX_VERSION_CODE == KERNEL_VERSION(2,6,34))\n\t/* transmit an action frame */\n\t.action\t\t\t\t\t\t= NULL,\n#endif /* LINUX_VERSION_CODE */\n#endif /* LINUX_VERSION_CODE */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\t/* configure connection quality monitor RSSI threshold */\n\t.set_cqm_rssi_config\t\t= NULL,\n#endif /* LINUX_VERSION_CODE */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t/* notify driver that a management frame type was registered */\n\t.mgmt_frame_register\t\t= NULL,\n#endif /* LINUX_VERSION_CODE */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))\n\t/* set antenna configuration (tx_ant, rx_ant) on the device */\n\t.set_antenna\t\t\t\t= NULL,\n\t/* get current antenna configuration from device (tx_ant, rx_ant) */\n\t.get_antenna\t\t\t\t= NULL,\n#endif /* LINUX_VERSION_CODE */\n};\n\n\n\n\n/* =========================== Global Function ============================== */\n\n/*\n========================================================================\nRoutine Description:\n\tAllocate a wireless device.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpDev\t\t\t- Generic device interface\n\nReturn Value:\n\twireless device\n\nNote:\n========================================================================\n*/\nstatic struct wireless_dev *CFG80211_WdevAlloc(\n\tIN CFG80211_CB\t\t\t\t\t*pCfg80211_CB,\n\tIN CFG80211_BAND\t\t\t\t*pBandInfo,\n\tIN VOID \t\t\t\t\t\t*pAd,\n\tIN struct device\t\t\t\t*pDev)\n{\n\tstruct wireless_dev *pWdev;\n\tULONG *pPriv;\n\n\n\t/*\n\t * We're trying to have the following memory layout:\n\t *\n\t * +------------------------+\n\t * | struct wiphy\t\t\t|\n\t * +------------------------+\n\t * | pAd pointer\t\t\t|\n\t * +------------------------+\n\t */\n\n\tpWdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);\n\tif (pWdev == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Wireless device allocation fail!\\n\"));\n\t\treturn NULL;\n\t} /* End of if */\n\n\tpWdev->wiphy = wiphy_new(&CFG80211_Ops, sizeof(ULONG *));\n\tif (pWdev->wiphy == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Wiphy device allocation fail!\\n\"));\n\t\tgoto LabelErrWiphyNew;\n\t} /* End of if */\n\n\t/* keep pAd pointer */\n\tpPriv = (ULONG *)(wiphy_priv(pWdev->wiphy));\n\t*pPriv = (ULONG)pAd;\n\n\tset_wiphy_dev(pWdev->wiphy, pDev);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\n\tpWdev->wiphy->max_scan_ssids = pBandInfo->MaxBssTable;\n#endif /* KERNEL_VERSION */\n\n#ifdef CONFIG_AP_SUPPORT\n\tpWdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_AP);\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tpWdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |\n\t\t\t\t\t\t\t       BIT(NL80211_IFTYPE_ADHOC) |\n\t\t\t\t\t\t\t       BIT(NL80211_IFTYPE_MONITOR);\n#endif /* CONFIG_STA_SUPPORT */\n\tpWdev->wiphy->reg_notifier = CFG80211_RegNotifier;\n\n\t/* init channel information */\n\tCFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWdev->wiphy, NULL, NULL);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\n\t/* CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) */\n\tpWdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;\n#endif /* KERNEL_VERSION */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\n\tpWdev->wiphy->cipher_suites = CipherSuites;\n\tpWdev->wiphy->n_cipher_suites = ARRAY_SIZE(CipherSuites);\n#endif /* LINUX_VERSION_CODE */\n\n\tif (wiphy_register(pWdev->wiphy) < 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Register wiphy device fail!\\n\"));\n\t\tgoto LabelErrReg;\n\t} /* End of if */\n\n\treturn pWdev;\n\n LabelErrReg:\n\twiphy_free(pWdev->wiphy);\n\n LabelErrWiphyNew:\n\tos_free_mem(NULL, pWdev);\n\n\treturn NULL;\n} /* End of CFG80211_WdevAlloc */\n\n\n/*\n========================================================================\nRoutine Description:\n\tRegister MAC80211 Module.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpDev\t\t\t- Generic device interface\n\tpNetDev\t\t\t- Network device\n\nReturn Value:\n\tNONE\n\nNote:\n\tpDev != pNetDev\n\t#define SET_NETDEV_DEV(net, pdev)\t((net)->dev.parent = (pdev))\n\n\tCan not use pNetDev to replace pDev; Or kernel panic.\n========================================================================\n*/\nBOOLEAN CFG80211_Register(\n\tIN VOID\t\t\t\t\t\t*pAd,\n\tIN struct device\t\t\t*pDev,\n\tIN struct net_device\t\t*pNetDev)\n{\n\tCFG80211_CB *pCfg80211_CB = NULL;\n\tCFG80211_BAND BandInfo;\n\n\n\t/* allocate MAC80211 structure */\n\tos_alloc_mem(NULL, (UCHAR **)&pCfg80211_CB, sizeof(CFG80211_CB));\n\tif (pCfg80211_CB == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Allocate MAC80211 CB fail!\\n\"));\n\t\treturn FALSE;\n\t} /* End of if */\n\n\t/* allocate wireless device */\n\tRTMP_DRIVER_80211_BANDINFO_GET(pAd, &BandInfo);\n\n\tpCfg80211_CB->pCfg80211_Wdev = \\\n\t\t\t\tCFG80211_WdevAlloc(pCfg80211_CB, &BandInfo, pAd, pDev);\n\tif (pCfg80211_CB->pCfg80211_Wdev == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Allocate Wdev fail!\\n\"));\n\t\tos_free_mem(NULL, pCfg80211_CB);\n\t\treturn FALSE;\n\t} /* End of if */\n\n\t/* bind wireless device with net device */\n#ifdef CONFIG_AP_SUPPORT\n\t/* default we are AP mode */\n\tpCfg80211_CB->pCfg80211_Wdev->iftype = NL80211_IFTYPE_AP;\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* default we are station mode */\n\tpCfg80211_CB->pCfg80211_Wdev->iftype = NL80211_IFTYPE_STATION;\n#endif /* CONFIG_STA_SUPPORT */\n\n\tpNetDev->ieee80211_ptr = pCfg80211_CB->pCfg80211_Wdev;\n\tSET_NETDEV_DEV(pNetDev, wiphy_dev(pCfg80211_CB->pCfg80211_Wdev->wiphy));\n\tpCfg80211_CB->pCfg80211_Wdev->netdev = pNetDev;\n\n#ifdef RFKILL_HW_SUPPORT\n\twiphy_rfkill_start_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy);\n#endif /* RFKILL_HW_SUPPORT */\n\n\tRTMP_DRIVER_80211_CB_SET(pAd, pCfg80211_CB);\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> CFG80211_Register\\n\"));\n\treturn TRUE;\n} /* End of CFG80211_Register */\n\n\n\n\n/* =========================== Local Function =============================== */\n\n/*\n========================================================================\nRoutine Description:\n\tThe driver's regulatory notification callback.\n\nArguments:\n\tpWiphy\t\t\t- Wireless hardware description\n\tpRequest\t\t- Regulatory request\n\nReturn Value:\n\t0\n\nNote:\n========================================================================\n*/\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\nstatic INT32 CFG80211_RegNotifier(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN struct regulatory_request\t*pRequest)\n{\n\tVOID *pAd;\n\tULONG *pPriv;\n\n\n\t/* sanity check */\n\tpPriv = (ULONG *)(wiphy_priv(pWiphy));\n\tpAd = (VOID *)(*pPriv);\n\n\tif (pAd == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"crda> reg notify but pAd = NULL!\"));\n\t\treturn 0;\n\t} /* End of if */\n\n\t/*\n\t\tChange the band settings (PASS scan, IBSS allow, or DFS) in mac80211\n\t\tbased on EEPROM.\n\n\t\tIEEE80211_CHAN_DISABLED: This channel is disabled.\n\t\tIEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted\n\t\t\t\t\ton this channel.\n\t\tIEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.\n\t\tIEEE80211_CHAN_RADAR: Radar detection is required on this channel.\n\t\tIEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel\n\t\t\t\t\tis not permitted.\n\t\tIEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel\n\t\t\t\t\tis not permitted.\n\t*/\n\n\t/*\n\t\tChange regulatory rule here.\n\n\t\tstruct ieee80211_channel {\n\t\t\tenum ieee80211_band band;\n\t\t\tu16 center_freq;\n\t\t\tu8 max_bandwidth;\n\t\t\tu16 hw_value;\n\t\t\tu32 flags;\n\t\t\tint max_antenna_gain;\n\t\t\tint max_power;\n\t\t\tbool beacon_found;\n\t\t\tu32 orig_flags;\n\t\t\tint orig_mag, orig_mpwr;\n\t\t};\n\n\t\tIn mac80211 layer, it will change flags, max_antenna_gain,\n\t\tmax_bandwidth, max_power.\n\t*/\n\n\tswitch(pRequest->initiator)\n\t{\n\t\tcase NL80211_REGDOM_SET_BY_CORE:\n\t\t\t/*\n\t\t\t\tCore queried CRDA for a dynamic world regulatory domain.\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by core: \"));\n\t\t\tbreak;\n\n\t\tcase NL80211_REGDOM_SET_BY_USER:\n\t\t\t/*\n\t\t\t\tUser asked the wireless core to set the regulatory domain.\n\t\t\t\t(when iw, network manager, wpa supplicant, etc.)\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by user: \"));\n\t\t\tbreak;\n\n\t\tcase NL80211_REGDOM_SET_BY_DRIVER:\n\t\t\t/*\n\t\t\t\tA wireless drivers has hinted to the wireless core it thinks\n\t\t\t\tits knows the regulatory domain we should be in.\n\t\t\t\t(when driver initialization, calling regulatory_hint)\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by driver: \"));\n\t\t\tbreak;\n\n\t\tcase NL80211_REGDOM_SET_BY_COUNTRY_IE:\n\t\t\t/*\n\t\t\t\tThe wireless core has received an 802.11 country information\n\t\t\t\telement with regulatory information it thinks we should consider.\n\t\t\t\t(when beacon receive, calling regulatory_hint_11d)\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by country IE: \"));\n\t\t\tbreak;\n\t} /* End of switch */\n\n\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t(\"%c%c\\n\", pRequest->alpha2[0], pRequest->alpha2[1]));\n\n\t/* only follow rules from user */\n\tif (pRequest->initiator == NL80211_REGDOM_SET_BY_USER)\n\t{\n\t\t/* keep Alpha2 and we can re-call the function when interface is up */\n\t\tCMD_RTPRIV_IOCTL_80211_REG_NOTIFY RegInfo;\n\n\t\tRegInfo.Alpha2[0] = pRequest->alpha2[0];\n\t\tRegInfo.Alpha2[1] = pRequest->alpha2[1];\n\t\tRegInfo.pWiphy = pWiphy;\n\n\t\tRTMP_DRIVER_80211_REG_NOTIFY(pAd, &RegInfo);\n\t} /* End of if */\n\n\treturn 0;\n} /* End of CFG80211_RegNotifier */\n\n#else\n\nstatic INT32 CFG80211_RegNotifier(\n\tIN struct wiphy\t\t\t\t\t*pWiphy,\n\tIN enum reg_set_by\t\t\t\tRequest)\n{\n\tstruct device *pDev = pWiphy->dev.parent;\n\tstruct net_device *pNetDev = dev_get_drvdata(pDev);\n\tVOID *pAd = (VOID *)RTMP_OS_NETDEV_GET_PRIV(pNetDev);\n\tUINT32 ReqType = Request;\n\n\n\t/* sanity check */\n\tif (pAd == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"crda> reg notify but pAd = NULL!\"));\n\t\treturn 0;\n\t} /* End of if */\n\n\t/*\n\t\tChange the band settings (PASS scan, IBSS allow, or DFS) in mac80211\n\t\tbased on EEPROM.\n\n\t\tIEEE80211_CHAN_DISABLED: This channel is disabled.\n\t\tIEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted\n\t\t\t\t\ton this channel.\n\t\tIEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.\n\t\tIEEE80211_CHAN_RADAR: Radar detection is required on this channel.\n\t\tIEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel\n\t\t\t\t\tis not permitted.\n\t\tIEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel\n\t\t\t\t\tis not permitted.\n\t*/\n\n\t/*\n\t\tChange regulatory rule here.\n\n\t\tstruct ieee80211_channel {\n\t\t\tenum ieee80211_band band;\n\t\t\tu16 center_freq;\n\t\t\tu8 max_bandwidth;\n\t\t\tu16 hw_value;\n\t\t\tu32 flags;\n\t\t\tint max_antenna_gain;\n\t\t\tint max_power;\n\t\t\tbool beacon_found;\n\t\t\tu32 orig_flags;\n\t\t\tint orig_mag, orig_mpwr;\n\t\t};\n\n\t\tIn mac80211 layer, it will change flags, max_antenna_gain,\n\t\tmax_bandwidth, max_power.\n\t*/\n\n\tswitch(ReqType)\n\t{\n\t\tcase REGDOM_SET_BY_CORE:\n\t\t\t/*\n\t\t\t\tCore queried CRDA for a dynamic world regulatory domain.\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by core: \"));\n\t\t\tbreak;\n\n\t\tcase REGDOM_SET_BY_USER:\n\t\t\t/*\n\t\t\t\tUser asked the wireless core to set the regulatory domain.\n\t\t\t\t(when iw, network manager, wpa supplicant, etc.)\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by user: \"));\n\t\t\tbreak;\n\n\t\tcase REGDOM_SET_BY_DRIVER:\n\t\t\t/*\n\t\t\t\tA wireless drivers has hinted to the wireless core it thinks\n\t\t\t\tits knows the regulatory domain we should be in.\n\t\t\t\t(when driver initialization, calling regulatory_hint)\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by driver: \"));\n\t\t\tbreak;\n\n\t\tcase REGDOM_SET_BY_COUNTRY_IE:\n\t\t\t/*\n\t\t\t\tThe wireless core has received an 802.11 country information\n\t\t\t\telement with regulatory information it thinks we should consider.\n\t\t\t\t(when beacon receive, calling regulatory_hint_11d)\n\t\t\t*/\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> requlation requestion by country IE: \"));\n\t\t\tbreak;\n\t} /* End of switch */\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"00\\n\"));\n\n\t/* only follow rules from user */\n\tif (ReqType == REGDOM_SET_BY_USER)\n\t{\n\t\t/* keep Alpha2 and we can re-call the function when interface is up */\n\t\tCMD_RTPRIV_IOCTL_80211_REG_NOTIFY RegInfo;\n\n\t\tRegInfo.Alpha2[0] = '0';\n\t\tRegInfo.Alpha2[1] = '0';\n\t\tRegInfo.pWiphy = pWiphy;\n\n\t\tRTMP_DRIVER_80211_REG_NOTIFY(pAd, &RegInfo);\n\t} /* End of if */\n\n\treturn 0;\n} /* End of CFG80211_RegNotifier */\n#endif /* LINUX_VERSION_CODE */\n\n\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n\n/* End of crda.c */\n"
  },
  {
    "path": "src/os/linux/cfg80211drv.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll related CFG80211 function body.\n\n\tHistory:\n\n***************************************************************************/\n\n#ifdef RT_CFG80211_SUPPORT\n\n#include \"rt_config.h\"\n\n#define RT_CFG80211_DEBUG /* debug use */\n#define CFG80211CB\t\t\t(pAd->pCfg80211_CB)\n\n#ifdef RT_CFG80211_DEBUG\n#define CFG80211DBG(__Flg, __pMsg)\t\tDBGPRINT(__Flg, __pMsg)\n#else\n#define CFG80211DBG(__Flg, __pMsg)\n#endif /* RT_CFG80211_DEBUG */\n\n\n\n\nINT CFG80211DRV_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tINT\t\t\t\t\t\tcmd,\n\tIN\tUSHORT\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\n\n\tswitch(cmd)\n\t{\n\t\tcase CMD_RTPRIV_IOCTL_80211_START:\n\t\tcase CMD_RTPRIV_IOCTL_80211_END:\n\t\t\t/* nothing to do */\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CB_GET:\n\t\t\t*(VOID **)pData = (VOID *)(pAd->pCfg80211_CB);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CB_SET:\n\t\t\tpAd->pCfg80211_CB = pData;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CHAN_SET:\n\t\t\tif (CFG80211DRV_OpsSetChannel(pAd, pData) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_VIF_CHG:\n\t\t\tif (CFG80211DRV_OpsChgVirtualInf(pAd, pData, Data) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_SCAN:\n\t\t\tCFG80211DRV_OpsScan(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_IBSS_JOIN:\n\t\t\tCFG80211DRV_OpsJoinIbss(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_STA_LEAVE:\n\t\t\tCFG80211DRV_OpsLeave(pAd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_STA_GET:\n\t\t\tif (CFG80211DRV_StaGet(pAd, pData) != TRUE)\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_KEY_ADD:\n\t\t\tCFG80211DRV_KeyAdd(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET:\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tpAd->StaCfg.DefaultKeyId = Data; /* base 0 */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CONNECT_TO:\n\t\t\tCFG80211DRV_Connect(pAd, pData);\n\t\t\tbreak;\n\n#ifdef RFKILL_HW_SUPPORT\n\t\tcase CMD_RTPRIV_IOCTL_80211_RFKILL:\n\t\t{\n\t\t\tUINT32 data = 0;\n\t\t\tBOOLEAN active;\n\n\t\t\t/* Read GPIO pin2 as Hardware controlled radio state */\n\t\t\tRTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);\n\t\t\tactive = !!(data & 0x04);\n\n\t\t\tif (!active)\n\t\t\t{\n\t\t\t\tRTMPSetLED(pAd, LED_RADIO_OFF);\n\t\t\t\t*(UINT8 *)pData = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\t*(UINT8 *)pData = 1;\n\t\t}\n\t\t\tbreak;\n#endif /* RFKILL_HW_SUPPORT */\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO:\n\t\t\tCFG80211DRV_RegNotify(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_UNREGISTER:\n\t\t\tCFG80211_UnRegister(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_BANDINFO_GET:\n\t\t{\n\t\t\tCFG80211_BAND *pBandInfo = (CFG80211_BAND *)pData;\n\t\t\tCFG80211_BANDINFO_FILL(pAd, pBandInfo);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_SURVEY_GET:\n\t\t\tCFG80211DRV_SurveyGet(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET:\n\t\t\tCFG80211DRV_OpsExtraIesSet(pAd);\t\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_SET: \t\t\n\t\t\tCFG80211DRV_OpsRemainOnChannel(pAd, pData, Data);\t\t\t\t\t\n\t\t\tbreak;\t\t\t\t\n\t\tcase CMD_RTPRIV_IOCTL_80211_CANCEL_REMAIN_ON_CHAN_SET:\n\t\t\tCFG80211DRV_OpsCancelRemainOnChannel(pAd, Data);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG:\n\t\t\tif (Data)\n\t\t\t\tpAd->Cfg80211ProbeReqCount++;\n\t\t\telse \n\t\t\t{\n\t\t\t\tpAd->Cfg80211ProbeReqCount--;\t\n\t\t\t}\n\t\n\t\t\tif (pAd->Cfg80211ProbeReqCount > 0)\n\t\t\t\tpAd->Cfg80211RegisterProbeReqFrame = TRUE;\n\t\t\telse \n\t\t\t\tpAd->Cfg80211RegisterProbeReqFrame = FALSE;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pAd->Cfg80211RegisterProbeReqFrame=%d[%d]\\n\",pAd->Cfg80211RegisterProbeReqFrame, pAd->Cfg80211ProbeReqCount));\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG:\n\t\t\tif (Data)\n\t\t\t\tpAd->Cfg80211ActionCount++;\n\t\t\telse\n\t\t\t\tpAd->Cfg80211ActionCount--;\n\n\t\t\tif (pAd->Cfg80211ActionCount > 0)\n\t\t\t\tpAd->Cfg80211RegisterActionFrame = TRUE;\n\t\t\telse\n\t\t\t\tpAd->Cfg80211RegisterActionFrame = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pAd->Cfg80211RegisterActionFrame=%d [%d]\\n\",pAd->Cfg80211RegisterActionFrame, pAd->Cfg80211ActionCount));\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK:\n\t\t\t//pAd->CommonCfg.CentralChannel = Data;\n\t\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK %d\\n\", Data));\n\t\t\tif (pAd->CommonCfg.Channel != Data)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.Channel= Data;\n\t\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND:\n\t\t\t/* send a managment frame */\n\t\t\tpAd->TxStatusInUsed = TRUE;\n\t\t\tpAd->TxStatusSeq = pAd->Sequence;\n\t\t\tif (pData != NULL) \n\t\t\t{\n#ifdef WFD_SUPPORT\n\t\t\t\tif (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t\t\t\t{\n\t\t\t\t\tPP2P_PUBLIC_FRAME\tpFrame = (PP2P_PUBLIC_FRAME)pData;\n\t\t\t\t\tULONG\tWfdIeLen = 0, WfdIeBitmap = 0;\n\t\t\t\t\n\t\t\t\t\tswitch (pFrame->p80211Header.FC.SubType) \n\t\t\t\t\t{\n\t\t\t\t\t\tcase SUBTYPE_BEACON:\n\t\t\t\t\t\tcase SUBTYPE_PROBE_REQ:\n\t\t\t\t\t\tcase SUBTYPE_ASSOC_REQ:\n\t\t\t\t\t\tcase SUBTYPE_REASSOC_REQ:\n\t\t\t\t\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\t\t\t\t\tbreak;\t\n\n\t\t\t\t\t\tcase SUBTYPE_ASSOC_RSP:\n\t\t\t\t\t\tcase SUBTYPE_REASSOC_RSP:\n\t\t\t\t\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\t\t\t\t\t\tbreak;\t\n\n\t\t\t\t\t\tcase SUBTYPE_PROBE_RSP:\n\t\t\t\t\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\t\t\t\t\t\tbreak;\t\n\n\t\t\t\t\t\tcase SUBTYPE_ACTION:\n\t\t\t\t\t\t\tif ((pFrame->Category == CATEGORY_PUBLIC) &&\n\t\t\t\t\t\t\t\t(pFrame->Action == ACTION_WIFI_DIRECT))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tswitch (pFrame->Subtype) \n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase GO_NEGOCIATION_REQ:\n\t\t\t\t\t\t\t\t\tcase GO_NEGOCIATION_RSP:\n\t\t\t\t\t\t\t\t\tcase GO_NEGOCIATION_CONFIRM:\n\t\t\t\t\t\t\t\t\tcase P2P_PROVISION_REQ:\n\t\t\t\t\t\t\t\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t\t\t\t\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tcase P2P_INVITE_REQ:\n\t\t\t\t\t\t\t\t\tcase P2P_INVITE_RSP:\n\t\t\t\t\t\t\t\t\tcase P2P_PROVISION_RSP:\n\t\t\t\t\t\t\t\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t\t\t\t\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tif (WfdIeBitmap > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tPUCHAR\t\tpOutBuffer;\n\t\t\t\t\t\tNDIS_STATUS   NStatus;\n\t\t\t\t\t\t\n\t\t\t\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\t\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmemcpy(pOutBuffer, pData, Data);\n\t\t\t\t\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pOutBuffer + Data, &WfdIeLen);\n\t\t\t\t\t\t\tData += WfdIeLen;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (pAd->pTxStatusBuf != NULL)\n\t\t\t\t\t\t\t\tos_free_mem(NULL, pAd->pTxStatusBuf);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pAd->pTxStatusBuf, Data);\n\t\t\t\t\t\t\tif (pAd->pTxStatusBuf != NULL)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tNdisCopyMemory(pAd->pTxStatusBuf, pOutBuffer, Data);\n\t\t\t\t\t\t\t\tpAd->TxStatusBufLen = Data;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"YF_TX_STATUS: MEM ALLOC ERROR\\n\"));\n\t\t\t\t\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, Data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n#endif /* WFD_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tif (pAd->pTxStatusBuf != NULL)\n\t\t\t\t\t\tos_free_mem(NULL, pAd->pTxStatusBuf);\n\t\t\n\t\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pAd->pTxStatusBuf, Data);\n\t\t\t\t\tif (pAd->pTxStatusBuf != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisCopyMemory(pAd->pTxStatusBuf, pData, Data);\n\t\t\t\t\t\tpAd->TxStatusBufLen = Data;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"YF_TX_STATUS: MEM ALLOC ERROR\\n\"));\n\t\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t\t}\n\t\t\t\t\t// pAd->pTxStatusBuf\n\t\t\t\t\t// pAd->TxStatusBufLen = Data\n\t\t\t\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"YF_TX_STATUS: send %d\\n\", pAd->TxStatusSeq));\n\t\t\t\t\tMiniportMMRequest(pAd, 0, pData, Data);\n\t\t\t\t\t//DBGPRINT(RT_DEBUG_TRACE, (\"YF_TX_STATUS: sent %d\\n\", pAd->TxStatusSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_DUR_TIMER_INIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ROC TIMER INIT\\n\"));\n\t\t\tRTMPInitTimer(pAd, &pAd->Cfg80211RemainOnChannelDurationTimer, GET_TIMER_FUNCTION(RemainOnChannelTimeout), pAd, FALSE);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET: %d\\n\", Data));\n\t\t\tUINT32 *pChanList = (UINT32 *) pData;\n\n\t\t\tif (pChanList != NULL) \n\t\t\t{\n\t\t\t\n\t\t\t\tif (pAd->pCfg80211ChanList != NULL)\n\t\t\t\t\tos_free_mem(NULL, pAd->pCfg80211ChanList);\n\n\t\t\t\tos_alloc_mem(NULL, (UINT32 **)&pAd->pCfg80211ChanList, sizeof(UINT32 *) * Data);\n\t\t\t\tif (pAd->pCfg80211ChanList != NULL)\n\t\t\t\t{\n\t\t\t\t\tNdisCopyMemory(pAd->pCfg80211ChanList, pChanList, sizeof(UINT32 *) * Data);\n\t\t\t\t\tpAd->Cfg80211ChanListLan = Data;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_BEACON_SET:\n\t\t\tCFG80211DRV_OpsBeaconSet(pAd, pData, 0);\t\t\t\n\t\t\tbreak;\n\t\t\n\t\tcase CMD_RTPRIV_IOCTL_80211_BEACON_ADD:\n\t\t\tCFG80211DRV_OpsBeaconSet(pAd, pData, 1);\n\t\t\tbreak;\n\t\t\t\n\t\tcase CMD_RTPRIV_IOCTL_80211_BEACON_DEL:\n#ifdef WFD_SUPPORT\n\t\t\tpAd->StaCfg.WfdCfg.bSuppGoOn = FALSE;\n#endif /* WFD_SUPPORT */\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM:\n\t\t\tCFG80211DRV_OpsChangeBssParm(pAd, pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP:\n\t\t\tif (pData != NULL)\n\t\t\t{\n\t\t\t\tif (pAd->pCfg80211RrobeRsp != NULL)\n\t\t\t\t\tos_free_mem(NULL, pAd->pCfg80211RrobeRsp);\n\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pAd->pCfg80211RrobeRsp, Data);\n\t\t\t\tif (pAd->pCfg80211RrobeRsp != NULL)\n\t\t\t\t{\n\t\t\t\t\tNdisCopyMemory(pAd->pCfg80211RrobeRsp, pData, Data);\n\t\t\t\t\tpAd->Cfg80211AssocRspLen = Data;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"YF_AP: MEM ALLOC ERROR\\n\"));\n\t\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_PORT_SECURED:\n\t\t\tCFG80211_StaPortSecured(pAd, pData, Data);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_80211_AP_STA_DEL:\n\t\t\tCFG80211_ApStaDel(pAd, pData);\n\t\t\tbreak;\n\t\tcase CMD_RTPRIV_IOCTL_80211_BITRATE_SET:\n\t\t//\tpAd->CommonCfg.PhyMode = PHY_11AN_MIXED;\n\t\t//\tRTMPSetPhyMode(pAd,  pAd->CommonCfg.PhyMode);\n\t\t\t//Set_WirelessMode_Proc(pAd, PHY_11AGN_MIXED);\n\t\t\tbreak;\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\n\t\tcase CMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT:\n\t\t\tCFG80211_SendWirelessEvent(pAd, pData);\n\t\t\tbreak;\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\t\tdefault:\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nstatic VOID CFG80211DRV_DisableApInterface(\n        VOID                                            *pAdOrg)\n{\n\tUINT32 Value;\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = FALSE;\n\n        /* Disable pre-tbtt interrupt */\n        RTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);\n        Value &=0xe;\n        RTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);\n\n        if (!INFRA_ON(pAd))\n        {\n                /* Disable piggyback */\n                RTMPSetPiggyBack(pAd, FALSE);\n                AsicUpdateProtect(pAd, 0,  (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);\n\n        }\n\n        if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n        {\n                /*RTMP_ASIC_INTERRUPT_DISABLE(pAd); */\n                AsicDisableSync(pAd);\n\n#ifdef LED_CONTROL_SUPPORT\n                /* Set LED */\n                RTMPSetLED(pAd, LED_LINK_DOWN);\n#endif /* LED_CONTROL_SUPPORT */\n        }\n\n#ifdef RTMP_MAC_USB\n        /* For RT2870, we need to clear the beacon sync buffer. */\n        RTUSBBssBeaconExit(pAd);\n#endif /* RTMP_MAC_USB */\n\t\n}\n\nVOID CFG80211DRV_OpsChangeBssParm(\n        VOID                                            *pAdOrg,\n        VOID                                            *pData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_BSS_PARM *pBssInfo;\n\tBOOLEAN TxPreamble;\n\n\tCFG80211DBG(RT_DEBUG_TRACE, (\"%s\\n\", __FUNCTION__));\n\n\tpBssInfo = (CMD_RTPRIV_IOCTL_80211_BSS_PARM *)pData;\t\n\n\t/* Short Preamble */\n\tif (pBssInfo->use_short_preamble != -1)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_TRACE, (\"%s: ShortPreamble %d\\n\", __FUNCTION__, pBssInfo->use_short_preamble));\n        \tpAd->CommonCfg.TxPreamble = (pBssInfo->use_short_preamble == 0 ? Rt802_11PreambleLong : Rt802_11PreambleShort);\t\n\t\tTxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1);\n\t\tMlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble);\t\t\t\n\t}\n\t\n\t/* CTS Protection */\n\tif (pBssInfo->use_cts_prot != -1)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_TRACE, (\"%s: CTS Protection %d\\n\", __FUNCTION__, pBssInfo->use_cts_prot));\n\t}\n\t\n\t/* Short Slot */\n\tif (pBssInfo->use_short_slot_time != -1)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_TRACE, (\"%s: Short Slot %d\\n\", __FUNCTION__, pBssInfo->use_short_slot_time));\n\t}\n}\n\nBOOLEAN CFG80211DRV_OpsSetChannel(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_CHAN *pChan;\n\tUINT8 ChanId;\n\tUINT8 IfType;\n\tUINT8 ChannelType;\n\tSTRING ChStr[5] = { 0 };\n#ifdef DOT11_N_SUPPORT\n\tUCHAR BW_Old;\n\tBOOLEAN FlgIsChanged;\n#endif /* DOT11_N_SUPPORT */\n\n\n\t/* init */\n\tpChan = (CMD_RTPRIV_IOCTL_80211_CHAN *)pData;\n\tChanId = pChan->ChanId;\n\tIfType = pChan->IfType;\n\tChannelType = pChan->ChanType;\n\n#ifdef DOT11_N_SUPPORT\n\tif (IfType != RT_CMD_80211_IFTYPE_MONITOR)\n\t{\n\t\t/* get channel BW */\n\t\tFlgIsChanged = FALSE;\n\t\tBW_Old = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\t\n\t\t/* set to new channel BW */\n\t\tif (ChannelType == RT_CMD_80211_CHANTYPE_HT20)\n\t\t{\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;\n\t\t\tFlgIsChanged = TRUE;\n\t\t}\n\t\telse if ((ChannelType == RT_CMD_80211_CHANTYPE_HT40MINUS) ||\n\t\t\t\t(ChannelType == RT_CMD_80211_CHANTYPE_HT40PLUS))\n\t\t{\n\t\t\t/* not support NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS */\n\t\t\t/* i.e. primary channel = 36, secondary channel must be 40 */\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;\n\t\t\tFlgIsChanged = TRUE;\n\t\t} /* End of if */\n\t\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> New BW = %d\\n\",\n\t\t\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW));\n\t\n\t\t/* change HT/non-HT mode (do NOT change wireless mode here) */\n\t\tif (((ChannelType == RT_CMD_80211_CHANTYPE_NOHT) &&\n\t\t\t(pAd->CommonCfg.HT_Disable == 0)) ||\n\t\t\t((ChannelType != RT_CMD_80211_CHANTYPE_NOHT) &&\n\t\t\t(pAd->CommonCfg.HT_Disable == 1)))\n\t\t{\n\t\t\tif (ChannelType == RT_CMD_80211_CHANTYPE_NOHT)\n\t\t\t\tpAd->CommonCfg.HT_Disable = 1;\n\t\t\telse\n\t\t\t\tpAd->CommonCfg.HT_Disable = 0;\n\t\t\t/* End of if */\n\t\n\t\t\tFlgIsChanged = TRUE;\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> HT Disable = %d\\n\",\n\t\t\t\t\t\tpAd->CommonCfg.HT_Disable));\n\t\t} /* End of if */\n\t}\n\telse\n\t{\n\t\t/* for monitor mode */\n\t\tFlgIsChanged = TRUE;\n\t\tpAd->CommonCfg.HT_Disable = 0;\n\t\tpAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;\n\t} /* End of if */\n\n\tif (FlgIsChanged == TRUE)\n\t\tSetCommonHT(pAd);\n\t/* End of if */\n#endif /* DOT11_N_SUPPORT */\n\n\t/* switch to the channel */\n\tsprintf(ChStr, \"%d\", ChanId);\n\tif (Set_Channel_Proc(pAd, ChStr) == FALSE)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> Change channel fail!\\n\"));\n\t} /* End of if */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef DOT11_N_SUPPORT\n\tif ((IfType == RT_CMD_80211_IFTYPE_STATION) && (FlgIsChanged == TRUE))\n\t{\n\t\t/*\n\t\t\t1. Station mode;\n\t\t\t2. New BW settings is 20MHz but current BW is not 20MHz;\n\t\t\t3. New BW settings is 40MHz but current BW is 20MHz;\n\n\t\t\tRe-connect to the AP due to BW 20/40 or HT/non-HT change.\n\t\t*/\n\t\tSet_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid);\n\t} /* End of if */\n#endif /* DOT11_N_SUPPORT */\n\n\tif (IfType == RT_CMD_80211_IFTYPE_ADHOC)\n\t{\n\t\t/* update IBSS beacon */\n\t\tMlmeUpdateTxRates(pAd, FALSE, 0);\n\t\tMakeIbssBeacon(pAd);\n\t\tAsicEnableIbssSync(pAd);\n\n\t\tSet_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid);\n\t} /* End of if */\n\n\tif (IfType == RT_CMD_80211_IFTYPE_MONITOR)\n\t{\n\t\t/* reset monitor mode in the new channel */\n\t\tSet_NetworkType_Proc(pAd, \"Monitor\");\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, pChan->MonFilterFlag);\n\t} /* End of if */\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_OpsChgVirtualInf(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pFlgFilter,\n\tUINT8\t\t\t\t\t\tIfType)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tUINT32 FlgFilter = *(UINT32 *)pFlgFilter;\n\n\n\t/* change type */\n\tif (IfType == RT_CMD_80211_IFTYPE_ADHOC)\n\t\tSet_NetworkType_Proc(pAd, \"Adhoc\");\n\telse if (IfType == RT_CMD_80211_IFTYPE_STATION)\n\t\tSet_NetworkType_Proc(pAd, \"Infra\");\n\telse if (IfType == RT_CMD_80211_IFTYPE_MONITOR)\n\t{\n\t\t/* set packet filter */\n\t\tSet_NetworkType_Proc(pAd, \"Monitor\");\n\n\t\tif (FlgFilter != 0)\n\t\t{\n\t\t\tUINT32 Filter;\n\n\n\t\t\tRTMP_IO_READ32(pAd, RX_FILTR_CFG, &Filter);\n\n\t\t\tif ((FlgFilter & RT_CMD_80211_FILTER_FCSFAIL) == \\\n\t\t\t\t\t\t\t\t\t\t\t\tRT_CMD_80211_FILTER_FCSFAIL)\n\t\t\t{\n\t\t\t\tFilter = Filter & (~0x01);\n\t\t\t}\n\t\t\telse\n\t\t\t\tFilter = Filter | 0x01;\n\t\t\t/* End of if */\n\t\n\t\t\tif ((FlgFilter & RT_CMD_80211_FILTER_PLCPFAIL) == \\\n\t\t\t\t\t\t\t\t\t\t\t\tRT_CMD_80211_FILTER_PLCPFAIL)\n\t\t\t{\n\t\t\t\tFilter = Filter & (~0x02);\n\t\t\t}\n\t\t\telse\n\t\t\t\tFilter = Filter | 0x02;\n\t\t\t/* End of if */\n\t\n\t\t\tif ((FlgFilter & RT_CMD_80211_FILTER_CONTROL) == \\\n\t\t\t\t\t\t\t\t\t\t\t\tRT_CMD_80211_FILTER_CONTROL)\n\t\t\t{\n\t\t\t\tFilter = Filter & (~0xFF00);\n\t\t\t}\n\t\t\telse\n\t\t\t\tFilter = Filter | 0xFF00;\n\t\t\t/* End of if */\n\t\n\t\t\tif ((FlgFilter & RT_CMD_80211_FILTER_OTHER_BSS) == \\\n\t\t\t\t\t\t\t\t\t\t\t\tRT_CMD_80211_FILTER_OTHER_BSS)\n\t\t\t{\n\t\t\t\tFilter = Filter & (~0x08);\n\t\t\t}\n\t\t\telse\n\t\t\t\tFilter = Filter | 0x08;\n\t\t\t/* End of if */\n\n\t\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Filter);\n\t\t\t*(UINT32 *)pFlgFilter = Filter;\n\t\t} /* End of if */\n\n\t\treturn TRUE; /* not need to set SSID */\n\t} /* End of if */\n\n\tpAd->StaCfg.bAutoReconnect = TRUE;\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> SSID = %s\\n\", pAd->CommonCfg.Ssid));\n\tSet_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid);\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_OpsScan(\n\tVOID\t\t\t\t\t\t*pAdOrg)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\n\n\tif (pAd->FlgCfg80211Scanning == TRUE)\n\t\treturn FALSE; /* scanning */\n\t/* End of if */\n\n\t/* do scan */\n\tpAd->FlgCfg80211Scanning = TRUE;\n\treturn TRUE;\n}\n\n/* REF: ap_connect.c ApMakeBssBeacon */\nBOOLEAN CFG80211DRV_OpsBeaconSet(\n        VOID                                            *pAdOrg,\n        VOID                                            *pData,\n\tBOOLEAN                                          isAdd)\n{\n\tCFG80211DBG(RT_DEBUG_TRACE, (\"80211> CFG80211DRV_OpsBeaconSet ==> %d\\n\", isAdd));\n        PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n        CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon;\n        PTXWI_STRUC    pTxWI = &pAd->BeaconTxWI;\n        HTTRANSMIT_SETTING      BeaconTransmit;   /* MGMT frame PHY rate setting when operatin at Ht rate. */\n        BCN_TIME_CFG_STRUC csr9;\n        UCHAR  *ptr;\n        UINT  i;\n        UINT32 longValue;\n        UINT8 TXWISize = pAd->chipCap.TXWISize;\n\tUINT32 rx_filter_flag;\n\tBOOLEAN TxPreamble, SpectrumMgmt = FALSE;\n\tBOOLEAN\tbWmmCapable = FALSE;\n\tUCHAR\tBBPR1 = 0, BBPR3 = 0;\n\tINT idx;\n\tULONG offset;\n\n\tCFG80211DBG(RT_DEBUG_TRACE, (\"80211> CFG80211DRV_OpsBeaconSet ==> \\n\"));\n\tpBeacon = (CMD_RTPRIV_IOCTL_80211_BEACON *)pData;\n\n#ifdef WFD_SUPPORT\n\tif (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t{\n\t\tULONG TmpLen, WfdIeBitmap;\n\n\t\tptr = pBeacon->beacon + pBeacon->beacon_len;\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &TmpLen);\n\t\tpBeacon->beacon_len += TmpLen;\n\t}\n#endif /* WFD_SUPPORT */\n\n\tif (isAdd)\n\t{\n\t\trx_filter_flag = APNORMAL;\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);     /* enable RX of DMA block */\n\t\n\t\tpAd->ApCfg.BssidNum = 1;\n\t\tpAd->MacTab.MsduLifeTime = 20; /* default 5 seconds */\n\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE;\n\n#ifdef INF_AMAZON_SE\n\t\tprintk(\"YF DEBUG: INF_AMAZON_SE\\n\");\n\t\tfor (i = 0; i < NUM_OF_TX_RING; i++)\n\t\t{\n\t\t\tpAd->BulkOutDataSizeLimit[i]=24576;\n\t\t}\n#endif /* INF_AMAZON_SE  */\n\t\n\t\tAsicDisableSync(pAd);\n\n\t\tif (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)\n\t\t{\n\t\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11AN_MIXED;\n\t\t\telse\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BGN_MIXED;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->CommonCfg.Channel > 14)\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11A;\n\t\t\telse\n\t\t\t\tpAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BG_MIXED;\n\t\t}\n\n\t\tTxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1);\t\n\t}\n\n\tPMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];\n\n\tconst UCHAR *ssid_ie = NULL;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))\n\tssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pBeacon->beacon+36, pBeacon->beacon_len-36);\n#endif\n\tNdisZeroMemory(pMbss->Ssid, pMbss->SsidLen);\n\tif (ssid_ie == NULL) \n\t{\n\t\tprintk(\"YF Debug: SSID Not Found In Packet\\n\");\n\t\tNdisMoveMemory(pMbss->Ssid, \"P2P_Linux_AP\", 12);\n\t\tpMbss->SsidLen = 12;\n\t}\n\telse\n\t{\n\t\tpMbss->SsidLen = ssid_ie[1];\n\t\tNdisCopyMemory(pMbss->Ssid, ssid_ie+2, pMbss->SsidLen);\n\t\tprintk(\"YF Debug: SSID: %s, %d\\n\", pMbss->Ssid, pMbss->SsidLen);\n\t}\n\t\n\tif (isAdd)\n\t{\n\t\t//if (pMbss->bWmmCapable)\n\t\t//{\n        \t\tbWmmCapable = FALSE;\n\t\t\tpMbss->bWmmCapable = FALSE;\n\t\t//}\n\n\t\tpMbss->MSSIDDev = pAd->net_dev;\n\t\tCOPY_MAC_ADDR(pMbss->Bssid, pAd->CurrentAddress);\n\t\tprintk(\"AP BSSID %02x:%02x:%02x:%02x:%02x:%02x\\n\", PRINT_MAC(pAd->CurrentAddress));\n\t\t\n\t\t/* GO always use WPA2PSK / AES */\n\t\tpMbss->AuthMode = Ndis802_11AuthModeWPA2PSK;\n \t\tpMbss->WepStatus = Ndis802_11Encryption3Enabled;\n\t\tpMbss->WscSecurityMode = WPA2PSKAES;\n\t\tpMbss->GroupKeyWepStatus = pMbss->WepStatus;\n\t\tpMbss->CapabilityInfo =\n\t\t\tCAP_GENERATE(1, 0, (pMbss->WepStatus != Ndis802_11EncryptionDisabled), TxPreamble, pAd->CommonCfg.bUseShortSlotTime, SpectrumMgmt);\n\n\t\tRTMPMakeRSNIE(pAd, Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled, MAIN_MBSSID);\n\n#ifdef DOT11_N_SUPPORT\n\t\tRTMPSetPhyMode(pAd,  pAd->CommonCfg.PhyMode);\n\t\tSetCommonHT(pAd);\n\n\t\tif ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->Antenna.field.TxPath == 2))\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);\n\t\t\tBBPR1 &= (~0x18);\n\t\t\tBBPR1 |= 0x10;\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);\n\t\t\tBBPR1 &= (~0x18);\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);\n\t\t}\n\t\n\t\t/* Receiver Antenna selection, write to BBP R3(bit4:3) */\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);\n\t\tBBPR3 &= (~0x18);\n\t\tif(pAd->Antenna.field.RxPath == 3)\n\t\t{\n\t\t\tBBPR3 |= (0x10);\n\t\t}\n\t\telse if(pAd->Antenna.field.RxPath == 2)\n\t\t{\n\t\t\tBBPR3 |= (0x8);\n\t\t}\n\t\telse if(pAd->Antenna.field.RxPath == 1)\n\t\t{\n\t\t\tBBPR3 |= (0x0);\n\t\t}\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);\n\n\t\tif(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t{\n\t\t\tif ((pAd->CommonCfg.PhyMode > PHY_11G) || bWmmCapable)\n\t\t\t{\n\t\t\t\t/* EDCA parameters used for AP's own transmission */\n\t\t\t\tpAd->CommonCfg.APEdcaParm.bValid = TRUE;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;\n\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;\n\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;\n\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Txop[0]  = 0;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Txop[1]  = 0;\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Txop[2]  = 94;\t/*96; */\n\t\t\t\tpAd->CommonCfg.APEdcaParm.Txop[3]  = 47;\t/*48; */\n\t\t\t\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n\n\t\t\t\t/* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */\n\t\t\t\tpAd->ApCfg.BssEdcaParm.bValid = TRUE;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[0] = 3;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[1] = 7;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[2] = 2;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Aifsn[3] = 2;\n\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[0] = 4;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[1] = 4;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[2] = 3;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmin[3] = 2;\n\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[0] = 10;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[1] = 10;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[2] = 4;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Cwmax[3] = 3;\n\t\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Txop[0]  = 0;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Txop[1]  = 0;\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Txop[2]  = 94;\t/*96; */\n\t\t\t\tpAd->ApCfg.BssEdcaParm.Txop[3]  = 47;\t/*48; */\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAsicSetEdcaParm(pAd, NULL);\n\t\t\t}\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)\n\t\t{\n\t\t\t/* Patch UI */\n\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = BW_20;\n\t\t}\n\n\t\t/* init */\n\t\tif (pAd->CommonCfg.bRdg)\n\t\t{\t\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\tAsicEnableRDG(pAd);\n\t\t}\n\t\telse\t\n\t\t{\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);\n\t\t\tAsicDisableRDG(pAd);\n\t\t}\t\n#endif /* DOT11_N_SUPPORT */\n\n\t\t//AsicSetBssid(pAd, pAd->CurrentAddress); \n\t\tAsicSetMcastWC(pAd);\n\t\t\n\t\t/* In AP mode,  First WCID Table in ASIC will never be used. To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. */\n\t\t/* p.s ASIC use all 0xff as termination of WCID table search. */\n\t\tRTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);\n\t\tRTMP_IO_WRITE32(pAd, MAC_WCID_BASE+4, 0x0);\n\n\t\t/* reset WCID table */\n\t\tfor (idx=2; idx<255; idx++)\n\t\t{\n\t\t\toffset = MAC_WCID_BASE + (idx * HW_WCID_ENTRY_SIZE);\t\n\t\t\tRTMP_IO_WRITE32(pAd, offset, 0x0);\n\t\t\tRTMP_IO_WRITE32(pAd, offset+4, 0x0);\n\t\t}\n\n\t\tpAd->MacTab.Content[0].Addr[0] = 0x01;\n\t\tpAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM;\n\t\tpAd->MacTab.Content[0].HTPhyMode.field.MCS = 3;\n\n\t\tAsicBBPAdjust(pAd);\n\t\t//MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble);\t\n\t\n\t\t{\n\t\t\tULONG\tAddr4;\n\t\t\tUINT32\tregValue;\n\t\t\tPUCHAR pP2PBssid = &pAd->CurrentAddress[0];\n\t\t\n\t\t\tAddr4 = (ULONG)(pP2PBssid[0])\t    | \n\t\t\t\t(ULONG)(pP2PBssid[1] << 8)  | \n\t\t\t\t(ULONG)(pP2PBssid[2] << 16) |\n\t\t\t\t(ULONG)(pP2PBssid[3] << 24);\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4);\n\t\n\t\t\tAddr4 = 0;\n\n\t\t\tAddr4 = (ULONG)(pP2PBssid[4]) | (ULONG)(pP2PBssid[5] << 8);\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4);\n\t\n\t\t\tRTMP_IO_READ32(pAd, MAC_BSSID_DW1, &regValue);\n\t\t\tregValue &= 0x0000FFFF;\n\n\t\t\tregValue |= (1 << 16);\n\n\t\t\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\t\t\t\tregValue |= (1 << 21);\n\t\t\tRTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, regValue);\t\t\n\t\t}\n\t\n\n#ifdef RTMP_MAC_USB\n\t\tprintk(\"YF DEBUG: RTUSBBssBeaconInit\\n\");\n        \tRTUSBBssBeaconInit(pAd);\n#endif /* RTMP_MAC_USB */\n\t}\n\n\tUCHAR apcliIdx, apidx = MAIN_MBSSID;\n\n\t//pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BGN_MIXED;\n\n\n\tprintk(\"YF DEBUG: Beacon Len %d\\n\", pBeacon->beacon_len);\n\tprintk(\"YF DEBUG: Beacon Interval %d\\n\", pBeacon->interval);\n        BeaconTransmit.word = 0;\n\n        RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID,\n                pBeacon->beacon_len, PID_MGMT, 0, 0,IFS_HTTXOP, FALSE, &BeaconTransmit);\n\n        ptr = (PUCHAR)&pAd->BeaconTxWI;\n#ifdef RT_BIG_ENDIAN\n        RTMPWIEndianChange(ptr, TYPE_TXWI);\n#endif\n\n        for (i=0; i<TXWISize; i+=4)  /* 16-byte TXWI field */\n        {\n                longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);\n                RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[0] + i, longValue);\n                ptr += 4;\n        }\n\n        /* update BEACON frame content. start right after the 16-byte TXWI field. */\n        ptr = pBeacon->beacon;\n#ifdef RT_BIG_ENDIAN\n        RTMPFrameEndianChange(pAd, ptr, DIR_WRITE, FALSE);\n#endif\n\n        for (i= 0; i< pBeacon->beacon_len; i+=4)\n        {\n                longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);\n                RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[0] + TXWISize + i, longValue);\n                ptr += 4;\n        }\n\n\tif (isAdd)\n\t{\n\t\t/* Enable Bss Sync*/\n\t\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr9.word);\n        \tcsr9.field.BeaconInterval = (pBeacon->interval) << 4; /* ASIC register in units of 1/16 TU*/\n        \tcsr9.field.bTsfTicking = 1;\n        \tcsr9.field.TsfSyncMode = 3;\n\t        csr9.field.bTBTTEnable = 1;\n        \tcsr9.field.bBeaconGen = 1;\n\t        RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word);\n\n\t\tpAd->P2pCfg.bSentProbeRSP = TRUE;\n\n#ifdef RTMP_MAC_USB\n\t\t/*\n\t\t * Support multiple BulkIn IRP,\n\t \t * the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.\n\t\t */\n\t\n\t\tUCHAR num_idx;\n\n\t\tfor(num_idx=0; num_idx < pAd->CommonCfg.NumOfBulkInIRP; num_idx++)\n\t\t{\n\t\t\tRTUSBBulkReceive(pAd);\n\t\t\tprintk(\"RTUSBBulkReceive!\\n\" );\n\t\t}\n\t\n#endif /* RTMP_MAC_USB */\n\t}\n\n#ifdef WFD_SUPPORT\n\tpAd->StaCfg.WfdCfg.bSuppGoOn = TRUE;\n#endif /* WFD_SUPPORT */\n\t\t\n\treturn TRUE;\n\n}\n\nBOOLEAN CFG80211DRV_OpsExtraIesSet(\n\tVOID\t\t\t\t\t\t*pAdOrg)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\t\n\tCFG80211_CB *pCfg80211_CB = pAd->pCfg80211_CB;\n\tUINT ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len;\n    CFG80211DBG(RT_DEBUG_ERROR, (\"80211> CFG80211DRV_OpsExtraIesSet ==> %d\\n\", ie_len)); \n\n\tif (pAd->StaCfg.pWpsProbeReqIe)\n\t{\t\n\t\tos_free_mem(NULL, pAd->StaCfg.pWpsProbeReqIe);\n\t\tpAd->StaCfg.pWpsProbeReqIe = NULL;\n\t}\n\n\tpAd->StaCfg.WpsProbeReqIeLen = 0;\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> is_wpa_supplicant_up ==> %d\\n\", pAd->StaCfg.WpaSupplicantUP)); \n\tos_alloc_mem(pAd, (UCHAR **)&(pAd->StaCfg.pWpsProbeReqIe), ie_len);\n\tif (pAd->StaCfg.pWpsProbeReqIe)\n\t{\n\t\tmemcpy(pAd->StaCfg.pWpsProbeReqIe, pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len);\n\t\tpAd->StaCfg.WpsProbeReqIeLen = ie_len;\n\t\t//hex_dump(\"WpsProbeReqIe\", pAd->StaCfg.pWpsProbeReqIe, pAd->StaCfg.WpsProbeReqIeLen);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_WPS_PROBE_REQ_IE, WpsProbeReqIeLen = %d!!\\n\",\n\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen));\n\t}\n\telse\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail. \\n\")); \n\t\treturn FALSE;\n\t}\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_OpsJoinIbss(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_IBSS *pIbssInfo;\n\n\n\tpIbssInfo = (CMD_RTPRIV_IOCTL_80211_IBSS *)pData;\n\tpAd->StaCfg.bAutoReconnect = TRUE;\n\n\tpAd->CommonCfg.BeaconPeriod = pIbssInfo->BeaconInterval;\n\tSet_SSID_Proc(pAd, (PSTRING)pIbssInfo->pSsid);\n#endif /* CONFIG_STA_SUPPORT */\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_OpsLeave(\n\tVOID\t\t\t\t\t\t*pAdOrg)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\n\n\tpAd->StaCfg.bAutoReconnect = FALSE;\n\tpAd->FlgCfg80211Connecting = FALSE;\n\tLinkDown(pAd, FALSE);\n#endif /* CONFIG_STA_SUPPORT */\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_StaGet(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_STA *pIbssInfo;\n\n\n\tpIbssInfo = (CMD_RTPRIV_IOCTL_80211_STA *)pData;\n\n#ifdef CONFIG_AP_SUPPORT\n{\n\tMAC_TABLE_ENTRY *pEntry;\n\tULONG DataRate = 0;\n\tUINT32 RSSI;\n\n\n\tpEntry = MacTableLookup(pAd, pIbssInfo->MAC);\n\tif (pEntry == NULL)\n\t\treturn FALSE;\n\t/* End of if */\n\n\t/* fill tx rate */\n\tgetRate(pEntry->HTPhyMode, &DataRate);\n\n\tif ((pEntry->HTPhyMode.field.MODE == MODE_HTMIX) ||\n\t\t(pEntry->HTPhyMode.field.MODE == MODE_HTGREENFIELD))\n\t{\n\t\tif (pEntry->HTPhyMode.field.BW)\n\t\t\tpIbssInfo->TxRateFlags |= RT_CMD_80211_TXRATE_BW_40;\n\t\t/* End of if */\n\t\tif (pEntry->HTPhyMode.field.ShortGI)\n\t\t\tpIbssInfo->TxRateFlags |= RT_CMD_80211_TXRATE_SHORT_GI;\n\t\t/* End of if */\n\n\t\tpIbssInfo->TxRateMCS = pEntry->HTPhyMode.field.MCS;\n\t}\n\telse\n\t{\n\t\tpIbssInfo->TxRateFlags = RT_CMD_80211_TXRATE_LEGACY;\n\t\tpIbssInfo->TxRateMCS = DataRate*1000; /* unit: 100kbps */\n\t} /* End of if */\n\n\t/* fill signal */\n\tRSSI = (pEntry->RssiSample.AvgRssi0 +\n\t\t\tpEntry->RssiSample.AvgRssi1 +\n\t\t\tpEntry->RssiSample.AvgRssi2) / 3;\n\tpIbssInfo->Signal = RSSI;\n\n\t/* fill tx count */\n\tpIbssInfo->TxPacketCnt = pEntry->OneSecTxNoRetryOkCount + \n\t\t\t\t\t\tpEntry->OneSecTxRetryOkCount + \n\t\t\t\t\t\tpEntry->OneSecTxFailCount;\n\n\t/* fill inactive time */\n\tpIbssInfo->InactiveTime = pEntry->NoDataIdleCount * 1000; /* unit: ms */\n\tpIbssInfo->InactiveTime *= MLME_TASK_EXEC_MULTIPLE;\n\tpIbssInfo->InactiveTime /= 20;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n{\n\tHTTRANSMIT_SETTING PhyInfo;\n\tULONG DataRate = 0;\n\tUINT32 RSSI;\n\n\n\t/* fill tx rate */\n    if ((!WMODE_CAP_N(pAd->CommonCfg.PhyMode)) ||\n\t (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM))\n\t{\n\t\tPhyInfo.word = pAd->StaCfg.HTPhyMode.word;\n\t}\n    else\n\t\tPhyInfo.word = pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word;\n\t/* End of if */\n\n\tgetRate(PhyInfo, &DataRate);\n\n\tif ((PhyInfo.field.MODE == MODE_HTMIX) ||\n\t\t(PhyInfo.field.MODE == MODE_HTGREENFIELD))\n\t{\n\t\tif (PhyInfo.field.BW)\n\t\t\tpIbssInfo->TxRateFlags |= RT_CMD_80211_TXRATE_BW_40;\n\t\t/* End of if */\n\t\tif (PhyInfo.field.ShortGI)\n\t\t\tpIbssInfo->TxRateFlags |= RT_CMD_80211_TXRATE_SHORT_GI;\n\t\t/* End of if */\n\n\t\tpIbssInfo->TxRateMCS = PhyInfo.field.MCS;\n\t}\n\telse\n\t{\n\t\tpIbssInfo->TxRateFlags = RT_CMD_80211_TXRATE_LEGACY;\n\t\tpIbssInfo->TxRateMCS = DataRate*10; /* unit: 100kbps */\n\t} /* End of if */\n\n\t/* fill signal */\n\tRSSI = (pAd->StaCfg.RssiSample.AvgRssi0 +\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi1 +\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi2) / 3;\n\tpIbssInfo->Signal = RSSI;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_KeyAdd(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo;\n\n\n\tpKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData;\n\n\tif (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP)\n\t{\n\t\tswitch(pKeyInfo->KeyId)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\tSet_Key1_Proc(pAd, (PSTRING)pKeyInfo->KeyBuf);\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tSet_Key2_Proc(pAd, (PSTRING)pKeyInfo->KeyBuf);\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tSet_Key3_Proc(pAd, (PSTRING)pKeyInfo->KeyBuf);\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tSet_Key4_Proc(pAd, (PSTRING)pKeyInfo->KeyBuf);\n\t\t\t\tbreak;\n\t\t} /* End of switch */\n\t}\n\telse\n\t\tSet_WPAPSK_Proc(pAd, (PSTRING)pKeyInfo->KeyBuf);\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nBOOLEAN CFG80211DRV_Connect(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_CONNECT *pConnInfo;\n\tUCHAR SSID[NDIS_802_11_LENGTH_SSID];\n\tUINT32 SSIDLen;\n\n\n\tpConnInfo = (CMD_RTPRIV_IOCTL_80211_CONNECT *)pData;\n\n\t/* change to infrastructure mode if we are in ADHOC mode */\n\tSet_NetworkType_Proc(pAd, \"Infra\");\n\n\t/* set authentication mode */\n\tif (pConnInfo->WpaVer == 2)\n\t{\n\t\tif (pConnInfo->FlgIs8021x == TRUE)\n\t\t\tSet_AuthMode_Proc(pAd, \"WPA2\");\n\t\telse\n\t\t\tSet_AuthMode_Proc(pAd, \"WPA2PSK\");\n\t\t/* End of if */\n\t}\n\telse if (pConnInfo->WpaVer == 1)\n\t{\n\t\tif (pConnInfo->FlgIs8021x == TRUE)\n\t\t\tSet_AuthMode_Proc(pAd, \"WPA\");\n\t\telse\n\t\t\tSet_AuthMode_Proc(pAd, \"WPAPSK\");\n\t\t/* End of if */\n\t}\n\telse if (pConnInfo->FlgIsAuthOpen == FALSE)\n\t\tSet_AuthMode_Proc(pAd, \"SHARED\");\n\telse\n\t\tSet_AuthMode_Proc(pAd, \"OPEN\");\n\t/* End of if */\n\n\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t(\"80211> AuthMode = %d\\n\", pAd->StaCfg.AuthMode));\n\n\t/* set encryption mode */\n\tif (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_CCMP)\n\t\tSet_EncrypType_Proc(pAd, \"AES\");\n\telse if (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_TKIP)\n\t\tSet_EncrypType_Proc(pAd, \"TKIP\");\n\telse if (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_WEP)\n\t{\n\t\tSet_EncrypType_Proc(pAd, \"WEP\");\n\t}\n\telse if (pConnInfo->GroupwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_CCMP)\n\t\tSet_EncrypType_Proc(pAd, \"AES\");\n\telse if (pConnInfo->GroupwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_TKIP)\n\t\tSet_EncrypType_Proc(pAd, \"TKIP\");\n\telse\n\t\tSet_EncrypType_Proc(pAd, \"NONE\");\n\t/* End of if */\n\n\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t(\"80211> EncrypType = %d\\n\", pAd->StaCfg.WepStatus));\n\n\t/* set channel: STATION will auto-scan */\n\n\t/* set WEP key */\n\tif (pConnInfo->pKey &&\n\t\t((pConnInfo->GroupwiseEncrypType | pConnInfo->PairwiseEncrypType) &\n\t\t\t\t\t\t\t\t\t\t\t\tRT_CMD_80211_CONN_ENCRYPT_WEP))\n\t{\n\t\tUCHAR KeyBuf[50];\n\n\t\t/* reset AuthMode and EncrypType */\n\t\tSet_AuthMode_Proc(pAd, \"SHARED\");\n\t\tSet_EncrypType_Proc(pAd, \"WEP\");\n\n\t\t/* reset key */\n#ifdef RT_CFG80211_DEBUG\n\t\thex_dump(\"KeyBuf=\", (UINT8 *)pConnInfo->pKey, pConnInfo->KeyLen);\n#endif /* RT_CFG80211_DEBUG */\n\n\t\tpAd->StaCfg.DefaultKeyId = pConnInfo->KeyIdx; /* base 0 */\n\t\tif (pConnInfo->KeyLen >= sizeof(KeyBuf))\n\t\t\treturn FALSE;\n\t\t/* End of if */\n\t\tmemcpy(KeyBuf, pConnInfo->pKey, pConnInfo->KeyLen);\n\t\tKeyBuf[pConnInfo->KeyLen] = 0x00;\n\n\t\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t\t(\"80211> pAd->StaCfg.DefaultKeyId = %d\\n\",\n\t\t\t\t\tpAd->StaCfg.DefaultKeyId));\n\n\t\tswitch(pConnInfo->KeyIdx)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\tSet_Key1_Proc(pAd, (PSTRING)KeyBuf);\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tSet_Key2_Proc(pAd, (PSTRING)KeyBuf);\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tSet_Key3_Proc(pAd, (PSTRING)KeyBuf);\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tSet_Key4_Proc(pAd, (PSTRING)KeyBuf);\n\t\t\t\tbreak;\n\t\t} /* End of switch */\n\t} /* End of if */\n\n\t/* TODO: We need to provide a command to set BSSID to associate a AP */\n\n\t/* re-set SSID */\n\tpAd->StaCfg.bAutoReconnect = TRUE;\n\tpAd->FlgCfg80211Connecting = TRUE;\n\n\tSSIDLen = pConnInfo->SsidLen;\n\tif (SSIDLen > NDIS_802_11_LENGTH_SSID)\n\t\tSSIDLen = NDIS_802_11_LENGTH_SSID;\n\t/* End of if */\n\n\tmemset(&SSID, 0, sizeof(SSID));\n\tmemcpy(SSID, pConnInfo->pSsid, SSIDLen);\n\tSet_SSID_Proc(pAd, (PSTRING)SSID);\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> SSID = %s\\n\", SSID));\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nVOID CFG80211DRV_RegNotify(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_REG_NOTIFY *pRegInfo;\n\n\n\tpRegInfo = (CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *)pData;\n\n\t/* keep Alpha2 and we can re-call the function when interface is up */\n\tpAd->Cfg80211_Alpha2[0] = pRegInfo->Alpha2[0];\n\tpAd->Cfg80211_Alpha2[1] = pRegInfo->Alpha2[1];\n\n\t/* apply the new regulatory rule */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n\t{\n\t\t/* interface is up */\n\t\tCFG80211_RegRuleApply(pAd, pRegInfo->pWiphy, (UCHAR *)pRegInfo->Alpha2);\n\t}\n\telse\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> interface is down!\\n\"));\n\t} /* End of if */\n}\n\n\nVOID CFG80211DRV_SurveyGet(\n\tVOID\t\t\t\t\t\t*pAdOrg,\n\tVOID\t\t\t\t\t\t*pData)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\tCMD_RTPRIV_IOCTL_80211_SURVEY *pSurveyInfo;\n\n\n\tpSurveyInfo = (CMD_RTPRIV_IOCTL_80211_SURVEY *)pData;\n\n\tpSurveyInfo->pCfg80211 = pAd->pCfg80211_CB;\n\n#ifdef AP_QLOAD_SUPPORT\n\tpSurveyInfo->ChannelTimeBusy = pAd->QloadLatestChannelBusyTimePri;\n\tpSurveyInfo->ChannelTimeExtBusy = pAd->QloadLatestChannelBusyTimeSec;\n#endif /* AP_QLOAD_SUPPORT */\n}\n\n\nVOID CFG80211_UnRegister(\n\tIN VOID\t\t\t\t\t\t*pAdOrg,\n\tIN VOID\t\t\t\t\t\t*pNetDev)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;\n\n\n\t/* sanity check */\n\tif (pAd->pCfg80211_CB == NULL)\n\t\treturn;\n\t/* End of if */\n\n\tCFG80211OS_UnRegister(pAd->pCfg80211_CB, pNetDev);\n\tpAd->pCfg80211_CB = NULL;\n\tpAd->CommonCfg.HT_Disable = 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tParse and handle country region in beacon from associated AP.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpVIE\t\t\t- Beacon elements\n\tLenVIE\t\t\t- Total length of Beacon elements\n\nReturn Value:\n\tNONE\n\nNote:\n========================================================================\n*/\nVOID CFG80211_BeaconCountryRegionParse(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN NDIS_802_11_VARIABLE_IEs\t*pVIE,\n\tIN UINT16\t\t\t\t\tLenVIE)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tUCHAR *pElement = (UCHAR *)pVIE;\n\tUINT32 LenEmt;\n\n\n\twhile(LenVIE > 0)\n\t{\n\t\tpVIE = (NDIS_802_11_VARIABLE_IEs *)pElement;\n\n\t\tif (pVIE->ElementID == IE_COUNTRY)\n\t\t{\n\t\t\t/* send command to do regulation hint only when associated */\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_REG_HINT_11D,\n\t\t\t\t\t\t\t\tpVIE->data, pVIE->Length);\n\t\t\tbreak;\n\t\t} /* End of if */\n\n\t\tLenEmt = pVIE->Length + 2;\n\n\t\tif (LenVIE <= LenEmt)\n\t\t\tbreak; /* length is not enough */\n\t\t/* End of if */\n\n\t\tpElement += LenEmt;\n\t\tLenVIE -= LenEmt;\n\t} /* End of while */\n} /* End of CFG80211_BeaconCountryRegionParse */\n\n\n/*\n========================================================================\nRoutine Description:\n\tHint to the wireless core a regulatory domain from driver.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpCountryIe\t\t- pointer to the country IE\n\tCountryIeLen\t- length of the country IE\n\nReturn Value:\n\tNONE\n\nNote:\n\tMust call the function in kernel thread.\n========================================================================\n*/\nVOID CFG80211_RegHint(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UCHAR\t\t\t\t\t*pCountryIe,\n\tIN ULONG\t\t\t\t\tCountryIeLen)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\n\n\tCFG80211OS_RegHint(CFG80211CB, pCountryIe, CountryIeLen);\n} /* End of CFG80211_RegHint */\n\n\n/*\n========================================================================\nRoutine Description:\n\tHint to the wireless core a regulatory domain from country element.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpCountryIe\t\t- pointer to the country IE\n\tCountryIeLen\t- length of the country IE\n\nReturn Value:\n\tNONE\n\nNote:\n\tMust call the function in kernel thread.\n========================================================================\n*/\nVOID CFG80211_RegHint11D(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UCHAR\t\t\t\t\t*pCountryIe,\n\tIN ULONG\t\t\t\t\tCountryIeLen)\n{\n\t/* no regulatory_hint_11d() in 2.6.32 */\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\n\n\tCFG80211OS_RegHint11D(CFG80211CB, pCountryIe, CountryIeLen);\n} /* End of CFG80211_RegHint11D */\n\n\n/*\n========================================================================\nRoutine Description:\n\tApply new regulatory rule.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpWiphy\t\t\t- Wireless hardware description\n\tpAlpha2\t\t\t- Regulation domain (2B)\n\nReturn Value:\n\tNONE\n\nNote:\n\tCan only be called when interface is up.\n\n\tFor general mac80211 device, it will be set to new power by Ops->config()\n\tIn rt2x00/, the settings is done in rt2x00lib_config().\n========================================================================\n*/\nVOID CFG80211_RegRuleApply(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN VOID\t\t\t\t\t\t*pWiphy,\n\tIN UCHAR\t\t\t\t\t*pAlpha2)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tVOID *pBand24G, *pBand5G;\n\tUINT32 IdBand, IdChan, IdPwr;\n\tUINT32 ChanNum, ChanId, Power, RecId, DfsType;\n\tBOOLEAN FlgIsRadar;\n\tULONG IrqFlags;\n#ifdef DFS_SUPPORT\t\n\tRADAR_DETECT_STRUCT\t*pRadarDetect;\n#endif /* DFS_SUPPORT */\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> CFG80211_RegRuleApply ==>\\n\"));\n\n\t/* init */\n\tpBand24G = NULL;\n\tpBand5G = NULL;\n\n\tif (pAd == NULL)\n\t\treturn;\n\n\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\n\t/* zero first */\n\tNdisZeroMemory(pAd->ChannelList,\n\t\t\t\t\tMAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));\n\n\t/* 2.4GHZ & 5GHz */\n\tRecId = 0;\n#ifdef DFS_SUPPORT\t\n\tpRadarDetect = &pAd->CommonCfg.RadarDetect;\n#endif /* DFS_SUPPORT */\n\n\t/* find the DfsType */\n\tDfsType = CE;\n\n\tpBand24G = NULL;\n\tpBand5G = NULL;\n\n\tif (CFG80211OS_BandInfoGet(CFG80211CB, pWiphy, &pBand24G, &pBand5G) == FALSE)\n\t\treturn;\n\n#ifdef AUTO_CH_SELECT_ENHANCE\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tif ((pAlpha2[0] != '0') && (pAlpha2[1] != '0'))\n\t{\n\t\tUINT32 IdReg;\n\n\t\tif (pBand5G != NULL)\n\t\t{\n\t\t\tfor(IdReg=0; ; IdReg++)\n\t\t\t{\n\t\t\t\tif (ChRegion[IdReg].CountReg[0] == 0x00)\n\t\t\t\t\tbreak;\n\t\t\t\t/* End of if */\n\t\n\t\t\t\tif ((pAlpha2[0] == ChRegion[IdReg].CountReg[0]) &&\n\t\t\t\t\t(pAlpha2[1] == ChRegion[IdReg].CountReg[1]))\n\t\t\t\t{\n\t\t\t\t\tif (pAd->CommonCfg.DfsType != MAX_RD_REGION)\n\t\t\t\t\t\tDfsType = pAd->CommonCfg.DfsType;\n\t\t\t\t\telse\n\t\t\t\t\tDfsType = ChRegion[IdReg].DfsType;\n\t\n\t\t\t\t\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t\t\t\t\t(\"crda> find region %c%c, DFS Type %d\\n\",\n\t\t\t\t\t\t\t\tpAlpha2[0], pAlpha2[1], DfsType));\n\t\t\t\t\tbreak;\n\t\t\t\t} /* End of if */\n\t\t\t} /* End of for */\n\t\t} /* End of if */\n\t} /* End of if */\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#endif /* AUTO_CH_SELECT_ENHANCE */\n\n\tfor(IdBand=0; IdBand<2; IdBand++)\n\t{\n\t\tif (((IdBand == 0) && (pBand24G == NULL)) ||\n\t\t\t((IdBand == 1) && (pBand5G == NULL)))\n\t\t{\n\t\t\tcontinue;\n\t\t} /* End of if */\n\n\t\tif (IdBand == 0)\n\t\t{\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> reset chan/power for 2.4GHz\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> reset chan/power for 5GHz\\n\"));\n\t\t} /* End of if */\n\n\t\tChanNum = CFG80211OS_ChanNumGet(CFG80211CB, pWiphy, IdBand);\n\n\t\tfor(IdChan=0; IdChan<ChanNum; IdChan++)\n\t\t{\n\t\t\tif (CFG80211OS_ChanInfoGet(CFG80211CB, pWiphy, IdBand, IdChan,\n\t\t\t\t\t\t\t\t\t&ChanId, &Power, &FlgIsRadar) == FALSE)\n\t\t\t{\n\t\t\t\t/* the channel is not allowed in the regulatory domain */\n\t\t\t\t/* get next channel information */\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!WMODE_CAP_2G(pAd->CommonCfg.PhyMode))\n\t\t\t{\n\t\t\t\t/* 5G-only mode */\n\t\t\t\tif (ChanId <= CFG80211_NUM_OF_CHAN_2GHZ)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!WMODE_CAP_5G(pAd->CommonCfg.PhyMode))\n\t\t\t{\n\t\t\t\t/* 2.4G-only mode */\n\t\t\t\tif (ChanId > CFG80211_NUM_OF_CHAN_2GHZ)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor(IdPwr=0; IdPwr<MAX_NUM_OF_CHANNELS; IdPwr++)\n\t\t\t{\n\t\t\t\tif (ChanId == pAd->TxPower[IdPwr].Channel)\n\t\t\t\t{\n\t\t\t\t\t/* init the channel info. */\n\t\t\t\t\tNdisMoveMemory(&pAd->ChannelList[RecId],\n\t\t\t\t\t\t\t\t\t&pAd->TxPower[IdPwr],\n\t\t\t\t\t\t\t\t\tsizeof(CHANNEL_TX_POWER));\n\n\t\t\t\t\t/* keep channel number */\n\t\t\t\t\tpAd->ChannelList[RecId].Channel = ChanId;\n\n\t\t\t\t\t/* keep maximum tranmission power */\n\t\t\t\t\tpAd->ChannelList[RecId].MaxTxPwr = Power;\n\n\t\t\t\t\t/* keep DFS flag */\n\t\t\t\t\tif (FlgIsRadar == TRUE)\n\t\t\t\t\t\tpAd->ChannelList[RecId].DfsReq = TRUE;\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->ChannelList[RecId].DfsReq = FALSE;\n\t\t\t\t\t/* End of if */\n\n\t\t\t\t\t/* keep DFS type */\n\t\t\t\t\tpAd->ChannelList[RecId].RegulatoryDomain = DfsType;\n\n\t\t\t\t\t/* re-set DFS info. */\n\t\t\t\t\tpAd->CommonCfg.RDDurRegion = DfsType;\n\n\t\t\t\t\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t\t\t\t\t(\"Chan %03d:\\tpower %d dBm, \"\n\t\t\t\t\t\t\t\t\"DFS %d, DFS Type %d\\n\",\n\t\t\t\t\t\t\t\tChanId, Power,\n\t\t\t\t\t\t\t\t((FlgIsRadar == TRUE)?1:0),\n\t\t\t\t\t\t\t\tDfsType));\n\n\t\t\t\t\t/* change to record next channel info. */\n\t\t\t\t\tRecId ++;\n\t\t\t\t\tbreak;\n\t\t\t\t} /* End of if */\n\t\t\t} /* End of for */\n\t\t} /* End of for */\n\t} /* End of for */\n\n\tpAd->ChannelListNum = RecId;\n\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> Number of channels = %d\\n\", RecId));\n} /* End of CFG80211_RegRuleApply */\n\n\n/*\n========================================================================\nRoutine Description:\n\tInform us that a scan is got.\n\nArguments:\n\tpAdCB\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNONE\n\nNote:\n\tCall RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning\n========================================================================\n*/\nVOID CFG80211_Scaning(\n\tIN VOID\t\t\t\t\t\t\t*pAdCB,\n\tIN UINT32\t\t\t\t\t\tBssIdx,\n\tIN UINT32\t\t\t\t\t\tChanId,\n\tIN UCHAR\t\t\t\t\t\t*pFrame,\n\tIN UINT32\t\t\t\t\t\tFrameLen,\n\tIN INT32\t\t\t\t\t\tRSSI)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tVOID *pCfg80211_CB = pAd->pCfg80211_CB;\n\tBOOLEAN FlgIsNMode;\n\tUINT8 BW;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> CFG80211_Scaning ==>\\n\"));\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"80211> Network is down!\\n\"));\n\t\treturn;\n\t} /* End of if */\n\n\t/*\n\t\tIn connect function, we also need to report BSS information to cfg80211;\n\t\tNot only scan function.\n\t*/\n\tif ((pAd->FlgCfg80211Scanning == FALSE) &&\n\t\t(pAd->FlgCfg80211Connecting == FALSE))\n\t{\n\t\treturn; /* no scan is running */\n\t} /* End of if */\n\n\t/* init */\n\t/* Note: Can not use local variable to do pChan */\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\tFlgIsNMode = TRUE;\n\telse\n\t\tFlgIsNMode = FALSE;\n\n\tif (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)\n\t\tBW = 0;\n\telse\n\t\tBW = 1;\n\n\tCFG80211OS_Scaning(pCfg80211_CB,\n\t\t\t\t\t\tChanId,\n\t\t\t\t\t\tpFrame,\n\t\t\t\t\t\tFrameLen,\n\t\t\t\t\t\tRSSI,\n\t\t\t\t\t\tFlgIsNMode,\n\t\t\t\t\t\tBW);\n#endif /* CONFIG_STA_SUPPORT */\n} /* End of CFG80211_Scaning */\n\n\n/*\n========================================================================\nRoutine Description:\n\tInform us that scan ends.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tFlgIsAborted\t- 1: scan is aborted\n\nReturn Value:\n\tNONE\n\nNote:\n========================================================================\n*/\nVOID CFG80211_ScanEnd(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN BOOLEAN\t\t\t\t\tFlgIsAborted)\n{\n#ifdef CONFIG_STA_SUPPORT\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\n\n\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"80211> Network is down!\\n\"));\n\t\treturn;\n\t} /* End of if */\n\n\tif (pAd->FlgCfg80211Scanning == FALSE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"80211> No scan is running!\\n\"));\n\t\treturn; /* no scan is running */\n\t} /* End of if */\n\n\tif (FlgIsAborted == TRUE)\n\t\tFlgIsAborted = 1;\n\telse\n\t\tFlgIsAborted = 0;\n\t/* End of if */\n\n\tCFG80211OS_ScanEnd(CFG80211CB, FlgIsAborted);\n\n\tpAd->FlgCfg80211Scanning = FALSE;\n#endif /* CONFIG_STA_SUPPORT */\n} /* End of CFG80211_ScanEnd */\n\n\n/*\n========================================================================\nRoutine Description:\n\tInform CFG80211 about association status.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpBSSID\t\t\t- the BSSID of the AP\n\tpReqIe\t\t\t- the element list in the association request frame\n\tReqIeLen\t\t- the request element length\n\tpRspIe\t\t\t- the element list in the association response frame\n\tRspIeLen\t\t- the response element length\n\tFlgIsSuccess\t- 1: success; otherwise: fail\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID CFG80211_ConnectResultInform(\n\tIN VOID\t\t\t\t\t\t*pAdCB,\n\tIN UCHAR\t\t\t\t\t*pBSSID,\n\tIN UCHAR\t\t\t\t\t*pReqIe,\n\tIN UINT32\t\t\t\t\tReqIeLen,\n\tIN UCHAR\t\t\t\t\t*pRspIe,\n\tIN UINT32\t\t\t\t\tRspIeLen,\n\tIN UCHAR\t\t\t\t\tFlgIsSuccess)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> CFG80211_ConnectResultInform ==>\\n\"));\n\n\tCFG80211OS_ConnectResultInform(CFG80211CB,\n\t\t\t\t\t\t\t\tpBSSID,\n\t\t\t\t\t\t\t\tpReqIe,\n\t\t\t\t\t\t\t\tReqIeLen,\n\t\t\t\t\t\t\t\tpRspIe,\n\t\t\t\t\t\t\t\tRspIeLen,\n\t\t\t\t\t\t\t\tFlgIsSuccess);\n\n\tpAd->FlgCfg80211Connecting = FALSE;\n} /* End of CFG80211_ConnectResultInform */\n\n\n/*\n========================================================================\nRoutine Description:\n\tRe-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tTRUE\t\t\t- re-init successfully\n\tFALSE\t\t\t- re-init fail\n\nNote:\n\tCFG80211_SupBandInit() is called in xx_probe().\n\tBut we do not have complete chip information in xx_probe() so we\n\tneed to re-init bands in xx_open().\n========================================================================\n*/\nBOOLEAN CFG80211_SupBandReInit(\n\tIN VOID\t\t\t\t\t\t*pAdCB)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tCFG80211_BAND BandInfo;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> re-init bands...\\n\"));\n\n\t/* re-init bands */\n\tNdisZeroMemory(&BandInfo, sizeof(BandInfo));\n\tCFG80211_BANDINFO_FILL(pAd, &BandInfo);\n\n\treturn CFG80211OS_SupBandReInit(CFG80211CB, &BandInfo);\n} /* End of CFG80211_SupBandReInit */\n\n\nINT CFG80211_StaPortSecured(\n\tIN VOID                                         *pAdCB,\n\tIN UCHAR \t\t\t\t\t*pMac,\n\tIN UINT\t\t\t\t\t\tflag)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tMAC_TABLE_ENTRY *pEntry;\n\n\tpEntry = MacTableLookup(pAd, pMac);\n\tif (!pEntry)\n\t{\n\t\tprintk(\"Can't find pEntry in CFG80211_StaPortSecured\\n\");\n\t}\n\telse\n\t{\n\t\tif (flag)\n\t\t{\n\t\t\tprintk(\"AID:%d, PortSecured\\n\", pEntry->Aid);\n\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\tpEntry->WpaState = AS_PTKINITDONE;\n\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprintk(\"AID:%d, PortNotSecured\\n\", pEntry->Aid);\n\t\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\t\n\t\t}\t\n\t}\n\t\n\treturn 0;\n}\n\nINT CFG80211_ApStaDel(\n\tIN VOID                                         *pAdCB,\n\tIN UCHAR                                        *pMac)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tMAC_TABLE_ENTRY *pEntry;\n\t\n\tif (pMac == NULL)\n\t{\n\t\tMacTableReset(pAd);\n\t}\n\telse\n\t{\n\t\tpEntry = MacTableLookup(pAd, pMac);\n\t\tif (pEntry)\n\t\t{\n\t\t//\tMlmeDeAuthAction(pAd, pEntry, 2, FALSE);\n\t\t}\n\t\telse\n\t\t\tprintk(\"Can't find pEntry in ApStaDel\\n\");\n\t}\n}\n\n//CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET:\nINT CFG80211_setDefaultKey(\n\tIN VOID                                         *pAdCB,\n\tIN UINT \t\t\t\t\tData\n)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\tCFG80211_CB *p80211CB = pAd->pCfg80211_CB;\n\n        if (p80211CB->pCfg80211_Wdev->iftype == RT_CMD_80211_IFTYPE_AP)\n\t//if (pAd->VifNextMode == RT_CMD_80211_IFTYPE_AP)\n        {\n\t\t printk(\"Set Ap Default Key: %d\\n\", Data);\n        \tpAd->ApCfg.MBSSID[MAIN_MBSSID].DefaultKeyId = Data;\n        }\n        else\n#ifdef CONFIG_STA_SUPPORT\n        {\n\t\tprintk(\"Set Sta Default Key: %d\\n\", Data);\n                pAd->StaCfg.DefaultKeyId = Data; /* base 0 */\n        }\n#endif /* CONFIG_STA_SUPPORT */\n\treturn 0;\t\n\n}\n\n#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT\nINT CFG80211_SendWirelessEvent(\n\tIN VOID                                         *pAdCB,\n\tIN UCHAR \t\t\t\t\t*pMacAddr)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;\n\n\tP2pSendWirelessEvent(pAd, RT_P2P_CONNECTED, NULL, pMacAddr);\n\t\n\treturn 0;\n}\n#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */\n\n\n#endif /* RT_CFG80211_SUPPORT */\n\n/* End of cfg80211drv.c */\n"
  },
  {
    "path": "src/os/linux/inf_ppa.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n \n    Module Name:\n    inf_ppa.c\n \n    Abstract:\n    Only for Infineon PPA Direct path feature.\n\n\t\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    carella\t06-01-2010    Created\n\n */\n\n#ifdef INF_PPA_SUPPORT\n\n#include \"rt_config.h\"\n#include <linux/skbuff.h>\n#include <linux/netdevice.h>\n\nextern INT rt28xx_send_packets(\n\tIN struct sk_buff\t\t*skb_p,\n\tIN struct net_device\t*net_dev);\n\nint ifx_ra_start_xmit(\n\tstruct net_device *rx_dev,\n\tstruct net_device *tx_dev,\n\tstruct sk_buff *skb, int len)\n{\n\tif(tx_dev != NULL)\n\t{\n\t\tSET_OS_PKT_NETDEV(skb, tx_dev);\n\t\trt28xx_send_packets(skb, tx_dev);\n\t}\n\telse if(rx_dev != NULL)\n\t{\n\t\tskb->protocol = eth_type_trans(skb, skb->dev);\n\t\tnetif_rx(skb);\n\t}\n\telse\n\t{\n\t\tdev_kfree_skb_any(skb);\n\t}\n\treturn 0;\n}\n#endif /* INF_PPA_SUPPORT */\n"
  },
  {
    "path": "src/os/linux/rt_linux.c",
    "content": "/****************************************************************************\n\n    Module Name:\n    UTIL/rt_linux.c\n\n    Abstract:\n\tAll functions provided from OS module are put here.\n\n\tNote:\n\t1. Can not use sizeof() for a structure with any parameter included\n\tby any compile option, such as RTMP_ADAPTER.\n\n\tBecause the RTMP_ADAPTER size in the UTIL module is different with\n\tDRIVER/NETIF.\n\n\t2. Do not use any structure with any parameter included by PCI/USB/RBUS/\n\tAP/STA.\n\n\tBecause the structure size in the UTIL module is different with\n\tDRIVER/NETIF.\n\n\t3. Do not use any structure defined in DRIVER module, EX: pAd.\n\tSo we can do module partition.\n\n\tRevision History:\n\tWho        When          What\n\t---------  ----------    -------------------------------------------\n\n***************************************************************************/\n\n#define RTMP_MODULE_OS\n#define RTMP_MODULE_OS_UTIL\n\n\n#include \"rtmp_comm.h\"\n#include \"rtmp_osabl.h\"\n#include \"rt_os_util.h\"\n#include <linux/rtnetlink.h>\n\n#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)\n#include \"../../../../../../net/nat/hw_nat/ra_nat.h\"\n#include \"../../../../../../net/nat/hw_nat/frame_engine.h\"\n#endif\n\n/* TODO */\n#undef RT_CONFIG_IF_OPMODE_ON_AP\n#undef RT_CONFIG_IF_OPMODE_ON_STA\n\n#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT)\n#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)\tif (__OpMode == OPMODE_AP)\n#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)\tif (__OpMode == OPMODE_STA)\n#else\n#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)\n#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)\n#endif\n\nULONG RTDebugLevel = RT_DEBUG_ERROR;\nULONG RTDebugFunc = 0;\n\n#ifdef OS_ABL_FUNC_SUPPORT\nULONG RTPktOffsetData = 0, RTPktOffsetLen = 0, RTPktOffsetCB = 0;\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\n#ifdef VENDOR_FEATURE4_SUPPORT\nULONG OS_NumOfMemAlloc = 0, OS_NumOfMemFree = 0;\n#endif /* VENDOR_FEATURE4_SUPPORT */\n#ifdef VENDOR_FEATURE2_SUPPORT\nULONG OS_NumOfPktAlloc = 0, OS_NumOfPktFree = 0;\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\n/*\n * the lock will not be used in TX/RX\n * path so throughput should not be impacted\n */\nBOOLEAN FlgIsUtilInit = FALSE;\nOS_NDIS_SPIN_LOCK UtilSemLock;\n\n\nBOOLEAN RTMP_OS_Alloc_RscOnly(VOID *pRscSrc, UINT32 RscLen);\nBOOLEAN RTMP_OS_Remove_Rsc(LIST_HEADER *pRscList, VOID *pRscSrc);\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize something in UTIL module.\n\nArguments:\n\tNone\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpUtilInit(VOID)\n{\n\tif (FlgIsUtilInit == FALSE) {\n\t\tOS_NdisAllocateSpinLock(&UtilSemLock);\n\t\tFlgIsUtilInit = TRUE;\n\t}\n}\n\n/* timeout -- ms */\nstatic inline VOID __RTMP_SetPeriodicTimer(\n\tIN OS_NDIS_MINIPORT_TIMER * pTimer,\n\tIN unsigned long timeout)\n{\n\ttimeout = ((timeout * OS_HZ) / 1000);\n\tpTimer->expires = jiffies + timeout;\n\tadd_timer(pTimer);\n}\n\n/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */\nstatic inline VOID __RTMP_OS_Init_Timer(\n\tIN VOID *pReserved,\n\tIN OS_NDIS_MINIPORT_TIMER * pTimer,\n\tIN TIMER_FUNCTION function,\n\tIN PVOID data)\n{\n\tif (!timer_pending(pTimer)) {\n\t\tinit_timer(pTimer);\n\t\tpTimer->data = (unsigned long)data;\n\t\tpTimer->function = function;\n\t}\n}\n\nstatic inline VOID __RTMP_OS_Add_Timer(\n\tIN OS_NDIS_MINIPORT_TIMER * pTimer,\n\tIN unsigned long timeout)\n{\n\tif (timer_pending(pTimer))\n\t\treturn;\n\n\ttimeout = ((timeout * OS_HZ) / 1000);\n\tpTimer->expires = jiffies + timeout;\n\tadd_timer(pTimer);\n}\n\nstatic inline VOID __RTMP_OS_Mod_Timer(\n\tIN OS_NDIS_MINIPORT_TIMER * pTimer,\n\tIN unsigned long timeout)\n{\n\ttimeout = ((timeout * OS_HZ) / 1000);\n\tmod_timer(pTimer, jiffies + timeout);\n}\n\nstatic inline VOID __RTMP_OS_Del_Timer(\n\tIN OS_NDIS_MINIPORT_TIMER * pTimer,\n\tOUT BOOLEAN *pCancelled)\n{\n\tif (timer_pending(pTimer))\n\t\t*pCancelled = del_timer_sync(pTimer);\n\telse\n\t\t*pCancelled = TRUE;\n}\n\nstatic inline VOID __RTMP_OS_Release_Timer(\n\tIN OS_NDIS_MINIPORT_TIMER * pTimer)\n{\n\t/* nothing to do */\n}\n\n\n/* Unify all delay routine by using udelay */\nVOID RTMPusecDelay(ULONG usec)\n{\n\tULONG i;\n\n\tfor (i = 0; i < (usec / 50); i++)\n\t\tudelay(50);\n\n\tif (usec % 50)\n\t\tudelay(usec % 50);\n}\n\n\n/* Unify all delay routine by using udelay */\nVOID RtmpOsUsDelay(ULONG value)\n{\n\tULONG i;\n\n\tudelay(value);\n}\n\nVOID RtmpOsMsDelay(ULONG msec)\n{\n\tmdelay(msec);\n}\n\nvoid RTMP_GetCurrentSystemTime(LARGE_INTEGER * time)\n{\n\ttime->u.LowPart = jiffies;\n}\n\nvoid RTMP_GetCurrentSystemTick(ULONG *pNow)\n{\n\t*pNow = jiffies;\n}\n\n/* pAd MUST allow to be NULL */\n\nNDIS_STATUS os_alloc_mem(\n\tIN VOID *pReserved,\n\tOUT UCHAR **mem,\n\tIN ULONG size)\n{\n\t*mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);\n\tif (*mem) {\n#ifdef VENDOR_FEATURE4_SUPPORT\n\t\tOS_NumOfMemAlloc++;\n#endif /* VENDOR_FEATURE4_SUPPORT */\n\n\t\treturn NDIS_STATUS_SUCCESS;\n\t} else\n\t\treturn NDIS_STATUS_FAILURE;\n}\n\nNDIS_STATUS os_alloc_mem_suspend(\n\tIN VOID *pReserved,\n\tOUT UCHAR **mem,\n\tIN ULONG size)\n{\n\t*mem = (PUCHAR) kmalloc(size, GFP_KERNEL);\n\tif (*mem) {\n#ifdef VENDOR_FEATURE4_SUPPORT\n\t\tOS_NumOfMemAlloc++;\n#endif /* VENDOR_FEATURE4_SUPPORT */\n\n\t\treturn NDIS_STATUS_SUCCESS;\n\t} else\n\t\treturn NDIS_STATUS_FAILURE;\n}\n\n/* pAd MUST allow to be NULL */\nNDIS_STATUS os_free_mem(\n\tIN VOID *pReserved,\n\tIN PVOID mem)\n{\n\tASSERT(mem);\n\tkfree(mem);\n\n#ifdef VENDOR_FEATURE4_SUPPORT\n\tOS_NumOfMemFree++;\n#endif /* VENDOR_FEATURE4_SUPPORT */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n#if defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT)\n/* The flag \"CONFIG_RALINK_FLASH_API\" is used for APSoC Linux SDK */\n#ifdef CONFIG_RALINK_FLASH_API\n\nint32_t FlashRead(\n\tuint32_t *dst,\n\tuint32_t *src,\n\tuint32_t count);\n\nint32_t FlashWrite(\n\tuint16_t *source,\n\tuint16_t *destination,\n\tuint32_t numBytes);\n#else /* CONFIG_RALINK_FLASH_API */\n\n#ifdef RA_MTD_RW_BY_NUM\n#if defined (CONFIG_RT2880_FLASH_32M)\n#define MTD_NUM_FACTORY 5\n#else\n#define MTD_NUM_FACTORY 2\n#endif\nextern int ra_mtd_write(int num, loff_t to, size_t len, const u_char *buf);\nextern int ra_mtd_read(int num, loff_t from, size_t len, u_char *buf);\n#else\nextern int ra_mtd_write_nm(char *name, loff_t to, size_t len, const u_char *buf);\nextern int ra_mtd_read_nm(char *name, loff_t from, size_t len, u_char *buf);\n#endif\n\n#endif /* CONFIG_RALINK_FLASH_API */\n\nvoid RtmpFlashRead(\n\tUCHAR *p,\n\tULONG a,\n\tULONG b)\n{\n#ifdef CONFIG_RALINK_FLASH_API\n\tFlashRead((uint32_t *) p, (uint32_t *) a, (uint32_t) b);\n#else\n#ifdef RA_MTD_RW_BY_NUM\n\tra_mtd_read(MTD_NUM_FACTORY, 0, (size_t) b, p);\n#else\n\tra_mtd_read_nm(\"Factory\", a&0xFFFF, (size_t) b, p);\n#endif\n#endif /* CONFIG_RALINK_FLASH_API */\n}\n\nvoid RtmpFlashWrite(\n\tUCHAR * p,\n\tULONG a,\n\tULONG b)\n{\n#ifdef CONFIG_RALINK_FLASH_API\n\tFlashWrite((uint16_t *) p, (uint16_t *) a, (uint32_t) b);\n#else\n#ifdef RA_MTD_RW_BY_NUM\n\tra_mtd_write(MTD_NUM_FACTORY, 0, (size_t) b, p);\n#else\n\tra_mtd_write_nm(\"Factory\", a&0xFFFF, (size_t) b, p);\n#endif\n#endif /* CONFIG_RALINK_FLASH_API */\n}\n#endif /* defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT) */\n\n\nPNDIS_PACKET RtmpOSNetPktAlloc(VOID *dummy, int size)\n{\n\tstruct sk_buff *skb;\n\t/* Add 2 more bytes for ip header alignment */\n\tskb = dev_alloc_skb(size + 2);\n\tif (skb != NULL)\n\t\tMEM_DBG_PKT_ALLOC_INC(skb);\n\n\treturn ((PNDIS_PACKET) skb);\n}\n\nPNDIS_PACKET RTMP_AllocateFragPacketBuffer(VOID *dummy, ULONG len)\n{\n\tstruct sk_buff *pkt;\n\n\tpkt = dev_alloc_skb(len);\n\n\tif (pkt == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"can't allocate frag rx %ld size packet\\n\", len));\n\t}\n\n\tif (pkt) {\n\t\tMEM_DBG_PKT_ALLOC_INC(pkt);\n\t\tRTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);\n\t}\n\n\treturn (PNDIS_PACKET) pkt;\n}\n\n\n\n/*\n\tThe allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()\n*/\nNDIS_STATUS RTMPAllocateNdisPacket(\n\tIN VOID *pReserved,\n\tOUT PNDIS_PACKET *ppPacket,\n\tIN UCHAR *pHeader,\n\tIN UINT HeaderLen,\n\tIN UCHAR *pData,\n\tIN UINT DataLen)\n{\n\tstruct sk_buff *pPacket;\n\n\n\tASSERT(pData);\n\tASSERT(DataLen);\n\n\tpPacket = dev_alloc_skb(HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING);\n\tif (pPacket == NULL) {\n\t\t*ppPacket = NULL;\n#ifdef DEBUG\n\t\tprintk(KERN_ERR \"RTMPAllocateNdisPacket Fail\\n\\n\");\n#endif\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\tMEM_DBG_PKT_ALLOC_INC(pPacket);\n\n\t/* Clone the frame content and update the length of packet */\n\tif (HeaderLen > 0)\n\t\tNdisMoveMemory(pPacket->data, pHeader, HeaderLen);\n\tif (DataLen > 0)\n\t\tNdisMoveMemory(pPacket->data + HeaderLen, pData, DataLen);\n\tskb_put(pPacket, HeaderLen + DataLen);\n/* printk(KERN_ERR \"%s : pPacket = %p, len = %d\\n\", __FUNCTION__, pPacket, GET_OS_PKT_LEN(pPacket));*/\n\n\tRTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);\n\t*ppPacket = (PNDIS_PACKET)pPacket;\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n  ========================================================================\n  Description:\n\tThis routine frees a miniport internally allocated NDIS_PACKET and its\n\tcorresponding NDIS_BUFFER and allocated memory.\n  ========================================================================\n*/\nVOID RTMPFreeNdisPacket(\n\tIN VOID *pReserved,\n\tIN PNDIS_PACKET pPacket)\n{\n\tdev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));\n\tMEM_DBG_PKT_FREE_INC(pPacket);\n}\n\n\n/* IRQL = DISPATCH_LEVEL */\n/* NOTE: we do have an assumption here, that Byte0 and Byte1\n * always reasid at the same scatter gather buffer\n */\nNDIS_STATUS Sniff2BytesFromNdisBuffer(\n\tIN PNDIS_BUFFER pFirstBuffer,\n\tIN UCHAR DesiredOffset,\n\tOUT PUCHAR pByte0,\n\tOUT PUCHAR pByte1)\n{\n\t*pByte0 = *(PUCHAR) (pFirstBuffer + DesiredOffset);\n\t*pByte1 = *(PUCHAR) (pFirstBuffer + DesiredOffset + 1);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nvoid RTMP_QueryPacketInfo(\n\tIN PNDIS_PACKET pPacket,\n\tOUT PACKET_INFO *info,\n\tOUT UCHAR **pSrcBufVA,\n\tOUT UINT *pSrcBufLen)\n{\n\tinfo->BufferCount = 1;\n\tinfo->pFirstBuffer = (PNDIS_BUFFER) GET_OS_PKT_DATAPTR(pPacket);\n\tinfo->PhysicalBufferCount = 1;\n\tinfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);\n\n\t*pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);\n\t*pSrcBufLen = GET_OS_PKT_LEN(pPacket);\n\n#ifdef TX_PKT_SG\n\tif (RTMP_GET_PKT_SG(pPacket)) {\n\t\tstruct sk_buff *skb = (struct sk_buff *)pPacket;\n\t\tint i, nr_frags = skb_shinfo(skb)->nr_frags;\n\t\t\n\t\tinfo->BufferCount =  nr_frags + 1;\n\t\tinfo->PhysicalBufferCount = info->BufferCount;\n\t\tinfo->sg_list[0].data = (VOID *)GET_OS_PKT_DATAPTR(pPacket);\n\t\tinfo->sg_list[0].len = skb_headlen(skb);\n\t\tfor (i = 0; i < nr_frags; i++) {\n\t\t\tskb_frag_t *frag = &skb_shinfo(skb)->frags[i];\n\t\t\t\n\t\t\tinfo->sg_list[i+1].data = ((void *) page_address(frag->page) +\n\t\t\t\t\t\t\t\t\tfrag->page_offset);\n\t\t\tinfo->sg_list[i+1].len = frag->size;\n\t\t}\n\t}\n#endif /* TX_PKT_SG */\n}\n\n\n\n\nPNDIS_PACKET DuplicatePacket(\n\tIN PNET_DEV pNetDev,\n\tIN PNDIS_PACKET pPacket,\n\tIN UCHAR FromWhichBSSID)\n{\n\tstruct sk_buff *skb;\n\tPNDIS_PACKET pRetPacket = NULL;\n\tUSHORT DataSize;\n\tUCHAR *pData;\n\n\tDataSize = (USHORT) GET_OS_PKT_LEN(pPacket);\n\tpData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);\n\n\tskb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);\n\tif (skb) {\n\t\tMEM_DBG_PKT_ALLOC_INC(skb);\n\t\tskb->dev = pNetDev;\t/*get_netdev_from_bssid(pAd, FromWhichBSSID); */\n\t\tpRetPacket = OSPKT_TO_RTPKT(skb);\n\t}\n\n\treturn pRetPacket;\n\n}\n\n\nPNDIS_PACKET duplicate_pkt(\n\tIN PNET_DEV pNetDev,\n\tIN PUCHAR pHeader802_3,\n\tIN UINT HdrLen,\n\tIN PUCHAR pData,\n\tIN ULONG DataSize,\n\tIN UCHAR FromWhichBSSID)\n{\n\tstruct sk_buff *skb;\n\tPNDIS_PACKET pPacket = NULL;\n\n\tif ((skb =\n\t     __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) {\n\t\tMEM_DBG_PKT_ALLOC_INC(skb);\n\n\t\tskb_reserve(skb, 2);\n\t\tNdisMoveMemory(skb->tail, pHeader802_3, HdrLen);\n\t\tskb_put(skb, HdrLen);\n\t\tNdisMoveMemory(skb->tail, pData, DataSize);\n\t\tskb_put(skb, DataSize);\n\t\tskb->dev = pNetDev;\t/*get_netdev_from_bssid(pAd, FromWhichBSSID); */\n\t\tpPacket = OSPKT_TO_RTPKT(skb);\n\t}\n\n\treturn pPacket;\n}\n\n\n#define TKIP_TX_MIC_SIZE\t\t8\nPNDIS_PACKET duplicate_pkt_with_TKIP_MIC(\n\tIN VOID *pReserved,\n\tIN PNDIS_PACKET pPacket)\n{\n\tstruct sk_buff *skb, *newskb;\n\n\tskb = RTPKT_TO_OSPKT(pPacket);\n\tif (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) {\n\t\t/* alloc a new skb and copy the packet */\n\t\tnewskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);\n\n\t\tdev_kfree_skb_any(skb);\n\t\tMEM_DBG_PKT_FREE_INC(skb);\n\n\t\tif (newskb == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Extend Tx.MIC for packet failed!, dropping packet!\\n\"));\n\t\t\treturn NULL;\n\t\t}\n\t\tskb = newskb;\n\t\tMEM_DBG_PKT_ALLOC_INC(skb);\n\t}\n\n\treturn OSPKT_TO_RTPKT(skb);\n\n\n}\n\n#ifdef CONFIG_AP_SUPPORT\nPNDIS_PACKET duplicate_pkt_with_VLAN(\n\tIN PNET_DEV pNetDev,\n\tIN USHORT VLAN_VID,\n\tIN USHORT VLAN_Priority,\n\tIN PUCHAR pHeader802_3,\n\tIN UINT HdrLen,\n\tIN PUCHAR pData,\n\tIN ULONG DataSize,\n\tIN UCHAR FromWhichBSSID,\n\tIN UCHAR *TPID)\n{\n\tstruct sk_buff *skb;\n\tPNDIS_PACKET pPacket = NULL;\n\tUINT16 VLAN_Size;\n\n\tif ((skb = __dev_alloc_skb(HdrLen + DataSize + LENGTH_802_1Q + 2,\n\t\t\t\t   MEM_ALLOC_FLAG)) != NULL) {\n\t\tMEM_DBG_PKT_ALLOC_INC(skb);\n\n\t\tskb_reserve(skb, 2);\n\n\t\t/* copy header (maybe +VLAN tag) */\n\t\tVLAN_Size = VLAN_8023_Header_Copy(VLAN_VID, VLAN_Priority,\n\t\t\t\t\t\t  pHeader802_3, HdrLen,\n\t\t\t\t\t\t  skb->tail, FromWhichBSSID,\n\t\t\t\t\t\t  TPID);\n\t\tskb_put(skb, HdrLen + VLAN_Size);\n\n\t\t/* copy data body */\n\t\tNdisMoveMemory(skb->tail, pData, DataSize);\n\t\tskb_put(skb, DataSize);\n\t\tskb->dev = pNetDev;\t/*get_netdev_from_bssid(pAd, FromWhichBSSID); */\n\t\tpPacket = OSPKT_TO_RTPKT(skb);\n\t}\n\n\treturn pPacket;\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tSend a L2 frame to upper daemon to trigger state machine\n\n\tArguments:\n\t\tpAd - pointer to our pAdapter context\n\n\tReturn Value:\n\n\tNote:\n\n\t========================================================================\n*/\nBOOLEAN RTMPL2FrameTxAction(\n\tIN VOID * pCtrlBkPtr,\n\tIN PNET_DEV pNetDev,\n\tIN RTMP_CB_8023_PACKET_ANNOUNCE _announce_802_3_packet,\n\tIN UCHAR apidx,\n\tIN PUCHAR pData,\n\tIN UINT32 data_len,\n\tIN\tUCHAR\t\t\tOpMode)\n{\n\tstruct sk_buff *skb = dev_alloc_skb(data_len + 2);\n\n\tif (!skb) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s : Error! Can't allocate a skb.\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tMEM_DBG_PKT_ALLOC_INC(skb);\n\t/*get_netdev_from_bssid(pAd, apidx)); */\n\tSET_OS_PKT_NETDEV(skb, pNetDev);\n\n\t/* 16 byte align the IP header */\n\tskb_reserve(skb, 2);\n\n\t/* Insert the frame content */\n\tNdisMoveMemory(GET_OS_PKT_DATAPTR(skb), pData, data_len);\n\n\t/* End this frame */\n\tskb_put(GET_OS_PKT_TYPE(skb), data_len);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s doen\\n\", __FUNCTION__));\n\n\t_announce_802_3_packet(pCtrlBkPtr, skb, OpMode);\n\n\treturn TRUE;\n\n}\n\n\nPNDIS_PACKET ExpandPacket(\n\tIN VOID *pReserved,\n\tIN PNDIS_PACKET pPacket,\n\tIN UINT32 ext_head_len,\n\tIN UINT32 ext_tail_len)\n{\n\tstruct sk_buff *skb, *newskb;\n\n\tskb = RTPKT_TO_OSPKT(pPacket);\n\tif (skb_cloned(skb) || (skb_headroom(skb) < ext_head_len)\n\t    || (skb_tailroom(skb) < ext_tail_len)) {\n\t\tUINT32 head_len =\n\t\t    (skb_headroom(skb) <\n\t\t     ext_head_len) ? ext_head_len : skb_headroom(skb);\n\t\tUINT32 tail_len =\n\t\t    (skb_tailroom(skb) <\n\t\t     ext_tail_len) ? ext_tail_len : skb_tailroom(skb);\n\n\t\t/* alloc a new skb and copy the packet */\n\t\tnewskb = skb_copy_expand(skb, head_len, tail_len, GFP_ATOMIC);\n\n\t\tdev_kfree_skb_any(skb);\n\t\tMEM_DBG_PKT_FREE_INC(skb);\n\n\t\tif (newskb == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"Extend Tx buffer for WPI failed!, dropping packet!\\n\"));\n\t\t\treturn NULL;\n\t\t}\n\t\tskb = newskb;\n\t\tMEM_DBG_PKT_ALLOC_INC(skb);\n\t}\n\n\treturn OSPKT_TO_RTPKT(skb);\n\n}\n\nPNDIS_PACKET ClonePacket(\n\tIN VOID *pReserved,\n\tIN PNDIS_PACKET pPacket,\n\tIN PUCHAR pData,\n\tIN ULONG DataSize)\n{\n\tstruct sk_buff *pRxPkt;\n\tstruct sk_buff *pClonedPkt;\n\n\tASSERT(pPacket);\n\tpRxPkt = RTPKT_TO_OSPKT(pPacket);\n\n\t/* clone the packet */\n\tpClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);\n\n\tif (pClonedPkt) {\n\t\t/* set the correct dataptr and data len */\n\t\tMEM_DBG_PKT_ALLOC_INC(pClonedPkt);\n\t\tpClonedPkt->dev = pRxPkt->dev;\n\t\tpClonedPkt->data = pData;\n\t\tpClonedPkt->len = DataSize;\n\t\tpClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;\n\t\tASSERT(DataSize < 1530);\n\t}\n\treturn pClonedPkt;\n}\n\nVOID RtmpOsPktInit(\n\tIN PNDIS_PACKET pNetPkt,\n\tIN PNET_DEV pNetDev,\n\tIN UCHAR *pData,\n\tIN USHORT DataSize)\n{\n\tPNDIS_PACKET pRxPkt;\n\n\tpRxPkt = RTPKT_TO_OSPKT(pNetPkt);\n\n\tSET_OS_PKT_NETDEV(pRxPkt, pNetDev);\n\tSET_OS_PKT_DATAPTR(pRxPkt, pData);\n\tSET_OS_PKT_LEN(pRxPkt, DataSize);\n\tSET_OS_PKT_DATATAIL(pRxPkt, pData, DataSize);\n}\n\n\nvoid wlan_802_11_to_802_3_packet(\n\tIN PNET_DEV pNetDev,\n\tIN UCHAR OpMode,\n\tIN USHORT VLAN_VID,\n\tIN USHORT VLAN_Priority,\n\tIN PNDIS_PACKET pRxPacket,\n\tIN UCHAR *pData,\n\tIN ULONG DataSize,\n\tIN PUCHAR pHeader802_3,\n\tIN UCHAR FromWhichBSSID,\n\tIN UCHAR *TPID)\n{\n\tstruct sk_buff *pOSPkt;\n\n\tASSERT(pHeader802_3);\n\n\tpOSPkt = RTPKT_TO_OSPKT(pRxPacket);\n\n\t/*get_netdev_from_bssid(pAd, FromWhichBSSID); */\n\tpOSPkt->dev = pNetDev;\n\tpOSPkt->data = pData;\n\tpOSPkt->len = DataSize;\n\tpOSPkt->tail = pOSPkt->data + pOSPkt->len;\n\n\t/* copy 802.3 header */\n#ifdef CONFIG_AP_SUPPORT\n\tRT_CONFIG_IF_OPMODE_ON_AP(OpMode)\n\t{\n\t\t/* maybe insert VLAN tag to the received packet */\n\t\tUCHAR VLAN_Size = 0;\n\t\tUCHAR *data_p;\n\n\t\tif (VLAN_VID != 0)\n\t\t\tVLAN_Size = LENGTH_802_1Q;\n\n\t\tdata_p = skb_push(pOSPkt, LENGTH_802_3 + VLAN_Size);\n\n\t\tVLAN_8023_Header_Copy(VLAN_VID, VLAN_Priority,\n\t\t\t\t      pHeader802_3, LENGTH_802_3,\n\t\t\t\t      data_p, FromWhichBSSID, TPID);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tRT_CONFIG_IF_OPMODE_ON_STA(OpMode)\n\t{\n\t    NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID RtmpOsSetPacket(\n\tIN PNET_DEV pNetDev,\n\tIN PNDIS_PACKET pRxPacket,\n\tIN UCHAR *pData,\n\tIN ULONG DataSize)\n{\n\n\tstruct sk_buff *pOSPkt;\n\n\tpOSPkt = RTPKT_TO_OSPKT(pRxPacket);\n\n\tpOSPkt->dev = pNetDev;\n\tpOSPkt->data = pData;\n\tpOSPkt->len = DataSize;\n\tpOSPkt->tail = pOSPkt->data + pOSPkt->len;\n}\n\n#endif /* HDR_TRANS_SUPPORT */\n\n\nvoid hex_dump(char *str, UCHAR *pSrcBufVA, UINT SrcBufLen)\n{\n#ifdef DBG\n\tunsigned char *pt;\n\tint x;\n\n\tif (RTDebugLevel < RT_DEBUG_TRACE)\n\t\treturn;\n\n\tpt = pSrcBufVA;\n\tprintk(\"%s: %p, len = %d\\n\", str, pSrcBufVA, SrcBufLen);\n\tfor (x = 0; x < SrcBufLen; x++) {\n\t\tif (x % 16 == 0)\n\t\t\tprintk(\"0x%04x : \", x);\n\t\tprintk(\"%02x \", ((unsigned char)pt[x]));\n\t\tif (x % 16 == 15)\n\t\t\tprintk(\"\\n\");\n\t}\n\tprintk(\"\\n\");\n#endif /* DBG */\n}\n\n#ifdef SYSTEM_LOG_SUPPORT\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tSend log message through wireless event\n\n\t\tSupport standard iw_event with IWEVCUSTOM. It is used below.\n\n\t\tiwreq_data.data.flags is used to store event_flag that is\n\t\tdefined by user. iwreq_data.data.length is the length of the\n\t\tevent log.\n\n\t\tThe format of the event log is composed of the entry's MAC\n\t\taddress and the desired log message (refer to\n\t\tpWirelessEventText).\n\n\t\t\tex: 11:22:33:44:55:66 has associated successfully\n\n\t\tp.s. The requirement of Wireless Extension is v15 or newer.\n\n\t========================================================================\n*/\nVOID RtmpOsSendWirelessEvent(\n\tIN VOID *pAd,\n\tIN USHORT Event_flag,\n\tIN PUCHAR pAddr,\n\tIN UCHAR BssIdx,\n\tIN CHAR Rssi,\n\tIN RTMP_OS_SEND_WLAN_EVENT pFunc)\n{\n#if WIRELESS_EXT >= 15\n\tpFunc(pAd, Event_flag, pAddr, BssIdx, Rssi);\n#else\n\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t (\"%s : The Wireless Extension MUST be v15 or newer.\\n\",\n\t\t  __FUNCTION__));\n#endif /* WIRELESS_EXT >= 15 */\n}\n#endif /* SYSTEM_LOG_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\nVOID SendSignalToDaemon(\n\tIN INT sig,\n\tRTMP_OS_PID pid,\n\tunsigned long pid_no)\n{\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nINT32 ralinkrate[] = {\n2, 4, 11, 22,\t\t/* CCK */\n12, 18, 24, 36, 48, 72, 96, 108,\t/* OFDM */\n/* 20MHz, 800ns GI, MCS: 0 ~ 15 */\n13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260,\n39, 78, 117, 156, 234, 312, 351, 390,\t/* 20MHz, 800ns GI, MCS: 16 ~ 23 */\n/* 40MHz, 800ns GI, MCS: 0 ~ 15 */\n27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,\n81, 162, 243, 324, 486, 648, 729, 810,\t/* 40MHz, 800ns GI, MCS: 16 ~ 23 */\n/* 20MHz, 400ns GI, MCS: 0 ~ 15 */\n14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288,\n43, 87, 130, 173, 260, 317, 390, 433,\t/* 20MHz, 400ns GI, MCS: 16 ~ 23 */\n/* 40MHz, 400ns GI, MCS: 0 ~ 15 */\n30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,\n90, 180, 270, 360, 540, 720, 810, 900};\t/* 40MHz, 400ns GI, MCS: 16 ~ 23 */\n\nUINT32 RT_RateSize = sizeof (ralinkrate);\n\nvoid send_monitor_packets(IN PNET_DEV pNetDev,\n\t\t\t  IN PNDIS_PACKET pRxPacket,\n\t\t\t  IN PHEADER_802_11 pHeader,\n\t\t\t  IN UCHAR * pData,\n\t\t\t  IN USHORT DataSize,\n\t\t\t  IN UCHAR L2PAD,\n\t\t\t  IN UCHAR PHYMODE,\n\t\t\t  IN UCHAR BW,\n\t\t\t  IN UCHAR ShortGI,\n\t\t\t  IN UCHAR MCS,\n\t\t\t  IN UCHAR AMPDU,\n\t\t\t  IN UCHAR STBC,\n\t\t\t  IN UCHAR RSSI1,\n\t\t\t  IN UCHAR BssMonitorFlag11n,\n\t\t\t  IN UCHAR * pDevName,\n\t\t\t  IN UCHAR Channel,\n\t\t\t  IN UCHAR CentralChannel,\n\t\t\t  IN UINT32 MaxRssi) {\n\tstruct sk_buff *pOSPkt;\n\twlan_ng_prism2_header *ph;\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n\tETHEREAL_RADIO h,\n\t*ph_11n33;\t\t/* for new 11n sniffer format */\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\tint rate_index = 0;\n\tUSHORT header_len = 0;\n\tUCHAR temp_header[40] = {\n\t0};\n\n\tMEM_DBG_PKT_FREE_INC(pRxPacket);\n\n\n\tpOSPkt = RTPKT_TO_OSPKT(pRxPacket);\t/*pRxBlk->pRxPacket); */\n\tpOSPkt->dev = pNetDev;\t/*get_netdev_from_bssid(pAd, BSS0); */\n\tif (pHeader->FC.Type == BTYPE_DATA) {\n\t\tDataSize -= LENGTH_802_11;\n\t\tif ((pHeader->FC.ToDs == 1) && (pHeader->FC.FrDs == 1))\n\t\t\theader_len = LENGTH_802_11_WITH_ADDR4;\n\t\telse\n\t\t\theader_len = LENGTH_802_11;\n\n\t\t/* QOS */\n\t\tif (pHeader->FC.SubType & 0x08) {\n\t\t\theader_len += 2;\n\t\t\t/* Data skip QOS contorl field */\n\t\t\tDataSize -= 2;\n\t\t}\n\n\t\t/* Order bit: A-Ralink or HTC+ */\n\t\tif (pHeader->FC.Order) {\n\t\t\theader_len += 4;\n\t\t\t/* Data skip HTC contorl field */\n\t\t\tDataSize -= 4;\n\t\t}\n\n\t\t/* Copy Header */\n\t\tif (header_len <= 40)\n\t\t\tNdisMoveMemory(temp_header, pData, header_len);\n\n\t\t/* skip HW padding */\n\t\tif (L2PAD)\n\t\t\tpData += (header_len + 2);\n\t\telse\n\t\t\tpData += header_len;\n\t}\n\n\tif (DataSize < pOSPkt->len) {\n\t\tskb_trim(pOSPkt, DataSize);\n\t} else {\n\t\tskb_put(pOSPkt, (DataSize - pOSPkt->len));\n\t}\n\n\tif ((pData - pOSPkt->data) > 0) {\n\t\tskb_put(pOSPkt, (pData - pOSPkt->data));\n\t\tskb_pull(pOSPkt, (pData - pOSPkt->data));\n\t}\n\n\tif (skb_headroom(pOSPkt) < (sizeof (wlan_ng_prism2_header) + header_len)) {\n\t\tif (pskb_expand_head(pOSPkt, (sizeof (wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"%s : Reallocate header size of sk_buff fail!\\n\",\n\t\t\t\t  __FUNCTION__));\n\t\t\tgoto err_free_sk_buff;\n\t\t}\n\t}\n\n\tif (header_len > 0)\n\t\tNdisMoveMemory(skb_push(pOSPkt, header_len), temp_header,\n\t\t\t       header_len);\n\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n\tif (BssMonitorFlag11n == 0)\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\t{\n\t\tph = (wlan_ng_prism2_header *) skb_push(pOSPkt,\n\t\t\t\t\t\t\tsizeof(wlan_ng_prism2_header));\n\t\tNdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));\n\n\t\tph->msgcode = DIDmsg_lnxind_wlansniffrm;\n\t\tph->msglen = sizeof (wlan_ng_prism2_header);\n\t\tstrcpy((PSTRING) ph->devname, (PSTRING) pDevName);\n\n\t\tph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;\n\t\tph->hosttime.status = 0;\n\t\tph->hosttime.len = 4;\n\t\tph->hosttime.data = jiffies;\n\n\t\tph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;\n\t\tph->mactime.status = 0;\n\t\tph->mactime.len = 0;\n\t\tph->mactime.data = 0;\n\n\t\tph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;\n\t\tph->istx.status = 0;\n\t\tph->istx.len = 0;\n\t\tph->istx.data = 0;\n\n\t\tph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;\n\t\tph->channel.status = 0;\n\t\tph->channel.len = 4;\n\n\t\tph->channel.data = (u_int32_t) Channel;\n\n\t\tph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;\n\t\tph->rssi.status = 0;\n\t\tph->rssi.len = 4;\n\t\tph->rssi.data = MaxRssi;\n\t\tph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;\n\t\tph->signal.status = 0;\n\t\tph->signal.len = 4;\n\t\tph->signal.data = 0;\t/*rssi + noise; */\n\n\t\tph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;\n\t\tph->noise.status = 0;\n\t\tph->noise.len = 4;\n\t\tph->noise.data = 0;\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (PHYMODE >= MODE_HTMIX) {\n\t\t\trate_index = 12 + ((UCHAR) BW * 24) + ((UCHAR) ShortGI * 48) + ((UCHAR) MCS);\n\t\t} else\n#endif /* DOT11_N_SUPPORT */\n\t\tif (PHYMODE == MODE_OFDM)\n\t\t\trate_index = (UCHAR) (MCS) + 4;\n\t\telse\n\t\t\trate_index = (UCHAR) (MCS);\n\n\t\tif (rate_index < 0)\n\t\t\trate_index = 0;\n\t\tif (rate_index >= (sizeof (ralinkrate) / sizeof (ralinkrate[0])))\n\t\t\trate_index = (sizeof (ralinkrate) / sizeof (ralinkrate[0])) - 1;\n\n\t\tph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;\n\t\tph->rate.status = 0;\n\t\tph->rate.len = 4;\n\t\t/* real rate = ralinkrate[rate_index] / 2 */\n\t\tph->rate.data = ralinkrate[rate_index];\n\n\t\tph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;\n\t\tph->frmlen.status = 0;\n\t\tph->frmlen.len = 4;\n\t\tph->frmlen.data = (u_int32_t) DataSize;\n\t}\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n\telse {\n\t\tph_11n33 = &h;\n\t\tNdisZeroMemory((unsigned char *)ph_11n33,\n\t\t\t       sizeof (ETHEREAL_RADIO));\n\n\t\t/*802.11n fields */\n\t\tif (MCS > 15)\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_3x3;\n\n\t\tif (PHYMODE == MODE_HTGREENFIELD)\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_GF;\n\n\t\tif (BW == 1) {\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_BW40;\n\t\t} else if (Channel < CentralChannel) {\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_BW20U;\n\t\t} else if (Channel > CentralChannel) {\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_BW20D;\n\t\t} else {\n\t\t\tph_11n33->Flag_80211n |=\n\t\t\t    (WIRESHARK_11N_FLAG_BW20U |\n\t\t\t     WIRESHARK_11N_FLAG_BW20D);\n\t\t}\n\n\t\tif (ShortGI == 1)\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_SGI;\n\n\t\tif (AMPDU)\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_AMPDU;\n\n\t\tif (STBC)\n\t\t\tph_11n33->Flag_80211n |= WIRESHARK_11N_FLAG_STBC;\n\n\t\tph_11n33->signal_level = (UCHAR) RSSI1;\n\n\t\t/* data_rate is the rate index in the wireshark rate table */\n\t\tif (PHYMODE >= MODE_HTMIX) {\n\t\t\tif (MCS == 32) {\n\t\t\t\tif (ShortGI)\n\t\t\t\t\tph_11n33->data_rate = 16;\n\t\t\t\telse\n\t\t\t\t\tph_11n33->data_rate = 4;\n\t\t\t} else if (MCS > 15)\n\t\t\t\tph_11n33->data_rate =\n\t\t\t\t    (16 * 4 + ((UCHAR) BW * 16) +\n\t\t\t\t     ((UCHAR) ShortGI * 32) + ((UCHAR) MCS));\n\t\t\telse\n\t\t\t\tph_11n33->data_rate =\n\t\t\t\t    16 + ((UCHAR) BW * 16) +\n\t\t\t\t    ((UCHAR) ShortGI * 32) + ((UCHAR) MCS);\n\t\t} else if (PHYMODE == MODE_OFDM)\n\t\t\tph_11n33->data_rate = (UCHAR) (MCS) + 4;\n\t\telse\n\t\t\tph_11n33->data_rate = (UCHAR) (MCS);\n\n\t\t/*channel field */\n\t\tph_11n33->channel = (UCHAR) Channel;\n\n\t\tNdisMoveMemory(skb_put(pOSPkt, sizeof (ETHEREAL_RADIO)),\n\t\t\t       (UCHAR *) ph_11n33, sizeof (ETHEREAL_RADIO));\n\t}\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\n\tpOSPkt->pkt_type = PACKET_OTHERHOST;\n\tpOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);\n\tpOSPkt->ip_summed = CHECKSUM_NONE;\n\tnetif_rx(pOSPkt);\n\n\treturn;\n\n      err_free_sk_buff:\n\tRELEASE_NDIS_PACKET(NULL, pRxPacket, NDIS_STATUS_FAILURE);\n\treturn;\n\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/*******************************************************************************\n\n\tFile open/close related functions.\n\n *******************************************************************************/\nRTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode)\n{\n\tstruct file *filePtr;\n\n\tif (flag == RTMP_FILE_RDONLY)\n\t\tflag = O_RDONLY;\n\telse if (flag == RTMP_FILE_WRONLY)\n\t\tflag = O_WRONLY;\n\telse if (flag == RTMP_FILE_CREAT)\n\t\tflag = O_CREAT;\n\telse if (flag == RTMP_FILE_TRUNC)\n\t\tflag = O_TRUNC;\n\n\tfilePtr = filp_open(pPath, flag, 0);\n\tif (IS_ERR(filePtr)) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s(): Error %ld opening %s\\n\", __FUNCTION__,\n\t\t\t  -PTR_ERR(filePtr), pPath));\n\t}\n\n\treturn (RTMP_OS_FD) filePtr;\n}\n\nint RtmpOSFileClose(RTMP_OS_FD osfd)\n{\n\tfilp_close(osfd, NULL);\n\treturn 0;\n}\n\nvoid RtmpOSFileSeek(RTMP_OS_FD osfd, int offset)\n{\n\tosfd->f_pos = offset;\n}\n\n\nint RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)\n{\n\t/* The object must have a read method */\n\tif (osfd->f_op && osfd->f_op->read) {\n\t\treturn osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"no file read method\\n\"));\n\t\treturn -1;\n\t}\n}\n\nint RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)\n{\n\treturn osfd->f_op->write(osfd, pDataPtr, (size_t) writeLen, &osfd->f_pos);\n}\n\nstatic inline void __RtmpOSFSInfoChange(OS_FS_INFO * pOSFSInfo, BOOLEAN bSet)\n{\n\tif (bSet) {\n\t\t/* Save uid and gid used for filesystem access. */\n\t\t/* Set user and group to 0 (root) */\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)\n\t\tpOSFSInfo->fsuid = current->fsuid;\n\t\tpOSFSInfo->fsgid = current->fsgid;\n\t\tcurrent->fsuid = current->fsgid = 0;\n#else\n\t\tpOSFSInfo->fsuid = *(int*)&current_fsuid();\n\t\tpOSFSInfo->fsgid = *(int*)&current_fsgid();\n#endif\n\t\tpOSFSInfo->fs = get_fs();\n\t\tset_fs(KERNEL_DS);\n\t} else {\n\t\tset_fs(pOSFSInfo->fs);\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)\n\t\tcurrent->fsuid = pOSFSInfo->fsuid;\n\t\tcurrent->fsgid = pOSFSInfo->fsgid;\n#endif\n\t}\n}\n\n\n/*******************************************************************************\n\n\tTask create/management/kill related functions.\n\n *******************************************************************************/\nstatic inline NDIS_STATUS __RtmpOSTaskKill(OS_TASK *pTask)\n{\n\tint ret = NDIS_STATUS_FAILURE;\n\n#ifdef KTHREAD_SUPPORT\n\tif (pTask->kthread_task) {\n\t\tkthread_stop(pTask->kthread_task);\n\t\tret = NDIS_STATUS_SUCCESS;\n\t}\n#else\n\tCHECK_PID_LEGALITY(pTask->taskPID) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"Terminate the task(%s) with pid(%d)!\\n\",\n\t\t\t  pTask->taskName, GET_PID_NUMBER(pTask->taskPID)));\n\t\tmb();\n\t\tpTask->task_killed = 1;\n\t\tmb();\n\t\tret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1);\n\t\tif (ret) {\n\t\t\tprintk(KERN_WARNING\n\t\t\t       \"kill task(%s) with pid(%d) failed(retVal=%d)!\\n\",\n\t\t\t       pTask->taskName, GET_PID_NUMBER(pTask->taskPID),\n\t\t\t       ret);\n\t\t} else {\n\t\t\twait_for_completion(&pTask->taskComplete);\n\t\t\tpTask->taskPID = THREAD_PID_INIT_VALUE;\n\t\t\tpTask->task_killed = 0;\n\t\t\tRTMP_SEM_EVENT_DESTORY(&pTask->taskSema);\n\t\t\tret = NDIS_STATUS_SUCCESS;\n\t\t}\n\t}\n#endif\n\n\treturn ret;\n\n}\n\nstatic inline INT __RtmpOSTaskNotifyToExit(OS_TASK *pTask)\n{\n#ifndef KTHREAD_SUPPORT\n\tpTask->taskPID = THREAD_PID_INIT_VALUE;\n\tcomplete_and_exit(&pTask->taskComplete, 0);\n#endif\n\n\treturn 0;\n}\n\nstatic inline void __RtmpOSTaskCustomize(OS_TASK *pTask)\n{\n#ifndef KTHREAD_SUPPORT\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\tdaemonize((PSTRING) & pTask->taskName[0] /*\"%s\",pAd->net_dev->name */ );\n\n\tallow_signal(SIGTERM);\n\tallow_signal(SIGKILL);\n\tcurrent->flags |= PF_NOFREEZE;\n#else\n\tunsigned long flags;\n\n\tdaemonize();\n\treparent_to_init();\n\tstrcpy(current->comm, &pTask->taskName[0]);\n\n\tsiginitsetinv(&current->blocked, sigmask(SIGTERM) | sigmask(SIGKILL));\n\n\t/* Allow interception of SIGKILL only\n\t * Don't allow other signals to interrupt the transmission */\n#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)\n\tspin_lock_irqsave(&current->sigmask_lock, flags);\n\tflush_signals(current);\n\trecalc_sigpending(current);\n\tspin_unlock_irqrestore(&current->sigmask_lock, flags);\n#endif\n#endif\n\n\tRTMP_GET_OS_PID(pTask->taskPID, current->pid);\n\n\t/* signal that we've started the thread */\n\tcomplete(&pTask->taskComplete);\n\n#endif\n}\n\nstatic inline NDIS_STATUS __RtmpOSTaskAttach(\n\tIN OS_TASK *pTask,\n\tIN RTMP_OS_TASK_CALLBACK fn,\n\tIN ULONG arg)\n{\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n#ifndef KTHREAD_SUPPORT\n\tpid_t pid_number = -1;\n#endif /* KTHREAD_SUPPORT */\n\n#ifdef KTHREAD_SUPPORT\n\tpTask->task_killed = 0;\n\tpTask->kthread_task = NULL;\n\tpTask->kthread_task =\n\t    kthread_run((cast_fn) fn, (void *)arg, pTask->taskName);\n\tif (IS_ERR(pTask->kthread_task))\n\t\tstatus = NDIS_STATUS_FAILURE;\n#else\n\tpid_number =\n\t    kernel_thread((cast_fn) fn, (void *)arg, RTMP_OS_MGMT_TASK_FLAGS);\n\tif (pid_number < 0) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"Attach task(%s) failed!\\n\", pTask->taskName));\n\t\tstatus = NDIS_STATUS_FAILURE;\n\t} else {\n\t\t/* Wait for the thread to start */\n\t\twait_for_completion(&pTask->taskComplete);\n\t\tstatus = NDIS_STATUS_SUCCESS;\n\t}\n#endif\n\treturn status;\n}\n\nstatic inline NDIS_STATUS __RtmpOSTaskInit(\n\tIN OS_TASK *pTask,\n\tIN PSTRING pTaskName,\n\tIN VOID *pPriv,\n\tIN LIST_HEADER *pSemList)\n{\n\tint len;\n\n\tASSERT(pTask);\n\n#ifndef KTHREAD_SUPPORT\n\tNdisZeroMemory((PUCHAR) (pTask), sizeof (OS_TASK));\n#endif\n\n\tlen = strlen(pTaskName);\n\tlen = len > (RTMP_OS_TASK_NAME_LEN - 1) ? (RTMP_OS_TASK_NAME_LEN - 1) : len;\n\tNdisMoveMemory(&pTask->taskName[0], pTaskName, len);\n\tpTask->priv = pPriv;\n\n#ifndef KTHREAD_SUPPORT\n\tRTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema), pSemList);\n\tpTask->taskPID = THREAD_PID_INIT_VALUE;\n\tinit_completion(&pTask->taskComplete);\n#endif\n\n#ifdef KTHREAD_SUPPORT\n\tinit_waitqueue_head(&(pTask->kthread_q));\n#endif /* KTHREAD_SUPPORT */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\nBOOLEAN __RtmpOSTaskWait(\n\tIN VOID *pReserved,\n\tIN OS_TASK *pTask,\n\tIN INT32 *pStatus)\n{\n#ifdef KTHREAD_SUPPORT\n\tRTMP_WAIT_EVENT_INTERRUPTIBLE((*pStatus), pTask);\n\n\tif ((pTask->task_killed == 1) || ((*pStatus) != 0))\n\t\treturn FALSE;\n#else\n\n\tRTMP_SEM_EVENT_WAIT(&(pTask->taskSema), (*pStatus));\n\n\t/* unlock the device pointers */\n\tif ((*pStatus) != 0) {\n/*\t\tRTMP_SET_FLAG_(*pFlags, fRTMP_ADAPTER_HALT_IN_PROGRESS); */\n\t\treturn FALSE;\n\t}\n#endif /* KTHREAD_SUPPORT */\n\n\treturn TRUE;\n}\n\n\n#if LINUX_VERSION_CODE <= 0x20402\t/* Red Hat 7.1 */\nstruct net_device *alloc_netdev(\n\tint sizeof_priv,\n\tconst char *mask,\n\tvoid (*setup) (struct net_device *))\n{\n\tstruct net_device *dev;\n\tINT alloc_size;\n\n\t/* ensure 32-byte alignment of the private area */\n\talloc_size = sizeof (*dev) + sizeof_priv + 31;\n\n\tdev = (struct net_device *)kmalloc(alloc_size, GFP_KERNEL);\n\tif (dev == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"alloc_netdev: Unable to allocate device memory.\\n\"));\n\t\treturn NULL;\n\t}\n\n\tmemset(dev, 0, alloc_size);\n\n\tif (sizeof_priv)\n\t\tdev->priv = (void *)(((long)(dev + 1) + 31) & ~31);\n\n\tsetup(dev);\n\tstrcpy(dev->name, mask);\n\n\treturn dev;\n}\n#endif /* LINUX_VERSION_CODE */\n\n\nstatic UINT32 RtmpOSWirelessEventTranslate(IN UINT32 eventType)\n{\n\tswitch (eventType) {\n\tcase RT_WLAN_EVENT_CUSTOM:\n\t\teventType = IWEVCUSTOM;\n\t\tbreak;\n\n\tcase RT_WLAN_EVENT_CGIWAP:\n\t\teventType = SIOCGIWAP;\n\t\tbreak;\n\n#if WIRELESS_EXT > 17\n\tcase RT_WLAN_EVENT_ASSOC_REQ_IE:\n\t\teventType = IWEVASSOCREQIE;\n\t\tbreak;\n#endif /* WIRELESS_EXT */\n\n#if WIRELESS_EXT >= 14\n\tcase RT_WLAN_EVENT_SCAN:\n\t\teventType = SIOCGIWSCAN;\n\t\tbreak;\n#endif /* WIRELESS_EXT */\n\n\tcase RT_WLAN_EVENT_EXPIRED:\n\t\teventType = IWEVEXPIRED;\n\t\tbreak;\n#ifdef P2P_SUPPORT\n\tcase RT_WLAN_EVENT_SHOWPIN:\n\t\teventType = 0x8C05; /* IWEVP2PKEYSHOWPIN; */\n\t\tbreak;\n\tcase RT_WLAN_EVENT_PIN:\n\t\teventType = 0x8C06; /* IWEVP2PKEYPIN; */\n\t\tbreak;\n#endif /* P2P_SUPPORT */\n\n\tdefault:\n\t\tprintk(\"Unknown event: 0x%x\\n\", eventType);\n\t\tbreak;\n\t}\n\n\treturn eventType;\n}\n\nint RtmpOSWrielessEventSend(\n\tIN PNET_DEV pNetDev,\n\tIN UINT32 eventType,\n\tIN INT flags,\n\tIN PUCHAR pSrcMac,\n\tIN PUCHAR pData,\n\tIN UINT32 dataLen)\n{\n\tunion iwreq_data wrqu;\n\n\t/* translate event type */\n\teventType = RtmpOSWirelessEventTranslate(eventType);\n\n\tmemset(&wrqu, 0, sizeof (wrqu));\n\n\tif (flags > -1)\n\t\twrqu.data.flags = flags;\n\n\tif (pSrcMac)\n\t\tmemcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);\n\n\tif ((pData != NULL) && (dataLen > 0))\n\t\twrqu.data.length = dataLen;\n\telse\n\t\twrqu.data.length = 0;\n\n\twireless_send_event(pNetDev, eventType, &wrqu, (char *)pData);\n\treturn 0;\n}\n\nint RtmpOSWrielessEventSendExt(\n\tIN PNET_DEV pNetDev,\n\tIN UINT32 eventType,\n\tIN INT flags,\n\tIN PUCHAR pSrcMac,\n\tIN PUCHAR pData,\n\tIN UINT32 dataLen,\n\tIN UINT32 family)\n{\n\tunion iwreq_data wrqu;\n\n\t/* translate event type */\n\teventType = RtmpOSWirelessEventTranslate(eventType);\n\n\t/* translate event type */\n\tmemset(&wrqu, 0, sizeof (wrqu));\n\n\tif (flags > -1)\n\t\twrqu.data.flags = flags;\n\n\tif (pSrcMac)\n\t\tmemcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);\n\n\tif ((pData != NULL) && (dataLen > 0))\n\t\twrqu.data.length = dataLen;\n\n\twrqu.addr.sa_family = family;\n\n\twireless_send_event(pNetDev, eventType, &wrqu, (char *)pData);\n\treturn 0;\n}\n\nint RtmpOSNetDevAddrSet(\n\tIN UCHAR OpMode,\n\tIN PNET_DEV pNetDev,\n\tIN PUCHAR pMacAddr,\n\tIN PUCHAR dev_name)\n{\n\tstruct net_device *net_dev;\n\n\tnet_dev = pNetDev;\n/*\tGET_PAD_FROM_NET_DEV(pAd, net_dev); */\n\n#ifdef CONFIG_STA_SUPPORT\n\t/* work-around for the SuSE due to it has it's own interface name management system. */\n\tRT_CONFIG_IF_OPMODE_ON_STA(OpMode) {\n/*\t\tNdisZeroMemory(pAd->StaCfg.dev_name, 16); */\n/*\t\tNdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name, strlen(net_dev->name)); */\n\t\tif (dev_name != NULL) {\n\t\t\tNdisZeroMemory(dev_name, 16);\n\t\t\tNdisMoveMemory(dev_name, net_dev->name, strlen(net_dev->name));\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\tNdisMoveMemory(net_dev->dev_addr, pMacAddr, 6);\n\n\treturn 0;\n}\n\n/*\n  *\tAssign the network dev name for created Ralink WiFi interface.\n  */\nstatic int RtmpOSNetDevRequestName(\n\tIN INT32 MC_RowID,\n\tIN UINT32 *pIoctlIF,\n\tIN PNET_DEV dev,\n\tIN PSTRING pPrefixStr,\n\tIN INT devIdx)\n{\n\tPNET_DEV existNetDev;\n\tSTRING suffixName[IFNAMSIZ];\n\tSTRING desiredName[IFNAMSIZ];\n\tint ifNameIdx,\n\t prefixLen,\n\t slotNameLen;\n\tint Status;\n\n\tprefixLen = strlen(pPrefixStr);\n\tASSERT((prefixLen < IFNAMSIZ));\n\n\tfor (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) {\n\t\tmemset(suffixName, 0, IFNAMSIZ);\n\t\tmemset(desiredName, 0, IFNAMSIZ);\n\t\tstrncpy(&desiredName[0], pPrefixStr, prefixLen);\n\n#ifdef MULTIPLE_CARD_SUPPORT\n\t\tif (MC_RowID >= 0)\n\t\t\tsprintf(suffixName, \"%02d_%d\", MC_RowID, ifNameIdx);\n\t\telse\n#endif /* MULTIPLE_CARD_SUPPORT */\n\t\t\tsprintf(suffixName, \"%d\", ifNameIdx);\n\n\t\tslotNameLen = strlen(suffixName);\n\t\tASSERT(((slotNameLen + prefixLen) < IFNAMSIZ));\n\t\tstrcat(desiredName, suffixName);\n\n\t\texistNetDev = RtmpOSNetDevGetByName(dev, &desiredName[0]);\n\t\tif (existNetDev == NULL)\n\t\t\tbreak;\n\t\telse\n\t\t\tRtmpOSNetDeviceRefPut(existNetDev);\n\t}\n\n\tif (ifNameIdx < 32) {\n#ifdef HOSTAPD_SUPPORT\n\t\t*pIoctlIF = ifNameIdx;\n#endif /*HOSTAPD_SUPPORT */\n\t\tstrcpy(&dev->name[0], &desiredName[0]);\n\t\tStatus = NDIS_STATUS_SUCCESS;\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\\n\",\n\t\t\t  pPrefixStr));\n\t\tStatus = NDIS_STATUS_FAILURE;\n\t}\n\n\treturn Status;\n}\n\nvoid RtmpOSNetDevClose(PNET_DEV pNetDev)\n{\n\tdev_close(pNetDev);\n}\n\nvoid RtmpOSNetDevFree(PNET_DEV pNetDev)\n{\n\tDEV_PRIV_INFO *pDevInfo = NULL;\n\n\n\tASSERT(pNetDev);\n\n\t/* free assocaited private information */\n\tpDevInfo = _RTMP_OS_NETDEV_GET_PRIV(pNetDev);\n\tif (pDevInfo != NULL)\n\t\tos_free_mem(NULL, pDevInfo);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\tfree_netdev(pNetDev);\n#else\n\tkfree(pNetDev);\n#endif\n\n#ifdef VENDOR_FEATURE4_SUPPORT\n\tprintk(\"OS_NumOfMemAlloc = %ld, OS_NumOfMemFree = %ld\\n\",\n\t\t\tOS_NumOfMemAlloc, OS_NumOfMemFree);\n#endif /* VENDOR_FEATURE4_SUPPORT */\n#ifdef VENDOR_FEATURE2_SUPPORT\n\tprintk(\"OS_NumOfPktAlloc = %ld, OS_NumOfPktFree = %ld\\n\",\n\t\t\tOS_NumOfPktAlloc, OS_NumOfPktFree);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n}\n\nINT RtmpOSNetDevAlloc(\n\tIN PNET_DEV *new_dev_p,\n\tIN UINT32 privDataSize)\n{\n\t*new_dev_p = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"Allocate a net device with private data size=%d!\\n\",\n\t\t  privDataSize));\n#if LINUX_VERSION_CODE <= 0x20402\t/* Red Hat 7.1 */\n\t*new_dev_p = alloc_netdev(privDataSize, \"eth%d\", ether_setup);\n#else\n\t*new_dev_p = alloc_etherdev(privDataSize);\n#endif /* LINUX_VERSION_CODE */\n\n\tif (*new_dev_p)\n\t\treturn NDIS_STATUS_SUCCESS;\n\telse\n\t\treturn NDIS_STATUS_FAILURE;\n}\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\nINT RtmpOSNetDevOpsAlloc(PVOID *pNetDevOps)\n{\n\t*pNetDevOps = (PVOID) vmalloc(sizeof (struct net_device_ops));\n\tif (*pNetDevOps) {\n\t\tNdisZeroMemory(*pNetDevOps, sizeof (struct net_device_ops));\n\t\treturn NDIS_STATUS_SUCCESS;\n\t} else {\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n}\n#endif\n\n\nPNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName)\n{\n\tPNET_DEV pTargetNetDev = NULL;\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)\n\tpTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName);\n#else\n\tASSERT(pNetDev);\n\tpTargetNetDev = dev_get_by_name(pNetDev->nd_net, pDevName);\n#endif\n#else\n\tpTargetNetDev = dev_get_by_name(pDevName);\n#endif /* KERNEL_VERSION(2,6,24) */\n\n#else\n\tint devNameLen;\n\n\tdevNameLen = strlen(pDevName);\n\tASSERT((devNameLen <= IFNAMSIZ));\n\n\tfor (pTargetNetDev = dev_base; pTargetNetDev != NULL;\n\t     pTargetNetDev = pTargetNetDev->next) {\n\t\tif (strncmp(pTargetNetDev->name, pDevName, devNameLen) == 0)\n\t\t\tbreak;\n\t}\n#endif /* KERNEL_VERSION(2,5,0) */\n\n\treturn pTargetNetDev;\n}\n\n\nvoid RtmpOSNetDeviceRefPut(PNET_DEV pNetDev)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\t/* \n\t   every time dev_get_by_name is called, and it has returned a valid struct \n\t   net_device*, dev_put should be called afterwards, because otherwise the \n\t   machine hangs when the device is unregistered (since dev->refcnt > 1).\n\t */\n\tif (pNetDev)\n\t\tdev_put(pNetDev);\n#endif /* LINUX_VERSION_CODE */\n}\n\n\nINT RtmpOSNetDevDestory(VOID *pReserved, PNET_DEV pNetDev)\n{\n\n\t/* TODO: Need to fix this */\n\tprintk(\"WARNING: This function(%s) not implement yet!!!\\n\",\n\t       __FUNCTION__);\n\treturn 0;\n}\n\n\nvoid RtmpOSNetDevDetach(PNET_DEV pNetDev)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\tstruct net_device_ops *pNetDevOps = (struct net_device_ops *)pNetDev->netdev_ops;\n#endif\n\tint ret;\n\n\t ret = rtnl_trylock();\n\n\tunregister_netdevice(pNetDev);\n\n\tif ( ret )\n\t\trtnl_unlock();\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\tvfree(pNetDevOps);\n#endif\n}\n\n\nvoid RtmpOSNetDevProtect(BOOLEAN lock_it)\n{\n\n/*\n\tif (lock_it)\n\t\trtnl_lock();\n\telse\n\t\trtnl_unlock();\n*/\n}\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)\nstatic void RALINK_ET_DrvInfoGet(\n\tstruct net_device *pDev,\n\tstruct ethtool_drvinfo *pInfo)\n{\n\tstrcpy(pInfo->driver, \"RALINK WLAN\");\n\n\n\tsprintf(pInfo->bus_info, \"CSR 0x%lx\", pDev->base_addr);\n}\n\nstatic struct ethtool_ops RALINK_Ethtool_Ops = {\n\t.get_drvinfo = RALINK_ET_DrvInfoGet,\n};\n#endif\n\n\nint RtmpOSNetDevAttach(\n\tIN UCHAR OpMode,\n\tIN PNET_DEV pNetDev,\n\tIN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook)\n{\n\tint ret,\n\t rtnl_locked = FALSE;\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\tstruct net_device_ops *pNetDevOps = (struct net_device_ops *)pNetDev->netdev_ops;\n#endif\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RtmpOSNetDevAttach()--->\\n\"));\n\n\t/* If we need hook some callback function to the net device structrue, now do it. */\n\tif (pDevOpHook) {\n/*\t\tPRTMP_ADAPTER pAd = NULL; */\n\n/*\t\tGET_PAD_FROM_NET_DEV(pAd, pNetDev); */\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\t\tpNetDevOps->ndo_open = pDevOpHook->open;\n\t\tpNetDevOps->ndo_stop = pDevOpHook->stop;\n\t\tpNetDevOps->ndo_start_xmit =\n\t\t    (HARD_START_XMIT_FUNC) (pDevOpHook->xmit);\n\t\tpNetDevOps->ndo_do_ioctl = pDevOpHook->ioctl;\n#else\n\t\tpNetDev->open = pDevOpHook->open;\n\t\tpNetDev->stop = pDevOpHook->stop;\n\t\tpNetDev->hard_start_xmit =\n\t\t    (HARD_START_XMIT_FUNC) (pDevOpHook->xmit);\n\t\tpNetDev->do_ioctl = pDevOpHook->ioctl;\n#endif\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)\n\t\tpNetDev->ethtool_ops = &RALINK_Ethtool_Ops;\n#endif\n\n\t\t/* if you don't implement get_stats, just leave the callback function as NULL, a dummy \n\t\t   function will make kernel panic.\n\t\t */\n\t\tif (pDevOpHook->get_stats)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\t\t\tpNetDevOps->ndo_get_stats = pDevOpHook->get_stats;\n#else\n\t\t\tpNetDev->get_stats = pDevOpHook->get_stats;\n#endif\n\n\t\t/* OS specific flags, here we used to indicate if we are virtual interface */\n/*\t\tpNetDev->priv_flags = pDevOpHook->priv_flags; */\n\t\tRT_DEV_PRIV_FLAGS_SET(pNetDev, pDevOpHook->priv_flags);\n\n#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12)\n/*\t\tpNetDev->get_wireless_stats = rt28xx_get_wireless_stats; */\n\t\tpNetDev->get_wireless_stats = pDevOpHook->get_wstats;\n#endif\n\n#ifdef CONFIG_STA_SUPPORT\n#if WIRELESS_EXT >= 12\n\t\tif (OpMode == OPMODE_STA) {\n/*\t\t\tpNetDev->wireless_handlers = &rt28xx_iw_handler_def; */\n\t\t\tpNetDev->wireless_handlers = pDevOpHook->iw_handler;\n\t\t}\n#endif /*WIRELESS_EXT >= 12 */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n#if WIRELESS_EXT >= 12\n\t\tif (OpMode == OPMODE_AP) {\n/*\t\t\tpNetDev->wireless_handlers = &rt28xx_ap_iw_handler_def; */\n\t\t\tpNetDev->wireless_handlers = pDevOpHook->iw_handler;\n\t\t}\n#endif /*WIRELESS_EXT >= 12 */\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\t\t/* copy the net device mac address to the net_device structure. */\n\t\tNdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0],\n\t\t\t       MAC_ADDR_LEN);\n\n\t\trtnl_locked = pDevOpHook->needProtcted;\n\n\t}\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\tpNetDevOps->ndo_validate_addr = NULL;\n\t/*pNetDev->netdev_ops = ops; */\n#else\n\tpNetDev->validate_addr = NULL;\n#endif\n#endif\n\n\tif (rtnl_locked)\n\t\tret = register_netdevice(pNetDev);\n\telse\n\t\tret = register_netdev(pNetDev);\n\n\tnetif_stop_queue(pNetDev);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<---RtmpOSNetDevAttach(), ret=%d\\n\", ret));\n\tif (ret == 0)\n\t\treturn NDIS_STATUS_SUCCESS;\n\telse\n\t\treturn NDIS_STATUS_FAILURE;\n}\n\nPNET_DEV RtmpOSNetDevCreate(\n\tIN INT32 MC_RowID,\n\tIN UINT32 *pIoctlIF,\n\tIN INT devType,\n\tIN INT devNum,\n\tIN INT privMemSize,\n\tIN PSTRING pNamePrefix)\n{\n\tstruct net_device *pNetDev = NULL;\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\tstruct net_device_ops *pNetDevOps = NULL;\n#endif\n\tint status;\n\n\t/* allocate a new network device */\n\tstatus = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize */ );\n\tif (status != NDIS_STATUS_SUCCESS) {\n\t\t/* allocation fail, exit */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Allocate network device fail (%s)...\\n\", pNamePrefix));\n\t\treturn NULL;\n\t}\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)\n\tstatus = RtmpOSNetDevOpsAlloc((PVOID) & pNetDevOps);\n\tif (status != NDIS_STATUS_SUCCESS) {\n\t\t/* error! no any available ra name can be used! */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Allocate net device ops fail!\\n\"));\n\t\tRtmpOSNetDevFree(pNetDev);\n\n\t\treturn NULL;\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Allocate net device ops success!\\n\"));\n\t\tpNetDev->netdev_ops = pNetDevOps;\n\t}\n#endif\n\t/* find a available interface name, max 32 interfaces */\n\tstatus = RtmpOSNetDevRequestName(MC_RowID, pIoctlIF, pNetDev, pNamePrefix, devNum);\n\tif (status != NDIS_STATUS_SUCCESS) {\n\t\t/* error! no any available ra name can be used! */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Assign interface name (%s with suffix 0~32) failed...\\n\",\n\t\t\t  pNamePrefix));\n\t\tRtmpOSNetDevFree(pNetDev);\n\n\t\treturn NULL;\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"The name of the new %s interface is %s...\\n\",\n\t\t\t  pNamePrefix, pNetDev->name));\n\t}\n\n\treturn pNetDev;\n}\n\n\n\n#ifdef CONFIG_AP_SUPPORT\nUCHAR VLAN_8023_Header_Copy(\n\tIN USHORT VLAN_VID,\n\tIN USHORT VLAN_Priority,\n\tIN PUCHAR pHeader802_3,\n\tIN UINT HdrLen,\n\tOUT PUCHAR pData,\n\tIN UCHAR FromWhichBSSID,\n\tIN UCHAR *TPID)\n{\n\tUINT16 TCI;\n\tUCHAR VLAN_Size = 0;\n\n\tif (VLAN_VID != 0) {\n\t\t/* need to insert VLAN tag */\n\t\tVLAN_Size = LENGTH_802_1Q;\n\n\t\t/* make up TCI field */\n\t\tTCI = (VLAN_VID & 0x0fff) | ((VLAN_Priority & 0x7) << 13);\n\n#ifndef RT_BIG_ENDIAN\n\t\tTCI = SWAP16(TCI);\n#endif /* RT_BIG_ENDIAN */\n\n\t\t/* copy dst + src MAC (12B) */\n\t\tmemcpy(pData, pHeader802_3, LENGTH_802_3_NO_TYPE);\n\n\t\t/* copy VLAN tag (4B) */\n\t\t/* do NOT use memcpy to speed up */\n\t\t*(UINT16 *) (pData + LENGTH_802_3_NO_TYPE) = *(UINT16 *) TPID;\n\t\t*(UINT16 *) (pData + LENGTH_802_3_NO_TYPE + 2) = TCI;\n\n\t\t/* copy type/len (2B) */\n\t\t*(UINT16 *) (pData + LENGTH_802_3_NO_TYPE + LENGTH_802_1Q) =\n\t\t    *(UINT16 *) & pHeader802_3[LENGTH_802_3 -\n\t\t\t\t\t       LENGTH_802_3_TYPE];\n\n\t\t/* copy tail if exist */\n\t\tif (HdrLen > LENGTH_802_3)\n\t\t\tmemcpy(pData + LENGTH_802_3 + LENGTH_802_1Q, pHeader802_3 + LENGTH_802_3, HdrLen - LENGTH_802_3);\n\t}\n\telse\n\t{\n\t\t/* no VLAN tag is needed to insert */\n\t\tmemcpy(pData, pHeader802_3, HdrLen);\n\t}\n\t\n\treturn VLAN_Size;\n}\t\t\t\t\n#endif /* CONFIG_AP_SUPPORT */\n\n\n/*\n========================================================================\nRoutine Description:\n    Allocate memory for adapter control block.\n\nArguments:\n    pAd\t\t\t\t\tPointer to our adapter\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\tNDIS_STATUS_RESOURCES\n\nNote:\n========================================================================\n*/\nNDIS_STATUS AdapterBlockAllocateMemory(VOID *handle, VOID **ppAd, UINT32 SizeOfpAd)\n{\n#ifdef OS_ABL_FUNC_SUPPORT\n\t/* get offset for sk_buff */\n\t{\n\t\tstruct sk_buff *pPkt = NULL;\n\n\t\tpPkt = kmalloc(sizeof (struct sk_buff), GFP_ATOMIC);\n\t\tif (pPkt == NULL) {\n\t\t\t*ppAd = NULL;\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\n\t\tRTPktOffsetData = (ULONG) (&(pPkt->data)) - (ULONG) pPkt;\n\t\tRTPktOffsetLen = (ULONG) (&(pPkt->len)) - (ULONG) pPkt;\n\t\tRTPktOffsetCB = (ULONG) (pPkt->cb) - (ULONG) pPkt;\n\t\tkfree(pPkt);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"packet> data offset = %lu\\n\", RTPktOffsetData));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"packet> len offset = %lu\\n\", RTPktOffsetLen));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"packet> cb offset = %lu\\n\", RTPktOffsetCB));\n\t}\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n/*\t*ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); */\n\t*ppAd = (PVOID) vmalloc(SizeOfpAd);\t/*pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); */\n\tif (*ppAd) {\n\t\tNdisZeroMemory(*ppAd, SizeOfpAd);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t} else\n\t\treturn NDIS_STATUS_FAILURE;\n}\n\n\n/* ========================================================================== */\n\nUINT RtmpOsWirelessExtVerGet(VOID)\n{\n\treturn WIRELESS_EXT;\n}\n\n\nVOID RtmpDrvAllMacPrint(\n\tIN VOID *pReserved,\n\tIN UINT32 *pBufMac,\n\tIN UINT32 AddrStart,\n\tIN UINT32 AddrEnd,\n\tIN UINT32 AddrStep)\n{\n\tstruct file *file_w;\n\tPSTRING fileName = \"MacDump.txt\";\n\tmm_segment_t orig_fs;\n\tSTRING *msg;\n\tUINT32 macAddr = 0, macValue = 0;\n\n\tos_alloc_mem(NULL, (UCHAR **)&msg, 1024);\n\tif (!msg)\n\t\treturn;\n\t\n\torig_fs = get_fs();\n\tset_fs(KERNEL_DS);\n\n\t/* open file */\n\tfile_w = filp_open(fileName, O_WRONLY | O_CREAT, 0);\n\tif (IS_ERR(file_w)) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"-->2) %s: Error %ld opening %s\\n\", __FUNCTION__,\n\t\t\t  -PTR_ERR(file_w), fileName));\n\t} else {\n\t\tif (file_w->f_op && file_w->f_op->write) {\n\t\t\tfile_w->f_pos = 0;\n\t\t\tmacAddr = AddrStart;\n\n\t\t\twhile (macAddr <= AddrEnd) {\n/*\t\t\t\tRTMP_IO_READ32(pAd, macAddr, &macValue); // sample */\n\t\t\t\tmacValue = *pBufMac++;\n\t\t\t\tsprintf(msg, \"%04x = %08x\\n\", macAddr, macValue);\n\n\t\t\t\t/* write data to file */\n\t\t\t\tfile_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos);\n\n\t\t\t\tprintk(\"%s\", msg);\n\t\t\t\tmacAddr += AddrStep;\n\t\t\t}\n\t\t\tsprintf(msg, \"\\nDump all MAC values to %s\\n\", fileName);\n\t\t}\n\t\tfilp_close(file_w, NULL);\n\t}\n\tset_fs(orig_fs);\n\tos_free_mem(NULL, msg);\n}\n\n\nVOID RtmpDrvAllE2PPrint(\n\tIN VOID *pReserved,\n\tIN USHORT *pMacContent,\n\tIN UINT32 AddrEnd,\n\tIN UINT32 AddrStep)\n{\n\tstruct file *file_w;\n\tPSTRING fileName = \"EEPROMDump.txt\";\n\tmm_segment_t orig_fs;\n\tSTRING *msg;\n\tUSHORT eepAddr = 0;\n\tUSHORT eepValue;\n\n\tos_alloc_mem(NULL, (UCHAR **)&msg, 1024);\n\tif (!msg)\n\t\treturn;\n\t\n\torig_fs = get_fs();\n\tset_fs(KERNEL_DS);\n\t\n\t/* open file */\n\tfile_w = filp_open(fileName, O_WRONLY | O_CREAT, 0);\n\tif (IS_ERR(file_w)) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"-->2) %s: Error %ld opening %s\\n\", __FUNCTION__,\n\t\t\t  -PTR_ERR(file_w), fileName));\n\t} else {\n\t\tif (file_w->f_op && file_w->f_op->write) {\n\t\t\tfile_w->f_pos = 0;\n\t\t\teepAddr = 0x00;\n\n\t\t\twhile (eepAddr <= AddrEnd) {\n\t\t\t\teepValue = *pMacContent;\n\t\t\t\tsprintf(msg, \"%08x = %04x\\n\", eepAddr, eepValue);\n\n\t\t\t\t/* write data to file */\n\t\t\t\tfile_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos);\n\n\t\t\t\tprintk(\"%s\", msg);\n\t\t\t\teepAddr += AddrStep;\n\t\t\t\tpMacContent += (AddrStep >> 1);\n\t\t\t}\n\t\t\tsprintf(msg, \"\\nDump all EEPROM values to %s\\n\",\n\t\t\t\tfileName);\n\t\t}\n\t\tfilp_close(file_w, NULL);\n\t}\n\tset_fs(orig_fs);\n\tos_free_mem(NULL, msg);\n}\n\n\nVOID RtmpDrvAllRFPrint(\n\tIN VOID *pReserved,\n\tIN UINT32 *pBuf,\n\tIN UINT32 BufLen)\n{\n\tstruct file *file_w;\n\tPSTRING fileName = \"RFDump.txt\";\n\tmm_segment_t orig_fs;\n\tUINT32 macAddr = 0, macValue = 0;\n\t\n\torig_fs = get_fs();\n\tset_fs(KERNEL_DS);\n\n\t/* open file */\n\tfile_w = filp_open(fileName, O_WRONLY | O_CREAT, 0);\n\tif (IS_ERR(file_w)) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"-->2) %s: Error %ld opening %s\\n\", __FUNCTION__,\n\t\t\t  -PTR_ERR(file_w), fileName));\n\t} else {\n\t\tif (file_w->f_op && file_w->f_op->write) {\n\t\t\tfile_w->f_pos = 0;\n\t\t\t/* write data to file */\n\t\t\tfile_w->f_op->write(file_w, pBuf, BufLen, &file_w->f_pos);\n\t\t}\n\t\tfilp_close(file_w, NULL);\n\t}\n\tset_fs(orig_fs);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the network interface is up.\n\nArguments:\n\t*pDev\t\t\t- Network Interface\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOSNetDevIsUp(VOID *pDev)\n{\n\tstruct net_device *pNetDev = (struct net_device *)pDev;\n\n\tif ((pNetDev == NULL) || !(pNetDev->flags & IFF_UP))\n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWake up the command thread.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsCmdUp(RTMP_OS_TASK *pCmdQTask)\n{\n\tOS_TASK *pTask = RTMP_OS_TASK_GET(pCmdQTask);\n#ifdef KTHREAD_SUPPORT\n\tpTask->kthread_running = TRUE;\n\twake_up(&pTask->kthread_q);\n#else\n\tCHECK_PID_LEGALITY(pTask->taskPID) {\n\t\tRTMP_SEM_EVENT_UP(&(pTask->taskSema));\n\t}\n#endif /* KTHREAD_SUPPORT */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWake up USB Mlme thread.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsMlmeUp(IN RTMP_OS_TASK *pMlmeQTask)\n{\n#ifdef RTMP_USB_SUPPORT\n\tOS_TASK *pTask = RTMP_OS_TASK_GET(pMlmeQTask);\n\n#ifdef KTHREAD_SUPPORT\n\tif ((pTask != NULL) && (pTask->kthread_task)) {\n\t\tpTask->kthread_running = TRUE;\n\t\twake_up(&pTask->kthread_q);\n\t}\n#else\n\tif (pTask != NULL) {\n\t\tCHECK_PID_LEGALITY(pTask->taskPID) {\n\t\t\tRTMP_SEM_EVENT_UP(&(pTask->taskSema));\n\t\t}\n\t}\n#endif /* KTHREAD_SUPPORT */\n#endif /* RTMP_USB_SUPPORT */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the file is error.\n\nArguments:\n\tpFile\t\t\t- the file\n\nReturn Value:\n\tOK or any error\n\nNote:\n\trt_linux.h, not rt_drv.h\n========================================================================\n*/\nINT32 RtmpOsFileIsErr(IN VOID *pFile)\n{\n\treturn IS_FILE_OPEN_ERR(pFile);\n}\n\nint RtmpOSIRQRelease(\n\tIN PNET_DEV pNetDev,\n\tIN UINT32 infType,\n\tIN PPCI_DEV pci_dev,\n\tIN BOOLEAN *pHaveMsi)\n{\n\tstruct net_device *net_dev = (struct net_device *)pNetDev;\n\n\n\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tEnable or disable wireless event sent.\n\nArguments:\n\tpReserved\t\t- Reserved\n\tFlgIsWEntSup\t- TRUE or FALSE\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsWlanEventSet(\n\tIN VOID *pReserved,\n\tIN BOOLEAN *pCfgWEnt,\n\tIN BOOLEAN FlgIsWEntSup)\n{\n#if WIRELESS_EXT >= 15\n/*\tpAd->CommonCfg.bWirelessEvent = FlgIsWEntSup; */\n\t*pCfgWEnt = FlgIsWEntSup;\n#else\n\t*pCfgWEnt = 0;\t\t/* disable */\n#endif\n}\n\n/*\n========================================================================\nRoutine Description:\n\tvmalloc\n\nArguments:\n\tSize\t\t\t- memory size\n\nReturn Value:\n\tthe memory\n\nNote:\n========================================================================\n*/\nVOID *RtmpOsVmalloc(ULONG Size)\n{\n\treturn vmalloc(Size);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tvfree\n\nArguments:\n\tpMem\t\t\t- the memory\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsVfree(VOID *pMem)\n{\n\tif (pMem != NULL)\n\t\tvfree(pMem);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tGet network interface name.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tthe name\n\nNote:\n========================================================================\n*/\nchar *RtmpOsGetNetDevName(VOID *pDev)\n{\n\treturn ((PNET_DEV) pDev)->name;\n}\n\n/*\n========================================================================\nRoutine Description:\n\tAssign protocol to the packet.\n\nArguments:\n\tpPkt\t\t\t- the packet\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktProtocolAssign(PNDIS_PACKET pNetPkt)\n{\n\tstruct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt);\n\tpRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);\n}\n\n\nBOOLEAN RtmpOsStatsAlloc(\n\tIN VOID **ppStats,\n\tIN VOID **ppIwStats)\n{\n\tos_alloc_mem(NULL, (UCHAR **) ppStats, sizeof (struct net_device_stats));\n\tif ((*ppStats) == NULL)\n\t\treturn FALSE;\n\tNdisZeroMemory((UCHAR *) *ppStats, sizeof (struct net_device_stats));\n\n#if WIRELESS_EXT >= 12\n\tos_alloc_mem(NULL, (UCHAR **) ppIwStats, sizeof (struct iw_statistics));\n\tif ((*ppIwStats) == NULL) {\n\t\tos_free_mem(NULL, *ppStats);\n\t\treturn FALSE;\n\t}\n\tNdisZeroMemory((UCHAR *)* ppIwStats, sizeof (struct iw_statistics));\n#endif\n\n\treturn TRUE;\n}\n\n/*\n========================================================================\nRoutine Description:\n\tPass the received packet to OS.\n\nArguments:\n\tpPkt\t\t\t- the packet\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktRcvHandle(PNDIS_PACKET pNetPkt)\n{\n\tstruct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt);\n\n#ifdef CONFIG_RX_CSO_SUPPORT\n\n\tif (RTMP_GET_TCP_CHKSUM_FAIL(pNetPkt))\n\t\tpRxPkt->ip_summed = CHECKSUM_NONE;\n\telse\n\t\tpRxPkt->ip_summed = CHECKSUM_UNNECESSARY;\n\n#endif\n\n\tnetif_rx(pRxPkt);\n}\n\n\nVOID RtmpOsTaskPidInit(RTMP_OS_PID *pPid)\n{\n\t*pPid = THREAD_PID_INIT_VALUE;\n}\n\n/*\n========================================================================\nRoutine Description:\n\tGet the network interface for the packet.\n\nArguments:\n\tpPkt\t\t\t- the packet\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nPNET_DEV RtmpOsPktNetDevGet(VOID *pPkt)\n{\n\treturn GET_OS_PKT_NETDEV(pPkt);\n}\n\n\n#ifdef IAPP_SUPPORT\n/* Layer 2 Update frame to switch/bridge */\n/* For any Layer2 devices, e.g., bridges, switches and other APs, the frame\n   can update their forwarding tables with the correct port to reach the new\n   location of the STA */\ntypedef struct GNU_PACKED _RT_IAPP_L2_UPDATE_FRAME {\n\n\tUCHAR DA[ETH_ALEN];\t/* broadcast MAC address */\n\tUCHAR SA[ETH_ALEN];\t/* the MAC address of the STA that has just associated\n\t\t\t\t   or reassociated */\n\tUSHORT Len;\t\t/* 8 octets */\n\tUCHAR DSAP;\t\t/* null */\n\tUCHAR SSAP;\t\t/* null */\n\tUCHAR Control;\t\t/* reference to IEEE Std 802.2 */\n\tUCHAR XIDInfo[3];\t/* reference to IEEE Std 802.2 */\n} RT_IAPP_L2_UPDATE_FRAME, *PRT_IAPP_L2_UPDATE_FRAME;\n\n\nPNDIS_PACKET RtmpOsPktIappMakeUp(\n\tIN PNET_DEV pNetDev,\n\tIN UINT8 *pMac)\n{\n\tRT_IAPP_L2_UPDATE_FRAME frame_body;\n\tINT size = sizeof (RT_IAPP_L2_UPDATE_FRAME);\n\tPNDIS_PACKET pNetBuf;\n\n\tif (pNetDev == NULL)\n\t\treturn NULL;\n\n\tpNetBuf = RtmpOSNetPktAlloc(NULL, size);\n\tif (!pNetBuf) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Error! Can't allocate a skb.\\n\"));\n\t\treturn NULL;\n\t}\n\n\t/* init the update frame body */\n\tNdisZeroMemory(&frame_body, size);\n\n\tmemset(frame_body.DA, 0xFF, ETH_ALEN);\n\tmemcpy(frame_body.SA, pMac, ETH_ALEN);\n\n\tframe_body.Len = OS_HTONS(ETH_ALEN);\n\tframe_body.DSAP = 0;\n\tframe_body.SSAP = 0x01;\n\tframe_body.Control = 0xAF;\n\n\tframe_body.XIDInfo[0] = 0x81;\n\tframe_body.XIDInfo[1] = 1;\n\tframe_body.XIDInfo[2] = 1 << 1;\n\n\tSET_OS_PKT_NETDEV(pNetBuf, pNetDev);\n\tskb_reserve(pNetBuf, 2);\n\tmemcpy(skb_put(pNetBuf, size), &frame_body, size);\n\treturn pNetBuf;\n}\n#endif /* IAPP_SUPPORT */\n\n\nVOID RtmpOsPktNatMagicTag(PNDIS_PACKET pNetPkt)\n{\n}\n\nVOID RtmpOsPktNatNone(PNDIS_PACKET pNetPkt)\n{\n}\n\n\n#ifdef RT_CFG80211_SUPPORT\n/* all available channels */\nUCHAR Cfg80211_Chan[] = {\n\t1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n\n\t/* 802.11 UNI / HyperLan 2 */\n\t36, 38, 40, 44, 46, 48, 52, 54, 56, 60, 62, 64,\n\n\t/* 802.11 HyperLan 2 */\n\t100, 104, 108, 112, 116, 118, 120, 124, 126, 128, 132, 134, 136,\n\n\t/* 802.11 UNII */\n\t140, 149, 151, 153, 157, 159, 161, 165, 167, 169, 171, 173,\n\n\t/* Japan */\n\t184, 188, 192, 196, 208, 212, 216,\n};\n\n/*\n\tArray of bitrates the hardware can operate with\n\tin this band. Must be sorted to give a valid \"supported\n\trates\" IE, i.e. CCK rates first, then OFDM.\n\n\tFor HT, assign MCS in another structure, ieee80211_sta_ht_cap.\n*/\nconst struct ieee80211_rate Cfg80211_SupRate[12] = {\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 10,\n\t\t.hw_value = 0,\n\t\t.hw_value_short = 0,\n\t},\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 20,\n\t\t.hw_value = 1,\n\t\t.hw_value_short = 1,\n\t},\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 55,\n\t\t.hw_value = 2,\n\t\t.hw_value_short = 2,\n\t},\n\t{\n\t\t.flags = IEEE80211_RATE_SHORT_PREAMBLE,\n\t\t.bitrate = 110,\n\t\t.hw_value = 3,\n\t\t.hw_value_short = 3,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 60,\n\t\t.hw_value = 4,\n\t\t.hw_value_short = 4,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 90,\n\t\t.hw_value = 5,\n\t\t.hw_value_short = 5,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 120,\n\t\t.hw_value = 6,\n\t\t.hw_value_short = 6,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 180,\n\t\t.hw_value = 7,\n\t\t.hw_value_short = 7,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 240,\n\t\t.hw_value = 8,\n\t\t.hw_value_short = 8,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 360,\n\t\t.hw_value = 9,\n\t\t.hw_value_short = 9,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 480,\n\t\t.hw_value = 10,\n\t\t.hw_value_short = 10,\n\t},\n\t{\n\t\t.flags = 0,\n\t\t.bitrate = 540,\n\t\t.hw_value = 11,\n\t\t.hw_value_short = 11,\n\t},\n};\n\nstatic const UINT32 CipherSuites[] = {\n\tWLAN_CIPHER_SUITE_WEP40,\n\tWLAN_CIPHER_SUITE_WEP104,\n\tWLAN_CIPHER_SUITE_TKIP,\n\tWLAN_CIPHER_SUITE_CCMP,\n};\n\n/*\n========================================================================\nRoutine Description:\n\tUnRegister MAC80211 Module.\n\nArguments:\n\tpCB\t\t\t\t- CFG80211 control block pointer\n\tpNetDev\t\t\t- Network device\n\nReturn Value:\n\tNONE\n\nNote:\n========================================================================\n*/\nVOID CFG80211OS_UnRegister(\n\tIN VOID *pCB,\n\tIN VOID *pNetDevOrg)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct net_device *pNetDev = (struct net_device *)pNetDevOrg;\n\n\n\t/* unregister */\n\tif (pCfg80211_CB->pCfg80211_Wdev != NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> unregister/free wireless device\\n\"));\n\n\t\t/*\n\t\t\tMust unregister, or you will suffer problem when you change\n\t\t\tregulatory domain by using iw.\n\t\t*/\n\t\t\n#ifdef RFKILL_HW_SUPPORT\n\t\twiphy_rfkill_stop_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy);\n#endif /* RFKILL_HW_SUPPORT */\n\t\twiphy_unregister(pCfg80211_CB->pCfg80211_Wdev->wiphy);\n\t\twiphy_free(pCfg80211_CB->pCfg80211_Wdev->wiphy);\n\t\tkfree(pCfg80211_CB->pCfg80211_Wdev);\n\n\t\tif (pCfg80211_CB->pCfg80211_Channels != NULL)\n\t\t\tkfree(pCfg80211_CB->pCfg80211_Channels);\n\n\t\tif (pCfg80211_CB->pCfg80211_Rates != NULL)\n\t\t\tkfree(pCfg80211_CB->pCfg80211_Rates);\n\n\t\tpCfg80211_CB->pCfg80211_Wdev = NULL;\n\t\tpCfg80211_CB->pCfg80211_Channels = NULL;\n\t\tpCfg80211_CB->pCfg80211_Rates = NULL;\n\n\t\t/* must reset to NULL; or kernel will panic in unregister_netdev */\n\t\tpNetDev->ieee80211_ptr = NULL;\n\t\tSET_NETDEV_DEV(pNetDev, NULL);\n\t}\n\n\tos_free_mem(NULL, pCfg80211_CB);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize wireless channel in 2.4GHZ and 5GHZ.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpWiphy\t\t\t- WLAN PHY interface\n\tpChannels\t\t- Current channel info\n\tpRates\t\t\t- Current rate info\n\nReturn Value:\n\tTRUE\t\t\t- init successfully\n\tFALSE\t\t\t- init fail\n\nNote:\n\tTX Power related:\n\n\t1. Suppose we can send power to 15dBm in the board.\n\t2. A value 0x0 ~ 0x1F for a channel. We will adjust it based on 15dBm/\n\t\t54Mbps. So if value == 0x07, the TX power of 54Mbps is 15dBm and\n\t\tthe value is 0x07 in the EEPROM.\n\t3. Based on TX power value of 54Mbps/channel, adjust another value\n\t\t0x0 ~ 0xF for other data rate. (-6dBm ~ +6dBm)\n\n\tOther related factors:\n\t1. TX power percentage from UI/users;\n\t2. Maximum TX power limitation in the regulatory domain.\n========================================================================\n*/\nBOOLEAN CFG80211_SupBandInit(\n\tIN VOID *pCB,\n\tIN CFG80211_BAND *pBandInfo,\n\tIN VOID *pWiphyOrg,\n\tIN VOID *pChannelsOrg,\n\tIN VOID *pRatesOrg)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;\n\tstruct ieee80211_channel *pChannels = (struct ieee80211_channel *)pChannelsOrg;\n\tstruct ieee80211_rate *pRates = (struct ieee80211_rate *)pRatesOrg;\n\tstruct ieee80211_supported_band *pBand;\n\tUINT32 NumOfChan, NumOfRate;\n\tUINT32 IdLoop;\n\tUINT32 CurTxPower;\n\n\n\t/* sanity check */\n\tif (pBandInfo->RFICType == 0)\n\t\tpBandInfo->RFICType = RFIC_24GHZ | RFIC_5GHZ;\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> RFICType = %d\\n\",\n\t\t\t\tpBandInfo->RFICType));\n\n\t/* init */\n\tif (pBandInfo->RFICType & RFIC_5GHZ)\n\t\tNumOfChan = CFG80211_NUM_OF_CHAN_2GHZ + CFG80211_NUM_OF_CHAN_5GHZ;\n\telse\n\t\tNumOfChan = CFG80211_NUM_OF_CHAN_2GHZ;\n\n\tif (pBandInfo->FlgIsBMode == TRUE)\n\t\tNumOfRate = 4;\n\telse\n\t\tNumOfRate = 4 + 8;\n\n\tif (pChannels == NULL)\n\t{\n\t\tpChannels = kzalloc(sizeof(*pChannels) * NumOfChan, GFP_KERNEL);\n\t\tif (!pChannels)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> ieee80211_channel allocation fail!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> Number of channel = %d\\n\",\n\t\t\t\tCFG80211_NUM_OF_CHAN_5GHZ));\n\n\tif (pRates == NULL)\n\t{\n\t\tpRates = kzalloc(sizeof(*pRates) * NumOfRate, GFP_KERNEL);\n\t\tif (!pRates)\n\t\t{\n\t\t\tos_free_mem(NULL, pChannels);\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> ieee80211_rate allocation fail!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> Number of rate = %d\\n\", NumOfRate));\n\n\t/* get TX power */\n#ifdef SINGLE_SKU\n\tCurTxPower = pBandInfo->DefineMaxTxPwr; /* dBm */\n#else\n\tCurTxPower = 0; /* unknown */\n#endif /* SINGLE_SKU */\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> CurTxPower = %d dBm\\n\", CurTxPower));\n\n\t/* init channel */\n\tfor(IdLoop=0; IdLoop<NumOfChan; IdLoop++)\n\t{\n\t\tpChannels[IdLoop].center_freq = \\\n\t\t\t\t\tieee80211_channel_to_frequency(Cfg80211_Chan[IdLoop]);\n\t\tpChannels[IdLoop].hw_value = IdLoop;\n\n\t\tif (IdLoop < CFG80211_NUM_OF_CHAN_2GHZ)\n\t\t\tpChannels[IdLoop].max_power = CurTxPower;\n\t\telse\n\t\t\tpChannels[IdLoop].max_power = CurTxPower;\n\n\t\tpChannels[IdLoop].max_antenna_gain = 0xff;\n\t}\n\n\t/* init rate */\n\tfor(IdLoop=0; IdLoop<NumOfRate; IdLoop++)\n\t\tmemcpy(&pRates[IdLoop], &Cfg80211_SupRate[IdLoop], sizeof(*pRates));\n\n\tpBand = &pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_2GHZ];\n\tif (pBandInfo->RFICType & RFIC_24GHZ)\n\t{\n\t\tpBand->n_channels = CFG80211_NUM_OF_CHAN_2GHZ;\n\t\tpBand->n_bitrates = NumOfRate;\n\t\tpBand->channels = pChannels;\n\t\tpBand->bitrates = pRates;\n\n#ifdef DOT11_N_SUPPORT\n\t\t/* for HT, assign pBand->ht_cap */\n\t\tpBand->ht_cap.ht_supported = true;\n\t\tpBand->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |\n\t\t\t\t\t       IEEE80211_HT_CAP_SM_PS |\n\t\t\t\t\t       IEEE80211_HT_CAP_SGI_40 |\n\t\t\t\t\t       IEEE80211_HT_CAP_DSSSCCK40;\n\t\tpBand->ht_cap.ampdu_factor = 3; /* 2 ^ 16 */\n\t\tpBand->ht_cap.ampdu_density = pBandInfo->MpduDensity;\n\n\t\tmemset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs));\n\t\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t\t(\"80211> TxStream = %d\\n\", pBandInfo->TxStream));\n\n\t\tswitch(pBandInfo->TxStream)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[0] = 0xff;\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[0] = 0xff;\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[1] = 0xff;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[0] = 0xff;\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[1] = 0xff;\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[2] = 0xff;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tpBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;\n#endif /* DOT11_N_SUPPORT */\n\n\t\tpWiphy->bands[IEEE80211_BAND_2GHZ] = pBand;\n\t}\n\telse\n\t{\n\t\tpWiphy->bands[IEEE80211_BAND_2GHZ] = NULL;\n\t\tpBand->channels = NULL;\n\t\tpBand->bitrates = NULL;\n\t}\n\n\tpBand = &pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_5GHZ];\n\tif (pBandInfo->RFICType & RFIC_5GHZ)\n\t{\n\t\tpBand->n_channels = CFG80211_NUM_OF_CHAN_5GHZ;\n\t\tpBand->n_bitrates = NumOfRate - 4;\n\t\tpBand->channels = &pChannels[CFG80211_NUM_OF_CHAN_2GHZ];\n\t\tpBand->bitrates = &pRates[4];\n\n\t\t/* for HT, assign pBand->ht_cap */\n#ifdef DOT11_N_SUPPORT\n\t\t/* for HT, assign pBand->ht_cap */\n\t\tpBand->ht_cap.ht_supported = true;\n\t\tpBand->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |\n\t\t\t\t\t       IEEE80211_HT_CAP_SM_PS |\n\t\t\t\t\t       IEEE80211_HT_CAP_SGI_40 |\n\t\t\t\t\t       IEEE80211_HT_CAP_DSSSCCK40;\n\t\tpBand->ht_cap.ampdu_factor = 3; /* 2 ^ 16 */\n\t\tpBand->ht_cap.ampdu_density = pBandInfo->MpduDensity;\n\n\t\tmemset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs));\n\t\tswitch(pBandInfo->RxStream)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[0] = 0xff;\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[0] = 0xff;\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[1] = 0xff;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[0] = 0xff;\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[1] = 0xff;\n\t\t\t\tpBand->ht_cap.mcs.rx_mask[2] = 0xff;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tpBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;\n#endif /* DOT11_N_SUPPORT */\n\n\t\tpWiphy->bands[IEEE80211_BAND_5GHZ] = pBand;\n\t}\n\telse\n\t{\n\t\tpWiphy->bands[IEEE80211_BAND_5GHZ] = NULL;\n\t\tpBand->channels = NULL;\n\t\tpBand->bitrates = NULL;\n\t}\n\n\tpCfg80211_CB->pCfg80211_Channels = pChannels;\n\tpCfg80211_CB->pCfg80211_Rates = pRates;\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tRe-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ.\n\nArguments:\n\tpCB\t\t\t\t- CFG80211 control block pointer\n\tpBandInfo\t\t- Band information\n\nReturn Value:\n\tTRUE\t\t\t- re-init successfully\n\tFALSE\t\t\t- re-init fail\n\nNote:\n\tCFG80211_SupBandInit() is called in xx_probe().\n\tBut we do not have complete chip information in xx_probe() so we\n\tneed to re-init bands in xx_open().\n========================================================================\n*/\nBOOLEAN CFG80211OS_SupBandReInit(\n\tIN VOID *pCB,\n\tIN CFG80211_BAND *pBandInfo)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct wiphy *pWiphy;\n\n\n\tif ((pCfg80211_CB == NULL) || (pCfg80211_CB->pCfg80211_Wdev == NULL))\n\t\treturn FALSE;\n\n\tpWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;\n\n\tif (pWiphy != NULL)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> re-init bands...\\n\"));\n\n\t\t/* re-init bands */\n\t\tCFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWiphy,\n\t\t\t\t\t\t\tpCfg80211_CB->pCfg80211_Channels,\n\t\t\t\t\t\t\tpCfg80211_CB->pCfg80211_Rates);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\n\t\t/* re-init PHY */\n\t\tpWiphy->rts_threshold = pBandInfo->RtsThreshold;\n\t\tpWiphy->frag_threshold = pBandInfo->FragmentThreshold;\n\t\tpWiphy->retry_short = pBandInfo->RetryMaxCnt & 0xff;\n\t\tpWiphy->retry_long = (pBandInfo->RetryMaxCnt & 0xff00)>>8;\n#endif /* LINUX_VERSION_CODE */\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHint to the wireless core a regulatory domain from driver.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpCountryIe\t\t- pointer to the country IE\n\tCountryIeLen\t- length of the country IE\n\nReturn Value:\n\tNONE\n\nNote:\n\tMust call the function in kernel thread.\n========================================================================\n*/\nVOID CFG80211OS_RegHint(\n\tIN VOID *pCB,\n\tIN UCHAR *pCountryIe,\n\tIN ULONG CountryIeLen)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t(\"crda> regulatory domain hint: %c%c\\n\",\n\t\t\tpCountryIe[0], pCountryIe[1]));\n\n\tif ((pCfg80211_CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL))\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> regulatory domain hint not support!\\n\"));\n\t\treturn;\n\t}\n\n\t/* hints a country IE as a regulatory domain \"without\" channel/power info. */\n/*\tregulatory_hint(pCfg80211_CB->pMac80211_Hw->wiphy, pCountryIe); */\n\tregulatory_hint(pCfg80211_CB->pCfg80211_Wdev->wiphy, (const char *)pCountryIe);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHint to the wireless core a regulatory domain from country element.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpCountryIe\t\t- pointer to the country IE\n\tCountryIeLen\t- length of the country IE\n\nReturn Value:\n\tNONE\n\nNote:\n\tMust call the function in kernel thread.\n========================================================================\n*/\nVOID CFG80211OS_RegHint11D(\n\tIN VOID *pCB,\n\tIN UCHAR *pCountryIe,\n\tIN ULONG CountryIeLen)\n{\n\t/* no regulatory_hint_11d() in 2.6.32 */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32))\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\n\n\tif ((pCfg80211_CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL))\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR, (\"crda> regulatory domain hint not support!\\n\"));\n\t\treturn;\n\t}\n\n\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t(\"crda> regulatory domain hint: %c%c\\n\",\n\t\t\t\tpCountryIe[0], pCountryIe[1]));\n\n\t/*\n\t\thints a country IE as a regulatory domain \"with\" channel/power info.\n\t\tbut if you use regulatory_hint(), it only hint \"regulatory domain\".\n\t*/\n/*\tregulatory_hint_11d(pCfg80211_CB->pMac80211_Hw->wiphy, pCountryIe, CountryIeLen); */\n\tregulatory_hint_11d(pCfg80211_CB->pCfg80211_Wdev->wiphy, pCountryIe, CountryIeLen);\n#endif /* LINUX_VERSION_CODE */\n}\n\n\nBOOLEAN CFG80211OS_BandInfoGet(\n\tIN VOID *pCB,\n\tIN VOID *pWiphyOrg,\n\tOUT VOID **ppBand24,\n\tOUT VOID **ppBand5)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;\n\n\n\tif (pWiphy == NULL)\n\t{\n\t\tif ((pCfg80211_CB != NULL) && (pCfg80211_CB->pCfg80211_Wdev != NULL))\n\t\t\tpWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;\n\t}\n\n\tif (pWiphy == NULL)\n\t\treturn FALSE;\n\n\t*ppBand24 = pWiphy->bands[IEEE80211_BAND_2GHZ];\n\t*ppBand5 = pWiphy->bands[IEEE80211_BAND_5GHZ];\n\treturn TRUE;\n}\n\n\nUINT32 CFG80211OS_ChanNumGet(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN VOID\t\t\t\t\t\t*pWiphyOrg,\n\tIN UINT32\t\t\t\t\tIdBand)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;\n\n\n\tif (pWiphy == NULL)\n\t{\n\t\tif ((pCfg80211_CB != NULL) && (pCfg80211_CB->pCfg80211_Wdev != NULL))\n\t\t\tpWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;\n\t}\n\n\tif (pWiphy == NULL)\n\t\treturn 0;\n\n\tif (pWiphy->bands[IdBand] != NULL)\n\t\treturn pWiphy->bands[IdBand]->n_channels;\n\n\treturn 0;\n}\n\n\nBOOLEAN CFG80211OS_ChanInfoGet(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN VOID\t\t\t\t\t\t*pWiphyOrg,\n\tIN UINT32\t\t\t\t\tIdBand,\n\tIN UINT32\t\t\t\t\tIdChan,\n\tOUT UINT32\t\t\t\t\t*pChanId,\n\tOUT UINT32\t\t\t\t\t*pPower,\n\tOUT BOOLEAN\t\t\t\t\t*pFlgIsRadar)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;\n\tstruct ieee80211_supported_band *pSband;\n\tstruct ieee80211_channel *pChan;\n\n\n\tif (pWiphy == NULL)\n\t{\n\t\tif ((pCfg80211_CB != NULL) && (pCfg80211_CB->pCfg80211_Wdev != NULL))\n\t\t\tpWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;\n\t}\n\n\tif (pWiphy == NULL)\n\t\treturn FALSE;\n\n\tpSband = pWiphy->bands[IdBand];\n\tpChan = &pSband->channels[IdChan];\n\n\t*pChanId = ieee80211_frequency_to_channel(pChan->center_freq);\n\n\tif (pChan->flags & IEEE80211_CHAN_DISABLED)\n\t{\n\t\tCFG80211DBG(RT_DEBUG_ERROR,\n\t\t\t\t\t(\"Chan %03d (frq %d):\\tnot allowed!\\n\",\n\t\t\t\t\t(*pChanId), pChan->center_freq));\n\t\treturn FALSE;\n\t}\n\n\t*pPower = pChan->max_power;\n\n\tif (pChan->flags & IEEE80211_CHAN_RADAR)\n\t\t*pFlgIsRadar = TRUE;\n\telse\n\t\t*pFlgIsRadar = FALSE;\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize a channel information used in scan inform.\n\nArguments:\n\nReturn Value:\n\tTRUE\t\t- Successful\n\tFALSE\t\t- Fail\n\nNote:\n========================================================================\n*/\nBOOLEAN CFG80211OS_ChanInfoInit(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UINT32\t\t\t\t\tInfoIndex,\n\tIN UCHAR\t\t\t\t\tChanId,\n\tIN UCHAR\t\t\t\t\tMaxTxPwr,\n\tIN BOOLEAN\t\t\t\t\tFlgIsNMode,\n\tIN BOOLEAN\t\t\t\t\tFlgIsBW20M)\n{\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tstruct ieee80211_channel *pChan;\n\n\n\tif (InfoIndex >= MAX_NUM_OF_CHANNELS)\n\t\treturn FALSE;\n\n\tpChan = (struct ieee80211_channel *)&(pCfg80211_CB->ChanInfo[InfoIndex]);\n\tmemset(pChan, 0, sizeof(*pChan));\n\n\tif (ChanId > 14)\n\t\tpChan->band = IEEE80211_BAND_5GHZ;\n\telse\n\t\tpChan->band = IEEE80211_BAND_2GHZ;\n\n\tpChan->center_freq = ieee80211_channel_to_frequency(ChanId);\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32))\n\tif (FlgIsNMode == TRUE)\n\t{\n\t\tif (FlgIsBW20M == TRUE)\n\t\t\tpChan->max_bandwidth = 20; /* 20MHz */\n\t\telse\n\t\t\tpChan->max_bandwidth = 40; /* 40MHz */\n\t}\n\telse\n\t\tpChan->max_bandwidth = 5; /* 5MHz for non-HT device */\n#endif /* LINUX_VERSION_CODE */\n\n\t/* no use currently in 2.6.30 */\n/*\tif (ieee80211_is_beacon(((struct ieee80211_mgmt *)pFrame)->frame_control)) */\n/*\t\tpChan->beacon_found = 1; */\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInform us that a scan is got.\n\nArguments:\n\tpAdCB\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNONE\n\nNote:\n\tCall RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning\n========================================================================\n*/\nVOID CFG80211OS_Scaning(\n\tIN VOID\t\t\t\t\t\t*pCB,\n\tIN UINT32\t\t\t\t\tChanId,\n\tIN UCHAR\t\t\t\t\t*pFrame,\n\tIN UINT32\t\t\t\t\tFrameLen,\n\tIN INT32\t\t\t\t\tRSSI,\n\tIN BOOLEAN\t\t\t\t\tFlgIsNMode,\n\tIN UINT8\t\t\t\t\tBW)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\n#ifdef CONFIG_STA_SUPPORT\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\tUINT32 IdChan;\n\tUINT32 CenFreq;\n\n\n\t/* get channel information */\n\tCenFreq = ieee80211_channel_to_frequency(ChanId);\n\n\tfor(IdChan=0; IdChan<MAX_NUM_OF_CHANNELS; IdChan++)\n\t{\n\t\tif (pCfg80211_CB->ChanInfo[IdChan].center_freq == CenFreq)\n\t\t\tbreak;\n\t}\n\tif (IdChan >= MAX_NUM_OF_CHANNELS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"80211> Can not find any chan info!\\n\"));\n\t\treturn;\n\t}\n\n\t/* inform 80211 a scan is got */\n\t/* we can use cfg80211_inform_bss in 2.6.31, it is easy more than the one */\n\t/* in cfg80211_inform_bss_frame(), it will memcpy pFrame but pChan */\n\tcfg80211_inform_bss_frame(pCfg80211_CB->pCfg80211_Wdev->wiphy,\n\t\t\t\t\t\t\t\t&pCfg80211_CB->ChanInfo[IdChan],\n\t\t\t\t\t\t\t\t(struct ieee80211_mgmt *)pFrame,\n\t\t\t\t\t\t\t\tFrameLen,\n\t\t\t\t\t\t\t\tRSSI,\n\t\t\t\t\t\t\t\tGFP_ATOMIC);\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> cfg80211_inform_bss_frame\\n\"));\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInform us that scan ends.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tFlgIsAborted\t- 1: scan is aborted\n\nReturn Value:\n\tNONE\n\nNote:\n========================================================================\n*/\nVOID CFG80211OS_ScanEnd(\n\tIN VOID *pCB,\n\tIN BOOLEAN FlgIsAborted)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))\n#ifdef CONFIG_STA_SUPPORT\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\n\n\tCFG80211DBG(RT_DEBUG_ERROR, (\"80211> cfg80211_scan_done\\n\"));\n\tcfg80211_scan_done(pCfg80211_CB->pCfg80211_ScanReq, FlgIsAborted);\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* LINUX_VERSION_CODE */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInform CFG80211 about association status.\n\nArguments:\n\tpAdCB\t\t\t- WLAN control block pointer\n\tpBSSID\t\t\t- the BSSID of the AP\n\tpReqIe\t\t\t- the element list in the association request frame\n\tReqIeLen\t\t- the request element length\n\tpRspIe\t\t\t- the element list in the association response frame\n\tRspIeLen\t\t- the response element length\n\tFlgIsSuccess\t- 1: success; otherwise: fail\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid CFG80211OS_ConnectResultInform(\n\tIN VOID *pCB,\n\tIN UCHAR *pBSSID,\n\tIN UCHAR *pReqIe,\n\tIN UINT32 ReqIeLen,\n\tIN UCHAR *pRspIe,\n\tIN UINT32 RspIeLen,\n\tIN UCHAR FlgIsSuccess)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))\n\tCFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;\n\n\n\tif ((pCfg80211_CB->pCfg80211_Wdev->netdev == NULL) || (pBSSID == NULL))\n\t\treturn;\n\n\tif (FlgIsSuccess)\n\t{\n\t\tcfg80211_connect_result(pCfg80211_CB->pCfg80211_Wdev->netdev,\n\t\t\t\t\t\t\t\tpBSSID,\n\t\t\t\t\t\t\t\tpReqIe,\n\t\t\t\t\t\t\t\tReqIeLen,\n\t\t\t\t\t\t\t\tpRspIe,\n\t\t\t\t\t\t\t\tRspIeLen,\n\t\t\t\t\t\t\t\tWLAN_STATUS_SUCCESS,\n\t\t\t\t\t\t\t\tGFP_KERNEL);\n\t}\n\telse\n\t{\n\t\tcfg80211_connect_result(pCfg80211_CB->pCfg80211_Wdev->netdev,\n\t\t\t\t\t\t\t\tpBSSID,\n\t\t\t\t\t\t\t\tNULL, 0, NULL, 0,\n\t\t\t\t\t\t\t\tWLAN_STATUS_UNSPECIFIED_FAILURE,\n\t\t\t\t\t\t\t\tGFP_KERNEL);\n\t}\n#endif /* LINUX_VERSION_CODE */\n}\n#endif /* RT_CFG80211_SUPPORT */\n\n\n/*\n========================================================================\nRoutine Description:\n\tFlush a data cache line.\n\nArguments:\n\tAddrStart\t\t- the start address\n\tSize\t\t\t- memory size\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsDCacheFlush(\n\tIN ULONG AddrStart,\n\tIN ULONG Size)\n{\n\tRTMP_UTIL_DCACHE_FLUSH(AddrStart, Size);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAssign private data pointer to the network interface.\n\nArguments:\n\tpDev\t\t\t- the device\n\tpPriv\t\t\t- the pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSetNetDevPriv(VOID *pDev, VOID *pPriv)\n{\n\tDEV_PRIV_INFO *pDevInfo = NULL;\n\n\n\tpDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);\n\tif (pDevInfo == NULL)\n\t{\n\t\tos_alloc_mem(NULL, (UCHAR **)&pDevInfo, sizeof(DEV_PRIV_INFO));\n\t\tif (pDevInfo == NULL)\n\t\t\treturn;\n\t}\n\n\tpDevInfo->pPriv = (VOID *)pPriv;\n\tpDevInfo->priv_flags = 0;\n\n\t_RTMP_OS_NETDEV_SET_PRIV((PNET_DEV) pDev, pDevInfo);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet private data pointer from the network interface.\n\nArguments:\n\tpDev\t\t\t- the device\n\tpPriv\t\t\t- the pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID *RtmpOsGetNetDevPriv(VOID *pDev)\n{\n\tDEV_PRIV_INFO *pDevInfo = NULL;\n\n\n\tpDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);\n\tif (pDevInfo != NULL)\n\t\treturn pDevInfo->pPriv;\n\treturn NULL;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet private flags from the network interface.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tpPriv\t\t\t- the pointer\n\nNote:\n========================================================================\n*/\nUSHORT RtmpDevPrivFlagsGet(VOID *pDev)\n{\n\n\tDEV_PRIV_INFO *pDevInfo = NULL;\n\n\n\tpDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);\n\tif (pDevInfo != NULL)\n\t\treturn pDevInfo->priv_flags;\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet private flags from the network interface.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tpPriv\t\t\t- the pointer\n\nNote:\n========================================================================\n*/\nVOID RtmpDevPrivFlagsSet(VOID *pDev, USHORT PrivFlags)\n{\n\tDEV_PRIV_INFO *pDevInfo = NULL;\n\n\n\tpDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);\n\tif (pDevInfo != NULL)\n\t\tpDevInfo->priv_flags = PrivFlags;\n}\n\n\n\n\n#ifdef OS_ABL_FUNC_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tChange/Recover file UID/GID.\n\nArguments:\n\tpOSFSInfoOrg\t- the file\n\tbSet\t\t\t- Change (TRUE) or Recover (FALSE)\n\nReturn Value:\n\tNone\n\nNote:\n\trt_linux.h, not rt_drv.h\n========================================================================\n*/\nvoid RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet)\n{\n\tOS_FS_INFO *pOSFSInfo;\n\n\tif (bSet == TRUE) {\n\t\tos_alloc_mem(NULL, (UCHAR **) & (pOSFSInfoOrg->pContent),\n\t\t\t     sizeof (OS_FS_INFO));\n\t\tif (pOSFSInfoOrg->pContent == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: alloc file info fail!\\n\", __FUNCTION__));\n\t\t\treturn;\n\t\t} else\n\t\t\tmemset(pOSFSInfoOrg->pContent, 0, sizeof (OS_FS_INFO));\n\t}\n\n\tpOSFSInfo = (OS_FS_INFO *) (pOSFSInfoOrg->pContent);\n\tif (pOSFSInfo == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: pOSFSInfo == NULL!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t__RtmpOSFSInfoChange(pOSFSInfo, bSet);\n\n\tif (bSet == FALSE) {\n\t\tif (pOSFSInfoOrg->pContent != NULL) {\n\t\t\tos_free_mem(NULL, pOSFSInfoOrg->pContent);\n\t\t\tpOSFSInfoOrg->pContent = NULL;\n\t\t}\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tActivate a tasklet.\n\nArguments:\n\tpTasklet\t\t- the tasklet\n\nReturn Value:\n\tTRUE or FALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsTaskletSche(RTMP_NET_TASK_STRUCT *pTasklet)\n{\n\tif (pTasklet->pContent == NULL)\n\t\treturn FALSE;\n\n#ifdef WORKQUEUE_BH\n\tschedule_work((struct work_struct *)(pTasklet->pContent));\n#else\n\ttasklet_hi_schedule((OS_NET_TASK_STRUCT *) (pTasklet->pContent));\n#endif /* WORKQUEUE_BH */\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize a tasklet.\n\nArguments:\n\tpTasklet\t\t- the tasklet\n\nReturn Value:\n\tTRUE or FALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsTaskletInit(\n\tRTMP_NET_TASK_STRUCT *pTasklet,\n\tVOID (*pFunc) (unsigned long data),\n\tULONG Data,\n\tLIST_HEADER *pTaskletList)\n{\n#ifdef WORKQUEUE_BH\n\tif (RTMP_OS_Alloc_RscOnly(pTasklet, sizeof (struct work_struct)) == FALSE)\n\t\treturn FALSE;\n\n\tINIT_WORK((struct work_struct *)(pTasklet->pContent), pFunc);\n#else\n\n\tif (RTMP_OS_Alloc_RscOnly(pTasklet, sizeof (OS_NET_TASK_STRUCT)) == FALSE)\n\t\treturn FALSE;\n\n\ttasklet_init((OS_NET_TASK_STRUCT *) (pTasklet->pContent), pFunc, Data);\n#endif /* WORKQUEUE_BH */\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tDelete a tasklet.\n\nArguments:\n\tpTasklet\t\t- the tasklet\n\nReturn Value:\n\tTRUE or FALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsTaskletKill(RTMP_NET_TASK_STRUCT *pTasklet)\n{\n\tif (pTasklet->pContent != NULL) {\n#ifndef WORKQUEUE_BH\n\t\ttasklet_kill((OS_NET_TASK_STRUCT *) (pTasklet->pContent));\n#endif /* WORKQUEUE_BH */\n\n\t\tos_free_mem(NULL, pTasklet->pContent);\n\t\tpTasklet->pContent = NULL;\n\t}\n\n\treturn TRUE;\n}\n\n\nVOID RtmpOsTaskletDataAssign(RTMP_NET_TASK_STRUCT *pTasklet, ULONG Data)\n{\n#ifndef WORKQUEUE_BH\n\tif (pTasklet->pContent != NULL)\n\t\t((OS_NET_TASK_STRUCT *) (pTasklet->pContent))->data = Data;\n#endif /* WORKQUEUE_BH */\n}\n\n\nINT32 RtmpOsTaskIsKilled(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask == NULL)\n\t\treturn 1;\n\treturn pTask->task_killed;\n}\n\n\nVOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask == NULL)\n\t\treturn;\n\n#ifdef KTHREAD_SUPPORT\n\tWAKE_UP(pTask);\n#else\n\tRTMP_SEM_EVENT_UP(&pTask->taskSema);\n#endif\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the task is legal.\n\nArguments:\n\tpPkt\t\t\t- the packet\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsCheckTaskLegality(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (!pTask)\n\t\treturn FALSE;\n\n#ifdef KTHREAD_SUPPORT\n\tif (pTask->kthread_task == NULL)\n#else\n\tCHECK_PID_LEGALITY(pTask->taskPID);\n\telse\n#endif\n\treturn FALSE;\n\n\treturn TRUE;\n}\n\n\n/* timeout -- ms */\nVOID RTMP_SetPeriodicTimer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout)\n{\n\tOS_NDIS_MINIPORT_TIMER *pTimer;\n\n\tpTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);\n\tif (pTimer)\n\t\t__RTMP_SetPeriodicTimer(pTimer, timeout);\n}\n\n\n/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */\nVOID RTMP_OS_Init_Timer(\n\tVOID *pReserved,\n\tNDIS_MINIPORT_TIMER *pTimerOrg,\n\tTIMER_FUNCTION function,\n\tPVOID data,\n\tLIST_HEADER *pTimerList)\n{\n\tOS_NDIS_MINIPORT_TIMER *pTimer;\n\n\tif (RTMP_OS_Alloc_RscOnly(pTimerOrg, sizeof (OS_NDIS_MINIPORT_TIMER)) == FALSE)\n\t\treturn;\n\n\tpTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);\n\tif (pTimer)\n\t\t__RTMP_OS_Init_Timer(pReserved, pTimer, function, data);\n}\n\n\nVOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout)\n{\n\tOS_NDIS_MINIPORT_TIMER *pTimer;\n\n\t pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);\n\n\tif (pTimer) {\n\t\tif (timer_pending(pTimer))\n\t\t\treturn;\n\n\t\t__RTMP_OS_Add_Timer(pTimer, timeout);\n\t}\n} \n\n\nVOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout)\n{\n\tOS_NDIS_MINIPORT_TIMER *pTimer;\n\n\tpTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);\n\tif (pTimer)\n\t\t__RTMP_OS_Mod_Timer(pTimer, timeout);\n}\n\n\nVOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled)\n{\n\tOS_NDIS_MINIPORT_TIMER *pTimer;\n\n\tpTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);\n\tif (pTimer)\n\t\t__RTMP_OS_Del_Timer(pTimer, pCancelled);\n}\n\n\nVOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg)\n{\n\tOS_NDIS_MINIPORT_TIMER *pTimer;\n\n\tpTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);\n\tif (pTimer) {\n\t\t__RTMP_OS_Release_Timer(pTimer);\n\n\t\tos_free_mem(NULL, pTimer);\n\t\tpTimerOrg->pContent = NULL;\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAllocate a OS resource.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpRsc\t\t\t- the resource\n\tRscLen\t\t\t- resource length\n\nReturn Value:\n\tTRUE or FALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RTMP_OS_Alloc_Rsc(\n\tLIST_HEADER *pRscList,\n\tVOID *pRscSrc,\n\tUINT32 RscLen)\n{\n\tOS_RSTRUC *pRsc = (OS_RSTRUC *) pRscSrc;\n\n\tif (pRsc->pContent == NULL) {\n\t\t/* new entry */\n\t\tos_alloc_mem(NULL, (UCHAR **) & (pRsc->pContent), RscLen);\n\t\tif (pRsc->pContent == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"%s: alloc timer fail!\\n\", __FUNCTION__));\n\t\t\treturn FALSE;\n\t\t} else {\n\t\t\tLIST_RESOURCE_OBJ_ENTRY *pObj;\n\n\t\t\t/* allocate resource record entry */\n\t\t\tos_alloc_mem(NULL, (UCHAR **) & (pObj),\n\t\t\t\t     sizeof (LIST_RESOURCE_OBJ_ENTRY));\n\t\t\tif (pObj == NULL) {\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t (\"%s: alloc timer obj fail!\\n\",\n\t\t\t\t\t  __FUNCTION__));\n\t\t\t\tos_free_mem(NULL, pRsc->pContent);\n\t\t\t\tpRsc->pContent = NULL;\n\t\t\t\treturn FALSE;\n\t\t\t} else {\n\t\t\t\tmemset(pRsc->pContent, 0, RscLen);\n\t\t\t\tpObj->pRscObj = (VOID *) pRsc;\n\n\t\t\t\tOS_SEM_LOCK(&UtilSemLock);\n\t\t\t\tinsertTailList(pRscList, (LIST_ENTRY *) pObj);\n\t\t\t\tOS_SEM_UNLOCK(&UtilSemLock);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAllocate a OS resource.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpRsc\t\t\t- the resource\n\tRscLen\t\t\t- resource length\n\nReturn Value:\n\tTRUE or FALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RTMP_OS_Alloc_RscOnly(VOID *pRscSrc, UINT32 RscLen)\n{\n\tOS_RSTRUC *pRsc = (OS_RSTRUC *) pRscSrc;\n\n\tif (pRsc->pContent == NULL) {\n\t\t/* new entry */\n\t\tos_alloc_mem(NULL, (UCHAR **) & (pRsc->pContent), RscLen);\n\t\tif (pRsc->pContent == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"%s: alloc timer fail!\\n\", __FUNCTION__));\n\t\t\treturn FALSE;\n\t\t}\n\t\tmemset(pRsc->pContent, 0, RscLen);\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tRemove a OS resource.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpRsc\t\t\t- the resource\n\nReturn Value:\n\tTRUE or FALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RTMP_OS_Remove_Rsc(\n\tLIST_HEADER *pRscList,\n\tVOID *pRscSrc)\n{\n\tLIST_RESOURCE_OBJ_ENTRY *pObj;\n\tOS_RSTRUC *pRscHead, *pRsc, *pRscRev = (OS_RSTRUC *) pRscSrc;\n\tpRscHead = NULL;\n\n\tOS_SEM_LOCK(&UtilSemLock);\n\twhile(TRUE)\n\t{\n\t\tpObj = (LIST_RESOURCE_OBJ_ENTRY *) removeHeadList(pRscList);\n\t\tif (pRscHead == NULL)\n\t\t\tpRscHead = pObj->pRscObj; /* backup first entry */\n\t\telse if (((ULONG)pRscHead) == ((ULONG)(pObj->pRscObj)))\n\t\t\tbreak; /* has searched all entries */\n\n\t\tpRsc = (OS_RSTRUC *) (pObj->pRscObj);\n\t\tif ((ULONG)pRsc == (ULONG)pRscRev)\n\t\t\tbreak; /* find it */\n\n\t\t/* re-insert it */\n\t\tinsertTailList(pRscList, (LIST_ENTRY *) pObj);\n\t}\n\tOS_SEM_UNLOCK(&UtilSemLock);\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tFree all timers.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RTMP_OS_Free_Rscs(LIST_HEADER *pRscList)\n{\n\tLIST_RESOURCE_OBJ_ENTRY *pObj;\n\tOS_RSTRUC *pRsc;\n\n\tOS_SEM_LOCK(&UtilSemLock);\n\twhile (TRUE) {\n\t\tpObj = (LIST_RESOURCE_OBJ_ENTRY *) removeHeadList(pRscList);\n\t\tif (pObj == NULL)\n\t\t\tbreak;\n\t\tpRsc = (OS_RSTRUC *) (pObj->pRscObj);\n\n\t\tif (pRsc->pContent != NULL) {\n\t\t\t/* free the timer memory */\n\t\t\tos_free_mem(NULL, pRsc->pContent);\n\t\t\tpRsc->pContent = NULL;\n\t\t} else {\n\t\t\t/*\n\t\t\t   The case is possible because some timers are released during\n\t\t\t   the driver life time, EX: we will release some timers in\n\t\t\t   MacTableDeleteEntry().\n\t\t\t   But we do not recommend the behavior, i.e. not to release\n\t\t\t   timers in the driver life time; Or we can not cancel the\n\t\t\t   timer for timer preemption problem.\n\t\t\t */\n\t\t}\n\n\t\tos_free_mem(NULL, pObj);\t/* free the timer record entry */\n\t}\n\tOS_SEM_UNLOCK(&UtilSemLock);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAllocate a kernel task.\n\nArguments:\n\tpTask\t\t\t- the task\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOSTaskAlloc(RTMP_OS_TASK *pTask, LIST_HEADER *pTaskList)\n{\n\tif (RTMP_OS_Alloc_RscOnly(pTask, sizeof (OS_TASK)) == FALSE) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: alloc task fail!\\n\", __FUNCTION__));\n\t\treturn FALSE;\t/* allocate fail */\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tFree a kernel task.\n\nArguments:\n\tpTask\t\t\t- the task\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOSTaskFree(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask != NULL) {\n\t\tos_free_mem(NULL, pTask);\n\t\tpTaskOrg->pContent = NULL;\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tKill a kernel task.\n\nArguments:\n\tpTaskOrg\t\t- the task\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nNDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\tNDIS_STATUS Status;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask != NULL) {\n\t\tStatus = __RtmpOSTaskKill(pTask);\n\t\tRtmpOSTaskFree(pTaskOrg);\n\t\treturn Status;\n\t}\n\n\treturn NDIS_STATUS_FAILURE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tNotify kernel the task exit.\n\nArguments:\n\tpTaskOrg\t\t- the task\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nINT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask == NULL)\n\t\treturn 0;\n\treturn __RtmpOSTaskNotifyToExit(pTask);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCustomize the task.\n\nArguments:\n\tpTaskOrg\t\t- the task\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOSTaskCustomize(RTMP_OS_TASK *pTaskOrg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask)\n\t\t__RtmpOSTaskCustomize(pTask);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tActivate a kernel task.\n\nArguments:\n\tpTaskOrg\t\t- the task\n\tfn\t\t\t\t- task handler\n\targ\t\t\t\t- task input argument\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nNDIS_STATUS RtmpOSTaskAttach(\n\tRTMP_OS_TASK *pTaskOrg,\n\tRTMP_OS_TASK_CALLBACK fn,\n\tULONG arg)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask == NULL)\n\t\treturn NDIS_STATUS_FAILURE;\n\treturn __RtmpOSTaskAttach(pTask, fn, arg);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize a kernel task.\n\nArguments:\n\tpTaskOrg\t\t- the task\n\tpTaskName\t\t- task name\n\tpPriv\t\t\t- task input argument\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nNDIS_STATUS RtmpOSTaskInit(\n\tRTMP_OS_TASK *pTaskOrg,\n\tPSTRING pTaskName,\n\tVOID *pPriv,\n\tLIST_HEADER *pTaskList,\n\tLIST_HEADER *pSemList)\n{\n\tOS_TASK *pTask;\n\n\tif (RtmpOSTaskAlloc(pTaskOrg, pTaskList) == FALSE)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask == NULL)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\treturn __RtmpOSTaskInit(pTask, pTaskName, pPriv, pSemList);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWait for a event in the task.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpTaskOrg\t\t- the task\n\nReturn Value:\n\tTRUE\n\tFALSE\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOSTaskWait(VOID *pReserved, RTMP_OS_TASK *pTaskOrg, INT32 *pStatus)\n{\n\tOS_TASK *pTask;\n\n\tpTask = (OS_TASK *) (pTaskOrg->pContent);\n\tif (pTask == NULL)\n\t\treturn FALSE;\n\n\treturn __RtmpOSTaskWait(pReserved, pTask, pStatus);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet private data for the task.\n\nArguments:\n\tpTaskOrg\t\t- the task\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID *RtmpOsTaskDataGet(RTMP_OS_TASK *pTaskOrg)\n{\n\tif (pTaskOrg->pContent == NULL)\n\t\treturn NULL;\n\n\treturn (((OS_TASK *) (pTaskOrg->pContent))->priv);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAllocate a lock.\n\nArguments:\n\tpLock\t\t\t- the lock\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsAllocateLock(NDIS_SPIN_LOCK *pLock, LIST_HEADER *pLockList)\n{\n\tif (RTMP_OS_Alloc_RscOnly(pLock, sizeof (OS_NDIS_SPIN_LOCK)) == FALSE) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: alloc lock fail!\\n\", __FUNCTION__));\n\t\treturn FALSE;\t/* allocate fail */\n\t}\n\n\tOS_NdisAllocateSpinLock(pLock->pContent);\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tFree a lock.\n\nArguments:\n\tpLockOrg\t\t- the lock\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsFreeSpinLock(NDIS_SPIN_LOCK *pLockOrg)\n{\n\t/* we will free all locks memory in RTMP_OS_FREE_LOCK() */\n\tOS_NDIS_SPIN_LOCK *pLock;\n\n\tpLock = (OS_NDIS_MINIPORT_TIMER *) (pLockOrg->pContent);\n\tif (pLock != NULL) {\n\t\tOS_NdisFreeSpinLock(pLock);\n\n\t\tos_free_mem(NULL, pLock);\n\t\tpLockOrg->pContent = NULL;\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSpin lock bh.\n\nArguments:\n\tpLockOrg\t\t- the lock\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSpinLockBh(NDIS_SPIN_LOCK *pLockOrg)\n{\n\tOS_NDIS_SPIN_LOCK *pLock;\n\n\tpLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);\n\tif (pLock != NULL) {\n\t\tOS_SEM_LOCK(pLock);\n\t} else\n\t\tprintk(\"lock> warning! the lock was freed!\\n\");\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSpin unlock bh.\n\nArguments:\n\tpLockOrg\t\t- the lock\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSpinUnLockBh(NDIS_SPIN_LOCK *pLockOrg)\n{\n\tOS_NDIS_SPIN_LOCK *pLock;\n\n\tpLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);\n\tif (pLock != NULL) {\n\t\tOS_SEM_UNLOCK(pLock);\n\t} else\n\t\tprintk(\"lock> warning! the lock was freed!\\n\");\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInterrupt lock.\n\nArguments:\n\tpLockOrg\t\t- the lock\n\tpIrqFlags\t\t- the lock flags\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsIntLock(NDIS_SPIN_LOCK *pLockOrg, ULONG *pIrqFlags)\n{\n\tOS_NDIS_SPIN_LOCK *pLock;\n\n\tpLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);\n\tif (pLock != NULL) {\n\t\tOS_INT_LOCK(pLock, *pIrqFlags);\n\t} else\n\t\tprintk(\"lock> warning! the lock was freed!\\n\");\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInterrupt unlock.\n\nArguments:\n\tpLockOrg\t\t- the lock\n\tIrqFlags\t\t- the lock flags\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsIntUnLock(NDIS_SPIN_LOCK *pLockOrg, ULONG IrqFlags)\n{\n\tOS_NDIS_SPIN_LOCK *pLock;\n\n\tpLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);\n\tif (pLock != NULL) {\n\t\tOS_INT_UNLOCK(pLock, IrqFlags);\n\t} else\n\t\tprintk(\"lock> warning! the lock was freed!\\n\");\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet MAC address for the network interface.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nunsigned char *RtmpOsNetDevGetPhyAddr(VOID *pDev)\n{\n\treturn RTMP_OS_NETDEV_GET_PHYADDR((PNET_DEV) pDev);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tStart network interface TX queue.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsNetQueueStart(PNET_DEV pDev)\n{\n\tRTMP_OS_NETDEV_START_QUEUE(pDev);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tStop network interface TX queue.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsNetQueueStop(PNET_DEV pDev)\n{\n\tRTMP_OS_NETDEV_STOP_QUEUE(pDev);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWake up network interface TX queue.\n\nArguments:\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsNetQueueWake(PNET_DEV pDev)\n{\n\tRTMP_OS_NETDEV_WAKE_QUEUE(pDev);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAssign network interface to the packet.\n\nArguments:\n\tpPkt\t\t\t- the packet\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSetPktNetDev(VOID *pPkt, VOID *pDev)\n{\n\tSET_OS_PKT_NETDEV(pPkt, (PNET_DEV) pDev);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAssign network interface type.\n\nArguments:\n\tpDev\t\t\t- the device\n\tType\t\t\t- the type\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSetNetDevType(VOID *pDev, USHORT Type)\n{\n\tRTMP_OS_NETDEV_SET_TYPE((PNET_DEV) pDev, Type);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAssign network interface type for monitor mode.\n\nArguments:\n\tpDev\t\t\t- the device\n\tType\t\t\t- the type\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSetNetDevTypeMonitor(VOID *pDev)\n{\n\tRTMP_OS_NETDEV_SET_TYPE((PNET_DEV) pDev, ARPHRD_IEEE80211_PRISM);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet PID.\n\nArguments:\n\tpPkt\t\t\t- the packet\n\tpDev\t\t\t- the device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsGetPid(IN ULONG *pDst,\n\t\t  IN ULONG PID)\n{\n\tRT_GET_OS_PID(*pDst, PID);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWait for a moment.\n\nArguments:\n\tTime\t\t\t- micro second\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsWait(UINT32 Time)\n{\n\tOS_WAIT(Time);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if b is smaller than a.\n\nArguments:\n\tTime\t\t\t- micro second\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsTimerAfter(ULONG a, ULONG b)\n{\n\treturn RTMP_TIME_AFTER(a, b);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if b is not smaller than a.\n\nArguments:\n\tTime\t\t\t- micro second\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsTimerBefore(ULONG a, ULONG b)\n{\n\treturn RTMP_TIME_BEFORE(a, b);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet current system time.\n\nArguments:\n\tpTime\t\t\t- system time (tick)\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsGetSystemUpTime(ULONG *pTime)\n{\n\tNdisGetSystemUpTime(pTime);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tGet OS tick unit.\n\nArguments:\n\tpOps\t\t\t- Utility table\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsTickUnitGet(VOID)\n{\n\treturn HZ;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tntohs\n\nArguments:\n\tValue\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nUINT16 RtmpOsNtohs(UINT16 Value)\n{\n\treturn OS_NTOHS(Value);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\thtons\n\nArguments:\n\tValue\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nUINT16 RtmpOsHtons(UINT16 Value)\n{\n\treturn OS_HTONS(Value);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tntohl\n\nArguments:\n\tValue\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsNtohl(UINT32 Value)\n{\n\treturn OS_NTOHL(Value);\n}\n\n/*\n========================================================================\nRoutine Description:\n\thtonl\n\nArguments:\n\tValue\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsHtonl(UINT32 Value)\n{\n\treturn OS_HTONL(Value);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tget_unaligned for 16-bit value.\n\nArguments:\n\tpWord\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nUINT16 RtmpOsGetUnaligned(UINT16 *pWord)\n{\n\treturn get_unaligned(pWord);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tget_unaligned for 32-bit value.\n\nArguments:\n\tpWord\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsGetUnaligned32(UINT32 *pWord)\n{\n\treturn get_unaligned(pWord);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tget_unaligned for long-bit value.\n\nArguments:\n\tpWord\t\t\t- the value\n\nReturn Value:\n\tthe value\n\nNote:\n========================================================================\n*/\nULONG RtmpOsGetUnalignedlong(ULONG *pWord)\n{\n\treturn get_unaligned(pWord);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet maximum scan data length.\n\nArguments:\n\tNone\n\nReturn Value:\n\tlength\n\nNote:\n\tUsed in site servey.\n========================================================================\n*/\nULONG RtmpOsMaxScanDataGet(VOID)\n{\n\treturn IW_SCAN_MAX_DATA;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tcopy_from_user\n\nArguments:\n\tto\t\t\t\t-\n\tfrom\t\t\t-\n\tn\t\t\t\t- size\n\nReturn Value:\n\tcopy size\n\nNote:\n========================================================================\n*/\nULONG RtmpOsCopyFromUser(VOID *to, const void *from, ULONG n)\n{\n\treturn (copy_from_user(to, from, n));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tcopy_to_user\n\nArguments:\n\tto\t\t\t\t-\n\tfrom\t\t\t-\n\tn\t\t\t\t- size\n\nReturn Value:\n\tcopy size\n\nNote:\n========================================================================\n*/\nULONG RtmpOsCopyToUser(VOID *to, const void *from, ULONG n)\n{\n\treturn (copy_to_user(to, from, n));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize a semaphore.\n\nArguments:\n\tpSem\t\t\t- the semaphore\n\nReturn Value:\n\tTRUE\t\t\t- Successfully\n\tFALSE\t\t\t- Fail\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsSemaInitLocked(RTMP_OS_SEM *pSem, LIST_HEADER *pSemList)\n{\n\tif (RTMP_OS_Alloc_RscOnly(pSem, sizeof (OS_SEM)) == FALSE) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: alloc semaphore fail!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tOS_SEM_EVENT_INIT_LOCKED((OS_SEM *) (pSem->pContent));\n\treturn TRUE;\n}\n\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize a semaphore.\n\nArguments:\n\tpSemOrg\t\t\t- the semaphore\n\nReturn Value:\n\tTRUE\t\t\t- Successfully\n\tFALSE\t\t\t- Fail\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsSemaInit(RTMP_OS_SEM *pSem, LIST_HEADER *pSemList)\n{\n\tif (RTMP_OS_Alloc_RscOnly(pSem, sizeof (OS_SEM)) == FALSE) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: alloc semaphore fail!\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\tOS_SEM_EVENT_INIT((OS_SEM *) (pSem->pContent));\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tDestroy a semaphore.\n\nArguments:\n\tpSemOrg\t\t\t- the semaphore\n\nReturn Value:\n\tTRUE\t\t\t- Successfully\n\tFALSE\t\t\t- Fail\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsSemaDestory(RTMP_OS_SEM *pSemOrg)\n{\n\tOS_SEM *pSem;\n\n\tpSem = (OS_SEM *) (pSemOrg->pContent);\n\tif (pSem != NULL) {\n\t\tOS_SEM_EVENT_DESTORY(pSem);\n\n\t\tos_free_mem(NULL, pSem);\n\t\tpSemOrg->pContent = NULL;\n\t} else\n\t\tprintk(\"sem> warning! double-free sem!\\n\");\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWait a semaphore.\n\nArguments:\n\tpSemOrg\t\t\t- the semaphore\n\nReturn Value:\n\t0\t\t\t\t- Successfully\n\tOtherwise\t\t- Fail\n\nNote:\n========================================================================\n*/\nINT32 RtmpOsSemaWaitInterruptible(RTMP_OS_SEM *pSemOrg)\n{\n\tOS_SEM *pSem;\n\tINT Status = -1;\n\n\tpSem = (OS_SEM *) (pSemOrg->pContent);\n\tif (pSem != NULL)\n\t\tOS_SEM_EVENT_WAIT(pSem, Status);\n\treturn Status;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tWake up a semaphore.\n\nArguments:\n\tpSemOrg\t\t\t- the semaphore\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsSemaWakeUp(RTMP_OS_SEM *pSemOrg)\n{\n\tOS_SEM *pSem;\n\n\tpSem = (OS_SEM *) (pSemOrg->pContent);\n\tif (pSem != NULL)\n\t\tOS_SEM_EVENT_UP(pSem);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if we are in a interrupt.\n\nArguments:\n\tNone\n\nReturn Value:\n\t0\t\t\t\t- No\n\tOtherwise\t\t- Yes\n\nNote:\n========================================================================\n*/\nINT32 RtmpOsIsInInterrupt(VOID)\n{\n\treturn (in_interrupt());\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCopy the data buffer to the packet frame body.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpNetPkt\t\t\t- the packet\n\tThisFrameLen\t- copy length\n\tpData\t\t\t- the data buffer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktBodyCopy(\n\tPNET_DEV pNetDev,\n\tPNDIS_PACKET pNetPkt,\n\tULONG ThisFrameLen,\n\tPUCHAR pData)\n{\n\tmemcpy(skb_put(pNetPkt, ThisFrameLen), pData, ThisFrameLen);\n\tSET_OS_PKT_NETDEV(pNetPkt, pNetDev);\n\tRTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pNetPkt), PKTSRC_NDIS);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if the packet is cloned.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\nReturn Value:\n\tTRUE\t\t\t- Yes\n\tOtherwise\t\t- No\n\nNote:\n========================================================================\n*/\nINT RtmpOsIsPktCloned(PNDIS_PACKET pNetPkt)\n{\n\treturn OS_PKT_CLONED(pNetPkt);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tDuplicate a packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\nReturn Value:\n\tthe new packet\n\nNote:\n========================================================================\n*/\nPNDIS_PACKET RtmpOsPktCopy(PNDIS_PACKET pNetPkt)\n{\n\treturn skb_copy(RTPKT_TO_OSPKT(pNetPkt), GFP_ATOMIC);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tClone a packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\nReturn Value:\n\tthe cloned packet\n\nNote:\n========================================================================\n*/\nPNDIS_PACKET RtmpOsPktClone(PNDIS_PACKET pNetPkt)\n{\n\treturn skb_clone(RTPKT_TO_OSPKT(pNetPkt), MEM_ALLOC_FLAG);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAssign the data pointer for the packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\t*pData\t\t\t- the data buffer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktDataPtrAssign(PNDIS_PACKET pNetPkt, UCHAR *pData)\n{\n\tSET_OS_PKT_DATAPTR(pNetPkt, pData);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAssign the data length for the packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\tLen\t\t\t\t- the data length\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktLenAssign(PNDIS_PACKET pNetPkt, LONG Len)\n{\n\tSET_OS_PKT_LEN(pNetPkt, Len);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAdjust the tail pointer for the packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\tremovedTagLen\t- the size for adjustment\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktTailAdjust(PNDIS_PACKET pNetPkt, UINT removedTagLen)\n{\n\tOS_PKT_TAIL_ADJUST(pNetPkt, removedTagLen);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAdjust the data pointer for the packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\tLen\t\t\t\t- the size for adjustment\n\nReturn Value:\n\tthe new data pointer for the packet\n\nNote:\n========================================================================\n*/\nPUCHAR RtmpOsPktTailBufExtend(PNDIS_PACKET pNetPkt, UINT Len)\n{\n\treturn OS_PKT_TAIL_BUF_EXTEND(pNetPkt, Len);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tadjust headroom for the packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\tLen\t\t\t\t- the size for adjustment\n\nReturn Value:\n\tthe new data pointer for the packet\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktReserve(PNDIS_PACKET pNetPkt, UINT Len)\n{\n\tOS_PKT_RESERVE(pNetPkt, Len);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAdjust the data pointer for the packet.\n\nArguments:\n\tpNetPkt\t\t\t- the packet\n\tLen\t\t\t\t- the size for adjustment\n\nReturn Value:\n\tthe new data pointer for the packet\n\nNote:\n========================================================================\n*/\nPUCHAR RtmpOsPktHeadBufExtend(PNDIS_PACKET pNetPkt, UINT Len)\n{\n\treturn OS_PKT_HEAD_BUF_EXTEND(pNetPkt, Len);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\t\n\nArguments:\n\tpPkt\t\t\t- the packet\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsPktInfPpaSend(PNDIS_PACKET pNetPkt)\n{\n#ifdef INF_PPA_SUPPORT\n\tstruct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt);\n\tint ret = 0;\n\tunsigned int ppa_flags = 0;\t/* reserved for now */\n\n\tpRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);\n\n\tmemset(pRxPkt->head, 0, pRxPkt->data - pRxPkt->head - 14);\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"ppa_hook_directpath_send_fn rx :ret:%d headroom:%d dev:%s pktlen:%d<===\\n\",\n\t\t  ret, skb_headroom(pRxPkt) , pRxPkt->dev->name, pRxPkt->len));\n\thex_dump(\"rx packet\", pRxPkt->data, 32);\n\tret = ppa_hook_directpath_send_fn(pAd->g_if_id, pRxPkt, pRxPkt->len, ppa_flags);\n#endif /* INF_PPA_SUPPORT */\n}\n\n\nINT32 RtmpThreadPidKill(RTMP_OS_PID PID)\n{\n\treturn KILL_THREAD_PID(PID, SIGTERM, 1);\n}\n\n\nlong RtmpOsSimpleStrtol(const char *cp, char **endp, unsigned int base)\n{\n\treturn simple_strtol(cp, endp, base);\n}\n\n\nBOOLEAN RtmpOsPktOffsetInit(VOID)\n{\n\tstruct sk_buff *pPkt = NULL;\n\n\tif ((RTPktOffsetData == 0) && (RTPktOffsetLen == 0)\n\t    && (RTPktOffsetCB == 0)) {\n\t\tpPkt = kmalloc(sizeof (struct sk_buff), GFP_ATOMIC);\n\t\tif (pPkt == NULL)\n\t\t\treturn FALSE;\n\n\t\tRTPktOffsetData = (ULONG) (&(pPkt->data)) - (ULONG) pPkt;\n\t\tRTPktOffsetLen = (ULONG) (&(pPkt->len)) - (ULONG) pPkt;\n\t\tRTPktOffsetCB = (ULONG) (pPkt->cb) - (ULONG) pPkt;\n\t\tkfree(pPkt);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"packet> data offset = %lu\\n\", RTPktOffsetData));\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"packet> len offset = %lu\\n\", RTPktOffsetLen));\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"packet> cb offset = %lu\\n\", RTPktOffsetCB));\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize the OS atomic_t.\n\nArguments:\n\tpAtomic\t\t\t- the atomic\n\nReturn Value:\n\tTRUE\t\t\t- allocation successfully\n\tFALSE\t\t\t- allocation fail\n\nNote:\n========================================================================\n*/\nBOOLEAN RtmpOsAtomicInit(RTMP_OS_ATOMIC *pAtomic, LIST_HEADER *pAtomicList)\n{\n\tif (RTMP_OS_Alloc_RscOnly(pAtomic, sizeof (atomic_t)) == FALSE) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: alloc atomic fail!\\n\", __FUNCTION__));\n\t\treturn FALSE;\t/* allocate fail */\n\t}\n\n\treturn TRUE;\n}\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize the OS atomic_t.\n\nArguments:\n\tpAtomic\t\t\t- the atomic\n\nReturn Value:\n\tTRUE\t\t\t- allocation successfully\n\tFALSE\t\t\t- allocation fail\n\nNote:\n========================================================================\n*/\nVOID RtmpOsAtomicDestroy(RTMP_OS_ATOMIC *pAtomic)\n{\n\tif (pAtomic->pContent) {\n\t\tos_free_mem(NULL, pAtomic->pContent);\n\t\tpAtomic->pContent = NULL;\n\t}\n}\n\n/*\n========================================================================\nRoutine Description:\n\tAtomic read a variable.\n\nArguments:\n\tpAtomic\t\t\t- the atomic\n\nReturn Value:\n\tcontent\n\nNote:\n========================================================================\n*/\nLONG RtmpOsAtomicRead(RTMP_OS_ATOMIC *pAtomicSrc)\n{\n\tif (pAtomicSrc->pContent)\n\t\treturn atomic_read((atomic_t *) (pAtomicSrc->pContent));\n\telse\n\t\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tAtomic dec a variable.\n\nArguments:\n\tpAtomic\t\t\t- the atomic\n\nReturn Value:\n\tcontent\n\nNote:\n========================================================================\n*/\nVOID RtmpOsAtomicDec(RTMP_OS_ATOMIC *pAtomicSrc)\n{\n\tif (pAtomicSrc->pContent)\n\t\tatomic_dec((atomic_t *) (pAtomicSrc->pContent));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSets a 32-bit variable to the specified value as an atomic operation.\n\nArguments:\n\tpAtomic\t\t\t- the atomic\n\tValue\t\t\t- the value to be exchanged\n\nReturn Value:\n\tthe initial value of the pAtomicSrc parameter\n\nNote:\n========================================================================\n*/\nVOID RtmpOsAtomicInterlockedExchange(\n\tRTMP_OS_ATOMIC *pAtomicSrc,\n\tLONG Value)\n{\n\tif (pAtomicSrc->pContent)\n\t\tInterlockedExchange((atomic_t *) (pAtomicSrc->pContent), Value);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tInitialize the OS utilities.\n\nArguments:\n\tpOps\t\t\t- Utility table\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID RtmpOsOpsInit(RTMP_OS_ABL_OPS *pOps)\n{\n\tpOps->ra_printk = (RTMP_PRINTK)printk;\n\tpOps->ra_snprintf = (RTMP_SNPRINTF)snprintf;\n}\n\n#else /* OS_ABL_FUNC_SUPPORT */\n\n\nvoid RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet)\n{\n\t__RtmpOSFSInfoChange(pOSFSInfoOrg, bSet);\n}\n\n\n/* timeout -- ms */\nVOID RTMP_SetPeriodicTimer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout)\n{\n\t__RTMP_SetPeriodicTimer(pTimerOrg, timeout);\n}\n\n\n/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */\nVOID RTMP_OS_Init_Timer(\n\tVOID *pReserved,\n\tNDIS_MINIPORT_TIMER *pTimerOrg,\n\tTIMER_FUNCTION function,\n\tPVOID data,\n\tLIST_HEADER *pTimerList)\n{\n\t__RTMP_OS_Init_Timer(pReserved, pTimerOrg, function, data);\n}\n\n\nVOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout)\n{\n\t__RTMP_OS_Add_Timer(pTimerOrg, timeout);\n}\n\n\nVOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout)\n{\n\t__RTMP_OS_Mod_Timer(pTimerOrg, timeout);\n}\n\n\nVOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled)\n{\n\t__RTMP_OS_Del_Timer(pTimerOrg, pCancelled);\n}\n\n\nVOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg)\n{\n\t__RTMP_OS_Release_Timer(pTimerOrg);\n}\n\n\nNDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTask)\n{\n\treturn __RtmpOSTaskKill(pTask);\n}\n\n\nINT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTask)\n{\n\treturn __RtmpOSTaskNotifyToExit(pTask);\n}\n\n\nvoid RtmpOSTaskCustomize(RTMP_OS_TASK *pTask)\n{\n\t__RtmpOSTaskCustomize(pTask);\n}\n\n\nNDIS_STATUS RtmpOSTaskAttach(\n\tRTMP_OS_TASK *pTask,\n\tRTMP_OS_TASK_CALLBACK fn,\n\tULONG arg)\n{\n\treturn __RtmpOSTaskAttach(pTask, fn, arg);\n}\n\n\nNDIS_STATUS RtmpOSTaskInit(\n\tRTMP_OS_TASK *pTask,\n\tPSTRING pTaskName,\n\tVOID *pPriv,\n\tLIST_HEADER *pTaskList,\n\tLIST_HEADER *pSemList)\n{\n\treturn __RtmpOSTaskInit(pTask, pTaskName, pPriv, pSemList);\n}\n\n\nBOOLEAN RtmpOSTaskWait(VOID *pReserved, RTMP_OS_TASK * pTask, INT32 *pStatus)\n{\n\treturn __RtmpOSTaskWait(pReserved, pTask, pStatus);\n}\n\n\nVOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTask)\n{\n#ifdef KTHREAD_SUPPORT\n\tWAKE_UP(pTask);\n#else\n\tRTMP_SEM_EVENT_UP(&pTask->taskSema);\n#endif\n}\n\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n"
  },
  {
    "path": "src/os/linux/rt_linux_symb.c",
    "content": "/****************************************************************************\n\n    Module Name:\n    UTIL/rt_linux_symb.c\n \n    Abstract:\n\tAll symbols provided from UTIL module are put here.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#define RTMP_MODULE_OS\n#define RTMP_MODULE_OS_UTIL\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rtmp_osabl.h\"\n#include \"rt_os_util.h\"\n\n\n#ifdef OS_ABL_FUNC_SUPPORT\n\nEXPORT_SYMBOL(RTDebugLevel);\nEXPORT_SYMBOL(RTDebugFunc);\n\n/* utility */\nEXPORT_SYMBOL(RtmpUtilInit);\nEXPORT_SYMBOL(RTMPFreeNdisPacket);\nEXPORT_SYMBOL(AdapterBlockAllocateMemory);\n\nEXPORT_SYMBOL(RTMP_SetPeriodicTimer);\nEXPORT_SYMBOL(RTMP_OS_Add_Timer);\nEXPORT_SYMBOL(RTMP_OS_Mod_Timer);\nEXPORT_SYMBOL(RTMP_OS_Del_Timer);\nEXPORT_SYMBOL(RTMP_OS_Init_Timer);\nEXPORT_SYMBOL(RTMP_OS_Release_Timer);\n\nEXPORT_SYMBOL(RTMP_OS_Alloc_Rsc);\nEXPORT_SYMBOL(RTMP_OS_Free_Rscs);\n\nEXPORT_SYMBOL(os_alloc_mem);\nEXPORT_SYMBOL(os_alloc_mem_suspend);\nEXPORT_SYMBOL(os_free_mem);\n\nEXPORT_SYMBOL(ExpandPacket);\nEXPORT_SYMBOL(ClonePacket);\nEXPORT_SYMBOL(RTMP_AllocateFragPacketBuffer);\nEXPORT_SYMBOL(Sniff2BytesFromNdisBuffer);\nEXPORT_SYMBOL(RtmpOSNetPktAlloc);\nEXPORT_SYMBOL(duplicate_pkt_with_TKIP_MIC);\nEXPORT_SYMBOL(RTMPAllocateNdisPacket);\nEXPORT_SYMBOL(RTMP_QueryPacketInfo);\nEXPORT_SYMBOL(DuplicatePacket);\nEXPORT_SYMBOL(duplicate_pkt);\nEXPORT_SYMBOL(RTMPL2FrameTxAction);\nEXPORT_SYMBOL(RtmpOsPktBodyCopy);\nEXPORT_SYMBOL(RtmpOsIsPktCloned);\nEXPORT_SYMBOL(RtmpOsPktCopy);\nEXPORT_SYMBOL(RtmpOsPktClone);\nEXPORT_SYMBOL(RtmpOsPktDataPtrAssign);\nEXPORT_SYMBOL(RtmpOsPktLenAssign);\nEXPORT_SYMBOL(RtmpOsPktTailAdjust);\nEXPORT_SYMBOL(RtmpOsPktTailBufExtend);\nEXPORT_SYMBOL(RtmpOsPktHeadBufExtend);\nEXPORT_SYMBOL(RtmpOsPktReserve);\nEXPORT_SYMBOL(RtmpOsPktProtocolAssign);\nEXPORT_SYMBOL(RtmpOsPktInfPpaSend);\nEXPORT_SYMBOL(RtmpThreadPidKill);\nEXPORT_SYMBOL(RtmpOsPktRcvHandle);\n#ifdef IAPP_SUPPORT\nEXPORT_SYMBOL(RtmpOsPktIappMakeUp);\n#endif /* IAPP_SUPPORT */\nEXPORT_SYMBOL(RtmpOsPktInit);\n#ifdef CONFIG_AP_SUPPORT\nEXPORT_SYMBOL(VLAN_8023_Header_Copy);\n#endif /* CONFIG_AP_SUPPORT */\nEXPORT_SYMBOL(wlan_802_11_to_802_3_packet);\nEXPORT_SYMBOL(RtmpOsPktOffsetInit);\n\n#ifdef HDR_TRANS_SUPPORT\nEXPORT_SYMBOL(RtmpOsSetPacket);\n#endif /* HDR_TRANS_SUPPORT */\n\nEXPORT_SYMBOL(RtmpOSNetDevCreate);\nEXPORT_SYMBOL(RtmpOSNetDevClose);\nEXPORT_SYMBOL(RtmpOSNetDevAttach);\nEXPORT_SYMBOL(RtmpOSNetDevDetach);\nEXPORT_SYMBOL(RtmpOSNetDevProtect);\nEXPORT_SYMBOL(RtmpOSNetDevFree);\nEXPORT_SYMBOL(RtmpOSNetDevIsUp);\nEXPORT_SYMBOL(RtmpOsNetDevGetPhyAddr);\nEXPORT_SYMBOL(RtmpOsNetQueueStart);\nEXPORT_SYMBOL(RtmpOsNetQueueStop);\nEXPORT_SYMBOL(RtmpOsNetQueueWake);\nEXPORT_SYMBOL(RtmpOsSetPktNetDev);\nEXPORT_SYMBOL(RtmpOsPktNetDevGet);\nEXPORT_SYMBOL(RtmpOsGetNetDevName);\nEXPORT_SYMBOL(RtmpOsSetNetDevPriv);\nEXPORT_SYMBOL(RtmpOsGetNetDevPriv);\nEXPORT_SYMBOL(RtmpDevPrivFlagsGet);\nEXPORT_SYMBOL(RtmpOsSetNetDevType);\nEXPORT_SYMBOL(RtmpOsSetNetDevTypeMonitor);\nEXPORT_SYMBOL(RtmpOSNetDevAddrSet);\n\nEXPORT_SYMBOL(RtmpOSFileOpen);\nEXPORT_SYMBOL(RtmpOSFSInfoChange);\nEXPORT_SYMBOL(RtmpOSFileWrite);\nEXPORT_SYMBOL(RtmpOSFileRead);\nEXPORT_SYMBOL(RtmpOSFileClose);\nEXPORT_SYMBOL(RtmpOSFileSeek);\nEXPORT_SYMBOL(RtmpOsFileIsErr);\n\nEXPORT_SYMBOL(RtmpOSTaskNotifyToExit);\nEXPORT_SYMBOL(RtmpOSTaskInit);\nEXPORT_SYMBOL(RtmpOSTaskAttach);\nEXPORT_SYMBOL(RtmpOSTaskCustomize);\nEXPORT_SYMBOL(RtmpOSTaskKill);\nEXPORT_SYMBOL(RtmpOSTaskAlloc);\nEXPORT_SYMBOL(RtmpOSTaskFree);\nEXPORT_SYMBOL(RtmpOSTaskWait);\nEXPORT_SYMBOL(RtmpOsCheckTaskLegality);\nEXPORT_SYMBOL(RtmpOsTaskDataGet);\nEXPORT_SYMBOL(RtmpOsTaskIsKilled);\nEXPORT_SYMBOL(RtmpOsTaskWakeUp);\n\nEXPORT_SYMBOL(RtmpOsTaskletSche);\nEXPORT_SYMBOL(RtmpOsTaskletInit);\nEXPORT_SYMBOL(RtmpOsTaskletKill);\nEXPORT_SYMBOL(RtmpOsTaskletDataAssign);\nEXPORT_SYMBOL(RtmpOsTaskPidInit);\n\nEXPORT_SYMBOL(RtmpOsAllocateLock);\nEXPORT_SYMBOL(RtmpOsFreeSpinLock);\nEXPORT_SYMBOL(RtmpOsSpinLockBh);\nEXPORT_SYMBOL(RtmpOsSpinUnLockBh);\nEXPORT_SYMBOL(RtmpOsIntLock);\nEXPORT_SYMBOL(RtmpOsIntUnLock);\n\nEXPORT_SYMBOL(RtmpOsSemaInitLocked);\nEXPORT_SYMBOL(RtmpOsSemaInit);\nEXPORT_SYMBOL(RtmpOsSemaDestory);\nEXPORT_SYMBOL(RtmpOsSemaWaitInterruptible);\nEXPORT_SYMBOL(RtmpOsSemaWakeUp);\nEXPORT_SYMBOL(RtmpOsMlmeUp);\n\nEXPORT_SYMBOL(RtmpOsGetPid);\n\nEXPORT_SYMBOL(RtmpOsWait);\nEXPORT_SYMBOL(RtmpOsTimerAfter);\nEXPORT_SYMBOL(RtmpOsTimerBefore);\nEXPORT_SYMBOL(RtmpOsGetSystemUpTime);\n\nEXPORT_SYMBOL(RtmpOsDCacheFlush);\n\n\nEXPORT_SYMBOL(RtmpOsNtohs);\nEXPORT_SYMBOL(RtmpOsHtons);\nEXPORT_SYMBOL(RtmpOsNtohl);\nEXPORT_SYMBOL(RtmpOsHtonl);\n\nEXPORT_SYMBOL(RtmpOsVmalloc);\nEXPORT_SYMBOL(RtmpOsVfree);\nEXPORT_SYMBOL(RtmpOsCopyFromUser);\nEXPORT_SYMBOL(RtmpOsCopyToUser);\n\nEXPORT_SYMBOL(RtmpOsCmdUp);\nEXPORT_SYMBOL(RtmpOsCmdDisplayLenCheck);\n\nEXPORT_SYMBOL(hex_dump);\nEXPORT_SYMBOL(RtmpOsSendWirelessEvent);\nEXPORT_SYMBOL(RTMP_GetCurrentSystemTime);\nEXPORT_SYMBOL(RTMP_GetCurrentSystemTick);\nEXPORT_SYMBOL(RTMPusecDelay);\nEXPORT_SYMBOL(RtmpOsMsDelay);\nEXPORT_SYMBOL(RtmpOSWrielessEventSend);\nEXPORT_SYMBOL(RtmpOSWrielessEventSendExt);\nEXPORT_SYMBOL(RtmpOsTickUnitGet);\nEXPORT_SYMBOL(RtmpOsOpsInit);\nEXPORT_SYMBOL(RtmpOsGetUnaligned);\nEXPORT_SYMBOL(RtmpOsGetUnaligned32);\nEXPORT_SYMBOL(RtmpOsGetUnalignedlong);\nEXPORT_SYMBOL(RtmpOsMaxScanDataGet);\nEXPORT_SYMBOL(RtmpDrvMaxRateGet);\nEXPORT_SYMBOL(RtmpOsWirelessExtVerGet);\nEXPORT_SYMBOL(rtstrchr);\nEXPORT_SYMBOL(RtmpOsIsInInterrupt);\nEXPORT_SYMBOL(RtmpOsSimpleStrtol);\nEXPORT_SYMBOL(RtmpOsStatsAlloc);\n\nEXPORT_SYMBOL(RtmpOsAtomicInit);\nEXPORT_SYMBOL(RtmpOsAtomicDestroy);\nEXPORT_SYMBOL(RtmpOsAtomicRead);\nEXPORT_SYMBOL(RtmpOsAtomicDec);\nEXPORT_SYMBOL(RtmpOsAtomicInterlockedExchange);\n\nEXPORT_SYMBOL(RtmpDrvAllMacPrint);\nEXPORT_SYMBOL(RtmpDrvAllE2PPrint);\n\nEXPORT_SYMBOL(RtmpMeshDown);\nEXPORT_SYMBOL(RtmpOSIRQRelease);\nEXPORT_SYMBOL(RtmpOsWlanEventSet);\n\n/* cfg80211 */\n#ifdef RT_CFG80211_SUPPORT\nextern UCHAR Cfg80211_Chan[];\nEXPORT_SYMBOL(CFG80211OS_UnRegister);\nEXPORT_SYMBOL(CFG80211_SupBandInit);\nEXPORT_SYMBOL(Cfg80211_Chan);\nEXPORT_SYMBOL(CFG80211OS_RegHint);\nEXPORT_SYMBOL(CFG80211OS_RegHint11D);\nEXPORT_SYMBOL(CFG80211OS_BandInfoGet);\nEXPORT_SYMBOL(CFG80211OS_ChanNumGet);\nEXPORT_SYMBOL(CFG80211OS_ChanInfoGet);\nEXPORT_SYMBOL(CFG80211OS_ChanInfoInit);\nEXPORT_SYMBOL(CFG80211OS_Scaning);\nEXPORT_SYMBOL(CFG80211OS_ScanEnd);\nEXPORT_SYMBOL(CFG80211OS_ConnectResultInform);\nEXPORT_SYMBOL(CFG80211OS_SupBandReInit);\n#endif /* RT_CFG80211_SUPPORT */\n\n/* global variables */\nEXPORT_SYMBOL(RTPktOffsetData);\nEXPORT_SYMBOL(RTPktOffsetLen);\nEXPORT_SYMBOL(RTPktOffsetCB);\n\n#ifdef VENDOR_FEATURE4_SUPPORT\nEXPORT_SYMBOL(OS_NumOfMemAlloc);\nEXPORT_SYMBOL(OS_NumOfMemFree);\n#endif /* VENDOR_FEATURE4_SUPPORT */\n\n#ifdef VENDOR_FEATURE2_SUPPORT\nEXPORT_SYMBOL(OS_NumOfPktAlloc);\nEXPORT_SYMBOL(OS_NumOfPktFree);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\n/* only for AP */\n#ifdef CONFIG_AP_SUPPORT\nEXPORT_SYMBOL(duplicate_pkt_with_VLAN);\n#ifdef BG_FT_SUPPORT\nEXPORT_SYMBOL(BG_FTPH_Init);\nEXPORT_SYMBOL(BG_FTPH_Remove);\n#endif /* BG_FT_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\nEXPORT_SYMBOL(ralinkrate);\nEXPORT_SYMBOL(RT_RateSize);\nEXPORT_SYMBOL(send_monitor_packets);\n\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\nEXPORT_SYMBOL(wext_notify_event_assoc);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\nEXPORT_SYMBOL(SendAssocIEsToWpaSupplicant);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\nEXPORT_SYMBOL(WpaSendMicFailureToWpaSupplicant);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/* only for PCI */\n\n/* only for USB */\n#ifdef RTMP_MAC_USB\nEXPORT_SYMBOL(dump_urb);\nEXPORT_SYMBOL(RtmpOsUsbUrbDataGet);\nEXPORT_SYMBOL(RtmpOsUsbUrbStatusGet);\nEXPORT_SYMBOL(RtmpOsUsbUrbLenGet);\nEXPORT_SYMBOL(RtmpOsUsbEmptyUrbCheck);\nEXPORT_SYMBOL(RtmpOsUsbInitHTTxDesc);\nEXPORT_SYMBOL(RtmpOsUsbInitRxDesc);\nEXPORT_SYMBOL(RtmpOsUsbContextGet);\nEXPORT_SYMBOL(RtmpOsUsbStatusGet);\nEXPORT_SYMBOL(RtmpOsUsbDmaMapping);\nEXPORT_SYMBOL(RtmpOsGetUsbDevVendorID);\nEXPORT_SYMBOL(RtmpOsGetUsbDevProductID);\n#endif /* RTMP_MAC_USB */\n\n/* only for RBUS or flash-capable concurrent devices */\n#if defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT) \nEXPORT_SYMBOL(RtmpFlashRead);\nEXPORT_SYMBOL(RtmpFlashWrite);\n#endif /* defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT)  */\n\n\nEXPORT_SYMBOL(RtPrivIoctlSetVal);\n\n#ifdef RTMP_USB_SUPPORT\nEXPORT_SYMBOL(RtmpInitCompletion);\nEXPORT_SYMBOL(RtmpWaitForCompletionTimeout);\nEXPORT_SYMBOL(RtmpComplete);\n#endif /* RTMP_USB_SUPPORT */\nEXPORT_SYMBOL(RtmpMsecsToJiffies);\n\n\nEXPORT_SYMBOL(RtmpDrvAllRFPrint);\n#endif /* OS_ABL_SUPPORT */\n\n"
  },
  {
    "path": "src/os/linux/rt_main_dev.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    rt_main_dev.c\n\n    Abstract:\n    Create and register network interface.\n\n    Revision History:\n    Who         When            What\n    --------    ----------      ----------------------------------------------\n*/\n\n\n#define RTMP_MODULE_OS\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)\n#ifndef SA_SHIRQ\n#define SA_SHIRQ IRQF_SHARED\n#endif\n#endif\n\n// TODO: shiang-6590, remove it when MP\n// TODO: End---\n\n#ifdef RTMP_MAC_USB\n#ifdef OS_ABL_SUPPORT\nMODULE_LICENSE(\"GPL\");\n#endif /* OS_ABL_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n/*UINT32 CW_MAX_IN_BITS;*/\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n/*---------------------------------------------------------------------*/\n/* Private Variables Used                                              */\n/*---------------------------------------------------------------------*/\n\nPSTRING mac = \"\";\t\t   /* default 00:00:00:00:00:00 */\nPSTRING hostname = \"\";\t\t   /* default CMPC */\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)\nMODULE_PARM (mac, \"s\");\n#else\nmodule_param (mac, charp, 0);\n#endif\nMODULE_PARM_DESC (mac, \"rt28xx: wireless mac addr\");\n\n#ifdef OS_ABL_SUPPORT\nRTMP_DRV_ABL_OPS RtmpDrvOps, *pRtmpDrvOps = &RtmpDrvOps;\nRTMP_NET_ABL_OPS RtmpDrvNetOps, *pRtmpDrvNetOps = &RtmpDrvNetOps;\n#endif /* OS_ABL_SUPPORT */\n\n\n/*---------------------------------------------------------------------*/\n/* Prototypes of Functions Used                                        */\n/*---------------------------------------------------------------------*/\n\n/* public function prototype */\nint rt28xx_close(VOID *net_dev);\nint rt28xx_open(VOID *net_dev);\n\n/* private function prototype */\nstatic INT rt28xx_send_packets(IN struct sk_buff *skb_p, IN struct net_device *net_dev);\n\n\n\n\nstruct net_device_stats *RT28xx_get_ether_stats(\n    IN  struct net_device *net_dev);\n\n\n/*\n========================================================================\nRoutine Description:\n    Close raxx interface.\n\nArguments:\n\t*net_dev\t\t\tthe raxx interface pointer\n\nReturn Value:\n    0\t\t\t\t\tOpen OK\n\totherwise\t\t\tOpen Fail\n\nNote:\n\t1. if open fail, kernel will not call the close function.\n\t2. Free memory for\n\t\t(1) Mlme Memory Handler:\t\tMlmeHalt()\n\t\t(2) TX & RX:\t\t\t\t\tRTMPFreeTxRxRingMemory()\n\t\t(3) BA Reordering: \t\t\t\tba_reordering_resource_release()\n========================================================================\n*/\nint MainVirtualIF_close(IN struct net_device *net_dev)\n{\n    VOID *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\t/* Sanity check for pAd */\n\tif (pAd == NULL)\n\t\treturn 0; /* close ok */\n\n\tnetif_carrier_off(net_dev);\n\tnetif_stop_queue(net_dev);\n\n\tRTMPInfClose(pAd);\n\n\n#ifdef IFUP_IN_PROBE\n#else\n\tVIRTUAL_IF_DOWN(pAd);\n#endif /* IFUP_IN_PROBE */\n\n\tRT_MOD_DEC_USE_COUNT();\n\n\treturn 0; /* close ok */\n}\n\n/*\n========================================================================\nRoutine Description:\n    Open raxx interface.\n\nArguments:\n\t*net_dev\t\t\tthe raxx interface pointer\n\nReturn Value:\n    0\t\t\t\t\tOpen OK\n\totherwise\t\t\tOpen Fail\n\nNote:\n\t1. if open fail, kernel will not call the close function.\n\t2. Free memory for\n\t\t(1) Mlme Memory Handler:\t\tMlmeHalt()\n\t\t(2) TX & RX:\t\t\t\t\tRTMPFreeTxRxRingMemory()\n\t\t(3) BA Reordering: \t\t\t\tba_reordering_resource_release()\n========================================================================\n*/\nint MainVirtualIF_open(IN struct net_device *net_dev)\n{\n    VOID *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\t/* Sanity check for pAd */\n\tif (pAd == NULL)\n\t\treturn 0; /* close ok */\n\n#ifdef CONFIG_AP_SUPPORT\n/*\tpAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE; */\n\tRTMP_DRIVER_AP_MAIN_OPEN(pAd);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef IFUP_IN_PROBE\t\n\twhile (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tOS_WAIT(10);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Card not ready, NDIS_STATUS_SUCCESS!\\n\"));\n\t}\n#else\n\tif (VIRTUAL_IF_UP(pAd) != 0)\n\t\treturn -1;\n#endif /* IFUP_IN_PROBE */\t\n\n\t/* increase MODULE use count */\n\tRT_MOD_INC_USE_COUNT();\n\n\tnetif_start_queue(net_dev);\n\tnetif_carrier_on(net_dev);\n\tnetif_wake_queue(net_dev);\n\n\treturn 0;\n}\n\n/*\n========================================================================\nRoutine Description:\n    Close raxx interface.\n\nArguments:\n\t*net_dev\t\t\tthe raxx interface pointer\n\nReturn Value:\n    0\t\t\t\t\tOpen OK\n\totherwise\t\t\tOpen Fail\n\nNote:\n\t1. if open fail, kernel will not call the close function.\n\t2. Free memory for\n\t\t(1) Mlme Memory Handler:\t\tMlmeHalt()\n\t\t(2) TX & RX:\t\t\t\t\tRTMPFreeTxRxRingMemory()\n\t\t(3) BA Reordering: \t\t\t\tba_reordering_resource_release()\n========================================================================\n*/\nint rt28xx_close(VOID *dev)\n{\n\tstruct net_device * net_dev = (struct net_device *)dev;\n    VOID\t*pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> rt28xx_close\\n\"));\n\n\t/* Sanity check for pAd */\n\tif (pAd == NULL)\n\t\treturn 0; /* close ok */\n\n\tRTMPDrvClose(pAd, net_dev);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== rt28xx_close\\n\"));\n\treturn 0;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Open raxx interface.\n\nArguments:\n\t*net_dev\t\t\tthe raxx interface pointer\n\nReturn Value:\n    0\t\t\t\t\tOpen OK\n\totherwise\t\t\tOpen Fail\n\nNote:\n========================================================================\n*/\nint rt28xx_open(VOID *dev)\n{\t\t\t\t \n\tstruct net_device * net_dev = (struct net_device *)dev;\n\tVOID *pAd = NULL;\n\tint retval = 0;\n\tULONG OpMode;\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tstruct usb_interface *intf;\n\tstruct usb_device\t\t*pUsb_Dev;\n\tINT \t\tpm_usage_cnt;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\t/* sanity check */\n\tif (sizeof(ra_dma_addr_t) < sizeof(dma_addr_t))\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Fatal error for DMA address size!!!\\n\"));\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\t/* Sanity check for pAd */\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -1;\n\t}\n\n\tRTMP_DRIVER_MCU_SLEEP_CLEAR(pAd);\t\n\n\tRTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\n\tRTMP_DRIVER_USB_DEV_GET(pAd, &pUsb_Dev);\n\tRTMP_DRIVER_USB_INTF_GET(pAd, &intf);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)\n\tpm_usage_cnt = atomic_read(&intf->pm_usage_cnt);\t\n#else\n\tpm_usage_cnt = intf->pm_usage_cnt;\n#endif\n\tif (pm_usage_cnt == 0)\n\t{\n\t\tint res=1;\n\n\t\tres = usb_autopm_get_interface(intf);\n\t\tif (res)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"rt28xx_open autopm_resume fail ------\\n\"));\n\t\t\treturn (-1);;\n\t\t}\t\t\t\n\t}\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\tif (OpMode == OPMODE_AP)\n\t{\n\t\t/*CW_MAX_IN_BITS = 6; */\n\t\tRTMP_DRIVER_MAX_IN_BITS_SET(pAd, 6);\n\t}\n\telse if (OpMode == OPMODE_STA)\n\t{\n\t\t/*CW_MAX_IN_BITS = 10; */\n\t\tRTMP_DRIVER_MAX_IN_BITS_SET(pAd, 10);\n\t}\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n#if WIRELESS_EXT >= 12\n/*\tif (RT_DEV_PRIV_FLAGS_GET(net_dev) == INT_MAIN) */\n\tif (RTMP_DRIVER_MAIN_INF_CHECK(pAd, RT_DEV_PRIV_FLAGS_GET(net_dev)) == NDIS_STATUS_SUCCESS)\n\t{\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\t\tif (OpMode == OPMODE_AP)\n\t\t\tnet_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_ap_iw_handler_def;\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (OpMode == OPMODE_STA)\n\t\t\tnet_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_iw_handler_def;\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n#endif /* WIRELESS_EXT >= 12 */\n\n\t/* Request interrupt service routine for PCI device */\n\t/* register the interrupt routine with the os */\n\t/*\n\t\tAP Channel auto-selection will be run in rt28xx_init(),\n\t\tso we must reqister IRQ hander here.\n\t*/\n\tRtmpOSIRQRequest(net_dev);\n\n\t/* Init IRQ parameters stored in pAd */\n/*\tRTMP_IRQ_INIT(pAd); */\n\tRTMP_DRIVER_IRQ_INIT(pAd);\n\n\t/* Chip & other init */\n\tif (rt28xx_init(pAd, mac, hostname) == FALSE)\n\t\tgoto err;\n\n#ifdef MBSS_SUPPORT\n\t/* the function can not be moved to RT2860_probe() even register_netdev()\n\t   is changed as register_netdevice().\n\t   Or in some PC, kernel will panic (Fedora 4) */\n#ifndef P2P_APCLI_SUPPORT\n\tRT28xx_MBSS_Init(pAd, net_dev);\n#endif /* P2P_APCLI_SUPPORT */\n#endif /* MBSS_SUPPORT */\n\n\n#ifdef APCLI_SUPPORT\n#ifndef P2P_APCLI_SUPPORT\n\tRT28xx_ApCli_Init(pAd, net_dev);\n#endif /* P2P_APCLI_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n\n#ifdef P2P_SUPPORT\n\tRTMP_P2P_Init(pAd, net_dev);\n#endif /* P2P_SUPPORT */\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n/*\tRT_CFG80211_REINIT(pAd); */\n/*\tRT_CFG80211_CRDA_REG_RULE_APPLY(pAd); */\n\tRTMP_DRIVER_CFG80211_START(pAd);\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\n\tRTMPDrvOpen(pAd);\n\n\n#ifdef VENDOR_FEATURE2_SUPPORT\n\tprintk(\"Number of Packet Allocated in open = %lu\\n\", OS_NumOfPktAlloc);\n\tprintk(\"Number of Packet Freed in open = %lu\\n\", OS_NumOfPktFree);\n#endif /* VENDOR_FEATURE2_SUPPORT */\n\n\treturn (retval);\n\nerr:\n/*+++move from rt28xx_init() to here. */\n/*\tRtmpOSIRQRelease(net_dev); */\n\tRTMP_DRIVER_IRQ_RELEASE(pAd);\n/*---move from rt28xx_init() to here. */\n\n\treturn (-1);\n}\n\n\nPNET_DEV RtmpPhyNetDevInit(\n\tIN VOID\t\t\t\t\t\t*pAd,\n\tIN RTMP_OS_NETDEV_OP_HOOK\t*pNetDevHook)\n{\n\tstruct net_device\t*net_dev = NULL;\n\tULONG InfId, OpMode;\n\n\tRTMP_DRIVER_MAIN_INF_GET(pAd, &InfId);\n\n/*\tnet_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); */\n\tRTMP_DRIVER_MAIN_INF_CREATE(pAd, &net_dev);\n\tif (net_dev == NULL)\n\t{\n\t\tprintk(\"RtmpPhyNetDevInit(): creation failed for main physical net device!\\n\");\n\t\treturn NULL;\n\t}\n\n\tNdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));\n\tpNetDevHook->open = MainVirtualIF_open;\n\tpNetDevHook->stop = MainVirtualIF_close;\n\tpNetDevHook->xmit = rt28xx_send_packets;\n#ifdef IKANOS_VX_1X0\n\tpNetDevHook->xmit = IKANOS_DataFramesTx;\n#endif /* IKANOS_VX_1X0 */\n\tpNetDevHook->ioctl = rt28xx_ioctl;\n\tpNetDevHook->priv_flags = InfId; /*INT_MAIN; */\n\tpNetDevHook->get_stats = RT28xx_get_ether_stats;\n\n\tpNetDevHook->needProtcted = FALSE;\n\n#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12)\n\tpNetDevHook->get_wstats = rt28xx_get_wireless_stats;\n#endif\n\n\tRTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);\n\n#ifdef CONFIG_STA_SUPPORT\n#if WIRELESS_EXT >= 12\n\tif (OpMode == OPMODE_STA)\n\t{\n\t\tpNetDevHook->iw_handler = (void *)&rt28xx_iw_handler_def;\n\t}\n#endif /*WIRELESS_EXT >= 12 */\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n#if WIRELESS_EXT >= 12\n\tif (OpMode == OPMODE_AP)\n\t{\n\t\tpNetDevHook->iw_handler = &rt28xx_ap_iw_handler_def;\n\t}\n#endif /*WIRELESS_EXT >= 12 */\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\t/* put private data structure */\n\tRTMP_OS_NETDEV_SET_PRIV(net_dev, pAd);\n\n\t/* double-check if pAd is associated with the net_dev */\n\tif (RTMP_OS_NETDEV_GET_PRIV(net_dev) == NULL)\n\t{\n\t\tRtmpOSNetDevFree(net_dev);\n\t\treturn NULL;\n\t}\n\n\tRTMP_DRIVER_NET_DEV_SET(pAd, net_dev);\n\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)\n\tSET_MODULE_OWNER(net_dev);\n#endif \n\n\n\n\treturn net_dev;\n\t\n}\n\n\nVOID *RtmpNetEthConvertDevSearch(\n\tIN\tVOID\t\t\t*net_dev_,\n\tIN\tUCHAR\t\t\t*pData)\n{\n\tstruct net_device *pNetDev;\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)\n\tstruct net_device *net_dev = (struct net_device *)net_dev_;\n\tstruct net *net;\n\tnet = dev_net(net_dev);\n\t\n\tBUG_ON(!net);\n\tfor_each_netdev(net, pNetDev)\n#else\n\tstruct net *net;\n\n\tstruct net_device *net_dev = (struct net_device *)net_dev_;\n\tBUG_ON(!net_dev->nd_net);\n\tnet = net_dev->nd_net;\n\tfor_each_netdev(net, pNetDev)\n#endif\n#else\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)\n\t\tfor_each_netdev(pNetDev)\n#else \n\tfor (pNetDev = dev_base; pNetDev; pNetDev = pNetDev->next)\n#endif\n#endif\n\t{\n\t\tif ((pNetDev->type == ARPHRD_ETHER)\n\t\t\t&& NdisEqualMemory(pNetDev->dev_addr, &pData[6], pNetDev->addr_len))\n\t\t\tbreak;\n\t}\n\n\treturn (VOID *)pNetDev;\n}\n\n\n\n\n/*\n========================================================================\nRoutine Description:\n    The entry point for Linux kernel sent packet to our driver.\n\nArguments:\n    sk_buff *skb\t\tthe pointer refer to a sk_buffer.\n\nReturn Value:\n    0\t\t\t\t\t\n\nNote:\n\tThis function is the entry point of Tx Path for Os delivery packet to \n\tour driver. You only can put OS-depened & STA/AP common handle procedures \n\tin here.\n========================================================================\n*/\nint rt28xx_packet_xmit(void *skbsrc)\n{\n\tstruct sk_buff *skb = (struct sk_buff *)skbsrc;\n\tstruct net_device *net_dev = skb->dev;\n\tVOID *pAd = NULL;\n\tPNDIS_PACKET pPacket = (PNDIS_PACKET) skb;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\n\treturn RTMPSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1,\n\t\t\t\t\t\t\tskb->len, RtmpNetEthConvertDevSearch);\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Send a packet to WLAN.\n\nArguments:\n    skb_p           points to our adapter\n    dev_p           which WLAN network interface\n\nReturn Value:\n    0: transmit successfully\n    otherwise: transmit fail\n\nNote:\n========================================================================\n*/\nstatic int rt28xx_send_packets(\n\tIN struct sk_buff *skb_p, \n\tIN struct net_device *net_dev)\n{\n\tif (!(RTMP_OS_NETDEV_STATE_RUNNING(net_dev)))\n\t{\n\t\tRELEASE_NDIS_PACKET(NULL, (PNDIS_PACKET)skb_p, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n\n\tNdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15);\n#ifdef P2P_SUPPORT\n\tNdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF+26], 1);\n#endif /* P2P_SUPPORT */\n\tRTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID);\n\tMEM_DBG_PKT_ALLOC_INC(skb_p);\n\n\treturn rt28xx_packet_xmit(skb_p);\n}\n\n\n#if WIRELESS_EXT >= 12\n/* This function will be called when query /proc */\nstruct iw_statistics *rt28xx_get_wireless_stats(struct net_device *net_dev)\n{\n\tVOID *pAd = NULL;\n\tstruct iw_statistics *pStats;\n\tRT_CMD_IW_STATS DrvIwStats, *pDrvIwStats = &DrvIwStats;\n\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\n#ifdef P2P_SUPPORT\n#endif /* P2P_SUPPORT */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"rt28xx_get_wireless_stats --->\\n\"));\n\n\n\tpDrvIwStats->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);\n\tpDrvIwStats->dev_addr = (PUCHAR)net_dev->dev_addr;\n\n\tif (RTMP_DRIVER_IW_STATS_GET(pAd, pDrvIwStats) != NDIS_STATUS_SUCCESS)\n\t\treturn NULL;\n\n\tpStats = (struct iw_statistics *)(pDrvIwStats->pStats);\n\tpStats->status = 0; /* Status - device dependent for now */\n\n\n\tpStats->qual.updated = 1;     /* Flags to know if updated */\n#ifdef IW_QUAL_DBM\n\tpStats->qual.updated |= IW_QUAL_DBM;\t/* Level + Noise are dBm */\n#endif /* IW_QUAL_DBM */\n\tpStats->qual.qual = pDrvIwStats->qual;\n\tpStats->qual.level = pDrvIwStats->level;\n\tpStats->qual.noise = pDrvIwStats->noise;\n\tpStats->discard.nwid = 0;     /* Rx : Wrong nwid/essid */\n\tpStats->miss.beacon = 0;      /* Missed beacons/superframe */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<--- rt28xx_get_wireless_stats\\n\"));\n\treturn pStats;\n}\n#endif /* WIRELESS_EXT */\n\n\nINT rt28xx_ioctl(\n\tIN PNET_DEV net_dev, \n\tINOUT struct ifreq\t*rq, \n\tIN INT cmd)\n{\n\tVOID *pAd = NULL;\n\tINT ret = 0;\n\tULONG OpMode;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\tRTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);\n\n#ifdef CONFIG_AP_SUPPORT\n/*\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd) */\n\tRT_CONFIG_IF_OPMODE_ON_AP(OpMode)\n\t{\n\t\tret = rt28xx_ap_ioctl(net_dev, rq, cmd);\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n/*\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd) */\n\tRT_CONFIG_IF_OPMODE_ON_STA(OpMode)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (RTMP_DRIVER_P2P_INF_CHECK(pAd, RT_DEV_PRIV_FLAGS_GET(net_dev)) == NDIS_STATUS_SUCCESS)\n\t\t\tret = rt28xx_ap_ioctl(net_dev, rq, cmd);\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\tret = rt28xx_sta_ioctl(net_dev, rq, cmd);\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn ret;\n}\n\n\n/*\n    ========================================================================\n\n    Routine Description:\n        return ethernet statistics counter\n\n    Arguments:\n        net_dev                     Pointer to net_device\n\n    Return Value:\n        net_device_stats*\n\n    Note:\n\n    ========================================================================\n*/\nstruct net_device_stats *RT28xx_get_ether_stats(\n    IN  struct net_device *net_dev)\n{\n    VOID *pAd = NULL;\n\tstruct net_device_stats *pStats;\n\n\tif (net_dev)\n\t\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\t\n\n\tif (pAd)\n\t{\n\t\tRT_CMD_STATS DrvStats, *pDrvStats = &DrvStats;\n \n\n\t\t//assign net device for RTMP_DRIVER_INF_STATS_GET()\n\t\tpDrvStats->pNetDev = net_dev;\n\t\tRTMP_DRIVER_INF_STATS_GET(pAd, pDrvStats);\n\n\t\tpStats = (struct net_device_stats *)(pDrvStats->pStats);\n\t\tpStats->rx_packets = pDrvStats->rx_packets;\n\t\tpStats->tx_packets = pDrvStats->tx_packets;\n\n\t\tpStats->rx_bytes = pDrvStats->rx_bytes;\n\t\tpStats->tx_bytes = pDrvStats->tx_bytes;\n\n\t\tpStats->rx_errors = pDrvStats->rx_errors;\n\t\tpStats->tx_errors = pDrvStats->tx_errors;\n\n\t\tpStats->rx_dropped = 0;\n\t\tpStats->tx_dropped = 0;\n\n\t    pStats->multicast = pDrvStats->multicast;\n\t    pStats->collisions = pDrvStats->collisions;\n\n\t    pStats->rx_length_errors = 0;\n\t    pStats->rx_over_errors = pDrvStats->rx_over_errors;\n\t    pStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount;     // recved pkt with crc error */\n\t    pStats->rx_frame_errors = pDrvStats->rx_frame_errors;\n\t    pStats->rx_fifo_errors = pDrvStats->rx_fifo_errors;\n\t    pStats->rx_missed_errors = 0;                                            /* receiver missed packet */\n\n\t    /* detailed tx_errors */\n\t    pStats->tx_aborted_errors = 0;\n\t    pStats->tx_carrier_errors = 0;\n\t    pStats->tx_fifo_errors = 0;\n\t    pStats->tx_heartbeat_errors = 0;\n\t    pStats->tx_window_errors = 0;\n\n\t    /* for cslip etc */\n\t    pStats->rx_compressed = 0;\n\t    pStats->tx_compressed = 0;\n\t\t\n\t\treturn pStats;\n\t}\n\telse\n    \treturn NULL;\n}\n\n\nBOOLEAN RtmpPhyNetDevExit(\n\tIN VOID\t\t\t*pAd, \n\tIN PNET_DEV\t\tnet_dev)\n{\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n#ifndef P2P_APCLI_SUPPORT\n\t/* remove all AP-client virtual interfaces. */\n\tRT28xx_ApCli_Remove(pAd);\n#endif /* P2P_APCLI_SUPPORT */\n#endif /* APCLI_SUPPORT */\n\n\n#ifdef MBSS_SUPPORT\n#ifndef P2P_APCLI_SUPPORT\n\tRT28xx_MBSS_Remove(pAd);\n#endif /* P2P_APCLI_SUPPORT */\n#endif /* MBSS_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tRTMP_P2P_Remove(pAd);\n#endif /* P2P_SUPPORT */\n\n#ifdef INF_PPA_SUPPORT\n\n\tRTMP_DRIVER_INF_PPA_EXIT(pAd);\n#endif /* INF_PPA_SUPPORT */\n\n\t/* Unregister network device */\n\tif (net_dev != NULL)\n\t{\n\t\tprintk(\"RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\\n\", net_dev->name);\n\t\tRtmpOSNetDevDetach(net_dev);\n\t}\n\n\treturn TRUE;\n\t\n}\n\n\n/*******************************************************************************\n\n\tDevice IRQ related functions.\n\t\n *******************************************************************************/\nint RtmpOSIRQRequest(IN PNET_DEV pNetDev)\n{\n\tULONG infType;\n\tVOID *pAd = NULL;\n\tint retval = 0;\n\t\n\tGET_PAD_FROM_NET_DEV(pAd, pNetDev);\t\n\t\n\tASSERT(pAd);\n\n\tRTMP_DRIVER_INF_TYPE_GET(pAd, &infType);\n\n\n\n\treturn retval; \n\t\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/os/linux/rt_proc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    rt_proc.c\n\n    Abstract:\n    Create and register proc file system for ralink device\n\n    Revision History:\n    Who         When            What\n    --------    ----------      ----------------------------------------------\n*/\n\n#include <linux/kernel.h>\n#include <linux/types.h>\n#include <linux/proc_fs.h>\n#include <asm/uaccess.h>\n\n#include \"rt_config.h\"\n\nint wl_proc_init(void);\nint wl_proc_exit(void);\n\n#ifdef CONFIG_RALINK_RT2880\n#define PROCREG_DIR             \"rt2880\"\n#endif /* CONFIG_RALINK_RT2880 */\n\n#ifdef CONFIG_RALINK_RT3052\n#define PROCREG_DIR             \"rt3052\"\n#endif /* CONFIG_RALINK_RT3052 */\n\n#ifdef CONFIG_RALINK_RT2883\n#define PROCREG_DIR             \"rt2883\"\n#endif /* CONFIG_RALINK_RT2883 */\n\n#ifdef CONFIG_RALINK_RT3883\n#define PROCREG_DIR             \"rt3883\"\n#endif /* CONFIG_RALINK_RT3883 */\n\n#ifdef CONFIG_RALINK_RT5350\n#define PROCREG_DIR             \"rt5350\"\n#endif /* CONFIG_RALINK_RT5350 */\n\n#ifndef PROCREG_DIR\n#define PROCREG_DIR             \"rt2880\"\n#endif /* PROCREG_DIR */\n\n#ifdef CONFIG_PROC_FS\nextern struct proc_dir_entry *procRegDir;\n\n#ifdef VIDEO_TURBINE_SUPPORT\nextern BOOLEAN UpdateFromGlobal;\nAP_VIDEO_STRUCT GLOBAL_AP_VIDEO_CONFIG;\n/*struct proc_dir_entry *proc_ralink_platform, *proc_ralink_wl, *proc_ralink_wl_video; */\nstruct proc_dir_entry *proc_ralink_wl, *proc_ralink_wl_video;\nstatic struct proc_dir_entry *entry_wl_video_Update, *entry_wl_video_Enable, *entry_wl_video_ClassifierEnable, *entry_wl_video_HighTxMode, *entry_wl_video_TxPwr, *entry_wl_video_VideoMCSEnable, *entry_wl_video_VideoMCS, *entry_wl_video_TxBASize, *entry_wl_video_TxLifeTimeMode, *entry_wl_video_TxLifeTime, *entry_wl_video_TxRetryLimit;\n\n\nssize_t video_Update_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", UpdateFromGlobal);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_Update_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tUpdateFromGlobal = val;\n\t}\n        return count;\n}\n\nssize_t video_Enable_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.Enable);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_Enable_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.Enable = val;\n\t}\n        return count;\n}\n\nssize_t video_ClassifierEnable_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_ClassifierEnable_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.ClassifierEnable = val;\n\t}\n        return count;\n}\n\nssize_t video_HighTxMode_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.HighTxMode);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_HighTxMode_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.HighTxMode = val;\n\t}\n        return count;\n}\n\nssize_t video_TxPwr_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.TxPwr);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_TxPwr_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.TxPwr = val;\n\t}\n        return count;\n}\n\nssize_t video_VideoMCSEnable_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_VideoMCSEnable_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable = val;\n\t}\n        return count;\n}\n\nssize_t video_VideoMCS_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.VideoMCS);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_VideoMCS_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.VideoMCS = val;\n\t}\n        return count;\n}\n\nssize_t video_TxBASize_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.TxBASize);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_TxBASize_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.TxBASize = val;\n\t}\n        return count;\n}\n\nssize_t video_TxLifeTimeMode_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_TxLifeTimeMode_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode = val;\n\t}\n        return count;\n}\n\nssize_t video_TxLifeTime_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"%d\\n\", GLOBAL_AP_VIDEO_CONFIG.TxLifeTime);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_TxLifeTime_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 10);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.TxLifeTime = val;\n\t}\n        return count;\n}\n\nssize_t video_TxRetryLimit_get(char *page, char **start, off_t off, int count,\n                          int *eof, void *data_unused)\n{\n\tsprintf(page, \"0x%x\\n\", GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit);\n\t*eof = 1;\n        return strlen(page);\n}\n\nssize_t video_TxRetryLimit_set(struct file *file, const char __user * buffer,\n                       size_t count, loff_t *ppos)\n{\n\tchar *buf = kmalloc(count, GFP_KERNEL);\n\n\tif (buf) {\n\t\tunsigned long val;\n\n\t\tif (copy_from_user(buf, buffer, count))\n\t\t\treturn -EFAULT;\n\t\t\n\t\tif (buf)\n\t\t\tval = simple_strtoul(buf, NULL, 16);\n\n\t\tGLOBAL_AP_VIDEO_CONFIG.TxRetryLimit = val;\n\t}\n        return count;\n}\n\nint wl_video_proc_init(void)\n{\n\tGLOBAL_AP_VIDEO_CONFIG.Enable = FALSE;\n\tGLOBAL_AP_VIDEO_CONFIG.ClassifierEnable = FALSE;\n\tGLOBAL_AP_VIDEO_CONFIG.HighTxMode = FALSE;\n\tGLOBAL_AP_VIDEO_CONFIG.TxPwr = 0;\n\tGLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable = FALSE;\n\tGLOBAL_AP_VIDEO_CONFIG.VideoMCS = 0;\n\tGLOBAL_AP_VIDEO_CONFIG.TxBASize = 0;\n\tGLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode = FALSE;\n\tGLOBAL_AP_VIDEO_CONFIG.TxLifeTime = 0;\n\tGLOBAL_AP_VIDEO_CONFIG.TxRetryLimit = 0;\n\n\t\tproc_ralink_wl = proc_mkdir(\"wl\", procRegDir);\n\n\tif (proc_ralink_wl)\n\t\tproc_ralink_wl_video = proc_mkdir(\"VideoTurbine\", proc_ralink_wl);\n\n\tif (proc_ralink_wl_video) {\n\t\tentry_wl_video_Update = create_proc_entry(\"UpdateFromGlobal\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_Update) {\n\t\t\tentry_wl_video_Update->read_proc = (read_proc_t*)&video_Update_get;\n\t\t\tentry_wl_video_Update->write_proc = (write_proc_t*)&video_Update_set;\n\t\t}\n\n\t\tentry_wl_video_Enable = create_proc_entry(\"Enable\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_Enable) {\n\t\t\tentry_wl_video_Enable->read_proc = (read_proc_t*)&video_Enable_get;\n\t\t\tentry_wl_video_Enable->write_proc = (write_proc_t*)&video_Enable_set;\n\t\t}\n\n\t\tentry_wl_video_ClassifierEnable = create_proc_entry(\"ClassifierEnable\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_ClassifierEnable) {\n\t\t\tentry_wl_video_ClassifierEnable->read_proc = (read_proc_t*)&video_ClassifierEnable_get;\n\t\t\tentry_wl_video_ClassifierEnable->write_proc = (write_proc_t*)&video_ClassifierEnable_set;\n\t\t}\n\n\t\tentry_wl_video_HighTxMode = create_proc_entry(\"HighTxMode\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_HighTxMode) {\n\t\t\tentry_wl_video_HighTxMode->read_proc = (read_proc_t*)&video_HighTxMode_get;\n\t\t\tentry_wl_video_HighTxMode->write_proc = (write_proc_t*)&video_HighTxMode_set;\n\t\t}\n\n\t\tentry_wl_video_TxPwr = create_proc_entry(\"TxPwr\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_TxPwr) {\n\t\t\tentry_wl_video_TxPwr->read_proc = (read_proc_t*)&video_TxPwr_get;\n\t\t\tentry_wl_video_TxPwr->write_proc = (write_proc_t*)&video_TxPwr_set;\n\t\t}\n\n\t\tentry_wl_video_VideoMCSEnable = create_proc_entry(\"VideoMCSEnable\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_VideoMCSEnable) {\n\t\t\tentry_wl_video_VideoMCSEnable->read_proc = (read_proc_t*)&video_VideoMCSEnable_get;\n\t\t\tentry_wl_video_VideoMCSEnable->write_proc = (write_proc_t*)&video_VideoMCSEnable_set;\n\t\t}\n\n\t\tentry_wl_video_VideoMCS = create_proc_entry(\"VideoMCS\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_VideoMCS) {\n\t\t\tentry_wl_video_VideoMCS->read_proc = (read_proc_t*)&video_VideoMCS_get;\n\t\t\tentry_wl_video_VideoMCS->write_proc = (write_proc_t*)&video_VideoMCS_set;\n\t\t}\n\n\t\tentry_wl_video_TxBASize = create_proc_entry(\"TxBASize\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_TxBASize) {\n\t\t\tentry_wl_video_TxBASize->read_proc = (read_proc_t*)&video_TxBASize_get;\n\t\t\tentry_wl_video_TxBASize->write_proc = (write_proc_t*)&video_TxBASize_set;\n\t\t}\n\t\tentry_wl_video_TxLifeTimeMode = create_proc_entry(\"TxLifeTimeMode\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_TxLifeTimeMode) {\n\t\t\tentry_wl_video_TxLifeTimeMode->read_proc = (read_proc_t*)&video_TxLifeTimeMode_get;\n\t\t\tentry_wl_video_TxLifeTimeMode->write_proc = (write_proc_t*)&video_TxLifeTimeMode_set;\n\t\t}\n\n\t\tentry_wl_video_TxLifeTime = create_proc_entry(\"TxLifeTime\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_TxLifeTime) {\n\t\t\tentry_wl_video_TxLifeTime->read_proc = (read_proc_t*)&video_TxLifeTime_get;\n\t\t\tentry_wl_video_TxLifeTime->write_proc = (write_proc_t*)&video_TxLifeTime_set;\n\t\t}\n\n\t\tentry_wl_video_TxRetryLimit = create_proc_entry(\"TxRetryLimit\", 0, proc_ralink_wl_video);\n\t\tif (entry_wl_video_TxRetryLimit) {\n\t\t\tentry_wl_video_TxRetryLimit->read_proc = (read_proc_t*)&video_TxRetryLimit_get;\n\t\t\tentry_wl_video_TxRetryLimit->write_proc = (write_proc_t*)&video_TxRetryLimit_set;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nint wl_video_proc_exit(void)\n{\n\n\tif (entry_wl_video_Enable)\n\t\tremove_proc_entry(\"Enable\", proc_ralink_wl_video);\n\t\n\tif (entry_wl_video_ClassifierEnable)\n\t\tremove_proc_entry(\"ClassifierEnabl\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_HighTxMode)\n\t\tremove_proc_entry(\"HighTxMode\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_TxPwr)\n\t\tremove_proc_entry(\"TxPwr\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_VideoMCSEnable)\n\t\tremove_proc_entry(\"VideoMCSEnable\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_VideoMCS)\n\t\tremove_proc_entry(\"VideoMCS\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_TxBASize)\n\t\tremove_proc_entry(\"TxBASize\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_TxLifeTimeMode)\n\t\tremove_proc_entry(\"TxLifeTimeMode\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_TxLifeTime)\n\t\tremove_proc_entry(\"TxLifeTime\", proc_ralink_wl_video);\n\n\tif (entry_wl_video_TxRetryLimit)\n\t\tremove_proc_entry(\"TxRetryLimit\", proc_ralink_wl_video);\n\n\tif (proc_ralink_wl_video)\n\t\tremove_proc_entry(\"Video\", proc_ralink_wl);\n\n\treturn 0;\n}\n#endif /* VIDEO_TURBINE_SUPPORT */\n\nint wl_proc_init(void)\n{\n\tif (procRegDir == NULL)\n\t\tprocRegDir = proc_mkdir(PROCREG_DIR, NULL);\n\n\tif (procRegDir) {\n#ifdef VIDEO_TURBINE_SUPPORT\n\t\twl_video_proc_init();\n#endif /* VIDEO_TURBINE_SUPPORT */\n\t}\n\n\treturn 0;\n}\n\nint wl_proc_exit(void)\n{\n#ifdef VIDEO_TURBINE_SUPPORT\n\tif (proc_ralink_wl_video) {\n\t\twl_video_proc_exit();\n\t\tremove_proc_entry(\"Video\", proc_ralink_wl);\n\t}\n\tif (proc_ralink_wl)\n\t\tremove_proc_entry(\"wl\", procRegDir);\n#endif /* VIDEO_TURBINE_SUPPORT */\n\n\t\n\treturn 0;\n}\n#else\nint wl_proc_init(void)\n{\n\treturn 0;\n}\n\nint wl_proc_exit(void)\n{\n\n\treturn 0;\n}\n#endif /* CONFIG_PROC_FS */\n\n"
  },
  {
    "path": "src/os/linux/rt_profile.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n\trt_profile.c\n \n    Abstract:\n \n    Revision History:\n    Who          When          What\n    ---------    ----------    ----------------------------------------------\n */\n \n#include \"rt_config.h\"\n\n\n\n#ifdef SYSTEM_LOG_SUPPORT\n/* for wireless system event message */\nchar const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {    \n\t/* system status event */\n    \"had associated successfully\",\t\t\t\t\t\t\t/* IW_ASSOC_EVENT_FLAG */\n    \"had disassociated\",\t\t\t\t\t\t\t\t\t/* IW_DISASSOC_EVENT_FLAG */\n    \"had deauthenticated\",\t\t\t\t\t\t\t\t\t/* IW_DEAUTH_EVENT_FLAG */\n    \"had been aged-out and disassociated\",\t\t\t\t\t/* IW_AGEOUT_EVENT_FLAG */\n    \"occurred CounterMeasures attack\",\t\t\t\t\t\t/* IW_COUNTER_MEASURES_EVENT_FLAG */\t\n    \"occurred replay counter different in Key Handshaking\",\t/* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */\n    \"occurred RSNIE different in Key Handshaking\",\t\t\t/* IW_RSNIE_DIFF_EVENT_FLAG */\n    \"occurred MIC different in Key Handshaking\",\t\t\t/* IW_MIC_DIFF_EVENT_FLAG */\n    \"occurred ICV error in RX\",\t\t\t\t\t\t\t\t/* IW_ICV_ERROR_EVENT_FLAG */\n    \"occurred MIC error in RX\",\t\t\t\t\t\t\t\t/* IW_MIC_ERROR_EVENT_FLAG */\n\t\"Group Key Handshaking timeout\",\t\t\t\t\t\t/* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */ \n\t\"Pairwise Key Handshaking timeout\",\t\t\t\t\t\t/* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */ \n\t\"RSN IE sanity check failure\",\t\t\t\t\t\t\t/* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */ \n\t\"set key done in WPA/WPAPSK\",\t\t\t\t\t\t\t/* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */ \n\t\"set key done in WPA2/WPA2PSK\",                         /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */ \n\t\"connects with our wireless client\",                    /* IW_STA_LINKUP_EVENT_FLAG */ \n\t\"disconnects with our wireless client\",                 /* IW_STA_LINKDOWN_EVENT_FLAG */\n\t\"scan completed\",\t\t\t\t\t\t\t\t\t\t/* IW_SCAN_COMPLETED_EVENT_FLAG */\n\t\"scan terminate!! Busy!! Enqueue fail!!\",\t\t\t\t/* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */\n\t\"channel switch to \",\t\t\t\t\t\t\t\t\t/* IW_CHANNEL_CHANGE_EVENT_FLAG */\n\t\"wireless mode is not support\",\t\t\t\t\t\t\t/* IW_STA_MODE_EVENT_FLAG */\n\t\"blacklisted in MAC filter list\",\t\t\t\t\t\t/* IW_MAC_FILTER_LIST_EVENT_FLAG */\n\t\"Authentication rejected because of challenge failure\",\t/* IW_AUTH_REJECT_CHALLENGE_FAILURE */\n\t\"Scanning\",\t\t\t\t\t\t\t\t\t\t\t\t/* IW_SCANNING_EVENT_FLAG */\n\t\"Start a new IBSS\",\t\t\t\t\t\t\t\t\t\t/* IW_START_IBSS_FLAG */\n\t\"Join the IBSS\",\t\t\t\t\t\t\t\t\t\t/* IW_JOIN_IBSS_FLAG */\n\t\"Shared WEP fail\",\t\t\t\t\t\t\t\t\t\t/* IW_SHARED_WEP_FAIL*/\n\t};\n\n#ifdef IDS_SUPPORT\n/* for wireless IDS_spoof_attack event message */\nchar const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {   \t\n    \"detected conflict SSID\",\t\t\t\t\t\t\t\t/* IW_CONFLICT_SSID_EVENT_FLAG */\n    \"detected spoofed association response\",\t\t\t\t/* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */\n    \"detected spoofed reassociation responses\",\t\t\t\t/* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */\n    \"detected spoofed probe response\",\t\t\t\t\t\t/* IW_SPOOF_PROBE_RESP_EVENT_FLAG */\n    \"detected spoofed beacon\",\t\t\t\t\t\t\t\t/* IW_SPOOF_BEACON_EVENT_FLAG */\n    \"detected spoofed disassociation\",\t\t\t\t\t\t/* IW_SPOOF_DISASSOC_EVENT_FLAG */\n    \"detected spoofed authentication\",\t\t\t\t\t\t/* IW_SPOOF_AUTH_EVENT_FLAG */\n    \"detected spoofed deauthentication\",\t\t\t\t\t/* IW_SPOOF_DEAUTH_EVENT_FLAG */\n    \"detected spoofed unknown management frame\",\t\t\t/* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */\n\t\"detected replay attack\"\t\t\t\t\t\t\t\t/* IW_REPLAY_ATTACK_EVENT_FLAG */\t\n\t};\n\n/* for wireless IDS_flooding_attack event message */\nchar const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {   \t\n\t\"detected authentication flooding\",\t\t\t\t\t\t/* IW_FLOOD_AUTH_EVENT_FLAG */\n    \"detected association request flooding\",\t\t\t\t/* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */\n    \"detected reassociation request flooding\",\t\t\t\t/* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */\n    \"detected probe request flooding\",\t\t\t\t\t\t/* IW_FLOOD_PROBE_REQ_EVENT_FLAG */\n    \"detected disassociation flooding\",\t\t\t\t\t\t/* IW_FLOOD_DISASSOC_EVENT_FLAG */\n    \"detected deauthentication flooding\",\t\t\t\t\t/* IW_FLOOD_DEAUTH_EVENT_FLAG */\n    \"detected 802.1x eap-request flooding\"\t\t\t\t\t/* IW_FLOOD_EAP_REQ_EVENT_FLAG */\t\n\t};\n#endif /* IDS_SUPPORT */\n\n#ifdef WSC_INCLUDED\n/* for WSC wireless event message */\nchar const *pWirelessWscEventText[IW_WSC_EVENT_TYPE_NUM] = {   \t\n\t\"PBC Session Overlap\",\t\t\t\t\t\t\t\t\t/* IW_WSC_PBC_SESSION_OVERLAP */\n\t\"This WPS Registrar supports PBC\",\t\t\t\t\t\t/* IW_WSC_REGISTRAR_SUPPORT_PBC */\n\t\"This WPS Registrar supports PIN\",\t\t\t\t\t\t/* IW_WSC_REGISTRAR_SUPPORT_PIN */\n\t\"WPS status success\",\t\t\t\t\t\t\t\t\t/* IW_WSC_STATUS_SUCCESS */\n\t\"WPS status fail\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_STATUS_FAIL */\n\t\"WPS 2 mins time out!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_2MINS_TIMEOUT */\n\t\"WPS Send EAPOL_Start!\",\t\t\t\t\t\t\t\t/* IW_WSC_SEND_EAPOL_START */\n\t\"WPS Send WscStart!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_WSC_START */\n\t\"WPS Send M1!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M1 */\n\t\"WPS Send M2!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M2 */\n\t\"WPS Send M3!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M3 */\n\t\"WPS Send M4!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M4 */\n\t\"WPS Send M5!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M5 */\n\t\"WPS Send M6!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M6 */\n\t\"WPS Send M7!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M7 */\n\t\"WPS Send M8!\",\t\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_M8 */\n\t\"WPS Send WscDone!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_DONE */\n\t\"WPS Send WscAck!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_ACK */\n\t\"WPS Send WscNack!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_SEND_NACK */\n\t\"WPS Receive WscStart!\",\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_WSC_START */\n\t\"WPS Receive M1!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M1 */\n\t\"WPS Receive M2!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M2 */\n\t\"WPS Receive M3!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M3 */\n\t\"WPS Receive M4!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M4 */\n\t\"WPS Receive M5!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M5 */\n\t\"WPS Receive M6!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M6 */\n\t\"WPS Receive M7!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M7 */\n\t\"WPS Receive M8!\",\t\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_M8 */\n\t\"WPS Receive WscDone!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_DONE */\n\t\"WPS Receive WscAck!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_ACK */\n\t\"WPS Receive WscNack!\",\t\t\t\t\t\t\t\t\t/* IW_WSC_RECEIVE_NACK */\n\t\"Not only one candidate found\"\t\t\t\t\t\t\t/* IW_WSC_MANY_CANDIDATE */\n\t};\n#endif /* WSC_INCLUDED */\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef IWSC_SUPPORT\n// for IWSC wireless event messagechar \nconst *pWirelessIWscEventText[IW_IWSC_EVENT_TYPE_NUM] = {\n\t\"IWSC - T1 mins time out!\",\t\t\t\t\t\t\t\t\t/* IW_IWSC_T1_TIMER_TIMEOUT */\n\t\"IWSC - T2 mins time out!\",\t\t\t\t\t\t\t\t\t/* IW_IWSC_T2_TIMER_TIMEOUT */\n\t\"IWSC - Become Registrar\",\t\t\t\t\t\t\t\t\t/* IW_IWSC_BECOME_REGISTRAR */\n\t\"IWSC - Become Enrollee\",\t\t\t\t\t\t\t\t\t/* IW_IWSC_BECOME_ENROLLEE */\n\t\"IWSC - Entry time out\",\t\t\t\t\t\t\t\t\t/* IW_IWSC_ENTRY_TIMER_TIMEOUT */\n\t};\n#endif /* IWSC_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\nNDIS_STATUS\tRTMPReadParametersHook(\n\tIN\tPRTMP_ADAPTER pAd)\n{\n\tPSTRING\t\t\t\t\tsrc = NULL;\n\tRTMP_OS_FD\t\t\t\tsrcf;\n\tRTMP_OS_FS_INFO\t\t\tosFSInfo;\n\tINT \t\t\t\t\t\tretval = NDIS_STATUS_FAILURE;\n\tPSTRING\t\t\t\t\tbuffer;\n\n#ifdef HOSTAPD_SUPPORT\n\tint i;\n#endif /*HOSTAPD_SUPPORT */\n\n/*\tbuffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); */\n\tos_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE);\n\tif(buffer == NULL)\n\t\treturn NDIS_STATUS_FAILURE;\n\tmemset(buffer, 0x00, MAX_INI_BUFFER_SIZE);\n\t\t\t\n\t{\t\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tsrc = AP_PROFILE_PATH;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tsrc = STA_PROFILE_PATH;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef MULTIPLE_CARD_SUPPORT\n\t\tsrc = (PSTRING)pAd->MC_FileName;\n#endif /* MULTIPLE_CARD_SUPPORT */\n\t}\n\n\tif (src && *src)\n\t{\n\t\tRtmpOSFSInfoChange(&osFSInfo, TRUE);\n\t\tsrcf = RtmpOSFileOpen(src, O_RDONLY, 0);\n\t\tif (IS_FILE_OPEN_ERR(srcf)) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Open file \\\"%s\\\" failed!\\n\", src));\n\t\t}\n\t\telse \n\t\t{\n\t\t\tretval =RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);\n\t\t\tif (retval > 0)\n\t\t\t{\n\t\t\t\tRTMPSetProfileParameters(pAd, buffer);\n\t\t\t\tretval = NDIS_STATUS_SUCCESS;\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Read file \\\"%s\\\" failed(errCode=%d)!\\n\", src, retval));\n\n\t\t\tretval = RtmpOSFileClose(srcf);\n\t\t\tif ( retval != 0)\n\t\t\t{\n\t\t\t\tretval = NDIS_STATUS_FAILURE;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Close file \\\"%s\\\" failed(errCode=%d)!\\n\", src, retval));\n\t\t\t}\n\t\t}\n\t\t\n\t\tRtmpOSFSInfoChange(&osFSInfo, FALSE);\n\t}\n\n#ifdef HOSTAPD_SUPPORT\n\t\tfor (i = 0; i < pAd->ApCfg.BssidNum; i++)\n\t\t{\n\t\t\tpAd->ApCfg.MBSSID[i].Hostapd=FALSE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Reset ra%d hostapd support=FLASE\", i));\n\t\t\t\n\t\t}\n#endif /*HOSTAPD_SUPPORT */\n\n#ifdef SINGLE_SKU_V2\n\tRTMPSetSingleSKUParameters(pAd);\n#endif /* SINGLE_SKU_V2 */\n\n/*\tkfree(buffer); */\n\tos_free_mem(NULL, buffer);\n\t\n\treturn (retval);\n\n}\n\n\n#ifdef SYSTEM_LOG_SUPPORT\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tSend log message through wireless event\n\n\t\tSupport standard iw_event with IWEVCUSTOM. It is used below.\n\n\t\tiwreq_data.data.flags is used to store event_flag that is defined by user. \n\t\tiwreq_data.data.length is the length of the event log.\n\n\t\tThe format of the event log is composed of the entry's MAC address and\n\t\tthe desired log message (refer to pWirelessEventText).\n\n\t\t\tex: 11:22:33:44:55:66 has associated successfully\n\n\t\tp.s. The requirement of Wireless Extension is v15 or newer. \n\n\t========================================================================\n*/\nVOID RtmpDrvSendWirelessEvent(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tUSHORT\t\t\t\t\tEvent_flag,\n\tIN\tPUCHAR \t\t\t\t\tpAddr,\n\tIN  UCHAR\t\t\t\t\tBssIdx,\n\tIN\tCHAR\t\t\t\t\tRssi)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPSTRING\tpBuf = NULL, pBufPtr = NULL;\n\tUSHORT\tevent, type, BufLen;\t\n\tUCHAR\tevent_table_len = 0;\n\n\tif (pAd->CommonCfg.bWirelessEvent == FALSE)\n\t\treturn;\n\n\ttype = Event_flag & 0xFF00;\t\n\tevent = Event_flag & 0x00FF;\n\n\tswitch (type)\n\t{\n\t\tcase IW_SYS_EVENT_FLAG_START:\n\t\t\tevent_table_len = IW_SYS_EVENT_TYPE_NUM;\n\t\t\tbreak;\n#ifdef IDS_SUPPORT\n\t\tcase IW_SPOOF_EVENT_FLAG_START:\n\t\t\tevent_table_len = IW_SPOOF_EVENT_TYPE_NUM;\n\t\t\tbreak;\n\n\t\tcase IW_FLOOD_EVENT_FLAG_START:\n\t\t\tevent_table_len = IW_FLOOD_EVENT_TYPE_NUM;\n\t\t\tbreak;\n#endif /* IDS_SUPPORT */ \t\t\t\n#ifdef WSC_INCLUDED\n\t\tcase IW_WSC_EVENT_FLAG_START:\n\t\t\tevent_table_len = IW_WSC_EVENT_TYPE_NUM;\n\t\t\tbreak;\n#endif /* WSC_INCLUDED */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef IWSC_SUPPORT\n\t\tcase IW_IWSC_EVENT_FLAG_START:\n\t\t\tevent_table_len = IW_IWSC_EVENT_TYPE_NUM;\n\t\t\tbreak;\n#endif /* IWSC_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t}\n\t\n\tif (event_table_len == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The type(%0x02x) is not valid.\\n\", __FUNCTION__, type));\t\t\t       \t\t       \t\t\n\t\treturn;\n\t}\n\t\n\tif (event >= event_table_len)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : The event(%0x02x) is not valid.\\n\", __FUNCTION__, event));\t\t\t       \t\t       \t\t\n\t\treturn;\n\t}\t\n \n\t/*Allocate memory and copy the msg. */\n/*\tif((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) */\n\tos_alloc_mem(NULL, (UCHAR **)&pBuf, IW_CUSTOM_MAX_LEN);\n\tif(pBuf != NULL)\n\t{\n\t\t/*Prepare the payload */\n\t\tmemset(pBuf, 0, IW_CUSTOM_MAX_LEN);\n\n\t\tpBufPtr = pBuf;\t\t\n\n\t\tif (pAddr)\n\t\t\tpBufPtr += sprintf(pBufPtr, \"(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) \", PRINT_MAC(pAddr));\t\t\t\t\n\t\telse if (BssIdx < MAX_MBSSID_NUM(pAd))\n\t\t\tpBufPtr += sprintf(pBufPtr, \"(RT2860) BSS(ra%d) \", BssIdx);\n\t\telse\n\t\t\tpBufPtr += sprintf(pBufPtr, \"(RT2860) \");\n\n\t\tif (type == IW_SYS_EVENT_FLAG_START)\n        {\n\t\t\tpBufPtr += sprintf(pBufPtr, \"%s\", pWirelessSysEventText[event]);\n\t\t    \n            if (Event_flag == IW_CHANNEL_CHANGE_EVENT_FLAG)\n\t\t  \t{\n\t\t\t \tpBufPtr += sprintf(pBufPtr, \"%3d\", Rssi);\n\t\t\t}\t\t\t\n\t\t}\n#ifdef IDS_SUPPORT\t\t\n\t\telse if (type == IW_SPOOF_EVENT_FLAG_START)\n\t\t\tpBufPtr += sprintf(pBufPtr, \"%s (RSSI=%d)\", pWirelessSpoofEventText[event], Rssi);\n\t\telse if (type == IW_FLOOD_EVENT_FLAG_START)\n\t\t\tpBufPtr += sprintf(pBufPtr, \"%s\", pWirelessFloodEventText[event]);\n#endif /* IDS_SUPPORT */\t\t\n#ifdef WSC_INCLUDED\n\t\telse if (type == IW_WSC_EVENT_FLAG_START)\n\t\t\tpBufPtr += sprintf(pBufPtr, \"%s\", pWirelessWscEventText[event]);\n#endif /* WSC_INCLUDED */\n#ifdef CONFIG_STA_SUPPORT\n#ifdef IWSC_SUPPORT\n\t\telse if (type == IW_IWSC_EVENT_FLAG_START)\n\t\t\tpBufPtr += sprintf(pBufPtr, \"%s\", pWirelessIWscEventText[event]);\n#endif /* IWSC_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n\t\telse\n\t\t\tpBufPtr += sprintf(pBufPtr, \"%s\", \"unknown event\");\n\t\t\n\t\tpBufPtr[pBufPtr - pBuf] = '\\0';\n\t\tBufLen = pBufPtr - pBuf;\n\t\t\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen);\n\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"%s : %s\\n\", __FUNCTION__, pBuf)); */\n\t\n/*\t\tkfree(pBuf); */\n\t\tos_free_mem(NULL, pBuf);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : Can't allocate memory for wireless event.\\n\", __FUNCTION__));\t\t\t       \t\t       \t\t\t\t\n}\n#endif /* SYSTEM_LOG_SUPPORT */\n\n\nvoid RTMP_IndicateMediaState(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN  NDIS_MEDIA_STATE\tmedia_state)\n{\t\n\tpAd->IndicateMediaState = media_state;\n\n#ifdef SYSTEM_LOG_SUPPORT\n\t\tif (pAd->IndicateMediaState == NdisMediaStateConnected)\n\t\t{\n\t\t\tRTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);\n\t\t}\n\t\telse\n\t\t{\t\t\t\t\t\t\t\n\t\t\tRTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); \t\t\n\t\t}\t\n#endif /* SYSTEM_LOG_SUPPORT */\n}\n\n\nvoid tbtt_tasklet(unsigned long data)\n{\n#ifdef CONFIG_AP_SUPPORT\n#ifdef WORKQUEUE_BH\n\tstruct work_struct *work = (struct work_struct *)data;\n\tPOS_COOKIE pObj = container_of(work, struct os_cookie, tbtt_task);\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pObj->pAd_va;\n#else\n\t\tPRTMP_ADAPTER pAd = (RTMP_ADAPTER *)data;\n#endif /* WORKQUEUE_BH */\n\n\n#ifdef P2P_SUPPORT\n\tif (P2P_INF_ON(pAd) && P2P_GO_ON(pAd))\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \n#else\n\tif (pAd->OpMode == OPMODE_AP)\n#endif /* P2P_SUPPORT */\n\t{\n\t\t/* step 7 - if DTIM, then move backlogged bcast/mcast frames from PSQ to TXQ whenever DtimCount==0 */\n#ifdef RTMP_MAC_USB   \n\t\tif ((pAd->ApCfg.DtimCount + 1) == pAd->ApCfg.DtimPeriod)\n#endif /* RTMP_MAC_USB */\n\t\t{\n\t\t\tPQUEUE_ENTRY    pEntry;\n\t\t\tBOOLEAN\t\t\tbPS = FALSE;\n\t\t\tUINT \t\t\tcount = 0;\n\t\t\tunsigned long \t\tIrqFlags;\n\n/*\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock); */\n/*\t\t\tNdisAcquireSpinLock(&pAd->TxSwQueueLock); */\n\t\t\t\n\t\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\t\twhile (pAd->MacTab.McastPsQueue.Head)\n\t\t\t{\n\t\t\t\tbPS = TRUE;\n\t\t\t\tif (pAd->TxSwQueue[QID_AC_BE].Number <= (pAd->TxSwQMaxLen + MAX_PACKETS_IN_MCAST_PS_QUEUE))\n\t\t\t\t{\n\t\t\t\t\tpEntry = RemoveHeadQueue(&pAd->MacTab.McastPsQueue);\n\t\t\t\t\t/*if(pAd->MacTab.McastPsQueue.Number) */\n\t\t\t\t\tif (count)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMP_SET_PACKET_MOREDATA(pEntry, TRUE);\n\t\t\t\t\t}\n\t\t\t\t\tInsertHeadQueue(&pAd->TxSwQueue[QID_AC_BE], pEntry);\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t\t\t\n\t\t\t\n/*\t\t\tNdisReleaseSpinLock(&pAd->TxSwQueueLock); */\n/*\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock); */\n\t\t\tif (pAd->MacTab.McastPsQueue.Number == 0)\n\t\t\t{\t\t\t\n\t\t                UINT bss_index;\n\n                \t\t/* clear MCAST/BCAST backlog bit for all BSS */\n\t\t\t\tfor(bss_index=BSS0; bss_index<pAd->ApCfg.BssidNum; bss_index++)\n\t\t\t\t\tWLAN_MR_TIM_BCMC_CLEAR(bss_index);\n\t\t\t}\n\t\t\tpAd->MacTab.PsQIdleCount = 0;\n\n\t\t\t/* Dequeue outgoing framea from TxSwQueue0..3 queue and process it */\n\t\t\tif (bPS == TRUE) \n\t\t\t{\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, /*MAX_TX_IN_TBTT*/MAX_PACKETS_IN_MCAST_PS_QUEUE);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n}\n\n\nvoid announce_802_3_packet(\n\tIN VOID *pAdSrc,\n\tIN PNDIS_PACKET pPacket,\n\tIN UCHAR OpMode)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc;\n\tPNDIS_PACKET pRxPkt = pPacket;\n\n\tASSERT(pPacket);\n\tMEM_DBG_PKT_FREE_INC(pPacket);\n\n\n#ifdef CONFIG_AP_SUPPORT\n#ifdef APCLI_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (OpMode == OPMODE_AP)\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\tif (RTMP_MATPktRxNeedConvert(pAd, RtmpOsPktNetDevGet(pRxPkt)))\n\t\t\tRTMP_MATEngineRxHandle(pAd, pRxPkt, 0);\n\t}\n#endif /* APCLI_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n    /* Push up the protocol stack */\n#ifdef CONFIG_AP_SUPPORT\n#ifdef PLATFORM_BL2348\n{\n\textern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb);\n\tRtmpOsPktProtocolAssign(pRxPkt);\n\tpToUpperLayerPktSent(pRxPkt);\n\treturn;\n}\n#endif /* PLATFORM_BL2348 */\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef IKANOS_VX_1X0\n{\n\tIKANOS_DataFrameRx(pAd, pRxPkt);\n\treturn;\n}\n#endif /* IKANOS_VX_1X0 */\n\n#ifdef INF_PPA_SUPPORT\n\tif (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) \n\t{\n\t\tRtmpOsPktInfPpaSend(pRxPkt);\n\t\tpRxPkt=NULL;\n\t\treturn;\n\t}\t  \t\n#endif /* INF_PPA_SUPPORT */\n\n\n\t\n#ifdef CONFIG_AP_SUPPORT\n#ifdef BG_FT_SUPPORT\n\t\tif (BG_FTPH_PacketFromApHandle(pRxPkt) == 0)\n\t\t\treturn;\n#endif /* BG_FT_SUPPORT */\n#endif /* CONFIG_AP_SUPPORT */\n\n//+++Add by shiang for debug\nif (0) {\n\t\thex_dump(\"announce_802_3_packet\", GET_OS_PKT_DATAPTR(pRxPkt), GET_OS_PKT_LEN(pRxPkt));\n}\n//---Add by shiang for debug\n\n\t\tRtmpOsPktProtocolAssign(pRxPkt);\n\t\tRtmpOsPktRcvHandle(pRxPkt);\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\nvoid STA_MonPktSend(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tPNET_DEV pNetDev;\n\tPNDIS_PACKET pRxPacket;\n\tPHEADER_802_11 pHeader;\n\tUSHORT DataSize;\n\tUINT32 MaxRssi;\n\tUCHAR L2PAD, PHYMODE, BW, ShortGI, MCS, AMPDU, STBC, RSSI1;\n\tUCHAR BssMonitorFlag11n, Channel, CentralChannel;\n\tUCHAR *pData, *pDevName;\n\n\n\t/* sanity check */\n    ASSERT(pRxBlk->pRxPacket);\n    if (pRxBlk->DataSize < 10)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"%s : Size is too small! (%d)\\n\", __FUNCTION__, pRxBlk->DataSize));\n\t\tgoto err_free_sk_buff;\n    }\n\n    if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"%s : Size is too large! (%d)\\n\", __FUNCTION__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));\n\t\tgoto err_free_sk_buff;\n    }\n\n\t/* init */\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t\tMaxRssi = ConvertToRssi(pAd, pRxBlk->pRxWI->RxWISNR2, RSSI_0, pRxBlk->pRxWI->RxWISNR1, pRxBlk->pRxWI->RxWIBW);\n\telse\n#endif /* MT7601 */\n\tMaxRssi = RTMPMaxRssi(pAd,\n\t\t\t\t\t\tConvertToRssi(pAd, pRxBlk->pRxWI->RxWIRSSI0, RSSI_0, 0, 0),\n\t\t\t\t\t\tConvertToRssi(pAd, pRxBlk->pRxWI->RxWIRSSI1, RSSI_1, 0, 0),\n\t\t\t\t\t\tConvertToRssi(pAd, pRxBlk->pRxWI->RxWIRSSI2, RSSI_2, 0, 0));\n\n\tpNetDev = get_netdev_from_bssid(pAd, BSS0); \n\tpRxPacket = pRxBlk->pRxPacket;\n\tpHeader = pRxBlk->pHeader;\n\tpData = pRxBlk->pData;\n\tDataSize = pRxBlk->DataSize;\n\tL2PAD = pRxBlk->pRxInfo->L2PAD;\n\tPHYMODE = pRxBlk->pRxWI->RxWIPhyMode;\n\tBW = pRxBlk->pRxWI->RxWIBW;\n\tShortGI = pRxBlk->pRxWI->RxWISGI;\n\tMCS = pRxBlk->pRxWI->RxWIMCS;\n\tAMPDU = pRxBlk->pRxInfo->AMPDU;\n\tSTBC = pRxBlk->pRxWI->RxWISTBC;\n\tRSSI1 = pRxBlk->pRxWI->RxWIRSSI1;\n\tBssMonitorFlag11n = 0;\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n\tBssMonitorFlag11n = (pAd->StaCfg.BssMonitorFlag & MONITOR_FLAG_11N_SNIFFER);\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\tpDevName = (UCHAR *)RtmpOsGetNetDevName(pAd->net_dev);\n\tChannel = pAd->CommonCfg.Channel;\n\tCentralChannel = pAd->CommonCfg.CentralChannel;\n\n\t/* pass the packet */\n\tsend_monitor_packets(pNetDev, pRxPacket, pHeader, pData, DataSize,\n\t\t\t\t\t\tL2PAD, PHYMODE, BW, ShortGI, MCS, AMPDU, STBC, RSSI1,\n\t\t\t\t\t\tBssMonitorFlag11n, pDevName, Channel, CentralChannel,\n\t\t\t\t\t\tMaxRssi);\n\treturn;\n\nerr_free_sk_buff:\n\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\t\n\treturn;\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nextern NDIS_SPIN_LOCK TimerSemLock;\n\nVOID\tRTMPFreeAdapter(\n\tIN\tVOID\t\t*pAdSrc)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPOS_COOKIE os_cookie;\n\tint index;\t\n\n\tos_cookie=(POS_COOKIE)pAd->OS_Cookie;\n\n\tif (pAd->BeaconBuf)\n\t\tos_free_mem(NULL, pAd->BeaconBuf);\n\n\n\tNdisFreeSpinLock(&pAd->MgmtRingLock);\n\t\n\n\tfor (index =0 ; index < NUM_OF_TX_RING; index++)\n\t{\n\t\tNdisFreeSpinLock(&pAd->TxSwQueueLock[index]);\n\t\tNdisFreeSpinLock(&pAd->DeQueueLock[index]);\n\t\tpAd->DeQueueRunning[index] = FALSE;\n\t}\n\t\n\tNdisFreeSpinLock(&pAd->irq_lock);\n\n\n\n#ifdef UAPSD_SUPPORT\n\tNdisFreeSpinLock(&pAd->UAPSDEOSPLock); /* OS_ABL_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\tNdisFreeSpinLock(&pAd->mpdu_blk_pool.lock);\n#endif /* DOT11_N_SUPPORT */\n\n\tif (pAd->iw_stats)\n\t{\n\t\tos_free_mem(NULL, pAd->iw_stats);\n\t\tpAd->iw_stats = NULL;\n\t}\n\tif (pAd->stats)\n\t{\n\t\tos_free_mem(NULL, pAd->stats);\n\t\tpAd->stats = NULL;\n\t}\n\n\tNdisFreeSpinLock(&TimerSemLock);\n\n#ifdef RALINK_ATE\n#ifdef RTMP_MAC_USB\n\tRTMP_OS_ATMOIC_DESTROY(&pAd->BulkOutRemained);\n\tRTMP_OS_ATMOIC_DESTROY(&pAd->BulkInRemained);\n#endif /* RTMP_MAC_USB */\n#endif /* RALINK_ATE */\n\n\tRTMP_OS_FREE_TIMER(pAd);\n\tRTMP_OS_FREE_LOCK(pAd);\n\tRTMP_OS_FREE_TASKLET(pAd);\n\tRTMP_OS_FREE_TASK(pAd);\n\tRTMP_OS_FREE_SEM(pAd);\n\tRTMP_OS_FREE_ATOMIC(pAd);\n\n\tRtmpOsVfree(pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); */\n\tif (os_cookie)\n\t\tos_free_mem(NULL, os_cookie);\n}\n\n\nint\tRTMPSendPackets(\n\tIN NDIS_HANDLE dev_hnd,\n\tIN PPNDIS_PACKET ppPacketArray,\n\tIN UINT NumberOfPackets,\n\tIN UINT32 PktTotalLen,\n\tIN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev_hnd;\n\tPNDIS_PACKET pPacket = ppPacketArray[0];\n\n\n\tINC_COUNTER64(pAd->WlanCounters.TransmitCountFrmOs);\n\n\tif (pPacket == NULL)\n\t\tgoto done;\n\n\t/* RT2870STA does this in RTMPSendPackets() */\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES);\n\t\treturn 0;\n\t}\n#endif /* RALINK_ATE */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\t/* Drop send request since we are in monitor mode */\n\t\tif (MONITOR_ON(pAd))\n\t\t{\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn 0;\n\t\t}\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n        /* EapolStart size is 18 */\n\tif (PktTotalLen < 14)\n\t{\n\t\t/*printk(\"bad packet size: %d\\n\", pkt->len); */\n\t\thex_dump(\"bad packet\", GET_OS_PKT_DATAPTR(pPacket), PktTotalLen);\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n\n\n\n\tRTMP_SET_PACKET_5VT(pPacket, 0);\n/*\tMiniportMMRequest(pAd, pkt->data, pkt->len); */\n#ifdef CONFIG_5VT_ENHANCE\n    if (*(int*)(GET_OS_PKT_CB(pPacket)) == BRIDGE_TAG) {\n\t\tRTMP_SET_PACKET_5VT(pPacket, 1);\n    }\n#endif\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\tAPSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n#ifdef P2P_SUPPORT\n\t\tif (RTMP_GET_PACKET_OPMODE(pPacket))\n\t\t{\n\t\t\tAPSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);\n\t\t\tgoto done;\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\t\tSTASendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);\n\t}\n\n#endif /* CONFIG_STA_SUPPORT */\n\ndone:\n\treturn 0;\n}\n\n\nPNET_DEV get_netdev_from_bssid(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tPNET_DEV dev_p = NULL;\n#ifdef CONFIG_AP_SUPPORT\n\tUCHAR infRealIdx;\n#endif /* CONFIG_AP_SUPPORT */\n\n\tdo\n\t{\n#ifdef CONFIG_STA_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif(FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)\n\t\t{\n\t\t\tdev_p = pAd->ApCfg.MBSSID[BSS0].MSSIDDev;\n\t\t\tbreak;\n\t\t}\n#endif /* P2P_SUPPORT */\n#endif /* CONFIG_STA_SUPPORT */\n#ifdef CONFIG_AP_SUPPORT\n\t\tinfRealIdx = FromWhichBSSID & (NET_DEVICE_REAL_IDX_MASK);\n#ifdef APCLI_SUPPORT\n\t\tif(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\n\t\t\tdev_p = (infRealIdx >= MAX_APCLI_NUM ? NULL : pAd->ApCfg.ApCliTab[infRealIdx].dev);\n\t\t\tbreak;\n\t\t} \n#endif /* APCLI_SUPPORT */\n\n\t\tif ((FromWhichBSSID > 0) &&\n\t\t\t(FromWhichBSSID < pAd->ApCfg.BssidNum) &&\n\t\t\t\t(FromWhichBSSID < MAX_MBSSID_NUM(pAd)) &&\n\t\t\t\t(FromWhichBSSID < HW_BEACON_MAX_NUM))\n    \t\t{\n    \t    \t\tdev_p = pAd->ApCfg.MBSSID[FromWhichBSSID].MSSIDDev;\n    \t\t}\n\t\telse\n#endif /* CONFIG_AP_SUPPORT */\n\t\t{\n\t\t\tdev_p = pAd->net_dev;\n\t\t}\n\n\t} while (FALSE);\n\n\tASSERT(dev_p);\n\treturn dev_p; /* return one of MBSS */\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tDriver pre-Ioctl for AP.\n\nArguments:\n\tpAdSrc\t\t\t- WLAN control block pointer\n\tpCB\t\t\t\t- the IOCTL parameters\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\t- IOCTL OK\n\tOtherwise\t\t\t- IOCTL fail\n\nNote:\n========================================================================\n*/\nINT RTMP_AP_IoctlPrepare(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pCB)\n{\n\tRT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pCB;\n\tPOS_COOKIE pObj;\n\tUSHORT index;\n\tINT\tStatus = NDIS_STATUS_SUCCESS;\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\tINT cmd = 0xff;\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n    if((pConfig->priv_flags == INT_MAIN) && !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n    {\n\t\tif (pConfig->pCmdData == NULL)\n\t\t\treturn Status;\n\t\t\n\t\tif (RtPrivIoctlSetVal() == pConfig->CmdId_RTPRIV_IOCTL_SET)\n\t\t{\n\t\t\tif (TRUE\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\t\t\t\t&& (strstr(pConfig->pCmdData, \"OpMode\") == NULL)\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef SINGLE_SKU\n\t\t\t\t&& (strstr(pConfig->pCmdData, \"ModuleTxpower\") == NULL)\n#endif /* SINGLE_SKU */\n\t\t\t\t)\n\n\t\t\t{\n\t\t\t\treturn -ENETDOWN;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn -ENETDOWN;\n    }\n\n    /* determine this ioctl command is comming from which interface. */\n    if (pConfig->priv_flags == INT_MAIN)\n    {\n\t\tpObj->ioctl_if_type = INT_MAIN;\n        pObj->ioctl_if = MAIN_MBSSID;\n/*        DBGPRINT(RT_DEBUG_INFO, (\"rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\\n\", pObj->ioctl_if, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */\n    }\n    else if (pConfig->priv_flags == INT_MBSSID)\n    {\n\t\tpObj->ioctl_if_type = INT_MBSSID;\n/*    \tif (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3))  // for multi-physical card, no MBSSID */\n\t\tif (strcmp(pConfig->name, RtmpOsGetNetDevName(pAd->net_dev)) != 0) /* sample */\n    \t{\n\t        for (index = 1; index < pAd->ApCfg.BssidNum; index++)\n\t    \t{\n\t    \t    if (pAd->ApCfg.MBSSID[index].MSSIDDev == pConfig->net_dev)\n\t    \t    {\n\t    \t        pObj->ioctl_if = index;\n\t    \t        \n/*\t    \t        DBGPRINT(RT_DEBUG_INFO, (\"rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\\n\", index, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */\n\t    \t        break;\n\t    \t    }\n\t    \t}\n\t        /* Interface not found! */\n\t        if(index == pAd->ApCfg.BssidNum)\n\t        {\n/*\t        \tDBGPRINT(RT_DEBUG_ERROR, (\"rt28xx_ioctl can not find I/F\\n\")); */\n\t            return -ENETDOWN;\n\t        }\n\t    }\n\t    else    /* ioctl command from I/F(ra0) */\n\t    {\n/*\t\t\tGET_PAD_FROM_NET_DEV(pAd, net_dev); */\n    \t    pObj->ioctl_if = MAIN_MBSSID;\n/*\t        DBGPRINT(RT_DEBUG_ERROR, (\"rt28xx_ioctl can not find I/F and use default: cmd = 0x%08x\\n\", cmd)); */\n\t    }\n        MBSS_MR_APIDX_SANITY_CHECK(pAd, pObj->ioctl_if);\n    }\n#ifdef APCLI_SUPPORT\n\telse if (pConfig->priv_flags == INT_APCLI)\n\t{\n\t\tpObj->ioctl_if_type = INT_APCLI;\n\t\tfor (index = 0; index < MAX_APCLI_NUM; index++)\n\t\t{\n\t\t\tif (pAd->ApCfg.ApCliTab[index].dev == pConfig->net_dev)\n\t\t\t{\n\t\t\t\tpObj->ioctl_if = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(index == MAX_APCLI_NUM)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"rt28xx_ioctl can not find Apcli I/F\\n\"));\n\t\t\t\treturn -ENETDOWN;\n\t\t\t}\n\t\t}\n\t\tAPCLI_MR_APIDX_SANITY_CHECK(pObj->ioctl_if);\n\t}\n#endif /* APCLI_SUPPORT */\n#ifdef P2P_SUPPORT\n\telse if (pConfig->priv_flags == INT_P2P)\n\t{\n\t\tpObj->ioctl_if_type = INT_P2P;\n\t\tpObj->ioctl_if = MAIN_MBSSID;\n\t}\n#endif /* P2P_SUPPORT */\n    else\n    {\n/*    \tDBGPRINT(RT_DEBUG_WARN, (\"IOCTL is not supported in WDS interface\\n\")); */\n    \treturn -EOPNOTSUPP;\n    }\n\n\tpConfig->apidx = pObj->ioctl_if;\n\treturn Status;\n}\n\n\nVOID AP_E2PROM_IOCTL_PostCtrl(\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tPSTRING\t\t\t\t\tmsg)\n{\n\twrq->u.data.length = strlen(msg);\n\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t}\n}\n\n\nVOID IAPP_L2_UpdatePostCtrl(\n\tIN PRTMP_ADAPTER\tpAd,\n    IN UINT8 *mac_p,\n    IN INT  bssid)\n{\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n//#ifdef WDS_SUPPORT\nVOID AP_WDS_KeyNameMakeUp(\n\tIN\tSTRING\t\t\t\t\t\t*pKey,\n\tIN\tUINT32\t\t\t\t\t\tKeyMaxSize,\n\tIN\tINT\t\t\t\t\t\t\tKeyId)\n{\n\tsnprintf(pKey, KeyMaxSize, \"Wds%dKey\", KeyId);\n}\n//#endif /* WDS_SUPPORT */\n\n"
  },
  {
    "path": "src/os/linux/rt_rbus_pci_drv.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n\n\n"
  },
  {
    "path": "src/os/linux/rt_rbus_pci_util.c",
    "content": "/****************************************************************************\n\n    Module Name:\n\trt_rbus_pci_util.c\n \n    Abstract:\n\tAny utility is used in UTIL module for PCI/RBUS function.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#define RTMP_MODULE_OS\n#define RTMP_MODULE_OS_UTIL\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rtmp_osabl.h\"\n#include \"rt_os_util.h\"\n\n\n\n"
  },
  {
    "path": "src/os/linux/rt_symb.c",
    "content": "#ifdef OS_ABL_SUPPORT\n\n#include <linux/module.h>\n#include \"rt_config.h\"\n\nEXPORT_SYMBOL(RTMP_DRV_OPS_FUNCTION);\n\n#endif /* OS_ABL_SUPPORT */\n\n"
  },
  {
    "path": "src/os/linux/rt_usb.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtusb_bulk.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\tWhat\n\t--------\t----------\t----------------------------------------------\n\tName\t\tDate\t\tModification logs\n\t\n*/\n\n#include \"rt_config.h\"\n\n\n/*\n========================================================================\nRoutine Description:\n    Create kernel threads & tasklets.\n\nArguments:\n    *net_dev\t\t\tPointer to wireless net device interface\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nNDIS_STATUS\t RtmpMgmtTaskInit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tRTMP_OS_TASK *pTask;\n\tNDIS_STATUS status;\n\n\t/*\n\t\tCreat TimerQ Thread, We need init timerQ related structure before create the timer thread.\n\t*/\n\tRtmpTimerQInit(pAd);\n\n\tpTask = &pAd->timerTask;\n\tRTMP_OS_TASK_INIT(pTask, \"RtmpTimerTask\", pAd);\n\tstatus = RtmpOSTaskAttach(pTask, RtmpTimerQThread, (ULONG)pTask);\n\tif (status == NDIS_STATUS_FAILURE) \n\t{\n\t\tprintk (KERN_WARNING \"%s: unable to start RtmpTimerQThread\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\t\n\t/* Creat MLME Thread */\n\tpTask = &pAd->mlmeTask;\n\tRTMP_OS_TASK_INIT(pTask, \"RtmpMlmeTask\", pAd);\n\tstatus = RtmpOSTaskAttach(pTask, MlmeThread, (ULONG)pTask);\n\tif (status == NDIS_STATUS_FAILURE) \n\t{\n\t\tprintk (KERN_WARNING \"%s: unable to start MlmeThread\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t/* Creat Command Thread */\n\tpTask = &pAd->cmdQTask;\n\tRTMP_OS_TASK_INIT(pTask, \"RtmpCmdQTask\", pAd);\n\tstatus = RtmpOSTaskAttach(pTask, RTUSBCmdThread, (ULONG)pTask);\n\tif (status == NDIS_STATUS_FAILURE) \n\t{\n\t\tprintk (KERN_WARNING \"%s: unable to start RTUSBCmdThread\\n\", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n#ifdef WSC_INCLUDED\n\t/* start the crediential write task first. */\n\tWscThreadInit(pAd);\n#endif /* WSC_INCLUDED */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n\n/*\n========================================================================\nRoutine Description:\n    Close kernel threads.\n\nArguments:\n\t*pAd\t\t\t\tthe raxx interface data pointer\n\nReturn Value:\n    NONE\n\nNote:\n========================================================================\n*/\nVOID RtmpMgmtTaskExit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tINT\t\t\tret;\n\tRTMP_OS_TASK\t*pTask;\n\t\n\t/* Sleep 50 milliseconds so pending io might finish normally */\n\tRTMPusecDelay(50000);\n\n\t/* We want to wait until all pending receives and sends to the */\n\t/* device object. We cancel any */\n\t/* irps. Wait until sends and receives have stopped. */\n\tRTUSBCancelPendingIRPs(pAd);\n\n\t/* We need clear timerQ related structure before exits of the timer thread. */\n\tRtmpTimerQExit(pAd);\n\n\t/* Terminate Mlme Thread */\n\tpTask = &pAd->mlmeTask;\n\tret = RtmpOSTaskKill(pTask);\n\tif (ret == NDIS_STATUS_FAILURE)\n\t{\n/*\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: kill task(%s) failed!\\n\", */\n/*\t\t\t\t\tRTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"kill mlme task failed!\\n\"));\n\t}\n\n\t/* Terminate cmdQ thread */\n\tpTask = &pAd->cmdQTask;\n\tRTMP_OS_TASK_LEGALITY(pTask)\n\t{\n\t\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\t\tpAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;\n\t\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\n\t\t/*RTUSBCMDUp(&pAd->cmdQTask); */\n\t\tret = RtmpOSTaskKill(pTask);\n\t\tif (ret == NDIS_STATUS_FAILURE)\n\t\t{\n/*\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: kill task(%s) failed!\\n\", */\n/*\t\t\t\t\tRTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"kill command task failed!\\n\"));\n\t\t}\n\t\tpAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN;\n\t}\n\n\t/* Terminate timer thread */\n\tpTask = &pAd->timerTask;\n\tret = RtmpOSTaskKill(pTask);\n\tif (ret == NDIS_STATUS_FAILURE)\n\t{\n/*\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: kill task(%s) failed!\\n\", */\n/*\t\t\t\t\tRTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); */\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"kill timer task failed!\\n\"));\n\t}\n\n#ifdef WSC_INCLUDED\n\tWscThreadExit(pAd);\n#endif /* WSC_INCLUDED */\n\n}\n\n\nstatic void rtusb_dataout_complete(unsigned long data)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tpurbb_t\t\t\t\tpUrb;\n\tPOS_COOKIE\t\t\tpObj;\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tUCHAR\t\t\t\tBulkOutPipeId;\n\tNTSTATUS\t\t\tStatus;\n\tunsigned long\t\tIrqFlags;\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpHTTXContext\t= (PHT_TX_CONTEXT)pUrb->context; */\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus\t\t\t= RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd\t\t\t\t= pHTTXContext->pAd;\n\tpObj \t\t\t= (POS_COOKIE) pAd->OS_Cookie;\n/*\tStatus\t\t\t= pUrb->status; */\n\n\t/* Store BulkOut PipeId */\n\tBulkOutPipeId = pHTTXContext->BulkOutPipeId;\n\tpAd->BulkOutDataOneSecCount++;\n\n\t/*DBGPRINT(RT_DEBUG_LOUD, (\"Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\\n\", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition, */\n\t/*\t\tpHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad)); */\n\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\tpHTTXContext->IRPPending = FALSE;\n\tpAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;\n\t\n\tif (Status == USB_ST_NOERROR)\n\t{\t\n\t\tpAd->BulkOutComplete++;\n\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\n\t\tpAd->Counters8023.GoodTransmits++;\n\t\t/*RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */\n\t\tFREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);\t\t\t\n\t\t/*RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */\n\n#ifdef UAPSD_SUPPORT\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tUAPSD_UnTagFrame(pAd, BulkOutPipeId, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition);\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n#else\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\tUAPSD_UnTagFrame(pAd, BulkOutPipeId, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition);\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n\t}\n\telse\t/* STATUS_OTHER */\n\t{\n\t\tPUCHAR\tpBuf;\n\t\t\n\t\tpAd->BulkOutCompleteOther++;\n\t\t\n\t\tpBuf = &pHTTXContext->TransferBuffer->field.WirelessPacket[pHTTXContext->NextBulkOutPosition];\n\t\t\n\t\tif (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\t\t\tpAd->bulkResetPipeid = BulkOutPipeId;\n\t\t\tpAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;\n\t\t}\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"BulkOutDataPacket failed: ReasonCode=%d!\\n\", Status));\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"\\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\\n\", pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther));\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"\\t>>BulkOut Header:%x %x %x %x %x %x %x %x\\n\", pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7]));\n\t\t/*DBGPRINT_RAW(RT_DEBUG_ERROR, (\">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\\n\", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther)); */\n\t\t\n\t}\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))\n\t\treturn;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t/* */\n\t/* bInUse = TRUE, means some process are filling TX data, after that must turn on bWaitingBulkOut */\n\t/* bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out. */\n\t/* */\n\t/*RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */\n\tif (((pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition) && \n\t\t(pHTTXContext->ENextBulkOutPosition != (pHTTXContext->CurWritePosition+8)) && \n\t\t!RTUSB_TEST_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)))\n#ifdef USB_BULK_BUF_ALIGMENT\n\t\t\t\t||\t(pHTTXContext->NextBulkIdx != pHTTXContext->CurWriteIdx)\n#endif /* USB_BULK_BUF_ALIGMENT */\n\t)\n\t{\n\t\t/* Indicate There is data avaliable */\n\t\tRTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));\n\t}\n\t/*RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */\n\n\t/* Always call Bulk routine, even reset bulk. */\n\t/* The protection of rest bulk should be in BulkOut routine */\n\tRTUSBKickBulkOut(pAd);\n}\n\n\nstatic void rtusb_null_frame_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\tpAd;\n\tPTX_CONTEXT\t\tpNullContext;\n\tpurbb_t\t\t\tpUrb;\n\tNTSTATUS\t\tStatus;\n\tunsigned long\tirqFlag;\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpNullContext\t= (PTX_CONTEXT)pUrb->context; */\n\tpNullContext\t= (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus\t\t\t= RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd \t\t\t= pNullContext->pAd;\n/*\tStatus \t\t\t= pUrb->status; */\n\n\t/* Reset Null frame context flags */\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);\n\tpNullContext->IRPPending \t= FALSE;\n\tpNullContext->InUse \t\t= FALSE;\n\tpAd->BulkOutPending[0] = FALSE;\n\tpAd->watchDogTxPendingCnt[0] = 0;\n\n\tif (Status == USB_ST_NOERROR)\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);\n\t\t\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t}\n\telse\t/* STATUS_OTHER */\n\t{\n\t\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Bulk Out Null Frame Failed, ReasonCode=%d!\\n\", Status));\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\t\t\tpAd->bulkResetPipeid = (0 | BULKOUT_MGMT_RESET_FLAG);\n\t\t\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t\tpAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);\n\t\t}\n\t}\n\n\t/* Always call Bulk routine, even reset bulk. */\n\t/* The protectioon of rest bulk should be in BulkOut routine */\n\tRTUSBKickBulkOut(pAd);\n}\n\n\n#ifdef CONFIG_MULTI_CHANNEL\nstatic void rtusb_hcca_null_frame_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\tpAd;\n\tPTX_CONTEXT\t\tpNullContext;\n\tpurbb_t\t\t\tpUrb;\n\tNTSTATUS\t\tStatus;\n\tunsigned long\tirqFlag;\n\tUCHAR BulkOutPipeId;\n\n\tpUrb\t\t\t= (purbb_t)data;\n\tpNullContext\t= (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus\t\t\t= RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd \t\t\t= pNullContext->pAd;\n\tBulkOutPipeId = pNullContext->BulkOutPipeId;\n/*\tStatus \t\t\t= pUrb->status; */\n\n\t/* Reset Null frame context flags */\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);\n\tpNullContext->IRPPending = FALSE;\n\tpNullContext->InUse = FALSE;\n\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\tpAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;\n\n\tif (Status == USB_ST_NOERROR)\n\t{\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);\n\t\t\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t}\n\telse\t/* STATUS_OTHER */\n\t{\n\t\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Bulk Out Null Frame Failed, ReasonCode=%d!\\n\", Status));\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\t\t\tpAd->bulkResetPipeid = (BulkOutPipeId | BULKOUT_MGMT_RESET_FLAG);\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\n\t\t}\n\t\telse\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);\n\t}\n\n\t/* Always call Bulk routine, even reset bulk. */\n\t/* The protectioon of rest bulk should be in BulkOut routine */\n\tRTUSBKickBulkOut(pAd);\n}\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\nstatic void rtusb_pspoll_frame_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\tpAd;\n\tPTX_CONTEXT\t\tpPsPollContext;\n\tpurbb_t\t\t\tpUrb;\n\tNTSTATUS\t\tStatus;\n\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpPsPollContext\t= (PTX_CONTEXT)pUrb->context; */\n\tpPsPollContext\t= (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus\t\t\t= RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd\t\t\t\t= pPsPollContext->pAd;\n/*\tStatus\t\t\t= pUrb->status; */\n\n\t/* Reset PsPoll context flags */\n\tpPsPollContext->IRPPending\t= FALSE;\n\tpPsPollContext->InUse\t\t= FALSE;\n\tpAd->watchDogTxPendingCnt[0] = 0;\n\t\n\tif (Status == USB_ST_NOERROR)\n\t{\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t}\n\telse /* STATUS_OTHER */\n\t{\n\t\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Bulk Out PSPoll Failed\\n\"));\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\t\t\tpAd->bulkResetPipeid = (0 | BULKOUT_MGMT_RESET_FLAG);\n\t\t\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t\tpAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\n\t\t}\n\t}\n\n\tRTMP_SEM_LOCK(&pAd->BulkOutLock[0]);\n\tpAd->BulkOutPending[0] = FALSE;\n\tRTMP_SEM_UNLOCK(&pAd->BulkOutLock[0]);\n\n\t/* Always call Bulk routine, even reset bulk. */\n\t/* The protectioon of rest bulk should be in BulkOut routine */\n\tRTUSBKickBulkOut(pAd);\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Handle received packets.\n\nArguments:\n\tdata\t\t\t\t- URB information pointer\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nstatic void rx_done_tasklet(unsigned long data)\n{\n\tpurbb_t \t\t\tpUrb;\n\tPRX_CONTEXT\t\t\tpRxContext;\n\tPRTMP_ADAPTER\t\tpAd;\n\tNTSTATUS\t\t\tStatus;\n\tunsigned int\t\tIrqFlags;\n\n\tpUrb\t\t= (purbb_t)data;\n/*\tpRxContext\t= (PRX_CONTEXT)pUrb->context; */\n\tpRxContext\t= (PRX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus\t\t= RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd \t\t= pRxContext->pAd;\n/*\tStatus = pUrb->status; */\n\n\n\tRTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);\n\tpRxContext->InUse = FALSE;\n\tpRxContext->IRPPending = FALSE;\n\tpRxContext->BulkInOffset += RTMP_USB_URB_LEN_GET(pUrb); /*pUrb->actual_length; */\n\t/*NdisInterlockedDecrement(&pAd->PendingRx); */\n\tif ( pAd->PendingRx > 0 )\n\t\tpAd->PendingRx--;\n\n\tif (Status == USB_ST_NOERROR)\n\t{\n\t\tpAd->BulkInComplete++;\n\t\tpAd->NextRxBulkInPosition = 0;\n\t\tif (pRxContext->BulkInOffset)\t/* As jan's comment, it may bulk-in success but size is zero. */\n\t\t{\n\t\t\tpRxContext->Readable = TRUE;\n\t\t\tINC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);\n\t\t}\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\t}\n\telse\t /* STATUS_OTHER */\n\t{\n\t\tpAd->BulkInCompleteFail++;\n\t\t/* Still read this packet although it may comtain wrong bytes. */\n\t\tpRxContext->Readable = FALSE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);\n\n\t\t/* Parsing all packets. because after reset, the index will reset to all zero. */\n\t\tif ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_BULKIN_RESET |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST))))\n\t\t{\n\t\t\t\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\\n\", \n\t\t\t\t\t\t\tStatus, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, RTMP_USB_URB_LEN_GET(pRxContext->pUrb))); /*->actual_length)); */\n\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);\n\t\t}\n\t}\n\t\n\tASSERT((pRxContext->InUse == pRxContext->IRPPending));\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\t/* If the driver is in ATE mode and Rx frame is set into here. */\n\t\tif (pAd->ContinBulkIn == TRUE)\t\t\n\t\t{\n\t\t\tRTUSBBulkReceive(pAd);\n\t\t}\n\t}\n\telse\n#endif /* RALINK_ATE */\n\tRTUSBBulkReceive(pAd);\n\n\n\treturn;\n\n}\n\n\n#ifdef RLT_MAC\nstatic void cmd_rsp_event_tasklet(unsigned long data)\n{\n\tpurbb_t \t\t\tpUrb;\n\tPCMD_RSP_CONTEXT pCmdRspEventContext;\n\tPRTMP_ADAPTER\t\tpAd;\n\tNTSTATUS\t\t\tStatus;\n\tunsigned int\t\tIrqFlags;\n\n\tpUrb = (purbb_t)data;\n\tpCmdRspEventContext\t= (PRX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus = RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd = pCmdRspEventContext->pAd;\n\n\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\tpCmdRspEventContext->IRPPending = FALSE;\n\tpCmdRspEventContext->InUse = FALSE;\n\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\n\tif (Status == USB_ST_NOERROR)\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\t\tpCmdRspEventContext->Readable = TRUE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\t\t\n\t}\n\telse\n\t{\n\t\tRTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);\n\t\tpCmdRspEventContext->Readable = FALSE;\n\t\tRTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);\n\t}\n\n\tRTUSBBulkCmdRspEventReceive(pAd);\n}\n#endif /* RLT_MAC */\n\n\nstatic void rtusb_mgmt_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER \tpAd;\n\tPTX_CONTEXT\t\tpMLMEContext;\n\tint\t\t\t\tindex;\n\tPNDIS_PACKET\tpPacket;\n\tpurbb_t\t\t\tpUrb;\n\tNTSTATUS\t\tStatus;\n\tunsigned long\tIrqFlags;\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpMLMEContext\t= (PTX_CONTEXT)pUrb->context; */\n\tpMLMEContext\t= (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tStatus\t\t\t= RTMP_USB_URB_STATUS_GET(pUrb);\n\tpAd \t\t\t= pMLMEContext->pAd;\n/*\tStatus\t\t\t= pUrb->status; */\n\tindex \t\t\t= pMLMEContext->SelfIdx;\n\n\tASSERT((pAd->MgmtRing.TxDmaIdx == index));\n\n\tRTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\n\n#ifdef UAPSD_SUPPORT\n\t/* Qos Null frame with EOSP shall have valid Wcid value. reference RtmpUSBMgmtKickOut() API. */\n\t/* otherwise will be value of MCAST_WCID. */\n#ifdef DOT11Z_TDLS_SUPPORT\n\tif ((pMLMEContext->Wcid != MCAST_WCID) && (pMLMEContext->Wcid < MAX_LEN_OF_MAC_TABLE))\n\t{\n\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[pMLMEContext->Wcid];\n\n\t\tUAPSD_SP_Close(pAd, pEntry);\n\t\tpMLMEContext->Wcid = MCAST_WCID;\n\t}\n#else\n#ifdef CONFIG_AP_SUPPORT\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n#else\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n#endif /* P2P_SUPPORT */\n\t{\n\t\t/* Qos Null frame with EOSP shall have valid Wcid value. reference RtmpUSBMgmtKickOut() API. */\n\t\t/* otherwise will be value of MCAST_WCID. */\n\t\tif ((pMLMEContext->Wcid != MCAST_WCID) && (pMLMEContext->Wcid < MAX_LEN_OF_MAC_TABLE))\n\t\t{\n\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[pMLMEContext->Wcid];\n\n\t\t\tUAPSD_SP_Close(pAd, pEntry);\n\t\t\tpMLMEContext->Wcid = MCAST_WCID;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#endif /* UAPSD_SUPPORT */\n\n\n\tif (Status != USB_ST_NOERROR)\n\t{\n\t\t/*Bulk-Out fail status handle */\n\t\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Bulk Out MLME Failed, Status=%d!\\n\", Status));\n\t\t\t/* TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt? */\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\t\t\tpAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);\n\t\t}\n\t}\n\n\tpAd->BulkOutPending[MGMTPIPEIDX] = FALSE;\n\tRTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);\n\n\tRTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);\n\t/* Reset MLME context flags */\n\tpMLMEContext->IRPPending = FALSE;\n\tpMLMEContext->InUse = FALSE;\n\tpMLMEContext->bWaitingBulkOut = FALSE;\n\tpMLMEContext->BulkOutSize = 0;\n\n\tpPacket = pAd->MgmtRing.Cell[index].pNdisPacket;\n\tpAd->MgmtRing.Cell[index].pNdisPacket = NULL;\n\n\t/* Increase MgmtRing Index */\n\tINC_RING_INDEX(pAd->MgmtRing.TxDmaIdx, MGMT_RING_SIZE);\n\tpAd->MgmtRing.TxSwFreeIdx++;\n\tRTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);\n\n\n\t/* No-matter success or fail, we free the mgmt packet. */\n\tif (pPacket)\n\t\tRTMPFreeNdisPacket(pAd, pPacket);\n\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST))))\n\t{\n\t\t/* do nothing and return directly. */\n\t}\n\telse\n\t{\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && \n\t\t\t((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG))\n\t\t{\t/* For Mgmt Bulk-Out failed, ignore it now. */\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\n\t\t}\n\t\telse\n\t\t{\n\n\t\t\t/* Always call Bulk routine, even reset bulk. */\n\t\t\t/* The protectioon of rest bulk should be in BulkOut routine */\n\t\t\tif (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */)\n\t\t\t{\n\t\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);\n\t\t\t}\n\t\t\t\tRTUSBKickBulkOut(pAd);\n\t\t\t}\n\t\t}\n\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n}\n\n\nstatic void rtusb_hcca_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tUCHAR\t\t\t\tBulkOutPipeId = 4;\n\tpurbb_t\t\t\t\tpUrb;\n\n\t\n\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"--->hcca_dma_done_tasklet\\n\"));\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpHTTXContext\t= (PHT_TX_CONTEXT)pUrb->context; */\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tpAd\t\t\t\t= pHTTXContext->pAd;\n\n\trtusb_dataout_complete((unsigned long)pUrb);\n\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST)))) \n\t{\n\t\t/* do nothing and return directly. */\n\t}\n\telse \n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))\n\t\t{\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\t\n\t\t}\n\t\telse\n\t\t{\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\t\t\tif ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && \n\t\t\t\t/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */\n\t\t\t\t(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && \n\t\t\t\t(pHTTXContext->bCurWriting == FALSE))\n\t\t\t{\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);\n\t\t\t}\n\t\t\t\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))\n\t\t\t\treturn;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);\n\t\t\tRTUSBKickBulkOut(pAd);\n\t\t}\n\t}\n\t\n\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"<---hcca_dma_done_tasklet\\n\"));\n\n\t\treturn;\n}\n\n\nstatic void rtusb_ac3_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tUCHAR\t\t\t\tBulkOutPipeId = 3;\n\tpurbb_t\t\t\t\tpUrb;\n\t\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpHTTXContext\t= (PHT_TX_CONTEXT)pUrb->context; */\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tpAd\t\t\t\t= pHTTXContext->pAd;\n\n\trtusb_dataout_complete((unsigned long)pUrb);\n\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST)))) \n\t{\n\t\t/* do nothing and return directly. */\n\t}\n\telse \n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))\n\t\t{\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\t\n\t\t}\n\t\telse\n\t\t{\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\t\t\tif ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && \n\t\t\t\t/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */\n\t\t\t\t(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && \n\t\t\t\t(pHTTXContext->bCurWriting == FALSE))\n\t\t\t{\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);\n\t\t\t}\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))\n\t\t\t\treturn;\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\t\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<3);\n\t\t\tRTUSBKickBulkOut(pAd);\n\t\t}\n\t}\n\n\n\treturn;\n}\n\n\nstatic void rtusb_ac2_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tUCHAR\t\t\t\tBulkOutPipeId = 2;\n\tpurbb_t\t\t\t\tpUrb;\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpHTTXContext\t= (PHT_TX_CONTEXT)pUrb->context; */\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tpAd\t\t\t\t= pHTTXContext->pAd;\n\n\trtusb_dataout_complete((unsigned long)pUrb);\n\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST)))) \n\t{\n\t\t/* do nothing and return directly. */\n\t}\n\telse \n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))\n\t\t{\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\t\n\t\t}\n\t\telse\n\t\t{\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\t\t\tif ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && \n\t\t\t\t/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */\n\t\t\t\t(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && \n\t\t\t\t(pHTTXContext->bCurWriting == FALSE))\n\t\t\t{\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);\n\t\t\t}\n\t\t\t\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<2);\n\t\t\tRTUSBKickBulkOut(pAd);\n\t\t}\n\t}\n\n\n\treturn;\n}\n\n\nstatic void rtusb_ac1_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tUCHAR\t\t\t\tBulkOutPipeId = 1;\n\tpurbb_t\t\t\t\tpUrb;\n\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpHTTXContext\t= (PHT_TX_CONTEXT)pUrb->context; */\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tpAd\t\t\t\t= pHTTXContext->pAd;\n\n\trtusb_dataout_complete((unsigned long)pUrb);\n\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST)))) \n\t{\n\t\t/* do nothing and return directly. */\n\t}\n\telse \n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))\n\t\t{\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\t\n\t\t}\n\t\telse\n\t\t{\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\t\t\tif ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && \n\t\t\t\t/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */\n\t\t\t\t(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && \n\t\t\t\t(pHTTXContext->bCurWriting == FALSE))\n\t\t\t{\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);\n\t\t\t}\n\t\t\t\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<1);\n\t\t\tRTUSBKickBulkOut(pAd);\n\t\t}\n\t}\n\treturn;\n\n}\n\n\nstatic void rtusb_ac0_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER\t\tpAd;\n\tPHT_TX_CONTEXT\t\tpHTTXContext;\n\tUCHAR\t\t\t\tBulkOutPipeId = 0;\n\tpurbb_t\t\t\t\tpUrb;\n\t\n\n\tpUrb\t\t\t= (purbb_t)data;\n/*\tpHTTXContext\t= (PHT_TX_CONTEXT)pUrb->context; */\n\tpHTTXContext\t= (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);\n\tpAd\t\t\t\t= pHTTXContext->pAd;\n\n\trtusb_dataout_complete((unsigned long)pUrb);\n\t\t\n\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_HALT_IN_PROGRESS | \n\t\t\t\t\t\t\t\tfRTMP_ADAPTER_NIC_NOT_EXIST)))) \n\t{\n\t\t/* do nothing and return directly. */\n\t}\n\telse \n\t{\t\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))\n\t\t{\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\t\n\t\t}\n\t\telse\n\t\t{\tpHTTXContext = &pAd->TxContext[BulkOutPipeId];\n\t\t\tif ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && \n\t\t\t\t/*  ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */\n\t\t\t\t(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&\n\t\t\t\t(pHTTXContext->bCurWriting == FALSE))\n\t\t\t{\n\t\t\t\tRTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);\n\t\t\t}\n\t\t\t\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))\n\t\t\t\treturn;\n#endif /* CONFIG_MULTI_CHANNEL */\t\t\t\n\t\t\n\t\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);\n\t\t\tRTUSBKickBulkOut(pAd);\n\t\t}\n\t}\n\n\n\treturn;\n\n}\n\n#ifdef RALINK_ATE\nstatic void rtusb_ate_ac0_dma_done_tasklet(unsigned long data)\n{\n\tPRTMP_ADAPTER pAd;\n\tPTX_CONTEXT pNullContext;\n\tUCHAR BulkOutPipeId;\n\tNTSTATUS Status;\n\tULONG IrqFlags;\n\tULONG OldValue;\n\tpurbb_t pURB;\n\n\tpURB = (purbb_t)data;\n\t/*pNullContext = (PTX_CONTEXT)pURB->rtusb_urb_context; */\n\tpNullContext\t= (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pURB);\n\tpAd = pNullContext->pAd;\n\t\n\t/* Reset Null frame context flags */\n\tpNullContext->IRPPending = FALSE;\n\tpNullContext->InUse = FALSE;\n\tStatus = RTMP_USB_URB_STATUS_GET(pURB);/*pURB->rtusb_urb_status; */\n\n\t/* Store BulkOut PipeId. */\n\tBulkOutPipeId = pNullContext->BulkOutPipeId;\n\tpAd->BulkOutDataOneSecCount++;\n\t\n\tif (Status == USB_ST_NOERROR)\n\t{\t\n#ifdef RALINK_QA\n\t\tif ((ATE_ON(pAd)) && (pAd->ate.bQATxStart == TRUE))\n\t\t{\n\t\t\tif (pAd->ate.QID == BulkOutPipeId)\n\t\t\t{\n#ifdef RELASE_EXCLUDE\n\t\t\t\t/*\n\t\t\t\t\tLet Rx can have a chance to break in during Tx process,\n\t\t\t\t\tespecially for loopback mode in QA ATE.\n\n\t\t\t\t\tTo trade off between tx performance and loopback mode integrity.\n\n\t\t\t\t\tQ   : Now Rx is handled by tasklet, do we still need this delay ?\n\t\t\t\t\tAns : Even tasklet is used, Rx/Tx < 1 if we do not delay for a while right here.\n\t\t\t\t*/\n#endif /* RELASE_EXCLUDE */\n\t\t\t\tRTMPusecDelay(10);\n\t\t\t\tpAd->ate.TxDoneCount++;\n#ifdef RELASE_EXCLUDE\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"pAd->ate.TxDoneCount == %d\\n\", pAd->ate.TxDoneCount));\n#endif /* RELASE_EXCLUDE */\n\t\t\t\tpAd->RalinkCounters.KickTxCount++;\n\t\t\t\tASSERT(pAd->ate.QID == 0);\n\t\t\t\tpAd->ate.TxAc0++;\n\t\t\t}\n\t\t}\n#endif /* RALINK_QA */\n\t\tpAd->BulkOutComplete++;\n\n\t\tpAd->Counters8023.GoodTransmits++;\n\n\t\t/* Don't worry about the queue is empty or not. This function will check itself. */\n\t\t/* In RT28xx, SendTxWaitQueue == TxSwQueue  */\n\t\tRTMPDeQueuePacket(pAd, TRUE, BulkOutPipeId, MAX_TX_PROCESS);\n\n\t}\n\telse\n\t{\n\t\tpAd->BulkOutCompleteOther++;\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BulkOutDataPacket Failed STATUS_OTHER = 0x%x . \\n\", Status));\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\">>BulkOutReq=0x%lx, BulkOutComplete=0x%lx\\n\", pAd->BulkOutReq, pAd->BulkOutComplete));\n\n\t\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&\n\t\t\t(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);\n\n\t\t\t/* In 28xx, RT_OID_USB_RESET_BULK_OUT ==> CMDTHREAD_RESET_BULK_OUT */\n\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);\n\n\t\t\t/* check */\n\t\t\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\t\t\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\t\t\tpAd->bulkResetPipeid = BulkOutPipeId;\n\t\t\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\n\t\t\treturn;\n\t\t}\n\t}\n\n#ifdef RELASE_EXCLUDE\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->pAd = 0x%lx\\n\", (ULONG)&pNullContext->pAd));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->pUrb = 0x%lx\\n\", (ULONG)&pNullContext->pUrb));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->TransferBuffer = 0x%lx\\n\", (ULONG)&pNullContext->TransferBuffer));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->BulkOutPipeId = %d\\n\", pNullContext->BulkOutPipeId));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->BulkOutSize = %ld\\n\", pNullContext->BulkOutSize));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->InUse = %d\\n\", (pNullContext->InUse==TRUE)));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->bWaitingBulkOut = %d\\n\", (pNullContext->bWaitingBulkOut==TRUE)));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->IRPPending = %d\\n\", (pNullContext->IRPPending==TRUE)));\n\tDBGPRINT(RT_DEBUG_INFO, (\"pNullContext->LastOne = %d\\n\", (pNullContext->LastOne==TRUE)));\n#endif /* RELASE_EXCLUDE */\n\t\n\n\tif (atomic_read(&pAd->BulkOutRemained) > 0)\n\t{\t\t\t\n\t\tatomic_dec(&pAd->BulkOutRemained);\n#ifdef RELASE_EXCLUDE\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"Bulk Out Remained = %d\\n\", atomic_read(&pAd->BulkOutRemained)));\n#endif /* RELASE_EXCLUDE */\n\t}\n\t\n\t/* 1st - Transmit Success */\n\tOldValue = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;\n\tpAd->WlanCounters.TransmittedFragmentCount.u.LowPart++;\n\n\tif (pAd->WlanCounters.TransmittedFragmentCount.u.LowPart < OldValue)\n\t{\n\t\tpAd->WlanCounters.TransmittedFragmentCount.u.HighPart++;\n\t}\n\t\n\tif (((pAd->ContinBulkOut == TRUE ) ||(atomic_read(&pAd->BulkOutRemained) > 0))\n\t\t&& (pAd->ate.Mode & ATE_TXFRAME))\n\t{\n#ifdef RELASE_EXCLUDE\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"Continue to BulkOut ! \\n\"));\n#endif /* RELASE_EXCLUDE */\n\t\tRTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n\t}\t\n\telse\n\t{\n\t\tRTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);\n#ifdef RALINK_QA\n\t\tpAd->ate.TxStatus = 0;\n#endif /* RALINK_QA */\n\t}\n\n\tBULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\n\tpAd->BulkOutPending[BulkOutPipeId] = FALSE;\n\tBULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);\t\n\n\t/* Always call Bulk routine, even reset bulk. */\n\t/* The protection of rest bulk should be in BulkOut routine. */\n\tRTUSBKickBulkOut(pAd);\n}\n#endif /* RALINK_ATE */\n\n\nNDIS_STATUS RtmpNetTaskInit(\n\tIN RTMP_ADAPTER *pAd)\n{\n\tPOS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;\n\t\n\t/* Create receive tasklet */\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd);\n#ifdef RLT_MAC\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->cmd_rsp_event_task, cmd_rsp_event_tasklet, (ULONG)pAd);\n#endif /* RLT_MAC */\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd);\n#ifdef RALINK_ATE\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->ate_ac0_dma_done_task, rtusb_ate_ac0_dma_done_tasklet, (unsigned long)pAd);\n#endif /* RALINK_ATE */\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->hcca_dma_done_task, rtusb_hcca_dma_done_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd);\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);\n#ifdef CONFIG_MULTI_CHANNEL\n\tRTMP_OS_TASKLET_INIT(pAd, &pObj->hcca_null_frame_complete_task, rtusb_hcca_null_frame_done_tasklet, (unsigned long)pAd);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nvoid RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)\n{\n\tPOS_COOKIE pObj;\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\tRTMP_OS_TASKLET_KILL(&pObj->rx_done_task);\n#ifdef RLT_MAC\n\tRTMP_OS_TASKLET_KILL(&pObj->cmd_rsp_event_task);\n#endif /* RLT_MAC */\n\tRTMP_OS_TASKLET_KILL(&pObj->mgmt_dma_done_task);\n\tRTMP_OS_TASKLET_KILL(&pObj->ac0_dma_done_task);\n#ifdef RALINK_ATE\n\tRTMP_OS_TASKLET_KILL(&pObj->ate_ac0_dma_done_task);\n#endif\n\tRTMP_OS_TASKLET_KILL(&pObj->ac1_dma_done_task);\n\tRTMP_OS_TASKLET_KILL(&pObj->ac2_dma_done_task);\n\tRTMP_OS_TASKLET_KILL(&pObj->ac3_dma_done_task);\n\tRTMP_OS_TASKLET_KILL(&pObj->hcca_dma_done_task);\n\tRTMP_OS_TASKLET_KILL(&pObj->tbtt_task);\n\tRTMP_OS_TASKLET_KILL(&pObj->null_frame_complete_task);\n#ifdef CONFIG_MULTI_CHANNEL\n\tRTMP_OS_TASKLET_KILL(&pObj->hcca_null_frame_complete_task);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\tRTMP_OS_TASKLET_KILL(&pObj->pspoll_frame_complete_task);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    MLME kernel thread.\n\nArguments:\n\t*Context\t\t\tthe pAd, driver control block pointer\n\nReturn Value:\n    0\t\t\t\t\tclose the thread\n\nNote:\n========================================================================\n*/\nINT MlmeThread(\n\tIN ULONG Context)\n{\n\tRTMP_ADAPTER *pAd;\n\tRTMP_OS_TASK *pTask;\n\tint status;\n\tstatus = 0;\n\n\tpTask = (RTMP_OS_TASK *)Context;\n\tpAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);\n\tif (pAd == NULL)\n\t\tgoto LabelExit; /* avoid compile warning */\n\n\tRtmpOSTaskCustomize(pTask);\n\n\twhile(!RTMP_OS_TASK_IS_KILLED(pTask))\n\t{\n\t\tif (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\t/* lock the device pointers , need to check if required*/\n\t\t/*down(&(pAd->usbdev_semaphore)); */\n\t\t\n\t\tif (!pAd->PM_FlgSuspend)\n\t\t\tMlmeHandler(pAd);\n\t}\n\n\t/* notify the exit routine that we're actually exiting now \n\t *\n\t * complete()/wait_for_completion() is similar to up()/down(),\n\t * except that complete() is safe in the case where the structure\n\t * is getting deleted in a parallel mode of execution (i.e. just\n\t * after the down() -- that's necessary for the thread-shutdown\n\t * case.\n\t *\n\t * complete_and_exit() goes even further than this -- it is safe in\n\t * the case that the thread of the caller is going away (not just\n\t * the structure) -- this is necessary for the module-remove case.\n\t * This is important in preemption kernels, which transfer the flow\n\t * of execution immediately upon a complete().\n\t */\nLabelExit:\n\tDBGPRINT(RT_DEBUG_TRACE,( \"<---%s\\n\",__FUNCTION__));\n\tRtmpOSTaskNotifyToExit(pTask);\n\treturn 0;\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    USB command kernel thread.\n\nArguments:\n\t*Context\t\t\tthe pAd, driver control block pointer\n\nReturn Value:\n    0\t\t\t\t\tclose the thread\n\nNote:\n========================================================================\n*/\nINT RTUSBCmdThread(\n\tIN ULONG Context)\n{\n\tRTMP_ADAPTER *pAd;\n\tRTMP_OS_TASK *pTask;\n\tint status;\n\tstatus = 0;\n\n\tpTask = (RTMP_OS_TASK *)Context;\n\tpAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);\n\t\n\tif (pAd == NULL)\n\t\treturn 0;\n\t\n\tRtmpOSTaskCustomize(pTask);\n\n\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\tpAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING;\n\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\t\n\twhile (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING)\n\t{\n\t\tif (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)\n\t\t{\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_STOPED)\n\t\t\tbreak;\n\n\t\tif (!pAd->PM_FlgSuspend)\n\t\t\tCMDHandler(pAd);\n\t}\n\n\tif (!pAd->PM_FlgSuspend)\n\t{\t/* Clear the CmdQElements. */\n\t\tCmdQElmt\t*pCmdQElmt = NULL;\n\n\t\tNdisAcquireSpinLock(&pAd->CmdQLock);\n\t\tpAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;\n\t\twhile(pAd->CmdQ.size)\n\t\t{\n\t\t\tRTThreadDequeueCmd(&pAd->CmdQ, &pCmdQElmt);\n\t\t\tif (pCmdQElmt)\n\t\t\t{\n\t\t\t\tif (pCmdQElmt->CmdFromNdis == TRUE)\n\t\t\t\t{\n\t\t\t\t\tif (pCmdQElmt->buffer != NULL)\n\t\t\t\t\t\tos_free_mem(pAd, pCmdQElmt->buffer);\n\t\t\t\t\tos_free_mem(pAd, (PUCHAR)pCmdQElmt);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ((pCmdQElmt->buffer != NULL) && (pCmdQElmt->bufferlength != 0))\n\t\t\t\t\t\tos_free_mem(pAd, pCmdQElmt->buffer);\n\t\t\t\t\tos_free_mem(pAd, (PUCHAR)pCmdQElmt);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tNdisReleaseSpinLock(&pAd->CmdQLock);\n\t}\n\t/* notify the exit routine that we're actually exiting now \n\t *\n\t * complete()/wait_for_completion() is similar to up()/down(),\n\t * except that complete() is safe in the case where the structure\n\t * is getting deleted in a parallel mode of execution (i.e. just\n\t * after the down() -- that's necessary for the thread-shutdown\n\t * case.\n\t *\n\t * complete_and_exit() goes even further than this -- it is safe in\n\t * the case that the thread of the caller is going away (not just\n\t * the structure) -- this is necessary for the module-remove case.\n\t * This is important in preemption kernels, which transfer the flow\n\t * of execution immediately upon a complete().\n\t */\n\tDBGPRINT(RT_DEBUG_TRACE,( \"<---RTUSBCmdThread\\n\"));\n\n\tRtmpOSTaskNotifyToExit(pTask);\n\treturn 0;\n\n}\n\n"
  },
  {
    "path": "src/os/linux/rt_usb_util.c",
    "content": "/****************************************************************************\n\n    Module Name:\n\trt_usb_util.c\n \n    Abstract:\n\tAny utility is used in UTIL module for USB function.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n\n***************************************************************************/\n\n#define RTMP_MODULE_OS\n#define RTMP_MODULE_OS_UTIL\n\n#include \"rtmp_comm.h\"\n#include \"rtmp_osabl.h\"\n#include \"rt_os_util.h\"\n\n#ifdef RTMP_MAC_USB\n#ifdef OS_ABL_SUPPORT\nMODULE_LICENSE(\"GPL\");\n#endif /* OS_ABL_SUPPORT */\n\n#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)\n/*\n========================================================================\nRoutine Description:\n\tDump URB information.\n\nArguments:\n\tpurb_org\t\t- the URB\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid dump_urb(VOID *purb_org)\n{\n\tstruct urb *purb = (struct urb *)purb_org;\n\n\tprintk(\"urb                  :0x%08lx\\n\", (unsigned long)purb);\n\tprintk(\"\\tdev                   :0x%08lx\\n\", (unsigned long)purb->dev);\n\tprintk(\"\\t\\tdev->state          :0x%d\\n\", purb->dev->state);\n\tprintk(\"\\tpipe                  :0x%08x\\n\", purb->pipe);\n\tprintk(\"\\tstatus                :%d\\n\", purb->status);\n\tprintk(\"\\ttransfer_flags        :0x%08x\\n\", purb->transfer_flags);\n\tprintk(\"\\ttransfer_buffer       :0x%08lx\\n\", (unsigned long)purb->transfer_buffer);\n\tprintk(\"\\ttransfer_buffer_length:%d\\n\", purb->transfer_buffer_length);\n\tprintk(\"\\tactual_length         :%d\\n\", purb->actual_length);\n\tprintk(\"\\tsetup_packet          :0x%08lx\\n\", (unsigned long)purb->setup_packet);\n\tprintk(\"\\tstart_frame           :%d\\n\", purb->start_frame);\n\tprintk(\"\\tnumber_of_packets     :%d\\n\", purb->number_of_packets);\n\tprintk(\"\\tinterval              :%d\\n\", purb->interval);\n\tprintk(\"\\terror_count           :%d\\n\", purb->error_count);\n\tprintk(\"\\tcontext               :0x%08lx\\n\", (unsigned long)purb->context);\n\tprintk(\"\\tcomplete              :0x%08lx\\n\\n\", (unsigned long)purb->complete);\n}\n#else\nvoid dump_urb(VOID *purb_org)\n{\n\treturn;\n}\n#endif /* LINUX_VERSION_CODE */\n\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CONFIG_PM\n\n/*\nvoid rausb_autopm_put_interface( void *intf)\n{\n\tusb_autopm_put_interface((struct usb_interface *)intf);\n}\n\nint  rausb_autopm_get_interface( void *intf)\n{\n\treturn usb_autopm_get_interface((struct usb_interface *)intf);\n}\n*/\n\n\n/*\n========================================================================\nRoutine Description:\n\tRTMP_Usb_AutoPM_Put_Interface\n\nArguments:\n\t\n\nReturn Value:\n\t\n\nNote:\n========================================================================\n*/\n\nint rausb_autopm_put_interface (\n\tIN\tVOID\t\t\t*intfsrc)\n{\n\n\tINT\t pm_usage_cnt;\n\tstruct usb_interface\t*intf =(struct usb_interface *)intfsrc;\n\n\n\tusb_autopm_put_interface(intf);\n\n\n\treturn 0;\n}\n\nEXPORT_SYMBOL(rausb_autopm_put_interface);\n\n/*\n========================================================================\nRoutine Description:\n\tRTMP_Usb_AutoPM_Get_Interface\n\nArguments:\n\t\n\nReturn Value: (-1)  error (resume fail )    1 success ( resume success)  2  (do  nothing)\n\t\n\nNote:\n========================================================================\n*/\n\nint rausb_autopm_get_interface (\n\tIN\tVOID\t\t\t*intfsrc)\n{\n\n\tINT\t pm_usage_cnt;\n\tstruct usb_interface\t*intf =(struct usb_interface *)intfsrc;\n\n\n\tusb_autopm_get_interface(intf);\n\n}\n\nEXPORT_SYMBOL(rausb_autopm_get_interface);\n\n#endif /* CONFIG_PM */\n#endif /* CONFIG_STA_SUPPORT */\n\n\n\n#ifdef OS_ABL_SUPPORT\n/*\n========================================================================\nRoutine Description:\n\tRegister a USB driver.\n\nArguments:\n\tnew_driver\t\t- the driver\n\nReturn Value:\n\t0\t\t\t\t- successfully\n\tOtherwise\t\t- fail\n\nNote:\n========================================================================\n*/\nint rausb_register(VOID * new_driver)\n{\n\treturn usb_register((struct usb_driver *)new_driver);\n}\nEXPORT_SYMBOL(rausb_register);\n\n\n/*\n========================================================================\nRoutine Description:\n\tDe-Register a USB driver.\n\nArguments:\n\tnew_driver\t\t- the driver\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid rausb_deregister(VOID * driver)\n{\n\tusb_deregister((struct usb_driver *)driver);\n}\nEXPORT_SYMBOL(rausb_deregister);\n\n\n/*\n========================================================================\nRoutine Description:\n\tCreate a new urb for a USB driver to use.\n\nArguments:\n\tiso_packets\t\t- number of iso packets for this urb\n\nReturn Value:\n\tthe URB\n\nNote:\n========================================================================\n*/\nstruct urb *rausb_alloc_urb(int iso_packets)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\treturn usb_alloc_urb(iso_packets, GFP_ATOMIC);\n#else\n\treturn usb_alloc_urb(iso_packets);\n#endif /* LINUX_VERSION_CODE */\n}\nEXPORT_SYMBOL(rausb_alloc_urb);\n\n\n/*\n========================================================================\nRoutine Description:\n\tFree the memory used by a urb.\n\nArguments:\n\turb\t\t\t\t- the URB\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid rausb_free_urb(VOID *urb)\n{\n\tusb_free_urb((struct urb *)urb);\n}\nEXPORT_SYMBOL(rausb_free_urb);\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n/*\n========================================================================\nRoutine Description:\n\tRelease a use of the usb device structure.\n\nArguments:\n\tdev\t\t\t\t- the USB device\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid rausb_put_dev(VOID *dev)\n{\n\tusb_put_dev((struct usb_device *)dev);\n}\nEXPORT_SYMBOL(rausb_put_dev);\n\n\n/*\n========================================================================\nRoutine Description:\n\tIncrements the reference count of the usb device structure.\n\nArguments:\n\tdev\t\t\t\t- the USB device\n\nReturn Value:\n\tthe device with the incremented reference counter\n\nNote:\n========================================================================\n*/\nstruct usb_device *rausb_get_dev(VOID *dev)\n{\n\treturn usb_get_dev((struct usb_device *)dev);\n}\nEXPORT_SYMBOL(rausb_get_dev);\n#endif /* LINUX_VERSION_CODE */\n\n\n/*\n========================================================================\nRoutine Description:\n\tIssue an asynchronous transfer request for an endpoint.\n\nArguments:\n\turb\t\t\t\t- the URB\n\nReturn Value:\n\t0\t\t\t\t- successfully\n\tOtherwise\t\t- fail\n\nNote:\n========================================================================\n*/\nint rausb_submit_urb(VOID *urb)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\treturn usb_submit_urb((struct urb *)urb, GFP_ATOMIC);\n#else\n\treturn usb_submit_urb((struct urb *)urb);\n#endif /* LINUX_VERSION_CODE */\n}\nEXPORT_SYMBOL(rausb_submit_urb);\n\n/*\n========================================================================\nRoutine Description:\n\tAllocate dma-consistent buffer.\n\nArguments:\n\tdev\t\t\t\t- the USB device\n\tsize\t\t\t- buffer size\n\tdma\t\t\t\t- used to return DMA address of buffer\n\nReturn Value:\n\ta buffer that may be used to perform DMA to the specified device\n\nNote:\n========================================================================\n*/\nvoid *rausb_buffer_alloc(VOID *dev,\n\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\tra_dma_addr_t *dma)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\tdma_addr_t DmaAddr = (dma_addr_t)(*dma);\n\tvoid *buf;\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)\n\tbuf = usb_alloc_coherent(dev, size, GFP_ATOMIC, &DmaAddr);\n#else\n\tbuf = usb_buffer_alloc(dev, size, GFP_ATOMIC, &DmaAddr);\n#endif\n\t*dma = (ra_dma_addr_t)DmaAddr;\n\treturn buf;\n\n#else\n\treturn kmalloc(size, GFP_ATOMIC);\n#endif\n}\nEXPORT_SYMBOL(rausb_buffer_alloc);\n\n\n/*\n========================================================================\nRoutine Description:\n\tFree memory allocated with usb_buffer_alloc.\n\nArguments:\n\tdev\t\t\t\t- the USB device\n\tsize\t\t\t- buffer size\n\taddr\t\t\t- CPU address of buffer\n\tdma\t\t\t\t- used to return DMA address of buffer\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid rausb_buffer_free(VOID *dev,\n\t\t\t\t\t\t\tsize_t size,\n\t\t\t\t\t\t\tvoid *addr,\n\t\t\t\t\t\t\tra_dma_addr_t dma)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)\n\tdma_addr_t DmaAddr = (dma_addr_t)(dma);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)\n\tusb_free_coherent(dev, size, addr, DmaAddr);\n#else\n\tusb_buffer_free(dev, size, addr, DmaAddr);\n#endif\n#else\n\tkfree(addr);\n#endif\n}\nEXPORT_SYMBOL(rausb_buffer_free);\n\n/*\n========================================================================\nRoutine Description:\n\tSend a control message to a device.\n\nArguments:\n\tdev\t\t\t\t- the USB device\n\nReturn Value:\n\t0\t\t\t\t- successfully\n\tOtherwise\t\t- fail\n\nNote:\n========================================================================\n*/\nint rausb_control_msg(VOID *dev,\n\t\t\t\t\t\tunsigned int pipe,\n\t\t\t\t\t\t__u8 request,\n\t\t\t\t\t\t__u8 requesttype,\n\t\t\t\t\t\t__u16 value,\n\t\t\t\t\t\t__u16 index,\n\t\t\t\t\t\tvoid *data,\n\t\t\t\t\t\t__u16 size,\n\t\t\t\t\t\tint timeout)\n{\n\tint ret;\n\n\tret = usb_control_msg((struct usb_device *)dev, pipe, request, requesttype, value, index,\n\t\t\t\t\t\t\tdata, size, timeout);\n\tif (ret == -ENODEV)\n\t\treturn RTMP_USB_CONTROL_MSG_ENODEV;\n\tif (ret < 0)\n\t\treturn RTMP_USB_CONTROL_MSG_FAIL;\n\treturn ret;\n}\nEXPORT_SYMBOL(rausb_control_msg);\n\nunsigned int rausb_sndctrlpipe(VOID *dev, ULONG address)\n{\n\treturn usb_sndctrlpipe(dev, address);\n}\nEXPORT_SYMBOL(rausb_sndctrlpipe);\n\nunsigned int rausb_rcvctrlpipe(VOID *dev, ULONG address)\n{\n\treturn usb_rcvctrlpipe(dev, address);\n}\nEXPORT_SYMBOL(rausb_rcvctrlpipe);\n\n\n/*\n========================================================================\nRoutine Description:\n\tCancel a transfer request and wait for it to finish.\n\nArguments:\n\turb\t\t\t\t- the URB\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid rausb_kill_urb(VOID *urb)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)\n\tusb_kill_urb((struct urb *)urb);\n#else\n\tusb_unlink_urb((struct urb *)urb);\n#endif /* LINUX_VERSION_CODE */\n}\nEXPORT_SYMBOL(rausb_kill_urb);\n\n#endif /* OS_ABL_SUPPORT */\n\n\nVOID RtmpOsUsbEmptyUrbCheck(\n\tIN\tVOID\t\t\t\t**ppWait,\n\tIN\tNDIS_SPIN_LOCK\t\t*pBulkInLock,\n\tIN\tUCHAR\t\t\t\t*pPendingRx)\n{\n\tUINT32 i = 0;\n\tDECLARE_WAIT_QUEUE_HEAD(unlink_wakeup); \n\tDECLARE_WAITQUEUE(wait, current);\n\n\n\t/* ensure there are no more active urbs. */\n\tadd_wait_queue (&unlink_wakeup, &wait);\n\t*ppWait = &unlink_wakeup;\n\n\t/* maybe wait for deletions to finish. */\n\ti = 0;\n\t/*while((i < 25) && atomic_read(&pAd->PendingRx) > 0) */\n\twhile(i < 25)\n\t{\n/*\t\tunsigned long IrqFlags; */\n\n\t\tRTMP_SEM_LOCK(pBulkInLock);\n\t\tif (*pPendingRx == 0)\n\t\t{\n\t\t\tRTMP_SEM_UNLOCK(pBulkInLock);\n\t\t\tbreak;\n\t\t}\n\t\tRTMP_SEM_UNLOCK(pBulkInLock);\n\t\t\n#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)\n\t\tmsleep(UNLINK_TIMEOUT_MS);\t/*Time in millisecond */\n#else\n\t\tRTMPusecDelay(UNLINK_TIMEOUT_MS*1000);\t/*Time in microsecond */\n#endif\n\t\ti++;\n\t}\n\t*ppWait = NULL;\n\tremove_wait_queue (&unlink_wakeup, &wait); \n}\n\n\nVOID\tRtmpOsUsbInitHTTxDesc(\n\tIN\tVOID\t\t\t*pUrbSrc,\n\tIN\tVOID\t\t\t*pUsb_Dev,\n\tIN\tUINT\t\t\tBulkOutEpAddr,\n\tIN\tPUCHAR\t\t\tpSrc,\n\tIN\tULONG\t\t\tBulkOutSize,\n\tIN\tUSB_COMPLETE_HANDLER\tFunc,\n\tIN\tVOID\t\t\t*pTxContext,\n\tIN\tra_dma_addr_t\t\tTransferDma)\n{\n\tPURB pUrb = (PURB)pUrbSrc;\n\tdma_addr_t DmaAddr = (dma_addr_t)(TransferDma);\n\n\n\tASSERT(pUrb);\n\n\t/*Initialize a tx bulk urb */\n\tRTUSB_FILL_HTTX_BULK_URB(pUrb,\n\t\t\t\t\t\tpUsb_Dev,\n\t\t\t\t\t\tBulkOutEpAddr,\n\t\t\t\t\t\tpSrc,\n\t\t\t\t\t\tBulkOutSize,\n\t\t\t\t\t\t(usb_complete_t)Func,\n\t\t\t\t\t\tpTxContext,\n\t\t\t\t\t\tDmaAddr);\n}\n\n\nVOID\tRtmpOsUsbInitRxDesc(\n\tIN\tVOID\t\t\t*pUrbSrc,\n\tIN\tVOID\t\t\t*pUsb_Dev,\n\tIN\tUINT\t\t\tBulkInEpAddr,\n\tIN\tUCHAR\t\t\t*pTransferBuffer,\n\tIN\tUINT32\t\t\tBufSize,\n\tIN\tUSB_COMPLETE_HANDLER\tFunc,\n\tIN\tVOID\t\t\t*pRxContext,\n\tIN\tra_dma_addr_t\t\tTransferDma)\n{\n\tPURB pUrb = (PURB)pUrbSrc;\n\tdma_addr_t DmaAddr = (dma_addr_t)(TransferDma);\n\n\n\tASSERT(pUrb);\n\n\t/*Initialize a rx bulk urb */\n\tRTUSB_FILL_RX_BULK_URB(pUrb,\n\t\t\t\t\t\tpUsb_Dev,\n\t\t\t\t\t\tBulkInEpAddr,\n\t\t\t\t\t\tpTransferBuffer,\n\t\t\t\t\t\tBufSize,\n\t\t\t\t\t\t(usb_complete_t)Func,\n\t\t\t\t\t\tpRxContext,\n\t\t\t\t\t\tDmaAddr);\n}\n\n\nVOID *RtmpOsUsbContextGet(\n\tIN\tVOID\t\t\t*pUrb)\n{\n\treturn ((purbb_t)pUrb)->rtusb_urb_context;\n}\n\n\nNTSTATUS RtmpOsUsbStatusGet(\n\tIN\tVOID\t\t\t*pUrb)\n{\n\treturn ((purbb_t)pUrb)->rtusb_urb_status;\n}\n\n\nVOID RtmpOsUsbDmaMapping(\n\tIN\tVOID\t\t\t*pUrb)\n{\n\tRTUSB_URB_DMA_MAPPING(((purbb_t)pUrb));\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet the data pointer from the URB.\n\nArguments:\n\tpUrb\t\t\t- USB URB\n\nReturn Value:\n\tthe data pointer\n\nNote:\n========================================================================\n*/\nVOID *RtmpOsUsbUrbDataGet(\n\tIN\tVOID\t\t\t\t\t*pUrb)\n{\n\treturn RTMP_USB_URB_DATA_GET(pUrb);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet the status from the URB.\n\nArguments:\n\tpUrb\t\t\t- USB URB\n\nReturn Value:\n\tthe status\n\nNote:\n========================================================================\n*/\nNTSTATUS RtmpOsUsbUrbStatusGet(\n\tIN\tVOID\t\t\t\t\t*pUrb)\n{\n\treturn RTMP_USB_URB_STATUS_GET(pUrb);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet the data length from the URB.\n\nArguments:\n\tpUrb\t\t\t- USB URB\n\nReturn Value:\n\tthe data length\n\nNote:\n========================================================================\n*/\nULONG RtmpOsUsbUrbLenGet(\n\tIN\tVOID\t\t\t\t\t*pUrb)\n{\n\treturn RTMP_USB_URB_LEN_GET(pUrb);\n}\n\n/*\n========================================================================\nRoutine Description:\n\tGet USB Vendor ID.\n\nArguments:\n\tpUsbDev\t\t\t- the usb device\n\nReturn Value:\n\tthe name\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsGetUsbDevVendorID(IN VOID *pUsbDev) {\n\treturn ((struct usb_device *) pUsbDev)->descriptor.idVendor;\n}\n\n/*\n========================================================================\nRoutine Description:\n\tGet USB Product ID.\n\nArguments:\n\tpUsbDev\t\t\t- the usb device\n\nReturn Value:\n\tthe name\n\nNote:\n========================================================================\n*/\nUINT32 RtmpOsGetUsbDevProductID(IN VOID *pUsbDev) {\n\treturn ((struct usb_device *) pUsbDev)->descriptor.idProduct;\n}\n\n#endif /* RTMP_MAC_USB */\n\n"
  },
  {
    "path": "src/os/linux/sta_ioctl.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    sta_ioctl.c\n\n    Abstract:\n    IOCTL related subroutines\n\n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Rory Chen   01-03-2003    created\n\tRory Chen   02-14-2005    modify to support RT61\n*/\n\n#define RTMP_MODULE_OS\n\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n/*#include\t\"rt_config.h\" */\n\n#ifdef DBG\nextern ULONG RTDebugLevel;\nextern ULONG RTDebugFunc;\n#endif\n\n#define NR_WEP_KEYS \t\t\t\t4\n#define WEP_SMALL_KEY_LEN \t\t\t(40/8)\n#define WEP_LARGE_KEY_LEN \t\t\t(104/8)\n\n#define GROUP_KEY_NO                4\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)\n#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E)\t\tiwe_stream_add_event(_A, _B, _C, _D, _E)\n#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E)\t\tiwe_stream_add_point(_A, _B, _C, _D, _E)\n#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F)\tiwe_stream_add_value(_A, _B, _C, _D, _E, _F)\n#else\n#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E)\t\tiwe_stream_add_event(_B, _C, _D, _E)\n#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E)\t\tiwe_stream_add_point(_B, _C, _D, _E)\n#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F)\tiwe_stream_add_value(_B, _C, _D, _E, _F)\n#endif\n\nextern UCHAR    CipherWpa2Template[];\n\ntypedef struct GNU_PACKED _RT_VERSION_INFO{\n    UCHAR       DriverVersionW;\n    UCHAR       DriverVersionX;\n    UCHAR       DriverVersionY;\n    UCHAR       DriverVersionZ;\n    UINT        DriverBuildYear;\n    UINT        DriverBuildMonth;\n    UINT        DriverBuildDay;\n} RT_VERSION_INFO, *PRT_VERSION_INFO;\n\nstruct iw_priv_args privtab[] = {\n{ RTPRIV_IOCTL_SET, \n  IW_PRIV_TYPE_CHAR | 1024, 0,\n  \"set\"},\n\n{ RTPRIV_IOCTL_SHOW, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,\n  \"\"},\n/* --- sub-ioctls definitions --- */   \n#ifdef MAT_SUPPORT\n\t{ SHOW_IPV4_MAT_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"ipv4_matinfo\" },\n\t{ SHOW_IPV6_MAT_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"ipv6_matinfo\" },\n\t{ SHOW_ETH_CLONE_MAC,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"cloneMAC\" },\n#endif /* MAT_SUPPORT */\n    { SHOW_CONN_STATUS,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"connStatus\" },\n\t{ SHOW_DRVIER_VERION,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"driverVer\" },\n    { SHOW_BA_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"bainfo\" },\n\t{ SHOW_DESC_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"descinfo\" },\n    { RAIO_OFF,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"radio_off\" },\n\t{ RAIO_ON,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"radio_on\" },\n#ifdef QOS_DLS_SUPPORT\n\t{ SHOW_DLS_ENTRY_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"dlsentryinfo\" },\n#endif /* QOS_DLS_SUPPORT */\n\t{ SHOW_CFG_VALUE,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"show\" },\n\t{ SHOW_ADHOC_ENTRY_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"adhocEntry\" },\n#ifdef DOT11Z_TDLS_SUPPORT\n\t{ SHOW_TDLS_ENTRY_INFO,\n\t  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"tdlsentryinfo\" },\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t{SHOW_DEV_INFO,\n\tIW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"devinfo\"},\n\t{SHOW_STA_INFO,\n\tIW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"stainfo\"},\n/* --- sub-ioctls relations --- */\n\n#ifdef DBG\n{ RTPRIV_IOCTL_BBP,\n  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,\n  \"bbp\"},\n{ RTPRIV_IOCTL_MAC,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"mac\"},  \n#if defined(RLT_RF) || defined(RTMP_RF_RW_SUPPORT)\n{ RTPRIV_IOCTL_RF,\n  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,\n  \"rf\"},\n#endif /* RTMP_RF_RW_SUPPORT */\n{ RTPRIV_IOCTL_E2P,\n  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,\n  \"e2p\"},\n#endif  /* DBG */\n\n{ RTPRIV_IOCTL_STATISTICS,\n  0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,\n  \"stat\"}, \n{ RTPRIV_IOCTL_GSITESURVEY,\n  0, IW_PRIV_TYPE_CHAR | 1024,\n  \"get_site_survey\"},\n\n#ifdef WSC_STA_SUPPORT\n{ RTPRIV_IOCTL_SET_WSC_PROFILE_U32_ITEM,\n  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"\" },\n{ RTPRIV_IOCTL_SET_WSC_PROFILE_U32_ITEM,\n  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, \"\" },\n{ RTPRIV_IOCTL_SET_WSC_PROFILE_STRING_ITEM,\n  IW_PRIV_TYPE_CHAR | 128, 0, \"\" },\n/* --- sub-ioctls definitions --- */    \n\t{ WSC_CREDENTIAL_COUNT,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wsc_cred_count\" },\n\t{ WSC_CREDENTIAL_SSID,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_cred_ssid\" },\n\t{ WSC_CREDENTIAL_AUTH_MODE,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_cred_auth\" },\n\t{ WSC_CREDENTIAL_ENCR_TYPE,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_cred_encr\" },\n\t{ WSC_CREDENTIAL_KEY_INDEX,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_cred_keyIdx\" },\n\t{ WSC_CREDENTIAL_KEY,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_cred_key\" },\n\t{ WSC_CREDENTIAL_MAC,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_cred_mac\" },\t\n\t{ WSC_SET_DRIVER_CONNECT_BY_CREDENTIAL_IDX,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wsc_conn_by_idx\" },\n\t{ WSC_SET_DRIVER_AUTO_CONNECT,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wsc_auto_conn\" },\n\t{ WSC_SET_CONF_MODE,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wsc_conf_mode\" },\n\t{ WSC_SET_MODE,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wsc_mode\" },\n\t{ WSC_SET_PIN,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_pin\" },\n\t{ WSC_SET_SSID,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_ssid\" },\n\t{ WSC_SET_BSSID,\n\t  IW_PRIV_TYPE_CHAR | 128, 0, \"wsc_bssid\" },\n\t{ WSC_START,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, \"wsc_start\" },\n\t{ WSC_STOP,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, \"wsc_stop\" },\n    { WSC_GEN_PIN_CODE,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, \"wsc_gen_pincode\" },\n\t{ WSC_AP_BAND,\n\t  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wsc_ap_band\" },\n/* --- sub-ioctls relations --- */\n#endif /* WSC_STA_SUPPORT */\n};\n\nextern INT32 ralinkrate[];\nextern UINT32 RT_RateSize;\n\n\n\n\n/*\nThis is required for LinEX2004/kernel2.6.7 to provide iwlist scanning function\n*/\n\nint\nrt_ioctl_giwname(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   char *name, char *extra)\n{\n\tstrncpy(name, \"Ralink STA\", IFNAMSIZ);\n\treturn 0;\n}\n\nint rt_ioctl_siwfreq(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_freq *freq, char *extra)\n{\n\tVOID *pAd = NULL;\n/*\tint \tchan = -1; */\n\tRT_CMD_STA_IOCTL_FREQ IoctlFreq, *pIoctlFreq = &IoctlFreq;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;   \n    }\n\n\n\tif (freq->e > 1)\n\t\treturn -EINVAL;\n\n    \n\tpIoctlFreq->m = freq->m;\n\tpIoctlFreq->e = freq->e;\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWFREQ, 0,\n\t\t\t\t\t\t\tpIoctlFreq, 0, RT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t\treturn -EINVAL;\n\n\treturn 0;\n}\n\n\nint rt_ioctl_giwfreq(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   struct iw_freq *freq, char *extra)\n{\n\tVOID *pAd = NULL;\n/*\tUCHAR ch; */\n\tULONG\tm = 2412000;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\treturn -ENETDOWN;   \n\t}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWFREQ, 0,\n\t\t\t\t\t\t&m, RT_DEV_PRIV_FLAGS_GET(dev), RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tfreq->m = m * 100;\n\tfreq->e = 1;\n\tfreq->i = 0;\n\t\n\treturn 0;\n}\n\n\nint rt_ioctl_siwmode(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   __u32 *mode, char *extra)\n{\n\tVOID *pAd = NULL;\n\tLONG Mode;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n    \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n       \treturn -ENETDOWN;   \n    }\n\n\n\tif (*mode == IW_MODE_ADHOC)\n\t\tMode = RTMP_CMD_STA_MODE_ADHOC;\n\telse if (*mode == IW_MODE_INFRA)\n\t\tMode = RTMP_CMD_STA_MODE_INFRA;\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20))\n\telse if (*mode == IW_MODE_MONITOR)\n\t\tMode = RTMP_CMD_STA_MODE_MONITOR;\n#endif /* LINUX_VERSION_CODE */\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"===>rt_ioctl_siwmode::SIOCSIWMODE (unknown %d)\\n\", *mode));\n\t\treturn -EINVAL;\n\t}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWMODE, 0,\n\t\t\t\t\t\t\tNULL, Mode, RT_DEV_PRIV_FLAGS_GET(dev));\n\treturn 0;\n}\n\n\nint rt_ioctl_giwmode(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   __u32 *mode, char *extra)\n{\n\tVOID *pAd = NULL;\n\tULONG Mode;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;   \n    }\n\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWMODE, 0,\n\t\t\t\t\t\t&Mode, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tif (Mode == RTMP_CMD_STA_MODE_ADHOC)\n\t\t*mode = IW_MODE_ADHOC;\n\telse if (Mode == RTMP_CMD_STA_MODE_INFRA)\n\t\t*mode = IW_MODE_INFRA;\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20))\n\telse if (Mode == RTMP_CMD_STA_MODE_MONITOR)\n\t\t*mode = IW_MODE_MONITOR;\n#endif /* LINUX_VERSION_CODE */\n\telse\n\t\t*mode = IW_MODE_AUTO;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==>rt_ioctl_giwmode(mode=%d)\\n\", *mode));\n\treturn 0;\n}\n\nint rt_ioctl_siwsens(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   char *name, char *extra)\n{\n\tVOID *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    \tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    \t{\n        \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        \treturn -ENETDOWN;   \n    \t}\n\n\treturn 0;\n}\n\nint rt_ioctl_giwsens(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   char *name, char *extra)\n{\n\treturn 0;\n}\n\nint rt_ioctl_giwrange(struct net_device *dev,\n\t\t   struct iw_request_info *info,\n\t\t   struct iw_point *data, char *extra)\n{\n\tVOID *pAd = NULL;\n\tstruct iw_range *range = (struct iw_range *) extra;\n\tu16 val;\n\tint i;\n\tULONG Mode, ChannelListNum;\n\tUCHAR *pChannel;\n\tUINT32 *pFreq;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n#ifndef RT_CFG80211_SUPPORT\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n    \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE ,(\"===>rt_ioctl_giwrange\\n\"));\n\tdata->length = sizeof(struct iw_range);\n\tmemset(range, 0, sizeof(struct iw_range));\n\n\trange->txpower_capa = IW_TXPOW_DBM;\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWMODE, 0,\n\t\t\t\t\t\t&Mode, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n/*\tif (INFRA_ON(pAd)||ADHOC_ON(pAd)) */\n\tif ((Mode == RTMP_CMD_STA_MODE_INFRA) || (Mode == RTMP_CMD_STA_MODE_ADHOC))\n\t{\n\t\trange->min_pmp = 1 * 1024;\n\t\trange->max_pmp = 65535 * 1024;\n\t\trange->min_pmt = 1 * 1024;\n\t\trange->max_pmt = 1000 * 1024;\n\t\trange->pmp_flags = IW_POWER_PERIOD;\n\t\trange->pmt_flags = IW_POWER_TIMEOUT;\n\t\trange->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT |\n\t\t\tIW_POWER_UNICAST_R | IW_POWER_ALL_R;\n\t}\n\n\trange->we_version_compiled = WIRELESS_EXT;\n\trange->we_version_source = 14;\n\n\trange->retry_capa = IW_RETRY_LIMIT;\n\trange->retry_flags = IW_RETRY_LIMIT;\n\trange->min_retry = 0;\n\trange->max_retry = 255;\n\n/*\trange->num_channels =  pAd->ChannelListNum; */\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET, 0,\n\t\t\t\t\t\t&ChannelListNum, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\trange->num_channels = ChannelListNum;\n\n\tos_alloc_mem(NULL, (UCHAR **)&pChannel, sizeof(UCHAR)*ChannelListNum);\n\tif (pChannel == NULL)\n\t\treturn -ENOMEM;\n\tos_alloc_mem(NULL, (UCHAR **)&pFreq, sizeof(UINT32)*ChannelListNum);\n\tif (pFreq == NULL)\n\t{\n\t\tos_free_mem(NULL, pChannel);\n\t\treturn -ENOMEM;\n\t}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_CHAN_LIST_GET, 0,\n\t\t\t\t\t\tpChannel, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_FREQ_LIST_GET, 0,\n\t\t\t\t\t\tpFreq, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tval = 0;\n\tfor (i = 1; i <= range->num_channels; i++) \n\t{\n/*\t\tu32 m = 2412000; */\n\t\trange->freq[val].i = pChannel[i-1];\n/*\t\tMAP_CHANNEL_ID_TO_KHZ(pAd->ChannelList[i-1].Channel, m); */\n\t\trange->freq[val].m = pFreq[i-1] * 100; /* OS_HZ */\n\t\t\n\t\trange->freq[val].e = 1;\n\t\tval++;\n\t\tif (val == IW_MAX_FREQUENCIES)\n\t\t\tbreak;\n\t}\n\tos_free_mem(NULL, pChannel);\n\tos_free_mem(NULL, pFreq);\n\n\trange->num_frequency = val;\n\n\trange->max_qual.qual = 100; /* what is correct max? This was not\n\t\t\t\t\t* documented exactly. At least\n\t\t\t\t\t* 69 has been observed. */\n\trange->max_qual.level = 0; /* dB */\n\trange->max_qual.noise = 0; /* dB */\n\n\t/* What would be suitable values for \"average/typical\" qual? */\n\trange->avg_qual.qual = 20;\n\trange->avg_qual.level = -60;\n\trange->avg_qual.noise = -95;\n\trange->sensitivity = 3;\n\n\trange->max_encoding_tokens = NR_WEP_KEYS;\n\trange->num_encoding_sizes = 2;\n\trange->encoding_size[0] = 5;\n\trange->encoding_size[1] = 13;\n\n\trange->min_rts = 0;\n\trange->max_rts = 2347;\n\trange->min_frag = 256;\n\trange->max_frag = 2346;\n\n#if WIRELESS_EXT > 17\n\t/* IW_ENC_CAPA_* bit field */\n\trange->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | \n\t\t\t\t\tIW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;\n#endif\n\n\treturn 0;\n}\n\nint rt_ioctl_giwpriv(\t\n\tstruct net_device *dev,\n\tstruct iw_request_info *info,\n\tstruct iw_point *dwrq,\tchar *extra)\n{\n#ifdef ANDROID_SUPPORT\n\tVOID *pAd = NULL;\n\tint len = 0;\n\tchar *ext;\n\tint ret = 0;\n\n\tlen = dwrq->length;\n\text = kmalloc(len, /*GFP_KERNEL*/GFP_ATOMIC);\n\tif(!ext)\t\n\t\treturn -ENOMEM;\n\n\tif (copy_from_user(ext, dwrq->pointer, len))\n\t{\n\t\tkfree(ext);\n\t\tprintk(\"andriod_handle_private   copy_from_user\\n\");\n\t\treturn -EFAULT;\n\t}\n\text[len-1] = 0x00;\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif(strcasecmp(ext,\"START\") == 0)\n\t{\n\t\t//Turn on Wi-Fi hardware\n\t\t//OK if successful\n\t\tprintk(\"sSTART Turn on Wi-Fi hardware \\n\");\n\t\tkfree(ext);\n\t\treturn -1;\n\t}\n\telse if(strcasecmp(ext,\"STOP\") == 0)\n\t{\n\t\tprintk(\"STOP Turn off  Wi-Fi hardware \\n\");\n\t\tkfree(ext);\n\t\treturn -1;\n\t}\n\telse if(strcasecmp(ext,\"RSSI\") == 0)\n\t{\n\t\tCHAR AvgRssi0;\n\t\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWPRIVRSSI,\n\t\t\t\t\t\t\t\t0, &AvgRssi0, 0, dev->priv_flags);\n\t\tsnprintf(ext, min(dwrq->length, (UINT16)(strlen(ext)+1)),\"rssi %d\", AvgRssi0);\n\t}\n\telse if(strcasecmp(ext,\"LINKSPEED\") == 0)\n\t{\n\t\tsnprintf(ext, min(dwrq->length, (UINT16)(strlen(ext)+1)),\"LINKSPEED %d\", 150);\n\t}\n\telse if(strcasecmp(ext,\"MACADDR\") == 0)\n\t{\n\t\tUCHAR mac[6];\n\t\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIFHWADDR,\n\t\t\t\t\t\t\t\t0, mac, 0, dev->priv_flags);\n\t\tsnprintf(ext, min(dwrq->length, (UINT16)(strlen(ext)+1)),\n\t\t\t\"MACADDR = %02x.%02x.%02x.%02x.%02x.%02x\",\n\t\t\tmac[0], mac[1], mac[2],\n\t\t\tmac[3], mac[4], mac[5]);\n\t}\n\telse if(strcasecmp(ext,\"SCAN-ACTIVE\") == 0)\n\t{\n\t\tsnprintf(ext, min(dwrq->length, (UINT16)(strlen(ext)+1)),\"OK\");\n\t}\n\telse if(strcasecmp(ext,\"SCAN-PASSIVE\") == 0)\n\t{\n\t\tsnprintf(ext, min(dwrq->length, (UINT16)(strlen(ext)+1)),\"OK\");\n\t}\n\telse\n\t{\n\t\tgoto FREE_EXT;\n\t}\n\n\tif (copy_to_user(dwrq->pointer, ext, min(dwrq->length, (UINT16)(strlen(ext)+1)) ) )\n\t\tret = -EFAULT;\n\nFREE_EXT:\n\n\tkfree(ext);\n\n\treturn ret;\n#else\n\treturn 0;\n#endif\n}\n\n\nint rt_ioctl_siwap(struct net_device *dev,\n\t\t      struct iw_request_info *info,\n\t\t      struct sockaddr *ap_addr, char *extra)\n{\n\tVOID *pAd = NULL;\n    UCHAR Bssid[6];\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n       \treturn -ENETDOWN;   \n    }\n\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWAP, 0,\n\t\t\t\t\t(VOID *)(ap_addr->sa_data), 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n    memcpy(Bssid, ap_addr->sa_data, MAC_ADDR_LEN);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n        Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));\n\n\treturn 0;\n}\n\nint rt_ioctl_giwap(struct net_device *dev,\n\t\t      struct iw_request_info *info,\n\t\t      struct sockaddr *ap_addr, char *extra)\n{\n\tVOID *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;   \n    }\n\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWAP, 0,\n\t\t\t\t\t\t(VOID *)(ap_addr->sa_data), 0,\n\t\t\t\t\t\tRT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCGIWAP(=EMPTY)\\n\"));\n\t\treturn -ENOTCONN;\n\t}\n\tap_addr->sa_family = ARPHRD_ETHER;\n\n\treturn 0;\n}\n\n/*\n * Units are in db above the noise floor. That means the\n * rssi values reported in the tx/rx descriptors in the\n * driver are the SNR expressed in db.\n *\n * If you assume that the noise floor is -95, which is an\n * excellent assumption 99.5 % of the time, then you can\n * derive the absolute signal level (i.e. -95 + rssi). \n * There are some other slight factors to take into account\n * depending on whether the rssi measurement is from 11b,\n * 11g, or 11a.   These differences are at most 2db and\n * can be documented.\n *\n * NB: various calculations are based on the orinoco/wavelan\n *     drivers for compatibility\n */\nstatic void set_quality(VOID *pAd,\n                        struct iw_quality *iq, \n\t\t\t\t\t\tRT_CMD_STA_IOCTL_BSS *pBss)\n/*                        PBSS_ENTRY pBssEntry) */\n{\n\n\tiq->qual = pBss->ChannelQuality;\n\tiq->level = (__u8)(pBss->Rssi);\n\tiq->noise = pBss->Noise;\n\n/*    iq->updated = pAd->iw_stats.qual.updated; */\n/*\tiq->updated = ((struct iw_statistics *)(pAd->iw_stats))->qual.updated; */\n\tiq->updated = 1;     /* Flags to know if updated */\n\n#if WIRELESS_EXT >= 17\n\tiq->updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_UPDATED;\n#endif\n\n#if WIRELESS_EXT >= 19\n\tiq->updated |= IW_QUAL_DBM;\t/* Level + Noise are dBm */\n#endif\n}\n\nint rt_ioctl_iwaplist(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *data, char *extra)\n{\n \tVOID *pAd = NULL;\t\n\n/*\tstruct sockaddr addr[IW_MAX_AP]; */\n\tstruct sockaddr *addr = NULL;\n\tstruct iw_quality qual[IW_MAX_AP];\n\tint i;\n\tRT_CMD_STA_IOCTL_BSS_LIST BssList, *pBssList = &BssList;\n\tRT_CMD_STA_IOCTL_BSS *pList;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n   \t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\tdata->length = 0;\n\t\treturn 0;\n        /*return -ENETDOWN; */\n\t}\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&(pBssList->pList), sizeof(RT_CMD_STA_IOCTL_BSS_LIST) * IW_MAX_AP);\n\tif (pBssList->pList == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn 0;\n\t}\n\n\tos_alloc_mem(NULL, (UCHAR **)&addr, sizeof(struct sockaddr) * IW_MAX_AP);\n\tif (addr == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tos_free_mem(NULL, pBssList);\n\t\treturn 0;\n\t}\n\n\tpBssList->MaxNum = IW_MAX_AP;\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_BSS_LIST_GET, 0,\n\t\t\t\t\t\tpBssList, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tfor (i = 0; i <IW_MAX_AP ; i++)\n\t{\n\t\tif (i >=  pBssList->BssNum) /*pAd->ScanTab.BssNr) */\n\t\t\tbreak;\n\t\taddr[i].sa_family = ARPHRD_ETHER;\n\t\tpList = (pBssList->pList) + i;\n\t\tmemcpy(addr[i].sa_data, pList->Bssid, MAC_ADDR_LEN);\n\t\tset_quality(pAd, &qual[i], pList); /*&pAd->ScanTab.BssEntry[i]); */\n\t}\n\tdata->length = i;\n\tmemcpy(extra, &addr, i*sizeof(addr[0]));\n\tdata->flags = 1;\t\t/* signal quality present (sort of) */\n\tmemcpy(extra + i*sizeof(addr[0]), &qual, i*sizeof(qual[i]));\n\n\tos_free_mem(NULL, addr);\n\tos_free_mem(NULL, pBssList->pList);\n\treturn 0;\n}\n\n#if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT)\nint rt_ioctl_siwscan(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wreq, char *extra)\n{\n\tVOID *pAd = NULL;\n\tint Status = NDIS_STATUS_SUCCESS;\n\tRT_CMD_STA_IOCTL_SCAN IoctlScan, *pIoctlScan = &IoctlScan;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tstruct iw_scan_req *req = (struct iw_scan_req *)extra;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n/* because android will set scan and get scan when interface down */\n#ifndef ANDROID_SUPPORT\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\treturn -ENETDOWN;   \n\t}\n#endif /* ANDROID_SUPPORT */\n\n\n\tmemset(pIoctlScan, 0, sizeof(RT_CMD_STA_IOCTL_SCAN));\n#ifdef WPA_SUPPLICANT_SUPPORT\n#if WIRELESS_EXT > 17\n\tpIoctlScan->FlgScanThisSsid = (wreq->data.length == sizeof(struct iw_scan_req) &&\n\t\t\t\t\t\t\t\t\twreq->data.flags & IW_SCAN_THIS_ESSID);\n\tpIoctlScan->SsidLen = req->essid_len;\n\tpIoctlScan->pSsid = (CHAR *)(req->essid);\n#endif\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWSCAN, 0,\n\t\t\t\t\t\t\tpIoctlScan, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tRT_CMD_STATUS_TRANSLATE(pIoctlScan->Status);\n\tStatus = pIoctlScan->Status;\n\treturn Status;\n}\n\nint rt_ioctl_giwscan(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *data, char *extra)\n{\n\tVOID *pAd = NULL;\n\tint i=0, status = 0;\n\tPSTRING current_ev = extra, previous_ev = extra;\n\tPSTRING end_buf;\n\tPSTRING current_val;\n\tSTRING custom[MAX_CUSTOM_LEN] = {0};\n#ifndef IWEVGENIE\n\tunsigned char idx;\n#endif /* IWEVGENIE */\n\tstruct iw_event iwe;\n\tRT_CMD_STA_IOCTL_SCAN_TABLE IoctlScan, *pIoctlScan = &IoctlScan;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n/* because android will set scan and get scan when interface down */\n#ifndef ANDROID_SUPPORT\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n#endif /* ANDROID_SUPPORT */\n\n\n\n\tpIoctlScan->priv_flags = RT_DEV_PRIV_FLAGS_GET(dev);\n\tpIoctlScan->pBssTable = NULL;\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWSCAN, 0,\n\t\t\t\t\t\t\tpIoctlScan, 0,\n\t\t\t\t\t\t\tRT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t{\n\t\tstatus = -EINVAL;\n\t\tgoto go_out;\n\t}\n\n\n\tif (pIoctlScan->BssNr == 0)\n\t{\n\t\tdata->length = 0;\n\t\tstatus = 0;\n\t\tgoto go_out;\n\t}\n\n#if WIRELESS_EXT >= 17\n    if (data->length > 0)\n        end_buf = extra + data->length;\n    else\n        end_buf = extra + IW_SCAN_MAX_DATA;\n#else\n    end_buf = extra + IW_SCAN_MAX_DATA;\n#endif\n\n\tfor (i = 0; i < pIoctlScan->BssNr; i++) \n\t{\n\t\tif (current_ev >= end_buf)\n        {\n#if WIRELESS_EXT >= 17\n\t\t\tstatus = -E2BIG;\n\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n        }\n\t\t\n\t\t/*MAC address */\n\t\t/*================================ */\n\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = SIOCGIWAP;\n\t\tiwe.u.ap_addr.sa_family = ARPHRD_ETHER;\n\t\t\t\tmemcpy(iwe.u.ap_addr.sa_data, &pIoctlScan->pBssTable[i].Bssid, ETH_ALEN);\n\n        previous_ev = current_ev;\n\t\tcurrent_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);\n        if (current_ev == previous_ev)\n        {\n#if WIRELESS_EXT >= 17\n            status = -E2BIG;\n\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n        }\n\n\t\t/* \n\t\tProtocol:\n\t\t\tit will show scanned AP's WirelessMode .\n\t\t\tit might be\n\t\t\t\t\t802.11a\n\t\t\t\t\t802.11a/n\n\t\t\t\t\t802.11g/n\n\t\t\t\t\t802.11b/g/n\n\t\t\t\t\t802.11g\n\t\t\t\t\t802.11b/g\n\t\t*/\n\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = SIOCGIWNAME;\n\n\n\t{\n\t\tRT_CMD_STA_IOCTL_BSS_TABLE *pBssEntry=&pIoctlScan->pBssTable[i];\n\t\tBOOLEAN isGonly=FALSE;\n\t\tint rateCnt=0;\n\n\t\tif (pBssEntry->Channel>14)\n\t\t{\n\t\t\tif (pBssEntry->HtCapabilityLen!=0)\n\t\t\t\tstrcpy(iwe.u.name,\"11a/n\");\n\t\t\telse\t\n\t\t\t\tstrcpy(iwe.u.name,\"11a\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*\n\t\t\t\tif one of non B mode rate is set supported rate . it mean G only. \n\t\t\t*/\n\t\t\tfor (rateCnt=0;rateCnt<pBssEntry->SupRateLen;rateCnt++)\n\t\t\t{\t\t\t\t\t\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t\t6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate , it mean G only. \n\t\t\t\t*/\n\t\t\t\tif (pBssEntry->SupRate[rateCnt]==140 || pBssEntry->SupRate[rateCnt]==146 || pBssEntry->SupRate[rateCnt]>=152)\n\t\t\t\t\tisGonly=TRUE;\n\t\t\t}\n\n\t\t\tfor (rateCnt=0;rateCnt<pBssEntry->ExtRateLen;rateCnt++)\n\t\t\t{\n\t\t\t\tif (pBssEntry->ExtRate[rateCnt]==140 || pBssEntry->ExtRate[rateCnt]==146 || pBssEntry->ExtRate[rateCnt]>=152)\n\t\t\t\t\tisGonly=TRUE;\n\t\t\t}\t\t\n\t\t\t\n\t\t\t\n\t\t\tif (pBssEntry->HtCapabilityLen!=0)\n\t\t\t{\n\t\t\t\tif (isGonly==TRUE)\n\t\t\t\t\tstrcpy(iwe.u.name,\"11g/n\");\n\t\t\t\telse\n\t\t\t\t\tstrcpy(iwe.u.name,\"11b/g/n\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (isGonly==TRUE)\n\t\t\t\t\tstrcpy(iwe.u.name,\"11g\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pBssEntry->SupRateLen==4 && pBssEntry->ExtRateLen==0)\n\t\t\t\t\t\tstrcpy(iwe.u.name,\"11b\");\n\t\t\t\t\telse\n\t\t\t\t\t\tstrcpy(iwe.u.name,\"11b/g\");\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ( pBssEntry->ChannelWidth ==  1 )\n\t\t\tsprintf(iwe.u.name, \"%s %s\", iwe.u.name, \"BW40\");\n\t\telse\n\t\t\tsprintf(iwe.u.name, \"%s %s\", iwe.u.name, \"BW20\");\n\t\t\n\t}\n\n\t\tprevious_ev = current_ev;\n\t\tcurrent_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);\n\t\tif (current_ev == previous_ev)\n\t\t{\n#if WIRELESS_EXT >= 17\n\t   \t\tstatus = -E2BIG;\n\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n\t\t}\n\n\t\t/*ESSID */\n\t\t/*================================ */\n\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = SIOCGIWESSID;\n\t\tiwe.u.data.length = pIoctlScan->pBssTable[i].SsidLen;\n\t\tiwe.u.data.flags = 1;\n \n        previous_ev = current_ev;\n\t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev,end_buf, &iwe, (PSTRING) pIoctlScan->pBssTable[i].Ssid);\n        if (current_ev == previous_ev)\n        {\n#if WIRELESS_EXT >= 17\n            status = -E2BIG;\n\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n        }\n\t\t\n\t\t/*Network Type */\n\t\t/*================================ */\n\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = SIOCGIWMODE;\n\t\tif (pIoctlScan->pBssTable[i].BssType == Ndis802_11IBSS)\n\t\t{\n\t\t\tiwe.u.mode = IW_MODE_ADHOC;\n\t\t}\n\t\telse if (pIoctlScan->pBssTable[i].BssType == Ndis802_11Infrastructure)\n\t\t{\n\t\t\tiwe.u.mode = IW_MODE_INFRA;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tiwe.u.mode = IW_MODE_AUTO;\n\t\t}\n\t\tiwe.len = IW_EV_UINT_LEN;\n\n        previous_ev = current_ev;\n\t\tcurrent_ev = IWE_STREAM_ADD_EVENT(info, current_ev, end_buf, &iwe,  IW_EV_UINT_LEN);\n        if (current_ev == previous_ev)\n        {\n#if WIRELESS_EXT >= 17\n            status = -E2BIG;\n\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n        }\n\n\t\t/*Channel and Frequency */\n\t\t/*================================ */\n\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = SIOCGIWFREQ;\n\t\t{\n\t\t\tUCHAR ch = pIoctlScan->pBssTable[i].Channel;\n\t\t\tULONG\tm = 0;\n/*\t\t\tMAP_CHANNEL_ID_TO_KHZ(ch, m); */\n\t\t\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_CHID_2_FREQ, 0,\n\t\t\t\t\t\t\t\t(VOID *)&m, ch, RT_DEV_PRIV_FLAGS_GET(dev));\n\t\t\tiwe.u.freq.m = m * 100;\n\t\t\tiwe.u.freq.e = 1;\n\t\tiwe.u.freq.i = 0;\n\t\t}\n\t\tprevious_ev = current_ev;\n\t\tcurrent_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_FREQ_LEN);\n        if (current_ev == previous_ev)\n\t        {\n#if WIRELESS_EXT >= 17\n\t            status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n\t\t}\t    \n\n        /*Add quality statistics */\n        /*================================ */\n        memset(&iwe, 0, sizeof(iwe));\n    \tiwe.cmd = IWEVQUAL;\n    \tiwe.u.qual.level = 0;\n    \tiwe.u.qual.noise = 0;\n\t\tset_quality(pAd, &iwe.u.qual, &pIoctlScan->pBssTable[i].Signal);\n\n\tprevious_ev = current_ev;\n    \tcurrent_ev = IWE_STREAM_ADD_EVENT(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);\n\tif (current_ev == previous_ev)\n\t\t{\n#if WIRELESS_EXT >= 17\n\t            status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n\t\t}\n\n\t\t/*Encyption key */\n\t\t/*================================ */\n\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = SIOCGIWENCODE;\n\t\tif (pIoctlScan->pBssTable[i].FlgIsPrivacyOn)\n\t\t\tiwe.u.data.flags =IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;\n\t\telse\n\t\t\tiwe.u.data.flags = IW_ENCODE_DISABLED;\n\n        previous_ev = current_ev;\t\t\n        current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf,&iwe, (char *)pIoctlScan->MainSharedKey[(iwe.u.data.flags & IW_ENCODE_INDEX)-1]);\n        if (current_ev == previous_ev)\n        {\n#if WIRELESS_EXT >= 17\n            status = -E2BIG;\n\t\t\tgoto go_out;\n#else\n\t\t\tbreak;\n#endif\n        }\n\n\t\t/*Bit Rate */\n\t\t/*================================ */\n\t\tif (pIoctlScan->pBssTable[i].SupRateLen)\n        {\n            UCHAR tmpRate = pIoctlScan->pBssTable[i].SupRate[pIoctlScan->pBssTable[i].SupRateLen-1];\n\t\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd = SIOCGIWRATE;\n    \t\tcurrent_val = current_ev + IW_EV_LCP_LEN;            \n            if (tmpRate == 0x82)\n                iwe.u.bitrate.value =  1 * 1000000;\n            else if (tmpRate == 0x84)\n                iwe.u.bitrate.value =  2 * 1000000;\n            else if (tmpRate == 0x8B)\n                iwe.u.bitrate.value =  5.5 * 1000000;\n            else if (tmpRate == 0x96)\n                iwe.u.bitrate.value =  11 * 1000000;\n            else\n    \t\t    iwe.u.bitrate.value =  (tmpRate/2) * 1000000;\n            \n\t\t\tif (pIoctlScan->pBssTable[i].ExtRateLen)\n\t\t\t{\n\t\t\t\tUCHAR tmpSupRate =(pIoctlScan->pBssTable[i].SupRate[pIoctlScan->pBssTable[i].SupRateLen-1]& 0x7f);\n\t\t\t\tUCHAR tmpExtRate =(pIoctlScan->pBssTable[i].ExtRate[pIoctlScan->pBssTable[i].ExtRateLen-1]& 0x7f);\n\t\t\t\tiwe.u.bitrate.value = (tmpSupRate > tmpExtRate) ? (tmpSupRate)*500000 : (tmpExtRate)*500000;\t\n\t\t\t\ttmpRate = (tmpSupRate > tmpExtRate)? tmpSupRate:tmpExtRate;\n\t\t\t}\n\n\t\t\tif (tmpRate == 0x6c && pIoctlScan->pBssTable[i].HtCapabilityLen > 0)\n\t\t\t{\n\t\t\t\tint rate_count = RT_RateSize/sizeof(__s32);\n/*\t\t\t\tHT_CAP_INFO capInfo = pIoctlScan->pBssTable[i].HtCapability.HtCapInfo; */\n\t\t\t\tint shortGI = pIoctlScan->pBssTable[i].ChannelWidth ? pIoctlScan->pBssTable[i].ShortGIfor40 : pIoctlScan->pBssTable[i].ShortGIfor20;\n\t\t\t\tint maxMCS = pIoctlScan->pBssTable[i].MCSSet ?  15 : 7;\n\t\t\t\tint rate_index = 12 + ((UCHAR)pIoctlScan->pBssTable[i].ChannelWidth * 24) +\n\t\t\t\t\t\t\t\t((UCHAR)shortGI *48) + ((UCHAR)maxMCS);\n\t\t\t\tif (rate_index < 0)\n\t\t\t\t\trate_index = 0;\n\t\t\t\tif (rate_index >= rate_count)\n\t\t\t\t\trate_index = rate_count-1;\n\t\t\t\tiwe.u.bitrate.value\t=  ralinkrate[rate_index] * 500000;\n\t\t\t}\n            \n\t\t\tiwe.u.bitrate.disabled = 0;\n\t\t\tcurrent_val = IWE_STREAM_ADD_VALUE(info, current_ev,\n\t\t\t\tcurrent_val, end_buf, &iwe,\n    \t\t\tIW_EV_PARAM_LEN);            \n\n        \tif((current_val-current_ev)>IW_EV_LCP_LEN)\n            \tcurrent_ev = current_val;\n        \telse\n        \t{\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n        }\n        }\n            \n#ifdef IWEVGENIE\n        /*WPA IE */\n\t\tif (pIoctlScan->pBssTable[i].WpaIeLen > 0)\n        {\n\t\t\tmemset(&iwe, 0, sizeof(iwe));\n\t\t\tmemset(&custom[0], 0, MAX_CUSTOM_LEN);\n\t\t\tmemcpy(custom, &(pIoctlScan->pBssTable[i].pWpaIe[0]), \n\t\t\t\t\t\t   pIoctlScan->pBssTable[i].WpaIeLen);\n\t\t\tiwe.cmd = IWEVGENIE;\n\t\t\tiwe.u.data.length = pIoctlScan->pBssTable[i].WpaIeLen;\n\t\t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom);\n\t\t\tif (current_ev == previous_ev)\n\t\t\t{\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n\t\t}\n\t\t}\n            \n\t\t/*WPA2 IE */\n        if (pIoctlScan->pBssTable[i].RsnIeLen > 0)\n        {\n        \tmemset(&iwe, 0, sizeof(iwe));\n\t\t\tmemset(&custom[0], 0, MAX_CUSTOM_LEN);\n\t\t\tmemcpy(custom, &(pIoctlScan->pBssTable[i].pRsnIe[0]), \n\t\t\t\t\t\t   pIoctlScan->pBssTable[i].RsnIeLen);\n\t\t\tiwe.cmd = IWEVGENIE;\n\t\t\tiwe.u.data.length = pIoctlScan->pBssTable[i].RsnIeLen;\n\t\t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom);\n\t\t\tif (current_ev == previous_ev)\n\t\t\t{\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n        }\n        }\n\n\t\t/*WPS IE */\n\t\tif (pIoctlScan->pBssTable[i].WpsIeLen > 0)\n        {\n        \tmemset(&iwe, 0, sizeof(iwe));\n\t\t\tmemset(&custom[0], 0, MAX_CUSTOM_LEN);\n\t\t\tmemcpy(custom, &(pIoctlScan->pBssTable[i].pWpsIe[0]), \n\t\t\t\t\t\t   pIoctlScan->pBssTable[i].WpsIeLen);\n\t\t\tiwe.cmd = IWEVGENIE;\n\t\t\tiwe.u.data.length = pIoctlScan->pBssTable[i].WpsIeLen;\n\t\t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom);\n\t\t\tif (current_ev == previous_ev)\n\t\t\t{\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n        }\n        }\n#else\n        /*WPA IE */\n\t\t/*================================ */\n        if (pIoctlScan->pBssTable[i].WpaIeLen > 0)\n        {\n    \t\tNdisZeroMemory(&iwe, sizeof(iwe));\n\t\t\tmemset(&custom[0], 0, MAX_CUSTOM_LEN);\n    \t\tiwe.cmd = IWEVCUSTOM;\n            iwe.u.data.length = (pIoctlScan->pBssTable[i].WpaIeLen * 2) + 7;\n            NdisMoveMemory(custom, \"wpa_ie=\", 7);\n            for (idx = 0; idx < pIoctlScan->pBssTable[i].WpaIeLen; idx++)\n                sprintf(custom, \"%s%02x\", custom, pIoctlScan->pBssTable[i].pWpaIe[idx]);\n            previous_ev = current_ev;\n    \t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe,  custom);\n            if (current_ev == previous_ev)\n            {\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n        }\n        }\n\n        /*WPA2 IE */\n        if (pIoctlScan->pBssTable[i].RsnIeLen > 0)\n        {\n    \t\tNdisZeroMemory(&iwe, sizeof(iwe));\n\t\t\tmemset(&custom[0], 0, MAX_CUSTOM_LEN);\n    \t\tiwe.cmd = IWEVCUSTOM;\n            iwe.u.data.length = (pIoctlScan->pBssTable[i].RsnIeLen * 2) + 7;\n            NdisMoveMemory(custom, \"rsn_ie=\", 7);\n\t\t\tfor (idx = 0; idx < pIoctlScan->pBssTable[i].RsnIeLen; idx++)\n                sprintf(custom, \"%s%02x\", custom, pIoctlScan->pBssTable[i].pRsnIe[idx]);\n            previous_ev = current_ev;\n    \t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe,  custom);\n            if (current_ev == previous_ev)\n            {\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n        }\n        }\n\n#ifdef WSC_INCLUDED\n\t\t/*WPS IE */\n\t\tif (pIoctlScan->pBssTable[i].WpsIeLen > 0)\n        {\n    \t\tNdisZeroMemory(&iwe, sizeof(iwe));\n\t\t\tmemset(&custom[0], 0, MAX_CUSTOM_LEN);\n    \t\tiwe.cmd = IWEVCUSTOM;\n            iwe.u.data.length = (pIoctlScan->pBssTable[i].WpsIeLen * 2) + 7;\n            NdisMoveMemory(custom, \"wps_ie=\", 7);\n\t\t\tfor (idx = 0; idx < pIoctlScan->pBssTable[i].WpsIeLen; idx++)\n                sprintf(custom, \"%s%02x\", custom, pIoctlScan->pBssTable[i].pWpsIe[idx]);\n            previous_ev = current_ev;\n    \t\tcurrent_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe,  custom);\n            if (current_ev == previous_ev)\n            {\n#if WIRELESS_EXT >= 17\n                status = -E2BIG;\n\t\t\t\tgoto go_out;\n#else\n\t\t\t    break;\n#endif\n        }\n        }\n#endif /* WSC_INCLUDED */\n\n#endif /* IWEVGENIE */\n\t}\n\n\tdata->length = current_ev - extra;\n/*    pAd->StaCfg.bScanReqIsFromWebUI = FALSE; */\n/*\tDBGPRINT(RT_DEBUG_ERROR ,(\"===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\\n\",i , pAd->ScanTab.BssNr, data->length)); */\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SCAN_END, 0,\n\t\t\t\t\t\tNULL, data->length, RT_DEV_PRIV_FLAGS_GET(dev));\n\ngo_out:\n\tif (pIoctlScan->pBssTable != NULL)\n\t\tos_free_mem(NULL, pIoctlScan->pBssTable);\n\n\treturn status;\n}\n#endif\n\nint rt_ioctl_siwessid(struct net_device *dev,\n\t\t\t struct iw_request_info *info,\n\t\t\t struct iw_point *data, char *essid)\n{\n\tVOID *pAd = NULL;\n\tRT_CMD_STA_IOCTL_SSID IoctlEssid, *pIoctlEssid = &IoctlEssid;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n       \treturn -ENETDOWN;   \n    }\n\n\tif (data->flags)\n\t{\n\t\t/* Includes null character. */\n\t\tif (data->length > (IW_ESSID_MAX_SIZE + 1)) \n\t\t\treturn -E2BIG;\n\t}\n\n\n\tpIoctlEssid->FlgAnySsid = data->flags;\n\tpIoctlEssid->SsidLen = data->length;\n\tpIoctlEssid->pSsid = (CHAR *)essid;\n\tpIoctlEssid->Status = 0;\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWESSID, 0,\n\t\t\t\t\t\tpIoctlEssid, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tRT_CMD_STATUS_TRANSLATE(pIoctlEssid->Status);\n\treturn pIoctlEssid->Status;\n}\n\nint rt_ioctl_giwessid(struct net_device *dev,\n\t\t\t struct iw_request_info *info,\n\t\t\t struct iw_point *data, char *essid)\n{\n\tVOID *pAd = NULL;\n\tRT_CMD_STA_IOCTL_SSID IoctlEssid, *pIoctlEssid = &IoctlEssid;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n\tdata->flags = 1;\n\n\n\tpIoctlEssid->pSsid = (CHAR *)essid;\n\tpIoctlEssid->Status = 0;\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWESSID, 0,\n\t\t\t\t\t\tpIoctlEssid, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\tdata->length = pIoctlEssid->SsidLen;\n\n\tRT_CMD_STATUS_TRANSLATE(pIoctlEssid->Status);\n\treturn pIoctlEssid->Status;\n}\n\nint rt_ioctl_siwnickn(struct net_device *dev,\n\t\t\t struct iw_request_info *info,\n\t\t\t struct iw_point *data, char *nickname)\n{\n\tVOID *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n        DBGPRINT(RT_DEBUG_TRACE ,(\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;   \n    }\n\n\tif (data->length > IW_ESSID_MAX_SIZE)\n\t\treturn -EINVAL;\n\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWNICKN, 0,\n\t\t\t\t\t\t\tnickname, data->length, RT_DEV_PRIV_FLAGS_GET(dev));\n\treturn 0;\n}\n\nint rt_ioctl_giwnickn(struct net_device *dev,\n\t\t\t struct iw_request_info *info,\n\t\t\t struct iw_point *data, char *nickname)\n{\n\tVOID *pAd = NULL;\n\tRT_CMD_STA_IOCTL_NICK_NAME NickName, *pNickName = &NickName;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\tdata->length = 0;\n        return -ENETDOWN;\n\t}\n\n\n\tpNickName->NameLen = data->length;\n\tpNickName->pName = (CHAR *)nickname;\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWNICKN, 0,\n\t\t\t\t\t\t\tpNickName, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tdata->length = pNickName->NameLen;\n\treturn 0;\n}\n\nint rt_ioctl_siwrts(struct net_device *dev,\n\t\t       struct iw_request_info *info,\n\t\t       struct iw_param *rts, char *extra)\n{\n\tVOID *pAd = NULL;\n\tu16 val;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;   \n    }\n\t\n\tif (rts->disabled)\n\t\tval = MAX_RTS_THRESHOLD;\n\telse if (rts->value < 0 || rts->value > MAX_RTS_THRESHOLD)\n\t\treturn -EINVAL;\n\telse if (rts->value == 0)\n\t    val = MAX_RTS_THRESHOLD;\n\telse\n\t\tval = rts->value;\n\t\n/*\tif (val != pAd->CommonCfg.RtsThreshold) */\n/*\t\tpAd->CommonCfg.RtsThreshold = val; */\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWRTS, 0,\n\t\t\t\t\t\tNULL, val, RT_DEV_PRIV_FLAGS_GET(dev));\n\treturn 0;\n}\n\nint rt_ioctl_giwrts(struct net_device *dev,\n\t\t       struct iw_request_info *info,\n\t\t       struct iw_param *rts, char *extra)\n{\n\tVOID *pAd = NULL;\n\tUSHORT RtsThreshold;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*    \tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\t\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    \t{\n      \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        \treturn -ENETDOWN;   \n    \t}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWRTS, 0,\n\t\t\t\t\t\t&RtsThreshold, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\trts->value = RtsThreshold;\n\trts->disabled = (rts->value == MAX_RTS_THRESHOLD);\n\trts->fixed = 1;\n\n\treturn 0;\n}\n\nint rt_ioctl_siwfrag(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_param *frag, char *extra)\n{\n\tVOID *pAd = NULL;\n\tu16 val;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    \tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\t\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    \t{\n      \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        \treturn -ENETDOWN;   \n    \t}\n\n\tif (frag->disabled)\n\t\tval = MAX_FRAG_THRESHOLD;\n\telse if (frag->value >= MIN_FRAG_THRESHOLD || frag->value <= MAX_FRAG_THRESHOLD)\n        val = __cpu_to_le16(frag->value & ~0x1); /* even numbers only */\n\telse if (frag->value == 0)\n\t    val = MAX_FRAG_THRESHOLD;\n\telse\n\t\treturn -EINVAL;\n\n/*\tpAd->CommonCfg.FragmentThreshold = val; */\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWFRAG, 0,\n\t\t\t\t\t\tNULL, val, RT_DEV_PRIV_FLAGS_GET(dev));\n\treturn 0;\n}\n\nint rt_ioctl_giwfrag(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_param *frag, char *extra)\n{\n\tVOID *pAd = NULL;\n\tUSHORT FragmentThreshold;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*    \tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\t\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    \t{\n      \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        \treturn -ENETDOWN;   \n    \t}\n\t\t\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWFRAG, 0,\n\t\t\t\t\t\t&FragmentThreshold, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\tfrag->value = FragmentThreshold;\n\tfrag->disabled = (frag->value == MAX_FRAG_THRESHOLD);\n\tfrag->fixed = 1;\n\n\treturn 0;\n}\n\n#define MAX_WEP_KEY_SIZE 13\n#define MIN_WEP_KEY_SIZE 5\nint rt_ioctl_siwencode(struct net_device *dev,\n\t\t\t  struct iw_request_info *info,\n\t\t\t  struct iw_point *erq, char *extra)\n{\n\tVOID *pAd = NULL;\n\tRT_CMD_STA_IOCTL_SECURITY IoctlSec, *pIoctlSec = &IoctlSec;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    \tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\t\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    \t{\n      \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        \treturn -ENETDOWN;   \n    \t}\n\n\n\tpIoctlSec->pData = (CHAR *)extra;\n\tpIoctlSec->length = erq->length;\n\tpIoctlSec->KeyIdx = (erq->flags & IW_ENCODE_INDEX) - 1;\n\tpIoctlSec->flags = 0;\n\n\tif (erq->flags & IW_ENCODE_DISABLED)\n\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_DISABLED;\n\tif (erq->flags & IW_ENCODE_RESTRICTED)\n\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_RESTRICTED;\n\tif (erq->flags & IW_ENCODE_OPEN)\n\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_OPEN;\n\tif (erq->flags & IW_ENCODE_NOKEY)\n\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_NOKEY;\n\tif (erq->flags & IW_ENCODE_MODE)\n\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_MODE;\n\n\tpIoctlSec->Status = 0;\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWENCODE, 0,\n\t\t\t\t\t\tpIoctlSec, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\tRT_CMD_STATUS_TRANSLATE(pIoctlSec->Status);\n\treturn pIoctlSec->Status;\n}\n\nint\nrt_ioctl_giwencode(struct net_device *dev,\n\t\t\t  struct iw_request_info *info,\n\t\t\t  struct iw_point *erq, char *key)\n{\n/*\tint kid; */\n\tVOID *pAd = NULL;\n\tRT_CMD_STA_IOCTL_SECURITY IoctlSec, *pIoctlSec = &IoctlSec;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\t/*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n  \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n\t}\n\t\t\n\n\tpIoctlSec->pData = (CHAR *)key;\n\tpIoctlSec->KeyIdx = erq->flags & IW_ENCODE_INDEX;\n\tpIoctlSec->length = erq->length;\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWENCODE, 0,\n\t\t\t\t\t\tpIoctlSec, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\terq->length = pIoctlSec->length;\n\terq->flags = pIoctlSec->KeyIdx;\n\tif (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_DISABLED)\n\t\terq->flags = RT_CMD_STA_IOCTL_SECURITY_DISABLED;\n\t{\n\t\tif (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_ENABLED)\n\t\t\terq->flags |= IW_ENCODE_ENABLED;\n\t\tif (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_RESTRICTED)\n\t\t\terq->flags |= IW_ENCODE_RESTRICTED;\t\n\t\tif (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_OPEN)\n\t\t\terq->flags |= IW_ENCODE_OPEN;\n\t}\n\treturn 0;\n\n}\n\nint rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,\n\t\t\t void *w, char *extra)\n{\n\tVOID *pAd;\n/*\tPOS_COOKIE pObj; */\n\tPSTRING this_char = extra;\n\tPSTRING value = NULL;\n\tint  Status=0;\n\tRT_CMD_PARAM_SET CmdParam;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\n\t\n\tif (!*this_char)\n\t\treturn -EINVAL;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tif ((value = rtstrchr(this_char, '=')) != NULL) \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t*value++ = 0;\n\n\t/*check if the interface is down */\n/*    \tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\t\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, this_char) != NDIS_STATUS_SUCCESS)\n    \t{\n    \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\t\treturn -ENETDOWN;\n    \t}\n\telse\n\t{\n\t\tif (!value && (strcmp(this_char, \"SiteSurvey\") != 0))\n\t\t    return -EINVAL;\n\t\telse if (!value && (strcmp(this_char, \"SiteSurvey\") == 0))\n\t\t\tgoto SET_PROC;\n\n\t\t/* reject setting nothing besides ANY ssid(ssidLen=0) */\n\t\tif (!*value && (strcmp(this_char, \"SSID\") != 0))\n\t\t\treturn -EINVAL; \n\t}\n\nSET_PROC:\n\tCmdParam.pThisChar = this_char;\n\tCmdParam.pValue = value;\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_PARAM_SET, 0,\n\t\t\t\t\t\t&CmdParam, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n/*\tStatus = RTMPSTAPrivIoctlSet(pAd, this_char, value); */\n\t\t\n    return Status;\n}\n\n\n#ifdef WSC_STA_SUPPORT\n\nstatic int\nrt_private_set_wsc_u32_item(struct net_device *dev, struct iw_request_info *info,\n\t\t\t u32 *uwrq, char *extra)\n{\n    VOID *pAd = NULL;\n/*    int  Status=0; */\n/*    u32 subcmd = *uwrq; */\n/*    PWSC_PROFILE    pWscProfile = NULL; */\n/*   \tu32 value = 0; */\n\tRT_CMD_STA_IOCTL_WSC_U32_ITEM IoctlWscU32, *pIoctlWscU32 = &IoctlWscU32;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n    \n\tpIoctlWscU32->pUWrq = uwrq;\n\tpIoctlWscU32->Status = NDIS_STATUS_SUCCESS;\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_IW_SET_WSC_U32_ITEM, 0,\n\t\t\t\t\t\tpIoctlWscU32, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tRT_CMD_STATUS_TRANSLATE(pIoctlWscU32->Status);\n    return pIoctlWscU32->Status;\n}\n\nstatic int\nrt_private_set_wsc_string_item(struct net_device *dev, struct iw_request_info *info,\n\t\tstruct iw_point *dwrq, char *extra)\n{\n\tRT_CMD_STA_IOCTL_WSC_STR_ITEM IoctlWscStr, *pIoctlWscStr = &IoctlWscStr;\n/*    int  Status=0; */\n/*    u32 subcmd = dwrq->flags; */\n/*    u32 tmpProfileIndex = (u32)(extra[0] - 0x30); */\n/*    u32 dataLen; */\n    VOID *pAd = NULL;\n/*    PWSC_PROFILE    pWscProfile = NULL; */\n/*    USHORT  tmpAuth = 0, tmpEncr = 0; */\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n\n\tpIoctlWscStr->Subcmd = dwrq->flags;\n\tpIoctlWscStr->pData = (CHAR *)extra;\n\tpIoctlWscStr->length = dwrq->length;\n\n\tpIoctlWscStr->Status = RTMP_STA_IoctlHandle(pAd, NULL,\n\t\t\t\t\t\tCMD_RTPRIV_IOCTL_STA_IW_SET_WSC_STR_ITEM, 0,\n\t\t\t\t\t\tpIoctlWscStr, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tRT_CMD_STATUS_TRANSLATE(pIoctlWscStr->Status);\n    return pIoctlWscStr->Status;\n}\n#endif /* WSC_STA_SUPPORT */\n\nstatic int\nrt_private_get_statistics(struct net_device *dev, struct iw_request_info *info,\n\t\tstruct iw_point *wrq, char *extra)\n{\n\tINT\t\t\t\tStatus = 0;\n    VOID   *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n    if (extra == NULL)\n    {\n        wrq->length = 0;\n        return -EIO;\n    }\n    \n    memset(extra, 0x00, IW_PRIV_SIZE_MASK);\n\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_IW_GET_STATISTICS, 0,\n\t\t\t\t\t\textra, IW_PRIV_SIZE_MASK, RT_DEV_PRIV_FLAGS_GET(dev));\n\n    wrq->length = strlen(extra) + 1; /* 1: size of '\\0' */\n    DBGPRINT(RT_DEBUG_TRACE, (\"<== rt_private_get_statistics, wrq->length = %d\\n\", wrq->length));\n\n    return Status;\n}\n\n\nstatic int\nrt_private_show(struct net_device *dev, struct iw_request_info *info,\n\t\tstruct iw_point *wrq, PSTRING extra)\n{\n\tRTMP_IOCTL_INPUT_STRUCT wrqin;\n\tINT\t\t\t\tStatus = 0;\n\tVOID   \t\t\t*pAd;\n/*\tPOS_COOKIE\t\tpObj; */\n\tu32             subcmd = wrq->flags;\n\tRT_CMD_STA_IOCTL_SHOW IoctlShow, *pIoctlShow = &IoctlShow;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\n/*\tpObj = (POS_COOKIE) pAd->OS_Cookie; */\n\tif (extra == NULL)\n\t{\n\t\twrq->length = 0;\n\t\treturn -EIO;\n\t}\n\tmemset(extra, 0x00, IW_PRIV_SIZE_MASK);\n    \n    \n\twrqin.u.data.pointer = wrq->pointer;\n\twrqin.u.data.length = wrq->length;\n\n\tpIoctlShow->pData = (CHAR *)extra;\n\tpIoctlShow->MaxSize = IW_PRIV_SIZE_MASK;\n\tpIoctlShow->InfType = RT_DEV_PRIV_FLAGS_GET(dev);\n\tRTMP_STA_IoctlHandle(pAd, &wrqin, CMD_RTPRIV_IOCTL_SHOW, subcmd,\n\t\t\t\t\t\tpIoctlShow, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\twrq->length = wrqin.u.data.length;\n    return Status;\n}\n\n#ifdef SIOCSIWMLME\nint rt_ioctl_siwmlme(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   union iwreq_data *wrqu,\n\t\t\t   char *extra)\n{\n\tVOID   *pAd = NULL;\n\tstruct iw_mlme *pMlme = (struct iw_mlme *)wrqu->data.pointer;\n/*\tMLME_QUEUE_ELEM\t\t\t\tMsgElem; */\n/*\tMLME_QUEUE_ELEM\t\t\t\t*pMsgElem = NULL; */\n/*\tMLME_DISASSOC_REQ_STRUCT\tDisAssocReq; */\n/*\tMLME_DEAUTH_REQ_STRUCT      DeAuthReq; */\n\tULONG Subcmd = 0;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s\\n\", __FUNCTION__));\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n\tif (pMlme == NULL)\n\t\treturn -EINVAL;\n\n\n\tswitch(pMlme->cmd)\n\t{\n#ifdef IW_MLME_DEAUTH\t\n\t\tcase IW_MLME_DEAUTH:\n\t\t\tSubcmd = RT_CMD_STA_IOCTL_IW_MLME_DEAUTH;\n\t\t\tbreak;\n#endif /* IW_MLME_DEAUTH */\n#ifdef IW_MLME_DISASSOC\n\t\tcase IW_MLME_DISASSOC:\n\t\t\tSubcmd = RT_CMD_STA_IOCTL_IW_MLME_DISASSOC;\n\t\t\tbreak;\n#endif /* IW_MLME_DISASSOC */\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s - Unknow Command\\n\", __FUNCTION__));\n\t\t\tbreak;\n\t}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWMLME, Subcmd,\n\t\t\t\t\t\tNULL, pMlme->reason_code, RT_DEV_PRIV_FLAGS_GET(dev));\n\treturn 0;\n}\n#endif /* SIOCSIWMLME */\n\n#if WIRELESS_EXT > 17\n\n\nint rt_ioctl_siwauth(struct net_device *dev,\n\t\t\t  struct iw_request_info *info,\n\t\t\t  union iwreq_data *wrqu, char *extra)\n{\n\tVOID   *pAd = NULL;\n\tstruct iw_param *param = &wrqu->param;\n\tRT_CMD_STA_IOCTL_SECURITY_ADV IoctlWpa, *pIoctlWpa = &IoctlWpa;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n  \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n\t}\n\n\n\tpIoctlWpa->flags = 0;\n\tpIoctlWpa->value = param->value; /* default */\n\n\tswitch (param->flags & IW_AUTH_INDEX) {\n    \tcase IW_AUTH_WPA_VERSION:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_VERSION;\n            if (param->value == IW_AUTH_WPA_VERSION_WPA)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_VERSION1;\n            else if (param->value == IW_AUTH_WPA_VERSION_WPA2)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_VERSION2;\n\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_WPA_VERSION - param->value = %d!\\n\", __FUNCTION__, param->value));\n            break;\n    \tcase IW_AUTH_CIPHER_PAIRWISE:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_PAIRWISE;\n            if (param->value == IW_AUTH_CIPHER_NONE)\n                pIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_PAIRWISE_NONE;\n            else if (param->value == IW_AUTH_CIPHER_WEP40)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP40;\n            else if (param->value == IW_AUTH_CIPHER_WEP104)\n                pIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP104;\n            else if (param->value == IW_AUTH_CIPHER_TKIP)\n                pIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_PAIRWISE_TKIP;\n            else if (param->value == IW_AUTH_CIPHER_CCMP)\n                pIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_PAIRWISE_CCMP;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_CIPHER_PAIRWISE - param->value = %d!\\n\", __FUNCTION__, param->value));\n            break;\n    \tcase IW_AUTH_CIPHER_GROUP:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_GROUP;\n            if (param->value == IW_AUTH_CIPHER_NONE)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_GROUP_NONE;\n            else if (param->value == IW_AUTH_CIPHER_WEP40)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_GROUP_WEP40;\n\t\t\telse if (param->value == IW_AUTH_CIPHER_WEP104)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_GROUP_WEP104;\n            else if (param->value == IW_AUTH_CIPHER_TKIP)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_GROUP_TKIP;\n            else if (param->value == IW_AUTH_CIPHER_CCMP)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_GROUP_CCMP;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_CIPHER_GROUP - param->value = %d!\\n\", __FUNCTION__, param->value));\n            break;\n    \tcase IW_AUTH_KEY_MGMT:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_KEY_MGMT;\n            if (param->value == IW_AUTH_KEY_MGMT_802_1X)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_KEY_MGMT_1X;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_KEY_MGMT - param->value = %d!\\n\", __FUNCTION__, param->value));\n            break;\n    \tcase IW_AUTH_RX_UNENCRYPTED_EAPOL:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_RX_UNENCRYPTED_EAPOL;\n            break;\n    \tcase IW_AUTH_PRIVACY_INVOKED:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_PRIVACY_INVOKED;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_PRIVACY_INVOKED - param->value = %d!\\n\", __FUNCTION__, param->value));\n    \t\tbreak;\n    \tcase IW_AUTH_DROP_UNENCRYPTED:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_DROP_UNENCRYPTED;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_DROP_UNENCRYPTED - param->value = %d!\\n\", __FUNCTION__, param->value));\n    \t\tbreak;\n    \tcase IW_AUTH_80211_AUTH_ALG: \n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG;\n\t\t\tif (param->value & IW_AUTH_ALG_SHARED_KEY) \n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_SHARED;\n            else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_OPEN;\n            else if (param->value & IW_AUTH_ALG_LEAP)\n\t\t\t\tpIoctlWpa->value = RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_LEAP;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_80211_AUTH_ALG - param->value = %d!\\n\", __FUNCTION__, param->value));\n\t\t\tbreak;\n    \tcase IW_AUTH_WPA_ENABLED:\n\t\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_WPA_ENABLED;\n    \t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_WPA_ENABLED - Driver supports WPA!(param->value = %d)\\n\", __FUNCTION__, param->value));\n    \t\tbreak;\n\tcase IW_AUTH_TKIP_COUNTERMEASURES:\n\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_COUNTERMEASURES;\n\t\tpIoctlWpa->value = param->value;\n    \t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_TKIP_COUNTERMEASURES -(param->value = %d)\\n\", __FUNCTION__, param->value));\n\t\tbreak;\n    \tdefault:\n    \t\treturn -EOPNOTSUPP;\n}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWAUTH, 0,\n\t\t\t\t\t\tpIoctlWpa, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\treturn 0;\n}\n\nint rt_ioctl_giwauth(struct net_device *dev,\n\t\t\t       struct iw_request_info *info,\n\t\t\t       union iwreq_data *wrqu, char *extra)\n{\n\tVOID   *pAd = NULL;\n\tstruct iw_param *param = &wrqu->param;\n\tRT_CMD_STA_IOCTL_SECURITY_ADV IoctlWpa, *pIoctlWpa = &IoctlWpa;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n  \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n    }\n\n\n\tpIoctlWpa->flags = 0;\n\tpIoctlWpa->value = 0;\n\n\tswitch (param->flags & IW_AUTH_INDEX) {\n\tcase IW_AUTH_DROP_UNENCRYPTED:\n\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_DROP_UNENCRYPTED;\n\t\tbreak;\n\n\tcase IW_AUTH_80211_AUTH_ALG:\n\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG;\n\t\tbreak;\n\n\tcase IW_AUTH_WPA_ENABLED:\n\t\tpIoctlWpa->flags = RT_CMD_STA_IOCTL_WPA_AUTH_WPA_ENABLED;\n\t\tbreak;\n\n\tdefault:\n\t\treturn -EOPNOTSUPP;\n\t}\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWAUTH, 0,\n\t\t\t\t\t\tpIoctlWpa, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\tswitch (param->flags & IW_AUTH_INDEX) {\n\tcase IW_AUTH_DROP_UNENCRYPTED:\n\t\tparam->value = pIoctlWpa->value;\n\t\tbreak;\n\n\tcase IW_AUTH_80211_AUTH_ALG:\n\t\tparam->value = (pIoctlWpa->value == 0) ? IW_AUTH_ALG_SHARED_KEY : IW_AUTH_ALG_OPEN_SYSTEM;\n\t\tbreak;\n\n\tcase IW_AUTH_WPA_ENABLED:\n\t\tparam->value = pIoctlWpa->value;\n\t\tbreak;\n\t}\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"rt_ioctl_giwauth::param->value = %d!\\n\", param->value));\n\treturn 0;\n}\n\n\nint rt_ioctl_siwencodeext(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   union iwreq_data *wrqu,\n\t\t\t   char *extra)\n{\n\tVOID   *pAd = NULL;\n\tstruct iw_point *encoding = &wrqu->encoding;\n\tstruct iw_encode_ext *ext = (struct iw_encode_ext *)extra;\n    int /* keyIdx, */ alg = ext->alg;\n\tRT_CMD_STA_IOCTL_SECURITY IoctlSec, *pIoctlSec = &IoctlSec;\n\t\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\t\n    /*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n  \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n\t}\n\n\t\t\t\n\tpIoctlSec->pData = (CHAR *)ext->key;\n\tpIoctlSec->length = ext->key_len;\n\tpIoctlSec->KeyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1;\n\tif (alg == IW_ENCODE_ALG_NONE )\n\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_NONE;\n\telse if (alg == IW_ENCODE_ALG_WEP)\n\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_WEP;\n\telse if (alg == IW_ENCODE_ALG_TKIP)\n\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_TKIP;\n\telse if (alg == IW_ENCODE_ALG_CCMP)\n\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_CCMP;\n\telse \n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"Warning: Security type is not supported. (alg = %d) \\n\", alg));\n\t\tpIoctlSec->Alg = alg;\n\t\treturn -EOPNOTSUPP;\n\t}\n\tpIoctlSec->ext_flags = 0;\n\tif (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)\n\t\tpIoctlSec->ext_flags |= RT_CMD_STA_IOCTL_SECURTIY_EXT_SET_TX_KEY;\n\tif (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)\n\t\tpIoctlSec->ext_flags |= RT_CMD_STA_IOCTL_SECURTIY_EXT_GROUP_KEY;\n\tif (encoding->flags & IW_ENCODE_DISABLED)\n\t\tpIoctlSec->flags = RT_CMD_STA_IOCTL_SECURITY_DISABLED;\n\telse\n\t\tpIoctlSec->flags = 0;\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWENCODEEXT, 0,\n\t\t\t\tpIoctlSec, 0, RT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t\treturn -EINVAL;\n\n    return 0;\n}\n\nint\nrt_ioctl_giwencodeext(struct net_device *dev,\n\t\t\t  struct iw_request_info *info,\n\t\t\t  union iwreq_data *wrqu, char *extra)\n{\n\tVOID *pAd = NULL;\n/*\tPCHAR pKey = NULL; */\n\tstruct iw_point *encoding = &wrqu->encoding;\n\tstruct iw_encode_ext *ext = (struct iw_encode_ext *)extra;\n\tint /* idx, */ max_key_len;\n\tRT_CMD_STA_IOCTL_SECURITY IoctlSec, *pIoctlSec = &IoctlSec;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n\tDBGPRINT(RT_DEBUG_TRACE ,(\"===> rt_ioctl_giwencodeext\\n\"));\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n\tmax_key_len = encoding->length - sizeof(*ext);\n\tif (max_key_len < 0)\n\t\treturn -EINVAL;\n\tmemset(ext, 0, sizeof(*ext));\n\n\n\tmemset(pIoctlSec, 0, sizeof(RT_CMD_STA_IOCTL_SECURITY));\n\tpIoctlSec->KeyIdx = encoding->flags & IW_ENCODE_INDEX;\n\tpIoctlSec->MaxKeyLen = max_key_len;\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWENCODEEXT, 0,\n\t\t\t\tpIoctlSec, 0, RT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t{\n\t\text->key_len = 0;\n\t\tRT_CMD_STATUS_TRANSLATE(pIoctlSec->Status);\n\t\treturn pIoctlSec->Status;\n\t}\n\n\tencoding->flags = pIoctlSec->KeyIdx;\n\text->key_len = pIoctlSec->length;\n\n\tif (pIoctlSec->Alg == RT_CMD_STA_IOCTL_SECURITY_ALG_NONE)\n\t\text->alg = IW_ENCODE_ALG_NONE;\n\telse if (pIoctlSec->Alg == RT_CMD_STA_IOCTL_SECURITY_ALG_WEP)\n\t\text->alg = IW_ENCODE_ALG_WEP;\n\telse if (pIoctlSec->Alg == RT_CMD_STA_IOCTL_SECURITY_ALG_TKIP)\n\t\text->alg = IW_ENCODE_ALG_TKIP;\n\telse if (pIoctlSec->Alg == RT_CMD_STA_IOCTL_SECURITY_ALG_CCMP)\n\t\text->alg = IW_ENCODE_ALG_CCMP;\n\n\tif (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_DISABLED)\n\t\tencoding->flags |= IW_ENCODE_DISABLED;\n\n\tif (ext->key_len && pIoctlSec->pData)\n\t{\n\t\tencoding->flags |= IW_ENCODE_ENABLED;\n\t\tmemcpy(ext->key, pIoctlSec->pData, ext->key_len);\n\t}\n\t\n\treturn 0;\n}\n\n#ifdef SIOCSIWGENIE\nint rt_ioctl_siwgenie(struct net_device *dev,\n\t\t\t  struct iw_request_info *info,\n\t\t\t  union iwreq_data *wrqu, char *extra)\n{\n\tVOID   *pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\t\n\t\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\t\n#ifdef WPA_SUPPLICANT_SUPPORT\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWGENIE, 0,\n\t\t\t\t\t\textra, wrqu->data.length,\n\t\t\t\t\t\tRT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t\treturn -EINVAL;\n\telse\n\t\treturn 0;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\treturn -EOPNOTSUPP;\n}\n#endif /* SIOCSIWGENIE */\n\nint rt_ioctl_giwgenie(struct net_device *dev,\n\t\t\t       struct iw_request_info *info,\n\t\t\t       union iwreq_data *wrqu, char *extra)\n{\n\tVOID   *pAd = NULL;\n\tRT_CMD_STA_IOCTL_RSN_IE IoctlRsnIe, *pIoctlRsnIe = &IoctlRsnIe;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\t\n\t\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n\n\tpIoctlRsnIe->length = wrqu->data.length;\n\tpIoctlRsnIe->pRsnIe = (UCHAR *)extra;\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWGENIE, 0,\n\t\t\t\t\t\tpIoctlRsnIe, 0,\n\t\t\t\t\t\tRT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t\treturn -E2BIG;\n\n\twrqu->data.length = pIoctlRsnIe->length;\n\treturn 0;\n}\n\nint rt_ioctl_siwpmksa(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   union iwreq_data *wrqu,\n\t\t\t   char *extra)\n{\n\tVOID   *pAd = NULL;\n\tstruct iw_pmksa *pPmksa = (struct iw_pmksa *)wrqu->data.pointer;\n/*\tINT\tCachedIdx = 0, idx = 0; */\n\tRT_CMD_STA_IOCTL_PMA_SA IoctlPmaSa, *pIoctlPmaSa = &IoctlPmaSa;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\t\n\n\t/*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n       \tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n        return -ENETDOWN;\n\t}\n\n\tif (pPmksa == NULL)\n\t\treturn -EINVAL;\n\n\tDBGPRINT(RT_DEBUG_TRACE ,(\"===> rt_ioctl_siwpmksa\\n\"));\n\n\n\tif (pPmksa->cmd == IW_PMKSA_FLUSH)\n\t\tpIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_FLUSH;\n\telse if (pPmksa->cmd == IW_PMKSA_REMOVE)\n\t\tpIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_REMOVE;\n\telse if (pPmksa->cmd == IW_PMKSA_ADD)\n\t\tpIoctlPmaSa->Cmd = RT_CMD_STA_IOCTL_PMA_SA_ADD;\n\telse\n\t\tpIoctlPmaSa->Cmd = 0;\n\tpIoctlPmaSa->pBssid = (UCHAR *)pPmksa->bssid.sa_data;\n\tpIoctlPmaSa->pPmkid = pPmksa->pmkid;\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWPMKSA, 0,\n\t\t\t\t\t\tpIoctlPmaSa, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\treturn 0;\n}\n#endif /* #if WIRELESS_EXT > 17 */\n\n#ifdef DBG\nstatic int\nrt_private_ioctl_bbp(struct net_device *dev, struct iw_request_info *info,\n\t\tstruct iw_point *wrq, char *extra)\n{\n\tRTMP_IOCTL_INPUT_STRUCT wrqin;\n\tINT\t\t\t\t\tStatus = 0;\n    VOID       \t\t\t*pAd = NULL;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\t\n\n\n\tmemset(extra, 0x00, IW_PRIV_SIZE_MASK);\n\n\twrqin.u.data.pointer = wrq->pointer;\n\twrqin.u.data.length = wrq->length;\n\n\tRTMP_STA_IoctlHandle(pAd, &wrqin, CMD_RTPRIV_IOCTL_BBP, 0,\n\t\t\t\t\t\textra, IW_PRIV_SIZE_MASK, RT_DEV_PRIV_FLAGS_GET(dev));\n\n\twrq->length = wrqin.u.data.length;\n\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==rt_private_ioctl_bbp\\n\\n\"));\t\n    \n    return Status;\n}\n#endif /* DBG */\n\nint rt_ioctl_siwrate(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n    VOID   *pAd = NULL;\n    UINT32          rate = wrqu->bitrate.value, fixed = wrqu->bitrate.fixed;\n\tRT_CMD_RATE_SET CmdRate;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n  \t\tDBGPRINT(RT_DEBUG_TRACE, (\"rt_ioctl_siwrate::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n\t}    \n\n    DBGPRINT(RT_DEBUG_TRACE, (\"rt_ioctl_siwrate::(rate = %d, fixed = %d)\\n\", rate, fixed));\n    /* rate = -1 => auto rate\n       rate = X, fixed = 1 => (fixed rate X)       \n    */\n\n\n\tCmdRate.Rate = rate;\n\tCmdRate.Fixed = fixed;\n\n\tif (RTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWRATE, 0,\n\t\t\t\t\t\t\t&CmdRate, 0,\n\t\t\t\t\t\t\tRT_DEV_PRIV_FLAGS_GET(dev)) != NDIS_STATUS_SUCCESS)\n\t\treturn -EOPNOTSUPP;\n\n    return 0;\n}\n\nint rt_ioctl_giwrate(struct net_device *dev,\n\t\t\t       struct iw_request_info *info,\n\t\t\t       union iwreq_data *wrqu, char *extra)\n{\n    VOID   *pAd = NULL;\n/*    int rate_index = 0, rate_count = 0; */\n/*    HTTRANSMIT_SETTING ht_setting; */\n\tULONG Rate;\n\n\tGET_PAD_FROM_NET_DEV(pAd, dev);\n\n    /*check if the interface is down */\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n\t{\n  \t\tDBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n    \treturn -ENETDOWN;   \n\t}\n\n\n\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWRATE, 0,\n\t\t\t\t\t\t&Rate, 0, RT_DEV_PRIV_FLAGS_GET(dev));\n\twrqu->bitrate.value = Rate;\n    wrqu->bitrate.disabled = 0;\n\n    return 0;\n}\n\n\nstatic const iw_handler rt_handler[] =\n{\n\t(iw_handler) NULL,\t\t\t            /* SIOCSIWCOMMIT */\n\t(iw_handler) rt_ioctl_giwname,\t\t\t/* SIOCGIWNAME   */\n\t(iw_handler) NULL,\t\t\t            /* SIOCSIWNWID   */\n\t(iw_handler) NULL,\t\t\t            /* SIOCGIWNWID   */\n\t(iw_handler) rt_ioctl_siwfreq,\t\t    /* SIOCSIWFREQ   */\n\t(iw_handler) rt_ioctl_giwfreq,\t\t    /* SIOCGIWFREQ   */\n\t(iw_handler) rt_ioctl_siwmode,\t\t    /* SIOCSIWMODE   */\n\t(iw_handler) rt_ioctl_giwmode,\t\t    /* SIOCGIWMODE   */\n\t(iw_handler) NULL,\t\t                /* SIOCSIWSENS   */\n\t(iw_handler) NULL,\t\t                /* SIOCGIWSENS   */\n\t(iw_handler) NULL /* not used */,\t\t/* SIOCSIWRANGE  */\n\t(iw_handler) rt_ioctl_giwrange,\t\t    /* SIOCGIWRANGE  */\n\t(iw_handler) rt_ioctl_giwpriv,\t\t/* SIOCSIWPRIV  for Android */\n\t(iw_handler) NULL /* kernel code */,    /* SIOCGIWPRIV   */\n\t(iw_handler) NULL /* not used */,\t\t/* SIOCSIWSTATS  */\n\t(iw_handler) rt28xx_get_wireless_stats /* kernel code */,    /* SIOCGIWSTATS  */\n\t(iw_handler) NULL,\t\t                /* SIOCSIWSPY    */\n\t(iw_handler) NULL,\t\t                /* SIOCGIWSPY    */\n\t(iw_handler) NULL,\t\t\t\t        /* SIOCSIWTHRSPY */\n\t(iw_handler) NULL,\t\t\t\t        /* SIOCGIWTHRSPY */\n\t(iw_handler) rt_ioctl_siwap,            /* SIOCSIWAP     */\n\t(iw_handler) rt_ioctl_giwap,\t\t    /* SIOCGIWAP     */\n#ifdef SIOCSIWMLME\n\t(iw_handler) rt_ioctl_siwmlme,\t        /* SIOCSIWMLME   */\n#else\n\t(iw_handler) NULL,\t\t\t\t        /* SIOCSIWMLME */\n#endif /* SIOCSIWMLME */\n\t(iw_handler) rt_ioctl_iwaplist,\t\t    /* SIOCGIWAPLIST */\n#ifdef SIOCGIWSCAN\n\t(iw_handler) rt_ioctl_siwscan,\t\t    /* SIOCSIWSCAN   */\n\t(iw_handler) rt_ioctl_giwscan,\t\t    /* SIOCGIWSCAN   */\n#else\n\t(iw_handler) NULL,\t\t\t\t        /* SIOCSIWSCAN   */\n\t(iw_handler) NULL,\t\t\t\t        /* SIOCGIWSCAN   */\n#endif /* SIOCGIWSCAN */\n\t(iw_handler) rt_ioctl_siwessid,\t\t    /* SIOCSIWESSID  */\n\t(iw_handler) rt_ioctl_giwessid,\t\t    /* SIOCGIWESSID  */\n\t(iw_handler) rt_ioctl_siwnickn,\t\t    /* SIOCSIWNICKN  */\n\t(iw_handler) rt_ioctl_giwnickn,\t\t    /* SIOCGIWNICKN  */\n\t(iw_handler) NULL,\t\t\t\t        /* -- hole --    */\n\t(iw_handler) NULL,\t\t\t\t        /* -- hole --    */\n\t(iw_handler) rt_ioctl_siwrate,          /* SIOCSIWRATE   */\n\t(iw_handler) rt_ioctl_giwrate,          /* SIOCGIWRATE   */\n\t(iw_handler) rt_ioctl_siwrts,\t\t    /* SIOCSIWRTS    */\n\t(iw_handler) rt_ioctl_giwrts,\t\t    /* SIOCGIWRTS    */\n\t(iw_handler) rt_ioctl_siwfrag,\t\t    /* SIOCSIWFRAG   */\n\t(iw_handler) rt_ioctl_giwfrag,\t\t    /* SIOCGIWFRAG   */\n\t(iw_handler) NULL,\t\t                /* SIOCSIWTXPOW  */\n\t(iw_handler) NULL,\t\t                /* SIOCGIWTXPOW  */\n\t(iw_handler) NULL,\t\t                /* SIOCSIWRETRY  */\n\t(iw_handler) NULL,\t\t                /* SIOCGIWRETRY  */\n\t(iw_handler) rt_ioctl_siwencode,\t\t/* SIOCSIWENCODE */\n\t(iw_handler) rt_ioctl_giwencode,\t\t/* SIOCGIWENCODE */\n\t(iw_handler) NULL,\t\t                /* SIOCSIWPOWER  */\n\t(iw_handler) NULL,\t\t                /* SIOCGIWPOWER  */\n\t(iw_handler) NULL,\t\t\t\t\t\t/* -- hole -- */\t\n\t(iw_handler) NULL,\t\t\t\t\t\t/* -- hole -- */\n#if WIRELESS_EXT > 17\t\n    (iw_handler) rt_ioctl_siwgenie,         /* SIOCSIWGENIE  */\n\t(iw_handler) rt_ioctl_giwgenie,         /* SIOCGIWGENIE  */\n\t(iw_handler) rt_ioctl_siwauth,\t\t    /* SIOCSIWAUTH   */\n\t(iw_handler) rt_ioctl_giwauth,\t\t    /* SIOCGIWAUTH   */\n\t(iw_handler) rt_ioctl_siwencodeext,\t    /* SIOCSIWENCODEEXT */\n\t(iw_handler) rt_ioctl_giwencodeext,\t\t/* SIOCGIWENCODEEXT */\n\t(iw_handler) rt_ioctl_siwpmksa,         /* SIOCSIWPMKSA  */\n#endif\n};\n\nstatic const iw_handler rt_priv_handlers[] = {\n\t(iw_handler) NULL, /* + 0x00 */\n\t(iw_handler) NULL, /* + 0x01 */\n#ifndef CONFIG_AP_SUPPORT\n\t(iw_handler) rt_ioctl_setparam, /* + 0x02 */\n#else\n\t(iw_handler) NULL, /* + 0x02 */\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef DBG\t\n\t(iw_handler) rt_private_ioctl_bbp, /* + 0x03 */\t\n#else\n\t(iw_handler) NULL, /* + 0x03 */\n#endif\n\t(iw_handler) NULL, /* + 0x04 */\n\t(iw_handler) NULL, /* + 0x05 */\n\t(iw_handler) NULL, /* + 0x06 */\n\t(iw_handler) NULL, /* + 0x07 */\n\t(iw_handler) NULL, /* + 0x08 */\n\t(iw_handler) rt_private_get_statistics, /* + 0x09 */\n\t(iw_handler) NULL, /* + 0x0A */\n\t(iw_handler) NULL, /* + 0x0B */\n\t(iw_handler) NULL, /* + 0x0C */\n\t(iw_handler) NULL, /* + 0x0D */\n\t(iw_handler) NULL, /* + 0x0E */\n\t(iw_handler) NULL, /* + 0x0F */\n\t(iw_handler) NULL, /* + 0x10 */\n\t(iw_handler) rt_private_show, /* + 0x11 */\n    (iw_handler) NULL, /* + 0x12 */\n\t(iw_handler) NULL, /* + 0x13 */\n#ifdef WSC_STA_SUPPORT\t\n\t(iw_handler) rt_private_set_wsc_u32_item, /* + 0x14 */\n#else\n    (iw_handler) NULL, /* + 0x14 */\n#endif /* WSC_STA_SUPPORT */\n\t(iw_handler) NULL, /* + 0x15 */\n#ifdef WSC_STA_SUPPORT\t\n\t(iw_handler) rt_private_set_wsc_string_item, /* + 0x16 */\n#else\n    (iw_handler) NULL, /* + 0x16 */\n#endif /* WSC_STA_SUPPORT */\n\t(iw_handler) NULL, /* + 0x17 */\n\t(iw_handler) NULL, /* + 0x18 */\n};\n\nconst struct iw_handler_def rt28xx_iw_handler_def =\n{\n#define\tN(a)\t(sizeof (a) / sizeof (a[0]))\n\t.standard\t= (iw_handler *) rt_handler,\n\t.num_standard\t= sizeof(rt_handler) / sizeof(iw_handler),\n\t.private\t= (iw_handler *) rt_priv_handlers,\n\t.num_private\t\t= N(rt_priv_handlers),\n\t.private_args\t= (struct iw_priv_args *) privtab,\n\t.num_private_args\t= N(privtab),\n#if IW_HANDLER_VERSION >= 7\n    .get_wireless_stats = rt28xx_get_wireless_stats,\n#endif \n};\n\n\nINT rt28xx_sta_ioctl(\n\tIN\tstruct net_device\t*net_dev, \n\tIN\tOUT\tstruct ifreq\t*rq, \n\tIN\tINT\t\t\t\t\tcmd)\n{\n/*\tPOS_COOKIE\t\t\tpObj; */\n\tVOID        \t\t*pAd = NULL;\n\tstruct iwreq        *wrqin = (struct iwreq *) rq;\n\tRTMP_IOCTL_INPUT_STRUCT rt_wrq, *wrq = &rt_wrq;\n/*\tBOOLEAN\t\t\t\tStateMachineTouched = FALSE; */\n\tINT\t\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\tUSHORT\t\t\t\tsubcmd;\n\tUINT32\t\t\t\torg_len;\n\n\tGET_PAD_FROM_NET_DEV(pAd, net_dev);\n\n\tif (pAd == NULL)\n\t{\n\t\t/* if 1st open fail, pAd will be free;\n\t\t   So the net_dev->priv will be NULL in 2rd open */\n\t\treturn -ENETDOWN;\n\t}\n\n\twrq->u.data.pointer = wrqin->u.data.pointer;\n\twrq->u.data.length = wrqin->u.data.length;\n\torg_len = wrq->u.data.length;\n\n/*\tpObj = (POS_COOKIE) pAd->OS_Cookie; */\n\t\n    /*check if the interface is down */\n/*    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) */\n\tif (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)\n    {\n\t    if (wrqin->u.data.pointer == NULL)\n\t    {\n\t\t    return Status;\n\t    }\n\n\t\tif (cmd != RTPRIV_IOCTL_SET)\n\t\t{\n            DBGPRINT(RT_DEBUG_TRACE, (\"INFO::Network is down!\\n\"));\n\t\t    return -ENETDOWN;  \n        }\n    }\n\n\n\n\tswitch(cmd)\n\t{\t\t\t\n\t\tcase RTPRIV_IOCTL_ATE:\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tATE is always controlled by ra0\n\t\t\t\t*/\n\t\t\t\tRTMP_COM_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_ATE, 0, wrqin->ifr_name, 0);\n\t\t\t}\n\t\t\tbreak;\n\n        case SIOCGIFHWADDR:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IOCTL::SIOCGIFHWADDR\\n\"));\n/*\t\t\tmemcpy(wrqin->u.name, pAd->CurrentAddress, ETH_ALEN); */\n\t\t\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIFHWADDR,\n\t\t\t\t\t\t\t0, wrqin->u.name, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n\t\t\tbreak;\t\n\t\tcase SIOCGIWNAME:\n        {\n        \tchar *name=&wrqin->u.name[0];\n        \trt_ioctl_giwname(net_dev, NULL, name, NULL);\n            break;\n\t\t}\n\t\tcase SIOCGIWESSID:  /*Get ESSID */\n        {\n        \tstruct iw_point *essid=&wrqin->u.essid;\n        \trt_ioctl_giwessid(net_dev, NULL, essid, essid->pointer);\n            break;\n\t\t}\n\t\tcase SIOCSIWESSID:  /*Set ESSID */\n        \t{\n        \tstruct iw_point\t*essid=&wrqin->u.essid;\n        \trt_ioctl_siwessid(net_dev, NULL, essid, essid->pointer);\n            break;  \n\t\t}\n\t\tcase SIOCSIWNWID:   /* set network id (the cell) */\n\t\tcase SIOCGIWNWID:   /* get network id */\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n\t\tcase SIOCSIWFREQ:   /*set channel/frequency (Hz) */\n        \t{\n        \tstruct iw_freq *freq=&wrqin->u.freq;\n        \trt_ioctl_siwfreq(net_dev, NULL, freq, NULL);\n\t\t\tbreak;\n\t\t}\n\t\tcase SIOCGIWFREQ:   /* get channel/frequency (Hz) */\n        \t{\n        \tstruct iw_freq *freq=&wrqin->u.freq;\n        \trt_ioctl_giwfreq(net_dev, NULL, freq, NULL);\n\t\t\tbreak;\n\t\t}\n\t\tcase SIOCSIWNICKN: /*set node name/nickname */\n        \t{\n        \t/*struct iw_point *data=&wrq->u.data; */\n        \t/*rt_ioctl_siwnickn(net_dev, NULL, data, NULL); */\n\t\t\tbreak;\n\t\t\t}\n\t\tcase SIOCGIWNICKN: /*get node name/nickname */\n        {\n\t\t\tRT_CMD_STA_IOCTL_NICK_NAME NickName, *pNickName = &NickName;\n\t\t\tCHAR nickname[IW_ESSID_MAX_SIZE+1];\n\t\t\tstruct iw_point\t*erq = NULL;\n        \terq = &wrqin->u.data;\n\n\t\t\tpNickName->NameLen = IW_ESSID_MAX_SIZE+1;\n\t\t\tpNickName->pName = (CHAR *)nickname;\n\t\t\tRTMP_STA_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCGIWNICKN, 0,\n\t\t\t\t\t\t\tpNickName, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n\n            erq->length = pNickName->NameLen; /*strlen((PSTRING) pAd->nickname); */\n            Status = copy_to_user(erq->pointer, nickname, erq->length);\n\t\t\tbreak;\n\t\t}\n\t\tcase SIOCGIWRATE:   /*get default bit rate (bps) */\n\t\t    rt_ioctl_giwrate(net_dev, NULL, &wrqin->u, NULL);\n            break;\n\t    case SIOCSIWRATE:  /*set default bit rate (bps) */\n\t        rt_ioctl_siwrate(net_dev, NULL, &wrqin->u, NULL);\n            break;\n        case SIOCGIWRTS:  /* get RTS/CTS threshold (bytes) */\n        \t{\n        \tstruct iw_param *rts=&wrqin->u.rts;\n        \trt_ioctl_giwrts(net_dev, NULL, rts, NULL);\n            break;\n\t\t}\n        case SIOCSIWRTS:  /*set RTS/CTS threshold (bytes) */\n        \t{\n        \tstruct iw_param *rts=&wrqin->u.rts;\n        \trt_ioctl_siwrts(net_dev, NULL, rts, NULL);\n            break;\n\t\t}\n        case SIOCGIWFRAG:  /*get fragmentation thr (bytes) */\n        \t{\n        \tstruct iw_param *frag=&wrqin->u.frag;\n        \trt_ioctl_giwfrag(net_dev, NULL, frag, NULL);\n            break;\n\t\t}\n        case SIOCSIWFRAG:  /*set fragmentation thr (bytes) */\n        \t{\n        \tstruct iw_param *frag=&wrqin->u.frag;\n        \trt_ioctl_siwfrag(net_dev, NULL, frag, NULL);\n            break;\n\t\t}\n        case SIOCGIWENCODE:  /*get encoding token & mode */\n        \t{\n        \tstruct iw_point *erq=&wrqin->u.encoding;\n        \tif(erq)\n        \t\trt_ioctl_giwencode(net_dev, NULL, erq, erq->pointer);\n            break;\n\t\t}\n        case SIOCSIWENCODE:  /*set encoding token & mode */\n        \t{\n        \tstruct iw_point *erq=&wrqin->u.encoding;\n        \tif(erq)\n        \t\trt_ioctl_siwencode(net_dev, NULL, erq, erq->pointer);\n            break;\n\t\t}\n\t\tcase SIOCGIWAP:     /*get access point MAC addresses */\n        \t{\n        \tstruct sockaddr *ap_addr=&wrqin->u.ap_addr;\n        \trt_ioctl_giwap(net_dev, NULL, ap_addr, ap_addr->sa_data);\n\t\t\tbreak;\n\t\t}\n\t    case SIOCSIWAP:  /*set access point MAC addresses */\n        \t{\n        \tstruct sockaddr *ap_addr=&wrqin->u.ap_addr;\n        \trt_ioctl_siwap(net_dev, NULL, ap_addr, ap_addr->sa_data);\n            break;\n\t\t}\n\t\tcase SIOCGIWMODE:   /*get operation mode */\n        \t{\n        \t__u32 *mode=&wrqin->u.mode;\n        \trt_ioctl_giwmode(net_dev, NULL, mode, NULL);\n            break;\n\t\t}\n\t\tcase SIOCSIWMODE:   /*set operation mode */\n        \t{\n        \t__u32 *mode=&wrqin->u.mode;\n        \trt_ioctl_siwmode(net_dev, NULL, mode, NULL);\n            break;\n\t\t}\n\t\tcase SIOCGIWSENS:   /*get sensitivity (dBm) */\n\t\tcase SIOCSIWSENS:\t/*set sensitivity (dBm) */\n\t\tcase SIOCGIWPOWER:  /*get Power Management settings */\n\t\tcase SIOCSIWPOWER:  /*set Power Management settings */\n\t\tcase SIOCGIWTXPOW:  /*get transmit power (dBm) */\n\t\tcase SIOCSIWTXPOW:  /*set transmit power (dBm) */\n\t\tcase SIOCGIWRANGE:\t/*Get range of parameters */\n\t\tcase SIOCGIWRETRY:\t/*get retry limits and lifetime */\n\t\tcase SIOCSIWRETRY:\t/*set retry limits and lifetime */\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n\n\t\tcase RT_PRIV_IOCTL:\n        case RT_PRIV_IOCTL_EXT:\n\t\t\tsubcmd = wrqin->u.data.flags;\n\n\t\t\tStatus = RTMP_STA_IoctlHandle(pAd, wrq, CMD_RT_PRIV_IOCTL, subcmd,\n\t\t\t\t\t\t\t\t\t\tNULL, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n\t\t\tbreak;\t\t\n\t\tcase SIOCGIWPRIV:\n\t\t\tif (wrqin->u.data.pointer) \n\t\t\t{\n\t\t\t\tif ( access_ok(VERIFY_WRITE, wrqin->u.data.pointer, sizeof(privtab)) != TRUE)\n\t\t\t\t\tbreak;\n\t\t\t\tif ((sizeof(privtab) / sizeof(privtab[0])) <= wrq->u.data.length)\n\t\t\t\t{\n\t\t\t\t\twrqin->u.data.length = sizeof(privtab) / sizeof(privtab[0]);\n\t\t\t\t\tif (copy_to_user(wrqin->u.data.pointer, privtab, sizeof(privtab)))\n\t\t\t\t\t\tStatus = -EFAULT;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tStatus = -E2BIG;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RTPRIV_IOCTL_SET:\n\t\t\tif(access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) != TRUE)   \n\t\t\t\t\tbreak;\n\t\t\treturn rt_ioctl_setparam(net_dev, NULL, NULL, wrqin->u.data.pointer);\n\t\t\tbreak;\n\t\tcase RTPRIV_IOCTL_GSITESURVEY:\n\t\t\tRTMP_STA_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SITESURVEY_GET, 0,\n\t\t\t\t\t\t\t\tNULL, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n/*\t\t\tRTMPIoctlGetSiteSurvey(pAd, wrq); */\n\t\t    break;\t\t\t\n#ifdef DBG\n\t\tcase RTPRIV_IOCTL_MAC:\n\t\t\tRTMP_STA_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_MAC, 0,\n\t\t\t\t\t\t\t\tNULL, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n/*\t\t\tRTMPIoctlMAC(pAd, wrq); */\n\t\t\tbreak;\n\t\tcase RTPRIV_IOCTL_E2P:\n\t\t\tRTMP_STA_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_E2P, 0,\n\t\t\t\t\t\t\t\tNULL, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n/*\t\t\tRTMPIoctlE2PROM(pAd, wrq); */\n\t\t\tbreak;\n\t\tcase RTPRIV_IOCTL_RF:\n\t\t\tRTMP_STA_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_RF, 0,\n\t\t\t\t\t\t\t\tNULL, 0, RT_DEV_PRIV_FLAGS_GET(net_dev));\n/*\t\t\tRTMPIoctlRF(pAd, wrq); */\n\t\t\tbreak;\n#endif /* DBG */\n\n        case SIOCETHTOOL:\n                break;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IOCTL::unknown IOCTL's cmd = 0x%08x\\n\", cmd));\n\t\t\tStatus = -EOPNOTSUPP;\n\t\t\tbreak;\n\t}\n\n/*    if(StateMachineTouched) // Upper layer sent a MLME-related operations */\n/*    \tRTMP_MLME_HANDLER(pAd); */\n\n\tif (Status != 0)\n\t{\n\t\tRT_CMD_STATUS_TRANSLATE(Status);\n\t}\n\telse\n\t{\n\t\t/*\n\t\t\tIf wrq length is modified, we reset the lenght of origin wrq;\n\n\t\t\tOr we can not modify it because the address of wrq->u.data.length\n\t\t\tmaybe same as other union field, ex: iw_range, etc.\n\n\t\t\tif the length is not changed but we change it, the value for other\n\t\t\tunion will also be changed, this is not correct.\n\t\t*/\n\t\tif (wrq->u.data.length != org_len)\n\t\t\twrqin->u.data.length = wrq->u.data.length;\n\t}\n\n\treturn Status;\n}\n\n\n"
  },
  {
    "path": "src/os/linux/usb_main_dev.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n#define RTMP_MODULE_OS\n\n/*#include \"rt_config.h\" */\n#include \"rtmp_comm.h\"\n#include \"rt_os_util.h\"\n#include \"rt_os_net.h\"\n\n\n/* Following information will be show when you run 'modinfo' */\n/* *** If you have a solution for the bug in current version of driver, please mail to me. */\n/* Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. *** */\nMODULE_LICENSE(\"GPL\");\nMODULE_AUTHOR(\"Paul Lin <paul_lin@ralinktech.com>\");\nMODULE_DESCRIPTION(\"RT2870 Wireless Lan Linux Driver\");\n\n\n#ifdef CONFIG_STA_SUPPORT\n#ifdef MODULE_VERSION\nMODULE_VERSION(STA_DRIVER_VERSION);\n#endif\n#endif /* CONFIG_STA_SUPPORT */\n\n\nextern USB_DEVICE_ID rtusb_dev_id[];\nextern INT const rtusb_usb_id_len;\n\nstatic void rt2870_disconnect(\n\tIN struct usb_device *dev, \n\tIN VOID *pAd);\n\nstatic int rt2870_probe(\n\tIN struct usb_interface *intf,\n\tIN struct usb_device *usb_dev,\n\tIN const USB_DEVICE_ID *dev_id,\n\tIN VOID **ppAd);\n\n#ifndef PF_NOFREEZE\n#define PF_NOFREEZE  0\n#endif\n\n\n/*extern int rt28xx_close(IN struct net_device *net_dev); */\n/*extern int rt28xx_open(struct net_device *net_dev); */\n\nstatic BOOLEAN USBDevConfigInit(\n\tIN struct usb_device \t*dev,\n\tIN struct usb_interface *intf, \n\tIN VOID\t\t\t\t\t*pAd);\n\t\n\nVOID RT28XXVendorSpecificCheck(\n\tIN struct usb_device \t*dev,\n\tIN VOID \t\t\t\t*pAd)\n{\n\n\n\tRT_CMD_USB_MORE_FLAG_CONFIG Config = { dev->descriptor.idVendor,\n\t\t\t\t\t\t\t\t\t\tdev->descriptor.idProduct };\n\tRTMP_DRIVER_USB_MORE_FLAG_SET(pAd, &Config);\n}\n\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)\n\n/**************************************************************************/\n/**************************************************************************/\n/*tested for kernel 2.4 series */\n/**************************************************************************/\n/**************************************************************************/\nstatic void *rtusb_probe(struct usb_device *dev, UINT interface,\n\t\t\t\t\t\tconst USB_DEVICE_ID *id_table);\nstatic void rtusb_disconnect(struct usb_device *dev, void *ptr);\n\nstruct usb_driver rtusb_driver = {\n\t\tname:RTMP_DRV_NAME,\n\t\tprobe:rtusb_probe,\n\t\tdisconnect:rtusb_disconnect,\n\t\tid_table:rtusb_dev_id,\n\t};\n\n\nstatic BOOLEAN USBDevConfigInit(\n\tIN struct usb_device *dev,\n\tIN struct usb_interface *intf, \n\tIN VOID *pAd)\n{\n\tstruct usb_interface_descriptor *iface_desc;\n\tstruct usb_endpoint_descriptor *endpoint;\n\tULONG BulkOutIdx;\n\tULONG BulkInIdx;\n\tUINT32 i;\n\tRT_CMD_USB_DEV_CONFIG Config, *pConfig = &Config;\n\n\n\tiface_desc = &intf->altsetting[0];\n\n\t/* get # of enpoints */\n\tpConfig->NumberOfPipes = iface_desc->bNumEndpoints;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"NumEndpoints=%d\\n\", iface_desc->bNumEndpoints));\t\t \n\n\t/* Configure Pipes */\n\tendpoint = &iface_desc->endpoint[0];\n\tBulkOutIdx = 0;\n\tBulkInIdx = 0;\n\n\tfor(i=0; i<pConfig->NumberOfPipes; i++)\n\t{\n\t\tif ((endpoint[i].bmAttributes == USB_ENDPOINT_XFER_BULK) && \n\t\t\t((endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN))\n\t\t{\n\t\t\tpConfig->BulkInEpAddr[BulkInIdx++] = endpoint[i].bEndpointAddress;\n\t\t\tpConfig->BulkInMaxPacketSize = endpoint[i].wMaxPacketSize;\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"BULK IN MaximumPacketSize = %d\\n\", pConfig->BulkInMaxPacketSize));\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"EP address = 0x%2x  \\n\", endpoint[i].bEndpointAddress));\n\t\t}\n\t\telse if ((endpoint[i].bmAttributes == USB_ENDPOINT_XFER_BULK) && \n\t\t\t\t((endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT))\n\t\t{\n\t\t\t/* There are 6 bulk out EP. EP6 highest priority. */\n\t\t\t/* EP1-4 is EDCA.  EP5 is HCCA. */\n\t\t\tpConfig->BulkOutEpAddr[BulkOutIdx++] = endpoint[i].bEndpointAddress;\n\t\t\tpConfig->BulkOutMaxPacketSize = endpoint[i].wMaxPacketSize;\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"BULK OUT MaximumPacketSize = %d\\n\", pConfig->BulkOutMaxPacketSize));\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"EP address = 0x%2x  \\n\", endpoint[i].bEndpointAddress));\n\t\t}\n\t}\n\n\tif (!(pConfig->BulkInEpAddr && pConfig->BulkOutEpAddr[0])) \n\t{\n\t\tprintk(\"Could not find both bulk-in and bulk-out endpoints\\n\");\n\t\treturn FALSE;\n\t}\n\n\tpConfig->pConfig = dev->config;\n\tRTMP_DRIVER_USB_CONFIG_INIT(pAd, pConfig);\n\tRT28XXVendorSpecificCheck(dev, pAd);\n\n\treturn TRUE;\n\t\n}\n\nstatic void *rtusb_probe(struct usb_device *dev, UINT interface,\n\t\t\t\t\t\tconst USB_DEVICE_ID *id)\n{\n\tstruct usb_interface *intf;\n\tVOID *pAd;\n\tint rv;\n\n\n\t/* get the active interface descriptor */\n\tintf = &dev->actconfig->interface[interface];\n\n\t/* call generic probe procedure. */\n\trv = rt2870_probe(intf, dev, id, &pAd);\n\tif (rv != 0)\n\t\tpAd = NULL;\n\t\n\treturn (void *)pAd;\n}\n\n/*Disconnect function is called within exit routine */\nstatic void rtusb_disconnect(struct usb_device *dev, void *ptr)\n{\n\trt2870_disconnect(dev, ptr);\n}\n\n\n#else\t/* else if we are kernel 2.6 series */\n\n\n/**************************************************************************/\n/**************************************************************************/\n/*tested for kernel 2.6series */\n/**************************************************************************/\n/**************************************************************************/\n\n#ifdef CONFIG_PM\n\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10)\n#define pm_message_t u32\n#endif\n\nstatic int rt2870_suspend(struct usb_interface *intf, pm_message_t state);\nstatic int rt2870_resume(struct usb_interface *intf);\n#endif /* CONFIG_PM */\n\nstatic int rtusb_probe (struct usb_interface *intf,\n\t\t\t\t\t\tconst USB_DEVICE_ID *id);\nstatic void rtusb_disconnect(struct usb_interface *intf);\n\nstatic BOOLEAN USBDevConfigInit(\n\tIN struct usb_device \t*dev,\n\tIN struct usb_interface *intf, \n\tIN VOID \t\t\t\t*pAd)\n{\n\tstruct usb_host_interface *iface_desc;\n\tULONG BulkOutIdx;\n\tULONG BulkInIdx;\n\tUINT32 i;\n\tRT_CMD_USB_DEV_CONFIG Config, *pConfig = &Config;\n\t\n\t/* get the active interface descriptor */\n\tiface_desc = intf->cur_altsetting;\n\n\t/* get # of enpoints  */\n\tpConfig->NumberOfPipes = iface_desc->desc.bNumEndpoints;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"NumEndpoints=%d\\n\", iface_desc->desc.bNumEndpoints));\t\t  \n\n\t/* Configure Pipes */\n\tBulkOutIdx = 0;\n\tBulkInIdx = 0;\n\n\tfor (i = 0; i < pConfig->NumberOfPipes; i++)\n\t{ \n\t\tif ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && \n\t\t\t((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN))\n\t\t{\n\t\t\tif (BulkInIdx < 2)\n\t\t\t{\n\t\t\t\tpConfig->BulkInEpAddr[BulkInIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress;\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)\n\t\t\t\tpConfig->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize);\n#else\n\t\t\t\tpConfig->BulkInMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize;\n#endif /* LINUX_VERSION_CODE */\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"BULK IN MaxPacketSize = %d\\n\", pConfig->BulkInMaxPacketSize));\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"EP address = 0x%2x\\n\", iface_desc->endpoint[i].desc.bEndpointAddress));\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Bulk IN endpoint nums large than 2\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) && \n\t\t\t\t((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT))\n\t\t{\n\t\t\tif (BulkOutIdx < 6)\n\t\t\t{\n\t\t\t\t/* there are 6 bulk out EP. EP6 highest priority. */\n\t\t\t\t/* EP1-4 is EDCA.  EP5 is HCCA. */\n\t\t\t\tpConfig->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress;\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)\n\t\t\t\tpConfig->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize);\n#else\n\t\t\t\tpConfig->BulkOutMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize;\n#endif\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"BULK OUT MaxPacketSize = %d\\n\", pConfig->BulkOutMaxPacketSize));\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"EP address = 0x%2x  \\n\", iface_desc->endpoint[i].desc.bEndpointAddress));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Bulk Out endpoint nums large than 6\\n\"));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!(pConfig->BulkInEpAddr && pConfig->BulkOutEpAddr[0])) \n\t{\n\t\tprintk(\"%s: Could not find both bulk-in and bulk-out endpoints\\n\", __FUNCTION__);\n\t\treturn FALSE;\n\t}\n\n\tpConfig->pConfig = &dev->config->desc;\n\tusb_set_intfdata(intf, pAd);\n\tRTMP_DRIVER_USB_CONFIG_INIT(pAd, pConfig);\n\tRT28XXVendorSpecificCheck(dev, pAd);    \n\t\n\treturn TRUE;\n\t\n}\n\n\n\nstatic int rtusb_probe (struct usb_interface *intf,\n\t\t\t\t\t\tconst USB_DEVICE_ID *id)\n{\t\n\tVOID *pAd;\n\tstruct usb_device *dev;\n\tint rv;\n\n\tdev = interface_to_usbdev(intf);\n\tdev = usb_get_dev(dev);\n\t\n\trv = rt2870_probe(intf, dev, id, &pAd);\n\tif (rv != 0)\n\t{\n\t\tusb_put_dev(dev);\n\t}\n#ifdef IFUP_IN_PROBE\n\telse\n\t{\n\t\tif (VIRTUAL_IF_UP(pAd) != 0)\n\t\t{\n\t\t\tpAd = usb_get_intfdata(intf);\n\t\t\tusb_set_intfdata(intf, NULL);\n\t\t\trt2870_disconnect(dev, pAd);\n\t\t\trv = -ENOMEM;\n\t\t}\n\t}\n#endif /* IFUP_IN_PROBE */\t\n\treturn rv;\n}\n\n\nstatic void rtusb_disconnect(struct usb_interface *intf)\n{\n\tstruct usb_device   *dev = interface_to_usbdev(intf);\n\tVOID\t\t\t\t*pAd;\n\n\n\tpAd = usb_get_intfdata(intf);\n#ifdef IFUP_IN_PROBE\t\n\tVIRTUAL_IF_DOWN(pAd);\n#endif /* IFUP_IN_PROBE */\t\n\tusb_set_intfdata(intf, NULL);\t\n\n\trt2870_disconnect(dev, pAd);\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tprintk(\"rtusb_disconnect usb_autopm_put_interface \\n\");\n\tusb_autopm_put_interface(intf);\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)\t \n\tprintk(\" ^^rt2870_disconnect ====> pm_usage_cnt %d \\n\", atomic_read(&intf->pm_usage_cnt));\n#else\n\tprintk(\" rt2870_disconnect ====> pm_usage_cnt %d \\n\", intf->pm_usage_cnt);\n#endif\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n}\n\n\nstruct usb_driver rtusb_driver = {\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)\n\t.owner = THIS_MODULE,\n#endif\t\n\t.name=RTMP_DRV_NAME,\n\t.probe=rtusb_probe,\n\t.disconnect=rtusb_disconnect,\n\t.id_table=rtusb_dev_id,\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\t.supports_autosuspend = 1,\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n\tsuspend:\trt2870_suspend,\n\tresume:\t\trt2870_resume,\n#endif /* CONFIG_PM */\n\t.supports_autosuspend = 1,\n\t};\n\n#ifdef CONFIG_PM\n\nVOID RT2870RejectPendingPackets(\n\tIN\tVOID\t*pAd)\n{\n\t/* clear PS packets */\n\t/* clear TxSw packets */\n}\n\nstatic int rt2870_suspend(\n\tstruct usb_interface *intf,\n\tpm_message_t state)\n{\n\tstruct net_device *net_dev;\n\tVOID *pAd = usb_get_intfdata(intf);\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tUCHAR Flag;\n\n\tRTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(pAd, &Flag);\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> rt2870_suspend()\\n\"));\n\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tUCHAR Flag;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"autosuspend===> rt2870_suspend()\\n\"));\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tif (Flag == FALSE)\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\t{\n/*\tif(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) */\n\t\tRTMP_DRIVER_ADAPTER_END_DISSASSOCIATE(pAd);\n\t\tRTMP_DRIVER_ADAPTER_IDLE_RADIO_OFF_TEST(pAd, &Flag);\n\t\tif(!Flag)\n\t\t{\n\t\t\t/*RT28xxUsbAsicRadioOff(pAd); */\n\t\t\tRTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_OFF(pAd);\n\t\t}\n\t}\n\t/*RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND); */\n\tRTMP_DRIVER_ADAPTER_SUSPEND_SET(pAd);\n\treturn 0;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n\n\n#ifdef CONFIG_STA_SUPPORT\n\t//RTMP_DRIVER_ADAPTER_END_DISSASSOCIATE(pAd);\n#endif\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tif (Flag == TRUE)\n\t\tRTMP_DRIVER_ADAPTER_RT28XX_WOW_ENABLE(pAd);\n\telse\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\t{\n\tRTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_OFF(pAd);\n\tRTMP_DRIVER_ADAPTER_SUSPEND_SET(pAd);\n\t}\n\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== rt2870_suspend()\\n\"));\n\treturn 0;\n}\n\nstatic int rt2870_resume(\n\tstruct usb_interface *intf)\n{\n\tstruct net_device *net_dev;\n\tVOID *pAd = usb_get_intfdata(intf);\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tUCHAR Flag;\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tINT \t\tpm_usage_cnt;\n\tUCHAR Flag;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tRTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(pAd, &Flag);\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)\n\tpm_usage_cnt = atomic_read(&intf->pm_usage_cnt);\t\n#else\n\tpm_usage_cnt = intf->pm_usage_cnt;\n#endif\n\n\tif(pm_usage_cnt  <= 0)\n\t\tusb_autopm_get_interface(intf);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"autosuspend===> rt2870_resume()\\n\"));\n\n\t/*RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND); */\n\tRTMP_DRIVER_ADAPTER_SUSPEND_CLEAR(pAd);\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tif (Flag == FALSE)\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\t\t/*RT28xxUsbAsicRadioOn(pAd); */\n\t\tRTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_ON(pAd);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"autosuspend<===  rt2870_resume()\\n\"));\n\n\treturn 0;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===> rt2870_resume()\\n\"));\n\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\tif (Flag == TRUE)\n\t\tRTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE(pAd);\n\telse\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\t{\n\tRTMP_DRIVER_ADAPTER_SUSPEND_CLEAR(pAd);\n\tRTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_ON(pAd);\n\t}\n\n\n\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<=== rt2870_resume()\\n\"));\n\treturn 0;\n}\n#endif /* CONFIG_PM */\n#endif /* LINUX_VERSION_CODE */\n\n\n/* Init driver module */\nINT __init rtusb_init(void)\n{\n\tprintk(\"rtusb init %s --->\\n\", RTMP_DRV_NAME);\n\treturn usb_register(&rtusb_driver);\n}\n\n/* Deinit driver module */\nVOID __exit rtusb_exit(void)\n{\n\tusb_deregister(&rtusb_driver);\t\n\tprintk(\"<--- rtusb exit\\n\");\n}\n\nmodule_init(rtusb_init);\nmodule_exit(rtusb_exit);\n\n\n\n\n/*---------------------------------------------------------------------\t*/\n/* function declarations\t\t\t\t\t\t\t\t\t\t\t\t*/\n/*---------------------------------------------------------------------\t*/\n\n\n\n/*\n========================================================================\nRoutine Description:\n    Release allocated resources.\n\nArguments:\n    *dev\t\t\t\tPoint to the PCI or USB device\n\tpAd\t\t\t\t\tdriver control block pointer\n\nReturn Value:\n    None\n\nNote:\n========================================================================\n*/\nstatic void rt2870_disconnect(struct usb_device *dev, VOID *pAd)\n{\n\tstruct net_device *net_dev;\n\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"rtusb_disconnect: unregister usbnet usb-%s-%s\\n\",\n\t\t\t\tdev->bus->bus_name, dev->devpath));\n\tif (!pAd)\n\t{\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)\t/* kernel 2.4 series */\n\t\twhile(MOD_IN_USE > 0)\n\t\t{\n\t\t\tMOD_DEC_USE_COUNT;\n\t\t}\n#else\n\t\tusb_put_dev(dev);\n#endif /* LINUX_VERSION_CODE */\n\n\t\tprintk(\"rtusb_disconnect: pAd == NULL!\\n\");\n\t\treturn;\n\t}\n/*\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); */\n\tRTMP_DRIVER_NIC_NOT_EXIST_SET(pAd);\n\n\t/* for debug, wait to show some messages to /proc system */\n\tudelay(1);\n\n\n\tRTMP_DRIVER_NET_DEV_GET(pAd, &net_dev);\n\n\tRtmpPhyNetDevExit(pAd, net_dev);\n\n\t/* FIXME: Shall we need following delay and flush the schedule?? */\n\tudelay(1);\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)\t/* kernel 2.4 series */\n#else\n\tflush_scheduled_work();\n#endif /* LINUX_VERSION_CODE */\n\tudelay(1);\n\n#ifdef RT_CFG80211_SUPPORT\n\tRTMP_DRIVER_80211_UNREGISTER(pAd, net_dev);\n#endif /* RT_CFG80211_SUPPORT */\n\n\t/* free the root net_device */\n//\tRtmpOSNetDevFree(net_dev);\n\n\tRtmpRaDevCtrlExit(pAd);\n\n\t/* free the root net_device */\n\tRtmpOSNetDevFree(net_dev);\n\n\t/* release a use of the usb device structure */\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)\t/* kernel 2.4 series */\n\twhile(MOD_IN_USE > 0)\n\t{\n\t\tMOD_DEC_USE_COUNT;\n\t}\n#else\n\tusb_put_dev(dev);\n#endif /* LINUX_VERSION_CODE */\n\tudelay(1);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\" RTUSB disconnect successfully\\n\"));\n}\n\n\nstatic int rt2870_probe(\n\tIN struct usb_interface *intf,\n\tIN struct usb_device *usb_dev,\n\tIN const USB_DEVICE_ID *dev_id,\n\tIN VOID **ppAd)\n{\n\tstruct  net_device\t\t*net_dev = NULL;\n\tVOID       \t\t\t\t*pAd = (VOID *) NULL;\n\tINT                 \tstatus, rv;\n\tPVOID\t\t\t\t\thandle;\n\tRTMP_OS_NETDEV_OP_HOOK\tnetDevHook;\n\tULONG\t\t\t\t\tOpMode;\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n/*\tINT \t\tpm_usage_cnt; */\n\tINT\t\t res =1 ; \n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===>rt2870_probe()!\\n\"));\n\t\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\n        res = usb_autopm_get_interface(intf);\n\tif (res)\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"rt2870_probe autopm_resume fail ------\\n\"));\n\t\t     return -EIO;\n\t}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)\n\tatomic_set(&intf->pm_usage_cnt, 1);\n\t printk(\" rt2870_probe ====> pm_usage_cnt %d \\n\", atomic_read(&intf->pm_usage_cnt));\n#else\n         intf->pm_usage_cnt = 1;\n\t printk(\" rt2870_probe ====> pm_usage_cnt %d \\n\", intf->pm_usage_cnt);\n#endif\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n/*RtmpDevInit============================================= */\n\t/* Allocate RTMP_ADAPTER adapter structure */\n/*\thandle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); */\n\tos_alloc_mem(NULL, (UCHAR **)&handle, sizeof(struct os_cookie));\n\tif (handle == NULL)\n\t{\n\t\tprintk(\"rt2870_probe(): Allocate memory for os handle failed!\\n\");\n\t\treturn -ENOMEM;\n\t}\n\tmemset(handle, 0, sizeof(struct os_cookie));\n\n\t((POS_COOKIE)handle)->pUsb_Dev = usb_dev;\n\n#ifdef CONFIG_STA_SUPPORT\n\t((POS_COOKIE)handle)->intf = intf;\n#endif /* CONFIG_STA_SUPPORT */\n\n\t/* set/get operators to/from DRIVER module */\n#ifdef OS_ABL_FUNC_SUPPORT\n\t/* get DRIVER operations */\n\tRtmpNetOpsInit(pRtmpDrvNetOps);\n\tRTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, pRtmpDrvNetOps, NULL, NULL);\n\tRtmpNetOpsSet(pRtmpDrvNetOps);\n#endif /* OS_ABL_FUNC_SUPPORT */\n\n\trv = RTMPAllocAdapterBlock(handle, &pAd);\n\tif (rv != NDIS_STATUS_SUCCESS) \n\t{\n/*\t\tkfree(handle); */\n\t\tos_free_mem(NULL, handle);\n\t\tgoto err_out;\n\t}\n\n/*USBDevInit============================================== */\n\tif (USBDevConfigInit(usb_dev, intf, pAd) == FALSE)\n\t\tgoto err_out_free_radev;\n\n\tRtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_USB);\n\t\n/*NetDevInit============================================== */\n\tnet_dev = RtmpPhyNetDevInit(pAd, &netDevHook);\n\tif (net_dev == NULL)\n\t\tgoto err_out_free_radev;\n\t\n\t/* Here are the net_device structure with usb specific parameters. */\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t/* for supporting Network Manager.\n\t  * Set the sysfs physical device reference for the network logical device if set prior to registration will \n\t  * cause a symlink during initialization.\n\t */\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))\n\tSET_NETDEV_DEV(net_dev, &(usb_dev->dev));\n#endif\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n/*    pAd->StaCfg.OriDevType = net_dev->type; */\n\tRTMP_DRIVER_STA_DEV_TYPE_SET(pAd, net_dev->type);\n#endif /* CONFIG_STA_SUPPORT */\n\n/*All done, it's time to register the net device to linux kernel. */\n\t/* Register this device */\n#ifdef RT_CFG80211_SUPPORT\n{\n/*\tpAd->pCfgDev = &(usb_dev->dev); */\n/*\tpAd->CFG80211_Register = CFG80211_Register; */\n/*\tRTMP_DRIVER_CFG80211_INIT(pAd, usb_dev); */\n\n\t/*\n\t\tIn 2.6.32, cfg80211 register must be before register_netdevice();\n\t\tWe can not put the register in rt28xx_open();\n\t\tOr you will suffer NULL pointer in list_add of\n\t\tcfg80211_netdev_notifier_call().\n\t*/\n\tCFG80211_Register(pAd, &(usb_dev->dev), net_dev);\n}\n#endif /* RT_CFG80211_SUPPORT */\n\n\tRTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);\n\tstatus = RtmpOSNetDevAttach(OpMode, net_dev, &netDevHook);\n\tif (status != 0)\n\t\tgoto err_out_free_netdev;\n\n/*#ifdef KTHREAD_SUPPORT */\n\n\t*ppAd = pAd;\n\n#ifdef INF_PPA_SUPPORT\n/*\tpAd->pDirectpathCb = (PPA_DIRECTPATH_CB *) kmalloc (sizeof(PPA_DIRECTPATH_CB), GFP_ATOMIC); */\n/*\tos_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB)); */\n\tRTMP_DRIVER_INF_PPA_INIT(pAd);\n#endif /* INF_PPA_SUPPORT */\n\n#ifdef PRE_ASSIGN_MAC_ADDR\n\tUCHAR PermanentAddress[MAC_ADDR_LEN];\n\tRTMP_DRIVER_MAC_ADDR_GET(pAd, &PermanentAddress[0]);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"@%s MAC address: %02x:%02x:%02x:%02x:%02x:%02x\\n\", __FUNCTION__, PermanentAddress[0], PermanentAddress[1],PermanentAddress[2],PermanentAddress[3],PermanentAddress[4],PermanentAddress[5]));\n\t/* Set up the Mac address */\n\tRtmpOSNetDevAddrSet(OpMode, net_dev, &PermanentAddress[0], NULL);\n#endif /* PRE_ASSIGN_MAC_ADDR */\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\tRTMP_DRIVER_SET_PRECONFIG_VALUE(pAd);\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<===rt2870_probe()!\\n\"));\n\n\treturn 0;\n\n\t/* --------------------------- ERROR HANDLE --------------------------- */\t\nerr_out_free_netdev:\n\tRtmpOSNetDevFree(net_dev);\n\t\nerr_out_free_radev:\n\tRTMPFreeAdapter(pAd);\n\t\nerr_out:\n\t*ppAd = NULL;\n\n\treturn -1;\n\t\n}\n\n\n#ifdef OS_ABL_SUPPORT\n/* USB complete handlers in LINUX */\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutDataPacketComplete = NULL;\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutMLMEPacketComplete = NULL;\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutNullFrameComplete = NULL;\n#ifdef CONFIG_MULTI_CHANNEL\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutHCCANullFrameComplete = NULL;\n#endif /* CONFIG_MULTI_CHANNEL */\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutRTSFrameComplete = NULL;\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutPsPollComplete = NULL;\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkRxComplete = NULL;\nRTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkCmdRspEventComplete = NULL;\n\nUSBHST_STATUS RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkOutDataPacketComplete((VOID *)pURB);\n}\n\nUSBHST_STATUS RTUSBBulkOutMLMEPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkOutMLMEPacketComplete((VOID *)pURB);\n}\n\nUSBHST_STATUS RTUSBBulkOutNullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkOutNullFrameComplete((VOID *)pURB);\n}\n\n#ifdef CONFIG_MULTI_CHANNEL\nUSBHST_STATUS RTUSBBulkOutHCCANullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkOutHCCANullFrameComplete((VOID *)pURB);\n}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\nUSBHST_STATUS RTUSBBulkOutRTSFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkOutRTSFrameComplete((VOID *)pURB);\n}\n\nUSBHST_STATUS RTUSBBulkOutPsPollComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkOutPsPollComplete((VOID *)pURB);\n}\n\nUSBHST_STATUS RTUSBBulkRxComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkRxComplete((VOID *)pURB);\n}\n\nUSBHST_STATUS RTUSBBulkCmdRspEventComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)\n{\n\tRtmpDrvUsbBulkCmdRspEventComplete((VOID *)pURB);\n}\n\nVOID RtmpNetOpsInit(\n\tIN VOID\t\t\t*pDrvNetOpsSrc)\n{\n\tRTMP_NET_ABL_OPS *pDrvNetOps = (RTMP_NET_ABL_OPS *)pDrvNetOpsSrc;\n\n\n\tpDrvNetOps->RtmpNetUsbBulkOutDataPacketComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutDataPacketComplete;\n\tpDrvNetOps->RtmpNetUsbBulkOutMLMEPacketComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutMLMEPacketComplete;\n\tpDrvNetOps->RtmpNetUsbBulkOutNullFrameComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutNullFrameComplete;\n#ifdef CONFIG_MULTI_CHANNEL\n\tpDrvNetOps->RtmpNetUsbBulkOutHCCANullFrameComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutHCCANullFrameComplete;\n#endif /* CONFIG_MULTI_CHANNEL */\n\tpDrvNetOps->RtmpNetUsbBulkOutRTSFrameComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutRTSFrameComplete;\n\tpDrvNetOps->RtmpNetUsbBulkOutPsPollComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutPsPollComplete;\n\tpDrvNetOps->RtmpNetUsbBulkRxComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkRxComplete;\n\tpDrvNetOps->RtmpNetUsbBulkCmdRspEventComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkCmdRspEventComplete;\n}\n\n\nVOID RtmpNetOpsSet(\n\tIN VOID\t\t\t*pDrvNetOpsSrc)\n{\n\tRTMP_NET_ABL_OPS *pDrvNetOps = (RTMP_NET_ABL_OPS *)pDrvNetOpsSrc;\n\n\n\tRtmpDrvUsbBulkOutDataPacketComplete = pDrvNetOps->RtmpDrvUsbBulkOutDataPacketComplete;\n\tRtmpDrvUsbBulkOutMLMEPacketComplete = pDrvNetOps->RtmpDrvUsbBulkOutMLMEPacketComplete;\n\tRtmpDrvUsbBulkOutNullFrameComplete = pDrvNetOps->RtmpDrvUsbBulkOutNullFrameComplete;\n#ifdef CONFIG_MULTI_CHANNEL\n\tRtmpDrvUsbBulkOutHCCANullFrameComplete = pDrvNetOps->RtmpDrvUsbBulkOutHCCANullFrameComplete;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\tRtmpDrvUsbBulkOutRTSFrameComplete = pDrvNetOps->RtmpDrvUsbBulkOutRTSFrameComplete;\n\tRtmpDrvUsbBulkOutPsPollComplete = pDrvNetOps->RtmpDrvUsbBulkOutPsPollComplete;\n\tRtmpDrvUsbBulkRxComplete = pDrvNetOps->RtmpDrvUsbBulkRxComplete;\n\tRtmpDrvUsbBulkCmdRspEventComplete = pDrvNetOps->RtmpDrvUsbBulkCmdRspEventComplete;\n}\n#endif /* OS_ABL_SUPPORT */\n"
  },
  {
    "path": "src/os/linux/vr_ikans.c",
    "content": "/****************************************************************************\n\n    Module Name:\n    vr_ikans.c\n \n    Abstract:\n    Only for IKANOS Vx160 or Vx180 platform.\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Sample Lin\t01-28-2008    Created\n\n***************************************************************************/\n\n#define RTMP_MODULE_OS\n#define RTMP_MODULE_OS_UTIL\n\n#define MODULE_IKANOS\n\n#include \"rt_config.h\"\n#include <linux/config.h>\n#include <linux/version.h>\n#include <linux/module.h>\n#include <linux/skbuff.h>\n#include <linux/netdevice.h>\n#include <netpro/apprehdr.h>\n\n\n#ifdef IKANOS_VX_1X0\n\n#define IKANOS_PERAP_ID\t\t7 /* IKANOS Fix Peripheral ID */\n#define K0_TO_K1(x)\t\t\t((unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */\n/*#define IKANOS_DEBUG */\n\n\nextern INT rt28xx_send_packets(\n\tIN struct sk_buff\t\t*skb_p,\n\tIN struct net_device\t*net_dev);\n\nstatic INT32 IKANOS_WlanDataFramesTx(\n\tIN void\t\t\t\t\t*_pAdBuf,\n\tIN struct net_device\t*pNetDev);\n\nstatic void IKANOS_WlanPktFromAp(\n\tIN apPreHeader_t \t\t*pFrame);\n\nstatic INT32 GetSpecInfoIdxFromBssid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT32 FromWhichBSSID);\n\n\n\n\n/* --------------------------------- Public -------------------------------- */\n\n/*\n========================================================================\nRoutine Description:\n\tInit IKANOS fast path function.\n\nArguments:\n\tpApMac\t\t\t- the MAC of AP\n\nReturn Value:\n\tNone\n\nNote:\n\tIf you want to enable RX fast path, you must call the function.\n========================================================================\n*/\nvoid VR_IKANOS_FP_Init(\n\tIN UINT8 BssNum,\n\tIN UINT8 *pApMac)\n{\n\tUINT32 i;\n\tUINT8 mac[6];\n\n\n\tmemcpy(mac, pApMac, 6);\n\n\t/* add all MAC of multiple BSS */\n\tfor(i=0; i<BssNum; i++)\n\t{\n\t\tapMacAddrConfig(7, mac, 0xAD);\n\t\tmac[5] ++;\n\t} /* End of for */\n} /* End of VR_IKANOS_FP_Init */\n\n\n/*\n========================================================================\nRoutine Description:\n\tIkanos LAN --> WLAN transmit fast path function.\n\nArguments:\n\tskb\t\t\t\t- the transmitted packet (SKB packet format)\n\tnetdev\t\t\t- our WLAN network device\n\nReturn Value:\n\t\n\nNote:\n========================================================================\n*/\nINT32 IKANOS_DataFramesTx(\n\tIN struct sk_buff\t\t*pSkb,\n\tIN struct net_device\t*pNetDev)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pNetDev->priv;\n\tIkanosWlanTxCbFuncP *fp = &IKANOS_WlanDataFramesTx;\n\n\tpSkb->apFlowData.txDev = pNetDev;\n\tpSkb->apFlowData.txApId = IKANOS_PERAP_ID;\n\tpAd->IkanosTxInfo.netdev = pNetDev;\n\tpAd->IkanosTxInfo.fp = fp;\n\tpSkb->apFlowData.txHandle = &(pAd->IkanosTxInfo);\n\tap2apFlowProcess(pSkb, pNetDev);\n\n#ifdef IKANOS_DEBUG\n\tprintk(\"ikanos> tx no fp\\n\"); /* debug use */\n#endif /* IKANOS_DEBUG */\n\n\treturn rt28xx_send_packets(pSkb, pNetDev);\n} /* End of IKANOS_DataFramesTx */\n\n\n/*\n========================================================================\nRoutine Description:\n\tIkanos WLAN --> LAN transmit fast path function.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block\n\tpRxParam\t\t-\n\tpSkb\t\t\t- the transmitted packet (SKB packet format)\n\tLength\t\t\t- packet length\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\n/* Note: because no unsigned long private parameters in apPreHeader_t can be used,\n\twe use a global variable to record pAd.\n\tSo we can not use multiple card function in Ikanos platform. */\nPRTMP_ADAPTER\tpIkanosAd;\n\nvoid IKANOS_DataFrameRx(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN struct sk_buff\t*pSkb)\n{\n    apPreHeader_t *apBuf;\n\tvoid *pRxParam = pSkb->dev;\n\tUINT32 Length = pSkb->len;\n\n\n    apBuf = (apPreHeader_t *)(translateMbuf2Apbuf(pSkb, 0));\n\n    apBuf->flags1 = 1 << AP_FLAG1_IS_ETH_BIT;\n    apBuf->specInfoElement = RTMP_GET_PACKET_NET_DEVICE_MBSSID(pSkb); /* MBSS */\n\tpIkanosAd = pAd;\n\n/*  apBuf->egressList[0].pEgress = NULL; */\n/*  apBuf->egressList[0].pFlowID = NULL; */\n    apBuf->flags2 = 0;\n\n    apClassify(IKANOS_PERAP_ID, apBuf, (void *)IKANOS_WlanPktFromAp);\n    dev_kfree_skb(pSkb); \n} /* End of IKANOS_DataFrameRx */\n\n\n\n\n/* --------------------------------- Private -------------------------------- */\n\n/*\n========================================================================\nRoutine Description:\n\tIkanos LAN --> WLAN transmit fast path function.\n\nArguments:\n\t_pAdBuf\t\t\t- the transmitted packet (Ikanos packet format)\n\tnetdev\t\t\t- our WLAN network device\n\nReturn Value:\n\t\n\nNote:\n========================================================================\n*/\nstatic INT32 IKANOS_WlanDataFramesTx(\n\tIN void\t\t\t\t\t*_pAdBuf,\n\tIN struct net_device\t*pNetDev)\n{\n\tapPreHeader_t *pApBuf = (apPreHeader_t *)_pAdBuf;\n\tstruct sk_buff *sk = NULL;\n\n\tsk = (struct sk_buff *)translateApbuf2Mbuf(pApBuf);\n\tif (sk == NULL)\n\t{\n\t\tprintk(\"ikanos> translateApbuf2Mbuf returned NULL!\\n\");\n\t\treturn 1;\n\t} /* End of if */\n\n\tsk->apFlowData.flags2 = 0;\n\tsk->apFlowData.wlanFlags = 0;\n\tsk->protocol = ETH_P_IP;\n\tsk->dev = pNetDev;\n\tsk->priority = 0;\n\n\treturn rt28xx_send_packets(sk, pNetDev);\n} /* End of IKANOS_WlanDataFramesTx */\n\n\nstatic INT32 GetSpecInfoIdxFromBssid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT32 FromWhichBSSID)\n{\n\tINT32 IfIdx = MAIN_MBSSID;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\n\t\t\tIfIdx = MAX_MBSSID_NUM(pAd) + MAX_WDS_ENTRY;\n\t\t} \n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tIfIdx = FromWhichBSSID;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tIfIdx = MAIN_MBSSID;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn IfIdx; /* return one of MBSS */\n}\n\n/*\n========================================================================\nRoutine Description:\n\tGet real interface index, used in get_netdev_from_bssid()\n\nArguments:\n\tpAd\t\t\t\t- \n\tFromWhichBSSID\t- \n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic INT32 GetSpecInfoIdxFromBssid(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN INT32\t\t\tFromWhichBSSID)\n{\n\tINT32 IfIdx = MAIN_MBSSID;\n\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n#ifdef APCLI_SUPPORT\n\t\tif(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)\n\t\t{\n\t\t\tIfIdx = MAX_MBSSID_NUM(pAd) + MAX_WDS_ENTRY;\n\t\t}\n\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t{\n\t\t\tIfIdx = FromWhichBSSID;\n\t\t}\n\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tIfIdx = MAIN_MBSSID;\n\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn IfIdx; /* return one of MBSS */\n} /* End of GetSpecInfoIdxFromBssid */\n\n\n/*\n========================================================================\nRoutine Description:\n\tIkanos WLAN --> LAN transmit fast path function.\n\nArguments:\n\tpFrame\t\t\t- the received packet (Ikanos packet format)\n\nReturn Value:\n\tNone\n\nNote:\n\tIkanos platform supports only 8 VAPs\n========================================================================\n*/\nstatic void IKANOS_WlanPktFromAp(\n\tIN apPreHeader_t\t\t*pFrame)\n{\n\tPRTMP_ADAPTER pAd;\n    struct net_device *dev = NULL;\n    struct sk_buff *skb;\n    INT32 index;\n    apPreHeader_t *apBuf = K0_TO_K1(pFrame);\n\n\n\tpAd = pIkanosAd;\n    /*index = apBuf->specInfoElement; */\n\t/*dev = pAd->ApCfg.MBSSID[index].MSSIDDev; */\n\tindex = GetSpecInfoIdxFromBssid(pAd, apBuf->specInfoElement);\n\tdev = get_netdev_from_bssid(pAd, apBuf->specInfoElement);\n    if (dev == NULL)\n    {\n        printk(\"ikanos> %s: ERROR null device ***************\\n\", __FUNCTION__);\n        return;\n    } /* End of if */\n\n    skb = (struct sk_buff *)translateApbuf2Mbuf(apBuf);\n    if (NULL == skb)\n    {\n        printk(\"ikanos> %s: skb is null *********************\\n\", __FUNCTION__);\n        return;\n    } /* End of if */\n\n    pAd->IkanosRxInfo[index].netdev = dev;\n    pAd->IkanosRxInfo[index].fp = &IKANOS_WlanDataFramesTx;\n\n    skb->dev = dev;\n    skb->apFlowData.rxApId = IKANOS_PERAP_ID;\n    /*skb->apFlowData.txHandle = &(txinforx[index]); */\n    skb->apFlowData.rxHandle = &(pAd->IkanosRxInfo[index]);\n    skb->protocol = eth_type_trans(skb, skb->dev);\n\n#ifdef IKANOS_DEBUG\n\tprintk(\"ikanos> rx no fp!\\n\"); /* debug use */\n#endif /* IKANOS_DEBUG */\n\n    netif_rx(skb);\n    return;\n} /* End of IKANOS_WlanPktFromAp */\n\n#endif /* IKANOS_VX_1X0 */\n\n/* End of vr_ikans.c */\n"
  },
  {
    "path": "src/phy/rlt_phy.c",
    "content": "/*\n\n*/\n\n\n#include \"rt_config.h\"\n\n\n#ifdef RLT_MAC\n\n#ifndef MT7601\n\nNDIS_STATUS NICInitBBP(RTMP_ADAPTER *pAd)\n{\n\tINT idx;\n\t\n\t/* Read BBP register, make sure BBP is up and running before write new data*/\n\tif (rlt_bbp_is_ready(pAd) == FALSE)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\t/* re-config specific BBP registers for individual chip */\n\tif (pAd->chipCap.pBBPRegTable)\n\t{\n\t\tRTMP_REG_PAIR *reg = (RTMP_REG_PAIR *)pAd->chipCap.pBBPRegTable;\n\t\t\n\t\tfor (idx = 0; idx < pAd->chipCap.bbpRegTbSize; idx++)\n\t\t{\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, reg[idx].Register, reg[idx].Value);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP[%x]=0x%x\\n\", \n\t\t\t\t\treg[idx].Register, reg[idx].Value));\n\t\t}\n\t}\n\n\tif (pAd->chipOps.AsicBbpInit != NULL)\n\t\tpAd->chipOps.AsicBbpInit(pAd);\n\n\t// TODO: shiang-6590, check these bbp registers if need to remap to new BBP_Registers\n\n\treturn NDIS_STATUS_SUCCESS;\n\t\n}\n\n\nINT rtmp_bbp_set_txdac(struct _RTMP_ADAPTER *pAd, INT tx_dac)\n{\n\tUINT32 txbe, txbe_r5 = 0;\n\t\n\tRTMP_BBP_IO_READ32(pAd, TXBE_R5, &txbe_r5);\n\ttxbe = txbe_r5 & (~0x3);\n\tswitch (tx_dac)\n\t{\n\t\tcase 2:\n\t\t\ttxbe |= 0x3;\n\t\t\tbreak;\n\t\tcase 1:\n\t\tcase 0:\n\t\tdefault:\t\t\n\t\t\ttxbe &= (~0x3);\n\t\t\tbreak;\n\t}\n\n\tif (txbe != txbe_r5)\n\t\tRTMP_BBP_IO_WRITE32(pAd, TXBE_R5, txbe);\n\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_rxpath(struct _RTMP_ADAPTER *pAd, INT rxpath)\n{\n\tUINT32 agc, agc_r0 = 0;\n\n\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &agc_r0);\n\tagc = agc_r0 & (~0x18);\n\tif(rxpath == 2)\n\t\tagc |= (0x8);\n\telse if(rxpath == 1)\n\t\tagc |= (0x0);\n\n\tif (agc != agc_r0)\n\t\tRTMP_BBP_IO_WRITE32(pAd, AGC1_R0, agc);\n\n//DBGPRINT(RT_DEBUG_OFF, (\"%s(): rxpath=%d, Set AGC1_R0=0x%x, agc_r0=0x%x\\n\", __FUNCTION__, rxpath, agc, agc_r0));\n//\t\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &agc);\n//DBGPRINT(RT_DEBUG_OFF, (\"%s(): rxpath=%d, After write, Get AGC1_R0=0x%x,\\n\", __FUNCTION__, rxpath, agc));\n\n\treturn TRUE;\n}\n\n\nstatic UCHAR vht_prim_ch_val[] = {\n\t42, 36, 0,\n\t42, 40, 1,\n\t42, 44, 2,\n\t42, 48, 3,\n\t58, 52, 0,\n\t58, 56, 1,\n\t58, 60, 2,\n\t58, 64, 3,\n\t106, 100, 0,\n\t106, 104, 1,\n\t106, 108, 2,\n\t106, 112, 3,\n\t122, 116, 0,\n\t122, 120, 1,\n\t122, 124, 2,\n\t122, 128, 3,\n\t138, 132, 0,\n\t138, 136, 1,\n\t138, 140, 2,\n\t138, 144, 3,\n\t155, 149, 0,\n\t155, 153, 1,\n\t155, 157, 2,\n\t155, 161, 3\n};\n\n\t\nINT rtmp_bbp_set_ctrlch(struct _RTMP_ADAPTER *pAd, INT ext_ch)\n{\n\tUINT32 agc, agc_r0 = 0;\n\tUINT32 be, be_r0 = 0;\n\n\n\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &agc_r0);\n\tagc = agc_r0 & (~0x300);\n\tRTMP_BBP_IO_READ32(pAd, TXBE_R0, &be_r0);\n\tbe = (be_r0 & (~0x03));\n#ifdef DOT11_VHT_AC\n\tif (pAd->CommonCfg.BBPCurrentBW == BW_80 && \n\t\tpAd->CommonCfg.Channel >= 36 &&\n\t\tpAd->CommonCfg.vht_cent_ch)\n\t{\n\t\tif (pAd->CommonCfg.Channel < pAd->CommonCfg.vht_cent_ch)\n\t\t{\n\t\t\tswitch (pAd->CommonCfg.vht_cent_ch - pAd->CommonCfg.Channel)\n\t\t\t{\n\t\t\t\tcase 6:\n\t\t\t\t\tbe |= 0;\n\t\t\t\t\tagc |=0x000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tbe |= 1;\n\t\t\t\t\tagc |=0x100;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\t\telse if (pAd->CommonCfg.Channel > pAd->CommonCfg.vht_cent_ch)\n\t\t{\n\t\t\tswitch (pAd->CommonCfg.Channel - pAd->CommonCfg.vht_cent_ch)\n\t\t\t{\n\t\t\t\tcase 6:\n\t\t\t\t\tbe |= 0x3;\n\t\t\t\t\tagc |=0x300;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tbe |= 0x2;\n\t\t\t\t\tagc |=0x200;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n#endif /* DOT11_VHT_AC */\n\t{\n\t\tswitch (ext_ch)\n\t\t{\n\t\t\tcase EXTCHA_BELOW:\n\t\t\t\tagc |= 0x100;\n\t\t\t\tbe |= 0x01;\n\t\t\t\tbreak;\n\t\t\tcase EXTCHA_ABOVE:\n\t\t\t\tagc &= (~0x300);\n\t\t\t\tbe &= (~0x03);\n\t\t\t\tbreak;\n\t\t\tcase EXTCHA_NONE:\n\t\t\tdefault:\n\t\t\t\tagc &= (~0x300);\n\t\t\t\tbe &= (~0x03);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif (agc != agc_r0)\n\t\tRTMP_BBP_IO_WRITE32(pAd, AGC1_R0, agc);\n\n\tif (be != be_r0)\n\t\tRTMP_BBP_IO_WRITE32(pAd, TXBE_R0, be);\n\n//DBGPRINT(RT_DEBUG_OFF, (\"%s(): ext_ch=%d, Set AGC1_R0=0x%x, agc_r0=0x%x\\n\", __FUNCTION__, ext_ch, agc, agc_r0));\n//\t\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &agc);\n//DBGPRINT(RT_DEBUG_OFF, (\"%s(): ext_ch=%d, After write, Get AGC1_R0=0x%x,\\n\", __FUNCTION__, ext_ch, agc));\n\n\treturn TRUE;\n}\n\n/*\n\t<<Gamma2.1 Control Registers Rev1.3.pdf>>\n\tBBP bandwidth (CORE_R1[4:3]) change procedure:\n\t1. Hold BBP in reset by setting CORE_R4[0] to '1'\n\t2. Wait 0.5 us to ensure BBP is in the idle State\n\t3. Change BBP bandwidth with CORE_R1[4:3]\n\t\tCORE_R1 (Bit4:3)\n\t\t0: 20MHz\n\t\t1: 10MHz (11J)\n\t\t2: 40MHz\n\t\t3: 80MHz\n\t4. Wait 0.5 us for BBP clocks to settle\n\t5. Release BBP from reset by clearing CORE_R4[0]\n*/\nINT rtmp_bbp_set_bw(struct _RTMP_ADAPTER *pAd, INT bw)\n{\n\tUINT32 core, core_r1 = 0, core_r4 = 0;\n\tUINT32 agc, agc_r0 = 0;\n\n\tRTMP_BBP_IO_READ32(pAd, CORE_R1, &core_r1);\n\tcore = (core_r1 & (~0x18));\n\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &agc_r0);\n\tagc = agc_r0 & (~0x7000);\n\tswitch (bw)\n\t{\n\t\tcase BW_80:\n\t\t\tcore |= 0x18;\n\t\t\tagc |= 0x7000;\n\t\t\tbreak;\n\t\tcase BW_40:\n\t\t\tcore |= 0x10;\n\t\t\tagc |= 0x3000;\n\t\t\tbreak;\n\t\tcase BW_20:\n\t\t\tcore &= (~0x18);\n\t\t\tagc |= 0x1000;\n\t\t\tbreak;\n\t\tcase BW_10:\n\t\t\tcore |= 0x08;\n\t\t\tagc |= 0x1000;\n\t\t\tbreak;\n\t}\n\n\tif (core != core_r1) \n\t{\n#ifdef RT65xx\n\t\tif (IS_RT6590(pAd))\n\t\t{\n\t\t\t/*\n\t\t\t\tHold BBP in reset by setting CORE_R4[0]=1\n\t\t\t*/\n\t\t\tRTMP_BBP_IO_READ32(pAd, CORE_R4, &core_r4);\n\t\t\tcore_r4 |= 0x00000001;\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, CORE_R4, core_r4);\n\n\t\t\t/*\n\t\t\t\tWait 0.5 us to ensure BBP is in the idle state.\n\t\t\t*/\n\t\t\tRtmpOsUsDelay(1);\n\t\t}\n#endif /* RT65xx */\n\t\n\n\t\tRTMP_BBP_IO_WRITE32(pAd, CORE_R1, core);\n\n#ifdef RT65xx\n\t\tif (IS_RT6590(pAd))\n\t\t{\n\t\t\t/*\n\t\t\t\tWait 0.5 us for BBP clocks to settle.\n\t\t\t*/\n\t\t\tRtmpOsUsDelay(1);\n\n\t\t\t/*\n\t\t\t\tRelease BBP from reset by clearing CORE_R4[0].\n\t\t\t*/\n\t\t\tRTMP_BBP_IO_READ32(pAd, CORE_R4, &core_r4);\n\t\t\tcore_r4 &= ~(0x00000001);\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, CORE_R4, core_r4);\n\t\t}\n#endif /* RT65xx */\t\n\t}\n\n\tif (agc != agc_r0) {\n\t\tRTMP_BBP_IO_WRITE32(pAd, AGC1_R0, agc);\n//DBGPRINT(RT_DEBUG_OFF, (\"%s(): bw=%d, Set AGC1_R0=0x%x, agc_r0=0x%x\\n\", __FUNCTION__, bw, agc, agc_r0));\n//\t\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &agc);\n//DBGPRINT(RT_DEBUG_OFF, (\"%s(): bw=%d, After write, Get AGC1_R0=0x%x,\\n\", __FUNCTION__, bw, agc));\n\t}\n\n\tpAd->CommonCfg.BBPCurrentBW = bw;\n\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_mmps(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower)\n{\n\tUINT32 bbp_val, org_val;\n\n\tRTMP_BBP_IO_READ32(pAd, AGC1_R0, &org_val);\n\tbbp_val = org_val;\n\tif (ReduceCorePower)\n\t\tbbp_val |= 0x04;\n\telse\n\t\tbbp_val &= ~0x04;\n\n\tif (bbp_val != org_val)\n\t\tRTMP_BBP_IO_WRITE32(pAd, AGC1_R0, bbp_val);\n\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_get_agc(struct _RTMP_ADAPTER *pAd, CHAR *agc, RX_CHAIN_IDX chain)\n{\n\tUCHAR idx, val;\n\tUINT32 bbp_val, bbp_reg = AGC1_R8;\n\n\n\tif (((pAd->MACVersion & 0xffff0000) < 0x28830000) || \n\t\t(pAd->Antenna.field.RxPath == 1))\n\t{\n\t\tchain = RX_CHAIN_0;\n\t}\n\n\tidx = val = 0;\n\twhile(chain != 0)\n\t{\n\t\tif (idx >= pAd->Antenna.field.RxPath)\n\t\t\tbreak;\n\n\t\tif (chain & 0x01)\n\t\t{\n\t\t\tRTMP_BBP_IO_READ32(pAd, bbp_reg, &bbp_val);\n\t\t\tval = ((bbp_val & (0x0000ff00)) >> 8) & 0xff;\n\t\t\tbreak;\n\t\t}\n\t\tchain >>= 1;\n\t\tbbp_reg += 4;\n\t\tidx++;\n\t}\n\n\t*agc = val;\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT rtmp_bbp_set_agc(struct _RTMP_ADAPTER *pAd, UCHAR agc, RX_CHAIN_IDX chain)\n{\n\tUCHAR idx = 0;\n\tUINT32 bbp_val, bbp_reg = AGC1_R8;\n\t\n\tif (((pAd->MACVersion & 0xf0000000) < 0x28830000) || \n\t\t(pAd->Antenna.field.RxPath == 1))\n\t{\n\t\tchain = RX_CHAIN_0;\n\t}\n\n\twhile (chain != 0)\n\t{\n\t\tif (idx >= pAd->Antenna.field.RxPath)\n\t\t\tbreak;\n\t\t\n\t\tif (idx & 0x01)\n\t\t{\n\t\t\tRTMP_BBP_IO_READ32(pAd, bbp_reg, &bbp_val);\n\t\t\tbbp_val = (bbp_val & 0xffff00ff) | (agc << 8);\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, bbp_reg, bbp_val);\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, \n\t\t\t\t\t(\"%s(Idx):Write(R%d,val:0x%x) to Chain(0x%x, idx:%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, bbp_reg, bbp_val, chain, idx));\n\t\t}\n\t\tchain >>= 1;\n\t\tbbp_reg += 4;\n\t\tidx++;\n\t}\n\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_filter_coefficient_ctrl(RTMP_ADAPTER *pAd, UCHAR Channel)\n{\n\tUINT32 bbp_val = 0, org_val = 0;\n\n\tif (Channel == 14)\n\t{\n\t\t/* when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 */\n\t\tRTMP_BBP_IO_READ32(pAd, CORE_R1, &org_val);\n\t\tbbp_val = org_val;\n\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\t\tbbp_val |= 0x20;\n\t\telse\n\t\t\tbbp_val &= (~0x20);\n\n\t\tif (bbp_val != org_val)\n\t\t\tRTMP_BBP_IO_WRITE32(pAd, CORE_R1, bbp_val);\n\t}\n\n\treturn TRUE;\n}\n\n\nUCHAR rtmp_bbp_get_random_seed(RTMP_ADAPTER *pAd)\n{\n\tUINT32 value, value2;\n\tUCHAR seed;\n\n\tRTMP_BBP_IO_READ32(pAd, AGC1_R16, &value);\n\tseed = (UCHAR)((value & 0xff) ^ ((value & 0xff00) >> 8)^ \n\t\t\t\t\t((value & 0xff0000) >> 16));\n\tRTMP_BBP_IO_READ32(pAd, RXO_R9, &value2);\n\n\treturn (UCHAR)(seed ^ (value2 & 0xff)^ ((value2 & 0xff00) >> 8));\n}\n\n\nINT rlt_bbp_is_ready(struct _RTMP_ADAPTER *pAd)\n{\n\tINT idx = 0;\n\tUINT32 val;\n\t\n\tdo \n\t{\n\t\tRTMP_BBP_IO_READ32(pAd, CORE_R0, &val);\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\n\t\t\treturn FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP version = %x\\n\", val));\n\t} while ((++idx < 20) && ((val == 0xffffffff) || (val == 0x0)));\n\n\treturn (((val == 0xffffffff) || (val == 0x0)) ? FALSE : TRUE);\n}\n\n#endif /* MT7601 */\n\n#endif /* RLT_MAC */\n\n"
  },
  {
    "path": "src/phy/rlt_rf.c",
    "content": "/*\n\n*/\n\n#ifdef RLT_RF\n\n#include \"rt_config.h\"\n\n\nNDIS_STATUS rlt_rf_write(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR bank,\n\tIN UCHAR regID,\n\tIN UCHAR value)\n{\n\tRLT_RF_CSR_CFG rfcsr = { { 0 } };\n\tUINT i = 0;\n\tNDIS_STATUS\t ret;\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\n\tif (pAd->WlanFunCtrl.field.WLAN_EN == 0)\n\t{\n\t\tDBGPRINT_ERR((\"rlt_rf_write. Not allow to write RF 0x%x : fail\\n\",  regID));\t\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, ret);\n\t\tif (ret != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tASSERT((regID <= pAd->chipCap.MaxNumOfRfId));\n\n\tret = STATUS_UNSUCCESSFUL;\n\tdo\n\t{\n\t\tRTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);\n\n\t\tif (!rfcsr.field.RF_CSR_KICK)\n\t\t\tbreak;\n\t\ti++;\n\t}\n\twhile ((i < MAX_BUSY_COUNT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));\n\n\tif ((i == MAX_BUSY_COUNT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Retry count exhausted or device removed!!!\\n\"));\n\t\tgoto done;\n\t}\n\n\trfcsr.field.RF_CSR_WR = 1;\n\trfcsr.field.RF_CSR_KICK = 1;\n\trfcsr.field.RF_CSR_REG_BANK = bank;\n\trfcsr.field.RF_CSR_REG_ID = regID;\n\n\n\trfcsr.field.RF_CSR_DATA = value;\n\tRTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);\n\n\tret = NDIS_STATUS_SUCCESS;\ndone:\n\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\treturn ret;\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description: Read RT30xx RF register through MAC\n\n\tArguments:\n\n\tReturn Value:\n\n\tIRQL = \n\t\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS rlt_rf_read(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR bank,\n\tIN UCHAR regID,\n\tIN UCHAR *pValue)\n{\n\tRLT_RF_CSR_CFG rfcsr = { { 0 } };\n\tUINT i=0, k=0;\n\tNDIS_STATUS\t ret = STATUS_UNSUCCESSFUL;\n\n\n\tif (pAd->WlanFunCtrl.field.WLAN_EN == 0)\n\t{\n\t\tDBGPRINT_ERR((\"rlt_rf_read. Not allow to read RF 0x%x : fail\\n\",  regID));\t\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, i);\n\t\tif (i != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", i));\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tASSERT((regID <= pAd->chipCap.MaxNumOfRfId));\n\n\tfor (i=0; i<MAX_BUSY_COUNT; i++)\n\t{\n\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\tgoto done;\n\t\t\t\n\t\tRTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);\n\n\t\tif (rfcsr.field.RF_CSR_KICK == BUSY)\n\t\t\t\tcontinue;\n\t\t\n\t\trfcsr.word = 0;\n\t\trfcsr.field.RF_CSR_WR = 0;\n\t\trfcsr.field.RF_CSR_KICK = 1;\n\t\trfcsr.field.RF_CSR_REG_ID = regID;\n\t\trfcsr.field.RF_CSR_REG_BANK = bank;\n\t\tRTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);\n\t\t\n\t\tfor (k=0; k<MAX_BUSY_COUNT; k++)\n\t\t{\n\t\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\t\tgoto done;\n\t\t\t\t\n\t\t\tRTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);\n\n\t\t\tif (rfcsr.field.RF_CSR_KICK == IDLE)\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif ((rfcsr.field.RF_CSR_KICK == IDLE) &&\n\t\t\t(rfcsr.field.RF_CSR_REG_ID == regID) &&\n\t\t\t(rfcsr.field.RF_CSR_REG_BANK == bank))\n\t\t{\n\t\t\t*pValue = (UCHAR)(rfcsr.field.RF_CSR_DATA);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (rfcsr.field.RF_CSR_KICK == BUSY)\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\tDBGPRINT_ERR((\"RF read R%d=0x%X fail, i[%d], k[%d]\\n\", regID, rfcsr.word,i,k));\n\t\tgoto done;\n\t}\n\tret = STATUS_SUCCESS;\n\ndone:\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\treturn ret;\n}\n\n#endif /* RLT_RF */\n\n"
  },
  {
    "path": "src/phy/rtmp_phy.c",
    "content": "/*\n\n*/\n\n\n#include \"rt_config.h\"\n\n\n//#ifdef RTMP_MAC\n#if defined(RTMP_MAC) || defined(MT7601)\n\n/* BBP register initialization set*/\nREG_PAIR   BBPRegTable[] = {\n\t{BBP_R65,\t\t0x2C},\t\t/* fix rssi issue*/\n\t{BBP_R66,\t\t0x38},\t/* Also set this default value to pAd->BbpTuning.R66CurrentValue at initial*/\n\t{BBP_R68,\t\t0x0B},  /* improve Rx sensitivity. */\n\t{BBP_R69,\t\t0x12},\n\t{BBP_R70,\t\t0xa},\t/* BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa*/\n\t{BBP_R73,\t\t0x10},\n\t{BBP_R81,\t\t0x37},\n\t{BBP_R82,\t\t0x62},\n\t{BBP_R83,\t\t0x6A},\n\t{BBP_R84,\t\t0x99},\t/* 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before*/\n\t{BBP_R86,\t\t0x00},\t/* middle range issue, Rory @2008-01-28 \t*/\n\t{BBP_R91,\t\t0x04},\t/* middle range issue, Rory @2008-01-28*/\n\t{BBP_R92,\t\t0x00},\t/* middle range issue, Rory @2008-01-28*/\n\t{BBP_R103,\t\t0x00}, \t/* near range high-power issue, requested from Gary @2008-0528*/\n\t{BBP_R105,\t\t0x05},\t/* 0x05 is for rt2860E to turn on FEQ control. It is safe for rt2860D and before, because Bit 7:2 are reserved in rt2860D and before.*/\n#ifdef DOT11_N_SUPPORT\n\t{BBP_R106,\t\t0x35},\t/* Optimizing the Short GI sampling request from Gray @2009-0409*/\n#endif /* DOT11_N_SUPPORT */\n};\n#define\tNUM_BBP_REG_PARMS\t(sizeof(BBPRegTable) / sizeof(REG_PAIR))\n\n\nNDIS_STATUS NICInitBBP(RTMP_ADAPTER *pAd)\n{\n\tINT Index = 0;\n\tUCHAR R0 = 0xff;\n\t\n\t/* Read BBP register, make sure BBP is up and running before write new data*/\n\tif (rtmp_bbp_is_ready(pAd)== FALSE)\n\t\treturn NDIS_STATUS_FAILURE;\n\n\tIndex = 0;\n\n\t/* Initialize BBP register to default value*/\n\tfor (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)\n\t{\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n#ifdef MT7601\n\t\tif (\tBBPRegTable[Index].Register == BBP_R65)\n\t\t{\n\t\t\t/* Backup BBP_R65 and B5.R6 and B5.R7 */\t\n\t\t\tpAd->CommonCfg.MO_Cfg.Stored_BBP_R65 = BBPRegTable[Index].Value;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Stored_BBP_R65=%x @%s \\n\", pAd->CommonCfg.MO_Cfg.Stored_BBP_R65, __FUNCTION__));\n\t\t}\n#endif /* MT7601 */\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd,\n\t\t\t\tBBPRegTable[Index].Register,\n\t\t\t\tBBPRegTable[Index].Value);\n\t}\n\n\t/* re-config specific BBP registers for individual chip */\n\tif (pAd->chipCap.pBBPRegTable)\n\t{\n\t\tREG_PAIR *pbbpRegTb = pAd->chipCap.pBBPRegTable;\n\t\t\n\t\tfor (Index = 0; Index < pAd->chipCap.bbpRegTbSize; Index++)\n\t\t{\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd,\n\t\t\t\t\tpbbpRegTb[Index].Register,\n\t\t\t\t\tpbbpRegTb[Index].Value);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP_R%d=0x%x\\n\", \n\t\t\t\t\tpbbpRegTb[Index].Register, \n\t\t\t\t\tpbbpRegTb[Index].Value));\n\t\t}\n\t}\n\n\tif (pAd->chipOps.AsicBbpInit != NULL)\n\t\tpAd->chipOps.AsicBbpInit(pAd);\n\n\t/*\n\t\tFor rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.\n\t\tRT3090 should not program BBP R84 to 0x19, otherwise TX will block.\n\t\t3070/71/72,3090,3090A( are included in RT30xx),3572,3390\n\t*/\n\tif (((pAd->MACVersion & 0xffff) != 0x0101) &&\n\t\t!(IS_RT30xx(pAd)|| IS_RT3572(pAd) || IS_RT5390(pAd) || IS_RT5392(pAd) || IS_RT3290(pAd) || IS_MT7601(pAd)))\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);\n\n\n\tif (pAd->MACVersion == 0x28600100)\n\t{\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n\t\n}\n\n\nINT rtmp_bbp_set_txdac(struct _RTMP_ADAPTER *pAd, INT tx_dac)\n{\n\tUCHAR val, old_val = 0;\n\n\t\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &old_val);\n\tval = old_val & (~0x18);\n\tswitch (tx_dac)\n\t{\n\t\tcase 2:\n\t\t\tval |= 0x10;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tval |= 0x08;\n\t\t\tbreak;\n\t\tcase 0:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (val != old_val) {\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, val);\n\t}\n\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_rxpath(struct _RTMP_ADAPTER *pAd, INT rxpath)\n{\n\tUCHAR val = 0;\n\n\t\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &val);\n\tval &= (~0x18);\n\tif(rxpath == 3)\n\t\tval |= (0x10);\n\telse if(rxpath == 2)\n\t\tval |= (0x8);\n\telse if(rxpath == 1)\n\t\tval |= (0x0);\n\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, val);\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_ctrlch(struct _RTMP_ADAPTER *pAd, INT ext_ch)\n{\n\tUCHAR val, old_val = 0;\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &old_val);\n\tval = old_val;\n\tswitch (ext_ch)\n\t{\n\t\tcase EXTCHA_BELOW:\n\t\t\tval |= (0x20);\n\t\t\tbreak;\n\t\tcase EXTCHA_ABOVE:\n\t\tcase EXTCHA_NONE:\n\t\t\tval &= (~0x20);\n\t\t\tbreak;\n\t}\n\n\tif (val != old_val)\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, val);\n\n#ifdef CONFIG_STA_SUPPORT\n#endif /* CONFIG_STA_SUPPORT */\n\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_bw(struct _RTMP_ADAPTER *pAd, INT bw)\n{\n\tUCHAR val, old_val = 0;\n\tBOOLEAN bstop = FALSE;\n\tUINT32 Data, MTxCycle, macStatus;\n\n\n\tif (bw != pAd->CommonCfg.BBPCurrentBW)\n\t\tbstop = TRUE;\n\n\tif (bstop)\n\t{\n\t\t/* Disable MAC Tx/Rx */\n\t\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Data);\n\t\tData &= (~0x0C);\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Data);\n\n\t\t/* Check MAC Tx/Rx idle */\n\t\tfor (MTxCycle = 0; MTxCycle < 10000; MTxCycle++)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, MAC_STATUS_CFG, &macStatus);\n\t\t\tif (macStatus & 0x3)\n\t\t\t\tRTMPusecDelay(50);\n\t\t\telse\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &old_val);\n\tval = (old_val & (~0x18));\n\tswitch (bw)\n\t{\n\t\tcase BW_20:\n\t\t\tval &= (~0x18);\n\t\t\tbreak;\n\t\tcase BW_40:\n\t\t\tval |= (0x10);\n\t\t\tbreak;\n\t\tcase BW_10:\n\t\t\tval |= 0x08;\n\t\t\tbreak;\t\n\t}\n\n\tif (val != old_val) {\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, val);\n\t}\n\n\tif (bstop)\n\t{\n\t\t/* Enable MAC Tx/Rx */\n\t\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Data);\n\t\tData |= 0x0C;\n\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Data);\n\t}\n\n\tpAd->CommonCfg.BBPCurrentBW = bw;\n\t\n\treturn TRUE;\n}\n\n\nINT rtmp_bbp_set_mmps(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower)\n{\n\tUCHAR bbp_val, org_val;\n\t\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &org_val);\n\tbbp_val = org_val;\n\tif (ReduceCorePower)\n\t\tbbp_val |= 0x04;\n\telse\n\t\tbbp_val &= ~0x04;\n\n\tif (bbp_val != org_val)\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbp_val);\n\n\treturn TRUE;\n}\n\n\nNDIS_STATUS AsicBBPWriteWithRxChain(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR bbpId,\n\tIN CHAR bbpVal,\n\tIN RX_CHAIN_IDX rx_ch_idx)\n{\n\tUCHAR idx = 0, val = 0;\n\n\tif (((pAd->MACVersion & 0xf0000000) < 0x28830000) || \n\t\t(pAd->Antenna.field.RxPath == 1))\n\t{\n\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, bbpId, bbpVal);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\t\n\twhile (rx_ch_idx != 0)\n\t{\n\t\tif (idx >= pAd->Antenna.field.RxPath)\n\t\t\tbreak;\n\t\t\n\t\tif (rx_ch_idx & 0x01)\n\t\t{\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R27, &val);\n\t\t\tval = (val & (~0x60)) | (idx << 5);\n#ifdef RTMP_MAC_USB\n\t\t\tif ((IS_USB_INF(pAd)) &&\n\t\t\t    (RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, val) == STATUS_SUCCESS))\n\t\t\t{\n\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, bbpId, bbpVal);\n\t\t\t}\n#endif /* RTMP_MAC_USB */\n\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, \n\t\t\t\t\t(\"%s(Idx):Write(R%d,val:0x%x) to Chain(0x%x, idx:%d)\\n\",\n\t\t\t\t\t\t__FUNCTION__, bbpId, bbpVal, rx_ch_idx, idx));\n\t\t}\n\t\trx_ch_idx >>= 1;\n\t\tidx++;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nNDIS_STATUS AsicBBPReadWithRxChain(\n\tIN RTMP_ADAPTER *pAd, \n\tIN UCHAR bbpId, \n\tIN CHAR *pBbpVal,\n\tIN RX_CHAIN_IDX rx_ch_idx)\n{\n\tUCHAR idx, val;\n\n\tif (((pAd->MACVersion & 0xffff0000) < 0x28830000) || \n\t\t(pAd->Antenna.field.RxPath == 1))\n\t{\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, pBbpVal);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\n\tidx = 0;\n\twhile(rx_ch_idx != 0)\n\t{\n\t\tif (idx >= pAd->Antenna.field.RxPath)\n\t\t\tbreak;\n\n\t\tif (rx_ch_idx & 0x01)\n\t\t{\n\t\t\tval = 0;\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R27, &val);\n\t\t\tval = (val & (~0x60)) | (idx << 5);\n#ifdef RTMP_MAC_USB\n\t\t\tif ((IS_USB_INF(pAd)) && \n\t\t\t    (RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, val) == STATUS_SUCCESS))\n\t\t\t{\n\t\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, pBbpVal);\n\t\t\t}\n#endif /* RTMP_MAC_USB */\n\n\t\t\tbreak;\n\t\t}\n\t\trx_ch_idx >>= 1;\n\t\tidx++;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\nINT rtmp_bbp_get_agc(struct _RTMP_ADAPTER *pAd, CHAR *agc, RX_CHAIN_IDX idx)\n{\n\treturn AsicBBPReadWithRxChain(pAd, BBP_R66, agc, idx);\n}\n\n\nINT rtmp_bbp_set_agc(struct _RTMP_ADAPTER *pAd, UCHAR agc, RX_CHAIN_IDX idx)\n{\n\treturn AsicBBPWriteWithRxChain(pAd, BBP_R66, agc, idx);\n}\n\n\nINT rtmp_bbp_set_filter_coefficient_ctrl(RTMP_ADAPTER *pAd, UCHAR Channel)\n{\n\tUCHAR bbp_val = 0, org_val = 0;\n\n\tif (Channel == 14)\n\t{\n\t\t/* when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 */\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &org_val);\n\t\tbbp_val = org_val;\n\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B))\n\t\t\tbbp_val |= 0x20;\n\t\telse\n\t\t\tbbp_val &= (~0x20);\n\n\t\tif (bbp_val != org_val)\n\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, bbp_val);\n\t}\n\n\treturn TRUE;\n}\n\n\nUCHAR rtmp_bbp_get_random_seed(RTMP_ADAPTER *pAd)\n{\n\tUCHAR value1, value2, value3, value4, value5;\n\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R50, &value1);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R51, &value2);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R52, &value3);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R53, &value4);\n\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R54, &value5);\n\n\treturn (value1^value2^value3^value4^value5);\n}\n\n\nINT rtmp_bbp_is_ready(struct _RTMP_ADAPTER *pAd)\n{\n\tINT idx = 0;\n\tUCHAR val;\n\t\n\tdo \n\t{\n\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &val);\n\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\t\t\t\n\t\t\treturn FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"BBP version = %x\\n\", val));\n\t} while ((++idx < 20) && ((val == 0xff) || (val == 0x00)));\n\n\treturn (((val == 0xff) || (val == 0x00)) ? FALSE : TRUE);\n}\n\n\n#ifdef PRE_ANT_SWITCH\n\n#endif /* PRE_ANT_SWITCH */\n\n\n#ifdef CFO_TRACK\n#ifdef CONFIG_AP_SUPPORT\nINT rtmp_cfo_track(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, INT lastClient)\n{\n\t/* CFO Tracking */\n\tif (IS_RT3883(pAd))\n\t{\n\t\tif (pAd->MacTab.Size !=1 || pAd->CommonCfg.CFOTrack==0)\n\t\t{\n\t\t\t/* Set to default */\n\t\t\tRT3883_AsicSetFreqOffset(pAd, pAd->RfFreqOffset);\n\t\t}\n\t\telse if ((lastClient < MAX_LEN_OF_MAC_TABLE) && (lastClient >=1) && \n\t\t\tpAd->CommonCfg.CFOTrack < 8 && \n\t\t\tpEntry->freqOffsetValid)\n\t\t{\n\t\t\t/* Track CFO */\n\t\t\tSHORT foValue, offset = pEntry->freqOffset;\n\t\t\tUCHAR RFValue;\n\n\t\t\tRT30xxReadRFRegister(pAd, RF_R17, (PUCHAR)&RFValue);\n\t\t\tRFValue &= 0x7F;\n\n\t\t\tif (offset > 32)\n\t\t\t\toffset = 32;\n\t\t\telse if (offset < -32)\n\t\t\t\toffset = -32;\n\n\t\t\tfoValue = RFValue - (offset/16);\n\t\t\tif (foValue < 0)\n\t\t\t\tfoValue = 0;\n\t\t\telse if (foValue > 0x5F)\n\t\t\t\tfoValue = 0x5F;\n\n\t\t\tif (foValue != RFValue)\n\t\t\t\tRT3883_AsicSetFreqOffset(pAd, foValue);\n\n\t\t\t/* If CFOTrack!=1 then keep updating until CFOTrack==8 */\n\t\t\tif (pAd->CommonCfg.CFOTrack != 1)\n\t\t\t\tpAd->CommonCfg.CFOTrack++;\n\n\t\t\tpEntry->freqOffsetValid = FALSE;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* CFO_TRACK */\n\n\n#ifdef MT7601\nNDIS_STATUS MT7601_BBP_write(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR regID,\n\tIN UCHAR value)\n{\n\tBBP_CSR_CFG_STRUC  BbpCsr = { { 0 } };\n\tUINT i = 0;\n\tNDIS_STATUS\t ret;\n\n#ifdef MT7601FPGA\n\treturn;\n#endif /*MT7601FPGA */\n\n\n\tif (pAd->WlanFunCtrl.field.WLAN_EN == 0)\n\t{\n\t\tDBGPRINT_ERR((\"rlt_rf_write. Not allow to write BBP 0x%x : fail\\n\",  regID));\t\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, ret);\n\t\tif (ret != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", ret));\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tASSERT((regID <= pAd->chipCap.MaxNumOfBbpId));\n\n\tret = STATUS_UNSUCCESSFUL;\n\tdo\n\t{\n\t\tRTMP_IO_READ32(pAd, BBP_CSR_CFG, &BbpCsr.word);\n\n\t\tif (!BbpCsr.field.Busy)\n\t\t\tbreak;\n\t\ti++;\n\t}\n\twhile ((i < MAX_BUSY_COUNT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));\n\n\tif ((i == MAX_BUSY_COUNT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Retry count exhausted or device removed!!!\\n\"));\n\t\tgoto done;\n\t}\n\n\tBbpCsr.word = 0;\n\tBbpCsr.field.fRead = 0;\n\tBbpCsr.field.BBP_RW_MODE = 1;\n\tBbpCsr.field.Busy = 1;\n\tBbpCsr.field.Value = value;\n\tBbpCsr.field.RegNum = regID;\n\n\n\tRTMP_IO_WRITE32(pAd, BBP_CSR_CFG, BbpCsr.word);\n\n\tret = NDIS_STATUS_SUCCESS;\ndone:\n\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\treturn ret;\n}\n\n\nNDIS_STATUS MT7601_BBP_read(\n\tIN RTMP_ADAPTER *pAd,\n\tIN UCHAR regID,\n\tIN UCHAR *pValue)\n{\n\tBBP_CSR_CFG_STRUC  BbpCsr = { { 0 } };\n\tUINT i=0, k=0;\n\tNDIS_STATUS\t ret = STATUS_UNSUCCESSFUL;\n\n\n\tif (pAd->WlanFunCtrl.field.WLAN_EN == 0)\n\t{\n\t\tDBGPRINT_ERR((\"MT7601_BBP_read. Not allow to read BBP 0x%x : fail\\n\",  regID));\t\n\t\treturn STATUS_UNSUCCESSFUL;\n\t}\n\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, i);\n\t\tif (i != 0) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"reg_atomic get failed(ret=%d)\\n\", i));\n\t\t\treturn STATUS_UNSUCCESSFUL;\n\t\t}\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tASSERT((regID <= pAd->chipCap.MaxNumOfBbpId));\n\n\tfor (i=0; i<MAX_BUSY_COUNT; i++)\n\t{\n\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\tgoto done;\n\t\t\t\n\t\tRTMP_IO_READ32(pAd, BBP_CSR_CFG, &BbpCsr.word);\n\n\t\tif (BbpCsr.field.Busy == BUSY)\n\t\t\t\tcontinue;\n\t\t\n\t\tBbpCsr.word = 0;\n\t\tBbpCsr.field.fRead = 1;\n\t\tBbpCsr.field.BBP_RW_MODE = 1;\n\t\tBbpCsr.field.Busy = 1;\n\t\tBbpCsr.field.RegNum = regID;\n\n\t\t\n\t\tRTMP_IO_WRITE32(pAd, BBP_CSR_CFG, BbpCsr.word);\n\t\t\n\t\tfor (k=0; k<MAX_BUSY_COUNT; k++)\n\t\t{\n\t\t\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\t\tgoto done;\n\t\t\t\t\n\t\t\tRTMP_IO_READ32(pAd, BBP_CSR_CFG, &BbpCsr.word);\n\n\t\t\tif (BbpCsr.field.Busy == IDLE)\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif ((BbpCsr.field.Busy == IDLE) &&\n\t\t\t(BbpCsr.field.RegNum == regID) )\n\t\t{\n\t\t\t*pValue = (UCHAR)(BbpCsr.field.Value);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (BbpCsr.field.Busy == BUSY)\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\tDBGPRINT_ERR((\"BBP read R%d=0x%X fail, i[%d], k[%d]\\n\", regID, BbpCsr.word,i,k));\n\t\tgoto done;\n\t}\n\tret = STATUS_SUCCESS;\n\ndone:\n#ifdef RTMP_MAC_USB\n\tif (IS_USB_INF(pAd)) {\n\t\tRTMP_SEM_EVENT_UP(&pAd->reg_atomic);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\treturn ret;\n}\n\n\n#endif /* MT7601 */\n\n#endif /* RTMP_MAC */\n\n"
  },
  {
    "path": "src/rate_ctrl/alg_ags.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/  \n    \n/****************************************************************************\n\n\tAbstract:\n\n\tAll related AGS (Adaptive Group Switching) function body.\n\n***************************************************************************/ \n\n#ifdef AGS_SUPPORT\n\n#include \"rt_config.h\"\n\n\n/*\n\tHT Rate Table format\n\t[Item no.] [Mode]* [Mode]** [CurrMCS] [TrainUp] [TrainDown] [downMCS] [upMCS3] [upMCS2] [upMCS1]\n\n\t[Mode]*: \n\t\tbit0: STBC -STBC_XXX\n\t\tbit1: Short GI - GI_XXX\n\t\tbit2~3: BW - BW_XXX\n\t\tbit4~bit6: Mode (0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF, 4: VHT) - MODE_XXX\n\t\tbit7: Reserved\n\n\t[Mode]**\n\t\tbit0~1: Nss - NSS_XXX (VHT only)\n\t\tbit2~7: Reserved\n*/\n\n/* AGS: 1x1 HT-capable rate table */\nUCHAR AGS1x1HTRateTable[] = {\n\t0x09, 0x08, 0, 0, 0, 0, 0, 0, 0, 0,\t/* Initial used item after association: the number of rate indexes, the initial mcs */\n\t0x00, 0x21, 0, 0, 30, 101, 0, 16, 8, 1,\t/* MCS 0 */\n\t0x01, 0x21, 0, 1, 20, 50, 0, 16, 9, 2,\t/* MCS 1 */\n\t0x02, 0x21, 0, 2, 20, 50, 1, 17, 9, 3,\t/* MCS 2 */\n\t0x03, 0x21, 0, 3, 15, 50, 2, 17, 10, 4,\t/* MCS 3 */\n\t0x04, 0x21, 0, 4, 15, 30, 3, 18, 11, 5,\t/* MCS 4 */\n\t0x05, 0x21, 0, 5, 10, 25, 4, 18, 12, 6,\t/* MCS 5 */\n\t0x06, 0x21, 0, 6, 8, 14, 5, 19, 12, 7,\t/* MCS 6 */\n\t0x07, 0x21, 0, 7, 8, 14, 6, 19, 12, 8,\t/* MCS 7 */\n\t0x08, 0x23, 0, 7, 8, 14, 7, 19, 12, 8,\t/* MCS 7 + Short GI */\n};\n\n\n/* AGS: 2x2 HT-capable rate table */\nUCHAR AGS2x2HTRateTable[] = {\n\t0x11, 0x10, 0, 0, 0, 0, 0, 0, 0, 0,\t/* Initial used item after association: the number of rate indexes, the initial mcs */\n\t0x00, 0x21, 0, 0, 30, 101, 0, 16, 8, 1,\t/* MCS 0 */\n\t0x01, 0x21, 0, 1, 20, 50, 0, 16, 9, 2,\t/* MCS 1 */\n\t0x02, 0x21, 0, 2, 20, 50, 1, 17, 9, 3,\t/* MCS 2 */\n\t0x03, 0x21, 0, 3, 15, 50, 2, 17, 10, 4,\t/* MCS 3 */\n\t0x04, 0x21, 0, 4, 15, 30, 3, 18, 11, 5,\t/* MCS 4 */\n\t0x05, 0x21, 0, 5, 10, 25, 4, 18, 12, 6,\t/* MCS 5 */\n\t0x06, 0x21, 0, 6, 8, 14, 5, 19, 12, 7,\t/* MCS 6 */\n\t0x07, 0x21, 0, 7, 8, 14, 6, 19, 12, 7,\t/* MCS 7 */\n\t0x08, 0x20, 0, 8, 30, 50, 0, 16, 9, 2,\t/* MCS 8 */\n\t0x09, 0x20, 0, 9, 20, 50, 8, 17, 10, 4,\t/* MCS 9 */\n\t0x0A, 0x20, 0, 10, 20, 50, 9, 18, 11, 5,\t/* MCS 10 */\n\t0x0B, 0x20, 0, 11, 15, 30, 10, 18, 12, 6,\t/* MCS 11 */\n\t0x0C, 0x20, 0, 12, 15, 30, 11, 20, 13, 12,\t/* MCS 12 */\n\t0x0D, 0x20, 0, 13, 8, 20, 12, 20, 14, 13,\t/* MCS 13 */\n\t0x0E, 0x20, 0, 14, 8, 18, 13, 21, 15, 14,\t/* MCS 14 */\n\t0x0F, 0x20, 0, 15, 8, 25, 14, 21, 16, 15,\t/* MCS 15 */\n\t0x10, 0x22, 0, 15, 8, 25, 15, 21, 16, 16,\t/* MCS 15 + Short GI */\n};\n\n\n/* AGS: 3x3 HT-capable rate table */\nUCHAR AGS3x3HTRateTable[] = {\n\t0x19, 0x18, 0, 0, 0, 0, 0, 0, 0, 0,\t/* Initial used item after association: the number of rate indexes, the initial mcs */\n\t0x00, 0x21, 0, 0, 30, 101, 0, 16, 8, 1,\t/* MCS 0 */\n\t0x01, 0x21, 0, 1, 20, 50, 0, 16, 9, 2,\t/* MCS 1 */\n\t0x02, 0x21, 0, 2, 20, 50, 1, 17, 9, 3,\t/* MCS 2 */\n\t0x03, 0x21, 0, 3, 15, 50, 2, 17, 10, 4,\t/* MCS 3 */\n\t0x04, 0x21, 0, 4, 15, 30, 3, 18, 11, 5,\t/* MCS 4 */\n\t0x05, 0x21, 0, 5, 10, 25, 4, 18, 12, 6,\t/* MCS 5 */\n\t0x06, 0x21, 0, 6, 8, 14, 5, 19, 12, 7,\t/* MCS 6 */\n\t0x07, 0x21, 0, 7, 8, 14, 6, 19, 12, 7,\t/* MCS 7 */\n\t0x08, 0x20, 0, 8, 30, 50, 0, 16, 9, 2,\t/* MCS 8 */\n\t0x09, 0x20, 0, 9, 20, 50, 8, 17, 10, 4,\t/* MCS 9 */\n\t0x0A, 0x20, 0, 10, 20, 50, 9, 18, 11, 5,\t/* MCS 10 */\n\t0x0B, 0x20, 0, 11, 15, 30, 10, 18, 12, 6,\t/* MCS 11 */\n\t0x0C, 0x20, 0, 12, 15, 30, 11, 20, 13, 12,\t/* MCS 12 */\n\t0x0D, 0x20, 0, 13, 8, 20, 12, 20, 14, 13,\t/* MCS 13 */\n\t0x0E, 0x20, 0, 14, 8, 18, 13, 21, 15, 14,\t/* MCS 14 */\n\t0x0F, 0x20, 0, 15, 8, 14, 14, 21, 15, 15,\t/* MCS 15 */\n\t0x10, 0x20, 0, 16, 30, 50, 8, 17, 9, 3,\t/* MCS 16 */\n\t0x11, 0x20, 0, 17, 20, 50, 16, 18, 11, 5,\t/* MCS 17 */\n\t0x12, 0x20, 0, 18, 20, 50, 17, 19, 12, 7,\t/* MCS 18 */\n\t0x13, 0x20, 0, 19, 15, 30, 18, 20, 13, 19,\t/* MCS 19 */\n\t0x14, 0x20, 0, 20, 15, 30, 19, 21, 15, 20,\t/* MCS 20 */\n\t0x15, 0x20, 0, 21, 8, 20, 20, 22, 21, 21,\t/* MCS 21 */\n\t0x16, 0x20, 0, 22, 8, 20, 21, 23, 22, 22,\t/* MCS 22 */\n\t0x17, 0x20, 0, 23, 6, 18, 22, 24, 23, 23,\t/* MCS 23 */\n\t0x18, 0x22, 0, 23, 6, 14, 23, 24, 24, 24,\t/* MCS 23 + Short GI */\n};\n\n\n#ifdef DOT11_VHT_AC\n\n#define NSS_1 0\n#define NSS_2 1\n/* RSSI Offset table for Ags rate tuning */\nUCHAR AgsRssiOffsetTable[3][4] = \n{\n\t// [i][] MAX System spatial stream capability: 1*1, 2*2, 3*3\n\t// [i][] MAX System Bandwidth: 20, 40, 80, 160\n\t// ----------------------\n\t{0,    2,    4,    6},    // For VHT 1*1: BW20, BW40, BW80, BW160\n\t{2,    4,    6,    8},    // For VHT 2*2: BW20, BW40, BW80, BW160\n\t{4,    6,    8,    10}    // For VHT 3*3: BW20, BW40, BW80, BW160             \t\n};\n\n\n/*\n\t[Item no.] [Mode]* [Mode]** [CurrMCS] [TrainUp] [TrainDown] [downMCS] [upMCS3] [upMCS2] [upMCS1]\n\n\tNote: downMCS, upMCS3, upMCS2 and upMCS1 are zero-based array index.\n\n\t[Mode]*: \n\t\tbit0: STBC -STBC_XXX\n\t\tbit1: Short GI - GI_XXX\n\t\tbit2~3: BW - BW_XXX\n\t\tbit4~bit6: Mode (0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF, 4: VHT) - MODE_XXX\n\t\tbit7: Reserved\n\n\t[Mode]**\n\t\tbit0~1: Nss - NSS_XXX (VHT only)\n\t\tbit2~7: Reserved\n*/\n\n/* AGS: 1x1 VHT-capable rate table */\nUCHAR Ags1x1VhtRateTable[] = \n{\n\t// Initial used item after association: the number of rate indexes, the initial MCS (index)\n\t9,\t0x08,\t0x00, 0,\t\t\t\t\t\t\t0,\t0,\t\t0,\t0,\t0,\t0,\n\t0,\t0x41,\t0x00, 0,/* VHT 1x1 MCS 0 */\t\t30,\t101,\t0,\t0,\t0,\t1, \n\t1,\t0x41,\t0x00, 1,/* VHT 1x1 MCS 1 */\t\t20,\t50,\t\t0,\t0,\t0,\t2, \n\t2,\t0x41,\t0x00, 2,/* VHT 1x1 MCS 2 */\t\t20,\t50,\t\t1,\t0,\t0,\t3, \n\t3,\t0x41,\t0x00, 3,/* VHT 1x1 MCS 3 */\t\t15,\t50,\t\t2,\t0,\t0,\t4, \n\t4,\t0x41,\t0x00, 4,/* VHT 1x1 MCS 4 */\t\t15,\t30,\t\t3,\t0,\t0,\t5, \n\t5,\t0x41,\t0x00, 5,/* VHT 1x1 MCS 5 */\t\t10,\t25,\t\t4,\t0,\t0,\t6, \n\t6,\t0x41,\t0x00, 6,/* VHT 1x1 MCS 6 */\t\t8,\t14,\t\t5,\t0,\t0,\t7, \n\t7,\t0x41,\t0x00, 7,/* VHT 1x1 MCS 7 */\t\t8,\t14,\t\t6,\t0,\t0,\t8, \n\t8,\t0x43,\t0x00, 7,/* VHT 1x1 MCS 7 + SGI */\t8,\t14,\t\t7,\t0,\t0,\t8, \n};\n\n\n/* AGS: 2x2 VHT-capable rate table */\nUCHAR Ags2x2VhtRateTable[] = {\n\t// row #1 is initial used item after association: the number of rate indexes, the initial MCS (index)\n\t17,\t0x10,\t0x00, 0,\t\t\t\t\t\t\t0,\t0,\t\t0,\t0,\t0,\t0,\n\t0,\t0x41,\t0x00, 0, /* VHT 1x1 MCS 0 */\t\t30,\t101,\t0,\t0,\t8,\t1, \n\t1,\t0x41,\t0x00, 1, /* VHT 1x1 MCS 1 */\t\t20,\t50,\t\t0,\t0,\t9,\t2, \n\t2,\t0x41,\t0x00, 2, /* VHT 1x1 MCS 2 */\t\t20,\t50,\t\t1,\t0,\t9,\t3, \n\t3,\t0x41,\t0x00, 3, /* VHT 1x1 MCS 3 */\t\t15,\t50,\t\t2,\t0,\t10,\t4, \n\t4,\t0x41,\t0x00, 4, /* VHT 1x1 MCS 4 */\t\t15,\t30,\t\t3,\t0,\t11,\t5, \n\t5,\t0x41,\t0x00, 5, /* VHT 1x1 MCS 5 */\t\t10,\t25,\t\t4,\t0,\t12,\t6, \n\t6,\t0x41,\t0x00, 6, /* VHT 1x1 MCS 6 */\t\t8,\t14,\t\t5,\t0,\t12,\t7, \n\t7,\t0x41,\t0x00, 7, /* VHT 1x1 MCS 7 */\t\t8,\t14,\t\t6,\t0,\t12,\t7, \n\t8,\t0x40,\t0x01, 0, /* VHT 2x2 MCS 0 */\t\t30,\t50,\t\t0,\t0,\t9,\t2, \n\t9,\t0x40,\t0x01, 1, /* VHT 2x2 MCS 1 */\t\t20,\t50,\t\t8,\t0,\t10,\t4, \n\t10,\t0x40,\t0x01, 2, /* VHT 2x2 MCS 2 */\t\t20,\t50,\t\t9,\t0,\t11,\t5, \n\t11,\t0x40,\t0x01, 3, /* VHT 2x2 MCS 3 */\t\t15,\t30,\t\t10,\t0,\t12,\t6, \n\t12,\t0x40,\t0x01, 4, /* VHT 2x2 MCS 4 */\t\t15,\t30,\t\t11,\t0,\t13,\t12, \n\t13,\t0x40,\t0x01, 5, /* VHT 2x2 MCS 5 */\t\t8,\t20,\t\t12,\t0,\t14,\t13, \n\t14,\t0x40,\t0x01, 6, /* VHT 2x2 MCS 6 */\t\t8,\t18,\t\t13,\t0,\t15,\t14, \n\t15,\t0x40,\t0x01, 7, /* VHT 2x2 MCS 7 */\t\t8,\t25,\t\t14,\t0,\t16,\t15, \n\t16,\t0x42,\t0x01, 7, /* VHT 2x2 MCS 7 + SGI */\t8,\t25,\t\t15,\t0,\t16,\t16, \n};\n#endif /* DOT11_VHT_AC */\n\n\nINT Show_AGS_Proc(\n    IN  PRTMP_ADAPTER\tpAd, \n    IN  PSTRING arg)\n{\n\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[1];\n\tUINT32 IdQuality;\n\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"MCS Group\\t\\tMCS Index\\n\"));\n\tDBGPRINT(RT_DEBUG_OFF, (\"%d\\t\\t\\t%d\\n\\n\", pEntry->AGSCtrl.MCSGroup, pEntry->CurrTxRateIndex));\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"MCS Quality:\\n\"));\n\tfor(IdQuality=0; IdQuality<=23; IdQuality++)\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%02d\\t\\t%d\\n\", IdQuality, pEntry->TxQuality[IdQuality]));\n\n\treturn TRUE;\n}\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\tThe dynamic Tx rate switching for AGS (Adaptive Group Switching)\n\n\tParameters\n\t\tpAd: The adapter data structure\n\t\tpEntry: Pointer to a caller-supplied variable in which points to a MAC table entry\n\t\tpTable: Pointer to a caller-supplied variable in wich points to a Tx rate switching table\n\t\tTableSize: The size, in bytes, of the specified Tx rate switching table\n\t\tpAGSStatisticsInfo: Pointer to a caller-supplied variable in which points to the statistics information\n\n\tReturn Value:\n\t\tNone\n*/\nVOID MlmeDynamicTxRateSwitchingAGS(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY pEntry, \n\tIN PUCHAR pTable, \n\tIN UCHAR TableSize, \n\tIN PAGS_STATISTICS_INFO pAGSStatisticsInfo,\n\tIN UCHAR InitTxRateIdx)\n{\n\tUCHAR UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx = 0;\n\tBOOLEAN bTxRateChanged = TRUE, bUpgradeQuality = FALSE;\n\tRTMP_RA_AGS_TB *pCurrTxRate = NULL;\n\tRTMP_RA_LEGACY_TB *pNextTxRate = NULL;\n\tUCHAR TrainUp = 0, TrainDown = 0, next_grp;\n\tCHAR RssiOffset = 0;\n\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"AGS: ---> %s\\n\", __FUNCTION__));\n\n\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: AccuTxTotalCnt = %d, TxSuccess = %d, TxRetransmit = %d, TxFailCount = %d, TxErrorRatio = %d\\n\",\n\t\t__FUNCTION__, \n\t\tpAGSStatisticsInfo->AccuTxTotalCnt, \n\t\tpAGSStatisticsInfo->TxSuccess, \n\t\tpAGSStatisticsInfo->TxRetransmit, \n\t\tpAGSStatisticsInfo->TxFailCount, \n\t\tpAGSStatisticsInfo->TxErrorRatio));\n\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\t\n\n\tif (CurrRateIdx >= TableSize)\n\t\tCurrRateIdx = TableSize - 1;\n\n\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(CurrRateIdx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\t/* Select the next upgrade rate and the next downgrade rate, if any */\n\tdo \n\t{\n\t\tif (pTable == AGS3x3HTRateTable)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: pEntry->AGSCtrl.MCSGroup = %d, TxQuality2[%d] = %d,  \"\n\t\t\t\t\"TxQuality1[%d] = %d, TxQuality0[%d] = %d, pCurrTxRate->upMcs1 = %d, \"\n\t\t\t\t\"pCurrTxRate->ItemNo = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\tpCurrTxRate->upMcs3, \n\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs3], \n\t\t\t\tpCurrTxRate->upMcs2, \n\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1], \n\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\tpCurrTxRate->ItemNo));\n\n\t\t\t/* 3x3 peer device (Adhoc, DLS or AP) */\n\t\t\t/* for 3*3, pEntry->AGSCtrl.MCSGroup = 0, 3, 3, 3, ... */\n\t\t\tnext_grp = pEntry->AGSCtrl.MCSGroup;\n\t\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t\t{\n\t\t\t\tcase 0: /* MCS selection in round robin policy (different MCS group) */\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\t\tnext_grp = 3;\n\n\t\t\t\t\t/* MCS group #2 has better Tx quality */\n\t\t\t\t\tif ((pEntry->TxQuality[UpRateIdx] > pEntry->TxQuality[pCurrTxRate->upMcs2]) && \n\t\t\t\t\t     (pCurrTxRate->upMcs2 != pCurrTxRate->ItemNo))\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\t\tnext_grp = 2;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* MCS group #1 has better Tx quality */\n\t\t\t\t\tif ((pEntry->TxQuality[UpRateIdx] > pEntry->TxQuality[pCurrTxRate->upMcs1]) && \n\t\t\t\t\t     (pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo))\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\t\tnext_grp = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 3:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 2:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 1:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s: AGS: Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\",\n\t\t\t\t\t\t__FUNCTION__, pEntry->AGSCtrl.MCSGroup));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t\t\t(\"AGS> Current Group:%d, Select UpRateIdx=%d in group %d\\n\",\n\t\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup, UpRateIdx, next_grp));\n\n\n\t\t\tif ((pEntry->AGSCtrl.MCSGroup == 0) && \n\t\t\t     (((pEntry->TxQuality[pCurrTxRate->upMcs3] > pEntry->TxQuality[pCurrTxRate->upMcs2]) && (pCurrTxRate->upMcs2 != pCurrTxRate->ItemNo)) || \n\t\t\t     ((pEntry->TxQuality[pCurrTxRate->upMcs3] > pEntry->TxQuality[pCurrTxRate->upMcs1]) && (pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo))))\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"%s: ##############\\n\", __FUNCTION__));\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: AGS: [3x3 peer device (Adhoc, DLS or AP)], Before - \"\n\t\t\t\t\t\"pEntry->AGSCtrl.MCSGroup = %d, TxQuality2[%d] = %d,  \"\n\t\t\t\t\t\"TxQuality1[%d] = %d, TxQuality0[%d] = %d\\n\",\n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\t\tpCurrTxRate->upMcs3, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs3], \n\t\t\t\t\tpCurrTxRate->upMcs2, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1]));\n\t\t\t}\n\t\t}\n\t\telse if ((pTable == AGS2x2HTRateTable)\n#ifdef DOT11_VHT_AC\n\t\t\t\t|| (pTable == Ags2x2VhtRateTable))\n#endif /* DOT11_VHT_AC*/\n\t\t\t)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: pEntry->AGSCtrl.MCSGroup = %d, TxQuality1[%d] = %d, \"\n\t\t\t\t\"TxQuality0[%d] = %d, pCurrTxRate->upMcs1 = %d, \"\n\t\t\t\t\"pCurrTxRate->ItemNo = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\tpCurrTxRate->upMcs2, pEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\tpCurrTxRate->upMcs1, pEntry->TxQuality[pCurrTxRate->upMcs1], \n\t\t\t\tpCurrTxRate->upMcs1, pCurrTxRate->ItemNo));\n\t\t\t\n\t\t\t/* 2x2 peer device (Adhoc, DLS or AP) */\n\t\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t\t{\n\t\t\t\tcase 0: /* MCS selection in round robin policy */\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\t\t/* MCS group #1 has better Tx quality */\n\t\t\t\t\t\tif ((pEntry->TxQuality[UpRateIdx] > pEntry->TxQuality[pCurrTxRate->upMcs1]) && \n\t\t\t\t\t\t     (pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo))\n\t\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 2:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 1:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s: AGS: [2x2 peer device (Adhoc, DLS or AP)], \"\n\t\t\t\t\t\t\"Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\t\n\n\t\t\tif ((pEntry->AGSCtrl.MCSGroup == 0) && \n\t\t\t     ((pEntry->TxQuality[pCurrTxRate->upMcs2] > pEntry->TxQuality[pCurrTxRate->upMcs1]) &&\n\t\t\t\t\t(pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo)))\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: ###########\\n\", __FUNCTION__));\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: AGS: [2x2 peer device (Adhoc, DLS or AP)], Before - \"\n\t\t\t\t\t\"pEntry->AGSCtrl.MCSGroup = %d, TxQuality1[%d] = %d, \"\n\t\t\t\t\t\"TxQuality0[%d] = %d\\n\",\n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\t\tpCurrTxRate->upMcs2, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1]));\n\t\t\t}\n\t\t} \n\t\telse \n\t\t{\n\t\t\t/* 1x1 peer device (Adhoc, DLS or AP) */\n\t\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\tcase 0:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s: AGS: [1x1 peer device (Adhoc, DLS or AP)], \"\n\t\t\t\t\t\t\"Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\n\t\t/* The STA uses the best Tx rate at this moment. */\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t{\n\t\t\t/* current rate is the best one */\n\t\t\tpEntry->AGSCtrl.MCSGroup = 0; /* Try to escape the local optima */\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> Current rate is the best one!\\n\"));\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif ((pEntry->TxQuality[UpRateIdx] > 0) && (pEntry->AGSCtrl.MCSGroup > 0))\n\t\t{\n\t\t\t/*\n\t\t\t\tQuality of up rate is bad try to use lower group.\n\t\t\t\tSo continue to get the up rate index.\n\t\t\t*/\n\t\t\tpEntry->AGSCtrl.MCSGroup--; /* Try to use the MCS of the lower MCS group */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t} while (1);\n\t\n\tDownRateIdx = pCurrTxRate->downMcs;\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"ags> UpRateIdx = %d, DownRateIdx = %d\\n\",\n\t\t\t\tUpRateIdx, DownRateIdx));\n\n#ifdef DOT11_N_SUPPORT\n\tif ((pAGSStatisticsInfo->RSSI > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t{\n\t\tTrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tTrainUp = pCurrTxRate->TrainUp;\n\t\tTrainDown = pCurrTxRate->TrainDown;\n\t}\n\n\t/* Keep the TxRateChangeAction status */\n\tpEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;\n\n\n\t/* MCS selection based on the RSSI information when the Tx samples are fewer than 15. */\n\tif (pAGSStatisticsInfo->AccuTxTotalCnt <= 15)\n\t{\n\t\tCHAR idx = 0;\n\t\tUCHAR TxRateIdx;\n\t\tUCHAR MCS[24] = {0};\n\t\t/* Check the existence and index of each needed MCS */\n\n#ifdef DOT11_VHT_AC\n\t\tif ((pTable == Ags2x2VhtRateTable) || (pTable == Ags1x1VhtRateTable))\n\t\t{\n\t\t\tINT mcs_idx_offset;\n\t\t\twhile (idx < pTable[0])\n\t\t\t{\n\t\t\t\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(idx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\t\t\t\tif (pCurrTxRate->Mode == MODE_VHT)\n\t\t\t\t{\n\t\t\t\t\tif (pCurrTxRate->Nss == NSS_1)\n\t\t\t\t\t\tmcs_idx_offset = 0;\n\t\t\t\t\telse if ((pCurrTxRate->Nss == NSS_2) && (pTable == Ags2x2VhtRateTable))\n\t\t\t\t\t\tmcs_idx_offset = 8;\n\n\t\t\t\t\tif ((pCurrTxRate->CurrMCS >= MCS_0) && (pCurrTxRate->CurrMCS <= MCS_7))\n\t\t\t\t\t\t\tMCS[pCurrTxRate->CurrMCS + mcs_idx_offset] = idx;\n\t\t\t\t}\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* DOT11_VHT_AC */\n\t\t{\n\t\t\twhile (idx < pTable[0])\n\t\t\t{\n\t\t\t\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(idx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\t\t\t\tif (pCurrTxRate->CurrMCS >= MCS_0 && pCurrTxRate->CurrMCS <= MCS_23)\n\t\t\t\t\tMCS[pCurrTxRate->CurrMCS] = idx;\t\t\t\t\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\n\t\t/* peer device (Adhoc, DLS or AP) */\n\t\tRssiOffset = 0;\n\t\tif (pTable == AGS3x3HTRateTable)\n\t\t{\n\t\t\tif (MCS[23] && (pAGSStatisticsInfo->RSSI > (-67 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[23];\n\t\t\telse if (MCS[22] && (pAGSStatisticsInfo->RSSI > (-69 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[22];\n\t\t\telse if (MCS[21] && (pAGSStatisticsInfo->RSSI > (-72 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[21];\n\t\t\telse if (MCS[20] && (pAGSStatisticsInfo->RSSI > (-74 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[20];\n\t\t\telse if (MCS[19] && (pAGSStatisticsInfo->RSSI > (-78 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[19];\n\t\t\telse if (MCS[18] && (pAGSStatisticsInfo->RSSI > (-80 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[18];\n\t\t\telse if (MCS[17] && (pAGSStatisticsInfo->RSSI > (-85 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[17];\n\t\t\telse\n\t\t\t\tTxRateIdx = MCS[16];\n\n\t\t\tpEntry->AGSCtrl.MCSGroup = 3;\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"ags> Group3 RSSI = %d, TxRateIdx = %d\\n\",\n\t\t\t\t\tpAGSStatisticsInfo->RSSI, TxRateIdx));\n\t\t}\n\t\telse if (pTable == AGS2x2HTRateTable)\n#ifdef DOT11_VHT_AC\n\t\t\t\t|| (pTable == Ags2x2VhtRateTable))\n#endif /* DOT11_VHT_AC */\n\t\t)\n\t\t{\n#ifdef DOT11_VHT_AC\n\t\t\tif (pTable == Ags2x2VhtRateTable)\n\t\t\t\tRssiOffset = AgsRssiOffsetTable[1][pAd->CommonCfg.BBPCurrentBW];\n#endif /* DOT11_VHT_AC */\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: 2*2, RssiOffsetForAgs=%d\\n\", __FUNCTION__, RssiOffset));\n\n\t\t\tif (MCS[15 && (pAGSStatisticsInfo->RSSI > (-69 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[15];\n\t\t\telse if (MCS[14 && (pAGSStatisticsInfo->RSSI > (-71 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[14];\n\t\t\telse if (MCS[13 && (pAGSStatisticsInfo->RSSI > (-74 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[13];\n\t\t\telse if (MCS[12 && (pAGSStatisticsInfo->RSSI > (-76 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[12];\n\t\t\telse if (MCS[11 && (pAGSStatisticsInfo->RSSI > (-80 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[11];\n\t\t\telse if (MCS[10 && (pAGSStatisticsInfo->RSSI > (-82 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[10];\n\t\t\telse if (MCS[9 && (pAGSStatisticsInfo->RSSI > (-87 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[9];\n\t\t\telse\n\t\t\t\tTxRateIdx = MCS[8];\n\t\t\t\n\t\t\tpEntry->AGSCtrl.MCSGroup = 2;\n\t\t} \n\t\telse\n\t\t{\n#ifdef DOT11_VHT_AC\n\t\t\tif (pTable == Ags1x1VhtRateTable)\n\t\t\t\tRssiOffset = AgsRssiOffsetTable[0][pAd->CommonCfg.BBPCurrentBW];\n#endif /* DOT11_VHT_AC */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: 1*1, RssiOffset=%d\\n\", __FUNCTION__, RssiOffset));\n\t\t\t\n\t\t\t/* 1x1 peer device (Adhoc, DLS or AP) */\n\t\t\tif (MCS[7] && (pAGSStatisticsInfo->RSSI > (-71 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[7];\n\t\t\telse if (MCS[6] && (pAGSStatisticsInfo->RSSI > (-73 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[6];\n\t\t\telse if (MCS[5] && (pAGSStatisticsInfo->RSSI > (-76 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[5];\n\t\t\telse if (MCS[4] && (pAGSStatisticsInfo->RSSI > (-78 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[4];\n\t\t\telse if (MCS[3] && (pAGSStatisticsInfo->RSSI > (-82 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[3];\n\t\t\telse if (MCS[2] && (pAGSStatisticsInfo->RSSI > (-84 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[2];\n\t\t\telse if (MCS[1] && (pAGSStatisticsInfo->RSSI > (-89 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = MCS[0];\n\t\t\t\n\t\t\tpEntry->AGSCtrl.MCSGroup = 1;\n\t\t}\n\n\t\tpEntry->AGSCtrl.lastRateIdx = pEntry->CurrTxRateIndex;\n\t\tpEntry->CurrTxRateIndex = TxRateIdx;\n\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\t\tMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\n\t\tRTMPZeroMemory(pEntry->TxQuality, (sizeof(USHORT) * (MAX_TX_RATE_INDEX+1)));\n\t\tRTMPZeroMemory(pEntry->PER, (sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1)));\n\t\t\n\t\tpEntry->fLastSecAccordingRSSI = TRUE;\t\t\t\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\treturn;\n\t}\n\n\t/* The MCS selection is based on the RSSI and skips the rate tuning this time. */\n\tif (pEntry->fLastSecAccordingRSSI == TRUE)\n\t{\n\t\tpEntry->fLastSecAccordingRSSI = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\t\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: The MCS selection base on RSSI\\n\", __FUNCTION__));\n\n\t\treturn;\n\t}\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: TrainUp:%d, TrainDown:%d\\n\", __FUNCTION__, TrainUp, TrainDown));\n\n\tdo\n\t{\n\t\tBOOLEAN\tbTrainUpDown = FALSE;\n\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: AGS: TxQuality[CurrRateIdx(%d)] = %d, UpPenalty:%d\\n\",\n\t\t\t\t\t__FUNCTION__, CurrRateIdx,\n\t\t\t\t\tpEntry->TxQuality[CurrRateIdx], pEntry->TxRateUpPenalty));\n\t\t\t\n\t\tif (pAGSStatisticsInfo->TxErrorRatio >= TrainDown) /* Poor quality */\n\t\t{\n\t\t\t/* error ratio too high, do rate down */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t\t(\"%s: AGS: (DOWN) TxErrorRatio >= TrainDown\\n\",__FUNCTION__));\n\t\t\tbTrainUpDown = TRUE;\n\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\t\t}\n\t\telse if (pAGSStatisticsInfo->TxErrorRatio <= TrainUp) /* Good quality */\n\t\t{\n\t\t\tbTrainUpDown = TRUE;\n\t\t\tbUpgradeQuality = TRUE;\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: (UP) pEntry->TxQuality[CurrRateIdx] = %d, pEntry->TxRateUpPenalty = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tpEntry->TxQuality[CurrRateIdx], \n\t\t\t\tpEntry->TxRateUpPenalty));\n\t\t\t\n\t\t\tif (pEntry->TxQuality[CurrRateIdx])\n\t\t\t\tpEntry->TxQuality[CurrRateIdx]--;\t/* Good quality in the current Tx rate */\n\n\t\t\tif (pEntry->TxRateUpPenalty) \n\t\t\t\tpEntry->TxRateUpPenalty--;\t/* no use for the parameter */\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pEntry->TxQuality[pCurrTxRate->upMcs3] && (pCurrTxRate->upMcs3 != CurrRateIdx))\n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs3]--;\n\t\t\t\t\n\t\t\t\tif (pEntry->TxQuality[pCurrTxRate->upMcs2] && (pCurrTxRate->upMcs2 != CurrRateIdx))\n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2]--;\n\t\t\t\t\n\t\t\t\tif (pEntry->TxQuality[pCurrTxRate->upMcs1] && (pCurrTxRate->upMcs1 != CurrRateIdx))\n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1]--;\n\t\t\t}\n\t\t}\n\t\telse if (pEntry->AGSCtrl.MCSGroup > 0) /* even if TxErrorRatio > TrainUp */\n\t\t{\n\t\t\t/* not bad and not good */\n\t\t\tif (UpRateIdx != 0)\n\t\t\t{\n\t\t\t\tbTrainUpDown = TRUE;\n\n\t\t\t\t/* Good quality in the current Tx rate */\n\t\t\t\tif (pEntry->TxQuality[CurrRateIdx])\n\t\t\t\t\tpEntry->TxQuality[CurrRateIdx]--;\n\n\t\t\t\t/* It may improve next train-up Tx rate's quality */\n\t\t\t\t if (pEntry->TxQuality[UpRateIdx])\n\t\t\t\t\tpEntry->TxQuality[UpRateIdx]--;\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> not bad and not good\\n\"));\n\t\t\t}\n\t\t}\n\n\t\t/* update error ratio for current MCS */\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)(pAGSStatisticsInfo->TxErrorRatio);\n\n\t\t/* Update the current Tx rate */\n\t\tif (bTrainUpDown)\n\t\t{\n\t\t\t/* need to rate up or down */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, \n\t\t\t\t(\"%s: AGS: bTrainUpDown = %d, CurrRateIdx = %d, DownRateIdx = %d, UpRateIdx = %d, pEntry->TxQuality[CurrRateIdx] = %d, pEntry->TxQuality[UpRateIdx] = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tbTrainUpDown, CurrRateIdx, DownRateIdx, UpRateIdx, \n\t\t\t\tpEntry->TxQuality[CurrRateIdx], pEntry->TxQuality[UpRateIdx]));\n\t\t\t\n\t\t\t/* Downgrade Tx rate */\n\t\t\tif ((CurrRateIdx != DownRateIdx) && \n\t\t\t     (pEntry->TxQuality[CurrRateIdx] >= AGS_TX_QUALITY_WORST_BOUND))\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"ags> rate down!\\n\"));\n\t\t\t}\n\t\t\telse if ((CurrRateIdx != UpRateIdx) && \n\t\t\t\t\t(pEntry->TxQuality[UpRateIdx] <= 0)) /* Upgrade Tx rate */\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"ags> rate up!\\n\"));\n\t\t\t}\n\t\t}\n\t} while (FALSE);\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: pEntry->CurrTxRateIndex = %d, CurrRateIdx = %d, pEntry->LastSecTxRateChangeAction = %d\\n\", \n\t\t__FUNCTION__, \n\t\tpEntry->CurrTxRateIndex, CurrRateIdx, \n\t\tpEntry->LastSecTxRateChangeAction));\n\t\n\t/* rate up/down post handle */\n\tif ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t     (pEntry->LastSecTxRateChangeAction == RATE_UP))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: ++TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\n\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\tpEntry->TxRateUpPenalty = 0;\n\t\tRTMPZeroMemory(pEntry->PER, sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1));\n\t\tpEntry->AGSCtrl.lastRateIdx = CurrRateIdx;\n\n\t\tbTxRateChanged = TRUE;\n\t}\n\telse if ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t             (pEntry->LastSecTxRateChangeAction == RATE_DOWN))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: --TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\n\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\tpEntry->TxRateUpPenalty = 0; /* No penalty */\n\t\tpEntry->TxQuality[pEntry->CurrTxRateIndex] = 0;\n\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t\tpEntry->AGSCtrl.lastRateIdx = CurrRateIdx;\n\n\t\tbTxRateChanged = TRUE;\n\t}\n\telse /* Tx rate remains unchanged. */\n\t{\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE; /* Tx rate remains unchanged. */\n\t\tbTxRateChanged = FALSE;\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> no rate up/down!\\n\"));\n\t}\n\n\t/* Tx rate fast train up/down */\n\tif ((bTxRateChanged == TRUE) &&\n\t\t(!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning))\n\t{\n\t\tRTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, pAd->ra_fast_interval);\n\t\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE;\n\t}\n\n\tpEntry->LastTxOkCount = pAGSStatisticsInfo->TxSuccess;\n\n\t/* set new tx rate */\n\tpNextTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\tif ((bTxRateChanged == TRUE) && (pNextTxRate != NULL))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"ags> set new rate MCS = %d!\\n\", pEntry->CurrTxRateIndex));\n\t\tMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\t}\n\n\t/* RDG threshold control for the infrastructure mode only */\n\tif (INFRA_ON(pAd))\n\t{\n\t\tif ((pAd->CommonCfg.bRdg == TRUE) &&\n\t\t\tCLIENT_STATUS_TEST_FLAG(&pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\t\t\t\tfCLIENT_STATUS_RDG_CAPABLE)) /* RDG capable */\n\t\t{\n\t\t\tTXOP_THRESHOLD_CFG_STRUC TxopThCfg = {{0}};\n\t\t\tTX_LINK_CFG_STRUC TxLinkCfg = {{0}};\n\t\t\t\n\t\t\tif ((pAd->RalinkCounters.OneSecReceivedByteCount > (pAd->RalinkCounters.OneSecTransmittedByteCount * 5)) && \n\t\t\t     (pNextTxRate->CurrMCS != MCS_23) && \n\t\t\t     ((pAd->RalinkCounters.OneSecReceivedByteCount + pAd->RalinkCounters.OneSecTransmittedByteCount) >= (50 * 1024)))\n\t\t\t{\n\t\t\t\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\t\t\t\tTxLinkCfg.field.TxRDGEn = 0;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\n\t\t\t\tRTMP_IO_READ32(pAd, TXOP_THRES_CFG, &TxopThCfg.word);\n\t\t\t\tTxopThCfg.field.RDG_IN_THRES = 0xFF; /* Similar to diable Rx RDG */\n\t\t\t\tTxopThCfg.field.RDG_OUT_THRES = 0x00;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TXOP_THRES_CFG, TxopThCfg.word);\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"AGS: %s: RDG_IN_THRES = 0xFF\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\t\t\t\tTxLinkCfg.field.TxRDGEn = 1;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\n\t\t\t\tRTMP_IO_READ32(pAd, TXOP_THRES_CFG, &TxopThCfg.word);\n\t\t\t\tTxopThCfg.field.RDG_IN_THRES = 0x00;\n\t\t\t\tTxopThCfg.field.RDG_OUT_THRES = 0x00;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TXOP_THRES_CFG, TxopThCfg.word);\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"AGS: %s: RDG_IN_THRES = 0x00\\n\", __FUNCTION__));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* reset all OneSecTx counters */\n\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"AGS: <--- %s\\n\", __FUNCTION__));\n}\n\n\n/*\n\tAuto Tx rate faster train up/down for AGS (Adaptive Group Switching)\n\t\n\tParameters\n\t\tpAd: The adapter data structure\n\t\tpEntry: Pointer to a caller-supplied variable in which points to a MAC table entry\n\t\tpTable: Pointer to a caller-supplied variable in wich points to a Tx rate switching table\n\t\tTableSize: The size, in bytes, of the specified Tx rate switching table\n\t\tpAGSStatisticsInfo: Pointer to a caller-supplied variable in which points to the statistics information\n\n\tReturn Value:\n\t\tNone\n*/\nVOID StaQuickResponeForRateUpExecAGS(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PMAC_TABLE_ENTRY pEntry, \n\tIN PUCHAR pTable, \n\tIN UCHAR TableSize, \n\tIN PAGS_STATISTICS_INFO pAGSStatisticsInfo,\n\tIN UCHAR InitTxRateIdx)\n{\n\tUCHAR UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx = 0;\n\tBOOLEAN bTxRateChanged = TRUE;\n\tRTMP_RA_AGS_TB *pCurrTxRate = NULL;\n\tRTMP_RA_LEGACY_TB *pNextTxRate = NULL;\n\tUCHAR TrainDown = 0, TrainUp = 0;\n\tCHAR ratio = 0;\n\tULONG OneSecTxNoRetryOKRationCount = 0;\n\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"QuickAGS: ---> %s\\n\", __FUNCTION__));\n\n\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;\n\n\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t(\"%s: QuickAGS: AccuTxTotalCnt = %lu, TxSuccess = %lu, \"\n\t\t\"TxRetransmit = %lu, TxFailCount = %lu, TxErrorRatio = %lu\\n\",\n\t\t__FUNCTION__, \n\t\tpAGSStatisticsInfo->AccuTxTotalCnt, \n\t\tpAGSStatisticsInfo->TxSuccess, \n\t\tpAGSStatisticsInfo->TxRetransmit, \n\t\tpAGSStatisticsInfo->TxFailCount, \n\t\tpAGSStatisticsInfo->TxErrorRatio));\n\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\t\n\n\tif (CurrRateIdx >= TableSize)\n\t\tCurrRateIdx = TableSize - 1;\n\n\tUpRateIdx = DownRateIdx = pEntry->AGSCtrl.lastRateIdx;\n\n\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(CurrRateIdx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\tif ((pAGSStatisticsInfo->RSSI > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t{\n\t\tTrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n\t{\n\t\tTrainUp = pCurrTxRate->TrainUp;\n\t\tTrainDown = pCurrTxRate->TrainDown;\n\t}\n\t\t\n\t/* MCS selection based on the RSSI information when the Tx samples are fewer than 15. */\n\tif (pAGSStatisticsInfo->AccuTxTotalCnt <= 15)\n\t{\n\t\tRTMPZeroMemory(pEntry->TxQuality, sizeof(USHORT) * (MAX_TX_RATE_INDEX+1));\n\t\tRTMPZeroMemory(pEntry->PER, sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1));\n\n\t\tif ((pEntry->LastSecTxRateChangeAction == 1) && (CurrRateIdx != DownRateIdx))\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\t\t}\n\t\telse if ((pEntry->LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx))\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t}\n\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t(\"%s: QuickAGS: AccuTxTotalCnt <= 15, train back to original rate\\n\", \n\t\t\t__FUNCTION__));\n\t\t\n\t\treturn;\n\t}\n\n\tdo\n\t{\n\t\tif (pEntry->LastTimeTxRateChangeAction == 0)\n\t\t\tratio = 5;\n\t\telse\n\t\t\tratio = 4;\n\n\t\tif (pAGSStatisticsInfo->TxErrorRatio >= TrainDown) /* Poor quality */\n\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)(pAGSStatisticsInfo->TxErrorRatio);\n\n\t\tOneSecTxNoRetryOKRationCount = (pAGSStatisticsInfo->TxSuccess * ratio);\n\t\t\n\t\t/* Tx rate down */\n\t\tif ((pEntry->LastSecTxRateChangeAction == 1) && (CurrRateIdx != DownRateIdx))\n\t\t{\n\t\t\t// Change Auto Rate tuning rule 1: Change from tx_ok to PER\n\t\t\tif (pAGSStatisticsInfo->TxErrorRatio > TrainDown)  /* Poor quality */\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: (UP) bad Tx ok count (Current PER:%d, NewMcs's TrainDown:%d)\\n\",\n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpAGSStatisticsInfo->TxErrorRatio, TrainDown));\n\t\t\t}\n\t\t\telse /* Good quality */\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: (UP) keep rate-up (Current PER:%d, NewMcs's TrainDown:%d)\\n\", \n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpAGSStatisticsInfo->TxErrorRatio,\n\t\t\t\t\tTrainDown));\n\n\t\t\t\tRTMPZeroMemory(pEntry->TxQuality, sizeof(USHORT) * (MAX_TX_RATE_INDEX+1));\n\n\t\t\t\tif (pEntry->AGSCtrl.MCSGroup == 0)\n\t\t\t\t{\n\t\t\t\t\tif (pTable == AGS3x3HTRateTable)\n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup = 3;\n\t\t\t\t\telse if ((pTable == AGS2x2HTRateTable) ||\n\t\t\t\t\t            (pTable == Ags2x2VhtRateTable))\n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup = 2;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((pEntry->LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx)) // Tx rate up\n\t\t{\n\n// Don't quick check within train down case\n\t\t}\n\t}while (FALSE);\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"ags> new group = %d\\n\", pEntry->AGSCtrl.MCSGroup));\n\n\t/* Last action is rate-up */\n\tif (pEntry->LastSecTxRateChangeAction == 1) \n\t{\n\t\t/* looking for the next group with valid MCS */\n\t\tif ((pEntry->CurrTxRateIndex != CurrRateIdx) && (pEntry->AGSCtrl.MCSGroup > 0))\n\t\t{\n\t\t\tpEntry->AGSCtrl.MCSGroup--; /* Try to use the MCS of the lower MCS group */\n\t\t\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(DownRateIdx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\t\t}\n\t\t\n\t\t/* UpRateIdx is for temp use in this section */\n\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t{\n\t\t\tcase 3: \n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 2: \n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 1: \n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 0: \n\t\t\t\tUpRateIdx = CurrRateIdx;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault: \n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->AGSCtrl.MCSGroup));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Try to escape the local optima */\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t\tpEntry->AGSCtrl.MCSGroup = 0;\n\t\t\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: next MCS group,  pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t__FUNCTION__, pEntry->AGSCtrl.MCSGroup));\n\t\t\n\t}\n\n\tif ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t     (pEntry->LastSecTxRateChangeAction == 2)) /* Tx rate up */\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: ++TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\t\n\t\t\n\t\tpEntry->TxRateUpPenalty = 0;\n\t\tpEntry->TxQuality[pEntry->CurrTxRateIndex] = 0; /*restore the TxQuality from max to 0 */\n\t\tRTMPZeroMemory(pEntry->PER, sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1));\n\t}\n\telse if ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t            (pEntry->LastSecTxRateChangeAction == 1)) /* Tx rate down */\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: --TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\n\t\tpEntry->TxRateUpPenalty = 0; /* No penalty */\n\t\tpEntry->TxQuality[pEntry->CurrTxRateIndex] = 0;\n\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t}\n\telse\n\t{\n\t\tbTxRateChanged = FALSE;\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: rate is not changed\\n\", \n\t\t\t__FUNCTION__));\n\t}\n\n\tpNextTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\tif ((bTxRateChanged == TRUE) && (pNextTxRate != NULL))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"ags> confirm current rate MCS = %d!\\n\", pEntry->CurrTxRateIndex));\n\n\t\tMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\t}\n\n\t/* reset all OneSecTx counters */\n\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"QuickAGS: <--- %s\\n\", __FUNCTION__));\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n\tThe dynamic Tx rate switching for AGS in VHT(Adaptive Group Switching)\n\n\tParameters\n\t\tpAd: The adapter data structure\n\n\tReturn Value:\n\tNone\n*/\nVOID ApMlmeDynamicTxRateSwitchingAGS(\n\tIN RTMP_ADAPTER *pAd,\n\tIN INT idx)\n{\n\tUCHAR *pTable, TableSize = 0;\n\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[idx];\n\tUCHAR UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx = 0;\n\tRTMP_RA_AGS_TB *pCurrTxRate = NULL;\n\tRTMP_RA_LEGACY_TB *pNextTxRate = NULL;\n\tBOOLEAN bTxRateChanged = TRUE, bUpgradeQuality = FALSE;\n\tUCHAR TrainUp = 0, TrainDown = 0, next_grp;\n\tCHAR RssiOffset = 0;\n\tULONG TxTotalCnt, TxErrorRatio = 0;\n\tULONG TxSuccess, TxRetransmit, TxFailCount;\n\tAGS_STATISTICS_INFO AGSStatisticsInfo = {0};\n\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"AGS: ---> %s\\n\", __FUNCTION__));\n\t\n\tif (pAd->MacTab.Size == 1)\n\t{\n\t\tTX_STA_CNT1_STRUC\tStaTx1;\n\t\tTX_STA_CNT0_STRUC\tTxStaCnt0;\n\n\t\t/*  Update statistic counter */\n\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\t}\n\telse\n\t{\n\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t\t{\n\t\t\tULONG \tHwTxCnt, HwErrRatio;\n\n\t\t\tNicGetMacFifoTxCnt(pAd, pEntry);\n\t\t\tHwTxCnt = pEntry->fifoTxSucCnt + pEntry->fifoTxRtyCnt;\n\t\t\tif (HwTxCnt)\n\t\t\t\tHwErrRatio = (pEntry->fifoTxRtyCnt * 100) / HwTxCnt;\n\t\t\telse\n\t\t\t\tHwErrRatio = 0;\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"%s():Aid:%d, MCS:%d, TxErrRatio(Hw:0x%lx-0x%lx, Sw:0x%lx-%lx)\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS, \n\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\tTxSuccess = pEntry->fifoTxSucCnt;\n\t\t\tTxRetransmit = pEntry->fifoTxRtyCnt;\n\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\tTxErrorRatio = HwErrRatio;\n\t\t}\n#endif /*  FIFO_EXT_SUPPORT */\n\t}\n\n\tAGSStatisticsInfo.RSSI = RTMPAvgRssi(pAd, &pEntry->RssiSample);;\n\tAGSStatisticsInfo.TxErrorRatio = TxErrorRatio;\n\tAGSStatisticsInfo.AccuTxTotalCnt = TxTotalCnt;\n\tAGSStatisticsInfo.TxTotalCnt = TxTotalCnt;\n\tAGSStatisticsInfo.TxSuccess = TxSuccess;\n\tAGSStatisticsInfo.TxRetransmit = TxRetransmit;\n\tAGSStatisticsInfo.TxFailCount = TxFailCount;\n\n\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: AccuTxTotalCnt = %ld, TxSuccess = %ld, TxRetransmit = %ld, TxFailCount = %ld, TxErrorRatio = %ld\\n\",\n\t\t__FUNCTION__, \n\t\tAGSStatisticsInfo.AccuTxTotalCnt, \n\t\tAGSStatisticsInfo.TxSuccess, \n\t\tAGSStatisticsInfo.TxRetransmit, \n\t\tAGSStatisticsInfo.TxFailCount, \n\t\tAGSStatisticsInfo.TxErrorRatio));\n\n\tpTable = pEntry->pTable;\n\tTableSize = pTable[0];\n\t\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\t\n\n\tif (CurrRateIdx >= TableSize)\n\t\tCurrRateIdx = TableSize - 1;\n\n\n\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(CurrRateIdx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\t/* Select the next upgrade rate and the next downgrade rate, if any */\n\tdo \n\t{\n\t\tif (pTable == AGS3x3HTRateTable)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: pEntry->AGSCtrl.MCSGroup = %d, TxQuality2[%d] = %d,  \"\n\t\t\t\t\"TxQuality1[%d] = %d, TxQuality0[%d] = %d, pCurrTxRate->upMcs1 = %d, \"\n\t\t\t\t\"pCurrTxRate->ItemNo = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\tpCurrTxRate->upMcs3, \n\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs3], \n\t\t\t\tpCurrTxRate->upMcs2, \n\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1], \n\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\tpCurrTxRate->ItemNo));\n\n\t\t\t/* 3x3 */\n\t\t\t/* for 3*3, pEntry->AGSCtrl.MCSGroup = 0, 3, 3, 3, ... */\n\t\t\tnext_grp = pEntry->AGSCtrl.MCSGroup;\n\t\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t\t{\n\t\t\t\tcase 0: /* MCS selection in round robin policy (different MCS group) */\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\t\tnext_grp = 3;\n\n\t\t\t\t\t/* MCS group #2 has better Tx quality */\n\t\t\t\t\tif ((pEntry->TxQuality[UpRateIdx] > pEntry->TxQuality[pCurrTxRate->upMcs2]) && \n\t\t\t\t\t     (pCurrTxRate->upMcs2 != pCurrTxRate->ItemNo))\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\t\tnext_grp = 2;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* MCS group #1 has better Tx quality */\n\t\t\t\t\tif ((pEntry->TxQuality[UpRateIdx] > pEntry->TxQuality[pCurrTxRate->upMcs1]) && \n\t\t\t\t\t     (pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo))\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\t\tnext_grp = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 3:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 2:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 1:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s: AGS: Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\",\n\t\t\t\t\t\t__FUNCTION__, pEntry->AGSCtrl.MCSGroup));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t\t\t(\"AGS> Current Group:%d, Select UpRateIdx=%d in group %d\\n\",\n\t\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup, UpRateIdx, next_grp));\n\n\n\t\t\tif ((pEntry->AGSCtrl.MCSGroup == 0) && \n\t\t\t     (((pEntry->TxQuality[pCurrTxRate->upMcs3] > pEntry->TxQuality[pCurrTxRate->upMcs2]) && (pCurrTxRate->upMcs2 != pCurrTxRate->ItemNo)) || \n\t\t\t     ((pEntry->TxQuality[pCurrTxRate->upMcs3] > pEntry->TxQuality[pCurrTxRate->upMcs1]) && (pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo))))\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: ##############\\n\", __FUNCTION__));\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: AGS: [3x3 Before - \"\n\t\t\t\t\t\"pEntry->AGSCtrl.MCSGroup = %d, TxQuality2[%d] = %d,  \"\n\t\t\t\t\t\"TxQuality1[%d] = %d, TxQuality0[%d] = %d\\n\",\n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\t\tpCurrTxRate->upMcs3, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs3], \n\t\t\t\t\tpCurrTxRate->upMcs2, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1]));\n\t\t\t}\n\t\t}\n\t\telse if ((pTable == AGS2x2HTRateTable)\n#ifdef DOT11_VHT_AC\n\t\t\t\t|| (pTable == Ags2x2VhtRateTable)\n#endif /* DOT11_VHT_AC*/\n\t\t\t)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: pEntry->AGSCtrl.MCSGroup = %d, TxQuality1[%d] = %d, \"\n\t\t\t\t\"TxQuality0[%d] = %d, pCurrTxRate->upMcs1 = %d, \"\n\t\t\t\t\"pCurrTxRate->ItemNo = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\tpCurrTxRate->upMcs2, pEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\tpCurrTxRate->upMcs1, pEntry->TxQuality[pCurrTxRate->upMcs1], \n\t\t\t\tpCurrTxRate->upMcs1, pCurrTxRate->ItemNo));\n\t\t\t\n\t\t\t/* 2x2 peer device (Adhoc, DLS or AP) */\n\t\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t\t{\n\t\t\t\tcase 0: /* MCS selection in round robin policy */\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\t\t/* MCS group #1 has better Tx quality */\n\t\t\t\t\tif ((pEntry->TxQuality[UpRateIdx] > pEntry->TxQuality[pCurrTxRate->upMcs1]) && \n\t\t\t\t\t     (pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo))\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 2:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 1:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s: AGS: [2x2 peer device (Adhoc, DLS or AP)], \"\n\t\t\t\t\t\t\"Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\t\n\n\t\t\tif ((pEntry->AGSCtrl.MCSGroup == 0) && \n\t\t\t     ((pEntry->TxQuality[pCurrTxRate->upMcs2] > pEntry->TxQuality[pCurrTxRate->upMcs1]) &&\n\t\t\t\t\t(pCurrTxRate->upMcs1 != pCurrTxRate->ItemNo)))\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: ###########\\n\", __FUNCTION__));\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: AGS: [2x2 peer device (Adhoc, DLS or AP)], Before - \"\n\t\t\t\t\t\"pEntry->AGSCtrl.MCSGroup = %d, TxQuality1[%d] = %d, \"\n\t\t\t\t\t\"TxQuality0[%d] = %d\\n\",\n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpEntry->AGSCtrl.MCSGroup, \n\t\t\t\t\tpCurrTxRate->upMcs2, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2], \n\t\t\t\t\tpCurrTxRate->upMcs1, \n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1]));\n\t\t\t}\n\t\t} \n\t\telse \n\t\t{\n\t\t\t/* 1x1 peer device (Adhoc, DLS or AP) */\n\t\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\tcase 0:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,\n\t\t\t\t\t\t(\"%s: AGS: [1x1 peer device (Adhoc, DLS or AP)], \"\n\t\t\t\t\t\t\"Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\n\t\t/* The STA uses the best Tx rate at this moment. */\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t{\n\t\t\t/* current rate is the best one */\n\t\t\tpEntry->AGSCtrl.MCSGroup = 0; /* Try to escape the local optima */\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> Current rate is the best one!\\n\"));\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif ((pEntry->TxQuality[UpRateIdx] > 0) && (pEntry->AGSCtrl.MCSGroup > 0))\n\t\t{\n\t\t\t/*\n\t\t\t\tQuality of up rate is bad try to use lower group.\n\t\t\t\tSo continue to get the up rate index.\n\t\t\t*/\n\t\t\tpEntry->AGSCtrl.MCSGroup--; /* Try to use the MCS of the lower MCS group */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t} while (1);\n\n\tDownRateIdx = pCurrTxRate->downMcs;\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"ags> UpRateIdx = %d, DownRateIdx = %d\\n\",\n\t\t\t\tUpRateIdx, DownRateIdx));\n\n#ifdef DOT11_N_SUPPORT\n\tif ((AGSStatisticsInfo.RSSI > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t{\n\t\tTrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tTrainUp = pCurrTxRate->TrainUp;\n\t\tTrainDown = pCurrTxRate->TrainDown;\n\t}\n\n\t/* Keep the TxRateChangeAction status */\n\tpEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;\n\n\n\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: Rssi = %d, TxSuccess = %lu, TxRetransmit = %lu, TxFailCount = %lu, TxErrorRatio = %lu\\n\", \n\t\t__FUNCTION__, \n\t\tAGSStatisticsInfo.RSSI, \n\t\tAGSStatisticsInfo.TxSuccess, \n\t\tAGSStatisticsInfo.TxRetransmit, \n\t\tAGSStatisticsInfo.TxFailCount, \n\t\tAGSStatisticsInfo.TxErrorRatio));\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, \n\t\t(\"%s: AGS: Before - CurrTxRateIdx = %d, MCS = %d, STBC = %d, ShortGI = %d, Mode = %d, \"\n\t\t\"TrainUp = %d, TrainDown = %d, NextUp = %d, NextDown = %d, \"\n\t\t\"CurrMCS = %d, pEntry->AGSCtrl.MCSGroup = %d, PER = %lu%%, Retry = %lu, NoRetry = %lu\\n\", \n\t\t__FUNCTION__, \n\t\tCurrRateIdx, \n\t\tpCurrTxRate->CurrMCS, \n\t\tpCurrTxRate->STBC, \n\t\tpCurrTxRate->ShortGI, \n\t\tpCurrTxRate->Mode, \n\t\tTrainUp, \n\t\tTrainDown, \n\t\tUpRateIdx, \n\t\tDownRateIdx, \n\t\tpEntry->HTPhyMode.field.MCS, \n\t\tpEntry->AGSCtrl.MCSGroup, \n\t\tAGSStatisticsInfo.TxErrorRatio, \n\t\tAGSStatisticsInfo.TxRetransmit, \n\t\tAGSStatisticsInfo.TxSuccess));\n\n\t/* MCS selection based on the RSSI information when the Tx samples are fewer than 15. */\n\tif (AGSStatisticsInfo.AccuTxTotalCnt <= 15)\n\t{\n\t\tCHAR idx = 0;\n\t\tUCHAR TxRateIdx;\n\t\tUCHAR MCS[24] = {0};\n\t\t/* Check the existence and index of each needed MCS */\n\n#ifdef DOT11_VHT_AC\n\t\tif ((pTable == Ags2x2VhtRateTable) || (pTable == Ags1x1VhtRateTable))\n\t\t{\n\t\t\tINT mcs_idx_offset;\n\t\t\twhile (idx < pTable[0])\n\t\t\t{\n\t\t\t\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(idx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\t\t\t\tif (pCurrTxRate->Mode == MODE_VHT)\n\t\t\t\t{\n\t\t\t\t\tif (pCurrTxRate->Nss == NSS_1)\n\t\t\t\t\t\tmcs_idx_offset = 0;\n\t\t\t\t\telse if ((pCurrTxRate->Nss == NSS_2) && (pTable == Ags2x2VhtRateTable))\n\t\t\t\t\t\tmcs_idx_offset = 8;\n\t\t\t\t\telse {\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Invalid Nss(%d)\\n\", __FUNCTION__, pCurrTxRate->Nss));\n\t\t\t\t\t\tmcs_idx_offset = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((pCurrTxRate->CurrMCS <= MCS_7) /* && (pCurrTxRate->CurrMCS >= MCS_0) */)\n\t\t\t\t\t\tMCS[pCurrTxRate->CurrMCS + mcs_idx_offset] = idx;\n\t\t\t\t}\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* DOT11_VHT_AC */\n\t\t{\n\t\t\twhile (idx < pTable[0])\n\t\t\t{\n\t\t\t\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(idx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\t\t\t\tif (pCurrTxRate->CurrMCS <= MCS_23 /* && pCurrTxRate->CurrMCS >= MCS_0 */)\n\t\t\t\t\tMCS[pCurrTxRate->CurrMCS] = idx;\t\t\t\t\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\n\t\t/* peer device (Adhoc, DLS or AP) */\n\t\tRssiOffset = 0;\n\t\tif (pTable == AGS3x3HTRateTable)\n\t\t{\n\t\t\tif (MCS[23] && (AGSStatisticsInfo.RSSI > (-67 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[23];\n\t\t\telse if (MCS[22] && (AGSStatisticsInfo.RSSI > (-69 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[22];\n\t\t\telse if (MCS[21] && (AGSStatisticsInfo.RSSI > (-72 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[21];\n\t\t\telse if (MCS[20] && (AGSStatisticsInfo.RSSI > (-74 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[20];\n\t\t\telse if (MCS[19] && (AGSStatisticsInfo.RSSI > (-78 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[19];\n\t\t\telse if (MCS[18] && (AGSStatisticsInfo.RSSI > (-80 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[18];\n\t\t\telse if (MCS[17] && (AGSStatisticsInfo.RSSI > (-85 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[17];\n\t\t\telse\n\t\t\t\tTxRateIdx = MCS[16];\n\n\t\t\tpEntry->AGSCtrl.MCSGroup = 3;\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"ags> Group3 RSSI = %d, TxRateIdx = %d\\n\",\n\t\t\t\t\tAGSStatisticsInfo.RSSI, TxRateIdx));\n\t\t}\n\t\telse if ((pTable == AGS2x2HTRateTable)\n#ifdef DOT11_VHT_AC\n\t\t\t\t|| (pTable == Ags2x2VhtRateTable)\n#endif /* DOT11_VHT_AC */\n\t\t)\n\t\t{\n#ifdef DOT11_VHT_AC\n\t\t\tif (pTable == Ags2x2VhtRateTable)\n\t\t\t\tRssiOffset = AgsRssiOffsetTable[1][pAd->CommonCfg.BBPCurrentBW];\n#endif /* DOT11_VHT_AC */\n\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"%s: AGS: 2*2, RssiOffsetForAgs=%d\\n\", __FUNCTION__, RssiOffset));\n\t\t\t\n\t\t\tif (MCS[15] && (AGSStatisticsInfo.RSSI > (-69 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[15];\n\t\t\telse if (MCS[14] && (AGSStatisticsInfo.RSSI > (-71 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[14];\n\t\t\telse if (MCS[13] && (AGSStatisticsInfo.RSSI > (-74 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[13];\n\t\t\telse if (MCS[12] && (AGSStatisticsInfo.RSSI > (-76 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[12];\n\t\t\telse if (MCS[11] && (AGSStatisticsInfo.RSSI > (-80 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[11];\n\t\t\telse if (MCS[10] && (AGSStatisticsInfo.RSSI > (-82 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[10];\n\t\t\telse if (MCS[9] && (AGSStatisticsInfo.RSSI > (-87 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[9];\n\t\t\telse\n\t\t\t\tTxRateIdx = MCS[8];\n\t\t\t\n\t\t\tpEntry->AGSCtrl.MCSGroup = 2;\n\t\t} \n\t\telse\n\t\t{\n#ifdef DOT11_VHT_AC\n\t\t\tif (pTable == Ags1x1VhtRateTable)\n\t\t\t\tRssiOffset = AgsRssiOffsetTable[0][pAd->CommonCfg.BBPCurrentBW];\n#endif /* DOT11_VHT_AC */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: 1*1, RssiOffset=%d\\n\", __FUNCTION__, RssiOffset));\n\t\t\t\n\t\t\t/* 1x1 peer device (Adhoc, DLS or AP) */\n\t\t\tif (MCS[7] && (AGSStatisticsInfo.RSSI > (-71 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[7];\n\t\t\telse if (MCS[6] && (AGSStatisticsInfo.RSSI > (-73 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[6];\n\t\t\telse if (MCS[5] && (AGSStatisticsInfo.RSSI > (-76 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[5];\n\t\t\telse if (MCS[4] && (AGSStatisticsInfo.RSSI > (-78 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[4];\n\t\t\telse if (MCS[3] && (AGSStatisticsInfo.RSSI > (-82 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[3];\n\t\t\telse if (MCS[2] && (AGSStatisticsInfo.RSSI > (-84 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[2];\n\t\t\telse if (MCS[1] && (AGSStatisticsInfo.RSSI > (-89 + RssiOffset)))\n\t\t\t\tTxRateIdx = MCS[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = MCS[0];\n\t\t\t\n\t\t\tpEntry->AGSCtrl.MCSGroup = 1;\n\t\t}\n\n\t\tpEntry->AGSCtrl.lastRateIdx = pEntry->CurrTxRateIndex;\n\t\tpEntry->CurrTxRateIndex = TxRateIdx;\n\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\t\tAPMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\n\t\tRTMPZeroMemory(pEntry->TxQuality, (sizeof(USHORT) * (MAX_TX_RATE_INDEX+1)));\n\t\tRTMPZeroMemory(pEntry->PER, (sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1)));\n\t\t\n\t\tpEntry->fLastSecAccordingRSSI = TRUE;\t\t\t\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\treturn;\n\t}\n\n\t/* The MCS selection is based on the RSSI and skips the rate tuning this time. */\n\tif (pEntry->fLastSecAccordingRSSI == TRUE)\n\t{\n\t\tpEntry->fLastSecAccordingRSSI = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\t\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\t\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: The MCS selection base on RSSI\\n\", __FUNCTION__));\n\n\t\treturn;\n\t}\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: TrainUp:%d, TrainDown:%d\\n\", __FUNCTION__, TrainUp, TrainDown));\n\n\tdo\n\t{\n\t\tBOOLEAN\tbTrainUpDown = FALSE;\n\t\t\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: AGS: TxQuality[CurrRateIdx(%d)] = %d, UpPenalty:%d\\n\",\n\t\t\t\t\t__FUNCTION__, CurrRateIdx,\n\t\t\t\t\tpEntry->TxQuality[CurrRateIdx], pEntry->TxRateUpPenalty));\n\t\t\t\n\t\tif (AGSStatisticsInfo.TxErrorRatio >= TrainDown) /* Poor quality */\n\t\t{\n\t\t\t/* error ratio too high, do rate down */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t\t(\"%s: AGS: (DOWN) TxErrorRatio >= TrainDown\\n\",__FUNCTION__));\n\t\t\tbTrainUpDown = TRUE;\n\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\t\t}\n\t\telse if (AGSStatisticsInfo.TxErrorRatio <= TrainUp) /* Good quality */\n\t\t{\n\t\t\tbTrainUpDown = TRUE;\n\t\t\tbUpgradeQuality = TRUE;\n\t\t\t\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: (UP) pEntry->TxQuality[CurrRateIdx] = %d, pEntry->TxRateUpPenalty = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tpEntry->TxQuality[CurrRateIdx], \n\t\t\t\tpEntry->TxRateUpPenalty));\n\t\t\t\n\t\t\tif (pEntry->TxQuality[CurrRateIdx])\n\t\t\t\tpEntry->TxQuality[CurrRateIdx]--;\t/* Good quality in the current Tx rate */\n\n\t\t\tif (pEntry->TxRateUpPenalty)\n\t\t\t\tpEntry->TxRateUpPenalty--;\t/* no use for the parameter */\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pEntry->TxQuality[pCurrTxRate->upMcs3] && (pCurrTxRate->upMcs3 != CurrRateIdx))\n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs3]--;\n\t\t\t\t\n\t\t\t\tif (pEntry->TxQuality[pCurrTxRate->upMcs2] && (pCurrTxRate->upMcs2 != CurrRateIdx))\n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs2]--;\n\t\t\t\t\n\t\t\t\tif (pEntry->TxQuality[pCurrTxRate->upMcs1] && (pCurrTxRate->upMcs1 != CurrRateIdx))\n\t\t\t\t\tpEntry->TxQuality[pCurrTxRate->upMcs1]--;\n\t\t\t}\n\t\t}\n\t\telse if (pEntry->AGSCtrl.MCSGroup > 0) /* even if TxErrorRatio > TrainUp */\n\t\t{\n\t\t\t/* not bad and not good */\n\t\t\tif (UpRateIdx != 0)\n\t\t\t{\n\t\t\t\tbTrainUpDown = FALSE;\n\t\t\t\t\n\t\t\t\t/* Good quality in the current Tx rate */\n\t\t\t\tif (pEntry->TxQuality[CurrRateIdx])\n\t\t\t\t\tpEntry->TxQuality[CurrRateIdx]--;\n\n\t\t\t\t/* It may improve next train-up Tx rate's quality */\n\t\t\t\t if (pEntry->TxQuality[UpRateIdx])\n\t\t\t\t\tpEntry->TxQuality[UpRateIdx]--;\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> not bad and not good\\n\"));\n\t\t\t}\n\t\t}\n\n\t\t/* update error ratio for current MCS */\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)(AGSStatisticsInfo.TxErrorRatio);\n\n\t\t/* Update the current Tx rate */\n\t\tif (bTrainUpDown)\n\t\t{\n\t\t\t/* need to rate up or down */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"%s: AGS: bTrainUpDown = %d, CurrRateIdx = %d, DownRateIdx = %d, UpRateIdx = %d, pEntry->TxQuality[CurrRateIdx] = %d, pEntry->TxQuality[UpRateIdx] = %d\\n\",\n\t\t\t\t__FUNCTION__, \n\t\t\t\tbTrainUpDown, CurrRateIdx, DownRateIdx, UpRateIdx, \n\t\t\t\tpEntry->TxQuality[CurrRateIdx], pEntry->TxQuality[UpRateIdx]));\n\t\t\t\n\t\t\t/* Downgrade Tx rate */\n\t\t\tif ((CurrRateIdx != DownRateIdx) && \n\t\t\t     (pEntry->TxQuality[CurrRateIdx] >= AGS_TX_QUALITY_WORST_BOUND))\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> rate down!\\n\"));\n\t\t\t}\n\t\t\telse if ((CurrRateIdx != UpRateIdx) && \n\t\t\t\t\t(pEntry->TxQuality[UpRateIdx] <= 0)) /* Upgrade Tx rate */\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> rate up!\\n\"));\n\t\t\t}\n\t\t}\n\t} while (FALSE);\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: pEntry->CurrTxRateIndex = %d, CurrRateIdx = %d, pEntry->LastSecTxRateChangeAction = %d\\n\", \n\t\t__FUNCTION__, \n\t\tpEntry->CurrTxRateIndex, CurrRateIdx, \n\t\tpEntry->LastSecTxRateChangeAction));\n\t\n\t/* rate up/down post handle */\n\tif ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t     (pEntry->LastSecTxRateChangeAction == RATE_UP))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: ++TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\n\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\tpEntry->TxRateUpPenalty = 0;\n\t\tRTMPZeroMemory(pEntry->PER, sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1));\n\t\tpEntry->AGSCtrl.lastRateIdx = CurrRateIdx;\n\n\t\tbTxRateChanged = TRUE;\n\t}\n\telse if ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t             (pEntry->LastSecTxRateChangeAction == RATE_DOWN))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: AGS: --TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\n\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\tpEntry->TxRateUpPenalty = 0; /* No penalty */\n\t\tpEntry->TxQuality[pEntry->CurrTxRateIndex] = 0;\n\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t\tpEntry->AGSCtrl.lastRateIdx = CurrRateIdx;\n\n\t\tbTxRateChanged = TRUE;\n\t}\n\telse /* Tx rate remains unchanged. */\n\t{\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE; /* Tx rate remains unchanged. */\n\t\tbTxRateChanged = FALSE;\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> no rate up/down!\\n\"));\n\t}\n\n\t/* Tx rate fast train up/down */\n\tif ((bTxRateChanged == TRUE) &&\n\t\t(!pAd->ApCfg.ApQuickResponeForRateUpTimerRunning))\n\t{\n\t\tRTMPSetTimer(&pAd->ApCfg.ApQuickResponeForRateUpTimer, pAd->ra_fast_interval);\n\t\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = TRUE;\n\t}\n\tpEntry->LastTxOkCount = AGSStatisticsInfo.TxSuccess;\n\n\t/* set new tx rate */\n\tpNextTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\tif ((bTxRateChanged == TRUE) && (pNextTxRate != NULL))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"ags> set new rate MCS = %d!\\n\", pEntry->CurrTxRateIndex));\n\t\tAPMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\t}\n\t\n\t/* reset all OneSecTx counters */\n\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\n    DBGPRINT_RAW(RT_DEBUG_TRACE, (\"AGS: <--- %s\\n\", __FUNCTION__));\n}\n\n\n/*\n\tAuto Tx rate faster train up/down for AGS (Adaptive Group Switching)\n\n\tParameters\n\t\tpAd: The adapter data structure\n\t\tpEntry: Pointer to a caller-supplied variable in which points to a MAC table entry\n\t\tpTable: Pointer to a caller-supplied variable in wich points to a Tx rate switching table\n\t\tTableSize: The size, in bytes, of the specified Tx rate switching table\n\t\tpAGSStatisticsInfo: Pointer to a caller-supplied variable in which points to the statistics information\n\n\tReturn Value:\n\t\tNone\n*/\nVOID ApQuickResponeForRateUpExecAGS(\n\tIN RTMP_ADAPTER *pAd,\n\tIN INT idx)\n{\n\tUCHAR *pTable, TableSize = 0;\n\tUCHAR UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx = 0;\n\tRTMP_RA_AGS_TB *pCurrTxRate = NULL;\n\tRTMP_RA_LEGACY_TB *pNextTxRate = NULL;\n\tBOOLEAN bTxRateChanged = TRUE;\n\tUCHAR TrainUp = 0, TrainDown = 0;\n\tCHAR ratio = 0;\n\tULONG OneSecTxNoRetryOKRationCount = 0;\n\tMAC_TABLE_ENTRY *pEntry;\n\tAGS_STATISTICS_INFO AGSStatisticsInfo = {0};\n\tULONG TxTotalCnt, TxErrorRatio = 0;\n\tULONG TxSuccess, TxRetransmit, TxFailCount;\n\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"QuickAGS: ---> %s\\n\", __FUNCTION__));\n\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = FALSE;\n\t\n\tpEntry = &pAd->MacTab.Content[idx]; /* point to information of the individual station */\n\tpTable = pEntry->pTable;\n\tTableSize = pTable[0];\n\n\tif (pAd->MacTab.Size == 1)\n\t{\n\t\tTX_STA_CNT1_STRUC StaTx1;\n\t\tTX_STA_CNT0_STRUC TxStaCnt0;\n\n\t\t/*  Update statistic counter */\n\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\t}\n\telse\n\t{\n\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t\t{\n\t\t\tULONG \tHwTxCnt, HwErrRatio;\n\n\t\t\tNicGetMacFifoTxCnt(pAd, pEntry);\n\t\t\tHwTxCnt = pEntry->fifoTxSucCnt + pEntry->fifoTxRtyCnt;\n\t\t\tif (HwTxCnt)\n\t\t\t\tHwErrRatio = (pEntry->fifoTxRtyCnt * 100) / HwTxCnt;\n\t\t\telse\n\t\t\t\tHwErrRatio = 0;\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"%s():Aid:%d, MCS:%d, TxErrRatio(Hw:0x%lx-0x%lx, Sw:0x%lx-%lx)\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS, \n\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\tTxSuccess = pEntry->fifoTxSucCnt;\n\t\t\tTxRetransmit = pEntry->fifoTxRtyCnt;\n\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\tTxErrorRatio = HwErrRatio;\n\t\t}\n#endif /*  FIFO_EXT_SUPPORT */\n\t}\n\n\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t(\"%s: QuickAGS: AccuTxTotalCnt = %lu, TxSuccess = %lu, \"\n\t\t\"TxRetransmit = %lu, TxFailCount = %lu, TxErrorRatio = %lu\\n\",\n\t\t__FUNCTION__, \n\t\tAGSStatisticsInfo.AccuTxTotalCnt, \n\t\tAGSStatisticsInfo.TxSuccess, \n\t\tAGSStatisticsInfo.TxRetransmit, \n\t\tAGSStatisticsInfo.TxFailCount, \n\t\tAGSStatisticsInfo.TxErrorRatio));\n\t\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\t\n\n\tif (CurrRateIdx >= TableSize)\n\t\tCurrRateIdx = TableSize - 1;\n\n\tUpRateIdx = DownRateIdx = pEntry->AGSCtrl.lastRateIdx;\n\n\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(CurrRateIdx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\n\tif ((AGSStatisticsInfo.RSSI > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t{\n\t\tTrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n\t{\n\t\tTrainUp = pCurrTxRate->TrainUp;\n\t\tTrainDown = pCurrTxRate->TrainDown;\n\t}\n\n\t/* MCS selection based on the RSSI information when the Tx samples are fewer than 15. */\n\tif (AGSStatisticsInfo.AccuTxTotalCnt <= 15)\n\t{\n\t\tRTMPZeroMemory(pEntry->TxQuality, sizeof(USHORT) * (MAX_TX_RATE_INDEX+1));\n\t\tRTMPZeroMemory(pEntry->PER, sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1));\n\n\t\tif ((pEntry->LastSecTxRateChangeAction == 1) && (CurrRateIdx != DownRateIdx))\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\t\t}\n\t\telse if ((pEntry->LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx))\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t}\n\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t(\"%s: QuickAGS: AccuTxTotalCnt <= 15, train back to original rate\\n\", \n\t\t\t__FUNCTION__));\n\t\t\n\t\treturn;\n\t}\n\n\tdo\n\t{\n\t\tif (pEntry->LastTimeTxRateChangeAction == 0)\n\t\t\tratio = 5;\n\t\telse\n\t\t\tratio = 4;\n\n\t\tif (AGSStatisticsInfo.TxErrorRatio >= TrainDown) /* Poor quality */\n\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)(AGSStatisticsInfo.TxErrorRatio);\n\n\t\tOneSecTxNoRetryOKRationCount = (AGSStatisticsInfo.TxSuccess * ratio);\n\t\t\n\t\t/* Tx rate down */\n\t\tif ((pEntry->LastSecTxRateChangeAction == 1) && (CurrRateIdx != DownRateIdx))\n\t\t{\n\t\t\t// Change Auto Rate tuning rule 1: Change from tx_ok to PER\n\t\t\tif (AGSStatisticsInfo.TxErrorRatio > TrainDown)  /* Poor quality */\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\t\tpEntry->TxQuality[CurrRateIdx] = AGS_TX_QUALITY_WORST_BOUND;\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: QuickAGS: (UP) bad Tx ok count (Current PER:%ld, NewMcs's TrainDown:%d)\\n\",\n\t\t\t\t\t__FUNCTION__, AGSStatisticsInfo.TxErrorRatio, TrainDown));\n\t\t\t}\n\t\t\telse /* Good quality */\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"%s: QuickAGS: (UP) keep rate-up (Current PER:%ld, NewMcs's TrainDown:%d)\\n\", \n\t\t\t\t\t__FUNCTION__, AGSStatisticsInfo.TxErrorRatio, TrainDown));\n\n\t\t\t\tRTMPZeroMemory(pEntry->TxQuality, sizeof(USHORT) * (MAX_TX_RATE_INDEX+1));\n\n\t\t\t\tif (pEntry->AGSCtrl.MCSGroup == 0)\n\t\t\t\t{\n\t\t\t\t\tif (pTable == AGS3x3HTRateTable)\n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup = 3;\n\t\t\t\t\telse if ((pTable == AGS2x2HTRateTable) || \n\t\t\t\t\t            (pTable == Ags2x2VhtRateTable))\n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup = 2;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->AGSCtrl.MCSGroup = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((pEntry->LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx)) // Tx rate up\n\t\t{\n\n// Don't quick check within train down case\n\t\t}\n\t}while (FALSE);\n\n\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"ags> new group = %d\\n\", pEntry->AGSCtrl.MCSGroup));\n\n\t/* Last action is rate-up */\n\tif (pEntry->LastSecTxRateChangeAction == 1) \n\t{\n\t\t/* looking for the next group with valid MCS */\n\t\tif ((pEntry->CurrTxRateIndex != CurrRateIdx) && (pEntry->AGSCtrl.MCSGroup > 0))\n\t\t{\n\t\t\tpEntry->AGSCtrl.MCSGroup--; /* Try to use the MCS of the lower MCS group */\n\t\t\tpCurrTxRate = (RTMP_RA_AGS_TB *)(&pTable[(DownRateIdx + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\t\t}\n\t\t\n\t\t/* UpRateIdx is for temp use in this section */\n\t\tswitch (pEntry->AGSCtrl.MCSGroup)\n\t\t{\n\t\t\tcase 3: \n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 2: \n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 1: \n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 0: \n\t\t\t\tUpRateIdx = CurrRateIdx;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault: \n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: Incorrect MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t\t\t__FUNCTION__, \n\t\t\t\t\tpEntry->AGSCtrl.MCSGroup));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Try to escape the local optima */\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t\tpEntry->AGSCtrl.MCSGroup = 0;\n\t\t\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: next MCS group, pEntry->AGSCtrl.MCSGroup = %d\\n\", \n\t\t\t__FUNCTION__, pEntry->AGSCtrl.MCSGroup));\n\t}\n\n\tif ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t     (pEntry->LastSecTxRateChangeAction == 2)) /* Tx rate up */\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: ++TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\t\n\t\t\n\t\tpEntry->TxRateUpPenalty = 0;\n\t\tpEntry->TxQuality[pEntry->CurrTxRateIndex] = 0; /*restore the TxQuality from max to 0 */\n\t\tRTMPZeroMemory(pEntry->PER, sizeof(UCHAR) * (MAX_TX_RATE_INDEX+1));\n\t}\n\telse if ((pEntry->CurrTxRateIndex != CurrRateIdx) && \n\t            (pEntry->LastSecTxRateChangeAction == 1)) /* Tx rate down */\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: --TX rate from %d to %d\\n\", \n\t\t\t__FUNCTION__, CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\n\t\tpEntry->TxRateUpPenalty = 0; /* No penalty */\n\t\tpEntry->TxQuality[pEntry->CurrTxRateIndex] = 0;\n\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t}\n\telse\n\t{\n\t\tbTxRateChanged = FALSE;\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: QuickAGS: rate is not changed\\n\", __FUNCTION__));\n\t}\n\n\tpNextTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1) * SIZE_OF_AGS_RATE_TABLE_ENTRY]);\n\tif ((bTxRateChanged == TRUE) && (pNextTxRate != NULL))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"ags> confirm current rate MCS = %d!\\n\", pEntry->CurrTxRateIndex));\n\n\t\tAPMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\t}\n\n\t/* reset all OneSecTx counters */\n\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"QuickAGS: <--- %s\\n\", __FUNCTION__));\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n#endif\t/* AGS_SUPPORT */\n\n"
  },
  {
    "path": "src/rate_ctrl/alg_grp.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll related Dynamic Rate Switch (AP/STA) function body.\n\n\tHistory:\n\n***************************************************************************/\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n#include \"rt_config.h\"\n\n\n/*\n\tMlmeSetMcsGroup - set initial mcsGroup based on supported MCSs\n\t\tOn exit pEntry->mcsGroup is set to the mcsGroup\n*/\nVOID MlmeSetMcsGroup(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)\n{\n#ifdef DOT11N_SS3_SUPPORT\n\tif ((pEntry->HTCapability.MCSSet[2] == 0xff) && (pAd->CommonCfg.TxStream == 3))\n\t\tpEntry->mcsGroup = 3;\n\t else\n#endif /* DOT11N_SS3_SUPPORT */\n\t if ((pEntry->HTCapability.MCSSet[0] == 0xff) &&\n\t\t(pEntry->HTCapability.MCSSet[1] == 0xff) &&\n\t\t(pAd->CommonCfg.TxStream > 1) &&\n\t\t((pAd->CommonCfg.TxStream == 2) || (pEntry->HTCapability.MCSSet[2] == 0x0)))\n\t\tpEntry->mcsGroup = 2;\n\telse\n\t\tpEntry->mcsGroup = 1;\n\n#ifdef DOT11_VHT_AC\n\t// TODO: shiang-6590, fix me!!\n\tif (pEntry->SupportRateMode & SUPPORT_VHT_MODE)\n\t{\n\t\tif ((pAd->CommonCfg.TxStream == 2) && (pEntry->SupportVHTMCS[8] == 0x1))\n\t\t\tpEntry->mcsGroup = 2;\n\t\telse\n\t\t\tpEntry->mcsGroup = 1;\n\t}\n#endif /* DOT11_VHT_AC */\n}\n\n\n/*\n\tMlmeSelectUpRate - select UpRate based on MCS group\n\treturns the UpRate index and updates the MCS group\n*/\nUCHAR MlmeSelectUpRate(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_GRP_TB *pCurrTxRate)\n{\n\tUCHAR UpRateIdx = 0;\n\n\twhile (1)\n\t{\n\t\tif ((pEntry->HTCapability.MCSSet[2] == 0xff) && (pAd->CommonCfg.TxStream == 3))\n\t\t{\n\t\t\tswitch (pEntry->mcsGroup)\n\t\t\t{\n\t\t\t\tcase 0:/* improvement: use round robin mcs when group == 0 */\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\t\tif (UpRateIdx == pCurrTxRate->ItemNo)\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\t\tif (UpRateIdx == pCurrTxRate->ItemNo)\n\t\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (MlmeGetTxQuality(pEntry, UpRateIdx) > MlmeGetTxQuality(pEntry, pCurrTxRate->upMcs2) &&\n\t\t\t\t\t\tpCurrTxRate->upMcs2 != pCurrTxRate->ItemNo)\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\n\t\t\t\t\tif (MlmeGetTxQuality(pEntry, UpRateIdx) > MlmeGetTxQuality(pEntry, pCurrTxRate->upMcs1) &&\n\t\t\t\t\t\tpCurrTxRate->upMcs1 != pCurrTxRate->ItemNo)\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"3ss:wrong mcsGroup value\\n\"));\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\t\telse if (((pEntry->HTCapability.MCSSet[0] == 0xff) &&\n\t\t\t\t (pEntry->HTCapability.MCSSet[1] == 0xff) &&\n\t\t\t\t (pAd->CommonCfg.TxStream > 1) &&\n\t\t\t\t ((pAd->CommonCfg.TxStream == 2) || (pEntry->HTCapability.MCSSet[2] == 0x0)))\n#ifdef DOT11_VHT_AC\n\t\t\t\t|| (pEntry->pTable == RateTableVht2S)\n#endif /* DOT11_VHT_AC */\n\t\t)\n\t\t{\n\t\t\tswitch (pEntry->mcsGroup)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\tif (UpRateIdx == pCurrTxRate->ItemNo)\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\n\t\t\t\t\tif (MlmeGetTxQuality(pEntry, UpRateIdx) > MlmeGetTxQuality(pEntry, pCurrTxRate->upMcs1) &&\n\t\t\t\t\t\tpCurrTxRate->upMcs1 != pCurrTxRate->ItemNo)\n\t\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"wrong mcsGroup value %d\\n\", pEntry->mcsGroup));\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (pEntry->mcsGroup)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\tcase 0:\n\t\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE, (\"wrong mcsGroup value %d\\n\", pEntry->mcsGroup));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/*  If going up from CCK to MCS32 make sure it's allowed */\n\t\tif (PTX_RA_GRP_ENTRY(pEntry->pTable, UpRateIdx)->CurrMCS == 32)\n\t\t{\n\t\t\t/*  If not allowed then skip over it */\n\t\t\tBOOLEAN mcs32Supported = 0;\n\t\t\tBOOLEAN mcs0Fallback = 0;\n\n\t\t\tif ((pEntry->HTCapability.MCSSet[4] & 0x1)\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_ENABLE_HT_DUP)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t\tmcs32Supported = 1;\n\n#ifdef DBG_CTRL_SUPPORT\n\t\t\tif ((pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS0)==0)\n\t\t\t\tmcs0Fallback = 1;\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t\tif (pEntry->MaxHTPhyMode.field.BW != BW_40 ||\n\t\t\t\tpAd->CommonCfg.BBPCurrentBW != BW_40 ||\n\t\t\t\t(!mcs32Supported && !mcs0Fallback))\n\t\t\t{\n\t\t\t\tUpRateIdx = PTX_RA_GRP_ENTRY(pEntry->pTable, UpRateIdx)->upMcs1;\n\t\t\t\tpEntry->mcsGroup = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/*  If ShortGI and not allowed then mark it as bad. We'll try another group below */\n\t\tif (PTX_RA_GRP_ENTRY(pEntry->pTable, UpRateIdx)->ShortGI &&\n\t\t\t!pEntry->MaxHTPhyMode.field.ShortGI)\n\t\t{\n\t\t\tMlmeSetTxQuality(pEntry, UpRateIdx, DRS_TX_QUALITY_WORST_BOUND*2);\n\t\t}\n\n\t\t/*  If we reached the end of the group then select the best next time */\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t{\n\t\t\tpEntry->mcsGroup = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\t/*  If the current group has bad TxQuality then try another group */\n\t\tif ((MlmeGetTxQuality(pEntry, UpRateIdx) > 0) && (pEntry->mcsGroup > 0))\n\t\t\tpEntry->mcsGroup--;\n\t\telse\n\t\t\tbreak;\n\t}\n\n\treturn UpRateIdx;\n}\n\n/*\n\tMlmeSelectDownRate - select DownRate.\n\t\tpEntry->pTable is assumed to be a pointer to an adaptive rate table with mcsGroup values\n\t\tCurrRateIdx - current rate index\n\t\treturns the DownRate index. Down Rate = CurrRateIdx if there is no valid Down Rate\n*/\nUCHAR MlmeSelectDownRate(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN UCHAR CurrRateIdx)\n{\n\tUCHAR DownRateIdx = PTX_RA_GRP_ENTRY(pEntry->pTable, CurrRateIdx)->downMcs;\n\tRTMP_RA_GRP_TB *pDownRate;\n\n\t/*  Loop until a valid down rate is found */\n\twhile (1) {\n\t\tpDownRate = PTX_RA_GRP_ENTRY(pEntry->pTable, DownRateIdx);\n\n\t\t/*  Break out of loop if rate is valid */\n\t\tif (pDownRate->Mode==MODE_CCK)\n\t\t{\n\t\t\t/*  CCK is valid only if in G band and if not disabled */\n\t\t\tif ((pAd->LatchRfRegs.Channel<=14\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t|| (pAd->CommonCfg.DebugFlags & DBF_ENABLE_CCK_5G)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t     )\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& ((pAd->CommonCfg.DebugFlags & DBF_DISABLE_CCK)==0)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (pDownRate->CurrMCS == MCS_32)\n\t\t{\n\t\t\tBOOLEAN valid_mcs32 = FALSE;\n\n\t\t\tif ((pEntry->MaxHTPhyMode.field.BW == BW_40 && pAd->CommonCfg.BBPCurrentBW == BW_40)\n#ifdef DOT11_VHT_AC\n\t\t\t\t|| (pEntry->MaxHTPhyMode.field.BW == BW_80 && pAd->CommonCfg.BBPCurrentBW == BW_80)\n#endif /* DOT11_VHT_AC */\n\t\t\t)\n\t\t\t\tvalid_mcs32 = TRUE;\n\n\t\t\t/*  If 20MHz MCS0 fallback enabled and in 40MHz then MCS32 is valid and will be mapped to 20MHz MCS0 */\n\t\t\tif (valid_mcs32\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& ((pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS0)==0)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t\tbreak;\n\n\t\t\t/*  MCS32 is valid if enabled and client supports it */\n\t\t\tif (valid_mcs32 && (pEntry->HTCapability.MCSSet[4] & 0x1)\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_ENABLE_HT_DUP)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t\tbreak;\t/*  All other rates are valid */\n\n\t\t/*  Return original rate if we reached the end without finding a valid rate */\n\t\tif (DownRateIdx == pDownRate->downMcs)\n\t\t\treturn CurrRateIdx;\n\n\t\t/*  Otherwise try the next lower rate */\n\t\tDownRateIdx = pDownRate->downMcs;\n\t}\n\n\treturn DownRateIdx;\n}\n\n\n/*\n\tMlmeGetSupportedMcsAdapt - fills in the table of supported MCSs\n\t\tpAd - pointer to adapter\n\t\tpEntry - MAC Table entry. pEntry->pTable is a rate table with mcsGroup values\n\t\tmcs23GI - the MCS23 entry will have this guard interval\n\t\tmcs - table of MCS index into the Rate Table. -1 => not supported\n*/\nVOID MlmeGetSupportedMcsAdapt(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN UCHAR mcs23GI,\n\tOUT CHAR mcs[])\n{\n\tCHAR idx;\n\tRTMP_RA_GRP_TB *pCurrTxRate;\n\tUCHAR *pTable = pEntry->pTable;\n\n\tfor (idx=0; idx<24; idx++)\n\t\tmcs[idx] = -1;\n\n#ifdef DOT11_VHT_AC\n\tif (pEntry->pTable == RateTableVht1S || pEntry->pTable == RateTableVht2S)\n\t{\n\t\tfor (idx = 0; idx < RATE_TABLE_SIZE(pTable); idx++)\n\t\t{\n\t\t\tpCurrTxRate = PTX_RA_GRP_ENTRY(pEntry->pTable, idx);\n\t\t\tif (pCurrTxRate->CurrMCS == MCS_0 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[0] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_1 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[1] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_2 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[2] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_3 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[3] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_4 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[4] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_5 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[5] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_6 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[6] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_7 && pCurrTxRate->dataRate == 1)\n\t\t\t\tmcs[7] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_0 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[8] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_1 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[9] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_2 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[10] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_3 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[11] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_4 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[12] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_5 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[13] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_6 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[14] = idx;\n\t\t\telse if (pCurrTxRate->CurrMCS == MCS_7 && pCurrTxRate->dataRate == 2)\n\t\t\t\tmcs[15] = idx;\n\t\t}\n\n\t\treturn;\n\t}\n#endif /* DOT11_VHT_AC */\n\n\t/*  check the existence and index of each needed MCS */\n\tfor (idx = 0; idx < RATE_TABLE_SIZE(pTable); idx++)\n\t{\n\t\tpCurrTxRate = PTX_RA_GRP_ENTRY(pEntry->pTable, idx);\n\n\t\tif ((pCurrTxRate->CurrMCS >= 8 && pAd->CommonCfg.TxStream < 2) ||\n\t\t\t(pCurrTxRate->CurrMCS >= 16 && pAd->CommonCfg.TxStream < 3))\n\t\t\tcontinue;\n \n\t\t/*  Rate Table may contain CCK and MCS rates. Give HT/Legacy priority over CCK */\n\t\tif (pCurrTxRate->CurrMCS==MCS_0 && (mcs[0]==-1 || pCurrTxRate->Mode!=MODE_CCK))\n\t\t\tmcs[0] = idx;\n\t\telse if (pCurrTxRate->CurrMCS==MCS_1 && (mcs[1]==-1 || pCurrTxRate->Mode!=MODE_CCK))\n\t\t\tmcs[1] = idx;\n\t\telse if (pCurrTxRate->CurrMCS==MCS_2 && (mcs[2]==-1 || pCurrTxRate->Mode!=MODE_CCK))\n\t\t\tmcs[2] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_3)\n\t\t\tmcs[3] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_4)\n\t\t\tmcs[4] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_5)\n\t\t\tmcs[5] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_6)\n\t\t\tmcs[6] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_7) && (pCurrTxRate->ShortGI == GI_800))\n\t\t\tmcs[7] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_8)\n\t\t\tmcs[8] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_9)\n\t\t\tmcs[9] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_10)\n\t\t\tmcs[10] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_11)\n\t\t\tmcs[11] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_12)\n\t\t\tmcs[12] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_13)\n\t\t\tmcs[13] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_14) && (pCurrTxRate->ShortGI == GI_800))\n\t\t\tmcs[14] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_15) && (pCurrTxRate->ShortGI == GI_800))\n\t\t\tmcs[15] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_16)\n\t\t\tmcs[16] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_17)\n\t\t\tmcs[17] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_18)\n\t\t\tmcs[18] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_19)\n\t\t\tmcs[19] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_20)\n\t\t\tmcs[20] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_21) && (pCurrTxRate->ShortGI == GI_800))\n\t\t\tmcs[21] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_22) && (pCurrTxRate->ShortGI == GI_800))\n\t\t\tmcs[22] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_23) && (pCurrTxRate->ShortGI == mcs23GI))\n\t\t\tmcs[23] = idx;\n\t}\n\n#ifdef DBG_CTRL_SUPPORT\n\t/*  Debug Option: Disable highest MCSs when picking initial MCS based on RSSI */\n\tif (pAd->CommonCfg.DebugFlags & DBF_INIT_MCS_DIS1)\n\t\tmcs[23] = mcs[15] = mcs[7] = mcs[22] = mcs[14] = mcs[6] = 0;\n#endif /* DBG_CTRL_SUPPORT */\n\n}\n\n\n/*\n\tMlmeSelectTxRateAdapt - select the MCS based on the RSSI and the available MCSs\n\t\tpAd - pointer to adapter\n\t\tpEntry - pointer to MAC table entry\n\t\tmcs - table of MCS index into the Rate Table. -1 => not supported\n\t\tRssi - the Rssi value\n\t\tRssiOffset - offset to apply to the Rssi\n*/\nUCHAR MlmeSelectTxRateAdapt(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN CHAR\t\tmcs[],\n\tIN CHAR\t\tRssi,\n\tIN CHAR\t\tRssiOffset)\n{\n\tUCHAR TxRateIdx = 0;\n\tUCHAR *pTable = pEntry->pTable;\n\n#ifdef DBG_CTRL_SUPPORT\n\t/*  Debug option: Add 6 dB of margin */\n\tif (pAd->CommonCfg.DebugFlags & DBF_INIT_MCS_MARGIN)\n\t\tRssiOffset += 6;\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11_VHT_AC\n\tif ((pTable == RateTableVht1S || pTable == RateTableVht2S))\n\t{\n\t\tif (pTable == RateTableVht2S)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: GRP: 2*2, RssiOffset=%d\\n\", __FUNCTION__, RssiOffset));\n\t\t\t\n\t\t\t/* 2x2 peer device (Adhoc, DLS or AP) */\n\t\t\tif (mcs[15] && (Rssi > (-69 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[15];\n\t\t\telse if (mcs[14] && (Rssi > (-71 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[14];\n\t\t\telse if (mcs[13] && (Rssi > (-74 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[13];\n\t\t\telse if (mcs[12] && (Rssi > (-76 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[12];\n\t\t\telse if (mcs[11] && (Rssi > (-80 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[11];\n\t\t\telse if (mcs[10] && (Rssi > (-82 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[10];\n\t\t\telse if (mcs[9] && (Rssi > (-87 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[9];\n\t\t\telse\n\t\t\t\tTxRateIdx = mcs[8];\n\t\t\t\n\t\t\tpEntry->mcsGroup = 2;\n\t\t} \n\t\telse\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s: GRP: 1*1, RssiOffset=%d\\n\", __FUNCTION__, RssiOffset));\n\t\t\t\n\t\t\t/* 1x1 peer device (Adhoc, DLS or AP) */\n\t\t\tif (mcs[7] && (Rssi > (-71 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[7];\n\t\t\telse if (mcs[6] && (Rssi > (-73 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[6];\n\t\t\telse if (mcs[5] && (Rssi > (-76 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[5];\n\t\t\telse if (mcs[4] && (Rssi > (-78 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[4];\n\t\t\telse if (mcs[3] && (Rssi > (-82 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[3];\n\t\t\telse if (mcs[2] && (Rssi > (-84 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1] && (Rssi > (-89 + RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = mcs[0];\n\t\t\t\n\t\t\tpEntry->mcsGroup = 1;\n\t\t}\n\t}\n\telse\n#endif /* DOT11_VHT_AC */\n\t if (ADAPT_RATE_TABLE(pTable) ||\n\t\t (pTable == RateSwitchTable11BGN3S) ||\n\t\t (pTable == RateSwitchTable11BGN3SForABand))\n\t{/*  N mode with 3 stream */\n\t\tif ((pEntry->HTCapability.MCSSet[2] == 0xff) && (pAd->CommonCfg.TxStream == 3))\n\t\t{\n\t\t\tif (mcs[23]>=0 && (Rssi > (-72+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[23];\n\t\t\telse if (mcs[22]>=0 && (Rssi > (-74+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[22];\n\t\t\telse if (mcs[21]>=0 && (Rssi > (-77+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[21];\n\t\t\telse if (mcs[20]>=0 && (Rssi > (-79+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[20];\n\t\t\telse if (mcs[11]>=0 && (Rssi > (-81+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[11];\n\t\t\telse if (mcs[10]>=0 && (Rssi > (-83+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[10];\n\t\t\telse if (mcs[2]>=0 && (Rssi > (-86+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1]>=0 && (Rssi > (-88+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = mcs[0];\n\n\t\t\tpEntry->mcsGroup = 3;\n\t\t}\n\t\telse if ((pEntry->HTCapability.MCSSet[0] == 0xff) &&\n\t\t\t\t(pEntry->HTCapability.MCSSet[1] == 0xff) &&\n\t\t\t\t(pAd->CommonCfg.TxStream > 1) &&\n\t\t\t\t((pAd->CommonCfg.TxStream == 2) || (pEntry->HTCapability.MCSSet[2] == 0x0)))\n\t\t{\n\t\t\tif (mcs[15]>=0 && (Rssi > (-72+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[15];\n\t\t\telse if (mcs[14]>=0 && (Rssi > (-74+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[14];\n\t\t\telse if (mcs[13]>=0 && (Rssi > (-77+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[13];\n\t\t\telse if (mcs[12]>=0 && (Rssi > (-79+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[12];\n\t\t\telse if (mcs[11]>=0 && (Rssi > (-81+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[11];\n\t\t\telse if (mcs[10]>=0 && (Rssi > (-83+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[10];\n\t\t\telse if (mcs[2]>=0 && (Rssi > (-86+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1]>=0 && (Rssi > (-88+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = mcs[0];\n\n\t\t\tpEntry->mcsGroup = 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (mcs[7]>=0 && (Rssi > (-72+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[7];\n\t\t\telse if (mcs[6]>=0 && (Rssi > (-74+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[6];\n\t\t\telse if (mcs[5]>=0 && (Rssi > (-77+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[5];\n\t\t\telse if (mcs[4]>=0 && (Rssi > (-79+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[4];\n\t\t\telse if (mcs[3]>=0 && (Rssi > (-81+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[3];\n\t\t\telse if (mcs[2]>=0 && (Rssi > (-83+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1]>=0 && (Rssi > (-86+RssiOffset)))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = mcs[0];\n\n\t\t\tpEntry->mcsGroup = 1;\n\t\t}\n\t}\n\telse if ((pTable == RateSwitchTable11BGN2S) ||\n\t\t(pTable == RateSwitchTable11BGN2SForABand) ||\n\t\t(pTable == RateSwitchTable11N2S) ||\n\t\t(pTable == RateSwitchTable11N2SForABand))\n\t{/*  N mode with 2 stream */\n\t\tif (mcs[15]>=0 && (Rssi >= (-70+RssiOffset)))\n\t\t\tTxRateIdx = mcs[15];\n\t\telse if (mcs[14]>=0 && (Rssi >= (-72+RssiOffset)))\n\t\t\tTxRateIdx = mcs[14];\n\t\telse if (mcs[13]>=0 && (Rssi >= (-76+RssiOffset)))\n\t\t\tTxRateIdx = mcs[13];\n\t\telse if (mcs[12]>=0 && (Rssi >= (-78+RssiOffset)))\n\t\t\tTxRateIdx = mcs[12];\n\t\telse if (mcs[4]>=0 && (Rssi >= (-82+RssiOffset)))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[3]>=0 && (Rssi >= (-84+RssiOffset)))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi >= (-86+RssiOffset)))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi >= (-88+RssiOffset)))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\telse if ((pTable == RateSwitchTable11BGN1S) ||\n\t\t\t (pTable == RateSwitchTable11N1S) ||\n\t\t\t (pTable == RateSwitchTable11N1SForABand))\n\t{/*  N mode with 1 stream */\n\t\tif (mcs[7]>=0 && (Rssi > (-72+RssiOffset)))\n\t\t\tTxRateIdx = mcs[7];\n\t\telse if (mcs[6]>=0 && (Rssi > (-74+RssiOffset)))\n\t\t\tTxRateIdx = mcs[6];\n\t\telse if (mcs[5]>=0 && (Rssi > (-77+RssiOffset)))\n\t\t\tTxRateIdx = mcs[5];\n\t\telse if (mcs[4]>=0 && (Rssi > (-79+RssiOffset)))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[3]>=0 && (Rssi > (-81+RssiOffset)))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi > (-83+RssiOffset)))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi > (-86+RssiOffset)))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\telse\n#endif /*  DOT11_N_SUPPORT */\n\t{/*  Legacy mode */\n\t\tif (mcs[7]>=0 && (Rssi > -70))\n\t\t\tTxRateIdx = mcs[7];\n\t\telse if (mcs[6]>=0 && (Rssi > -74))\n\t\t\tTxRateIdx = mcs[6];\n\t\telse if (mcs[5]>=0 && (Rssi > -78))\n\t\t\tTxRateIdx = mcs[5];\n\t\telse if (mcs[4]>=0 && (Rssi > -82))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[4] == -1)\t/*  for B-only mode */\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[3]>=0 && (Rssi > -85))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi > -87))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi > -90))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\n\treturn TxRateIdx;\n}\n\n/*\n\tMlmeRAEstimateThroughput - estimate Throughput based on PER and PHY rate\n\t\tpEntry - the MAC table entry for this STA\n\t\tpCurrTxRate - pointer to Rate table entry for rate\n\t\tTxErrorRatio - the PER\n*/\nstatic ULONG MlmeRAEstimateThroughput(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_GRP_TB *pCurrTxRate,\n\tIN ULONG TxErrorRatio)\n{\n\tULONG estTP = (100-TxErrorRatio)*pCurrTxRate->dataRate;\n\n\t/*  Adjust rates for MCS32-40MHz mapped to MCS0-20MHz and for non-CCK 40MHz */\n\tif (pCurrTxRate->CurrMCS == MCS_32)\n\t{\n#ifdef DBG_CTRL_SUPPORT\n\t\tif ((pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS0)==0)\n\t\t\testTP /= 2;\n#endif /* DBG_CTRL_SUPPORT */\n\t}\n\telse if ((pCurrTxRate->Mode==MODE_HTMIX) || (pCurrTxRate->Mode==MODE_HTGREENFIELD))\n\t{\n\t\tif (pEntry->MaxHTPhyMode.field.BW==BW_40 \n#ifdef DBG_CTRL_SUPPORT\n\t\t\t|| (pAd->CommonCfg.DebugFlags & DBF_FORCE_40MHZ)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t\testTP *= 2;\n\t}\n\n\treturn estTP;\n}\n\n/*\n\tMlmeRAHybridRule - decide whether to keep the new rate or use old rate\n\t\tpEntry - the MAC table entry for this STA\n\t\tpCurrTxRate - pointer to Rate table entry for new up rate\n\t\tNewTxOkCount - normalized count of Tx packets for new up rate\n\t\tTxErrorRatio - the PER\n\treturns\n\t\tTRUE if old rate should be used\n*/\nBOOLEAN MlmeRAHybridRule(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN RTMP_RA_GRP_TB *pCurrTxRate,\n\tIN ULONG\t\t\tNewTxOkCount,\n\tIN ULONG\t\t\tTxErrorRatio)\n{\n\tULONG newTP, oldTP;\n\n\tif (100*NewTxOkCount < pAd->CommonCfg.TrainUpLowThrd*pEntry->LastTxOkCount)\n\t\treturn TRUE;\n\n\tif (100*NewTxOkCount > pAd->CommonCfg.TrainUpHighThrd*pEntry->LastTxOkCount)\n\t\treturn FALSE;\n\n\tnewTP = MlmeRAEstimateThroughput(pAd, pEntry, pCurrTxRate, TxErrorRatio);\n\toldTP = MlmeRAEstimateThroughput(pAd, pEntry, PTX_RA_GRP_ENTRY(pEntry->pTable, pEntry->lastRateIdx), pEntry->LastTxPER);\n\n\treturn (oldTP > newTP);\n}\n\n/*\n\tMlmeNewRateAdapt - perform Rate Adaptation based on PER using New RA algorithm\n\t\tpEntry - the MAC table entry for this STA\n\t\tUpRateIdx, DownRateIdx - UpRate and DownRate index\n\t\tTrainUp, TrainDown - TrainUp and Train Down threhsolds\n\t\tTxErrorRatio - the PER\n\n\t\tOn exit:\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP or RATE_DOWN if there was a change\n\t\t\tpEntry->CurrTxRateIndex = new rate index\n\t\t\tpEntry->TxQuality is updated\n*/\nVOID MlmeNewRateAdapt(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN UCHAR\t\t\tUpRateIdx,\n\tIN UCHAR\t\t\tDownRateIdx,\n\tIN ULONG\t\t\tTrainUp,\n\tIN ULONG\t\t\tTrainDown,\n\tIN ULONG\t\t\tTxErrorRatio)\n{\n\tUSHORT\t\tphyRateLimit20 = 0;\n\tBOOLEAN\t\tbTrainUp = FALSE;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN \tinvertTxBf = FALSE;\n#endif /*  TXBF_SUPPORT */\n\tUCHAR *pTable = pEntry->pTable;\n\tUCHAR CurrRateIdx = pEntry->CurrTxRateIndex;\n\tRTMP_RA_GRP_TB *pCurrTxRate = PTX_RA_GRP_ENTRY(pTable, CurrRateIdx);\n\n\tpEntry->CurrTxRateStableTime++;\n\n\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\n\n\tif (TxErrorRatio >= TrainDown)\n\t{\n#ifdef TXBF_SUPPORT\n\t\tRTMP_RA_GRP_TB *pDownRate, *pLastNonBfRate;\n#endif /* TXBF_SUPPORT */\n\n\t\t/*  Downgrade TX quality if PER >= Rate-Down threshold */\n\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\n#ifdef TXBF_SUPPORT\n\t\t/*\n\t\t\tNeed to train down. If BF and last Non-BF is no worse than the down rate then\n\t\t\tgo to last Non-BF rate. Otherwise just go to the down rate\n\t\t*/\n\n\t\tpDownRate = PTX_RA_GRP_ENTRY(pTable, DownRateIdx);\n\t\tpLastNonBfRate = PTX_RA_GRP_ENTRY(pTable, pEntry->lastNonBfRate);\n\n\t\tif ((pEntry->phyETxBf || pEntry->phyITxBf) &&\n\t\t\t(pLastNonBfRate->dataRate >= pDownRate->dataRate) \n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& ((pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)==0)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t{\n\t\t\tinvertTxBf = TRUE;\n\t\t\tpEntry->CurrTxRateIndex = pEntry->lastNonBfRate;\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\t}\n\t\telse\n#endif /*  TXBF_SUPPORT */\n\t\tif (CurrRateIdx != DownRateIdx)\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\t}\n\t}\n\telse\n\t{\n\t\tRTMP_RA_GRP_TB *pUpRate = PTX_RA_GRP_ENTRY(pTable, UpRateIdx);\n\n\t\t/*  Upgrade TX quality if PER <= Rate-Up threshold */\n\t\tif (TxErrorRatio <= TrainUp)\n\t\t{\n\t\t\tbTrainUp = TRUE;\n\t\t\tMlmeDecTxQuality(pEntry, CurrRateIdx);  /*  quality very good in CurrRate */\n\n\t\t\tif (pEntry->TxRateUpPenalty) /* always == 0, always go to else */\n\t\t\t\tpEntry->TxRateUpPenalty --;\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tDecrement the TxQuality of the UpRate and all of the MCS groups.\n\t\t\t\t\tNote that UpRate may mot equal one of the MCS groups if MlmeSelectUpRate\n\t\t\t\t\tskipped over a rate that is not valid for this configuration.\n\t\t\t\t*/\n\t\t\t\tMlmeDecTxQuality(pEntry, UpRateIdx);\n\n\t\t\t\tif (pCurrTxRate->upMcs3!=CurrRateIdx &&\n\t\t\t\t\tpCurrTxRate->upMcs3!=UpRateIdx)\n\t\t\t\t\tMlmeDecTxQuality(pEntry, pCurrTxRate->upMcs3);\n\n\t\t\t\tif (pCurrTxRate->upMcs2!=CurrRateIdx &&\n\t\t\t\t\t\tpCurrTxRate->upMcs2!=UpRateIdx &&\n\t\t\t\t\t\tpCurrTxRate->upMcs2!=pCurrTxRate->upMcs3)\n\t\t\t\t\tMlmeDecTxQuality(pEntry, pCurrTxRate->upMcs2);\n\n\t\t\t\tif (pCurrTxRate->upMcs1!=CurrRateIdx &&\n\t\t\t\t\t\tpCurrTxRate->upMcs1!=UpRateIdx &&\n\t\t\t\t\t\tpCurrTxRate->upMcs1!=pCurrTxRate->upMcs3 &&\n\t\t\t\t\t\tpCurrTxRate->upMcs1!=pCurrTxRate->upMcs2)\n\t\t\t\t\tMlmeDecTxQuality(pEntry, pCurrTxRate->upMcs1);\n\t\t\t}\n\t\t}\n\t\telse if (pEntry->mcsGroup > 0) /* even if TxErrorRatio > TrainUp */\n\t\t{\n\t\t\t/*  Moderate PER but some groups are not tried */\n\t\t\tbTrainUp = TRUE;\n\n\t\t\t/* TxQuality[CurrRateIdx] must be decremented so that mcs won't decrease wrongly */\n\t\t\tMlmeDecTxQuality(pEntry, CurrRateIdx);  /*  quality very good in CurrRate */\n\t\t\tMlmeDecTxQuality(pEntry, UpRateIdx);    /*  may improve next UP rate's quality */\n\t\t}\n\n\t\t/*  Don't try up rate if it's greater than the limit */\n\t\tif ((phyRateLimit20 != 0) && (pUpRate->dataRate >= phyRateLimit20))\n\t\t\treturn;\n\n\t\t/*  If UpRate is good then train up in current BF state */\n\t\tif ((CurrRateIdx != UpRateIdx) && (MlmeGetTxQuality(pEntry, UpRateIdx) <= 0) && bTrainUp)\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t}\n#ifdef TXBF_SUPPORT\n\t\telse\n#ifdef DBG_CTRL_SUPPORT\n\t\tif ((pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)==0)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t{\n\t\t\t/*  If not at the highest rate then try inverting BF state */\n\t\t\tif (pEntry->phyETxBf || pEntry->phyITxBf)\n\t\t\t{\n\t\t\t\t/*  If BF then try the same MCS non-BF unless PER is good */\n\t\t\t\tif (TxErrorRatio > TrainUp)\n\t\t\t\t{\n\t\t\t\t\tif (pEntry->TxQuality[CurrRateIdx])\n\t\t\t\t\t\tpEntry->TxQuality[CurrRateIdx]--;\n\n\t\t\t\t\tif (pEntry->TxQuality[CurrRateIdx]==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tinvertTxBf = TRUE;\n\t\t\t\t\t\tpEntry->CurrTxRateIndex = CurrRateIdx;\n\t\t\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry->eTxBfEnCond>0 || pEntry->iTxBfEn)\n\t\t\t{\n\t\t\t\t/*  First try Up Rate with BF */\n\t\t\t\tif ((CurrRateIdx != UpRateIdx) &&\n\t\t\t\t\t MlmeTxBfAllowed(pAd, pEntry, (RTMP_RA_LEGACY_TB *)pUpRate))\n\t\t\t\t{\n\t\t\t\t\tif (pEntry->BfTxQuality[UpRateIdx])\n\t\t\t\t\t\tpEntry->BfTxQuality[UpRateIdx]--;\n\n\t\t\t\t\tif (pEntry->BfTxQuality[UpRateIdx]==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tinvertTxBf = TRUE;\n\t\t\t\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/*  Try Same Rate if Up Rate failed */\n\t\t\t\tif (pEntry->LastSecTxRateChangeAction==RATE_NO_CHANGE &&\n\t\t\t\t\tMlmeTxBfAllowed(pAd, pEntry, (RTMP_RA_LEGACY_TB *)pCurrTxRate))\n\t\t\t\t{\n\t\t\t\t\tif (pEntry->BfTxQuality[CurrRateIdx])\n\t\t\t\t\t\tpEntry->BfTxQuality[CurrRateIdx]--;\n\n\t\t\t\t\tif (pEntry->BfTxQuality[CurrRateIdx]==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tinvertTxBf = TRUE;\n\t\t\t\t\t\tpEntry->CurrTxRateIndex = CurrRateIdx;\n\t\t\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /*  TXBF_SUPPORT */\n\t}\n\n\t/*  Handle the rate change */\n\tif ((pEntry->LastSecTxRateChangeAction != RATE_NO_CHANGE)\n#ifdef DBG_CTRL_SUPPORT\n\t\t|| (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)\n#endif /* DBG_CTRL_SUPPORT */\n\t)\n\t{\n\t\tif (pEntry->LastSecTxRateChangeAction!=RATE_NO_CHANGE)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO,(\"DRS: %sTX rate from %d to %d \\n\",\n\t\t\t\tpEntry->LastSecTxRateChangeAction==RATE_UP? \"++\": \"--\", CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t}\n\n\t\tpEntry->CurrTxRateStableTime = 0;\n\t\tpEntry->TxRateUpPenalty = 0;\n\n\t\t/*  Save last rate information */\n\t\tpEntry->lastRateIdx = CurrRateIdx;\n#ifdef TXBF_SUPPORT\n\t\tif (pEntry->eTxBfEnCond > 0)\n\t\t{\n\t\t\tpEntry->lastRatePhyTxBf = pEntry->phyETxBf;\n\t\t\tpEntry->phyETxBf ^= invertTxBf;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEntry->lastRatePhyTxBf = pEntry->phyITxBf;\n\t\t\tpEntry->phyITxBf ^= invertTxBf;\n\t\t}\n#endif /*  TXBF_SUPPORT */\n\n\t\t/*  Update TxQuality */\n\t\tif (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t\t{\n\t\t\tMlmeSetTxQuality(pEntry, pEntry->CurrTxRateIndex, 0);\n\t\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t\t}\n\n\t\t/*  Set timer for check in 100 msec */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif (!pAd->ApCfg.ApQuickResponeForRateUpTimerRunning)\n\t\t\t{\n\t\t\t\tRTMPSetTimer(&pAd->ApCfg.ApQuickResponeForRateUpTimer, pAd->ra_fast_interval);\n\t\t\t\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = TRUE;\n\t\t\t}\n\t\t}\n#endif /*  CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning)\n\t\t\t{\n\t\t\t\tRTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, pAd->ra_fast_interval);\n\t\t\t\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE;\n\t\t\t}\n\t\t}\n#endif /*  CONFIG_STA_SUPPORT */\n\n\t\t/*  Update PHY rate */\n\t\tMlmeNewTxRate(pAd, pEntry);\n\t}\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n    ========================================================================\n    Routine Description:\n        AP side, Auto TxRate faster train up timer call back function.\n        \n    Arguments:\n        SystemSpecific1         - Not used.\n        FunctionContext         - Pointer to our Adapter context.\n        SystemSpecific2         - Not used.\n        SystemSpecific3         - Not used.\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID APQuickResponeForRateUpExecAdapt(/* actually for both up and down */\n    IN PRTMP_ADAPTER pAd,\n    IN ULONG idx) \n{\n\tPUCHAR\t\t\t\t\tpTable;\n\tUCHAR\t\t\t\t\tCurrRateIdx;\n\tULONG\t\t\t\t\tAccuTxTotalCnt, TxTotalCnt, TxCnt;\n\tULONG\t\t\t\t\tTxErrorRatio = 0;\n\tMAC_TABLE_ENTRY\t\t\t*pEntry;\n\tRTMP_RA_GRP_TB *pCurrTxRate;\n\tUCHAR\t\t\t\t\tTrainUp, TrainDown;\n\tCHAR\t\t\t\t\tRssi, ratio;\n\tULONG\t\t\t\t\tTxSuccess, TxRetransmit, TxFailCount;\n\tULONG\t\t\t\t\tOneSecTxNoRetryOKRationCount;\n\tBOOLEAN\t\t\t\t\trateChanged;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN\t\t\t\t\tCurrPhyETxBf, CurrPhyITxBf;\n#endif /*  TXBF_SUPPORT */\n\n\tpEntry = &pAd->MacTab.Content[idx];\n\n\n\tpTable = pEntry->pTable;\n\n\t/* Rssi = RTMPMaxRssi(pAd, (CHAR)pEntry->RssiSample.AvgRssi0, (CHAR)pEntry->RssiSample.AvgRssi1, (CHAR)pEntry->RssiSample.AvgRssi2); */\n\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\n\tif (pAd->MacTab.Size == 1)\n\t{\n\t\tTX_STA_CNT1_STRUC StaTx1;\n\t\tTX_STA_CNT0_STRUC TxStaCnt0;\n\n\t\t/*  Update statistic counter */\n\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tAccuTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\t\t\tpAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\t\t\tpAd->RalinkCounters.OneSecTxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n\t\t/* Rssi is calculated again with new formula?In rory's code, the average instead of max is used. */\n\t\tif (pAd->Antenna.field.TxPath > 1)\n\t\t\tRssi = (pEntry->RssiSample.AvgRssi0 + pEntry->RssiSample.AvgRssi1) >> 1;\n\t\telse\n\t\t\tRssi = pEntry->RssiSample.AvgRssi0;\n\n\t\tTxCnt = AccuTxTotalCnt;\n\t}\n\telse\n\t{\n\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tTxCnt = TxTotalCnt;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\tif ((pEntry->Aid >= 1) && (pEntry->Aid <= 8))\n\t\t{\n\t\t\tULONG \tHwTxCnt, HwErrRatio;\n\n\t\t\tNicGetMacFifoTxCnt(pAd, pEntry);\n\t\t\tHwTxCnt = pEntry->fifoTxSucCnt + pEntry->fifoTxRtyCnt;\n\t\t\tif (HwTxCnt)\n\t\t\t\tHwErrRatio = (pEntry->fifoTxRtyCnt * 100) / HwTxCnt;\n\t\t\telse\n\t\t\t\tHwErrRatio = 0;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"%s():Aid:%d, MCS:%d, TxErrRation(Hw:0x%lx-0x%lx, Sw:0x%lx-%lx)\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS, \n\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\tTxSuccess = pEntry->fifoTxSucCnt;\n\t\t\tTxRetransmit = pEntry->fifoTxRtyCnt;\n\t\t\tTxErrorRatio = HwErrRatio;\n\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\tTxCnt = HwTxCnt;\n\t\t}\n#endif /*  FIFO_EXT_SUPPORT */\n\t}\n\n#ifdef MFB_SUPPORT\n\tif (pEntry->fLastChangeAccordingMfb == TRUE)\n\t{\n\t\tpEntry->fLastChangeAccordingMfb = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"DRS: MCS is according to MFB, and ignore tuning this sec \\n\"));\n\t\t/*  reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\treturn;\n\t}\n#endif\t/*  MFB_SUPPORT */\n\n\t/*  Remember the current rate */\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\n#ifdef TXBF_SUPPORT\n\tCurrPhyETxBf = pEntry->phyETxBf;\n\tCurrPhyITxBf = pEntry->phyITxBf;\n#endif /*  TXBF_SUPPORT */\n\tpCurrTxRate = PTX_RA_GRP_ENTRY(pTable, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX) && pEntry->perThrdAdj == 1)\n\t{\n\t\tTrainUp\t\t= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown\t= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n#endif /*  DOT11_N_SUPPORT */\n\t{\n\t\tTrainUp\t\t= pCurrTxRate->TrainUp;\n\t\tTrainDown\t= pCurrTxRate->TrainDown;\n\t}\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t/*  Debug option: Concise RA log */\n\tif ((pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG) || (pAd->CommonCfg.DebugFlags & DBF_DBQ_RA_LOG))\n\t\tMlmeRALog(pAd, pEntry, RAL_QUICK_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n\t/*  Handle the low traffic case */\n\tif (TxCnt <= 15)\n\t{\n\t\t/*  Go back to the original rate */\n\t\tMlmeRestoreLastRate(pEntry);\n\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA, (\"   QuickDRS: TxTotalCnt <= 15, back to original rate \\n\"));\n\n\t\tMlmeNewTxRate(pAd, pEntry);\n\n\n\t\t// TODO: should we reset all OneSecTx counters?\n\t\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n\n\t\treturn;\n\t}\n\n\t/*\n\t\tCompare throughput.\n\t\tLastTxCount is based on a time interval of 500 msec or \"500 - pAd->ra_fast_interval\" ms.\n\t*/\n\tif ((pEntry->LastTimeTxRateChangeAction == RATE_NO_CHANGE)\n#ifdef DBG_CTRL_SUPPORT\n\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t)\n\t\tratio = RA_INTERVAL / pAd->ra_fast_interval;\n\telse\n\t\tratio = (RA_INTERVAL - pAd->ra_fast_interval) / pAd->ra_fast_interval;\n\n\tif (pAd->MacTab.Size == 1)\n\t\tOneSecTxNoRetryOKRationCount = (TxSuccess * ratio);\n\telse\n\t\tOneSecTxNoRetryOKRationCount = pEntry->OneSecTxNoRetryOkCount * ratio + (pEntry->OneSecTxNoRetryOkCount >> 1);\n\n\t/* Downgrade TX quality if PER >= Rate-Down threshold */\n\t/* the only situation when pEntry->TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND but no rate change */\n\tif (TxErrorRatio >= TrainDown)\n\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\n\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n\n\t/*  Perform DRS - consider TxRate Down first, then rate up. */\n\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t{\n\t\tBOOLEAN useOldRate;\n\n\t\t// TODO: gaa - Finalize the decision criterion\n\t\t/*\n\t\t\t0=>Throughput. Use New Rate if New TP is better than Old TP\n\t\t\t1=>PER. Use New Rate if New PER is less than the TrainDown PER threshold\n\t\t\t2=>Hybrid. Use rate with best TP if difference > 10%. Otherwise use rate with Best Estimated TP\n\t\t\t3=>Hybrid with check that PER<TrainDown Threshold\n\t\t*/\n\t\tif (pAd->CommonCfg.TrainUpRule == 0)\n\t\t{\n\t\t\tuseOldRate = (pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount;\n\t\t}\n\t\telse if (pAd->CommonCfg.TrainUpRule==2 && Rssi<=pAd->CommonCfg.TrainUpRuleRSSI)\n\t\t{\n\t\t\tuseOldRate = MlmeRAHybridRule(pAd, pEntry, pCurrTxRate, OneSecTxNoRetryOKRationCount, TxErrorRatio);\n\t\t}\n\t\telse if (pAd->CommonCfg.TrainUpRule==3 && Rssi<=pAd->CommonCfg.TrainUpRuleRSSI)\n\t\t{\n\t\t\tuseOldRate = (TxErrorRatio >= TrainDown) ||\n\t\t\t\t\t\t MlmeRAHybridRule(pAd, pEntry, pCurrTxRate, OneSecTxNoRetryOKRationCount, TxErrorRatio);\n\t\t}\n\t\telse\n\t\t\tuseOldRate = TxErrorRatio >= TrainDown;\n\t\tif (useOldRate)\n\t\t{\n\t\t\t/*  If PER>50% or TP<lastTP/2 then double the TxQuality delay */\n\t\t\tif ((TxErrorRatio > 50) || (OneSecTxNoRetryOKRationCount < pEntry->LastTxOkCount/2))\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND*2);\n\t\t\telse\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\n\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_RA_GRP_TB *pLastTxRate = PTX_RA_GRP_ENTRY(pTable, pEntry->lastRateIdx);\n\n\t\t\t/*  Clear the history if we changed the MCS and PHY Rate */\n\t\t\tif ((pCurrTxRate->CurrMCS != pLastTxRate->CurrMCS) &&\n\t\t\t\t(pCurrTxRate->dataRate != pLastTxRate->dataRate))\n\t\t\t\tMlmeClearTxQuality(pEntry);\n\n\t\t\tif (pEntry->mcsGroup == 0)\n\t\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t\t(\"   QuickDRS: (Up) keep rate-up (L:%ld, C:%ld)\\n\",\n\t\t\t\t\t\tpEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t}\n\telse if (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t{\n\t\tif ((TxErrorRatio >= 50) || (TxErrorRatio >= TrainDown)) /* there will be train down again */\n\t\t{\n\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) direct train down (TxErrorRatio >= TrainDown)\\n\"));\n\t\t}\n\t\telse if ((pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount)\n\t\t{\n\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) bad tx ok count (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) keep rate-down (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t}\n\n\t/*  See if we reverted to the old rate */\n#ifdef TXBF_SUPPORT\n\trateChanged = (pEntry->CurrTxRateIndex != CurrRateIdx) ||\n\t\t\t\t  (pEntry->phyETxBf!=CurrPhyETxBf) || (pEntry->phyITxBf!=CurrPhyITxBf);\n\n\t/*  Remember last good non-BF rate */\n\tif (!pEntry->phyETxBf && !pEntry->phyITxBf)\n\t\tpEntry->lastNonBfRate = pEntry->CurrTxRateIndex;\n#else\n\trateChanged = (pEntry->CurrTxRateIndex != CurrRateIdx);\n#endif /*  TXBF_SUPPORT */\n\n\n\t/*  Update mcsGroup */\n\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t{\n\t\tUCHAR UpRateIdx;\n\n\t\t/*  If RATE_UP failed look for the next group with valid mcs */\n\t\tif (pEntry->CurrTxRateIndex != CurrRateIdx && pEntry->mcsGroup > 0)\n\t\t{\n\t\t\tpEntry->mcsGroup--;\n\t\t\tpCurrTxRate = PTX_RA_GRP_ENTRY(pTable, pEntry->lastRateIdx);\n\t\t}\n\n\t\tswitch (pEntry->mcsGroup)\n\t\t{\n\t\t\tcase 3:\n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tUpRateIdx = CurrRateIdx;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t\tpEntry->mcsGroup = 0;\n\t}\n\n\n\t/*  Handle change back to old rate */\n\tif (rateChanged)\n\t{\n\t\t/*  Clear Old Rate's TxQuality */\n\t\tMlmeSetTxQuality(pEntry, pEntry->CurrTxRateIndex, 0);\n\n\t\tpEntry->TxRateUpPenalty = 0;\t/* redundant */\n\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\t/* redundant */\n\n\t\t/*  Set new Tx rate */\n\t\tMlmeNewTxRate(pAd, pEntry);\n\t}\n\n\t// TODO: should we reset all OneSecTx counters?\n\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n}\n\n\n\n/*\n    ==========================================================================\n    Description:\n        This routine walks through the MAC table, see if TX rate change is \n        required for each associated client. \n    Output:\n        pEntry->CurrTxRate - \n    NOTE:\n        call this routine every second\n    ==========================================================================\n */\nVOID APMlmeDynamicTxRateSwitchingAdapt(RTMP_ADAPTER *pAd, ULONG i)\n{\n\tPUCHAR pTable;\n\tUCHAR UpRateIdx, DownRateIdx, CurrRateIdx, TrainUp, TrainDown;\n\tULONG TxTotalCnt, TxSuccess, TxRetransmit, TxFailCount, TxErrorRatio;\n\tMAC_TABLE_ENTRY *pEntry;\n\tRTMP_RA_GRP_TB *pCurrTxRate;\n\tCHAR Rssi;\n\n\n\tpEntry = &pAd->MacTab.Content[i]; /* point to information of the individual station */\n\tpTable = pEntry->pTable;\n\tTxTotalCnt = TxSuccess = TxRetransmit = TxFailCount = TxErrorRatio = 0;\n\n\tif (pAd->MacTab.Size == 1)\n\t{\n\t\tTX_STA_CNT1_STRUC StaTx1;\n\t\tTX_STA_CNT0_STRUC TxStaCnt0;\n\n\t\t/*  Update statistic counter */\n\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\t}\n\telse\n\t{\n\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t\t{\n\t\t\tULONG HwTxCnt, HwErrRatio;\n\n\t\t\tNicGetMacFifoTxCnt(pAd, pEntry);\n\t\t\tHwTxCnt = pEntry->fifoTxSucCnt + pEntry->fifoTxRtyCnt;\n\t\t\tif (HwTxCnt)\n\t\t\t\tHwErrRatio = (pEntry->fifoTxRtyCnt * 100) / HwTxCnt;\n\t\t\telse\n\t\t\t\tHwErrRatio = 0;\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"%s():Aid:%d, MCS:%d, TxErrRatio(Hw:0x%lx-0x%lx, Sw:0x%lx-%lx)\\n\", \n\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS, \n\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\tTxSuccess = pEntry->fifoTxSucCnt;\n\t\t\tTxRetransmit = pEntry->fifoTxRtyCnt;\n\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\tTxErrorRatio = HwErrRatio;\n\t\t}\n#endif /*  FIFO_EXT_SUPPORT */\n\t}\n\n\t/*  Save LastTxOkCount, LastTxPER and last MCS action for APQuickResponeForRateUpExec */\n\tpEntry->LastTxOkCount = TxSuccess;\n\tpEntry->LastTxPER = (UCHAR)TxErrorRatio;\n\tpEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;\n\n\t/* different calculation in APQuickResponeForRateUpExec() */\n\t/* Rssi = RTMPMaxRssi(pAd, (CHAR)pEntry->RssiSample.AvgRssi0, (CHAR)pEntry->RssiSample.AvgRssi1, (CHAR)pEntry->RssiSample.AvgRssi2); */\n\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\n\t/*  decide the next upgrade rate and downgrade rate, if any */\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\n\tpCurrTxRate = PTX_RA_GRP_ENTRY(pTable, CurrRateIdx);\n\tUpRateIdx = MlmeSelectUpRate(pAd, pEntry, pCurrTxRate);\n\tDownRateIdx = MlmeSelectDownRate(pAd, pEntry, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\t/*\n\t\twhen Rssi > -65, there is a lot of interference usually. therefore, \n\t\tthe algorithm tends to choose the mcs lower than the optimal one.\n\t\tBy increasing the thresholds, the chosen mcs will be closer to the \n\t\toptimal mcs\n\t*/\n\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX) && pEntry->perThrdAdj == 1)\n\t{\n\t\tTrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n#endif /*  DOT11_N_SUPPORT */\n\t{\n\t\tTrainUp = pCurrTxRate->TrainUp;\n\t\tTrainDown = pCurrTxRate->TrainDown;\n\t}\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t/*  Debug option: Concise RA log */\n\tif ((pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG) || (pAd->CommonCfg.DebugFlags & DBF_DBQ_RA_LOG))\n\t\tMlmeRALog(pAd, pEntry, RAL_NEW_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef MFB_SUPPORT\n\tif (pEntry->fLastChangeAccordingMfb == TRUE)\n\t{\n\t\tRTMP_RA_LEGACY_TB *pNextTxRate;\n\n\t\t/* with this method mfb result can be applied every 500msec, instead of immediately */\n\t\tNdisAcquireSpinLock(&pEntry->fLastChangeAccordingMfbLock);\n\t\tpEntry->fLastChangeAccordingMfb = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\tNdisReleaseSpinLock(&pEntry->fLastChangeAccordingMfbLock);\n\t\tAPMlmeSetTxRate(pAd, pEntry, pEntry->LegalMfbRS);\n\t\tDBGPRINT(RT_DEBUG_INFO,(\"DRS: MCS is according to MFB, and ignore tuning this sec \\n\"));\n\t\tMlmeClearAllTxQuality(pEntry); /* clear all history, same as train up, purpose??? */\n\t\t/*  reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n\t\tpEntry->CurrTxRateIndex = (pEntry->LegalMfbRS)->ItemNo;\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *) &pTable[(pEntry->CurrTxRateIndex+1)*10]; /* actually = pEntry->LegalMfbRS */\n\t\treturn;\n\t}\n#endif\t/* MFB_SUPPORT */\n\n\n\t/* Handle low traffic case */\n\tif (TxTotalCnt <= 15)\n\t{\n\t\tpEntry->lowTrafficCount++;\n\t\tif (pEntry->lowTrafficCount >= pAd->CommonCfg.lowTrafficThrd)\n\t\t{\n\t\t\tUCHAR TxRateIdx;\n\t\t\tCHAR mcs[24];\n\t\t\tCHAR RssiOffset = 0;\n\n\t\t\tpEntry->lowTrafficCount = 0;\n\n\t\t\t/* Check existence and get index of each MCS */\n\t\t\tMlmeGetSupportedMcsAdapt(pAd, pEntry, GI_400, mcs);\n\n\t\t\tif ((pTable == RateSwitchTable11BGN2S) || (pTable == RateSwitchTable11BGN2SForABand) ||\n\t\t\t\t(pTable == RateSwitchTable11N2S) || (pTable == RateSwitchTable11N2SForABand))\n\t\t\t{\n\t\t\t\tRssiOffset = 2;\n\t\t\t}\n\t\t\telse if (ADAPT_RATE_TABLE(pTable))\n\t\t\t{\n\t\t\t\tRssiOffset = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRssiOffset = 5;\n\t\t\t}\n\n\t\t\t/* Select the Tx rate based on the RSSI */\n\t\t\tTxRateIdx = MlmeSelectTxRateAdapt(pAd, pEntry, mcs, Rssi, RssiOffset);\n\t\t\t\tpEntry->lastRateIdx = pEntry->CurrTxRateIndex;\n\t\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\n\t\t\t\tpEntry->CurrTxRateIndex = TxRateIdx;\n#ifdef TXBF_SUPPORT\n\t\t\t\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n#endif /* TXBF_SUPPORT */\n\t\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t\t\tif (!pEntry->fLastSecAccordingRSSI)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"DRS: TxTotalCnt <= 15, switch to MCS%d according to RSSI (%d), RssiOffset=%d\\n\", pEntry->HTPhyMode.field.MCS, Rssi, RssiOffset));\n\t\t\t\t}\n\n\t\t\tMlmeClearAllTxQuality(pEntry);\t/* clear all history */\n\t\t\tpEntry->fLastSecAccordingRSSI = TRUE;\n\t\t}\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n#ifdef DBG_CTRL_SUPPORT\n\t\t/* In Unaware mode always try to send sounding */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)\n\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* TXBF_SUPPORT */\n\n\t\treturn;\n\t}\n\n\tpEntry->lowTrafficCount = 0;\n\n\t/*\n\t\tAfter pEntry->fLastSecAccordingRSSI = TRUE; the for loop \n\t\tcontinue. this condition is true when RateSwitching() is run \n\t\tnext time. \n\t\tso the next rate adaptation is skipped. This mechanism is \n\t\tdeliberately designed by rory.\n\t*/\n\tif (pEntry->fLastSecAccordingRSSI == TRUE)\n\t{\n\t\tpEntry->fLastSecAccordingRSSI = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\t/* DBGPRINT(RT_DEBUG_INFO,(\"DRS: MCS is according to RSSI, and ignore tuning this sec \\n\")); */\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n\n\t\treturn;\n\t}\n\n\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n\t/* Select rate based on PER */\n\tMlmeNewRateAdapt(pAd, pEntry, UpRateIdx, DownRateIdx, TrainUp, TrainDown, TxErrorRatio);\n\n#ifdef DOT11N_SS3_SUPPORT\n\t/* Turn off RDG when 3s and rx count > tx count*5 */\n\tMlmeCheckRDG(pAd, pEntry);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t/* reset all OneSecTx counters */\n\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID StaQuickResponeForRateUpExecAdapt(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN ULONG i,\n\tIN CHAR  Rssi)\n{\n\tPUCHAR\t\t\t\t\tpTable;\n\tUCHAR\t\t\t\t\tCurrRateIdx;\n\tULONG\t\t\t\t\tTxTotalCnt;\n\tULONG\t\t\t\t\tTxErrorRatio = 0;\n\tPMAC_TABLE_ENTRY\t\tpEntry;\n\tRTMP_RA_GRP_TB *pCurrTxRate;\n\tUCHAR\t\t\t\t\tTrainUp, TrainDown;\n\tCHAR\t\t\t\t\tratio;\n\tULONG\t\t\t\t\tTxSuccess, TxRetransmit, TxFailCount;\n\tULONG\t\t\t\t\tOneSecTxNoRetryOKRationCount;\n\tBOOLEAN\t\t\t\t\trateChanged;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN\t\t\t\t\tCurrPhyETxBf, CurrPhyITxBf;\n#endif /* TXBF_SUPPORT */\n\n\n\tpEntry = &pAd->MacTab.Content[i];\n\tpTable = pEntry->pTable;\n\n\tif (pAd->MacTab.Size == 1)\n\t{\n\t\tTX_STA_CNT1_STRUC\t\tStaTx1;\n\t\tTX_STA_CNT0_STRUC\t\tTxStaCnt0;\n\n\t\t/* Update statistic counter */\n\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t}\n\telse\n\t{\n\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t}\n\n\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\tif (TxTotalCnt)\n\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef MFB_SUPPORT\n\tif (pEntry->fLastChangeAccordingMfb == TRUE)\n\t{\n\t\tpEntry->fLastChangeAccordingMfb = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"DRS: MCS is according to MFB, and ignore tuning this sec \\n\"));\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\treturn;\n\t}\n#endif\t/* MFB_SUPPORT */\n\n\t/* Remember the current rate */\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\n#ifdef TXBF_SUPPORT\n\tCurrPhyETxBf = pEntry->phyETxBf;\n\tCurrPhyITxBf = pEntry->phyITxBf;\n#endif /* TXBF_SUPPORT */\n\tpCurrTxRate = PTX_RA_GRP_ENTRY(pTable, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX) && pEntry->perThrdAdj == 1)\n\t{\n\t\tTrainUp\t\t= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown\t= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tTrainUp\t\t= pCurrTxRate->TrainUp;\n\t\tTrainDown\t= pCurrTxRate->TrainDown;\n\t}\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t/* Debug option: Concise RA log */\n\tif ((pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG) || (pAd->CommonCfg.DebugFlags & DBF_DBQ_RA_LOG))\n\t\tMlmeRALog(pAd, pEntry, RAL_QUICK_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n\t/*\n\t\tCASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI\n\t\t     (criteria copied from RT2500 for Netopia case)\n\t*/\n\tif (TxTotalCnt <= 12)\n\t{\n\t\t/* Go back to the original rate */\n\t\tMlmeRestoreLastRate(pEntry);\n\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: TxTotalCnt <= 12, back to original rate \\n\"));\n\n\t\tMlmeNewTxRate(pAd, pEntry);\n\n\t\t// TODO: should we reset all OneSecTx counters?\n\t\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n\t\treturn;\n\t}\n\n\t/*\n\t\tCompare throughput.\n\t\tLastTxCount is based on a time interval of 500 msec or \"500-pAd->ra_fast_interval\" ms.\n\t*/\n\tif ((pEntry->LastTimeTxRateChangeAction == RATE_NO_CHANGE)\n#ifdef DBG_CTRL_SUPPORT\n\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t)\n\t\tratio = RA_INTERVAL/pAd->ra_fast_interval;\n\telse\n\t\tratio = (RA_INTERVAL-pAd->ra_fast_interval)/pAd->ra_fast_interval;\n\n\tOneSecTxNoRetryOKRationCount = (TxSuccess * ratio);\n\n\t/* Downgrade TX quality if PER >= Rate-Down threshold */\n\tif (TxErrorRatio >= TrainDown)\n\t{\n\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND); /* the only situation when pEntry->TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND but no rate change */\n\t}\n\n\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n\t/* Perform DRS - consider TxRate Down first, then rate up. */\n\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t{\n\t\tBOOLEAN useOldRate;\n\n\t\t// TODO: gaa - Finalize the decision criterion\n\t\t/*\n\t\t\t0=>Throughput. Use New Rate if New TP is better than Old TP\n\t\t\t1=>PER. Use New Rate if New PER is less than the TrainDown PER threshold\n\t\t\t2=>Hybrid. Use rate with best TP if difference > 10%. Otherwise use rate with Best Estimated TP\n\t\t\t3=>Hybrid with check that PER<TrainDown Threshold\n\t\t*/\n\t\tif (pAd->CommonCfg.TrainUpRule == 0)\n\t\t{\n\t\t\tuseOldRate = (pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount;\n\t\t}\n\t\telse if (pAd->CommonCfg.TrainUpRule==2 && Rssi<=pAd->CommonCfg.TrainUpRuleRSSI)\n\t\t{\n\t\t\tuseOldRate = MlmeRAHybridRule(pAd, pEntry, pCurrTxRate, OneSecTxNoRetryOKRationCount, TxErrorRatio);\n\t\t}\n\t\telse if (pAd->CommonCfg.TrainUpRule==3 && Rssi<=pAd->CommonCfg.TrainUpRuleRSSI)\n\t\t{\n\t\t\tuseOldRate = (TxErrorRatio >= TrainDown) ||\n\t\t\t\t\t\t MlmeRAHybridRule(pAd, pEntry, pCurrTxRate, OneSecTxNoRetryOKRationCount, TxErrorRatio);\n\t\t}\n\t\telse\n\t\t\tuseOldRate = TxErrorRatio >= TrainDown;\n\t\tif (useOldRate)\n\t\t{\n\t\t\t/* If PER>50% or TP<lastTP/2 then double the TxQuality delay */\n\t\t\tif ((TxErrorRatio > 50) || (OneSecTxNoRetryOKRationCount < pEntry->LastTxOkCount/2))\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND*2);\n\t\t\telse\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\n\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Up) bad tx ok count (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMP_RA_GRP_TB *pLastTxRate = PTX_RA_GRP_ENTRY(pTable, pEntry->lastRateIdx);\n\n\t\t\t/* Clear the history if we changed the MCS and PHY Rate */\n\t\t\tif ((pCurrTxRate->CurrMCS != pLastTxRate->CurrMCS) &&\n\t\t\t\t(pCurrTxRate->dataRate != pLastTxRate->dataRate))\n\t\t\t\tMlmeClearTxQuality(pEntry);\n\n\t\t\tif (pEntry->mcsGroup == 0)\n\t\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Up) keep rate-up (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t}\n\telse if (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t{\n\t\tif ((TxErrorRatio >= 50) || (TxErrorRatio >= TrainDown))\n\t\t{\n\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) direct train down (TxErrorRatio >= TrainDown)\\n\"));\n\t\t}\n\t\telse if ((pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount)\n\t\t{\n\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) bad tx ok count (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) keep rate-down (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t}\n\t}\n\n\t/* See if we reverted to the old rate */\n#ifdef TXBF_SUPPORT\n\trateChanged = (pEntry->CurrTxRateIndex != CurrRateIdx) ||\n\t\t\t\t  (pEntry->phyETxBf!=CurrPhyETxBf) || (pEntry->phyITxBf!=CurrPhyITxBf);\n\n\t/* Remember last good non-BF rate */\n\tif (!pEntry->phyETxBf && !pEntry->phyITxBf)\n\t\tpEntry->lastNonBfRate = pEntry->CurrTxRateIndex;\n#else\n\trateChanged = (pEntry->CurrTxRateIndex != CurrRateIdx);\n#endif /* TXBF_SUPPORT */\n\n\t/* Update mcsGroup */\n\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t{\n\t\tUCHAR UpRateIdx;\n\n\t\t/* If RATE_UP failed look for the next group with valid mcs */\n\t\tif (pEntry->CurrTxRateIndex != CurrRateIdx && pEntry->mcsGroup > 0)\n\t\t{\n\t\t\tpEntry->mcsGroup--;\n\t\t\tpCurrTxRate = PTX_RA_GRP_ENTRY(pTable, pEntry->lastRateIdx);\n\t\t}\n\n\t\tswitch (pEntry->mcsGroup)\n\t\t{\n\t\t\tcase 3:\n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs3;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs2;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tUpRateIdx = pCurrTxRate->upMcs1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tUpRateIdx = CurrRateIdx;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (UpRateIdx == pEntry->CurrTxRateIndex)\n\t\t\tpEntry->mcsGroup = 0;\n\t}\n\n\t/* Handle change back to old rate */\n\tif (rateChanged)\n\t{\n\t\t/* Clear Old Rate's history */\n\t\tMlmeSetTxQuality(pEntry, pEntry->CurrTxRateIndex, 0);\n\t\tpEntry->TxRateUpPenalty = 0;/*redundant */\n\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;/*redundant */\n\n\t\t/* Set new Tx rate */\n\t\tMlmeNewTxRate(pAd, pEntry);\n\t}\n\n\t// TODO: should we reset all OneSecTx counters?\n\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n}\n\n\nVOID MlmeDynamicTxRateSwitchingAdapt(\n    IN PRTMP_ADAPTER pAd,\n\tIN ULONG i,\n\tIN ULONG TxSuccess,\n\tIN ULONG TxRetransmit,\n\tIN ULONG TxFailCount)\n{\n\tPUCHAR\t\t\t  pTable;\n\tUCHAR\t\t\t  UpRateIdx, DownRateIdx, CurrRateIdx;\n\tULONG\t\t\t  TxTotalCnt;\n\tULONG\t\t\t  TxErrorRatio = 0;\n\tMAC_TABLE_ENTRY\t  *pEntry;\n\tRTMP_RA_GRP_TB *pCurrTxRate;\n\tUCHAR\t\t\t  TrainUp, TrainDown;\n\tCHAR\t\t\t  Rssi;\n\n\tpEntry = &pAd->MacTab.Content[i];\n\tpTable = pEntry->pTable;\n\n\tif ((pAd->MacTab.Size == 1) || (IS_ENTRY_DLS(pEntry)))\n\t{\n\t\t/* Rssi = RTMPMaxRssi(pAd, (CHAR)pAd->StaCfg.RssiSample.AvgRssi0, (CHAR)pAd->StaCfg.RssiSample.AvgRssi1, (CHAR)pAd->StaCfg.RssiSample.AvgRssi2); */\n\t\tRssi = RTMPAvgRssi(pAd, &pAd->StaCfg.RssiSample);\n\n\t\t/* Update statistic counter */\n\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\t}\n\telse\n\t{\n\t\t/* Rssi = RTMPMaxRssi(pAd, (CHAR)pEntry->RssiSample.AvgRssi0, (CHAR)pEntry->RssiSample.AvgRssi1, (CHAR)pEntry->RssiSample.AvgRssi2); */\n\t\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\n\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\tTxTotalCnt = pEntry->OneSecTxNoRetryOkCount +\n\t\t\t\t\t pEntry->OneSecTxRetryOkCount +\n\t\t\t\t\t pEntry->OneSecTxFailCount;\n\n\t\tif (TxTotalCnt)\n\t\t\tTxErrorRatio = ((pEntry->OneSecTxRetryOkCount + pEntry->OneSecTxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t\t{\n\t\t\tWCID_TX_CNT_STRUC wcidTxCnt;\n\t\t\tUINT32 regAddr, offset;\n\t\t\tULONG HwTxCnt, HwErrRatio = 0;\n\n\t\t\tregAddr = WCID_TX_CNT_0 + (pEntry->Aid - 1) * 4;\n\t\t\tRTMP_IO_READ32(pAd, regAddr, &wcidTxCnt.word);\n\n\t\t\tHwTxCnt = wcidTxCnt.field.succCnt + wcidTxCnt.field.reTryCnt;\n\t\t\tif (HwTxCnt)\n\t\t\t\tHwErrRatio = (wcidTxCnt.field.reTryCnt * 100) / HwTxCnt;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"%s():TxErrRatio(Aid:%d, MCS:%d, Hw:0x%x-0x%x, Sw:0x%x-%x)\\n\",\n\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS,\n\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\tTxSuccess = wcidTxCnt.field.succCnt;\n\t\t\tTxRetransmit = wcidTxCnt.field.reTryCnt;\n\t\t\tTxErrorRatio = HwErrRatio;\n\t\t\tTxTotalCnt = HwTxCnt;\n\t\t}\n#endif /* FIFO_EXT_SUPPORT */\n\t}\n\n\t/* Save LastTxOkCount, LastTxPER and last MCS action for StaQuickResponeForRateUpExec */\n\tpEntry->LastTxOkCount = TxSuccess;\n\tpEntry->LastTxPER = (UCHAR)TxErrorRatio;\n\tpEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;\n\n\t/* decide the next upgrade rate and downgrade rate, if any */\n\tCurrRateIdx = pEntry->CurrTxRateIndex;\n\tpCurrTxRate = PTX_RA_GRP_ENTRY(pTable, CurrRateIdx);\n\tUpRateIdx = MlmeSelectUpRate(pAd, pEntry, pCurrTxRate);\n\tDownRateIdx = MlmeSelectDownRate(pAd, pEntry, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\t/*\n\t\twhen Rssi > -65, there is a lot of interference usually. therefore, the algorithm tends to choose the mcs lower than the optimal one.\n\t\tby increasing the thresholds, the chosen mcs will be closer to the optimal mcs\n\t*/\n\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX) && pEntry->perThrdAdj == 1)\n\t{\n\t\tTrainUp\t\t= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\tTrainDown\t= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tTrainUp\t\t= pCurrTxRate->TrainUp;\n\t\tTrainDown\t= pCurrTxRate->TrainDown;\n\t}\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t/* Debug option: Concise RA log */\n\tif ((pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG) || (pAd->CommonCfg.DebugFlags & DBF_DBQ_RA_LOG))\n\t\tMlmeRALog(pAd, pEntry, RAL_NEW_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef MFB_SUPPORT\n\tif (pEntry->fLastChangeAccordingMfb == TRUE)\n\t{\n\t\tpEntry->fLastChangeAccordingMfb = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,(\"DRS: MCS is according to MFB, and ignore tuning this sec \\n\"));\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n\t\treturn;\n\t}\n#endif\t/* MFB_SUPPORT */\n\n\n\t/*\n\t\tCASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI\n\t\t     (criteria copied from RT2500 for Netopia case)\n\t*/\n\tif (TxTotalCnt <= 15)\n\t{\n\t\tpEntry->lowTrafficCount++;\n\n\t\tif (pEntry->lowTrafficCount >= pAd->CommonCfg.lowTrafficThrd)\n\t\t{\n\t\t\tUCHAR\tTxRateIdx;\n\t\t\tCHAR\tmcs[24];\n\t\t\tCHAR\tRssiOffset = 0;\n\n\t\t\tpEntry->lowTrafficCount = 0;\n\n\t\t\t/* Check existence and get index of each MCS */\n\t\t\tMlmeGetSupportedMcsAdapt(pAd, pEntry, GI_800, mcs);\n\n\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t{\n\t\t\t\tif (pAd->NicConfig2.field.ExternalLNAForG)\n\t\t\t\t{\n\t\t\t\t\tRssiOffset = 2;\n\t\t\t\t}\n\t\t\t\telse if (ADAPT_RATE_TABLE(pTable))\n\t\t\t\t{\n\t\t\t\t\tRssiOffset = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRssiOffset = 5;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pAd->NicConfig2.field.ExternalLNAForA)\n\t\t\t\t{\n\t\t\t\t\tRssiOffset = 5;\n\t\t\t\t}\n\t\t\t\telse if (ADAPT_RATE_TABLE(pTable))\n\t\t\t\t{\n\t\t\t\t\tRssiOffset = 2;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRssiOffset = 8;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Select the Tx rate based on the RSSI */\n\t\t\tTxRateIdx = MlmeSelectTxRateAdapt(pAd, pEntry, mcs, Rssi, RssiOffset);\n\n\t\t\t/* if (TxRateIdx != pEntry->CurrTxRateIndex) */\n\t\t\t{\n\t\t\t\tpEntry->lastRateIdx = pEntry->CurrTxRateIndex;\n\t\t\t\tMlmeSetMcsGroup(pAd, pEntry);\n\n\t\t\t\tpEntry->CurrTxRateIndex = TxRateIdx;\n#ifdef TXBF_SUPPORT\n\t\t\t\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n#endif /* TXBF_SUPPORT */\n\t\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t\t\tif (!pEntry->fLastSecAccordingRSSI)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO,(\"DRS: TxTotalCnt <= 15, switch to MCS%d according to RSSI (%d), RssiOffset=%d\\n\", pEntry->HTPhyMode.field.MCS, Rssi, RssiOffset));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tMlmeClearAllTxQuality(pEntry);\t/* clear all history */\n\t\t\tpEntry->fLastSecAccordingRSSI = TRUE;\n\t\t}\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n#ifdef DBG_CTRL_SUPPORT\n\t\t/* In Unaware mode always try to send sounding */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)\n\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* TXBF_SUPPORT */\n\n\t\treturn;\n\t}\n\n\tpEntry->lowTrafficCount = 0;\n\n\tif (pEntry->fLastSecAccordingRSSI == TRUE)\n\t{\n\t\tpEntry->fLastSecAccordingRSSI = FALSE;\n\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\t/* DBGPRINT_RAW(RT_DEBUG_TRACE,(\"DRS: MCS is according to RSSI, and ignore tuning this sec \\n\")); */\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n\n\t\treturn;\n\t}\n\n\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n\t/* Select rate based on PER */\n\tMlmeNewRateAdapt(pAd, pEntry, UpRateIdx, DownRateIdx, TrainUp, TrainDown, TxErrorRatio);\n\n#ifdef DOT11N_SS3_SUPPORT\n\t/* Turn off RDG when 3SS and rx count > tx count*5 */\n\tMlmeCheckRDG(pAd, pEntry);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t/* reset all OneSecTx counters */\n\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/*\n\tSet_RateTable_Proc - Display or replace byte for item in RateSwitchTableAdapt11N3S\n\t\tusage: iwpriv ra0 set RateTable=<item>[:<offset>:<value>]\n*/\nINT Set_RateTable_Proc(RTMP_ADAPTER *pAd, PSTRING arg)\n{\n\tUCHAR *pTable, TableSize, InitTxRateIdx;\n\tint i;\n\tMAC_TABLE_ENTRY *pEntry;\n\tint itemNo, rtIndex, value;\n\tUCHAR *pRateEntry;\n\n\t/* Find first Associated STA in MAC table */\n\tfor (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\t\tif (IS_ENTRY_CLIENT(pEntry) && pEntry->Sst==SST_ASSOC)\n\t\t\tbreak;\n\t}\n\n\tif (i==MAX_LEN_OF_MAC_TABLE)\n\t{\n\t    DBGPRINT(RT_DEBUG_ERROR, (\"Set_RateTable_Proc: Empty MAC Table\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t/* Get peer's rate table */\n\tMlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx);\n\n\t/* Get rate index */\n\titemNo = simple_strtol(arg, &arg, 10);\n\tif (itemNo<0 || itemNo>=RATE_TABLE_SIZE(pTable))\n\t\treturn FALSE;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tif (ADAPT_RATE_TABLE(pTable))\n\t\tpRateEntry = (UCHAR *)PTX_RA_GRP_ENTRY(pTable, itemNo);\n\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\tpRateEntry = (UCHAR *)PTX_RA_LEGACY_ENTRY(pTable, itemNo);\n\n\t/* If no addtional parameters then print the entry */\n\tif (*arg != ':') {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_RateTable_Proc::%d\\n\", itemNo));\n\t}\n\telse {\n\t\t/* Otherwise get the offset and the replace byte */\n\t\twhile (*arg<'0' || *arg>'9')\n\t\t\targ++;\n\t\trtIndex = simple_strtol(arg, &arg, 10);\n\t\tif (rtIndex<0 || rtIndex>9)\n\t\t\treturn FALSE;\n\n\t\tif (*arg!=':')\n\t\t\treturn FALSE;\n\t\twhile (*arg<'0' || *arg>'9')\n\t\t\targ++;\n\t\tvalue = simple_strtol(arg, &arg, 10);\n\t\tpRateEntry[rtIndex] = value;\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"Set_RateTable_Proc::%d:%d:%d\\n\", itemNo, rtIndex, value));\n\t}\n\n    DBGPRINT(RT_DEBUG_OFF, (\"%d, 0x%02x, %d, %d, %d, %d, %d, %d, %d, %d\\n\",\n\t\tpRateEntry[0], pRateEntry[1], pRateEntry[2], pRateEntry[3], pRateEntry[4], \n\t\tpRateEntry[5], pRateEntry[6], pRateEntry[7], pRateEntry[8], pRateEntry[9]));\n\n\treturn TRUE;\n}\n\n\nINT\tSet_PerThrdAdj_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR i;\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){\n\t\tpAd->MacTab.Content[i].perThrdAdj = simple_strtol(arg, 0, 10);\n\t}\n\treturn TRUE;\t\n}\n\n/* Set_LowTrafficThrd_Proc - set threshold for reverting to default MCS based on RSSI */\nINT\tSet_LowTrafficThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.lowTrafficThrd = simple_strtol(arg, 0, 10);\n\n\treturn TRUE;\n}\n\n/* Set_TrainUpRule_Proc - set rule for Quick DRS train up */\nINT\tSet_TrainUpRule_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.TrainUpRule = simple_strtol(arg, 0, 10);\n\n\treturn TRUE;\n}\n\n/* Set_TrainUpRuleRSSI_Proc - set RSSI threshold for Quick DRS Hybrid train up */\nINT\tSet_TrainUpRuleRSSI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.TrainUpRuleRSSI = simple_strtol(arg, 0, 10);\n\n\treturn TRUE;\n}\n\n/* Set_TrainUpLowThrd_Proc - set low threshold for Quick DRS Hybrid train up */\nINT\tSet_TrainUpLowThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.TrainUpLowThrd = simple_strtol(arg, 0, 10);\n\n\treturn TRUE;\n}\n\n/* Set_TrainUpHighThrd_Proc - set high threshold for Quick DRS Hybrid train up */\nINT\tSet_TrainUpHighThrd_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->CommonCfg.TrainUpHighThrd = simple_strtol(arg, 0, 10);\n\n\treturn TRUE;\n}\n\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n"
  },
  {
    "path": "src/rate_ctrl/alg_legacy.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n\tAbstract:\n\n\tAll related Dynamic Rate Switch (AP/STA) function body.\n\n\tHistory:\n\n***************************************************************************/\n\n#include \"rt_config.h\"\n\n\n#ifdef CONFIG_AP_SUPPORT\n/*\n    ==========================================================================\n    Description:\n        This routine walks through the MAC table, see if TX rate change is \n        required for each associated client. \n    Output:\n        pEntry->CurrTxRate - \n    NOTE:\n        call this routine every second\n    ==========================================================================\n */\nVOID APMlmeDynamicTxRateSwitching(RTMP_ADAPTER *pAd)\n{\n\tINT i;\n\tPUCHAR pTable;\n\tUCHAR TableSize = 0, InitTxRateIdx, TrainUp, TrainDown;\n\tUCHAR UpRateIdx, DownRateIdx, CurrRateIdx;\n\tMAC_TABLE_ENTRY *pEntry;\n\tRTMP_RA_LEGACY_TB *pCurrTxRate, *pTmpTxRate = NULL;\n\tCHAR Rssi, TmpIdx = 0;\n\tULONG TxTotalCnt, TxErrorRatio = 0, TxSuccess, TxRetransmit, TxFailCount;\n\n\n#ifdef RALINK_ATE\n   \tif (ATE_ON(pAd))\n   \t{\n\t\treturn;\n   \t}\n#endif /* RALINK_ATE */\n\n\t/* walk through MAC table, see if need to change AP's TX rate toward each entry */\n\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t{\n\t\t/* point to information of the individual station */\n\t\tpEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_NONE(pEntry))\n\t\t\tcontinue;\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry) && (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n#endif /* APCLI_SUPPORT */\n\n\n\n\t\t/* check if this entry need to switch rate automatically */\n\t\tif (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)\n\t\t\tcontinue;\n\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx);\n\t\tpEntry->pTable = pTable;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\tif (ADAPT_RATE_TABLE(pTable))\n\t\t{\n\t\t\tAPMlmeDynamicTxRateSwitchingAdapt(pAd, i);\n\n\t\t\tcontinue;\n\t\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\t\tif (SUPPORT_AGS(pAd) && AGS_IS_USING(pAd, pTable))\n\t\t{\n\t\t\tApMlmeDynamicTxRateSwitchingAGS(pAd, i);\n\t\t\tcontinue;\n\t\t}\n#endif /* AGS_SUPPORT */\n\n\t\t/* NICUpdateFifoStaCounters(pAd); */\n\n\t\tif (pAd->MacTab.Size == 1)\n\t\t{\n\t\t\tTX_STA_CNT1_STRUC StaTx1;\n\t\t\tTX_STA_CNT0_STRUC TxStaCnt0;\n\n\t\t\t/* Update statistic counter */\n\t\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\t\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t\t\t{\n\t\t\t\tULONG \tHwTxCnt, HwErrRatio;\n\n\t\t\t\tNicGetMacFifoTxCnt(pAd, pEntry);\n\t\t\t\tHwTxCnt = pEntry->fifoTxSucCnt + pEntry->fifoTxRtyCnt;\n\t\t\t\tif (HwTxCnt)\n\t\t\t\t\tHwErrRatio = (pEntry->fifoTxRtyCnt * 100) / HwTxCnt;\n\t\t\t\telse\n\t\t\t\t\tHwErrRatio = 0;\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t\t(\"%s():Aid:%d, MCS:%d, CuTxRaIdx=%d,TxErrRatio(Hw:%ld-%ld%%, Sw:%ld-%ld%%)\\n\", \n\t\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS,\n\t\t\t\t\t\tpEntry->CurrTxRateIndex,\n\t\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\t\tTxSuccess = pEntry->fifoTxSucCnt;\n\t\t\t\tTxRetransmit = pEntry->fifoTxRtyCnt;\n\t\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\t\tTxErrorRatio = HwErrRatio;\n\t\t\t}\n#endif /* FIFO_EXT_SUPPORT */\n\t\t}\n\n\t\t/* Save LastTxOkCount, LastTxPER and last MCS action for APQuickResponeForRateUpExec */\n\t\tpEntry->LastTxOkCount = TxSuccess;\n\t\tpEntry->LastTxPER = (TxTotalCnt == 0 ? 0 : (UCHAR)TxErrorRatio);\n\t\tpEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;\n\n\t\t/* different calculation in APQuickResponeForRateUpExec() */\n\t\t/* Rssi = RTMPMaxRssi(pAd, (CHAR)pEntry->RssiSample.AvgRssi0, (CHAR)pEntry->RssiSample.AvgRssi1, (CHAR)pEntry->RssiSample.AvgRssi2); */\n\t\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\n\t\tCurrRateIdx = UpRateIdx = DownRateIdx = pEntry->CurrTxRateIndex;\n\n\t\t/* decide the next upgrade rate and downgrade rate, if any */\n\t\tpCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, CurrRateIdx);\n\n\t\tif ((pCurrTxRate->Mode <= MODE_CCK) && (pEntry->SupportRateMode <= SUPPORT_CCK_MODE))\n\t\t{\n\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\twhile(TmpIdx < TableSize)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportCCKMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx++;\n\t\t\t}\n\n\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\twhile(TmpIdx >= 0)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportCCKMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx--;\n\t\t\t}\n\t\t}\t\t\n\t\telse if ((pCurrTxRate->Mode <= MODE_OFDM) && (pEntry->SupportRateMode < SUPPORT_HT_MODE))\n\t\t{\n\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\twhile(TmpIdx < TableSize)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportOFDMMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx++;\n\t\t\t}\n\n\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\twhile(TmpIdx >= 0)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportOFDMMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx--;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* decide the next upgrade rate and downgrade rate, if any*/\n\t\tif ((CurrRateIdx > 0) && (CurrRateIdx < (TableSize - 1)))\n\t\t{\n\t\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\t\twhile(TmpIdx < TableSize)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx++;\n\t\t\t\t}\n\n\t\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\t\twhile(TmpIdx >= 0)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx--;\n\t\t\t\t}\n\t\t}\n\t\telse if (CurrRateIdx == 0)\n\t\t{\n\t\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\t\twhile(TmpIdx < TableSize)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx++;\n\t\t\t\t}\n\n\t\t\tDownRateIdx = CurrRateIdx;\n\t\t}\n\t\telse if (CurrRateIdx == (TableSize - 1))\n\t\t{\n\t\t\tUpRateIdx = CurrRateIdx;\n\n\t\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\t\twhile(TmpIdx >= 0)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t/*\n\t\t\twhen Rssi > -65, there is a lot of interference usually. therefore, the algorithm\n\t\t\ttends to choose the mcs lower than the optimal one.\n\t\t\tby increasing the thresholds, the chosen mcs will be closer to the optimal mcs\n\t\t*/\n\t\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t\t{\n\t\t\tTrainUp\t\t= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\t\tTrainDown\t= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tTrainUp\t\t= pCurrTxRate->TrainUp;\n\t\t\tTrainDown\t= pCurrTxRate->TrainDown;\n\t\t}\n\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t\t/* Debug option: Concise RA log */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG)\n\t\t\tMlmeRALog(pAd, pEntry, RAL_OLD_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n\n\t\t/* Check for low traffic case */\n        if (TxTotalCnt <= 15)\n        {\n\t\t\tUCHAR\tTxRateIdx;\n\t\t\tCHAR\tmcs[24];\n\n\t\t\t/* Check existence and get the index of each MCS */\n\t\t\tMlmeGetSupportedMcs(pAd, pTable, mcs);\n\n\t\t\t/* Select the Tx rate based on the RSSI */\n\t\t\tTxRateIdx = MlmeSelectTxRate(pAd, pEntry, mcs, Rssi, 0);\n\n\n\t\t\tif (TxRateIdx != pEntry->CurrTxRateIndex\n#ifdef TXBF_SUPPORT\n\t\t\t\t|| pEntry->phyETxBf || pEntry->phyITxBf\n#endif /* TXBF_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = TxRateIdx;\n#ifdef TXBF_SUPPORT\n\t\t\t\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n#endif /* TXBF_SUPPORT */\n\t\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t\t\tif (!pEntry->fLastSecAccordingRSSI)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO,(\"DRS: TxTotalCnt <= 15, switch MCS according to RSSI (%d)\\n\", Rssi));\n\t\t\t}\n\n\t\t\tMlmeClearAllTxQuality(pEntry);\n\t\t\tpEntry->fLastSecAccordingRSSI = TRUE;\n\n\t\t\t/* reset all OneSecTx counters */\n\t\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n\n#ifdef TXBF_SUPPORT\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t/* In Unaware mode always try to send sounding */\n\t\t\tif (pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)\n\t\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* TXBF_SUPPORT */\n\t\t\tcontinue;\n        }\n\n\t\tif (pEntry->fLastSecAccordingRSSI == TRUE)\n\t\t{\n\t\t\tpEntry->fLastSecAccordingRSSI = FALSE;\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\t\t/* reset all OneSecTx counters */\n\t\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n\t\t/* Select rate based on PER */\n\t\tMlmeOldRateAdapt(pAd, pEntry, CurrRateIdx, UpRateIdx, DownRateIdx, TrainUp, TrainDown, TxErrorRatio);\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\t/* Turn off RDG when 3s and rx count > tx count*5 */\n\t\tMlmeCheckRDG(pAd, pEntry);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n\n    }\n}\n\n\n/*\n    ========================================================================\n    Routine Description:\n        AP side, Auto TxRate faster train up timer call back function.\n        \n    Arguments:\n        SystemSpecific1         - Not used.\n        FunctionContext         - Pointer to our Adapter context.\n        SystemSpecific2         - Not used.\n        SystemSpecific3         - Not used.\n        \n    Return Value:\n        None\n        \n    ========================================================================\n*/\nVOID APQuickResponeForRateUpExec(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3)\n{\n\tPRTMP_ADAPTER\t\t\tpAd = (PRTMP_ADAPTER)FunctionContext;\n\tULONG\t\t\t\t\ti;\n\tPUCHAR\t\t\t\t\tpTable;\n\tUCHAR\t\t\t\t\tTableSize = 0;\n\tUCHAR\t\t\t\t\tCurrRateIdx;\n\tULONG\t\t\t\t\tAccuTxTotalCnt, TxTotalCnt, TxCnt;\n\tULONG\t\t\t\t\tTxErrorRatio = 0;\n\tMAC_TABLE_ENTRY\t\t\t*pEntry;\n\tRTMP_RA_LEGACY_TB *pCurrTxRate;\n\tUCHAR\t\t\t\t\tInitTxRateIdx, TrainUp, TrainDown;\n\tCHAR\t\t\t\t\tRssi, ratio;\n\tULONG\t\t\t\t\tTxSuccess, TxRetransmit, TxFailCount;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN\t\t\t\t\tCurrPhyETxBf, CurrPhyITxBf;\n#endif /* TXBF_SUPPORT */\n\n\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = FALSE;\n\n    /* walk through MAC table, see if need to change AP's TX rate toward each entry */\n   \tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t{\n       \t pEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_NONE(pEntry))\n\t\t\tcontinue;\n\n\t\tif (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n\n#ifdef APCLI_SUPPORT\n\t\tif (IS_ENTRY_APCLI(pEntry) && (pEntry->Sst != SST_ASSOC))\n\t\t\tcontinue;\n#endif /* APCLI_SUPPORT */\n\n\n\n\n\t\t/* Do nothing if this entry didn't change */\n\t\tif (pEntry->LastSecTxRateChangeAction == RATE_NO_CHANGE\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t\tcontinue;\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx);\n\t\tpEntry->pTable = pTable;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\tif (ADAPT_RATE_TABLE(pTable))\n\t\t{\n\t\t\tAPQuickResponeForRateUpExecAdapt(pAd, i);\n\t\t\tcontinue;\n\t\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n    \t/*Rssi = RTMPMaxRssi(pAd, (CHAR)pEntry->RssiSample.AvgRssi0, (CHAR)pEntry->RssiSample.AvgRssi1, (CHAR)pEntry->RssiSample.AvgRssi2); */\n\t\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\n\n\t\tif (pAd->MacTab.Size == 1)\n\t\t{\n            TX_STA_CNT1_STRUC\t\tStaTx1;\n\t\t\tTX_STA_CNT0_STRUC\t\tTxStaCnt0;\n\n       \t\t/* Update statistic counter */\n\t\t\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\t\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\t\tAccuTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\t pAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\t pAd->RalinkCounters.OneSecTxFailCount;\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n\t\t\tif (pAd->Antenna.field.TxPath > 1)\n\t\t\t\tRssi = (pEntry->RssiSample.AvgRssi0 + pEntry->RssiSample.AvgRssi1) >> 1;\n\t\t\telse\n\t\t\t\tRssi = pEntry->RssiSample.AvgRssi0;\n\n\t\t\tTxCnt = AccuTxTotalCnt;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\t\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\t\tTxCnt = TxTotalCnt;\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\t\tif ((pEntry->Aid >= 1) && (pEntry->Aid <= 8))\n\t\t\t{\n\t\t\t\tULONG\tHwTxCnt, HwErrRatio;\n\n\t\t\t\tNicGetMacFifoTxCnt(pAd, pEntry);\n\t\t\t\tHwTxCnt = pEntry->fifoTxSucCnt + pEntry->fifoTxRtyCnt;\n\t\t\t\tif (HwTxCnt)\n\t\t\t\t\tHwErrRatio = (pEntry->fifoTxRtyCnt * 100) / HwTxCnt;\n\t\t\t\telse\n\t\t\t\t\tHwErrRatio = 0;\n\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"%s():Aid:%d, MCS:%d, TxErrRation(Hw:0x%lx-0x%lx, Sw:0x%lx-%lx)\\n\", \n\t\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS, \n\t\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\t\tTxSuccess = pEntry->fifoTxSucCnt;\n\t\t\t\tTxRetransmit = pEntry->fifoTxRtyCnt;\n\t\t\t\tTxErrorRatio = HwErrRatio;\n\t\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\t\tTxCnt = HwTxCnt;\n\t\t\t}\n#endif /* FIFO_EXT_SUPPORT */\n\t\t}\n\n\t\tCurrRateIdx = pEntry->CurrTxRateIndex;\n#ifdef TXBF_SUPPORT\n\t\tCurrPhyETxBf = pEntry->phyETxBf;\n\t\tCurrPhyITxBf = pEntry->phyITxBf;\n#endif /* TXBF_SUPPORT */\n\t\tpCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\t\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t\t{\n\t\t\tTrainUp\t\t= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\t\tTrainDown\t= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tTrainUp\t\t= pCurrTxRate->TrainUp;\n\t\t\tTrainDown\t= pCurrTxRate->TrainDown;\n\t\t}\n\n\t\t\t\n#ifdef DBG_CTRL_SUPPORT\n\t\t/* Debug option: Concise RA log */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG)\n\t\t\tMlmeRALog(pAd, pEntry, RAL_QUICK_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n        if (TxCnt <= 15 && pEntry->HTPhyMode.field.MCS > 1)\n        {\n\t\t\tMlmeClearAllTxQuality(pEntry);\n\n\t\t\t/* Set current up MCS at the worst quality */\n\t\t\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t\t{\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\t\t\t}\n\n\t\t\t/* Go back to the original rate */\n\t\t\tMlmeRestoreLastRate(pEntry);\n\n\t\t\tMlmeNewTxRate(pAd, pEntry);\n\n\n\t\t// TODO: should we reset all OneSecTx counters?\n\t\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n\n\t\t\tcontinue;\n        }\n\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n       /* Compare throughput */\n\t\tdo\n\t\t{\n\t\t\tULONG OneSecTxNoRetryOKRationCount;\n\n\t\t\t/*\n\t\t\t\tCompare throughput.\n\t\t\t\tLastTxCount is based on a time interval of \"500\" msec or \"500-pAd->ra_fast_interval\" ms.\n\t\t\t*/\n\t\t\tif ((pEntry->LastTimeTxRateChangeAction == RATE_NO_CHANGE)\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t\tratio = RA_INTERVAL/pAd->ra_fast_interval;\n\t\t\telse\n\t\t\t\tratio = (RA_INTERVAL-pAd->ra_fast_interval)/pAd->ra_fast_interval;\n\n\t\t\t/* downgrade TX quality if PER >= Rate-Down threshold */\n\t\t\tif (TxErrorRatio >= TrainDown)\n\t\t\t{\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\t\t\t}\n\n\t\t\tif (pAd->MacTab.Size == 1)\n\t\t\t{\n\t\t\t\tOneSecTxNoRetryOKRationCount = (TxSuccess * ratio);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tOneSecTxNoRetryOKRationCount = pEntry->OneSecTxNoRetryOkCount * ratio + (pEntry->OneSecTxNoRetryOkCount >> 1);\n\t\t\t}\n\n\t\t\t/* perform DRS - consider TxRate Down first, then rate up. */\n\t\t\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t\t{\n// TODO: gaa - use different criterion for train up in Old RA?\n\t\t\t\t/*if ((pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount) */\n\t\t\t\tif (TxErrorRatio >= TrainDown)\n\t\t\t\t{\n#ifdef TXBF_SUPPORT\n\t\t\t\t\t/* If PER>50% or TP<lastTP/2 then double the TxQuality delay */\n\t\t\t\t\tif ((TxErrorRatio > 50) || (OneSecTxNoRetryOKRationCount < pEntry->LastTxOkCount/2))\n\t\t\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND*2);\n\t\t\t\t\telse\n#endif /* TXBF_SUPPORT */\n\t\t\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\n\t\t\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t\t\t{\n\t\t\t\t/* if ((TxErrorRatio >= 50) || (TxErrorRatio >= TrainDown)) */\n\t\t\t\tif ((TxErrorRatio >= 50) && (TxErrorRatio >= TrainDown))\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\telse if ((pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount)\n\t\t\t\t{\n\t\t\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"QuickDRS: (Down) keep rate-down (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t\t\t}\n\t\t\t}\n\t\t}while (FALSE);\n\n#ifdef TXBF_SUPPORT\n\t\t/* Remember last good non-BF rate */\n\t\tif (!pEntry->phyETxBf && !pEntry->phyITxBf)\n\t\t\tpEntry->lastNonBfRate = pEntry->CurrTxRateIndex;\n#endif /* TXBF_SUPPORT */\n\n\t\t/* If rate changed then update the history and set the new tx rate */\n\t\tif ((pEntry->CurrTxRateIndex != CurrRateIdx)\n#ifdef TXBF_SUPPORT\n\t\t\t|| (pEntry->phyETxBf!=CurrPhyETxBf) || (pEntry->phyITxBf!=CurrPhyITxBf)\n#endif /* TXBF_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* if rate-up happen, clear all bad history of all TX rates */\n\t\t\tif (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t\t\t{\n\t\t\t\tpEntry->TxRateUpPenalty = 0;\n\t\t\t\tif (pEntry->CurrTxRateIndex != CurrRateIdx)\n\t\t\t\t\tMlmeClearTxQuality(pEntry);\n\t\t\t}\n\t\t\t/* if rate-down happen, only clear DownRate's bad history */\n\t\t\telse if (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t\t{\n\t\t\t\tpEntry->TxRateUpPenalty = 0;           /* no penalty */\n\t\t\t\tMlmeSetTxQuality(pEntry, pEntry->CurrTxRateIndex, 0);\n\t\t\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t\t\t}\n\n\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t}\n\n\t\t// TODO: should we reset all OneSecTx counters?\n\t\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n    }\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\t\tThis routine calculates the acumulated TxPER of eaxh TxRate. And\n\t\taccording to the calculation result, change CommonCfg.TxRate which\n\t\tis the stable TX Rate we expect the Radio situation could sustained.\n\n\t\tCommonCfg.TxRate will change dynamically within {RATE_1/RATE_6, MaxTxRate}\n\tOutput:\n\t\tCommonCfg.TxRate -\n\n\tIRQL = DISPATCH_LEVEL\n\n\tNOTE:\n\t\tcall this routine every second\n\t==========================================================================\n */\nVOID MlmeDynamicTxRateSwitching(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tPUCHAR\t\t\t\t\tpTable;\n\tUCHAR\t\t\t\t\tTableSize = 0;\n\tUCHAR\t\t\t\t\tUpRateIdx = 0, DownRateIdx = 0, CurrRateIdx;\n\tULONG\t\t\t\t\ti, TxTotalCnt;\n\tULONG\t\t\t\t\tTxErrorRatio = 0;\n\tMAC_TABLE_ENTRY\t\t\t*pEntry;\n\tRTMP_RA_LEGACY_TB *pCurrTxRate, *pTmpTxRate = NULL;\n\tUCHAR\t\t\t\t\tInitTxRateIdx, TrainUp, TrainDown;\n\tTX_STA_CNT1_STRUC\t\tStaTx1;\n\tTX_STA_CNT0_STRUC\t\tTxStaCnt0;\n\tCHAR\t\t\t\t\tRssi, TmpIdx = 0;\n\tULONG\t\t\t\t\tTxRetransmit = 0, TxSuccess = 0, TxFailCount = 0;\n\tRSSI_SAMPLE\t\t\t\t*pRssi = &pAd->StaCfg.RssiSample;\n#ifdef RT3290\n\tULONG AccuTxTotalCnt = 0;\n#endif /* RT3290 */\n#ifdef AGS_SUPPORT\n\tAGS_STATISTICS_INFO\t\tAGSStatisticsInfo = {0};\n#endif /* AGS_SUPPORT */\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\treturn;\n\t}\n#endif /* RALINK_ATE */\n\n\t/* Update statistic counter */\n\tNicGetTxRawCounters(pAd, &TxStaCnt0, &StaTx1);\n\n\tTxRetransmit = StaTx1.field.TxRetransmit;\n\tTxSuccess = StaTx1.field.TxSuccess;\n\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t/* walk through MAC table, see if need to change AP's TX rate toward each entry */\n   \tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\n\t\tif (IS_ENTRY_NONE(pEntry))\n\t\t\tcontinue;\n\n\t\t/* check if this entry need to switch rate automatically */\n\t\tif (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)\n\t\t\tcontinue;\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (IS_ENTRY_CLIENT(pEntry) && \n\t\t\tIS_P2P_ENTRY_NONE(pEntry) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tif (pAd->Mlme.StaStayTick == (pAd->ra_interval / 100))\n\t\t\t{\n\t\t\t\tpAd->Mlme.StaStayTick = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tif (IS_P2P_CLI_ENTRY(pEntry) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tif (pAd->Mlme.P2pStayTick == (pAd->ra_interval / 100))\n\t\t\t{\n\t\t\t\tpAd->Mlme.P2pStayTick = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\tcontinue;\n\t\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx);\n\t\tpEntry->pTable = pTable;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\tif (ADAPT_RATE_TABLE(pTable))\n\t\t{\n\t\t\tMlmeDynamicTxRateSwitchingAdapt(pAd, i, TxSuccess, TxRetransmit, TxFailCount);\n\t\t\tcontinue;\n\t\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n\t\tif ((pAd->MacTab.Size == 1) || IS_ENTRY_DLS(pEntry))\n\t\t{\n\t\t\t/* Rssi = RTMPMaxRssi(pAd, pRssi->AvgRssi0, pRssi->AvgRssi1, pRssi->AvgRssi2); */\n\t\t\tRssi = RTMPAvgRssi(pAd, pRssi);\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef RT3290\n\t\t\t/* \n\t\t\t\tIf no traffic in the past 1-sec period, don't change TX rate,\n\t\t\t\tbut clear all bad history. because the bad history may affect the next\n\t\t\t\tChariot throughput test\n\t\t\t*/\n\t\t\tAccuTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + \n\t\t\t\t\t\t pAd->RalinkCounters.OneSecTxRetryOkCount + \n\t\t\t\t\t\t pAd->RalinkCounters.OneSecTxFailCount;\n\n\t\t\tif (IS_RT3290(pAd) &&\n\t\t\t\t((AccuTxTotalCnt > 150) || (pAd->AntennaDiversityState == 1)) &&\n\t\t\t\t(pAd->CommonCfg.BBPCurrentBW == BW_40))\n\t\t\t{\n\t\t\t\tWLAN_FUN_CTRL_STRUC WlanFunCtrl = {.word = 0};\n\t\t\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\n\t\t\t\tif ((WlanFunCtrl.field.WLAN_EN == TRUE) &&\n\t\t\t\t\t(WlanFunCtrl.field.PCIE_APP0_CLK_REQ == FALSE))\n\t\t\t\t{\n\t\t\t\t\tWlanFunCtrl.field.PCIE_APP0_CLK_REQ = TRUE;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\t\t}\n\t\t\t\t// TODO: shiang, why RT3290 need to do AntSelection here??\n\t\t\t\tMlmeAntSelection(pAd, AccuTxTotalCnt, TxErrorRatio, TxSuccess, pAd->StaCfg.RssiSample.AvgRssi0);\n\t\t\t}\n#endif /* RT3290 */\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t\t(\"DRS:Aid=%d, TxSuccess=%ld, TxRetransmit=%ld, TxFailCount=%ld \\n\",\n\t\t\t\t\tpEntry->Aid, TxSuccess, TxRetransmit, TxFailCount));\n\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t{\n\t\t\t\t\n\t\t\t\t/* Gather the statistics information*/\n\t\t\t\t\n\t\t\t\tAGSStatisticsInfo.RSSI = Rssi;\n\t\t\t\tAGSStatisticsInfo.TxErrorRatio = TxErrorRatio;\n\t\t\t\tAGSStatisticsInfo.AccuTxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxSuccess = TxSuccess;\n\t\t\t\tAGSStatisticsInfo.TxRetransmit = TxRetransmit;\n\t\t\t\tAGSStatisticsInfo.TxFailCount = TxFailCount;\n\t\t\t}\n#endif /* AGS_SUPPORT */\n\t\t}\n\t\telse\n\t\t{\t\t\n\t\t\tif (INFRA_ON(pAd) && (i == 1))\n\t\t\t\tRssi = RTMPAvgRssi(pAd, pRssi);\n\t\t\telse\n\t\t\t\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\t\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\n\t\t\tTxTotalCnt = pEntry->OneSecTxNoRetryOkCount +\n\t\t\t\t pEntry->OneSecTxRetryOkCount +\n\t\t\t\t pEntry->OneSecTxFailCount;\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((pEntry->OneSecTxRetryOkCount + pEntry->OneSecTxFailCount) * 100) / TxTotalCnt;\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,\n\t\t\t\t(\"DRS:Aid=%d, OneSecTxNoRetry=%d, OneSecTxRetry=%d, OneSecTxFail=%d\\n\",\n\t\t\t\tpEntry->Aid,\n\t\t\t\tpEntry->OneSecTxNoRetryOkCount,\n\t\t\t\tpEntry->OneSecTxRetryOkCount,\n\t\t\t\tpEntry->OneSecTxFailCount));\n\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t{\n\t\t\t\t\n\t\t\t\t/* Gather the statistics information*/\n\t\t\t\t\n\t\t\t\tAGSStatisticsInfo.RSSI = Rssi;\n\t\t\t\tAGSStatisticsInfo.TxErrorRatio = TxErrorRatio;\n\t\t\t\tAGSStatisticsInfo.AccuTxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\t\t\tAGSStatisticsInfo.TxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\t\t\tAGSStatisticsInfo.TxFailCount = pEntry->OneSecTxFailCount;\n\t\t\t}\n#endif /* AGS_SUPPORT */\n\t\t}\n\n\t\tif (TxTotalCnt)\n\t\t{\n\t\t\tif (TxErrorRatio == 100)\n\t\t\t{\n\t\t\t\tTX_RTY_CFG_STRUC\tTxRtyCfg,TxRtyCfgtmp;\n\t\t\t\tULONG\tIndex;\n\t\t\t\tUINT32\tMACValue;\n\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word);\n\t\t\t\tTxRtyCfgtmp.word = TxRtyCfg.word;\n\t\t\t\tTxRtyCfg.field.LongRtyLimit = 0x0;\n\t\t\t\tTxRtyCfg.field.ShortRtyLimit = 0x0;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word);\n\n\t\t\t\tRTMPusecDelay(1);\n\n\t\t\t\tIndex = 0;\n\t\t\t\tMACValue = 0;\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);\n\t\t\t\t\tif ((MACValue & 0xffffff) == 0)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tIndex++;\n\t\t\t\t\tRTMPusecDelay(1000);\n\t\t\t\t}while((Index < 330)&&(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)));\n\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word);\n\t\t\t\tTxRtyCfg.field.LongRtyLimit = TxRtyCfgtmp.field.LongRtyLimit;\n\t\t\t\tTxRtyCfg.field.ShortRtyLimit = TxRtyCfgtmp.field.ShortRtyLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word);\n\t\t\t}\n\n#ifdef RT3290\n\t\t\t// TODO: shiang, what's the purpose of \"AntennaDiversityInfo.AntennaDiversityState\"??\n\t\t\tif (0) //IS_RT3290(pAd) &&  ((AccuTxTotalCnt > 150) || (pAd->AntennaDiversityInfo.AntennaDiversityState == 1)) && (pAd->CommonCfg.BBPCurrentBW == BW_40))\n\t\t\t{\n\t\t\t\tWLAN_FUN_CTRL_STRUC WlanFunCtrl = {.word = 0};\n\t\t\t\t\n\t\t\t\tRTMP_IO_READ32(pAd, WLAN_FUN_CTRL, &WlanFunCtrl.word);\n\t\t\t\tif ((WlanFunCtrl.field.WLAN_EN == TRUE) && (WlanFunCtrl.field.PCIE_APP0_CLK_REQ == FALSE))\n\t\t\t\t{\n\t\t\t\t\tWlanFunCtrl.field.PCIE_APP0_CLK_REQ = TRUE;\n\t\t\t\t\tRTMP_IO_WRITE32(pAd, WLAN_FUN_CTRL, WlanFunCtrl.word);\n\t\t\t\t}\n\t\t\t}\n#endif /* RT3290 */\n\t\t}\n\n\t\tCurrRateIdx = pEntry->CurrTxRateIndex;\n\n#ifdef AGS_SUPPORT\n\t\tif (AGS_IS_USING(pAd, pTable))\n\t\t{\n\t\t\t/* The dynamic Tx rate switching for AGS (Adaptive Group Switching)*/\t\n\t\t\tMlmeDynamicTxRateSwitchingAGS(pAd, pEntry, pTable, TableSize, &AGSStatisticsInfo, InitTxRateIdx);\n\n\t\t\tcontinue;\n\t\t}\n#endif /* AGS_SUPPORT */\n\n\t\tif (CurrRateIdx >= TableSize)\n\t\t\tCurrRateIdx = TableSize - 1;\n\n\t\tUpRateIdx = DownRateIdx = CurrRateIdx;\n\n\t\t/* Save LastTxOkCount, LastTxPER and last MCS action for StaQuickResponeForRateUpExec */\n\t\tpEntry->LastTxOkCount = TxSuccess;\n\t\tpEntry->LastTxPER = (TxTotalCnt == 0 ? 0 : (UCHAR)TxErrorRatio);\n\t\tpEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;\n\n\t\t/*\n\t\t\tWhen switch from Fixed rate -> auto rate, the REAL TX rate might be different from pEntry->TxRateIndex.\n\t\t\tSo need to sync here.\n\t\t*/\n\t\tpCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, CurrRateIdx);\n\t\tif (pEntry->HTPhyMode.field.MCS != pCurrTxRate->CurrMCS)\n\t\t{\n\t\t\t/*\n\t\t\t\tNeed to sync Real Tx rate and our record.\n\t\t\t\tThen return for next DRS.\n\t\t\t*/\n\t\t\tpEntry->CurrTxRateIndex = InitTxRateIdx;\n#ifdef TXBF_SUPPORT\n\t\t\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n#endif /* TXBF_SUPPORT */\n\t\t\tMlmeNewTxRate(pAd, pEntry);\n\n\t\t\t/* reset all OneSecTx counters */\n\t\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* decide the next upgrade rate and downgrade rate, if any */\n\t\tif ((pCurrTxRate->Mode <= MODE_CCK) && (pEntry->SupportRateMode <= SUPPORT_CCK_MODE))\n\t\t{\n\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\twhile(TmpIdx < TableSize)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportCCKMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx++;\n\t\t\t}\n\n\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\twhile(TmpIdx >= 0)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportCCKMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx--;\n\t\t\t}\n\t\t}\t\t\n\t\telse if ((pCurrTxRate->Mode <= MODE_OFDM) && (pEntry->SupportRateMode < SUPPORT_HT_MODE))\n\t\t{\n\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\twhile(TmpIdx < TableSize)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportOFDMMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx++;\n\t\t\t}\n\n\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\twhile(TmpIdx >= 0)\n\t\t\t{\n\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\tif (pEntry->SupportOFDMMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t{\n\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tTmpIdx--;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* decide the next upgrade rate and downgrade rate, if any*/\n\t\tif ((CurrRateIdx > 0) && (CurrRateIdx < (TableSize - 1)))\n\t\t{\n\t\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\t\twhile(TmpIdx < TableSize)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx++;\n\t\t\t\t}\n\n\t\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\t\twhile(TmpIdx >= 0)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx--;\n\t\t\t\t}\n\t\t}\n\t\telse if (CurrRateIdx == 0)\n\t\t{\n\t\t\t\tTmpIdx = CurrRateIdx + 1;\n\t\t\t\twhile(TmpIdx < TableSize)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tUpRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx++;\n\t\t\t\t}\n\n\t\t\tDownRateIdx = CurrRateIdx;\n\t\t}\n\t\telse if (CurrRateIdx == (TableSize - 1))\n\t\t{\n\t\t\tUpRateIdx = CurrRateIdx;\n\n\t\t\t\tTmpIdx = CurrRateIdx - 1;\n\t\t\t\twhile(TmpIdx >= 0)\n\t\t\t\t{\n\t\t\t\t\tpTmpTxRate = PTX_RA_LEGACY_ENTRY(pTable, TmpIdx);\n\t\t\t\t\tif (pEntry->SupportHTMCS[pTmpTxRate->CurrMCS] == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDownRateIdx = TmpIdx;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tTmpIdx--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\n\t\t/*\n\t\t\twhen Rssi > -65, there is a lot of interference usually. therefore, the \n\t\t\talgorithm tends to choose the mcs lower than the optimal one.\n\t\t\tby increasing the thresholds, the chosen mcs will be closer to the optimal mcs\n\t\t*/\n\t\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t\t{\n\t\t\tTrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\t\tTrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tTrainUp = pCurrTxRate->TrainUp;\n\t\t\tTrainDown = pCurrTxRate->TrainDown;\n\t\t}\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t\t/* Debug option: Concise RA log */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG)\n\t\t\tMlmeRALog(pAd, pEntry, RAL_OLD_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n\n\n\t\t/*\n\t\t\tCASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI\n\t\t\t     (criteria copied from RT2500 for Netopia case)\n\t\t*/\n\t\tif (TxTotalCnt <= 15)\n\t\t{\n\t\t\tUCHAR\tTxRateIdx;\n\t\t\tCHAR\tmcs[24];\n\t\t\tCHAR\tRssiOffset = 0;\n\n\t\t\t/* Check existence and get the index of each MCS */\n\t\t\tMlmeGetSupportedMcs(pAd, pTable, mcs);\n\n\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t{\n\t\t\t\tRssiOffset = pAd->NicConfig2.field.ExternalLNAForG? 2: 5;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRssiOffset = pAd->NicConfig2.field.ExternalLNAForA? 5: 8;\n\t\t\t}\n\n\t\t\t/* Select the Tx rate based on the RSSI */\n\t\t\tTxRateIdx = MlmeSelectTxRate(pAd, pEntry, mcs, Rssi, RssiOffset);\n\n\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = TxRateIdx;\n#ifdef TXBF_SUPPORT\n\t\t\t\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n#endif /* TXBF_SUPPORT */\n\t\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t\t\tif (!pEntry->fLastSecAccordingRSSI)\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO,(\"DRS: TxTotalCnt <= 15, switch MCS according to RSSI (%d), RssiOffset=%d\\n\", Rssi, RssiOffset));\n\t\t\t}\n\n\t\t\tMlmeClearAllTxQuality(pEntry);\n\t\t\tpEntry->fLastSecAccordingRSSI = TRUE;\n\n\t\t\t/* reset all OneSecTx counters */\n\t\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t/* In Unaware mode always try to send sounding */\n\t\t\tif (pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)\n\t\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* TXBF_SUPPORT */\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pEntry->fLastSecAccordingRSSI == TRUE)\n\t\t{\n\t\t\tpEntry->fLastSecAccordingRSSI = FALSE;\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\t\t\t/* reset all OneSecTx counters */\n\t\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n\t\t/* Select rate based on PER */\n\t\tMlmeOldRateAdapt(pAd, pEntry, CurrRateIdx, UpRateIdx, DownRateIdx, TrainUp, TrainDown, TxErrorRatio);\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\t/* Turn off RDG when 3s and rx count > tx count*5 */\n\t\tMlmeCheckRDG(pAd, pEntry);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t/* reset all OneSecTx counters */\n\t\tRESET_ONE_SEC_TX_CNT(pEntry);\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\teTxBFProbing(pAd, pEntry);\n#endif /* TXBF_SUPPORT */\n\t\t}\n}\n\n\n/*\n\t========================================================================\n\tRoutine Description:\n\t\tStation side, Auto TxRate faster train up timer call back function.\n\n\tArguments:\n\t\tSystemSpecific1\t\t\t- Not used.\n\t\tFunctionContext\t\t\t- Pointer to our Adapter context.\n\t\tSystemSpecific2\t\t\t- Not used.\n\t\tSystemSpecific3\t\t\t- Not used.\n\n\tReturn Value:\n\t\tNone\n\n\t========================================================================\n*/\nVOID StaQuickResponeForRateUpExec(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\t\t\tpAd = (PRTMP_ADAPTER)FunctionContext;\n\tULONG\t\t\t\t\ti;\n\tPUCHAR\t\t\t\t\tpTable;\n\tUCHAR\t\t\t\t\tTableSize = 0;\n\tUCHAR\t\t\t\t\tCurrRateIdx;\n\tULONG\t\t\t\t\tTxTotalCnt;\n\tULONG\t\t\t\t\tTxErrorRatio = 0;\n\tRTMP_RA_LEGACY_TB *pCurrTxRate;\n\tUCHAR\t\t\t\t\tInitTxRateIdx, TrainUp, TrainDown;\n\tCHAR\t\t\t\t\tRssi, ratio;\n\tULONG\t\t\t\t\tTxSuccess, TxRetransmit, TxFailCount;\n\tMAC_TABLE_ENTRY\t\t\t*pEntry;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN\t\t\t\t\tCurrPhyETxBf, CurrPhyITxBf;\n#endif /* TXBF_SUPPORT */\n#ifdef AGS_SUPPORT\n\tAGS_STATISTICS_INFO\t\tAGSStatisticsInfo = {0};\n#endif /* AGS_SUPPORT */\n#ifdef CONFIG_MULTI_CHANNEL\n\tBOOLEAN\t\t\t\t\tbDoRateTune = FALSE;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;\n\n    /* walk through MAC table, see if need to change AP's TX rate toward each entry */\n\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t{\n\t\tpEntry = &pAd->MacTab.Content[i];\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tbDoRateTune = pEntry->bDoRateTune;\n\t\tpEntry->bDoRateTune = FALSE;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\tif (IS_ENTRY_NONE(pEntry))\n\t\t\tcontinue;\n\n\t\t/* check if this entry need to switch rate automatically */\n\t\tif (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)\n\t\t\tcontinue;\n\n\t\t/* Do nothing if this entry didn't change */\n\t\tif (pEntry->LastSecTxRateChangeAction == RATE_NO_CHANGE\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t\tcontinue;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (IS_ENTRY_CLIENT(pEntry) && \n\t\t\tIS_P2P_ENTRY_NONE(pEntry) &&\n\t\t\t(bDoRateTune) &&\n\t\t\t((pAd->MultiChannelFlowCtl & HCCA_DEQUEUE_DISABLE) == 1) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\tcontinue;\n\n\t\tif (IS_P2P_CLI_ENTRY(pEntry) &&\n\t\t\t(bDoRateTune) &&\n\t\t\t((pAd->MultiChannelFlowCtl & EDCA_AC0_DEQUEUE_DISABLE) == 1) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\tcontinue;\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\tif (INFRA_ON(pAd) && (i == 1))\n\t\t\tRssi = RTMPAvgRssi(pAd, &pAd->StaCfg.RssiSample);\n\t\telse\n\t\t\tRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx);\n\t\tpEntry->pTable = pTable;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\tif (ADAPT_RATE_TABLE(pTable))\n\t\t{\n\t\t\tStaQuickResponeForRateUpExecAdapt(pAd, i, Rssi);\n\t\t\tcontinue;\n\t\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n\t\tCurrRateIdx = pEntry->CurrTxRateIndex;\n#ifdef TXBF_SUPPORT\n\t\tCurrPhyETxBf = pEntry->phyETxBf;\n\t\tCurrPhyITxBf = pEntry->phyITxBf;\n#endif /* TXBF_SUPPORT */\n\t\tpCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, CurrRateIdx);\n\n#ifdef DOT11_N_SUPPORT\n\t\tif ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))\n\t\t{\n\t\t\tTrainUp\t\t= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));\n\t\t\tTrainDown\t= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tTrainUp\t\t= pCurrTxRate->TrainUp;\n\t\t\tTrainDown\t= pCurrTxRate->TrainDown;\n\t\t}\n\n\t\tif (pAd->MacTab.Size == 1)\n\t\t{\n\t\t\t/* Update statistic counter */\n\t\t\tTX_STA_CNT1_STRUC\tStaTx1;\n\t\t\tTX_STA_CNT0_STRUC\tTxStaCnt0;\n\n\t\t\tRTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);\n\t\t\tRTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);\n\n\t\t\tTxRetransmit = StaTx1.field.TxRetransmit;\n\t\t\tTxSuccess = StaTx1.field.TxSuccess;\n\t\t\tTxFailCount = TxStaCnt0.field.TxFailCount;\n\t\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\n\t\t\tpAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;\n\t\t\tpAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;\n\t\t\tpAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t\tpAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;\n\t\t\tpAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;\n\t\t\tpAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t{\n\t\t\t\t\n\t\t\t\t/* Gather the statistics information*/\n\t\t\t\t\n\t\t\t\tAGSStatisticsInfo.RSSI = Rssi;\n\t\t\t\tAGSStatisticsInfo.TxErrorRatio = TxErrorRatio;\n\t\t\t\tAGSStatisticsInfo.AccuTxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxSuccess = TxSuccess;\n\t\t\t\tAGSStatisticsInfo.TxRetransmit = TxRetransmit;\n\t\t\t\tAGSStatisticsInfo.TxFailCount = TxFailCount;\n\t\t\t}\n#endif /* AGS_SUPPORT */\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\t\tTxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\t\tTxFailCount = pEntry->OneSecTxFailCount;\n\n\t\t\tTxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;\n\t\t\tif (TxTotalCnt)\n\t\t\t\tTxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt;\n\n#ifdef FIFO_EXT_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwFifoExtCap)\n\t\t\t{\n\t\t\t\tif (pEntry->Aid >= 1 && pEntry->Aid <= 8)\n\t\t\t\t{\n\t\t\t\t\tWCID_TX_CNT_STRUC wcidTxCnt;\n\t\t\t\t\tUINT32 regAddr, offset;\n\t\t\t\t\tULONG HwTxCnt, HwErrRatio = 0;\n\n\t\t\t\t\tregAddr = WCID_TX_CNT_0 + (pEntry->Aid - 1) * 4;\n\t\t\t\t\tRTMP_IO_READ32(pAd, regAddr, &wcidTxCnt.word);\n\n\t\t\t\t\tHwTxCnt = wcidTxCnt.field.succCnt + wcidTxCnt.field.reTryCnt;\n\t\t\t\t\tif (HwTxCnt)\n\t\t\t\t\t\tHwErrRatio = (wcidTxCnt.field.reTryCnt * 100) / HwTxCnt;\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s():TxErrRatio(Aid:%d, MCS:%d, Hw:0x%x-0x%x, Sw:0x%x-%x)\\n\", \n\t\t\t\t\t\t\t__FUNCTION__, pEntry->Aid, pEntry->HTPhyMode.field.MCS, \n\t\t\t\t\t\t\tHwTxCnt, HwErrRatio, TxTotalCnt, TxErrorRatio));\n\n\t\t\t\t\tTxSuccess = wcidTxCnt.field.succCnt;\n\t\t\t\t\tTxRetransmit = wcidTxCnt.field.reTryCnt;\n\t\t\t\t\tTxErrorRatio = HwErrRatio;\n\t\t\t\t\tTxTotalCnt = HwTxCnt;\n\t\t\t\t}\n\t\t\t}\n#endif /* FIFO_EXT_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t{\n\t\t\t\t\n\t\t\t\t/* Gather the statistics information*/\n\t\t\t\t\n\t\t\t\tAGSStatisticsInfo.RSSI = Rssi;\n\t\t\t\tAGSStatisticsInfo.TxErrorRatio = TxErrorRatio;\n\t\t\t\tAGSStatisticsInfo.AccuTxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxTotalCnt = TxTotalCnt;\n\t\t\t\tAGSStatisticsInfo.TxSuccess = pEntry->OneSecTxNoRetryOkCount;\n\t\t\t\tAGSStatisticsInfo.TxRetransmit = pEntry->OneSecTxRetryOkCount;\n\t\t\t\tAGSStatisticsInfo.TxFailCount = pEntry->OneSecTxFailCount;\n\t\t\t}\n#endif /* AGS_SUPPORT */\n\t\t}\n\n#ifdef AGS_SUPPORT\n\t\tif (AGS_IS_USING(pAd, pTable))\n\t\t{\n\t\t\t\n\t\t\t/* The dynamic Tx rate switching for AGS (Adaptive Group Switching)*/\n\t\t\t\n\t\t\tStaQuickResponeForRateUpExecAGS(pAd, pEntry, pTable, TableSize, &AGSStatisticsInfo, InitTxRateIdx);\n\t\t\t\n\t\t\tcontinue; /* Skip the remaining procedure of the old Tx rate switching*/\n\t\t}\n#endif /* AGS_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n\t\t/* Debug option: Concise RA log */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_SHOW_RA_LOG)\n\t\t\tMlmeRALog(pAd, pEntry, RAL_QUICK_DRS, TxErrorRatio, TxTotalCnt);\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/*\n\t\t\tCASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI\n\t\t\t     (criteria copied from RT2500 for Netopia case)\n\t\t*/\n\t\tif (TxTotalCnt <= 12)\n\t\t{\n\t\t\tMlmeClearAllTxQuality(pEntry);\n\n\t\t\t/* Set current up MCS at the worst quality */\n\t\t\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t\t{\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\t\t\t}\n\n\t\t\t/* Go back to the original rate */\n\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\tMlmeNewTxRate(pAd, pEntry);\n\n\t\t\t// TODO: should we reset all OneSecTx counters?\n\t\t\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tpEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio;\n\n       /* Compare throughput */\n\t\tdo\n\t\t{\n\t\t\tULONG OneSecTxNoRetryOKRationCount;\n\n\t\t\t/*\n\t\t\t\tCompare throughput.\n\t\t\t\tLastTxCount is based on a time interval of 500 msec or \"500-pAd->ra_fast_interval\" ms.\n\t\t\t*/\n\t\t\tif ((pEntry->LastTimeTxRateChangeAction == RATE_NO_CHANGE)\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t\tratio = RA_INTERVAL/pAd->ra_fast_interval;\n\t\t\telse\n\t\t\t\tratio = (RA_INTERVAL-pAd->ra_fast_interval)/pAd->ra_fast_interval;\n\n\t\t\tOneSecTxNoRetryOKRationCount = (TxSuccess * ratio);\n\n\t\t\t/* downgrade TX quality if PER >= Rate-Down threshold */\n\t\t\tif (TxErrorRatio >= TrainDown)\n\t\t\t{\n\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\t\t\t}\n\n\t\t\t/* perform DRS - consider TxRate Down first, then rate up. */\n\t\t\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t\t{\n\t\t\t\tif (TxErrorRatio >= TrainDown)\n\t\t\t\t{\n#ifdef TXBF_SUPPORT\n\t\t\t\t\t/* If PER>50% or TP<lastTP/2 then double the TxQuality delay */\n\t\t\t\t\tif ((TxErrorRatio > 50) || (OneSecTxNoRetryOKRationCount < pEntry->LastTxOkCount/2))\n\t\t\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND*2);\n\t\t\t\t\telse\n#endif /* TXBF_SUPPORT */\n\t\t\t\t\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n\n\t\t\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Up) bad tx ok count (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Up) keep rate-up (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t\t\t{\n\t\t\t\t/* Note: AP had \"(TxErrorRatio >= 50) && (TxErrorRatio >= TrainDown)\" */\n\t\t\t\tif ((TxErrorRatio >= 50) || (TxErrorRatio >= TrainDown))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) direct train down (TxErrorRatio >= TrainDown)\\n\"));\n\t\t\t\t}\n\t\t\t\telse if ((pEntry->LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount)\n\t\t\t\t{\n\t\t\t\t\tMlmeRestoreLastRate(pEntry);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) bad tx ok count (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA,(\"   QuickDRS: (Down) keep rate-down (L:%ld, C:%ld)\\n\", pEntry->LastTxOkCount, OneSecTxNoRetryOKRationCount));\n\t\t\t}\n\t\t}while (FALSE);\n\n#ifdef TXBF_SUPPORT\n\t\t/* Remember last good non-BF rate */\n\t\tif (!pEntry->phyETxBf && !pEntry->phyITxBf)\n\t\t\tpEntry->lastNonBfRate = pEntry->CurrTxRateIndex;\n#endif /* TXBF_SUPPORT */\n\n\t\t/* If rate changed then update the history and set the new tx rate */\n\t\tif ((pEntry->CurrTxRateIndex != CurrRateIdx)\n#ifdef TXBF_SUPPORT\n\t\t\t|| (pEntry->phyETxBf!=CurrPhyETxBf) || (pEntry->phyITxBf!=CurrPhyITxBf)\n#endif /* TXBF_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* if rate-up happen, clear all bad history of all TX rates */\n\t\t\tif (pEntry->LastSecTxRateChangeAction == RATE_DOWN)\n\t\t\t{\n\t\t\t\t/* DBGPRINT_RAW(RT_DEBUG_INFO,(\"   QuickDRS: ++TX rate from %d to %d \\n\", CurrRateIdx, pEntry->CurrTxRateIndex)); */\n\n\t\t\t\tpEntry->TxRateUpPenalty = 0;\n\t\t\t\tif (pEntry->CurrTxRateIndex != CurrRateIdx)\n\t\t\t\t\tMlmeClearTxQuality(pEntry);\n\t\t\t}\n\t\t\t/* if rate-down happen, only clear DownRate's bad history */\n\t\t\telse if (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t\t{\n\t\t\t\t/* DBGPRINT_RAW(RT_DEBUG_INFO,(\"   QuickDRS: --TX rate from %d to %d \\n\", CurrRateIdx, pEntry->CurrTxRateIndex)); */\n\n\t\t\t\tpEntry->TxRateUpPenalty = 0;           /* no penalty */\n\t\t\t\tMlmeSetTxQuality(pEntry, pEntry->CurrTxRateIndex, 0);\n\t\t\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t\t\t}\n\n\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t}\n\n\t\t// TODO: should we reset all OneSecTx counters?\n\t\t/* RESET_ONE_SEC_TX_CNT(pEntry); */\n\t}\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\n/*\n\tMlmeOldRateAdapt - perform Rate Adaptation based on PER using old RA algorithm\n\t\tpEntry - the MAC table entry\n\t\tCurrRateIdx - the index of the current rate\n\t\tUpRateIdx, DownRateIdx - UpRate and DownRate index\n\t\tTrainUp, TrainDown - TrainUp and Train Down threhsolds\n\t\tTxErrorRatio - the PER\n\n\t\tOn exit:\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP or RATE_DOWN if there was a change\n\t\t\tpEntry->CurrTxRateIndex = new rate index\n\t\t\tpEntry->TxQuality is updated\n*/\nVOID MlmeOldRateAdapt(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN UCHAR\t\t\tCurrRateIdx,\n\tIN UCHAR\t\t\tUpRateIdx,\n\tIN UCHAR\t\t\tDownRateIdx,\n\tIN ULONG\t\t\tTrainUp,\n\tIN ULONG\t\t\tTrainDown,\n\tIN ULONG\t\t\tTxErrorRatio)\n{\n\tBOOLEAN\tbTrainUp = FALSE;\n#ifdef TXBF_SUPPORT\n\tUCHAR *pTable = pEntry->pTable;\n\tBOOLEAN invertTxBf = FALSE;\n#endif /* TXBF_SUPPORT */\n\n\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\n\tpEntry->CurrTxRateStableTime++;\n\n\t/* Downgrade TX quality if PER >= Rate-Down threshold */\n\tif (TxErrorRatio >= TrainDown)\n\t{\n\t\tMlmeSetTxQuality(pEntry, CurrRateIdx, DRS_TX_QUALITY_WORST_BOUND);\n#ifdef TXBF_SUPPORT\n\t\t/*\n\t\t\tNeed to train down. If BF and last Non-BF isn't too much lower then\n\t\t\tgo to last Non-BF rate. Otherwise just go to the down rate\n\t\t*/\n\t\tif ((pEntry->phyETxBf || pEntry->phyITxBf) &&\n\t\t\t(DownRateIdx - pEntry->lastNonBfRate)<2 \n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& ((pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)==0)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* Go directly to last non-BF rate without 100 msec check */\n\t\t\tpEntry->CurrTxRateIndex = pEntry->lastNonBfRate;\n\t\t\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n\t\t\tMlmeNewTxRate(pAd, pEntry);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO | DBG_FUNC_RA,(\"DRS: --TX rate from %d to %d \\n\", CurrRateIdx, pEntry->CurrTxRateIndex));\n\t\t\treturn;\n\t\t}\n\t\telse\n#endif /* TXBF_SUPPORT */\n\t\tif (CurrRateIdx != DownRateIdx)\n\t\t{\n\t\t\tpEntry->CurrTxRateIndex = DownRateIdx;\n\t\t\tpEntry->LastSecTxRateChangeAction = RATE_DOWN;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* Upgrade TX quality if PER <= Rate-Up threshold */\n\t\tif (TxErrorRatio <= TrainUp)\n\t\t{\n\t\t\tbTrainUp = TRUE;\n\t\t\tMlmeDecTxQuality(pEntry, CurrRateIdx);  /* quality very good in CurrRate */\n\n\t\t\tif (pEntry->TxRateUpPenalty)\n\t\t\t\tpEntry->TxRateUpPenalty --;\n\t\t\telse\n\t\t\t\tMlmeDecTxQuality(pEntry, UpRateIdx);    /* may improve next UP rate's quality */\n\t\t}\n\n\t\tif (bTrainUp)\n\t\t{\n\t\t\t/* Train up if up rate quality is 0 */\n\t\t\tif ((CurrRateIdx != UpRateIdx) && (MlmeGetTxQuality(pEntry, UpRateIdx) <= 0))\n\t\t\t{\n\t\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t}\n#ifdef TXBF_SUPPORT\n\t\t\telse if (((CurrRateIdx != UpRateIdx) || (TxErrorRatio > TrainUp))\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t\t&& ((pAd->CommonCfg.DebugFlags & DBF_NO_BF_AWARE_RA)==0)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t\t{\n\t\t\t\t/* UpRate TxQuality is not 0. Try to invert BF state */\n\t\t\t\tif (pEntry->phyETxBf || pEntry->phyITxBf)\n\t\t\t\t{\n\t\t\t\t\t/* BF tries same MCS, non-BF */\n\t\t\t\t\tif (pEntry->TxQuality[CurrRateIdx])\n\t\t\t\t\t\tpEntry->TxQuality[CurrRateIdx]--;\n\n\t\t\t\t\tif (pEntry->TxQuality[CurrRateIdx]==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tinvertTxBf = TRUE;\n\t\t\t\t\t\tpEntry->CurrTxRateIndex = CurrRateIdx;\n\t\t\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (pEntry->eTxBfEnCond>0 || pEntry->iTxBfEn)\n\t\t\t\t{\n\t\t\t\t\tRTMP_RA_LEGACY_TB *pUpRate = PTX_RA_LEGACY_ENTRY(pTable, UpRateIdx);\n\t\t\t\t\tRTMP_RA_LEGACY_TB *pCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, CurrRateIdx);\n\n\t\t\t\t\t/* First try Up Rate with BF */\n\t\t\t\t\tif ((CurrRateIdx != UpRateIdx) && MlmeTxBfAllowed(pAd, pEntry, pUpRate))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEntry->BfTxQuality[UpRateIdx])\n\t\t\t\t\t\t\tpEntry->BfTxQuality[UpRateIdx]--;\n\n\t\t\t\t\t\tif (pEntry->BfTxQuality[UpRateIdx]==0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinvertTxBf = TRUE;\n\t\t\t\t\t\t\tpEntry->CurrTxRateIndex = UpRateIdx;\n\t\t\t\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Try Same Rate if Up Rate failed */\n\t\t\t\t\tif (pEntry->LastSecTxRateChangeAction==RATE_NO_CHANGE &&\n\t\t\t\t\t\tMlmeTxBfAllowed(pAd, pEntry, pCurrTxRate))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pEntry->BfTxQuality[CurrRateIdx])\n\t\t\t\t\t\t\tpEntry->BfTxQuality[CurrRateIdx]--;\n\n\t\t\t\t\t\tif (pEntry->BfTxQuality[CurrRateIdx]==0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinvertTxBf = TRUE;\n\t\t\t\t\t\t\tpEntry->CurrTxRateIndex = CurrRateIdx;\n\t\t\t\t\t\t\tpEntry->LastSecTxRateChangeAction = RATE_UP;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif /* TXBF_SUPPORT */\n\t\t}\n\t}\n\n\t/* Handle the rate change */\n\tif (pEntry->LastSecTxRateChangeAction != RATE_NO_CHANGE)\n\t{\n\t\tpEntry->CurrTxRateStableTime = 0;\n\t\tpEntry->TxRateUpPenalty = 0;\n\n\t\t/* Save last rate information */\n\t\tpEntry->lastRateIdx = CurrRateIdx;\n#ifdef TXBF_SUPPORT\n\t\tif (pEntry->eTxBfEnCond>0)\n\t\t{\n\t\t\tpEntry->lastRatePhyTxBf = pEntry->phyETxBf;\n\t\t\tpEntry->phyETxBf ^= invertTxBf;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEntry->lastRatePhyTxBf = pEntry->phyITxBf;\n\t\t\tpEntry->phyITxBf ^= invertTxBf;\n\t\t}\n#endif /* TXBF_SUPPORT */\n\n\t\t/* Update TxQuality */\n\t\tif (pEntry->LastSecTxRateChangeAction == RATE_UP)\n\t\t{\n\t\t\t/* Clear history if normal train up */\n\t\t\tif (pEntry->lastRateIdx != pEntry->CurrTxRateIndex)\n\t\t\t\tMlmeClearTxQuality(pEntry);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Clear the down rate history */\n\t\t\tMlmeSetTxQuality(pEntry, pEntry->CurrTxRateIndex, 0);\n\t\t\tpEntry->PER[pEntry->CurrTxRateIndex] = 0;\n\t\t}\n\n\t\t/* Set timer for check in 100 msec */\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n\t\t\tif (!pAd->ApCfg.ApQuickResponeForRateUpTimerRunning)\n\t\t\t{\n\t\t\t\tRTMPSetTimer(&pAd->ApCfg.ApQuickResponeForRateUpTimer, pAd->ra_fast_interval);\n\t\t\t\tpAd->ApCfg.ApQuickResponeForRateUpTimerRunning = TRUE;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n\t\t\tif (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning)\n\t\t\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\tpEntry->bDoRateTune = TRUE;\n#endif /* CONFIG_MULTI_CHANNEL */\t\t\t\n\t\n\t\t\t\tRTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, pAd->ra_fast_interval);\n\t\t\t\tpAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t/* Update PHY rate */\n\t\tMlmeNewTxRate(pAd, pEntry);\n\t}\n}\n"
  },
  {
    "path": "src/rate_ctrl/ra_ctrl.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n#include \"rt_config.h\"\n\n\n\nUCHAR RateSwitchTable11B[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x04, 0x03,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 35, 45,\n    0x03, 0x00,  3, 20, 45,\n};\n\nUCHAR RateSwitchTable11BG[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0a, 0x00,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 35, 45,\n    0x03, 0x00,  3, 20, 45,\n    0x04, 0x10,  2, 20, 35,\n    0x05, 0x10,  3, 16, 35,\n    0x06, 0x10,  4, 10, 25,\n    0x07, 0x10,  5, 16, 25,\n    0x08, 0x10,  6, 10, 25,\n    0x09, 0x10,  7, 10, 13,\n};\n\nUCHAR RateSwitchTable11G[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x08, 0x00,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x10,  0, 20, 101,\n    0x01, 0x10,  1, 20, 35,\n    0x02, 0x10,  2, 20, 35,\n    0x03, 0x10,  3, 16, 35,\n    0x04, 0x10,  4, 10, 25,\n    0x05, 0x10,  5, 16, 25,\n    0x06, 0x10,  6, 10, 25,\n    0x07, 0x10,  7, 10, 13,\n};\n\n\n#ifdef DOT11_N_SUPPORT\nUCHAR RateSwitchTable11N1S[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0c, 0x0a,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 25, 45,\n    0x03, 0x21,  0, 20, 35,\n    0x04, 0x21,  1, 20, 35,\n    0x05, 0x21,  2, 20, 35,\n    0x06, 0x21,  3, 15, 35,\n    0x07, 0x21,  4, 15, 30,\n    0x08, 0x21,  5, 10, 25,\n    0x09, 0x21,  6,  8, 14,\n    0x0a, 0x21,  7,  8, 14,\n    0x0b, 0x23,  7,  8, 14,\n};\n\n\nUCHAR RateSwitchTable11N2S[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0e, 0x0c,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 25, 45,\n    0x03, 0x21,  0, 20, 35,\n    0x04, 0x21,  1, 20, 35,\n    0x05, 0x21,  2, 20, 35,\n    0x06, 0x21,  3, 15, 35,\n    0x07, 0x21,  4, 15, 30,\n    0x08, 0x20, 11, 15, 30,\n    0x09, 0x20, 12, 15, 30,\n    0x0a, 0x20, 13,  8, 20,\n    0x0b, 0x20, 14,  8, 20,\n    0x0c, 0x20, 15,  8, 25,\n    0x0d, 0x22, 15,  8, 15,\n};\n\n\nUCHAR RateSwitchTable11N3S[] = {\n/* Item No.\tMode\tCurr-MCS\tTrainUp\tTrainDown\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x11, 0x0c,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 25, 45,\n    0x03, 0x21,  0, 20, 35,\n    0x04, 0x21,  1, 20, 35,\n    0x05, 0x21,  2, 20, 35,\n    0x06, 0x21,  3, 15, 35,\n    0x07, 0x21,  4, 15, 30,\n    0x08, 0x20, 11, 15, 30,\n    0x09, 0x20, 12, 15, 22,\n    0x0a, 0x20, 13,  8, 20,\n    0x0b, 0x20, 14,  8, 20,\n    0x0c, 0x20, 20,  8, 20,\n    0x0d, 0x20, 21,  8, 20,\n    0x0e, 0x20, 22,  8, 20,\n    0x0f, 0x20, 23,  8, 20,\n    0x10, 0x22, 23,  8, 15,\n};\n\n\nUCHAR RateSwitchTable11BGN1S[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0c, 0x0a,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 25, 45,\n    0x03, 0x21,  0, 20, 35,\n    0x04, 0x21,  1, 20, 35,\n    0x05, 0x21,  2, 20, 35,\n    0x06, 0x21,  3, 15, 35,\n    0x07, 0x21,  4, 15, 30,\n    0x08, 0x21,  5, 10, 25,\n    0x09, 0x21,  6,  8, 14,\n    0x0a, 0x21,  7,  8, 14,\n    0x0b, 0x23,  7,  8, 14,\n};\n\n\nUCHAR RateSwitchTable11BGN2S[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0e, 0x0c,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x00,  0, 40, 101,\n    0x01, 0x00,  1, 40, 50,\n    0x02, 0x00,  2, 25, 45,\n    0x03, 0x21,  0, 20, 35,\n    0x04, 0x21,  1, 20, 35,\n    0x05, 0x21,  2, 20, 35,\n    0x06, 0x21,  3, 15, 35,\n    0x07, 0x21,  4, 15, 30,\n    0x08, 0x20, 11, 15, 30,\n    0x09, 0x20, 12, 15, 22,\n    0x0a, 0x20, 13,  8, 20,\n    0x0b, 0x20, 14,  8, 20,\n    0x0c, 0x20, 15,  8, 20,\n    0x0d, 0x22, 15,  8, 15,\n};\n\n\nUCHAR RateSwitchTable11BGN3S[] = { /* 3*3*/\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0e, 0x00,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x21,  0, 30,101,\t/*50*/\n    0x01, 0x21,  1, 20, 50,\n    0x02, 0x21,  2, 20, 50,\n    0x03, 0x21,  3, 20, 50,\n    0x04, 0x21,  4, 15, 50,\n    0x05, 0x20, 11, 15, 30,\n    0x06, 0x20, 12, 15, 30,\n    0x07, 0x20, 13,  8, 20,\n    0x08, 0x20, 14,  8, 20,\n    0x09, 0x20, 15,  8, 25,\n    /*0x0a, 0x20, 20, 15, 30,*/\n    0x0a, 0x20, 21,  8, 20,\n    0x0b, 0x20, 22,  8, 20,\n    0x0c, 0x20, 23,  8, 25,\n    0x0d, 0x22, 23,  8, 25,\n};\n\n\nUCHAR RateSwitchTable11N1SForABand[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t*/\n/* Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */\n    0x09, 0x07,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association */\n    0x00, 0x21,  0, 30, 101,\n    0x01, 0x21,  1, 20, 50,\n    0x02, 0x21,  2, 20, 50,\n    0x03, 0x21,  3, 15, 50,\n    0x04, 0x21,  4, 15, 30,\n    0x05, 0x21,  5, 10, 25,\n    0x06, 0x21,  6,  8, 14,\n    0x07, 0x21,  7,  8, 14,\n    0x08, 0x23,  7,  8, 14,\n};\n\n\nUCHAR RateSwitchTable11N2SForABand[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0b, 0x09,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x21,  0, 30, 101,\n    0x01, 0x21,  1, 20, 50,\n    0x02, 0x21,  2, 20, 50,\n    0x03, 0x21,  3, 15, 50,\n    0x04, 0x21,  4, 15, 30,\n    0x05, 0x21,  5, 15, 30,\n    0x06, 0x20, 12,  15, 30,\n    0x07, 0x20, 13,  8, 20,\n    0x08, 0x20, 14,  8, 20,\n    0x09, 0x20, 15,  8, 25,\n    0x0a, 0x22, 15,  8, 25,\n};\n\n\nUCHAR RateSwitchTable11BGN2SForABand[] = {\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0b, 0x09,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x21,  0, 30,101,\t/*50*/\n    0x01, 0x21,  1, 20, 50,\n    0x02, 0x21,  2, 20, 50,\n    0x03, 0x21,  3, 15, 50,\n    0x04, 0x21,  4, 15, 30,\n    0x05, 0x21,  5, 15, 30,\n    0x06, 0x20, 12, 15, 30,\n    0x07, 0x20, 13,  8, 20,\n    0x08, 0x20, 14,  8, 20,\n    0x09, 0x20, 15,  8, 25,\n    0x0a, 0x22, 15,  8, 25,\n};\n\n\nUCHAR RateSwitchTable11N3SForABand[] = { /* 3*3*/\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0e, 0x09,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x21,  0, 30, 101,\n    0x01, 0x21,  1, 20, 50,\n    0x02, 0x21,  2, 20, 50,\n    0x03, 0x21,  3, 15, 50,\n    0x04, 0x21,  4, 15, 30,\n    0x05, 0x21,  5, 15, 30,\n    0x06, 0x20, 12,  15, 30,\n    0x07, 0x20, 13,  8, 20,\n    0x08, 0x20, 14,  8, 20,\n    0x09, 0x20, 15,  8, 25,\n    /*0x0a, 0x22, 15,  8, 25,*/\n    /*0x0a, 0x20, 20, 15, 30,*/\n    0x0a, 0x20, 21,  8, 20,\n    0x0b, 0x20, 22,  8, 20,\n    0x0c, 0x20, 23,  8, 25,\n    0x0d, 0x22, 23,  8, 25,\n};\n\n\nUCHAR RateSwitchTable11BGN3SForABand[] = { /* 3*3*/\n/* Item No.   Mode   Curr-MCS   TrainUp   TrainDown\t\t Mode- Bit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)*/\n    0x0e, 0x09,  0,  0,  0,\t\t\t\t\t\t/* Initial used item after association*/\n    0x00, 0x21,  0, 30,101,\t/*50*/\n    0x01, 0x21,  1, 20, 50,\n    0x02, 0x21,  2, 20, 50,\n    0x03, 0x21,  3, 15, 50,\n    0x04, 0x21,  4, 15, 30,\n    0x05, 0x21,  5, 15, 30,\n    0x06, 0x20, 12, 15, 30,\n    0x07, 0x20, 13,  8, 20,\n    0x08, 0x20, 14,  8, 20,\n    0x09, 0x20, 15,  8, 25,\n    /*0x0a, 0x22, 15,  8, 25,*/\n    /*0x0a, 0x20, 20, 15, 30,*/\n    0x0a, 0x20, 21,  8, 20,\n    0x0b, 0x20, 22,  8, 20,\n    0x0c, 0x20, 23,  8, 25,\n    0x0d, 0x22, 23,  8, 25,\n};\n\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\n#ifdef RANGE_EXTEND\n#define SUPPORT_SHORT_GI_RA\t\t/* Support switching to Short GI rates in RA */\n#endif /*  RANGE_EXTEND */\n\n/*\n\tRate switch tables for New Rate Adaptation\n\n\tEach row has 10 bytes of data.\n\tFirst row contains table information:\n\t\tByte0=the number of rate entries, Byte1=the initial rate.\n\tFormat of Mode byte:\n\t\tBit0: STBC, Bit1: Short GI, Bit4~6: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)\n*/\nUCHAR RateSwitchTableAdapt11N1S[] = {\n/*  item no.   mcs   highPERThrd  upMcs3     upMcs1\n           mode   lowPERThrd  downMcs     upMcs2\n*/\n\t 12,   7,  0,  0,   0,   0,    0,     0,   0,   0,\n\t 0, 0x21,  0, 30,  50,  11,    1,     8,   1,   7,/* mcs0 */\n\t 1, 0x21,  1, 20,  50,   0,   16,     9,   2,  13,/* mcs1 */\n\t 2, 0x21,  2, 20,  50,   1,   17,     9,   3,  20,/* mcs2 */\n\t 3, 0x21,  3, 15,  50,   2,   17,    10,   4,  26,/* mcs3 */\n\t 4, 0x21,  4, 15,  30,   3,   18,    11,   5,  39,/* mcs4 */\n\t 5, 0x21,  5, 10,  25,   4,   18,    12,   6,  52,/* mcs5 */\n\t 6, 0x21,  6,  8,  14,   5,   19,    12,   7,  59,/* mcs6 */\n\t 7, 0x21,  7,  8,  14,   6,   19,    12,   8,  65,/* mcs7 */\n\t 8, 0x23,  7,  8,  14,   7,   19,    12,   8,  72,/* mcs7+short gi */\n\n\t 9, 0x00,  0, 40,  101,  9 ,   9,     9,   10,  1, /* cck-1M */\n\t10, 0x00,  1, 40,  50,   9,   10,    10,   11,  2, /* cck-2M */\n\t11, 0x21, 32, 30,  50,  10,    0,     8,    0,  7, /* mcs32 or 20M/mcs0 */\n};\n\n#ifdef SUPPORT_SHORT_GI_RA\n/*  Indices for Short GI rates in 11N2S table */\n  #define sg07\t18\t\t/*  mcs7+shortGI index */\n  #define sg14\t17\t\t/*  mcs14+shortGI index */\n  #define sg15\t16\t\t/*  mcs15+shortGI index */\n#endif\n\nUCHAR RateSwitchTableAdapt11N2S[] = {\n/* item no.   mcs   highPERThrd  upMcs3    upMcs1\n        mode   lowPERThrd  downMcs    upMcs2\n*/\n\t22,   15,  0,  0,   0,   0,    0,   0,   0,   0,\n     0, 0x21,  0, 30,  50,  21,    1,   8,   1,   7,/* mcs0 */\n\t 1, 0x21,  1, 20,  50,   0,   16,   9,   2,  13,/* mcs1 */\n\t 2, 0x21,  2, 20,  50,   1,   17,   9,   3,  20,/* mcs2 */\n\t 3, 0x21,  3, 15,  50,   2,   17,  10,   4,  26,/* mcs3 */\n\t 4, 0x21,  4, 15,  30,   3,   18,  11,   5,  39,/* mcs4 */\n\t 5, 0x21,  5, 10,  25,   4,   18,  12,   6,  52,/* mcs5 */\n\t 6, 0x21,  6,  8,  14,   5,   19,  12,   7,  59,/* mcs6 */\n#ifdef SUPPORT_SHORT_GI_RA\n\t 7, 0x21,  7,  8,  14,   6,   19,  12, sg07,  65,/* mcs7 */\n#else\n\t 7, 0x21,  7,  8,  14,   6,   19,  12,   7,  65,/* mcs7 */\n#endif\n\t 8, 0x20,  8, 30,  50,   0,   16,   9,   2,  13,/* mcs8 */\n\t 9, 0x20,  9, 20,  50,   8,   17,  10,   4,  26,/* mcs9 */\n\t10, 0x20, 10, 20,  40,   9,   18,  11,   5,  39,/* mcs10 */\n\t11, 0x20, 11, 15,  30,  10,   18,  12,   6,  52,/* mcs11 */\n\t12, 0x20, 12, 15,  30,  11,   20,  13,  12,  78,/* mcs12 */\n\t13, 0x20, 13,  8,  20,  12,   20,  14,  13, 104,/* mcs13 */\n#ifdef SUPPORT_SHORT_GI_RA\n\t14, 0x20, 14,  8,  18,  13,   21,  15,sg14, 117,/* mcs14 */\n\t15, 0x20, 15,  8,  25,  14,   21,sg15,sg14, 130,/* mcs15 */\n\t16, 0x22, 15,  8,  25,  15,   21,sg15,sg15, 144,/* mcs15+shortGI */\n\n    17, 0x22, 14,  8,  14,  14,   21,sg15,  15, 130, /* mcs14+shortGI */\n    18, 0x23,  7,  8,  14,   7,   19,  12,sg07,  72, /* mcs7+shortGI */\n#else\n\t14, 0x20, 14,  8,  18,  13,   21,  15,  14, 117,/* mcs14 */\n\t15, 0x20, 15,  8,  25,  14,   21,  16,  15, 130,/* mcs15 */\n\t16, 0x22, 15,  8,  25,  15,   21,  16,  16, 144,/* mcs15+shortGI */\n    17,    0,  0,  0,   0,   0,   0,    0,   0,   0,\n    18,    0,  0,  0,   0,   0,   0,    0,   0,   0,\n#endif\n    19, 0x00,  0, 40,  101, 19 ,  19,    19,   20,  1, /* cck-1M */\n    20, 0x00,  1, 40,  50,  19,   20,    20,   21,  2, /* cck-2M */\n    21, 0x21, 32, 30,  50,  20,   0,     8,    0,   7, /* mcs32 or 20M/mcs0 */\n};\n\n#ifdef SUPPORT_SHORT_GI_RA\n/*  Indices for Short GI rates in 11N3S table */\n  #undef sg07\n  #undef sg14\n  #undef sg15\n  #define sg07\t29\t\t/*  mcs7+shortGI index */\n  #define sg14\t27\t\t/*  mcs14+shortGI index */\n  #define sg15\t28\t\t/*  mcs15+shortGI index */\n  #define sg21\t25\t\t/*  mcs21+shortGI index */\n  #define sg22\t26\t\t/*  mcs22+shortGI index */\n  #define sg23\t24\t\t/*  mcs23+shortGI index */\n#endif\n\nUCHAR RateSwitchTableAdapt11N3S[] = {\n/* item no   mcs   highPERThrd   upMcs3     upMcs1\n        mode   lowPERThrd  downMcs     upMcs2\n*/\n\t33,   23,  0,  0,   0,   0,    0,    0,    0,   0,\n\t 0, 0x21,  0, 30,  50,  32,    1,    8,    1,   7, /* mcs0 */\n     1, 0x21,  1, 20,  50,   0,   16,    9,    2,  13, /* mcs1 */\n     2, 0x21,  2, 20,  50,   1,   17,    9,    3,  20, /* mcs2 */\n     3, 0x21,  3, 15,  50,   2,   17,   10,    4,  26, /* mcs3 */\n     4, 0x21,  4, 15,  30,   3,   18,   11,    5,  39, /* mcs4 */\n     5, 0x21,  5, 10,  25,   4,   18,   12,    6,  52, /* mcs5 */\n     6, 0x21,  6,  8,  14,   5,   19,   12,    7,  59, /* mcs6 */\n#ifdef SUPPORT_SHORT_GI_RA\n\t 7, 0x21,  7,  8,  14,   6,   19,   12, sg07,  65, /* mcs7 */\n#else\n\t 7, 0x21,  7,  8,  14,   6,   19,   12,    7,  65, /* mcs7 */\n#endif\n     8, 0x20,  8, 30,  50,   0,   16,    9,    2,  13, /* mcs8 */\n     9, 0x20,  9, 20,  50,   8,   17,   10,    4,  26, /* mcs9 */\n    10, 0x20, 10, 20,  40,   9,   18,   11,    5,  39, /* mcs10 */\n    11, 0x20, 11, 15,  30,  10,   18,   12,    6,  52, /* mcs11 */\n    12, 0x20, 12, 15,  30,  11,   20,   13,   12,  78, /* mcs12 */\n    13, 0x20, 13,  8,  20,  12,   20,   14,   13, 104, /* mcs13 */\n#ifdef SUPPORT_SHORT_GI_RA\n    14, 0x20, 14,  8,  18,  13,   21,   15, sg14, 117, /* mcs14 */\n    15, 0x20, 15,  8,  14,  14,   21, sg15, sg14, 130, /* mcs15 */\n#else\n    14, 0x20, 14,  8,  18,  13,   21,   15,   14, 117, /* mcs14 */\n    15, 0x20, 15,  8,  14,  14,   21,   15,   15, 130, /* mcs15 */\n#endif\n    16, 0x20, 16, 30,  50,   8,   17,    9,    3,  20, /* mcs16 */\n    17, 0x20, 17, 20,  50,  16,   18,   11,    5,  39, /* mcs17 */\n    18, 0x20, 18, 20,  40,  17,   19,   12,    7,  59, /* mcs18 */\n    19, 0x20, 19, 15,  30,  18,   20,   13,   19,  78, /* mcs19 */\n    20, 0x20, 20, 15,  30,  19,   21,   15,   20, 117, /* mcs20 */\n#ifdef SUPPORT_SHORT_GI_RA\n    21, 0x20, 21,  8,  20,  20,   22, sg21,   21, 156, /* mcs21 */\n    22, 0x20, 22,  8,  20,  21,   23, sg22, sg21, 176, /* mcs22 */\n    23, 0x20, 23,  6,  18,  22, sg23,   23, sg22, 195, /* mcs23 */\n    24, 0x22, 23,  6,  14,  23, sg23, sg23, sg23, 217, /* mcs23+shortGI */\n\n    25, 0x22, 21,  6,  18,  21, sg22,   22, sg21, 173, /* mcs21+shortGI */\n    26, 0x22, 22,  6,  18,  22, sg23,   23, sg22, 195, /* mcs22+shortGI */\n    27, 0x22, 14,  8,  14,  14,   21, sg15,   15, 130, /* mcs14+shortGI */\n    28, 0x22, 15,  8,  14,  15,   21, sg15, sg15, 144, /* mcs15+shortGI */\n    29, 0x23,  7,  8,  14,   7,   19,   12,   29,  72, /* mcs7+shortGI */\n#else\n    21, 0x20, 21,  8,  20,  20,   22,   21,   21, 156, /* mcs21 */\n    22, 0x20, 22,  8,  20,  21,   23,   22,   22, 176, /* mcs22 */\n    23, 0x20, 23,  6,  18,  22,   24,   23,   23, 195, /* mcs23 */\n    24, 0x22, 23,  6,  14,  23,   24,   24,   24, 217, /* mcs23+shortGI */\n    25,    0,  0,  0,   0,   0,   0,     0,    0,   0,\n    26,    0,  0,  0,   0,   0,   0,     0,    0,   0,\n    27,    0,  0,  0,   0,   0,   0,     0,    0,   0,\n    28,    0,  0,  0,   0,   0,   0,     0,    0,   0,\n    29,    0,  0,  0,   0,   0,   0,     0,    0,   0,\n#endif\n    30, 0x00,  0, 40,  101, 30 ,  30,    30,   31,  1, /* cck-1M */\n    31, 0x00,  1, 40,  50,  30,   31,    31,   32,  2, /* cck-2M */\n    32, 0x21, 32, 30,  50,  31,   0,     8,    0,   7, /* mcs32 or 20M/mcs0 */\n};\n\n\n#ifdef DOT11_VHT_AC\n/*\n\tVHT-capable rate table\n\t\n\tEach row has 10 bytes of data.\n\n\t1. First row contains table info, which is initial used item after assoc:\n\t\t\tByte0=the number of rate entries, Byte1=the initial rate.\n\n\t2. rest rows Format:\n\t[Index] [Mode] [nSS] [CurrMCS] [PERThrd Low/High] [downMCS] [upMCS3/2/1]\n\n\t[Mode]: \n\t\tbit0: STBC\n\t\tbit1: Short GI\n\t\tbit2~3: BW - (20M/40M/80M)\n\t\tbit4~bit6: Mode (0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF, 4: VHT) - MODE_XXX\n\t\tbit7: Reserved\n\t[nSS]:\n\t\tNumber of Spatial Stream\n\n\tNote: downMCS, upMCS3, upMCS2 and upMCS1 are zero-based array index.\t\n*/\n/* 1x1 VHT-capable rate table */\nUCHAR RateTableVht1S[] = \n{\n\t9,\t\t8, \t\t0,\t\t0, 0,\t\t\t\t0,\t\t0, 0, 0,\t\t0,\n/*\t[Idx]\t[Mode]\t[MCS]\t[PER_Low/High]\t[dMCS]\t[upMCS3/2/1] [nSS]*/\n\t0,\t\t0x41,\t0,\t\t30, 101,\t\t\t0,\t\t0, 0, 1,\t\t1,\n\t1,\t\t0x41,\t1,\t\t20, 50,\t\t\t0,\t\t0, 0, 2,\t\t1, \n\t2,\t\t0x41,\t2,\t\t20, 50,\t\t\t1,\t\t0, 0, 3, \t\t1,\n\t3,\t\t0x41,\t3,\t\t15, 50,\t\t\t2,\t\t0, 0, 4, \t\t1,\n\t4,\t\t0x41,\t4,\t\t15, 30,\t\t\t3,\t\t0, 0, 5, \t\t1,\n\t5,\t\t0x41,\t5,\t\t10, 25,\t\t\t4,\t\t0, 0, 6, \t\t1,\n\t6,\t\t0x41,\t6,\t\t8, 14,\t\t\t5,\t\t0, 0, 7, \t\t1,\n\t7,\t\t0x41,\t7,\t\t8, 14,\t\t\t6,\t\t0, 0, 8, \t\t1,\n\t8,\t\t0x43,\t7,\t\t8, 14,\t\t\t7,\t\t0, 0, 8, \t\t1,\n};\n\n\n/* 2x2 VHT-capable rate table */\nUCHAR RateTableVht2S[] = \n{\n\t17,\t\t15,\t\t0,\t\t0, 0,\t\t\t\t0,\t\t0, 0, 0,\t\t1,\n/*\t[Idx]\t[Mode]\t[MCS]\t[PER_Low/High]\t[dMCS]\t[upMCS3/2/1] [nSS]*/\n\t0,\t\t0x41,\t0, \t\t30, 101,\t\t\t0,\t\t0, 8,\t1,\t\t1, \n\t1,\t\t0x41,\t1,\t\t20, 50,\t\t\t0,\t\t0, 9,\t2, \t\t1,\n\t2,\t\t0x41,\t2,\t\t20, 50,\t\t\t1,\t\t0, 9,\t3, \t\t1,\n\t3,\t\t0x41,\t3,\t\t15, 50,\t\t\t2,\t\t0, 10, 4, \t\t1,\n\t4,\t\t0x41,\t4,\t\t15, 30,\t\t\t3,\t\t0, 11, 5, \t\t1,\n\t5,\t\t0x41,\t5,\t\t10, 25,\t\t\t4,\t\t0, 12, 6, \t\t1,\n\t6,\t\t0x41,\t6,\t\t8, 14,\t\t\t5,\t\t0, 12, 7, \t\t1,\n\t7,\t\t0x41,\t7,\t\t8, 14,\t\t\t6,\t\t0, 12, 7, \t\t1,\n\t8,\t\t0x40,\t0,\t\t30, 50,\t\t\t0,\t\t0, 9,\t2, \t\t2,\n\t9,\t\t0x40,\t1,\t\t20, 50,\t\t\t8,\t\t0, 10, 4, \t\t2,\n\t10,\t\t0x40,\t2,\t\t20, 50,\t\t\t9,\t\t0, 11, 5, \t\t2,\n\t11,\t\t0x40,\t3,\t\t15, 30,\t\t\t10,\t\t0, 12, 6, \t\t2,\n\t12,\t\t0x40,\t4,\t\t15, 30,\t\t\t11,\t\t0, 13, 12, \t2,\n\t13,\t\t0x40,\t5,\t\t8, 20,\t\t\t12,\t\t0, 14, 13, \t2,\n\t14,\t\t0x40,\t6,\t\t8, 18,\t\t\t13,\t\t0, 15, 14, \t2,\n\t15,\t\t0x40,\t7,\t\t8, 25,\t\t\t14,\t\t0, 16, 15, \t2,\n\t16,\t\t0x42,\t7,\t\t8, 25,\t\t\t15,\t\t0, 16, 16, \t2,\n};\n#endif /* DOT11_VHT_AC */\n#endif /*  NEW_RATE_ADAPT_SUPPORT */\n\n#endif /* DOT11_N_SUPPORT */\n\n\n\n\n/* MlmeGetSupportedMcs - fills in the table of mcs with index into the pTable\n\t\tpAd - pointer to adapter\n\t\tpTable - pointer to the Rate Table. Assumed to be a table without mcsGroup values\n\t\tmcs - table of MCS index into the Rate Table. -1 => not supported\n*/\nVOID MlmeGetSupportedMcs(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\t*pTable,\n\tOUT CHAR \tmcs[])\n{\n\tCHAR\tidx;\n\tRTMP_RA_LEGACY_TB *pCurrTxRate;\n\n\tfor (idx=0; idx<24; idx++)\n\t\tmcs[idx] = -1;\n\n\t/*  check the existence and index of each needed MCS */\n\tfor (idx=0; idx<RATE_TABLE_SIZE(pTable); idx++)\n\t{\n\t\tpCurrTxRate = PTX_RA_LEGACY_ENTRY(pTable, idx);\n\n\t\t/*  Rate Table may contain CCK and MCS rates. Give HT/Legacy priority over CCK */\n\t\tif (pCurrTxRate->CurrMCS==MCS_0 && (mcs[0]==-1 || pCurrTxRate->Mode!=MODE_CCK))\n\t\t\tmcs[0] = idx;\n\t\telse if (pCurrTxRate->CurrMCS==MCS_1 && (mcs[1]==-1 || pCurrTxRate->Mode!=MODE_CCK))\n\t\t\tmcs[1] = idx;\n\t\telse if (pCurrTxRate->CurrMCS==MCS_2 && (mcs[2]==-1 || pCurrTxRate->Mode!=MODE_CCK))\n\t\t\tmcs[2] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_3)\n\t\t\tmcs[3] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_4)\n\t\t\tmcs[4] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_5)\n\t\t\tmcs[5] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_6)\n\t\t\tmcs[6] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_7) && (pCurrTxRate->ShortGI == GI_800))\n\t\t\tmcs[7] = idx;\n#ifdef DOT11_N_SUPPORT\n\t\telse if (pCurrTxRate->CurrMCS == MCS_12)\n\t\t\tmcs[12] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_13)\n\t\t\tmcs[13] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_14)\n\t\t\tmcs[14] = idx;\n\t\telse if ((pCurrTxRate->CurrMCS == MCS_15) && (pCurrTxRate->ShortGI == GI_800))\n\t\t{\n\t\t\tmcs[15] = idx;\n\t\t}\n#ifdef DOT11N_SS3_SUPPORT\n\t\telse if (pCurrTxRate->CurrMCS == MCS_20)\n\t\t\tmcs[20] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_21)\n\t\t\tmcs[21] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_22)\n\t\t\tmcs[22] = idx;\n\t\telse if (pCurrTxRate->CurrMCS == MCS_23)\n\t\t\tmcs[23] = idx;\n#endif /*  DOT11N_SS3_SUPPORT */\n#endif /*  DOT11_N_SUPPORT */\n\t}\n\n#ifdef DBG_CTRL_SUPPORT\n\t/*  Debug Option: Disable highest MCSs when picking initial MCS based on RSSI */\n\tif (pAd->CommonCfg.DebugFlags & DBF_INIT_MCS_DIS1)\n\t\tmcs[23] = mcs[15] = mcs[7] = mcs[22] = mcs[14] = mcs[6] = 0;\n#endif /* DBG_CTRL_SUPPORT */\n}\n\n\n/*  MlmeClearTxQuality - Clear TxQuality history only for the active BF state */\nVOID MlmeClearTxQuality(\n\tIN MAC_TABLE_ENTRY\t*pEntry)\n{\n#ifdef TXBF_SUPPORT\n\tif (pEntry->phyETxBf || pEntry->phyITxBf)\n\t\tNdisZeroMemory(pEntry->BfTxQuality, sizeof(pEntry->BfTxQuality));\n\telse\n#endif /*  TXBF_SUPPORT */\n\t\tNdisZeroMemory(pEntry->TxQuality, sizeof(pEntry->TxQuality));\n\n\tNdisZeroMemory(pEntry->PER, sizeof(pEntry->PER));\n}\n\n\n/*  MlmeClearAllTxQuality - Clear both BF and non-BF TxQuality history */\nVOID MlmeClearAllTxQuality(\n\tIN MAC_TABLE_ENTRY\t*pEntry)\n{\n#ifdef TXBF_SUPPORT\n\tNdisZeroMemory(pEntry->BfTxQuality, sizeof(pEntry->BfTxQuality));\n#endif\n\tNdisZeroMemory(pEntry->TxQuality, sizeof(pEntry->TxQuality));\n\n\tNdisZeroMemory(pEntry->PER, sizeof(pEntry->PER));\n}\n\n\n/*  MlmeDecTxQuality - Decrement TxQuality of specified rate table entry */\nVOID MlmeDecTxQuality(\n\tIN MAC_TABLE_ENTRY\t*pEntry,\n\tIN UCHAR\t\t\trateIndex)\n{\n#ifdef TXBF_SUPPORT\n\tif (pEntry->phyETxBf || pEntry->phyITxBf) {\n\t\tif (pEntry->BfTxQuality[rateIndex])\n\t\t\tpEntry->BfTxQuality[rateIndex]--;\n\t}\n\telse\n#endif /*  TXBF_SUPPORT */\n\tif (pEntry->TxQuality[rateIndex])\n\t\tpEntry->TxQuality[rateIndex]--;\n}\n\n\nVOID MlmeSetTxQuality(\n\tIN MAC_TABLE_ENTRY\t*pEntry,\n\tIN UCHAR\t\t\trateIndex,\n\tIN USHORT\t\t\ttxQuality)\n{\n#ifdef TXBF_SUPPORT\n\tif (pEntry->phyETxBf || pEntry->phyITxBf)\n\t\tpEntry->BfTxQuality[rateIndex] = txQuality;\n\telse\n#endif /*  TXBF_SUPPORT */\n\t\tpEntry->TxQuality[rateIndex] = txQuality;\n}\n\n\nUSHORT MlmeGetTxQuality(\n\tIN MAC_TABLE_ENTRY\t*pEntry,\n\tIN UCHAR\t\t\trateIndex)\n{\n#ifdef TXBF_SUPPORT\n\tif (pEntry->phyETxBf || pEntry->phyITxBf)\n\t\treturn pEntry->BfTxQuality[rateIndex];\n#endif /*  TXBF_SUPPORT */\n\treturn pEntry->TxQuality[rateIndex];\n}\n\n\n#ifdef CONFIG_AP_SUPPORT\nVOID APMlmeSetTxRate(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_LEGACY_TB *pTxRate)\n{\n#ifdef DOT11_N_SUPPORT\n\tif ((pTxRate->STBC) && (pEntry->MaxHTPhyMode.field.STBC))\n\t\tpEntry->HTPhyMode.field.STBC = STBC_USE;\n\telse\n\t\tpEntry->HTPhyMode.field.STBC = STBC_NONE;\n\n\tif (((pTxRate->ShortGI) && (pEntry->MaxHTPhyMode.field.ShortGI))\n         || (pAd->WIFItestbed.bShortGI && pEntry->MaxHTPhyMode.field.ShortGI) )\n\t\tpEntry->HTPhyMode.field.ShortGI = GI_400;\n\telse\n\t\tpEntry->HTPhyMode.field.ShortGI = GI_800;\n#endif /* DOT11_N_SUPPORT */\n\n\tif (pTxRate->CurrMCS < MCS_AUTO)\n\t\tpEntry->HTPhyMode.field.MCS = pTxRate->CurrMCS;\n\n\tpEntry->HTPhyMode.field.MODE = pTxRate->Mode;\n\n#ifdef DOT11_N_SUPPORT\n\tif ((pAd->WIFItestbed.bGreenField & pEntry->HTCapability.HtCapInfo.GF) && (pEntry->HTPhyMode.field.MODE == MODE_HTMIX))\n\t{\n\t\t/* force Tx GreenField */\n\t\tpEntry->HTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t}\n\n\t/* BW depends on BSSWidthTrigger and Negotiated BW */\n\tif (pAd->CommonCfg.bRcvBSSWidthTriggerEvents ||\n\t\t(pEntry->MaxHTPhyMode.field.BW==BW_20) ||\n\t\t(pAd->CommonCfg.BBPCurrentBW==BW_20))\n\t\tpEntry->HTPhyMode.field.BW = BW_20;\n\telse\n\t\tpEntry->HTPhyMode.field.BW = BW_40;\n\n#ifdef DOT11_VHT_AC\n\tif (pAd->CommonCfg.BBPCurrentBW==BW_80 &&\n\t\tpEntry->MaxHTPhyMode.field.BW == BW_80 &&\n\t\tpEntry->MaxHTPhyMode.field.MODE == MODE_VHT)\n\t\tpEntry->HTPhyMode.field.BW = BW_80;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tif (pEntry->pTable == RateTableVht2S)\n\t{\n\t\tRTMP_RA_GRP_TB *pAdaptTbEntry = (RTMP_RA_GRP_TB *)pTxRate;\n\t\tpEntry->HTPhyMode.field.MCS = pAdaptTbEntry->CurrMCS | ((pAdaptTbEntry->dataRate -1) <<4);\n\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\tif (pEntry->pTable == Ags2x2VhtRateTable)\n\t{\n\t\tRTMP_RA_AGS_TB *pAgsTbEntry = (RTMP_RA_AGS_TB *)pTxRate;\n\t\tpEntry->HTPhyMode.field.MCS = pAgsTbEntry->CurrMCS | (pAgsTbEntry->Nss <<4);\n\t}\n#endif /* AGS_SUPPORT */\n#endif /* DOT11_VHT_AC */\n\n#ifdef RANGE_EXTEND\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t/* 20 MHz Fallback */\n\tif (pTxRate->Mode >= MODE_HTMIX &&\n\t    pEntry->HTPhyMode.field.BW == BW_40 &&\n\t    ADAPT_RATE_TABLE(pEntry->pTable))\n\t{\n\t\tif (pEntry->HTPhyMode.field.MCS == 32\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS0) == 0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* Map HT Duplicate to 20MHz MCS0 */\n\t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n\t\t\tpEntry->HTPhyMode.field.MCS = 0;\n\t\t}\n\t\telse if (pEntry->HTPhyMode.field.MCS == 0 &&\n\t\t\t\t(pAd->CommonCfg.DebugFlags & DBF_FORCE_20MHZ) == 0\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS1) == 0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* Map 40MHz MCS0 to 20MHz MCS1 */\n\t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n\t\t\tpEntry->HTPhyMode.field.MCS = 1;\n\t\t}\n\t\telse if (pEntry->HTPhyMode.field.MCS==8\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_ENABLE_20MHZ_MCS8)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n\t\t{\n\t\t\t/* Map 40MHz MCS8 to 20MHz MCS8 */\n\t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n\t\t}\n\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n\t/* Debug Option: Force BW */\n\tif (pAd->CommonCfg.DebugFlags & DBF_FORCE_40MHZ)\n\t{\n\t\tpEntry->HTPhyMode.field.BW = BW_40;\n\t}\n\telse if (pAd->CommonCfg.DebugFlags & DBF_FORCE_20MHZ)\n\t{\n\t\tpEntry->HTPhyMode.field.BW = BW_20;\n\t}\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* RANGE_EXTEND */\n\n\t/* Reexam each bandwidth's SGI support. */\n\tif ((pEntry->HTPhyMode.field.BW==BW_20 && !CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE)) ||\n\t\t(pEntry->HTPhyMode.field.BW==BW_40 && !CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE)) )\n\t\tpEntry->HTPhyMode.field.ShortGI = GI_800;\n\n#ifdef DBG_CTRL_SUPPORT\n\t/* Debug option: Force Short GI */\n\tif (pAd->CommonCfg.DebugFlags & DBF_FORCE_SGI)\n\t\tpEntry->HTPhyMode.field.ShortGI = GI_400;\n#endif /* DBG_CTRL_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\tpAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word);\n\n#ifdef FIFO_EXT_SUPPORT\n\tAsicFifoExtEntryClean(pAd, pEntry);\n#endif /* FIFO_EXT_SUPPORT */\n\n\n\t\n}\n#endif /* CONFIG_AP_SUPPORT */\n\n\n#ifdef CONFIG_STA_SUPPORT\nVOID MlmeSetTxRate(\n\tIN RTMP_ADAPTER *pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RTMP_RA_LEGACY_TB *pTxRate)\n{\n\tUCHAR\tMaxMode = MODE_OFDM;\n\n#ifdef DOT11_N_SUPPORT\n\tMaxMode = MODE_HTGREENFIELD;\n\n#ifdef DOT11_VHT_AC\n\tMaxMode = MODE_VHT;\n#endif /* DOT11_VHT_AC */\n\n\tif (pTxRate->STBC && (pAd->StaCfg.MaxHTPhyMode.field.STBC))\n\t\tpAd->StaCfg.HTPhyMode.field.STBC = STBC_USE;\n\telse\n#endif /*  DOT11_N_SUPPORT */\n\t\tpAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;\n\n\tif (pTxRate->CurrMCS < MCS_AUTO)\n\t\tpAd->StaCfg.HTPhyMode.field.MCS = pTxRate->CurrMCS;\n\n#ifdef DOT11_VHT_AC\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tif (pEntry->pTable == RateTableVht2S)\n\t{\n\t\tRTMP_RA_GRP_TB *pAdaptTbEntry = (RTMP_RA_GRP_TB *)pTxRate;\n\t\tpEntry->HTPhyMode.field.MCS = pAdaptTbEntry->CurrMCS | ((pAdaptTbEntry->dataRate -1) <<4);\n\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\tif (pEntry->pTable == Ags2x2VhtRateTable)\n\t{\n\t\tRTMP_RA_AGS_TB *pAgsTbEntry = (RTMP_RA_AGS_TB *)pTxRate;\n\t\tpEntry->HTPhyMode.field.MCS = pAgsTbEntry->CurrMCS | (pAgsTbEntry->Nss <<4);\n\t}\n#endif /* AGS_SUPPORT */\n#endif /* DOT11_VHT_AC */\n\n\tif (pAd->StaCfg.HTPhyMode.field.MCS > 7)\n\t\tpAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;\n\n   \tif (ADHOC_ON(pAd))\n\t{\n\t\t/*  If peer adhoc is b-only mode, we can't send 11g rate. */\n\t\tpAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;\n\t\tpEntry->HTPhyMode.field.STBC\t= STBC_NONE;\n\n\t\t/* For Adhoc MODE_CCK, driver will use AdhocBOnlyJoined flag to roll back to B only if necessary */\n\t\tpEntry->HTPhyMode.field.MODE\t= pTxRate->Mode;\n\t\tpEntry->HTPhyMode.field.ShortGI = pAd->StaCfg.HTPhyMode.field.ShortGI;\n\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\n\t\t/*  Patch speed error in status page */\n\t\tpAd->StaCfg.HTPhyMode.field.MODE = pEntry->HTPhyMode.field.MODE;\n\t}\n\telse\n    {\n\t\tUSHORT OperationMode =0xffff;\n\n#ifdef DOT11_N_SUPPORT\n        if ((pAd->CommonCfg.RegTransmitSetting.field.HTMODE == HTMODE_GF) &&\n\t\t\t(pAd->MlmeAux.HtCapability.HtCapInfo.GF == HTMODE_GF))\n            pAd->StaCfg.HTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t\telse\n#endif /*  DOT11_N_SUPPORT */\n\t\tif (pTxRate->Mode <= MaxMode)\n\t\t\tpAd->StaCfg.HTPhyMode.field.MODE = pTxRate->Mode;\n\n#ifdef DOT11_N_SUPPORT\n        if (pTxRate->ShortGI && (pAd->StaCfg.MaxHTPhyMode.field.ShortGI))\n\t\t\tpAd->StaCfg.HTPhyMode.field.ShortGI = GI_400;\n\t\telse\n#endif /*  DOT11_N_SUPPORT */\n\t\t\tpAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;\n\n#ifdef DOT11_N_SUPPORT\n\t\t/*  BW depends on Negotiated BW */\n\t\tif (pEntry->MaxHTPhyMode.field.BW==BW_20 || pAd->CommonCfg.BBPCurrentBW==BW_20)\n\t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n\t\telse\n\t\t\tpEntry->HTPhyMode.field.BW = BW_40;\n\n#ifdef DOT11_VHT_AC\n\t\tif (pEntry->MaxHTPhyMode.field.BW==BW_80 || pAd->CommonCfg.BBPCurrentBW==BW_80)\n\t\t\tpEntry->HTPhyMode.field.BW = BW_80;\n#endif /* DOT11_VHT_AC */\n\n#ifdef RANGE_EXTEND\n#ifdef NEW_RATE_ADAPT_SUPPORT\n    \t/*  20 MHz Fallback */\n\t\tif (pTxRate->Mode>=MODE_HTMIX && pEntry->HTPhyMode.field.BW==BW_40 &&\n\t\t\tADAPT_RATE_TABLE(pEntry->pTable)\n\t\t)\n\t{\n    \t\tif ((pAd->StaCfg.HTPhyMode.field.MCS==32)\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS0)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t\t)\n    \t\t{\n    \t\t\t/*  Map HT Duplicate to 20MHz MCS0 */\n    \t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n    \t\t\tpAd->StaCfg.HTPhyMode.field.MCS = 0;\n\t\t\t\tif (pTxRate->STBC && pAd->StaCfg.MaxHTPhyMode.field.STBC)\n\t\t\t\t\tpAd->StaCfg.HTPhyMode.field.STBC = STBC_USE;\n    \t\t}\n    \t\telse if (pAd->StaCfg.HTPhyMode.field.MCS==0\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_20MHZ)==0\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_DISABLE_20MHZ_MCS1)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n    \t\t{\n    \t\t\t/*  Map 40MHz MCS0 to 20MHz MCS1 */\n    \t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n    \t\t\tpAd->StaCfg.HTPhyMode.field.MCS = 1;\n    \t\t}\n    \t\telse if (pAd->StaCfg.HTPhyMode.field.MCS==8\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_ENABLE_20MHZ_MCS8)\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n    \t\t{\n    \t\t\t/*  Map 40MHz MCS8 to 20MHz MCS8 */\n    \t\t\tpEntry->HTPhyMode.field.BW = BW_20;\n    \t\t}\n    \t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef DBG_CTRL_SUPPORT\n    \t/*  Debug Option: Force BW */\n    \tif (pAd->CommonCfg.DebugFlags & DBF_FORCE_40MHZ)\n    \t\tpEntry->HTPhyMode.field.BW = BW_40;\n    \telse if (pAd->CommonCfg.DebugFlags & DBF_FORCE_20MHZ)\n    \t\tpEntry->HTPhyMode.field.BW = BW_20;\n#endif /* DBG_CTRL_SUPPORT */\n#endif /*  RANGE_EXTEND */\n\n\t\t/*  Reexam each bandwidth's SGI support. */\n    \tif ((pEntry->HTPhyMode.field.BW==BW_20 && !CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE)) ||\n    \t\t(pEntry->HTPhyMode.field.BW==BW_40 && !CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE)) )\n    \t\tpAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;\n\n#ifdef DBG_CTRL_SUPPORT\n\t\t/*  Debug option: Force Short GI */\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_FORCE_SGI)\n\t\t\tpAd->StaCfg.HTPhyMode.field.ShortGI = GI_400;\n#endif /*  DBG_CTRL_SUPPORT */\n\n        /*  Turn RTS/CTS rate to 6Mbps. */\n\t\tif (((pEntry->HTPhyMode.field.MCS == 0) && (pAd->StaCfg.HTPhyMode.field.MCS != 0)) ||\n\t\t\t((pEntry->HTPhyMode.field.MCS == 8) && (pAd->StaCfg.HTPhyMode.field.MCS != 8)))\n\t\t{\n\t\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\t\t\tif (pAd->MacTab.fAnyBASession)\n\t\t\t\tOperationMode = HT_FORCERTSCTS;\n\t\t\telse\n\t\t\t\tOperationMode = pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode;\n\t\t}\n\t\telse if ((pEntry->HTPhyMode.field.MCS != 0) && (pAd->StaCfg.HTPhyMode.field.MCS == 0))\n\t\t\tOperationMode = HT_RTSCTS_6M;\n\t\telse if ((pEntry->HTPhyMode.field.MCS != 8) && (pAd->StaCfg.HTPhyMode.field.MCS == 8))\n\t\t\tOperationMode = HT_RTSCTS_6M;\n\n\t\tif (OperationMode != 0xffff)\n\t\t\tAsicUpdateProtect(pAd, OperationMode , ALLN_SETPROTECT, TRUE,\n\t\t\t\t\t\t\t(BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent);\n#endif /* DOT11_N_SUPPORT */\n        \n\t\tpEntry->HTPhyMode.field.STBC\t= pAd->StaCfg.HTPhyMode.field.STBC;\n\t\tpEntry->HTPhyMode.field.ShortGI = pAd->StaCfg.HTPhyMode.field.ShortGI;\n\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\t\tpEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;\n    }\n\n}\n#endif /* CONFIG_STA_SUPPORT */\n\n\nVOID MlmeSelectTxRateTable(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN UCHAR **ppTable,\n\tIN UCHAR *pTableSize,\n\tIN UCHAR *pInitTxRateIdx)\n{\n\tdo\n\t{\n#ifdef DOT11_VHT_AC\n\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t(pEntry->SupportRateMode & SUPPORT_VHT_MODE))\n\t\t{\n\t\t\tINT mcs_idx, ss = 0;\n\t\t\tfor (mcs_idx = 0; mcs_idx < MAX_LEN_OF_VHT_RATES; mcs_idx++)\n\t\t\t{\n\t\t\t\tif (pEntry->SupportVHTMCS[mcs_idx])\n\t\t\t\t{\n\t\t\t\t\tif (mcs_idx <= 7)\n\t\t\t\t\t\tss =1;\n\t\t\t\t\tif (mcs_idx >= 8)\n\t\t\t\t\t\tss = 2;\n\t\t\t\t}\n\t\t\t}\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t{\n\t\t\t\tif (ss == 2)\n\t\t\t\t\t*ppTable = RateTableVht2S;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = RateTableVht1S;\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO | DBG_FUNC_RA, (\"%s(): Select RateTableVht%dS\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, (ss == 2 ? 2 : 1)));\n\t\t\t}\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef AGS_SUPPORT\n\t\t\tif (pAd->rateAlg == RATE_ALG_AGS)\n\t\t\t{\n\t\t\t\tif (ss == 2)\n\t\t\t\t\t*ppTable = Ags2x2VhtRateTable;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = Ags1x1VhtRateTable;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Select Ags%dx%dVhtRateTable\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, (ss == 2 ? 2 : 1), (ss == 2 ? 2 : 1)));\n\t\t\t}\n#endif /* AGS_SUPPORT */\n\t\t\tbreak;\n\t\t}\n#endif /* DOT11_VHT_AC */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif ((pAd->OpMode == OPMODE_STA) && ADHOC_ON(pAd))\n\t\t{\n\t\t\t/* for ADHOC mode */\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && \n\t\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) && \n\t\t\t\t((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))\n\t\t\t{/* 11N 1S Adhoc*/\n\n#ifdef AGS_SUPPORT\n\t\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t\t\t*ppTable = AGS1x1HTRateTable;\n\t\t\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t*ppTable = RateSwitchTable11N1S;\t\t\t\t\n\t\t\t\t\telse\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N1SForABand;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && \n\t\t\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) && \n\t\t\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) &&\n\t\t\t\t\t(((pAd->Antenna.field.TxPath == 3) && (pEntry->HTCapability.MCSSet[2] == 0x00)) || (pAd->Antenna.field.TxPath == 2)))\n\t\t\t{/* 11N 2S Adhoc*/\n#ifdef AGS_SUPPORT\n\t\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t\t{\n\t\t\t\t\t*ppTable = AGS2x2HTRateTable;\n\t\t\t\t}\n\t\t\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n\t\t\t\t\telse\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N2SForABand;\n\t\t\t\t}\n\t\t\t}\n#ifdef AGS_SUPPORT\n\t\t\telse if (SUPPORT_AGS(pAd) && \n\t\t\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) && \n\t\t\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) && \n\t\t\t\t\t(pEntry->HTCapability.MCSSet[2] != 0x00) && \n\t\t\t\t\t(pAd->Antenna.field.TxPath == 3))\n\t\t\t{\n\t\t\t\t*ppTable = AGS3x3HTRateTable;\n\t\t\t}\n#endif /* AGS_SUPPORT */\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tif ((pEntry->RateLen == 4)\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\t&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\t\t)\n\t\t\t\t*ppTable = RateSwitchTable11B;\n\t\t\telse if (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t*ppTable = RateSwitchTable11BG;\n\t\t\telse\n\t\t\t\t*ppTable = RateSwitchTable11G;\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\t/*if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) &&*/\n\t\t/*\t((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))*/\n\t\tif ((pEntry->SupportRateMode & (SUPPORT_OFDM_MODE)) &&\n\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) &&\n\t\t\t((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1)))\n\t\t{/* 11BGN 1S AP*/\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t\t*ppTable = AGS1x1HTRateTable;\n\t\t\telse\n#endif /* AGS_SUPPORT */\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t*ppTable = RateSwitchTableAdapt11N1S;\n\t\t\telse\n#endif\n\t\t\tif ((pAd->LatchRfRegs.Channel <= 14) && (pEntry->SupportRateMode & (SUPPORT_CCK_MODE)))\n\t\t\t\t*ppTable = RateSwitchTable11BGN1S;\t\t\t\n\t\t\telse\n\t\t\t\t*ppTable = RateSwitchTable11N1SForABand;\n\n\t\t\tbreak;\n\t\t}\n\n#ifdef AGS_SUPPORT\n\t\t/* only for station */\n\t\tif (SUPPORT_AGS(pAd) && \n\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) && \n\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) && \n\t\t\t(pEntry->HTCapability.MCSSet[2] != 0x00) && \n\t\t\t(pAd->CommonCfg.TxStream == 3))\n\t\t{/* 11N 3S */\n\t\t\t*ppTable = AGS3x3HTRateTable;\n\t\t\tbreak;\n\t\t}\n#endif /* AGS_SUPPORT */\n\n\t\t/*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) &&*/\n\t\t/*\t(pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2))*/\n\t\tif ((pEntry->SupportRateMode & (SUPPORT_OFDM_MODE)) && \n\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) &&\n\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) && \n\t\t\t(((pAd->Antenna.field.TxPath == 3) && (pEntry->HTCapability.MCSSet[2] == 0x00)) || (pAd->CommonCfg.TxStream == 2)))\n\t\t{/* 11BGN 2S AP*/\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t{\n\t\t\t\t*ppTable = AGS2x2HTRateTable;\n\t\t\t}\n\t\t\telse\n#endif /* AGS_SUPPORT */\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N2S;\n\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\tif ((pAd->LatchRfRegs.Channel <= 14) && (pEntry->SupportRateMode & (SUPPORT_CCK_MODE)))\n\t\t\t\t\t*ppTable = RateSwitchTable11BGN2S;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = RateSwitchTable11BGN2SForABand;\n\n\t\t\tbreak;\n\t\t}\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\tif ((pEntry->SupportRateMode & (SUPPORT_OFDM_MODE)) &&\n\t\t\t(pEntry->HTCapability.MCSSet[0] != 0x00) &&\n\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) &&\n\t\t\t(pEntry->HTCapability.MCSSet[2] != 0x00) &&\n\t\t\t(pAd->CommonCfg.TxStream == 3))\n\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t{\n\t\t\t\t*ppTable = RateSwitchTableAdapt11N3S;\n\t\t\t}\n\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\tif ((pAd->LatchRfRegs.Channel <= 14) && (pEntry->SupportRateMode & (SUPPORT_CCK_MODE)))\n\t\t\t\t*ppTable = RateSwitchTable11N3S;\n\t\t\telse\n\t\t\t\t*ppTable = RateSwitchTable11N3SForABand;\n\n\t\t\tbreak;\n\t\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\t/*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))*/\n\t\tif ((pEntry->HTCapability.MCSSet[0] != 0x00) && \n\t\t\t((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1)))\n\t\t{/* 11N 1S AP*/\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t\t*ppTable = AGS1x1HTRateTable;\n\t\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N1S;\n\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t*ppTable = RateSwitchTable11N1S;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = RateSwitchTable11N1SForABand;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t/*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2))*/\n\t\tif ((pEntry->HTCapability.MCSSet[0] != 0x00) && \n\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) && \n\t\t\t(pAd->CommonCfg.TxStream == 2))\n\t\t{/* 11N 2S AP*/\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd))\n\t\t\t\t*ppTable = AGS2x2HTRateTable;\n\t\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N2S;\n\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = RateSwitchTable11N2SForABand;\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\tif ((pEntry->HTCapability.MCSSet[0] != 0x00) &&\n\t\t\t(pEntry->HTCapability.MCSSet[1] != 0x00) &&\n\t\t\t(pEntry->HTCapability.MCSSet[2] != 0x00) &&\n\t\t\t(pAd->CommonCfg.TxStream == 3))\n\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t*ppTable = RateSwitchTableAdapt11N3S;\n\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t{\n\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t*ppTable = RateSwitchTable11N3S;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = RateSwitchTable11N3SForABand;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* DOT11N_SS3_SUPPORT */\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\tif (pAd->CommonCfg.TxStream == 3)\n\t\t{\n\t\t\tif  (pEntry->HTCapability.MCSSet[0] != 0x00)\n\t\t\t{\n\t\t\t\tif (pEntry->HTCapability.MCSSet[1] == 0x00)\n\t\t\t\t{\t/* Only support 1SS */\n\t\t\t\t\tif (pEntry->RateLen > 0)\n\t\t\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N1S;\n\t\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t\t\tif ((pAd->LatchRfRegs.Channel <= 14) && (pEntry->SupportRateMode & (SUPPORT_CCK_MODE)))\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11N1S;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11N1SForABand;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N1S;\n\t\t\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11N1S;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11N1SForABand;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if (pEntry->HTCapability.MCSSet[2] == 0x00)\n\t\t\t\t{\t/* Only support 2SS */\n\t\t\t\t\tif (pEntry->RateLen > 0)\n\t\t\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N2S;\n\t\t\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t\t\tif ((pAd->LatchRfRegs.Channel <= 14) && (pEntry->SupportRateMode & (SUPPORT_CCK_MODE)))\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11BGN2S;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11BGN2SForABand;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N2S;\n\t\t\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t*ppTable = RateSwitchTable11N2SForABand;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* For 3SS case, we use the new rate table, so don't care it here */\n\t\t\t}\n\t\t}\n#endif /* DOT11N_SS3_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n\t\tif (((pEntry->SupportRateMode == SUPPORT_CCK_MODE) || \n\t\t\tWMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B)) \n#ifdef DOT11_N_SUPPORT\n\t\t/*Iverson mark for Adhoc b mode,sta will use rate 54  Mbps when connect with sta b/g/n mode */\n\t\t/* && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)*/\n#endif /* DOT11_N_SUPPORT */\n\t\t\t)\n\t\t{/* B only AP*/\n\t\t\t*ppTable = RateSwitchTable11B;\t\t\t\n\t\t\tbreak;\n\t\t}\n\n\t\t/*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen > 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))*/\n\t\tif ((pEntry->SupportRateMode & (SUPPORT_CCK_MODE)) &&\n\t\t\t(pEntry->SupportRateMode & (SUPPORT_OFDM_MODE))\n#ifdef DOT11_N_SUPPORT\n\t\t\t&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)\n#endif /* DOT11_N_SUPPORT */\n\t\t\t)\n\t\t{/* B/G  mixed AP*/\n\t\t\t*ppTable = RateSwitchTable11BG;\t\t\t\n\t\t\tbreak;\n\t\t}\n\n\t\t/*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))*/\n\t\tif ((pEntry->SupportRateMode & (SUPPORT_OFDM_MODE)) \n#ifdef DOT11_N_SUPPORT\n\t\t\t&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)\n#endif /* DOT11_N_SUPPORT */\n\t\t\t)\n\t\t{/* G only AP*/\n\t\t\t*ppTable = RateSwitchTable11G;\t\t\t\n\t\t\tbreak;\n\t\t}\n#ifdef DOT11_N_SUPPORT\n#ifdef CONFIG_AP_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t\t{\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tif (pAd->CommonCfg.TxStream >= 3)\n\t\t\t{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t{\n\t\t\t\t\tif (pEntry->HTCapability.MCSSet[2] == 0)\n\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N2S;\n\t\t\t\t\telse\n\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N3S;\n\t\t\t\t}\n\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tif (pEntry->HTCapability.MCSSet[2] == 0)\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n\t\t\t\t\telse\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N3S;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tTemp solution for:\n\t\t\t\t\tEX: when the extend rate only supports 6, 12, 24 in\n\t\t\t\t\tthe association req frame. So the pEntry->RateLen is 7.\n\t\t\t\t*/\n\t\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t\t\t*ppTable = RateSwitchTable11BG;\n\t\t\t\telse\n\t\t\t\t\t*ppTable = RateSwitchTable11G;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t\t{\n#ifdef DOT11_N_SUPPORT\n\t\t\t/*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))*/\n\t\t\tif ((pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0))\n#endif /* DOT11_N_SUPPORT */\n\t\t\t{\t/* Legacy mode*/\n\t\t\t\tif (pAd->CommonCfg.MaxTxRate <= RATE_11)\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11B;\n\t\t\t\t}\n\t\t\t\telse if ((pAd->CommonCfg.MaxTxRate > RATE_11) && (pAd->CommonCfg.MinTxRate > RATE_11))\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11G;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11BG;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n#ifdef DOT11_N_SUPPORT\n#ifdef AGS_SUPPORT\n\t\t\tif (SUPPORT_AGS(pAd) && (pAd->CommonCfg.TxStream == 3))\n\t\t\t\t*ppTable = AGS3x3HTRateTable;\n\t\t\telse\n#endif /* AGS_SUPPORT */\n\t\t\t{\n\t\t\tif (pAd->LatchRfRegs.Channel <= 14)\n\t\t\t{\n\t\t\t\tif (pAd->CommonCfg.TxStream == 1)\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11N1S;\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"DRS: unkown mode,default use 11N 1S AP \\n\"));\n\t\t\t\t}\n\t\t\t\telse if (pAd->CommonCfg.TxStream == 2)\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"DRS: unkown mode,default use 11N 2S AP \\n\"));\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n#ifdef DOT11N_SS3_SUPPORT\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N3S;\n\t\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N3S;\n\n#else\n\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pAd->CommonCfg.TxStream == 1)\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11N1S;\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"DRS: unkown mode,default use 11N 1S AP \\n\"));\n\t\t\t\t}\n\t\t\t\telse if (pAd->CommonCfg.TxStream == 2)\n\t\t\t\t{\n\t\t\t\t\t*ppTable = RateSwitchTable11N2S;\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"DRS: unkown mode,default use 11N 2S AP \\n\"));\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n#ifdef DOT11N_SS3_SUPPORT\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t\t\tif (pAd->rateAlg == RATE_ALG_GRP)\n\t\t\t\t\t\t*ppTable = RateSwitchTableAdapt11N3S;\n\t\t\t\t\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t\t\t\t\t*ppTable = RateSwitchTable11N3S;\n#else\n\t\t\t\t\t*ppTable = RateSwitchTable11N2SForABand;\n#endif /* DOT11N_SS3_SUPPORT */\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"DRS: unkown mode (SupRateLen=%d, ExtRateLen=%d, MCSSet[0]=0x%x, MCSSet[1]=0x%x)\\n\",\n\t\t\t\t\t\tpAd->StaActive.SupRateLen,\n\t\t\t\t\t\tpAd->StaActive.ExtRateLen,\n\t\t\t\t\t\tpAd->StaActive.SupportedPhyInfo.MCSSet[0],\n\t\t\t\t\t\tpAd->StaActive.SupportedPhyInfo.MCSSet[1]));\n\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t} while(FALSE);\n\n\t*pTableSize = RATE_TABLE_SIZE(*ppTable);\n\t*pInitTxRateIdx = RATE_TABLE_INIT_INDEX(*ppTable);\n\n}\n\n\n\n/*\n\tMlmeSelectTxRate - select the MCS based on the RSSI and the available MCSs\n\t\tpAd - pointer to adapter\n\t\tpEntry - pointer to MAC table entry\n\t\tmcs - table of MCS index into the Rate Table. -1 => not supported\n\t\tRssi - the Rssi value\n\t\tRssiOffset - offset to apply to the Rssi\n*/\nUCHAR MlmeSelectTxRate(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN CHAR\t\tmcs[],\n\tIN CHAR\t\tRssi,\n\tIN CHAR\t\tRssiOffset)\n{\n\tUCHAR TxRateIdx = 0;\n\tUCHAR *pTable = pEntry->pTable;\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11_VHT_AC\n\tif (pTable == RateTableVht2S)\n\t{\n\t\t/*  VHT mode with 2SS */\n\t\tif (mcs[15]>=0 && (Rssi >= (-70+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_15]))\n\t\t\tTxRateIdx = mcs[15];\n\t\telse if (mcs[14]>=0 && (Rssi >= (-72+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_14]))\n\t\t\tTxRateIdx = mcs[14];\n\t\telse if (mcs[13]>=0 && (Rssi >= (-76+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_13]))\n\t\t\tTxRateIdx = mcs[13];\n\t\telse if (mcs[12]>=0 && (Rssi >= (-78+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_12]))\n\t\t\tTxRateIdx = mcs[12];\n\t\telse if (mcs[4]>=0 && (Rssi >= (-82+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_4]))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[3]>=0 && (Rssi >= (-84+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_3]))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi >= (-86+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_2]))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi >= (-88+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_1]))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\telse if (pTable == RateTableVht1S)\n\t{\t/*  VHT mode with 1SS */\n\t\tif (mcs[7]>=0 && (Rssi > (-72+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_7]))\n\t\t\tTxRateIdx = mcs[7];\n\t\telse if (mcs[6]>=0 && (Rssi > (-74+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_6]))\n\t\t\tTxRateIdx = mcs[6];\n\t\telse if (mcs[5]>=0 && (Rssi > (-77+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_5]))\n\t\t\tTxRateIdx = mcs[5];\n\t\telse if (mcs[4]>=0 && (Rssi > (-79+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_4]))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[3]>=0 && (Rssi > (-81+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_3]))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi > (-83+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_2]))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi > (-86+RssiOffset)) && (pEntry->SupportVHTMCS[MCS_1]))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\telse\n#endif /* DOT11_VHT_AC */\n#ifdef DOT11N_SS3_SUPPORT\n\tif ((pTable == RateSwitchTable11BGN3S) || (pTable == RateSwitchTable11N3S) || (pTable == RateSwitchTable11BGN3SForABand)\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t|| (pTable == RateSwitchTableAdapt11N3S)\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t)\n\t{/*  N mode with 3 stream */\n\t\tif (mcs[23]>=0 && (Rssi >= (-66+RssiOffset)) && (pEntry->SupportHTMCS[MCS_23]))\n\t\t\tTxRateIdx = mcs[23];\n\t\telse if (mcs[22]>=0 && (Rssi >= (-70+RssiOffset)) && (pEntry->SupportHTMCS[MCS_22]))\n\t\t\tTxRateIdx = mcs[22];\n\t\telse if (mcs[21]>=0 && (Rssi >= (-72+RssiOffset)) && (pEntry->SupportHTMCS[MCS_21]))\n\t\t\tTxRateIdx = mcs[21];\n\t\telse if (mcs[20]>=0 && (Rssi >= (-74+RssiOffset)) && (pEntry->SupportHTMCS[MCS_20]))\n\t\t\tTxRateIdx = mcs[20];\n\t\telse if (mcs[13]>=0 && (Rssi >= (-76+RssiOffset)) && (pEntry->SupportHTMCS[MCS_13]))\n\t\t\tTxRateIdx = mcs[13];\n\t\telse if (mcs[12]>=0 && (Rssi >= (-78+RssiOffset)) && (pEntry->SupportHTMCS[MCS_12]))\n\t\t\tTxRateIdx = mcs[12];\n\t\telse if (mcs[4]>=0 && (Rssi >= (-82+RssiOffset)) && (pEntry->SupportHTMCS[MCS_4]))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[3]>=0 && (Rssi >= (-84+RssiOffset)) && (pEntry->SupportHTMCS[MCS_3]))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi >= (-86+RssiOffset)) && (pEntry->SupportHTMCS[MCS_2]))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi >= (-88+RssiOffset)) && (pEntry->SupportHTMCS[MCS_1]))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\telse\n#endif /*  DOT11N_SS3_SUPPORT */\n\tif ((pTable == RateSwitchTable11BGN2S) || (pTable == RateSwitchTable11BGN2SForABand) ||\n\t\t(pTable == RateSwitchTable11N2S) || (pTable == RateSwitchTable11N2SForABand)\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t|| (pTable == RateSwitchTableAdapt11N2S)\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t)\n\t{/*  N mode with 2 stream */\n\t\tif (mcs[15]>=0 && (Rssi >= (-70+RssiOffset)) && (pEntry->SupportHTMCS[MCS_15]))\n\t\t\tTxRateIdx = mcs[15];\n\t\telse if (mcs[14]>=0 && (Rssi >= (-72+RssiOffset)) && (pEntry->SupportHTMCS[MCS_14]))\n\t\t\tTxRateIdx = mcs[14];\n\t\telse if (mcs[13]>=0 && (Rssi >= (-76+RssiOffset)) && (pEntry->SupportHTMCS[MCS_13]))\n\t\t\tTxRateIdx = mcs[13];\n\t\telse if (mcs[12]>=0 && (Rssi >= (-78+RssiOffset)) && (pEntry->SupportHTMCS[MCS_12]))\n\t\t\tTxRateIdx = mcs[12];\n\t\telse if (mcs[4]>=0 && (Rssi >= (-82+RssiOffset)) && (pEntry->SupportHTMCS[MCS_4]))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[3]>=0 && (Rssi >= (-84+RssiOffset)) && (pEntry->SupportHTMCS[MCS_3]))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi >= (-86+RssiOffset)) && (pEntry->SupportHTMCS[MCS_2]))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi >= (-88+RssiOffset)) && (pEntry->SupportHTMCS[MCS_1]))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\telse if ((pTable == RateSwitchTable11BGN1S) ||\n\t\t\t (pTable == RateSwitchTable11N1S) ||\n\t\t\t (pTable == RateSwitchTable11N1SForABand)\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t\t|| (pTable == RateSwitchTableAdapt11N1S)\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t)\n\t{/*  N mode with 1 stream */\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd))\n\t\t{\t\t\n\t\t\t//printk(\"RSSI=%d\\n\", Rssi);\n\t\t\tif (mcs[7]>=0 && (Rssi > (-64+RssiOffset)) && (pEntry->SupportHTMCS[MCS_7]))\n\t\t\t\tTxRateIdx = mcs[7];\n\t\t\telse if (mcs[6]>=0 && (Rssi > (-66+RssiOffset)) && (pEntry->SupportHTMCS[MCS_6]))\n\t\t\t\tTxRateIdx = mcs[6];\n\t\t\telse if (mcs[5]>=0 && (Rssi > (-70+RssiOffset)) && (pEntry->SupportHTMCS[MCS_5]))\n\t\t\t\tTxRateIdx = mcs[5];\n\t\t\telse if (mcs[4]>=0 && (Rssi > (-73+RssiOffset)) && (pEntry->SupportHTMCS[MCS_4]))\n\t\t\t\tTxRateIdx = mcs[4];\n\t\t\telse if (mcs[3]>=0 && (Rssi > (-77+RssiOffset)) && (pEntry->SupportHTMCS[MCS_3]))\n\t\t\t\tTxRateIdx = mcs[3];\n\t\t\telse if (mcs[2]>=0 && (Rssi > (-79+RssiOffset)) && (pEntry->SupportHTMCS[MCS_2]))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1]>=0 && (Rssi > (-81+RssiOffset)) && (pEntry->SupportHTMCS[MCS_1]))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse if (mcs[1]>=0 && (Rssi > (-83+RssiOffset)) && (pEntry->SupportHTMCS[MCS_0]))\n\t\t\t\tTxRateIdx = mcs[0];\n#ifdef CONFIG_STA_SUPPORT\n\t\t\telse \n\t\t\t{\n\t\t\t\tif ( (mcs[0] > 1 ) && pEntry->SupportCCKMCS[MCS_1] )\n\t\t\t\t\tTxRateIdx=1;\n\t\t\t\telse\n\t\t\t\t\tTxRateIdx = mcs[0];\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\n\t\t\t//printk(\"TxRateIdx = %d\\n\", TxRateIdx);\n\t\t} \n\t\telse\n#endif /* MT7601 */\n\t\t{\n\t\t\tif (mcs[7]>=0 && (Rssi > (-72+RssiOffset)) && (pEntry->SupportHTMCS[MCS_7]))\n\t\t\t\tTxRateIdx = mcs[7];\n\t\t\telse if (mcs[6]>=0 && (Rssi > (-74+RssiOffset)) && (pEntry->SupportHTMCS[MCS_6]))\n\t\t\t\tTxRateIdx = mcs[6];\n\t\t\telse if (mcs[5]>=0 && (Rssi > (-77+RssiOffset)) && (pEntry->SupportHTMCS[MCS_5]))\n\t\t\t\tTxRateIdx = mcs[5];\n\t\t\telse if (mcs[4]>=0 && (Rssi > (-79+RssiOffset)) && (pEntry->SupportHTMCS[MCS_4]))\n\t\t\t\tTxRateIdx = mcs[4];\n\t\t\telse if (mcs[3]>=0 && (Rssi > (-81+RssiOffset)) && (pEntry->SupportHTMCS[MCS_3]))\n\t\t\t\tTxRateIdx = mcs[3];\n\t\t\telse if (mcs[2]>=0 && (Rssi > (-83+RssiOffset)) && (pEntry->SupportHTMCS[MCS_2]))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1]>=0 && (Rssi > (-86+RssiOffset)) && (pEntry->SupportHTMCS[MCS_1]))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse\n\t\t\t\tTxRateIdx = mcs[0];\n\t\t}\n\t}\n\telse\n#endif /*  DOT11_N_SUPPORT */\n\t{/*  Legacy mode */\n\t\tif (mcs[7]>=0 && (Rssi > -70) && (pEntry->SupportOFDMMCS[MCS_7]))\n\t\tTxRateIdx = mcs[7];\n\t\telse if (mcs[6]>=0 && (Rssi > -74) && (pEntry->SupportOFDMMCS[MCS_7]))\n\t\t\tTxRateIdx = mcs[6];\n\t\telse if (mcs[5]>=0 && (Rssi > -78) && (pEntry->SupportOFDMMCS[MCS_7]))\n\t\t\tTxRateIdx = mcs[5];\n\t\telse if (mcs[4]>=0 && (Rssi > -82) && (pEntry->SupportOFDMMCS[MCS_7]))\n\t\t\tTxRateIdx = mcs[4];\n\t\telse if (mcs[4] == -1)\t\t\t\t\t\t\t/*  for B-only mode */\n\t\t{\n\t\t\tif (mcs[3]>=0 && (Rssi > -85) && (pEntry->SupportCCKMCS[MCS_3]))\n\t\t\t\tTxRateIdx = mcs[3];\n\t\t\telse if (mcs[2]>=0 && (Rssi > -87) && (pEntry->SupportCCKMCS[MCS_2]))\n\t\t\t\tTxRateIdx = mcs[2];\n\t\t\telse if (mcs[1]>=0 && (Rssi > -90) && (pEntry->SupportCCKMCS[MCS_1]))\n\t\t\t\tTxRateIdx = mcs[1];\n\t\t\telse if (pEntry->SupportCCKMCS[MCS_0])\n\t\t\t\tTxRateIdx = mcs[0];\n\t\t\telse\n\t\t\tTxRateIdx = mcs[3];\n\t\t}\n\t\telse if (mcs[3]>=0 && (Rssi > -85) && (pEntry->SupportOFDMMCS[MCS_3]))\n\t\t\tTxRateIdx = mcs[3];\n\t\telse if (mcs[2]>=0 && (Rssi > -87) && (pEntry->SupportOFDMMCS[MCS_2]))\n\t\t\tTxRateIdx = mcs[2];\n\t\telse if (mcs[1]>=0 && (Rssi > -90) && (pEntry->SupportOFDMMCS[MCS_1]))\n\t\t\tTxRateIdx = mcs[1];\n\t\telse\n\t\t\tTxRateIdx = mcs[0];\n\t}\n\n\n\treturn TxRateIdx;\n}\n\n\n/*  MlmeRAInit - Initialize Rate Adaptation for this entry */\nVOID MlmeRAInit(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)\n{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tMlmeSetMcsGroup(pAd, pEntry);\n\n\tpEntry->lastRateIdx = 1;\n\tpEntry->lowTrafficCount = 0;\n\tpEntry->perThrdAdj = PER_THRD_ADJ;\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\tpEntry->phyETxBf = pEntry->phyITxBf = FALSE;\n\tpEntry->lastRatePhyTxBf = FALSE;\n\tpEntry->lastNonBfRate = 0;\n#endif /* TXBF_SUPPORT */\n\n\tpEntry->fLastSecAccordingRSSI = FALSE;\n\tpEntry->LastSecTxRateChangeAction = RATE_NO_CHANGE;\n\tpEntry->CurrTxRateIndex = 0;\n\tpEntry->CurrTxRateStableTime = 0;\n\tpEntry->TxRateUpPenalty = 0;\n\n\tMlmeClearAllTxQuality(pEntry);\n}\n\n\n/* #define TIMESTAMP_RA_LOG\t*/ /* Include timestamp in RA Log */\n\n/*\n\tMlmeRALog - Prints concise Rate Adaptation log entry\n\t\tThe BF percentage counters are also updated\n*/\nVOID MlmeRALog(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN RA_LOG_TYPE\t\traLogType,\n\tIN ULONG\t\t\tTxErrorRatio,\n\tIN ULONG\t\t\tTxTotalCnt)\n{\n#ifdef TXBF_SUPPORT\n\tUINT ETxCount = pEntry->TxBFCounters.ETxSuccessCount + pEntry->TxBFCounters.ETxFailCount;\n\tUINT ITxCount = pEntry->TxBFCounters.ITxSuccessCount + pEntry->TxBFCounters.ITxFailCount;\n\tUINT TxCount = pEntry->TxBFCounters.TxSuccessCount + pEntry->TxBFCounters.TxFailCount + ETxCount + ITxCount;\n\tULONG bfRatio = 0;\n#endif /*  TXBF_SUPPORT */\n#ifdef TIMESTAMP_RA_LOG\n\tULONG newTime;\n\tstatic ULONG saveRATime;\n\tstruct timeval tval;\n\n\tdo_gettimeofday(&tval);\n\tnewTime = (tval.tv_sec*1000000L + tval.tv_usec);\n#endif\n\n\tif (TxTotalCnt !=0 || raLogType==RAL_QUICK_DRS\n#ifdef DBG_CTRL_SUPPORT\n\t\t|| (pAd->CommonCfg.DebugFlags & DBF_SHOW_ZERO_RA_LOG)\n#endif /* DBG_CTRL_SUPPORT */\n\t)\n\t{\n\t\tBOOLEAN stbc, csd=FALSE;\n\t\tULONG tp;\n\n\t\t/*  Get STBC and StreamMode state */\n\t\tstbc = (pEntry->HTPhyMode.field.STBC && pEntry->HTPhyMode.field.MCS<8);\n\n#ifdef STREAM_MODE_SUPPORT\n\t\tif (pEntry->StreamModeMACReg != 0)\n\t\t{\n\t\t\tULONG streamWord;\n\n\t\t\tRTMP_IO_READ32(pAd, pEntry->StreamModeMACReg+4, &streamWord);\n\t\t\tif (pEntry->HTPhyMode.field.MCS < 8)\n\t\t\t\tcsd = (streamWord & 0x30000)==0x30000;\n\t\t\telse if (pEntry->HTPhyMode.field.MCS < 16)\n\t\t\t\tcsd = (streamWord & 0xC0000)==0xC0000;\n\t\t}\n#endif /* STREAM_MODE_SUPPORT */\n\n\t\t/*  Normalized throughput - packets per RA Interval */\n\t\tif (raLogType==RAL_QUICK_DRS)\n\t\t\ttp = (100-TxErrorRatio)*TxTotalCnt*RA_INTERVAL/(100*pAd->ra_fast_interval);\n\t\telse if (pEntry->LastSecTxRateChangeAction==RATE_NO_CHANGE\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_FORCE_QUICK_DRS)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t\ttp = (100-TxErrorRatio)*TxTotalCnt/100;\n\t\telse\n\t\t\ttp = (100-TxErrorRatio)*TxTotalCnt*RA_INTERVAL/(100*(RA_INTERVAL-pAd->ra_fast_interval));\n\n#ifdef TXBF_SUPPORT\n\t\t/*  Compute BF ratio in the last interval */\n\t\tif ((TxCount - pEntry->LastTxCount)>0)\n\t\t{\n\t\t\tif (pEntry->HTPhyMode.field.eTxBF)\n\t\t\t\tbfRatio = 100*(ETxCount-pEntry->LastETxCount)/(TxCount - pEntry->LastTxCount);\n\t\t\telse if (pEntry->HTPhyMode.field.iTxBF)\n\t\t\t\tbfRatio = 100*(ITxCount-pEntry->LastITxCount)/(TxCount - pEntry->LastTxCount);\n\t\t}\n\n\t\tif ((pEntry->HTPhyMode.field.eTxBF || pEntry->HTPhyMode.field.iTxBF)\n#ifdef DBG_CTRL_SUPPORT\n\t\t\t&& (pAd->CommonCfg.DebugFlags & DBF_DBQ_RA_LOG)==0\n#endif /* DBG_CTRL_SUPPORT */\n\t\t)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"%s[%d]: M=%d %c%c%c%c%c PER=%ld%% TP=%ld BF=%ld%% \",\n\t\t\t\traLogType==RAL_QUICK_DRS? \" Q\": (raLogType==RAL_NEW_DRS? \"\\nRA\": \"\\nra\"),\n\t\t\t\tpEntry->Aid, pEntry->HTPhyMode.field.MCS,\n\t\t\t\tpEntry->HTPhyMode.field.MODE==MODE_CCK? 'C': (pEntry->HTPhyMode.field.ShortGI? 'S': 'L'),\n\t\t\t\tpEntry->HTPhyMode.field.BW? '4': '2',\n\t\t\t\tstbc? 'S': 's',\n\t\t\t\tcsd? 'C': 'c',\n\t\t\t\tpEntry->HTPhyMode.field.eTxBF? 'E': (pEntry->HTPhyMode.field.iTxBF? 'I': '-'),\n\t\t\t\tTxErrorRatio, tp, bfRatio) );\n\t\t}\n\t\telse\n#endif /* TXBF_SUPPORT */\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_RA_LOG)\n\t\t{\n\t\t\tstruct {\n\t\t\t\tUSHORT phyMode;\n\t\t\t\tUSHORT per;\n\t\t\t\tUSHORT tp;\n\t\t\t\tUSHORT bfRatio;\n\t\t\t} raLogInfo;\n\n\t\t\traLogInfo.phyMode = pEntry->HTPhyMode.word;\n\t\t\traLogInfo.per = TxErrorRatio;\n\t\t\traLogInfo.tp = tp;\n#ifdef TXBF_SUPPORT\n\t\t\traLogInfo.bfRatio = bfRatio;\n#endif /* TXBF_SUPPORT */\n\t\t\tdbQueueEnqueue(0x7e, (UCHAR *)&raLogInfo);\n\t\t}\n\t\telse\n#endif /*  INCLUDE_DEBUG_QUEUE */\n#endif /*  DBG_CTRL_SUPPORT */\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_ERROR,(\"%s[%d]: M=%d %c%c%c%c- PER=%ld%% TP=%ld \",\n\t\t\t\traLogType==RAL_QUICK_DRS? \" Q\": (raLogType==RAL_NEW_DRS? \"\\nRA\": \"\\nra\"),\n\t\t\t\tpEntry->Aid, pEntry->HTPhyMode.field.MCS,\n\t\t\t\tpEntry->HTPhyMode.field.MODE==MODE_CCK? 'C': (pEntry->HTPhyMode.field.ShortGI? 'S': 'L'),\n\t\t\t\tpEntry->HTPhyMode.field.BW? '4': '2',\n\t\t\t\tstbc? 'S': 's',\n\t\t\t\tcsd? 'C': 'c',\n\t\t\t\tTxErrorRatio, tp) );\n\t\t}\n\t}\n\n#ifdef TXBF_SUPPORT\n\t/*  Remember previous counts */\n\tpEntry->LastETxCount = ETxCount;\n\tpEntry->LastITxCount = ITxCount;\n\tpEntry->LastTxCount = TxCount;\n#endif /*  TXBF_SUPPORT */\n#ifdef TIMESTAMP_RA_LOG\n\tsaveRATime = newTime;\n#endif\n}\n\n\n/*  MlmeRestoreLastRate - restore last saved rate */\nVOID MlmeRestoreLastRate(\n\tIN PMAC_TABLE_ENTRY\tpEntry)\n{\n\tpEntry->CurrTxRateIndex = pEntry->lastRateIdx;\n#ifdef TXBF_SUPPORT\n\tif (pEntry->eTxBfEnCond>0)\n\t\tpEntry->phyETxBf = pEntry->lastRatePhyTxBf;\n\telse\n\t\tpEntry->phyITxBf = pEntry->lastRatePhyTxBf;\n#endif /*  TXBF_SUPPORT */\n}\n\n\n#ifdef DOT11N_SS3_SUPPORT\n/*  MlmeCheckRDG - check if RDG should be enabled or disabled */\nVOID MlmeCheckRDG(\n\tIN PRTMP_ADAPTER \tpAd,\n\tIN PMAC_TABLE_ENTRY\tpEntry)\n{\n\tPUCHAR pTable = pEntry->pTable;\n\n\t/*  Turn off RDG when 3s and rx count > tx count*5 */\n\tif (((pTable == RateSwitchTable11BGN3S) || \n\t\t(pTable == RateSwitchTable11BGN3SForABand) || \n\t\t(pTable == RateSwitchTable11N3S)\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\t|| (pTable == RateSwitchTableAdapt11N3S)\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\t) && pAd->RalinkCounters.OneSecReceivedByteCount > 50000 &&\n\t\tpAd->RalinkCounters.OneSecTransmittedByteCount > 50000 &&\n\t\tCLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE))\n\t{\n\t\tTX_LINK_CFG_STRUC\tTxLinkCfg;\n\t\tULONG\t\t\t\tTxOpThres;\n\t\tUCHAR\t\t\t\tTableStep;\n\t\tRTMP_RA_LEGACY_TB *pTempTxRate;\n\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t\tTableStep = ADAPT_RATE_TABLE(pTable)? 10: 5;\n#else\n\t\tTableStep = 5;\n#endif\n\n\t\tpTempTxRate = (RTMP_RA_LEGACY_TB *)(&pTable[(pEntry->CurrTxRateIndex + 1)*TableStep]);\n\t\tRTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);\n\n\t\tif (pAd->RalinkCounters.OneSecReceivedByteCount > (pAd->RalinkCounters.OneSecTransmittedByteCount * 5) &&\n\t\t\t\tpTempTxRate->CurrMCS != 23 && pTempTxRate->ShortGI != 1)\n\t\t{\n\t\t\tif (TxLinkCfg.field.TxRDGEn == 1)\n\t\t\t{\n\t\t\t\tTxLinkCfg.field.TxRDGEn = 0;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\t\t\t\tRTMP_IO_READ32(pAd, TXOP_THRES_CFG, &TxOpThres);\n\t\t\t\tTxOpThres |= 0xff00;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TXOP_THRES_CFG, TxOpThres);\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN,(\"DRS: RDG off!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (TxLinkCfg.field.TxRDGEn == 0)\n\t\t\t{\n\t\t\t\tTxLinkCfg.field.TxRDGEn = 1;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);\n\t\t\t\tRTMP_IO_READ32(pAd, TXOP_THRES_CFG, &TxOpThres);\n\t\t\t\tTxOpThres &= 0xffff00ff;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TXOP_THRES_CFG, TxOpThres);\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN,(\"DRS: RDG on!\\n\"));\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /*  DOT11N_SS3_SUPPORT */\n\n\n#ifdef TXBF_SUPPORT\nVOID txbf_rate_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)\n{\n\tRTMP_RA_LEGACY_TB *pNextTxRate;\n\tUCHAR *pTable = pEntry->pTable;\n\n\n\t/*  Get pointer to CurrTxRate entry */\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tif (ADAPT_RATE_TABLE(pTable))\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *)PTX_RA_GRP_ENTRY(pTable, pEntry->CurrTxRateIndex);\n\telse\n#endif /*  NEW_RATE_ADAPT_SUPPORT */\n\t\tpNextTxRate = PTX_RA_LEGACY_ENTRY(pTable, pEntry->CurrTxRateIndex);\n\n\t\t/*  If BF has been disabled then force a non-BF rate */\n\t\tif (pEntry->eTxBfEnCond==0)\n\t\t\tpEntry->phyETxBf = 0;\n\n\t\tif (pEntry->iTxBfEn==0)\n\t\t\tpEntry->phyITxBf = 0;\n\n\n\t   \t/*  Set BF options */\n\t\tpEntry->HTPhyMode.field.eTxBF = pEntry->phyETxBf;\n\t\tpEntry->HTPhyMode.field.iTxBF = pEntry->phyITxBf;\n\n\t\t/*  Give ETxBF priority over ITxBF */\n\t\tif (pEntry->HTPhyMode.field.eTxBF)\n\t\t\tpEntry->HTPhyMode.field.iTxBF = 0;\n\n\t\t/*  In ITxBF mode force GI if we have no choice */\n\t\tif (pEntry->HTPhyMode.field.iTxBF &&\n\t\t\t(pEntry->OneSecRxLGICount + pEntry->OneSecRxSGICount) > 10)\n\t\t{\n\t\t\tif (pEntry->OneSecRxSGICount==0)\n\t\t\t\tpEntry->HTPhyMode.field.ShortGI = GI_800;\n\n\t\t\tif (pEntry->OneSecRxLGICount==0)\n\t\t\t{\n\t\t\t\tif ((pEntry->HTPhyMode.field.BW==BW_20 && CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE)) ||\n\t\t\t    \t(pEntry->HTPhyMode.field.BW==BW_40 && CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE)))\n\t\t\t\t\t\tpEntry->HTPhyMode.field.ShortGI = GI_400;\n\t\t\t}\n\t\t}\n\n\t\t/*  Disable STBC if BF is enabled */\n\t\tif (pEntry->HTPhyMode.field.eTxBF || pEntry->HTPhyMode.field.iTxBF)\n\t\t\tpEntry->HTPhyMode.field.STBC = STBC_NONE;\n\t}\n#endif /* TXBF_SUPPORT */\n\n\nINT rtmp_get_rate_from_rate_tb(UCHAR *table, INT idx, RTMP_TX_RATE *tx_rate)\n{\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tif (ADAPT_RATE_TABLE(table)) {\n\t\tRTMP_RA_GRP_TB *rate_entry;\n\n\t\trate_entry = PTX_RA_GRP_ENTRY(table, idx);\n\t\ttx_rate->mode = rate_entry->Mode;\n\t\ttx_rate->bw = rate_entry->BW;\n\t\ttx_rate->mcs = rate_entry->CurrMCS;\n\t\ttx_rate->sgi = rate_entry->ShortGI;\n\t\ttx_rate->stbc = rate_entry->STBC;\n#ifdef DOT11_VHT_AC\n\t\tif (table == RateTableVht1S || table == RateTableVht2S)\n\t\t\ttx_rate->nss = rate_entry->dataRate;\n\t\telse\n#endif /* DOT11_VHT_AC */\n\t\t\ttx_rate->nss = 0;\n\t}\n\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t{\n\t\tRTMP_RA_LEGACY_TB *rate_entry;\n\n\t\trate_entry = PTX_RA_LEGACY_ENTRY(table, idx);\n\t\ttx_rate->mode = rate_entry->Mode;\n\t\ttx_rate->bw = rate_entry->BW;\n\t\ttx_rate->mcs = rate_entry->CurrMCS;\n\t\ttx_rate->sgi = rate_entry->ShortGI;\n\t\ttx_rate->stbc = rate_entry->STBC;\n\t\ttx_rate->nss = 0;\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n\tMlmeNewTxRate - called when a new TX rate was selected. Sets TX PHY to\n\t\trate selected by pEntry->CurrTxRateIndex in pTable;\n*/\nVOID MlmeNewTxRate(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)\n{\n\tRTMP_RA_LEGACY_TB *pNextTxRate;\n\tUCHAR *pTable = pEntry->pTable;\n\tRTMP_TX_RATE tx_rate;\n\n\n\trtmp_get_rate_from_rate_tb(pEntry->pTable, pEntry->CurrTxRateIndex, &tx_rate);\n\t/*  Get pointer to CurrTxRate entry */\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\tif (ADAPT_RATE_TABLE(pTable))\n\t\tpNextTxRate = (RTMP_RA_LEGACY_TB *)PTX_RA_GRP_ENTRY(pTable, pEntry->CurrTxRateIndex);\n\telse\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\t\tpNextTxRate = PTX_RA_LEGACY_ENTRY(pTable, pEntry->CurrTxRateIndex);\n\n\t/*  Set new rate */\n#ifdef CONFIG_AP_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n\t{\n\t\tAPMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\t}\n#endif /*  CONFIG_AP_SUPPORT */\n#ifdef CONFIG_STA_SUPPORT\n\tIF_DEV_CONFIG_OPMODE_ON_STA(pAd)\n\t{\n\t\tMlmeSetTxRate(pAd, pEntry, pNextTxRate);\n\t}\n#endif /*  CONFIG_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t/*  Disable invalid HT Duplicate modes to prevent PHY error */\n\tif (pEntry->HTPhyMode.field.MCS==32)\n\t{\n\t\tif ((pEntry->HTPhyMode.field.BW!=BW_40) && (pEntry->HTPhyMode.field.BW!=BW_80))\n\t\t\tpEntry->HTPhyMode.field.MCS = 0;\n\t\telse\n\t\t\tpEntry->HTPhyMode.field.STBC = 0;\n\t}\n#endif /*  DOT11_N_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\ttxbf_rate_adjust(pAd, pEntry);\n#endif /*  TXBF_SUPPORT */\n\n\tpAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word);\n\n#ifdef STREAM_MODE_SUPPORT\n\t/*  Enable/disable stream mode based on MCS */\n\tif (pAd->CommonCfg.StreamMode!=0 &&\n\t\tpEntry->StreamModeMACReg!=0)\n\t{\n\t\tUINT streamWord;\n\t\tBOOLEAN mcsDisable;\n\n\t\t/* OFDM: depends on StreamModeMCS, CCK: always applies stream-mode */\n\t\tmcsDisable = (pEntry->HTPhyMode.field.MCS < 16) &&\n\t\t\t\t(pAd->CommonCfg.StreamModeMCS & (1<<pEntry->HTPhyMode.field.MCS))==0 &&\n\t\t\t\t(pEntry->HTPhyMode.field.MODE != MODE_CCK);\n\n\t\tstreamWord = mcsDisable ? 0 : StreamModeRegVal(pAd);\n\n\t\t/*  Update Stream Mode control reg */\n\t\tRTMP_IO_WRITE32(pAd, pEntry->StreamModeMACReg+4, streamWord | (ULONG)(pEntry->Addr[4]) | (ULONG)(pEntry->Addr[5] << 8));\n\t}\n#endif /* STREAM_MODE_SUPPORT */\n}\n\n\nVOID RTMPSetSupportMCS(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR OpMode,\n\tIN PMAC_TABLE_ENTRY\tpEntry,\n\tIN UCHAR SupRate[],\n\tIN UCHAR SupRateLen,\n\tIN UCHAR ExtRate[],\n\tIN UCHAR ExtRateLen,\n#ifdef DOT11_VHT_AC\n\tIN UCHAR vht_cap_len,\n\tIN VHT_CAP_IE *vht_cap,\n#endif /* DOT11_VHT_AC */\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR HtCapabilityLen)\n{\n\tUCHAR idx, SupportedRatesLen = 0;\n\tUCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES];\n\n\tif (SupRateLen > 0)\n\t{\n\t\tif (SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t{\n\t\t\tNdisMoveMemory(SupportedRates, SupRate, SupRateLen);\n\t\t\tSupportedRatesLen = SupRateLen;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUCHAR RateDefault[8] = {0x82, 0x84, 0x8b, 0x96, 0x12, 0x24, 0x48, 0x6c};\n\t\t\t\n\t\t\tNdisMoveMemory(SupportedRates, RateDefault, 8);\n\t\t\tSupportedRatesLen = 8;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%s():wrong SUPP RATES., Len=%d\\n\",\n\t\t\t\t\t\t\t__FUNCTION__, SupRateLen));\n\t\t}\n\t}\n\n\tif (ExtRateLen > 0)\n\t{\n\t\tif ((SupRateLen + ExtRateLen) <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t{\n\t\t\tNdisMoveMemory(&SupportedRates[SupRateLen], ExtRate, ExtRateLen);\n\t\t\tSupportedRatesLen += ExtRateLen;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNdisMoveMemory(&SupportedRates[SupRateLen], ExtRate, MAX_LEN_OF_SUPPORTED_RATES - ExtRateLen);\n\t\t\tSupportedRatesLen = MAX_LEN_OF_SUPPORTED_RATES;\n\n\t\t}\n\t}\n\n\t/* Clear Supported MCS Table */\n\tNdisZeroMemory(pEntry->SupportCCKMCS, MAX_LEN_OF_CCK_RATES);\n\tNdisZeroMemory(pEntry->SupportOFDMMCS, MAX_LEN_OF_OFDM_RATES);\n\tNdisZeroMemory(pEntry->SupportHTMCS, MAX_LEN_OF_HT_RATES);\n#ifdef DOT11_VHT_AC\n\tNdisZeroMemory(pEntry->SupportVHTMCS, MAX_LEN_OF_VHT_RATES);\n#endif /* DOT11_VHT_AC */\n\n\tpEntry->SupportRateMode = 0;\n\n\tfor(idx = 0; idx < SupportedRatesLen; idx ++)\n\t{\n\t\tswitch((SupportedRates[idx] & 0x7F)*5)\n\t\t{\n\t\t\tcase 10:\n\t\t\t\tpEntry->SupportCCKMCS[MCS_0] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_CCK_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 20:\n\t\t\t\tpEntry->SupportCCKMCS[MCS_1] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_CCK_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 55:\n\t\t\t\tpEntry->SupportCCKMCS[MCS_2] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_CCK_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 110:\n\t\t\t\tpEntry->SupportCCKMCS[MCS_3] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_CCK_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 60:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_0] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 90:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_1] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 120:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_2] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 180:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_3] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 240:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_4] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 360:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_5] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 480:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_6] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\n\t\t\tcase 540:\n\t\t\t\tpEntry->SupportOFDMMCS[MCS_7] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_OFDM_MODE;\n\t\t\t\tbreak;\n\t\t}\t\n\t}\n\n\tif (HtCapabilityLen)\n\t{\n\t\tRT_PHY_INFO *pDesired_ht_phy = NULL;\n\t\tUCHAR j, bitmask;\n\t\tCHAR i;\n\n#ifdef CONFIG_STA_SUPPORT\n\t\tif (OpMode == OPMODE_STA)\n\t\t\tpDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;\n#endif /* CONFIG_STA_SUPPORT */\n\n#ifdef CONFIG_AP_SUPPORT\n\t\tif (OpMode == OPMODE_AP)\n\t\t{\n#ifdef APCLI_SUPPORT\n\t\t\tif (IS_ENTRY_APCLI(pEntry))\n\t\t\t\tpDesired_ht_phy = &pAd->ApCfg.ApCliTab[pEntry->apidx].DesiredHtPhyInfo;\n\t\t\telse\n#endif /* APCLI_SUPPORT */\n\t\t\t\tpDesired_ht_phy = &pAd->ApCfg.MBSSID[pEntry->apidx].DesiredHtPhyInfo;\n\t\t}\n#endif /* CONFIG_AP_SUPPORT */\n\n\t\tif (pDesired_ht_phy == NULL)\n\t\t\treturn;\n\n\t\tfor (i = 23; i >= 0; i--)\n\t\t{\n\t\t\tj = i / 8;\n\t\t\tbitmask = (1 << (i - (j * 8)));\n\n\t\t\tif ((pDesired_ht_phy->MCSSet[j] & bitmask)\n\t\t\t\t&& (pHtCapability->MCSSet[j] & bitmask))\n\t\t\t{\n\t\t\t\tpEntry->SupportHTMCS[i] = TRUE;\n\t\t\t\tpEntry->SupportRateMode |= SUPPORT_HT_MODE;\n\t\t\t}\n\t\t}\n\n#ifdef DOT11_VHT_AC\n\t\tif ((vht_cap_len > 0)&& (vht_cap != NULL) && pDesired_ht_phy->vht_bw == VHT_BW_80)\n\t\t{\n\t\t\t/* Currently we only support for MCS0~MCS7, so don't check mcs_map */\n\t\t\tNdisZeroMemory(&pEntry->SupportVHTMCS[0], sizeof(pEntry->SupportVHTMCS));\n\t\t\tswitch (pAd->CommonCfg.TxStream)\n\t\t\t{\n\t\t\t\tcase 2:\n\t\t\t\t\tif (vht_cap->mcs_set.rx_mcs_map.mcs_ss2 < VHT_MCS_CAP_NA)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 8; i < MAX_LEN_OF_VHT_RATES; i++)\n\t\t\t\t\t\t\tpEntry->SupportVHTMCS[i] = TRUE;\n\t\t\t\t\t\tpEntry->SupportRateMode |= SUPPORT_VHT_MODE;\n\t\t\t\t\t}\n\t\t\t\tcase 1:\n\t\t\t\t\tif (vht_cap->mcs_set.rx_mcs_map.mcs_ss1 < VHT_MCS_CAP_NA)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i = 0; i <= 7; i++)\n\t\t\t\t\t\t\tpEntry->SupportVHTMCS[i] = TRUE;\n\t\t\t\t\t\tpEntry->SupportRateMode |= SUPPORT_VHT_MODE;\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t}\n}\n\nINT\tSet_RateAlg_Proc(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd,\n\tIN\tPSTRING\t\t\t\t\targ)\n{\n\tUINT32 ra_alg;\n\n\tra_alg = simple_strtol(arg, 0, 10);\n\n\tif ((ra_alg < RATE_ALG_MAX_NUM) && (ra_alg != pAd->rateAlg))\n\t{\n\t\tUINT32 IdEntry;\n\n\t\tpAd->rateAlg = ra_alg;\n\t\tfor(IdEntry = 0; IdEntry < MAX_LEN_OF_MAC_TABLE; IdEntry++)\n\t\t\tpAd->MacTab.Content[IdEntry].rateAlg = ra_alg;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Set Alg = %d\\n\", __FUNCTION__, ra_alg));\n\treturn TRUE;\n}\n\n\n"
  },
  {
    "path": "src/sta/assoc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tassoc.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn\t\t2004-9-3\t\tporting from RT2500\n*/\n#include \"rt_config.h\"\n\nUCHAR CipherWpaTemplate[] = {\n\t0xdd,\t\t\t/* WPA IE */\n\t0x16,\t\t\t/* Length */\n\t0x00, 0x50, 0xf2, 0x01,\t/* oui */\n\t0x01, 0x00,\t\t/* Version */\n\t0x00, 0x50, 0xf2, 0x02,\t/* Multicast */\n\t0x01, 0x00,\t\t/* Number of unicast */\n\t0x00, 0x50, 0xf2, 0x02,\t/* unicast */\n\t0x01, 0x00,\t\t/* number of authentication method */\n\t0x00, 0x50, 0xf2, 0x01\t/* authentication */\n};\n\nUCHAR CipherWpa2Template[] = {\n\t0x30,\t\t\t/* RSN IE */\n\t0x14,\t\t\t/* Length */\n\t0x01, 0x00,\t\t/* Version */\n\t0x00, 0x0f, 0xac, 0x02,\t/* group cipher, TKIP */\n\t0x01, 0x00,\t\t/* number of pairwise */\n\t0x00, 0x0f, 0xac, 0x02,\t/* unicast */\n\t0x01, 0x00,\t\t/* number of authentication method */\n\t0x00, 0x0f, 0xac, 0x02,\t/* authentication */\n\t0x00, 0x00,\t\t/* RSN capability */\n};\n\n/*  \n\t==========================================================================\n\tDescription: \n\t\tassociation state machine init, including state transition and timer init\n\tParameters: \n\t\tS - pointer to the association state machine\n\n\tIRQL = PASSIVE_LEVEL\n\t\n\t==========================================================================\n */\nVOID AssocStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *S,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(S, Trans, MAX_ASSOC_STATE, MAX_ASSOC_MSG,\n\t\t\t (STATE_MACHINE_FUNC) Drop, ASSOC_IDLE,\n\t\t\t ASSOC_MACHINE_BASE);\n\n\t/* first column */\n\tStateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_ASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) MlmeAssocReqAction);\n\tStateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_REASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) MlmeReassocReqAction);\n\tStateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) MlmeDisassocReqAction);\n\tStateMachineSetAction(S, ASSOC_IDLE, MT2_PEER_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDisassocAction);\n\n\t/* second column */\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC)\n\t\t\t      InvalidStateWhenDisassociate);\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDisassocAction);\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP,\n\t\t\t      (STATE_MACHINE_FUNC) PeerAssocRspAction);\n\t/* */\n\t/* Patch 3Com AP MOde:3CRWE454G72 */\n\t/* We send Assoc request frame to this AP, it always send Reassoc Rsp not Associate Rsp. */\n\t/* */\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP,\n\t\t\t      (STATE_MACHINE_FUNC) PeerAssocRspAction);\n\tStateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_ASSOC_TIMEOUT,\n\t\t\t      (STATE_MACHINE_FUNC) AssocTimeoutAction);\n\n\t/* third column */\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC)\n\t\t\t      InvalidStateWhenDisassociate);\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDisassocAction);\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP,\n\t\t\t      (STATE_MACHINE_FUNC) PeerReassocRspAction);\n\t/* */\n\t/* Patch, AP doesn't send Reassociate Rsp frame to Station. */\n\t/* */\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP,\n\t\t\t      (STATE_MACHINE_FUNC) PeerReassocRspAction);\n\tStateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_REASSOC_TIMEOUT,\n\t\t\t      (STATE_MACHINE_FUNC) ReassocTimeoutAction);\n\n\t/* fourth column */\n\tStateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);\n\tStateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);\n\tStateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC)\n\t\t\t      InvalidStateWhenDisassociate);\n\tStateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDisassocAction);\n\tStateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_DISASSOC_TIMEOUT,\n\t\t\t      (STATE_MACHINE_FUNC) DisassocTimeoutAction);\n\n\t/* initialize the timer */\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.AssocTimer,\n\t\t      GET_TIMER_FUNCTION(AssocTimeout), pAd, FALSE);\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.ReassocTimer,\n\t\t      GET_TIMER_FUNCTION(ReassocTimeout), pAd, FALSE);\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.DisassocTimer,\n\t\t      GET_TIMER_FUNCTION(DisassocTimeout), pAd, FALSE);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tAssociation timeout procedure. After association timeout, this function \n\t\twill be called and it will put a message into the MLME queue\n\tParameters:\n\t\tStandard timer parameters\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AssocTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;\n\n\t/* Do nothing if the driver is starting halt state. */\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn;\n\n\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_ASSOC_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tReassociation timeout procedure. After reassociation timeout, this \n\t\tfunction will be called and put a message into the MLME queue\n\tParameters:\n\t\tStandard timer parameters\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID ReassocTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;\n\n\t/* Do nothing if the driver is starting halt state. */\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn;\n\n\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_REASSOC_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tDisassociation timeout procedure. After disassociation timeout, this \n\t\tfunction will be called and put a message into the MLME queue\n\tParameters:\n\t\tStandard timer parameters\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID DisassocTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;\n\n\t/* Do nothing if the driver is starting halt state. */\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn;\n\n\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_DISASSOC_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tmlme assoc req handling procedure\n\tParameters:\n\t\tAdapter - Adapter pointer\n\t\tElem - MLME Queue Element\n\tPre:\n\t\tthe station has been authenticated and the following information is stored in the config\n\t\t\t-# SSID\n\t\t\t-# supported rates and their length\n\t\t\t-# listen interval (Adapter->StaCfg.default_listen_count)\n\t\t\t-# Transmit power  (Adapter->StaCfg.tx_power)\n\tPost  :\n\t\t-# An association request frame is generated and sent to the air\n\t\t-# Association timer starts\n\t\t-# Association state -> ASSOC_WAIT_RSP\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID MlmeAssocReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR ApAddr[6];\n\tHEADER_802_11 AssocHdr;\n\tUCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};\n\tUSHORT ListenIntv;\n\tULONG Timeout;\n\tUSHORT CapabilityInfo;\n\tBOOLEAN TimerCancelled;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tULONG tmp;\n\tUSHORT VarIesOffset = 0;\n\tUSHORT Status;\n\n\t/* Block all authentication request durning WPA block period */\n\tif (pAd->StaCfg.bBlockAssoc == TRUE) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - Block Assoc request durning WPA block period!\\n\"));\n\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\tStatus = MLME_STATE_MACHINE_REJECT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2,\n\t\t\t    &Status, 0);\n\t}\n\t/* check sanity first */\n\telse if (MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv))\n\t{\n\t\t/*for dhcp,issue ,wpa_supplicant ioctl too fast , at link_up, it will add key before driver remove key  */\n\t\tRTMPWPARemoveAllKeys(pAd);\n\n\t\tRTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);\n\t\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr);\n\n\t\t/* Get an unused nonpaged memory */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"ASSOC - MlmeAssocReqAction() allocate memory failed \\n\"));\n\t\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\t\tStatus = MLME_FAIL_NO_RESOURCE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,\n\t\t\t\t    MT2_ASSOC_CONF, 2, &Status, 0);\n\t\t\treturn;\n\t\t}\n\n\t\t/* Add by James 03/06/27 */\n\t\tpAd->StaCfg.AssocInfo.Length =\n\t\t    sizeof (NDIS_802_11_ASSOCIATION_INFORMATION);\n\t\t/* Association don't need to report MAC address */\n\t\tpAd->StaCfg.AssocInfo.AvailableRequestFixedIEs =\n\t\t    NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_LISTENINTERVAL;\n\t\tpAd->StaCfg.AssocInfo.RequestFixedIEs.Capabilities = CapabilityInfo;\n\t\tpAd->StaCfg.AssocInfo.RequestFixedIEs.ListenInterval = ListenIntv;\n\t\t/* Only reassociate need this */\n\t\t/*COPY_MAC_ADDR(pAd->StaCfg.AssocInfo.RequestFixedIEs.CurrentAPAddress, ApAddr); */\n\t\tpAd->StaCfg.AssocInfo.OffsetRequestIEs = sizeof (NDIS_802_11_ASSOCIATION_INFORMATION);\n\n\t\tNdisZeroMemory(pAd->StaCfg.ReqVarIEs, MAX_VIE_LEN);\n\t\t/* First add SSID */\n\t\tVarIesOffset = 0;\n\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SsidIe, 1);\n\t\tVarIesOffset += 1;\n\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SsidLen, 1);\n\t\tVarIesOffset += 1;\n\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);\n\t\tVarIesOffset += pAd->MlmeAux.SsidLen;\n\n\t\t/* Second add Supported rates */\n\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SupRateIe, 1);\n\t\tVarIesOffset += 1;\n\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SupRateLen, 1);\n\t\tVarIesOffset += 1;\n\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen);\n\t\tVarIesOffset += pAd->MlmeAux.SupRateLen;\n\t\t/* End Add by James */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - Send ASSOC request...\\n\"));\n\t\tMgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tApAddr);\n\n\t\t/* Build basic frame first */\n\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t  sizeof (HEADER_802_11), &AssocHdr,\n\t\t\t\t  2, &CapabilityInfo,\n\t\t\t\t  2, &ListenIntv,\n\t\t\t\t  1, &SsidIe,\n\t\t\t\t  1, &pAd->MlmeAux.SsidLen,\n\t\t\t\t  pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid,\n\t\t\t\t  1, &SupRateIe,\n\t\t\t\t  1, &pAd->MlmeAux.SupRateLen,\n\t\t\t\t  pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,\n\t\t\t\t  END_OF_ARGS);\n\n\t\tif (pAd->MlmeAux.ExtRateLen != 0) {\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  1, &ExtRateIe,\n\t\t\t\t\t  1, &pAd->MlmeAux.ExtRateLen,\n\t\t\t\t\t  pAd->MlmeAux.ExtRateLen,\n\t\t\t\t\t  pAd->MlmeAux.ExtRate, END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t/* HT */\n\t\tif ((pAd->MlmeAux.HtCapabilityLen > 0)\n\t\t    && WMODE_CAP_N(pAd->CommonCfg.PhyMode)) {\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR HtLen, BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 };\n\t\t\tPHT_CAPABILITY_IE pHtCapability;\n#ifdef RT_BIG_ENDIAN\n\t\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\t\tNdisZeroMemory(&HtCapabilityTmp, sizeof (HT_CAPABILITY_IE));\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, pAd->MlmeAux.HtCapabilityLen);\n\t\t\t*(USHORT *) (&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.HtCapInfo));\n\t\t\t*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo));\n\t\t\tpHtCapability = &HtCapabilityTmp;\n#else\n\t\t\tpHtCapability = &pAd->MlmeAux.HtCapability;\n#endif\n\n\t\t\tif (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) {\n\t\t\t\tHtLen = SIZE_HT_CAP_IE + 4;\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 1, &WpaIe, 1, &HtLen,\n\t\t\t\t\t\t  4, &BROADCOM[0],\n\t\t\t\t\t\t  pAd->MlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t  pHtCapability, END_OF_ARGS);\n\t\t\t} else {\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 1, &HtCapIe, 1,\n\t\t\t\t\t\t  &pAd->MlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t  pAd->MlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t  pHtCapability, END_OF_ARGS);\n\t\t\t}\n\t\t\tFrameLen += TmpLen;\n\n#ifdef DOT11_VHT_AC\n\t\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t(pAd->MlmeAux.Channel > 14) &&\n\t\t\t\t(pAd->MlmeAux.vht_cap_len)\n\t\t\t)\n\t\t\t{\n\t\t\t\tFrameLen += build_vht_ies(pAd, (UCHAR *)(pOutBuffer + FrameLen), SUBTYPE_ASSOC_REQ);\n\t\t\t}\n#endif /* DOT11_VHT_AC */\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#if defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT)\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\tEXT_CAP_INFO_ELEMENT extCapInfo;\n\t\t\tUCHAR extInfoLen;\n\n\t\t\textInfoLen = sizeof (EXT_CAP_INFO_ELEMENT);\n\t\t\tNdisZeroMemory(&extCapInfo, extInfoLen);\n\n#ifdef DOT11N_DRAFT3\n\t\t\tif ((pAd->CommonCfg.bBssCoexEnable == TRUE) &&\n\t\t\t    WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n\t\t\t    && (pAd->CommonCfg.Channel <= 14)\n\t\t\t    ) {\n\t\t\t\textCapInfo.BssCoexistMgmtSupport = 1;\n\t\t\t}\n#endif /* DOT11N_DRAFT3 */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tif (IS_TDLS_SUPPORT(pAd))\n\t\t\t{\n\t\t\t\textCapInfo.UAPSDBufSTASupport = 1;\n\n\t\t\t\tif (pAd->StaCfg.TdlsInfo.TdlsChSwitchSupp)\n\t\t\t\t\textCapInfo.TDLSChSwitchSupport = 1;\n\t\t\t\telse\n\t\t\t\t\textCapInfo.TDLSChSwitchSupport = 0;\n\n\t\t\t\textCapInfo.TDLSSupport = 1;\n\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen,\n\t\t\t\t\t  1, &ExtCapIe,\n\t\t\t\t\t  1, &extInfoLen,\n\t\t\t\t\textInfoLen,\t\t\t&extCapInfo,\n\t\t\t\t\tEND_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif /* defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT) */\n\n\t\t/* add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION */\n\t\t/* Case I: (Aggregation + Piggy-Back) */\n\t\t/* 1. user enable aggregation, AND */\n\t\t/* 2. Mac support piggy-back */\n\t\t/* 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON */\n\t\t/* Case II: (Aggregation) */\n\t\t/* 1. user enable aggregation, AND */\n\t\t/* 2. AP annouces it's AGGREGATION-capable in BEACON */\n\t\tif (pAd->CommonCfg.bAggregationCapable) {\n\t\t\tif ((pAd->CommonCfg.bPiggyBackCapable)\n\t\t\t    && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) {\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00};\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 9, RalinkIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t} else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00};\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 9, RalinkIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n\t\t} else {\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06, 0x00, 0x00, 0x00};\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9,\n\t\t\t\t\t  RalinkIe, END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n\n\t\tif (pAd->MlmeAux.APEdcaParm.bValid) {\n\t\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable\n\t\t\t    && pAd->MlmeAux.APEdcaParm.bAPSDCapable) {\n\t\t\t\tQBSS_STA_INFO_PARM QosInfo;\n\n\t\t\t\tNdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));\n\t\t\t\tQosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;\n\t\t\t\tQosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;\n\t\t\t\tQosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;\n\t\t\t\tQosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;\n\t\t\t\tQosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength;\n\t\t\t\tWmeIe[8] |= *(PUCHAR) & QosInfo;\n\t\t\t} else {\n\t\t\t\t/* The Parameter Set Count is set to 0 in the association request frames */\n\t\t\t\t/* WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f); */\n\t\t\t}\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  9, &WmeIe[0], END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n\t\t/* */\n\t\t/* Let WPA(#221) Element ID on the end of this association frame. */\n\t\t/* Otherwise some AP will fail on parsing Element ID and set status fail on Assoc Rsp. */\n\t\t/* For example: Put Vendor Specific IE on the front of WPA IE. */\n\t\t/* This happens on AP (Model No:Linksys WRK54G) */\n\t\t/* */\n\t\tif (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||\n\t\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||\n\t\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n#ifdef WAPI_SUPPORT\n\t\t     || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t     || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t\t    )\n#ifdef WSC_STA_SUPPORT\n\t\t    && ((pAd->StaCfg.WscControl.WscConfMode == WSC_DISABLE) ||\n\t\t\t((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t !(pAd->StaCfg.WscControl.bWscTrigger\n\t\t\t )))\n#endif /* WSC_STA_SUPPORT */\n\t\t    ) {\n\t\t\tUCHAR RSNIe = IE_WPA;\n\n\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t    || (pAd->StaCfg.AuthMode ==\n\t\t\t\tNdis802_11AuthModeWPA2)) {\n\t\t\t\tRSNIe = IE_WPA2;\n\t\t\t}\n#ifdef WAPI_SUPPORT\n\t\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t\t\t || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)) {\n\t\t\t\tRSNIe = IE_WAPI;\n\t\t\t}\n#endif /* WAPI_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t{\n\t\t\t\tRTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode,\n\t\t\t\t\t      pAd->StaCfg.WepStatus, BSS0);\n\n\t\t\t\t/* Check for WPA PMK cache list */\n\t\t\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) {\n\t\t\t\t\tINT idx;\n\t\t\t\t\tBOOLEAN FoundPMK = FALSE;\n\t\t\t\t\t/* Search chched PMKID, append it if existed */\n\t\t\t\t\tfor (idx = 0; idx < PMKID_NO; idx++) {\n\t\t\t\t\t\tif (NdisEqualMemory(ApAddr, &pAd->StaCfg.SavedPMK[idx].BSSID, 6)) {\n\t\t\t\t\t\t\tFoundPMK = TRUE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\t/*\n\t\t\t\t\t   When AuthMode is WPA2-Enterprise and AP reboot or STA lost AP,\n\t\t\t\t\t   AP would not do PMK cache with STA after STA re-connect to AP again.\n\t\t\t\t\t   In this case, driver doesn't need to send PMKID to AP and WpaSupplicant.\n\t\t\t\t\t */\n\t\t\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t\t\t\t    && (NdisEqualMemory(pAd->MlmeAux.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN))) {\n\t\t\t\t\t\tFoundPMK = FALSE;\n\t\t\t\t\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\t\t\t\t\tif (FoundPMK) {\n\t\t\t\t\t\t/* Set PMK number */\n\t\t\t\t\t\t*(PUSHORT) & pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len] = 1;\n\t\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len + 2],\n\t\t\t\t\t\t\t       &pAd->StaCfg.SavedPMK[idx].PMKID, 16);\n\t\t\t\t\t\tpAd->StaCfg.RSNIE_Len += 18;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t/*\n\t\t\t\tCan not use SIOCSIWGENIE definition, it is used in wireless.h\n\t\t\t\tWe will not see the definition in MODULE.\n\t\t\t\tThe definition can be saw in UTIL and NETIF.\n\t\t\t*/\n/* #ifdef SIOCSIWGENIE */\n\t\t\tif ((pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE)\n\t\t\t    && (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE)) {\n\t\t\t\t;\n\t\t\t} else\n/* #endif */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t{\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t\t  1, &RSNIe,\n\t\t\t\t\t\t  1, &pAd->StaCfg.RSNIE_Len,\n\t\t\t\t\t\t  pAd->StaCfg.RSNIE_Len,\n\t\t\t\t\t\t  pAd->StaCfg.RSN_IE,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += tmp;\n\t\t\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t/*\n\t\t\t\tCan not use SIOCSIWGENIE definition, it is used in wireless.h\n\t\t\t\tWe will not see the definition in MODULE.\n\t\t\t\tThe definition can be saw in UTIL and NETIF.\n\t\t\t*/\n/* #ifdef SIOCSIWGENIE */\n\t\t\tif (((pAd->StaCfg.WpaSupplicantUP & 0x7F) !=\n\t\t\t     WPA_SUPPLICANT_ENABLE)\n\t\t\t    || (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE))\n/* #endif */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t{\n\t\t\t\t/* Append Variable IE */\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1);\n\t\t\t\tVarIesOffset += 1;\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->StaCfg.RSNIE_Len, 1);\n\t\t\t\tVarIesOffset += 1;\n\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->StaCfg.RSN_IE, pAd->StaCfg.RSNIE_Len);\n\t\t\t\tVarIesOffset += pAd->StaCfg.RSNIE_Len;\n\n\t\t\t\t/* Set Variable IEs Length */\n\t\t\t\tpAd->StaCfg.ReqVarIELen = VarIesOffset;\n\t\t\t}\n\t\t}\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t/*\n\t\t\tCan not use SIOCSIWGENIE definition, it is used in wireless.h\n\t\t\tWe will not see the definition in MODULE.\n\t\t\tThe definition can be saw in UTIL and NETIF.\n\t\t*/\n/* #ifdef SIOCSIWGENIE */\n\t\tif ((pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE) &&\n\t\t    (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE)) {\n\t\t\tULONG TmpWpaAssocIeLen = 0;\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t  &TmpWpaAssocIeLen,\n\t\t\t\t\t  pAd->StaCfg.WpaAssocIeLen,\n\t\t\t\t\t  pAd->StaCfg.pWpaAssocIe, END_OF_ARGS);\n\n\t\t\tFrameLen += TmpWpaAssocIeLen;\n\n\t\t\tNdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,\n\t\t\t\t       pAd->StaCfg.pWpaAssocIe,\n\t\t\t\t       pAd->StaCfg.WpaAssocIeLen);\n\t\t\tVarIesOffset += pAd->StaCfg.WpaAssocIeLen;\n\n\t\t\t/* Set Variable IEs Length */\n\t\t\tpAd->StaCfg.ReqVarIELen = VarIesOffset;\n\t\t}\n/* #endif */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef P2P_SUPPORT\n\telse if (P2P_INF_ON(pAd))\n\t{\n\t\t/* Check the total P2P Attribue IE in this AP.s */\n\t\tif (pAd->P2pCfg.P2pManagedParm.TotalNumOfP2pAttribute > 0)\n\t\t{\n\t\t\tPUCHAR\tptr;\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tP2pMakeP2pIE(pAd, SUBTYPE_ASSOC_REQ, ptr, &tmp);\n\t\t\tFrameLen += tmp;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ASSOCREQ - Insert P2P IE in case for managed AP to recognize me\\n\"));\n\t\t}\n\t}\n#endif /* P2P_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t\t/* Add WSC IE if we are connecting to WSC AP */\n\t\tif ((pAd->StaCfg.WscControl.WscEnAssociateIE) &&\n\t\t    (pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t    (pAd->StaCfg.WscControl.bWscTrigger\n\t\t    )) {\n\t\t\tUCHAR *pWscBuf = NULL, WscIeLen = 0;\n\t\t\tULONG WscTmpLen = 0;\n\n\t\t\tos_alloc_mem(pAd, (UCHAR **) & pWscBuf, 512);\n/*\t\t\tif( (pWscBuf = kmalloc(512, GFP_ATOMIC)) != NULL) */\n\t\t\tif (pWscBuf != NULL) {\n\t\t\t\tNdisZeroMemory(pWscBuf, 512);\n\t\t\t\tWscBuildAssocReqIE(&pAd->StaCfg.WscControl, pWscBuf, &WscIeLen);\n\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &WscTmpLen, WscIeLen, pWscBuf,\n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\t\tFrameLen += WscTmpLen;\n/*\t\t\t\tkfree(pWscBuf); */\n\t\t\t\tos_free_mem(NULL, pWscBuf);\n\t\t\t} else\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN,\n\t\t\t\t\t (\"%s:: WscBuf Allocate failed!\\n\",\n\t\t\t\t\t  __FUNCTION__));\n\t\t}\n#endif /* WSC_STA_SUPPORT */\n#ifdef WFD_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n\t\tif (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t\t{\n\t\t\tULONG\tWfdIeLen, WfdIeBitmap;\n\t\t\tPUCHAR\tptr;\n\t\t\t\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &WfdIeLen);\n\t\t\tFrameLen += WfdIeLen;\n\t\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\tRTMPSetTimer(&pAd->MlmeAux.AssocTimer, Timeout);\n\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_WAIT_RSP;\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - MlmeAssocReqAction() sanity check failed. BUG!!!!!! \\n\"));\n\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\tStatus = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2,\n\t\t\t    &Status, 0);\n\t}\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tmlme reassoc req handling procedure\n\tParameters:\n\t\tElem - \n\tPre:\n\t\t-# SSID  (Adapter->StaCfg.ssid[])\n\t\t-# BSSID (AP address, Adapter->StaCfg.bssid)\n\t\t-# Supported rates (Adapter->StaCfg.supported_rates[])\n\t\t-# Supported rates length (Adapter->StaCfg.supported_rates_len)\n\t\t-# Tx power (Adapter->StaCfg.tx_power)\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID MlmeReassocReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM * Elem)\n{\n\tUCHAR ApAddr[6];\n\tHEADER_802_11 ReassocHdr;\n\tUCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};\n\tUSHORT CapabilityInfo, ListenIntv;\n\tULONG Timeout;\n\tULONG FrameLen = 0;\n\tBOOLEAN TimerCancelled;\n\tNDIS_STATUS NStatus;\n\tULONG tmp;\n\tPUCHAR pOutBuffer = NULL;\n\tUSHORT Status;\n\n\t/* Block all authentication request durning WPA block period */\n\tif (pAd->StaCfg.bBlockAssoc == TRUE) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - Block ReAssoc request durning WPA block period!\\n\"));\n\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\tStatus = MLME_STATE_MACHINE_REJECT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0);\n\t}\n\t/* the parameters are the same as the association */\n\telse if (MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv))\n\t{\n\t\t/*for dhcp,issue ,wpa_supplicant ioctl too fast , at link_up, it will add key before driver remove key  */\n\t\tRTMPWPARemoveAllKeys(pAd);\n\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled);\n\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\t\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"ASSOC - MlmeReassocReqAction() allocate memory failed \\n\"));\n\t\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\t\tStatus = MLME_FAIL_NO_RESOURCE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,\n\t\t\t\t    MT2_REASSOC_CONF, 2, &Status, 0);\n\t\t\treturn;\n\t\t}\n\n\t\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr);\n\n\t\t/* make frame, use bssid as the AP address?? */\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - Send RE-ASSOC request...\\n\"));\n\t\tMgtMacHeaderInit(pAd, &ReassocHdr, SUBTYPE_REASSOC_REQ, 0, ApAddr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tApAddr);\n\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof (HEADER_802_11),\n\t\t\t\t  &ReassocHdr, 2, &CapabilityInfo, 2,\n\t\t\t\t  &ListenIntv, MAC_ADDR_LEN, ApAddr, 1, &SsidIe,\n\t\t\t\t  1, &pAd->MlmeAux.SsidLen,\n\t\t\t\t  pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, 1,\n\t\t\t\t  &SupRateIe, 1, &pAd->MlmeAux.SupRateLen,\n\t\t\t\t  pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,\n\t\t\t\t  END_OF_ARGS);\n\n\t\tif (pAd->MlmeAux.ExtRateLen != 0) {\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  1, &ExtRateIe,\n\t\t\t\t\t  1, &pAd->MlmeAux.ExtRateLen,\n\t\t\t\t\t  pAd->MlmeAux.ExtRateLen,\n\t\t\t\t\t  pAd->MlmeAux.ExtRate, END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n\t\tif (pAd->MlmeAux.APEdcaParm.bValid) {\n\t\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable\n\t\t\t    && pAd->MlmeAux.APEdcaParm.bAPSDCapable) {\n\t\t\t\tQBSS_STA_INFO_PARM QosInfo;\n\n\t\t\t\tNdisZeroMemory(&QosInfo,\n\t\t\t\t\t       sizeof (QBSS_STA_INFO_PARM));\n\t\t\t\tQosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;\n\t\t\t\tQosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;\n\t\t\t\tQosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;\n\t\t\t\tQosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;\n\t\t\t\tQosInfo.MaxSPLength =\n\t\t\t\t    pAd->CommonCfg.MaxSPLength;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"uapsd> MaxSPLength = %d!\\n\",\n\t\t\t\t\t  QosInfo.MaxSPLength));\n\t\t\t\tWmeIe[8] |= *(PUCHAR) & QosInfo;\n\t\t\t}\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  9, &WmeIe[0], END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\t/* HT */\n\t\tif ((pAd->MlmeAux.HtCapabilityLen > 0)\n\t\t    && WMODE_CAP_N(pAd->CommonCfg.PhyMode)) {\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR HtLen;\n\t\t\tUCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};\n\t\t\tPHT_CAPABILITY_IE pHtCapability;\n\n#ifdef RT_BIG_ENDIAN\n\t\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\t\tNdisZeroMemory(&HtCapabilityTmp, sizeof (HT_CAPABILITY_IE));\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, pAd->MlmeAux.HtCapabilityLen);\n\t\t\t*(USHORT *) (&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.HtCapInfo));\n\t\t\t*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo));\n\t\t\tpHtCapability = &HtCapabilityTmp;\n#else\n\t\t\tpHtCapability = &pAd->MlmeAux.HtCapability;\n#endif\n\n\t\t\tif (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) {\n\t\t\t\tHtLen = SIZE_HT_CAP_IE + 4;\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 1, &WpaIe, 1, &HtLen,\n\t\t\t\t\t\t  4, &BROADCOM[0],\n\t\t\t\t\t\t  pAd->MlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t  pHtCapability, END_OF_ARGS);\n\t\t\t} else {\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 1, &HtCapIe, 1,\n\t\t\t\t\t\t  &pAd->MlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t  pAd->MlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t  pHtCapability, END_OF_ARGS);\n\t\t\t}\n\t\t\tFrameLen += TmpLen;\n\n#ifdef DOT11_VHT_AC\n\t\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t(pAd->MlmeAux.Channel > 14) &&\n\t\t\t\t(pAd->MlmeAux.vht_cap_len)\n\t\t\t)\n\t\t\t{\n\t\t\t\tFrameLen += build_vht_ies(pAd, (UCHAR *)(pOutBuffer + FrameLen), SUBTYPE_ASSOC_REQ);\n\t\t\t}\n#endif /* DOT11_VHT_AC */\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\tif (FALSE\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t|| IS_TDLS_SUPPORT(pAd)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t )\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\tEXT_CAP_INFO_ELEMENT extCapInfo;\n\t\t\tUCHAR extInfoLen;\n\n\t\t\tNdisZeroMemory(&extCapInfo, sizeof (EXT_CAP_INFO_ELEMENT));\n\t\t\textInfoLen = sizeof(EXT_CAP_INFO_ELEMENT);\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tif (IS_TDLS_SUPPORT(pAd))\n\t\t\t{\n\t\t\t\textCapInfo.UAPSDBufSTASupport = 1;\n\n\t\t\t\tif (pAd->StaCfg.TdlsInfo.TdlsChSwitchSupp)\n\t\t\t\t\textCapInfo.TDLSChSwitchSupport = 1;\n\t\t\t\telse\n\t\t\t\t\textCapInfo.TDLSChSwitchSupport = 0;\n\n\t\t\t\textCapInfo.TDLSSupport = 1;\n\t\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&ExtCapIe,\n\t\t\t\t\t\t\t\t1\t\t\t\t\t&extInfoLen,\n\t\t\t\t\t\t\t\textInfoLen,\t\t\t&extCapInfo,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t\t/*printk(\"iverson test extCapInfo.BssTransitionManmt %x \\n\",extCapInfo.BssTransitionManmt); */\n\t\t}\n\n\t\t/* add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION */\n\t\t/* Case I: (Aggregation + Piggy-Back) */\n\t\t/* 1. user enable aggregation, AND */\n\t\t/* 2. Mac support piggy-back */\n\t\t/* 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON */\n\t\t/* Case II: (Aggregation) */\n\t\t/* 1. user enable aggregation, AND */\n\t\t/* 2. AP annouces it's AGGREGATION-capable in BEACON */\n\t\tif (pAd->CommonCfg.bAggregationCapable) {\n\t\t\tif ((pAd->CommonCfg.bPiggyBackCapable)\n\t\t\t    && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) {\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00 };\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 9, RalinkIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t} else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00 };\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\n\t\t\t\t\t\t  &TmpLen, 9, RalinkIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n\t\t} else {\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x04, 0x00, 0x00, 0x00 };\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9,\n\t\t\t\t\t  RalinkIe, END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#ifdef WFD_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n\t\tif (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t\t{\n\t\t\tULONG\tWfdIeLen, WfdIeBitmap;\n\t\t\tPUCHAR\tptr;\n\t\t\t\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &WfdIeLen);\n\t\t\tFrameLen += WfdIeLen;\n\t\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\tRTMPSetTimer(&pAd->MlmeAux.ReassocTimer, Timeout * 2);\t/* in mSec */\n\t\tpAd->Mlme.AssocMachine.CurrState = REASSOC_WAIT_RSP;\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - MlmeReassocReqAction() sanity check failed. BUG!!!! \\n\"));\n\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\tStatus = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2,\n\t\t\t    &Status, 0);\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tUpper layer issues disassoc request\n\tParameters:\n\t\tElem -\n\n\tIRQL = PASSIVE_LEVEL\n\n\t==========================================================================\n */\nVOID MlmeDisassocReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPMLME_DISASSOC_REQ_STRUCT pDisassocReq;\n\tHEADER_802_11 DisassocHdr;\n\tPHEADER_802_11 pDisassocHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0;\n\tNDIS_STATUS NStatus;\n\tBOOLEAN TimerCancelled;\n\tULONG Timeout = 500;\n\tUSHORT Status;\n\n#ifdef QOS_DLS_SUPPORT\n\t/* send DLS-TEAR_DOWN message, */\n\tif (pAd->CommonCfg.bDLSCapable) {\n\t\tUCHAR i;\n\n\t\t/* tear down local dls table entry */\n\t\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) {\n\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t}\n\t\t}\n\n\t\t/* tear down peer dls table entry */\n\t\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) {\n\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t}\n\t\t}\n\t}\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\tif (IS_TDLS_SUPPORT(pAd))\n\t{\n\t\tif (pAd->StaCfg.bRadio == TRUE)\n\t\t{\n\t\t\tTDLS_LinkTearDown(pAd, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUCHAR\t\tidx;\n\t\t\tBOOLEAN\t\tTimerCancelled;\n\t\t\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\t\t\t// tear down tdls table entry\n\t\t\tfor (idx = 0; idx < MAX_NUM_OF_TDLS_ENTRY; idx++)\n\t\t\t{\n\t\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\t\t\t\tif (pTDLS->Valid && (pTDLS->Status >= TDLS_MODE_CONNECTED))\n\t\t\t\t{\n\t\t\t\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\t\t\t\tpTDLS->Valid\t= FALSE;\n\t\t\t\t\tpTDLS->Token = 0;\n\t\t\t\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t\t\t\t\tif (!VALID_WCID(pTDLS->MacTabMatchWCID))\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tMacTableDeleteEntry(pAd,pTDLS->MacTabMatchWCID, pTDLS->MacAddr);\n\t\t\t\t}\n\t\t\t\telse if (pTDLS->Valid)\n\t\t\t\t{\n\t\t\t\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\t\t\t\tpTDLS->Valid\t= FALSE;\n\t\t\t\t\tpTDLS->Token = 0;\n\t\t\t\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t/* skip sanity check */\n\tpDisassocReq = (PMLME_DISASSOC_REQ_STRUCT) (Elem->Msg);\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - MlmeDisassocReqAction() allocate memory failed\\n\"));\n\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\tStatus = MLME_FAIL_NO_RESOURCE;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2,\n\t\t\t    &Status, 0);\n\t\treturn;\n\t}\n\n#ifdef WAPI_SUPPORT\n\tWAPI_InternalCmdAction(pAd,\n\t\t\t       pAd->StaCfg.AuthMode,\n\t\t\t       BSS0, pDisassocReq->Addr, WAI_MLME_DISCONNECT);\n#endif /* WAPI_SUPPORT */\n\n\tRTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &TimerCancelled);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"ASSOC - Send DISASSOC request[BSSID::%02x:%02x:%02x:%02x:%02x:%02x (Reason=%d)\\n\",\n\t\t  PRINT_MAC(pDisassocReq->Addr), pDisassocReq->Reason));\n\tMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpDisassocReq->Addr);\t/* patch peap ttls switching issue */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  sizeof (HEADER_802_11), &DisassocHdr,\n\t\t\t  2, &pDisassocReq->Reason, END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\n\t/* To patch Instance and Buffalo(N) AP */\n\t/* Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine */\n\t/* Therefore, we send both of them. */\n\tpDisassocHdr = (PHEADER_802_11) pOutBuffer;\n\tpDisassocHdr->FC.SubType = SUBTYPE_DEAUTH;\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tpAd->StaCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING;\n\tCOPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pDisassocReq->Addr);\n\n\tRTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout);\t/* in mSec */\n\tpAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP;\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) {\n\t\t/*send disassociate event to wpa_supplicant */\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM,\n\t\t\t\t\tRT_DISASSOC_EVENT_FLAG, NULL, NULL, 0);\n\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\n/* mark here because linkdown also call this function */\n\n\tRTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, NULL, BSS0, 0);\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tpeer sends assoc rsp back\n\tParameters:\n\t\tElme - MLME message containing the received frame\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID PeerAssocRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT CapabilityInfo, Status, Aid;\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;\n\tUCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tBOOLEAN TimerCancelled;\n\tUCHAR CkipFlag;\n\tEDCA_PARM EdcaParm;\n\tHT_CAPABILITY_IE HtCapability;\n\tADD_HT_INFO_IE AddHtInfo;\t/* AP might use this additional ht info IE */\n\tUCHAR HtCapabilityLen = 0;\n\tUCHAR AddHtInfoLen;\n\tUCHAR NewExtChannelOffset = 0xff;\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\n\tMAC_TABLE_ENTRY *pEntry;\n\tIE_LISTS *ie_list = NULL;\n\n\n\tos_alloc_mem(pAd, (UCHAR **)&ie_list, sizeof(IE_LISTS));\n\tif (ie_list == NULL) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s():mem alloc failed!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisZeroMemory((UCHAR *)ie_list, sizeof(IE_LISTS));\n\n\tif (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen,\n\t\t\t       Addr2, &CapabilityInfo, &Status, &Aid, SupRate,\n\t\t\t       &SupRateLen, ExtRate, &ExtRateLen, &HtCapability,\n\t\t\t       &AddHtInfo, &HtCapabilityLen, &AddHtInfoLen,\n\t\t\t       &NewExtChannelOffset, &EdcaParm, &ExtCapInfo,\n\t\t\t       &CkipFlag, ie_list))\n\t{\n\t\t/* The frame is for me ? */\n\t\tif (MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s():ASSOC - receive ASSOC_RSP to me (status=%d)\\n\", __FUNCTION__, Status));\n#ifdef DOT11_N_SUPPORT\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \\n\",\n\t\t\t\t  __FUNCTION__, Elem->Wcid,\n\t\t\t\t  pAd->MacTab.Content[BSSID_WCID].AMsduSize,\n\t\t\t\t  pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));\n#endif /* DOT11_N_SUPPORT */\n\t\t\tRTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);\n\n\n\n\t\t\tif (Status == MLME_SUCCESS) {\n\t\t\t\tUCHAR MaxSupportedRateIn500Kbps = 0;\n\n\t\t\t\t/*\n\t\t\t\t\tIn roaming case, LinkDown wouldn't be invoked.\n\t\t\t\t\tFor preventing finding MacTable Hash index malfunction,\n\t\t\t\t\twe need to do MacTableDeleteEntry here.\n\t\t\t\t*/\n\t\t\t\tpEntry = MacTableLookup(pAd, pAd->CommonCfg.Bssid);\t\n\t\t\t\tif (pEntry)\t\n\t\t\t\t{\n\t\t\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\t\t\tpEntry = NULL;\t\n\t\t\t\t}\n\n\t\t\t\tMaxSupportedRateIn500Kbps = dot11_max_sup_rate(SupRateLen, &SupRate[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tExtRateLen, &ExtRate[0]);\n\t\t\t\t/* go to procedure listed on page 376 */\n\t\t\t\tAssocPostProc(pAd, Addr2, CapabilityInfo, Aid,\n\t\t\t\t\t      SupRate, SupRateLen, ExtRate,\n\t\t\t\t\t      ExtRateLen, &EdcaParm,\n\t\t\t\t\t\tie_list,\n\t\t\t\t\t      &HtCapability, HtCapabilityLen,\n\t\t\t\t\t      &AddHtInfo);\n\n\t\t\t\tStaAddMacTableEntry(pAd,\n\t\t\t\t\t\t    &pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\t    MaxSupportedRateIn500Kbps,\n\t\t\t\t\t\t    &HtCapability,\n\t\t\t\t\t\t    HtCapabilityLen, &AddHtInfo,\n\t\t\t\t\t\t    AddHtInfoLen,\n\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t    CapabilityInfo);\n\n\t\t\t\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\t\t\t&pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\t\t\tSupRate,\n\t\t\t\t\t\t\t\tSupRateLen,\n\t\t\t\t\t\t\t\tExtRate,\n\t\t\t\t\t\t\t\tExtRateLen,\n#ifdef DOT11_VHT_AC\n\t\t\t\t\t\t\t\tie_list->vht_cap_len,\n\t\t\t\t\t\t\t\t&ie_list->vht_cap,\n#endif /* DOT11_VHT_AC */\n\t\t\t\t\t\t\t\t&HtCapability,\n\t\t\t\t\t\t\t\tHtCapabilityLen);\n\n\t\t\t}\n\t\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0);\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n\t\t\t{\n\t\t\t\tPFRAME_802_11 pFrame = (PFRAME_802_11) (Elem->Msg);\n\t\t\t\tRTEnqueueInternalCmd(pAd,\n\t\t\t\t\t\t     CMDTHREAD_CONNECT_RESULT_INFORM,\n\t\t\t\t\t\t     &pFrame->Octet[6],\n\t\t\t\t\t\t     Elem->MsgLen - 6 - sizeof (HEADER_802_11));\n\t\t\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - %s() sanity check fail\\n\", __FUNCTION__));\n\t}\n\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tpeer sends reassoc rsp\n\tParametrs:\n\t\tElem - MLME message cntaining the received frame\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID PeerReassocRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT CapabilityInfo;\n\tUSHORT Status;\n\tUSHORT Aid;\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;\n\tUCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUCHAR CkipFlag;\n\tBOOLEAN TimerCancelled;\n\tEDCA_PARM EdcaParm;\n\tHT_CAPABILITY_IE HtCapability;\n\tADD_HT_INFO_IE AddHtInfo;\t/* AP might use this additional ht info IE */\n\tUCHAR HtCapabilityLen;\n\tUCHAR AddHtInfoLen;\n\tUCHAR NewExtChannelOffset = 0xff;\n\tEXT_CAP_INFO_ELEMENT ExtCapInfo;\n\tIE_LISTS *ie_list = NULL;\n\n\tos_alloc_mem(pAd, (UCHAR **)&ie_list, sizeof(IE_LISTS));\n\tif (ie_list == NULL) {\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s():mem alloc failed!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisZeroMemory((UCHAR *)ie_list, sizeof(IE_LISTS));\n\t\n\tif (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2,\n\t\t\t       &CapabilityInfo, &Status, &Aid, SupRate,\n\t\t\t       &SupRateLen, ExtRate, &ExtRateLen, &HtCapability,\n\t\t\t       &AddHtInfo, &HtCapabilityLen, &AddHtInfoLen,\n\t\t\t       &NewExtChannelOffset, &EdcaParm, &ExtCapInfo,\n\t\t\t       &CkipFlag, ie_list)) {\n\t\tif (MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) {\t/* The frame is for me ? */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"REASSOC - receive REASSOC_RSP to me (status=%d)\\n\", Status));\n\t\t\tRTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,\n\t\t\t\t\t&TimerCancelled);\n\n\t\t\tif (Status == MLME_SUCCESS) \n\t\t\t{\n\t\t\t\tUCHAR MaxSupportedRateIn500Kbps = 0;\n\t\t\t\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\t\t\t\t/*\n\t\t\t\t\tIn roaming case, LinkDown wouldn't be invoked.\n\t\t\t\t\tFor preventing finding MacTable Hash index malfunction,\n\t\t\t\t\twe need to do MacTableDeleteEntry here.\n\t\t\t\t*/\n\t\t\t\tpEntry = MacTableLookup(pAd, pAd->CommonCfg.Bssid);\t\n\t\t\t\tif (pEntry)\t\n\t\t\t\t{\n\t\t\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);\n\t\t\t\t\tpEntry = NULL;\t\n\t\t\t\t}\n\n\t\t\t\tMaxSupportedRateIn500Kbps = dot11_max_sup_rate(SupRateLen, &SupRate[0], ExtRateLen, &ExtRate[0]);\n\n\t\t\t\t\n\t\t\t\t/* go to procedure listed on page 376 */\n\t\t\t\tAssocPostProc(pAd, Addr2, CapabilityInfo, Aid,\n\t\t\t\t\t      SupRate, SupRateLen, ExtRate,\n\t\t\t\t\t      ExtRateLen, &EdcaParm,\n\t\t\t\t\t\tie_list,\n\t\t\t\t\t      &HtCapability, HtCapabilityLen,\n\t\t\t\t\t      &AddHtInfo);\n\n\t\t\t\tStaAddMacTableEntry(pAd,\n\t\t\t\t\t\t    &pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\t    MaxSupportedRateIn500Kbps,\n\t\t\t\t\t\t    &HtCapability,\n\t\t\t\t\t\t    HtCapabilityLen, &AddHtInfo,\n\t\t\t\t\t\t    AddHtInfoLen,\n\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t    CapabilityInfo);\n\n\t\t\t\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\t\t\t&pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\t\t\tSupRate,\n\t\t\t\t\t\t\t\tSupRateLen,\n\t\t\t\t\t\t\t\tExtRate,\n\t\t\t\t\t\t\t\tExtRateLen,\n#ifdef DOT11_VHT_AC\n\t\t\t\t\t\t\t\tie_list->vht_cap_len,\n\t\t\t\t\t\t\t\t&ie_list->vht_cap,\n#endif /* DOT11_VHT_AC */\n\t\t\t\t\t\t\t\t&HtCapability,\n\t\t\t\t\t\t\t\tHtCapabilityLen);\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\t\tif (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) {\n\t\t\t\t\tSendAssocIEsToWpaSupplicant(pAd->net_dev,\n\t\t\t\t\t\t\t\t    pAd->StaCfg.ReqVarIEs,\n\t\t\t\t\t\t\t\t    pAd->StaCfg.ReqVarIELen);\n\t\t\t\t\tRtmpOSWrielessEventSend(pAd->net_dev,\n\t\t\t\t\t\t\t\tRT_WLAN_EVENT_CUSTOM,\n\t\t\t\t\t\t\t\tRT_ASSOC_EVENT_FLAG,\n\t\t\t\t\t\t\t\tNULL, NULL, 0);\n\t\t\t\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\t\t{\n\t\t\t\t\twext_notify_event_assoc(pAd->net_dev,\n\t\t\t\t\t\t\t\tpAd->StaCfg.ReqVarIEs,\n\t\t\t\t\t\t\t\tpAd->StaCfg.ReqVarIELen);\n\t\t\t\t\tRtmpOSWrielessEventSend(pAd->net_dev,\n\t\t\t\t\t\t\t\tRT_WLAN_EVENT_CGIWAP,\n\t\t\t\t\t\t\t\t-1,\n\t\t\t\t\t\t\t\t&pAd->MlmeAux.Bssid[0], NULL,\n\t\t\t\t\t\t\t\t0);\n\t\t\t\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\t\t\t}\n\n\t\t\t/* CkipFlag is no use for reassociate */\n\t\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0);\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"REASSOC - %s() sanity check fail\\n\", __FUNCTION__));\n\t}\n\n\tif (ie_list)\n\t\tos_free_mem(pAd, ie_list);\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tprocedures on IEEE 802.11/1999 p.376 \n\tParametrs:\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AssocPostProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr2,\n\tIN USHORT CapabilityInfo,\n\tIN USHORT Aid,\n\tIN UCHAR SupRate[],\n\tIN UCHAR SupRateLen,\n\tIN UCHAR ExtRate[],\n\tIN UCHAR ExtRateLen,\n\tIN PEDCA_PARM pEdcaParm,\n\tIN IE_LISTS *ie_list,\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR HtCapabilityLen,\n\tIN ADD_HT_INFO_IE *pAddHtInfo)\n{\t\t\t\t/* AP might use this additional ht info IE */\n\tULONG Idx;\n\n\tpAd->MlmeAux.BssType = BSS_INFRA;\n\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, pAddr2);\n\tpAd->MlmeAux.Aid = Aid;\n\tpAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO;\n\n#ifdef DOT11_N_SUPPORT\n\t/* Some HT AP might lost WMM IE. We add WMM ourselves. beacuase HT requires QoS on. */\n\tif ((HtCapabilityLen > 0) && (pEdcaParm->bValid == FALSE)) {\n\t\tpEdcaParm->bValid = TRUE;\n\t\tpEdcaParm->Aifsn[0] = 3;\n\t\tpEdcaParm->Aifsn[1] = 7;\n\t\tpEdcaParm->Aifsn[2] = 2;\n\t\tpEdcaParm->Aifsn[3] = 2;\n\n\t\tpEdcaParm->Cwmin[0] = 4;\n\t\tpEdcaParm->Cwmin[1] = 4;\n\t\tpEdcaParm->Cwmin[2] = 3;\n\t\tpEdcaParm->Cwmin[3] = 2;\n\n\t\tpEdcaParm->Cwmax[0] = 10;\n\t\tpEdcaParm->Cwmax[1] = 10;\n\t\tpEdcaParm->Cwmax[2] = 4;\n\t\tpEdcaParm->Cwmax[3] = 3;\n\n\t\tpEdcaParm->Txop[0] = 0;\n\t\tpEdcaParm->Txop[1] = 0;\n\t\tpEdcaParm->Txop[2] = 96;\n\t\tpEdcaParm->Txop[3] = 48;\n\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tNdisMoveMemory(&pAd->MlmeAux.APEdcaParm, pEdcaParm, sizeof (EDCA_PARM));\n\n\t/* filter out un-supported rates */\n\tpAd->MlmeAux.SupRateLen = SupRateLen;\n\tNdisMoveMemory(pAd->MlmeAux.SupRate, SupRate, SupRateLen);\n\tRTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen);\n\n\t/* filter out un-supported rates */\n\tpAd->MlmeAux.ExtRateLen = ExtRateLen;\n\tNdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen);\n\tRTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);\n\n#ifdef DOT11_N_SUPPORT\n\tif (HtCapabilityLen > 0) {\n\t\tRTMPCheckHt(pAd, BSSID_WCID, pHtCapability, pAddHtInfo);\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"%s():=>AP.AMsduSize = %d. ClientStatusFlags = 0x%lx \\n\",\n\t\t\t__FUNCTION__,\n\t\t\tpAd->MacTab.Content[BSSID_WCID].AMsduSize,\n\t\t\tpAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"%s():=>(Mmps=%d, AmsduSize=%d, )\\n\",\n\t\t \t__FUNCTION__,\n\t\t\tpAd->MacTab.Content[BSSID_WCID].MmpsMode,\n\t\t\tpAd->MacTab.Content[BSSID_WCID].AMsduSize));\n\n#ifdef DOT11_VHT_AC\n\tif (ie_list->vht_cap_len > 0 && ie_list->vht_op_len > 0) {\n\t\tRTMPCheckVht(pAd, BSSID_WCID, &ie_list->vht_cap, &ie_list->vht_op);\n\t}\n#endif /* DOT11_VHT_AC */\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Set New WPA information */\n\tIdx = BssTableSearch(&pAd->ScanTab, pAddr2, pAd->MlmeAux.Channel);\n\tif (Idx == BSS_NOT_FOUND) {\n\t\tDBGPRINT_ERR((\"ASSOC - Can't find BSS after receiving Assoc response\\n\"));\n\t} else {\n\t\t/* Init variable */\n\t\tpAd->MacTab.Content[BSSID_WCID].RSNIE_Len = 0;\n\t\tNdisZeroMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, MAX_LEN_OF_RSNIE);\n\n\t\t/* Store appropriate RSN_IE for WPA SM negotiation later */\n\t\tif ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n\t\t    && (pAd->ScanTab.BssEntry[Idx].VarIELen != 0)) {\n\t\t\tPUCHAR pVIE;\n\t\t\tUSHORT len;\n\t\t\tPEID_STRUCT pEid;\n\n\t\t\tpVIE = pAd->ScanTab.BssEntry[Idx].VarIEs;\n\t\t\tlen = pAd->ScanTab.BssEntry[Idx].VarIELen;\n\n#ifdef PCIE_PS_SUPPORT\n\t\t\t/* Don't allow to go to sleep mode if authmode is WPA-related. */\n\t\t\t/*This can make Authentication process more smoothly. */\n\t\t\tRTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n\t\t\twhile (len > 0) {\n\t\t\t\tpEid = (PEID_STRUCT) pVIE;\n\t\t\t\t/* For WPA/WPAPSK */\n\t\t\t\tif ((pEid->Eid == IE_WPA)\n\t\t\t\t    && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))\n\t\t\t\t    && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA\n\t\t\t\t\t|| pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {\n\t\t\t\t\tNdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2));\n\t\t\t\t\tpAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"%s():=> Store RSN_IE for WPA SM negotiation\\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\t/* For WPA2/WPA2PSK */\n\t\t\t\telse if ((pEid->Eid == IE_RSN)\n\t\t\t\t\t && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3))\n\t\t\t\t\t && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2\n\t\t\t\t\t     || pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) {\n\t\t\t\t\tNdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2));\n\t\t\t\t\tpAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"%s():=> Store RSN_IE for WPA2 SM negotiation\\n\", __FUNCTION__));\n\t\t\t\t}\n#ifdef WAPI_SUPPORT\n\t\t\t\t/* For WAPI */\n\t\t\t\telse if ((pEid->Eid == IE_WAPI)\n\t\t\t\t\t && (NdisEqualMemory(pEid->Octet + 4, WAPI_OUI, 3))\n\t\t\t\t\t && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT\n\t\t\t\t\t     || pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)) {\n\t\t\t\t\tNdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2));\n\t\t\t\t\tpAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"%s():=> Store RSN_IE for WAPI SM negotiation\\n\", __FUNCTION__));\n\t\t\t\t}\n#endif /* WAPI_SUPPORT */\n\n\t\t\t\tpVIE += (pEid->Len + 2);\n\t\t\t\tlen -= (pEid->Len + 2);\n\t\t\t}\n\n\n\t\t}\n\n\t\tif (pAd->MacTab.Content[BSSID_WCID].RSNIE_Len == 0) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s():=> no RSN_IE\\n\", __FUNCTION__));\n\t\t} else {\n\t\t\thex_dump(\"RSN_IE\",\n\t\t\t\t pAd->MacTab.Content[BSSID_WCID].RSN_IE,\n\t\t\t\t pAd->MacTab.Content[BSSID_WCID].RSNIE_Len);\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tleft part of IEEE 802.11/1999 p.374 \n\tParameters:\n\t\tElem - MLME message containing the received frame\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID PeerDisassocAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUSHORT Reason;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - PeerDisassocAction()\\n\"));\n\tif (PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - PeerDisassocAction() Reason = %d\\n\",\n\t\t\t  Reason));\n\t\tif (INFRA_ON(pAd)\n\t\t    && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, Addr2)) {\n\n\t\t\tRTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, NULL,\n\t\t\t\t\t      BSS0, 0);\n\n#ifdef WAPI_SUPPORT\n\t\t\tWAPI_InternalCmdAction(pAd,\n\t\t\t\t\t       pAd->StaCfg.AuthMode,\n\t\t\t\t\t       BSS0,\n\t\t\t\t\t       Addr2, WAI_MLME_DISCONNECT);\n#endif /* WAPI_SUPPORT */\n\n\t\t\t/*\n\t\t\t   It is possible that AP sends dis-assoc frame(PeerDisassocAction) to STA \n\t\t\t   after driver enqueue MT2_MLME_DISASSOC_REQ (MlmeDisassocReqAction) \n\t\t\t   and set CntlMachine.CurrState = CNTL_WAIT_DISASSOC.\n\t\t\t   DisassocTimer is useless because AssocMachine.CurrState will set to ASSOC_IDLE here.\n\t\t\t   Therefore, we need to check CntlMachine.CurrState here and enqueue MT2_DISASSOC_CONF to \n\t\t\t   reset CntlMachine.CurrState to CNTL_IDLE state again.\n\t\t\t */\n\t\t\tif (pAd->Mlme.CntlMachine.CurrState ==\n\t\t\t    CNTL_WAIT_DISASSOC) {\n\t\t\t\tUSHORT Status;\n\t\t\t\tStatus = MLME_SUCCESS;\n\t\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,\n\t\t\t\t\t    MT2_DISASSOC_CONF, 2, &Status, 0);\n\t\t\t} else\n\t\t\t\tLinkDown(pAd, TRUE);\n\n\t\t\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.WpaSupplicantUP !=\n\t\t\t    WPA_SUPPLICANT_DISABLE) {\n\t\t\t\t/*send disassociate event to wpa_supplicant */\n\t\t\t\tRtmpOSWrielessEventSend(pAd->net_dev,\n\t\t\t\t\t\t\tRT_WLAN_EVENT_CUSTOM,\n\t\t\t\t\t\t\tRT_DISASSOC_EVENT_FLAG,\n\t\t\t\t\t\t\tNULL, NULL, 0);\n\t\t\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n/* mark here because linkdown also call this function */\n\t\t}\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"ASSOC - PeerDisassocAction() sanity check fail\\n\"));\n\t}\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\twhat the state machine will do after assoc timeout\n\tParameters:\n\t\tElme -\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID AssocTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - AssocTimeoutAction\\n\"));\n\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\tStatus = MLME_REJ_TIMEOUT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status,\n\t\t    0);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\twhat the state machine will do after reassoc timeout\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID ReassocTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - ReassocTimeoutAction\\n\"));\n\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\tStatus = MLME_REJ_TIMEOUT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status,\n\t\t    0);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\twhat the state machine will do after disassoc timeout\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID DisassocTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC - DisassocTimeoutAction\\n\"));\n\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\tStatus = MLME_SUCCESS;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status,\n\t\t    0);\n}\n\nVOID InvalidStateWhenAssoc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"ASSOC - InvalidStateWhenAssoc(state=%ld), reset ASSOC state machine\\n\",\n\t\t  pAd->Mlme.AssocMachine.CurrState));\n\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\tStatus = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status,\n\t\t    0);\n}\n\nVOID InvalidStateWhenReassoc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"ASSOC - InvalidStateWhenReassoc(state=%ld), reset ASSOC state machine\\n\",\n\t\t  pAd->Mlme.AssocMachine.CurrState));\n\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\tStatus = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status,\n\t\t    0);\n}\n\nVOID InvalidStateWhenDisassociate(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"ASSOC - InvalidStateWhenDisassoc(state=%ld), reset ASSOC state machine\\n\",\n\t\t  pAd->Mlme.AssocMachine.CurrState));\n\tpAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\tStatus = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status,\n\t\t    0);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tright part of IEEE 802.11/1999 page 374\n\tNote: \n\t\tThis event should never cause ASSOC state machine perform state\n\t\ttransition, and has no relationship with CNTL machine. So we separate\n\t\tthis routine as a service outside of ASSOC state transition table.\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID Cls3errAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr)\n{\n\tHEADER_802_11 DisassocHdr;\n\tPHEADER_802_11 pDisassocHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0;\n\tNDIS_STATUS NStatus;\n\tUSHORT Reason = REASON_CLS3ERR;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"ASSOC - Class 3 Error, Send DISASSOC frame\\n\"));\n\tMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAddr, \n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->CommonCfg.Bssid);\t/* patch peap ttls switching issue */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  sizeof (HEADER_802_11), &DisassocHdr,\n\t\t\t  2, &Reason, END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\n\t/* To patch Instance and Buffalo(N) AP */\n\t/* Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine */\n\t/* Therefore, we send both of them. */\n\tpDisassocHdr = (PHEADER_802_11) pOutBuffer;\n\tpDisassocHdr->FC.SubType = SUBTYPE_DEAUTH;\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tpAd->StaCfg.DisassocReason = REASON_CLS3ERR;\n\tCOPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pAddr);\n}\n\n\nBOOLEAN StaAddMacTableEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMAC_TABLE_ENTRY pEntry,\n\tIN UCHAR MaxSupportedRateIn500Kbps,\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR HtCapabilityLen,\n\tIN ADD_HT_INFO_IE *pAddHtInfo,\n\tIN UCHAR AddHtInfoLen,\n\tIN IE_LISTS *ie_list,\n\tIN USHORT CapabilityInfo)\n{\n\tUCHAR MaxSupportedRate = RATE_11;\n\tBOOLEAN bSupportN = FALSE;\n#ifdef TXBF_SUPPORT\n\tBOOLEAN\t\tsupportsETxBf = FALSE;\n#endif\n\n\tif (!pEntry)\n\t\treturn FALSE;\n\n\tif (ADHOC_ON(pAd))\n\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\n\tMaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps);\n\n\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_G)\n\t    && (MaxSupportedRate < RATE_FIRST_OFDM_RATE))\n\t\treturn FALSE;\n\n#ifdef DOT11_N_SUPPORT\n\t/* 11n only */\n\tif (WMODE_HT_ONLY(pAd->CommonCfg.PhyMode)\n\t    && (HtCapabilityLen == 0))\n\t\treturn FALSE;\n#endif /* DOT11_N_SUPPORT */\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\tif (pEntry) {\n\t\tNdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));\n\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\tif ((MaxSupportedRate < RATE_FIRST_OFDM_RATE) ||\n\t\t    WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B)) {\n\t\t\tpEntry->RateLen = 4;\n\t\t\tif (MaxSupportedRate >= RATE_FIRST_OFDM_RATE)\n\t\t\t\tMaxSupportedRate = RATE_11;\n\t\t} else\n\t\t\tpEntry->RateLen = 12;\n\n\t\tpEntry->MaxHTPhyMode.word = 0;\n\t\tpEntry->MinHTPhyMode.word = 0;\n\t\tpEntry->HTPhyMode.word = 0;\n\t\tpEntry->MaxSupportedRate = MaxSupportedRate;\n\n\t\tset_entry_phy_cfg(pAd, pEntry);\n\n\t\tpEntry->CapabilityInfo = CapabilityInfo;\n\t\tpEntry->isCached = FALSE;\n\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE);\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tNdisZeroMemory(&pEntry->HTCapability, sizeof (pEntry->HTCapability));\n\t/* If this Entry supports 802.11n, upgrade to HT rate. */\n\tif (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled)\n\t     && (pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled))\n\t    || (pAd->CommonCfg.HT_DisallowTKIP == FALSE)) {\n\t\tif ((pAd->StaCfg.BssType == BSS_INFRA) &&\n\t\t    (HtCapabilityLen != 0) &&\n\t\t    WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\tbSupportN = TRUE;\n\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t    (pAd->StaCfg.bAdhocN == TRUE) &&\n\t\t    (HtCapabilityLen != 0) &&\n\t\t    WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\tbSupportN = TRUE;\n\t}\n\n\tif (bSupportN) {\n\t\tif (ADHOC_ON(pAd))\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\n\t\tht_mode_adjust(pAd, pEntry, pHtCapability, &pAd->CommonCfg.DesiredHtPhy);\n#ifdef P2P_SUPPORT\n\t\t// TODO: shiang-6590, fix this fallback case!!\n\t\tif (pAd->MlmeAux.bBwFallBack == TRUE)\n\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n#endif /* P2P_SUPPORT */\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\tsupportsETxBf = clientSupportsETxBF(pAd, &pHtCapability->TxBFCap);\n#endif /* TXBF_SUPPORT */\n\n\t\t/* find max fixed rate */\n\t\tpEntry->MaxHTPhyMode.field.MCS = get_ht_max_mcs(pAd, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &pHtCapability->MCSSet[0]);\n\n\t\tif (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO)\n\t\t\tset_ht_fixed_mcs(pAd, pEntry, pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.HTPhyMode.field.MCS);\n\n\t\tpEntry->MaxHTPhyMode.field.STBC = (pHtCapability->HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\tpEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity;\n\t\tpEntry->MaxRAmpduFactor = pHtCapability->HtCapParm.MaxRAmpduFactor;\n\t\tpEntry->MmpsMode = (UCHAR) pHtCapability->HtCapInfo.MimoPs;\n\t\tpEntry->AMsduSize = (UCHAR) pHtCapability->HtCapInfo.AMsduSize;\n\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\t\tif (pAd->CommonCfg.DesiredHtPhy.AmsduEnable\n\t\t    && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE))\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED);\n\t\tif (pHtCapability->HtCapInfo.ShortGIfor20)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\tif (pHtCapability->HtCapInfo.ShortGIfor40)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\tif (pHtCapability->HtCapInfo.TxSTBC)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\tif (pHtCapability->HtCapInfo.RxSTBC)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\tif (pHtCapability->ExtHtCapInfo.PlusHTC)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\tif (pAd->CommonCfg.bRdg\n\t\t    && pHtCapability->ExtHtCapInfo.RDGSupport)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\t\tif (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\n\t\tNdisMoveMemory(&pEntry->HTCapability, pHtCapability, HtCapabilityLen);\n\n\t\tassoc_ht_info_debugshow(pAd, pEntry, HtCapabilityLen, pHtCapability);\n#ifdef DOT11_VHT_AC\n\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\tie_list->vht_cap_len && ie_list->vht_op_len)\n\t\t{\n\t\t\tvht_mode_adjust(pAd, pEntry, &ie_list->vht_cap, &ie_list->vht_op);\n\t\t\tassoc_vht_info_debugshow(pAd, pEntry, &ie_list->vht_cap, &ie_list->vht_op);\n\t\t}\n#endif /* DOT11_VHT_AC */\n\t} else {\n\t\tpAd->MacTab.fAnyStationIsLegacy = TRUE;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\n#ifdef MFB_SUPPORT\n\tpEntry->lastLegalMfb = 0;\n\tpEntry->isMfbChanged = FALSE;\n\tpEntry->fLastChangeAccordingMfb = FALSE;\n\n\tpEntry->toTxMrq = TRUE;\n\tpEntry->msiToTx = 0; /* has to increment whenever a mrq is sent */\n\tpEntry->mrqCnt = 0;\n\n\tpEntry->pendingMfsi = 0;\n\n\tpEntry->toTxMfb = FALSE;\n\tpEntry->mfbToTx = 0;\n\tpEntry->mfb0 = 0;\n\tpEntry->mfb1 = 0;\n#endif /* MFB_SUPPORT */\n\n\tpEntry->freqOffsetValid = FALSE;\n\n#ifdef TXBF_SUPPORT\n\tTxBFInit(pAd, pEntry, supportsETxBf);\n\n\tRTMPInitTimer(pAd, &pEntry->eTxBfProbeTimer, GET_TIMER_FUNCTION(eTxBfProbeTimerExec), pEntry, FALSE);\n\tNdisAllocateSpinLock(pAd, &pEntry->TxSndgLock);\n#endif /* TXBF_SUPPORT */\n\n\tMlmeRAInit(pAd, pEntry);\n\n\t/* Set asic auto fall back */\n\tif (pAd->StaCfg.bAutoTxRateSwitch == TRUE) {\n\t\tUCHAR TableSize = 0;\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pEntry->pTable, &TableSize, &pEntry->CurrTxRateIndex);\n\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\t} else {\n\t\tpEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;\n\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\n\t\t/* If the legacy mode is set, overwrite the transmit setting of this entry. */\n\t\tRTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t}\n\n\n\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\tpEntry->Sst = SST_ASSOC;\n\tpEntry->AuthState = AS_AUTH_OPEN;\n\tpEntry->AuthMode = pAd->StaCfg.AuthMode;\n\tpEntry->WepStatus = pAd->StaCfg.WepStatus;\n\tif (pEntry->AuthMode < Ndis802_11AuthModeWPA) {\n\t\tpEntry->WpaState = AS_NOTUSE;\n\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t} else {\n\t\tpEntry->WpaState = AS_INITPSK;\n\t\tpEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t}\n\n\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\tUCHAR HashIdx = 0;\n\t\tMAC_TABLE_ENTRY *pCurrEntry = NULL;\n\t\tHashIdx = MAC_ADDR_HASH_INDEX(pAd->MlmeAux.Bssid);\n\t\tif (pAd->MacTab.Hash[HashIdx] == NULL) {\n\t\t\tpAd->MacTab.Hash[HashIdx] = pEntry;\n\t\t} else {\n\t\t\tpCurrEntry = pAd->MacTab.Hash[HashIdx];\n\t\t\twhile (pCurrEntry->pNext != NULL) {\n\t\t\t\tpCurrEntry = pCurrEntry->pNext;\n\t\t\t}\n\t\t\tpCurrEntry->pNext = pEntry;\n\t\t}\n\t\tRTMPMoveMemory(pEntry->Addr, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);\n\t\tpEntry->Aid = BSSID_WCID;\n\t\tpEntry->pAd = pAd;\n\t\tSET_ENTRY_CLIENT(pEntry);\n\t\tpAd->MacTab.Size ++;\n\t}\n\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP) {\n\t\tSendAssocIEsToWpaSupplicant(pAd->net_dev, pAd->StaCfg.ReqVarIEs,\n\t\t\t\t\t    pAd->StaCfg.ReqVarIELen);\n\n\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM,\n\t\t\t\t\tRT_ASSOC_EVENT_FLAG, NULL, NULL, 0);\n\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t{\n/*        union iwreq_data    wrqu; */\n\t\twext_notify_event_assoc(pAd->net_dev, pAd->StaCfg.ReqVarIEs,\n\t\t\t\t\tpAd->StaCfg.ReqVarIELen);\n\n\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CGIWAP, -1,\n\t\t\t\t\tpAd->MlmeAux.Bssid, NULL, 0);\n\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\tCOPY_MAC_ADDR(pEntry->HdrAddr1, pAd->MlmeAux.Bssid);\n\tCOPY_MAC_ADDR(pEntry->HdrAddr2, pAd->CurrentAddress);\n\tCOPY_MAC_ADDR(pEntry->HdrAddr3, pAd->MlmeAux.Bssid);\n#endif /* P2P_SUPPORT */\n\n\treturn TRUE;\n}\n"
  },
  {
    "path": "src/sta/auth.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tauth.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn\t\t2004-9-3\t\tporting from RT2500\n*/\n#include \"rt_config.h\"\n\n/*\n    ==========================================================================\n    Description:\n        authenticate state machine init, including state transition and timer init\n    Parameters:\n        Sm - pointer to the auth state machine\n    Note:\n        The state machine looks like this\n        \n                        AUTH_REQ_IDLE           AUTH_WAIT_SEQ2                   AUTH_WAIT_SEQ4\n    MT2_MLME_AUTH_REQ   mlme_auth_req_action    invalid_state_when_auth          invalid_state_when_auth\n    MT2_PEER_AUTH_EVEN  drop                    peer_auth_even_at_seq2_action    peer_auth_even_at_seq4_action\n    MT2_AUTH_TIMEOUT    Drop                    auth_timeout_action              auth_timeout_action\n        \n\tIRQL = PASSIVE_LEVEL\n\n    ==========================================================================\n */\n\nvoid AuthStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(Sm, Trans, MAX_AUTH_STATE, MAX_AUTH_MSG,\n\t\t\t (STATE_MACHINE_FUNC) Drop, AUTH_REQ_IDLE,\n\t\t\t AUTH_MACHINE_BASE);\n\n\t/* the first column */\n\tStateMachineSetAction(Sm, AUTH_REQ_IDLE, MT2_MLME_AUTH_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) MlmeAuthReqAction);\n\n\t/* the second column */\n\tStateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_MLME_AUTH_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenAuth);\n\tStateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_PEER_AUTH_EVEN,\n\t\t\t      (STATE_MACHINE_FUNC) PeerAuthRspAtSeq2Action);\n\tStateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_AUTH_TIMEOUT,\n\t\t\t      (STATE_MACHINE_FUNC) AuthTimeoutAction);\n\n\t/* the third column */\n\tStateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_MLME_AUTH_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) InvalidStateWhenAuth);\n\tStateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_PEER_AUTH_EVEN,\n\t\t\t      (STATE_MACHINE_FUNC) PeerAuthRspAtSeq4Action);\n\tStateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_AUTH_TIMEOUT,\n\t\t\t      (STATE_MACHINE_FUNC) AuthTimeoutAction);\n\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.AuthTimer,\n\t\t      GET_TIMER_FUNCTION(AuthTimeout), pAd, FALSE);\n}\n\n/*\n    ==========================================================================\n    Description:\n        function to be executed at timer thread when auth timer expires\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID AuthTimeout(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - AuthTimeout\\n\"));\n\n\t/* Do nothing if the driver is starting halt state. */\n\t/* This might happen when timer already been fired before cancel timer with mlmehalt */\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\treturn;\n\n\t/* send a de-auth to reset AP's state machine (Patch AP-Dir635) */\n\tif (pAd->Mlme.AuthMachine.CurrState == AUTH_WAIT_SEQ2)\n\t\tCls2errAction(pAd, pAd->MlmeAux.Bssid);\n\n\tMlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_AUTH_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID MlmeAuthReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tif (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.AuthTimer, \"AUTH\", 1, NULL, 0))\n\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2;\n\telse {\n\t\tUSHORT Status;\n\n\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\tStatus = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID PeerAuthRspAtSeq2Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM * Elem)\n{\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUSHORT Seq, Status, RemoteStatus, Alg;\n\tUCHAR iv_hdr[4];\n/*    UCHAR         ChlgText[CIPHER_TEXT_LEN]; */\n\tUCHAR *ChlgText = NULL;\n/*    UCHAR         CyperChlgText[CIPHER_TEXT_LEN + 8 + 8]; */\n\tUCHAR *CyperChlgText = NULL;\n\tULONG c_len = 0;\n\tHEADER_802_11 AuthHdr;\n\tBOOLEAN TimerCancelled;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tUSHORT Status2;\n\tUCHAR ChallengeIe = IE_CHALLENGE_TEXT;\n\tUCHAR len_challengeText = CIPHER_TEXT_LEN;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **) & ChlgText, CIPHER_TEXT_LEN);\n\tif (ChlgText == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: ChlgText Allocate memory fail!!!\\n\",\n\t\t\t  __FUNCTION__));\n\t\treturn;\n\t}\n\n\tos_alloc_mem(NULL, (UCHAR **) & CyperChlgText, CIPHER_TEXT_LEN + 8 + 8);\n\tif (CyperChlgText == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: CyperChlgText Allocate memory fail!!!\\n\",\n\t\t\t  __FUNCTION__));\n\t\tos_free_mem(NULL, ChlgText);\n\t\treturn;\n\t}\n\n\tif (PeerAuthSanity\n\t    (pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status,\n\t     (PCHAR) ChlgText)) {\n\t\tif (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 2) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"AUTH - Receive AUTH_RSP seq#2 to me (Alg=%d, Status=%d)\\n\",\n\t\t\t\t  Alg, Status));\n\t\t\tRTMPCancelTimer(&pAd->MlmeAux.AuthTimer,\n\t\t\t\t\t&TimerCancelled);\n\n\t\t\tif (Status == MLME_SUCCESS) {\n\t\t\t\t/* Authentication Mode \"LEAP\" has allow for CCX 1.X */\n\t\t\t\tif (pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen) {\n\t\t\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t\t\t\t\t    MT2_AUTH_CONF, 2, &Status,\n\t\t\t\t\t\t    0);\n\t\t\t\t} else {\n\t\t\t\t\t/* 2. shared key, need to be challenged */\n\t\t\t\t\tSeq++;\n\t\t\t\t\tRemoteStatus = MLME_SUCCESS;\n\n\t\t\t\t\t/* Get an unused nonpaged memory */\n\t\t\t\t\tNStatus =\n\t\t\t\t\t    MlmeAllocateMemory(pAd,\n\t\t\t\t\t\t\t       &pOutBuffer);\n\t\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"AUTH - PeerAuthRspAtSeq2Action() allocate memory fail\\n\"));\n\t\t\t\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\t\t\t\t\tStatus2 = MLME_FAIL_NO_RESOURCE;\n\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t\t\t\t\t\t    MT2_AUTH_CONF, 2,\n\t\t\t\t\t\t\t    &Status2, 0);\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"AUTH - Send AUTH request seq#3...\\n\"));\n\t\t\t\t\tMgtMacHeaderInit(pAd, &AuthHdr,\n\t\t\t\t\t\t\t SUBTYPE_AUTH, 0, Addr2,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t pAd->MlmeAux.Bssid);\n\t\t\t\t\tAuthHdr.FC.Wep = 1;\n\n\t\t\t\t\t/* TSC increment */\n\t\t\t\t\tINC_TX_TSC(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxTsc, LEN_WEP_TSC);\n\n\t\t\t\t\t/* Construct the 4-bytes WEP IV header */\n\t\t\t\t\tRTMPConstructWEPIVHdr(pAd->StaCfg.DefaultKeyId,\n\t\t\t\t\t\t\t      pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxTsc, iv_hdr);\n\n\t\t\t\t\tAlg = cpu2le16(*(USHORT *) & Alg);\n\t\t\t\t\tSeq = cpu2le16(*(USHORT *) & Seq);\n\t\t\t\t\tRemoteStatus = cpu2le16(*(USHORT *) &RemoteStatus);\n\n\t\t\t\t\t/* Construct message text */\n\t\t\t\t\tMakeOutgoingFrame(CyperChlgText, &c_len,\n\t\t\t\t\t\t\t  2, &Alg,\n\t\t\t\t\t\t\t  2, &Seq,\n\t\t\t\t\t\t\t  2, &RemoteStatus,\n\t\t\t\t\t\t\t  1, &ChallengeIe,\n\t\t\t\t\t\t\t  1, &len_challengeText,\n\t\t\t\t\t\t\t  len_challengeText,\n\t\t\t\t\t\t\t  ChlgText,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\t\t\tif (RTMPSoftEncryptWEP(pAd,\n\t\t\t\t\t\t\t       iv_hdr,\n\t\t\t\t\t\t\t       &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId],\n\t\t\t\t\t\t\t       CyperChlgText, c_len) == FALSE) {\n\t\t\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t\t\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\t\t\t\t\tStatus2 = MLME_FAIL_NO_RESOURCE;\n\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t\t\t\t\t\t    MT2_AUTH_CONF, 2,\n\t\t\t\t\t\t\t    &Status2, 0);\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Update the total length for 4-bytes ICV */\n\t\t\t\t\tc_len += LEN_ICV;\n\n\t\t\t\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t\t\t\t  sizeof\n\t\t\t\t\t\t\t  (HEADER_802_11),\n\t\t\t\t\t\t\t  &AuthHdr,\n\t\t\t\t\t\t\t  LEN_WEP_IV_HDR,\n\t\t\t\t\t\t\t  iv_hdr, c_len,\n\t\t\t\t\t\t\t  CyperChlgText,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\t\t\t\tRTMPSetTimer(&pAd->MlmeAux.AuthTimer, AUTH_TIMEOUT);\n\t\t\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ4;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpAd->StaCfg.AuthFailReason = Status;\n\t\t\t\tCOPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2);\n\t\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,\n\t\t\t\t\t    MT2_AUTH_CONF, 2, &Status, 0);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"AUTH - PeerAuthSanity() sanity check fail\\n\"));\n\t}\n\n      LabelOK:\n\tif (ChlgText != NULL)\n\t\tos_free_mem(NULL, ChlgText);\n\n\tif (CyperChlgText != NULL)\n\t\tos_free_mem(NULL, CyperChlgText);\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID PeerAuthRspAtSeq4Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUSHORT Alg, Seq, Status;\n/*    CHAR          ChlgText[CIPHER_TEXT_LEN]; */\n\tCHAR *ChlgText = NULL;\n\tBOOLEAN TimerCancelled;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **) & ChlgText, CIPHER_TEXT_LEN);\n\tif (ChlgText == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: ChlgText Allocate memory fail!!!\\n\",\n\t\t\t  __FUNCTION__));\n\t\treturn;\n\t}\n\n\tif (PeerAuthSanity\n\t    (pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status,\n\t     ChlgText)) {\n\t\tif (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"AUTH - Receive AUTH_RSP seq#4 to me\\n\"));\n\t\t\tRTMPCancelTimer(&pAd->MlmeAux.AuthTimer,\n\t\t\t\t\t&TimerCancelled);\n\n\t\t\tif (Status != MLME_SUCCESS) {\n\t\t\t\tpAd->StaCfg.AuthFailReason = Status;\n\t\t\t\tCOPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2);\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_SHARED_WEP_FAIL,\n\t\t\t\t\t\t      NULL, BSS0, 0);\n\t\t\t}\n\n\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF,\n\t\t\t\t    2, &Status, 0);\n\t\t}\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"AUTH - PeerAuthRspAtSeq4Action() sanity check fail\\n\"));\n\t}\n\n\tif (ChlgText != NULL)\n\t\tos_free_mem(NULL, ChlgText);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID MlmeDeauthReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tMLME_DEAUTH_REQ_STRUCT *pInfo;\n\tHEADER_802_11 DeauthHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tUSHORT Status;\n\n\tpInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"AUTH - MlmeDeauthReqAction() allocate memory fail\\n\"));\n\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\tStatus = MLME_FAIL_NO_RESOURCE;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2,\n\t\t\t    &Status, 0);\n\t\treturn;\n\t}\n#ifdef WAPI_SUPPORT\n\tWAPI_InternalCmdAction(pAd,\n\t\t\t       pAd->StaCfg.AuthMode,\n\t\t\t       BSS0, pAd->MlmeAux.Bssid, WAI_MLME_DISCONNECT);\n#endif /* WAPI_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"AUTH - Send DE-AUTH request (Reason=%d)...\\n\",\n\t\t  pInfo->Reason));\n\tMgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pInfo->Addr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->MlmeAux.Bssid);\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof (HEADER_802_11),\n\t\t\t  &DeauthHdr, 2, &pInfo->Reason, END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tpAd->StaCfg.DeauthReason = pInfo->Reason;\n\tCOPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pInfo->Addr);\n\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\tStatus = MLME_SUCCESS;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status,\n\t\t    0);\n\n\t/* send wireless event - for deauthentication */\n\tRTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, NULL, BSS0, 0);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID AuthTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - AuthTimeoutAction\\n\"));\n\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\tStatus = MLME_REJ_TIMEOUT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID InvalidStateWhenAuth(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"AUTH - InvalidStateWhenAuth (state=%ld), reset AUTH state machine\\n\",\n\t\t  pAd->Mlme.AuthMachine.CurrState));\n\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\tStatus = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);\n}\n\n/*\n    ==========================================================================\n    Description:\n        Some STA/AP\n    Note:\n        This action should never trigger AUTH state transition, therefore we\n        separate it from AUTH state machine, and make it as a standalone service\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID Cls2errAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr)\n{\n\tHEADER_802_11 DeauthHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tUSHORT Reason = REASON_CLS2ERR;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"AUTH - Class 2 error, Send DEAUTH frame...\\n\"));\n\tMgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pAddr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->MlmeAux.Bssid);\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof (HEADER_802_11),\n\t\t\t  &DeauthHdr, 2, &Reason, END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tpAd->StaCfg.DeauthReason = Reason;\n\tCOPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pAddr);\n}\n\nBOOLEAN AUTH_ReqSend(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMLME_QUEUE_ELEM pElem,\n\tIN PRALINK_TIMER_STRUCT pAuthTimer,\n\tIN PSTRING pSMName,\n\tIN USHORT SeqNo,\n\tIN PUCHAR pNewElement,\n\tIN ULONG ElementLen)\n{\n\tUSHORT Alg, Seq, Status;\n\tUCHAR Addr[6];\n\tULONG Timeout;\n\tHEADER_802_11 AuthHdr;\n\tBOOLEAN TimerCancelled;\n\tNDIS_STATUS NStatus;\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0, tmp = 0;\n\n\t/* Block all authentication request durning WPA block period */\n\tif (pAd->StaCfg.bBlockAssoc == TRUE) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"%s - Block Auth request durning WPA block period!\\n\",\n\t\t\t  pSMName));\n\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\tStatus = MLME_STATE_MACHINE_REJECT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2,\n\t\t\t    &Status, 0);\n\t} else\n\t    if (MlmeAuthReqSanity\n\t\t(pAd, pElem->Msg, pElem->MsgLen, Addr, &Timeout, &Alg)) {\n\t\t/* reset timer */\n\t\tRTMPCancelTimer(pAuthTimer, &TimerCancelled);\n\n\t\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, Addr);\n\t\tpAd->MlmeAux.Alg = Alg;\n\t\tSeq = SeqNo;\n\t\tStatus = MLME_SUCCESS;\n\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\t\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s - MlmeAuthReqAction(Alg:%d) allocate memory failed\\n\",\n\t\t\t\t  pSMName, Alg));\n\t\t\tpAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;\n\t\t\tStatus = MLME_FAIL_NO_RESOURCE;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF,\n\t\t\t\t    2, &Status, 0);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"%s - Send AUTH request seq#1 (Alg=%d)...\\n\", pSMName,\n\t\t\t  Alg));\n\t\tMgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tpAd->MlmeAux.Bssid);\n\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof (HEADER_802_11),\n\t\t\t\t  &AuthHdr, 2, &Alg, 2, &Seq, 2, &Status,\n\t\t\t\t  END_OF_ARGS);\n\n\t\tif (pNewElement && ElementLen) {\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  ElementLen, pNewElement, END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\tRTMPSetTimer(pAuthTimer, Timeout);\n\t\treturn TRUE;\n\t} else {\n\t\tDBGPRINT_ERR((\"%s - MlmeAuthReqAction() sanity check failed\\n\",\n\t\t\t      pSMName));\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n"
  },
  {
    "path": "src/sta/auth_rsp.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tauth_rsp.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn\t\t2004-10-1\t\tcopy from RT2560\n*/\n#include \"rt_config.h\"\n\n/*\n    ==========================================================================\n    Description:\n        authentication state machine init procedure\n    Parameters:\n        Sm - the state machine\n        \n\tIRQL = PASSIVE_LEVEL\n\n    ==========================================================================\n */\nVOID AuthRspStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTATE_MACHINE Sm,\n\tIN STATE_MACHINE_FUNC Trans[])\n{\n\tStateMachineInit(Sm, Trans, MAX_AUTH_RSP_STATE, MAX_AUTH_RSP_MSG,\n\t\t\t (STATE_MACHINE_FUNC) Drop, AUTH_RSP_IDLE,\n\t\t\t AUTH_RSP_MACHINE_BASE);\n\n\t/* column 1 */\n\tStateMachineSetAction(Sm, AUTH_RSP_IDLE, MT2_PEER_DEAUTH,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDeauthAction);\n\n\t/* column 2 */\n\tStateMachineSetAction(Sm, AUTH_RSP_WAIT_CHAL, MT2_PEER_DEAUTH,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDeauthAction);\n\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n*/\nVOID PeerAuthSimpleRspGenAndSend(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PHEADER_802_11 pHdr80211,\n\tIN USHORT Alg,\n\tIN USHORT Seq,\n\tIN USHORT Reason,\n\tIN USHORT Status)\n{\n\tHEADER_802_11 AuthHdr;\n\tULONG FrameLen = 0;\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\n\tif (Reason != MLME_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Peer AUTH fail...\\n\"));\n\t\treturn;\n\t}\n\n\t/*Get an unused nonpaged memory */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Send AUTH response (seq#2)...\\n\"));\n\tMgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr80211->Addr2,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\tpAd->MlmeAux.Bssid);\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof (HEADER_802_11),\n\t\t\t  &AuthHdr, 2, &Alg, 2, &Seq, 2, &Reason, END_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n*/\nVOID PeerDeauthAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PMLME_QUEUE_ELEM Elem)\n{\n\tUCHAR Addr1[MAC_ADDR_LEN];\n\tUCHAR Addr2[MAC_ADDR_LEN];\n\tUCHAR Addr3[MAC_ADDR_LEN];\n\tUSHORT Reason;\n\tBOOLEAN bDoIterate = FALSE;\n\n\tif (PeerDeauthSanity\n\t    (pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, Addr3, &Reason)) {\n\t\tif (INFRA_ON(pAd)\n\t\t    && (MAC_ADDR_EQUAL(Addr1, pAd->CurrentAddress)\n\t\t\t|| MAC_ADDR_EQUAL(Addr1, BROADCAST_ADDR))\n\t\t    && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)\n\t\t    && MAC_ADDR_EQUAL(Addr3, pAd->CommonCfg.Bssid)\n\t\t    ) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\\n\",\n\t\t\t\t  Reason));\n\n\t\t\tif (Reason == REASON_4_WAY_TIMEOUT)\n\t\t\t\tRTMPSendWirelessEvent(pAd,\n\t\t\t\t\t\t      IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG,\n\t\t\t\t\t\t      NULL, 0, 0);\n\n\t\t\tif (Reason == REASON_GROUP_KEY_HS_TIMEOUT)\n\t\t\t\tRTMPSendWirelessEvent(pAd,\n\t\t\t\t\t\t      IW_GROUP_HS_TIMEOUT_EVENT_FLAG,\n\t\t\t\t\t\t      NULL, 0, 0);\n\n#ifdef WAPI_SUPPORT\n\t\t\tWAPI_InternalCmdAction(pAd,\n\t\t\t\t\t       pAd->StaCfg.AuthMode,\n\t\t\t\t\t       BSS0,\n\t\t\t\t\t       Addr2, WAI_MLME_DISCONNECT);\n#endif /* WAPI_SUPPORT */\n\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\tRtmpOSWrielessEventSend(pAd->net_dev,\n\t\t\t\t\t\tRT_WLAN_EVENT_CGIWAP, -1, NULL,\n\t\t\t\t\t\tNULL, 0);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\t\t\t/* send wireless event - for deauthentication */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, NULL,\n\t\t\t\t\t      BSS0, 0);\n\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif ((pAd->StaCfg.WpaSupplicantUP !=\n\t\t\t     WPA_SUPPLICANT_DISABLE)\n\t\t\t    && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t\t    && (pAd->StaCfg.PortSecured ==\n\t\t\t\tWPA_802_1X_PORT_SECURED))\n\t\t\t\tpAd->StaCfg.bLostAp = TRUE;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\t\t\t/*\n\t\t\t   Some customer would set AP1 & AP2 same SSID, AuthMode & EncrypType but different WPAPSK,\n\t\t\t   therefore we need to do iterate here.\n\t\t\t */\n\t\t\tif ((pAd->StaCfg.PortSecured ==\n\t\t\t     WPA_802_1X_PORT_NOT_SECURED)\n\t\t\t    &&\n\t\t\t    ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)\n\t\t\t     || (pAd->StaCfg.AuthMode ==\n\t\t\t\t Ndis802_11AuthModeWPA2PSK))\n#ifdef WSC_STA_SUPPORT\n\t\t\t    && (pAd->StaCfg.WscControl.WscState <\n\t\t\t\tWSC_STATE_LINK_UP)\n#endif /* WSC_STA_SUPPORT */\n\t\t\t    )\n\t\t\t\tbDoIterate = TRUE;\n\n\t\t\tLinkDown(pAd, TRUE);\n\n\t\t\tif (bDoIterate) {\n\t\t\t\tpAd->MlmeAux.BssIdx++;\n\t\t\t\tIterateOnBssTab(pAd);\n\t\t\t}\n\n\t\t}\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\telse if (ADHOC_ON(pAd)\n\t\t\t && (MAC_ADDR_EQUAL(Addr1, pAd->CurrentAddress)\n\t\t\t     || MAC_ADDR_EQUAL(Addr1, BROADCAST_ADDR))) {\n\t\t\tMAC_TABLE_ENTRY *pEntry;\n\n\t\t\tpEntry = MacTableLookup(pAd, Addr2);\n\t\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t\t\t\tMacTableDeleteEntry(pAd, pEntry->Aid,\n\t\t\t\t\t\t    pEntry->Addr);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"AUTH_RSP - receive DE-AUTH from %02x:%02x:%02x:%02x:%02x:%02x \\n\",\n\t\t\t\t  PRINT_MAC(Addr2)));\n\t\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\t} else {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"AUTH_RSP - PeerDeauthAction() sanity check fail\\n\"));\n\t}\n}\n"
  },
  {
    "path": "src/sta/connect.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tconnect.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn\t\t\t2004-08-08\t\t\tMajor modification from RT2560\n*/\n#include \"rt_config.h\"\n\nUCHAR CipherSuiteWpaNoneTkip[] = {\n\t0x00, 0x50, 0xf2, 0x01,\t/* oui */\n\t0x01, 0x00,\t\t/* Version */\n\t0x00, 0x50, 0xf2, 0x02,\t/* Multicast */\n\t0x01, 0x00,\t\t/* Number of unicast */\n\t0x00, 0x50, 0xf2, 0x02,\t/* unicast */\n\t0x01, 0x00,\t\t/* number of authentication method */\n\t0x00, 0x50, 0xf2, 0x00\t/* authentication */\n};\nUCHAR CipherSuiteWpaNoneTkipLen =\n    (sizeof (CipherSuiteWpaNoneTkip) / sizeof (UCHAR));\n\nUCHAR CipherSuiteWpaNoneAes[] = {\n\t0x00, 0x50, 0xf2, 0x01,\t/* oui */\n\t0x01, 0x00,\t\t/* Version */\n\t0x00, 0x50, 0xf2, 0x04,\t/* Multicast */\n\t0x01, 0x00,\t\t/* Number of unicast */\n\t0x00, 0x50, 0xf2, 0x04,\t/* unicast */\n\t0x01, 0x00,\t\t/* number of authentication method */\n\t0x00, 0x50, 0xf2, 0x00\t/* authentication */\n};\nUCHAR CipherSuiteWpaNoneAesLen =\n    (sizeof (CipherSuiteWpaNoneAes) / sizeof (UCHAR));\n\n/* The following MACRO is called after 1. starting an new IBSS, 2. succesfully JOIN an IBSS, */\n/* or 3. succesfully ASSOCIATE to a BSS, 4. successfully RE_ASSOCIATE to a BSS */\n/* All settings successfuly negotiated furing MLME state machines become final settings */\n/* and are copied to pAd->StaActive */\n#define COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd)                                 \\\n{                                                                                       \\\n\tNdisZeroMemory((_pAd)->CommonCfg.Ssid, MAX_LEN_OF_SSID); \t\t\t\t\t\t\t\\\n\t(_pAd)->CommonCfg.SsidLen = (_pAd)->MlmeAux.SsidLen;                                \\\n\tNdisMoveMemory((_pAd)->CommonCfg.Ssid, (_pAd)->MlmeAux.Ssid, (_pAd)->MlmeAux.SsidLen); \\\n\tCOPY_MAC_ADDR((_pAd)->CommonCfg.Bssid, (_pAd)->MlmeAux.Bssid);                      \\\n\t(_pAd)->CommonCfg.Channel = (_pAd)->MlmeAux.Channel;                                \\\n\t(_pAd)->CommonCfg.CentralChannel = (_pAd)->MlmeAux.CentralChannel;                  \\\n\t(_pAd)->StaActive.Aid = (_pAd)->MlmeAux.Aid;                                        \\\n\t(_pAd)->StaActive.AtimWin = (_pAd)->MlmeAux.AtimWin;                                \\\n\t(_pAd)->StaActive.CapabilityInfo = (_pAd)->MlmeAux.CapabilityInfo;                  \\\n\t(_pAd)->StaActive.ExtCapInfo = (_pAd)->MlmeAux.ExtCapInfo;                  \\\n\t(_pAd)->CommonCfg.BeaconPeriod = (_pAd)->MlmeAux.BeaconPeriod;                      \\\n\t(_pAd)->StaActive.CfpMaxDuration = (_pAd)->MlmeAux.CfpMaxDuration;                  \\\n\t(_pAd)->StaActive.CfpPeriod = (_pAd)->MlmeAux.CfpPeriod;                            \\\n\t(_pAd)->StaActive.SupRateLen = (_pAd)->MlmeAux.SupRateLen;                          \\\n\tNdisMoveMemory((_pAd)->StaActive.SupRate, (_pAd)->MlmeAux.SupRate, (_pAd)->MlmeAux.SupRateLen);\\\n\t(_pAd)->StaActive.ExtRateLen = (_pAd)->MlmeAux.ExtRateLen;                          \\\n\tNdisMoveMemory((_pAd)->StaActive.ExtRate, (_pAd)->MlmeAux.ExtRate, (_pAd)->MlmeAux.ExtRateLen);\\\n\tNdisMoveMemory(&(_pAd)->CommonCfg.APEdcaParm, &(_pAd)->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));\\\n\tNdisMoveMemory(&(_pAd)->CommonCfg.APQosCapability, &(_pAd)->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\\\n\tNdisMoveMemory(&(_pAd)->CommonCfg.APQbssLoad, &(_pAd)->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\\\n\tCOPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].Addr, (_pAd)->MlmeAux.Bssid);      \\\n\t(_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = (_pAd)->StaCfg.PairCipher;\\\n\tCOPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.BssId, (_pAd)->MlmeAux.Bssid);\\\n\t(_pAd)->MacTab.Content[BSSID_WCID].RateLen = (_pAd)->StaActive.SupRateLen + (_pAd)->StaActive.ExtRateLen;\\\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = PASSIVE_LEVEL\n\n\t==========================================================================\n*/\nVOID MlmeCntlInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *S,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\t/* Control state machine differs from other state machines, the interface */\n\t/* follows the standard interface */\n\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID MlmeCntlMachinePerformAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *S,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tswitch (pAd->Mlme.CntlMachine.CurrState) {\n\tcase CNTL_IDLE:\n\t\tCntlIdleProc(pAd, Elem);\n\t\tbreak;\n\tcase CNTL_WAIT_DISASSOC:\n\t\tCntlWaitDisassocProc(pAd, Elem);\n\t\tbreak;\n\tcase CNTL_WAIT_JOIN:\n\t\tCntlWaitJoinProc(pAd, Elem);\n\t\tbreak;\n\n\t\t/* CNTL_WAIT_REASSOC is the only state in CNTL machine that does */\n\t\t/* not triggered directly or indirectly by \"RTMPSetInformation(OID_xxx)\". */\n\t\t/* Therefore not protected by NDIS's \"only one outstanding OID request\" */\n\t\t/* rule. Which means NDIS may SET OID in the middle of ROAMing attempts. */\n\t\t/* Current approach is to block new SET request at RTMPSetInformation() */\n\t\t/* when CntlMachine.CurrState is not CNTL_IDLE */\n\tcase CNTL_WAIT_REASSOC:\n\t\tCntlWaitReassocProc(pAd, Elem);\n\t\tbreak;\n\n\tcase CNTL_WAIT_START:\n\t\tCntlWaitStartProc(pAd, Elem);\n\t\tbreak;\n\tcase CNTL_WAIT_AUTH:\n\t\tCntlWaitAuthProc(pAd, Elem);\n\t\tbreak;\n\tcase CNTL_WAIT_AUTH2:\n\t\tCntlWaitAuthProc2(pAd, Elem);\n\t\tbreak;\n\tcase CNTL_WAIT_ASSOC:\n\t\tCntlWaitAssocProc(pAd, Elem);\n\t\tbreak;\n\n\tcase CNTL_WAIT_OID_LIST_SCAN:\n\t\tif (Elem->MsgType == MT2_SCAN_CONF) {\n\t\t\tUSHORT\tStatus = MLME_SUCCESS;\n\t\t\t\t\n\t\t\tNdisMoveMemory(&Status, Elem->Msg, sizeof(USHORT));\n\t\t\t\t\n\t\t\t/* Resume TxRing after SCANING complete. We hope the out-of-service time */\n\t\t\t/* won't be too long to let upper layer time-out the waiting frames */\n\t\t\tRTMPResumeMsduTransmission(pAd);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\n\t\t\t/* scan completed, init to not FastScan */\n\t\t\tpAd->StaCfg.bImprovedScan = FALSE;\n\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)) \n\t\t\t\t&& ((pAd->LatchRfRegs.Channel == pAd->CommonCfg.Channel) ||(pAd->LatchRfRegs.Channel == pAd->CommonCfg.CentralChannel))\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t&& (pAd->Multi_Channel_Enable == FALSE)\n#endif /* CONFIG_MULTI_CHANNEL */\n)\n\t\t\t{\n\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t\t(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\tPWR_ACTIVE);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MT2_SCAN_CONF INFRA_ON -- Send PSM Data frame for off channel RM, SCAN_IN_PROGRESS=%d!\\n\",\n\t\t\t\t\t\t\t\t\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)));\n\n\t\t\t\tOS_WAIT(20);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s -- Send null frame pAd->StaCfg.Psm=%d\\n\", __FUNCTION__,pAd->StaCfg.Psm));\n\n\t\t\t}\n\t\t\t\n\n\n#ifdef LED_CONTROL_SUPPORT\n\t\t\t/* */\n\t\t\t/* Set LED status to previous status. */\n\t\t\t/* */\n\t\t\tif (pAd->LedCntl.bLedOnScanning) {\n\t\t\t\tpAd->LedCntl.bLedOnScanning = FALSE;\n\t\t\t\tRTMPSetLED(pAd, pAd->LedCntl.LedStatus);\n\t\t\t}\n#endif /* LED_CONTROL_SUPPORT */\n\n#ifdef DOT11N_DRAFT3\n\t\t\t/* AP sent a 2040Coexistence mgmt frame, then station perform a scan, and then send back the respone. */\n\t\t\tif ((pAd->CommonCfg.BSSCoexist2040.field.InfoReq == 1)\n\t\t\t    && INFRA_ON(pAd)\n\t\t\t    && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)) {\n\t\t\t\tUpdate2040CoexistFrameAndNotify(pAd, BSSID_WCID,\n\t\t\t\t\t\t\t\tTRUE);\n\t\t\t}\n#endif /* DOT11N_DRAFT3 */\n#ifdef WPA_SUPPLICANT_SUPPORT\n\n                                if (pAd->IndicateMediaState != NdisMediaStateConnected && (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE_WITH_WEB_UI) )\n                                {\n                                        BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);\n                                        pAd->MlmeAux.BssIdx = 0;\n                                        IterateOnBssTab(pAd);\n                                }\n#endif // WPA_SUPPLICANT_SUPPORT //\n\n\n\t\t\t\tif (Status == MLME_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\t/* \n\t\t\t\t\t\t\tMaintain Scan Table \n\t\t\t\t\t\t\tMaxBeaconRxTimeDiff: 120 seconds\n\t\t\t\t\t\t\tMaxSameBeaconRxTimeCount: 1\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tMaintainBssTable(pAd, &pAd->ScanTab, 120, 2);\n\t\t\t\t\t}\n\t\t\t\t\t\n#ifdef P2P_SUPPORT\n\t\t\t\tif (!((pAd->MlmeAux.ScanType == SCAN_P2P_SEARCH) || (pAd->MlmeAux.ScanType == SCAN_P2P)))\n#endif /* P2P_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tRTMPSendWirelessEvent(pAd, IW_SCAN_COMPLETED_EVENT_FLAG, NULL, BSS0, 0);\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_SCAN, -1, NULL, NULL, 0);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t\t}\n\n#ifdef P2P_SUPPORT\n\t\t\t\tif (pAd->P2pCfg.P2pCounter.bStartScan &&\n\t\t\t\t\t((pAd->MlmeAux.ScanType == SCAN_P2P) || (pAd->MlmeAux.ScanType == SCAN_P2P_SEARCH)))\n\t\t\t\t{\n\n\t\t\t\t\tif (P2P_GO_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tP2PSetNextScanTimer(pAd, 10);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t\t\tRtmpOsMsDelay(110);\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)) \n\t\t\t\t\t\t\t&& ((pAd->LatchRfRegs.Channel == pAd->CommonCfg.Channel) ||(pAd->LatchRfRegs.Channel == pAd->CommonCfg.CentralChannel))\n\t\t\t\t\t\t\t&& (pAd->Multi_Channel_Enable == TRUE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  PWR_SAVE);\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"-- Send null frame before listen\\n\"));\n\t\t\t\t\t\t\tOS_WAIT(200);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\t\t\t\t\t\tP2PSetListenTimer(pAd, 0);\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpAd->P2pCfg.bPeriodicListen = TRUE;\n#endif /* P2P_SUPPORT */\n\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t{\n\t\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_MLME_SCAN_DONE, 0, NULL, 0);\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t}\n\t\tbreak;\n\n\tcase CNTL_WAIT_OID_DISASSOC:\n\t\tif (Elem->MsgType == MT2_DISASSOC_CONF) {\n\t\t\tLinkDown(pAd, FALSE);\n/* \nfor android system , if connect ap1 and want to change to ap2 , \nwhen disassoc from ap1 ,and send even_scan will direct connect to ap2 , not need to wait ui to scan and connect\n*/\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t}\n\t\tbreak;\n\n\tcase CNTL_WAIT_SCAN_FOR_CONNECT:\n\t\tif (Elem->MsgType == MT2_SCAN_CONF) {\n\t\t\tUSHORT\tStatus = MLME_SUCCESS;\n\t\t\tNdisMoveMemory(&Status, Elem->Msg, sizeof(USHORT));\n\t\t\t/* Resume TxRing after SCANING complete. We hope the out-of-service time */\n\t\t\t/* won't be too long to let upper layer time-out the waiting frames */\n\t\t\tRTMPResumeMsduTransmission(pAd);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\tBssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);\n\t\t\tpAd->MlmeAux.BssIdx = 0;\n\t\t\tIterateOnBssTab(pAd);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tDBGPRINT_ERR((\"!ERROR! CNTL - Illegal message type(=%ld)\",\n\t\t\t      Elem->MsgType));\n\t\tbreak;\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlIdleProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\n\t\treturn;\n\n\tswitch (Elem->MsgType) {\n\tcase OID_802_11_SSID:\n\t\tCntlOidSsidProc(pAd, Elem);\n\t\tbreak;\n\n\tcase OID_802_11_BSSID:\n\t\tCntlOidRTBssidProc(pAd, Elem);\n\t\tbreak;\n\n\tcase OID_802_11_BSSID_LIST_SCAN:\n\t\tCntlOidScanProc(pAd, Elem);\n\t\tbreak;\n\n\tcase OID_802_11_DISASSOCIATE:\n\t\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,\n\t\t\t\t REASON_DISASSOC_STA_LEAVING);\n\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,\n\t\t\t    sizeof (MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif ((pAd->StaCfg.WpaSupplicantUP & 0x7F) !=\n\t\t    WPA_SUPPLICANT_ENABLE_WITH_WEB_UI)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t{\n\t\t\t/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */\n\t\t\t/* Since calling this indicate user don't want to connect to that SSID anymore. */\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen = 32;\n\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid,\n\t\t\t\t       pAd->MlmeAux.AutoReconnectSsidLen);\n\t\t}\n\t\tbreak;\n\n\tcase MT2_MLME_ROAMING_REQ:\n\t\tCntlMlmeRoamingProc(pAd, Elem);\n\t\tbreak;\n\n\tcase OID_802_11_MIC_FAILURE_REPORT_FRAME:\n\t\tWpaMicFailureReportFrame(pAd, Elem);\n\t\tbreak;\n\n#ifdef QOS_DLS_SUPPORT\n\tcase RT_OID_802_11_SET_DLS_PARAM:\n\t\tCntlOidDLSSetupProc(pAd, Elem);\n\t\tbreak;\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\tcase RT_OID_802_11_SET_TDLS_PARAM:\n\t\tTDLS_CntlOidTDLSRequestProc(pAd, Elem);\n\t\tbreak;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\tdefault:\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"CNTL - Illegal message in CntlIdleProc(MsgType=%ld)\\n\",\n\t\t\t  Elem->MsgType));\n\t\tbreak;\n\t}\n}\n\nVOID CntlOidScanProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tMLME_SCAN_REQ_STRUCT ScanReq;\n\tULONG BssIdx = BSS_NOT_FOUND;\n/*\tBSS_ENTRY                  CurrBss; */\n\tBSS_ENTRY *pCurrBss = NULL;\n\n#ifdef RALINK_ATE\n/* Disable scanning when ATE is running. */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n#ifdef P2P_SUPPORT\n\tif (pAd->P2pCfg.P2pCounter.bStartScan == TRUE)\n\t\treturn;\n#endif /* P2P_SUPPORT */\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **) & pCurrBss, sizeof (BSS_ENTRY));\n\tif (pCurrBss == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* record current BSS if network is connected. */\n\t/* 2003-2-13 do not include current IBSS if this is the only STA in this IBSS. */\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {\n\t\tBssIdx =\n\t\t    BssSsidTableSearch(&pAd->ScanTab, pAd->CommonCfg.Bssid,\n\t\t\t\t       (PUCHAR) pAd->CommonCfg.Ssid,\n\t\t\t\t       pAd->CommonCfg.SsidLen,\n\t\t\t\t       pAd->CommonCfg.Channel);\n\t\tif (BssIdx != BSS_NOT_FOUND) {\n\t\t\tNdisMoveMemory(pCurrBss, &pAd->ScanTab.BssEntry[BssIdx],\n\t\t\t\t       sizeof (BSS_ENTRY));\n\t\t}\n\t}\n\n\n\tScanParmFill(pAd, &ScanReq, (PSTRING) Elem->Msg, Elem->MsgLen, BSS_ANY,\n\t\t     SCAN_ACTIVE);\n\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,\n\t\t    sizeof (MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\n\tif (pCurrBss != NULL)\n\t\tos_free_mem(NULL, pCurrBss);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tBefore calling this routine, user desired SSID should already been\n\t\trecorded in CommonCfg.Ssid[]\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlOidSsidProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPNDIS_802_11_SSID pOidSsid = (NDIS_802_11_SSID *) Elem->Msg;\n\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\n\n\n\t/* Step 1. record the desired user settings to MlmeAux */\n\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\tNdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength);\n\tpAd->MlmeAux.SsidLen = (UCHAR) pOidSsid->SsidLength;\n\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\tNdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);\n\tpAd->MlmeAux.BssType = pAd->StaCfg.BssType;\n\n\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\n\t/*save connect info*/\n\tNdisZeroMemory(pAd->StaCfg.ConnectinfoSsid, MAX_LEN_OF_SSID);\n\tNdisMoveMemory(pAd->StaCfg.ConnectinfoSsid, pOidSsid->Ssid, pOidSsid->SsidLength);\n\tpAd->StaCfg.ConnectinfoSsidLen = pOidSsid->SsidLength;\n\tpAd->StaCfg.ConnectinfoBssType = pAd->StaCfg.BssType;\n\t\n#ifdef WSC_STA_SUPPORT\n\t/* for M8 */\n\tNdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);\n\tNdisMoveMemory(pAd->CommonCfg.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength);\n\tpAd->CommonCfg.SsidLen = (UCHAR) pOidSsid->SsidLength;\n#endif /* WSC_STA_SUPPORT */\n\n\n\t/* Update Reconnect Ssid, that user desired to connect. */\n\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);\n\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid,\n\t\t       pAd->MlmeAux.SsidLen);\n\tpAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;\n\n\t/*\n\t\tstep 2. \n\t\tfind all matching BSS in the lastest SCAN result (inBssTab)\n\t\tand log them into MlmeAux.SsidBssTab for later-on iteration. Sort by RSSI order\n\t*/\n\tBssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab,\n\t\t\t (PCHAR) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"CntlOidSsidProc():CNTL - %d BSS of %d BSS match the desire \",\n\t\t  pAd->MlmeAux.SsidBssTab.BssNr, pAd->ScanTab.BssNr));\n\tif (pAd->MlmeAux.SsidLen == MAX_LEN_OF_SSID)\n\t\thex_dump(\"\\nSSID\", pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"(%d)SSID - %s\\n\", pAd->MlmeAux.SsidLen,\n\t\t\t  pAd->MlmeAux.Ssid));\n\n\tif (INFRA_ON(pAd) &&\n\t    OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&\n\t    (pAd->CommonCfg.SsidLen == pAd->MlmeAux.SsidBssTab.BssEntry[0].SsidLen)\n\t    && NdisEqualMemory(pAd->CommonCfg.Ssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Ssid, pAd->CommonCfg.SsidLen)\n\t    && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid)) {\n\t\t/* Case 1. already connected with an AP who has the desired SSID */\n\t\t/*         with highest RSSI */\n\n\t\t/* Add checking Mode \"LEAP\" for CCX 1.0 */\n\t\tif (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||\n\t\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#ifdef WAPI_SUPPORT\n\t\t     || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n\t\t     || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n#endif /* WAPI_SUPPORT */\n\t\t    ) &&\n\t\t    (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) {\n\t\t\t/*\n\t\t\t\tcase 1.1 For WPA, WPA-PSK, \n\t\t\t\tif port is not secured, we have to redo connection process\n\t\t\t*/\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CntlOidSsidProc():CNTL - disassociate with current AP...\\n\"));\n\t\t\tDisassocParmFill(pAd, &DisassocReq,\n\t\t\t\t\t pAd->CommonCfg.Bssid,\n\t\t\t\t\t REASON_DISASSOC_STA_LEAVING);\n\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE,\n\t\t\t\t    MT2_MLME_DISASSOC_REQ,\n\t\t\t\t    sizeof (MLME_DISASSOC_REQ_STRUCT),\n\t\t\t\t    &DisassocReq, 0);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\t} else if (pAd->bConfigChanged == TRUE) {\n\t\t\t/* case 1.2 Important Config has changed, we have to reconnect to the same AP */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CntlOidSsidProc():CNTL - disassociate with current AP Because config changed...\\n\"));\n\t\t\tDisassocParmFill(pAd, &DisassocReq,\n\t\t\t\t\t pAd->CommonCfg.Bssid,\n\t\t\t\t\t REASON_DISASSOC_STA_LEAVING);\n\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE,\n\t\t\t\t    MT2_MLME_DISASSOC_REQ,\n\t\t\t\t    sizeof (MLME_DISASSOC_REQ_STRUCT),\n\t\t\t\t    &DisassocReq, 0);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\t} else {\n\t\t\t/* case 1.3. already connected to the SSID with highest RSSI. */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CntlOidSsidProc():CNTL - already with this BSSID. ignore this SET_SSID request\\n\"));\n\t\t\t/*\n\t\t\t\t(HCT 12.1) 1c_wlan_mediaevents required\n\t\t\t\tmedia connect events are indicated when associating with the same AP\n\t\t\t*/\n\t\t\tif (INFRA_ON(pAd)) {\n\t\t\t\t/*\n\t\t\t\t\tSince MediaState already is NdisMediaStateConnected\n\t\t\t\t\tWe just indicate the connect event again to meet the WHQL required.\n\t\t\t\t*/\n\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\t\t\t\tpAd->ExtraInfo = GENERAL_LINK_UP;\t/* Update extra information to link is up */\n\t\t\t}\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\tRtmpOSWrielessEventSend(pAd->net_dev,\n\t\t\t\t\t\tRT_WLAN_EVENT_CGIWAP, -1,\n\t\t\t\t\t\t&pAd->MlmeAux.Bssid[0], NULL,\n\t\t\t\t\t\t0);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\t\t}\n\t} else if (INFRA_ON(pAd)) {\n\t\t/*\n\t\t\tFor RT61\n\t\t\t[88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: )\n\t\t\tRT61 may lost SSID, and not connect to NDTEST_WEP_AP2 and will connect to NDTEST_WEP_AP2 by Autoreconnect\n\t\t\tBut media status is connected, so the SSID not report correctly.\n\t\t*/\n\t\tif (!SSID_EQUAL(pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)) {\n\t\t\t/* Different SSID means not Roaming case, so we let LinkDown() to Indicate a disconnect event. */\n\t\t\tpAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n\t\t}\n\n\t\t/*\n\t\t\tcase 2. active INFRA association existent\n\t\t\tRoaming is done within miniport driver, nothing to do with configuration\n\t\t\tutility. so upon a new SET(OID_802_11_SSID) is received, we just\n\t\t\tdisassociate with the current associated AP,\n\t\t\tthen perform a new association with this new SSID, no matter the\n\t\t\tnew/old SSID are the same or not.\n\t\t*/\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"CntlOidSsidProc():CNTL - disassociate with current AP...\\n\"));\n\t\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,\n\t\t\t\t REASON_DISASSOC_STA_LEAVING);\n\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,\n\t\t\t    sizeof (MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (P2P_CLI_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"disassociate with current AP and P2P_CLI_ON set pAd->StaCfg.bAutoReconnect = TRUE\\n\"));\n\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t} else {\n\t\tif (ADHOC_ON(pAd)) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CntlOidSsidProc():CNTL - drop current ADHOC\\n\"));\n\t\t\tLinkDown(pAd, FALSE);\n\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t\t\tpAd->ExtraInfo = GENERAL_LINK_DOWN;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CntlOidSsidProc():NDIS_STATUS_MEDIA_DISCONNECT Event C!\\n\"));\n\t\t}\n\n\t\tif ((pAd->MlmeAux.SsidBssTab.BssNr == 0) &&\n\t\t    (pAd->StaCfg.bAutoReconnect == TRUE) &&\n\t\t    (((pAd->MlmeAux.BssType == BSS_INFRA) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))\n\t\t     || ((pAd->MlmeAux.BssType == BSS_ADHOC) && !pAd->StaCfg.bNotFirstScan))\n\t\t    && (MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen) == TRUE)\n\t\t    ) {\n\t\t\tMLME_SCAN_REQ_STRUCT ScanReq;\n\t\t\t\n\t\t\tif (pAd->MlmeAux.BssType == BSS_ADHOC)\n\t\t\t\tpAd->StaCfg.bNotFirstScan = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CntlOidSsidProc():CNTL - No matching BSS, start a new scan\\n\"));\n\n\t\t\tif((pAd->StaCfg.ConnectinfoChannel != 0) && (pAd->StaCfg.Connectinfoflag == TRUE))\n\t\t\t{\n\t\t\t\tScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,\n\t\t\t\t\tpAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);\n\t\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_FORCE_SCAN_REQ,\n\t\t\t\t\tsizeof (MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState =\tCNTL_WAIT_SCAN_FOR_CONNECT;\n\t\t\t}\n\t\t\telse\t\n\t\t\t{\n\t\t\t\tScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,\n\t\t\t\t\t     pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);\n\t\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,\n\t\t\t\t\t    sizeof (MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t\t\t}\n\t\t\t\n\t\t\t/* Reset Missed scan number */\n\t\t\tNdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);\n\t\t\tpAd->StaCfg.bNotFirstScan = TRUE;\t\t\t\t\n\t\t} else {\n#ifdef WSC_STA_SUPPORT\n#ifdef WSC_LED_SUPPORT\n\t\t\t/* LED indication. */\n\t\t\tif (pAd->MlmeAux.BssType == BSS_INFRA) {\n\t\t\t\tLEDConnectionStart(pAd);\n\t\t\t}\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\n\t\t\tif ((pAd->CommonCfg.CountryRegion & 0x7f) == REGION_33_BG_BAND)\n\t\t\t{\n\t\t\t\tBSS_ENTRY *entry;\n\t\t\t\t// TODO: shiang-6590, check this \"SavedPhyMode\"!\n\t\t\t\tentry = &pAd->MlmeAux.SsidBssTab.BssEntry[pAd->MlmeAux.BssIdx];\n\t\t\t\tif ((entry->Channel == 14) && (pAd->CommonCfg.SavedPhyMode = 0xff)) {\n\t\t\t\t\tpAd->CommonCfg.SavedPhyMode = pAd->CommonCfg.PhyMode;\n\t\t\t\t\tRTMPSetPhyMode(pAd, WMODE_B);\n\t\t\t\t} else if (pAd->CommonCfg.SavedPhyMode != 0xff) {\n\t\t\t\t\tRTMPSetPhyMode(pAd, pAd->CommonCfg.SavedPhyMode);\n\t\t\t\t\tpAd->CommonCfg.SavedPhyMode = 0xFF;\n\t\t\t\t} else {\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():SavedPhyMode=0x%x! Channel=%d\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, pAd->CommonCfg.SavedPhyMode, entry->Channel));\n\t\t\t\t}\n\t\t\t}\n\t\t\tpAd->MlmeAux.BssIdx = 0;\n\t\t\tIterateOnBssTab(pAd);\n\t\t}\n\t}\n}\n\n#ifdef WSC_STA_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWscIterate(\n\tIN PRTMP_ADAPTER pAd)\n{\n#ifdef WSC_LED_SUPPORT\n\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n\n\t/* Connect to the WPS-enabled AP by its BSSID directly. */\n\t/* Note: When WscState is equal to WSC_STATE_START, */\n\t/*       pAd->StaCfg.WscControl.WscAPBssid has been filled with valid BSSID. */\n\tif ((pAd->StaCfg.WscControl.WscState >= WSC_STATE_START) &&\n\t    (pAd->StaCfg.WscControl.WscStatus != STATUS_WSC_SCAN_AP)) {\n\t\t/* Set WSC state to WSC_STATE_START */\n\t\tpAd->StaCfg.WscControl.WscState = WSC_STATE_START;\n\t\tpAd->StaCfg.WscControl.WscStatus = STATUS_WSC_START_ASSOC;\n\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t\t\t    OID_802_11_BSSID,\n\t\t\t\t    MAC_ADDR_LEN,\n\t\t\t\t    pAd->StaCfg.WscControl.WscBssid, 0);\n\t\t} else {\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t\t\t    OID_802_11_SSID,\n\t\t\t\t    sizeof (NDIS_802_11_SSID),\n\t\t\t\t    (VOID *) & pAd->StaCfg.WscControl.WscSsid,\n\t\t\t\t    0);\n\t\t}\n\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n#ifdef WSC_LED_SUPPORT\n\t/* The protocol is connecting to a partner. */\n\tWPSLEDStatus = LED_WPS_IN_PROCESS;\n\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n}\n#endif /* WSC_STA_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlOidRTBssidProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tULONG BssIdx;\n\tPUCHAR pOidBssid = (PUCHAR) Elem->Msg;\n\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\tMLME_JOIN_REQ_STRUCT JoinReq;\n\tPBSS_ENTRY pInBss = NULL;\n\n\n#ifdef WSC_STA_SUPPORT\n\tPWSC_CTRL pWpsCtrl = &pAd->StaCfg.WscControl;\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef RALINK_ATE\n/* No need to perform this routine when ATE is running. */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n\t/* record user desired settings */\n\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, pOidBssid);\n\tpAd->MlmeAux.BssType = pAd->StaCfg.BssType;\n\n\t/*save connect info*/\n\tNdisZeroMemory(pAd->StaCfg.ConnectinfoBssid, MAC_ADDR_LEN);\n\tNdisMoveMemory(pAd->StaCfg.ConnectinfoBssid, pOidBssid, MAC_ADDR_LEN);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ANDROID IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\tpAd->StaCfg.ConnectinfoBssid[0], pAd->StaCfg.ConnectinfoBssid[1], pAd->StaCfg.ConnectinfoBssid[2],\n\t\tpAd->StaCfg.ConnectinfoBssid[3], pAd->StaCfg.ConnectinfoBssid[4], pAd->StaCfg.ConnectinfoBssid[5]));\n\n\t/* find the desired BSS in the latest SCAN result table */\n\tBssIdx = BssTableSearch(&pAd->ScanTab, pOidBssid, pAd->MlmeAux.Channel);\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS) ;\n\telse\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE) ;\n\telse\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\tif (\n#ifdef WSC_STA_SUPPORT\n\t\t(pWpsCtrl->WscConfMode == WSC_DISABLE) && \n#endif /* WSC_STA_SUPPORT */\n\t\t(BssIdx != BSS_NOT_FOUND))\n\t{\n\t\tpInBss = &pAd->ScanTab.BssEntry[BssIdx];\n\n\t\t/*\n\t\t\tIf AP's SSID has been changed, STA cannot connect to this AP.\n\t\t*/\n\t\tif (SSID_EQUAL(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, pInBss->Ssid, pInBss->SsidLen) == FALSE)\n\t\t\tBssIdx = BSS_NOT_FOUND;\n\n\t\tif (pAd->StaCfg.AuthMode <= Ndis802_11AuthModeAutoSwitch) {\n\t\t\tif (pAd->StaCfg.WepStatus != pInBss->WepStatus)\n\t\t\t\tBssIdx = BSS_NOT_FOUND;\n\t\t} else {\n\t\t\t/* Check AuthMode and AuthModeAux for matching, in case AP support dual-mode */\n\t\t\tif ((pAd->StaCfg.AuthMode != pInBss->AuthMode) &&\n\t\t\t    (pAd->StaCfg.AuthMode != pInBss->AuthModeAux))\n\t\t\t\tBssIdx = BSS_NOT_FOUND;\n\t\t}\n\t}\n\n#ifdef WSC_STA_SUPPORT\n\tif ((pWpsCtrl->WscConfMode != WSC_DISABLE) &&\n\t\t((pWpsCtrl->WscStatus == STATUS_WSC_START_ASSOC) || (pWpsCtrl->WscStatus == STATUS_WSC_LINK_UP)) &&\n\t\t(pAd->StaCfg.bSkipAutoScanConn == TRUE))\n\t\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n#endif /* WSC_STA_SUPPORT */\n\n\tif (BssIdx == BSS_NOT_FOUND) {\n\t\tif (((pAd->StaCfg.BssType == BSS_INFRA) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))) ||\n\t\t    (pAd->StaCfg.bNotFirstScan == FALSE)) {\n\t\t\tMLME_SCAN_REQ_STRUCT ScanReq;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\\n\"));\n\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\tpAd->StaCfg.bNotFirstScan = TRUE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - BSSID not found. start a new scan\\n\"));\n\n\t\t\tif((pAd->StaCfg.ConnectinfoChannel  != 0)&& (pAd->StaCfg.Connectinfoflag == TRUE))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"CntlOidRTBssidProc BSSID %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tPRINT_MAC(pAd->StaCfg.ConnectinfoBssid)));\n\t\t\t\tpAd->CommonCfg.Channel = pAd->StaCfg.ConnectinfoChannel;\n\t\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_FORCE_JOIN_REQ,\n\t\t\t\t\tsizeof (MLME_JOIN_REQ_STRUCT), &JoinReq, 0);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;\n\t\t\t}\n\t\t\telse\t{\n\t\t\t\tScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,\n\t\t\t\t     pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);\n\t\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,\n\t\t\t\t\t    sizeof (MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t\t\t}\n\t\t\t/* Reset Missed scan number */\n\t\t\tNdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMLME_START_REQ_STRUCT StartReq;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - BSSID not found. start a new ADHOC (Ssid=%s)...\\n\",\n\t\t\t\t  pAd->MlmeAux.Ssid));\n\t\t\tStartParmFill(pAd, &StartReq, (PCHAR)pAd->MlmeAux.Ssid,\n\t\t\t\t      pAd->MlmeAux.SsidLen);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,\n\t\t\t\t    sizeof (MLME_START_REQ_STRUCT), &StartReq, 0);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;\n\t\t}\n\t\treturn;\n\t}\n\n\tpInBss = &pAd->ScanTab.BssEntry[BssIdx];\n\t/* Update Reconnect Ssid, that user desired to connect. */\n\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);\n\tpAd->MlmeAux.AutoReconnectSsidLen = pInBss->SsidLen;\n\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pInBss->Ssid, pInBss->SsidLen);\n\n\n\t/* copy the matched BSS entry from ScanTab to MlmeAux.SsidBssTab. Why? */\n\t/* Because we need this entry to become the JOIN target in later on SYNC state machine */\n\tpAd->MlmeAux.BssIdx = 0;\n\tpAd->MlmeAux.SsidBssTab.BssNr = 1;\n\tNdisMoveMemory(&pAd->MlmeAux.SsidBssTab.BssEntry[0], pInBss,\n\t\t       sizeof (BSS_ENTRY));\n\n\t{\n\t\tif (INFRA_ON(pAd)) {\n\t\t\t/* disassoc from current AP first */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - disassociate with current AP ...\\n\"));\n\t\t\tDisassocParmFill(pAd, &DisassocReq,\n\t\t\t\t\t pAd->CommonCfg.Bssid,\n\t\t\t\t\t REASON_DISASSOC_STA_LEAVING);\n\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE,\n\t\t\t\t    MT2_MLME_DISASSOC_REQ,\n\t\t\t\t    sizeof (MLME_DISASSOC_REQ_STRUCT),\n\t\t\t\t    &DisassocReq, 0);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\t} else {\n\t\t\tif (ADHOC_ON(pAd)) {\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - drop current ADHOC\\n\"));\n\t\t\t\tLinkDown(pAd, FALSE);\n\t\t\t\tOPSTATUS_CLEAR_FLAG(pAd,\n\t\t\t\t\t\t    fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\t\t\tRTMP_IndicateMediaState(pAd,\n\t\t\t\t\t\t\tNdisMediaStateDisconnected);\n\t\t\t\tpAd->ExtraInfo = GENERAL_LINK_DOWN;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"NDIS_STATUS_MEDIA_DISCONNECT Event C!\\n\"));\n\t\t\t}\n\n\t\t\tpInBss = &pAd->MlmeAux.SsidBssTab.BssEntry[0];\n\n\t\t\tpAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\tpAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;\n\n\t\t\t/* Check cipher suite, AP must have more secured cipher than station setting */\n\t\t\t/* Set the Pairwise and Group cipher to match the intended AP setting */\n\t\t\t/* We can only connect to AP with less secured cipher setting */\n\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)\n\t\t\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {\n\t\t\t\tpAd->StaCfg.GroupCipher = pInBss->WPA.GroupCipher;\n\n\t\t\t\tif (pAd->StaCfg.WepStatus == pInBss->WPA.PairCipher)\n\t\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA.PairCipher;\n\t\t\t\telse if (pInBss->WPA.PairCipherAux != Ndis802_11WEPDisabled)\n\t\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA.PairCipherAux;\n\t\t\t\telse\t/* There is no PairCipher Aux, downgrade our capability to TKIP */\n\t\t\t\t\tpAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;\n\t\t\t} else\n\t\t\t    if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t\t\t|| (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) {\n\t\t\t\tpAd->StaCfg.GroupCipher = pInBss->WPA2.GroupCipher;\n\n\t\t\t\tif (pAd->StaCfg.WepStatus == pInBss->WPA2.PairCipher)\n\t\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA2.PairCipher;\n\t\t\t\telse if (pInBss->WPA2.PairCipherAux != Ndis802_11WEPDisabled)\n\t\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA2.PairCipherAux;\n\t\t\t\telse\t/* There is no PairCipher Aux, downgrade our capability to TKIP */\n\t\t\t\t\tpAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;\n\n\t\t\t\t/* RSN capability */\n\t\t\t\tpAd->StaCfg.RsnCapability = pInBss->WPA2.RsnCapability;\n\t\t\t}\n#ifdef WAPI_SUPPORT\n\t\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t\t\t || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)) {\n\t\t\t\tpAd->StaCfg.GroupCipher = pInBss->WAPI.GroupCipher;\n\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WAPI.PairCipher;\n\t\t\t}\n#endif /* WAPI_SUPPORT */\n\n\t\t\t/* Set Mix cipher flag */\n\t\t\tpAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE;\n\n\t\t\t/* No active association, join the BSS immediately */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - joining %02x:%02x:%02x:%02x:%02x:%02x ...\\n\",\n\t\t\t\t  PRINT_MAC(pOidBssid)));\n\n\t\t\tJoinParmFill(pAd, &JoinReq, pAd->MlmeAux.BssIdx);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,\n\t\t\t\t    sizeof (MLME_JOIN_REQ_STRUCT), &JoinReq, 0);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;\n\t\t}\n\t}\n}\n\n/* Roaming is the only external request triggering CNTL state machine */\n/* despite of other \"SET OID\" operation. All \"SET OID\" related oerations */\n/* happen in sequence, because no other SET OID will be sent to this device */\n/* until the the previous SET operation is complete (successful o failed). */\n/* So, how do we quarantee this ROAMING request won't corrupt other \"SET OID\"? */\n/* or been corrupted by other \"SET OID\"? */\n/* */\n/* IRQL = DISPATCH_LEVEL */\nVOID CntlMlmeRoamingProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"CNTL - Roaming in MlmeAux.RoamTab...\\n\"));\n\n\t{\n\t\t/*Let BBP register at 20MHz to do (fast) roaming. */\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\n\t\tNdisMoveMemory(&pAd->MlmeAux.SsidBssTab, &pAd->MlmeAux.RoamTab,\n\t\t\t       sizeof (pAd->MlmeAux.RoamTab));\n\t\tpAd->MlmeAux.SsidBssTab.BssNr = pAd->MlmeAux.RoamTab.BssNr;\n\n\t\tBssTableSortByRssi(&pAd->MlmeAux.SsidBssTab);\n\t\tpAd->MlmeAux.BssIdx = 0;\n\t\tIterateOnBssTab(pAd);\n\t}\n}\n\n#ifdef QOS_DLS_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlOidDLSSetupProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_802_11_DLS pDLS = (PRT_802_11_DLS) Elem->Msg;\n\tMLME_DLS_REQ_STRUCT MlmeDlsReq;\n\tINT i;\n\tUSHORT reason = REASON_UNSPECIFY;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"CNTL - (OID set %02x:%02x:%02x:%02x:%02x:%02x with Valid=%d, Status=%d, TimeOut=%d, CountDownTimer=%d)\\n\",\n\t\t  pDLS->MacAddr[0], pDLS->MacAddr[1], pDLS->MacAddr[2],\n\t\t  pDLS->MacAddr[3], pDLS->MacAddr[4], pDLS->MacAddr[5],\n\t\t  pDLS->Valid, pDLS->Status, pDLS->TimeOut,\n\t\t  pDLS->CountDownTimer));\n\n\tif (!pAd->CommonCfg.bDLSCapable)\n\t\treturn;\n\n\t/* DLS will not be supported when Adhoc mode */\n\tif (INFRA_ON(pAd)) {\n\t\tfor (i = 0; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\t\tif (pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t\t    && (pDLS->TimeOut ==\n\t\t\t\tpAd->StaCfg.DLSEntry[i].TimeOut)\n\t\t\t    && MAC_ADDR_EQUAL(pDLS->MacAddr,\n\t\t\t\t\t      pAd->StaCfg.DLSEntry[i].\n\t\t\t\t\t      MacAddr)) {\n\t\t\t\t/* 1. Same setting, just drop it */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - setting unchanged\\n\"));\n\t\t\t\tbreak;\n\t\t\t} else if (!pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t\t   && (pAd->StaCfg.DLSEntry[i].Status ==\n\t\t\t\t       DLS_FINISH)\n\t\t\t\t   && MAC_ADDR_EQUAL(pDLS->MacAddr,\n\t\t\t\t\t\t     pAd->StaCfg.DLSEntry[i].\n\t\t\t\t\t\t     MacAddr)) {\n\t\t\t\t/* 2. Disable DLS link case, just tear down DLS link */\n\t\t\t\treason = REASON_QOS_UNWANTED_MECHANISM;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - start tear down procedure\\n\"));\n\t\t\t\tbreak;\n\t\t\t} else if ((i < MAX_NUM_OF_DLS_ENTRY) && pDLS->Valid\n\t\t\t\t   && !pAd->StaCfg.DLSEntry[i].Valid) {\n\t\t\t\t/* 3. Enable case, start DLS setup procedure */\n\t\t\t\tNdisMoveMemory(&pAd->StaCfg.DLSEntry[i], pDLS,\n\t\t\t\t\t       sizeof (RT_802_11_DLS_UI));\n\n\t\t\t\t/*Update countdown timer */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer =\n\t\t\t\t    pAd->StaCfg.DLSEntry[i].TimeOut;\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_REQ,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - DLS setup case\\n\"));\n\t\t\t\tbreak;\n\t\t\t} else if ((i < MAX_NUM_OF_DLS_ENTRY) && pDLS->Valid\n\t\t\t\t   && pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t\t   && (pAd->StaCfg.DLSEntry[i].Status ==\n\t\t\t\t       DLS_FINISH)\n\t\t\t\t   && !MAC_ADDR_EQUAL(pDLS->MacAddr,\n\t\t\t\t\t\t      pAd->StaCfg.DLSEntry[i].\n\t\t\t\t\t\t      MacAddr)) {\n\t\t\t\t/* 4. update mac case, tear down old DLS and setup new DLS */\n\t\t\t\treason = REASON_QOS_UNWANTED_MECHANISM;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\tNdisMoveMemory(&pAd->StaCfg.DLSEntry[i], pDLS,\n\t\t\t\t\t       sizeof (RT_802_11_DLS_UI));\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_REQ,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - DLS tear down and restart case\\n\"));\n\t\t\t\tbreak;\n\t\t\t} else if (pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t\t   && MAC_ADDR_EQUAL(pDLS->MacAddr,\n\t\t\t\t\t\t     pAd->StaCfg.DLSEntry[i].\n\t\t\t\t\t\t     MacAddr)\n\t\t\t\t   && (pAd->StaCfg.DLSEntry[i].TimeOut !=\n\t\t\t\t       pDLS->TimeOut)) {\n\t\t\t\t/* 5. update timeout case, start DLS setup procedure (no tear down) */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].TimeOut = pDLS->TimeOut;\n\t\t\t\t/*Update countdown timer */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer =\n\t\t\t\t    pAd->StaCfg.DLSEntry[i].TimeOut;\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_REQ,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - DLS update timeout case\\n\"));\n\t\t\t\tbreak;\n\t\t\t} else if (pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t\t   && (pAd->StaCfg.DLSEntry[i].Status !=\n\t\t\t\t       DLS_FINISH)\n\t\t\t\t   && MAC_ADDR_EQUAL(pDLS->MacAddr,\n\t\t\t\t\t\t     pAd->StaCfg.DLSEntry[i].\n\t\t\t\t\t\t     MacAddr)) {\n\t\t\t\t/* 6. re-setup case, start DLS setup procedure (no tear down) */\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_REQ,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - DLS retry setup procedure\\n\"));\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN,\n\t\t\t\t\t (\"CNTL - DLS not changed in entry - %d - Valid=%d, Status=%d, TimeOut=%d\\n\",\n\t\t\t\t\t  i, pAd->StaCfg.DLSEntry[i].Valid,\n\t\t\t\t\t  pAd->StaCfg.DLSEntry[i].Status,\n\t\t\t\t\t  pAd->StaCfg.DLSEntry[i].TimeOut));\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /* QOS_DLS_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitDisassocProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tMLME_START_REQ_STRUCT StartReq;\n\n\tif (Elem->MsgType == MT2_DISASSOC_CONF) {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CNTL - Dis-associate successful\\n\"));\n\n\t\tRTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, NULL, BSS0,\n\t\t\t\t      0);\n\n\t\tLinkDown(pAd, FALSE);\n\n\t\t/* case 1. no matching BSS, and user wants ADHOC, so we just start a new one */\n\t\tif ((pAd->MlmeAux.SsidBssTab.BssNr == 0)\n\t\t    && (pAd->StaCfg.BssType == BSS_ADHOC)) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - No matching BSS, start a new ADHOC (Ssid=%s)...\\n\",\n\t\t\t\t  pAd->MlmeAux.Ssid));\n\t\t\tStartParmFill(pAd, &StartReq, (PCHAR) pAd->MlmeAux.Ssid,\n\t\t\t\t      pAd->MlmeAux.SsidLen);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,\n\t\t\t\t    sizeof (MLME_START_REQ_STRUCT), &StartReq,\n\t\t\t\t    0);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;\n\t\t}\n\t\t/* case 2. try each matched BSS */\n\t\telse {\n\t\t\t/*\n\t\t\t   Some customer would set AP1 & AP2 same SSID, AuthMode & EncrypType but different WPAPSK,\n\t\t\t   therefore we need to try next AP here.\n\t\t\t */\n\t\t\t/*pAd->MlmeAux.BssIdx = 0;*/\n\t\t\tpAd->MlmeAux.BssIdx++;\n\n#ifdef WSC_STA_SUPPORT\n\t\t\tif (pAd->StaCfg.WscControl.WscState >= WSC_STATE_START)\n\t\t\t\tCntlWscIterate(pAd);\n\t\t\telse if (((pAd->StaCfg.WscControl.bWscTrigger == FALSE)\n\t\t\t\t )\n\t\t\t\t && (pAd->StaCfg.WscControl.WscState !=\n\t\t\t\t     WSC_STATE_INIT))\n#endif /* WSC_STA_SUPPORT */\n\t\t\t\tIterateOnBssTab(pAd);\n#ifdef WSC_STA_SUPPORT\n\t\t\telse\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n#endif /* WSC_STA_SUPPORT */\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitJoinProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Reason;\n\tMLME_AUTH_REQ_STRUCT AuthReq;\n\n\tif (Elem->MsgType == MT2_JOIN_CONF) {\n\t\tNdisMoveMemory(&Reason, Elem->Msg, sizeof (USHORT));\n\t\tif (Reason == MLME_SUCCESS) {\n\t\t\t/* 1. joined an IBSS, we are pretty much done here */\n\t\t\tif (pAd->MlmeAux.BssType == BSS_ADHOC) {\n\t\t\t\t/* */\n\t\t\t\t/* 5G bands rules of Japan: */\n\t\t\t\t/* Ad hoc must be disabled in W53(ch52,56,60,64) channels. */\n\t\t\t\t/* */\n\n\t\t\t\tif ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t\t    RadarChannelCheck(pAd, pAd->CommonCfg.Channel))\n\t\t\t\t{\n\t\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"CNTL - Channel=%d, Join adhoc on W53(52,56,60,64) Channels are not accepted\\n\",\n\t\t\t\t\t\t  pAd->CommonCfg.Channel));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tLinkUp(pAd, BSS_ADHOC);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - join the IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\\n\",\n\t\t\t\t\t  PRINT_MAC(pAd->CommonCfg.Bssid)));\n\n\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\t\t\t\tpAd->ExtraInfo = GENERAL_LINK_UP;\n\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_JOIN_IBSS_FLAG, NULL, BSS0, 0);\n\t\t\t}\n\t\t\t/* 2. joined a new INFRA network, start from authentication */\n\t\t\telse\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\t/* either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first */\n\t\t\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared)\n\t\t\t\t\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch))\n\t\t\t\t\t{\n\t\t\t\t\t\tAuthParmFill(pAd, &AuthReq,\n\t\t\t\t\t\t\t     pAd->MlmeAux.Bssid,\n\t\t\t\t\t\t\t     AUTH_MODE_KEY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tAuthParmFill(pAd, &AuthReq,\n\t\t\t\t\t\t\t     pAd->MlmeAux.Bssid,\n\t\t\t\t\t\t\t     AUTH_MODE_OPEN);\n\t\t\t\t\t}\n\t\t\t\t\tMlmeEnqueue(pAd, AUTH_STATE_MACHINE,\n\t\t\t\t\t\t    MT2_MLME_AUTH_REQ,\n\t\t\t\t\t\t    sizeof(MLME_AUTH_REQ_STRUCT),\n\t\t\t\t\t\t    &AuthReq, 0);\n\t\t\t\t}\n\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* 3. failed, try next BSS */\n\t\t\tpAd->MlmeAux.BssIdx++;\n\t\t\tIterateOnBssTab(pAd);\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitStartProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Result;\n\tRT_PHY_INFO *rt_phy_info;\n\n\n\tif (Elem->MsgType == MT2_START_CONF) {\n\t\tNdisMoveMemory(&Result, Elem->Msg, sizeof (USHORT));\n\t\tif (Result == MLME_SUCCESS) {\n\t\t\t/* */\n\t\t\t/* 5G bands rules of Japan: */\n\t\t\t/* Ad hoc must be disabled in W53(ch52,56,60,64) channels. */\n\t\t\t/* */\n\n\t\t\tif ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t    RadarChannelCheck(pAd, pAd->CommonCfg.Channel)\n\t\t\t    ) {\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\\n\",\n\t\t\t\t\t  pAd->CommonCfg.Channel));\n\t\t\t\treturn;\n\t\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\trt_phy_info = &pAd->StaActive.SupportedPhyInfo;\n\t\t\tNdisZeroMemory(&rt_phy_info->MCSSet[0], 16);\n\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n\t\t\t    && (pAd->StaCfg.bAdhocN == TRUE)\n\t\t\t    && (!pAd->CommonCfg.HT_DisallowTKIP\n\t\t\t\t|| !IS_INVALID_HT_SECURITY(pAd->StaCfg.WepStatus)))\n\t\t\t{\n\t\t\t\tN_ChannelCheck(pAd);\n\t\t\t\tSetCommonHT(pAd);\n\t\t\t\tpAd->MlmeAux.CentralChannel = get_cent_ch_by_htinfo(pAd,\n\t\t\t\t\t\t\t\t\t\t\t\t&pAd->CommonCfg.AddHTInfo,\n\t\t\t\t\t\t\t\t\t\t\t\t&pAd->CommonCfg.HtCapability);\n\t\t\t\tNdisMoveMemory(&pAd->MlmeAux.AddHtInfo,\n\t\t\t\t\t       &pAd->CommonCfg.AddHTInfo,\n\t\t\t\t\t       sizeof (ADD_HT_INFO_IE));\n\t\t\t\tRTMPCheckHt(pAd, BSSID_WCID,\n\t\t\t\t\t    &pAd->CommonCfg.HtCapability,\n\t\t\t\t\t    &pAd->CommonCfg.AddHTInfo);\n\t\t\t\trt_phy_info->bHtEnable = TRUE;\n\t\t\t\tNdisMoveMemory(&rt_phy_info->MCSSet[0],\n\t\t\t\t\t       &pAd->CommonCfg.HtCapability.MCSSet[0], 16);\n\t\t\t\tCOPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);\n#ifdef DOT11_VHT_AC\n\t\t\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t\tpAd->MlmeAux.vht_cap_len) {\n\t\t\t\t\tRT_VHT_CAP *rt_vht_cap = &pAd->StaActive.SupVhtCap;\n\t\t\t\t\t\n\t\t\t\t\tCOPY_VHT_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);\n\t\t\t\t\trt_vht_cap->vht_bw = BW_80;\n\t\t\t\t\trt_vht_cap->sgi_80m = pAd->MlmeAux.vht_cap.vht_cap.sgi_80M;\n\t\t\t\t\trt_vht_cap->vht_txstbc = pAd->MlmeAux.vht_cap.vht_cap.tx_stbc;\n\t\t\t\t\trt_vht_cap->vht_rxstbc = pAd->MlmeAux.vht_cap.vht_cap.rx_stbc;\n\t\t\t\t\trt_vht_cap->vht_htc = pAd->MlmeAux.vht_cap.vht_cap.htc_vht_cap;\n\t\t\t\t}\n#endif /* DOT11_VHT_AC */\n\t\t\t}\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t{\n\t\t\t\tpAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;\n\t\t\t}\n\t\t\tpAd->StaCfg.bAdhocCreator = TRUE;\n\t\t\tLinkUp(pAd, BSS_ADHOC);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\t/* Before send beacon, driver need do radar detection */\n\n\t\t\tif ((pAd->CommonCfg.Channel > 14)\n\t\t\t    && (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t\t    && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) {\n\t\t\t\tpAd->Dot11_H.RDMode = RD_SILENCE_MODE;\n\t\t\t\tpAd->Dot11_H.RDCount = 0;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - start a new IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\\n\",\n\t\t\t\t  PRINT_MAC(pAd->CommonCfg.Bssid)));\n\n\t\t\tRTMPSendWirelessEvent(pAd, IW_START_IBSS_FLAG, NULL, BSS0, 0);\n\t\t} else {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CNTL - Start IBSS fail. BUG!!!!!\\n\"));\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitAuthProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Reason;\n\tMLME_ASSOC_REQ_STRUCT AssocReq;\n\tMLME_AUTH_REQ_STRUCT AuthReq;\n\n\tif (Elem->MsgType == MT2_AUTH_CONF) {\n\t\tNdisMoveMemory(&Reason, Elem->Msg, sizeof (USHORT));\n\t\tif (Reason == MLME_SUCCESS) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CNTL - AUTH OK\\n\"));\n\t\t\tAssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid,\n\t\t\t\t      pAd->MlmeAux.CapabilityInfo,\n\t\t\t\t      ASSOC_TIMEOUT,\n\t\t\t\t      pAd->StaCfg.DefaultListenCount);\n\n\t\t\t{\n\t\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_ASSOC_REQ,\n\t\t\t\t\t    sizeof (MLME_ASSOC_REQ_STRUCT),\n\t\t\t\t\t    &AssocReq, 0);\n\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC;\n\t\t\t}\n\t\t} else {\n\t\t\t/* This fail may because of the AP already keep us in its MAC table without */\n\t\t\t/* ageing-out. The previous authentication attempt must have let it remove us. */\n\t\t\t/* so try Authentication again may help. For D-Link DWL-900AP+ compatibility. */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - AUTH FAIL, try again...\\n\"));\n\t\t\t{\n\t\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared)\n\t\t\t\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch))\n\t\t\t\t{\n\t\t\t\t\t/* either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first */\n\t\t\t\t\tAuthParmFill(pAd, &AuthReq,\n\t\t\t\t\t\t     pAd->MlmeAux.Bssid,\n\t\t\t\t\t\t     AUTH_MODE_KEY);\n\t\t\t\t} else {\n\t\t\t\t\tAuthParmFill(pAd, &AuthReq,\n\t\t\t\t\t\t     pAd->MlmeAux.Bssid,\n\t\t\t\t\t\t     AUTH_MODE_OPEN);\n\t\t\t\t}\n\t\t\t\tMlmeEnqueue(pAd, AUTH_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_AUTH_REQ,\n\t\t\t\t\t    sizeof (MLME_AUTH_REQ_STRUCT),\n\t\t\t\t\t    &AuthReq, 0);\n\n\t\t\t}\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitAuthProc2(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Reason;\n\tMLME_ASSOC_REQ_STRUCT AssocReq;\n\tMLME_AUTH_REQ_STRUCT AuthReq;\n\n\tif (Elem->MsgType == MT2_AUTH_CONF) {\n\t\tNdisMoveMemory(&Reason, Elem->Msg, sizeof (USHORT));\n\t\tif (Reason == MLME_SUCCESS) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CNTL - AUTH OK\\n\"));\n\t\t\tAssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid,\n\t\t\t\t      pAd->MlmeAux.CapabilityInfo,\n\t\t\t\t      ASSOC_TIMEOUT,\n\t\t\t\t      pAd->StaCfg.DefaultListenCount);\n\t\t\t{\n\t\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_ASSOC_REQ,\n\t\t\t\t\t    sizeof (MLME_ASSOC_REQ_STRUCT),\n\t\t\t\t\t    &AssocReq, 0);\n\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch)\n\t\t\t\t    && (pAd->MlmeAux.Alg == Ndis802_11AuthModeShared)) {\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - AUTH FAIL, try OPEN system...\\n\"));\n\t\t\t\tAuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid,\n\t\t\t\t\t     Ndis802_11AuthModeOpen);\n\t\t\t\tMlmeEnqueue(pAd, AUTH_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_AUTH_REQ,\n\t\t\t\t\t    sizeof (MLME_AUTH_REQ_STRUCT),\n\t\t\t\t\t    &AuthReq, 0);\n\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;\n\t\t\t} else {\n\t\t\t\t/* not success, try next BSS */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - AUTH FAIL, give up; try next BSS\\n\"));\n\t\t\t\tRTMP_STA_ENTRY_MAC_RESET(pAd, BSSID_WCID);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\t\tpAd->MlmeAux.BssIdx++;\n\t\t\t\tIterateOnBssTab(pAd);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitAssocProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Reason;\n\n\tif (Elem->MsgType == MT2_ASSOC_CONF) {\n\t\tNdisMoveMemory(&Reason, Elem->Msg, sizeof (USHORT));\n\t\tif (Reason == MLME_SUCCESS) {\n\t\t\tRTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, NULL, BSS0, 0);\n\n\t\t\tLinkUp(pAd, BSS_INFRA);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - Association successful on BSS #%ld\\n\", pAd->MlmeAux.BssIdx));\n\t\t} else {\n\t\t\t/* not success, try next BSS */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - Association fails on BSS #%ld\\n\", pAd->MlmeAux.BssIdx));\n\t\t\tRTMP_STA_ENTRY_MAC_RESET(pAd, BSSID_WCID);\n\t\t\tpAd->MlmeAux.BssIdx++;\n\t\t\tIterateOnBssTab(pAd);\n\t\t}\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID CntlWaitReassocProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT Result;\n\n\tif (Elem->MsgType == MT2_REASSOC_CONF) {\n\t\tNdisMoveMemory(&Result, Elem->Msg, sizeof (USHORT));\n\t\tif (Result == MLME_SUCCESS) {\n\t\t\t/* send wireless event - for association */\n\t\t\tRTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, NULL,\n\t\t\t\t\t      BSS0, 0);\n\n\n\t\t\t/* */\n\t\t\t/* NDIS requires a new Link UP indication but no Link Down for RE-ASSOC */\n\t\t\t/* */\n\t\t\tLinkUp(pAd, BSS_INFRA);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - Re-assocition successful on BSS #%ld\\n\",\n\t\t\t\t  pAd->MlmeAux.RoamIdx));\n\t\t} else {\n\t\t\t/* reassoc failed, try to pick next BSS in the BSS Table */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - Re-assocition fails on BSS #%ld\\n\",\n\t\t\t\t  pAd->MlmeAux.RoamIdx));\n\t\t\t{\n\t\t\t\tpAd->MlmeAux.RoamIdx++;\n\t\t\t\tIterateOnBssTab2(pAd);\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID AdhocTurnOnQos(\n\tIN PRTMP_ADAPTER pAd)\n{\n#define AC0_DEF_TXOP\t\t0\n#define AC1_DEF_TXOP\t\t0\n#define AC2_DEF_TXOP\t\t94\n#define AC3_DEF_TXOP\t\t47\n\n\t/* Turn on QOs if use HT rate. */\n\tif (pAd->CommonCfg.APEdcaParm.bValid == FALSE) {\n\t\tpAd->CommonCfg.APEdcaParm.bValid = TRUE;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;\n\t\tpAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;\n\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;\n\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[0] = 10;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[1] = 6;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;\n\t\tpAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;\n\n\t\tpAd->CommonCfg.APEdcaParm.Txop[0] = 0;\n\t\tpAd->CommonCfg.APEdcaParm.Txop[1] = 0;\n\t\tpAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP;\n\t\tpAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP;\n\t}\n\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID LinkUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR BssType)\n{\n\tULONG Now;\n\tUINT32 Data;\n\tBOOLEAN Cancelled;\n\tUCHAR idx = 0;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n#ifdef WSC_STA_SUPPORT\n\tUCHAR tmpWscSsid[MAX_LEN_OF_SSID] = { 0 };\n\tUCHAR tmpWscSsidLen = 0;\n#endif /* WSC_STA_SUPPORT */\n\n\t/* Init ChannelQuality to prevent DEAD_CQI at initial LinkUp */\n\tpAd->Mlme.ChannelQuality = 50;\n\n\t/* init to not doing improved scan */\n\tpAd->StaCfg.bImprovedScan = FALSE;\n\tpAd->StaCfg.bNotFirstScan = TRUE;\n\tpAd->StaCfg.bAutoConnectByBssid = FALSE;\n\n#ifdef RTMP_MAC_USB\n\t/* Within 10 seconds after link up, don't allow to go to sleep. */\n\tpAd->CountDowntoPsm = STAY_10_SECONDS_AWAKE;\n#endif /* RTMP_MAC_USB */\n\n\n\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\n\t/* */\n\t/* ASSOC - DisassocTimeoutAction */\n\t/* CNTL - Dis-associate successful */\n\t/* !!! LINK DOWN !!! */\n\t/* [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: ) */\n\t/* */\n\t/* To prevent DisassocTimeoutAction to call Link down after we link up, */\n\t/* cancel the DisassocTimer no matter what it start or not. */\n\t/* */\n\tRTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);\n\n#ifdef WSC_STA_SUPPORT\n\ttmpWscSsidLen = pAd->CommonCfg.SsidLen;\n\tNdisMoveMemory(tmpWscSsid, pAd->CommonCfg.Ssid, tmpWscSsidLen);\n#endif /* WSC_STA_SUPPORT */\n\tCOPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);\n\n#ifdef DOT11_N_SUPPORT\n\tCOPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\t{\n\t\tPAPCLI_STRUCT pApCliEntry = NULL;\n\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\n\t\tif (P2P_GO_ON(pAd) || (pApCliEntry->Valid == TRUE))\n\t\t{\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->MlmeAux.ConCurrentCentralChannel;\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (pAd->MlmeAux.bBwFallBack == TRUE)\n\t\t\t\tpAd->StaActive.SupportedHtPhy.ChannelWidth = BW_20;\n#endif /* DOT11_N_SUPPORT */\n\t\t}\n\t}\n#endif /* P2P_SUPPORT */\n\n\tif (BssType == BSS_ADHOC) {\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);\n\n#ifdef CARRIER_DETECTION_SUPPORT\t/* Roger sync Carrier */\n\t\t/* No carrier detection when adhoc */\n\t\t/* CarrierDetectionStop(pAd); */\n\t\tpAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL;\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n\t\t    && (pAd->StaCfg.bAdhocN == TRUE))\n\t\t\tAdhocTurnOnQos(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\t\tInitChannelRelatedValue(pAd);\n\t} else {\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!!%s LINK UP !!! \\n\", (BssType == BSS_ADHOC ? \"ADHOC\" : \"Infra\")));\n\t\t\t\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\\n\",\n\t\t  BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid,\n\t\t  pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->StaCfg.BW == BW_20)\n\t{\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef DOT11_N_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! LINK UP !!! (Density =%d, )\\n\", pAd->MacTab.Content[BSSID_WCID].MpduDensity));\n#endif /* DOT11_N_SUPPORT */\n\n\t/*\n\t\tWe cannot move AsicSetBssid to PeerBeaconAtJoinAction because \n\t\tPeerBeaconAtJoinAction wouldn't be invoked in roaming case.\n\t*/\n\t\tAsicSetBssid(pAd, pAd->CommonCfg.Bssid);\n\n#ifdef STREAM_MODE_SUPPORT\n\t/*  Enable stream mode for BSSID MAC Address */\n\tpEntry->StreamModeMACReg = TX_CHAIN_ADDR1_L;\n\tAsicSetStreamMode(pAd, &pAd->CommonCfg.Bssid[0], 1, TRUE);\n#endif /* STREAM_MODE_SUPPORT */\n\n\tAsicSetSlotTime(pAd, TRUE);\n\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n\n\n\t/*\n\t\tCall this for RTS protectionfor legacy rate, we will always enable RTS threshold, \n\t\tbut normally it will not hit\n\t*/\n\tAsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE, FALSE);\n\n#ifdef DOT11_N_SUPPORT\n\tif ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) {\n\t\t/* Update HT protectionfor based on AP's operating mode. */\n\t\tif (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) {\n\t\t\tAsicUpdateProtect(pAd,\n\t\t\t\t\t  pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE,\n\t\t\t\t\t  TRUE);\n\t\t} else\n\t\t\tAsicUpdateProtect(pAd,\n\t\t\t\t\t  pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE,\n\t\t\t\t\t  FALSE);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n/*\n\tNdisZeroMemory(&pAd->DrsCounters, sizeof (COUNTER_DRS));\n*/\n\n\tNdisGetSystemUpTime(&Now);\n\tpAd->StaCfg.LastBeaconRxTime = Now;\t/* last RX timestamp */\n\n\tif ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) &&\n\t    CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo)) {\n\t\tMlmeSetTxPreamble(pAd, Rt802_11PreambleShort);\n\t}\n\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);\n\n\tpAd->Dot11_H.RDMode = RD_NORMAL_MODE;\n\n\tif (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled) \n\t{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif (pAd->StaCfg.WpaSupplicantUP &&\n\t\t    (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&\n\t\t    (pAd->StaCfg.IEEE8021X == TRUE)) ;\n\t\telse\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t{\n\t\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\tpAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t}\n\t}\n\n\tif (BssType == BSS_ADHOC) {\n\t\tMakeIbssBeacon(pAd);\n\n\t\tif ((pAd->CommonCfg.Channel > 14)\n\t\t    && (pAd->CommonCfg.bIEEE80211H == 1)\n\t\t    && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) {\n\t\t\t;\t/*Do nothing */\n\t\t} \n\t\telse\n\t\t{\n\t\t\tAsicEnableIbssSync(pAd);\n\t\t}\n\n\t\t/* In ad hoc mode, use MAC table from index 1. */\n\t\t/* p.s ASIC use all 0xff as termination of WCID table search.To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. */\n\t\tRTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);\n\t\tRTMP_IO_WRITE32(pAd, 0x1808, 0x00);\n\n\t\t/* If WEP is enabled, add key material and cipherAlg into Asic */\n\t\t/* Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) */\n\n\t\tif (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) {\n\t\t\tUCHAR CipherAlg;\n\n\t\t\tfor (idx = 0; idx < SHARE_KEY_NUM; idx++) {\n\t\t\t\tCipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;\n\n\t\t\t\tif (pAd->SharedKey[BSS0][idx].KeyLen > 0) {\n\t\t\t\t\t/* Set key material and cipherAlg to Asic */\n\t\t\t\t\tAsicAddSharedKeyEntry(pAd, BSS0, idx,\n\t\t\t\t\t\t\t      &pAd->SharedKey[BSS0][idx]);\n\n\t\t\t\t\tif (idx == pAd->StaCfg.DefaultKeyId) {\n\t\t\t\t\t\tINT cnt;\n\n\t\t\t\t\t\t/* Generate 3-bytes IV randomly for software encryption using */\n\t\t\t\t\t\tfor (cnt = 0; cnt < LEN_WEP_TSC; cnt++)\n\t\t\t\t\t\t\tpAd->SharedKey[BSS0][idx].TxTsc[cnt] = RandomByte(pAd);\n\n\t\t\t\t\t\t/* Update WCID attribute table and IVEIV table for this group key table */\n\t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\t\t\tCipherAlg,\n\t\t\t\t\t\t\t\t\tMCAST_WCID,\n\t\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t/* If WPANone is enabled, add key material and cipherAlg into Asic */\n\t\t/* Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) */\n\t\telse if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {\n\t\t\tpAd->StaCfg.DefaultKeyId = 0;\t/* always be zero */\n\n\t\t\tNdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof (CIPHER_KEY));\n\t\t\tpAd->SharedKey[BSS0][0].KeyLen = LEN_TK;\n\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TK);\n\n\t\t\tif (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) {\n\t\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,\n\t\t\t\t\t       &pAd->StaCfg.PMK[16], LEN_TKIP_MIC);\n\t\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,\n\t\t\t\t\t       &pAd->StaCfg.PMK[16], LEN_TKIP_MIC);\n\t\t\t}\n\n\t\t\t/* Decide its ChiperAlg */\n\t\t\tif (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)\n\t\t\t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;\n\t\t\telse if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n\t\t\t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;\n\t\t\telse {\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"Unknow Cipher (=%d), set Cipher to AES\\n\",\n\t\t\t\t\t  pAd->StaCfg.PairCipher));\n\t\t\t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;\n\t\t\t}\n\n\t\t\t/* Set key material and cipherAlg to Asic */\n\t\t\tAsicAddSharedKeyEntry(pAd,\n\t\t\t\t\t      BSS0, 0, &pAd->SharedKey[BSS0][0]);\n\n\t\t\t/* Update WCID attribute table and IVEIV table for this group key table */\n\t\t\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\tBSS0, 0,\n\t\t\t\t\t\tpAd->SharedKey[BSS0][0].CipherAlg, MCAST_WCID,\n\t\t\t\t\t\tSHAREDKEYTABLE);\n\t\t}\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t && (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t    ) {\n\t\t\tUSHORT Wcid = 0;\n\n\t\t\tpAd->StaCfg.DefaultKeyId = 0;\t/* always be zero */\n\n\t\t\tNdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof (CIPHER_KEY));\n\t\t\tpAd->SharedKey[BSS0][0].KeyLen = LEN_TK;\n\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TK);\n\t\t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;\n\n\t\t\t/* Generate GMK and GNonce randomly */\n\t\t\tGenRandom(pAd, pAd->CommonCfg.Bssid, pAd->StaCfg.GMK);\n\t\t\tGenRandom(pAd, pAd->CommonCfg.Bssid, pAd->StaCfg.GNonce);\n\n\t\t\t/* Derive GTK per BSSID */\n\t\t\tWpaDeriveGTK(pAd->StaCfg.GMK,\n\t\t\t\t     pAd->StaCfg.GNonce,\n\t\t\t\t     pAd->CurrentAddress,\n\t\t\t\t     pAd->StaCfg.GTK, LEN_TKIP_GTK);\n\n\t\t\tif (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) {\n\t\t\t\tNdisZeroMemory(&pAd->StaCfg.TxGTK, sizeof (CIPHER_KEY));\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.TxGTK.Key, pAd->StaCfg.GTK, LEN_TK);\n\t\t\t\tpAd->StaCfg.TxGTK.CipherAlg = CIPHER_AES;\n\t\t\t\tpAd->StaCfg.TxGTK.KeyLen = LEN_TK;\n\n\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\tGET_GroupKey_WCID(pAd, Wcid, BSS0);\n\t\t\t\tAsicAddPairwiseKeyEntry(pAd,\n\t\t\t\t\t\t\t(UCHAR) Wcid,\n\t\t\t\t\t\t\t&pAd->StaCfg.TxGTK);\n\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\t\tBSS0, 0,\n\t\t\t\t\t\t\tpAd->StaCfg.TxGTK.CipherAlg, (UCHAR) Wcid,\n\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\t\t\t}\n\t\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\t}\n\telse\n\t{\t\t/* BSS_INFRA */\n\t\t/* Check the new SSID with last SSID */\n\t\twhile (Cancelled == TRUE) {\n\t\t\tif (pAd->CommonCfg.LastSsidLen == pAd->CommonCfg.SsidLen) {\n\t\t\t\tif (RTMPCompareMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen) == 0) {\n\t\t\t\t\t/* Link to the old one no linkdown is required. */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* Send link down event before set to link up */\n\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t\t\tpAd->ExtraInfo = GENERAL_LINK_DOWN;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NDIS_STATUS_MEDIA_DISCONNECT Event AA!\\n\"));\n\t\t\tbreak;\n\t\t}\n\n\t\t/*\n\t\t\tOn WPA mode, Remove All Keys if not connect to the last BSSID\n\t\t\tKey will be set after 4-way handshake\n\t\t*/\n\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {\n\t\t\t/* Remove all WPA keys */\n#ifdef PCIE_PS_SUPPORT\n\t\t\tRTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n/*\n \t\t for dhcp,issue ,wpa_supplicant ioctl too fast , at link_up, it will add key before driver remove key  \n\t\t move to assoc.c \n */\n/*\t\t\tRTMPWPARemoveAllKeys(pAd);*/\n\t\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\tpAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\n\n#ifdef SOFT_ENCRYPT\n\t\t\t/* There are some situation to need to encryption by software\n\t\t\t   1. The Client support PMF. It shall ony support AES cipher.\n\t\t\t   2. The Client support WAPI.\n\t\t\t   If use RT3883 or later, HW can handle the above.\n\t\t\t */\n#ifdef WAPI_SUPPORT\n\t\t\tif (!(IS_HW_WAPI_SUPPORT(pAd)) \n                                && (pAd->StaCfg.WepStatus == Ndis802_11EncryptionSMS4Enabled))\n                        {\n                                CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT);\n                        }\n#endif /* WAPI_SUPPORT */\n\n\n#endif /* SOFT_ENCRYPT */\n\n\t\t}\n\n\t\t/* NOTE: */\n\t\t/* the decision of using \"short slot time\" or not may change dynamically due to */\n\t\t/* new STA association to the AP. so we have to decide that upon parsing BEACON, not here */\n\n\t\t/* NOTE: */\n\t\t/* the decision to use \"RTC/CTS\" or \"CTS-to-self\" protection or not may change dynamically */\n\t\t/* due to new STA association to the AP. so we have to decide that upon parsing BEACON, not here */\n\n\t\tComposePsPoll(pAd);\n\t\tComposeNullFrame(pAd);\n\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd))\n\t\t{\n\t\t\tAsicEnableP2PGoSync(pAd);\n\t\t\tif ((pAd->CommonCfg.Channel != pAd->P2PChannel))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel change , old channel:%d new channel:%d !! \\n\"\n\t\t\t\t\t\t\t,pAd->P2PChannel,pAd->CommonCfg.Channel));\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Old ExtCh:%d new ExtCh:%d !! \\n\"\n\t\t\t\t\t\t\t,pAd->P2PExtChOffset,pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset));\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tP2P_GoStop(pAd);\n\t\t\t\tP2P_GoStartUp(pAd, MAIN_MBSSID);\n\t\t\t}\n\t\t}\n\t\telse if (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tAsicEnableBssSync(pAd);\n\n\t\t\tif ((pAd->CommonCfg.Channel != pAd->P2PChannel)\n#ifdef CONFIG_MULTI_CHANNEL\n && (pAd->Multi_Channel_Enable == FALSE)\n#endif /* CONFIG_MULTI_CHANNEL */\n)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Channel change , old channel:%d new channel:%d !! \\n\"\n\t\t\t\t\t\t\t,pAd->P2PChannel,pAd->CommonCfg.Channel));\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Old ExtCh:%d new ExtCh:%d !! \\n\"\n\t\t\t\t\t\t\t,pAd->P2PExtChOffset,pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset));\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, 0);\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\tAsicEnableBssSync(pAd);\n\n\n\t\t/* \n\t\t\tAdd BSSID to WCID search table \n\t\t\tWe cannot move this to PeerBeaconAtJoinAction because PeerBeaconAtJoinAction wouldn't be invoked in roaming case.\n\t\t*/\t\t\n\t\tAsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid);\n\n\t\t/* If WEP is enabled, add paiewise and shared key */\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif (((pAd->StaCfg.WpaSupplicantUP) &&\n\t\t     (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&\n\t\t     (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) ||\n\t\t    ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) &&\n\t\t     (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)))\n#else\n\t\tif (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t{\n\t\t\tUCHAR CipherAlg;\n\n\t\t\tfor (idx = 0; idx < SHARE_KEY_NUM; idx++) {\n\t\t\t\tCipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;\n\n\t\t\t\tif (pAd->SharedKey[BSS0][idx].KeyLen > 0) {\n\t\t\t\t\t/* Set key material and cipherAlg to Asic */\n\t\t\t\t\tAsicAddSharedKeyEntry(pAd, BSS0, idx,\n\t\t\t\t\t\t\t      &pAd->SharedKey[BSS0][idx]);\n\n\t\t\t\t\tif (idx == pAd->StaCfg.DefaultKeyId) {\n\t\t\t\t\t\t/* STA doesn't need to set WCID attribute for group key */\n\n\t\t\t\t\t\t/* Assign pairwise key info to Asic */\n\t\t\t\t\t\tpEntry->Aid = BSSID_WCID;\n\t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\t\t\tCipherAlg,\n\t\t\t\t\t\t\t\t\tpEntry->Aid,\n\t\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/* For GUI ++ */\n\t\tif (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) \n\t\t{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (((pAd->StaCfg.WpaSupplicantUP) && (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) && (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) \n\t\t\t\t|| ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) && (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)) \n\t\t\t\t|| (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled))\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t{\n\t\t\t\tpAd->ExtraInfo = GENERAL_LINK_UP;\n\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\t\t\t}\n\t\t} else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t   (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t\t\tRTMPSetTimer(&pAd->Mlme.LinkDownTimer, LINK_DOWN_TIMEOUT);\n\n#ifdef WSC_STA_SUPPORT\n\t\t\tif (pAd->StaCfg.WscControl.WscProfileRetryTimerRunning) {\n\t\t\t\tRTMPSetTimer(&pAd->StaCfg.WscControl.WscProfileRetryTimer,\n\t\t\t\t\t     WSC_PROFILE_RETRY_TIME_OUT);\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\t\t}\n\n\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! LINK UP !!!  ClientStatusFlags=%lx)\\n\",\n\t\t\t  pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));\n\n\n#ifdef WSC_STA_SUPPORT\n\t\t/* \n\t\t   1. WSC initial connect to AP, set the correct parameters\n\t\t   2. When security of Marvell WPS AP is OPEN/NONE, Marvell AP will send EAP-Req(ID) to STA immediately.\n\t\t   STA needs to receive this EAP-Req(ID) on time, because Marvell AP will not send again after STA sends EAPOL-Start.\n\t\t */\n\t\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t    (pAd->StaCfg.WscControl.bWscTrigger\n\t\t    )) {\n\t\t\tRTMPCancelTimer(&pAd->Mlme.LinkDownTimer, &Cancelled);\n\n\t\t\tpAd->StaCfg.WscControl.WscState = WSC_STATE_LINK_UP;\n\t\t\tpAd->StaCfg.WscControl.WscStatus = WSC_STATE_LINK_UP;\n\t\t\tNdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);\n\t\t\tNdisMoveMemory(pAd->CommonCfg.Ssid, tmpWscSsid,\n\t\t\t\t       tmpWscSsidLen);\n\t\t\tpAd->CommonCfg.SsidLen = tmpWscSsidLen;\n\t\t} else\n\t\t\tWscStop(pAd,\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\t\t\t\tFALSE,\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\t\t\t&pAd->StaCfg.WscControl);\n#endif /* WSC_STA_SUPPORT */\n\n\t\tMlmeUpdateTxRates(pAd, TRUE, BSS0);\n#ifdef DOT11_N_SUPPORT\n\t\tMlmeUpdateHtTxRates(pAd, BSS0);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! LINK UP !! (StaActive.bHtEnable =%d)\\n\",\n\t\t\t  pAd->StaActive.SupportedPhyInfo.bHtEnable));\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t\tif (pEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled) {\n\t\t\tRTMPInitWapiRekeyTimerAction(pAd, pEntry);\n\t\t}\n#endif /* WAPI_SUPPORT */\n\n\t\tif (pAd->CommonCfg.bAggregationCapable) {\n\t\t\tif ((pAd->CommonCfg.bPiggyBackCapable)\n\t\t\t    && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3) {\n\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);\n\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE);\n\t\t\t\tRTMPSetPiggyBack(pAd, TRUE);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Turn on Piggy-Back\\n\"));\n\t\t\t} else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {\n\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink Aggregation\\n\"));\n\t\t\t}\n\t\t}\n\n\t\tif (pAd->MlmeAux.APRalinkIe != 0x0) {\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE)) {\n\t\t\t\tAsicEnableRDG(pAd);\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\tOPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);\n\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET);\n\t\t} else {\n\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);\n\t\t\tCLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET);\n\t\t}\n\t}\n\n#ifdef WSC_STA_SUPPORT\n#ifdef WSC_LED_SUPPORT\n\t/* LED indication. */\n\t/* LEDConnectionCompletion(pAd, TRUE); */\n\t/*If we call LEDConnectionCompletion, it will enqueue cmdthread to send asic mcu command, */\n\t/*this may be happen that sending the mcu command with LED_NORMAL_CONNECTION_WITH_SECURITY will be later than */\n\t/*sending the mcu command with LED_LINK_UP. */\n\t/*It will cause Tx power LED be unusual after scanning, since firmware only do Tx power LED in link up state. */\n\t/*if (pAd->StaCfg.WscControl.bWPSSession == FALSE) */\n\tif (pAd->StaCfg.WscControl.WscConfMode == WSC_DISABLE) {\n\t\tif (LED_MODE(pAd) == WPS_LED_MODE_9) {\t/* LED mode 9. */\n\t\t\t/* The AP uses OPEN-NONE. */\n\t\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeOpen)\n\t\t\t    && (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled)) {\n\t\t\t\tRTMPSetLED(pAd, LED_NORMAL_CONNECTION_WITHOUT_SECURITY);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"%s: LED_NORMAL_CONNECTION_WITHOUT_SECURITY\\n\",\n\t\t\t\t\t  __FUNCTION__));\n\t\t\t} else {\t/* The AP uses an encryption algorithm. */\n\n\t\t\t\tRTMPSetLED(pAd, LED_NORMAL_CONNECTION_WITH_SECURITY);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"%s: LED_NORMAL_CONNECTION_WITH_SECURITY\\n\",\n\t\t\t\t\t  __FUNCTION__));\n\t\t\t}\n\t\t}\n\t}\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\\n\",\n\t\t  pAd->CommonCfg.BACapability.word,\n\t\t  pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Set LED */\n\tRTMPSetLED(pAd, LED_LINK_UP);\n#endif /* LED_CONTROL_SUPPORT */\n\n\tpAd->Mlme.PeriodicRound = 0;\n\tpAd->Mlme.OneSecPeriodicRound = 0;\n\tpAd->bConfigChanged = FALSE;\t/* Reset config flag */\n\tpAd->ExtraInfo = GENERAL_LINK_UP;\t/* Update extra information to link is up */\n\n\t/* Set asic auto fall back */\n\t{\n\t\tUCHAR TableSize = 0;\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry,\n\t\t\t\t      &pEntry->pTable, &TableSize,\n\t\t\t\t      &pAd->CommonCfg.TxRateIndex);\n\t\tAsicUpdateAutoFallBackTable(pAd, pEntry->pTable);\n\t}\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\tpEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;\n\tpEntry->MaxHTPhyMode.word = pAd->StaCfg.HTPhyMode.word;\n\tif (pAd->StaCfg.bAutoTxRateSwitch == FALSE) {\n\t\tpEntry->bAutoTxRateSwitch = FALSE;\n#ifdef DOT11_N_SUPPORT\n\t\tif (pEntry->HTPhyMode.field.MCS == 32)\n\t\t\tpEntry->HTPhyMode.field.ShortGI = GI_800;\n\n\t\tif ((pEntry->HTPhyMode.field.MCS > MCS_7)\n\t\t    || (pEntry->HTPhyMode.field.MCS == 32))\n\t\t\tpEntry->HTPhyMode.field.STBC = STBC_NONE;\n#endif /* DOT11_N_SUPPORT */\n\t\t/* If the legacy mode is set, overwrite the transmit setting of this entry. */\n\t\tif (pEntry->HTPhyMode.field.MODE <= MODE_OFDM)\n\t\t\tRTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t} else\n\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\t/*  Let Link Status Page display first initial rate. */\n\tpAd->LastTxRate = (USHORT) (pEntry->HTPhyMode.word);\n\n\t/* Select DAC according to HT or Legacy */\n\tif (pAd->StaActive.SupportedPhyInfo.MCSSet[0] != 0x00)\n\t{\n\t\t{\n\t\t\tif (pAd->Antenna.field.TxPath >= 2)\n\t\t\t\trtmp_bbp_set_txdac(pAd, 2);\n\t\t\telse\n\t\t\t\trtmp_bbp_set_txdac(pAd, 0);\n\t\t}\n\t} else {\n\t\trtmp_bbp_set_txdac(pAd, 0);\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\tif ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) {\n\t\tif (pEntry->MaxRAmpduFactor == 0) {\n\t\t\t/* If HT AP doesn't support MaxRAmpduFactor = 1, we need to set max PSDU to 0. */\n\t\t\t/* Because our Init value is 1 at MACRegTable. */\n\t\t\tRTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x000A0fff);\t/* Default set to 0x1fff. But if one peer can't support 0x1fff, we need to change to 0xfff */\n\t\t} else if (pEntry->MaxRAmpduFactor == 1) {\n\t\t\tRTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x000A1fff);\n\t\t} else if (pEntry->MaxRAmpduFactor == 2) {\n\t\t\tRTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x000A2fff);\n\t\t} else if (pEntry->MaxRAmpduFactor == 3) {\n\t\t\tRTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x000A3fff);\n\t\t}\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"!!!MaxRAmpduFactor= %d \\n\",\n\t\t\t  pEntry->MaxRAmpduFactor));\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable */\n\t/* if 1. Legacy AP WMM on,  or 2. 11n AP, AMPDU disable.  Force turn off burst no matter what bEnableTxBurst is. */\n#ifdef DOT11_N_SUPPORT\n\tif (!((pAd->CommonCfg.RxStream == 1) && (pAd->CommonCfg.TxStream == 1))\n\t    && (pAd->StaCfg.bForceTxBurst == FALSE)\n\t    &&\n\t    (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)\n\t      && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))\n\t     || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)\n\t\t && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))) {\n\t\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\t\tData &= 0xFFFFFF00;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n\n#ifndef RLT_MAC\n\t\tRTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);\n#endif\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Txburst 1\\n\"));\n\t} else\n#endif /* DOT11_N_SUPPORT */\n\tif (pAd->CommonCfg.bEnableTxBurst) {\n\t\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\t\tData &= 0xFFFFFF00;\n\t\tData |= 0x60;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n\t\tpAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE;\n#ifdef RTMP_MAC\n\t\tRTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F);\n#endif\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Txburst 2\\n\"));\n\t} else {\n\t\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);\n\t\tData &= 0xFFFFFF00;\n\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);\n#ifdef RTMP_MAC\n\t\tRTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);\n#endif\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Txburst 3\\n\"));\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\t/* Re-check to turn on TX burst or not. */\n\tif ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE)\n\t    && ((STA_WEP_ON(pAd)) || (STA_TKIP_ON(pAd)))) {\n\t\tpAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE;\n\t\tif (pAd->CommonCfg.bEnableTxBurst) {\n\t\t\tUINT32 MACValue = 0;\n\t\t\t/* Force disable TXOP value in this case. The same action in MLMEUpdateProtect too */\n\t\t\t/* I didn't change PBF_MAX_PCNT setting. */\n\t\t\tRTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue);\n\t\t\tMACValue &= 0xFFFFFF00;\n\t\t\tRTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue);\n\t\t\tpAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;\n\t\t}\n\t} else {\n\t\tpAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tpAd->CommonCfg.IOTestParm.bLastAtheros = FALSE;\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t/*\n\t   If STA connects to different AP, STA couldn't send EAPOL_Start for WpaSupplicant.\n\t */\n\tif ((pAd->StaCfg.BssType == BSS_INFRA) &&\n\t    (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) &&\n\t    (NdisEqualMemory(pAd->CommonCfg.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN) == FALSE) &&\n\t     (pAd->StaCfg.bLostAp == TRUE)) {\n\t\tpAd->StaCfg.bLostAp = FALSE;\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t/*\n\t   Need to check this COPY. This COPY is from Windows Driver.\n\t */\n\n\tCOPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"!!!pAd->bNextDisableRxBA= %d \\n\",\n\t\t  pAd->CommonCfg.IOTestParm.bNextDisableRxBA));\n\t/* BSSID add in one MAC entry too.  Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap */\n\t/* Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver. */\n\t/* Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same. */\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\tpEntry->PortSecured = pAd->StaCfg.PortSecured;\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\t/* */\n\t/* Patch Atheros AP TX will breakdown issue. */\n\t/* AP Model: DLink DWL-8200AP */\n\t/* */\n\tif (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)\n\t    && STA_TKIP_ON(pAd)) {\n\t\tRTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x01);\n\t} else {\n\t\tRTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x00);\n\t}\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);\n\t/*RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW); */\n\n#ifdef WSC_STA_SUPPORT\n\t/* WSC initial connect to AP, jump to Wsc start action and set the correct parameters */\n\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t    (pAd->StaCfg.WscControl.bWscTrigger\n\t    )) {\n\t\tRTMPusecDelay(100000);\t/* 100 ms */\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\t\tNdisMoveMemory(pAd->StaCfg.WscControl.WscPeerMAC,\n\t\t\t\t       pAd->CommonCfg.Bssid, MAC_ADDR_LEN);\n\t\t\tNdisMoveMemory(pAd->StaCfg.WscControl.EntryAddr,\n\t\t\t\t       pAd->CommonCfg.Bssid, MAC_ADDR_LEN);\n\t\t\tWscSendEapolStart(pAd,\n\t\t\t\t\t  pAd->StaCfg.WscControl.WscPeerMAC, STA_MODE);\n\t\t}\n\t}\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tif (INFRA_ON(pAd)) {\n\t\tif ((pAd->CommonCfg.bBssCoexEnable == TRUE)\n\t\t    && (pAd->CommonCfg.Channel <= 14)\n\t\t    && (pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)\n\t\t    && (pAd->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport == 1)) {\n\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_SCAN_2040);\n\t\t\tBuildEffectedChannelList(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"LinkUP AP supports 20/40 BSS COEX, Dot11BssWidthTriggerScanInt[%d]\\n\",\n\t\t\t\t  pAd->CommonCfg.Dot11BssWidthTriggerScanInt));\n\t\t} else {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"not supports 20/40 BSS COEX !!! \\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"pAd->CommonCfg Info: bBssCoexEnable=%d, Channel=%d, CentralChannel=%d, PhyMode=%d\\n\",\n\t\t\t\t\tpAd->CommonCfg.bBssCoexEnable, pAd->CommonCfg.Channel,\n\t\t\t\t\tpAd->CommonCfg.CentralChannel, pAd->CommonCfg.PhyMode));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"pAd->StaActive.SupportedHtPhy.bHtEnable=%d\\n\",\n\t\t\t\t  pAd->StaActive.SupportedPhyInfo.bHtEnable));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"pAd->MlmeAux.ExtCapInfo.BssCoexstSup=%d\\n\",\n\t\t\t\t  pAd->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport));\n\t\t}\n\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t/*\n\t   When AuthMode is WPA2-Enterprise and AP reboot or STA lost AP, \n\t   WpaSupplicant would not send EapolStart to AP after STA re-connect to AP again.\n\t   In this case, driver would send EapolStart to AP.\n\t */\n\tif ((pAd->StaCfg.BssType == BSS_INFRA) &&\n\t    (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) &&\n\t    (NdisEqualMemory\n\t     (pAd->CommonCfg.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN))\n\t    && (pAd->StaCfg.bLostAp == TRUE)) {\n\t\tWpaSendEapolStart(pAd, pAd->CommonCfg.Bssid);\n\t\tpAd->StaCfg.bLostAp = FALSE;\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef CONFIG_MULTI_CHANNEL\nif (pAd->Multi_Channel_Enable == TRUE)\n\tRtmpPrepareHwNullFrame(pAd,\n\t\t\t\t\t\t&pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\tPWR_SAVE,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef MT7601\n\tif ( IS_MT7601(pAd) )\n\t{\n#ifdef DPD_CALIBRATION_SUPPORT\n\t\t/* DPD-Calibration */\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"TX DPD Calibration\\n\"));\n\t\tAndesCalibrationOP(pAd, ANDES_CALIBRATION_DPD, pAd->chipCap.CurrentTemperature);\n#endif /* DPD_CALIBRATION_SUPPORT */\n\n\t\t// MT7601_RXDC_CAL\n\t\tMT7601_RXDC_CAL(pAd);\n \t}\n#endif /* MT7601 */\n\n\tpAd->MacTab.MsduLifeTime = 5; /* default 5 seconds */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t{\n\t\tRTMP_IO_READ32(pAd, WMM_CTRL, &Data);\n\t\tData &= 0x7fffffff;/* bit 31 set to 0 */\t/*  WMM Channel switch to EDCA1 */\n\t\tRTMP_IO_WRITE32(pAd, WMM_CTRL, Data);\n\n\t\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t    (pAd->StaCfg.WscControl.bWscTrigger\n\t\t    )) \n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"WSC trigger not set Multi-channel!!\\n\"));\n\t\t}\n\t\telse if (P2P_CLI_ON(pAd)  \n\t\t\t&& pEntry->PortSecured == WPA_802_1X_PORT_SECURED\n\t\t\t&& pEntry->WepStatus == Ndis802_11WEPDisabled)\n\t\t{\n\t\t\tRTMPSetTimer(&pAd->Mlme.MCCTimer, pAd->Mlme.EDCAToHCCATimerValue);\n\t\t}\n\t\tpAd->Mlme.StaStayTick = 0;\n\t\tif (P2P_CLI_ON(pAd))\n\t\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tpAd->CommonCfg.MO_Cfg.bEnable = TRUE;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n}\n\n\n/*\n\t==========================================================================\n\n\tRoutine\tDescription:\n\t\tDisconnect current BSSID\n\n\tArguments:\n\t\tpAd\t\t\t\t- Pointer to our adapter\n\t\tIsReqFromAP\t\t- Request from AP\n\t\t\n\tReturn Value:\t\t\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\n\tNote:\n\t\tWe need more information to know it's this requst from AP.\n\t\tIf yes! we need to do extra handling, for example, remove the WPA key.\n\t\tOtherwise on 4-way handshaking will faied, since the WPA key didn't be\n\t\tremove while auto reconnect.\n\t\tDisconnect request from AP, it means we will start afresh 4-way handshaking \n\t\ton WPA mode.\n\n\t==========================================================================\n*/\nVOID LinkDown(\n\tIN PRTMP_ADAPTER pAd,\n\tIN BOOLEAN IsReqFromAP)\n{\n\tUCHAR i;\n\n\t/* Do nothing if monitor mode is on */\n\tif (MONITOR_ON(pAd))\n\t\treturn;\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\tMultiChannelTimerStop(pAd);\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\n#ifdef RALINK_ATE\n\t/* Nothing to do in ATE mode. */\n\tif (ATE_ON(pAd))\n\t\treturn;\n#endif /* RALINK_ATE */\n\n#ifdef PCIE_PS_SUPPORT\n\t/* Not allow go to sleep within linkdown function. */\n\tRTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n\n\n\tRTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, NULL, BSS0, 0);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! LINK DOWN !!!\\n\"));\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);\n\n#ifdef WIFI_P2P_CONCURRENT_FAST_SCAN\n    /* reset to not doing improved scan when both STA & P2P are LinkDown */\n    if (!P2P_GO_ON(pAd) && !P2P_CLI_ON(pAd))\n        pAd->StaCfg.bImprovedScan = FALSE;\n#else\n\t/* reset to not doing improved scan */\n\tpAd->StaCfg.bImprovedScan = FALSE;\n#endif\n\n#ifdef PCIE_PS_SUPPORT\n\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) {\n\t\tBOOLEAN Cancelled;\n\t\tpAd->Mlme.bPsPollTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);\n\t}\n\n\tpAd->bPCIclkOff = FALSE;\n#endif /* PCIE_PS_SUPPORT */\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)\n/*||\tRTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND) */\n\t    || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) {\n\t\tAUTO_WAKEUP_STRUC AutoWakeupCfg;\n\t\tAsicForceWakeup(pAd, TRUE);\n\t\tAutoWakeupCfg.word = 0;\n\t\tRTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);\n\t}\n\n\tif (ADHOC_ON(pAd)) {\t/* Adhoc mode link down */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! LINK DOWN 1!!!\\n\"));\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\t/* In an IBSS, a STA's SME responds to Deauthenticate frames from a STA by */\n\t\t/* deleting the PTKSA associated with that STA. (Spec. P802.11i/D10 P.19) */\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) {\n\t\t\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {\n\t\t\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))\n\t\t\t\t\tMlmeDeAuthAction(pAd,\n\t\t\t\t\t\t\t &pAd->MacTab.\n\t\t\t\t\t\t\t Content[i],\n\t\t\t\t\t\t\t REASON_DEAUTH_STA_LEAVING,\n\t\t\t\t\t\t\t FALSE);\n\t\t\t}\n\t\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t\tpAd->ExtraInfo = GENERAL_LINK_DOWN;\n\t\tBssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid,\n\t\t\t\t    pAd->CommonCfg.Channel);\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"!!! MacTab.Size=%d !!!\\n\", pAd->MacTab.Size));\n\t} else {\t\t/* Infra structure mode */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! LINK DOWN 2!!!\\n\"));\n\n#ifdef QOS_DLS_SUPPORT\n\t\t/* DLS tear down frame must be sent before link down */\n\t\t/* send DLS-TEAR_DOWN message */\n\t\tif (pAd->CommonCfg.bDLSCapable) {\n\t\t\t/* tear down local dls table entry */\n\t\t\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t\t    && (pAd->StaCfg.DLSEntry[i].Status ==\n\t\t\t\t\tDLS_FINISH)) {\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status =\n\t\t\t\t\t    DLS_NONE;\n\t\t\t\t\tRTMPSendDLSTearDownFrame(pAd,\n\t\t\t\t\t\t\t\t pAd->StaCfg.\n\t\t\t\t\t\t\t\t DLSEntry[i].\n\t\t\t\t\t\t\t\t MacAddr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* tear down peer dls table entry */\n\t\t\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY;\n\t\t\t     i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) {\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (IS_TDLS_SUPPORT(pAd)) {\n\t\t\tTDLS_LinkTearDown(pAd, TRUE);\n\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\n\n\t\t/* Saved last SSID for linkup comparison */\n\t\tpAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen;\n\t\tNdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid,\n\t\t\t       pAd->CommonCfg.LastSsidLen);\n\t\tCOPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);\n\t\tif (pAd->MlmeAux.CurrReqIsFromNdis == TRUE) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"NDIS_STATUS_MEDIA_DISCONNECT Event A!\\n\"));\n\t\t\tpAd->MlmeAux.CurrReqIsFromNdis = FALSE;\n\t\t} else {\n\t\t\tif ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)\n\t\t\t    || (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)) {\n\t\t\t\t/* */\n\t\t\t\t/* If disassociation request is from NDIS, then we don't need to delete BSSID from entry. */\n\t\t\t\t/* Otherwise lost beacon or receive De-Authentication from AP, */\n\t\t\t\t/* then we should delete BSSID from BssTable. */\n\t\t\t\t/* If we don't delete from entry, roaming will fail. */\n\t\t\t\t/* */\n\t\t\t\tBssTableDeleteEntry(&pAd->ScanTab,\n\t\t\t\t\t\t    pAd->CommonCfg.Bssid,\n\t\t\t\t\t\t    pAd->CommonCfg.Channel);\n\t\t\t}\n\t\t}\n\n\t\t/* restore back to - */\n\t\t/*      1. long slot (20 us) or short slot (9 us) time */\n\t\t/*      2. turn on/off RTS/CTS and/or CTS-to-self protection */\n\t\t/*      3. short preamble */\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t/* Country IE of the AP will be evaluated and will be used. */\n\t\tif (pAd->StaCfg.IEEE80211dClientMode != Rt802_11_D_None) {\n\t\t\tNdisMoveMemory(&pAd->CommonCfg.CountryCode[0],\n\t\t\t\t       &pAd->StaCfg.StaOriCountryCode[0], 2);\n\t\t\tpAd->CommonCfg.Geography = pAd->StaCfg.StaOriGeography;\n\t\t\tBuildChannelListEx(pAd);\n\t\t}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n\t}\n\n#ifdef WAPI_SUPPORT\n\tif (pAd->StaCfg.WepStatus == Ndis802_11EncryptionSMS4Enabled) {\n\t\t/* Clear Replay counter */\n\t\t/*NdisZeroMemory(pAd->StaCfg.rx_iv, LEN_WAPI_TSC); */\n\n\t\t/* Cancel rekey timer */\n\t\tRTMPCancelWapiRekeyTimerAction(pAd,\n\t\t\t\t\t       &pAd->MacTab.\n\t\t\t\t\t       Content[BSSID_WCID]);\n\t}\n#endif /* WAPI_SUPPORT */\n\n\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {\n\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i])\n#ifdef P2P_SUPPORT\n\t\t\t&& (!IS_P2P_GO_ENTRY(&pAd->MacTab.Content[i]))\n#endif /* P2P_SUPPORT */\n\t\t\t)\n\t\t\tMacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid,\n\t\t\t\t\t    pAd->MacTab.Content[i].Addr);\n\t}\n\n\tAsicSetSlotTime(pAd, TRUE);\t/*FALSE); */\n#ifdef P2P_SUPPORT\n\tif ((!P2P_GO_ON(pAd)) && (!P2P_CLI_ON(pAd)))\n#endif /* P2P_SUPPORT */\n\tAsicSetEdcaParm(pAd, NULL);\n\n#ifdef LED_CONTROL_SUPPORT\n\t/* Set LED */\n\tRTMPSetLED(pAd, LED_LINK_DOWN);\n\tpAd->LedCntl.LedIndicatorStrength = 0xF0;\n\tRTMPSetSignalLED(pAd, -100);\t/* Force signal strength Led to be turned off, firmware is not done it. */\n#endif /* LED_CONTROL_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (!P2P_GO_ON(pAd))\n#endif /* P2P_SUPPORT */\n\t\tAsicDisableSync(pAd);\n\n\tpAd->Mlme.PeriodicRound = 0;\n\tpAd->Mlme.OneSecPeriodicRound = 0;\n\n#ifdef DOT11_N_SUPPORT\n\tNdisZeroMemory(&pAd->MlmeAux.HtCapability, sizeof (HT_CAPABILITY_IE));\n\tNdisZeroMemory(&pAd->MlmeAux.AddHtInfo, sizeof (ADD_HT_INFO_IE));\n\tpAd->MlmeAux.HtCapabilityLen = 0;\n\tpAd->MlmeAux.NewExtChannelOffset = 0xff;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"LinkDownCleanMlmeAux.ExtCapInfo!\\n\"));\n\tNdisZeroMemory((PUCHAR) (&pAd->MlmeAux.ExtCapInfo),\n\t\t       sizeof (EXT_CAP_INFO_ELEMENT));\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Reset WPA-PSK state. Only reset when supplicant enabled */\n\tif (pAd->StaCfg.WpaState != SS_NOTUSE) {\n\t\tpAd->StaCfg.WpaState = SS_START;\n\t\t/* Clear Replay counter */\n\t\tNdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);\n\n#ifdef QOS_DLS_SUPPORT\n\t\tif (pAd->CommonCfg.bDLSCapable)\n\t\t\tNdisZeroMemory(pAd->StaCfg.DlsReplayCounter, 8);\n#endif /* QOS_DLS_SUPPORT */\n\t}\n\n\t/* */\n\t/* if link down come from AP, we need to remove all WPA keys on WPA mode. */\n\t/* otherwise will cause 4-way handshaking failed, since the WPA key not empty. */\n\t/* */\n\tif ((IsReqFromAP) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) {\n\t\t/* Remove all WPA keys */\n\t\tRTMPWPARemoveAllKeys(pAd);\n\t}\n\n\t/* 802.1x port control */\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t/* Prevent clear PortSecured here with static WEP */\n\t/* NetworkManger set security policy first then set SSID to connect AP. */\n\tif (pAd->StaCfg.WpaSupplicantUP &&\n\t    (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&\n\t    (pAd->StaCfg.IEEE8021X == FALSE)) {\n\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n\t} else\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t{\n\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\tpAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t}\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\tNdisZeroMemory(&pAd->MacTab.Content[BSSID_WCID], sizeof(MAC_TABLE_ENTRY));\n\tpAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured;\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\tpAd->StaCfg.MicErrCnt = 0;\n\n\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t/* Update extra information to link is up */\n\tpAd->ExtraInfo = GENERAL_LINK_DOWN;\n\n\tpAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;\n\n#ifdef RTMP_MAC_USB\n\tpAd->bUsbTxBulkAggre = FALSE;\n#endif /* RTMP_MAC_USB */\n\n\t/* Clean association information */\n\tNdisZeroMemory(&pAd->StaCfg.AssocInfo,\n\t\t       sizeof (NDIS_802_11_ASSOCIATION_INFORMATION));\n\tpAd->StaCfg.AssocInfo.Length =\n\t    sizeof (NDIS_802_11_ASSOCIATION_INFORMATION);\n\tpAd->StaCfg.ReqVarIELen = 0;\n\tpAd->StaCfg.ResVarIELen = 0;\n\n\n\t/* Reset RSSI value after link down */\n\tNdisZeroMemory((PUCHAR) (&pAd->StaCfg.RssiSample),\n\t\t       sizeof (pAd->StaCfg.RssiSample));\n\n\t/* Restore MlmeRate */\n\tpAd->CommonCfg.MlmeRate = pAd->CommonCfg.BasicMlmeRate;\n\tpAd->CommonCfg.RtsRate = pAd->CommonCfg.BasicMlmeRate;\n\n#ifdef DOT11_N_SUPPORT\n\t// TODO: shiang-6590, why we need to fallback to BW_20 here? How about the BW_10?\n\tif (pAd->CommonCfg.BBPCurrentBW != BW_20) {\n#ifdef P2P_SUPPORT\n\t\tPAPCLI_STRUCT pApCliEntry = NULL;\n\t\t\t\t\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\t\t\n\t\tif (!P2P_GO_ON(pAd) && (pApCliEntry->Valid == FALSE))\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t{\n\t\t/* Reset DAC */\n\t\t{\n\t\t\tif (pAd->Antenna.field.TxPath >= 2)\n\t\t\t\trtmp_bbp_set_txdac(pAd, 2);\n\t\t\telse\n\t\t\t\trtmp_bbp_set_txdac(pAd, 0);\n\t\t}\n\t}\n\n\t/* After Link down, reset piggy-back setting in ASIC. Disable RDG. */\n\tRTMPSetPiggyBack(pAd, FALSE);\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);\n\n#ifdef DOT11_N_SUPPORT\n\tpAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word;\n#endif /* DOT11_N_SUPPORT */\n\n\t/* Restore all settings in the following. */\n\tAsicUpdateProtect(pAd, 0,\n\t\t\t  (ALLN_SETPROTECT | CCKSETPROTECT | OFDMSETPROTECT),\n\t\t\t  TRUE, FALSE);\n#ifdef DOT11_N_SUPPORT\n\tAsicDisableRDG(pAd);\n#endif /* DOT11_N_SUPPORT */\n\tpAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE;\n\tpAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SCAN_2040);\n\tpAd->CommonCfg.BSSCoexist2040.word = 0;\n\tTriEventInit(pAd);\n\tfor (i = 0; i < (pAd->ChannelListNum - 1); i++) {\n\t\tpAd->ChannelList[i].bEffectedChannel = FALSE;\n\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\tRTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff);\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);\n/* Allow go to sleep after linkdown steps. */\n#ifdef  PCIE_PS_SUPPORT\n\n\tRTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);\n#endif /* PCIE_PS_SUPPORT */\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP) {\n\t\t/*send disassociate event to wpa_supplicant */\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM,\n\t\t\t\t\tRT_DISASSOC_EVENT_FLAG, NULL, NULL, 0);\n\t}\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CGIWAP, -1, NULL,\n\t\t\t\tNULL, 0);\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\n\n\tif (pAd->StaCfg.BssType != BSS_ADHOC)\n\t\tpAd->StaCfg.bNotFirstScan = FALSE;\n\telse\n\t\tpAd->StaCfg.bAdhocCreator = FALSE;\n\n/*After change from one ap to another , we need to re-init rssi for AdjustTxPower  */\n\tpAd->StaCfg.RssiSample.AvgRssi0\t= -127;\n\tpAd->StaCfg.RssiSample.AvgRssi1\t= -127;\n\tpAd->StaCfg.RssiSample.AvgRssi2\t= -127;\n\n\tNdisZeroMemory(pAd->StaCfg.ConnectinfoSsid, MAX_LEN_OF_SSID);\n\tNdisZeroMemory(pAd->StaCfg.ConnectinfoBssid, MAC_ADDR_LEN);\n\tpAd->StaCfg.ConnectinfoSsidLen  = 0;\n\tpAd->StaCfg.ConnectinfoBssType  = 1;\n\tpAd->StaCfg.ConnectinfoChannel = 0;\n\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\tif (pAd->chipCap.FreqCalibrationSupport) \n\t\tStopFrequencyCalibration(pAd);\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t{\n\t\tif (P2P_CLI_ON(pAd)/* && pAd->P2pCfg.bStartP2pConnect*/)\n\t\t{\n\t\t\tBssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid,\n\t\t\t\t\t    pAd->CommonCfg.Channel);\n\t\t\t\n\t\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n\t\t}\n\n\t\tif (P2P_CLI_ON(pAd) && (!pAd->P2pCfg.bStartP2pConnect))\n\t\t\tMultiChannelSwitchToP2P(pAd);\n\n\t\tUINT32 Value=0;\n\t\tRTUSBReadMACRegister(pAd, PBF_CFG, &Value);\n\t\tValue |= ((1 << 3) | (1 << 13));/* bit 3 and bit 13 set to 1 */\n\t\tValue |= ((1 << 2) | (1 << 12));/* bit 2  and bit 12 set to 1 */\n\t\tRTUSBWriteMACRegister(pAd, PBF_CFG, Value,FALSE);\n\t\tpAd->MultiChannelFlowCtl=0;\n\n\t/* when p2p & p2p all connnect , when rao disconnect then scan , channel will back to common channel so p2p will also disconnect... , */\n\t\tpAd->CommonCfg.Channel = pAd->ApCliMlmeAux.Channel;\n\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\tpAd->CommonCfg.MO_Cfg.bEnable = FALSE;\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID IterateOnBssTab(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tMLME_START_REQ_STRUCT StartReq;\n\tMLME_JOIN_REQ_STRUCT JoinReq;\n\tULONG BssIdx;\n\tBSS_ENTRY *pInBss = NULL;\n\n\t/* Change the wepstatus to original wepstatus */\n\tpAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\tpAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;\n\n\tBssIdx = pAd->MlmeAux.BssIdx;\n\n\tif (pAd->StaCfg.BssType == BSS_ADHOC) {\n\t\tif (BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) {\n\t\t\tpInBss = &pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx];\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - iterate BSS %ld of %d\\n\", BssIdx,\n\t\t\t\t  pAd->MlmeAux.SsidBssTab.BssNr));\n\t\t\tJoinParmFill(pAd, &JoinReq, BssIdx);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,\n\t\t\t\t    sizeof (MLME_JOIN_REQ_STRUCT), &JoinReq, 0);\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;\n#ifdef WSC_STA_SUPPORT\n\t\t\tif (pAd->StaCfg.WscControl.WscState >= WSC_STATE_START) {\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.WscControl.\n\t\t\t\t\t       WscPeerMAC, pInBss->MacAddr,\n\t\t\t\t\t       MAC_ADDR_LEN);\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.WscControl.EntryAddr,\n\t\t\t\t\t       pInBss->MacAddr, MAC_ADDR_LEN);\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\t\t\treturn;\n\t\t}\n#ifdef IWSC_SUPPORT\n\t\tif (pAd->StaCfg.WscControl.bWscTrigger == TRUE)\n\t\t{\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_MLME_RECONNECT, 0, NULL, 0);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n\t\telse\n#endif /* IWSC_SUPPORT */\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"CNTL - All BSS fail; start a new ADHOC (Ssid=%s)...\\n\",pAd->MlmeAux.Ssid));\n\t\t\tStartParmFill(pAd, &StartReq, (PCHAR) pAd->MlmeAux.Ssid,pAd->MlmeAux.SsidLen);\n\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof (MLME_START_REQ_STRUCT), &StartReq, 0);\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;\n\t\t}\n\t} else if ((BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) &&\n\t\t   (pAd->StaCfg.BssType == BSS_INFRA)) {\n\t\tpInBss = &pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx];\n\t\t/* Check cipher suite, AP must have more secured cipher than station setting */\n\t\t/* Set the Pairwise and Group cipher to match the intended AP setting */\n\t\t/* We can only connect to AP with less secured cipher setting */\n\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)\n\t\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {\n\t\t\tpAd->StaCfg.GroupCipher = pInBss->WPA.GroupCipher;\n\n\t\t\tif (pAd->StaCfg.WepStatus == pInBss->WPA.PairCipher)\n\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA.PairCipher;\n\t\t\telse if (pInBss->WPA.PairCipherAux != Ndis802_11WEPDisabled)\n\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA.PairCipherAux;\n\t\t\telse\t/* There is no PairCipher Aux, downgrade our capability to TKIP */\n\t\t\t\tpAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;\n\t\t} else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t\t   || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) {\n\t\t\tpAd->StaCfg.GroupCipher = pInBss->WPA2.GroupCipher;\n\n\t\t\tif (pAd->StaCfg.WepStatus == pInBss->WPA2.PairCipher)\n\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA2.PairCipher;\n\t\t\telse if (pInBss->WPA2.PairCipherAux != Ndis802_11WEPDisabled)\n\t\t\t\tpAd->StaCfg.PairCipher = pInBss->WPA2.PairCipherAux;\n\t\t\telse\t/* There is no PairCipher Aux, downgrade our capability to TKIP */\n\t\t\t\tpAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;\n\n\t\t\t/* RSN capability */\n\t\t\tpAd->StaCfg.RsnCapability = pInBss->WPA2.RsnCapability;\n\t\t}\n#ifdef WAPI_SUPPORT\n\t\telse if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t\t || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)) {\n\t\t\tpAd->StaCfg.GroupCipher = pInBss->WAPI.GroupCipher;\n\t\t\tpAd->StaCfg.PairCipher = pInBss->WAPI.PairCipher;\n\t\t}\n#endif /* WAPI_SUPPORT */\n\n\t\t/* Set Mix cipher flag */\n\t\tpAd->StaCfg.bMixCipher =\n\t\t    (pAd->StaCfg.PairCipher ==\n\t\t     pAd->StaCfg.GroupCipher) ? FALSE : TRUE;\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"CNTL - iterate BSS %ld of %d\\n\", BssIdx,\n\t\t\t  pAd->MlmeAux.SsidBssTab.BssNr));\n\t\tJoinParmFill(pAd, &JoinReq, BssIdx);\n\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,\n\t\t\t    sizeof (MLME_JOIN_REQ_STRUCT), &JoinReq, 0);\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;\n\t}\n\telse\n\t{\n\t\t/* no more BSS */\n#ifdef DOT11_N_SUPPORT\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif (P2P_CLI_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t\t{\n\t\t\t\tAsicSwitchChannel(pAd, pAd->ApCliMlmeAux.Channel, FALSE);\n\t\t\t\tAsicLockChannel(pAd, pAd->ApCliMlmeAux.Channel);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CNTL - All roaming failed,  p2p_on restore to p2p channel channel %d, Total BSS[%02d]\\n\",\n\t\t\t\t\t  pAd->ApCliMlmeAux.Channel, pAd->ScanTab.BssNr));\n\n\t\t\t}\n\t\t\telse\n#endif /* CONFIG_MULTI_CHANNEL */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\\n\",\n\t\t\t\t  pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));\n\t\t}\n\n#ifdef P2P_SUPPORT\n\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t\t; /* Do NOT delete this entry here because ra interface cannot do all channel scan in this case. */\n\t\telse\n#endif /* P2P_SUPPORT */\n\t\t{\n\t\tpAd->MlmeAux.SsidBssTab.BssNr = 0;\n\t\tBssTableDeleteEntry(&pAd->ScanTab,\n\t\t\t\t    pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid,\n\t\t\t\t\t\t\tpAd->MlmeAux.SsidBssTab.BssEntry[0].Channel);\n\t\t}\n\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n#ifdef WSC_STA_SUPPORT\n#ifdef WSC_LED_SUPPORT\n\t\t/* LED indication. */\n\t\tLEDConnectionCompletion(pAd, FALSE);\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\t}\n}\n\n/* for re-association only */\n/* IRQL = DISPATCH_LEVEL */\nVOID IterateOnBssTab2(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tMLME_REASSOC_REQ_STRUCT ReassocReq;\n\tULONG BssIdx;\n\tBSS_ENTRY *pBss;\n\n\tBssIdx = pAd->MlmeAux.RoamIdx;\n\tpBss = &pAd->MlmeAux.RoamTab.BssEntry[BssIdx];\n\n\tif (BssIdx < pAd->MlmeAux.RoamTab.BssNr) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"CNTL - iterate BSS %ld of %d\\n\", BssIdx,\n\t\t\t  pAd->MlmeAux.RoamTab.BssNr));\n\n\t\tAsicSwitchChannel(pAd, pBss->Channel, FALSE);\n\t\tAsicLockChannel(pAd, pBss->Channel);\n\n\t\t/* reassociate message has the same structure as associate message */\n\t\tAssocParmFill(pAd, &ReassocReq, pBss->Bssid,\n\t\t\t      pBss->CapabilityInfo, ASSOC_TIMEOUT,\n\t\t\t      pAd->StaCfg.DefaultListenCount);\n\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ,\n\t\t\t    sizeof (MLME_REASSOC_REQ_STRUCT), &ReassocReq, 0);\n\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC;\n\t} else {\n\t\t/* no more BSS */\n\t\tUCHAR rf_channel = 0, rf_bw;\n\t\tINT ext_ch;\n\t\t\t\n#ifdef DOT11_N_SUPPORT\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\trf_channel = pAd->CommonCfg.Channel;\n\t\t\trf_bw = BW_20;\n\t\t\text_ch = EXTCHA_NONE;\n\t\t}\n\n\t\tif (rf_channel != 0) {\n\t\t\tAsicSetChannel(pAd, rf_channel, rf_bw, ext_ch, FALSE);\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s():CNTL - All roaming failed, restore to Channel(Ctrl=%d, Central = %d)\\n\",\n\t\t\t\t  __FUNCTION__, pAd->CommonCfg.Channel,\n\t\t\t\t  pAd->CommonCfg.CentralChannel));\n\t\t}\n\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;\n\t}\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID JoinParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_JOIN_REQ_STRUCT *JoinReq,\n\tIN ULONG BssIdx)\n{\n\tJoinReq->BssIdx = BssIdx;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID ScanParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_SCAN_REQ_STRUCT *ScanReq,\n\tIN STRING Ssid[],\n\tIN UCHAR SsidLen,\n\tIN UCHAR BssType,\n\tIN UCHAR ScanType)\n{\n\tNdisZeroMemory(ScanReq->Ssid, MAX_LEN_OF_SSID);\n\tScanReq->SsidLen = SsidLen;\n\tNdisMoveMemory(ScanReq->Ssid, Ssid, SsidLen);\n\tScanReq->BssType = BssType;\n\tScanReq->ScanType = ScanType;\n}\n\n#ifdef QOS_DLS_SUPPORT\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID DlsParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_DLS_REQ_STRUCT *pDlsReq,\n\tIN PRT_802_11_DLS pDls,\n\tIN USHORT reason)\n{\n\tpDlsReq->pDLS = pDls;\n\tpDlsReq->Reason = reason;\n}\n#endif /* QOS_DLS_SUPPORT */\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID StartParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_START_REQ_STRUCT *StartReq,\n\tIN CHAR Ssid[],\n\tIN UCHAR SsidLen)\n{\n\tASSERT(SsidLen <= MAX_LEN_OF_SSID);\n\tif (SsidLen > MAX_LEN_OF_SSID)\n\t\tSsidLen = MAX_LEN_OF_SSID;\n\tNdisMoveMemory(StartReq->Ssid, Ssid, SsidLen);\n\tStartReq->SsidLen = SsidLen;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID AuthParmFill(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT MLME_AUTH_REQ_STRUCT *AuthReq,\n\tIN PUCHAR pAddr,\n\tIN USHORT Alg)\n{\n\tCOPY_MAC_ADDR(AuthReq->Addr, pAddr);\n\tAuthReq->Alg = Alg;\n\tAuthReq->Timeout = AUTH_TIMEOUT;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\n#ifdef RTMP_MAC_USB\n\nVOID MlmeCntlConfirm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN ULONG MsgType,\n\tIN USHORT Msg)\n{\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MsgType, sizeof (USHORT),\n\t\t    &Msg, 0);\n}\n#endif /* RTMP_MAC_USB */\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tPre-build a BEACON frame in the shared memory\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nULONG MakeIbssBeacon(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR DsLen = 1, IbssLen = 2;\n\tUCHAR LocalErpIe[3] = { IE_ERP, 1, 0x04 };\n\tHEADER_802_11 BcnHdr;\n\tUSHORT CapabilityInfo;\n\tLARGE_INTEGER FakeTimestamp;\n\tULONG FrameLen = 0;\n\tTXWI_STRUC *pTxWI = &pAd->BeaconTxWI;\n\tUCHAR *pBeaconFrame = pAd->BeaconBuf;\n\tBOOLEAN Privacy;\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR SupRateLen = 0;\n\tUCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR ExtRateLen = 0;\n\n\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B)\n\t    && (pAd->CommonCfg.Channel <= 14)) {\n\t\tSupRate[0] = 0x82;\t/* 1 mbps */\n\t\tSupRate[1] = 0x84;\t/* 2 mbps */\n\t\tSupRate[2] = 0x8b;\t/* 5.5 mbps */\n\t\tSupRate[3] = 0x96;\t/* 11 mbps */\n\t\tSupRateLen = 4;\n\t\tExtRateLen = 0;\n\t} else if (pAd->CommonCfg.Channel > 14) {\n\t\tSupRate[0] = 0x8C;\t/* 6 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[1] = 0x12;\t/* 9 mbps, in units of 0.5 Mbps */\n\t\tSupRate[2] = 0x98;\t/* 12 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[3] = 0x24;\t/* 18 mbps, in units of 0.5 Mbps */\n\t\tSupRate[4] = 0xb0;\t/* 24 mbps, in units of 0.5 Mbps, basic rate */\n\t\tSupRate[5] = 0x48;\t/* 36 mbps, in units of 0.5 Mbps */\n\t\tSupRate[6] = 0x60;\t/* 48 mbps, in units of 0.5 Mbps */\n\t\tSupRate[7] = 0x6c;\t/* 54 mbps, in units of 0.5 Mbps */\n\t\tSupRateLen = 8;\n\t\tExtRateLen = 0;\n\n\t\t/* */\n\t\t/* Also Update MlmeRate & RtsRate for G only & A only */\n\t\t/* */\n\t\tpAd->CommonCfg.MlmeRate = RATE_6;\n\t\tpAd->CommonCfg.RtsRate = RATE_6;\n\t\tpAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;\n\t\tpAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM;\n\t\tpAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];\n\t} else {\n\t\tSupRate[0] = 0x82;\t/* 1 mbps */\n\t\tSupRate[1] = 0x84;\t/* 2 mbps */\n\t\tSupRate[2] = 0x8b;\t/* 5.5 mbps */\n\t\tSupRate[3] = 0x96;\t/* 11 mbps */\n\t\tSupRateLen = 4;\n\n\t\tExtRate[0] = 0x0C;\t/* 6 mbps, in units of 0.5 Mbps, */\n\t\tExtRate[1] = 0x12;\t/* 9 mbps, in units of 0.5 Mbps */\n\t\tExtRate[2] = 0x18;\t/* 12 mbps, in units of 0.5 Mbps, */\n\t\tExtRate[3] = 0x24;\t/* 18 mbps, in units of 0.5 Mbps */\n\t\tExtRate[4] = 0x30;\t/* 24 mbps, in units of 0.5 Mbps, */\n\t\tExtRate[5] = 0x48;\t/* 36 mbps, in units of 0.5 Mbps */\n\t\tExtRate[6] = 0x60;\t/* 48 mbps, in units of 0.5 Mbps */\n\t\tExtRate[7] = 0x6c;\t/* 54 mbps, in units of 0.5 Mbps */\n\t\tExtRateLen = 8;\n\t}\n\n\tpAd->StaActive.SupRateLen = SupRateLen;\n\tNdisMoveMemory(pAd->StaActive.SupRate, SupRate, SupRateLen);\n\tpAd->StaActive.ExtRateLen = ExtRateLen;\n\tNdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, ExtRateLen);\n\n\t/* compose IBSS beacon frame */\n\tMgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t pAd->CommonCfg.Bssid);\n\tPrivacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)\n\t    || (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)\n\t    || (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);\n\tCapabilityInfo =\n\t    CAP_GENERATE(0, 1, Privacy,\n\t\t\t (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort),\n\t\t\t 0, 0);\n\n\tMakeOutgoingFrame(pBeaconFrame, &FrameLen,\n\t\t\t  sizeof (HEADER_802_11), &BcnHdr,\n\t\t\t  TIMESTAMP_LEN, &FakeTimestamp,\n\t\t\t  2, &pAd->CommonCfg.BeaconPeriod,\n\t\t\t  2, &CapabilityInfo,\n\t\t\t  1, &SsidIe,\n\t\t\t  1, &pAd->CommonCfg.SsidLen,\n\t\t\t  pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid,\n\t\t\t  1, &SupRateIe,\n\t\t\t  1, &SupRateLen,\n\t\t\t  SupRateLen, SupRate,\n\t\t\t  1, &DsIe,\n\t\t\t  1, &DsLen,\n\t\t\t  1, &pAd->CommonCfg.Channel,\n\t\t\t  1, &IbssIe,\n\t\t\t  1, &IbssLen, 2, &pAd->StaActive.AtimWin, END_OF_ARGS);\n\n\t/* add ERP_IE and EXT_RAE IE of in 802.11g */\n\tif (ExtRateLen) {\n\t\tULONG tmp;\n\n\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,\n\t\t\t\t  3, LocalErpIe,\n\t\t\t\t  1, &ExtRateIe,\n\t\t\t\t  1, &ExtRateLen,\n\t\t\t\t  ExtRateLen, ExtRate, END_OF_ARGS);\n\t\tFrameLen += tmp;\n\t}\n\n\t/* If adhoc secruity is set for WPA-None, append the cipher suite IE */\n\t/* Modify by Eddy, support WPA2PSK in Adhoc mode */\n\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\t    ) {\n\t\tUCHAR RSNIe = IE_WPA;\n\t\tULONG tmp;\n\n\t\tRTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus,\n\t\t\t      BSS0);\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\tRSNIe = IE_RSN;\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\n\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,\n\t\t\t\t  1, &RSNIe,\n\t\t\t\t  1, &pAd->StaCfg.RSNIE_Len,\n\t\t\t\t  pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE,\n\t\t\t\t  END_OF_ARGS);\n\t\tFrameLen += tmp;\n\t}\n#ifdef WSC_STA_SUPPORT\n\t/* add Simple Config Information Element */\n\tif (pAd->StaCfg.WpsIEBeacon.ValueLen != 0) {\n\t\tULONG WscTmpLen = 0;\n\n\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen, &WscTmpLen,\n\t\t\t\t  pAd->StaCfg.WpsIEBeacon.ValueLen,\n\t\t\t\t  pAd->StaCfg.WpsIEBeacon.Value, END_OF_ARGS);\n\t\tFrameLen += WscTmpLen;\n\t}\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n\t    && (pAd->StaCfg.bAdhocN == TRUE)) {\n\t\tULONG TmpLen;\n\t\tUCHAR HtLen, HtLen1;\n\n#ifdef RT_BIG_ENDIAN\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\t\tADD_HT_INFO_IE addHTInfoTmp;\n\t\tUSHORT b2lTmp, b2lTmp2;\n#endif\n\n\t\t/* add HT Capability IE */\n\t\tHtLen = sizeof (pAd->CommonCfg.HtCapability);\n\t\tHtLen1 = sizeof (pAd->CommonCfg.AddHTInfo);\n#ifndef RT_BIG_ENDIAN\n\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen,\n\t\t\t\t  1, &HtCapIe,\n\t\t\t\t  1, &HtLen,\n\t\t\t\t  HtLen, &pAd->CommonCfg.HtCapability,\n\t\t\t\t  1, &AddHtInfoIe,\n\t\t\t\t  1, &HtLen1,\n\t\t\t\t  HtLen1, &pAd->CommonCfg.AddHTInfo,\n\t\t\t\t  END_OF_ARGS);\n#else\n\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability,\n\t\t\t       HtLen);\n\t\t*(USHORT *) (&HtCapabilityTmp.HtCapInfo) =\n\t\t    SWAP16(*(USHORT *) (&HtCapabilityTmp.HtCapInfo));\n\t\t*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo) =\n\t\t    SWAP16(*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo));\n\n\t\tNdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo,\n\t\t\t       HtLen1);\n\t\t*(USHORT *) (&addHTInfoTmp.AddHtInfo2) =\n\t\t    SWAP16(*(USHORT *) (&addHTInfoTmp.AddHtInfo2));\n\t\t*(USHORT *) (&addHTInfoTmp.AddHtInfo3) =\n\t\t    SWAP16(*(USHORT *) (&addHTInfoTmp.AddHtInfo3));\n\n\t\tMakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen,\n\t\t\t\t  1, &HtCapIe,\n\t\t\t\t  1, &HtLen,\n\t\t\t\t  HtLen, &HtCapabilityTmp,\n\t\t\t\t  1, &AddHtInfoIe,\n\t\t\t\t  1, &HtLen1,\n\t\t\t\t  HtLen1, &addHTInfoTmp, END_OF_ARGS);\n#endif\n\t\tFrameLen += TmpLen;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t/*beacon use reserved WCID 0xff */\n\tif (pAd->CommonCfg.Channel > 14) {\n\t\tRTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE,\n\t\t\t      TRUE, 0, 0xff, FrameLen, PID_MGMT, PID_BEACON,\n\t\t\t      RATE_1, IFS_HTTXOP, FALSE,\n\t\t\t      &pAd->CommonCfg.MlmeTransmit);\n\t} else {\n\t\t/* Set to use 1Mbps for Adhoc beacon. */\n\t\tHTTRANSMIT_SETTING Transmit;\n\t\tTransmit.word = 0;\n\t\tRTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE,\n\t\t\t      TRUE, 0, 0xff, FrameLen, PID_MGMT, PID_BEACON,\n\t\t\t      RATE_1, IFS_HTTXOP, FALSE, &Transmit);\n\t}\n\n#ifdef RT_BIG_ENDIAN\n\tRTMPFrameEndianChange(pAd, pBeaconFrame, DIR_WRITE, FALSE);\n\tRTMPWIEndianChange(pAd, (PUCHAR) pTxWI, TYPE_TXWI);\n#endif\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\\n\",\n\t\t  FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel,\n\t\t  pAd->CommonCfg.PhyMode));\n\treturn FrameLen;\n}\n\nVOID InitChannelRelatedValue(RTMP_ADAPTER *pAd)\n{\n\tUCHAR rf_channel, rf_bw;\n\tINT ext_ch;\n\t\n\n\tpAd->CommonCfg.CentralChannel = pAd->MlmeAux.CentralChannel;\n\tpAd->CommonCfg.Channel = pAd->MlmeAux.Channel;\n#ifdef DOT11_N_SUPPORT\n\t/* Change to AP channel */\n\tif ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t    && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) {\n\t    \trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_ABOVE;\n\t}\n\telse if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\t\t&& (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))\n\t{\n\t    \trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_BELOW;\n\t} else\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t    \trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t}\n\n\tAsicSetChannel(pAd, rf_channel, rf_bw, ext_ch, FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"%s():BW_%s, CtrlChannel=%d, CentralChannel=%d\\n\",\n\t\t  __FUNCTION__, (rf_bw == BW_40 ? \"40\" : \"20\"),\n\t\t  pAd->CommonCfg.Channel, \n\t\t  pAd->CommonCfg.CentralChannel));\n\n\t/* Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission */\n\trtmp_bbp_get_agc(pAd, &pAd->BbpTuning.R66CurrentValue, RX_CHAIN_0);\n}\n\n/* IRQL = DISPATCH_LEVEL */\nVOID MaintainBssTable(\n\tIN PRTMP_ADAPTER pAd,\n\tIN OUT BSS_TABLE *Tab,\n\tIN ULONG MaxRxTimeDiff,\n\tIN UCHAR MaxSameRxTimeCount)\n{\n\tUCHAR\ti, j;\n\tUCHAR\ttotal_bssNr = Tab->BssNr;\n\tBOOLEAN\tbDelEntry = FALSE;\n\tULONG\tnow_time = 0;\n\n\tfor (i = 0; i < total_bssNr; i++) \n\t{\n\t\tPBSS_ENTRY\tpBss = &Tab->BssEntry[i];\n\n\t\tbDelEntry = FALSE;\n\t\tif (pBss->LastBeaconRxTimeA != pBss->LastBeaconRxTime)\n\t\t{\n\t\t\tpBss->LastBeaconRxTimeA = pBss->LastBeaconRxTime;\n\t\t\tpBss->SameRxTimeCount = 0;\n\t\t}\n\t\telse\n\t\t\tpBss->SameRxTimeCount++;\n\n\t\tNdisGetSystemUpTime(&now_time);\n\t\tif (RTMP_TIME_AFTER(now_time, pBss->LastBeaconRxTime + (MaxRxTimeDiff * OS_HZ)))\n\t\t\tbDelEntry = TRUE;\t\t\n\t\telse if (pBss->SameRxTimeCount > MaxSameRxTimeCount)\n\t\t\tbDelEntry = TRUE;\n\t\t\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)\n\t\t\t&& NdisEqualMemory(pBss->Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen))\n\t\t\tbDelEntry = FALSE;\n\t\t\n\t\tif (bDelEntry)\n\t\t{\n\t\t\tUCHAR *pOldAddr = NULL;\n\t\t\t\n\t\t\tfor (j = i; j < total_bssNr - 1; j++)\n\t\t\t{\n\t\t\t\tpOldAddr = Tab->BssEntry[j].pVarIeFromProbRsp;\n\t\t\t\tNdisMoveMemory(&(Tab->BssEntry[j]), &(Tab->BssEntry[j + 1]), sizeof(BSS_ENTRY));\n\t\t\t\tif (pOldAddr)\n\t\t\t\t{\n\t\t\t\t\tRTMPZeroMemory(pOldAddr, MAX_VIE_LEN);\n\t\t\t\t\tNdisMoveMemory(pOldAddr, \n\t\t\t\t\t\t\t\t   Tab->BssEntry[j + 1].pVarIeFromProbRsp, \n\t\t\t\t\t\t\t\t   Tab->BssEntry[j + 1].VarIeFromProbeRspLen);\n\t\t\t\t\tTab->BssEntry[j].pVarIeFromProbRsp = pOldAddr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpOldAddr = Tab->BssEntry[total_bssNr - 1].pVarIeFromProbRsp;\n\t\t\tNdisZeroMemory(&(Tab->BssEntry[total_bssNr - 1]), sizeof(BSS_ENTRY));\n\t\t\tif (pOldAddr)\n\t\t\t{\n\t\t\t\tRTMPZeroMemory(pOldAddr, MAX_VIE_LEN);\n\t\t\t}\n\t\t\t\n\t\t\ttotal_bssNr -= 1;\n\t\t}\n\t}\n\tTab->BssNr = total_bssNr;\n}\n\nVOID AdjustChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT UCHAR *pBwFallBack,\n\tIN USHORT ifIndex,\n\tIN BOOLEAN BandWidth,\n\tIN UCHAR PriCh,\n\tIN UCHAR ExtraCh\n#ifdef CONFIG_MULTI_CHANNEL\n\t,IN BOOLEAN bfromP2P\n#endif /*CONFIG_MULTI_CHANNEL*/\n\t)\n{\n\tUCHAR rf_channel, rf_bw = BW_20;\n\tINT ext_ch;\n#ifdef P2P_SUPPORT\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n#endif /* P2P_SUPPORT */\n\n\n\t// TODO: shiang-6590, this function need to revise to make sure two purpose can achieved!\n\t//\t1. Channel-binding rule between STA and P2P-GO mode\n\t//\t2. Stop MAC Tx/Rx when bandwidth change\n\n\t*pBwFallBack = 0;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():CentralChannel=%d, Channel=%d, ChannelWidth=%d\\n\",\n\t\t\t__FUNCTION__, ExtraCh, PriCh, BandWidth));\n\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\t\tif ((bfromP2P) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tif (BandWidth == BW_40)\n\t\t\t{\n\t\t\t\tpAd->ApCliMlmeAux.CentralChannel = ExtraCh;\n\t\t\t\tpAd->ApCliMlmeAux.Channel = PriCh;\n\t\t\t\tpAd->P2pCfg.BW = BW_40;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->ApCliMlmeAux.CentralChannel = PriCh;\n\t\t\t\tpAd->ApCliMlmeAux.Channel = PriCh;\n\t\t\t\tpAd->P2pCfg.BW = BW_20;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (BandWidth == BW_40)\n\t\t\t{\n\tpAd->CommonCfg.CentralChannel = ExtraCh;\n\tpAd->CommonCfg.Channel = PriCh;\n\t\t\t\tpAd->StaCfg.BW = BW_40;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.CentralChannel = PriCh;\n\t\t\t\tpAd->CommonCfg.Channel = PriCh;\n\t\t\t\tpAd->StaCfg.BW = BW_20;\n\t\t\t}\t\t\n\t\t}\n\n#else\n\tpAd->CommonCfg.CentralChannel = ExtraCh;\n\tpAd->CommonCfg.Channel = PriCh;\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\n\n#ifdef CONFIG_MULTI_CHANNEL\n\n\tif ((bfromP2P) && (pAd->Multi_Channel_Enable == TRUE))\n#ifdef DOT11_N_SUPPORT\n\t{\n\t\tif ((pAd->ApCliMlmeAux.CentralChannel  > pAd->ApCliMlmeAux.Channel) && (BandWidth == BW_40))\n\t\t{\n\t\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\t\trf_bw = BW_40;\n\t\t\text_ch = EXTCHA_ABOVE;\n\t\t} \n\t\telse if ((pAd->ApCliMlmeAux.CentralChannel  < pAd->ApCliMlmeAux.Channel) && (BandWidth == BW_40))\n\t\t{\n\t\t\trf_channel = pAd->ApCliMlmeAux.CentralChannel;\n\t\t\trf_bw = BW_40;\n\t\t\text_ch = EXTCHA_BELOW;\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\trf_channel = pAd->ApCliMlmeAux.Channel;\n\t\t\trf_bw = BW_20;\n\t\t\text_ch = EXTCHA_NONE;\n\t\t}\n\t}\n\telse\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n#ifdef DOT11_N_SUPPORT\n\t/* Change to AP channel */\n\tif ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (BandWidth == BW_40))\n\t{\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_ABOVE;\n\t} \n\telse if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (BandWidth == BW_40))\n\t{\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_BELOW;\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\trf_channel = pAd->CommonCfg.Channel;\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t}\n\n#ifdef DOT11_VHT_AC\n\tif (rf_bw == BW_40 &&\n\t\tpAd->StaActive.SupportedPhyInfo.bVhtEnable == TRUE &&\n\t\tpAd->StaActive.SupportedPhyInfo.vht_bw == VHT_BW_80) {\n\t\trf_bw = BW_80;\n\t\trf_channel = pAd->CommonCfg.vht_cent_ch;\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\"%s(): Input BW=%d, rf_channel=%d, vht_bw=%d, Channel=%d, vht_cent_ch=%d!\\n\",\n\t\t\t\t__FUNCTION__, rf_bw, rf_channel, pAd->CommonCfg.vht_bw, pAd->CommonCfg.Channel,\n\t\t\t\tpAd->CommonCfg.vht_cent_ch));\n#endif /* DOT11_VHT_AC */\n\n\trtmp_bbp_set_bw(pAd, rf_bw);\n\trtmp_bbp_set_ctrlch(pAd, ext_ch);\n\trtmp_mac_set_ctrlch(pAd, ext_ch);\n\n\tAsicSetChannel(pAd, rf_channel, rf_bw, ext_ch, FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s():BW_%s, RF-Ch=%d, CtrlCh=%d, HT-CentralCh=%d\\n\",\n\t\t\t\t__FUNCTION__, (rf_bw == BW_80 ? \"80\" : (rf_bw == BW_40 ? \"40\": \"20\")),\n\t\t\t\tpAd->LatchRfRegs.Channel,\n\t\t\t\tpAd->CommonCfg.Channel,\n\t\t\t\tpAd->CommonCfg.CentralChannel));\n#ifdef DOT11_VHT_AC\n\tDBGPRINT(RT_DEBUG_TRACE, (\"VHT-CentralCh=%d\\n\", pAd->CommonCfg.vht_cent_ch));\n#endif /* DOT11_VHT_AC */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AdjustChannelRelatedValue ==> not any connection !!!\\n\"));\n}\n\n"
  },
  {
    "path": "src/sta/dls.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2005, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    dls.c\n \n    Abstract:\n    Handle WMM-DLS state machine\n \n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Rory Chen   02-14-2006\n\tArvin Tai\t06-03-2008\t  Modified for RT28xx\n */\n\n#include \"rt_config.h\"\n\n/*\n    ==========================================================================\n    Description:\n        dls state machine init, including state transition and timer init\n    Parameters:\n        Sm - pointer to the dls state machine\n    Note:\n        The state machine looks like this\n        \n                            DLS_IDLE\n    MT2_MLME_DLS_REQUEST   MlmeDlsReqAction\n    MT2_PEER_DLS_REQUEST   PeerDlsReqAction\n    MT2_PEER_DLS_RESPONSE  PeerDlsRspAction\n    MT2_MLME_DLS_TEARDOWN  MlmeTearDownAction\n    MT2_PEER_DLS_TEARDOWN  PeerTearDownAction\n        \n\tIRQL = PASSIVE_LEVEL\n\n    ==========================================================================\n */\nvoid DlsStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tUCHAR i;\n\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC *) Trans, MAX_DLS_STATE,\n\t\t\t MAX_DLS_MSG, (STATE_MACHINE_FUNC) Drop, DLS_IDLE,\n\t\t\t DLS_MACHINE_BASE);\n\n\t/* the first column */\n\tStateMachineSetAction(Sm, DLS_IDLE, MT2_MLME_DLS_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) MlmeDlsReqAction);\n\tStateMachineSetAction(Sm, DLS_IDLE, MT2_PEER_DLS_REQ,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDlsReqAction);\n\tStateMachineSetAction(Sm, DLS_IDLE, MT2_PEER_DLS_RSP,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDlsRspAction);\n\tStateMachineSetAction(Sm, DLS_IDLE, MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t      (STATE_MACHINE_FUNC) MlmeDlsTearDownAction);\n\tStateMachineSetAction(Sm, DLS_IDLE, MT2_PEER_DLS_TEAR_DOWN,\n\t\t\t      (STATE_MACHINE_FUNC) PeerDlsTearDownAction);\n\n\tfor (i = 0; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tpAd->StaCfg.DLSEntry[i].pAd = pAd;\n\t\tRTMPInitTimer(pAd, &pAd->StaCfg.DLSEntry[i].Timer,\n\t\t\t      GET_TIMER_FUNCTION(DlsTimeoutAction), pAd, FALSE);\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID MlmeDlsReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tHEADER_802_11 DlsReqHdr;\n\tPRT_802_11_DLS pDLS = NULL;\n\tUCHAR Category = CATEGORY_DLS;\n\tUCHAR Action = ACTION_DLS_REQUEST;\n\tULONG tmp;\n\tUSHORT reason;\n\tULONG Timeout;\n\tBOOLEAN TimerCancelled;\n\n\tif (!MlmeDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, &pDLS, &reason))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"DLS - MlmeDlsReqAction() \\n\"));\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"DLS - MlmeDlsReqAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tActHeaderInit(pAd, &DlsReqHdr, pAd->CommonCfg.Bssid,\n\t\t      pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\n\t/* Build basic frame first */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  sizeof (HEADER_802_11), &DlsReqHdr,\n\t\t\t  1, &Category,\n\t\t\t  1, &Action,\n\t\t\t  6, &pDLS->MacAddr,\n\t\t\t  6, pAd->CurrentAddress,\n\t\t\t  2, &pAd->StaActive.CapabilityInfo,\n\t\t\t  2, &pDLS->TimeOut,\n\t\t\t  1, &SupRateIe,\n\t\t\t  1, &pAd->MlmeAux.SupRateLen,\n\t\t\t  pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,\n\t\t\t  END_OF_ARGS);\n\n\tif (pAd->MlmeAux.ExtRateLen != 0) {\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t  1, &ExtRateIe,\n\t\t\t\t  1, &pAd->MlmeAux.ExtRateLen,\n\t\t\t\t  pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate,\n\t\t\t\t  END_OF_ARGS);\n\t\tFrameLen += tmp;\n\t}\n#ifdef DOT11_N_SUPPORT\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) {\n\t\tUCHAR HtLen;\n\n#ifdef RT_BIG_ENDIAN\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n#endif\n\n\t\t/* add HT Capability IE */\n\t\tHtLen = sizeof (HT_CAPABILITY_IE);\n#ifndef RT_BIG_ENDIAN\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t  1, &HtCapIe,\n\t\t\t\t  1, &HtLen,\n\t\t\t\t  HtLen, &pAd->CommonCfg.HtCapability,\n\t\t\t\t  END_OF_ARGS);\n#else\n\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);\n\t\t*(USHORT *) (&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.HtCapInfo));\n\t\t*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo));\n\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t  1, &HtCapIe,\n\t\t\t\t  1, &HtLen,\n\t\t\t\t  HtLen, &HtCapabilityTmp, END_OF_ARGS);\n#endif\n\t\tFrameLen = FrameLen + tmp;\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tRTMPCancelTimer(&pDLS->Timer, &TimerCancelled);\n\tTimeout = DLS_TIMEOUT;\n\tRTMPSetTimer(&pDLS->Timer, Timeout);\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID PeerDlsReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tUSHORT StatusCode = MLME_SUCCESS;\n\tHEADER_802_11 DlsRspHdr;\n\tUCHAR Category = CATEGORY_DLS;\n\tUCHAR Action = ACTION_DLS_RESPONSE;\n\tULONG tmp;\n\tUSHORT CapabilityInfo;\n\tUCHAR DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];\n\tUSHORT DLSTimeOut;\n\tSHORT i;\n\tULONG Timeout;\n\tBOOLEAN TimerCancelled;\n\tPRT_802_11_DLS pDLS = NULL;\n\tUCHAR MaxSupportedRateIn500Kbps = 0;\n\tUCHAR SupportedRatesLen;\n\tUCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR HtCapabilityLen;\n\tHT_CAPABILITY_IE HtCapability;\n\n\tif (!PeerDlsReqSanity\n\t    (pAd, Elem->Msg, Elem->MsgLen, DA, SA, &CapabilityInfo, &DLSTimeOut,\n\t     &SupportedRatesLen, &SupportedRates[0], &HtCapabilityLen,\n\t     &HtCapability))\n\t\treturn;\n\n\t/* supported rates array may not be sorted. sort it and find the maximum rate */\n\tMaxSupportedRateIn500Kbps = dot11_max_sup_rate(SupportedRatesLen, &SupportedRates[0], 0, NULL);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DLS - PeerDlsReqAction() from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t  SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"DLS - PeerDlsReqAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tif (!INFRA_ON(pAd)) {\n\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t} else if (!pAd->CommonCfg.bWmmCapable) {\n\t\tStatusCode = MLME_DEST_STA_IS_NOT_A_QSTA;\n\t} else if (!pAd->CommonCfg.bDLSCapable) {\n\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t} else {\n\t\t/* find table to update parameters */\n\t\tfor (i = (MAX_NUM_OF_DLS_ENTRY - 1); i >= 0; i--) {\n\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && MAC_ADDR_EQUAL(SA,\n\t\t\t\t\t      pAd->StaCfg.DLSEntry[i].\n\t\t\t\t\t      MacAddr)) {\n\t\t\t\tif (pAd->StaCfg.AuthMode >=\n\t\t\t\t    Ndis802_11AuthModeWPA)\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status =\n\t\t\t\t\t    DLS_WAIT_KEY;\n\t\t\t\telse {\n\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.\n\t\t\t\t\t\t\tDLSEntry[i].Timer,\n\t\t\t\t\t\t\t&TimerCancelled);\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status =\n\t\t\t\t\t    DLS_FINISH;\n\t\t\t\t}\n\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Sequence = 0;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].TimeOut = DLSTimeOut;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer =\n\t\t\t\t    DLSTimeOut;\n\t\t\t\tif (HtCapabilityLen != 0)\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = TRUE;\n\t\t\t\telse\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = FALSE;\n\t\t\t\tpDLS = &pAd->StaCfg.DLSEntry[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* can not find in table, create a new one */\n\t\tif (i < 0) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"DLS - PeerDlsReqAction() can not find same entry \\n\"));\n\t\t\tfor (i = (MAX_NUM_OF_DLS_ENTRY - 1);\n\t\t\t     i >= MAX_NUM_OF_INIT_DLS_ENTRY; i--) {\n\t\t\t\tif (!pAd->StaCfg.DLSEntry[i].Valid) {\n\t\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\t\tUCHAR MaxSupportedRate = RATE_11;\n\n\t\t\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;\n\t\t\t\t\t}\n\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Sequence = 0;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = TRUE;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].TimeOut = DLSTimeOut;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer = DLSTimeOut;\n\t\t\t\t\tNdisMoveMemory(pAd->StaCfg.DLSEntry[i].MacAddr, SA, MAC_ADDR_LEN);\n\t\t\t\t\tif (HtCapabilityLen != 0)\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = TRUE;\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = FALSE;\n\t\t\t\t\tpDLS = &pAd->StaCfg.DLSEntry[i];\n\t\t\t\t\tpEntry = MacTableInsertDlsEntry(pAd, SA, i);\n\n\t\t\t\t\tMaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps);\n\n\t\t\t\t\tpEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate);\n\n\t\t\t\t\tset_entry_phy_cfg(pAd, pEntry);\n\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\t\t\tpEntry->MinHTPhyMode.field.BW = BW_20;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\tpEntry->HTCapability.MCSSet[0] = 0;\n\t\t\t\t\tpEntry->HTCapability.MCSSet[1] = 0;\n\n\t\t\t\t\t/* If this Entry supports 802.11n, upgrade to HT rate. */\n\t\t\t\t\tif ((HtCapabilityLen != 0) && WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"DLS - PeerDlsReqAction() Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t  PRINT_MAC(SA)));\n\n\t\t\t\t\t\tht_mode_adjust(pAd, pEntry, &HtCapability, &pAd->CommonCfg.DesiredHtPhy);\n\n\t\t\t\t\t\t/* find max fixed rate */\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = get_ht_max_mcs(pAd, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &HtCapability.MCSSet[0]);\n\n\t\t\t\t\t\tif (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) {\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t\t\t\t\t (\"@@@ pAd->CommonCfg.RegTransmitSetting.field.MCS = %d\\n\",\n\t\t\t\t\t\t\t\t  pAd->StaCfg.DesiredTransmitSetting.field.MCS));\n\t\t\t\t\t\t\tset_ht_fixed_mcs(pAd, pEntry, pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.HTPhyMode.field.MCS);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\t\t\t\t\tpEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity;\n\t\t\t\t\t\tpEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor;\n\t\t\t\t\t\tpEntry->MmpsMode = (UCHAR) HtCapability.HtCapInfo.MimoPs;\n\t\t\t\t\t\tpEntry->AMsduSize = (UCHAR) HtCapability.HtCapInfo.AMsduSize;\n\n\t\t\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.ShortGIfor20)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.ShortGIfor40)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.TxSTBC)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.RxSTBC)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.ExtHtCapInfo.PlusHTC)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\t\t\t\t\tif (pAd->CommonCfg.bRdg\n\t\t\t\t\t\t    && HtCapability.ExtHtCapInfo.RDGSupport)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\n\n\t\t\t\t\t\tNdisMoveMemory(&pEntry->HTCapability,\n\t\t\t\t\t\t\t       &HtCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\t\t\t\t\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\n\t\t\t\t\tif (pAd->StaCfg.bAutoTxRateSwitch == TRUE) {\n\t\t\t\t\t\tUCHAR TableSize = 0;\n\n\t\t\t\t\t\tMlmeSelectTxRateTable(pAd,\n\t\t\t\t\t\t\t\t      pEntry,\n\t\t\t\t\t\t\t\t      &pEntry->pTable,\n\t\t\t\t\t\t\t\t      &TableSize,\n\t\t\t\t\t\t\t\t      &pEntry->CurrTxRateIndex);\n\t\t\t\t\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;\n\t\t\t\t\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\t\t\t\t\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\n\t\t\t\t\t\tRTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t\t\t\t\t}\n\t\t\t\t\tpEntry->RateLen = SupportedRatesLen;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tStatusCode = MLME_SUCCESS;\n\n\t\t/* can not find in table, create a new one */\n\t\tif (i < 0) {\n\t\t\tStatusCode = MLME_QOS_UNSPECIFY;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"DLS - PeerDlsReqAction() DLSEntry table full(only can support %d DLS session) \\n\",\n\t\t\t\t  MAX_NUM_OF_DLS_ENTRY -\n\t\t\t\t  MAX_NUM_OF_INIT_DLS_ENTRY));\n\t\t} else {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"DLS - PeerDlsReqAction() use entry(%d) %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t  i, SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));\n\t\t}\n\t}\n\n\tActHeaderInit(pAd, &DlsRspHdr, pAd->CommonCfg.Bssid,\n\t\t      pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\n\t/* Build basic frame first */\n\tif (StatusCode == MLME_SUCCESS) {\n\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t  sizeof (HEADER_802_11), &DlsRspHdr,\n\t\t\t\t  1, &Category,\n\t\t\t\t  1, &Action,\n\t\t\t\t  2, &StatusCode,\n\t\t\t\t  6, SA,\n\t\t\t\t  6, pAd->CurrentAddress,\n\t\t\t\t  2, &pAd->StaActive.CapabilityInfo,\n\t\t\t\t  1, &SupRateIe,\n\t\t\t\t  1, &pAd->MlmeAux.SupRateLen,\n\t\t\t\t  pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,\n\t\t\t\t  END_OF_ARGS);\n\n\t\tif (pAd->MlmeAux.ExtRateLen != 0) {\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  1, &ExtRateIe,\n\t\t\t\t\t  1, &pAd->MlmeAux.ExtRateLen,\n\t\t\t\t\t  pAd->MlmeAux.ExtRateLen,\n\t\t\t\t\t  pAd->MlmeAux.ExtRate, END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) {\n\t\t\tUCHAR HtLen;\n\n#ifdef RT_BIG_ENDIAN\n\t\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n#endif\n\n\t\t\t/* add HT Capability IE */\n\t\t\tHtLen = sizeof (HT_CAPABILITY_IE);\n#ifndef RT_BIG_ENDIAN\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  1, &HtCapIe,\n\t\t\t\t\t  1, &HtLen,\n\t\t\t\t\t  HtLen, &pAd->CommonCfg.HtCapability,\n\t\t\t\t\t  END_OF_ARGS);\n#else\n\t\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);\n\t\t\t*(USHORT *) (&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.HtCapInfo));\n\t\t\t*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *) (&HtCapabilityTmp.ExtHtCapInfo));\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,\n\t\t\t\t\t  1, &HtCapIe,\n\t\t\t\t\t  1, &HtLen,\n\t\t\t\t\t  HtLen, &HtCapabilityTmp, END_OF_ARGS);\n#endif\n\t\t\tFrameLen = FrameLen + tmp;\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\tif (pDLS && (pDLS->Status != DLS_FINISH)) {\n\t\t\tRTMPCancelTimer(&pDLS->Timer, &TimerCancelled);\n\t\t\tTimeout = DLS_TIMEOUT;\n\t\t\tRTMPSetTimer(&pDLS->Timer, Timeout);\n\t\t}\n\t} else {\n\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t  sizeof (HEADER_802_11), &DlsRspHdr,\n\t\t\t\t  1, &Category,\n\t\t\t\t  1, &Action,\n\t\t\t\t  2, &StatusCode,\n\t\t\t\t  6, SA, 6, pAd->CurrentAddress, END_OF_ARGS);\n\t}\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID PeerDlsRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT CapabilityInfo;\n\tUCHAR DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];\n\tUSHORT StatusCode;\n\tSHORT i;\n\tBOOLEAN TimerCancelled;\n\tUCHAR MaxSupportedRateIn500Kbps = 0;\n\tUCHAR SupportedRatesLen;\n\tUCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR HtCapabilityLen;\n\tHT_CAPABILITY_IE HtCapability;\n\n\tif (!pAd->CommonCfg.bDLSCapable)\n\t\treturn;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\tif (!PeerDlsRspSanity\n\t    (pAd, Elem->Msg, Elem->MsgLen, DA, SA, &CapabilityInfo, &StatusCode,\n\t     &SupportedRatesLen, &SupportedRates[0], &HtCapabilityLen,\n\t     &HtCapability))\n\t\treturn;\n\n\t/* supported rates array may not be sorted. sort it and find the maximum rate */\n\tMaxSupportedRateIn500Kbps = dot11_max_sup_rate(SupportedRatesLen, &SupportedRates[0], 0, NULL);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x with StatusCode=%d, CapabilityInfo=0x%x\\n\",\n\t\t  PRINT_MAC(SA), StatusCode,\n\t\t  CapabilityInfo));\n\n\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tif (StatusCode == MLME_SUCCESS) {\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\tUCHAR MaxSupportedRate = RATE_11;\n\n\t\t\t\tpEntry = MacTableInsertDlsEntry(pAd, SA, i);\n\n\t\t\t\tMaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps);\n\t\t\t\tpEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate);\n\n\t\t\t\tset_entry_phy_cfg(pAd, pEntry);\n\n\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\t\tpEntry->MinHTPhyMode.field.BW = BW_20;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tpEntry->HTCapability.MCSSet[0] = 0;\n\t\t\t\tpEntry->HTCapability.MCSSet[1] = 0;\n\n\t\t\t\t/* If this Entry supports 802.11n, upgrade to HT rate. */\n\t\t\t\tif ((HtCapabilityLen != 0) && WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t\t\t (\"DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t  PRINT_MAC(SA)));\n\n\t\t\t\t\tht_mode_adjust(pAd, pEntry, &HtCapability, &pAd->CommonCfg.DesiredHtPhy);\n\t\t\t\t\t/* find max fixed rate */\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = get_ht_max_mcs(pAd, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &HtCapability.MCSSet[0]);\n\n\t\t\t\t\tif (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO)\n\t\t\t\t\t\tset_ht_fixed_mcs(pAd, pEntry, pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.HTPhyMode.field.MCS);\n\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\t\t\t\tpEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity;\n\t\t\t\t\tpEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor;\n\t\t\t\t\tpEntry->MmpsMode = (UCHAR) HtCapability.HtCapInfo.MimoPs;\n\t\t\t\t\tpEntry->AMsduSize = (UCHAR) HtCapability.HtCapInfo.AMsduSize;\n\t\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\t\t\t\t\tif (HtCapability.HtCapInfo.ShortGIfor20)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\t\t\t\tif (HtCapability.HtCapInfo.ShortGIfor40)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\t\t\t\tif (HtCapability.HtCapInfo.TxSTBC)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\t\t\t\tif (HtCapability.HtCapInfo.RxSTBC)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\t\t\t\tif (HtCapability.ExtHtCapInfo.PlusHTC)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\t\t\t\tif (pAd->CommonCfg.bRdg\n\t\t\t\t\t    && HtCapability.ExtHtCapInfo.RDGSupport)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\t\t\t\t\tif (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\n\n\t\t\t\t\tNdisMoveMemory(&pEntry->HTCapability,\n\t\t\t\t\t\t       &HtCapability,\n\t\t\t\t\t\t       sizeof(HT_CAPABILITY_IE));\n\t\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\t\t\t\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry,\n\t\t\t\t\t\t       fCLIENT_STATUS_WMM_CAPABLE);\n\n\t\t\t\tif (pAd->StaCfg.bAutoTxRateSwitch == TRUE) {\n\t\t\t\t\tUCHAR TableSize = 0;\n\n\t\t\t\t\tMlmeSelectTxRateTable(pAd, pEntry,\n\t\t\t\t\t\t\t      &pEntry->pTable,\n\t\t\t\t\t\t\t      &TableSize,\n\t\t\t\t\t\t\t      &pEntry->CurrTxRateIndex);\n\t\t\t\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\t\t\t\t} else {\n\t\t\t\t\tpEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;\n\t\t\t\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\t\t\t\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\n\t\t\t\t\tRTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode,\n\t\t\t\t\t\t\t\t  pEntry);\n\t\t\t\t}\n\t\t\t\tpEntry->RateLen = SupportedRatesLen;\n\n\t\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {\n\t\t\t\t\t/* If support WPA or WPA2, start STAKey hand shake, */\n\t\t\t\t\t/* If failed hand shake, just tear down peer DLS */\n\t\t\t\t\tif (RTMPSendSTAKeyRequest\n\t\t\t\t\t    (pAd,\n\t\t\t\t\t     pAd->StaCfg.DLSEntry[i].MacAddr) != NDIS_STATUS_SUCCESS) {\n\t\t\t\t\t\tMLME_DLS_REQ_STRUCT MlmeDlsReq;\n\t\t\t\t\t\tUSHORT reason = REASON_QOS_CIPHER_NOT_SUPPORT;\n\n\t\t\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i],\n\t\t\t\t\t\t\t    reason);\n\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t    DLS_STATE_MACHINE,\n\t\t\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t\t\t    sizeof(MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status =DLS_NONE;\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid =FALSE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t\t\t (\"DLS - PeerDlsRspAction failed when call RTMPSendSTAKeyRequest \\n\"));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"DLS - waiting for STAKey handshake procedure\\n\"));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x Succeed with WEP or no security\\n\",\n\t\t\t\t\t\t  PRINT_MAC(SA)));\n\t\t\t\t}\n\n\t\t\t\t/*initialize seq no for DLS frames. */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Sequence = 0;\n\t\t\t\tif (HtCapabilityLen != 0)\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = TRUE;\n\t\t\t\telse\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = FALSE;\n\t\t\t} else {\n\t\t\t\t/* DLS setup procedure failed. */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer,\n\t\t\t\t\t\t&TimerCancelled);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t (\"DLS - PeerDlsRspAction failed with StatusCode=%d \\n\",\n\t\t\t\t\t  StatusCode));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (i >= MAX_NUM_OF_INIT_DLS_ENTRY) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"DLS - PeerDlsRspAction() update timeout value \\n\"));\n\t\tfor (i = (MAX_NUM_OF_DLS_ENTRY - 1);\n\t\t     i >= MAX_NUM_OF_INIT_DLS_ENTRY; i--) {\n\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\t\tif (StatusCode == MLME_SUCCESS) {\n\t\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\t\tUCHAR MaxSupportedRate = RATE_11;\n\n\t\t\t\t\tpEntry = MacTableInsertDlsEntry(pAd, SA, i);\n\n\t\t\t\t\tMaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps);\n\n\t\t\t\t\tpEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate);\n\n\t\t\t\t\tset_entry_phy_cfg(pAd, pEntry);\n\n\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\t\t\tpEntry->MinHTPhyMode.field.BW = BW_20;\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t\tpEntry->HTCapability.MCSSet[0] = 0;\n\t\t\t\t\tpEntry->HTCapability.MCSSet[1] = 0;\n\n\t\t\t\t\t/* If this Entry supports 802.11n, upgrade to HT rate. */\n\t\t\t\t\tif ((HtCapabilityLen != 0) && WMODE_CAP_N(pAd->CommonCfg.PhyMode)) {\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t  PRINT_MAC(SA)));\n\n\t\t\t\t\t\tif ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) {\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\t\t\t\t\t\tpAd->MacTab.fAnyStationNonGF = TRUE;\n\t\t\t\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ((HtCapability.HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth)) {\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_40;\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40) & (HtCapability.HtCapInfo.ShortGIfor40));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20) & (HtCapability.HtCapInfo.ShortGIfor20));\n\t\t\t\t\t\t\tpAd->MacTab.fAnyStation20Only = TRUE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* find max fixed rate */\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = get_ht_max_mcs(pAd, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &HtCapability.MCSSet[0]);\n\n\t\t\t\t\t\tif (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) {\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t\t\t\t\t (\"@@@ pAd->CommonCfg.RegTransmitSetting.field.MCS = %d\\n\",\n\t\t\t\t\t\t\t\t  pAd->StaCfg.DesiredTransmitSetting.field.MCS));\n\t\t\t\t\t\t\t\tset_ht_fixed_mcs(pAd, pEntry, pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.HTPhyMode.field.MCS);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\t\t\t\t\tpEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity;\n\t\t\t\t\t\tpEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor;\n\t\t\t\t\t\tpEntry->MmpsMode = (UCHAR) HtCapability.HtCapInfo.MimoPs;\n\t\t\t\t\t\tpEntry->AMsduSize = (UCHAR) HtCapability.HtCapInfo.AMsduSize;\n\t\t\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.ShortGIfor20)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.ShortGIfor40)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.TxSTBC)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.HtCapInfo.RxSTBC)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.ExtHtCapInfo.PlusHTC)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\t\t\t\t\tif (pAd->CommonCfg.bRdg && HtCapability.ExtHtCapInfo.RDGSupport)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\t\t\t\t\t\tif (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\n\n\t\t\t\t\t\tNdisMoveMemory(&pEntry->HTCapability,\n\t\t\t\t\t\t\t       &HtCapability,\n\t\t\t\t\t\t\t       sizeof(HT_CAPABILITY_IE));\n\t\t\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\t\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\t\t\t\t\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\n\t\t\t\t\tif (pAd->StaCfg.bAutoTxRateSwitch == TRUE) {\n\t\t\t\t\t\tUCHAR TableSize = 0;\n\n\t\t\t\t\t\tMlmeSelectTxRateTable(pAd,\n\t\t\t\t\t\t\t\t      pEntry,\n\t\t\t\t\t\t\t\t      &pEntry->pTable,\n\t\t\t\t\t\t\t\t      &TableSize,\n\t\t\t\t\t\t\t\t      &pEntry->CurrTxRateIndex);\n\t\t\t\t\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;\n\t\t\t\t\t\tpEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;\n\t\t\t\t\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\n\t\t\t\t\t\tRTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t\t\t\t\t}\n\t\t\t\t\tpEntry->RateLen = SupportedRatesLen;\n\n\t\t\t\t\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {\n\t\t\t\t\t\t/* If support WPA or WPA2, start STAKey hand shake, */\n\t\t\t\t\t\t/* If failed hand shake, just tear down peer DLS */\n\t\t\t\t\t\tif (RTMPSendSTAKeyRequest\n\t\t\t\t\t\t    (pAd, pAd->StaCfg.DLSEntry[i].MacAddr) != NDIS_STATUS_SUCCESS) {\n\t\t\t\t\t\t\tMLME_DLS_REQ_STRUCT MlmeDlsReq;\n\t\t\t\t\t\t\tUSHORT reason = REASON_QOS_CIPHER_NOT_SUPPORT;\n\n\t\t\t\t\t\t\tDlsParmFill(pAd,\n\t\t\t\t\t\t\t\t    &MlmeDlsReq,\n\t\t\t\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i],\n\t\t\t\t\t\t\t\t    reason);\n\t\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t\t    DLS_STATE_MACHINE,\n\t\t\t\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t\t\t\t    sizeof(MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t\t\t\t    &MlmeDlsReq,\n\t\t\t\t\t\t\t\t    0);\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t\t\t\t (\"DLS - PeerDlsRspAction failed when call RTMPSendSTAKeyRequest \\n\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t\t (\"DLS - waiting for STAKey handshake procedure\\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t (\"DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x Succeed with WEP or no security\\n\",\n\t\t\t\t\t\t\t  PRINT_MAC(SA)));\n\t\t\t\t\t}\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Sequence = 0;\n\t\t\t\t\tif (HtCapabilityLen != 0)\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = TRUE;\n\t\t\t\t\telse\n\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].bHTCap = FALSE;\n\t\t\t\t} else {\n\t\t\t\t\t/* DLS setup procedure failed. */\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t\t (\"DLS - PeerDlsRspAction failed with StatusCode=%d \\n\",\n\t\t\t\t\t\t  StatusCode));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID MlmeDlsTearDownAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tUCHAR Category = CATEGORY_DLS;\n\tUCHAR Action = ACTION_DLS_TEARDOWN;\n\tUSHORT ReasonCode = REASON_QOS_UNSPECIFY;\n\tHEADER_802_11 DlsTearDownHdr;\n\tPRT_802_11_DLS pDLS;\n\tBOOLEAN TimerCancelled;\n\tUCHAR i;\n\n\tif (!MlmeDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, &pDLS, &ReasonCode))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DLS - MlmeDlsTearDownAction() with ReasonCode=%d \\n\",\n\t\t  ReasonCode));\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"DLS - MlmeDlsTearDownAction() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tActHeaderInit(pAd, &DlsTearDownHdr, pAd->CommonCfg.Bssid,\n\t\t      pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\n\t/* Build basic frame first */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  sizeof (HEADER_802_11), &DlsTearDownHdr,\n\t\t\t  1, &Category,\n\t\t\t  1, &Action,\n\t\t\t  6, &pDLS->MacAddr,\n\t\t\t  6, pAd->CurrentAddress, 2, &ReasonCode, END_OF_ARGS);\n\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tRTMPCancelTimer(&pDLS->Timer, &TimerCancelled);\n\n\t/* Remove key in local dls table entry */\n\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\tif (MAC_ADDR_EQUAL\n\t\t    (pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tMacTableDeleteDlsEntry(pAd,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t}\n\t}\n\n\t/* clear peer dls table entry */\n\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tif (MAC_ADDR_EQUAL\n\t\t    (pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer,\n\t\t\t\t\t&TimerCancelled);\n\t\t\tMacTableDeleteDlsEntry(pAd,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t}\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID PeerDlsTearDownAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];\n\tUSHORT ReasonCode;\n\tUINT i;\n\tBOOLEAN TimerCancelled;\n\n\tif (!pAd->CommonCfg.bDLSCapable)\n\t\treturn;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\tif (!PeerDlsTearDownSanity\n\t    (pAd, Elem->Msg, Elem->MsgLen, DA, SA, &ReasonCode))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DLS - PeerDlsTearDownAction() from %02x:%02x:%02x:%02x:%02x:%02x with ReasonCode=%d\\n\",\n\t\t  SA[0], SA[1], SA[2], SA[3], SA[4], SA[5], ReasonCode));\n\n\t/* clear local dls table entry */\n\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer,\n\t\t\t\t\t&TimerCancelled);\n\t\t\t/*AsicDelWcidTab(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); */\n\t\t\t/*AsicRemovePairwiseKeyEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); */\n\t\t\tMacTableDeleteDlsEntry(pAd,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t}\n\t}\n\n\t/* clear peer dls table entry */\n\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer,\n\t\t\t\t\t&TimerCancelled);\n\t\t\t/*AsicDelWcidTab(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); */\n\t\t\t/*AsicRemovePairwiseKeyEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); */\n\t\t\tMacTableDeleteDlsEntry(pAd,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t}\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID RTMPCheckDLSTimeOut(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tULONG i;\n\tMLME_DLS_REQ_STRUCT MlmeDlsReq;\n\tUSHORT reason = REASON_QOS_UNSPECIFY;\n\n\tif (!pAd->CommonCfg.bDLSCapable)\n\t\treturn;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\t/* If timeout value is equaled to zero, it means always not be timeout. */\n\n\t/* update local dls table entry */\n\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\tif ((pAd->StaCfg.DLSEntry[i].Valid)\n\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t    && (pAd->StaCfg.DLSEntry[i].TimeOut != 0)) {\n\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer--;\n\n\t\t\tif (pAd->StaCfg.DLSEntry[i].CountDownTimer == 0) {\n\t\t\t\treason = REASON_QOS_REQUEST_TIMEOUT;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* update peer dls table entry */\n\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tif ((pAd->StaCfg.DLSEntry[i].Valid)\n\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t    && (pAd->StaCfg.DLSEntry[i].TimeOut != 0)) {\n\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer--;\n\n\t\t\tif (pAd->StaCfg.DLSEntry[i].CountDownTimer == 0) {\n\t\t\t\treason = REASON_QOS_REQUEST_TIMEOUT;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i], reason);\n\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t    sizeof (MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN RTMPRcvFrameDLSCheck(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PHEADER_802_11 pHeader,\n\tIN ULONG Len,\n\tIN RXD_STRUC *pRxD)\n{\n\tULONG i;\n\tBOOLEAN bFindEntry = FALSE;\n\tBOOLEAN bSTAKeyFrame = FALSE;\n\tPEAPOL_PACKET pEap;\n\tPUCHAR pProto, pAddr = NULL;\n\tPUCHAR pSTAKey = NULL;\n\tUCHAR ZeroReplay[LEN_KEY_DESC_REPLAY];\n\tUCHAR Mic[16], OldMic[16];\n\tUCHAR digest[80];\n\tUCHAR DlsPTK[80];\n\tUCHAR temp[64];\n\tBOOLEAN TimerCancelled;\n\tCIPHER_KEY PairwiseKey;\n\n\tif (!pAd->CommonCfg.bDLSCapable)\n\t\treturn bSTAKeyFrame;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn bSTAKeyFrame;\n\n\tif (Len < LENGTH_802_11 + 6 + 2)\t/* LENGTH_802_11 + LLC + EAPOL protocol type */\n\t\treturn bSTAKeyFrame;\n\n\tpProto = (PUCHAR) pHeader + LENGTH_802_11;\n\n\tif ((pHeader->FC.SubType & 0x08))\n\t\tpProto += 2;\t/* QOS Control field */\n\n\t/* Skip 4-bytes for HTC */\n\tif (pHeader->FC.Order\n\t    && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED))) {\n\t\tpProto += 4;\n\t}\n\n\t/* L2PAD bit on will pad 2 bytes at LLC */\n\tif (pRxD->L2PAD) {\n\t\tpProto += 2;\n\t}\n\n\tpProto += 6;\t\t/* 0xAA 0xAA 0xAA 0x00 0x00 0x00 */\n\n\tif ((!(pHeader->FC.SubType & 0x08))\n\t    && (!RTMPEqualMemory(EAPOL, pProto, 2)))\n\t\treturn bSTAKeyFrame;\n\n\tpAddr = pHeader->Addr2;\n\n\tif (RTMPEqualMemory(EAPOL, pProto, 2)\n\t    && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) {\n\t\tpEap = (PEAPOL_PACKET) (pProto + 2);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"DLS - Sniff Len=%ld, DataLen=%d, KeyMic=%d, Install=%d, KeyAck=%d, Secure=%d, EKD_DL=%d, Error=%d, Request=%d\\n\",\n\t\t\t  Len,\n\t\t\t  (LENGTH_802_11 + 6 + 2 + 2 +\n\t\t\t   MIN_LEN_OF_EAPOL_KEY_MSG + 16),\n\t\t\t  pEap->KeyDesc.KeyInfo.KeyMic,\n\t\t\t  pEap->KeyDesc.KeyInfo.Install,\n\t\t\t  pEap->KeyDesc.KeyInfo.KeyAck,\n\t\t\t  pEap->KeyDesc.KeyInfo.Secure,\n\t\t\t  pEap->KeyDesc.KeyInfo.EKD_DL,\n\t\t\t  pEap->KeyDesc.KeyInfo.Error,\n\t\t\t  pEap->KeyDesc.KeyInfo.Request));\n\n\t\tif ((Len >=\n\t\t     (LENGTH_802_11 + 6 + 2 + 2 + MIN_LEN_OF_EAPOL_KEY_MSG +\n\t\t      16)) && pEap->KeyDesc.KeyInfo.KeyMic\n\t\t    && pEap->KeyDesc.KeyInfo.Install\n\t\t    && pEap->KeyDesc.KeyInfo.KeyAck\n\t\t    && pEap->KeyDesc.KeyInfo.Secure\n\t\t    && pEap->KeyDesc.KeyInfo.EKD_DL\n\t\t    && !pEap->KeyDesc.KeyInfo.Error\n\t\t    && !pEap->KeyDesc.KeyInfo.Request) {\n\t\t\t/* First validate replay counter, only accept message with larger replay counter */\n\t\t\t/* Let equal pass, some AP start with all zero replay counter */\n\t\t\tNdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);\n\t\t\tif ((RTMPCompareMemory\n\t\t\t     (pEap->KeyDesc.ReplayCounter,\n\t\t\t      pAd->StaCfg.ReplayCounter,\n\t\t\t      LEN_KEY_DESC_REPLAY) != 1)\n\t\t\t    &&\n\t\t\t    (RTMPCompareMemory\n\t\t\t     (pEap->KeyDesc.ReplayCounter, ZeroReplay,\n\t\t\t      LEN_KEY_DESC_REPLAY) != 0))\n\t\t\t\treturn bSTAKeyFrame;\n\n\t\t\t/*RTMPMoveMemory(pAd->StaCfg.ReplayCounter, pEap->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); */\n\t\t\tRTMPMoveMemory(pAd->StaCfg.DlsReplayCounter,\n\t\t\t\t       pEap->KeyDesc.ReplayCounter,\n\t\t\t\t       LEN_KEY_DESC_REPLAY);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"DLS - Sniff replay counter (%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x) Len=%ld, KeyDataLen=%d\\n\",\n\t\t\t\t  pAd->StaCfg.ReplayCounter[0],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[1],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[2],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[3],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[4],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[5],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[6],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[7], Len,\n\t\t\t\t  pEap->KeyDesc.KeyData[1]));\n\n\t\t\t/* put these code segment to get the replay counter */\n\t\t\tif (pAd->StaCfg.PortSecured ==\n\t\t\t    WPA_802_1X_PORT_NOT_SECURED)\n\t\t\t\treturn bSTAKeyFrame;\n\n\t\t\t/* Check MIC value */\n\t\t\t/* Save the MIC and replace with zero */\n\t\t\t/* use proprietary PTK */\n\t\t\tNdisZeroMemory(temp, 64);\n\t\t\tNdisMoveMemory(temp, \"IEEE802.11 WIRELESS ACCESS POINT\", 32);\n\t\t\tWpaDerivePTK(pAd, temp, temp, pAd->CommonCfg.Bssid,\n\t\t\t\t     temp, pAd->CurrentAddress, DlsPTK, LEN_PTK);\n\n\t\t\tNdisMoveMemory(OldMic, pEap->KeyDesc.KeyMic,\n\t\t\t\t       LEN_KEY_DESC_MIC);\n\t\t\tNdisZeroMemory(pEap->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);\n\t\t\tif (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) {\n\t\t\t\t/* AES */\n\t\t\t\tRT_HMAC_SHA1(DlsPTK, LEN_PTK_KCK, (PUCHAR) pEap,\n\t\t\t\t\t     pEap->Body_Len[1] + 4, digest,\n\t\t\t\t\t     SHA1_DIGEST_SIZE);\n\t\t\t\tNdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC);\n\t\t\t} else {\n\t\t\t\tRT_HMAC_MD5(DlsPTK, LEN_PTK_KCK, (PUCHAR) pEap,\n\t\t\t\t\t    pEap->Body_Len[1] + 4, Mic,\n\t\t\t\t\t    MD5_DIGEST_SIZE);\n\t\t\t}\n\n\t\t\tif (!NdisEqualMemory(OldMic, Mic, LEN_KEY_DESC_MIC)) {\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t\t (\"MIC Different in Msg1 of STAKey handshake! \\n\"));\n\t\t\t\treturn bSTAKeyFrame;\n\t\t\t} else\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"MIC VALID in Msg1 of STAKey handshake! \\n\"));\n\t\t\tif ((pEap->KeyDesc.KeyData[0] == 0xDD)\n\t\t\t    && (pEap->KeyDesc.KeyData[2] == 0x00)\n\t\t\t    && (pEap->KeyDesc.KeyData[3] == 0x0C)\n\t\t\t    && (pEap->KeyDesc.KeyData[4] == 0x43)\n\t\t\t    && (pEap->KeyDesc.KeyData[5] == 0x02)) {\n\t\t\t\tpAddr = pEap->KeyDesc.KeyData + 8;\t/* Tpe(1), Len(1), OUI(3), DataType(1), Reserved(2) */\n\t\t\t\tpSTAKey = pEap->KeyDesc.KeyData + 14;\t/* Tpe(1), Len(1), OUI(3), DataType(1), Reserved(2), STAKey_Mac_Addr(6) */\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"DLS - Receive STAKey Message-1 from %02x:%02x:%02x:%02x:%02x:%02x Len=%ld, KeyDataLen=%d\\n\",\n\t\t\t\t\t  PRINT_MAC(pAddr), Len,\n\t\t\t\t\t  pEap->KeyDesc.KeyData[1]));\n\n\t\t\t\tbSTAKeyFrame = TRUE;\n\t\t\t}\n\n\t\t}\n\t\telse if (Len >= (LENGTH_802_11 + 6 + 2 + 2 + MIN_LEN_OF_EAPOL_KEY_MSG))\n\t\t{\n\t\t\tRTMPMoveMemory(pAd->StaCfg.DlsReplayCounter,\n\t\t\t\t       pEap->KeyDesc.ReplayCounter,\n\t\t\t\t       LEN_KEY_DESC_REPLAY);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"DLS - Sniff replay counter 2(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x) Len=%ld, KeyDataLen=%d\\n\",\n\t\t\t\t  pAd->StaCfg.ReplayCounter[0],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[1],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[2],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[3],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[4],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[5],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[6],\n\t\t\t\t  pAd->StaCfg.ReplayCounter[7], Len,\n\t\t\t\t  pEap->KeyDesc.KeyData[1]));\n\t\t}\n\t}\n\n\t/* If timeout value is equaled to zero, it means always not be timeout. */\n\t/* update local dls table entry */\n\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && MAC_ADDR_EQUAL(pAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tif (bSTAKeyFrame) {\n\t\t\t\tPMAC_TABLE_ENTRY pEntry;\n\n\t\t\t\t/* STAKey frame, add pairwise key table */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer,\n\t\t\t\t\t\t&TimerCancelled);\n\n\t\t\t\tPairwiseKey.KeyLen = LEN_TK;\n\t\t\t\tNdisMoveMemory(PairwiseKey.Key, &pSTAKey[0], LEN_TK);\n\t\t\t\tNdisMoveMemory(PairwiseKey.TxMic, &pSTAKey[16], LEN_TKIP_MIC);\n\t\t\t\tNdisMoveMemory(PairwiseKey.RxMic, &pSTAKey[24], LEN_TKIP_MIC);\n\n\t\t\t\tif (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)\n\t\t\t\t\tPairwiseKey.CipherAlg = CIPHER_TKIP;\n\t\t\t\telse if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n\t\t\t\t\tPairwiseKey.CipherAlg = CIPHER_AES;\n\n\t\t\t\tpEntry = DlsEntryTableLookup(pAd,\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].MacAddr, TRUE);\n\n\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\tRTMP_ASIC_PAIRWISE_KEY_TABLE(pAd,\n\t\t\t\t\t\t\t     (UCHAR) pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t\t\t     &PairwiseKey);\n\n\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd,\n\t\t\t\t\t\t       BSS0,\n\t\t\t\t\t\t       0,\n\t\t\t\t\t\t       PairwiseKey.CipherAlg,\n\t\t\t\t\t\t       (UCHAR) pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t\t       PAIRWISEKEYTABLE);\n\n\t\t\t\tNdisMoveMemory(&pEntry->PairwiseKey,\n\t\t\t\t\t       &PairwiseKey,\n\t\t\t\t\t       sizeof (CIPHER_KEY));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"DLS - Receive STAKey Message-1 (Peer STA MAC Address STAKey) \\n\"));\n\n\t\t\t\tRTMPSendSTAKeyHandShake(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"DLS - Finish STAKey handshake procedure (Initiator side)\\n\"));\n\t\t\t} else {\n\t\t\t\t/* Data frame, update timeout value */\n\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) {\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer = pAd->StaCfg.DLSEntry[i].TimeOut;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbFindEntry = TRUE;\n\t\t}\n\t}\n\n\t/* update peer dls table entry */\n\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && MAC_ADDR_EQUAL(pAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tif (bSTAKeyFrame) {\n\t\t\t\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\t\t\t\t/* STAKey frame, add pairwise key table, and send STAkey Msg-2 */\n\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_FINISH;\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled);\n\n\t\t\t\tPairwiseKey.KeyLen = LEN_TK;\n\t\t\t\tNdisMoveMemory(PairwiseKey.Key, &pSTAKey[0],\n\t\t\t\t\t       LEN_TK);\n\t\t\t\tNdisMoveMemory(PairwiseKey.TxMic, &pSTAKey[16],\n\t\t\t\t\t       LEN_TKIP_MIC);\n\t\t\t\tNdisMoveMemory(PairwiseKey.RxMic, &pSTAKey[24],\n\t\t\t\t\t       LEN_TKIP_MIC);\n\n\t\t\t\t/*PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg; */\n\t\t\t\tif (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)\n\t\t\t\t\tPairwiseKey.CipherAlg = CIPHER_TKIP;\n\t\t\t\telse if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n\t\t\t\t\tPairwiseKey.CipherAlg = CIPHER_AES;\n\n\t\t\t\tpEntry =\n\t\t\t\t    DlsEntryTableLookup(pAd,\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].MacAddr, TRUE);\n\t\t\t\t/*AsicAddKeyEntry(pAd, (USHORT)(i + 2), BSS0, 0, &PairwiseKey, TRUE, TRUE);     // reserve 0 for multicast, 1 for unicast */\n\t\t\t\t/*AsicUpdateRxWCIDTable(pAd, (USHORT)(i + 2), pAddr); */\n\n\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\tRTMP_ASIC_PAIRWISE_KEY_TABLE(pAd,\n\t\t\t\t\t\t\t     (UCHAR) pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t\t\t     &PairwiseKey);\n\n\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd,\n\t\t\t\t\t\t       BSS0,\n\t\t\t\t\t\t       0,\n\t\t\t\t\t\t       PairwiseKey.CipherAlg,\n\t\t\t\t\t\t       (UCHAR) pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t\t       PAIRWISEKEYTABLE);\n\n\t\t\t\tNdisMoveMemory(&pEntry->PairwiseKey,\n\t\t\t\t\t       &PairwiseKey,\n\t\t\t\t\t       sizeof (CIPHER_KEY));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"DLS - Receive STAKey Message-1 (Initiator STA MAC Address STAKey)\\n\"));\n\n\t\t\t\t/* If support WPA or WPA2, start STAKey hand shake, */\n\t\t\t\t/* If failed hand shake, just tear down peer DLS */\n\t\t\t\tif (RTMPSendSTAKeyHandShake(pAd, pAddr) != NDIS_STATUS_SUCCESS) {\n\t\t\t\t\tMLME_DLS_REQ_STRUCT MlmeDlsReq;\n\t\t\t\t\tUSHORT reason = REASON_QOS_CIPHER_NOT_SUPPORT;\n\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid = FALSE;\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status = DLS_NONE;\n\t\t\t\t\tDlsParmFill(pAd, &MlmeDlsReq,\n\t\t\t\t\t\t    &pAd->StaCfg.DLSEntry[i],\n\t\t\t\t\t\t    reason);\n\t\t\t\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE,\n\t\t\t\t\t\t    MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t\t\t\t    sizeof(MLME_DLS_REQ_STRUCT),\n\t\t\t\t\t\t    &MlmeDlsReq, 0);\n\t\t\t\t} else {\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t (\"DLS - Finish STAKey handshake procedure (Peer side)\\n\"));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* Data frame, update timeout value */\n\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) {\n\t\t\t\t\tpAd->StaCfg.DLSEntry[i].CountDownTimer = pAd->StaCfg.DLSEntry[i].TimeOut;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbFindEntry = TRUE;\n\t\t}\n\t}\n\n\treturn bSTAKeyFrame;\n}\n\n/*\n\t========================================================================\n\n\tRoutine\tDescription:\n\t\tCheck if the frame can be sent through DLS direct link interface\n\t\t\n\tArguments:\n\t\tpAd\t\tPointer\tto adapter\n\t\t\n\tReturn Value:\n\t\tDLS entry index\n\t\t\n\tNote:\n\t\n\t========================================================================\n*/\nINT RTMPCheckDLSFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA)\n{\n\tINT rval = -1;\n\tINT i;\n\n\tif (!pAd->CommonCfg.bDLSCapable)\n\t\treturn rval;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn rval;\n\n\tdo {\n\t\t/* check local dls table entry */\n\t\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t\t    && MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\t\trval = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* check peer dls table entry */\n\t\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY;\n\t\t     i++) {\n\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t\t    && MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\t\trval = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while (FALSE);\n\n\treturn rval;\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nVOID RTMPSendDLSTearDownFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tNDIS_STATUS NStatus;\n\tHEADER_802_11 DlsTearDownHdr;\n\tULONG FrameLen = 0;\n\tUSHORT Reason = REASON_QOS_QSTA_LEAVING_QBSS;\n\tUCHAR Category = CATEGORY_DLS;\n\tUCHAR Action = ACTION_DLS_TEARDOWN;\n\tUCHAR i = 0;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||\n\t    RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\treturn;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Send DLS TearDown Frame \\n\"));\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\t/*Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"ASSOC - RTMPSendDLSTearDownFrame() allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tActHeaderInit(pAd, &DlsTearDownHdr, pAd->CommonCfg.Bssid,\n\t\t      pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof (HEADER_802_11),\n\t\t\t  &DlsTearDownHdr, 1, &Category, 1, &Action, 6, pDA, 6,\n\t\t\t  pAd->CurrentAddress, 2, &Reason, END_OF_ARGS);\n\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t/* Remove key in local dls table entry */\n\tfor (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t    && MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tMacTableDeleteDlsEntry(pAd,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t}\n\t}\n\n\t/* Remove key in peer dls table entry */\n\tfor (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tif (pAd->StaCfg.DLSEntry[i].Valid\n\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)\n\t\t    && MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) {\n\t\t\tMacTableDeleteDlsEntry(pAd,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,\n\t\t\t\t\t       pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"Send DLS TearDown Frame and remove key in (i=%d) \\n\", i));\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nNDIS_STATUS RTMPSendSTAKeyRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA)\n{\n\tUCHAR Header802_3[14];\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tPEAPOL_PACKET pPacket;\n\tUCHAR *mpool;\n\tUCHAR Mic[16];\n\tUCHAR digest[80];\n\tPUCHAR pOutBuffer = NULL;\n\tPNDIS_PACKET pNdisPacket;\n\tUCHAR temp[64];\n\tUCHAR DlsPTK[80];\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DLS - RTMPSendSTAKeyRequest() to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t  PRINT_MAC(pDA)));\n\n\tpAd->Sequence++;\n\tMAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid,\n\t\t\t  pAd->CurrentAddress, EAPOL);\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *) & mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t/* Zero message body */\n\tpPacket = (PEAPOL_PACKET) mpool;\n\tNdisZeroMemory(pPacket, TX_EAPOL_BUFFER);\n\n\tpPacket->ProVer = EAPOL_VER;\n\tpPacket->ProType = EAPOLKey;\n\tpPacket->Body_Len[1] = sizeof (KEY_DESCRIPTER) + 6 + MAC_ADDR_LEN;\t/* data field contain KDE andPeer MAC address */\n\n\t/* STAKey Message is as EAPOL-Key(1,1,0,0,G/0,0,0, MIC, 0,Peer MAC KDE) */\n\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)\n\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {\n\t\tpPacket->KeyDesc.Type = WPA1_KEY_DESC;\n\t} else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t   || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) {\n\t\tpPacket->KeyDesc.Type = WPA2_KEY_DESC;\n\t}\n\n\t/* Key descriptor version */\n\tpPacket->KeyDesc.KeyInfo.KeyDescVer =\n\t    (((pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n\t      || (pAd->StaCfg.GroupCipher ==\n\t\t  Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES)\n\t     : (KEY_DESC_TKIP));\n\n\tpPacket->KeyDesc.KeyInfo.KeyMic = 1;\n\tpPacket->KeyDesc.KeyInfo.Secure = 1;\n\tpPacket->KeyDesc.KeyInfo.Request = 1;\n\n\tpPacket->KeyDesc.KeyDataLen[1] = 12;\n\n\t/* use our own OUI to distinguish proprietary with standard. */\n\tpPacket->KeyDesc.KeyData[0] = 0xDD;\n\tpPacket->KeyDesc.KeyData[1] = 0x0A;\n\tpPacket->KeyDesc.KeyData[2] = 0x00;\n\tpPacket->KeyDesc.KeyData[3] = 0x0C;\n\tpPacket->KeyDesc.KeyData[4] = 0x43;\n\tpPacket->KeyDesc.KeyData[5] = 0x03;\n\tNdisMoveMemory(&pPacket->KeyDesc.KeyData[6], pDA, MAC_ADDR_LEN);\n\n\tNdisMoveMemory(pPacket->KeyDesc.ReplayCounter,\n\t\t       pAd->StaCfg.DlsReplayCounter, LEN_KEY_DESC_REPLAY);\n\n\t/* Allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tos_free_mem(NULL, mpool);\n\t\treturn NStatus;\n\t}\n\t/* Prepare EAPOL frame for MIC calculation */\n\t/* Be careful, only EAPOL frame is counted for MIC calculation */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  pPacket->Body_Len[1] + 4, pPacket, END_OF_ARGS);\n\n\t/* use proprietary PTK */\n\tNdisZeroMemory(temp, 64);\n\tNdisMoveMemory(temp, \"IEEE802.11 WIRELESS ACCESS POINT\", 32);\n\tWpaDerivePTK(pAd, temp, temp, pAd->CommonCfg.Bssid, temp,\n\t\t     pAd->CurrentAddress, DlsPTK, LEN_PTK);\n\n\t/* calculate MIC */\n\tif (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) {\n\t\t/* AES */\n\t\tNdisZeroMemory(digest, sizeof (digest));\n\t\tRT_HMAC_SHA1(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest,\n\t\t\t     SHA1_DIGEST_SIZE);\n\t\tNdisMoveMemory(pPacket->KeyDesc.KeyMic, digest,\n\t\t\t       LEN_KEY_DESC_MIC);\n\t} else {\n\t\tNdisZeroMemory(Mic, sizeof (Mic));\n\t\tRT_HMAC_MD5(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic,\n\t\t\t    MD5_DIGEST_SIZE);\n\t\tNdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC);\n\t}\n\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  sizeof (Header802_3), Header802_3,\n\t\t\t  pPacket->Body_Len[1] + 4, pPacket, END_OF_ARGS);\n\n\tNStatus =\n\t    RTMPAllocateNdisPacket(pAd, &pNdisPacket, NULL, 0, pOutBuffer,\n\t\t\t\t   FrameLen);\n\tif (NStatus == NDIS_STATUS_SUCCESS) {\n\t\tRTMP_SET_PACKET_WCID(pNdisPacket, BSSID_WCID);\n\t\tSTASendPacket(pAd, pNdisPacket);\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t}\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"RTMPSendSTAKeyRequest- Send STAKey request (NStatus=%x, FrameLen=%ld)\\n\",\n\t\t  NStatus, FrameLen));\n\n\treturn NStatus;\n}\n\n/*\n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nNDIS_STATUS RTMPSendSTAKeyHandShake(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pDA)\n{\n\tUCHAR Header802_3[14];\n\tNDIS_STATUS NStatus;\n\tULONG FrameLen = 0;\n\tPEAPOL_PACKET pPacket;\n\tUCHAR *mpool;\n\tUCHAR Mic[16];\n\tUCHAR digest[80];\n\tPUCHAR pOutBuffer = NULL;\n\tPNDIS_PACKET pNdisPacket;\n\tUCHAR temp[64];\n\tUCHAR DlsPTK[80];\t/* Due to dirver can not get PTK, use proprietary PTK */\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DLS - RTMPSendSTAKeyHandShake() to %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t  PRINT_MAC(pDA)));\n\n\tpAd->Sequence++;\n\tMAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid,\n\t\t\t  pAd->CurrentAddress, EAPOL);\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *) & mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\t/* Zero message body */\n\tpPacket = (PEAPOL_PACKET) mpool;\n\tNdisZeroMemory(pPacket, TX_EAPOL_BUFFER);\n\n\tpPacket->ProVer = EAPOL_VER;\n\tpPacket->ProType = EAPOLKey;\n\tpPacket->Body_Len[1] = sizeof (KEY_DESCRIPTER) + 6 + MAC_ADDR_LEN;\t/* data field contain KDE and Peer MAC address */\n\n\t/* STAKey Message is as EAPOL-Key(1,1,0,0,G/0,0,0, MIC, 0,Peer MAC KDE) */\n\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)\n\t    || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {\n\t\tpPacket->KeyDesc.Type = WPA1_KEY_DESC;\n\t} else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)\n\t\t   || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) {\n\t\tpPacket->KeyDesc.Type = WPA2_KEY_DESC;\n\t}\n\n\t/* Key descriptor version */\n\tpPacket->KeyDesc.KeyInfo.KeyDescVer =\n\t    (((pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n\t      || (pAd->StaCfg.GroupCipher ==\n\t\t  Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES)\n\t     : (KEY_DESC_TKIP));\n\n\tpPacket->KeyDesc.KeyInfo.KeyMic = 1;\n\tpPacket->KeyDesc.KeyInfo.Secure = 1;\n\n\tpPacket->KeyDesc.KeyDataLen[1] = 12;\n\n\t/* use our own OUI to distinguish proprietary with standard. */\n\tpPacket->KeyDesc.KeyData[0] = 0xDD;\n\tpPacket->KeyDesc.KeyData[1] = 0x0A;\n\tpPacket->KeyDesc.KeyData[2] = 0x00;\n\tpPacket->KeyDesc.KeyData[3] = 0x0C;\n\tpPacket->KeyDesc.KeyData[4] = 0x43;\n\tpPacket->KeyDesc.KeyData[5] = 0x03;\n\tNdisMoveMemory(&pPacket->KeyDesc.KeyData[6], pDA, MAC_ADDR_LEN);\n\n\tNdisMoveMemory(pPacket->KeyDesc.ReplayCounter,\n\t\t       pAd->StaCfg.DlsReplayCounter, LEN_KEY_DESC_REPLAY);\n\n\t/* Allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS) {\n\t\tos_free_mem(NULL, mpool);\n\t\treturn NStatus;\n\t}\n\t/* Prepare EAPOL frame for MIC calculation */\n\t/* Be careful, only EAPOL frame is counted for MIC calculation */\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  pPacket->Body_Len[1] + 4, pPacket, END_OF_ARGS);\n\n\t/* use proprietary PTK */\n\tNdisZeroMemory(temp, 64);\n\tNdisMoveMemory(temp, \"IEEE802.11 WIRELESS ACCESS POINT\", 32);\n\tWpaDerivePTK(pAd, temp, temp, pAd->CommonCfg.Bssid, temp,\n\t\t     pAd->CurrentAddress, DlsPTK, LEN_PTK);\n\n\t/* calculate MIC */\n\tif (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) {\n\t\t/* AES */\n\t\tNdisZeroMemory(digest, sizeof (digest));\n\t\tRT_HMAC_SHA1(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest,\n\t\t\t     SHA1_DIGEST_SIZE);\n\t\tNdisMoveMemory(pPacket->KeyDesc.KeyMic, digest,\n\t\t\t       LEN_KEY_DESC_MIC);\n\t} else {\n\t\tNdisZeroMemory(Mic, sizeof (Mic));\n\t\tRT_HMAC_MD5(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic,\n\t\t\t    MD5_DIGEST_SIZE);\n\t\tNdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC);\n\t}\n\n\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t  sizeof (Header802_3), Header802_3,\n\t\t\t  pPacket->Body_Len[1] + 4, pPacket, END_OF_ARGS);\n\n\tNStatus =\n\t    RTMPAllocateNdisPacket(pAd, &pNdisPacket, NULL, 0, pOutBuffer,\n\t\t\t\t   FrameLen);\n\tif (NStatus == NDIS_STATUS_SUCCESS) {\n\t\tRTMP_SET_PACKET_WCID(pNdisPacket, BSSID_WCID);\n\t\tSTASendPacket(pAd, pNdisPacket);\n\t\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\t}\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"RTMPSendSTAKeyHandShake- Send STAKey Message-2 (NStatus=%x, FrameLen=%ld)\\n\",\n\t\t  NStatus, FrameLen));\n\n\treturn NStatus;\n}\n\nVOID DlsTimeoutAction(\n\tIN PVOID SystemSpecific1,\n\tIN PVOID FunctionContext,\n\tIN PVOID SystemSpecific2,\n\tIN PVOID SystemSpecific3)\n{\n\tMLME_DLS_REQ_STRUCT MlmeDlsReq;\n\tUSHORT reason;\n\tPRT_802_11_DLS pDLS = (PRT_802_11_DLS) FunctionContext;\n\tPRTMP_ADAPTER pAd = NULL;\n\n\tif (pDLS == NULL)\n\t\treturn;\n\n\tpAd = (PRTMP_ADAPTER)pDLS->pAd;\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t (\"DlsTimeout - Tear down DLS links (%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t  PRINT_MAC(pDLS->MacAddr)));\n\n\tif ((pDLS) && (pDLS->Valid)) {\n\t\treason = REASON_QOS_REQUEST_TIMEOUT;\n\t\tpDLS->Valid = FALSE;\n\t\tpDLS->Status = DLS_NONE;\n\t\tDlsParmFill(pAd, &MlmeDlsReq, pDLS, reason);\n\t\tMlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN,\n\t\t\t    sizeof (MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0);\n\t\tRTMP_MLME_HANDLER(pAd);\n\t}\n}\n\n/*\n================================================================\nDescription : because DLS and CLI share the same WCID table in ASIC. \nMesh entry also insert to pAd->MacTab.content[].\nAlso fills the pairwise key.\nBecause front MAX_AID_BA entries have direct mapping to BAEntry, which is only used as CLI. So we insert Dls\nfrom index MAX_AID_BA.\n================================================================\n*/\nMAC_TABLE_ENTRY *MacTableInsertDlsEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr,\n\tIN UINT DlsEntryIdx)\n{\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> MacTableInsertDlsEntry\\n\"));\n\t/* if FULL, return */\n\tif (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE)\n\t\treturn NULL;\n\n\tdo {\n\t\tif ((pEntry = DlsEntryTableLookup(pAd, pAddr, TRUE)) != NULL)\n\t\t\tbreak;\n\n\t\t/* allocate one MAC entry */\n\t\tpEntry =\n\t\t    MacTableInsertEntry(pAd, pAddr,\n\t\t\t\t\tDlsEntryIdx + MIN_NET_DEVICE_FOR_DLS,\n\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\tTRUE);\n\t\tif (pEntry) {\n\t\t\tpAd->StaCfg.DLSEntry[DlsEntryIdx].MacTabMatchWCID = pEntry->Aid;\n\t\t\tpEntry->MatchDlsEntryIdx = DlsEntryIdx;\n\t\t\tpEntry->AuthMode = pAd->StaCfg.AuthMode;\n\t\t\tpEntry->WepStatus = pAd->StaCfg.WepStatus;\n\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"MacTableInsertDlsEntry - allocate entry #%d, Total= %d\\n\",\n\t\t\t\t  pEntry->Aid, pAd->MacTab.Size));\n\n\t\t\t/* If legacy WEP is used, set pair-wise cipherAlg into WCID attribute table for this entry */\n\t\t\tif (IS_ENTRY_DLS(pEntry)\n\t\t\t    && (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)) {\n\t\t\t\tUCHAR KeyIdx = pAd->StaCfg.DefaultKeyId;\n\t\t\t\tUCHAR CipherAlg;\n\n\t\t\t\tCipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg;\n\n\t\t\t\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\tpAd->StaCfg.DefaultKeyId,\n\t\t\t\t\t\t\tpAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, pEntry->Aid,\n\t\t\t\t\t\t\tSHAREDKEYTABLE);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t} while (FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== MacTableInsertDlsEntry\\n\"));\n\n\treturn pEntry;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tDelete all Mesh Entry in pAd->MacTab\n\t==========================================================================\n */\nBOOLEAN MacTableDeleteDlsEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT wcid,\n\tIN PUCHAR pAddr)\n{\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> MacTableDeleteDlsEntry\\n\"));\n\n\tif (!VALID_WCID(wcid))\n\t\treturn FALSE;\n\n\tMacTableDeleteEntry(pAd, wcid, pAddr);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== MacTableDeleteDlsEntry\\n\"));\n\n\treturn TRUE;\n}\n\nMAC_TABLE_ENTRY *DlsEntryTableLookup(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr,\n\tIN BOOLEAN bResetIdelCount)\n{\n\tULONG HashIdx;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\n\tRTMP_SEM_LOCK(&pAd->MacTabLock);\n\tHashIdx = MAC_ADDR_HASH_INDEX(pAddr);\n\tpEntry = pAd->MacTab.Hash[HashIdx];\n\n\twhile (pEntry) {\n\t\tif (IS_ENTRY_DLS(pEntry)\n\t\t    && MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) {\n\t\t\tif (bResetIdelCount)\n\t\t\t\tpEntry->NoDataIdleCount = 0;\n\t\t\tbreak;\n\t\t} else\n\t\t\tpEntry = pEntry->pNext;\n\t}\n\n\tRTMP_SEM_UNLOCK(&pAd->MacTabLock);\n\treturn pEntry;\n}\n\nMAC_TABLE_ENTRY *DlsEntryTableLookupByWcid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR wcid,\n\tIN PUCHAR pAddr,\n\tIN BOOLEAN bResetIdelCount)\n{\n\tULONG DLsIndex;\n\tPMAC_TABLE_ENTRY pCurEntry = NULL;\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\tif (!VALID_WCID(wcid))\n\t\treturn NULL;\n\n\tRTMP_SEM_LOCK(&pAd->MacTabLock);\n\n\tdo {\n\t\tpCurEntry = &pAd->MacTab.Content[wcid];\n\n\t\tDLsIndex = 0xff;\n\t\tif ((pCurEntry) && IS_ENTRY_DLS(pCurEntry)) {\n\t\t\tDLsIndex = pCurEntry->MatchDlsEntryIdx;\n\t\t}\n\n\t\tif (DLsIndex == 0xff)\n\t\t\tbreak;\n\n\t\tif (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddr)) {\n\t\t\tif (bResetIdelCount)\n\t\t\t\tpCurEntry->NoDataIdleCount = 0;\n\t\t\tpEntry = pCurEntry;\n\t\t\tbreak;\n\t\t}\n\t} while (FALSE);\n\n\tRTMP_SEM_UNLOCK(&pAd->MacTabLock);\n\n\treturn pEntry;\n}\n\nINT Set_DlsEntryInfo_Display_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR arg)\n{\n\tINT i;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%-19s%-8s\\n\", \"MAC\", \"TIMEOUT\\n\"));\n\tfor (i = 0; i < MAX_NUM_OF_DLS_ENTRY; i++) {\n\t\tif ((pAd->StaCfg.DLSEntry[i].Valid)\n\t\t    && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) {\n\t\t\tPMAC_TABLE_ENTRY pEntry =\n\t\t\t    &pAd->MacTab.Content[pAd->StaCfg.DLSEntry[i].MacTabMatchWCID];\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%02x:%02x:%02x:%02x:%02x:%02x  \",\n\t\t\t\t  PRINT_MAC(pAd->StaCfg.DLSEntry[i].MacAddr)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-8d\\n\", pAd->StaCfg.DLSEntry[i].TimeOut));\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"\\n%-19s%-4s%-4s%-4s%-4s%-7s%-7s%-7s\", \"MAC\",\n\t\t\t\t  \"AID\", \"BSS\", \"PSM\", \"WMM\", \"RSSI0\", \"RSSI1\",\n\t\t\t\t  \"RSSI2\"));\n#ifdef DOT11_N_SUPPORT\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-8s%-10s%-6s%-6s%-6s%-6s\", \"MIMOPS\", \"PhMd\",\n\t\t\t\t  \"BW\", \"MCS\", \"SGI\", \"STBC\"));\n#endif /* DOT11_N_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"\\n%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\t  pEntry->Addr[0], pEntry->Addr[1],\n\t\t\t\t  pEntry->Addr[2], pEntry->Addr[3],\n\t\t\t\t  pEntry->Addr[4], pEntry->Addr[5]));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)pEntry->Aid));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)pEntry->apidx));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)pEntry->PsMode));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-4d\",\n\t\t\t\t  (int)CLIENT_STATUS_TEST_FLAG(pEntry,\n\t\t\t\t\t\t\t       fCLIENT_STATUS_WMM_CAPABLE)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-7d\", pEntry->RssiSample.AvgRssi0));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-7d\", pEntry->RssiSample.AvgRssi1));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-7d\", pEntry->RssiSample.AvgRssi2));\n#ifdef DOT11_N_SUPPORT\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-8d\", (int)pEntry->MmpsMode));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-10s\",\n\t\t\t\t  get_phymode_str(pEntry->HTPhyMode.field.MODE)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-6s\", get_bw_str(pEntry->HTPhyMode.field.BW)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-6d\", pEntry->HTPhyMode.field.MCS));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-6d\", pEntry->HTPhyMode.field.ShortGI));\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-6d\", pEntry->HTPhyMode.field.STBC));\n#endif /* DOT11_N_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t\t (\"%-10d, %d, %d%%\\n\", pEntry->DebugFIFOCount,\n\t\t\t\t  pEntry->DebugTxCount,\n\t\t\t\t  (pEntry->DebugTxCount) ? ((pEntry->DebugTxCount - pEntry->DebugFIFOCount) * 100 / pEntry->DebugTxCount) : 0));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nINT Set_DlsAddEntry_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUCHAR mac[MAC_ADDR_LEN];\n\tUSHORT Timeout;\n\tPSTRING token;\n\tSTRING sepValue[] = \":\", DASH = '-';\n\tINT i;\n\tRT_802_11_DLS Dls;\n\n\tif (strlen(arg) < 19)\t/*Mac address acceptable format 01:02:03:04:05:06 length 17 plus the \"-\" and timeout value in decimal format. */\n\t\treturn FALSE;\n\n\ttoken = strchr(arg, DASH);\n\tif ((token != NULL) && (strlen(token) > 1)) {\n\t\tTimeout = (USHORT) simple_strtol((token + 1), 0, 10);\n\n\t\t*token = '\\0';\n\t\tfor (i = 0, token = rstrtok(arg, &sepValue[0]); token;\n\t\t     token = rstrtok(NULL, &sepValue[0]), i++) {\n\t\t\tif ((strlen(token) != 2) || (!isxdigit(*token))\n\t\t\t    || (!isxdigit(*(token + 1))))\n\t\t\t\treturn FALSE;\n\t\t\tAtoH(token, (&mac[i]), 1);\n\t\t}\n\t\tif (i != 6)\n\t\t\treturn FALSE;\n\n\t\tDBGPRINT(RT_DEBUG_OFF,\n\t\t\t (\"\\n%02x:%02x:%02x:%02x:%02x:%02x-%d\", mac[0], mac[1],\n\t\t\t  mac[2], mac[3], mac[4], mac[5], (int)Timeout));\n\n\t\tNdisZeroMemory(&Dls, sizeof (RT_802_11_DLS));\n\t\tDls.TimeOut = Timeout;\n\t\tCOPY_MAC_ADDR(Dls.MacAddr, mac);\n\t\tDls.Valid = 1;\n\n\t\tMlmeEnqueue(pAd,\n\t\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t\t    RT_OID_802_11_SET_DLS_PARAM,\n\t\t\t    sizeof (RT_802_11_DLS), &Dls, 0);\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n\n}\n\nINT Set_DlsTearDownEntry_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg)\n{\n\tUCHAR macAddr[MAC_ADDR_LEN];\n\tPSTRING value;\n\tINT i;\n\tRT_802_11_DLS Dls;\n\n\tif (strlen(arg) != 17)\t/*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\treturn FALSE;\n\n\tfor (i = 0, value = rstrtok(arg, \":\"); value;\n\t     value = rstrtok(NULL, \":\")) {\n\t\tif ((strlen(value) != 2) || (!isxdigit(*value))\n\t\t    || (!isxdigit(*(value + 1))))\n\t\t\treturn FALSE;\t/*Invalid */\n\n\t\tAtoH(value, &macAddr[i++], 2);\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%02x:%02x:%02x:%02x:%02x:%02x\", PRINT_MAC(macAddr)));\n\n\tNdisZeroMemory(&Dls, sizeof (RT_802_11_DLS));\n\tCOPY_MAC_ADDR(Dls.MacAddr, macAddr);\n\tDls.Valid = 0;\n\n\tMlmeEnqueue(pAd,\n\t\t    MLME_CNTL_STATE_MACHINE,\n\t\t    RT_OID_802_11_SET_DLS_PARAM,\n\t\t    sizeof (RT_802_11_DLS), &Dls, 0);\n\n\treturn TRUE;\n}\n"
  },
  {
    "path": "src/sta/p2pcli.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    ap_apcli.c\n\n    Abstract:\n    Support AP-Client function.\n\n    Note:\n    1. Call RT28xx_ApCli_Init() in init function and\n       call RT28xx_ApCli_Remove() in close function\n\n    2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init()\n\n    3. ApCli index (0) of different rx packet is got in\n       APHandleRxDoneInterrupt() by using FromWhichBSSID = pEntry->apidx;\n       Or FromWhichBSSID = BSS0;\n\n    4. ApCli index (0) of different tx packet is assigned in\n       MBSS_VirtualIF_PacketSend() by using RTMP_SET_PACKET_NET_DEVICE_MBSSID()\n    5. ApCli index (0) of different interface is got in APHardTransmit() by using\n       RTMP_GET_PACKET_IF()\n\n    6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if\n\n    8. The number of ApCli only can be 1\n\n\t9. apcli convert engine subroutines, we should just take care data packet.\n    Revision History:\n    Who             When            What\n    --------------  ----------      ----------------------------------------------\n    Shiang, Fonchi  02-13-2007      created\n*/\n\n#ifdef P2P_SUPPORT\n\n#include \"rt_config.h\"\n\n\n/* --------------------------------- Private -------------------------------- */\nINT ApCliIfLookUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pAddr)\n{\n\tSHORT i;\n\tSHORT ifIndex = -1;\n\n\tdo\n\t{\n\t\tfor(i = 0; i < MAX_APCLI_NUM; i++)\n\t\t{\n\t\t\tif(\tMAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[i].CurrentAddress, pAddr))\n\t\t\t{\n\t\t\t\tifIndex = i;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCliIfIndex = %d\\n\", __FUNCTION__, ifIndex));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while (FALSE);\n\n\treturn ifIndex;\n}\n\nBOOLEAN isValidApCliIf(\n\tSHORT ifIndex)\n{\n\tif((ifIndex >= 0) && (ifIndex < MAX_APCLI_NUM))\n\t\treturn TRUE;\n\telse\n\t\treturn FALSE;\n}\n\n/*! \\brief init the management mac frame header\n *  \\param p_hdr mac header\n *  \\param subtype subtype of the frame\n *  \\param p_ds destination address, don't care if it is a broadcast address\n *  \\return none\n *  \\pre the station has the following information in the pAd->UserCfg\n *   - bssid\n *   - station address\n *  \\post\n *  \\note this function initializes the following field\n */\nVOID ApCliMgtMacHeaderInit(\n    IN\tPRTMP_ADAPTER\tpAd, \n    IN OUT PHEADER_802_11 pHdr80211, \n    IN UCHAR SubType, \n    IN UCHAR ToDs, \n    IN PUCHAR pDA, \n    IN PUCHAR pBssid,\n    IN USHORT ifIndex)\n{\n    NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));\n    pHdr80211->FC.Type = BTYPE_MGMT;\n    pHdr80211->FC.SubType = SubType;\n    pHdr80211->FC.ToDs = ToDs;\n    COPY_MAC_ADDR(pHdr80211->Addr1, pDA);\n    COPY_MAC_ADDR(pHdr80211->Addr2, pAd->ApCfg.ApCliTab[ifIndex].CurrentAddress);\n    COPY_MAC_ADDR(pHdr80211->Addr3, pBssid);\n}\n\n\n#ifdef DOT11_N_SUPPORT\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tVerify the support rate for HT phy type\n\n\tArguments:\n\t\tpAd \t\t\t\tPointer to our adapter\n\n\tReturn Value:\n\t\tFALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability.  (AP Mode)\n\n\tIRQL = PASSIVE_LEVEL\n\n\t========================================================================\n*/\nBOOLEAN ApCliCheckHt(\n\tIN\t\tPRTMP_ADAPTER \t\tpAd,\n\tIN\t\tUSHORT \t\t\t\tIfIndex,\n\tIN OUT\tHT_CAPABILITY_IE \t*pHtCapability,\n\tIN OUT\tADD_HT_INFO_IE \t\t*pAddHtInfo)\n{\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\t\n\tif (IfIndex >= MAX_APCLI_NUM)\n\t\treturn FALSE;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[IfIndex];\n\n\t/* If use AMSDU, set flag. */\n\tif (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE))\n\t\tCLIENT_STATUS_SET_FLAG(pApCliEntry, fCLIENT_STATUS_AMSDU_INUSED);\n\t/* Save Peer Capability */\n\tif (pHtCapability->HtCapInfo.ShortGIfor20)\n\t\tCLIENT_STATUS_SET_FLAG(pApCliEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\tif (pHtCapability->HtCapInfo.ShortGIfor40)\n\t\tCLIENT_STATUS_SET_FLAG(pApCliEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\tif (pHtCapability->HtCapInfo.TxSTBC)\n\t\tCLIENT_STATUS_SET_FLAG(pApCliEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\tif (pHtCapability->HtCapInfo.RxSTBC)\n\t\tCLIENT_STATUS_SET_FLAG(pApCliEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\tif (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport)\n\t\tCLIENT_STATUS_SET_FLAG(pApCliEntry, fCLIENT_STATUS_RDG_CAPABLE);\n\tpApCliEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity;\n\n\tif ((pAd->OpMode == OPMODE_STA))\n\t{\n\t}\n\tpAd->ApCliMlmeAux.HtCapability.MCSSet[0] = 0xff;\n\tpAd->ApCliMlmeAux.HtCapability.MCSSet[4] = 0x1;\n\t//2008/12/17:KH modified to fix the low throughput of AP-Client on Big-Endian Platform<--\n\t switch (pAd->CommonCfg.RxStream)\n\t{\n\t\tcase 1:\t\t\t\n\t\t\tpAd->ApCliMlmeAux.HtCapability.MCSSet[0] = 0xff;\n\t\t\tpAd->ApCliMlmeAux.HtCapability.MCSSet[1] = 0x00;\n            pAd->ApCliMlmeAux.HtCapability.MCSSet[2] = 0x00;\n            pAd->ApCliMlmeAux.HtCapability.MCSSet[3] = 0x00;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tpAd->ApCliMlmeAux.HtCapability.MCSSet[0] = 0xff;\n\t\t\tpAd->ApCliMlmeAux.HtCapability.MCSSet[1] = 0xff;\n            pAd->ApCliMlmeAux.HtCapability.MCSSet[2] = 0x00;\n            pAd->ApCliMlmeAux.HtCapability.MCSSet[3] = 0x00;\n\t\t\tbreak;\n\t\tcase 3:\t\t\t\t\n\t\t\tpAd->ApCliMlmeAux.HtCapability.MCSSet[0] = 0xff;\n\t\t\tpAd->ApCliMlmeAux.HtCapability.MCSSet[1] = 0xff;\n            pAd->ApCliMlmeAux.HtCapability.MCSSet[2] = 0xff;\n            pAd->ApCliMlmeAux.HtCapability.MCSSet[3] = 0x00;\n\t\t\tbreak;\n\t}\n\n\t/* Record the RxMcs of AP */\n\tNdisMoveMemory(pApCliEntry->RxMcsSet, pHtCapability->MCSSet, 16);\n\n\n\t/*\n\tif (pAd->Antenna.field.TxPath == 2)\t// 2: 2Tx   1: 1Tx\n\t{\n\t\tpAd->MlmeAux.HtCapability.MCSSet[1] = 0xff;\n\t}\n\telse\n\t{\n\t\tpAd->MlmeAux.HtCapability.MCSSet[1] = 0x00;\n\t}\n\t*/\n\t/* 2008/12/17:KH modified to fix the low throughput of AP-Client on Big-Endian Platform--> */\n\n\t/* choose smaller setting */\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.ChannelWidth;\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.GF =  pHtCapability->HtCapInfo.GF &pAd->CommonCfg.DesiredHtPhy.GF;\n\n\t/* Send Assoc Req with my HT capability. */\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.AMsduSize =  pAd->CommonCfg.DesiredHtPhy.AmsduSize;\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.MimoPs = pHtCapability->HtCapInfo.MimoPs;\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.ShortGIfor20 =  (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20) & (pHtCapability->HtCapInfo.ShortGIfor20);\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.ShortGIfor40 =  (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40) & (pHtCapability->HtCapInfo.ShortGIfor40);\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.TxSTBC =  (pAd->CommonCfg.DesiredHtPhy.TxSTBC)&(pHtCapability->HtCapInfo.RxSTBC);\n\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.RxSTBC =  (pAd->CommonCfg.DesiredHtPhy.RxSTBC)&(pHtCapability->HtCapInfo.TxSTBC);\n\tpAd->ApCliMlmeAux.HtCapability.HtCapParm.MaxRAmpduFactor = pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor;\n\tpAd->ApCliMlmeAux.HtCapability.HtCapParm.MpduDensity = pHtCapability->HtCapParm.MpduDensity;\n\tpAd->ApCliMlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = pHtCapability->ExtHtCapInfo.PlusHTC;\n\n\n\tif (pAd->CommonCfg.bRdg)\n\t{\n\t\tpAd->ApCliMlmeAux.HtCapability.ExtHtCapInfo.RDGSupport = pHtCapability->ExtHtCapInfo.RDGSupport;\n\t}\n\t\n\t/*COPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability); */\n\treturn TRUE;\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nVOID ComposeP2PPsPoll(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PAPCLI_STRUCT pApCliEntry)\n{\n\tNdisZeroMemory(&pApCliEntry->PsPollFrame, sizeof (PSPOLL_FRAME));\n\tpApCliEntry->PsPollFrame.FC.Type = BTYPE_CNTL;\n\tpApCliEntry->PsPollFrame.FC.SubType = SUBTYPE_PS_POLL;\n\tpApCliEntry->PsPollFrame.Aid = pAd->ApCliMlmeAux.Aid | 0xC000;\n\n\tCOPY_MAC_ADDR(pApCliEntry->PsPollFrame.Bssid, pAd->ApCliMlmeAux.Bssid);\n\tCOPY_MAC_ADDR(pApCliEntry->PsPollFrame.Ta, pApCliEntry->CurrentAddress);\n}\n\nVOID ComposeP2PNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PAPCLI_STRUCT pApCliEntry)\n{\n\tNdisZeroMemory(&pApCliEntry->NullFrame, sizeof (HEADER_802_11));\n\tpApCliEntry->NullFrame.FC.Type = BTYPE_DATA;\n\tpApCliEntry->NullFrame.FC.SubType = SUBTYPE_NULL_FUNC;\n\tpApCliEntry->NullFrame.FC.ToDs = 1;\n\n\tCOPY_MAC_ADDR(pApCliEntry->NullFrame.Addr1, pAd->ApCliMlmeAux.Bssid);\n\tCOPY_MAC_ADDR(pApCliEntry->NullFrame.Addr2, pApCliEntry->CurrentAddress);\n\tCOPY_MAC_ADDR(pApCliEntry->NullFrame.Addr3, pAd->ApCliMlmeAux.Bssid);\n}\n\n/*\n    ==========================================================================\n\n\tRoutine\tDescription:\n\t\tConnected to the BSSID\n\n\tArguments:\n\t\tpAd\t\t\t\t- Pointer to our adapter\n\t\tApCliIdx\t\t- Which ApCli interface\t\t\n\tReturn Value:\t\t\n\t\tFALSE: fail to alloc Mac entry.\n\n\tNote:\n\n\t==========================================================================\n*/\nBOOLEAN ApCliLinkUp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR ifIndex)\n{\n\tBOOLEAN result = FALSE;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tPMAC_TABLE_ENTRY pMacEntry = NULL;\n\n\tdo\n\t{\n\t\tif (ifIndex < MAX_APCLI_NUM)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! APCLI LINK UP - IF(apcli%d) AuthMode(%d)=%s, WepStatus(%d)=%s !!!\\n\", \n\t\t\t\t\t\t\t\t\t\tifIndex, \n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].AuthMode, GetAuthMode(pAd->ApCfg.ApCliTab[ifIndex].AuthMode),\n\t\t\t\t\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].WepStatus, GetEncryptType(pAd->ApCfg.ApCliTab[ifIndex].WepStatus)));\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! ERROR : APCLI LINK UP - IF(apcli%d)!!!\\n\", ifIndex));\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\t\t/* Sanity check: This link had existed.  */\n\t\tif (pApCliEntry->Valid)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! ERROR : This link had existed - IF(apcli%d)!!!\\n\", ifIndex));\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\t\n\t\t/* Insert the Remote AP to our MacTable. */\n\t\t/*pMacEntry = MacTableInsertApCliEntry(pAd, (PUCHAR)(pAd->MlmeAux.Bssid)); */\n\t\tpMacEntry = MacTableInsertEntry(pAd, (PUCHAR)(pAd->ApCliMlmeAux.Bssid),\n\t\t\t\t\t\t\t\t\t\t(ifIndex + MIN_NET_DEVICE_FOR_APCLI), OPMODE_AP, TRUE);\n\t\tif (pMacEntry)\n\t\t{\n\t\t\tUCHAR Rates[MAX_LEN_OF_SUPPORTED_RATES];\n\t\t\tPUCHAR pRates = Rates;\n\t\t\tUCHAR RatesLen;\n\t\t\tUCHAR MaxSupportedRate = 0;\n\t\t\tUCHAR P2pIdx = P2P_NOT_FOUND;\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"%s:: Insert MAC Table success.    ifIndex = %d.\\n\", __FUNCTION__, ifIndex));\n\t\t\tpMacEntry->Sst = SST_ASSOC;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n++++++++ %s::  Delete BssSearch Table on Channel = %d. ++++++++\\n\", __FUNCTION__, pAd->CommonCfg.Channel));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"                   BSSID = [%02x:%02x:%02x:%02x:%02x:%02x].  p2p_bssid = [%02x:%02x:%02x:%02x:%02x:%02x].\\n\", PRINT_MAC(pAd->ApCliMlmeAux.Bssid), PRINT_MAC(pAd->P2pCfg.Bssid)));\n\t\t\tBssTableDeleteEntry(&pAd->ScanTab,\n\t\t\t\t\t    /*pAd->ApCliMlmeAux.Bssid*/pAd->P2pCfg.Bssid,\n\t\t\t\t\t    pAd->CommonCfg.Channel);\n\t\t\tif (pApCliEntry->bP2pClient)\n\t\t\t{\n\t\t\t\tpMacEntry->bP2pClient = TRUE;\n\t\t\t\tpMacEntry->P2pInfo.P2pClientState = P2PSTATE_CLIENT_ASSOC;\n\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pMacEntry->Addr);\n\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\tpMacEntry->P2pInfo.p2pIndex = P2pIdx;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpMacEntry->bP2pClient = FALSE;\n\t\t\t\n\t\t\tNdisGetSystemUpTime(&pApCliEntry->ApCliRcvBeaconTime);\n\t\t\tpApCliEntry->Valid = TRUE;\n\t\t\tpApCliEntry->MacTabWCID = pMacEntry->Aid;\n\n\t\t\tCOPY_MAC_ADDR(APCLI_ROOT_BSSID_GET(pAd, pApCliEntry->MacTabWCID), pAd->ApCliMlmeAux.Bssid);\n\t\t\tpApCliEntry->SsidLen = pAd->ApCliMlmeAux.SsidLen;\n\t\t\tNdisMoveMemory(pApCliEntry->Ssid, pAd->ApCliMlmeAux.Ssid, pApCliEntry->SsidLen);\n\n\t\t\tComposeP2PPsPoll(pAd, pApCliEntry);\n\t\t\tComposeP2PNullFrame(pAd, pApCliEntry);\n\n\t\t\tif (pMacEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\telse\n\t\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\n\t\t\t/* Store appropriate RSN_IE for WPA SM negotiation later  */\n\t\t\t/* If WPAPSK/WPA2SPK mix mode, driver just stores either WPAPSK or WPA2PSK */\n\t\t\t/* RSNIE. It depends on the AP-Client's authentication mode to store the corresponding RSNIE.    */\n\t\t\tif ((pMacEntry->AuthMode >= Ndis802_11AuthModeWPA) && (pAd->ApCliMlmeAux.VarIELen != 0))\n\t\t\t{\n\t\t\t\tPUCHAR              pVIE;\n\t\t\t\tUCHAR               len;\n\t\t\t\tPEID_STRUCT         pEid;\n\n\t\t\t\tpVIE = pAd->ApCliMlmeAux.VarIEs;\n\t\t\t\tlen\t = pAd->ApCliMlmeAux.VarIELen;\n\n\t\t\t\twhile (len > 0)\n\t\t\t\t{\n\t\t\t\t\tpEid = (PEID_STRUCT) pVIE;\t\n\t\t\t\t\t/* For WPA/WPAPSK */\n\t\t\t\t\tif ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) \n\t\t\t\t\t\t&& (pMacEntry->AuthMode == Ndis802_11AuthModeWPA || pMacEntry->AuthMode == Ndis802_11AuthModeWPAPSK))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pMacEntry->RSN_IE, pVIE, (pEid->Len + 2));\n\t\t\t\t\t\tpMacEntry->RSNIE_Len = (pEid->Len + 2);\t\t\t\t\t\t\t\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliLinkUp: Store RSN_IE for WPA SM negotiation \\n\"));\n\t\t\t\t\t}\n\t\t\t\t\t/* For WPA2/WPA2PSK */\n\t\t\t\t\telse if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3))\n\t\t\t\t\t\t&& (pMacEntry->AuthMode == Ndis802_11AuthModeWPA2 || pMacEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pMacEntry->RSN_IE, pVIE, (pEid->Len + 2));\n\t\t\t\t\t\tpMacEntry->RSNIE_Len = (pEid->Len + 2);\t\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliLinkUp: Store RSN_IE for WPA2 SM negotiation \\n\"));\n\t\t\t\t\t}\n\n\t\t\t\t\tpVIE += (pEid->Len + 2);\n\t\t\t\t\tlen  -= (pEid->Len + 2);\n\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t}\n\n\t\t\tif (pMacEntry->RSNIE_Len == 0)\n\t\t\t{\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliLinkUp: root-AP has no RSN_IE \\n\"));\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thex_dump(\"The RSN_IE of root-AP\", pMacEntry->RSN_IE, pMacEntry->RSNIE_Len);\n\t\t\t}\t\t\n\n\t\t\tSupportRate(pAd->ApCliMlmeAux.SupRate, pAd->ApCliMlmeAux.SupRateLen, pAd->ApCliMlmeAux.ExtRate,\n\t\t\t\tpAd->ApCliMlmeAux.ExtRateLen, &pRates, &RatesLen, &MaxSupportedRate);\n\n\t\t\tpMacEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate);\n\t\t\tpMacEntry->RateLen = RatesLen;\n\t\t\tset_entry_phy_cfg(pAd, pMacEntry);\n\t\t\tpMacEntry->CapabilityInfo = pAd->ApCliMlmeAux.CapabilityInfo;\n\n\t\t\t/* If WEP is enabled, add paiewise and shared key */\n\t\t\tif (pApCliEntry->WepStatus == Ndis802_11WEPEnabled)\n\t\t\t{\t\t\t\n\t\t\t\tPCIPHER_KEY pKey; \t\t\t\n\t\t\t\tINT \t\tidx, BssIdx;\n\n\t\t\t\tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;\n\t\t\t\n\t\t\t\tfor (idx=0; idx < SHARE_KEY_NUM; idx++)\n\t\t\t\t{\n\t\t\t\t\tpKey = &pApCliEntry->SharedKey[idx];\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tif (pKey->KeyLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Set key material and cipherAlg to Asic */\n\t\t\t\t\t\tRTMP_ASIC_SHARED_KEY_TABLE(pAd, \n\t    \t\t\t\t\t\t\t\t\t  \t\tBssIdx, \n\t    \t\t\t\t\t\t\t\t\t  \t\tidx, \n\t\t    \t\t\t\t\t\t\t\t\t\tpKey);\t\n\n\t\t\t\t\t\tif (idx == pApCliEntry->DefaultKeyId)\n\t\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\t\tINT\tcnt;\n\t\t\t\t\t\n\t\t\t\t\t\t\t/* Generate 3-bytes IV randomly for software encryption using */\t\t\t\t\t\t\n\t\t\t\t\t    \tfor(cnt = 0; cnt < LEN_WEP_TSC; cnt++)\n\t\t\t\t\t\t\t\tpKey->TxTsc[cnt] = RandomByte(pAd); \n\t\t\t\t\t\n\t\t\t\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\tBssIdx, \n\t\t\t\t\t\t\t\t\t\t\t\tidx, \n\t\t\t\t\t\t\t\t\t\t\t\tpKey->CipherAlg, \n\t\t\t\t\t\t\t\t\t\t\t\tpMacEntry->Aid, \n\t\t\t\t\t\t\t\t\t\t\t\tSHAREDKEYTABLE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\n\t\t\t\t}    \t\t   \t\t  \t\t   \t\t\t\t\t\n\t\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* If this Entry supports 802.11n, upgrade to HT rate.  */\n\t\t\tif (pAd->ApCliMlmeAux.HtCapabilityLen != 0)\n\t\t\t{\n\t\t\t\tUCHAR\tj, bitmask; /* k,bitmask; */\n\t\t\t\tCHAR    i;\n\t\t\t\tPHT_CAPABILITY_IE pHtCapability = (PHT_CAPABILITY_IE)&pAd->ApCliMlmeAux.HtCapability;\n\n\t\t\t\tif ((pAd->ApCliMlmeAux.HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF))\n\t\t\t\t{\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\t\t\t\tpAd->MacTab.fAnyStationNonGF = TRUE;\n\t\t\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;\n\t\t\t\t}\n\n\t\t\t\tif ((pHtCapability->HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth))\n\t\t\t\t{\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.BW= BW_40;\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(pHtCapability->HtCapInfo.ShortGIfor40));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\t\t\tpMacEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(pHtCapability->HtCapInfo.ShortGIfor20));\n\t\t\t\t\tpAd->MacTab.fAnyStation20Only = TRUE;\n\t\t\t\t}\n\n\t\t\t\t/* find max fixed rate */\n\t\t\t\tpMacEntry->MaxHTPhyMode.field.MCS = get_ht_max_mcs(pAd, &pAd->ApCfg.ApCliTab[ifIndex].DesiredHtPhyInfo.MCSSet[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&pHtCapability->MCSSet[0]);\n\n\t\t\t\tif (pAd->ApCfg.ApCliTab[ifIndex].DesiredTransmitSetting.field.MCS != MCS_AUTO)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF-apcli%d : Desired MCS = %d\\n\", ifIndex,\n\t\t\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].DesiredTransmitSetting.field.MCS));\n\n\t\t\t\t\tset_ht_fixed_mcs(pAd, pMacEntry, pAd->ApCfg.ApCliTab[ifIndex].DesiredTransmitSetting.field.MCS, pAd->ApCfg.ApCliTab[ifIndex].HTPhyMode.field.MCS);\n\t\t\t\t}\n\n\t\t\t\tpMacEntry->MaxHTPhyMode.field.STBC = (pHtCapability->HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\t\t\tpMacEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity;\n\t\t\t\tpMacEntry->MaxRAmpduFactor = pHtCapability->HtCapParm.MaxRAmpduFactor;\n\t\t\t\tpMacEntry->MmpsMode = (UCHAR)pHtCapability->HtCapInfo.MimoPs;\n\t\t\t\tpMacEntry->AMsduSize = (UCHAR)pHtCapability->HtCapInfo.AMsduSize;\t\t\t\t\n\t\t\t\tpMacEntry->HTPhyMode.word = pMacEntry->MaxHTPhyMode.word;\n\t\t\t\tif (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE))\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_AMSDU_INUSED);\n\t\t\t\tif (pHtCapability->HtCapInfo.ShortGIfor20)\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\t\t\tif (pHtCapability->HtCapInfo.ShortGIfor40)\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\t\t\tif (pHtCapability->HtCapInfo.TxSTBC)\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\t\t\tif (pHtCapability->HtCapInfo.RxSTBC)\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\t\t\tif (pHtCapability->ExtHtCapInfo.PlusHTC)\t\t\t\t\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\t\t\tif (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport)\t\t\t\t\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_RDG_CAPABLE);\t\n\t\t\t\tif (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\t\t\n\t\t\t\tNdisMoveMemory(&pMacEntry->HTCapability, &pAd->ApCliMlmeAux.HtCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\t\tNdisMoveMemory(pMacEntry->HTCapability.MCSSet, pApCliEntry->RxMcsSet, 16);\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->MacTab.fAnyStationIsLegacy = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliLinkUp - MaxSupRate=%d Mbps\\n\",\n\t\t\t\t\t\t\t\t  RateIdToMbps[pMacEntry->MaxSupportedRate]));\n\t\t\t}\t\t\t\t\n\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tpMacEntry->HTPhyMode.word = pMacEntry->MaxHTPhyMode.word;\n\t\t\tpMacEntry->CurrTxRate = pMacEntry->MaxSupportedRate;\n\t\t\t\n\t\t\tif (pAd->ApCfg.ApCliTab[ifIndex].bAutoTxRateSwitch == FALSE)\n\t\t\t{\n\t\t\t\tpMacEntry->bAutoTxRateSwitch = FALSE;\n\t\t\t\t/* If the legacy mode is set, overwrite the transmit setting of this entry.  \t */\t\t\n\t\t\t\tRTMPUpdateLegacyTxSetting((UCHAR)pAd->ApCfg.ApCliTab[ifIndex].DesiredTransmitSetting.field.FixedTxMode, pMacEntry);\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUCHAR TableSize = 0;\n\n\t\t\t\tpMacEntry->bAutoTxRateSwitch = TRUE;\n\t\t\t\tMlmeSelectTxRateTable(pAd, pMacEntry, &pMacEntry->pTable, &TableSize, &pMacEntry->CurrTxRateIndex);\n\t\t\t}\n\n\t\t\t/* It had been set in APStartUp. Don't set again. */\n\t\t\tif (!INFRA_ON(pAd))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&(pAd->CommonCfg.APEdcaParm), &(pAd->ApCliMlmeAux.APEdcaParm), sizeof(EDCA_PARM));\n\n\t\t\t\tAsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);\n\t\t\t}\n\t\t\t\n\t\t\t/* set this entry WMM capable or not */\n\t\t\tif ((pAd->ApCliMlmeAux.APEdcaParm.bValid)\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t|| IS_HT_STA(pMacEntry)\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCLIENT_STATUS_CLEAR_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t}\n\n\t\t\tif (pAd->CommonCfg.bAggregationCapable)\n\t\t\t{\n\t\t\t\tif ((pAd->CommonCfg.bPiggyBackCapable) && (pAd->ApCliMlmeAux.APRalinkIe & 0x00000003) == 3)\n\t\t\t\t{\n\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);\n\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE);\n\t\t\t\t\tRTMPSetPiggyBack(pAd, TRUE);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Turn on Piggy-Back\\n\"));\n\t\t\t\t}\n\t\t\t\telse if (pAd->ApCliMlmeAux.APRalinkIe & 0x00000001)\n\t\t\t\t{\n\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);\n\t\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Ralink Aggregation\\n\"));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpApCliEntry->ApCliBeaconPeriod = pAd->ApCliMlmeAux.BeaconPeriod;\n\n\t\t\t\t{\n\t\t\t\t\tULONG\tTmpLen;\n\t\t\t\t\tUCHAR\tP2pIdx = P2P_NOT_FOUND;\n\t\t\t\t\tUCHAR\tGroupCap = 0xff, DeviceCap = 0xff, DevAddr[6] = {0}, DeviceType[8], DeviceName[32], DeviceNameLen = 0;\n\t\t\t\t\tPUCHAR\tpData;\n\t\t\t\t\tUSHORT\tDpid, ConfigMethod;\n\t\t\t\n\t\t\t\t\tpMacEntry->bP2pClient = TRUE;\n\t\t\t\t\tpMacEntry->P2pInfo.P2pClientState = P2PSTATE_GO_OPERATING;\n\n\t\t\t\t\tP2pIdx = P2pGroupTabSearch(pAd, pMacEntry->Addr);\n\t\t\t\t\tif (P2pIdx == P2P_NOT_FOUND)\n\t\t\t\t\t\tP2pIdx = P2pGroupTabInsert(pAd, DevAddr, P2PSTATE_DISCOVERY_GO, NULL, 0, 0, 0);\n\t\t\t\n\t\t\t\t\tif (P2pIdx != P2P_NOT_FOUND)\n\t\t\t\t\t\tpMacEntry->P2pInfo.p2pIndex = P2pIdx;\n\t\t\t\t}\n\n\t\t\tresult = TRUE;\n\n\t\t\tpAd->ApCfg.ApCliInfRunned++;\n\t\t\tbreak;\n\t\t}\n\t\tresult = FALSE;\n\n\t} while(FALSE);\n\n\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\tOPMODE_AP,\n\t\t\t\t\tpMacEntry,\n\t\t\t\t\tpAd->ApCliMlmeAux.SupRate,\n\t\t\t\t\tpAd->ApCliMlmeAux.SupRateLen,\n\t\t\t\t\tpAd->ApCliMlmeAux.ExtRate,\n\t\t\t\t\tpAd->ApCliMlmeAux.ExtRateLen,\n#ifdef DOT11_VHT_AC\n\t\t\t\t\tpAd->ApCliMlmeAux.vht_cap_len,\n\t\t\t\t\t&pAd->ApCliMlmeAux.vht_cap,\n#endif /* DOT11_VHT_AC */\n\t\t\t\t\t&pAd->ApCliMlmeAux.HtCapability,\n\t\t\t\t\tpAd->ApCliMlmeAux.HtCapabilityLen);\n\n#ifdef WSC_AP_SUPPORT\n\n\t/* WSC initial connect to AP, jump to Wsc start action and set the correct parameters     */\n\tif ((result == TRUE) && \n\t\t(pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode == WSC_ENROLLEE) &&\n\t\t(pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == TRUE))\n\t{\n\t\tpAd->ApCfg.ApCliTab[ifIndex].WscControl.WscState = WSC_STATE_LINK_UP;\n\t\tpAd->ApCfg.ApCliTab[ifIndex].WscControl.WscStatus = WSC_STATE_LINK_UP;\n\t\tpAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].WscControl.EntryAddr, MAC_ADDR_LEN);        \n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].WscControl.EntryAddr, pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\t\tWscSendEapolStart(pAd, pMacEntry->Addr, AP_MODE);\n\t}\n\telse\n\t{\n\t\tWscStop(pAd, TRUE, &pAd->ApCfg.ApCliTab[ifIndex].WscControl);\n\t}\n#endif /* WSC_AP_SUPPORT */\n\n\n#ifdef CONFIG_MULTI_CHANNEL\t\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t{\n\t\tUINT32 Data;\n\t\tRTMP_IO_READ32(pAd, WMM_CTRL, &Data);\n\t\tData |= 0x80000000;/* bit 31 set to 1 */   /*  WMM Channel switch to EDCA2 */\n\t\tRTMP_IO_WRITE32(pAd, WMM_CTRL, Data);\n\n\n\t\tRtmpPrepareHwNullFrame(pAd,\n\t\t\t\t\t\t\tpMacEntry,\n\t\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\t\tFALSE,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tOPMODE_AP,\n\t\t\t\t\t\t\tPWR_SAVE,\n\t\t\t\t\t\t\tTRUE,\n\t\t\t\t\t\t\t1);\n\n\t\tif ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t    (pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger\n\t\t    )) \n\t\t{\n\t\t\tprintk (\"p2p WSC trigger not set Multi-channel!!\\n\");\n\t\t}\n\t\telse if (INFRA_ON(pAd) \n\t\t\t&& pMacEntry->PortSecured == WPA_802_1X_PORT_SECURED \n\t\t\t&& pMacEntry->WepStatus == Ndis802_11WEPDisabled)\n\t\t{\n\t\t\tprintk(\"INFRA_ON(pAd) set HCCAToEDCATimer\\n\");\n\n\t\t\tif (pAd->P2pCfg.bStartP2pConnect)\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.bStartP2pConnect = FALSE;\n\t\t\t}\n\n\t\t\tRTMPSetTimer(&pAd->Mlme.MCCTimer, pAd->Mlme.HCCAToEDCATimerValue);\n\t\t}\n\t\tpAd->Mlme.P2pStayTick = 0;\n\n\t\tpAd->StaCfg.bImprovedScan = FALSE;\n\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\treturn result;\n}\n\n/*\n    ==========================================================================\n\n\tRoutine\tDescription:\n\t\tDisconnect current BSSID\n\n\tArguments:\n\t\tpAd\t\t\t\t- Pointer to our adapter\n\t\tApCliIdx\t\t- Which ApCli interface\t\t\n\tReturn Value:\t\t\n\t\tNone\n\n\tNote:\n\n\t==========================================================================\n*/\nVOID ApCliLinkDown(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR ifIndex)\n{\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tMAC_TABLE_ENTRY *pEntry;\n\tUCHAR P2pIdx = P2P_NOT_FOUND;\n\tUCHAR           BBPValue = 0;\n\n\tif (ifIndex < MAX_APCLI_NUM)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! APCLI LINK DOWN - IF(apcli%d)!!!\\n\", ifIndex));\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! ERROR : APCLI LINK DOWN - IF(apcli%d)!!!\\n\", ifIndex));\n\t\treturn;\n\t}\n    \t\n\n#ifdef CONFIG_MULTI_CHANNEL\t\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\tMultiChannelTimerStop(pAd);\n#endif /* CONFIG_MULTI_CHANNEL */\n    \t\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif (pApCliEntry->Valid == FALSE)\t\n\t\treturn;\n\n\t/* Find the p2p Entry and change the p2p State. */\n\tif (pApCliEntry->bP2pClient)\n\t{\n\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[0].CfgApCliBssid, MAC_ADDR_LEN);\n\t\tpEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];\n\t\tP2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr);\n\n\t\tif ((P2P_CLI_ON(pAd)) && (IS_ENTRY_APCLI(pEntry)) && \n\t\t\t(pEntry->WpaState == AS_PTKINITDONE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::  Secured = %d.  Addr = %02x:%02x:%02x:%02x:%02x:%02x.\\n\", \n\t\t\t\t\t\t__FUNCTION__, pEntry->PortSecured, PRINT_MAC(pEntry->Addr)));\n\t\t\tif (P2pIdx != P2P_NOT_FOUND) \n\t\t\tpAd->P2pTable.Client[P2pIdx].P2pClientState = P2PSTATE_DISCOVERY;\n\t\t\tif (pAd->P2pCfg.bP2pCliReConnect == FALSE)\n\t\t\t\tP2pLinkDown(pAd, P2P_DISCONNECTED);\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->P2pCfg.bP2pCliReConnectTimerRunning = TRUE;\n\t\t\t\tRTMPSetTimer(&pAd->P2pCfg.P2pCliReConnectTimer, P2P_CHECK_CLIENT_TIMER);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((INFRA_ON(pAd)) && (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40))\n\t{\n\n\t}\n\telse\n\t{\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t}\n\n\tpAd->ApCfg.ApCliInfRunned--;\n\tMacTableDeleteEntry(pAd, pApCliEntry->MacTabWCID, APCLI_ROOT_BSSID_GET(pAd, pApCliEntry->MacTabWCID));\n\n\t/* Clean Bss Search Table. */\n#ifdef CONFIG_MULTI_CHANNEL\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n++++++++ %s::  Delete BssSearch Table on Channel = %d. ++++++++\\n\", __FUNCTION__, pAd->ApCliMlmeAux.Channel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"                   BSSID = [%02x:%02x:%02x:%02x:%02x:%02x].  p2p_bssid = [%02x:%02x:%02x:%02x:%02x:%02x].\\n\", PRINT_MAC(pAd->ApCliMlmeAux.Bssid), PRINT_MAC(pAd->P2pCfg.Bssid)));\n\tBssTableDeleteEntry(&pAd->ScanTab,\n\t\t\t    /*pAd->ApCliMlmeAux.Bssid*/pAd->P2pCfg.Bssid,\n\t\t\t    pAd->ApCliMlmeAux.Channel);\n#else\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n++++++++ %s::  Delete BssSearch Table on Channel = %d. ++++++++\\n\", __FUNCTION__, pAd->CommonCfg.Channel));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"                   BSSID = [%02x:%02x:%02x:%02x:%02x:%02x].  p2p_bssid = [%02x:%02x:%02x:%02x:%02x:%02x].\\n\", PRINT_MAC(pAd->ApCliMlmeAux.Bssid), PRINT_MAC(pAd->P2pCfg.Bssid)));\n\tBssTableDeleteEntry(&pAd->ScanTab,\n\t\t\t    /*pAd->ApCliMlmeAux.Bssid*/pAd->P2pCfg.Bssid,\n\t\t\t    pAd->CommonCfg.Channel);\n#endif /*CONFIG_MULTI_CHANNEL*/\n\tpApCliEntry->Valid = FALSE;\t/* This link doesn't associated with any remote-AP  */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t{\n\t\tUINT32 Data;\n\t\tRTMP_IO_READ32(pAd, WMM_CTRL, &Data);\n\t\tData &= 0x7fffffff;/* bit 31 set to 0 */\t/*  WMM Channel switch to EDCA1 */\n\t\tRTMP_IO_WRITE32(pAd, WMM_CTRL, Data);\n\n\t\tif(!P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tUINT32 Value=0;\n\t\t\tMultiChannelSwitchToRa(pAd);\n\t\t\tRTUSBReadMACRegister(pAd, PBF_CFG, &Value);\n\t\t\tValue |= ((1 << 3) | (1 << 13));/* bit 3 and bit 13 set to 1 */\n\t\t\tValue |= ((1 << 2) | (1 << 12));/* bit 2  and bit 12 set to 1 */\n\t\t\tRTUSBWriteMACRegister(pAd, PBF_CFG, Value,FALSE);\n\t\t\tpAd->MultiChannelFlowCtl=0;\n\t\t\tRTMP_OS_NETDEV_WAKE_QUEUE(pAd->net_dev);\n\t\t}\t\n\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI Interface Up.\n    ==========================================================================\n */\nVOID ApCliIfUp(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR ifIndex;\n\tPAPCLI_STRUCT pApCliEntry;\n\n\t/* Reset is in progress, stop immediately */\n\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||\n\t\t RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) ||\n\t\t !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n\t\treturn;\n\n\t/* sanity check whether the interface is initialized. */\n\tif (pAd->flg_apcli_init != TRUE)\n\t\treturn;\n\n\tfor(ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++)\n\t{\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\tif (APCLI_IF_UP_CHECK(pAd, ifIndex) \n\t\t\t&& (pApCliEntry->Enable == TRUE)\n\t\t\t&& (pApCliEntry->Valid == FALSE))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCli interface[%d] startup.\\n\", __FUNCTION__, ifIndex));\n\t\t\tCOPY_MAC_ADDR(pApCliEntry->CfgApCliBssid, pAd->P2pCfg.Bssid);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SSID = [%s].    BSSID = [%02x:%02x:%02x:%02x:%02x:%02x].\\n\", pApCliEntry->CfgSsid, PRINT_MAC(pApCliEntry->CfgApCliBssid)));\n\t\t\tif (pAd->ApCfg.ApCliTab[0].CtrlCurrState == APCLI_CTRL_DISCONNECTED)\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ, 0, NULL, ifIndex);\n\t\t}\n\t}\n\n\treturn;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        APCLI Interface Down.\n    ==========================================================================\n */\nVOID ApCliIfDown(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR ifIndex;\n\tPAPCLI_STRUCT pApCliEntry;\n\n\tfor(ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++)\n\t{\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCli interface[%d] startdown.\\n\", __FUNCTION__, ifIndex));\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex);\n\t}\n\n\treturn;\n}\n\n\n\n/* \n    ==========================================================================\n    Description:\n        APCLI Interface Monitor.\n    ==========================================================================\n */\nVOID ApCliIfMonitor(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR index;\n\tPAPCLI_STRUCT pApCliEntry;\t\n\n\t/* Reset is in progress, stop immediately */\n\tif ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||\n\t\t RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) ||\n\t\t !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n\t\treturn;\n\n\t/* sanity check whether the interface is initialized. */\n\tif (pAd->flg_apcli_init != TRUE)\n\t\treturn;\n\t\n\tfor(index = 0; index < MAX_APCLI_NUM; index++)\n\t{\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[index];\n\t\tif ((pApCliEntry->Valid == TRUE)\n\t\t\t&& (RTMP_TIME_AFTER(pAd->Mlme.Now32 , (pApCliEntry->ApCliRcvBeaconTime + (4 * OS_HZ)))))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliIfMonitor: IF(apcli%d) - no Beancon is received from root-AP.\\n\", index));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliIfMonitor: Reconnect the Root-Ap again.\\n\"));\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, index);\n\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t}\n\t}\n\n\treturn;\n}\n\n/*! \\brief   To substitute the message type if the message is coming from external\n *  \\param  pFrame         The frame received\n *  \\param  *Machine       The state machine\n *  \\param  *MsgType       the message type for the state machine\n *  \\return TRUE if the substitution is successful, FALSE otherwise\n *  \\pre\n *  \\post\n */\nBOOLEAN ApCliMsgTypeSubst(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType)\n{\n\tUSHORT Seq;\n\tUCHAR EAPType; \n\tBOOLEAN Return = FALSE;\n#ifdef WSC_AP_SUPPORT\n\tUCHAR EAPCode;\n    PMAC_TABLE_ENTRY pEntry;\n#endif /* WSC_AP_SUPPORT */\n\n\n\t/* only PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid; otherwise,  */\n\t/* ignore this frame */\n\n\t/* WPA EAPOL PACKET */\n\tif (pFrame->Hdr.FC.Type == BTYPE_DATA)\n\t{\t\t\n#ifdef WSC_AP_SUPPORT    \n        /* WSC EAPOL PACKET         */\n        pEntry = MacTableLookup(pAd, pFrame->Hdr.Addr2);\n        if (pEntry && IS_ENTRY_APCLI(pEntry) && pAd->ApCfg.ApCliTab[pEntry->apidx].WscControl.WscConfMode == WSC_ENROLLEE)\n        {\n            *Machine = WSC_STATE_MACHINE;\n            EAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1);\n            EAPCode = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 4);\n            Return = WscMsgTypeSubst(EAPType, EAPCode, MsgType);\n        }\n        if (!Return)\n#endif /* WSC_AP_SUPPORT */\n        {\n    \t\t*Machine = WPA_STATE_MACHINE;\n    \t\tEAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1);\n    \t\tReturn = WpaMsgTypeSubst(EAPType, MsgType);\n        }\n\t\treturn Return;\n\t}\n\telse if (pFrame->Hdr.FC.Type == BTYPE_MGMT) \t\t\n\t{\n\t\tswitch (pFrame->Hdr.FC.SubType) \n\t\t{\n\t\t\tcase SUBTYPE_ASSOC_RSP:\n\t\t\t\t*Machine = APCLI_ASSOC_STATE_MACHINE;\n\t\t\t\t*MsgType = APCLI_MT2_PEER_ASSOC_RSP;\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_DISASSOC:\n\t\t\t\t*Machine = APCLI_ASSOC_STATE_MACHINE;\n\t\t\t\t*MsgType = APCLI_MT2_PEER_DISASSOC_REQ;\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_DEAUTH:\n\t\t\t\t*Machine = APCLI_AUTH_STATE_MACHINE;\n\t\t\t\t*MsgType = APCLI_MT2_PEER_DEAUTH;\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_AUTH:\n\t\t\t\t/* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */\n\t\t\t\tNdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT));\n\t\t\t\tif (Seq == 2 || Seq == 4)\n\t\t\t\t{\n\t\t\t\t\t*Machine = APCLI_AUTH_STATE_MACHINE;\n\t\t\t\t\t*MsgType = APCLI_MT2_PEER_AUTH_EVEN;\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SUBTYPE_ACTION:\n\t\t\t\t*Machine = ACTION_STATE_MACHINE;\n\t\t\t\t/*  Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */\n\t\t\t\tif ((pFrame->Octet[0]&0x7F) > MAX_PEER_CATE_MSG) \n\t\t\t\t{\n\t\t\t\t\t*MsgType = MT2_ACT_INVALID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t*MsgType = (pFrame->Octet[0]&0x7F);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nBOOLEAN preCheckMsgTypeSubset(\n\tIN PRTMP_ADAPTER  pAd,\n\tIN PFRAME_802_11 pFrame, \n\tOUT INT *Machine, \n\tOUT INT *MsgType)\n{\n\tif (pFrame->Hdr.FC.Type == BTYPE_MGMT) \t\t\n\t{\n\t\tswitch (pFrame->Hdr.FC.SubType) \n\t\t{\n\t\t\t/* Beacon must be processed be AP Sync state machine. */\n        \tcase SUBTYPE_BEACON:\n\t\t\t\t*Machine = AP_SYNC_STATE_MACHINE;\n\t\t\t\t*MsgType = APMT2_PEER_BEACON;\n            \tbreak;\n\n\t\t\t/* Only Sta have chance to receive Probe-Rsp. */\n\t\t\tcase SUBTYPE_PROBE_RSP:\n\t\t\t\t*Machine = APCLI_SYNC_STATE_MACHINE;\n\t\t\t\t*MsgType = APCLI_MT2_PEER_PROBE_RSP;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t}\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n    IRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN ApCliPeerAssocRspSanity(\n    IN PRTMP_ADAPTER pAd, \n    IN VOID *pMsg, \n    IN ULONG MsgLen, \n    OUT PUCHAR pAddr2, \n    OUT USHORT *pCapabilityInfo, \n    OUT USHORT *pStatus, \n    OUT USHORT *pAid, \n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement,\n    OUT UCHAR SupRate[], \n    OUT UCHAR *pSupRateLen,\n    OUT UCHAR ExtRate[], \n    OUT UCHAR *pExtRateLen,\n    OUT HT_CAPABILITY_IE *pHtCapability,\n    OUT ADD_HT_INFO_IE *pAddHtInfo,\t/* AP might use this additional ht info IE  */\n    OUT UCHAR *pHtCapabilityLen,\n    OUT UCHAR *pAddHtInfoLen,\n    OUT UCHAR *pNewExtChannelOffset,\n    OUT PEDCA_PARM pEdcaParm,\n    OUT UCHAR *pCkipFlag) \n{\n\tCHAR          IeType, *Ptr;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;\n\tPEID_STRUCT   pEid;\n\tULONG         Length = 0;\n\tUCHAR\tP2POUIBYTE[4] = {0x50, 0x6f, 0x9a, 0x9};\n    \n\t*pNewExtChannelOffset = 0xff;\n\t*pHtCapabilityLen = 0;\n\t*pAddHtInfoLen = 0;\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\tPtr = (CHAR *) pFrame->Octet;\n\tLength += LENGTH_802_11;\n        \n\tNdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2);\n\tLength += 2;\n\tNdisMoveMemory(pStatus,         &pFrame->Octet[2], 2);\n\tLength += 2;\n\t*pCkipFlag = 0;\n\t*pExtRateLen = 0;\n\tpEdcaParm->bValid = FALSE;\n    \n\tif (*pStatus != MLME_SUCCESS) \n\t\treturn TRUE;\n    \n\tNdisMoveMemory(pAid, &pFrame->Octet[4], 2);\n\tLength += 2;\n\n\t/* Aid already swaped byte order in RTMPFrameEndianChange() for big endian platform */\n\t*pAid = (*pAid) & 0x3fff; /* AID is low 14-bit */\n        \n\t/* -- get supported rates from payload and advance the pointer */\n\tIeType = pFrame->Octet[6];\n\t*pSupRateLen = pFrame->Octet[7];\n\tif ((IeType != IE_SUPP_RATES) || (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): fail - wrong SupportedRates IE\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t}\n\telse \n\t\tNdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen);\n\n\tLength = Length + 2 + *pSupRateLen;\n\n\t/* many AP implement proprietary IEs in non-standard order, we'd better */\n\t/* tolerate mis-ordered IEs to get best compatibility */\n\tpEid = (PEID_STRUCT) &pFrame->Octet[8 + (*pSupRateLen)];\n            \n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= MsgLen)\n\t{\n\t\tswitch (pEid->Eid)\n\t\t{\n\t\t\tcase IE_EXT_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pExtRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n#ifdef DOT11_N_SUPPORT\n\t\t\tcase IE_HT_CAP:\n\t\t\tcase IE_HT_CAP2:\n\t\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE)  /* Note: allow extension.!! */\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pHtCapability, pEid->Octet, SIZE_HT_CAP_IE);\n\t\t\t\t\t*(USHORT *) (&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n\t\t\t\t\t*(USHORT *) (&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n\t\t\t\t\t*pHtCapabilityLen = SIZE_HT_CAP_IE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_HT_CAP. \\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase IE_ADD_HT:\n\t\t\tcase IE_ADD_HT2:\n\t\t\t\tif (pEid->Len >= sizeof(ADD_HT_INFO_IE))\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\t/* This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only */\n\t\t\t\t\t/* copy first sizeof(ADD_HT_INFO_IE) */\n\t\t\t\t\tNdisMoveMemory(pAddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE));\n\t\t\t\t\t*pAddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_ADD_HT. \\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IE_SECONDARY_CH_OFFSET:\n\t\t\t\tif (pEid->Len == 1)\n\t\t\t\t{\n\t\t\t\t\t*pNewExtChannelOffset = pEid->Octet[0];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_SECONDARY_CH_OFFSET. \\n\", __FUNCTION__));\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\t\t/* CCX2, WMM use the same IE value */\n\t\t\t/* case IE_CCX_V2: */\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t/* handle WME PARAMTER ELEMENT */\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))\n\t\t\t\t{\n\t\t\t\t\tPUCHAR ptr;\n\t\t\t\t\tint i;\n        \n\t\t\t\t\t/* parsing EDCA parameters */\n\t\t\t\t\tpEdcaParm->bValid          = TRUE;\n\t\t\t\t\tpEdcaParm->bQAck           = FALSE; /* pEid->Octet[0] & 0x10; */\n\t\t\t\t\tpEdcaParm->bQueueRequest   = FALSE; /* pEid->Octet[0] & 0x20; */\n\t\t\t\t\tpEdcaParm->bTxopRequest    = FALSE; /* pEid->Octet[0] & 0x40; */\n\t\t\t\t\t/*pEdcaParm->bMoreDataAck    = FALSE; *//* pEid->Octet[0] & 0x80; */\n\t\t\t\t\tpEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;\n\t\t\t\t\tpEdcaParm->bAPSDCapable    = (pEid->Octet[6] & 0x80) ? 1 : 0;\n\t\t\t\t\tptr = (PUCHAR) &pEid->Octet[8];\n\t\t\t\t\tfor (i=0; i<4; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR aci = (*ptr & 0x60) >> 5; /* b5~6 is AC INDEX */\n\t\t\t\t\t\tpEdcaParm->bACM[aci]  = (((*ptr) & 0x10) == 0x10);   /* b5 is ACM */\n\t\t\t\t\t\tpEdcaParm->Aifsn[aci] = (*ptr) & 0x0f;               /* b0~3 is AIFSN */\n\t\t\t\t\t\tpEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f;             /* b0~4 is Cwmin */\n\t\t\t\t\t\tpEdcaParm->Cwmax[aci] = *(ptr+1) >> 4;               /* b5~8 is Cwmax */\n\t\t\t\t\t\tpEdcaParm->Txop[aci]  = *(ptr+2) + 256 * (*(ptr+3)); /* in unit of 32-us */\n\t\t\t\t\t\tptr += 4; /* point to next AC */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, P2POUIBYTE, sizeof(P2POUIBYTE)) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, (pEid->Len+2));\n\t\t\t\t\t\t*P2PSubelementLen = (pEid->Len+2);\n\t\t\t\t\t}\n\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, (pEid->Len+2));\n\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t}\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\" ! ===>P2P - %s\tP2P IE Len becomes = %ld.\\n\", __FUNCTION__, *P2PSubelementLen));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():ignore unrecognized EID = %d\\n\", __FUNCTION__, pEid->Eid));\n\t\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t}\n\n\treturn TRUE;\n}\n\n\nMAC_TABLE_ENTRY *ApCliTableLookUpByWcid(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR wcid,\n\tIN PUCHAR pAddrs)\n{\n\t/*USHORT HashIdx; */\n\tULONG ApCliIndex;\n\tPMAC_TABLE_ENTRY pCurEntry = NULL;\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\n\tif (wcid <=0 || wcid >= MAX_LEN_OF_MAC_TABLE )\n\t\treturn NULL;\n\n\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\n\tdo\n\t{\n\t\tpCurEntry = &pAd->MacTab.Content[wcid];\n\n\t\tApCliIndex = 0xff;\n\t\tif ((pCurEntry) && IS_ENTRY_APCLI(pCurEntry))\n\t\t{\n\t\t\tApCliIndex = pCurEntry->MatchAPCLITabIdx;\n\t\t}\n\n\t\tif ((ApCliIndex == 0xff) || (ApCliIndex >= MAX_APCLI_NUM))\n\t\t\tbreak;\n\n\t\tif (pAd->ApCfg.ApCliTab[ApCliIndex].Valid != TRUE)\n\t\t\tbreak;\n\n\t\tif (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddrs))\n\t\t{\n\t\t\tpEntry = pCurEntry;\n\t\t\tbreak;\n\t\t}\n\t} while(FALSE);\n\n\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\treturn pEntry;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tCheck the WDS Entry is valid or not.\n\t==========================================================================\n */\nstatic inline BOOLEAN ValidApCliEntry(\n\tIN PRTMP_ADAPTER pAd,\n\tIN INT apCliIdx)\n{\n\tBOOLEAN result;\n\tPMAC_TABLE_ENTRY pMacEntry;\n\tAPCLI_STRUCT *pApCliEntry;\n\tdo\n\t{\n\t\tif ((apCliIdx < 0) || (apCliIdx >= MAX_APCLI_NUM))\n\t\t{\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\tpApCliEntry = (APCLI_STRUCT *)&pAd->ApCfg.ApCliTab[apCliIdx];\n\t\tif (pApCliEntry->Valid != TRUE)\n\t\t{\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\tif ((pApCliEntry->MacTabWCID <= 0) \n\t\t\t|| (pApCliEntry->MacTabWCID >= MAX_LEN_OF_MAC_TABLE))\n\t\t{\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\t\n\t\tpMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];\n\t\tif (!IS_ENTRY_APCLI(pMacEntry))\n\t\t{\n\t\t\tresult = FALSE;\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tresult = TRUE;\n\t} while(FALSE);\n\n\treturn result;\n}\n\n\nBOOLEAN ApCliAllowToSendPacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET pPacket,\n\tOUT UCHAR\t\t*pWcid)\n{\n\tUCHAR apCliIdx;\n\tBOOLEAN\tallowed;\n\t\t\n\t/*DBGPRINT(RT_DEBUG_TRACE, (\"ApCliAllowToSendPacket():Packet to ApCli interface!\\n\")); */\n\tapCliIdx = RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_APCLI;\n\tif (ValidApCliEntry(pAd, apCliIdx))\n\t{\n\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"ApCliAllowToSendPacket(): Set the WCID as %d!\\n\", pAd->ApCfg.ApCliTab[apCliIdx].MacTabWCID)); */\n\t\t\n\t\t*pWcid = pAd->ApCfg.ApCliTab[apCliIdx].MacTabWCID;\n\t\t/*RTMP_SET_PACKET_WCID(pPacket, pAd->ApCfg.ApCliTab[apCliIdx].MacTabWCID); *//* to ApClient links. */\n\t\t\n\t\tallowed = TRUE;\n\t}\n\telse\n\t{\n\t\tallowed = FALSE;\n\t}\n\n\treturn allowed;\n\t\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tValidate the security configuration against the RSN information \n\t\telement\n\n\tArguments:\n\t\tpAdapter\tPointer\tto our adapter\n\t\teid_ptr \tPointer to VIE\n\t\t\n\tReturn Value:\n\t\tTRUE \tfor configuration match \n\t\tFALSE\tfor otherwise\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nBOOLEAN \tApCliValidateRSNIE(\n\tIN\t\tPRTMP_ADAPTER\tpAd, \n\tIN \t\tPEID_STRUCT    \tpEid_ptr,\n\tIN\t\tUSHORT\t\t\teid_len,\n\tIN\t\tUSHORT\t\t\tidx)\n{\n\tPUCHAR              pVIE;\n\tPUCHAR\t\t\t\tpTmp;\n\tUCHAR         \t\tlen;\n\tPEID_STRUCT         pEid;\t\t\t\n\tCIPHER_SUITE\t\tWPA;\t\t\t/* AP announced WPA cipher suite */\n\tCIPHER_SUITE\t\tWPA2;\t\t\t/* AP announced WPA2 cipher suite */\n\tUSHORT\t\t\t\tCount;\n\tUCHAR               Sanity;\t \n\tPAPCLI_STRUCT   \tpApCliEntry = NULL;\n\tPRSN_IE_HEADER_STRUCT\t\t\tpRsnHeader;\n\tNDIS_802_11_ENCRYPTION_STATUS\tTmpCipher;\n\tNDIS_802_11_AUTHENTICATION_MODE TmpAuthMode;\n\tNDIS_802_11_AUTHENTICATION_MODE WPA_AuthMode;\n\tNDIS_802_11_AUTHENTICATION_MODE WPA_AuthModeAux;\n\tNDIS_802_11_AUTHENTICATION_MODE WPA2_AuthMode;\n\tNDIS_802_11_AUTHENTICATION_MODE WPA2_AuthModeAux;\n\n\tpVIE = (PUCHAR) pEid_ptr;\n\tlen\t = eid_len;\n\n\t/* if (len >= MAX_LEN_OF_RSNIE || len <= MIN_LEN_OF_RSNIE) */\n\t/*\treturn FALSE; */\n\n\t/* Init WPA setting */\n\tWPA.PairCipher    \t= Ndis802_11WEPDisabled;\n\tWPA.PairCipherAux \t= Ndis802_11WEPDisabled;\n\tWPA.GroupCipher   \t= Ndis802_11WEPDisabled;\n\tWPA.RsnCapability \t= 0;\n\tWPA.bMixMode      \t= FALSE;\n\tWPA_AuthMode\t  \t= Ndis802_11AuthModeOpen;\n\tWPA_AuthModeAux\t\t= Ndis802_11AuthModeOpen;\t\n\n\t/* Init WPA2 setting */\n\tWPA2.PairCipher    \t= Ndis802_11WEPDisabled;\n\tWPA2.PairCipherAux \t= Ndis802_11WEPDisabled;\n\tWPA2.GroupCipher   \t= Ndis802_11WEPDisabled;\n\tWPA2.RsnCapability \t= 0;\n\tWPA2.bMixMode      \t= FALSE;\n\tWPA2_AuthMode\t  \t= Ndis802_11AuthModeOpen;\n\tWPA2_AuthModeAux\t= Ndis802_11AuthModeOpen;\n\n\tSanity = 0;\n\n\t/* 1. Parse Cipher this received RSNIE */\n\twhile (len > 0)\n\t{\t\t\n\t\tpTmp = pVIE;\n\t\tpEid = (PEID_STRUCT) pTmp;\t\n\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_WPA:\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPA_OUI, 4) != 1)\n\t\t\t\t{\n\t\t\t\t\t/* if unsupported vendor specific IE */\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t\t/* Skip OUI ,version and multicast suite OUI */\n\t\t\t\tpTmp += 11;\n\n\t\t\t\t/* Cipher Suite Selectors from Spec P802.11i/D3.2 P26. */\n\t            /*  Value      Meaning */\n\t            /*  0           None  */\n\t            /*  1           WEP-40 */\n\t            /*  2           Tkip */\n\t            /*  3           WRAP */\n\t            /*  4           AES */\n\t            /*  5           WEP-104 */\n\t\t\t\t/* Parse group cipher */\n\t\t\t\tswitch (*pTmp)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 5:\t/* Although WEP is not allowed in WPA related auth mode, we parse it anyway */\n\t\t\t\t\t\tWPA.GroupCipher = Ndis802_11Encryption1Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tWPA.GroupCipher = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tWPA.GroupCipher = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* number of unicast suite */\n\t\t\t\tpTmp += 1;\n\n\t\t\t\t/* Store unicast cipher count */\n\t\t\t    NdisMoveMemory(&Count, pTmp, sizeof(USHORT));\n    \t\t\tCount = cpu2le16(Count);\t\t\n\n\t\t\t\t/* pointer to unicast cipher */\n\t\t\t    pTmp += sizeof(USHORT);\t\n\n\t\t\t\t/* Parsing all unicast cipher suite\t\t\t */\t\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Skip cipher suite OUI */\n\t\t\t\t\tpTmp += 3;\n\t\t\t\t\tTmpCipher = Ndis802_11WEPDisabled;\n\t\t\t\t\tswitch (*pTmp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway */\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption1Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption2Enabled;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption3Enabled;\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (TmpCipher > WPA.PairCipher)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower cipher suite to PairCipherAux */\n\t\t\t\t\t\tWPA.PairCipherAux = WPA.PairCipher;\n\t\t\t\t\t\tWPA.PairCipher    = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tWPA.PairCipherAux = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\tpTmp++;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Get AKM suite counts */\n\t\t\t\tNdisMoveMemory(&Count, pTmp, sizeof(USHORT));\n\t\t\t\tCount = cpu2le16(Count);\t\t\n\n\t\t\t\tpTmp   += sizeof(USHORT);\n\n\t\t\t\t/* Parse AKM ciphers */\n\t\t\t\t/* Parsing all AKM cipher suite\t */\t\t\t\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t    \t/* Skip cipher suite OUI */\n\t\t\t\t\tpTmp   += 3;\n\t\t\t\t\tTmpAuthMode = Ndis802_11AuthModeOpen;\n\t\t\t\t\tswitch (*pTmp)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t/* WPA-enterprise */\n\t\t\t\t\t\t\tTmpAuthMode = Ndis802_11AuthModeWPA;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t/* WPA-personal */\n\t\t\t\t\t\t\tTmpAuthMode = Ndis802_11AuthModeWPAPSK;\t\t\t\t\t\t\t\t\t    \t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (TmpAuthMode > WPA_AuthMode)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower AKM suite to WPA_AuthModeAux */\n\t\t\t\t\t\tWPA_AuthModeAux = WPA_AuthMode;\n\t\t\t\t\t\tWPA_AuthMode    = TmpAuthMode;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tWPA_AuthModeAux = TmpAuthMode;\n\t\t\t\t\t}\n\t\t\t\t    pTmp++;\n\t\t\t\t\tCount--;\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t/* ToDo - Support WPA-None ? */\n\n\t\t\t\t/* Check the Pair & Group, if different, turn on mixed mode flag */\n\t\t\t\tif (WPA.GroupCipher != WPA.PairCipher)\n\t\t\t\t\tWPA.bMixMode = TRUE;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliValidateRSNIE - RSN-WPA1 PairWiseCipher(%s), GroupCipher(%s), AuthMode(%s)\\n\",\n\t\t\t\t\t\t\t\t\t\t\t((WPA.bMixMode) ? \"Mix\" : GetEncryptType(WPA.PairCipher)), \n\t\t\t\t\t\t\t\t\t\t\tGetEncryptType(WPA.GroupCipher),\n\t\t\t\t\t\t\t\t\t\t\tGetAuthMode(WPA_AuthMode)));\n\n\t\t\t\tSanity |= 0x1;\n\t\t\t\tbreak;\n\t\t\tcase IE_RSN:\n\t\t\t\tpRsnHeader = (PRSN_IE_HEADER_STRUCT) pTmp;\n\t\t\t\t\n\t\t\t\t/* 0. Version must be 1 */\n\t\t\t\t/*  The pRsnHeader->Version exists in native little-endian order, so we may need swap it for RT_BIG_ENDIAN systems. */\n\t\t\t\tif (le2cpu16(pRsnHeader->Version) != 1)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - RSN Version isn't 1(%d) \\n\", pRsnHeader->Version));\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\n\t\t\t\tpTmp   += sizeof(RSN_IE_HEADER_STRUCT);\n\n\t\t\t\t/* 1. Check cipher OUI\t\t*/\t\t\n\t\t\t\tif (!RTMPEqualMemory(pTmp, RSN_OUI, 3))\n\t\t\t\t{\n\t\t\t\t\t/* if unsupported vendor specific IE */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Skip cipher suite OUI */\n\t\t\t\tpTmp += 3;\n\n\t\t\t\t/* Parse group cipher */\n\t\t\t\tswitch (*pTmp)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 5:\t/* Although WEP is not allowed in WPA related auth mode, we parse it anyway */\n\t\t\t\t\t\tWPA2.GroupCipher = Ndis802_11Encryption1Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tWPA2.GroupCipher = Ndis802_11Encryption2Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tWPA2.GroupCipher = Ndis802_11Encryption3Enabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* number of unicast suite */\n\t\t\t\tpTmp += 1;\n\n\t\t\t\t/* Get pairwise cipher counts\t */\t\t\t\n\t\t\t\tNdisMoveMemory(&Count, pTmp, sizeof(USHORT));\n\t\t\t\tCount = cpu2le16(Count);\n\t\t\t\t\n\t\t\t\tpTmp   += sizeof(USHORT);\n\n\t\t\t\t/* 3. Get pairwise cipher */\n\t\t\t\t/* Parsing all unicast cipher suite */\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Skip OUI*/\n\t\t\t\t\tpTmp += 3;\n\t\t\t\t\tTmpCipher = Ndis802_11WEPDisabled;\n\t\t\t\t\tswitch (*pTmp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway */\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption1Enabled;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption2Enabled;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tTmpCipher = Ndis802_11Encryption3Enabled;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (TmpCipher > WPA2.PairCipher)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower cipher suite to PairCipherAux */\n\t\t\t\t\t\tWPA2.PairCipherAux = WPA2.PairCipher;\n\t\t\t\t\t\tWPA2.PairCipher    = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tWPA2.PairCipherAux = TmpCipher;\n\t\t\t\t\t}\n\t\t\t\t\tpTmp ++;\n\t\t\t\t\tCount--;\n\t\t\t\t}\n\n\t\t\t\t/* Get AKM suite counts\t\t */\t\t\n\t\t\t\tNdisMoveMemory(&Count, pTmp, sizeof(USHORT));\n\t\t\t\tCount = cpu2le16(Count);\t\t\n\n\t\t\t\tpTmp   += sizeof(USHORT);\n\n\t\t\t\t/* Parse AKM ciphers */\n\t\t\t\t/* Parsing all AKM cipher suite\t */\t\t\t\n\t\t\t\twhile (Count > 0)\n\t\t\t\t{\n\t\t\t    \t/* Skip cipher suite OUI */\n\t\t\t\t\tpTmp   += 3;\n\t\t\t\t\tTmpAuthMode = Ndis802_11AuthModeOpen;\n\t\t\t\t\tswitch (*pTmp)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t/* WPA2-enterprise */\n\t\t\t\t\t\t\tTmpAuthMode = Ndis802_11AuthModeWPA2;\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t/* WPA2-personal */\n\t\t\t\t\t\t\tTmpAuthMode = Ndis802_11AuthModeWPA2PSK;\t\t\t\t\t\t\t\t\t    \t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (TmpAuthMode > WPA2_AuthMode)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Move the lower AKM suite to WPA2_AuthModeAux */\n\t\t\t\t\t\tWPA2_AuthModeAux = WPA2_AuthMode;\n\t\t\t\t\t\tWPA2_AuthMode    = TmpAuthMode;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tWPA2_AuthModeAux = TmpAuthMode;\n\t\t\t\t\t}\n\t\t\t\t    pTmp++;\n\t\t\t\t\tCount--;\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t/* Check the Pair & Group, if different, turn on mixed mode flag */\n\t\t\t\tif (WPA2.GroupCipher != WPA2.PairCipher)\n\t\t\t\t\tWPA2.bMixMode = TRUE;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliValidateRSNIE - RSN-WPA2 PairWiseCipher(%s), GroupCipher(%s), AuthMode(%s)\\n\",\n\t\t\t\t\t\t\t\t\t(WPA2.bMixMode ? \"Mix\" : GetEncryptType(WPA2.PairCipher)), GetEncryptType(WPA2.GroupCipher),\n\t\t\t\t\t\t\t\t\tGetAuthMode(WPA2_AuthMode)));\n\n\t\t\t\tSanity |= 0x2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"ApCliValidateRSNIE - Unknown pEid->Eid(%d) \\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/* skip this Eid */\n\t\tpVIE += (pEid->Len + 2);\n\t\tlen  -= (pEid->Len + 2);\n\t\n\t}\n\n\t/* 2. Validate this RSNIE with mine */\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[idx];\n\n\t/* Peer AP doesn't include WPA/WPA2 capable */\n\tif (Sanity == 0) \n\t{\n\t\t/* Check the authenticaton mode */\t\t\n\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s - The authentication mode doesn't match \\n\", __FUNCTION__));\n\t\t\treturn FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - The pre-RSNA authentication mode is used. \\n\", __FUNCTION__));\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\t/* Recovery user-defined cipher suite */\n\tpApCliEntry->PairCipher  = pApCliEntry->WepStatus;\n\tpApCliEntry->GroupCipher = pApCliEntry->WepStatus;\n\tpApCliEntry->bMixCipher  = FALSE;\n\n\tSanity = 0;\t\n\t\n\t/* Check AuthMode and WPA_AuthModeAux for matching, in case AP support dual-AuthMode */\n\t/* WPAPSK */\n\tif ((WPA_AuthMode == pApCliEntry->AuthMode) || \n\t\t((WPA_AuthModeAux != Ndis802_11AuthModeOpen) && (WPA_AuthModeAux == pApCliEntry->AuthMode)))\n\t{\n\t\t/* Check cipher suite, AP must have more secured cipher than station setting */\n\t\tif (WPA.bMixMode == FALSE)\n\t\t{\n\t\t\tif (pApCliEntry->WepStatus != WPA.GroupCipher)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - WPA validate cipher suite error \\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t/* check group cipher */\n\t\tif (pApCliEntry->WepStatus < WPA.GroupCipher)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - WPA validate group cipher error \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/* check pairwise cipher, skip if none matched */\n\t\t/* If profile set to AES, let it pass without question. */\n\t\t/* If profile set to TKIP, we must find one mateched */\n\t\tif ((pApCliEntry->WepStatus == Ndis802_11Encryption2Enabled) && \n\t\t\t(pApCliEntry->WepStatus != WPA.PairCipher) && \n\t\t\t(pApCliEntry->WepStatus != WPA.PairCipherAux))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - WPA validate pairwise cipher error \\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\n\t\tSanity |= 0x1;\n\t}\n\t/* WPA2PSK */\n\telse if ((WPA2_AuthMode == pApCliEntry->AuthMode) || \n\t\t\t ((WPA2_AuthModeAux != Ndis802_11AuthModeOpen) && (WPA2_AuthModeAux == pApCliEntry->AuthMode)))\n\t{\n\t\t/* Check cipher suite, AP must have more secured cipher than station setting */\n\t\tif (WPA2.bMixMode == FALSE)\n\t\t{\n\t\t\tif (pApCliEntry->WepStatus != WPA2.GroupCipher)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - WPA2 validate cipher suite error \\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t/* check group cipher */\n\t\tif (pApCliEntry->WepStatus < WPA2.GroupCipher)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - WPA2 validate group cipher error \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/* check pairwise cipher, skip if none matched */\n\t\t/* If profile set to AES, let it pass without question. */\n\t\t/* If profile set to TKIP, we must find one mateched */\n\t\tif ((pApCliEntry->WepStatus == Ndis802_11Encryption2Enabled) && \n\t\t\t(pApCliEntry->WepStatus != WPA2.PairCipher) && \n\t\t\t(pApCliEntry->WepStatus != WPA2.PairCipherAux))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - WPA2 validate pairwise cipher error \\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tSanity |= 0x2;\n\t}\n\n\tif (Sanity == 0) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ApCliValidateRSNIE - Validate RSIE Failure \\n\"));\n\t\treturn FALSE;\n\t}\n\n\t/* Re-assign pairwise-cipher and group-cipher. Re-build RSNIE.  */\n\tif ((pApCliEntry->AuthMode == Ndis802_11AuthModeWPA) || (pApCliEntry->AuthMode == Ndis802_11AuthModeWPAPSK))\n\t{\n\t\tpApCliEntry->GroupCipher = WPA.GroupCipher;\n\t\t\t\n\t\tif (pApCliEntry->WepStatus == WPA.PairCipher)\n\t\t\tpApCliEntry->PairCipher = WPA.PairCipher;\n\t\telse if (WPA.PairCipherAux != Ndis802_11WEPDisabled)\n\t\t\tpApCliEntry->PairCipher = WPA.PairCipherAux;\n\t\telse\t/* There is no PairCipher Aux, downgrade our capability to TKIP */\n\t\t\tpApCliEntry->PairCipher = Ndis802_11Encryption2Enabled;\t\t\t\n\t}\n\telse if ((pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))\n\t{\n\t\tpApCliEntry->GroupCipher = WPA2.GroupCipher;\n\t\t\t\n\t\tif (pApCliEntry->WepStatus == WPA2.PairCipher)\n\t\t\tpApCliEntry->PairCipher = WPA2.PairCipher;\n\t\telse if (WPA2.PairCipherAux != Ndis802_11WEPDisabled)\n\t\t\tpApCliEntry->PairCipher = WPA2.PairCipherAux;\n\t\telse\t/* There is no PairCipher Aux, downgrade our capability to TKIP */\n\t\t\tpApCliEntry->PairCipher = Ndis802_11Encryption2Enabled;\t\t\t\t\t\n\t}\n\n\t/* Set Mix cipher flag */\n\tif (pApCliEntry->PairCipher != pApCliEntry->GroupCipher)\n\t{\n\t\tpApCliEntry->bMixCipher = TRUE;\t\n\n\t\t/* re-build RSNIE */\n\t\t/* RTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (idx + MIN_NET_DEVICE_FOR_APCLI)); */\n\t}\n\t\n\t/* re-build RSNIE */\n\tRTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (idx + MIN_NET_DEVICE_FOR_APCLI));\n\t\n\treturn TRUE;\t\n}\n\n\nBOOLEAN  ApCliHandleRxBroadcastFrame(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN\tRX_BLK\t\t\t*pRxBlk,\n\tIN  MAC_TABLE_ENTRY *pEntry,\n\tIN\tUCHAR\t\t\tFromWhichBSSID)\n{\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\t\t\n\tAPCLI_STRUCT *pApCliEntry = NULL;\n\t\n\t/* It is possible to receive the multicast packet when in AP Client mode */\n\t/* Such as a broadcast from remote AP to AP-client, address1 is ffffff, address2 is remote AP's bssid, addr3 is sta4 mac address */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tpApCliEntry\t= &pAd->ApCfg.ApCliTab[pEntry->MatchAPCLITabIdx];\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t/* Filter out Bcast frame which AP relayed for us */\n\t/* Multicast packet send from AP1 , received by AP2 and send back to AP1, drop this frame   \t */\t\t\t\t\n\tif (MAC_ADDR_EQUAL(pHeader->Addr3, pApCliEntry->CurrentAddress))\n\t\treturn FALSE;\t/* give up this frame */\n\n\tif (pEntry->PrivacyFilter != Ndis802_11PrivFilterAcceptAll)\n\t\treturn FALSE;\t/* give up this frame */\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t/* skip the 802.11 header */\n\tpRxBlk->pData += LENGTH_802_11;\n\tpRxBlk->DataSize -= LENGTH_802_11;\n\n\t/* Use software to decrypt the encrypted frame. */\n\t/* Because this received frame isn't my BSS frame, Asic passed to driver without decrypting it. */\n\t/* If receiving an \"encrypted\" unicast packet(its WEP bit as 1) and doesn't match my BSSID, it  */\n\t/* pass to driver with \"Decrypted\" marked as 0 in RxD. */\n\tif ((pRxInfo->MyBss == 0) && (pRxInfo->Decrypted == 0) && (pHeader->FC.Wep == 1)) \n\t{\t\t\t\t\t\t\t\t\t\t\t\n\t\tif (RTMPSoftDecryptionAction(pAd, \n\t\t\t\t\t\t\t\t\t (PUCHAR)pHeader, 0, \n\t\t\t\t\t\t\t\t\t &pApCliEntry->SharedKey[pRxWI->RxWIKeyIndex], \n\t\t\t\t\t\t\t\t\t pRxBlk->pData, \n\t\t\t\t\t\t\t\t\t &(pRxBlk->DataSize)) == NDIS_STATUS_FAILURE)\t\t\t\n\t\t{\t\t\t\t\t\t\n\t\t\treturn FALSE;  /* give up this frame */\n\t\t}\n\t}\n\tpRxInfo->MyBss = 1;\t\t\t\t\n\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\t\t\t\t\t\t\t\t\n\n\treturn TRUE;\n}\n\n\nVOID APCliInstallPairwiseKey(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  MAC_TABLE_ENTRY *pEntry)\n{\n\tUCHAR\tIfIdx;\n\tUINT8\tBssIdx;\n\n\tIfIdx = pEntry->MatchAPCLITabIdx;\n\n\tBssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + IfIdx;\n\n\tWPAInstallPairwiseKey(pAd, \n\t\t\t\t\t\t  BssIdx, \n\t\t\t\t\t\t  pEntry, \n\t\t\t\t\t\t  FALSE);\t\n}\n\n\nBOOLEAN APCliInstallSharedKey(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN  PUCHAR          pKey,\n\tIN  UCHAR           KeyLen,\n\tIN\tUCHAR\t\t\tDefaultKeyIdx,\n\tIN  MAC_TABLE_ENTRY *pEntry)\n{\n\tUCHAR\tIfIdx;\n\tUCHAR\tGTK_len = 0;\n\n\tif (!pEntry || !IS_ENTRY_APCLI(pEntry))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : This Entry doesn't exist!!! \\n\", __FUNCTION__));\t\t\n\t\treturn FALSE;\n\t}\n\n\tIfIdx = pEntry->MatchAPCLITabIdx;\n\n\tif (pAd->ApCfg.ApCliTab[IfIdx].GroupCipher == Ndis802_11Encryption2Enabled && KeyLen >= LEN_TKIP_GTK)\n\t{\n\t\tGTK_len = LEN_TKIP_GTK;\n\t}\n\telse if (pAd->ApCfg.ApCliTab[IfIdx].GroupCipher == Ndis802_11Encryption3Enabled && \n\t\t\t KeyLen >= LEN_AES_GTK)\n\t{\n\t\tGTK_len = LEN_AES_GTK;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s : GTK is invalid (GroupCipher=%d, DataLen=%d) !!! \\n\", \n\t\t\t\t\t\t\t\t__FUNCTION__, pAd->ApCfg.ApCliTab[IfIdx].GroupCipher, KeyLen));\t\t\n\t\treturn FALSE;\n\t}\n\n\t/* Update GTK */\n\t/* set key material, TxMic and RxMic for WPAPSK\t */\n\tNdisMoveMemory(pAd->ApCfg.ApCliTab[IfIdx].GTK, pKey, GTK_len);\n\tpAd->ApCfg.ApCliTab[IfIdx].DefaultKeyId = DefaultKeyIdx;\n\n\t/* Update shared key table */\n\tNdisZeroMemory(&pAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx], sizeof(CIPHER_KEY));  \n\tpAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].KeyLen = GTK_len;\n\tNdisMoveMemory(pAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].Key, pKey, LEN_TK);\n\tif (GTK_len == LEN_TKIP_GTK)\n\t{\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].RxMic, pKey + 16, LEN_TKIP_MIC);\n\t\tNdisMoveMemory(pAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].TxMic, pKey + 24, LEN_TKIP_MIC);\n\t}\n\n\t/* Update Shared Key CipherAlg */\n\tpAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].CipherAlg = CIPHER_NONE;\n\tif (pAd->ApCfg.ApCliTab[IfIdx].GroupCipher == Ndis802_11Encryption2Enabled)\n\t\tpAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].CipherAlg = CIPHER_TKIP;\n\telse if (pAd->ApCfg.ApCliTab[IfIdx].GroupCipher == Ndis802_11Encryption3Enabled)\n\t\tpAd->ApCfg.ApCliTab[IfIdx].SharedKey[DefaultKeyIdx].CipherAlg = CIPHER_AES;\n\n\treturn TRUE;\n}\n\nVOID APCli_Init(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tRTMP_OS_NETDEV_OP_HOOK\t\t*pNetDevOps)\n{\n#define APCLI_MAX_DEV_NUM\t32\n\tPNET_DEV\tnew_dev_p;\n/*\tVIRTUAL_ADAPTER *apcli_pAd; */\n\tINT apcli_index;\n/*\tRTMP_OS_NETDEV_OP_HOOK\tnetDevOpHook; */\n\tAPCLI_STRUCT\t*pApCliEntry;\n\t\n\t/* sanity check to avoid redundant virtual interfaces are created */\n\tif (pAd->flg_apcli_init != FALSE)\n\t\treturn;\n\n\n\t/* init */\n\tfor(apcli_index = 0; apcli_index < MAX_APCLI_NUM; apcli_index++)\n\t\tpAd->ApCfg.ApCliTab[apcli_index].dev = NULL;\n\n\t/* create virtual network interface */\n\tfor(apcli_index = 0; apcli_index < MAX_APCLI_NUM; apcli_index++)\n\t{\n\t\tUINT32 MC_RowID = 0, IoctlIF = 0;\n#ifdef MULTIPLE_CARD_SUPPORT\n\t\tMC_RowID = pAd->MC_RowID;\n#endif /* MULTIPLE_CARD_SUPPORT */\n#ifdef HOSTAPD_SUPPORT\n\t\tIoctlIF = pAd->IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n\t\tnew_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_APCLI, apcli_index, sizeof(PRTMP_ADAPTER), INF_APCLI_DEV_NAME);\n#ifdef HOSTAPD_SUPPORT\n\t\tpAd->IoctlIF = IoctlIF;\n#endif /* HOSTAPD_SUPPORT */\n\t\tRTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd);\n\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[apcli_index];\n\t\t/* init MAC address of virtual network interface */\n\t\tCOPY_MAC_ADDR(pApCliEntry->CurrentAddress, pAd->CurrentAddress);\n\n\t\tif (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)\n\t\t{\n\t\tif (pAd->ApCfg.BssidNum > 0 || MAX_MESH_NUM > 0) \n\t\t{\n\t\t\t/* \t\n\t\t\t\tRefer to HW definition - \n\t\t\t\t\tBit1 of MAC address Byte0 is local administration bit \n\t\t\t\t\tand should be set to 1 in extended multiple BSSIDs'\n\t\t\t\t\tBit3~ of MAC address Byte0 is extended multiple BSSID index.\n\t\t\t */ \n\t\t\tpApCliEntry->CurrentAddress[0] += 2; \t\n\t\t\tpApCliEntry->CurrentAddress[0] += (((pAd->ApCfg.BssidNum + MAX_MESH_NUM) - 1) << 2);\n\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t        pApCliEntry->CurrentAddress[ETH_LENGTH_OF_ADDRESS - 1] =\n\t\t\t(pApCliEntry->CurrentAddress[ETH_LENGTH_OF_ADDRESS - 1] + pAd->ApCfg.BssidNum + MAX_MESH_NUM) & 0xFF;\n\t\t}\n\n\t\t\n\t\tpNetDevOps->priv_flags = INT_APCLI; /* we are virtual interface */\n\t\tpNetDevOps->needProtcted = TRUE;\n\t\tNdisMoveMemory(pNetDevOps->devAddr, &pApCliEntry->CurrentAddress[0], MAC_ADDR_LEN);\n\n\t\t/* register this device to OS */\n\t\tRtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps);\n\n\t\t/* backup our virtual network interface */\n\t\tpApCliEntry->dev = new_dev_p;\n        \n#ifdef WSC_AP_SUPPORT\n\t\tpApCliEntry->WscControl.pAd = pAd;        \n\t\tNdisZeroMemory(pApCliEntry->WscControl.EntryAddr, MAC_ADDR_LEN);\n\t\tpApCliEntry->WscControl.WscConfigMethods= 0x018C;\n/*\t\tWscGenerateUUID(pAd, &pApCliEntry->WscControl.Wsc_Uuid_E[0], &pApCliEntry->WscControl.Wsc_Uuid_Str[0], 0, FALSE); */\n/*\t\tWscInit(pAd, TRUE, apcli_index); */\n\t\tRTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WSC_INIT, 0, (VOID *)pApCliEntry, apcli_index);\n#endif /* WSC_AP_SUPPORT */\n\t}\n\n\tpAd->flg_apcli_init = TRUE;\n\n}\n\n\nVOID ApCli_Remove(\n\tIN PRTMP_ADAPTER \tpAd)\n{\n\tUINT index;\n\n\tfor(index = 0; index < MAX_APCLI_NUM; index++)\n\t{\n\t\tRtmpOSNetDevProtect(1);\n\t\tif (pAd->ApCfg.ApCliTab[index].dev)\n\t\t{\n\t\t\tRtmpOSNetDevDetach(pAd->ApCfg.ApCliTab[index].dev);\n\t\t\tRtmpOSNetDevProtect(0);\n\t\t\tRtmpOSNetDevFree(pAd->ApCfg.ApCliTab[index].dev);\n\n\t\t\tRtmpOSNetDevProtect(1);\n\t\t\t/* Clear it as NULL to prevent latter access error. */\n\t\t\tpAd->flg_apcli_init = FALSE;\n\t\t\tpAd->ApCfg.ApCliTab[index].dev = NULL;\n\t\t}\n\t\tRtmpOSNetDevProtect(0);\n\t}\n}\n\n\nBOOLEAN ApCli_Open(\n\tIN\tPRTMP_ADAPTER\t\tpAd,\n\tIN\tPNET_DEV\t\t\tdev_p)\n{\n\tUCHAR ifIndex;\n\n\n\tfor (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++)\n\t{\n\t\tif (pAd->ApCfg.ApCliTab[ifIndex].dev == dev_p)\n\t\t{\n\t\t\tRTMP_OS_NETDEV_START_QUEUE(dev_p);\n\t\t\tApCliIfUp(pAd);\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n\nBOOLEAN ApCli_Close(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPNET_DEV\t\tdev_p)\n{\n\tUCHAR ifIndex;\n\n\n\tfor (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++)\n\t{\n\t\tif (pAd->ApCfg.ApCliTab[ifIndex].dev == dev_p)\n\t\t{\n\t\t\tRTMP_OS_NETDEV_STOP_QUEUE(dev_p);\n\n\t\t\t/* send disconnect-req to sta State Machine. */\n\t\t\tif (pAd->ApCfg.ApCliTab[ifIndex].Enable)\n\t\t\t{\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex);\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) ApCli interface[%d] startdown.\\n\", __FUNCTION__, ifIndex));\n\t\t\t}\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n\nint APC_PacketSend(\n\tIN\tPNDIS_PACKET\t\t\t\tskb_p, \n\tIN\tPNET_DEV\t\t\t\t\tdev_p,\n\tIN\tRTMP_NET_PACKET_TRANSMIT\tFunc)\n{\n\tRTMP_ADAPTER *pAd;\n\tPAPCLI_STRUCT pApCli;\n\tINT apcliIndex;\n\n\n\n\tpAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);\n\tASSERT(pAd);\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\tRELEASE_NDIS_PACKET(pAd, skb_p, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n#endif /* RALINK_ATE */\n\n\tif ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))          ||\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)))\n\t{\n\t\t/* wlan is scanning/disabled/reset */\n\t\tRELEASE_NDIS_PACKET(pAd, skb_p, NDIS_STATUS_FAILURE);\n\t\treturn 0;\n\t}\n\n\n\tpApCli = (PAPCLI_STRUCT)&pAd->ApCfg.ApCliTab;\n\n\tfor(apcliIndex = 0; apcliIndex < MAX_APCLI_NUM; apcliIndex++)\n\t{\n\t\tif (pApCli[apcliIndex].Valid != TRUE)\n\t\t\tcontinue;\n\n\t\t/* find the device in our ApCli list */\n\t\tif (pApCli[apcliIndex].dev == dev_p)\n\t\t{\n\t\t\t/* ya! find it */\n\t\t\tpAd->RalinkCounters.PendingNdisPacketCount ++;\n\t\t\tRTMP_SET_PACKET_SOURCE(skb_p, PKTSRC_NDIS);\n\t\t\tRTMP_SET_PACKET_MOREDATA(skb_p, FALSE);\n\t\t\tRTMP_SET_PACKET_NET_DEVICE_APCLI(skb_p, apcliIndex);\n\t\t\tSET_OS_PKT_NETDEV(skb_p, pAd->net_dev);\n\n\n\t\t\t/* transmit the packet */\n\t\t\treturn Func(skb_p);\n\t\t}\n    }\n\n\tRELEASE_NDIS_PACKET(pAd, skb_p, NDIS_STATUS_FAILURE);\n\n\treturn 0;\n}\n\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/p2pcli_assoc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\n\tModule Name:\n\tapcli_assoc.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tFonchi\t\t2006-6-23\t\tmodified for rt61-APClinent\n*/\n\n#ifdef P2P_SUPPORT\n\n#include \"rt_config.h\"\n\nstatic VOID ApCliAssocTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nstatic VOID ApCliMlmeAssocReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliMlmeDisassocReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliPeerAssocRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliPeerDisassocAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliAssocTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliInvalidStateWhenAssoc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliInvalidStateWhenDisassociate(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliAssocPostProc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pAddr2, \n\tIN USHORT CapabilityInfo, \n\tIN USHORT IfIndex, \n\tIN UCHAR SupRate[], \n\tIN UCHAR SupRateLen,\n\tIN UCHAR ExtRate[],\n\tIN UCHAR ExtRateLen,\n\tIN PEDCA_PARM pEdcaParm,\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR HtCapabilityLen, \n\tIN ADD_HT_INFO_IE *pAddHtInfo);\n\nDECLARE_TIMER_FUNCTION(ApCliAssocTimeout);\nBUILD_TIMER_FUNCTION(ApCliAssocTimeout);\n\n/*  \n    ==========================================================================\n    Description: \n        association state machine init, including state transition and timer init\n    Parameters: \n        S - pointer to the association state machine\n    Note:\n        The state machine looks like the following \n    ==========================================================================\n */\nVOID ApCliAssocStateMachineInit(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN  STATE_MACHINE *S, \n\tOUT STATE_MACHINE_FUNC Trans[]) \n{\n\tUCHAR i;\n\n\tStateMachineInit(S, (STATE_MACHINE_FUNC*)Trans,\n\t\tAPCLI_MAX_ASSOC_STATE, APCLI_MAX_ASSOC_MSG,\n\t\t(STATE_MACHINE_FUNC)Drop, APCLI_ASSOC_IDLE,\n\t\tAPCLI_ASSOC_MACHINE_BASE);\n\n\t/* first column */\n\tStateMachineSetAction(S, APCLI_ASSOC_IDLE, APCLI_MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)ApCliMlmeAssocReqAction);\n\tStateMachineSetAction(S, APCLI_ASSOC_IDLE, APCLI_MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)ApCliMlmeDisassocReqAction);\n\tStateMachineSetAction(S, APCLI_ASSOC_IDLE, APCLI_MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)ApCliPeerDisassocAction);\n   \n\t/* second column */\n\tStateMachineSetAction(S, APCLI_ASSOC_WAIT_RSP, APCLI_MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)ApCliInvalidStateWhenAssoc);\n\tStateMachineSetAction(S, APCLI_ASSOC_WAIT_RSP, APCLI_MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)ApCliInvalidStateWhenDisassociate);\n\tStateMachineSetAction(S, APCLI_ASSOC_WAIT_RSP, APCLI_MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)ApCliPeerDisassocAction);\n\tStateMachineSetAction(S, APCLI_ASSOC_WAIT_RSP, APCLI_MT2_PEER_ASSOC_RSP, (STATE_MACHINE_FUNC)ApCliPeerAssocRspAction);\n\tStateMachineSetAction(S, APCLI_ASSOC_WAIT_RSP, APCLI_MT2_ASSOC_TIMEOUT, (STATE_MACHINE_FUNC)ApCliAssocTimeoutAction);\n\n\t/* timer init */\n\tRTMPInitTimer(pAd, &pAd->ApCliMlmeAux.ApCliAssocTimer, GET_TIMER_FUNCTION(ApCliAssocTimeout), pAd, FALSE);\n\n\tfor (i=0; i < MAX_APCLI_NUM; i++)\n\t\tpAd->ApCfg.ApCliTab[i].AssocCurrState = APCLI_ASSOC_IDLE;\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        Association timeout procedure. After association timeout, this function \n        will be called and it will put a message into the MLME queue\n    Parameters:\n        Standard timer parameters\n    ==========================================================================\n */\nstatic VOID ApCliAssocTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - enqueue APCLI_MT2_ASSOC_TIMEOUT \\n\"));\n\n\tMlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_ASSOC_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        mlme assoc req handling procedure\n    Parameters:\n        Adapter - Adapter pointer\n        Elem - MLME Queue Element\n    Pre:\n        the station has been authenticated and the following information is stored in the config\n            -# SSID\n            -# supported rates and their length\n            -# listen interval (Adapter->PortCfg.default_listen_count)\n            -# Transmit power  (Adapter->PortCfg.tx_power)\n    Post  :\n        -# An association request frame is generated and sent to the air\n        -# Association timer starts\n        -# Association state -> ASSOC_WAIT_RSP\n        \n    ==========================================================================\n */\nstatic VOID ApCliMlmeAssocReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tNDIS_STATUS\t\t NStatus;\n\tBOOLEAN          Cancelled;\n\tUCHAR            ApAddr[6];\n\tHEADER_802_11    AssocHdr;\n\tUCHAR            WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};\n\tUSHORT           ListenIntv;\n\tULONG            Timeout;\n\tUSHORT           CapabilityInfo;\n\tPUCHAR           pOutBuffer = NULL;\n\tULONG            FrameLen = 0;\n\tULONG            tmp;\n\tUCHAR            SsidIe    = IE_SSID;\n\tUCHAR            SupRateIe = IE_SUPP_RATES;\n\tUCHAR            ExtRateIe = IE_EXT_SUPP_RATES;\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\t/* Block all authentication request durning WPA block period */\n\tif (pAd->ApCfg.ApCliTab[ifIndex].bBlockAssoc == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - Block Auth request durning WPA block period!\\n\"));\n\t\t*pCurrState = APCLI_ASSOC_IDLE;\n\t\tApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,\n\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t}\n\telse if(MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv))\n\t{\n\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled);\n\n\t\t/* allocate and send out AssocRsp frame */\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory */\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliMlmeAssocReqAction() allocate memory failed \\n\"));\n\t\t\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\t\t\tApCliCtrlMsg.Status = MLME_FAIL_NO_RESOURCE;\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,\n\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\n\t\t\treturn;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - Send ASSOC request...\\n\"));\n\t\tApCliMgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr, ApAddr, ifIndex);\n\n\t\t/* Build basic frame first */\n\t\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t\tsizeof(HEADER_802_11),    &AssocHdr,\n\t\t\t2,                        &CapabilityInfo,\n\t\t\t2,                        &ListenIntv,\n\t\t\t1,                        &SsidIe,\n\t\t\t1,                        &pAd->ApCliMlmeAux.SsidLen, \n\t\t\tpAd->ApCliMlmeAux.SsidLen,     pAd->ApCliMlmeAux.Ssid,\n\t\t\t1,                        &SupRateIe,\n\t\t\t1,                        &pAd->ApCliMlmeAux.SupRateLen,\n\t\t\tpAd->ApCliMlmeAux.SupRateLen,  pAd->ApCliMlmeAux.SupRate,\n\t\t\tEND_OF_ARGS);\n\n\t\tif(pAd->ApCliMlmeAux.ExtRateLen != 0)\n\t\t{\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,    &tmp,\n\t\t\t\t1,                        &ExtRateIe,\n\t\t\t\t1,                        &pAd->ApCliMlmeAux.ExtRateLen,\n\t\t\t\tpAd->ApCliMlmeAux.ExtRateLen,  pAd->ApCliMlmeAux.ExtRate,                           \n\t\t\t\tEND_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t/* HT */\n\t\tif ((pAd->ApCliMlmeAux.HtCapabilityLen > 0) && \n\t\t\tWMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\t//UCHAR HtLen; */\n\t\t\t//UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; */\n/* 2008/12/17:KH modified to fix the low throughput of  AP-Client  on Big-Endian Platform<-- */\n#ifdef RT_BIG_ENDIAN\n\t\t        HT_CAPABILITY_IE HtCapabilityTmp;\n#endif\t\t\t\n\n#ifndef RT_BIG_ENDIAN\n\t\t\t{\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,\n\t\t\t\t\t\t\t  1,                                &HtCapIe,\n\t\t\t\t\t\t\t  1,                                &pAd->ApCliMlmeAux.HtCapabilityLen,\n\t\t\t\t\t\t\t pAd->ApCliMlmeAux.HtCapabilityLen,          &pAd->ApCliMlmeAux.HtCapability, \n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t}\n#else\n                \tNdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE));\n               \t \tNdisMoveMemory(&HtCapabilityTmp, &pAd->ApCliMlmeAux.HtCapability, pAd->ApCliMlmeAux.HtCapabilityLen);\n        \t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n        \t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n\n        \t\tMakeOutgoingFrame(pOutBuffer + FrameLen,         &TmpLen,\n        \t\t\t\t\t\t\t1,                           &HtCapIe,\n        \t\t\t\t\t\t\t1,                           &pAd->ApCliMlmeAux.HtCapabilityLen,\n        \t\t\t\t\t\t\tpAd->ApCliMlmeAux.HtCapabilityLen,&HtCapabilityTmp, \n        \t\t\t\t\t\t\tEND_OF_ARGS);\n#endif\n/* 2008/12/17:KH modified to fix the low throughput of  AP-Client  on Big-Endian Platform-->\t */\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef AGGREGATION_SUPPORT\n\t\t/* add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION */\n\t\t/* Case I: (Aggregation + Piggy-Back) */\n\t\t/* 1. user enable aggregation, AND */\n\t\t/* 2. Mac support piggy-back */\n\t\t/* 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON */\n\t\t/* Case II: (Aggregation) */\n\t\t/* 1. user enable aggregation, AND */\n\t\t/* 2. AP annouces it's AGGREGATION-capable in BEACON */\n\t\tif (pAd->CommonCfg.bAggregationCapable)\n\t\t{\n#ifdef PIGGYBACK_SUPPORT\n\t\t\tif ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->ApCliMlmeAux.APRalinkIe & 0x00000003) == 3))\n\t\t\t{\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; \n\t\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,           &TmpLen,\n\t\t\t\t\t\t\t\t  9,                             RalinkIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t} else\n#endif /* PIGGYBACK_SUPPORT */\n\t\t\tif (pAd->ApCliMlmeAux.APRalinkIe & 0x00000001)\n\t\t\t{\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; \n\t\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,           &TmpLen,\n\t\t\t\t\t\t\t\t  9,                             RalinkIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tULONG TmpLen;\n\t\t\tUCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06, 0x00, 0x00, 0x00}; \n\t\t\tMakeOutgoingFrame(pOutBuffer+FrameLen,\t\t &TmpLen,\n\t\t\t\t\t\t\t  9,\t\t\t\t\t\t RalinkIe,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += TmpLen;\n\t\t}\n#endif  /* AGGREGATION_SUPPORT */\n\n\t\tif (pAd->ApCliMlmeAux.APEdcaParm.bValid)\n\t\t{\n\t\t\tif (pAd->ApCfg.ApCliTab[0].UapsdInfo.bAPSDCapable && pAd->ApCliMlmeAux.APEdcaParm.bAPSDCapable)\n\t\t\t{\n\t\t\t\tQBSS_STA_INFO_PARM QosInfo;\n\n\t\t\t\tNdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));\n\t\t\t\tQosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;\n\t\t\t\tQosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;\n\t\t\t\tQosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;\n\t\t\t\tQosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;\n\t\t\t\tQosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength;\n\t\t\t\tWmeIe[8] |= *(PUCHAR)&QosInfo;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n                /* The Parameter Set Count is set to 0 in the association request frames */\n                /* WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f); */\n\t\t\t}\n\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,    &tmp,\n\t\t\t\t\t\t\t  9,                        &WmeIe[0],\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n\t\t/* Append RSN_IE when WPAPSK OR WPA2PSK, */\n\t\tif (((pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPAPSK) || \n            (pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK))            \n#ifdef WSC_AP_SUPPORT\n\t\t\t&& (pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode == WSC_DISABLE)\n#endif /* WSC_AP_SUPPORT */\n            )\n\t\t{\n\t\t\tUCHAR RSNIe = IE_WPA;\n\t\t\t\n\t\t\tif (pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t\tRSNIe = IE_WPA2;\n\t\t\t\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,    \t\t\t\t&tmp,\n\t\t\t              \t1,                                      \t&RSNIe,\n\t                        1,                                      \t&pAd->ApCfg.ApCliTab[ifIndex].RSNIE_Len,\n\t                        pAd->ApCfg.ApCliTab[ifIndex].RSNIE_Len,\t\tpAd->ApCfg.ApCliTab[ifIndex].RSN_IE,\n\t                        END_OF_ARGS);\n\t\t\t\n\t\t\tFrameLen += tmp;\t\n\t\t}\t\n\n#ifdef WSC_AP_SUPPORT\n\t\tif (pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE)\n\t\t{\n\t\t\tUCHAR *pWscBuf = NULL, WscIeLen = 0;\n\t\t\tULONG WscTmpLen = 0;\n\n\t\t\tos_alloc_mem(pAd, (UCHAR **) &pWscBuf, 512);\n\t\t\tif (pWscBuf != NULL) {\n\t\t\t\tNdisZeroMemory(pWscBuf, 512);\n\t\t\t\tWscBuildAssocReqIE(&pAd->ApCfg.ApCliTab[ifIndex].WscControl, pWscBuf, &WscIeLen);\n\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, \n\t\t\t\t\t\t\t\t  WscIeLen, pWscBuf, \n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\t\tFrameLen += WscTmpLen;\n\t\t\t\tos_free_mem(NULL, pWscBuf);\n\t\t\t} else\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"%s:: WscBuf Allocate failed!\\n\", __FUNCTION__));\n\t\t}\n#endif /* WSC_AP_SUPPORT */\n\n#ifdef P2P_SUPPORT\n\tif (P2P_CLI_ON(pAd))\n\t{\n\t\tULONG TmpLen;\n\t\tPUCHAR pData;\n\t\tpData = pOutBuffer + FrameLen;\n\t\tP2pMakeP2pIE(pAd, SUBTYPE_ASSOC_REQ, pData, &TmpLen);\n\t\tFrameLen += TmpLen;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ASSOC RSP - Insert P2P IE \\n\"));\n\t}\n\t\n#ifdef WFD_SUPPORT\n\t{\n\t\tPUCHAR\tpData;\n\t\tULONG\tWfdIeLen = 0, WfdIeBitmap;\n\n\t\tpData = pOutBuffer + FrameLen;\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, pData, &WfdIeLen);\n\t\tFrameLen += WfdIeLen;\n\t}\n#endif /* WFD_SUPPORT */\n\t\n#endif /* P2P_SUPPORT */\n\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\tRTMPSetTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, Timeout);\n\t\t*pCurrState = APCLI_ASSOC_WAIT_RSP;\n\t} \n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliMlmeAssocReqAction() sanity check failed. BUG!!!!!! \\n\"));\n\t\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\t\tApCliCtrlMsg.Status = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,\n\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t}\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        Upper layer issues disassoc request\n    Parameters:\n        Elem -\n    ==========================================================================\n */\nstatic VOID ApCliMlmeDisassocReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPMLME_DISASSOC_REQ_STRUCT pDisassocReq;\n\tHEADER_802_11         DisassocHdr;\n\tPUCHAR                 pOutBuffer = NULL;\n\tULONG                 FrameLen = 0;\n\tNDIS_STATUS           NStatus;\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\n\n\t/* skip sanity check */\n\tpDisassocReq = (PMLME_DISASSOC_REQ_STRUCT)(Elem->Msg);\n\n\t/* allocate and send out DeassocReq frame */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliMlmeDisassocReqAction() allocate memory failed\\n\"));\n\t\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\t\tApCliCtrlMsg.Status = MLME_FAIL_NO_RESOURCE;\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DEASSOC_RSP,\n\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - Send DISASSOC request [BSSID::%02x:%02x:%02x:%02x:%02x:%02x] \\n\", \n\t\t\t\tpDisassocReq->Addr[0], pDisassocReq->Addr[1], pDisassocReq->Addr[2],\n\t\t\t\tpDisassocReq->Addr[3], pDisassocReq->Addr[4], pDisassocReq->Addr[5]));\n\tApCliMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, pDisassocReq->Addr, ifIndex);\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen, \n\t\t\t\t\t\tsizeof(HEADER_802_11),\t&DisassocHdr, \n\t\t\t\t\t\t2,\t\t\t\t\t\t&pDisassocReq->Reason, \n\t\t\t\t\t\tEND_OF_ARGS);\n\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t/* Set the control aux SSID to prevent it reconnect to old SSID */\n\t/* Since calling this indicate user don't want to connect to that SSID anymore. */\n\t/* 2004-11-10 can't reset this info, cause it may be the new SSID that user requests for */\n\t/* pAd->MlmeAux.SsidLen = MAX_LEN_OF_SSID; */\n\t/* NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); */\n\t/* NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN); */\n\n\t//pAd->PortCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING; */\n\t//COPY_MAC_ADDR(pAd->PortCfg.DisassocSta, pDisassocReq->Addr); */\n\n\n    *pCurrState = APCLI_ASSOC_IDLE;\n\n\tApCliCtrlMsg.Status = MLME_SUCCESS;\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DEASSOC_RSP,\n\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\n\treturn;\n}\n\n\n/*\n    ==========================================================================\n    Description:\n        peer sends assoc rsp back\n    Parameters:\n        Elme - MLME message containing the received frame\n    ==========================================================================\n */\nstatic VOID ApCliPeerAssocRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tBOOLEAN\t\t\t\tCancelled;\n\tUSHORT\t\t\t\tCapabilityInfo, Status, Aid;\n\tUCHAR\t\t\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;\n\tUCHAR\t\t\t\tExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;\n\tUCHAR\t\t\t\tAddr2[MAC_ADDR_LEN];\n\tEDCA_PARM\t\t\tEdcaParm;\n\tUCHAR\t\t\t\tCkipFlag;\n\tAPCLI_CTRL_MSG_STRUCT\tApCliCtrlMsg;\n\tHT_CAPABILITY_IE\tHtCapability;\n\tADD_HT_INFO_IE\t\tAddHtInfo;\t/* AP might use this additional ht info IE  */\n\tUCHAR\t\t\t\tHtCapabilityLen;\n\tUCHAR\t\t\t\tAddHtInfoLen;\n\tUCHAR\t\t\t\tNewExtChannelOffset = 0xff;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\tULONG\tP2PSubelementLen = 0;\n\tUCHAR\t*P2pSubelement;\n\n\tos_alloc_mem(NULL, (UCHAR **)&P2pSubelement, MAX_VIE_LEN);\n\n\tif (ApCliPeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, &P2PSubelementLen, P2pSubelement, SupRate, &SupRateLen, ExtRate, &ExtRateLen, \n\t\t&HtCapability, &AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag))\n\t{\n\t\t/* The frame is for me ? */\n\t\tif(MAC_ADDR_EQUAL(Addr2, pAd->ApCliMlmeAux.Bssid))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\\n\", Status));\n\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled);\n\n\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\tif (P2PSubelementLen > 0)\n\t\t\t{\n\t\t\t\t/*UCHAR P2pIdx = P2P_NOT_FOUND;\n\t\t\t\tULONG TmpLen;\n\t\t\t\tPUCHAR pData;*/\n\t\t\t\tpApCliEntry->bP2pClient = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpApCliEntry->bP2pClient = FALSE;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: recv peer ASSOC RSP from %02x:%02x:%02x:%02x:%02x:%02x.    bP2pClient = %d\\n\", __FUNCTION__, PRINT_MAC(Addr2), pApCliEntry->bP2pClient));\n\n\t\t\tif(Status == MLME_SUCCESS) \n\t\t\t{\n\t\t\t\t/* go to procedure listed on page 376 */\n\t\t\t\tApCliAssocPostProc(pAd, Addr2, CapabilityInfo, ifIndex, SupRate, SupRateLen,\n\t\t\t\t\tExtRate, ExtRateLen, &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo);  \t\n\n\t\t\t\tpAd->ApCliMlmeAux.Aid=Aid;\n\n\t\t\t\tApCliCtrlMsg.Status = MLME_SUCCESS;\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,\n\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tApCliCtrlMsg.Status = Status;\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,\n\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t}\n\n\t\t\t*pCurrState = APCLI_ASSOC_IDLE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliPeerAssocRspAction() sanity check fail\\n\"));\n\t}\n\n\tif (P2pSubelement != NULL)\n\t\tos_free_mem(NULL, P2pSubelement);\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        left part of IEEE 802.11/1999 p.374 \n    Parameters:\n        Elem - MLME message containing the received frame\n    ==========================================================================\n */\nstatic VOID ApCliPeerDisassocAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR         Addr2[MAC_ADDR_LEN];\n\tUSHORT        Reason;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\n\tif(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason))\n\t{\n\t\tif (MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, Addr2))\n\t\t{\n\n\t\t\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex);\n\n        }\n    }\n    else\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliPeerDisassocAction() sanity check fail\\n\"));\n    }\n\t\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        what the state machine will do after assoc timeout\n    ==========================================================================\n */\nstatic VOID ApCliAssocTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliAssocTimeoutAction\\n\"));\n\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_REQ_TIMEOUT, 0, NULL, ifIndex);\n\n\treturn;\n}\n\nstatic VOID ApCliInvalidStateWhenAssoc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - ApCliInvalidStateWhenAssoc(state=%ld), reset APCLI_ASSOC state machine\\n\", *pCurrState));\n\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\tApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,\n\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\n\treturn;\n}\n\nstatic VOID ApCliInvalidStateWhenDisassociate(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_ASSOC - InvalidStateWhenApCliDisassoc(state=%ld), reset APCLI_ASSOC state machine\\n\", *pCurrState));\n\t*pCurrState = APCLI_ASSOC_IDLE;\n\n\tApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DEASSOC_RSP,\n\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n        procedures on IEEE 802.11/1999 p.376 \n    Parametrs:\n    ==========================================================================\n */\nstatic VOID ApCliAssocPostProc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR pAddr2, \n\tIN USHORT CapabilityInfo, \n\tIN USHORT IfIndex, \n\tIN UCHAR SupRate[], \n\tIN UCHAR SupRateLen,\n\tIN UCHAR ExtRate[],\n\tIN UCHAR ExtRateLen,\n\tIN PEDCA_PARM pEdcaParm,\n\tIN HT_CAPABILITY_IE *pHtCapability,\n\tIN UCHAR HtCapabilityLen, \n\tIN ADD_HT_INFO_IE *pAddHtInfo)\n{\n\n\tpAd->ApCliMlmeAux.BssType = BSS_INFRA;\t\n\tpAd->ApCliMlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO;\n\tNdisMoveMemory(&pAd->ApCliMlmeAux.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM));\n\n\t/* filter out un-supported rates */\n\tpAd->ApCliMlmeAux.SupRateLen = SupRateLen;\n\tNdisMoveMemory(pAd->ApCliMlmeAux.SupRate, SupRate, SupRateLen);\n    RTMPCheckRates(pAd, pAd->ApCliMlmeAux.SupRate, &pAd->ApCliMlmeAux.SupRateLen);\n\n\t/* filter out un-supported rates */\n\tpAd->ApCliMlmeAux.ExtRateLen = ExtRateLen;\n\tNdisMoveMemory(pAd->ApCliMlmeAux.ExtRate, ExtRate, ExtRateLen);\n    RTMPCheckRates(pAd, pAd->ApCliMlmeAux.ExtRate, &pAd->ApCliMlmeAux.ExtRateLen);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (HtCapabilityLen ? \"%s===> 11n HT STA\\n\" : \"%s===> legacy STA\\n\", __FUNCTION__));\n\n#ifdef DOT11_N_SUPPORT\n\tif (HtCapabilityLen > 0 && WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tApCliCheckHt(pAd, IfIndex, pHtCapability, pAddHtInfo);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n}\n\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/p2pcli_auth.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\n\tModule Name:\n\tapcli_auth.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tFonchi\t\t2006-6-23\t\tmodified for rt61-APClinent\n*/\n\n#ifdef P2P_SUPPORT\n\n#include \"rt_config.h\"\n\nstatic VOID ApCliAuthTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nstatic VOID ApCliMlmeAuthReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliPeerAuthRspAtSeq2Action(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliPeerAuthRspAtSeq4Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliPeerDeauthAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliAuthTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliInvalidStateWhenAuth(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliMlmeDeauthReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nDECLARE_TIMER_FUNCTION(ApCliAuthTimeout);\nBUILD_TIMER_FUNCTION(ApCliAuthTimeout);\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tauthenticate state machine init, including state transition and timer init\n\tParameters:\n\t\tSm - pointer to the auth state machine\n\tNote:\n\t\tThe state machine looks like this\n\t==========================================================================\n */\n\nVOID ApCliAuthStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tUCHAR i;\n\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans,\n\t\tAPCLI_MAX_AUTH_STATE, APCLI_MAX_AUTH_MSG,\n\t\t(STATE_MACHINE_FUNC)Drop, APCLI_AUTH_REQ_IDLE,\n\t\tAPCLI_AUTH_MACHINE_BASE);\n\n\t/* the first column */\n\tStateMachineSetAction(Sm, APCLI_AUTH_REQ_IDLE, APCLI_MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)ApCliMlmeAuthReqAction);\n\tStateMachineSetAction(Sm, APCLI_AUTH_REQ_IDLE, APCLI_MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)ApCliPeerDeauthAction);\n\tStateMachineSetAction(Sm, APCLI_AUTH_REQ_IDLE, APCLI_MT2_MLME_DEAUTH_REQ, (STATE_MACHINE_FUNC)ApCliMlmeDeauthReqAction);\n\n\t/* the second column */\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ2, APCLI_MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)ApCliInvalidStateWhenAuth);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ2, APCLI_MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)ApCliPeerAuthRspAtSeq2Action);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ2, APCLI_MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)ApCliPeerDeauthAction);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ2, APCLI_MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)ApCliAuthTimeoutAction);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ2, APCLI_MT2_MLME_DEAUTH_REQ, (STATE_MACHINE_FUNC)ApCliMlmeDeauthReqAction);\n\n\t/* the third column */\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)ApCliInvalidStateWhenAuth);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)ApCliPeerAuthRspAtSeq4Action);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)ApCliPeerDeauthAction);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)ApCliAuthTimeoutAction);\n\tStateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_MLME_DEAUTH_REQ, (STATE_MACHINE_FUNC)ApCliMlmeDeauthReqAction);\n\n\t/* timer init */\n\tRTMPInitTimer(pAd, &pAd->ApCliMlmeAux.ApCliAuthTimer, GET_TIMER_FUNCTION(ApCliAuthTimeout), pAd, FALSE);\n\n\tfor (i=0; i < MAX_APCLI_NUM; i++)\n\t\tpAd->ApCfg.ApCliTab[i].AuthCurrState = APCLI_AUTH_REQ_IDLE;\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tfunction to be executed at timer thread when auth timer expires\n\t==========================================================================\n */\nstatic VOID ApCliAuthTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - AuthTimeout\\n\"));\n\n\tMlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_AUTH_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliMlmeAuthReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tBOOLEAN             Cancelled;\n\tNDIS_STATUS         NState;\n\tUCHAR               Addr[MAC_ADDR_LEN];\n\tUSHORT              Alg, Seq, Status;\n\tULONG               Timeout;\n\tHEADER_802_11       AuthHdr; \n\tPUCHAR              pOutBuffer = NULL;\n\tULONG               FrameLen = 0;\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\t/* Block all authentication request durning WPA block period */\n\tif (pAd->ApCfg.ApCliTab[ifIndex].bBlockAssoc == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - Block Auth request durning WPA block period!\\n\"));\n\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\t\tApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t}\n\telse if(MlmeAuthReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr, &Timeout, &Alg))\n\t{\n\t\t/* reset timer */\n\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, &Cancelled);\n\n\t\tpAd->ApCliMlmeAux.Alg  = Alg;\n\n\t\tSeq = 1;\n\t\tStatus = MLME_SUCCESS;\n\n\t\t/* allocate and send out AuthReq frame */\n\t\tNState = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\tif(NState != NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - MlmeAuthReqAction() allocate memory failed\\n\"));\n\t\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\t\t\tApCliCtrlMsg.Status = MLME_FAIL_NO_RESOURCE;\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - Send AUTH request seq#1 (Alg=%d)...\\n\", Alg));\n\t\tApCliMgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr, pAd->ApCliMlmeAux.Bssid, ifIndex);\n\n\t\tMakeOutgoingFrame(pOutBuffer,           &FrameLen, \n\t\t\t\t\t\t  sizeof(HEADER_802_11),&AuthHdr, \n\t\t\t\t\t\t  2,                    &Alg, \n\t\t\t\t\t\t  2,                    &Seq, \n\t\t\t\t\t\t  2,                    &Status, \n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\t\tRTMPSetTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, AUTH_TIMEOUT);\n\n\t\t*pCurrState = APCLI_AUTH_WAIT_SEQ2;\n\t} else\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"APCLI AUTH - MlmeAuthReqAction() sanity check failed. BUG!!!!!\\n\"));\n\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\t}\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliPeerAuthRspAtSeq2Action(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tBOOLEAN         Cancelled;\n\tUCHAR           Addr2[MAC_ADDR_LEN];\n\tUSHORT          Seq, Status, Alg;\n\tUSHORT          RemoteStatus;\n\tUCHAR\t\t\tiv_hdr[LEN_WEP_IV_HDR];\n/*\tUCHAR           ChlgText[CIPHER_TEXT_LEN]; */\n\tUCHAR           *ChlgText = NULL;\n\tUCHAR           CyperChlgText[CIPHER_TEXT_LEN + 8 + 8];\n\tULONG\t\t\tc_len = 0;\t\n\tHEADER_802_11   AuthHdr;\n\tNDIS_STATUS     NState;\n\tPUCHAR          pOutBuffer = NULL;\n\tULONG           FrameLen = 0;\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUCHAR\t\t  \tChallengeIe = IE_CHALLENGE_TEXT;\n\tUCHAR\t\t  \tlen_challengeText = CIPHER_TEXT_LEN;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&ChlgText, CIPHER_TEXT_LEN);\n\tif (ChlgText == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\tif(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, (CHAR *) ChlgText))\n\t{\n\t\tif(MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, Addr2) && Seq == 2)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - Receive AUTH_RSP seq#2 to me (Alg=%d, Status=%d)\\n\", Alg, Status));\n\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, &Cancelled);\n\n\t\t\tif(Status == MLME_SUCCESS)\n\t\t\t{\n\t\t\t\tif(pAd->ApCliMlmeAux.Alg == Ndis802_11AuthModeOpen)\n\t\t\t\t{\n\t\t\t\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\t\t\t\t\tApCliCtrlMsg.Status= MLME_SUCCESS;\n\t\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t\t} \n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPCIPHER_KEY  pKey;\t\n\t\t\t\t\tUINT\tdefault_key = pAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId;\n\n\t\t\t\t\tpKey = &pAd->ApCfg.ApCliTab[ifIndex].SharedKey[default_key];\n\n\t\t\t\t\t/* 2. shared key, need to be challenged */\n\t\t\t\t\tSeq++;\n\t\t\t\t\tRemoteStatus = MLME_SUCCESS;\n\t\t\t\t\t/* allocate and send out AuthRsp frame\t */\t\t\t\t\n\t\t\t\t\tNState = MlmeAllocateMemory(pAd, &pOutBuffer); \t\t\t\t\t\n\t\t\t\t\tif(NState != NDIS_STATUS_SUCCESS)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - ApCliPeerAuthRspAtSeq2Action allocate memory fail\\n\"));\n\t\t\t\t\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\t\t\t\t\t\tApCliCtrlMsg.Status= MLME_FAIL_NO_RESOURCE;\n\t\t\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Send AUTH request seq#3...\\n\"));\n\t\t\t\t\tApCliMgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr2, pAd->ApCliMlmeAux.Bssid, ifIndex);\n\t\t\t\t\tAuthHdr.FC.Wep = 1;\n\t\t\t\t\t\n\t\t\t\t\t/* Encrypt challenge text & auth information */\n\t\t\t\t\t/* TSC increment */ \n\t\t\t\t\tINC_TX_TSC(pKey->TxTsc, LEN_WEP_TSC);\n\n\t\t\t\t\t/* Construct the 4-bytes WEP IV header */\n\t\t\t\t\tRTMPConstructWEPIVHdr(default_key, pKey->TxTsc, iv_hdr);\n\t\t\t\t\t\t\t\t\t \n\t\t\t\t\tAlg = cpu2le16(*(USHORT *)&Alg);\n\t\t\t\t\tSeq = cpu2le16(*(USHORT *)&Seq);\n\t\t\t\t\tRemoteStatus= cpu2le16(*(USHORT *)&RemoteStatus);                    \t\t\t\t\n\n\t\t\t\t\t/* Construct message text */\n\t\t\t\t\tMakeOutgoingFrame(CyperChlgText,        &c_len, \n\t\t\t\t\t\t\t          2,                    &Alg, \n\t\t\t\t\t\t\t          2,                    &Seq,\n\t\t\t\t\t\t\t          2,                    &RemoteStatus,  \n\t\t\t\t\t\t\t          1,\t\t\t\t\t&ChallengeIe, \n\t\t\t\t\t\t\t          1,\t\t\t\t\t&len_challengeText,\n\t\t\t\t\t\t\t          len_challengeText,\tChlgText,\n\t\t\t\t\t\t\t          END_OF_ARGS);\n\n\t\t\t\t\tif (RTMPSoftEncryptWEP(pAd, \n\t\t\t\t\t\t\t\t\t\t   iv_hdr, \n\t\t\t\t\t\t\t\t\t\t   pKey,\n\t\t\t\t\t\t\t\t\t\t   CyperChlgText, \n\t\t\t\t\t\t\t\t\t\t   c_len) == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - ApCliPeerAuthRspAtSeq2Action allocate memory fail\\n\"));\n\t\t\t\t\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\t\t\t\t\t\tApCliCtrlMsg.Status= MLME_FAIL_NO_RESOURCE;\n\t\t\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\t\t\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Update the total length for 4-bytes ICV */\n\t\t\t\t\tc_len += LEN_ICV;\n\n\t\t\t\t\tMakeOutgoingFrame(pOutBuffer,               &FrameLen, \n\t\t\t\t\t\t\t\t\t  sizeof(HEADER_802_11),    &AuthHdr,  \n\t\t\t\t\t\t\t          LEN_WEP_IV_HDR,\t\t\tiv_hdr,\t\t\t\t\t\t\t\t          \n\t\t\t\t\t\t\t          c_len,     \t\t\t\tCyperChlgText, \n\t\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\t\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\n\t\t\t\t\tRTMPSetTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, AUTH_TIMEOUT);\n\t\t\t\t\t*pCurrState = APCLI_AUTH_WAIT_SEQ4;\n\t\t\t\t}\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\t\t\t\tApCliCtrlMsg.Status= Status;\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t}\n\t\t}\n\t} else\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - PeerAuthSanity() sanity check fail\\n\"));\n\t}\n\nLabelOK:\n\tif (ChlgText != NULL)\n\t\tos_free_mem(NULL, ChlgText);\n\tif (pOutBuffer != NULL)\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliPeerAuthRspAtSeq4Action(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tBOOLEAN     Cancelled;\n\tUCHAR       Addr2[MAC_ADDR_LEN];\n\tUSHORT      Alg, Seq, Status;\n\tCHAR        ChlgText[CIPHER_TEXT_LEN];\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tif(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText))\n\t{\n\t\tif(MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, Addr2) && Seq == 4)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - Receive AUTH_RSP seq#4 to me\\n\"));\n\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAuthTimer, &Cancelled);\n\n\t\t\tApCliCtrlMsg.Status = MLME_SUCCESS;\n\n\t\t\tif(Status != MLME_SUCCESS)\n\t\t\t{\n\t\t\t\tApCliCtrlMsg.Status = Status;\n\t\t\t}\n\n\t\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t}\n\t} else\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI - PeerAuthRspAtSeq4Action() sanity check fail\\n\"));\n\t}\n\n\treturn;\n}\n\n/*\n    ==========================================================================\n    Description:\n    ==========================================================================\n*/\nstatic VOID ApCliPeerDeauthAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR       Addr1[MAC_ADDR_LEN];\n\tUCHAR       Addr2[MAC_ADDR_LEN];\n\tUCHAR       Addr3[MAC_ADDR_LEN];\n\tUSHORT      Reason;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tif (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, Addr3, &Reason))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH_RSP - receive DE-AUTH from our AP\\n\"));\n\t\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex);\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH_RSP - ApCliPeerDeauthAction() sanity check fail\\n\"));\n\t}\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliAuthTimeoutAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - AuthTimeoutAction\\n\"));\n\n\t*pCurrState = APCLI_AUTH_REQ_IDLE;\n\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_REQ_TIMEOUT, 0, NULL, ifIndex);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliInvalidStateWhenAuth(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - InvalidStateWhenAuth (state=%ld), reset AUTH state machine\\n\",\n\t\tpAd->Mlme.ApCliAuthMachine.CurrState));\n\n\t*pCurrState= APCLI_AUTH_REQ_IDLE;\n\n\tApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,\n\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\n\treturn;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliMlmeDeauthReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPMLME_DEAUTH_REQ_STRUCT pDeauthReq;\n\tHEADER_802_11 DeauthHdr;\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0;\n\tNDIS_STATUS NStatus;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI AUTH - ApCliMlmeAuthReqAction (state=%ld), reset AUTH state machine\\n\",\n\t\tpAd->Mlme.ApCliAuthMachine.CurrState));\n\n\tpDeauthReq = (PMLME_DEAUTH_REQ_STRUCT)(Elem->Msg);\n\n\t*pCurrState= APCLI_AUTH_REQ_IDLE;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory */\n\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\treturn;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"AUTH - Send DE-AUTH request (Reason=%d)...\\n\", pDeauthReq->Reason));\n\n\tApCliMgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pDeauthReq->Addr, pDeauthReq->Addr, ifIndex);\n\tMakeOutgoingFrame(pOutBuffer,           &FrameLen,\n\t\tsizeof(HEADER_802_11),&DeauthHdr,\n\t\t2,                    &pDeauthReq->Reason,\n\t\tEND_OF_ARGS);\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\treturn;\n}\n\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/p2pcli_ctrl.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tapcli_ctrl.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tFonchi\t\t2006-06-23      modified for rt61-APClinent\n*/\n#ifdef P2P_SUPPORT\n\n#include \"rt_config.h\"\n\n\nstatic VOID ApCliCtrlJoinReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlJoinReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlProbeRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlAuthRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlAuth2RspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlAuthReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlAuth2ReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlAssocRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlDeAssocRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlAssocReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlDisconnectReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlPeerDeAssocReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlDeAssocAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliCtrlDeAuthAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\n/*\n    ==========================================================================\n    Description:\n        The apcli ctrl state machine, \n    Parameters:\n        Sm - pointer to the state machine\n    Note:\n        the state machine looks like the following\n    ==========================================================================\n */\nVOID ApCliCtrlStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tUCHAR i;\n\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans,\n\t\tAPCLI_MAX_CTRL_STATE, APCLI_MAX_CTRL_MSG,\n\t\t(STATE_MACHINE_FUNC)Drop, APCLI_CTRL_DISCONNECTED,\n\t\tAPCLI_CTRL_MACHINE_BASE);\n\n\t/* disconnected state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_DISCONNECTED, APCLI_CTRL_JOIN_REQ, (STATE_MACHINE_FUNC)ApCliCtrlJoinReqAction);\n\n\t/* probe state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_PROBE, APCLI_CTRL_PROBE_RSP, (STATE_MACHINE_FUNC)ApCliCtrlProbeRspAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_PROBE, APCLI_CTRL_JOIN_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlJoinReqTimeoutAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_PROBE, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDisconnectReqAction);\n\n\t/* auth state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_AUTH_RSP, (STATE_MACHINE_FUNC)ApCliCtrlAuthRspAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_AUTH_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlAuthReqTimeoutAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDisconnectReqAction);\n \tStateMachineSetAction(Sm, APCLI_CTRL_AUTH, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction);\n\n\t/* auth2 state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_AUTH_RSP, (STATE_MACHINE_FUNC)ApCliCtrlAuth2RspAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_AUTH_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlAuth2ReqTimeoutAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDisconnectReqAction);\n \tStateMachineSetAction(Sm, APCLI_CTRL_AUTH_2, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction);\n\n\t/* assoc state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_ASSOC_RSP, (STATE_MACHINE_FUNC)ApCliCtrlAssocRspAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_ASSOC_REQ_TIMEOUT, (STATE_MACHINE_FUNC)ApCliCtrlAssocReqTimeoutAction);\n\tStateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDeAssocAction);\n \tStateMachineSetAction(Sm, APCLI_CTRL_ASSOC, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction);\n\n\t/* deassoc state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_DEASSOC, APCLI_CTRL_DEASSOC_RSP, (STATE_MACHINE_FUNC)ApCliCtrlDeAssocRspAction);\n\n\t/* connected state */\n\tStateMachineSetAction(Sm, APCLI_CTRL_CONNECTED, APCLI_CTRL_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlDeAuthAction);\n \tStateMachineSetAction(Sm, APCLI_CTRL_CONNECTED, APCLI_CTRL_PEER_DISCONNECT_REQ, (STATE_MACHINE_FUNC)ApCliCtrlPeerDeAssocReqAction);\n\n\tfor (i = 0; i < MAX_APCLI_NUM; i++)\n\t\tpAd->ApCfg.ApCliTab[i].CtrlCurrState = APCLI_CTRL_DISCONNECTED;\n\n\treturn;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME JOIN req state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlJoinReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tAPCLI_MLME_JOIN_REQ_STRUCT JoinReq;\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n#ifdef WSC_AP_SUPPORT\n\tPWSC_CTRL\tpWpsCtrl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl;\n#endif /* WSC_AP_SUPPORT */\n#ifdef CONFIG_MULTI_CHANNEL\n\tBOOLEAN bChangeInitBW = FALSE;\n\tUCHAR BBPValue;\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Start Probe Req.\\n\", __FUNCTION__));\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tif (ApScanRunning(pAd) == TRUE)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tNdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT));\n\n\tif (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR))\n\t{\n\t\tCOPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid);\n\t}\n\n#ifdef WSC_AP_SUPPORT\n    if ((pWpsCtrl->WscConfMode != WSC_DISABLE) &&\n\t\t(pWpsCtrl->bWscTrigger == TRUE))\n    {\n    \tULONG bss_idx = 0;\n        NdisZeroMemory(JoinReq.Ssid, MAX_LEN_OF_SSID);\n        JoinReq.SsidLen = pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength;\n\t\tNdisMoveMemory(JoinReq.Ssid, pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, JoinReq.SsidLen);\n\t\t{\n\t\t\tbss_idx = BssSsidTableSearch(&pAd->ScanTab, pAd->P2pCfg.Bssid, (PCHAR)JoinReq.Ssid, JoinReq.SsidLen, pAd->CommonCfg.Channel);\n\t\t\tif (bss_idx == BSS_NOT_FOUND)\n\t\t\t{\n\t\t\t\t*pCurrState = APCLI_CTRL_PROBE;\n\t\t\t\tApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN Cancelled;\n\t\t\t\tINT old_conf_mode = pWpsCtrl->WscConfMode, old_wsc_mode = pWpsCtrl->WscMode;\n\t\t\t\tADD_HTINFO\tRootApHtInfo, ApHtInfo;\n\t\t\t\tUCHAR channel = pAd->CommonCfg.Channel, RootApChannel = pAd->ScanTab.BssEntry[bss_idx].Channel;\n\t\t\t\tUCHAR RootApCentralChannel = pAd->ScanTab.BssEntry[bss_idx].CentralChannel;\n\t\t\t\tApHtInfo = pAd->CommonCfg.AddHTInfo.AddHtInfo;\n\t\t\t\tRootApHtInfo = pAd->ScanTab.BssEntry[bss_idx].AddHtInfo.AddHtInfo;\n\t\t\t\t\n\t\t\t\tif (INFRA_ON(pAd) && (pAd->StaActive.SupportedHtPhy.ExtChanOffset != RootApHtInfo.ExtChanOffset) \n\t\t\t\t\t&& (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40) \n#ifdef CONFIG_MULTI_CHANNEL\n&& (pAd->Multi_Channel_Enable == FALSE)\n#endif /* CONFIG_MULTI_CHANNEL */\n)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s :: Channel offset = %d not match INFRA Channel offset %d .\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, pAd->MlmeAux.CentralChannel, RootApCentralChannel));\n\t\t\t\t\tP2pLinkDown(pAd, P2P_CONNECT_FAIL);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\t\t\t\t\tpAd->ApCliMlmeAux.Channel = RootApChannel;\n\t\t\t\t\t\t\tpAd->ApCliMlmeAux.CentralChannel= RootApCentralChannel;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)) \n\t\t\t\t\t\t\t\t&&(pAd->CommonCfg.Channel == pAd->LatchRfRegs.Channel) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\t\t\t\t\t  PWR_SAVE);\n\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliCtrlJoinReqAction -- Send PSM Data frame\\n\"));\n\t\t\t\t\t\t\t\tOS_WAIT(200);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t/* switch channel and waiting for beacon timer */\n\t\t\t\t\t\t\t\tAsicSwitchChannel(pAd, pAd->ApCliMlmeAux.Channel, FALSE);\n\t\t\t\t\t\t\t\tAsicLockChannel(pAd, pAd->ApCliMlmeAux.Channel);\n\t\t\t\t\t\t\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\t\n/* Bug fix: Sometimes p2p connection will send probe request with incorrect channel. */\n\t\t\t}\n\t\t}\n    }\n    else\n#endif /* WSC_AP_SUPPORT */\n\tif (pApCliEntry->CfgSsidLen != 0)\n\t{\n\t\tULONG bss_idx = 0;\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\tif (pAd->Multi_Channel_Enable == TRUE)\n\t\t\t{\n\t\t\t\t\tUCHAR ApChannel = 0;\n\t\t\t\t\tJoinReq.SsidLen = pApCliEntry->CfgSsidLen;\n\t\t\t\t\tNdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen);\n\n\t\t\t\t\tbss_idx = BssSsidTableSearch(&pAd->ScanTab, JoinReq.Bssid, (PCHAR)(JoinReq.Ssid), JoinReq.SsidLen, pAd->CommonCfg.Channel);\n\t\t\t\t\t\tif (bss_idx == BSS_NOT_FOUND)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"2 Can't find %s !\\n\",(PCHAR)pApCliEntry->CfgSsid));\n\t\t\t\t\t\t\t*pCurrState = APCLI_CTRL_PROBE;\n\t\t\t\t\t\t\tApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\t\t\t\t\t\t\tpAd->ApCliMlmeAux.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel;\n\t\t\t\t\t\t\tpAd->ApCliMlmeAux.CentralChannel=pAd->ScanTab.BssEntry[bss_idx].CentralChannel;\n\t\t\t\t\t\t\tApChannel = pAd->ScanTab.BssEntry[bss_idx].Channel;\n\n\t\t\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)) \n\t\t\t\t\t\t\t\t&&(pAd->CommonCfg.Channel == pAd->LatchRfRegs.Channel) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\t\t\t\t\t  PWR_SAVE);\n\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCliCtrlJoinReqAction !bWscTrigger -- Send PSM Data frame\\n\"));\n\t\t\t\t\t\t\t\t\tOS_WAIT(200);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tAsicSwitchChannel(pAd, ApChannel, FALSE);\n\t\t\t\t\t\t\tAsicLockChannel(pAd, ApChannel);\n\t\t\t\t\t\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\t\t\t\t}\n\t\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n/* Bug fix: Sometimes p2p connection will send probe request with incorrect channel. */\n\n\t\tJoinReq.SsidLen = pApCliEntry->CfgSsidLen;\n\t\tNdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen);\n\t}\n\n\tif (pApCliEntry->CfgSsidLen == 0)\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::  ApCliEntry SSID Len is 0 !!!.\\n\", __FUNCTION__));\n\t\t\t*pCurrState = APCLI_CTRL_PROBE;\n\t\t\tApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE);\n\t\t\treturn;\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t__FUNCTION__, JoinReq.Ssid, JoinReq.Bssid[0], JoinReq.Bssid[1], JoinReq.Bssid[2],\n\t\tJoinReq.Bssid[3], JoinReq.Bssid[4], JoinReq.Bssid[5]));\n\n\t*pCurrState = APCLI_CTRL_PROBE;\n\n\tMlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ,\n\t\tsizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex);\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME JOIN req timeout state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlJoinReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tAPCLI_MLME_JOIN_REQ_STRUCT JoinReq;\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Probe Req Timeout.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tif (ApScanRunning(pAd) == TRUE)\n\t{\n\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t\treturn;\n\t}\n\n\t/* stay in same state. */\n\t*pCurrState = APCLI_CTRL_PROBE;\n\n\t/* retry Probe Req. */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Retry Probe Req.\\n\", __FUNCTION__));\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tNdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT));\n\n\tif (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR))\n\t{\n\t\tCOPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid);\n\t}\n\n#ifdef WSC_AP_SUPPORT\n    if ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t(pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == TRUE))\n    {\n\t    ULONG bss_idx = 0;\n\t\tbss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)JoinReq.Ssid, JoinReq.SsidLen);\n\t\tif (bss_idx == BSS_NOT_FOUND)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::  WSC exec. start SiteSurvey!\\n\", __FUNCTION__));\n\t\t\t*pCurrState = APCLI_CTRL_PROBE;\n\t\t\tApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE);\n\t\t\treturn;\n\t\t}\n        NdisZeroMemory(JoinReq.Ssid, MAX_LEN_OF_SSID);\n        JoinReq.SsidLen = pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength;\n\t\tNdisMoveMemory(JoinReq.Ssid, pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, JoinReq.SsidLen);\n    }\n    else\n#endif /* WSC_AP_SUPPORT */\n\tif (pApCliEntry->CfgSsidLen != 0)\n\t{\n\t\tULONG bss_idx = 0;\n\n\t\tbss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen);\n\t\tif (bss_idx == BSS_NOT_FOUND)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::  can't find SSID[%s] in ScanTab.\\n\", __FUNCTION__, pApCliEntry->CfgSsid));\n\t\t\t*pCurrState = APCLI_CTRL_PROBE;\n\t\t\tApSiteSurvey(pAd, NULL, SCAN_ACTIVE, FALSE);\n\t\t\treturn;\n\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::  find SSID[%ld][%s] channel[%d-%d] in ScanTab.\\n\", __FUNCTION__, bss_idx, pApCliEntry->CfgSsid, pAd->ScanTab.BssEntry[bss_idx].Channel, pAd->ScanTab.BssEntry[bss_idx].CentralChannel));\n\t\t\t/* BssSearch Table has found the pEntry, send Prob Req. directly */\n\t\t\tpAd->CommonCfg.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel;\n\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\n\t\tJoinReq.SsidLen = pApCliEntry->CfgSsidLen;\n\t\tNdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t__FUNCTION__, JoinReq.Ssid, JoinReq.Bssid[0], JoinReq.Bssid[1], JoinReq.Bssid[2],\n\t\tJoinReq.Bssid[3], JoinReq.Bssid[4], JoinReq.Bssid[5]));\n\tMlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ,\n\t\tsizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex);\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Probe Rsp state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlProbeRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tAPCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg);\n\tUSHORT Status = Info->Status;\n\tPAPCLI_STRUCT pApCliEntry;\n\tMLME_AUTH_REQ_STRUCT AuthReq;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif (Status == MLME_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Probe respond success.\\n\", __FUNCTION__));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Apcli-Interface Ssid=%s.\\n\", __FUNCTION__, pApCliEntry->Ssid));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Apcli-Interface Bssid=%02x:%02x:%02x:%02x:%02x:%02x.\\n\", __FUNCTION__,\n\t\t\tpAd->ApCliMlmeAux.Bssid[0],\n\t\t\tpAd->ApCliMlmeAux.Bssid[1],\n\t\t\tpAd->ApCliMlmeAux.Bssid[2],\n\t\t\tpAd->ApCliMlmeAux.Bssid[3],\n\t\t\tpAd->ApCliMlmeAux.Bssid[4],\n\t\t\tpAd->ApCliMlmeAux.Bssid[5]));\n\n\t\t*pCurrState = APCLI_CTRL_AUTH;\n\n\t\tpApCliEntry->AuthReqCnt = 0;\n\n\t\tCOPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliMlmeAux.Bssid);\n\n\t\t/* start Authentication Req.\t */\t\n\t\t/* If AuthMode is Auto, try shared key first */\n\t\tif ((pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeShared) ||\n\t\t\t\t(pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeAutoSwitch))\n\t\t{\t\t\n\t\t\tAuthReq.Alg = Ndis802_11AuthModeShared;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAuthReq.Alg = Ndis802_11AuthModeOpen;\n\t\t}\n\n\t\tAuthReq.Timeout = AUTH_TIMEOUT;\n\t\tMlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ,\n\t\t\tsizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);\n\t} else\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Probe respond fail.\\n\", __FUNCTION__));\n\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t}\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME AUTH Rsp state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlAuthRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tAPCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg);\n\tUSHORT Status = Info->Status;\n\tMLME_ASSOC_REQ_STRUCT  AssocReq;\n\tMLME_AUTH_REQ_STRUCT AuthReq;\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif(Status == MLME_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Auth Rsp Success.\\n\", __FUNCTION__));\n\t\t*pCurrState = APCLI_CTRL_ASSOC;\n\n\t\tpApCliEntry->AssocReqCnt = 0;\n\n\t\tAssocParmFill(pAd, &AssocReq, pAd->ApCliMlmeAux.Bssid, pAd->ApCliMlmeAux.CapabilityInfo,\n\t\t\tASSOC_TIMEOUT, /*pAd->PortCfg.DefaultListenCount*/5);\n\t\tMlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ,\n\t\t\tsizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex);\n\t} \n\telse\n\t{\n\t\tif (pApCliEntry->AuthMode == Ndis802_11AuthModeAutoSwitch)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Auth Rsp Failure.\\n\", __FUNCTION__));\n\n\t\t\t*pCurrState = APCLI_CTRL_AUTH_2;\n\n\t\t\t/* start Second Authentication Req. */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Start Second Auth Rep.\\n\", __FUNCTION__));\n\t\t\tCOPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliMlmeAux.Bssid);\n\t\t\tAuthReq.Alg = Ndis802_11AuthModeOpen;\n\t\t\tAuthReq.Timeout = AUTH_TIMEOUT;\n\t\t\tMlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ,\n\t\t\tsizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);\n\t\t} else\n\t\t{\n\t\t\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\t\t\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\t\tpApCliEntry->AuthReqCnt = 0;\n\t\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t\t}\n\t}\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME AUTH2 Rsp state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlAuth2RspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tAPCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg);\n\tUSHORT Status = Info->Status;\n\tMLME_ASSOC_REQ_STRUCT  AssocReq;\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif(Status == MLME_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Auth2 Rsp Success.\\n\", __FUNCTION__));\n\t\t*pCurrState = APCLI_CTRL_ASSOC;\n\n\t\tpApCliEntry->AssocReqCnt = 0;\n\n\t\tAssocParmFill(pAd, &AssocReq, pAd->ApCliMlmeAux.Bssid, pAd->ApCliMlmeAux.CapabilityInfo,\n\t\t\tASSOC_TIMEOUT, /*pAd->PortCfg.DefaultListenCount*/5);\n\t\tMlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, \n\t\t\tsizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex);\n\t} else\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Sta Auth Rsp Failure.\\n\", __FUNCTION__));\n\n\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t}\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Auth Req timeout state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlAuthReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tMLME_AUTH_REQ_STRUCT AuthReq;\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Auth Req Timeout.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tpApCliEntry->AuthReqCnt++;\n\n\tif (pApCliEntry->AuthReqCnt > 5)\n\t{\n\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\t\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tpApCliEntry->AuthReqCnt = 0;\n\t\treturn;\n\t}\n\n\t/* stay in same state. */\n\t*pCurrState = APCLI_CTRL_AUTH;\n\n\t/* retry Authentication. */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Retry Auth Req.\\n\", __FUNCTION__));\n\tCOPY_MAC_ADDR(AuthReq.Addr, pAd->ApCliMlmeAux.Bssid);\n\tAuthReq.Alg = pAd->ApCliMlmeAux.Alg; /* Ndis802_11AuthModeOpen; */\n\tAuthReq.Timeout = AUTH_TIMEOUT;\n\tMlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ,\n\t\tsizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Auth2 Req timeout state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlAuth2ReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME ASSOC RSP state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlAssocRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPAPCLI_STRUCT pApCliEntry;\n\tAPCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg);\n\tUSHORT Status = Info->Status;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif(Status == MLME_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) apCliIf = %d, Receive Assoc Rsp Success.\\n\", __FUNCTION__, ifIndex));\n\n\t\tif (ApCliLinkUp(pAd, ifIndex))\n\t\t{\n\t\t\t*pCurrState = APCLI_CTRL_CONNECTED;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) apCliIf = %d, Insert Remote AP to MacTable failed.\\n\", __FUNCTION__,  ifIndex));\n\t\t\t/* Reset the apcli interface as disconnected and Invalid. */\n\t\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t\t\tpApCliEntry->Valid = FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) apCliIf = %d, Receive Assoc Rsp Failure.\\n\", __FUNCTION__,  ifIndex));\n\n\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\n\t\t/* set the apcli interface be valid. */\n\t\tpApCliEntry->Valid = FALSE;\n\t}\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME DeASSOC RSP state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlDeAssocRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPAPCLI_STRUCT pApCliEntry;\n\tAPCLI_CTRL_MSG_STRUCT *Info = (APCLI_CTRL_MSG_STRUCT *)(Elem->Msg);\n\tUSHORT Status = Info->Status;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif (Status == MLME_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Receive DeAssoc Rsp Success.\\n\", __FUNCTION__));\n\t} else\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Receive DeAssoc Rsp Failure.\\n\", __FUNCTION__));\n\t}\n\n\tif (pApCliEntry->Valid)\n\t\tApCliLinkDown(pAd, ifIndex);\n\t\n\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Assoc Req timeout state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlAssocReqTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tMLME_ASSOC_REQ_STRUCT  AssocReq;\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Assoc Req Timeout.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\t/* give up to retry authentication req after retry it 5 times. */\n\tpApCliEntry->AssocReqCnt++;\n\tif (pApCliEntry->AssocReqCnt > 5)\n\t{\n\t\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\t\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\t\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tpApCliEntry->AuthReqCnt = 0;\n\t\treturn;\n\t}\n\n\t/* stay in same state. */\n\t*pCurrState = APCLI_CTRL_ASSOC;\n\n\t/* retry Association Req. */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Retry Association Req.\\n\", __FUNCTION__));\n\tAssocParmFill(pAd, &AssocReq, pAd->ApCliMlmeAux.Bssid, pAd->ApCliMlmeAux.CapabilityInfo,\n\t\tASSOC_TIMEOUT, /*pAd->PortCfg.DefaultListenCount*/5);\n\tMlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_ASSOC_REQ, \n\t\tsizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, ifIndex);\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Disconnect Rsp state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlDisconnectReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) MLME Request disconnect.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif (pApCliEntry->Valid)\n\t\tApCliLinkDown(pAd, ifIndex);\n\n\t/* set the apcli interface be invalid. */\n\tpApCliEntry->Valid = FALSE;\n\n\t/* clear MlmeAux.Ssid and Bssid. */\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\tpAd->ApCliMlmeAux.SsidLen = 0;\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\tpAd->ApCliMlmeAux.Rssi = 0;\n\n\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Peer DeAssoc Req state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlPeerDeAssocReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPAPCLI_STRUCT pApCliEntry;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n#ifdef CONFIG_MULTI_CHANNEL\n\tMAC_TABLE_ENTRY *pEntry;\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) Peer DeAssoc Req.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\tif (pApCliEntry->Valid)\n\t\tApCliLinkDown(pAd, ifIndex);\n\n\t/* set the apcli interface be invalid. */\n\tpApCliEntry->Valid = FALSE;\n\n\t/* clear MlmeAux.Ssid and Bssid. */\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\tpAd->ApCliMlmeAux.SsidLen = 0;\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\tpAd->ApCliMlmeAux.Rssi = 0;\n\n\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Disconnect Req state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlDeAssocAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPAPCLI_STRUCT pApCliEntry;\n\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) MLME Request Disconnect.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\tDisassocParmFill(pAd, &DisassocReq, pAd->ApCliMlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING);\n\tMlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_DISASSOC_REQ,\n\t\tsizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, ifIndex);\n\n\tif (pApCliEntry->Valid)\n\t\tApCliLinkDown(pAd, ifIndex);\n\n\t/* set the apcli interface be invalid. */\n\tpApCliEntry->Valid = FALSE;\n\n\t/* clear MlmeAux.Ssid and Bssid. */\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\tpAd->ApCliMlmeAux.SsidLen = 0;\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\tpAd->ApCliMlmeAux.Rssi = 0;\n\n\t*pCurrState = APCLI_CTRL_DEASSOC;\n\n\treturn;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        APCLI MLME Disconnect Req state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliCtrlDeAuthAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPAPCLI_STRUCT pApCliEntry;\n\tMLME_DEAUTH_REQ_STRUCT\tDeAuthFrame;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"(%s) MLME Request Disconnect.\\n\", __FUNCTION__));\n\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn;\n\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\t/* Fill in the related information */\n\tDeAuthFrame.Reason = (USHORT)REASON_DEAUTH_STA_LEAVING;\n\tCOPY_MAC_ADDR(DeAuthFrame.Addr, pAd->ApCliMlmeAux.Bssid);\n\t\n\tMlmeEnqueue(pAd, \n\t\t\t\t  APCLI_AUTH_STATE_MACHINE, \n\t\t\t\t  APCLI_MT2_MLME_DEAUTH_REQ, \n\t\t\t\t  sizeof(MLME_DEAUTH_REQ_STRUCT),\n\t\t\t\t  &DeAuthFrame, \n\t\t\t\t  ifIndex);\n\n\tif (pApCliEntry->Valid)\n\t\tApCliLinkDown(pAd, ifIndex);\n\n\t/* set the apcli interface be invalid. */\n\tpApCliEntry->Valid = FALSE;\n\n\t/* clear MlmeAux.Ssid and Bssid. */\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Bssid, MAC_ADDR_LEN);\n\tpAd->ApCliMlmeAux.SsidLen = 0;\n\tNdisZeroMemory(pAd->ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID);\n\tpAd->ApCliMlmeAux.Rssi = 0;\n\n\t*pCurrState = APCLI_CTRL_DISCONNECTED;\n\n\treturn;\n}\n\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/p2pcli_sync.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tsta_sync.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tFonchi\t\t2006-06-23      modified for rt61-APClinent\n*/\n\n#ifdef P2P_SUPPORT\n\n#include \"rt_config.h\"\n\n#define OBSS_BEACON_RSSI_THRESHOLD\t\t(-85)\n\nstatic VOID ApCliProbeTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3);\n\nstatic VOID ApCliMlmeProbeReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliPeerProbeRspAtJoinAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliProbeTimeoutAtJoinAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliInvalidStateWhenJoin(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem);\n\nstatic VOID ApCliEnqueueProbeRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR SsidLen,\n\tOUT PCHAR Ssid,\n\tIN USHORT ifIndex);\n\nstatic VOID ApCliPeerProbeRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem);\n\nDECLARE_TIMER_FUNCTION(ApCliProbeTimeout);\nBUILD_TIMER_FUNCTION(ApCliProbeTimeout);\n\n/*\n    ==========================================================================\n    Description:\n        The sync state machine, \n    Parameters:\n        Sm - pointer to the state machine\n    Note:\n        the state machine looks like the following\n    ==========================================================================\n */\nVOID ApCliSyncStateMachineInit(\n\tIN PRTMP_ADAPTER pAd,\n\tIN STATE_MACHINE *Sm,\n\tOUT STATE_MACHINE_FUNC Trans[])\n{\n\tUCHAR i;\n\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans,\n\t\tAPCLI_MAX_SYNC_STATE, APCLI_MAX_SYNC_MSG,\n\t\t(STATE_MACHINE_FUNC)Drop, APCLI_SYNC_IDLE,\n\t\tAPCLI_SYNC_MACHINE_BASE);\n\n\t/* column 1 */\n\tStateMachineSetAction(Sm, APCLI_SYNC_IDLE, APCLI_MT2_MLME_PROBE_REQ, (STATE_MACHINE_FUNC)ApCliMlmeProbeReqAction);\n\tStateMachineSetAction(Sm, APCLI_SYNC_IDLE, APCLI_MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)ApCliPeerProbeRspAction);\n\n\t//column 2 */\n\tStateMachineSetAction(Sm, APCLI_JOIN_WAIT_PROBE_RSP, APCLI_MT2_MLME_PROBE_REQ, (STATE_MACHINE_FUNC)ApCliInvalidStateWhenJoin);\n\tStateMachineSetAction(Sm, APCLI_JOIN_WAIT_PROBE_RSP, APCLI_MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)ApCliPeerProbeRspAtJoinAction);\n\tStateMachineSetAction(Sm, APCLI_JOIN_WAIT_PROBE_RSP, APCLI_MT2_PEER_BEACON, (STATE_MACHINE_FUNC)ApCliPeerProbeRspAtJoinAction);\n\tStateMachineSetAction(Sm, APCLI_JOIN_WAIT_PROBE_RSP, APCLI_MT2_PROBE_TIMEOUT, (STATE_MACHINE_FUNC)ApCliProbeTimeoutAtJoinAction);\n\n\t/* timer init */\n\tRTMPInitTimer(pAd, &pAd->ApCliMlmeAux.ProbeTimer, GET_TIMER_FUNCTION(ApCliProbeTimeout), pAd, FALSE);\n\n\tfor (i = 0; i < MAX_APCLI_NUM; i++)\n\t\tpAd->ApCfg.ApCliTab[i].SyncCurrState = APCLI_SYNC_IDLE;\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Becaon timeout handler, executed in timer thread\n    ==========================================================================\n */\nstatic VOID ApCliProbeTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCli_SYNC - ProbeReqTimeout\\n\"));\n\n\tMlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_PROBE_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME PROBE req state machine procedure\n    ==========================================================================\n */\nstatic VOID ApCliMlmeProbeReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tBOOLEAN Cancelled;\n\tAPCLI_MLME_JOIN_REQ_STRUCT *Info = (APCLI_MLME_JOIN_REQ_STRUCT *)(Elem->Msg);\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s)\\n\", Info->Ssid));\n\n\t/* reset all the timers */\n\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ProbeTimer, &Cancelled);\n\n\tpAd->ApCliMlmeAux.Rssi = -9999;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == FALSE)\n#endif /* CONFIG_MULTI_CHANNEL */\n\tpAd->ApCliMlmeAux.Channel = pAd->CommonCfg.Channel;\n\n\tpAd->ApCliMlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen;\n\tNdisMoveMemory(pAd->ApCliMlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen);\n\n\t/* Prepare the default value for extended rate */\n\tpAd->ApCliMlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen;\n\tNdisMoveMemory(pAd->ApCliMlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen);\n\n\tRTMPSetTimer(&pAd->ApCliMlmeAux.ProbeTimer, PROBE_TIMEOUT);\n\n\tApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"ApCli SYNC - Start Probe the SSID %s on channel =%d\\n\", pAd->ApCliMlmeAux.Ssid, pAd->ApCliMlmeAux.Channel));\n\n\t*pCurrState = APCLI_JOIN_WAIT_PROBE_RSP;\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        When waiting joining the (I)BSS, beacon received from external\n    ==========================================================================\n */\nstatic VOID ApCliPeerProbeRspAtJoinAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT LenVIE;\n\tUCHAR *VarIE = NULL;\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n#ifdef DOT11_N_SUPPORT\n        UCHAR CentralChannel = 0;\n#endif /* DOT11_N_SUPPORT */\n\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState;\n\n\tBCN_IE_LIST *ie_list = NULL;\n\n\n\t/* Init Variable IE structure */\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\t\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (ie_list == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate ie_list fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\tNdisZeroMemory(ie_list, sizeof(BCN_IE_LIST));\n\n\n\t\n\n\tif (PeerBeaconAndProbeRspSanity(pAd, \n\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t&LenVIE,\n\t\t\t\t\t\t\t\tpVIE))\n\t{\n\t\t/*\n\t\t\tBEACON from desired BSS/IBSS found. We should be able to decide most\n\t\t\tBSS parameters here.\n\t\t\tQ. But what happen if this JOIN doesn't conclude a successful ASSOCIATEION?\n\t\t\t\tDo we need to receover back all parameters belonging to previous BSS?\n\t\t\tA. Should be not. There's no back-door recover to previous AP. It still need\n\t\t\t\ta new JOIN-AUTH-ASSOC sequence.\n\t\t*/\n\t\tINT ssidEqualFlag = FALSE;\n\t\tINT ssidEmptyFlag = FALSE;\n\t\tINT bssidEqualFlag = FALSE;\n\t\tINT bssidEmptyFlag = FALSE;\n\t\tINT matchFlag = FALSE;\n\t\tULONG   Bssidx;\n\n#ifdef P2P_SUPPORT\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_PEER_PROB_RSP, Elem->MsgLen, Elem->Msg, ie_list->Channel);\n#endif /* P2P_SUPPORT */\n\n\t\t\t\t/*\n\t\t\t\t\tUpdate ScanTab\n\t\t\t\t*/\n\t\t\t\tBssidx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel);\n\t\t\t\tif (Bssidx == BSS_NOT_FOUND)\n\t\t\t\t{\n\t\t\t\t\t/* discover new AP of this network, create BSS entry */\n\t\t\t\t\tBssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -127, LenVIE, pVIE);\n\t\t\t\t\t\n\t\t\t\t\tif (Bssidx == BSS_NOT_FOUND) /* return if BSS table full */\n\t\t\t\t\t\tgoto LabelErr;\n\n\t\t\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4);\n\t\t\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\t\t\tpAd->ScanTab.BssEntry[Bssidx].MinSNR = Elem->Signal % 10;\n\t\t\t\t\tif (pAd->ScanTab.BssEntry[Bssidx].MinSNR == 0)\n\t\t\t\t\t\tpAd->ScanTab.BssEntry[Bssidx].MinSNR = -5;\n\t\t\t\t\t\n\t\t\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].MacAddr, ie_list->Addr2, MAC_ADDR_LEN);\n\t\t\t\t}\n\n\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];\n\n\t\t/* Check the Probe-Rsp's Bssid. */\n\t\tif(!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR))\n\t\t\tbssidEqualFlag = MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ie_list->Bssid);\n\t\telse\n\t\t\tbssidEmptyFlag = TRUE;\n\t\t/* Check the Probe-Rsp's Ssid. */\n\t\tif(pApCliEntry->CfgSsidLen != 0)\n\t\t\tssidEqualFlag = SSID_EQUAL(pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, ie_list->Ssid, ie_list->SsidLen);\n\t\telse\n\t\t\tssidEmptyFlag = TRUE;\n\n\n\t\t/* bssid and ssid, Both match. */\n\t\tif (bssidEqualFlag && ssidEqualFlag)\n\t\t\tmatchFlag = TRUE;\n\n\t\t/* ssid match but bssid doesn't be indicate. */\n\t\telse if(ssidEqualFlag && bssidEmptyFlag)\n\t\t\tmatchFlag = TRUE;\n\n\t\t/* user doesn't indicate any bssid or ssid. AP-Clinet will auto pick a AP to join by most strong siganl strength. */\n\t\telse if (bssidEmptyFlag && ssidEmptyFlag)\n\t\t\tmatchFlag = TRUE;\n\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - bssidEqualFlag=%d, ssidEqualFlag=%d, matchFlag=%d\\n\", bssidEqualFlag, ssidEqualFlag, matchFlag));\n\t\tif (matchFlag)\n\t\t{\n\t\t\t/* Validate RSN IE if necessary, then copy store this information */\n\t\t\tif ((LenVIE > 0) \n#ifdef WSC_AP_SUPPORT\n                && ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode == WSC_DISABLE) || \n                \t(pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == FALSE))\n#endif /* WSC_AP_SUPPORT */\n                )\n\t\t\t{\n\t\t\t\tif (ApCliValidateRSNIE(pAd, (PEID_STRUCT)pVIE, LenVIE, ifIndex))\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCliMlmeAux.VarIELen = LenVIE;\n\t\t\t\t\tNdisMoveMemory(pAd->ApCliMlmeAux.VarIEs, pVIE, pAd->ApCliMlmeAux.VarIELen);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* ignore this response */\n\t\t\t\t\tpAd->ApCliMlmeAux.VarIELen = 0;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: The RSN IE of this received Probe-resp is dis-match !!!!!!!!!! \\n\"));\n\t\t\t\t\tgoto LabelErr;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA\n#ifdef WSC_AP_SUPPORT\n                    && ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode == WSC_DISABLE) || \n                \t\t(pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == FALSE))\n#endif /* WSC_AP_SUPPORT */\n                    )\n\t\t\t\t{\n\t\t\t\t\t/* ignore this response */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR: The received Probe-resp has empty RSN IE !!!!!!!!!! \\n\"));\n\t\t\t\t\tgoto LabelErr;\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t\tpAd->ApCliMlmeAux.VarIELen = 0;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - receive desired PROBE_RSP at JoinWaitProbeRsp... Channel = %d\\n\", ie_list->Channel));\n\n\t\t\t/* if the Bssid doesn't be indicated then you need to decide which AP to connect by most strong Rssi signal strength. */\n\t\t\tif (bssidEqualFlag == FALSE)\n\t\t\t{\n\t\t\t\t/* caculate real rssi value. */\n\t\t\t\tCHAR Rssi0 = ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20);\n\t\t\t\tCHAR Rssi1 = ConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20);\n\t\t\t\tCHAR Rssi2 = ConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20);\n\t\t\t\tLONG RealRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2));\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - previous Rssi = %ld current Rssi=%ld\\n\", pAd->ApCliMlmeAux.Rssi, (LONG)RealRssi));\n\t\t\t\tif (pAd->ApCliMlmeAux.Rssi > (LONG)RealRssi)\n\t\t\t\t\tgoto LabelErr;\n\t\t\t\telse\n\t\t\t\t\tpAd->ApCliMlmeAux.Rssi = RealRssi;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOLEAN Cancelled;\n\t\t\t\tRTMPCancelTimer(&pAd->ApCliMlmeAux.ProbeTimer, &Cancelled);\n\n\t\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t\t\t{\n\t\t\t\t/* Stop Scan and resume */\n\t\t\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\t\t\t\tpAd->MlmeAux.Channel = 0;\n\t\t\t\tScanNextChannel(pAd, OPMODE_AP);\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::  Swich Channel = %d. and STOP Scanning!!\\n\", __FUNCTION__, ie_list->Channel));\n\t\t\t}\n\n\t\t\tNdisMoveMemory(pAd->ApCliMlmeAux.Ssid, ie_list->Ssid, ie_list->SsidLen);\n\t\t\tpAd->ApCliMlmeAux.SsidLen = ie_list->SsidLen;\n\n\t\t\tNdisMoveMemory(pAd->ApCliMlmeAux.Bssid, ie_list->Bssid, MAC_ADDR_LEN);\t\t\t\n\t\t\tpAd->ApCliMlmeAux.CapabilityInfo = ie_list->CapabilityInfo & SUPPORTED_CAPABILITY_INFO;\n\t\t\tpAd->ApCliMlmeAux.BssType = ie_list->BssType;\n\t\t\tpAd->ApCliMlmeAux.BeaconPeriod = ie_list->BeaconPeriod;\n\t\t\tpAd->ApCliMlmeAux.Channel = ie_list->Channel;\n\t\t\tpAd->ApCliMlmeAux.AtimWin = ie_list->AtimWin;\n\t\t\tpAd->ApCliMlmeAux.CfpPeriod = ie_list->CfParm.CfpPeriod;\n\t\t\tpAd->ApCliMlmeAux.CfpMaxDuration = ie_list->CfParm.CfpMaxDuration;\n\t\t\tpAd->ApCliMlmeAux.APRalinkIe = ie_list->RalinkIe;\n\n\t\t\t/* Copy AP's supported rate to MlmeAux for creating assoication request */\n\t\t\t/* Also filter out not supported rate */\n\t\t\tpAd->ApCliMlmeAux.SupRateLen = ie_list->SupRateLen;\n\t\t\tNdisMoveMemory(pAd->ApCliMlmeAux.SupRate, ie_list->SupRate, ie_list->SupRateLen);\n\t\t\tRTMPCheckRates(pAd, pAd->ApCliMlmeAux.SupRate, &pAd->ApCliMlmeAux.SupRateLen);\n\t\t\tpAd->ApCliMlmeAux.ExtRateLen = ie_list->ExtRateLen;\n\t\t\tNdisMoveMemory(pAd->ApCliMlmeAux.ExtRate, ie_list->ExtRate, ie_list->ExtRateLen);\n\t\t\tRTMPCheckRates(pAd, pAd->ApCliMlmeAux.ExtRate, &pAd->ApCliMlmeAux.ExtRateLen);\n\n#ifdef DOT11_N_SUPPORT\n\t\t\tNdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].RxMcsSet,sizeof(pAd->ApCfg.ApCliTab[ifIndex].RxMcsSet));\n\t\t\t/* filter out un-supported ht rates */\n\t\t\tif ((ie_list->HtCapabilityLen > 0) && \n\t\t\t\t(pApCliEntry->DesiredHtPhyInfo.bHtEnable) &&\n\t\t\t\tWMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\t{\n#ifdef P2P_SUPPORT\t\t\t\t\n\t\t\t\tBOOLEAN P2PGroup_BW;\t\t\t\t\n\t\t\t\tUCHAR BwFallBack = 0;\n#endif /* P2P_SUPPORT */\n\n\t\t\t\tRTMPZeroMemory(&pAd->ApCliMlmeAux.HtCapability, SIZE_HT_CAP_IE);\n\t\t\t\tpAd->ApCliMlmeAux.NewExtChannelOffset = ie_list->NewExtChannelOffset;\n\t\t\t\tpAd->ApCliMlmeAux.HtCapabilityLen = ie_list->HtCapabilityLen;\n\t\t\t\tApCliCheckHt(pAd, ifIndex, &ie_list->HtCapability, &ie_list->AddHtInfo);\n\t\t\t\tRTMPMoveMemory(&pAd->ApCliMlmeAux.AddHtInfo, &ie_list->AddHtInfo, SIZE_ADD_HT_INFO_IE);\n\n\t\t\t\tif (ie_list->AddHtInfoLen > 0)\n\t\t\t\t{\n\t\t\t\t\tCentralChannel = ie_list->AddHtInfo.ControlChan;\n\t\t \t\t\t/* Check again the Bandwidth capability of this AP. */\n\t\t\t\t\tCentralChannel = get_cent_ch_by_htinfo(pAd, &ie_list->AddHtInfo, &ie_list->HtCapability);\n\t\t \t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerBeaconAtJoinAction HT===>Central Channel = %d, Control Channel = %d,  .\\n\", CentralChannel, ie_list->AddHtInfo.ControlChan));\n\t\t\t\t}\n#ifdef P2P_SUPPORT\n\t\t\t\tif (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != CentralChannel) && (pAd->StaActive.SupportedHtPhy.ChannelWidth == BW_40))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"PeerBeaconAtJoinAction HT===> Channel offset = %d not match INFRA Channel offset %d .\\n\",\n\t\t\t\t\t\t\t\tpAd->MlmeAux.CentralChannel, CentralChannel));\n\t\t\t\t\t//goto LabelErr;\n\t\t\t\t}\n\n\t\t\t\t/*P2PChannelInit(pAd, MAIN_MBSSID); */\n\t\t\t\tpAd->ApCliMlmeAux.CentralChannel = CentralChannel;\n\t\t\t\t//P2PInitChannelRelatedValue(pAd);\n\t\t\t\tif (pAd->ApCliMlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)\n\t\t\t\t\tP2PGroup_BW = TRUE;\n\t\t\t\telse\n\t\t\t\t\tP2PGroup_BW = FALSE;\n\n\t\t\t\tAdjustChannelRelatedValue(pAd,\n\t\t\t\t\t\t\t\t\t\t\t&BwFallBack,\n\t\t\t\t\t\t\t\t\t\t\tifIndex,\n\t\t\t\t\t\t\t\t\t\t\tP2PGroup_BW,\n\t\t\t\t\t\t\t\t\t\t\tpAd->ApCliMlmeAux.Channel,\n\t\t\t\t\t\t\t\t\t\t\tpAd->ApCliMlmeAux.CentralChannel\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t\t\t\t\t\t\t\t,1\n#endif /*CONFIG_MULTI_CHANNEL*/\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t);\n\n\n\t\t\t\tif (BwFallBack == 1)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Infra STA connection to 40MHz AP, but Infra extra and P2P Group extra is different!!!\\n\"));\n\t\t\t\t\tpAd->ApCliMlmeAux.HtCapability.HtCapInfo.ChannelWidth = BW_20;\n\t\t\t\t\tpAd->ApCliMlmeAux.CentralChannel = pAd->ApCliMlmeAux.Channel;\n\t\t\t\t\tpAd->ApCliMlmeAux.bBwFallBack = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->ApCliMlmeAux.bBwFallBack = FALSE;\n\t\t\t\t}\n\n\t\t\t\tpAd->ApCliMlmeAux.ConCurrentCentralChannel = pAd->CommonCfg.CentralChannel;\n#endif /* P2P_SUPPORT */\n\t\t\t}\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t{\n\t\t\t\tRTMPZeroMemory(&pAd->ApCliMlmeAux.HtCapability, SIZE_HT_CAP_IE);\n\t\t\t\tRTMPZeroMemory(&pAd->ApCliMlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE);\n\t\t\t\tpAd->ApCliMlmeAux.HtCapabilityLen = 0;\n\t\t\t}\n#ifdef P2P_SUPPORT\n\t\t\tP2PUpdateMlmeRate(pAd);\n#else\n\t\t\tRTMPUpdateMlmeRate(pAd);\n#endif /* P2P_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\t\t/* copy QOS related information */\n\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&pAd->ApCliMlmeAux.APEdcaParm, &ie_list->EdcaParm, sizeof(EDCA_PARM));\n\t\t\t\tNdisMoveMemory(&pAd->ApCliMlmeAux.APQbssLoad, &ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t\tNdisMoveMemory(&pAd->ApCliMlmeAux.APQosCapability, &ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM));\n\t\t\t}\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&pAd->ApCliMlmeAux.APEdcaParm, sizeof(EDCA_PARM));\n\t\t\t\tNdisZeroMemory(&pAd->ApCliMlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t\tNdisZeroMemory(&pAd->ApCliMlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\\n\", \n\t\t\t\tpAd->ApCliMlmeAux.SupRateLen, pAd->ApCliMlmeAux.ExtRateLen));\n\n\t\t\tif (ie_list->AironetCellPowerLimit != 0xFF)\n\t\t\t{\n\t\t\t\t/*We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power */\n\t\t\t\tChangeToCellPowerLimit(pAd, ie_list->AironetCellPowerLimit);\n\t\t\t}\n\t\t\telse  /*Used the default TX Power Percentage. */\n\t\t\t\tpAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;\n\t\t\tif(bssidEqualFlag == TRUE)\n\t\t\t{\n\t\t\t\t*pCurrState = APCLI_SYNC_IDLE;\n\n\t\t\t\tApCliCtrlMsg.Status = MLME_SUCCESS;\n\t\t\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP,\n\t\t\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t\t\t}\n\t\t}\n\t\t/* not to me BEACON, ignored */\n\t}\n\t/* sanity check fail, ignore this frame */\n\nLabelErr:\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\n\treturn;\n}\n\nstatic VOID ApCliProbeTimeoutAtJoinAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_SYNC - ProbeTimeoutAtJoinAction\\n\"));\n\t*pCurrState = SYNC_IDLE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_SYNC - ApCliMlmeAux.Bssid=%02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\tpAd->ApCliMlmeAux.Bssid[0],\n\t\t\t\tpAd->ApCliMlmeAux.Bssid[1],\n\t\t\t\tpAd->ApCliMlmeAux.Bssid[2],\n\t\t\t\tpAd->ApCliMlmeAux.Bssid[3],\n\t\t\t\tpAd->ApCliMlmeAux.Bssid[4],\n\t\t\t\tpAd->ApCliMlmeAux.Bssid[5]));\n\n\tif(!MAC_ADDR_EQUAL(pAd->ApCliMlmeAux.Bssid, ZERO_MAC_ADDR))\n\t{\n\t\tApCliCtrlMsg.Status = MLME_SUCCESS;\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP,\n\t\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\t} else\n\t{\n\t\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);\n\t}\n\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n    ==========================================================================\n */\nstatic VOID ApCliInvalidStateWhenJoin(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tAPCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;\n\tUSHORT ifIndex = (USHORT)(Elem->Priv);\n\tPULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState;\n\n\t*pCurrState = APCLI_SYNC_IDLE;\n\tApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP,\n\t\tsizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"APCLI_AYNC - ApCliInvalidStateWhenJoin(state=%ld). Reset SYNC machine\\n\", *pCurrState));\n\n\treturn;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nstatic VOID ApCliEnqueueProbeRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR SsidLen,\n\tOUT PCHAR Ssid,\n\tIN USHORT ifIndex)\n{\n\tNDIS_STATUS     NState;\n\tPUCHAR          pOutBuffer;\n\tULONG           FrameLen = 0;\n\tHEADER_802_11   Hdr80211;\n\tUCHAR           SsidIe    = IE_SSID;\n\tUCHAR           SupRateIe = IE_SUPP_RATES;\n\tUCHAR ssidLen;\n\tCHAR ssid[MAX_LEN_OF_SSID];\n\tPUCHAR\tptr;\n\tULONG\t\t\tTmpLen;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"force out a ProbeRequest ...\\n\"));\n\n\t\n\tNState = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory */\n\tif(NState != NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EnqueueProbeRequest() allocate memory fail\\n\"));\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tif(MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, ZERO_MAC_ADDR))\n\t\t\tApCliMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0,\n\t\t\t\tBROADCAST_ADDR, BROADCAST_ADDR, ifIndex);\n\t\telse\n\t\t\tApCliMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0,\n\t\t\t\tpAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, ifIndex);\n\n\t\tssidLen = SsidLen;\n\t\tNdisZeroMemory(ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(ssid, Ssid, ssidLen);\n\n\t\t/* this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse */\n\t\tMakeOutgoingFrame(pOutBuffer,\t\t&FrameLen,\n\t\t\tsizeof(HEADER_802_11),\t\t\t&Hdr80211,\n\t\t\t1,\t\t\t\t\t\t\t\t&SsidIe,\n\t\t\t1,\t\t\t\t\t\t\t\t&ssidLen,\n\t\t\tssidLen,\t\t\t\t\t\tssid,\n\t\t\t1,\t\t\t\t\t\t\t\t&SupRateIe,\n\t\t\t1,\t\t\t\t\t\t\t\t&pAd->ApCliMlmeAux.SupRateLen,\n\t\t\tpAd->ApCliMlmeAux.SupRateLen,\t\tpAd->ApCliMlmeAux.SupRate,\n\t\t\tEND_OF_ARGS);\n\n\t\t/* Add the extended rate IE */\n\t\tif (pAd->ApCliMlmeAux.ExtRateLen != 0)\n\t\t{\n\t\t\tULONG            tmp;\n\t\t\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,    &tmp,\n\t\t\t\t1,                        &ExtRateIe,\n\t\t\t\t1,                        &pAd->ApCliMlmeAux.ExtRateLen,\n\t\t\t\tpAd->ApCliMlmeAux.ExtRateLen,  pAd->ApCliMlmeAux.ExtRate,                           \n\t\t\t\tEND_OF_ARGS);\n\t\t\tFrameLen += tmp;\n\t\t}\n\n\t\tP2pMakeProbeRspWSCIE(pAd, pOutBuffer + FrameLen, &TmpLen);\n\t\tFrameLen += TmpLen;\n\t\n\t\tptr = pOutBuffer + FrameLen;\n\t\tP2pMakeP2pIE(pAd, SUBTYPE_PROBE_REQ, ptr, &TmpLen);\n\t\tFrameLen += TmpLen;\n\n\t\tMiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t}\n\n\treturn;\n}\n\nBOOLEAN ApCliWaitProbRsp(\n\tIN PRTMP_ADAPTER pAd,\n\tIN USHORT ifIndex)\n{\n\tif (ifIndex >= MAX_APCLI_NUM)\n\t\treturn FALSE;\n\n\treturn (pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState == APCLI_JOIN_WAIT_PROBE_RSP) ?\n\t\tTRUE : FALSE;\n}\n\n/*\n    ==========================================================================\n    Description:\n        peer sends beacon back when scanning\n    ==========================================================================\n */\nVOID ApCliPeerProbeRspAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n    PFRAME_802_11   pFrame;\n\n\tUCHAR\t\t\t*VarIE = NULL;\n    USHORT          LenVIE;\n\tNDIS_802_11_VARIABLE_IEs\t*pVIE = NULL;\n\n\tCHAR\t\t\tRealRssi = -127;\n\n\tBCN_IE_LIST *ie_list = NULL;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\t/* Init Variable IE structure */\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (ie_list == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate ie_list fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelErr;\n\t}\n\tNdisZeroMemory(ie_list, sizeof(BCN_IE_LIST));\n\n\tpFrame = (PFRAME_802_11) Elem->Msg;\n\n\tif (PeerBeaconAndProbeRspSanity(pAd, \n\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t&LenVIE,\n\t\t\t\t\t\t\t\tpVIE))\n    {\n\t\tULONG Idx;\n\t\tCHAR  Rssi = -127;\n\n\t\tRealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n#ifdef P2P_SUPPORT\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_PEER_PROB_RSP, Elem->MsgLen, Elem->Msg, ie_list->Channel);\n#endif /* P2P_SUPPORT */\n\n\t\t\n\t\t/* ignore BEACON not in this channel */\n\t\tif (ie_list->Channel != pAd->MlmeAux.Channel\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\t&& (pAd->CommonCfg.bOverlapScanning == FALSE)\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\t   )\n\t\t{\n\t\t\tgoto __End_Of_APPeerBeaconAtScanAction;\n\t\t}\n\n#ifdef DOT11_N_SUPPORT\n   \t\tif ((RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && (ie_list->HtCapability.HtCapInfo.Forty_Mhz_Intolerant)) /* || (HtCapabilityLen == 0))) */\n\t\t{\n\t\t\tHandle_BSS_Width_Trigger_Events(pAd);\n\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef IDS_SUPPORT\n\t\t/* Conflict SSID detection */\n\t\tif (ie_list->Channel == pAd->CommonCfg.Channel)\n\t\t\tRTMPConflictSsidDetection(pAd, ie_list->Ssid, ie_list->SsidLen, Elem->Rssi0, Elem->Rssi1, Elem->Rssi2, Elem->AntSel);\n#endif /* IDS_SUPPORT */\n\n\t\t/*\n\t\t\tThis correct im-proper RSSI indication during SITE SURVEY issue.\n\t\t\tAlways report bigger RSSI during SCANNING when receiving multiple BEACONs from the same AP.\n\t\t\tThis case happens because BEACONs come from adjacent channels, so RSSI become weaker as we\n\t\t\tswitch to more far away channels.\n\t\t*/\n        Idx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel);\n\t\tif (Idx != BSS_NOT_FOUND)\n            Rssi = pAd->ScanTab.BssEntry[Idx].Rssi;\n\n\t\t\n\n        /* TODO: 2005-03-04 dirty patch. we should change all RSSI related variables to SIGNED SHORT for easy/efficient reading and calaulation */\n\t\tRealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n        if ((RealRssi + pAd->BbpRssiToDbmDelta) > Rssi)\n            Rssi = RealRssi + pAd->BbpRssiToDbmDelta;\n\n\t\tIdx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -Rssi, LenVIE, pVIE);\n\t\t\n\t\tif (Idx != BSS_NOT_FOUND)\n\t\t{\n\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4);\n\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\t\t}\n\t}\n\n\t/* sanity check fail, ignored */\n__End_Of_APPeerBeaconAtScanAction:\n\t/*scan beacon in pastive */\n#ifdef CONFIG_AP_SUPPORT\nIF_DEV_CONFIG_OPMODE_ON_AP(pAd)\n{\n\tif (ie_list->Channel == pAd->ApCfg.AutoChannel_Channel)\n\t{\n\t\tif (AutoChBssSearchWithSSID(pAd, ie_list->Bssid, (PUCHAR)ie_list->Ssid, ie_list->SsidLen, ie_list->Channel) == BSS_NOT_FOUND)\n\t\t\tpAd->pChannelInfo->ApCnt[pAd->ApCfg.current_channel_index]++;\n\n\t\tAutoChBssInsertEntry(pAd, ie_list->Bssid, (CHAR *)ie_list->Ssid, ie_list->SsidLen, ie_list->Channel, ie_list->NewExtChannelOffset, RealRssi);   \n\t}\n}\n#endif /* CONFIG_AP_SUPPORT */\nLabelErr:\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n}\n\n#endif /* P2P_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/rtmp_ckipmic.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_ckipmic.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tName\t\tDate\t\t\tModification logs\n*/\n#include \"rt_config.h\"\n#include \"rtmp_ckipmic.h\"\n\n#define MIC_ACCUM(v)            pContext->accum += (ULONGLONG)v * RTMPMicGetCoefficient(pContext)\n#define GB(p,i,s)               ( ((ULONG) *((UCHAR*)(p)+i) ) << (s) )\n#define GETBIG32(p)             GB(p,0,24)|GB(p,1,16)|GB(p,2,8)|GB(p,3,0)\n\n/*****************************/\n/******** SBOX Table *********/\n/*****************************/\n\nUCHAR SboxTable[256] =\n{\n    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,\n    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,\n    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,\n    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,\n    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,\n    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,\n    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,\n    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,\n    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,\n    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,\n    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,\n    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\n    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,\n    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,\n    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,\n    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,\n    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,\n    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,\n    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,\n    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,\n    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16\n};\n\n/*===========================================================================*/\n/*=================== CKIP KEY PERMUTATION ==================================*/\n/*===========================================================================*/\n\n/* 2-byte by 2-byte subset of the full AES table */\nstatic const USHORT Sbox[256] =\n{\n    0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154,\n    0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A,\n    0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B,\n    0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B,\n    0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F,\n    0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F,\n    0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5,\n    0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F,\n    0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB,\n    0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397,\n    0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED,\n    0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A,\n    0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194,\n    0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3,\n    0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104,\n    0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D,\n    0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39,\n    0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695,\n    0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83,\n    0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76,\n    0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4,\n    0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B,\n    0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0,\n    0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018,\n    0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751,\n    0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85,\n    0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12,\n    0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9,\n    0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7,\n    0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A,\n    0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8,\n    0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A\n    };\n\n#define Lo8(v16)     ((v16)       & 0xFF)\n#define Hi8(v16)    (((v16) >> 8) & 0xFF)\n#define u16Swap(i)  ( (((i) >> 8) & 0xFF) | (((i) << 8) & 0xFF00) )\n#define _S_(i)      (Sbox[Lo8(i)] ^ u16Swap(Sbox[Hi8(i)]))\n\n#define rotLeft_1(x) ((((x) << 1) | ((x) >> 15)) & 0xFFFF)\nVOID CKIP_key_permute\n    (\n     OUT UCHAR  *PK,           /* output permuted key */\n     IN UCHAR *CK,           /* input CKIP key */\n     IN UCHAR  toDsFromDs,    /* input toDs/FromDs bits */\n     IN UCHAR *piv           /* input pointer to IV */\n     )\n{\n    int i;\n    USHORT H[2], tmp;          /* H=32-bits of per-packet hash value */\n    USHORT L[8], R[8];         /* L=u16 array of CK, R=u16 array of PK */\n\n    /* build L from input key */\n    memset(L, 0, sizeof(L));\n    for (i=0; i<16; i++) {\n        L[i>>1] |= ( ((USHORT)(CK[i])) << ( i & 1 ? 8 : 0) );\n    }\n\n    H[0] = (((USHORT)piv[0]) << 8) + piv[1];\n    H[1] = ( ((USHORT)toDsFromDs) << 8) | piv[2];\n\n    for (i=0; i<8; i++) {\n        H[0] ^= L[i];           /* 16-bits of key material */\n        tmp   = _S_(H[0]);      /* 16x16 permutation */\n        H[0]  = tmp ^ H[1];     /* set up for next round */\n        H[1]  = tmp;\n        R[i]  = H[0];           /* store into key array  */\n    }\n    \n    /* sweep in the other direction */\n    tmp=L[0];\n    for (i=7; i>0; i--) {\n        R[i] = tmp = rotLeft_1(tmp) + R[i];\n    }\n    \n    /* IV of the permuted key is unchanged */\n    PK[0] = piv[0];\n    PK[1] = piv[1];\n    PK[2] = piv[2];\n\n    /* key portion of the permuted key is changed */\n    for (i=3; i<16; i++) {\n        PK[i] = (UCHAR) (R[i>>1] >> (i & 1 ? 8 : 0));\n    }\n}    \n\n/* prepare for calculation of a new mic */\nVOID RTMPCkipMicInit(\n    IN  PMIC_CONTEXT        pContext,\n    IN  PUCHAR              CK)\n{\n    /* prepare for new mic calculation */\n    NdisMoveMemory(pContext->CK, CK, sizeof(pContext->CK));\n    pContext->accum = 0;\n    pContext->position = 0;\n}\n\n/* add some bytes to the mic calculation */\nVOID RTMPMicUpdate(\n    IN  PMIC_CONTEXT        pContext,\n    IN  PUCHAR              pOctets,\n    IN  INT                 len)\n{\n    INT     byte_position;\n    ULONG   val;\n\n    byte_position = (pContext->position & 3);\n    while (len > 0) {\n        /* build a 32-bit word for MIC multiply accumulate */\n        do {\n            if (len == 0) return;\n            pContext->part[byte_position++] = *pOctets++;\n            pContext->position++;\n            len--;\n        } while (byte_position < 4);\n        /* have a full 32-bit word to process */\n        val = GETBIG32(&pContext->part[0]);\n        MIC_ACCUM(val);\n        byte_position = 0;\n    }\n}\n\nULONG RTMPMicGetCoefficient(\n    IN  PMIC_CONTEXT         pContext)\n{\n    UCHAR   aes_counter[16];\n    INT     coeff_position;\n    UCHAR   *p;\n\n    coeff_position = (pContext->position - 1) >> 2;\n    if ( (coeff_position & 3) == 0) {\n        /* fetching the first coefficient -- get new 16-byte aes counter output */\n        u32 counter = (coeff_position >> 2);\n            \n        /* new counter value */\n        memset(&aes_counter[0], 0, sizeof(aes_counter));\n        aes_counter[15] = (UINT8)(counter >> 0);\n        aes_counter[14] = (UINT8)(counter >> 8);\n        aes_counter[13] = (UINT8)(counter >> 16);\n        aes_counter[12] = (UINT8)(counter >> 24);\n\n        RTMPAesEncrypt(&pContext->CK[0], &aes_counter[0], pContext->coefficient);\n    }\n    p = &(pContext->coefficient[ (coeff_position & 3) << 2 ]);\n    return GETBIG32(p);\n}\n\n/****************************************/\n/* aes128k128d()                        */\n/* Performs a 128 bit AES encrypt with  */\n/* 128 bit data.                        */\n/****************************************/\nVOID xor_128(\n    IN  PUCHAR  a,\n    IN  PUCHAR  b,\n    OUT PUCHAR  out)\n{\n    INT i;\n\n    for (i=0;i<16; i++)\n    {\n        out[i] = a[i] ^ b[i];\n    }\n}\n\nUCHAR RTMPCkipSbox(\n    IN  UCHAR   a)\n{\n    return SboxTable[(int)a];\n}\n\nVOID xor_32(\n    IN  PUCHAR  a,\n    IN  PUCHAR  b,\n    OUT PUCHAR  out)\n{\n    INT i;\n\n    for (i=0;i<4; i++)\n    {\n        out[i] = a[i] ^ b[i];\n    }\n}\n\nVOID next_key(\n    IN  PUCHAR  key,\n    IN  INT     round)\n{\n    UCHAR       rcon;\n    UCHAR       sbox_key[4];\n    UCHAR       rcon_table[12] =\n    {\n        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n        0x1b, 0x36, 0x36, 0x36\n    };\n\n    sbox_key[0] = RTMPCkipSbox(key[13]);\n    sbox_key[1] = RTMPCkipSbox(key[14]);\n    sbox_key[2] = RTMPCkipSbox(key[15]);\n    sbox_key[3] = RTMPCkipSbox(key[12]);\n\n    rcon = rcon_table[round];\n\n    xor_32(&key[0], sbox_key, &key[0]);\n    key[0] = key[0] ^ rcon;\n\n    xor_32(&key[4], &key[0], &key[4]);\n    xor_32(&key[8], &key[4], &key[8]);\n    xor_32(&key[12], &key[8], &key[12]);\n}\n\nVOID byte_sub(\n    IN  PUCHAR  in,\n    OUT PUCHAR  out)\n{\n    INT i;\n\n    for (i=0; i< 16; i++)\n    {\n        out[i] = RTMPCkipSbox(in[i]);\n    }\n}\n\nVOID shift_row(\n    IN  PUCHAR  in,\n    OUT PUCHAR  out)\n{\n    out[0] =  in[0];\n    out[1] =  in[5];\n    out[2] =  in[10];\n    out[3] =  in[15];\n    out[4] =  in[4];\n    out[5] =  in[9];\n    out[6] =  in[14];\n    out[7] =  in[3];\n    out[8] =  in[8];\n    out[9] =  in[13];\n    out[10] = in[2];\n    out[11] = in[7];\n    out[12] = in[12];\n    out[13] = in[1];\n    out[14] = in[6];\n    out[15] = in[11];\n}\n\nVOID mix_column(\n    IN  PUCHAR  in,\n    OUT PUCHAR  out)\n{\n    INT         i;\n    UCHAR       add1b[4];\n    UCHAR       add1bf7[4];\n    UCHAR       rotl[4];\n    UCHAR       swap_halfs[4];\n    UCHAR       andf7[4];\n    UCHAR       rotr[4];\n    UCHAR       temp[4];\n    UCHAR       tempb[4];\n\n    for (i=0 ; i<4; i++)\n    {\n        if ((in[i] & 0x80)== 0x80)\n            add1b[i] = 0x1b;\n        else\n            add1b[i] = 0x00;\n    }\n\n    swap_halfs[0] = in[2];    /* Swap halfs */\n    swap_halfs[1] = in[3];\n    swap_halfs[2] = in[0];\n    swap_halfs[3] = in[1];\n\n    rotl[0] = in[3];        /* Rotate left 8 bits */\n    rotl[1] = in[0];\n    rotl[2] = in[1];\n    rotl[3] = in[2];\n\n    andf7[0] = in[0] & 0x7f;\n    andf7[1] = in[1] & 0x7f;\n    andf7[2] = in[2] & 0x7f;\n    andf7[3] = in[3] & 0x7f;\n\n    for (i = 3; i>0; i--)    /* logical shift left 1 bit */\n    {\n        andf7[i] = andf7[i] << 1;\n        if ((andf7[i-1] & 0x80) == 0x80)\n        {\n            andf7[i] = (andf7[i] | 0x01);\n        }\n    }\n    andf7[0] = andf7[0] << 1;\n    andf7[0] = andf7[0] & 0xfe;\n\n    xor_32(add1b, andf7, add1bf7);\n\n    xor_32(in, add1bf7, rotr);\n\n    temp[0] = rotr[0];         /* Rotate right 8 bits */\n    rotr[0] = rotr[1];\n    rotr[1] = rotr[2];\n    rotr[2] = rotr[3];\n    rotr[3] = temp[0];\n\n    xor_32(add1bf7, rotr, temp);\n    xor_32(swap_halfs, rotl,tempb);\n    xor_32(temp, tempb, out);\n}\n\nVOID RTMPAesEncrypt(\n    IN  PUCHAR  key,\n    IN  PUCHAR  data,\n    IN  PUCHAR  ciphertext)\n{\n    INT             round;\n    INT             i;\n    UCHAR           intermediatea[16];\n    UCHAR           intermediateb[16];\n    UCHAR           round_key[16];\n\n    for(i=0; i<16; i++) round_key[i] = key[i];\n\n    for (round = 0; round < 11; round++)\n    {\n        if (round == 0)\n        {\n            xor_128(round_key, data, ciphertext);\n            next_key(round_key, round); \n        }\n        else if (round == 10)\n        {\n            byte_sub(ciphertext, intermediatea);\n            shift_row(intermediatea, intermediateb);\n            xor_128(intermediateb, round_key, ciphertext);\n        }\n        else    /* 1 - 9 */\n        {\n            byte_sub(ciphertext, intermediatea);\n            shift_row(intermediatea, intermediateb);\n            mix_column(&intermediateb[0], &intermediatea[0]);\n            mix_column(&intermediateb[4], &intermediatea[4]);\n            mix_column(&intermediateb[8], &intermediatea[8]);\n            mix_column(&intermediateb[12], &intermediatea[12]);\n            xor_128(intermediatea, round_key, ciphertext);\n            next_key(round_key, round);\n        }\n    }\n\n}\n\n/* calculate the mic */\nVOID RTMPMicFinal(\n    IN  PMIC_CONTEXT    pContext,\n    OUT UCHAR           digest[4])\n{\n    INT             byte_position;\n    ULONG           val;\n    ULONGLONG       sum, utmp;\n    LONGLONG        stmp;\n\n    /* deal with partial 32-bit word left over from last update */\n    if ( (byte_position = (pContext->position & 3)) != 0) {\n        /* have a partial word in part to deal with -- zero unused bytes */\n        do {\n            pContext->part[byte_position++] = 0;\n            pContext->position++;\n        } while (byte_position < 4);\n        val = GETBIG32(&pContext->part[0]);\n        MIC_ACCUM(val);\n    }\n\n    /* reduce the accumulated u64 to a 32-bit MIC */\n    sum = pContext->accum;\n    stmp = (sum  & 0xffffffffL) - ((sum >> 32)  * 15);\n    utmp = (stmp & 0xffffffffL) - ((stmp >> 32) * 15);\n    sum = utmp & 0xffffffffL;\n    if (utmp > 0x10000000fL)\n        sum -= 15;\n\n    val = (ULONG)sum;\n    digest[0] = (UCHAR)((val>>24) & 0xFF);\n    digest[1] = (UCHAR) ((val>>16) & 0xFF);\n    digest[2] = (UCHAR) ((val>>8) & 0xFF);\n    digest[3] = (UCHAR)((val>>0) & 0xFF);\n}\n\nVOID RTMPCkipInsertCMIC(\n    IN  PRTMP_ADAPTER   pAd,\n    OUT PUCHAR          pMIC,\n    IN  PUCHAR          p80211hdr,\n    IN  PNDIS_PACKET    pPacket,\n    IN  PCIPHER_KEY     pKey,\n    IN  PUCHAR          mic_snap)\n{\n\tPACKET_INFO\t\tPacketInfo;\n\tPUCHAR\t\t\tpSrcBufVA;\n\tULONG\t\t\tSrcBufLen;\n    PUCHAR          pDA, pSA, pProto;\n    UCHAR           bigethlen[2];\n\tUCHAR\t\t\tckip_ck[16];\n    MIC_CONTEXT     mic_ctx;\n    USHORT          payloadlen;\n\tUCHAR\t\t\ti;\n\n\tif (pKey == NULL)\n\t{\n\t\tDBGPRINT_ERR((\"RTMPCkipInsertCMIC, Before to form the CKIP key (CK), pKey can't be NULL\\n\"));\n\t\treturn;\n\t}\n\n    switch (*(p80211hdr+1) & 3)\n    {\n        case 0: /* FromDs=0, ToDs=0 */\n            pDA = p80211hdr+4;\n            pSA = p80211hdr+10;\n            break;\n        case 1: /* FromDs=0, ToDs=1 */\n            pDA = p80211hdr+16;\n            pSA = p80211hdr+10;\n            break;\n        case 2: /* FromDs=1, ToDs=0 */\n            pDA = p80211hdr+4;\n            pSA = p80211hdr+16;\n            break;\n        case 3: /* FromDs=1, ToDs=1 */\n            pDA = p80211hdr+16;\n            pSA = p80211hdr+24;\n            break;\n    }\n\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n\n    if (SrcBufLen < LENGTH_802_3)\n        return;\n\n    pProto = pSrcBufVA + 12;\n    payloadlen = PacketInfo.TotalPacketLength - LENGTH_802_3 + 18; /* CKIP_LLC(8)+CMIC(4)+TxSEQ(4)+PROTO(2)=18 */\n    \n    bigethlen[0] = (unsigned char)(payloadlen >> 8);\n    bigethlen[1] = (unsigned char)payloadlen;\n\n\t/* */\n\t/* Encryption Key expansion to form the CKIP Key (CKIP_CK). */\n\t/* */\n\tif (pKey->KeyLen < 16)\n\t{\n\t\tfor(i = 0; i < (16 / pKey->KeyLen); i++)\n\t\t{\n\t\t\tNdisMoveMemory(ckip_ck + i * pKey->KeyLen, \n\t\t\t\t\t\t\tpKey->Key, \n\t\t\t\t\t\t\tpKey->KeyLen);\t\t\t\n\t\t}\n\t\tNdisMoveMemory(ckip_ck + i * pKey->KeyLen,\n\t\t\t\t\t\tpKey->Key,\n\t\t\t\t\t\t16 - (i * pKey->KeyLen));\n\t}\n\telse\n\t{\n\t\tNdisMoveMemory(ckip_ck, pKey->Key, pKey->KeyLen);\n\t}\t\n    RTMPCkipMicInit(&mic_ctx, ckip_ck);\n    RTMPMicUpdate(&mic_ctx, pDA, MAC_ADDR_LEN);            /* MIC <-- DA */\n    RTMPMicUpdate(&mic_ctx, pSA, MAC_ADDR_LEN);            /* MIC <-- SA */\n    RTMPMicUpdate(&mic_ctx, bigethlen, 2);                 /* MIC <-- payload length starting from CKIP SNAP */\n    RTMPMicUpdate(&mic_ctx, mic_snap, 8);                  /* MIC <-- snap header */\n    RTMPMicUpdate(&mic_ctx, pAd->StaCfg.TxSEQ, 4);   /* MIC <-- TxSEQ */\n    RTMPMicUpdate(&mic_ctx, pProto, 2);                    /* MIC <-- Protocol */\n\n    pSrcBufVA += LENGTH_802_3;\n    SrcBufLen -= LENGTH_802_3;\n\n    /* Mic <-- original payload. loop until all payload processed */\n    do\n    {\n        if (SrcBufLen > 0)\n            RTMPMicUpdate(&mic_ctx, pSrcBufVA, SrcBufLen); \n\n\t\tNdisGetNextBuffer(PacketInfo.pFirstBuffer, &PacketInfo.pFirstBuffer);\n        if (PacketInfo.pFirstBuffer)\n        {\n            NDIS_QUERY_BUFFER(PacketInfo.pFirstBuffer, &pSrcBufVA, &SrcBufLen);\n        }\n        else\n            break;\n    } while (TRUE);\n    \n    RTMPMicFinal(&mic_ctx, pMIC);                          /* update MIC */\n}\n\n"
  },
  {
    "path": "src/sta/rtmp_data.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\trtmp_data.c\n\n\tAbstract:\n\tData path subroutines\n\n\tRevision History:\n\tWho \t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n*/\n#include \"rt_config.h\"\n\n\n\nVOID STARxEAPOLFrameIndicate(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tUCHAR *pTmpBuf;\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tif (pAd->StaCfg.WpaSupplicantUP) {\n\t\t/* All EAPoL frames have to pass to upper layer (ex. WPA_SUPPLICANT daemon) */\n\t\t/* TBD : process fragmented EAPol frames */\n\t\t{\n\t\t\t/* In 802.1x mode, if the received frame is EAP-SUCCESS packet, turn on the PortSecured variable */\n\t\t\tif ((pAd->StaCfg.IEEE8021X == TRUE) &&\n\t\t\t    (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&\n\t\t\t    (EAP_CODE_SUCCESS ==\n\t\t\t     WpaCheckEapCode(pAd, pRxBlk->pData,\n\t\t\t\t\t     pRxBlk->DataSize,\n\t\t\t\t\t     LENGTH_802_1_H))) {\n\t\t\t\tPUCHAR Key;\n\t\t\t\tUCHAR CipherAlg;\n\t\t\t\tint idx = 0;\n\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,\n\t\t\t\t\t     (\"Receive EAP-SUCCESS Packet\\n\"));\n\t\t\t\tSTA_PORT_SECURED(pAd);\n\n\t\t\t\tif (pAd->StaCfg.IEEE8021x_required_keys == FALSE) {\n\t\t\t\t\tidx = pAd->StaCfg.DesireSharedKeyId;\n\t\t\t\t\tCipherAlg = pAd->StaCfg.DesireSharedKey[idx].CipherAlg;\n\t\t\t\t\tKey = pAd->StaCfg.DesireSharedKey[idx].Key;\n\n\t\t\t\t\tif (pAd->StaCfg.DesireSharedKey[idx].KeyLen > 0) {\n\t\t\t\t\t\t/* Set key material and cipherAlg to Asic */\n\t\t\t\t\t\tRTMP_ASIC_SHARED_KEY_TABLE(pAd,\n\t\t\t\t\t\t\t\t\t   BSS0,\n\t\t\t\t\t\t\t\t\t   idx,\n\t\t\t\t\t\t\t\t\t   &pAd->StaCfg.DesireSharedKey[idx]);\n\n\t\t\t\t\t\t/* STA doesn't need to set WCID attribute for group key */\n\n\t\t\t\t\t\t/* Assign pairwise key info */\n\t\t\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd,\n\t\t\t\t\t\t\t\t       BSS0,\n\t\t\t\t\t\t\t\t       idx,\n\t\t\t\t\t\t\t\t       CipherAlg,\n\t\t\t\t\t\t\t\t       BSSID_WCID,\n\t\t\t\t\t\t\t\t       SHAREDKEYTABLE);\n\n\t\t\t\t\t\tRTMP_IndicateMediaState(pAd,\n\t\t\t\t\t\t\t\t\tNdisMediaStateConnected);\n\t\t\t\t\t\tpAd->ExtraInfo = GENERAL_LINK_UP;\n\n\t\t\t\t\t\t/* For Preventing ShardKey Table is cleared by remove key procedure. */\n\t\t\t\t\t\tpAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg;\n\t\t\t\t\t\tpAd->SharedKey[BSS0][idx].KeyLen =\n\t\t\t\t\t\t    pAd->StaCfg.DesireSharedKey[idx].KeyLen;\n\t\t\t\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][idx].Key,\n\t\t\t\t\t\t\t       pAd->StaCfg.DesireSharedKey[idx].Key,\n\t\t\t\t\t\t\t       pAd->StaCfg.DesireSharedKey[idx].KeyLen);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#ifdef WSC_STA_SUPPORT\n\t\t\telse {\n\t\t\t\t/* report EAP packets to MLME to check this packet is WPS packet or not */\n\t\t\t\tif (pAd->StaCfg.WscControl.WscState >= WSC_STATE_LINK_UP) {\n\t\t\t\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\t\t\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n#ifdef MT7601\n\t\t\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\t\t{\n\t\t\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t\t\t  pRxBlk->DataSize +LENGTH_802_11,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWISNR2,\n\t\t\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWISNR1,\n\t\t\t\t\t\t\t\t\t  OPMODE_STA);\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* MT7601 */\n\t\t\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t\t\t  pRxBlk->DataSize +LENGTH_802_11,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWIRSSI0,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWIRSSI1,\n\t\t\t\t\t\t\t\t\t  pRxWI->RxWIRSSI2,\n\t\t\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t\t\t  OPMODE_STA);\n\t\t\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,\n\t\t\t\t\t\t     (\"!!! report EAPOL DATA to MLME (len=%d) !!!\\n\",\n\t\t\t\t\t\t      pRxBlk->DataSize));\n\t\t\t\t}\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\n\t} else\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t{\n\t\t/*\n\t\t   Special DATA frame that has to pass to MLME\n\t\t   1. Cisco Aironet frames for CCX2. We need pass it to MLME for special process\n\t\t   2. EAPOL handshaking frames when driver supplicant enabled, pass to MLME for special process\n\t\t */\n\t\t{\n\t\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n#ifdef MT7601\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t{\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RxWISNR2,\n\t\t\t\t\t\t\t  0, 0,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  pRxWI->RxWISNR1,\n\t\t\t\t\t\t\t  OPMODE_STA);\n\t\t\t}\n\t\t\telse\n#endif /* MT7601 */\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RxWIRSSI0,\n\t\t\t\t\t\t\t  pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  OPMODE_STA);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,\n\t\t\t\t     (\"!!! report EAPOL DATA to MLME (len=%d) !!!\\n\",\n\t\t\t\t      pRxBlk->DataSize));\n\t\t}\n\t}\n\n\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);\n\treturn;\n\n}\n\n\nVOID STARxDataFrameAnnounce(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\n\t/* non-EAP frame */\n\tif (!RTMPCheckWPAframe\n\t    (pAd, pEntry, pRxBlk->pData, pRxBlk->DataSize, FromWhichBSSID)) {\n\t\t/* before LINK UP, all DATA frames are rejected */\n\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (TDLS_CheckTDLSframe(pAd, pRxBlk->pData, pRxBlk->DataSize)) {\n\t\t\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\t\t\tUCHAR *pTmpBuf;\n\n\t\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n#ifdef MT7601\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RxWISNR2,\n\t\t\t\t\t\t\t  0, 0,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  pRxWI->RxWISNR1,\n\t\t\t\t\t\t\t  OPMODE_STA);\n\t\t\telse\n#endif /* MT7601 */\n\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RxWIRSSI0,\n\t\t\t\t\t\t  pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2,\n\t\t\t\t\t\t  0,\n\t\t\t\t\t\t  0,\n\t\t\t\t\t\t  OPMODE_STA);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,\n\t\t\t\t     (\"!!! report TDLS Action DATA to MLME (len=%d) !!!\\n\",\n\t\t\t\t      pRxBlk->DataSize));\n\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t\t/* report to upper layer if the received frame is WAI frame */\n\t\tif (RTMPCheckWAIframe(pRxBlk->pData, pRxBlk->DataSize)) {\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\n#endif /* WAPI_SUPPORT */\n\n\t\t{\n\t\t\t/* drop all non-EAP DATA frame before */\n\t\t\t/* this client's Port-Access-Control is secured */\n\t\t\tif (pRxBlk->pHeader->FC.Wep) {\n\t\t\t\t/* unsupported cipher suite */\n\t\t\t\tif (pAd->StaCfg.WepStatus ==\n\t\t\t\t    Ndis802_11EncryptionDisabled) {\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t    pRxBlk->pRxPacket,\n\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* encryption in-use but receive a non-EAPOL clear text frame, drop it */\n\t\t\t\tif ((pAd->StaCfg.WepStatus !=\n\t\t\t\t     Ndis802_11EncryptionDisabled)\n\t\t\t\t    && (pAd->StaCfg.PortSecured ==\n\t\t\t\t\tWPA_802_1X_PORT_NOT_SECURED)) {\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t    pRxBlk->pRxPacket,\n\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP);\n\n\n\t\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK)) {\n\t\t\t/* Normal legacy, AMPDU or AMSDU */\n\t\t\tCmmRxnonRalinkFrameIndicate(pAd, pRxBlk,\n\t\t\t\t\t\t    FromWhichBSSID);\n\n\t\t} else {\n\t\t\t/* ARALINK */\n\t\t\tCmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk,\n\t\t\t\t\t\t FromWhichBSSID);\n\t\t}\n#ifdef QOS_DLS_SUPPORT\n\t\tRX_BLK_CLEAR_FLAG(pRxBlk, fRX_DLS);\n#endif /* QOS_DLS_SUPPORT */\n\t} else {\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_EAP);\n#ifdef DOT11_N_SUPPORT\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU)\n\t\t    && (pAd->CommonCfg.bDisableReordering == 0)) {\n\t\t\tIndicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t} else\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\t/* Determin the destination of the EAP frame */\n\t\t\t/*  to WPA state machine or upper layer */\n\t\t\tSTARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk,\n\t\t\t\t\t\tFromWhichBSSID);\n\t\t}\n\t}\n}\n\n\n#ifdef HDR_TRANS_SUPPORT \nVOID STARxDataFrameAnnounce_Hdr_Trns(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK *pRxBlk,\n\tIN UCHAR FromWhichBSSID)\n{\n\n\t/* non-EAP frame */\n\tif (!RTMPCheckWPAframe_Hdr_Trns\n\t    (pAd, pEntry, pRxBlk->pTransData, pRxBlk->TransDataSize, FromWhichBSSID)) {\n\t\t/* before LINK UP, all DATA frames are rejected */\n\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t// TODO: check!!!\n\t\tif (TDLS_CheckTDLSframe(pAd, pRxBlk->pData, pRxBlk->DataSize)) {\n\t\t\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\t\t\tUCHAR *pTmpBuf;\n\n\t\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n#ifdef MT7601\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RxWISNR2,\n\t\t\t\t\t\t\t  0, 0,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  pRxWI->RxWISNR1,\n\t\t\t\t\t\t\t  OPMODE_STA);\n#endif\n\t\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID,\n\t\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RxWIRSSI0,\n\t\t\t\t\t\t\t  pRxWI->RxWIRSSI1, pRxWI->RxWIRSSI2,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  0,\n\t\t\t\t\t\t\t  OPMODE_STA);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,\n\t\t\t\t     (\"!!! report TDLS Action DATA to MLME (len=%d) !!!\\n\",\n\t\t\t\t      pRxBlk->DataSize));\n\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t\t// TODO: Check!\n\t\t/* report to upper layer if the received frame is WAI frame */\n\t\tif (RTMPCheckWAIframe(pRxBlk->pData, pRxBlk->DataSize)) {\n\t\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t}\n#endif /* WAPI_SUPPORT */\n\n\t\t{\n\t\t\t/* drop all non-EAP DATA frame before */\n\t\t\t/* this client's Port-Access-Control is secured */\n\t\t\tif (pRxBlk->pHeader->FC.Wep) {\n\t\t\t\t/* unsupported cipher suite */\n\t\t\t\tif (pAd->StaCfg.WepStatus ==\n\t\t\t\t    Ndis802_11EncryptionDisabled) {\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t    pRxBlk->pRxPacket,\n\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* encryption in-use but receive a non-EAPOL clear text frame, drop it */\n\t\t\t\tif ((pAd->StaCfg.WepStatus !=\n\t\t\t\t     Ndis802_11EncryptionDisabled)\n\t\t\t\t    && (pAd->StaCfg.PortSecured ==\n\t\t\t\t\tWPA_802_1X_PORT_NOT_SECURED)) {\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t    pRxBlk->pRxPacket,\n\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP);\n\n\n\t\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK)) {\n\t\t\t/* Normal legacy, AMPDU or AMSDU */\n\t\t\tCmmRxnonRalinkFrameIndicate_Hdr_Trns(pAd, pRxBlk,\n\t\t\t\t\t\t    FromWhichBSSID);\n\n\t\t} else {\n\t\t\t/* ARALINK */\n\t\t\tCmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk,\n\t\t\t\t\t\t FromWhichBSSID);\n\t\t}\n#ifdef QOS_DLS_SUPPORT\n\t\tRX_BLK_CLEAR_FLAG(pRxBlk, fRX_DLS);\n#endif /* QOS_DLS_SUPPORT */\n\t} else {\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_EAP);\n#ifdef DOT11_N_SUPPORT\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU)\n\t\t    && (pAd->CommonCfg.bDisableReordering == 0)) {\n\t\t\tIndicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\t} else\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\t/* Determin the destination of the EAP frame */\n\t\t\t/*  to WPA state machine or upper layer */\n\t\t\tSTARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk,\n\t\t\t\t\t\tFromWhichBSSID);\n\t\t}\n\t}\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\n/* For TKIP frame, calculate the MIC value\t*/\nBOOLEAN STACheckTkipMICValue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MAC_TABLE_ENTRY *pEntry,\n\tIN RX_BLK * pRxBlk)\n{\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tUCHAR *pData = pRxBlk->pData;\n\tUSHORT DataSize = pRxBlk->DataSize;\n\tUCHAR UserPriority = pRxBlk->UserPriority;\n\tPCIPHER_KEY pWpaKey;\n\tUCHAR *pDA, *pSA;\n\n\tpWpaKey = &pAd->SharedKey[BSS0][pRxBlk->pRxWI->RxWIKeyIndex];\n\n\tpDA = pHeader->Addr1;\n\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_INFRA)) {\n\t\tpSA = pHeader->Addr3;\n\t} else {\n\t\tpSA = pHeader->Addr2;\n\t}\n\n\tif (RTMPTkipCompareMICValue(pAd,\n\t\t\t\t    pData,\n\t\t\t\t    pDA,\n\t\t\t\t    pSA,\n\t\t\t\t    pWpaKey->RxMic,\n\t\t\t\t    UserPriority, DataSize) == FALSE) {\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"Rx MIC Value error 2\\n\"));\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif (pAd->StaCfg.WpaSupplicantUP) {\n\t\t\tWpaSendMicFailureToWpaSupplicant(pAd->net_dev,\n\t\t\t\t\t\t\t (pWpaKey->Type ==\n\t\t\t\t\t\t\t  PAIRWISEKEY) ? TRUE :\n\t\t\t\t\t\t\t FALSE);\n\t\t} else\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\t{\n\t\t\tRTMPReportMicError(pAd, pWpaKey);\n\t\t}\n\n\t\t/* release packet */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,\n\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\n\n/*\n All Rx routines use RX_BLK structure to hande rx events\n It is very important to build pRxBlk attributes\n  1. pHeader pointer to 802.11 Header\n  2. pData pointer to payload including LLC (just skip Header)\n  3. set payload size including LLC to DataSize\n  4. set some flags with RX_BLK_SET_FLAG()\n*/\nVOID STAHandleRxDataFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tBOOLEAN bFragment = FALSE;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tUCHAR FromWhichBSSID = BSS0;\n\tUCHAR UserPriority = 0;\n\n//+++Add by shiang for debug\nif (0 /*!(pRxInfo->Mcast || pRxInfo->Bcast)*/){\n\tDBGPRINT(RT_DEBUG_OFF, (\"-->%s(%d): Dump Related Info!\\n\", __FUNCTION__, __LINE__));\n\tdump_rxinfo(pAd, pRxInfo);\n\thex_dump(\"DataFrameHeader\", (UCHAR *)pHeader, sizeof(HEADER_802_11));\n\thex_dump(\"DataFramePayload\", pRxBlk->pData , pRxBlk->DataSize);\n}\n//---Add by shiangf for debug\n\n\tif ((pHeader->FC.FrDs == 1) && (pHeader->FC.ToDs == 1)) {\n#ifdef CLIENT_WDS\n\t\t\tif ((pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)\n\t\t\t    && IS_ENTRY_CLIENT(&pAd->MacTab.Content[pRxWI->RxWIWirelessCliID])) {\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_WDS);\n\t\t} else\n#endif /* CLIENT_WDS */\n\t\t{\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\n\n#ifdef QOS_DLS_SUPPORT\n\t\tif (RTMPRcvFrameDLSCheck\n\t\t    (pAd, pHeader, pRxWI->RxWIMPDUByteCnt, pRxD)) {\n\t\t\treturn;\n\t\t}\n#endif /* QOS_DLS_SUPPORT */\n\n\t\t/* Drop not my BSS frames */\n\t\tif (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\tif (pRxInfo->MyBss == 0) {\n#ifdef P2P_SUPPORT\n\t\t\t/* When the p2p-IF up, the STA own address would be set as my_bssid address.\n\t\t\t   If receiving an \"encrypted\" broadcast packet(its WEP bit as 1) and doesn't match my BSSID, \n\t\t\t   Asic pass to driver with \"Decrypted\" marked as 0 in pRxInfo. \t\t\n\t\t\t   The condition is below,\n\t\t\t   1. p2p IF is ON,\n\t\t\t   2. the addr2 of the received packet is STA's BSSID,\n\t\t\t   3. broadcast packet,\n\t\t\t   4. from DS packet,\n\t\t\t   5. Asic pass this packet to driver with \"pRxInfo->Decrypted=0\"\n\t\t\t */\n\t\t\tif ((P2P_INF_ON(pAd)) && \n\t\t\t\t(MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pHeader->Addr2)) &&\n\t\t\t\t(pRxInfo->Bcast || pRxInfo->Mcast) && \n\t\t\t\t(pHeader->FC.FrDs == 1) &&\n\t\t\t\t(pHeader->FC.ToDs == 0) &&\n\t\t\t\t(pRxInfo->Decrypted == 0))\n\t\t\t{\n\t\t\t\t/* set this m-cast frame is my-bss. */\n\t\t\t\tpRxInfo->MyBss = 1;\n\t\t\t}\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\t{\n\t\t\t\t/* release packet */\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n#ifdef RT3290\n\t\t// TODO: shiang, find out what's this??\n\t\tif (pRxInfo->MyBss)\n\t\t{\n\t\t\t// TODO: shiang, I makr this line due to I still didn't know what's this yet\n\t\t\t//pAd->Rssi[pAd->WlanFunCtrl.field.INV_TR_SW0] = pAd->StaCfg.RssiSample.AvgRssi0;\n\t\t}\n#endif /* RT3290 */\n\n\t\tpAd->RalinkCounters.RxCountSinceLastNULL++;\n#ifdef UAPSD_SUPPORT\n\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable\n\t\t    && pAd->CommonCfg.APEdcaParm.bAPSDCapable\n\t\t    && (pHeader->FC.SubType & 0x08))\n\t\t{\n\t\t\tUCHAR *pData;\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"bAPSDCapable\\n\"));\n\n\t\t\t/* Qos bit 4 */\n\t\t\tpData = (PUCHAR) pHeader + LENGTH_802_11;\n\t\t\tif ((*pData >> 4) & 0x01)\n\t\t\t{\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t/* ccv EOSP frame so the peer can sleep */\n\t\t\t\tif (pEntry != NULL)\n\t\t\t\t{\n\t\t\t\t\tRTMP_PS_VIRTUAL_SLEEP(pEntry);\n\t\t\t\t}\n\n\t\t\t\tif (pAd->StaCfg.FlgPsmCanNotSleep == TRUE)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> Rcv EOSP frame but we can not sleep!\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n#endif /* DOT11Z_TDLS_SUPPORT */\n \t\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,\n\t\t\t\t\t (\"RxDone- Rcv EOSP frame, driver may fall into sleep\\n\"));\n\t\t\t\tpAd->CommonCfg.bInServicePeriod = FALSE;\n\n\t\t\t\t/* Force driver to fall into sleep mode when rcv EOSP frame */\n\t\t\t\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n\t\t\t\t\t{\n\n#ifdef RTMP_MAC_USB\n\t\t\t\t\tRTEnqueueInternalCmd(pAd,\n\t\t\t\t\t\t\t     CMDTHREAD_FORCE_SLEEP_AUTO_WAKEUP,\n\t\t\t\t\t\t\t     NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\n\t\t\tif ((pHeader->FC.MoreData)\n\t\t\t    && (pAd->CommonCfg.bInServicePeriod)) {\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"Sending another trigger frame when More Data bit is set to 1\\n\"));\n\t\t\t}\n\t\t}\n#endif /* UAPSD_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t/* 1: PWR_SAVE, 0: PWR_ACTIVE */\n\t\tif (pEntry != NULL)\n\t\t{\n\t\t\tUCHAR OldPwrMgmt;\n\t\t\tFRAME_CONTROL *pFmeCtrl = &pHeader->FC;\n\n\t\t\tOldPwrMgmt = RtmpPsIndicate(pAd, pHeader->Addr2,\n\t\t\t\t\t\t\t\t\tpRxWI->RxWIWirelessCliID, pFmeCtrl->PwrMgmt);\n\n#ifdef UAPSD_SUPPORT\n\t\t\tRTMP_PS_VIRTUAL_TIMEOUT_RESET(pEntry);\n\n\t\t\tif (pFmeCtrl->PwrMgmt)\n\t\t\t{\n\t\t\t\tif ((CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_APSD_CAPABLE)) &&\n\t\t\t\t\t(pFmeCtrl->SubType & 0x08))\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\tIn IEEE802.11e, 11.2.1.4 Power management with APSD,\n\t\t\t\t\t\tIf there is no unscheduled SP in progress, the unscheduled SP begins\n\t\t\t\t\t\twhen the QAP receives a trigger frame from a non-AP QSTA, which is a\n\t\t\t\t\t\tQoS data or QoS Null frame associated with an AC the STA has\n\t\t\t\t\t\tconfigured to be trigger-enabled.\n\t\t\t\t\t*/\n\t\t\t\t\t/*\n\t\t\t\t\t\tIn WMM v1.1, A QoS Data or QoS Null frame that indicates transition\n\t\t\t\t\t\tto/from Power Save Mode is not considered to be a Trigger Frame and\n\t\t\t\t\t\tthe AP shall not respond with a QoS Null frame.\n\t\t\t\t\t*/\n\t\t\t\t\t/* Trigger frame must be QoS data or QoS Null frame */\n\t\t\t\t\tUCHAR  OldUP;\n\n\t\t\t\t\tif ((*(pRxBlk->pData+LENGTH_802_11) & 0x10) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* this is not a EOSP frame */\n\t\t\t\t\t\tOldUP = (*(pRxBlk->pData+LENGTH_802_11) & 0x07);\n\t\t\t\t\t\tif (OldPwrMgmt == PWR_SAVE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//hex_dump(\"trigger frame\", pRxBlk->pData, 26);\n\t\t\t\t\t\t\tUAPSD_TriggerFrameHandle(pAd, pEntry, OldUP);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t\t(\"This is a EOSP frame, not a trigger frame!\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif /* UAPSD_SUPPORT */\n\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\t/* Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame */\n\t\tif ((pHeader->FC.SubType & 0x04)) {\t/* bit 2 : no DATA */\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\t\t/* Infrastructure mode, check address 2 for BSSID */\n\t\t\tif (1\n#ifdef QOS_DLS_SUPPORT\n\t\t\t    && (!pAd->CommonCfg.bDLSCapable)\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t    && (!IS_TDLS_SUPPORT(pAd))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t    ) {\n\t\t\t\tif (!RTMPEqualMemory(&pHeader->Addr2, &pAd->MlmeAux.Bssid, 6))\n\t\t\t\t{\n\t\t\t\t\t/* Receive frame not my BSSID */\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\t/* Ad-Hoc mode or Not associated */\n\n\t\t\t/* Ad-Hoc mode, check address 3 for BSSID */\n\t\t\tif (!RTMPEqualMemory(&pHeader->Addr3, &pAd->CommonCfg.Bssid, 6)) {\n\t\t\t\t/* Receive frame not my BSSID */\n\t\t\t\t/* release packet */\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t/*/ find pEntry */\n\t\tif (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE) {\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\t} else {\n\t\t\t/* IOT issue with Marvell test bed AP\n\t\t\t    Marvell AP ResetToOOB and do wps. \n\t\t\t    Because of AP send EAP Request too fast and without retransmit.\n\t\t\t    STA not yet add BSSID to WCID search table.\n\t\t\t    So, the EAP Request is dropped.\n\t\t\t    The patch lookup pEntry from MacTable.\n\t\t\t*/\n\t\t\tpEntry = MacTableLookup(pAd, &pHeader->Addr2);\n\t\t\tif ( pEntry == NULL )\n\t\t\t{\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t/* infra or ad-hoc */\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_INFRA);\n#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT)\n\t\t\tif ((pHeader->FC.FrDs == 0) && (pHeader->FC.ToDs == 0))\n\t\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_DLS);\n\t\t\telse\n#endif\n\t\t\t\tASSERT(pRxWI->RxWIWirelessCliID == BSSID_WCID);\n\t\t}\n\n\t\t/* check Atheros Client */\n\t\tif ((pEntry->bIAmBadAtheros == FALSE) && (pRxInfo->AMPDU == 1)\n\t\t    && (pHeader->FC.Retry)) {\n\t\t\tpEntry->bIAmBadAtheros = TRUE;\n\t\t\tpAd->CommonCfg.IOTestParm.bCurrentAtheros = TRUE;\n\t\t\tpAd->CommonCfg.IOTestParm.bLastAtheros = TRUE;\n\t\t\tif (!STA_AES_ON(pAd))\n\t\t\t\tRTMP_UPDATE_PROTECT(pAd, 8 , ALLN_SETPROTECT, TRUE, FALSE);\n\t\t}\n\t}\n\n#ifdef RTMP_MAC_USB\n#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT)\n\tif (RTMP_TEST_MORE_FLAG(pAd, fASIC_CAP_CSO))\n\t{\n#ifdef RLT_MAC\n\t\tRXFCE_INFO *pRxFceInfo = pRxBlk->pRxFceInfo;\n\n\t\t//if ( pRxFceInfo->l3l4_done )\n\t\t{\n\n\n\t\t\tif (  (pRxFceInfo->tcp_err) || (pRxFceInfo->udp_err) ) {\n\t\t\t\tRTMP_SET_TCP_CHKSUM_FAIL(pRxPacket, TRUE);\n\t\t\t}\n\n\t\t}\n\t\t\n#endif /* RLT_MAC */\n\n#ifdef RTMP_MAC\n\t\tif (pRxInfo->tcp_sum_err)\n\t\t\tRTMP_SET_TCP_CHKSUM_FAIL(pRxPacket, TRUE);\n#endif /* RTMP_MAC */\n\n\t}\n#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_RX_CSO_SUPPORT) */\n#endif /* RTMP_MAC_USB */\n\n\tpRxBlk->pData = (UCHAR *) pHeader;\n\n\t/*\n\t   update RxBlk->pData, DataSize\n\t   802.11 Header, QOS, HTC, Hw Padding\n\t */\n\t/* 1. skip 802.11 HEADER */\n#ifdef CLIENT_WDS\n\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) {\n\t\tpRxBlk->pData += LENGTH_802_11_WITH_ADDR4;\n\t\tpRxBlk->DataSize -= LENGTH_802_11_WITH_ADDR4;\n\t} else\n#endif /* CLIENT_WDS */\n\t{\n\t\tpRxBlk->pData += LENGTH_802_11;\n\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\t}\n\n\t/* 2. QOS */\n\tif (pHeader->FC.SubType & 0x08) {\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_QOS);\n\t\tUserPriority = *(pRxBlk->pData) & 0x0f;\n\t\t/* bit 7 in QoS Control field signals the HT A-MSDU format */\n\t\tif ((*pRxBlk->pData) & 0x80) {\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU);\n\t\t}\n\n\t\t/* skip QOS contorl field */\n\t\tpRxBlk->pData += 2;\n\t\tpRxBlk->DataSize -= 2;\n\t}\n\tpRxBlk->UserPriority = UserPriority;\n\n\t/* check if need to resend PS Poll when received packet with MoreData = 1 */\n#ifdef DOT11Z_TDLS_SUPPORT\n\tif (pRxD->U2M)\n\t{\n\t\t/* only for unicast packet */\n\t\t/* for TDLS power save, More Data bit is not used */\n\t\tif (((pEntry != NULL) && (!IS_ENTRY_TDLS(pEntry))) ||\n\t\t\t(pEntry == NULL))\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t{\n\t\t\tif ((RtmpPktPmBitCheck(pAd) == TRUE) && (pHeader->FC.MoreData == 1)) {\n\t\t\t\tif ((((UserPriority == 0) || (UserPriority == 3)) && pAd->CommonCfg.bAPSDAC_BE == 0) ||\n\t\t    \t\t\t(((UserPriority == 1) || (UserPriority == 2)) && pAd->CommonCfg.bAPSDAC_BK == 0) ||\n\t\t\t\t\t(((UserPriority == 4) || (UserPriority == 5)) && pAd->CommonCfg.bAPSDAC_VI == 0) ||\n\t\t\t\t\t(((UserPriority == 6) || (UserPriority == 7)) && pAd->CommonCfg.bAPSDAC_VO == 0)) {\n\t\t\t/* non-UAPSD delivery-enabled AC */\n\t\t\tRTMP_PS_POLL_ENQUEUE(pAd);\n\t\t}\n\t}\n\t\t}\n#ifdef DOT11Z_TDLS_SUPPORT\n\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t/* 3. Order bit: A-Ralink or HTC+ */\n\tif (pHeader->FC.Order) {\n#ifdef AGGREGATION_SUPPORT\n\t\tif ((pRxWI->RxWIPhyMode <= MODE_OFDM)\n\t\t    && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)))\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);\n\t\t} else\n#endif /* AGGREGATION_SUPPORT */\n\t\t{\n#ifdef DOT11_N_SUPPORT\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_HTC);\n\t\t\t/* skip HTC contorl field */\n\t\t\tpRxBlk->pData += 4;\n\t\t\tpRxBlk->DataSize -= 4;\n#endif /* DOT11_N_SUPPORT */\n\t\t}\n\t}\n\n\t/* 4. skip HW padding */\n\tif (pRxInfo->L2PAD) {\n\t\t/* just move pData pointer */\n\t\t/* because DataSize excluding HW padding */\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_PAD);\n\t\tpRxBlk->pData += 2;\n\t}\n#ifdef DOT11_N_SUPPORT\n\tif (pRxInfo->BA) {\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n#if defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT)\n\t/* Use software to decrypt the encrypted frame if necessary.\n\t   If a received \"encrypted\" unicast packet(its WEP bit as 1) \n\t   and it's passed to driver with \"Decrypted\" marked as 0 in pRxInfo. */\n\tif ((pHeader->FC.Wep == 1) && (pRxInfo->Decrypted == 0)) {\n\t\tPCIPHER_KEY pSwKey = NULL;\n\n\t\t/* Cipher key table selection */\n\t\tif ((pSwKey = RTMPSwCipherKeySelection(pAd,\n\t\t\t\t\t\t       pRxBlk->pData, pRxBlk,\n\t\t\t\t\t\t       pEntry)) == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"No vaild cipher key for SW decryption!!!\\n\"));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\t/* Decryption by Software */\n\t\tif (RTMPSoftDecryptionAction(pAd,\n\t\t\t\t\t     (PUCHAR) pHeader,\n\t\t\t\t\t     UserPriority,\n\t\t\t\t\t     pSwKey,\n\t\t\t\t\t     pRxBlk->pData,\n\t\t\t\t\t     &(pRxBlk->DataSize)) !=\n\t\t    NDIS_STATUS_SUCCESS) {\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t\t/* Record the Decrypted bit as 1 */\n\t\tpRxInfo->Decrypted = 1;\n\t}\n#endif /* SOFT_ENCRYPT || ADHOC_WPA2PSK_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tif (pAd->StaCfg.TdlsInfo.TdlsAutoLink)\n\t{\n\t\tif (!RX_BLK_TEST_FLAG(pRxBlk, fRX_DLS))\n\t\t{\n\t\t\tTDLS_AutoSetupByRcvFrame(pAd, pHeader);\n\t\t}\n\t}\n#endif /* TDLS_AUTOLINK_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n\t/* Case I  Process Broadcast & Multicast data frame */\n\tif (pRxInfo->Bcast || pRxInfo->Mcast) {\n#ifdef STATS_COUNT_SUPPORT\n\t\tINC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount);\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\t/* Drop Mcast/Bcast frame with fragment bit on */\n\t\tif (pHeader->FC.MoreFrag) {\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\t/* Filter out Bcast frame which AP relayed for us */\n\t\tif (pHeader->FC.FrDs\n\t\t    && MAC_ADDR_EQUAL(pHeader->Addr3, pAd->CurrentAddress)) {\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\tif (ADHOC_ON(pAd)) {\n\t\t\tMAC_TABLE_ENTRY *pAdhocEntry = NULL;\n\t\t\tpAdhocEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\tif (pAdhocEntry)\n\t\t\t\tUpdate_Rssi_Sample(pAd, &pAdhocEntry->RssiSample, pRxWI);\n\t\t}\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef WFD_SUPPORT\n\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\tpRxD->Bcast &&\n\t\t\tTDLS_CheckTDLSframe(pAd, pRxBlk->pData, pRxBlk->DataSize)) {\n\t\t\tPRXWI_STRUC pRxWI = pRxBlk->pRxWI;\n\t\t\tUCHAR *pTmpBuf;\n\n\t\t\tpTmpBuf = pRxBlk->pData - LENGTH_802_11;\n\t\t\tNdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);\n\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID,\n\t\t\t\t\t\t  pTmpBuf,\n\t\t\t\t\t\t  pRxBlk->DataSize +\n\t\t\t\t\t\t  LENGTH_802_11, pRxWI->RSSI0,\n\t\t\t\t\t\t  pRxWI->RSSI1, pRxWI->RSSI2,\n\t\t\t\t\t\t  0,\n\t\t\t\t\t\t  OPMODE_STA);\n\t\t\tDBGPRINT_RAW(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"!!! report TDLS Action DATA to MLME (len=%d) !!!\\n\",\n\t\t\t\t\t  pRxBlk->DataSize));\n\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,\n\t\t\t\t\t\tNDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n#endif /* WFD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t{\n\t\t\tULONG   Now;\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpAd->StaCfg.LastBeaconRxTime = Now;\n\t\t}\n\n\n\n\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n\telse if (pRxInfo->U2M)\n\t{\n\t\tpAd->LastRxRate = (UINT32)((pRxWI->RxWIMCS) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWIBW << 7) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWISGI << 8) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWISTBC << 9) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWIPhyMode << 14));\n\n#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT)\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_DLS)) {\n\t\t\tMAC_TABLE_ENTRY *pDlsEntry = NULL;\n\n\t\t\tpDlsEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\t\t\tif (pDlsEntry && (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)) {\n\t\t\t\tUpdate_Rssi_Sample(pAd, &pDlsEntry->RssiSample, pRxWI);\n\t\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t\t\t\tpDlsEntry->NoDataIdleCount = 0;\n\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\t\t\t}\n\t\t} else\n#endif\n\n\t\tif (INFRA_ON(pAd)) {\n\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\tif (pEntry)\n\t\t\t\tUpdate_Rssi_Sample(pAd,\n\t\t\t\t\t\t   &pEntry->RssiSample,\n\t\t\t\t\t\t   pRxWI);\n\t\t}else\n\t\t\n\t\tif (ADHOC_ON(pAd)) {\n\t\t\tMAC_TABLE_ENTRY *pAdhocEntry = NULL;\n\t\t\tpAdhocEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\tif (pAdhocEntry)\n\t\t\t\tUpdate_Rssi_Sample(pAd,\n\t\t\t\t\t\t   &pAdhocEntry->RssiSample,\n\t\t\t\t\t\t   pRxWI);\n\t\t}\n\n\t\tUpdate_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);\n\n\t\tpAd->StaCfg.LastSNR0 = (UCHAR) (pRxWI->RxWISNR0);\n\t\tpAd->StaCfg.LastSNR1 = (UCHAR) (pRxWI->RxWISNR1);\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\tif (pAd->CommonCfg.RxStream == 3)\n\t\t\tpAd->StaCfg.LastSNR2 = (UCHAR) (pRxWI->RxWISNR2);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\tpAd->RalinkCounters.OneSecRxOkDataCnt++;\n\t\t{\n\t\t\tULONG   Now;\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\tpAd->StaCfg.LastBeaconRxTime = Now;\n\t\t}\n\n\n\t\tif (pEntry != NULL)\n\t\t{\n\t\t\tpEntry->LastRxRate = pAd->LastRxRate;\n#ifdef TXBF_SUPPORT\n\t\t\tif (pRxWI->ShortGI)\n\t\t\t\tpEntry->OneSecRxSGICount++;\n\t\t\telse\n\t\t\t\tpEntry->OneSecRxLGICount++;\n#endif /* TXBF_SUPPORT */\n\n\t\t\tpEntry->freqOffset = (CHAR)(pRxWI->RxWIFOFFSET);\n\t\t\tpEntry->freqOffsetValid = TRUE;\n\n\t\t}\n\n#ifdef PRE_ANT_SWITCH\n#endif /* PRE_ANT_SWITCH */\n\n#ifdef RTMP_MAC_USB\n\t\t/* there's packet sent to me, keep awake for 1200ms */\n\t\tif (pAd->CountDowntoPsm < 12)\n\t\t\tpAd->CountDowntoPsm = 12;\n#endif /* RTMP_MAC_USB */\n\n\t\tif (!((pHeader->Frag == 0) && (pHeader->FC.MoreFrag == 0))) {\n\t\t\t/* re-assemble the fragmented packets */\n\t\t\t/* return complete frame (pRxPacket) or NULL */\n\t\t\tbFragment = TRUE;\n\t\t\tpRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk);\n\t\t}\n\n\t\tif (pRxPacket) {\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\t\t/* process complete frame */\n\t\t\tif (bFragment && (pRxInfo->Decrypted)\n\t\t\t    && (pEntry->WepStatus == Ndis802_11Encryption2Enabled)) {\n\t\t\t\t/* Minus MIC length */\n\t\t\t\tpRxBlk->DataSize -= 8;\n\n\t\t\t\t/* For TKIP frame, calculate the MIC value */\n\t\t\t\tif (STACheckTkipMICValue(pAd, pEntry, pRxBlk) == FALSE) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSTARxDataFrameAnnounce(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t} else {\n\t\t\t/*\n\t\t\t   just return because RTMPDeFragmentDataFrame() will release rx packet, \n\t\t\t   if packet is fragmented\n\t\t\t */\n\t\t\treturn;\n\t\t}\n\t}\n#ifdef XLINK_SUPPORT\n\telse if (pAd->StaCfg.PSPXlink) {\n\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n#endif /* XLINK_SUPPORT */\n\n\tASSERT(0);\n\t/* release packet */\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID STAHandleRxDataFrame_Hdr_Trns(\n\tIN PRTMP_ADAPTER pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n#ifdef RLT_MAC\n\tRXFCE_INFO *pRxFceInfo = pRxBlk->pRxFceInfo;\n#endif /* RLT_MAC */\n\tRXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo;\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tBOOLEAN bFragment = FALSE;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tUCHAR FromWhichBSSID = BSS0;\n\tUCHAR UserPriority = 0;\n\tUCHAR *pData;\n\n//+++Add by shiang for debug\nif (0 /*!(pRxInfo->Mcast || pRxInfo->Bcast)*/){\n\tDBGPRINT(RT_DEBUG_OFF, (\"-->%s(%d): Dump Related Info!\\n\", __FUNCTION__, __LINE__));\n\t//dumpRxInfo(pAd, pRxInfo);\n\thex_dump(\"DataFrameHeader\", pHeader, 36);\n\thex_dump(\"DataFramePayload\", pRxBlk->pTransData , pRxBlk->TransDataSize);\n}\n//---Add by shiangf for debug\n\n\tif ((pHeader->FC.FrDs == 1) && (pHeader->FC.ToDs == 1)) {\n#ifdef CLIENT_WDS\n\t\t\tif ((pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)\n\t\t\t    && IS_ENTRY_CLIENT(&pAd->MacTab.Content[pRxWI->RxWIWirelessCliID])) {\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_WDS);\n\t\t} else\n#endif /* CLIENT_WDS */\n\t\t{\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\n\n#ifdef QOS_DLS_SUPPORT\n\t\tif (RTMPRcvFrameDLSCheck\n\t\t    (pAd, pHeader, pRxWI->RxWIMPDUByteCnt, pRxD)) {\n\t\t\treturn;\n\t\t}\n#endif /* QOS_DLS_SUPPORT */\n\n\t\t/* Drop not my BSS frames */\n\t\tif (pRxInfo->MyBss == 0) {\n#ifdef P2P_SUPPORT\n\t\t\t/* When the p2p-IF up, the STA own address would be set as my_bssid address.\n\t\t\t   If receiving an \"encrypted\" broadcast packet(its WEP bit as 1) and doesn't match my BSSID, \n\t\t\t   Asic pass to driver with \"Decrypted\" marked as 0 in pRxInfo. \t\t\n\t\t\t   The condition is below,\n\t\t\t   1. p2p IF is ON,\n\t\t\t   2. the addr2 of the received packet is STA's BSSID,\n\t\t\t   3. broadcast packet,\n\t\t\t   4. from DS packet,\n\t\t\t   5. Asic pass this packet to driver with \"pRxInfo->Decrypted=0\"\n\t\t\t */\n\t\t\tif ((P2P_INF_ON(pAd)) && \n\t\t\t\t(MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pHeader->Addr2)) &&\n\t\t\t\t(pRxInfo->Bcast || pRxInfo->Mcast) && \n\t\t\t\t(pHeader->FC.FrDs == 1) &&\n\t\t\t\t(pHeader->FC.ToDs == 0) &&\n\t\t\t\t(pRxInfo->Decrypted == 0))\n\t\t\t{\n\t\t\t\t/* set this m-cast frame is my-bss. */\n\t\t\t\tpRxInfo->MyBss = 1;\n\t\t\t}\n\t\t\telse\n#endif /* P2P_SUPPORT */\n\t\t\t{\n\t\t\t\t/* release packet */\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n#ifdef RT3290\n\t\t// TODO: shiang, find out what's this??\n\t\tif (pRxInfo->MyBss)\n\t\t{\n\t\t\t// TODO: shiang, I makr this line due to I still didn't know what's this yet\n\t\t\t//pAd->Rssi[pAd->WlanFunCtrl.field.INV_TR_SW0] = pAd->StaCfg.RssiSample.AvgRssi0;\n\t\t}\n#endif /* RT3290 */\n\n\t\tpAd->RalinkCounters.RxCountSinceLastNULL++;\n\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable\n\t\t    && pAd->CommonCfg.APEdcaParm.bAPSDCapable\n\t\t    && (pHeader->FC.SubType & 0x08)) {\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"bAPSDCapable\\n\"));\n\n\t\t\t/* Qos bit 4 */\n\t\t\tpData = (PUCHAR) pHeader + LENGTH_802_11;\n\t\t\tif ((*pData >> 4) & 0x01) {\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,\n\t\t\t\t\t (\"RxDone- Rcv EOSP frame, driver may fall into sleep\\n\"));\n\t\t\t\tpAd->CommonCfg.bInServicePeriod = FALSE;\n\n\t\t\t\t/* Force driver to fall into sleep mode when rcv EOSP frame */\n\t\t\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {\n\n#ifdef RTMP_MAC_USB\n\t\t\t\t\tRTEnqueueInternalCmd(pAd,\n\t\t\t\t\t\t\t     CMDTHREAD_FORCE_SLEEP_AUTO_WAKEUP,\n\t\t\t\t\t\t\t     NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((pHeader->FC.MoreData)\n\t\t\t    && (pAd->CommonCfg.bInServicePeriod)) {\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"Sending another trigger frame when More Data bit is set to 1\\n\"));\n\t\t\t}\n\t\t}\n\n\t\t/* Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame */\n\t\tif ((pHeader->FC.SubType & 0x04)) {\t/* bit 2 : no DATA */\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\t\t/* Infrastructure mode, check address 2 for BSSID */\n\t\t\tif (1\n#ifdef QOS_DLS_SUPPORT\n\t\t\t    && (!pAd->CommonCfg.bDLSCapable)\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t    && (!pAd->StaCfg.bTDLSCapable)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t    ) {\n\t\t\t\tif (!RTMPEqualMemory\n\t\t\t\t    (&pHeader->Addr2, &pAd->MlmeAux.Bssid, 6)) {\n\t\t\t\t\t/* Receive frame not my BSSID */\n\t\t\t\t\t/* release packet */\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\t/* Ad-Hoc mode or Not associated */\n\n\t\t\t/* Ad-Hoc mode, check address 3 for BSSID */\n\t\t\tif (!RTMPEqualMemory(&pHeader->Addr3, &pAd->CommonCfg.Bssid, 6)) {\n\t\t\t\t/* Receive frame not my BSSID */\n\t\t\t\t/* release packet */\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t/*/ find pEntry */\n\t\tif (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE) {\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\t} else {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\t/* infra or ad-hoc */\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_INFRA);\n#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT)\n\t\t\tif ((pHeader->FC.FrDs == 0) && (pHeader->FC.ToDs == 0))\n\t\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_DLS);\n\t\t\telse\n#endif\n\t\t\t\tASSERT(pRxWI->RxWIWirelessCliID == BSSID_WCID);\n\t\t}\n\n\t\t/* check Atheros Client */\n\t\tif ((pEntry->bIAmBadAtheros == FALSE) && (pRxInfo->AMPDU == 1)\n\t\t    && (pHeader->FC.Retry)) {\n\t\t\tpEntry->bIAmBadAtheros = TRUE;\n\t\t\tpAd->CommonCfg.IOTestParm.bCurrentAtheros = TRUE;\n\t\t\tpAd->CommonCfg.IOTestParm.bLastAtheros = TRUE;\n\t\t\tif (!STA_AES_ON(pAd))\n\t\t\t\tRTMP_UPDATE_PROTECT(pAd, 8 , ALLN_SETPROTECT, TRUE, FALSE);\n\t\t}\n\t}\n\n#ifdef RTMP_MAC_USB\n#endif /* RTMP_MAC_USB */\n\n\n#ifdef CONFIG_RX_CSO_SUPPORT\n\tif (RTMP_TEST_MORE_FLAG(pAd, fASIC_CAP_CSO))\n\t{\n\t\tif ( pRxFceInfo->l3l4_done )\n\t\t{\n\n\n/*\n\t\t\tif ( (pRxFceInfo->ip_err) || (pRxFceInfo->tcp_err)\n\t\t\t\t|| (pRxFceInfo->udp_err) ) {\n\t\t\t\tRTMP_SET_TCP_CHKSUM_FAIL(pRxPacket, TRUE);\n\t\t\t}\n*/\n\t\t\t// Linux always do IP header chksum\n\t\t\tif (  (pRxFceInfo->tcp_err) || (pRxFceInfo->udp_err) ) {\n\t\t\t\tRTMP_SET_TCP_CHKSUM_FAIL(pRxPacket, TRUE);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_RX_CSO_SUPPORT */\n\n\tpData = (UCHAR *) pHeader;\n\n\t/*\n\t   update RxBlk->pData, DataSize\n\t   802.11 Header, QOS, HTC, Hw Padding\n\t */\n\t/* 1. skip 802.11 HEADER */\n#ifdef CLIENT_WDS\n\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) {\n\t\tpData += LENGTH_802_11_WITH_ADDR4;\n\t} else\n#endif /* CLIENT_WDS */\n\t{\n\t\tpData += LENGTH_802_11;\n\t}\n\n\t/* 2. QOS */\n\tif (pHeader->FC.SubType & 0x08) {\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_QOS);\n\t\tUserPriority = *(pData) & 0x0f;\n\t\t/* bit 7 in QoS Control field signals the HT A-MSDU format */\n\t\tif ((*pData) & 0x80) {\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU);\n\t\t}\n\n\t\t/* skip QOS contorl field */\n\t\tpData += 2;\n\t}\n\tpRxBlk->UserPriority = UserPriority;\n\n\t/* check if need to resend PS Poll when received packet with MoreData = 1 */\n\tif ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1)) {\n\t\tif ((((UserPriority == 0) || (UserPriority == 3)) &&\n\t\t     pAd->CommonCfg.bAPSDAC_BE == 0) ||\n\t\t    (((UserPriority == 1) || (UserPriority == 2)) &&\n\t\t     pAd->CommonCfg.bAPSDAC_BK == 0) ||\n\t\t    (((UserPriority == 4) || (UserPriority == 5)) &&\n\t\t     pAd->CommonCfg.bAPSDAC_VI == 0) ||\n\t\t    (((UserPriority == 6) || (UserPriority == 7)) &&\n\t\t     pAd->CommonCfg.bAPSDAC_VO == 0)) {\n\t\t\t/* non-UAPSD delivery-enabled AC */\n\t\t\tRTMP_PS_POLL_ENQUEUE(pAd);\n\t\t}\n\t}\n\n\t/* 3. Order bit: A-Ralink or HTC+ */\n\tif (pHeader->FC.Order) {\n#ifdef AGGREGATION_SUPPORT\n\t\tif ((pRxWI->RxWIPhyMode <= MODE_OFDM)\n\t\t    && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)))\n\t\t{\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);\n\t\t} else\n#endif /* AGGREGATION_SUPPORT */\n\t\t{\n#ifdef DOT11_N_SUPPORT\n\t\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_HTC);\n\t\t\t/* skip HTC contorl field */\n\t\t\tpData += 4;\n#endif /* DOT11_N_SUPPORT */\n\t\t}\n\t}\n\n\t/* 4. skip HW padding */\n\tif (pRxInfo->L2PAD) {\n\t\t/* just move pData pointer */\n\t\t/* because DataSize excluding HW padding */\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_PAD);\n\t\tpData += 2;\n\t}\n#ifdef DOT11_N_SUPPORT\n\tif (pRxInfo->BA) {\n\t\tRX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU);\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n#if defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT)\n\t/* Use software to decrypt the encrypted frame if necessary.\n\t   If a received \"encrypted\" unicast packet(its WEP bit as 1) \n\t   and it's passed to driver with \"Decrypted\" marked as 0 in pRxInfo. */\n\tif ((pHeader->FC.Wep == 1) && (pRxInfo->Decrypted == 0)) {\n\t\tPCIPHER_KEY pSwKey = NULL;\n\n\t\t/* Cipher key table selection */\n\t\tif ((pSwKey = RTMPSwCipherKeySelection(pAd,\n\t\t\t\t\t\t       pRxBlk->pData, pRxBlk,\n\t\t\t\t\t\t       pEntry)) == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"No vaild cipher key for SW decryption!!!\\n\"));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\t/* Decryption by Software */\n\t\tif (RTMPSoftDecryptionAction(pAd,\n\t\t\t\t\t     (PUCHAR) pHeader,\n\t\t\t\t\t     UserPriority,\n\t\t\t\t\t     pSwKey,\n\t\t\t\t\t     pRxBlk->pTransData + 14,\n\t\t\t\t\t     &(pRxBlk->TransDataSize)) !=\n\t\t    NDIS_STATUS_SUCCESS) {\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t\t/* Record the Decrypted bit as 1 */\n\t\tpRxInfo->Decrypted = 1;\n\t}\n#endif /* SOFT_ENCRYPT || ADHOC_WPA2PSK_SUPPORT */\n\n\t/* Case I  Process Broadcast & Multicast data frame */\n\tif (pRxInfo->Bcast || pRxInfo->Mcast) {\n#ifdef STATS_COUNT_SUPPORT\n\t\tINC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount);\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\t/* Drop Mcast/Bcast frame with fragment bit on */\n\t\tif (pHeader->FC.MoreFrag) {\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\t/* Filter out Bcast frame which AP relayed for us */\n\t\tif (pHeader->FC.FrDs\n\t\t    && MAC_ADDR_EQUAL(pHeader->Addr3, pAd->CurrentAddress)) {\n\t\t\t/* release packet */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\n\t\tif (ADHOC_ON(pAd)) {\n\t\t\tMAC_TABLE_ENTRY *pAdhocEntry = NULL;\n\t\t\tpAdhocEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\tif (pAdhocEntry)\n\t\t\t\tUpdate_Rssi_Sample(pAd, &pAdhocEntry->RssiSample, pRxWI);\n\t\t}\n\n\t\tIndicate_Legacy_Packet_Hdr_Trns(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n\telse if (pRxInfo->U2M)\n\t{\n\n\t\tpAd->LastRxRate = (USHORT)((pRxWI->RxWIMCS) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWIBW << 7) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWISGI << 8) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWISTBC << 9) +\n\t\t\t\t\t\t\t\t   (pRxWI->RxWIPhyMode << 14));\n\n#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT)\n\t\tif (RX_BLK_TEST_FLAG(pRxBlk, fRX_DLS)) {\n\t\t\tMAC_TABLE_ENTRY *pDlsEntry = NULL;\n\n\t\t\tpDlsEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\t\t\tif (pDlsEntry && (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)) {\n\t\t\t\tUpdate_Rssi_Sample(pAd, &pDlsEntry->RssiSample, pRxWI);\n\t\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t\t\t\tpDlsEntry->NoDataIdleCount = 0;\n\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\t\t\t}\n\t\t} else\n#endif\n\t\tif (ADHOC_ON(pAd)) {\n\t\t\tMAC_TABLE_ENTRY *pAdhocEntry = NULL;\n\t\t\tpAdhocEntry = MacTableLookup(pAd, pHeader->Addr2);\n\t\t\tif (pAdhocEntry)\n\t\t\t\tUpdate_Rssi_Sample(pAd,\n\t\t\t\t\t\t   &pAdhocEntry->RssiSample,\n\t\t\t\t\t\t   pRxWI);\n\t\t}\n\n\t\tUpdate_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);\n\n\t\tpAd->StaCfg.LastSNR0 = (UCHAR) (pRxWI->RxWISNR0);\n\t\tpAd->StaCfg.LastSNR1 = (UCHAR) (pRxWI->RxWISNR1);\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\tif (pAd->CommonCfg.RxStream == 3)\n\t\t\tpAd->StaCfg.LastSNR2 = (UCHAR) (pRxWI->RxWISNR2);\n#endif /* DOT11N_SS3_SUPPORT */\n\n\t\tpAd->RalinkCounters.OneSecRxOkDataCnt++;\n\n\t\tif (pEntry != NULL)\n\t\t{\n\t\t\tpEntry->LastRxRate = pAd->LastRxRate;\n#ifdef TXBF_SUPPORT\n\t\t\tif (pRxWI->ShortGI)\n\t\t\t\tpEntry->OneSecRxSGICount++;\n\t\t\telse\n\t\t\t\tpEntry->OneSecRxLGICount++;\n#endif /* TXBF_SUPPORT */\n\n\t\t\tpEntry->freqOffset = (CHAR)(pRxWI->RxWIFOFFSET);\n\t\t\tpEntry->freqOffsetValid = TRUE;\n\n\t\t}\n\n#ifdef PRE_ANT_SWITCH\n#endif /* PRE_ANT_SWITCH */\n\n#ifdef RTMP_MAC_USB\n\t\t/* there's packet sent to me, keep awake for 1200ms */\n\t\tif (pAd->CountDowntoPsm < 12)\n\t\t\tpAd->CountDowntoPsm = 12;\n#endif /* RTMP_MAC_USB */\n\n\t\tif (!((pHeader->Frag == 0) && (pHeader->FC.MoreFrag == 0))) {\n\t\t\t/* re-assemble the fragmented packets */\n\t\t\t/* return complete frame (pRxPacket) or NULL */\n\t\t\tbFragment = TRUE;\n\t\t\tpRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk);\n\t\t}\n\n\t\tif (pRxPacket) {\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\n\t\t\t/* process complete frame */\n\t\t\tif (bFragment && (pRxInfo->Decrypted)\n\t\t\t    && (pEntry->WepStatus == Ndis802_11Encryption2Enabled)) {\n\t\t\t\t/* Minus MIC length */\n\t\t\t\tpRxBlk->DataSize -= 8;\n\n\t\t\t\t/* For TKIP frame, calculate the MIC value */\n\t\t\t\tif (STACheckTkipMICValue(pAd, pEntry, pRxBlk) == FALSE) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSTARxDataFrameAnnounce_Hdr_Trns(pAd, pEntry, pRxBlk, FromWhichBSSID);\n\t\t\treturn;\n\t\t} else {\n\t\t\t/*\n\t\t\t   just return because RTMPDeFragmentDataFrame() will release rx packet, \n\t\t\t   if packet is fragmented\n\t\t\t */\n\t\t\treturn;\n\t\t}\n\t}\n#ifdef XLINK_SUPPORT\n\telse if (pAd->StaCfg.PSPXlink) {\n\t\tIndicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);\n\t\treturn;\n\t}\n#endif /* XLINK_SUPPORT */\n\n\tASSERT(0);\n\t/* release packet */\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID STAHandleRxMgmtFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN RX_BLK *pRxBlk)\n{\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tUCHAR MinSNR = 0;\n\n\tdo {\n\n\n\t\t/* check if need to resend PS Poll when received packet with MoreData = 1 */\n\t\tif ((RtmpPktPmBitCheck(pAd) == TRUE)\n\t\t    && (pHeader->FC.MoreData == 1)) {\n\t\t\t/* for UAPSD, all management frames will be VO priority */\n\t\t\tif (pAd->CommonCfg.bAPSDAC_VO == 0) {\n\t\t\t\t/* non-UAPSD delivery-enabled AC */\n\t\t\t\tRTMP_PS_POLL_ENQUEUE(pAd);\n\t\t\t}\n\t\t}\n\n\t\t/* TODO: if MoreData == 0, station can go to sleep */\n\n\t\t/* We should collect RSSI not only U2M data but also my beacon */\n\t\tif ((pHeader->FC.SubType == SUBTYPE_BEACON)\n\t\t    && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))\n\t\t    && (pAd->RxAnt.EvaluatePeriod == 0)) {\n\t\t\tUpdate_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);\n\n\t\t\tpAd->StaCfg.LastSNR0 = (UCHAR) (pRxWI->RxWISNR0);\n\t\t\tpAd->StaCfg.LastSNR1 = (UCHAR) (pRxWI->RxWISNR1);\n#ifdef DOT11N_SS3_SUPPORT\n\t\t\tpAd->StaCfg.LastSNR2 = (UCHAR) (pRxWI->RxWISNR2);\n#endif /* DOT11N_SS3_SUPPORT */\n\n#ifdef PRE_ANT_SWITCH\n#endif /* PRE_ANT_SWITCH */\n\t\t}\n\n\t\tif ((pHeader->FC.SubType == SUBTYPE_BEACON) &&\n\t\t    (ADHOC_ON(pAd)) &&\n\t\t    (pRxWI->RxWIWirelessCliID < MAX_LEN_OF_MAC_TABLE)) {\n\t\t\tMAC_TABLE_ENTRY *pEntry = NULL;\n\t\t\tpEntry = &pAd->MacTab.Content[pRxWI->RxWIWirelessCliID];\n\t\t\tif (pEntry)\n\t\t\t\tUpdate_Rssi_Sample(pAd, &pEntry->RssiSample, pRxWI);\n\t\t}\n#if defined(RT30xx) || defined(MT7601)\n#endif /* defined(RT30xx) || defined(MT7601) */\n\n\t\t/* First check the size, it MUST not exceed the mlme queue size */\n\t\tif (pRxWI->RxWIMPDUByteCnt > MGMT_DMA_BUFFER_SIZE) {\n\t\t\tDBGPRINT_ERR((\"STAHandleRxMgmtFrame: frame too large, size = %d \\n\", pRxWI->RxWIMPDUByteCnt));\n\t\t\tbreak;\n\t\t}\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (pHeader->FC.SubType == SUBTYPE_ACTION)\n\t\t{\n\t\t\t/* only PM bit of ACTION frame can be set */\n\t\t\tif (pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE)\n\t\t\t{\n\t\t\t   \tRtmpPsIndicate(pAd, pHeader->Addr2, pRxWI->WirelessCliID, pHeader->FC.PwrMgmt);\n\t\t\t}\n\n\t\t\t/*\n\t\t\t\tIn IEEE802.11, 11.2.1.1 STA Power Management modes,\n\t\t\t\tThe Power Managment bit shall not be set in any management\n\t\t\t\tframe, except an Action frame.\n\t\t\t*/\n\t\t\t/*\n\t\t\t\tIn IEEE802.11e, 11.2.1.4 Power management with APSD,\n\t\t\t\tIf there is no unscheduled SP in progress, the unscheduled SP\n\t\t\t\tbegins when the QAP receives a trigger frame from a non-AP QSTA,\n\t\t\t\twhich is a QoS data or QoS Null frame associated with an AC the\n\t\t\t\tSTA has configured to be trigger-enabled.\n\t\t\t\tSo a management action frame is not trigger frame.\n\t\t\t*/\n\t\t}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef MT7601\n\t\tif ( IS_MT7601(pAd) )\n\t\t{\n\t\t\tMinSNR = (CHAR) pRxWI->RxWISNR0;\n\t\t\t/* Signal in MLME_QUEUE isn't used, therefore take this item to save min SNR. */\n\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pHeader,\n\t\t\t\t\t\t  pRxWI->RxWIMPDUByteCnt,\n\t\t\t\t\t\t  pRxWI->RxWISNR2, 0,\n\t\t\t\t\t\t  0, MinSNR, pRxWI->RxWISNR1,\n\t\t\t\t\t\t  OPMODE_STA);\n\t\t}\n\t\telse\n#endif /* MT7601 */\n\t\t{\n\t\t\tMinSNR = min((CHAR) pRxWI->RxWISNR0, (CHAR) pRxWI->RxWISNR1);\n\t\t\t/* Signal in MLME_QUEUE isn't used, therefore take this item to save min SNR. */\n\t\t\tREPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->RxWIWirelessCliID, pHeader,\n\t\t\t\t\t\t  pRxWI->RxWIMPDUByteCnt,\n\t\t\t\t\t\t  pRxWI->RxWIRSSI0, pRxWI->RxWIRSSI1,\n\t\t\t\t\t\t  pRxWI->RxWIRSSI2, MinSNR, 0,\n\t\t\t\t\t\t  OPMODE_STA);\n\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t{\n\t\t\tpRxBlk->pData += LENGTH_802_11;\n\t\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\n\t\t\tif (pHeader->FC.Order) {\n\t\t\t\t//handleHtcField(pAd, pRxBlk);\t// Ignore MCS FB\n\t\t\t\tpRxBlk->pData += 4;\n\t\t\t\tpRxBlk->DataSize -= 4;\n\t\t\t}\n\n\t\t\t// Check for compressed or non-compressed Sounding Response\n\t\t\tif ( (pHeader->FC.SubType==SUBTYPE_ACTION || pHeader->FC.SubType==SUBTYPE_ACTION_NO_ACK) &&\n\t\t\t\t  pRxBlk->pData[0]==CATEGORY_HT &&\n\t\t\t\t (pRxBlk->pData[1]==MIMO_N_BEACONFORM || pRxBlk->pData[1]==MIMO_BEACONFORM) )\n\t\t\t{\n\t\t\t\thandleBfFb(pAd, pRxBlk);\n\t\t\t}\n\t\t}\n#endif /* TXBF_SUPPORT */\n\t} while (FALSE);\n\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n}\n\n\nVOID STAHandleRxControlFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN RX_BLK *pRxBlk)\n{\n#ifdef DOT11_N_SUPPORT\n\tRXWI_STRUC *pRxWI = pRxBlk->pRxWI;\n#endif /* DOT11_N_SUPPORT */\n\tPHEADER_802_11 pHeader = pRxBlk->pHeader;\n\tPNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;\n\tBOOLEAN retStatus;\n\tNDIS_STATUS status = NDIS_STATUS_FAILURE;\n\n\tswitch (pHeader->FC.SubType) {\n\tcase SUBTYPE_BLOCK_ACK_REQ:\n#ifdef DOT11_N_SUPPORT\n\t\t{\n\t\t\tretStatus = CntlEnqueueForRecv(pAd, pRxWI->RxWIWirelessCliID, (pRxWI->RxWIMPDUByteCnt), (PFRAME_BA_REQ) pHeader);\n\t\t\tstatus = (retStatus == TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE;\n\t\t}\n\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\tcase SUBTYPE_BLOCK_ACK:\n\tcase SUBTYPE_ACK:\n\tdefault:\n\t\tbreak;\n\t}\n\n\tRELEASE_NDIS_PACKET(pAd, pRxPacket, status);\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tProcess RxDone interrupt, running in DPC level\n\n\tArguments:\n\t\tpAd Pointer to our adapter\n\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tThis routine has to maintain Rx ring read pointer.\n\t\tNeed to consider QOS DATA format when converting to 802.3\n\t========================================================================\n*/\nBOOLEAN STARxDoneInterruptHandle(RTMP_ADAPTER *pAd, BOOLEAN argc)\n{\n\tNDIS_STATUS Status;\n\tUINT32 RxProcessed, RxPending;\n\tBOOLEAN bReschedule = FALSE;\n\tRXD_STRUC *pRxD;\n\tRXWI_STRUC *pRxWI;\n\tRXINFO_STRUC *pRxInfo;\n\tPNDIS_PACKET pRxPacket;\n\tHEADER_802_11 *pHeader;\n\tUCHAR *pData;\n\tRX_BLK RxBlk;\n\tUINT8 RXWISize = pAd->chipCap.RXWISize;\n#ifdef RLT_MAC\n\tRXFCE_INFO *pFceInfo;\n#endif /* RLT_MAC */\n\n\tRxProcessed = RxPending = 0;\n\n\t/* process whole rx ring */\n\twhile (1)\n\t{\n\t\tif ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RADIO_OFF |\n\t\t\t\t   fRTMP_ADAPTER_RESET_IN_PROGRESS |\n\t\t\t\t   fRTMP_ADAPTER_HALT_IN_PROGRESS |\n\t\t\t\t   fRTMP_ADAPTER_NIC_NOT_EXIST)) ||\n\t\t\t!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) &&\n\t\t\t!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\n\t\tRxProcessed++;\n\n\t\t/*\n\t\t\t1. allocate a new data packet into rx ring to replace received\n\t\t\t\tpacket, then processing the received packet.\n\t\t\t2. the callee must take charge of release of packet\n\t\t\t3. As far as driver is concerned, the rx packet must\n\t\t\t   a. be indicated to upper layer or \n\t\t\t   b. be released if it is discarded\n\t\t */\n\t\tpRxPacket = GetPacketFromRxRing(pAd, &RxBlk, &bReschedule, &RxPending);\n\t\tif (pRxPacket == NULL)\n\t\t\tbreak;\n\n\t\t/* get rx descriptor and buffer */\n\t\tpRxD = (RXD_STRUC *)(&RxBlk.hw_rx_info[0]);\n#ifdef RLT_MAC\n\t\tpFceInfo = RxBlk.pRxFceInfo;\n#endif /* RLT_MAC */\n\t\tpRxInfo = RxBlk.pRxInfo;\n\t\tpData = GET_OS_PKT_DATAPTR(pRxPacket);\n\t\tpRxWI = (RXWI_STRUC *)pData;\n\t\tpHeader = (PHEADER_802_11) (pData + RXWISize);\n\n\n#ifdef RLT_MAC\n\t\t// TODO: shiang-6590, handle packet from other ports\n\t\tif (pFceInfo->info_type != 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"==>%s(): GetFrameFromOtherPorts!\\n\", __FUNCTION__));\n\t\t\thex_dump(\"hw_rx_info\", &RxBlk.hw_rx_info[0], sizeof(RxBlk.hw_rx_info));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Dump the RxD, RxFCEInfo and RxInfo:\\n\"));\n\t\t\thex_dump(\"RxD\", (UCHAR *)pRxD, sizeof(RXD_STRUC));\n#ifdef RLT_MAC\n\t\t\tdumpRxFCEInfo(pAd, pFceInfo);\n#endif /* RLT_MAC */\n\t\t\tdump_rxinfo(pAd, pRxInfo);\n\t\t\thex_dump(\"RxFrame\", (UCHAR *)pData, (pFceInfo->pkt_len));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"<==\\n\"));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t\t\tcontinue;\n\t\t}\n#endif /* RLT_MAC */\n\n#ifdef RT_BIG_ENDIAN\n\t\tRTMPFrameEndianChange(pAd, (PUCHAR) pHeader, DIR_READ, TRUE);\n\t\tRTMPWIEndianChange(pAd, (PUCHAR) pRxWI, TYPE_RXWI);\n#endif\n\nif (0){\n\t\thex_dump(\"hw_rx_info\", &RxBlk.hw_rx_info[0], sizeof(RxBlk.hw_rx_info));\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"==>%s():Dump the RxD, RxFCEInfo and RxInfo:\\n\", __FUNCTION__));\n\t\thex_dump(\"RxD\", (UCHAR *)pRxD, sizeof(RXD_STRUC));\n#ifdef RLT_MAC\n\t\tdumpRxFCEInfo(pAd, pFceInfo);\n#endif /* RLT_MAC */\n\t\tdump_rxinfo(pAd, pRxInfo);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Dump the RxWI and RxPacket:\\n\"));\n\t\tdump_rxwi(pAd, pRxWI);\n\t\thex_dump(\"RxPacket\", (UCHAR *)pHeader, pRxWI->RxWIMPDUByteCnt);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<==%s():Finish dump!\\n\", __FUNCTION__));\n}\n\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_RXWI)\n\t\t\tdbQueueEnqueueRxFrame(pData, (UCHAR *)pHeader, pAd->CommonCfg.DebugFlags);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/* build RxBlk */\n\t\tRxBlk.pRxWI = pRxWI;\n\t\tRxBlk.pHeader = pHeader;\n\t\tRxBlk.pRxPacket = pRxPacket;\n\t\tRxBlk.pData = (UCHAR *) pHeader;\n\t\tRxBlk.DataSize = pRxWI->RxWIMPDUByteCnt;\n\t\tRxBlk.pRxInfo = pRxInfo;\n\t\tRxBlk.Flags = 0;\n\t\tSET_PKT_OPMODE_STA(&RxBlk);\n\n\t\t/* Increase Total receive byte counter after real data received no mater any error or not */\n\t\tpAd->RalinkCounters.ReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.OneSecReceivedByteCount += pRxWI->RxWIMPDUByteCnt;\n\t\tpAd->RalinkCounters.RxCount++;\n\n#ifdef STATS_COUNT_SUPPORT\n\t\tINC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);\n#endif /* STATS_COUNT_SUPPORT */\n\n\t\tif (pRxWI->RxWIMPDUByteCnt < 14)\n\t\t{\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (MONITOR_ON(pAd))\n\t\t{\n\t\t\tSTA_MonPktSend(pAd, &RxBlk);\n\t\t\tcontinue;\n\t\t}\n\n#ifdef RALINK_ATE\n\t\tif (ATE_ON(pAd)) {\n\t\t\tpAd->ate.RxCntPerSec++;\n\t\t\tATESampleRssi(pAd, pRxWI);\n#ifdef RALINK_QA\n\t\t\tif (pAd->ate.bQARxStart == TRUE) {\n\t\t\t\t/* (*pRxD) has been swapped in GetPacketFromRxRing() */\n\t\t\t\tATE_QA_Statistics(pAd, pRxWI, pRxInfo, pHeader);\n\t\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t{\n\t\t\t\t/* Check sounding frame */\n\t\t\t\tif (pHeader->FC.Type == BTYPE_MGMT)\n\t\t\t\t{\n\t\t\t\t\tRX_BLK *pRxBlk = &RxBlk;\n\n\t\t\t\t\tpRxBlk->pData += LENGTH_802_11;\n\t\t\t\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\n\t\t\t\t\tif (pHeader->FC.Order) {\n\t\t\t\t\t\tpRxBlk->pData += 4;\n\t\t\t\t\t\tpRxBlk->DataSize -= 4;\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((((pHeader->FC.SubType == SUBTYPE_ACTION) || (pHeader->FC.SubType == SUBTYPE_ACTION_NO_ACK)) \n\t\t\t\t\t\t&&  (pRxBlk ->pData)[ 0] == CATEGORY_HT \n\t\t\t\t\t\t&&  ((pRxBlk ->pData)[ 1] == MIMO_N_BEACONFORM //non-compressed beamforming report\n\t\t\t\t\t\t|| (pRxBlk ->pData)[1] == MIMO_BEACONFORM)  )) //compressed beamforming report\n\t\t\t\t\t{\n\t\t\t\t\t\t// sounding frame\n\t\t\t\t\t\t//printk(\"Receive sounding response\\n\");\n\t\t\t\t\t\tif (pAd->ate.sounding == 1) {\n\t\t\t\t\t\t\tint i, Nc = ((pRxBlk ->pData)[2] & 0x3) + 1;\n\t\t\t\t\t\t\tpAd->ate.soundingSNR[0] = (CHAR)((pRxBlk ->pData)[8]);\n\t\t\t\t\t\t\tpAd->ate.soundingSNR[1] = (Nc<2)? 0: (CHAR)((pRxBlk ->pData)[9]);\n\t\t\t\t\t\t\tpAd->ate.soundingSNR[2] = (Nc<3)? 0: (CHAR)((pRxBlk ->pData)[10]);\n\t\t\t\t\t\t\tpAd->ate.sounding = 2;\n\t\t\t\t\t\t\tpAd->ate.soundingRespSize = pRxBlk->DataSize;\n\t\t\t\t\t\t\tfor (i=0; i<pRxBlk->DataSize && i<sizeof(pAd->ate.soundingResp); i++)\n\t\t\t\t\t\t\t\tpAd->ate.soundingResp[i] = pRxBlk->pData[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Roger Debug : Fix Me\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pHeader->FC.Order)\n\t\t\t\t\t\t\tDBGPRINT( RT_DEBUG_WARN, (\"fcsubtype=%x\\ndata[0]=%x\\ndata[1]=%x\\n\", pHeader->FC.SubType, (pRxBlk ->pData)[ 0], (pRxBlk ->pData)[1]));\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n#endif /* TXBF_SUPPORT */\n#endif /* RALINK_QA */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t\t\tcontinue;\n\t\t}\n#endif /* RALINK_ATE */\n\n\n\t\t/* Check for all RxD errors */\n\t\tStatus = RTMPCheckRxError(pAd, pHeader, pRxWI, pRxInfo);\n\n\t\t/* Handle the received frame */\n\t\tif (Status == NDIS_STATUS_SUCCESS) {\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\t\t\tif (pAd->chipCap.FreqCalibrationSupport)\n\t\t\t{\n\t\t\tif ((pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration == TRUE)\n\t\t\t    && (INFRA_ON(pAd)) && (pRxInfo->Crc == 0)\n\t\t\t    && (pHeader->FC.Type == BTYPE_MGMT)\n\t\t\t    && (pHeader->FC.SubType == SUBTYPE_BEACON)\n\t\t\t    && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)))\n\t\t\t{\n\t\t\t\t\tpAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon =\n\t\t\t\t\t\t\t\t\t\t\t\tGetFrequencyOffset(pAd, pRxWI);\n\t\t\t\t\tpAd->FreqCalibrationCtrl.BeaconPhyMode = (UCHAR) (pRxWI->RxWIPhyMode);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_INFO,\n\t\t\t\t\t (\"%s: Beacon, CRC error = %d, pHeader->Sequence = %d, SA = %02X:%02X:%02X:%02X:%02X:%02X, frequency offset = %d, MCS = %d, BW = %d PHYMODE = %d\\n\",\n\t\t\t\t\t  __FUNCTION__, pRxInfo->Crc,\n\t\t\t\t\t  pHeader->Sequence, PRINT_MAC(pHeader->Addr2),\n\t\t\t\t\t  ((CHAR) (pRxWI->RxWIFOFFSET)), pRxWI->RxWIMCS,\n\t\t\t\t\t  pRxWI->RxWIBW, pRxWI->RxWIPhyMode));\n\t\t\t}\n\t\t\t}\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\t\t\tswitch (pHeader->FC.Type) {\n\t\t\tcase BTYPE_DATA:\n#ifdef MT7601\n#endif /* MT7601 */\n\n#ifdef HDR_TRANS_SUPPORT\n\t\t\t\t\tRxBlk.bHdrRxTrans = pRxInfo->ip_sum_err;\t\t/* RXINFO bit 31 */\n\n\t\t\t\t\tif ( RxBlk.bHdrRxTrans )\n\t\t\t\t\t{\n\t\t\t\t\t\tRxBlk.bHdrVlanTaged = pRxInfo->tcp_sum_err;\t/* RXINFO bit 30 */\n\t\t\t\t\t\tRxBlk.pTransData = (UCHAR *) pHeader +  38; /* 36 byte - RX WIFI Size ( 802.11 Header ) */\n\t\t\t\t\t\t//RxBlk.TransDataSize = pRxWI->RxWIMPDUByteCnt - 4;\n\t\t\t\t\t\tRxBlk.TransDataSize = pRxWI->RxWIMPDUByteCnt;\n\t\t\t\t\t\tRxBlk.DataSize += 36;\n\n\t\t\t\t\t\tSTAHandleRxDataFrame_Hdr_Trns(pAd, &RxBlk);\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif\t/* HDR_TRANS_SUPPORT */\n\n\t\t\t\t\tSTAHandleRxDataFrame(pAd, &RxBlk);\n\t\t\t\tbreak;\n\n\t\t\tcase BTYPE_MGMT:\n\t\t\t\t\tSTAHandleRxMgmtFrame(pAd, &RxBlk);\n\t\t\t\tbreak;\n\n\t\t\tcase BTYPE_CNTL:\n\t\t\t\t\tSTAHandleRxControlFrame(pAd, &RxBlk);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tpAd->Counters8023.RxErrors++;\n\t\t\t/* discard this frame */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t}\n\t}\n\n\treturn bReschedule;\n}\n\n\nBOOLEAN STAHandleRxDonePacket(\n\tIN RTMP_ADAPTER *pAd,\n\tIN PNDIS_PACKET pRxPacket,\n\tIN RX_BLK *pRxBlk)\n{\n\tRXD_STRUC *pRxD;\n\tRXWI_STRUC *pRxWI;\n\tRXINFO_STRUC *pRxInfo;\n\tPHEADER_802_11 pHeader;\n\tBOOLEAN bReschedule = FALSE;\n\tNDIS_STATUS Status;\n\n\tpRxWI = pRxBlk->pRxWI;\n\tpRxD = (RXD_STRUC *)&pRxBlk->hw_rx_info[0];\n\tpRxInfo = pRxBlk->pRxInfo;\n\tpHeader = pRxBlk->pHeader;\n\tSET_PKT_OPMODE_STA(pRxBlk);\n\n\n\tif (MONITOR_ON(pAd))\n\t{\n\t\t/*send_monitor_packets(pAd, pRxBlk, RTMPMaxRssi, ConvertToRssi);*/\n\t\tSTA_MonPktSend(pAd, pRxBlk);\n\t\treturn bReschedule;\n\t}\n\n\t/* STARxDoneInterruptHandle() is called in rtusb_bulk.c */\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\tpAd->ate.RxCntPerSec++;\n\t\tATESampleRssi(pAd, pRxWI);\n#ifdef RALINK_QA\n\t\tif (pAd->ate.bQARxStart == TRUE)\n\t\t{\n\t\t\t/* (*pRxD) has been swapped in GetPacketFromRxRing() */\n\t\t\tATE_QA_Statistics(pAd, pRxWI, pRxInfo, pHeader);\n\t\t}\n#ifdef TXBF_SUPPORT\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t{\n\t\t\t/* Check sounding frame */\n\t\t\tif (pHeader->FC.Type == BTYPE_MGMT)\n\t\t\t{\n\t\t\t\tpRxBlk->pData += LENGTH_802_11;\n\t\t\t\tpRxBlk->DataSize -= LENGTH_802_11;\n\n\t\t\t\tif (pHeader->FC.Order)\n\t\t\t\t{\n\t\t\t\t\tpRxBlk->pData += 4;\n\t\t\t\t\tpRxBlk->DataSize -= 4;\n\t\t\t\t}\n\n\t\t\t\tif ((((pHeader->FC.SubType == SUBTYPE_ACTION) || (pHeader->FC.SubType == SUBTYPE_ACTION_NO_ACK)) \n\t\t\t\t\t\t&&  (pRxBlk ->pData)[ 0] == CATEGORY_HT \n\t\t\t\t\t\t&&  ((pRxBlk ->pData)[ 1] == MIMO_N_BEACONFORM /* non-compressed beamforming report */\n\t\t\t\t\t\t|| (pRxBlk ->pData)[1] == MIMO_BEACONFORM)  )) /* compressed beamforming report */\n\t\t\t\t{\n\t\t\t\t\t/* sounding frame */\n\t\t\t\t\t/*printk(\"Receive sounding response\\n\"); */\n\t\t\t\t\tif (pAd->ate.sounding == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tint i, Nc = ((pRxBlk ->pData)[2] & 0x3) + 1;\n\n\t\t\t\t\t\tpAd->ate.soundingSNR[0] = (CHAR)((pRxBlk ->pData)[8]);\n\t\t\t\t\t\tpAd->ate.soundingSNR[1] = (Nc<2)? 0: (CHAR)((pRxBlk ->pData)[9]);\n\t\t\t\t\t\tpAd->ate.soundingSNR[2] = (Nc<3)? 0: (CHAR)((pRxBlk ->pData)[10]);\n\t\t\t\t\t\tpAd->ate.sounding = 2;\n\t\t\t\t\t\tpAd->ate.soundingRespSize = pRxBlk->DataSize;\n\n\t\t\t\t\t\tfor (i=0; i<pRxBlk->DataSize && i<sizeof(pAd->ate.soundingResp); i++)\n\t\t\t\t\t\t\tpAd->ate.soundingResp[i] = pRxBlk->pData[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pHeader->FC.Order)\n\t\t\t\t\t\tDBGPRINT( RT_DEBUG_WARN, (\"fcsubtype=%x\\ndata[0]=%x\\ndata[1]=%x\\n\", pHeader->FC.SubType, (pRxBlk ->pData)[ 0], (pRxBlk ->pData)[1]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* TXBF_SUPPORT */\n#endif /* RALINK_QA */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);\n\t\treturn bReschedule;\n\t}\n#endif /* RALINK_ATE */\n\n\t/* Check for all RxD errors */\n\tStatus = RTMPCheckRxError(pAd, pHeader, pRxWI, pRxInfo);\n\n\t/* Handle the received frame */\n\tif (Status == NDIS_STATUS_SUCCESS)\n\t{\n#ifdef RTMP_FREQ_CALIBRATION_SUPPORT\n\t\tif (pAd->chipCap.FreqCalibrationSupport)\n\t\t{\n\t\tif ((pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration == TRUE)\n\t\t\t&& (INFRA_ON(pAd)) && (pRxInfo->Crc == 0)\n\t\t\t&& (pHeader->FC.Type == BTYPE_MGMT)\n\t\t\t&& (pHeader->FC.SubType == SUBTYPE_BEACON)\n\t\t\t&& (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)))\n\t\t{\n\t\t\t\tpAd->FreqCalibrationCtrl.LatestFreqOffsetOverBeacon = GetFrequencyOffset(pAd, pRxWI);\n\t\t\t\tpAd->FreqCalibrationCtrl.BeaconPhyMode = (UCHAR) (pRxWI->RxWIPhyMode);\n\n\t\t\tDBGPRINT(RT_DEBUG_INFO,\n\t\t\t\t (\"%s: Beacon, CRC error = %d, pHeader->Sequence = %d, SA = %02X:%02X:%02X:%02X:%02X:%02X, frequency offset = %d, MCS = %d, BW = %d PHYMODE = %d\\n\",\n\t\t\t\t  __FUNCTION__, pRxInfo->Crc,\n\t\t\t\t  pHeader->Sequence, PRINT_MAC(pHeader->Addr2),\n\t\t\t\t  ((CHAR) (pRxWI->RxWIFOFFSET)), pRxWI->RxWIMCS,\n\t\t\t\t  pRxWI->RxWIBW, pRxWI->RxWIPhyMode));\n\t\t}\n\t\t}\n#endif /* RTMP_FREQ_CALIBRATION_SUPPORT */\n\n\t\tswitch (pHeader->FC.Type)\n\t\t{\n\t\t\tcase BTYPE_DATA:\n\t\t\t\tSTAHandleRxDataFrame(pAd, pRxBlk);\n\t\t\t\tbreak;\n\n\t\t\tcase BTYPE_MGMT:\n\t\t\t\tSTAHandleRxMgmtFrame(pAd, pRxBlk);\n\t\t\t\tbreak;\n\n\t\t\tcase BTYPE_CNTL:\n\t\t\t\tSTAHandleRxControlFrame(pAd, pRxBlk);\n\t\t\t\tbreak;\n\t\t\n\t\t\tdefault:\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tpAd->Counters8023.RxErrors++;\n\t\t/* discard this frame */\n\t\tRELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);\n\t}\n\n\treturn bReschedule;\n\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t========================================================================\n*/\nVOID RTMPHandleTwakeupInterrupt(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tAsicForceWakeup(pAd, FALSE);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n    Early checking and OS-depened parsing for Tx packet send to our STA driver.\n\nArguments:\n    NDIS_HANDLE \tMiniportAdapterContext\tPointer refer to the device handle, i.e., the pAd.\n\tPPNDIS_PACKET\tppPacketArray\t\t\tThe packet array need to do transmission.\n\tUINT\t\t\tNumberOfPackets\t\t\tNumber of packet in packet array.\n\t\nReturn Value:\n\tNONE\t\t\t\t\t\n\nNote:\n\tThis function do early checking and classification for send-out packet.\n\tYou only can put OS-depened & STA related code in here.\n========================================================================\n*/\nVOID STASendPackets(\n\tIN NDIS_HANDLE MiniportAdapterContext,\n\tIN PPNDIS_PACKET ppPacketArray,\n\tIN UINT NumberOfPackets)\n{\n\tUINT Index;\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER) MiniportAdapterContext;\n\tPNDIS_PACKET pPacket;\n\tBOOLEAN allowToSend = FALSE;\n\n\n\tfor (Index = 0; Index < NumberOfPackets; Index++) {\n\t\tpPacket = ppPacketArray[Index];\n\n\t\tdo {\n\n\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)\n\t\t\t    || RTMP_TEST_FLAG(pAd,\n\t\t\t\t\t      fRTMP_ADAPTER_HALT_IN_PROGRESS)\n\t\t\t    || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) {\n\t\t\t\t/* Drop send request since hardware is in reset state */\n\t\t\t\tbreak;\n\t\t\t} else if (!INFRA_ON(pAd) && !ADHOC_ON(pAd)) {\n\t\t\t\t/* Drop send request since there are no physical connection yet */\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t/* Record that orignal packet source is from NDIS layer,so that */\n\t\t\t\t/* later on driver knows how to release this NDIS PACKET */\n\t\t\t\tif (INFRA_ON(pAd) && (0\n#ifdef QOS_DLS_SUPPORT\n\t\t\t\t    || (pAd->CommonCfg.bDLSCapable)\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t    || IS_TDLS_SUPPORT(pAd)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t    )) {\n\t\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\t\tPUCHAR pSrcBufVA =\n\t\t\t\t\t    GET_OS_PKT_DATAPTR(pPacket);\n\n\t\t\t\t\tpEntry = MacTableLookup(pAd, pSrcBufVA);\n\n\t\t\t\t\tif (pEntry\n\t\t\t\t\t    && (IS_ENTRY_DLS(pEntry)\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\t\t|| IS_ENTRY_TDLS(pEntry)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t\t)) {\n\t\t\t\t\t\tRTMP_SET_PACKET_WCID(pPacket, pEntry->Aid);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tRTMP_SET_PACKET_WCID(pPacket, 0);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tRTMP_SET_PACKET_WCID(pPacket, 0);\n\t\t\t\t}\n\n\t\t\t\tRTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);\n\t\t\t\tNDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_PENDING);\n\t\t\t\tpAd->RalinkCounters.PendingNdisPacketCount++;\n\n\t\t\t\tallowToSend = TRUE;\n\t\t\t}\n\t\t} while (FALSE);\n\n\t\tif (allowToSend == TRUE)\n\t\t\tSTASendPacket(pAd, pPacket);\n\t\telse\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t}\n\n\t/* Dequeue outgoing frames from TxSwQueue[] and process it */\n\tRTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);\n\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tThis routine is used to do packet parsing and classification for Tx packet \n\tto STA device, and it will en-queue packets to our TxSwQueue depends on AC \n\tclass.\n\t\nArguments:\n\tpAd    \t\tPointer to our adapter\n\tpPacket \tPointer to send packet\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\t\t\tIf succes to queue the packet into TxSwQueue.\n\tNDIS_STATUS_FAILURE\t\t\tIf failed to do en-queue.\n\nNote:\n\tYou only can put OS-indepened & STA related code in here.\n========================================================================\n*/\nNDIS_STATUS STASendPacket(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket)\n{\n\tPACKET_INFO PacketInfo;\n\tPUCHAR pSrcBufVA;\n\tUINT SrcBufLen;\n\tUINT AllowFragSize;\n\tUCHAR NumberOfFrag;\n\tUCHAR RTSRequired;\n\tUCHAR QueIdx, UserPriority;\n\tMAC_TABLE_ENTRY *pEntry = NULL;\n\tunsigned int IrqFlags;\n\tUCHAR Rate;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((pAd->P2pCfg.bStartP2pConnect) && (pAd->Multi_Channel_Enable == TRUE))\n\t{\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\t/* Prepare packet information structure for buffer descriptor */\n\t/* chained within a single NDIS packet. */\n\tRTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);\n\n\tif (pSrcBufVA == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"STASendPacket --> pSrcBufVA == NULL !!!SrcBufLen=%x\\n\",\n\t\t\t  SrcBufLen));\n\t\t/* Resourece is low, system did not allocate virtual address */\n\t\t/* return NDIS_STATUS_FAILURE directly to upper layer */\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tif (SrcBufLen < 14) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"STASendPacket --> Ndis Packet buffer error !!!\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn (NDIS_STATUS_FAILURE);\n\t}\n\n\t/* In HT rate adhoc mode, A-MPDU is often used. So need to lookup BA Table and MAC Entry. */\n\t/* Note multicast packets in adhoc also use BSSID_WCID index. */\n\t{\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n#if defined(QOS_DLS_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT)\n\t\t\tUSHORT tmpWcid;\n\n\t\t\ttmpWcid = RTMP_GET_PACKET_WCID(pPacket);\n\n\t\t\tif (VALID_WCID(tmpWcid) &&\n\t\t\t    (IS_ENTRY_DLS(&pAd->MacTab.Content[tmpWcid]) ||\n\t\t\t     IS_ENTRY_TDLS(&pAd->MacTab.Content[tmpWcid]))) {\n\t\t\t\tpEntry = &pAd->MacTab.Content[tmpWcid];\n\t\t\t\tRate = pAd->MacTab.Content[tmpWcid].CurrTxRate;\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\t\tRTMP_SET_PACKET_WCID(pPacket, BSSID_WCID);\n\t\t\t\tRate = pAd->CommonCfg.TxRate;\n\t\t\t}\n\t\t} else if (ADHOC_ON(pAd)) {\n\t\t\tif (*pSrcBufVA & 0x01) {\n\t\t\t\tRTMP_SET_PACKET_WCID(pPacket, MCAST_WCID);\n\t\t\t\tpEntry = &pAd->MacTab.Content[MCAST_WCID];\n\t\t\t} else {\n#ifdef XLINK_SUPPORT\n\t\t\t\tif (pAd->StaCfg.PSPXlink) {\n\t\t\t\t\tpEntry =\n\t\t\t\t\t    &pAd->MacTab.Content[MCAST_WCID];\n\t\t\t\t\tpEntry->Aid = MCAST_WCID;\n\t\t\t\t} else\n#endif /* XLINK_SUPPORT */\n\t\t\t\t\tpEntry = MacTableLookup(pAd, pSrcBufVA);\n\n\t\t\t\tif (pEntry)\n\t\t\t\t\tRTMP_SET_PACKET_WCID(pPacket,\n\t\t\t\t\t\t\t     pEntry->Aid);\n\t\t\t}\n\t\t\tRate = pAd->CommonCfg.TxRate;\n\t\t}\n\t}\n\n\tif (!pEntry) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"STASendPacket->Cannot find pEntry(%2x:%2x:%2x:%2x:%2x:%2x) in MacTab!\\n\",\n\t\t\t  PRINT_MAC(pSrcBufVA)));\n\t\t/* Resourece is low, system did not allocate virtual address */\n\t\t/* return NDIS_STATUS_FAILURE directly to upper layer */\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tif (ADHOC_ON(pAd)\n\t    ) {\n\t\tRTMP_SET_PACKET_WCID(pPacket, (UCHAR) pEntry->Aid);\n\t}\n\n\t/* Check the Ethernet Frame type of this packet, and set the RTMP_SET_PACKET_SPECIFIC flags. */\n\t/*              Here we set the PACKET_SPECIFIC flags(LLC, VLAN, DHCP/ARP, EAPOL). */\n\tUserPriority = 0;\n\tQueIdx = QID_AC_BE;\n\tRTMPCheckEtherType(pAd, pPacket, pEntry, OPMODE_STA, &UserPriority, &QueIdx);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t/* the code must behind RTMPCheckEtherType() to get QueIdx */\n\tif ((pEntry != NULL) &&\n\t\t(pEntry->PsMode == PWR_SAVE) &&\n\t\t(pEntry->FlgPsModeIsWakeForAWhile == FALSE) &&\n\t\t(pEntry->bAPSDDeliverEnabledPerAC[QueIdx] == 0))\n\t{\n\t\t/* the packet will be sent to AP, not the peer directly */\n\t\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\n\t\t/* for AP entry, pEntry->bAPSDDeliverEnabledPerAC[QueIdx] always is 0 */\n\t\tRTMP_SET_PACKET_WCID(pPacket, BSSID_WCID);\n\t\tRate = pAd->CommonCfg.TxRate;\n\t}\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\t/* Check the status of the controlled port and filter the outgoing frame for WAPI */\n\tif (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK))\n\t    && (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)\n\t    && (RTMP_GET_PACKET_WAI(pPacket) == FALSE)\n\t    ) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"STASendPacket --> Drop packet before port secured !!!\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\n\t\treturn (NDIS_STATUS_FAILURE);\n\t}\n#endif /* WAPI_SUPPORT */\n\n\t/* WPA 802.1x secured port control - drop all non-802.1x frame before port secured */\n\tif (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t     || (pAd->StaCfg.IEEE8021X == TRUE)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t    )\n\t    && ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)\n\t\t|| (pAd->StaCfg.MicErrCnt >= 2))\n\t    && (RTMP_GET_PACKET_EAPOL(pPacket) == FALSE)\n\t    ) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"STASendPacket --> Drop packet before port secured !!!\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\n\t\treturn (NDIS_STATUS_FAILURE);\n\t}\n#ifdef WSC_STA_SUPPORT\n\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t    (pAd->StaCfg.WscControl.bWscTrigger == TRUE) &&\n\t    (RTMP_GET_PACKET_EAPOL(pPacket) == FALSE)) {\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t (\"STASendPacket --> Drop packet before WPS process completed !!!\\n\"));\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\n\t\treturn (NDIS_STATUS_FAILURE);\n\t}\n#endif /* WSC_STA_SUPPORT */\n\n\t/*\n\t   STEP 1. Decide number of fragments required to deliver this MSDU. \n\t   The estimation here is not very accurate because difficult to \n\t   take encryption overhead into consideration here. The result \n\t   \"NumberOfFrag\" is then just used to pre-check if enough free \n\t   TXD are available to hold this MSDU.\n\t */\n\tif (*pSrcBufVA & 0x01)\t/* fragmentation not allowed on multicast & broadcast */\n\t\tNumberOfFrag = 1;\n\telse if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED))\n\t\tNumberOfFrag = 1;\t/* Aggregation overwhelms fragmentation */\n\telse if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED))\n\t\tNumberOfFrag = 1;\t/* Aggregation overwhelms fragmentation */\n#ifdef DOT11_N_SUPPORT\n\telse if ((pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTMIX)\n\t\t || (pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTGREENFIELD))\n\t\tNumberOfFrag = 1;\t/* MIMO RATE overwhelms fragmentation */\n#endif /* DOT11_N_SUPPORT */\n\telse {\n\t\t/*\n\t\t   The calculated \"NumberOfFrag\" is a rough estimation because of various \n\t\t   encryption/encapsulation overhead not taken into consideration. This number is just\n\t\t   used to make sure enough free TXD are available before fragmentation takes place.\n\t\t   In case the actual required number of fragments of an NDIS packet \n\t\t   excceeds \"NumberOfFrag\"caculated here and not enough free TXD available, the\n\t\t   last fragment (i.e. last MPDU) will be dropped in RTMPHardTransmit() due to out of \n\t\t   resource, and the NDIS packet will be indicated NDIS_STATUS_FAILURE. This should \n\t\t   rarely happen and the penalty is just like a TX RETRY fail. Affordable.\n\t\t */\n\n\t\tAllowFragSize =\n\t\t    (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 -\n\t\t    LENGTH_CRC;\n\t\tNumberOfFrag =\n\t\t    ((PacketInfo.TotalPacketLength - LENGTH_802_3 +\n\t\t      LENGTH_802_1_H) / AllowFragSize) + 1;\n\t\t/* To get accurate number of fragmentation, Minus 1 if the size just match to allowable fragment size */\n\t\tif (((PacketInfo.TotalPacketLength - LENGTH_802_3 +\n\t\t      LENGTH_802_1_H) % AllowFragSize) == 0) {\n\t\t\tNumberOfFrag--;\n\t\t}\n\t}\n\n\t/* Save fragment number to Ndis packet reserved field */\n\tRTMP_SET_PACKET_FRAGMENTS(pPacket, NumberOfFrag);\n\n\t/*\n\t   STEP 2. Check the requirement of RTS:\n\t   If multiple fragment required, RTS is required only for the first fragment\n\t   if the fragment size large than RTS threshold\n\t   For RT28xx, Let ASIC send RTS/CTS\n\t */\n\tif (NumberOfFrag > 1)\n\t\tRTSRequired =\n\t\t    (pAd->CommonCfg.FragmentThreshold >\n\t\t     pAd->CommonCfg.RtsThreshold) ? 1 : 0;\n\telse\n\t\tRTSRequired =\n\t\t    (PacketInfo.TotalPacketLength >\n\t\t     pAd->CommonCfg.RtsThreshold) ? 1 : 0;\n\n\t/* Save RTS requirement to Ndis packet reserved field */\n\tRTMP_SET_PACKET_RTS(pPacket, RTSRequired);\n\tRTMP_SET_PACKET_TXRATE(pPacket, pAd->CommonCfg.TxRate);\n\n\n\tRTMP_SET_PACKET_UP(pPacket, UserPriority);\n\n#ifdef IP_ASSEMBLY\n\tif (pAd->StaCfg.bFragFlag == TRUE) {\n\t\tstatic QUEUE_HEADER queue1[4], queue2[4];\n\t\tstatic BOOLEAN is_init = 0;\n\t\tstatic INT32 ID1[4] = { -1, -1, -1, -1 }, ID2[4] = {\n\t\t-1, -1, -1, -1};\n\t\tstatic INT32 ID1_FragSize[4] =\n\t\t    { -1, -1, -1, -1 }, ID2_FragSize[4] = {\n\t\t-1, -1, -1, -1};\n\t\tstatic ULONG jiffies1[4], jiffies2[4];\n\n\t\tQUEUE_HEADER *pAC_Queue1, *pAC_Queue2;\n\t\tINT32 *pAC_ID1, *pAC_ID2, *pAC_ID1_FragSize, *pAC_ID2_FragSize;\n\t\tULONG *pAC_Jiffies1, *pAC_Jiffies2;\n\n\t\tUINT32 i;\n\t\ttypedef union ip_flags_frag_offset {\n\t\t\tstruct {\n#ifdef RT_BIG_ENDIAN\n\t\t\t\tUSHORT flags_reserved:1;\n\t\t\t\tUSHORT flags_may_frag:1;\n\t\t\t\tUSHORT flags_more_frag:1;\n\t\t\t\tUSHORT frag_offset:13;\n#else\n\t\t\t\tUSHORT frag_offset:13;\n\t\t\t\tUSHORT flags_more_frag:1;\n\t\t\t\tUSHORT flags_may_frag:1;\n\t\t\t\tUSHORT flags_reserved:1;\n#endif\n\t\t\t} field;\n\t\t\tUSHORT word;\n\t\t} IP_FLAGS_FRAG_OFFSET;\n\n\t\ttypedef struct ip_v4_hdr {\n#ifdef RT_BIG_ENDIAN\n\t\t\tUCHAR version:4, ihl:4;\n#else\n\t\t\tUCHAR ihl:4, version:4;\n#endif\n\t\t\tUCHAR tos;\n\t\t\tUSHORT tot_len;\n\t\t\tUSHORT identifier;\n\t\t} IP_V4_HDR;\n\n\t\tIP_V4_HDR *pIpv4Hdr, Ipv4Hdr;\n\t\tIP_FLAGS_FRAG_OFFSET *pFlags_frag_offset, Flags_frag_offset;\n\t\tULONG Now;\n\n\t\tif (is_init == 0) {\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tInitializeQueueHeader(&queue1[i]);\n\t\t\t\tInitializeQueueHeader(&queue2[i]);\n\t\t\t}\n\t\t\tis_init = 1;\n\t\t}\n\n\t\tpAC_Queue1 = &queue1[QueIdx];\n\t\tpAC_Queue2 = &queue2[QueIdx];\n\t\tpAC_ID1 = &ID1[QueIdx];\n\t\tpAC_ID2 = &ID2[QueIdx];\n\t\tpAC_ID1_FragSize = &ID1_FragSize[QueIdx];\n\t\tpAC_ID2_FragSize = &ID2_FragSize[QueIdx];\n\t\tpAC_Jiffies1 = &jiffies1[QueIdx];\n\t\tpAC_Jiffies2 = &jiffies2[QueIdx];\n\n\t\tNdisGetSystemUpTime(&Now);\n\t\tif ((pAC_Queue1->Number != 0)\n\t\t    && (RTMP_TIME_AFTER(Now, (*pAC_Jiffies1) + (1000 * OS_HZ))))\n\t\t{\n\t\t\tPQUEUE_ENTRY pBackupPktEntry;\n\t\t\tPNDIS_PACKET pBackupPkt;\n\n\t\t\twhile (1) {\n\t\t\t\tpBackupPktEntry = RemoveHeadQueue(pAC_Queue1);\n\t\t\t\tif (pBackupPktEntry == NULL)\n\t\t\t\t\tbreak;\n\t\t\t\tpBackupPkt =\n\t\t\t\t    QUEUE_ENTRY_TO_PACKET(pBackupPktEntry);\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pBackupPkt,\n\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t}\n\n\t\t\t*pAC_ID1 = -1;\n\t\t\t*pAC_ID1_FragSize = -1;\n\t\t\t*pAC_Jiffies1 = 0;\n\t\t}\n\n\t\tNdisGetSystemUpTime(&Now);\n\t\tif ((pAC_Queue2->Number != 0)\n\t\t    && (RTMP_TIME_AFTER(Now, (*pAC_Jiffies2) + (1000 * OS_HZ))))\n\t\t{\n\t\t\tPQUEUE_ENTRY pBackupPktEntry;\n\t\t\tPNDIS_PACKET pBackupPkt;\n\n\t\t\twhile (1) {\n\t\t\t\tpBackupPktEntry = RemoveHeadQueue(pAC_Queue2);\n\t\t\t\tif (pBackupPktEntry == NULL)\n\t\t\t\t\tbreak;\n\t\t\t\tpBackupPkt =\n\t\t\t\t    QUEUE_ENTRY_TO_PACKET(pBackupPktEntry);\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pBackupPkt,\n\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t}\n\n\t\t\t*pAC_ID2 = -1;\n\t\t\t*pAC_ID2_FragSize = -1;\n\t\t\t*pAC_Jiffies2 = 0;\n\t\t}\n\n\t\tif (RTMP_GET_PACKET_IPV4(pPacket) &&\n\t\t    ((pAd->TxSwQueue[QueIdx].Number >=\n\t\t      (pAd->TxSwQMaxLen >> 1)) || ((pAC_Queue1->Number)\n\t\t\t\t\t\t       || (pAC_Queue2->Number)))\n\t\t    ) {\n\t\t\tpIpv4Hdr =\n\t\t\t    (IP_V4_HDR *) (PacketInfo.pFirstBuffer +\n\t\t\t\t\t   LENGTH_802_3);\n\t\t\tpFlags_frag_offset =\n\t\t\t    (IP_FLAGS_FRAG_OFFSET *) (PacketInfo.pFirstBuffer +\n\t\t\t\t\t\t      LENGTH_802_3 + 6);\n\t\t\tFlags_frag_offset.word =\n\t\t\t    ntohs(pFlags_frag_offset->word);\n\t\t\tIpv4Hdr.identifier = ntohs(pIpv4Hdr->identifier);\n\t\t\tIpv4Hdr.tot_len = ntohs(pIpv4Hdr->tot_len);\n\t\t\tIpv4Hdr.ihl = pIpv4Hdr->ihl;\n\n\t\t\t/* check if 1st fragment */\n\t\t\tif ((Flags_frag_offset.field.flags_more_frag == 1) &&\n\t\t\t    (Flags_frag_offset.field.frag_offset == 0)) {\n\t\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\t\tif ((*pAC_ID1) == -1) {\n\t\t\t\t\t*pAC_ID1 = Ipv4Hdr.identifier;\n\t\t\t\t\t*pAC_Jiffies1 = Now;\n\t\t\t\t\t*pAC_ID1_FragSize =\n\t\t\t\t\t    Ipv4Hdr.tot_len - (Ipv4Hdr.ihl * 4);\n\t\t\t\t\tInsertTailQueue(pAC_Queue1,\n\t\t\t\t\t\t\tPACKET_TO_QUEUE_ENTRY\n\t\t\t\t\t\t\t(pPacket));\n\t\t\t\t} else if ((*pAC_ID2) == -1) {\n\t\t\t\t\t*pAC_ID2 = Ipv4Hdr.identifier;\n\t\t\t\t\t*pAC_Jiffies2 = Now;\n\t\t\t\t\t*pAC_ID2_FragSize =\n\t\t\t\t\t    Ipv4Hdr.tot_len - (Ipv4Hdr.ihl * 4);\n\t\t\t\t\tInsertTailQueue(pAC_Queue2,\n\t\t\t\t\t\t\tPACKET_TO_QUEUE_ENTRY\n\t\t\t\t\t\t\t(pPacket));\n\t\t\t\t} else {\n\t\t\t\t\tQUEUE_HEADER *pTempqueue;\n\t\t\t\t\tPQUEUE_ENTRY pBackupPktEntry;\n\t\t\t\t\tPNDIS_PACKET pBackupPkt;\n\n\t\t\t\t\t/* free backup fragments */\n\t\t\t\t\tif ((*pAC_Jiffies1) > (*pAC_Jiffies2)) {\n\t\t\t\t\t\tpTempqueue = pAC_Queue2;\n\t\t\t\t\t\t*pAC_ID2 = Ipv4Hdr.identifier;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpTempqueue = pAC_Queue1;\n\t\t\t\t\t\t*pAC_ID1 = Ipv4Hdr.identifier;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (pTempqueue->Number != 0) {\n\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\tpBackupPktEntry =\n\t\t\t\t\t\t\t    RemoveHeadQueue\n\t\t\t\t\t\t\t    (pTempqueue);\n\t\t\t\t\t\t\tif (pBackupPktEntry ==\n\t\t\t\t\t\t\t    NULL)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tpBackupPkt =\n\t\t\t\t\t\t\t    QUEUE_ENTRY_TO_PACKET\n\t\t\t\t\t\t\t    (pBackupPktEntry);\n\t\t\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t\t\t    pBackupPkt,\n\t\t\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* check if last fragment */\n\t\t\t\tif ((Ipv4Hdr.identifier == (*pAC_ID1))\n\t\t\t\t    || (Ipv4Hdr.identifier == (*pAC_ID2))) {\n\t\t\t\t\tQUEUE_HEADER *pTempqueue;\n\t\t\t\t\tPQUEUE_ENTRY pBackupPktEntry;\n\t\t\t\t\tPNDIS_PACKET pBackupPkt;\n\n\t\t\t\t\tif (Ipv4Hdr.identifier == (*pAC_ID1)) {\n\t\t\t\t\t\tInsertTailQueue(pAC_Queue1,\n\t\t\t\t\t\t\t\tPACKET_TO_QUEUE_ENTRY\n\t\t\t\t\t\t\t\t(pPacket));\n\t\t\t\t\t\tpTempqueue = pAC_Queue1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tInsertTailQueue(pAC_Queue2,\n\t\t\t\t\t\t\t\tPACKET_TO_QUEUE_ENTRY\n\t\t\t\t\t\t\t\t(pPacket));\n\t\t\t\t\t\tpTempqueue = pAC_Queue2;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* the last fragment */\n\t\t\t\t\tif ((Flags_frag_offset.field.\n\t\t\t\t\t     flags_more_frag == 0)\n\t\t\t\t\t    && (Flags_frag_offset.field.\n\t\t\t\t\t\tfrag_offset != 0)) {\n\t\t\t\t\t\tUINT32 fragment_count = 0;\n\t\t\t\t\t\tBOOLEAN bDrop = FALSE;\n\t\t\t\t\t\tif (Ipv4Hdr.identifier ==\n\t\t\t\t\t\t    (*pAC_ID1)) {\n\t\t\t\t\t\t\tfragment_count =\n\t\t\t\t\t\t\t    ((Flags_frag_offset.\n\t\t\t\t\t\t\t      field.\n\t\t\t\t\t\t\t      frag_offset * 8) /\n\t\t\t\t\t\t\t     (*pAC_ID1_FragSize))\n\t\t\t\t\t\t\t    + 1;\n\t\t\t\t\t\t\tif (pTempqueue->\n\t\t\t\t\t\t\t    Number !=\n\t\t\t\t\t\t\t    fragment_count)\n\t\t\t\t\t\t\t\tbDrop = TRUE;\n\t\t\t\t\t\t\t*pAC_ID1 = -1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Ipv4Hdr.identifier ==\n\t\t\t\t\t\t    (*pAC_ID2)) {\n\t\t\t\t\t\t\tfragment_count =\n\t\t\t\t\t\t\t    ((Flags_frag_offset.\n\t\t\t\t\t\t\t      field.\n\t\t\t\t\t\t\t      frag_offset * 8) /\n\t\t\t\t\t\t\t     (*pAC_ID2_FragSize))\n\t\t\t\t\t\t\t    + 1;\n\t\t\t\t\t\t\tif (pTempqueue->\n\t\t\t\t\t\t\t    Number !=\n\t\t\t\t\t\t\t    fragment_count)\n\t\t\t\t\t\t\t\tbDrop = TRUE;\n\t\t\t\t\t\t\t*pAC_ID2 = -1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* if number does not equal coreect fragment count or no enough space, */\n\t\t\t\t\t\t/* free backup fragments to SwTxQueue[] */\n\t\t\t\t\t\tif ((bDrop == TRUE) ||\n\t\t\t\t\t\t    (pAd->TxSwQueue[QueIdx].Number > (pAd->TxSwQMaxLen - pTempqueue->Number))) {\n\t\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\t\tpBackupPktEntry = RemoveHeadQueue(pTempqueue);\n\t\t\t\t\t\t\t\tif (pBackupPktEntry == NULL)\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tpBackupPkt = QUEUE_ENTRY_TO_PACKET(pBackupPktEntry);\n\t\t\t\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pBackupPkt, NDIS_STATUS_FAILURE);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t    NDIS_STATUS_SUCCESS;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* move backup fragments to SwTxQueue[] */\n\t\t\t\t\t\tNdisAcquireSpinLock(&pAd->TxSwQueueLock[QueIdx]);\n\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\tpBackupPktEntry = RemoveHeadQueue(pTempqueue);\n\t\t\t\t\t\t\tif (pBackupPktEntry == NULL)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tInsertTailQueueAc(pAd,\n\t\t\t\t\t\t\t\t\t  pEntry,\n\t\t\t\t\t\t\t\t\t  &pAd->TxSwQueue[QueIdx],\n\t\t\t\t\t\t\t\t\t  pBackupPktEntry);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tNdisReleaseSpinLock(&pAd->TxSwQueueLock[QueIdx]);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\n\t\t\t\t\t/*\n\t\t\t\t\t   bypass none-fist fragmented packets (we should not drop this packet)\n\t\t\t\t\t   when \n\t\t\t\t\t   1. (pAd->TxSwQueue[QueIdx].Number >= (pAd->TxSwQMaxLen[QueIdx] >> 1)\n\t\t\t\t\t   and \n\t\t\t\t\t   2. two fragmented buffer are empty \n\t\t\t\t\t */\n\t\t\t\t\tif (((*pAC_ID1) == -1)\n\t\t\t\t\t    && ((*pAC_ID2) == -1)) {\n\t\t\t\t\t\tgoto normal_drop;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((Flags_frag_offset.field.flags_more_frag != 0)\n\t\t\t\t\t    && (Flags_frag_offset.field.frag_offset != 0)) {\n\t\t\t\t\t\tNdisAcquireSpinLock(&pAd->TxSwQueueLock[QueIdx]);\n\t\t\t\t\t\tRELEASE_NDIS_PACKET(pAd,\n\t\t\t\t\t\t\t\t    pPacket,\n\t\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\t\t\tNdisReleaseSpinLock(&pAd->TxSwQueueLock[QueIdx]);\n\t\t\t\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgoto normal_drop;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else\n\t\t\tgoto normal_drop;\n\t} else {\n\t      normal_drop:\n#endif /* IP_ASSEMBLY */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\tif ((pEntry != NULL) &&\n\t\t(pEntry->PsMode == PWR_SAVE) &&\n\t\t(pEntry->FlgPsModeIsWakeForAWhile == FALSE) &&\n\t\t(pEntry->bAPSDDeliverEnabledPerAC[QueIdx] != 0))\n\t{\n\t\t/*\n\t\t\tonly UAPSD of the peer for the queue is set;\n\t\t\tfor non-UAPSD queue, we will send it to the AP.\n\t\t*/\n\t\tif (RtmpInsertPsQueue(pAd, pPacket, pEntry, QueIdx) != NDIS_STATUS_SUCCESS)\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\telse\n\t\t/* non-PS mode or send PS packet to AP */\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t{\n\t\t/* Make sure SendTxWait queue resource won't be used by other threads */\n\t\tRTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n\t\tif (pAd->TxSwQueue[QueIdx].Number >= pAd->TxSwQMaxLen) {\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n#ifdef BLOCK_NET_IF\n\t\t\tStopNetIfQueue(pAd, QueIdx, pPacket);\n#endif /* BLOCK_NET_IF */\n\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t} else {\n\t\t\t\tInsertTailQueueAc(pAd, pEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket));\n\t\t}\n\t\tRTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n\t}\n#ifdef IP_ASSEMBLY\n\t}\n#endif /* IP_ASSEMBLY */\n\n#ifdef DOT11_N_SUPPORT\n\tif ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE) &&\n\t    (pEntry->NoBADataCountDown == 0) && IS_HT_STA(pEntry)) {\n\t\tif (((pEntry->TXBAbitmap & (1 << UserPriority)) == 0) &&\n\t\t    ((pEntry->BADeclineBitmap & (1 << UserPriority)) == 0) &&\n\t\t    (pEntry->PortSecured == WPA_802_1X_PORT_SECURED)\n\t\t    &&\n\t\t    ((IS_ENTRY_CLIENT(pEntry) && pAd->MlmeAux.APRalinkIe != 0x0)\n\t\t     || (pEntry->WepStatus != Ndis802_11WEPEnabled\n\t\t\t && pEntry->WepStatus != Ndis802_11Encryption2Enabled))\n\t\t    &&\n\t\t    (!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))\n#ifdef RT3290\n\t\t    && (!(IS_RT3290(pAd) && pAd->WlanBTCoexInfo.ampduOff == TRUE))\n#endif /* RT3290 */\n\t\t    )\n\t\t{\n\t\t\tBAOriSessionSetUp(pAd, pEntry, UserPriority, 0, 10,\n\t\t\t\t\t  FALSE);\n\t\t}\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tpAd->RalinkCounters.OneSecOsTxCount[QueIdx]++;\t/* TODO: for debug only. to be removed */\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tThis subroutine will scan through releative ring descriptor to find\n\t\tout avaliable free ring descriptor and compare with request size.\n\t\t\n\tArguments:\n\t\tpAd Pointer to our adapter\n\t\tQueIdx\t\tSelected TX Ring\n\t\t\n\tReturn Value:\n\t\tNDIS_STATUS_FAILURE \tNot enough free descriptor\n\t\tNDIS_STATUS_SUCCESS \tEnough free descriptor\n\n\tIRQL = PASSIVE_LEVEL\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\n\n\n#ifdef RTMP_MAC_USB\n/*\n\tActually, this function used to check if the TxHardware Queue still has frame need to send.\n\tIf no frame need to send, go to sleep, else, still wake up.\n*/\nNDIS_STATUS RTMPFreeTXDRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR QueIdx,\n\tIN UCHAR NumberRequired,\n\tIN PUCHAR FreeNumberIs)\n{\n\t/*ULONG         FreeNumber = 0; */\n\tNDIS_STATUS Status = NDIS_STATUS_FAILURE;\n\tunsigned long IrqFlags;\n\tHT_TX_CONTEXT *pHTTXContext;\n\n\tswitch (QueIdx) {\n\tcase QID_AC_BK:\n\tcase QID_AC_BE:\n\tcase QID_AC_VI:\n\tcase QID_AC_VO:\n\tcase QID_HCCA:\n\t\t{\n\t\t\tpHTTXContext = &pAd->TxContext[QueIdx];\n\t\t\tRTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx],\n\t\t\t\t      IrqFlags);\n\t\t\tif ((pHTTXContext->CurWritePosition !=\n\t\t\t     pHTTXContext->ENextBulkOutPosition)\n\t\t\t    || (pHTTXContext->IRPPending == TRUE)) {\n\t\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\t} else {\n\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\t}\n\t\t\tRTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx],\n\t\t\t\t\tIrqFlags);\n\t\t}\n\t\tbreak;\n\n\tcase QID_MGMT:\n\t\tif (pAd->MgmtRing.TxSwFreeIdx != MGMT_RING_SIZE)\n\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\telse\n\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\tbreak;\n\n\tdefault:\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"RTMPFreeTXDRequest::Invalid QueIdx(=%d)\\n\", QueIdx));\n\t\tbreak;\n\t}\n\n\treturn (Status);\n\n}\n#endif /* RTMP_MAC_USB */\n\n\nVOID RTMPSendNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR TxRate,\n\tIN BOOLEAN bQosNull,\n\tIN USHORT PwrMgmt)\n{\n\tUCHAR NullFrame[48];\n\tULONG Length;\n\tPHEADER_802_11 pHeader_802_11;\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif ((pAd->P2pCfg.bStartP2pConnect) && (pAd->Multi_Channel_Enable == TRUE))\n\t\treturn;\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd)) {\n\t\treturn;\n\t}\n#endif /* RALINK_ATE */\n\n\t/* WPA 802.1x secured port control */\n\tif (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||\n\t     (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t     || (pAd->StaCfg.IEEE8021X == TRUE)\n#endif\n#ifdef WAPI_SUPPORT\n\t     || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t     || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t    ) && (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) {\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(NullFrame, 48);\n\tLength = sizeof (HEADER_802_11);\n\n\tpHeader_802_11 = (PHEADER_802_11) NullFrame;\n\n\tpHeader_802_11->FC.Type = BTYPE_DATA;\n\tpHeader_802_11->FC.SubType = SUBTYPE_NULL_FUNC;\n\tpHeader_802_11->FC.ToDs = 1;\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr1, pAd->CommonCfg.Bssid);\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress);\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid);\n\n\tif (pAd->CommonCfg.bAPSDForcePowerSave) {\n\t\tpHeader_802_11->FC.PwrMgmt = PWR_SAVE;\n\t} else {\n\t\tBOOLEAN FlgCanPmBitSet = TRUE;\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t/* check TDLS condition */\n\t\tif (pAd->StaCfg.TdlsInfo.TdlsFlgIsKeepingActiveCountDown == TRUE)\n\t\t\tFlgCanPmBitSet = FALSE;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\tif (FlgCanPmBitSet == TRUE)\n\t\tpHeader_802_11->FC.PwrMgmt = PwrMgmt;\n\t\telse\n\t\t\tpHeader_802_11->FC.PwrMgmt = PWR_ACTIVE;\n\t}\n\n\tpHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);\n\n\t/* sequence is increased in MlmeHardTx */\n\tpHeader_802_11->Sequence = pAd->Sequence;\n\tpAd->Sequence = (pAd->Sequence + 1) & MAXSEQ;\t/* next sequence  */\n\n\t/* Prepare QosNull function frame */\n\tif (bQosNull) {\n\t\tpHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL;\n\n\t\t/* copy QOS control bytes */\n\t\tNullFrame[Length] = 0;\n\t\tNullFrame[Length + 1] = 0;\n\t\tLength += 2;\t/* if pad with 2 bytes for alignment, APSD will fail */\n\t}\n\n\tHAL_KickOutNullFrameTx(pAd, 0, NullFrame, Length);\n\n}\n\n\n#ifdef CONFIG_MULTI_CHANNEL\nVOID RTMPP2PSendNullFrame(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR TxRate,\n\tIN BOOLEAN bQosNull,\n\tIN USHORT PwrMgmt)\n{\n\tUCHAR NullFrame[48];\n\tULONG Length;\n\tPHEADER_802_11 pHeader_802_11;\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n\t PMAC_TABLE_ENTRY pEntry = NULL;\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[0];\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd)) {\n\t\treturn;\n\t}\n#endif /* RALINK_ATE */\n\n\n\tif (pApCliEntry == NULL || !pApCliEntry->Valid)\n\t\treturn;\n\t\n \tpEntry = MacTableLookup(pAd, pApCliEntry->CfgApCliBssid);\n\n\tif (pEntry == NULL)\n\t\treturn;\n\t/* WPA 802.1x secured port control */\n\tif (((pEntry->AuthMode == Ndis802_11AuthModeWPA) ||\n\t     (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t     (pEntry->AuthMode == Ndis802_11AuthModeWPA2) ||\n\t     (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t    ) && (pEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED)) {\n\t\treturn;\n\t}\n\n\tNdisZeroMemory(NullFrame, 48);\n\tLength = sizeof (HEADER_802_11);\n\n\tpHeader_802_11 = (PHEADER_802_11) NullFrame;\n\n\tpHeader_802_11->FC.Type = BTYPE_DATA;\n\tpHeader_802_11->FC.SubType = SUBTYPE_NULL_FUNC;\n\tpHeader_802_11->FC.ToDs = 1;\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr1, pEntry->Addr);\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr2, pApCliEntry->CurrentAddress);\n\tCOPY_MAC_ADDR(pHeader_802_11->Addr3, pApCliEntry->CfgApCliBssid);\n\n\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t{\n\t\tpHeader_802_11->FC.PwrMgmt = PWR_SAVE;\n\t}\n\telse\n\t{\n\t\tBOOLEAN FlgCanPmBitSet = TRUE;\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t/* check TDLS condition */\n\t\tif (pAd->StaCfg.TdlsInfo.TdlsFlgIsKeepingActiveCountDown == TRUE)\n\t\t\tFlgCanPmBitSet = FALSE;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\tif (FlgCanPmBitSet == TRUE)\n\t\tpHeader_802_11->FC.PwrMgmt = PwrMgmt;\n\t\telse\n\t\t\tpHeader_802_11->FC.PwrMgmt = PWR_ACTIVE;\n\t}\n\n\tpHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);\n\n\t/* sequence is increased in MlmeHardTx */\n\tpHeader_802_11->Sequence = pAd->Sequence;\n\tpAd->Sequence = (pAd->Sequence + 1) & MAXSEQ;\t/* next sequence  */\n\n\t/* Prepare QosNull function frame */\n\tif (bQosNull) {\n\t\tpHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL;\n\n\t\t/* copy QOS control bytes */\n\t\tNullFrame[Length] = 0;\n\t\tNullFrame[Length + 1] = 0;\n\t\tLength += 2;\t/* if pad with 2 bytes for alignment, APSD will fail */\n\t}\n\tDBGPRINT(RT_DEBUG_OFF, (\" RTMPP2PSendNullFrame Addr = %02x:%02x:%02x:%02x:%02x:%02x pwr=%d\\n\", PRINT_MAC(pHeader_802_11->Addr1),PwrMgmt));\n//iversonnote\t\n\tHAL_KickOutNullFrameTx(pAd, HCCA_PIPE, NullFrame, Length);\n}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n/*\n--------------------------------------------------------\nFIND ENCRYPT KEY AND DECIDE CIPHER ALGORITHM\n\tFind the WPA key, either Group or Pairwise Key\n\tLEAP + TKIP also use WPA key.\n--------------------------------------------------------\nDecide WEP bit and cipher suite to be used. Same cipher suite should be used for whole fragment burst\n\tIn Cisco CCX 2.0 Leap Authentication\n\tWepStatus is Ndis802_11Encryption1Enabled but the key will use PairwiseKey\n\tInstead of the SharedKey, SharedKey Length may be Zero.\n*/\nVOID STAFindCipherAlgorithm(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tNDIS_802_11_ENCRYPTION_STATUS Cipher;\t/* To indicate cipher used for this packet */\n\tUCHAR CipherAlg = CIPHER_NONE;\t/* cipher alogrithm */\n\tUCHAR KeyIdx = 0xff;\n\tPUCHAR pSrcBufVA;\n\tPCIPHER_KEY pKey = NULL;\n\tPMAC_TABLE_ENTRY pMacEntry;\n\n\tpSrcBufVA = GET_OS_PKT_DATAPTR(pTxBlk->pPacket);\n\tpMacEntry = pTxBlk->pMacEntry;\n\n#ifdef WAPI_SUPPORT\n\tif (pMacEntry\n\t\t    && (pMacEntry->WepStatus == Ndis802_11EncryptionSMS4Enabled)) {\n\t\tif (RTMP_GET_PACKET_WAI(pTxBlk->pPacket)) {\n\t\t\t/* WAI negotiation packet is always clear. */\n\t\t\tCipherAlg = CIPHER_NONE;\n\t\t\tpKey = NULL;\n\t\t} else {\n\t\t\tKeyIdx = pMacEntry->usk_id;\t/* USK ID */\n\t\t\tCipherAlg = pMacEntry->PairwiseKey.CipherAlg;\n\t\t\tif (CipherAlg == CIPHER_SMS4) {\n\t\t\t\tpKey = &pMacEntry->PairwiseKey;\n#ifdef SOFT_ENCRYPT\n\t\t\t\tif (CLIENT_STATUS_TEST_FLAG\n\t\t\t\t    (pMacEntry,\n\t\t\t\t     fCLIENT_STATUS_SOFTWARE_ENCRYPT)) {\n\t\t\t\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bSwEncrypt);\n\t\t\t\t\t/* TSC increment pre encryption transmittion */\n\t\t\t\t\tinc_iv_byte(pKey->TxTsc, LEN_WAPI_TSC,\n\t\t\t\t\t\t    2);\n\t\t\t\t}\n#endif /* SOFT_ENCRYPT */\n\t\t\t}\n\t\t}\n\t} else\n#endif /* WAPI_SUPPORT */\n\t{\n\t\t/* Select Cipher */\n\t\tif ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd)))\n\t\t\tCipher = pAd->StaCfg.GroupCipher;\t/* Cipher for Multicast or Broadcast */\n\t\telse\n\t\t\tCipher = pAd->StaCfg.PairCipher;\t/* Cipher for Unicast */\n\n\t\tif (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) {\n\t\t\tASSERT(pAd->SharedKey[BSS0][0].CipherAlg <=\n\t\t\t       CIPHER_CKIP128);\n\n\t\t\t/* 4-way handshaking frame must be clear */\n\t\t\tif (!(TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame)) &&\n\t\t\t    (pAd->SharedKey[BSS0][0].CipherAlg) &&\n\t\t\t    (pAd->SharedKey[BSS0][0].KeyLen)) {\n\t\t\t\tCipherAlg = pAd->SharedKey[BSS0][0].CipherAlg;\n\t\t\t\tKeyIdx = 0;\n\t\t\t}\n\t\t} else if (Cipher == Ndis802_11Encryption1Enabled) {\n\t\t\tKeyIdx = pAd->StaCfg.DefaultKeyId;\n\t\t} else if ((Cipher == Ndis802_11Encryption2Enabled) ||\n\t\t\t   (Cipher == Ndis802_11Encryption3Enabled)) {\n\t\t\tif ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd)))\t/* multicast */\n\t\t\t\tKeyIdx = pAd->StaCfg.DefaultKeyId;\n\t\t\telse if (pAd->SharedKey[BSS0][0].KeyLen)\n\t\t\t\tKeyIdx = 0;\n\t\t\telse\n\t\t\t\tKeyIdx = pAd->StaCfg.DefaultKeyId;\n\t\t}\n\n\t\tif (KeyIdx == 0xff)\n\t\t\tCipherAlg = CIPHER_NONE;\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\t\telse if ((ADHOC_ON(pAd))\n\t\t\t && (Cipher == Ndis802_11Encryption3Enabled)\n\t\t\t && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t\t\t && (pAd->StaCfg.PortSecured ==\n\t\t\t     WPA_802_1X_PORT_SECURED)) {\n\t\t\tCipherAlg = CIPHER_AES;\n\t\t\tpKey = &pAd->SharedKey[BSS0][KeyIdx];\n\t\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\t\telse if ((Cipher == Ndis802_11EncryptionDisabled)\n\t\t\t || (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 0))\n\t\t\tCipherAlg = CIPHER_NONE;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\telse if (pAd->StaCfg.WpaSupplicantUP &&\n\t\t\t (Cipher == Ndis802_11Encryption1Enabled) &&\n\t\t\t (pAd->StaCfg.IEEE8021X == TRUE) &&\n\t\t\t (pAd->StaCfg.PortSecured ==\n\t\t\t  WPA_802_1X_PORT_NOT_SECURED))\n\t\t\tCipherAlg = CIPHER_NONE;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\telse {\n\t\t\tCipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg;\n\t\t\tpKey = &pAd->SharedKey[BSS0][KeyIdx];\n\t\t}\n\t}\n\n\tpTxBlk->CipherAlg = CipherAlg;\n\tpTxBlk->pKey = pKey;\n\tpTxBlk->KeyIdx = KeyIdx;\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID STABuildWifiInfo(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tPWIFI_INFO_STRUC pWI;\n#ifdef QOS_DLS_SUPPORT\n\tBOOLEAN bDLSFrame = FALSE;\n\tINT DlsEntryIndex = 0;\n#endif /* QOS_DLS_SUPPORT */\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tpTxBlk->MpduHeaderLen = WIFI_INFO_SIZE;\n\n\tpWI =\n\t    (WIFI_INFO_STRUC *) & pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\n\tNdisZeroMemory(pWI, WIFI_INFO_SIZE);\n\n\tpWI->field.QoS = (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? 1 : 0;\n\n#ifdef QOS_DLS_SUPPORT\n\tif (INFRA_ON(pAd)) {\n\t\t/* Check if the frame can be sent through DLS direct link interface */\n\t\t/* If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability) */\n\t\tDlsEntryIndex = RTMPCheckDLSFrame(pAd, pTxBlk->pSrcBufHeader);\n\t\tif (DlsEntryIndex >= 0)\n\t\t\tbDLSFrame = TRUE;\n\t\telse\n\t\t\tbDLSFrame = FALSE;\n\t}\n#endif /* QOS_DLS_SUPPORT */\n\n\tif (pTxBlk->pMacEntry) {\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS)) {\n\t\t\tpWI->field.Seq_Num =\n\t\t\t    pTxBlk->pMacEntry->NonQosDataSeq;\n\t\t\tpTxBlk->pMacEntry->NonQosDataSeq =\n\t\t\t    (pTxBlk->pMacEntry->NonQosDataSeq + 1) & MAXSEQ;\n\t\t} else {\n\t\t\tpWI->field.Seq_Num =\n\t\t\t    pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority];\n\t\t\tpTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] =\n\t\t\t    (pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ;\n\t\t}\n\t} else {\n\t\tpWI->field.Seq_Num = pAd->Sequence;\n\t\tpAd->Sequence = (pAd->Sequence + 1) & MAXSEQ;\t/* next sequence  */\n\t}\n\n\tpWI->field.More_Data = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\n\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n#ifdef QOS_DLS_SUPPORT\n\t\tif (bDLSFrame) \n\t\t\tpWI->field.Mode = 0;\t/* IBSS */\n\t\telse\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bTdlsEntry)) \n\t\t\tpWI->field.Mode = 0; /* IBSS */\n\t\telse\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\tpWI->field.Mode = 2; /* STA*/\n\t} else if (ADHOC_ON(pAd)) {\n\t\tpWI->field.Mode = 0; /* IBSS */\n\t}\n\n\tif (pTxBlk->CipherAlg != CIPHER_NONE)\n\t\tpWI->field.WEP = 1;\n\n\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t\tpWI->field.PS = PWR_SAVE;\n\telse\n\t\tpWI->field.PS = (pAd->StaCfg.Psm == PWR_SAVE);\n}\n\n\nVOID STABuildCacheWifiInfo(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN UCHAR *pWiInfo)\n{\n\tPWIFI_INFO_STRUC pWI;\n\tMAC_TABLE_ENTRY *pMacEntry;\n\n\tpWI = (PWIFI_INFO_STRUC)pWiInfo;\n\tpMacEntry = pTxBlk->pMacEntry;\n\n\tpTxBlk->MpduHeaderLen = WIFI_INFO_SIZE;\n\n\t/* More Bit */\n\tpWI->field.More_Data = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\n\t/* Sequence */\n\tpWI->field.Seq_Num = pMacEntry->TxSeq[pTxBlk->UserPriority];\n\tpMacEntry->TxSeq[pTxBlk->UserPriority] =\n\t    (pMacEntry->TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ;\n\n\t{\n\t\t/* Check if the frame can be sent through DLS direct link interface\n\t\t   If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability) */\n#ifdef QOS_DLS_SUPPORT\n\t\tBOOLEAN bDLSFrame = FALSE;\n\t\tINT DlsEntryIndex = 0;\n\n\t\tDlsEntryIndex = RTMPCheckDLSFrame(pAd, pTxBlk->pSrcBufHeader);\n\t\tif (DlsEntryIndex >= 0)\n\t\t\tbDLSFrame = TRUE;\n\t\telse\n\t\t\tbDLSFrame = FALSE;\n#endif /* QOS_DLS_SUPPORT */\n\n\t\t/* The addr3 of normal packet send from DS is Dest Mac address. */\n#ifdef QOS_DLS_SUPPORT\n\t\tif (bDLSFrame) {\n\t\t\tpWI->field.Mode = 0;\t/* IBSS */\n\t\t} else\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bTdlsEntry)) {\n\t\t\tpWI->field.Mode = 0;\t/* IBSS */\n\t\t} else\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\tif (ADHOC_ON(pAd))\n\t\t\tpWI->field.Mode = 0;\t/* IBSS */\n\t\telse {\n\t\t\tpWI->field.Mode = 2; /* STA*/\n\t\t}\n\t}\n\n\t/* \n\t   -----------------------------------------------------------------\n\t   STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. \n\t   -----------------------------------------------------------------\n\t */\n\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t\tpWI->field.PS = PWR_SAVE;\n\telse\n\t\tpWI->field.PS = (pAd->StaCfg.Psm == PWR_SAVE);\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID STABuildCommon802_11Header(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *wifi_hdr;\n#ifdef QOS_DLS_SUPPORT\n\tBOOLEAN bDLSFrame = FALSE;\n\tINT DlsEntryIndex = 0;\n#endif /* QOS_DLS_SUPPORT */\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t/* MAKE A COMMON 802.11 HEADER */\n\n\t/* normal wlan header size : 24 octets */\n\tpTxBlk->MpduHeaderLen = sizeof (HEADER_802_11);\n\twifi_hdr = (HEADER_802_11 *)&pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize + TSO_SIZE];\n\tNdisZeroMemory(wifi_hdr, sizeof (HEADER_802_11));\n\n\twifi_hdr->FC.FrDs = 0;\n\twifi_hdr->FC.Type = BTYPE_DATA;\n\twifi_hdr->FC.SubType = ((TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? SUBTYPE_QDATA : SUBTYPE_DATA);\n\n#ifdef QOS_DLS_SUPPORT\n\tif (INFRA_ON(pAd)) {\n\t\t/* Check if the frame can be sent through DLS direct link interface */\n\t\t/* If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability) */\n\t\tDlsEntryIndex = RTMPCheckDLSFrame(pAd, pTxBlk->pSrcBufHeader);\n\t\tif (DlsEntryIndex >= 0)\n\t\t\tbDLSFrame = TRUE;\n\t\telse\n\t\t\tbDLSFrame = FALSE;\n\t}\n#endif /* QOS_DLS_SUPPORT */\n\n\tif (pTxBlk->pMacEntry) {\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS)) {\n\t\t\twifi_hdr->Sequence = pTxBlk->pMacEntry->NonQosDataSeq;\n\t\t\tpTxBlk->pMacEntry->NonQosDataSeq = (pTxBlk->pMacEntry->NonQosDataSeq + 1) & MAXSEQ;\n\t\t} else {\n\t\t\twifi_hdr->Sequence = pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority];\n\t\t\tpTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] = (pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ;\n\t\t}\n\t} else {\n\t\twifi_hdr->Sequence = pAd->Sequence;\n\t\tpAd->Sequence = (pAd->Sequence + 1) & MAXSEQ;\t/* next sequence  */\n\t}\n\n\twifi_hdr->Frag = 0;\n\n\twifi_hdr->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\n\t{\n\t\tif (pAd->StaCfg.BssType == BSS_INFRA) {\n#ifdef QOS_DLS_SUPPORT\n\t\t\tif (bDLSFrame) {\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pSrcBufHeader);\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pAd->CurrentAddress);\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pAd->CommonCfg.Bssid);\n\t\t\t\twifi_hdr->FC.ToDs = 0;\n\t\t\t} else\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bTdlsEntry)) {\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pSrcBufHeader);\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pAd->CurrentAddress);\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pAd->CommonCfg.Bssid);\n\t\t\t\twifi_hdr->FC.ToDs = 0;\n\t\t\t} else\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t{\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, pAd->CommonCfg.Bssid);\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pAd->CurrentAddress);\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pTxBlk->pSrcBufHeader);\n\t\t\t\twifi_hdr->FC.ToDs = 1;\n#ifdef CLIENT_WDS\n\t\t\t\tif (!MAC_ADDR_EQUAL\n\t\t\t\t    ((pTxBlk->pSrcBufHeader + MAC_ADDR_LEN),\n\t\t\t\t     pAd->CurrentAddress)) {\n\t\t\t\t\twifi_hdr->FC.FrDs = 1;\n\t\t\t\t\tCOPY_MAC_ADDR(&wifi_hdr->Octet[0], pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);\t/* ADDR4 = SA */\n\t\t\t\t\tpTxBlk->MpduHeaderLen += MAC_ADDR_LEN;\n\t\t\t\t}\n#endif /* CLIENT_WDS */\n\t\t\t}\n\t\t}\n\t\telse if (ADHOC_ON(pAd))\n\t\t{\n\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pSrcBufHeader);\n#ifdef XLINK_SUPPORT\n\t\t\tif (pAd->StaCfg.PSPXlink)\n\t\t\t\t/* copy the SA of ether frames to address 2 of 802.11 frame */\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);\n\t\t\telse\n#endif /* XLINK_SUPPORT */\n\t\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr2, pAd->CurrentAddress);\n\t\t\tCOPY_MAC_ADDR(wifi_hdr->Addr3, pAd->CommonCfg.Bssid);\n\t\t\twifi_hdr->FC.ToDs = 0;\n\t\t}\n\t}\n\n\tif (pTxBlk->CipherAlg != CIPHER_NONE)\n\t\twifi_hdr->FC.Wep = 1;\n\n\t/*\n\t   -----------------------------------------------------------------\n\t   STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. \n\t   -----------------------------------------------------------------\n\t */\n\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t\twifi_hdr->FC.PwrMgmt = PWR_SAVE;\n\telse\n\t\twifi_hdr->FC.PwrMgmt = (RtmpPktPmBitCheck(pAd) == TRUE);\n}\n\n\n#ifdef DOT11_N_SUPPORT\nVOID STABuildCache802_11Header(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk,\n\tIN UCHAR *pHeader)\n{\n\tMAC_TABLE_ENTRY *pMacEntry;\n\tPHEADER_802_11 pHeader80211;\n\n\tpHeader80211 = (PHEADER_802_11) pHeader;\n\tpMacEntry = pTxBlk->pMacEntry;\n\n\t/* Update the cached 802.11 HEADER */\n\n\t/* normal wlan header size : 24 octets */\n\tpTxBlk->MpduHeaderLen = sizeof (HEADER_802_11);\n\n\t/* More Bit */\n\tpHeader80211->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);\n\n\t/* Sequence */\n\tpHeader80211->Sequence = pMacEntry->TxSeq[pTxBlk->UserPriority];\n\tpMacEntry->TxSeq[pTxBlk->UserPriority] =\n\t    (pMacEntry->TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ;\n\n\t{\n\t\t/* Check if the frame can be sent through DLS direct link interface\n\t\t   If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability) */\n#ifdef QOS_DLS_SUPPORT\n\t\tBOOLEAN bDLSFrame = FALSE;\n\t\tINT DlsEntryIndex = 0;\n\n\t\tDlsEntryIndex = RTMPCheckDLSFrame(pAd, pTxBlk->pSrcBufHeader);\n\t\tif (DlsEntryIndex >= 0)\n\t\t\tbDLSFrame = TRUE;\n\t\telse\n\t\t\tbDLSFrame = FALSE;\n#endif /* QOS_DLS_SUPPORT */\n\n\t\t/* The addr3 of normal packet send from DS is Dest Mac address. */\n#ifdef QOS_DLS_SUPPORT\n\t\tif (bDLSFrame) {\n\t\t\tCOPY_MAC_ADDR(pHeader80211->Addr1, pTxBlk->pSrcBufHeader);\n\t\t\tCOPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid);\n\t\t\tpHeader80211->FC.ToDs = 0;\n\t\t} else\n#endif /* QOS_DLS_SUPPORT */\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bTdlsEntry)) {\n\t\t\tCOPY_MAC_ADDR(pHeader80211->Addr1, pTxBlk->pSrcBufHeader);\n\t\t\tCOPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid);\n\t\t} else\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\tif (ADHOC_ON(pAd))\n\t\t\tCOPY_MAC_ADDR(pHeader80211->Addr3,\n\t\t\t\t      pAd->CommonCfg.Bssid);\n\t\telse {\n\t\t\tCOPY_MAC_ADDR(pHeader80211->Addr3,\n\t\t\t\t      pTxBlk->pSrcBufHeader);\n#ifdef CLIENT_WDS\n\t\t\tif (!MAC_ADDR_EQUAL\n\t\t\t    ((pTxBlk->pSrcBufHeader + MAC_ADDR_LEN),\n\t\t\t     pAd->CurrentAddress)) {\n\t\t\t\tpHeader80211->FC.FrDs = 1;\n\t\t\t\tCOPY_MAC_ADDR(&pHeader80211->Octet[0], pTxBlk->pSrcBufHeader + MAC_ADDR_LEN);\t/* ADDR4 = SA */\n\t\t\t\tpTxBlk->MpduHeaderLen += MAC_ADDR_LEN;\n\t\t\t}\n#endif /* CLIENT_WDS */\n\t\t}\n\t}\n\n\t/* \n\t   -----------------------------------------------------------------\n\t   STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. \n\t   -----------------------------------------------------------------\n\t */\n\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t\tpHeader80211->FC.PwrMgmt = PWR_SAVE;\n\telse\n\t\tpHeader80211->FC.PwrMgmt = (RtmpPktPmBitCheck(pAd) == TRUE);\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nstatic inline PUCHAR STA_Build_ARalink_Frame_Header(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tPUCHAR pHeaderBufPtr;\n\tHEADER_802_11 *pHeader_802_11;\n\tPNDIS_PACKET pNextPacket;\n\tUINT32 nextBufLen;\n\tPQUEUE_ENTRY pQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\tSTABuildCommon802_11Header(pAd, pTxBlk);\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t/* steal \"order\" bit to mark \"aggregation\" */\n\tpHeader_802_11->FC.Order = 1;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) {\n\t\t/* build QOS Control bytes */\n\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_MR_EOSP_SET(pHeaderBufPtr, pTxBlk);\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\t*(pHeaderBufPtr + 1) = 0;\n\t\tpHeaderBufPtr += 2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\t}\n\n\t/* padding at front of LLC header. LLC header should at 4-bytes aligment. */\n\tpTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n\t/* For RA Aggregation, */\n\t/* put the 2nd MSDU length(extra 2-byte field) after QOS_CONTROL in little endian format */\n\tpQEntry = pTxBlk->TxPacketList.Head;\n\tpNextPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tnextBufLen = GET_OS_PKT_LEN(pNextPacket);\n\tif (RTMP_GET_PACKET_VLAN(pNextPacket))\n\t\tnextBufLen -= LENGTH_802_1Q;\n\n\t*pHeaderBufPtr = (UCHAR) nextBufLen & 0xff;\n\t*(pHeaderBufPtr + 1) = (UCHAR) (nextBufLen >> 8);\n\n\tpHeaderBufPtr += 2;\n\tpTxBlk->MpduHeaderLen += 2;\n\n\treturn pHeaderBufPtr;\n\n}\n\n\n#ifdef DOT11_N_SUPPORT\nstatic inline PUCHAR STA_Build_AMSDU_Frame_Header(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tPUCHAR pHeaderBufPtr;\n\tHEADER_802_11 *pHeader_802_11;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\tSTABuildCommon802_11Header(pAd, pTxBlk);\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\t/* build QOS Control bytes */\n\t*pHeaderBufPtr =\n\t    (pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.\n\t\t\t\t\t     AckPolicy[pTxBlk->QueIdx] << 5);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\tUAPSD_MR_EOSP_SET(pHeaderBufPtr, pTxBlk);\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t/* A-MSDU packet */\n\t*pHeaderBufPtr |= 0x80;\n\n\t*(pHeaderBufPtr + 1) = 0;\n\tpHeaderBufPtr += 2;\n\tpTxBlk->MpduHeaderLen += 2;\n\n\t/*\n\t   padding at front of LLC header\n\t   LLC header should locate at 4-octets aligment\n\n\t   @@@ MpduHeaderLen excluding padding @@@\n\t */\n\tpTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n\treturn pHeaderBufPtr;\n\n}\n\n\nVOID STA_AMPDU_Frame_Tx(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *pHeader_802_11;\n\tPUCHAR pHeaderBufPtr;\n\tUSHORT FreeNumber = 0;\n\tMAC_TABLE_ENTRY *pMacEntry;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\tBOOLEAN\t\t\tbHTCPlus;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\t\n\tASSERT(pTxBlk);\n\n\twhile (pTxBlk->TxPacketList.Head) {\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\n\t\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\n\t\tpMacEntry = pTxBlk->pMacEntry;\n\t\tif ((pMacEntry->isCached)\n#ifdef TXBF_SUPPORT\n\t\t\t&& (pMacEntry->TxSndgType == SNDG_TYPE_DISABLE)\n#endif // TXBF_SUPPORT //\n\t\t)\n\t\t{\n\t\t\t/* NOTE: Please make sure the size of pMacEntry->CachedBuf[] is smaller than pTxBlk->HeaderBuf[]!!!! */\n#ifndef VENDOR_FEATURE1_SUPPORT\n\t\t\tNdisMoveMemory((PUCHAR)\n\t\t\t\t       (&pTxBlk->HeaderBuf[TXINFO_SIZE]),\n\t\t\t\t       (PUCHAR) (&pMacEntry->CachedBuf[0]),\n\t\t\t\t       TXWISize + sizeof (HEADER_802_11));\n#else\n\t\t\tpTxBlk->HeaderBuf = (UCHAR *) (pMacEntry->HeaderBuf);\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n\t\t\tpHeaderBufPtr =\n\t\t\t    (PUCHAR) (&pTxBlk->\n\t\t\t\t      HeaderBuf[TXINFO_SIZE + TXWISize]);\n\t\t\tSTABuildCache802_11Header(pAd, pTxBlk, pHeaderBufPtr);\n\n#ifdef SOFT_ENCRYPT\n\t\t\tRTMPUpdateSwCacheCipherInfo(pAd, pTxBlk, pHeaderBufPtr);\n#endif /* SOFT_ENCRYPT */\n\t\t} else {\n\t\t\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\t\t\tSTABuildCommon802_11Header(pAd, pTxBlk);\n\n\t\t\tpHeaderBufPtr =\n\t\t\t    &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\t\t}\n\n#ifdef SOFT_ENCRYPT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\t\t/* Check if the original data has enough buffer \n\t\t\t   to insert or append WPI related field. */\n\t\t\tif (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) {\n\t\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n#endif /* SOFT_ENCRYPT */\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\tif (pMacEntry->isCached\n\t\t    && (pMacEntry->Protocol ==\n\t\t\tRTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket))\n#ifdef SOFT_ENCRYPT\n\t\t    && !TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)\n#endif /* SOFT_ENCRYPT */\n#ifdef TXBF_SUPPORT\n\t\t\t&& (pMacEntry->TxSndgType == SNDG_TYPE_DISABLE)\n#endif // TXBF_SUPPORT //\n\t\t\t)\n\t\t{\n\t\t\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t\t\t/* skip common header */\n\t\t\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\t\t\t/* build QOS Control bytes */\n\t\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t\t\tUAPSD_MR_EOSP_SET(pHeaderBufPtr, pTxBlk);\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\tpTxBlk->MpduHeaderLen = pMacEntry->MpduHeaderLen;\n\t\t\tpHeaderBufPtr =\n\t\t\t    ((PUCHAR) pHeader_802_11) + pTxBlk->MpduHeaderLen;\n\n\t\t\tpTxBlk->HdrPadLen = pMacEntry->HdrPadLen;\n\n\t\t\t/* skip 802.3 header */\n\t\t\tpTxBlk->pSrcBufData =\n\t\t\t    pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_3;\n\n\t\t\t/* skip vlan tag */\n\t\t\tif (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket)) {\n\t\t\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t\t\t}\n\t\t}\n\t\telse\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\t\t{\n\t\t\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t\t\t/* skip common header */\n\t\t\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\t\t\t/*\n\t\t\t   build QOS Control bytes\n\t\t\t */\n\t\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t\t\tUAPSD_MR_EOSP_SET(pHeaderBufPtr, pTxBlk);\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t*(pHeaderBufPtr + 1) = 0;\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += 2;\n\n\t\t\t/*\n\t\t\t   build HTC+ \n\t\t\t   HTC control field following QoS field\n\t\t\t */\n\t\t\tbHTCPlus = FALSE;\n\n\t\t\tif ((pAd->CommonCfg.bRdg == TRUE)\n\t\t\t    && CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_RDG_CAPABLE)\n#ifdef TXBF_SUPPORT\n\t\t\t\t&& (pMacEntry->TxSndgType != SNDG_TYPE_NDP)\n#endif /* TXBF_SUPPORT */\n\t\t\t)\n\t\t\t{\n\t\t\t\tif (pMacEntry->isCached == FALSE)\n\t\t\t\t{\n\t\t\t\t\t/* mark HTC bit */\n\t\t\t\t\tpHeader_802_11->FC.Order = 1;\n\n\t\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->RDG = 1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbHTCPlus = TRUE;\n\t\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\t\tpTxBlk->TxSndgPkt = SNDG_TYPE_DISABLE;\n\n\t\t\tNdisAcquireSpinLock(&pMacEntry->TxSndgLock);\t\n\t\t\tif (pMacEntry->TxSndgType >= SNDG_TYPE_SOUNDING)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"--Sounding in AMPDU: TxSndgType=%d, MCS=%d\\n\",\n\t\t\t\t\t\t\t\tpMacEntry->TxSndgType,\n\t\t\t\t\t\t\t\tpMacEntry->TxSndgType==SNDG_TYPE_NDP? pMacEntry->sndgMcs: pTxBlk->pTransmit->field.MCS));\n\n\t\t\t\t// Set HTC bit\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t}\n\t\n\t\t\t\tif (pMacEntry->TxSndgType == SNDG_TYPE_SOUNDING)\n\t\t\t\t{\n\t\t\t\t\t// Select compress if supported. Otherwise select noncompress\n\t\t\t\t\tif (pAd->CommonCfg.ETxBfNoncompress==0 &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) )\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t}\n\t\t\t\telse if (pMacEntry->TxSndgType == SNDG_TYPE_NDP)\n\t\t\t\t{\n\t\t\t\t\t// Select compress if supported. Otherwise select noncompress\n\t\t\t\t\tif (pAd->CommonCfg.ETxBfNoncompress==0 &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ExpComBF>0) &&\n\t\t\t\t\t\t(pMacEntry->HTCapability.TxBFCap.ComSteerBFAntSup >= (pMacEntry->sndgMcs/8))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 3;\n\t\t\t\t\telse\n\t\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->CSISTEERING = 2;\n\n\t\t\t\t\t// Set NDP Announcement\n\t\t\t\t\t((PHT_CONTROL)pHeaderBufPtr)->NDPAnnounce = 1;\n\n\t\t\t\t\tpTxBlk->TxNDPSndgBW = pMacEntry->sndgBW;\n\t\t\t\t\tpTxBlk->TxNDPSndgMcs = pMacEntry->sndgMcs;\n\t\t\t\t}\n\t\n\t\t\t\tpTxBlk->TxSndgPkt = pMacEntry->TxSndgType;\n\t\t\t\tpMacEntry->TxSndgType = SNDG_TYPE_DISABLE;\n\t\t\t}\n\t\t\t\n\t\t\tNdisReleaseSpinLock(&pMacEntry->TxSndgLock);\n\t\t\t\t\n#ifdef MFB_SUPPORT\n#if defined(MRQ_FORCE_TX)//have to replace this by the correct condition!!!\n\t\t\tpMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_MRQ;\n#endif\n\t\t\tif ((pMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ) &&\n\t\t\t\t\t(pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE))//because the signal format of sounding frmae may be different from normal data frame, which may result in different MFB\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t}\n\t\t\t\tMFB_PerPareMRQ(pAd, pHeaderBufPtr, pMacEntry);\n\t\t\t}\n\n\t\t\tif (pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback >=MCSFBK_MRQ && pMacEntry->toTxMfb == 1)\n\t\t\t{\n\t\t\t\tif (bHTCPlus == FALSE)\n\t\t\t\t{\n\t\t\t\t\tbHTCPlus = TRUE;\n\t\t\t\t\tNdisZeroMemory(pHeaderBufPtr, sizeof(HT_CONTROL));\n\t\t\t\t}\n\t\t\t\tMFB_PerPareMFB(pAd, pHeaderBufPtr, pMacEntry);// not complete yet!!!\n\t\t\t\tpMacEntry->toTxMfb = 0;\n\t\t\t}\n#endif // MFB_SUPPORT //\n#endif // TXBF_SUPPORT //\n\n\t\t\tif (bHTCPlus)\n\t\t\t{\n\t\t\t\tpHeader_802_11->FC.Order = 1;\n\t\t\t\tpHeaderBufPtr += 4;\n\t\t\t\tpTxBlk->MpduHeaderLen += 4;\n\t\t\t}\n\n\t\t\t/* pTxBlk->MpduHeaderLen = pHeaderBufPtr - pTxBlk->HeaderBuf - TXWI_SIZE - TXINFO_SIZE; */\n\t\t\tASSERT(pTxBlk->MpduHeaderLen >= 24);\n\n\t\t\t/* skip 802.3 header */\n\t\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_3;\n\n\t\t\t/* skip vlan tag */\n\t\t\tif (bVLANPkt) {\n\t\t\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t   padding at front of LLC header\n\t\t\t   LLC header should locate at 4-octets aligment\n\n\t\t\t   @@@ MpduHeaderLen excluding padding @@@\n\t\t\t */\n\t\t\tpTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;\n\t\t\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\t\t\tpTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\t\tpMacEntry->HdrPadLen = pTxBlk->HdrPadLen;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n#ifdef SOFT_ENCRYPT\n\t\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\t\t\tUCHAR iv_offset = 0, ext_offset = 0;\n\n\t\t\t\t/*\n\t\t\t\t   if original Ethernet frame contains no LLC/SNAP, \n\t\t\t\t   then an extra LLC/SNAP encap is required\n\t\t\t\t */\n\t\t\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t\t\t    pTxBlk->pExtraLlcSnapEncap);\n\n\t\t\t\t/* Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer */\n\t\t\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\t\t\t/* Reserve the front 8 bytes of data for LLC header */\n\t\t\t\t\tpTxBlk->pSrcBufData -= LENGTH_802_1_H;\n\t\t\t\t\tpTxBlk->SrcBufLen += LENGTH_802_1_H;\n\n\t\t\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData,\n\t\t\t\t\t\t       pTxBlk->\n\t\t\t\t\t\t       pExtraLlcSnapEncap, 6);\n\t\t\t\t}\n\n\t\t\t\t/* Construct and insert specific IV header to MPDU header */\n\t\t\t\tRTMPSoftConstructIVHdr(pTxBlk->CipherAlg,\n\t\t\t\t\t\t       pTxBlk->KeyIdx,\n\t\t\t\t\t\t       pTxBlk->pKey->TxTsc,\n\t\t\t\t\t\t       pHeaderBufPtr,\n\t\t\t\t\t\t       &iv_offset);\n\t\t\t\tpHeaderBufPtr += iv_offset;\n\t\t\t\tpTxBlk->MpduHeaderLen += iv_offset;\n\n\t\t\t\t/* Encrypt the MPDU data by software */\n\t\t\t\tRTMPSoftEncryptionAction(pAd,\n\t\t\t\t\t\t\t pTxBlk->CipherAlg,\n\t\t\t\t\t\t\t (PUCHAR)\n\t\t\t\t\t\t\t pHeader_802_11,\n\t\t\t\t\t\t\t pTxBlk->pSrcBufData,\n\t\t\t\t\t\t\t pTxBlk->SrcBufLen,\n\t\t\t\t\t\t\t pTxBlk->KeyIdx,\n\t\t\t\t\t\t\t pTxBlk->pKey,\n\t\t\t\t\t\t\t &ext_offset);\n\t\t\t\tpTxBlk->SrcBufLen += ext_offset;\n\t\t\t\tpTxBlk->TotalFrameLen += ext_offset;\n\n\t\t\t} else\n#endif /* SOFT_ENCRYPT */\n\t\t\t{\n\n\t\t\t\t/*\n\t\t\t\t   Insert LLC-SNAP encapsulation - 8 octets\n\t\t\t\t */\n\t\t\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t\t\t    pTxBlk->pExtraLlcSnapEncap);\n\t\t\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t\t\t       pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\t\t\tpHeaderBufPtr += 6;\n\t\t\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t\t\t       pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t       2);\n\t\t\t\t\tpHeaderBufPtr += 2;\n\t\t\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t\t\t}\n\n\t\t\t}\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\t\tpMacEntry->Protocol =\n\t\t\t    RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket);\n\t\t\tpMacEntry->MpduHeaderLen = pTxBlk->MpduHeaderLen;\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\t\t}\n\n\t\tif ((pMacEntry->isCached)\n#ifdef TXBF_SUPPORT\n\t\t\t&& (pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE)\n#endif // TXBF_SUPPORT //\n\t\t)\n\t\t{\n\t\t\tRTMPWriteTxWI_Cache(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\t\t} else {\n\t\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\t\t\tNdisZeroMemory((PUCHAR) (&pMacEntry->CachedBuf[0]), sizeof (pMacEntry->CachedBuf));\n\t\t\tNdisMoveMemory((PUCHAR) (&pMacEntry->CachedBuf[0]), (PUCHAR) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), (pHeaderBufPtr -(PUCHAR) (&pTxBlk->HeaderBuf[TXINFO_SIZE])));\n\n#ifdef VENDOR_FEATURE1_SUPPORT\n\t\t\t/* use space to get performance enhancement */\n\t\t\tNdisZeroMemory((PUCHAR) (&pMacEntry->HeaderBuf[0]), sizeof (pMacEntry->HeaderBuf));\n\t\t\tNdisMoveMemory((PUCHAR) (&pMacEntry->HeaderBuf[0]),\n\t\t\t\t       (PUCHAR) (&pTxBlk->HeaderBuf[0]),\n\t\t\t\t       (pHeaderBufPtr - (PUCHAR) (&pTxBlk->HeaderBuf[0])));\n#endif /* VENDOR_FEATURE1_SUPPORT */\n\n\t\t\tpMacEntry->isCached = TRUE;\n\t\t}\n\n#ifdef TXBF_SUPPORT\n\t\tif (pTxBlk->TxSndgPkt != SNDG_TYPE_DISABLE)\n\t\t\tpMacEntry->isCached = FALSE;\n#endif // TXBF_SUPPORT //\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t/* calculate Transmitted AMPDU count and ByteCount  */\n\t\t{\n\t\t\tpAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart++;\n\t\t\tpAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen;\n\t\t}\n#endif /* STATS_COUNT_SUPPORT */\n\t\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/* Kick out Tx */\n#ifdef PCIE_PS_SUPPORT\n\t\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\t}\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID STA_AMPDU_Frame_Tx_Hdr_Trns(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *pHeader_802_11;\n\tUCHAR *pWiBufPtr;\n\tUSHORT FreeNumber = 0;\n\tMAC_TABLE_ENTRY *pMacEntry;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\tBOOLEAN\t\t\tbHTCPlus;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tPWIFI_INFO_STRUC pWI;\n\t\n\tASSERT(pTxBlk);\n\n\twhile (pTxBlk->TxPacketList.Head) {\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\n\t\tpTxBlk->NeedTrans = TRUE;\n\n\t\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\n\t\tpMacEntry = pTxBlk->pMacEntry;\n\n\t\tif ((pMacEntry->isCached))\n\t\t{\n\t\t\t/* NOTE: Please make sure the size of pMacEntry->CachedBuf[] is smaller than pTxBlk->HeaderBuf[]!!!! */\n\t\t\tNdisMoveMemory((PUCHAR)\n\t\t\t\t       (&pTxBlk->HeaderBuf[TXINFO_SIZE]),\n\t\t\t\t       (PUCHAR) (&pMacEntry->CachedBuf[0]),\n\t\t\t\t       TXWISize + WIFI_INFO_SIZE);\n\n\t\t\tpWiBufPtr = (PUCHAR) (&pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize]);\n\n\t\t\tSTABuildCacheWifiInfo(pAd, pTxBlk, pWiBufPtr);\n\n\t\t} else {\n\t\t\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\n\t\t\tSTABuildWifiInfo(pAd, pTxBlk);\n\n\t\t\tpWiBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\t\t}\n\n\t\tpWI = (PWIFI_INFO_STRUC)pWiBufPtr;\n\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader;\n\n\t\tif (bVLANPkt)\n\t\t\tpWI->field.VLAN = TRUE;\n\t\n\t\tpWI->field.TID = (pTxBlk->UserPriority & 0x0F);\n\n\n\t\t{\n\t\t\t/*\n\t\t\t   build HTC+ \n\t\t\t   HTC control field following QoS field\n\t\t\t */\n\t\t\tbHTCPlus = FALSE;\n\n\t\t\tif ((pAd->CommonCfg.bRdg == TRUE)\n\t\t\t    && CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_RDG_CAPABLE)\n\t\t\t)\n\t\t\t{\n\t\t\t\tif (pMacEntry->isCached == FALSE)\n\t\t\t\t{\n\t\t\t\t\t/* mark HTC bit */\n\t\t\t\t\tpWI->field.RDG = 1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbHTCPlus = TRUE;\n\t\t\t}\n\n\t\t}\n\n\t\tif ((pMacEntry->isCached))\n\t\t{\n\t\t\tRTMPWriteTxWI_Cache(pAd,\n\t\t\t\t\t    (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]),\n\t\t\t\t\t    pTxBlk);\n\t\t} else {\n\t\t\tRTMPWriteTxWI_Data(pAd,\n\t\t\t\t\t   (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]),\n\t\t\t\t\t   pTxBlk);\n\n\t\t\tNdisZeroMemory((PUCHAR) (&pMacEntry->CachedBuf[0]),\n\t\t\t\t       sizeof (pMacEntry->CachedBuf));\n\t\t\tNdisMoveMemory((PUCHAR) (&pMacEntry->CachedBuf[0]),\n\t\t\t\t       (PUCHAR) (&pTxBlk->HeaderBuf[TXINFO_SIZE]),\n\t\t\t\t       TXWISize + WIFI_INFO_SIZE);\n\n\n\t\t\tpMacEntry->isCached = TRUE;\n\t\t}\n\n#ifdef STATS_COUNT_SUPPORT\n\t\t/* calculate Transmitted AMPDU count and ByteCount  */\n\t\t{\n\t\t\tpAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart++;\n\t\t\tpAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen;\n\t\t}\n#endif /* STATS_COUNT_SUPPORT */\n\t\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\t/* Kick out Tx */\n#ifdef PCIE_PS_SUPPORT\n\t\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\t}\n\n}\n#endif /* HDR_TRANS_SUPPORT */\n\n\nVOID STA_AMSDU_Frame_Tx(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tPUCHAR pHeaderBufPtr;\n\tUSHORT FreeNumber = 0;\n\tUSHORT subFramePayloadLen = 0;\t/* AMSDU Subframe length without AMSDU-Header / Padding */\n\tUSHORT totalMPDUSize = 0;\n\tUCHAR *subFrameHeader;\n\tUCHAR padding = 0;\n\tUSHORT FirstTx = 0, LastTxIdx = 0;\n\tBOOLEAN bVLANPkt;\n\tint frameNum = 0;\n\tPQUEUE_ENTRY pQEntry;\n\n\n\tASSERT(pTxBlk);\n\n\tASSERT((pTxBlk->TxPacketList.Number > 1));\n\n\twhile (pTxBlk->TxPacketList.Head) {\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\n\t\tbVLANPkt =\n\t\t    (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\n\t\t/* skip 802.3 header */\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\tpTxBlk->SrcBufLen -= LENGTH_802_3;\n\n\t\t/* skip vlan tag */\n\t\tif (bVLANPkt) {\n\t\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t\t}\n\n\t\tif (frameNum == 0) {\n\t\t\tpHeaderBufPtr = STA_Build_AMSDU_Frame_Header(pAd, pTxBlk);\n\n\t\t\t/* NOTE: TxWI->TxWIMPDUByteCnt will be updated after final frame was handled. */\n\t\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\t\t} else {\n\t\t\tpHeaderBufPtr = &pTxBlk->HeaderBuf[0];\n\t\t\tpadding = ROUND_UP(LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen, 4) - \n\t\t\t\t\t\t\t\t(LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen);\n\t\t\tNdisZeroMemory(pHeaderBufPtr, padding + LENGTH_AMSDU_SUBFRAMEHEAD);\n\t\t\tpHeaderBufPtr += padding;\n\t\t\tpTxBlk->MpduHeaderLen = padding;\n\t\t}\n\n\t\t/*\n\t\t   A-MSDU subframe\n\t\t   DA(6)+SA(6)+Length(2) + LLC/SNAP Encap\n\t\t */\n\t\tsubFrameHeader = pHeaderBufPtr;\n\t\tsubFramePayloadLen = pTxBlk->SrcBufLen;\n\n\t\tNdisMoveMemory(subFrameHeader, pTxBlk->pSrcBufHeader, 12);\n\n\n\t\tpHeaderBufPtr += LENGTH_AMSDU_SUBFRAMEHEAD;\n\t\tpTxBlk->MpduHeaderLen += LENGTH_AMSDU_SUBFRAMEHEAD;\n\n\t\t/* Insert LLC-SNAP encapsulation - 8 octets */\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t    pTxBlk->pExtraLlcSnapEncap);\n\n\t\tsubFramePayloadLen = pTxBlk->SrcBufLen;\n\n\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t       pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\tpHeaderBufPtr += 6;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData - 2,\n\t\t\t\t       2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t\tsubFramePayloadLen += LENGTH_802_1_H;\n\t\t}\n\n\t\t/* update subFrame Length field */\n\t\tsubFrameHeader[12] = (subFramePayloadLen & 0xFF00) >> 8;\n\t\tsubFrameHeader[13] = subFramePayloadLen & 0xFF;\n\n\t\ttotalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;\n\n\t\tif (frameNum == 0)\n\t\t\tFirstTx =\n\t\t\t    HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,\n\t\t\t\t\t\t     &FreeNumber);\n\t\telse\n\t\t\tLastTxIdx =\n\t\t\t    HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,\n\t\t\t\t\t\t     &FreeNumber);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), NULL);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\tframeNum++;\n\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t\t/* calculate Transmitted AMSDU Count and ByteCount */\n\t\t{\n\t\t\tpAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart++;\n\t\t\tpAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart +=\n\t\t\t    totalMPDUSize;\n\t\t}\n\n\t}\n\n\tHAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx);\n\tHAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx);\n\n\t/* Kick out Tx */\n#ifdef PCIE_PS_SUPPORT\n\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nVOID STA_Legacy_Frame_Tx(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *wifi_hdr;\n\tUCHAR *pHeaderBufPtr;\n\tUSHORT FreeNumber = 0;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tASSERT(pTxBlk);\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n#ifdef STATS_COUNT_SUPPORT\n\tif (pTxBlk->TxFrameType == TX_MCAST_FRAME) {\n\t\tINC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount);\n\t}\n#endif /* STATS_COUNT_SUPPORT */\n\n\tif (RTMP_GET_PACKET_RTS(pTxBlk->pPacket))\n\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bRtsRequired);\n\telse\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bRtsRequired);\n\n\tif (pTxBlk->TxRate < pAd->CommonCfg.MinTxRate)\n\t\tpTxBlk->TxRate = pAd->CommonCfg.MinTxRate;\n\n\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\tSTABuildCommon802_11Header(pAd, pTxBlk);\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\t/* Check if the original data has enough buffer \n\t\t   to insert or append WPI related field. */\n\t\tif (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\t/* skip 802.3 header */\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\tpTxBlk->SrcBufLen -= LENGTH_802_3;\n\n\t/* skip vlan tag */\n\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\tif (bVLANPkt) {\n\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t}\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize + TSO_SIZE];\n\twifi_hdr = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) {\n\t\t/* build QOS Control bytes */\n\t\t*(pHeaderBufPtr) =\n\t\t    ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] << 5));\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_MR_EOSP_SET(pHeaderBufPtr, pTxBlk);\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t*(pHeaderBufPtr + 1) = 0;\n\t\tpHeaderBufPtr += 2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\t}\n\n\t/* The remaining content of MPDU header should locate at 4-octets aligment */\n\tpTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\tUCHAR iv_offset = 0, ext_offset = 0;\n\n\t\t/*\n\t\t   if original Ethernet frame contains no LLC/SNAP, \n\t\t   then an extra LLC/SNAP encap is required \n\t\t */\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t    pTxBlk->pExtraLlcSnapEncap);\n\n\t\t/* Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer */\n\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\t/* Reserve the front 8 bytes of data for LLC header */\n\t\t\tpTxBlk->pSrcBufData -= LENGTH_802_1_H;\n\t\t\tpTxBlk->SrcBufLen += LENGTH_802_1_H;\n\n\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData,\n\t\t\t\t       pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t}\n\n\t\t/* Construct and insert specific IV header to MPDU header */\n\t\tRTMPSoftConstructIVHdr(pTxBlk->CipherAlg,\n\t\t\t\t       pTxBlk->KeyIdx,\n\t\t\t\t       pTxBlk->pKey->TxTsc,\n\t\t\t\t       pHeaderBufPtr, &iv_offset);\n\t\tpHeaderBufPtr += iv_offset;\n\t\tpTxBlk->MpduHeaderLen += iv_offset;\n\n\t\t/* Encrypt the MPDU data by software */\n\t\tRTMPSoftEncryptionAction(pAd,\n\t\t\t\t\t pTxBlk->CipherAlg,\n\t\t\t\t\t (UCHAR *)wifi_hdr,\n\t\t\t\t\t pTxBlk->pSrcBufData,\n\t\t\t\t\t pTxBlk->SrcBufLen,\n\t\t\t\t\t pTxBlk->KeyIdx,\n\t\t\t\t\t pTxBlk->pKey, &ext_offset);\n\t\tpTxBlk->SrcBufLen += ext_offset;\n\t\tpTxBlk->TotalFrameLen += ext_offset;\n\n\t}\n\telse\n#endif /* SOFT_ENCRYPT */\n\t{\n\n\t\t/*\n\t\t   Insert LLC-SNAP encapsulation - 8 octets\n\n\t\t   if original Ethernet frame contains no LLC/SNAP, \n\t\t   then an extra LLC/SNAP encap is required \n\t\t */\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader,\n\t\t\t\t\t\t   pTxBlk->pExtraLlcSnapEncap);\n\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\tUCHAR vlan_size;\n\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\tpHeaderBufPtr += 6;\n\t\t\t/* skip vlan tag */\n\t\t\tvlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t       pTxBlk->pSrcBufHeader + 12 + vlan_size,\n\t\t\t\t       2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t}\n\n\t}\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\tif (ADHOC_ON(pAd)\n\t    && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t    && (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)\n\t    && (!pTxBlk->pMacEntry)) {\n\t\t/* use Wcid as Hardware Key Index */\n\t\tGET_GroupKey_WCID(pAd, pTxBlk->Wcid, BSS0);\n\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\n\t/*\n\t   prepare for TXWI\n\t   use Wcid as Key Index\n\t */\n\n\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)wifi_hdr);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t/*\n\t   Kick out Tx\n\t */\n#ifdef PCIE_PS_SUPPORT\n\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n}\n\n\n#ifdef HDR_TRANS_SUPPORT\nVOID STA_Legacy_Frame_Tx_Hdr_Trns(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tPUCHAR pHeaderBufPtr;\n\tUSHORT FreeNumber = 0;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\tPWIFI_INFO_STRUC pWI;\n\n\tASSERT(pTxBlk);\n\n\t//printk(\"STA_Legacy_Frame_Tx_Hdr_Trns\\n\");\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\tpTxBlk->NeedTrans = TRUE;\n\n#ifdef STATS_COUNT_SUPPORT\n\tif (pTxBlk->TxFrameType == TX_MCAST_FRAME) {\n\t\tINC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount);\n\t}\n#endif /* STATS_COUNT_SUPPORT */\n\n\n\tif (RTMP_GET_PACKET_RTS(pTxBlk->pPacket))\n\t\tTX_BLK_SET_FLAG(pTxBlk, fTX_bRtsRequired);\n\telse\n\t\tTX_BLK_CLEAR_FLAG(pTxBlk, fTX_bRtsRequired);\n\n\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\n\tif (pTxBlk->TxRate < pAd->CommonCfg.MinTxRate)\n\t\tpTxBlk->TxRate = pAd->CommonCfg.MinTxRate;\n\n\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\tSTABuildWifiInfo(pAd, pTxBlk);\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\n\tpWI = (PWIFI_INFO_STRUC)pHeaderBufPtr;\n\n\t//hex_dump(\"wifi info:\", pWI, sizeof(WIFI_INFO_STRUC));\n\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader;\n\n\t//hex_dump(\"pSrcBufData\" , pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);\n\n\tif(bVLANPkt)\n\t\tpWI->field.VLAN = TRUE;\n\n\tpWI->field.TID = (pTxBlk->UserPriority & 0x0F);\n\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n\tif (ADHOC_ON(pAd)\n\t    && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n\t    && (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)\n\t    && (!pTxBlk->pMacEntry)) {\n\t\t/* use Wcid as Hardware Key Index */\n\t\tGET_GroupKey_WCID(pAd, pTxBlk->Wcid, BSS0);\n\t}\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\n\t/*\n\t   prepare for TXWI\n\t   use Wcid as Key Index\n\t */\n\n\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\tHAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\tpAd->RalinkCounters.KickTxCount++;\n\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t/*\n\t   Kick out Tx\n\t */\n#ifdef PCIE_PS_SUPPORT\n\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n}\n#endif\n\n\nVOID STA_ARalink_Frame_Tx(\n\tIN PRTMP_ADAPTER pAd,\n\tIN TX_BLK * pTxBlk)\n{\n\tPUCHAR pHeaderBufPtr;\n\tUSHORT freeCnt = 0;\n\tUSHORT totalMPDUSize = 0;\n\tUSHORT FirstTx, LastTxIdx;\n\tint frameNum = 0;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\n\tASSERT(pTxBlk);\n\n\tASSERT((pTxBlk->TxPacketList.Number == 2));\n\n\tFirstTx = LastTxIdx = 0;\t/* Is it ok init they as 0? */\n\twhile (pTxBlk->TxPacketList.Head) {\n\t\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\n\t\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\tcontinue;\n\t\t}\n\n\t\tbVLANPkt =\n\t\t    (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\n\t\t/* skip 802.3 header */\n\t\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\t\tpTxBlk->SrcBufLen -= LENGTH_802_3;\n\n\t\t/* skip vlan tag */\n\t\tif (bVLANPkt) {\n\t\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t\t}\n\n\t\tif (frameNum == 0) {\t/* For first frame, we need to create the 802.11 header + padding(optional) + RA-AGG-LEN + SNAP Header */\n\n\t\t\tpHeaderBufPtr =\n\t\t\t    STA_Build_ARalink_Frame_Header(pAd, pTxBlk);\n\n\t\t\t/*\n\t\t\t   It's ok write the TxWI here, because the TxWI->TxWIMPDUByteCnt \n\t\t\t   will be updated after final frame was handled.\n\t\t\t */\n\t\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\n\n\t\t\t/*\n\t\t\t   Insert LLC-SNAP encapsulation - 8 octets\n\t\t\t */\n\t\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t\t    pTxBlk->pExtraLlcSnapEncap);\n\n\t\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t\t       pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\t\tpHeaderBufPtr += 6;\n\t\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData - 2, 2);\n\t\t\t\tpHeaderBufPtr += 2;\n\t\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t\t}\n\t\t} else {\t/* For second aggregated frame, we need create the 802.3 header to headerBuf, because PCI will copy it to SDPtr0. */\n\n\t\t\tpHeaderBufPtr = &pTxBlk->HeaderBuf[0];\n\t\t\tpTxBlk->MpduHeaderLen = 0;\n\n\t\t\t/* \n\t\t\t   A-Ralink sub-sequent frame header is the same as 802.3 header.\n\t\t\t   DA(6)+SA(6)+FrameType(2)\n\t\t\t */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader,\n\t\t\t\t       12);\n\t\t\tpHeaderBufPtr += 12;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData - 2,\n\t\t\t\t       2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen = LENGTH_ARALINK_SUBFRAMEHEAD;\n\t\t}\n\n\t\ttotalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;\n\n\t\t/* FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); */\n\t\tif (frameNum == 0)\n\t\t\tFirstTx =\n\t\t\t    HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,\n\t\t\t\t\t\t     &freeCnt);\n\t\telse\n\t\t\tLastTxIdx =\n\t\t\t    HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,\n\t\t\t\t\t\t     &freeCnt);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), NULL);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\tframeNum++;\n\n\t\tpAd->RalinkCounters.OneSecTxAggregationCount++;\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t}\n\n\tHAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx);\n\tHAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx);\n\n\t/*\n\t   Kick out Tx\n\t */\n#ifdef PCIE_PS_SUPPORT\n\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n\n}\n\n\nVOID STA_Fragment_Frame_Tx(\n\tIN RTMP_ADAPTER *pAd,\n\tIN TX_BLK *pTxBlk)\n{\n\tHEADER_802_11 *pHeader_802_11;\n\tPUCHAR pHeaderBufPtr;\n\tUSHORT freeCnt = 0;\n\tUCHAR fragNum = 0;\n\tPACKET_INFO PacketInfo;\n\tUSHORT EncryptionOverhead = 0;\n\tUINT32 FreeMpduSize, SrcRemainingBytes;\n\tUSHORT AckDuration;\n\tUINT NextMpduSize;\n\tBOOLEAN bVLANPkt;\n\tPQUEUE_ENTRY pQEntry;\n\tHTTRANSMIT_SETTING *pTransmit;\n#ifdef SOFT_ENCRYPT\n\tPUCHAR tmp_ptr = NULL;\n\tUINT32 buf_offset = 0;\n#endif /* SOFT_ENCRYPT */\n\tUINT8 TXWISize = pAd->chipCap.TXWISize;\n\n\tASSERT(pTxBlk);\n\n\tpQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);\n\tpTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\tif (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {\n\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);\n\t\treturn;\n\t}\n\n\tASSERT(TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag));\n\tbVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);\n\n\tSTAFindCipherAlgorithm(pAd, pTxBlk);\n\tSTABuildCommon802_11Header(pAd, pTxBlk);\n\n#ifdef SOFT_ENCRYPT\n\t/*\n\t   Check if the original data has enough buffer \n\t   to insert or append extended field.\n\t */\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\tif (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) {\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\tif (pTxBlk->CipherAlg == CIPHER_TKIP) {\n\t\tpTxBlk->pPacket =\n\t\t    duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket);\n\t\tif (pTxBlk->pPacket == NULL)\n\t\t\treturn;\n\t\tRTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo,\n\t\t\t\t     &pTxBlk->pSrcBufHeader,\n\t\t\t\t     &pTxBlk->SrcBufLen);\n\t}\n\n\t/* skip 802.3 header */\n\tpTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;\n\tpTxBlk->SrcBufLen -= LENGTH_802_3;\n\n\t/* skip vlan tag */\n\tif (bVLANPkt) {\n\t\tpTxBlk->pSrcBufData += LENGTH_802_1Q;\n\t\tpTxBlk->SrcBufLen -= LENGTH_802_1Q;\n\t}\n\n\tpHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWISize];\n\tpHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;\n\n\t/* skip common header */\n\tpHeaderBufPtr += pTxBlk->MpduHeaderLen;\n\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) {\n\t\t/*\n\t\t   build QOS Control bytes\n\t\t */\n\t\t*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef UAPSD_SUPPORT\n\t\tUAPSD_MR_EOSP_SET(pHeaderBufPtr, pTxBlk);\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\t*(pHeaderBufPtr + 1) = 0;\n\t\tpHeaderBufPtr += 2;\n\t\tpTxBlk->MpduHeaderLen += 2;\n\t}\n\n\t/*\n\t   padding at front of LLC header\n\t   LLC header should locate at 4-octets aligment\n\t */\n\tpTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;\n\tpHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);\n\tpTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\tUCHAR iv_offset = 0;\n\n\t\t/* if original Ethernet frame contains no LLC/SNAP, */\n\t\t/* then an extra LLC/SNAP encap is required */\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,\n\t\t\t\t\t\t    pTxBlk->pExtraLlcSnapEncap);\n\n\t\t/* Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer */\n\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\t/* Reserve the front 8 bytes of data for LLC header */\n\t\t\tpTxBlk->pSrcBufData -= LENGTH_802_1_H;\n\t\t\tpTxBlk->SrcBufLen += LENGTH_802_1_H;\n\n\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData,\n\t\t\t\t       pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t}\n\n\t\t/* Construct and insert specific IV header to MPDU header */\n\t\tRTMPSoftConstructIVHdr(pTxBlk->CipherAlg,\n\t\t\t\t       pTxBlk->KeyIdx,\n\t\t\t\t       pTxBlk->pKey->TxTsc,\n\t\t\t\t       pHeaderBufPtr, &iv_offset);\n\t\tpHeaderBufPtr += iv_offset;\n\t\tpTxBlk->MpduHeaderLen += iv_offset;\n\n\t} else\n#endif /* SOFT_ENCRYPT */\n\t{\n\n\n\t\t/*\n\t\t   Insert LLC-SNAP encapsulation - 8 octets\n\n\t\t   if original Ethernet frame contains no LLC/SNAP, \n\t\t   then an extra LLC/SNAP encap is required \n\t\t */\n\t\tEXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader,\n\t\t\t\t\t\t   pTxBlk->pExtraLlcSnapEncap);\n\t\tif (pTxBlk->pExtraLlcSnapEncap) {\n\t\t\tUCHAR vlan_size;\n\n\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t       pTxBlk->pExtraLlcSnapEncap, 6);\n\t\t\tpHeaderBufPtr += 6;\n\t\t\t/* skip vlan tag */\n\t\t\tvlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0;\n\t\t\t/* get 2 octets (TypeofLen) */\n\t\t\tNdisMoveMemory(pHeaderBufPtr,\n\t\t\t\t       pTxBlk->pSrcBufHeader + 12 + vlan_size,\n\t\t\t\t       2);\n\t\t\tpHeaderBufPtr += 2;\n\t\t\tpTxBlk->MpduHeaderLen += LENGTH_802_1_H;\n\t\t}\n\t}\n\n\t/*\n\t   If TKIP is used and fragmentation is required. Driver has to\n\t   append TKIP MIC at tail of the scatter buffer\n\t   MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC\n\t */\n\tif (pTxBlk->CipherAlg == CIPHER_TKIP) {\n\t\tRTMPCalculateMICValue(pAd, pTxBlk->pPacket,\n\t\t\t\t      pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey,\n\t\t\t\t      0);\n\n\t\t/*\n\t\t   NOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust\n\t\t   to correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress. \n\t\t */\n\t\tNdisMoveMemory(pTxBlk->pSrcBufData + pTxBlk->SrcBufLen,\n\t\t\t       &pAd->PrivateInfo.Tx.MIC[0], 8);\n\t\tpTxBlk->SrcBufLen += 8;\n\t\tpTxBlk->TotalFrameLen += 8;\n\t}\n\n\t/*\n\t   calcuate the overhead bytes that encryption algorithm may add. This\n\t   affects the calculate of \"duration\" field\n\t */\n\tif ((pTxBlk->CipherAlg == CIPHER_WEP64)\n\t    || (pTxBlk->CipherAlg == CIPHER_WEP128))\n\t\tEncryptionOverhead = 8;\t/* WEP: IV[4] + ICV[4]; */\n\telse if (pTxBlk->CipherAlg == CIPHER_TKIP)\n\t\tEncryptionOverhead = 12;\t/* TKIP: IV[4] + EIV[4] + ICV[4], MIC will be added to TotalPacketLength */\n\telse if (pTxBlk->CipherAlg == CIPHER_AES)\n\t\tEncryptionOverhead = 16;\t/* AES: IV[4] + EIV[4] + MIC[8] */\n#ifdef WAPI_SUPPORT\n\telse if (pTxBlk->CipherAlg == CIPHER_SMS4)\n\t\tEncryptionOverhead = 16;\t/* SMS4: MIC[16] */\n#endif /* WAPI_SUPPORT */\n\telse\n\t\tEncryptionOverhead = 0;\n\n\tpTransmit = pTxBlk->pTransmit;\n\t/* Decide the TX rate */\n\tif (pTransmit->field.MODE == MODE_CCK)\n\t\tpTxBlk->TxRate = pTransmit->field.MCS;\n\telse if (pTransmit->field.MODE == MODE_OFDM)\n\t\tpTxBlk->TxRate = pTransmit->field.MCS + RATE_FIRST_OFDM_RATE;\n\telse\n\t\tpTxBlk->TxRate = RATE_6_5;\n\n\t/* decide how much time an ACK/CTS frame will consume in the air */\n\tif (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE)\n\t\tAckDuration =\n\t\t    RTMPCalcDuration(pAd,\n\t\t\t\t     pAd->CommonCfg.ExpectedACKRate[pTxBlk->TxRate],\n\t\t\t\t     14);\n\telse\n\t\tAckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14);\n\n\t/* Init the total payload length of this frame. */\n\tSrcRemainingBytes = pTxBlk->SrcBufLen;\n\n\tpTxBlk->TotalFragNum = 0xff;\n\n#ifdef SOFT_ENCRYPT\n\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\t/* store the outgoing frame for calculating MIC per fragmented frame */\n\t\tos_alloc_mem(pAd, (PUCHAR *) & tmp_ptr, pTxBlk->SrcBufLen);\n\t\tif (tmp_ptr == NULL) {\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"!!!%s : no memory for SW MIC calculation !!!\\n\",\n\t\t\t\t  __FUNCTION__));\n\t\t\tRELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,\n\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\treturn;\n\t\t}\n\t\tNdisMoveMemory(tmp_ptr, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);\n\t}\n#endif /* SOFT_ENCRYPT */\n\n\tdo {\n\t\tFreeMpduSize = pAd->CommonCfg.FragmentThreshold - LENGTH_CRC - pTxBlk->MpduHeaderLen;\n\t\tif (SrcRemainingBytes <= FreeMpduSize) {\t/* this is the last or only fragment */\n\n\t\t\tpTxBlk->SrcBufLen = SrcRemainingBytes;\n\n\t\t\tpHeader_802_11->FC.MoreFrag = 0;\n\t\t\tpHeader_802_11->Duration =\n\t\t\t    pAd->CommonCfg.Dsifs + AckDuration;\n\n\t\t\t/* Indicate the lower layer that this's the last fragment. */\n\t\t\tpTxBlk->TotalFragNum = fragNum;\n\t\t} else {\t/* more fragment is required */\n\n\t\t\tpTxBlk->SrcBufLen = FreeMpduSize;\n\n\t\t\tNextMpduSize =\n\t\t\t    min(((UINT) SrcRemainingBytes - pTxBlk->SrcBufLen),\n\t\t\t\t((UINT) pAd->CommonCfg.FragmentThreshold));\n\t\t\tpHeader_802_11->FC.MoreFrag = 1;\n\t\t\tpHeader_802_11->Duration =\n\t\t\t    (3 * pAd->CommonCfg.Dsifs) + (2 * AckDuration) +\n\t\t\t    RTMPCalcDuration(pAd, pTxBlk->TxRate,\n\t\t\t\t\t     NextMpduSize + EncryptionOverhead);\n\t\t}\n\n\t\tSrcRemainingBytes -= pTxBlk->SrcBufLen;\n\n\t\tif (fragNum == 0)\n\t\t\tpTxBlk->FrameGap = IFS_HTTXOP;\n\t\telse\n\t\t\tpTxBlk->FrameGap = IFS_SIFS;\n\n#ifdef SOFT_ENCRYPT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n\t\t\tUCHAR ext_offset = 0;\n\n\t\t\tNdisMoveMemory(pTxBlk->pSrcBufData,\n\t\t\t\t       tmp_ptr + buf_offset, pTxBlk->SrcBufLen);\n\t\t\tbuf_offset += pTxBlk->SrcBufLen;\n\n\t\t\t/* Encrypt the MPDU data by software */\n\t\t\tRTMPSoftEncryptionAction(pAd,\n\t\t\t\t\t\t pTxBlk->CipherAlg,\n\t\t\t\t\t\t (PUCHAR) pHeader_802_11,\n\t\t\t\t\t\t pTxBlk->pSrcBufData,\n\t\t\t\t\t\t pTxBlk->SrcBufLen,\n\t\t\t\t\t\t pTxBlk->KeyIdx,\n\t\t\t\t\t\t pTxBlk->pKey, &ext_offset);\n\t\t\tpTxBlk->SrcBufLen += ext_offset;\n\t\t\tpTxBlk->TotalFrameLen += ext_offset;\n\n\t\t}\n#endif /* SOFT_ENCRYPT */\n\n\t\tRTMPWriteTxWI_Data(pAd, (TXWI_STRUC *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);\n\t\tHAL_WriteFragTxResource(pAd, pTxBlk, fragNum, &freeCnt);\n\n#ifdef DBG_CTRL_SUPPORT\n#ifdef INCLUDE_DEBUG_QUEUE\n\t\tif (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFRAME)\n\t\t\tdbQueueEnqueueTxFrame((UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (UCHAR *)pHeader_802_11);\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n\t\tpAd->RalinkCounters.KickTxCount++;\n\t\tpAd->RalinkCounters.OneSecTxDoneCount++;\n\n\t\t/* Update the frame number, remaining size of the NDIS packet payload. */\n#ifdef SOFT_ENCRYPT\n\t\tif (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) {\n#ifdef WAPI_SUPPORT\n\t\t\tif (pTxBlk->CipherAlg == CIPHER_SMS4) {\n\t\t\t\t/* incease WPI IV for next MPDU */\n\t\t\t\tinc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WAPI_TSC,\n\t\t\t\t\t    2);\n\t\t\t\t/* Construct and insert WPI-SMS4 IV header to MPDU header */\n\t\t\t\tRTMPConstructWPIIVHdr(pTxBlk->KeyIdx,\n\t\t\t\t\t\t      pTxBlk->pKey->TxTsc,\n\t\t\t\t\t\t      pHeaderBufPtr -\n\t\t\t\t\t\t      (LEN_WPI_IV_HDR));\n\t\t\t} else\n#endif /* WAPI_SUPPORT */\n\t\t\tif ((pTxBlk->CipherAlg == CIPHER_WEP64)\n\t\t\t\t    || (pTxBlk->CipherAlg == CIPHER_WEP128)) {\n\t\t\t\tinc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WEP_TSC,\n\t\t\t\t\t    1);\n\t\t\t\t/* Construct and insert 4-bytes WEP IV header to MPDU header */\n\t\t\t\tRTMPConstructWEPIVHdr(pTxBlk->KeyIdx,\n\t\t\t\t\t\t      pTxBlk->pKey->TxTsc,\n\t\t\t\t\t\t      pHeaderBufPtr -\n\t\t\t\t\t\t      (LEN_WEP_IV_HDR));\n\t\t\t} else if (pTxBlk->CipherAlg == CIPHER_TKIP) ;\n\t\t\telse if (pTxBlk->CipherAlg == CIPHER_AES) {\n\t\t\t\tinc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WPA_TSC,\n\t\t\t\t\t    1);\n\t\t\t\t/* Construct and insert 8-bytes CCMP header to MPDU header */\n\t\t\t\tRTMPConstructCCMPHdr(pTxBlk->KeyIdx,\n\t\t\t\t\t\t     pTxBlk->pKey->TxTsc,\n\t\t\t\t\t\t     pHeaderBufPtr -\n\t\t\t\t\t\t     (LEN_CCMP_HDR));\n\t\t\t}\n\t\t} else\n#endif /* SOFT_ENCRYPT */\n\t\t{\n\t\t\t/* space for 802.11 header. */\n\t\t\tif (fragNum == 0 && pTxBlk->pExtraLlcSnapEncap)\n\t\t\t\tpTxBlk->MpduHeaderLen -= LENGTH_802_1_H;\n\t\t}\n\n\t\tfragNum++;\n\t\t/* SrcRemainingBytes -= pTxBlk->SrcBufLen; */\n\t\tpTxBlk->pSrcBufData += pTxBlk->SrcBufLen;\n\n\t\tpHeader_802_11->Frag++;\t/* increase Frag # */\n\n\t} while (SrcRemainingBytes > 0);\n\n#ifdef SOFT_ENCRYPT\n\tif (tmp_ptr != NULL)\n\t\tos_free_mem(pAd, tmp_ptr);\n#endif /* SOFT_ENCRYPT */\n\n\t/*\n\t   Kick out Tx\n\t */\n#ifdef PCIE_PS_SUPPORT\n\tif (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))\n#endif /* PCIE_PS_SUPPORT */\n\t\tHAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);\n}\n\n\n#define RELEASE_FRAMES_OF_TXBLK(_pAd, _pTxBlk, _pQEntry, _Status) \t\t\t\t\t\t\t\t\t\t\\\n\t\twhile(_pTxBlk->TxPacketList.Head)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_pQEntry = RemoveHeadQueue(&_pTxBlk->TxPacketList);\t\t\t\t\t\t\t\t\t\\\n\t\t\tRELEASE_NDIS_PACKET(_pAd, QUEUE_ENTRY_TO_PACKET(_pQEntry), _Status);\t\\\n\t\t}\n\n/*\n\t========================================================================\n\n\tRoutine Description:\n\t\tCopy frame from waiting queue into relative ring buffer and set \n\tappropriate ASIC register to kick hardware encryption before really\n\tsent out to air.\n\t\t\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\tPNDIS_PACKET\tPointer to outgoing Ndis frame\n\t\tNumberOfFrag\tNumber of fragment required\n\t\t\n\tReturn Value:\n\t\tNone\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nNDIS_STATUS STAHardTransmit(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk, UCHAR QueIdx)\n{\n\tNDIS_PACKET *pPacket;\n\tPQUEUE_ENTRY pQEntry;\n\n#ifdef HDR_TRANS_SUPPORT\n\t\tBOOLEAN bDoHdrTrans = TRUE;\n#endif /* HDR_TRANS_SUPPORT */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t{\n\t\tif (pAd->P2pCfg.bStartP2pConnect)\n\t\t{\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\tif (INFRA_ON(pAd) && (pAd->LatchRfRegs.Channel != pAd->CommonCfg.Channel) &&\n\t\t\t(pAd->LatchRfRegs.Channel != pAd->CommonCfg.CentralChannel))\n\t\t{\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\n\t/*\n\t   ---------------------------------------------\n\t   STEP 0. DO SANITY CHECK AND SOME EARLY PREPARATION.\n\t   ---------------------------------------------        \n\t */\n\tASSERT(pTxBlk->TxPacketList.Number);\n\tif (pTxBlk->TxPacketList.Head == NULL) {\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t (\"pTxBlk->TotalFrameNum == %ld!\\n\",\n\t\t\t  pTxBlk->TxPacketList.Number));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tpPacket = QUEUE_ENTRY_TO_PACKET(pTxBlk->TxPacketList.Head);\n\n#ifdef RTMP_MAC_USB\n\t/* there's packet to be sent, keep awake for 1200ms */\n\tif (pAd->CountDowntoPsm < 12)\n\t\tpAd->CountDowntoPsm = 12;\n#endif /* RTMP_MAC_USB */\n\n\t/* ------------------------------------------------------------------\n\t   STEP 1. WAKE UP PHY\n\t   outgoing frame always wakeup PHY to prevent frame lost and \n\t   turn off PSM bit to improve performance\n\t   ------------------------------------------------------------------\n\t   not to change PSM bit, just send this frame out?\n\t */\n\tif ((pAd->StaCfg.Psm == PWR_SAVE)\n\t    && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {\n\t\tDBGPRINT_RAW(RT_DEBUG_INFO, (\"AsicForceWakeup At HardTx\\n\"));\n#ifdef RTMP_MAC_USB\n\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_FORCE_WAKE_UP, NULL, 0);\n#endif /* RTMP_MAC_USB */\n\t}\n\n\t/* It should not change PSM bit, when APSD turn on. */\n\tif ((!\n\t     (pAd->StaCfg.UapsdInfo.bAPSDCapable\n\t      && pAd->CommonCfg.APEdcaParm.bAPSDCapable)\n\t     && (pAd->CommonCfg.bAPSDForcePowerSave == FALSE))\n\t    || (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket))\n\t    || (RTMP_GET_PACKET_WAI(pTxBlk->pPacket))) {\n\t\tif ((RtmpPktPmBitCheck(pAd) == TRUE) &&\n\t\t    (pAd->StaCfg.WindowsPowerMode ==\n\t\t     Ndis802_11PowerModeFast_PSP))\n\t\t\tRTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);\n\t}\n\n\tswitch (pTxBlk->TxFrameType) {\n#ifdef DOT11_N_SUPPORT\n\tcase TX_AMPDU_FRAME:\n\t\tSTA_AMPDU_Frame_Tx(pAd, pTxBlk);\n\t\tbreak;\n\tcase TX_AMSDU_FRAME:\n\t\tSTA_AMSDU_Frame_Tx(pAd, pTxBlk);\n\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\tcase TX_LEGACY_FRAME:\n\t\t{\n\t\tSTA_Legacy_Frame_Tx(pAd, pTxBlk);\n\n\t\tbreak;\n\t\t}\n\tcase TX_MCAST_FRAME:\n\t\tSTA_Legacy_Frame_Tx(pAd, pTxBlk);\n\t\tbreak;\n\tcase TX_RALINK_FRAME:\n\t\tSTA_ARalink_Frame_Tx(pAd, pTxBlk);\n\t\tbreak;\n\tcase TX_FRAG_FRAME:\n\t\tSTA_Fragment_Frame_Tx(pAd, pTxBlk);\n\t\tbreak;\n\tdefault:\n\t\t{\n\t\t\t/* It should not happened! */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t (\"Send a pacekt was not classified!! It should not happen!\\n\"));\n\t\t\twhile (pTxBlk->TxPacketList.Number) {\n\t\t\t\tpQEntry =\n\t\t\t\t    RemoveHeadQueue(&pTxBlk->TxPacketList);\n\t\t\t\tpPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);\n\t\t\t\tif (pPacket)\n\t\t\t\t\tRELEASE_NDIS_PACKET(pAd, pPacket,\n\t\t\t\t\t\t\t    NDIS_STATUS_FAILURE);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\treturn (NDIS_STATUS_SUCCESS);\n\n}\n\n\nVOID Sta_Announce_or_Forward_802_3_Packet(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PNDIS_PACKET pPacket,\n\tIN UCHAR FromWhichBSSID)\n{\n\tif (TRUE\n\t    ) {\n\t\tannounce_802_3_packet(pAd, pPacket, OPMODE_STA);\n\t} else {\n\t\t/* release packet */\n\t\tRELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);\n\t}\n}\n"
  },
  {
    "path": "src/sta/sanity.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tsanity.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn Chang  2004-09-01      add WMM support\n*/\n#include \"rt_config.h\"\n\nextern UCHAR CISCO_OUI[];\n\nextern UCHAR WPA_OUI[];\nextern UCHAR RSN_OUI[];\nextern UCHAR WME_INFO_ELEM[];\nextern UCHAR WME_PARM_ELEM[];\nextern UCHAR RALINK_OUI[];\nextern UCHAR BROADCOM_OUI[];\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n */\nBOOLEAN MlmeStartReqSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *Msg,\n\tIN ULONG MsgLen,\n\tOUT CHAR Ssid[],\n\tOUT UCHAR *pSsidLen)\n{\n\tMLME_START_REQ_STRUCT *Info;\n\n\tInfo = (MLME_START_REQ_STRUCT *) (Msg);\n\n\tif (Info->SsidLen > MAX_LEN_OF_SSID) {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): fail - wrong SSID length\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__));\n\t\treturn FALSE;\n\t}\n\n\t*pSsidLen = Info->SsidLen;\n\tNdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);\n\n\treturn TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        MLME message sanity check\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n        \n    IRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN PeerAssocRspSanity(\n\tIN PRTMP_ADAPTER pAd,\n\tIN VOID *pMsg,\n\tIN ULONG MsgLen,\n\tOUT PUCHAR pAddr2,\n\tOUT USHORT *pCapabilityInfo,\n\tOUT USHORT *pStatus,\n\tOUT USHORT *pAid,\n\tOUT UCHAR SupRate[],\n\tOUT UCHAR *pSupRateLen,\n\tOUT UCHAR ExtRate[],\n\tOUT UCHAR *pExtRateLen,\n\tOUT HT_CAPABILITY_IE *pHtCapability,\n\tOUT ADD_HT_INFO_IE *pAddHtInfo,\t/* AP might use this additional ht info IE */\n\tOUT UCHAR *pHtCapabilityLen,\n\tOUT UCHAR *pAddHtInfoLen,\n\tOUT UCHAR *pNewExtChannelOffset,\n\tOUT PEDCA_PARM pEdcaParm,\n\tOUT EXT_CAP_INFO_ELEMENT *pExtCapInfo,\n\tOUT UCHAR *pCkipFlag,\n\tOUT IE_LISTS *ie_list)\n{\n\tCHAR IeType, *Ptr;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11) pMsg;\n\tPEID_STRUCT pEid;\n\tULONG Length = 0;\n\n\t*pNewExtChannelOffset = 0xff;\n\t*pHtCapabilityLen = 0;\n\t*pAddHtInfoLen = 0;\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\tPtr = (PCHAR) pFrame->Octet;\n\tLength += LENGTH_802_11;\n\n\tNdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2);\n\tLength += 2;\n\tNdisMoveMemory(pStatus, &pFrame->Octet[2], 2);\n\tLength += 2;\n\t*pCkipFlag = 0;\n\t*pExtRateLen = 0;\n\tpEdcaParm->bValid = FALSE;\n\n\tif (*pStatus != MLME_SUCCESS)\n\t\treturn TRUE;\n\n\tNdisMoveMemory(pAid, &pFrame->Octet[4], 2);\n\tLength += 2;\n\n\t/* Aid already swaped byte order in RTMPFrameEndianChange() for big endian platform */\n\t*pAid = (*pAid) & 0x3fff;\t/* AID is low 14-bit */\n\n\t/* -- get supported rates from payload and advance the pointer */\n\tIeType = pFrame->Octet[6];\n\t*pSupRateLen = pFrame->Octet[7];\n\tif ((IeType != IE_SUPP_RATES)\n\t    || (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES)) {\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): fail - wrong SupportedRates IE\\n\", __FUNCTION__));\n\t\treturn FALSE;\n\t} else\n\t\tNdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen);\n\n\n\tLength = Length + 2 + *pSupRateLen;\n\n\t/*\n\t   many AP implement proprietary IEs in non-standard order, we'd better\n\t   tolerate mis-ordered IEs to get best compatibility\n\t */\n\tpEid = (PEID_STRUCT) & pFrame->Octet[8 + (*pSupRateLen)];\n\n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= MsgLen) {\n\t\tswitch (pEid->Eid) {\n\t\tcase IE_EXT_SUPP_RATES:\n\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) {\n\t\t\t\tNdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);\n\t\t\t\t*pExtRateLen = pEid->Len;\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef DOT11_N_SUPPORT\n\t\tcase IE_HT_CAP:\n\t\tcase IE_HT_CAP2:\n\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE) {\t/* Note: allow extension.!! */\n\t\t\t\tNdisMoveMemory(pHtCapability, pEid->Octet, SIZE_HT_CAP_IE);\n\n\t\t\t\t*(USHORT *) (&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));\n\t\t\t\t*(USHORT *) (&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));\n\n\t\t\t\t*pHtCapabilityLen = SIZE_HT_CAP_IE;\n\t\t\t} else {\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_HT_CAP\\n\", __FUNCTION__));\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase IE_ADD_HT:\n\t\tcase IE_ADD_HT2:\n\t\t\tif (pEid->Len >= sizeof (ADD_HT_INFO_IE)) {\n\t\t\t\t/*\n\t\t\t\t   This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only\n\t\t\t\t   copy first sizeof(ADD_HT_INFO_IE)\n\t\t\t\t */\n\t\t\t\tNdisMoveMemory(pAddHtInfo, pEid->Octet, sizeof (ADD_HT_INFO_IE));\n\n\t\t\t\t*(USHORT *) (&pAddHtInfo->AddHtInfo2) = cpu2le16(*(USHORT *)(&pAddHtInfo->AddHtInfo2));\n\t\t\t\t*(USHORT *) (&pAddHtInfo->AddHtInfo3) = cpu2le16(*(USHORT *)(&pAddHtInfo->AddHtInfo3));\n\n\t\t\t\t*pAddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n\t\t\t} else {\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_ADD_HT\\n\", __FUNCTION__));\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase IE_SECONDARY_CH_OFFSET:\n\t\t\tif (pEid->Len == 1) {\n\t\t\t\t*pNewExtChannelOffset = pEid->Octet[0];\n\t\t\t} else {\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_SECONDARY_CH_OFFSET\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef DOT11_VHT_AC\n\t\tcase IE_VHT_CAP:\n\t\t\tif (pEid->Len == sizeof(VHT_CAP_IE)) {\n\t\t\t\tNdisMoveMemory(&ie_list->vht_cap, pEid->Octet, sizeof(VHT_CAP_IE));\n\t\t\t\tie_list->vht_cap_len = sizeof(VHT_CAP_IE);\n\t\t\t} else {\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_VHT_CAP\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase IE_VHT_OP:\n\t\t\tif (pEid->Len == sizeof(VHT_OP_IE)) {\n\t\t\t\tNdisMoveMemory(&ie_list->vht_op, pEid->Octet, sizeof(VHT_OP_IE));\n\t\t\t\tie_list->vht_op_len = sizeof(VHT_OP_IE);\n\t\t\t}else {\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s():wrong IE_VHT_OP\\n\", __FUNCTION__));\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11_VHT_AC */\n#endif /* DOT11_N_SUPPORT */\n\n\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t/* handle WME PARAMTER ELEMENT */\n\t\t\tif (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6)\n\t\t\t    && (pEid->Len == 24)) {\n\t\t\t\tPUCHAR ptr;\n\t\t\t\tint i;\n\n\t\t\t\t/* parsing EDCA parameters */\n\t\t\t\tpEdcaParm->bValid = TRUE;\n\t\t\t\tpEdcaParm->bQAck = FALSE;\t/* pEid->Octet[0] & 0x10; */\n\t\t\t\tpEdcaParm->bQueueRequest = FALSE;\t/* pEid->Octet[0] & 0x20; */\n\t\t\t\tpEdcaParm->bTxopRequest = FALSE;\t/* pEid->Octet[0] & 0x40; */\n\t\t\t\tpEdcaParm->EdcaUpdateCount =\n\t\t\t\t    pEid->Octet[6] & 0x0f;\n\t\t\t\tpEdcaParm->bAPSDCapable =\n\t\t\t\t    (pEid->Octet[6] & 0x80) ? 1 : 0;\n\t\t\t\tptr = (PUCHAR) & pEid->Octet[8];\n\t\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\t\tUCHAR aci = (*ptr & 0x60) >> 5;\t/* b5~6 is AC INDEX */\n\t\t\t\t\tpEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10);\t/* b5 is ACM */\n\t\t\t\t\tpEdcaParm->Aifsn[aci] = (*ptr) & 0x0f;\t/* b0~3 is AIFSN */\n\t\t\t\t\tpEdcaParm->Cwmin[aci] = *(ptr + 1) & 0x0f;\t/* b0~4 is Cwmin */\n\t\t\t\t\tpEdcaParm->Cwmax[aci] = *(ptr + 1) >> 4;\t/* b5~8 is Cwmax */\n\t\t\t\t\tpEdcaParm->Txop[aci] = *(ptr + 2) + 256 * (*(ptr + 3));\t/* in unit of 32-us */\n\t\t\t\t\tptr += 4;\t/* point to next AC */\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IE_EXT_CAPABILITY:\n\t\t\tif (pEid->Len >= 1)\n\t\t\t{\n\t\t\t\tUCHAR MaxSize;\n\t\t\t\tUCHAR MySize = sizeof(EXT_CAP_INFO_ELEMENT);\n\n\t\t\t\tMaxSize = min(pEid->Len, MySize);\n\t\t\t\tNdisMoveMemory(pExtCapInfo, &pEid->Octet[0], MaxSize);\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerAssocReqSanity - IE_EXT_CAPABILITY!\\n\"));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t (\"%s():ignore unrecognized EID = %d\\n\", __FUNCTION__, pEid->Eid));\n\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len;\n\t\tpEid = (PEID_STRUCT) ((UCHAR *) pEid + 2 + pEid->Len);\n\t}\n\n\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        \n\tIRQL = DISPATCH_LEVEL\n\n    ==========================================================================\n */\nBOOLEAN GetTimBit(\n\tIN CHAR *Ptr,\n\tIN USHORT Aid,\n\tOUT UCHAR *TimLen,\n\tOUT UCHAR *BcastFlag,\n\tOUT UCHAR *DtimCount,\n\tOUT UCHAR *DtimPeriod,\n\tOUT UCHAR *MessageToMe)\n{\n\tUCHAR BitCntl, N1, N2, MyByte, MyBit;\n\tCHAR *IdxPtr;\n\n\tIdxPtr = Ptr;\n\n\tIdxPtr++;\n\t*TimLen = *IdxPtr;\n\n\t/* get DTIM Count from TIM element */\n\tIdxPtr++;\n\t*DtimCount = *IdxPtr;\n\n\t/* get DTIM Period from TIM element */\n\tIdxPtr++;\n\t*DtimPeriod = *IdxPtr;\n\n\t/* get Bitmap Control from TIM element */\n\tIdxPtr++;\n\tBitCntl = *IdxPtr;\n\n\tif ((*DtimCount == 0) && (BitCntl & 0x01))\n\t\t*BcastFlag = TRUE;\n\telse\n\t\t*BcastFlag = FALSE;\n\n\t/* Parse Partial Virtual Bitmap from TIM element */\n\tN1 = BitCntl & 0xfe;\t/* N1 is the first bitmap byte# */\n\tN2 = *TimLen - 4 + N1;\t/* N2 is the last bitmap byte# */\n\n\tif ((Aid < (N1 << 3)) || (Aid >= ((N2 + 1) << 3)))\n\t\t*MessageToMe = FALSE;\n\telse {\n\t\tMyByte = (Aid >> 3) - N1;\t/* my byte position in the bitmap byte-stream */\n\t\tMyBit = Aid % 16 - ((MyByte & 0x01) ? 8 : 0);\n\n\t\tIdxPtr += (MyByte + 1);\n\n\t\tif (*IdxPtr & (0x01 << MyBit))\n\t\t\t*MessageToMe = TRUE;\n\t\telse\n\t\t\t*MessageToMe = FALSE;\n\t}\n\n\treturn TRUE;\n}\n"
  },
  {
    "path": "src/sta/sta_cfg.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2006, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n    Module Name:\n    sta_ioctl.c\n\n    Abstract:\n    IOCTL related subroutines\n\n    Revision History:\n    Who         When          What\n    --------    ----------    ----------------------------------------------\n    Rory Chen   01-03-2003    created\n\tRory Chen   02-14-2005    modify to support RT61\n*/\n\n#include\t\"rt_config.h\"\n\n#ifdef P2P_SUPPORT\nextern INT Set_P2p_OpMode_Proc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PSTRING arg);\n\nextern INT Set_AP_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#endif /* P2P_SUPPORT */\n\n\nINT Set_AutoReconnect_Proc(\n    IN  PRTMP_ADAPTER\tpAd, \n    IN  PSTRING\t\t\targ);\n\nINT Set_AdhocN_Proc(\n    IN  PRTMP_ADAPTER\tpAd, \n    IN  PSTRING\t\t\targ);\n\n\n#ifdef CONFIG_MULTI_CHANNEL\nINT Set_StaStayTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_P2pStayTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_LinkDown_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT Set_Multi_Channel_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\n\n#ifdef CARRIER_DETECTION_SUPPORT\nINT Set_StaCarrierDetect_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg);\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n#ifdef IWSC_SUPPORT\nINT\tSet_IWscLimitedUI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\n#ifdef IWSC_TEST_SUPPORT\nINT\tSet_IWscDefaultSecurity_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_IWscSmpbcEnrScanOnly_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_IWscEmptySubmaskList_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_IWscBlockConnection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* IWSC_TEST_SUPPORT */\n\nINT\tSet_IWscOOB_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n\nINT\tSet_IWscSinglePIN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ);\n#endif /* IWSC_SUPPORT */\n\n\nstatic struct {\n\tPSTRING name;\n\tINT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);\n} *PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = {\n\t{\"DriverVersion\",\t\t\t\tSet_DriverVersion_Proc},\n\t{\"CountryRegion\",\t\t\t\tSet_CountryRegion_Proc},\n\t{\"CountryRegionABand\",\t\tSet_CountryRegionABand_Proc},\n\t{\"SSID\",\t\t\t\t\t\tSet_SSID_Proc},\n\t{\"WirelessMode\",\t\t\t\tSet_WirelessMode_Proc},\n\t{\"TxBurst\",\t\t\t\t\tSet_TxBurst_Proc},\n\t{\"TxPreamble\",\t\t\t\tSet_TxPreamble_Proc},\n\t{\"TxPower\",\t\t\t\t\tSet_TxPower_Proc},\n\t{\"Channel\",\t\t\t\t\tSet_Channel_Proc},\n\t{\"BGProtection\",\t\t\t\tSet_BGProtection_Proc},\n\t{\"RTSThreshold\",\t\t\t\tSet_RTSThreshold_Proc},\n\t{\"FragThreshold\",\t\t\t\tSet_FragThreshold_Proc},\n#ifdef DOT11_N_SUPPORT\n\t{\"HtBw\",\t\t                Set_HtBw_Proc},\n\t{\"HtMcs\",\t\t                Set_HtMcs_Proc},\n\t{\"HtGi\",\t\t                Set_HtGi_Proc},\n\t{\"HtOpMode\",\t\t            Set_HtOpMode_Proc},\n\t{\"HtStbc\",\t\t\t\t\tSet_HtStbc_Proc},\n\t{\"HtExtcha\",\t\t            Set_HtExtcha_Proc},\n\t{\"HtMpduDensity\",\t\t        Set_HtMpduDensity_Proc},\n\t{\"HtBaWinSize\",\t\t        \tSet_HtBaWinSize_Proc},\n\t{\"HtRdg\",\t\t        \t\tSet_HtRdg_Proc},\n\t{\"HtAmsdu\",\t\t        \t\tSet_HtAmsdu_Proc},\n\t{\"HtAutoBa\",\t\t        \tSet_HtAutoBa_Proc},\n\t{\"HtBaDecline\",\t\t\t\tSet_BADecline_Proc},\n\t{\"HtProtect\",\t\t        \tSet_HtProtect_Proc},\n\t{\"HtMimoPs\",\t\t        \tSet_HtMimoPs_Proc},\n\t{\"HtDisallowTKIP\",\t\t\t\tSet_HtDisallowTKIP_Proc},\n#ifdef DOT11N_DRAFT3\n\t{\"HtBssCoex\",\t\t\t\tSet_HT_BssCoex_Proc},\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n\t{\"VhtBw\",\t\t\t\t\tSet_VhtBw_Proc},\n\t{\"VhtStbc\",\t\t\t\t\tSet_VhtStbc_Proc},\n#endif /* DOT11_VHT_AC */\n\n#ifdef AGGREGATION_SUPPORT\n\t{\"PktAggregate\",\t\t\t\tSet_PktAggregate_Proc},       \n#endif /* AGGREGATION_SUPPORT */\n\n#ifdef WMM_SUPPORT\n\t{\"WmmCapable\",\t\t\t\t\tSet_WmmCapable_Proc},\n#endif         \n\t{\"IEEE80211H\",\t\t\t\t\tSet_IEEE80211H_Proc},\n    {\"NetworkType\",                 Set_NetworkType_Proc},\n\t{\"AuthMode\",\t\t\t\t\tSet_AuthMode_Proc},\n\t{\"EncrypType\",\t\t\t\t\tSet_EncrypType_Proc},\n\t{\"DefaultKeyID\",\t\t\t\tSet_DefaultKeyID_Proc},\n\t{\"Key1\",\t\t\t\t\t\tSet_Key1_Proc},\n\t{\"Key2\",\t\t\t\t\t\tSet_Key2_Proc},\n\t{\"Key3\",\t\t\t\t\t\tSet_Key3_Proc},\n\t{\"Key4\",\t\t\t\t\t\tSet_Key4_Proc},\n\t{\"WPAPSK\",\t\t\t\t\t\tSet_WPAPSK_Proc},\n\t{\"ResetCounter\",\t\t\t\tSet_ResetStatCounter_Proc},\n\t{\"PSMode\",                      Set_PSMode_Proc},\n#ifdef DBG\n\t{\"Debug\",\t\t\t\t\t\tSet_Debug_Proc},\n\t{\"DebugFunc\",\t\t\t\t\tSet_DebugFunc_Proc},\n#endif /* DBG */\n\n#ifdef TXBF_SUPPORT\n\t{\"TxBfTag\",\t\t\t\t        Set_TxBfTag_Proc},\n\t{\"ReadITxBf\",\t\t\t\t    Set_ReadITxBf_Proc},\n\t{\"WriteITxBf\",\t\t\t\t    Set_WriteITxBf_Proc},\n\t{\"StatITxBf\",\t\t\t\t    Set_StatITxBf_Proc},\n\t{\"ReadETxBf\",\t\t\t\t    Set_ReadETxBf_Proc},\n\t{\"WriteETxBf\",\t\t\t\t    Set_WriteETxBf_Proc},\n\t{\"StatETxBf\",\t\t\t\t    Set_StatETxBf_Proc},\n\t{\"ETxBfTimeout\",\t\t        Set_ETxBfTimeout_Proc},\n#ifdef STA_ITXBF_SUPPORT\n\t{\"ITxBfTimeout\",\t\t        Set_ITxBfTimeout_Proc},\n\t{\"InvTxBfTag\",\t\t\t\t    Set_InvTxBfTag_Proc},\n\t{\"ITxBfCal\",\t\t\t\t    Set_ITxBfCal_Proc},\n\t{\"ITxBfDivCal\",\t\t\t\t    Set_ITxBfDivCal_Proc},\n\t{\"ITxBfLnaCal\",\t\t\t\t    Set_ITxBfLnaCal_Proc},\n\t{\"ITxBfEn\",\t\t\t\t\t\tSet_ITxBfEn_Proc},\n#endif /* STA_ITXBF_SUPPORT */\n\t{\"ETxBfEnCond\",\t\t\t\t\tSet_ETxBfEnCond_Proc},\n\t{\"ETxBfCodebook\",\t\t\t\tSet_ETxBfCodebook_Proc},\n\t{\"ETxBfCoefficient\",\t\t\tSet_ETxBfCoefficient_Proc},\n\t{\"ETxBfGrouping\",\t\t\t\tSet_ETxBfGrouping_Proc},\n\t{\"ETxBfNoncompress\",\t\t\tSet_ETxBfNoncompress_Proc},\n\t{\"ETxBfIncapable\",\t\t\t\tSet_ETxBfIncapable_Proc},\n\t{\"NoSndgCntThrd\",\t\t\t\tSet_NoSndgCntThrd_Proc},\n\t{\"NdpSndgStreams\",\t\t\t\tSet_NdpSndgStreams_Proc},\n\t{\"TriggerSounding\",\t\t\t\tSet_Trigger_Sounding_Proc},\n#endif /* TXBF_SUPPORT */\n\n#ifdef STREAM_MODE_SUPPORT\n\t{\"StreamMode\",\t\t\t\t\tSet_StreamMode_Proc},\n\t{\"StreamModeMCS\",\t\t\t\tSet_StreamModeMCS_Proc},\n#endif /* STREAM_MODE_SUPPORT */\n\n\t{\"RateAlg\",\t\t\t\t\tSet_RateAlg_Proc},\n#ifdef NEW_RATE_ADAPT_SUPPORT\n\t{\"LowTrafficThrd\",\t\t\t\tSet_LowTrafficThrd_Proc},\n\t{\"TrainUpRule\",\t\t\t\t\tSet_TrainUpRule_Proc},\n\t{\"TrainUpRuleRSSI\",\t\t\t\tSet_TrainUpRuleRSSI_Proc},\n\t{\"TrainUpLowThrd\",\t\t\t\tSet_TrainUpLowThrd_Proc},\n\t{\"TrainUpHighThrd\",\t\t\t\tSet_TrainUpHighThrd_Proc},\n\t{\"RateTable\",\t\t\t\t\tSet_RateTable_Proc},\n#endif /* NEW_RATE_ADAPT_SUPPORT */\n\n#ifdef PRE_ANT_SWITCH\n\t{\"PreAntSwitch\",\t\t        Set_PreAntSwitch_Proc},\n\t{\"PreAntSwitchRSSI\",\t\t    Set_PreAntSwitchRSSI_Proc},\n\t{\"PreAntSwitchTimeout\",\t\t    Set_PreAntSwitchTimeout_Proc},\n#endif /* PRE_ANT_SWITCH */\n\n\n#ifdef DBG_CTRL_SUPPORT\n\t{\"DebugFlags\",\t\t\t\t\tSet_DebugFlags_Proc},\n#ifdef INCLUDE_DEBUG_QUEUE\n\t{\"DebugQueue\",\t\t\t\t\tSet_DebugQueue_Proc},\n#endif /* INCLUDE_DEBUG_QUEUE */\n#endif /* DBG_CTRL_SUPPORT */\n\n#ifdef RALINK_ATE\n\t{\"ATE\",\t\t\t\t\t\t\tSet_ATE_Proc},\n\t{\"ATEDA\",\t\t\t\t\t\tSet_ATE_DA_Proc},\n\t{\"ATESA\",\t\t\t\t\t\tSet_ATE_SA_Proc},\n\t{\"ATEBSSID\",\t\t\t\t\tSet_ATE_BSSID_Proc},\n\t{\"ATECHANNEL\",\t\t\t\t\tSet_ATE_CHANNEL_Proc},\n\t{\"ATEINITCHAN\",\t\t\t\t\tSet_ATE_INIT_CHAN_Proc},\n\t{\"ADCDump\",\t\t\t\t\tSet_ADCDump_Proc},\n#ifdef RTMP_INTERNAL_TX_ALC\n\t{\"ATETSSICBA\",\t\t\t\t\tSet_ATE_TSSI_CALIBRATION_Proc},\n\t{\"ATETSSICBAEX\",\t\t\t\t\tSet_ATE_TSSI_CALIBRATION_EX_Proc},\n#if defined(RT3350) || defined(RT3352)\n\t{\"ATETSSICALBRENABLE\",\t\t\t\tRT335x_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc},\n#endif /* defined(RT3350) || defined(RT3352) */\n#endif /* RTMP_INTERNAL_TX_ALC */\n#ifdef  RTMP_TEMPERATURE_COMPENSATION\n\t{\"ATEREADEXTSSI\",\t\t\tSet_ATE_READ_EXTERNAL_TSSI_Proc},\n#endif /* RTMP_TEMPERATURE_COMPENSATION */\n\t{\"ATETXPOW0\",\t\t\t\t\tSet_ATE_TX_POWER0_Proc},\n\t{\"ATETXPOW1\",\t\t\t\t\tSet_ATE_TX_POWER1_Proc},\n#ifdef DOT11N_SS3_SUPPORT\n\t{\"ATETXPOW2\",\t\t\t\t\tSet_ATE_TX_POWER2_Proc},\n#endif /* DOT11N_SS3_SUPPORT */\n\t{\"ATETXANT\",\t\t\t\t\tSet_ATE_TX_Antenna_Proc},\n\t{\"ATERXANT\",\t\t\t\t\tSet_ATE_RX_Antenna_Proc},\n\t{\"ATETXFREQOFFSET\",\t\t\t\tSet_ATE_TX_FREQ_OFFSET_Proc},\n\t{\"ATETXBW\",\t\t\t\t\t\tSet_ATE_TX_BW_Proc},\n\t{\"ATETXLEN\",\t\t\t\t\tSet_ATE_TX_LENGTH_Proc},\n\t{\"ATETXCNT\",\t\t\t\t\tSet_ATE_TX_COUNT_Proc},\n\t{\"ATETXMCS\",\t\t\t\t\tSet_ATE_TX_MCS_Proc},\n\t{\"ATETXMODE\",\t\t\t\t\tSet_ATE_TX_MODE_Proc},\n\t{\"ATETXGI\",\t\t\t\t\t\tSet_ATE_TX_GI_Proc},\n\t{\"ATERXFER\",\t\t\t\t\tSet_ATE_RX_FER_Proc},\n\t{\"ATERRF\",\t\t\t\t\t\tSet_ATE_Read_RF_Proc},\n\t{\"ATEWRF1\",\t\t\t\t\t\tSet_ATE_Write_RF1_Proc},\n\t{\"ATEWRF2\",\t\t\t\t\t\tSet_ATE_Write_RF2_Proc},\n\t{\"ATEWRF3\",\t\t\t\t\t\tSet_ATE_Write_RF3_Proc},\n\t{\"ATEWRF4\",\t\t\t\t\t\tSet_ATE_Write_RF4_Proc},\n\t{\"ATELDE2P\",\t\t\t\t    Set_ATE_Load_E2P_Proc},\n#ifdef RTMP_EFUSE_SUPPORT\n\t{\"bufferWriteBack\",\t\t\tSet_ATE_Load_E2P_From_Buf_Proc},\n\t{\"bufferLoadFromEfuse\",\t\tSet_LoadEepromBufferFromEfuse_Proc},\n\t{\"ATECALFREEINFO\",\t\t\tSet_ATE_Cal_Free_Info_Proc},\n#endif /* RTMP_EFUSE_SUPPORT */\n\t{\"ATERE2P\",\t\t\t\t\t\tSet_ATE_Read_E2P_Proc},\n#ifdef LED_CONTROL_SUPPORT\n#endif /* LED_CONTROL_SUUPORT */\n\t{\"ATEAUTOALC\",\t\t\t\t\tSet_ATE_AUTO_ALC_Proc},\t\n\t{\"ATEIPG\",\t\t\t\t\t\tSet_ATE_IPG_Proc},\n\t{\"ATEPAYLOAD\",\t\t\t\t\tSet_ATE_Payload_Proc},\n#ifdef TXBF_SUPPORT\n\t{\"ATETXBF\",\t\t\t\t\t\tSet_ATE_TXBF_Proc},\n\t{\"ATETXSOUNDING\",\t\t\t\tSet_ATE_TXSOUNDING_Proc},\n\t{\"ATETXBFDIVCAL\",\t\t\t\tSet_ATE_TXBF_DIVCAL_Proc},\n\t{\"ATETXBFLNACAL\",\t\t\t\tSet_ATE_TXBF_LNACAL_Proc},\n\t{\"ATETxBfGolden\",\t\t\t\tSet_ATE_TXBF_GOLDEN_Proc},\n#endif /* TXBF_SUPPORT */\n\t{\"ATESHOW\",\t\t\t\t\t\tSet_ATE_Show_Proc},\n\t{\"ATEHELP\",\t\t\t\t\t\tSet_ATE_Help_Proc},\n\n#ifdef RALINK_QA\n\t{\"TxStop\",\t\t\t\t\t\tSet_TxStop_Proc},\n\t{\"RxStop\",\t\t\t\t\t\tSet_RxStop_Proc},\t\n#endif /* RALINK_QA */\n\n#ifdef MT7601\n\t{\"ATETEMP\",\t\t\t\t\t\tSet_ATE_Read_Temperature_Proc},\n\t{\"ATETSSIDC\",\t\t\t\t\tSet_ATE_Read_TSSI_DC_Proc},\n#endif /* MT7601 */\n\n#endif /* RALINK_ATE */\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n    {\"WpaSupport\",                  Set_Wpa_Support},\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t{\"WscUuidE\",\t\t\t\t\tSet_WscUUIDE_Proc},\n\t{\"WscGetConf\",\t\t\t\t\tSet_WscGetConf_Proc},\n    {\"WscVendorPinCode\",            Set_WscVendorPinCode_Proc},\n#ifdef WSC_V2_SUPPORT\n\t{\"WscForceSetAP\",               Set_WscForceSetAP_Proc},\n#endif /* WSC_V2_SUPPORT */\n#ifdef IWSC_SUPPORT\n\t{\"IWscLimitedUI\",            \tSet_IWscLimitedUI_Proc},\n#ifdef IWSC_TEST_SUPPORT\n\t{\"IWscDefaultSecurity\",        \tSet_IWscDefaultSecurity_Proc},\n\t{\"IWscSmpbcScanOnly\",        \tSet_IWscSmpbcEnrScanOnly_Proc},\n\t{\"IWscEmptySubmaskList\",\t\tSet_IWscEmptySubmaskList_Proc},\n\t{\"IWscBlockConnection\", \t\tSet_IWscBlockConnection_Proc},\n#endif /* IWSC_TEST_SUPPORT */\n\t{\"IWscOOB\",            \t\t\tSet_IWscOOB_Proc},\n\t{\"IWscSinglePIN\",            \tSet_IWscSinglePIN_Proc},\n#endif // IWSC_SUPPORT //\n#endif /* WSC_STA_SUPPORT */\n\n\n\n\n\t{\"FixedTxMode\",                 Set_FixedTxMode_Proc},\n#ifdef CONFIG_APSTA_MIXED_SUPPORT\n\t{\"OpMode\",\t\t\t\t\t\tSet_OpMode_Proc},\n#endif /* CONFIG_APSTA_MIXED_SUPPORT */\n#ifdef DOT11_N_SUPPORT\n    {\"TGnWifiTest\",                 Set_TGnWifiTest_Proc},\n#endif /* DOT11_N_SUPPORT */\n#ifdef QOS_DLS_SUPPORT\n\t{\"DlsAddEntry\",\t\t\t\t\tSet_DlsAddEntry_Proc},\n\t{\"DlsTearDownEntry\",\t\t\tSet_DlsTearDownEntry_Proc},\n#endif /* QOS_DLS_SUPPORT */\n\t{\"LongRetry\",\t        \t\tSet_LongRetryLimit_Proc},\n\t{\"ShortRetry\",\t        \t\tSet_ShortRetryLimit_Proc},\n\t{\"AutoFallBack\",\t        \tSet_AutoFallBack_Proc},\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t{\"11dClientMode\",\t\t\t\tSet_Ieee80211dClientMode_Proc},\n\t{\"CountryCode\", \t\t\t\tSet_ExtCountryCode_Proc},\n\t{\"DfsType\", \t\t\t\t\tSet_ExtDfsType_Proc},\n\t{\"ChannelListAdd\",\t\t\t\tSet_ChannelListAdd_Proc},\n\t{\"ChannelListShow\", \t\t\tSet_ChannelListShow_Proc},\n\t{\"ChannelListDel\",\t\t\t\tSet_ChannelListDel_Proc},\n#endif /* EXT_BUILD_CHANNEL_LIST */\n#ifdef CARRIER_DETECTION_SUPPORT\n\t{\"CarrierDetect\",\t\t\t\tSet_StaCarrierDetect_Proc},\n#endif /* CARRIER_DETECTION_SUPPORT */\n\n\n#ifdef RTMP_EFUSE_SUPPORT\n\t{\"efuseFreeNumber\",\t\t\t\tset_eFuseGetFreeBlockCount_Proc},\n\t{\"efuseDump\",\t\t\t\t\tset_eFusedump_Proc},\n\t{\"efuseLoadFromBin\",\t\t\t\tset_eFuseLoadFromBin_Proc},\n#ifdef RALINK_ATE\n\t{\"efuseBufferModeWriteBack\",\t\tset_eFuseBufferModeWriteBack_Proc},\n#endif /* RALINK_ATE */\n#endif /* RTMP_EFUSE_SUPPORT */\n\n#if defined(RT30xx) || defined(MT7601)\n\t{\"ant\",\t\t\t\t\tSet_Antenna_Proc},\n#ifdef ANT_DIVSERSITY_SUPPORT\n\t{\"ant_sec\",\t\t\t\tSet_AntennaTime_Proc},\n#endif /* ANT_DIVSERSITY_SUPPORT */\n#endif /* defined(RT30xx) || defined(MT7601) */\n\n\n\t{\"BeaconLostTime\",\t\t\t\tSet_BeaconLostTime_Proc},\n\t{\"AutoRoaming\",\t\t\t\t\tSet_AutoRoaming_Proc},\n\t{\"SiteSurvey\",\t\t\t\t\tSet_SiteSurvey_Proc},\n\t{\"ForceTxBurst\",\t\t\t\tSet_ForceTxBurst_Proc},\n\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t{\"TdlsCapable\",\t\t\t\t\tSet_TdlsCapableProc},\n\t{\"TdlsSetup\",\t\t\t\t\tSet_TdlsSetupProc},\n\t{\"TdlsTearDown\",\t\t\t\tSet_TdlsTearDownProc},\n\t{\"TdlsDiscoveryReq\",\t\t\t\tSet_TdlsDiscoveryReqProc},\n\t{\"TdlsTPKLifeTime\",\t\t\t\tSet_TdlsTPKLifeTimeProc},\n#ifdef WFD_SUPPORT\n\t{\"TdlsTunneledReq\",\t\t\t\tSet_TdlsTunneledReqProc},\n#endif /* WFD_SUPPORT */\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t{\"TdlsAutoLink\",\t\t\t\t\tSet_TdlsAutoLinkProc},\n\t{\"TdlsRssiMeasurementPeriod\",\t\tSet_TdlsRssiMeasurementPeriodProc},\n\t{\"TdlsAutoDiscoveryPeriod\",\t\t\tSet_TdlsAutoDiscoveryPeriodProc},\n\t{\"TdlsAutoSetupRssiThreshold\",\t\tSet_TdlsAutoSetupRssiThresholdProc},\n\t{\"TdlsDisabledPeriodByTeardown\",\t\tSet_TdlsDisabledPeriodByTeardownProc},\n\t{\"TdlsAutoTeardownRssiThreshold\",\tSet_TdlsAutoTeardownRssiThresholdProc},\n#endif // TDLS_AUTOLINK_SUPPORT //\n#ifdef UAPSD_SUPPORT\n\t{\"tdls\",\t\t\t\t\t\tTDLS_Ioctl},\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n#ifdef XLINK_SUPPORT\n\t{\"XlinkMode\",\t\t\t\t\tSet_XlinkMode_Proc},\n#endif /* XLINK_SUPPORT */\n\n\n\t{\"AutoReconnect\", \t\t\t\tSet_AutoReconnect_Proc},\n\t{\"AdhocN\",\t\t\t\t\t\tSet_AdhocN_Proc},\n#ifdef AGS_SUPPORT\n\t{\"Ags\",\t\t\t\t\t\tShow_AGS_Proc},\n#endif /* AGS_SUPPORT */\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n\t{\"wow_enable\",\t\t\t\t\tSet_WOW_Enable},\n\t{\"wow_gpio\",\t\t\t\t\tSet_WOW_GPIO},\n\t{\"wow_delay\",\t\t\t\t\tSet_WOW_Delay},\n\t{\"wow_hold\",                    Set_WOW_Hold},\n\t{\"wow_inband\",                  Set_WOW_InBand},\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef RTMP_MAC_USB\n\t{\"usbWOWSuspend\",                  Set_UsbWOWSuspend},\n\t{\"usbWOWResume\",                   Set_UsbWOWResume},\n#endif /* RTMP_MAC_USB */\n\n\t{\"VcoPeriod\",\t\t\t\t\tSet_VcoPeriod_Proc},\n\n#ifdef WFD_SUPPORT\n\t{\"WfdEnable\",\t\t\t\t\t\tSet_WfdEnable_Proc},\n#ifdef RT_CFG80211_SUPPORT\n\t{\"WfdInsertIe\",\t\t\t\t\t\tSet_WfdInsertIe_Proc},\n#endif /* RT_CFG80211_SUPPORT */\n\t{\"WfdDevType\",\t\t\t\t\t\tSet_WfdDeviceType_Proc},\n\t{\"WfdCouple\",\t\t\t\t\t\tSet_WfdCouple_Proc},\n\t{\"WfdSessionAvail\", \t\t\t\tSet_WfdSessionAvailable_Proc},\n\t{\"WfdCP\",\t\t\t\t\t\t\tSet_WfdCP_Proc},\n\t{\"WfdRtspPort\",\t\t\t\t\t\tSet_WfdRtspPort_Proc},\n\t{\"WfdMaxThroughput\",\t\t\t\tSet_WfdMaxThroughput_Proc},\n\t{\"WfdLocalIp\",\t\t\t\t\t\tSet_WfdLocalIp_Proc},\n\t{\"WfdPeerRtspPort\",\t\t\t\t\tSet_PeerRtspPort_Proc},\n#endif /* WFD_SUPPORT */\n\n#ifdef SINGLE_SKU\n\t{\"ModuleTxpower\",\t\t\t\tSet_ModuleTxpower_Proc},\n#endif /* SINGLE_SKU */\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t{\"StaStayTime\",\t\t\t\tSet_StaStayTime_Proc},\n\t{\"P2pStayTime\",\t\t\t\tSet_P2pStayTime_Proc},\n\t{\"LinkDown\",\t\t\t\tSet_LinkDown_Proc},\n\t{\"MultiChannelEnable\",\t\tSet_Multi_Channel_Enable_Proc},\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef FPGA_MODE\n\t{\"fpga_on\",\t\t\t\t\tset_fpga_mode},\n\t{\"dataphy\",\t\t\t\t\tset_data_phy_mode},\n\t{\"databw\",\t\t\t\t\tset_data_bw},\n\t{\"datamcs\",\t\t\t\t\tset_data_mcs},\n\t{\"datagi\",\t\t\t\t\tset_data_gi},\n\t{\"databasize\",\t\t\t\t\tset_data_basize},\n\t{\"txcnt\",\t\t\t\t\t\tset_tx_kickcnt},\n#ifdef RLT_RF\n\t{\"rf\",\t\t\t\t\tset_rf},\n#endif /* RLT_RF */\n#endif /* FPGA_MODE */\n#ifdef CONFIG_MULTI_CHANNEL\n\t{\"StaStayTime\",\t\t\t\tSet_StaStayTime_Proc},\n\t{\"P2pStayTime\",\t\t\t\tSet_P2pStayTime_Proc},\n#endif /* CONFIG_MULTI_CHANNEL */\n\n#ifdef MICROWAVE_OVEN_SUPPORT\n\t{\"MO_FalseCCATh\",               Set_MO_FalseCCATh_Proc},\n#endif /* MICROWAVE_OVEN_SUPPORT */\n\n\t{NULL,}\n};\n\n\nINT RTMPSTAPrivIoctlSet(\n\tIN RTMP_ADAPTER *pAd, \n\tIN PSTRING SetProcName,\n\tIN PSTRING ProcArg)\n{\n\tint ret = 0;\n\t\n\tfor (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)            \n\t{                                                                                                                           \n\t    if (strcmp(SetProcName, PRTMP_PRIVATE_SET_PROC->name) == 0)                                                               \n\t    {\t\t\t\t\t\t                                                                                                \n\t        if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAd, ProcArg))                                                              \n\t        {\t/*FALSE:Set private failed then return Invalid argument */\n\t\t\t    return NDIS_STATUS_FAILURE;                                                                                               \n\t        }                                                                                                                   \n\t\t    break;\t/*Exit for loop. */\n\t    }\n\t}\n\t\n\tif(PRTMP_PRIVATE_SET_PROC->name == NULL)                                                                                    \n\t{  /*Not found argument */\n\t \tDBGPRINT(RT_DEBUG_TRACE, (\"===>rt_ioctl_setparam:: (iwpriv) Not Support Set Command [%s=%s]\\n\", SetProcName, ProcArg));\n\t    return -EINVAL;                                                                                                       \n\t   \n\t}         \n\n\treturn ret;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Set SSID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_SSID_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n    NDIS_802_11_SSID                    Ssid, *pSsid=NULL;\n    BOOLEAN                             StateMachineTouched = FALSE;\n    int                                 success = TRUE;\n\n\t/*\n\t\tSet the AutoReconnectSsid to prevent it reconnect to old SSID\n\t\tSince calling this indicate user don't want to connect to that SSID anymore.\n\t*/\n\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\n\n    if( strlen(arg) <= MAX_LEN_OF_SSID)\n    {\n        NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n        if (strlen(arg) != 0)\n        {\n            NdisMoveMemory(Ssid.Ssid, arg, strlen(arg));\n            Ssid.SsidLength = strlen(arg);\n        }\n        else   /*ANY ssid */\n        {    \n            Ssid.SsidLength = 0; \n\t    \tmemcpy(Ssid.Ssid, \"\", 0);\n\t\t\tpAd->StaCfg.BssType = BSS_INFRA;\t\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n\t        pAd->StaCfg.WepStatus  = Ndis802_11EncryptionDisabled;\t\t    \n\t}\t \n        pSsid = &Ssid;\n\n        if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n        {\n            RTMP_MLME_RESET_STATE_MACHINE(pAd);\n            DBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n        }\n\n\t\tif ((pAd->StaCfg.WpaPassPhraseLen >= 8) &&\n\t\t\t(pAd->StaCfg.WpaPassPhraseLen <= 64))\n\t\t{\n\t\t\tUCHAR keyMaterial[40];\n\t\t\t\n\t\t\tRTMPZeroMemory(pAd->StaCfg.PMK, 32);\n\t\t\tif (pAd->StaCfg.WpaPassPhraseLen == 64)\n\t\t\t{\n\t\t\t    AtoH((PSTRING) pAd->StaCfg.WpaPassPhrase, pAd->StaCfg.PMK, 32);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t    RtmpPasswordHash((PSTRING) pAd->StaCfg.WpaPassPhrase, Ssid.Ssid, Ssid.SsidLength, keyMaterial);\n\t\t\t    NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);\t\t\n\t\t\t}\n\t\t}\n\n\t\t/* Record the desired user settings to MlmeAux */\n\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, Ssid.Ssid, Ssid.SsidLength);\n\t\tpAd->MlmeAux.SsidLen = (UCHAR)Ssid.SsidLength;\n\n\t\tNdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, Ssid.Ssid, Ssid.SsidLength);\n\t\tpAd->MlmeAux.AutoReconnectSsidLen = (UCHAR)Ssid.SsidLength;\n\n        pAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n        pAd->StaCfg.bSkipAutoScanConn = FALSE;\n\t\tpAd->bConfigChanged = TRUE;\n        pAd->StaCfg.bNotFirstScan = FALSE;     \n        \n#ifdef CONFIG_MULTI_CHANNEL\n\tif (P2P_CLI_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\n\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n#endif /*CONFIG_MULTI_CHANNEL*/ \n        MlmeEnqueue(pAd, \n                    MLME_CNTL_STATE_MACHINE, \n                    OID_802_11_SSID,\n                    sizeof(NDIS_802_11_SSID),\n                    (VOID *)pSsid, 0);\n\n        StateMachineTouched = TRUE;\n\t\tif (Ssid.SsidLength == MAX_LEN_OF_SSID)\n\t\t\thex_dump(\"Set_SSID_Proc::Ssid\", Ssid.Ssid, Ssid.SsidLength);\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_SSID_Proc::(Len=%d,Ssid=%s)\\n\", Ssid.SsidLength, Ssid.Ssid));\n    }\n    else\n        success = FALSE;\n\n    if (StateMachineTouched) /* Upper layer sent a MLME-related operations */\n    \tRTMP_MLME_HANDLER(pAd);\n\n    return success;\n}\n\n#ifdef WMM_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set WmmCapable Enable or Disable\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT\tSet_WmmCapable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\tbWmmCapable;\n\n\tbWmmCapable = simple_strtol(arg, 0, 10);\n\n\tif ((bWmmCapable == 1)\n#ifdef RTMP_MAC_USB\n\t\t&& (pAd->NumberOfPipes >= 5)\n#endif /* RTMP_MAC_USB */\n\t\t)\n\t\tpAd->CommonCfg.bWmmCapable = TRUE;\n\telse if (bWmmCapable == 0)\n\t\tpAd->CommonCfg.bWmmCapable = FALSE;\n\telse\n\t\treturn FALSE;  /*Invalid argument */\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WmmCapable_Proc::(bWmmCapable=%d)\\n\", \n\t\tpAd->CommonCfg.bWmmCapable));\n\n\treturn TRUE;\n}\n#endif /* WMM_SUPPORT */\n\n/* \n    ==========================================================================\n    Description:\n        Set Network Type(Infrastructure/Adhoc mode)\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_NetworkType_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n    UINT32\tValue = 0;\n\n    if (strcmp(arg, \"Adhoc\") == 0)\n\t{\n\t\tif (pAd->StaCfg.BssType != BSS_ADHOC)\n\t\t{\t\t\t\t    \n\t\t\t/* Config has changed */\n\t\t\tpAd->bConfigChanged = TRUE;\n            if (MONITOR_ON(pAd))\n            {\n                RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL);\n                RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);\n\t\t\t\tValue &= (~0x80);\n\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);\n                OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n                pAd->StaCfg.bAutoReconnect = TRUE;\n                LinkDown(pAd, FALSE);\n            }\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t{\n\t\t\t\t/*BOOLEAN Cancelled; */\n\t\t\t\t/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */\n\t\t\t\t/* Since calling this indicate user don't want to connect to that SSID anymore. */\n\t\t\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\t\t\n\t\t\t\t\n\t\t\t\tLinkDown(pAd, FALSE);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"NDIS_STATUS_MEDIA_DISCONNECT Event BB!\\n\"));\n\t\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\t\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\t}\t\t\t\n\t\tpAd->StaCfg.BssType = BSS_ADHOC;\n\t\tRTMP_OS_NETDEV_SET_TYPE(pAd->net_dev, pAd->StaCfg.OriDevType);\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"===>Set_NetworkType_Proc::(AD-HOC)\\n\"));\n\t}\n    else if (strcmp(arg, \"Infra\") == 0)\n\t{\n\t\tif (pAd->StaCfg.BssType != BSS_INFRA)\n\t\t{\t\t\t    \n\t\t\t/* Config has changed */\n\t\t\tpAd->bConfigChanged = TRUE;\n            if (MONITOR_ON(pAd))\n            {\n                RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL);\n                RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);\n\t\t\t\tValue &= (~0x80);\n\t\t\t\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);\n                OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n                pAd->StaCfg.bAutoReconnect = TRUE;\n                LinkDown(pAd, FALSE);\n            }\n\t\t\tif (ADHOC_ON(pAd))\n\t\t\t{\n\t\t\t\t/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */\n\t\t\t\t/* Since calling this indicate user don't want to connect to that SSID anymore. */\n\t\t\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\t\t\t\n\t\t\t\n\t\t\t\tLinkDown(pAd, FALSE);\n\t\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\t\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\t}\t\t\t\n\t\tpAd->StaCfg.BssType = BSS_INFRA;\n\t\tRTMP_OS_NETDEV_SET_TYPE(pAd->net_dev, pAd->StaCfg.OriDevType);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"===>Set_NetworkType_Proc::(INFRA)\\n\"));            \n\t}\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n\t/*\n\t\tMonitor2 is for 3593 11n wireshark sniffer tool.\n\t\tThe name, Monitor2, follows the command format in RT2883.\n\t*/\n    else if ((strcmp(arg, \"Monitor\") == 0) || (strcmp(arg, \"Monitor2\") == 0))\n#else\n    else if (strcmp(arg, \"Monitor\") == 0)\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\t{\n\t\tBCN_TIME_CFG_STRUC csr;\n\t\tUCHAR rf_channel, rf_bw;\n\t\tINT ext_ch;\n\n#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT\n\t\tif (strcmp(arg, \"Monitor2\") == 0)\n\t\t\tpAd->StaCfg.BssMonitorFlag |= MONITOR_FLAG_11N_SNIFFER;\n#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */\n\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);\n\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);\n\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\t/* disable all periodic state machine */\n\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n\t\t/* reset all mlme state machine */\n\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"fOP_STATUS_MEDIA_STATE_CONNECTED \\n\"));\n\t\tif (pAd->CommonCfg.CentralChannel == 0)\n\t\t{\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_A | WMODE_AN))\n\t\t\t\tpAd->CommonCfg.CentralChannel = 36;\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\tpAd->CommonCfg.CentralChannel = 6;\n\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\telse\n\t\t\tN_ChannelCheck(pAd);\n#endif /* DOT11_N_SUPPORT */\n\n\n\t\t/* same procedure with window driver */\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 &&\n\t\t\tpAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)\n\t\t{\n\t\t\t/* 40MHz ,control channel at lower */\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;\n\t\t\text_ch = EXTCHA_ABOVE;\n\t\t\trf_bw = BW_40;\n\t\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\t}\n\t\telse if (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n\t                 pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 &&\n\t\t              pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW)\n\t\t{\n\t\t\t/* 40MHz ,control channel at upper */\n\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;\n\t\t\text_ch = EXTCHA_BELOW;\n\t\t\trf_bw = BW_40;\n\t\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\t/* 20MHz */\n\t\t\trf_bw = BW_20;\n\t\t\text_ch = EXTCHA_NONE;\n\t\t\trf_channel = pAd->CommonCfg.Channel;\n\t\t}\n\n\t\tAsicSetChannel(pAd, rf_channel, rf_bw, ext_ch, FALSE);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():BW_%s, CtrlChannel(%d), CentralChannel(%d) \\n\", \n\t\t\t\t\t__FUNCTION__, (rf_bw == BW_40 ? \"40\" : \"20\"),\n\t\t\t\t\tpAd->CommonCfg.Channel,\n\t\t\t\t\tpAd->CommonCfg.CentralChannel));\n\n\n\t\t/* Enable Rx with promiscuous reception */\n\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, 0x3);\n\t\t/* ASIC supporsts sniffer function with replacing RSSI with timestamp. */\n\t\t/*RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value); */\n\t\t/*Value |= (0x80); */\n\t\t/*RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value); */\n\n\t\t/* disable sync */\n\t\tRTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);\n\t\tcsr.field.bBeaconGen = 0;\n\t\tcsr.field.bTBTTEnable = 0;\n\t\tcsr.field.TsfSyncMode = 0;\n\t\tRTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);\n\t    \n\t\tpAd->StaCfg.BssType = BSS_MONITOR;\n\t\tRTMP_OS_NETDEV_SET_TYPE_MONITOR(pAd->net_dev);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"===>Set_NetworkType_Proc::(MONITOR)\\n\"));\n\t}\n\n    /* Reset Ralink supplicant to not use, it will be set to start when UI set PMK key */\n    pAd->StaCfg.WpaState = SS_NOTUSE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_NetworkType_Proc::(NetworkType=%d)\\n\", pAd->StaCfg.BssType));\n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Authentication mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_AuthMode_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n    if ((strcmp(arg, \"WEPAUTO\") == 0) || (strcmp(arg, \"wepauto\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;\n    else if ((strcmp(arg, \"OPEN\") == 0) || (strcmp(arg, \"open\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n    else if ((strcmp(arg, \"SHARED\") == 0) || (strcmp(arg, \"shared\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;\n    else if ((strcmp(arg, \"WPAPSK\") == 0) || (strcmp(arg, \"wpapsk\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;\n    else if ((strcmp(arg, \"WPANONE\") == 0) || (strcmp(arg, \"wpanone\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;\n    else if ((strcmp(arg, \"WPA2PSK\") == 0) || (strcmp(arg, \"wpa2psk\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;    \n#ifdef WPA_SUPPLICANT_SUPPORT    \n    else if ((strcmp(arg, \"WPA\") == 0) || (strcmp(arg, \"wpa\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;    \n    else if ((strcmp(arg, \"WPA2\") == 0) || (strcmp(arg, \"wpa2\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef WAPI_SUPPORT    \n    else if ((strcmp(arg, \"WAICERT\") == 0) || (strcmp(arg, \"waicert\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWAICERT;    \n    else if ((strcmp(arg, \"WAIPSK\") == 0) || (strcmp(arg, \"waipsk\") == 0))\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeWAIPSK;\n#endif /* WAPI_SUPPORT */\n    else\n        return FALSE;  \n\n    pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_AuthMode_Proc::(AuthMode=%d)\\n\", pAd->StaCfg.AuthMode));\n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Encryption Type\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_EncrypType_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n    if ((strcmp(arg, \"NONE\") == 0) || (strcmp(arg, \"none\") == 0))\n    {\n        if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n            return TRUE;    /* do nothing */\n            \n        pAd->StaCfg.WepStatus     = Ndis802_11WEPDisabled;\n        pAd->StaCfg.PairCipher    = Ndis802_11WEPDisabled;\n\t    pAd->StaCfg.GroupCipher   = Ndis802_11WEPDisabled;\n    }\n    else if ((strcmp(arg, \"WEP\") == 0) || (strcmp(arg, \"wep\") == 0))\n    {\n        if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n            return TRUE;    /* do nothing */\n            \n        pAd->StaCfg.WepStatus     = Ndis802_11WEPEnabled;\n        pAd->StaCfg.PairCipher    = Ndis802_11WEPEnabled;\n\t    pAd->StaCfg.GroupCipher   = Ndis802_11WEPEnabled;\t\t\n    }\n    else if ((strcmp(arg, \"TKIP\") == 0) || (strcmp(arg, \"tkip\") == 0))\n    {\n        if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n            return TRUE;    /* do nothing */\n            \n        pAd->StaCfg.WepStatus     = Ndis802_11Encryption2Enabled;\n        pAd->StaCfg.PairCipher    = Ndis802_11Encryption2Enabled;\n\t    pAd->StaCfg.GroupCipher   = Ndis802_11Encryption2Enabled;\n    }\n    else if ((strcmp(arg, \"AES\") == 0) || (strcmp(arg, \"aes\") == 0))\n    {\n        if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n            return TRUE;    /* do nothing */\n            \n        pAd->StaCfg.WepStatus     = Ndis802_11Encryption3Enabled;\n        pAd->StaCfg.PairCipher    = Ndis802_11Encryption3Enabled;\n\t    pAd->StaCfg.GroupCipher   = Ndis802_11Encryption3Enabled;\n    }\n#ifdef WAPI_SUPPORT\n\telse if ((strcmp(arg, \"SMS4\") == 0) || (strcmp(arg, \"sms4\") == 0))\n    {\n        if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWAICERT) &&\n\t\t\t(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWAIPSK))\n            return TRUE;    /* do nothing */\n            \n        pAd->StaCfg.WepStatus     = Ndis802_11EncryptionSMS4Enabled;\n        pAd->StaCfg.PairCipher    = Ndis802_11EncryptionSMS4Enabled;\n\t    pAd->StaCfg.GroupCipher   = Ndis802_11EncryptionSMS4Enabled;\n    }\n#endif /* WAPI_SUPPORT */\n    else\n        return FALSE;\n\n\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t{\n\t\t/* Build all corresponding channel information */\n\t\tRTMPSetPhyMode(pAd, pAd->CommonCfg.cfg_wmode);\n\t}\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_EncrypType_Proc::(EncrypType=%d)\\n\", pAd->StaCfg.WepStatus));\n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Default Key ID\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_DefaultKeyID_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    ULONG                               KeyIdx;\n\n    KeyIdx = simple_strtol(arg, 0, 10);\n    if((KeyIdx >= 1 ) && (KeyIdx <= 4))\n        pAdapter->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1 );\n    else\n        return FALSE;  /*Invalid argument */\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_DefaultKeyID_Proc::(DefaultKeyID=%d)\\n\", pAdapter->StaCfg.DefaultKeyId));\n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY1\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_Key1_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    int                                 KeyLen;\n    int                                 i;\n    UCHAR                               CipherAlg=CIPHER_WEP64;\n\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        return TRUE;    /* do nothing */\n    \n    KeyLen = strlen(arg);\n\n    switch (KeyLen)\n    {\n        case 5: /*wep 40 Ascii type */\n            pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][0].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key1_Proc::(Key1=%s and type=%s)\\n\", arg, \"Ascii\"));       \n            break;\n        case 10: /*wep 40 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][0].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key1_Proc::(Key1=%s and type=%s)\\n\", arg, \"Hex\"));     \n            break;\n        case 13: /*wep 104 Ascii type */\n            pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][0].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key1_Proc::(Key1=%s and type=%s)\\n\", arg, \"Ascii\"));       \n            break;\n        case 26: /*wep 104 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][0].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key1_Proc::(Key1=%s and type=%s)\\n\", arg, \"Hex\"));     \n            break;\n        default: /*Invalid argument */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key1_Proc::Invalid argument (=%s)\\n\", arg));       \n            return FALSE;\n    }\n    \n    pAdapter->SharedKey[BSS0][0].CipherAlg = CipherAlg;\n\n    /* Set keys (into ASIC) */\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        ;   /* not support */\n    else    /* Old WEP stuff */\n    {\n        AsicAddSharedKeyEntry(pAdapter, \n                              0, \n                              0, \n                              &pAdapter->SharedKey[BSS0][0]);\n    }\n    \n    return TRUE;\n}\n/* \n    ==========================================================================\n\n    Description:\n        Set WEP KEY2\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_Key2_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    int                                 KeyLen;\n    int                                 i;\n    UCHAR                               CipherAlg=CIPHER_WEP64;\n\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        return TRUE;    /* do nothing */\n    \n    KeyLen = strlen(arg);\n\n    switch (KeyLen)\n    {\n        case 5: /*wep 40 Ascii type */\n            pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][1].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key2_Proc::(Key2=%s and type=%s)\\n\", arg, \"Ascii\"));\n            break;\n        case 10: /*wep 40 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][1].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key2_Proc::(Key2=%s and type=%s)\\n\", arg, \"Hex\"));\n            break;\n        case 13: /*wep 104 Ascii type */\n            pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][1].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key2_Proc::(Key2=%s and type=%s)\\n\", arg, \"Ascii\"));\n            break;\n        case 26: /*wep 104 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][1].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key2_Proc::(Key2=%s and type=%s)\\n\", arg, \"Hex\"));\n            break;\n        default: /*Invalid argument */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key2_Proc::Invalid argument (=%s)\\n\", arg));\n            return FALSE;\n    }\n    pAdapter->SharedKey[BSS0][1].CipherAlg = CipherAlg;\n\n    /* Set keys (into ASIC) */\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        ;   /* not support */\n    else    /* Old WEP stuff */\n    {\n        AsicAddSharedKeyEntry(pAdapter, \n                              0, \n                              1, \n                              &pAdapter->SharedKey[BSS0][1]);\n    }        \n    \n    return TRUE;\n}\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY3\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_Key3_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    int                                 KeyLen;\n    int                                 i;\n    UCHAR                               CipherAlg=CIPHER_WEP64;\n\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        return TRUE;    /* do nothing */\n    \n    KeyLen = strlen(arg);\n\n    switch (KeyLen)\n    {\n        case 5: /*wep 40 Ascii type */\n            pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][2].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key3_Proc::(Key3=%s and type=Ascii)\\n\", arg));\n            break;\n        case 10: /*wep 40 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][2].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key3_Proc::(Key3=%s and type=Hex)\\n\", arg));\n            break;\n        case 13: /*wep 104 Ascii type */\n            pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][2].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key3_Proc::(Key3=%s and type=Ascii)\\n\", arg));\n            break;\n        case 26: /*wep 104 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][2].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key3_Proc::(Key3=%s and type=Hex)\\n\", arg));\n            break;\n        default: /*Invalid argument */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key3_Proc::Invalid argument (=%s)\\n\", arg));\n            return FALSE;\n    }\n    pAdapter->SharedKey[BSS0][2].CipherAlg = CipherAlg;\n    \n    /* Set keys (into ASIC) */\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        ;   /* not support */\n    else    /* Old WEP stuff */\n    {\n        AsicAddSharedKeyEntry(pAdapter, \n                              0, \n                              2, \n                              &pAdapter->SharedKey[BSS0][2]);\n    }\n    \n    return TRUE;\n}\n/* \n    ==========================================================================\n    Description:\n        Set WEP KEY4\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_Key4_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    int                                 KeyLen;\n    int                                 i;\n    UCHAR                               CipherAlg=CIPHER_WEP64;\n\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        return TRUE;    /* do nothing */\n    \n    KeyLen = strlen(arg);\n\n    switch (KeyLen)\n    {\n        case 5: /*wep 40 Ascii type */\n            pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][3].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key4_Proc::(Key4=%s and type=%s)\\n\", arg, \"Ascii\"));\n            break;\n        case 10: /*wep 40 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][3].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP64;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key4_Proc::(Key4=%s and type=%s)\\n\", arg, \"Hex\"));\n            break;\n        case 13: /*wep 104 Ascii type */\n            pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen;\n            memcpy(pAdapter->SharedKey[BSS0][3].Key, arg, KeyLen);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key4_Proc::(Key4=%s and type=%s)\\n\", arg, \"Ascii\"));\n            break;\n        case 26: /*wep 104 Hex type */\n            for(i=0; i < KeyLen; i++)\n            {\n                if( !isxdigit(*(arg+i)) )\n                    return FALSE;  /*Not Hex value; */\n            }\n            pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen / 2 ;\n            AtoH(arg, pAdapter->SharedKey[BSS0][3].Key, KeyLen / 2);\n            CipherAlg = CIPHER_WEP128;\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key4_Proc::(Key4=%s and type=%s)\\n\", arg, \"Hex\"));\n            break;\n        default: /*Invalid argument */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set_Key4_Proc::Invalid argument (=%s)\\n\", arg));\n            return FALSE;\n    } \n    pAdapter->SharedKey[BSS0][3].CipherAlg = CipherAlg;\n    \n    /* Set keys (into ASIC) */\n    if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n        ;   /* not support */\n    else    /* Old WEP stuff */\n    {\n        AsicAddSharedKeyEntry(pAdapter, \n                              0, \n                              3, \n                              &pAdapter->SharedKey[BSS0][3]);\n    }\n    \n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set WPA PSK key\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_WPAPSK_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n    int status;\n\t\n    if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) && \n        (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&\n\t    (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)\n#ifdef WAPI_SUPPORT\n\t\t && (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWAICERT)\n\t\t && (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n\t\t)\n        return TRUE;    /* do nothing */\n        \n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_WPAPSK_Proc::(WPAPSK=%s)\\n\", arg));\n\n\tstatus = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, pAd->StaCfg.PMK);\n\tif (status == FALSE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WPAPSK_Proc(): Set key failed!\\n\"));\n\t\treturn FALSE;\n\t}\n\tNdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);\n    NdisMoveMemory(pAd->StaCfg.WpaPassPhrase, arg, strlen(arg));\n    pAd->StaCfg.WpaPassPhraseLen = (UINT)strlen(arg);\n\n#ifdef WSC_STA_SUPPORT\n    NdisZeroMemory(pAd->StaCfg.WscControl.WpaPsk, 64);\n    pAd->StaCfg.WscControl.WpaPskLen = 0;    \n    NdisMoveMemory(pAd->StaCfg.WscControl.WpaPsk, arg, strlen(arg));\n    pAd->StaCfg.WscControl.WpaPskLen = (INT)strlen(arg);\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef WAPI_SUPPORT\n\tNdisZeroMemory(pAd->StaCfg.WAPIPassPhrase, 64);\n    pAd->StaCfg.WAPIPassPhraseLen = 0;    \n    NdisMoveMemory(pAd->StaCfg.WAPIPassPhrase, arg, strlen(arg));\n    pAd->StaCfg.WAPIPassPhraseLen = (UINT)strlen(arg);\n#endif /* WAPI_SUPPORT */\n\n    if(pAd->StaCfg.BssType == BSS_ADHOC &&\n       pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n    {\n        pAd->StaCfg.WpaState = SS_NOTUSE;     \n    }\n    else\n    {\n        /* Start STA supplicant state machine */\n        pAd->StaCfg.WpaState = SS_START;\n    }    \n\n    return TRUE;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Set Power Saving mode\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_PSMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    if (pAdapter->StaCfg.BssType == BSS_INFRA)\n    {\n        if ((strcmp(arg, \"Max_PSP\") == 0) || \n\t\t\t(strcmp(arg, \"max_psp\") == 0) ||\n\t\t\t(strcmp(arg, \"MAX_PSP\") == 0))\n        {\n            /* do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() */\n            /* to exclude certain situations. */\n            if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)\n                pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;\n            pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;\n            OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);\n            pAdapter->StaCfg.DefaultListenCount = 5;\n        \n        }\n        else if ((strcmp(arg, \"Fast_PSP\") == 0) || \n\t\t\t\t (strcmp(arg, \"fast_psp\") == 0) ||\n                 (strcmp(arg, \"FAST_PSP\") == 0))\n        {\n            /* do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() */\n            /* to exclude certain situations. */\n            OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);\n            if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)\n                pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;\n            pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;\n            pAdapter->StaCfg.DefaultListenCount = 3;\n        }\n        else if ((strcmp(arg, \"Legacy_PSP\") == 0) || \n                 (strcmp(arg, \"legacy_psp\") == 0) || \n                 (strcmp(arg, \"LEGACY_PSP\") == 0))\n        {\n            /* do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() */\n            /* to exclude certain situations. */\n            OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);\n            if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)\n                pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;\n            pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;\n            pAdapter->StaCfg.DefaultListenCount = 3;\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tpAdapter->StaCfg.DefaultListenCount = 1;\n#endif // DOT11Z_TDLS_SUPPORT //\n        }\n        else\n        {\n            /*Default Ndis802_11PowerModeCAM */\n            /* clear PSM bit immediately */\n            RTMP_SET_PSM_BIT(pAdapter, PWR_ACTIVE);\n            OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);\n            if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)\n                pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;\n            pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;\n\n        }\n\n        DBGPRINT(RT_DEBUG_TRACE, (\"Set_PSMode_Proc::(PSMode=%ld)\\n\", pAdapter->StaCfg.WindowsPowerMode));\n    }\n    else\n        return FALSE;\n\n        \n    return TRUE;\n}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n/* \n    ==========================================================================\n    Description:\n        Set WpaSupport flag.\n    Value:\n        0: Driver ignore wpa_supplicant.\n        1: wpa_supplicant initiates scanning and AP selection.\n        2: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters.\n    Return:\n        TRUE if all parameters are OK, FALSE otherwise\n    ==========================================================================\n*/\nINT Set_Wpa_Support(\n    IN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n    if ( simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;\n    else if ( simple_strtol(arg, 0, 10) == 1)\n        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;\n    else if ( simple_strtol(arg, 0, 10) == 2)\n        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE_WITH_WEB_UI;\n    else\n        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_Wpa_Support::(WpaSupplicantUP=%d)\\n\", pAd->StaCfg.WpaSupplicantUP));\n    \n    return TRUE;    \n}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\n#ifdef WSC_STA_SUPPORT\n#define WSC_GET_CONF_MODE_EAP\t1\n#define WSC_GET_CONF_MODE_UPNP\t2\nINT\t Set_WscConfMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tpWscControl = &pAd->StaCfg.WscControl;\n\n    if ( simple_strtol(arg, 0, 10) == 0)\n        pWscControl->WscConfMode = WSC_DISABLE;\n    else if ( simple_strtol(arg, 0, 10) == 1)\n        pWscControl->WscConfMode = WSC_ENROLLEE;\n    else if ( simple_strtol(arg, 0, 10) == 2)\n        pWscControl->WscConfMode = WSC_REGISTRAR;\n    else\n        pWscControl->WscConfMode = WSC_DISABLE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra0) Set_WscConfMode_Proc::(WscConfMode(0,1,2)=%d)\\n\", pWscControl->WscConfMode));\n\n#ifdef IWSC_SUPPORT\n#ifdef IWSC_TEST_SUPPORT\n\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t{\n\t\tPIWSC_INFO pIWscInfo = &pAd->StaCfg.IWscInfo;\n\t\tpIWscInfo->IWscConfMode = WSC_DISABLE;\n\t\tif ( simple_strtol(arg, 0, 10) == 1)\n\t        pIWscInfo->IWscConfMode = WSC_ENROLLEE;\n\t\telse if ( simple_strtol(arg, 0, 10) == 2)\n\t        pIWscInfo->IWscConfMode = WSC_REGISTRAR;\n\t    else\n\t\t\treturn FALSE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra0) Set_WscConfMode_Proc::(IWscConfMode=%d)\\n\", pIWscInfo->IWscConfMode));\n\t}\n#endif /* IWSC_TEST_SUPPORT */\n#endif /* IWSC_SUPPORT */\n\n\treturn TRUE;\n}\n\nINT\tSet_WscConfStatus_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR     IsAPConfigured = 1;\n\n\tIsAPConfigured = (UCHAR)simple_strtol(arg, 0, 10);\n\n\tif ((IsAPConfigured  > 0) && (IsAPConfigured  <= 2))\n        pAd->StaCfg.WscControl.WscConfStatus = IsAPConfigured;\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscConfStatus_Proc:: Set failed!!(WscConfStatus=%s), WscConfStatus is 1 or 2 \\n\", arg));\n        DBGPRINT(RT_DEBUG_TRACE, (\"Set_WscConfStatus_Proc:: WscConfStatus is not changed (%d) \\n\", pAd->StaCfg.WscControl.WscConfStatus));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscConfStatus_Proc::(WscConfStatus=%d)\\n\", pAd->StaCfg.WscControl.WscConfStatus));\n\n\treturn TRUE;\n}\n\nINT Set_WscSsid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tULONG\t\tApIdx = 0;\n\t\n\tpWscControl = &pAd->StaCfg.WscControl;\n\n\tNdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));\n\n\tif( (strlen(arg) > 0) && (strlen(arg) <= MAX_LEN_OF_SSID))\n    {\n\t\tNdisMoveMemory(pWscControl->WscSsid.Ssid, arg, strlen(arg));\n\t\tpWscControl->WscSsid.SsidLength = strlen(arg);\n\n\t\t//add SSID into pAd->MlmeAux.Ssid\n        NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n        NdisMoveMemory(pAd->MlmeAux.Ssid, arg, strlen(arg));\n        pAd->MlmeAux.SsidLen = strlen(arg);\n\n\t\tNdisZeroMemory(pWscControl->WscBssid, MAC_ADDR_LEN);\n\t\tApIdx = WscSearchWpsApBySSID(pAd,\n\t\t\t\t\t\t\t\t\t pWscControl->WscSsid.Ssid, \n\t\t\t\t\t\t\t\t\t pWscControl->WscSsid.SsidLength, \n\t\t\t\t\t\t\t\t\t WSC_PIN_MODE);\n\t\tif (ApIdx != BSS_NOT_FOUND)\n\t\t{\n\t\t\tNdisMoveMemory(pWscControl->WscBssid, pAd->ScanTab.BssEntry[ApIdx].Bssid,MAC_ADDR_LEN);\n\t\t\tpAd->MlmeAux.Channel = pAd->ScanTab.BssEntry[ApIdx].Channel;\n\t\t}\n\t\t\n\t\thex_dump(\"Set_WscSsid_Proc:: WscBssid\", pWscControl->WscBssid, MAC_ADDR_LEN);\t\t\n\t\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscSsid_Proc:: (Select SsidLen=%d,Ssid=%s)\\n\", \n\t\t\t\tpWscControl->WscSsid.SsidLength, pWscControl->WscSsid.Ssid));\n\t}\n\telse\n\t\treturn FALSE;\t/*Invalid argument */\n\n\treturn TRUE;\t\n\n}\n\n\nINT Set_WscBssid_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\t\t\tMacAddr[MAC_ADDR_LEN];\n\n\tif (rtstrmactohex(arg, (PSTRING) &MacAddr[0]) == FALSE)\n\t\treturn FALSE;\n\n\tRTMPZeroMemory(pAd->StaCfg.WscControl.WscBssid, MAC_ADDR_LEN);\n\tRTMPMoveMemory(pAd->StaCfg.WscControl.WscBssid, MacAddr, MAC_ADDR_LEN);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscBssid_Proc:: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n        MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]));\n\t \n\treturn TRUE;\n}\n\nINT\tSet_WscMode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tINT\t        WscMode;\n\tPWSC_CTRL\tpWscControl;\n\tpWscControl = &pAd->StaCfg.WscControl;\n\t\n\tWscMode = (INT)simple_strtol(arg, 0, 10);\n    \n\tif ((WscMode == WSC_SMPBC_MODE) && \n\t\t(pAd->StaCfg.BssType == BSS_INFRA))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscMode_Proc:: Set failed!!(Set_WscMode_Proc=%s)\\n\", arg));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\n\t\n    if ((WscMode == WSC_PIN_MODE ) || \n\t\t(WscMode == WSC_PBC_MODE) ||\n\t\t(WscMode == WSC_SMPBC_MODE))\n    {\n    \t/* save wsc mode */\n        pWscControl->WscMode = WscMode;\n    }\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscMode_Proc:: Set failed!!(Set_WscMode_Proc=%s)\\n\", arg));\n\t\treturn FALSE;  /*Invalid argument */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscMode_Proc::(WscMode=%d)\\n\",  pWscControl->WscMode));\n\n\treturn TRUE;\n}\n\nINT\tSet_WscPinCode_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tBOOLEAN     validatePin;\n\tUINT        PinCode = 0;\n\n\tpWscControl = &pAd->StaCfg.WscControl;\n\n\tPinCode = simple_strtol(arg, 0, 10); /* When PinCode is 03571361, return value is 3571361. */\n\tif ( strlen(arg) == 4 )\n\t\tvalidatePin = TRUE;\n\telse\n\t\tvalidatePin = ValidateChecksum(PinCode);\n\tif (validatePin)\n    {\n    \tif (pWscControl->WscRejectSamePinFromEnrollee && \n             (PinCode == pWscControl->WscLastPinFromEnrollee))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PIN authentication or communication error occurs!!\\n\"\n                     \"Registrar does NOT accept the same PIN again!(PIN:%08u)\\n\", PinCode));\n\t\t\treturn FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpWscControl->WscRejectSamePinFromEnrollee = FALSE;\n\t\t\tpWscControl->WscPinCode = PinCode;\n\t\t\tpWscControl->WscLastPinFromEnrollee = pWscControl->WscPinCode;\n\t\t\tif ( strlen(arg) == 4)\n\t\t\t{\n\t\t\t\tpWscControl->WscPinCodeLen = 4;\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\n\t\t\t\tpWscControl->WscPinCodeLen = 8;\n\t\t\t}\n\t\t\tWscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);\n\t\t\t\n#ifdef IWSC_SUPPORT\n\t\t\tif ((pAd->StaCfg.BssType == BSS_ADHOC) &&\n\t\t\t\t(pWscControl->bWscTrigger == TRUE))\n\t\t\t{\n\t\t\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_PEER_PIN, 0, NULL, 0);\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t}        \t    \n\t}\n\telse\n\t{\t\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscPinCode_Proc:: Checksum is invalid\\n\"));\n        return FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra0) Set_WscPinCode_Proc::(PinCode=%d)\\n\", pWscControl->WscPinCode));\n\n\treturn TRUE;\n}\n\nINT\tSet_WscUUIDE_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL           pWscControl;\n\tint i,UUIDLen;\n\tUCHAR\t\t\t\ttmp_Uuid_Str[UUID_LEN_STR];\n\tUCHAR\t\t\t\tWsc_Uuid_E[UUID_LEN_HEX];\n\tUCHAR\t\t\t\tWsc_Uuid_Str[UUID_LEN_STR];\n\tUCHAR\t\t\t\tuuidTmpStr[UUID_LEN_STR+2];\n\tWSC_UUID_T uuid_t;\n\t\n\tUUIDLen = strlen(arg);\n\tif ( UUIDLen != 32)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Length of UUID key is wrong length=%d\\n\",UUIDLen));\n\t\treturn FALSE;\n\t}\n\tNdisMoveMemory(tmp_Uuid_Str, arg, UUIDLen);\n    \tpWscControl = &pAd->StaCfg.WscControl;\n\n\tfor(i=0; i < UUIDLen; i++)\n\t{\n\t\tif( !isxdigit(tmp_Uuid_Str[i]) )\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Input %d not Hex Value\\n\",i));\n\t\t\treturn FALSE;  //Not Hex value;\n\t\t}\n\t}\n\tAtoH(tmp_Uuid_Str, Wsc_Uuid_E, UUID_LEN_HEX);\n\tNdisMoveMemory(&uuid_t, Wsc_Uuid_E, UUID_LEN_HEX);\n\tNdisZeroMemory(uuidTmpStr, sizeof(uuidTmpStr));\n\tsprintf(uuidTmpStr, \"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\", \n\t\t\t(unsigned int)uuid_t.timeLow, uuid_t.timeMid, uuid_t.timeHi_Version, uuid_t.clockSeqHi_Var, uuid_t.clockSeqLow, \n\t\t\tuuid_t.node[0], uuid_t.node[1], uuid_t.node[2], uuid_t.node[3], uuid_t.node[4], uuid_t.node[5]);\n\n\tif (strlen(uuidTmpStr) > UUID_LEN_STR)\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ERROR:UUID String size too large!\\n\"));\n\n\tstrncpy((PSTRING)pWscControl->Wsc_Uuid_Str, uuidTmpStr, UUID_LEN_STR);\n\tNdisMoveMemory(&pWscControl->Wsc_Uuid_E[0], Wsc_Uuid_E, UUID_LEN_HEX);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"The UUID Hex string is:\"));\n\tfor (i=0; i< 16; i++)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%02x\", (pWscControl->Wsc_Uuid_E[i] & 0xff)));\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"The UUID ASCII string is:%s!\\n\", pWscControl->Wsc_Uuid_Str));\n\treturn 0;\n}\n\nINT\tSet_WscGetConf_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL           pWscControl;\n\tPWSC_UPNP_NODE_INFO pWscUPnPNodeInfo;\n    INT\t                idx;\n    BOOLEAN             StateMachineTouched = FALSE;\n    \n#ifdef WSC_LED_SUPPORT\n\tUCHAR WPSLEDStatus;\n#endif /* WSC_LED_SUPPORT */\n    \n#ifdef IWSC_SUPPORT\n\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t{\n\t\tif (pAd->StaCfg.WscControl.bWscTrigger)\n\t\t\tIWSC_Stop(pAd, TRUE);\n\t\telse\n\t\t\tIWSC_Stop(pAd, FALSE);\n\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&\n\t\t\t(pAd->StaCfg.IWscInfo.IpMethod == IWSC_IPV4_ASSIGNMENT) &&\n\t\t\t(pAd->StaCfg.IWscInfo.RegDepth != 0) &&\n\t\t\t(pAd->StaCfg.IWscInfo.AvaSubMaskListCount == 0))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Empty Available IPv4 Submask List. Cannot be Registrar\\n\"));\n\t\t\tpAd->StaCfg.WscControl.WscStatus = STATUS_WSC_EMPTY_IPV4_SUBMASK_LIST;\n\t\t\treturn TRUE;\n\t\t}\n\t\tMlmeEnqueue(pAd, IWSC_STATE_MACHINE, IWSC_MT2_MLME_START, 0, NULL, 0);\n\t\tRTMP_MLME_HANDLER(pAd);\n\t\treturn TRUE;\n\t}\n#endif /* IWSC_SUPPORT */\n    \n    pWscControl = &pAd->StaCfg.WscControl;\n    pWscUPnPNodeInfo = &pWscControl->WscUPnPNodeInfo;\n\n    if (pWscControl->WscConfMode == WSC_DISABLE)\n    {\n        pWscControl->bWscTrigger = FALSE;\n        DBGPRINT(RT_DEBUG_TRACE, (\"Set_WscGetConf_Proc: WPS is disabled.\\n\"));\n\t\treturn FALSE;\n    }\n\n\tWscStop(pAd,\n#ifdef CONFIG_AP_SUPPORT\n\t\t\tFALSE,\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\tpWscControl);    \n    \n    /* trigger wsc re-generate public key */\n    pWscControl->RegData.ReComputePke = 1;\n\n\t/* Change to init state before sending a disassociation frame */\n\tpAd->StaCfg.WscControl.WscState = WSC_STATE_INIT;\n\n\t/* 0. Send a disassoication frame */\n\tif (INFRA_ON(pAd))\n\t{\n\t\tMLME_DISASSOC_REQ_STRUCT\tDisassocReq;\n\n\t\tif (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t\t{\n\t\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t/* Set to immediately send the media disconnect event */\n\t\tpAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"disassociate with current AP before starting WPS\\n\"));\n\t\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);\n\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, \n\t\t\t\t\tsizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\tRTMP_MLME_HANDLER(pAd);\n\n\t\t/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */\n\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\n\n\t\tpWscControl->bWscTrigger = FALSE;\t/* check to disable */\n\t\tOS_WAIT(500);  /* leave enough time for this DISASSOC frame */\n\t}\n\telse if (ADHOC_ON(pAd))\n\t{\n\t\tUSHORT\tTmpWscMode;\n\t\t/*\n\t\t\tSet the AutoReconnectSsid to prevent it reconnect to old SSID\n\t\t\tSince calling this indicate user don't want to connect to that SSID anymore.\n\t\t*/\n\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\t\t\t\n\t\tif (pWscControl->WscMode == 1)\n\t\t\tTmpWscMode = DEV_PASS_ID_PIN;\n\t\telse\n\t\t\tTmpWscMode = DEV_PASS_ID_PBC;\n\t\tAsicDisableSync(pAd);\n\t\tWscBuildBeaconIE(pAd, pWscControl->WscConfStatus, TRUE, TmpWscMode, pWscControl->WscConfigMethods, BSS0, NULL, 0, STA_MODE);\n\t\tif (pWscControl->WscConfMode == WSC_REGISTRAR)\n\t\t{\n\t\t\tWscBuildProbeRespIE(pAd,\n\t\t\t\tWSC_MSGTYPE_REGISTRAR,\n\t\t\t\tpWscControl->WscConfStatus,\n\t\t\t\tTRUE,\n\t\t\t\tTmpWscMode,\n\t\t\t\tpWscControl->WscConfigMethods,\n\t\t\t\tBSS0,\n\t\t\t\tNULL,\n\t\t\t\t0,\n\t\t\t\tSTA_MODE);\n\t\t\tMakeIbssBeacon(pAd);\n\t\t\tAsicEnableIbssSync(pAd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWscBuildProbeRespIE(pAd,\n\t\t\t\tWSC_MSGTYPE_ENROLLEE_INFO_ONLY,\n\t\t\t\tpWscControl->WscConfStatus,\n\t\t\t\tTRUE,\n\t\t\t\tTmpWscMode,\n\t\t\t\tpWscControl->WscConfigMethods,\n\t\t\t\tBSS0,\n\t\t\t\tNULL,\n\t\t\t\t0,\n\t\t\t\tSTA_MODE);\n\t\t\tLinkDown(pAd, FALSE);\n\t\t}\n\t\t\n\t}\n\n    pWscControl->bWscTrigger = TRUE;\n    pWscControl->WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\n\t/* */\n\t/* Action : PIN, PBC */\n\t/* */\n\tif (pWscControl->WscMode == 1)\n\t{\n\t\tINT\t\tWaitCnt = 0;\n\t\t/* PIN  - default */\n\n\t\t/* 2. Enqueue BSSID/SSID connection command */\n\t\tif (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t\t{\n\t\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n\t\t}\n\n\t\tWscInitRegistrarPair(pAd, pWscControl, BSS0);\n\n\t\t/*\n\t\t\tWe need to make sure target AP is in the scan table.\n\t\t*/\n\t\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\t\twhile ((ScanRunning(pAd) == TRUE) && (WaitCnt++ < 200))\n\t\t\tOS_WAIT(500);\n\n\t\tpAd->MlmeAux.AutoReconnectSsidLen= 0;\n\t\tpAd->bConfigChanged = TRUE;\n\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\tOID_802_11_BSSID,\n\t\t\t\t\tMAC_ADDR_LEN,\n\t\t\t\t\tpAd->StaCfg.WscControl.WscBssid, 0);\n\t\tpWscControl->WscState = WSC_STATE_START;\n\t\tStateMachineTouched = TRUE;\n\n    \tRTMPSetTimer(&pWscControl->Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);\n    \tpWscControl->Wsc2MinsTimerRunning = TRUE;\n    \tpWscControl->WscStatus = STATUS_WSC_LINK_UP;\n\n\t\t/*WscSendUPnPConfReqMsg(pAd, apidx, pAd->ApCfg.MBSSID[apidx].Ssid, pAd->ApCfg.MBSSID[apidx].Bssid, 3, 0); */\n\t}\n\telse\n\t{\n\t\tif ((pAd->StaCfg.BssType == BSS_INFRA) ||\n\t\t\t(pWscControl->WscConfMode == WSC_ENROLLEE))\n\t\t{\n\t\t\tpWscControl->WscSsid.SsidLength = 0;\n\t\t\tNdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));\n\t\t\tpWscControl->WscPBCBssCount = 0;\n\t\t\t/* WPS - SW PBC */\n\t\t\tWscPushPBCAction(pAd, pWscControl);\n\t\t\tStateMachineTouched = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWscInitRegistrarPair(pAd, pWscControl, BSS0);\n\t\t\tWscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);\n\t\t\tRTMPSetTimer(&pWscControl->Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);\n\t\t\tpWscControl->Wsc2MinsTimerRunning = TRUE;\n\t\t\tpWscControl->WscState = WSC_STATE_LINK_UP;\n\t\t}\n\t}\n    \n#ifdef WSC_LED_SUPPORT\n#ifdef CONFIG_WIFI_LED_SUPPORT\n\t/* Change FW default mode to WPS LED share mode*/\n\tpAd->LedCntl.MCULedCntl.word &= 0x80;\n\tpAd->LedCntl.MCULedCntl.word |= WPS_LED_MODE_SHARE;\n\t\n\tif (LED_MODE(pAd) == WPS_LED_MODE_SHARE)\n\t{\n\t\tWPSLEDStatus = LED_WPS_PRE_STAGE;\n\t\tRTMPSetTimer(&pWscControl->WscLEDTimer, WSC_WPS_PREPOST_WIFI_LED_TIMEOUT);\n\t}\n\telse\n#endif /* CONFIG_WIFI_LED_SUPPORT */\n    \tWPSLEDStatus = LED_WPS_IN_PROCESS;\n\t\tRTMPSetLED(pAd, WPSLEDStatus);\n#endif /* WSC_LED_SUPPORT */\n\n\n    /* Enrollee 192 random bytes for DH key generation */\n\tfor (idx = 0; idx < 192; idx++)\n\t\tpWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd);\n    \n\tif (pWscControl->WscProfileRetryTimerRunning)\n\t{\n\t\tBOOLEAN Cancelled;\n\t\tpWscControl->WscProfileRetryTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWscControl->WscProfileRetryTimer, &Cancelled);\n\t}\n\n\tif (StateMachineTouched) /* Upper layer sent a MLME-related operations */\n\t\tRTMP_MLME_HANDLER(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_WscGetConf_Proc trigger WSC state machine\\n\"));\n\n\treturn TRUE;\n}\n\n#ifdef WSC_V2_SUPPORT\nINT Set_WscForceSetAP_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n\tPWSC_V2_INFO pWscV2Info = &pAd->StaCfg.WscControl.WscV2Info;\n\t\n\tif (simple_strtol(arg, 0, 10) == 0)\n\t\tpWscV2Info->bForceSetAP = FALSE;\n\telse\n\t\tpWscV2Info->bForceSetAP = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_WscForceSetAP_Proc::(bForceSetAP=%d)\\n\", pWscV2Info->bForceSetAP));\n\treturn TRUE;\n}\n#endif /* WSC_V2_SUPPORT */\n\n\n#ifdef IWSC_SUPPORT\nINT\tSet_IWscLimitedUI_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tpWscControl = &pAd->StaCfg.WscControl;\n\t\n\tif ( simple_strtol(arg, 0, 10) == 0)\n\t\tpAd->StaCfg.IWscInfo.bLimitedUI = FALSE;\n\telse\n\t\tpAd->StaCfg.IWscInfo.bLimitedUI = TRUE;    \n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_IWscLimitedUI_Proc::(bLimitedUI=%d)\\n\",  pAd->StaCfg.IWscInfo.bLimitedUI));\n\treturn TRUE;\n}\n\n#ifdef IWSC_TEST_SUPPORT\nINT\tSet_IWscDefaultSecurity_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tUINT8\t\tTmpValue;\n\t\n\tpWscControl = &pAd->StaCfg.WscControl;\n\tTmpValue = (UINT8)simple_strtol(arg, 0, 10);\n\tif ((TmpValue != 0) && (TmpValue <= 3))\n\t{\n\t\tpAd->StaCfg.IWscInfo.IWscDefaultSecurity = TmpValue;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(IWscDefaultSecurity=%d)\\n\", __FUNCTION__, pAd->StaCfg.IWscInfo.IWscDefaultSecurity));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::(Value=%d)\\n\", __FUNCTION__, TmpValue));\n\t\treturn FALSE;\n\t}\t\n}\n\nINT\tSet_IWscSmpbcEnrScanOnly_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPIWSC_INFO pIWscInfo;\n\n\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tif ( simple_strtol(arg, 0, 10) == 0)\n\t\tpIWscInfo->bIwscSmpbcScanningOnly = FALSE;\n\telse\n\t\tpIWscInfo->bIwscSmpbcScanningOnly = TRUE;\n}\n\nINT\tSet_IWscEmptySubmaskList_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPIWSC_INFO pIWscInfo;\n\n\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tif ( simple_strtol(arg, 0, 10) == 0)\n\t\tpIWscInfo->bEmptySubmaskList = FALSE;\n\telse\n\t\tpIWscInfo->bEmptySubmaskList = TRUE;\n}\n\nINT\tSet_IWscBlockConnection_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPIWSC_INFO pIWscInfo;\n\n\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tif ( simple_strtol(arg, 0, 10) == 0)\n\t\tpIWscInfo->bBlockConnection = FALSE;\n\telse\n\t\tpIWscInfo->bBlockConnection = TRUE;\n\n\tif (pIWscInfo->bBlockConnection)\n\t{\n\t\tINT i;\n\t\t\n\t\tfor (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) \n\t\t{\n\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];\n\n\t\t\tif (!IS_ENTRY_CLIENT(pEntry))\n\t\t\t\tcontinue;\n\n\t\t\tMlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);\n\t\t}\n\n        if (pAd->MacTab.Size == 0)\n        {\t\t\t                \n\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);\n\t\t\tpAd->IndicateMediaState = NdisMediaStateDisconnected;\n\t\t\tRTMP_IndicateMediaState(pAd);\n        } \n\t}\n}\n#endif /* IWSC_TEST_SUPPORT */\n\nINT\tSet_IWscOOB_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tNDIS_802_11_SSID\tSsid;\n\tUSHORT WpaPskLen = 0;\n\n\tif (pAd->StaCfg.BssType != BSS_ADHOC)\n\t{\n\t\tif (INFRA_ON(pAd))\n\t\t{\n\t\t\t/*BOOLEAN Cancelled; */\n\t\t\t/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */\n\t\t\t/* Since calling this indicate user don't want to connect to that SSID anymore. */\n\t\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\t\t\n\t\t\t\n\t\t\tLinkDown(pAd, FALSE);\n\t\t}\n#ifdef DOT11_N_SUPPORT\n\t\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\tpAd->StaCfg.BssType = BSS_ADHOC;\n\t}\n\n\tpWscControl = &pAd->StaCfg.WscControl;\n\t\n\tpWscControl->WscConfStatus = WSC_SCSTATE_UNCONFIGURED;\n\t\n\tpWscControl->WscConfMode = WSC_DISABLE;\n\tpWscControl->WscState = WSC_STATE_OFF;\n\tpWscControl->WscStatus = STATUS_WSC_IDLE;\n\tpWscControl->bWscTrigger = FALSE;\n\tNdisZeroMemory(&pWscControl->WscProfile, sizeof(WSC_PROFILE));\n\tsprintf(&Ssid.Ssid[0], \"IWSC%02X%02X%02X\", RandomByte(pAd), RandomByte(pAd), RandomByte(pAd));\n\tSsid.SsidLength = strlen(&Ssid.Ssid[0]);\n\n\tWscGenRandomKey(pAd, pWscControl, pWscControl->WpaPsk, &WpaPskLen);\n\tpWscControl->WpaPskLen = (INT)WpaPskLen;\n\tNdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);\n\tNdisMoveMemory(pAd->StaCfg.WpaPassPhrase, pWscControl->WpaPsk, pWscControl->WpaPskLen);\n\tpAd->StaCfg.WpaPassPhraseLen = pWscControl->WpaPskLen;\n\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;\n\tpAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;\n\tif ((pAd->StaCfg.WpaPassPhraseLen >= 8) &&\n\t\t(pAd->StaCfg.WpaPassPhraseLen <= 64))\n\t{\n\t\tUCHAR keyMaterial[40];\n\t\t\n\t\tRTMPZeroMemory(pAd->StaCfg.PMK, 32);\n\t\tif (pAd->StaCfg.WpaPassPhraseLen == 64)\n\t\t{\n\t\t    AtoH((PSTRING) pAd->StaCfg.WpaPassPhrase, pAd->StaCfg.PMK, 32);\n\t\t}\n\t\telse\n\t\t{\n\t\t    RtmpPasswordHash((PSTRING) pAd->StaCfg.WpaPassPhrase, Ssid.Ssid, Ssid.SsidLength, keyMaterial);\n\t\t    NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);\t\t\n\t\t}\n\t}\n\n\tpAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n\tpAd->bConfigChanged = TRUE;\n\tpAd->StaCfg.IWscInfo.bDoNotChangeBSSID = FALSE;\n\n    MlmeEnqueue(pAd, \n                MLME_CNTL_STATE_MACHINE, \n                OID_802_11_SSID,\n                sizeof(NDIS_802_11_SSID),\n                (VOID *)&Ssid, 0);\n\t\n\tRTMP_MLME_HANDLER(pAd);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_IWscOOB_Proc\\n\"));\n\treturn TRUE;\n}\n\nINT\tSet_IWscSinglePIN_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tPWSC_CTRL\tpWscControl;\n\tpWscControl = &pAd->StaCfg.WscControl;\n\t\n\tif ( simple_strtol(arg, 0, 10) == 0)\n\t\tpAd->StaCfg.IWscInfo.bSinglePIN = FALSE;\n\telse\n\t\tpAd->StaCfg.IWscInfo.bSinglePIN = TRUE;    \n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"Set_IWscSinglePIN_Proc::(bSinglePIN=%d)\\n\",  pAd->StaCfg.IWscInfo.bSinglePIN));\n\treturn TRUE;\n}\n#endif /* IWSC_SUPPORT */\n\n#endif /* WSC_STA_SUPPORT */\n\nINT Set_TGnWifiTest_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING          arg)\n{\n    if (simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.bTGnWifiTest = FALSE;\n    else\n        pAd->StaCfg.bTGnWifiTest = TRUE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IF Set_TGnWifiTest_Proc::(bTGnWifiTest=%d)\\n\", pAd->StaCfg.bTGnWifiTest));\n\treturn TRUE;\n}\n\n#ifdef EXT_BUILD_CHANNEL_LIST\nINT Set_Ieee80211dClientMode_Proc(\n    IN  PRTMP_ADAPTER   pAdapter, \n    IN  PSTRING          arg)\n{\n    if (simple_strtol(arg, 0, 10) == 0)\n        pAdapter->StaCfg.IEEE80211dClientMode = Rt802_11_D_None;\n    else if (simple_strtol(arg, 0, 10) == 1)\n        pAdapter->StaCfg.IEEE80211dClientMode = Rt802_11_D_Flexible;\n    else if (simple_strtol(arg, 0, 10) == 2)\n        pAdapter->StaCfg.IEEE80211dClientMode = Rt802_11_D_Strict;\n    else\n        return FALSE;  \n\n    DBGPRINT(RT_DEBUG_TRACE, (\"Set_Ieee802dMode_Proc::(IEEEE0211dMode=%d)\\n\", pAdapter->StaCfg.IEEE80211dClientMode));\n    return TRUE;\n}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef CARRIER_DETECTION_SUPPORT\nINT Set_StaCarrierDetect_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n    if (simple_strtol(arg, 0, 10) == 0)\n        pAd->CommonCfg.CarrierDetect.Enable = FALSE;\n    else\n        pAd->CommonCfg.CarrierDetect.Enable = TRUE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IF Set_StaCarrierDetect_Proc::(CarrierDetect.Enable=%d)\\n\", pAd->CommonCfg.CarrierDetect.Enable));\n\treturn TRUE;\n}\n#endif /* CARRIER_DETECTION_SUPPORT */\n\nINT\tShow_Adhoc_MacTable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\textra,\n\tIN\tUINT32\t\t\tsize)\n{\n\tINT i;\n\t\n\tsprintf(extra, \"\\n\");\n\n#ifdef DOT11_N_SUPPORT\n\tsprintf(extra, \"%sHT Operating Mode : %d\\n\", extra, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode);\n#endif /* DOT11_N_SUPPORT */\n\n\tsprintf(extra + strlen(extra), \"\\n%-19s%-4s%-4s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s\\n\",\n\t\t\t\"MAC\", \"AID\", \"BSS\", \"RSSI0\", \"RSSI1\", \"RSSI2\", \"PhMd\", \"BW\", \"MCS\", \"SGI\", \"STBC\");\n\t\n\tfor (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\t\n\t\tif (strlen(extra) > (size - 30))\n\t\t    break;\n\t\tif ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry)) && (pEntry->Sst == SST_ASSOC))\n\t\t{\n\t\t\tsprintf(extra + strlen(extra), \"%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);\n\t\t\tsprintf(extra + strlen(extra), \"%-4d\", (int)pEntry->Aid);\n\t\t\tsprintf(extra + strlen(extra), \"%-4d\", (int)pEntry->apidx);\n\t\t\tsprintf(extra + strlen(extra), \"%-7d\", pEntry->RssiSample.AvgRssi0);\n\t\t\tsprintf(extra + strlen(extra), \"%-7d\", pEntry->RssiSample.AvgRssi1);\n\t\t\tsprintf(extra + strlen(extra), \"%-7d\", pEntry->RssiSample.AvgRssi2);\n\t\t\tsprintf(extra + strlen(extra), \"%-10s\", get_phymode_str(pEntry->HTPhyMode.field.MODE));\n\t\t\tsprintf(extra + strlen(extra), \"%-6s\", get_bw_str(pEntry->HTPhyMode.field.BW));\n\t\t\tsprintf(extra + strlen(extra), \"%-6d\", pEntry->HTPhyMode.field.MCS);\n\t\t\tsprintf(extra + strlen(extra), \"%-6d\", pEntry->HTPhyMode.field.ShortGI);\n\t\t\tsprintf(extra + strlen(extra), \"%-6d\", pEntry->HTPhyMode.field.STBC);\n\t\t\tsprintf(extra + strlen(extra), \"%-10d, %d, %d%%\\n\", pEntry->DebugFIFOCount, pEntry->DebugTxCount, \n\t\t\t\t\t\t(pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0);\n\t\t\tsprintf(extra + strlen(extra), \"\\n\");\n\t\t}\n\t} \n\n\treturn TRUE;\n}\n\n\nINT Set_BeaconLostTime_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tULONG ltmp = (ULONG)simple_strtol(arg, 0, 10);\n\n\tif ((ltmp != 0) && (ltmp <= 60))\n\t\tpAd->StaCfg.BeaconLostTime = (ltmp * OS_HZ);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IF Set_BeaconLostTime_Proc::(BeaconLostTime=%ld)\\n\", pAd->StaCfg.BeaconLostTime));\n\treturn TRUE;\n}\n\nINT Set_AutoRoaming_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n    if (simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.bAutoRoaming = FALSE;\n    else\n        pAd->StaCfg.bAutoRoaming = TRUE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IF Set_AutoRoaming_Proc::(bAutoRoaming=%d)\\n\", pAd->StaCfg.bAutoRoaming));\n\treturn TRUE;\n}\n\n\n/* \n    ==========================================================================\n    Description:\n        Issue a site survey command to driver\n\tArguments:\n\t    pAdapter                    Pointer to our adapter\n\t    wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 set site_survey\n    ==========================================================================\n*/\n\nINT Set_ForceTxBurst_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n    if (simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.bForceTxBurst = FALSE;\n    else\n        pAd->StaCfg.bForceTxBurst = TRUE;\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IF Set_ForceTxBurst_Proc::(bForceTxBurst=%d)\\n\", pAd->StaCfg.bForceTxBurst));\n\treturn TRUE;\n}\n\n#ifdef XLINK_SUPPORT\nINT Set_XlinkMode_Proc(\n    IN  PRTMP_ADAPTER   pAd, \n    IN  PSTRING         arg)\n{\n\tUINT32 Value = 0;\n\n    if (simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.PSPXlink = 0;\n    else\n        pAd->StaCfg.PSPXlink = 1;\n\n\tif (pAd->StaCfg.PSPXlink)\n\t\tValue = PSPXLINK;\n\telse\n\t\tValue = STANORMAL;\n\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value);\n\tValue = 0;\n\tRTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);\n\tValue &= (~0x80);\n\tRTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);\n\n    DBGPRINT(RT_DEBUG_TRACE, (\"IF Set_XlinkMode_Proc::(PSPXlink=%d)\\n\", pAd->StaCfg.PSPXlink));\n\treturn TRUE;\n}\n#endif /* XLINK_SUPPORT */\n\n\nVOID RTMPAddKey(\n\tIN\tPRTMP_ADAPTER\t    pAd, \n\tIN\tPNDIS_802_11_KEY    pKey)\n{\n\tULONG\t\t\t\tKeyIdx;\n\tMAC_TABLE_ENTRY  \t*pEntry;\n\t\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddKey ------>\\n\"));\n\n\tif (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n\t{\n\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t{\n\t\t    if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n            {\n                NdisZeroMemory(pAd->StaCfg.PMK, 32);\n                NdisMoveMemory(pAd->StaCfg.PMK, pKey->KeyMaterial, pKey->KeyLength);\n                goto end;\n            }\n\t\t    /* Update PTK */\n\t\t    NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));  \n            pAd->SharedKey[BSS0][0].KeyLen = LEN_TK;\n            NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pKey->KeyMaterial, LEN_TK);\n#ifdef WPA_SUPPLICANT_SUPPORT            \n            if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)\n            {\n                NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n                NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);\n            }\n            else\n#endif /* WPA_SUPPLICANT_SUPPORT */\n            {\n            \tNdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n                NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);\n            }\n\n            /* Decide its ChiperAlg */\n        \tif (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)\n        \t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;\n        \telse if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n        \t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;\n        \telse\n        \t\tpAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE; \n\n            /* Update these related information to MAC_TABLE_ENTRY */\n        \tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n            NdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[BSS0][0].Key, LEN_TK);            \n        \tNdisMoveMemory(pEntry->PairwiseKey.RxMic, pAd->SharedKey[BSS0][0].RxMic, LEN_TKIP_MIC);\n        \tNdisMoveMemory(pEntry->PairwiseKey.TxMic, pAd->SharedKey[BSS0][0].TxMic, LEN_TKIP_MIC);\n        \tpEntry->PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg;\n\n        \t/* Update pairwise key information to ASIC Shared Key Table */\n        \tAsicAddSharedKeyEntry(pAd, \n        \t\t\t\t\t\t  BSS0, \n        \t\t\t\t\t\t  0, \n        \t\t\t\t\t\t  &pAd->SharedKey[BSS0][0]);\n\n        \t/* Update ASIC WCID attribute table and IVEIV table */\n        \tRTMPSetWcidSecurityInfo(pAd, \n        \t\t\t\t\t\t\t  BSS0, \n        \t\t\t\t\t\t\t  0, \n        \t\t\t\t\t\t\t  pAd->SharedKey[BSS0][0].CipherAlg, \n        \t\t\t\t\t\t\t  BSSID_WCID,\n        \t\t\t\t\t\t\t  SHAREDKEYTABLE);\n\n            if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2)\n            {\n                /* set 802.1x port control */\n\t\t\t\tSTA_PORT_SECURED(pAd);\n            }\n\t\t}\n        else\n        {\n            /* Update GTK */\n            pAd->StaCfg.DefaultKeyId = (pKey->KeyIndex & 0xFF);\n            NdisZeroMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId], sizeof(CIPHER_KEY));  \n            pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = LEN_TK;\n            NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, pKey->KeyMaterial, LEN_TK);\n#ifdef WPA_SUPPLICANT_SUPPORT            \n            if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled)\n            {\n                NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n                NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);        \t\n            }\n            else\n#endif /* WPA_SUPPLICANT_SUPPORT */                \n            {\n            \tNdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);            \n                NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);        \t\n            }\n\n            /* Update Shared Key CipherAlg */\n    \t\tpAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_NONE;\n    \t\tif (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled)\n    \t\t\tpAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;\n    \t\telse if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)\n    \t\t\tpAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;\n\n            /* Update group key information to ASIC Shared Key Table */\n        \tAsicAddSharedKeyEntry(pAd, \n        \t\t\t\t\t\t  BSS0, \n        \t\t\t\t\t\t  pAd->StaCfg.DefaultKeyId, \n        \t\t\t\t\t\t  &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId]);\n\n\n            /* set 802.1x port control */\n\t\t\tSTA_PORT_SECURED(pAd);\n        }\n\t}\n\telse\t/* dynamic WEP from wpa_supplicant */\n\t{\n\t\tUCHAR\tCipherAlg;\n    \tPUCHAR\tKey;\n\n\t\tif(pKey->KeyLength == 32)\n\t\t\tgoto end;\n\t\t\n\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\n\t\tif (KeyIdx < 4)\n\t\t{\n\t\t\t/* it is a default shared key, for Pairwise key setting */\n\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t{\n\t\t\t\tpEntry = MacTableLookup(pAd, pKey->BSSID);\n\n\t\t\t\tif (pEntry)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPAddKey: Set Pair-wise Key\\n\"));\n\t\t\n\t\t\t\t\t/* set key material and key length */\n \t\t\t\t\tpEntry->PairwiseKey.KeyLen = (UCHAR)pKey->KeyLength;\n\t\t\t\t\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\t\n\t\t\t\t\t/* set Cipher type */\n\t\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;\n\t\t\t\t\t\t\n\t\t\t\t\t/* Add Pair-wise key to Asic */\n\t\t\t\t\tAsicAddPairwiseKeyEntry(\n\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t(UCHAR)pEntry->Aid,\n                \t\t&pEntry->PairwiseKey);\n\n\t\t\t\t\t/* update WCID attribute table and IVEIV table for this entry */\n\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\t\t\t\t\t\tKeyIdx, \n\t\t\t\t\t\t\t\t\t\t\tpEntry->PairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\t\tpEntry->Aid, \n\t\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\t\t\t\t}\t\n\t\t\t}\n\t\t\telse\t\n            {\n\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\tpAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;\n                     \n\t\t\t\t/* set key material and key length */\n\t\t\t\tpAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\t\n\t\t\t\t/* Set Ciper type */\n\t\t\t\tif (pKey->KeyLength == 5)\n\t\t\t\t\tpAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_WEP64;\n\t\t\t\telse\n\t\t\t\t\tpAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_WEP128;\n\t\t\t\n    \t\t\tCipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg;\n    \t\t\tKey = pAd->SharedKey[BSS0][KeyIdx].Key;\n\n\t\t\t\t/* Set Group key material to Asic */\n    \t\t\tAsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, &pAd->SharedKey[BSS0][KeyIdx]);\n\t\t\n\t\t\t}\n\t\t}\n\t}\nend:\n\treturn;\n}\n\n\n\n/*\n    ==========================================================================\n    Description:\n        Site survey entry point\n\n    NOTE:\n    ==========================================================================\n*/\nVOID StaSiteSurvey(\n\tIN\tPRTMP_ADAPTER  \t\tpAd,\n\tIN\tPNDIS_802_11_SSID\tpSsid,\n\tIN\tUCHAR\t\t\t\tScanType)\n{\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\t/*\n\t\t * Still scanning, ignore this scanning.\n\t\t */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"StaSiteSurvey:: Scanning now\\n\"));\n\t\treturn;\n\t}\n\tif (INFRA_ON(pAd))\n\t{\n\t\tpAd->StaCfg.bImprovedScan = TRUE;\n\t\tpAd->StaCfg.ScanChannelCnt = 0;\t/* reset channel counter to 0 */\n\t}\n\n#ifdef WSC_STA_SUPPORT\n\tif (ScanType == SCAN_WSC_ACTIVE)\n\t\tpAd->StaCfg.bImprovedScan = FALSE;\n#endif /* WSC_STA_SUPPORT */\n\t\t\t\n\tif (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t{\n\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n\t}\n\n\tNdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);\n\n#ifdef P2P_SUPPORT\n\tpAd->P2pCfg.bPeriodicListen = FALSE;\n#endif /* P2P_SUPPORT */\n\n\tif (pSsid)\n\t\tMlmeEnqueue(pAd, \n\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\tOID_802_11_BSSID_LIST_SCAN, \n\t\t\tpSsid->SsidLength,\n\t\t\tpSsid->Ssid, \n\t\t\t0);\n\telse\n\t\tMlmeEnqueue(pAd, \n\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\tOID_802_11_BSSID_LIST_SCAN, \n\t\t\t0,\n\t\t\t\"\",\n\t\t\t0);\n\t\n\tRTMP_MLME_HANDLER(pAd);\n}\n\nINT Set_AutoReconnect_Proc(\n    IN  PRTMP_ADAPTER\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n\tif (simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.bAutoReconnect = FALSE;\n\telse\n\t\tpAd->StaCfg.bAutoReconnect = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_AutoReconnect_Proc::(bAutoReconnect=%d)\\n\", pAd->StaCfg.bAutoReconnect));\n\treturn TRUE;\n}\n\nINT Set_AdhocN_Proc(\n    IN  PRTMP_ADAPTER\tpAd, \n    IN  PSTRING\t\t\targ)\n{\n#ifdef DOT11_N_SUPPORT\n\tif (simple_strtol(arg, 0, 10) == 0)\n        pAd->StaCfg.bAdhocN = FALSE;\n\telse\n\t\tpAd->StaCfg.bAdhocN = TRUE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_AdhocN_Proc::(bAdhocN=%d)\\n\", pAd->StaCfg.bAdhocN));\n#endif /* DOT11_N_SUPPORT */\n\treturn TRUE;\n}\n\n#ifdef CONFIG_MULTI_CHANNEL\nINT Set_StaStayTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->Mlme.EDCAToHCCATimerValue = (UINT32)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_StaStayTime_Proc::(EDCAToHCCATimerValue=%d)\\n\", pAd->Mlme.EDCAToHCCATimerValue));\n\treturn TRUE;\n}\n\nINT Set_P2pStayTime_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tpAd->Mlme.HCCAToEDCATimerValue = (UINT32)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_StaStayTime_Proc::(HCCAToEDCATimerValue=%d)\\n\", pAd->Mlme.HCCAToEDCATimerValue));\n\treturn TRUE;\n}\n\nINT Set_LinkDown_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\t\tMLME_DISASSOC_REQ_STRUCT DisassocReq;\n\t\tif (INFRA_ON(pAd)) {\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"CntlOidSsidProc():CNTL - disassociate with current AP...\\n\"));\n\t\t\t\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,\n\t\t\t\t\t\t REASON_DISASSOC_STA_LEAVING);\n\t\t\t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,\n\t\t\t\t\t    sizeof (MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\t}\n}\n\n\nINT Set_Multi_Channel_Enable_Proc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\n\tpAd->Multi_Channel_Enable = (UINT32)simple_strtol(arg, 0, 10);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF Set_Multi_Channel_Enable_Proc::(Multi_Channel_Enable=%d)\\n\", pAd->Multi_Channel_Enable));\n\treturn TRUE;\n}\n\n\n\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\n\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n/* set WOW enable */\nINT Set_WOW_Enable(\n        IN PRTMP_ADAPTER        pAd,\n        IN PSTRING              arg)\n{\n\tUINT32 Val;\n\tUINT8 Pin = pAd->WOW_Cfg.nSelectedGPIO;\t\n\tULONG Value = simple_strtol(arg, 0, 10);\t\n\t\t\n\tif (Value != 1)\n\t\tValue = 0;  /* default is disable */\n\n\tpAd->WOW_Cfg.bEnable = (BOOLEAN)Value;\n\n\t/* pull GPIO high */\n\tRTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Val);\n\tif (Pin <= 7)\n\t{\n\t\tVal &= ~(1UL << (Pin+8));\t/* direction: 0 out, 1 in */\n\t\tVal |= 1UL << Pin;\t\t\t/* data */\n\t}\n\telse\n\t{\n\t\tVal &= ~(1UL << (Pin+16)); \t/* direction: 0 out, 1 in */\n\t\tVal |= 1UL << (Pin+8);\t\t/* data */\n\t}\n\tRTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Val);\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"WOW_Enable = %d, GPIO = %x\\n\", pAd->WOW_Cfg.bEnable, Val));\n\n\treturn TRUE;\n}\n\n/* set GPIO pin for wake-up signal */\nINT Set_WOW_GPIO(\n        IN PRTMP_ADAPTER        pAd,\n        IN PSTRING              arg)\n{\n\tULONG Value = simple_strtol(arg, 0, 10);\t\n\t\t\n\tif (Value > 13)\n\t\tValue = 1;  /* default GPIO pin */\n\n\tpAd->WOW_Cfg.nSelectedGPIO = (UINT8)Value;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"WOW_GPIO = %d\\n\", pAd->WOW_Cfg.nSelectedGPIO));\n\n\treturn TRUE;\n}\n\n/* set delay time for WOW really enable */\nINT Set_WOW_Delay(\n        IN PRTMP_ADAPTER        pAd,\n        IN PSTRING              arg)\n{\n\tULONG Value = simple_strtol(arg, 0, 10);\t\n\t\t\n\tif (Value > 255)\n\t\tValue = 3; /* default delay time */\n\n\tpAd->WOW_Cfg.nDelay = (UINT8)Value;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"WOW_Delay = %d, equal to %d sec\\n\", pAd->WOW_Cfg.nDelay, (pAd->WOW_Cfg.nDelay+1)*3));\n\n\treturn TRUE;\n}\n\n/* set wake up hold time */\nINT Set_WOW_Hold(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ)\n{\n\tULONG Value = simple_strtol(arg, 0, 10);\n\n\tif (Value > 255)\n\t\tValue = 1; /* pule hold time - unit: 10ms */\n\n\tpAd->WOW_Cfg.nHoldTime = (UINT8)Value;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"WOW_Hold = %d, equal to %d ms\\n\", pAd->WOW_Cfg.nHoldTime, (pAd->WOW_Cfg.nHoldTime)*10));\n\n\treturn TRUE;\n}\n\n/* set wake up signal type */\nINT Set_WOW_InBand(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ)\n{\n\tULONG Value = simple_strtol(arg, 0, 10);\n\n\tif (Value != 1)\n\t\tValue = 0; /* use GPIO to wakeup system */\n\n\tpAd->WOW_Cfg.bInBand = (UINT8)Value;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"WOW_Inband = %d\\n\", pAd->WOW_Cfg.bInBand));\n\n\treturn TRUE;\n}\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n#ifdef RTMP_MAC_USB\n/* Sets the FW into WOW Suspend mode */\nINT Set_UsbWOWSuspend(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ)\n{\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n    UCHAR Flag;\n\n    RTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(pAd, &Flag);\n    if (Flag == TRUE)\n    {   \n        DBGPRINT(RT_DEBUG_ERROR, (\"Entering WOW Suspend mode...\\n\"));\n        RTMP_DRIVER_ADAPTER_RT28XX_WOW_ENABLE(pAd);\n        return TRUE;\n    }\n    else\n        DBGPRINT(RT_DEBUG_ERROR, (\"Failed to enter WOW Suspend mode!\\n\"));\n#else\n    DBGPRINT(RT_DEBUG_ERROR, (\"Driver does not support WOW!\\n\"));\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n    return FALSE;\n}\n\n/* Resume the FW to Normal mode */\nINT Set_UsbWOWResume(\n\t\tIN PRTMP_ADAPTER\t\tpAd,\n\t\tIN PSTRING\t\t\t\targ)\n{\n#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)\n    UCHAR Flag;\n\n    RTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(pAd, &Flag);\n    if (Flag == TRUE)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"Resuming to Normal mode...\\n\"));\n        RTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE(pAd);\n    }\n    return TRUE;\n#else\n    DBGPRINT(RT_DEBUG_ERROR, (\"Driver does not support WOW!\\n\"));\n    return FALSE;\n#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */\n\n}\n\n#endif /* RTMP_MAC_USB */\n\nINT RTMPSetInformation(\n    IN RTMP_ADAPTER *pAd,\n    INOUT RTMP_IOCTL_INPUT_STRUCT *rq,\n    IN  INT cmd)\n{\n    RTMP_IOCTL_INPUT_STRUCT *wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;\n    NDIS_802_11_SSID Ssid;\n    NDIS_802_11_MAC_ADDRESS Bssid;\n    RT_802_11_PHY_MODE PhyMode;\n    RT_802_11_STA_CONFIG StaConfig;\n    NDIS_802_11_RATES aryRates;\n    RT_802_11_PREAMBLE Preamble;\n    NDIS_802_11_WEP_STATUS WepStatus;\n    NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax;\n    NDIS_802_11_NETWORK_INFRASTRUCTURE  BssType;\n    NDIS_802_11_RTS_THRESHOLD RtsThresh = 0;\n    NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;\n    NDIS_802_11_POWER_MODE PowerMode;\n    PNDIS_802_11_KEY pKey = NULL;\n    PNDIS_802_11_WEP pWepKey =NULL;\n    PNDIS_802_11_REMOVE_KEY pRemoveKey = NULL;\n\tNDIS_802_11_CONFIGURATION *pConfig = NULL;\n    NDIS_802_11_NETWORK_TYPE NetType;\n    ULONG Now;\n    UINT KeyIdx = 0;\n    INT Status = NDIS_STATUS_SUCCESS, MaxPhyMode = PHY_11G;\n    ULONG PowerTemp;\n    BOOLEAN RadioState;\n    BOOLEAN StateMachineTouched = FALSE;\n     PNDIS_802_11_PASSPHRASE ppassphrase = NULL;     \n#ifdef DOT11_N_SUPPORT\n\tOID_SET_HT_PHYMODE HT_PhyMode;\t/*11n */\n#endif /* DOT11_N_SUPPORT */\n#ifdef WPA_SUPPLICANT_SUPPORT    \n    PNDIS_802_11_PMKID pPmkId = NULL;\n    BOOLEAN IEEE8021xState = FALSE;\n    BOOLEAN IEEE8021x_required_keys = FALSE;\n    UCHAR wpa_supplicant_enable = 0;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef SNMP_SUPPORT\t\n\tTX_RTY_CFG_STRUC tx_rty_cfg;\n\tULONG ShortRetryLimit, LongRetryLimit;\n\tUCHAR ctmp;\n#endif /* SNMP_SUPPORT */\n\n\n#ifdef WAPI_SUPPORT\n\tPOS_COOKIE\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* WAPI_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n\tUINT\tWPSLedMode10 = 0;\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n\n#ifdef DOT11_N_SUPPORT\n\tMaxPhyMode = PHY_11N_5G;\n#endif /* DOT11_N_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-->RTMPSetInformation(),\t0x%08x\\n\", cmd&0x7FFF));\n\tswitch(cmd & 0x7FFF) {\n\t\tcase RT_OID_802_11_COUNTRY_REGION:\n\t\t\tif (wrq->u.data.length < sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\t/* Only avaliable when EEPROM not programming */\n            else if (!(pAd->CommonCfg.CountryRegion & 0x80) && !(pAd->CommonCfg.CountryRegionForABand & 0x80))\n\t\t\t{\n\t\t\t\tULONG   Country;\n\n\t\t\t\tStatus = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tpAd->CommonCfg.CountryRegion = (UCHAR)(Country & 0x000000FF);\n\t\t\t\tpAd->CommonCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF);\n\t\t\t\t/* Build all corresponding channel information */\n\t\t\t\tRTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_COUNTRY_REGION (A:%d  B/G:%d)\\n\", pAd->CommonCfg.CountryRegionForABand,\n\t\t\t\t    pAd->CommonCfg.CountryRegion));\n            }\n            break;\n        case OID_802_11_BSSID_LIST_SCAN:\n\t\t\tRTMP_GetCurrentSystemTick(&Now);\n/*            Now = jiffies; */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \\n\", pAd->RalinkCounters.LastOneSecTotalTxCount));\n\n            if (MONITOR_ON(pAd))\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"!!! Driver is in Monitor Mode now !!!\\n\"));\n                break;\n            }\n\n\t\t\t/*Benson add 20080527, when radio off, sta don't need to scan */\n\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tif (pAd->RalinkCounters.LastOneSecTotalTxCount > 100)\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\\n\"));\n\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\t\tbreak;\n            }\n            \n            if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&\n\t\t\t\t((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || \n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) &&\n                (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\\n\"));\n\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\t\tbreak;\n            }\n\n#ifdef WSC_STA_SUPPORT\n\t\t\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t\t(pAd->StaCfg.WscControl.WscState >= WSC_STATE_LINK_UP))\n\t\t\t{\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! WPS processing now! ignore this set::OID_802_11_BSSID_LIST_SCAN\\n\"));\n\t\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\t\tbreak;\t\t\t\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n\t\t\tStaSiteSurvey(pAd, NULL, SCAN_ACTIVE);\n            break;\n        case OID_802_11_SSID:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))\n                Status = -EINVAL;\n            else\n            {\n            \tPSTRING pSsidString = NULL;\n                Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SSID (Len=%d,Ssid=%s)\\n\", Ssid.SsidLength, Ssid.Ssid));\n                if (Ssid.SsidLength > MAX_LEN_OF_SSID)\n                    Status = -EINVAL;\n                else\n                {\n                \tif (Ssid.SsidLength == 0)\n\t\t    \t\t{\n                \t\tSet_SSID_Proc(pAd, \"\");\n\t\t    \t\t}\n\t\t\t\t\telse\n                    {\n/*\t                \tpSsidString = (PSTRING)kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG); */\n\t\t\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\t\t\t\tif (pSsidString)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tNdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\t\t\t\t\tNdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength);\n\t\t\t\t\t\t\tpSsidString[MAX_LEN_OF_SSID] = 0x00;\n\t\t\t\t\t\t\tSet_SSID_Proc(pAd, pSsidString);\n\t\t\t\t\t\t\tos_free_mem(NULL, pSsidString);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tStatus = -ENOMEM;\n                    }\n                }\n            }\n            break;\n\t\tcase OID_802_11_SET_PASSPHRASE:\n/*    \t    ppassphrase= kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&ppassphrase, wrq->u.data.length);\n\n    \t    if(ppassphrase== NULL)\n            {\n               \tStatus = -ENOMEM;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SET_PASSPHRASE, Failed!!\\n\"));\n               \tbreak;\n            }\n\t\t\telse\n           \t{\n               \tStatus = copy_from_user(ppassphrase, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status)\n            \t{\n                \tStatus  = -EINVAL;\n                \tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SET_PASSPHRASE, Failed (length mismatch)!!\\n\"));\n           \t\t}\n           \t\telse\n           \t\t{\n\t\t\t\t\tif(ppassphrase->KeyLength < 8 || ppassphrase->KeyLength > 64)\n\t\t\t\t\t{\n\t\t\t\t\t\tStatus  = -EINVAL;\n                    \tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SET_PASSPHRASE, Failed (len less than 8 or greater than 64)!!\\n\"));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t                    \t\t\t/* set key passphrase and length */\n\t \t\t\t\t\tNdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);\n\t    \t\t\t\tNdisMoveMemory(pAd->StaCfg.WpaPassPhrase, &ppassphrase->KeyMaterial, ppassphrase->KeyLength);\n\t   \t\t\t\t\tpAd->StaCfg.WpaPassPhraseLen = ppassphrase->KeyLength;\n\t\t\t\t\t\thex_dump(\"pAd->StaCfg.WpaPassPhrase\", pAd->StaCfg.WpaPassPhrase, 64);\n\t\t\t\t\t\tprintk(\"WpaPassPhrase=%s\\n\",pAd->StaCfg.WpaPassPhrase);\n\t\t\t\t\t}\n                }\n            }\n         \tos_free_mem(NULL, ppassphrase);\n\t   \t\tbreak;\n\t\t\n        case OID_802_11_BSSID:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length);\n\n                /* tell CNTL state machine to call NdisMSetInformationComplete() after completing */\n                /* this request, because this request is initiated by NDIS. */\n                pAd->MlmeAux.CurrReqIsFromNdis = FALSE; \n\n\t\t\t\t/* Prevent to connect AP again in STAMlmePeriodicExec */\n\t\t\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\n                if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n                {\n                    RTMP_MLME_RESET_STATE_MACHINE(pAd);\n                    DBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n                }\n                MlmeEnqueue(pAd, \n                            MLME_CNTL_STATE_MACHINE, \n                            OID_802_11_BSSID, \n                            sizeof(NDIS_802_11_MAC_ADDRESS),\n                            (VOID *)&Bssid, 0);\n                Status = NDIS_STATUS_SUCCESS;\n                StateMachineTouched = TRUE;\n\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n                                        PRINT_MAC(Bssid)));\n            }\n            break;\n        case RT_OID_802_11_RADIO:\n            if (wrq->u.data.length != sizeof(BOOLEAN))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length);\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_RADIO (=%d)\\n\", RadioState));\n                if (pAd->StaCfg.bSwRadio != RadioState)\n                {\n                    pAd->StaCfg.bSwRadio = RadioState;\n                    if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))\n                    {\n                        pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);\n                        if (pAd->StaCfg.bRadio == TRUE)\n                        {\n                            MlmeRadioOn(pAd);\n                            /* Update extra information */\n\t\t\t\t\t\t\tpAd->ExtraInfo = EXTRA_INFO_CLEAR;\n                        }\n                        else\n                        {\n                        \tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t\t\t            {\n\t\t\t\t                if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t\t\t\t\t\t        {\n\t\t\t\t\t\t            RTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\t\t\t\t\t            DBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n\t\t\t\t\t\t        }\n\t\t\t\t            }\n\t\t\t\t\t\t\t\n                            MlmeRadioOff(pAd);\n                            /* Update extra information */\n\t\t\t\t\t\t\tpAd->ExtraInfo = SW_RADIO_OFF;\n                        }\n                    }\n                }\n            }\n            break;\n        case RT_OID_802_11_PHY_MODE:\n\t\tif (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE))\n\t\t\tStatus  = -EINVAL;\n\t\telse\n\t\t{\n\t\t\t// TODO: shiang-6590, fix this for PhyMode!!\n\t\t\tStatus = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\tif (PhyMode <= MaxPhyMode)\n\t\t\t{\n\t\t\t\tpAd->CommonCfg.cfg_wmode = PhyMode;\n\t\t\t\tRTMPSetPhyMode(pAd, PhyMode);\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_PHY_MODE (=%d)\\n\", PhyMode));\n\t\t}\n\t\tbreak;\n        case RT_OID_802_11_STA_CONFIG:\n            if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG))\n                Status  = -EINVAL;\n            else\n            {\n            \tUINT32\tValue;\n\t\t\t\t\n                Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length);\n                pAd->CommonCfg.bEnableTxBurst = StaConfig.EnableTxBurst;\n                pAd->CommonCfg.UseBGProtection = StaConfig.UseBGProtection;\n                pAd->CommonCfg.bUseShortSlotTime = 1; /* 2003-10-30 always SHORT SLOT capable */\n                if ((pAd->CommonCfg.PhyMode != StaConfig.AdhocMode) &&\n\t\t\t\t\t(StaConfig.AdhocMode <= MaxPhyMode))\n                {\n                    /* allow dynamic change of \"USE OFDM rate or not\" in ADHOC mode */\n                    /* if setting changed, need to reset current TX rate as well as BEACON frame format */\n                    if (pAd->StaCfg.BssType == BSS_ADHOC)\n                    {\n\t\t\t\tRTMPSetPhyMode(pAd, StaConfig.AdhocMode);\n\t\t\t\tMlmeUpdateTxRates(pAd, FALSE, 0);\n\t\t\t\tMakeIbssBeacon(pAd);           /* re-build BEACON frame */\n\t\t\t\tAsicEnableIbssSync(pAd);   /* copy to on-chip memory */\n                    }\n                }\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d\\n\",\n                                        pAd->CommonCfg.bEnableTxBurst,\n                                        pAd->CommonCfg.UseBGProtection,\n                                        pAd->CommonCfg.bUseShortSlotTime));\n\n#ifdef XLINK_SUPPORT\n\t\t\t\tif (pAd->StaCfg.PSPXlink)\n\t\t\t\t\tValue = PSPXLINK;\n\t\t\t\telse\n#endif /* XLINK_SUPPORT */\n\t\t\t\t\tValue = STANORMAL;\n\t\t\t\tRTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value);\n            }\n            break;\n        case OID_802_11_DESIRED_RATES:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_RATES))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length);\n                NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);\n                NdisMoveMemory(pAd->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\\n\",\n                    pAd->CommonCfg.DesireRate[0],pAd->CommonCfg.DesireRate[1],\n                    pAd->CommonCfg.DesireRate[2],pAd->CommonCfg.DesireRate[3],\n                    pAd->CommonCfg.DesireRate[4],pAd->CommonCfg.DesireRate[5],\n                    pAd->CommonCfg.DesireRate[6],pAd->CommonCfg.DesireRate[7] ));\n                /* Changing DesiredRate may affect the MAX TX rate we used to TX frames out */\n                MlmeUpdateTxRates(pAd, FALSE, 0);\n            }\n            break;\n        case RT_OID_802_11_PREAMBLE:\n            if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length);\n                if (Preamble == Rt802_11PreambleShort)\n                {\n                    pAd->CommonCfg.TxPreamble = Preamble;\n                    MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);\n                }\n                else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))\n                {\n                    /* if user wants AUTO, initialize to LONG here, then change according to AP's */\n                    /* capability upon association. */\n                    pAd->CommonCfg.TxPreamble = Preamble;\n                    MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);\n                }\n                else\n                {\n                    Status = -EINVAL;\n                    break;\n                }\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_PREAMBLE (=%d)\\n\", Preamble));\n            }\n            break;\n        case OID_802_11_WEP_STATUS:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);\n                /* Since TKIP, AES, WEP are all supported. It should not have any invalid setting */\n                if (WepStatus <= Ndis802_11Encryption3KeyAbsent)\n                {\n                    if (pAd->StaCfg.WepStatus != WepStatus)\n                    {\n                        /* Config has changed */\n                        pAd->bConfigChanged = TRUE;\n                    }\n                    pAd->StaCfg.WepStatus     = WepStatus;\n                    pAd->StaCfg.PairCipher    = WepStatus;\n                \tpAd->StaCfg.GroupCipher   = WepStatus;\n\n\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\tRTMPSetPhyMode(pAd, pAd->CommonCfg.cfg_wmode);\n                }\n                else\n                {\n                    Status  = -EINVAL;\n                    break;\n                }\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEP_STATUS (=%d)\\n\",WepStatus));\n            }\n            break;\n        case OID_802_11_AUTHENTICATION_MODE:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE)) \n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);\n                if (AuthMode > Ndis802_11AuthModeMax)\n                {\n                    Status  = -EINVAL;\n                    break;\n                }\n                else\n                {\n                    if (pAd->StaCfg.AuthMode != AuthMode)\n                    {\n                        /* Config has changed */\n                        pAd->bConfigChanged = TRUE;\n                    }\n                    pAd->StaCfg.AuthMode = AuthMode;\n                }\n                pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_AUTHENTICATION_MODE (=%d) \\n\",pAd->StaCfg.AuthMode));\n            }\n            break;\n        case OID_802_11_INFRASTRUCTURE_MODE:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&BssType, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\t\t\t\n\t\t\t\tif (BssType == Ndis802_11IBSS)\n\t\t\t\t\tSet_NetworkType_Proc(pAd, \"Adhoc\");\n\t\t\t\telse if (BssType == Ndis802_11Infrastructure)\n\t\t\t\t\tSet_NetworkType_Proc(pAd, \"Infra\");\n                else if (BssType == Ndis802_11Monitor)\n\t\t\t\t\tSet_NetworkType_Proc(pAd, \"Monitor\");\n                else\n                {\n                    Status  = -EINVAL;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_INFRASTRUCTURE_MODE (unknown)\\n\"));\n                }\n            }\n            break;\n\t case OID_802_11_REMOVE_WEP:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_WEP\\n\"));\n            if (wrq->u.data.length != sizeof(NDIS_802_11_KEY_INDEX))\n            {\n\t\t\t\tStatus = -EINVAL;\n            }\n            else \n            {\n\t\tKeyIdx = *(NDIS_802_11_KEY_INDEX *) wrq->u.data.pointer;\n\n\t\tif (KeyIdx & 0x80000000)\n\t\t{\n\t\t\t/* Should never set default bit when remove key */\n\t\t\tStatus = -EINVAL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tKeyIdx = KeyIdx & 0x0fffffff;\n\t\t\tif (KeyIdx >= 4){\n\t\t\t\tStatus = -EINVAL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\t\tpAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;\n\t\t\t\t\t\tpAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;\n\t\t\t\t\t\tAsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx);\n\t\t\t}\n\t\t}\n            }\n            break;\n        case RT_OID_802_11_RESET_COUNTERS:\n            NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));\n            NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));\n            NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));\n            pAd->Counters8023.RxNoBuffer   = 0;\n\t\t\tpAd->Counters8023.GoodReceives = 0;\n\t\t\tpAd->Counters8023.RxNoBuffer   = 0;\n#ifdef RTMP_MAC_USB\n\t\t\tpAd->BulkOutComplete\t= 0;\n\t\t\tpAd->BulkOutCompleteOther= 0;\n\t\t\tpAd->BulkOutCompleteCancel = 0;\n\t\t\tpAd->BulkOutReq = 0;\n\t\t\tpAd->BulkInReq= 0;\n\t\t\tpAd->BulkInComplete = 0;\n\t\t\tpAd->BulkInCompleteFail = 0;\n#endif /* RTMP_MAC_USB */\n#ifdef TXBF_SUPPORT\n\t\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t\t{\n\t\t\t\tint i;\n\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t\tNdisZeroMemory(&pAd->MacTab.Content[i].TxBFCounters, sizeof(pAd->MacTab.Content[i].TxBFCounters));\t\t\n\t\t\t}\n#endif /* TXBF_SUPPORT */\n\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_RESET_COUNTERS \\n\"));\n            break;\n        case OID_802_11_RTS_THRESHOLD:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_RTS_THRESHOLD))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&RtsThresh, wrq->u.data.pointer, wrq->u.data.length);\n                if (RtsThresh > MAX_RTS_THRESHOLD)\n\t\t\t\t{\n                    Status = -EINVAL;\n\t\t\t\t\tRtsThresh = 0; /* avoid compile warning in printk() */\n                }\n\t\t\t\telse\n                    pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_RTS_THRESHOLD (=%ld)\\n\",RtsThresh));\n            break;\n        case OID_802_11_FRAGMENTATION_THRESHOLD:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_FRAGMENTATION_THRESHOLD))\n\t\t\t{\n                Status  = -EINVAL;\n\t\t\t\tFragThresh = 0; /* avoid compile warning in printk() */\n            }\n\t\t\telse\n            {\n                Status = copy_from_user(&FragThresh, wrq->u.data.pointer, wrq->u.data.length);\n                pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;\n                if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)\n                {\n                    if (FragThresh == 0)\n                    {\n                        pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;\n                        pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;\n                    }\n                    else\n                        Status  = -EINVAL;\n                }\n                else\n                    pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_FRAGMENTATION_THRESHOLD (=%ld) \\n\",FragThresh));\n            break;\n        case OID_802_11_POWER_MODE:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_POWER_MODE))\n\t\t\t{\n                Status = -EINVAL;\n\t\t\t\tPowerMode = 0; /* avoid compile warning in printk() */\n            }\n\t\t\telse\n            {\n                Status = copy_from_user(&PowerMode, wrq->u.data.pointer, wrq->u.data.length);\n                if (PowerMode == Ndis802_11PowerModeCAM) \n                \tSet_PSMode_Proc(pAd, \"CAM\");\n                else if (PowerMode == Ndis802_11PowerModeMAX_PSP) \n                \tSet_PSMode_Proc(pAd, \"Max_PSP\");\n                else if (PowerMode == Ndis802_11PowerModeFast_PSP) \n\t\t\t\t\tSet_PSMode_Proc(pAd, \"Fast_PSP\");\n                else if (PowerMode == Ndis802_11PowerModeLegacy_PSP) \n\t\t\t\t\tSet_PSMode_Proc(pAd, \"Legacy_PSP\");\n                else\n                    Status = -EINVAL;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_POWER_MODE (=%d)\\n\",PowerMode));\n            break;\n         case RT_OID_802_11_TX_POWER_LEVEL_1:\n\t\t\tif (wrq->u.data.length  < sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&PowerTemp, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (PowerTemp > 100)\n\t\t\t\t\tPowerTemp = 0xffffffff;  /* AUTO */\n\t\t\t\tpAd->CommonCfg.TxPowerDefault = PowerTemp; /*keep current setting. */\n\t\t\t\tpAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;\t\t\t\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\\n\", pAd->CommonCfg.TxPowerPercentage));\n\t\t\t}\t\n\t        break;\n\t\tcase OID_802_11_NETWORK_TYPE_IN_USE: \n\t\t\tif (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_TYPE))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&NetType, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (NetType == Ndis802_11DS)\n\t\t\t\t\tRTMPSetPhyMode(pAd, WMODE_B);\n\t\t\t\telse if (NetType == Ndis802_11OFDM24)\n\t\t\t\t\tRTMPSetPhyMode(pAd, WMODE_B | WMODE_G);\n\t\t\t\telse if (NetType == Ndis802_11OFDM5)\n\t\t\t\t\tRTMPSetPhyMode(pAd, WMODE_A);\n\t\t\t\telse \n\t\t\t\t\tStatus = -EINVAL;\n\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\\n\",NetType));\n\t\t    }\t    \n\t\t\tbreak;\n        /* For WPA PSK PMK key */\n        case RT_OID_802_11_ADD_WPA:\n/*            pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length);\n            if(pKey == NULL)\n            {\n                Status = -ENOMEM;\n                break;\n            }\n            \n            Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);\n            if ((pKey->Length != wrq->u.data.length) ||\n\t\t\t\t(pKey->KeyLength > LEN_PMK))\n            {\n                Status  = -EINVAL;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_ADD_WPA, Failed!!\\n\"));\n            }\n            else\n            {\n                if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&\n\t\t\t\t    (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&\n\t\t\t\t    (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) )\n                {\n                    Status = -EOPNOTSUPP;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_ADD_WPA, Failed!! [AuthMode != WPAPSK/WPA2PSK/WPANONE]\\n\"));\n                }\n                else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t\t\t (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||\n\t\t\t\t\t\t (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) )     /* Only for WPA PSK mode */\n\t\t\t\t{\t\t\n                    NdisMoveMemory(pAd->StaCfg.PMK, &pKey->KeyMaterial, pKey->KeyLength);\n                    /* Use RaConfig as PSK agent. */\n                    /* Start STA supplicant state machine */\n                    if (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)\n                        pAd->StaCfg.WpaState = SS_START;\n\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\\n\", pKey->KeyIndex, pKey->KeyLength));\n                }\n                else\n                {   \n                    pAd->StaCfg.WpaState = SS_NOTUSE;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\\n\", pKey->KeyIndex, pKey->KeyLength));\n                }\n            }\n\t\t\tos_free_mem(NULL, pKey);\n/*            kfree(pKey); */\n            break;\n        case OID_802_11_REMOVE_KEY:\n/*            pRemoveKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pRemoveKey, wrq->u.data.length);\n            if(pRemoveKey == NULL)\n            {\n                Status = -ENOMEM;\n                break;\n            }\n            \n            Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length);\n            if (pRemoveKey->Length != wrq->u.data.length)\n            {\n                Status  = -EINVAL;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Failed!!\\n\"));\n            }\n            else\n            {\n                if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)\n                {\n                    RTMPWPARemoveKeyProc(pAd, pRemoveKey);\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\\n\"));\n                }\n                else\n                {\n                    KeyIdx = pRemoveKey->KeyIndex;\n\n                    if (KeyIdx & 0x80000000)\n                    {\n                        /* Should never set default bit when remove key */\n                        Status  = -EINVAL;\n                        DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\\n\"));\n                    }\n                    else\n                    {\n                        KeyIdx = KeyIdx & 0x0fffffff;\n                        if (KeyIdx > 3)\n                        {\n                            Status  = -EINVAL;\n                            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\\n\", KeyIdx));\n                        }\n                        else\n                        {\n                            pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;\n                            pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;\n                            AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx); \n                            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\\n\", pRemoveKey->KeyIndex, pRemoveKey->Length));\n                        }\n                    }\n                }\n            }\n\t\t\tos_free_mem(NULL, pRemoveKey);\n/*            kfree(pRemoveKey); */\n            break;        \n        /* New for WPA */\n        case OID_802_11_ADD_KEY:\n/*            pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length);\n            if(pKey == NULL)\n            {\n                Status = -ENOMEM;\n                break;\n            }\n            Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);\n            if ((pKey->Length != wrq->u.data.length) ||\n\t\t\t\t(pKey->KeyLength > LEN_PMK))\n            {\n                Status  = -EINVAL;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_KEY, Failed!!\\n\"));\n            }\n            else\n            {\n                RTMPAddKey(pAd, pKey);\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\\n\", pKey->KeyIndex, pKey->KeyLength));\n            }\n\t\t\tos_free_mem(NULL, pKey);\n/*            kfree(pKey); */\n            break;\n        case OID_802_11_CONFIGURATION:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_CONFIGURATION))\n                Status  = -EINVAL;\n            else\n            {\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pConfig, sizeof(NDIS_802_11_CONFIGURATION));\n\t\t\t\tif (pConfig != NULL)\n\t\t\t\t{\n\t\t\t\t\tStatus = copy_from_user(pConfig, wrq->u.data.pointer, wrq->u.data.length);\n/*                pConfig = &Config; */\n\n\t                if ((pConfig->BeaconPeriod >= 20) && (pConfig->BeaconPeriod <=400))\n\t                     pAd->CommonCfg.BeaconPeriod = (USHORT) pConfig->BeaconPeriod;\n\t                \n\t                pAd->StaActive.AtimWin = (USHORT) pConfig->ATIMWindow;\n\t                MAP_KHZ_TO_CHANNEL_ID(pConfig->DSConfig, pAd->CommonCfg.Channel);\n\t                /* */\n\t\t\t\t\t/* Save the channel on MlmeAux for CntlOidRTBssidProc used. */\n\t\t\t\t\t/* */\n\t\t\t\t\tpAd->MlmeAux.Channel = pAd->CommonCfg.Channel;\n\t\t\t\t\t\n\t                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_CONFIGURATION (BeacnPeriod=%ld,AtimW=%ld,Ch=%d)\\n\",\n\t                    pConfig->BeaconPeriod, pConfig->ATIMWindow, pAd->CommonCfg.Channel));\n\t                /* Config has changed */\n\t                pAd->bConfigChanged = TRUE;\n\t\t\t\t\tos_free_mem(NULL, pConfig);\n\t\t\t\t}\n            }\n            break;\n#ifdef DOT11_N_SUPPORT\n\t\tcase RT_OID_802_11_SET_HT_PHYMODE:\n\t\t\tif (wrq->u.data.length\t!= sizeof(OID_SET_HT_PHYMODE))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t    POID_SET_HT_PHYMODE\tpHTPhyMode = &HT_PhyMode;\n                \n\t\t\t\tStatus = copy_from_user(&HT_PhyMode, wrq->u.data.pointer, wrq->u.data.length);\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::pHTPhyMode\t(PhyMode = %d,TransmitNo = %d, HtMode =\t%d,\tExtOffset =\t%d , MCS = %d, BW =\t%d,\tSTBC = %d, SHORTGI = %d) \\n\", \n\t\t\t\tpHTPhyMode->PhyMode, pHTPhyMode->TransmitNo,pHTPhyMode->HtMode,pHTPhyMode->ExtOffset,\n\t\t\t\tpHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI));\n\t\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\t\t\tRTMPSetHT(pAd,\tpHTPhyMode);\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_SET_HT_PHYMODE(MCS=%d,BW=%d,SGI=%d,STBC=%d)\\n\", \n\t\t\t\tpAd->StaCfg.HTPhyMode.field.MCS, pAd->StaCfg.HTPhyMode.field.BW, pAd->StaCfg.HTPhyMode.field.ShortGI,\n\t\t\t\tpAd->StaCfg.HTPhyMode.field.STBC));\n\t\t\tbreak;\n#endif /* DOT11_N_SUPPORT */\n\t\tcase RT_OID_802_11_SET_APSD_SETTING:\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tULONG apsd ;\n\t\t\t\tStatus = copy_from_user(&apsd, wrq->u.data.pointer,\twrq->u.data.length);\n\n\t\t\t\t/*-------------------------------------------------------------------\n\t\t\t\t|B31~B7\t|\tB6~B5\t |\t B4\t |\t B3\t |\tB2\t |\tB1\t |\t   B0\t\t|\n\t\t\t\t---------------------------------------------------------------------\n\t\t\t\t| Rsvd\t| Max SP Len | AC_VO | AC_VI | AC_BK | AC_BE | APSD\tCapable\t|\n\t\t\t\t---------------------------------------------------------------------*/\n\t\t\t\tpAd->StaCfg.UapsdInfo.bAPSDCapable = (apsd & 0x00000001) ? TRUE :\tFALSE;\n\t\t\t\tpAd->CommonCfg.bAPSDAC_BE = ((apsd\t& 0x00000002) >> 1)\t? TRUE : FALSE;\n\t\t\t\tpAd->CommonCfg.bAPSDAC_BK = ((apsd\t& 0x00000004) >> 2)\t? TRUE : FALSE;\n\t\t\t\tpAd->CommonCfg.bAPSDAC_VI = ((apsd\t& 0x00000008) >> 3)\t? TRUE : FALSE;\n\t\t\t\tpAd->CommonCfg.bAPSDAC_VO = ((apsd\t& 0x00000010) >> 4)\t? TRUE : FALSE;\n\t\t\t\tpAd->CommonCfg.MaxSPLength\t= (UCHAR)((apsd\t& 0x00000060) >> 5);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_SET_APSD_SETTING (apsd=0x%lx, APSDCap=%d, [BE,BK,VI,VO]=[%d/%d/%d/%d],\tMaxSPLen=%d)\\n\", apsd, pAd->StaCfg.UapsdInfo.bAPSDCapable,\n\t\t\t\t\tpAd->CommonCfg.bAPSDAC_BE,\tpAd->CommonCfg.bAPSDAC_BK,\tpAd->CommonCfg.bAPSDAC_VI,\tpAd->CommonCfg.bAPSDAC_VO,\tpAd->CommonCfg.MaxSPLength));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_SET_APSD_PSM:\n\t\t\tif (wrq->u.data.length\t!= sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\t/* Driver needs to notify AP when PSM changes */\n\t\t\t\tStatus = copy_from_user(&pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (pAd->CommonCfg.bAPSDForcePowerSave\t!= pAd->StaCfg.Psm)\n\t\t\t\t{\n\t\t\t\t\tRTMP_SET_PSM_BIT(pAd,\tpAd->CommonCfg.bAPSDForcePowerSave);\n\t\t\t\t\tRTMPSendNullFrame(pAd,\tpAd->CommonCfg.TxRate, TRUE, pAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_SET_APSD_PSM (bAPSDForcePowerSave:%d)\\n\",\tpAd->CommonCfg.bAPSDForcePowerSave));\n\t\t\t}\n\t\t\tbreak;\n#ifdef QOS_DLS_SUPPORT\n\t\tcase RT_OID_802_11_SET_DLS:\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tBOOLEAN\toldvalue = pAd->CommonCfg.bDLSCapable;\n\t\t\t\tStatus = copy_from_user(&pAd->CommonCfg.bDLSCapable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (oldvalue &&\t!pAd->CommonCfg.bDLSCapable)\n\t\t\t\t{\n\t\t\t\t\tint\ti;\n\t\t\t\t\t/* tear\tdown local dls table entry */\n\t\t\t\t\tfor\t(i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status\t= DLS_NONE;\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid\t= FALSE;\n\t\t\t\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* tear\tdown peer dls table\tentry */\n\t\t\t\t\tfor\t(i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Status\t= DLS_NONE;\n\t\t\t\t\t\t\tpAd->StaCfg.DLSEntry[i].Valid\t= FALSE;\n\t\t\t\t\t\t\tRTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Set::RT_OID_802_11_SET_DLS (=%d)\\n\", pAd->CommonCfg.bDLSCapable));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_SET_DLS_PARAM:\n\t\t\tif (wrq->u.data.length\t!= sizeof(RT_802_11_DLS_UI))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tRT_802_11_DLS\tDls;\n\n\t\t\t\tNdisZeroMemory(&Dls, sizeof(RT_802_11_DLS));\n\t\t\t\tRTMPMoveMemory(&Dls, wrq->u.data.pointer, sizeof(RT_802_11_DLS_UI));\n\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\t\t\tRT_OID_802_11_SET_DLS_PARAM, \n\t\t\t\t\t\t\tsizeof(RT_802_11_DLS), \n\t\t\t\t\t\t\t&Dls, 0);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Set::RT_OID_802_11_SET_DLS_PARAM \\n\"));\n\t\t\t}\n\t\t\tbreak;\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tcase RT_OID_802_11_SET_TDLS:\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tBOOLEAN\toldvalue = pAd->StaCfg.TdlsInfo.bTDLSCapable;\n\n\t\t\t\tStatus = copy_from_user(&pAd->StaCfg.TdlsInfo.bTDLSCapable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (oldvalue &&\t!pAd->StaCfg.TdlsInfo.bTDLSCapable)\n\t\t\t\t{\n\t\t\t\t\t/* tear\tdown local dls table entry */\n\t\t\t\t\tTDLS_LinkTearDown(pAd, TRUE);\n\t\t\t\t}\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Set::RT_OID_802_11_SET_DLS (=%d)\\n\", pAd->CommonCfg.bDLSCapable));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_SET_TDLS_PARAM:\n\t\t\tif (wrq->u.data.length\t!= sizeof(RT_802_11_TDLS_UI))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tRT_802_11_TDLS\t\tTDLS;\n\n\t\t\t\t/* Initialized mlme request */\n\t\t\t\tRTMPZeroMemory(&TDLS, sizeof(RT_802_11_TDLS));\n\t\t\t\tRTMPMoveMemory(&TDLS, wrq->u.data.pointer, sizeof(RT_802_11_TDLS_UI));\t\t\t\t\n\n\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\t\t\tRT_OID_802_11_SET_TDLS_PARAM, \n\t\t\t\t\t\t\tsizeof(RT_802_11_TDLS), \n\t\t\t\t\t\t\t&TDLS, 0);\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Set::RT_OID_802_11_SET_TDLS_PARAM \\n\"));\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\tcase RT_OID_802_11_SET_WMM:\n\t\t\tif (wrq->u.data.length\t!= sizeof(BOOLEAN))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&pAd->CommonCfg.bWmmCapable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_SET_WMM (=%d)\t\\n\", pAd->CommonCfg.bWmmCapable));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_DISASSOCIATE:\n\t\t\t/* */\n\t\t\t/* Set NdisRadioStateOff to\tTRUE, instead of called\tMlmeRadioOff. */\n\t\t\t/* Later on, NDIS_802_11_BSSID_LIST_EX->NumberOfItems should be\t0 */\n\t\t\t/* when\tquery OID_802_11_BSSID_LIST. */\n\t\t\t/* */\n\t\t\t/* TRUE:  NumberOfItems\twill set to\t0. */\n\t\t\t/* FALSE: NumberOfItems\tno change. */\n\t\t\t/* */\n\t\t\tpAd->CommonCfg.NdisRadioStateOff =\tTRUE;\n\t\t\t/* Set to immediately send the media disconnect\tevent */\n\t\t\tpAd->MlmeAux.CurrReqIsFromNdis\t= TRUE;\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DISASSOCIATE\t\\n\"));\n\n#ifdef WSC_STA_SUPPORT\n#ifdef WSC_LED_SUPPORT\n\t\t\tif (pAd->StaCfg.WscControl.bSkipWPSTurnOffLED == FALSE)\n\t\t\t{\n\t\t\t\tUCHAR WPSLEDStatus = LED_WPS_TURN_LED_OFF;\n\t\t\t\tBOOLEAN Cancelled;\n\t\t\t\tRTMPSetLED(pAd, WPSLEDStatus);\n\t\t\t\t/* Cancel the WPS LED timer. */\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.WscControl.WscLEDTimer, &Cancelled);\n\t\t\t}\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t{\n\t\t\t\tif (pAd->Mlme.CntlMachine.CurrState !=\tCNTL_IDLE)\n\t\t\t\t{\n\t\t\t\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME\tbusy, reset\tMLME state machine !!!\\n\"));\n\t\t\t\t}\n\n\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tMLME_CNTL_STATE_MACHINE,\n\t\t\t\t\tOID_802_11_DISASSOCIATE,\n\t\t\t\t\t0,\n\t\t\t\t\tNULL, 0);\n\n\t\t\t\tStateMachineTouched\t= TRUE;\n\t\t\t}\n\t\t\tbreak;\n\n#ifdef DOT11_N_SUPPORT\n\t\tcase RT_OID_802_11_SET_IMME_BA_CAP:\n\t\t\t\tif (wrq->u.data.length != sizeof(OID_BACAP_STRUC))\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOID_BACAP_STRUC Orde ;\n\t\t\t\t\tStatus = copy_from_user(&Orde, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tif (Orde.Policy > BA_NOTUSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tStatus = NDIS_STATUS_INVALID_DATA;\n\t\t\t\t\t}\n\t\t\t\t\telse if (Orde.Policy == BA_NOTUSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.MimoPs= Orde.MMPSmode;\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode;\n\t\t\t\t\t\t/* UPdata to HT IE */\n\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode;\n\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize;\n\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n                        pAd->CommonCfg.BACapability.field.AutoBA = Orde.AutoBA;\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.Policy = IMMED_BA; /* we only support immediate BA. */\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize;\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.MimoPs = Orde.MMPSmode;\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t/* UPdata to HT IE */\n\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode;\n\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize;\n\t\t\t\t\t\tpAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (pAd->CommonCfg.BACapability.field.RxBAWinLimit > MAX_RX_REORDERBUF)\n\t\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = MAX_RX_REORDERBUF;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::(Orde.AutoBA = %d) (Policy=%d)(ReBAWinLimit=%d)(TxBAWinLimit=%d)(AutoMode=%d)\\n\",Orde.AutoBA, pAd->CommonCfg.BACapability.field.Policy,\n\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit,pAd->CommonCfg.BACapability.field.TxBAWinLimit, pAd->CommonCfg.BACapability.field.AutoBA));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::(MimoPs = %d)(AmsduEnable = %d) (AmsduSize=%d)(MpduDensity=%d)\\n\",pAd->CommonCfg.DesiredHtPhy.MimoPs, pAd->CommonCfg.DesiredHtPhy.AmsduEnable,\n\t\t\t\t\t\tpAd->CommonCfg.DesiredHtPhy.AmsduSize, pAd->CommonCfg.DesiredHtPhy.MpduDensity));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\tcase RT_OID_802_11_ADD_IMME_BA:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" Set :: RT_OID_802_11_ADD_IMME_BA \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY))\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tUCHAR\t\t        index;\n\t\t\t\tOID_ADD_BA_ENTRY    BA;\n\t\t\t\tMAC_TABLE_ENTRY     *pEntry;\n\n\t\t\t\tStatus = copy_from_user(&BA, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (BA.TID > (NUM_OF_TID-1))\n\t\t\t\t{\n\t\t\t\t\tStatus = NDIS_STATUS_INVALID_DATA;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/*BATableInsertEntry */\n\t\t\t\t\t/*As ad-hoc mode, BA pair is not limited to only BSSID. so add via OID. */\n\t\t\t\t\tindex = BA.TID;\n\t\t\t\t\t/* in ad hoc mode, when adding BA pair, we should insert this entry into MACEntry too */\n\t\t\t\t\tpEntry = MacTableLookup(pAd, BA.MACAddr);\n\t\t\t\t\tif (!pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_802_11_ADD_IMME_BA. break on no connection.----:%x:%x\\n\", BA.MACAddr[4], BA.MACAddr[5]));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (BA.IsRecipient == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t    if (pEntry->bIAmBadAtheros == TRUE)\n\t\t\t\t\t\t\tpAd->CommonCfg.BACapability.field.RxBAWinLimit = 0x10;\n\n\t\t\t\t\t\tBAOriSessionSetUp(pAd, pEntry, index, 0, 100, TRUE);\n\t\t\t\t\t}\n\t\t\t\t\telse \n\t\t\t\t\t{\n\t\t\t\t\t\t/*BATableInsertEntry(pAd, pEntry->Aid, BA.MACAddr, 0, 0xffff, BA.TID, BA.nMSDU, BA.IsRecipient); */\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_802_11_ADD_IMME_BA. Rec = %d. Mac = %x:%x:%x:%x:%x:%x . \\n\",\n\t\t\t\t\t\tBA.IsRecipient, BA.MACAddr[0], BA.MACAddr[1], BA.MACAddr[2], BA.MACAddr[2]\n\t\t\t\t\t\t, BA.MACAddr[4], BA.MACAddr[5]));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_TEAR_IMME_BA:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set :: RT_OID_802_11_TEAR_IMME_BA \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY))\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\telse \n\t\t\t{\n\t\t\t\tPOID_ADD_BA_ENTRY\tpBA;\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\t\n/*\t\t\t\tpBA = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pBA, wrq->u.data.length);\n\n\t\t\t\tif (pBA == NULL)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set :: RT_OID_802_11_TEAR_IMME_BA kmalloc() can't allocate enough memory\\n\"));\n\t\t\t\t\tStatus = NDIS_STATUS_FAILURE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tStatus = copy_from_user(pBA, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set :: RT_OID_802_11_TEAR_IMME_BA(TID=%d, bAllTid=%d)\\n\", pBA->TID, pBA->bAllTid));\n\t\t\t\t\t\n\t\t\t\t\tif (!pBA->bAllTid && (pBA->TID > (NUM_OF_TID-1)))\n\t\t\t\t\t{\n\t\t\t\t\t\tStatus = NDIS_STATUS_INVALID_DATA;\n\t\t\t\t\t\tos_free_mem(NULL, pBA);\n/*\t\t\t\t\t\tkfree(pBA); */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (pBA->IsRecipient == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry = MacTableLookup(pAd, pBA->MACAddr);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" pBA->IsRecipient == FALSE\\n\"));\n\t\t\t\t\t\tif (pEntry)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" pBA->pEntry\\n\"));\n\t\t\t\t\t\t\tBAOriSessionTearDown(pAd, pEntry->Aid, pBA->TID, FALSE, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set :: Not found pEntry \\n\"));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpEntry = MacTableLookup(pAd, pBA->MACAddr);\n\t\t\t\t\t\tif (pEntry)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBARecSessionTearDown( pAd, (UCHAR)pEntry->Aid, pBA->TID, TRUE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set :: Not found pEntry \\n\"));\n\t\t\t\t\t}\n\t\t\t\t\tos_free_mem(NULL, pBA);\n/*\t\t\t\t\tkfree(pBA); */\n\t\t\t\t}\n            }\n            break;\n#endif /* DOT11_N_SUPPORT */\n\n        /* For WPA_SUPPLICANT to set static wep key */\n    \tcase OID_802_11_ADD_WEP:\n/*    \t    pWepKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pWepKey, wrq->u.data.length);\n\n    \t    if(pWepKey == NULL)\n            {\n                Status = -ENOMEM;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP, Failed!!\\n\"));\n                break;\n            }\n            Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length);\n            if (Status)\n            {\n                Status  = -EINVAL;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\\n\"));\n            }\n            else\n            {\n\t\t        KeyIdx = pWepKey->KeyIndex & 0x0fffffff;\n                /* KeyIdx must be 0 ~ 3 */\n                if (KeyIdx >= 4)\n    \t\t\t{\n                    Status  = -EINVAL;\n                    DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\\n\"));\n                }\n                else\n                {\n                    UCHAR CipherAlg = 0;\n                    PUCHAR Key;\n\n\t\t\t\t\t/* Zero the specific shared key */\n\t\t\t\t\tNdisZeroMemory(&pAd->SharedKey[BSS0][KeyIdx], sizeof(CIPHER_KEY));\n\n                    /* set key material and key length */\n                    pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;\n                    NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);\n\n                    switch(pWepKey->KeyLength)\n                    {\n                        case 5:\n                            CipherAlg = CIPHER_WEP64;\n                            break;\n                        case 13:\n                            CipherAlg = CIPHER_WEP128;\n                            break;\n                        default:\n                            DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\\n\"));\n                            Status = -EINVAL;\n                            break;\n                    }\n                    pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg;\n\n                    /* Default key for tx (shared key) */\n                    if (pWepKey->KeyIndex & 0x80000000)\n                    {\n#ifdef WPA_SUPPLICANT_SUPPORT\n                        NdisZeroMemory(&pAd->StaCfg.DesireSharedKey[KeyIdx], sizeof(CIPHER_KEY));\n\t\t\t\t\t\t\t\t\n                        /* set key material and key length */\n                        pAd->StaCfg.DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;\n                        NdisMoveMemory(pAd->StaCfg.DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);\n                        pAd->StaCfg.DesireSharedKeyId = KeyIdx;\n                        pAd->StaCfg.DesireSharedKey[KeyIdx].CipherAlg = CipherAlg;\n#endif /* WPA_SUPPLICANT_SUPPORT */                    \n                        pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;\n                    }\n                    \n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\tif ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&\n\t\t\t\t\t\t(pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA))\n\t\t\t\t\t{\n\t\t\t\t\t\tKey = pWepKey->KeyMaterial;\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Set Group key material to Asic */\n    \t\t\t\t\tAsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, &pAd->SharedKey[BSS0][KeyIdx]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tSTA_PORT_SECURED(pAd);\n\t\t\t\t\t}\n                    else if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)\n#endif /* WPA_SUPPLICANT_SUPPORT */\n                    {\n                        Key = pAd->SharedKey[BSS0][KeyIdx].Key;\n\n                        /* Set key material and cipherAlg to Asic */\n        \t\t\t\tAsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, &pAd->SharedKey[BSS0][KeyIdx]);\t\n                        \n                        if (pWepKey->KeyIndex & 0x80000000)\n                        {\n    \t\t\t\t\t\t/* Assign pairwise key info */\n    \t\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t BSS0, \n\t\t\t\t\t\t\t\t\t\t\t\t KeyIdx, \n\t\t\t\t\t\t\t\t\t\t\t\t CipherAlg, \t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t BSSID_WCID, \n\t\t\t\t\t\t\t\t\t\t\t\t SHAREDKEYTABLE);\n                        }\n                    }\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\\n\", pWepKey->KeyIndex, pWepKey->KeyLength, (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) ? \"Port Secured\":\"Port NOT Secured\"));\n\t\t\t\t}\n            }\n\t\t\tos_free_mem(NULL, pWepKey);\n/*            kfree(pWepKey); */\n            break;\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t    case OID_SET_COUNTERMEASURES:\n            if (wrq->u.data.length != sizeof(int))\n                Status  = -EINVAL;\n            else\n            {\n                int enabled = 0;\n                Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);\n                if (enabled == 1)\n                    pAd->StaCfg.bBlockAssoc = TRUE;\n                else\n                    /* WPA MIC error should block association attempt for 60 seconds */\n                    pAd->StaCfg.bBlockAssoc = FALSE;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_SET_COUNTERMEASURES bBlockAssoc=%s\\n\", pAd->StaCfg.bBlockAssoc ? \"TRUE\":\"FALSE\"));\n            }\n\t        break;\n        case RT_OID_WPA_SUPPLICANT_SUPPORT:\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n                Status  = -EINVAL;\n            else\n            {\n\t\t\t\tStatus = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif (wpa_supplicant_enable & WPA_SUPPLICANT_ENABLE_WPS)\n\t\t\t\t\tpAd->StaCfg.WpaSupplicantUP |= WPA_SUPPLICANT_ENABLE_WPS;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->StaCfg.WpaSupplicantUP = wpa_supplicant_enable;\n\t\t\t\t\tpAd->StaCfg.WpaSupplicantUP &= 0x7F;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=0x%02X)\\n\", pAd->StaCfg.WpaSupplicantUP));\n\t\t\t}\n            break;\t   \n        case OID_802_11_DEAUTHENTICATION:\n            if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT))\n                Status  = -EINVAL;\n            else\n            {\n                MLME_DEAUTH_REQ_STRUCT      *pInfo;\n\t\t\t\tMLME_QUEUE_ELEM *MsgElem;/* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&MsgElem, sizeof(MLME_QUEUE_ELEM));\n                if (MsgElem == NULL)\n                {\n                \tDBGPRINT(RT_DEBUG_ERROR, (\"%s():alloc memory failed!\\n\", __FUNCTION__));\n                        return -EINVAL;\n                }\n\n                pInfo = (MLME_DEAUTH_REQ_STRUCT *) MsgElem->Msg;\n                Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);\n                MlmeDeauthReqAction(pAd, MsgElem);\n/*\t\t\t\tkfree(MsgElem); */\n\t\t\t\tos_free_mem(NULL, MsgElem);\n\n                if (INFRA_ON(pAd))\n                {\n                    LinkDown(pAd, FALSE);\n                    pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n                }\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\\n\", pInfo->Reason));\n            }\n            break;\n        case OID_802_11_DROP_UNENCRYPTED:\n            if (wrq->u.data.length != sizeof(int))\n                Status  = -EINVAL;\n            else\n            {\n                int enabled = 0;\n                Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);\n                if (enabled == 1)\n                    pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                else\n                    pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t\t\t\tpAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured;\n\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_DROP_UNENCRYPTED (=%d)\\n\", enabled));\n            }\n            break;\n        case OID_802_11_SET_IEEE8021X:\n            if (wrq->u.data.length != sizeof(BOOLEAN))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length);                \t\t\t\t\n\t\t        pAd->StaCfg.IEEE8021X = IEEE8021xState;\n                DBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SET_IEEE8021X (=%d)\\n\", IEEE8021xState));\n            }\n            break;\n        case OID_802_11_SET_IEEE8021X_REQUIRE_KEY:\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n\t\t\t\t Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length);                \t\t\t\t\n\t\t\t\tpAd->StaCfg.IEEE8021x_required_keys = IEEE8021x_required_keys;\t\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\\n\", IEEE8021x_required_keys));\n\t\t\t}\t\n\t\t\tbreak;\n        case OID_802_11_PMKID:\n/*\t        pPmkId = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pPmkId, wrq->u.data.length);\n\n\t        if(pPmkId == NULL) {\n                Status = -ENOMEM;\n                break;\n            }\n            Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length);\n\t  \t  \n\t        /* check the PMKID information */\n\t        if (pPmkId->BSSIDInfoCount == 0)\n                NdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO);\n\t        else\n\t        {\n\t\t        PBSSID_INFO\tpBssIdInfo;\n\t\t        UINT\t\tBssIdx;\n\t\t        UINT\t\tCachedIdx;\n\n\t\t        for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++)\n\t\t        {\n\t\t\t        /* point to the indexed BSSID_INFO structure */\n\t\t\t        pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO));\n\t\t\t        /* Find the entry in the saved data base. */\n\t\t\t        for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++)\n\t\t\t        {\n\t\t\t\t        /* compare the BSSID */\n\t\t\t\t        if (NdisEqualMemory(pBssIdInfo->BSSID, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS)))\n\t\t\t\t\t        break;\t\t\t\n\t\t\t        }\n\n\t\t\t        /* Found, replace it */\n\t\t\t        if (CachedIdx < PMKID_NO)\n\t\t\t        {\n\t\t\t\t        DBGPRINT(RT_DEBUG_OFF, (\"Update OID_802_11_PMKID, idx = %d\\n\", CachedIdx));\n\t\t\t\t        NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));\n\t\t\t\t        pAd->StaCfg.SavedPMKNum++;\n\t\t\t        }\n\t\t\t        /* Not found, replace the last one */\n\t\t\t        else\n\t\t\t        {\n\t\t\t\t        /* Randomly replace one */\n\t\t\t\t        CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO);\n\t\t\t\t        DBGPRINT(RT_DEBUG_OFF, (\"Update OID_802_11_PMKID, idx = %d\\n\", CachedIdx));\n\t\t\t\t        NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));\n\t\t\t        }\t\t\t\t\n\t\t        }\n\t\t\t}\n\t\t\tif(pPmkId) \n/*\t\t\t\tkfree(pPmkId); */\n\t\t\t\tos_free_mem(NULL, pPmkId);\n\t        break;\n\n\t\tcase RT_OID_WPS_PROBE_REQ_IE:\n\t\t\tif (pAd->StaCfg.pWpsProbeReqIe)\n\t\t\t{\n/*\t\t\t\tkfree(pAd->StaCfg.pWpsProbeReqIe); */\n\t\t\t\tos_free_mem(NULL, pAd->StaCfg.pWpsProbeReqIe);\n\t\t\t\tpAd->StaCfg.pWpsProbeReqIe = NULL;\n\t\t\t}\n\t\t\tpAd->StaCfg.WpsProbeReqIeLen = 0;\n/*\t\t\tpAd->StaCfg.pWpsProbeReqIe = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&(pAd->StaCfg.pWpsProbeReqIe), wrq->u.data.length);\n\t\t\tif (pAd->StaCfg.pWpsProbeReqIe)\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(pAd->StaCfg.pWpsProbeReqIe, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\t\tif (Status)\n            \t{\n                \tStatus  = -EINVAL;\n\t\t\t\t\tif (pAd->StaCfg.pWpsProbeReqIe)\n\t\t\t\t\t{\n/*\t\t\t\t\t\tkfree(pAd->StaCfg.pWpsProbeReqIe); */\n\t\t\t\t\t\tos_free_mem(NULL, pAd->StaCfg.pWpsProbeReqIe);\n\t\t\t\t\t\tpAd->StaCfg.pWpsProbeReqIe = NULL;\n\t\t\t\t\t}\n\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen = 0;\n                \tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_WPS_PROBE_REQ_IE, Failed (copy_from_user failed)!!\\n\"));\n           \t\t}\n           \t\telse\n           \t\t{\n\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen = wrq->u.data.length;\n\t\t\t\t\thex_dump(\"WpsProbeReqIe\", pAd->StaCfg.pWpsProbeReqIe, pAd->StaCfg.WpsProbeReqIeLen);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::RT_OID_WPS_PROBE_REQ_IE, WpsProbeReqIeLen = %d!!\\n\",\n\t\t\t\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen));\n           \t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tStatus = -ENOMEM;\n\t\t\tbreak;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t\tcase RT_OID_WSC_EAPMSG:\n\t\t\t{\n\t\t\t\tRTMP_WSC_U2KMSG_HDR *msgHdr = NULL;\n\t\t\t\tPUCHAR pUPnPMsg = NULL;\n\t\t\t\tUINT msgLen = 0, Machine = 0, msgType = 0;\n\t\t\t\tint retVal, senderID = 0;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WSC::RT_OID_WSC_EAPMSG, wrq->u.data.length=%d!\\n\", wrq->u.data.length));\n\t\t\t\n\t\t\t\tmsgLen = wrq->u.data.length;\t\t\t\t\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pUPnPMsg, msgLen);\n/*\t\t\t\tif((pUPnPMsg = kmalloc(msgLen, GFP_KERNEL)) == NULL) */\n\t\t\t\tif (pUPnPMsg == NULL)\n\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmemset(pUPnPMsg, 0, msgLen);\n\t\t\t\t\tretVal = copy_from_user(pUPnPMsg, wrq->u.data.pointer, msgLen);\n\t\t\t\t\t\n\t\t\t\t\tmsgHdr = (RTMP_WSC_U2KMSG_HDR *)pUPnPMsg;\n\t\t\t\t\tsenderID = *((int *)&msgHdr->Addr2);\n\t\t\t\t\t/*assign the STATE_MACHINE type */\n\t\t\t\t\t{\n                        Machine = WSC_STATE_MACHINE;\n\t\t\t\t\t\tmsgType = WSC_EAPOL_UPNP_MSG;\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\tretVal = MlmeEnqueueForWsc(pAd, msgHdr->envID, senderID, Machine, msgType, msgLen, pUPnPMsg);\n\t\t\t\t\t\tif((retVal == FALSE) && (msgHdr->envID != 0))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeEnqueuForWsc return False and envID=0x%x!\\n\", msgHdr->envID));\n\t\t\t\t\t\t\tStatus = -EINVAL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n/*\t\t\t\t\tkfree(pUPnPMsg); */\n\t\t\t\t\tos_free_mem(NULL, pUPnPMsg);\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_EAPMSG finished!\\n\"));\n\t\t\t}\n\t\t\tbreak;\n        case RT_OID_WSC_SET_PROFILE:\n            if (wrq->u.data.length != sizeof(WSC_PROFILE))\n                Status = -EINVAL;\n            else\n            {\n                PWSC_PROFILE pWscProfile = &pAd->StaCfg.WscControl.WscProfile;\n                NdisZeroMemory(pWscProfile, sizeof(WSC_PROFILE));\n                Status = copy_from_user(pWscProfile, wrq->u.data.pointer, wrq->u.data.length);\n                DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_SET_PROFILE:: ProfileCnt = %d\\n\", pWscProfile->ProfileCnt));\n            }\n            break;\n            \n        case RT_OID_WSC_SET_CONF_MODE: /* WPS disable, Enrollee or Registrar */\n            if (wrq->u.data.length != sizeof(INT))\n                Status = -EINVAL;\n            else\n            {\n                INT WscConfMode = 0;\n                Status = copy_from_user(&WscConfMode, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == 0)\n                {\n\t\t\t\t\tif (WscConfMode == 2)\n\t\t\t\t\t\tWscConfMode = 4;\n\n                    switch(WscConfMode)\n                    {\n                        case WSC_ENROLLEE:\n                            Set_WscConfMode_Proc(pAd, \"1\");\n                            break;\n                        case WSC_REGISTRAR:\n                            Set_WscConfMode_Proc(pAd, \"2\");\n\t\t\t\t\t\t\tWscConfMode = 2;\n                            break;\n                        case WSC_DISABLE:\n                        default:\n                            Set_WscConfMode_Proc(pAd, \"0\");\n                            break;\n                    }                    \n                }\n                DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_SET_CONF_MODE:: WscConfMode = %d\\n\", WscConfMode));\n            }\n            break;\n        case RT_OID_WSC_SET_MODE:\n            if (wrq->u.data.length != sizeof(INT))\n                Status = -EINVAL;\n            else\n            {\n                INT WscMode = 0; /* PIN or PBC */\n                Status = copy_from_user(&WscMode, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == 0)\n                {\n                    if (WscMode == WSC_PIN_MODE) /* PIN */\n                    {\n                        if (Set_WscMode_Proc(pAd, \"1\") == FALSE)\n\t\t\t\t\t\t\tStatus = -EINVAL;\n                    }\n                    else if (WscMode == WSC_PBC_MODE) /* PBC */\n                    {\n                        if (Set_WscMode_Proc(pAd, \"2\") == FALSE)\n\t\t\t\t\t\t\tStatus = -EINVAL;\n                    }\n                    else if (WscMode == WSC_SMPBC_MODE) /* SMPBC */\n                    {\n\t\t\t\t\t\tif (Set_WscMode_Proc(pAd, \"3\") == FALSE)\n\t\t\t\t\t\t\tStatus = -EINVAL;\n                    }\n                    else\n                    {\n                        DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_SET_MODE::unknown WscMode = %d\\n\", WscMode));\n                        Status = -EINVAL;\n                    }\n                }\n                DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_SET_MODE::WscMode = %d\\n\", WscMode));\n            }\n            break;\n        case RT_OID_WSC_SET_PIN_CODE:\n            if (wrq->u.data.length != 8) /* PIN Code Length is 8 */\n                Status = -EINVAL;\n            else\n            {\n                CHAR PinCode[9] = {0};\n                Status = copy_from_user(&PinCode[0], wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == 0)\n                {\n                    if (Set_WscPinCode_Proc(pAd, (PSTRING) &PinCode[0]) == FALSE)\n                        Status = -EINVAL;\n                }\n            }\n            break;\n        case RT_OID_WSC_SET_SSID:\n            if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))\n                Status = -EINVAL;\n            else\n            {\n                NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n                Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tSsid.Ssid[NDIS_802_11_LENGTH_SSID-1] = 0x00;\n                Set_WscSsid_Proc(pAd, (PSTRING) Ssid.Ssid);\n            }\n            break;\n        case RT_OID_WSC_SET_CONN_BY_PROFILE_INDEX:\n            if (wrq->u.data.length != sizeof(UINT))\n                Status = -EINVAL;\n            else\n            {\n                UINT wsc_profile_index = 0; /* PIN or PBC */\n                PWSC_CTRL   pWscControl = &pAd->StaCfg.WscControl;\n                unsigned long\tIrqFlags;\n                \n                Status = copy_from_user(&wsc_profile_index, wrq->u.data.pointer, wrq->u.data.length);\n                if (wsc_profile_index < pWscControl->WscProfile.ProfileCnt)\n                {                    \n                    RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);\n                    WscWriteConfToPortCfg(pAd, pWscControl, &pWscControl->WscProfile.Profile[wsc_profile_index], TRUE);\n                    RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);\n                    pAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n                    LinkDown(pAd, TRUE);                    \n                }\n                else\n                    DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_SET_CONN_BY_PROFILE_INDEX:: wrong wsc_profile_index(%d)\\n\", wsc_profile_index));                \n            }\n            break;\n        case RT_OID_WSC_DRIVER_AUTO_CONNECT:\n            if (wrq->u.data.length != sizeof(UCHAR))\n                Status = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&pAd->StaCfg.WscControl.WscDriverAutoConnect, wrq->u.data.pointer, wrq->u.data.length);\n                DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_DRIVER_AUTO_CONNECT::WscDriverAutoConnect is %d\\n\", \n                                            pAd->StaCfg.WscControl.WscDriverAutoConnect));\n            }\n            break;\n        case RT_OID_WSC_SET_PASSPHRASE:\n            if (wrq->u.data.length > 64 || wrq->u.data.length < 8)\n                Status = -EINVAL;\n            else\n            {\n                Status = copy_from_user(pAd->StaCfg.WscControl.WpaPsk, wrq->u.data.pointer, wrq->u.data.length);\n                NdisZeroMemory(pAd->StaCfg.WscControl.WpaPsk, 64);\n                pAd->StaCfg.WscControl.WpaPskLen = wrq->u.data.length;\n                DBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_SET_PASSPHRASE::KeyLen(%d)\\n\", pAd->StaCfg.WscControl.WpaPskLen));\n            }\n            break;\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef WSC_INCLUDED\n#ifdef WSC_LED_SUPPORT\n\t\tcase RT_OID_LED_WPS_MODE10:\n\t\t\tif(!(pAd->StaCfg.bRadio) ||\n\t\t\t\t(wrq->u.data.length != sizeof(UINT)))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&WPSLedMode10, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tif((WPSLedMode10 != LINK_STATUS_WPS_MODE10_TURN_ON) && \n\t\t\t\t\t(WPSLedMode10 != LINK_STATUS_WPS_MODE10_FLASH) && \n\t\t\t\t\t(WPSLedMode10 != LINK_STATUS_WPS_MODE10_TURN_OFF))\n\t\t\t\t{\n\t\t\t\t\tStatus = NDIS_STATUS_INVALID_DATA;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"WPS LED Mode 10::Parameter of LED Mode 10 must be 0x00, or 0x01, or 0x02\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{ \n#ifdef RTMP_MAC_USB\n\t\t\t\t\tRTEnqueueInternalCmd(pAd, CMDTHREAD_LED_WPS_MODE10, &WPSLedMode10, sizeof(WPSLedMode10));\n#endif /* RTMP_MAC_USB */\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_INCLUDED */\n\n#ifdef SNMP_SUPPORT\n\t\tcase OID_802_11_SHORTRETRYLIMIT:\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\t\ttx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_SHORTRETRYLIMIT (tx_rty_cfg.field.ShortRetryLimit=%d, ShortRetryLimit=%ld)\\n\", tx_rty_cfg.field.ShortRtyLimit, ShortRetryLimit));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_LONGRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_LONGRETRYLIMIT \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(ULONG))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\t\ttx_rty_cfg.field.LongRtyLimit = LongRetryLimit;\n\t\t\t\tRTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_LONGRETRYLIMIT (tx_rty_cfg.field.LongRetryLimit= %d,LongRetryLimit=%ld)\\n\", tx_rty_cfg.field.LongRtyLimit, LongRetryLimit));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYVALUE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE\\n\"));\n/*\t\t\tpKey = kmalloc(wrq->u.data.length, GFP_KERNEL); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length);\n\t\t\tif (pKey == NULL)\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tStatus = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t/*pKey = &WepKey; */\n\t\t\t\n\t\t\tif ( pKey->Length != wrq->u.data.length)\n\t\t\t{\n\t\t\t\tStatus = -EINVAL;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\\n\"));\n\t\t\t}\n\t\t\tKeyIdx = pKey->KeyIndex & 0x0fffffff;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"pKey->KeyIndex =%d, pKey->KeyLength=%d\\n\", pKey->KeyIndex, pKey->KeyLength));\n\n\t\t\t/* it is a shared key */\n\t\t\tif (KeyIdx >= 4)\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength;\n\t\t\t\tNdisMoveMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength);\n\t\t\t\tif (pKey->KeyIndex & 0x80000000)\n\t\t\t\t{\n\t\t\t\t\t/* Default key for tx (shared key) */\n\t\t\t\t\tpAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;\n\t\t\t\t}\n\t\t\t\t/*RestartAPIsRequired = TRUE; */\n\t\t\t}\n/*\t\t\tkfree(pKey); */\n\t\t\tos_free_mem(NULL, pKey);\n\t\t\tbreak;\n\n\n\t\tcase OID_802_11_WEPDEFAULTKEYID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_WEPDEFAULTKEYID \\n\"));\n\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t\tStatus = copy_from_user(&pAd->StaCfg.DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length);\n\n\t\t\tbreak;\n\n\n\t\tcase OID_802_11_CURRENTCHANNEL:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_CURRENTCHANNEL \\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(UCHAR))\n\t\t\t\tStatus = -EINVAL;\n\t\t\telse\n\t\t\t{\n\t\t\t\tSTRING\tChStr[5] = {0};\n\t\t\t\tStatus = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\tsnprintf(ChStr, sizeof(ChStr), \"%d\", ctmp);\n\t\t\t\tSet_Channel_Proc(pAd, ChStr);\n\t\t\t}\n\t\t\tbreak;\n#endif /* SNMP_SUPPORT */\n\n\n#ifdef WAPI_SUPPORT\n\t\tcase OID_802_11_WAPI_PID:\n\t\t\t{\n\t\t\t\tunsigned long wapi_pid = 0;\n    \t\t\tif (copy_from_user(&pObj->wapi_pid, wrq->u.data.pointer, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tStatus = -EFAULT; \t\n\t\t\t\t}\n    \t\t\telse\n    \t\t\t{\n\t\t\t\t\tRTMP_GET_OS_PID(pObj->wapi_pid, wapi_pid);\n\t\t\t\t\tpObj->wapi_pid_nr = wapi_pid;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"OID_802_11_WAPI_PID::(WapiPid=%lu(0x%x))\\n\", wapi_pid, pObj->wapi_pid));\n\t\t\t\t}\n    \t\t}\n\t\t\tbreak;\n\t\tcase OID_802_11_PORT_SECURE_STATE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_PORT_SECURE_STATE, len=%d/%d\\n\", wrq->u.data.length, sizeof(WAPI_PORT_SECURE_STRUCT)));\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_PORT_SECURE_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tWAPI_PORT_SECURE_STRUCT  wapi_port;\n\n\t\t\t\tStatus = copy_from_user(&wapi_port, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == NDIS_STATUS_SUCCESS)\n                {\n\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tif (NdisEqualMemory(pAd->MlmeAux.Bssid, wapi_port.Addr, MAC_ADDR_LEN))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch (wapi_port.state)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase WAPI_PORT_SECURED:\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t\t\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\t\t\t\t\t\t\tpAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;\n\t\t\t\t\t\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected);\n\t\t\t\t\t\t\t\t\tbreak;\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_PORT_SECURE_STATE (state=%d)\\n\", wapi_port.state));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n            }\n\t\t\tbreak;\n\n\t\tcase OID_802_11_UCAST_KEY_INFO:\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_UCAST_KEY_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\n\t\t\t\tMAC_TABLE_ENTRY \t\t*pEntry = NULL;\n\t\t\t\tWAPI_UCAST_KEY_STRUCT   wapi_ukey;\n\n\t\t\t\tStatus = copy_from_user(&wapi_ukey, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == NDIS_STATUS_SUCCESS)\n                {\n\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tif (NdisEqualMemory(pAd->MlmeAux.Bssid, wapi_ukey.Addr, MAC_ADDR_LEN))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\t\t\t\t\tpEntry->usk_id = wapi_ukey.key_id;\n\t\t\t\t\t\t\tNdisMoveMemory(pAd->StaCfg.PTK, wapi_ukey.PTK, 64);\t\n\t\t\t\t\t\t\tNdisMoveMemory(pEntry->PTK, wapi_ukey.PTK, 64);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t/* Install pairwise key */\n\t\t\t\t\t\t\tWAPIInstallPairwiseKey(pAd, pEntry, FALSE);\n\n\t\t\t\t\t\t\t/* Start or re-start USK rekey mechanism, if necessary. */\n\t\t\t\t\t\t\tRTMPCancelWapiRekeyTimerAction(pAd, pEntry);\n\t\t\t\t\t\t\tRTMPStartWapiRekeyTimerAction(pAd, pEntry);\n\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_UCAST_KEY_INFO complete\\n\"));\n\t\t\t\t\t\t\thex_dump(\"WAPI UCAST KEY\", pAd->StaCfg.PTK, 64);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\n\t\t\t\t}\t\t\t\t\n            }\n\t\t\tbreak;\t\n\n\t\tcase OID_802_11_MCAST_KEY_INFO:\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_MCAST_KEY_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tWAPI_MCAST_KEY_STRUCT   wapi_mkey;\n\n\t\t\t\tStatus = copy_from_user(&wapi_mkey, wrq->u.data.pointer, wrq->u.data.length);\n                if (Status == NDIS_STATUS_SUCCESS)\n                {                \t\n                \t/* Obtain the NMK and tx_iv of AE */\n                \tpAd->StaCfg.DefaultKeyId = wapi_mkey.key_id;\n                \t/*NdisMoveMemory(pAd->StaCfg.rx_iv, wapi_mkey.m_tx_iv, LEN_WAPI_TSC); */\n                \tNdisMoveMemory(pAd->StaCfg.NMK, wapi_mkey.NMK, 16);\n\n\t\t\t\t\t/* Calculate GTK */\n\t\t\t\t\tRTMPDeriveWapiGTK(pAd->StaCfg.NMK, pAd->StaCfg.GTK);\n                \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t/* Install Shared key */\n\t\t\t\t\tWAPIInstallSharedKey(pAd, \n\t\t\t\t\t\t\t\t\t\t pAd->StaCfg.GroupCipher, \n\t\t\t\t\t\t\t\t\t\t BSS0, \n\t\t\t\t\t\t\t\t\t\t pAd->StaCfg.DefaultKeyId, \n\t\t\t\t\t\t\t\t\t\t MCAST_WCID,\n\t\t\t\t\t\t\t\t\t\t pAd->StaCfg.GTK);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Set::OID_802_11_MCAST_KEY_INFO complete\\n\"));\n\t\t\t\t}\t\t\t\t\n            }\n\t\t\tbreak;\t\t\t\t\t\t\t\t\n#endif /* WAPI_SUPPORT */\n\n#ifdef XLINK_SUPPORT\n\t\tcase RT_OID_802_11_SET_PSPXLINK_MODE:\n\t\t\tif (wrq->u.data.length != sizeof(BOOLEAN))\n                Status  = -EINVAL;\n            else\n            {\n                Status = copy_from_user(&pAd->StaCfg.PSPXlink, wrq->u.data.pointer, wrq->u.data.length);\n\t\t\t\t/*if (pAd->StaCfg.PSPXlink)\n\t\t\t\t\tRX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS)*/\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Set::RT_OID_802_11_SET_PSPXLINK_MODE(=%d) \\n\", pAd->StaCfg.PSPXlink));\n            }\n\t\t\tbreak;\n#endif /* XLINK_SUPPORT */\n\n\n\n#ifdef RTMP_MAC_USB\n        case RT_OID_USB_WOW_SUSPEND:\n            if (Set_UsbWOWSuspend(pAd, NULL) != TRUE)\n                Status = -EFAULT;\n            break;\n        case RT_OID_USB_WOW_RESUME:\n            if (Set_UsbWOWResume(pAd, NULL) != TRUE)\n                Status = -EFAULT;\n            break;\n#endif /* RTMP_MAC_USB */\n\n        default:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Set::unknown IOCTL's subcmd = 0x%08x\\n\", cmd));\n            Status = -EOPNOTSUPP;\n            break;\n    }\n\n\n    return Status;\n}\n\nINT RTMPQueryInformation(\n    IN  PRTMP_ADAPTER pAd,\n    IN  OUT RTMP_IOCTL_INPUT_STRUCT    *rq,\n    IN  INT                 cmd)\n{\n    RTMP_IOCTL_INPUT_STRUCT\t\t\t\t*wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;\n    NDIS_802_11_BSSID_LIST_EX           *pBssidList = NULL;\n    PNDIS_WLAN_BSSID_EX                 pBss;\n    NDIS_802_11_SSID                    Ssid;\n    NDIS_802_11_CONFIGURATION           *pConfiguration = NULL;\n    RT_802_11_LINK_STATUS               *pLinkStatus = NULL;\n    RT_802_11_STA_CONFIG                *pStaConfig = NULL;\n    NDIS_802_11_STATISTICS              *pStatistics = NULL;\n    NDIS_802_11_RTS_THRESHOLD           RtsThresh;\n    NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;\n    NDIS_802_11_POWER_MODE              PowerMode;\n    NDIS_802_11_NETWORK_INFRASTRUCTURE  BssType;\n    RT_802_11_PREAMBLE                  PreamType;\n    NDIS_802_11_AUTHENTICATION_MODE AuthMode;\n    NDIS_802_11_WEP_STATUS WepStatus;\n    NDIS_MEDIA_STATE MediaState;\n    ULONG BssBufSize, ulInfo=0, NetworkTypeList[4], apsd = 0, RateValue=0;\n    USHORT BssLen = 0;\n    PUCHAR pBuf = NULL, pPtr;\n    INT Status = NDIS_STATUS_SUCCESS;\n    UINT we_version_compiled;\n    UCHAR i, Padding = 0;\n    BOOLEAN RadioState;\n    STRING driverVersion[8];\n    OID_SET_HT_PHYMODE *pHTPhyMode = NULL;\n    HTTRANSMIT_SETTING\tHTPhyMode;\n\t\n#ifdef WSC_STA_SUPPORT\n\tUINT\t                            WscPinCode = 0;\n\tPWSC_PROFILE\t\t\t\t\t\tpProfile;\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef SNMP_SUPPORT\t\n\tDefaultKeyIdxValue\t\t\t*pKeyIdxValue;\n\tINT\t\t\t\t\t\t\tvalueLen;\n\tTX_RTY_CFG_STRUC\t\t\ttx_rty_cfg;\n\tULONG\t\t\t\t\t\tShortRetryLimit, LongRetryLimit;\n\tUCHAR\t\t\t\t\t\ttmp[64];\n#endif /*SNMP */\n\n\n#ifdef P2P_SUPPORT\n\t\t\t\tPRT_P2P_UI_TABLE pUI_table;\n\t\t\t\tPRT_P2P_TABLE\t\t\tpP2pTable;\n\t\t\t\tPRT_P2P_CLIENT_ENTRY   pPAdCli, pUICli;\n\t\t\t\tPRT_P2P_CONFIG\tpP2PCtrl; /* = &pAd->P2pCfg; */\n\t\t\t\tUCHAR tmpP2P[24];\n#endif /* P2P_SUPPORT */\n\n\n    switch(cmd) \n    {\n        case RT_OID_DEVICE_NAME:\n            wrq->u.data.length = sizeof(pAd->nickname);\n            Status = copy_to_user(wrq->u.data.pointer, pAd->nickname, wrq->u.data.length);\n            break;        \n        case RT_OID_VERSION_INFO:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_VERSION_INFO \\n\"));\n\t\t\twrq->u.data.length = 8*sizeof(CHAR);\n\t\t\tsnprintf(&driverVersion[0], sizeof(driverVersion), \"%s\", STA_DRIVER_VERSION);\n\t\t\tdriverVersion[7] = '\\0';\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &driverVersion[0], wrq->u.data.length))\n            {\n\t\t\t\tStatus = -EFAULT;\n            }\n            break;\n\n        case OID_802_11_BSSID_LIST:\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif ((pAd->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.WpaSupplicantScanCount = 0;\n\t\t\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_BSSID_LIST (%d BSS returned)\\n\",pAd->ScanTab.BssNr));\n\t\t\tpAd->StaCfg.bSkipAutoScanConn = FALSE;\n            /* Claculate total buffer size required */\n            BssBufSize = sizeof(ULONG);\n            \n            for (i = 0; i < pAd->ScanTab.BssNr; i++) \n            {\n                /* Align pointer to 4 bytes boundary. */\n                /*Padding = 4 - (pAd->ScanTab.BssEntry[i].VarIELen & 0x0003); */\n                /*if (Padding == 4) */\n                /*    Padding = 0; */\n                BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);\n            }\n\n            /* For safety issue, we add 256 bytes just in case */\n            BssBufSize += 256;\n            /* Allocate the same size as passed from higher layer */\n/*            pBuf = kmalloc(BssBufSize, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pBuf, BssBufSize);\n            if(pBuf == NULL)\n            {\n                Status = -ENOMEM;\n                break;\n            }\n\n            /* Init 802_11_BSSID_LIST_EX structure */\n            NdisZeroMemory(pBuf, BssBufSize);\n            pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;\n            pBssidList->NumberOfItems = pAd->ScanTab.BssNr;\n            \n            /* Calculate total buffer length */\n            BssLen = 4; /* Consist of NumberOfItems */\n            /* Point to start of NDIS_WLAN_BSSID_EX */\n            /* pPtr = pBuf + sizeof(ULONG); */\n            pPtr = (PUCHAR) &pBssidList->Bssid[0];\n            for (i = 0; i < pAd->ScanTab.BssNr; i++) \n            {\n                pBss = (PNDIS_WLAN_BSSID_EX) pPtr;\n                NdisMoveMemory(&pBss->MacAddress, &pAd->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);\n                if ((pAd->ScanTab.BssEntry[i].Hidden == 1) && (pAd->StaCfg.bShowHiddenSSID == FALSE))\n                {\n                    /* */\n\t\t\t\t\t/* We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation */\n\t\t\t\t\t/* and then failed to send EAPOl farame. */\n\t\t\t\t\t/* */\n\t\t\t\t\tif ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAd->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED))\n\t\t\t\t\t{\n\t\t\t\t\t\tpBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;\n\t\t\t\t\t\tNdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);\n\t\t\t\t\t}\n\t\t\t\t\telse\n                    \tpBss->Ssid.SsidLength = 0;\n                }\n                else\n                {\n                    pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;\n                    NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);\n                }\n                pBss->Privacy = pAd->ScanTab.BssEntry[i].Privacy;\n                pBss->Rssi = pAd->ScanTab.BssEntry[i].Rssi - pAd->BbpRssiToDbmDelta;\n\t\t\t\tpBss->MinSNR = pAd->ScanTab.BssEntry[i].MinSNR;\n                pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAd->ScanTab.BssEntry[i]);\n                pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);\n                pBss->Configuration.BeaconPeriod = pAd->ScanTab.BssEntry[i].BeaconPeriod;  \n                pBss->Configuration.ATIMWindow = pAd->ScanTab.BssEntry[i].AtimWin;\n\t\t\t\t/*NdisMoveMemory(&pBss->QBssLoad, &pAd->ScanTab.BssEntry[i].QbssLoad, sizeof(QBSS_LOAD_UI)); */\n\n                MAP_CHANNEL_ID_TO_KHZ(pAd->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);\n\n                if (pAd->ScanTab.BssEntry[i].BssType == BSS_INFRA) \n                    pBss->InfrastructureMode = Ndis802_11Infrastructure;\n                else\n                    pBss->InfrastructureMode = Ndis802_11IBSS;\n\n                NdisMoveMemory(pBss->SupportedRates, pAd->ScanTab.BssEntry[i].SupRate, pAd->ScanTab.BssEntry[i].SupRateLen);\n                NdisMoveMemory(pBss->SupportedRates + pAd->ScanTab.BssEntry[i].SupRateLen,\n                               pAd->ScanTab.BssEntry[i].ExtRate,\n                               pAd->ScanTab.BssEntry[i].ExtRateLen);\n\n                if (pAd->ScanTab.BssEntry[i].VarIELen == 0)\n                {\n                    pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);\n                    NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));\n                    pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);\n                }\n                else\n                {\n                    pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen);\n                    pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);\n                    NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));\n                    NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAd->ScanTab.BssEntry[i].VarIEs, pAd->ScanTab.BssEntry[i].VarIELen);\n                    pPtr += pAd->ScanTab.BssEntry[i].VarIELen;\n                }\n                pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);\n\n\t\t\t\tif (RtmpOsWirelessExtVerGet() < 17)\n\t\t\t\t{\n\t                if ((BssLen + pBss->Length) < wrq->u.data.length)\n\t\t\t\t\t\tBssLen += pBss->Length;\n\t                else\n\t                {\n\t                    pBssidList->NumberOfItems = i;\n\t                    break;\n\t                }\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tBssLen += pBss->Length;\n\n            }\n\n\t\t\tif (RtmpOsWirelessExtVerGet() < 17)\n\t\t\t\twrq->u.data.length = BssLen;\n\t\t\telse\n\t\t\t{\n\t            if (BssLen > wrq->u.data.length)\n\t            {\n/*                kfree(pBssidList); */\n\t\t\t\t\tos_free_mem(NULL, pBssidList);\n\t                return -E2BIG;\n\t            }\n\t            else\n\t                wrq->u.data.length = BssLen;\n\t\t\t}\n\n            Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen);\n/*            kfree(pBssidList); */\n\t\t\tos_free_mem(NULL, pBssidList);\n            break;\n        case OID_802_3_CURRENT_ADDRESS:\n            wrq->u.data.length = MAC_ADDR_LEN;\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);\n            break;\n        case OID_GEN_MEDIA_CONNECT_STATUS:\n            if (pAd->IndicateMediaState == NdisMediaStateConnected)\n                MediaState = NdisMediaStateConnected;\n            else\n                MediaState = NdisMediaStateDisconnected;\n                \n            wrq->u.data.length = sizeof(NDIS_MEDIA_STATE);\n            Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);\n            break;   \n        case OID_802_11_BSSID:\n            if (INFRA_ON(pAd) || ADHOC_ON(pAd))\n            {\n                Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS));\n\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_BSSID(=EMPTY)\\n\"));\n                Status = -ENOTCONN;\n            }\n            break;\n        case OID_802_11_SSID:\n\t\t\tNdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));\n\t\t\tNdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);\n            Ssid.SsidLength = pAd->CommonCfg.SsidLen;\n\t\t\tmemcpy(Ssid.Ssid, pAd->CommonCfg.Ssid,\tSsid.SsidLength);\n            wrq->u.data.length = sizeof(NDIS_802_11_SSID);\n            Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_SSID (Len=%d, ssid=%s)\\n\", Ssid.SsidLength,Ssid.Ssid));\n            break;\n        case RT_OID_802_11_QUERY_LINK_STATUS:\n/*            pLinkStatus = (RT_802_11_LINK_STATUS *) kmalloc(sizeof(RT_802_11_LINK_STATUS), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pLinkStatus, sizeof(RT_802_11_LINK_STATUS));\n            if (pLinkStatus)\n            {\n                pLinkStatus->CurrTxRate = RateIdTo500Kbps[pAd->CommonCfg.TxRate];   /* unit : 500 kbps */\n                pLinkStatus->ChannelQuality = pAd->Mlme.ChannelQuality;\n                pLinkStatus->RxByteCount = pAd->RalinkCounters.ReceivedByteCount;\n                pLinkStatus->TxByteCount = pAd->RalinkCounters.TransmittedByteCount;\n        \t\tpLinkStatus->CentralChannel = pAd->CommonCfg.CentralChannel;\n                wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS);\n                Status = copy_to_user(wrq->u.data.pointer, pLinkStatus, wrq->u.data.length);\n/*                kfree(pLinkStatus); */\n\t\t\t\tos_free_mem(NULL, pLinkStatus);\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_LINK_STATUS\\n\"));\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_LINK_STATUS(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n        case OID_802_11_CONFIGURATION:\n/*            pConfiguration = (NDIS_802_11_CONFIGURATION *) kmalloc(sizeof(NDIS_802_11_CONFIGURATION), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pConfiguration, sizeof(NDIS_802_11_CONFIGURATION));\n            if (pConfiguration)\n            {\n                pConfiguration->Length = sizeof(NDIS_802_11_CONFIGURATION);\n                pConfiguration->BeaconPeriod = pAd->CommonCfg.BeaconPeriod;\n                pConfiguration->ATIMWindow = pAd->StaActive.AtimWin;\n                MAP_CHANNEL_ID_TO_KHZ(pAd->CommonCfg.Channel, pConfiguration->DSConfig);\n                wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION);\n                Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length);\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \\n\", \n                                        pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAd->CommonCfg.Channel));\n/*\t\t\t\tkfree(pConfiguration); */\n\t\t\t\tos_free_mem(NULL, pConfiguration);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_CONFIGURATION(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n\t\tcase RT_OID_802_11_SNR_0:\n\t\t\tif ((pAd->StaCfg.LastSNR0 > 0))\n\t\t\t{\n\t\t\t\tulInfo = ConvertToSnr(pAd, pAd->StaCfg.LastSNR0);\n\t\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_SNR_0(0x=%lx)\\n\", ulInfo));\n\t\t\t}\n            else\n\t\t\t    Status = -EFAULT;\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_SNR_1:\n\t\t\tif ((pAd->Antenna.field.RxPath\t> 1) && \n                (pAd->StaCfg.LastSNR1 > 0))\n\t\t\t{\n\t\t\t\tulInfo = ConvertToSnr(pAd, pAd->StaCfg.LastSNR1);\n\t\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Query::RT_OID_802_11_SNR_1(0x=%lx)\\n\",ulInfo));\n\t\t\t}\n\t\t\telse\n\t\t\t\tStatus = -EFAULT;\n            DBGPRINT(RT_DEBUG_TRACE,(\"Query::RT_OID_802_11_SNR_1(pAd->StaCfg.LastSNR1=%d)\\n\",pAd->StaCfg.LastSNR1));\n\t\t\tbreak;\n\n#ifdef DOT11N_SS3_SUPPORT\n\t\tcase RT_OID_802_11_SNR_2:\n\t\t\tif ((pAd->Antenna.field.RxPath\t> 2) && \n                (pAd->StaCfg.LastSNR2 > 0))\n\t\t\t{\n\t\t\t\tulInfo = ConvertToSnr(pAd, pAd->StaCfg.LastSNR2);\n\t\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"Query::RT_OID_802_11_SNR_2(0x=%lx)\\n\",ulInfo));\n\t\t\t}\n\t\t\telse\n\t\t\t\tStatus = -EFAULT;\n            DBGPRINT(RT_DEBUG_TRACE,(\"Query::RT_OID_802_11_SNR_2(pAd->StaCfg.LastSNR2=%d)\\n\",pAd->StaCfg.LastSNR2));\n\t\t\tbreak;\n#endif /* DOT11N_SS3_SUPPORT */\n\n\n        case OID_802_11_RSSI_TRIGGER:\n            ulInfo = pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta;\n            wrq->u.data.length = sizeof(ulInfo);\n            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_RSSI_TRIGGER(=%ld)\\n\", ulInfo));\n            break;\n\t\tcase OID_802_11_RSSI:\n        case RT_OID_802_11_RSSI:\n\t\t\tulInfo = pAd->StaCfg.RssiSample.LastRssi0;\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_RSSI_1:\n            ulInfo = pAd->StaCfg.RssiSample.LastRssi1;\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\tbreak;\n        case RT_OID_802_11_RSSI_2:\n            ulInfo = pAd->StaCfg.RssiSample.LastRssi2;\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\tbreak;\n        case OID_802_11_STATISTICS:\n/*            pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pStatistics, sizeof(NDIS_802_11_STATISTICS));\n            if (pStatistics)\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_STATISTICS \\n\"));\n                /* add the most up-to-date h/w raw counters into software counters */\n\t\t\t    NICUpdateRawCounters(pAd);\n                \n                /* Sanity check for calculation of sucessful count */\n                if (pAd->WlanCounters.TransmittedFragmentCount.QuadPart < pAd->WlanCounters.RetryCount.QuadPart)\n                    pAd->WlanCounters.TransmittedFragmentCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;\n\n\t\tpStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;;\n                pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;\n                pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart;\n                pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;\n                pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart;\n                pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart;\n                pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart;\n                pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart;\n                pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart;\n                pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;\n                pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;\n#ifdef DBG\t\n                pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount;\n#else\n                pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart;\n                pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100;\n#endif\n\t\t\tpStatistics->TransmittedFrameCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;\n\t\t\tpStatistics->WEPUndecryptableCount.QuadPart = pAd->WlanCounters.WEPUndecryptableCount.QuadPart;\n                wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);\n                Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);\n/*                kfree(pStatistics); */\n\t\t\t\tos_free_mem(NULL, pStatistics);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_STATISTICS(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n\n#ifdef TXBF_SUPPORT\n\tcase RT_OID_802_11_QUERY_TXBF_TABLE:\n\t\tif (pAd->chipCap.FlgHwTxBfCap)\n\t\t{\n\t\t\tINT i;\n\t\t\tRT_802_11_TXBF_TABLE *pMacTab;\n\n\t\t\tpMacTab = (RT_802_11_TXBF_TABLE *)kmalloc(sizeof(RT_802_11_TXBF_TABLE), MEM_ALLOC_FLAG);\n\t\t\tif (pMacTab)\n\t\t\t{\n\t\t\t\tpMacTab->Num = 0;\n\t\t\t\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t\t{\n\t\t\t\t\tif (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC))\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(&pMacTab->Entry[pMacTab->Num], &pAd->MacTab.Content[i].TxBFCounters, sizeof(RT_COUNTER_TXBF));\n\t\t\t\t\t\tpMacTab->Num++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twrq->u.data.length = sizeof(RT_802_11_TXBF_TABLE);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pMacTab, wrq->u.data.length);\n\t\t\t\tkfree(pMacTab);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tStatus = -EFAULT;\n\t\t\n\t\tbreak;\n#endif /* TXBF_SUPPORT */\n\n        case OID_GEN_RCV_OK:\n            ulInfo = pAd->Counters8023.GoodReceives;\n            wrq->u.data.length = sizeof(ulInfo);\n            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n            break;\n        case OID_GEN_RCV_NO_BUFFER:\n            ulInfo = pAd->Counters8023.RxNoBuffer;\n            wrq->u.data.length = sizeof(ulInfo);\n            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n            break;\n        case RT_OID_802_11_PHY_MODE:\n            ulInfo = (ULONG)pAd->CommonCfg.PhyMode;\n            wrq->u.data.length = sizeof(ulInfo);\n            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PHY_MODE (=%ld)\\n\", ulInfo));\n            break;\n        case RT_OID_802_11_STA_CONFIG:\n/*            pStaConfig = (RT_802_11_STA_CONFIG *) kmalloc(sizeof(RT_802_11_STA_CONFIG), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pStaConfig, sizeof(RT_802_11_STA_CONFIG));\n            if (pStaConfig)\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_STA_CONFIG\\n\"));\n                pStaConfig->EnableTxBurst = pAd->CommonCfg.bEnableTxBurst;\n                pStaConfig->EnableTurboRate = 0;\n                pStaConfig->UseBGProtection = pAd->CommonCfg.UseBGProtection;\n                pStaConfig->UseShortSlotTime = pAd->CommonCfg.bUseShortSlotTime;\n                /*pStaConfig->AdhocMode = pAd->StaCfg.AdhocMode; */\n                pStaConfig->HwRadioStatus = (pAd->StaCfg.bHwRadio == TRUE) ? 1 : 0;\n                pStaConfig->Rsv1 = 0;\n                pStaConfig->SystemErrorBitmap = pAd->SystemErrorBitmap;\n                wrq->u.data.length = sizeof(RT_802_11_STA_CONFIG);\n                Status = copy_to_user(wrq->u.data.pointer, pStaConfig, wrq->u.data.length);\n/*                kfree(pStaConfig); */\n\t\t\t\tos_free_mem(NULL, pStaConfig);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n        case OID_802_11_RTS_THRESHOLD:\n            RtsThresh = pAd->CommonCfg.RtsThreshold;\n            wrq->u.data.length = sizeof(RtsThresh);\n            Status = copy_to_user(wrq->u.data.pointer, &RtsThresh, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_RTS_THRESHOLD(=%ld)\\n\", RtsThresh));\n            break;\n        case OID_802_11_FRAGMENTATION_THRESHOLD:\n            FragThresh = pAd->CommonCfg.FragmentThreshold;\n            if (pAd->CommonCfg.bUseZeroToDisableFragment == TRUE)\n                FragThresh = 0;\n            wrq->u.data.length = sizeof(FragThresh);\n            Status = copy_to_user(wrq->u.data.pointer, &FragThresh, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_FRAGMENTATION_THRESHOLD(=%ld)\\n\", FragThresh));\n            break;\n        case OID_802_11_POWER_MODE:\n            PowerMode = pAd->StaCfg.WindowsPowerMode;\n            wrq->u.data.length = sizeof(PowerMode);\n            Status = copy_to_user(wrq->u.data.pointer, &PowerMode, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_POWER_MODE(=%d)\\n\", PowerMode));\n            break;\n        case RT_OID_802_11_RADIO:\n            RadioState = (BOOLEAN) pAd->StaCfg.bSwRadio;\n            wrq->u.data.length = sizeof(RadioState);\n            Status = copy_to_user(wrq->u.data.pointer, &RadioState, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_RADIO (=%d)\\n\", RadioState));\n            break;\n        case OID_802_11_INFRASTRUCTURE_MODE:\n            if (pAd->StaCfg.BssType == BSS_ADHOC)\n                BssType = Ndis802_11IBSS;\n            else if (pAd->StaCfg.BssType == BSS_INFRA)\n                BssType = Ndis802_11Infrastructure;\n            else if (pAd->StaCfg.BssType == BSS_MONITOR)\n                BssType = Ndis802_11Monitor;\n            else\n                BssType = Ndis802_11AutoUnknown;\n\n            wrq->u.data.length = sizeof(BssType);\n            Status = copy_to_user(wrq->u.data.pointer, &BssType, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_INFRASTRUCTURE_MODE(=%d)\\n\", BssType));\n            break;\n        case RT_OID_802_11_PREAMBLE:\n            PreamType = pAd->CommonCfg.TxPreamble;\n            wrq->u.data.length = sizeof(PreamType);\n            Status = copy_to_user(wrq->u.data.pointer, &PreamType, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PREAMBLE(=%d)\\n\", PreamType));\n            break;\n        case OID_802_11_AUTHENTICATION_MODE:\n            AuthMode = pAd->StaCfg.AuthMode;\n            wrq->u.data.length = sizeof(AuthMode);\n            Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_AUTHENTICATION_MODE(=%d)\\n\", AuthMode));\n            break;\n        case OID_802_11_WEP_STATUS:\n            WepStatus = pAd->StaCfg.WepStatus;\n            wrq->u.data.length = sizeof(WepStatus);\n            Status = copy_to_user(wrq->u.data.pointer, &WepStatus, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WEP_STATUS(=%d)\\n\", WepStatus));\n            break;\n        case OID_802_11_TX_POWER_LEVEL:\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPower, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_TX_POWER_LEVEL %x\\n\",pAd->CommonCfg.TxPower));\n\t\t\tbreak;\n        case RT_OID_802_11_TX_POWER_LEVEL_1:\n            wrq->u.data.length = sizeof(ULONG);\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPowerPercentage, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\\n\", pAd->CommonCfg.TxPowerPercentage));\n\t\t\tbreak;\n        case OID_802_11_NETWORK_TYPES_SUPPORTED:\n\t\t\tif ((pAd->RfIcType == RFIC_2850) ||\n\t\t\t\t(pAd->RfIcType == RFIC_2750) ||\n\t\t\t\t(pAd->RfIcType == RFIC_3052) ||\n\t\t\t\t(pAd->RfIcType == RFIC_3053) || \n\t\t\t\t(pAd->RfIcType == RFIC_2853) || \n\t\t\t\t(pAd->RfIcType == RFIC_3853) ||\n\t\t\t\t(pAd->RfIcType == RFIC_5592))\n\t\t\t{\n\t\t\t\tNetworkTypeList[0] = 3;                 /* NumberOfItems = 3 */\n\t\t\t\tNetworkTypeList[1] = Ndis802_11DS;      /* NetworkType[1] = 11b */\n\t\t\t\tNetworkTypeList[2] = Ndis802_11OFDM24;  /* NetworkType[2] = 11g */\n\t\t\t\tNetworkTypeList[3] = Ndis802_11OFDM5;   /* NetworkType[3] = 11a */\n                wrq->u.data.length = 16;\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNetworkTypeList[0] = 2;                 /* NumberOfItems = 2 */\n\t\t\t\tNetworkTypeList[1] = Ndis802_11DS;      /* NetworkType[1] = 11b */\n\t\t\t\tNetworkTypeList[2] = Ndis802_11OFDM24;  /* NetworkType[2] = 11g */\n\t\t\t    wrq->u.data.length = 12;\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_NETWORK_TYPES_SUPPORTED\\n\"));\n\t\t\t\tbreak;\n\t    case OID_802_11_NETWORK_TYPE_IN_USE:\n            wrq->u.data.length = sizeof(ULONG);\n\t\t\tif (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_A))\n\t\t\t\tulInfo = Ndis802_11OFDM5;\n\t\t\telse if (WMODE_EQUAL(pAd->CommonCfg.PhyMode, (WMODE_G | WMODE_B)) ||\n\t\t\t\t\tWMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_G))\n\t\t\t\tulInfo = Ndis802_11OFDM24;\n\t\t\telse\n\t\t\t\tulInfo = Ndis802_11DS;\n            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n        \tcase RT_OID_802_11_QUERY_LAST_RX_RATE:\n            \t\tulInfo = (ULONG)pAd->LastRxRate;\n            \t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\\n\", ulInfo));\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_QUERY_LAST_TX_RATE:\n\t\t\tulInfo = (ULONG)pAd->LastTxRate;\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%lx)\\n\", ulInfo));\n\t\t\tbreak;\n        \t\tcase RT_OID_802_11_QUERY_MAP_REAL_RX_RATE:\n\t\t\tRateValue=0;\n\t\t\tHTPhyMode.word =(USHORT) pAd->LastRxRate;\n\t\t\tgetRate(HTPhyMode, &RateValue);\n\t\t\twrq->u.data.length = sizeof(RateValue);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &RateValue, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\\n\", RateValue));\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_QUERY_MAP_REAL_TX_RATE:\n\t\t\tRateValue=0;\n\t\t\tHTPhyMode.word = (USHORT)pAd->LastTxRate;\n\t\t\tgetRate(HTPhyMode, &RateValue);\n\t\t\twrq->u.data.length = sizeof(RateValue);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &RateValue, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%ld)\\n\", RateValue));\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_QUERY_TX_PHYMODE:\n\t\t\tulInfo = (ULONG)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word;\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo,\twrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_TX_PHYMODE (=%lx)\\n\", ulInfo));\n\t\t\tbreak;\n        case RT_OID_802_11_QUERY_EEPROM_VERSION:\n            wrq->u.data.length = sizeof(ULONG);\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->EepromVersion, wrq->u.data.length);\n            break;\n        case RT_OID_802_11_QUERY_FIRMWARE_VERSION:\n            wrq->u.data.length = sizeof(ULONG);\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->FirmwareVersion, wrq->u.data.length);\n\t\t\tbreak;\n\t    case RT_OID_802_11_QUERY_NOISE_LEVEL:\n\t\t\t{\n\t\t\tUCHAR noise = RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi1,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgRssi2) - \n\t\t\t\t\t\t\t\t\t\tRTMPMinSnr(pAd, pAd->StaCfg.RssiSample.AvgSnr0, \n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.RssiSample.AvgSnr1);\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &noise, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_NOISE_LEVEL (=%d)\\n\", noise));\n\t\t\t}\n\t\t\tbreak;\n\t    case RT_OID_802_11_EXTRA_INFO:\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->ExtraInfo, wrq->u.data.length);\n\t        DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_EXTRA_INFO (=%ld)\\n\", pAd->ExtraInfo));\n\t        break;\n\t    case RT_OID_WE_VERSION_COMPILED:\n\t        wrq->u.data.length = sizeof(UINT);\n\t        we_version_compiled = RtmpOsWirelessExtVerGet();\n\t        Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);\n\t        break;\n\t\tcase RT_OID_802_11_QUERY_APSD_SETTING:\n\t\t\tapsd = (pAd->StaCfg.UapsdInfo.bAPSDCapable | (pAd->CommonCfg.bAPSDAC_BE << 1) | (pAd->CommonCfg.bAPSDAC_BK << 2)\n\t\t\t\t| (pAd->CommonCfg.bAPSDAC_VI << 3)\t| (pAd->CommonCfg.bAPSDAC_VO << 4)\t| (pAd->CommonCfg.MaxSPLength << 5));\n\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &apsd, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_APSD_SETTING (=0x%lx,APSDCap=%d,AC_BE=%d,AC_BK=%d,AC_VI=%d,AC_VO=%d,MAXSPLen=%d)\\n\", \n\t\t\t\tapsd,pAd->StaCfg.UapsdInfo.bAPSDCapable,pAd->CommonCfg.bAPSDAC_BE,pAd->CommonCfg.bAPSDAC_BK,pAd->CommonCfg.bAPSDAC_VI,pAd->CommonCfg.bAPSDAC_VO,pAd->CommonCfg.MaxSPLength));\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_QUERY_APSD_PSM:\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_APSD_PSM (=%d)\\n\", pAd->CommonCfg.bAPSDForcePowerSave));\t\t\t\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_QUERY_WMM:\n\t\t\twrq->u.data.length = sizeof(BOOLEAN);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bWmmCapable, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_WMM (=%d)\\n\",\tpAd->CommonCfg.bWmmCapable));\n\t\t\tbreak;\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n        case RT_OID_NEW_DRIVER:\n            {\n                UCHAR enabled = 1;\n    \t        wrq->u.data.length = sizeof(UCHAR);\n    \t        Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length);\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_NEW_DRIVER (=%d)\\n\", enabled));\n            }\n\t        break;\n        case RT_OID_WPA_SUPPLICANT_SUPPORT:\n\t        wrq->u.data.length = sizeof(UCHAR);\n\t        Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.WpaSupplicantUP, wrq->u.data.length);\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\\n\", pAd->StaCfg.WpaSupplicantUP));\n\t        break;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t\tcase RT_OID_WSC_QUERY_STATUS:\n\t\t\twrq->u.data.length = sizeof(INT);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.WscControl.WscStatus, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_QUERY_STATUS (=%d)\\n\", pAd->StaCfg.WscControl.WscStatus));\n\t\t\tbreak;\n\n\t\tcase RT_OID_WSC_PIN_CODE:\n\t\t\twrq->u.data.length = sizeof(UINT);\n\t\t\tWscPinCode = pAd->StaCfg.WscControl.WscEnrolleePinCode;\n\t\t\t\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_PIN_CODE (=%d)\\n\", WscPinCode));\n\t\t\tbreak;\n\n        case RT_OID_WSC_QUERY_DEFAULT_PROFILE:\n\t\t\twrq->u.data.length = sizeof(WSC_PROFILE);\n/*\t\t\tpProfile = kmalloc(sizeof(WSC_PROFILE), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pProfile, sizeof(WSC_PROFILE));\n\t\t\tif (pProfile == NULL)\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_WSC_QUERY_DEFAULT_PROFILE fail!\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tRTMPZeroMemory(pProfile, sizeof(WSC_PROFILE));\n            WscCreateProfileFromCfg(pAd, STA_MODE, &pAd->StaCfg.WscControl, pProfile);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pProfile, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WSC Profile:\\n\"));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SSID = %s\\n\", pProfile->Profile[0].SSID.Ssid));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AuthType = %s\\n\", WscGetAuthTypeStr(pProfile->Profile[0].AuthType)));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EncrpType = %s\\n\", WscGetEncryTypeStr(pProfile->Profile[0].EncrType)));\n\n\t\t\t\tif (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_WEP)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WEP Key = %s\\n\", pProfile->Profile[0].Key));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DefaultKey ID = %d\\n\", pProfile->Profile[0].KeyIndex));\n\t\t\t\t}\n\t\t\t\telse if ((pProfile->Profile[0].EncrType == WSC_ENCRTYPE_TKIP) || (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_AES))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PassPhrase Key = %s\\n\", pProfile->Profile[0].Key));\n                    pProfile->Profile[0].KeyIndex = 1;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\t\t\t}\n\n/*\t\t\tkfree(pProfile); */\n\t\t\tos_free_mem(NULL, pProfile);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_QUERY_DEFAULT_PROFILE \\n\"));\n\t\t\tbreak;\n\t\tcase RT_OID_802_11_WSC_QUERY_PROFILE:\n\t\t\twrq->u.data.length = sizeof(WSC_PROFILE);\n/*\t\t\tpProfile = kmalloc(sizeof(WSC_PROFILE), MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(pAd, (UCHAR **)&pProfile, sizeof(WSC_PROFILE));\n\t\t\tif (pProfile == NULL)\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RT_OID_802_11_WSC_QUERY_PROFILE fail!\\n\"));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tRTMPZeroMemory(pProfile, sizeof(WSC_PROFILE));\n\t\t\tNdisMoveMemory(pProfile, &pAd->StaCfg.WscControl.WscProfile, sizeof(WSC_PROFILE));\n            if ((pProfile->Profile[0].AuthType == WSC_AUTHTYPE_OPEN) && (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_NONE))\n            {\n                pProfile->Profile[0].KeyLength = 0;\n                NdisZeroMemory(pProfile->Profile[0].Key, 64);\n            }\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pProfile, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WSC Profile:\\n\"));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SSID = %s\\n\", pProfile->Profile[0].SSID.Ssid));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AuthType = %s\\n\", WscGetAuthTypeStr(pProfile->Profile[0].AuthType)));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"EncrpType = %s\\n\", WscGetEncryTypeStr(pProfile->Profile[0].EncrType)));\n\n\t\t\t\tif (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_WEP)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"WEP Key = %s\\n\", pProfile->Profile[0].Key));\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DefaultKey ID = %d\\n\", pProfile->Profile[0].KeyIndex));\n\t\t\t\t}\n\t\t\t\telse if ((pProfile->Profile[0].EncrType == WSC_ENCRTYPE_TKIP) || (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_AES))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PassPhrase Key = %s\\n\", pProfile->Profile[0].Key));\n                    pProfile->Profile[0].KeyIndex = 1;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"\\n\"));\n\t\t\t}\n\n/*\t\t\tkfree(pProfile); */\n\t\t\tos_free_mem(NULL, pProfile);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WSC_QUERY_PROFILE \\n\"));\n\t\t\tbreak;\n\t\t\t\n\t\tcase RT_OID_WSC_UUID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_QUERY_UUID \\n\"));\n\t\t\twrq->u.data.length = UUID_LEN_STR;\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.WscControl.Wsc_Uuid_Str[0], UUID_LEN_STR))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RT_OID_WSC_MAC_ADDRESS:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_MAC_ADDRESS \\n\"));\n\t\t\twrq->u.data.length = MAC_ADDR_LEN;\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pAd->CurrentAddress, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tbreak;\n#endif /* WSC_STA_SUPPORT */\n        case RT_OID_DRIVER_DEVICE_NAME:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_DRIVER_DEVICE_NAME \\n\"));\n\t\t\twrq->u.data.length = 16;\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pAd->StaCfg.dev_name, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n            break;\n        case RT_OID_802_11_QUERY_HT_PHYMODE:\n\t\tos_alloc_mem(pAd, (UCHAR **)&pHTPhyMode, sizeof(OID_SET_HT_PHYMODE));\n\t\tif (pHTPhyMode)\n\t\t{           \n\t\t\tpHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode;\n\t\t\tpHTPhyMode->HtMode = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE;\n\t\t\tpHTPhyMode->BW = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW;\n\t\t\tpHTPhyMode->MCS= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS;\n\t\t\tpHTPhyMode->SHORTGI= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI;\n\t\t\tpHTPhyMode->STBC= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC;\n\n\t\t\tpHTPhyMode->ExtOffset = ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) ? (EXTCHA_BELOW) : (EXTCHA_ABOVE));\n\t\t\twrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))\n\t\t\t\tStatus = -EFAULT;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\\n\",\n\t\t\t\tpHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\" %s(): (.word = %x )\\n\",\n\t\t\t\t\t__FUNCTION__, pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word));\n\t\t\tos_free_mem(NULL, pHTPhyMode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\\n\"));\n\t\t\tStatus = -EFAULT;\n\t\t}\n\t\tbreak;\n        case RT_OID_802_11_COUNTRY_REGION:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_COUNTRY_REGION \\n\"));\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n            ulInfo = pAd->CommonCfg.CountryRegionForABand;\n            ulInfo = (ulInfo << 8)|(pAd->CommonCfg.CountryRegion);\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length))\n            {\n\t\t\t\tStatus = -EFAULT;\n            }\n            break;\n        case RT_OID_802_11_QUERY_DAT_HT_PHYMODE:\n\t\tos_alloc_mem(pAd, (UCHAR **)&pHTPhyMode, sizeof(OID_SET_HT_PHYMODE));\n            if (pHTPhyMode)\n            {           \n                pHTPhyMode->PhyMode = wmode_2_cfgmode(pAd->CommonCfg.PhyMode);\n    \t\t\tpHTPhyMode->HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;\n    \t\t\tpHTPhyMode->BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;\n    \t\t\tpHTPhyMode->MCS= (UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.MCS;\n    \t\t\tpHTPhyMode->SHORTGI= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;\n    \t\t\tpHTPhyMode->STBC= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;\n    \t\n                wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);\n                if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))\n    \t\t\t\tStatus = -EFAULT;\n    \t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\\n\",\n    \t\t\t\tpHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));\n    \t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): (.word = %x )\\n\",\n\t\t\t\t\t\t__FUNCTION__, pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word));\n\t\t\tos_free_mem(NULL, pHTPhyMode);\n            }\n            else\n            {\n                DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\\n\"));\n                Status = -EFAULT;\n            }\n            break;\n        case RT_OID_QUERY_MULTIPLE_CARD_SUPPORT:            \n\t\t\twrq->u.data.length = sizeof(UCHAR);\n            i = 0;\n#ifdef MULTIPLE_CARD_SUPPORT\n            i = 1;\n#endif /* MULTIPLE_CARD_SUPPORT */\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &i, wrq->u.data.length))\n            {\n\t\t\t\tStatus = -EFAULT;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_QUERY_MULTIPLE_CARD_SUPPORT(=%d) \\n\", i));\n            break;\n#ifdef SNMP_SUPPORT\n\t\tcase RT_OID_802_11_MAC_ADDRESS:\n            wrq->u.data.length = MAC_ADDR_LEN;\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTUREROUI:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTUREROUI \\n\"));\n\t\t\twrq->u.data.length = ManufacturerOUI_LEN;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTURERNAME:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTURERNAME \\n\"));\n\t\t\twrq->u.data.length = strlen(ManufacturerNAME);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_RESOURCETYPEIDNAME:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_RESOURCETYPEIDNAME \\n\"));\n\t\t\twrq->u.data.length = strlen(ResourceTypeIdName);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \\n\"));\n\t\t\tulInfo = 1; /* 1 is support wep else 2 is not support. */\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_POWERMANAGEMENTMODE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_POWERMANAGEMENTMODE \\n\"));\n\t\t\tif (pAd->StaCfg.Psm == PSMP_ACTION)\n\t\t\t\tulInfo = 1; /* 1 is power active else 2 is power save. */\n\t\t\telse\n\t\t\t\tulInfo = 2;\n\t\t\t\n\t\t\twrq->u.data.length = sizeof(ulInfo);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYVALUE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WEPDEFAULTKEYVALUE \\n\"));\n\t\t\tpKeyIdxValue = wrq->u.data.pointer;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"KeyIdxValue.KeyIdx = %d, \\n\",pKeyIdxValue->KeyIdx));\n\t\t\tvalueLen = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen;\n\t\t\tNdisMoveMemory(pKeyIdxValue->Value,\n\t\t\t\t\t\t   &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key,\n\t\t\t\t\t\t   valueLen);\n\t\t\tpKeyIdxValue->Value[valueLen]='\\0';\n\n\t\t\twrq->u.data.length = sizeof(DefaultKeyIdxValue);\n\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \\n\", \n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.DefaultKeyId, \n\t\t\t\t\t\t\t\t\t\twrq->u.data.length, \n\t\t\t\t\t\t\t\t\t\tpAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen,\n\t\t\t\t\t\t\t\t\t\tpAd->SharedKey[BSS0][0].Key[0],\n\t\t\t\t\t\t\t\t\t\tpAd->SharedKey[BSS0][1].Key[0],\n\t\t\t\t\t\t\t\t\t\tpAd->SharedKey[BSS0][2].Key[0],\n\t\t\t\t\t\t\t\t\t\tpAd->SharedKey[BSS0][3].Key[0]));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_WEPDEFAULTKEYID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WEPDEFAULTKEYID \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.DefaultKeyId, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"DefaultKeyId =%d \\n\", pAd->StaCfg.DefaultKeyId));\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_WEPKEYMAPPINGLENGTH:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer,\n\t\t\t\t\t\t\t\t\t&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen,\n\t\t\t\t\t\t\t\t\twrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_SHORTRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_SHORTRETRYLIMIT \\n\"));\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\tShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ShortRetryLimit =%ld,  tx_rty_cfg.field.ShortRetryLimit=%d\\n\", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_LONGRETRYLIMIT:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_LONGRETRYLIMIT \\n\"));\n\t\t\twrq->u.data.length = sizeof(ULONG);\n\t\t\tRTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);\n\t\t\tLongRetryLimit = tx_rty_cfg.field.LongRtyLimit;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"LongRetryLimit =%ld,  tx_rty_cfg.field.LongRtyLimit=%d\\n\", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);\n\t\t\tbreak;\n\t\t\t\n\t\tcase RT_OID_802_11_PRODUCTID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_PRODUCTID \\n\"));\n\t\t\n#ifdef RTMP_MAC_USB\n\t\t\tsnprintf((PSTRING)tmp, sizeof(tmp), \"%04x %04x\\n\", \n\t\t\t\t\t\tRtmpOsGetUsbDevVendorID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev),\n\t\t\t\t\t\tRtmpOsGetUsbDevProductID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev));\n\n#endif /* RTMP_MAC_USB */\n\t\t\twrq->u.data.length = strlen((PSTRING)tmp);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmp, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_MANUFACTUREID:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_MANUFACTUREID \\n\"));\n\t\t\twrq->u.data.length = strlen(ManufacturerNAME);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);\n\t\t\tbreak;\n\n\t\tcase OID_802_11_CURRENTCHANNEL:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_CURRENTCHANNEL \\n\"));\n\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"sizeof UCHAR=%d, channel=%d \\n\", sizeof(UCHAR), pAd->CommonCfg.Channel));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\t\t\tbreak;\n#endif /*SNMP_SUPPORT */\n\t\t\n\t\tcase OID_802_11_BUILD_CHANNEL_EX:\n\t\t\t{\n\t\t\t\tUCHAR value;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_BUILD_CHANNEL_EX \\n\"));\n\t\t\t\twrq->u.data.length = sizeof(UCHAR);\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Support EXT_BUILD_CHANNEL_LIST.\\n\"));\n\t\t\t\tvalue = 1;\n#else\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Doesn't support EXT_BUILD_CHANNEL_LIST.\\n\"));\n\t\t\t\tvalue = 0;\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &value, 1);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_GET_CH_LIST:\n\t\t\t{\n\t\t\t\tPRT_CHANNEL_LIST_INFO pChListBuf;\n\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_GET_CH_LIST \\n\"));\n\t\t\t\tif (pAd->ChannelListNum == 0)\n\t\t\t\t{\n\t\t\t\t\twrq->u.data.length = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n/*\t\t\t\tpChListBuf = (RT_CHANNEL_LIST_INFO *) kmalloc(sizeof(RT_CHANNEL_LIST_INFO), MEM_ALLOC_FLAG); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pChListBuf, sizeof(RT_CHANNEL_LIST_INFO));\n\t\t\t\tif (pChListBuf == NULL)\n\t\t\t\t{\n\t\t\t\t\twrq->u.data.length = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpChListBuf->ChannelListNum = pAd->ChannelListNum;\n\t\t\t\tfor (i = 0; i < pChListBuf->ChannelListNum; i++)\n\t\t\t\t\tpChListBuf->ChannelList[i] = pAd->ChannelList[i].Channel;\n\n\t\t\t\twrq->u.data.length = sizeof(RT_CHANNEL_LIST_INFO);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pChListBuf, sizeof(RT_CHANNEL_LIST_INFO));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\n\t\t\t\tif (pChListBuf)\n/*\t\t\t\t\tkfree(pChListBuf); */\n\t\t\t\t\tos_free_mem(NULL, pChListBuf);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase OID_802_11_GET_COUNTRY_CODE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_GET_COUNTRY_CODE \\n\"));\n\t\t\twrq->u.data.length = 2;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.CountryCode, 2);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\t\t\tbreak;\n\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t\tcase OID_802_11_GET_CHANNEL_GEOGRAPHY:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_GET_CHANNEL_GEOGRAPHY \\n\"));\n\t\t\twrq->u.data.length = 1;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Geography, 1);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Status=%d\\n\", Status));\n\t\t\tbreak;\t\t\t\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\n#ifdef P2P_SUPPORT\n\t\tcase OID_802_11_P2P_MODE:\t\t\t\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.Rule, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%d, Rule=%s)\\n\", sizeof(char),pAd->P2pCfg.Rule));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_DEVICE_NAME:\t\t\t\n\t\t\twrq->u.data.length = pAd->P2pCfg.DeviceNameLen;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.DeviceName, pAd->P2pCfg.DeviceNameLen);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_DEVICE_NAME (Len=%d, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_LISTEN_CHANNEL:\t\t\t\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.ListenChannel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_LISTEN_CHANNEL (Len=%d, Listen_Ch=%d)\\n\", sizeof(char),pAd->P2pCfg.ListenChannel));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_OPERATION_CHANNEL:\t\t\t\n\t\t\twrq->u.data.length = sizeof(char);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.GroupChannel, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_OPERATION_CHANNEL (Len=%d, Op_Ch=%d)\\n\", sizeof(char),pAd->P2pCfg.GroupOpChannel));\n\t\t\tbreak;\n\n\n\t\tcase OID_802_11_P2P_DEV_ADDR:\t\t\t\n\t\t\twrq->u.data.length = 6;\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.Bssid, wrq->u.data.length);\n\t\t\t/*DBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MAC_ADDR (Len=%d, Rule=%s)\\n\", sizeof(char),pAd->P2pCfg.GroupOpChannel)); */\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_CTRL_STATUS:\t\t\t\n\t\t\twrq->u.data.length = 24;\n\t\t\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tNdisZeroMemory(tmpP2P, 24);\n\t\t\tsprintf(tmpP2P, \"%s\",decodeCtrlState(pP2PCtrl->CtrlCurrentState));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmpP2P, 24);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%d, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_DISC_STATUS:\t\t\t\n\t\t\twrq->u.data.length = 24;\n\t\t\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tNdisZeroMemory(tmpP2P, 24);\n\t\t\tsprintf(tmpP2P, \"%s\",decodeDiscoveryState(pP2PCtrl->DiscCurrentState));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmpP2P, 24);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%d, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\n\t\tcase OID_802_11_P2P_GOFORM_STATUS:\t\t\t\n\t\t\twrq->u.data.length = 24;\n\t\t\tpP2PCtrl = &pAd->P2pCfg;\n\t\t\tNdisZeroMemory(tmpP2P, 24);\n\t\t\tsprintf(tmpP2P, \"%s\",decodeGroupFormationState(pP2PCtrl->GoFormCurrentState));\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, tmpP2P, 24);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_MODE (Len=%d, DeviceName=%s)\\n\", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));\n\t\t\tbreak;\n\t\t\t\n\t\tcase OID_802_11_P2P_SCAN_LIST:\t\t\t\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pUI_table, sizeof(RT_P2P_UI_TABLE));\n\t\t\tif (pUI_table)\n\t\t\t{\n\t\t\t\tpP2pTable = &pAd->P2pTable;\n\t\t\t\tNdisZeroMemory(pUI_table, sizeof(RT_P2P_UI_TABLE));\n\t\t\t\tpUI_table->ClientNumber = pAd->P2pTable.ClientNumber;\n\t\t\t\tfor (i=0; i < pAd->P2pTable.ClientNumber; i++)\n\t\t\t\t{\n\t\t\t\t\tpPAdCli = &pP2pTable->Client[i];\n\t\t\t\t\tpUICli = &pUI_table->Client[i];\n\t \t\t\t\tNdisMoveMemory(pUICli, pPAdCli, sizeof(RT_P2P_CLIENT_ENTRY));\n\t\t\t\t}\n\t\t\t\tprintk(\"Query::OID_802_11_P2P_SCAN_LIST\\n\");\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pUI_table, sizeof(RT_P2P_UI_TABLE));\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_P2P_SCAN_LIST (Len=%d, Rule=%s)\\n\", sizeof(char),pAd->P2pCfg.GroupOpChannel));\n\t\t\t\tos_free_mem(NULL, pUI_table);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tStatus = -ENOMEM;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase OID_P2P_WSC_PIN_CODE:\n\t\t\twrq->u.data.length = sizeof(UINT);\n\t\t\tWscPinCode = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode;\n\t\t\t\n\t\t\tif (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))\n\t\t\t{\n\t\t\t\tStatus = -EFAULT;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_WSC_PIN_CODE (=%d)\\n\", WscPinCode));\n\t\t\tbreak;\t\t\n#endif /* P2P_SUPPORT */\n\n\n#ifdef QOS_DLS_SUPPORT\n\t\tcase RT_OID_802_11_QUERY_DLS:\n\t\t\twrq->u.data.length = sizeof(BOOLEAN);\n\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bDLSCapable, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_DLS(=%d)\\n\", pAd->CommonCfg.bDLSCapable));\n\t\t\tbreak;\n\n\t\tcase RT_OID_802_11_QUERY_DLS_PARAM:\n\t\t\t{\n\t\t\t\tPRT_802_11_DLS_INFO\tpDlsInfo;/* = kmalloc(sizeof(RT_802_11_DLS_INFO), GFP_ATOMIC); */\n\t\t\t\tos_alloc_mem(pAd, (UCHAR **)&pDlsInfo, sizeof(RT_802_11_DLS_INFO));\n\t\t\t\tif (pDlsInfo == NULL)\n\t\t\t\t\tbreak;\n\n\t\t\t\tfor (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(&pDlsInfo->Entry[i], &pAd->StaCfg.DLSEntry[i], sizeof(RT_802_11_DLS_UI));\n\t\t\t\t}\n\n\t\t\t\tpDlsInfo->num = MAX_NUM_OF_DLS_ENTRY;\n\t\t\t\twrq->u.data.length = sizeof(RT_802_11_DLS_INFO);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, pDlsInfo, wrq->u.data.length);\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_802_11_QUERY_DLS_PARAM\\n\"));\n\n\t\t\t\tif (pDlsInfo)\n/*\t\t\t\t\tkfree(pDlsInfo); */\n\t\t\t\t\tos_free_mem(NULL, pDlsInfo);\n\t\t\t}\n\t\t\tbreak;\n#endif /* QOS_DLS_SUPPORT */\n#ifdef WAPI_SUPPORT\n\t\tcase OID_802_11_WAPI_CONFIGURATION:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::Get WAPI Configuration(%d)\\n\", sizeof(WAPI_CONF)));\n\t\t\tRTMPIoctlQueryWapiConf(pAd, wrq);\t\n\t\t\tbreak;\t\t\t\n\t\tcase OID_802_11_WAPI_IE:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_WAPI_IE\\n\"));\n\t\t\tif (wrq->u.data.length != sizeof(WAPI_WIE_STRUCT))\n                Status  = -EINVAL;\n            else\n            {                \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tWAPI_WIE_STRUCT   wapi_ie;\n\t\t\t\tMAC_TABLE_ENTRY\t\t*pEntry;\n\n\t\t\t\tNdisZeroMemory(&wapi_ie, sizeof(WAPI_WIE_STRUCT));\n\t\t\t\tNdisMoveMemory(wapi_ie.addr, wrq->u.data.pointer, MAC_ADDR_LEN);\n\n\t\t\t\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\t\t\t\t\n\t\t\t\tif ((NdisEqualMemory(pEntry->Addr, wapi_ie.addr, MAC_ADDR_LEN)) && \n\t\t\t\t\t(pEntry->RSNIE_Len > 0))\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\twapi_ie.wie_len = pEntry->RSNIE_Len;\n\t\t\t\t\tNdisMoveMemory(wapi_ie.wie, pEntry->RSN_IE, pEntry->RSNIE_Len);\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\tif (copy_to_user(wrq->u.data.pointer, &wapi_ie, wrq->u.data.length))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\n\t\t\t\t}\t\t\t\t\t\t\t\t\n            }\n\t\t\tbreak;\t\t\n#endif /* WAPI_SUPPORT */\n\n#ifdef XLINK_SUPPORT\n\t\tcase OID_802_11_SET_PSPXLINK_MODE:\n\t\t\twrq->u.data.length = sizeof(BOOLEAN);\n            Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.PSPXlink, wrq->u.data.length);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query::OID_802_11_SET_PSPXLINK_MODE(=%d)\\n\", pAd->StaCfg.PSPXlink));\n\t\t\tbreak;\n#endif /* XLINK_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n#ifdef WFD_SUPPORT\n\t\t/*\n\t\t * Query WFD TDLS connection status\n\t\t * Value:\n\t\t * \t0: TDLS connecting or no link\n\t\t * \t4: TDLS connected\n\t\t * \t6: Peer PC (Preferred Connectivity) bit of WFD device is P2P\n\t\t * \t7: TDLS weak security\n\t\t*/\n\t\tcase RT_OID_802_11_QUERY_WFD_TDLS_CONNECT_STATUS:\n\t\t\t{\n\t\t\t\tINT i;\n\t\t\t\tUCHAR bFound = CONNECTING_OR_NO_LINK;\n\n\t\t\t\tif (pAd->StaCfg.WfdCfg.PeerPC == WFD_PC_P2P)\n\t\t\t\t{\n\t\t\t\t\tbFound = WFD_PEER_PC_P2P;\n\t\t\t\t\tpAd->StaCfg.WfdCfg.PeerPC = WFD_PC_TDLS;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RT_OID_802_11_QUERY_WFD_TDLS_CONNECT_STATUS::Peer WFD PC is P2P!\\n\"));\n\t\t\t\t}\n\t\t\t\telse if (pAd->StaCfg.WfdCfg.TdlsSecurity == WFD_TDLS_WEAK_SECURITY)\n\t\t\t\t{\n\t\t\t\t\tbFound = WFD_PEER_TDLS_WEAK_SECURITY;\n\t\t\t\t\tpAd->StaCfg.WfdCfg.TdlsSecurity = WFD_TDLS_STRONG_SECURITY;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RT_OID_802_11_QUERY_WFD_TDLS_CONNECT_STATUS::TDLS weak security!\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (i=0; i<MAX_NUM_OF_TDLS_ENTRY; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status == TDLS_MODE_CONNECTED))\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (i == MAX_NUM_OF_TDLS_ENTRY)\n\t\t\t\t\t\tbFound = CONNECTING_OR_NO_LINK;\n\t\t\t\t\telse\n\t\t\t\t\t\tbFound = TDLS_LINKED;\n\t\t\t\t\tif (bFound == TDLS_LINKED)\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RT_OID_802_11_QUERY_WFD_TDLS_CONNECT_STATUS:: TDLS Connected!\\n\"));\n\t\t\t\t}\n\t\t\t\twrq->u.data.length = sizeof(UCHAR);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &bFound, wrq->u.data.length);\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\t\t/*\n\t\t\t * Query peer WFD TDLS IP address\n\t\t\t * \tField\t\t  | Size (octets)  | Value\t    | Description\n\t\t\t * \t---------------------------------------------------------------------------------------------\n\t\t\t * \tVersion\t  | 1\t\t\t | 1\t\t    | Version 1: IPv4 address field follows\n\t\t\t * \tIPv4 address  | 4\t\t\t | (IP address) | This field is the IPv4 host address of the STA\n\t\t\t*/\n\t\tcase RT_OID_802_11_QUERY_WFD_TDLS_PEER_IP_ADDR:\n\t\t\t{\n\t\t\t\tINT i;\n\t\t\t\tUCHAR peer_ip_addr[5] = {0};\n\t\t\t\tfor (i=0; i<MAX_NUM_OF_TDLS_ENTRY; i++)\n\t\t\t\t{\n\t\t\t\t\tif ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status == TDLS_MODE_CONNECTED))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Peer IP Addr = %d.%d.%d.%d\\n\", \n\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[i].WfdEntryInfo.wfd_serv_disc_query_info.wfd_local_ip_ie[1], \n\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[i].WfdEntryInfo.wfd_serv_disc_query_info.wfd_local_ip_ie[2],\n\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[i].WfdEntryInfo.wfd_serv_disc_query_info.wfd_local_ip_ie[3],\n\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[i].WfdEntryInfo.wfd_serv_disc_query_info.wfd_local_ip_ie[4]));\n\t\t\t\t\t\tRTMPMoveMemory(&peer_ip_addr, &pAd->StaCfg.TdlsInfo.TDLSEntry[i].WfdEntryInfo.wfd_serv_disc_query_info.wfd_local_ip_ie, sizeof(peer_ip_addr));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twrq->u.data.length = sizeof(peer_ip_addr);\n\t\t\t\tStatus = copy_to_user(wrq->u.data.pointer, &peer_ip_addr, wrq->u.data.length);\n\t\t\t}\n\t\t\tbreak;\n#endif /* WFD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\n\n\n#ifdef IWSC_SUPPORT\n\t\tcase RT_OID_IWSC_SELF_IPV4:\n\t\t\tif (wrq->u.data.length != sizeof(UINT32))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query Failed::RT_OID_IWSC_SELF_IPV4(=%d)\\n\", wrq->u.data.length));\n                Status  = -EINVAL;\n\t\t\t}\n            else\n            {\n            \tStatus = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.IWscInfo.SelfIpv4Addr, sizeof(UINT32));\n            \tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_IWSC_SELF_IPV4(=0x%08x), Status = %d\\n\", \n\t\t\t\t\tpAd->StaCfg.IWscInfo.SelfIpv4Addr, Status));\n            }\n\t\t\tbreak;\n\n\t\tcase RT_OID_IWSC_REGISTRAR_IPV4:\n\t\t\tif (wrq->u.data.length != sizeof(UINT32))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query Failed::RT_OID_IWSC_REGISTRAR_IPV4(=%d)\\n\", wrq->u.data.length));\n                Status  = -EINVAL;\n\t\t\t}\n            else\n            {\n            \tStatus = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.IWscInfo.RegIpv4Addr, sizeof(UINT32));\n            \tDBGPRINT(RT_DEBUG_TRACE, (\"Query::RT_OID_IWSC_REGISTRAR_IPV4(=0x%08x), Status = %d\\n\", \n\t\t\t\t\tpAd->StaCfg.IWscInfo.RegIpv4Addr, Status));\n            }\n\t\t\tbreak;\n\n\t\tcase RT_OID_IWSC_SMPBC_ENROLLEE_COUNT:\n\t\t\tif (wrq->u.data.length != sizeof(UINT8))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Query Failed::RT_OID_IWSC_SMPBC_ENROLLEE_COUNT(=%d)\\n\", wrq->u.data.length));\n                Status  = -EINVAL;\n\t\t\t}\n            else\n            {\n            \tStatus = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.IWscInfo.SmpbcEnrolleeCount, sizeof(UINT8));\n            \tDBGPRINT(RT_DEBUG_INFO, (\"Query::RT_OID_IWSC_SMPBC_ENROLLEE_COUNT(=0x%08x), Status = %d\\n\", \n\t\t\t\t\tpAd->StaCfg.IWscInfo.SmpbcEnrolleeCount, Status));\n            }\n\t\t\tbreak;\n#endif /* IWSC_SUPPORT */\n    default:\n            DBGPRINT(RT_DEBUG_TRACE, (\"Query::unknown IOCTL's subcmd = 0x%08x\\n\", cmd));\n            Status = -EOPNOTSUPP;\n            break;\n    }\n    return Status;\n}\n\n\n#ifdef DBG\n/* \n    ==========================================================================\n    Description:\n        Read / Write MAC\n    Arguments:\n        pAd                    Pointer to our adapter\n        wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 mac 0        ==> read MAC where Addr=0x0\n               2.) iwpriv ra0 mac 0=12     ==> write MAC where Addr=0x0, value=12\n    ==========================================================================\n*/\nVOID RTMPIoctlMAC(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq)\n{\n\tPSTRING this_char, value;\n\tINT j = 0, k = 0;\n\tSTRING *msg = NULL;\n\tSTRING *arg = NULL;\n\tUINT32 macAddr = 0, macValue = 0;\n\tUCHAR temp[16];\n\tSTRING temp2[16];\n\tINT Status;\n\tBOOLEAN bIsPrintAllMAC = FALSE;\n\n\n\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(STRING)*1024);\n\tif (!msg)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelOK;\n\t}\n\tmemset(msg, 0x00, 1024);\n\n\tos_alloc_mem(NULL, (UCHAR **)&arg, sizeof(STRING)*255);\n\tif (arg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelOK;\n\t}\n\tmemset(arg, 0x00, 255);\n\nDBGPRINT(RT_DEBUG_OFF, (\"%s():wrq->u.data.length=%d, wrq->u.data.pointer=%s!\\n\", __FUNCTION__, wrq->u.data.length, wrq->u.data.pointer));\n\tif (wrq->u.data.length > 1)\n\t{   \n\t\tStatus = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\targ[254] = 0x00;\n\t\tsprintf(msg, \"\\n\");\n\t\t\n\t\t/*Parsing Read or Write */\n\t\tthis_char = arg;\n\t\tif (!*this_char)\n\t\t\tgoto next;\n\n\t\tif ((value = rtstrchr(this_char, '=')) != NULL)\n\t\t\t*value++ = 0;\n\n\t\tif (!value || !*value)\n\t\t{ /*Read */\n\t\t\tif(strlen(this_char) > 4)\n\t\t\t\tgoto next;\n\n\t\t\tj = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\tgoto LabelOK;\n\t\t\t}\n\n\t\t\t/* Mac Addr */\n\t\t\tk = j = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t}\n\t\t\t\n\t\t\twhile(k < 4)\n\t\t\t\tthis_char[3-k++]='0';\n\t\t\tthis_char[4]='\\0';\n\n\t\t\tif(strlen(this_char) == 4)\n\t\t\t{\n\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\tmacAddr = *temp*256 + temp[1];\n\t\t\t\tmacAddr &= ~0x3;\n\t\t\t\tif (macAddr < 0xFFFF)\n\t\t\t\t{\n\t\t\t\t\tRTMP_IO_READ32(pAd, macAddr, &macValue);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacAddr=0x%04x, MacValue=%x\\n\", macAddr, macValue));\n\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%04x]:%08x  \", macAddr , macValue);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{/*Invalid parametes, so default printk all mac */\n\t\t\t\t\tbIsPrintAllMAC = TRUE;\n\t\t\t\t\tgoto next;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ /*Write */\n\t\t\tmemcpy(&temp2, value, strlen(value));\n\t\t\ttemp2[strlen(value)] = '\\0';\n\n\t\t\t/* Sanity check */\n\t\t\tif((strlen(this_char) > 4) || strlen(temp2) > 8)\n\t\t\t\tgoto next;\n\n\t\t\tj = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\tgoto LabelOK;\n\t\t\t}\n\n\t\t\tj = strlen(temp2);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tif(temp2[j] > 'f' || temp2[j] < '0')\n\t\t\t\t\tgoto LabelOK;\n\t\t\t}\n\n\t\t\t/*MAC Addr */\n\t\t\tk = j = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t}\n\n\t\t\twhile(k < 4)\n\t\t\t\tthis_char[3-k++]='0';\n\t\t\tthis_char[4]='\\0';\n\n\t\t\t/*MAC value */\n\t\t\tk = j = strlen(temp2);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\ttemp2[8-k+j] = temp2[j];\n\t\t\t}\n\t\t\t\n\t\t\twhile(k < 8)\n\t\t\t\ttemp2[7-k++]='0';\n\t\t\ttemp2[8]='\\0';\n\n\t\t\tAtoH(this_char, temp, 2);\n\t\t\tmacAddr = *temp*256 + temp[1];\n\n\t\t\tAtoH(temp2, temp, 4);\n\t\t\tmacValue = (temp[0] << 24) + (temp[1] << 16) + (temp[2] << 8) + temp[3];\n\t\t\tmacAddr &= ~0x3;\n\n\t\t\t/* debug mode */\n\t\t\tif (macAddr == (HW_DEBUG_SETTING_BASE + 4))\n\t\t\t{\n\t\t\t\t/* 0x2bf4: byte0 non-zero: enable R17 tuning, 0: disable R17 tuning */\n\t\t\t\tif (macValue & 0x000000ff) \n\t\t\t\t{\n\t\t\t\t\tpAd->BbpTuning.bEnable = TRUE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"turn on R17 tuning\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->BbpTuning.bEnable = FALSE;\n\t\t\t\t\tRTMP_CHIP_RX_SENSITIVITY_TUNING(pAd);\n\t\t\t\t}\n\t\t\t\tgoto LabelOK;\n\t\t\t}\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MacAddr=0x%04x, MacValue=0x%x\\n\", macAddr, macValue));\n\t\t\t\n\t\t\tRTMP_IO_WRITE32(pAd, macAddr, macValue);\n\t\t\tsprintf(msg+strlen(msg), \"[0x%04x]:%08x  \", macAddr, macValue);\n\t\t}\n\t}\n\telse\n\t\tbIsPrintAllMAC = TRUE;\nnext:\n\tif (bIsPrintAllMAC)\n\t{\n\t\tUINT32 *pBufMac = NULL, *pBuf;\n\t\tUINT32 AddrStart = 0x1000, AddrEnd = 0x1800;\n\t\tUINT32 IdAddr;\n\n#if defined(RT65xx) || defined(MT7601)\n\t\t\tif (IS_RT65XX(pAd) || IS_MT7601(pAd))\n\t\t\t{\n\t\t\t\tAddrStart = 0x200; \n\t\t\t\tAddrEnd = 0x1800;\n\t\t\t}\n#endif /* defined(RT65xx) || defined(MT7601) */\n\n\t\tASSERT((AddrEnd >= AddrStart));\n\t\tos_alloc_mem(NULL, (UCHAR **)&pBufMac, (((AddrEnd - AddrStart)/4) * 15) + 100 );\n\t\tif (pBufMac != NULL)\n\t\t{\n\t\t\tpBuf = pBufMac;\n\t\t\tfor(IdAddr=AddrStart; IdAddr<=AddrEnd; IdAddr+=4, pBuf++)\n\t\t\t\tRTMP_IO_READ32(pAd, IdAddr, pBuf);\n\t\t\tRtmpDrvAllMacPrint(pAd, pBufMac, AddrStart, AddrEnd, 4);\n#if defined(RT65xx) || defined(MT7601)\n\t\t\tif (IS_RT65XX(pAd) || IS_MT7601(pAd)) {\n\t\t\t\tpBuf = pBufMac;\n\t\t\t\tfor(IdAddr=AddrStart; IdAddr<=AddrEnd; IdAddr+=4, pBuf++)\n\t\t\t\t\tRTMP_IO_READ32(pAd, IdAddr, pBuf);\n\t\t\t\tRtmpDrvAllMacPrint(pAd, pBufMac, AddrStart, AddrEnd, 4);\n\t\t\t}\n#endif /* defined(RT65xx) || defined(MT7601) */\n\t\t\tos_free_mem(NULL, pBufMac);\n\t\t}\n\t}\n\tif(strlen(msg) == 1)\n\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\n\t/* Copy the information into the user buffer */\n\twrq->u.data.length = strlen(msg);\n\tStatus = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\t\nLabelOK:\n\tif (msg != NULL)\n\t\tos_free_mem(NULL, msg);\n\tif (arg != NULL)\n\t\tos_free_mem(NULL, arg);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlMAC\\n\\n\"));\n\treturn;\n}\n\n/* \n    ==========================================================================\n    Description:\n        Read / Write E2PROM\n    Arguments:\n        pAd                    Pointer to our adapter\n        wrq                         Pointer to the ioctl argument\n\n    Return Value:\n        None\n\n    Note:\n        Usage: \n               1.) iwpriv ra0 e2p 0     \t==> read E2PROM where Addr=0x0\n               2.) iwpriv ra0 e2p 0=1234    ==> write E2PROM where Addr=0x0, value=1234\n    ==========================================================================\n*/\nVOID RTMPIoctlE2PROM(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tINT\t\t\t\t\tj = 0, k = 0;\n/*\tSTRING\t\t\t\tmsg[1024]; */\n\tSTRING\t\t\t\t*msg = NULL;\n/*\tSTRING\t\t\t\targ[255]; */\n\tSTRING\t\t\t\t*arg = NULL;\n\tUSHORT\t\t\t\teepAddr = 0;\n\tUCHAR\t\t\t\ttemp[16];\n\tSTRING\t\t\t\ttemp2[16];\n\tUSHORT\t\t\t\teepValue;\n\tint\t\t\t\t\tStatus;\n\tBOOLEAN\t\t\t\tbIsPrintAllE2P = FALSE;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&msg, sizeof(STRING)*1024);\n\tif (msg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelOK;\n\t}\n\tos_alloc_mem(NULL, (UCHAR **)&arg, sizeof(STRING)*255);\n\tif (arg == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\tgoto LabelOK;\n\t}\n\n\tmemset(msg, 0x00, 1024);\n\tmemset(arg, 0x00, 255);\n\tif (wrq->u.data.length > 1) /*No parameters. */\n\t{   \n\t    Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\tsprintf(msg, \"\\n\");\n\t\targ[254] = 0x00;\n\n\t    /*Parsing Read or Write */\n\t\tthis_char = arg;\n\t\t\n\t\t\n\t\tif (!*this_char)\n\t\t\tgoto next;\n\n\t\tif ((value = rtstrchr(this_char, '=')) != NULL)\n\t\t\t*value++ = 0;\n\n\t\tif (!value || !*value)\n\t\t{ /*Read */\n\n\t\t\t/* Sanity check */\n\t\t\tif(strlen(this_char) > 4)\n\t\t\t\tgoto next;\n\n\t\t\tj = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\tgoto LabelOK;\n\t\t\t}\n\n\t\t\t/* E2PROM addr */\n\t\t\tk = j = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t}\n\t\t\t\n\t\t\twhile(k < 4)\n\t\t\t\tthis_char[3-k++]='0';\n\t\t\tthis_char[4]='\\0';\n\n\t\t\tif(strlen(this_char) == 4)\n\t\t\t{\n\t\t\t\tAtoH(this_char, temp, 2);\n\t\t\t\teepAddr = *temp*256 + temp[1];\t\t\t\t\t\n\t\t\t\tif (eepAddr < 0xFFFF)\n\t\t\t\t{\n\t\t\t\t\tRT28xx_EEPROM_READ16(pAd, eepAddr, eepValue);\n\t\t\t\t\tsprintf(msg+strlen(msg), \"[0x%04X]:0x%04X  \", eepAddr , eepValue);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllE2P = TRUE;\n\t\t\t\t\tgoto next;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ /*Write */\n\t\t\tmemcpy(&temp2, value, strlen(value));\n\t\t\ttemp2[strlen(value)] = '\\0';\n\n\t\t\t/* Sanity check */\n\t\t\tif((strlen(this_char) > 4) || strlen(temp2) > 8)\n\t\t\t\tgoto next;\n\n\t\t\tj = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tif(this_char[j] > 'f' || this_char[j] < '0')\n\t\t\t\t\tgoto LabelOK;\n\t\t\t}\n\t\t\tj = strlen(temp2);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tif(temp2[j] > 'f' || temp2[j] < '0')\n\t\t\t\t\tgoto LabelOK;\n\t\t\t}\n\n\t\t\t/*MAC Addr */\n\t\t\tk = j = strlen(this_char);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\tthis_char[4-k+j] = this_char[j];\n\t\t\t}\n\n\t\t\twhile(k < 4)\n\t\t\t\tthis_char[3-k++]='0';\n\t\t\tthis_char[4]='\\0';\n\n\t\t\t/*MAC value */\n\t\t\tk = j = strlen(temp2);\n\t\t\twhile(j-- > 0)\n\t\t\t{\n\t\t\t\ttemp2[4-k+j] = temp2[j];\n\t\t\t}\n\t\t\t\n\t\t\twhile(k < 4)\n\t\t\t\ttemp2[3-k++]='0';\n\t\t\ttemp2[4]='\\0';\n\n\t\t\tAtoH(this_char, temp, 2);\n\t\t\teepAddr = *temp*256 + temp[1];\n\n\t\t\tAtoH(temp2, temp, 2);\n\t\t\teepValue = *temp*256 + temp[1];\n\n\t\t\tRT28xx_EEPROM_WRITE16(pAd, eepAddr, eepValue);\n\t\t\tsprintf(msg+strlen(msg), \"[0x%02X]:%02X  \", eepAddr, eepValue);\n\t\t}\n\t}\n\telse\n\t\tbIsPrintAllE2P = TRUE;\nnext:\n\tif (bIsPrintAllE2P)\n\t{\n\t\tUSHORT *pMacContent, *pMacIndex;\n\t\tUINT32 ContentLen;\n\t\tUINT32 AddrEnd = 0xFE;\n\n\n\t\tContentLen = AddrEnd+2;\n\t\tos_alloc_mem(NULL, (UCHAR **)&pMacContent, ContentLen);\n\t\tif (pMacContent == NULL)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"-->2) %s: Allocate memory fail!\\n\", __FUNCTION__));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* get MAC content */\n\t\t\tUSHORT eepAddr = 0;\n\t\t\tUSHORT eepValue;\n\n\t\t\tpMacIndex = pMacContent;\n\t\t\twhile(eepAddr <= AddrEnd)\n\t\t\t{\n\t\t\t\tRT28xx_EEPROM_READ16(pAd, eepAddr, eepValue);\n\t\t\t\t*pMacIndex = eepValue;\n\n\t\t\t\tpMacIndex ++;\n\t\t\t\teepAddr += 2;\n\t\t\t}\n\n\t\t\t/* print content to a file */\n\t\t\tRtmpDrvAllE2PPrint(pAd, pMacContent, AddrEnd, 2);\n\t\t\tos_free_mem(NULL, pMacContent);\n\t\t}\n\n\t}\n\tif(strlen(msg) == 1)\n\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\n\n\t/* Copy the information into the user buffer */\n\twrq->u.data.length = strlen(msg);\n\tStatus = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);\n\nLabelOK:\n\tif (msg != NULL)\n\t\tos_free_mem(NULL, msg);\n\tif (arg != NULL)\n\t\tos_free_mem(NULL, arg);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlE2PROM\\n\"));\n\treturn;\n}\n\n#ifdef RLT_RF\nVOID RTMPIoctlRF(\n\tIN\tPRTMP_ADAPTER\tpAdapter,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq)\n{\n\tPSTRING\t\t\t\tthis_char;\n\tPSTRING\t\t\t\tvalue;\n\tUCHAR\t\t\t\tregRF = 0, rf_bank = 0;\n\tPSTRING\t\t\t\tmpool, msg;\n\tPSTRING\t\t\t\targ;\n\tPSTRING\t\t\t\tptr;\n\tINT\t\t\t\t\trfId, maxRFIdx, bank_Id;\n\tLONG\t\t\t\trfValue;\n\tBOOLEAN\t\t\t\tbIsPrintAllRF = FALSE, bFromUI;\n\tINT\t\t\t\t\tmemLen = sizeof(CHAR) * (2048+256+12);\n\tINT\t\t\t\t\targLen;\n\t\n\tmaxRFIdx = pAdapter->chipCap.MaxNumOfRfId;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"==>RTMPIoctlRF (maxRFIdx = %d)\\n\", maxRFIdx));\n\n\tmemLen = 12*(maxRFIdx+1)*MAC_RF_BANK;\n\tos_alloc_mem(NULL, (UCHAR **)&mpool, memLen);\n\tif (mpool == NULL) {\n\t\treturn;\n\t}\n\n\tbFromUI = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_UI) == RTPRIV_IOCTL_FLAG_UI) ? TRUE : FALSE;\n\t\n\tNdisZeroMemory(mpool, memLen);\n\tmsg = (PSTRING)((ULONG)(mpool+3) & (ULONG)~0x03);\n\targ = (PSTRING)((ULONG)(msg+2048+3) & (ULONG)~0x03);\n\targLen = strlen((char *)(wrq->u.data.pointer));\n\n// ++Alan test\n\tif (wrq->u.data.length > 1) /*No parameters. */\n\t{\n\t\tNdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);\n\t\targ[254] = 0x00;\n\t\tptr = arg;\n\t\tsprintf(msg, \"\\n\");\n\t    /*Parsing Read or Write */\n\t\twhile ((this_char = strsep((char **)&ptr, \",\")) != NULL)\n\t\t{\n\t\tif (!*this_char)\n\t\t\tgoto next;\n\n\t\tif ((value = strchr(this_char,'=')) != NULL)\n\t\t\t*value++ = 0;\n\n\n\t\tif (!value || !*value)\n\t\t{ /*Read */\n\n\t\t\tif ((value = strchr(this_char,'_')) != NULL)\n\t\t\t\t*value++ = 0;\n\n\t\t\tif ( !value )\n\t\t\t{\n\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\tgoto next;\n\t\t\t} \n\t\t\t\n\t\t\tif ( (sscanf((PSTRING) this_char, \"%d\", &(bank_Id)) == 1) && (sscanf((PSTRING) value, \"%d\", &(rfId)) == 1))\n\t\t\t{\n\t\t\t\n\t\t\t\tif ( (rfId <= maxRFIdx) && (bank_Id <= MAC_RF_BANK))\n\t\t\t\t{\n\t\t\t\t\t\trlt_rf_read(pAdapter, bank_Id, rfId, &regRF);\n\n\t\t\t\t\t\tsprintf(msg+strlen(msg), \"BANK%d_R%02d:%02X  \", bank_Id, rfId, regRF);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{/*Invalid parametes, so default printk all RF */\n\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\tgoto next;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Invalid parametes, so default printk all RF */\n\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\tgoto next;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ /*Write */\n\t\t\tif ( sscanf(value, \"%lx\", &(rfValue)) == 1)\n\t\t\t{\n\t\t\t\tif ((value = strchr(this_char,'_')) != NULL)\n\t\t\t\t\t*value++ = 0;\n\n\t\t\t\tif ( !value )\n\t\t\t\t{\n\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t} \n\n\t\t\t\tif ( (sscanf((PSTRING)this_char, \"%d\", &(bank_Id)) == 1) && (sscanf((PSTRING)value, \"%d\", &(rfId)) == 1))\n\t\t\t\t{\n\n\t\t\t\t\tif ( (rfId <= maxRFIdx) && (bank_Id <= MAC_RF_BANK) )\n\t\t\t\t\t{\n\t\t\t\t\t\trlt_rf_write(pAdapter, bank_Id, rfId, rfValue);\n\t\t\t\t\t\tsprintf(msg+strlen(msg), \"BANK%d_R%02d:%02X  \", bank_Id, rfId, rfValue);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbIsPrintAllRF = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t\n\t\t}\n\n\t}\n\telse \n\t\tbIsPrintAllRF = TRUE;\n// --Alan test\n\nnext:\n\tif (bIsPrintAllRF)\n\t{\n\t\tRTMPZeroMemory(msg, memLen);\n\t\tsprintf(msg, \"\\n\");\n\t\tfor (bank_Id = 0; bank_Id <= MAC_RF_BANK; bank_Id++)\n\t\t{\n\t\t\tif (IS_RT6590(pAdapter))\n\t\t\t{\n\t\t\t\tif ((bank_Id <=4) && (bank_Id >=1))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( IS_MT7601(pAdapter) )\n\t\t\t{\n\t\t\t\tif ( (bank_Id != 0) && (bank_Id != 4) && (bank_Id != 5 ))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (rfId = 0; rfId <= maxRFIdx; rfId++)\n\t\t\t{\n\t\t\t\trlt_rf_read(pAdapter, bank_Id, rfId, &regRF);\n\t\t\t\tsprintf(msg+strlen(msg), \"%d %03d %02X\\n\", bank_Id, rfId, regRF);\n\t\t\t}\n\t\t}\n\t\tRtmpDrvAllRFPrint(NULL, msg, strlen(msg));\n\t\t/* Copy the information into the user buffer */\n\n#ifdef LINUX\n\t\twrq->u.data.length = strlen(\"Dump to RFDump.txt\");\n\t\tif (copy_to_user(wrq->u.data.pointer, \"Dump to RFDump.txt\", wrq->u.data.length)) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t\t}\n#endif /* LINUX */\n\t}\t\n\telse\n\t{\n\t\tif(strlen(msg) == 1)\n\t\t\tsprintf(msg+strlen(msg), \"===>Error command format!\");\n\n\t\twrq->u.data.length = strlen(msg);\n\t\tif (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: copy_to_user() fail\\n\", __FUNCTION__));\t\t\t\n\t\t}\n\t}\n\n\tos_free_mem(NULL, mpool);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==RTMPIoctlRF\\n\"));\n}\n#endif /* RLT_RF */\n\n\n#endif /* DBG */\n\n\n#ifdef RT65xx\nVOID RTMPIoctlBbp32(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq,\n\tIN CHAR *extra,\n\tIN UINT32 size)\n{\n\tPSTRING this_char;\n\tPSTRING value = NULL;\n\tUINT32 regBBP = 0, bbpId;\n\tUINT32 bbpValue;\n\tBOOLEAN bIsPrintAllBBP = FALSE;\n\nDBGPRINT(RT_DEBUG_OFF, (\"Into RTMPIoctlBbp32()!\\n\"));\n\n\tif (wrq->u.data.length > 1) /*No parameters. */\n\t{\n\t\tsprintf(extra, \"\\n\");\n\t\t\t\t\t\n\t\t/*Parsing Read or Write */\n\t\tthis_char = wrq->u.data.pointer;\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"this_char=%s\\n\", this_char));\n\t\tif (!*this_char)                                                                            \n\t\t\tgoto next;\n\n\t\tif ((value = rtstrchr(this_char, '=')) != NULL)\n\t\t\t*value++ = 0;\t\t\n\t\t\n\t\tif (!value || !*value)\n\t\t{\n\t\t\t/*Read */\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"this_char=%s, value=%s\\n\", this_char, value));\n\n\t\t\tif (sscanf(this_char, \"%x\", &(bbpId)) == 1)\n\t\t\t{  \n\t\t\t\tif ((bbpId <= 0x2fff) && (bbpId >= 0x2000))\n\t\t\t\t{                                                                                   \n\t\t\t\t\tRTMP_BBP_IO_READ32(pAd, bbpId, &regBBP);                          \n\t\t\t\t\tsprintf(extra+strlen(extra), \"BBP[0x%04x]:%08x\\n\", bbpId, regBBP);\n\t\t\t\t\twrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"msg=%s\\n\", extra));\n\t\t\t\t}                                                                                   \n\t\t\t\telse                                                                                \n\t\t\t\t{\n\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\tgoto next;                                                                          \n\t\t\t\t}                                                                                   \n\t\t\t}                                                                                       \n\t\t\telse                                                                                    \n\t\t\t{ /*Invalid parametes, so default printk all bbp */\n\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\tgoto next;                                                                              \n\t\t\t}                                                                                       \n\t\t}                                                                                           \n\t\telse                                                                                        \n\t\t{\n\t\t\t/*Write */\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"this_char=%s, value=%s\\n\", this_char, value));\n\t\t\tif ((sscanf(this_char, \"%x\", &(bbpId)) == 1) && (sscanf(value, \"%x\", &(bbpValue)) == 1))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"BBP[0x%04x]:%08x\\n\", bbpId, bbpValue));\n\t\t\t\tif ((bbpId <= 0x2fff) && (bbpId >= 0x2000))\n\t\t\t\t{                                                                                   \n\t\t\t\t\tRTMP_BBP_IO_WRITE32(pAd, bbpId, bbpValue);          \n\t\t\t\t\t/* read it back for showing */                                                      \n\t\t\t\t\tRTMP_BBP_IO_READ32(pAd, bbpId, &regBBP);                          \n\t\t\t\t\tsprintf(extra+strlen(extra), \"BBP[0x%04x]:%08x\\n\", bbpId, regBBP);\n\t\t\t\t\twrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"msg=%s\\n\", extra));                                       \n\t\t\t\t}                                                                                   \n\t\t\t\telse                                                                                \n\t\t\t\t{\n\t\t\t\t\t/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;                                                          \n\t\t\t\t\tgoto next;                                                                          \n\t\t\t\t}                                                                                   \n\t\t\t}                                                                                       \n\t\t\telse                                                                                    \n\t\t\t{ /*Invalid parametes, so default printk all bbp */\n\t\t\t\tbIsPrintAllBBP = TRUE;                                                              \n\t\t\t\tgoto next;                                                                              \n\t\t\t}                                                                                       \n\t\t}                             \n\t\t}\n\telse\n\t\tbIsPrintAllBBP = TRUE;\n\nnext:    \n\tif (bIsPrintAllBBP)\n\t{   \n\t\tstatic RTMP_REG_PAIR bbp_regs[]={\n\t\t\t{CORE_R1,\tCORE_R44},\n\t\t\t{IBI_R0,\t\tIBI_R11},\n\t\t\t{AGC1_R0,\tAGC1_R63},\n\t\t\t{TXC_R1, \tTXC_R1},\n\t\t\t{RXC_R1,\tRXC_R4},\n\t\t\t{TXO_R8,\tTXO_R8},\n\t\t\t{TXBE_R0,\tTXBE_R17},\n\t\t\t{RXFE_R0,\tRXFE_R4},\n\t\t\t{RXO_R13,\tRXO_R28},\n\t\t};\n\t\tUINT32 reg, i;\n\n\n\t\tmemset(extra, 0x00, size);\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i = 0; i < sizeof(bbp_regs) / sizeof(RTMP_REG_PAIR); i++)\n\t\t{\n\t\t\tfor (reg = bbp_regs[i].Register; reg <= bbp_regs[i].Value; reg += 4)\n\t\t\t{\n\t\t\t\tif (strlen(extra) >= (size - 20))\n\t\t\t\t\tbreak;\n\t\t\t\tRTMP_BBP_IO_READ32(pAd, reg, &regBBP);\n\t\t\t\tsprintf(extra+strlen(extra), \"%04x = %08x\\n\", reg, regBBP);  /* edit by johnli, change display format */\n\t\t\t}\n\t\t}\n\t\t\n        wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n        DBGPRINT(RT_DEBUG_TRACE, (\"wrq->length = %d\\n\", wrq->u.data.length));\n\t}\n}\n#endif /* RT65xx */\n\n\nVOID RTMPIoctlBbp(\n\tIN RTMP_ADAPTER *pAd,\n\tIN RTMP_IOCTL_INPUT_STRUCT *wrq,\n\tIN CHAR *extra,\n\tIN UINT32 size)\n{\n\tPSTRING this_char;\n\tPSTRING value = NULL;\n\tUCHAR regBBP = 0;\n\tUINT32 bbpId;\n\tUINT32 bbpValue;\n\tBOOLEAN bIsPrintAllBBP = FALSE;\n\n#ifdef RT65xx\n\tif (IS_RT65XX(pAd)) {\n\t\tRTMPIoctlBbp32(pAd, wrq, extra, size);\n\t} else\n#endif /* RT65xx */\n\n\tif (wrq->u.data.length > 1) /*No parameters. */\n\t{\n\t\tsprintf(extra, \"\\n\");\n\t\t\t\t\t\n\t\t/*Parsing Read or Write */\n\t\tthis_char = wrq->u.data.pointer;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"this_char=%s\\n\", this_char));\n\t\tif (!*this_char)                                                                            \n\t\t\tgoto next;\n\n\t\tif ((value = rtstrchr(this_char, '=')) != NULL)\n\t\t\t*value++ = 0;\t\t\n\t\t\n\t\tif (!value || !*value)\n\t\t{ /*Read */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"this_char=%s, value=%s\\n\", this_char, value));\n\t\t\tif (sscanf(this_char, \"%d\", &(bbpId)) == 1)                                             \n\t\t\t{  \n\t\t\t\tif (bbpId <= pAd->chipCap.MaxNumOfBbpId)\n\t\t\t\t{                                                                                   \n#ifdef RALINK_ATE\n\t\t\t\t\tif (ATE_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, &regBBP);\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\t\t\t{\n\t\t\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, &regBBP);                          \n\t\t\t\t\t}\n\t\t\t\t\tsprintf(extra+strlen(extra), \"R%02d[0x%02X]:%02X\\n\", bbpId, bbpId, regBBP);\n                    wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"msg=%s\\n\", extra));\n\t\t\t\t}                                                                                   \n\t\t\t\telse                                                                                \n\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\t\tgoto next;                                                                          \n\t\t\t\t}                                                                                   \n\t\t\t}                                                                                       \n\t\t\telse                                                                                    \n\t\t\t{ /*Invalid parametes, so default printk all bbp */\n\t\t\t\tbIsPrintAllBBP = TRUE;\n\t\t\t\tgoto next;                                                                              \n\t\t\t}                                                                                       \n\t\t}                                                                                           \n\t\telse                                                                                        \n\t\t{ /*Write */\n\t\t\tif ((sscanf(this_char, \"%d\", &(bbpId)) == 1) && (sscanf(value, \"%x\", &(bbpValue)) == 1))\n\t\t\t{\n\t\t\t\tif (bbpId <= pAd->chipCap.MaxNumOfBbpId)\n\t\t\t\t{                                                                                   \n#ifdef RALINK_ATE\n\t\t\t\t\tif (ATE_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tATE_BBP_IO_WRITE8_BY_REG_ID(pAd, bbpId, bbpValue);          \n\t\t\t\t\t\t/* read it back for showing */                                                      \n\t\t\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, &regBBP);  \n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\t\t\t{\n\t\t\t\t\t    RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, bbpId, bbpValue);          \n    \t\t\t\t\t/* read it back for showing */                                                      \n    \t\t\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, &regBBP);                          \n\t\t\t}\n\t\t\t\t\tsprintf(extra+strlen(extra), \"R%02d[0x%02X]:%02X\\n\", bbpId, bbpId, regBBP);\n                    wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"msg=%s\\n\", extra));                                       \n\t\t\t\t}                                                                                   \n\t\t\t\telse                                                                                \n\t\t\t\t{/*Invalid parametes, so default printk all bbp */\n\t\t\t\t\tbIsPrintAllBBP = TRUE;                                                          \n\t\t\t\t\tgoto next;                                                                          \n\t\t\t\t}                                                                                   \n\t\t\t}                                                                                       \n\t\t\telse                                                                                    \n\t\t\t{ /*Invalid parametes, so default printk all bbp */\n\t\t\t\tbIsPrintAllBBP = TRUE;                                                              \n\t\t\t\tgoto next;                                                                              \n\t\t\t}                                                                                       \n\t\t}                             \n\t\t}\n\telse\n\t\tbIsPrintAllBBP = TRUE;\n\nnext:    \n\tif (bIsPrintAllBBP)\n\t{   \n\t\tmemset(extra, 0x00, size);\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (bbpId = 0; bbpId <= pAd->chipCap.MaxNumOfBbpId; bbpId++)\n\t\t{\n\t\t    if (strlen(extra) >= (size - 20))\n                break;\n#ifdef RALINK_ATE\n\t\t\tif (ATE_ON(pAd))\n\t\t\t{\n\t\t\t\tATE_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, &regBBP); \n\t\t\t}\n\t\t\telse\n#endif /* RALINK_ATE */\n\t\t\tRTMP_BBP_IO_READ8_BY_REG_ID(pAd, bbpId, &regBBP);\n\t\t\t/*sprintf(extra+strlen(extra), \"R%02d[0x%02X]:%02X    \", bbpId, bbpId, regBBP);\n\t\t\tif (bbpId%5 == 4)*/\n\t\t\tsprintf(extra+strlen(extra), \"%03d = %02X\\n\", bbpId, regBBP);  /* edit by johnli, change display format */\n\t\t}\n\t\t\n        wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n        DBGPRINT(RT_DEBUG_TRACE, (\"wrq->length = %d\\n\", wrq->u.data.length));\n\t}\n}\n\n\n\n\n#ifdef DOT11_N_SUPPORT\nvoid\tgetBaInfo(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\tpOutBuf,\n\tIN\tUINT32\t\t\tsize)\n{\n\tINT i, j;\n\tBA_ORI_ENTRY *pOriBAEntry;\n\tBA_REC_ENTRY *pRecBAEntry;\n\n\tfor (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t{\n\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];\n\t\tif (((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || IS_ENTRY_TDLS(pEntry)) && (pEntry->Sst == SST_ASSOC))\n\t\t\t|| IS_ENTRY_WDS(pEntry) || IS_ENTRY_MESH(pEntry))\n\t\t{\t\t\n\t\t\tsprintf(pOutBuf, \"%s\\n%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (AP) -\\n\",\n                pOutBuf,\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid);\n\t\t\t\n\t\t\tsprintf(pOutBuf, \"%s[Recipient]\\n\", pOutBuf);\n\t\t\tfor (j=0; j < NUM_OF_TID; j++)\n\t\t\t{\n\t\t\t\tif (pEntry->BARecWcidArray[j] != 0)\n\t\t\t\t{\n\t\t\t\t\tpRecBAEntry =&pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]];\n\t\t\t\t\tsprintf(pOutBuf, \"%sTID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\\n\", pOutBuf, j, pRecBAEntry->BAWinSize, pRecBAEntry->LastIndSeq, pRecBAEntry->list.qlen);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsprintf(pOutBuf, \"%s\\n\", pOutBuf);\n\n\t\t\tsprintf(pOutBuf, \"%s[Originator]\\n\", pOutBuf);\n\t\t\tfor (j=0; j < NUM_OF_TID; j++)\n\t\t\t{\n\t\t\t\tif (pEntry->BAOriWcidArray[j] != 0)\n\t\t\t\t{\n\t\t\t\t\tpOriBAEntry =&pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]];\n\t\t\t\t\tsprintf(pOutBuf, \"%sTID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\\n\", pOutBuf, j, pOriBAEntry->BAWinSize, pOriBAEntry->Sequence, pEntry->TxSeq[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsprintf(pOutBuf, \"%s\\n\\n\", pOutBuf);\n\t\t}\n        if (strlen(pOutBuf) > (size - 30))\n                break;\n\t}\n\n\treturn;\n}\n#endif /* DOT11_N_SUPPORT */\n\n\nVOID RTMPIoctlShow(\n\tIN\tPRTMP_ADAPTER\t\t\tpAd,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*wrq,\n\tIN\tUINT32\t\t\t\t\tsubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SHOW *pIoctlShow = (RT_CMD_STA_IOCTL_SHOW *)pData;\n\tPOS_COOKIE pObj;\n\tINT Status = 0;\n\tchar *extra = (char *)pIoctlShow->pData;\n\tUINT32 size = (UINT32)(pIoctlShow->MaxSize);\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n\n\t{\n\t\tpObj->ioctl_if_type = INT_MAIN;\n\t\tpObj->ioctl_if = MAIN_MBSSID;\n\t}\n\n    switch(subcmd)\n    {\n\n        case SHOW_CONN_STATUS:\n            if (MONITOR_ON(pAd))\n            {\n#ifdef DOT11_N_SUPPORT\n                if (WMODE_CAP_N(pAd->CommonCfg.PhyMode) &&\n                    pAd->CommonCfg.RegTransmitSetting.field.BW)\n                    snprintf(extra, size, \"Monitor Mode(CentralChannel %d)\\n\", pAd->CommonCfg.CentralChannel);\n                else\n#endif /* DOT11_N_SUPPORT */\n                    snprintf(extra, size, \"Monitor Mode(Channel %d)\\n\", pAd->CommonCfg.Channel);\n            }\n            else\n            {\n                if (pAd->IndicateMediaState == NdisMediaStateConnected)\n            \t{        \t    \n            \t    if (INFRA_ON(pAd))\n                    {   \n                    snprintf(extra, size, \"Connected(AP: %s[%02X:%02X:%02X:%02X:%02X:%02X])\\n\", \n                                    pAd->CommonCfg.Ssid, \n                                    pAd->CommonCfg.Bssid[0],\n                                    pAd->CommonCfg.Bssid[1],\n                                    pAd->CommonCfg.Bssid[2],\n                                    pAd->CommonCfg.Bssid[3],\n                                    pAd->CommonCfg.Bssid[4],\n                                    pAd->CommonCfg.Bssid[5]);\n            \t\tDBGPRINT(RT_DEBUG_TRACE ,(\"Ssid=%s ,Ssidlen = %d\\n\",pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen));\n            \t}\n                    else if (ADHOC_ON(pAd))\n                        snprintf(extra, size, \"Connected\\n\");\n            \t}\n            \telse\n            \t{\n            \t    snprintf(extra, size, \"Disconnected\\n\");\n            \t\tDBGPRINT(RT_DEBUG_TRACE ,(\"ConnStatus is not connected\\n\"));\n            \t}\n            }\n            wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n            break;\n        case SHOW_DRVIER_VERION:\n            snprintf(extra, size, \"Driver version-%s, %s %s\\n\", STA_DRIVER_VERSION, __DATE__, __TIME__ );\n            wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n            break;\n#ifdef DOT11_N_SUPPORT\n        case SHOW_BA_INFO:\n            getBaInfo(pAd, extra, size);\n            wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n            break;\n#endif /* DOT11_N_SUPPORT */\n\t\tcase SHOW_DESC_INFO:\n\t\t\t{\n\t\t\t\tShow_DescInfo_Proc(pAd, NULL);\n\t\t\t\twrq->u.data.length = 0; /* 1: size of '\\0' */\n\t\t\t}\n\t\t\tbreak;\n        case RAIO_OFF:\n\t\t\t/* Link down first if any association exists*/\n\t\t\tif (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n\t\t\t{\n\t\t\t\tif (INFRA_ON(pAd) || ADHOC_ON(pAd))\n\t\t\t\t{\n\t\t\t\t\tMLME_DISASSOC_REQ_STRUCT DisReq;\n\t\t\t\t\tMLME_QUEUE_ELEM *pMsgElem;\n\n\t\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&pMsgElem, sizeof(MLME_QUEUE_ELEM));\n\t\t\t\t\tif (pMsgElem)\n\t\t\t\t\t{\n\t\t\t\t\t\tCOPY_MAC_ADDR(&DisReq.Addr, pAd->CommonCfg.Bssid);\n\t\t\t\t\t\tDisReq.Reason =  REASON_DISASSOC_STA_LEAVING;\n\n\t\t\t\t\t\tpMsgElem->Machine = ASSOC_STATE_MACHINE;\n\t\t\t\t\t\tpMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;\n\t\t\t\t\t\tpMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);\n\t\t\t\t\t\tNdisMoveMemory(pMsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));\n\t\t\t\t\t\n\t\t\t\t\t\tMlmeDisassocReqAction(pAd, pMsgElem);\n\t\t\t\t\t\tos_free_mem(NULL, pMsgElem);\n\t\t\t\t\t\t\n\t\t\t\t\t\tRTMPusecDelay(1000);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n            if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n            {\n                if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t\t        {\n\t\t            RTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\t            DBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n\t\t        }\n            }\n            pAd->StaCfg.bSwRadio = FALSE;\n            if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))\n            {\n                pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);\n                if (pAd->StaCfg.bRadio == FALSE)\n                {\n                    MlmeRadioOff(pAd);\n                    /* Update extra information */\n\t\t\tpAd->ExtraInfo = SW_RADIO_OFF;\n                } \n            }\n            snprintf(extra, size, \"Radio Off\\n\");\n            wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n            break;\n        case RAIO_ON:\n            pAd->StaCfg.bSwRadio = TRUE;\n            /*if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) */\n            {\n                pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);\n                if (pAd->StaCfg.bRadio == TRUE)\n                {\n                    MlmeRadioOn(pAd);\n                    /* Update extra information */\n\t\t\t\t\tpAd->ExtraInfo = EXTRA_INFO_CLEAR;\n                }\n            }\n            snprintf(extra, size, \"Radio On\\n\");\n            wrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n            break;\n\n\n#ifdef QOS_DLS_SUPPORT\n\t\tcase SHOW_DLS_ENTRY_INFO:\n\t\t\t{\n\t\t\t\tSet_DlsEntryInfo_Display_Proc(pAd, NULL);\n\t\t\t\twrq->u.data.length = 0; /* 1: size of '\\0' */\n\t\t\t}\n\t\t\tbreak;\n#endif /* QOS_DLS_SUPPORT */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\tcase SHOW_TDLS_ENTRY_INFO:\n\t\t\t{\n\t\t\t\tSet_TdlsEntryInfo_Display_Proc(pAd, NULL);\n\t\t\t\twrq->u.data.length = 0; /* 1: size of '\\0' */\n\t\t\t}\n\t\t\tbreak;\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n\t\tcase SHOW_CFG_VALUE:\n\t\t\t{\n\t\t\t\tStatus = RTMPShowCfgValue(pAd, (PSTRING) wrq->u.data.pointer,\n\t\t\t\t\t\t\t\t\t\textra, pIoctlShow->MaxSize);\n\t\t\t\tif (Status == 0)\n\t\t\t\t\twrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SHOW_ADHOC_ENTRY_INFO:\n\t\t\tShow_Adhoc_MacTable_Proc(pAd, extra, size);\n\t\t\twrq->u.data.length = strlen(extra) + 1; /* 1: size of '\\0' */\n\t\t\tbreak;\n\n\n\tcase SHOW_DEV_INFO:\n\t\tshow_devinfo_proc(pAd, NULL);\n\t\twrq->u.data.length = 0;\n\t\tbreak;\n\n\tcase SHOW_STA_INFO:\n\t\tShow_MacTable_Proc(pAd, NULL);\n\t\twrq->u.data.length = 0;\n\t\tbreak;\n\n        default:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - unknow subcmd = %d\\n\", __FUNCTION__, subcmd));\n            break;\n    }\n}\n\n\n/* ------------------- Functions for Standard IOCTL ------------------------- */\n#define RTMP_STA_STANDARD_IOCTL_HANDLE(__pAd, __pData, __Data, __SubCmd)\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWFREQ:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwfreq(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWFREQ:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwfreq(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWMODE:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwmode(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWMODE:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwmode(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWAP:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwap(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWAP:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwap(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWSCAN:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwscan(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWSCAN:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwscan(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWESSID:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwessid(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWESSID:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwessid(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWNICKN:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwnickn(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWNICKN:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwnickn(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWRTS:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwrts(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWRTS:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwrts(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWFRAG:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwfrag(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWFRAG:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwfrag(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWENCODE:\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwencode(__pAd, __pData, __Data);\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWENCODE:\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwencode(__pAd, __pData, __Data);\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWMLME:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwmlme(__pAd, __pData, __Data, __SubCmd);\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWAUTH:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwauth(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWAUTH:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwauth(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWENCODEEXT:\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwencodeext(__pAd, __pData, __Data);\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWENCODEEXT:\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwencodeext(__pAd, __pData, __Data);\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWGENIE:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwgenie(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWGENIE:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwgenie(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWPMKSA:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwpmksa(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWRATE:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_siwrate(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIWRATE:\t\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_giwrate(__pAd, __pData, __Data);\t\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCGIFHWADDR:\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_gifhwaddr(__pAd, __pData, __Data);\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_SIOCSIWPRIVRSSI:\t\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_ioctl_rssi(__pAd, __pData, __Data);\t\t\\\n\tcase CMD_RTPRIV_IOCTL_STA_IW_SET_WSC_U32_ITEM:\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_private_set_wsc_u32_item(__pAd, __pData, __Data);\\\n\tcase CMD_RTPRIV_IOCTL_STA_IW_SET_WSC_STR_ITEM:\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_private_set_wsc_string_item(__pAd, __pData, __Data);\\\n\tcase CMD_RTPRIV_IOCTL_STA_IW_GET_STATISTICS:\t\t\t\t\t\t\t\\\n\t\treturn RtmpIoctl_rt_private_get_statistics(__pAd, __pData, __Data);\t\\\n\t;\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWFREQ.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwfreq(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_FREQ *pIoctlFreq = (RT_CMD_STA_IOCTL_FREQ *)pData;\n\tint \tchan = -1;\n\tULONG\tfreq;\n\t\n\tif ( pIoctlFreq->m > 100000000 )\n\t\tfreq = pIoctlFreq->m / 100000;\n\telse if ( pIoctlFreq->m > 100000 )\n\t\tfreq = pIoctlFreq->m / 100;\n\telse\n\t\tfreq = pIoctlFreq->m;\n\n\n\tif((pIoctlFreq->e == 0) && (freq <= 1000))\n\t\tchan = pIoctlFreq->m;\t/* Setting by channel number */\n\telse\n\t{\n\t\tMAP_KHZ_TO_CHANNEL_ID( freq , chan); /* Setting by frequency - search the table , like 2.412G, 2.422G, */\n\t}\n\n    if (ChannelSanity(pAd, chan) == TRUE)\n    {\n\tpAd->CommonCfg.Channel = chan;\n\t\t/* Save the channel on MlmeAux for CntlOidRTBssidProc used. */\n\t\tpAd->MlmeAux.Channel = pAd->CommonCfg.Channel;\n\t\t/*save connect info*/\n\t\tpAd->StaCfg.ConnectinfoChannel = pAd->CommonCfg.Channel;\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"==>rt_ioctl_siwfreq::SIOCSIWFREQ(Channel=%d)\\n\", pAd->CommonCfg.Channel));\n    }\n    else\n        return NDIS_STATUS_FAILURE;\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWFREQ.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwfreq(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tUCHAR ch;\n\tULONG\tm = 2412000;\n\n\t\tch = pAd->CommonCfg.Channel;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"==>rt_ioctl_giwfreq  %d\\n\", ch));\n\n\tMAP_CHANNEL_ID_TO_KHZ(ch, m);\n\t*(ULONG *)pData = m;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWMODE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwmode(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tswitch(Data)\n\t{\n\t\tcase RTMP_CMD_STA_MODE_ADHOC:\n\t\t\tSet_NetworkType_Proc(pAd, \"Adhoc\");\n\t\t\tbreak;\n\t\tcase RTMP_CMD_STA_MODE_INFRA:\n\t\t\tSet_NetworkType_Proc(pAd, \"Infra\");\n\t\t\tbreak;\n\t\tcase RTMP_CMD_STA_MODE_MONITOR:\n\t\t\tSet_NetworkType_Proc(pAd, \"Monitor\");\n\t\t\tbreak;\n\t}\n\t\n\t/* Reset Ralink supplicant to not use, it will be set to start when UI set PMK key */\n\tpAd->StaCfg.WpaState = SS_NOTUSE;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWMODE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwmode(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tif (ADHOC_ON(pAd))\n\t\t*(ULONG *)pData = RTMP_CMD_STA_MODE_ADHOC;\n\telse if (INFRA_ON(pAd))\n\t\t*(ULONG *)pData = RTMP_CMD_STA_MODE_INFRA;\n\telse if (MONITOR_ON(pAd))\n\t\t*(ULONG *)pData = RTMP_CMD_STA_MODE_MONITOR;\n\telse\n\t\t*(ULONG *)pData = RTMP_CMD_STA_MODE_AUTO;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWAP.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwap(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tUCHAR *pBssid = (UCHAR *)pData;\n\n\n\tif (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)\n\t{\n\t\tRTMP_MLME_RESET_STATE_MACHINE(pAd);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! MLME busy, reset MLME state machine !!!\\n\"));\n\t}\n\n\t/* tell CNTL state machine to call NdisMSetInformationComplete() after completing */\n\t/* this request, because this request is initiated by NDIS. */\n\tpAd->MlmeAux.CurrReqIsFromNdis = FALSE; \n\t/* Prevent to connect AP again in STAMlmePeriodicExec */\n\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\n\tif (MAC_ADDR_EQUAL(pBssid, ZERO_MAC_ADDR))\n\t{\n\t\tif (INFRA_ON(pAd))\n\t\t{\n\t\t\tLinkDown(pAd, FALSE);\n\t\t}\n\t}\n\telse\n\t{\n\t\tMlmeEnqueue(pAd, \n\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\tOID_802_11_BSSID, \n\t\t\tsizeof(NDIS_802_11_MAC_ADDRESS),\n\t\t\t(VOID *)pBssid, 0);\n\t}\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWAP.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwap(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tif (INFRA_ON(pAd) || ADHOC_ON(pAd))\n\t\tNdisMoveMemory(pData, pAd->CommonCfg.Bssid, MAC_ADDR_LEN);\n#ifdef WPA_SUPPLICANT_SUPPORT    \n\t/* Add for RT2870 */\n\telse if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)\n\t\tNdisMoveMemory(pData, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\telse\n\t\treturn NDIS_STATUS_FAILURE;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWSCAN.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwscan(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\t/*\n\t\tCan not use SIOCGIWSCAN definition, it is used in wireless.h\n\t\tWe will not see the definition in MODULE.\n\t\tThe definition can be saw in UTIL and NETIF.\n\t*/\n/* #if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT) */\n\tRT_CMD_STA_IOCTL_SCAN *pConfig = (RT_CMD_STA_IOCTL_SCAN *)pData;\n\tint Status = NDIS_STATUS_SUCCESS;\n\n\n#ifdef ANDROID_SUPPORT\n\tif ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))\n#ifdef IFUP_IN_PROBE\n\t\t|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))\n\t\t|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\t|| (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))\n#endif /* IFUP_IN_PROBE */\n\t)\n\t{\n\t\tRtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_SCAN, -1, NULL, NULL, 0);\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n#endif /* ANDROID_SUPPORT */\n\n\tpConfig->Status = 0;\n\n\tif (MONITOR_ON(pAd))\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"!!! Driver is in Monitor Mode now !!!\\n\"));\n\t\tpConfig->Status = RTMP_IO_EINVAL;\n\t\treturn NDIS_STATUS_FAILURE;\n    }\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tif ((pAd->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE)\n\t{\n\t\tpAd->StaCfg.WpaSupplicantScanCount++;\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n    pAd->StaCfg.bSkipAutoScanConn = TRUE;\n\tdo{\n\n\t\tif ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&\n\t\t\t((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || \n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||\n\t\t\t\t(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) &&\t\n\t\t\t(pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\\n\"));\n\t\t\tStatus = NDIS_STATUS_SUCCESS;\n\t\t\tbreak;\n\t\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif (pConfig->FlgScanThisSsid)\n\t\t{\n\t\t\t\tNDIS_802_11_SSID          Ssid;\n\t\t\t\tSsid.SsidLength = pConfig->SsidLen;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"rt_ioctl_siwscan:: req.essid_len-%d, essid-%s\\n\", pConfig->SsidLen, pConfig->pSsid));\n\t\t\t\tNdisZeroMemory(&Ssid.Ssid, NDIS_802_11_LENGTH_SSID);\n\t\t\t\tNdisMoveMemory(Ssid.Ssid, pConfig->pSsid, Ssid.SsidLength);\n\t\t\t\tStaSiteSurvey(pAd, &Ssid, SCAN_ACTIVE);\n\t\t}\n\t\telse\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\t\tStaSiteSurvey(pAd, NULL, SCAN_ACTIVE);\n\t}while(0);\n\n\tpConfig->Status = Status;\n/* #endif */ /* SIOCGIWSCAN || RT_CFG80211_SUPPORT */\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSet the signal quality.\n\nArguments:\n\t*pSignal\t\t- signal structure\n\tpBssEntry\t\t- the BSS information\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic void set_quality(\n\tIN\tRT_CMD_STA_IOCTL_BSS\t*pSignal,\n\tIN\tPBSS_ENTRY\t\t\t\tpBssEntry)\n{\n\tmemcpy(pSignal->Bssid, pBssEntry->Bssid, MAC_ADDR_LEN);\n\n\t/* Normalize Rssi */\n\tif (pBssEntry->Rssi >= -50)\n        pSignal->ChannelQuality = 100;\n\telse if (pBssEntry->Rssi >= -80) /* between -50 ~ -80dbm */\n\t\tpSignal->ChannelQuality = (__u8)(24 + ((pBssEntry->Rssi + 80) * 26)/10);\n\telse if (pBssEntry->Rssi >= -90)   /* between -80 ~ -90dbm */\n        pSignal->ChannelQuality = (__u8)((pBssEntry->Rssi + 90) * 26)/10;   \n\telse\n\t\tpSignal->ChannelQuality = 0;\n        \n    pSignal->Rssi = (__u8)(pBssEntry->Rssi);\n\n    if (pBssEntry->Rssi >= -70)\n\t\tpSignal->Noise = -92;\n\telse\n\t\tpSignal->Noise = pBssEntry->Rssi - pBssEntry->MinSNR;\t\t\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWSCAN.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwscan(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SCAN_TABLE *pIoctlScan = (RT_CMD_STA_IOCTL_SCAN_TABLE *)pData;\n\tRT_CMD_STA_IOCTL_BSS_TABLE *pBssTable;\n\tPBSS_ENTRY pBssEntry;\n\tUINT32 IdBss;\n\n\n\tpIoctlScan->BssNr = 0;\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tif ((pAd->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE)\n\t{\n\t\tpAd->StaCfg.WpaSupplicantScanCount = 0;\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\tpIoctlScan->BssNr = pAd->ScanTab.BssNr;\n\tif (pIoctlScan->BssNr == 0)\n\t\treturn NDIS_STATUS_SUCCESS;\n\n\tos_alloc_mem(NULL, (UCHAR **)&(pIoctlScan->pBssTable),\n\t\t\t\tpAd->ScanTab.BssNr * sizeof(RT_CMD_STA_IOCTL_BSS_TABLE));\n\tif (pIoctlScan->pBssTable == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Allocate memory fail!\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tfor(IdBss=0; IdBss<pAd->ScanTab.BssNr; IdBss++)\n\t{\n\t\tHT_CAP_INFO capInfo = pAd->ScanTab.BssEntry[IdBss].HtCapability.HtCapInfo;\n\n\t\tpBssTable = pIoctlScan->pBssTable + IdBss;\n\t\tpBssEntry = &pAd->ScanTab.BssEntry[IdBss];\n\n\t\tmemcpy(pBssTable->Bssid, pBssEntry->Bssid, ETH_ALEN);\n\t\tpBssTable->Channel = pBssEntry->Channel;\n\t\tpBssTable->BssType = pBssEntry->BssType;\n\t\tpBssTable->HtCapabilityLen = pBssEntry->HtCapabilityLen;\n\t\tmemcpy(pBssTable->SupRate, pBssEntry->SupRate, 12);\n\t\tpBssTable->SupRateLen = pBssEntry->SupRateLen;\n\t\tmemcpy(pBssTable->ExtRate, pBssEntry->ExtRate, 12);\n\t\tpBssTable->ExtRateLen = pBssEntry->ExtRateLen;\n\t\tpBssTable->SsidLen = pBssEntry->SsidLen;\n\t\tmemcpy(pBssTable->Ssid, pBssEntry->Ssid, 32);\n\t\tpBssTable->CapabilityInfo = pBssEntry->CapabilityInfo;\n\t\tpBssTable->ChannelWidth = capInfo.ChannelWidth;\n\t\tpBssTable->ShortGIfor40 = capInfo.ShortGIfor40;\n\t\tpBssTable->ShortGIfor20 = capInfo.ShortGIfor20;\n\t\tpBssTable->MCSSet = pBssEntry->HtCapability.MCSSet[1];\n\t\tpBssTable->WpaIeLen = pBssEntry->WpaIE.IELen;\n\t\tpBssTable->pWpaIe = pBssEntry->WpaIE.IE;\n\t\tpBssTable->RsnIeLen = pBssEntry->RsnIE.IELen;\n\t\tpBssTable->pRsnIe = pBssEntry->RsnIE.IE;\n\t\tpBssTable->WpsIeLen = pBssEntry->WpsIE.IELen;\n\t\tpBssTable->pWpsIe = pBssEntry->WpsIE.IE;\n\t\tpBssTable->FlgIsPrivacyOn = CAP_IS_PRIVACY_ON(pBssEntry->CapabilityInfo);\n\t\tset_quality(&pBssTable->Signal, pBssEntry);\n\t}\n\n\tmemcpy(pIoctlScan->MainSharedKey[0], pAd->SharedKey[BSS0][0].Key, 16);\n\tmemcpy(pIoctlScan->MainSharedKey[1], pAd->SharedKey[BSS0][1].Key, 16);\n\tmemcpy(pIoctlScan->MainSharedKey[2], pAd->SharedKey[BSS0][2].Key, 16);\n\tmemcpy(pIoctlScan->MainSharedKey[3], pAd->SharedKey[BSS0][3].Key, 16);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWESSID.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwessid(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SSID *pSsid = (RT_CMD_STA_IOCTL_SSID *)pData;\n\n\tif (pSsid->FlgAnySsid)\n\t{\n\t\tPSTRING\tpSsidString = NULL;\n\n\t\t/* Includes null character. */\n/*\t\t\t\tpSsidString = kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG); */\n\t\tos_alloc_mem(NULL, (UCHAR **)&pSsidString, MAX_LEN_OF_SSID+1);\n\t\tif (pSsidString)\n\t\t{\n\t\t\tNdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);\n\t\t\tNdisMoveMemory(pSsidString, pSsid->pSsid, pSsid->SsidLen);\n\t\t\tif (Set_SSID_Proc(pAd, pSsidString) == FALSE)\n\t\t\t{\n\t\t\t\tos_free_mem(NULL, pSsidString);\n\t\t\t\tpSsid->Status = RTMP_IO_EINVAL;\n\t\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t\t}\n\t\t\tos_free_mem(NULL, pSsidString);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpSsid->Status = RTMP_IO_ENOMEM;\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* ANY ssid */\n\t\tif (Set_SSID_Proc(pAd, \"\") == FALSE)\n\t\t{\n\t\t\tpSsid->Status = RTMP_IO_EINVAL;\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t}\n\t}\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWESSID.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwessid(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SSID *pSsid = (RT_CMD_STA_IOCTL_SSID *)pData;\n\n\tif (MONITOR_ON(pAd))\n\t{\n\t\tpSsid->SsidLen = 0;\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\n\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"MediaState is connected\\n\"));\n#ifdef CONFIG_MULTI_CHANNEL\n\tif (pAd->Multi_Channel_Enable == TRUE)\n\t{\n\t\tMultiChannelTimerStop(pAd);\n\t\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t    (pAd->StaCfg.WscControl.bWscTrigger\n\t\t    )) \n\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t (\"WSC trigger not set Multi-channel!!\\n\"));\n\t\t}\n\t\telse if (P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tRTMPSetTimer(&pAd->Mlme.MCCTimer, pAd->Mlme.EDCAToHCCATimerValue);\n\n\t\t}\n\t\tpAd->Mlme.StaStayTick = 0;\n\t\tif (P2P_CLI_ON(pAd))\n\t\t\tpAd->StaCfg.bAutoReconnect = FALSE;\n\t}\n#endif /* CONFIG_MULTI_CHANNEL */\n\n\t\tpSsid->SsidLen = pAd->CommonCfg.SsidLen;\n\t\tmemcpy(pSsid->pSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t}\n#ifdef RTMP_MAC_USB\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t/* Add for RT2870 */\n\telse if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)\n\t{\n\t\tpSsid->SsidLen = pAd->CommonCfg.SsidLen;\n\t\tmemcpy(pSsid->pSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#endif /* RTMP_MAC_USB */\n\telse\n\t{/*the ANY ssid was specified */\n\t\tpSsid->SsidLen = 0;\n\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"MediaState is not connected, ess\\n\"));\n\t}\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWNICKN.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwnickn(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tmemset(pAd->nickname, 0, IW_ESSID_MAX_SIZE + 1);\n\tmemcpy(pAd->nickname, pData, Data);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWNICKN.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwnickn(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_NICK_NAME *IoctlName = (RT_CMD_STA_IOCTL_NICK_NAME *)pData;\n\n\n\tif (IoctlName->NameLen > strlen((PSTRING) pAd->nickname) + 1)\n\t\tIoctlName->NameLen = strlen((PSTRING) pAd->nickname) + 1;\n\tif (IoctlName->NameLen > 0) {\n\t\tmemcpy(IoctlName->pName, pAd->nickname, IoctlName->NameLen-1);\n\t\tIoctlName->pName[IoctlName->NameLen-1] = '\\0';\n\t}\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWRTS.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwrts(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tpAd->CommonCfg.RtsThreshold = Data;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWRTS.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwrts(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\t*(USHORT *)pData = pAd->CommonCfg.RtsThreshold;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWFRAG.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwfrag(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tpAd->CommonCfg.FragmentThreshold = Data;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWFRAG.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwfrag(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\t*(USHORT *)pData = pAd->CommonCfg.FragmentThreshold;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWENCODE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\n#define NR_WEP_KEYS \t\t\t\t4\n#define MAX_WEP_KEY_SIZE\t\t\t13\n#define MIN_WEP_KEY_SIZE\t\t\t5\nINT\nRtmpIoctl_rt_ioctl_siwencode(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SECURITY *pIoctlSec = (RT_CMD_STA_IOCTL_SECURITY *)pData;\n\n\n\tif ((pIoctlSec->length == 0) &&\n        (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_DISABLED))\n\t{\n\t\tpAd->StaCfg.PairCipher = Ndis802_11WEPDisabled;\n\t\tpAd->StaCfg.GroupCipher = Ndis802_11WEPDisabled;\n\t\tpAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;\n        pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n        goto done;\n\t}\n\telse if (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_RESTRICTED ||\n\t\t\t\tpIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_OPEN)\n\t{\n\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n\t\tpAd->StaCfg.PairCipher = Ndis802_11WEPEnabled;\n\t\tpAd->StaCfg.GroupCipher = Ndis802_11WEPEnabled;\n\t\tpAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;\n\t\tif (pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_RESTRICTED)\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;\n    \telse\n\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n\t}\n    \n    if (pIoctlSec->length > 0) \n\t{\n\t\tint keyIdx = pIoctlSec->KeyIdx; /*(erq->flags & IW_ENCODE_INDEX) - 1; */\n\t\t/* Check the size of the key */\n\t\tif (pIoctlSec->length > MAX_WEP_KEY_SIZE) \n\t\t{\n\t\t\tpIoctlSec->Status = RTMP_IO_EINVAL;\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t}\n\t\t/* Check key index */\n\t\tif ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS))\n        {\n            DBGPRINT(RT_DEBUG_TRACE ,(\"==>rt_ioctl_siwencode::Wrong keyIdx=%d! Using default key instead (%d)\\n\", \n                                        keyIdx, pAd->StaCfg.DefaultKeyId));\n            \n            /*Using default key */\n\t\t\tkeyIdx = pAd->StaCfg.DefaultKeyId;   \n        }\n\t\telse\n\t\t\tpAd->StaCfg.DefaultKeyId = keyIdx;\n\n        NdisZeroMemory(pAd->SharedKey[BSS0][keyIdx].Key,  16);\n\t\t\n\t\tif (pIoctlSec->length == MAX_WEP_KEY_SIZE)\n        {      \n\t\t\tpAd->SharedKey[BSS0][keyIdx].KeyLen = MAX_WEP_KEY_SIZE;\n            pAd->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP128;\n\t\t}\n\t\telse if (pIoctlSec->length == MIN_WEP_KEY_SIZE)\n        {      \n            pAd->SharedKey[BSS0][keyIdx].KeyLen = MIN_WEP_KEY_SIZE;\n            pAd->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP64;\n\t\t}\n\t\telse\n\t\t\t/* Disable the key */\n\t\t\tpAd->SharedKey[BSS0][keyIdx].KeyLen = 0;\n\n\t\t/* Check if the key is not marked as invalid */\n\t\tif(!(pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_NOKEY)) \n\t\t{\n\t\t\t/* Copy the key in the driver */\n\t\t\tNdisMoveMemory(pAd->SharedKey[BSS0][keyIdx].Key, pIoctlSec->pData, pIoctlSec->length);\n        }\n\t} \n    else \n\t\t\t{\n\t\t/* Do we want to just set the transmit key index ? */\n\t\tint index = pIoctlSec->KeyIdx; /*(erq->flags & IW_ENCODE_INDEX) - 1; */\n\t\tif ((index >= 0) && (index < 4)) \n        {      \n\t\t\tpAd->StaCfg.DefaultKeyId = index;\n            }\n        else\n\t\t\t/* Don't complain if only change the mode */\n\t\tif(!(pIoctlSec->flags & RT_CMD_STA_IOCTL_SECURITY_MODE))\n\t\t{\n\t\t\tpIoctlSec->Status = RTMP_IO_EINVAL;\n\t\t\treturn NDIS_STATUS_SUCCESS;\n\t\t}\n\t}\n\t\t\ndone:\n    DBGPRINT(RT_DEBUG_TRACE ,(\"==>rt_ioctl_siwencode::erq->flags=%x\\n\",pIoctlSec->flags));\n\tDBGPRINT(RT_DEBUG_TRACE ,(\"==>rt_ioctl_siwencode::AuthMode=%x\\n\",pAd->StaCfg.AuthMode));\n\tDBGPRINT(RT_DEBUG_TRACE ,(\"==>rt_ioctl_siwencode::DefaultKeyId=%x, KeyLen = %d\\n\",pAd->StaCfg.DefaultKeyId , pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen));\n\tDBGPRINT(RT_DEBUG_TRACE ,(\"==>rt_ioctl_siwencode::WepStatus=%x\\n\",pAd->StaCfg.WepStatus));\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWENCODE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwencode(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SECURITY *pIoctlSec = (RT_CMD_STA_IOCTL_SECURITY *)pData;\n\tint kid;\n\n\n\tkid = pIoctlSec->KeyIdx; /*erq->flags & IW_ENCODE_INDEX; */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"===>rt_ioctl_giwencode %d\\n\", kid));\n\n\tif (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled)\n\t{\n\t\tpIoctlSec->length = 0;\n\t\tpIoctlSec->flags = RT_CMD_STA_IOCTL_SECURITY_DISABLED;\n\t} \n\telse if ((kid > 0) && (kid <=4))\n\t{\n\t\t/* copy wep key */\n\t\tpIoctlSec->KeyIdx = kid;\n\t\tif (pIoctlSec->length > pAd->SharedKey[BSS0][kid-1].KeyLen)\n\t\t\tpIoctlSec->length = pAd->SharedKey[BSS0][kid-1].KeyLen;\n\t\tmemcpy(pIoctlSec->pData, pAd->SharedKey[BSS0][kid-1].Key, pIoctlSec->length);\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared)\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_RESTRICTED;\t\t/* XXX */\n\t\telse\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_OPEN;\t\t/* XXX */\n\t\t\n\t}\n\telse if (kid == 0)\n\t{\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared)\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_RESTRICTED;\t\t/* XXX */\n\t\telse\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_OPEN;\t\t/* XXX */\n\t\tpIoctlSec->length = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen;\n\t\tmemcpy(pIoctlSec->pData, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, pIoctlSec->length);\n\t\t/* copy default key ID */\n\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared)\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_RESTRICTED;\t\t/* XXX */\n\t\telse\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_OPEN;\t\t/* XXX */\n\t\tpIoctlSec->KeyIdx = pAd->StaCfg.DefaultKeyId + 1;\t\t\t/* NB: base 1 */\n\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_ENABLED;\t/* XXX */\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWMLME.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwmlme(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData,\n\tIN\tUINT32\t\t\t\t\tSubcmd)\n{\n\tMLME_QUEUE_ELEM\t\t\t\t*pMsgElem = NULL;\n\tMLME_DISASSOC_REQ_STRUCT\tDisAssocReq;\n\tMLME_DEAUTH_REQ_STRUCT      DeAuthReq;\n\tULONG\t\t\t\t\t\treason_code = (ULONG)Data;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&pMsgElem, sizeof(MLME_QUEUE_ELEM));\n\tif (pMsgElem == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\tswitch(Subcmd)\n\t{\n\t\tcase RT_CMD_STA_IOCTL_IW_MLME_DEAUTH:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s - IW_MLME_DEAUTH\\n\", __FUNCTION__));\n\t\t\tCOPY_MAC_ADDR(DeAuthReq.Addr, pAd->CommonCfg.Bssid);\n\t\t\tDeAuthReq.Reason = reason_code;\n\t\t\tpMsgElem->MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT);\n\t\t\tNdisMoveMemory(pMsgElem->Msg, &DeAuthReq, sizeof(MLME_DEAUTH_REQ_STRUCT));\n\t\t\tMlmeDeauthReqAction(pAd, pMsgElem);\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t{\n\t\t\t    LinkDown(pAd, FALSE);\n\t\t\t    pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RT_CMD_STA_IOCTL_IW_MLME_DISASSOC:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s - IW_MLME_DISASSOC\\n\", __FUNCTION__));\n\t\t\tNdisZeroMemory(pAd->StaCfg.ConnectinfoSsid, MAX_LEN_OF_SSID);\n\t\t\tNdisZeroMemory(pAd->StaCfg.ConnectinfoBssid, MAC_ADDR_LEN);\n\t\t\tpAd->StaCfg.ConnectinfoSsidLen  = 0;\n\t\t\tpAd->StaCfg.ConnectinfoBssType  = 1;\n\t\t\tpAd->StaCfg.ConnectinfoChannel = 0;\n\t\t\t\n\t\t\tCOPY_MAC_ADDR(DisAssocReq.Addr, pAd->CommonCfg.Bssid);\n\t\t\tDisAssocReq.Reason =  reason_code;\n\n\t\t\tpMsgElem->Machine = ASSOC_STATE_MACHINE;\n\t\t\tpMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;\n\t\t\tpMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);\n\t\t\tNdisMoveMemory(pMsgElem->Msg, &DisAssocReq, sizeof(MLME_DISASSOC_REQ_STRUCT));\n\n\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;\n\t\t\tMlmeDisassocReqAction(pAd, pMsgElem);\n\t\t\tbreak;\n\t}\n\t\n\tif (pMsgElem != NULL)\n\t\tos_free_mem(NULL, pMsgElem);\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWAUTH.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwauth(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SECURITY_ADV *pIoctlWpa = (RT_CMD_STA_IOCTL_SECURITY_ADV *)pData;\n\n\n\tswitch (pIoctlWpa->flags)\n\t{\n    \tcase RT_CMD_STA_IOCTL_WPA_VERSION:\n            if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_VERSION1)\n            {            \n                pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;\n\t\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_VERSION2)\n                pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;\n\t\t\t\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_WPA_VERSION - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n            break;\n    \tcase RT_CMD_STA_IOCTL_WPA_PAIRWISE:\n            if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_PAIRWISE_NONE)\n            {\n                pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;\n                pAd->StaCfg.PairCipher = Ndis802_11WEPDisabled;\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP40 ||\n                     pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP104)\n            {\n                pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;\n                pAd->StaCfg.PairCipher = Ndis802_11WEPEnabled;\n#ifdef WPA_SUPPLICANT_SUPPORT                \n                pAd->StaCfg.IEEE8021X = FALSE;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_PAIRWISE_TKIP)\n            {\n                pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;\n                pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_PAIRWISE_CCMP)\n            {\n                pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;\n                pAd->StaCfg.PairCipher = Ndis802_11Encryption3Enabled;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_CIPHER_PAIRWISE - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n            break;\n    \tcase RT_CMD_STA_IOCTL_WPA_GROUP:\n            if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_GROUP_NONE)\n            {\n                pAd->StaCfg.GroupCipher = Ndis802_11WEPDisabled;\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_GROUP_WEP40)\n            {\n                pAd->StaCfg.GroupCipher = Ndis802_11GroupWEP40Enabled;\n            }\n\t\t\telse if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_GROUP_WEP104)\n            {\n\t\t\t\tpAd->StaCfg.GroupCipher = Ndis802_11GroupWEP104Enabled;\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_GROUP_TKIP)\n            {\n                pAd->StaCfg.GroupCipher = Ndis802_11Encryption2Enabled;\n            }\n            else if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_GROUP_CCMP)\n            {\n                pAd->StaCfg.GroupCipher = Ndis802_11Encryption3Enabled;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_CIPHER_GROUP - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n            break;\n    \tcase RT_CMD_STA_IOCTL_WPA_KEY_MGMT:\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n\t\t\t//pAd->StaCfg.WpaSupplicantUP &= 0x7F;\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n            if (pIoctlWpa->value == RT_CMD_STA_IOCTL_WPA_KEY_MGMT_1X)\n            { \n                if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)\n                {\n                    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;\n#ifdef WPA_SUPPLICANT_SUPPORT                    \n                    pAd->StaCfg.IEEE8021X = FALSE;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n                }\n                else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n                {\n                    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;\n#ifdef WPA_SUPPLICANT_SUPPORT\n                    pAd->StaCfg.IEEE8021X = FALSE;\n#endif /* WPA_SUPPLICANT_SUPPORT */\n                }\n#ifdef WPA_SUPPLICANT_SUPPORT                \n                else\n                    /* WEP 1x */\n                    pAd->StaCfg.IEEE8021X = TRUE;\n#endif /* WPA_SUPPLICANT_SUPPORT */                \n            }\n#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n            else if (pIoctlWpa->value == 0)\n            {\n\t\t\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n            }\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_KEY_MGMT - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n            break;\n    \tcase RT_CMD_STA_IOCTL_WPA_AUTH_RX_UNENCRYPTED_EAPOL:\n            break;\n    \tcase RT_CMD_STA_IOCTL_WPA_AUTH_PRIVACY_INVOKED:\n            /*if (pIoctlWpa->value == 0)\n\t\t\t{\n                pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;\n                pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;\n                pAd->StaCfg.PairCipher = Ndis802_11WEPDisabled;\n        \t    pAd->StaCfg.GroupCipher = Ndis802_11WEPDisabled;\n            }*/            \n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_PRIVACY_INVOKED - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n    \t\tbreak;\n    \tcase RT_CMD_STA_IOCTL_WPA_AUTH_DROP_UNENCRYPTED:\n            if (pIoctlWpa->value != 0)\n                pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t}\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_DROP_UNENCRYPTED - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n    \t\tbreak;\n    \tcase RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG: \n\t\t\t\tpAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_80211_AUTH_ALG - param->value = %d!\\n\", __FUNCTION__, pIoctlWpa->value));\n\t\t\tbreak;\n    \tcase RT_CMD_STA_IOCTL_WPA_AUTH_WPA_ENABLED:\n    \t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_AUTH_WPA_ENABLED - Driver supports WPA!(param->value = %d)\\n\", __FUNCTION__, pIoctlWpa->value));\n    \t\tbreak;\n\tcase RT_CMD_STA_IOCTL_WPA_AUTH_COUNTERMEASURES:\n\t\tif (pIoctlWpa->value == 1 )\n\t\t\tpAd->StaCfg.bBlockAssoc = TRUE;\n\t\telse\t\n\t\t\tpAd->StaCfg.bBlockAssoc = FALSE;\n}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWAUTH.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwauth(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SECURITY_ADV *pIoctlWpa = (RT_CMD_STA_IOCTL_SECURITY_ADV *)pData;\n\n\n\tswitch (pIoctlWpa->flags) {\n\tcase RT_CMD_STA_IOCTL_WPA_AUTH_DROP_UNENCRYPTED:\n        pIoctlWpa->value = (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled) ? 0 : 1;\n\t\tbreak;\n\n\tcase RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG:\n        pIoctlWpa->value = (pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) ? 0 : 1;\n\t\tbreak;\n\n\tcase RT_CMD_STA_IOCTL_WPA_AUTH_WPA_ENABLED:\n\t\tpIoctlWpa->value = (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) ? 1 : 0;\n\t\tbreak;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSet security key.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tkeyIdx\t\t\t- key index\n\tCipherAlg\t\t- cipher algorithm\n\tbGTK\t\t\t- 1: the key is group key\n\t*pKey\t\t\t- the key\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nvoid fnSetCipherKey(\n    IN  PRTMP_ADAPTER   pAd,\n    IN  INT             keyIdx,    \n    IN  UCHAR           CipherAlg,\n    IN  BOOLEAN         bGTK,\n    IN  UCHAR\t\t\t*pKey)\n{\n    NdisZeroMemory(&pAd->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY));\n    pAd->SharedKey[BSS0][keyIdx].KeyLen = LEN_TK;\n    NdisMoveMemory(pAd->SharedKey[BSS0][keyIdx].Key, pKey, LEN_TK);\n    NdisMoveMemory(pAd->SharedKey[BSS0][keyIdx].TxMic, pKey + LEN_TK, LEN_TKIP_MIC);\n    NdisMoveMemory(pAd->SharedKey[BSS0][keyIdx].RxMic, pKey + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);\n    pAd->SharedKey[BSS0][keyIdx].CipherAlg = CipherAlg;\n\n    /* Update group key information to ASIC Shared Key Table */\n\tAsicAddSharedKeyEntry(pAd, \n\t\t\t\t\t\t  BSS0, \n\t\t\t\t\t\t  keyIdx, \n\t\t\t\t\t\t  &pAd->SharedKey[BSS0][keyIdx]);\n\t\t\t\n\t/* Update ASIC WCID attribute table and IVEIV table */\n\tif (!bGTK)\n\t\tRTMPSetWcidSecurityInfo(pAd, \n\t    \t\t\t\t\t\tBSS0, \n\t    \t\t\t\t\t\tkeyIdx, \n\t    \t\t\t\t\t\tpAd->SharedKey[BSS0][keyIdx].CipherAlg, \n\t       \t\t\t\t\t\tBSSID_WCID, \n\t       \t\t\t\t\t\tSHAREDKEYTABLE);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWENCODEEXT.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwencodeext(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SECURITY *pIoctlSec = (RT_CMD_STA_IOCTL_SECURITY *)pData;\n    int keyIdx;\n\n\n    if (pIoctlSec->flags == RT_CMD_STA_IOCTL_SECURITY_DISABLED)\n\t{\n        keyIdx = pIoctlSec->KeyIdx; /*(encoding->flags & IW_ENCODE_INDEX) - 1; */\n        /* set BSSID wcid entry of the Pair-wise Key table as no-security mode */\n\t    AsicRemovePairwiseKeyEntry(pAd, BSSID_WCID);\n        pAd->SharedKey[BSS0][keyIdx].KeyLen = 0;\n\t\tpAd->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_NONE;\n\t\tAsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)keyIdx);\n        NdisZeroMemory(&pAd->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY));\n        DBGPRINT(RT_DEBUG_TRACE, (\"%s::Remove all keys!\\n\", __FUNCTION__));\n    }\n\telse\n    {\n        /* Get Key Index and convet to our own defined key index */\n    \tkeyIdx = pIoctlSec->KeyIdx; /*(encoding->flags & IW_ENCODE_INDEX) - 1; */\n    \tif((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS))\n    \t\treturn NDIS_STATUS_FAILURE;\n\t\t\t\t\t\n        if (pIoctlSec->ext_flags & RT_CMD_STA_IOCTL_SECURTIY_EXT_SET_TX_KEY)\n        {\n            pAd->StaCfg.DefaultKeyId = keyIdx;\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s::DefaultKeyId = %d\\n\", __FUNCTION__, pAd->StaCfg.DefaultKeyId));\n        }\n\n        switch (pIoctlSec->Alg) {\n    \t\tcase RT_CMD_STA_IOCTL_SECURITY_ALG_NONE:\n                DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_ENCODE_ALG_NONE\\n\", __FUNCTION__));\n    \t\t\tbreak;\n    \t\tcase RT_CMD_STA_IOCTL_SECURITY_ALG_WEP:\n                DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_ENCODE_ALG_WEP - ext->key_len = %d, keyIdx = %d\\n\", __FUNCTION__, pIoctlSec->length, keyIdx));\n    \t\t\tif (pIoctlSec->length == MAX_WEP_KEY_SIZE)\n                {      \n        \t\t\tpAd->SharedKey[BSS0][keyIdx].KeyLen = MAX_WEP_KEY_SIZE;\n                    pAd->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP128;\n\t\t\t\t}\n        \t\telse if (pIoctlSec->length == MIN_WEP_KEY_SIZE)\n                {      \n                    pAd->SharedKey[BSS0][keyIdx].KeyLen = MIN_WEP_KEY_SIZE;\n                    pAd->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP64;\n\t\t\t\t}\n        \t\telse\n                    return NDIS_STATUS_FAILURE;\n                                \n                NdisZeroMemory(pAd->SharedKey[BSS0][keyIdx].Key,  16);\n\t\t\t    NdisMoveMemory(pAd->SharedKey[BSS0][keyIdx].Key, pIoctlSec->pData, pIoctlSec->length);\n\n\t\t\t\tif ((pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled) ||\n\t\t\t\t\t(pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled))\t\t\t\t\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t/* Set Group key material to Asic */\n\t\t\t\t\tAsicAddSharedKeyEntry(pAd, BSS0, keyIdx, &pAd->SharedKey[BSS0][keyIdx]);\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t/* Assign pairwise key info */\n\t\t\t\t\tRTMPSetWcidSecurityInfo(pAd,\n\t\t\t\t\t\t\t\t\t\t \tBSS0, \n\t\t\t\t\t\t\t\t\t\t \tkeyIdx, \n\t\t\t\t\t\t\t\t\t\t \tpAd->SharedKey[BSS0][keyIdx].CipherAlg, \t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t \tBSSID_WCID, \n\t\t\t\t\t\t\t\t\t\t \tSHAREDKEYTABLE);\n\n\t\t\t\t\tSTA_PORT_SECURED(pAd);\t\t\t\t\t    \t\t\t\t\n\t\t\t\t}\n    \t\t\tbreak;\n            case RT_CMD_STA_IOCTL_SECURITY_ALG_TKIP:\n                DBGPRINT(RT_DEBUG_TRACE, (\"%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\\n\", __FUNCTION__, keyIdx, pIoctlSec->length));\n                if (pIoctlSec->length == 32)\n                {\n                \tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n                \t{\n                \t\tRTMPZeroMemory(pAd->StaCfg.PMK, LEN_PMK);\n                \t\tRTMPMoveMemory(pAd->StaCfg.PMK, pIoctlSec->pData, pIoctlSec->length);\n                \t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t                    if (pIoctlSec->ext_flags & RT_CMD_STA_IOCTL_SECURTIY_EXT_SET_TX_KEY)\n\t                    {\n\t                        fnSetCipherKey(pAd, keyIdx, CIPHER_TKIP, FALSE, pIoctlSec->pData);\n\t                        if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2)\n\t                        {\n\t                            STA_PORT_SECURED(pAd);\n\t                        }\n\t\t\t\t\t\t}\n\t                    else if (pIoctlSec->ext_flags & RT_CMD_STA_IOCTL_SECURTIY_EXT_GROUP_KEY)\n\t                    {\n\t                        fnSetCipherKey(pAd, keyIdx, CIPHER_TKIP, TRUE, pIoctlSec->pData);\n\t\t\t\n\t                        /* set 802.1x port control */\n\t            \t        STA_PORT_SECURED(pAd);\n\t                    }\n\t\t\t\t\t}\n                }\n                else\n                    return NDIS_STATUS_FAILURE;\n                break;\n            case RT_CMD_STA_IOCTL_SECURITY_ALG_CCMP:\n\t\t\t\tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n            \t{\n            \t\tRTMPZeroMemory(pAd->StaCfg.PMK, LEN_PMK);\n            \t\tRTMPMoveMemory(pAd->StaCfg.PMK, pIoctlSec->pData, pIoctlSec->length);\n            \t}\n\t\t\t\telse\n\t\t\t\t{\n\t                if (pIoctlSec->ext_flags & RT_CMD_STA_IOCTL_SECURTIY_EXT_SET_TX_KEY)\n\t\t\t\t\t{\n\t                    fnSetCipherKey(pAd, keyIdx, CIPHER_AES, FALSE, pIoctlSec->pData);\n\t                    if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2)\n\t\t\t\t\t\t{\n\t                    \tSTA_PORT_SECURED(pAd);\n\t\t\t\t\t\t}\n\t                }\n\t                else if (pIoctlSec->ext_flags & RT_CMD_STA_IOCTL_SECURTIY_EXT_GROUP_KEY)\n\t                {\n\t                    fnSetCipherKey(pAd, keyIdx, CIPHER_AES, TRUE, pIoctlSec->pData);\n\t                    \n\t                    /* set 802.1x port control */\n\t        \t        STA_PORT_SECURED(pAd);\n\t                }\n\t\t\t\t}\n                break;\n    \t\tdefault:\n    \t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n    }\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWENCODEEXT.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwencodeext(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_SECURITY *pIoctlSec = (RT_CMD_STA_IOCTL_SECURITY *)pData;\n\tint idx;\n\n\n\tidx = pIoctlSec->KeyIdx;\n\tif (idx) \n\t{\n\t\tif (idx < 1 || idx > 4)\n\t\t{\n\t\t\tpIoctlSec->Status = RTMP_IO_EINVAL;\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\tidx--;\n\n\t\tif ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) ||\n\t\t\t(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled))\n\t\t{\n\t\t\tif (idx != pAd->StaCfg.DefaultKeyId)\n\t\t\t{\n\t\t\t\tpIoctlSec->Status = 0;\n\t\t\t\tpIoctlSec->length = 0;\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t}\n\t\t}\n\t} \n\telse\n\t\tidx = pAd->StaCfg.DefaultKeyId;\n\n\tpIoctlSec->KeyIdx = idx + 1;\n\n\tpIoctlSec->length = 0;\n\tswitch(pAd->StaCfg.WepStatus) {\n\t\tcase Ndis802_11WEPDisabled:\n\t\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_NONE;\n\t\t\tpIoctlSec->flags |= RT_CMD_STA_IOCTL_SECURITY_DISABLED;\t\t\n\t\t\tbreak;\n\t\tcase Ndis802_11WEPEnabled:\n\t\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_WEP;\n\t\t\tif (pAd->SharedKey[BSS0][idx].KeyLen > pIoctlSec->MaxKeyLen)\n\t\t\t{\n\t\t\t\tpIoctlSec->Status = RTMP_IO_E2BIG;\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpIoctlSec->length = pAd->SharedKey[BSS0][idx].KeyLen;\t\t\t\t\n\t\t\t\tpIoctlSec->pData = (PCHAR)&(pAd->SharedKey[BSS0][idx].Key[0]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Ndis802_11Encryption2Enabled:\n\t\tcase Ndis802_11Encryption3Enabled:\n\t\t\tif (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)\n\t\t\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_TKIP;\n\t\t\telse\n\t\t\t\tpIoctlSec->Alg = RT_CMD_STA_IOCTL_SECURITY_ALG_CCMP;\n\t\t\t\n\t\t\tif (pIoctlSec->MaxKeyLen < 32)\n\t\t\t{\n\t\t\t\tpIoctlSec->Status = RTMP_IO_E2BIG;\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpIoctlSec->length = 32;\n\t\t\t\tpIoctlSec->pData = (PCHAR)&pAd->StaCfg.PMK[0];\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpIoctlSec->Status = RTMP_IO_EINVAL;\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWGENIE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwgenie(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\tULONG length = (ULONG)Data;\n\tPEID_STRUCT\t\teid_ptr;\n\tUCHAR WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04};\n\n\tif (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"===> rt_ioctl_siwgenie\\n\"));\n\t\tpAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;\n\t\tpAd->StaCfg.WpaSupplicantUP &= ~WPA_SUPPLICANT_ENABLE_WPS;\n\t\tif ((length > 0) &&\n\t\t    (pData == NULL))\n\t\t{\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t\telse if (length) \n\t\t{\n\t\t\tif (pAd->StaCfg.pWpaAssocIe)\n\t\t\t{\n\t\t\t\tos_free_mem(NULL, pAd->StaCfg.pWpaAssocIe);\n\t\t\t\tpAd->StaCfg.pWpaAssocIe = NULL;\n\t\t\t}\n/*\t\t\tpAd->StaCfg.pWpaAssocIe = kmalloc(wrqu->data.length, MEM_ALLOC_FLAG); */\n\t\t\tos_alloc_mem(NULL, (UCHAR **)&pAd->StaCfg.pWpaAssocIe, length);\n\t\t\tif (pAd->StaCfg.pWpaAssocIe)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.WpaAssocIeLen = length;\n\t\t\t\tNdisMoveMemory(pAd->StaCfg.pWpaAssocIe, pData, pAd->StaCfg.WpaAssocIeLen);\n\t\t\t\tpAd->StaCfg.bRSN_IE_FromWpaSupplicant = TRUE;\n\t\t\t\teid_ptr = pAd->StaCfg.pWpaAssocIe;\n\t\t\t\twhile (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < ((UCHAR *)pAd->StaCfg.pWpaAssocIe + pAd->StaCfg.WpaAssocIeLen))\n\t\t\t\t{\n\t\t\t\t\tif ( eid_ptr->Eid == IE_WPA )\n\t\t\t\t\t{\n\t\t\t\t\t\tif (NdisEqualMemory(eid_ptr->Octet, WPS_OUI, 4))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaCfg.WpaSupplicantUP |= WPA_SUPPLICANT_ENABLE_WPS;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"WPA_SUPPLICANT_ENABLE_WPS!\\n\"));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\teid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);   \n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t\tpAd->StaCfg.WpaAssocIeLen = 0;\n\t\t}\n\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWGENIE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwgenie(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_RSN_IE *IoctlRsnIe = (RT_CMD_STA_IOCTL_RSN_IE *)pData;\n\n\n\tif ((pAd->StaCfg.RSNIE_Len == 0) ||\n\t\t(pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA))\n\t{\n\t\tIoctlRsnIe->length = 0;\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t/*\n\t\tCan not use SIOCSIWGENIE definition, it is used in wireless.h\n\t\tWe will not see the definition in MODULE.\n\t\tThe definition can be saw in UTIL and NETIF.\n\t*/\n/* #ifdef SIOCSIWGENIE */\n\tif ((pAd->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE &&\n\t\t(pAd->StaCfg.WpaAssocIeLen > 0))\n\t{\n\t\tif (IoctlRsnIe->length < pAd->StaCfg.WpaAssocIeLen)\n\t\t\treturn NDIS_STATUS_FAILURE;\n\n\t\tIoctlRsnIe->length = pAd->StaCfg.WpaAssocIeLen;\n\t\tmemcpy(IoctlRsnIe->pRsnIe, pAd->StaCfg.pWpaAssocIe, pAd->StaCfg.WpaAssocIeLen);\n\t}\n\telse\n/* #endif */ /* SIOCSIWGENIE */\n#endif /* NATIVE_WPA_SUPPLICANT_SUPPORT */\n\t{\n\t\tUCHAR RSNIe = IE_WPA;\n\t\t\n\t\tif (IoctlRsnIe->length < (pAd->StaCfg.RSNIE_Len + 2)) /* ID, Len */\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\tIoctlRsnIe->length = pAd->StaCfg.RSNIE_Len + 2;\n\t\t\n\t\tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||\n            (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))\n\t\t\tRSNIe = IE_RSN;\n\t\t\n\t\tIoctlRsnIe->pRsnIe[0] = (char)RSNIe;\n\t\tIoctlRsnIe->pRsnIe[1] = pAd->StaCfg.RSNIE_Len;\n\t\tmemcpy(IoctlRsnIe->pRsnIe+2, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len);\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWPMKSA.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwpmksa(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_STA_IOCTL_PMA_SA *pIoctlPmaSa = (RT_CMD_STA_IOCTL_PMA_SA *)pData;\n\tINT\tCachedIdx = 0, idx = 0;\n\n\n\tswitch(pIoctlPmaSa->Cmd)\n\t{\n\t\tcase RT_CMD_STA_IOCTL_PMA_SA_FLUSH:\n\t\t\tNdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"rt_ioctl_siwpmksa - IW_PMKSA_FLUSH\\n\"));\n\t\t\tbreak;\n\t\tcase RT_CMD_STA_IOCTL_PMA_SA_REMOVE:\n\t\t\tfor (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++)\n\t\t\t{\n\t\t        /* compare the BSSID */\n\t\t        if (NdisEqualMemory(pIoctlPmaSa->pBssid, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN))\n\t\t        {\n\t\t        \tNdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN);\n\t\t\t\t\tNdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].PMKID, 16);\n\t\t\t\t\tfor (idx = CachedIdx; idx < (pAd->StaCfg.SavedPMKNum - 1); idx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.SavedPMK[idx].BSSID[0], &pAd->StaCfg.SavedPMK[idx+1].BSSID[0], MAC_ADDR_LEN);\n\t\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.SavedPMK[idx].PMKID[0], &pAd->StaCfg.SavedPMK[idx+1].PMKID[0], 16);\n\t\t\t\t\t}\n\t\t\t\t\tpAd->StaCfg.SavedPMKNum--;\n\t\t\t        break;\n\t\t        }\n\t        }\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"rt_ioctl_siwpmksa - IW_PMKSA_REMOVE\\n\"));\n\t\t\tbreak;\n\t\tcase RT_CMD_STA_IOCTL_PMA_SA_ADD:\n\t\t\tfor (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++)\n\t\t\t{\n\t\t        /* compare the BSSID */\n\t\t        if (NdisEqualMemory(pIoctlPmaSa->pBssid, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN))\n\t\t\t        break;\t\t\t\n\t        }\n\n\t        /* Found, replace it */\n\t        if (CachedIdx < PMKID_NO)\n\t        {\n\t\t        DBGPRINT(RT_DEBUG_OFF, (\"Update PMKID, idx = %d\\n\", CachedIdx));\n\t\t        NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].BSSID[0], pIoctlPmaSa->pBssid, MAC_ADDR_LEN);\n\t\t\t\tNdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].PMKID[0], pIoctlPmaSa->pPmkid, 16);\n\t\t        pAd->StaCfg.SavedPMKNum++;\n\t        }\n\t        /* Not found, replace the last one */\n\t        else\n\t        {\n\t\t        /* Randomly replace one */\n\t\t        CachedIdx = (pIoctlPmaSa->pBssid[5] % PMKID_NO);\n\t\t        DBGPRINT(RT_DEBUG_OFF, (\"Update PMKID, idx = %d\\n\", CachedIdx));\n\t\t        NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].BSSID[0], pIoctlPmaSa->pBssid, MAC_ADDR_LEN);\n\t\t\t\tNdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].PMKID[0], pIoctlPmaSa->pPmkid, 16);\n\t        }\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"rt_ioctl_siwpmksa - IW_PMKSA_ADD\\n\"));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_TRACE ,(\"rt_ioctl_siwpmksa - Unknow Command!!\\n\"));\n\t\t\tbreak;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWRATE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_siwrate(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tRT_CMD_RATE_SET *pCmdRate = (RT_CMD_RATE_SET *)pData;\n\tUINT32 rate = pCmdRate->Rate;\n\tUINT32 fixed = pCmdRate->Fixed;\n\n\n    /* rate = -1 => auto rate\n       rate = X, fixed = 1 => (fixed rate X)       \n    */\n    if (rate == -1)\n    {\n        /*Auto Rate */\n        pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;\t\n\t\tpAd->StaCfg.bAutoTxRateSwitch = TRUE;\n\t\tif ((!WMODE_CAP_N(pAd->CommonCfg.PhyMode)) ||\n\t\t\t(pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM))\n\t\t\tRTMPSetDesiredRates(pAd, -1);\n\t\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t}\n\telse\n\t{\n\t\tif (fixed)\n\t\t{\n\t\t\tpAd->StaCfg.bAutoTxRateSwitch = FALSE;\n\t\t\tif ((!WMODE_CAP_N(pAd->CommonCfg.PhyMode)) ||\n\t\t\t\t(pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM))\n\t\t\t\tRTMPSetDesiredRates(pAd, rate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tpAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;\n#ifdef DOT11_N_SUPPORT\n\t\t\t\tSetCommonHT(pAd);\n#endif /* DOT11_N_SUPPORT */\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"rt_ioctl_siwrate::(HtMcs=%d)\\n\",pAd->StaCfg.DesiredTransmitSetting.field.MCS));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* TODO: rate = X, fixed = 0 => (rates <= X) */\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIWRATE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_giwrate(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n    int rate_index = 0, rate_count = 0;\n\tHTTRANSMIT_SETTING ht_setting; \n\n\n    rate_count = RT_RateSize/sizeof(__s32);\n\n    if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE) &&\n        (INFRA_ON(pAd)) &&\n        ((!WMODE_CAP_N(pAd->CommonCfg.PhyMode)) || (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM)))\n        ht_setting.word = pAd->StaCfg.HTPhyMode.word;\n    else\n        ht_setting.word = pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word;\n    \n#ifdef DOT11_N_SUPPORT\n    if (ht_setting.field.MODE >= MODE_HTMIX)\n    {\n/*    \trate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS); */\n    \trate_index = 12 + ((UCHAR)ht_setting.field.BW *24) + ((UCHAR)ht_setting.field.ShortGI *48) + ((UCHAR)ht_setting.field.MCS);\n    }\n    else \n#endif /* DOT11_N_SUPPORT */\n    if (ht_setting.field.MODE == MODE_OFDM)                \n    \trate_index = (UCHAR)(ht_setting.field.MCS) + 4;\n    else if (ht_setting.field.MODE == MODE_CCK)   \n    \trate_index = (UCHAR)(ht_setting.field.MCS);\n\n    if (rate_index < 0)\n        rate_index = 0;\n    \n    if (rate_index >= rate_count)\n        rate_index = rate_count-1;\n\n\t*(ULONG *)pData = ralinkrate[rate_index] * 500000;\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCGIFHWADDR.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_gifhwaddr(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tmemcpy(pData, pAd->CurrentAddress, ETH_ALEN);\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_SIOCSIWPRIVRSSI.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_rssi(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\n        (*(CHAR *)pData) =  pAd->StaCfg.RssiSample.AvgRssi0;\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_IW_SET_PARAM_PRE.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_ioctl_setparam(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tPOS_COOKIE pObj;\n\n\n\tpObj = (POS_COOKIE) pAd->OS_Cookie;\n#ifdef P2P_SUPPORT\n\tif (Data == INT_P2P)\n\t{\n\t\tpObj->ioctl_if_type = INT_P2P;\n\t\tpObj->ioctl_if = 0;\n\t}\n\telse\n#endif /* P2P_SUPPORT */\n\t{\n\t\tpObj->ioctl_if_type = INT_MAIN;\n        pObj->ioctl_if = MAIN_MBSSID;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_IW_SET_WSC_U32_ITEM.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_private_set_wsc_u32_item(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n#ifdef WSC_STA_SUPPORT\n\tRT_CMD_STA_IOCTL_WSC_U32_ITEM *pIoctlWscU32 = (RT_CMD_STA_IOCTL_WSC_U32_ITEM *)pData;\n    u32 subcmd = *(pIoctlWscU32->pUWrq);\n    PWSC_PROFILE    pWscProfile = NULL;\n   \tu32 value = 0;\n\n\tpWscProfile = &pAd->StaCfg.WscControl.WscProfile;\n\n    switch(subcmd)\n    {\n        case WSC_CREDENTIAL_COUNT:\n            value = *(pIoctlWscU32->pUWrq + 1);\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_COUNT, value = %d\\n\", __FUNCTION__, value));\n            if (value <= 8)\n            {\n                pWscProfile->ProfileCnt = value;\n            }\n            else\n                pIoctlWscU32->Status = RTMP_IO_EINVAL;\n            break;        \n        case WSC_SET_DRIVER_CONNECT_BY_CREDENTIAL_IDX:\n            value = *(pIoctlWscU32->pUWrq + 1);\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_DRIVER_CONNECT_BY_CREDENTIAL_IDX, value = %d\\n\", __FUNCTION__, value));\n            if ((value <= 7) &&\n                (value < pWscProfile->ProfileCnt))\n            {\n                WscWriteConfToPortCfg(pAd, &pAd->StaCfg.WscControl, &pAd->StaCfg.WscControl.WscProfile.Profile[value], TRUE);\n                pAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n                LinkDown(pAd, TRUE);\n            }\n            else\n                pIoctlWscU32->Status = RTMP_IO_EINVAL;\n            break;\n        case WSC_SET_DRIVER_AUTO_CONNECT:\n            value = *(pIoctlWscU32->pUWrq + 1);\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_DRIVER_AUTO_CONNECT, value = %d\\n\", __FUNCTION__, value));\n            if ((value == 0x00) || \n\t\t\t\t(value == 0x01) || \n\t\t\t\t(value == 0x02))\n            {\n                pAd->StaCfg.WscControl.WscDriverAutoConnect = value;\n            }\n            else\n                pIoctlWscU32->Status = RTMP_IO_EINVAL;\n            break;\n        case WSC_SET_CONF_MODE:\n            value = *(pIoctlWscU32->pUWrq + 1);\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_CONF_MODE, value = %d\\n\", __FUNCTION__, value));\n\t\tif (value == 2)\n\t\t\tvalue = 4;\n            switch(value)\n            {\n                case WSC_DISABLE:\n                    Set_WscConfMode_Proc(pAd, \"0\");\n                    break;\n                case WSC_ENROLLEE:\n                    Set_WscConfMode_Proc(pAd, \"1\");\n                    break;\n                case WSC_REGISTRAR:\n                    Set_WscConfMode_Proc(pAd, \"2\");\n                    break;\n                default:\n                    pIoctlWscU32->Status = RTMP_IO_EINVAL;\n                    break;\n            }\n            break;\n        case WSC_SET_MODE:\n            value = *(pIoctlWscU32->pUWrq + 1);\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_MODE, value = %d\\n\", __FUNCTION__, value));\n            switch(value)\n            {\n                case WSC_PIN_MODE:\n                    if (Set_WscMode_Proc(pAd, \"1\") == FALSE)\n\t\t\t\t\t\tpIoctlWscU32->Status = RTMP_IO_EINVAL;\n                    break;\n                case WSC_PBC_MODE:\n                    if (Set_WscMode_Proc(pAd, \"2\") == FALSE)\n\t\t\t\t\t\tpIoctlWscU32->Status = RTMP_IO_EINVAL;\n                    break;\n\t\t\t\tcase WSC_SMPBC_MODE:\n\t\t\t\t\tif (Set_WscMode_Proc(pAd, \"3\") == FALSE)\n\t\t\t\t\t\tpIoctlWscU32->Status = RTMP_IO_EINVAL;\n\t\t\t\t\tbreak;\n                default:\n                    pIoctlWscU32->Status = RTMP_IO_EINVAL;\n                    break;\n            }\n            break;\n        case WSC_START:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_START\\n\", __FUNCTION__));\n            Set_WscGetConf_Proc(pAd, \"1\");\n            break;\n        case WSC_STOP:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_STOP\\n\", __FUNCTION__));\n\t\t\t\t\t\t\n            /* Disassociate the link if WPS is working. */\n        \tif ( INFRA_ON(pAd) && \n                 (pAd->StaCfg.WscControl.bWscTrigger == TRUE) && \n                 (pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) )\n        \t{\n        \t\tMLME_DISASSOC_REQ_STRUCT\tDisReq;\n        \t\t\t\t\t\t\t\t\t\t\n        \t\t/* Set to immediately send the media disconnect event */\n        \t\tpAd->MlmeAux.CurrReqIsFromNdis = TRUE;\n\n        \t\tDBGPRINT(RT_DEBUG_TRACE, (\"disassociate with current AP \\n\"));\n        \t\tDisassocParmFill(pAd, &DisReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);\n        \t\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, \n        \t\t\t\t\tsizeof(MLME_DISASSOC_REQ_STRUCT), &DisReq, 0);\n\n        \t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\t\t\t\tRTMP_MLME_HANDLER(pAd);\n        \t}\n\n#ifdef IWSC_SUPPORT\n\t\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.WscControl.WscConfMode = WSC_DISABLE;\n\t\t\t\tpAd->StaCfg.WscControl.WscState = WSC_STATE_INIT;\n\t\t\t\tpAd->StaCfg.WscControl.WscStatus = STATUS_WSC_IDLE;\n\t\t\t\tif (pAd->StaCfg.WscControl.bWscTrigger)\n\t\t\t\t\tIWSC_Stop(pAd, TRUE);\n\t\t\t\telse\n\t\t\t\t\tIWSC_Stop(pAd, FALSE);\n\t\t\t}\n\t\t\telse\n#endif /* IWSC_SUPPORT */\n\t\t\t{\n\t        \t/* Turn off WSC state matchine */\n\t        \tWscStop(pAd,\n#ifdef CONFIG_AP_SUPPORT\n\t        \t\t\tFALSE,\n#endif /* CONFIG_AP_SUPPORT */\n\t        \t\t\t&pAd->StaCfg.WscControl);\n\t            pAd->StaCfg.WscControl.WscConfMode = WSC_DISABLE;\n\t\t\t\tBssTableDeleteEntry(&pAd->MlmeAux.SsidBssTab, pAd->MlmeAux.Bssid, pAd->MlmeAux.Channel);\n\t\t\t}\n            break;\n        case WSC_GEN_PIN_CODE:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_GEN_PIN_CODE\\n\", __FUNCTION__));\n            Set_WscGenPinCode_Proc(pAd, \"1\");\n            break;\n\n\t\tcase WSC_AP_BAND:\n\t\t\tvalue = *(pIoctlWscU32->pUWrq + 1);\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_PBC_BAND, value = %d\\n\", __FUNCTION__, value));\n\t\t\tif (value < PREFERRED_WPS_AP_PHY_TYPE_MAXIMUM)\n\t\t\t{\n\t\t\t\tpAd->StaCfg.WscControl.WpsApBand= value;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n        default:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - unknow subcmd = %d, value = %d\\n\", __FUNCTION__, subcmd, value));\n            break;\n    }\n#endif /* WSC_STA_SUPPORT */\n    \n    return NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_IW_SET_WSC_STR_ITEM.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_private_set_wsc_string_item(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n#ifdef WSC_STA_SUPPORT\n\tRT_CMD_STA_IOCTL_WSC_STR_ITEM *pIoctlWscStr = (RT_CMD_STA_IOCTL_WSC_STR_ITEM *)pData;\n/*    int  Status=0; */\n    UINT32 subcmd = pIoctlWscStr->Subcmd;\n    UINT32 tmpProfileIndex = (UINT32)(pIoctlWscStr->pData[0] - 0x30);\n    UINT32 dataLen;\n    PWSC_PROFILE    pWscProfile = NULL;\n    USHORT  tmpAuth = 0, tmpEncr = 0;\n\tchar *extra = (char *)pIoctlWscStr->pData;\n\n\tpWscProfile = &pAd->StaCfg.WscControl.WscProfile;\n\n    if ((subcmd != WSC_SET_SSID) && \n\t\t(subcmd != WSC_SET_PIN) &&\n\t\t(subcmd != WSC_SET_BSSID) &&\n        (tmpProfileIndex > 7))\n    {\n        DBGPRINT(RT_DEBUG_TRACE, (\"%s - subcmd = %d, tmpProfileIndex = %d\\n\", __FUNCTION__, subcmd, tmpProfileIndex));\n\t\tpIoctlWscStr->Status = RTMP_IO_EINVAL;\n        return NDIS_STATUS_SUCCESS;\n    }\n\n    if ((subcmd != WSC_SET_SSID) && \n\t\t(subcmd != WSC_SET_PIN) &&\n\t\t(subcmd != WSC_SET_BSSID))\n    /* extra: \"1 input_string\", dwrq->length includes '\\0'. 3 is size of [index, blank and '\\0'] */\n\t\tdataLen = pIoctlWscStr->length - 3;\n    else\n        dataLen = pIoctlWscStr->length;\n    \n    switch(subcmd)\n    {\n        case WSC_CREDENTIAL_SSID:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_SSID(%s)\\n\", __FUNCTION__, extra+2));\n\t\t\tif (dataLen == (NDIS_802_11_LENGTH_SSID+1))\n\t\t\t\tdataLen = NDIS_802_11_LENGTH_SSID;\n            if (dataLen > 0 && dataLen <= NDIS_802_11_LENGTH_SSID)\n            {\n                pWscProfile->Profile[tmpProfileIndex].SSID.SsidLength = dataLen;\n                NdisZeroMemory(pWscProfile->Profile[tmpProfileIndex].SSID.Ssid, NDIS_802_11_LENGTH_SSID);\n                NdisMoveMemory(pWscProfile->Profile[tmpProfileIndex].SSID.Ssid, extra+2, dataLen);\n            }\n            else\n\t\t\t\tpIoctlWscStr->Status = RTMP_IO_E2BIG;\n            break;\n        case WSC_CREDENTIAL_AUTH_MODE:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_AUTH_MODE(%s)\\n\", __FUNCTION__, extra+2));\n            if ((tmpAuth = WscGetAuthTypeFromStr(extra+2)) != 0)\n            {\n                pWscProfile->Profile[tmpProfileIndex].AuthType = tmpAuth;\n            }\n            else\n                pIoctlWscStr->Status = RTMP_IO_EINVAL;\n            break;\n        case WSC_CREDENTIAL_ENCR_TYPE:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_ENCR_TYPE(%s)\\n\", __FUNCTION__, extra+2));\n            if ((tmpEncr = WscGetEncrypTypeFromStr(extra+2)) != 0)\n            {\n                pWscProfile->Profile[tmpProfileIndex].EncrType = tmpEncr;\n            }\n            else\n                pIoctlWscStr->Status = RTMP_IO_EINVAL;\n            break;\n        case WSC_CREDENTIAL_KEY_INDEX:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_KEY_INDEX(%s)\\n\", __FUNCTION__, extra+2));\n            if ( *(extra+2) >= 0x31 && *(extra+2) <= 0x34)\n            {\n                pWscProfile->Profile[tmpProfileIndex].KeyIndex = (UCHAR)*(extra+2) - 0x30;\n            }\n            else\n                pIoctlWscStr->Status = RTMP_IO_EINVAL;\n            break;\n        case WSC_CREDENTIAL_KEY:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_KEY(%s)\\n\", __FUNCTION__, extra+2));\n            if ((dataLen >= 8 && dataLen <= 64) ||\n                (dataLen == 5 || dataLen == 10 || dataLen == 13 || dataLen == 26))\n            {\n                pWscProfile->Profile[tmpProfileIndex].KeyLength = dataLen;\n                NdisZeroMemory(pWscProfile->Profile[tmpProfileIndex].Key, 64);\n                NdisMoveMemory(pWscProfile->Profile[tmpProfileIndex].Key, extra+2, dataLen);\n            }\n            else\n                pIoctlWscStr->Status = RTMP_IO_EINVAL;\n            break;\n        case WSC_CREDENTIAL_MAC:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_CREDENTIAL_MAC(%s)\\n\", __FUNCTION__, extra+2));\n            {\n                INT sscanf_rv = 0;\n                UINT tmp_val[6] = {0};\n                sscanf_rv = sscanf(extra+2, \"%02x:%02x:%02x:%02x:%02x:%02x\", \n                                                          &tmp_val[0],\n                                                          &tmp_val[1],\n                                                          &tmp_val[2],\n                                                          &tmp_val[3],\n                                                          &tmp_val[4],\n                                                          &tmp_val[5]);\n                if ( sscanf_rv == 6)\n                {\n                    int ii;\n                    NdisZeroMemory(pWscProfile->Profile[tmpProfileIndex].MacAddr, 6);\n                    for (ii=0; ii<6; ii++)\n                        pWscProfile->Profile[tmpProfileIndex].MacAddr[ii] = (UCHAR)tmp_val[ii];\n                }\n                else\n                    pIoctlWscStr->Status = RTMP_IO_EINVAL;\n            }            \n            break;\n        case WSC_SET_SSID:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_SSID(%s)\\n\", __FUNCTION__, extra));\n\t\t\tif (dataLen == (NDIS_802_11_LENGTH_SSID+1))\n\t\t\t\tdataLen = NDIS_802_11_LENGTH_SSID;\n            if (dataLen > 0 && dataLen <= NDIS_802_11_LENGTH_SSID)\n            {\n            \tSet_WscSsid_Proc(pAd, (PSTRING) extra);\n            }\n            else\n\t\t\t\tpIoctlWscStr->Status = RTMP_IO_E2BIG;\n            break;\n\t\tcase WSC_SET_PIN:\n        \tDBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_PIN, value = (%s)\\n\", __FUNCTION__, extra));\n\t\t\tif ( dataLen > 0 )\n\t\t\t{\n\t\t\t\tif (Set_WscPinCode_Proc(pAd, extra) == FALSE)\n\t\t\t\t\tpIoctlWscStr->Status = RTMP_IO_EINVAL;\n\t\t\t}\n            else\n                pIoctlWscStr->Status = RTMP_IO_EINVAL;\n            break;\n\t\tcase WSC_SET_BSSID:\n\t\t\tif ( dataLen > 0 )\n\t\t\t{\n\t\t\t\tif (Set_WscBssid_Proc(pAd, (PSTRING) extra) == FALSE)\n\t\t\t\t\tpIoctlWscStr->Status = RTMP_IO_EINVAL;\n\t\t\t}\n            else\n                pIoctlWscStr->Status = RTMP_IO_EINVAL;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - WSC_SET_BSSID\\n\", __FUNCTION__));\n\t\t\tbreak;\n        default:\n            DBGPRINT(RT_DEBUG_TRACE, (\"%s - unknow subcmd = %d\\n\", __FUNCTION__, subcmd));\n            break;\n    }\n#endif /* WSC_STA_SUPPORT */\n    \n    return NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tHandler for CMD_RTPRIV_IOCTL_STA_IW_GET_STATISTICS.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT\nRtmpIoctl_rt_private_get_statistics(\n\tIN\tRTMP_ADAPTER\t\t\t*pAd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN\tULONG\t\t\t\t\tData)\n{\n\tchar *extra = (char *)pData;\n\tULONG txCount = 0;\n#ifdef ENHANCED_STAT_DISPLAY\n\tULONG per, plr;\n#endif\n#ifdef WSC_STA_SUPPORT\n\tUINT32 MaxSize = (UINT32)Data;\n#endif /* WSC_STA_SUPPORT */\n\n\n    sprintf(extra, \"\\n\\n\");\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t\ttxCount = pAd->ate.TxDoneCount;\n\telse\n#endif /* RALINK_ATE */\n\t\ttxCount = (ULONG)pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;\n\n    sprintf(extra+strlen(extra), \"Tx success                      = %lu\\n\", txCount);\n#ifdef ENHANCED_STAT_DISPLAY\n\tper = txCount==0? 0: 1000*(pAd->WlanCounters.RetryCount.u.LowPart+pAd->WlanCounters.FailedCount.u.LowPart)/(pAd->WlanCounters.RetryCount.u.LowPart+pAd->WlanCounters.FailedCount.u.LowPart+txCount);\n    sprintf(extra+strlen(extra), \"Tx retry count                  = %lu, PER=%ld.%1ld%%\\n\",\n\t\t\t\t\t\t\t\t\t(ULONG)pAd->WlanCounters.RetryCount.u.LowPart,\n\t\t\t\t\t\t\t\t\tper/10, per % 10);\n\tplr = txCount==0? 0: 10000*pAd->WlanCounters.FailedCount.u.LowPart/(pAd->WlanCounters.FailedCount.u.LowPart+txCount);\n    sprintf(extra+strlen(extra), \"Tx fail to Rcv ACK after retry  = %lu, PLR=%ld.%02ld%%\\n\",\n\t\t\t\t\t\t\t\t\t(ULONG)pAd->WlanCounters.FailedCount.u.LowPart, plr/100, plr%100);\n#else\n    sprintf(extra+strlen(extra), \"Tx retry count          \t\t  = %lu\\n\", (ULONG)pAd->WlanCounters.RetryCount.u.LowPart);\n    sprintf(extra+strlen(extra), \"Tx fail to Rcv ACK after retry  = %lu\\n\", (ULONG)pAd->WlanCounters.FailedCount.u.LowPart);\n    sprintf(extra+strlen(extra), \"RTS Success Rcv CTS             = %lu\\n\", (ULONG)pAd->WlanCounters.RTSSuccessCount.u.LowPart);\n    sprintf(extra+strlen(extra), \"RTS Fail Rcv CTS                = %lu\\n\", (ULONG)pAd->WlanCounters.RTSFailureCount.u.LowPart);\n#endif /* ENHANCED_STAT_DISPLAY */\n\n    sprintf(extra+strlen(extra), \"Rx success                      = %lu\\n\", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart);\n#ifdef ENHANCED_STAT_DISPLAY\n\tper = pAd->WlanCounters.ReceivedFragmentCount.u.LowPart==0? 0: 1000*(pAd->WlanCounters.FCSErrorCount.u.LowPart)/(pAd->WlanCounters.FCSErrorCount.u.LowPart+pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);\n    sprintf(extra+strlen(extra), \"Rx with CRC                     = %ld, PER=%ld.%1ld%%\\n\",\n\t\t\t\t\t\t\t\t\t\t(ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart, per/10, per % 10);\n    sprintf(extra+strlen(extra), \"Rx drop due to out of resource  = %lu\\n\", (ULONG)pAd->Counters8023.RxNoBuffer);\n    sprintf(extra+strlen(extra), \"Rx duplicate frame              = %lu\\n\", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\n    sprintf(extra+strlen(extra), \"False CCA                       = %lu\\n\", (ULONG)pAd->RalinkCounters.FalseCCACnt);\n#else\n    sprintf(extra+strlen(extra), \"Rx with CRC                     = %lu\\n\", (ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart);\n    sprintf(extra+strlen(extra), \"Rx drop due to out of resource  = %lu\\n\", (ULONG)pAd->Counters8023.RxNoBuffer);\n    sprintf(extra+strlen(extra), \"Rx duplicate frame              = %lu\\n\", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);\n\n    sprintf(extra+strlen(extra), \"False CCA (one second)          = %lu\\n\", (ULONG)pAd->RalinkCounters.OneSecFalseCCACnt);\n#endif /* ENHANCED_STAT_DISPLAY */\n\n#ifdef RALINK_ATE\n\tif (ATE_ON(pAd))\n\t{\n\t\tif (pAd->ate.RxAntennaSel == 0)\n\t\t{\n    \t\tsprintf(extra+strlen(extra), \"RSSI-A                          = %ld\\n\", (LONG)(pAd->ate.LastRssi0 - pAd->BbpRssiToDbmDelta));\n\t\t\tsprintf(extra+strlen(extra), \"RSSI-B (if available)           = %ld\\n\", (LONG)(pAd->ate.LastRssi1 - pAd->BbpRssiToDbmDelta));\n\t\t\tsprintf(extra+strlen(extra), \"RSSI-C (if available)           = %ld\\n\\n\", (LONG)(pAd->ate.LastRssi2 - pAd->BbpRssiToDbmDelta));\n\t\t}\n\t\telse\n\t\t{\n    \t\tsprintf(extra+strlen(extra), \"RSSI                            = %ld\\n\", (LONG)(pAd->ate.LastRssi0 - pAd->BbpRssiToDbmDelta));\n\t\t}\n\t}\n\telse\n#endif /* RALINK_ATE */\n\t{\n#ifdef ENHANCED_STAT_DISPLAY\n\t\tsprintf(extra+strlen(extra), \"RSSI                            = %ld %ld %ld\\n\",\n\t\t\t\t(LONG)(pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta),\n\t\t\t\t(LONG)(pAd->StaCfg.RssiSample.LastRssi1 - pAd->BbpRssiToDbmDelta),\n\t\t\t\t(LONG)(pAd->StaCfg.RssiSample.LastRssi2 - pAd->BbpRssiToDbmDelta));\n\n\t\t// Display Last Rx Rate and BF SNR of first Associated entry in MAC table\n\t\tif (pAd->MacTab.Size > 0)\n\t\t{\n\t\t\tstatic char *phyMode[4] = {\"CCK\", \"OFDM\", \"MM\", \"GF\"};\n\t\t\tint i;\n    \t\t    \t\n\t\t\tfor (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)\n\t\t\t{\n\t\t\t\tPMAC_TABLE_ENTRY pEntry = &(pAd->MacTab.Content[i]);\n\t\t\t\tif (IS_ENTRY_CLIENT(pEntry) && pEntry->Sst==SST_ASSOC)\n\t\t\t\t{\n\t\t\t\t\tUINT32 lastRxRate = pEntry->LastRxRate;\n\n\t\t\t\t\tsprintf(extra+strlen(extra), \"Last RX Rate                    = MCS %d, %2dM, %cGI, %s%s\\n\",\n\t\t\t\t\t\t\tlastRxRate & 0x7F,  ((lastRxRate>>7) & 0x1)? 40: 20,\n\t\t\t\t\t\t\t((lastRxRate>>8) & 0x1)? 'S': 'L',\n\t\t\t\t\t\t\tphyMode[(lastRxRate>>14) & 0x3],\n\t\t\t\t\t\t\t((lastRxRate>>9) & 0x3)? \", STBC\": \" \");\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#else    \t\t    \t\n\t\tsprintf(extra+strlen(extra), \"RSSI-A                          = %ld\\n\", (LONG)(pAd->StaCfg.RssiSample.AvgRssi0 - pAd->BbpRssiToDbmDelta));\n\t\tsprintf(extra+strlen(extra), \"RSSI-B (if available)           = %ld\\n\", (LONG)(pAd->StaCfg.RssiSample.AvgRssi1 - pAd->BbpRssiToDbmDelta));\n        \tsprintf(extra+strlen(extra), \"RSSI-C (if available)           = %ld\\n\\n\", (LONG)(pAd->StaCfg.RssiSample.AvgRssi2 - pAd->BbpRssiToDbmDelta));\n#endif /* ENHANCED_STAT_DISPLAY */\n\n\n\t\tsprintf(extra+strlen(extra), \"SNR-A                          = %ld\\n\", (LONG)(pAd->StaCfg.RssiSample.AvgSnr0));\n        \tsprintf(extra+strlen(extra), \"SNR-B (if available)           = %ld\\n\\n\", (LONG)(pAd->StaCfg.RssiSample.AvgSnr1));\n\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n    sprintf(extra+strlen(extra), \"WpaSupplicantUP                 = %d\\n\\n\", pAd->StaCfg.WpaSupplicantUP);\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\n\n#ifdef WSC_STA_SUPPORT\n\t/* display pin code */\n\tif (pAd->StaCfg.WscControl.WscEnrolleePinCodeLen == 8)\t\n\t\tsprintf(extra+strlen(extra), \"RT2860 Linux STA PinCode\\t%08u\\n\", pAd->StaCfg.WscControl.WscEnrolleePinCode);\n\telse\n\t\tsprintf(extra+strlen(extra), \"RT2860 Linux STA PinCode\\t%04u\\n\", pAd->StaCfg.WscControl.WscEnrolleePinCode);\n{\n\tchar\tmode_str[16]={0};\n\tULONG\twps_status, wps_state;\n    int     idx = 0;\n\n\twps_state = pAd->StaCfg.WscControl.WscState;\n\twps_status = pAd->StaCfg.WscControl.WscStatus;\n\t\n\tif (pAd->StaCfg.WscControl.WscMode == WSC_PIN_MODE)\n\t\tsprintf(mode_str, \"PIN -\");\n\telse\n\t\tsprintf(mode_str, \"PBC -\");\n\t\n\t\tsprintf(extra+strlen(extra), \"WPS Information(Driver Auto-Connect is %s - %d):\\n\",\n\t                                                  pAd->StaCfg.WscControl.WscDriverAutoConnect ? \"Enabled\":\"Disabled\",\n\t                                                  pAd->StaCfg.WscControl.WscDriverAutoConnect);\n\t/* display pin code */\n\t/*sprintf(extra+strlen(extra), \"RT2860 Linux STA PinCode\\t%08u\\n\", pAd->StaCfg.WscControl.WscEnrolleePinCode); */\n\t/* display status */\n\tif ((wps_state == WSC_STATE_OFF) || (wps_status & 0xff00))\n\t{\n\t\tif (wps_status == STATUS_WSC_CONFIGURED)\n\t\t{\n\t\t\tsprintf(extra+strlen(extra), \"WPS messages exchange successfully !!!\\n\");\n\t\t}\n\t\telse if ((wps_status == STATUS_WSC_NOTUSED))\n\t\t{\n\t\t\tsprintf(extra+strlen(extra), \"WPS not used.\\n\");\n\t\t}\n\t\telse if(wps_status & 0xff00)\t/* error message */\n\t\t{\n\t\t\tif (wps_status == STATUS_WSC_PBC_TOO_MANY_AP)\n\t\t\t\tsprintf(extra+strlen(extra), \"%s Too many PBC AP. Stop WPS. \\n\", mode_str);\n\t\t\telse if (wps_status == STATUS_WSC_PBC_NO_AP)\n\t\t\t\tsprintf(extra+strlen(extra), \"%s No available PBC AP. Please wait... \\n\", mode_str);\n\t\t\telse if (wps_status & 0x0100)\n\t\t\t\tsprintf(extra+strlen(extra), \"%s Proceed to get the Registrar profile. Please wait... \\n\", mode_str);\n\t\t\telse\t/* status of eap failed */\n\t\t\t\tsprintf(extra+strlen(extra), \"WPS didn't complete !!!\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* wrong state */\n\t\t}\n\t}\n\telse\n\t{\n\t\tsprintf(extra+strlen(extra), \"%s WPS Proceed. Please wait... \\n\", mode_str);\n\t}\n\tsprintf(extra+strlen(extra), \"\\n\");\n    sprintf(extra+strlen(extra), \"WPS Profile Count               = %d\\n\", pAd->StaCfg.WscControl.WscProfile.ProfileCnt);\n    for (idx = 0; idx < pAd->StaCfg.WscControl.WscProfile.ProfileCnt ; idx++)\n    {\n        PWSC_CREDENTIAL pCredential = &pAd->StaCfg.WscControl.WscProfile.Profile[idx];\n\t\tchar ssid_print[MAX_LEN_OF_SSID + 1];\n\t\tNdisZeroMemory(&ssid_print[0], MAX_LEN_OF_SSID + 1);\n        if (strlen(extra) + sizeof(WSC_CREDENTIAL) >= MaxSize)\n        {\n            break;\n        }\n        \n        sprintf(extra+strlen(extra), \"Profile[%d]:\\n\", idx);        \n\t\tNdisMoveMemory(&ssid_print[0], pCredential->SSID.Ssid, pCredential->SSID.SsidLength);\n        sprintf(extra+strlen(extra), \"SSID                            = %s\\n\", ssid_print);\n        sprintf(extra+strlen(extra), \"MAC                             = %02X:%02X:%02X:%02X:%02X:%02X\\n\", \n                                                                           pCredential->MacAddr[0],\n                                                                           pCredential->MacAddr[1],\n                                                                           pCredential->MacAddr[2],\n                                                                           pCredential->MacAddr[3],\n                                                                           pCredential->MacAddr[4],\n                                                                           pCredential->MacAddr[5]);\n        sprintf(extra+strlen(extra), \"AuthType                        = %s\\n\", WscGetAuthTypeStr(pCredential->AuthType));\n        sprintf(extra+strlen(extra), \"EncrypType                      = %s\\n\", WscGetEncryTypeStr(pCredential->EncrType)); \n        sprintf(extra+strlen(extra), \"KeyIndex                        = %d\\n\", pCredential->KeyIndex);\n        if (pCredential->KeyLength != 0)\n        {\n            if (pCredential->AuthType & (WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK | WSC_AUTHTYPE_WPANONE))\n            {\n            if (pCredential->KeyLength < 64)\n                sprintf(extra+strlen(extra), \"Key                             = %s\\n\", pCredential->Key);\n            else\n            {\n                char key_print[65] = {0};\n                NdisMoveMemory(key_print, pCredential->Key, 64);\n                sprintf(extra+strlen(extra), \"Key                             = %s\\n\", key_print);\n            }\n        }\n            else if ((pCredential->AuthType == WSC_AUTHTYPE_OPEN) ||\n                     (pCredential->AuthType == WSC_AUTHTYPE_SHARED))\n            {\n                /*check key string is ASCII or not */\n                if (RTMPCheckStrPrintAble((PCHAR)pCredential->Key, (UCHAR)pCredential->KeyLength))\n                    sprintf(extra+strlen(extra), \"Key                             = %s\\n\", pCredential->Key);\n                else\n                {\n                    int idx;\n                    sprintf(extra+strlen(extra), \"Key                             = \");\n                    for (idx = 0; idx < pCredential->KeyLength; idx++)\n                        sprintf(extra+strlen(extra), \"%02X\", pCredential->Key[idx]);\n                    sprintf(extra+strlen(extra), \"\\n\");\n                }\n            }\n        }\n#ifdef IWSC_SUPPORT\n\t\tif (pAd->StaCfg.BssType == BSS_ADHOC)\n\t\t{\n\t\t\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\t\t\tsprintf(extra+strlen(extra), \"Credential Registrar IPv4 Addr  = %d:%d:%d:%d\\n\", \t\t\t\n\t\t\t\t(pCredential->RegIpv4Addr & 0xFF000000)>>24,\n\t\t\t\t(pCredential->RegIpv4Addr & 0x00FF0000)>>16,\n\t\t\t\t(pCredential->RegIpv4Addr & 0x0000FF00)>>8,\n\t\t\t\t(pCredential->RegIpv4Addr & 0x000000FF));\n\t\t\tsprintf(extra+strlen(extra), \"Credential Entrollee IPv4 Addr  = %d:%d:%d:%d\\n\", \t\t\t\n\t\t\t\t(pCredential->EnrIpv4Addr & 0xFF000000)>>24,\n\t\t\t\t(pCredential->EnrIpv4Addr & 0x00FF0000)>>16,\n\t\t\t\t(pCredential->EnrIpv4Addr & 0x0000FF00)>>8,\n\t\t\t\t(pCredential->EnrIpv4Addr & 0x000000FF));\n\t\t\tsprintf(extra+strlen(extra), \"\\nSelf IPv4 Addr                  = %d:%d:%d:%d\\n\", \n\t\t\t\t(pIWscInfo->SelfIpv4Addr & 0xFF000000)>>24,\n\t\t\t\t(pIWscInfo->SelfIpv4Addr & 0x00FF0000)>>16,\n\t\t\t\t(pIWscInfo->SelfIpv4Addr & 0x0000FF00)>>8,\n\t\t\t\t(pIWscInfo->SelfIpv4Addr & 0x000000FF));\n\t\t\tsprintf(extra+strlen(extra), \"IPv4 Subnet Mask                = %d:%d:%d:%d\\n\", \n\t\t\t\t(pIWscInfo->Ipv4SubMask & 0xFF000000)>>24,\n\t\t\t\t(pIWscInfo->Ipv4SubMask & 0x00FF0000)>>16,\n\t\t\t\t(pIWscInfo->Ipv4SubMask & 0x0000FF00)>>8,\n\t\t\t\t(pIWscInfo->Ipv4SubMask & 0x000000FF));\n\t\t\tsprintf(extra+strlen(extra), \"AvaSubMaskListCount             = %d\", pIWscInfo->AvaSubMaskListCount);\n\t\t}\n#endif /* IWSC_SUPPORT */\n    }\n    sprintf(extra+strlen(extra), \"\\n\");\n}\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t/* Display Tx Aggregation statistics */\n\tDisplayTxAgg(pAd);\n#endif /* DOT11_N_SUPPORT */\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCommunication with DRIVER module, whatever IOCTL.\n\nArguments:\n\tpAdSrc\t\t\t- WLAN control block pointer\n\t*pRequest\t\t- the request from IOCTL\n\tCommand\t\t\t- communication command\n\tSubcmd\t\t\t- communication sub-command\n\t*pData\t\t\t- the communication data pointer\n\tData\t\t\t- the communication data\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nINT RTMP_STA_IoctlHandle(\n\tIN\tVOID\t\t\t\t\t*pAdSrc,\n\tIN\tRTMP_IOCTL_INPUT_STRUCT\t*pRequest,\n\tIN\tINT\t\t\t\t\t\tCommand,\n\tIN\tUSHORT\t\t\t\t\tSubcmd,\n\tIN\tVOID\t\t\t\t\t*pData,\n\tIN  ULONG\t\t\t\t\tData,\n\tIN  USHORT                  priv_flags)\n{\n\tPRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;\n\tPOS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;\n\tINT Status = NDIS_STATUS_SUCCESS;\n\n#ifdef P2P_SUPPORT\n\tif (priv_flags == INT_P2P)\n\t{\n\t\tpObj->ioctl_if_type = INT_P2P;\n\t\tpObj->ioctl_if = 0;\n\t} else\n#endif /* MESH_SUPPORT */\n\t{\t/* determine this ioctl command is comming from which interface. */\n\t\tpObj->ioctl_if_type = INT_MAIN;\n\t\tpObj->ioctl_if = MAIN_MBSSID;\n\t}\n\n\n\t/* handle by command */\n\tswitch(Command)\n\t{\n\t\tcase CMD_RT_PRIV_IOCTL:\n\t\t\tif (Subcmd & OID_GET_SET_TOGGLE)\n\t\t\t\tStatus = RTMPSetInformation(pAd, pRequest,  Subcmd);\n\t\t\telse\n\t\t\t\tStatus = RTMPQueryInformation(pAd, pRequest, Subcmd);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_PARAM_SET:\n\t\t{\n\t\t\tRT_CMD_PARAM_SET *pCmdParam = (RT_CMD_PARAM_SET *)pData;\n\t\t\tPSTRING this_char = pCmdParam->pThisChar;\n\t\t\tPSTRING value = pCmdParam->pValue;\n\n\t\t\tStatus = RTMPSTAPrivIoctlSet(pAd, this_char, value);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SITESURVEY_GET:\n\t\t\tRTMPIoctlGetSiteSurvey(pAd, pRequest);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_MAC:\n\t\t\tRTMPIoctlMAC(pAd, pRequest);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_E2P:\n\t\t\tRTMPIoctlE2PROM(pAd, pRequest);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_RF:\n\t\t\tRTMPIoctlRF(pAd, pRequest);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_BBP:\n\t\t\tRTMPIoctlBbp(pAd, pRequest, pData, Data);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SHOW:\n\t\t\tRTMPIoctlShow(pAd, pRequest, Subcmd, pData, Data);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_SITESURVEY:\n\t\t\tStaSiteSurvey(pAd, (NDIS_802_11_SSID *)pData, Data);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_CHID_2_FREQ:\n\t\t\tRTMP_MapChannelID2KHZ(Data, (UINT32 *)pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_FREQ_2_CHID:\n\t\t\tRTMP_MapKHZ2ChannelID(Data, (UINT32 *)pData);\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_ORI_DEV_TYPE_SET:\n\t\t\tpAd->StaCfg.OriDevType = Data;\n#ifdef CONFIG_STA_SUPPORT\n#ifdef CREDENTIAL_STORE\n\tNdisAllocateSpinLock(pAd, &pAd->StaCtIf.Lock);\n#endif /* CREDENTIAL_STORE */\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\n\t\t\tbreak;\n\t\tcase CMD_RTPRIV_IOCTL_STA_SCAN_SANITY_CHECK:\n\t\t\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t\t    {\n\t\t\t\t/*\n\t\t\t\t * Still scanning, indicate the caller should try again.\n\t\t\t\t */\n\t\t\t\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t}\n\n\t\t\tif (pAd->StaCfg.bImprovedScan)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * Fast scanning doesn't complete yet.\n\t\t\t\t */\n\t\t\t\tpAd->StaCfg.bSkipAutoScanConn = TRUE;\n\t\t\t\treturn NDIS_STATUS_FAILURE;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_STA_SCAN_END:\n\t\t    pAd->StaCfg.bSkipAutoScanConn = FALSE;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR ,(\"===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %ld\\n\",pAd->ScanTab.BssNr , pAd->ScanTab.BssNr, Data));\n\t\t\tbreak;\n\n\t\tcase CMD_RTPRIV_IOCTL_BSS_LIST_GET:\n\t\t{\n\t\t\tRT_CMD_STA_IOCTL_BSS_LIST *pBssList = (RT_CMD_STA_IOCTL_BSS_LIST *)pData;\n\t\t\tRT_CMD_STA_IOCTL_BSS *pList;\n\t\t\tUINT32 i;\n\n\t\t\tpBssList->BssNum = pAd->ScanTab.BssNr;\n\t\t\tfor (i = 0; i <pBssList->MaxNum ; i++)\n\t\t\t{\n\t\t\t\tif (i >=  pAd->ScanTab.BssNr)\n\t\t\t\t\tbreak;\n\t\t\t\tpList = (pBssList->pList) + i;\n\t\t\t\tset_quality(pList, &pAd->ScanTab.BssEntry[i]);\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\n\t\t/* ------------------------------------------------------------------ */\n\t\t/* for standard IOCTL in LINUX OS */\n\n\t\tRTMP_STA_STANDARD_IOCTL_HANDLE(pAd, pData, Data, Subcmd);\n\n\t\t/* ------------------------------------------------------------------ */\n\n\t\tdefault:\n\t\t\t/* for IOCTL that also can be used in AP mode */\n\t\t\tStatus = RTMP_COM_IoctlHandle(pAd, pRequest, Command, Subcmd, pData, Data);\n\t\t\tbreak;\n\t}\n\n\treturn Status;\n}\n\n"
  },
  {
    "path": "src/sta/sta_iwsc.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 5F., No.36, Taiyuan St., Jhubei City,\n * Hsinchu County 302,\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tsta_iwsc\n\n\tAbstract:\t\n\tHandle IWSC for IBSS\n*/\n\n#ifdef IWSC_SUPPORT\n\n#include \"rt_config.h\"\n\n#define IWSC_SEL_REG_START_NOTITY\t0\n#define IWSC_SEL_REG_FINISH_NOTITY\t1\n#define IWSC_DEV_QUERY_REQUEST\t\t2\n#define IWSC_DEV_QUERY_RESPONSE\t\t3\n\n#define IWSC_ENTRY_TIME_OUT\t\t\t15000\n\nextern UCHAR\tIWSC_OUI[];\nextern UCHAR \tZERO_MAC_ADDR[];\nextern UCHAR\tIWSC_ACTION_OUI[];\n\nVOID\tIWSC_MlmeStartAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_MlmeStopAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID \tIWSC_InvalidState(\n    IN  PRTMP_ADAPTER \t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_ScanDoneAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID \tIWSC_ReConnectAction(\n    IN  PRTMP_ADAPTER \t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_SendActionFrame(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR\t\t\t\tFrameType);\n\nVOID\tIWSC_PeerAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_RoleAction(\n    IN  PRTMP_ADAPTER\tpAd,\n    IN  INT\t\t\t\tWscConfMode);\n\nULONG \tIWSC_SearchWpsApByPinMethod(\n\tIN PRTMP_ADAPTER\tpAd);\n\nVOID\tIWSC_GetConfigMethod(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpVIE,\n\tIN\tINT\t\t\t\tVIELen,\n\tOUT PUSHORT\t\t\tpConfigMethod);\n\nVOID\tIWSC_PeerProbeRequest(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_PeerProbeResponse(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_PeerPIN(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMLME_QUEUE_ELEM \tpElem);\n\nVOID\tIWSC_BuildDevQueryFrame(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUSHORT\t\t\tpIeLen);\n\nVOID \tIWSC_ResetIpContent(\n\tIN  PRTMP_ADAPTER\tpAd);\n\n/*\n    ==========================================================================\n    Description:\n        IWSC state machine init, including state transition\n    Parameters:\n        Sm - pointer to the auth state machine\n    Note:\n        The state machine looks like this        \n    ==========================================================================\n */\nvoid\tIWSC_StateMachineInit(\n    IN  PRTMP_ADAPTER pAd, \n    IN  STATE_MACHINE *Sm, \n    OUT STATE_MACHINE_FUNC Trans[])\n{\n    StateMachineInit(Sm, \n    \t\t\t\t Trans, \n    \t\t\t\t MAX_IWSC_STATE, \n    \t\t\t\t MAX_IWSC_MSG, \n    \t\t\t\t (STATE_MACHINE_FUNC)Drop, \n    \t\t\t\t IWSC_IDLE, \n    \t\t\t\t IWSC_MACHINE_BASE);\n\n\tStateMachineSetAction(Sm, IWSC_IDLE, IWSC_MT2_MLME_START, (STATE_MACHINE_FUNC)IWSC_MlmeStartAction);\n\tStateMachineSetAction(Sm, IWSC_IDLE, IWSC_MT2_PEER_ACTION_FRAME, (STATE_MACHINE_FUNC)IWSC_PeerAction);\n\tStateMachineSetAction(Sm, IWSC_IDLE, IWSC_MT2_MLME_SCAN_DONE, (STATE_MACHINE_FUNC)IWSC_ScanDoneAction);\n\tStateMachineSetAction(Sm, IWSC_IDLE, IWSC_MT2_MLME_RECONNECT, (STATE_MACHINE_FUNC)IWSC_InvalidState);\n\n\tStateMachineSetAction(Sm, IWSC_START, IWSC_MT2_MLME_START, (STATE_MACHINE_FUNC)IWSC_MlmeStartAction);\n\tStateMachineSetAction(Sm, IWSC_START, IWSC_MT2_MLME_STOP, (STATE_MACHINE_FUNC)IWSC_MlmeStopAction);\n\tStateMachineSetAction(Sm, IWSC_START, IWSC_MT2_PEER_PROBE_REQ, (STATE_MACHINE_FUNC)IWSC_PeerProbeRequest);\n\tStateMachineSetAction(Sm, IWSC_START, IWSC_MT2_MLME_SCAN_DONE, (STATE_MACHINE_FUNC)IWSC_ScanDoneAction);\n\tStateMachineSetAction(Sm, IWSC_START, IWSC_MT2_MLME_RECONNECT, (STATE_MACHINE_FUNC)IWSC_ReConnectAction);\n\n\tStateMachineSetAction(Sm, IWSC_SCAN, IWSC_MT2_MLME_START, (STATE_MACHINE_FUNC)IWSC_MlmeStartAction);\n\tStateMachineSetAction(Sm, IWSC_SCAN, IWSC_MT2_MLME_STOP, (STATE_MACHINE_FUNC)IWSC_MlmeStopAction);\n\tStateMachineSetAction(Sm, IWSC_SCAN, IWSC_MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)IWSC_PeerProbeResponse);\n\tStateMachineSetAction(Sm, IWSC_SCAN, IWSC_MT2_MLME_SCAN_DONE, (STATE_MACHINE_FUNC)IWSC_ScanDoneAction);\n\tStateMachineSetAction(Sm, IWSC_SCAN, IWSC_MT2_MLME_RECONNECT, (STATE_MACHINE_FUNC)IWSC_InvalidState);\n\n\tStateMachineSetAction(Sm, IWSC_WAIT_PIN, IWSC_MT2_PEER_PIN, (STATE_MACHINE_FUNC)IWSC_PeerPIN);\n\tStateMachineSetAction(Sm, IWSC_WAIT_PIN, IWSC_MT2_MLME_STOP, (STATE_MACHINE_FUNC)IWSC_MlmeStopAction);\n\n\tStateMachineSetAction(Sm, IWSC_WAIT_JOIN, IWSC_MT2_MLME_STOP, (STATE_MACHINE_FUNC)IWSC_MlmeStopAction);\n\t\n}\n\nVOID \tIWSC_InvalidState(\n    IN  PRTMP_ADAPTER \t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem) \n{\n    DBGPRINT(RT_DEBUG_TRACE, (\"IWSC - InvalidState (state=%ld, msg_type = %ld)\\n\", \n\t\t\t\t\t\t\t\tpAd->Mlme.IWscMachine.CurrState, pElem->MsgType));\n}\n\nVOID\tIWSC_Init(\n\tIN  IN PRTMP_ADAPTER pAd)\n{\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\n\tRTMPInitTimer(pAd, \n\t\t\t\t  &pIWscInfo->IWscT1Timer,\n\t\t\t\t  GET_TIMER_FUNCTION(IWSC_T1TimerAction), \n\t\t\t\t  pAd, \n\t\t\t\t  FALSE);\n\n\tRTMPInitTimer(pAd, \n\t\t\t\t  &pIWscInfo->IWscT2Timer,\n\t\t\t\t  GET_TIMER_FUNCTION(IWSC_T2TimerAction), \n\t\t\t\t  pAd, \n\t\t\t\t  FALSE);\n\t\n\tRTMPInitTimer(pAd, \n\t\t\t\t  &pIWscInfo->IWscEntryTimer,\n\t\t\t\t  GET_TIMER_FUNCTION(IWSC_EntryTimerAction), \n\t\t\t\t  pAd, \n\t\t\t\t  FALSE);\n\n\tRTMPInitTimer(pAd, \n\t\t\t\t  &pIWscInfo->IWscDevQueryTimer,\n\t\t\t\t  GET_TIMER_FUNCTION(IWSC_DevQueryAction), \n\t\t\t\t  pAd, \n\t\t\t\t  FALSE);\n\n\tpIWscInfo->bIWscT1TimerRunning = FALSE;\n\tpIWscInfo->bIWscT2TimerRunning = FALSE;\n\tpIWscInfo->bIWscEntryTimerRunning = FALSE;\n\tpIWscInfo->bIWscDevQueryReqTimerRunning = FALSE;\n\tpIWscInfo->bIWscDevQueryRspTimerRunning = FALSE;\n\n\tpIWscInfo->DialogToken = 0;\n\tpIWscInfo->PeerDialogToken = 0;\n\tpIWscInfo->bSelRegStart = FALSE;\n\tpIWscInfo->bReStart = FALSE;\n\tpIWscInfo->IWscSmpbcAcceptCount = 0;\n\tpIWscInfo->bLimitedUI = FALSE;\n\tpIWscInfo->bSinglePIN = FALSE;\n\tpIWscInfo->bDoNotChangeBSSID = FALSE;\n\tpIWscInfo->bSendEapolStart = FALSE;\n\tpIWscInfo->IpConfMethod = (IWSC_IPV4_ASSIGNMENT | IWSC_DHCP_IPV4 | IWSC_STATIC_IPV4);\n\tpIWscInfo->IpMethod = IWSC_IPV4_ASSIGNMENT;\n\tpIWscInfo->SelfIpv4Addr = IWSC_DEFAULT_REG_IPV4_ADDR;\n\tpIWscInfo->PeerIpv4Addr = 0;\n\tpIWscInfo->RegIpv4Addr = 0;\n\tpIWscInfo->Ipv4SubMask = IWSC_DEFAULT_IPV4_SUBMASK;\n\tpIWscInfo->CurrentIpRange = IWSC_DEFAULT_IPV4_RANGE;\n\tpIWscInfo->RegDepth = 0;\n\tpIWscInfo->IpDevCount = 0;\n\tpIWscInfo->AvaSubMaskListCount = IWSC_MAX_SUB_MASK_LIST_COUNT;\n\tpIWscInfo->AvaSubMaskList[0] = IWSC_IPV4_RANGE1;\n\tpIWscInfo->AvaSubMaskList[1] = IWSC_IPV4_RANGE2;\n\tpIWscInfo->AvaSubMaskList[2] = IWSC_IPV4_RANGE3;\n\tpIWscInfo->bAssignWscIPv4 = TRUE;\n\tpIWscInfo->bDoNotStop = FALSE;\n\tpIWscInfo->SmpbcEnrolleeCount = 0;\n\tRTMPZeroMemory(pIWscInfo->RegMacAddr, MAC_ADDR_LEN);\n\tRTMPZeroMemory(pIWscInfo->IWscDevQueryReqMacAddr, MAC_ADDR_LEN);\n\n\tinitList(&pAd->StaCfg.WscControl.WscConfiguredPeerList);\n\tNdisAllocateSpinLock(pAd, &pAd->StaCfg.WscControl.WscConfiguredPeerListSemLock);\n\t\n#ifdef IWSC_TEST_SUPPORT\n\tpIWscInfo->IWscDefaultSecurity = 3;\n\tpIWscInfo->bIwscSmpbcScanningOnly = FALSE;\n\tpIWscInfo->bEmptySubmaskList = FALSE;\n#endif // IWSC_TEST_SUPPORT //\n}\n\nVOID\tIWSC_Stop(\n\tIN  PRTMP_ADAPTER \tpAd,\n\tIN  BOOLEAN\t\t\tbSendNotification)\n{\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tBOOLEAN\t\tbCancelled;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_Stop\\n\"));\n\n\tif (pIWscInfo->bIWscT1TimerRunning)\n\t{\n\t\tpIWscInfo->bIWscT1TimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pIWscInfo->IWscT1Timer, &bCancelled);\n\t}\n\t\n\tif (pIWscInfo->bIWscT2TimerRunning)\n\t{\n\t\tpIWscInfo->bIWscT2TimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pIWscInfo->IWscT2Timer, &bCancelled);\n\t}\n\n\tif (pIWscInfo->bIWscEntryTimerRunning)\n\t{\n\t\tpIWscInfo->bIWscEntryTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pIWscInfo->IWscEntryTimer, &bCancelled);\t\t\n\t}\n\n\tif (pWpsCtrl->WscPBCTimerRunning)\n\t{\n\t\tpWpsCtrl->WscPBCTimerRunning = FALSE;\n\t\tRTMPCancelTimer(&pWpsCtrl->WscPBCTimer, &bCancelled);\n\t}\n\tpIWscInfo->IWscSmpbcAcceptCount = 0;\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS) == FALSE)\n\t{\n\t\tAsicDisableSync(pAd);\n\t\tpAd->StaCfg.WpsIEBeacon.ValueLen = 0;\n\t\tpAd->StaCfg.WpsIEProbeResp.ValueLen = 0;\n\t\tMakeIbssBeacon(pAd);        /* re-build BEACON frame */\n\t\tAsicEnableIbssSync(pAd);    /* copy BEACON frame to on-chip memory */\n\n\t\tWscStop(pAd,\n#ifdef CONFIG_AP_SUPPORT\n\t\t\t\tFALSE,\n#endif /* CONFIG_AP_SUPPORT */\n\t\t\t\tpWpsCtrl);\n\t}\n\t\n\tif (bSendNotification)\n\t{\n\t\t/*\n\t\t\tSend Selected Registrar Finish Notification (multicast action frame)\n\t\t*/\t\n\t\tIWSC_SendActionFrame(pAd, IWSC_SEL_REG_FINISH_NOTITY);\n\t}\n\tpAd->Mlme.IWscMachine.CurrState = IWSC_IDLE;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_Stop\\n\"));\n}\n\n/**************************************************** IWSC Timer Function Begin ****************************************************/\nVOID\tIWSC_T1TimerAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3)\n{\n    RTMP_ADAPTER    *pAd = (PRTMP_ADAPTER)FunctionContext;\n\tPWSC_CTRL\t\tpWpsCtrl = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! IWSC_T1TimerAction !!!\\n\"));\n\n\tif (pAd)\n\t{\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\t\tif (pWpsCtrl)\n\t\t{\n\t\t\tpAd->StaCfg.IWscInfo.bDoNotStop = FALSE;\n\t\t\tif ((pWpsCtrl->WscConfMode == WSC_REGISTRAR) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tSend Selected Registrar Finish Notification (multicast action frame)\n\t\t\t\t*/\n\t\t\t\tIWSC_Stop(pAd, TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t\tIWSC_Stop(pAd, FALSE);\n\t\t\t\n\t\t\tpWpsCtrl->WscStatus = STATUS_WSC_IDLE;\n#ifdef IWSC_TEST_SUPPORT\n\t\t\tpAd->StaCfg.IWscInfo.IWscConfMode = WSC_DISABLE;\n#endif // IWSC_TEST_SUPPORT //\t\t\t\n\t\t\tRTMPSendWirelessEvent(pAd, IW_IWSC_T1_TIMER_TIMEOUT, NULL, pWpsCtrl->EntryIfIdx, 0);\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_T1TimerAction - pWpsCtrl is null !!!\\n\"));\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_T1TimerAction - pAd is null !!!\\n\"));\n}\n\nVOID\tIWSC_T2TimerAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3)\n{\n    RTMP_ADAPTER    *pAd = (PRTMP_ADAPTER)FunctionContext;\n\tPWSC_CTRL\t\tpWpsCtrl = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! IWSC_T2TimerAction - Become Enrollee !!!\\n\"));\n\n\tif (pAd)\n\t{\n\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\t\tif (pWpsCtrl)\n\t\t{\n\t\t\tRTMPSendWirelessEvent(pAd, IW_IWSC_T2_TIMER_TIMEOUT, NULL, pWpsCtrl->EntryIfIdx, 0);\n\t\t\tIWSC_RoleAction(pAd, WSC_ENROLLEE);\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_SCAN;\t\t\t\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_T2TimerAction - pWpsCtrl is null !!!\\n\"));\t\t\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_T2TimerAction - pAd is null !!!\\n\"));\n}\n\nVOID\tIWSC_EntryTimerAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER    *pAd = (PRTMP_ADAPTER)FunctionContext;\n\tPIWSC_INFO\t\tpIWscInfo = NULL;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! IWSC_EntryTimerAction !!!\\n\"));\n\tif (pAd)\n\t{\n\t\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\t\tif (pIWscInfo)\n\t\t{\n\t\t\tpIWscInfo->bIWscEntryTimerRunning = FALSE;\n\t\t\tWscBuildProbeRespIE(pAd, \n\t\t\t\t\t\t\t\tWSC_MSGTYPE_REGISTRAR, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfStatus, \n\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\tDEV_PASS_ID_SMPBC, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfigMethods, \n\t\t\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tSTA_MODE);\n\t\t\tRTMPSendWirelessEvent(pAd, IW_IWSC_ENTRY_TIMER_TIMEOUT, NULL, pAd->StaCfg.WscControl.EntryIfIdx, 0);\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_EntryTimerAction - pIWscInfo is null !!!\\n\"));\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_EntryTimerAction - pAd is null !!!\\n\"));\n}\n\nVOID\tIWSC_DevQueryAction(\n    IN  PVOID SystemSpecific1,\n    IN  PVOID FunctionContext,\n    IN  PVOID SystemSpecific2,\n    IN  PVOID SystemSpecific3)\n{\n\tRTMP_ADAPTER    *pAd = (PRTMP_ADAPTER)FunctionContext;\n\tPIWSC_INFO\t\tpIWscInfo = NULL;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"!!! IWSC_DevQueryAction !!!\\n\"));\n\tif (pAd)\n\t{\n\t\tpIWscInfo = &pAd->StaCfg.IWscInfo;\t\t\n\t\tif (pIWscInfo)\n\t\t{\n\t\t\tif (pIWscInfo->bIWscDevQueryReqTimerRunning)\n\t\t\t{\n\t\t\t\tpIWscInfo->bIWscDevQueryReqTimerRunning = FALSE;\n\t\t\t\tIWSC_SendActionFrame(pAd, IWSC_DEV_QUERY_REQUEST);\n\t\t\t\tRTMPusecDelay(200000); // 200 ms\n\t\t\t\tIWSC_SendActionFrame(pAd, IWSC_DEV_QUERY_REQUEST);\n\t\t\t\tRTMPusecDelay(200000); // 200 ms\n\t\t\t\tIWSC_SendActionFrame(pAd, IWSC_DEV_QUERY_REQUEST);\n\t\t\t}\n\t\t\tif (pIWscInfo->bIWscDevQueryRspTimerRunning)\n\t\t\t{\n\t\t\t\tpIWscInfo->bIWscDevQueryRspTimerRunning = FALSE;\n\t\t\t\tIWSC_SendActionFrame(pAd, IWSC_DEV_QUERY_RESPONSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_DevQueryAction - pIWscInfo is null !!!\\n\"));\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!! IWSC_DevQueryAction - pAd is null !!!\\n\"));\n}\n\n/**************************************************** IWSC Timer Function End ****************************************************/\n\nVOID\tIWSC_MlmeStartAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem) \n{\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\t\n\t/*\n\t\tCheck IWSC State\n\t*/\n\tif (pAd->Mlme.IWscMachine.CurrState != IWSC_IDLE)\n\t{\n\t\t/*\n\t\t\tStop IWSC\n\t\t*/\n\t\tIWSC_Stop(pAd, FALSE);\n\t}\t\n\n\tRTMPSetTimer(&pIWscInfo->IWscT1Timer, WSC_TWO_MINS_TIME_OUT);\n\tpIWscInfo->bIWscT1TimerRunning = TRUE;\n\tWscInitRegistrarPair(pAd, pWpsCtrl, BSS0);\n\tWscGetRegDataPIN(pAd, pWpsCtrl->WscPinCode, pWpsCtrl);\t\n\tpWpsCtrl->RegData.ReComputePke = 1;\n\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t{\n\t\tIWSC_ResetIpContent(pAd);\n\t}\n\tpIWscInfo->SmpbcEnrolleeCount = 0;\n\tpIWscInfo->IWscSmpbcAcceptCount = 0;\n\tNdisZeroMemory(pWpsCtrl->EntryAddr, MAC_ADDR_LEN);\n\n\tRTMP_SEM_LOCK(&pWpsCtrl->WscPeerListSemLock);\n\tWscClearPeerList(&pWpsCtrl->WscPeerList);\n\tRTMP_SEM_UNLOCK(&pWpsCtrl->WscPeerListSemLock);\n\t\n\tRTMP_SEM_LOCK(&pWpsCtrl->WscConfiguredPeerListSemLock);\n\tWscClearPeerList(&pWpsCtrl->WscConfiguredPeerList);\n\tRTMP_SEM_UNLOCK(&pWpsCtrl->WscConfiguredPeerListSemLock);\n\n\tif (pWpsCtrl->WscMode == WSC_SMPBC_MODE)\n\t{\t\t\t\t\n\t\tif (pWpsCtrl->WscConfMode == WSC_REGISTRAR)\n\t\t{\n\t\t\tRTMPSetTimer(&pIWscInfo->IWscEntryTimer, IWSC_ENTRY_TIME_OUT);\n\t\t\tpIWscInfo->bIWscEntryTimerRunning = TRUE;\n\t\t\tIWSC_RoleAction(pAd, WSC_REGISTRAR);\n\t\t\tIWSC_SendActionFrame(pAd, IWSC_SEL_REG_START_NOTITY);\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIWSC_RoleAction(pAd, WSC_ENROLLEE);\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_SCAN;\n\t\t}\n\t}\n\telse\n\t{\n#ifdef IWSC_TEST_SUPPORT\n\t\tif (pIWscInfo->IWscConfMode == WSC_ENROLLEE)\n\t\t{\n\t\t\tIWSC_RoleAction(pAd, WSC_ENROLLEE);\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_SCAN;\n\t\t}\n\t\telse\n#endif // IWSC_TEST_SUPPORT //\n\t\t{\n\t\t\tIWSC_RoleAction(pAd, WSC_REGISTRAR);\n\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\t[A member of IBSS] - Send Selected Registrar Start Notification (multicast action frame)\n\t\t\t\t*/\n\t\t\t\tIWSC_SendActionFrame(pAd, IWSC_SEL_REG_START_NOTITY);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((pAd->StaCfg.IWscInfo.bSinglePIN == FALSE)\n#ifdef IWSC_TEST_SUPPORT\n\t\t\t\t\t&& (pIWscInfo->IWscConfMode == WSC_DISABLE)\n#endif // IWSC_TEST_SUPPORT //\t\t\t\t\t\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t/*\n\t\t\t\t\t\t[!A member of IBSS]\n\t\t\t\t\t*/\n\t\t\t\t\tUCHAR\tRandomTime;\n\n\t\t\t\t\tRandomTime = RandomByte(pAd) & 0x3C;\n\t\t\t\t\tif (RandomTime > 60)\n\t\t\t\t\t\tRandomTime = 60;\n\t\t\t\t\telse if (RandomTime < 20)\n\t\t\t\t\t\tRandomTime = 20;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RandomTime = %d\\n\", RandomTime));\n\t\t\t\t\tRTMPSetTimer(&pIWscInfo->IWscT2Timer, (RandomTime*100));\n\t\t\t\t\tpIWscInfo->bIWscT2TimerRunning = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t}\n\t}\t\n\tpWpsCtrl->bWscTrigger = TRUE;\n}\n\nVOID\tIWSC_MlmeStopAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem) \n{\n\tPWSC_CTRL pWpsCtrl = &pAd->StaCfg.WscControl;\n\n\tif (pAd->StaCfg.IWscInfo.bSinglePIN &&\n\t\tpAd->StaCfg.IWscInfo.bDoNotStop)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SinglePIN registrar now, keep going!!\\n\"));\n\t\tpWpsCtrl->WscConfMode = WSC_REGISTRAR;\n\t\tpWpsCtrl->RegData.ReComputePke = 1;\n\t\tpWpsCtrl->bWscTrigger = TRUE;\n\t\tpWpsCtrl->WscState = WSC_STATE_LINK_UP;\n\t\tpWpsCtrl->WscStatus = STATUS_WSC_LINK_UP;\n\t\treturn;\n\t}\n\n#ifdef IWSC_TEST_SUPPORT\n\tpAd->StaCfg.IWscInfo.IWscConfMode = WSC_DISABLE;\n#endif // IWSC_TEST_SUPPORT //\n\n\t/*\n\t\tCheck IWSC State\n\t*/\n\tif (pAd->Mlme.IWscMachine.CurrState != IWSC_IDLE)\n\t{\n\t\t/*\n\t\t\tStop IWSC\n\t\t*/\n\t\tif ((pWpsCtrl->WscConfMode == WSC_REGISTRAR) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t{\n\t\t\t/*\n\t\t\t\tSend Selected Registrar Finish Notification (multicast action frame)\n\t\t\t*/\n\t\t\tIWSC_Stop(pAd, TRUE);\n\t\t}\n\t\telse\n\t\t\tIWSC_Stop(pAd, FALSE);\t\t\n\t}\n\n}\n\nVOID\tIWSC_ScanDoneAction(\n    IN  PRTMP_ADAPTER\t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem) \n{\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tUCHAR\t\tRandomTime;\n\n\tif (pAd->Mlme.IWscMachine.CurrState != IWSC_SCAN)\n\t{\n\t\tif (pAd->Mlme.IWscMachine.CurrState != IWSC_IDLE)\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_ScanDoneAction:: CurrState = %ld\\n\", pAd->Mlme.IWscMachine.CurrState));\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_ScanDoneAction\\n\"));\t\n\t\n\tif (pWpsCtrl->WscMode == WSC_PBC_MODE)\n\t{\t\t\n\t\tif (WscPBCExec(pAd, FALSE, pWpsCtrl) == FALSE)\n\t\t{\n\t\t\tif (pWpsCtrl->WscPBCBssCount > 1)\n\t\t\t{\n\t\t\t\tIWSC_Stop(pAd, FALSE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n#ifdef IWSC_TEST_SUPPORT\n\t\t\t\tif (pAd->StaCfg.IWscInfo.IWscConfMode != WSC_ENROLLEE)\n#endif /* IWSC_TEST_SUPPORT */\n\t\t\t\t{\n\t\t\t\t\tIWSC_RoleAction(pAd, WSC_REGISTRAR);\n\t\t\t\t\tRandomTime = RandomByte(pAd) & 0x3C;\n\t\t\t\t\tif (RandomTime > 60)\n\t\t\t\t\t\tRandomTime = 60;\n\t\t\t\t\telse if (RandomTime < 20)\n\t\t\t\t\t\tRandomTime = 20;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RandomTime = %d\\n\", RandomTime));\n\t\t\t\t\tRTMPSetTimer(&pAd->StaCfg.IWscInfo.IWscT2Timer, (RandomTime*100));\n\t\t\t\t\tpAd->StaCfg.IWscInfo.bIWscT2TimerRunning = TRUE;\n\t\t\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t\t\t}\n#ifdef IWSC_TEST_SUPPORT\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMPSetTimer(&pWpsCtrl->WscScanTimer, 1000);\n\t\t        \tpWpsCtrl->WscScanTimerRunning = TRUE;\n\t\t\t\t}\n#endif /* IWSC_TEST_SUPPORT */\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tBOOLEAN bCancel;\n\t\t\tif (pWpsCtrl->WscPBCTimerRunning)\t\t\t\n\t\t\t\tRTMPCancelTimer(&pWpsCtrl->WscPBCTimer, &bCancel);\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = TRUE;\n\t\t}\n\t}\n\telse if (pWpsCtrl->WscMode == WSC_SMPBC_MODE)\n\t{\n\t\tWscPBCExec(pAd, FALSE, pWpsCtrl);\n#ifdef IWSC_TEST_SUPPORT\n\t\tif (pAd->StaCfg.IWscInfo.bIwscSmpbcScanningOnly)\n\t\t{\n\t\t\tRTMPSetTimer(&pWpsCtrl->WscScanTimer, 1000);\n        \tpWpsCtrl->WscScanTimerRunning = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_ScanDoneAction\\n\"));\n\t\t\treturn;\n\t\t}\n#endif /* IWSC_TEST_SUPPORT */\n\t\tif (pWpsCtrl->WscPBCBssCount == 1)\n\t\t{\n\t\t\tpWpsCtrl->WscStatus = WSC_STATE_START;\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = TRUE;\n\t\t}\n\t\telse if (pWpsCtrl->WscPBCBssCount == 0)\n\t\t{\n\t\t\tRTMPSetTimer(&pWpsCtrl->WscScanTimer, 1000);\n        \tpWpsCtrl->WscScanTimerRunning = TRUE;\n\t\t}\n\t\telse\n\t\t\tIWSC_Stop(pAd, FALSE);\n\t}\n\telse\n\t{\n\t\t{\n#ifdef IWSC_TEST_SUPPORT\n\t\t\tif (pAd->StaCfg.IWscInfo.IWscConfMode == WSC_ENROLLEE)\n\t\t\t{\n\t\t\t\tWscScanExec(pAd);\n\t\t\t}\n\t\t\telse\n#endif // IWSC_TEST_SUPPORT //\n\t\t\t{\n\t\t\t\tIWSC_RoleAction(pAd, WSC_REGISTRAR);\t\t\n\t\t\t\tRandomTime = RandomByte(pAd) & 0x3C;\n\t\t\t\tif (RandomTime > 60)\n\t\t\t\t\tRandomTime = 60;\n\t\t\t\telse if (RandomTime < 20)\n\t\t\t\t\tRandomTime = 20;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"RandomTime = %d\\n\", RandomTime));\n\t\t\t\tRTMPSetTimer(&pAd->StaCfg.IWscInfo.IWscT2Timer, (RandomTime*100));\n\t\t\t\tpAd->StaCfg.IWscInfo.bIWscT2TimerRunning = TRUE;\n\t\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t\t}\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_ScanDoneAction\\n\"));\n\n}\n\nVOID \tIWSC_ReConnectAction(\n    IN  PRTMP_ADAPTER \t\tpAd, \n    IN  PMLME_QUEUE_ELEM \tpElem) \n{\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\t\n    DBGPRINT(RT_DEBUG_TRACE, (\"-----> %s\\n\", __FUNCTION__));\n\tMlmeEnqueue(pAd,\n\t\t\t\tMLME_CNTL_STATE_MACHINE,\n\t\t\t\tOID_802_11_SSID,\n\t\t\t\tsizeof(NDIS_802_11_SSID),\n\t\t\t\t(VOID *)&pWpsCtrl->WscSsid, 0);\n\tRTMP_MLME_HANDLER(pAd);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- %s\\n\", __FUNCTION__));\n}\n\nVOID\tIWSC_BuildSelRegStartNotification(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUSHORT\t\t\tpIeLen)\n{\n//\tUCHAR \t\t\tData[512]; // change array to pointer \n\tUCHAR \t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n\tPWSC_CTRL\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tPWSC_REG_DATA\tpReg = (PWSC_REG_DATA) &pWpsCtrl->RegData;\n\tUSHORT\t\t\ttempVal = 0;\n\tUSHORT\t\t\tConfigError = htons(0);\n\tWSC_IE_HEADER \tieHdr;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 512);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_BuildSelRegStartNotification\\n\"));\n\n\t// WSC IE HEader\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; \n\tieHdr.oui[1] = 0x50; \n\tieHdr.oui[2] = 0xF2; \n\tieHdr.oui[3] = 0x10;\n\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Request Type */\n\ttempVal = WSC_MSGTYPE_REGISTRAR;\n    templen = AppendWSCTLV(WSC_ID_REQ_TYPE, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Config method */\n\ttempVal = htons(0x008c);\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_METHODS, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* UUID */\n\ttemplen = AppendWSCTLV(WSC_ID_UUID_E, pData, pReg->SelfInfo.Uuid, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Primary device type */\n\ttemplen = AppendWSCTLV(WSC_ID_PRIM_DEV_TYPE, pData, pReg->SelfInfo.PriDeviceType, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* RF band, shall change based on current channel */\n    templen = AppendWSCTLV(WSC_ID_RF_BAND, pData, &pReg->SelfInfo.RfBand, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Config error */\n\ttemplen = AppendWSCTLV(WSC_ID_CONFIG_ERROR, pData, (UINT8 *)&ConfigError, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Device Password ID */\n\tif (pWpsCtrl->WscMode == WSC_PIN_MODE)\n\t\ttempVal = DEV_PASS_ID_PIN;//cpu2be16(DEV_PASS_ID_PIN);\n\telse\n\t\ttempVal = cpu2be16(DEV_PASS_ID_PBC);\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_PWD_ID, pData, (UINT8 *)&tempVal, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* MAC address */\n\ttemplen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, pReg->SelfInfo.MacAddr, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\tieHdr.length = ieHdr.length + Len;\n\n\tRTMPMoveMemory(pOutBuf, &ieHdr, sizeof(WSC_IE_HEADER));\n\tRTMPMoveMemory(pOutBuf + sizeof(WSC_IE_HEADER), Data, Len);\n\t*pIeLen = (USHORT)(sizeof(WSC_IE_HEADER) + Len);\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_BuildSelRegStartNotification\\n\"));\n}\n\nVOID\tIWSC_BuildSelRegFinishNotification(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUSHORT\t\t\tpIeLen)\n{\n//\tUCHAR \t\t\tData[512];\n\tUCHAR \t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n\tPWSC_CTRL\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tPWSC_REG_DATA\tpReg = (PWSC_REG_DATA) &pWpsCtrl->RegData;\n\tWSC_IE_HEADER \tieHdr;\n\t\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 512);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_BuildSelRegFinishNotification\\n\"));\n\n\t// WSC IE HEader\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; \n\tieHdr.oui[1] = 0x50; \n\tieHdr.oui[2] = 0xF2; \n\tieHdr.oui[3] = 0x10;\n\t\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Simple Config State */\n\ttemplen = AppendWSCTLV(WSC_ID_SC_STATE, pData, (UINT8 *)&pWpsCtrl->WscConfStatus, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\ttemplen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, &pAd->CurrentAddress[0], 0);\n\tpData += templen;\n\tLen   += templen;\n\n\tieHdr.length = ieHdr.length + Len;\n\n\tRTMPMoveMemory(pOutBuf, &ieHdr, sizeof(WSC_IE_HEADER));\n\tRTMPMoveMemory(pOutBuf + sizeof(WSC_IE_HEADER), Data, Len);\n\t*pIeLen = sizeof(WSC_IE_HEADER) + Len;\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_BuildSelRegFinishNotification\\n\"));\n}\n\n/*\n\tIWSC Public Action Frame Format\n\t-----------------------------------------------------------------------------------------------\n\tField\t\t\tSize\t\tValue\n\t-----------------------------------------------------------------------------------------------\n\tCategory\t\t1 Octet\t\t0x04\n\t-----------------------------------------------------------------------------------------------\n\tAction field\t1 Octet\t\t0xDD\n\t-----------------------------------------------------------------------------------------------\n\tOUI\t\t\t\t3 Octets\t0x50 0x6F 0x9A\n\t-----------------------------------------------------------------------------------------------\n\tOUI type\t\t1 Octet\t\t0x10\n\t-----------------------------------------------------------------------------------------------\n\tOUI Subtype\t\t1 Octet\t\t0 - Selected Registrar Start Notification\n\t\t\t\t\t\t\t\t1 - Selected Registrar Finish Notification\n\t\t\t\t\t\t\t\t2 - Device Query Request\n\t\t\t\t\t\t\t\t3 - Device Query Response\n\t\t\t\t\t\t\t\t4 ~ 255 - Reserved\n\t-----------------------------------------------------------------------------------------------\n\tDialog Token\t1 Octet\t\tnonzero value (to identify the request/response transaction\n\t-----------------------------------------------------------------------------------------------\n\tElements\t\tvariable\tIWSC IE \n\t\t\t\t\t\t\t\t(It has the Element ID(0xDD), Length, IWSC OUI(0x00 0x50 0xF2 0x10)\n\t-----------------------------------------------------------------------------------------------\n*/\nVOID\tIWSC_SendActionFrame(\n\tIN  PRTMP_ADAPTER\t\tpAd,\n\tIN  UCHAR\t\t\t\tFrameType)\n{\n\tHEADER_802_11\tActHdr;\n\tPUCHAR\t\t\tpOutBuffer = NULL;\n\tULONG\t\t\tFrameLen = 0;\n\tUCHAR\t\t\tCategory = CATEGORY_PUBLIC;\n\tUCHAR\t\t\tAction = 9;\n\tPUCHAR\t\t\tpWscBuf = NULL;\n\tUSHORT\t\t\tWscIeLen = 0;\n\tULONG \t\t\tWscTmpLen = 0;\n\tPIWSC_INFO\t\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tNDIS_STATUS\t\tNStatus;\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  \n\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"IWSC_SendStartNotification:: allocate memory failed \\n\"));\n\t\treturn;\n\t}\n\n\tif (FrameType == IWSC_DEV_QUERY_RESPONSE)\n\t\tActHeaderInit(pAd, &ActHdr, pIWscInfo->IWscDevQueryReqMacAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\telse\n\t\tActHeaderInit(pAd, &ActHdr, BROADCAST_ADDR, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\n\tif (pIWscInfo->DialogToken == 0)\n\t\tpIWscInfo->DialogToken = 1;\n\telse\n\t\tpIWscInfo->DialogToken++;\n\t\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\t\tsizeof(HEADER_802_11),\t\t&ActHdr,\n\t\t\t\t\t1,\t\t\t\t\t\t\t&Category,\n\t\t\t\t\t1,\t\t\t\t\t\t\t&Action,\n\t\t\t\t\t4,\t\t\t\t\t\t\tIWSC_ACTION_OUI,\n\t\t\t\t\t1,\t\t\t\t\t\t\t&FrameType,\n\t\t\t\t\t1,\t\t\t\t\t\t\t&pIWscInfo->DialogToken,\n\t\t\t\t\tEND_OF_ARGS);\n\n\tos_alloc_mem(NULL, &pWscBuf, 512);\n\tif( pWscBuf != NULL)\n\t{\n\t\tNdisZeroMemory(pWscBuf, 512);\n\t\tif (FrameType == IWSC_SEL_REG_START_NOTITY)\n\t\t\tIWSC_BuildSelRegStartNotification(pAd, pWscBuf, &WscIeLen);\n\t\telse if (FrameType == IWSC_SEL_REG_FINISH_NOTITY)\n\t\t\tIWSC_BuildSelRegFinishNotification(pAd, pWscBuf, &WscIeLen);\n\t\telse if (FrameType == IWSC_DEV_QUERY_REQUEST)\n\t\t\tIWSC_BuildDevQueryFrame(pAd, pWscBuf, &WscIeLen);\n\t\telse if (FrameType == IWSC_DEV_QUERY_RESPONSE)\n\t\t\tIWSC_BuildDevQueryFrame(pAd, pWscBuf, &WscIeLen);\n\n\t\tMakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen,\n\t\t\t\t\t\t  WscIeLen,\t\t\t\t pWscBuf,\n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\tFrameLen += WscTmpLen;\n\t\tos_free_mem(NULL, pWscBuf);\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_WARN, (\"%s:: WscBuf Allocate failed!\\n\", __FUNCTION__));\n\n\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n\nVOID\tIWSC_PeerAction(\n\tIN  PRTMP_ADAPTER\t\tpAd, \n\tIN  PMLME_QUEUE_ELEM \tpElem) \n{\t\n\tUCHAR\tToken = pElem->Msg[LENGTH_802_11+7];\n\tUCHAR\tFrameType = pElem->Msg[LENGTH_802_11+6];\n\tPUCHAR\tpData = pElem->Msg+(LENGTH_802_11+8);\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tINT\t\tLen = 0;\n\tINT\t\tTotalLen = (INT)pElem->MsgLen - (LENGTH_802_11+8);\n\tUSHORT\tRegDPID;\n\tUSHORT\tRegCfgMethods;\n\tUINT8\tReqType = 0;\n\tUCHAR\tPeerMAC[MAC_ADDR_LEN];\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_PeerAction\\n\"));\n\n\t/*\n\t\tMarvell STA always send same non-zero Token value, thus we don't need to check Token value here.\n\t*/\n\t{\n\t\t/*\n\t\t\tIWSC Element may not be first one element in Action frame.\n\t\t*/\n\t\tpIWscInfo->PeerDialogToken = Token;\n\t\tfor (;;)\n\t\t{\n\t\t\tLen = (INT)*(pData + 1);\n\t\t\t/*hex_dump(\"sn - pData\", pData, Len+2);*/\n\t\t\tpData = pData + 2;\n\t\t\tif (NdisEqualMemory(pData, IWSC_OUI, 4))\n\t\t\t{\n\t\t\t\tLen -= 4; // OUI Length\n\t\t\t\tpData = pData + 4;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tTotalLen -= (Len + 2); // 2: ID + Len\n\t\t\tif (TotalLen <= 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"No IWSC IE!\\n<----- IWSC_PeerAction\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpData = pData + Len;\n\t\t}\n\n\t\thex_dump(\"pData\", pData, Len);\n\t\twhile (Len > 0)\n\t\t{\n\t\t\tWSC_IE\tWscIE;\n\t\t\tPWSC_IE\tpWscIE;\n\t\t\tNdisMoveMemory(&WscIE, pData, sizeof(WSC_IE));\n\t\t\t/* Check for WSC IEs */\n\t\t\tpWscIE = &WscIE;\n\n\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_REQ_TYPE)\n\t\t\t{\n\t\t\t\tReqType = *(pData + 4);\n\t\t\t}\n\n\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_SEL_REG_CFG_METHODS)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&RegCfgMethods, pData + 4, sizeof(USHORT));\n\t\t\t\tRegCfgMethods = be2cpu16(RegCfgMethods);\n\t\t\t}\n\n\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_DEVICE_PWD_ID)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&RegDPID, pData + 4, sizeof(USHORT));\n\t\t\t\tRegDPID = be2cpu16(RegDPID);\n\t\t\t}\n\t\t\t\n\t\t\tif (be2cpu16(pWscIE->Type) == WSC_ID_MAC_ADDR)\n\t\t\t{\n\t\t\t\tRTMPMoveMemory(PeerMAC, pData + 4, MAC_ADDR_LEN);\n\t\t\t}\n\n\t\t\t/*\n\t\t\t\tSet the offset\n\t\t\t\tSince Type and Length are both short type, we need to offset 4, not 2\n\t\t\t*/\n\t\t\tpData += (be2cpu16(pWscIE->Length) + 4);\n\t\t\tLen   -= (be2cpu16(pWscIE->Length) + 4);\n\t\t}\t\t\n\n\t\tif (FrameType == IWSC_SEL_REG_START_NOTITY)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive SelRegStartNotification from %02X:%02X:%02X:%02X:%02X:%02X!\\n\",\n\t\t\t\t\t\tPeerMAC[0], PeerMAC[1], PeerMAC[2], PeerMAC[3], PeerMAC[4], PeerMAC[5]));\n\t\t\tpIWscInfo->bSelRegStart = TRUE;\n\t\t\tRTMPMoveMemory(pIWscInfo->RegMacAddr, PeerMAC, MAC_ADDR_LEN);\n\t\t\tWscBuildProbeRespIE(pAd, \n\t\t\t\t\t\t\t\tWSC_MSGTYPE_IWSC_NOTIFIER, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfStatus, \n\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\tRegDPID, \n\t\t\t\t\t\t\t\tRegCfgMethods, \n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tNULL,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tSTA_MODE);\n\t\t}\n\t\telse if (FrameType == IWSC_SEL_REG_FINISH_NOTITY)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive SelRegFinishNotification from %02X:%02X:%02X:%02X:%02X:%02X!\\n\",\n\t\t\t\t\t\tPeerMAC[0], PeerMAC[1], PeerMAC[2], PeerMAC[3], PeerMAC[4], PeerMAC[5]));\n\t\t\tif (NdisEqualMemory(pIWscInfo->RegMacAddr, PeerMAC, MAC_ADDR_LEN))\n\t\t\t{\n\t\t\t\tpIWscInfo->bSelRegStart = FALSE;\n\t\t\t\tNdisZeroMemory(pIWscInfo->RegMacAddr, MAC_ADDR_LEN);\n\t\t\t}\n\t\t\tif (pAd->StaCfg.WscControl.bWscTrigger == FALSE)\n\t\t\t\tpAd->StaCfg.WpsIEProbeResp.ValueLen = 0;\n\t\t}\n\t\telse if (FrameType == IWSC_DEV_QUERY_REQUEST)\n\t\t{\t\t\t\n\t\t\tUCHAR RandomVal = RandomByte(pAd);\n\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive Device Query Request from %02X:%02X:%02X:%02X:%02X:%02X!\\n\",\n\t\t\t\t\t\tPeerMAC[0], PeerMAC[1], PeerMAC[2], PeerMAC[3], PeerMAC[4], PeerMAC[5]));\t\t\t\n\t\t\tif (RandomVal < 20)\n\t\t\t\tRandomVal = 20;\n\t\t\tif (RandomVal > 50)\n\t\t\t\tRandomVal = 50;\n\t\t\tNdisMoveMemory(pIWscInfo->IWscDevQueryReqMacAddr, PeerMAC, MAC_ADDR_LEN);\n\t\t\tRTMPSetTimer(&pIWscInfo->IWscDevQueryTimer, RandomVal*10);\n\t\t\tpIWscInfo->bIWscDevQueryRspTimerRunning = TRUE;\n\n#ifdef IWSC_TEST_SUPPORT\n\t\t\tif (pAd->StaCfg.IWscInfo.bBlockConnection)\n\t\t\t\treturn;\n#endif /* IWSC_TEST_SUPPORT */\n\n\t\t\tpEntry = MacTableLookup(pAd, PeerMAC);\n\n\t\t\tif (pEntry == NULL)\n\t\t\t{\n\t\t\t\t// Another adhoc joining, add to our MAC table. \n\t\t\t\tpEntry = MacTableInsertEntry(pAd, PeerMAC, BSS0, OPMODE_STA, FALSE);\n\t\t\t}\n\n\t\t\tif (pEntry)\n\t\t\t{\n#ifdef ADHOC_WPA2PSK_SUPPORT\n                //Adhoc support WPA2PSK by Eddy\n                if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) \n                    && (pEntry->WPA_Authenticator.WpaState < AS_INITPSK))                      \n                {\n    \t\t\t\tINT len, i;\n\t\t\t\t\tBOOLEAN bHigherMAC = FALSE;\n\n            \t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                    NdisZeroMemory(&pEntry->WPA_Supplicant.ReplayCounter, LEN_KEY_DESC_REPLAY);                        \n                    NdisZeroMemory(&pEntry->WPA_Authenticator.ReplayCounter, LEN_KEY_DESC_REPLAY);                        \n                    pEntry->WPA_Authenticator.WpaState = AS_INITPSK;\n                    pEntry->WPA_Supplicant.WpaState = AS_INITPSK;\n            \t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_PSK;\n\n\t\t\t\t\t// collapse into the ADHOC network which has bigger BSSID value.\n\t\t\t\t\tfor (i = 0; i < 6; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (PeerMAC[i] > pAd->CurrentAddress[i])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbHigherMAC = TRUE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (PeerMAC[i] < pAd->CurrentAddress[i])\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\thex_dump(\"IWSC_PeerAction:: PeerMAC\", PeerMAC, MAC_ADDR_LEN);\n\t\t\t\t\thex_dump(\"IWSC_PeerAction:: pAd->CurrentAddress\", pAd->CurrentAddress, MAC_ADDR_LEN);\n\t\t\t\t\tpEntry->bPeerHigherMAC = bHigherMAC;\n\t\t\t\t\tif (pEntry->bPeerHigherMAC == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tMy MAC address is higher than peer's MAC address.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - EnqueueStartForPSKTimer.\\n\", __FUNCTION__));\n            \t\t\tRTMPSetTimer(&pEntry->EnqueueStartForPSKTimer, ENQUEUE_EAPOL_START_TIMER);\n\t\t\t\t\t\tpEntry->bPeerHigherMAC = FALSE;\n\t\t\t\t\t}\n                }\n\t\t\t\telse \n#endif // ADHOC_WPA2PSK_SUPPORT //\n\t\t\t\t{\n\t\t\t\t\tif (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n                }\n\t\t\t}\n\t\t}\n\t\telse if (FrameType == IWSC_DEV_QUERY_RESPONSE)\n\t\t{\n\t\t\tMAC_TABLE_ENTRY *pEntry;\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Receive Device Query Response from %02X:%02X:%02X:%02X:%02X:%02X!\\n\",\n\t\t\t\t\t\tPeerMAC[0], PeerMAC[1], PeerMAC[2], PeerMAC[3], PeerMAC[4], PeerMAC[5]));\n\n\n#ifdef IWSC_TEST_SUPPORT\n\t\t\tif (pAd->StaCfg.IWscInfo.bBlockConnection)\n\t\t\t\treturn;\n#endif /* IWSC_TEST_SUPPORT */\n\n\t\t\tpEntry = MacTableLookup(pAd, PeerMAC);\n\n\t\t\tif (pEntry == NULL)\n\t\t\t{\n\t\t\t\t// Another adhoc joining, add to our MAC table. \n\t\t\t\tpEntry = MacTableInsertEntry(pAd, PeerMAC, BSS0, OPMODE_STA, FALSE);\n\t\t\t}\n\n\t\t\tif (pEntry)\n\t\t\t{\n#ifdef ADHOC_WPA2PSK_SUPPORT\n                //Adhoc support WPA2PSK by Eddy\n                if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) \n                    && (pEntry->WPA_Authenticator.WpaState < AS_INITPSK))                      \n                {\n    \t\t\t\tINT               len, i;\n\t\t\t\t\tBOOLEAN bHigherMAC = FALSE;\n\n            \t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                    NdisZeroMemory(&pEntry->WPA_Supplicant.ReplayCounter, LEN_KEY_DESC_REPLAY);                        \n                    NdisZeroMemory(&pEntry->WPA_Authenticator.ReplayCounter, LEN_KEY_DESC_REPLAY);                        \n                    pEntry->WPA_Authenticator.WpaState = AS_INITPSK;\n                    pEntry->WPA_Supplicant.WpaState = AS_INITPSK;\n            \t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_PSK;\n\n\t\t\t\t\t// collapse into the ADHOC network which has bigger BSSID value.\n\t\t\t\t\tfor (i = 0; i < 6; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (PeerMAC[i] > pAd->CurrentAddress[i])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbHigherMAC = TRUE;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (PeerMAC[i] < pAd->CurrentAddress[i])\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\thex_dump(\"IWSC_PeerAction:: PeerMAC\", PeerMAC, MAC_ADDR_LEN);\n\t\t\t\t\thex_dump(\"IWSC_PeerAction:: pAd->CurrentAddress\", pAd->CurrentAddress, MAC_ADDR_LEN);\n\t\t\t\t\tpEntry->bPeerHigherMAC = bHigherMAC;\n\t\t\t\t\tif (pEntry->bPeerHigherMAC == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tMy MAC address is higher than peer's MAC address.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s - EnqueueStartForPSKTimer.\\n\", __FUNCTION__));\n            \t\t\tRTMPSetTimer(&pEntry->EnqueueStartForPSKTimer, ENQUEUE_EAPOL_START_TIMER);\n\t\t\t\t\t\tpEntry->bPeerHigherMAC = FALSE;\n\t\t\t\t\t}\n                }\n\t\t\t\telse \n#endif // ADHOC_WPA2PSK_SUPPORT //\n\t\t\t\t{\n\t\t\t\t\tif (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)\n\t\t\t\t\t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n                }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Unknow Frame Type!\\n\"));\n\t\t}\n\t}\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_PeerAction\\n\"));\n}\n\n\nVOID\tIWSC_PeerProbeRequest(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMLME_QUEUE_ELEM \tpElem)\n{\n\tPWSC_CTRL\tpWscCtrl = &pAd->StaCfg.WscControl;\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tUSHORT \t\tPeerConfigMethod = 0;\n\tUSHORT \t\tConfigMethod = 0;\n\tBOOLEAN\t\tCancelled;\n\tUSHORT\t\tDPID = 0;\n\n\tif (pWscCtrl->WscConfMode != WSC_REGISTRAR)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IWSC_PeerProbeRequest:: Not Registrar now(WscConfMode = %d)\\n\"\n\t\t\t\t\t\t\t, pWscCtrl->WscConfMode));\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_PeerProbeRequest\\n\"));\n\t\n\tNdisMoveMemory(&PeerConfigMethod, pElem->Msg, pElem->MsgLen);\n\n\tif (pIWscInfo->bIWscT2TimerRunning)\n\t{\n\t\tRTMPCancelTimer(&pIWscInfo->IWscT2Timer, &Cancelled);\n\t\tpIWscInfo->bIWscT2TimerRunning = FALSE;\n\t}\n\t\n\tif (pWscCtrl->WscMode == WSC_PIN_MODE)\n\t{\n\t\tif (PeerConfigMethod & WPS_CONFIG_METHODS_KEYPAD)\n\t\t{\n\t\t\tif (pIWscInfo->bSinglePIN == FALSE)\n\t\t\t{\n\t\t\t\tpWscCtrl->WscEnrolleePinCode = WscRandomGeneratePinCode(pAd, BSS0);\n\t\t\t\tpWscCtrl->WscEnrolleePinCodeLen = 8;\n\t\t\t\tpWscCtrl->WscPinCodeLen = 8;\n\t\t\t\tpWscCtrl->WscStatus = STATUS_WSC_IBSS_NEW_RANDOM_PIN;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpWscCtrl->WscStatus = STATUS_WSC_IBSS_FIXED_PIN;\n\t\t\t\n\t\t\tWscGetRegDataPIN(pAd, pWscCtrl->WscEnrolleePinCode, pWscCtrl);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerProbeRequest:: WscPinCode = %08d\\n\", pWscCtrl->WscPinCode));\n\t\t}\n\t\telse \n\t\t{\n\t\t\tif (pAd->StaCfg.IWscInfo.bLimitedUI)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, \n\t\t\t\t\t(\"IWSC_PeerProbeRequest:: Both devices are limited UI. Shall we change to use PBC mode?\\n\"));\n\t\t\t\tIWSC_Stop(pAd, FALSE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpWscCtrl->WscPinCode = 0;\n\t\t\t\tpWscCtrl->WscStatus = STATUS_WSC_WAIT_PIN_CODE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerProbeRequest:: Please input Peer's PIN\\n\"));\n\t\t\t}\n\t\t}\n\t\tif (PeerConfigMethod & WPS_CONFIG_METHODS_KEYPAD)\n\t\t{\n\t\t\tDPID = DEV_PASS_ID_REG;\n\t\t\tConfigMethod = WPS_CONFIG_METHODS_DISPLAY;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDPID = DEV_PASS_ID_PIN;\n\t\t\tConfigMethod = (WPS_CONFIG_METHODS_DISPLAY | WPS_CONFIG_METHODS_KEYPAD);\n\t\t}\n\t\t\n\t\tAsicDisableSync(pAd);\n\t\tWscBuildBeaconIE(pAd, \n\t\t\t\t\t\tpWscCtrl->WscConfStatus, \n\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\tDPID,\n\t\t\t\t\t\tConfigMethod, \n\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t0,\n\t\t\t\t\t\tSTA_MODE);\n\t\tMakeIbssBeacon(pAd);        /* re-build BEACON frame */\n\t\tAsicEnableIbssSync(pAd);    /* copy BEACON frame to on-chip memory */\n\t\tWscBuildProbeRespIE(pAd, \n\t\t\t\t\t\tWSC_MSGTYPE_REGISTRAR, \n\t\t\t\t\t\tpWscCtrl->WscConfStatus, \n\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\tDPID, \n\t\t\t\t\t\tConfigMethod, \n\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t0,\n\t\t\t\t\t\tSTA_MODE);\n\t}\n\tpAd->Mlme.IWscMachine.CurrState = IWSC_WAIT_JOIN;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_PeerProbeRequest\\n\"));\n\treturn;\n}\n\nVOID\tIWSC_PeerProbeResponse(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMLME_QUEUE_ELEM \tpElem)\n{\n\tPWSC_CTRL\tpWscCtrl = &pAd->StaCfg.WscControl;\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tUSHORT \t\tPeerConfigMethod = 0;\n\tBOOLEAN\t\tCancelled;\n\n\tif (pWscCtrl->WscConfMode != WSC_ENROLLEE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"IWSC_PeerProbeResponse:: Not Enrollee now(WscConfMode = %d)\\n\"\n\t\t\t\t\t\t\t, pWscCtrl->WscConfMode));\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_PeerProbeResponse\\n\"));\n\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer,\t   &Cancelled);\n\t\tpAd->MlmeAux.Channel = 0;\n\t\t// Change back to original channel in case of doing scan\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\n\t\t// Resume MSDU which is turned off durning scan\n\t\tRTMPResumeMsduTransmission(pAd);\n\n\t\tpAd->Mlme.CntlMachine.CurrState    = CNTL_IDLE;\n\t\tpAd->Mlme.SyncMachine.CurrState    = SYNC_IDLE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Cancel Scan Timer\\n\"));\n\t}\n\t\n\tNdisMoveMemory(&PeerConfigMethod, pElem->Msg, pElem->MsgLen);\n\n\tif (pAd->StaCfg.IWscInfo.bLimitedUI)\n\t{\n\t\tif (PeerConfigMethod & WPS_CONFIG_METHODS_KEYPAD)\n\t\t{\n\t\t\tif (pIWscInfo->bSinglePIN == FALSE)\n\t\t\t{\n\t\t\t\tpWscCtrl->WscEnrolleePinCode = WscRandomGeneratePinCode(pAd, BSS0);\n\t\t\t\tpWscCtrl->WscEnrolleePinCodeLen = 8;\n\t\t\t\tpWscCtrl->WscPinCodeLen = 8;\t\t\t\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerProbeResponse:: WscPinCode = %d\\n\", pWscCtrl->WscPinCode));\n\t\t\t\tpWscCtrl->WscStatus = STATUS_WSC_IBSS_NEW_RANDOM_PIN;\n\t\t\t}\n\t\t\telse\n\t\t\t\tpWscCtrl->WscStatus = STATUS_WSC_IBSS_FIXED_PIN;\n\n\t\t\tWscGetRegDataPIN(pAd, pWscCtrl->WscEnrolleePinCode, pWscCtrl);\n\t\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\t\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, \n\t\t\t\t(\"IWSC_PeerProbeRequest:: Both devices are limited UI. Shall we change to use PBC mode?\\n\"));\n\t\t\tIWSC_Stop(pAd, FALSE);\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerProbeResponse:: Please input Peer's PIN\\n\"));\n\t\tpAd->Mlme.IWscMachine.CurrState = IWSC_WAIT_PIN;\n\t\tpWscCtrl->WscStatus = STATUS_WSC_WAIT_PIN_CODE;\n\t}\n\t\n\tMlmeEnqueue(pAd,\n\t\tMLME_CNTL_STATE_MACHINE,\n\t\tOID_802_11_SSID,\n\t\tsizeof(NDIS_802_11_SSID),\n\t\t(VOID *)&pWscCtrl->WscSsid, 0);\n\tRTMP_MLME_HANDLER(pAd);\n\t\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_PeerProbeResponse\\n\"));\n\treturn;\n}\n\nVOID\tIWSC_PeerPIN(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMLME_QUEUE_ELEM \tpElem)\n{\n\tPWSC_CTRL\tpWscCtrl = &pAd->StaCfg.WscControl;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_PeerPIN\\n\"));\n\tif (ADHOC_ON(pAd))\n\t{\n\t\tNdisZeroMemory(pWscCtrl->EntryAddr, MAC_ADDR_LEN);\n\t\tNdisMoveMemory(pWscCtrl->EntryAddr, pWscCtrl->WscPeerMAC, MAC_ADDR_LEN);\n\t\tpWscCtrl->WscState = WSC_STATE_LINK_UP;\n\t\tpWscCtrl->WscStatus = STATUS_WSC_LINK_UP;\n\t\tWscSendEapolStart(pAd, pWscCtrl->WscPeerMAC, STA_MODE);\n\t}\n\telse\n\t{\n\t\thex_dump(\"WscPeerMAC\", pWscCtrl->WscPeerMAC, MAC_ADDR_LEN);\n\t\tMlmeEnqueue(pAd,\n\t\t\t\tMLME_CNTL_STATE_MACHINE,\n\t\t\t\tOID_802_11_SSID,\n\t\t\t\tsizeof(NDIS_802_11_SSID),\n\t\t\t\t(VOID *)&pWscCtrl->WscSsid, 0);\n\t\tRTMP_MLME_HANDLER(pAd);\n\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = TRUE;\n\t}\n\tpAd->Mlme.IWscMachine.CurrState = IWSC_START;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_PeerPIN\\n\"));\n}\nBOOLEAN\tIWSC_PeerEapolStart(\n    IN  PRTMP_ADAPTER\t\tpAd,\n    IN  PMAC_TABLE_ENTRY \tpEntry)\n{\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tBOOLEAN\t\tCancelled;\n\n\tif (pWpsCtrl->WscConfMode != WSC_REGISTRAR)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerEapolStart:: Not Registrar now(WscConfMode = %d)\\n\", pWpsCtrl->WscConfMode));\n\t\treturn FALSE;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_PeerEapolStart\\n\"));\n\n\t// Receive enrollee identity from EAP\n\tif (pWpsCtrl->WscMode == WSC_PBC_MODE)\n\t{\n\t\t/*\n\t\t\tSome WPS PBC Station select AP from UI directly; doesn't do PBC scan.\n\t\t\tNeed to check DPID from STA again here.\n\t\t*/\n\t\tWscPBC_DPID_FromSTA(pAd, pEntry->Addr);\n\t\tWscPBCSessionOverlapCheck(pAd);\n\t\tif ((pAd->CommonCfg.WscStaPbcProbeInfo.WscPBCStaProbeCount == 1) &&\n\t\t\t!NdisEqualMemory(pAd->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[0], &ZERO_MAC_ADDR[0], MAC_ADDR_LEN) &&\n\t\t\t(NdisEqualMemory(pAd->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[0], &pEntry->Addr[0], 6) == FALSE))\n\t\t{\n\t\t\tpAd->CommonCfg.WscPBCOverlap = TRUE;\n\t\t}\n\t\t//if (pAd->CommonCfg.WscPBCOverlap)\n\t\t{\n\t\t\thex_dump(\"EntryAddr\", pWpsCtrl->EntryAddr, 6);\n\t\t\thex_dump(\"StaMacAddr0\", pAd->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[0], 6);\n\t\t\thex_dump(\"StaMacAddr1\", pAd->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[1], 6);\n\t\t\thex_dump(\"StaMacAddr2\", pAd->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[2], 6);\n\t\t\thex_dump(\"StaMacAddr3\", pAd->CommonCfg.WscStaPbcProbeInfo.StaMacAddr[3], 6);\n\t\t}\n\t\tif (pAd->CommonCfg.WscPBCOverlap == TRUE)\n\t\t{\n\t\t\t// PBC session overlap\n\t\t\tpWpsCtrl->WscStatus = STATUS_WSC_PBC_SESSION_OVERLAP;\n\t\t\tRTMPSendWirelessEvent(pAd, IW_WSC_PBC_SESSION_OVERLAP, NULL, pWpsCtrl->EntryIfIdx, 0); \n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerEapolStart: PBC Session Overlap!\\n\"));\n\t\t\tIWSC_MlmeStopAction(pAd, NULL);\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\telse if (pWpsCtrl->WscMode == WSC_SMPBC_MODE)\n\t{\n\t\tif (pEntry->bIWscSmpbcAccept == FALSE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerEapolStart:: pEntry->bIWscSmpbcAccept == FALSE\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (pWpsCtrl->EapMsgRunning == TRUE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IWSC_PeerEapolStart:: Busy now\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (pIWscInfo->bIWscT1TimerRunning)\n\t\t{\n\t\t\tRTMPCancelTimer(&pIWscInfo->IWscT1Timer, &Cancelled);\n\t\t\tpIWscInfo->bIWscT1TimerRunning = FALSE;\n\t\t}\n\t}\n\n\tif (pIWscInfo->bIWscT2TimerRunning)\n\t{\n\t\tRTMPCancelTimer(&pIWscInfo->IWscT2Timer, &Cancelled);\n\t\tpIWscInfo->bIWscT2TimerRunning = FALSE;\n\t}\n\t\n\tif (MAC_ADDR_EQUAL(pWpsCtrl->EntryAddr, ZERO_MAC_ADDR))\n\t{\n\t\tNdisMoveMemory(pWpsCtrl->EntryAddr, pEntry->Addr, MAC_ADDR_LEN);\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_PeerEapolStart\\n\"));\n\treturn TRUE;\n}\n\nVOID\tIWSC_RoleAction(\n    IN  PRTMP_ADAPTER\tpAd,\n    IN  INT\t\t\t\tWscConfMode)\n{\n\tPWSC_CTRL\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tUSHORT\t\tWscMode;\n\tUSHORT\t\tConfigMethod = pWpsCtrl->WscConfigMethods;\n\t\n\tif (WscConfMode == WSC_REGISTRAR)\n\t{\n\t\tpWpsCtrl->WscConfMode = WSC_REGISTRAR;\t\t\n\t\tAsicDisableSync(pAd);\n\n\t\tif (pWpsCtrl->WscMode == WSC_PBC_MODE)\n\t\t\tWscMode = DEV_PASS_ID_PBC;\n\t\telse if (pWpsCtrl->WscMode == WSC_SMPBC_MODE)\n\t\t\tWscMode = DEV_PASS_ID_SMPBC;\n\t\telse\n\t\t{\n\t\t\tWscMode = DEV_PASS_ID_REG;\n\t\t}\n\t\t\n\t\tif (!pAd->StaCfg.IWscInfo.bLimitedUI)\n\t\t\tConfigMethod |= WPS_CONFIG_METHODS_KEYPAD;\n\t\telse\n\t\t\tConfigMethod &= (~WPS_CONFIG_METHODS_KEYPAD);\n\t\tWscBuildBeaconIE(pAd, pWpsCtrl->WscConfStatus, TRUE, WscMode, ConfigMethod, BSS0, NULL, 0, STA_MODE);\n\t\tWscBuildProbeRespIE(pAd, WSC_MSGTYPE_REGISTRAR, pWpsCtrl->WscConfStatus, TRUE, WscMode, ConfigMethod, BSS0, NULL, 0, STA_MODE);\n\t\tMakeIbssBeacon(pAd);        /* re-build BEACON frame */\n\t\tAsicEnableIbssSync(pAd);    /* copy BEACON frame to on-chip memory */\n\t\tpWpsCtrl->WscState = WSC_STATE_LINK_UP;\n\t\tpWpsCtrl->WscStatus = STATUS_WSC_LINK_UP;\n\t\tRTMPSendWirelessEvent(pAd, IW_IWSC_BECOME_REGISTRAR, NULL, pWpsCtrl->EntryIfIdx, 0);\n\t}\n\telse\n\t{\n\t\tpWpsCtrl->WscRejectSamePinFromEnrollee = FALSE;\n\t\tpWpsCtrl->WscConfMode = WSC_ENROLLEE;\n\t\t\t\n\t\t/*\n\t\t\tSet the AutoReconnectSsid to prevent it reconnect to old SSID\n\t\t*/\n\t\tpAd->MlmeAux.AutoReconnectSsidLen= 32;\n\t\tNdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);\n\t\t\n\t\tAsicDisableSync(pAd);\n\t\tpAd->StaCfg.WpsIEBeacon.ValueLen = 0;\n\t\tpAd->StaCfg.WpsIEProbeResp.ValueLen = 0;\n\t\tMakeIbssBeacon(pAd);        /* re-build BEACON frame */\n\t\tAsicEnableIbssSync(pAd);    /* copy BEACON frame to on-chip memory */\n\n\t\tpWpsCtrl->WscState = WSC_STATE_START;\n\t\tpWpsCtrl->WscStatus = STATUS_WSC_SCAN_AP;\n\t\tNdisZeroMemory(&pWpsCtrl->WscSsid, sizeof(NDIS_802_11_SSID));\n\t\tRTMPSendWirelessEvent(pAd, IW_IWSC_BECOME_ENROLLEE, NULL, pWpsCtrl->EntryIfIdx, 0);\n\t\t// For PBC, the PIN is all '0'\n\t\tWscGetRegDataPIN(pAd, pWpsCtrl->WscPinCode, pWpsCtrl);\n\t\tWscScanExec(pAd, pWpsCtrl);\n\t}\n}\n\nVOID \tIWSC_AddSmpbcEnrollee(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR\t\t\tpPeerAddr)\n{\n\tPWSC_CTRL pWpsCtrl = &pAd->StaCfg.WscControl;\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\tPMAC_TABLE_ENTRY pEntry = NULL;\n\tPWSC_PEER_ENTRY pWscPeerEntry = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_AddSmpbcEnrollee (WscConfMode = %d, WscStatus = %d)\\n\", \n\t\t\t\t\tpWpsCtrl->WscConfMode, pWpsCtrl->WscStatus));\n\n\tpWscPeerEntry = WscFindPeerEntry(&pWpsCtrl->WscPeerList, pPeerAddr);\n\tif (pWscPeerEntry && \n\t\tpWscPeerEntry->bIWscSmpbcAccept &&\n\t\t!pIWscInfo->bIWscEntryTimerRunning)\n\t{\n\t\tpEntry = MacTableLookup(pAd, pPeerAddr);\n\t\tif (pEntry == NULL)\n\t\t\tpEntry = MacTableInsertEntry(pAd, pPeerAddr, BSS0, OPMODE_STA, FALSE);\n\t\tif (pEntry)\n\t\t{\n\t\t\tpEntry->bIWscSmpbcAccept = TRUE;\n\t\t\tif ((pWpsCtrl->WscConfMode == WSC_DISABLE) &&\n\t\t\t\t(pWpsCtrl->WscStatus == STATUS_WSC_CONFIGURED || pWpsCtrl->WscStatus == STATUS_WSC_IBSS_WAIT_NEXT_SMPBC_ENROLLEE))\n\t\t\t{\n\t\t\t\tpWpsCtrl->WscConfMode = WSC_REGISTRAR;\n\t\t\t\tpWpsCtrl->WscMode = WSC_SMPBC_MODE;\n\t\t\t\tpWpsCtrl->WscState = WSC_STATE_LINK_UP;\n\t\t\t\tpWpsCtrl->WscStatus = STATUS_WSC_LINK_UP;\n\t\t\t\tpWpsCtrl->bWscTrigger = TRUE;\n\t\t\t\tWscBuildProbeRespIE(pAd, \n\t\t\t\t\t\t\t\tWSC_MSGTYPE_REGISTRAR, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfStatus, \n\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\tDEV_PASS_ID_SMPBC, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfigMethods, \n\t\t\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tSTA_MODE);\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SMPBC Enrollee - %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[0],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[1],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[2],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[3],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[4],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[5]));\n\t\t}\n\t}\n\telse if (pIWscInfo->bIWscEntryTimerRunning)\n\t{\n\t\tpEntry = MacTableLookup(pAd, pPeerAddr);\n\t\tif (pEntry == NULL)\n\t\t{\t\t\t\n\t\t\tpEntry = MacTableInsertEntry(pAd, pPeerAddr, BSS0, OPMODE_STA, FALSE);\n\t\t\tpWscPeerEntry = WscFindPeerEntry(&pWpsCtrl->WscPeerList, pPeerAddr);\n\t\t\tif (pWscPeerEntry == NULL)\n\t\t\t\tpIWscInfo->IWscSmpbcAcceptCount++;\n\t\t}\n\n\t\tif (pEntry && !pEntry->bIWscSmpbcAccept)\n\t\t{\n\t\t\tpEntry->bIWscSmpbcAccept = TRUE;\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"Accept this peer enrollee - %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[0],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[1],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[2],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[3],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[4],\n\t\t\t\t\t\t\t\t\t\tpEntry->Addr[5]));\n\n\t\t\tWscInsertPeerEntryByMAC(&pWpsCtrl->WscPeerList, pPeerAddr);\n\t\t\tpWscPeerEntry = WscFindPeerEntry(&pWpsCtrl->WscPeerList, pPeerAddr);\n\n\t\t\tif (pWscPeerEntry)\n\t\t\t\tpWscPeerEntry->bIWscSmpbcAccept = TRUE;\n\t\t\t\n\t\t\tif ((pWpsCtrl->WscConfMode == WSC_DISABLE) &&\n\t\t\t\t(pWpsCtrl->WscStatus == STATUS_WSC_CONFIGURED || pWpsCtrl->WscStatus == STATUS_WSC_IBSS_WAIT_NEXT_SMPBC_ENROLLEE))\n\t\t\t{\n\t\t\t\tpWpsCtrl->WscConfMode = WSC_REGISTRAR;\n\t\t\t\tpWpsCtrl->WscMode = WSC_SMPBC_MODE;\n\t\t\t\tpWpsCtrl->WscState = WSC_STATE_LINK_UP;\n\t\t\t\tpWpsCtrl->WscStatus = STATUS_WSC_LINK_UP;\n\t\t\t\tpWpsCtrl->bWscTrigger = TRUE;\n\t\t\t}\n\t\t\tWscBuildProbeRespIE(pAd, \n\t\t\t\t\t\t\t\tWSC_MSGTYPE_REGISTRAR, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfStatus, \n\t\t\t\t\t\t\t\tTRUE, \n\t\t\t\t\t\t\t\tDEV_PASS_ID_SMPBC, \n\t\t\t\t\t\t\t\tpAd->StaCfg.WscControl.WscConfigMethods, \n\t\t\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tSTA_MODE);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_AddSmpbcEnrollee\\n\"));\n\treturn;\n}\n\nULONG \tIWSC_SearchWpsApByPinMethod(\n\tIN  PRTMP_ADAPTER\tpAd)\n{\n\tUCHAR \t\ti;\n\tBSS_ENTRY \t*pBss;\n\n\tfor (i = 0; i < pAd->ScanTab.BssNr; i++) \n\t{\n\t\tpBss = &pAd->ScanTab.BssEntry[i];\n\t\tif ((pBss->WpsAP) &&\n\t\t\t(pBss->BssType == BSS_ADHOC) &&\n\t\t\t((pBss->WscDPIDFromWpsAP == DEV_PASS_ID_PIN) || (pBss->WscDPIDFromWpsAP == DEV_PASS_ID_REG)))\n\t\t{\n\t\t\treturn (ULONG)i;\n\t\t}\n\t}\n\treturn (ULONG)BSS_NOT_FOUND;\n}\n\nVOID\tIWSC_GetConfigMethod(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpVIE,\n\tIN\tINT\t\t\t\tVIELen,\n\tOUT PUSHORT\t\t\tpConfigMethod)\n{\n\tPUCHAR\tpData = pVIE;\n\tINT\t\tLen = VIELen;\n\tPBEACON_EID_STRUCT\tpEid;\n\tUSHORT\tType = 0, TLV_Len = 0;\n\t\n\twhile (Len > 0)\n\t{\n\t\tpEid = (PBEACON_EID_STRUCT) pData;\n\t\t\n\t\t// No match, skip the Eid and move forward, IE_WFA_WSC = 0xdd\n\t\tif (pEid->Eid != IE_WFA_WSC)\n\t\t{\n\t\t\t// Set the offset and look for next IE\n\t\t\tpData += (pEid->Len + 2);\n\t\t\tLen   -= (pEid->Len + 2);\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Found IE with 0xdd\n\t\t\t// check for WSC OUI -- 00 50 f2 04\n\t\t\tif (NdisEqualMemory(pEid->Octet, IWSC_OUI, 4) == FALSE)\n\t\t\t{\n\t\t\t\t// Set the offset and look for next IE\n\t\t\t\tpData += (pEid->Len + 2);\n\t\t\t\tLen   -= (pEid->Len + 2);\n\t\t\t\tcontinue;\n\t\t\t}\t\t\t\t\n\t\t}\n\n\t\t// 3. Found\tAP with WSC IE in beacons, skip 6 bytes = 1 + 1 + 4\n\t\tpData += 6;\n\t\tLen   -= 6;\n\n\t\t// 4. Start to look the PBC type within WSC VarIE\n\t\twhile (Len > 0)\n\t\t{\n\t\t\t// Check for WSC IEs\n\t\t\tNdisMoveMemory(&Type, pData, 2);\n\t\t\tNdisMoveMemory(&TLV_Len, pData+2, 2);\n\n\t\t\t// Check for config method\n\t\t\tif (be2cpu16(Type) == WSC_ID_SEL_REG_CFG_METHODS)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pConfigMethod, pData+4, 2);\n\t\t\t\t*pConfigMethod = be2cpu16(*pConfigMethod);\n\t\t\t}\n\n\t\t\t// Set the offset and look for PBC information\n\t\t\t// Since Type and Length are both short type, we need to offset 4, not 2\n\t\t\tpData += (be2cpu16(TLV_Len) + 4);\n\t\t\tLen   -= (be2cpu16(TLV_Len) + 4);\n\t\t}\n\t}\n}\n\nVOID\tIWSC_BuildDevQueryFrame(\n\tIN  PRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\t\t\tpOutBuf,\n\tOUT\tPUSHORT\t\t\tpIeLen)\n{\n\tUCHAR \t\t\t*Data = NULL;\n\tPUCHAR\t\t\tpData;\n\tINT\t\t\t\tLen = 0, templen = 0;\n\tPWSC_CTRL\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n\tPWSC_REG_DATA\tpReg = (PWSC_REG_DATA) &pWpsCtrl->RegData;\n\tUSHORT\t\t\ttempVal = 0;\n\tWSC_IE_HEADER \tieHdr;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Data, 512);\n\tif (Data == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> IWSC_BuildDevQueryFrame\\n\"));\n\n\t// WSC IE HEader\n\tieHdr.elemId = 221;\n\tieHdr.length = 4;\n\tieHdr.oui[0] = 0x00; \n\tieHdr.oui[1] = 0x50; \n\tieHdr.oui[2] = 0xF2; \n\tieHdr.oui[3] = 0x10;\n\n\tpData = (PUCHAR) &Data[0];\n\tLen = 0;\n\t\n\t/* Version */\n\ttemplen = AppendWSCTLV(WSC_ID_VERSION, pData, &pReg->SelfInfo.Version, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* MAC address */\n\ttemplen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, pReg->SelfInfo.MacAddr, 0);\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Manufacture */\n\ttemplen = AppendWSCTLV(WSC_ID_MANUFACTURER, pData, pReg->SelfInfo.Manufacturer, strlen((PSTRING) pReg->SelfInfo.Manufacturer));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Model Name */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NAME, pData, pReg->SelfInfo.ModelName, strlen((PSTRING) pReg->SelfInfo.ModelName));\n\tpData += templen;\n\tLen   += templen;\n\t\n\t/* Model Number */\n\ttemplen = AppendWSCTLV(WSC_ID_MODEL_NUMBER, pData, pReg->SelfInfo.ModelNumber, strlen((PSTRING) pReg->SelfInfo.ModelNumber));\n\tpData += templen;\n\tLen   += templen;\n\n\t/* Device Name */\n\ttemplen = AppendWSCTLV(WSC_ID_DEVICE_NAME, pData, pReg->SelfInfo.DeviceName, strlen((PSTRING) pReg->SelfInfo.DeviceName));\n\tpData += templen;\n\tLen   += templen;\n\n\tieHdr.length = ieHdr.length + Len;\n\n\tRTMPMoveMemory(pOutBuf, &ieHdr, sizeof(WSC_IE_HEADER));\n\tRTMPMoveMemory(pOutBuf + sizeof(WSC_IE_HEADER), Data, Len);\n\t*pIeLen = (USHORT)(sizeof(WSC_IE_HEADER) + Len);\n\n\tif (Data != NULL)\n\t\tos_free_mem(NULL, Data);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- IWSC_BuildDevQueryFrame\\n\"));\n}\n\nVOID IWSC_ResetIpContent(\n\tIN  PRTMP_ADAPTER\tpAd)\n{\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- %s\\n\", __FUNCTION__));\n\tpIWscInfo->IpDevCount = 0;\n\tpIWscInfo->RegDepth = 0;\n\tpIWscInfo->AvaSubMaskListCount = IWSC_MAX_SUB_MASK_LIST_COUNT;\n\tpIWscInfo->bAssignWscIPv4 = TRUE;\n\tpIWscInfo->AvaSubMaskList[0] = IWSC_IPV4_RANGE1;\n\tpIWscInfo->AvaSubMaskList[1] = IWSC_IPV4_RANGE2;\n\tpIWscInfo->AvaSubMaskList[2] = IWSC_IPV4_RANGE3;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- %s\\n\", __FUNCTION__));\n}\n\nBOOLEAN IWSC_IpContentForCredential(\n\tIN  PRTMP_ADAPTER\tpAd)\n{\n\tPIWSC_INFO\tpIWscInfo = &pAd->StaCfg.IWscInfo;\n\n\tif (pIWscInfo->IpDevCount >= IWSC_MAX_IP_DEV_COUNT)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pIWscInfo->IpDevCount = %d\\n\", \n\t\t\tpIWscInfo->IpDevCount));\n\t\treturn FALSE;\n\t}\n\n\tif (pIWscInfo->bAssignWscIPv4 == FALSE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"pIWscInfo->bAssignWscIPv4 = %d\\n\", \n\t\t\tpIWscInfo->bAssignWscIPv4));\n\t\treturn FALSE;\n\t}\n\tif (pIWscInfo->RegDepth == 0)\n\t{\n\t\tpIWscInfo->IpDevCount++;\n\t\tpIWscInfo->SelfIpv4Addr = IWSC_DEFAULT_REG_IPV4_ADDR;\n\t\tpIWscInfo->PeerIpv4Addr = pIWscInfo->SelfIpv4Addr + pIWscInfo->IpDevCount;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"1) SelfIpv4Addr = 0x%08x, PeerIpv4Addr = 0x%08x\\n\", \n\t\t\tpIWscInfo->SelfIpv4Addr,\n\t\t\tpIWscInfo->PeerIpv4Addr));\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\tUINT32 shift_offset = 0;\n\t\tUINT32 dev_count = (UINT32)(++pIWscInfo->IpDevCount);\n\t\tif (pIWscInfo->SelfIpv4Addr == 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"IMPOSSIBLE!! pIWscInfo->SelfIpv4Addr = %d\\n\", pIWscInfo->SelfIpv4Addr));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (pIWscInfo->CurrentIpRange == IWSC_IPV4_RANGE0)\n\t\t{\n\t\t\tshift_offset = 0;\n\t\t}\n\t\telse if (pIWscInfo->CurrentIpRange == IWSC_IPV4_RANGE1)\n\t\t{\n\t\t\tshift_offset = 6;\n\t\t}\n\t\telse if (pIWscInfo->CurrentIpRange == IWSC_IPV4_RANGE2)\n\t\t{\n\t\t\tshift_offset = 12;\n\t\t}\n\t\telse if (pIWscInfo->CurrentIpRange == IWSC_IPV4_RANGE3)\n\t\t{\n\t\t\tshift_offset = 18;\n\t\t}\n\n\t\tpIWscInfo->PeerIpv4Addr = (pIWscInfo->SelfIpv4Addr & pIWscInfo->CurrentIpRange) + (dev_count << shift_offset);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"2) SelfIpv4Addr = 0x%08x, PeerIpv4Addr = 0x%08x\\n\", \n\t\t\tpIWscInfo->SelfIpv4Addr,\n\t\t\tpIWscInfo->PeerIpv4Addr));\n\t\treturn TRUE;\n\t}\n}\n#endif /* IWSC_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/sync.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\tsync.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJohn Chang\t2004-09-01      modified for rt2561/2661\n\tJan Lee\t\t2006-08-01      modified for rt2860 for 802.11n\n*/\n#include \"rt_config.h\"\n\n\n#define ADHOC_ENTRY_BEACON_LOST_TIME\t(2*OS_HZ)\t/* 2 sec */\n\n/*\n\t==========================================================================\n\tDescription:\n\t\tThe sync state machine, \n\tParameters:\n\t\tSm - pointer to the state machine\n\tNote:\n\t\tthe state machine looks like the following\n\n\t==========================================================================\n */\nVOID SyncStateMachineInit(\n\tIN PRTMP_ADAPTER pAd, \n\tIN STATE_MACHINE *Sm, \n\tOUT STATE_MACHINE_FUNC Trans[]) \n{\n\tStateMachineInit(Sm, Trans, MAX_SYNC_STATE, MAX_SYNC_MSG, (STATE_MACHINE_FUNC)Drop, SYNC_IDLE, SYNC_MACHINE_BASE);\n\n\t/* column 1 */\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)MlmeScanReqAction);\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_FORCE_SCAN_REQ, (STATE_MACHINE_FUNC)MlmeForceScanReqAction);\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeJoinReqAction);\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_FORCE_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeForceJoinReqAction);\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)MlmeStartReqAction);\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeacon);\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_REQ, (STATE_MACHINE_FUNC)PeerProbeReqAction); \n#ifdef P2P_SUPPORT\n\tStateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction);\n#endif /* P2P_SUPPORT */\n\n\t/* column 2 */\n\tStateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeJoinReqAction);\n\tStateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart);\n\tStateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtJoinAction);\n\tStateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_BEACON_TIMEOUT, (STATE_MACHINE_FUNC)BeaconTimeoutAtJoinAction);\n\tStateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction);\n\n\t/* column 3 */\n\tStateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeJoinReqAction);\n\tStateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart);\n\tStateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction);\n\tStateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction);\n\tStateMachineSetAction(Sm, SCAN_LISTEN, MT2_SCAN_TIMEOUT, (STATE_MACHINE_FUNC)ScanTimeoutAction);\n\t/* StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_SCAN_CNCL, (STATE_MACHINE_FUNC)ScanCnclAction); */\n\n\t/* resume scanning for fast-roaming */\n\tStateMachineSetAction(Sm, SCAN_PENDING, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)MlmeScanReqAction);\n       StateMachineSetAction(Sm, SCAN_PENDING, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeacon);\n\n\t/* timer init */\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.BeaconTimer, GET_TIMER_FUNCTION(BeaconTimeout), pAd, FALSE);\n\tRTMPInitTimer(pAd, &pAd->MlmeAux.ScanTimer, GET_TIMER_FUNCTION(ScanTimeout), pAd, FALSE);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tBeacon timeout handler, executed in timer thread\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID BeaconTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\tDBGPRINT(RT_DEBUG_TRACE,(\"SYNC - BeaconTimeout\\n\"));\n\t\n\t/*\n\t    Do nothing if the driver is starting halt state.\n\t    This might happen when timer already been fired before cancel timer with mlmehalt\n\t*/\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\treturn;\n\t\n#ifdef DOT11_N_SUPPORT\n\tif ((pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t)\n\t{\n\t\trtmp_bbp_set_bw(pAd, BW_40);\n\n\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\\n\",\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr));\n\t}\n#endif /* DOT11_N_SUPPORT */\n\n\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL, 0);\n\tRTMP_MLME_HANDLER(pAd);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tScan timeout handler, executed in timer thread\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID ScanTimeout(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tRTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;\n\n\t\n\t/* \n\t    Do nothing if the driver is starting halt state.\n\t    This might happen when timer already been fired before cancel timer with mlmehalt\n\t*/\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))\n\t\treturn;\n\t\n\tif (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL, 0))\n\t{\n\tRTMP_MLME_HANDLER(pAd);\n}\n\telse\n\t{\n\t\t/* To prevent SyncMachine.CurrState is SCAN_LISTEN forever. */\n\t\tpAd->MlmeAux.Channel = 0;\n\t\tScanNextChannel(pAd, OPMODE_STA);\n\t\t\tRTMPSendWirelessEvent(pAd, IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG, NULL, BSS0, 0); \n\t}\n}\n\n\nVOID MlmeForceJoinReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tBOOLEAN        TimerCancelled;\n\tHEADER_802_11 Hdr80211;\t\n\tNDIS_STATUS   NStatus;\n\tULONG         FrameLen = 0;\t\n\tPUCHAR        pOutBuffer = NULL;\n\tPUCHAR        pSupRate = NULL;\n\tUCHAR         SupRateLen;\n\tPUCHAR        pExtRate = NULL;\n\tUCHAR         ExtRateLen;\t\n\tUCHAR         ASupRate[] = {0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C};\n\tUCHAR         ASupRateLen = sizeof(ASupRate)/sizeof(UCHAR);\t\n\tMLME_JOIN_REQ_STRUCT *pInfo = (MLME_JOIN_REQ_STRUCT *)(Elem->Msg);\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - MlmeForeJoinReqAction(BSS #%ld)\\n\", pInfo->BssIdx));\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\n\tif ( (RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeJoinReqAction: autopm_resume success\\n\"));\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t}\n\telse if ((RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == (-1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MlmeJoinReqAction autopm_resume fail ------\\n\"));\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t\treturn;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeJoinReqAction: autopm_resume do nothing \\n\"));\n\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n#ifdef PCIE_PS_SUPPORT\n    if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && \n        (IDLE_ON(pAd)) &&\n\t\t(pAd->StaCfg.bRadio == TRUE) &&\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))\n\t{\n\t\t\tRT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);\n\t}\n#endif /* PCIE_PS_SUPPORT */\n\n\t/* reset all the timers */\n\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);\n\n\t{\n\t\tRTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, pAd->StaCfg.ConnectinfoSsid, pAd->StaCfg.ConnectinfoSsidLen);\t\n\t\tpAd->MlmeAux.SsidLen = pAd->StaCfg.ConnectinfoSsidLen;\n\t}\n\n\tpAd->MlmeAux.BssType = pAd->StaCfg.ConnectinfoBssType;\n\tpAd->MlmeAux.Channel = pAd->StaCfg.ConnectinfoChannel;\n\n\n\t/* Let BBP register at 20MHz to do scan */\n\tAsicSetChannel(pAd, pAd->MlmeAux.Channel, BW_20, EXTCHA_NONE, FALSE);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n\n\tRTMPSetTimer(&pAd->MlmeAux.BeaconTimer, JOIN_TIMEOUT);\n\n    do\n\t{\n\t\t/*\n\t    send probe request\n\t*/\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus == NDIS_STATUS_SUCCESS)\n\t{\n\t\tif (pAd->MlmeAux.Channel <= 14)\n\t\t{\n\t\t\tpSupRate = pAd->CommonCfg.SupRate;\n\t\t\tSupRateLen = pAd->CommonCfg.SupRateLen;\n\t\t\tpExtRate = pAd->CommonCfg.ExtRate;\n\t\t\tExtRateLen = pAd->CommonCfg.ExtRateLen;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/*\n\t\t           Overwrite Support Rate, CCK rate are not allowed\n\t\t*/\n\t\t\tpSupRate = ASupRate;\n\t\t\tSupRateLen = ASupRateLen;\n\t\t\tExtRateLen = 0;\n\t\t}\n\n\t\tif ((pAd->MlmeAux.BssType == BSS_INFRA)  && (!MAC_ADDR_EQUAL(ZERO_MAC_ADDR, pAd->StaCfg.ConnectinfoBssid)))\n\t\t{\n\t\t\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, pAd->StaCfg.ConnectinfoBssid);\n\t\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, pAd->MlmeAux.Bssid,\n#ifdef P2P_SUPPORT\n                                                                pAd->CurrentAddress,\n#endif /* P2P_SUPPORT */ \n\t\t\t\t\t\t\t\tpAd->MlmeAux.Bssid);\n\t\t}\n\t\telse\n\t\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR,\n#ifdef P2P_SUPPORT\n                                                                pAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tBROADCAST_ADDR);\n\n\t\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t\t\t\t\t  sizeof(HEADER_802_11),    &Hdr80211,\n\t\t\t\t\t\t  1,                        &SsidIe,\n\t\t\t\t\t\t  1,                        &pAd->MlmeAux.SsidLen,\n\t\t\t\t\t\t  pAd->MlmeAux.SsidLen,\t    pAd->MlmeAux.Ssid,\n\t\t\t\t\t\t  1,                        &SupRateIe,\n\t\t\t\t\t\t  1,                        &SupRateLen,\n\t\t\t\t\t\t  SupRateLen,               pSupRate,\n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\tif (ExtRateLen)\n\t\t{\n\t\t\tULONG Tmp;\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &Tmp,\n\t\t\t\t\t\t\t  1,                                &ExtRateIe,\n\t\t\t\t\t\t\t  1,                                &ExtRateLen,\n\t\t\t\t\t\t\t  ExtRateLen,                       pExtRate, \n\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\tFrameLen += Tmp;\n\t} \n\t\t\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t(pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&\n\t\t\t(pAd->StaCfg.WpsProbeReqIeLen != 0))\n\t{\n\t\t\tULONG \t\tWpsTmpLen = 0;\n\t\t\t\n\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,              &WpsTmpLen,\n\t\t\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen,\tpAd->StaCfg.pWpsProbeReqIe,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t\tFrameLen += WpsTmpLen;\n\t\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef WFD_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n\t\tif (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t\t{\n\t\t\tULONG\tWfdIeLen, WfdIeBitmap;\n\t\t\tPUCHAR\tptr;\n\t\t\t\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &WfdIeLen);\n\t\t\tFrameLen += WfdIeLen;\n\t\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t}\n    } while (FALSE);\n\n\tDBGPRINT(0, (\"FORCE JOIN SYNC - Switch to ch %d, Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\tpAd->StaCfg.ConnectinfoChannel, PRINT_MAC(pAd->StaCfg.ConnectinfoBssid)));\n\n\tpAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON;\n}\n\n\nVOID MlmeForceScanReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR          Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType;\n\tBOOLEAN        TimerCancelled;\n\tULONG\t\t   Now;\n\tUSHORT         Status;\n\n#ifdef RTMP_MAC_USB\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t{\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\tASIC_RADIO_ON(pAd, DOT11_RADIO_ON);\n\t\t\telse\n\t\t\t\tRT28xxUsbAsicRadioOn(pAd);\n\t}\n#endif /* RTMP_MAC_USB */\n       /*\n\t    Check the total scan tries for one single OID command\n\t    If this is the CCX 2.0 Case, skip that!\n\t*/\n\tif ( !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - MlmeForceScanReqAction before Startup\\n\"));\n\t\treturn;\n\t}\n\n\n\t/* first check the parameter sanity */\n\tif (MlmeScanReqSanity(pAd, \n\t\t\t\t\t\t  Elem->Msg, \n\t\t\t\t\t\t  Elem->MsgLen, \n\t\t\t\t\t\t  &BssType, \n\t\t\t\t\t\t  (PCHAR)Ssid, \n\t\t\t\t\t\t  &SsidLen, \n\t\t\t\t\t\t  &ScanType)) \n\t{\n\n\t\t/* \n\t\t     Check for channel load and noise hist request\n\t\t     Suspend MSDU only at scan request, not the last two mentioned\n\t\t     Suspend MSDU transmission here\n\t\t*/\n\t\tRTMPSuspendMsduTransmission(pAd);\n\t\t\n\t\t/*\n\t\t    To prevent data lost.\t\n\t\t    Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.\n\t\t    And should send an NULL data with turned PSM bit off to AP, when scan progress done \n\t\t*/\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))\n\t\t{\n\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t  PWR_SAVE);\n\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeForceScanReqAction -- Send PSM Data frame for off channel RM, SCAN_IN_PROGRESS=%d!\\n\",\n\t\t\t\t\t\t\t\t\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)));\n\t\t\t\tOS_WAIT(20);\n\t\t}\n\t\t\n\t\t\tRTMPSendWirelessEvent(pAd, IW_SCANNING_EVENT_FLAG, NULL, BSS0, 0);\n\n\t\tNdisGetSystemUpTime(&Now);\n\t\tpAd->StaCfg.LastScanTime = Now;\n\t\t/* reset all the timers */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);\n\n\t\t/* record desired BSS parameters */\n\t\tpAd->MlmeAux.BssType = BssType;\n\t\tpAd->MlmeAux.ScanType = ScanType;\n\t\tpAd->MlmeAux.SsidLen = SsidLen;\n       \t NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen);\n\n\t\t/*\n\t\t\tScanning was pending (for fast scanning)\n\t\t*/\n\t\tif ((pAd->StaCfg.bImprovedScan) && (pAd->Mlme.SyncMachine.CurrState == SCAN_PENDING))\n\t\t{\n\t\t\tpAd->MlmeAux.Channel = pAd->StaCfg.LastScanChannel;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->StaCfg.bFastConnect && (pAd->CommonCfg.Channel != 0) && !pAd->StaCfg.bNotFirstScan)\n\t\t\t{\n\t\tpAd->MlmeAux.Channel = pAd->CommonCfg.Channel;\n\t\t\t}\n\t\t\telse\n\t\t\t\t/* start from the first channel */\n\t\t\t\tpAd->MlmeAux.Channel = FirstChannel(pAd);\n\t\t}\n\n\t\t/* Let BBP register at 20MHz to do scan */\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t/* Before scan, reset trigger event table. */\n\t\tTriEventInit(pAd);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\t\tScanNextChannel(pAd, OPMODE_STA);\n\t\tif(pAd->StaCfg.ConnectinfoChannel != 0)\n\t\t\tpAd->MlmeAux.Channel = 0;\n\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_SCAN_FOR_CONNECT;\n\t} \n\telse \n\t{\n\t\tDBGPRINT_ERR((\"SYNC - MlmeForceScanReqAction() sanity check fail\\n\"));\n\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\tStatus = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0);\n\t}\n}\n\n\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tMLME SCAN req state machine procedure\n\t==========================================================================\n */\nVOID MlmeScanReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR          Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType;\n\tBOOLEAN        TimerCancelled;\n\tULONG\t\t   Now;\n\tUSHORT         Status;\n\n\n#ifdef RTMP_MAC_USB\n\tif(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))\n\t{\n\t\t\tif ( IS_MT7601(pAd) )\n\t\t\t\tASIC_RADIO_ON(pAd, DOT11_RADIO_ON);\n\t\t\telse\n\t\t\t\tRT28xxUsbAsicRadioOn(pAd);\n\t}\n#endif /* RTMP_MAC_USB */\n       /*\n\t    Check the total scan tries for one single OID command\n\t    If this is the CCX 2.0 Case, skip that!\n\t*/\n\tif ( !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - MlmeScanReqAction before Startup\\n\"));\n\t\treturn;\n\t}\n\n#ifdef PCIE_PS_SUPPORT\n    if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && \n        (IDLE_ON(pAd)) &&\n\t\t(pAd->StaCfg.bRadio == TRUE) &&\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))\n\t{\n\t    if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)\n\t\t{\n\t\t\tAsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02, FALSE);   \n\t\t\tAsicCheckCommanOk(pAd, PowerWakeCID);\t\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PSM - Issue Wake up command \\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);\n\t\t}\n\t}\n#endif /* PCIE_PS_SUPPORT */\n\n\t/* first check the parameter sanity */\n\tif (MlmeScanReqSanity(pAd, \n\t\t\t\t\t\t  Elem->Msg, \n\t\t\t\t\t\t  Elem->MsgLen, \n\t\t\t\t\t\t  &BssType, \n\t\t\t\t\t\t  (PCHAR)Ssid, \n\t\t\t\t\t\t  &SsidLen, \n\t\t\t\t\t\t  &ScanType)) \n\t{\n\t\t/* \n\t\t     Check for channel load and noise hist request\n\t\t     Suspend MSDU only at scan request, not the last two mentioned\n\t\t     Suspend MSDU transmission here\n\t\t*/\n\t\tRTMPSuspendMsduTransmission(pAd);\n\t\t\n\t\t/*\n\t\t    To prevent data lost.\t\n\t\t    Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.\n\t\t    And should send an NULL data with turned PSM bit off to AP, when scan progress done \n\t\t*/\n\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))\n\t\t{\n\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t  PWR_SAVE);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeScanReqAction -- Send PSM Data frame for off channel RM, SCAN_IN_PROGRESS=%d!\\n\",\n\t\t\t\t\t\t\t\t\t\t\tRTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)));\n\t\t\tOS_WAIT(20);\n\t\t}\n\t\t\n\t\t\tRTMPSendWirelessEvent(pAd, IW_SCANNING_EVENT_FLAG, NULL, BSS0, 0);\n\n\t\tNdisGetSystemUpTime(&Now);\n\t\tpAd->StaCfg.LastScanTime = Now;\n\t\t/* reset all the timers */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);\n\n\t\t/* record desired BSS parameters */\n\t\tpAd->MlmeAux.BssType = BssType;\n\t\tpAd->MlmeAux.ScanType = ScanType;\n\t\tpAd->MlmeAux.SsidLen = SsidLen;\n\t\tNdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen);\n\n#ifdef CONFIG_MULTI_CHANNEL\n\t\tif (P2P_CLI_ON(pAd) && (pAd->Multi_Channel_Enable == TRUE))\n\t\t{\n\t\t\tpAd->StaCfg.bImprovedScan = TRUE;\n\t\t\tpAd->StaCfg.ScanChannelCnt = 0;\t/* reset channel counter to 0 */\n\t\t}\n#elif defined (WIFI_P2P_CONCURRENT_FAST_SCAN)\n\t\t/* If p2p is connected as GO||GC, then we need to perform Elegant scan */\n\t\tif (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd))\n\t\t{\n\t\t\tpAd->StaCfg.bImprovedScan = TRUE;\n\t\t\tpAd->StaCfg.ScanChannelCnt = 0; /* reset channel counter to 0 */\n\t\t}\n#endif /*CONFIG_MULTI_CHANNEL*/\n\n\t\t/*\n\t\t\tScanning was pending (for fast scanning)\n\t\t*/\n\t\tif ((pAd->StaCfg.bImprovedScan) && (pAd->Mlme.SyncMachine.CurrState == SCAN_PENDING))\n\t\t{\n\t\t\tpAd->MlmeAux.Channel = pAd->StaCfg.LastScanChannel;\n\t\t}\n#ifdef P2P_SUPPORT\n\t\telse if (pAd->P2pCfg.CtrlCurrentState == P2P_CTRL_DISCOVERY)\n\t\t{\n\t\t\tpAd->MlmeAux.Channel = 1;\n\t\t}\n#endif /* P2P_SUPPORT */\n\t\telse\n\t\t{\n\t\t\tif (pAd->StaCfg.bFastConnect && (pAd->CommonCfg.Channel != 0) && !pAd->StaCfg.bNotFirstScan)\n\t\t\t{\n\t\t\t\tpAd->MlmeAux.Channel = pAd->CommonCfg.Channel;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\t/* start from the first channel */\n\t\t\t\t\tpAd->MlmeAux.Channel = FirstChannel(pAd);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Let BBP register at 20MHz to do scan */\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - BBP R4 to 20MHz.l\\n\"));\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t/* Before scan, reset trigger event table. */\n\t\tTriEventInit(pAd);\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\n\t\tScanNextChannel(pAd, OPMODE_STA);\n\t} \n\telse \n\t{\n\t\tDBGPRINT_ERR((\"SYNC - MlmeScanReqAction() sanity check fail\\n\"));\n\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\tStatus = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0);\n\t}\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tMLME JOIN req state machine procedure\n\t==========================================================================\n */\nVOID MlmeJoinReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tBSS_ENTRY    *pBss;\n\tBOOLEAN       TimerCancelled;\n\tHEADER_802_11 Hdr80211;\t\n\tNDIS_STATUS   NStatus;\n\tULONG         FrameLen = 0;\t\n\tPUCHAR        pOutBuffer = NULL;\n\tPUCHAR        pSupRate = NULL;\n\tUCHAR         SupRateLen;\n\tPUCHAR        pExtRate = NULL;\n\tUCHAR         ExtRateLen;\t\n\tUCHAR         ASupRate[] = {0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C};\n\tUCHAR         ASupRateLen = sizeof(ASupRate)/sizeof(UCHAR);\t\n\tMLME_JOIN_REQ_STRUCT *pInfo = (MLME_JOIN_REQ_STRUCT *)(Elem->Msg);\n#ifdef WSC_STA_SUPPORT\n\tBOOLEAN bHasWscIe = FALSE;\n#endif /* WSC_STA_SUPPORT */\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\tPOS_COOKIE  pObj = (POS_COOKIE) pAd->OS_Cookie;\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\tBOOLEAN       bChangeInitBW = FALSE;\n#ifdef P2P_SUPPORT\t\n\tPAPCLI_STRUCT pApCliEntry = NULL;\n#endif /* P2P_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - MlmeJoinReqAction(BSS #%ld)\\n\", pInfo->BssIdx));\n\n#ifdef CONFIG_PM\n#ifdef USB_SUPPORT_SELECTIVE_SUSPEND\n\n\tif ( (RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == 1)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeJoinReqAction: autopm_resume success\\n\"));\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t}\n\telse if ((RTMP_Usb_AutoPM_Get_Interface(pObj->pUsb_Dev,pObj->intf)) == (-1))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MlmeJoinReqAction autopm_resume fail ------\\n\"));\n\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND);\n\t\treturn;\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeJoinReqAction: autopm_resume do nothing \\n\"));\n\n\n#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */\n#endif /* CONFIG_PM */\n\n\n\n#ifdef PCIE_PS_SUPPORT\n    if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && \n        (IDLE_ON(pAd)) &&\n\t\t(pAd->StaCfg.bRadio == TRUE) &&\n\t\t(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))\n\t{\n\t\tRT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);\n\t}\n#endif /* PCIE_PS_SUPPORT */\n\n\t/* reset all the timers */\n\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);\n\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);\n\n\tpBss = &pAd->MlmeAux.SsidBssTab.BssEntry[pInfo->BssIdx];\n\n\t/* record the desired SSID & BSSID we're waiting for */\n\tCOPY_MAC_ADDR(pAd->MlmeAux.Bssid, pBss->Bssid);\n\t\n\t/* If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again. */\n\tif (pBss->Hidden == 0)\n\t{\n\t\tRTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen);\t\n\t\tpAd->MlmeAux.SsidLen = pBss->SsidLen;\n\t}\n\t\n\tpAd->MlmeAux.BssType = pBss->BssType;\n\tpAd->MlmeAux.Channel = pBss->Channel;\n\tpAd->MlmeAux.CentralChannel = pBss->CentralChannel;\n\t\n#ifdef EXT_BUILD_CHANNEL_LIST\n\t/* Country IE of the AP will be evaluated and will be used. */\n\tif ((pAd->StaCfg.IEEE80211dClientMode != Rt802_11_D_None) &&\n\t\t(pBss->bHasCountryIE == TRUE))\n\t{\n\t\tNdisMoveMemory(&pAd->CommonCfg.CountryCode[0], &pBss->CountryString[0], 2);\n\t\tif (pBss->CountryString[2] == 'I')\n\t\t\tpAd->CommonCfg.Geography = IDOR;\n\t\telse if (pBss->CountryString[2] == 'O')\n\t\t\tpAd->CommonCfg.Geography = ODOR;\n\t\telse\n\t\t\tpAd->CommonCfg.Geography = BOTH;\n\t\tBuildChannelListEx(pAd);\n\t}\n#endif /* EXT_BUILD_CHANNEL_LIST */\n\t\n#ifdef P2P_SUPPORT\n\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n\n\tif (!P2P_GO_ON(pAd) && (pApCliEntry->Valid == FALSE))\n#endif /* P2P_SUPPORT */\n\t{\n\t\tbChangeInitBW = TRUE;\n\t}\n\n#ifdef P2P_SUPPORT\n\tif ((P2P_GO_ON(pAd) || (pApCliEntry->Valid == TRUE)) && (pAd->CommonCfg.Channel != pAd->MlmeAux.Channel))\n\t{\n\t\tbChangeInitBW = TRUE;\n\t}\n#endif /* P2P_SUPPORT */\n\n\tif (bChangeInitBW == TRUE)\n\t{\n\t\t/* Let BBP register at 20MHz to do scan */\n\t\trtmp_bbp_set_bw(pAd, BW_20);\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): Set BBP BW=20MHz\\n\", __FUNCTION__));\n\n\t\t/* switch channel and waiting for beacon timer */\n\t\tAsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->MlmeAux.Channel);\n\t}\n\n#ifdef WSC_STA_SUPPORT\n#ifdef WSC_LED_SUPPORT\n\t/* LED indication. */\n\tif (pAd->MlmeAux.BssType == BSS_INFRA)\n\t{\n\t\tLEDConnectionStart(pAd);\n\t\tLEDConnectionCompletion(pAd, TRUE);\n\t}\n#endif /* WSC_LED_SUPPORT */\n#endif /* WSC_STA_SUPPORT */\n\n\tRTMPSetTimer(&pAd->MlmeAux.BeaconTimer, JOIN_TIMEOUT);\n\n\tdo\n\t{\n\t\tif (((pAd->CommonCfg.bIEEE80211H == 1) && \n\t\t\t(pAd->MlmeAux.Channel > 14) && \n\t\t\tRadarChannelCheck(pAd, pAd->MlmeAux.Channel))\n#ifdef CARRIER_DETECTION_SUPPORT /* Roger sync Carrier */             \n\t\t\t|| (pAd->CommonCfg.CarrierDetect.Enable == TRUE)\n#endif /* CARRIER_DETECTION_SUPPORT */\n\t\t)\n\t\t{\n\t\t\t/* We can't send any Probe request frame to meet 802.11h. */\n\t\t\tif (pBss->Hidden == 0)\n\t\t\t\tbreak;\n\t\t}\n\t\t    \n\t\t/*\n\t\t    send probe request\n\t\t*/\n\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\t\tif (NStatus == NDIS_STATUS_SUCCESS)\n\t\t{\n\t\t\tif (pAd->MlmeAux.Channel <= 14)\n\t\t\t{\n\t\t\t\tpSupRate = pAd->CommonCfg.SupRate;\n\t\t\t\tSupRateLen = pAd->CommonCfg.SupRateLen;\n\t\t\t\tpExtRate = pAd->CommonCfg.ExtRate;\n\t\t\t\tExtRateLen = pAd->CommonCfg.ExtRateLen;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Overwrite Support Rate, CCK rate are not allowed */\n\t\t\t\tpSupRate = ASupRate;\n\t\t\t\tSupRateLen = ASupRateLen;\n\t\t\t\tExtRateLen = 0;\n\t\t\t}\n\n\t\t\tif (pAd->MlmeAux.BssType == BSS_INFRA)\n\t\t\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, pAd->MlmeAux.Bssid,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\tpAd->MlmeAux.Bssid);\n\t\t\telse\n\t\t\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\t\tBROADCAST_ADDR);\n\n\t\t\tMakeOutgoingFrame(pOutBuffer, &FrameLen,\n\t\t\t\t\t\t\t  sizeof(HEADER_802_11), &Hdr80211,\n\t\t\t\t\t\t\t  1,                        &SsidIe,\n\t\t\t\t\t\t\t  1,                        &pAd->MlmeAux.SsidLen,\n\t\t\t\t\t\t\t  pAd->MlmeAux.SsidLen,\t    pAd->MlmeAux.Ssid,\n\t\t\t\t\t\t\t  1,                        &SupRateIe,\n\t\t\t\t\t\t\t  1,                        &SupRateLen,\n\t\t\t\t\t\t\t  SupRateLen,               pSupRate,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\tif (ExtRateLen)\n\t\t\t{\n\t\t\t\tULONG Tmp;\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &Tmp,\n\t\t\t\t\t\t\t\t  1,                                &ExtRateIe,\n\t\t\t\t\t\t\t\t  1,                                &ExtRateLen,\n\t\t\t\t\t\t\t\t  ExtRateLen,                       pExtRate, \n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += Tmp;\n\t\t\t}\n\t\t\t\n#ifdef WSC_STA_SUPPORT\n\t\t\t/* Append WSC information in probe request if WSC state is running */\n\t\t\tif ((pAd->StaCfg.WscControl.WscEnProbeReqIE) && \n\t\t\t\t(pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t\t(pAd->StaCfg.WscControl.bWscTrigger\n\t\t\t\t))\n\t\t\t\tbHasWscIe = TRUE;\n#ifdef WSC_V2_SUPPORT\n\t\t\telse if ((pAd->StaCfg.WscControl.WscEnProbeReqIE) && \n\t\t\t\t(pAd->StaCfg.WscControl.WscV2Info.bEnableWpsV2))\n\t\t\t\tbHasWscIe = TRUE;\n#endif /* WSC_V2_SUPPORT */\n\n\t\t\tif (bHasWscIe)\n\t\t\t{\n\t\t\t\tUCHAR WscIeLen = 0;\n\t\t\t\tUCHAR *WscBuf = NULL;\n\t\t\t\tULONG WscTmpLen = 0;\n\n\t\t\t\t/* allocate memory */\n\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&WscBuf, 256);\n\t\t\t\tif (WscBuf != NULL)\n\t\t\t\t{\n\t\t\t\t\tNdisZeroMemory(WscBuf, 256);\n\t\t\t\t\tWscBuildProbeReqIE(pAd, STA_MODE, WscBuf, &WscIeLen);\n\n\t\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,              &WscTmpLen,\n\t\t\t\t\t\t\t\t\tWscIeLen,                             WscBuf,\n\t\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t\t\t\tFrameLen += WscTmpLen;\n\t\t\t\t\tos_free_mem(NULL, WscBuf);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\t\t}\n#endif /* WSC_STA_SUPPORT */\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif ((pAd->OpMode == OPMODE_STA) &&\n\t\t\t\t(pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&\n\t\t\t\t(pAd->StaCfg.WpsProbeReqIeLen != 0))\n\t\t\t{\n\t\t\t\tULONG \t\tWpsTmpLen = 0;\n\t\t\t\t\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,              &WpsTmpLen,\n\t\t\t\t\t\t\t\tpAd->StaCfg.WpsProbeReqIeLen,\tpAd->StaCfg.pWpsProbeReqIe,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t\t\tFrameLen += WpsTmpLen;\n\t\t\t}\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef WFD_SUPPORT\n#ifdef RT_CFG80211_SUPPORT\n\t\tif (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)\n\t\t{\n\t\t\tULONG\tWfdIeLen, WfdIeBitmap;\n\t\t\tPUCHAR\tptr;\n\t\t\t\n\t\t\tptr = pOutBuffer + FrameLen;\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &WfdIeLen);\n\t\t\tFrameLen += WfdIeLen;\n\t\t}\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* WFD_SUPPORT */\n\n\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t}\n\t} while (FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - Switch to ch %d, Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\tpBss->Channel, pBss->Bssid[0], pBss->Bssid[1], pBss->Bssid[2], pBss->Bssid[3], pBss->Bssid[4], pBss->Bssid[5]));\n\n\tpAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tMLME START Request state machine procedure, starting an IBSS\n\t==========================================================================\n */\nVOID MlmeStartReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR Ssid[MAX_LEN_OF_SSID], SsidLen; \n\tBOOLEAN TimerCancelled;\n\tUCHAR *VarIE = NULL;\t\t/* New for WPA security suites */\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\tLARGE_INTEGER TimeStamp;\n\tBOOLEAN Privacy;\n\tUSHORT Status;\n\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* Init Variable IE structure */\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\tTimeStamp.u.LowPart  = 0;\n\tTimeStamp.u.HighPart = 0;\n\n\tif ((MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, (PCHAR)Ssid, &SsidLen)) &&\n\t\t(CHAN_PropertyCheck(pAd, pAd->MlmeAux.Channel, CHANNEL_NO_IBSS) == FALSE))\n\t{\n\t\t/* reset all the timers */\n\t\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);\n\t\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);\n\n\t\t/* Start a new IBSS. All IBSS parameters are decided now */\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeStartReqAction - Start a new IBSS. All IBSS parameters are decided now.... \\n\"));\n\t\tpAd->MlmeAux.BssType = BSS_ADHOC;\n\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); \n\t\tpAd->MlmeAux.SsidLen = SsidLen;\n\n#ifdef IWSC_SUPPORT\n\t\tif (pAd->StaCfg.IWscInfo.bDoNotChangeBSSID)\n\t\t\tpAd->StaCfg.IWscInfo.bDoNotChangeBSSID = FALSE;\n\t\telse\n#endif /* IWSC_SUPPORT */\n\t\t{\n\t\t\t/* generate a radom number as BSSID */\n\t\t\tMacAddrRandomBssid(pAd, pAd->MlmeAux.Bssid);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeStartReqAction - generate a radom number as BSSID \\n\"));\n\t\t}\n\n\t\tPrivacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || \n\t\t\t\t  (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || \n\t\t\t\t  (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);\n\t\tpAd->MlmeAux.CapabilityInfo = CAP_GENERATE(0,1,Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 1, 0);\n\t\tpAd->MlmeAux.BeaconPeriod = pAd->CommonCfg.BeaconPeriod;\n\t\tpAd->MlmeAux.AtimWin = pAd->StaCfg.AtimWin;\n\t\tpAd->MlmeAux.Channel = pAd->CommonCfg.Channel;\n\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\tpAd->MlmeAux.CentralChannel = pAd->CommonCfg.CentralChannel;\n\n\t\tpAd->MlmeAux.SupRateLen= pAd->CommonCfg.SupRateLen;\n\t\tNdisMoveMemory(pAd->MlmeAux.SupRate, pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);\n\t\tRTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen);\n\t\tpAd->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen;\n\t\tNdisMoveMemory(pAd->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);\n\t\tRTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);\n#ifdef DOT11_N_SUPPORT\n\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode) && (pAd->StaCfg.bAdhocN == TRUE))\n\t\t{\n\t\t\tRTMPUpdateHTIE(&pAd->CommonCfg.DesiredHtPhy, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo);\n\t\t\tpAd->MlmeAux.HtCapabilityLen = sizeof(HT_CAPABILITY_IE);\n\t\t\t/* Not turn pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE here. */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC -pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE\\n\"));\n#ifdef DOT11_VHT_AC\n\t\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t(pAd->MlmeAux.Channel > 14))\n\t\t\t{\t\n\t\t\t\tbuild_vht_cap_ie(pAd, (UCHAR *)&pAd->MlmeAux.vht_cap);\n\t\t\t\tpAd->MlmeAux.vht_cap_len = sizeof(VHT_CAP_IE);\n\t\t\t}\n#endif /* DOT11_VHT_AC */\n\t\t}\n\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t{\n\t\t\tpAd->MlmeAux.HtCapabilityLen = 0;\n\t\t\tpAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;\n\t\t\tNdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16);\n\t\t}\n\t\t/* temporarily not support QOS in IBSS */\n\t\tNdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));\n\t\tNdisZeroMemory(&pAd->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\tNdisZeroMemory(&pAd->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\n\n\t\tAsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE);\n\t\tAsicLockChannel(pAd, pAd->MlmeAux.Channel);\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - MlmeStartReqAction(ch= %d,sup rates= %d, ext rates=%d)\\n\",\n\t\t\tpAd->MlmeAux.Channel, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen));\n\n\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\tStatus = MLME_SUCCESS;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status, 0);\n\t} \n\telse \n\t{\n\t\tDBGPRINT_ERR((\"SYNC - MlmeStartReqAction() sanity check fail.\\n\"));\n\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\tStatus = MLME_INVALID_FORMAT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status, 0);\n\t}\n\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n}\n\n\n//+++Add by shiang to check correctness of new sanity function\nVOID rtmp_dbg_sanity_diff(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)\n{\n\t/* Parameters used for old sanity function */\n\tUCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN];\n\tUCHAR *Ssid = NULL;\n\tUCHAR SsidLen=0, DtimCount, DtimPeriod, BcastFlag, MessageToMe, NewChannel, Channel = 0, BssType;\n\tCF_PARM CfParm = {0};\n\tUSHORT BeaconPeriod, AtimWin, CapabilityInfo;\n\tLARGE_INTEGER TimeStamp;\n\tUCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR CkipFlag;\n\tEDCA_PARM EdcaParm = {0};\n\tUCHAR AironetCellPowerLimit;\n\tUCHAR SupRateLen, ExtRateLen;\n\tQBSS_LOAD_PARM QbssLoad;\n\tQOS_CAPABILITY_PARM QosCapability = {0};\n\tULONG RalinkIe;\n\tUCHAR\t\t\tAddHtInfoLen;\n\tEXT_CAP_INFO_ELEMENT\tExtCapInfo;\n\tHT_CAPABILITY_IE\t\t*pHtCapability = NULL;\n\tADD_HT_INFO_IE\t\t*pAddHtInfo = NULL;\t/* AP might use this additional ht info IE */\n\tUCHAR\t\t\tHtCapabilityLen = 0, PreNHtCapabilityLen = 0;\n\tUCHAR Erp;\n\tUCHAR\t\t\tNewExtChannelOffset = 0xff;\n\tUSHORT LenVIE;\n\tUCHAR *VarIE = NULL;\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\n\n\tBCN_IE_LIST *ie_list = NULL;\n\tBOOLEAN sanity_new, sanity_old;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&Ssid, MAX_LEN_OF_SSID);\n\tif (Ssid == NULL)\n\t\tgoto LabelErr;\n\tos_alloc_mem(NULL, (UCHAR **)&pHtCapability, sizeof(HT_CAPABILITY_IE));\n\tif (pHtCapability == NULL)\n\t\tgoto LabelErr;\n\tos_alloc_mem(NULL, (UCHAR **)&pAddHtInfo, sizeof(ADD_HT_INFO_IE));\n\tif (pAddHtInfo == NULL)\n\t\tgoto LabelErr;\n\n\t\n\tNdisZeroMemory(&QbssLoad, sizeof(QBSS_LOAD_PARM)); /* woody */\n#ifdef DOT11_N_SUPPORT\n    RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));\n\tRTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));\n#endif /* DOT11_N_SUPPORT */\n\n\tNdisZeroMemory(Ssid, MAX_LEN_OF_SSID);\n\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (ie_list == NULL)\n\t\tgoto LabelErr;\n\tNdisZeroMemory(ie_list, sizeof(BCN_IE_LIST));\n\n\n\tsanity_new = PeerBeaconAndProbeRspSanity(pAd,\n\t\t\t\t\t\t&Elem->Msg[0], Elem->MsgLen,\n\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\tie_list, &LenVIE, pVIE);\n\t\t\t\t\t\t\n\tsanity_old = PeerBeaconAndProbeRspSanity_Old(pAd, \n\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\t\t\tAddr2, \n\t\t\t\t\t\t\t\tBssid, \n\t\t\t\t\t\t\t\t(PCHAR)Ssid, \n\t\t\t\t\t\t\t\t&SsidLen, \n\t\t\t\t\t\t\t\t&BssType, \n\t\t\t\t\t\t\t\t&BeaconPeriod, \n\t\t\t\t\t\t\t\t&Channel, \n\t\t\t\t\t\t\t\t&NewChannel,\n\t\t\t\t\t\t\t\t&TimeStamp, \n\t\t\t\t\t\t\t\t&CfParm, \n\t\t\t\t\t\t\t\t&AtimWin, \n\t\t\t\t\t\t\t\t&CapabilityInfo, \n\t\t\t\t\t\t\t\t&Erp,\n\t\t\t\t\t\t\t\t&DtimCount, \n\t\t\t\t\t\t\t\t&DtimPeriod, \n\t\t\t\t\t\t\t\t&BcastFlag, \n\t\t\t\t\t\t\t\t&MessageToMe, \n\t\t\t\t\t\t\t\tSupRate,\n\t\t\t\t\t\t\t\t&SupRateLen,\n\t\t\t\t\t\t\t\tExtRate,\n\t\t\t\t\t\t\t\t&ExtRateLen,\n\t\t\t\t\t\t\t\t&CkipFlag,\n\t\t\t\t\t\t\t\t&AironetCellPowerLimit,\n\t\t\t\t\t\t\t\t&EdcaParm,\n\t\t\t\t\t\t\t\t&QbssLoad,\n\t\t\t\t\t\t\t\t&QosCapability,\n\t\t\t\t\t\t\t\t&RalinkIe,\n\t\t\t\t\t\t\t\t&HtCapabilityLen,\n#ifdef CONFIG_STA_SUPPORT\n\t\t\t\t\t\t\t\t&PreNHtCapabilityLen,\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\t\t\t\t\t\tpHtCapability,\n\t\t\t\t\t\t\t\t&ExtCapInfo,\n\t\t\t\t\t\t\t\t&AddHtInfoLen,\n\t\t\t\t\t\t\t\tpAddHtInfo,\n\t\t\t\t\t\t\t\t&NewExtChannelOffset,\n\t\t\t\t\t\t\t\t&LenVIE,\n\t\t\t\t\t\t\t\tpVIE);\n\n\t\tif (sanity_old != sanity_new)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"sanity mismatch, old=%d, new=%d\\n\", sanity_old, sanity_new));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (NdisCmpMemory(&ie_list->Addr2[0], &Addr2[0], MAC_ADDR_LEN) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Add2 mismatch!Old=%02x:%02x:%02x:%02x:%02x:%02x!New=%02x:%02x:%02x:%02x:%02x:%02x!\\n\",\n\t\t\t\t\t\t\t\t\tPRINT_MAC(Addr2), PRINT_MAC(ie_list->Addr2)));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->Bssid[0], &Bssid[0], MAC_ADDR_LEN) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Bssid mismatch!Old=%02x:%02x:%02x:%02x:%02x:%02x!New=%02x:%02x:%02x:%02x:%02x:%02x!\\n\",\n\t\t\t\t\t\t\t\t\tPRINT_MAC(Bssid), PRINT_MAC(ie_list->Bssid)));\n\t\t\t}\n\n\t\t\tif (SsidLen != ie_list->SsidLen)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SsidLen mismatch!Old=%d, New=%d\\n\", SsidLen, ie_list->SsidLen));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->Ssid[0], &Ssid[0], SsidLen) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Ssid mismatch!Old=%s, New=%s\\n\", Ssid, ie_list->Ssid));\n\t\t\t}\n\t\t\t\n\t\t\tif (BssType != ie_list->BssType)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BssType mismatch!Old=%d, New=%d\\n\", BssType, ie_list->BssType));\n\t\t\t}\n\n\t\t\tif (BeaconPeriod != ie_list->BeaconPeriod)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BeaconPeriod mismatch!Old=%d, New=%d\\n\", BeaconPeriod, ie_list->BeaconPeriod));\n\t\t\t}\n\n\t\t\tif (Channel != ie_list->Channel)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Channel mismatch!Old=%d, New=%d\\n\", Channel, ie_list->Channel));\n\t\t\t}\n\n\t\t\tif (NewChannel != ie_list->NewChannel)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"NewChannel mismatch!Old=%d, New=%d\\n\", NewChannel, ie_list->NewChannel));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->TimeStamp, &TimeStamp, sizeof(LARGE_INTEGER)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TimeStamp mismatch!Old=%d - %d, New=%d - %d\\n\",\n\t\t\t\t\t\t\tTimeStamp.u.LowPart, TimeStamp.u.HighPart,\n\t\t\t\t\t\t\tie_list->TimeStamp.u.LowPart, ie_list->TimeStamp.u.HighPart));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->CfParm, &CfParm, sizeof(CF_PARM)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CFParam mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old CFParam\", (UCHAR *)&CfParm, sizeof(CF_PARM));\n\t\t\t\thex_dump(\"New CFParam\", (UCHAR *)&ie_list->CfParm, sizeof(CF_PARM));\n\t\t\t}\n\n\t\t\tif (AtimWin != ie_list->AtimWin)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AtimWin mismatch!Old=%d, New=%d\\n\", AtimWin, ie_list->AtimWin));\n\t\t\t}\n\n\n\t\t\tif (CapabilityInfo != ie_list->CapabilityInfo)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CapabilityInfo mismatch!Old=%d, New=%d\\n\", CapabilityInfo, ie_list->CapabilityInfo));\n\t\t\t}\n\n\t\t\tif (Erp != ie_list->Erp)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Erp mismatch!Old=%d, New=%d\\n\", Erp, ie_list->Erp));\n\t\t\t}\n\n\t\t\tif (DtimCount != ie_list->DtimCount)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"DtimCount mismatch!Old=%d, New=%d\\n\", DtimCount, ie_list->DtimCount));\n\t\t\t}\n\n\t\t\tif (DtimPeriod != ie_list->DtimPeriod)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"DtimPeriod mismatch!Old=%d, New=%d\\n\", DtimPeriod, ie_list->DtimPeriod));\n\t\t\t}\n\n\t\t\tif (BcastFlag != ie_list->BcastFlag)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"BcastFlag mismatch!Old=%d, New=%d\\n\", BcastFlag, ie_list->BcastFlag));\n\t\t\t}\n\n\t\t\tif (MessageToMe != ie_list->MessageToMe)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MessageToMe mismatch!Old=%d, New=%d\\n\", MessageToMe, ie_list->MessageToMe));\n\t\t\t}\n\n\t\t\tif (SupRateLen != ie_list->SupRateLen)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SupRateLen mismatch!Old=%d, New=%d\\n\", SupRateLen, ie_list->SupRateLen));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->SupRate[0], &SupRate, ie_list->SupRateLen) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"SupRate mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old SupRate\", (UCHAR *)&SupRate, ie_list->SupRateLen);\n\t\t\t\thex_dump(\"New SupRate\", (UCHAR *)&ie_list->SupRate, ie_list->SupRateLen);\n\t\t\t}\n\n\n\t\t\tif (ExtRateLen != ie_list->ExtRateLen)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ExtRateLen mismatch!Old=%d, New=%d\\n\", ExtRateLen, ie_list->ExtRateLen));\n\t\t\t}\n\t\t\tif (NdisCmpMemory(&ie_list->ExtRate[0], &ExtRate, ie_list->ExtRateLen) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ExtRate mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old ExtRate\", (UCHAR *)&ExtRate, ie_list->ExtRateLen);\n\t\t\t\thex_dump(\"New ExtRate\", (UCHAR *)&ie_list->ExtRate, ie_list->ExtRateLen);\n\t\t\t}\n\n\n\t\t\tif (CkipFlag != ie_list->CkipFlag)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"CkipFlag mismatch!Old=%d, New=%d\\n\", CkipFlag, ie_list->CkipFlag));\n\t\t\t}\n\n\t\t\tif (AironetCellPowerLimit != ie_list->AironetCellPowerLimit)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AironetCellPowerLimit mismatch!Old=%d, New=%d\\n\", AironetCellPowerLimit, ie_list->AironetCellPowerLimit));\n\t\t\t}\n\t\t\tif (NdisCmpMemory(&ie_list->EdcaParm, &EdcaParm, sizeof(EDCA_PARM)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"EdcaParm mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old EdcaParm\", (UCHAR *)&EdcaParm, sizeof(EDCA_PARM));\n\t\t\t\thex_dump(\"New EdcaParm\", (UCHAR *)&ie_list->EdcaParm, sizeof(EDCA_PARM));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->QbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"QbssLoad mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old QbssLoad\", (UCHAR *)&QbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t\thex_dump(\"New QbssLoad\", (UCHAR *)&ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->QosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"QosCapability mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old QosCapability\", (UCHAR *)&QosCapability, sizeof(QOS_CAPABILITY_PARM));\n\t\t\t\thex_dump(\"New QosCapability\", (UCHAR *)&ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM));\n\t\t\t}\n\n\t\t\tif (RalinkIe != ie_list->RalinkIe)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"RalinkIe mismatch!Old=%lx, New=%lx\\n\", RalinkIe, ie_list->RalinkIe));\n\t\t\t}\n\n\t\t\tif (HtCapabilityLen != ie_list->HtCapabilityLen)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"HtCapabilityLen mismatch!Old=%d, New=%d\\n\", HtCapabilityLen, ie_list->HtCapabilityLen));\n\t\t\t}\n\n#ifdef CONFIG_STA_SUPPORT\n\t\t\tif (PreNHtCapabilityLen != ie_list->PreNHtCapabilityLen)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"PreNHtCapabilityLen mismatch!Old=%d, New=%d\\n\", PreNHtCapabilityLen, ie_list->PreNHtCapabilityLen));\n\t\t\t}\n#endif /* CONFIG_STA_SUPPORT */\n\t\t\tif (NdisCmpMemory(&ie_list->HtCapability, pHtCapability, sizeof(HT_CAPABILITY_IE)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"pHtCapability mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old HtCapability\", (UCHAR *)pHtCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\t\thex_dump(\"New HtCapability\", (UCHAR *)&ie_list->HtCapability, sizeof(HT_CAPABILITY_IE));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->ExtCapInfo, &ExtCapInfo, sizeof(EXT_CAP_INFO_ELEMENT)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"ExtCapInfo mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old ExtCapInfo\", (UCHAR *)&ExtCapInfo, sizeof(EXT_CAP_INFO_ELEMENT));\n\t\t\t\thex_dump(\"New ExtCapInfo\", (UCHAR *)&ie_list->ExtCapInfo, sizeof(EXT_CAP_INFO_ELEMENT));\n\t\t\t}\n\n\t\t\tif (AddHtInfoLen != ie_list->AddHtInfoLen)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AddHtInfoLen mismatch!Old=%d, New=%d\\n\", AddHtInfoLen, ie_list->AddHtInfoLen));\n\t\t\t}\n\n\t\t\tif (NdisCmpMemory(&ie_list->AddHtInfo, pAddHtInfo, sizeof(ADD_HT_INFO_IE)) != 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AddHtInfo mismatch!\\n\"));\n\t\t\t\thex_dump(\"Old AddHtInfo\", (UCHAR *)pAddHtInfo, sizeof(ADD_HT_INFO_IE));\n\t\t\t\thex_dump(\"New AddHtInfo\", (UCHAR *)&ie_list->AddHtInfo, sizeof(ADD_HT_INFO_IE));\n\t\t\t}\n\t\t\t\n\t\t\tif (NewExtChannelOffset != ie_list->NewExtChannelOffset)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AddHtInfoLen mismatch!Old=%d, New=%d\\n\", NewExtChannelOffset, ie_list->NewExtChannelOffset));\n\t\t\t}\n\t\t}\n\t\tgoto LabelOK;\n\t\t\t\nLabelErr:\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\nLabelOK:\n\tif (Ssid != NULL)\n\t\tos_free_mem(NULL, Ssid);\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (pHtCapability != NULL)\n\t\tos_free_mem(NULL, pHtCapability);\n\tif (pAddHtInfo != NULL)\n\t\tos_free_mem(NULL, pAddHtInfo);\n\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\t\t\n}\n//---Add by shiang to check correctness of new sanity function\n\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tpeer sends beacon back when scanning\n\t==========================================================================\n */\nVOID PeerBeaconAtScanAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tPFRAME_802_11 pFrame;\n\tUSHORT LenVIE;\n\tUCHAR *VarIE = NULL;\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\n\n\n\tBCN_IE_LIST *ie_list = NULL;\n\t\n\n#ifdef P2P_SUPPORT\n\tif (P2P_GO_ON(pAd))\n\t\treturn;\n#endif /* P2P_SUPPORT */\n\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (!ie_list) {\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s():Alloc ie_list failed!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\tNdisZeroMemory((UCHAR *)ie_list, sizeof(BCN_IE_LIST));\n\n\t/* Init Variable IE structure */\t\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t\tgoto LabelErr;\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\n\n\tpFrame = (PFRAME_802_11) Elem->Msg;\n\n\n\tif (PeerBeaconAndProbeRspSanity(pAd,\n\t\t\t\t\t\t&Elem->Msg[0], Elem->MsgLen,\n\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\tie_list, &LenVIE, pVIE))\n\t{\n\t\tULONG Idx = 0;\n\t\tCHAR Rssi = 0;\n\t\t\n\t\tIdx = BssTableSearch(&pAd->ScanTab, &ie_list->Bssid[0], ie_list->Channel);\n\t\tif (Idx != BSS_NOT_FOUND) \n\t\t\tRssi = pAd->ScanTab.BssEntry[Idx].Rssi;\n\n\t\tRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n#ifdef P2P_SUPPORT\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_PEER_PROB_RSP, Elem->MsgLen, Elem->Msg, ie_list->Channel);\n#endif /* P2P_SUPPORT */\n\n#ifdef DOT11_N_SUPPORT\n\t\tif ((ie_list->HtCapabilityLen > 0) || (ie_list->PreNHtCapabilityLen > 0))\n\t\t\tie_list->HtCapabilityLen = SIZE_HT_CAP_IE;\n#endif /* DOT11_N_SUPPORT */\n\n\t\tIdx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, Rssi, LenVIE, pVIE);\n#ifdef DOT11_N_SUPPORT\n\t\t/* TODO: Check for things need to do when enable \"DOT11V_WNM_SUPPORT\" */\n#ifdef DOT11N_DRAFT3\n\t\t/* Check if this scan channel is the effeced channel */\n\t\tif (INFRA_ON(pAd) \n\t\t\t&& (pAd->CommonCfg.bBssCoexEnable == TRUE) \n\t\t\t&& ((ie_list->Channel > 0) && (ie_list->Channel <= 14)))\n\t\t{\n\t\t\tint chListIdx;\n\n\t\t\t/* find the channel list idx by the channel number */\n\t\t\tfor (chListIdx = 0; chListIdx < pAd->ChannelListNum; chListIdx++)\n\t\t\t{\n\t\t\t\tif (ie_list->Channel == pAd->ChannelList[chListIdx].Channel)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (chListIdx < pAd->ChannelListNum)\n\t\t\t{\n\t\t\t\t/* \n\t\t\t\t\tIf this channel is effected channel for the 20/40 coex operation. Check the related IEs.\n\t\t\t\t*/\n\t\t\t\tif (pAd->ChannelList[chListIdx].bEffectedChannel == TRUE)\n\t\t\t\t{\n\t\t\t\t\tUCHAR RegClass;\n\t\t\t\t\tOVERLAP_BSS_SCAN_IE\tBssScan;\n\n\t\t\t\t\t/* Read Beacon's Reg Class IE if any. */\n\t\t\t\t\tPeerBeaconAndProbeRspSanity2(pAd, Elem->Msg, Elem->MsgLen, &BssScan, &RegClass);\n\t\t\t\t\tTriEventTableSetEntry(pAd, &pAd->CommonCfg.TriggerEventTab, &ie_list->Bssid[0], \n\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability, ie_list->HtCapabilityLen,\n\t\t\t\t\t\t\t\t\t\tRegClass, ie_list->Channel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\tif (Idx != BSS_NOT_FOUND)\n\t\t{\n\t\t\tPBSS_ENTRY\tpBssEntry = &pAd->ScanTab.BssEntry[Idx];\n\t\t\tNdisMoveMemory(pBssEntry->PTSF, &Elem->Msg[24], 4);\n\t\t\tNdisMoveMemory(&pBssEntry->TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\tNdisMoveMemory(&pBssEntry->TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\n\t\t\tpBssEntry->MinSNR = Elem->Signal % 10;\n\t\t\tif (pBssEntry->MinSNR == 0)\n\t\t\t\tpBssEntry->MinSNR = -5;\n\n\t\t\tNdisMoveMemory(pBssEntry->MacAddr, &ie_list->Addr2[0], MAC_ADDR_LEN);\n\n\t\t\tif ((pFrame->Hdr.FC.SubType == SUBTYPE_PROBE_RSP) && (LenVIE != 0))\n\t\t\t{\n\t\t\t\tpBssEntry->VarIeFromProbeRspLen = 0;\n\t\t\t\tif (pBssEntry->pVarIeFromProbRsp)\n\t\t\t\t{\n\t\t\t\t\tpBssEntry->VarIeFromProbeRspLen = LenVIE;\n\t\t\t\t\tRTMPZeroMemory(pBssEntry->pVarIeFromProbRsp, MAX_VIE_LEN);\n\t\t\t\t\tRTMPMoveMemory(pBssEntry->pVarIeFromProbRsp, pVIE, LenVIE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n\t\tRT_CFG80211_SCANNING_INFORM(pAd, Idx, Elem->Channel, (UCHAR *)pFrame,\n\t\t\t\t\t\t\t\t\tElem->MsgLen, Rssi);\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\t}\n\t/* sanity check fail, ignored */\n\tgoto LabelOK;\n\nLabelErr:\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\nLabelOK:\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\treturn;\n}\n\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tWhen waiting joining the (I)BSS, beacon received from external\n\t==========================================================================\n */\nVOID PeerBeaconAtJoinAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tBOOLEAN TimerCancelled;\n\tUSHORT LenVIE;\n\tUSHORT Status;\n\tUCHAR *VarIE = NULL;\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\tULONG Idx = 0;\n\tCHAR Rssi = 0;\n\n#ifdef DOT11_N_SUPPORT\n\tUCHAR CentralChannel;\n\tBOOLEAN bAllowNrate = FALSE;\n#endif /* DOT11_N_SUPPORT */\n\tBCN_IE_LIST *ie_list = NULL;\n\n\n\t/* allocate memory */\t\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (ie_list == NULL)\n\t\tgoto LabelErr;\n\tNdisZeroMemory(ie_list, sizeof(BCN_IE_LIST));\n\t\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t\tgoto LabelErr;\n\t/* Init Variable IE structure */\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\t\n\n\tif (PeerBeaconAndProbeRspSanity(pAd, \n\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t&LenVIE,\n\t\t\t\t\t\t\t\tpVIE))\n\t{\n\t\t/* Disqualify 11b only adhoc when we are in 11g only adhoc mode */\n\t\tif ((ie_list->BssType == BSS_ADHOC) &&\n\t\t\tWMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_G) &&\n\t\t\t((ie_list->SupRateLen+ie_list->ExtRateLen)< 12))\n\t\t\tgoto LabelOK;\n\n#ifdef P2P_SUPPORT\n\t\tif (P2P_INF_ON(pAd))\n\t\t{\n\t\t\tP2pPeerBeaconAtJoinAction(pAd, Elem, &ie_list->Bssid[0]);\n\t\t}\n#endif /* P2P_SUPPORT */\n\n\t\t/*\n\t\t    BEACON from desired BSS/IBSS found. We should be able to decide most\n\t\t    BSS parameters here.\n\t\t    Q. But what happen if this JOIN doesn't conclude a successful ASSOCIATEION?\n\t\t        Do we need to receover back all parameters belonging to previous BSS?\n\t\t    A. Should be not. There's no back-door recover to previous AP. It still need\n\t\t        a new JOIN-AUTH-ASSOC sequence.\n\t\t*/\n\t\tif (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, &ie_list->Bssid[0])) \n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():receive desired BEACON,Channel=%d\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, ie_list->Channel));\n\t\t\tRTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);\n\n#ifdef P2P_SUPPORT\n\t\t\tif (IS_P2P_ENROLLEE(pAd))\n\t\t\t{\n\t\t\t\tint p2pIdx;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Recv desired Beacon, update SSID[%d][%s]\\n\",\n\t\t\t\t\t\t\t\t\t\t\tie_list->SsidLen, &ie_list->Ssid[0]));\n\t\t\t\tpAd->MlmeAux.SsidLen = ie_list->SsidLen;\n\t\t\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, ie_list->Ssid, pAd->MlmeAux.SsidLen);\n\n\t\t\t\tp2pIdx = P2pGroupTabSearch(pAd, ie_list->Addr2);\n\t\t\t\tif (p2pIdx < MAX_P2P_GROUP_SIZE)\n\t\t\t\t{\n\t\t\t\t\tpAd->P2pTable.Client[p2pIdx].SsidLen = ie_list->SsidLen;\n\t\t\t\t\tNdisMoveMemory(pAd->P2pTable.Client[p2pIdx].Ssid, ie_list->Ssid, pAd->P2pTable.Client[p2pIdx].SsidLen);\n\t\t\t\t}\n\t\t\t}\n#endif /* P2P_SUPPORT */\n\t\t\t/* Update RSSI to prevent No signal display when cards first initialized */\n\t\t\tpAd->StaCfg.RssiSample.LastRssi0 = ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20);\n\t\t\tpAd->StaCfg.RssiSample.LastRssi1 = ConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20);\n\t\t\tpAd->StaCfg.RssiSample.LastRssi2 = ConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20);\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi0 = pAd->StaCfg.RssiSample.LastRssi0;\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi0X8\t= pAd->StaCfg.RssiSample.AvgRssi0 << 3;\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi1 = pAd->StaCfg.RssiSample.LastRssi1;\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi1X8\t= pAd->StaCfg.RssiSample.AvgRssi1 << 3;\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi2 = pAd->StaCfg.RssiSample.LastRssi2;\n\t\t\tpAd->StaCfg.RssiSample.AvgRssi2X8\t= pAd->StaCfg.RssiSample.AvgRssi2 << 3;\n\n\t\t\t/*\n\t\t\t  We need to check if SSID only set to any, then we can record the current SSID.\n\t\t\t  Otherwise will cause hidden SSID association failed. \n\t\t\t*/\n\t\t\tif (pAd->MlmeAux.SsidLen == 0)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(pAd->MlmeAux.Ssid, ie_list->Ssid, ie_list->SsidLen);\n\t\t\t\tpAd->MlmeAux.SsidLen = ie_list->SsidLen;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tIdx = BssSsidTableSearch(&pAd->ScanTab, ie_list->Bssid,\n\t\t\t\t\t\t\t\t\t\tpAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen,\n\t\t\t\t\t\t\t\t\t\tie_list->Channel);\n\n\t\t\t\tif (Idx == BSS_NOT_FOUND)\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\t\t\t\t\tIdx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, Rssi, LenVIE, pVIE);\n\t\t\t\t\tif (Idx != BSS_NOT_FOUND)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4);\n\t\t\t\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\t\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\t\t\t\tie_list->CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo;\n\n\t\t\t\t\t\tpAd->ScanTab.BssEntry[Idx].MinSNR = Elem->Signal % 10;\n\t\t\t\t\t\tif (pAd->ScanTab.BssEntry[Idx].MinSNR == 0)\n\t\t\t\t\t\t\tpAd->ScanTab.BssEntry[Idx].MinSNR = -5;\n\n\t\t\t\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Idx].MacAddr, ie_list->Addr2, MAC_ADDR_LEN);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t\t\tif (pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef WSC_STA_SUPPORT\n\t\t\t\t\tif ((pAd->StaCfg.WscControl.WscState != WSC_STATE_OFF)\n\t\t\t\t\t)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n#endif /* WSC_STA_SUPPORT */\n\t\t\t\t\t{\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t    Check if AP privacy is different Staion, if yes, \n\t\t\t\t\t\t    start a new scan and ignore the frame \n\t\t\t\t\t\t    (often happen during AP change privacy at short time)\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tif ((((pAd->StaCfg.WepStatus != Ndis802_11WEPDisabled) << 4) ^ ie_list->CapabilityInfo) & 0x0010)\n\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\tMLME_SCAN_REQ_STRUCT ScanReq;\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:AP privacy %d is differenct from STA privacy%d\\n\", \n\t\t\t\t\t\t\t\t\t\t__FUNCTION__, (ie_list->CapabilityInfo & 0x0010) >> 4 ,\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.WepStatus != Ndis802_11WEPDisabled));\n\t\t\t\t\t\t\tScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);\n\t\t\t\t\t\t\tMlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0);\n\t\t\t\t\t\t\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;\n\t\t\t\t\t\t\tNdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);\n\t\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Multiple SSID case, used correct CapabilityInfo */\n\t\t\t\t\tie_list->CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpAd->MlmeAux.CapabilityInfo = ie_list->CapabilityInfo & SUPPORTED_CAPABILITY_INFO;\n\t\t\tpAd->MlmeAux.BssType = ie_list->BssType;\n\t\t\tpAd->MlmeAux.BeaconPeriod = ie_list->BeaconPeriod;\n\n\t\t\t/*\n\t\t\t\tSome AP may carrys wrong beacon interval (ex. 0) in Beacon IE.\n\t\t\t\tWe need to check here for preventing divided by 0 error.\n\t\t\t*/\n\t\t\tif (pAd->MlmeAux.BeaconPeriod == 0)\n\t\t\t\tpAd->MlmeAux.BeaconPeriod = 100;\n\t\t\t\n\t\t\tpAd->MlmeAux.Channel = ie_list->Channel;\n\t\t\tpAd->MlmeAux.AtimWin = ie_list->AtimWin;\n\t\t\tpAd->MlmeAux.CfpPeriod = ie_list->CfParm.CfpPeriod;\n\t\t\tpAd->MlmeAux.CfpMaxDuration = ie_list->CfParm.CfpMaxDuration;\n\t\t\tpAd->MlmeAux.APRalinkIe = ie_list->RalinkIe;\n\n\t\t\t/*\n\t\t\t    Copy AP's supported rate to MlmeAux for creating assoication request\n\t\t\t    Also filter out not supported rate\n\t\t\t*/\n\t\t\tpAd->MlmeAux.SupRateLen = ie_list->SupRateLen;\n\t\t\tNdisMoveMemory(pAd->MlmeAux.SupRate, ie_list->SupRate, ie_list->SupRateLen);\n\t\t\tRTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen);\n\t\t\tpAd->MlmeAux.ExtRateLen = ie_list->ExtRateLen;\n\t\t\tNdisMoveMemory(pAd->MlmeAux.ExtRate, ie_list->ExtRate, ie_list->ExtRateLen);\n\t\t\tRTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);\n\n\t\t\tNdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16);\n\n\n\t\t\t/*  Get the ext capability info element */\n\t\t\tNdisMoveMemory(&pAd->MlmeAux.ExtCapInfo, &ie_list->ExtCapInfo,sizeof(ie_list->ExtCapInfo));\n\n\t\t\t\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"MlmeAux.ExtCapInfo=%d\\n\", pAd->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport));\n\t\t\tif (pAd->CommonCfg.bBssCoexEnable == TRUE)\n\t\t\t\tpAd->CommonCfg.ExtCapIE.BssCoexistMgmtSupport = 1;\n#endif /* DOT11N_DRAFT3 */\n\n\t\t\tif (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled) && (pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled))\n\t\t\t\t|| (pAd->CommonCfg.HT_DisallowTKIP == FALSE))\n\t\t\t{\n\t\t\t\tif ((pAd->StaCfg.BssType == BSS_INFRA) || \n\t\t\t\t\t((pAd->StaCfg.BssType == BSS_ADHOC) && (pAd->StaCfg.bAdhocN == TRUE)))\n\t\t\t\tbAllowNrate = TRUE;\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tpAd->MlmeAux.NewExtChannelOffset = ie_list->NewExtChannelOffset;\n\t\t\tpAd->MlmeAux.HtCapabilityLen = ie_list->HtCapabilityLen;\n\n\t\t\tCentralChannel = ie_list->Channel;\n\t\t\t\n\t\t\tRTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);\n\t\t\t/* filter out un-supported ht rates */\n\t\t\tif (((ie_list->HtCapabilityLen > 0) || (ie_list->PreNHtCapabilityLen > 0)) && \n\t\t\t\t(pAd->StaCfg.DesiredHtPhyInfo.bHtEnable) &&\n\t\t\t\t(WMODE_CAP_N(pAd->CommonCfg.PhyMode) && bAllowNrate))\n\t\t\t{\n   \t\t\t\tRTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &ie_list->AddHtInfo, SIZE_ADD_HT_INFO_IE);\n\t\t\t\t\n                \t\t/* StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability */\n\t\t\t\tNdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, ie_list->HtCapability.MCSSet, 16);\n\t\t\t\tpAd->MlmeAux.NewExtChannelOffset = ie_list->NewExtChannelOffset;\n\t\t\t\tpAd->MlmeAux.HtCapabilityLen = SIZE_HT_CAP_IE;\n\t\t\t\tpAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE;\n\t\t\t\tif (ie_list->PreNHtCapabilityLen > 0)\n\t\t\t\t\tpAd->StaActive.SupportedPhyInfo.bPreNHt = TRUE;\n\t\t\t\tRTMPCheckHt(pAd, BSSID_WCID, &ie_list->HtCapability, &ie_list->AddHtInfo);\n\t\t\t\t/* Copy AP Parameter to StaActive.  This is also in LinkUp. */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():(MpduDensity=%d, MaxRAmpduFactor=%d, BW=%d)\\n\", \n\t\t\t\t\t\t\t__FUNCTION__, pAd->StaActive.SupportedHtPhy.MpduDensity,\n\t\t\t\t\t\t\tpAd->StaActive.SupportedHtPhy.MaxRAmpduFactor,\n\t\t\t\t\t\t\tie_list->HtCapability.HtCapInfo.ChannelWidth));\n\n\t\t\t\tif (ie_list->AddHtInfoLen > 0)\n\t\t\t\t{\n\t\t \t\t\t/* Check again the Bandwidth capability of this AP. */\n\t\t\t\t\tCentralChannel = get_cent_ch_by_htinfo(pAd,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->AddHtInfo,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability);\n                    \n\t\t \t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s(): HT-CtrlChannel=%d, CentralChannel=>%d\\n\",\n\t\t \t\t\t\t\t\t__FUNCTION__, ie_list->AddHtInfo.ControlChan, CentralChannel));\n\t\t\t\t}\n\n#ifdef DOT11_VHT_AC\n\t\t\t\tif (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) &&\n\t\t\t\t\t(pAd->MlmeAux.Channel > 14) &&\n\t\t\t\t\t(ie_list->vht_cap_len))\n\t\t\t\t{\n\t\t\t\t\tVHT_OP_INFO *vht_op = &ie_list->vht_op_ie.vht_op_info;\n\n\t\t\t\t\tNdisMoveMemory(&pAd->MlmeAux.vht_cap, &ie_list->vht_cap_ie, ie_list->vht_cap_len);\n\t\t\t\t\tpAd->MlmeAux.vht_cap_len = ie_list->vht_cap_len;\n\t\t\t\t\tpAd->StaActive.SupportedPhyInfo.bVhtEnable = TRUE;\n\t\t\t\t\tif (vht_op->ch_width > 0) {\n\t\t\t\t\t\tCentralChannel = vht_op->center_freq_1;\n\t\t\t\t\t\tpAd->StaActive.SupportedPhyInfo.vht_bw = VHT_BW_80;\n\t\t\t\t\t}\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s(): VHT->center_freq_1=%d, CentralChannel=>%d\\n\",\n\t\t \t\t\t\t\t\t__FUNCTION__, vht_op->center_freq_1, CentralChannel));\n\t\t\t\t}\n#endif /* DOT11_VHT_AC */\n\t\t\t}\n\t\t\telse\n#endif /* DOT11_N_SUPPORT */\n\t\t\t{\n   \t\t\t\t/* To prevent error, let legacy AP must have same CentralChannel and Channel. */\n\t\t\t\tif ((ie_list->HtCapabilityLen == 0) && (ie_list->PreNHtCapabilityLen == 0))\n\t\t\t\t\tpAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel;\n\n\t\t\t\tpAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;\n#ifdef DOT11_VHT_AC\n\t\t\t\tpAd->StaActive.SupportedPhyInfo.bVhtEnable = FALSE;\n\t\t\t\tpAd->StaActive.SupportedPhyInfo.vht_bw = VHT_BW_2040;\n#endif /* DOT11_VHT_AC */\n\t\t\t\tpAd->MlmeAux.NewExtChannelOffset = 0xff;\n\t\t\t\tRTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);\n\t\t\t\tpAd->MlmeAux.HtCapabilityLen = 0;\n\t\t\t\tRTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE);\n\t\t\t}\n\n\t\t\tpAd->MlmeAux.CentralChannel = CentralChannel;\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%s(): Set CentralChannel=%d\\n\", __FUNCTION__, pAd->MlmeAux.CentralChannel));\n\n\t\t\tRTMPUpdateMlmeRate(pAd);\n\t\n\t\t\t/* copy QOS related information */\n\t\t\tif ((pAd->CommonCfg.bWmmCapable)\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t || WMODE_CAP_N(pAd->CommonCfg.PhyMode)\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\t)\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&pAd->MlmeAux.APEdcaParm, &ie_list->EdcaParm, sizeof(EDCA_PARM));\n\t\t\t\tNdisMoveMemory(&pAd->MlmeAux.APQbssLoad, &ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t\tNdisMoveMemory(&pAd->MlmeAux.APQosCapability, &ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));\n\t\t\t\tNdisZeroMemory(&pAd->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t\tNdisZeroMemory(&pAd->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\n\t\t\t}\n\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s(): - after JOIN, SupRateLen=%d, ExtRateLen=%d\\n\", \n\t\t\t\t\t\t\t\t__FUNCTION__, pAd->MlmeAux.SupRateLen,\n\t\t\t\t\t\t\t\tpAd->MlmeAux.ExtRateLen));\n\n\t\t\tif (ie_list->AironetCellPowerLimit != 0xFF)\n\t\t\t{\n\t\t\t\t/* We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power */\n\t\t\t\tChangeToCellPowerLimit(pAd, ie_list->AironetCellPowerLimit);\n\t\t\t}\n\t\t\telse  /* Used the default TX Power Percentage. */\n\t\t\t\tpAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;\n\n\t\t\tif (pAd->StaCfg.BssType == BSS_INFRA)\n\t\t\t{\n\t\t\t\tBOOLEAN InfraAP_BW;\n\t\t\t\tUCHAR BwFallBack = 0;\n\n\t\t\t\tif (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)\n\t\t\t\t\tInfraAP_BW = TRUE;\n\t\t\t\telse\n\t\t\t\t\tInfraAP_BW = FALSE;\n\n\t\t\t\tAdjustChannelRelatedValue(pAd,\n\t\t\t\t\t\t\t\t\t\t\t&BwFallBack,\n\t\t\t\t\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\t\t\t\t\tInfraAP_BW,\n\t\t\t\t\t\t\t\t\t\t\tpAd->MlmeAux.Channel,\n\t\t\t\t\t\t\t\t\t\t\tpAd->MlmeAux.CentralChannel\n#ifdef CONFIG_MULTI_CHANNEL\n\t\t\t\t\t\t\t\t\t\t\t,0\n#endif /*CONFIG_MULTI_CHANNEL*/\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t);\n#ifdef P2P_SUPPORT\n\t\t\t\tif (BwFallBack == 1)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"P2P STA connection to 40MHz GO, but Infra extra and P2P Group extra is different!!!\\n\"));\n\t\t\t\t\tpAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = BW_20;\n\t\t\t\t\tpAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel;\n\t\t\t\t\tpAd->MlmeAux.bBwFallBack = TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpAd->MlmeAux.bBwFallBack = FALSE;\n\t\t\t\t}\n\t\t\t\tpAd->MlmeAux.ConCurrentCentralChannel = pAd->CommonCfg.CentralChannel;\n#endif /* P2P_SUPPORT */\n\t\t\t}\n\n\t\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\t\tStatus = MLME_SUCCESS;\n\t\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status, 0);\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n\t\t\tRT_CFG80211_SCANNING_INFORM(pAd, Idx, Elem->Channel, Elem->Msg,\n\t\t\t\t\t\t\t\t\t\tElem->MsgLen, Rssi);\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\t\t}\n\t\t/* not to me BEACON, ignored */\n\t} \n\t/* sanity check fail, ignore this frame */\n\n\tgoto LabelOK;\n\nLabelErr:\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\nLabelOK:\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\n\treturn;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\treceive BEACON from peer\n\n\tIRQL = DISPATCH_LEVEL\n\n\t==========================================================================\n */\nVOID PeerBeacon(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR index=0;\n\tUSHORT TbttNumToNextWakeUp;\n\tUSHORT LenVIE;\n\tUCHAR *VarIE = NULL;\t\t/* Total VIE length = MAX_VIE_LEN - -5 */\n\tNDIS_802_11_VARIABLE_IEs *pVIE = NULL;\n\n\n\tBCN_IE_LIST *ie_list = NULL;\n\n#ifdef RALINK_ATE\n    if (ATE_ON(pAd))\n    {\n\t\treturn;\n    }\n#endif /* RALINK_ATE */\n\n\tif (!(INFRA_ON(pAd) || ADHOC_ON(pAd)\n#ifdef P2P_SUPPORT\n\t\t|| P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)\n#endif /* P2P_SUPPORT */\n\t\t))\n\t\treturn;\n\n\t/* allocate memory */\n\tos_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST));\n\tif (ie_list == NULL)\n\t\tgoto LabelErr;\n\tNdisZeroMemory(ie_list, sizeof(BCN_IE_LIST));\n\t\n\tos_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN);\n\tif (VarIE == NULL)\n\t\tgoto LabelErr;\n\t/* Init Variable IE structure */\n\tpVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;\n\tpVIE->Length = 0;\n\n\tif (PeerBeaconAndProbeRspSanity(pAd, \n\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\tElem->Channel,\n\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t&LenVIE,\n\t\t\t\t\t\t\t\tpVIE)) \n\t{\n\t\tBOOLEAN is_my_bssid, is_my_ssid;\n\t\tULONG Bssidx, Now;\n\t\tBSS_ENTRY *pBss;\n\t\tCHAR RealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\t\tConvertToRssi(pAd, Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n\t\tis_my_bssid = MAC_ADDR_EQUAL(ie_list->Bssid, pAd->CommonCfg.Bssid)? TRUE : FALSE;\n\t\tis_my_ssid = SSID_EQUAL(ie_list->Ssid, ie_list->SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)? TRUE:FALSE;\n\n\n\t\t/* ignore BEACON not for my SSID */\n\t\tif ((!is_my_ssid) && (!is_my_bssid))\n\t\t\tgoto LabelOK;\n\n\t\t/* It means STA waits disassoc completely from this AP, ignores this beacon. */\n\t\tif (pAd->Mlme.CntlMachine.CurrState == CNTL_WAIT_DISASSOC)\n\t\t\tgoto LabelOK;\n\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t/* Copy Control channel for this BSSID. */\t\n\t\tif (ie_list->AddHtInfoLen != 0)\n\t\t\tie_list->Channel = ie_list->AddHtInfo.ControlChan;\n\n\t\tif ((ie_list->HtCapabilityLen > 0) || (ie_list->PreNHtCapabilityLen > 0))\n\t\t\tie_list->HtCapabilityLen = SIZE_HT_CAP_IE;\n#endif /* DOT11_N_SUPPORT */\n\n\t\t/*\n\t\t   Housekeeping \"SsidBssTab\" table for later-on ROAMing usage. \n\t\t*/\n\t\tBssidx = BssTableSearchWithSSID(&pAd->MlmeAux.SsidBssTab, ie_list->Bssid, ie_list->Ssid, ie_list->SsidLen, ie_list->Channel);\n\t\tif (Bssidx == BSS_NOT_FOUND)\n\t\t{\t\t\t\n\t\t\t/* discover new AP of this network, create BSS entry */\n\t\t\tBssidx = BssTableSetEntry(pAd, &pAd->MlmeAux.SsidBssTab, ie_list, RealRssi, LenVIE, pVIE);\n\t\t\tif (Bssidx == BSS_NOT_FOUND)\n\t\t\t\t;\n\t\t\telse\n\t\t\t{\n\t\t\t\tPBSS_ENTRY\tpBssEntry = &pAd->MlmeAux.SsidBssTab.BssEntry[Bssidx];\n\t\t\t\tNdisMoveMemory(&pBssEntry->PTSF[0], &Elem->Msg[24], 4);\n\t\t\t\tNdisMoveMemory(&pBssEntry->TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\t\tNdisMoveMemory(&pBssEntry->TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\t\tpBssEntry->Rssi = RealRssi;\n\n\t\t\t\tNdisMoveMemory(pBssEntry->MacAddr, ie_list->Addr2, MAC_ADDR_LEN);\n\t\t\t\t\n\n\t\t\t}\n\t\t}\t\t\t\n\t\t\n\t\t/*\n\t\t\tUpdate ScanTab\n\t\t*/\n\t\tBssidx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel);\n\t\tif (Bssidx == BSS_NOT_FOUND)\n\t\t{\n\t\t\t/* discover new AP of this network, create BSS entry */\n\t\t\tBssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, RealRssi, LenVIE, pVIE);\n\t\t\tif (Bssidx == BSS_NOT_FOUND) /* return if BSS table full */\n\t\t\t\tgoto LabelOK;  \n\t\t\t\n\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4);\n\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\tNdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);\n\t\t\tpAd->ScanTab.BssEntry[Bssidx].MinSNR = Elem->Signal % 10;\n\t\t\tif (pAd->ScanTab.BssEntry[Bssidx].MinSNR == 0)\n\t\t\t\tpAd->ScanTab.BssEntry[Bssidx].MinSNR = -5;\n\t\t\t\n\t\t\tNdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].MacAddr, ie_list->Addr2, MAC_ADDR_LEN);\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\t/* \n\t\t    if the ssid matched & bssid unmatched, we should select the bssid with large value.\n\t\t    This might happened when two STA start at the same time\n\t\t*/\n\t\tif ((! is_my_bssid) && ADHOC_ON(pAd))\n\t\t{\n\t\t\tINT\ti;\n#ifdef IWSC_SUPPORT\n\t\t\tif ((pAd->StaCfg.WscControl.WscConfMode != WSC_DISABLE) &&\n\t\t\t\t(pAd->StaCfg.WscControl.bWscTrigger == TRUE))\n\t\t\t{\n\t\t\t\t;\n\t\t\t}\n\t\t\telse\n#endif /* IWSC_SUPPORT */\n\t\t\t/* Add the safeguard against the mismatch of adhoc wep status */\n\t\t\tif ((pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus) ||\n\t\t\t\t(pAd->StaCfg.AuthMode != pAd->ScanTab.BssEntry[Bssidx].AuthMode))\n\t\t\t{\n\t\t\t\tgoto LabelOK;\n\t\t\t}\n\t\t\t/* collapse into the ADHOC network which has bigger BSSID value. */\n\t\t\tfor (i = 0; i < 6; i++)\n\t\t\t{\n\t\t\t\tif (ie_list->Bssid[i] > pAd->CommonCfg.Bssid[i])\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - merge to the IBSS with bigger BSSID=%02x:%02x:%02x:%02x:%02x:%02x\\n\", \n\t\t\t\t\t\tPRINT_MAC(ie_list->Bssid)));\n\t\t\t\t\tAsicDisableSync(pAd);\n\t\t\t\t\tCOPY_MAC_ADDR(pAd->CommonCfg.Bssid, ie_list->Bssid);\n\t\t\t\t\tAsicSetBssid(pAd, pAd->CommonCfg.Bssid); \n\t\t\t\t\tMakeIbssBeacon(pAd);        /* re-build BEACON frame */\n\t\t\t\t\tAsicEnableIbssSync(pAd);    /* copy BEACON frame to on-chip memory */\n\t\t\t\t\tis_my_bssid = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if (ie_list->Bssid[i] < pAd->CommonCfg.Bssid[i])\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\n\t\tNdisGetSystemUpTime(&Now);\n\t\tpBss = &pAd->ScanTab.BssEntry[Bssidx];\n\t\tpBss->Rssi = RealRssi;       /* lastest RSSI */\n\t\tpBss->LastBeaconRxTime = Now;   /* last RX timestamp */\n\n\t\t/*\n\t\t   BEACON from my BSSID - either IBSS or INFRA network\n\t\t*/ \n\t\tif (is_my_bssid)\n\t\t{\n\t\t\tRXWI_STRUC\tRxWI;\n\t\t\tUINT8 RXWISize = pAd->chipCap.RXWISize;\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\tOVERLAP_BSS_SCAN_IE\tBssScan;\n\t\t\tUCHAR\t\t\t\t\tRegClass;\n\t\t\tBOOLEAN\t\t\t\t\tbrc;\n\n\t\t\t/* Read Beacon's Reg Class IE if any. */\n\t\t\tbrc = PeerBeaconAndProbeRspSanity2(pAd, Elem->Msg, Elem->MsgLen, &BssScan, &RegClass);\n\t\t\tif (brc == TRUE)\n\t\t\t{\n\t\t\t\tUpdateBssScanParm(pAd, BssScan);\n\t\t\t\tpAd->StaCfg.RegClass = RegClass;\n\t\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n\t\t\tpAd->StaCfg.DtimCount = ie_list->DtimCount;\n\t\t\tpAd->StaCfg.DtimPeriod = ie_list->DtimPeriod;\n\t\t\tpAd->StaCfg.LastBeaconRxTime = Now;\n\n\n\t\t\tNdisZeroMemory(&RxWI, RXWISize);\n\t\t\tRxWI.RxWIRSSI0 = Elem->Rssi0;\n\t\t\tRxWI.RxWIRSSI1 = Elem->Rssi1;\n\t\t\tRxWI.RxWIRSSI2 = Elem->Rssi2;\n\t\t\tRxWI.RxWIPhyMode = 0; /* Prevent SNR calculate error. */\n\n\t\t\tif (INFRA_ON(pAd)) {\n\t\t\t\tMAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\t\t\tif (pEntry)\n\t\t\t\t\tUpdate_Rssi_Sample(pAd,\n\t\t\t\t\t\t\t   &pEntry->RssiSample,\n\t\t\t\t\t\t\t   &RxWI);\n\t\t\t}\n\n\t\t\tUpdate_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, &RxWI);\n\n\t\t\tif ((pAd->CommonCfg.bIEEE80211H == 1) &&\n\t\t\t\t(ie_list->NewChannel != 0) &&\n\t\t\t\t(ie_list->Channel != ie_list->NewChannel))\n\t\t\t{\n\t\t\t\t/* Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection). */\n\t\t\t\t/* In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results. */\n\t\t\t\tAsicSwitchChannel(pAd, 1, FALSE);\n\t\t\t\tAsicLockChannel(pAd, 1);\n\t\t\t    LinkDown(pAd, FALSE);\n\t\t\t\tMlmeQueueInit(pAd, &pAd->Mlme.Queue);\n\t\t\t\tBssTableInit(&pAd->ScanTab);\n\t\t\t    RTMPusecDelay(1000000);\t\t/* use delay to prevent STA do reassoc */\n\t\t\t\t\t\t\n\t\t\t\t/* channel sanity check */\n\t\t\t\tfor (index = 0 ; index < pAd->ChannelListNum; index++)\n\t\t\t\t{\n\t\t\t\t\tif (pAd->ChannelList[index].Channel == ie_list->NewChannel)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->ScanTab.BssEntry[Bssidx].Channel = ie_list->NewChannel;\n\t\t\t\t\t\tpAd->CommonCfg.Channel = ie_list->NewChannel;\n\t\t\t\t\t\tAsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);\n\t\t\t\t\t\tAsicLockChannel(pAd, pAd->CommonCfg.Channel);\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"PeerBeacon - STA receive channel switch announcement IE (New Channel =%d)\\n\", ie_list->NewChannel));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (index >= pAd->ChannelListNum)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT_ERR((\"PeerBeacon(can not find New Channel=%d in ChannelList[%d]\\n\", pAd->CommonCfg.Channel, pAd->ChannelListNum));\n\t\t\t\t}\n\t\t\t}\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\tif (pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS) ;\n\t\t\telse\n#endif /* WPA_SUPPLICANT_SUPPORT */\n#ifdef WSC_STA_SUPPORT\n\t\t\tif (pAd->StaCfg.WscControl.WscState == WSC_STATE_OFF)\n#endif /* WSC_STA_SUPPORT */\n\t\t\t{\n\t\t\t\tif ((((pAd->StaCfg.WepStatus != Ndis802_11WEPDisabled) << 4) ^ ie_list->CapabilityInfo) & 0x0010)\n\t\t\t\t{\n\n\t\t\t\t\t/*\n\t\t\t\t\t\tTo prevent STA connect to OPEN/WEP AP when STA is OPEN/NONE or \n\t\t\t\t\t\tSTA connect to OPEN/NONE AP when STA is OPEN/WEP AP.\n\t\t\t\t\t*/\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:AP privacy:%x is differenct from STA privacy:%x\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, (ie_list->CapabilityInfo & 0x0010) >> 4 , \n\t\t\t\t\t\t\t\tpAd->StaCfg.WepStatus != Ndis802_11WEPDisabled));\n\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tLinkDown(pAd,FALSE);\n\t\t\t\t\t\tBssTableInit(&pAd->ScanTab);\n\t\t\t\t\t}\n\t\t\t\t\tgoto LabelOK;\n\t\t\t\t}\n\t\t\t}\n\n#ifdef LINUX\n#ifdef RT_CFG80211_SUPPORT\n/*\t\t\tCFG80211_BeaconCountryRegionParse(pAd, pVIE, LenVIE); */\n#endif /* RT_CFG80211_SUPPORT */\n#endif /* LINUX */\n\n\t\t\tif (ie_list->AironetCellPowerLimit != 0xFF)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t   We get the Cisco (ccx) \"TxPower Limit\" required\n\t\t\t\t   Changed to appropriate TxPower Limit for Ciso Compatible Extensions\n\t\t\t\t*/\n\t\t\t\tChangeToCellPowerLimit(pAd, ie_list->AironetCellPowerLimit);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t   AironetCellPowerLimit equal to 0xFF means the Cisco (ccx) \"TxPower Limit\" not exist.\n\t\t\t\t   Used the default TX Power Percentage, that set from UI.\t\n\t\t\t\t*/\n\t\t\t\tpAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;\t\n\t\t\t}\n\n\t\t\tif (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(ie_list->CapabilityInfo)))   \n\t\t\t{\n\t\t\t\tUCHAR\t\t\tMaxSupportedRateIn500Kbps = 0;\n\t\t\t\tUCHAR\t\t\tidx;\n\t\t\t\tMAC_TABLE_ENTRY *pEntry;\n#ifdef WSC_STA_SUPPORT\n\t\t\t\tPWSC_CTRL\t\tpWpsCtrl = &pAd->StaCfg.WscControl;\n#endif /* WSC_STA_SUPPORT */\n\t\n\t\t\t\tMaxSupportedRateIn500Kbps = dot11_max_sup_rate(ie_list->SupRateLen, &ie_list->SupRate[0], \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tie_list->ExtRateLen, &ie_list->ExtRate[0]);\n\n\t\t\t\t/* look up the existing table */\n\t\t\t\tpEntry = MacTableLookup(pAd, ie_list->Addr2);\n\n\t\t\t\t/*\n\t\t\t\t   Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon.\n\t\t\t\t   To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station.\n\t\t\t\t*/\n\t\t\t\tif ((ADHOC_ON(pAd) && ((!pEntry) || (pEntry && IS_ENTRY_NONE(pEntry)))) ||\n\t\t\t\t\t(pEntry && RTMP_TIME_AFTER(Now, pEntry->LastBeaconRxTime + ADHOC_ENTRY_BEACON_LOST_TIME)))\n\t\t\t\t{\n\t\t\t\t\tif (pEntry == NULL)\n\t\t\t\t\t\t/* Another adhoc joining, add to our MAC table. */\n\t\t\t\t\t\tpEntry = MacTableInsertEntry(pAd, ie_list->Addr2, BSS0, OPMODE_STA, FALSE);\n\n\t\t\t\t\tif (pEntry == NULL)\n\t\t\t\t\t\tgoto LabelOK;\n\n#ifdef IWSC_SUPPORT\n\t\t\t\t\thex_dump(\"Another adhoc joining - Addr2\", ie_list->Addr2, 6);\n\t\t\t\t\thex_dump(\"Another adhoc joining - WscPeerMAC\", pAd->StaCfg.WscControl.WscPeerMAC, 6);\n\t\t\t\t\tif ((NdisEqualMemory(ie_list->Addr2, pAd->StaCfg.WscControl.WscPeerMAC, MAC_ADDR_LEN)) &&\n\t\t\t\t\t\t(pAd->StaCfg.IWscInfo.bSendEapolStart == FALSE) &&\n\t\t\t\t\t\t(pWpsCtrl->bWscTrigger == TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = TRUE;\n\t\t\t\t\t}\n#endif /* IWSC_SUPPORT */\n\n#ifdef DOT11_VHT_AC\n{\n\t\t\t\t\tBOOLEAN result;\n\t\t\t\t\tIE_LISTS *ielist;\n\n\t\t\t\t\tos_alloc_mem(NULL, (UCHAR **)&ielist, sizeof(IE_LISTS));\n\t\t\t\t\tif (!ielist)\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\tNdisZeroMemory((UCHAR *)ielist, sizeof(IE_LISTS));\n\n\t\t\t\t\tif (ie_list->vht_cap_len && ie_list->vht_op_len)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(&ielist->vht_cap, &ie_list->vht_cap_ie, sizeof(VHT_CAP_IE));\n\t\t\t\t\t\tNdisMoveMemory(&ielist->vht_op, &ie_list->vht_op_ie, sizeof(VHT_OP_IE));\n\t\t\t\t\t\tielist->vht_cap_len = ie_list->vht_cap_len;\n\t\t\t\t\t\tielist->vht_op_len = ie_list->vht_op_len;\n\t\t\t\t\t}\n\t\t\t\t\tresult = StaAddMacTableEntry(pAd, \n\t\t\t\t\t\t\t\t\t\t\tpEntry, \n\t\t\t\t\t\t\t\t\t\t\tMaxSupportedRateIn500Kbps, \n\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability, \n\t\t\t\t\t\t\t\t\t\t\tie_list->HtCapabilityLen, \n\t\t\t\t\t\t\t\t\t\t\t&ie_list->AddHtInfo,\n\t\t\t\t\t\t\t\t\t\t\tie_list->AddHtInfoLen,\n\t\t\t\t\t\t\t\t\t\t\tielist,\n\t\t\t\t\t\t\t\t\t\t\tie_list->CapabilityInfo);\n\n\t\t\t\t\tos_free_mem(NULL, ielist);\n\t\t\t\t\tif ( result== FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ADHOC - Add Entry failed.\\n\"));\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->bUpdateInfoFromPeerBeacon = TRUE;\n#endif /* IWSC_SUPPORT */\n}\n#else\n\t\t\t\t\tif (StaAddMacTableEntry(pAd, \n\t\t\t\t\t\t\t\t\t\t\tpEntry, \n\t\t\t\t\t\t\t\t\t\t\tMaxSupportedRateIn500Kbps, \n\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability, \n\t\t\t\t\t\t\t\t\t\t\tie_list->HtCapabilityLen, \n\t\t\t\t\t\t\t\t\t\t\t&ie_list->AddHtInfo,\n\t\t\t\t\t\t\t\t\t\t\tie_list->AddHtInfoLen,\n\t\t\t\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t\t\t\tie_list->CapabilityInfo) == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ADHOC - Add Entry failed.\\n\"));\n\t\t\t\t\t\tgoto LabelOK;\n\t\t\t\t\t}\n#ifdef IWSC_SUPPORT\n\t\t\t\t\telse\n\t\t\t\t\t\tpEntry->bUpdateInfoFromPeerBeacon = TRUE;\n#endif /* IWSC_SUPPORT */\n#endif /* DOT11_VHT_AC */\n\n\t\t\t\t\tif (ADHOC_ON(pAd) && pEntry)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\t\t\t\t\tpEntry,\n\t\t\t\t\t\t\t\t\t\tie_list->SupRate,\n\t\t\t\t\t\t\t\t\t\tie_list->SupRateLen,\n\t\t\t\t\t\t\t\t\t\tie_list->ExtRate,\n\t\t\t\t\t\t\t\t\t\tie_list->ExtRateLen,\n#ifdef DOT11_VHT_AC\n\t\t\t\t\t\t\t\t\t\tie_list->vht_cap_len,\n\t\t\t\t\t\t\t\t\t\t&ie_list->vht_cap_ie,\n#endif /* DOT11_VHT_AC */\n\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability,\n\t\t\t\t\t\t\t\t\t\tie_list->HtCapabilityLen);\n\t\t\t\t\t}\n\n\t\t\t\t\tpEntry->LastBeaconRxTime = 0;\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n                    /* Adhoc support WPA2PSK by Eddy */\n                    if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) \n                        && (pEntry->WPA_Authenticator.WpaState < AS_INITPSK)\n#ifdef IWSC_SUPPORT\n\t\t\t\t\t\t&& ((pAd->StaCfg.WscControl.WscConfMode == WSC_DISABLE) ||\n\t\t\t\t\t\t\t(pAd->StaCfg.WscControl.bWscTrigger == FALSE) ||\n\t\t\t\t\t\t\t(NdisEqualMemory(pEntry->Addr, pAd->StaCfg.WscControl.WscPeerMAC, MAC_ADDR_LEN) == FALSE))\n#ifdef IWSC_TEST_SUPPORT\n\t\t\t\t\t\t&& (pAd->StaCfg.IWscInfo.bBlockConnection == FALSE)\n#endif /* IWSC_TEST_SUPPORT */\n#endif // IWSC_SUPPORT //\n\t\t\t\t\t\t)                      \n                    {\n        \t\t\t\tINT len, i;\n        \t\t\t\tPEID_STRUCT         pEid;\n                    \tNDIS_802_11_VARIABLE_IEs    *pVIE2 = NULL;\n\t\t\t\t\t\tBOOLEAN bHigherMAC = FALSE;\n\n                        pVIE2 = pVIE;\n        \t\t\t\tlen\t = LenVIE;\n        \t\t\t\twhile (len > 0)\n        \t\t\t\t{\n        \t\t\t\t\tpEid = (PEID_STRUCT) pVIE;\t\n                            if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)))\n        \t\t\t\t\t{\n        \t\t\t\t\t\tNdisMoveMemory(pEntry->RSN_IE, pVIE, (pEid->Len + 2));\n        \t\t\t\t\t\tpEntry->RSNIE_Len = (pEid->Len + 2);\t\n        \t\t\t\t\t}\n        \t\t\t\t\tpVIE2 += (pEid->Len + 2);\n        \t\t\t\t\tlen  -= (pEid->Len + 2);\n        \t\t\t\t}\n                \t\tpEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;\n                        NdisZeroMemory(&pEntry->WPA_Supplicant.ReplayCounter, LEN_KEY_DESC_REPLAY);                        \n                        NdisZeroMemory(&pEntry->WPA_Authenticator.ReplayCounter, LEN_KEY_DESC_REPLAY);                        \n                        pEntry->WPA_Authenticator.WpaState = AS_INITPSK;\n                        pEntry->WPA_Supplicant.WpaState = AS_INITPSK;\n                \t\tpEntry->EnqueueEapolStartTimerRunning = EAPOL_START_PSK;\n\n\t\t\t\t\t\tfor (i = 0; i < 6; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ie_list->Addr2[i] > pAd->CurrentAddress[i])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbHigherMAC = TRUE;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (ie_list->Addr2[i] < pAd->CurrentAddress[i])\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thex_dump(\"PeerBeacon:: Addr2\", ie_list->Addr2, MAC_ADDR_LEN);\n\t\t\t\t\t\thex_dump(\"PeerBeacon:: CurrentAddress\", pAd->CurrentAddress, MAC_ADDR_LEN);\n\t\t\t\t\t\tpEntry->bPeerHigherMAC = bHigherMAC;\n\t\t\t\t\t\tif (pEntry->bPeerHigherMAC == FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tMy MAC address is higher than peer's MAC address.\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ADHOC - EnqueueStartForPSKTimer.\\n\"));\n                \t\t\tRTMPSetTimer(&pEntry->EnqueueStartForPSKTimer, ENQUEUE_EAPOL_START_TIMER);                        \n                    \t}\n                    }\n\t\t\t\t\telse \n\t\t\t\t\t{\n                \t\tpEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n                    }\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n\n\t\t\t\t\tif (pEntry && (Elem->Wcid == RESERVED_WCID))\n\t\t\t\t\t{\n\t\t\t\t\t\tidx = pAd->StaCfg.DefaultKeyId;\n\t\t\t\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd, BSS0, idx, \n\t\t\t\t\t\t\t\t\t\t\t\t   pAd->SharedKey[BSS0][idx].CipherAlg,\n\t\t\t\t\t\t\t\t\t\t\t\t   pEntry->Aid,\n\t\t\t\t\t\t\t\t\t\t\t\t   SHAREDKEYTABLE);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (pEntry && IS_ENTRY_CLIENT(pEntry))\n\t\t\t\t{\n\t\t\t\t\tpEntry->LastBeaconRxTime = Now;\n#ifdef IWSC_SUPPORT\n\t\t\t\t\tif (pEntry->bUpdateInfoFromPeerBeacon == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (StaAddMacTableEntry(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\tpEntry, \n\t\t\t\t\t\t\t\t\t\t\t\tMaxSupportedRateIn500Kbps, \n\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability, \n\t\t\t\t\t\t\t\t\t\t\t\tie_list->HtCapabilityLen, \n\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->AddHtInfo,\n\t\t\t\t\t\t\t\t\t\t\t\tie_list->AddHtInfoLen,\n\t\t\t\t\t\t\t\t\t\t\t\tie_list,\n\t\t\t\t\t\t\t\t\t\t\t\tie_list->CapabilityInfo) == FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ADHOC 2 - Add Entry failed.\\n\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (ADHOC_ON(pAd) && pEntry)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\t\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\t\t\t\t\t\tpEntry,\n\t\t\t\t\t\t\t\t\t\t\tie_list->SupRate,\n\t\t\t\t\t\t\t\t\t\t\tie_list->SupRateLen,\n\t\t\t\t\t\t\t\t\t\t\tie_list->ExtRate,\n\t\t\t\t\t\t\t\t\t\t\tie_list->ExtRateLen,\n#ifdef DOT11_VHT_AC\n\t\t\t\t\t\t\t\t\t\t\tie_list->vht_cap_len,\n\t\t\t\t\t\t\t\t\t\t\t&ie_list->vht_cap_ie,\n#endif /* DOT11_VHT_AC */\n\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability,\n\t\t\t\t\t\t\t\t\t\t\tie_list->HtCapabilityLen);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpEntry->bUpdateInfoFromPeerBeacon = TRUE;\n\t\t\t\t\t}\n#endif /* IWSC_SUPPORT */\n\t\t\t\t}\n\n\t\t\t\t/* At least another peer in this IBSS, declare MediaState as CONNECTED */\n\t\t\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))\n\t\t\t\t{\n\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); \n\t\t\t\t\tRTMP_IndicateMediaState(pAd, NdisMediaStateConnected);\n\t                pAd->ExtraInfo = GENERAL_LINK_UP;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"ADHOC  fOP_STATUS_MEDIA_STATE_CONNECTED.\\n\"));\n\t\t\t\t}\t\n#ifdef IWSC_SUPPORT\n\t\t\t\tif (pAd->StaCfg.IWscInfo.bSendEapolStart &&\n\t\t\t\t\t(pAd->Mlme.IWscMachine.CurrState != IWSC_WAIT_PIN) &&\n\t\t\t\t\t(pAd->StaCfg.WscControl.WscConfMode == WSC_ENROLLEE))\n\t\t\t\t{\n\t\t\t\t\tpAd->StaCfg.IWscInfo.bSendEapolStart = FALSE;\n\t\t\t\t\tpWpsCtrl->WscState = WSC_STATE_LINK_UP;\n\t\t\t\t\tpWpsCtrl->WscStatus = STATUS_WSC_LINK_UP;\n\t\t\t\t\tNdisMoveMemory(pWpsCtrl->EntryAddr, pWpsCtrl->WscPeerMAC, MAC_ADDR_LEN);\n\t\t\t\t\tWscSendEapolStart(pAd, pWpsCtrl->WscPeerMAC, STA_MODE);\n\t\t\t\t}\n#endif // IWSC_SUPPORT \n\t\t\t}\n\n\t\t\tif (INFRA_ON(pAd))\n\t\t\t{\n\t\t\t\tBOOLEAN bUseShortSlot, bUseBGProtection;\n\n\t\t\t\t/*\n\t\t\t\t   decide to use/change to - \n\t\t\t\t      1. long slot (20 us) or short slot (9 us) time\n\t\t\t\t      2. turn on/off RTS/CTS and/or CTS-to-self protection\n\t\t\t\t      3. short preamble\n\t\t\t\t*/\n\n\t\t\t\t\t\n\t\t\t\t/* bUseShortSlot = pAd->CommonCfg.bUseShortSlotTime && CAP_IS_SHORT_SLOT(CapabilityInfo); */\n\t\t\t\tbUseShortSlot = CAP_IS_SHORT_SLOT(ie_list->CapabilityInfo);\n\t\t\t\tif (bUseShortSlot != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED))\n\t\t\t\t\tAsicSetSlotTime(pAd, bUseShortSlot);\n\n\t\t\t\tbUseBGProtection = (pAd->CommonCfg.UseBGProtection == 1) ||    /* always use */\n\t\t\t\t\t\t\t\t   ((pAd->CommonCfg.UseBGProtection == 0) && ERP_IS_USE_PROTECTION(ie_list->Erp));\n\n\t\t\t\tif (pAd->CommonCfg.Channel > 14)  /* always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP */\n\t\t\t\t\tbUseBGProtection = FALSE;\n\n\t\t\t\tif (bUseBGProtection != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))\n\t\t\t\t{\n\t\t\t\t\tif (bUseBGProtection)\n\t\t\t\t\t{\n\t\t\t\t\t\tOPSTATUS_SET_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n\t\t\t\t\t\tAsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode,\n\t\t\t\t\t\t\t\t\t\t\t(OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),\n\t\t\t\t\t\t\t\t\t\t\tFALSE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);\n\t\t\t\t\t\tAsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode,\n\t\t\t\t\t\t\t\t\t\t\t(OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),TRUE,\n\t\t\t\t\t\t\t\t\t\t\t(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"SYNC - AP changed B/G protection to %d\\n\", bUseBGProtection));\n\t\t\t\t}\n\t\t\t\t\n#ifdef DOT11_N_SUPPORT\n\t\t\t\t/* check Ht protection mode. and adhere to the Non-GF device indication by AP. */\n\t\t\t\tif ((ie_list->AddHtInfoLen != 0) && \n\t\t\t\t\t((ie_list->AddHtInfo.AddHtInfo2.OperaionMode != pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode) ||\n\t\t\t\t\t(ie_list->AddHtInfo.AddHtInfo2.NonGfPresent != pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent)))\n\t\t\t\t{\n\t\t\t\t\tpAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent = ie_list->AddHtInfo.AddHtInfo2.NonGfPresent;\n\t\t\t\t\tpAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode = ie_list->AddHtInfo.AddHtInfo2.OperaionMode;\n\t\t\t\t\tif (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)\n\t\t\t\t{\n\t\t\t\t\t\tAsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tAsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE);\n\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - AP changed N OperaionMode to %d\\n\", pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode));\n\t\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\t\t\t\t\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) && \n\t\t\t\t\tERP_IS_USE_BARKER_PREAMBLE(ie_list->Erp))\n\t\t\t\t{\n\t\t\t\t\tMlmeSetTxPreamble(pAd, Rt802_11PreambleLong);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - AP forced to use LONG preamble\\n\"));\n\t\t\t\t}\n\n\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)    &&\n\t\t\t\t\t(ie_list->EdcaParm.bValid == TRUE)                          &&\n\t\t\t\t\t(ie_list->EdcaParm.EdcaUpdateCount != pAd->CommonCfg.APEdcaParm.EdcaUpdateCount))\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - AP change EDCA parameters(from %d to %d)\\n\", \n\t\t\t\t\t\tpAd->CommonCfg.APEdcaParm.EdcaUpdateCount,\n\t\t\t\t\t\tie_list->EdcaParm.EdcaUpdateCount));\n\t\t\t\t\tAsicSetEdcaParm(pAd, &ie_list->EdcaParm);\n\t\t\t\t}\n\n\t\t\t\t/* copy QOS related information */\n\t\t\t\tNdisMoveMemory(&pAd->CommonCfg.APQbssLoad, &ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM));\n\t\t\t\tNdisMoveMemory(&pAd->CommonCfg.APQosCapability, &ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM));\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\n\t\t\t\t/* \n\t\t\t\t   2009: PF#1: 20/40 Coexistence in 2.4 GHz Band\n\t\t\t\t   When AP changes \"STA Channel Width\" and \"Secondary Channel Offset\" fields of HT Operation Element in the Beacon to 0\n\t\t\t\t*/\n\t\t\t\tif ((ie_list->AddHtInfoLen != 0) && INFRA_ON(pAd) && pAd->CommonCfg.Channel <= 14)\n\t\t\t\t{\n\t\t\t\t\tBOOLEAN bChangeBW = FALSE;\n#ifdef P2P_SUPPORT\n\t\t\t\t\tPAPCLI_STRUCT pApCliEntry = NULL;\n\t\t\t\t\t\n\t\t\t\t\tpApCliEntry = &pAd->ApCfg.ApCliTab[BSS0];\n#endif /* P2P_SUPPORT */\n\n\t\t\t\t\t/*\n\t\t\t\t\t     1) HT Information\n\t\t\t\t\t     2) Secondary Channel Offset Element\n\t\t\t\t\t\n\t\t\t\t\t     40 -> 20 case\n\t\t\t\t\t*/\n\t\t\t\t\tif (pAd->CommonCfg.BBPCurrentBW == BW_40)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (((ie_list->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_NONE) &&\n\t\t\t\t\t\t\t(ie_list->AddHtInfo.AddHtInfo.RecomWidth == 0)) \n\t\t\t\t\t\t\t||(ie_list->NewExtChannelOffset==0x0)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpAd->StaActive.SupportedHtPhy.ChannelWidth = BW_20;\n\t\t\t\t\t\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW = 0;\n\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tif (!P2P_GO_ON(pAd) && (pApCliEntry->Valid == FALSE))\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbChangeBW = TRUE;\n\t\t\t\t\t\t\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"FallBack from 40MHz to 20MHz(CtrlCh=%d, CentralCh=%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n\t\t\t\t\t\t\t\tCntlChannelWidth(pAd, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel, BW_20, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*\n\t\t\t\t\t    20 -> 40 case\n\t\t\t\t\t    1.) Supported Channel Width Set Field of the HT Capabilities element of both STAs is set to a non-zero\n\t\t\t\t\t    2.) Secondary Channel Offset field is SCA or SCB\n\t\t\t\t\t    3.) 40MHzRegulatoryClass is TRUE (not implement it)\n\t\t\t\t\t*/\n\t\t\t\t\telse if (((pAd->CommonCfg.BBPCurrentBW == BW_20) ||(ie_list->NewExtChannelOffset!=0x0)) &&\n\t\t\t\t\t\t\t(pAd->CommonCfg.DesiredHtPhy.ChannelWidth != BW_20)\n\t\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((ie_list->AddHtInfo.AddHtInfo.ExtChanOffset != EXTCHA_NONE) &&\n\t\t\t\t\t\t\t(ie_list->AddHtInfo.AddHtInfo.RecomWidth == 1) &&\n\t\t\t\t\t\t\t(ie_list->HtCapabilityLen>0) && (ie_list->HtCapability.HtCapInfo.ChannelWidth == 1)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tif (!P2P_GO_ON(pAd) && (pApCliEntry->Valid == FALSE))\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpAd->CommonCfg.CentralChannel = get_cent_ch_by_htinfo(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->AddHtInfo,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&ie_list->HtCapability);\n\t\t\t\t\t\t\t\tif (pAd->CommonCfg.CentralChannel != ie_list->AddHtInfo.ControlChan)\n\t\t\t\t\t\t\t\t\tbChangeBW = TRUE;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (bChangeBW)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.Channel = ie_list->AddHtInfo.ControlChan;\n\t\t\t\t\t\t\t\t\t\tpAd->StaActive.SupportedHtPhy.ChannelWidth = BW_40;\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"FallBack from 20MHz to 40MHz(CtrlCh=%d, CentralCh=%d)\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n\t\t\t\t\t\t\t\t\tCntlChannelWidth(pAd, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel, BW_40, ie_list->AddHtInfo.AddHtInfo.ExtChanOffset);\n\t\t\t\t\t\t\t\t\tpAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW = 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bChangeBW)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->CommonCfg.BSSCoexist2040.word = 0;\n\t\t\t\t\t\tTriEventInit(pAd);\n\t\t\t\t\t\tBuildEffectedChannelList(pAd);\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\t\t\t}\n\n\t\t\t/* only INFRASTRUCTURE mode support power-saving feature */\n\t\t\tif ((INFRA_ON(pAd) && (RtmpPktPmBitCheck(pAd) == TRUE)) || (pAd->CommonCfg.bAPSDForcePowerSave))\n\t\t\t{\n\t\t\t\tUCHAR FreeNumber;\n\t\t\t\t/*\n\t\t\t\t     1. AP has backlogged unicast-to-me frame, stay AWAKE, send PSPOLL\n\t\t\t\t     2. AP has backlogged broadcast/multicast frame and we want those frames, stay AWAKE\n\t\t\t\t     3. we have outgoing frames in TxRing or MgmtRing, better stay AWAKE\n\t\t\t\t     4. Psm change to PWR_SAVE, but AP not been informed yet, we better stay AWAKE\n\t\t\t\t     5. otherwise, put PHY back to sleep to save battery.\n\t\t\t\t*/\n\t\t\t\tif (ie_list->MessageToMe)\n\t\t\t\t{\n#ifdef PCIE_PS_SUPPORT\n\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Restore to correct BBP R3 value */\n\t\t\t\t\t\tif (pAd->Antenna.field.RxPath > 1)\n\t\t\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);\n\t\t\t\t\t\t/* Turn clk to 80Mhz. */\n\t\t\t\t\t}\n#endif /* PCIE_PS_SUPPORT */\n#ifdef UAPSD_SUPPORT\n\t\t\t\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable &&\n\t\t\t\t\t\tpAd->CommonCfg.APEdcaParm.bAPSDCapable &&\n\t\t\t\t\t\tpAd->CommonCfg.bAPSDAC_BE &&\n\t\t\t\t\t\tpAd->CommonCfg.bAPSDAC_BK &&\n\t\t\t\t\t\tpAd->CommonCfg.bAPSDAC_VI &&\n\t\t\t\t\t\tpAd->CommonCfg.bAPSDAC_VO)\n\t\t\t\t\t{\n\t\t\t\t\t\tpAd->CommonCfg.bNeedSendTriggerFrame = TRUE;\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t  \t\t\t\t\t\tpAd->CommonCfg.TxRate, \n\t\t\t\t  \t\t\t\t\t\tTRUE,\n\t\t\t\t  \t\t\t\t\t\tpAd->CommonCfg.bAPSDForcePowerSave ? PWR_SAVE : pAd->StaCfg.Psm);\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif /* UAPSD_SUPPORT */\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->StaCfg.WindowsBatteryPowerMode == Ndis802_11PowerModeFast_PSP)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* wake up and send a NULL frame with PM = 0 to the AP */\n\t\t\t\t\t\t\tRTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);\n\t\t\t\t\t\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t\t\t\t\t\t  PWR_ACTIVE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* use PS-Poll to get any buffered packet */\n\t\t\t\t\t\t\tRTMP_PS_POLL_ENQUEUE(pAd);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ie_list->BcastFlag && (ie_list->DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM))\n\t\t\t\t{\n#ifdef PCIE_PS_SUPPORT\n\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->Antenna.field.RxPath > 1)\n\t\t\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);\n\t\t\t\t\t}\n#endif /* PCIE_PS_SUPPORT */\n\t\t\t\t} \n\t\t\t\telse if ((pAd->TxSwQueue[QID_AC_BK].Number != 0)\t\t\t\t\t\t\t\t\t\t\t\t\t||\n\t\t\t\t\t\t(pAd->TxSwQueue[QID_AC_BE].Number != 0)\t\t\t\t\t\t\t\t\t\t\t\t\t\t||\n\t\t\t\t\t\t(pAd->TxSwQueue[QID_AC_VI].Number != 0)\t\t\t\t\t\t\t\t\t\t\t\t\t\t||\n\t\t\t\t\t\t(pAd->TxSwQueue[QID_AC_VO].Number != 0)\t\t\t\t\t\t\t\t\t\t\t\t\t\t||\n\t\t\t\t\t\t(RTMPFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)\t||\n\t\t\t\t\t\t(RTMPFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)\t||\n\t\t\t\t\t\t(RTMPFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)\t||\n\t\t\t\t\t\t(RTMPFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)\t||\n\t\t\t\t\t\t(RTMPFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)) \n\t\t\t\t{\n\t\t\t\t\t/* TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme */\n\t\t\t\t\t/* can we cheat here (i.e. just check MGMT & AC_BE) for better performance? */\n#ifdef PCIE_PS_SUPPORT\n\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pAd->Antenna.field.RxPath > 1)\n\t\t\t\t\t\t\tRTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);\n\t\t\t\t\t}\n#endif /* PCIE_PS_SUPPORT */\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tif ((pAd->CommonCfg.bACMAPSDTr[QID_AC_VO]) ||\n\t\t\t\t\t\t(pAd->CommonCfg.bACMAPSDTr[QID_AC_VI]) ||\n\t\t\t\t\t\t(pAd->CommonCfg.bACMAPSDTr[QID_AC_BK]) ||\n\t\t\t\t\t\t(pAd->CommonCfg.bACMAPSDTr[QID_AC_BE])\n#ifdef DOT11Z_TDLS_SUPPORT\n\t\t\t\t\t\t|| (pAd->StaCfg.FlgPsmCanNotSleep == TRUE)||\n\t\t\t\t\t\t(RtmpPktPmBitCheck(pAd) == FALSE)\n#endif /* DOT11Z_TDLS_SUPPORT */\n\t\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tUSHORT NextDtim = ie_list->DtimCount;\n\n\t\t\t\t\t\tif (NextDtim == 0) \n\t\t\t\t\t\t\tNextDtim = ie_list->DtimPeriod;\n\n\t\t\t\t\t\tTbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount;\n\t\t\t\t\t\tif (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim))\n\t\t\t\t\t\t\tTbttNumToNextWakeUp = NextDtim;\n\n\t\t\t\t\t\tif (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode. */\n\t\t\t\t\t\t\tpAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp;\n\t\t                                        AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/* not my BSSID, ignore it */\n\t}\n\t/* sanity check fail, ignore this frame */\n\tgoto LabelOK;\n\nLabelErr:\n\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: Allocate memory fail!!!\\n\", __FUNCTION__));\n\nLabelOK:\n\tif (VarIE != NULL)\n\t\tos_free_mem(NULL, VarIE);\n\tif (ie_list != NULL)\n\t\tos_free_mem(NULL, ie_list);\n\n\treturn;\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tReceive PROBE REQ from remote peer when operating in IBSS mode\n\t==========================================================================\n */\nVOID PeerProbeReqAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUCHAR         Addr2[MAC_ADDR_LEN];\n\tCHAR          Ssid[MAX_LEN_OF_SSID];\n\tUCHAR         SsidLen;\n#ifdef DOT11_N_SUPPORT\n\tUCHAR\t\t  HtLen, AddHtLen, NewExtLen;\n#endif /* DOT11_N_SUPPORT */\n\tHEADER_802_11 ProbeRspHdr;\n\tNDIS_STATUS   NStatus;\n\tPUCHAR        pOutBuffer = NULL;\n\tULONG         FrameLen = 0;\n\tLARGE_INTEGER FakeTimestamp;\n\tUCHAR         DsLen = 1, IbssLen = 2;\n\tUCHAR         LocalErpIe[3] = {IE_ERP, 1, 0};\n\tBOOLEAN       Privacy;\n\tUSHORT        CapabilityInfo;\n\n#ifdef P2P_SUPPORT\n\t/* P2P device and Listen State could response Probe Req. */\n/*\tif ((pAd->P2pCfg.DiscCurrentState == P2P_DISC_LISTEN) && !(P2P_CLI_ON(pAd)))*/\n\tif(P2P_INF_ON(pAd))\n\t\tMlmeEnqueue(pAd, P2P_DISC_STATE_MACHINE, P2P_DISC_PEER_PROB_REQ, Elem->MsgLen, Elem->Msg, Elem->Channel);\n#endif /* P2P_SUPPORT */\n\n\tif (! ADHOC_ON(pAd))\n\t\treturn;\n\n\tif (PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen, NULL))\n\t{\n\t\tif ((SsidLen == 0) || SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen))\n\t\t{\t\t\t\n\t\t\t/* allocate and send out ProbeRsp frame */\n\t\t\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\t\t\tif (NStatus != NDIS_STATUS_SUCCESS)\n\t\t\t\treturn;\n\n\t\t\tMgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\t\tpAd->CommonCfg.Bssid);\n\n\t\t\tPrivacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || \n\t\t\t\t\t  (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || \n\t\t\t\t\t  (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);\n\t\t\tCapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 0, 0);\n\n\t\t\tMakeOutgoingFrame(pOutBuffer,                   &FrameLen, \n\t\t\t\t\t\t\t  sizeof(HEADER_802_11),        &ProbeRspHdr, \n\t\t\t\t\t\t\t  TIMESTAMP_LEN,                &FakeTimestamp,\n\t\t\t\t\t\t\t  2,                            &pAd->CommonCfg.BeaconPeriod,\n\t\t\t\t\t\t\t  2,                            &CapabilityInfo,\n\t\t\t\t\t\t\t  1,                            &SsidIe, \n\t\t\t\t\t\t\t  1,                            &pAd->CommonCfg.SsidLen, \n\t\t\t\t\t\t\t  pAd->CommonCfg.SsidLen,       pAd->CommonCfg.Ssid,\n\t\t\t\t\t\t\t  1,                            &SupRateIe, \n\t\t\t\t\t\t\t  1,                            &pAd->StaActive.SupRateLen,\n\t\t\t\t\t\t\t  pAd->StaActive.SupRateLen,    pAd->StaActive.SupRate, \n\t\t\t\t\t\t\t  1,                            &DsIe, \n\t\t\t\t\t\t\t  1,                            &DsLen, \n\t\t\t\t\t\t\t  1,                            &pAd->CommonCfg.Channel,\n\t\t\t\t\t\t\t  1,                            &IbssIe, \n\t\t\t\t\t\t\t  1,                            &IbssLen, \n\t\t\t\t\t\t\t  2,                            &pAd->StaActive.AtimWin,\n\t\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t\tif (pAd->StaActive.ExtRateLen)\n\t\t\t{\n\t\t\t\tULONG tmp;\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        &tmp, \n\t\t\t\t\t\t\t\t  3,                            LocalErpIe,\n\t\t\t\t\t\t\t\t  1,                            &ExtRateIe,\n\t\t\t\t\t\t\t\t  1,                            &pAd->StaActive.ExtRateLen,\n\t\t\t\t\t\t\t\t  pAd->StaActive.ExtRateLen,    &pAd->StaActive.ExtRate,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += tmp;\n\t\t\t}\n\n        \t/* Modify by Eddy, support WPA2PSK in Adhoc mode */\n        \tif ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)\n#ifdef ADHOC_WPA2PSK_SUPPORT\n                || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n                )\n        \t{\n        \t\tULONG   tmp;\n       \t        UCHAR   RSNIe = IE_WPA;\n\n#ifdef ADHOC_WPA2PSK_SUPPORT\n                RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);\n            \tif (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n                    RSNIe = IE_RSN;\n#endif /* ADHOC_WPA2PSK_SUPPORT */\n                \n        \t\tMakeOutgoingFrame(pOutBuffer + FrameLen,        \t&tmp,\n        \t\t\t\t\t\t  1,                              \t&RSNIe,\n        \t\t\t\t\t\t  1,                            \t&pAd->StaCfg.RSNIE_Len,\n        \t\t\t\t\t\t  pAd->StaCfg.RSNIE_Len,      \t\tpAd->StaCfg.RSN_IE,\n        \t\t\t\t\t\t  END_OF_ARGS);\n        \t\tFrameLen += tmp;\t\n        \t}\n\n#ifdef DOT11_N_SUPPORT\n\t\t\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t\t\t{\n\t\t\t\tULONG TmpLen;\n\t\t\t\tUSHORT  epigram_ie_len;\n\t\t\t\tUCHAR\tBROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};\n\t\t\t\tHtLen = sizeof(pAd->CommonCfg.HtCapability);\n\t\t\t\tAddHtLen = sizeof(pAd->CommonCfg.AddHTInfo);\n\t\t\t\tNewExtLen = 1;\n\t\t\t\t/* New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame */\n\t\t\t\tif (pAd->bBroadComHT == TRUE)\n\t\t\t\t{\n\t\t\t\t\tepigram_ie_len = pAd->MlmeAux.HtCapabilityLen + 4;\n\t\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,\n\t\t\t\t\t\t\t\t  1,                                &WpaIe,\n\t\t\t\t\t\t\t\t  1,          \t\t\t\t\t\t&epigram_ie_len,\n\t\t\t\t\t\t\t\t  4,                                &BROADCOM[0],\n\t\t\t\t\t\t\t\t pAd->MlmeAux.HtCapabilityLen,          &pAd->MlmeAux.HtCapability, \n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\t}\n\t\t\t\telse\t\t\t\t\n\t\t\t\t{\n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,            &TmpLen,\n\t\t\t\t\t\t\t\t  1,                                &HtCapIe,\n\t\t\t\t\t\t\t\t  1,                                &HtLen,\n\t\t\t\t\t\t\t\t sizeof(HT_CAPABILITY_IE),          &pAd->CommonCfg.HtCapability, \n\t\t\t\t\t\t\t\t  1,                                &AddHtInfoIe,\n\t\t\t\t\t\t\t\t  1,                                &AddHtLen,\n\t\t\t\t\t\t\t\t sizeof(ADD_HT_INFO_IE),          &pAd->CommonCfg.AddHTInfo, \n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\t}\n\t\t\t\tFrameLen += TmpLen;\n\t\t\t}\n#endif /* DOT11_N_SUPPORT */\n\n#ifdef WSC_STA_SUPPORT\n\t\t    /* add Simple Config Information Element */\n\t\t    if (pAd->StaCfg.WpsIEProbeResp.ValueLen != 0)\n\t\t    {\n\t\t\t\tULONG WscTmpLen = 0;\n\t\t        \n\t\t\t\tMakeOutgoingFrame(pOutBuffer + FrameLen,\t\t\t\t\t&WscTmpLen,\n\t\t\t\t\t\t\t\t  pAd->StaCfg.WpsIEProbeResp.ValueLen,\t\tpAd->StaCfg.WpsIEProbeResp.Value,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tFrameLen += WscTmpLen;\n\t\t    }\n#endif /* WSC_STA_SUPPORT */\n\n\n\t\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\t}\n\t}\n}\n\nVOID BeaconTimeoutAtJoinAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"SYNC - BeaconTimeoutAtJoinAction\\n\"));\n\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\tStatus = MLME_REJ_TIMEOUT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status, 0);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t\tScan timeout procedure. basically add channel index by 1 and rescan\n\t==========================================================================\n */\nVOID ScanTimeoutAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\n#ifdef RTMP_MAC_USB\n\t/*\n\t    To prevent data lost.\n\t    Send an NULL data with turned PSM bit on to current associated AP when SCAN in the channel where\n\t    associated AP located.\n\t*/\n\tif ((pAd->CommonCfg.Channel == pAd->MlmeAux.Channel) && \n\t\t(pAd->MlmeAux.ScanType == SCAN_ACTIVE) && \n\t\t(INFRA_ON(pAd)) && \n\t\tOPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)\n\t)\n\t{\n\t\tRTMPSendNullFrame(pAd, \n\t\t\t\t\t\t  pAd->CommonCfg.TxRate, \n\t\t\t\t\t\t  (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) ? TRUE:FALSE),\n\t\t\t\t\t\t  PWR_SAVE);\n\t}\n#endif /* RTMP_MAC_USB */\n\n\tif (pAd->StaCfg.bFastConnect && !pAd->StaCfg.bNotFirstScan)\n\t{\n\t\tpAd->MlmeAux.Channel = 0;\n\t\tpAd->StaCfg.bNotFirstScan = TRUE;\n\t}\n\telse\n\t{\n\t\tpAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel);\n\t}\n\n\t/* Only one channel scanned for CISCO beacon request */\n\tif ((pAd->MlmeAux.ScanType == SCAN_CISCO_ACTIVE) || \n\t\t(pAd->MlmeAux.ScanType == SCAN_CISCO_PASSIVE) ||\n\t\t(pAd->MlmeAux.ScanType == SCAN_CISCO_NOISE) ||\n\t\t(pAd->MlmeAux.ScanType == SCAN_CISCO_CHANNEL_LOAD))\n\t\tpAd->MlmeAux.Channel = 0;\n\n\t/* this routine will stop if pAd->MlmeAux.Channel == 0 */\n\tScanNextChannel(pAd, OPMODE_STA); \n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nVOID InvalidStateWhenScan(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT Status;\n#ifdef P2P_SUPPORT\n\tUCHAR          Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType;\n#endif /* P2P_SUPPORT */\n\n\tif (Elem->MsgType != MT2_MLME_SCAN_REQ)\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AYNC - InvalidStateWhenScan(state=%ld). Reset SYNC machine\\n\", pAd->Mlme.SyncMachine.CurrState));\n\telse\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"AYNC - Already in scanning, do nothing here.(state=%ld). \\n\", pAd->Mlme.SyncMachine.CurrState));\n\t\n#ifdef P2P_SUPPORT\n\tif (MlmeScanReqSanity(pAd, \n\t\t\t\t\t\t  Elem->Msg, \n\t\t\t\t\t\t  Elem->MsgLen, \n\t\t\t\t\t\t  &BssType, \n\t\t\t\t\t\t  (PCHAR)Ssid, \n\t\t\t\t\t\t  &SsidLen, \n\t\t\t\t\t\t  &ScanType))\n\t{\n\t\t/* reset Device Discovery State Machine. */\n\t\tMlmeEnqueue(pAd, P2P_CTRL_STATE_MACHINE, P2P_CTRL_DISC_CANL_EVT, 0, NULL, 0);\n\t\tP2PSetNextScanTimer(pAd, 10);\n\t\treturn;\n\t}\n#endif /* P2P_SUPPORT */\n\tif (Elem->MsgType != MT2_MLME_SCAN_REQ)\n\t{\n\t\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\t\tStatus = MLME_STATE_MACHINE_REJECT;\n\t\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0);\n\t}\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nVOID InvalidStateWhenJoin(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"InvalidStateWhenJoin(state=%ld, msg=%ld). Reset SYNC machine\\n\", \n\t\t\t\t\t\t\t\tpAd->Mlme.SyncMachine.CurrState,\n\t\t\t\t\t\t\t\tElem->MsgType));\n\tif (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))\n\t{\n\t\tRTMPResumeMsduTransmission(pAd);\n\t}\n\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\tStatus = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status, 0);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nVOID InvalidStateWhenStart(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem) \n{\n\tUSHORT Status;\n\tDBGPRINT(RT_DEBUG_TRACE, (\"InvalidStateWhenStart(state=%ld). Reset SYNC machine\\n\", pAd->Mlme.SyncMachine.CurrState));\n\tpAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;\n\tStatus = MLME_STATE_MACHINE_REJECT;\n\tMlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status, 0);\n}\n\n/* \n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n */\nVOID EnqueuePsPoll(\n\tIN PRTMP_ADAPTER pAd) \n{\n#ifdef RALINK_ATE\n    if (ATE_ON(pAd))\n    {\n\t\treturn;\n    }\n#endif /* RALINK_ATE */\n\n\t\n\tif (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP)\n    \tpAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE;\n\tMiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));\n#ifdef RTMP_MAC_USB\n\t/* Keep Waking up */\n\tif (pAd->CountDowntoPsm == 0)\n\t\tpAd->CountDowntoPsm = 2;\t/* 100 ms; stay awake 200ms at most, average will be 1xx ms */\n#endif /* RTMP_MAC_USB */\n\n}\n\n\n/* \n\t==========================================================================\n\tDescription:\n\t==========================================================================\n */\nVOID EnqueueProbeRequest(\n\tIN PRTMP_ADAPTER pAd) \n{\n\tNDIS_STATUS     NState;\n\tPUCHAR          pOutBuffer;\n\tULONG           FrameLen = 0;\n\tHEADER_802_11   Hdr80211;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"force out a ProbeRequest ...\\n\"));\n\n\tNState = MlmeAllocateMemory(pAd, &pOutBuffer);  /* Get an unused nonpaged memory */\n\tif (NState == NDIS_STATUS_SUCCESS) \n\t{\n\t\tMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR,\n#ifdef P2P_SUPPORT\n\t\t\t\t\t\t\tpAd->CurrentAddress,\n#endif /* P2P_SUPPORT */\n\t\t\t\t\t\t\tBROADCAST_ADDR);\n\n\t\t/* this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse */\n\t\tMakeOutgoingFrame(pOutBuffer,                     &FrameLen,\n\t\t\t\t\t\t  sizeof(HEADER_802_11),          &Hdr80211,\n\t\t\t\t\t\t  1,                              &SsidIe,\n\t\t\t\t\t\t  1,                              &pAd->CommonCfg.SsidLen,\n\t\t\t\t\t\t  pAd->CommonCfg.SsidLen,\t\t  pAd->CommonCfg.Ssid,\n\t\t\t\t\t\t  1,                              &SupRateIe,\n\t\t\t\t\t\t  1,                              &pAd->StaActive.SupRateLen,\n\t\t\t\t\t\t  pAd->StaActive.SupRateLen,      pAd->StaActive.SupRate, \n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tMiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t}\n\n}\n\n\n#ifdef DOT11_N_SUPPORT\n#ifdef DOT11N_DRAFT3\nVOID BuildEffectedChannelList(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR\t\tEChannel[11];\n\tUCHAR\t\ti, j, k;\n\tUCHAR\t\tUpperChannel = 0, LowerChannel = 0;\n\t\n\tRTMPZeroMemory(EChannel, 11);\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildEffectedChannelList:CtrlCh=%d,CentCh=%d,AuxCtrlCh=%d,AuxExtCh=%d\\n\", \n\t\t\t\t\t\t\t\tpAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel, \n\t\t\t\t\t\t\t\tpAd->MlmeAux.AddHtInfo.ControlChan, \n\t\t\t\t\t\t\t\tpAd->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset));\n\n\t/* 802.11n D4 11.14.3.3: If no secondary channel has been selected, all channels in the frequency band shall be scanned. */\n\t{\n\t\tfor (k = 0;k < pAd->ChannelListNum;k++)\n\t\t{\n\t\t\tif (pAd->ChannelList[k].Channel <=14 )\n\t\t\tpAd->ChannelList[k].bEffectedChannel = TRUE;\n\t\t}\n\t\treturn;\n\t}\t\n\t\n\ti = 0;\n\t/* Find upper and lower channel according to 40MHz current operation. */\n\tif (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t{\n\t\tUpperChannel = pAd->CommonCfg.Channel;\n\t\tLowerChannel = pAd->CommonCfg.CentralChannel-2;\n\t}\n\telse if (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t{\n\t\tUpperChannel = pAd->CommonCfg.CentralChannel+2;\n\t\tLowerChannel = pAd->CommonCfg.Channel;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"LinkUP 20MHz . No Effected Channel \\n\"));\n\t\t/* Now operating in 20MHz, doesn't find 40MHz effected channels */\n\t\treturn;\n\t}\n\n\tDeleteEffectedChannelList(pAd);\t\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"BuildEffectedChannelList!LowerChannel ~ UpperChannel; %d ~ %d \\n\", LowerChannel, UpperChannel));\n\n\t/* Find all channels that are below lower channel.. */\n\tif (LowerChannel > 1)\n\t{\n\t\tEChannel[0] = LowerChannel - 1;\n\t\ti = 1;\n\t\tif (LowerChannel > 2)\n\t\t{\n\t\t\tEChannel[1] = LowerChannel - 2;\n\t\t\ti = 2;\n\t\t\tif (LowerChannel > 3)\n\t\t\t{\n\t\t\t\tEChannel[2] = LowerChannel - 3;\n\t\t\t\ti = 3;\n\t\t\t}\n\t\t}\n\t}\n\t/* Find all channels that are between  lower channel and upper channel. */\n\tfor (k = LowerChannel;k <= UpperChannel;k++)\n\t{\n\t\tEChannel[i] = k;\n\t\ti++;\n\t}\n\t/* Find all channels that are above upper channel.. */\n\tif (UpperChannel < 14)\n\t{\n\t\tEChannel[i] = UpperChannel + 1;\n\t\ti++;\n\t\tif (UpperChannel < 13)\n\t\t{\n\t\t\tEChannel[i] = UpperChannel + 2;\n\t\t\ti++;\n\t\t\tif (UpperChannel < 12)\n\t\t\t{\n\t\t\t\tEChannel[i] = UpperChannel + 3;\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\t/* \n\t    Total i channels are effected channels. \n\t    Now find corresponding channel in ChannelList array.  Then set its bEffectedChannel= TRUE\n\t*/\n\tfor (j = 0;j < i;j++)\n\t{\n\t\tfor (k = 0;k < pAd->ChannelListNum;k++)\n\t\t{\n\t\t\tif (pAd->ChannelList[k].Channel == EChannel[j])\n\t\t\t{\n\t\t\t\tpAd->ChannelList[k].bEffectedChannel = TRUE;\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\" EffectedChannel[%d]( =%d)\\n\", k, EChannel[j]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nVOID DeleteEffectedChannelList(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR\t\ti;\n\t/*Clear all bEffectedChannel in ChannelList array. */\n \tfor (i = 0; i < pAd->ChannelListNum; i++)\t\t\n\t{\n\t\tpAd->ChannelList[i].bEffectedChannel = FALSE;\n\t}\t\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tControl Primary&Central Channel, ChannelWidth and Second Channel Offset\n\n\tArguments:\n\t\tpAd\t\t\t\t\t\tPointer to our adapter\n\t\tPrimaryChannel\t\t\tPrimary Channel\n\t\tCentralChannel\t\t\tCentral Channel\n\t\tChannelWidth\t\t\t\tBW_20 or BW_40\n\t\tSecondaryChannelOffset\tEXTCHA_NONE, EXTCHA_ABOVE and EXTCHA_BELOW\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tNote:\n\t\t\n\t========================================================================\n*/\nVOID CntlChannelWidth(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR prim_ch,\n\tIN UCHAR cent_ch,\t\n\tIN UCHAR ch_bw,\n\tIN UCHAR sec_ch_offset) \n{\n\tUCHAR rf_channel = 0, rf_bw;\n\tINT32 ext_ch;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: PrimaryChannel[%d] \\n\",__FUNCTION__,prim_ch));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: CentralChannel[%d] \\n\",__FUNCTION__,cent_ch));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: ChannelWidth[%d] \\n\",__FUNCTION__,ch_bw));\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s: SecondaryChannelOffset[%d] \\n\",__FUNCTION__,sec_ch_offset));\n\n#ifdef DOT11_N_SUPPORT\n\t/*Change to AP channel */\n\tif (ch_bw == BW_40)\n\t{\n\t\tif(sec_ch_offset == EXTCHA_ABOVE)\n\t\t{\t\n\t\t\trf_bw = BW_40;\n\t\t\text_ch = EXTCHA_ABOVE;\n\t\t\trf_channel = cent_ch;\n\t\t}\n\t\telse if (sec_ch_offset == EXTCHA_BELOW)\n\t\t{\t\n\t\t\trf_bw = BW_40;\n\t\t\text_ch = EXTCHA_BELOW;\n\t\t\trf_channel = cent_ch;\n\t\t}\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t\trf_channel = prim_ch;\n\t}\n\n\tif (rf_channel != 0) {\n\t\trtmp_bbp_set_bw(pAd, rf_bw);\n\n\t\t/* Tx/ RX : control channel setting */\n\t\trtmp_bbp_set_ctrlch(pAd, ext_ch);\n\t\trtmp_mac_set_ctrlch(pAd, ext_ch);\n\n\t\tAsicSwitchChannel(pAd, rf_channel, FALSE);\n\t\tAsicLockChannel(pAd, rf_channel);\n\n#ifdef RT28xx\n\t\tRT28xx_ch_tunning(pAd, rf_bw);\n#endif /* RT28xx */\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"!!!40MHz Lower !!! Control Channel at Below. Central = %d \\n\", pAd->CommonCfg.CentralChannel ));\n\n\t\trtmp_bbp_get_agc(pAd, &pAd->BbpTuning.R66CurrentValue, RX_CHAIN_0);\n\t}\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n/*\n    ==========================================================================\n    Description:\n        MLME Cancel the SCAN req state machine procedure\n    ==========================================================================\n */\nVOID ScanCnclAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tBOOLEAN Cancelled;\n\n\tRTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);\n\tpAd->MlmeAux.Channel = 0;\n\tScanNextChannel(pAd, OPMODE_STA);\n\n\treturn;\n}\n\n"
  },
  {
    "path": "src/sta/tdls.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    tdls.h\n \n    Abstract:\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 802.11z\n */\n\n #ifdef DOT11Z_TDLS_SUPPORT\n#include \"rt_config.h\"\n#include \"dot11z_tdls.h\"\n\nUCHAR\tTDLS_LLC_SNAP_WITH_CATEGORY[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x89, 0x0d, PROTO_NAME_TDLS, CATEGORY_TDLS};\n#ifdef WFD_SUPPORT\nUCHAR\tTDLS_LLC_SNAP_WITH_WFD_CATEGORY[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x89, 0x0d, PROTO_NAME_TDLS, CATEGORY_VENDOR_SPECIFIC_WFD};\nextern UCHAR\tWIFIDISPLAY_OUI[];\n#endif /* WFD_SUPPORT */\nUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\ntypedef struct\n{\n\tUCHAR\tregclass;\t\t// regulatory class\n\tUCHAR\tspacing;\t\t// 0: 20Mhz, 1: 40Mhz\n\tUCHAR\tchannelset[16];\t// max 15 channels, use 0 as terminator\n} TDLS_REG_CLASS;\n\nTDLS_REG_CLASS reg_class[] =\n{\n\t{  1,  0, {36, 40, 44, 48, 0}},\n\t{  2,  0, {52, 56, 60, 64, 0}},\n\t{  3,  0, {149, 153, 157, 161, 0}},\n\t{  4,  0, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}},\n\t{  5,  0, {165, 0}},\n\t{ 12, 0, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0}},\n\t{ 22, 1, {36, 44, 0}},\n\t{ 23, 1, {52, 60, 0}},\n\t{ 24, 1, {100, 108, 116, 124, 132, 0}},\n\t{ 25, 1, {149, 157, 0}},\n\t{ 26, 1, {149, 157, 0}},\n\t{ 27, 1, {40, 48, 0}},\n\t{ 28, 1, {56, 64, 0}},\n\t{ 29, 1, {104, 112, 120, 128, 136, 0}},\n\t{ 30, 1, {153, 161, 0}},\n\t{ 31, 1, {153, 161, 0}},\n\t{ 32, 1, {1, 2, 3, 4, 5, 6, 7, 0}},\n\t{ 33, 1, {5, 6, 7, 8, 9, 10, 11, 0}},\n\t{ 0,   0, {0}}\t\t\t// end\n};\n\nVOID\nTDLS_Table_Init(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR idx;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\t/* initialize TDLS allocate spin lock */\n\tNdisAllocateSpinLock(pAd, &pAd->StaCfg.TdlsInfo.TDLSEntryLock);\n\n\tfor (idx = 0; idx < MAX_NUM_OF_TDLS_ENTRY; idx++)\n\t{\n\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\tpTDLS->Token = 0;\n\t\tpTDLS->Valid = FALSE;\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t}\n}\n\nVOID\nTDLS_Table_Destory(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tUCHAR idx;\n\tBOOLEAN TimerCancelled;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n#ifdef UAPSD_SUPPORT\n\tTDLS_UAPSDP_Release(pAd);\n#endif /* UAPSD_SUPPORT */\n\n\tNdisFreeSpinLock(&pAd->StaCfg.TdlsInfo.TDLSEntryLock);\n\n\tfor (idx = 0; idx < MAX_NUM_OF_TDLS_ENTRY; idx++)\n\t{\n\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\tpTDLS->Token = 0;\n\t\tpTDLS->Valid = FALSE;\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\n\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\t}\n}\n\nUCHAR TDLS_GetRegulatoryClass(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR\tChannelWidth,\n\tIN UCHAR\tTargetChannel)\n{\n\tint i=0;\n\tUCHAR regclass = 0;\n\n\tdo\n\t{\n\t\tif (reg_class[i].spacing == ChannelWidth)\n\t\t{\n\t\t\tint j=0;\n\n\t\t\tdo\n\t{\n\t\t\t\tif (reg_class[i].channelset[j] == TargetChannel)\n\t\t{\n\t\t\t\t\tregclass = reg_class[i].regclass;\n\t\t\t\t\tbreak;\n\t\t}\n\t\t\t\tj++;\n\t\t\t} while (reg_class[i].channelset[j] != 0);\n\t}\n\t\ti++;\n\t} while (reg_class[i].regclass != 0);\n\n\t//ASSERT(regclass);\n\n\treturn regclass;\n}\n\nstatic BOOLEAN\nTDLS_IsValidChannel(\n\tIN PRTMP_ADAPTER pAd,\n\tIN UCHAR channel)\n\n{\n\tINT i;\n\n\tfor (i = 0; i < pAd->ChannelListNum; i++)\n\t{\n\t\tif (pAd->ChannelList[i].Channel == channel)\n\t\t\tbreak;\n\t}\n\n\tif (i == pAd->ChannelListNum)\n\t\treturn FALSE;\n\telse\n\t\treturn TRUE;\n}\n\n\nstatic UCHAR\nTDLS_GetExtCh(\n\tIN UCHAR Channel,\n\tIN UCHAR Direction)\n{\n\tCHAR ExtCh;\n\n\tif (Direction == EXTCHA_ABOVE)\n\t\tExtCh = Channel + 4;\n\telse\n\t\tExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;\n\n\treturn ExtCh;\n}\n\n#ifdef TDLS_AUTOLINK_SUPPORT\nVOID\nTDLS_ClearEntryList(\n\tIN  PLIST_HEADER\tpTdlsEnList)\n{\n\tPLIST_ENTRY\t\tpEntry = NULL;\n\n\tpEntry = pTdlsEnList->pHead;\n\n\twhile (pEntry != NULL)\n\t{\t\t\n\t\tremoveHeadList(pTdlsEnList);\n\t\tos_free_mem(NULL, pEntry);\n\t\tpEntry = pTdlsEnList->pHead;\n\t}\n\t\n\treturn;\n}\n\nPTDLS_DISCOVERY_ENTRY\nTDLS_FindDiscoveryEntry(\n\tIN\tPLIST_HEADER\tpTdlsEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr)\n{\n\tPTDLS_DISCOVERY_ENTRY\tpPeerEntry = NULL;\n\tPLIST_ENTRY\t\t\t\tpListEntry = NULL;\n\n\tpListEntry = pTdlsEnList->pHead;\n\tpPeerEntry = (PTDLS_DISCOVERY_ENTRY)pListEntry;\n\twhile (pPeerEntry != NULL)\n\t{\n\t\tif (NdisEqualMemory(pPeerEntry->Responder, pMacAddr, MAC_ADDR_LEN))\n\t\t\treturn pPeerEntry;\n\t\tpListEntry = pListEntry->pNext;\n\t\tpPeerEntry = (PTDLS_DISCOVERY_ENTRY)pListEntry;\n\t}\n\n\treturn NULL;\n}\n\nBOOLEAN\nTDLS_InsertDiscoveryPeerEntryByMAC(\n\tIN\tPLIST_HEADER pTdlsEnList,\n\tIN\tPUCHAR pMacAddr,\n\tIN\tBOOLEAN bConnected)\n{\n\tPTDLS_DISCOVERY_ENTRY pTdlsPeer = NULL;\n\n\tpTdlsPeer = TDLS_FindDiscoveryEntry(pTdlsEnList, pMacAddr);\n\tif (pTdlsPeer)\n\t{\n\t\tNdisGetSystemUpTime(&pTdlsPeer->InitRefTime);\n\t\tpTdlsPeer->bFirstTime = FALSE;\n\t\tpTdlsPeer->bConnectedFirstTime = FALSE;\n\t}\n\telse\n\t{\n\t\tos_alloc_mem(NULL, (PUCHAR *)&pTdlsPeer, sizeof(TDLS_DISCOVERY_ENTRY));\n\n\t\tif (pTdlsPeer)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n!!! Add %02x:%02x:%02x:%02x:%02x:%02x to discovery table !!!\\n\",\n\t\t\t\t\t\t\t\t\tpMacAddr[0], pMacAddr[1], pMacAddr[2], pMacAddr[3], pMacAddr[4], pMacAddr[5]));\n\n\t\t\tNdisZeroMemory(pTdlsPeer, sizeof(TDLS_DISCOVERY_ENTRY));\n\t\t\tNdisMoveMemory(pTdlsPeer->Responder, pMacAddr, MAC_ADDR_LEN);\n\t\t\tNdisGetSystemUpTime(&pTdlsPeer->InitRefTime);\n\t\t\tpTdlsPeer->CurrentState = TDLS_DISCOVERY_IDLE;\n\t\t\tpTdlsPeer->RetryCount = 0;\n\t\t\tpTdlsPeer->bFirstTime = TRUE;\n\t\t\tpTdlsPeer->bConnected = bConnected;\n\t\t\tinsertTailList(pTdlsEnList, (PLIST_ENTRY)pTdlsPeer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\treturn TRUE;\n}\n\nVOID TDLS_DelDiscoveryEntryByMAC(\n\tIN\tPLIST_HEADER\tpTdlsEnList,\n\tIN  PUCHAR\tpMacAddr)\n{\n\tPLIST_ENTRY\tpListEntry = NULL;\n\tPTDLS_DISCOVERY_ENTRY \tpPeerEntry = NULL;\n\n\tpPeerEntry = TDLS_FindDiscoveryEntry(pTdlsEnList, pMacAddr);\n\tpListEntry = (PLIST_ENTRY)pPeerEntry;\n\n\tif (pPeerEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n !!! Delete %02x:%02x:%02x:%02x:%02x:%02x from discovery table !!!\\n\",\n\t\t\t\t\t\t\tpPeerEntry->Responder[0],\n\t\t\t\t\t\t\tpPeerEntry->Responder[1],\n\t\t\t\t\t\t\tpPeerEntry->Responder[2],\n\t\t\t\t\t\t\tpPeerEntry->Responder[3],\n\t\t\t\t\t\t\tpPeerEntry->Responder[4],\n\t\t\t\t\t\t\tpPeerEntry->Responder[5]));\n\t\tdelEntryList(pTdlsEnList, pListEntry);\n\t\tos_free_mem(NULL, pPeerEntry);\n\t}\n}\n\nVOID\nTDLS_MaintainDiscoveryEntryList(\n\tIN PRTMP_ADAPTER \tpAd)\n{\n\tULONG now_time = 0;\n\tPTDLS_DISCOVERY_ENTRY pPeerEntry = NULL;\n\tPLIST_ENTRY\tpListEntry = NULL, pTempListEntry = NULL;\n\tPLIST_HEADER pTdlsDiscoveryEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\n\tNdisGetSystemUpTime(&now_time);\n\tpListEntry = pTdlsDiscoveryEnList->pHead;\n\tpPeerEntry = (PTDLS_DISCOVERY_ENTRY)pListEntry;\n\n\twhile (pPeerEntry != NULL)\n\t\t{\n\t\tif (pPeerEntry->bConnected)\n\t\t\t{\n\t\t\tif (RTMP_TIME_AFTER(now_time, pPeerEntry->InitRefTime + (pAd->StaCfg.TdlsInfo.TdlsRssiMeasurementPeriod * ((1000 * OS_HZ)/1000))))\n\t\t\t{\n\t\t\t\tBOOLEAN rv;\n\t\t\t\tUCHAR PeerMAC[MAC_ADDR_LEN];\n\t\t\t\t\t\n\t\t\t\tNdisMoveMemory(PeerMAC, pPeerEntry->Responder, MAC_ADDR_LEN);\n\n\t\t\t\tif (pPeerEntry->RetryCount >= 2)\n\t\t\t\t{\n\t\t\t\t\t/* tear down */\n\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t{\n\t\t\t\t\t\tMLME_TDLS_REQ_STRUCT\tMlmeTdlsReq;\n\t\t\t\t\t\tUSHORT\t\tReason = REASON_UNSPECIFY;\n\t\t\t\t\t\tINT\t\t\tidx;\n\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n !!! Will tear down %02x:%02x:%02x:%02x:%02x:%02x !!!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[0],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[1],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[2],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[3],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[4],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[5]));\n\n\t\t\t\t\t\tidx = TDLS_SearchLinkId(pAd, pPeerEntry->Responder);\n\n\t\t\t\t\t\tif (idx == -1 || idx == MAX_NUM_OF_TDLS_ENTRY)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - can not find or full the LinkId!\\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (idx >= 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tReason = TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON;\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Valid\t= FALSE;\n\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Status\t= TDLS_MODE_NONE;\n\t\t\t\t\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[idx], Reason, FALSE);\n\n\t\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\t\t\t\t\tMT2_MLME_TDLS_TEAR_DOWN,\n\t\t\t\t\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t\t\t0);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\tpTempListEntry = pListEntry->pNext;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n !!! peer connect and retrycount > 2 Delete %02x:%02x:%02x:%02x:%02x:%02x from discovery table !!!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[0],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[1],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[2],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[3],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[4],\n\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[5]));\n\t\t\t\t\tdelEntryList(pTdlsDiscoveryEnList, pListEntry);\n\t\t\t\t\tos_free_mem(NULL, pPeerEntry);\n\t\t\t\t\tpListEntry = pTempListEntry;\n\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\tif (pPeerEntry->bConnectedFirstTime)\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisGetSystemUpTime(&pPeerEntry->InitRefTime);\n\t\t\t\t\t\tpPeerEntry->RetryCount = 0;\n\t\t\t\t\t\tpPeerEntry->bConnected = TRUE;\n\t\t\t\t\t\trv = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trv = TDLS_InsertDiscoveryPeerEntryByMAC(pTdlsDiscoveryEnList,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTRUE);\n\t\t\t\t}\n\t\t\t\t\tpPeerEntry->RetryCount++;\n\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\n\t\t\t\t\tif (rv)\n\t\t\t\t\t{\n\t\t\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE, \n\t\t\t\t\t\t\t\t\tMT2_MLME_TDLS_DISCOVER_REQ, \n\t\t\t\t\t\t\t\t\tMAC_ADDR_LEN, \n\t\t\t\t\t\t\t\t\tpPeerEntry->Responder,\n\t\t\t\t\t\t\t\t\t0);\n\t\t\t}\n\t\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t}\n\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpListEntry = pListEntry->pNext;\n}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((RTMP_TIME_AFTER(now_time, pPeerEntry->InitRefTime + TDLS_AUTO_DISCOVERY_INTERVAL)) &&\n\t\t\t\t(pPeerEntry->bFirstTime))\n\t\t\t{\n\t\t\t\tBOOLEAN rv;\n\n\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\trv = TDLS_InsertDiscoveryPeerEntryByMAC(pTdlsDiscoveryEnList,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFALSE);\n\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\tif (rv)\n\t\t\t\t{\n\t\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE, \n\t\t\t\t\t\t\t\tMT2_MLME_TDLS_DISCOVER_REQ, \n\t\t\t\t\t\t\t\tMAC_ADDR_LEN, \n\t\t\t\t\t\t\t\tpPeerEntry->Responder,\n\t\t\t\t\t\t\t\t0);\n\t\t\t\t}\n\n\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (RTMP_TIME_AFTER(now_time, pPeerEntry->InitRefTime + (5 * ((1000 * OS_HZ)/1000))))\n\t\t\t\t{\n\t\t\t\t\tif (pPeerEntry->CurrentState != TDLS_DISCOVERY_TO_SETUP_DONE)\n{\n\t\t\t\t\t\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\n\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t\t\t\tTDLS_InsertBlackEntryByMAC(pTdlsBlackEnList, pPeerEntry->Responder, TDLS_BLACK_AUTO_DISCOVERY);\n\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\n\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t\tpTempListEntry = pListEntry->pNext;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n !!! peer disconnect  and over 5 sec Delete %02x:%02x:%02x:%02x:%02x:%02x from discovery table !!!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[1],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[3],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[4],\n\t\t\t\t\t\t\t\t\t\t\t\t\tpPeerEntry->Responder[5]));\n\t\t\t\t\t\tdelEntryList(pTdlsDiscoveryEnList, pListEntry);\n\t\t\t\t\t\tos_free_mem(NULL, pPeerEntry);\n\t\t\t\t\t\tpListEntry = pTempListEntry;\n\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t{\n\t\t\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t\t\t\t}\n\t}\n\telse\n\t{\n\t\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpPeerEntry = (PTDLS_DISCOVERY_ENTRY)pListEntry;\n\t}\n\t}\n\nPTDLS_BLACK_ENTRY\nTDLS_FindBlackEntry(\n\tIN\tPLIST_HEADER\tpTdlsEnList,\n\tIN\tPUCHAR\t\t\tpMacAddr)\n{\n\tPTDLS_BLACK_ENTRY\tpPeerEntry = NULL;\n\tPLIST_ENTRY\t\t\tpListEntry = NULL;\n\n\tpListEntry = pTdlsEnList->pHead;\n\tpPeerEntry = (PTDLS_BLACK_ENTRY)pListEntry;\n\n\twhile (pPeerEntry != NULL)\n\t{\n\t\tif (NdisEqualMemory(pPeerEntry->MacAddr, pMacAddr, MAC_ADDR_LEN))\n\t\t\treturn pPeerEntry;\n\n\t\tpListEntry = pListEntry->pNext;\n\t\tpPeerEntry = (PTDLS_BLACK_ENTRY)pListEntry;\n}\n\n\treturn NULL;\n}\n\nVOID\nTDLS_InsertBlackEntryByMAC(\n\tIN\tPLIST_HEADER\tpTdlsEnList,\n\tIN\tPUCHAR\t\tpMacAddr,\n\tIN\tUCHAR\tCurrentState)\n{\n\tPTDLS_BLACK_ENTRY\t\tpTdlsBlack = NULL;\n\n\tpTdlsBlack = TDLS_FindBlackEntry(pTdlsEnList, pMacAddr);\n\tif (pTdlsBlack)\n\t{\n\t\tNdisGetSystemUpTime(&pTdlsBlack->InitRefTime);\n\t\tpTdlsBlack->CurrentState = CurrentState;\n\t}\n\telse\n\t\t{\n\t\tos_alloc_mem(NULL, (PUCHAR *)&pTdlsBlack, sizeof(TDLS_BLACK_ENTRY));\n\n\t\tif (pTdlsBlack)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n Add %02x:%02x:%02x:%02x:%02x:%02x to black table!!!\\n\",\n\t\t\t\t\t\t\t\tpMacAddr[0], pMacAddr[1], pMacAddr[2], pMacAddr[3], pMacAddr[4], pMacAddr[5]));\n\t\t\tNdisZeroMemory(pTdlsBlack, sizeof(TDLS_BLACK_ENTRY));\n\t\t\tNdisMoveMemory(pTdlsBlack->MacAddr, pMacAddr, MAC_ADDR_LEN);\n\t\t\tNdisGetSystemUpTime(&pTdlsBlack->InitRefTime);\n\t\t\tpTdlsBlack->CurrentState = CurrentState;\n\t\t\tinsertTailList(pTdlsEnList, (PLIST_ENTRY)pTdlsBlack);\n\t\t}\n\t\tASSERT(pTdlsBlack != NULL);\n\t}\n}\n\nVOID\nTDLS_DelBlackEntryByMAC(\n\tIN\tPLIST_HEADER\t\tpTdlsEnList,\n\tIN  PUCHAR\t\t\tpMacAddr)\n{\n\tPLIST_ENTRY\tpListEntry = NULL;\n\tPTDLS_BLACK_ENTRY \tpBlackEntry = NULL;\n\n\tpBlackEntry = TDLS_FindBlackEntry(pTdlsEnList, pMacAddr);\n\tpListEntry = (PLIST_ENTRY)pBlackEntry;\n\n\tif (pBlackEntry)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n Delete %02x:%02x:%02x:%02x:%02x:%02x from black table!!!\\n\",\n\t\t\t\t\t\t\tpBlackEntry->MacAddr[0],\n\t\t\t\t\t\t\tpBlackEntry->MacAddr[1],\n\t\t\t\t\t\t\tpBlackEntry->MacAddr[2],\n\t\t\t\t\t\t\tpBlackEntry->MacAddr[3],\n\t\t\t\t\t\t\tpBlackEntry->MacAddr[4],\n\t\t\t\t\t\t\tpBlackEntry->MacAddr[5]));\n\n\t\tdelEntryList(pTdlsEnList, pListEntry);\n\t\tos_free_mem(NULL, pBlackEntry);\n\t}\n}\n\n\nVOID\nTDLS_MaintainBlackList(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PLIST_HEADER\tpTdlsBlackenList)\n{\n\tPTDLS_BLACK_ENTRY \tpBlackEntry = NULL;\n\tPLIST_ENTRY\t\t\tpListEntry = NULL, pTempListEntry = NULL;\n\tULONG\t\t\t\tnow_time = 0;\n\n\tNdisGetSystemUpTime(&now_time);\n\tpListEntry = pTdlsBlackenList->pHead;\n\tpBlackEntry = (PTDLS_BLACK_ENTRY)pListEntry;\n\n\twhile (pBlackEntry != NULL)\n\t{\n\t\tif (pBlackEntry->CurrentState == TDLS_BLACK_AUTO_DISCOVERY)\n\t\t{\n\t\t\tif (RTMP_TIME_AFTER(now_time, pBlackEntry->InitRefTime + (pAd->StaCfg.TdlsInfo.TdlsAutoDiscoveryPeriod * ((1000 * OS_HZ)/1000))))\n\t\t\t{\n\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t\tpTempListEntry = pListEntry->pNext;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n balck auto discovery after %d secs Delete %02x:%02x:%02x:%02x:%02x:%02x from black table !!!\\n\",\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsAutoDiscoveryPeriod,\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[0],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[1],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[2],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[3],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[4],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[5]));\n\t\t\t\tdelEntryList(pTdlsBlackenList, pListEntry);\n\t\t\t\tos_free_mem(NULL, pBlackEntry);\n\t\t\t\tpListEntry = pTempListEntry;\n\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n}\n\t\t\telse\n{\n\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t\t}\n\t\t}\n\t\telse if (pBlackEntry->CurrentState == TDLS_BLACK_TDLS_BY_TEARDOWN)\n\t{\n\t\t\tif (RTMP_TIME_AFTER(now_time, pBlackEntry->InitRefTime + (pAd->StaCfg.TdlsInfo.TdlsDisabledPeriodByTeardown * ((1000 * OS_HZ)/1000))))\n\t\t\t{\n\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t\tpTempListEntry = pListEntry->pNext;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n black tdls bt teardown after %d secs Delete %02x:%02x:%02x:%02x:%02x:%02x from black table!!!\\n\",\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TdlsDisabledPeriodByTeardown,\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[0],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[1],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[2],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[3],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[4],\n\t\t\t\t\t\t\t\t\t\tpBlackEntry->MacAddr[5]));\n\t\t\t\tdelEntryList(pTdlsBlackenList, pListEntry);\n\t\t\t\tos_free_mem(NULL, pBlackEntry);\n\t\t\t\tpListEntry = pTempListEntry;\n\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpListEntry = pListEntry->pNext;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpListEntry = pListEntry->pNext;\n\t\t}\n\t\tpBlackEntry = (PTDLS_BLACK_ENTRY)pListEntry;\n\t}\n}\n\nUCHAR\nTDLS_ValidIdLookup(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpAddr)\n{\n\tINT\tidIdx = MAX_NUM_OF_TDLS_ENTRY;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\tfor (idIdx = 0; idIdx < MAX_NUM_OF_TDLS_ENTRY; idIdx++)\n\t{\n\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idIdx];\n\n\t\tif (pTDLS->Valid && MAC_ADDR_EQUAL(pAddr, pTDLS->MacAddr))\n\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"TDLS_ValidIdLookup - Find Link ID with Peer Address %02x:%02x:%02x:%02x:%02x:%02x(%d) \\n\", \n            \tpAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], idIdx));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (idIdx == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"!!! TDLS_ValidIdLookup -  not found !!!\\n\"));\n\t\treturn MAX_NUM_OF_TDLS_ENTRY;\n\t}\n\n\treturn idIdx;\n}\n\nVOID\nTDLS_AutoSetupByRcvFrame(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PHEADER_802_11\tpHeader)\n{\n\tPTDLS_BLACK_ENTRY pTdlsBlackEntry = NULL;\n\tPTDLS_DISCOVERY_ENTRY pTdlsDiscoveryEntry = NULL;\n\tPLIST_HEADER pTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\tPLIST_HEADER pTdlsDiscoveryEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS ===> TDLS_AutoSetupByRcvFrame\\n\"));\n\n\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\tpTdlsBlackEntry = TDLS_FindBlackEntry(pTdlsBlackEnList, pHeader->Addr3);\n\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\n\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\tpTdlsDiscoveryEntry = TDLS_FindDiscoveryEntry(pTdlsDiscoveryEnList, pHeader->Addr3);\n\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\n\tif ((pTdlsBlackEntry == NULL) && (pTdlsDiscoveryEntry == NULL))\n\t{\n\t\tBOOLEAN rv;\n\t\tUCHAR LinkId = 0xff;\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"AutoSetupByRcvFrame trigger discovery request !!!\\n\"));\n\n\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\trv = TDLS_InsertDiscoveryPeerEntryByMAC(pTdlsDiscoveryEnList,\n\t\t\t\t\t\t\t\t\t\t\t\tpHeader->Addr3,\n\t\t\t\t\t\t\t\t\t\t\t\tFALSE);\n\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\tLinkId = TDLS_ValidIdLookup(pAd, pHeader->Addr3);\n\n\t\tif (LinkId < MAX_NUM_OF_TDLS_ENTRY)\n\t\t{\n\t\t\tPTDLS_DISCOVERY_ENTRY pTdlsPeer = NULL;\n\n\t\t\tpTdlsPeer = TDLS_FindDiscoveryEntry(pTdlsDiscoveryEnList, pHeader->Addr3);\n\t\t\tif (pTdlsPeer)\n\t\t\t{\n\t\t\t\tpTdlsPeer->bConnectedFirstTime = TRUE;\n\t\t\t\tpTdlsPeer->bConnected = TRUE;\n\t\t\t\tpTdlsPeer->RetryCount = 0;\n\t\t\t\tpTdlsPeer->CurrentState = TDLS_DISCOVERY_TO_SETUP_DONE;\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS peer entry already on table !!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (rv)\n\t\t{\n\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\tTDLS_STATE_MACHINE, \n\t\t\t\t\t\tMT2_MLME_TDLS_DISCOVER_REQ, \n\t\t\t\t\t\tMAC_ADDR_LEN, \n\t\t\t\t\t\tpHeader->Addr3,\n\t\t\t\t\t\t0);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS <=== TDLS_AutoSetupByRcvFrame\\n\"));\n}\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n#ifdef WFD_SUPPORT\n/*\n==========================================================================\n\tDescription: WFD\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_TunneledProbeRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMacAddr)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\tCategory = 0x7F;\n\tUCHAR\tOUI[3] = {0x50, 0x6F, 0x9A};\n\tUCHAR\tFrameBodyType = 4; /* 4: Request. 5: Response. */\n\tPUCHAR\tpWfdIeLen = NULL;\n\tUCHAR\tWfdIEFixed[6] = {0xdd, 0x0c, 0x50, 0x6f, 0x9a, 0x0a};\n\tUCHAR\tWfdIeLen = 0;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS ===> TDLS_TunneledProbeRequest\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pMacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t// Allocate buffer for transmitting message\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\treturn NStatus;\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\t1,\t\t\t\t&Category,\n\t\t\t\t\t\t3,\t\t\t\t&OUI,\n\t\t\t\t\t\t1,\t\t\t\t&FrameBodyType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\n\tpWfdIeLen = pOutBuffer + FrameLen + 1;\n\tMakeOutgoingFrame(pOutBuffer + FrameLen,\t\t&TempLen,\n\t\t\t\t\t\t6,\t\t\t\t\t\t\t&WfdIEFixed,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tWfdIeLen += TempLen;\n\tFrameLen = FrameLen + TempLen;\n\n\n\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_DEVICE_INFO, NULL, pOutBuffer + FrameLen, ACTION_WIFI_DIRECT);\n\tFrameLen = FrameLen + TempLen;\n\tWfdIeLen += TempLen; \n\n\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ASSOCIATED_BSSID, NULL, pOutBuffer + FrameLen, ACTION_WIFI_DIRECT);\n\tFrameLen = FrameLen + TempLen;\n\tWfdIeLen += TempLen; \n\t*pWfdIeLen = (WfdIeLen - 2);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS tunneled request send pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS <=== TDLS_TunneledProbeRequest\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription: WFD\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_TunneledProbeResponse(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMacAddr)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\tCategory = 0x7F;\n\tUCHAR\tOUI[3] = {0x50, 0x6F, 0x9A};\n\tUCHAR\tFrameBodyType = 5; /* 4: Request. 5: Response. */\n\tPUCHAR\tpWfdIeLen = NULL;\n\tUCHAR\tWfdIEFixed[6] = {0xdd, 0x0c, 0x50, 0x6f, 0x9a, 0x0a};\n\tUCHAR\tWfdIeLen = 0;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS ===> TDLS_TunneledProbeResponse\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pMacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t// Allocate buffer for transmitting message\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\treturn NStatus;\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\t1,\t\t\t\t&Category,\n\t\t\t\t\t\t3,\t\t\t\t&OUI,\n\t\t\t\t\t\t1,\t\t\t\t&FrameBodyType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tpWfdIeLen = pOutBuffer + FrameLen + 1;\n\tMakeOutgoingFrame(pOutBuffer + FrameLen,\t\t&TempLen,\n\t\t\t\t\t\t6,\t\t\t\t\t\t\t&WfdIEFixed,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tWfdIeLen += TempLen;\n\tFrameLen = FrameLen + TempLen;\n\n\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_DEVICE_INFO, NULL, pOutBuffer + FrameLen, ACTION_WIFI_DIRECT);\n\tFrameLen = FrameLen + TempLen;\n\tWfdIeLen += TempLen; \n\n\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ASSOCIATED_BSSID, NULL, pOutBuffer + FrameLen, ACTION_WIFI_DIRECT);\n\tFrameLen = FrameLen + TempLen;\n\tWfdIeLen += TempLen; \n\n\tTempLen = InsertWfdSubelmtTlv(pAd, SUBID_WFD_ALTERNATE_MAC_ADDR, NULL, pOutBuffer + FrameLen, ACTION_WIFI_DIRECT);\n\tFrameLen = FrameLen + TempLen;\n\tWfdIeLen += TempLen;\n\n\t*pWfdIeLen = (WfdIeLen - 2);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS tunneled request send pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS <=== TDLS_TunneledProbeResponse\\n\"));\n\n\treturn NStatus;\n}\n#endif /* WFD_SUPPORT */\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsCapableProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\tbTdlsCapable;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tbTdlsCapable = simple_strtol(arg, 0, 10);\n\n\tif (!bTdlsCapable && pAd->StaCfg.TdlsInfo.bTDLSCapable)\n\t{\n\t\t/* tear\tdown local dls table entry */\n\t\tTDLS_LinkTearDown(pAd, TRUE);\n\t}\n\n\tpAd->StaCfg.TdlsInfo.bTDLSCapable = bTdlsCapable;\n#ifdef WFD_SUPPORT\n\tif (pAd->StaCfg.TdlsInfo.bTDLSCapable)\n\t\t\tpAd->StaCfg.WfdCfg.PC = WFD_PC_TDLS;\n\telse\n\t\t\tpAd->StaCfg.WfdCfg.PC = WFD_PC_P2P;\n#endif /* WFD_SUPPORT */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"IF(ra%d) Set_TdlsCapableProc::(bTdlsCapable=%d)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.bTDLSCapable));\n\n\treturn TRUE;\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsSetupProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\tmacAddr[MAC_ADDR_LEN];\n\tPSTRING\t\t\tvalue;\n\tINT\t\t\t\tvalue_offset;\n\tRT_802_11_TDLS\tTdls;\n\n\tif(strlen(arg) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\treturn FALSE;\n\n\tfor (value_offset=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n\t{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  /*Invalid */\n\n\t\tAtoH(value, &macAddr[value_offset++], 1);\n\t}\n\n\t/* TDLS will not be supported when Adhoc mode */\n\tif (INFRA_ON(pAd))\n\t{\n\t\tif (pAd->StaActive.ExtCapInfo.TDLSProhibited == TRUE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS - Set_TdlsSetupProc() AP Prohibited TDLS !!!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n%02x:%02x:%02x:%02x:%02x:%02x\\n\", macAddr[0], macAddr[1], macAddr[2],\n\t\t\t\t\t\t\t\t\tmacAddr[3], macAddr[4], macAddr[5]));\n\n\t\tNdisZeroMemory(&Tdls, sizeof(RT_802_11_TDLS));\n\t\tTdls.TimeOut = 0;\n\t\tCOPY_MAC_ADDR(Tdls.MacAddr, macAddr);\n\t\tTdls.Valid = 1;\n\n\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\tRT_OID_802_11_SET_TDLS_PARAM, \n\t\t\t\t\tsizeof(RT_802_11_TDLS), \n\t\t\t\t\t&Tdls,\n\t\t\t\t\t0);\n\n\t\tRTMP_MLME_HANDLER(pAd);\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsTearDownProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\tmacAddr[MAC_ADDR_LEN];\n\tPSTRING\t\t\tvalue;\n\tINT\t\t\t\tvalue_offset;\n\tCHAR\t\t\tidx;\n\n\tif(strlen(arg) != 17)  /*Mac address acceptable format 01:02:03:04:05:06 length 17 */\n\t\treturn FALSE;\n\n\tfor (value_offset=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n\t{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  /*Invalid */\n\n\t\tAtoH(value, &macAddr[value_offset++], 1);\n\t}\n\n\t/* TDLS will not be supported when Adhoc mode */\n\tif (INFRA_ON(pAd))\n\t{\n\t\tMLME_TDLS_REQ_STRUCT\tMlmeTdlsReq;\n\t\tUSHORT\t\tReason = REASON_UNSPECIFY;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE,(\"\\n%02x:%02x:%02x:%02x:%02x:%02x\\n\", macAddr[0], macAddr[1], macAddr[2],\n\t\t\t\t\t\t\t\t\tmacAddr[3], macAddr[4], macAddr[5]));\n\n\t\tidx = TDLS_SearchLinkId(pAd, macAddr);\n\n\t\tif (idx == -1 || idx == MAX_NUM_OF_TDLS_ENTRY)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - Set_TdlsTearDownProc() can not find or full the LinkId!\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (idx >= 0)\n\t\t{\n\t\t\tReason = TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON;\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Valid\t= FALSE;\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Status\t= TDLS_MODE_NONE;\n\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[idx], Reason, FALSE);\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\tMT2_MLME_TDLS_TEAR_DOWN,\n\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t0);\n\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsDiscoveryReqProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\tPeerMacAddr[MAC_ADDR_LEN];\n\tPSTRING\t\t\tvalue;\n\tINT\t\t\t\tvalue_offset;\n\n\tif(strlen(arg) != 17)  //Mac address acceptable format 01:02:03:04:05:06 length 17\n\t\treturn FALSE;\n\t    \n\tfor (value_offset=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  //Invalid\n\n\t\tAtoH(value, &PeerMacAddr[value_offset++], 1);\n}\n\n\t/* TDLS will not be supported when Adhoc mode */\n\tif (INFRA_ON(pAd))\n\t\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n Discovery Peer %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\tPeerMacAddr[0], PeerMacAddr[1], PeerMacAddr[2],\n\t\t\t\t\t\t\t\tPeerMacAddr[3], PeerMacAddr[4], PeerMacAddr[5]));\n\n\n\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tTDLS_STATE_MACHINE, \n\t\t\t\t\tMT2_MLME_TDLS_DISCOVER_REQ, \n\t\t\t\t\tMAC_ADDR_LEN, \n\t\t\t\t\tPeerMacAddr,\n\t\t\t\t\t0);\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\n#ifdef WFD_SUPPORT\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsTunneledReqProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUCHAR\t\t\tPeerMacAddr[MAC_ADDR_LEN];\n\tPSTRING\t\t\tvalue;\n\tINT\t\t\t\tvalue_offset;\n\n\tif(strlen(arg) != 17)  //Mac address acceptable format 01:02:03:04:05:06 length 17\n\t\treturn FALSE;\n\n\tfor (value_offset=0, value = rstrtok(arg,\":\"); value; value = rstrtok(NULL,\":\")) \n\t{\n\t\tif((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) \n\t\t\treturn FALSE;  //Invalid\n\n\t\tAtoH(value, &PeerMacAddr[value_offset++], 1);\n\t}\n\n\t/* TDLS will not be supported when Adhoc mode */\n\tif (INFRA_ON(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n Discovery Peer %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\tPeerMacAddr[0], PeerMacAddr[1], PeerMacAddr[2],\n\t\t\t\t\t\t\t\tPeerMacAddr[3], PeerMacAddr[4], PeerMacAddr[5]));\n\n\t\tMlmeEnqueue(pAd, \n\t\t\t\t\tTDLS_STATE_MACHINE, \n\t\t\t\t\tMT2_MLME_TDLS_TUNNELED_REQ, \n\t\t\t\t\tMAC_ADDR_LEN, \n\t\t\t\t\tPeerMacAddr,\n\t\t\t\t\t0);\n\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n#endif /* WFD_SUPPORT */\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsTPKLifeTimeProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUINT32\tkeyLifeTime;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tkeyLifeTime = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsKeyLifeTime = keyLifeTime;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsTPKLifeTimeProc::(TdlsKeyLifeTime=%d)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsKeyLifeTime));\n\n\treturn TRUE;\n}\n\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\tSet_TdlsAutoLinkProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tBOOLEAN\tbTdlsAutoLink;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tbTdlsAutoLink = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsAutoLink = bTdlsAutoLink;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsAutoLinkProc::(TdlsAutoLink=%d)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsAutoLink));\n\n\treturn TRUE;\n\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\nSet_TdlsRssiMeasurementPeriodProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT RssiMeasurementPeriod;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tRssiMeasurementPeriod = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsRssiMeasurementPeriod = RssiMeasurementPeriod;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsRssiMeasurementPeriodProc::(RssiMeasurementPeriod = %d secs)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsRssiMeasurementPeriod));\n\n\treturn TRUE;\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\nSet_TdlsAutoDiscoveryPeriodProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT AutoDiscoveryPeriod;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tAutoDiscoveryPeriod = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsAutoDiscoveryPeriod = AutoDiscoveryPeriod;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsAutoDiscoveryPeriodProc::(AutoDiscoveryPeriod = %d secs)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsAutoDiscoveryPeriod));\n\n\treturn TRUE;\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\nSet_TdlsAutoSetupRssiThresholdProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tCHAR AutoSetupRssiThreshold;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tAutoSetupRssiThreshold = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsAutoSetupRssiThreshold = AutoSetupRssiThreshold;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsAutoSetupRssiThresholdProc::(AutoSetupRssiThreshold = %d dbm)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsAutoSetupRssiThreshold));\n\n\treturn TRUE;\n\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\nSet_TdlsDisabledPeriodByTeardownProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tUSHORT DisabledPeriodByTeardown;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tDisabledPeriodByTeardown = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsDisabledPeriodByTeardown = DisabledPeriodByTeardown;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsDisabledPeriodByTeardownProc::(DisabledPeriodByTeardown = %d secs)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsDisabledPeriodByTeardown));\n\n\treturn TRUE;\n\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT\nSet_TdlsAutoTeardownRssiThresholdProc(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPSTRING\t\t\targ)\n{\n\tCHAR AutoTeardownRssiThreshold;\n\n\tPOS_COOKIE\tpObj= (POS_COOKIE)pAd->OS_Cookie;\n\n\tAutoTeardownRssiThreshold = simple_strtol(arg, 0, 10);\n\n\tpAd->StaCfg.TdlsInfo.TdlsAutoTeardownRssiThreshold = AutoTeardownRssiThreshold;\n\t\n\tDBGPRINT(RT_DEBUG_ERROR, (\"IF(ra%d) Set_TdlsAutoTeardownRssiThresholdProc::(AutoTeardownRssiThreshold = %d dbm)\\n\", \n\t\tpObj->ioctl_if, pAd->StaCfg.TdlsInfo.TdlsAutoTeardownRssiThreshold));\n\n\treturn TRUE;\n}\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InitPeerEntryRateCapability(\n\tIN\tPRTMP_ADAPTER pAd,\n\tIN\tMAC_TABLE_ENTRY *pEntry,\n\tIN USHORT *pCapabilityInfo,\n\tIN UCHAR SupportRateLens,\n\tIN UCHAR *pSupportRates,\n\tIN UCHAR HtCapabilityLen,\n\tIN HT_CAPABILITY_IE *pHtCapability)\n{\n\tUCHAR MaxSupportedRate = RATE_11;\n\tUCHAR MaxSupportedRateIn500Kbps = 0;\n\tUCHAR idx;\n\n\n\tMaxSupportedRateIn500Kbps = dot11_max_sup_rate(SupportRateLens, pSupportRates,\n\t\t\t\t\t\t\t\t\t\t\t\t\t0, NULL);\n\tMaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps);\n\n\tpEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxDesiredRate, MaxSupportedRate);\n\n\tset_entry_phy_cfg(pAd, pEntry);\n\n\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\tpEntry->MinHTPhyMode.field.BW = BW_20;\n\t\t\t\t\n#ifdef DOT11_N_SUPPORT\n\tpEntry->HTCapability.MCSSet[0] = 0;\n\tpEntry->HTCapability.MCSSet[1] = 0;\n\tpEntry->HTCapability.MCSSet[2] = 0;\n\n\t/* If this Entry supports 802.11n, upgrade to HT rate. */\n\tif ((HtCapabilityLen != 0) && WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tUCHAR\tj, bitmask; /*k,bitmask; */\n\t\tCHAR    ii;\n\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS - Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\t\tPRINT_MAC(pEntry->Addr)));\n\n\t\tif ((pHtCapability->HtCapInfo.GF) &&\n\t\t\t(pAd->CommonCfg.DesiredHtPhy.GF) &&\n\t\t\t(pAd->StaActive.SupportedHtPhy.GF))\n\t\t{\n\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;\n\t\t}\n\t\telse\n\t\t{\t\n\t\t\tpEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;\n\t\t\tpAd->MacTab.fAnyStationNonGF = TRUE;\n\t\t\tpAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;\n\t\t}\n\n\t\tif ((pHtCapability->HtCapInfo.ChannelWidth) &&\n\t\t\t(pAd->CommonCfg.DesiredHtPhy.ChannelWidth))\n\t\t{\n\t\t\tpEntry->MaxHTPhyMode.field.BW= BW_40;\n\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(pHtCapability->HtCapInfo.ShortGIfor40));\n\t\t}\n\t\telse\n\t\t{\t\n\t\t\tpEntry->MaxHTPhyMode.field.BW = BW_20;\n\t\t\tpEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(pHtCapability->HtCapInfo.ShortGIfor20));\n\t\t\tpAd->MacTab.fAnyStation20Only = TRUE;\n\t\t}\n\n\t\t/* find max fixed rate */\n\t\tfor (ii = 23; ii >= 0; ii--) /* 3*3 */\n\t\t{\n\t\t\tj = ii/8;\n\t\t\tbitmask = (1<<(ii-(j*8)));\n\t\t\tif ( (pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j]&bitmask) && (pHtCapability->MCSSet[j]&bitmask))\n\t\t\t{\n\t\t\t\tpEntry->MaxHTPhyMode.field.MCS = ii;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (ii==0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO)\n\t\t\tset_ht_fixed_mcs(pAd, pEntry, pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.HTPhyMode.field.MCS);\n\n\t\tpEntry->MaxHTPhyMode.field.STBC = (pHtCapability->HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));\n\t\tpEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity;\n\t\tpEntry->MaxRAmpduFactor = pHtCapability->HtCapParm.MaxRAmpduFactor;\n\t\tpEntry->MmpsMode = (UCHAR)pHtCapability->HtCapInfo.MimoPs;\n\t\tpEntry->AMsduSize = (UCHAR)pHtCapability->HtCapInfo.AMsduSize;\t\t\t\t\n\t\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\t\tif (pHtCapability->HtCapInfo.ShortGIfor20)\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE);\n\t\tif (pHtCapability->HtCapInfo.ShortGIfor40)\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE);\n\t\tif (pHtCapability->HtCapInfo.TxSTBC)\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE);\n\t\tif (pHtCapability->HtCapInfo.RxSTBC)\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE);\n\t\tif (pHtCapability->ExtHtCapInfo.PlusHTC)\t\t\t\t\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE);\n\t\tif (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport)\t\t\t\t\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);\t\n\t\tif (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03)\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);\t\t\n\n\t\tNdisMoveMemory(&pEntry->HTCapability, pHtCapability, sizeof(HT_CAPABILITY_IE));\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tNdisZeroMemory(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE));\n\t\tCLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"TDLS - Receive Peer Legacy STA \\n\"));\n\t}\n\n\tpEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;\n\n\tif ((pHtCapability->HtCapInfo.ChannelWidth) &&\n\t\t(pAd->CommonCfg.DesiredHtPhy.ChannelWidth) &&\n\t\t(pAd->StaActive.SupportedHtPhy.ChannelWidth))\n\t{\n\t\tpEntry->HTPhyMode.field.BW= BW_40;\n\t}\n\telse\n\t{\n\t\tpEntry->HTPhyMode.field.BW= BW_20;\n\t}\n\n\n\tpEntry->CurrTxRate = pEntry->MaxSupportedRate;\n\n\tif (pAd->StaCfg.bAutoTxRateSwitch == TRUE)\n\t{\n\t\tUCHAR TableSize = 0;\n\n\t\tMlmeSelectTxRateTable(pAd, pEntry, &pEntry->pTable, &TableSize, &pEntry->CurrTxRateIndex);\n\t\tpEntry->bAutoTxRateSwitch = TRUE;\n\t}\n\telse\n\t{\n\t\tpEntry->HTPhyMode.field.MODE\t= pAd->StaCfg.HTPhyMode.field.MODE;\n\t\tpEntry->HTPhyMode.field.MCS\t= pAd->StaCfg.HTPhyMode.field.MCS;\n\t\tpEntry->bAutoTxRateSwitch = FALSE;\n\n\t\tRTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);\n\t}\n\n\tpEntry->RateLen = SupportRateLens;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tClassify TDLS message type\n\n\tArguments:\n\t\tTDLSActionType\t\tValue of TDLS message type\n\t\tMsgType\t\t\t\tInternal Message definition for MLME state machine\n\t\t\n\tReturn Value:\n\t\tTRUE\t\tFound appropriate message type\n\t\tFALSE\t\tNo appropriate message type\n\t\t\t\n\t========================================================================\n*/\nBOOLEAN\nTDLS_MsgTypeSubst(\n\tIN\tUCHAR\tTDLSActionType,\n\tOUT\tINT\t\t*MsgType)\n{\n\tswitch (TDLSActionType)\n\t{\n\t\tcase TDLS_ACTION_CODE_SETUP_REQUEST:\n\t\t\t*MsgType = MT2_PEER_TDLS_SETUP_REQ;\n\t\t\tbreak;\n        case TDLS_ACTION_CODE_SETUP_RESPONSE:\n            *MsgType = MT2_PEER_TDLS_SETUP_RSP;\n\t\t\tbreak;\n        case TDLS_ACTION_CODE_SETUP_CONFIRM:\n            *MsgType = MT2_PEER_TDLS_SETUP_CONF;\n\t\t\tbreak;\n        case TDLS_ACTION_CODE_TEARDOWN:\n            *MsgType = MT2_PEER_TDLS_TEAR_DOWN;\n\t\t\tbreak;\n\t\tcase TDLS_ACTION_CODE_DISCOVERY_REQUEST:\n\t\t\t*MsgType = MT2_PEER_TDLS_DISCOVER_REQ;\n\t\t\tbreak;\n\t\tcase TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION: /* for TDLS UAPSD */\n\t\t\t*MsgType = MT2_PEER_TDLS_TRAFFIC_IND;\n\t\t\tbreak;\n\t\tcase TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE: /* for TDLS UAPSD */\n\t\t\t*MsgType = MT2_PEER_TDLS_TRAFFIC_RSP;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS_MsgTypeSubst : unsupported TDLS Action Type(%d); \\n\", TDLSActionType));\n\t\t\treturn FALSE;\t\t\n\t}\t\n\n\treturn TRUE;\n}\n\n/*\n    ==========================================================================\n    Description:\n\t\tCheck whether the received frame is TDLS frame.\n\n\tArguments:\n\t\tpAd\t\t\t\t-\tpointer to our pAdapter context\t\t\t\n\t\tpData\t\t\t-\tthe received frame\n\t\tDataByteCount \t-\tthe received frame's length\t\t\t\t\n       \n    Return:\n         TRUE \t\t\t-\tThis frame is TDLS frame\n         FALSE \t\t\t-\totherwise\n    ==========================================================================\n*/\nBOOLEAN TDLS_CheckTDLSframe(\n    IN PRTMP_ADAPTER    pAd,\n    IN PUCHAR           pData,\n    IN ULONG            DataByteCount)\n{\n    if(DataByteCount < (LENGTH_802_1_H + LENGTH_TDLS_H))\n        return FALSE;\n\n\n\t/* LLC Header(6) + TDLS Ethernet Type(2) + Protocol(1) + Category(1) */\n\tif (!NdisEqualMemory(TDLS_LLC_SNAP_WITH_CATEGORY, pData, LENGTH_802_1_H + 2)\n#ifdef WFD_SUPPORT\n\t\t&& !NdisEqualMemory(TDLS_LLC_SNAP_WITH_WFD_CATEGORY, pData, LENGTH_802_1_H + 2)\n#endif /* WFD_SUPPORT */\n\t\t)\n\t\treturn FALSE;\n\n\t\n    return TRUE;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID TDLS_CntlOidTDLSRequestProc(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_802_11_TDLS\t\t\tpTDLS = (PRT_802_11_TDLS)Elem->Msg;\n\tMLME_TDLS_REQ_STRUCT\tMlmeTdlsReq;\n\tUSHORT\t\tReason = REASON_UNSPECIFY;\n\tBOOLEAN\t\tTimerCancelled;\n\tINT\t\t\tIdx, i;\n\t\n\tDBGPRINT(RT_DEBUG_TRACE,(\"CNTL - TDLS_CntlOidTDLSRequestProc set %02x:%02x:%02x:%02x:%02x:%02x with Valid=%d, Status=%d\\n\",\n\t\tpTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2], pTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5],\n\t\tpTDLS->Valid, pTDLS->Status));\n\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"CNTL - TDLS Capable disable !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif (!INFRA_ON(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"CNTL - STA do not connect to AP !!!\\n\"));\n\t\treturn;\n\t}\n\n#ifdef WFD_SUPPORT\n\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t(!pAd->StaCfg.TdlsInfo.bAcceptWeakSecurity) &&\n\t\t((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) ||\n\t\t\t(pAd->StaCfg.WepStatus != Ndis802_11Encryption3Enabled)))\n\t{\n\t\tpAd->StaCfg.WfdCfg.TdlsSecurity = WFD_TDLS_WEAK_SECURITY;\n\t\treturn;\n\t}\n#endif /* WFD_SUPPORT */\n\t\t\n\tIdx = TDLS_SearchLinkId(pAd, pTDLS->MacAddr);\n\t\n\tif (Idx == -1) /* not found and the entry is not full */\n\t{\n\t\tif (pTDLS->Valid) \n\t\t{\n\t\t\t/* 1. Enable case, start TDLS setup procedure */\n\t\t\tfor (i = 0; i < MAX_NUM_OF_TDLS_ENTRY; i++)\n\t\t\t{\n\t\t\t\tif (!pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.TdlsInfo.TDLSEntry[i], pTDLS, sizeof(RT_802_11_TDLS_UI));\n\t\t\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[i], Reason, FALSE);\n\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\t\t\tMT2_MLME_TDLS_SETUP_REQ,\n\t\t\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t\t\t0);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"CNTL - TDLS setup case\\n\"));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"CNTL - TDLS  do not find vaild entry !!!!\\n\"));\n\t\t\t}\t\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"CNTL - TDLS not changed in Idx = -1 (Valid=%d)\\n\", pTDLS->Valid));\n\n\t}\n\telse  if (Idx == MAX_NUM_OF_TDLS_ENTRY)\t\t/* not found and full */\n\t{\n\t\tif (pTDLS->Valid) \n\t\t{\n\t\t\t/* 2. table full, cancel the non-finished entry and restart a new one */\n\t\t\tfor (i = 0; i < MAX_NUM_OF_TDLS_ENTRY; i++)\n\t\t\t{\n\t\t\t\tif ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) &&(pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status < TDLS_MODE_CONNECTED))\n\t\t\t\t{\n\t\t\t\t\t/* update mac case */\n\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsInfo.TDLSEntry[i].Timer, &TimerCancelled);\n\t\t\t\t\tNdisMoveMemory(&pAd->StaCfg.TdlsInfo.TDLSEntry[i], pTDLS, sizeof(RT_802_11_TDLS_UI));\n\t\t\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[i], Reason, FALSE);\n\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\t\t\tMT2_MLME_TDLS_SETUP_REQ,\n\t\t\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t\t\t0);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"CNTL - TDLS restart case\\n\"));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n\t\telse\n\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"CNTL - TDLS not changed in Idx = MAX_NUM_OF_TDLS_ENTRY (Valid=%d)\\n\", pTDLS->Valid));\n\t}\n\telse\t/* found one in entry */\n\t{\n#ifdef WFD_SUPPORT\n\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[Idx].WfdEntryInfo.wfd_PC == WFD_PC_P2P)\n\t\t{\n\t\t\tpAd->StaCfg.WfdCfg.PeerPC = WFD_PC_P2P;\n\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"CNTL - Peer TDLS PC is P2P\\n\"));\n\t\t}\n\t\telse\n#endif /* WFD_SUPPORT */\n\t\tif ((!pTDLS->Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Status >= TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\t/* 3. Disable TDLS link case, just tear down TDLS link */\n\t\t\tReason = TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON;\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Valid\t= FALSE;\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Status\t= TDLS_MODE_NONE;\n\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[Idx], Reason, FALSE);\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\tMT2_MLME_TDLS_TEAR_DOWN,\n\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t0);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"CNTL - start tear down procedure\\n\"));\n\t\t}\n\t\telse if ((pTDLS->Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Status >= TDLS_MODE_CONNECTED)) \n\t\t{\n\t\t\t/* 4. re-setup case, tear down old link and re-start TDLS setup procedure */\n\t\t\tReason = TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON;\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Valid\t= FALSE;\n\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Status\t= TDLS_MODE_NONE;\n\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[Idx], Reason, FALSE);\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\tMT2_MLME_TDLS_TEAR_DOWN,\n\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t0);\n\t\t\n\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Timer, &TimerCancelled);\n\t\t\tNdisMoveMemory(&pAd->StaCfg.TdlsInfo.TDLSEntry[Idx], pTDLS, sizeof(RT_802_11_TDLS_UI));\n\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[Idx], Reason, FALSE);\n\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\tMT2_MLME_TDLS_SETUP_REQ,\n\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t0);\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"CNTL - TDLS retry setup procedure\\n\"));\n\t\t}\n\t\telse\n\t\t{\n#ifdef WFD_SUPPORT\n\t\t\tif (pAd->StaCfg.WfdCfg.bWfdEnable)\n\t\t\t{\n\t\t\t\t/* WFD will send TDLS tunneled request and receive reponse frame,\n\t\t\t\t * this will add TDLS entry to TDLS table */\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Timer, &TimerCancelled);\n\t\t\t\tNdisMoveMemory(&pAd->StaCfg.TdlsInfo.TDLSEntry[Idx], pTDLS, sizeof(RT_802_11_TDLS_UI));\n\t\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[Idx], Reason, FALSE);\n\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\t\tMT2_MLME_TDLS_SETUP_REQ,\n\t\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t\t0);\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"CNTL - TDLS not changed in entry - %d - Valid=%d, Status=%d\\n\",\n\t\t\t\tIdx, pAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Valid, pAd->StaCfg.TdlsInfo.TDLSEntry[Idx].Status));\n\t\t}\n\t}\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\n\n/* Not found and full : return MAX_NUM_OF_TDLS_ENTRY\n *  not found and the entry is not full : return -1\n */\nINT TDLS_SearchLinkId(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPUCHAR\t\t\tpAddr)\n{\n\tINT\t\ti = 0;\n\tUCHAR\tempty = 0;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\t\n\tfor (i = 0; i < MAX_NUM_OF_TDLS_ENTRY; i++)\n\t{\n\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[i];\n\t\tif (!pTDLS->Valid)\n\t\t\tempty |= 1;\n\t\t\n\t\tif (pTDLS->Valid && MAC_ADDR_EQUAL(pAddr, pTDLS->MacAddr))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"TDLS_SearchLinkId - Find Link ID with Peer Address %02x:%02x:%02x:%02x:%02x:%02x(%d) \\n\", \n            \tpAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tif (empty == 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"TDLS_SearchLinkId -  not found and full\\n\"));\n\t\t\treturn MAX_NUM_OF_TDLS_ENTRY;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"TDLS_SearchLinkId -  not found\\n\"));\n\t\t\treturn -1;\n\t\t}\t\n\t}\n\n\treturn i;\n}\n\n/*\n\t==========================================================================\n\tDescription:\n\n\tIRQL = DISPATCH_LEVEL\n\t\n\t==========================================================================\n*/\nVOID TDLS_MlmeParmFill(\n\tIN PRTMP_ADAPTER pAd, \n\tIN OUT MLME_TDLS_REQ_STRUCT *pTdlsReq,\n\tIN PRT_802_11_TDLS pTdls,\n\tIN USHORT Reason,\n\tIN BOOLEAN IsViaAP) \n{\n\tpTdlsReq->pTDLS = pTdls;\n\tpTdlsReq->Reason = Reason;\n\tpTdlsReq->IsViaAP = IsViaAP;\n}\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tIt is used to derive the TDLS Peer Key and its identifier TPK-Name.\n\t\t(IEEE 802.11z/D4.0, 8.5.9.1)\n\t\t\n\tArguments:\n\n\tReturn Value:\n\n\tNote:\n\t\tTPK = KDF-256(0, \"TDLS PMK\", min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || min(SNonce, ANonce) || max(SNonce, ANonce) || BSSID || N_KEY)\n\t\tTPK-Name = Truncate-128(SHA-256(min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || min(SNonce, ANonce) || max(SNonce, ANonce) || BSSID || 256))\n\t========================================================================\n*/\nVOID TDLS_FTDeriveTPK(\n\tIN\tPUCHAR \tmac_i,\n\tIN\tPUCHAR \tmac_r,\n\tIN\tPUCHAR \ta_nonce,\n\tIN\tPUCHAR \ts_nonce,\n\tIN\tPUCHAR \tbssid,\n\tIN\tUINT\tkey_len,\n \tOUT\tPUCHAR\ttpk,\n\tOUT\tPUCHAR\ttpk_name)\n{\t\n\tUCHAR\ttemp_result[64];\n\tUCHAR   context[128];\n\tUINT    c_len=0; \n\tUCHAR\ttemp_var[32];\n\t/*UINT\tkey_len = LEN_PMK; */\n\t//USHORT\tlen_in_bits = (key_len << 3) + 128;\n\tUCHAR\tTPK_KEY_INPUT[LEN_PMK];\n\n\t/* ================================ */\n\t/* \t\tTPK-Key-Input derivation \t*/\n\t/* ================================ */\n\t/*\n\t\tRefer to IEEE 802.11z-8.5.9.1\n\t\tTPK-Key-Input = \n\t\t\tSHA-256(min (SNonce, ANonce) || max (SNonce, ANonce)) \n\t */\n\n\t/* Zero the context firstly */\n\tNdisZeroMemory(context, 128);\n\tc_len = 0;\n\n\t/* concatenate min(SNonce, ANonce) with 32-octets */\n\tif (RTMPCompareMemory(s_nonce, a_nonce, 32) == 1)\n\t\tNdisMoveMemory(&context[c_len], a_nonce, 32);\n\telse\n\t\tNdisMoveMemory(&context[c_len], s_nonce, 32);\n\tc_len += 32;\n\t\n\t/* concatenate max(SNonce, ANonce) with 32-octets */\n\tif (RTMPCompareMemory(s_nonce, a_nonce, 32) == 1)\n\t\tNdisMoveMemory(&context[c_len], s_nonce, 32);\n\telse\n\t\tNdisMoveMemory(&context[c_len], a_nonce, 32);\n\tc_len += 32;\n\n\t/* Zero key material */\n\tNdisZeroMemory(TPK_KEY_INPUT, LEN_PMK);\t\n\t\n\tRT_SHA256(context, c_len, TPK_KEY_INPUT);\n\n\t/* =============================== */\n\t/* \t\tTPK derivation */\n\t/* =============================== */\n\n\t/* construct the concatenated context for TPK */\n\t/* min(MAC_I, MAC_R)\t(6 bytes) */\n\t/* max(MAC_I, MAC_R)\t(6 bytes) */\n\t/* BSSID\t\t\t\t(6 bytes) */\n\t/* Number of Key in bits(2 bytes) */\n\n\t/* Initial the related parameter */\n\tNdisZeroMemory(temp_result, 64);\n\tNdisZeroMemory(context, 128);\n\tNdisZeroMemory(temp_var, 32);\n\tc_len = 0;\n\n\t/* concatenate min(MAC_I, MAC_R) with 6-octets */\n\tif (RTMPCompareMemory(mac_i, mac_r, 6) == 1)\n\t\tNdisMoveMemory(temp_var, mac_r, 6);\n\telse\n\t\tNdisMoveMemory(temp_var, mac_i, 6);\n    NdisMoveMemory(&context[c_len], temp_var, 6);\n\tc_len += 6;\n\n\t/* concatenate max(MAC_I, MAC_R) with 6-octets */\n\tif (RTMPCompareMemory(mac_i, mac_r, 6) == 1)\n\t\tNdisMoveMemory(temp_var, mac_i, 6);\n\telse\n\t\tNdisMoveMemory(temp_var, mac_r, 6);\n    NdisMoveMemory(&context[c_len], temp_var, 6);\n\tc_len += 6;\n\n\t/* concatenate the BSSID with 6-octets */\n\tNdisMoveMemory(&context[c_len], bssid, MAC_ADDR_LEN);\n\tc_len += MAC_ADDR_LEN;\n\n\t/* concatenate the N_KEY with 2-octets */\n\t//NdisMoveMemory(&context[c_len], &len_in_bits, 2);\n\t//c_len += 2;\n\t\n\t/*hex_dump(\"TDLS_FTDeriveTPK\", context, 128); */\n\n\t/* Calculate a key material through FT-KDF */\n\tKDF(TPK_KEY_INPUT, \n\t\t\tLEN_PMK, \n\t\t\t(PUCHAR)\"TDLS PMK\", \n\t\t\t8, \n\t\t\tcontext, \n\t\t\tc_len, \n\t\t\ttemp_result, \n\t\t\t(key_len + 16));\n\tNdisMoveMemory(tpk, temp_result, (key_len + 16));\n\n\thex_dump(\"TPK \", tpk , (key_len + 16));\n\n\n\t/* =============================== */\n\t/* \t\tTPK-Name derivation */\n\t/* =============================== */\n\n\t/* construct the concatenated context for TPK-Name */\n\t/* min(MAC_I, MAC_R)\t(6 bytes) */\n\t/* max(MAC_I, MAC_R)\t(6 bytes) */\n\t/* min(SNonce, ANonce)\t(32 bytes) */\n\t/* max(SNonce, ANonce)\t(32 bytes) */\n\t/* BSSID\t\t\t\t(6 bytes) */\n\t/* Number of Key in bits(2 bytes) */\n\n\t/* The context is the same as the contxex of TPK. */\n\t\n\t/* Initial the related parameter */\n\tNdisZeroMemory(temp_result, 64);\n\n\t/* derive TPK-Name */\n\tRT_SHA256(context, c_len, temp_result);\n\tNdisMoveMemory(tpk_name, temp_result, LEN_PMK_NAME);\n\n\thex_dump(\"TPK-Name \", tpk_name, LEN_PMK_NAME);\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN MlmeTdlsReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n    IN VOID *Msg, \n    IN ULONG MsgLen,\n    OUT PRT_802_11_TDLS *pTDLS,\n    OUT PUINT16 pReason,\n    OUT BOOLEAN *pIsViaAP)\n{\n\tMLME_TDLS_REQ_STRUCT *pInfo;\n\n    pInfo = (MLME_TDLS_REQ_STRUCT *)Msg;\n    \n\t*pTDLS = pInfo->pTDLS;\n\t*pReason = pInfo->Reason;\n\t*pIsViaAP = pInfo->IsViaAP;/* default = FALSE, not pass through AP */\n\n\treturn TRUE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsSetupReqSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT UCHAR\t*pSupRateLen,\t\n\tOUT UCHAR\tSupRate[],\n\tOUT UCHAR\t*pExtRateLen,\n\tOUT UCHAR\tExtRate[],\n\tOUT BOOLEAN *pbWmmCapable,\n\tOUT UCHAR\t*pQosCapability,\n\tOUT UCHAR\t*pHtCapLen,\n\tOUT HT_CAPABILITY_IE\t*pHtCap,\n\tOUT UCHAR\t*pTdlsExtCapLen,\n\tOUT EXT_CAP_INFO_ELEMENT\t*pTdlsExtCap,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\t//PFRAME_802_11\tpFrame = (PFRAME_802_11)Msg;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength = 0;\n\n\t// Init output parameters\n\t*pSupRateLen = 0;\n\t*pExtRateLen = 0;\n\t*pCapabilityInfo = 0;\n\t*pHtCapLen = 0;\n\t*pTdlsExtCapLen = 0;\n\t*pbWmmCapable = FALSE;\n\t*pQosCapability = 0; // default: no IE_QOS_CAPABILITY found\n\t*pRsnLen = 0;\n\t*pFTLen = 0;\n\t*pTILen = 0;\n\t*pLinkIdentLen = 0;\n\t\n\t// Message contains 802.11 header (24 bytes), LLC_SNAP (8 bytes), TDLS Action header(3 bytes) and Payload (variable)\n\tif (MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H)) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity --> Invaild packet length - (action header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\n\t// Offset to Dialog Token\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\t*pToken = *Ptr;\n\n\t// Offset to Capability\n\tPtr += 1;\n\tRemainLen -= 1;\n\t//Length += 1;\n\n\t// Get capability info from payload and advance the pointer\n\tif (RemainLen < 2) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity --> Invaild packet length - (capability) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\tNdisMoveMemory((PUCHAR)pCapabilityInfo, Ptr, 2);\n\n\t// Offset to other elements\n\tPtr += 2;\n\tRemainLen -= 2;\n\n\t// Add for 2 necessary EID field check\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t// get variable fields from payload and advance the pointer\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\t\t\t\t\n\t\t\tcase IE_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(SupRate, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pSupRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase IE_COUNTRY:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pExtRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_SUPP_CHANNELS:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_RSN:\n\t\t\t\tif ((pEid->Len + 2) < 64)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(RsnIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pRsnLen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_CAPABILITY:\n\t\t\t\tif (pEid->Len >= sizeof(EXT_CAP_INFO_ELEMENT))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pTdlsExtCap, &pEid->Octet[0], sizeof(EXT_CAP_INFO_ELEMENT));\n\t\t\t\t\t*pTdlsExtCapLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_QOS_CAPABILITY:\n\t\t\t\tif (pEid->Len == 1)\n\t\t\t\t{\n\t\t\t\t\t*pbWmmCapable = TRUE;\n\t\t\t\t\t*pQosCapability = *(pEid->Octet);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_FT_FTIE:\n\t\t\t\tif ((pEid->Len) == sizeof(FT_FTIE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(FTIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pFTLen = pEid->Len + 2;\n\t\t\t\t}\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_FT_TIMEOUT_INTERVAL:\n\t\t\t\tif ((pEid->Len + 2) == 7)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(TIIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pTILen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_SUPP_REG_CLASS:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_HT_CAP:\n\t\t\t\tif (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)\n\t\t\t\t{\n\t\t\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE)  //Note: allow extension.!!\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pHtCap, pEid->Octet, sizeof(HT_CAPABILITY_IE));\n\t\t\t\t\t\t*pHtCapLen = SIZE_HT_CAP_IE;\t// Nnow we only support 26 bytes.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_2040_BSS_COEXIST:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len >= TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t\tNdisMoveMemory(pSA, pLinkIdent->InitiatorAddr, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t// handle WME PARAMTER ELEMENT\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6) && (pEid->Len == 7))\n\t\t\t\t{\n\t\t\t\t\t*pQosCapability = pEid->Octet[6];\n\t\t\t\t\t*pbWmmCapable = TRUE;\n\t\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\t\telse if ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\t\tNdisEqualMemory(pEid->Octet, WIFIDISPLAY_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\thex_dump(\"WFD_IE\", &pEid->Eid, pEid->Len +2);\n\t\t\t\t\tRTMPMoveMemory(pWfdSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t*pWfdSubelementLen = pEid->Len + 2;\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t}\n\n\tif (*pLinkIdentLen == 0)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity --> Invaild packet - (link identifier) \\n\"));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tif (!MAC_ADDR_EQUAL(pLinkIdent->BSSID, pAd->CommonCfg.Bssid))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity --> It's not my BSSID\\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\t\telse if (!MAC_ADDR_EQUAL(pLinkIdent->ResponderAddr, pAd->CurrentAddress))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupReqSanity --> It's not my MAC address\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t// Process in succeed\n\treturn TRUE;\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsSetupRspSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n#ifdef WFD_SUPPORT\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement,\n#endif /* WFD_SUPPORT */\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT UCHAR\t*pSupRateLen,\t\n\tOUT UCHAR\tSupRate[],\n\tOUT UCHAR\t*pExtRateLen,\n\tOUT UCHAR\tExtRate[],\n\tOUT BOOLEAN *pbWmmCapable,\n\tOUT UCHAR\t*pQosCapability,\n\tOUT UCHAR\t*pHtCapLen,\n\tOUT HT_CAPABILITY_IE\t*pHtCap,\n\tOUT UCHAR\t*pTdlsExtCapLen,\n\tOUT EXT_CAP_INFO_ELEMENT\t*pTdlsExtCap,\n\tOUT USHORT\t*pStatusCode,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\t//PFRAME_802_11\tpFrame = (PFRAME_802_11)Msg;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength = 0;\n\n\t// Init output parameters\n\t*pSupRateLen = 0;\n\t*pExtRateLen = 0;\n\t*pCapabilityInfo = 0;\n\t*pHtCapLen = 0;\n\t*pTdlsExtCapLen = 0;\n\t*pbWmmCapable = FALSE;\n\t*pQosCapability= 0; // default: no IE_QOS_CAPABILITY found\n\t*pStatusCode = MLME_SUCCESS;\n\t*pRsnLen = 0;\n\t*pFTLen = 0;\n\t*pTILen = 0;\n\t*pLinkIdentLen = 0;\n\n\t\n\t// Message contains 802.11 header (24 bytes), LLC_SNAP (8 bytes), TDLS Action header(3 bytes) and Payload (variable)\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity --> Invaild packet length - (action header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\n\t// Offset to Status Code\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\t\n\t// Get the value of Status Code from payload and advance the pointer\n\tif (RemainLen < 2)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity --> Invaild packet length - (status code) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\tNdisMoveMemory(pStatusCode, Ptr, 2);\n\n\tif (*pStatusCode != MLME_SUCCESS)\n\t\treturn TRUE;\t// in the end of Setup Response frame\n\n\t// Offset to Dialog Token\n\tPtr\t+= 2;\n\tRemainLen -= 2;\n\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\t*pToken = *Ptr;\n\n\t// Offset to Capability\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\t// Get capability info from payload and advance the pointer\n\tif (RemainLen < 2) \n\t\treturn FALSE;\n\tNdisMoveMemory(pCapabilityInfo, Ptr, 2);\n\n\t// Offset to other elements\n\tPtr += 2;\n\tRemainLen -= 2;\n\n\n\t// Add for 2 necessary EID field check\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t// get variable fields from payload and advance the pointer\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(SupRate, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t*pSupRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase IE_COUNTRY:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(ExtRate, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t*pExtRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_SUPP_CHANNELS:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_RSN:\n\t\t\t\tif ((pEid->Len + 2) < 64)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(RsnIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pRsnLen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_CAPABILITY:\n\t\t\t\tif (pEid->Len >= sizeof(EXT_CAP_INFO_ELEMENT))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pTdlsExtCap, &pEid->Octet[0], sizeof(EXT_CAP_INFO_ELEMENT));\n\t\t\t\t\t*pTdlsExtCapLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_QOS_CAPABILITY:\n\t\t\t\tif (pEid->Len ==  1)\n\t\t\t\t{\n\t\t\t\t\t*pQosCapability = *(pEid->Octet);\n\t\t\t\t\t*pbWmmCapable = TRUE;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_FT_FTIE:\n\t\t\t\tif ((pEid->Len) == sizeof(FT_FTIE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(FTIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pFTLen = pEid->Len + 2;\n\t\t\t\t}\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_FT_TIMEOUT_INTERVAL:\n\t\t\t\tif ((pEid->Len + 2) == 7)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(TIIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pTILen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_SUPP_REG_CLASS:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_HT_CAP:\n\t\t\t\tif (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)\n\t\t\t\t{\n\t\t\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE)  //Note: allow extension.!!\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pHtCap, &pEid->Octet[0], sizeof(HT_CAPABILITY_IE));\n\t\t\t\t\t\t*pHtCapLen = SIZE_HT_CAP_IE;\t// Nnow we only support 26 bytes.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_2040_BSS_COEXIST:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len >= TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t\tNdisMoveMemory(pSA, pLinkIdent->ResponderAddr, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t// handle WME PARAMTER ELEMENT\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6) && (pEid->Len == 7))\n\t\t\t\t{\n\t\t\t\t\t*pQosCapability = pEid->Octet[6];\n\t\t\t\t\t*pbWmmCapable = TRUE;\n\t\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\t\telse if ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\t\tNdisEqualMemory(pEid->Octet, WIFIDISPLAY_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tULONG\tWfdSubelementLen = 0;\n\t\t\t\t\tPUCHAR\tWfdSubelement = NULL;\n\n\t\t\t\t\thex_dump(\"WFD_IE\", &pEid->Eid, pEid->Len +2);\n\t\t\t\t\tRTMPMoveMemory(pWfdSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t*pWfdSubelementLen = pEid->Len + 2;\n\t\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t}\n\n\tif (*pLinkIdentLen == 0)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity --> Invaild packet - (link identifier) \\n\"));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tif (!MAC_ADDR_EQUAL(pLinkIdent->BSSID, pAd->CommonCfg.Bssid))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity --> It's not my BSSID\\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\t\telse if (!MAC_ADDR_EQUAL(pLinkIdent->InitiatorAddr, pAd->CurrentAddress))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupRspSanity --> It's not my MAC address\\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\t}\n\n\t// Process in succeed\n\t*pStatusCode = MLME_SUCCESS;\n\treturn TRUE;\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsSetupConfSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT EDCA_PARM\t*pEdcaParm,\n\tOUT USHORT\t*pStatusCode,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent,\n\tOUT UCHAR\t\t\t*pAddHtInfoLen,\n\tOUT ADD_HT_INFO_IE\t\t*pAddHtInfo)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\t//PFRAME_802_11\tpFrame = (PFRAME_802_11)Msg;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength = 0;\t\n\n\t// Init output parameters\n\t*pCapabilityInfo = 0;\n\t*pStatusCode = MLME_REQUEST_DECLINED;\n\t //pEdcaParm = 0;      // default: no IE_EDCA_PARAMETER found\n\t*pRsnLen = 0;\n\t*pFTLen = 0;\n\t*pTILen = 0;\n\t*pLinkIdentLen = 0;\n\t*pAddHtInfoLen = 0;\n\t\n\t// Message contains 802.11 header (24 bytes), LLC_SNAP (8 bytes), TDLS Action header(3 bytes) and Payload (variable)\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity --> Invaild packet length - (action header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\t// Offset to Status Code\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\t\n\t// Get the value of Status Code from payload and advance the pointer\n\tif (RemainLen < 2)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity --> Invaild packet length - (status code) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\tNdisMoveMemory(pStatusCode, Ptr, 2);\n\n\tif (*pStatusCode != MLME_SUCCESS)\n\t\treturn TRUE;\t// in the end of Setup Response frame\n\n\t// Offset to Dialog Token\n\tPtr\t+= 2;\n\tRemainLen -= 2;\n\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn FALSE;\n\t}\n\n\t*pToken = *Ptr;\n\n\t// Offset to other elements\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t// get variable fields from payload and advance the pointer\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_RSN:\n\t\t\t\tif ((pEid->Len + 2) < 64)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(RsnIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pRsnLen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EDCA_PARAMETER:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\t// handle WME PARAMTER ELEMENT\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))\n\t\t\t\t{\n\t\t\t\t\tPUCHAR ptr;\n\t\t\t\t\tint i;\n\n\t\t\t\t\t// parsing EDCA parameters\n\t\t\t\t\tpEdcaParm->bValid\t\t   = TRUE;\n\t\t\t\t\tpEdcaParm->bQAck\t\t   = FALSE; // pEid->Octet[0] & 0x10;\n\t\t\t\t\tpEdcaParm->bQueueRequest   = FALSE; // pEid->Octet[0] & 0x20;\n\t\t\t\t\tpEdcaParm->bTxopRequest    = FALSE; // pEid->Octet[0] & 0x40;\n\t\t\t\t\t//pEdcaParm->bMoreDataAck\t = FALSE; // pEid->Octet[0] & 0x80;\n\t\t\t\t\tpEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0xff;\n\t\t\t\t\t//pEdcaParm->bAPSDCapable    = (pEid->Octet[6] & 0x80) ? 1 : 0;\n\t\t\t\t\tptr = &pEid->Octet[8];\n\t\t\t\t\tfor (i=0; i<4; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tUCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX\n\t\t\t\t\t\tpEdcaParm->bACM[aci]  = (((*ptr) & 0x10) == 0x10);\t // b5 is ACM\n\t\t\t\t\t\tpEdcaParm->Aifsn[aci] = (*ptr) & 0x0f;\t\t\t\t // b0~3 is AIFSN\n\t\t\t\t\t\tpEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f;\t\t\t // b0~4 is Cwmin\n\t\t\t\t\t\tpEdcaParm->Cwmax[aci] = *(ptr+1) >> 4;\t\t\t\t // b5~8 is Cwmax\n\t\t\t\t\t\tpEdcaParm->Txop[aci]  = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us\n\t\t\t\t\t\tptr += 4; // point to next AC\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_FT_FTIE:\n\t\t\t\tif ((pEid->Len) == sizeof(FT_FTIE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(FTIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pFTLen = pEid->Len + 2;\n\t\t\t\t}\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_FT_TIMEOUT_INTERVAL:\n\t\t\t\tif ((pEid->Len + 2) == 7)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(TIIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pTILen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_ADD_HT:\n\t\t\tcase IE_ADD_HT2:\n\t\t\t\tif (pEid->Len >= sizeof(ADD_HT_INFO_IE))\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\t// This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only\n\t\t\t\t\t// copy first sizeof(ADD_HT_INFO_IE)\n\t\t\t\t\tNdisMoveMemory(pAddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE));\n\t\t\t\t\t*pAddHtInfoLen = SIZE_ADD_HT_INFO_IE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity - wrong IE_ADD_HT. \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len >= TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t\tNdisMoveMemory(pSA, pLinkIdent->InitiatorAddr, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t}\n\n\n\tif (*pLinkIdentLen == 0)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity --> Invaild packet - (link identifier) \\n\"));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tif (!MAC_ADDR_EQUAL(pLinkIdent->BSSID, pAd->CommonCfg.Bssid))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity --> It's not my BSSID\\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\t\telse if (!MAC_ADDR_EQUAL(pLinkIdent->ResponderAddr, pAd->CurrentAddress))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsSetupConfSanity --> It's not my MAC address\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t// Process in succeed\n\t*pStatusCode = MLME_SUCCESS;\n\n\treturn TRUE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsTearDownSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen,\n\tOUT UCHAR\t*pSA,\n\tOUT\tBOOLEAN *pIsInitator,\n\tOUT USHORT *pReasonCode,\n\tOUT UCHAR\t*pFTLen,    \n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength = 0;\n\n\t// Init output parameters\n\t*pReasonCode = 0;\n\t*pFTLen = 0 ;\n\n\t// Message contains 802.11 header (24 bytes), LLC_SNAP (8 bytes), TDLS Action header(3 bytes) and Payload (variable)\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsTearDownSanity --> Invaild packet length - (cation header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\t// Offset to Reason Code\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\t\n\t// Get the value of Reason Code from payload and advance the pointer\n\tif (RemainLen < 2) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsTearDownSanity --> Invaild packet length - (reason code) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\tNdisMoveMemory(pReasonCode, Ptr, 2);\n\n\n\t// Offset to other elements\n\tPtr += 2;\n\tRemainLen -= 2;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t// get variable fields from payload and advance the pointer\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_FT_FTIE:\n\t\t\t\tif ((pEid->Len) == sizeof(FT_FTIE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(FTIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pFTLen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len == TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t\tNdisMoveMemory(pSA, pLinkIdent->ResponderAddr, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsTearDownSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \n\t}\n\n\tif (*pLinkIdentLen == 0)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsTearDownSanity --> Invaild packet - (link identifier) \\n\"));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tif (!MAC_ADDR_EQUAL(pLinkIdent->BSSID, pAd->CommonCfg.Bssid))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsTearDownSanity --> It's not my BSSID\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Check if my MAC address and then find out SA\n\t\tif (!MAC_ADDR_EQUAL(pAd->CurrentAddress, pLinkIdent->InitiatorAddr))\n\t\t{\n\t\t\tif (!MAC_ADDR_EQUAL(pAd->CurrentAddress, pLinkIdent->ResponderAddr))\n\t\t\t{\n\t\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsTearDownSanity --> It's not my Address\\n\"));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*pIsInitator = TRUE;\t// peer are Initator.\n\t\t\t\tNdisMoveMemory(pSA, pLinkIdent->InitiatorAddr, MAC_ADDR_LEN);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*pIsInitator = FALSE;\t// peer are not Initator.\n\t\t\tNdisMoveMemory(pSA, pLinkIdent->ResponderAddr, MAC_ADDR_LEN);\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsDiscovReqSanity(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tVOID\t*Msg, \n\tIN\tULONG\tMsgLen,\n\tOUT UCHAR\t*pSA,\n\tOUT UCHAR\t*pToken)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\n\t// Init output parameters\n\t*pToken = 0;\n\t\n\t/*\tMessage contains 802.11 header (24 bytes), LLC_SNAP (8 bytes)\n\t\tTDLS Action header(payload type + category + action)(3 bytes) and Payload (variable)\n\t*/\n\tif (MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + 3)) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (action header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\n\t// Offset to Dialog Token\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + 3);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + 3);\n\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn FALSE;\n\t}\n\n\t*pToken = *Ptr;\n\t\n\t// Offset to Link Identifier\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\t// Get BSSID, SA and DA from payload and advance the pointer\n\tif ((RemainLen < 20) || (Ptr[0] != IE_TDLS_LINK_IDENTIFIER) || (Ptr[1] != 18))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (link identifier) \\n\"));\n\t\treturn FALSE;\n\t}\n\tif (!MAC_ADDR_EQUAL(Ptr+2, pAd->CommonCfg.Bssid))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> It's not my BSSID\\n\"));\n\t\treturn FALSE;\n\t}\t\n\telse if (!MAC_ADDR_EQUAL(Ptr+14, pAd->CurrentAddress))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> It's not my MAC address\\n\"));\n\t\treturn FALSE;\n\t}\t\n\n\tNdisMoveMemory(pSA, Ptr+8, MAC_ADDR_LEN);\n\n\t// Process in succeed\n\treturn TRUE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsDiscovRspSanity(\n\tIN PRTMP_ADAPTER\tpAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n\tOUT UCHAR\t*pToken,\n\tOUT UCHAR\t*pSA,\n\tOUT USHORT\t*pCapabilityInfo,\n\tOUT UCHAR\t*pSupRateLen,\t\n\tOUT UCHAR\tSupRate[],\n\tOUT UCHAR\t*pExtRateLen,\n\tOUT UCHAR\tExtRate[],\n\tOUT UCHAR\t*pHtCapLen,\n\tOUT HT_CAPABILITY_IE\t*pHtCap,\n\tOUT UCHAR\t*pTdlsExtCapLen,\n\tOUT EXT_CAP_INFO_ELEMENT\t*pTdlsExtCap,\n\tOUT UCHAR\t*pRsnLen,\n\tOUT UCHAR\tRsnIe[],\n\tOUT UCHAR\t*pFTLen,\n\tOUT UCHAR\tFTIe[],\n\tOUT UCHAR\t*pTILen,\n\tOUT UCHAR\tTIIe[],\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\t//PFRAME_802_11\tpFrame = (PFRAME_802_11)Msg;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength = 0;\n\n\t// Init output parameters\n\t*pSupRateLen = 0;\n\t*pExtRateLen = 0;\n\t*pCapabilityInfo = 0;\n\t*pHtCapLen = 0;\n\t*pTdlsExtCapLen = 0;\n\t*pRsnLen = 0;\n\t*pFTLen = 0;\n\t*pTILen = 0;\n\t*pLinkIdentLen = 0;\n\n\t// Message contains 802.11 header (24 bytes), public action(2 bytes), TDLS Action header(2 bytes) and Payload (variable)\n\tif (RemainLen < (LENGTH_802_11 + 2 + 2))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovRspSanity --> Invaild packet length - (action header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\n\t// Offset to Dialog Token\n\tPtr\t+= (LENGTH_802_11 + 2 + 2);\n\tRemainLen -= (LENGTH_802_11 + 2 + 2);\n\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovRspSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\t*pToken = *Ptr;\n\n\t// Offset to Capability\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\t// Get capability info from payload and advance the pointer\n\tif (RemainLen < 2) \n\t\treturn FALSE;\n\n\tNdisMoveMemory(pCapabilityInfo, Ptr, 2);\n\n\t// Offset to other elements\n\tPtr += 2;\n\tRemainLen -= 2;\n\n\t// Add for 2 necessary EID field check\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t// get variable fields from payload and advance the pointer\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(SupRate, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t*pSupRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FALSE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase IE_COUNTRY:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_SUPP_RATES:\n\t\t\t\tif (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(ExtRate, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t*pExtRateLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_SUPP_CHANNELS:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_RSN:\n\t\t\t\tif ((pEid->Len + 2) < 64)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(RsnIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pRsnLen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_EXT_CAPABILITY:\n\t\t\t\tif (pEid->Len >= sizeof(EXT_CAP_INFO_ELEMENT))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pTdlsExtCap, &pEid->Octet[0], sizeof(EXT_CAP_INFO_ELEMENT));\n\t\t\t\t\t*pTdlsExtCapLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\n\t\t\tcase IE_FT_FTIE:\n\t\t\t\tif ((pEid->Len) == sizeof(FT_FTIE))\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(FTIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pFTLen = pEid->Len + 2;\n\t\t\t\t}\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_FT_TIMEOUT_INTERVAL:\n\t\t\t\tif ((pEid->Len + 2) == 7)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(TIIe, &pEid->Eid, pEid->Len + 2);\n\t\t\t\t\t*pTILen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_SUPP_REG_CLASS:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_HT_CAP:\n\t\t\t\tif (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)\n\t\t\t\t{\n\t\t\t\t\tif (pEid->Len >= SIZE_HT_CAP_IE)  //Note: allow extension.!!\n\t\t\t\t\t{\n\t\t\t\t\t\tNdisMoveMemory(pHtCap, &pEid->Octet[0], sizeof(HT_CAPABILITY_IE));\n\t\t\t\t\t\t*pHtCapLen = SIZE_HT_CAP_IE;\t// Nnow we only support 26 bytes.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase IE_2040_BSS_COEXIST:\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len >= TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t\tNdisMoveMemory(pSA, pLinkIdent->ResponderAddr, MAC_ADDR_LEN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsDiscovRspSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \t   \n\t}\n\n\tif (*pLinkIdentLen == 0)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovRspSanity --> Invaild packet - (link identifier) \\n\"));\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tif (!MAC_ADDR_EQUAL(pLinkIdent->BSSID, pAd->CommonCfg.Bssid))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovRspSanity --> It's not my BSSID\\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\t\telse if (!MAC_ADDR_EQUAL(pLinkIdent->InitiatorAddr, pAd->CurrentAddress))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovRspSanity --> It's not my MAC address\\n\"));\n\t\t\treturn FALSE;\n\t\t}\t\n\t}\n\n\treturn TRUE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nULONG PeerTdlsBasicSanity(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd, \n\tIN\tVOID\t\t\t\t\t\t*Msg, \n\tIN\tULONG\t\t\t\t\t\tMsgLen,\n\tIN\tBOOLEAN\t\t\t\t\t\tbInitiator,\n\tOUT UCHAR\t\t\t\t\t\t*pToken,\n\tOUT UCHAR\t\t\t\t\t\t*pSA)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\n\t/*\n\t\tMessage contains 802.11 header (24 bytes), LLC_SNAP (8 bytes),\n\t\tTDLS Action header(3 bytes) and Payload (variable)\n\t*/\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + 3)) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsBasicSanity --> \"\n\t\t\t\t\t\"Invaild packet length - (action header) \\n\"));\n\t\treturn 0;\t\n\t}\n\n\t/* Offset to Dialog Token */\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + 3);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + 3);\n\n\t/* Get the value of token from payload and advance the pointer */\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsBasicSanity --> \"\n\t\t\t\t\t\"Invaild packet length - (dialog token) \\n\"));\n\t\treturn 0;\n\t}\t\n\t*pToken = *Ptr;\n\t\n\t/* Offset to Link Identifier */\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\t/* Get BSSID, SA and DA from payload and advance the pointer */\n\tif (RemainLen < 20 || Ptr[0] != IE_TDLS_LINK_IDENTIFIER || Ptr[1] != 18)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsBasicSanity --> \"\n\t\t\t\t\t\"Invaild packet length - (link identifier) \\n\"));\n\t\treturn 0;\n\t}\n\n\tif (!MAC_ADDR_EQUAL(Ptr+2, pAd->CommonCfg.Bssid))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsBasicSanity --> \"\n\t\t\t\t\t\"It's not my BSSID\\n\"));\n\t\treturn 0;\n\t}\n\n\tif (bInitiator)\n\t{\n\t\tif (!MAC_ADDR_EQUAL(Ptr+14, pAd->CurrentAddress))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsBasicSanity --> \"\n\t\t\t\t\t\t\"It's not my MAC address\\n\"));\n\t\t\thex_dump(\"Dst Mac=\", Ptr+14, 6);\n\t\t\treturn 0;\n\t\t}\n\t\tNdisMoveMemory(pSA, Ptr+8, MAC_ADDR_LEN);\n\t}\n\telse\n\t{\n\t\tif (!MAC_ADDR_EQUAL(Ptr+8, pAd->CurrentAddress))\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsBasicSanity --> \"\n\t\t\t\t\t\t\"It's not my MAC address\\n\"));\n\t\t\thex_dump(\"Dst Mac=\", Ptr+8, 6);\n\t\t\treturn 0;\n\t\t}\n\t\tNdisMoveMemory(pSA, Ptr+14, MAC_ADDR_LEN);\n\t}\n\n\t/* Offset to PU Buffer Status */\n\tPtr += 20;\n\tRemainLen -= 20;\n\treturn (MsgLen - RemainLen);\n}\n\n#ifdef WFD_SUPPORT\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN TDLS_PeerTunneledProbeReqRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen, \n\tOUT PUCHAR pAddr2, \n\tOUT CHAR Ssid[], \n\tOUT UCHAR *pSsidLen, \n\tOUT ULONG *Peerip,\n\tOUT UCHAR *pChannel,\n\tOUT ULONG *P2PSubelementLen, \n\tOUT PUCHAR pP2pSubelement,\n\tOUT ULONG *pWfdSubelementLen, \n\tOUT PUCHAR pWfdSubelement)\n{\n\tPFRAME_802_11\t\tpFrame;\n\tPEID_STRUCT         pEid;\n\tULONG\t\t\t\tLength = 0;\n\tBOOLEAN\t\t\t\tbrc = FALSE;\n\tPUCHAR\t\t\t\tPtr;\n\tBOOLEAN\t\t\t\tbFirstP2pOUI = TRUE;\n\tBOOLEAN\t\t\t\tbLastIsP2pOUI = FALSE;\n\tPUCHAR\t\t\t\tpP2PIeConLen = NULL;\t/* pointer to 2 bytes to indicate Contenated length of all P2P IE */\n\tULONG\t\t\t\tP2PIeConLen = 0; \t/*  Contenated length of all P2P IE */\n\tULONG\t\t\tidx;\n\n\tpFrame = (PFRAME_802_11)Msg;\n\tLength = LENGTH_802_11;\n\n\t*P2PSubelementLen = 0;\n#ifdef WFD_SUPPORT\n\t*pWfdSubelementLen = 0;\n#endif /* WFD_SUPPORT */\n\t*pSsidLen = 0;\n\t*Peerip = 0;\n\tCOPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);\n\t\n\tPtr = pFrame->Octet;\n\n\thex_dump(\"TDLS_PeerTunneledProbeReqRspSanity\", Ptr, MsgLen - LENGTH_802_11);\n\t/* LLC+SNAP */\n\tPtr += LENGTH_802_1_H;\n\tLength += LENGTH_802_1_H;\n\n\t/* Payload Type(1) + Category(1) + OU(3) + Frame Body Type(1) */\n\tPtr += 6;\n\tLength += 6;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\tprintk(\"starting parsing form:: %02x %02x %02x %02x\\n\", *Ptr, *(Ptr+1), *(Ptr+2), *(Ptr+3));\n\n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= MsgLen)    \n\t{\n\t\tswitch(pEid->Eid)\n\t\t{\t\t\t\n\t\t\tcase IE_SSID:\n\t\t\t\tbLastIsP2pOUI = FALSE;\n\t\t\t\tif(pEid->Len <= MAX_LEN_OF_SSID)\n\t\t\t\t{\n\t\t\t\t\tRTMPMoveMemory(Ssid, pEid->Octet, pEid->Len);\n\t\t\t\t\t*pSsidLen = pEid->Len;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IE_VENDOR_SPECIFIC:\n\t\t\t\tbLastIsP2pOUI = FALSE;\n\t\t\t\t/* Check the OUI version, filter out non-standard usage */\n\t\t\t\tif (NdisEqualMemory(pEid->Octet, WPS_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t\t*P2PSubelementLen = pEid->Len +2;\n\t\t\t\t\t}\n\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+2)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, pEid->Len+2);\n\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 111 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__ ,((*P2PSubelementLen) + (pEid->Len+2))));\n\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (NdisEqualMemory(pEid->Octet, P2POUIBYTE, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\tbrc = TRUE;\n\t\t\t\t\tbLastIsP2pOUI = TRUE;\n\t\t\t\t\t/* If this is the first P2P OUI. Then also append P2P OUI. */\n\t\t\t\t\tif (bFirstP2pOUI == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Althought this is first P2P IE. */\n\t\t\t\t\t\t/* still need to Check *P2PSubelementLen, because *P2PSubelementLen also includes WPS IE. */\n\t\t\t\t\t\tif (*P2PSubelementLen == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement, &pEid->Eid, 2);\n\t\t\t\t\t\t\t*(pP2pSubelement + 2) = 0;\n\t\t\t\t\t\t\t/* Make one more byte for P2P accumulated length. */\n\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + 3, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t\t\tpP2PIeConLen = pP2pSubelement + *P2PSubelementLen + 1;\n\t\t\t\t\t\t\t*P2PSubelementLen = (pEid->Len + 3);\n\t\t\t\t\t\t\tP2PIeConLen = pEid->Len;\t/* Real P2P IE length is Len. */\n\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\"SYNC -1-1 P2PIeConLen  = %ld\\n\", P2PIeConLen));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (*P2PSubelementLen > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len+3)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Eid, 2);\n\t\t\t\t\t\t\t\t*(pP2pSubelement + *P2PSubelementLen + 2) = 0;\n\t\t\t\t\t\t\t\t/* Make one more byte for P2P accumulated length. */\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen + 3, &pEid->Octet[0], pEid->Len);\n\t\t\t\t\t\t\t\tpP2PIeConLen = pP2pSubelement + *P2PSubelementLen + 1;\n\t\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len+3);\n\t\t\t\t\t\t\t\t/* bFirstP2pOUI is TURE. So use =   */\n\t\t\t\t\t\t\t\tP2PIeConLen = pEid->Len;\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_INFO, (\" -1-2 P2PIeConLen  = %ld\\n\", P2PIeConLen));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 222 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__ ,((*P2PSubelementLen) + (pEid->Len+3))));\n\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbFirstP2pOUI = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (bLastIsP2pOUI == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* If this is not the first P2P OUI. Then don't append P2P OUI. */\n\t\t\t\t\t\t/* because our parse function doesn't need so many P2P OUI. */\n\t\t\t\t\t\tif ((*P2PSubelementLen > 0) && (pEid->Len > 4))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (((*P2PSubelementLen) + (pEid->Len-4)) <= MAX_VIE_LEN)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tRTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &pEid->Octet[4], pEid->Len-4);\n\t\t\t\t\t\t\t\t*P2PSubelementLen += (pEid->Len-4);\n\t\t\t\t\t\t\t\tP2PIeConLen += (pEid->Len - 4);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: ERROR!! 333 Sum of P2PSubelementLen= %lu, > MAX_VIE_LEN !!\\n\", __FUNCTION__ ,((*P2PSubelementLen) + (pEid->Len-4))));\n\t\t\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\t\tNdisEqualMemory(pEid->Octet, WIFIDISPLAY_OUI, 4) && (pEid->Len >= 4))\n\t\t\t\t{\n\t\t\t\t\thex_dump(\"WFD_IE\", &pEid->Eid, pEid->Len +2);\n\t\t\t\t\tRTMPMoveMemory(pWfdSubelement, &pEid->Eid, pEid->Len +2);\n\t\t\t\t\t*pWfdSubelementLen = pEid->Len + 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault : \n\t\t\t\tbLastIsP2pOUI = FALSE;\n\t\t\t\tbreak;\n\n\t\t}\n\t\tLength = Length + 2 + pEid->Len;  /* Eid[1] + Len[1]+ content[Len] */\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);        \n\t\n\t}\n\n\tif ((P2PIeConLen != 0) && (pP2PIeConLen != NULL))\n\t{\n\t\t*pP2PIeConLen = (UCHAR)(P2PIeConLen%256);\n\t\t*(pP2PIeConLen+1) = (UCHAR)(P2PIeConLen/256);\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"  - 3 P2PIeConLen  = %ld. /256 = %ld. *P2PSubelementLen = %ld \\n\", P2PIeConLen, (P2PIeConLen/256), *P2PSubelementLen));\n\t\tDBGPRINT(RT_DEBUG_INFO, (\"  -  %x %x \\n\", *pP2PIeConLen,  *(pP2PIeConLen+1) ));\n\t\tfor (idx = 0; idx < (*P2PSubelementLen);)\n\t\t{\n\t\t\tDBGPRINT_RAW(RT_DEBUG_INFO, (\"%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-\", \n\t\t\t\t*(pP2pSubelement+idx), *(pP2pSubelement+idx+1), *(pP2pSubelement+idx+2), *(pP2pSubelement+idx+3)\n\t\t\t\t,*(pP2pSubelement+idx+4) ,*(pP2pSubelement+idx+5) ,*(pP2pSubelement+idx+6),*(pP2pSubelement+idx+7)\n\t\t\t\t,*(pP2pSubelement+idx+8),*(pP2pSubelement+idx+9),*(pP2pSubelement+idx+10),*(pP2pSubelement+idx+11)));\n\t\t\t\n\t\t\t idx = idx + 12;\n\t\t}\n\t\t\n\t}\n\treturn brc;\n}\n#endif /* WFD_SUPPORT */\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_SendNullFrame(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tUCHAR\t\t\tTxRate,\n\tIN\tBOOLEAN \t\tbQosNull)\n{\n\tUCHAR\tNullFrame[48];\n\tULONG\tLength;\n\tPHEADER_802_11\tpHeader_802_11;\n\tUCHAR\tidx;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> TDLS_SendNullFrame\\n\"));\n\n    /* WPA 802.1x secured port control */\n    if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || \n         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || \n         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t  || (pAd->StaCfg.IEEE8021X == TRUE)\t\t\n#endif \t\t\n#ifdef WAPI_SUPPORT\n\t\t  || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t  || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n        ) &&\n       (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) \n\t{\n\t\treturn;\n\t}\n\n\tfor (idx = 0; idx < MAX_NUM_OF_TDLS_ENTRY; idx++)\n\t{\n\t\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\tif ((pTDLS->Valid) && (pTDLS->Status == TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\tNdisZeroMemory(NullFrame, 48);\n\t\t\tLength = sizeof(HEADER_802_11);\n\n\t\t\tpHeader_802_11 = (PHEADER_802_11) NullFrame;\n\n\t\t\tpHeader_802_11->FC.Type = BTYPE_DATA;\n\t\t\tpHeader_802_11->FC.SubType = SUBTYPE_NULL_FUNC;\n\t\t\tpHeader_802_11->FC.ToDs = 0;\n\t\t\tpHeader_802_11->FC.FrDs = 0;\n\t\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr1, pTDLS->MacAddr);\n\t\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress);\n\t\t\tCOPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid);\n\n\t\t\tif (pAd->CommonCfg.bAPSDForcePowerSave)\n\t\t\t{\n\t\t\t\tpHeader_802_11->FC.PwrMgmt = PWR_SAVE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpHeader_802_11->FC.PwrMgmt = (RtmpPktPmBitCheck(pAd) == TRUE) ? 1: 0;\n\t\t\t}\n\n\t\t\tpHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);\n\n\t\t\tpAd->Sequence++;\n\t\t\tpHeader_802_11->Sequence = pAd->Sequence;\n\n\t\t\t/* Prepare QosNull function frame */\n\t\t\tif (bQosNull)\n\t\t\t{\n\t\t\t\tpHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL;\n\n\t\t\t\t/* copy QOS control bytes */\n\t\t\t\tNullFrame[Length]\t=  0;\n\t\t\t\tNullFrame[Length+1] =  0;\n\t\t\t\tLength += 2;/* if pad with 2 bytes for alignment, APSD will fail */\n\t\t\t}\n\n\t\t\tHAL_KickOutNullFrameTx(pAd, 0, NullFrame, Length);\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== TDLS_SendNullFrame\\n\"));\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_LinkMaintenance(\n\tIN PRTMP_ADAPTER pAd)\n{\n\tUCHAR idx;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n\tfor (idx = 0; idx < MAX_NUM_OF_TDLS_ENTRY; idx++)\n\t{\n\t\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\tif ((pTDLS->Valid == TRUE) && (pTDLS->Status == TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\tUCHAR wcid = pTDLS->MacTabMatchWCID;\n\t\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[wcid];\n\t\t\n\t\t\tif(!IS_ENTRY_TDLS(pEntry))\n\t\t\t\tcontinue;\n\n\t\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t{\n\t\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t\t\t\tpEntry->TdlsKeyLifeTimeCount++;\n\t\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n\t\t\t\tif (pEntry->TdlsKeyLifeTimeCount >= pTDLS->KeyLifetime)\n\t\t\t\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\t\t\tPLIST_HEADER\tpTdlsDiscovryEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"ageout %02x:%02x:%02x:%02x:%02x:%02x from TDLS #%d after %d-sec silence\\n\",\n\t\t\t\t\t\t\t\t\t\t\tpEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2],pEntry->Addr[3],\n\t\t\t\t\t\t\t\t\t\t\tpEntry->Addr[4],pEntry->Addr[5], idx, TDLS_ENTRY_AGEOUT_TIME));\n\n\t\t\t\t\tNdisAcquireSpinLock(&pAd->StaCfg.TdlsInfo.TDLSEntryLock);\n\t\t\t\t\tpTDLS->Token = 0;\n\t\t\t\t\tpTDLS->Valid = FALSE;\n\t\t\t\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\t\t\t\tNdisReleaseSpinLock(&pAd->StaCfg.TdlsInfo.TDLSEntryLock);\n\n\t\t\t\t\tTDLS_TearDownAction(pAd, pTDLS, TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON, FALSE);\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\t\t\tTDLS_DelDiscoveryEntryByMAC(pTdlsDiscovryEnList, pTDLS->MacAddr);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n\t\t\t\t\tMacTableDeleteEntry(pAd, pTDLS->MacTabMatchWCID, pTDLS->MacAddr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* UAPSD also use the variable to do some check */\n\t\t\tNdisAcquireSpinLock(&pAd->MacTabLock);\n\t\t\tpEntry->NoDataIdleCount++;\n\t\t\tNdisReleaseSpinLock(&pAd->MacTabLock);\n\n#ifdef TDLS_UAPSD_DEBUG\n\t\t\t/* virtual timeout handle */\n\t\t\tRTMP_PS_VIRTUAL_TIMEOUT_HANDLE(pEntry);\n#else /* TDLS_UAPSD_DEBUG */\n#ifdef UAPSD_SUPPORT\n\t\t\t/* one second timer */\n\t\t\tUAPSD_QueueMaintenance(pAd, pEntry);\n#endif /* UAPSD_SUPPORT */\n#endif /* TDLS_UAPSD_DEBUG */\n\t\t}\n\t}\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tTDLS_MaintainBlackList(pAd, pTdlsBlackEnList);\n#endif // TDLS_AUTOLINK_SUPPORT //\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nINT Set_TdlsEntryInfo_Display_Proc(\n\tIN PRTMP_ADAPTER pAd, \n\tIN PUCHAR arg)\n{\n\tINT i;\n\n\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%-19s\\n\", \"MAC\\n\"));\n\tfor (i=0; i<MAX_NUM_OF_TDLS_ENTRY; i++)\n\t{\n\t\tif ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status == TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[pAd->StaCfg.TdlsInfo.TDLSEntry[i].MacTabMatchWCID];\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%02x:%02x:%02x:%02x:%02x:%02x  \\n\",\n\t\t\t\tPRINT_MAC(pAd->StaCfg.TdlsInfo.TDLSEntry[i].MacAddr)));\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%-19s%-4s%-4s%-4s%-4s%-7s%-7s%-7s\",\"MAC\", \"AID\", \"BSS\", \"PSM\", \"WMM\", \"RSSI0\", \"RSSI1\", \"RSSI2\"));\n#ifdef DOT11_N_SUPPORT\t\t\t\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-8s%-10s%-6s%-6s%-6s%-6s\", \"MIMOPS\", \"PhMd\", \"BW\", \"MCS\", \"SGI\", \"STBC\"));\n#endif /* DOT11_N_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n%02X:%02X:%02X:%02X:%02X:%02X  \",\n\t\t\t\tpEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],\n\t\t\t\tpEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)pEntry->Aid));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)pEntry->apidx));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)pEntry->PsMode));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-4d\", (int)CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-7d\", pEntry->RssiSample.AvgRssi0));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-7d\", pEntry->RssiSample.AvgRssi1));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-7d\", pEntry->RssiSample.AvgRssi2));\n#ifdef DOT11_N_SUPPORT\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-8d\", (int)pEntry->MmpsMode));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-10s\", get_phymode_str(pEntry->HTPhyMode.field.MODE)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-6s\", get_bw_str(pEntry->HTPhyMode.field.BW)));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-6d\", pEntry->HTPhyMode.field.MCS));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-6d\", pEntry->HTPhyMode.field.ShortGI));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-6d\", pEntry->HTPhyMode.field.STBC));\n#endif /* DOT11_N_SUPPORT */\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"%-10d, %d, %d%%\\n\", pEntry->DebugFIFOCount, pEntry->DebugTxCount, \n\t\t\t\t\t\t(pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0));\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"\\n\"));\n\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nVOID TDLS_InitChannelRelatedValue(\n\tIN PRTMP_ADAPTER pAd,\n\tIN HT_CAPABILITY_IE *pHtCapability)\n{\n\tUCHAR rf_channel, rf_bw;\n\tINT ext_ch;\n\n\n#ifdef DOT11_N_SUPPORT\n\t/* Change to AP channel */\n\tif ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) &&\n\t\t(pHtCapability->HtCapInfo.ChannelWidth == BW_40))\n\t{\t\n\t\t/* Must using 40MHz. */\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_ABOVE;\n\t}\n\telse if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) &&\n\t\t(pHtCapability->HtCapInfo.ChannelWidth == BW_40))\n\t{\t\n\t\t/* Must using 40MHz. */\n\t\trf_channel = pAd->CommonCfg.CentralChannel;\n\t\trf_bw = BW_40;\n\t\text_ch = EXTCHA_BELOW;\n\t}\n\telse\n#endif /* DOT11_N_SUPPORT */\n\t{\n\t\tpAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;\n\n\t\trf_channel = pAd->CommonCfg.Channel;\n\t\trf_bw = BW_20;\n\t\text_ch = EXTCHA_NONE;\n\t}\n\n\tAsicSetChannel(pAd, rf_channel, rf_bw, ext_ch, FALSE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s():BW_%s, CtrlChannel=%d, CentralChannel=%d\\n\",\n\t\t\t\t__FUNCTION__, (rf_bw == BW_40 ? \"40\" : \"20\"),\n\t\t\t\tpAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));\n}\n\n#endif /* DOT11Z_TDLS_SUPPORT */\n \n"
  },
  {
    "path": "src/sta/tdls_chswitch_mng.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    tdls.h\n \n    Abstract:\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 802.11z\n */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\n#include \"rt_config.h\"\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsChannelSwitchReqSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID *Msg, \n\tIN ULONG MsgLen,\n\tOUT UCHAR *pPeerAddr,\n\tOUT\tBOOLEAN *pIsInitator,\n\tOUT UCHAR *pTargetChannel,    \n\tOUT UCHAR *pRegulatoryClass,\n\tOUT UCHAR *pNewExtChannelOffset,\n\tOUT USHORT *pChSwitchTime,\n\tOUT USHORT *pChSwitchTimeOut,\n\tOUT UCHAR *pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent)\n{\n\tULONG RemainLen = MsgLen;\n\tCHAR *Ptr =(CHAR *)Msg;\n\tPEID_STRUCT pEid;\n\tULONG Length = 0;\n\tPHEADER_802_11 pHeader;\n\tBOOLEAN rv = TRUE;\n\n\t/* init value */\n\t*pNewExtChannelOffset = 0;\n\n\t/* Message contains 802.11 header (24 bytes), LLC_SNAP (8 bytes), TDLS Action header(3 bytes) and Payload (variable) */\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"PeerTdlsChannelSwitchReqSanity --> Invaild packet length - (ation header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\n\tpHeader = (PHEADER_802_11)Ptr;\n\tCOPY_MAC_ADDR(pPeerAddr,  &pHeader->Addr2);\t\n\n\t/* Offset to Target Channel */\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\n\t/* Get the value of target channel from payload and advance the pointer */\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_ERROR, (\"PeerTdlsChannelSwitchReqSanity --> Invaild packet length - (target channel) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\n\t*pTargetChannel = *Ptr;\n\n\t/* Offset to Regulatory Class */\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\t/* Get the value of regulatory class from payload and advance the pointer */\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchReqSanity --> Invaild packet length - (regulatory class) \\n\"));\n\t\treturn FALSE;\n\t}\n\t\n\t*pRegulatoryClass = *Ptr;\n\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchReqSanity - Regulatory class = %d \\n\", *pRegulatoryClass));\n\n\t/* Offset to other elements */\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t/* get variable fields from payload and advance the pointer */\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_SECONDARY_CH_OFFSET:\n\t\t\t\tif (pEid->Len == 1)\n\t\t\t\t{\n\t\t\t\t\t*pNewExtChannelOffset = pEid->Octet[0];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trv = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchReqSanity - wrong IE_SECONDARY_CH_OFFSET. \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len == TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trv = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchReqSanity - wrong IE_TDLS_LINK_IDENTIFIER. \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_CHANNEL_SWITCH_TIMING:\n\t\t\t\tif (pEid->Len == 4)\n\t\t\t\t{\n\t\t\t\t\tTDLS_CH_SWITCH_TIMING_ELEMENT ChSwitchTiming;\n\n\t\t\t\t\tNdisMoveMemory(&ChSwitchTiming, &pEid->Octet[0], sizeof(TDLS_CH_SWITCH_TIMING_ELEMENT));\n\t\t\t\t\t*pChSwitchTime = ChSwitchTiming.ChSwitchTime;\n\t\t\t\t\t*pChSwitchTimeOut = ChSwitchTiming.ChSwitchTimeOut;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trv = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchReqSanity - wrong IE_TDLS_CHANNEL_SWITCH_TIMING. \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchReqSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \n\t}\n\n    return rv;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nBOOLEAN PeerTdlsChannelSwitchRspSanity(\n\tIN PRTMP_ADAPTER pAd, \n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen,\n\tOUT UCHAR\t*pPeerAddr,\n\tOUT USHORT\t*pStatusCode,\n\tOUT USHORT\t*pChSwitchTime,\n\tOUT USHORT\t*pChSwitchTimeOut,\n\tOUT UCHAR\t*pLinkIdentLen,\n\tOUT\tTDLS_LINK_IDENT_ELEMENT *pLinkIdent)\n{\n\tULONG\t\t\tRemainLen = MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Msg;\n\tPEID_STRUCT\t\tpEid;\n\tULONG\t\t\tLength = 0;\n\tPHEADER_802_11\tpHeader;\n\n\t// Message contains 802.11 header (24 bytes), LLC_SNAP (8 bytes), TDLS Action header(3 bytes) and Payload (variable)\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchRspSanity --> Invaild packet length - (ation header) \\n\"));\n\t\treturn FALSE;\t\n\t}\n\n\tpHeader = (PHEADER_802_11)Ptr;\n\tCOPY_MAC_ADDR(pPeerAddr,  &pHeader->Addr2);\t\n\n\t// Offset to Status Code\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H);\n\t\n\t// Get the value of Status Code from payload and advance the pointer\n\tif (RemainLen < 2)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchRspSanity --> Invaild packet length - (status code) \\n\"));\n\t\treturn FALSE;\n\t}\t\n\tNdisMoveMemory(pStatusCode, Ptr, 2);\n\n\t// Offset to other elements\n\tPtr += 2;\n\tRemainLen -= 2;\n\n\tpEid = (PEID_STRUCT) Ptr;\n\n\t// get variable fields from payload and advance the pointer\n\twhile ((Length + 2 + pEid->Len) <= RemainLen)\t  \n\t{\t\n\t\tswitch(pEid->Eid)\n\t\t{\n\t\t\tcase IE_TDLS_LINK_IDENTIFIER:\n\t\t\t\tif (pEid->Len == TDLS_ELM_LEN_LINK_IDENTIFIER)\n\t\t\t\t{\n\t\t\t\t\tNdisMoveMemory(pLinkIdent, &pEid->Octet[0], sizeof(TDLS_LINK_IDENT_ELEMENT));\n\t\t\t\t\t*pLinkIdentLen = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchRspSanity - wrong IE_TDLS_LINK_IDENTIFIER. \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IE_TDLS_CHANNEL_SWITCH_TIMING:\n\t\t\t\tif (pEid->Len == 4)\n\t\t\t\t{\n\t\t\t\t\tTDLS_CH_SWITCH_TIMING_ELEMENT ChSwitchTiming;\n\n\t\t\t\t\tNdisMoveMemory(&ChSwitchTiming, &pEid->Octet[0], sizeof(TDLS_CH_SWITCH_TIMING_ELEMENT));\n\t\t\t\t\t*pChSwitchTime = ChSwitchTiming.ChSwitchTime;\n\t\t\t\t\t*pChSwitchTimeOut = ChSwitchTiming.ChSwitchTimeOut;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchRspSanity - wrong IE_TDLS_CHANNEL_SWITCH_TIMING. \\n\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Unknown IE, we have to pass it as variable IEs\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"PeerTdlsChannelSwitchRspSanity - unrecognized EID = %d\\n\", pEid->Eid));\n\t\t\t\tbreak;\n\t\t}\n\n\t\tLength = Length + 2 + pEid->Len; \t\n\t\tpEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); \n\t}\n\n    return TRUE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_BuildChannelSwitchRequest(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN PUCHAR pPeerAddr,\n\tIN USHORT ChSwitchTime,\n\tIN USHORT ChSwitchTimeOut,\n\tIN UCHAR TargetChannel,\n\tIN UCHAR TargetChannelBW)\n{\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tINT LinkId = 0xff;\n\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_CHANNEL_SWITCH_REQUEST);\n\n\t/* Target Channel */\n\tTDLS_InsertTargetChannel(pAd, (pFrameBuf + *pFrameLen), pFrameLen, TargetChannel);\n\n\t/* Regulatory Class */\n\tTDLS_InsertRegulatoryClass(pAd, (pFrameBuf + *pFrameLen), pFrameLen, TargetChannel, TargetChannelBW);\n\n\t/* Secondary Channel Offset */\n\tif(TargetChannelBW != EXTCHA_NONE)\n\t{\n\t\tif (TargetChannel > 14)\n\t\t{\n\t\t\tif ((TargetChannel == 36) || (TargetChannel == 44) || (TargetChannel == 52) ||\n\t\t\t\t(TargetChannel == 60) || (TargetChannel == 100) || (TargetChannel == 108) ||\n\t\t\t\t(TargetChannel == 116) || (TargetChannel == 124) || (TargetChannel == 132) ||\n\t\t\t\t(TargetChannel == 149) || (TargetChannel == 157))\n\t\t\t{\n\t\t\t\tTDLS_InsertSecondaryChOffsetIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, EXTCHA_ABOVE);\n\t\t\t\tpAd->StaCfg.TdlsCurrentChannelBW = EXTCHA_ABOVE;\n\t\t\t\t\n\t\t\t}\n\t\t\telse if ((TargetChannel == 40) || (TargetChannel == 48) || (TargetChannel == 56) |\n\t\t\t\t\t(TargetChannel == 64) || (TargetChannel == 104) || (TargetChannel == 112) ||\n\t\t\t\t\t(TargetChannel == 120) || (TargetChannel == 128) || (TargetChannel == 136) ||\n\t\t\t\t\t(TargetChannel == 153) || (TargetChannel == 161))\n\t\t\t{\n\t\t\t\tTDLS_InsertSecondaryChOffsetIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, EXTCHA_BELOW);\n\t\t\t\tpAd->StaCfg.TdlsCurrentChannelBW = EXTCHA_BELOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tUCHAR ExtCh;\n\t\t\t\tUCHAR Dir = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;\n\t\t\t\tExtCh = TDLS_GetExtCh(TargetChannel, Dir);\n\t\t\t\tif (TDLS_IsValidChannel(pAd, ExtCh))\n\t\t\t\t{\n\t\t\t\t\tTDLS_InsertSecondaryChOffsetIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, Dir);\n\t\t\t\t\tpAd->StaCfg.TdlsCurrentChannelBW = Dir;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tDir = (Dir == EXTCHA_ABOVE) ? EXTCHA_BELOW : EXTCHA_ABOVE;\n\t\t\t\tExtCh = TDLS_GetExtCh(TargetChannel, Dir);\n\t\t\t\tif (TDLS_IsValidChannel(pAd, ExtCh))\n\t\t\t\t{\n\t\t\t\t\tTDLS_InsertSecondaryChOffsetIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, Dir);\n\t\t\t\t\tpAd->StaCfg.TdlsCurrentChannelBW = Dir;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while(FALSE);\n\t\t}\n\t}\n\telse\n\t{\n\t\tpAd->StaCfg.TdlsCurrentChannelBW = EXTCHA_NONE;\n\t}\n\n\t/* fill link identifier */\n\tLinkId = TDLS_SearchLinkId(pAd, pPeerAddr);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_ChannelSwitchReqAction() can not find the LinkId!\\n\"));\n\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\tif (pTDLS->bInitiator)\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pPeerAddr, pAd->CurrentAddress);\n\telse\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pAd->CurrentAddress, pPeerAddr);\n\n\t/* Channel Switch Timing */\n\tTDLS_InsertChannelSwitchTimingIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, ChSwitchTime, ChSwitchTimeOut);\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_BuildChannelSwitchResponse(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS,\n\tIN\tUSHORT\tChSwitchTime,\n\tIN\tUSHORT\tChSwitchTimeOut,\n\tIN\tUINT16\tReasonCode)\n{\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_CHANNEL_SWITCH_RESPONSE);\n\n\t/* fill reason code */\n\tTDLS_InsertReasonCode(pAd, (pFrameBuf + *pFrameLen), pFrameLen, ReasonCode);\n\n\t/* fill link identifier */\n\tif (pTDLS->bInitiator)\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS->MacAddr, pAd->CurrentAddress);\n\telse\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pAd->CurrentAddress, pTDLS->MacAddr);\n\n\t/* Channel Switch Timing */\n\tTDLS_InsertChannelSwitchTimingIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, ChSwitchTime, ChSwitchTimeOut);\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_ChannelSwitchReqAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PMLME_TDLS_CH_SWITCH_STRUCT\tpChSwitchReq)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tMAC_TABLE_ENTRY       *pEntry = NULL;\n\tUINT16\tSwitchTime = pAd->StaCfg.TdlsInfo.TdlsSwitchTime; //micro seconds\n\tUINT16\tSwitchTimeout = pAd->StaCfg.TdlsInfo.TdlsSwitchTimeout; // micro seconds\n\tINT\t\tLinkId = 0xff;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\tDBGPRINT(RT_DEBUG_WARN, (\"====> TDLS_ChannelSwitchReqAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pChSwitchReq->PeerMacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t// Allocate buffer for transmitting message\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\treturn NStatus;\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_BuildChannelSwitchRequest(pAd, pOutBuffer, &FrameLen, pChSwitchReq->PeerMacAddr,SwitchTime,\n\t\t\t\t\t\t\t\t\tSwitchTimeout, pChSwitchReq->TargetChannel, pChSwitchReq->TargetChannelBW);\n\n\tpEntry = MacTableLookup(pAd, pChSwitchReq->PeerMacAddr);\n\n\tif (pEntry && IS_ENTRY_TDLS(pEntry))\n\t{\n\t\tpTDLS->ChannelSwitchCurrentState = TDLS_CHANNEL_SWITCH_WAIT_RSP;\n\t\tif (pChSwitchReq->TargetChannel != pAd->CommonCfg.Channel)\n\t\t\tRTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE, RTMP_TDLS_SPECIFIC_EDCA);\n\t\telse\n\t\t\tRTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE, RTMP_TDLS_SPECIFIC_HCCA);\n\t\tpAd->StaCfg.TdlsCurrentChannel = pChSwitchReq->TargetChannel;\n\t\tpAd->StaCfg.TdlsCurrentChannelBW = pChSwitchReq->TargetChannelBW;\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Can't find TDLS entry on mac TABLE !!!!\\n\"));\n\t}\n\n\thex_dump(\"TDLS switch channel request send pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_WARN, (\"<==== TDLS_ChannelSwitchReqAction\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_ChannelSwitchRspAction(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN\tPRT_802_11_TDLS\tpTDLS,\n\tIN\tUSHORT\tChSwitchTime,\n\tIN\tUSHORT\tChSwitchTimeOut,\n\tIN\tUINT16\tStatusCode,\n\tIN\tUCHAR\tFrameType)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS ===> TDLS_ChannelSwitchRspAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t// Allocate buffer for transmitting message\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - TDLS_ChannelSwitchRspAction() allocate memory failed \\n\"));\n\t\treturn NStatus;\n\t}\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_BuildChannelSwitchResponse(pAd, pOutBuffer, &FrameLen, pTDLS, ChSwitchTime, ChSwitchTimeOut, StatusCode);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[pTDLS->MacTabMatchWCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE, FrameType);\n\n\thex_dump(\"TDLS send channel switch response pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS <=== TDLS_ChannelSwitchRspAction\\n\"));\n\n\treturn NStatus;\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_MlmeChannelSwitchAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tPMLME_TDLS_CH_SWITCH_STRUCT pChSwReq = NULL; \n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tINT\tLinkId = 0xff;\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS ===> TDLS_MlmeChannelSwitchAction() \\n\"));\n\n\tpChSwReq = (PMLME_TDLS_CH_SWITCH_STRUCT)Elem->Msg;\n\n\tif (pAd->StaActive.ExtCapInfo.TDLSChSwitchProhibited == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF,(\"%s(%d): AP Prohibite TDLS Channel Switch !!!\\n\", __FUNCTION__, __LINE__));\n\t\treturn;\n\t}\n\n\tif (INFRA_ON(pAd))\n\t{\n\t\t// Drop not within my TDLS Table that created before !\n\t\tLinkId = TDLS_SearchLinkId(pAd, pChSwReq->PeerMacAddr);\n\n\t\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeChannelSwitchAction() can not find the LinkId!\\n\"));\n\t\t\treturn;\n\t\t}\n\n\t\tpAd->StaCfg.TdlsForcePowerSaveWithAP = TRUE;\n\n\t\tif (pAd->StaCfg.bTdlsNoticeAPPowerSave == FALSE)\n\t\t{\n\t\t\tpAd->StaCfg.TdlsSendNullFrameCount = 0;\n\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = TRUE;\n\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->StaCfg.TdlsSendNullFrameCount++;\n\t\t\tif (pAd->StaCfg.TdlsSendNullFrameCount >= 200)\n\t\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = FALSE;\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"103. %ld !!!\\n\", (jiffies * 1000) / OS_HZ));\n\n\t\t/* Build TDLS channel switch Request Frame */\n\t\tNStatus = TDLS_ChannelSwitchReqAction(pAd, pChSwReq);\n\t\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeChannelSwitchAction() Build Channel Switch Request Fail !!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->StaCfg.TdlsChannelSwitchPairCount++;\n\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS <=== TDLS_MlmeChannelSwitchAction() \\n\"));\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS <=== TDLS_MlmeChannelSwitchAction() TDLS only support infra mode !!!\\n\"));\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_MlmeChannelSwitchRspAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tPMLME_TDLS_CH_SWITCH_STRUCT pMlmeChSwitchRsp = NULL; \n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tPRT_802_11_TDLS\tpTdls = NULL;\n\tINT LinkId = 0xff;\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS ===> TDLS_MlmeChannelSwitchRspAction() \\n\"));\n\n\tpMlmeChSwitchRsp = (PMLME_TDLS_CH_SWITCH_STRUCT)Elem->Msg;\n\n\tif (INFRA_ON(pAd))\n\t{\n\t\t// Drop not within my TDLS Table that created before !\n\t\tLinkId = TDLS_SearchLinkId(pAd, pMlmeChSwitchRsp->PeerMacAddr);\n\n\t\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS - TDLS_MlmeChannelSwitchRspAction() can not find the LinkId!\\n\"));\n\t\t\treturn;\n\t\t}\n\n\t\t/* Point to the current Link ID */\n\t\tpTdls = &pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\t\t/* Build TDLS channel switch Request Frame */\n\t\tNStatus = TDLS_ChannelSwitchRspAction(pAd, pTdls, pTdls->ChSwitchTime, pTdls->ChSwitchTimeout, 0, (RTMP_TDLS_SPECIFIC_CS_RSP_NOACK + RTMP_TDLS_SPECIFIC_HCCA));\n\n\t\tif (NStatus != NDIS_STATUS_SUCCESS)\t\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeChannelSwitchRspAction() Build Channel Switch Response Fail !!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTMPusecDelay(300);\n\t\t\tNdisGetSystemUpTime(&pAd->StaCfg.TdlsGoBackStartTime);\n\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE);\n\t\t\telse if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW);\n\t\t\telse\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE);\n\t\t\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL);\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\n\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS <=== TDLS_MlmeChannelSwitchRspAction() \\n\"));\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeChannelSwitchRspAction() TDLS only support infra mode !!!\\n\"));\n\t}\n\n\treturn;\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerChannelSwitchReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_802_11_TDLS\t\tpTDLS = NULL;\n\tINT\t\t\t\t\tLinkId = 0xff;\n\tUCHAR\t\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tBOOLEAN\t\t\t\tIsInitator;\n\t//BOOLEAN\t\t\t\tTimerCancelled;\n\tUCHAR\t\t\t\tTargetChannel;\n\tUCHAR\t\t\t\tRegulatoryClass;\n\tUCHAR\t\t\t\tNewExtChannelOffset = 0xff;\n\tUCHAR\t\t\t\tLinkIdentLen;\n\tUSHORT\t\t\t\tPeerChSwitchTime;\n\tUSHORT\t\t\t\tPeerChSwitchTimeOut;\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n\tNDIS_STATUS\t\t\tNStatus = NDIS_STATUS_SUCCESS;\n\tUSHORT\t\t\t\tStatusCode = MLME_SUCCESS;\n\tUINT16\t\t\t\tSwitchTime = pAd->StaCfg.TdlsInfo.TdlsSwitchTime; //micro seconds\n\tUINT16\t\t\t\tSwitchTimeout = pAd->StaCfg.TdlsInfo.TdlsSwitchTimeout; // micro seconds\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS ===> TDLS_PeerChannelSwitchReqAction() \\n\"));\n\n\t// Not TDLS Capable, ignore it\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\treturn;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\tif (pAd->StaActive.ExtCapInfo.TDLSChSwitchProhibited == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF,(\"%s(%d): AP Prohibite TDLS Channel Switch !!!\\n\", __FUNCTION__, __LINE__));\n\t\treturn;\n\t}\n\n\ttdls_hex_dump(\"TDLS peer channel switch request receive pack\", Elem->Msg, Elem->MsgLen);\n\t\n\tif (!PeerTdlsChannelSwitchReqSanity(pAd,\n\t\t\t\t\t\t\t\tElem->Msg,\n\t\t\t\t\t\t\t\tElem->MsgLen,\n\t\t\t\t\t\t\t\tPeerAddr,\n\t\t\t\t\t\t\t\t&IsInitator,\n\t\t\t\t\t\t\t\t&TargetChannel,\n\t\t\t\t\t\t\t\t&RegulatoryClass,\n\t\t\t\t\t\t\t\t&NewExtChannelOffset,\n\t\t\t\t\t\t\t\t&PeerChSwitchTime,\n\t\t\t\t\t\t\t\t&PeerChSwitchTimeOut,\n\t\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t\t&LinkIdent))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s(%d):  from %02x:%02x:%02x:%02x:%02x:%02x Sanity Check Fail !!!\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__,__LINE__, PeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"%s(%d):  from %02x:%02x:%02x:%02x:%02x:%02x !!!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__,__LINE__, PeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"300. %ld !!!\\n\", (jiffies * 1000) / OS_HZ));\n\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s(%d):  can not find from %02x:%02x:%02x:%02x:%02x:%02x on TDLS entry !!!\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__,__LINE__, PeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\t\treturn;\n\t}\n\n\tif (pAd->StaCfg.bChannelSwitchInitiator == FALSE)\n\t{\n\t\tpAd->StaCfg.TdlsForcePowerSaveWithAP = TRUE;\n\n\t\tif (pAd->StaCfg.bTdlsNoticeAPPowerSave == FALSE)\n\t\t{\n\t\t\tpAd->StaCfg.TdlsSendNullFrameCount = 0;\n\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = TRUE;\n\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpAd->StaCfg.TdlsSendNullFrameCount++;\n\t\t\tif (pAd->StaCfg.TdlsSendNullFrameCount >= 200)\n\t\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = FALSE;\n\t\t}\n\t}\n\n\n\n\t// Point to the current Link ID\n\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\tif (SwitchTime >= PeerChSwitchTime)\n\t\tPeerChSwitchTime = SwitchTime;\n\n\tif (SwitchTimeout >= PeerChSwitchTimeOut)\n\t\tPeerChSwitchTimeOut = SwitchTimeout;\n\n\tif (RtmpPktPmBitCheck(pAd))\n\t{\n\t\tRTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);\n\t\tTDLS_SendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, 0);\n\t}\n\n\t{\n\t\tUINT32 macCfg, TxCount;\n\t\tUINT32 MTxCycle;\n\n\t\tRTMP_IO_READ32(pAd, TX_REPORT_CNT, &macCfg);\n\n\t\tif  (TargetChannel != pAd->CommonCfg.Channel)\n\t\t\tNStatus = TDLS_ChannelSwitchRspAction(pAd, pTDLS, PeerChSwitchTime, PeerChSwitchTimeOut, StatusCode, RTMP_TDLS_SPECIFIC_CS_RSP_WAIT_ACK);\n\t\telse\n\t\t\tNStatus = TDLS_ChannelSwitchRspAction(pAd, pTDLS, PeerChSwitchTime, PeerChSwitchTimeOut, StatusCode, (RTMP_TDLS_SPECIFIC_CS_RSP_WAIT_ACK + RTMP_TDLS_SPECIFIC_HCCA));\n\t\t\t\n\n\t\tfor (MTxCycle = 0; MTxCycle < 500; MTxCycle++)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TX_REPORT_CNT, &macCfg);\n\t\t\tTxCount = macCfg & 0x0000ffff;\n\t\t\tif (TxCount > 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MTxCycle = %d, %ld !!!\\n\", MTxCycle, (jiffies * 1000) / OS_HZ));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t\tRTMPusecDelay(50);\n\t\t}\n\n\t\tif (MTxCycle >= 500)\n\t\t{\n\t\t\tNStatus = NDIS_STATUS_FAILURE;\n\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS Transmit Channel Switch Response Fail !!!\\n\"));\n\t\t}\n\t}\n\n\tif (NStatus == NDIS_STATUS_SUCCESS)\n\t{\n\n\t\t{\n\t\t\tif  (TargetChannel != pAd->CommonCfg.Channel)\n\t\t\t{\n\t\t\t\tBOOLEAN TimerCancelled;\n\t\t\t\t//ULONG Now, temp1, temp2, temp3;\n\n\t\t\t\tpAd->StaCfg.TdlsCurrentChannel = TargetChannel;\n\n\t\t\t\tif (NewExtChannelOffset != 0)\n\t\t\t\t\tpAd->StaCfg.TdlsCurrentChannelBW = NewExtChannelOffset;\n\t\t\t\telse\n\t\t\t\t\tpAd->StaCfg.TdlsCurrentChannelBW = EXTCHA_NONE;\n\n\t\t\t\tpTDLS->ChSwitchTime = PeerChSwitchTime;\n\t\t\t\tpAd->StaCfg.TdlsGlobalSwitchTime = PeerChSwitchTime;\n\t\t\t\tpTDLS->ChSwitchTimeout = PeerChSwitchTimeOut;\n\t\t\t\tpAd->StaCfg.TdlsGlobalSwitchTimeOut = PeerChSwitchTimeOut;\n\n\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t\t//Cancel the timer since the received packet to me.\n#ifdef TDLS_HWTIMER_SUPPORT\n\t\t\t\tTDLS_SetChannelSwitchTimer(pAd,  (PeerChSwitchTimeOut / 1000));\n#else\n\t\t\t\tRTMPCancelTimer(&pTDLS->ChannelSwitchTimeoutTimer, &TimerCancelled);\n\t\t\t\tNdisGetSystemUpTime(&pTDLS->ChannelSwitchTimerStartTime);\n\t\t\t\tRTMPSetTimer(&pTDLS->ChannelSwitchTimeoutTimer, (PeerChSwitchTimeOut / 1000));\n#endif // TDLS_HWTIMER_SUPPORT //\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsDisableChannelSwitchTimer, &TimerCancelled);\n\t\t\t\tpAd->StaCfg.bTdlsCurrentDoingChannelSwitchWaitSuccess = TRUE;\n\t\t\t\tpAd->StaCfg.bDoingPeriodChannelSwitch = TRUE;\n\n\t\t\t\tif (RTDebugLevel < RT_DEBUG_ERROR)\n\t\t\t\t\tRTMPusecDelay(300);\n\t\t\t\telse\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"1041. %ld !!!\\n\", (jiffies * 1000) / OS_HZ));\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->StaCfg.TdlsCurrentChannel, pAd->StaCfg.TdlsCurrentChannelBW);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpTDLS->bDoingPeriodChannelSwitch = FALSE;\n\t\t\t\tpAd->StaCfg.bDoingPeriodChannelSwitch = FALSE;\n\t\t\t\tpAd->StaCfg.TdlsForcePowerSaveWithAP = FALSE;\n\t\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = FALSE;\n\n\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t\tRTMPusecDelay(300);\n\n\t\t\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE);\n\t\t\t\telse if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW);\n\t\t\t\telse\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE);\n\t\t\t\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL);\n\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\n\t\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, FALSE);\n\t\t\t}\n\t\t}\n\t}\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS <=== TDLS_PeerChannelSwitchReqAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerChannelSwitchRspAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_802_11_TDLS\t\tpTDLS = NULL;\n\tINT\t\t\t\t\tLinkId = 0xff;\n\tUCHAR\t\t\t\tPeerAddr[MAC_ADDR_LEN];\n\t//BOOLEAN\t\t\t\tIsInitator;\n\tBOOLEAN\t\t\t\tTimerCancelled;\n\t//UCHAR\t\t\t\tRegulatoryClass;\n\t//UCHAR\t\t\t\tNewExtChannelOffset = 0xff;\n\tUCHAR\t\t\t\tLinkIdentLen;\n\tUSHORT\t\t\t\tPeerChSwitchTime;\n\tUSHORT\t\t\t\tPeerChSwitchTimeOut;\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n\t//NDIS_STATUS\t\t\tNStatus = NDIS_STATUS_SUCCESS;\n\tUSHORT\t\t\t\tStatusCode = MLME_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS ===> TDLS_PeerChannelSwitchRspAction() \\n\"));\n\n\t// Not TDLS Capable, ignore it\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\treturn;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\thex_dump(\"TDLS peer channel switch response receive pack\", Elem->Msg, Elem->MsgLen);\n\n\tif (!PeerTdlsChannelSwitchRspSanity(pAd,\n\t\t\t\t\t\t\t\tElem->Msg,\n\t\t\t\t\t\t\t\tElem->MsgLen,\n\t\t\t\t\t\t\t\tPeerAddr,\n\t\t\t\t\t\t\t\t&StatusCode,\n\t\t\t\t\t\t\t\t&PeerChSwitchTime,\n\t\t\t\t\t\t\t\t&PeerChSwitchTimeOut,\n\t\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t\t&LinkIdent))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s(%d):  from %02x:%02x:%02x:%02x:%02x:%02x Sanity Check Fail !!!\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__,__LINE__, PeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\t\treturn;\n\t}\n\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s(%d):  can not find from %02x:%02x:%02x:%02x:%02x:%02x on TDLS entry !!!\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__,__LINE__, PeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\t\treturn;\n\t}\n\n\t// Point to the current Link ID\n\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\tif ((pTDLS->ChannelSwitchCurrentState == TDLS_CHANNEL_SWITCH_NONE) &&\n\t\t(StatusCode == MLME_REQUEST_DECLINED))\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF,(\"%s(%d): received a failed StatusCode = %d on Unsolicited response !!!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__, __LINE__, StatusCode));\n\t\treturn;\n\t}\n\n\tif (StatusCode == MLME_REQUEST_DECLINED)\n\t{\n\t\tif ((pAd->StaCfg.TdlsChannelSwitchRetryCount > 0) &&\n\t\t\t(pTDLS->bDoingPeriodChannelSwitch) &&\n\t\t\t(pAd->StaCfg.bDoingPeriodChannelSwitch))\n\t\t{\n\t\t\tpAd->StaCfg.TdlsChannelSwitchRetryCount--;\n\n\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"%s(%d): received a failed StatusCode = %d  re-try again !!!\\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__, __LINE__, StatusCode));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpTDLS->bDoingPeriodChannelSwitch = FALSE;\n\t\t\tpAd->StaCfg.bDoingPeriodChannelSwitch = FALSE;\n\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = FALSE;\n\t\t\tpAd->StaCfg.TdlsForcePowerSaveWithAP = FALSE;\n\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, FALSE);\n\t\t}\n\n\t\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS - TDLS_PeerChannelSwitchRspAction() received a failed StatusCode = %d !!!\\n\", StatusCode ));\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"%s(%d):  from %02x:%02x:%02x:%02x:%02x:%02x !!!\\n\",\n\t\t\t\t\t\t\t\t__FUNCTION__,__LINE__, PeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\n\n\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\tif (pTDLS->ChannelSwitchCurrentState == TDLS_CHANNEL_SWITCH_NONE)\n\t\t{\n\t\t\tif (pAd->StaCfg.bChannelSwitchInitiator == FALSE)\n\t\t\t{\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsResponderGoBackBaseChTimer, &TimerCancelled);\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"%s(%d): i am responder!!!\\n\",  __FUNCTION__,__LINE__));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsPeriodGoBackBaseChTimer, &TimerCancelled);\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN,(\"%s(%d): i am Initiator !!!\\n\", __FUNCTION__,__LINE__));\n\t\t\t}\n\n\t\t\tif (pAd->StaCfg.TdlsCurrentOperateChannel != pAd->CommonCfg.Channel)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"106. %ld !!!\\n\", (jiffies * 1000) / OS_HZ));\n\n\t\t\t\tRTMPusecDelay(300);\n\t\t\t\tNdisGetSystemUpTime(&pAd->StaCfg.TdlsGoBackStartTime);\n\n\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE);\n\t\t\t\telse if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW);\n\t\t\t\telse\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE);\n\t\t\t\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL);\n\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pAd->StaCfg.TdlsCurrentChannel != pAd->CommonCfg.Channel)\n\t\t\t{\n\t\t\t\tif (pAd->StaCfg.bChannelSwitchInitiator)\n\t\t\t\t{\n\t\t\t\t\tUINT16 SwitchTime = pAd->StaCfg.TdlsInfo.TdlsSwitchTime; //micro seconds\n\t\t\t\t\tUINT16 SwitchTimeout = pAd->StaCfg.TdlsInfo.TdlsSwitchTimeout; // micro seconds\n\n\t\t\t\t\tpAd->StaCfg.TdlsChannelSwitchPairCount--;\n\t\t\t\t\tpAd->StaCfg.TdlsChannelSwitchRetryCount = 10;\n\t\t\t\t\t//pAd->StaCfg.bDoingPeriodChannelSwitch = TRUE;\n\n\t\t\t\t\tif (SwitchTime >= PeerChSwitchTime)\n\t\t\t\t\t\tPeerChSwitchTime = SwitchTime;\n\n\t\t\t\t\tif (SwitchTimeout >= PeerChSwitchTimeOut)\n\t\t\t\t\t\tPeerChSwitchTimeOut = SwitchTimeout;\n\n\t\t\t\t\tpTDLS->ChSwitchTime = PeerChSwitchTime;\n\t\t\t\t\tpAd->StaCfg.TdlsGlobalSwitchTime = PeerChSwitchTime;\n\t\t\t\t\tpTDLS->ChSwitchTimeout = PeerChSwitchTimeOut;\n\t\t\t\t\tpAd->StaCfg.TdlsGlobalSwitchTimeOut = PeerChSwitchTimeOut;\n\t\t\t\t\tpTDLS->ChannelSwitchCurrentState = TDLS_CHANNEL_SWITCH_NONE;\n\n\t\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t\t\t//Cancel the timer since the received packet to me.\n#ifdef TDLS_HWTIMER_SUPPORT\n\t\t\t\t\tTDLS_SetChannelSwitchTimer(pAd,  ((PeerChSwitchTime + pAd->StaCfg.TdlsOffChannelDelay) / 1000));\n#else\n\t\t\t\t\tRTMPCancelTimer(&pTDLS->ChannelSwitchTimer, &TimerCancelled);\n\t\t\t\t\tpTDLS->bEnableChSwitchTime = TRUE;\n\t\t\t\t\tNdisGetSystemUpTime(&pTDLS->ChannelSwitchTimerStartTime);\n\t\t\t\t\tRTMPSetTimer(&pTDLS->ChannelSwitchTimer, ((PeerChSwitchTime + pAd->StaCfg.TdlsOffChannelDelay) / 1000));\n#endif // TDLS_HWTIMER_SUPPORT //\n\n\t\t\t\t\tif (RTDebugLevel < RT_DEBUG_ERROR)\n\t\t\t\t\t\tRTMPusecDelay(300);\n\t\t\t\t\telse\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"104. %ld !!!\\n\", (jiffies * 1000) / OS_HZ));\n\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->StaCfg.TdlsCurrentChannel, pAd->StaCfg.TdlsCurrentChannelBW);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpTDLS->bDoingPeriodChannelSwitch = FALSE;\n\t\t\t\tpAd->StaCfg.bDoingPeriodChannelSwitch = FALSE;\n\t\t\t\tpAd->StaCfg.TdlsForcePowerSaveWithAP = FALSE;\n\t\t\t\tpAd->StaCfg.bTdlsNoticeAPPowerSave = FALSE;\n\n\t\t\t\tif (pAd->StaCfg.bChannelSwitchInitiator == FALSE)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"%s(%d): i am channel switch responder!!!\\n\",  __FUNCTION__,__LINE__));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRTMPCancelTimer(&pAd->StaCfg.TdlsDisableChannelSwitchTimer, &TimerCancelled);\n\t\t\t\t\tpAd->StaCfg.bChannelSwitchInitiator = FALSE;\n\t\t\t\t\tDBGPRINT(RT_DEBUG_OFF,(\"%s(%d): i am channel switch Initiator !!!\\n\", __FUNCTION__,__LINE__));\n\t\t\t\t}\n\n\t\t\t\tif (pAd->StaCfg.TdlsCurrentOperateChannel != pAd->CommonCfg.Channel)\n\t\t\t\t{\n\t\t\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE);\n\t\t\t\t\telse if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW);\n\t\t\t\t\telse\n\t\t\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE);\n\t\t\t\t\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL);\n\t\t\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\t\t}\n\n\t\t\t\tRTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, FALSE);\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\tDBGPRINT(RT_DEBUG_WARN,(\"TDLS <=== TDLS_PeerChannelSwitchRspAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_ChannelSwitchTimeAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRTMP_ADAPTER\tpAd;\n\tPRT_802_11_TDLS\tpTDLS = (PRT_802_11_TDLS)FunctionContext;\n\t\n\n\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS_ChannelSwitchTimeAction - channel switch procedure for (%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t\t\tpTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2],\n\t\t\t\tpTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5]));\n\n\tpAd = pTDLS->pAd;\n\n\t{\n\t\tUINT32 macCfg, TxCount;\n\t\tUINT32 MTxCycle;\n\t\tUINT16 MaxWaitingTime;\n\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"105. %ld !!!\\n\", (jiffies * 1000) / OS_HZ));\n\n\t\t{\n\t\t\tULONG Now, temp1;\n\n\t\t\tNdisGetSystemUpTime(&Now);\n\t\t\ttemp1 = (((Now - pTDLS->ChannelSwitchTimerStartTime) * 1000) / OS_HZ);\n\n\t\t\tif (temp1 < (pTDLS->ChSwitchTime / 1000))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Timer  = %ld < 11 !!!\\n\", temp1));\n\t\t\t}\n\t\t}\n\t\tRTMP_IO_READ32(pAd, TX_REPORT_CNT, &macCfg);\n\t\tTDLS_SendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE, RTMP_TDLS_SPECIFIC_NULL_FRAME);\n\t\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_HCCA);\n\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\n\t\tMaxWaitingTime = ((pTDLS->ChSwitchTimeout - pTDLS->ChSwitchTime) / 1000);\n\t\tfor (MTxCycle = 0; MTxCycle < ((MaxWaitingTime + 1) * 20); MTxCycle++)\n\t\t{\n\t\t\tRTMP_IO_READ32(pAd, TX_REPORT_CNT, &macCfg);\n\t\t\tTxCount = macCfg & 0x0000ffff;\n\t\t\tif (TxCount > 0)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MTxCycle = %d, %ld !!!\\n\", MTxCycle, (jiffies * 1000) / OS_HZ));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t\tRTMPusecDelay(50);\n\t\t}\n\n\t\tif (MTxCycle == ((MaxWaitingTime + 1) * 20))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"24. %ld @@@!!!\\n\", (jiffies * 1000) / OS_HZ));\n\n\t\t\tRTMPusecDelay(300);\n\t\t\tNdisGetSystemUpTime(&pAd->StaCfg.TdlsGoBackStartTime);\n\n\t\t\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\t\t\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE);\n\t\t\telse if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW);\n\t\t\telse\n\t\t\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE);\n\t\t\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL);\n\t\t\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_ChannelSwitchTimeOutAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRT_802_11_TDLS\tpTDLS = (PRT_802_11_TDLS)FunctionContext;\n\tPRTMP_ADAPTER\tpAd = pTDLS->pAd;\n\tBOOLEAN\tTimerCancelled;\n\n\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS - Failed to wait for channel switch, terminate the channel switch procedure (%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t\t\t\t\t\tpTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2],\n\t\t\t\t\t\t\tpTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5]));\n\n\t{\n\t\tULONG Now, temp1;\n\n\t\tNdisGetSystemUpTime(&Now);\n\t\ttemp1 = (((Now - pTDLS->ChannelSwitchTimerStartTime) * 1000) / OS_HZ);\n\n\t\tif (temp1 < (pTDLS->ChSwitchTimeout / 1000))\n\t\t{\n\t\t\tRTMPSetTimer(&pTDLS->ChannelSwitchTimeoutTimer, ((pTDLS->ChSwitchTimeout / 1000) - temp1));\n\t\t\treturn;\n\t\t}\n\n\t\tif (temp1 < (pTDLS->ChSwitchTimeout / 1000))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_OFF, (\"Timer  = %ld < 11 !!!\\n\", temp1));\n\t\t}\n\t}\n\t\n\tRTMPCancelTimer(&pAd->StaCfg.TdlsResponderGoBackBaseChTimer, &TimerCancelled);\n\tpAd->StaCfg.bTdlsCurrentDoingChannelSwitchWaitSuccess = FALSE;\n\tpAd->StaCfg.bDoingPeriodChannelSwitch = FALSE;\n\n\tRTMPusecDelay(300);\n\tNdisGetSystemUpTime(&pAd->StaCfg.TdlsGoBackStartTime);\n\n\tRTMP_SET_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n\tif (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)\n\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_ABOVE);\n\telse if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)\n\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_BELOW);\n\telse\n\t\tTDLS_InitChannelRelatedValue(pAd, pAd->CommonCfg.Channel, EXTCHA_NONE);\n\tTDLS_EnablePktChannel(pAd, TDLS_FIFO_ALL);\n\n\tRTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_TDLS_DOING_CHANNEL_SWITCH);\n}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/tdls_link_mng.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    tdls.h\n \n    Abstract:\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 802.11z\n */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\n#include \"rt_config.h\"\n\nUCHAR\tTdlsZeroSsid[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t\t\t\t\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};\n\nUCHAR\tCipherSuiteTDLSWpa2PskAes[] = {\n\t\t0x30,\t\t\t\t\t// RSN IE\n\t\t0x14,\t\t\t\t\t// Length\t\n\t\t0x01, 0x00,\t\t\t\t// Version\n\t\t0x00, 0x0F, 0xAC, 0x07,\t// no group cipher\n\t\t0x01, 0x00,\t\t\t\t// number of pairwise\n\t\t0x00, 0x0f, 0xAC, 0x04,\t// unicast, AES\n\t\t0x01, 0x00,\t\t\t\t// number of authentication method\n\t\t0x00, 0x0f, 0xAC, TDLS_AKM_SUITE_PSK,\t// TDLS authentication\n\t\t0x00, 0x02,\t\t\t\t// RSN capability, peer key enabled\n\t\t};\nUCHAR\tCipherSuiteTDLSLen = sizeof(CipherSuiteTDLSWpa2PskAes)/ sizeof(UCHAR);\n\n/*\n    ==========================================================================\n    Description:\n        dls state machine init, including state transition and timer init\n    Parameters:\n        Sm - pointer to the dls state machine\n    Note:\n        The state machine looks like this\n        \n                            DLS_IDLE\n    MT2_MLME_DLS_REQUEST   MlmeDlsReqAction\n    MT2_PEER_DLS_REQUEST   PeerDlsReqAction\n    MT2_PEER_DLS_RESPONSE  PeerDlsRspAction\n    MT2_MLME_DLS_TEARDOWN  MlmeTearDownAction\n    MT2_PEER_DLS_TEARDOWN  PeerTearDownAction\n        \n\tIRQL = PASSIVE_LEVEL\n\n    ==========================================================================\n */\nVOID TDLS_StateMachineInit(\n\tIN PRTMP_ADAPTER pAd, \n\tIN STATE_MACHINE *Sm, \n\tOUT STATE_MACHINE_FUNC Trans[]) \n{\n\tUCHAR i;\n\n\tStateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, (ULONG)MAX_TDLS_STATE,\n\t\t(ULONG)MAX_TDLS_MSG, (STATE_MACHINE_FUNC)Drop, TDLS_IDLE, TDLS_MACHINE_BASE);\n     \n\t/* the first column */\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_MLME_TDLS_SETUP_REQ, (STATE_MACHINE_FUNC)TDLS_MlmeSetupReqAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_PEER_TDLS_SETUP_REQ, (STATE_MACHINE_FUNC)TDLS_PeerSetupReqAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_PEER_TDLS_SETUP_RSP, (STATE_MACHINE_FUNC)TDLS_PeerSetupRspAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_PEER_TDLS_SETUP_CONF,(STATE_MACHINE_FUNC)TDLS_PeerSetupConfAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_MLME_TDLS_TEAR_DOWN, (STATE_MACHINE_FUNC)TDLS_MlmeTearDownAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_PEER_TDLS_TEAR_DOWN, (STATE_MACHINE_FUNC)TDLS_PeerTearDownAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_MLME_TDLS_DISCOVER_REQ, (STATE_MACHINE_FUNC)TDLS_MlmeDiscoveryReqAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_PEER_TDLS_DISCOVER_REQ, (STATE_MACHINE_FUNC)TDLS_PeerDiscoveryReqAction);\n#ifdef WFD_SUPPORT\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_MLME_TDLS_TUNNELED_REQ, (STATE_MACHINE_FUNC)TDLS_MlmeTunneledReqAction);\n\tStateMachineSetAction(Sm, TDLS_IDLE, MT2_PEER_TDLS_TUNNELED_REQ, (STATE_MACHINE_FUNC)TDLS_PeerTunneledReqRspAction);\n#endif /* WFD_SUPPORT */\n\n\tfor (i = 0; i < MAX_NUMBER_OF_DLS_ENTRY; i++)\n\t{\n\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[i].pAd = pAd;\n\n\t\tRTMPInitTimer(pAd, &pAd->StaCfg.TdlsInfo.TDLSEntry[i].Timer, GET_TIMER_FUNCTION(TDLS_TimeoutAction),\n\t\t\t\t\t\t&pAd->StaCfg.TdlsInfo.TDLSEntry[i], FALSE);\n\t}\n\n#ifdef UAPSD_SUPPORT\n\tTDLS_UAPSDP_Init(pAd, Sm);\n#endif /* UAPSD_SUPPORT */\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_BuildSetupRequest(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS)\n{\n\tULONG\t\t\tTimeout = TDLS_TIMEOUT;\n\tBOOLEAN\t\t\tTimerCancelled;\n\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_SETUP_REQUEST);\n\n\t/* fill Dialog Token */\n\tpAd->StaCfg.TdlsInfo.TdlsDialogToken++;\n\tif (pAd->StaCfg.TdlsInfo.TdlsDialogToken == 0)\n\t\tpAd->StaCfg.TdlsInfo.TdlsDialogToken++;\n\n\tpTDLS->Token = pAd->StaCfg.TdlsInfo.TdlsDialogToken;\n\tTDLS_InsertDialogToken(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS->Token);\n\n\t// fill capability\n\tTDLS_InsertCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t// fill support rate\n\tTDLS_InsertSupportRateIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t// fill country \n\tTDLS_InsertCountryIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t// fill ext rate\n\tTDLS_InsertExtRateIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t// fill support channels\n\tTDLS_InsertSupportChannelIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t// fill RSN if security is not NONE\n\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t{\t\t\n\t\tUCHAR\t\t\tCipherTmp[64] = {0};\n\t\tUCHAR\t\t\tCipherTmpLen = 0;\n\t\tULONG\t\t\ttmp;\n\t\t\n\t\t// RSNIE (7.3.2.25)\n\t\tCipherTmpLen = CipherSuiteTDLSLen;\t\n\t\t\tNdisMoveMemory(CipherTmp, CipherSuiteTDLSWpa2PskAes, CipherTmpLen);\n\t\t\n\t\t// Insert RSN_IE to outgoing frame\n\t\tMakeOutgoingFrame((pFrameBuf + *pFrameLen),\t&tmp,\n\t\t\t\tCipherTmpLen,\t\t\t\t\t\t&CipherTmp,\n\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + tmp;\n\t}\n\n\t// fill  Extended Capabilities (7.3.2.27)\n\tTDLS_InsertExtCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\t\n\t// fill Qos Capability\n\t//TDLS_InsertQosCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\t\n\t// TPK Handshake if RSNA Enabled\n\t// Pack TPK Message 1 here! \n\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t{\n\t\tFT_FTIE\t\t\tFtIe;\n\t\tUINT32\t\t\tKeyLifetime = pAd->StaCfg.TdlsInfo.TdlsKeyLifeTime;\t// sec\n\t\tUCHAR\t\t\tLength;\n\t\t\t\n\t\t/* FTIE (7.3.2.48) */\n\t\tNdisZeroMemory(&FtIe, sizeof(FtIe));\n\t\tLength =  sizeof(FtIe);\n\n\t\t/* generate SNonce */\n\t\tGenRandom(pAd, pAd->CurrentAddress, FtIe.SNonce);\n\t\thex_dump(\"TDLS - Generate SNonce \", FtIe.SNonce, 32);\n\t\tNdisMoveMemory(pTDLS->SNonce, FtIe.SNonce, 32);\n\t\t\n\t\tTDLS_InsertFTIE(pAd, \n\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\tpFrameLen, \n\t\t\t\tLength, \n\t\t\t\tFtIe.MICCtr,\n\t\t\t\tFtIe.MIC, \n\t\t\t\tFtIe.ANonce, \n\t\t\t\tFtIe.SNonce);\n\n\t\t/* Timeout Interval (7.3.2.49) */\n\t\tTDLS_InsertTimeoutIntervalIE(pAd,\n\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\tpFrameLen, \n\t\t\t\t2, /* key lifetime interval */\n\t\t\t\tKeyLifetime);\n\n\t\tpTDLS->KeyLifetime = KeyLifetime;\n\t}\n\n\t// fill Supported Regulatory Classes\n\tTDLS_SupportedRegulatoryClasses(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n#ifdef DOT11_N_SUPPORT\n\t// fill HT Capability\n\tTDLS_InsertHtCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t// fill 20/40 BSS Coexistence (7.3.2.61)\n#ifdef DOT11N_DRAFT3\n\tTDLS_InsertBSSCoexistenceIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n#endif // DOT11N_DRAFT3 //\n#endif // DOT11_N_SUPPORT //\n\n\t/* fill link identifier */\n\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pAd->CurrentAddress, pTDLS->MacAddr);\n\n\t// fill WMM\n\tTDLS_InsertWMMIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, TRUE);\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeLen = 0, WfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_LOCAL_IP_ADDR);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, (pFrameBuf + *pFrameLen), &WfdIeLen);\n\t\t*pFrameLen += WfdIeLen;\n\t}\n#endif /* WFD_SUPPORT */\n\n\t// ==>> Set sendout timer\n\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\tRTMPSetTimer(&pTDLS->Timer, Timeout);\n\n\t// ==>> State Change\n\tpTDLS->Status = TDLS_MODE_WAIT_RESPONSE;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_BuildSetupResponse(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS,\n\tIN\tUCHAR\tRsnLen,\n\tIN\tPUCHAR\tpRsnIe,\n\tIN\tUCHAR\tFTLen,\n\tIN\tPUCHAR\tpFTIe,\n\tIN\tUCHAR\tTILen,\n\tIN\tPUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode)\n{\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_SETUP_RESPONSE);\n\n\t/* fill status code */\n\tTDLS_InsertStatusCode(pAd, (pFrameBuf + *pFrameLen), pFrameLen, StatusCode);\n\n\t/* fill Dialog Token */\n\tTDLS_InsertDialogToken(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS->Token);\n\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\t/* fill fill capability */\n\t\tTDLS_InsertCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t// fill support rate\n\t\tTDLS_InsertSupportRateIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t// fill country \n\t\tTDLS_InsertCountryIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t/* fill ext rate */\n\t\tTDLS_InsertExtRateIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t// fill support channels\n\t\tTDLS_InsertSupportChannelIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t// fill Qos Capability\n\t\t//TDLS_InsertQosCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\n\t\t// fill RSN \n\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t{\t\t\n\t\t\tULONG\ttmp;\n\n\t\t\t/* RSNIE (7.3.2.25) */\n\t\t\t/* Insert RSN_IE of the Peer TDLS to outgoing frame */\n\t\t\tMakeOutgoingFrame((pFrameBuf + *pFrameLen),\t&tmp,\n\t\t\t\t\tRsnLen,\t\t\t\t\t\t\t\tpRsnIe,\n\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + tmp;\n\t\t}\t\n\n\t\t// fill  Extended Capabilities (7.3.2.27)\n\t\tTDLS_InsertExtCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t// fill WMM\n\t\tTDLS_InsertWMMIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen,TRUE);\n\t\t\t\n\t\t// TPK Handshake if RSNA Enabled\n\t\t// Pack TPK Message 2 here! \n\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t{\t\t\n\t\t\tFT_FTIE\t*ft;\n\t\t\tUINT\tkey_len = 16;\n\n\t\t\t// FTIE (7.3.2.48)\n\t\t\t// Construct FTIE (IE + Length + MIC Control + MIC + ANonce + SNonce)\n\t\t\t\n\t\t\t// point to the element of IE\n\t\t\tft = (FT_FTIE *)(pFTIe + 2);\t\n\t\t\t// generate ANonce\n\t\t\tGenRandom(pAd, pAd->CurrentAddress, ft->ANonce);\n\t\t\thex_dump(\"TDLS - Generate ANonce \", ft->ANonce, 32);\n\t\t\t// set MIC field to zero before MIC calculation\n\t\t\tNdisZeroMemory(ft->MIC, 16);\n\t\t\t// copy SNonce from peer TDLS\n\t\t\tNdisMoveMemory(ft->SNonce, pTDLS->SNonce, 32);\n\t\t\t// copy ANonce to TDLS entry\n\t\t\tNdisMoveMemory(pTDLS->ANonce, ft->ANonce, 32);\n\n\t\t\t/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */\n\t\t\t/* Derive TPK-KCK for MIC key, TPK-TK for direct link data */\n\t\t\tTDLS_FTDeriveTPK(\n\t\t\t\t\tpTDLS->MacAddr,\t/* MAC Address of Initiator */\n\t\t\t\t\tpAd->CurrentAddress, /* I am Responder */\n\t\t\t\t\tpTDLS->ANonce, \n\t\t\t\t\tpTDLS->SNonce, \n\t\t\t\t\tpAd->CommonCfg.Bssid,\n\t\t\t\t\tkey_len,\n\t\t\t\t\tpTDLS->TPK,\n\t\t\t\t\tpTDLS->TPKName);\n\n\t\t\t/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */\n\n\t\t\t/*////////////////////////////////////////////////////////////////////*/\n\t\t\t/* The MIC field of FTIE shall be calculated on the concatenation, in the following order, of */\n\t\t\t/* 1. MAC_I (6 bytes) */\n\t\t\t/* 2. MAC_R (6 bytes) */\n\t\t\t/* 3. Transaction Sequence = 2 (1 byte) */\n\t\t\t/* 4. Link Identifier (20 bytes) */\n\t\t\t/* 5. RSN IE without the IE header (20 bytes) */\n\t\t\t/* 6. Timeout Interval IE (7 bytes) */\n\t\t\t/* 7. FTIE without the IE header, with the MIC field of FTIE set to zero (82 bytes) */\n\t\t\t{\n\t\t\t\tUCHAR\tcontent[512];\n\t\t\t\tULONG\tc_len = 0;\n\t\t\t\tULONG\ttmp_len = 0;\n\t\t\t\tUCHAR\tSeq = 2;\n\t\t\t\tUCHAR\tmic[16];\n\t\t\t\tUCHAR\tLinkIdentifier[20];\n\t\t\t\tUINT\ttmp_aes_len = 0;\n\n\t\t\t\tNdisZeroMemory(LinkIdentifier, 20);\n\t\t\t\tLinkIdentifier[0] = IE_TDLS_LINK_IDENTIFIER;\n\t\t\t\tLinkIdentifier[1] = 18;\n\t\t\t\tNdisMoveMemory(&LinkIdentifier[2], pAd->CommonCfg.Bssid, 6);\n\t\t\t\tNdisMoveMemory(&LinkIdentifier[8], pTDLS->MacAddr, 6);\n\t\t\t\tNdisMoveMemory(&LinkIdentifier[14], pAd->CurrentAddress, 6);\n\n\t\t\t\tNdisZeroMemory(mic, sizeof(mic));\n\n\t\t\t\t/* make a header frame for calculating MIC. */\n\t\t\t\tMakeOutgoingFrame(content,\t\t\t\t\t&tmp_len,\n\t\t\t                      MAC_ADDR_LEN,\t\t\t\tpTDLS->MacAddr,\n\t\t\t                      MAC_ADDR_LEN,\t\t\t\tpAd->CurrentAddress,\n\t\t\t                      1,\t\t\t\t\t\t&Seq,\n\t\t\t                      END_OF_ARGS);\n\t\t\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t\t\t/* concatenate Link Identifier */\t\t\t\n\t\t\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t                      20,\t\t\t\t\tLinkIdentifier,\n\t\t\t                      END_OF_ARGS);\n\t\t\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t\t\t/* concatenate RSNIE */\n\t\t\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t                      RsnLen,\t\t\t\t\tpRsnIe,\n\t\t\t                      END_OF_ARGS);\n\t\t\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t\t\t/* concatenate Timeout Interval IE */\n\t\t\t\tMakeOutgoingFrame(content + c_len,     &tmp_len,\n\t\t\t\t\t\t\t\t  7,\t\t\t\t\tpTIIe,\n\t\t\t\t\t\t\t\t  END_OF_ARGS);\n\t\t\t\tc_len += tmp_len;\n\n\t\t\t\t/* concatenate FTIE */\t\t\t\n\t\t\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t                      (sizeof(FT_FTIE) + 2),\tpFTIe,\n\t\t\t                      END_OF_ARGS);\n\t\t\t\tc_len += tmp_len;\n\n\t\t\t\t/* Calculate MIC */\t\t\t\t\n\t\t\t\t/*AES_128_CMAC(pTDLS->TPK, content, c_len, mic); */\n\n\t\t\t\t/* Compute AES-128-CMAC over the concatenation */\n\t\t\t\ttmp_aes_len = AES_KEY128_LENGTH;\n    \t\t\tAES_CMAC(content, c_len, pTDLS->TPK, 16, mic, &tmp_aes_len);\n\n\t\t\t\t/* Fill Mic to ft struct */\n\t\t\t\tNdisMoveMemory(ft->MIC, mic, 16);\n\n\t\t\t}\n\t\t\t/*////////////////////////////////////////////////////////////////////*/\n\t\t\t\n\t\t\t/* Insert FT_IE to outgoing frame */\n\t\t\tTDLS_InsertFTIE(\n\t\t\t\t\tpAd, \n\t\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\t\tpFrameLen, \n\t\t\t\t\tsizeof(FT_FTIE), \n\t\t\t\t\tft->MICCtr, \n\t\t\t\t\tft->MIC, \n\t\t\t\t\tft->ANonce, \n\t\t\t\t\tft->SNonce);\n\n\t\t\t/* Timeout Interval (7.3.2.49) */\n\t\t\t/* Insert TI_IE to outgoing frame */\n\t\t\tTDLS_InsertTimeoutIntervalIE(\n\t\t\t\t\tpAd, \n\t\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\t\tpFrameLen, \n\t\t\t\t\t2, /* key lifetime interval */\n\t\t\t\t\tpTDLS->KeyLifetime);\n\t\t}\t\n\n\t\t// fill Supported Regulatory Classes\n\t\tTDLS_SupportedRegulatoryClasses(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n#ifdef DOT11_N_SUPPORT\n\t\t// fill HT Capability\n\t\tTDLS_InsertHtCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n\t\t// fill 20/40 BSS Coexistence (7.3.2.61)\n#ifdef DOT11N_DRAFT3\n\t\tTDLS_InsertBSSCoexistenceIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n#endif // DOT11N_DRAFT3 //\n#endif // DOT11_N_SUPPORT //\n\n\t\t/* fill link identifier */\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS->MacAddr, pAd->CurrentAddress);\n\n#ifdef WFD_SUPPORT\n\t\t{\n\t\t\tULONG\tWfdIeLen = 0, WfdIeBitmap;\n\n\t\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_LOCAL_IP_ADDR);\n\t\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, (pFrameBuf + *pFrameLen), &WfdIeLen);\n\t\t\t*pFrameLen += WfdIeLen;\n\t\t}\n#endif /* WFD_SUPPORT */\n\n\t}\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_BuildSetupConfirm(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\tpTDLS,\n\tIN\tUCHAR\tRsnLen,\n\tIN\tPUCHAR\tpRsnIe,\n\tIN\tUCHAR\tFTLen,\n\tIN\tPUCHAR\tpFTIe,\n\tIN\tUCHAR\tTILen,\n\tIN\tPUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode)\n{\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_SETUP_CONFIRM);\n\n\t/* fill status code */\n\tTDLS_InsertStatusCode(pAd, (pFrameBuf + *pFrameLen), pFrameLen, StatusCode);\n\n\t/* fill Dialog Token */\n\tTDLS_InsertDialogToken(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS->Token);\n\n\t// fill Qos Capability\n\t//TDLS_InsertEDCAParameterSetIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS);\n\n\t// TPK Handshake if RSNA Enabled\n\t// Pack TPK Message 3 here! \n\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t{\t\t\n\t\tFT_FTIE\t*ft;\n\t\tULONG\ttmp;\n\t\t\t\n\t\t/* RSNIE (7.3.2.25) */\n\t\t/* Insert RSN_IE of the Peer TDLS to outgoing frame */\n\t\tMakeOutgoingFrame((pFrameBuf + *pFrameLen),\t&tmp,\n\t\t\t\t\t\t\tRsnLen,\t\t\t\t\tpRsnIe,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t*pFrameLen = *pFrameLen + tmp;\n\t\t\n\t\t\t\t\n\t\t/* FTIE (7.3.2.48) */\n\t\t/* Construct FTIE (IE + Length + MIC Control + MIC + ANonce + SNonce) */\n\t\n\t\t/* point to the element of IE */\n\t\tft = (FT_FTIE *)(pFTIe + 2);\t\n\t\t/* set MIC field to zero before MIC calculation */\n\t\tNdisZeroMemory(ft->MIC, 16);\n\n\t\t/*\n\t\t\tThe MIC field of FTIE shall be calculated on the concatenation, in the following order, of\n\t\t\t1. MAC_I (6 bytes)\n\t\t\t2. MAC_R (6 bytes)\n\t\t\t3. Transaction Sequence = 2 (1 byte)\n\t\t\t4. Link Identifier (20 bytes)\n\t\t\t5. RSN IE without the IE header (20 bytes)\n\t\t\t6. Timeout Interval IE (7 bytes)\n\t\t\t7. FTIE without the IE header, with the MIC field of FTIE set to zero (82 bytes)\n\t\t*/\n\t\t{\n\t\t\tUCHAR\tcontent[512];\n\t\t\tULONG\tc_len = 0;\n\t\t\tULONG\ttmp_len = 0;\n\t\t\tUCHAR\tSeq = 3;\n\t\t\tUCHAR\tmic[16];\n\t\t\tUCHAR\tLinkIdentifier[20];\n\t\t\tUINT\ttmp_aes_len = 0;\n\n\t\t\tNdisZeroMemory(LinkIdentifier, 20);\n\t\t\tLinkIdentifier[0] = IE_TDLS_LINK_IDENTIFIER;\n\t\t\tLinkIdentifier[1] = 18;\n\t\t\tNdisMoveMemory(&LinkIdentifier[2], pAd->CommonCfg.Bssid, 6);\n\t\t\tNdisMoveMemory(&LinkIdentifier[8], pAd->CurrentAddress, 6);\n\t\t\tNdisMoveMemory(&LinkIdentifier[14], pTDLS->MacAddr, 6);\n\n\t\t\tNdisZeroMemory(mic, sizeof(mic));\n\n\t\t\t/* make a header frame for calculating MIC. */\n\t\t\tMakeOutgoingFrame(content,\t\t\t\t\t&tmp_len,\n\t\t\t\t\t\t\t\tMAC_ADDR_LEN,\t\t\tpAd->CurrentAddress,\n\t\t\t\t\t\t\t\tMAC_ADDR_LEN,\t\t\tpTDLS->MacAddr,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t\t&Seq,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t\t/* concatenate Link Identifier */\t\t\t\n\t\t\tMakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\t\t20,\t\t\t\t\tLinkIdentifier,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t\t\t\n\t\t\t/* concatenate RSNIE */\n\t\t\tMakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\t\tRsnLen,\t\t\t\t\tpRsnIe,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t\t/* concatenate Timeout Interval IE */\n\t\t\tMakeOutgoingFrame(content + c_len,     &tmp_len,\n\t\t\t\t\t\t\t\t7,\t\t\t\t\tpTIIe,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tc_len += tmp_len;\n\n\t\t\t/* concatenate FTIE */\t\t\t\n\t\t\tMakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\t\t(sizeof(FT_FTIE) + 2),\tpFTIe,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tc_len += tmp_len;\t\n\n\t\t\t/* Calculate MIC */\t\t\t\t\n\t\t\t/* AES_128_CMAC(pTDLS->TPK, content, c_len, mic); */\n\n\t\t\t/* Compute AES-128-CMAC over the concatenation */\n\t\t\ttmp_aes_len = AES_KEY128_LENGTH;\n    \t\tAES_CMAC(content, c_len, pTDLS->TPK, 16, mic, &tmp_aes_len);\n\n\t\t\t/* Fill Mic to ft struct */\n\t\t\tNdisMoveMemory(ft->MIC, mic, 16);\n\t\t}\n\t\t/*////////////////////////////////////////////////////////////////////*/\n\t\n\t\t/* Insert FT_IE to outgoing frame */\n\t\tTDLS_InsertFTIE(\n\t\t\t\t\tpAd, \n\t\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\t\tpFrameLen, \n\t\t\t\t\tsizeof(FT_FTIE), \n\t\t\t\t\tft->MICCtr, \n\t\t\t\t\tft->MIC, \n\t\t\t\t\tft->ANonce, \n\t\t\t\t\tft->SNonce);\n\n\t\t/* Timeout Interval (7.3.2.49) */\n\t\t/* Insert TI_IE to outgoing frame */\n\t\tTDLS_InsertTimeoutIntervalIE(\n\t\t\t\t\tpAd, \n\t\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\t\tpFrameLen, \n\t\t\t\t\t2, /* key lifetime interval */\n\t\t\t\t\tpTDLS->KeyLifetime);\n\n\t}\n\n#ifdef DOT11_N_SUPPORT\n\t// fill HT Capability\n\tTDLS_InsertHtCapIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n#endif // DOT11_N_SUPPORT //\n\n\t/* fill link identifier */\n\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pAd->CurrentAddress, pTDLS->MacAddr);\n\n\t// fill WMM Parameter IE\n\tTDLS_InsertWMMParameterIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen);\n\n#ifdef WFD_SUPPORT\n\t{\n\t\tULONG\tWfdIeLen = 0, WfdIeBitmap;\n\n\t\tWfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |\n\t\t\t(0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_LOCAL_IP_ADDR);\n\t\tWfdMakeWfdIE(pAd, WfdIeBitmap, (pFrameBuf + *pFrameLen), &WfdIeLen);\n\t\t*pFrameLen += WfdIeLen;\n\t}\n#endif /* WFD_SUPPORT */\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_BuildTeardown(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT PUCHAR\tpFrameBuf,\n\tOUT PULONG\tpFrameLen,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN\tUINT16\tReasonCode)\n{\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_TEARDOWN);\n\n\t/* fill reason code */\n\tTDLS_InsertReasonCode(pAd, (pFrameBuf + *pFrameLen), pFrameLen, ReasonCode);\n\n\t// FTIE includes if RSNA Enabled\n\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t{\t\n\t\tUCHAR\t\tFTIe[128];\t\n\t\tFT_FTIE\t\t*ft = NULL;\n\t\tUCHAR\t\tcontent[256];\n\t\tULONG\t\tc_len = 0;\n\t\tULONG\t\ttmp_len = 0;\n\t\tUCHAR\t\tseq = 4;\n\t\tUCHAR\t\tmic[16];\n\t\tUCHAR\t\tLinkIdentifier[20];\n\t\tUINT\t\ttmp_aes_len = 0;\n\n\t\tNdisZeroMemory(LinkIdentifier, 20);\n\t\tLinkIdentifier[0] = IE_TDLS_LINK_IDENTIFIER;\n\t\tLinkIdentifier[1] = 18;\n\n\t\tNdisMoveMemory(&LinkIdentifier[2], pAd->CommonCfg.Bssid, 6);\n\t\tif (pTDLS->bInitiator)\n\t\t{\n\t\t\tNdisMoveMemory(&LinkIdentifier[8], pTDLS->MacAddr, 6);\n\t\t\tNdisMoveMemory(&LinkIdentifier[14], pAd->CurrentAddress, 6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNdisMoveMemory(&LinkIdentifier[8], pAd->CurrentAddress, 6);\n\t\t\tNdisMoveMemory(&LinkIdentifier[14], pTDLS->MacAddr, 6);\n\t\t}\n\n\n\t\t/* FTIE (7.3.2.48) */\n\t\t/* The contents of FTIE in the TDLS Teardown frame shall be the same as that included */\n\t\t/* in the TPK Handshake Message3 with the exception of the MIC field. */\n\n\t\t/* Construct FTIE (IE + Length + MIC Control + MIC + ANonce + SNonce) */\n\t\t\t\n\t\t/* point to the element of IE */\n\t\tNdisZeroMemory(FTIe, sizeof(FTIe));\n\t\tFTIe[0] = IE_FT_FTIE;\n\t\tFTIe[1] = sizeof(FT_FTIE);\n\t\tft = (PFT_FTIE)&FTIe[2];\t\n\t\tNdisMoveMemory(ft->ANonce, pTDLS->ANonce, 32);\n\t\tNdisMoveMemory(ft->SNonce, pTDLS->SNonce, 32);\n\n\t\t/*\n\t\t\tThe MIC field of FTIE shall be calculated on the concatenation, in the following order, of\n\t\t\t1. Link Identifier (20 bytes)\n\t\t\t2. Reason Code (2 bytes)\n\t\t\t3. Dialog token (1 byte)\n\t\t\t4. Transaction Sequence = 4 (1 byte)\n\t\t\t5. FTIE with the MIC field of FTIE set to zero (84 bytes)\n\t\t*/\n\t\t\n\t\t/* concatenate Link Identifier, Reason Code, Dialog token, Transaction Sequence */\n\t\tMakeOutgoingFrame(content,            \t\t&tmp_len,\n\t\t\t\t\t\tsizeof(LinkIdentifier),\t\tLinkIdentifier,\t\n\t\t\t\t\t\t2,\t\t\t\t\t\t\t&ReasonCode,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&pTDLS->Token,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&seq,\n\t\t\t\t\t\tEND_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate FTIE */\n\t\tMakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\tFTIe[1] + 2,\t\tFTIe,  \n\t\t\t\t\t\tEND_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\t\t\n\t\t/* Calculate MIC */\n\t\tNdisZeroMemory(mic, sizeof(mic));\n\t\t/*AES_128_CMAC(pTDLS->TPK, content, c_len, mic); */\n\n\t\t/* Compute AES-128-CMAC over the concatenation */\n\t\ttmp_aes_len = AES_KEY128_LENGTH;\n    \tAES_CMAC(content, c_len, pTDLS->TPK, 16, mic, &tmp_aes_len);\n\t\t\n\t\t/* Fill Mic to ft struct */\n\t\tNdisMoveMemory(ft->MIC, mic, 16);\n\n\t\t/* Insert FT_IE to outgoing frame */\n\t\tTDLS_InsertFTIE(\n\t\t\t\t\tpAd, \n\t\t\t\t\t(pFrameBuf + *pFrameLen), \n\t\t\t\t\tpFrameLen, \n\t\t\t\t\tFTIe[1], \n\t\t\t\t\tft->MICCtr, \n\t\t\t\t\tft->MIC, \n\t\t\t\t\tft->ANonce, \n\t\t\t\t\tft->SNonce);\n\t}\n\n\t/* fill link identifier */\n\tif (pTDLS->bInitiator)\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pTDLS->MacAddr, pAd->CurrentAddress);\n\telse\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen, pAd->CurrentAddress, pTDLS->MacAddr);\n\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nUSHORT\tTDLS_TPKMsg1Process(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n#ifdef WFD_SUPPORT\n\tIN\tULONG\t\t\t\tWfdSubelementLen,\n#endif /* WFD_SUPPORT */\n\tIN\tPRT_802_11_TDLS\t\tpTDLS,\n\tIN\tPUCHAR\t\t\t\tpRsnIe, \n\tIN\tUCHAR\t\t\t\tRsnLen, \n\tIN\tPUCHAR\t\t\t\tpFTIe, \n\tIN\tUCHAR\t\t\t\tFTLen, \n\tIN\tPUCHAR\t\t\t\tpTIIe, \n\tIN\tUCHAR\t\t\t\tTILen)\n{\n\tUSHORT\t\t\tStatusCode = MLME_SUCCESS;\n\tUCHAR\t\t\tCipherTmp[64] = {0};\n\tUCHAR\t\t\tCipherTmpLen = 0;\n\tFT_FTIE\t\t\t*ft = NULL;\n\n\t/* Validate RsnIE */\n\t/* */\n\tif (RsnLen == 0) /* RSN not exist */\n\t\treturn  MLME_INVALID_INFORMATION_ELEMENT;\n\n\tif (pRsnIe[2] < 1) /* Smaller version */\n\t\treturn\tMLME_NOT_SUPPORT_RSN_VERSION;\n\n\tCipherTmpLen = CipherSuiteTDLSLen;\n\t\tNdisMoveMemory(CipherTmp, CipherSuiteTDLSWpa2PskAes, CipherTmpLen);\n\n\tif ( RTMPEqualMemory(&pRsnIe[16], &CipherTmp[16], 4) == 0) // Invalid TDLS AKM\n\t\treturn MLME_INVALID_AKMP;\n\n\t//if ( RTMPEqualMemory(&pRsnIe[20], &CipherTmp[20], 2) == 0) // Invalid RSN capability\n\tif (((pRsnIe[20] & 0x2) != 0) || ((pRsnIe[21] & 0x2) == 0))\n\t\treturn MLME_INVALID_RSN_CAPABILITIES;\n\n\t//if ((RsnLen != 22) || (RTMPEqualMemory(pRsnIe, CipherTmp, RsnLen) == 0)) // Invalid Pairwise Cipher\n\t// todo make check\n\t//if ((RsnLen != 22) || (RTMPEqualMemory(pRsnIe, CipherTmp, (RsnLen - 2)) == 0))\n\t//\treturn REASON_UCIPHER_NOT_VALID;\n\n\t// Validate FTIE\n\t//\n\tft = (PFT_FTIE)(pFTIe + 2); // point to the element of IE\n\tif ((FTLen != (sizeof(FT_FTIE) + 2)) || RTMPEqualMemory(&ft->MICCtr, TdlsZeroSsid, 2) == 0 || \n\t\t(RTMPEqualMemory(ft->MIC, TdlsZeroSsid, 16) == 0) || (RTMPEqualMemory(ft->ANonce, TdlsZeroSsid, 32) == 0))\n\t\treturn REASON_FT_INVALID_FTIE;\n\n\t// Validate TIIE\n\t//\n\t//if ((TILen != 7) || (pTIIe[2] != 2) || ( le2cpu32(*((PULONG) (pTIIe + 3))) < keyLifeTime))\n\tif ((TILen != 7) || (pTIIe[2] != 2))\n\t\treturn TDLS_STATUS_CODE_UNACCEPTABLE_LIFETIME;\n\n\treturn StatusCode;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nUSHORT\tTDLS_TPKMsg2Process(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPRT_802_11_TDLS\t\tpTDLS,\n\tIN\tPUCHAR\t\t\t\tpRsnIe, \n\tIN\tUCHAR\t\t\t\tRsnLen, \n\tIN\tPUCHAR\t\t\t\tpFTIe, \n\tIN\tUCHAR\t\t\t\tFTLen, \n\tIN\tPUCHAR\t\t\t\tpTIIe, \n\tIN\tUCHAR\t\t\t\tTILen,\n\tOUT\tPUCHAR\t\t\t\tpTPK,\n\tOUT PUCHAR\t\t\t\tpTPKName)\n{\n\tUSHORT\t\tStatusCode = MLME_SUCCESS;\n\tUCHAR\t\tCipherTmp[64] = {0};\n\tUCHAR\t\tCipherTmpLen = 0;\n\tFT_FTIE\t\t*ft = NULL;\t\t\t\n\tUCHAR\t\toldMic[16];\n\tUCHAR\t\tLinkIdentifier[20];\n\tUINT\t\tkey_len = 16;\n\tUINT32\tkeyLifeTime = pAd->StaCfg.TdlsInfo.TdlsKeyLifeTime;\n\t\n\t/* Validate RsnIE */\n\t/* */\n\tif (RsnLen == 0) /* RSN not exist */\n\t\treturn  MLME_INVALID_INFORMATION_ELEMENT;\n\n\tif (pRsnIe[2] < 1) /* Smaller version */\n\t\treturn\tMLME_NOT_SUPPORT_RSN_VERSION;\n\n\tCipherTmpLen = CipherSuiteTDLSLen;\n\t\tNdisMoveMemory(CipherTmp, CipherSuiteTDLSWpa2PskAes, CipherTmpLen);\n\n\tif ( RTMPEqualMemory(&pRsnIe[16], &CipherTmp[16], 4) == 0) // Invalid TDLS AKM\n\t\treturn MLME_INVALID_AKMP;\n\n\t//if ( RTMPEqualMemory(&pRsnIe[20], &CipherTmp[20], 2) == 0) // Invalid RSN capability\n\tif (((pRsnIe[20] & 0x2) != 0) || ((pRsnIe[21] & 0x2) == 0))\n\t\treturn MLME_INVALID_RSN_CAPABILITIES;\n\n\t// todo make check\n\t//if ((RsnLen != 22) || (RTMPEqualMemory(pRsnIe, CipherTmp, RsnLen) == 0)) // Invalid Pairwise Cipher\n\t//if ((RsnLen != 22) || (RTMPEqualMemory(pRsnIe, CipherTmp, (RsnLen - 2)) == 0))\n\t\t//return REASON_UCIPHER_NOT_VALID;\n\n\t/* Validate FTIE */\n\tft = (PFT_FTIE)(pFTIe + 2); /* point to the element of IE */\n\tif ((FTLen != (sizeof(FT_FTIE) + 2)) || RTMPEqualMemory(&ft->MICCtr, TdlsZeroSsid, 2) == 0 || \n\t\t(RTMPEqualMemory(ft->SNonce, pTDLS->SNonce, 32) == 0))\n\t\treturn REASON_FT_INVALID_FTIE;\n\n\t/* Validate TIIE */\n\tif ((TILen != 7) || (pTIIe[2] != 2) || ( le2cpu32(*((PULONG) (pTIIe + 3))) < TDLS_KEY_TIMEOUT))\n\t\treturn TDLS_STATUS_CODE_UNACCEPTABLE_LIFETIME;\n\n\n\t/* Validate the MIC field of FTIE */\n\t\n\t/* point to the element of IE */\n\tft = (PFT_FTIE)(pFTIe + 2);\t\n\t/* backup MIC fromm the peer TDLS */\n\tNdisMoveMemory(oldMic, ft->MIC, 16);\n\n\t\n\t/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */\n\t/* Derive TPK-KCK for MIC key, TPK-TK for direct link data */\n\tTDLS_FTDeriveTPK(\n\t\t\tpAd->CurrentAddress, /* I am Initiator */\n\t\t\tpTDLS->MacAddr,\t/* MAC Address of Responder */\n\t\t\tft->ANonce, \n\t\t\tft->SNonce, \n\t\t\tpAd->CommonCfg.Bssid,\n\t\t\tkey_len,\n\t\t\tpTPK,\n\t\t\tpTPKName);\n\t\n\t/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */\n\t\n\t/* set MIC field to zero before MIC calculation */\n\tNdisZeroMemory(ft->MIC, 16);\n\n\t/* Construct LinkIdentifier (IE + Length + BSSID + Initiator MAC + Responder MAC) */\n\tNdisZeroMemory(LinkIdentifier, 20);\n\tLinkIdentifier[0] = IE_TDLS_LINK_IDENTIFIER;\n\tLinkIdentifier[1] = 18;\n\tNdisMoveMemory(&LinkIdentifier[2], pAd->CommonCfg.Bssid, 6);\n\tNdisMoveMemory(&LinkIdentifier[8], pAd->CurrentAddress, 6);\n\tNdisMoveMemory(&LinkIdentifier[14], pTDLS->MacAddr, 6);\n\n\t/*////////////////////////////////////////////////////////////////////*/\n\t/* The MIC field of FTIE shall be calculated on the concatenation, in the following order, of */\n\t/* 1. MAC_I (6 bytes) */\n\t/* 2. MAC_R (6 bytes) */\n\t/* 3. Transaction Sequence = 2 (1 byte) */\n\t/* 4. Link Identifier (20 bytes) */\n\t/* 5. RSN IE without the IE header (20 bytes) */\n\t/* 6. Timeout Interval IE (7 bytes) */\n\t/* 7. FTIE without the IE header, with the MIC field of FTIE set to zero (82 bytes) */\n\t{\n\t\tUCHAR\tcontent[512];\n\t\tULONG\tc_len = 0;\n\t\tULONG\ttmp_len = 0;\n\t\tUCHAR\tSeq = 2;\n\t\tUCHAR\tmic[16];\n\t\tUINT\ttmp_aes_len = 0;\n\t\t\n\t\tNdisZeroMemory(mic, sizeof(mic));\n\t\t\t\n\t\t/* make a header frame for calculating MIC. */\n\t\tMakeOutgoingFrame(content,\t\t\t\t\t&tmp_len,\n\t                      MAC_ADDR_LEN,\t\t\t\tpAd->CurrentAddress,\n\t                      MAC_ADDR_LEN,\t\t\t\tpTDLS->MacAddr,\n\t                      1,\t\t\t\t\t\t&Seq,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate Link Identifier */\t\t\t\n\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t                      20,\t\t\t\t\tLinkIdentifier,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate RSNIE */\n\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\tRsnLen,\t\t\t\t\tpRsnIe,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate Timeout Interval IE */\n\t\tMakeOutgoingFrame(content + c_len,     &tmp_len,\n\t\t\t\t\t\t  7,\t\t\t\t\tpTIIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tc_len += tmp_len;\n\t\t\n\t\t/* concatenate FTIE */\t\t\t\n\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\t(sizeof(FT_FTIE) + 2),\tpFTIe,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\n\t\t\n\t\t/* Calculate MIC */\t\t\t\t\n\t\t/* AES_128_CMAC(pTPK, content, c_len, mic); */\n\n\t\t/* Compute AES-128-CMAC over the concatenation */\n\t\ttmp_aes_len = AES_KEY128_LENGTH;\n    \tAES_CMAC(content, c_len, pTPK, 16, mic, &tmp_aes_len);\n\n\t\tNdisMoveMemory(ft->MIC, mic, 16);\n\n\t}\n\t/*////////////////////////////////////////////////////////////////////*/\n\t\n\tif (RTMPEqualMemory(oldMic, ft->MIC, 16) == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS_TPKMsg2Process() MIC Error!!! \\n\"));\n\t\treturn MLME_REQUEST_DECLINED;\n\t}\n\n\treturn StatusCode;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nUSHORT\tTDLS_TPKMsg3Process(\n\tIN\tPRTMP_ADAPTER\t\tpAd, \n\tIN\tPRT_802_11_TDLS\t\tpTDLS,\n\tIN\tPUCHAR\t\t\t\tpRsnIe, \n\tIN\tUCHAR\t\t\t\tRsnLen, \n\tIN\tPUCHAR\t\t\t\tpFTIe, \n\tIN\tUCHAR\t\t\t\tFTLen, \n\tIN\tPUCHAR\t\t\t\tpTIIe, \n\tIN\tUCHAR\t\t\t\tTILen)\n{\n\tUSHORT\t\t\tStatusCode = MLME_SUCCESS;\n\tUCHAR\t\t\tCipherTmp[64] = {0};\n\tUCHAR\t\t\tCipherTmpLen = 0;\n\tFT_FTIE\t\t\t*ft = NULL;\t\t\t\n\tUCHAR\t\t\toldMic[16];\n\tUCHAR\t\t\tLinkIdentifier[20];\n\t\n\t/* Validate RsnIE */\n\t/* */\n\tif (RsnLen == 0) /* RSN not exist */\n\t\treturn  MLME_INVALID_INFORMATION_ELEMENT;\n\n\tif (pRsnIe[2] < 1) /* Smaller version */\n\t\treturn\tMLME_NOT_SUPPORT_RSN_VERSION;\n\n\tCipherTmpLen = CipherSuiteTDLSLen;\n\t\tNdisMoveMemory(CipherTmp, CipherSuiteTDLSWpa2PskAes, CipherTmpLen);\n\n\tif ( RTMPEqualMemory(&pRsnIe[16], &CipherTmp[16], 4) == 0) // Invalid TDLS AKM\n\t\treturn MLME_INVALID_AKMP;\n\n\t//if ( RTMPEqualMemory(&pRsnIe[20], &CipherTmp[20], 2) == 0) // Invalid RSN capability\n\tif (((pRsnIe[20] & 0x2) != 0) || ((pRsnIe[21] & 0x2) == 0))\n\t\treturn MLME_INVALID_RSN_CAPABILITIES;\n\n\t// todo make check\n\t//if ((RsnLen != 22) || (RTMPEqualMemory(pRsnIe, CipherTmp, (RsnLen - 2)) == 0)) // Invalid Pairwise Cipher\n\t\t//return REASON_UCIPHER_NOT_VALID;\n\n\t/* Validate FTIE */\n\tft = (PFT_FTIE)(pFTIe + 2); /* point to the element of IE */\n\tif ((FTLen != (sizeof(FT_FTIE) + 2)) || RTMPEqualMemory(&ft->MICCtr, TdlsZeroSsid, 2) == 0 || \n\t\t(RTMPEqualMemory(ft->SNonce, pTDLS->SNonce, 32) == 0) || (RTMPEqualMemory(ft->ANonce, pTDLS->ANonce, 32) == 0))\n\t\treturn REASON_FT_INVALID_FTIE;\n\n\t/* Validate TIIE */\n\t/* */\n\tif ((TILen != 7) || (pTIIe[2] != 2) || ( le2cpu32(*((PULONG) (pTIIe + 3))) < pTDLS->KeyLifetime))\n\t\treturn TDLS_STATUS_CODE_UNACCEPTABLE_LIFETIME;\n\n\n\t/* Validate the MIC field of FTIE */\n\t\n\t/* point to the element of IE */\n\tft = (PFT_FTIE)(pFTIe + 2);\t\n\t/* backup MIC fromm the peer TDLS */\n\tNdisMoveMemory(oldMic, ft->MIC, 16);\n\n\t\t\n\t/* set MIC field to zero before MIC calculation */\n\tNdisZeroMemory(ft->MIC, 16);\n\n\t/* Construct LinkIdentifier (IE + Length + BSSID + Initiator MAC + Responder MAC) */\n\tNdisZeroMemory(LinkIdentifier, 20);\n\tLinkIdentifier[0] = IE_TDLS_LINK_IDENTIFIER;\n\tLinkIdentifier[1] = 18;\n\tNdisMoveMemory(&LinkIdentifier[2], pAd->CommonCfg.Bssid, 6);\n\tNdisMoveMemory(&LinkIdentifier[8], pTDLS->MacAddr, 6);\n\tNdisMoveMemory(&LinkIdentifier[14], pAd->CurrentAddress, 6);\n\n\t/*////////////////////////////////////////////////////////////////////*/\n\t/* The MIC field of FTIE shall be calculated on the concatenation, in the following order, of */\n\t/* 1. MAC_I (6 bytes) */\n\t/* 2. MAC_R (6 bytes) */\n\t/* 3. Transaction Sequence = 3 (1 byte) */\n\t/* 4. Link Identifier (20 bytes) */\n\t/* 5. RSN IE without the IE header (20 bytes) */\n\t/* 6. Timeout Interval IE (7 bytes) */\n\t/* 7. FTIE without the IE header, with the MIC field of FTIE set to zero (82 bytes) */\n\t{\n\t\tUCHAR\tcontent[512];\n\t\tULONG\tc_len = 0;\n\t\tULONG\ttmp_len = 0;\n\t\tUCHAR\tSeq = 3;\n\t\tUCHAR\tmic[16];\n\t\tUINT\ttmp_aes_len = 0;\n\t\t\n\t\tNdisZeroMemory(mic, sizeof(mic));\n\t\t\t\n\t\t/* make a header frame for calculating MIC. */\n\t\tMakeOutgoingFrame(content,\t\t\t\t\t&tmp_len,\n\t                      MAC_ADDR_LEN,\t\t\t\tpTDLS->MacAddr,\n\t                      MAC_ADDR_LEN,\t\t\t\tpAd->CurrentAddress,\n\t                      1,\t\t\t\t\t\t&Seq,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate Link Identifier */\t\t\t\n\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t                      20,\t\t\t\t\tLinkIdentifier,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate RSNIE */\n\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\tRsnLen,\t\t\t\tpRsnIe,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\t\t\t\t\t\n\n\t\t/* concatenate Timeout Interval IE */\n\t\tMakeOutgoingFrame(content + c_len,     &tmp_len,\n\t\t\t\t\t\t  7,\t\t\t\t\tpTIIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\t\tc_len += tmp_len;\n\t\t\n\t\t/* concatenate FTIE */\t\t\t\n\t    MakeOutgoingFrame(content + c_len,\t\t&tmp_len,\n\t\t\t\t\t\t\t(sizeof(FT_FTIE) + 2),\tpFTIe,\n\t                      END_OF_ARGS);\n\t\tc_len += tmp_len;\n\t\t\n\t\t/* Calculate MIC */\t\t\t\t\n\t\t//AES_128_CMAC(pTDLS->TPK, content, c_len, mic);\n\n\t\t/* Compute AES-128-CMAC over the concatenation */\n\t\ttmp_aes_len = AES_KEY128_LENGTH;\n    \tAES_CMAC(content, c_len, pTDLS->TPK, 16, mic, &tmp_aes_len);\n\n\t\tNdisMoveMemory(ft->MIC, mic, 16);\n\n\t}\n\t/*////////////////////////////////////////////////////////////////////*/\n\t\n\tif (RTMPEqualMemory(oldMic, ft->MIC, 16) == 0)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS_TPKMsg3Process() MIC Error!!! \\n\"));\n\t\treturn MLME_REQUEST_DECLINED;\n\t}\n\n\t\n\treturn StatusCode;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_DiscoveryReqAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN PUCHAR pMacAddr)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS ===> TDLS_DiscoveryReqAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pMacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t// Allocate buffer for transmitting message\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\treturn NStatus;\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen,\n\t\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_DISCOVERY_REQUEST);\n\n\t/* fill Dialog Token */\n\tpAd->StaCfg.TdlsInfo.TdlsDialogToken++;\n\n\tif (pAd->StaCfg.TdlsInfo.TdlsDialogToken == 0)\n\t\tpAd->StaCfg.TdlsInfo.TdlsDialogToken++;\n\n\tTDLS_InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, pAd->StaCfg.TdlsInfo.TdlsDialogToken);\n\n\t/* fill link identifier */\n\tTDLS_InsertLinkIdentifierIE(pAd, (pOutBuffer + FrameLen), &FrameLen, pAd->CurrentAddress, pMacAddr);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS discovery request send pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TDLS <=== TDLS_DiscoveryReqAction\\n\"));\n\n\treturn NStatus;\n}\n\nNDIS_STATUS\nTDLS_DiscoveryRspAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN UCHAR\tPeerToken,\n\tIN PUCHAR\tpPeerMac)\n{\n\tPUCHAR\tpOutBuffer = NULL;\n\tFRAME_ACTION_HDR\tFrame;\n\tULONG\tFrameLen = 0;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS ===> TDLS_DiscoveryRspAction\\n\"));\n\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory\n\tif(NStatus != NDIS_STATUS_SUCCESS) \n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - TDLS_DiscoveryRspAction() allocate memory failed \\n\"));\n\t\treturn NStatus;\n\t}\n\n\tActHeaderInit(pAd, &Frame.Hdr, pPeerMac, pAd->CurrentAddress, pAd->CommonCfg.Bssid);\n\t\n\tFrame.Category = CATEGORY_PUBLIC;\n\tFrame.Action = ACTION_TDLS_DISCOVERY_RSP;\n\t\n\tMakeOutgoingFrame(pOutBuffer,\t\t\t\t&FrameLen,\n\t\t\t\tsizeof(FRAME_ACTION_HDR),\t&Frame,\n\t\t\t\tEND_OF_ARGS);\n\n\t/* fill action code */\n\t//TDLS_InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_TDLS, 14);\n\n\t/* fill Dialog Token */\n\tTDLS_InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, PeerToken);\n\n\t// fill capability\n\tTDLS_InsertCapIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\t// fill support rate\n\tTDLS_InsertSupportRateIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\t// fill ext rate\n\tTDLS_InsertExtRateIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\t// fill support channels\n\tTDLS_InsertSupportChannelIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t{\t\t\n\t\tUCHAR\t\t\tCipherTmp[64] = {0};\n\t\tUCHAR\t\t\tCipherTmpLen = 0;\n\t\tULONG\t\t\ttmp;\n\t\t\n\t\t// RSNIE (7.3.2.25)\n\t\tCipherTmpLen = CipherSuiteTDLSLen;\t\n\t\tNdisMoveMemory(CipherTmp, CipherSuiteTDLSWpa2PskAes, CipherTmpLen);\n\n\t\t// Insert RSN_IE to outgoing frame\n\t\tMakeOutgoingFrame((pOutBuffer + FrameLen),\t&tmp,\n\t\t\t\t\t\tCipherTmpLen,\t\t\t\t&CipherTmp,\n\t\t\t\tEND_OF_ARGS);\n\n\t\tFrameLen = FrameLen + tmp;\n\t}\n\n\t// fill  Extended Capabilities (7.3.2.27)\n\tTDLS_InsertExtCapIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\t// TPK Handshake if RSNA Enabled\n\t// Pack TPK Message 1 here! \n\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t{\n\t\tFT_FTIE\t\t\tFtIe;\n\t\tULONG\t\t\tKeyLifetime = pAd->StaCfg.TdlsInfo.TdlsKeyLifeTime;\t// sec\n\t\tUCHAR\t\t\tLength;\n\t\tUCHAR\t\t\tSNonce[32];\t// Generated in Message 2, random variable\n\n\t\t// FTIE (7.3.2.48)\n\t\tNdisZeroMemory(&FtIe, sizeof(FtIe));\n\t\tLength =  sizeof(FtIe);\n\n\t\t// generate SNonce\n\t\tGenRandom(pAd, pAd->CurrentAddress, FtIe.SNonce);\n\t\thex_dump(\"TDLS - Generate SNonce \", FtIe.SNonce, 32);\n\t\tNdisMoveMemory(SNonce, FtIe.SNonce, 32);\n\t\t\n\t\tTDLS_InsertFTIE(pAd, \n\t\t\t\t\t\t(pOutBuffer + FrameLen), \n\t\t\t\t\t\t&FrameLen, \n\t\t\t\t\t\tLength, \n\t\t\t\t\t\tFtIe.MICCtr,\n\t\t\t\t\t\tFtIe.MIC, \n\t\t\t\t\t\tFtIe.ANonce, \n\t\t\t\t\t\tFtIe.SNonce);\n\n\t\t// Timeout Interval (7.3.2.49)\n\t\tTDLS_InsertTimeoutIntervalIE(pAd, \n\t\t\t\t\t\t\t\t\t(pOutBuffer + FrameLen), \n\t\t\t\t\t\t\t\t\t&FrameLen, \n\t\t\t\t\t\t\t\t\t2, /* key lifetime interval */\n\t\t\t\t\t\t\t\t\tKeyLifetime);\n\t}\n\n\t// fill Supported Regulatory Classes\n\tTDLS_SupportedRegulatoryClasses(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n#ifdef DOT11_N_SUPPORT\n\t// fill HT Capability\n\tTDLS_InsertHtCapIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n\n\t// fill 20/40 BSS Coexistence (7.3.2.61)\n#ifdef DOT11N_DRAFT3\n\tTDLS_InsertBSSCoexistenceIE(pAd, (pOutBuffer + FrameLen), &FrameLen);\n#endif // DOT11N_DRAFT3 //\n#endif // DOT11_N_SUPPORT //\n\n\t/* fill link identifier */\n\tTDLS_InsertLinkIdentifierIE(pAd, (pOutBuffer + FrameLen), &FrameLen, pPeerMac, pAd->CurrentAddress);\n\n\thex_dump(\"TDLS discovery response send pack\", pOutBuffer, FrameLen);\n\n\tMiniportMMRequest(pAd, QID_AC_VI, pOutBuffer, FrameLen);\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS <=== TDLS_DiscoveryRspAction\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_SetupRequestAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> TDLS_SetupRequestAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t/* Allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus != NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - TDLS_SetupRequestAction() allocate memory failed \\n\"));\n\t\treturn NStatus;\n\t}\n\n\t/* enter ACTIVE mode */\n\tTDLS_CHANGE_TO_ACTIVE(pAd);\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_BuildSetupRequest(pAd, pOutBuffer, &FrameLen, pTDLS);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS setup request send pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== TDLS_SetupRequestAction\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_SetupResponseAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN UCHAR\tRsnLen,\n\tIN PUCHAR\tpRsnIe,\n\tIN UCHAR\tFTLen,\n\tIN PUCHAR\tpFTIe,\n\tIN UCHAR\tTILen,\n\tIN PUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> TDLS_SetupResponseAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t/* Allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - TDLS_SetupResponseAction() allocate memory failed \\n\"));\n\t\treturn NStatus;\n\t}\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_BuildSetupResponse(pAd, pOutBuffer, &FrameLen, pTDLS, RsnLen, pRsnIe, FTLen, pFTIe, TILen, pTIIe, StatusCode);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS send setup response pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== TDLS_SetupResponseAction\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_SetupConfirmAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN UCHAR\tRsnLen,\n\tIN PUCHAR\tpRsnIe,\n\tIN UCHAR\tFTLen,\n\tIN PUCHAR\tpFTIe,\n\tIN UCHAR\tTILen,\n\tIN PUCHAR\tpTIIe,\n\tIN\tUINT16\tStatusCode)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> TDLS_SetupConfirmAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t/* Allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - TDLS_SetupConfirmAction() allocate memory failed \\n\"));\n\t\treturn NStatus;\n\t}\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_BuildSetupConfirm(pAd, pOutBuffer, &FrameLen, pTDLS, RsnLen, pRsnIe, FTLen, pFTIe, TILen, pTIIe, StatusCode);\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS setup confirm pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tTDLS_RECOVER_POWER_SAVE(pAd);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== TDLS_SetupConfirmAction\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_LinkTearDown(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN BOOLEAN\tbDirect)\n{\n\tUCHAR\t\tidx;\n\tBOOLEAN\t\tTimerCancelled;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> TDLS_LinkTearDown\\n\"));\n\n\t/* tear down tdls table entry */\n\tfor (idx = 0; idx < MAX_NUM_OF_TDLS_ENTRY; idx++)\n\t{\n\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\tif (pTDLS->Valid && (pTDLS->Status >= TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\tpTDLS->Status\t= TDLS_MODE_NONE;\n\t\t\tpTDLS->Valid\t= FALSE;\n\t\t\tpTDLS->Token = 0;\n\t\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t\t\tif (!VALID_WCID(pTDLS->MacTabMatchWCID))\n\t\t\treturn;\n\n\t\t\tif (pAd->StaCfg.bRadio == TRUE)\n\t\t\t{\n\t\t\t\tif (bDirect)\n\t\t\t\t\tTDLS_TearDownAction(pAd, pTDLS, TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON, TRUE);\n\t\t\t\telse\n\t\t\t\t\tTDLS_TearDownAction(pAd, pTDLS, TDLS_REASON_CODE_TEARDOWN_DUE_TO_PEER_STA_UNREACHABLE, FALSE);\n\t\t\t}\n\n\t\t\tMacTableDeleteEntry(pAd,pTDLS->MacTabMatchWCID, pTDLS->MacAddr);\n\t\t}\n\t\telse if (pTDLS->Valid)\n\t\t{\n\t\t\tpTDLS->Status\t= TDLS_MODE_NONE;\n\t\t\tpTDLS->Valid\t= FALSE;\n\t\t\tpTDLS->Token = 0;\n\t\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\t\t}\t\n\t}\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\tTDLS_ClearEntryList(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList);\n\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\tTDLS_ClearEntryList(&pAd->StaCfg.TdlsInfo.TdlsBlackList);\n\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n#endif /* TDLS_AUTOLINK_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== TDLS_LinkTearDown\\n\"));\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_TearDownPeerLink(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PUCHAR\tpPeerAddr,\n\tIN BOOLEAN\tbDirect)\n{\n\tUCHAR EntryIdx;\n\tBOOLEAN\t TimerCancelled;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS ===> TDLS_TearDownPeerLink\\n\"));\n\n\t// tear down tdls table entry\n\tfor (EntryIdx = 0; EntryIdx < MAX_NUM_OF_TDLS_ENTRY; EntryIdx++)\n\t{\n\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[EntryIdx];\n\n\t\tif ((pTDLS->Valid) && (pTDLS->Status >= TDLS_MODE_CONNECTED) && MAC_ADDR_EQUAL(pPeerAddr, pTDLS->MacAddr))\n\t\t{\n\t\t\tpTDLS->Status\t= TDLS_MODE_NONE;\n\t\t\tpTDLS->Valid\t= FALSE;\n\t\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t\t\tif (!VALID_WCID(pTDLS->MacTabMatchWCID))\n\t\t\treturn;\n\n\t\t\tif (bDirect)\n\t\t\t\tTDLS_TearDownAction(pAd, pTDLS, TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON, TRUE);\n\t\t\telse\n\t\t\t\tTDLS_TearDownAction(pAd, pTDLS, TDLS_REASON_CODE_TEARDOWN_DUE_TO_PEER_STA_UNREACHABLE, FALSE);\n\n\t\t\tMacTableDeleteEntry(pAd,pTDLS->MacTabMatchWCID, pTDLS->MacAddr);\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (EntryIdx == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Peer MAC - not found !!!\\n\"));\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS <=== TDLS_TearDownPeerLink\\n\"));\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nNDIS_STATUS\nTDLS_TearDownAction(\n\tIN PRTMP_ADAPTER\tpAd,\n\tIN PRT_802_11_TDLS\tpTDLS,\n\tIN UINT16\tReasonCode,\n\tIN BOOLEAN\tbDirect)\n{\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tidx = 1;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> TDLS_TearDownAction\\n\"));\n\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr, pAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t/* Allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"ACT - TDLS_TearDownAction() allocate memory failed \\n\"));\n\t\treturn NStatus;\n\t}\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_BuildTeardown(pAd, pOutBuffer, &FrameLen, pTDLS, ReasonCode);\n\n\tif (bDirect == TRUE)\n\t\tidx = pTDLS->MacTabMatchWCID;\n\telse\n\t\tidx = BSSID_WCID;\n\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[idx], Header802_3,\n\t\t\t\t\t\tLENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE);\n\n\thex_dump(\"TDLS teardown send pack\", pOutBuffer, FrameLen);\n\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<==== TDLS_TearDownAction\\n\"));\n\n\treturn NStatus;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_MlmeDiscoveryReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR PeerMacAddr[MAC_ADDR_LEN];\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tPLIST_HEADER pTdlsDiscoveryEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\tPTDLS_DISCOVERY_ENTRY pTdlsPeer = NULL;\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"===> TDLS_MlmeDiscoveryReqAction() \\n\"));\n\n\tNdisMoveMemory(PeerMacAddr, Elem->Msg, MAC_ADDR_LEN);\n\n\tif (INFRA_ON(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Send Discovery Request to Peer ::%02x:%02x:%02x:%02x:%02x:%02x !!!\\n\", \n\t\t\t\t\t\t\t\tPeerMacAddr[0], PeerMacAddr[1], PeerMacAddr[2],\n\t\t\t\t\t\t\t\tPeerMacAddr[3], PeerMacAddr[4], PeerMacAddr[5]));\n\n\t\t/* Build TDLS Discovery Request Frame */\n\t\tNStatus = TDLS_DiscoveryReqAction(pAd, PeerMacAddr);\n\t\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\tTDLS_DelDiscoveryEntryByMAC(pTdlsDiscoveryEnList, PeerMacAddr);\n\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeDiscoveryReqAction() Build Discovery Setup Request Fail !!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\tpTdlsPeer = TDLS_FindDiscoveryEntry(pTdlsDiscoveryEnList, PeerMacAddr);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeDiscoveryReqAction() Build Discovery Setup Request Fail, Because STA is not connect to AP!!!\\n\"));\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"<=== TDLS_MlmeDiscoveryReqAction() \\n\"));\n\n\treturn;\n}\n\n#ifdef WFD_SUPPORT\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_MlmeTunneledReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR PeerMacAddr[MAC_ADDR_LEN];\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tPLIST_HEADER pTdlsDiscoveryEnList = &pAd->StaCfg.TdlsDiscovPeerList;\n\tPTDLS_DISCOVERY_ENTRY pTdlsPeer = NULL;\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"===> TDLS_MlmeTunneledProbeReqAction() \\n\"));\n\n\tNdisMoveMemory(PeerMacAddr, Elem->Msg, MAC_ADDR_LEN);\n\n\tif (INFRA_ON(pAd))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Send Tunneled Probe Request to Peer ::%02x:%02x:%02x:%02x:%02x:%02x !!!\\n\", \n\t\t\t\t\t\t\t\tPeerMacAddr[0], PeerMacAddr[1], PeerMacAddr[2],\n\t\t\t\t\t\t\t\tPeerMacAddr[3], PeerMacAddr[4], PeerMacAddr[5]));\n\n\t\t/* Build TDLS Tunneled Probe Request Frame */\n\t\tNStatus = TDLS_TunneledProbeRequest(pAd, PeerMacAddr);\n\t\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsDiscovPeerListSemLock);\n\t\t\tTDLS_DelDiscoveryEntryByMAC(pTdlsDiscoveryEnList, PeerMacAddr);\n\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsDiscovPeerListSemLock);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeTunneledProbeReqAction() Build Tunneled Probe Request Fail !!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\tpTdlsPeer = TDLS_FindDiscoveryEntry(pTdlsDiscoveryEnList, PeerMacAddr);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeTunneledProbeReqAction() Build Tunneled Probe Request Fail, Because STA is not connect to AP!!!\\n\"));\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"<=== TDLS_MlmeTunneledProbeReqAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t\t\n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerTunneledReqRspAction(\n\tIN PRTMP_ADAPTER pAd, \n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tNDIS_STATUS NStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tToken;\n\tUCHAR\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tULONG\t\t\tRemainLen = Elem->MsgLen;\n\tPFRAME_802_11\tpFrame;\n\tpFrame = (PFRAME_802_11)Elem->Msg;\n\tCHAR\t\t\t*Ptr =(CHAR *)Elem->Msg;\n\tPRT_802_11_TDLS pTDLS = NULL;\n\tBOOLEAN\t\t\tTimerCancelled;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_PeerTunneledReqRspAction() \\n\"));\n\n\t/*\tMessage contains 802.11 header (24 bytes), LLC_SNAP (8 bytes)\n\t\tTDLS Action header(payload type + category + action)(3 bytes) and Payload (variable)\n\t*/\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + 3)) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"TDLS_PeerTunneledReq/RspAction --> Invaild packet length - (action header) \\n\"));\n\t\treturn; \n\t}\n\n\t// Offset to Payload Type\n\tPtr += (LENGTH_802_11 + LENGTH_802_1_H + 1);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + 1);\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS_PeerTunneledReqRspAction --> Gategory = %02x.  OUI = %02x-%02x-%02x.\\n\", *Ptr, *(Ptr+1), *(Ptr+2), *(Ptr+3)));\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn;\n\t}\n\n\t/* Frame Body Type */\n\tPtr += 4;\n\tRemainLen -= 4;\n\n\tif (RemainLen < 7)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"PeerTdlsDiscovReqSanity --> remain length is not enough = %d.\\n\", RemainLen));\n\t\treturn;\n\t}\n\n\tif (!MAC_ADDR_EQUAL(pFrame->Hdr.Addr3, pAd->CommonCfg.Bssid))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsTunneledReqSanity --> It's not my BSSID[%02x:%02x:%02x:%02x:%02x:%02x] Addr3[%02x:%02x:%02x:%02x:%02x:%02x]\\n\", PRINT_MAC(pAd->CommonCfg.Bssid), PRINT_MAC(pFrame->Hdr.Addr3)));\n\t\t//return;\n\t}\n\n\tNdisMoveMemory(PeerAddr, pFrame->Hdr.Addr3, MAC_ADDR_LEN);\n\n\tif ((*Ptr == WFD_TUNNELED_PROBE_REQ) ||\n\t\t(*Ptr == WFD_TUNNELED_PROBE_RSP))\n\t{\n\t\tPWFD_DEVICE_INFO pWfd_info;\n\t\tSHORT\t\t\tidx;\n\n\t\tfor (idx = MAX_NUM_OF_TDLS_ENTRY - 1; idx >= 0; idx--)\n\t\t{\n\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\t\tif (pTDLS->Valid && MAC_ADDR_EQUAL(PeerAddr, pTDLS->MacAddr))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,(\"%s::find the same entry and discard it\\n\", __FUNCTION__));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (idx < 0)\n\t\t{\n\t\t\tfor (idx = (MAX_NUM_OF_TDLS_ENTRY - 1); idx >= 0; idx--)\n\t\t\t{\n\t\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\t\t\tif (!pTDLS->Valid)\n\t\t\t\t{\n\t\t\t\t\tRTMPCancelTimer(&(pTDLS->Timer), &TimerCancelled);\n\t\t\t\t\tpTDLS->Valid = TRUE;\n\t\t\t\t\tNdisMoveMemory(pTDLS->MacAddr, PeerAddr, MAC_ADDR_LEN);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupReqRspAction() create a new entry \\n\"));\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tif (idx < 0)\n\t\t{\n\t\t\t// Table full !!!!!\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"%s::TDLSEntry table full(only can support %d TDLS session) \\n\",\n\t\t\t\t\t\t\t\t\t__FUNCTION__, MAX_NUM_OF_TDLS_ENTRY));\n\t\t}\n\t\telse if (pTDLS)\n\t\t{\n\t\t\tUCHAR\tAddr2[6], SsidLen = 0;\n\t\t\tUCHAR\tSsid[32];\n\t\t\tULONG\t\tPeerip;\n\t\t\tUCHAR\tDsChannel = 0;\n\t\t\tULONG\tP2PSubelementLen = 0;\n\t\t\tPUCHAR\tP2pSubelement = NULL;\n\t\t\tULONG\tWfdSubelementLen = 0;\n\t\t\tPUCHAR\tWfdSubelement = NULL;\n\n\t\t\tos_alloc_mem(pAd, &P2pSubelement, MAX_VIE_LEN);\n\t\n\t\t\tif (P2pSubelement == NULL)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\t\n\t\t\tif (WfdSubelement == NULL)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\t\t\tos_free_mem(pAd, P2pSubelement);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t (TDLS_PeerTunneledProbeReqRspSanity(pAd, \n\t\t\t\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\t\t\t\tElem->MsgLen, \n\t\t\t\t\t\t\t\t\t\tAddr2, \n\t\t\t\t\t\t\t\t\t\tSsid, \n\t\t\t\t\t\t\t\t\t\t&SsidLen, \n\t\t\t\t\t\t\t\t\t\t&Peerip,\n\t\t\t\t\t\t\t\t\t\t&DsChannel,\n\t\t\t\t\t\t\t\t\t\t&P2PSubelementLen,\n\t\t\t\t\t\t\t\t\t\tP2pSubelement,\n\t\t\t\t\t\t\t\t\t\t&WfdSubelementLen,\n\t\t\t\t\t\t\t\t\t\tWfdSubelement));\n\n\t\t\tif (WfdSubelementLen > 0)\n\t\t\t{\n\t\t\t\tWfdParseSubElmt(pAd, \n\t\t\t\t\t\t\t\t&pTDLS->WfdEntryInfo,\n\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\tWfdSubelementLen);\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: WFD Element IE Len is 0.\\n\", __FUNCTION__));\n\t\t\t\n\t\t\tif (P2pSubelement)\n\t\t\t\tos_free_mem(pAd, P2pSubelement);\n\t\t\tif (WfdSubelement)\n\t\t\t\tos_free_mem(pAd, WfdSubelement);\t\n\t\t\t\n\t\t\tif (*Ptr == WFD_TUNNELED_PROBE_REQ)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Receive Tunneled probe request frame\\n\"));\n\t\t\t\n\t\t\t\t/* Build TDLS Discovery Response Frame */\n\t\t\t\tNStatus = TDLS_TunneledProbeResponse(pAd, PeerAddr);\n\t\t\t\n\t\t\t\tif (NStatus != NDIS_STATUS_SUCCESS) \n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_PeerTunneledReqRspAction() Build Tunneled Response Fail !!!\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Receive Tunneled probe response frame\\n\"));\n\t\t}\n\t}\n\telse\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::unknown Type = %02x.\\n\", __FUNCTION__, *Ptr+4));\n\n\treturn;\n}\n#endif /* WFD_SUPPORT */\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerDiscoveryReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR\t\t\tToken;\n\tUCHAR\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tULONG\t\t\tRemainLen = Elem->MsgLen;\n\tCHAR\t\t\t*Ptr =(CHAR *)Elem->Msg;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_PeerDiscoveryReqAction() \\n\"));\n\n\t/*\tMessage contains 802.11 header (24 bytes), LLC_SNAP (8 bytes)\n\t\tTDLS Action header(payload type + category + action)(3 bytes) and Payload (variable)\n\t*/\n\tif (RemainLen < (LENGTH_802_11 + LENGTH_802_1_H + 3)) \n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (action header) \\n\"));\n\t\treturn;\t\n\t}\n\n\t// Offset to Dialog Token\n\tPtr\t+= (LENGTH_802_11 + LENGTH_802_1_H + 3);\n\tRemainLen -= (LENGTH_802_11 + LENGTH_802_1_H + 3);\n\n\t// Get the value of token from payload and advance the pointer\n\tif (RemainLen < 1)\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (dialog token) \\n\"));\n\t\treturn;\n\t}\n\n\tToken = *Ptr;\n\n\t// Offset to Link Identifier\n\tPtr += 1;\n\tRemainLen -= 1;\n\n\t// Get BSSID, SA and DA from payload and advance the pointer\n\tif ((RemainLen < 20) || (Ptr[0] != IE_TDLS_LINK_IDENTIFIER) || (Ptr[1] != 18))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> Invaild packet length - (link identifier) \\n\"));\n\t\treturn;\n\t}\n\tif (!MAC_ADDR_EQUAL(Ptr+2, pAd->CommonCfg.Bssid))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> It's not my BSSID\\n\"));\n\t\treturn;\n\t}\t\n\telse if (!MAC_ADDR_EQUAL(Ptr+14, pAd->CurrentAddress))\n\t{\n\t\tDBGPRINT_RAW(RT_DEBUG_WARN, (\"PeerTdlsDiscovReqSanity --> It's not my MAC address\\n\"));\n\t\treturn;\n\t}\t\n\n\tNdisMoveMemory(PeerAddr, Ptr+8, MAC_ADDR_LEN);\n\n\t/* Build TDLS Discovery Response Frame */\n\tNStatus = TDLS_DiscoveryRspAction(pAd, Token, PeerAddr);\n\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_PeerDiscoveryReqAction() Build Discovery Response Fail !!!\\n\"));\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_DiscoveryRspPublicAction(\n\tIN PRTMP_ADAPTER pAd,\n\tIN MLME_QUEUE_ELEM *Elem,\n\tIN VOID\t\t*Msg, \n\tIN ULONG\tMsgLen)\n{\n\tUSHORT\t\t\tStatusCode = MLME_SUCCESS;\n\tUCHAR\t\t\tToken;\n\tUCHAR\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tUSHORT\t\t\tCapabilityInfo;\n\tUCHAR\t\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t\tSupRateLen, ExtRateLen, HtCapLen, ExtCapLen, RsnLen, FTLen, TILen, LinkIdentLen;\n\tUCHAR\t\t\tRsnIe[64], FTIe[128], TIIe[7];\n\tHT_CAPABILITY_IE\t\tHtCap;\n\tEXT_CAP_INFO_ELEMENT\tExtCap;\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)Elem->Msg;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS ===> TDLS_DiscoveryRspPublicAction() \\n\"));\n\n\thex_dump(\"TDLS discovery response receive pack\", Msg, MsgLen);\n\n\tif (!PeerTdlsDiscovRspSanity(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tMsg, \n\t\t\t\t\t\t\tMsgLen,\n\t\t\t\t\t\t\t&Token,\n\t\t\t\t\t\t\tPeerAddr,\n\t\t\t\t\t\t\t&CapabilityInfo,\n\t\t\t\t\t\t\t&SupRateLen,\t\n\t\t\t\t\t\t\t&SupRate[0],\n\t\t\t\t\t\t\t&ExtRateLen,\n\t\t\t\t\t\t\t&ExtRate[0],\n\t\t\t\t\t\t\t&HtCapLen,\n\t\t\t\t\t\t\t&HtCap,\n\t\t\t\t\t\t\t&ExtCapLen,\n\t\t\t\t\t\t\t&ExtCap,\n\t\t\t\t\t\t\t&RsnLen,\t\n\t\t\t\t\t\t\tRsnIe,\n\t\t\t\t\t\t\t&FTLen,\n\t\t\t\t\t\t\tFTIe,\n\t\t\t\t\t\t\t&TILen,\n\t\t\t\t\t\t\tTIIe,\n\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t&LinkIdent))\n\t{\n\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t}\n\n\tCOPY_MAC_ADDR(PeerAddr, &pFrame->Hdr.Addr2);\n\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\tif (pAd->StaCfg.TdlsInfo.TdlsAutoLink)\n\t\t{\n\t\t\tPLIST_HEADER\tpTdlsDiscovryEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\t\t\tPTDLS_DISCOVERY_ENTRY\tpTdlsPeer = NULL;\n\n\t\t\tpTdlsPeer = TDLS_FindDiscoveryEntry(pTdlsDiscovryEnList, PeerAddr);\n\n\t\t\tif (pTdlsPeer)\n\t\t\t{\n\t\t\t\tPLIST_HEADER\tpTdlsDiscovEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\t\t\t\tCHAR\tRssi = -99;\n\n\t\t\t\tRssi = RTMPMaxRssi(pAd, \n\t\t\t\t\t\t\t\t   ConvertToRssi(pAd, (CHAR)Elem->Rssi0, RSSI_0, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\t   ConvertToRssi(pAd, (CHAR)Elem->Rssi1, RSSI_1, Elem->AntSel, BW_20),\n\t\t\t\t\t\t\t\t   ConvertToRssi(pAd, (CHAR)Elem->Rssi2, RSSI_2, Elem->AntSel, BW_20));\n\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"Discovery Response Rssi = %d !!!\\n\" , Rssi));\n\n\t\t\t\tif (pTdlsPeer->bConnected)\n\t\t\t\t{\n\t\t\t\t\tif ((pTdlsPeer->bConnectedFirstTime) && (pTdlsPeer->RetryCount == 1))\n\t\t\t\t\t{\n\t\t\t\t\t\tpTdlsPeer->AvgRssi0 = Rssi;\n\t\t\t\t\t\tpTdlsPeer->RetryCount--;\n\t\t\t\t\t\tpTdlsPeer->bConnectedFirstTime = FALSE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Connected first time discovery !!!\\n\"));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pTdlsPeer->RetryCount == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((Rssi < pAd->StaCfg.TdlsInfo.TdlsAutoTeardownRssiThreshold) &&\n\t\t\t\t\t\t\t\t(pTdlsPeer->AvgRssi0 < pAd->StaCfg.TdlsInfo.TdlsAutoTeardownRssiThreshold))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* Tear Down */\n\t\t\t\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tMLME_TDLS_REQ_STRUCT\tMlmeTdlsReq;\n\t\t\t\t\t\t\t\t\tUSHORT\t\tReason = REASON_UNSPECIFY;\n\t\t\t\t\t\t\t\t\tINT\t\t\tidx;\n\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n !!! Will tear down %02x:%02x:%02x:%02x:%02x:%02x !!!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[1],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[3],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[4],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[5]));\n\n\t\t\t\t\t\t\t\t\tidx = TDLS_SearchLinkId(pAd, pTdlsPeer->Responder);\n\n\t\t\t\t\t\t\t\t\tif (idx == -1 || idx == MAX_NUM_OF_TDLS_ENTRY)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - can not find or full the LinkId!\\n\"));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (idx >= 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tReason = TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON;\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Valid\t= FALSE;\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Status\t= TDLS_MODE_NONE;\n\t\t\t\t\t\t\t\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[idx], Reason, FALSE);\n\n\t\t\t\t\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\t\t\t\t\t\t\t\tMT2_MLME_TDLS_TEAR_DOWN,\n\t\t\t\t\t\t\t\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t\t\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t\t\t\t\t\t\t\t0);\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t\t\t\tTDLS_DelDiscoveryEntryByMAC(pTdlsDiscovryEnList, PeerAddr);\n\t\t\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpTdlsPeer->AvgRssi0 = Rssi;\n\t\t\t\t\t\t\t\tpTdlsPeer->RetryCount--;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (pTdlsPeer->RetryCount > 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (Rssi < pAd->StaCfg.TdlsInfo.TdlsAutoTeardownRssiThreshold)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* Tear Down */\n\t\t\t\t\t\t\t\tif (INFRA_ON(pAd))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tMLME_TDLS_REQ_STRUCT\tMlmeTdlsReq;\n\t\t\t\t\t\t\t\t\tUSHORT\t\tReason = REASON_UNSPECIFY;\n\t\t\t\t\t\t\t\t\tINT\t\t\tidx;\n\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n !!! Will tear down %02x:%02x:%02x:%02x:%02x:%02x !!!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[1],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[3],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[4],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[5]));\n\n\t\t\t\t\t\t\t\t\tidx = TDLS_SearchLinkId(pAd, pTdlsPeer->Responder);\n\n\t\t\t\t\t\t\t\t\tif (idx == -1 || idx == MAX_NUM_OF_TDLS_ENTRY)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - can not find or full the LinkId!\\n\"));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (idx >= 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tReason = TDLS_REASON_CODE_TEARDOWN_FOR_UNSPECIFIED_REASON;\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Valid\t= FALSE;\n\t\t\t\t\t\t\t\t\t\tpAd->StaCfg.TdlsInfo.TDLSEntry[idx].Status\t= TDLS_MODE_NONE;\n\t\t\t\t\t\t\t\t\t\tTDLS_MlmeParmFill(pAd, &MlmeTdlsReq, &pAd->StaCfg.TdlsInfo.TDLSEntry[idx], Reason, FALSE);\n\n\t\t\t\t\t\t\t\t\t\tMlmeEnqueue(pAd,\n\t\t\t\t\t\t\t\t\t\t\t\t\tTDLS_STATE_MACHINE,\n\t\t\t\t\t\t\t\t\t\t\t\t\tMT2_MLME_TDLS_TEAR_DOWN,\n\t\t\t\t\t\t\t\t\t\t\t\t\tsizeof(MLME_TDLS_REQ_STRUCT),\n\t\t\t\t\t\t\t\t\t\t\t\t\t&MlmeTdlsReq,\n\t\t\t\t\t\t\t\t\t\t\t\t\t0);\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t\t\t\tTDLS_DelDiscoveryEntryByMAC(pTdlsDiscovryEnList, PeerAddr);\n\t\t\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpTdlsPeer->AvgRssi0 = Rssi;\n\t\t\t\t\t\t\t\tpTdlsPeer->RetryCount = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pTdlsPeer->CurrentState == TDLS_DISCOVERY_IDLE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpTdlsPeer->CurrentState = TDLS_DISCOVERY_FIRST_TIME;\n\t\t\t\t\t\tpTdlsPeer->AvgRssi0 = Rssi;\n\t\t\t\t\t}\n\t\t\t\t\telse if (pTdlsPeer->CurrentState == TDLS_DISCOVERY_FIRST_TIME)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((pTdlsPeer->AvgRssi0 > pAd->StaCfg.TdlsInfo.TdlsAutoSetupRssiThreshold) &&\n\t\t\t\t\t\t\t(Rssi > pAd->StaCfg.TdlsInfo.TdlsAutoSetupRssiThreshold))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (INFRA_ON(pAd) && (pTdlsPeer->bConnected == FALSE))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tINT\t\t\t\t\t\tLinkId = 0xff;\n\n\t\t\t\t\t\t\t\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\t\t\t\t\t\t\t\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tRT_802_11_TDLS\tTdls;\n\n\t\t\t\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"\\n!!! Auto Setup TDLS to %02x:%02x:%02x:%02x:%02x:%02x !!!\\n\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[1],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[3],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[4],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpTdlsPeer->Responder[5]));\n\t\t\t\t\t\t\t\t\tNdisZeroMemory(&Tdls, sizeof(RT_802_11_TDLS));\n\t\t\t\t\t\t\t\t\tTdls.TimeOut = 0;\n\t\t\t\t\t\t\t\t\tCOPY_MAC_ADDR(Tdls.MacAddr, pTdlsPeer->Responder);\n\t\t\t\t\t\t\t\t\tTdls.Valid = 1;\n\n\t\t\t\t\t\t\t\t\tpTdlsPeer->CurrentState = TDLS_DISCOVERY_TO_SETUP;\n\n\t\t\t\t\t\t\t\t\tMlmeEnqueue(pAd, \n\t\t\t\t\t\t\t\t\t\t\t\tMLME_CNTL_STATE_MACHINE, \n\t\t\t\t\t\t\t\t\t\t\t\tRT_OID_802_11_SET_TDLS_PARAM, \n\t\t\t\t\t\t\t\t\t\t\t\tsizeof(RT_802_11_TDLS), \n\t\t\t\t\t\t\t\t\t\t\t\t&Tdls,\n\t\t\t\t\t\t\t\t\t\t\t\t0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tPTDLS_DISCOVERY_ENTRY pPeerEntry = NULL;\n\t\t\t\t\t\t\t\t\tPLIST_HEADER\tpTdlsDiscovEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\t\t\t\t\t\t\t\t\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\n\t\t\t\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\t\t\t\t\t\tTDLS_InsertDiscoveryPeerEntryByMAC(pTdlsDiscovEnList, PeerAddr, TRUE);\n\t\t\t\t\t\t\t\t\tpPeerEntry = TDLS_FindDiscoveryEntry(pTdlsDiscovEnList, PeerAddr);\n\t\t\t\t\t\t\t\t\tif (pPeerEntry)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpPeerEntry->bConnectedFirstTime = TRUE;\n\t\t\t\t\t\t\t\t\t\tpPeerEntry->bConnected = TRUE;\n\t\t\t\t\t\t\t\t\t\tpPeerEntry->RetryCount = 0;\n\t\t\t\t\t\t\t\t\t\tpPeerEntry->CurrentState = TDLS_DISCOVERY_TO_SETUP_DONE;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\n\t\t\t\t\t\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t\t\t\t\t\t\tTDLS_DelBlackEntryByMAC(pTdlsBlackEnList, PeerAddr);\n\t\t\t\t\t\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpTdlsPeer->CurrentState = TDLS_DISCOVERY_TO_SETUP_FAIL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"Can't find discovery entry on discovery table !!!\\n\"));\n\t\t\t}\n\t\t}\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS <=== TDLS_DiscoveryRspPublicAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_MlmeSetupReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tMLME_TDLS_REQ_STRUCT *pInfo;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS ===> TDLS_MlmeSetupReqAction() \\n\"));\n\n\tpInfo = (MLME_TDLS_REQ_STRUCT *)Elem->Msg;\n    \n\tpTDLS = pInfo->pTDLS;\n\n\tif (pAd->StaActive.ExtCapInfo.TDLSProhibited == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS - TDLS_MlmeSetupReqAction() AP Prohibited TDLS !!!\\n\"));\n\t\treturn;\n\t}\n\t\n\t/* Build TDLS Setup Request Frame */\n\tNStatus = TDLS_SetupRequestAction(pAd, pTDLS);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeSetupReqAction() Build Setup Request Fail !!!\\n\"));\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS <=== TDLS_MlmeSetupReqAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerSetupReqAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT\t\t\tStatusCode = MLME_SUCCESS;\n\tSHORT\t\t\tidx;\n\tULONG\t\t\tTimeout = TDLS_TIMEOUT;\n\tBOOLEAN\t\t\tTimerCancelled;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tRT_802_11_TDLS\tTmpTDLS;\n\tUCHAR\t\t\tToken;\n\tUCHAR\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tUSHORT\t\t\tCapabilityInfo;\n\tUCHAR\t\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t\tSupRateLen, ExtRateLen, HtCapLen, ExtCapLen, RsnLen, FTLen, TILen, LinkIdentLen;\n\tUCHAR\t\t\tRsnIe[64], FTIe[128], TIIe[7];\n\tUCHAR\t\t\tQosCapability;\n\tHT_CAPABILITY_IE\t\tHtCap;\n\tEXT_CAP_INFO_ELEMENT\tExtCap;\n\tBOOLEAN\t\t\tbDiscard = FALSE;\n\tBOOLEAN\t\t\tbWmmCapable;\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n#ifdef WFD_SUPPORT\n\tULONG\tWfdSubelementLen = 0;\n\tPUCHAR\tWfdSubelement = NULL;\n#endif /* WFD_SUPPORT */\n\t\n#ifdef WFD_SUPPORT\n\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\tif (WfdSubelement == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\treturn;\n\t}\n#endif /* WFD_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS ===> TDLS_PeerSetupReqAction\\n\"));\n\n\t// Not TDLS Capable, ignore it\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\tgoto CleanUp;\n\t\n\t// Not BSS mode, ignore it\n\tif (!INFRA_ON(pAd))\n\t\tgoto CleanUp;\n\n\tif (pAd->StaActive.ExtCapInfo.TDLSProhibited == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS - TDLS_PeerSetupReqAction() AP Prohibited TDLS !!!\\n\"));\n\t\tgoto CleanUp;\n\t}\n\n\t// Init all kinds of fields within the packet\n\tNdisZeroMemory(&CapabilityInfo, sizeof(CapabilityInfo));\n\tNdisZeroMemory(&HtCap, sizeof(HtCap));\n\tNdisZeroMemory(&ExtCap, sizeof(ExtCap));\n\tNdisZeroMemory(RsnIe, sizeof(RsnIe));\n\tNdisZeroMemory(FTIe, sizeof(FTIe));\n\tNdisZeroMemory(TIIe, sizeof(TIIe));\n\tNdisZeroMemory(&LinkIdent, sizeof(LinkIdent));\n\n\n\thex_dump(\"TDLS setup request receive pack\", Elem->Msg, Elem->MsgLen);\n\n\tif (!PeerTdlsSetupReqSanity(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\tElem->MsgLen,\n#ifdef WFD_SUPPORT\n\t\t\t\t\t\t\t&WfdSubelementLen,\n\t\t\t\t\t\t\tWfdSubelement,\n#endif /* WFD_SUPPORT */\n\t\t\t\t\t\t\t&Token,\n\t\t\t\t\t\t\tPeerAddr,\n\t\t\t\t\t\t\t&CapabilityInfo,\n\t\t\t\t\t\t\t&SupRateLen,\t\n\t\t\t\t\t\t\t&SupRate[0],\n\t\t\t\t\t\t\t&ExtRateLen,\n\t\t\t\t\t\t\t&ExtRate[0],\n\t\t\t\t\t\t\t&bWmmCapable,\n\t\t\t\t\t\t\t&QosCapability,\n\t\t\t\t\t\t\t&HtCapLen,\n\t\t\t\t\t\t\t&HtCap,\n\t\t\t\t\t\t\t&ExtCapLen,\n\t\t\t\t\t\t\t&ExtCap,\n\t\t\t\t\t\t\t&RsnLen,\t\n\t\t\t\t\t\t\tRsnIe,\n\t\t\t\t\t\t\t&FTLen,\n\t\t\t\t\t\t\tFTIe,\n\t\t\t\t\t\t\t&TILen,\n\t\t\t\t\t\t\tTIIe,\n\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t&LinkIdent))\n\t{\n\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupReqAction() received a request from %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\t\t\tPeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5]));\n\n\tif ((pAd->StaCfg.WepStatus != Ndis802_11WEPDisabled) && (RsnLen == 0))\n\t{\n\t\tStatusCode = MLME_INVALID_SECURITY_POLICY;\n\t}\n\n#ifdef WFD_SUPPORT\n\t/* WFD spec. 4.5.3 Establish WFD Connection using TDLS\n\t * If an associated infrastructure AP uses WEP or WPA for the link between the AP and the WFD device, \n\t * the WFD device shall not accept the TDLS Setup Request frame for WFD connection but reject it by \n\t * sending TDLS Setup Response frame with indicating status code as 5 (Security disabled).\n\t*/\n\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) && WfdSubelementLen)\n\t{\n\t\tif (RsnLen == 0)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::No RSN IE and peer is WFD device, return weak security(5)!\\n\", __FUNCTION__));\n\t\t\tStatusCode = MLME_SECURITY_WEAK;\n\t\t}\n\t\tif ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) ||\n\t\t\t(pAd->StaCfg.WepStatus != Ndis802_11Encryption3Enabled)) // Pairwise cipher suite is not AES\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::AP Security is not WPA2PSK/AES and peer is WFD device, return weak security(5)!\\n\", __FUNCTION__));\n\t\t\tStatusCode = MLME_SECURITY_WEAK;\n\t\t}\n\t}\n#endif /* WFD_SUPPORT */\n#ifdef TDLS_AUTOLINK_SUPPORT\n\tif (pAd->StaCfg.TdlsInfo.TdlsAutoLink)\n\t{\n\t\tPTDLS_BLACK_ENTRY pTdlsBlackEntry = NULL;\n\t\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\n\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\tpTdlsBlackEntry = TDLS_FindBlackEntry(pTdlsBlackEnList, PeerAddr);\n\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\n\t\tif (pTdlsBlackEntry)\n\t\t{\n\t\t\tif (pTdlsBlackEntry->CurrentState == TDLS_BLACK_TDLS_BY_TEARDOWN)\n\t\t\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t\t}\n\t}\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n\t/* Find table to update parameters. */\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\tfor (idx = MAX_NUM_OF_TDLS_ENTRY - 1; idx >= 0; idx--)\n\t\t{\n\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\t\tif (pTDLS->Valid && MAC_ADDR_EQUAL(PeerAddr, pTDLS->MacAddr))\n\t\t\t{\n\t\t\t\tif (pTDLS->Status == TDLS_MODE_WAIT_RESPONSE)\n\t\t\t\t{\n\t\t\t\t\tif (RTMPCompareMemory(PeerAddr, pAd->CurrentAddress, MAC_ADDR_LEN) == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t11.20.2 TDLS Link Establishment\n\n\t\t\t\t\t\t\t4.\tThe TDLS setup request frame is received after sending a TDLS Setup Request frame and before\n\t\t\t\t\t\t\t\treceiving the corresponding TDLS Setup Response frame, and the source address of the received\n\t\t\t\t\t\t\t\tTDLS Setup Request frame is lower than its own MAC address. In this case, the TDLS responder\n\t\t\t\t\t\t\t\tSTA shall terminate the TDLS setup it initiated. The TDLS responder STA shall send a response\n\t\t\t\t\t\t\t\tframe.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tRTMPCancelTimer(&(pTDLS->Timer), &TimerCancelled);\n\t\t\t\t\t\tpTDLS->Token = 0;\n\t\t\t\t\t\tpTDLS->Valid = FALSE;\n\t\t\t\t\t\tNdisMoveMemory(pTDLS->MacAddr, PeerAddr, MAC_ADDR_LEN);\n\t\t\t\t\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\t\t\t\t\tidx = -1;\n\t\t\t\t\t\t//pTDLS = pTmpTDLS;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupReqAction() find the same entry \\n\"));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t11.20.2 TDLS Link Establishment\n\n\t\t\t\t\t\t\t3.\tThe TDLS setup request is received after sending a TDLS Setup Request frame and before\n\t\t\t\t\t\t\t\treceiving the corresponding TDLS Setup Response frame, and the source address of the received\n\t\t\t\t\t\t\t\tTDLS Setup Request frame is higher than its own MAC address, in which case the TDLS\n\t\t\t\t\t\t\t\tresponder STA shall silently discard the message and the TDLS responder STA shall send no\n\t\t\t\t\t\t\t\tTDLS Setup Response frame.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tbDiscard = TRUE;\n\t\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupReqAction() find the same entry and discard it\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (pTDLS->Status == TDLS_MODE_CONNECTED)\n\t\t\t\t{\n\t\t\t\t\tif(pTDLS->bInitiator == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tIf a TDLS Setup Request frame is received from a TDLS responder STA with\n\t\t\t\t\t\t\twhich a currently active TDLS session exists, then the receiving STA shall\n\t\t\t\t\t\t\ttear down the existing TDLS direct link as if a TDLS Teardown frame was received,\n\t\t\t\t\t\t\tand respond with a TDLS Setup Response frame.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tif (!VALID_WCID(pTDLS->MacTabMatchWCID))\n\t\t\t\t\t\t\tgoto CleanUp;\n\n\t\t\t\t\t\tMacTableDeleteEntry(pAd, pTDLS->MacTabMatchWCID, pTDLS->MacAddr);\n\n\t\t\t\t\t\tRTMPCancelTimer(&(pTDLS->Timer), &TimerCancelled);\n\t\t\t\t\t\tpTDLS->Token = 0;\n\t\t\t\t\t\tpTDLS->Valid = FALSE;\n\t\t\t\t\t\tNdisMoveMemory(pTDLS->MacAddr, PeerAddr, MAC_ADDR_LEN);\n\t\t\t\t\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (bDiscard == TRUE)\n\t\t\tgoto CleanUp;\n\n\t\tif (idx >= 0)\n\t\t{\n\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\t\t\tif (pTDLS->Token == Token)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS - PeerTdlsSetupReqAction() receive the same token TDLS request !!!\\n\"));\n\t\t\t\tgoto CleanUp;;\n\t\t\t}\n\t\t}\n\n\t\t/* Can not find in table, create a new one */\n\t\tif (idx < 0)\n\t\t{\n\t\t\tfor (idx = (MAX_NUM_OF_TDLS_ENTRY - 1); idx >= 0; idx--)\n\t\t\t{\n\t\t\t\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[idx];\n\n\t\t\t\tif (!pTDLS->Valid)\n\t\t\t\t{\n\t\t\t\t\tRTMPCancelTimer(&(pTDLS->Timer), &TimerCancelled);\n\t\t\t\t\tpTDLS->Valid = TRUE;\n\t\t\t\t\tNdisMoveMemory(pTDLS->MacAddr, PeerAddr, MAC_ADDR_LEN);\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupReqAction() create a new entry \\n\"));\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tif (idx < 0)\n\t\t{\n\t\t\t// Table full !!!!!\n\t\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupReqAction() TDLSEntry table full(only can support %d TDLS session) \\n\",\n\t\t\t\t\t\t\t\t\tMAX_NUM_OF_TDLS_ENTRY));\n\t\t}\n\t\telse if (pTDLS)\n\t\t{\t\n\t\t\t//\n\t\t\t// Process TPK Handshake Message 1 here!\n\t\t\t//\n\t\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t{\n\t\t\t\tUSHORT Result;\n\n\t\t\t\t// RSNIE (7.3.2.25), FTIE (7.3.2.48), Timeout Interval (7.3.2.49)\n\t\t\t\tResult = TDLS_TPKMsg1Process(pAd, \n#ifdef WFD_SUPPORT\n\t\t\t\tWfdSubelementLen,\n#endif /* WFD_SUPPORT */\n\t\t\t\tpTDLS, RsnIe, RsnLen, FTIe, FTLen, TIIe, TILen);\n\t\t\t\tif (Result != MLME_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_TPKMsg1Process() Failed, reason=%d \\n\", Result));\n\t\t\t\t\tif (Result == MLME_REQUEST_DECLINED)\t// if mic error , ignore\n\t\t\t\t\t{\n\t\t\t\t\t\tgoto CleanUp;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tStatusCode = Result;\n\t\t\t\t\t\tgoto send_out;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Copy SNonce, Key lifetime\n\t\t\t\tpTDLS->KeyLifetime = le2cpu32(*((PULONG) (TIIe + 3)));\n\t\t\t\tNdisMoveMemory(pTDLS->SNonce, &FTIe[52], 32);\n\t\t\t}\n\n\n\t\t\t//\n\t\t\t// Update temporarliy settings. Try to match Initiator's capabilities\n\t\t\t//\n\t\t\tpTDLS->Token = Token;\n\n\t\t\t// I am Responder.And peer are Initiator\n\t\t\tpTDLS->bInitiator = TRUE;\n\t\t\tpTDLS->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO;\n\n\t\t\t// Copy Initiator's supported rate and filter out not supported rate\n\t\t\tpTDLS->SupRateLen = SupRateLen;\n\t\t\tNdisMoveMemory(pTDLS->SupRate, SupRate, SupRateLen);\n\t\t\tRTMPCheckRates(pAd, pTDLS->SupRate, &pTDLS->SupRateLen);\n\t\t\tpTDLS->ExtRateLen = ExtRateLen;\n\t\t\tNdisMoveMemory(pTDLS->ExtRate, ExtRate, ExtRateLen);\n\t\t\tRTMPCheckRates(pAd, pTDLS->ExtRate, &pTDLS->ExtRateLen);\n\n\t\t\t// Filter out un-supported ht rates\n\t\t\tif ((HtCapLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))\n\t\t\t{\n\t\t\t\t// HtCapability carries Responder's capability, so not copy from Initiator here.\n\t\t\t\tRTMPZeroMemory(&pTDLS->HtCapability, SIZE_HT_CAP_IE);\n\t\t\t\tpTDLS->HtCapabilityLen = SIZE_HT_CAP_IE;\n\t\t\t\tNdisMoveMemory(&pTDLS->HtCapability, &HtCap, SIZE_HT_CAP_IE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpTDLS->HtCapabilityLen = 0;\n\t\t\t\tRTMPZeroMemory(&pTDLS->HtCapability, SIZE_HT_CAP_IE);\n\t\t\t}\n\n\t\t\t// Copy extended capability\n\t\t\tNdisMoveMemory(&pTDLS->TdlsExtCap, &ExtCap, sizeof(EXT_CAP_INFO_ELEMENT));\n\n\t\t\t// Copy QOS related information\n\t\t\tpTDLS->QosCapability = QosCapability;\n\t\t\tpTDLS->bWmmCapable = bWmmCapable;\n#ifdef WFD_SUPPORT\n\t\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t\tWfdSubelementLen > 0)\n\t\t\t{\n\t\t\t\tWfdParseSubElmt(pAd, \n\t\t\t\t\t\t\t\t&pTDLS->WfdEntryInfo,\n\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\tWfdSubelementLen);\n\n\t\t\t\t/* WFD spec. 4.5.3 Establish WFD Connection using TDLS \n\t\t\t\t * If the type of WFD device indicated in WFD Device Type bits (B1B0) in WFD Device Information field in\n\t\t\t\t * WFD IE within the received TDLS Setup Request frame is different from the expected value,\n\t\t\t\t * the recipient should respond using TDLS Setup Response frame with setting Status Code to 38\n\t\t\t\t * (The request has not been successful as one or more parameters have invalid values).\n\t\t\t\t*/\n\t\t\t\tif (pTDLS->WfdEntryInfo.wfd_devive_type == WFD_SOURCE_PRIMARY_SINK)\n\t\t\t\t\tStatusCode = MLME_REQUEST_WITH_INVALID_PARAM;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tswitch (pAd->StaCfg.WfdCfg.DeviceType)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase WFD_SOURCE:\n\t\t\t\t\t\t\tif (pTDLS->WfdEntryInfo.wfd_devive_type == WFD_SOURCE)\n\t\t\t\t\t\t\t\tStatusCode = MLME_REQUEST_WITH_INVALID_PARAM;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase WFD_PRIMARY_SINK:\n\t\t\t\t\t\tcase WFD_SECONDARY_SINK:\n\t\t\t\t\t\t\tif ((pTDLS->WfdEntryInfo.wfd_devive_type == WFD_PRIMARY_SINK) ||\n\t\t\t\t\t\t\t\t(pTDLS->WfdEntryInfo.wfd_devive_type == WFD_SECONDARY_SINK))\n\t\t\t\t\t\t\t\tStatusCode = MLME_REQUEST_WITH_INVALID_PARAM;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (StatusCode == MLME_REQUEST_WITH_INVALID_PARAM)\n\t\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s:: Peer device type is not the expected value,\\nMy WFD Device Type = %d, Peer WFD Device Type = %d\\n\",\n\t\t\t\t\t__FUNCTION__, pAd->StaCfg.WfdCfg.DeviceType, pTDLS->WfdEntryInfo.wfd_devive_type));\n\t\t\t\telse\t\t\t\t\t\n\t\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"%s:: My WFD Device Type = %d, Peer WFD Device Type = %d\\n\", __FUNCTION__, \n\t\t\t\t\t\tpAd->StaCfg.WfdCfg.DeviceType, pTDLS->WfdEntryInfo.wfd_devive_type));\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\t\t}\n\t}\n\nsend_out:\n\n\tif (StatusCode != MLME_SUCCESS)\n\t{\n\t\tNdisZeroMemory(&TmpTDLS, sizeof(RT_802_11_TDLS));\n\t\tpTDLS = &TmpTDLS;\n\t\tNdisMoveMemory(pTDLS->MacAddr, PeerAddr, MAC_ADDR_LEN);\n\t\tpTDLS->Token = Token;\n\t}\n\n\tTDLS_SetupResponseAction(pAd, pTDLS, RsnLen, RsnIe, FTLen, FTIe,  TILen, TIIe, StatusCode);\n\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\t/*  Set sendout timer */\n\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\t\tRTMPSetTimer(&pTDLS->Timer, Timeout);\n\t\tpTDLS->Valid = TRUE;\n\n\t\t/* State Change */\n\t\tpTDLS->Status = TDLS_MODE_WAIT_CONFIRM;\n\n\t}\n\nCleanUp:\n#ifdef WFD_SUPPORT\n\tos_free_mem(pAd, WfdSubelement);\n#endif /* WFD_SUPPORT */\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS <=== TDLS_PeerSetupReqAction\\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerSetupRspAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT\t\t\tStatusCode = MLME_SUCCESS, LocalStatusCode = MLME_SUCCESS;\n\tBOOLEAN\t\t\tTimerCancelled;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tUCHAR\t\t\tToken;\n\tUCHAR\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tUSHORT\t\t\tCapabilityInfo;\n\tUCHAR\t\t\tSupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];\n\tUCHAR\t\t\tSupRateLen, ExtRateLen, HtCapLen, ExtCapLen, RsnLen, FTLen, TILen, LinkIdentLen;\n\tUCHAR\t\t\tRsnIe[64], FTIe[128], TIIe[7];\n\tUCHAR\t\t\tQosCapability;\n\tBOOLEAN\t\t\tbWmmCapable;\n\tHT_CAPABILITY_IE\t\tHtCap;\n\tEXT_CAP_INFO_ELEMENT\tExtCap;\n\tINT\t\t\t\t\t\tLinkId = 0xff;\n\tUCHAR\t\t\t\t\tTPK[LEN_PMK], TPKName[LEN_PMK_NAME];\n\tPMAC_TABLE_ENTRY\t\tpMacEntry = NULL;\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)Elem->Msg;\n#ifdef WFD_SUPPORT\n\tULONG\tWfdSubelementLen = 0;\n\tPUCHAR\tWfdSubelement = NULL;\n#endif /* WFD_SUPPORT */\n\t\t\n#ifdef WFD_SUPPORT\n\tos_alloc_mem(pAd, &WfdSubelement, MAX_VIE_LEN);\n\tif (WfdSubelement == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s::Allocate memory size(=%d) failed\\n\", __FUNCTION__, MAX_VIE_LEN));\n\t\treturn;\n\t}\n#endif /* WFD_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS ===> TDLS_PeerSetupRspAction\\n\"));\n\n\t// Not TDLS Capable, ignore it\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\tgoto CleanUp;\n\t\n\t// Not BSS mode, ignore it\n\tif (!INFRA_ON(pAd))\n\t\tgoto CleanUp;\n\n\thex_dump(\"TDLS setup response receive pack\", Elem->Msg, Elem->MsgLen);\n\n\t// Init all kinds of fields within the packet\n\tNdisZeroMemory(&CapabilityInfo, sizeof(CapabilityInfo));\n\tNdisZeroMemory(&HtCap, sizeof(HtCap));\n\tNdisZeroMemory(&ExtCap, sizeof(ExtCap));\n\tNdisZeroMemory(RsnIe, sizeof(RsnIe));\n\tNdisZeroMemory(FTIe, sizeof(FTIe));\n\tNdisZeroMemory(TIIe, sizeof(TIIe));\n\tNdisZeroMemory(&LinkIdent, sizeof(LinkIdent));\n\n\tif (!PeerTdlsSetupRspSanity(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\tElem->MsgLen,\n#ifdef WFD_SUPPORT\n\t\t\t\t\t\t\t&WfdSubelementLen,\n\t\t\t\t\t\t\tWfdSubelement,\n#endif /* WFD_SUPPORT */\n\t\t\t\t\t\t\t&Token,\n\t\t\t\t\t\t\tPeerAddr,\n\t\t\t\t\t\t\t&CapabilityInfo,\n\t\t\t\t\t\t\t&SupRateLen,\t\n\t\t\t\t\t\t\tSupRate,\n\t\t\t\t\t\t\t&ExtRateLen,\n\t\t\t\t\t\t\tExtRate,\n\t\t\t\t\t\t\t&bWmmCapable,\n\t\t\t\t\t\t\t&QosCapability,\n\t\t\t\t\t\t\t&HtCapLen,\n\t\t\t\t\t\t\t&HtCap,\n\t\t\t\t\t\t\t&ExtCapLen,\n\t\t\t\t\t\t\t&ExtCap,\n\t\t\t\t\t\t\t&StatusCode,\n\t\t\t\t\t\t\t&RsnLen,\t\n\t\t\t\t\t\t\tRsnIe,\n\t\t\t\t\t\t\t&FTLen,\n\t\t\t\t\t\t\tFTIe,\n\t\t\t\t\t\t\t&TILen,\n\t\t\t\t\t\t\tTIIe,\n\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t&LinkIdent))\n\t{\n\t\tLocalStatusCode = MLME_REQUEST_DECLINED;\n\t}\n\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupRspAction() received a response from %02x:%02x:%02x:%02x:%02x:%02x with StatusCode=%d\\n\",\n\t\t\t\t\t\t\tPeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5], StatusCode));\n\n\tif (StatusCode != MLME_SUCCESS)\n\t{\n\t\tCOPY_MAC_ADDR(PeerAddr, &pFrame->Hdr.Addr3);\n\t}\n\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_PeerSetupRspAction() can not find the LinkId!\\n\"));\n\t\tgoto CleanUp;\n\t}\n\n\t// Point to the current Link ID\n\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\t// Cancel the timer since the received packet to me.\n\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t// Received a error code from the Peer TDLS.\n\t// Let's terminate the setup procedure right now.\n\tif (StatusCode != MLME_SUCCESS)\n\t{\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\tpTDLS->Valid\t= FALSE;\n\t\t\n#ifdef WFD_SUPPORT\n\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t(StatusCode == MLME_SECURITY_WEAK))\n\t\t\tpAd->StaCfg.WfdCfg.TdlsSecurity = WFD_TDLS_WEAK_SECURITY;\n#endif /* WFD_SUPPORT */\n\t\t\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupRspAction() received a failed StatusCode, terminate the setup procedure \\n\"));\n\n\t\tgoto CleanUp;\n\t}\n\telse\n\t\tStatusCode = LocalStatusCode;\n\n\t// \n\t// Validate the content on Setup Response Frame\n\t//\n\twhile (StatusCode == MLME_SUCCESS)\n\t{\t\t\n\t\t// Invalid TDLS State\n\t\tif (pTDLS->Status != TDLS_MODE_WAIT_RESPONSE)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupRspAction() Not in TDLS_MODE_WAIT_RESPONSE STATE\\n\"));\n\t\t\tStatusCode =  MLME_REQUEST_DECLINED;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Is the same Dialog Token?\n\t\tif (pTDLS->Token != Token)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupRspAction() Not match with Dialig Token my token = %d, peer token = %d\\n\",\n\t\t\t\t\t\t\t\t\tpTDLS->Token, Token));\n\t\t\t\n\t\t\tStatusCode =  MLME_REQUEST_DECLINED;\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\t// Process TPK Handshake Message 2 here!\n\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t{\t\n\t\t\tUSHORT Result;\n\n\t\t\t// RSNIE (7.3.2.25), FTIE (7.3.2.48), Timeout Interval (7.3.2.49)\n\t\t\tResult = TDLS_TPKMsg2Process(pAd, pTDLS, RsnIe, RsnLen, FTIe, FTLen, TIIe, TILen, TPK, TPKName);\n\t\t\tif (Result != MLME_SUCCESS)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_TPKMsg2Process() Failed, reason=%d \\n\", Result));\n\t\t\t\tif (Result == MLME_REQUEST_DECLINED)\t// if mic error , ignore\n\t\t\t\t{\n\t\t\t\t\tgoto CleanUp;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tStatusCode = Result;\n\t\t\t\t\tgoto send_out;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Copy ANonce, Key lifetime, TPK, TPK Name\n\t\t\tpTDLS->KeyLifetime =  le2cpu32(*((PULONG) (TIIe + 3)));\n\t\t\tNdisMoveMemory(pTDLS->ANonce, &FTIe[20], 32);\n\t\t\t\tNdisMoveMemory(pTDLS->TPK, TPK, LEN_PMK);\n\t\t\tNdisMoveMemory(pTDLS->TPKName, TPKName, LEN_PMK_NAME);\n\t\t}\n\n\t\t// Update parameters\n\t\tif (StatusCode == MLME_SUCCESS)\n\t\t{\n\t\t\t// I am Initiator. And peer are Responder\n\t\t\tpTDLS->bInitiator = FALSE;\n\t\t\t// Capabilities\n\t\t\tpTDLS->CapabilityInfo = CapabilityInfo;\n\n\t\t\tpTDLS->SupRateLen = SupRateLen;\n\t\t\tpTDLS->ExtRateLen = ExtRateLen;\n\t\t\t\n\t\t\t// Copy ht capabilities from the Peer TDLS\n\t\t\tif ((HtCapLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))\n\t\t\t{\n\t\t\t\tNdisMoveMemory(&pTDLS->HtCapability, &HtCap, HtCapLen);\n\t\t\t\tpTDLS->HtCapabilityLen = HtCapLen;\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpTDLS->HtCapabilityLen = 0;\n\t\t\t\tRTMPZeroMemory(&pTDLS->HtCapability, SIZE_HT_CAP_IE);\n\t\t\t}\n\n\t\t\t// Copy extended capability\n\t\t\tNdisMoveMemory(&pTDLS->TdlsExtCap, &ExtCap, sizeof(EXT_CAP_INFO_ELEMENT));\n\n\t\t\t// Copy QOS related information\n\t\t\tpTDLS->QosCapability = QosCapability;\n\t\t\tpTDLS->bWmmCapable = bWmmCapable;\n\t\t\t\n\t\t\t// Copy TPK related information\n\t\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t{\n\t\t\t\t// SNonce, Key lifetime\n\t\t\t}\n#ifdef WFD_SUPPORT\n\t\t\tif (WfdSubelementLen > 0)\n\t\t\t{\n\t\t\t\tWfdParseSubElmt(pAd, \n\t\t\t\t\t\t\t\t&pTDLS->WfdEntryInfo,\n\t\t\t\t\t\t\t\t(PVOID)WfdSubelement, \n\t\t\t\t\t\t\t\tWfdSubelementLen);\n\t\t\t}\n#endif /* WFD_SUPPORT */\n\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t//\n\t// Insert into mac table\n\t//\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\t// allocate one MAC entry\n\t\tpMacEntry = MacTableLookup(pAd, pTDLS->MacAddr);\n\n\t\tif (pMacEntry && IS_ENTRY_TDLS(pMacEntry))\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - MacTable Entry exist !!!\\n\"));\n\t\telse\n\t\t\tpMacEntry = MacTableInsertEntry(pAd, pTDLS->MacAddr, BSS0 + MIN_NET_DEVICE_FOR_TDLS, OPMODE_STA, TRUE);\n\n\t\tif (pMacEntry)\n\t\t{\n\t\t\tpTDLS->MacTabMatchWCID = pMacEntry->Aid;\n\t\t\tpMacEntry->AuthMode = pAd->StaCfg.AuthMode;\n\t\t\tpMacEntry->WepStatus = pAd->StaCfg.WepStatus;\n\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\tpMacEntry->Sst = SST_ASSOC;\n\n#ifdef UAPSD_SUPPORT\n\t\t\t/* update UAPSD */\n\t\t\tUAPSD_AssocParse(pAd, pMacEntry, &QosCapability,\n\t\t\t\t\t\t\tpAd->StaCfg.UapsdInfo.bAPSDCapable);\n#endif /* UAPSD_SUPPORT */\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MacTableInsertTDlsEntry - allocate entry #%d, Total= %d\\n\",pMacEntry->Aid, pAd->MacTab.Size));\n\n\t\t\t// Set WMM capability\n\t\t\tif ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) || (pAd->CommonCfg.bWmmCapable))\n\t\t\t{\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS -  WMM Capable\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCLIENT_STATUS_CLEAR_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t}\n\n\t\t\tTDLS_InitPeerEntryRateCapability(pAd,\n\t\t\t\t\t\t\t\t\t\t\tpMacEntry,\n\t\t\t\t\t\t\t\t\t\t\t&CapabilityInfo,\n\t\t\t\t\t\t\t\t\t\t\tSupRateLen,\n\t\t\t\t\t\t\t\t\t\t\tSupRate,\n\t\t\t\t\t\t\t\t\t\t\tHtCapLen,\n\t\t\t\t\t\t\t\t\t\t\t&HtCap);\n\n\t\t\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\t\t\tpMacEntry,\n\t\t\t\t\t\t\t\tSupRate,\n\t\t\t\t\t\t\t\tSupRateLen,\n\t\t\t\t\t\t\t\tExtRate,\n\t\t\t\t\t\t\t\tExtRateLen,\n\t\t\t\t\t\t\t\t&HtCap,\n\t\t\t\t\t\t\t\tHtCapLen);\n\n\t\t\t//\n\t\t\t// Install Peer Key if RSNA Enabled\n\t\t\t//\n\t\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t{\t\n\t\t\t\t// Write to ASIC on-chip table.\n\t\t\t\tif ( pMacEntry->Aid > 1)\n\t\t\t\t{\n\t\t\t\t\tCIPHER_KEY\t\tPairwiseKey;\n\n\t\t\t\t\tPairwiseKey.CipherAlg = CIPHER_AES;\n\n\t\t\t\t\t// Set Peer Key\n\t\t\t\t\tPairwiseKey.KeyLen = LEN_TK;\n\t\t\t\t\tNdisMoveMemory(PairwiseKey.Key, &pTDLS->TPK[16], LEN_TK);\n\n\t\t\t\t\tRTMP_ASIC_PAIRWISE_KEY_TABLE(pAd,\n\t\t\t\t\t\t\t\t\t\t\tpMacEntry->Aid,\n\t\t\t\t\t\t\t\t\t\t\t&PairwiseKey);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd, \n\t\t\t\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\t\t\t\t0, \n\t\t\t\t\t\t\t\t\t\tPairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\tpMacEntry->Aid,\n\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\n\t\t\t\t\tNdisMoveMemory(&pMacEntry->PairwiseKey, &PairwiseKey, sizeof(CIPHER_KEY));\n\n\t\t\t\t\tpMacEntry->AuthMode = Ndis802_11AuthModeWPA2PSK;\n\t\t\t\t\tpMacEntry->WepStatus = Ndis802_11Encryption3Enabled;\n\t\t\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\tpMacEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupRspAction() MacTableInsertEntry failed\\n\"));\n\t\t}\n\t}\n\telse\n\t\tStatusCode = MLME_REQUEST_DECLINED;\n\nsend_out:\t\n\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\tTDLS_SetupConfirmAction(pAd, pTDLS, RsnLen, RsnIe, FTLen, FTIe, TILen, TIIe, StatusCode);\n\n\t\tpTDLS->ChSwitchTime = pAd->StaCfg.TdlsInfo.TdlsSwitchTime;\n\t\tpTDLS->ChSwitchTimeout = pAd->StaCfg.TdlsInfo.TdlsSwitchTimeout;\n\t\tpTDLS->Status = TDLS_MODE_CONNECTED;\n\n\t\tTDLS_UAPSD_ENTRY_INIT(pTDLS);\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\tif (pAd->StaCfg.TdlsInfo.TdlsAutoLink)\n\t\t{\n\t\t\tPTDLS_DISCOVERY_ENTRY pPeerEntry = NULL;\n\t\t\tPLIST_HEADER\tpTdlsDiscovEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\t\t\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\n\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\tTDLS_InsertDiscoveryPeerEntryByMAC(pTdlsDiscovEnList, pTDLS->MacAddr, TRUE);\n\t\t\tpPeerEntry = TDLS_FindDiscoveryEntry(pTdlsDiscovEnList, pTDLS->MacAddr);\n\t\t\tif (pPeerEntry)\n\t\t\t{\n\t\t\t\tpPeerEntry->bConnectedFirstTime = TRUE;\n\t\t\t\tpPeerEntry->bConnected = TRUE;\n\t\t\t\tpPeerEntry->RetryCount = 0;\n\t\t\t\tpPeerEntry->CurrentState = TDLS_DISCOVERY_TO_SETUP_DONE;\n\t\t\t}\n\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\n\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\tTDLS_DelBlackEntryByMAC(pTdlsBlackEnList, pTDLS->MacAddr);\n\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t}\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t}\n\telse\n\t{\n\t\tif ((pTDLS->Status >= TDLS_MODE_CONNECTED) && (pTDLS->Token == Token))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS - PeerTdlsSetupRspAction() receive the same token TDLS response !!!\\n\"));\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\tpTDLS->Valid\t= FALSE;\n\t}\n\n\t//pAd->StaCfg.TdlsCurrentOperateChannel = pAd->CommonCfg.Channel;\n\nCleanUp:\n#ifdef WFD_SUPPORT\n\tos_free_mem(pAd, WfdSubelement);\n#endif /* WFD_SUPPORT */\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS <=== TDLS_PeerSetupRspAction\\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerSetupConfAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUSHORT\t\t\tStatusCode = MLME_SUCCESS, LocalStatusCode = MLME_SUCCESS;\n\tBOOLEAN\t\t\tTimerCancelled;\t\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tUCHAR\t\t\tToken;\n\tUCHAR\t\t\tPeerAddr[MAC_ADDR_LEN];\n\tUSHORT\t\t\tCapabilityInfo;\n\tEDCA_PARM\t\tEdcaParm;\n\tINT\t\t\t\tLinkId = 0xff;\n\tUCHAR\t\t\tRsnLen, FTLen, TILen, LinkIdentLen;\n\tUCHAR\t\t\tRsnIe[64], FTIe[128], TIIe[7];\n\tPMAC_TABLE_ENTRY pMacEntry = NULL;\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n\tADD_HT_INFO_IE\t\tAddHtInfo;\n\tUCHAR\t\t\tAddHtInfoLen;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)Elem->Msg;\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS ===> TDLS_PeerSetupConfAction\\n\"));\n\n\t// Not TDLS Capable, ignore it\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\treturn;\n\t\n\t// Not BSS mode, ignore it\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\thex_dump(\"TDLS setup confirm receive pack\", Elem->Msg, Elem->MsgLen);\n\n\t// Init all kinds of fields within the packet\n\tNdisZeroMemory(&EdcaParm, sizeof(EdcaParm));\n\tNdisZeroMemory(&CapabilityInfo, sizeof(CapabilityInfo));\n\tNdisZeroMemory(RsnIe, sizeof(RsnIe));\n\tNdisZeroMemory(FTIe, sizeof(FTIe));\n\tNdisZeroMemory(TIIe, sizeof(TIIe));\n\tNdisZeroMemory(&LinkIdent, sizeof(LinkIdent));\n\n\tif (!PeerTdlsSetupConfSanity(\n\t\t\t\t\t\t\tpAd, \n\t\t\t\t\t\t\tElem->Msg, \n\t\t\t\t\t\t\tElem->MsgLen,\n\t\t\t\t\t\t\t&Token,\n\t\t\t\t\t\t\tPeerAddr,\n\t\t\t\t\t\t\t&CapabilityInfo,\n\t\t\t\t\t\t\t&EdcaParm,\n\t\t\t\t\t\t\t&StatusCode,\n\t\t\t\t\t\t\t&RsnLen,\t\n\t\t\t\t\t\t\tRsnIe,\n\t\t\t\t\t\t\t&FTLen,\n\t\t\t\t\t\t\tFTIe,\n\t\t\t\t\t\t\t&TILen,\n\t\t\t\t\t\t\tTIIe,\n\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t&LinkIdent,\n\t\t\t\t\t\t\t&AddHtInfoLen,\n\t\t\t\t\t\t\t&AddHtInfo))\n\t{\n\t\tLocalStatusCode = MLME_REQUEST_DECLINED;\n\t}\n\n\tif (StatusCode != MLME_SUCCESS)\n\t{\n\t\tCOPY_MAC_ADDR(PeerAddr, &pFrame->Hdr.Addr3);\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupConfAction() received a confirm from %02x:%02x:%02x:%02x:%02x:%02x with StatusCode=%d\\n\",\n\t\t\t\t\t\t\tPeerAddr[0], PeerAddr[1], PeerAddr[2], PeerAddr[3], PeerAddr[4], PeerAddr[5], StatusCode));\n\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t\treturn;\n\n\t// Point to the current Link ID\n\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\t// Cancel the timer since the received packet to me.\n\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\n\n\t// Received a error code from the Peer TDLS.\n\t// Let's terminate the setup procedure right now.\n\tif (StatusCode != MLME_SUCCESS)\n\t{\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\tpTDLS->Valid\t= FALSE;\n\t\t\n#ifdef WFD_SUPPORT\n\t\tif ((pAd->StaCfg.WfdCfg.bWfdEnable) &&\n\t\t\t(StatusCode == MLME_SECURITY_WEAK))\n\t\t\tpAd->StaCfg.WfdCfg.TdlsSecurity = WFD_TDLS_WEAK_SECURITY;\n#endif /* WFD_SUPPORT */\n\t\t\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupConfAction() received a failed StatusCode, terminate the setup procedure \\n\"));\n\n\t\treturn;\n\t}\n\telse\n\t\tStatusCode = LocalStatusCode;\n\n\t// \n\t// Validate the content on Setup Confirm Frame\n\t//\n\twhile (StatusCode == MLME_SUCCESS)\n\t{\t\t\n\t\t// Invalid TDLS State\n\t\tif (pTDLS->Status != TDLS_MODE_WAIT_CONFIRM)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupConfAction() Not in TDLS_MODE_WAIT_CONFIRM STATE\\n\"));\t\t\n\t\t\tStatusCode =  MLME_REQUEST_DECLINED;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Is the same Dialog Token?\n\t\tif (pTDLS->Token != Token)\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsSetupConfAction() Not match with Dialig Token \\n\"));\n\t\t\tStatusCode =  MLME_REQUEST_DECLINED;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Process TPK Handshake Message 3 here!\n\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t{\t\t\n\t\t\tUSHORT Result;\n\n\t\t\t// RSNIE (7.3.2.25), FTIE (7.3.2.48), Timeout Interval (7.3.2.49)\n\t\t\tResult = TDLS_TPKMsg3Process(pAd, pTDLS, RsnIe, RsnLen, FTIe, FTLen, TIIe, TILen);\n\t\t\tif (Result != MLME_SUCCESS)\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TPKMsg3Process() Failed, reason=%d \\n\", Result));\n\t\t\t\tStatusCode = Result;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Update parameters\n\t\tif (StatusCode == MLME_SUCCESS)\n\t\t{\n\t\t\t// I am Responder.And peer are Initiator\n\t\t\tpTDLS->bInitiator = TRUE;\n\t\t\t\n\t\t\t// Copy EDCA Parameters\n\t\t\tif ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) || (pAd->CommonCfg.bWmmCapable))\n\t\t\t\tNdisMoveMemory(&pTDLS->EdcaParm, &EdcaParm, sizeof(EDCA_PARM));\n\t\t\telse\n\t\t\t\tNdisZeroMemory(&pTDLS->EdcaParm, sizeof(EDCA_PARM));\n\n\t\t\t// Copy TPK related information\n\t\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t{\n\t\t\t\t// SNonce, Key lifetime\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t//\n\t// Insert into mac table\n\t//\n\tif (StatusCode == MLME_SUCCESS)\n\t{\n\t\t// allocate one MAC entry\n\t\tpMacEntry = MacTableLookup(pAd, pTDLS->MacAddr);\n\t\tif (pMacEntry && IS_ENTRY_TDLS(pMacEntry))\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - MacTable Entry exist !!!\\n\"));\n\t\telse\n\t\t\tpMacEntry = MacTableInsertEntry(pAd, pTDLS->MacAddr, BSS0 + MIN_NET_DEVICE_FOR_TDLS, OPMODE_STA, TRUE);\n\n\t\tif (pMacEntry)\n\t\t{\n\t\t\tpTDLS->MacTabMatchWCID = pMacEntry->Aid;\n\t\t\tpMacEntry->AuthMode = pAd->StaCfg.AuthMode;\n\t\t\tpMacEntry->WepStatus = pAd->StaCfg.WepStatus;\n\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\tpMacEntry->Sst = SST_ASSOC;\n\t\t\tpMacEntry->MatchTdlsEntryIdx = LinkId;\n\n#ifdef UAPSD_SUPPORT\n\t\t\t/* update UAPSD */\n\t\t\tpTDLS->QosCapability |= (pTDLS->EdcaParm.EdcaUpdateCount & 0x0f);\n\n\t\t\tUAPSD_AssocParse(pAd, pMacEntry, &pTDLS->QosCapability,\n\t\t\t\t\t\t\tpAd->StaCfg.UapsdInfo.bAPSDCapable);\n#endif /* UAPSD_SUPPORT */\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"MacTableInsertTDlsEntry - allocate entry #%d, Total= %d\\n\",pMacEntry->Aid, pAd->MacTab.Size));\n\n\t\t\t// Set WMM capability\n\t\t\tif ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) || (pAd->CommonCfg.bWmmCapable))\n\t\t\t{\n\t\t\t\tCLIENT_STATUS_SET_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS -  WMM Capable\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCLIENT_STATUS_CLEAR_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE);\n\t\t\t}\n\n\t\t\tTDLS_InitPeerEntryRateCapability(pAd,\n\t\t\t\t\t\t\t\t\t\t\tpMacEntry,\n\t\t\t\t\t\t\t\t\t\t\t&pTDLS->CapabilityInfo,\n\t\t\t\t\t\t\t\t\t\t\tpTDLS->SupRateLen,\n\t\t\t\t\t\t\t\t\t\t\tpTDLS->SupRate,\n\t\t\t\t\t\t\t\t\t\t\tpTDLS->HtCapabilityLen,\n\t\t\t\t\t\t\t\t\t\t\t&pTDLS->HtCapability);\n\n\t\t\tRTMPSetSupportMCS(pAd,\n\t\t\t\t\t\t\t\tOPMODE_STA,\n\t\t\t\t\t\t\t\tpMacEntry,\n\t\t\t\t\t\t\t\tpTDLS->SupRate,\n\t\t\t\t\t\t\t\tpTDLS->SupRateLen,\n\t\t\t\t\t\t\t\tpTDLS->ExtRate,\n\t\t\t\t\t\t\t\tpTDLS->ExtRateLen,\n\t\t\t\t\t\t\t\t&pTDLS->HtCapability,\n\t\t\t\t\t\t\t\tpTDLS->HtCapabilityLen);\n\n\t\t\t//\n\t\t\t// Install Peer Key if RSNA Enabled\n\t\t\t//\n\t\t\tif (pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled)\n\t\t\t{\t\n\t\t\t\t// Write to ASIC on-chip table.\n\t\t\t\tif ( pMacEntry->Aid > 1)\n\t\t\t\t{\n\t\t\t\t\tCIPHER_KEY\t\tPairwiseKey;\n\n\t\t\t\t\tPairwiseKey.CipherAlg = CIPHER_AES;\n\n\t\t\t\t\t// Set Peer Key\n\t\t\t\t\tPairwiseKey.KeyLen = LEN_TK;\n\t\t\t\t\tNdisMoveMemory(PairwiseKey.Key, &pTDLS->TPK[16], LEN_TK);\n\n\t\t\t\t\tRTMP_ASIC_PAIRWISE_KEY_TABLE(pAd,\n\t\t\t\t\t\t\t\t\t\t\tpMacEntry->Aid,\n\t\t\t\t\t\t\t\t\t\t\t&PairwiseKey);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\tRTMP_SET_WCID_SEC_INFO(pAd, \n\t\t\t\t\t\t\t\t\t\tBSS0,\n\t\t\t\t\t\t\t\t\t\t0, \n\t\t\t\t\t\t\t\t\t\tPairwiseKey.CipherAlg, \n\t\t\t\t\t\t\t\t\t\tpMacEntry->Aid,\n\t\t\t\t\t\t\t\t\t\tPAIRWISEKEYTABLE);\n\n\t\t\t\t\tNdisMoveMemory(&pMacEntry->PairwiseKey, &PairwiseKey, sizeof(CIPHER_KEY));\n\n\t\t\t\t\tpMacEntry->AuthMode = Ndis802_11AuthModeWPA2PSK;\n\t\t\t\t\tpMacEntry->WepStatus = Ndis802_11Encryption3Enabled;\n\t\t\t\t\tpMacEntry->PortSecured = WPA_802_1X_PORT_SECURED;\n\t\t\t\t\tpMacEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t}\n\n\t\t\tpTDLS->Status = TDLS_MODE_CONNECTED;\n\t\t\tpTDLS->ChSwitchTime = pAd->StaCfg.TdlsInfo.TdlsSwitchTime;\n\t\t\tpTDLS->ChSwitchTimeout = pAd->StaCfg.TdlsInfo.TdlsSwitchTimeout;\n\n\t\t\tTDLS_UAPSD_ENTRY_INIT(pTDLS);\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\t\tif (pAd->StaCfg.TdlsInfo.TdlsAutoLink)\n\t\t\t{\n\t\t\t\tPTDLS_DISCOVERY_ENTRY pPeerEntry = NULL;\n\t\t\t\tPLIST_HEADER\tpTdlsDiscovEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n\t\t\t\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\n\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\t\t\tTDLS_InsertDiscoveryPeerEntryByMAC(pTdlsDiscovEnList, pTDLS->MacAddr, TRUE);\n\t\t\t\tpPeerEntry = TDLS_FindDiscoveryEntry(pTdlsDiscovEnList, pTDLS->MacAddr);\n\t\t\t\tif (pPeerEntry)\n\t\t\t\t{\n\t\t\t\t\tpPeerEntry->bConnectedFirstTime = TRUE;\n\t\t\t\t\tpPeerEntry->bConnected = TRUE;\n\t\t\t\t\tpPeerEntry->RetryCount = 0;\n\t\t\t\t\tpPeerEntry->CurrentState = TDLS_DISCOVERY_TO_SETUP_DONE;\n\t\t\t\t}\n\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\n\t\t\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t\tTDLS_DelBlackEntryByMAC(pTdlsBlackEnList, pTDLS->MacAddr);\n\t\t\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\t\t}\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\t\tpTDLS->Token = 0;\n\t\t\tpTDLS->Valid = FALSE;\n\t\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_PeerSetupConfAction() MacTableInsertEntry failed\\n\"));\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pTDLS->Status >= TDLS_MODE_CONNECTED) && (pTDLS->Token == Token))\n\t\t{\n\t\t\tDBGPRINT(RT_DEBUG_WARN, (\"TDLS - TDLS_PeerSetupConfAction() receive the same token TDLS confirm !!!\\n\"));\n\t\t\treturn;\n\t\t}\n\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\tpTDLS->Token = 0;\n\t\tpTDLS->Valid = FALSE;\n\t\tStatusCode = MLME_REQUEST_DECLINED;\n\t}\n\n\tpAd->StaCfg.TdlsInfo.TdlsDialogToken = Token;\n\t//pAd->StaCfg.TdlsCurrentOperateChannel = pAd->CommonCfg.Channel;\n\tDBGPRINT(RT_DEBUG_ERROR, (\"TDLS <=== TDLS_PeerSetupConfAction\\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_MlmeTearDownAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tUINT16\t\t\tReasonCode;\n\tBOOLEAN\t\t\tIsViaAP = FALSE;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS ===> TDLS_MlmeTearDownAction() \\n\"));\n\n\tif (!MlmeTdlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, &pTDLS, &ReasonCode, &IsViaAP))\n\t\treturn;\n\n\t/* Build TDLS Setup Request Frame via direct link*/\n\tNStatus = TDLS_TearDownAction(pAd, pTDLS, ReasonCode, TRUE);\n\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_MlmeTearDownAction() Build Setup Request Fail !!!\\n\"));\n\t}\n\telse\n\t{\n\t\tBOOLEAN TimerCancelled;\n\n\t\tif (!VALID_WCID(pTDLS->MacTabMatchWCID))\n\t\t\treturn;\n\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\tpTDLS->Token = 0;\n\t\tpTDLS->Valid = FALSE;\n\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t\tMacTableDeleteEntry(pAd, pTDLS->MacTabMatchWCID, pTDLS->MacAddr);\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS <=== TDLS_MlmeTearDownAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_PeerTearDownAction(\n    IN PRTMP_ADAPTER pAd, \n    IN MLME_QUEUE_ELEM *Elem)\n{\n\tUCHAR\t\t\t\tSA[MAC_ADDR_LEN];\n\tUSHORT\t\t\t\tReasonCode;\n\tPRT_802_11_TDLS\t\tpTDLS = NULL;\n\tINT\t\t\t\t\tLinkId = 0xff;\n\tBOOLEAN\t\t\t\tIsInitator;\n\t//UINT\t\t\t\ti;\n\tBOOLEAN\t\t\t\tTimerCancelled;\n\tUCHAR\t\t\t\tFTLen, LinkIdentLen;\n\tUCHAR\t\t\t\tFTIe[128];\n\tTDLS_LINK_IDENT_ELEMENT\tLinkIdent;\n\tPHEADER_802_11 pHdr;\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS ===> TDLS_PeerTearDownAction() \\n\"));\n\n\t// Not TDLS Capable, ignore it\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\treturn;\n\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\thex_dump(\"TDLS TearDown receive pack\", Elem->Msg, Elem->MsgLen);\n\n\t// Init FTIe\n\tNdisZeroMemory(FTIe, sizeof(FTIe));\n\tNdisZeroMemory(&LinkIdent, sizeof(LinkIdent));\n\t\n\tif (!PeerTdlsTearDownSanity(pAd,\n\t\t\t\t\t\t\t\tElem->Msg,\n\t\t\t\t\t\t\t\tElem->MsgLen,\n\t\t\t\t\t\t\t\tSA,\n\t\t\t\t\t\t\t\t&IsInitator,\n\t\t\t\t\t\t\t\t&ReasonCode,\n\t\t\t\t\t\t\t\t&FTLen,\n\t\t\t\t\t\t\t\tFTIe,\n\t\t\t\t\t\t\t\t&LinkIdentLen,\n\t\t\t\t\t\t\t\t&LinkIdent))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsTearDownAction() from %02x:%02x:%02x:%02x:%02x:%02x Sanity Check Fail\\n\",\n\t\t\t\t\t\t\t\tSA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));\n\t\treturn;\n\t}\n\n\tpHdr = (PHEADER_802_11)Elem->Msg;\n\n\tif (pHdr->FC.FrDs == 1)\n\t{\n\t\tCOPY_MAC_ADDR(SA, &pHdr->Addr3);\n\t}\n\telse\n\t{\n\t\tCOPY_MAC_ADDR(SA, &pHdr->Addr2);\n\t}\n\n\tDBGPRINT(RT_DEBUG_OFF,(\"TDLS - PeerTdlsTearDownAction() from %02x:%02x:%02x:%02x:%02x:%02x with ReasonCode=%d\\n\",\n\t\t\t\t\t\t\tSA[0], SA[1], SA[2], SA[3], SA[4], SA[5], ReasonCode));\n\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, SA);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsTearDownAction() can not find from %02x:%02x:%02x:%02x:%02x:%02x on TDLS entry !!!\\n\",\n\t\t\t\t\t\t\t\tSA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));\n\t\treturn;\n\t}\n\t\n\t// Point to the current Link ID\n\tpTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\t// Cancel the timer since the received packet to me.\n\t//RTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t// Drop mismatched identifier.\n\tif (pTDLS->bInitiator != IsInitator)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - PeerTdlsTearDownAction() pTDLS->bInitiator = %x parse = %x !!!\\n\",\n\t\t\t\t\t\t\t\tpTDLS->bInitiator, IsInitator));\n\t\treturn;\n\t}\n\n\n\t// clear tdls table entry\n\tif (pTDLS->Valid && MAC_ADDR_EQUAL(SA, pTDLS->MacAddr))\n\t{\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\tPLIST_HEADER\tpTdlsBlackEnList = &pAd->StaCfg.TdlsInfo.TdlsBlackList;\n\t\tPLIST_HEADER\tpTdlsDiscoveryEnList = &pAd->StaCfg.TdlsInfo.TdlsDiscovPeerList;\n#endif // TDLS_AUTOLINK_SUPPORT //\n\n\t\tpTDLS->Status = TDLS_MODE_NONE;\n\t\tpTDLS->Token = 0;\n\t\tpTDLS->Valid = FALSE;\n\t\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t\tMacTableDeleteEntry(pAd, pTDLS->MacTabMatchWCID, SA);\n\n#ifdef TDLS_AUTOLINK_SUPPORT\n\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\t\tTDLS_InsertBlackEntryByMAC(pTdlsBlackEnList, SA, TDLS_BLACK_TDLS_BY_TEARDOWN);\n\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsBlackListSemLock);\n\n\t\tRTMP_SEM_LOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n\t\tTDLS_DelDiscoveryEntryByMAC(pTdlsDiscoveryEnList, SA);\n\t\tRTMP_SEM_UNLOCK(&pAd->StaCfg.TdlsInfo.TdlsDiscovPeerListSemLock);\n#endif // TDLS_AUTOLINK_SUPPORT //\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS <=== TDLS_PeerTearDownAction() \\n\"));\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_TimeoutAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRT_802_11_TDLS\t\t\tpTDLS = (PRT_802_11_TDLS)FunctionContext;\n\tPRTMP_ADAPTER \t\t\tpAd;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TdlsTimeout - Failed to wait for the response, terminate the setup procedure (%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\tpTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2], pTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5]));\n\n\t/*\n\t\t11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA\n\t\tWhen no corresponding TDLS Peer Traffic Response frame has been\n\t\treceived within dot11TDLSResponseTimeout after sending a TDLS Peer\n\t\tTraffic Indication frame, the STA shall tear down the direct link.\n\t*/\n\tpAd = pTDLS->pAd;\n\n\tif (pTDLS->FlgIsWaitingUapsdTraRsp == TRUE)\n\t{\n\t\t/* timeout for traffic response frame */\n\n\t\t/* TODO: tear down the link with the peer */\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"tdls uapsd> traffic rsp timeout!!!\\n\"));\n\t\tpTDLS->FlgIsWaitingUapsdTraRsp = FALSE;\n\t\tTDLS_TearDownPeerLink(pAd, pTDLS->MacAddr, FALSE);\n\t\treturn;\n\t}\n\n\tif ((pTDLS) && (pTDLS->Valid) && (pTDLS->Status < TDLS_MODE_CONNECTED))\n\t{\n\t\tpTDLS->Valid\t= FALSE;\n\t\tpTDLS->Status\t= TDLS_MODE_NONE;\n\t}\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_LinkTimeoutAction(\n\tIN PVOID SystemSpecific1, \n\tIN PVOID FunctionContext, \n\tIN PVOID SystemSpecific2, \n\tIN PVOID SystemSpecific3) \n{\n\tPRT_802_11_TDLS \t\tpTDLS = (PRT_802_11_TDLS)FunctionContext;\n\tPRTMP_ADAPTER\t\t\tpAd;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"TdlsTimeout - Failed to wait for the response, terminate the setup procedure (%02x:%02x:%02x:%02x:%02x:%02x)\\n\",\n\t\t\t\t\t\t\t\tpTDLS->MacAddr[0], pTDLS->MacAddr[1], pTDLS->MacAddr[2], pTDLS->MacAddr[3], pTDLS->MacAddr[4], pTDLS->MacAddr[5]));\n\n\t/*\n\t\t11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA\n\t\tWhen no corresponding TDLS Peer Traffic Response frame has been\n\t\treceived within dot11TDLSResponseTimeout after sending a TDLS Peer\n\t\tTraffic Indication frame, the STA shall tear down the direct link.\n\t*/\n\tpAd = pTDLS->pAd;\n\tif (pTDLS->FlgIsWaitingUapsdTraRsp == TRUE)\n\t{\n\t\t/* timeout for traffic response frame */\n\n\t\t/* TODO: tear down the link with the peer */\n\t\tDBGPRINT(RT_DEBUG_OFF, (\"tdls uapsd> traffic rsp timeout!!!\\n\"));\n\t\tpTDLS->FlgIsWaitingUapsdTraRsp = FALSE;\n\t\tTDLS_TearDownPeerLink(pAd, pTDLS->MacAddr, FALSE);\n\t\treturn;\n\t}\n\n\tif ((pTDLS) && (pTDLS->Valid) && (pTDLS->Status < TDLS_MODE_CONNECTED))\n\t{\n\t\tpTDLS->Valid\t= FALSE;\n\t\tpTDLS->Status\t= TDLS_MODE_NONE;\n\t}\n}\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/tdls_tlv.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology 5th Rd.\n * Science-based Industrial Park\n * Hsin-chu, Taiwan, R.O.C.\n * (c) Copyright 2002, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ****************************************************************************\n\n    Module Name:\n    tdls.h\n \n    Abstract:\n \n    Revision History:\n    Who        When          What\n    ---------  ----------    ----------------------------------------------\n    Arvin Tai  17-04-2009    created for 802.11z\n */\n\n#ifdef DOT11Z_TDLS_SUPPORT\n\n#include \"rt_config.h\"\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertActField(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tCategory,\n\tIN\tUINT8\tActCode)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&Category,\n\t\t\t\t\t\t1,\t\t\t\t&ActCode,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertStatusCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT16\tStatusCode)\n{\n\tULONG TempLen;\n\n\tStatusCode = cpu2le16(StatusCode);\n\tMakeOutgoingFrame(\tpFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t2,\t\t\t\t&StatusCode,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertReasonCode(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT16\tReasonCode)\n{\n\tULONG TempLen;\n\n\tReasonCode = cpu2le16(ReasonCode);\n\tMakeOutgoingFrame(\tpFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t2,\t\t\t\t&ReasonCode,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertDialogToken(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tDialogToken)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&DialogToken,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertLinkIdentifierIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tPUCHAR\tpInitAddr,\n\tIN\tPUCHAR\tpRespAddr)\n{\n\tULONG TempLen;\n\tUCHAR TDLS_IE = IE_TDLS_LINK_IDENTIFIER;\n\tUCHAR TDLS_IE_LEN = TDLS_ELM_LEN_LINK_IDENTIFIER;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&TDLS_IE,\n\t\t\t\t\t\t1,\t\t\t\t&TDLS_IE_LEN,\n\t\t\t\t\t\t6,\t\t\t\tpAd->CommonCfg.Bssid,\n\t\t\t\t\t\t6,\t\t\t\tpInitAddr,\n\t\t\t\t\t\t6,\t\t\t\tpRespAddr,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertCapIE(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t2,\t\t\t\t&pAd->StaActive.CapabilityInfo,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertSSIDIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&SsidIe,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&pAd->CommonCfg.SsidLen, \n\t\t\t\t\t\tpAd->CommonCfg.SsidLen,\t\tpAd->CommonCfg.Ssid,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertSupportRateIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t\t\t\t&SupRateIe,\n\t\t\t\t\t\t1,\t\t\t\t\t\t&pAd->StaActive.SupRateLen,\n\t\t\t\t\t\tpAd->StaActive.SupRateLen,\tpAd->StaActive.SupRate,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertCountryIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n    // add country IE, power constraint IE\n\tif (pAd->CommonCfg.bCountryFlag)\n\t{\n\t\tULONG TmpLen, TmpLen2=0;\n\t\tUCHAR TmpFrame[256];\n\t\tUCHAR CountryIe = IE_COUNTRY;\n\n\t\tNdisZeroMemory(TmpFrame, sizeof(TmpFrame));\n\n\t\t// prepare channel information\n\t\t{\n\t\t\tUCHAR regclass;\n\t\t\tUCHAR RegluatoryRxtIdent = 221;\n\t\t\tUCHAR CoverageClass = 0;\n\n\t\t\tregclass = TDLS_GetRegulatoryClass(pAd, pAd->CommonCfg.RegTransmitSetting.field.BW, pAd->CommonCfg.Channel);\n\t\t\tMakeOutgoingFrame(TmpFrame+TmpLen2,\t&TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&RegluatoryRxtIdent,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&regclass,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&CoverageClass,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\tTmpLen2 += TmpLen;\n\t\t}\n\n\t\t// need to do the padding bit check, and concatenate it\n\t\tif ((TmpLen2%2) == 0)\n\t\t{\n\t\t\tUCHAR\tTmpLen3 = TmpLen2 + 4;\n\t\t\tMakeOutgoingFrame(pFrameBuf,\t\t&TmpLen,\n\t\t\t\t\t\t\t1,\t\t\t\t&CountryIe,\n\t\t\t\t\t\t\t1,\t\t\t\t&TmpLen3,\n\t\t\t\t\t\t\t3,\t\t\t\tpAd->CommonCfg.CountryCode,\n\t\t\t\t\t\t\tTmpLen2+1,\t\tTmpFrame,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUCHAR\tTmpLen3 = TmpLen2+3;\n\t\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TmpLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&CountryIe,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&TmpLen3,\n\t\t\t\t\t\t\t\t3,\t\t\t\tpAd->CommonCfg.CountryCode,\n\t\t\t\t\t\t\t\tTmpLen2,\t\t\tTmpFrame,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t}\n\n\t\t*pFrameLen = *pFrameLen + TmpLen;\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertSupportChannelIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tif (pAd->StaCfg.TdlsInfo.TdlsChSwitchSupp)\n\t{\n\t\tULONG TempLen;\n\t\tUCHAR SupportChIe = IE_SUPP_CHANNELS;\n\t\tUCHAR FirstChannel = 1;\n\t\tUCHAR NumOfCh = 11;\n\t\tUCHAR Length = 2;\n\n\t\tif ((pAd->CommonCfg.PhyMode == PHY_11BG_MIXED) ||\n\t\t\t(pAd->CommonCfg.PhyMode == PHY_11B) ||\n\t\t\t(pAd->CommonCfg.PhyMode == PHY_11G) ||\n\t\t\t(pAd->CommonCfg.PhyMode == PHY_11BGN_MIXED))\n\t\t{\n\t\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&SupportChIe,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&NumOfCh,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + TempLen;\n\t\t}\n\t\telse if ((pAd->CommonCfg.PhyMode == PHY_11A) ||\n\t\t\t\t(pAd->CommonCfg.PhyMode == PHY_11AN_MIXED))\n\t\t{\n\t\t\tULONG TempLen1;\n\n\t\t\tFirstChannel = 36;\n\t\t\tNumOfCh = 8;\n\t\t\tLength = 4;\n\t\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen1,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&SupportChIe,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&NumOfCh,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + TempLen1;\n\n\t\t\tFirstChannel = 149;\n\t\t\tNumOfCh = 4;\n\t\t\tMakeOutgoingFrame((pFrameBuf + TempLen1),\t&TempLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&NumOfCh,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + TempLen;\n\t\t}\n\t\telse if ((pAd->CommonCfg.PhyMode == PHY_11BG_MIXED) ||\n\t\t\t\t(pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||\n\t\t\t\t(pAd->CommonCfg.PhyMode == PHY_11BGN_MIXED) ||\n\t\t\t\t(pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED))\n\t\t{\n\t\t\tULONG TempLen1, TempLen2;\n\t\t\tLength = 6;\n\n\t\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen1,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&SupportChIe,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t&NumOfCh,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + TempLen1;\n\n\t\t\tFirstChannel = 36;\n\t\t\tNumOfCh = 8;\n\t\t\tMakeOutgoingFrame((pFrameBuf + TempLen1),\t&TempLen2,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t&NumOfCh,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + TempLen2;\n\n\t\t\tFirstChannel = 149;\n\t\t\tNumOfCh = 4;\n\t\t\tMakeOutgoingFrame((pFrameBuf + TempLen1 + TempLen2),\t&TempLen,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t\t&FirstChannel,\n\t\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t\t&NumOfCh,\n\t\t\t\t\t\t\t\tEND_OF_ARGS);\n\t\t\t*pFrameLen = *pFrameLen + TempLen;\n\t\t}\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertExtRateIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\tif (pAd->StaActive.ExtRateLen != 0)\n\t{\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t\t\t&TempLen,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t&ExtRateIe,\n\t\t\t\t\t\t\t1,\t\t\t\t\t\t&pAd->StaActive.ExtRateLen,\n\t\t\t\t\t\t\tpAd->StaActive.ExtRateLen,\tpAd->StaActive.ExtRate,\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertQosCapIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\t/* if (WMODE_CAP_N(pAd->CommonCfg.PhyMode) || (pAd->CommonCfg.bWmmCapable)) */\n\tif (pAd->CommonCfg.bWmmCapable)\n\t{\n\t\tUCHAR QOS_CAP_IE = 46;\n\t\tUCHAR QOS_CAP_IE_LEN = 1;\n\t\tQBSS_STA_INFO_PARM QosInfo;\n\n\t\tNdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));\n\n\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable)\n\t\t{\n\t\t\tQosInfo.UAPSD_AC_BE = pAd->CommonCfg.TDLS_bAPSDAC_BE;\n\t\t\tQosInfo.UAPSD_AC_BK = pAd->CommonCfg.TDLS_bAPSDAC_BK;\n\t\t\tQosInfo.UAPSD_AC_VI = pAd->CommonCfg.TDLS_bAPSDAC_VI;\n\t\t\tQosInfo.UAPSD_AC_VO = pAd->CommonCfg.TDLS_bAPSDAC_VO;\n\t\t\tQosInfo.MaxSPLength = pAd->CommonCfg.TDLS_MaxSPLength;\n\t\t}\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&QOS_CAP_IE,\n\t\t\t\t\t\t1,\t\t\t\t&QOS_CAP_IE_LEN,\n\t\t\t\t\t\t1,\t\t\t\t&QosInfo,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertWMMIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tBOOLEAN\tbEnable)\n{\n\tULONG TempLen;\n\n\tif (pAd->CommonCfg.bWmmCapable)\n\t{\n\t\tQBSS_STA_INFO_PARM QosInfo;\n\t\tUCHAR WmeParmIe[8] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; \n\n\t\tNdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));\n\n\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable)\n\t\t{\n\t\t\tif (bEnable)\n\t\t\t{\n\t\t\t\tQosInfo.UAPSD_AC_BE = pAd->CommonCfg.TDLS_bAPSDAC_BE;\n\t\t\t\tQosInfo.UAPSD_AC_BK = pAd->CommonCfg.TDLS_bAPSDAC_BK;\n\t\t\t\tQosInfo.UAPSD_AC_VI = pAd->CommonCfg.TDLS_bAPSDAC_VI;\n\t\t\t\tQosInfo.UAPSD_AC_VO = pAd->CommonCfg.TDLS_bAPSDAC_VO;\n\t\t\t\tQosInfo.MaxSPLength = pAd->CommonCfg.TDLS_MaxSPLength;\n\t\t\t}\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls uapsd> UAPSD %d %d %d %d %d!\\n\",\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BE,\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BK,\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VI,\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VO,\n\t\t\t\t\tpAd->CommonCfg.TDLS_MaxSPLength));\n\t\t}\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t\t8,\t\t\t\tWmeParmIe,\n\t\t\t\t\t\t\t1,\t\t\t\t&QosInfo,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertEDCAParameterSetIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN PRT_802_11_TDLS\tpTDLS)\n{\n\tULONG TempLen;\n\n\tif ((WMODE_CAP_N(pAd->CommonCfg.PhyMode) || (pAd->CommonCfg.bWmmCapable)) && (pTDLS->bWmmCapable))\n\t{\n\t\tUSHORT\tidx;\n\n\t\t/* When the BSS is QoS capable, then the BSS QoS parameters shall be\n\t\t * used by the TDLS peer STAs on the AP's channel, and the values \n\t\t * indicated inside the TDLS Setup Confirm frame apply only for the \n\t\t * off-channel. The EDCA parameters for the off-channel should be \n\t\t * the same as those on the AP's channel when QoS is supported by the BSS, \n\t\t * because this may optimize the channel switching process.\n\t\t */\n\n\t\tUCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; \n\n\t\t/*  Reset EdcaParam */\n\t\tNdisZeroMemory(&pTDLS->EdcaParm, sizeof(EDCA_PARM));\n\t\t/* Enable EdcaParm used in non-QBSS. */\n\t\tpTDLS->EdcaParm.bValid = TRUE;\n\n\t\tpTDLS->EdcaParm.bQAck\t\t   = FALSE;\n\t\tpTDLS->EdcaParm.bQueueRequest   = FALSE;\n\t\tpTDLS->EdcaParm.bTxopRequest    = FALSE;\n\n\t\tWmeParmIe[2] =  ((UCHAR)pTDLS->EdcaParm.bQAck << 4) + \n\t\t\t\t\t\t((UCHAR)pTDLS->EdcaParm.bQueueRequest << 5) + \n\t\t\t\t\t\t((UCHAR)pTDLS->EdcaParm.bTxopRequest << 6);\n\n\t\tpTDLS->EdcaParm.EdcaUpdateCount = 1;\n\t\tWmeParmIe[8] = pTDLS->EdcaParm.EdcaUpdateCount & 0x0f;\n\n\t\tWmeParmIe[8] |= pTDLS->EdcaParm.bAPSDCapable << 7;\n\n\t\t/* By hardcoded */\n\t\tpTDLS->EdcaParm.Aifsn[0] = 3;\n\t\tpTDLS->EdcaParm.Aifsn[1] = 7;\n\t\tpTDLS->EdcaParm.Aifsn[2] = 2;\n\t\tpTDLS->EdcaParm.Aifsn[3] = 2;\n\n\t\tpTDLS->EdcaParm.Cwmin[0] = 4;\n\t\tpTDLS->EdcaParm.Cwmin[1] = 4;\n\t\tpTDLS->EdcaParm.Cwmin[2] = 3;\n\t\tpTDLS->EdcaParm.Cwmin[3] = 2;\n\n\t\tpTDLS->EdcaParm.Cwmax[0] = 10;\n\t\tpTDLS->EdcaParm.Cwmax[1] = 10;\n\t\tpTDLS->EdcaParm.Cwmax[2] = 4;\n\t\tpTDLS->EdcaParm.Cwmax[3] = 3;\n\n\t\tpTDLS->EdcaParm.Txop[0]  = 0;\n\t\tpTDLS->EdcaParm.Txop[1]  = 0;\n\t\tpTDLS->EdcaParm.Txop[2]  = 96;\n\t\tpTDLS->EdcaParm.Txop[3]  = 48;\n\n\t\tfor (idx=QID_AC_BE; idx<=QID_AC_VO; idx++)\n\t\t{\n\t\t\tWmeParmIe[10+ (idx*4)] = (idx << 5)\t\t\t\t\t\t\t\t+\t  /* b5-6 is ACI */\n\t\t\t\t\t\t\t\t   ((UCHAR)pTDLS->EdcaParm.bACM[idx] << 4) \t+\t  /* b4 is ACM */\n\t\t\t\t\t\t\t\t   (pTDLS->EdcaParm.Aifsn[idx] & 0x0f);\t\t\t  /* b0-3 is AIFSN */\n\t\t\tWmeParmIe[11+ (idx*4)] = (pTDLS->EdcaParm.Cwmax[idx] << 4)\t\t+\t  /* b5-8 is CWMAX */\n\t\t\t\t\t\t\t\t   (pTDLS->EdcaParm.Cwmin[idx] & 0x0f);\t\t\t  /* b0-3 is CWMIN */\n\t\t\tWmeParmIe[12+ (idx*4)] = (UCHAR)(pTDLS->EdcaParm.Txop[idx] & 0xff);\t  /* low byte of TXOP */\n\t\t\tWmeParmIe[13+ (idx*4)] = (UCHAR)(pTDLS->EdcaParm.Txop[idx] >> 8);\t  /* high byte of TXOP */\n\t\t}\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t  26,\t\t\t\tWmeParmIe,\n\t\t\t\t\t\t  END_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertWMMParameterIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tif ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) || (pAd->CommonCfg.bWmmCapable))\n\t{\n\t\tQBSS_STA_INFO_PARM QosInfo;\n\t\tULONG TempLen;\n\t\tUSHORT\tidx;\n\n\t\t/* When the BSS is QoS capable, then the BSS QoS parameters shall be\n\t\t * used by the TDLS peer STAs on the AP's channel, and the values \n\t\t * indicated inside the TDLS Setup Confirm frame apply only for the \n\t\t * off-channel. The EDCA parameters for the off-channel should be \n\t\t * the same as those on the AP's channel when QoS is supported by the BSS, \n\t\t * because this may optimize the channel switching process.\n\t\t */\n\n\t\tUCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; \n\n\n\t\tNdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM));\n\n\t\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable)\n\t\t{\n\n\t\t\tQosInfo.UAPSD_AC_BE = pAd->CommonCfg.TDLS_bAPSDAC_BE;\n\t\t\tQosInfo.UAPSD_AC_BK = pAd->CommonCfg.TDLS_bAPSDAC_BK;\n\t\t\tQosInfo.UAPSD_AC_VI = pAd->CommonCfg.TDLS_bAPSDAC_VI;\n\t\t\tQosInfo.UAPSD_AC_VO = pAd->CommonCfg.TDLS_bAPSDAC_VO;\n\t\t\tQosInfo.MaxSPLength = pAd->CommonCfg.TDLS_MaxSPLength;\n\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls uapsd> UAPSD %d %d %d %d %d!\\n\",\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BE,\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BK,\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VI,\n\t\t\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VO,\n\t\t\t\t\tpAd->CommonCfg.TDLS_MaxSPLength));\n\t\t}\n\n\t\tWmeParmIe[8] |= *(PUCHAR)&QosInfo;\n\n\t\tfor (idx=QID_AC_BE; idx<=QID_AC_VO; idx++)\n\t\t{\n\t\t\tWmeParmIe[10+ (idx*4)] = (idx << 5)\t\t\t\t\t\t\t\t+\t  // b5-6 is ACI\n\t\t\t\t\t\t\t\t   ((UCHAR)pAd->CommonCfg.APEdcaParm.bACM[idx] << 4) \t+\t  // b4 is ACM\n\t\t\t\t\t\t\t\t   (pAd->CommonCfg.APEdcaParm.Aifsn[idx] & 0x0f);\t\t\t  // b0-3 is AIFSN\n\t\t\tWmeParmIe[11+ (idx*4)] = (pAd->CommonCfg.APEdcaParm.Cwmax[idx] << 4)\t\t+\t  // b5-8 is CWMAX\n\t\t\t\t\t\t\t\t   (pAd->CommonCfg.APEdcaParm.Cwmin[idx] & 0x0f);\t\t\t  // b0-3 is CWMIN\n\t\t\tWmeParmIe[12+ (idx*4)] = (UCHAR)(pAd->CommonCfg.APEdcaParm.Txop[idx] & 0xff);\t  // low byte of TXOP\n\t\t\tWmeParmIe[13+ (idx*4)] = (UCHAR)(pAd->CommonCfg.APEdcaParm.Txop[idx] >> 8);\t  // high byte of TXOP\n\t\t}\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t\t26,\t\t\t\tWmeParmIe,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n\n#ifdef DOT11_N_SUPPORT\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertHtCapIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\tif (WMODE_CAP_N(pAd->CommonCfg.PhyMode))\n\t{\n\t\tUCHAR HtLen;\n\t\tHT_CAPABILITY_IE HtCapabilityTmp;\n\n\t\tHtLen = sizeof(HT_CAPABILITY_IE);\n#ifndef RT_BIG_ENDIAN\n\t\tNdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE));\n\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);\n\t\tHtCapabilityTmp.HtCapInfo.ChannelWidth = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\t\t\n\t\tMakeOutgoingFrame(pFrameBuf,\t&TempLen,\n\t\t\t\t\t\t\t1,\t\t\t&HtCapIe,\n\t\t\t\t\t\t\t1,\t\t\t&HtLen,\n\t\t\t\t\t\t\tHtLen,\t\t&HtCapabilityTmp, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n#else\n\t\tNdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE));\n\t\tNdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);\n\t\tHtCapabilityTmp.HtCapInfo.ChannelWidth = pAd->CommonCfg.RegTransmitSetting.field.BW;\n\n\t\t*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));\n\t\t*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t&TempLen,\n\t\t\t\t\t\t\t1,\t\t\t&HtCapIe,\n\t\t\t\t\t\t\t1,\t\t\t&HtLen,\n\t\t\t\t\t\t\tHtLen,\t\t&HtCapabilityTmp, \n\t\t\t\t\t\t\tEND_OF_ARGS);\n#endif\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n\n#ifdef DOT11N_DRAFT3\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\n/* 20/40 BSS Coexistence (7.3.2.61) */\nVOID\nTDLS_InsertBSSCoexistenceIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\n\t//if (pAd->CommonCfg.BACapability.field.b2040CoexistScanSup == 1)\n\t{\n\t\tUCHAR Length = 1;\n\t\tBSS_2040_COEXIST_IE BssCoexistence;\n\n\t\tmemset(&BssCoexistence, 0, sizeof(BSS_2040_COEXIST_IE));\n\t\tBssCoexistence.field.InfoReq = 1;\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t\t1,\t\t\t\t&BssCoexistIe,\n\t\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t\t1,\t\t\t\t&BssCoexistence.word,\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\t}\n\n\treturn;\n}\n#endif /* DOT11N_DRAFT3 */\n#endif /* DOT11_N_SUPPORT */\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertExtCapIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\tUCHAR Length = sizeof(EXT_CAP_INFO_ELEMENT);\n\tEXT_CAP_INFO_ELEMENT\textCapInfo;\n\n\tLength = sizeof(EXT_CAP_INFO_ELEMENT);\n\n\tNdisZeroMemory(&extCapInfo, Length);\n\t\t\t\n#ifdef DOT11N_DRAFT3\n\tif ((pAd->CommonCfg.bBssCoexEnable == TRUE) && \n\t\t(pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) &&\n\t\t(pAd->CommonCfg.Channel <= 14))\n\t{\n\t\t\textCapInfo.BssCoexistMgmtSupport = 1;\n\t}\n#endif // DOT11N_DRAFT3 //\n\n\tif (pAd->StaCfg.TdlsInfo.TdlsChSwitchSupp)\n\t\textCapInfo.TDLSChSwitchSupport = 1;\n\n\tif (pAd->StaCfg.UapsdInfo.bAPSDCapable)\n\t\textCapInfo.UAPSDBufSTASupport = 1;\n\n\textCapInfo.TDLSSupport = 1;\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t\t1,\t\t\t\t&ExtCapIe,\n\t\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\tsizeof(EXT_CAP_INFO_ELEMENT),\t&extCapInfo,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_InsertFTIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN UINT8 Length,\n\tIN FT_MIC_CTR_FIELD MICCtr,\n\tIN PUINT8 pMic,\n\tIN PUINT8 pANonce,\n\tIN PUINT8 pSNonce)\n{\n\tULONG TempLen;\n\tUINT16 MICCtrBuf;\n\tUCHAR FTIE = IE_FT_FTIE;\n\n\tMICCtrBuf = cpu2le16(MICCtr.word);\n\tMakeOutgoingFrame(\tpFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&FTIE,\n\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t2,\t\t\t\t(PUCHAR)&MICCtrBuf,\n\t\t\t\t\t\t16,\t\t\t\t(PUCHAR)pMic,\n\t\t\t\t\t\t32,\t\t\t\t(PUCHAR)pANonce,\n\t\t\t\t\t\t32,\t\t\t\t(PUCHAR)pSNonce,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID TDLS_InsertTimeoutIntervalIE(\n\tIN PRTMP_ADAPTER pAd,\n\tOUT PUCHAR pFrameBuf,\n\tOUT PULONG pFrameLen,\n\tIN FT_TIMEOUT_INTERVAL_TYPE Type,\n\tIN UINT32 TimeOutValue)\n{\n\tULONG TempLen;\n\tUINT8 Length;\n\tUINT8 TimeOutIntervalIE;\n\tUINT8 TimeoutType;\n\tUINT32 TimeoutValueBuf;\n\n\tLength = 5;\n\tTimeOutIntervalIE = IE_FT_TIMEOUT_INTERVAL;\n\tTimeoutType = Type;\n\tTimeoutValueBuf = cpu2le32(TimeOutValue);\n\n\tMakeOutgoingFrame(\tpFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&TimeOutIntervalIE,\n\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t1,\t\t\t\t(PUCHAR)&TimeoutType,\n\t\t\t\t\t\t4,\t\t\t\t(PUCHAR)&TimeoutValueBuf,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertTargetChannel(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tTargetCh)\n{\n\tULONG TempLen;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&TargetCh,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertRegulatoryClass(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUINT8\tTargetCh,\n\tIN\tUINT8\tChWidth)\n{\n\tULONG TempLen;\n\tUCHAR regclass;\n\tUCHAR BandWidth = 0;\n\n\tif (ChWidth != 0)\n\t\tBandWidth = 1;\n\n\tregclass = TDLS_GetRegulatoryClass(pAd, BandWidth, TargetCh);\n\n\t\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t\t1,\t\t\t\t&regclass,\n\t\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_InsertSecondaryChOffsetIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUCHAR\tOffset)\n{\n\tULONG TempLen;\n\tUCHAR length = 1;\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&NewExtChanIe,\n\t\t\t\t\t\t1,\t\t\t\t&length,\n\t\t\t\t\t\t1,\t\t\t\t&Offset,\t\t\t\t\t\t\t\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n\nVOID\nTDLS_InsertChannelSwitchTimingIE(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen,\n\tIN\tUSHORT\tSwitchTime,\n\tIN\tUSHORT\tSwitchTimeOut)\n{\n\tULONG TempLen;\n\tUCHAR TDLS_IE = IE_TDLS_CHANNEL_SWITCH_TIMING;\n\tUCHAR TDLS_IE_LEN = 4;\n\tUINT16\tSwitchTimeBuf = cpu2le16(SwitchTime);\n\tUINT16\tSwitchTimeOutBuf = cpu2le16(SwitchTimeOut); \n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&TDLS_IE,\n\t\t\t\t\t\t1,\t\t\t\t&TDLS_IE_LEN,\n\t\t\t\t\t\t2,\t\t\t\t&SwitchTimeBuf,\n\t\t\t\t\t\t2,\t\t\t\t&SwitchTimeOutBuf,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n\n/*\n==========================================================================\n\tDescription:\n\t    \n\tIRQL = PASSIVE_LEVEL\n==========================================================================\n*/\nVOID\nTDLS_SupportedRegulatoryClasses(\n\tIN\tPRTMP_ADAPTER pAd,\n\tOUT\tPUCHAR\tpFrameBuf,\n\tOUT\tPULONG\tpFrameLen)\n{\n\tULONG TempLen;\n\tUCHAR TDLS_IE = IE_SUPP_REG_CLASS;\n\t//UCHAR Length = 6;\n\t//UCHAR SuppClassesList[] = {1,2,3,32,33};\n\tUCHAR Length = 16;\n\tUCHAR SuppClassesList[] = {1, 2, 3, 4, 12, 22, 23, 24, 25, 27, 28, 29, 30, 32, 33};\n\tUCHAR regclass;\n\n\tregclass = TDLS_GetRegulatoryClass(pAd, pAd->CommonCfg.RegTransmitSetting.field.BW, pAd->CommonCfg.Channel);\n\n\tMakeOutgoingFrame(pFrameBuf,\t\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&TDLS_IE,\n\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t1,\t\t\t\t&regclass,\n\t\t\t\t\t\t15,\t\t\t\tSuppClassesList,\t\t\t\t\t\t\t\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n\n\treturn;\n}\n\n#ifdef UAPSD_SUPPORT\nVOID TDLS_InsertPuBufferStatus(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tOUT PUCHAR\t\t\t\t\t\tpFrameBuf,\n\tOUT PULONG\t\t\t\t\t\tpFrameLen,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tULONG TempLen;\n\tUINT8 Length;\n\tUINT8 IeIdPuBufferStatus;\n\tUINT8 PuBufferStatus;\n\tUINT8 FlgIsAnyPktForBK, FlgIsAnyPktForBE;\n\tUINT8 FlgIsAnyPktForVI, FlgIsAnyPktForVO;\n\n\n\t/* get pEntry */\n\tpMacEntry = MacTableLookup(pAd, pPeerMac);\n\n\tif (pMacEntry == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls_cmd> ERROR! No such peer in %s!\\n\",\n\t\t\t\t__FUNCTION__));\n\t\treturn;\n\t}\n\n\t/* init */\n\tLength = 1;\n\tIeIdPuBufferStatus = IE_TDLS_PU_BUFFER_STATUS;\n\tPuBufferStatus = 0;\n\n\t/* get queue status */\n\tUAPSD_QueueStatusGet(pAd, pMacEntry,\n\t\t\t\t\t\t&FlgIsAnyPktForBK, &FlgIsAnyPktForBE,\n\t\t\t\t\t\t&FlgIsAnyPktForVI, &FlgIsAnyPktForVO);\n\tPuBufferStatus |= (FlgIsAnyPktForBK == TRUE)? 0x01: 0x00;\n\tPuBufferStatus |= (FlgIsAnyPktForBE == TRUE)? 0x02: 0x00;\n\tPuBufferStatus |= (FlgIsAnyPktForVI == TRUE)? 0x04: 0x00;\n\tPuBufferStatus |= (FlgIsAnyPktForVO == TRUE)? 0x08: 0x00;\n\n\t/* init element */\n\tMakeOutgoingFrame(\tpFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&IeIdPuBufferStatus,\n\t\t\t\t\t\t1,\t\t\t\t&Length,\n\t\t\t\t\t\t1,\t\t\t\t&PuBufferStatus,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\t*pFrameLen = *pFrameLen + TempLen;\n}\n#endif /* UAPSD_SUPPORT */\n#endif /* DOT11Z_TDLS_SUPPORT */\n\n"
  },
  {
    "path": "src/sta/tdls_uapsd.c",
    "content": "/****************************************************************************\n * Ralink Tech Inc.\n * Taiwan, R.O.C.\n *\n * (c) Copyright 2010, Ralink Technology, Inc.\n *\n * All rights reserved. Ralink's source code is an unpublished work and the\n * use of a copyright notice does not imply otherwise. This source code\n * contains confidential trade secret material of Ralink Tech. Any attemp\n * or participation in deciphering, decoding, reverse engineering or in any\n * way altering the source code is stricitly prohibited, unless the prior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************/\n\n/****************************************************************************\n\n    Abstract:\n\n\tAll related TDLS UAPSD functions.\n\n***************************************************************************/\n\n\n#ifdef UAPSD_SUPPORT\n\n#define MODULE_TDLS_UAPSD\n#include \"rt_config.h\"\n\n/* receive a traffic indication frame */\nstatic VOID TDLS_UAPSD_PeerTrafficIndAction(\n    IN\tPRTMP_ADAPTER\t\t\t\tpAd,\n    IN\tMLME_QUEUE_ELEM\t\t\t\t*pElem);\n/* receive a traffic response frame */\nstatic VOID TDLS_UAPSD_PeerTrafficRspAction(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n    IN\tMLME_QUEUE_ELEM\t\t\t\t*pElem);\n\n/* build the traffic indication frame */\nstatic ULONG TDLS_UAPSD_TrafficIndBuild(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac,\n\tOUT UCHAR\t\t\t\t\t\t*pFrameBuf,\n\tOUT UCHAR\t\t\t\t\t\t*pHeader802_3);\n/* build the traffic indication frame payload */\nstatic VOID TDLS_UAPSD_TrafficIndPayloadBuild(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tOUT PUCHAR\t\t\t\t\t\tpFrameBuf,\n\tOUT PULONG\t\t\t\t\t\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\t\t\t\tpTDLS);\n\n/* send a traffic indication frame */\nstatic NDIS_STATUS TDLS_UAPSD_TrafficIndSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac);\n/* send a traffic response frame */\nstatic NDIS_STATUS TDLS_UAPSD_TrafficRspSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac,\n\tIN\tUCHAR\t\t\t\t\t\tPeerToken);\n/* build the traffic response frame body */\nstatic VOID TDLS_UAPSD_TrafficRspBuild(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tOUT PUCHAR\t\t\t\t\t\tpFrameBuf,\n\tOUT PULONG\t\t\t\t\t\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\t\t\t\tpTDLS,\n\tIN\tUCHAR\t\t\t\t\t\tPeerToken);\n\n/* get argument number value */\nstatic UINT32 TDLS_UAPSD_CmdUtilHexGet(\n\tIN\tCHAR\t\t\t\t\t\t**ppArgv);\n/* get argument number value */\nstatic UINT32 TDLS_UAPSD_CmdUtilNumGet(\n\tIN\tCHAR\t\t\t\t\t\t**ppArgv);\n/* get argument MAC value */\nstatic VOID TDLS_UAPSD_CmdUtilMacGet(\n\tIN\tCHAR\t\t\t\t\t\t**ppArgv,\n\tIN\tUCHAR\t\t\t\t\t\t*pDevMac);\n\n/* simulate to send a TDLS Setup request to a peer */\nstatic VOID TDLS_UAPSD_CmdSimSetupReqSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv);\n\n/* simulate to receive a TDLS Traffic response from a peer */\nstatic VOID TDLS_UAPSD_CmdSimTrafficRspRcv(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv);\n\n/* simulate to receive a TDLS Traffic indication from a peer */\nstatic VOID TDLS_UAPSD_CmdSimTrafficIndRcv(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv);\n\n/* simulate to change the power save of a peer */\nstatic VOID TDLS_UAPSD_CmdSimPeerPowerSaveChg(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv);\n\n/* simulate to change our power save */\nstatic VOID TDLS_UAPSD_CmdSimSelfPowerSaveChg(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv);\n\n/* simulate to send a TDLS Traffic response to a peer */\nstatic VOID TDLS_UAPSD_CmdSimTrafficRspSnd(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv);\n\n\n\n\n/* public functions */\n/*\n========================================================================\nRoutine Description:\n\tInitialze TDLS UAPSD function.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpFSM\t\t\t- TDLS Finite State Machine\n\nReturn Value:\n\tTRUE\t\t\t- init ok\n\tFALSE\t\t\t- init fail\n\nNote:\n\tPeer U-APSD Sleep STA is default feature in spec.\n\tPeer U-APSD Buffer STA is optional feature in spec.\n========================================================================\n*/\nBOOLEAN TDLS_UAPSDP_Init(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n    IN\tSTATE_MACHINE\t\t\t\t*pFSM)\n{\n\t/* init FSM */\n    StateMachineSetAction(pFSM, TDLS_IDLE, MT2_PEER_TDLS_TRAFFIC_IND,\n\t\t\t\t\t\t(STATE_MACHINE_FUNC)TDLS_UAPSD_PeerTrafficIndAction);\n    StateMachineSetAction(pFSM, TDLS_IDLE, MT2_PEER_TDLS_TRAFFIC_RSP,\n\t\t\t\t\t\t(STATE_MACHINE_FUNC)TDLS_UAPSD_PeerTrafficRspAction);\n\n\t/* init lock */\n\tNdisAllocateSpinLock(pAd, &pAd->StaCfg.TdlsInfo.TDLSUapsdLock);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> initialization ok!\\n\"));\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tRelease TDLS UAPSD function.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tTRUE\t\t\t- release ok\n\tFALSE\t\t\t- release fail\n\nNote:\n========================================================================\n*/\nBOOLEAN TDLS_UAPSDP_Release(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd)\n{\n\t/* free lock */\n\tNdisFreeSpinLock(&pAd->StaCfg.TdlsInfo.TDLSUapsdLock);\n\n\treturn TRUE;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSend a traffic indication frame.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpPeerMac\t\t- the peer MAC\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\nNote:\n\t11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA\n\n\tA PU buffer STA shall transmit a unicast TDLS Peer Traffic\n\tIndication frame to a PU sleep STA, through the AP, if and only if\n\tall of the following conditions are met:\n\n\t-- A frame with an RA corresponding to a PU sleep STA was placed\n\t\tinto a buffer at the PU buffer STA;\n\t-- The buffer into which the frame was placed contained no other\n\t\tframes with the same RA; and\n\t-- One or more periods of dot11TDLSPeerUAPSDIndicationWindow\n\t\tbeacon intervals have expired after the last service period.\n========================================================================\n*/\nNDIS_STATUS TDLS_UAPSDP_TrafficIndSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac)\n{\n\tNDIS_STATUS\tNStatus;\n\n\n\tTDLS_SEMLOCK(pAd);\n\tNStatus = TDLS_UAPSD_TrafficIndSend(pAd, pPeerMac);\n\tTDLS_SEMUNLOCK(pAd);\n\n\treturn NStatus;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if ASIC can go to sleep mode.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\nReturn Value:\n\tNone\n\nNote:\n\tCheck all TDLS entries and return TRUE if all SPs are closed.\n========================================================================\n*/\nBOOLEAN TDLS_UAPSDP_AsicCanSleep(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd)\n{\n\tRT_802_11_TDLS *pTDLS;\n\tUINT32 IdEntry;\n\tBOOLEAN FlgAllSpClosed = TRUE;\n\n\n\tTDLS_SEMLOCK(pAd);\n\n\t/* check if all SPs are closed */\n\tfor(IdEntry=0; IdEntry<MAX_NUM_OF_TDLS_ENTRY; IdEntry++)\n\t{\n\t\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[IdEntry];\n\n\t\tif ((pTDLS->Valid == TRUE) &&\n\t\t\t(pTDLS->Status == TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\tUINT32 Wcid = pTDLS->MacTabMatchWCID;\n\t\t\tPMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[Wcid];\n\n\n\t\t\tif (!IS_ENTRY_TDLS(pEntry))\n\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\tTwo cases we can not sleep:\n\t\t\t\t1. One of any SP is not ended.\n\t\t\t\t2. A traffic indication is sent and no response is received.\n\t\t\t*/\n\t\t\tif ((pEntry->bAPSDFlagSPStart != 0) ||\n\t\t\t\t(pTDLS->FlgIsWaitingUapsdTraRsp == TRUE))\n\t\t\t{\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t\t(\"tdls uapsd> SP not close or Ind sent (%d %d)!\\n\",\n\t\t\t\t\t\tpEntry->bAPSDFlagSPStart,\n\t\t\t\t\t\tpTDLS->FlgIsWaitingUapsdTraRsp));\n\t\t\t\thex_dump(\"pEntry=\", pEntry->Addr, 6);\n\t\t\t\tFlgAllSpClosed = FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tTDLS_SEMUNLOCK(pAd);\n\n\treturn FlgAllSpClosed;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tCheck if ASIC can go to sleep mode.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tPsmOld\t\t\t- Current power save mode\n\tPsmNew\t\t\t- New power save mode\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nVOID TDLS_UAPSDP_PsmModeChange(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUSHORT\t\t\t\t\t\tPsmOld,\n\tIN\tUSHORT\t\t\t\t\t\tPsmNew)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tRT_802_11_TDLS *pTDLS;\n\tUINT32 IdTdls;\n\n\n\tif (PsmOld == PsmNew)\n\t\treturn; /* no inform needs */\n\n\t/* sanity check */\n    /* WPA 802.1x secured port control */\n    if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || \n         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||\n         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || \n         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)\n#ifdef WPA_SUPPLICANT_SUPPORT\n\t\t\t  || (pAd->StaCfg.IEEE8021X == TRUE)\t\t\n#endif \t\t\n#ifdef WAPI_SUPPORT\n\t\t  || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAICERT)\n\t\t  || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWAIPSK)\n#endif /* WAPI_SUPPORT */\n        ) &&\n       (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) \n\t{\n\t\treturn; /* port not yet secure */\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> our PSM mode change!\\n\"));\n\n\t/* indicate the peer */\n\tTDLS_SEMLOCK(pAd);\n\n\tfor(IdTdls=0; IdTdls<MAX_NUM_OF_TDLS_ENTRY; IdTdls++)\n\t{\n\t\tpTDLS = (RT_802_11_TDLS *) &pAd->StaCfg.TdlsInfo.TDLSEntry[IdTdls];\n\n\t\tif ((pTDLS->Valid) && (pTDLS->Status == TDLS_MODE_CONNECTED))\n\t\t{\n\t\t\t/* get MAC Entry */\n\t\t\tpMacEntry = MacTableLookup(pAd, pTDLS->MacAddr);\n\t\t\tif (pMacEntry == NULL)\n\t\t\t\tcontinue; /* check next one */\n\n\t\t\t/* check if the peer is in ACTIVE mode */\n\t\t\tif (TDLS_UAPSD_ARE_PEER_IN_ACTIVE(pMacEntry))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tpMacEntry->RssiSample.LastRssi0 is used to check if\n\t\t\t\t\twe have ever received any packet from the peer.\n\t\t\t\t*/\n\t\t\t\t/* send a null frame to the peer directly */\n\t\t\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> send a NULL frame!\\n\"));\n\n\t\t\t\tRtmpEnqueueNullFrame(pAd, pMacEntry->Addr,\n\t\t\t\t\t\t\t\t\tpAd->CommonCfg.TxRate, pMacEntry->Aid,\n\t\t\t\t\t\t\t\t\tpMacEntry->apidx, TRUE, FALSE, 0);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t\tSend traffic indication frame to the peer when the peer\n\t\t\t\tis in power-save mode.\n\t\t\t*/\n\t\t\tTDLS_UAPSD_TrafficIndSend(pAd, pMacEntry->Addr);\n\t\t}\n\t}\n\n\tTDLS_SEMUNLOCK(pAd);\n}\n\n\n\n\n/* private functions */\n/*\n========================================================================\nRoutine Description:\n\tDisplay the UAPSD information for a peer.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=01_[PEER MAC]\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdPeerInfoDisplay(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tUCHAR PeerMac[6];\n\tUINT32 IdAcNum;\n\n\n\t/* get MAC address */\n\tTDLS_UAPSD_CmdUtilMacGet(&pArgv, PeerMac);\n\n\t/* get pEntry */\n\tpMacEntry = MacTableLookup(pAd, PeerMac);\n\n\tif (pMacEntry == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls_cmd> ERROR! No such peer!\\n\"));\n\t\treturn;\n\t}\n\n\t/* display UAPSD information */\n\tif (TDLS_UAPSD_ARE_PEER_IN_PS(pMacEntry))\n\t\tprintk(\"\\n    EDCA AC UAPSD information: (POWER SAVE)\\n\");\n\telse\n\t\tprintk(\"\\n    EDCA AC UAPSD information: (ACTIVE)\\n\");\n\t/* End of if */\n\n\tif (pMacEntry->MaxSPLength != 0)\n\t{\n\t\tprintk(\"    Max SP Length: %d (%d frames)\\n\",\n\t\t\t\tpMacEntry->MaxSPLength, pMacEntry->MaxSPLength<<1);\n\t}\n\telse\n\t\tprintk(\"    Max SP Length: 0 (all frames)\\n\");\n\t/* End of if */\n\n\tprintk(\"    UAPSD/AC   AC0    AC1    AC2    AC3\");\n\tprintk(\"\\n    Tr/De      \");\n\n\tfor(IdAcNum=0; IdAcNum<4; IdAcNum++)\n\t{\n\t\tprintk(\"%d/%d    \",\n\t\t\t\tpMacEntry->bAPSDCapablePerAC[IdAcNum],\n\t\t\t\tpMacEntry->bAPSDDeliverEnabledPerAC[IdAcNum]);\n\t} /* End of for */\n\n\tprintk(\"\\n\");\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tDisplay our UAPSD information.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=02\n\n\t2. 11.2.1.14 Peer U-APSD\n\t\tA STA that configured Peer U-APSD at a TDLS peer STA enters power save\n\t\tmode on a TDLS direct link after the successful transmission to the\n\t\tTDLS peer STA over the direct link of an acknowledged MPDU with the\n\t\tPower Management field set to one.\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSelfInfoDisplay(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tif (TDLS_UAPSD_ARE_WE_IN_PS(pAd))\n\t\tprintk(\"\\n    EDCA AC UAPSD information: (POWER SAVE)\\n\");\n\telse\n\t\tprintk(\"\\n    EDCA AC UAPSD information: (ACTIVE)\\n\");\n\t/* End of if */\n\n\tif (pAd->CommonCfg.MaxSPLength != 0)\n\t{\n\t\tprintk(\"    Max SP Length: %d (%d frames)\\n\",\n\t\t\t\tpAd->CommonCfg.MaxSPLength, pAd->CommonCfg.MaxSPLength<<1);\n\t}\n\telse\n\t\tprintk(\"    Max SP Length: 0 (all frames)\\n\");\n\t/* End of if */\n\n\tprintk(\"      AP UAPSD/AC   AC0    AC1    AC2    AC3\");\n\n\tprintk(\"\\n         Tr/De      %d/%d    %d/%d    %d/%d    %d/%d\\n\\n\",\n\t\t\tpAd->CommonCfg.bACMAPSDTr[0],\n\t\t\tpAd->CommonCfg.bAPSDAC_BE,\n\t\t\tpAd->CommonCfg.bACMAPSDTr[1],\n\t\t\tpAd->CommonCfg.bAPSDAC_BK,\n\t\t\tpAd->CommonCfg.bACMAPSDTr[2],\n\t\t\tpAd->CommonCfg.bAPSDAC_VI,\n\t\t\tpAd->CommonCfg.bACMAPSDTr[3],\n\t\t\tpAd->CommonCfg.bAPSDAC_VO);\n\n\tprintk(\"    TDLS UAPSD/AC   AC0    AC1    AC2    AC3\");\n\n\tprintk(\"\\n         Tr/De      %d/%d    %d/%d    %d/%d    %d/%d\\n\",\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BE,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BE,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BK,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BK,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VI,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VI,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VO,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VO);\n\n\tprintk(\"\\n\");\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tConfigure our UAPSD information.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=03_1_1_1_1_0\n\n\t\t[UAPSD for BE] [UAPSD for BK] [UAPSD for VI] [UAPSD for VO]\n\t\t[Max SP length]\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdConfigure(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tpAd->CommonCfg.TDLS_bAPSDAC_BE = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\tpAd->CommonCfg.TDLS_bAPSDAC_BK = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\tpAd->CommonCfg.TDLS_bAPSDAC_VI = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\tpAd->CommonCfg.TDLS_bAPSDAC_VO = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\tpAd->CommonCfg.TDLS_MaxSPLength = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\n\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t(\"tdls_cmd> configure our UAPSD to %d %d %d %d %d\\n\",\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BE,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_BK,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VI,\n\t\t\tpAd->CommonCfg.TDLS_bAPSDAC_VO,\n\t\t\tpAd->CommonCfg.TDLS_MaxSPLength));\n}\n\n\n\n\n#define TDLS_UAPSD_PEER_SHOW\t\t\t01 /* tdls uapsd peer display */\n#define TDLS_UAPSD_SELF_SHOW\t\t\t02 /* tdls uapsd self display */\n#define TDLS_UAPSD_CONFIG\t\t\t\t03 /* tdls uapsd configure */\n\n#ifdef TDLS_UAPSD_DEBUG\n#define TDLS_UAPSD_SIM_SETUP_REQ\t\t51 /* tdls setup request */\n#define TDLS_UAPSD_SIM_TRAFFIC_RSP_RCV\t52 /* tdls traffic rsp receive */\n#define TDLS_UAPSD_SIM_TRAFFIC_IND_RCV\t53 /* tdls traffic ind receive */\n#define TDLS_UAPSD_SIM_PEER_PS\t\t\t54 /* tdls peer ps mode change */\n#define TDLS_UAPSD_SIM_PS\t\t\t\t55 /* tdls ps mode change */\n#define TDLS_UAPSD_SIM_TRAFFIC_RSP_SND\t56 /* tdls traffic rsp send */\n#define TDLS_UAPSD_SIM_BEACON_LOST\t\t57 /* tdls beacon lost */\n#endif /* TDLS_UAPSD_DEBUG */\n\n/*\n========================================================================\nRoutine Description:\n\tTest command.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpArgvIn\t\t\t- the data flow information\n\nReturn Value:\n\t0\t\t\t\t- OK\n\tothers\t\t\t- FAIL\n========================================================================\n*/\nINT TDLS_Ioctl(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tPSTRING\t\t\t\t\t\tpArgvIn)\n{\n\tCHAR BufCmd[3] = { 0, 0, 0 };\n\tCHAR *pArgv, *pParam;\n\tUINT32 Command;\n\tINT32 Argc;\n\n\n\t/* init */\n\tpArgv = (CHAR *)pArgvIn;\n\n\t/* get command type */\n\t/* command format is iwpriv ra0 set tdls=[cmd id]_[arg1]_......_[argn] */\n\tNdisCopyMemory(BufCmd, pArgv, 2);\n\tCommand = simple_strtol((PSTRING)BufCmd, 0, 10);\n\tpArgv += 2; /* skip command field */\n\n\t/* get Argc number */\n\tArgc = 0;\n\tpParam = pArgv;\n\n\twhile(1)\n\t{\n\t\tif (*pParam == '_')\n\t\t\tArgc ++;\n\t\t/* End of if */\n\n\t\tif ((*pParam == 0x00) || (Argc > 20))\n\t\t\tbreak;\n\t\t/* End of if */\n\n\t\tpParam++;\n\t} /* End of while */\n\n\tpArgv++; /* skip _ points to arg1 */\n\n\t/* handle the command */\n\tswitch(Command)\n\t{\n\t\tcase TDLS_UAPSD_PEER_SHOW: /* display peer uapsd info */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> display peer UAPSD information\\n\"));\n\t\t\tTDLS_UAPSD_CmdPeerInfoDisplay(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SELF_SHOW: /* display self uapsd info */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> display self UAPSD information\\n\"));\n\t\t\tTDLS_UAPSD_CmdSelfInfoDisplay(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_CONFIG: /* tdls uapsd configure */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> configure our UAPSD\\n\"));\n\t\t\tTDLS_UAPSD_CmdConfigure(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n#ifdef TDLS_UAPSD_DEBUG\n\t\tcase TDLS_UAPSD_SIM_SETUP_REQ: /* tdls setup request */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate to send a setup request\\n\"));\n\t\t\tTDLS_UAPSD_CmdSimSetupReqSend(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SIM_TRAFFIC_RSP_RCV: /* tdls traffic response */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate to receive a traffic response\\n\"));\n\t\t\tTDLS_UAPSD_CmdSimTrafficRspRcv(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SIM_TRAFFIC_IND_RCV: /* tdls traffic indication */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate to receive a traffic indication\\n\"));\n\t\t\tTDLS_UAPSD_CmdSimTrafficIndRcv(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SIM_PEER_PS: /* tdls peer power save */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate to change the peer power save\\n\"));\n\t\t\tTDLS_UAPSD_CmdSimPeerPowerSaveChg(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SIM_PS: /* tdls power save */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate to change our power save\\n\"));\n\t\t\tTDLS_UAPSD_CmdSimSelfPowerSaveChg(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SIM_TRAFFIC_RSP_SND: /* tdls traffic response */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate to send traffic response\\n\"));\n\t\t\tTDLS_UAPSD_CmdSimTrafficRspSnd(pAd, Argc, pArgv);\n\t\t\tbreak;\n\n\t\tcase TDLS_UAPSD_SIM_BEACON_LOST: /* tdls beacon lost */\n\t\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t\t(\"tdls_cmd> simulate the beacon lost case\\n\"));\n\t\t\tpAd->Mlme.ChannelQuality = 0;\n\n\t\t\tif (pAd->StaCfg.bAutoConnectByBssid)\n\t\t\t   pAd->StaCfg.bAutoConnectByBssid = FALSE;\n\n\t\t\tpAd->MlmeAux.CurrReqIsFromNdis = FALSE;\n\n\t\t\t/* Lost AP, send disconnect & link down event*/\n\t\t\tLinkDown(pAd, FALSE);\n\t\t\tbreak;\n#endif /* TDLS_UAPSD_DEBUG */\n\n\t\tdefault: /* error command type */\n\t\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls_cmd> ERROR! No such command!\\n\"));\n\t\t\treturn -EINVAL; /* input error */\n\t} /* End of switch */\n\n\treturn 0; /* ok */\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSet our UAPSD.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpArgvIn\t\t\t- the data flow information\n\nReturn Value:\n\t0\t\t\t\t- OK\n\tothers\t\t\t- FAIL\n========================================================================\n*/\nINT Set_TdlsUapsdProc(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tPSTRING\t\t\t\t\t\tpArgvIn)\n{\n\treturn TDLS_Ioctl(pAd, pArgvIn);\n}\n\n\n\n\n/* private function */\n/*\n========================================================================\nRoutine Description:\n\tBuild the traffic indication frame.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpPeerMac\t\t- the peer\n\tpFrameBuf\t\t- frame\n\tpHeader802_3\t- frame header\n\nReturn Value:\n\tFrame Length\n\nNote:\n========================================================================\n*/\nstatic ULONG TDLS_UAPSD_TrafficIndBuild(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac,\n\tOUT UCHAR\t\t\t\t\t\t*pFrameBuf,\n\tOUT UCHAR\t\t\t\t\t\t*pHeader802_3)\n{\n\tRT_802_11_TDLS *pTDLS = NULL;\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tULONG\tFrameLen = 0;\n\tINT32\tLinkId;\n\tBOOLEAN TimerCancelled;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s\\n\", __FUNCTION__));\n\n\t/* search TDLS entry */\n\tLinkId = TDLS_SearchLinkId(pAd, pPeerMac);\n\tif (TDLS_UAPSD_IS_LINK_INVALID(LinkId))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"%s: can not find the LinkId!\\n\", __FUNCTION__));\n\t\tTDLS_UAPSD_REBUILD_LINK(pAd, pPeerMac);\n\t\tgoto LabelExit;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> LinkId = %d\\n\", LinkId));\n\n\tpTDLS = TDLS_UAPSD_ENTRY_GET(pAd, LinkId);\n\n\t/* sanity check */\n\tif (TDLS_UAPSD_IS_CONN_NOT_BUILT(pTDLS))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> link is not yet built \"\n\t\t\t\t\"so we can not send a traffic ind to the peer!!!\"));\n\t\tgoto LabelExit;\n\t}\n\n\tif (pTDLS->FlgIsWaitingUapsdTraRsp == TRUE)\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> traffic ind was sent before!\\n\"));\n\t\tgoto LabelExit; /* has sent it */\n\t}\n\n\tpTDLS->FlgIsWaitingUapsdTraRsp = TRUE;\n\n\t/* init packet header */\n\tMAKE_802_3_HEADER(pHeader802_3, pTDLS->MacAddr,\n\t\t\t\t\t\tpAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t/* build the frame */\n\tTDLS_UAPSD_TrafficIndPayloadBuild(pAd, pFrameBuf, &FrameLen, pTDLS);\n\n\thex_dump(\"TDLS UAPSD Peer Traffic Ind sending packet\", pFrameBuf, FrameLen);\n\t/*\n\t\t11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA\n\t\tWhen no corresponding TDLS Peer Traffic Response frame has been\n\t\treceived within dot11TDLSResponseTimeout after sending a TDLS Peer\n\t\tTraffic Indication frame, the STA shall tear down the direct link.\n\n\t\tThe default value is 5 seconds.\n\t*/\n\t/* set traffic indication timer */\n\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\tRTMPSetTimer(&pTDLS->Timer, TDLS_TIMEOUT);\n\n\t/* free resources */\nLabelExit:\n\treturn FrameLen;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tBuild the traffic indication frame payload.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpFrameBuf\t\t- frame\n\tpFrameLen\t\t- frame length\n\tpTDLS\t\t\t- TDLS link entry\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_TrafficIndPayloadBuild(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tOUT PUCHAR\t\t\t\t\t\tpFrameBuf,\n\tOUT PULONG\t\t\t\t\t\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\t\t\t\tpTDLS)\n{\n\tUCHAR RemoteFrameType = PROTO_NAME_TDLS;\n\tULONG TempLen;\n\tUCHAR Token;\t\t\t// Dialog token\n\n\n\t/* fill remote frame type */\n\tMakeOutgoingFrame(pFrameBuf,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\t*pFrameLen = TempLen;\n\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION);\n\n\t/* fill Dialog Token */\n\tTDLS_UAPSD_DIALOG_GET(pAd, Token);\n\tTDLS_InsertDialogToken(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\tToken);\n\n\t/* fill link identifier */\n\tif (pTDLS->bInitiator)\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\t\t\tpTDLS->MacAddr, pAd->CurrentAddress);\n\telse\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\t\t\tpAd->CurrentAddress, pTDLS->MacAddr);\n\n\t/* fill PU buffer status */\n\tTDLS_InsertPuBufferStatus(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\tpTDLS->MacAddr);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSend a traffic indication frame.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpPeerMac\t\t- the peer MAC\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\nNote:\n\t11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA\n\n\tA PU buffer STA shall transmit a unicast TDLS Peer Traffic\n\tIndication frame to a PU sleep STA, through the AP, if and only if\n\tall of the following conditions are met:\n\n\t-- A frame with an RA corresponding to a PU sleep STA was placed\n\t\tinto a buffer at the PU buffer STA;\n\t-- The buffer into which the frame was placed contained no other\n\t\tframes with the same RA; and\n\t-- One or more periods of dot11TDLSPeerUAPSDIndicationWindow\n\t\tbeacon intervals have expired after the last service period.\n========================================================================\n*/\nstatic NDIS_STATUS TDLS_UAPSD_TrafficIndSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac)\n{\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0;\n\tUCHAR Header802_3[14];\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_FAILURE;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s\\n\", __FUNCTION__));\n\n\t/* allocate resources */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\n\t\tgoto LabelExit;\n\n\tFrameLen = TDLS_UAPSD_TrafficIndBuild(pAd, pPeerMac,\n\t\t\t\t\t\t\t\t\t\tpOutBuffer, Header802_3);\n\tif (FrameLen <= 0)\n\t\tgoto LabelExit;\n\n\t/*\n\t\tKeep ACTIVE and do not enter sleep mode until all EOSPs are sent\n\t\tand we will wake up our ASIC in STAHardTransmit() of\n\t\tTDLS_UAPSD_PKT_SEND_THROUGH_AP() if we are sleep.\n\t*/\n\tASIC_PS_CAN_NOT_SLEEP(pAd);\n\n\t/* send the frame to the peer with AP's help */\n\tTDLS_UAPSD_PKT_SEND_THROUGH_AP(pAd, Header802_3, pOutBuffer, FrameLen);\n/*\thex_dump(\"TDLS traffic indication send pack\", pOutBuffer, FrameLen); */\n\n\tNStatus = NDIS_STATUS_SUCCESS;\n\n\t/* free resources */\nLabelExit:\n\tif (pOutBuffer != NULL)\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\treturn NStatus;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSend a traffic response frame.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpTDLS\t\t\t- the peer entry\n\nReturn Value:\n\tNDIS_STATUS_SUCCESS\n\tNDIS_STATUS_FAILURE\n\nNote:\n========================================================================\n*/\nstatic NDIS_STATUS TDLS_UAPSD_TrafficRspSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tUCHAR\t\t\t\t\t\t*pPeerMac,\n\tIN\tUCHAR\t\t\t\t\t\tPeerToken)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry; \n\tRT_802_11_TDLS *pTDLS = NULL;\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tINT32\tLinkId;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_FAILURE;\n\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"====> %s\\n\", __FUNCTION__));\n\n\t/* search TDLS entry */\n\tLinkId = TDLS_SearchLinkId(pAd, pPeerMac);\n\tif (TDLS_UAPSD_IS_LINK_INVALID(LinkId))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"%s: can not find the LinkId!\\n\", __FUNCTION__));\n\t\tTDLS_UAPSD_REBUILD_LINK(pAd, pPeerMac);\n\t\tgoto LabelExit;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> LinkId = %d\\n\", LinkId));\n\n\tpTDLS = TDLS_UAPSD_ENTRY_GET(pAd, LinkId);\n\n\t/* sanity check */\n\tif (TDLS_UAPSD_IS_CONN_NOT_BUILT(pTDLS))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> link is not yet built \"\n\t\t\t\t\"so we can not send a traffic ind to the peer!!!\"));\n\t\tgoto LabelExit;\n\t}\n\n\t/* init */\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr,\n\t\t\t\t\t\tpAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\t/* allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\n\t\tgoto LabelExit;\n\n\t/* build the frame */\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\tFrameLen = FrameLen + TempLen;\n\n\tTDLS_UAPSD_TrafficRspBuild(pAd, pOutBuffer, &FrameLen, pTDLS, PeerToken);\n\n\thex_dump(\"TDLS UAPSD Peer Traffic Response sending packet\", pOutBuffer, FrameLen);\n\n\t/* need to set the power save mode of the peer to ACTIVE */\n\t/* we will recover its mode after EOSP frame is received */\n\tpMacEntry = MacTableLookup(pAd, pTDLS->MacAddr);\n\tif (pMacEntry == NULL)\n\t\tgoto LabelExit;\n\n\t/* peer can not sleep for a while */\n\t\tRTMP_PS_VIRTUAL_WAKEUP_PEER(pMacEntry);\n\n\t/* send the frame to the peer without AP's help */\n\tTDLS_UAPSD_PKT_SEND_TO_PEER(pAd, Header802_3, pOutBuffer, FrameLen, pTDLS);\n/*\thex_dump(\"TDLS traffic response send pack\", pOutBuffer, FrameLen); */\n\n\tNStatus = NDIS_STATUS_SUCCESS;\n\n\t/* free resources */\nLabelExit:\n\tif (pOutBuffer != NULL)\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\treturn NStatus;\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tBuild the traffic response frame body.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpFrameBuf\t\t- frame\n\tpFrameLen\t\t- frame length\n\tpTDLS\t\t\t- TDLS link entry\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_TrafficRspBuild(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tOUT PUCHAR\t\t\t\t\t\tpFrameBuf,\n\tOUT PULONG\t\t\t\t\t\tpFrameLen,\n\tIN\tPRT_802_11_TDLS\t\t\t\tpTDLS,\n\tIN\tUCHAR\t\t\t\t\t\tPeerToken)\n{\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE);\n\n\t/* fill Dialog Token */\n\tTDLS_InsertDialogToken(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\tPeerToken);\n\n\t/* fill link identifier */\n\tif (pTDLS->bInitiator)\n\t{\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\t\t\tpTDLS->MacAddr, pAd->CurrentAddress);\n\t}\n\telse\n\t{\n\t\tTDLS_InsertLinkIdentifierIE(pAd, (pFrameBuf + *pFrameLen), pFrameLen,\n\t\t\t\t\t\t\t\t\tpAd->CurrentAddress, pTDLS->MacAddr);\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tReceive a traffic indication frame.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpElem\t\t\t- the frame information\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_PeerTrafficIndAction(\n    IN\tPRTMP_ADAPTER\t\t\t\tpAd,\n    IN\tMLME_QUEUE_ELEM\t\t\t\t*pElem)\n{\n\tUCHAR Token;\n\tUCHAR PeerAddr[6];\n\tUCHAR PeerAddr1[6];\n\tULONG OffsetPuBuff;\n\tINT LinkId = 0xff;\n\tPRT_802_11_TDLS\tpTDLS = NULL;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)pElem->Msg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> ====> %s\\n\", __FUNCTION__));\n\n\t/* Not TDLS Capable, ignore it */\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\treturn;\n\n\t/* Not BSS mode, ignore it */\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\thex_dump(\"TDLS UAPSD Peer Traffic Ind receive pack\", pElem->Msg, pElem->MsgLen);\n\n\t/* sanity check */\n\tif (TDLS_UAPSD_ARE_WE_IN_ACTIVE(pAd))\n\t\treturn; /* we are not in power-save mode */\n\n\tCOPY_MAC_ADDR(PeerAddr, &pFrame->Hdr.Addr3);\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (LinkId == -1 || LinkId == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,(\"TDLS - TDLS_UAPSD_PeerTrafficIndAction() can not find the LinkId!\\n\"));\n\t\treturn;\n\t}\n\n\t// Point to the current Link ID\n\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\tOffsetPuBuff = PeerTdlsBasicSanity(pAd,\n\t\t\t\t\t\t\t\t\tpElem->Msg,\n\t\t\t\t\t\t\t\t\tpElem->MsgLen,\n\t\t\t\t\t\t\t\t\tpTDLS->bInitiator,\n\t\t\t\t\t\t\t\t\t&Token,\n\t\t\t\t\t\t\t\t\tPeerAddr1);\n\tif (OffsetPuBuff <= 0)\n\t\treturn;\n\n/*\thex_dump(\"PeerAddr=\", PeerAddr, 6); */\n\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls uapsd> PU Buffer Status = 0x%x\\n\",\n\t\t\tpElem->Msg[OffsetPuBuff+2])); /* 2: skip ID and length field */\n\n\t/* reply a response frame with UP = 5 */\n\t/* for TDLS UAPSD, all AC will be UAPSD mode */\n\tTDLS_UAPSD_TrafficRspSend(pAd, PeerAddr, Token);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tReceive a traffic response frame.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tpElem\t\t\t- the frame information\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_PeerTrafficRspAction(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n    IN\tMLME_QUEUE_ELEM\t\t\t\t*pElem)\n{\n\tUCHAR Token;\n\tUCHAR PeerAddr[6];\n\tUCHAR PeerAddr1[6];\n\tRT_802_11_TDLS *pTDLS;\n\tINT32 LinkId = 0xff;\n\tBOOLEAN TimerCancelled;\n\tPFRAME_802_11 pFrame = (PFRAME_802_11)pElem->Msg;\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> ====> %s\\n\", __FUNCTION__));\n\n\t/* Not TDLS Capable, ignore it */\n\tif (!IS_TDLS_SUPPORT(pAd))\n\t\treturn;\n\t\n\t/* Not BSS mode, ignore it */\n\tif (!INFRA_ON(pAd))\n\t\treturn;\n\n\thex_dump(\"TDLS UAPSD Peer Traffic Response receive pack\", pElem->Msg, pElem->MsgLen);\n\n\tCOPY_MAC_ADDR(PeerAddr, &pFrame->Hdr.Addr2);\n\t// Drop not within my TDLS Table that created before !\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (TDLS_UAPSD_IS_LINK_INVALID(LinkId))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"%s: can not find the LinkId!\\n\", __FUNCTION__));\n\t\treturn;\n\t}\n\n\t// Point to the current Link ID\n\tpTDLS = (PRT_802_11_TDLS)&pAd->StaCfg.TdlsInfo.TDLSEntry[LinkId];\n\n\t/* sanity check */\n\tPeerTdlsBasicSanity(pAd,\n\t\t\t\t\t\tpElem->Msg,\n\t\t\t\t\t\tpElem->MsgLen,\n\t\t\t\t\t\tpTDLS->bInitiator,\n\t\t\t\t\t\t&Token,\n\t\t\t\t\t\tPeerAddr1);\n\n/*\thex_dump(\"PeerAddr=\", PeerAddr, 6); */\n\n\t/* search TDLS entry */\n\tLinkId = TDLS_SearchLinkId(pAd, PeerAddr);\n\tif (TDLS_UAPSD_IS_LINK_INVALID(LinkId))\n\t{\n\t\tDBGPRINT(RT_DEBUG_TRACE,\n\t\t\t\t(\"%s: can not find the LinkId!\\n\", __FUNCTION__));\n\t\tTDLS_UAPSD_REBUILD_LINK(pAd, PeerAddr);\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls uapsd> LinkId = %d\\n\", LinkId));\n\n\t/* cancel waiting flag to avoid tear down the link */\n\tpTDLS = TDLS_UAPSD_ENTRY_GET(pAd, LinkId);\n\tpTDLS->FlgIsWaitingUapsdTraRsp = FALSE;\n\tRTMPCancelTimer(&pTDLS->Timer, &TimerCancelled);\n\n\t/* check if we can sleep if we are sleep mode */\n\tRtmpAsicSleepHandle(pAd);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet argument number value.\n\nArguments:\n\t**ppArgv\t\t\t- input parameters\n\nReturn Value:\n\tdecimal number\n\nNote:\n\tOnly for one hex byte.\n========================================================================\n*/\nstatic UINT32 TDLS_UAPSD_CmdUtilHexGet(\n\tIN\tCHAR\t\t\t\t\t\t**ppArgv)\n{\n\tCHAR Buf[3], *pNum;\n\tUINT32 ID;\n\tUCHAR Value;\n\n\n\tpNum = (*ppArgv);\n\n\tBuf[0] = 0x30;\n\tBuf[1] = 0x30;\n\tBuf[2] = 0;\n\n\tfor(ID=0; ID<sizeof(Buf)-1; ID++)\n\t{\n\t\tif ((*pNum == '_') || (*pNum == 0x00))\n\t\t\tbreak;\n\t\t/* End of if */\n\n\t\tpNum ++;\n\t} /* End of for */\n\n\tif (ID == 0)\n\t\treturn 0; /* argument length is too small */\n\t/* End of if */\n\n\tif (ID >= 2)\n\t\tmemcpy(Buf, (*ppArgv), 2);\n\telse\n\t\tBuf[1] = (**ppArgv);\n\t/* End of if */\n\n\t(*ppArgv) += ID;\n\tif ((**ppArgv) == '_')\n\t\t(*ppArgv) ++; /* skip _ */\n\t/* End of if */\n\n\tAtoH(Buf, &Value, 1);\n\treturn (UINT32)Value;\n} /* End of TDLS_UAPSD_CmdUtilHexGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet argument number value.\n\nArguments:\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tdecimal number\n\nNote:\n========================================================================\n*/\nstatic UINT32 TDLS_UAPSD_CmdUtilNumGet(\n\tIN\tCHAR\t\t\t\t\t\t**ppArgv)\n{\n\tCHAR Buf[20], *pNum;\n\tUINT32 ID;\n\n\n\tpNum = (*ppArgv);\n\n\tfor(ID=0; ID<sizeof(Buf)-1; ID++)\n\t{\n\t\tif ((*pNum == '_') || (*pNum == 0x00))\n\t\t\tbreak;\n\t\t/* End of if */\n\n\t\tpNum ++;\n\t} /* End of for */\n\n\tif (ID == sizeof(Buf)-1)\n\t\treturn 0; /* argument length is too large */\n\t/* End of if */\n\n\tmemcpy(Buf, (*ppArgv), ID);\n\tBuf[ID] = 0x00;\n\n\t*ppArgv += ID+1; /* skip _ */\n\n\treturn simple_strtol((PSTRING)Buf, 0, 10);\n} /* End of TDLS_UAPSD_CmdUtilNumGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tGet argument MAC value.\n\nArguments:\n\t**ppArgv\t\t\t- input parameters\n\t*pDevMac\t\t\t- MAC address\n\nReturn Value:\n\tNone\n\nNote:\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdUtilMacGet(\n\tIN\tCHAR\t\t\t\t\t\t**ppArgv,\n\tIN\tUCHAR\t\t\t\t\t\t*pDevMac)\n{\n\tCHAR Buf[3];\n\tCHAR *pMAC = (CHAR *)(*ppArgv);\n\tUINT32 ID;\n\n\n\tif ((pMAC[0] == '0') && (pMAC[1] == '_'))\n\t{\n\t\t*ppArgv = (&pMAC[2]);\n\t\treturn;\n\t} /* End of if */\n\n\tNdisZeroMemory(pDevMac, 6);\n\n\t/* must exist 18 octets */\n\tfor(ID=0; ID<18; ID+=2)\n\t{\n\t\tif ((pMAC[ID] == '_') || (pMAC[ID] == 0x00))\n\t\t{\n\t\t\t*ppArgv = (&pMAC[ID]+1);\n\t\t\treturn;\n\t\t} /* End of if */\n\t} /* End of for */\n\n\t/* get mac */\n\tfor(ID=0; ID<18; ID+=3)\n\t{\n\t\tBuf[0] = pMAC[0];\n\t\tBuf[1] = pMAC[1];\n\t\tBuf[2] = 0x00;\n\n\t\tAtoH(Buf, pDevMac, 1);\n\t\tpMAC += 3;\n\t\tpDevMac ++;\n\t} /* End of for */\n\n\t*ppArgv += 17+1; /* skip _ */\n} /* End of TDLS_UAPSD_CmdUtilMacGet */\n\n\n/*\n========================================================================\nRoutine Description:\n\tSimulate to send a TDLS Setup request to a peer.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=51_[PEER MAC]\n\n\t11.21.4 TDLS direct-link establishment\n\tTDLS Setup Request frames, TDLS Setup Response frames, and TDLS Setup\n\tConfirm frames shall be transmitted through the AP and shall not be\n\ttransmitted to a group address.\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSimSetupReqSend(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tMLME_QUEUE_ELEM *pElem;\n\tRT_802_11_TDLS TDLS, *pTDLS = &TDLS;\n\tUCHAR\tTDLS_ETHERTYPE[] = {0x89, 0x0d};\n\tUCHAR\tHeader802_3[14];\n\tPUCHAR\tpOutBuffer = NULL;\n\tULONG\tFrameLen = 0;\n\tULONG\tTempLen;\n\tUCHAR\tRemoteFrameType = PROTO_NAME_TDLS;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR PeerMac[6];\n\tUINT32 IdTdls;\n\n\n\t/* get MAC address */\n\tTDLS_UAPSD_CmdUtilMacGet(&pArgv, PeerMac);\n\n\t/* allocate buffer for transmitting message */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\t\n\t\treturn;\n\n\tos_alloc_mem(NULL, (UCHAR **)&pElem, sizeof(MLME_QUEUE_ELEM));\n\tif (pElem == NULL)\n\t{\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\treturn;\n\t}\n\n\t/* init link entry */\n\tNdisZeroMemory(pTDLS, sizeof(RT_802_11_TDLS));\n\tpTDLS->TimeOut = 0;\n\tCOPY_MAC_ADDR(pTDLS->MacAddr, PeerMac);\n\tpTDLS->Valid = 1;\n\n\t/* search a empty entry */\n\tfor(IdTdls=0; IdTdls<MAX_NUM_OF_TDLS_ENTRY; IdTdls++)\n\t{\n\t\tif (!pAd->StaCfg.TdlsInfo.TDLSEntry[IdTdls].Valid)\n\t\t{\n\t\t\tNdisMoveMemory(&pAd->StaCfg.TdlsInfo.TDLSEntry[IdTdls],\n\t\t\t\t\t\t\tpTDLS, sizeof(RT_802_11_TDLS_UI));\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (IdTdls == MAX_NUM_OF_TDLS_ENTRY)\n\t{\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n\t\tos_free_mem(NULL, pElem);\n\t\treturn;\n\t}\n\n\t/* init request frame */\n\tMAKE_802_3_HEADER(Header802_3, pTDLS->MacAddr,\n\t\t\t\t\t\tpAd->CurrentAddress, TDLS_ETHERTYPE);\n\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\n\tFrameLen = FrameLen + TempLen;\n\tTDLS_BuildSetupRequest(pAd, pOutBuffer, &FrameLen,\n\t\t\t\t\t\t\tTDLS_UAPSD_ENTRY_GET(pAd, IdTdls));\n\thex_dump(\"Request=\", pOutBuffer, FrameLen);\n\n\tTDLS_UAPSD_PKT_SEND_THROUGH_AP(pAd, Header802_3, pOutBuffer, FrameLen);\n\n\t/* init response frame */\n\tFrameLen += LENGTH_802_11 + LENGTH_802_1_H;\n\tpElem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + FrameLen;\n\n\t/* copy payload type, category, action (3B) */\n\tmemcpy(pElem->Msg + LENGTH_802_11 + LENGTH_802_1_H,\n\t\t\tpOutBuffer, 3);\n\t/* status code = 0x00 00 (2B) */\n\t*(USHORT *)(pElem->Msg + LENGTH_802_11 + LENGTH_802_1_H + 3) = 0x00;\n\n\t/* copy others */\n\tmemcpy(pElem->Msg + LENGTH_802_11 + LENGTH_802_1_H + 3 + 2,\n\t\t\tpOutBuffer + 3, FrameLen - 3);\n\n\t/* handle response frame */\n\tTDLS_PeerSetupRspAction(pAd, pElem);\n\n\t/* free memory */\n\tMlmeFreeMemory(pAd, pOutBuffer);\n\tos_free_mem(NULL, pElem);\n} /* End of TDLS_UAPSD_CmdSimSetupReqSend */\n\n\n/*\n========================================================================\nRoutine Description:\n\tSimulate to receive a TDLS Traffic response from a peer.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=52_[PEER MAC]\n\n\t2. In the actual case, the traffic response frame will be handled in\n\t\tSTAHandleRxDataFrame() because the traffic response frame is a\n\t\tDATA frame, not management action frame.\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSimTrafficRspRcv(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tUCHAR PeerMac[6];\n\tRT_802_11_TDLS *pTDLS = NULL;\n\tINT32 LinkId;\n\n\n\t/* get MAC address */\n\tTDLS_UAPSD_CmdUtilMacGet(&pArgv, PeerMac);\n\n\t/* get pEntry */\n\tpMacEntry = MacTableLookup(pAd, PeerMac);\n\n\tif (pMacEntry == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls_cmd> ERROR! No such peer!\\n\"));\n\t\treturn;\n\t}\n\n\t/* search TDLS entry */\n\tLinkId = TDLS_SearchLinkId(pAd, PeerMac);\n\tif (TDLS_UAPSD_IS_LINK_INVALID(LinkId))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t(\"%s: can not find the LinkId!\\n\", __FUNCTION__));\n\t\tTDLS_UAPSD_REBUILD_LINK(pAd, PeerMac);\n\t\treturn;\n\t}\n\n\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls uapsd> LinkId = %d\\n\", LinkId));\n\n\t/* cancel waiting flag to avoid tear down the link */\n\tpTDLS = TDLS_UAPSD_ENTRY_GET(pAd, LinkId);\n\tpTDLS->FlgIsWaitingUapsdTraRsp = FALSE;\n\n\t/* handle UAPSD SP */\n\t/*\n\t\tTDLS uses Ethertype 89-0d frames, as defined in Annex U.\n\t\tThe TDLS payload contains a TDLS Action frame body as is specified\n\t\tin 7.4.11. The UP shall be AC_VI, unless otherwise specified.\n\n\t\tSo these TDLS action frames are DATA frame, not management frame.\n\t*/\n\tUAPSD_TriggerFrameHandle(pAd, pMacEntry, 5);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSimulate to receive a TDLS Traffic indication from a peer.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=53_[PEER MAC]\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSimTrafficIndRcv(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tUCHAR PeerMac[6];\n\tMLME_QUEUE_ELEM *pElem = NULL;\n\tPUCHAR pOutBuffer = NULL;\n\tULONG FrameLen = 0;\n\tINT32 LinkId;\n\tRT_802_11_TDLS *pTDLS = NULL;\n\tNDIS_STATUS\tNStatus = NDIS_STATUS_SUCCESS;\n\tUCHAR RemoteFrameType = PROTO_NAME_TDLS;\n\tULONG TempLen;\n\tUCHAR Token;\t\t\t// Dialog token\n\n\n\t/* get MAC address */\n\tTDLS_UAPSD_CmdUtilMacGet(&pArgv, PeerMac);\n\n\t/* allocate resources */\n\tNStatus = MlmeAllocateMemory(pAd, &pOutBuffer);\n\tif (NStatus\t!= NDIS_STATUS_SUCCESS)\n\t\tgoto LabelExit;\n\n\t/* make up a virtual traffic indication frame */\n\t/* search TDLS entry */\n\tLinkId = TDLS_SearchLinkId(pAd, PeerMac);\n\tif (TDLS_UAPSD_IS_LINK_INVALID(LinkId))\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR,\n\t\t\t\t(\"%s: can not find the LinkId!\\n\", __FUNCTION__));\n\t\tTDLS_UAPSD_REBUILD_LINK(pAd, PeerMac);\n\t\tgoto LabelExit;\n\t}\n\tpTDLS = TDLS_UAPSD_ENTRY_GET(pAd, LinkId);\n\n\t/* build the frame */\n\t/* fill remote frame type */\n\tMakeOutgoingFrame(pOutBuffer,\t\t&TempLen,\n\t\t\t\t\t\t1,\t\t\t\t&RemoteFrameType,\n\t\t\t\t\t\tEND_OF_ARGS);\n\tFrameLen = TempLen;\n\n\t/* fill action code */\n\tTDLS_InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen,\n\t\t\t\t\t\tCATEGORY_TDLS, TDLS_ACTION_CODE_SETUP_REQUEST);\n\n\t/* fill Dialog Token */\n\tTDLS_UAPSD_DIALOG_GET(pAd, Token);\n\tTDLS_InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen,\n\t\t\t\t\t\t\tToken);\n\n\t/* fill link identifier */\n\tTDLS_InsertLinkIdentifierIE(pAd, (pOutBuffer + FrameLen), &FrameLen,\n\t\t\t\t\t\t\t\tpTDLS->MacAddr, pAd->CurrentAddress);\n\n\t/* fill PU buffer status */\n\tTDLS_InsertPuBufferStatus(pAd, (pOutBuffer + FrameLen), &FrameLen,\n\t\t\t\t\t\t\tpTDLS->MacAddr);\n\n\tif (FrameLen <= 0)\n\t\tgoto LabelExit;\n\n/*\thex_dump(\"TDLS traffic indication send pack\", pOutBuffer, FrameLen); */\n\n\t/* allocate resources */\n\tos_alloc_mem(NULL, (UCHAR **)&pElem, sizeof(MLME_QUEUE_ELEM));\n\tif (pElem == NULL)\n\t\tgoto LabelExit;\n\n\t/* copy the indication frame */\n\tFrameLen += LENGTH_802_11 + LENGTH_802_1_H;\n\tpElem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + FrameLen;\n\n\t/* copy payload */\n\tmemcpy(pElem->Msg + LENGTH_802_11 + LENGTH_802_1_H,\n\t\t\tpOutBuffer, FrameLen);\n\n\t/* handle it */\n\tTDLS_UAPSD_PeerTrafficIndAction(pAd, pElem);\n\n\t/* free resources */\nLabelExit:\n\tif (pElem != NULL)\n\t\tos_free_mem(NULL, pElem);\n\tif (pOutBuffer != NULL)\n\t\tMlmeFreeMemory(pAd, pOutBuffer);\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSimulate to change the power save of a peer.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=54_[PEER MAC]_[0/1]\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSimPeerPowerSaveChg(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tUCHAR PeerMac[6];\n\tUINT32 PeerPsMode;\n\n\n\t/* get MAC address */\n\tTDLS_UAPSD_CmdUtilMacGet(&pArgv, PeerMac);\n\n\t/* get pEntry */\n\tpMacEntry = MacTableLookup(pAd, PeerMac);\n\n\tif (pMacEntry == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls_cmd> ERROR! No such peer!\\n\"));\n\t\treturn;\n\t}\n\n\t/* change mode */\n\tPeerPsMode = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\n\tif (PeerPsMode != 0)\n\t{\n\t\tpMacEntry->PsMode = PWR_ACTIVE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls_cmd> Change to ACTIVE!\\n\"));\n\t}\n\telse\n\t{\n\t\tpMacEntry->PsMode = PWR_SAVE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls_cmd> Change to POWER SAVE!\\n\"));\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSimulate to change our power save.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=55_[0/1]\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSimSelfPowerSaveChg(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tUINT32 PeerPsMode;\n\n\n\tPeerPsMode = TDLS_UAPSD_CmdUtilNumGet(&pArgv);\n\n\tif (PeerPsMode != 0)\n\t{\n\t\tpAd->StaCfg.Psm = PWR_ACTIVE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls_cmd> Change to ACTIVE!\\n\"));\n\t}\n\telse\n\t{\n\t\tpAd->StaCfg.Psm = PWR_SAVE;\n\t\tDBGPRINT(RT_DEBUG_TRACE, (\"tdls_cmd> Change to POWER SAVE!\\n\"));\n\t}\n}\n\n\n/*\n========================================================================\nRoutine Description:\n\tSimulate to send a TDLS Traffic response to a peer.\n\nArguments:\n\tpAd\t\t\t\t- WLAN control block pointer\n\tArgc\t\t\t- the number of input parameters\n\t*pArgv\t\t\t- input parameters\n\nReturn Value:\n\tNone\n\nNote:\n\t1. Command Format:\n\t\tiwpriv ra0 set tdls=56_[PEER MAC]\n========================================================================\n*/\nstatic VOID TDLS_UAPSD_CmdSimTrafficRspSnd(\n\tIN\tPRTMP_ADAPTER\t\t\t\tpAd,\n\tIN\tINT32\t\t\t\t\t\tArgc,\n\tIN\tCHAR\t\t\t\t\t\t*pArgv)\n{\n\tMAC_TABLE_ENTRY\t*pMacEntry;\n\tUCHAR PeerMac[6];\n\tUCHAR Token = 0;\n\n\n\t/* get MAC address */\n\tTDLS_UAPSD_CmdUtilMacGet(&pArgv, PeerMac);\n\n\t/* get pEntry */\n\tpMacEntry = MacTableLookup(pAd, PeerMac);\n\n\tif (pMacEntry == NULL)\n\t{\n\t\tDBGPRINT(RT_DEBUG_ERROR, (\"tdls_cmd> ERROR! No such peer!\\n\"));\n\t\treturn;\n\t}\n\n\t/* send reponse */\n\tTDLS_UAPSD_TrafficRspSend(pAd, PeerMac, Token);\n}\n\n#endif /* UAPSD_SUPPORT */\n\n/* End of tdls_uapsd.c */\n"
  },
  {
    "path": "src/sta/wpa.c",
    "content": "/*\n ***************************************************************************\n * Ralink Tech Inc.\n * 4F, No. 2 Technology\t5th\tRd.\n * Science-based Industrial\tPark\n * Hsin-chu, Taiwan, R.O.C.\n *\n * (c) Copyright 2002-2004, Ralink Technology, Inc.\n *\n * All rights reserved.\tRalink's source\tcode is\tan unpublished work\tand\tthe\n * use of a\tcopyright notice does not imply\totherwise. This\tsource code\n * contains\tconfidential trade secret material of Ralink Tech. Any attemp\n * or participation\tin deciphering,\tdecoding, reverse engineering or in\tany\n * way altering\tthe\tsource code\tis stricitly prohibited, unless\tthe\tprior\n * written consent of Ralink Technology, Inc. is obtained.\n ***************************************************************************\n\n\tModule Name:\n\twpa.c\n\n\tAbstract:\n\n\tRevision History:\n\tWho\t\t\tWhen\t\t\tWhat\n\t--------\t----------\t\t----------------------------------------------\n\tJan\tLee\t\t03-07-22\t\tInitial\n\tPaul Lin\t03-11-28\t\tModify for supplicant\n*/\n#include \"rt_config.h\"\n\nvoid inc_byte_array(UCHAR *counter, int len);\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tProcess MIC error indication and record MIC error timer.\n\t\t\n\tArguments:\n\t\tpAd \tPointer to our adapter\n\t\tpWpaKey \t\tPointer to the WPA key structure\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\n\t========================================================================\n*/\nVOID\tRTMPReportMicError(\n\tIN\tPRTMP_ADAPTER\tpAd, \n\tIN\tPCIPHER_KEY \tpWpaKey)\n{\n\tULONG\tNow;\n    UCHAR   unicastKey = (pWpaKey->Type == PAIRWISE_KEY ? 1:0);\n\n\t/* Record Last MIC error time and count */\n\tNdisGetSystemUpTime(&Now);\n\tif (pAd->StaCfg.MicErrCnt == 0)\n\t{\n\t\tpAd->StaCfg.MicErrCnt++;\n\t\tpAd->StaCfg.LastMicErrorTime = Now;\n        NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);        \n\t}\n\telse if (pAd->StaCfg.MicErrCnt == 1)\n\t{\n\t\tif ((pAd->StaCfg.LastMicErrorTime + (60 * OS_HZ)) < Now)\n\t\t{\n\t\t\t/* Update Last MIC error time, this did not violate two MIC errors within 60 seconds */\n\t\t\tpAd->StaCfg.LastMicErrorTime = Now; \t\t\n\t\t}\n\t\telse\n\t\t{\n\n\t\t\t\tRTMPSendWirelessEvent(pAd, IW_COUNTER_MEASURES_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); \n\n\t\t\tpAd->StaCfg.LastMicErrorTime = Now; \t\t\n\t\t\t/* Violate MIC error counts, MIC countermeasures kicks in */\n\t\t\tpAd->StaCfg.MicErrCnt++;\n\t\t\t/*\n\t\t\t We shall block all reception\n\t\t\t We shall clean all Tx ring and disassoicate from AP after next EAPOL frame\n\t\t\t \n\t\t\t No necessary to clean all Tx ring, on RTMPHardTransmit will stop sending non-802.1X EAPOL packets\n\t\t\t if pAd->StaCfg.MicErrCnt greater than 2.\n\t\t\t*/\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* MIC error count >= 2 */\n\t\t/* This should not happen */\n\t\t;\n\t}\n    MlmeEnqueue(pAd, \n\t\t\t\tMLME_CNTL_STATE_MACHINE,\n\t\t\t\tOID_802_11_MIC_FAILURE_REPORT_FRAME,\n\t\t\t\t1,\n\t\t\t\t&unicastKey, 0);\n\n    if (pAd->StaCfg.MicErrCnt == 2)\n    {\n        RTMPSetTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, 100);\n    }\n}\n\n\n#ifdef WPA_SUPPLICANT_SUPPORT\n#define\tLENGTH_EAP_H    4\n/* If the received frame is EAP-Packet ,find out its EAP-Code (Request(0x01), Response(0x02), Success(0x03), Failure(0x04)). */\nINT\t    WpaCheckEapCode(\n\tIN  PRTMP_ADAPTER   \t\tpAd,\n\tIN  PUCHAR\t\t\t\tpFrame,\n\tIN  USHORT\t\t\t\tFrameLen,\n\tIN  USHORT\t\t\t\tOffSet)\n{\n\t\n\tPUCHAR\tpData;\n\tINT\tresult = 0;\n\t\t\n\tif( FrameLen < OffSet + LENGTH_EAPOL_H + LENGTH_EAP_H ) \n\t\treturn result;\n\t\t\n\tpData = pFrame + OffSet;\t\t/* skip offset bytes */\n \t\n\tif(*(pData+1) == EAPPacket) \t/* 802.1x header - Packet Type */\n\t{\n\t\t result = *(pData+4);\t\t/* EAP header - Code */\n\t}\n\n\treturn result;\n}\n\n#endif /* WPA_SUPPLICANT_SUPPORT */\n\nVOID\tWpaMicFailureReportFrame(\n\tIN  PRTMP_ADAPTER   pAd,\n\tIN MLME_QUEUE_ELEM *Elem)\n{\n\tPUCHAR              pOutBuffer = NULL;\n\tUCHAR               Header802_3[14];\n\tULONG               FrameLen = 0;\n\tUCHAR\t\t\t\t*mpool;\n\tPEAPOL_PACKET       pPacket;\n\tUCHAR               Mic[16];\n    BOOLEAN             bUnicast;\n        \n\tDBGPRINT(RT_DEBUG_TRACE, (\"WpaMicFailureReportFrame ----->\\n\"));\n\n    bUnicast = (Elem->Msg[0] == 1 ? TRUE:FALSE);\n\tpAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);\n\n\t/* init 802.3 header and Fill Packet */\n\tMAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL);\t\n\n\t/* Allocate memory for output */\n\tos_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER);\n\tif (mpool == NULL)\n    {\n        DBGPRINT(RT_DEBUG_ERROR, (\"!!!%s : no memory!!!\\n\", __FUNCTION__));\n        return;\n    }\n\n\tpPacket = (PEAPOL_PACKET)mpool;\n\tNdisZeroMemory(pPacket, TX_EAPOL_BUFFER);\n\t\n\tpPacket->ProVer\t= EAPOL_VER;\n\tpPacket->ProType\t= EAPOLKey;\n\t\n\tpPacket->KeyDesc.Type = WPA1_KEY_DESC;\n\n    /* Request field presented */\n    pPacket->KeyDesc.KeyInfo.Request = 1;\n    \n\tif(pAd->StaCfg.WepStatus  == Ndis802_11Encryption3Enabled)\n\t{\n\t\tpPacket->KeyDesc.KeyInfo.KeyDescVer = 2;\n\t} \n\telse\t  /* TKIP */\n\t{\n\t\tpPacket->KeyDesc.KeyInfo.KeyDescVer = 1;\n\t}\n\n    pPacket->KeyDesc.KeyInfo.KeyType = (bUnicast ? PAIRWISEKEY : GROUPKEY);\n\n\t/* KeyMic field presented */\n\tpPacket->KeyDesc.KeyInfo.KeyMic  = 1;\n\n    /* Error field presented */\n\tpPacket->KeyDesc.KeyInfo.Error  = 1;\n    \n\t/* Update packet length after decide Key data payload */\n\tSET_UINT16_TO_ARRARY(pPacket->Body_Len, MIN_LEN_OF_EAPOL_KEY_MSG)\n\n\t/* Key Replay Count */\n\tNdisMoveMemory(pPacket->KeyDesc.ReplayCounter, pAd->StaCfg.ReplayCounter, LEN_KEY_DESC_REPLAY);\n    inc_byte_array(pAd->StaCfg.ReplayCounter, 8);\n\n\t/* Convert to little-endian format. */\n\t*((USHORT *)&pPacket->KeyDesc.KeyInfo) = cpu2le16(*((USHORT *)&pPacket->KeyDesc.KeyInfo));\n\n\n\tMlmeAllocateMemory(pAd, (PUCHAR *)&pOutBuffer);  /* allocate memory */\n\tif(pOutBuffer == NULL)\n\t{\n\t\tos_free_mem(NULL, mpool);\n\t\treturn;\n\t}\n    \n\t/*\n\t   Prepare EAPOL frame for MIC calculation\n\t   Be careful, only EAPOL frame is counted for MIC calculation\n\t*/\n\tMakeOutgoingFrame(pOutBuffer,               &FrameLen,\n\t\t              CONV_ARRARY_TO_UINT16(pPacket->Body_Len) + 4,   pPacket,\n\t\t              END_OF_ARGS);\n\n\t/* Prepare and Fill MIC value */\n\tNdisZeroMemory(Mic, sizeof(Mic));\n\tif(pAd->StaCfg.WepStatus  == Ndis802_11Encryption3Enabled)\n\t{\t/* AES */\n        UCHAR digest[20] = {0};\n\t\tRT_HMAC_SHA1(pAd->StaCfg.PTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE);\n\t\tNdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC);\n\t} \n\telse\n\t{\t/* TKIP */\n\t\tRT_HMAC_MD5(pAd->StaCfg.PTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic, MD5_DIGEST_SIZE);\n\t}\n\tNdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC);\n\n\t/* copy frame to Tx ring and send MIC failure report frame to authenticator */\n\tRTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t  Header802_3, LENGTH_802_3, \n\t\t\t\t\t  (PUCHAR)pPacket, \n\t\t\t\t\t  CONV_ARRARY_TO_UINT16(pPacket->Body_Len) + 4, FALSE);\n\n\tMlmeFreeMemory(pAd, (PUCHAR)pOutBuffer);\n\n\tos_free_mem(NULL, mpool);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"WpaMicFailureReportFrame <-----\\n\"));\n}\n\n/** from wpa_supplicant\n * inc_byte_array - Increment arbitrary length byte array by one\n * @counter: Pointer to byte array\n * @len: Length of the counter in bytes\n *\n * This function increments the last byte of the counter by one and continues\n * rolling over to more significant bytes if the byte was incremented from\n * 0xff to 0x00.\n */\nvoid inc_byte_array(UCHAR *counter, int len)\n{\n\tint pos = len - 1;\n\twhile (pos >= 0) {\n\t\tcounter[pos]++;\n\t\tif (counter[pos] != 0)\n\t\t\tbreak;\n\t\tpos--;\n\t}\n}\n\nVOID WpaDisassocApAndBlockAssoc(\n    IN PVOID SystemSpecific1, \n    IN PVOID FunctionContext, \n    IN PVOID SystemSpecific2, \n    IN PVOID SystemSpecific3) \n{\n    RTMP_ADAPTER                *pAd = (PRTMP_ADAPTER)FunctionContext;\n    MLME_DISASSOC_REQ_STRUCT    DisassocReq;\n\n\t/* disassoc from current AP first */\n\tDBGPRINT(RT_DEBUG_TRACE, (\"RTMPReportMicError - disassociate with current AP after sending second continuous EAPOL frame\\n\"));\n\tDisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_MIC_FAILURE);\n\tMlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0);\n\n\tpAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;\n\tpAd->StaCfg.bBlockAssoc = TRUE;\n}\n\nVOID WpaStaPairwiseKeySetting(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPCIPHER_KEY pSharedKey;\n\tPMAC_TABLE_ENTRY pEntry;\n\n\tpEntry = &pAd->MacTab.Content[BSSID_WCID];\n\t\n\t/* Pairwise key shall use key#0  */\n\tpSharedKey = &pAd->SharedKey[BSS0][0];\n\n\tNdisMoveMemory(pAd->StaCfg.PTK, pEntry->PTK, LEN_PTK);\n\t\n\t/* Prepare pair-wise key information into shared key table */\n\tNdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY));  \n\tpSharedKey->KeyLen = LEN_TK;\n    NdisMoveMemory(pSharedKey->Key, &pAd->StaCfg.PTK[32], LEN_TK);\n\tNdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.PTK[48], LEN_TKIP_MIC);\n\tNdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.PTK[48+LEN_TKIP_MIC], LEN_TKIP_MIC);            \n\n\t/* Decide its ChiperAlg */\n\tif (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_TKIP;\n\telse if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_AES;\n\telse\n\t\tpSharedKey->CipherAlg = CIPHER_NONE;\n\n\t/* Update these related information to MAC_TABLE_ENTRY */\n\tNdisMoveMemory(pEntry->PairwiseKey.Key, &pAd->StaCfg.PTK[32], LEN_TK);\n\tNdisMoveMemory(pEntry->PairwiseKey.RxMic, &pAd->StaCfg.PTK[48], LEN_TKIP_MIC);\n\tNdisMoveMemory(pEntry->PairwiseKey.TxMic, &pAd->StaCfg.PTK[48+LEN_TKIP_MIC], LEN_TKIP_MIC);            \n\tpEntry->PairwiseKey.CipherAlg = pSharedKey->CipherAlg;\n\t\n\t/* Update pairwise key information to ASIC Shared Key Table\t */\n\tRTMP_ASIC_SHARED_KEY_TABLE(pAd, \n\t\t\t\t\t\t  BSS0, \n\t\t\t\t\t\t  0, \n\t\t\t\t\t\t  pSharedKey);\n\n\t/* Update ASIC WCID attribute table and IVEIV table */\n\tRTMP_SET_WCID_SEC_INFO(pAd, \n\t\t\t\t\t\tBSS0, \n\t\t\t\t\t\t0, \n\t\t\t\t\t\tpSharedKey->CipherAlg, \n\t\t\t\t\t\tBSSID_WCID,\n\t\t\t\t\t\tSHAREDKEYTABLE);\n\n\tRTMP_SET_PORT_SECURED(pAd);\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"%s : AID(%d) port secured\\n\", __FUNCTION__, pEntry->Aid));\n\n}\n\nVOID WpaStaGroupKeySetting(\n\tIN\tPRTMP_ADAPTER\tpAd)\n{\n\tPCIPHER_KEY \t\tpSharedKey;\n\n\tpSharedKey = &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId];\n\n\t/* Prepare pair-wise key information into shared key table */\n\tNdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY));  \n\tpSharedKey->KeyLen = LEN_TK;\n\tNdisMoveMemory(pSharedKey->Key, pAd->StaCfg.GTK, LEN_TK);\n\tNdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.GTK[16], LEN_TKIP_MIC);\n\tNdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.GTK[24], LEN_TKIP_MIC);\n\n\t/* Update Shared Key CipherAlg */\n\tpSharedKey->CipherAlg = CIPHER_NONE;\n\tif (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_TKIP;\n\telse if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_AES;\n\telse if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_WEP64;\n\telse if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)\n\t\tpSharedKey->CipherAlg = CIPHER_WEP128;\n\n\t/* Update group key information to ASIC Shared Key Table */\n\tRTMP_ASIC_SHARED_KEY_TABLE(pAd, \n\t\t\t\t\t\t  \tBSS0, \n\t\t\t\t\t\t  \tpAd->StaCfg.DefaultKeyId, \n\t\t\t\t\t\t\tpSharedKey);\n\n\t/* STA doesn't need to set WCID attribute for group key */\n}\n\n\n/*\n\t========================================================================\n\t\n\tRoutine Description:\n\t\tSend EAPoL-Start packet to AP.\n\n\tArguments:\n\t\tpAd         - NIC Adapter pointer\n\t\t\n\tReturn Value:\n\t\tNone\n\t\t\n\tIRQL = DISPATCH_LEVEL\n\t\n\tNote:\n\t\tActions after link up\n\t\t1. Change the correct parameters\n\t\t2. Send EAPOL - START\n\t\t\n\t========================================================================\n*/\nVOID    WpaSendEapolStart(\n\tIN\tPRTMP_ADAPTER\tpAd,\n\tIN  PUCHAR          pBssid)\n{\n\tIEEE8021X_FRAME\t\tPacket;\n\tUCHAR               Header802_3[14];\n\t\n\tDBGPRINT(RT_DEBUG_TRACE, (\"-----> WpaSendEapolStart\\n\"));\n\n\tNdisZeroMemory(Header802_3,sizeof(UCHAR)*14);\n\n\tMAKE_802_3_HEADER(Header802_3, pBssid, &pAd->CurrentAddress[0], EAPOL);\n\t\n\t/* Zero message 2 body */\n\tNdisZeroMemory(&Packet, sizeof(Packet));\n\tPacket.Version = EAPOL_VER;\n\tPacket.Type    = EAPOLStart;\n\tPacket.Length  = cpu2be16(0);\n\t\n\t/* Copy frame to Tx ring */\n\tRTMPToWirelessSta((PRTMP_ADAPTER)pAd, &pAd->MacTab.Content[BSSID_WCID],\n\t\t\t\t\t Header802_3, LENGTH_802_3, (PUCHAR)&Packet, 4, TRUE);\n\n\tDBGPRINT(RT_DEBUG_TRACE, (\"<----- WpaSendEapolStart\\n\"));\n}\n\n\n"
  },
  {
    "path": "src/tools/Makefile",
    "content": "all:\n\tgcc -g bin2h.c -o bin2h\nclean:\n\trm -f *.o bin2h\n\n\t\n"
  },
  {
    "path": "src/tools/bin2h.c",
    "content": "#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\nint main(int argc ,char *argv[])\n{\n    FILE *infile, *outfile;\t\n    char infname[1024];\n    char outfname[1024];\n    char fw_name[128];\n    char *rt28xxdir;\n    char *chipset;\n\tchar *wow, *rt28xx_mode; /* for WOW firmware */\n    int i=0;//,n=0;\n    unsigned char c;\n   \n    memset(infname,0,1024);\n    memset(outfname,0,1024);\n    memset(fw_name, 0, 128);\n    \n    rt28xxdir = (char *)getenv(\"RT28xx_DIR\");\n    chipset = (char *)getenv(\"CHIPSET\");\n\twow = (char *)getenv(\"HAS_WOW_SUPPORT\"); /* for WOW firmware */\n\trt28xx_mode = (char *)getenv(\"RT28xx_MODE\");\n\n    if(!rt28xxdir) {\n         printf(\"Environment value \\\"RT28xx_DIR\\\" not export \\n\");\n\t return -1;\n    }\n\n    if(!chipset) {\n\t printf(\"Environment value \\\"CHIPSET\\\" not export \\n\");\n\t return -1;\n    }\t    \n\t\n    if (strlen(rt28xxdir) > (sizeof(infname)-100)) {\n\t printf(\"Environment value \\\"RT28xx_DIR\\\" is too long!\\n\");\n\t return -1;\n    }\n\n    strcat(infname,rt28xxdir);\n    strcat(outfname,rt28xxdir);\n    \n    if (strncmp(chipset, \"2860\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2860.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"2870\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"3090\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2860.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"2070\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"3070\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"3572\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"3573\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"3370\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"5370\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"5572\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"5592\",4) == 0) {\n        strcat(infname,\"/mcu/bin/rt2860.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"USB\",3) == 0) {\n        strcat(infname,\"/mcu/bin/rt2870.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if (strncmp(chipset, \"PCI\",3) == 0) {\n        strcat(infname,\"/mcu/bin/rt2860.bin\");\n        strcat(outfname,\"/include/mcu/firmware.h\");\n        strcat(fw_name, \"FirmwareImage\");\n    } else if ((strncmp(chipset, \"6590\", 4) == 0)\n            || (strncmp(chipset, \"6570\", 4) == 0)) {\n        strcat(infname,\"/mcu/bin/MT7650.bin\");\n        strcat(outfname,\"/include/mcu/MT7650_firmware.h\");\n        strcat(fw_name, \"MT7650_FirmwareImage\");\n    } else if ((strncmp(chipset, \"MT7662E\", 7) == 0)\n            || (strncmp(chipset, \"MT7662U\", 7) == 0)) {\n        strcat(infname,\"/mcu/bin/MT7662.bin\");\n        strcat(outfname,\"/include/mcu/MT7662_firmware.h\");\n        strcat(fw_name, \"MT7662_FirmwareImage\");\n    } else if(strncmp(chipset, \"7601\",4)==0) {\n        strcat(infname,\"/mcu/bin/MT7601.bin\");\n        strcat(outfname,\"/include/mcu/MT7601_firmware.h\");\n        strcat(fw_name, \"MT7601_FirmwareImage\");\n    } else {\n        strcat(infname,\"/mcu/bin/rt2860.bin\");\n        strcat(outfname,\"/include/firmware.h\");\n    }\n\n\t/* for WOW support firmware */\n\tif ((wow != NULL) && (strncmp(wow, \"y\", 1) == 0) && (strncmp(rt28xx_mode, \"STA\", 3) == 0))\n\t{\n\t\tif ((wow = strstr(infname, \"rt2870\")) != NULL)\n\t\t{\n\t\t\tstrcpy(wow, \"rt2870_wow.bin\");\t\n\t\t\tfprintf(stderr, \"infname %s\\n\", infname);\n\t\t}\n\t}\n\t    \n    infile = fopen(infname,\"r\");\n     \n    if (infile == (FILE *) NULL)\n    {\n         printf(\"Can't read file %s \\n\",infname);\n\t return -1;\n    }\n\n    outfile = fopen(outfname,\"w\");\n    \n    if (outfile == (FILE *) NULL)\n    {\n         printf(\"Can't open write file %s \\n\",outfname);\n        return -1;\n    }\n    \n    fputs(\"/* AUTO GEN PLEASE DO NOT MODIFY IT */ \\n\",outfile);\n    fputs(\"/* AUTO GEN PLEASE DO NOT MODIFY IT */ \\n\",outfile);\n    fputs(\"\\n\",outfile);\n    fputs(\"\\n\",outfile);\n\n\tfprintf(outfile, \"UCHAR %s[] = {\\n\", fw_name);\n\n    while(1)\n    {\n\tchar cc[3];    \n\n\tc = getc(infile);\n\t\n\tif (feof(infile))\n\t    break;\n\t\n\tmemset(cc,0,2);\n\t\n\tif (i>=16)\n\t{\t\n\t    fputs(\"\\n\", outfile);\t\n\t    i = 0;\n\t}    \n\tfputs(\"0x\", outfile); \n\tsprintf(cc,\"%02x\",c);\n\tfputs(cc, outfile);\n\tfputs(\", \", outfile);\n\ti++;\n    } \n    \n    fputs(\"} ;\\n\", outfile);\n    fclose(infile);\n    fclose(outfile);\n    exit(0);\n}\t\n"
  },
  {
    "path": "unload.sh",
    "content": "#!/bin/sh\nifconfig ra0 down\nrmmod mtnet7601Usta\nrmmod mt7601Usta\nrmmod mtutil7601Usta\n"
  }
]